idiomatic way to extend paths
wbolster opened this issue · 5 comments
it seems hyperlink does not have a nice way to add path components to a base url, which is a very common operation when interacting with rest apis.
for example, consider
>>> from hyperlink import URL
>>> base_url = URL.from_text('https://example.org/api/v2')let's assume i want to build a url for an endpoint below this base url, e.g. users/search.
this works:
>>> base_url.replace(path=base_url.path + ('users', 'search'))
URL.from_text('https://example.org/api/v2/users/search')... but let's face it, this is not so nice:
users/search(likely copied from some documentation) needs manual splitting into a tuplebase_urlis referenced twice since the.pathtuple is required for the concatenation
making this nicer is not really possible with the current api. for example:
>>> base_url.replace(path=base_url.path + 'users/search'.split('/'))
[...]
TypeError: can only concatenate tuple (not "list") to tupleoops. well, that's easy to work around:
>>> base_url.replace(path=base_url.path + tuple('users/search'.split('/')))
URL.from_text('https://example.org/api/v2/users/search')...but the end result is even uglier.
it would be great if a use case like this is handled with a nicer api. thoughts?
I think the idiomatic way is with URL.child(). I guess it's a bit hard to discover, but does that help?
ah yes, that helps, thanks!
no way to add multiple components using a slash separated string in one go?
.child(*"foo/bar".split())
is, ehm, fugly. ;)
I could see automatically splitting the argument(s) by slash and basically doing what you've done there internally. The old URL would allow those special characters through so I'm sure some people used the API that way.
¿
.child("foo/bar", split=True)
?