Name | gasp-py JSON |
Version |
0.3.4
JSON |
| download |
home_page | None |
Summary | GASP (Gee Another Schema Parser) - A validator for WAIL (Widely Applicable Interface Language) schemas and JSON |
upload_time | 2025-01-01 09:45:38 |
maintainer | None |
docs_url | None |
author | None |
requires_python | >=3.7 |
license | Apache-2.0 |
keywords |
wail
schema
validation
json
llm
prompt
|
VCS |
|
bugtrack_url |
|
requirements |
No requirements were recorded.
|
Travis-CI |
No Travis.
|
coveralls test coverage |
No coveralls.
|
# GASP (Gee Another Schema Parser)
GASP is a high-performance Rust-based parser and validator for WAIL (Widely Applicable Interface Language) schemas and JSON responses. It's specifically designed to work with Large Language Models (LLMs) by providing robust error recovery for common LLM response quirks.
## What is WAIL?
WAIL (Widely Applicable Interface Language) is a schema language designed for:
1. Generating type-validated LLM prompts
2. Validating JSON responses from LLMs
3. Providing clear error messages for schema violations
## Why
In our expereince the ergonomics around tool calling kind of suck right now and in the lowest common denominator settings are down right painful.
If you're using OpenRouter (which is great) they choose not to support some platform specific features (understandable) like the "ANY" parameter from Anthropic so you wind up with super verbose output, the occasional no tool call, missing params even when specified in "required" and so we decided to implement this prompt creator and schema validator because what are tool calls other than type interfaces.
Honestly, [BAML](https://github.com/BoundaryML/baml) is a really sick tool and more feature complete than this, with like people actually paid to work on it, and outside of the minimal needs we have that this was created for you should go use them.
However, they require you to use their code gen'd inference clients for sending messages to the LLM. That let's them do some really powerful things like validation mid streaming, but you have to be all in on them.
GASP and WAIL let you separate out prompt creation, inference and prompt validation from one another so you can apply GASP to whatever client floats your boat with the trade off that we aren't intending to make this work for every streaming format under the sun (at least I'm not, feel free to contribute!) so it's only applicable to fully generated outputs.
I didn't need all that especially because I along with my friend and co-founder have written [Asimov](https://github.com/BismuthCloud/asimov/tree/main) a framework for building Agents that includes all of our own inference machinery I'm not looking to give up.
Anyway both Asimov and now GASP/WAIL are built for supporting [Bismuth](https://waitlist.bismuth.sh) a programming agent that can help businesses find and patch bugs on your Github PRs before you ever know about them.
## Features
- **Robust Error Recovery**: Handles common LLM response issues like trailing commas, unquoted identifiers, and malformed JSON
- **Type Validation**: Strong type checking for both schema definitions and JSON responses
- **High Performance**: Written in Rust with Python bindings for optimal speed
- **Developer Friendly**: Clear error messages (except for syntax errors see below) and intuitive schema syntax
- **LLM-Optimized**: Specifically designed to work with the quirks and inconsistencies of LLM outputs
## Anti-Features
- **Non existant syntax error messages** - I will get around to this soon but right now this is just as likely to segfault or die in rust with a cryptic error message as it is to tell you what you're doing is wrong.
## Caveats
- **Output parsing is assumed to be sequential** - That is we assume output happens in the same order as the template variable binding so like if binding1 doesn't correspond to output1 things will be wacky.
## Installation
```bash
pip install gasp-py
```
## Usage
```python
from gasp_py import WAILGenerator
# Create a validator with your WAIL schema
generator = WAILGenerator(r'''
# Define your schema here
object Response {
name: String,
age: Number,
interests: Array<String>
}
# Define your template function
template GenerateResponse(desc: String) -> Response {
prompt """
Based on {{desc}} generate a response that returns {{return_type}}
"""
}
# Define your main block which can handle variable assignments
main {
let template = Response(desc: "A really responsy response")
prompt {
We're showing off examples and example of of a prompt generated by WAIL looks like this:
{{template}}
}
}
''')
# Get the prompt to send to the LLM
(prompt, warnings, errors) = generator.get_prompt()
# Parse and validate JSON responses
generator.parse_llm_output("""
{
name: "Alice",
"age": 25,
"interests": [coding, 'AI', "music"]
}
""")
# Note the ability to handle malformed JSON
```
## Error Recovery
GASP includes built-in error recovery for common LLM response issues:
- Trailing commas in arrays and objects
- Unquoted identifiers in object keys
- Missing quotes around strings
- Inconsistent whitespace and formatting
## License
Apache License, Version 2.0 - see LICENSE file for details.
## Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
## Complete Example
Here's a complete example showing how to use GASP in Python:
```python
from gasp import WAILGenerator
import json
def create_person_prompt():
"""Define the WAIL schema for person generation."""
return r'''
# Define our Person type
object Person {
name: String
age: Number
interests: String[]
}
# Define a template for generating a person from a description
template GetPersonFromDescription(description: String) -> Person {
prompt: """
Given this description of a person: "{{description}}"
Create a Person object with their name, age, and interests.
Return in this format:
{{return_type}}
"""
}
main {
# This is a comment
let person_prompt = GetPersonFromDescription(
description: "Alice is a 25-year-old software engineer who loves coding, AI, and hiking."
);
# This is the prompt we'll send to the LLM
prompt {
This is an example of a prompt generated by WAIL:
{{person_prompt}}
}
}
'''
def main():
# Initialize our validator with the schema
generator = WAILGenerator()
generator.load_wail(create_person_prompt())
warnings, errors = generator.validate_wail()
print("Validation Results:")
print("\nWarnings:")
print(warnings)
print("\nErrors:")
print(errors)
# Get the generated prompt - this is what you'd send to your LLM
(prompt, warnings, errors) = generator.get_prompt()
print("Generated Prompt:")
print(prompt)
print("Warnings:")
print(warnings)
print("Errors:")
print(errors)
# In a real application, you would send this prompt to your LLM
# Here we'll simulate an LLM response with some typical quirks
llm_response = """
{
'name': 'Alice',
'age': 25,
'interests': [
"coding",
'AI',
hiking,
]
}
"""
try:
# Validate the LLM's response and get the parsed JSON as a Python dict
result = generator.parse_llm_output(llm_response)
print("✓ Response validation successful!")
result = result["person_prompt"]
# Work with the validated data
print("\nParsed Person:")
print(f"Name: {result['name']}")
print(f"Age: {result['age']}")
print(f"Interests: {', '.join(result['interests'])}")
# # You can also convert it to standard JSON
# print("\nAs standard JSON:")
# print(json.dumps(result, indent=2))
except Exception as e:
print(f"❌ Validation error: {e}")
if __name__ == "__main__":
main()
```
This example demonstrates:
1. Creating a WAIL schema with proper Python string formatting
2. Defining object types and templates in WAIL
3. Generating a type-aware prompt for your LLM
4. Handling common LLM response quirks automatically
5. Validating and parsing the response
6. Working with the validated data in Python
When run, this script will output:
```
Validation Results:
Warnings:
[]
Errors:
[]
Generated Prompt:
This is an example of a prompt generated by WAIL:
Given this description of a person: "Alice is a 25-year-old software engineer who loves coding, AI, and hiking."
Create a Person object with their name, age, and interests.
Return in this format:
{
name: string
age: number
interests: String[]>
}
Warnings:
[]
Errors:
[]
✓ Response validation successful!
Parsed Person:
Name: Alice
Age: 25
Interests: coding, AI, hiking
```
Raw data
{
"_id": null,
"home_page": null,
"name": "gasp-py",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.7",
"maintainer_email": null,
"keywords": "wail, schema, validation, json, llm, prompt",
"author": null,
"author_email": "Ian Butler <ian@bismuth.cloud>",
"download_url": null,
"platform": null,
"description": "# GASP (Gee Another Schema Parser)\n\nGASP is a high-performance Rust-based parser and validator for WAIL (Widely Applicable Interface Language) schemas and JSON responses. It's specifically designed to work with Large Language Models (LLMs) by providing robust error recovery for common LLM response quirks.\n\n## What is WAIL?\n\nWAIL (Widely Applicable Interface Language) is a schema language designed for:\n1. Generating type-validated LLM prompts\n2. Validating JSON responses from LLMs\n3. Providing clear error messages for schema violations\n\n## Why\n\nIn our expereince the ergonomics around tool calling kind of suck right now and in the lowest common denominator settings are down right painful.\n\nIf you're using OpenRouter (which is great) they choose not to support some platform specific features (understandable) like the \"ANY\" parameter from Anthropic so you wind up with super verbose output, the occasional no tool call, missing params even when specified in \"required\" and so we decided to implement this prompt creator and schema validator because what are tool calls other than type interfaces. \n\nHonestly, [BAML](https://github.com/BoundaryML/baml) is a really sick tool and more feature complete than this, with like people actually paid to work on it, and outside of the minimal needs we have that this was created for you should go use them. \n\nHowever, they require you to use their code gen'd inference clients for sending messages to the LLM. That let's them do some really powerful things like validation mid streaming, but you have to be all in on them.\n\nGASP and WAIL let you separate out prompt creation, inference and prompt validation from one another so you can apply GASP to whatever client floats your boat with the trade off that we aren't intending to make this work for every streaming format under the sun (at least I'm not, feel free to contribute!) so it's only applicable to fully generated outputs.\n\nI didn't need all that especially because I along with my friend and co-founder have written [Asimov](https://github.com/BismuthCloud/asimov/tree/main) a framework for building Agents that includes all of our own inference machinery I'm not looking to give up.\n\nAnyway both Asimov and now GASP/WAIL are built for supporting [Bismuth](https://waitlist.bismuth.sh) a programming agent that can help businesses find and patch bugs on your Github PRs before you ever know about them. \n\n## Features\n\n- **Robust Error Recovery**: Handles common LLM response issues like trailing commas, unquoted identifiers, and malformed JSON\n- **Type Validation**: Strong type checking for both schema definitions and JSON responses\n- **High Performance**: Written in Rust with Python bindings for optimal speed\n- **Developer Friendly**: Clear error messages (except for syntax errors see below) and intuitive schema syntax\n- **LLM-Optimized**: Specifically designed to work with the quirks and inconsistencies of LLM outputs\n\n## Anti-Features\n- **Non existant syntax error messages** - I will get around to this soon but right now this is just as likely to segfault or die in rust with a cryptic error message as it is to tell you what you're doing is wrong.\n\n## Caveats\n- **Output parsing is assumed to be sequential** - That is we assume output happens in the same order as the template variable binding so like if binding1 doesn't correspond to output1 things will be wacky.\n\n## Installation\n\n```bash\npip install gasp-py\n```\n\n## Usage\n\n```python\nfrom gasp_py import WAILGenerator\n\n# Create a validator with your WAIL schema\ngenerator = WAILGenerator(r'''\n # Define your schema here\n object Response {\n name: String,\n age: Number,\n interests: Array<String>\n }\n\n # Define your template function\n template GenerateResponse(desc: String) -> Response {\n prompt \"\"\"\n Based on {{desc}} generate a response that returns {{return_type}} \n \"\"\"\n }\n\n # Define your main block which can handle variable assignments\n main {\n let template = Response(desc: \"A really responsy response\")\n\n prompt {\n We're showing off examples and example of of a prompt generated by WAIL looks like this:\n\n {{template}}\n }\n }\n''')\n\n# Get the prompt to send to the LLM\n(prompt, warnings, errors) = generator.get_prompt()\n\n# Parse and validate JSON responses\ngenerator.parse_llm_output(\"\"\"\n{\n name: \"Alice\",\n \"age\": 25,\n \"interests\": [coding, 'AI', \"music\"]\n}\n\"\"\")\n\n# Note the ability to handle malformed JSON\n```\n\n## Error Recovery\n\nGASP includes built-in error recovery for common LLM response issues:\n- Trailing commas in arrays and objects\n- Unquoted identifiers in object keys\n- Missing quotes around strings\n- Inconsistent whitespace and formatting\n\n## License\n\nApache License, Version 2.0 - see LICENSE file for details.\n\n## Contributing\n\nContributions are welcome! Please feel free to submit a Pull Request.\n\n## Complete Example\n\nHere's a complete example showing how to use GASP in Python:\n\n```python\nfrom gasp import WAILGenerator\nimport json\n\ndef create_person_prompt():\n \"\"\"Define the WAIL schema for person generation.\"\"\"\n return r'''\n # Define our Person type\n object Person {\n name: String\n age: Number\n interests: String[]\n }\n\n # Define a template for generating a person from a description\n template GetPersonFromDescription(description: String) -> Person {\n prompt: \"\"\"\n Given this description of a person: \"{{description}}\"\n\n Create a Person object with their name, age, and interests.\n Return in this format: \n {{return_type}}\n \"\"\"\n }\n\n main {\n # This is a comment\n let person_prompt = GetPersonFromDescription(\n description: \"Alice is a 25-year-old software engineer who loves coding, AI, and hiking.\"\n );\n\n # This is the prompt we'll send to the LLM\n prompt {\n This is an example of a prompt generated by WAIL:\n {{person_prompt}}\n }\n }\n '''\n\ndef main():\n # Initialize our validator with the schema\n generator = WAILGenerator()\n generator.load_wail(create_person_prompt())\n\n warnings, errors = generator.validate_wail()\n\n print(\"Validation Results:\")\n print(\"\\nWarnings:\")\n print(warnings)\n print(\"\\nErrors:\")\n print(errors)\n\n # Get the generated prompt - this is what you'd send to your LLM\n (prompt, warnings, errors) = generator.get_prompt()\n print(\"Generated Prompt:\")\n print(prompt)\n print(\"Warnings:\")\n print(warnings)\n print(\"Errors:\")\n print(errors)\n\n # In a real application, you would send this prompt to your LLM\n # Here we'll simulate an LLM response with some typical quirks\n llm_response = \"\"\"\n {\n 'name': 'Alice',\n 'age': 25,\n 'interests': [\n \"coding\",\n 'AI',\n hiking,\n ]\n }\n \"\"\"\n\n try:\n # Validate the LLM's response and get the parsed JSON as a Python dict\n result = generator.parse_llm_output(llm_response)\n print(\"\u2713 Response validation successful!\")\n\n result = result[\"person_prompt\"]\n \n\n # Work with the validated data\n print(\"\\nParsed Person:\")\n print(f\"Name: {result['name']}\")\n print(f\"Age: {result['age']}\")\n print(f\"Interests: {', '.join(result['interests'])}\")\n \n # # You can also convert it to standard JSON\n # print(\"\\nAs standard JSON:\")\n # print(json.dumps(result, indent=2))\n \n except Exception as e:\n print(f\"\u274c Validation error: {e}\")\n\nif __name__ == \"__main__\":\n main() \n```\n\nThis example demonstrates:\n1. Creating a WAIL schema with proper Python string formatting\n2. Defining object types and templates in WAIL\n3. Generating a type-aware prompt for your LLM\n4. Handling common LLM response quirks automatically\n5. Validating and parsing the response\n6. Working with the validated data in Python\n\nWhen run, this script will output:\n```\nValidation Results:\nWarnings:\n[]\nErrors:\n[]\nGenerated Prompt:\n\nThis is an example of a prompt generated by WAIL:\n\nGiven this description of a person: \"Alice is a 25-year-old software engineer who loves coding, AI, and hiking.\"\n\nCreate a Person object with their name, age, and interests.\nReturn in this format: \n\n{\n name: string\n age: number\n interests: String[]>\n}\n\n\nWarnings:\n[]\nErrors:\n[]\n\u2713 Response validation successful!\n\nParsed Person:\nName: Alice\nAge: 25\nInterests: coding, AI, hiking\n```\n\n",
"bugtrack_url": null,
"license": "Apache-2.0",
"summary": "GASP (Gee Another Schema Parser) - A validator for WAIL (Widely Applicable Interface Language) schemas and JSON",
"version": "0.3.4",
"project_urls": {
"Documentation": "https://github.com/iantbutler01/gasp#readme",
"Repository": "https://github.com/iantbutler01/gasp"
},
"split_keywords": [
"wail",
" schema",
" validation",
" json",
" llm",
" prompt"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "685b60eaa357f9a8a4e1cb4f85af001004e6afeb8412847a419eba2128593c24",
"md5": "473215798954997a7919b2fc4db9ac3a",
"sha256": "5cae782a94ea829e97042c066b26919b0be1dc48b909f4f45ba635263ace847c"
},
"downloads": -1,
"filename": "gasp_py-0.3.4-cp310-cp310-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "473215798954997a7919b2fc4db9ac3a",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.7",
"size": 1051456,
"upload_time": "2025-01-01T09:45:38",
"upload_time_iso_8601": "2025-01-01T09:45:38.281560Z",
"url": "https://files.pythonhosted.org/packages/68/5b/60eaa357f9a8a4e1cb4f85af001004e6afeb8412847a419eba2128593c24/gasp_py-0.3.4-cp310-cp310-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "67e9220b08b0ff7b9168d12cc7e2272a4fb9a55586a4bfbc3ace61dbdb85aaf0",
"md5": "79264f14cf3a0bd9ad89bfbd53d41f49",
"sha256": "e9fc2c712a2f90910c058f2f9c3d6a7651c72aeac103c25b28e7fe82beb6bf04"
},
"downloads": -1,
"filename": "gasp_py-0.3.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "79264f14cf3a0bd9ad89bfbd53d41f49",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.7",
"size": 1178472,
"upload_time": "2025-01-01T09:45:41",
"upload_time_iso_8601": "2025-01-01T09:45:41.316633Z",
"url": "https://files.pythonhosted.org/packages/67/e9/220b08b0ff7b9168d12cc7e2272a4fb9a55586a4bfbc3ace61dbdb85aaf0/gasp_py-0.3.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "e7961ed20b7dc301ab4ff80cdfd4a62106f6cfd7171497ea394346a1ba1fee00",
"md5": "d7b76fd95acf0d7520d389e10f381e6d",
"sha256": "19fc97591cf2ef41609aa12786bf5318d31be9a19c51e5d0ef59c11b9b425b21"
},
"downloads": -1,
"filename": "gasp_py-0.3.4-cp310-cp310-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "d7b76fd95acf0d7520d389e10f381e6d",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.7",
"size": 1238450,
"upload_time": "2025-01-01T09:45:44",
"upload_time_iso_8601": "2025-01-01T09:45:44.280698Z",
"url": "https://files.pythonhosted.org/packages/e7/96/1ed20b7dc301ab4ff80cdfd4a62106f6cfd7171497ea394346a1ba1fee00/gasp_py-0.3.4-cp310-cp310-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "f356b680b0666e72b2162794bec154a42415365433ae6560d1e08eed6d3a71f8",
"md5": "28fb6ba8f91bfb160d7133a01deaa59d",
"sha256": "73e37232e2f12103730c8aa10d128b7b75394e5b853f2c2f936c4047281dc656"
},
"downloads": -1,
"filename": "gasp_py-0.3.4-cp311-cp311-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "28fb6ba8f91bfb160d7133a01deaa59d",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.7",
"size": 986360,
"upload_time": "2025-01-01T09:45:48",
"upload_time_iso_8601": "2025-01-01T09:45:48.810187Z",
"url": "https://files.pythonhosted.org/packages/f3/56/b680b0666e72b2162794bec154a42415365433ae6560d1e08eed6d3a71f8/gasp_py-0.3.4-cp311-cp311-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "9fac08210956c7ae045d406d208646155b6b63b32fe525ac3078f54b2dfbbd55",
"md5": "f70201e238422ac518eb85f2861b33e9",
"sha256": "8ee88cfbbe359f94f2d1136f84f53745d626c56bf59175d875a30b9b80847400"
},
"downloads": -1,
"filename": "gasp_py-0.3.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "f70201e238422ac518eb85f2861b33e9",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.7",
"size": 1178513,
"upload_time": "2025-01-01T09:45:51",
"upload_time_iso_8601": "2025-01-01T09:45:51.761275Z",
"url": "https://files.pythonhosted.org/packages/9f/ac/08210956c7ae045d406d208646155b6b63b32fe525ac3078f54b2dfbbd55/gasp_py-0.3.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "ecf42775a6e39196f43a78f7ad26a09befba9f3a6afe3fa28a775406147255c8",
"md5": "951fbbb38934e79f44d965d1c89de531",
"sha256": "a4995351609fafff35010b8b19cfbcd6f1edb41f4e583791419d9993fda0605e"
},
"downloads": -1,
"filename": "gasp_py-0.3.4-cp311-cp311-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "951fbbb38934e79f44d965d1c89de531",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.7",
"size": 1238486,
"upload_time": "2025-01-01T09:45:54",
"upload_time_iso_8601": "2025-01-01T09:45:54.668107Z",
"url": "https://files.pythonhosted.org/packages/ec/f4/2775a6e39196f43a78f7ad26a09befba9f3a6afe3fa28a775406147255c8/gasp_py-0.3.4-cp311-cp311-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "2776d1bb9824aec984106c5292db6a3ec84b38f55a66eedacbdd921627838e9e",
"md5": "19081da2e97d50cc12f738b4b7002435",
"sha256": "e018cf99a2de8de856dfa2c4bded60820141b7bae88daa2bdaf99f346cefb2d3"
},
"downloads": -1,
"filename": "gasp_py-0.3.4-cp312-cp312-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "19081da2e97d50cc12f738b4b7002435",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.7",
"size": 985553,
"upload_time": "2025-01-01T09:45:57",
"upload_time_iso_8601": "2025-01-01T09:45:57.467230Z",
"url": "https://files.pythonhosted.org/packages/27/76/d1bb9824aec984106c5292db6a3ec84b38f55a66eedacbdd921627838e9e/gasp_py-0.3.4-cp312-cp312-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "3f7eaa17d0888541042bf65ee17eed5ffa212735b9321b89a16577adbdcb62e4",
"md5": "e4d08b5db74703322ede4d27f4c80c81",
"sha256": "fe0b5b9cf4e7eff47b56b9ef98ed7c1172f4554d47b88dd8fb461e1df0c2528e"
},
"downloads": -1,
"filename": "gasp_py-0.3.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "e4d08b5db74703322ede4d27f4c80c81",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.7",
"size": 1177975,
"upload_time": "2025-01-01T09:46:00",
"upload_time_iso_8601": "2025-01-01T09:46:00.272905Z",
"url": "https://files.pythonhosted.org/packages/3f/7e/aa17d0888541042bf65ee17eed5ffa212735b9321b89a16577adbdcb62e4/gasp_py-0.3.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "8d146519daa4c326b0bb6d2012753f4d9dee53ffbbdf7e6362ee04769aaaea83",
"md5": "0d81c507d3d486517f7524d9032f84cd",
"sha256": "8e558604df5e527ac18f43dfc1d83c628162a271ba41ae145c704521a1ec3fa0"
},
"downloads": -1,
"filename": "gasp_py-0.3.4-cp312-cp312-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "0d81c507d3d486517f7524d9032f84cd",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.7",
"size": 1238858,
"upload_time": "2025-01-01T09:46:03",
"upload_time_iso_8601": "2025-01-01T09:46:03.077357Z",
"url": "https://files.pythonhosted.org/packages/8d/14/6519daa4c326b0bb6d2012753f4d9dee53ffbbdf7e6362ee04769aaaea83/gasp_py-0.3.4-cp312-cp312-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "2bc306029c52144028b4c2e1aea55b535b843352f84b1310c09acd452e36a098",
"md5": "f5150fa4542d9a951358ded30562daa7",
"sha256": "853388be0990121ed45c1ce3a2741f3e7e39d5573db89d814277de696ab94c7d"
},
"downloads": -1,
"filename": "gasp_py-0.3.4-cp38-cp38-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "f5150fa4542d9a951358ded30562daa7",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.7",
"size": 1051478,
"upload_time": "2025-01-01T09:46:05",
"upload_time_iso_8601": "2025-01-01T09:46:05.809596Z",
"url": "https://files.pythonhosted.org/packages/2b/c3/06029c52144028b4c2e1aea55b535b843352f84b1310c09acd452e36a098/gasp_py-0.3.4-cp38-cp38-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "0380b98f41f1b42b5981f72bdbed95a5e50f7eee301b9f406f49f24637b09759",
"md5": "eed9bfe12626093a4cfeee3e17eeff1c",
"sha256": "e7d871c1c49864f1f453da363d59b6024ee2bb43d51c5781b5d30cef0545c4ce"
},
"downloads": -1,
"filename": "gasp_py-0.3.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "eed9bfe12626093a4cfeee3e17eeff1c",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.7",
"size": 1178534,
"upload_time": "2025-01-01T09:46:09",
"upload_time_iso_8601": "2025-01-01T09:46:09.566463Z",
"url": "https://files.pythonhosted.org/packages/03/80/b98f41f1b42b5981f72bdbed95a5e50f7eee301b9f406f49f24637b09759/gasp_py-0.3.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "7074e22dc0e496694be7b4974ba5ef756938b8a134d92c313d054b8993525356",
"md5": "3fc273afecaeb19ed5c7deb1dbad342c",
"sha256": "2a7938b1be50d1480c0700ee20f31f30cf84146ec7234ec36a390352a7b46e55"
},
"downloads": -1,
"filename": "gasp_py-0.3.4-cp38-cp38-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "3fc273afecaeb19ed5c7deb1dbad342c",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.7",
"size": 1238704,
"upload_time": "2025-01-01T09:46:10",
"upload_time_iso_8601": "2025-01-01T09:46:10.986007Z",
"url": "https://files.pythonhosted.org/packages/70/74/e22dc0e496694be7b4974ba5ef756938b8a134d92c313d054b8993525356/gasp_py-0.3.4-cp38-cp38-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "2c08f57acd36b56b6b8fd9604fea63e3c0471f1c3b8b67dbac987899ab677a11",
"md5": "1e5029d6c27d96a7fa341d6ad13448f7",
"sha256": "b834a2269246dc695559d779e6858e8d20b4e6bb85d85b106d686e1a6e1c363c"
},
"downloads": -1,
"filename": "gasp_py-0.3.4-cp39-cp39-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "1e5029d6c27d96a7fa341d6ad13448f7",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.7",
"size": 1051781,
"upload_time": "2025-01-01T09:46:12",
"upload_time_iso_8601": "2025-01-01T09:46:12.468986Z",
"url": "https://files.pythonhosted.org/packages/2c/08/f57acd36b56b6b8fd9604fea63e3c0471f1c3b8b67dbac987899ab677a11/gasp_py-0.3.4-cp39-cp39-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "b83ec5762828f7bdd8cfe020b63eb2275fbfd5523f8f73ee1ea91484e616e4ba",
"md5": "5f7e8565f22ecf713cedc65fc9c1d32b",
"sha256": "5fffccb3cca4386077e41c474a06ff63477791445df4c48d5775c6bb2c886717"
},
"downloads": -1,
"filename": "gasp_py-0.3.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "5f7e8565f22ecf713cedc65fc9c1d32b",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.7",
"size": 1178783,
"upload_time": "2025-01-01T09:46:15",
"upload_time_iso_8601": "2025-01-01T09:46:15.405696Z",
"url": "https://files.pythonhosted.org/packages/b8/3e/c5762828f7bdd8cfe020b63eb2275fbfd5523f8f73ee1ea91484e616e4ba/gasp_py-0.3.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "b9493adcf19ae2de98e68d0c09cd1bc89700c82e9b46b33a234e0011c591b1bd",
"md5": "628c53a03aeb0ba2c0ceb182ad071c38",
"sha256": "9ee4c07bc5ed70300aa913d84f57e2e9d19ad7103312d64ab8d46a747a70ebb7"
},
"downloads": -1,
"filename": "gasp_py-0.3.4-cp39-cp39-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "628c53a03aeb0ba2c0ceb182ad071c38",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.7",
"size": 1238832,
"upload_time": "2025-01-01T09:46:16",
"upload_time_iso_8601": "2025-01-01T09:46:16.900132Z",
"url": "https://files.pythonhosted.org/packages/b9/49/3adcf19ae2de98e68d0c09cd1bc89700c82e9b46b33a234e0011c591b1bd/gasp_py-0.3.4-cp39-cp39-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-01-01 09:45:38",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "iantbutler01",
"github_project": "gasp#readme",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "gasp-py"
}