70 lines
2.2 KiB
Python
70 lines
2.2 KiB
Python
"""
|
|
Platform related Operations for Mobile APP
|
|
"""
|
|
import abc
|
|
import re
|
|
|
|
|
|
class MobilePlatform:
|
|
"""
|
|
MobilePlatform class creates an instance of platform based on user agent and supports platform
|
|
related operations.
|
|
"""
|
|
__metaclass__ = abc.ABCMeta
|
|
version = None
|
|
|
|
def __init__(self, version):
|
|
self.version = version
|
|
|
|
@classmethod
|
|
def get_user_app_platform(cls, user_agent, user_agent_regex):
|
|
"""
|
|
Returns platform instance if user_agent matches with USER_AGENT_REGEX
|
|
|
|
Arguments:
|
|
user_agent (str): user-agent for mobile app making the request.
|
|
user_agent_regex (regex str): Regex for user-agent valid for any type pf mobile platform.
|
|
|
|
Returns:
|
|
An instance of class passed (which would be one of the supported mobile platform
|
|
classes i.e. PLATFORM_CLASSES) if user_agent matches regex of that class else returns None
|
|
"""
|
|
match = re.search(user_agent_regex, user_agent)
|
|
if match:
|
|
return cls(match.group('version'))
|
|
|
|
@classmethod
|
|
def get_instance(cls, user_agent):
|
|
"""
|
|
It creates an instance of one of the supported mobile platforms (i.e. iOS, Android) by regex comparison
|
|
of user-agent.
|
|
|
|
Parameters:
|
|
user_agent: user_agent of mobile app
|
|
|
|
Returns:
|
|
instance of one of the supported mobile platforms (i.e. iOS, Android)
|
|
"""
|
|
for subclass in PLATFORM_CLASSES.values():
|
|
instance = subclass.get_user_app_platform(user_agent, subclass.USER_AGENT_REGEX)
|
|
if instance:
|
|
return instance
|
|
|
|
|
|
class IOS(MobilePlatform):
|
|
""" iOS platform """
|
|
USER_AGENT_REGEX = (r'\((?P<version>[0-9]+.[0-9]+.[0-9]+(.[0-9a-zA-Z]*)?); OS Version [0-9.]+ '
|
|
r'\(Build [0-9a-zA-Z]*\)\)')
|
|
NAME = "iOS"
|
|
|
|
|
|
class Android(MobilePlatform):
|
|
""" Android platform """
|
|
USER_AGENT_REGEX = (r'Dalvik/[.0-9]+ \(Linux; U; Android [.0-9]+; (.*) Build/[0-9a-zA-Z]*\) '
|
|
r'(.*)/(?P<version>[0-9]+.[0-9]+.[0-9]+(.[0-9a-zA-Z]*)?)')
|
|
NAME = "Android"
|
|
|
|
|
|
# a list of all supported mobile platforms
|
|
PLATFORM_CLASSES = {IOS.NAME: IOS, Android.NAME: Android}
|