fake_useragent 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,52 @@
1
+ [
2
+ "A1-713HD Build/KOT49H",
3
+ "A3-A30 Build/LRX22G",
4
+ "Archos 80 Helium 4G Build/JLS36C",
5
+ "BTV-DL09 Build/HUAWEIBEETHOVEN-DL09",
6
+ "FDR-A01L Build/HuaweiMediaPad",
7
+ "HUAWEI M2-A01L Build/HUAWEIM2-A01L",
8
+ "Lenovo A3500-H Build/KOT49H",
9
+ "Lenovo A3500-HV Build/KOT49H",
10
+ "Lenovo A5500-F Build/KOT49H",
11
+ "Lenovo A5500-H Build/KOT49H",
12
+ "Lenovo A7600-H Build/KOT49H",
13
+ "Lenovo TAB 2 A10-70L Build/KTU84P",
14
+ "Lenovo TAB 2 A8-50LC Build/LMY47D",
15
+ "Lenovo TAB 2 A8-50LC Build/LRX22G",
16
+ "MediaPad T1 8.0 Build/HuaweiMediaPad",
17
+ "Nexus 9 Build/MOB30M",
18
+ "Nexus 9 Build/NRD91N",
19
+ "SAMSUNG SM-T805 Build/LRX22G",
20
+ "SAMSUNG SM-T815Y Build/MMB29K",
21
+ "SGP771 Build/28.0.A.8.260",
22
+ "SM-P901 Build/KOT49H",
23
+ "SM-T110 Build/JDQ39",
24
+ "SM-T113 Build/KTU84P",
25
+ "SM-T116 Build/KTU84P",
26
+ "SM-T116BU Build/KTU84P",
27
+ "SM-T230 Build/KOT49H",
28
+ "SM-T231 Build/KOT49H",
29
+ "SM-T235 Build/LMY47X",
30
+ "SM-T325 Build/KOT49H",
31
+ "SM-T331 Build/LMY47X",
32
+ "SM-T365 Build/LMY47X",
33
+ "SM-T525 Build/KOT49H",
34
+ "SM-T530 Build/KOT49H",
35
+ "SM-T530 Build/LRX22G",
36
+ "SM-T531 Build/KOT49H",
37
+ "SM-T535 Build/KOT49H",
38
+ "SM-T555 Build/LRX22G",
39
+ "SM-T560 Build/KTU84P",
40
+ "SM-T561 Build/KTU84P",
41
+ "SM-T700 Build/LRX22G",
42
+ "SM-T705 Build/LRX22G",
43
+ "SM-T710 Build/LRX22G",
44
+ "SM-T715 Build/MMB29K",
45
+ "SM-T719 Build/MMB29M",
46
+ "SM-T800 Build/MMB29K",
47
+ "SM-T805 Build/KOT49H",
48
+ "SM-T813 Build/MMB29M",
49
+ "T1-701u Build/HuaweiMediaPad",
50
+ "X1 7.0 Build/HuaweiMediaPad",
51
+ "YOGA Tablet 2 Pro-1380F Build/LRX22C"
52
+ ]
@@ -0,0 +1,8 @@
1
+ require 'json'
2
+
3
+ SMARTPHONE_DEV_IDS = JSON.parse(
4
+ File.read(File.join(File.dirname(File.absolute_path(__FILE__)), 'data/smartphone_dev_id.json'))
5
+ )
6
+ TABLET_DEV_IDS = JSON.parse(
7
+ File.read(File.join(File.dirname(File.absolute_path(__FILE__)), 'data/tablet_dev_id.json'))
8
+ )
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ public
4
+
5
+ class UserAgentError < RuntimeError
6
+ def initialize(msg = nil)
7
+ super
8
+ end
9
+ end
10
+
11
+ class InvalidOption < RuntimeError
12
+ def initialize(msg = nil)
13
+ super
14
+ end
15
+ end
@@ -0,0 +1 @@
1
+
@@ -0,0 +1,240 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'minitest/autorun'
4
+ require './lib/fake_useragent'
5
+ require './lib/fake_useragent/error'
6
+
7
+ class TestSuite < Minitest::Test
8
+ def test_platform
9
+ 50.times do
10
+ assert_includes(generate_user_agent(os: 'linux'), 'Linux', 'Linux not in `ua`, where os: `linux`')
11
+ assert_includes(generate_user_agent(os: 'win'), 'Windows', 'Windows not in `ua`, where os: `win`')
12
+ assert_includes(generate_user_agent(os: 'mac'), 'Mac', 'Mac not in `ua`, where os: `mac`')
13
+ end
14
+ end
15
+
16
+ def test_invalid_platform
17
+ assert_raises(InvalidOption) { generate_user_agent(os: 11) }
18
+ assert_raises(InvalidOption) { generate_user_agent(os: 'minecraft') }
19
+ assert_raises(InvalidOption) { generate_user_agent(os: 'Putin, Sabaton, win') }
20
+ end
21
+
22
+ def test_navigator
23
+ 50.times do
24
+ assert_includes(generate_user_agent(navigator: 'firefox'), 'Firefox', 'Firefox not in `ua`, where navigator: `firefox`')
25
+ assert_includes(generate_user_agent(navigator: 'chrome'), 'Chrome', 'Chrome not in `ua`, where navigator: `chrome`')
26
+ # not passing
27
+ agent = generate_user_agent(navigator: 'ie')
28
+ assert((agent.include? 'MSIE') || (agent.include? 'rv:11'))
29
+ end
30
+ end
31
+
32
+ def test_invalid_navigator
33
+ assert_raises(InvalidOption) { generate_user_agent(navigator: 'win') }
34
+ assert_raises(InvalidOption) { generate_user_agent(navigator: 'linux, mac') }
35
+ end
36
+
37
+ def test_invalid_navigator_array
38
+ 50.times do
39
+ generate_user_agent(navigator: %w[firefox])
40
+ generate_user_agent(navigator: %w[firefox chrome])
41
+ generate_user_agent(navigator: %w[firefox chrome ie])
42
+ end
43
+ end
44
+
45
+ def test_platform_array
46
+ 50.times do
47
+ generate_user_agent(os: %w[win linux mac])
48
+ generate_user_agent(os: %w[mac])
49
+ generate_user_agent(os: %w[win linux])
50
+ generate_user_agent(os: %w[linux])
51
+ generate_user_agent(os: %w[win])
52
+ end
53
+ end
54
+
55
+ def test_platform_navigator
56
+ 50.times do
57
+ agent = generate_user_agent(os: 'win', navigator: 'firefox')
58
+ assert((agent.include? 'Firefox') && (agent.include? 'Windows'))
59
+ agent = generate_user_agent(os: 'win', navigator: 'chrome')
60
+ assert((agent.include? 'Chrome') && (agent.include? 'Windows'))
61
+ agent = generate_user_agent(os: 'win', navigator: 'ie')
62
+ assert((agent.include? 'MSIE') || (agent.include? 'rv:11'))
63
+ end
64
+ end
65
+
66
+ def test_platform_linux
67
+ 50.times do
68
+ assert(generate_user_agent(os: 'linux').start_with?('Mozilla/5.0 (X11;'))
69
+ end
70
+ end
71
+
72
+ def test_mac_chrome
73
+ 50.times do
74
+ agent = generate_user_agent(os: 'mac', navigator: 'chrome')
75
+ assert(!agent.match(/OS X \d+_\d+_\d+/).to_a.empty?)
76
+ end
77
+ end
78
+
79
+ def test_impossible_combination
80
+ 50.times do
81
+ assert_raises(InvalidOption) { generate_user_agent(os: 'linux', navigator: 'ie') }
82
+ assert_raises(InvalidOption) { generate_user_agent(os: 'mac', navigator: 'ie') }
83
+ end
84
+ end
85
+
86
+ def test_generate_navigator_js
87
+ 50.times do
88
+ navigator = generate_navigator_js
89
+ assert navigator.keys == %w[appCodeName appName appVersion platform userAgent oscpu product productSub vendor vendorSub buildID]
90
+ assert navigator['appCodeName'] == 'Mozilla'
91
+ assert ['Netscape', 'Microsoft Internet Explorer'].include? navigator['appName']
92
+ end
93
+ end
94
+
95
+ def test_data_integrity
96
+ 50.times do
97
+ navigator = generate_navigator
98
+ navigator.each_value do |value|
99
+ assert(value.nil? || (value.instance_of? String))
100
+ end
101
+ end
102
+ end
103
+
104
+ def test_feature_platform
105
+ 50.times do
106
+ nav = generate_navigator(os: 'win')
107
+ assert nav['platform'].include? 'Win'
108
+ nav = generate_navigator(os: 'linux')
109
+ assert nav['platform'].include? 'Linux'
110
+ nav = generate_navigator(os: 'mac')
111
+ assert nav['platform'].include? 'MacIntel'
112
+ end
113
+ end
114
+
115
+ def test_feature_os_cpu
116
+ 10.times do
117
+ nav = generate_navigator(os: 'win')
118
+ assert nav['os_cpu'].include? 'Windows NT'
119
+ nav = generate_navigator(os: 'linux')
120
+ assert nav['os_cpu'].include? 'Linux'
121
+ nav = generate_navigator(os: 'mac')
122
+ assert nav['os_cpu'].include? 'Mac OS'
123
+ end
124
+ end
125
+
126
+ def test_chrome_app_version
127
+ 50.times do
128
+ nav = generate_navigator_js(navigator: 'chrome')
129
+ assert(("Mozilla/#{nav['appVersion']}") == nav['userAgent'])
130
+ end
131
+ end
132
+
133
+ def test_feature_product
134
+ 50.times do
135
+ assert generate_navigator_js(navigator: 'chrome')['product'] == 'Gecko'
136
+ end
137
+ end
138
+
139
+ def test_feature_vendor
140
+ 50.times do
141
+ assert generate_navigator_js(navigator: 'chrome')['vendor'] == 'Google Inc.'
142
+ assert generate_navigator_js(navigator: 'firefox')['vendor'] == ''
143
+ assert generate_navigator_js(navigator: 'ie')['vendor'] == ''
144
+ end
145
+ end
146
+
147
+ def test_feature_vendor_sub
148
+ 50.times do
149
+ assert generate_navigator_js(navigator: 'chrome')['vendorSub'] == ''
150
+ end
151
+ end
152
+
153
+ def test_build_id_no_firefox
154
+ 50.times do
155
+ nav = generate_navigator(navigator: 'chrome')
156
+ assert nav['build_id'] == ''
157
+ nav = generate_navigator(navigator: 'ie')
158
+ assert nav['build_id'] == ''
159
+ end
160
+ end
161
+
162
+ def test_build_id_firefox
163
+ original_ff_version = FIREFOX_VERSION.clone
164
+ FIREFOX_VERSION.replace [
165
+ ['49.0', Time.new(2016, 9, 20)],
166
+ ['50.0', Time.new(2016, 11, 15)]
167
+ ].freeze
168
+ begin
169
+ 50.times do
170
+ nav = generate_navigator(navigator: 'firefox')
171
+ assert nav['build_id'].length == 14
172
+ if nav['user_agent'].include? '50.0'
173
+ assert nav['build_id'].start_with? '20161115'
174
+ else
175
+ time_ = Time.at(nav['build_id'].to_i)
176
+ assert Time.new(2016, 9, 20, 0) <= time_
177
+ end
178
+ end
179
+ ensure
180
+ FIREFOX_VERSION.replace original_ff_version
181
+ end
182
+ end
183
+
184
+ def test_android_firefox
185
+ 50.times do
186
+ nav = generate_navigator_js(os: 'android', navigator: 'firefox')
187
+ assert nav['platform'].include? 'armv'
188
+ assert nav['oscpu'].include? 'Linux armv'
189
+ assert nav['appVersion'].include? 'Android'
190
+ assert nav['userAgent'].split('(')[1].split(')')[0].include? 'Android'
191
+ end
192
+ end
193
+
194
+ def test_device_type
195
+ 50.times do
196
+ agent = generate_user_agent(device_type: 'smartphone')
197
+ assert agent.include? 'Android'
198
+ assert (agent.include? 'Firefox') || (agent.include? 'Chrome')
199
+ end
200
+ end
201
+
202
+ def test_invalid_device_type
203
+ 50.times do
204
+ assert_raises(InvalidOption) { generate_user_agent(device_type: 'computer') }
205
+ end
206
+ end
207
+
208
+ def invalid_device_type_with_os
209
+ 50.times do
210
+ assert_raises(InvalidOption) { generate_user_agent(os: 'win', device_type: 'smartphone') }
211
+ end
212
+ end
213
+
214
+ def invalid_dev_type_with_nav
215
+ 50.times do
216
+ assert_raises(InvalidOption) { generate_user_agent(device_type: 'smartphone', navigator: 'ie') }
217
+ end
218
+ end
219
+
220
+ def default_device_without_os
221
+ 50.times do
222
+ assert_not_include(generate_user_agent, 'Android')
223
+ # if os is default then device_type is 'desktop'
224
+ end
225
+ end
226
+
227
+ def all_device_types
228
+ 50.times do
229
+ generate_user_agent(device_type: 'all')
230
+ generate_user_agent(device_type: 'all', navigator: 'ie')
231
+ end
232
+ end
233
+
234
+ def dev_type_smartphone_chrome
235
+ 50.times do
236
+ assert_includes(generate_user_agent(device_type: 'smartphone', navigator: 'chrome'), 'Mobile')
237
+ assert_includes(generate_user_agent(device_type: 'tablet', navigator: 'chrome'), 'Mobile')
238
+ end
239
+ end
240
+ end
metadata ADDED
@@ -0,0 +1,58 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fake_useragent
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Bokanov Alexander
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2021-04-17 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Simple gem for generating valid web user agents.
14
+ email: overhead.nerves@gmail.com
15
+ executables: []
16
+ extensions: []
17
+ extra_rdoc_files: []
18
+ files:
19
+ - ".github/workflows/ruby.yml"
20
+ - ".gitignore"
21
+ - Gemfile
22
+ - LICENSE
23
+ - README.md
24
+ - Rakefile
25
+ - fake_useragent.gemspec
26
+ - lib/fake_useragent.rb
27
+ - lib/fake_useragent/data/smartphone_dev_ext.json
28
+ - lib/fake_useragent/data/smartphone_dev_id.json
29
+ - lib/fake_useragent/data/tablet_dev_ext.json
30
+ - lib/fake_useragent/data/tablet_dev_id.json
31
+ - lib/fake_useragent/device.rb
32
+ - lib/fake_useragent/error.rb
33
+ - lib/fake_useragent/version.rb
34
+ - spec/lib/test_fake_useragent.rb
35
+ homepage: https://github.com/TRT360/fake_useragent
36
+ licenses:
37
+ - MIT
38
+ metadata: {}
39
+ post_install_message:
40
+ rdoc_options: []
41
+ require_paths:
42
+ - lib
43
+ required_ruby_version: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ required_rubygems_version: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: '0'
53
+ requirements: []
54
+ rubygems_version: 3.1.4
55
+ signing_key:
56
+ specification_version: 4
57
+ summary: FakeUserAgent - simple gem for generating valid web user agents.
58
+ test_files: []