Remarks#
Remarks#
Partial reference loading#
Using a fragment in a url or a ptr
in rconf.load(), rconf.loads() or rconf.loadu()
is more efficient than resolving in a following step
when there are irrelevant references elsewhere in the document.
In the following snippet,
you’ll notice there is no attempt to download the invalid URL
in the first rconf.loads().
import json
from http.client import InvalidURL
import rconf
doc = """
pypa_build."$ref" = "https://raw.githubusercontent.com/pypa/build/main/pyproject.toml#project.description"
icon."$ref" = "https://git INVALID hub.com/manifest.json#/icons/0"
"""
# No issues
config = rconf.loads(doc, ptr="pypa_build", media_type="toml")
print("This works:", json.dumps(config, indent=4))
# Raises InvalidURL
try:
config = rconf.loads(doc, media_type="toml")
rconf.TOMLPointer.parse("pypa_build").resolve(config)
except InvalidURL as error:
print("As expected:", type(error), error)
results in
This works: "A simple, correct Python build frontend"
As expected: <class 'http.client.InvalidURL'> URL can't contain control characters. 'git INVALID hub.com' (found at least ' ')
Circular references#
Circular references are allowed,
but json.dumps() and tomli_w.dumps
won’t be able to dump them:
import json
import rconf
doc = """
[table]
strings = ["Hello", "TOML"]
circular."$ref" = "#table"
"""
config = rconf.loads(doc, media_type="toml")
print("This works:", config)
try:
print(json.dumps(config, indent=4))
except ValueError as error:
print("As expected:", type(error), error)
assert config["table"] == config["table"]["circular"]
results in
This works: {'table': {'strings': ['Hello', 'TOML'], 'circular': {...}}}
As expected: <class 'ValueError'> Circular reference detected
Known issues#
JSON Pointer: leading zeros#
This implementation allows for leading zeros in array indices.
Reason: pointer resolution is common for JSON and TOML, and keys only become indices upon resolution.