semvec/pypi-packages huggingface dataset:
groundhog-hpc 0.7.4
Iterative HPC function development. As many 'first tries' as you need.
License: MIT
Requires Python: <3.14,>=3.10
Keywords: FaaS, Function Serving, Globus Compute, HPC

Home of `hog` ☀️🦫🕳️

<p align="center">
  <img src="./docs/groundhog_logo.png" alt="Groundhog Logo" width="300">
</p>

## Quickstart

Groundhog makes it easy to run, tweak, and re-run python functions on HPC clusters via [Globus Compute](https://www.globus.org/compute) using simple decorators.

Groundhog automatically manages remote environments (powered by [uv](https://docs.astral.sh/uv/))—just update Python versions or dependencies in your script, no SSH needed.

**Key concepts:**
- `@hog.function()` - Configures a function to run on a Globus Compute endpoint. Decorator kwargs (like `endpoint`, `account`) become the default `user_endpoint_config`.
- `@hog.harness()` - Marks a local entry point that orchestrates remote calls via `.remote()` or `.submit()`.
- The desired remote Python environment (version and dependencies) is specified alongside your code via [PEP 723](https://peps.python.org/pep-0723/) metadata.

```python
# /// script
# requires-python = ">=3.12,<3.13"
# dependencies = [
#     numpy,
# ]
#
# [tool.hog.tutorial]  # Globus Compute Tutorial Endpoint
# endpoint = "4b116d3c-1703-4f8f-9f6f-39921e5864df"
#
# ///

import groundhog_hpc as hog

@hog.function(endpoint='tutorial') # points to [tool.hog.tutorial] config
def compute(x: int) -> int:
    import numpy as np
    return int(np.sum(range(x)))

@hog.harness()
def main():
    result = compute.remote(100)
    print(result)
```

Run with: `hog run myscript.py main`

---

see also: [examples](https://groundhog-hpc.readthedocs.io/en/latest/examples/)
configReaders 0.1.0
Helper functions for reading keys from JSON and config files
License: MIT
Requires Python: >=3.8
Keywords: config, configparser, json, helpers

#configReaders
configReaders is a small helper library that reads .cfg, .ini or .json files that contain api keys and passwords.
I found that I was recreating the same functions to perform these takes in multiple scripts and decided to use this as a learning moment to dive into packages.

##configReaders
This is the package that contains readers.py.

##readers.py
There are methods: read_config and read_json.

###read_config(file_path)
The read_config method takes in a path to an .cfg or .ini file.
The .cfg or .ini sould be formatted into sections with your api keys and passwords.
How you segregate your keys and passwords is up to you, it is your .cfg or .ini after all.

-- usage example:
config_path = "file_name.cfg"
myKeys = read_config(config_path)

for key, value in myKeys['api_keys'].items():
    print(key + ': ' + value)

print(myKeys['api_keys']['my_key'])

###read_json(file_path)
The read_json method takes in a path to a .json file.
The .json file should be formatted into a dictionary of key/value sets.

-- usage example:
json_path = "file_name.json"
DB = read_json(json_path)
print(DB['KEYS']['api_key'])


-- config (.cfg) example:
    [keys]
    api_key1 = key_string1
    api_key2 = key_string2
    exit_keys = q, Q, exit, EXIT, quit, QUIT
    
    [passwords]
    api_pword1 = pass_string1
    api_pword2 = pass_string2

-- json (.json) example:
{
    'api1':{
        'api_key': 'key_string',
        'api_pass': 'pass_string',
    }
    'api2':{
        'api_key': 'key_string',
        'api_pass': 'pass_string',
    }
}