Skip to content

Commit 5e4621d

Browse files
dmealingclaude
andcommitted
feat(python): module-level load_directory/load_uris/load_string shortcuts
Adds top-level package exports mirroring the cross-port API: the Tier-1 surface (MetaDataLoader, LoadResult, MetaDataSource, the four source impls, MetaDataFormat) plus Pythonic module-level shortcuts that delegate one-to-one to the class factories. Tests cover the three shortcuts and assert the public-export surface is intact. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
1 parent aad4a0e commit 5e4621d

2 files changed

Lines changed: 118 additions & 1 deletion

File tree

Lines changed: 67 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,67 @@
1-
"""metaobjects — Python implementation of the MetaObjects standard."""
1+
"""metaobjects — Python implementation of the MetaObjects standard.
2+
3+
Top-level exports cover the cross-language loader API (MetaDataLoader +
4+
LoadResult, the four MetaDataSource impls, and Pythonic module-level
5+
shortcuts ``load_directory`` / ``load_uris`` / ``load_string`` that
6+
delegate to the class factories).
7+
"""
8+
from __future__ import annotations
9+
10+
from pathlib import Path
11+
12+
from .errors import ErrorCode, MetaError
13+
from .loader.meta_data_loader import LoadResult, MetaDataLoader
14+
from .loader.sources import (
15+
DirectorySource,
16+
FileSource,
17+
InMemoryStringSource,
18+
MetaDataFormat,
19+
MetaDataSource,
20+
UriSource,
21+
)
22+
from .provider import Provider
23+
24+
25+
def load_directory(
26+
directory: Path | str,
27+
providers: list[Provider] | None = None,
28+
exclude: list[str] | None = None,
29+
recurse: bool = True,
30+
) -> LoadResult:
31+
"""Module-level shortcut for ``MetaDataLoader.from_directory``."""
32+
return MetaDataLoader.from_directory(
33+
directory, providers=providers, exclude=exclude, recurse=recurse,
34+
)
35+
36+
37+
def load_uris(
38+
uris: list[str], providers: list[Provider] | None = None
39+
) -> LoadResult:
40+
"""Module-level shortcut for ``MetaDataLoader.from_uris``."""
41+
return MetaDataLoader.from_uris(uris, providers=providers)
42+
43+
44+
def load_string(
45+
content: str,
46+
format: MetaDataFormat = MetaDataFormat.JSON,
47+
providers: list[Provider] | None = None,
48+
) -> LoadResult:
49+
"""Module-level shortcut for ``MetaDataLoader.from_string``."""
50+
return MetaDataLoader.from_string(content, format=format, providers=providers)
51+
52+
53+
__all__ = [
54+
"MetaDataLoader",
55+
"LoadResult",
56+
"MetaDataSource",
57+
"MetaDataFormat",
58+
"FileSource",
59+
"DirectorySource",
60+
"UriSource",
61+
"InMemoryStringSource",
62+
"ErrorCode",
63+
"MetaError",
64+
"load_directory",
65+
"load_uris",
66+
"load_string",
67+
]
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
"""Module-level shortcut tests.
2+
3+
Mirrors the Pythonic ``requests.get(url)`` pattern: a single import gives
4+
you the 99% case (load_directory / load_uris / load_string) without
5+
having to construct a MetaDataLoader.
6+
"""
7+
from __future__ import annotations
8+
9+
from pathlib import Path
10+
11+
import metaobjects
12+
13+
14+
_TINY = '{"metadata.root":{"package":"x","children":[]}}'
15+
16+
17+
def test_module_level_load_string() -> None:
18+
result = metaobjects.load_string(_TINY)
19+
assert result.errors == []
20+
21+
22+
def test_module_level_load_string_yaml() -> None:
23+
result = metaobjects.load_string(
24+
"metadata.root:\n package: x\n children: []\n",
25+
format=metaobjects.MetaDataFormat.YAML,
26+
)
27+
assert result.errors == []
28+
29+
30+
def test_module_level_load_directory(tmp_path: Path) -> None:
31+
(tmp_path / "meta.tiny.json").write_text(_TINY, encoding="utf-8")
32+
result = metaobjects.load_directory(tmp_path)
33+
assert result.errors == []
34+
35+
36+
def test_public_exports_are_present() -> None:
37+
# Spot-check the Tier-1 surface.
38+
for sym in (
39+
"MetaDataLoader",
40+
"LoadResult",
41+
"MetaDataSource",
42+
"MetaDataFormat",
43+
"FileSource",
44+
"DirectorySource",
45+
"UriSource",
46+
"InMemoryStringSource",
47+
"load_directory",
48+
"load_uris",
49+
"load_string",
50+
):
51+
assert hasattr(metaobjects, sym), f"metaobjects.{sym} missing"

0 commit comments

Comments
 (0)