ob-dump-reader 0.0.0.dev0__tar.gz → 0.1.0a2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. ob_dump_reader-0.1.0a2/.gitignore +7 -0
  2. ob_dump_reader-0.1.0a2/CHANGELOG.md +97 -0
  3. {ob_dump_reader-0.0.0.dev0/src/ob_dump_reader.egg-info → ob_dump_reader-0.1.0a2}/PKG-INFO +1 -1
  4. {ob_dump_reader-0.0.0.dev0 → ob_dump_reader-0.1.0a2}/pyproject.toml +1 -0
  5. {ob_dump_reader-0.0.0.dev0 → ob_dump_reader-0.1.0a2/src/ob_dump_reader.egg-info}/PKG-INFO +1 -1
  6. {ob_dump_reader-0.0.0.dev0 → ob_dump_reader-0.1.0a2}/src/ob_dump_reader.egg-info/SOURCES.txt +3 -0
  7. ob_dump_reader-0.1.0a2/src/ob_dump_reader.egg-info/scm_file_list.json +21 -0
  8. ob_dump_reader-0.1.0a2/src/ob_dump_reader.egg-info/scm_version.json +8 -0
  9. ob_dump_reader-0.0.0.dev0/.gitignore +0 -11
  10. {ob_dump_reader-0.0.0.dev0 → ob_dump_reader-0.1.0a2}/LICENSE +0 -0
  11. {ob_dump_reader-0.0.0.dev0 → ob_dump_reader-0.1.0a2}/README.md +0 -0
  12. {ob_dump_reader-0.0.0.dev0 → ob_dump_reader-0.1.0a2}/setup.cfg +0 -0
  13. {ob_dump_reader-0.0.0.dev0 → ob_dump_reader-0.1.0a2}/src/ob_dump_reader/__init__.py +0 -0
  14. {ob_dump_reader-0.0.0.dev0 → ob_dump_reader-0.1.0a2}/src/ob_dump_reader/__main__.py +0 -0
  15. {ob_dump_reader-0.0.0.dev0 → ob_dump_reader-0.1.0a2}/src/ob_dump_reader/__pycache__/__init__.cpython-314.pyc +0 -0
  16. {ob_dump_reader-0.0.0.dev0 → ob_dump_reader-0.1.0a2}/src/ob_dump_reader/__pycache__/__main__.cpython-314.pyc +0 -0
  17. {ob_dump_reader-0.0.0.dev0 → ob_dump_reader-0.1.0a2}/src/ob_dump_reader/_constants.py +0 -0
  18. {ob_dump_reader-0.0.0.dev0 → ob_dump_reader-0.1.0a2}/src/ob_dump_reader/aio.py +0 -0
  19. {ob_dump_reader-0.0.0.dev0 → ob_dump_reader-0.1.0a2}/src/ob_dump_reader/decode_helpers.py +0 -0
  20. {ob_dump_reader-0.0.0.dev0 → ob_dump_reader-0.1.0a2}/src/ob_dump_reader.egg-info/dependency_links.txt +0 -0
  21. {ob_dump_reader-0.0.0.dev0 → ob_dump_reader-0.1.0a2}/src/ob_dump_reader.egg-info/entry_points.txt +0 -0
  22. {ob_dump_reader-0.0.0.dev0 → ob_dump_reader-0.1.0a2}/src/ob_dump_reader.egg-info/requires.txt +0 -0
  23. {ob_dump_reader-0.0.0.dev0 → ob_dump_reader-0.1.0a2}/src/ob_dump_reader.egg-info/top_level.txt +0 -0
  24. {ob_dump_reader-0.0.0.dev0 → ob_dump_reader-0.1.0a2}/tests/_fixture.py +0 -0
  25. {ob_dump_reader-0.0.0.dev0 → ob_dump_reader-0.1.0a2}/tests/test_aio.py +0 -0
  26. {ob_dump_reader-0.0.0.dev0 → ob_dump_reader-0.1.0a2}/tests/test_decode_helpers.py +0 -0
  27. {ob_dump_reader-0.0.0.dev0 → ob_dump_reader-0.1.0a2}/tests/test_ob_dump_reader.py +0 -0
  28. {ob_dump_reader-0.0.0.dev0 → ob_dump_reader-0.1.0a2}/uv.lock +0 -0
@@ -0,0 +1,7 @@
1
+ **/__pycache__
2
+ **/.idea
3
+ **/*.c
4
+ **/*.pyd
5
+ **/build
6
+ **/dist
7
+ **/*.egg-info
@@ -0,0 +1,97 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+ Generated from the repo root's `CHANGELOG.md` at publish time — see that
8
+ file if you're reading this in the published package and want the full
9
+ picture across the other packages in this repo too.
10
+
11
+ Version numbers are derived from git tags via `setuptools_scm`, not hand-bumped in this file.
12
+
13
+ ## [0.1.0-alpha.2] - 2026-07-06
14
+
15
+ ### Fixed
16
+
17
+ - **`decode_flex()` crashed on every real call** — assumed
18
+ `flatbuffers.flexbuffers.Ref` had a `.json` property; it doesn't (only a
19
+ debug `__repr__`), so `json.loads()` was fed something like
20
+ `"Ref(buf[21:], parent_width=1, byte_width=1, type_=9)"` and raised
21
+ immediately. Replaced with a proper recursive `Ref` → native-Python-object
22
+ converter (`Is*`/`As*` are properties, not methods — also wrong in the
23
+ original), matching the same map/vector/scalar/blob handling as `ob-dump`'s
24
+ own C++ `flexToJson` and the Dart package's `decodeFlex`. Covered by
25
+ `tests/test_decode_helpers.py` (a map root and a bare vector root, both
26
+ round-tripped through real `flatbuffers.flexbuffers.Dumps()` output).
27
+ - **`ob_dump_reader.aio` couldn't be imported at all** —
28
+ `from ob_dump_reader.decode_helpers import K_KEY_TYPE_DATA, ...` referenced
29
+ a name that has never existed in that module (`ImportError`), caught by
30
+ actually importing the module, not assumed.
31
+ - **`ob_dump_reader.aio` misused `lmdb.aio`'s actual API** even once the
32
+ import was fixed: `AsyncEnvironment(path, map_size=..., ...)` isn't how
33
+ it's constructed — `lmdb.aio.wrap()` wraps an already-open
34
+ `lmdb.Environment` instead (confirmed by reading `lmdb.aio`'s own
35
+ docstring and source, not guessed). Separately, `AsyncCursor` has no
36
+ `__aiter__`, so `async for key, value in cursor` was never going to work;
37
+ its `iternext()` also fully materializes every remaining entry into a list
38
+ in one executor call rather than streaming, which would have meant loading
39
+ the *entire rest of the database* into memory before the first callback
40
+ fires — replaced with an explicit `first()`/`next()`/`item()` step loop
41
+ instead, keeping this a genuine per-record callback. Verified against a
42
+ real fixture (`tests/test_aio.py`), not just read.
43
+ - **`read_objectbox_to_many_targets()` was a no-op stub** (sync and async) —
44
+ opened an environment and did nothing else, silently returning `None`
45
+ despite being part of the public API. Implemented for real: the same
46
+ 12-byte relation-key format ([type=0x08][2 reserved bytes][(relation_id
47
+ << 2) | direction][source_id u32 BE][target_id u32 BE]) `ob-dump`'s C++
48
+ core and the Dart package already use, via `Cursor.set_range()` positioned
49
+ at the relation/source-id prefix, walking forward while the prefix still
50
+ matches. Forward direction only (0) — direction 2 is an auto-maintained
51
+ reverse index for ObjectBox's own query engine, not needed for a
52
+ one-directional dump. Covered by `tests/test_ob_dump_reader.py` and
53
+ `tests/test_aio.py` (forward links returned, backward/other-relation
54
+ links ignored, empty list when the source object has no links).
55
+
56
+ ### Changed
57
+
58
+ - `KEY_TYPE_DATA`/`KEY_TYPE_RELATION`/relation-direction constants moved to
59
+ a shared `_constants.py`, imported by both `__init__.py` and `aio.py` —
60
+ the two had already drifted out of sync once (see the `aio.py` import fix
61
+ above), so keeping one copy removes the way that happens again.
62
+ - Fixed a real typo: `RELATION_DIRECTION_FFORWARD` → `RELATION_DIRECTION_FORWARD`.
63
+ - Removed dead, commented-out "write transaction to initialize the root
64
+ handle" code — a leftover assumption from `dart_lmdb2`-style bindings
65
+ that turned out to be unnecessary once the actual read path was verified:
66
+ LMDB's MVCC design lets any number of readers run safely alongside one
67
+ concurrent writer once the environment itself is opened `readonly=True`
68
+ (same finding as `dart/`'s own entry above, reached independently for
69
+ the Dart package first).
70
+ - `__main__.py` no longer hardcodes a developer's personal local database
71
+ path — replaced with a real `argparse`-based CLI
72
+ (`python -m ob_dump_reader <objectbox_dir>` / the new `ob-dump-reader`
73
+ console script, see below).
74
+ - Dropped the `read_ob_records`/`read_ob_to_many_targets` short aliases —
75
+ undocumented duplicate names for `read_objectbox_records`/
76
+ `read_objectbox_to_many_targets` with no clear purpose; one canonical name
77
+ per function, matching the Dart/C++ packages.
78
+
79
+ ### Added
80
+
81
+ - `tests/` — this package had no tests directory at all despite `pytest`
82
+ already being declared as a dev dependency and `testpaths = ["tests"]`
83
+ already configured. 15 tests across `test_ob_dump_reader.py`,
84
+ `test_aio.py`, and `test_decode_helpers.py`, using a shared
85
+ `tests/_fixture.py` LMDB-writing helper (mirrors `dart/test/test_fixture.dart`).
86
+ - `[project.scripts]` entry point: `ob-dump-reader = "ob_dump_reader.__main__:main"`.
87
+
88
+ ### Removed
89
+
90
+ - Unused `protovalidate`/`pydantic` dev dependencies — not referenced
91
+ anywhere in `src/` or the new `tests/`; pulled in 16 transitive packages
92
+ for nothing.
93
+ - The blanket `__init__.py` exclusion from the `[tool.ruff]` config —
94
+ `__init__.py` here holds real logic (not just re-exports), so excluding
95
+ it from linting was hiding real issues (see the fixes above).
96
+
97
+ [0.1.0-alpha.2]: https://github.com/o-murphy/ob-dump/releases/tag/v0.1.0-alpha.2
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ob-dump-reader
3
- Version: 0.0.0.dev0
3
+ Version: 0.1.0a2
4
4
  Summary: Minimal ObjectBox LMDB reader toolkit
5
5
  Author: o-murphy
6
6
  Project-URL: Homepage, https://github.com/o-murphy/ob-dump
@@ -39,6 +39,7 @@ where = ["src"]
39
39
  include = ["ob_dump_reader*"]
40
40
 
41
41
  [tool.setuptools_scm]
42
+ root = ".."
42
43
  fallback_version = "0.0.0.dev0"
43
44
 
44
45
  [project.optional-dependencies]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ob-dump-reader
3
- Version: 0.0.0.dev0
3
+ Version: 0.1.0a2
4
4
  Summary: Minimal ObjectBox LMDB reader toolkit
5
5
  Author: o-murphy
6
6
  Project-URL: Homepage, https://github.com/o-murphy/ob-dump
@@ -1,4 +1,5 @@
1
1
  .gitignore
2
+ CHANGELOG.md
2
3
  LICENSE
3
4
  README.md
4
5
  pyproject.toml
@@ -13,6 +14,8 @@ src/ob_dump_reader.egg-info/SOURCES.txt
13
14
  src/ob_dump_reader.egg-info/dependency_links.txt
14
15
  src/ob_dump_reader.egg-info/entry_points.txt
15
16
  src/ob_dump_reader.egg-info/requires.txt
17
+ src/ob_dump_reader.egg-info/scm_file_list.json
18
+ src/ob_dump_reader.egg-info/scm_version.json
16
19
  src/ob_dump_reader.egg-info/top_level.txt
17
20
  src/ob_dump_reader/__pycache__/__init__.cpython-314.pyc
18
21
  src/ob_dump_reader/__pycache__/__main__.cpython-314.pyc
@@ -0,0 +1,21 @@
1
+ {
2
+ "files": [
3
+ "README.md",
4
+ "uv.lock",
5
+ "LICENSE",
6
+ "pyproject.toml",
7
+ "CHANGELOG.md",
8
+ ".gitignore",
9
+ "src/ob_dump_reader/__init__.py",
10
+ "src/ob_dump_reader/aio.py",
11
+ "src/ob_dump_reader/_constants.py",
12
+ "src/ob_dump_reader/decode_helpers.py",
13
+ "src/ob_dump_reader/__main__.py",
14
+ "src/ob_dump_reader/__pycache__/__main__.cpython-314.pyc",
15
+ "src/ob_dump_reader/__pycache__/__init__.cpython-314.pyc",
16
+ "tests/test_ob_dump_reader.py",
17
+ "tests/test_aio.py",
18
+ "tests/test_decode_helpers.py",
19
+ "tests/_fixture.py"
20
+ ]
21
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "tag": "0.1.0a2",
3
+ "distance": 0,
4
+ "node": "gb60f552de1409d843e3435820db2d695dce09133",
5
+ "dirty": false,
6
+ "branch": "HEAD",
7
+ "node_date": "2026-07-06"
8
+ }
@@ -1,11 +0,0 @@
1
- **/__pycache__
2
- **/.idea
3
- **/*.c
4
- **/*.pyd
5
- **/build
6
- **/dist
7
- **/*.egg-info
8
-
9
- # Generated from ../CHANGELOG.md by scripts/ci/sync_changelogs.py, only
10
- # ephemerally, right before publish — see that file's own header.
11
- CHANGELOG.md