77 lines
2.6 KiB
Python
77 lines
2.6 KiB
Python
|
# -*- coding: utf-8 -*-
|
||
|
import platform
|
||
|
import sys
|
||
|
|
||
|
|
||
|
def user_agent(name, version, extras=None):
|
||
|
"""
|
||
|
Returns an internet-friendly user_agent string.
|
||
|
|
||
|
The majority of this code has been wilfully stolen from the equivalent
|
||
|
function in Requests.
|
||
|
|
||
|
:param name: The intended name of the user-agent, e.g. "python-requests".
|
||
|
:param version: The version of the user-agent, e.g. "0.0.1".
|
||
|
:param extras: List of two-item tuples that are added to the user-agent
|
||
|
string.
|
||
|
:returns: Formatted user-agent string
|
||
|
:rtype: str
|
||
|
"""
|
||
|
try:
|
||
|
p_system = platform.system()
|
||
|
p_release = platform.release()
|
||
|
except IOError:
|
||
|
p_system = 'Unknown'
|
||
|
p_release = 'Unknown'
|
||
|
|
||
|
if extras is None:
|
||
|
extras = []
|
||
|
|
||
|
if any(len(extra) != 2 for extra in extras):
|
||
|
raise ValueError('Extras should be a sequence of two item tuples.')
|
||
|
|
||
|
format_string = '%s/%s'
|
||
|
|
||
|
extra_pieces = [
|
||
|
format_string % (extra_name, extra_version)
|
||
|
for extra_name, extra_version in extras
|
||
|
]
|
||
|
|
||
|
user_agent_pieces = ([format_string % (name, version)] + extra_pieces +
|
||
|
[_implementation_string(),
|
||
|
'%s/%s' % (p_system, p_release)])
|
||
|
|
||
|
return " ".join(user_agent_pieces)
|
||
|
|
||
|
|
||
|
def _implementation_string():
|
||
|
"""
|
||
|
Returns a string that provides both the name and the version of the Python
|
||
|
implementation currently running. For example, on CPython 2.7.5 it will
|
||
|
return "CPython/2.7.5".
|
||
|
|
||
|
This function works best on CPython and PyPy: in particular, it probably
|
||
|
doesn't work for Jython or IronPython. Future investigation should be done
|
||
|
to work out the correct shape of the code for those platforms.
|
||
|
"""
|
||
|
implementation = platform.python_implementation()
|
||
|
|
||
|
if implementation == 'CPython':
|
||
|
implementation_version = platform.python_version()
|
||
|
elif implementation == 'PyPy':
|
||
|
implementation_version = '%s.%s.%s' % (sys.pypy_version_info.major,
|
||
|
sys.pypy_version_info.minor,
|
||
|
sys.pypy_version_info.micro)
|
||
|
if sys.pypy_version_info.releaselevel != 'final':
|
||
|
implementation_version = ''.join([
|
||
|
implementation_version, sys.pypy_version_info.releaselevel
|
||
|
])
|
||
|
elif implementation == 'Jython':
|
||
|
implementation_version = platform.python_version() # Complete Guess
|
||
|
elif implementation == 'IronPython':
|
||
|
implementation_version = platform.python_version() # Complete Guess
|
||
|
else:
|
||
|
implementation_version = 'Unknown'
|
||
|
|
||
|
return "%s/%s" % (implementation, implementation_version)
|