Skip to content

Commit 7bb5be9

Browse files
author
Elliott Fouts
committed
Replace ua-parser with uap-core
Handle regex_flag for case-sensitive regexes Strip device family Fixed defect where all sub calls were being passed $1
1 parent c0bde12 commit 7bb5be9

10 files changed

+40
-37
lines changed

.gitmodules

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
[submodule "vendor/ua-parser"]
2-
path = vendor/ua-parser
3-
url = https://github.com/tobie/ua-parser.git
1+
[submodule "vendor/uap-core"]
2+
path = vendor/uap-core
3+
url = https://github.com/ua-parser/uap-core.git

.travis.yml

+1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
language: ruby
22
rvm:
3+
- 2.2.0
34
- 2.1.0
45
- 2.0.0
56
- 1.9.3

Rakefile

+7-7
Original file line numberDiff line numberDiff line change
@@ -20,21 +20,21 @@ task :families do
2020
require 'pp'
2121

2222
root = Pathname(__FILE__).dirname
23-
path = root.join('vendor', 'ua-parser', 'test_resources')
23+
path = root.join('vendor', 'uap-core')
2424

2525
browser_families = paths_to_families([
26-
path.join('test_user_agent_parser.yaml'),
27-
path.join('firefox_user_agent_strings.yaml'),
28-
path.join('pgts_browser_list.yaml'),
26+
#path.join('tests', 'test_ua.yaml'),
27+
path.join('test_resources', 'firefox_user_agent_strings.yaml'),
28+
path.join('test_resources', 'pgts_browser_list.yaml'),
2929
])
3030

3131
os_families = paths_to_families([
32-
path.join('test_user_agent_parser_os.yaml'),
33-
path.join('additional_os_tests.yaml'),
32+
#path.join('tests', 'test_os.yaml'),
33+
path.join('test_resources', 'additional_os_tests.yaml'),
3434
])
3535

3636
device_families = paths_to_families([
37-
path.join('test_device.yaml'),
37+
#path.join('tests', 'test_device.yaml'),
3838
])
3939

4040
puts "\n\nBrowser Families"

Readme.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# UserAgentParser [![Build Status](https://secure.travis-ci.org/ua-parser/uap-ruby.png?branch=master)](http://travis-ci.org/ua-parser/uap-ruby)
22

3-
UserAgentParser is a simple, comprehensive Ruby gem for parsing user agent strings. It uses [BrowserScope](http://www.browserscope.org/)'s [parsing patterns](https://github.com/tobie/ua-parser).
3+
UserAgentParser is a simple, comprehensive Ruby gem for parsing user agent strings. It uses [BrowserScope](http://www.browserscope.org/)'s [parsing patterns](https://github.com/ua-parser/uap-core).
44

55
## Supported Rubies
66

@@ -64,7 +64,7 @@ end
6464

6565
## The pattern database
6666

67-
The [ua-parser database](https://github.com/tobie/ua-parser/blob/master/regexes.yaml) is included via a [git submodule](http://help.github.com/submodules/). To update the database the submodule needs to be updated and the gem re-released (pull requests for this are very welcome!).
67+
The [ua-parser database](https://github.com/ua-parser/uap-core/blob/master/regexes.yaml) is included via a [git submodule](http://help.github.com/submodules/). To update the database the submodule needs to be updated and the gem re-released (pull requests for this are very welcome!).
6868

6969
You can also specify the path to your own, updated and/or customised `regexes.yaml` file as a second argument to `UserAgentParser.parse`:
7070

lib/user_agent_parser.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
require 'user_agent_parser/device'
66

77
module UserAgentParser
8-
DefaultPatternsPath = File.join(File.dirname(__FILE__), "../vendor/ua-parser/regexes.yaml")
8+
DefaultPatternsPath = File.join(File.dirname(__FILE__), "../vendor/uap-core/regexes.yaml")
99

1010
# Parse the given +user_agent_string+, returning a +UserAgent+
1111
def self.parse(user_agent_string, options={})

lib/user_agent_parser/parser.rb

+14-12
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ def load_patterns(path)
2424
# Parse all the regexs
2525
yml.each_pair do |type, patterns|
2626
patterns.each do |pattern|
27-
pattern["regex"] = Regexp.new(pattern["regex"])
27+
pattern["regex"] = Regexp.new(pattern["regex"], pattern["regex_flag"] == 'i')
2828
end
2929
end
3030

@@ -78,19 +78,19 @@ def user_agent_from_pattern_match(pattern, match, os = nil, device = nil)
7878
end
7979

8080
if pattern["v1_replacement"]
81-
v1 = pattern["v1_replacement"].sub('$1', v1 || '')
81+
v1 = pattern["v1_replacement"].sub('$2', v1 || '')
8282
end
8383

8484
if pattern["v2_replacement"]
85-
v2 = pattern["v2_replacement"].sub('$1', v2 || '')
85+
v2 = pattern["v2_replacement"].sub('$3', v2 || '')
8686
end
8787

8888
if pattern["v3_replacement"]
89-
v3 = pattern["v3_replacement"].sub('$1', v3 || '')
89+
v3 = pattern["v3_replacement"].sub('$4', v3 || '')
9090
end
9191

9292
if pattern["v4_replacement"]
93-
v4 = pattern["v4_replacement"].sub('$1', v4 || '')
93+
v4 = pattern["v4_replacement"].sub('$5', v4 || '')
9494
end
9595

9696
version = version_from_segments(v1, v2, v3, v4)
@@ -106,19 +106,19 @@ def os_from_pattern_match(pattern, match)
106106
end
107107

108108
if pattern["os_v1_replacement"]
109-
v1 = pattern["os_v1_replacement"].sub('$1', v1 || '')
109+
v1 = pattern["os_v1_replacement"].sub('$2', v1 || '')
110110
end
111111

112112
if pattern["os_v2_replacement"]
113-
v2 = pattern["os_v2_replacement"].sub('$1', v2 || '')
113+
v2 = pattern["os_v2_replacement"].sub('$3', v2 || '')
114114
end
115115

116116
if pattern["os_v3_replacement"]
117-
v3 = pattern["os_v3_replacement"].sub('$1', v3 || '')
117+
v3 = pattern["os_v3_replacement"].sub('$4', v3 || '')
118118
end
119119

120120
if pattern["os_v4_replacement"]
121-
v4 = pattern["os_v4_replacement"].sub('$1', v4 || '')
121+
v4 = pattern["os_v4_replacement"].sub('$5', v4 || '')
122122
end
123123

124124
version = version_from_segments(v1, v2, v3, v4)
@@ -127,13 +127,15 @@ def os_from_pattern_match(pattern, match)
127127
end
128128

129129
def device_from_pattern_match(pattern, match)
130-
device = match[1]
130+
match = match.to_a.map(&:to_s)
131+
family = match[1]
131132

132133
if pattern["device_replacement"]
133-
device = pattern["device_replacement"].sub('$1', device || '')
134+
family = pattern["device_replacement"]
135+
match.each_with_index { |m,i| family = family.sub("$#{i}", m) }
134136
end
135137

136-
Device.new(device)
138+
Device.new(family.strip)
137139
end
138140

139141
def version_from_segments(*segments)

spec/parser_spec.rb

+9-9
Original file line numberDiff line numberDiff line change
@@ -31,23 +31,23 @@ def self.file_to_test_cases(file)
3131
end
3232

3333
def self.file_to_yaml(resource)
34-
test_resource_path = File.expand_path('../../vendor/ua-parser/test_resources', __FILE__)
35-
resource_path = File.join(test_resource_path, resource)
34+
uap_path = File.expand_path('../../vendor/uap-core', __FILE__)
35+
resource_path = File.join(uap_path, resource)
3636
YAML.load_file(resource_path)
3737
end
3838

3939
def self.user_agent_test_cases
40-
file_to_test_cases("firefox_user_agent_strings.yaml") +
41-
file_to_test_cases("test_user_agent_parser.yaml")
40+
file_to_test_cases("test_resources/firefox_user_agent_strings.yaml")
41+
file_to_test_cases("tests/test_ua.yaml")
4242
end
4343

4444
def self.operating_system_test_cases
45-
file_to_test_cases("test_user_agent_parser_os.yaml") +
46-
file_to_test_cases("additional_os_tests.yaml")
45+
file_to_test_cases("tests/test_os.yaml") +
46+
file_to_test_cases("test_resources/additional_os_tests.yaml")
4747
end
4848

4949
def self.device_test_cases
50-
file_to_test_cases("test_device.yaml")
50+
file_to_test_cases("tests/test_device.yaml")
5151
end
5252

5353
def custom_patterns_path
@@ -83,7 +83,7 @@ def custom_patterns_path
8383
ua.device.family.must_equal("Custom device")
8484
end
8585
end
86-
86+
8787
describe "#parse" do
8888
user_agent_test_cases.each do |test_case|
8989
it "parses UA for #{test_case_to_test_name(test_case)}" do
@@ -133,7 +133,7 @@ def custom_patterns_path
133133
end
134134
end
135135
end
136-
136+
137137
device_test_cases.each do |test_case|
138138
it "parses device for #{test_case_to_test_name(test_case)}" do
139139
user_agent = PARSER.parse(test_case['user_agent_string'])

user_agent_parser.gemspec

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Gem::Specification.new do |gem|
22
gem.name = "user_agent_parser"
3-
gem.version = "2.2.0"
3+
gem.version = "2.3.0"
44

55
gem.author = "Tim Lucas"
66
gem.email = "[email protected]"
@@ -10,7 +10,7 @@ Gem::Specification.new do |gem|
1010
gem.license = "MIT"
1111
gem.executables = ['user_agent_parser']
1212

13-
gem.files = %x{ git ls-files }.split("\n").select { |d| d =~ %r{^(MIT-LICENSE|Readme.md|lib|bin/)} } + ['vendor/ua-parser/regexes.yaml']
13+
gem.files = %x{ git ls-files }.split("\n").select { |d| d =~ %r{^(MIT-LICENSE|Readme.md|lib|bin/)} } + ['vendor/uap-core/regexes.yaml']
1414

1515
gem.required_ruby_version = '>= 1.8.7'
1616
end

vendor/ua-parser

-1
This file was deleted.

vendor/uap-core

Submodule uap-core added at 29b0305

0 commit comments

Comments
 (0)