browserino 4.0.0 → 4.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +18 -0
- data/.travis.yml +5 -1
- data/bin/browserino +1 -1
- data/bin/console +3 -4
- data/browserino.gemspec +2 -1
- data/lib/browserino/client.rb +48 -31
- data/lib/browserino/config.rb +43 -24
- data/lib/browserino/definitions/aliasses.rb +2 -0
- data/lib/browserino/definitions/filters.rb +32 -20
- data/lib/browserino/definitions/labels.rb +14 -8
- data/lib/browserino/definitions/matchers.rb +434 -167
- data/lib/browserino/{identity.rb → matcher.rb} +9 -8
- data/lib/browserino/methods.rb +42 -45
- data/lib/browserino/options.rb +3 -2
- data/lib/browserino/version.rb +12 -3
- data/lib/browserino.rb +4 -4
- metadata +17 -3
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module Browserino
|
3
|
-
class
|
4
|
+
class Matcher
|
4
5
|
attr_reader :pattern, :properties
|
5
6
|
|
6
7
|
SETTINGS = { name: nil, type: :unknown }.freeze
|
@@ -14,7 +15,11 @@ module Browserino
|
|
14
15
|
end
|
15
16
|
|
16
17
|
def matches?(user_agent)
|
17
|
-
pattern =~ user_agent
|
18
|
+
pattern =~ user_agent
|
19
|
+
end
|
20
|
+
|
21
|
+
def =~(other)
|
22
|
+
pattern =~ other
|
18
23
|
end
|
19
24
|
|
20
25
|
def ===(other)
|
@@ -24,7 +29,7 @@ module Browserino
|
|
24
29
|
when Regexp then other =~ properties[:name]
|
25
30
|
when String then other.to_sym == properties[:name]
|
26
31
|
when Symbol then other == properties[:name]
|
27
|
-
when
|
32
|
+
when Matcher then other.properties[:name] == properties[:name]
|
28
33
|
else false
|
29
34
|
end
|
30
35
|
end
|
@@ -33,17 +38,13 @@ module Browserino
|
|
33
38
|
properties[:name].to_s
|
34
39
|
end
|
35
40
|
|
36
|
-
def =~(other)
|
37
|
-
self === other
|
38
|
-
end
|
39
|
-
|
40
41
|
def ==(other)
|
41
42
|
self === other
|
42
43
|
end
|
43
44
|
|
44
45
|
def method_missing(sym, *args, &block)
|
45
|
-
return @properties[sym] = block if block
|
46
46
|
return @properties[sym] = args.shift if args.any?
|
47
|
+
return @properties[sym] = block if block
|
47
48
|
|
48
49
|
@properties[sym]
|
49
50
|
end
|
data/lib/browserino/methods.rb
CHANGED
@@ -1,35 +1,39 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module Browserino
|
3
|
-
def self.analyze(
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
props
|
9
|
-
props
|
10
|
-
|
11
|
-
|
12
|
-
props = with_labels props
|
13
|
-
|
14
|
-
if like
|
15
|
-
repl = user_agent =~ %r{#{like}}i && '' || like.to_s
|
16
|
-
like = parse user_agent.gsub identity.pattern, repl
|
17
|
-
end
|
4
|
+
def self.analyze(ua, matcher = nil)
|
5
|
+
@defaults ||= config.global_matchers.map(&:properties).reduce(&:merge)
|
6
|
+
|
7
|
+
props = @defaults.merge(matcher && matcher.properties || {})
|
8
|
+
like = props.delete :like
|
9
|
+
props = collect props, ua
|
10
|
+
props = collect_with_smart_watchers props, ua
|
11
|
+
props = with_labels props
|
12
|
+
like = Client.new props.merge(like_attrs(props, like, ua)) if like
|
18
13
|
|
19
14
|
Client.new props, like
|
20
15
|
end
|
21
16
|
|
17
|
+
def self.like_attrs(props, like, user_agent)
|
18
|
+
lattrs = config.matchers.select { |m| m == like }.first.properties
|
19
|
+
fattrs = { name: like }
|
20
|
+
fattrs[:version] = lattrs[:version] if lattrs[:version].is_a? Regexp
|
21
|
+
fattrs[:version] ||= smart_matchers(fattrs)[:version]
|
22
|
+
|
23
|
+
props.dup.merge collect(fattrs, user_agent)
|
24
|
+
end
|
25
|
+
|
22
26
|
def self.config
|
23
|
-
@config ||= Config.new(
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
27
|
+
@config ||= Config.new(before_parse: [],
|
28
|
+
global_matchers: [],
|
29
|
+
properties: [],
|
30
|
+
types: [:unknown],
|
31
|
+
names: [],
|
32
|
+
smart_matchers: {},
|
33
|
+
matchers: [],
|
34
|
+
labels: Hash.new { |h, k| h[k] = [] },
|
35
|
+
filters: Hash.new { |h, k| h[k] = [] },
|
36
|
+
aliasses: Hash.new { |h, k| h[k] = [] })
|
33
37
|
end
|
34
38
|
|
35
39
|
def self.label_for(target_name, version = nil)
|
@@ -37,16 +41,13 @@ module Browserino
|
|
37
41
|
version = Version.new version unless version.is_a? Version
|
38
42
|
return unless version > 0
|
39
43
|
config.labels[target_name].each do |candidate|
|
40
|
-
|
41
|
-
max = Version.new candidate[:range].max
|
42
|
-
|
43
|
-
return candidate[:name] if version >= min && version <= max
|
44
|
+
return candidate[:name] if version.between? candidate[:range]
|
44
45
|
end
|
45
46
|
nil
|
46
47
|
end
|
47
48
|
|
48
49
|
def self.with_labels(properties)
|
49
|
-
[
|
50
|
+
%i[name engine platform].each do |prop|
|
50
51
|
lbl_prop = (prop == :name) && :label || "#{prop}_label".to_sym
|
51
52
|
ver_prop = (prop == :name) && :version || "#{prop}_version".to_sym
|
52
53
|
properties[lbl_prop] ||= label_for properties[prop], properties[ver_prop]
|
@@ -55,9 +56,14 @@ module Browserino
|
|
55
56
|
properties
|
56
57
|
end
|
57
58
|
|
58
|
-
def self.
|
59
|
-
|
60
|
-
|
59
|
+
def self.collect_with_smart_watchers(properties, user_agent)
|
60
|
+
properties.merge collect(smart_matchers(properties), user_agent)
|
61
|
+
end
|
62
|
+
|
63
|
+
def self.smart_matchers(properties)
|
64
|
+
config.smart_matchers.each_with_object({}) do |(prop, detector), props|
|
65
|
+
next if properties.key? prop
|
66
|
+
props[prop] = parse_detector detector, properties
|
61
67
|
end
|
62
68
|
end
|
63
69
|
|
@@ -71,23 +77,14 @@ module Browserino
|
|
71
77
|
end
|
72
78
|
|
73
79
|
def self.collect(properties, ua)
|
74
|
-
properties.each_with_object({}) do |(
|
75
|
-
|
76
|
-
when Regexp then value.match(ua).to_a[1]
|
77
|
-
else value
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
def self.normalize(properties)
|
83
|
-
properties.each_with_object({}) do |(prop, value), store|
|
84
|
-
store[prop] = convert value, format: prop
|
80
|
+
properties.each_with_object({}) do |(n, v), r|
|
81
|
+
r[n] = convert (v.is_a?(Regexp) ? v.match(ua).to_a[1] : v), format: n
|
85
82
|
end
|
86
83
|
end
|
87
84
|
|
88
85
|
def self.convert(val, **opts)
|
89
86
|
filters = config.filters[:global] + config.filters[opts[:format]]
|
90
|
-
filters.
|
87
|
+
filters.each do |fmt|
|
91
88
|
val = fmt.call val
|
92
89
|
end
|
93
90
|
|
data/lib/browserino/options.rb
CHANGED
@@ -1,16 +1,17 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module Browserino
|
3
4
|
class Options
|
4
5
|
def initialize(options = {})
|
5
6
|
@options = options
|
6
7
|
end
|
7
8
|
|
8
|
-
def method_missing(sym, *args, &
|
9
|
+
def method_missing(sym, *args, &___)
|
9
10
|
return @options[opt(sym)] == args.first if args.any?
|
10
11
|
@options[opt(sym)]
|
11
12
|
end
|
12
13
|
|
13
|
-
def respond_to_missing?(sym, *
|
14
|
+
def respond_to_missing?(sym, *_, &___)
|
14
15
|
option? sym
|
15
16
|
end
|
16
17
|
|
data/lib/browserino/version.rb
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module Browserino
|
3
|
-
VERSION = '4.
|
4
|
+
VERSION = '4.1.0'.freeze
|
4
5
|
|
5
6
|
def self.version
|
6
|
-
@
|
7
|
+
@version ||= Version.new VERSION.dup
|
7
8
|
end
|
8
9
|
|
9
10
|
# This class makes versions easily comparable using logical operators
|
@@ -50,11 +51,19 @@ module Browserino
|
|
50
51
|
compare :!=, other
|
51
52
|
end
|
52
53
|
|
54
|
+
def between?(min, max = nil)
|
55
|
+
if min.is_a? Range
|
56
|
+
max = min.max
|
57
|
+
min = min.min
|
58
|
+
end
|
59
|
+
|
60
|
+
(self >= Version.new(min)) && (self <= Version.new(max))
|
61
|
+
end
|
62
|
+
|
53
63
|
private
|
54
64
|
|
55
65
|
def parse_params(val, *rest)
|
56
66
|
case val
|
57
|
-
when Float then val.to_s.split '.'
|
58
67
|
when Integer then [val, *rest]
|
59
68
|
when String then val.tr('_', '.').split '.'
|
60
69
|
when Array then val
|
data/lib/browserino.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require_relative 'browserino/integrate/rails' if defined?(::Rails)
|
3
4
|
|
4
5
|
require_relative 'browserino/options'
|
@@ -6,7 +7,7 @@ require_relative 'browserino/config'
|
|
6
7
|
require_relative 'browserino/methods'
|
7
8
|
require_relative 'browserino/client'
|
8
9
|
require_relative 'browserino/version'
|
9
|
-
require_relative 'browserino/
|
10
|
+
require_relative 'browserino/matcher'
|
10
11
|
|
11
12
|
require_relative 'browserino/definitions/matchers'
|
12
13
|
require_relative 'browserino/definitions/aliasses'
|
@@ -16,10 +17,9 @@ require_relative 'browserino/definitions/labels'
|
|
16
17
|
module Browserino
|
17
18
|
def self.parse(ua)
|
18
19
|
config.before_parse.each { |b| ua = b.call ua } if config.before_parse.any?
|
19
|
-
config.
|
20
|
-
return analyze ua,
|
20
|
+
config.matchers.each do |matcher|
|
21
|
+
return analyze ua, matcher if matcher.matches? ua
|
21
22
|
end
|
22
|
-
|
23
23
|
analyze ua
|
24
24
|
end
|
25
25
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: browserino
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.
|
4
|
+
version: 4.1.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-04-
|
11
|
+
date: 2017-04-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rubocop
|
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'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: coveralls
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -109,9 +123,9 @@ files:
|
|
109
123
|
- lib/browserino/definitions/filters.rb
|
110
124
|
- lib/browserino/definitions/labels.rb
|
111
125
|
- lib/browserino/definitions/matchers.rb
|
112
|
-
- lib/browserino/identity.rb
|
113
126
|
- lib/browserino/integrate/action_controller.rb
|
114
127
|
- lib/browserino/integrate/rails.rb
|
128
|
+
- lib/browserino/matcher.rb
|
115
129
|
- lib/browserino/methods.rb
|
116
130
|
- lib/browserino/options.rb
|
117
131
|
- lib/browserino/version.rb
|