brauser 3.3.2 → 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.
Files changed (67) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +6 -0
  3. data/.travis-gemfile +4 -5
  4. data/.travis.yml +2 -2
  5. data/CHANGELOG.md +4 -0
  6. data/Gemfile +7 -8
  7. data/README.md +31 -95
  8. data/Rakefile +0 -1
  9. data/brauser.gemspec +4 -4
  10. data/default_definitions/browsers.rb +50 -0
  11. data/default_definitions/languages.rb +118 -0
  12. data/default_definitions/platforms.rb +24 -0
  13. data/doc/Brauser.html +6 -6
  14. data/doc/Brauser/Browser.html +3867 -580
  15. data/doc/Brauser/Definitions.html +537 -0
  16. data/doc/Brauser/Definitions/Base.html +342 -0
  17. data/doc/Brauser/Definitions/Browser.html +1047 -0
  18. data/doc/Brauser/Definitions/Language.html +496 -0
  19. data/doc/Brauser/Definitions/Platform.html +686 -0
  20. data/doc/Brauser/Hooks.html +2 -2
  21. data/doc/Brauser/Hooks/RubyOnRails.html +9 -9
  22. data/doc/Brauser/Parser.html +513 -0
  23. data/doc/Brauser/Value.html +601 -0
  24. data/doc/Brauser/Version.html +5 -5
  25. data/doc/_index.html +25 -108
  26. data/doc/class_list.html +1 -1
  27. data/doc/file.README.html +33 -97
  28. data/doc/index.html +33 -97
  29. data/doc/method_list.html +72 -120
  30. data/doc/top-level-namespace.html +2 -2
  31. data/lib/brauser.rb +13 -15
  32. data/lib/brauser/browser.rb +195 -66
  33. data/lib/brauser/definitions/base.rb +71 -0
  34. data/lib/brauser/definitions/browser.rb +80 -0
  35. data/lib/brauser/definitions/language.rb +29 -0
  36. data/lib/brauser/definitions/platform.rb +42 -0
  37. data/lib/brauser/hooks.rb +1 -2
  38. data/lib/brauser/parser.rb +47 -0
  39. data/lib/brauser/value.rb +39 -0
  40. data/lib/brauser/version.rb +3 -4
  41. data/spec/brauser/browser_spec.rb +73 -564
  42. data/spec/brauser/default_definitions_spec.rb +129 -0
  43. data/spec/brauser/definitions/base_spec.rb +48 -0
  44. data/spec/brauser/definitions/browser_spec.rb +47 -0
  45. data/spec/brauser/definitions/language_spec.rb +18 -0
  46. data/spec/brauser/definitions/platform_spec.rb +36 -0
  47. data/spec/brauser/hooks_spec.rb +5 -6
  48. data/spec/brauser/parser_spec.rb +31 -0
  49. data/spec/brauser/value_spec.rb +34 -0
  50. data/spec/coverage_helper.rb +0 -1
  51. data/spec/spec_helper.rb +0 -1
  52. metadata +50 -23
  53. data/lib/brauser/browseable/attributes.rb +0 -95
  54. data/lib/brauser/browseable/general.rb +0 -104
  55. data/lib/brauser/browseable/parsing.rb +0 -127
  56. data/lib/brauser/browseable/partial_querying.rb +0 -116
  57. data/lib/brauser/browseable/querying.rb +0 -63
  58. data/lib/brauser/browseable/register.rb +0 -73
  59. data/lib/brauser/definition.rb +0 -80
  60. data/lib/brauser/definitions/browsers.rb +0 -68
  61. data/lib/brauser/definitions/languages.rb +0 -130
  62. data/lib/brauser/definitions/platforms.rb +0 -30
  63. data/lib/brauser/query.rb +0 -36
  64. data/lib/brauser/queryable/chainers.rb +0 -56
  65. data/lib/brauser/queryable/queries.rb +0 -60
  66. data/spec/brauser/definition_spec.rb +0 -39
  67. data/spec/brauser/query_spec.rb +0 -111
@@ -0,0 +1,29 @@
1
+ #
2
+ # This file is part of the brauser gem. Copyright (C) 2013 and above Shogun <shogun@cowtech.it>.
3
+ # Licensed under the MIT license, which can be found at http://www.opensource.org/licenses/mit-license.php.
4
+ #
5
+
6
+ module Brauser
7
+ module Definitions
8
+ # A definition of a language.
9
+ #
10
+ # @attribute [r] code
11
+ # @return [String] The language code.
12
+ # @attribute [r] name
13
+ # @return [String] The language name.
14
+ class Language < Base
15
+ attr_reader :code, :name
16
+
17
+ # Creates a new definition.
18
+ #
19
+ # @param code [String] The language code.
20
+ # @param name [String] The language name.
21
+ def initialize(code, name, **_)
22
+ code = code.downcase.gsub("_", "-")
23
+ @id = code.to_sym
24
+ @code = code
25
+ @name = name
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,42 @@
1
+ #
2
+ # This file is part of the brauser gem. Copyright (C) 2013 and above Shogun <shogun@cowtech.it>.
3
+ # Licensed under the MIT license, which can be found at http://www.opensource.org/licenses/mit-license.php.
4
+ #
5
+
6
+ module Brauser
7
+ module Definitions
8
+ # A definition of a platform.
9
+ #
10
+ # @attribute [r] name
11
+ # @return [String] The platform name.
12
+ # @attribute [r] matcher
13
+ # @return [Regexp|Proc] The pattern or the block to recognize the platform.
14
+ class Platform < Base
15
+ attr_reader :name, :matcher
16
+
17
+ # Creates a new definition.
18
+ #
19
+ # @param id [Symbol] The platform id.
20
+ # @param name [String] The platform name.
21
+ # @param matcher [Regexp|Proc] The pattern or the block to recognize the platform. **Ignore if a block is given**
22
+ def initialize(id, name, matcher = /.*/, **_, &block)
23
+ @id = id
24
+ @name = name
25
+ @matcher = block ? block : matcher
26
+ end
27
+
28
+ # Matches against an header.
29
+ #
30
+ # @param header [String] The header to match.
31
+ # @param engine [Symbol] The engine to match.
32
+ # @return [Boolean|NilClass] True if match succeeded, `false` or `nil` otherwise.
33
+ def match(header, engine)
34
+ if @matcher.is_a?(Regexp)
35
+ @matcher.match(header)
36
+ else
37
+ @matcher.call(header, engine)
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -1,4 +1,3 @@
1
- # encoding: utf-8
2
1
  #
3
2
  # This file is part of the brauser gem. Copyright (C) 2013 and above Shogun <shogun@cowtech.it>.
4
3
  # Licensed under the MIT license, which can be found at http://www.opensource.org/licenses/mit-license.php.
@@ -22,7 +21,7 @@ module Brauser
22
21
  # @return [Browser] The detected browser.
23
22
  def browser(force = false)
24
23
  @browser = nil if force
25
- @browser ||= Browser.new(request.headers["User-Agent"], request.headers["Accept-Language"])
24
+ @browser ||= ::Brauser::Browser.new(request.headers["User-Agent"], request.headers["Accept-Language"])
26
25
  end
27
26
  end
28
27
  end
@@ -0,0 +1,47 @@
1
+ #
2
+ # This file is part of the brauser gem. Copyright (C) 2013 and above Shogun <shogun@cowtech.it>.
3
+ # Licensed under the MIT license, which can be found at http://www.opensource.org/licenses/mit-license.php.
4
+ #
5
+
6
+ module Brauser
7
+ # A parser for the HTTP headers.
8
+ class Parser
9
+ # Makes sure a subject matches a pattern AND NOT another pattern.
10
+ #
11
+ # @param subject [String] The subject to match.
12
+ # @param positive_matcher [Regexp] The expression to match.
13
+ # @param negative_matcher [Regexp] The expression NOT to match.
14
+ # @return [Boolean] `true` if matching succeeded, `false otherwise`.
15
+ def self.disambiguate(subject, positive_matcher, negative_matcher)
16
+ subject =~ positive_matcher && subject !~ negative_matcher
17
+ end
18
+
19
+ # Parses the User-Agent header.
20
+ #
21
+ # @param header [String] The User-Agent header.
22
+ # @return [Array|NilClass] An array of engine, version and platform if the match succeeded, `nil` otherwise.
23
+ def parse_agent(header)
24
+ # First of all match the agent and the version
25
+ catch(:result) {
26
+ Brauser::Definitions.browsers.each do |_, definition|
27
+ result = definition.match(header)
28
+ throw(:result, result) if result
29
+ end
30
+
31
+ nil
32
+ }
33
+ end
34
+
35
+ # Parses a Accept-Language header.
36
+ #
37
+ # @param header [String] The Accept-Language header.
38
+ # @return [Hash] The list of accepted languages with their priorities.
39
+ def parse_accept_language(header)
40
+ header.ensure_string.tokenize.reduce({}) { |rv, token|
41
+ code, priority = token.split(";q=")
42
+ rv[code.downcase.gsub("_", "-").to_sym] = priority.to_float if code && priority
43
+ rv
44
+ }
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,39 @@
1
+ #
2
+ # This file is part of the brauser gem. Copyright (C) 2013 and above Shogun <shogun@cowtech.it>.
3
+ # Licensed under the MIT license, which can be found at http://www.opensource.org/licenses/mit-license.php.
4
+ #
5
+
6
+ module Brauser
7
+ # A defined entity, which supports comparison against a single or multiple values.
8
+ #
9
+ # @attribute [r] value
10
+ # @return [Object] The wrapped value.
11
+ class Value
12
+ attr_reader :value
13
+ delegate :to_s, :inspect, to: :value
14
+
15
+ # Creates a new value
16
+ #
17
+ # @param value [Object] The wrapped value.
18
+ def initialize(value)
19
+ @value = value
20
+ end
21
+
22
+ # Check if an object is equal to another object or if it is contained in a list of objects.
23
+ #
24
+ # @param other [Array|Object] The other object to match.
25
+ # @return [Boolean] `true` if the current object is either equal or contained in the other object, `false` otherwise.
26
+ def ==(other)
27
+ other.is_a?(Array) ? other.include?(@value) : (@value == other)
28
+ end
29
+
30
+ # Delegates all the other values to the wrapped value.
31
+ #
32
+ # @param method [Symbol] The method to call.
33
+ # @param args [Array] The arguments to pass to the method.
34
+ # @param block [Proc] The block to pass to the method.
35
+ def method_missing(method, *args, &block)
36
+ @value.send(method, *args, &block)
37
+ end
38
+ end
39
+ end
@@ -1,4 +1,3 @@
1
- # encoding: utf-8
2
1
  #
3
2
  # This file is part of the brauser gem. Copyright (C) 2013 and above Shogun <shogun@cowtech.it>.
4
3
  # Licensed under the MIT license, which can be found at http://www.opensource.org/licenses/mit-license.php.
@@ -11,13 +10,13 @@ module Brauser
11
10
  # @see http://semver.org
12
11
  module Version
13
12
  # The major version.
14
- MAJOR = 3
13
+ MAJOR = 4
15
14
 
16
15
  # The minor version.
17
- MINOR = 3
16
+ MINOR = 0
18
17
 
19
18
  # The patch version.
20
- PATCH = 2
19
+ PATCH = 0
21
20
 
22
21
  # The current version of brauser.
23
22
  STRING = [MAJOR, MINOR, PATCH].compact.join(".")
@@ -1,4 +1,3 @@
1
- # encoding: utf-8
2
1
  #
3
2
  # This file is part of the brauser gem. Copyright (C) 2013 and above Shogun <shogun@cowtech.it>.
4
3
  # Licensed under the MIT license, which can be found at http://www.opensource.org/licenses/mit-license.php.
@@ -7,599 +6,109 @@
7
6
  require "spec_helper"
8
7
 
9
8
  describe Brauser::Browser do
10
- let(:browser){::Brauser::Browser.new}
9
+ subject {
10
+ Brauser::Browser.new(
11
+ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.82 Safari/537.1",
12
+ "IT;q=0.7, EN;q=0.3"
13
+ )
14
+ }
11
15
 
12
- describe ".add" do
13
- it "should return false and not add any value when the type is invalid" do
14
- definitions = ::Brauser::Browser.instance_variable_get("@definitions")
15
-
16
- expect(::Brauser::Browser.add(:none, nil)).to be_false
17
- expect(definitions).to be_nil
18
- end
19
-
20
- it "add the definition to the right hash" do
21
- ::Brauser::Browser.instance_variable_set("@definitions", nil)
22
- definition = ::Brauser::Definition.new(:tag)
23
-
24
- expect(::Brauser::Browser.add(:platforms, definition)).to be_true
25
- definitions = ::Brauser::Browser.instance_variable_get("@definitions")
26
- expect(definitions[:platforms][:tag]).to be(definition)
27
- end
28
-
29
- it "support adding more definitions in one call" do
30
- ::Brauser::Browser.instance_variable_set("@definitions", nil)
31
- expect(::Brauser::Browser.add(:platforms, [::Brauser::Definition.new(:tag1), ::Brauser::Definition.new(:tag2)])).to be_true
32
- definitions = ::Brauser::Browser.instance_variable_get("@definitions")
33
- expect(definitions[:platforms].length).to eq(2)
34
- end
35
- end
36
-
37
- describe ".add_default_browsers" do
38
- it "should call .add" do
39
- expect(::Brauser::Browser).to receive(:add).with(:browsers, an_instance_of(Array)).and_call_original
40
- ::Brauser::Browser.add_default_browsers
41
- end
42
-
43
- it "should return a good return code" do
44
- expect(::Brauser::Browser.add_default_browsers).to be_true
45
-
46
- allow(::Brauser::Browser).to receive(:add).and_return(false)
47
- expect(::Brauser::Browser.add_default_browsers).to be_false
48
- end
49
- end
50
-
51
- describe ".add_default_platforms" do
52
- it "should call .add" do
53
- expect(::Brauser::Browser).to receive(:add).with(:platforms, an_instance_of(Array))
54
- ::Brauser::Browser.add_default_platforms
55
- end
56
-
57
- it "should return a good return code" do
58
- expect(::Brauser::Browser.add_default_platforms).to be_true
59
-
60
- allow(::Brauser::Browser).to receive(:add).and_return(false)
61
- expect(::Brauser::Browser.add_default_platforms).to be_false
62
- end
63
- end
64
-
65
- describe ".add_default_languages" do
66
- it "should call .add" do
67
- expect(::Brauser::Browser).to receive(:add).with(:languages, an_instance_of(Array))
68
- ::Brauser::Browser.add_default_languages
69
- end
70
-
71
- it "should return a good return code" do
72
- expect(::Brauser::Browser.add_default_languages).to be_true
73
-
74
- allow(::Brauser::Browser).to receive(:add).and_return(false)
75
- expect(::Brauser::Browser.add_default_languages).to be_false
76
- end
77
- end
78
-
79
- describe ".browsers" do
80
- it "should return the list of browsers" do
81
- ::Brauser::Browser.add_default_browsers
82
-
83
- expect(::Brauser::Browser.browsers).to be_a(Hash)
84
- expect(::Brauser::Browser.browsers[:chrome]).to be_a(::Brauser::Definition)
85
- expect(::Brauser::Browser.browsers[:chrome].label).to eq("Google Chrome")
86
- end
87
- end
88
-
89
- describe ".platforms" do
90
- it "should return the list of platforms" do
91
- ::Brauser::Browser.add_default_platforms
92
-
93
- expect(::Brauser::Browser.platforms).to be_a(Hash)
94
- expect(::Brauser::Browser.platforms[:osx]).to be_a(::Brauser::Definition)
95
- expect(::Brauser::Browser.platforms[:osx].label).to eq("Apple MacOS X")
96
- end
97
- end
98
-
99
- describe ".languages" do
100
- it "should return the list of languages" do
101
- ::Brauser::Browser.add_default_languages
102
-
103
- expect(::Brauser::Browser.languages).to be_a(Hash)
104
- expect(::Brauser::Browser.languages["it"]).to be_a(::Brauser::Definition)
105
- expect(::Brauser::Browser.languages["it"].label).to eq("Italian")
106
- end
107
- end
108
-
109
- describe ".compare_versions" do
110
- it "should correctly compare versions" do
111
- expect(::Brauser::Browser.compare_versions(nil, :eq, nil)).to be_false
112
-
113
- expect(::Brauser::Browser.compare_versions("3", :eq, nil)).to be_false
114
- expect(::Brauser::Browser.compare_versions("3", :eq, "7")).to be_false
115
- expect(::Brauser::Browser.compare_versions("7.1", :eq, "7")).to be_false
116
- expect(::Brauser::Browser.compare_versions("7.1.2", :eq, "7.1.2")).to be_true
117
-
118
- expect(::Brauser::Browser.compare_versions("3", :lt, "3")).to be_false
119
- expect(::Brauser::Browser.compare_versions("3", :lt, "3.4")).to be_true
120
- expect(::Brauser::Browser.compare_versions("3.4.5", :lt, "3.4.5")).to be_false
121
- expect(::Brauser::Browser.compare_versions("3.4.5", :lt, "3.2")).to be_false
122
- expect(::Brauser::Browser.compare_versions("3.4.5", :lt, "3.4.6")).to be_true
123
- expect(::Brauser::Browser.compare_versions("3.4.beta", :lt, "3.4")).to be_true
124
- expect(::Brauser::Browser.compare_versions("3.4.alpha", :lt, "3.4beta")).to be_true
125
-
126
- expect(::Brauser::Browser.compare_versions("3", :lte, "3")).to be_true
127
- expect(::Brauser::Browser.compare_versions("3", :lte, "3.4")).to be_true
128
- expect(::Brauser::Browser.compare_versions("4", :lte, "3.4")).to be_false
129
- expect(::Brauser::Browser.compare_versions("4.1", :lte, "3.4")).to be_false
130
- expect(::Brauser::Browser.compare_versions("3.4.5", :lte, "3.4.5")).to be_true
131
- expect(::Brauser::Browser.compare_versions("3.4.5", :lte, "3.4.4")).to be_false
132
- expect(::Brauser::Browser.compare_versions("3.4.5", :lt, "3.2")).to be_false
133
- expect(::Brauser::Browser.compare_versions("3.4.beta", :lte, "3.4")).to be_true
134
-
135
- expect(::Brauser::Browser.compare_versions("3", :gt, "3")).to be_false
136
- expect(::Brauser::Browser.compare_versions("3", :gt, "3.4")).to be_false
137
- expect(::Brauser::Browser.compare_versions("3.4.5", :gt, "3.4.3")).to be_true
138
- expect(::Brauser::Browser.compare_versions("3.4.5", :gt, "3.4.5")).to be_false
139
- expect(::Brauser::Browser.compare_versions("3.4.5", :gt, "3.4.6")).to be_false
140
- expect(::Brauser::Browser.compare_versions("3.5", :gt, "3")).to be_true
141
- expect(::Brauser::Browser.compare_versions("3.4.beta", :gt, "3.4")).to be_false
142
- expect(::Brauser::Browser.compare_versions("3.4.alpha", :gt, "3.4beta")).to be_false
143
-
144
- expect(::Brauser::Browser.compare_versions("3", :gte, "3")).to be_true
145
- expect(::Brauser::Browser.compare_versions("3", :gte, "3.4")).to be_false
146
- expect(::Brauser::Browser.compare_versions("4", :gte, "3.4")).to be_true
147
- expect(::Brauser::Browser.compare_versions("4.1", :gte, "3.4")).to be_true
148
- expect(::Brauser::Browser.compare_versions("3.4.5", :gte, "3.4.5")).to be_true
149
- expect(::Brauser::Browser.compare_versions("3.4.5", :gte, "3.4.4")).to be_true
150
- expect(::Brauser::Browser.compare_versions("3.4.beta", :gte, "3.4")).to be_false
151
- expect(::Brauser::Browser.compare_versions("3.5", :gt, "3")).to be_true
152
- end
153
- end
154
-
155
- describe "#readable_name" do
156
- before(:each) do
157
- ::Brauser::Browser.add_default_browsers
158
- end
159
-
160
- it "should return the correct name" do
161
- browser.name = :msie
162
- expect(browser.readable_name).to eq("Microsoft Internet Explorer")
163
-
164
- browser.name = :chrome
165
- expect(browser.readable_name).to eq("Google Chrome")
166
- end
167
-
168
- it "should return a default name" do
169
- browser.name = :none
170
- expect(browser.readable_name).to eq("Unknown Browser")
171
- end
172
- end
173
-
174
- describe "#platform_name" do
175
- before(:each) do
176
- ::Brauser::Browser.add_default_platforms
177
- end
178
-
179
- it "should return the correct name" do
180
- browser.platform = :windows
181
- expect(browser.platform_name).to eq("Microsoft Windows")
182
-
183
- browser.platform = :ios
184
- expect(browser.platform_name).to eq("Apple iOS")
185
- end
186
-
187
- it "should return a default name" do
188
- browser.platform = :none
189
- expect(browser.platform_name).to eq("Unknown Platform")
16
+ describe "#initialize" do
17
+ it "should save agent and language, then call #parse" do
18
+ expect_any_instance_of(::Brauser::Browser).to receive(:parse)
19
+ subject = ::Brauser::Browser.new("AGENT", "LANGUAGE")
20
+ expect(subject.agent).to eq("AGENT")
21
+ expect(subject.accept_language).to eq("LANGUAGE")
190
22
  end
191
23
  end
192
24
 
193
25
  describe "#classes" do
194
- before(:each) do
195
- browser.name = :chrome
196
- browser.version = "1.2.A.4"
197
- browser.platform = :osx
26
+ it "should return CSS compatible version of the classes" do
27
+ expect(subject.classes).to eq("chrome version-21 version-21_0 version-21_0_1180 version-21_0_1180_82 version-21_0_1180_82_final version-21_0_1180_82_final_0 version-21_0_1180_82_final_0_0 platform-osx")
198
28
  end
199
29
 
200
- it "should return requested classes" do
201
- expect(browser.classes(false)).to eq(["chrome", "version-1", "version-1_2", "version-1_2_A", "version-1_2_A_4", "platform-osx"])
202
- expect(browser.classes(false, "name-")).to eq(["name-chrome", "version-1", "version-1_2", "version-1_2_A", "version-1_2_A_4", "platform-osx"])
203
- expect(browser.classes(false, true, "v-")).to eq(["chrome", "v-1", "v-1_2", "v-1_2_A", "v-1_2_A_4", "platform-osx"])
204
- expect(browser.classes(false, true, true, "p-")).to eq(["chrome", "version-1", "version-1_2", "version-1_2_A", "version-1_2_A_4", "p-osx"])
205
- expect(browser.classes(false, false)).to eq(["version-1", "version-1_2", "version-1_2_A", "version-1_2_A_4", "platform-osx"])
206
- expect(browser.classes(false, true, false)).to eq(["chrome", "platform-osx"])
207
- expect(browser.classes(false, true, true, false)).to eq(["chrome", "version-1", "version-1_2", "version-1_2_A", "version-1_2_A_4"])
30
+ it "should return results as an array" do
31
+ expect(subject.classes(nil)).to eq(["chrome", "version-21", "version-21_0", "version-21_0_1180", "version-21_0_1180_82", "version-21_0_1180_82_final", "version-21_0_1180_82_final_0", "version-21_0_1180_82_final_0_0", "platform-osx"])
208
32
  end
209
33
 
210
- it "should return as a string" do
211
- expect(browser.classes).to eq("chrome version-1 version-1_2 version-1_2_A version-1_2_A_4 platform-osx")
212
- expect(browser.classes("@")).to eq("chrome@version-1@version-1_2@version-1_2_A@version-1_2_A_4@platform-osx")
34
+ it "should use prefixes" do
35
+ expect(subject.classes(name: "NAME-")).to eq("NAME-chrome version-21 version-21_0 version-21_0_1180 version-21_0_1180_82 version-21_0_1180_82_final version-21_0_1180_82_final_0 version-21_0_1180_82_final_0_0 platform-osx")
36
+ expect(subject.classes(version: "VERSION-")).to eq("chrome VERSION-21 VERSION-21_0 VERSION-21_0_1180 VERSION-21_0_1180_82 VERSION-21_0_1180_82_final VERSION-21_0_1180_82_final_0 VERSION-21_0_1180_82_final_0_0 platform-osx")
37
+ expect(subject.classes(platform: "PLATFORM-")).to eq("chrome version-21 version-21_0 version-21_0_1180 version-21_0_1180_82 version-21_0_1180_82_final version-21_0_1180_82_final_0 version-21_0_1180_82_final_0_0 PLATFORM-osx")
213
38
  end
214
39
 
215
- it "should handle msie compatibility" do
216
- browser.name = :msie_compatibility
217
- expect(browser.classes(false, true, false, false)).to eq(["msie_compatibility", "msie"])
218
- end
219
-
220
- it "should transform name" do
221
- expect(browser.classes(" ", true, false, false) { |name, *| name.to_s.upcase }).to eq("CHROME")
40
+ it "should skip unwanted parts" do
41
+ expect(subject.classes(version: nil)).to eq("chrome platform-osx")
42
+ expect(subject.classes(platform: nil)).to eq("chrome version-21 version-21_0 version-21_0_1180 version-21_0_1180_82 version-21_0_1180_82_final version-21_0_1180_82_final_0 version-21_0_1180_82_final_0_0")
222
43
  end
223
44
  end
224
45
 
225
- describe "#parse_agent" do
226
- def recognize(agent = nil, only_rv = false)
227
- if agent.present? then
228
- rv = browser.parse_agent(agent)
229
- !only_rv ? [browser.name, browser.version, browser.platform] : rv
230
- else
231
- only_rv ? true : []
232
- end
233
- end
234
-
235
- it "should return true for known names" do
236
- expect(recognize("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.82 Safari/537.1", true)).to be_true
237
- expect(recognize("Mozilla/5.0 (Windows NT 6.1; rv:15.0) Gecko/20120716 Firefox/15.0a2", true)).to be_true
238
- end
239
-
240
- it "should return false for unknown names" do
241
- expect(recognize("UNKNOWN", true)).to be_false
242
- end
243
-
244
- it "should detect the correct name, version and platform" do
245
- # Google Chrome
246
- expect(recognize("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.82 Safari/537.1")).to eq([:chrome, "21.0.1180.82", :osx])
247
- expect(recognize("Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5")).to eq([:chrome, "19.0.1084.9", :linux])
248
- expect(recognize("Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.215 Safari/535.1")).to eq([:chrome, "13.0.782.215", :windows])
249
-
250
- # Mozilla Firefox
251
- expect(recognize("Mozilla/5.0 (Windows NT 6.1; rv:15.0) Gecko/20120716 Firefox/15.0a2")).to eq([:firefox, "15.0a2", :windows])
252
- expect(recognize("Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:14.0) Gecko/20100101 Firefox/14.0.1")).to eq([:firefox, "14.0.1", :linux])
253
- expect(recognize("Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0b8) Gecko/20100101 Firefox/4.0b8")).to eq([:firefox, "4.0b8", :osx])
254
-
255
- # Apple Safari
256
- expect(recognize("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10")).to eq([:safari, "5.1.3", :osx])
257
- expect(recognize("Mozilla/5.0 (Windows; U; Windows NT 5.0; en-en) AppleWebKit/533.16 (KHTML, like Gecko) Version/4.1 Safari/533.16")).to eq([:safari, "4.1", :windows])
258
-
259
- # Opera Mobile
260
- expect(recognize("Opera/9.80 (Android 2.3.3; Linux; Opera Mobi/ADR-1111101157; U; es-ES) Presto/2.9.201 Version/11.50")).to eq([:opera_mobile, "11.50", :android])
261
- expect(recognize("Mozilla/5.0 (S60; SymbOS; Opera Mobi/SYB-1103211396; U; es-LA; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 11.00")).to eq([:opera_mobile, "11.00", :symbian])
262
-
263
- # Opera
264
- expect(recognize("Opera/9.80 (Windows NT 6.1; U; es-ES) Presto/2.9.181 Version/12.00")).to eq([:opera, "12.00", :windows])
265
- expect(recognize("Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.1) Gecko/20061208 Firefox/5.0 Opera 11.11")).to eq([:opera, "11.11", :windows])
266
- expect(recognize("Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52")).to eq([:opera, "11.52", :osx])
267
- expect(recognize("Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; de) Opera 11.51")).to eq([:opera, "11.51", :windows])
268
-
269
- # Microsoft Internet Explorer in compatibility view
270
- expect(recognize("Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/6.0)")).to eq([:msie_compatibility, "10.0", :windows])
271
- expect(recognize("Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; .NET CLR 1.1.4322; .NET4.0C; Tablet PC 2.0)")).to eq([:msie_compatibility, "9.0", :windows])
272
- expect(recognize("Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Zune 3.0)")).to eq([:msie_compatibility, "8.0", :windows])
273
-
274
- # Microsoft Internet Explorer
275
- expect(recognize("Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko")).to eq([:msie, "11.0", :windows])
276
- expect(recognize("Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64;0)")).to eq([:msie, "10.0", :windows])
277
- expect(recognize("Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; .NET CLR 1.1.4322; .NET4.0C; Tablet PC 2.0)")).to eq([:msie, "9.0", :windows])
278
- expect(recognize("Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Zune 3.0)")).to eq([:msie, "8.0", :windows])
279
- expect(recognize("Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 6.0; fr-FR)")).to eq([:msie, "7.0", :windows])
280
- expect(recognize("Mozilla/4.01 (compatible; MSIE 6.0; Windows NT 5.1)")).to eq([:msie, "6.0", :windows])
281
-
282
- # Netscape
283
- expect(recognize("Mozilla/5.0 (Windows; U; Win 9x 4.90; SG; rv:1.9.2.4) Gecko/20101104 Netscape/9.1.0285")).to eq([:netscape, "9.1.0285", :windows])
284
- expect(recognize("Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.8pre) Gecko/20071001 Firefox/2.0.0.7 Navigator/9.0RC1")).to eq([:netscape, "9.0RC1", :osx])
285
-
286
- # Chrome IOS
287
- expect(recognize("Mozilla/5.0 (iPhone; U; CPU iPhone OS 5_1_1 like Mac OS X; en-gb) AppleWebKit/534.46.0 (KHTML, like Gecko) CriOS/19.0.1084.60 Mobile/9B206 Safari/7534.48.3")).to eq([:chrome_ios, "19.0.1084.60", :ios])
288
- expect(recognize("Mozilla/5.0 (iPad; U; CPU iPhone OS 5_1_1 like Mac OS X; en-gb) AppleWebKit/534.46.0 (KHTML, like Gecko) CriOS/21.0.1180.82 Safari/536.5")).to eq([:chrome_ios, "21.0.1180.82", :ios])
289
-
290
- # Apple iPhone
291
- expect(recognize("Mozilla/5.0 (iPhone; U; fr; CPU iPhone OS 4_2_1 like Mac OS X; fr) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148a Safari/6533.18.5")).to eq([:iphone, "5.0.2", :ios])
292
- expect(recognize("Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_1 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8B5097d Safari/6531.22.7")).to eq([:iphone, "4.0.5", :ios])
293
-
294
- # Apple iPad
295
- expect(recognize("Mozilla/5.0 (iPad; CPU OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko ) Version/5.1 Mobile/9B176 Safari/7534.48.3")).to eq([:ipad, "5.1", :ios])
296
- expect(recognize("Mozilla/5.0 (iPad; U; CPU OS 4_3 like Mac OS X; nl-nl) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8F190 Safari/6533.18.5")).to eq([:ipad, "5.0.2", :ios])
297
-
298
- # Apple iPod Touch
299
- expect(recognize("Mozilla/5.0 (iPod; U; CPU iPhone OS 4_3_3 like Mac OS X; ja-jp) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5")).to eq([:ipod, "5.0.2", :ios])
300
- expect(recognize("Mozilla/5.0 (iPod; U; CPU iPhone OS 3_0 like Mac OS X; ja-jp) AppleWebKit/528.18 (KHTML, like Gecko) Version/4.0 Mobile/7A341 Safari/528.16")).to eq([:ipod, "4.0", :ios])
301
-
302
- # Android
303
- expect(recognize("Mozilla/5.0 (Linux; U; Android 4.0.3; ko-kr; LG-L160L Build/IML74K) AppleWebkit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30")).to eq([:android, "4.0.3", :android])
304
- expect(recognize("Mozilla/5.0 (Linux; U; Android 2.3.3; en-us; HTC_DesireS_S510e Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1")).to eq([:android, "2.3.3", :android])
305
-
306
- # RIM Blackberry
307
- expect(recognize("Mozilla/5.0 (BlackBerry; U; BlackBerry 9900; en) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.1.0.346 Mobile Safari/534.11+")).to eq([:blackberry, "7.1.0.346", :blackberry])
308
- expect(recognize("Mozilla/5.0 (BlackBerry; U; BlackBerry 9700; pt) AppleWebKit/534.8+ (KHTML, like Gecko) Version/6.0.0.546 Mobile Safari/534.8+")).to eq([:blackberry, "6.0.0.546", :blackberry])
309
-
310
- # Windows Phone
311
- expect(recognize("Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; SGH-i917)")).to eq([:windows_phone, "9.0", :windows_phone])
312
- expect(recognize("Mozilla/4.0 (compatible; MSIE 7.0; Windows Phone OS 7.0; Trident/3.1; IEMobile/7.0; DELL; Venue Pro")).to eq([:windows_phone, "7.0", :windows_phone])
313
-
314
- # Symbian
315
- expect(recognize("Mozilla/5.0 (SymbianOS/9.4; Series60/5.0 NokiaC6-00/20.0.042; Profile/MIDP-2.1 Configuration/CLDC-1.1; zh-hk) AppleWebKit/525 (KHTML, like Gecko) BrowserNG/7.2.6.9 3gpp-gba")).to eq([:mobile, "7.2.6.9", :symbian])
316
-
317
- # Amazon Kindle
318
- expect(recognize("Mozilla/4.0 (compatible; Linux 2.6.22) NetFront/3.4 Kindle/2.0 (screen 600x800)")).to eq([:kindle, "2.0", :kindle])
319
- expect(recognize("Mozilla/4.0 (compatible; Linux 2.6.10) NetFront/3.3 Kindle/1.0 (screen 600x800)")).to eq([:kindle, "1.0", :kindle])
320
-
321
- # Sony Playstation Portable
322
- expect(recognize("PSP (PlayStation Portable); 2.00")).to eq([:psp, "2.00", :psp])
323
- expect(recognize("Mozilla/4.0 (PSP (PlayStation Portable); 2.00)")).to eq([:psp, "2.00", :psp])
324
-
325
- # Sony Playstation 3
326
- expect(recognize("Mozilla/5.0 (PLAYSTATION 3; 3.55)")).to eq([:ps3, "3.55", :ps3])
327
- expect(recognize("Mozilla/5.0 (PLAYSTATION 3; 1.70)")).to eq([:ps3, "1.70", :ps3])
328
-
329
- # Nintendo Wii
330
- expect(recognize("Opera/9.30 (Nintendo Wii; U; ; 2071; Wii Shop Channel/1.0; en)")).to eq([:opera, "2071", :wii])
331
- expect(recognize("Opera/9.30 (Nintendo Wii; U; ; 2047-7;pt-br)")).to eq([:opera, "2047", :wii])
332
-
333
- # Mobile browsers
334
- expect(recognize("Mozilla/4.0 (compatible; MSIE 4.01; Windows CE; Sprint;PPC-i830; PPC; 240x320)")).to eq([:mobile, "4.0", :windows])
335
-
336
- # Generic Webkit
337
- expect(recognize("Midori/0.2.0 (X11; Linux i686; U; de-de) WebKit/531.2+")).to eq([:webkit, "531.2", :linux])
338
- expect(recognize("Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; de-de) AppleWebKit/531.21.8 (KHTML, like Gecko) NetNewsWire/3.2.3")).to eq([:webkit, "531.21.8", :osx])
339
-
340
- # Generic Gecko
341
- expect(recognize("Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9a3pre) Gecko/20070330")).to eq([:gecko, "1.9a3pre", :linux])
342
- expect(recognize("Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.9.2a1pre) Gecko")).to eq([:gecko, "1.9.2a1pre", :windows])
343
-
344
- # QuickTime
345
- expect(recognize("QuickTime/7.6.2 (qtver=7.6.2;os=Windows NT 5.1Service Pack 3)")).to eq([:quicktime, "7.6.2", :windows])
346
- expect(recognize("QuickTime/7.6 (qtver=7.6;cpu=IA32;os=Mac 10,5,7)")).to eq([:quicktime, "7.6", :osx])
347
-
348
- # CoreMedia
349
- expect(recognize("Apple iPhone v1.1.1 CoreMedia v1.0.0.3A110a")).to eq([:coremedia, "1.0.0.3A110a", :ios])
350
- expect(recognize("Apple Mac OS X v10.6.6 CoreMedia v1.0.0.10J567")).to eq([:coremedia, "1.0.0.10J567", :osx])
351
-
352
- # Generic
353
- browser.class.add(:browsers, ::Brauser::Definition.new(:generic, "NAME", "NAME", "NAME"))
354
- browser.class.add(:platforms, ::Brauser::Definition.new(:generic, "NAME", "NAME"))
355
- expect(recognize("NAME")).to eq([:generic, "NAME", :generic])
356
- end
357
- end
358
-
359
- describe "#parse_accept_language" do
360
- it "should parse languages" do
361
- expect(browser.parse_accept_language).to eq([])
362
- expect(browser.parse_accept_language(nil)).to eq([])
363
- expect(browser.parse_accept_language("IT")).to eq(["it"])
364
- expect(browser.parse_accept_language("IT;q=0.7, EN;q=0.3")).to eq(["it", "en"])
365
- expect(browser.parse_accept_language("It;q=0.7, eN;q=0.3")).to eq(["it", "en"])
366
- expect(browser.parse_accept_language("IT;q=0.7, ")).to eq(["it"])
367
- end
368
- end
369
-
370
- describe "#is" do
371
- it "should at first call #parse_agent" do
372
- browser.name = nil
373
- expect(browser).to receive(:parse_agent)
374
- browser.is
375
- end
376
-
377
- it "should recognized names" do
378
- browser.name = :chrome
379
- expect(browser.is.result).to be_true
380
- expect(browser.is(:chrome).result).to be_true
381
- expect(browser.is(:capable).result).to be_true
382
-
383
- browser.name = :ipad
384
- expect(browser.is([:tablet, :blackberry]).result).to be_true
385
-
386
- browser.name = :msie
387
- browser.version = "7.0"
388
- expect(browser.is(:capable).result).to be_false
389
- browser.version = "9.0"
390
- expect(browser.is(:capable).result).to be_true
391
-
392
- expect(browser).to receive(:version?).exactly(2).and_call_original
393
- expect(browser).to receive(:on?).and_call_original
394
- expect(browser.is(:capable, {gte: 8}).result).to be_true
395
- browser.platform = :windows
396
-
397
- expect(browser.is(:capable, {gt: 7}, [:windows]).result).to be_true
46
+ describe "#accepts?" do
47
+ it "should return whether the browser accept at least one of the languages" do
48
+ expect(subject.accepts?("IT")).to be_truthy
49
+ expect(subject.accepts?("IT", :en)).to be_truthy
50
+ expect(subject.accepts?("ES", :de)).to be_falsey
51
+ expect(subject.accepts?).to be_falsey
398
52
  end
399
53
  end
400
54
 
401
55
  describe "#is?" do
402
- it "should call the query and then fetch the result" do
403
- browser.name = :msie
404
-
405
- expect(browser).to receive("is").exactly(2).and_call_original
406
-
407
- expect(browser.is?(:chrome)).to be_false
408
- expect(browser.is?(:msie)).to be_true
409
- end
410
- end
411
-
412
- describe "#version" do
413
- it "should at first call #parse_agent" do
414
- browser.version = nil
415
- expect(browser).to receive(:parse_agent)
416
- browser.v
417
- end
418
-
419
- it "should return the version if called without arguments" do
420
- browser.version = "3.4.5"
421
- expect(browser.version).to eq("3.4.5")
422
- end
423
-
424
- it "should compare browser versions" do
425
- browser.version = "3.4.5"
426
-
427
- expect(browser.version(lt: 7).result).to be_true
428
- expect(browser.version(lte: 3).result).to be_false
429
- expect(browser.version(eq: 3).result).to be_false
430
- expect(browser.version(gte: 3).result).to be_true
431
- expect(browser.version(gt: 4).result).to be_false
432
- expect(browser.version(gt: 3.5).result).to be_false
433
- expect(browser.version(foo: "3").result).to be_false
434
- expect(browser.v(">= 3.5").result).to be_false
435
- expect(browser.v("< 7 && > 3").result).to be_true
436
- expect(browser.v("< 7 && > 3 && FOO NO").result).to be_true
437
- expect(browser.v("<= 7 && >= 3 && FOO NO").result).to be_true
438
- expect(browser.v("= 7 && == 3 && FOO NO").result).to be_false
439
- end
440
- end
441
-
442
- describe "#version?" do
443
- it "should call the query and then fetch the result" do
444
- browser.version = "7.0"
445
- expect(browser.version?(">= 8")).to be_false
446
- expect(browser.v?(">= 7")).to be_true
447
- end
448
- end
449
-
450
- describe "#on" do
451
- it "should at first call #parse_agent" do
452
- browser.platform = nil
453
- expect(browser).to receive(:parse_agent)
454
- browser.on
455
- end
456
-
457
- it "should detect platforms" do
458
- browser.platform = :windows
459
- expect(browser.on.result).to be_true
460
- expect(browser.on(:windows).result).to be_true
461
- expect(browser.on([:osx, :linux]).result).to be_false
462
- end
463
- end
464
-
465
- describe "#on?" do
466
- it "should call the query and then fetch the result" do
467
- browser.platform = :windows
468
-
469
- expect(browser).to receive("on").exactly(2).and_call_original
470
-
471
- expect(browser.on?(:osx)).to be_false
472
- expect(browser.on?(:windows)).to be_true
473
- end
474
- end
475
-
476
- describe "#accepts" do
477
- it "should at first call #parse_accept_language" do
478
- browser.languages = nil
479
- expect(browser).to receive(:parse_accept_language)
480
- browser.accepts
481
- end
482
-
483
- it "should detect languages" do
484
- browser.languages = []
485
- expect(browser.accepts.result).to be_false
486
- expect(browser.accepts("it").result).to be_false
487
- expect(browser.accepts(["it", "en"]).result).to be_false
488
-
489
- browser.languages = ["it", "en"]
490
- expect(browser.accepts(nil).result).to be_false
491
- expect(browser.accepts([]).result).to be_false
492
- expect(browser.accepts("it").result).to be_true
493
- expect(browser.accepts(["it", "en"]).result).to be_true
494
- expect(browser.accepts(["it", "es"]).result).to be_true
495
- expect(browser.accepts(["es", "en"]).result).to be_true
496
- expect(browser.accepts("es").result).to be_false
497
- expect(browser.accepts(["es", "de"]).result).to be_false
498
- end
499
- end
500
-
501
- describe "#accepts?" do
502
- it "should call the query and then fetch the result" do
503
- browser.languages = ["it"]
56
+ describe "should check if the browser matches several criteria" do
57
+ it "- name" do
58
+ expect(subject.is?(name: :chrome)).to be_truthy
59
+ expect(subject.is?(name: [:firefox, :chrome])).to be_truthy
60
+ expect(subject.is?(name: :opera)).to be_falsey
61
+ end
504
62
 
505
- expect(browser).to receive("accepts").exactly(2).and_call_original
63
+ it "- engine" do
64
+ expect(subject.is?(engine: :chrome)).to be_truthy
65
+ expect(subject.is?(engine: [:firefox, :chrome])).to be_truthy
66
+ expect(subject.is?(engine: :opera)).to be_falsey
67
+ expect(subject.is?(name: :chrome, engine: :opera)).to be_truthy
68
+ end
506
69
 
507
- expect(browser.accepts?("it")).to be_true
508
- expect(browser.accepts?("en")).to be_false
509
- end
510
- end
70
+ it "- version" do
71
+ expect(subject.is?(version: "> 21")).to be_truthy
72
+ expect(subject.is?(version: "> 21 && < 22")).to be_truthy
73
+ expect(subject.is?(version: "> 23")).to be_falsey
74
+ expect(subject.is?(version: "> 21 && > 21.0.2000")).to be_falsey
75
+ expect(subject.is?(version: "capable")).to be_truthy
511
76
 
512
- describe "#supported?" do
513
- it "should check if the browser is supported starting from a definition map" do
514
- browser.parse_agent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.82 Safari/537.1")
515
- expect(browser.supported?(chrome: 21)).to be_true
516
- expect(browser.supported?(chrome: 31)).to be_false
517
- expect(browser.supported?(chrome: "21.2")).to be_false
518
- expect(browser.supported?(firefox: 11)).to be_false
519
- end
77
+ subject = Brauser::Browser.new("Mozilla/5.0 (Windows NT 6.1; rv:15.0) Gecko/20120716 Firefox/32.0")
78
+ expect(subject.is?(version: "capable")).to be_truthy
520
79
 
521
- it "should load definition files from a YAML file" do
522
- path = File.dirname(__FILE__) + "/../supported.yml"
523
- browser.parse_agent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.82 Safari/537.1")
524
- expect(browser.supported?(path)).to be_true
525
- end
526
- end
80
+ subject = Brauser::Browser.new("Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; .NET CLR 1.1.4322; .NET4.0C; Tablet PC 2.0")
81
+ expect(subject.is?(version: "capable")).to be_falsey
82
+ end
527
83
 
528
- describe "#initalize" do
529
- it "initialized definitions" do
530
- expect(::Brauser::Browser).to receive(:add_default_browsers)
531
- expect(::Brauser::Browser).to receive(:add_default_platforms)
532
- expect(::Brauser::Browser).to receive(:add_default_languages)
533
- ::Brauser::Browser.new
534
- end
84
+ it "- platform" do
85
+ expect(subject.is?(platform: :osx)).to be_truthy
86
+ expect(subject.is?(platform: [:windows, :osx])).to be_truthy
87
+ expect(subject.is?(engine: :linux)).to be_falsey
88
+ end
535
89
 
536
- it "should initialize attributes and parse them" do
537
- expect_any_instance_of(::Brauser::Browser).to receive(:parse_agent).with("A")
538
- expect_any_instance_of(::Brauser::Browser).to receive(:parse_accept_language).with("B")
90
+ it "- languages" do
91
+ expect(subject.is?(languages: :it)).to be_truthy
92
+ expect(subject.is?(languages: [:es, :en])).to be_truthy
93
+ expect(subject.is?(languages: :de)).to be_falsey
94
+ end
539
95
 
540
- other = ::Brauser::Browser.new("A", "B")
541
- expect(other.agent).to eq("A")
542
- expect(other.accept_language).to eq("B")
96
+ it "- combination" do
97
+ expect(subject.is?(name: :chrome, version: "> 21")).to be_truthy
98
+ expect(subject.is?(name: :chrome, version: "> 21 && < 22")).to be_truthy
99
+ expect(subject.is?(version: "> 21", platform: :osx)).to be_truthy
100
+ end
543
101
  end
544
102
  end
545
103
 
546
- describe "accepts dynamic finders by" do
547
- before(:each) do
548
- browser.name = :opera_mobile
549
- browser.version = "2.0.0"
550
- browser.platform = :windows
551
- end
552
-
553
- it "calling the right method" do
554
- expect(browser).to receive(:is?).with("opera_mobile", {}, []).and_call_original
555
- expect(browser).to receive(:version?).with("< 3").and_call_original
556
- expect(browser).to receive(:on?).with("windows").and_call_original
557
-
558
- expect(browser.is_opera_mobile_v_lt_3_on_windows?).to be_true
559
- end
560
-
561
- it "returning as query" do
562
- expect(browser.is_opera_mobile_version_lt_3_on_windows).to be_a(::Brauser::Query)
563
- end
564
-
565
- it "returning as boolean" do
566
- expect(browser.is_opera_mobile_v_gt_3_on_windows?).to be_false
567
- end
568
-
569
- it "correctly analyzing version" do
570
- expect(browser).to receive(:is?).with("opera_mobile", {}, []).at_least(1).and_call_original
571
-
572
- expect(browser).to receive(:version?).with("<= 3").and_call_original
573
- expect(browser.is_opera_mobile_v_lte_3).to be_true
574
-
575
- expect(browser).to receive(:version?).with("< 3 && >= 3").and_call_original
576
- expect(browser.is_opera_mobile_v_lt_3_and_gte_3?).to be_false
577
-
578
- expect(browser).to receive(:version?).with("&& >= 3").and_call_original
579
- expect(browser.is_opera_mobile_v_and_gte_3?).to be_false
580
-
581
- expect(browser).to receive(:version?).with("< 3 &&").and_call_original
582
- expect(browser.is_opera_mobile_v_lt_3_and?).to be_true
583
-
584
- expect(browser).to receive(:version?).with("> 2").and_return(true)
585
- expect(browser.is_opera_mobile_v_gt_2?).to be_true
586
-
587
- expect(browser).to receive(:version?).with("== 3.4.5alpha").and_return(false)
588
- expect(browser.is_opera_mobile_v_eq_3_4_5alpha_is_3?).to be_false
589
- end
590
-
591
- it "immediately invalidate a query if one of the methods is invalid" do
592
- expect(browser).not_to receive(:is)
593
- expect(browser).not_to receive(:v)
594
- expect(browser).not_to receive(:on)
595
-
596
- expect{ browser.is_opera_mobile_vv_lt_3_on_windows? }.to raise_error(NoMethodError)
104
+ describe "#method_missing" do
105
+ it "should attempt to run #is? with the method as name if it ends with a ?" do
106
+ expect(subject.chrome?).to be_truthy
107
+ expect(subject.firefox?).to be_falsey
597
108
  end
598
109
 
599
- it "raising an exception for invalid finder" do
600
- expect{ browser.aa? }.to raise_error(NoMethodError)
601
- expect{ browser.isa_opera_mobile_vv_lt_3_on_windows? }.to raise_error(NoMethodError)
602
- expect{ browser.is_opera_mobile_v_lt_3_ona_windows? }.to raise_error(NoMethodError)
110
+ it "should fallback to the original for the rest" do
111
+ expect { subject.not_supported }.to raise_error(NoMethodError)
603
112
  end
604
113
  end
605
114
  end