miniuri/miniuri.py
russellballestrini 0843cc1f2b refactors and more tests, all tests passing
changed miniuri.py
changed test_miniuri.py
2015-10-14 17:37:03 -04:00

121 lines
4.1 KiB
Python

class Uri( object ):
"""
miniuri is a universal URI parser class.
The parser grants access to the following attributes:
foo://username:password@test.com:808/go/to/index.php?pet=cat&name=bam#eye
\_/ \_______________/ \______/ \_/ \___/ \_/ \_______________/\_/
| | | | | | | |
| userinfo hostname | | | query fragment
| \___________________________|/\________|____|_/
| | | | | |
scheme authority | path | extension
| |
port filename
"""
def __init__( self, uri = None ):
if uri: self.uri = uri # invoke uri.setter
def __str__(self): return self.uri
@property
def uri( self ):
"""build and return uri from attributes"""
scheme = path = filename = query = fragment = ''
if self.scheme: scheme = self.scheme + '://'
if self.path: path = self.path
if self.query: query = '?' + self.query
if self.fragment: fragment = '#' + self.fragment
return ''.join([scheme,self.authority,path,filename,query,fragment])
@uri.setter
def uri( self, uri ):
"""parse and set all uri attributes"""
self.scheme = self.username = self.password = None
self.hostname = self.port = self.path = None
self.filename = self.extension = self.query = self.fragment = None
if '://' in uri: # attempt to parse scheme
self.scheme, uri = uri.split( '://' )
# invoke authority setter
self.authority = uri.split( '/' )[0]
uri = uri[ len( self.authority ): ]
if '#' in uri: # set fragment
uri, self.fragment = uri.split( '#' )
if '?' in uri:
self.path, self.query = uri.split( '?' )
else:
self.path = uri
@property
def authority( self ):
"""return a authority string from attributes"""
a = ''
if self.username:
a += self.username
if self.password: a += ':' + self.password
a += '@'
a += self.hostname
if self.port: a += ':' + self.port
return a
@authority.setter
def authority( self, a ):
"""set all the attribute that makeup a authority"""
self.username = self.password = self.port = None
self.hostname = a
if '@' in self.hostname:
self.userinfo, self.hostname = a.split( '@' ) # userinfo setter
if ':' in self.hostname:
self.hostname, self.port = self.hostname.split( ':' )
@property
def userinfo( self ):
"""return username:password, username, or None"""
if self.username:
if self.password:
return self.username + ':' + self.password
return self.username
@userinfo.setter
def userinfo( self, info ):
"""set username and password"""
self.username, self.password = info, None
if ':' in info:
self.username, self.password = info.split( ':' )
@property
def path(self):
"""return path"""
p = self._path if self._path is not None else ''
f = self.filename if self.filename is not None else ''
return p + f
@path.setter
def path(self, new_path):
if new_path:
self.filename = new_path.split('/')[-1]
self._path = new_path.rstrip(self.filename)
else:
self._path = None
self._filename = None
self._extension = None
@property
def filename(self):
"""return filename"""
if self._filename:
if self.extension:
return self._filename + '.' + self.extension
return self._filename
@filename.setter
def filename(self, new_filename):
if new_filename:
self.extension = new_filename.split('.')[-1] if '.' in new_filename else None
self._filename = new_filename.split('.')[0]