Pyvider HCL: A wrapper for python-hcl2 integrating with Pyvider's Cty type system.
Project description
📄⚙️ Pyvider HCL
Python library for parsing HCL into pyvider.cty types
pyvider-hcl provides a simple and intuitive way to work with HCL (HashiCorp Configuration Language) data in your Python applications, with seamless integration into the pyvider ecosystem.
✨ Key Features
- 🔄 CTY Integration - Parses HCL directly into
CtyValueobjects for pyvider compatibility - 🎯 Simplified API - Clean interface for parsing HCL and creating Terraform structures
- 🔍 Automatic Type Inference - Infer
CtyTypefrom HCL data without explicit schemas - ✅ Schema Validation - Validate HCL data against CTY type schemas
- 🏭 Factory Functions - Create Terraform variables and resources programmatically
- 🖨️ Pretty Printing - Debug-friendly output for CTY values
Quick Start
Note: pyvider-hcl is in pre-release (v0.x.x). APIs and features may change before 1.0 release.
- Install:
uv add pyvider-hcl - Read the Getting Started guide.
- Try the examples in examples/README.md.
Documentation
- User Guide: Detailed usage examples and patterns
- API Reference: Complete API documentation
- Architecture: System design and data flow diagrams
- Contributing: Guidelines for contributors
- Changelog: Version history and release notes
Development
Quick Start
# Set up environment
uv sync
# Run common tasks
we run test # Run tests
we run lint # Check code
we run format # Format code
we tasks # See all available commands
See CLAUDE.md for detailed development instructions and architecture information.
For contribution guidelines, see CONTRIBUTING.md.
Format and lint
uv run ruff format .
uv run ruff check .
Contributing
See CONTRIBUTING.md for contribution guidelines.
License
Apache-2.0 License - see LICENSE for details.
Installation
To install pyvider-hcl, you can use uv:
uv add pyvider-hcl
Usage
Here's a simple example of how to use pyvider-hcl to parse an HCL string:
from pyvider.hcl import parse_hcl_to_cty, pretty_print_cty
from pyvider.cty import CtyString
hcl_string = """
name = "Jules"
age = 30
"""
cty_value = parse_hcl_to_cty(hcl_string)
pretty_print_cty(cty_value)
You can also parse an HCL file:
from pyvider.hcl import parse_hcl_to_cty, pretty_print_cty
with open("my_config.hcl", "r") as f:
hcl_content = f.read()
cty_value = parse_hcl_to_cty(hcl_content)
pretty_print_cty(cty_value)
Schema Validation
You can validate HCL data against a CtyType schema:
from pyvider.hcl import parse_hcl_to_cty, pretty_print_cty
from pyvider.cty import CtyObject, CtyString, CtyNumber
schema = CtyObject({
"name": CtyString(),
"age": CtyNumber(),
})
hcl_string = """
name = "Jules"
age = "thirty" # Invalid type
"""
try:
cty_value = parse_hcl_to_cty(hcl_string, schema=schema)
except Exception as e:
print(e)
Complex Cty Integration Examples
Here are some more complex examples of how to use pyvider-hcl with pyvider.cty:
Parsing a list of objects
from pyvider.hcl import parse_hcl_to_cty, pretty_print_cty
from pyvider.cty import CtyObject, CtyList, CtyString, CtyNumber
hcl_string = """
users = [
{
name = "Jules"
age = 30
},
{
name = "Vincent"
age = 40
}
]
"""
schema = CtyObject({
"users": CtyList(
element_type=CtyObject({
"name": CtyString(),
"age": CtyNumber(),
})
)
})
cty_value = parse_hcl_to_cty(hcl_string, schema=schema)
pretty_print_cty(cty_value)
Parsing nested objects
from pyvider.hcl import parse_hcl_to_cty, pretty_print_cty
from pyvider.cty import CtyObject, CtyString, CtyNumber
hcl_string = """
config = {
server = {
host = "localhost"
port = 8080
}
database = {
host = "localhost"
port = 5432
}
}
"""
schema = CtyObject({
"config": CtyObject({
"server": CtyObject({
"host": CtyString(),
"port": CtyNumber(),
}),
"database": CtyObject({
"host": CtyString(),
"port": CtyNumber(),
}),
})
})
cty_value = parse_hcl_to_cty(hcl_string, schema=schema)
pretty_print_cty(cty_value)
Creating Terraform Variables and Resources
You can use the factory functions to create CtyValue objects for Terraform variables and resources:
from pyvider.hcl import (
parse_hcl_to_cty,
pretty_print_cty,
create_variable_cty,
create_resource_cty,
)
# Create a variable
variable_cty = create_variable_cty(
name="my_variable",
type_str="string",
default_py="my_default_value",
)
pretty_print_cty(variable_cty)
# Create a resource
resource_cty = create_resource_cty(
r_type="my_resource",
r_name="my_instance",
attributes_py={
"name": "my_resource_name",
"value": 123,
},
)
pretty_print_cty(resource_cty)
FAQ
How do I parse an HCL file?
Currently, you need to read the file manually and pass the content to parse_hcl_to_cty():
from pathlib import Path
from pyvider.hcl import parse_hcl_to_cty
hcl_content = Path("config.hcl").read_text()
result = parse_hcl_to_cty(hcl_content)
Can this library generate HCL output?
No, pyvider-hcl is currently focused on parsing HCL into CTY types. It does not generate HCL output. You can use the pretty_print_cty() function to display CTY values in a readable format, but this is not HCL syntax.
Does this support HCL expressions like var.name or length(list)?
Not yet. The library currently parses static HCL data. Expression evaluation (variables, functions, conditionals) is not implemented.
What's the difference between parse_hcl_to_cty() and parse_with_context()?
parse_hcl_to_cty(): Returns aCtyValueobject with full type information. Use this for most cases.parse_with_context(): Returns raw Python dict/list from the parser. Use this when you need the raw data structure or want enhanced error context without CTY conversion.
How do I validate HCL against a specific structure?
Pass a CTY schema to parse_hcl_to_cty():
from pyvider.hcl import parse_hcl_to_cty
from pyvider.cty import CtyObject, CtyString, CtyNumber
schema = CtyObject({
"name": CtyString(),
"port": CtyNumber(),
})
result = parse_hcl_to_cty(hcl_content, schema=schema)
# Raises HclParsingError if validation fails
Can I use this with Terraform configurations?
Yes! The library parses HCL syntax used by Terraform. The create_variable_cty() and create_resource_cty() factory functions help create Terraform-specific structures. Full Terraform-specific validation (provider blocks, module blocks, etc.) is limited.
What HCL version is supported?
The library uses python-hcl2 which supports HCL 2.x (the version used by Terraform 0.12+).
How do I handle parsing errors?
Wrap your parsing calls in a try/except block:
from pyvider.hcl import parse_hcl_to_cty, HclParsingError
try:
result = parse_hcl_to_cty(hcl_content)
except HclParsingError as e:
print(f"Parsing failed: {e}")
# e.source_file, e.line, e.column available if set
Can I parse multiple HCL files at once?
You need to parse each file individually. For multi-file Terraform projects, parse each file separately and combine the results as needed.
What types can be automatically inferred?
When no schema is provided, the library automatically infers:
string→CtyStringnumber(int/float) →CtyNumberbool→CtyBoollist→CtyList(CtyDynamic())object→CtyObjectwith inferred field types
How do I contribute or report bugs?
See CONTRIBUTING.md for contribution guidelines. For bugs, please open an issue on the GitHub repository with:
- The HCL content that fails
- The error message
- Expected vs. actual behavior
Related Projects
- pyvider-cty: CTY type system for Python
- pyvider: Terraform provider framework for Python
- provide-foundation: Foundation services and utilities
Copyright (c) provide.io LLC.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pyvider_hcl-0.3.31.tar.gz.
File metadata
- Download URL: pyvider_hcl-0.3.31.tar.gz
- Upload date:
- Size: 24.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
af1839e1431dac042888196cad443de713834744b1f79fb0817e1c48d57da9f9
|
|
| MD5 |
1fd432a25d38063846451028b859a083
|
|
| BLAKE2b-256 |
c684de03fa7070a96e83d1c826cc0c19c6459d4b1b32b5240b75d89899b9340b
|
Provenance
The following attestation bundles were made for pyvider_hcl-0.3.31.tar.gz:
Publisher:
release.yml on provide-io/pyvider-hcl
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pyvider_hcl-0.3.31.tar.gz -
Subject digest:
af1839e1431dac042888196cad443de713834744b1f79fb0817e1c48d57da9f9 - Sigstore transparency entry: 1207597663
- Sigstore integration time:
-
Permalink:
provide-io/pyvider-hcl@a85bc30f421e2bfd8c699792ed6dcbf1e8b06321 -
Branch / Tag:
refs/tags/v0.3.31 - Owner: https://github.com/provide-io
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@a85bc30f421e2bfd8c699792ed6dcbf1e8b06321 -
Trigger Event:
release
-
Statement type:
File details
Details for the file pyvider_hcl-0.3.31-py3-none-any.whl.
File metadata
- Download URL: pyvider_hcl-0.3.31-py3-none-any.whl
- Upload date:
- Size: 22.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cdb9f2c897b4b81939a8d1e5831bad58fbcb55d1efeed67f5e7a752d8f675ab9
|
|
| MD5 |
b8da1419be76f46e79915f356b86aaa8
|
|
| BLAKE2b-256 |
d456b8fc5abaa6a3a970582791b2e0c7f1bc48a44f944f5d6b42d9e4d35c05dd
|
Provenance
The following attestation bundles were made for pyvider_hcl-0.3.31-py3-none-any.whl:
Publisher:
release.yml on provide-io/pyvider-hcl
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pyvider_hcl-0.3.31-py3-none-any.whl -
Subject digest:
cdb9f2c897b4b81939a8d1e5831bad58fbcb55d1efeed67f5e7a752d8f675ab9 - Sigstore transparency entry: 1207597702
- Sigstore integration time:
-
Permalink:
provide-io/pyvider-hcl@a85bc30f421e2bfd8c699792ed6dcbf1e8b06321 -
Branch / Tag:
refs/tags/v0.3.31 - Owner: https://github.com/provide-io
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@a85bc30f421e2bfd8c699792ed6dcbf1e8b06321 -
Trigger Event:
release
-
Statement type: