url2vapi

Tools extracts constant elements from url (for example version)


License
MIT
Install
pip install url2vapi==1.2

Documentation

url2vapi (url to versioned api)

It's is tiny package that provides one function split. Function takes two arguments: url and pattern, then attempts to parse the url according to the pattern. Returning result is new object that contains all matched variables + reminding part of the url. Package for most part uses standard urllib.parse with a bits added on top of it.

Example usage:

import url2vapi

print(url2vapi.split('http://www.example.com/').as_dict())
{'domain': 'www.example.com', 'port': None, 'protocol': 'http', 'remainder': ''}

print(url2vapi.split('http://www.example.com/dd/ff/').as_dict())
{'domain': 'www.example.com', 'port': None, 'protocol': 'http', 'remainder': 'dd/ff/'}

print(url2vapi.split('http://www.example.com/3.0/dd/ff/').as_dict())
{'domain': 'www.example.com', 'port': None, 'protocol': 'http', 'remainder': '3.0/dd/ff/'}

print(url2vapi.split('http://www.example.com/3.0/dd/ff/', pattern='<version:number>').as_dict())
{'domain': 'www.example.com', 'port': None, 'protocol': 'http', 'remainder': 'dd/ff/', 'version': {'prefix': '', 'suffix': '', 'value': 3}}

print(url2vapi.split('http://www.example.com/3.0/dd/ff/', pattern='<version:double>').as_dict())
{'domain': 'www.example.com', 'port': None, 'protocol': 'http', 'remainder': 'dd/ff/', 'version': {'prefix': '', 'suffix': '', 'value': 3.0}}

print(url2vapi.split('http://www.example.com/3.0/letters/c/', pattern='<version:double>/<namespace>').as_dict())
{'port': None, 'namespace': {'prefix': '', 'suffix': '', 'value': 'letters'}, 'version': {'prefix': '', 'suffix': '', 'value': 3.0}, 'domain': 'www.example.com', 'protocol': 'http', 'remainder': 'c/'}

# or something more exotic:

print(url2vapi.split(
    'http://www.example.com/v3_1.1_0.1-b1/3/a/',
    pattern='v<version:tuple[double]:_>-b1>/<namespace_number:number>').as_dict())
{'port': None, 'version': {'prefix': 'v', 'suffix': '-b1', 'value': (3.0, 1.1, 0.1)}, 'domain': 'www.example.com', 'protocol': 'http', 'remainder': 'a/', 'namespace_number': {'prefix': '', 'suffix': '', 'value': 3}}

Available patterns

Pattern is a string that should contain groups, each group is defined as follows:

    (optional_prefix)<name_of_the_group:optional_type:optional_delimiter>(optional_suffix)

Where:

- optional_prefix - is any alphanumeric range of characters, defaults to '' (with addition of some common characters like `_-\.,`)
- name_of_the_group - is mandatory alphanumeric range of one or more characters (underscores are available) 
- optional_type can be one of the following: `number`, `double`, `string`, `bool` or `tuple`, defaults to `string`
- if type is set to `tuple`, we can specify delimiter (ie. characters `.,|_-`)
- tuple can specify subtype in a form `tuple[double]` or `tuple[bool]` but not `tuple[tuple]`
- optional_suffix - is any alphanumeric range of characters, defaults to '' (with addition of some common characters like `_-\.,`)

Testing

Git clone repository, pip install dependency and then run nosetests by simply ./bin/run_tests.sh (this will open browser with coverage result)

Or

python setup.py test