Skip to main content

Enhanced JSON processing with includes, comments, and more

Project description

pypaya-json

Enhanced JSON processing with includes, comments, path resolution, and more.

Features

  • File Inclusions: Include other JSON files using "include" declarations
  • Comment Support: Add comments to JSON files using custom comment characters
  • Path Resolution: Automatically resolve relative paths to absolute paths using @path: annotations
  • Flexible Configuration: Use as class methods for one-time operations or instances for reusable configurations
  • Nested Key Access: Navigate and extract data from nested JSON structures
  • Conditional Processing: Enable/disable sections using custom enable keys
  • Value Replacement: Replace entire sections with data from external files

Installation

pip install pypaya-json

Quick start

One-time usage (class method)

from pypaya_json import PypayaJSON

# Basic loading
data = PypayaJSON.load("config.json")

# With comments support and path resolution
data = PypayaJSON.load("config.json", comment_string="#")

# With custom enable key and path annotations disabled
data = PypayaJSON.load("config.json", enable_key="active", resolve_path_annotations=False)

# With custom path annotation prefix
data = PypayaJSON.load("config.json", path_annotation_prefix="$resolve:")

Reusable configuration (instance)

from pypaya_json import PypayaJSON

# Create a reusable loader
loader = PypayaJSON(enable_key="active", comment_string="//")

# Load multiple files with same settings
config = loader.load_file("config.json")
settings = loader.load_file("settings.json")

Examples

Path resolution

config.json:

{
  "training": {
    "@path:data_dir": "../../data/training",
    "@path:checkpoint": "../models/best.ckpt"
  },
  "output": {
    "@path:save_dir": "./outputs"
  }
}

Result:

data = PypayaJSON.load("config.json")
# {
#   "training": {
#     "data_dir": "/absolute/path/to/data/training",
#     "checkpoint": "/absolute/path/to/models/best.ckpt"
#   },
#   "output": {
#     "save_dir": "/absolute/path/to/project/outputs"
#   }
# }

Basic file inclusion

main.json:

{
  "app_name": "MyApp",
  "include": {
    "filename": "database.json"
  },
  "features": ["auth", "api"]
}

database.json:

{
  "host": "localhost",
  "port": 5432,
  "name": "myapp_db"
}

Result:

data = PypayaJSON.load("main.json")
# {
#   "app_name": "MyApp",
#   "host": "localhost",
#   "port": 5432,
#   "name": "myapp_db",
#   "features": ["auth", "api"]
# }

Comments support

config.json:

{
  "server": {
    "host": "0.0.0.0",    // Bind to all interfaces
    "port": 8080          // Default port
  },
  // "debug": true,       // Commented out
  "workers": 4
}
data = PypayaJSON.load("config.json", comment_string="//")
# Comments are automatically stripped

Combined path resolution and includes

main.json:

{
  "@path:base_dir": "../data",
  "include": {
    "filename": "models.json"
  }
}

models.json:

{
  "@path:checkpoint_dir": "./checkpoints",
  "model_name": "best_model.ckpt"
}

Result: All paths resolved relative to their respective config file locations

Nested key access

data.json:

{
  "database": {
    "connections": {
      "primary": "postgresql://...",
      "replica": "postgresql://..."
    }
  }
}

main.json:

{
  "include": {
    "filename": "data.json",
    "keys_path": "database/connections/primary"
  }
}

Result: "postgresql://..."

Conditional inclusion

{
  "base_config": "value",
  "include": {
    "filename": "optional.json",
    "enabled": false
  }
}
# With custom enable key
loader = PypayaJSON(enable_key="active")
data = loader.load_file("config.json")

Value replacement

{
  "database": {
    "replace_value": {
      "filename": "secrets.json",
      "key": "database_url"
    }
  }
}

Custom path annotation prefix

{
  "$resolve:data_dir": "../../data",
  "$resolve:model_path": "../models/best.ckpt"
}
data = PypayaJSON.load("config.json", path_annotation_prefix="$resolve:")

API Reference

PypayaJSON class

Class methods

  • PypayaJSON.load(path, enable_key="enabled", comment_string=None, resolve_path_annotations=True, path_annotation_prefix="@path:") - Load JSON file with one-time configuration

Instance methods

  • PypayaJSON(enable_key="enabled", comment_string=None, resolve_path_annotations=True, path_annotation_prefix="@path:") - Create reusable loader instance
  • loader.load_file(path) - Load JSON file using instance configuration

Parameters

  • path (str): Path to the JSON file
  • enable_key (str): Key used for conditional inclusion (default: "enabled")
  • comment_string (str, optional): String that denotes comments (default: None)
  • resolve_path_annotations (bool): Whether to resolve path annotations (default: True)
  • path_annotation_prefix (str): Prefix for path annotation keys (default: "@path:")

Advanced usage

Multiple inclusions

{
  "include": [
    {"filename": "config1.json"},
    {"filename": "config2.json", "keys": ["specific_key"]},
    {"filename": "config3.json", "enabled": false}
  ]
}

Specific key selection

{
  "include": {
    "filename": "large_config.json",
    "keys": ["database", "cache", "logging"]
  }
}

Deep nested access

{
  "include": {
    "filename": "nested.json",
    "keys_path": ["level1", "level2", "target_key"]
  }
}

Complex configuration with all features

{
  // Application settings
  "app": {
    "@path:base_dir": "../../app",
    "name": "MyApp"
  },
  
  // Include database config
  "include": {
    "filename": "database.json",
    "keys": ["production"]
  },
  
  // Model configuration with paths
  "model": {
    "@path:checkpoint_dir": "./checkpoints",
    "@path:data_dir": "../data",
    "config": {
      "replace_value": {
        "filename": "model_params.json",
        "key": "transformer"
      }
    }
  },
  
  // Optional development settings
  "dev_tools": {
    "enabled": false,
    "@path:debug_dir": "./debug"
  }
}

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

License

MIT License - see LICENSE file for details.

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

pypaya_json-0.3.0.tar.gz (6.7 kB view details)

Uploaded Source

Built Distribution

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

pypaya_json-0.3.0-py3-none-any.whl (6.9 kB view details)

Uploaded Python 3

File details

Details for the file pypaya_json-0.3.0.tar.gz.

File metadata

  • Download URL: pypaya_json-0.3.0.tar.gz
  • Upload date:
  • Size: 6.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.11.11

File hashes

Hashes for pypaya_json-0.3.0.tar.gz
Algorithm Hash digest
SHA256 1fd1facac81d6d8c7d9441215e148a7283663f04478bf4463ccd5e75f9a3fa99
MD5 5458626efbf28de556c8b4df2031ab1a
BLAKE2b-256 9d013eb0359aa5a6c46204a1d70b8f11a5a61276468402d74eb38b4909366869

See more details on using hashes here.

File details

Details for the file pypaya_json-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: pypaya_json-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 6.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.11.11

File hashes

Hashes for pypaya_json-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 535036c69c3504af7727a4b8241ca5469a1c6aa1315aed9ac02b6d9606292403
MD5 6b38d235a971fa2c4a420a66e6d89039
BLAKE2b-256 3ba5eadda888c84f3c06ce1644af990eccf6382380b89a9b721994f6c6ce52db

See more details on using hashes here.

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