browserino 3.0.1 → 4.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.
metadata CHANGED
@@ -1,71 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: browserino
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.1
4
+ version: 4.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sidney Liebrand
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-02-03 00:00:00.000000000 Z
11
+ date: 2017-04-23 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: json
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: '0'
20
- type: :development
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ">="
25
- - !ruby/object:Gem::Version
26
- version: '0'
27
13
  - !ruby/object:Gem::Dependency
28
14
  name: bundler
29
15
  requirement: !ruby/object:Gem::Requirement
30
16
  requirements:
31
17
  - - "~>"
32
18
  - !ruby/object:Gem::Version
33
- version: '1.10'
19
+ version: '1.14'
34
20
  type: :development
35
21
  prerelease: false
36
22
  version_requirements: !ruby/object:Gem::Requirement
37
23
  requirements:
38
24
  - - "~>"
39
25
  - !ruby/object:Gem::Version
40
- version: '1.10'
26
+ version: '1.14'
41
27
  - !ruby/object:Gem::Dependency
42
28
  name: rake
43
29
  requirement: !ruby/object:Gem::Requirement
44
30
  requirements:
45
31
  - - "~>"
46
32
  - !ruby/object:Gem::Version
47
- version: '10.0'
33
+ version: '12.0'
48
34
  type: :development
49
35
  prerelease: false
50
36
  version_requirements: !ruby/object:Gem::Requirement
51
37
  requirements:
52
38
  - - "~>"
53
39
  - !ruby/object:Gem::Version
54
- version: '10.0'
55
- - !ruby/object:Gem::Dependency
56
- name: term-ansicolor
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - ">="
60
- - !ruby/object:Gem::Version
61
- version: '0'
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - ">="
67
- - !ruby/object:Gem::Version
68
- version: '0'
40
+ version: '12.0'
69
41
  - !ruby/object:Gem::Dependency
70
42
  name: rspec
71
43
  requirement: !ruby/object:Gem::Requirement
@@ -80,20 +52,6 @@ dependencies:
80
52
  - - ">="
81
53
  - !ruby/object:Gem::Version
82
54
  version: '0'
83
- - !ruby/object:Gem::Dependency
84
- name: tins
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - ">="
88
- - !ruby/object:Gem::Version
89
- version: '0'
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - ">="
95
- - !ruby/object:Gem::Version
96
- version: '0'
97
55
  - !ruby/object:Gem::Dependency
98
56
  name: coveralls
99
57
  requirement: !ruby/object:Gem::Requirement
@@ -145,21 +103,17 @@ files:
145
103
  - bin/setup
146
104
  - browserino.gemspec
147
105
  - lib/browserino.rb
148
- - lib/browserino/agent.rb
149
- - lib/browserino/browser.rb
150
- - lib/browserino/console.rb
151
- - lib/browserino/core/alias.rb
152
- - lib/browserino/core/helpers.rb
153
- - lib/browserino/core/lies.rb
154
- - lib/browserino/core/mapping.rb
155
- - lib/browserino/core/patterns.rb
156
- - lib/browserino/core/questions.rb
157
- - lib/browserino/core/supported.rb
158
- - lib/browserino/engine.rb
106
+ - lib/browserino/client.rb
107
+ - lib/browserino/config.rb
108
+ - lib/browserino/definitions/aliasses.rb
109
+ - lib/browserino/definitions/filters.rb
110
+ - lib/browserino/definitions/labels.rb
111
+ - lib/browserino/definitions/matchers.rb
112
+ - lib/browserino/identity.rb
159
113
  - lib/browserino/integrate/action_controller.rb
160
114
  - lib/browserino/integrate/rails.rb
161
- - lib/browserino/operating_system.rb
162
- - lib/browserino/unknown.rb
115
+ - lib/browserino/methods.rb
116
+ - lib/browserino/options.rb
163
117
  - lib/browserino/version.rb
164
118
  homepage: https://sidofc.github.io/projects/browserino/
165
119
  licenses:
@@ -1,116 +0,0 @@
1
- module Browserino
2
- class Agent
3
- include Core::Helpers, Core::Questions
4
- attr_reader :ua
5
-
6
- def initialize(info, ua = nil)
7
- @ua = ua
8
- @not = false
9
- @info = post_process(info)
10
- end
11
-
12
- def name
13
- @info[:name]
14
- end
15
-
16
- def browser_version(opts = {})
17
- if ie? && engine_version && !opts[:compat]
18
- (engine_version.to_f + 4.0).to_s
19
- else
20
- @info[:browser_version]
21
- end
22
- end
23
-
24
- def library_version
25
- @info[:library_version]
26
- end
27
-
28
- def library_name
29
- @info[:name]
30
- end
31
-
32
- def engine_name
33
- @info[:engine_name]
34
- end
35
-
36
- def engine_version
37
- @info[:engine_version]
38
- end
39
-
40
- def system_name(opts = {})
41
- if opts[:full]
42
- @full_sys_name ||= [@info[:system_name],
43
- fetch_system_version_name(@info[:system_name])]
44
- else
45
- @info[:system_name]
46
- end
47
- end
48
-
49
- def system_version
50
- @info[:system_version]
51
- end
52
-
53
- def system_architecture
54
- @info[:system_architecture]
55
- end
56
-
57
- def console_name
58
- @info[:console_name]
59
- end
60
-
61
- def locale
62
- @info[:locale]
63
- end
64
-
65
- def not
66
- @not = true
67
- self
68
- end
69
-
70
- def to_console_s
71
- hash_for_to_s.each_with_object('') do |pair, a|
72
- a << "\e[1;32;49m#{pair[0]}:\e[0m "
73
- a << "\e[1;95;49m#{(pair[1] == '' ? 'nil' : pair[1])}\e[0m, "
74
- end[0..-3]
75
- end
76
-
77
- def to_s(sep = '')
78
- prev = ''
79
- props = hash_for_to_s
80
- res = props.each_with_object([]) do |v, a|
81
- a << case v[0]
82
- when :browser_version, :engine_version
83
- prev + sep + (v[1].split('.').first || '')
84
- when :library_version
85
- props[:name] + sep + (v[1].split('.').first || '')
86
- else v[1]
87
- end
88
- prev = v[1]
89
- end
90
- res.uniq.reject { |str| str == '' }.join ' '
91
- end
92
-
93
- def to_a
94
- @info.keys.each_with_object([]) { |f, a| a.push([f, send(f)]) }
95
- end
96
-
97
- def to_h
98
- to_a.each_with_object({}) { |a, h| h[a[0]] = a[1] }
99
- end
100
-
101
- def method_missing(method_sym, *args, &block)
102
- name = method_sym.to_s.tr('?', '')
103
- invertable case type_id(method_sym)
104
- when :system then correct_system? name, *args
105
- when :agent then correct_agent? name, *args
106
- when :console then correct_console? name
107
- when :library then correct_library? name, *args
108
- else super
109
- end
110
- end
111
-
112
- def respond_to?(method_sym, *args, &block)
113
- type_id(method_sym).nil? ? false : true
114
- end
115
- end
116
- end
@@ -1,28 +0,0 @@
1
- module Browserino
2
- module Browser
3
- def self.name(ua)
4
- name = nil
5
- patterns = Core::PATTERNS[:browser].merge(Core::PATTERNS[:bot])
6
- .merge(Core::PATTERNS[:library])
7
- agents = patterns.keys
8
-
9
- until agents.empty? || !name.nil?
10
- tmp = agents.shift
11
- name = tmp if ua.match(patterns[tmp][:name])
12
- end
13
-
14
- name
15
- end
16
-
17
- def self.version(ua, name)
18
- patterns = Core::PATTERNS[:browser][name] || Core::PATTERNS[:library][name]
19
- if patterns
20
- Browserino.extract_match(ua.match(patterns[:version]), :version) do |v|
21
- v.tr('_', '.')
22
- end
23
- else
24
- UNKNOWN
25
- end
26
- end
27
- end
28
- end
@@ -1,10 +0,0 @@
1
- module Browserino
2
- module Console
3
- def self.name(ua)
4
- Browserino.extract_match(
5
- ua.match(Core::PATTERNS[:console][:name]),
6
- :name
7
- )
8
- end
9
- end
10
- end
@@ -1,23 +0,0 @@
1
- module Browserino
2
- module Core
3
- ALIAS = {
4
- name: { 'ie' => /msie/ },
5
- engine_name: { 'webkit' => /applewebkit/ },
6
- system_name: {
7
- 'solaris' => /s(?:unos|olaris)/,
8
- 'linux' => /ubuntu|x11/,
9
- 'windows_phone' => /windows\sphone/,
10
- 'ios' => /ip(?:[ao]d|hone)/,
11
- 'webos' => /w(?:eb)?os/
12
- },
13
- console_name: {
14
- 'nintendo_ds' => /nintendo\s\d?ds/,
15
- 'wii' => /wiiu?/
16
- },
17
- system_architecture: {
18
- 'x64' => /(?:x86_|amd|wow)?64/,
19
- 'x32' => /(?:(?:x86_)?32|i[36]8[36])/
20
- }
21
- }.freeze
22
- end
23
- end
@@ -1,141 +0,0 @@
1
- module Browserino
2
- module Core
3
- module Helpers
4
- def browser_name
5
- name_strict(:browsers)
6
- end
7
-
8
- def bot_name
9
- name_strict(:bots)
10
- end
11
-
12
- def search_engine_name
13
- name_strict(:search_engines)
14
- end
15
-
16
- def social_media_name
17
- name_strict(:social_media)
18
- end
19
-
20
- private
21
-
22
- def post_process(h)
23
- h[:library_version] = nil
24
- case h[:name].to_s.to_sym
25
- when :edge
26
- h[:engine_name] = 'edgehtml'
27
- h[:engine_version] = h[:browser_version].to_s.split('.').shift.to_s
28
- when :ie
29
- h[:engine_name] = 'trident'
30
- when *SUPPORTED[:libraries]
31
- h[:library_version] = h[:browser_version].dup
32
- h[:browser_version] = nil
33
- end
34
- h
35
- end
36
-
37
- def name_strict(cat)
38
- name if category? cat
39
- end
40
-
41
- def hash_for_to_s
42
- out = to_h.each_with_object({}) do |a, h|
43
- h[a[0]] = a[1].to_s.gsub(/[\s_]/, '-')
44
- end
45
-
46
- [:locale, :system_version].each { |k| out.delete(k) }
47
- out.delete(:browser_version) if out[:name] == ''
48
- out.delete(:engine_version) if out[:engine_name] == ''
49
-
50
- out
51
- end
52
-
53
- def invertable(res)
54
- if @not
55
- @not = false
56
- !res
57
- else
58
- res
59
- end
60
- end
61
-
62
- def compare_versions(a, b)
63
- b = b.to_s.split('.')
64
- !a.to_s.split('.').map { |v| v == b.shift }.include?(false)
65
- end
66
-
67
- def compare_sys_name_variations_with(name, version = nil)
68
- v = version.to_s.tr(' ', '_').downcase
69
- n = system_name(full: true).join.downcase.tr(' ', '_')
70
- [n, n.gsub(/[\d\.\s_]+$/, '')].include?((name + v))
71
- end
72
-
73
- def correct_system?(name, version = nil)
74
- sys_name = name.to_s.tr(' ', '_').downcase
75
- if compare_sys_name_variations_with(sys_name, version) ||
76
- (sys_name == system_name.tr(' ', '_') &&
77
- compare_versions(version, system_version)) ||
78
- (!version && sys_name == system_name.tr(' ', '_'))
79
- true
80
- else
81
- false
82
- end
83
- end
84
-
85
- def correct_agent?(name, version = nil)
86
- name = name.tr('_', ' ')
87
- browser_equal = (name == browser_name || name == bot_name)
88
- if version
89
- browser_equal && compare_versions(version, browser_version)
90
- else
91
- browser_equal
92
- end
93
- end
94
-
95
- def correct_library?(name, version = nil)
96
- name == library_name && (version.nil? || compare_versions(version, library_version))
97
- end
98
-
99
- def correct_console?(name)
100
- name == console_name
101
- end
102
-
103
- def category?(cat)
104
- n = name.to_s.gsub(/[\s-]/, '_').to_sym
105
- SUPPORTED.each { |t, s| return true if s.include?(n) && t == cat }
106
- nil
107
- end
108
-
109
- def type_id(method_sym)
110
- name = method_sym.to_s.downcase.tr('?', '').to_sym
111
- return :library if SUPPORTED[:libraries].include? name
112
- return :console if SUPPORTED[:consoles].include? name
113
- return :system if SUPPORTED[:operating_systems].include? name
114
- return :agent if SUPPORTED[:browsers].concat(SUPPORTED[:bots]).include? name
115
- nil
116
- end
117
-
118
- def fetch_system_version_name(name)
119
- const = name.to_s.tr(' ', '_').upcase.to_sym
120
- version = internal_sys_version(const)
121
- if version && Mapping.const?(const)
122
- res = Mapping.const_get(const)
123
- .select { |_, v| true if v.include?(version) }.keys.first
124
- res || system_version.split('.').first(2).join('.').downcase
125
- end
126
- end
127
-
128
- def internal_sys_version(name)
129
- if system_version
130
- if name =~ /mac|blackberry/i
131
- system_version.split('.').first(2).join.to_i
132
- elsif name =~ /win|android/i
133
- system_version.tr('.', '').to_i
134
- else
135
- system_version.to_i
136
- end
137
- end
138
- end
139
- end
140
- end
141
- end
@@ -1,14 +0,0 @@
1
- module Browserino
2
- module Core
3
- LIES = [
4
- [%r{(Mozilla/[\d\.]+)}i, true],
5
- [/9\.80/, /opera/i],
6
- [%r{(?:apple)?webkit/[\d\.]+}i, /presto/i],
7
- [/(?:ms)?ie/i, /rv:/i],
8
- [/android/i, /tizen/i],
9
- [/linux/i, /android|s(?:unos|olaris)|w(?:eb)?os|tizen/i],
10
- [/x11/i, /bsd|s(?:unos|olaris)/i],
11
- [/windows\snt/i, /windows\sphone/i]
12
- ].freeze
13
- end
14
- end
@@ -1,78 +0,0 @@
1
- module Browserino
2
- module Mapping
3
- def self.const?(const)
4
- constants(true).include?(const)
5
- end
6
-
7
- # Taken from https://en.wikipedia.org/wiki/Android_version_history
8
- # 03 - 02 - 2017
9
- ANDROID = {
10
- '1.0' => [10],
11
- '1.1' => [11],
12
- 'Cupcake 3' => [15],
13
- 'Cupcake 4' => [16],
14
- 'Eclair 5' => [20],
15
- 'Eclair 6' => [201],
16
- 'Eclair 7' => [21],
17
- 'Froyo 8' => [22, 221, 222, 223],
18
- 'Gingerbread 9' => [23, 231, 232],
19
- 'Gingerbread 10' => [233, 234, 235, 236, 237],
20
- 'Honeycomb 11' => [30],
21
- 'honeycomb 12' => [31],
22
- 'Honeycomb 13' => [32, 321, 322, 323, 324, 325, 326],
23
- 'Ice Cream Sandwich 14' => [40, 401, 402],
24
- 'Ice Cream Sandwich 15' => [403, 404],
25
- 'Jelly Bean 16' => [41, 411, 412],
26
- 'Jelly Bean 17' => [42, 421, 422],
27
- 'Jelly Bean 18' => [43, 431],
28
- 'KitKat 19' => [44, 441, 442, 443, 444],
29
- 'Lollipop 21' => [50, 501, 502],
30
- 'Lollipop 22' => [51, 511],
31
- 'Marshmallow 23' => [60, 601],
32
- 'Nougat 24' => [70],
33
- 'Nougat 25' => [71, 711]
34
- }.freeze
35
-
36
- # Taken from https://nl.wikipedia.org/wiki/OS_X
37
- # 03 - 02 - 2017
38
- MACINTOSH = {
39
- 'Cheetah' => [100],
40
- 'Puma' => [101],
41
- 'Jaguar' => [102],
42
- 'Panther' => [103],
43
- 'Tiger' => [104],
44
- 'Leopard' => [105],
45
- 'Snow Leopard' => [106],
46
- 'Lion' => [107],
47
- 'Mountain Lion' => [108],
48
- 'Mavericks' => [109],
49
- 'Yosemite' => [1010],
50
- 'El Capitan' => [1011],
51
- 'Sierra' => [1012]
52
- }.freeze
53
-
54
- # Taken from https://nl.wikipedia.org/wiki/Windows_NT
55
- # 03 - 02 - 2017
56
- WINDOWS = {
57
- '3.1' => [31],
58
- '3.5' => [35],
59
- '4' => [40],
60
- '2000' => [50],
61
- 'XP' => [51, 52],
62
- 'Vista' => [60],
63
- '7' => [61],
64
- '8' => [62],
65
- '8.1' => [63],
66
- '10' => [100]
67
- }.freeze
68
-
69
- TIZEN = {}.freeze
70
- BLACKBERRY = {}.freeze
71
- BSD = {}.freeze
72
- IOS = {}.freeze
73
- LINUX = {}.freeze
74
- SOLARIS = {}.freeze
75
- WEBOS = {}.freeze
76
- WINDOWS_PHONE = {}.freeze
77
- end
78
- end
@@ -1,142 +0,0 @@
1
- module Browserino
2
- module Core
3
- PATTERNS = {
4
- browser: {
5
- colibri: { name: /(?<name>colibri)/i,
6
- version: %r{colibri/(?<version>[\d\.]+)}i },
7
-
8
- samsungbrowser: { name: /(?<name>samsungbrowser)/i,
9
- version: %r{samsungbrowser/(?<version>[\d\.]+)}i },
10
-
11
- webosbrowser: { name: /(?<name>w(?:eb)?os(?:browser)?)/i,
12
- version: %r{w(?:eb)?osbrowser/(?<version>[\d\.]+)}i },
13
-
14
- vivaldi: { name: /(?<name>vivaldi)/i,
15
- version: %r{vivaldi/(?<version>[\d\.]+)}i },
16
-
17
- ucbrowser: { name: /(?<name>ucbrowser)/i,
18
- version: %r{ucbrowser/?(?<version>[\d\.]+)}i },
19
-
20
- bolt: { name: /(?<name>bolt)/i,
21
- version: %r{bolt/(?<version>[\d\.]+)}i },
22
-
23
- opera_mini: { name: /(?<name>ope?ra?\smini)/i,
24
- version: %r{(?:ope?ra?\smini)/(?<version>[\d\.]+)}i },
25
-
26
- opera: { name: /opera(?!ti(?:on|ng))|opr/i,
27
- version: %r{(?:ope?ra?|version)[/\s](?<version>[\d\.]+)}i },
28
-
29
- maxthon: { name: /(?<name>maxthon)/i,
30
- version: %r{maxthon[\s/](?<version>[\d\.]+)}i },
31
-
32
- edge: { name: /(?<name>edge)/i,
33
- version: %r{edge/(?<version>[\d\.]+)}i },
34
-
35
- ie: { name: /(?<name>msie|trident)/i,
36
- version: /(?:(?:ms)?ie\s|rv:)(?<version>[\d\.]+)/i },
37
-
38
- seamonkey: { name: /(?<name>seamonkey)/i,
39
- version: %r{seamonkey/(?<version>[\d\.]+)}i },
40
-
41
- servo: { name: /(?<name>servo)/i,
42
- version: %r{servo/(?<version>[\d\.]+)}i },
43
-
44
- firefox: {name: /(?<name>(?:fire|water)(?:fox|bird)
45
- |ice(?:weasel|cat)|netscape|superswan)/xi,
46
- version: %r{(?:(?:fire|water)(?:fox|bird)|ice(?:weasel|cat)
47
- |netscape|superswan)/?(?<version>[\d\.]+)}xi
48
- },
49
-
50
- brave: { name: /(?<name>brave)/i,
51
- version: %r{brave/(?<version>[\d\.]+)}i },
52
-
53
- chrome: { name: /(?<name>chrome?(ium|plus)?)/i,
54
- version: %r{chrome?(?:ium|plus)?/(?<version>[\d\.]+)}i },
55
-
56
- safari: { name: /(?<name>safari)/i,
57
- version: %r{(?:version|safari)/(?<version>[\d\.]+)}i }
58
- },
59
-
60
- library: {
61
- php: { name: /(?<name>php)/i,
62
- version: %r{php/(?<version>[\d\.]+)}i },
63
-
64
- python: { name: /(?<name>python)/i,
65
- version: %r{python-urllib/(?<version>[\d\.]+)}i },
66
-
67
- perl: { name: /(?<name>perl)/i,
68
- version: %r{perl/(?<version>[\d\.]+)}i },
69
-
70
- java: { name: /(?<name>java)/i,
71
- version: %r{java/(?<version>[\d\._]+)}i },
72
-
73
- pycurl: { name: /(?<name>pycurl)/i,
74
- version: %r{pycurl/(?<version>[\d\.]+)}i },
75
-
76
- curl: { name: /(?<name>curl)/i,
77
- version: %r{curl/(?<version>[\d\.a-z]+)}i }
78
- },
79
-
80
- bot: {
81
- google: { name: /(?<name>googlebot)/i },
82
- yahoo_slurp: { name: /(?<name>yahoo\!\sslurp)/i },
83
- msn: { name: /(?<name>msnbot)/i },
84
- bing: { name: /(?<name>bingbot)/i },
85
- baiduspider: { name: /(?<name>baiduspider)/i },
86
- yandex: { name: /(?<name>yandexbot)/i },
87
- sosospider: { name: /(?<name>sosospider)/i },
88
- exa: { name: /(?<name>exabot)/i },
89
- sogou_spider: { name: /(?<name>sogou\s?spider)/i },
90
- nutch: { name: /(?<name>nutch)/i },
91
- scrapy: { name: /(?<name>scrapy)/i },
92
- dataparksearch: { name: /(?<name>dataparksearch)/i },
93
- holmes: { name: /(?<name>holmes)/i },
94
- ask: { name: /(?<name>ask)\sjeeves/i },
95
- duckduckgo: { name: /(?<name>duckduckgo)/i },
96
- beslist: { name: /(?<name>beslistbot)/i },
97
- facebook: { name: /(?<name>face(?:bookexternalhit|bot))/i },
98
- twitter: { name: /(?<name>twitterbot)/i },
99
- linkedin: { name: /(?<name>linkedinbot)/i },
100
- instagram: { name: /(?<name>instagram)/i },
101
- pinterest: { name: /(?<name>pinterest)/i },
102
- tumblr: { name: /(?<name>tumblr)/i },
103
- alexa: { name: /(?<name>ia_archiver)/i },
104
- four_anything: { name: /(?<name>4anything)/i },
105
- auto_email_spider: { name: /(?<name>autoemailspider)/i },
106
- boston_project: { name: /(?<name>boston[_ ]project)/i },
107
- atomz: { name: /(?<name>atomz)/i },
108
- atomic_email_hunter: { name: /(?<name>atomic_email_hunter)/i },
109
- altavista: { name: /(?<name>altavista)/i },
110
- alkaline: { name: /(?<name>alkaline)/i },
111
- acoi: { name: /(?<name>acoi)/i },
112
- acoon: { name: /(?<name>acoon)/i },
113
- accoona: { name: /(?<name>accoona)/i }
114
- },
115
-
116
- engine: {
117
- name: /(?<name>((apple)?webkit|presto|gecko|trident))/i,
118
- version: %r{(?:(?:apple)?webkit|presto|rv:|trident)
119
- [/\s]?(?<version>[\d\.]+)}xi
120
- },
121
-
122
- operating_system: {
123
- name: /(?<name>windows(?:\sphone(?:\sos)?)?|macintosh|android
124
- |ip(?:[ao]d|hone)|blackberry|linux|ubuntu|x11|bsd
125
- |s(?:unos|olaris)|w(?:eb)?os|tizen)/xi,
126
- version: %r{(?:windows(?:\sphone(?:\sos)?)?|nt|mac\sos\sx|android
127
- |(cpu\s|ip([ao]d|hone)\s)os|blackberry.*?version/|bb
128
- |s(?:unos|olaris)/?|w(?:eb)?os/|tizen)
129
- \s?(?<version>[\d\._]+)}xi,
130
- architecture: /(?<architecture>((?:x|x86_|amd|wow)64)|i(3|6)86)/i,
131
- mobile: /bolt|nokia|samsung(?!b)|mobi(?:le)?|android|i?p(?:[ao]d|hone)
132
- |bb\d+|blackberry|iemobile|fennec|bada|meego|vodafone|t\-mobile
133
- |opera\sm(?:ob|in)i/xi,
134
- locale: /\s(?<locale>\w{2}(?:\-\w{2})?)[;\)]/
135
- },
136
-
137
- console: {
138
- name: /(?<name>xbox|playstation|nintendo\s3?ds|wiiu?)/i
139
- }
140
- }.freeze
141
- end
142
- end