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.
- checksums.yaml +7 -0
- data/.github/workflows/ruby.yml +32 -0
- data/.gitignore +27 -0
- data/Gemfile +2 -0
- data/LICENSE +21 -0
- data/README.md +39 -0
- data/Rakefile +9 -0
- data/fake_useragent.gemspec +14 -0
- data/lib/fake_useragent.rb +484 -0
- data/lib/fake_useragent/data/smartphone_dev_ext.json +2820 -0
- data/lib/fake_useragent/data/smartphone_dev_id.json +180 -0
- data/lib/fake_useragent/data/tablet_dev_ext.json +757 -0
- data/lib/fake_useragent/data/tablet_dev_id.json +52 -0
- data/lib/fake_useragent/device.rb +8 -0
- data/lib/fake_useragent/error.rb +15 -0
- data/lib/fake_useragent/version.rb +1 -0
- data/spec/lib/test_fake_useragent.rb +240 -0
- metadata +58 -0
@@ -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 @@
|
|
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: []
|