Skip to content

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

@jake-low

Description

@jake-low

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions