Skip to main content

Pyvider HCL: A wrapper for python-hcl2 integrating with Pyvider's Cty type system.

Project description

📄⚙️ Pyvider HCL

License Python 3.11+ uv Ruff CI

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 CtyValue objects for pyvider compatibility
  • 🎯 Simplified API - Clean interface for parsing HCL and creating Terraform structures
  • 🔍 Automatic Type Inference - Infer CtyType from 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.

  1. Install: uv add pyvider-hcl
  2. Read the Getting Started guide.
  3. Try the examples in examples/README.md.

Documentation

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 a CtyValue object 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:

  • stringCtyString
  • number (int/float) → CtyNumber
  • boolCtyBool
  • listCtyList(CtyDynamic())
  • objectCtyObject with 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

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

pyvider_hcl-0.3.31.tar.gz (24.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pyvider_hcl-0.3.31-py3-none-any.whl (22.3 kB view details)

Uploaded Python 3

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

Hashes for pyvider_hcl-0.3.31.tar.gz
Algorithm Hash digest
SHA256 af1839e1431dac042888196cad443de713834744b1f79fb0817e1c48d57da9f9
MD5 1fd432a25d38063846451028b859a083
BLAKE2b-256 c684de03fa7070a96e83d1c826cc0c19c6459d4b1b32b5240b75d89899b9340b

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyvider_hcl-0.3.31.tar.gz:

Publisher: release.yml on provide-io/pyvider-hcl

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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

Hashes for pyvider_hcl-0.3.31-py3-none-any.whl
Algorithm Hash digest
SHA256 cdb9f2c897b4b81939a8d1e5831bad58fbcb55d1efeed67f5e7a752d8f675ab9
MD5 b8da1419be76f46e79915f356b86aaa8
BLAKE2b-256 d456b8fc5abaa6a3a970582791b2e0c7f1bc48a44f944f5d6b42d9e4d35c05dd

See more details on using hashes here.

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

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page