Skip to main content

Python reader for Rusty Object Notation

Project description

disclaimer

i can't guarantee the quality of this software, don't rely on it for anything serious

probably better use it if you want to hack on it, and fork/submit PRs

what

a quick thing built with the goal to work with RON (Rust Object Notation) files in pure python

https://github.com/ron-rs/ron/issues/306

why

because I wanted to write some scripts against RON files, and couldn't find anything usable, so I threw some code together with gemini and ANTLR4

installation

your package manager should be able to install from git, I'll publish it on PyPi at some point

uv add git+https://github.com/juliancoffee/ron-py

how to use

There's FromRonMixin which gives you from_ron method.

from dataclasses import dataclass
from ron import FromRonMixin

@dataclass
class Click(FromRonMixin):
  x: int
  y: int

obj = Click.from_ron("Click(x: 10, y: 20)")
assert isinstance(res1, Click)
assert res1.x == 10

Or there's more low-level API if that's your thing.

from ron import parse_ron
from ron.models import RonStruct

def test_struct_as_key():
    data = r"""
    {
        UserID(123): "Admin",
        UserID(456): "Guest"
    }
    """
    # yes, you can just parse it to raw object
    obj = parse_ron(data)

    # type-narrow it
    raw_map = obj.expect_map()
    assert len(raw_map.entries) == 2

    keys = list(raw_map.entries.keys())
    target_key = keys[0]
    # or compare to internal types
    # sneak peek, we also have spans (only for struct field values though, as of now)
    # use `parse_ron(src, with_spans=True)`
    assert target_key == RonStruct("UserID", (123,), spans=None)
    assert raw_map.entries[target_key] == "Admin"

Alternatively, there's __getitem__ implementation, which loses some type strictness, but is super convenient.

def test_deep_chaining_nested_structures():
    ron_str = """
        Player(
            stats: { "attributes": [10, 15] },
            inventory: [ Item(name: "Sword") ]
        )
    """
    obj = parse_ron(ron_str)

    # use a struct like you'd use dict
    strength = obj["stats"]["attributes"][0]
    assert strength.expect_int() == 10

    # can be infinitely nested, until you jump out with `expect_*` method
    weapon = obj["inventory"][0]["name"]
    assert weapon.expect_str() == "Sword"

def test_unit_struct_lookup():
    obj = parse_ron('{ King: "Crown" }')

    # or even go bonkers and do this
    assert obj["King"].expect_str() == "Crown"

Check out tests and main.py in the root for more (and, potentially, more up-to-date examples).

limitations

doesn't support extensions, yet

contributions

PRs are probably welcome, I don't expect much in terms of the protocol, just use common sense

we even have CI now :D

notable mentions

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

ron_python-0.0.1.tar.gz (53.1 kB view details)

Uploaded Source

Built Distribution

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

ron_python-0.0.1-py3-none-any.whl (28.0 kB view details)

Uploaded Python 3

File details

Details for the file ron_python-0.0.1.tar.gz.

File metadata

  • Download URL: ron_python-0.0.1.tar.gz
  • Upload date:
  • Size: 53.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for ron_python-0.0.1.tar.gz
Algorithm Hash digest
SHA256 9880d7a98defaf41551a67a075c702b7afe3e563906cbbb1c534db2f5d3dc00f
MD5 00f4421c72d35299dc807437b5862e8c
BLAKE2b-256 9d07dabece8d8fcc1c3a35192b1fa07c9c1a844482d5e2e4694a0f67df706241

See more details on using hashes here.

Provenance

The following attestation bundles were made for ron_python-0.0.1.tar.gz:

Publisher: pypi.yml on juliancoffee/ron-py

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

File details

Details for the file ron_python-0.0.1-py3-none-any.whl.

File metadata

  • Download URL: ron_python-0.0.1-py3-none-any.whl
  • Upload date:
  • Size: 28.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for ron_python-0.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 4839e89c21e75d212888c4195c057e45486ef9bae78eeb4c9beccd2dd710eec7
MD5 3d15290fe8b52f1827b33e53a104e0bc
BLAKE2b-256 e80044aa94dae2bc0f669dad32efe93bfe07547098421a00c00de433bed565c1

See more details on using hashes here.

Provenance

The following attestation bundles were made for ron_python-0.0.1-py3-none-any.whl:

Publisher: pypi.yml on juliancoffee/ron-py

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