brauser 3.3.2 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
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