Function-Styled Object Notation Lines — a line-based serialization format with typed schemas
Project description
FSONL
Function-Styled Object Notation Lines
A line-based serialization format where each record's type is immediately visible at the start of the line.
@schema rm(target: string, --force?: bool = false)
rm("tmp.log", force=true)
rm("/var/cache", force=false)
log("info", "server started")
Install
pip install fsonl
Quick Start
Parse with inline schema
import fsonl
text = """
@schema rm(target: string, --force?: bool = false)
rm("tmp.log")
rm("/var/cache", force=true)
"""
result = fsonl.loads(text)
for entry in result.entries:
print(entry)
# {'type': 'rm', 'target': 'tmp.log', 'force': False}
# {'type': 'rm', 'target': '/var/cache', 'force': True}
Parse with code schema
import fsonl
schema = fsonl.Schema.from_string(
"@schema log(level: string, msg: string)"
)
result = fsonl.loads('log("info", "started")\n', schema=schema)
print(result.entries[0])
# {'type': 'log', 'level': 'info', 'msg': 'started'}
Define schema from Python functions (3.10+)
import fsonl
schema = fsonl.Schema()
@schema.define
def rm(target: str, *, force: bool = False): ...
result = fsonl.loads('rm("tmp.log", force=true)\n', schema=schema)
print(result.entries[0])
# {'type': 'rm', 'target': 'tmp.log', 'force': True}
Serialize
import fsonl
schema = fsonl.Schema.from_string(
"@schema log(level: string, msg: string)"
)
print(fsonl.dumps({"type": "log", "level": "info", "msg": "hello"}, schema=schema))
# @schema log(level: string, msg: string)
# log("info", "hello")
Stream from file
import fsonl
with open("events.fsonl", newline="") as f:
for entry in fsonl.iter_entries(f):
print(entry)
Raw mode (no schema binding)
import fsonl
result = fsonl.loads_raw('x(1, "hello", flag=true)\n')
entry = result[0]
print(entry["type"]) # 'x'
print(entry["positional"]) # [1, 'hello']
print(entry["named"]) # {'flag': True}
API
Parsing
| Function | Description |
|---|---|
loads(text, *, schema, ignore_inline_schema, extra_fields) |
Parse FSONL text with schema binding |
load(fp, **kwargs) |
Parse from file object with schema binding |
loads_raw(text) |
Parse FSONL text without binding (Stage 1 only) |
load_raw(fp) |
Parse from file object without binding (Stage 1 only) |
iter_entries(source, *, schema, ignore_inline_schema, extra_fields) |
Lazy iterator over bound entries |
iter_raw(source) |
Lazy iterator over raw entries |
bind(entry, schema, *, extra_fields) |
Bind a single raw dict to a Schema |
Serialization
| Function | Description |
|---|---|
dumps(entries, *, schema, allow_extra, exclude_schema) |
Serialize to FSONL text |
dump(entries, fp, *, schema, allow_extra, exclude_schema) |
Serialize to file object |
Schema
| Method | Description |
|---|---|
Schema.from_string(text) |
Create from @schema lines |
Schema.from_fsonl(text) |
Extract @schema from FSONL text (non-schema lines ignored) |
Schema.from_file(path) |
Load @schema from a .fsonl file |
@schema.define |
Decorator: define schema from function signature (Python 3.10+) |
schema.add(text) |
Add more @schema definitions |
schema.get(type_name) |
Look up a type definition |
schema.has(type_name) |
Check if a type is defined |
schema.type_names() |
List all defined type names |
Options
| Option | Default | Description |
|---|---|---|
ignore_inline_schema |
False |
Skip @schema directives in the content |
allow_extra |
False |
(dumps only) Ignore extra keys not in schema |
exclude_schema |
False |
(dumps only) Omit @schema lines from output |
extra_fields |
ExtraFieldPolicy.ERROR |
Policy for undeclared named arguments |
Errors
All errors include line numbers: str(error) produces "line 42: message".
| Exception | Kind | Stage |
|---|---|---|
ParseError |
syntax_error |
Stage 1 (syntax parse) |
SchemaError |
schema_error |
Schema definition / cross-validation |
BindError |
bind_error |
Stage 2 (data vs schema mismatch) |
All inherit from FsonlError, which inherits from Exception.
Schema Types
string -- JSON string
number -- JSON number (int or float)
bool -- true / false
null -- null
any -- any JSON value
string[] -- array of strings
(string | number)[] -- array of union
{ cmd: string, id?: number } -- fixed-shape object
string | null -- nullable string
CLI
# Parse with schema binding (default)
echo '@schema x(a: number)\nx(1)' | python -m fsonl parse
# Raw parse (no binding)
echo 'x(1)' | python -m fsonl parse --raw
# Unknown types as raw dict
echo 'x(1)' | python -m fsonl parse --allow-unknown
# Extract @schema directives only
echo '@schema x(a: number)\nx(1)' | python -m fsonl parse --schema
Format Overview
- One entry per line:
type(args) - Values are JSON literals: strings, numbers, booleans, null, arrays, objects
- Positional args come before named args:
log("info", tag="v2") - Comments:
// ...(outside argument lists only) - File extension:
.fsonl, MIME:text/fsonl, encoding: UTF-8
Specification
- SPEC.ko.md -- Language specification (Korean)
- GRAMMAR.ko.peg -- PEG formal grammar (Korean)
License
MIT
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 fsonl-0.2.0.tar.gz.
File metadata
- Download URL: fsonl-0.2.0.tar.gz
- Upload date:
- Size: 34.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
40709386eb504d7d2d1ba86d4a94c13232c547fa392550258108ea73cbad228a
|
|
| MD5 |
30786c38ba737a58b9d3047442a98ba7
|
|
| BLAKE2b-256 |
0edf56a1d4538e314b44c10492824295bd7de1b150376718e7f770988559e8b8
|
Provenance
The following attestation bundles were made for fsonl-0.2.0.tar.gz:
Publisher:
publish.yml on fsonl/fsonl-py
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
fsonl-0.2.0.tar.gz -
Subject digest:
40709386eb504d7d2d1ba86d4a94c13232c547fa392550258108ea73cbad228a - Sigstore transparency entry: 1205943014
- Sigstore integration time:
-
Permalink:
fsonl/fsonl-py@fcd0b0b5ab35e9fd3041b6564278403d9a5eea15 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/fsonl
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@fcd0b0b5ab35e9fd3041b6564278403d9a5eea15 -
Trigger Event:
push
-
Statement type:
File details
Details for the file fsonl-0.2.0-py3-none-any.whl.
File metadata
- Download URL: fsonl-0.2.0-py3-none-any.whl
- Upload date:
- Size: 23.8 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 |
b66be164bb36466a7e8b6069dea4cd10970ef26e9b73f709406b3799de3155e0
|
|
| MD5 |
2b8869f013acd69c53871fdca326c98b
|
|
| BLAKE2b-256 |
afcd2223198ca927c81001c531264dc5012f4b3412465340eb61bc9ea67b94ad
|
Provenance
The following attestation bundles were made for fsonl-0.2.0-py3-none-any.whl:
Publisher:
publish.yml on fsonl/fsonl-py
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
fsonl-0.2.0-py3-none-any.whl -
Subject digest:
b66be164bb36466a7e8b6069dea4cd10970ef26e9b73f709406b3799de3155e0 - Sigstore transparency entry: 1205943020
- Sigstore integration time:
-
Permalink:
fsonl/fsonl-py@fcd0b0b5ab35e9fd3041b6564278403d9a5eea15 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/fsonl
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@fcd0b0b5ab35e9fd3041b6564278403d9a5eea15 -
Trigger Event:
push
-
Statement type: