Skip to content

brandonschabell/urlpath

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

51 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

urlpath provides URL manipulator class that extends pathlib.PurePath.

Dependencies

Install

pip install urlpath

Examples

Import:

>>> from urlpath import URL

Create object:

>>> url = URL(
...     'https://username:password@secure.example.com:1234/path/to/file.ext?field1=1&field2=2&field1=3#fragment')

Representation:

>>> url
URL('https://username:password@secure.example.com:1234/path/to/file.ext?field1=1&field2=2&field1=3#fragment')
>>> print(url)
https://username:password@secure.example.com:1234/path/to/file.ext?field1=1&field2=2&field1=3#fragment
>>> url.as_uri()
'https://username:password@secure.example.com:1234/path/to/file.ext?field1=1&field2=2&field1=3#fragment'
>>> url.as_posix()
'https://username:password@secure.example.com:1234/path/to/file.ext?field1=1&field2=2&field1=3#fragment'

Access pathlib.PurePath compatible properties:

>>> url.drive
'https://username:password@secure.example.com:1234'
>>> url.root
'/'
>>> url.anchor
'https://username:password@secure.example.com:1234/'
>>> url.path
'/path/to/file.ext'
>>> url.name
'file.ext'
>>> url.suffix
'.ext'
>>> url.suffixes
['.ext']
>>> url.stem
'file'
>>> url.parts
('https://username:password@secure.example.com:1234/', 'path', 'to', 'file.ext')
>>> url.parent
URL('https://username:password@secure.example.com:1234/path/to')

Access scheme:

>>> url.scheme
'https'

Access netloc:

>>> url.netloc
'username:password@secure.example.com:1234'
>>> url.username
'username'
>>> url.password
'password'
>>> url.hostname
'secure.example.com'
>>> url.port
1234

Access query:

>>> url.query
'field1=1&field2=2&field1=3'
>>> url.form_fields
(('field1', '1'), ('field2', '2'), ('field1', '3'))
>>> url.form
<FrozenMultiDict {'field1': ('1', '3'), 'field2': ('2',)}>
>>> url.form.get_one('field1')
'1'
>>> url.form.get_one('field3') is None
True

Access fragment:

>>> url.fragment
'fragment'

Path operation:

>>> url / 'suffix'
URL('https://username:password@secure.example.com:1234/path/to/file.ext/suffix')
>>> url / '../../rel'
URL('https://username:password@secure.example.com:1234/path/to/file.ext/../../rel')
>>> (url / '../../rel').resolve()
URL('https://username:password@secure.example.com:1234/path/rel')
>>> url / '/'
URL('https://username:password@secure.example.com:1234/')
>>> url / 'http://example.com/'
URL('http://example.com/')

Replace components:

>>> url.with_scheme('http')
URL('http://username:password@secure.example.com:1234/path/to/file.ext?field1=1&field2=2&field1=3#fragment')
>>> url.with_netloc('www.example.com')
URL('https://www.example.com/path/to/file.ext?field1=1&field2=2&field1=3#fragment')
>>> url.with_userinfo('joe', 'pa33')
URL('https://joe:pa33@secure.example.com:1234/path/to/file.ext?field1=1&field2=2&field1=3#fragment')
>>> url.with_hostinfo('example.com', 8080)
URL('https://username:password@example.com:8080/path/to/file.ext?field1=1&field2=2&field1=3#fragment')
>>> url.with_fragment('new fragment')
URL('https://username:password@secure.example.com:1234/path/to/file.ext?field1=1&field2=2&field1=3#new fragment')
>>> url.with_components(username=None, password=None, query='query', fragment='frag')
URL('https://secure.example.com:1234/path/to/file.ext?query#frag')

Replace query:

>>> url.with_query({'field3': '3', 'field4': [1, 2, 3]})
URL('https://username:password@secure.example.com:1234/path/to/file.ext?field3=3&field4=1&field4=2&field4=3#fragment')
>>> url.with_query(field3='3', field4=[1, 2, 3])
URL('https://username:password@secure.example.com:1234/path/to/file.ext?field3=3&field4=1&field4=2&field4=3#fragment')
>>> url.with_query('query')
URL('https://username:password@secure.example.com:1234/path/to/file.ext?query#fragment')
>>> url.with_query(None)
URL('https://username:password@secure.example.com:1234/path/to/file.ext#fragment')

Ammend query:

>>> url.with_query(field1='1').add_query(field2=2)
URL('https://username:password@secure.example.com:1234/path/to/file.ext?field1=1&field2=2#fragment')

Do HTTP requests:

>>> url = URL('https://httpbin.org/get')
>>> url.get()
<Response [200]>

>>> url = URL('https://httpbin.org/post')
>>> url.post(data={'key': 'value'})
<Response [200]>

>>> url = URL('https://httpbin.org/delete')
>>> url.delete()
<Response [200]>

>>> url = URL('https://httpbin.org/patch')
>>> url.patch(data={'key': 'value'})
<Response [200]>

>>> url = URL('https://httpbin.org/put')
>>> url.put(data={'key': 'value'})
<Response [200]>

Jail:

>>> root = 'http://www.example.com/app/'
>>> current = 'http://www.example.com/app/path/to/content'
>>> url = URL(root).jailed / current
>>> url / '/root'
JailedURL('http://www.example.com/app/root')
>>> (url / '../../../../../../root').resolve()
JailedURL('http://www.example.com/app/root')
>>> url / 'http://localhost/'
JailedURL('http://www.example.com/app/')
>>> url / 'http://www.example.com/app/file'
JailedURL('http://www.example.com/app/file')

Trailing separator will be remained:

>>> url = URL('http://www.example.com/path/with/trailing/sep/')
>>> str(url).endswith('/')
True
>>> url.trailing_sep
'/'
>>> url.name
'sep'
>>> url.path
'/path/with/trailing/sep/'
>>> url.parts[-1]
'sep'

>>> url = URL('http://www.example.com/path/without/trailing/sep')
>>> str(url).endswith('/')
False
>>> url.trailing_sep
''
>>> url.name
'sep'
>>> url.path
'/path/without/trailing/sep'
>>> url.parts[-1]
'sep'

About

Object-oriented URL from `urllib.parse` and `pathlib`

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages