Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Python wrapper API has changed; python examples are not working #48

Open
jake-low opened this issue Aug 20, 2024 · 1 comment
Open

Python wrapper API has changed; python examples are not working #48

jake-low opened this issue Aug 20, 2024 · 1 comment

Comments

@jake-low
Copy link
Contributor

jake-low commented Aug 20, 2024

The python examples in the repository aren't working. As an example, here's me running read_way.py.

$ python python/examples/read_way.py washington.osmx 761811137
Traceback (most recent call last):
  File "/Users/jake/Code/FOSS/protomaps/OSMExpress/python/examples/read_way.py", line 18, in <module>
    for node_id in way.nodes:
                   ^^^^^^^^^
AttributeError: '_GeneratorContextManager' object has no attribute 'nodes'

The augmented_diff.py script fails similarly:

python python/examples/augmented_diff.py washington.osmx 155421965.osc 155421965.adiff
No old loc found for tagless node 5694096597
Traceback (most recent call last):
  File "/Users/jake/Code/FOSS/protomaps/OSMExpress/python/examples/augmented_diff.py", line 138, in <module>
    set_old_metadata(prev_version)
  File "/Users/jake/Code/FOSS/protomaps/OSMExpress/python/examples/augmented_diff.py", line 74, in set_old_metadata
    elem.set('version',str(o.metadata.version))
                           ^^^^^^^^^^
AttributeError: '_GeneratorContextManager' object has no attribute 'metadata'

The root cause is that pycapnp from_bytes() now returns a context manager, requiring callers to change from this:

way = messages_capnp.Way.from_bytes(msg)
# do stuff with way

...to this:

with messages_capnp.Way.from_bytes(msg) as way:
    # do stuff with way

This change was introduced in pycapnp 1.1.1. It looks like the Python examples were developed against an older version of OSMX that used pycapnp 0.6.4, but #46 bumped the pycapnp version to 2.0.0. This effectively changed the API of nodes.get(), ways.get(), etc by making them return context managers rather than return nodes/ways/etc directly, but I assume this wasn't noticed at the time and the examples weren't updated to match.

I think there are two possible fixes: either downgrade the Python osmx wrapper to use pycapnp <= 1.1.0, or change the Python examples to use with. I'm not sure which is more appropriate. It's worth noting that if pycapnp ~= 2.0.0 is kept, the next release of osmx will be a breaking API change for any users of the Python wrapper.

EDIT: Actually it looks like a version with the new context-manager API has already been published, though as a 0.0.x release I think most users would know not to expect a stable API 😉

I might be able to work on a PR for this at some point soon, but wanted to open this issue for now in case I don't end up having time to.

@bdon
Copy link
Owner

bdon commented Aug 20, 2024

maybe it was this that wasn't merged yet: https://github.com/protomaps/OSMExpress/commits/python-api-enhancements/

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants