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:[email protected]:1234/path/to/file.ext?field1=1&field2=2&field1=3#fragment')

Representation:

>>> url
URL('https://username:[email protected]:1234/path/to/file.ext?field1=1&field2=2&field1=3#fragment')
>>> print(url)
https://username:[email protected]:1234/path/to/file.ext?field1=1&field2=2&field1=3#fragment
>>> url.as_uri()
'https://username:[email protected]:1234/path/to/file.ext?field1=1&field2=2&field1=3#fragment'
>>> url.as_posix()
'https://username:[email protected]:1234/path/to/file.ext?field1=1&field2=2&field1=3#fragment'

Access pathlib.PurePath compatible properties:

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

Access scheme:

>>> url.scheme
'https'

Access netloc:

>>> url.netloc
'username:[email protected]: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:[email protected]:1234/path/to/file.ext/suffix')
>>> url / '../../rel'
URL('https://username:[email protected]:1234/path/to/file.ext/../../rel')
>>> (url / '../../rel').resolve()
URL('https://username:[email protected]:1234/path/rel')
>>> url / '/'
URL('https://username:[email protected]:1234/')
>>> url / 'http://example.com/'
URL('http://example.com/')

Replace components:

>>> url.with_scheme('http')
URL('http://username:[email protected]: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:[email protected]:1234/path/to/file.ext?field1=1&field2=2&field1=3#fragment')
>>> url.with_hostinfo('example.com', 8080)
URL('https://username:[email protected]:8080/path/to/file.ext?field1=1&field2=2&field1=3#fragment')
>>> url.with_fragment('new fragment')
URL('https://username:[email protected]: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:[email protected]: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:[email protected]:1234/path/to/file.ext?field3=3&field4=1&field4=2&field4=3#fragment')
>>> url.with_query('query')
URL('https://username:[email protected]:1234/path/to/file.ext?query#fragment')
>>> url.with_query(None)
URL('https://username:[email protected]:1234/path/to/file.ext#fragment')

Ammend query:

>>> url.with_query(field1='1').add_query(field2=2)
URL('https://username:[email protected]: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