browserino 4.1.0 → 4.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b85dfc764ad259ee956ed4fd456d2a3d157f0e17
4
- data.tar.gz: b8f96ecc2cc453dada5c1ca5df9dbd3216c0d6a9
3
+ metadata.gz: b2d30f42c7e1a63c8e19cbad7586428a031131b3
4
+ data.tar.gz: b42852889bef245e914e0f7e595ba0901461bfeb
5
5
  SHA512:
6
- metadata.gz: 66997f7437d4108c2779f2a1c2d07b0b41b6d95772435e4616ebde8567936bd87545d775db05fc6c81602bbf79a6693e22b938bae2724f130e0c660fddb54c18
7
- data.tar.gz: a6f8eed6eedd79d2621a6982f1aa52d37302e7bc0577880f30cbcd8bea4f6864811703ac72e48fa6960f4a48f7bafb3ff5a78e5f9faf7b4765ac11b3183bc402
6
+ metadata.gz: 7e723963f0ec847654a3fa638cb11b8d660f62062a2be94eef57b05c30b9c8585456b3eef02002d46b536e8d743f2a9c4f4b34b39572692c9a29394c7d8ec9b2
7
+ data.tar.gz: 02be67d0b2ff279028a0596f077bf684c401bde84e1316422d535580b9e57818d6e01e2863a1466c85288347983af9082b1dc45990de33ea0fcc3cc083ab6833
data/.codeclimate.yml ADDED
@@ -0,0 +1,19 @@
1
+ ---
2
+ engines:
3
+ rubocop:
4
+ enabled: true
5
+ duplication:
6
+ enabled: true
7
+ config:
8
+ languages:
9
+ - ruby:
10
+ mass_threshold: 30
11
+
12
+ ratings:
13
+ paths:
14
+ - lib/**
15
+ - "**.rb"
16
+
17
+ exclude_paths:
18
+ - spec/**/*
19
+ - "**/vendor/**/*"
data/.gitignore CHANGED
@@ -8,3 +8,5 @@
8
8
  /spec/reports/
9
9
  /tmp/
10
10
  .DS_Store
11
+ *.swp
12
+ Session.vim
data/.rspec CHANGED
@@ -1,2 +1,2 @@
1
- --format documentation
1
+ --format progress
2
2
  --color
data/.rubocop.yml CHANGED
@@ -1,12 +1,18 @@
1
1
  AllCops:
2
2
  Exclude:
3
- - 'spec/*'
3
+ - 'spec/**/*'
4
4
  - 'Guardfile'
5
5
  - '*.gemspec'
6
6
  - 'Rakefile'
7
7
  - 'tmp/**/*'
8
8
  - 'vendor/**/*'
9
9
 
10
+ Style/ExtraSpacing:
11
+ Enabled: true
12
+
13
+ SpaceAroundOperators:
14
+ Enabled: false
15
+
10
16
  Documentation:
11
17
  Enabled: false
12
18
 
@@ -26,12 +32,12 @@ Metrics/BlockLength:
26
32
  Enabled: false
27
33
 
28
34
  Metrics/AbcSize:
29
- Max: 20
35
+ Max: 15
30
36
 
31
37
  Metrics/ClassLength:
32
38
  CountComments: false
33
- Max: 175
39
+ Max: 150
34
40
 
35
41
  Metrics/MethodLength:
36
42
  CountComments: false
37
- Max: 15
43
+ Max: 10
data/.travis.yml CHANGED
@@ -1,13 +1,14 @@
1
1
  sudo: false
2
- cache: bundler
3
2
  language: ruby
3
+ cache: bundler
4
4
  rvm:
5
5
  - 2.0.0
6
6
  - 2.1.0
7
7
  - 2.2.0
8
8
  - 2.3.0
9
9
  - 2.4.0
10
- before_install: gem install bundler
10
+ before_install: gem update bundler
11
11
  script:
12
12
  - bundle exec rspec spec
13
+ - bundle exec codeclimate-test-reporter
13
14
  - bundle exec rubocop
data/browserino.gemspec CHANGED
@@ -1,4 +1,5 @@
1
1
  # coding: utf-8
2
+
2
3
  lib = File.expand_path('../lib', __FILE__)
3
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
5
  require 'browserino/version'
@@ -17,10 +18,11 @@ Gem::Specification.new do |spec|
17
18
  spec.executables = ['browserino']
18
19
  spec.require_paths = ["lib"]
19
20
 
20
- spec.add_development_dependency "bundler", "~> 1.14"
21
- spec.add_development_dependency "rake", "~> 12.0"
21
+ spec.add_development_dependency "bundler"
22
+ spec.add_development_dependency "rake"
22
23
  spec.add_development_dependency "rspec"
23
24
  spec.add_development_dependency "rubocop"
24
25
  spec.add_development_dependency "coveralls"
25
26
  spec.add_development_dependency "pry"
27
+ spec.add_development_dependency "codeclimate-test-reporter"
26
28
  end
@@ -2,8 +2,6 @@
2
2
 
3
3
  module Browserino
4
4
  class Client
5
- attr_reader :property_names
6
-
7
5
  def initialize(props = {}, like = nil)
8
6
  @property_names = props.keys
9
7
  @like = like
@@ -12,28 +10,16 @@ module Browserino
12
10
  # order below. First, seperate static value methods from procs,
13
11
  # procs will be able to call methods in this instances' context
14
12
  # therefore we need to define static methods before procs
13
+ generate_preset_methods! props
15
14
 
16
- # for each static property:
17
- # -- define a method that returns it's property value
18
- # -- define a question method that returns it's property value or
19
- # checks version against supplied value if truthy
20
- define_simple_methods! props
21
-
22
- # for each proc property:
23
- # -- define a method that returns it's instance evalled block value
24
- # -- define a question method that returns it's instance evalled block
25
- # value or checks version against supplied value if truthy
26
- define_proc_methods! props
27
-
28
- # for each of #name, #engine and #platform, use their results as
15
+ # for each of #name, #engine, #platform and #device use their results as
29
16
  # methods names, this will create a method #firefox? for the output
30
17
  # of a #name # => :firefox for example.
31
- define_name_result_methods!
32
-
33
- # finally, add labels and their aliasses into the mix
34
- # none of these methods should override an existing method
35
- # therefore we check it's existence using defined?
36
- define_label_methods!
18
+ # NOTE: labels do not have to be added, they will be extracted
19
+ # and inserted by this method, this method will also add aliasses
20
+ # of all the names as methods.
21
+ generate_result_methods! props, :name, :engine, :platform, :device
22
+ generate_proc_methods! props
37
23
  end
38
24
 
39
25
  def properties
@@ -46,43 +32,40 @@ module Browserino
46
32
  @like ||= self
47
33
  end
48
34
 
49
- def like?(sym = nil, opts = {})
50
- opts = sym if sym.is_a? Hash
51
- must = []
52
- must << like.is?(sym) if sym
53
- must << like.version?(opts[:version]) if opts[:version]
54
-
55
- must.any? && must.all?
35
+ def like?(sym, opts = {})
36
+ invertable like.is?(sym, opts)
56
37
  end
57
38
 
58
39
  def x64?
59
- @x64_cache ||= architecture == :x64
40
+ invertable(@x64 ||= architecture == :x64)
60
41
  end
61
42
 
62
43
  def x32?
63
- @x32_cache ||= architecture == :x32
44
+ invertable(@x32 ||= architecture == :x32)
64
45
  end
65
46
 
66
47
  def arm?
67
- @arm_cache ||= architecture == :arm
48
+ invertable(@arm ||= architecture == :arm)
49
+ end
50
+
51
+ def is?(sm, opts = {})
52
+ return invertable send("#{sm}?", opts[:version]) if opts && opts[:version]
53
+ invertable send("#{sm}?")
68
54
  end
69
55
 
70
- # the catch all method, anything it can ask as question will respond
71
- # otherwise nil is returned, this is also true when supplying a version
72
- def is?(sym, opts = {})
73
- return send "#{sym}?", opts[:version] if opts[:version]
74
- send "#{sym}?"
56
+ def not?(sym, opts = {})
57
+ !is? sym, opts
75
58
  end
76
59
 
77
60
  def ===(other)
78
- return false unless name
61
+ return invertable false unless name
79
62
 
80
- case other
81
- when Regexp then other =~ name
82
- when String then other.to_sym == name
83
- when Symbol, Browserino::Client then other == name
84
- else false
85
- end
63
+ invertable case other
64
+ when Regexp then other =~ name
65
+ when String then other.to_sym == name
66
+ when Symbol, Client then other == name
67
+ else false
68
+ end
86
69
  end
87
70
 
88
71
  def ==(other)
@@ -98,21 +81,22 @@ module Browserino
98
81
  end
99
82
 
100
83
  def to_json(*args)
101
- @json_cache ||= properties.map do |prop, val|
102
- final = val.is_a?(Version) && val.full || val
103
- [prop, final]
104
- end.to_h.to_json(*args)
84
+ @json ||= properties.each_with_object({}) do |(prop, val), hsh|
85
+ hsh[prop] = val.is_a?(Version) && val.full || val
86
+ end.to_json(*args)
105
87
  end
106
88
 
107
- def to_s
108
- @str_cache ||= %i[name engine platform].map do |prop|
109
- n = properties[prop]
110
- v = version_for prop
111
- l = label_for prop
112
- a = l ? l : [n, (v.major if v > '0.0.0')].join.to_sym
89
+ def label_or_version_name(prop)
90
+ ver = version_for prop
91
+ label_for(prop) || ver && [properties[prop].to_s.strip,
92
+ (ver.major if ver > '0.0.0')].join.strip
93
+ end
113
94
 
114
- [n, a].uniq
115
- end.flatten.uniq.join(' ').gsub(/\s{2,}/, ' ').strip
95
+ def to_s
96
+ @str ||= %i[name engine platform device].each_with_object([]) do |prop, a|
97
+ a << properties[prop].to_s.strip
98
+ a << label_or_version_name(prop)
99
+ end.compact.reject(&:empty?).uniq.join ' '
116
100
  end
117
101
 
118
102
  def to_hash
@@ -130,7 +114,7 @@ module Browserino
130
114
  # scary, I know, but a falsy value is all we need to return if some
131
115
  # property isn't known or true as any property can be defined on the Client
132
116
  def method_missing(_, *__, &___)
133
- nil
117
+ invertable nil
134
118
  end
135
119
 
136
120
  # always respond to missing, read method_missing comment
@@ -138,96 +122,81 @@ module Browserino
138
122
  true
139
123
  end
140
124
 
125
+ # if you wish for a method to respond to the #not method,
126
+ # you'll have to return the result of a function using the `invertable`
127
+ # method as seen in `method_missing` - this will apply the state of the
128
+ # instance variable and invert the state aswell as the result if set,
129
+ # otherwise it will just return the value without touching it
130
+ def not
131
+ @not = true && self
132
+ end
133
+
141
134
  private
142
135
 
143
- def name_for(sym)
144
- mtd = %i[version label].include?(sym) ? :name : "#{sym}_name".to_sym
145
- properties[mtd]
136
+ def invertable(result)
137
+ @not ? @not = false || !result : result
146
138
  end
147
139
 
148
- def label_for(sym)
149
- mtd = %i[version name].include?(sym) ? :label : "#{sym}_label".to_sym
150
- properties[mtd]
140
+ def label_for(sym, from = properties)
141
+ return from[:label] if %i[version label name].include? sym
142
+ from["#{sym}_label".to_sym]
151
143
  end
152
144
 
153
- def version_for(sym)
154
- mtd = %i[label name].include?(sym) ? :version : "#{sym}_version".to_sym
155
- properties[mtd]
145
+ def name_for(sym, from = properties)
146
+ return from[:name] if %i[version label name].include? sym
147
+ from["#{sym}_name".to_sym]
156
148
  end
157
149
 
158
- def get_answer(mtd, res, ver = nil, val = nil)
159
- incl = [res, *Browserino.config.aliasses[res]].include? val
160
- return res.is_a?(Version) ? res > 0 : res && true unless val
161
- ver && incl ? version_for(mtd) == ver : incl
150
+ def version_for(sym, from = properties)
151
+ return from[:version] if %i[version label name].include? sym
152
+ from["#{sym}_version".to_sym]
162
153
  end
163
154
 
164
- def define_simple_methods!(props)
155
+ def generate_preset_methods!(props)
165
156
  props.each do |name, value|
166
- define_singleton_method(name) { value }
167
- define_question_method! name, value
168
- end
169
- end
170
-
171
- def define_question_method!(name, value)
172
- define_singleton_method("#{name}?") do |val = nil, opts = {}|
173
- ver = opts.delete :version
174
- val = val.to_sym if ver
175
- get_answer name, value, ver, val
157
+ methods = [name, *Browserino.config.aliasses[name]]
158
+ methods.each do |mtd|
159
+ define_singleton_method(mtd) { value }
160
+ define_singleton_method("#{mtd}?") do |val = nil|
161
+ return value == val if val
162
+ value && true
163
+ end
164
+ end
176
165
  end
177
166
  end
178
167
 
179
- def define_proc_methods!(props)
168
+ def generate_proc_methods!(props)
180
169
  props.select { |_, val| val.respond_to? :call }.each do |name, value|
181
170
  result = instance_eval(&value)
182
- define_singleton_method(name) { result }
171
+ define_singleton_method(name) { invertable result }
172
+ define_singleton_method("#{name}?") { invertable result && true }
183
173
  end
184
174
  end
185
175
 
186
- def define_name_result_methods!
187
- %i[name engine platform].each do |prop|
188
- result = properties[prop]
189
- ver_res = version_for(prop)
176
+ def generate_result_methods!(info, *property_names)
177
+ property_names.each do |prop|
178
+ ver_res = version_for prop, info
190
179
 
191
- # for each of the props:
192
- # -- define a question method using the value of prop
193
- # (ex: name # => firefox # => "firefox?")
194
- # -- when supplied with a value, check it against {prop_res}_version
195
- # -- when called without argument, return result
196
- define_singleton_method("#{result}?") do |value = nil|
197
- return ver_res == value if value
198
- result && true
199
- end
200
-
201
- # for each of the aliasses found:
202
- # -- define a question method using the current alias
203
- # -- when supplied with a value, check it against {prop_res}_version
204
- # -- when called without argument, return result
205
- Browserino.config.aliasses[result].each do |alt|
206
- define_singleton_method("#{alt}?") do |value = nil|
207
- return ver_res == value if value
208
- result && true
209
- end
210
- end
180
+ create_question! info[prop], version: ver_res, aliasses: true
181
+ create_question! label_for(prop, info), version: ver_res, aliasses: true
211
182
  end
212
183
  end
213
184
 
214
- def define_label_methods!
215
- property_names.select { |name| name =~ /label/i }.each do |prop|
216
- next unless (result = properties[prop])
217
- ver_res = version_for(prop.to_s.split('_').first)
185
+ def create_question!(result, opts = {})
186
+ methods = [result]
187
+ methods += Browserino.config.aliasses[result] if opts[:aliasses]
218
188
 
219
- define_singleton_method("#{result}?") do |value = nil|
220
- return ver_res == value if value
221
- result && true
222
- end
223
-
224
- Browserino.config.aliasses[result].each do |alt|
225
- define_singleton_method("#{alt}?") do |value = nil|
226
- return ver_res == value if value
227
- result && true
228
- end
189
+ methods.each do |mtd|
190
+ define_singleton_method("#{mtd}?") do |val = nil|
191
+ invertable(val ? opts[:version] == val : true)
229
192
  end
230
193
  end
231
194
  end
195
+
196
+ def get_answer(mtd, res, ver = nil, val = nil)
197
+ return res.is_a?(Version) ? res > '0.0.0' : res && true unless val
198
+ incl = res == val
199
+ ver && incl ? version_for(mtd) == ver : incl
200
+ end
232
201
  end
233
202
  end
@@ -4,16 +4,9 @@ module Browserino
4
4
  class Config < Options
5
5
  def define(&block)
6
6
  instance_eval(&block)
7
-
8
- matchers.each do |matcher|
9
- properties << matcher.properties.keys
10
- types << matcher.type
11
- names << matcher.name
7
+ matchers.each_with_object types do |mtch, types_arr|
8
+ types_arr << mtch.type unless types_arr.include?(mtch.type)
12
9
  end
13
-
14
- properties.flatten!.uniq!
15
- types.uniq!
16
- names.uniq!
17
10
  end
18
11
 
19
12
  def label(name, **opts)
@@ -32,11 +25,6 @@ module Browserino
32
25
  end
33
26
 
34
27
  def match(rgxp = nil, **opts, &block)
35
- if rgxp.is_a? Hash
36
- opts = rgxp.dup
37
- rgxp = nil
38
- end
39
-
40
28
  opts = @tmp_defaults.merge opts if @tmp_defaults.is_a? Hash
41
29
 
42
30
  if rgxp && opts[:like]
@@ -69,28 +57,36 @@ module Browserino
69
57
  @tmp_defaults = @preset_store.last
70
58
  end
71
59
 
72
- def like(tmp, opts = {}, &block)
73
- preset opts.merge(like: tmp.to_sym), &block
74
- end
75
-
60
+ # the order of these methods is the same as seen at the top of the
61
+ # definitions/matchers.rb file. It is the current "order" required
62
+ # for Browserino to work properly, maybe tweaking some regexes can lighten
63
+ # this up but it's OK for now.
76
64
  def emails(opts = {}, &block)
77
65
  preset opts.merge(type: :email), &block
78
66
  end
79
67
 
80
- def validators(opts = {}, &block)
81
- preset opts.merge(type: :validator), &block
82
- end
83
-
84
68
  def browsers(opts = {}, &block)
85
69
  preset opts.merge(type: :browser), &block
86
70
  end
87
71
 
72
+ def like(tmp, opts = {}, &block)
73
+ preset opts.merge(like: tmp.to_sym), &block
74
+ end
75
+
76
+ def rss(opts = {}, &block)
77
+ preset opts.merge(type: :rss), &block
78
+ end
79
+
88
80
  def bots(opts = {}, &block)
89
- preset opts.merge(type: :bot), &block
81
+ preset opts.merge(type: :bot, text: true), &block
82
+ end
83
+
84
+ def validators(opts = {}, &block)
85
+ preset opts.merge(type: :validator, text: true), &block
90
86
  end
91
87
 
92
88
  def libraries(opts = {}, &block)
93
- preset opts.merge(type: :library), &block
89
+ preset opts.merge(type: :library, text: true), &block
94
90
  end
95
91
 
96
92
  def with_alias(pattern, **opts, &block)