Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add ios and android to user_agent provider #985

Merged
merged 6 commits into from Aug 7, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
54 changes: 52 additions & 2 deletions faker/providers/user_agent/__init__.py
Expand Up @@ -2,6 +2,7 @@

from __future__ import unicode_literals

import string
from datetime import datetime

from .. import BaseProvider
Expand All @@ -23,6 +24,20 @@ class Provider(BaseProvider):

mac_processors = ('Intel', 'PPC', 'U; Intel', 'U; PPC')

android_versions = (
'1.0', '1.1', '1.5', '1.6', '2.0', '2.0.1', '2.1', '2.2', '2.2.1', '2.2.2', '2.2.3', '2.3', '2.3.1', '2.3.2',
'2.3.3', '2.3.4', '2.3.5', '2.3.6', '2.3.7', '3.0', '3.1', '3.2', '3.2.1', '3.2.2', '3.2.3', '3.2.4', '3.2.5',
'3.2.6', '4.0', '4.0.1', '4.0.2', '4.0.3', '4.0.4', '4.1', '4.1.1', '4.1.2', '4.2', '4.2.1', '4.2.2', '4.3',
'4.3.1', '4.4', '4.4.1', '4.4.2', '4.4.3', '4.4.4', '5.0', '5.0.1', '5.0.2', '5.1', '5.1.1', '6.0', '6.0.1',
'7.0', '7.1', '7.1.1', '7.1.2', '8.0.0', '8.1.0', '9',
)

apple_devices = ('iPhone', 'iPad')

ios_versions = (
'3.1.3', '4.2.1', '5.1.1', '6.1.6', '7.1.2', '9.3.5', '9.3.6', '10.3.3', '10.3.4', '12.4',
)

def mac_processor(self):
return self.random_element(self.mac_processors)

Expand All @@ -35,10 +50,13 @@ def user_agent(self):

def chrome(self, version_from=13, version_to=63,
build_from=800, build_to=899):
saf = str(self.generator.random.randint(531, 536)) + \
str(self.generator.random.randint(0, 2))
saf = '{0}.{1}'.format(self.generator.random.randint(531, 536),
self.generator.random.randint(0, 2))
bld = self.lexify(self.numerify('##?###'), string.ascii_uppercase)
tmplt = '({0}) AppleWebKit/{1} (KHTML, like Gecko)' \
' Chrome/{2}.0.{3}.0 Safari/{4}'
tmplt_ios = '({0}) AppleWebKit/{1} (KHTML, like Gecko)' \
' CriOS/{2}.0.{3}.0 Mobile/{4} Safari/{1}'
platforms = (
tmplt.format(self.linux_platform_token(),
saf,
Expand All @@ -55,6 +73,16 @@ def chrome(self, version_from=13, version_to=63,
self.generator.random.randint(version_from, version_to),
self.generator.random.randint(build_from, build_to),
saf),
tmplt.format('Linux; {0}'.format(self.android_platform_token()),
saf,
self.generator.random.randint(version_from, version_to),
self.generator.random.randint(build_from, build_to),
saf),
tmplt_ios.format(self.ios_platform_token(),
saf,
self.generator.random.randint(version_from, version_to),
self.generator.random.randint(build_from, build_to),
bld),
)

return 'Mozilla/5.0 ' + self.random_element(platforms)
Expand All @@ -79,6 +107,12 @@ def firefox(self):
tmplt_win = '({0}; {1}; rv:1.9.{2}.20) {3}'
tmplt_lin = '({0}; rv:1.9.{1}.20) {2}'
tmplt_mac = '({0}; rv:1.9.{1}.20) {2}'
tmplt_and = '({0}; Mobile; rv:{1}.0) Gecko/{1}.0 Firefox/{1}.0'
tmplt_ios = '({0}) AppleWebKit/{1} (KHTML, like Gecko) FxiOS/{2}.{3}.0 Mobile/{4} Safari/{1}'
saf = '{0}.{1}'.format(self.generator.random.randint(531, 536),
self.generator.random.randint(0, 2))
bld = self.lexify(self.numerify('##?###'), string.ascii_uppercase)
bld2 = self.lexify(self.numerify('#?####'), string.ascii_lowercase)
platforms = (
tmplt_win.format(self.windows_platform_token(),
self.generator.locale().replace('_', '-'),
Expand All @@ -90,6 +124,13 @@ def firefox(self):
tmplt_mac.format(self.mac_platform_token(),
self.generator.random.randint(2, 6),
self.generator.random.choice(ver)),
tmplt_and.format(self.android_platform_token(),
self.generator.random.randint(5, 68)),
tmplt_ios.format(self.ios_platform_token(),
saf,
self.generator.random.randint(9, 18),
bld2,
bld),
)

return 'Mozilla/5.0 ' + self.random_element(platforms)
Expand Down Expand Up @@ -171,3 +212,12 @@ def mac_platform_token(self):
self.generator.random.randint(5, 12),
self.generator.random.randint(0, 9),
)

def android_platform_token(self):
return 'Android {0}'.format(self.random_element(self.android_versions))

def ios_platform_token(self):
return '{0}; CPU {0} OS {1} like Mac OS X'.format(
self.random_element(self.apple_devices),
self.random_element(self.ios_versions).replace('.', '_'),
)
26 changes: 26 additions & 0 deletions tests/providers/test_user_agent.py
@@ -0,0 +1,26 @@
# coding=utf-8

from __future__ import unicode_literals

import unittest
import re

from faker import Faker
from faker.providers.user_agent import Provider as UaProvider


class TestUserAgent(unittest.TestCase):
""" Tests user_agent """

def setUp(self):
self.factory = Faker()
self.ua = UaProvider(self.factory)

def test_android_platform_token(self):
for _ in range(0, 1000):
assert re.match(r"^(Android) (\d+)(\.\d){0,2}", self.ua.android_platform_token())

def test_ios_platform_token(self):
for _ in range(0, 1000):
assert re.match(r"^(iPhone|iPad); CPU (iPhone|iPad) OS (\d+)(_\d){0,2} like Mac OS X",
self.ua.ios_platform_token())