brauser 1.0.1 → 1.0.5

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -9,7 +9,186 @@ http://github.com/ShogunPanda/brauser
9
9
 
10
10
  ## Description
11
11
 
12
- *TODO*
12
+ Brauser is a framework agnostic helper that helps you in targeting your applications against most diffused browsers.
13
+
14
+ ### Installation
15
+
16
+ Brauser comes with a Ruby on Rails hooks (more framework to follow), so for Rails you have just to add this to your Gemfile:
17
+
18
+ ```ruby
19
+ gem "brauser"
20
+ ```
21
+
22
+ Once done that, every controller in your application will have a `browser` method (also extended to views/layout via `helper_method`).
23
+
24
+ If you don't use Rails, you can instantiate a new browser by including the gem in your code and by doing something like this:
25
+
26
+ ```ruby
27
+ browser = Brauser::Browser.new(USER_AGENT_HEADER, ACCEPT_LANGUAGE_HEADER)
28
+ ```
29
+
30
+ where the first argument is the HTTP header `User-Agent`, and the second is the HTTP header `Accept-Language`.
31
+
32
+ For the rest of this document, let's assume you use Chrome 1.2.3 on Mac OS X.
33
+
34
+ ### Getting browser information
35
+
36
+ Once you instantiate the browser, you can query the browser about `name`, `version` and `platform`. You can also get readable name and platforms via `readable_name` and `platform_name`.
37
+
38
+ The version is returned as a `String`, and you can use `Brauser::Browser.compare_versions` to compare against another version.
39
+
40
+ The name and the platform are returned as `Symbol` and can be in the range of names and engines registered via `register_browser`, `register_default_browsers`, `register_platform` and `register_default_platforms`.
41
+
42
+ Also, you can get global information using `browser.to_s` or `browser.classes`. This will return an array or a string already formatted to be used in your views to scope your CSS.
43
+
44
+ For example, if you do this in a ERB view:
45
+
46
+ ```html
47
+ <body class="<%= browser.classes %>">
48
+ ...
49
+ ```
50
+
51
+ The view will get compiled to this:
52
+
53
+ ```html
54
+ <body class="chrome version-1 version-1_2 version-1_2_3 platform-osx">
55
+ ...
56
+ ```
57
+
58
+ And thus scoping your CSS will be trivial.
59
+
60
+ ### Querying the browser
61
+
62
+ Brauser supports querying about name (method `is`), version (method `v`), platform (method `on`) and language (method `accepts`).
63
+
64
+ The `is` method queries about a browser name (or a list of names) and optionally by version and platform:
65
+
66
+ ```ruby
67
+ # We talk about the ending ? later.
68
+ browser.is?(:chrome)
69
+ # => true
70
+ browser.is?([:msie, :firefox])
71
+ # => false
72
+ browser.is?(:chrome, {:lt => "2"}, :osx)
73
+ # => true
74
+ browser.is?(:chrome, ">= 3", :windows)
75
+ # => false
76
+ ```
77
+
78
+ The method `is` is the only which supports direct internal propagation to version and platform.
79
+
80
+ The `v` method queries about the browser version. You can specify the comparison with an hash or a little expression.
81
+
82
+ In the case of hash, the syntax is `{:operator => value}`, where `:operator` is one of `[:lt, :lte, :eq, :gte, :gt]` and value can be a Float or a String.
83
+
84
+ In the case of expression, the syntax is `OPERATOR VALUE && ..`, where `OPERATOR` is one of `["<", "<=", "=", "==", ">=", ">"]` and value specifies the version.
85
+
86
+ Examples:
87
+
88
+ ```ruby
89
+ # Those two methods are equivalent.
90
+ browser.v?({:lt => "2", :gt => 1})
91
+ # => true
92
+ browser.is?("< 2 && > 1")
93
+ # => true
94
+ ```
95
+
96
+ The method `on` check is the current browser in one of the specifed platform. The platform should be passed as `Symbol`.
97
+
98
+ ```ruby
99
+ browser.on?(:osx)
100
+ # => true
101
+ browser.on?([:windows, :ios])
102
+ # => false
103
+ ```
104
+
105
+ At the end, the method `accepts` checks if the browser accepts one of the specified languages. Languages should be passed as language codes in `String`.
106
+
107
+ ```ruby
108
+ browser.accepts?("en")
109
+ # => true
110
+ browser.accepts?(["de", "es"])
111
+ # => false
112
+ ```
113
+
114
+ Every query method exists in two forms: the concatenation one (the method name doesn't end with a `?`.
115
+
116
+ The former return a `Query` object, which supports the same query method of the browser and thus enables concatenation.
117
+
118
+ The latter return a boolean object, and it's equivalent to calling `result` on the query after concatenation.
119
+
120
+ Ideally, you should use the `?` version to end the query and fetch the result.
121
+
122
+ ```ruby
123
+ # These expressions are equivalent.
124
+ browser.is?(:chrome, {:lt => "2"}, :osx)
125
+ browser.is(:chrome, {:lt => "2"}, :osx).result
126
+ browser.is(:chrome).v({:lt => "2"}).on?(:osx)
127
+ browser.is(:chrome).v({:lt => "2"}).on(:osx).result
128
+ ```
129
+
130
+ Finally, Brauser support dynamic query operator to write simple queries without using concatenation.
131
+
132
+ You construct the method just using operator specified above, separating method name and method arguments with a `_` and different methods with a `__`.
133
+
134
+ For the version, use the expression form but use symbol operators and replace `.` with `_` and `&&` with `and`.
135
+
136
+ Example:
137
+
138
+ ```ruby
139
+ # These expressions are equivalent.
140
+ browser.is(:chrome).v("< 2 && > 1.2").on(:osx).result
141
+ browser.is_chrome__v_lt_2_and_gt_1_2__on_osx.result
142
+
143
+ # These expressions are equivalent.
144
+ browser.is(:chrome).v("< 2 && > 1.2").on?(:osx)
145
+ browser.is_chrome__v_lt_2_and_gt_1_2__on_osx?
146
+ ```
147
+
148
+ ### Adding new browsers
149
+
150
+ To add new browsers, simply call `register_browser`.
151
+
152
+ This methods accepts a single entry or an array of entries in the following format: `[name, name_match, version_match, label]`:
153
+
154
+ * `name` is the name of the browser. Should be a `Symbol`.
155
+ * `name_match` is a `Regexp` to match against the user agent to detect the current browser.
156
+ * `version_match` is a `Regexp` which last capture group holds the version of the browser.
157
+ * `label` is the human readable name of the browser.
158
+
159
+ For example, for Google Chrome the call should be:
160
+
161
+ ```ruby
162
+ browser.register_browser(:chrome, /((chrome)|(chromium))/i, /(.+Chrom[a-z]+\/)([a-z0-9.]+)/i, "Google Chrome")
163
+ ```
164
+
165
+ ### Adding new platforms
166
+
167
+ To add new platforms, simply call `register_platform`.
168
+
169
+ This method accepts a single entry or an array of entries in the following format: `[name, matcher, label]`:
170
+
171
+ * `name` is the name of the platform. Should be a `Symbol`.
172
+ * `matcher` is a `Regexp` to match against the user agent to detect the current platform.
173
+ * `label` is the human readable name of the platform.
174
+
175
+ For example, for Mac OS X the call should be:
176
+
177
+ ```ruby
178
+ browser.register_platform(:osx, /mac|macintosh|mac os x/i, "Apple MacOS X")
179
+ ```
180
+
181
+ ### Adding new languages
182
+
183
+ To add new languages, simply call `register_language`.
184
+
185
+ This method accepts a single pair of code and label or an hash where keys are language code and values are labels.
186
+
187
+ For example, for Italian the call should be:
188
+
189
+ ```ruby
190
+ browser.register_language("it", "Italian")
191
+ ```
13
192
 
14
193
  ## Contributing to brauser
15
194
 
@@ -120,7 +120,7 @@
120
120
  </div>
121
121
 
122
122
  <div id="footer">
123
- Generated on Mon Aug 27 10:46:32 2012 by
123
+ Generated on Tue Aug 28 09:55:46 2012 by
124
124
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
125
125
  0.8.2.1 (ruby-1.9.2).
126
126
  </div>
@@ -2985,7 +2985,7 @@
2985
2985
 
2986
2986
  <span class='kw'>def</span> <span class='id identifier rubyid_accepts'>accepts</span><span class='lparen'>(</span><span class='id identifier rubyid_langs'>langs</span> <span class='op'>=</span> <span class='lbracket'>[</span><span class='rbracket'>]</span><span class='rparen'>)</span>
2987
2987
  <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_parse_accept_language'>parse_accept_language</span><span class='lparen'>(</span><span class='ivar'>@accept_language</span><span class='rparen'>)</span> <span class='kw'>if</span> <span class='op'>!</span><span class='ivar'>@languages</span>
2988
- <span class='op'>::</span><span class='const'>Brauser</span><span class='op'>::</span><span class='const'>Query</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='kw'>self</span><span class='comma'>,</span> <span class='lparen'>(</span><span class='ivar'>@languages</span> <span class='op'>&amp;</span> <span class='id identifier rubyid_langs'>langs</span><span class='period'>.</span><span class='id identifier rubyid_ensure_array'>ensure_array</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_present?'>present?</span><span class='rparen'>)</span>
2988
+ <span class='op'>::</span><span class='const'>Brauser</span><span class='op'>::</span><span class='const'>Query</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='kw'>self</span><span class='comma'>,</span> <span class='lparen'>(</span><span class='ivar'>@languages</span> <span class='op'>&amp;</span> <span class='id identifier rubyid_langs'>langs</span><span class='period'>.</span><span class='id identifier rubyid_ensure_array'>ensure_array</span><span class='period'>.</span><span class='id identifier rubyid_uniq'>uniq</span><span class='period'>.</span><span class='id identifier rubyid_compact'>compact</span><span class='period'>.</span><span class='id identifier rubyid_collect'>collect</span> <span class='lbrace'>{</span><span class='op'>|</span><span class='id identifier rubyid_l'>l</span><span class='op'>|</span> <span class='id identifier rubyid_l'>l</span><span class='period'>.</span><span class='id identifier rubyid_to_s'>to_s</span> <span class='rbrace'>}</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_present?'>present?</span><span class='rparen'>)</span>
2989
2989
  <span class='kw'>end</span></pre>
2990
2990
  </td>
2991
2991
  </tr>
@@ -3408,7 +3408,7 @@
3408
3408
  <span class='id identifier rubyid_platforms'>platforms</span> <span class='op'>=</span> <span class='id identifier rubyid_platforms'>platforms</span><span class='period'>.</span><span class='id identifier rubyid_ensure_array'>ensure_array</span>
3409
3409
 
3410
3410
  <span class='comment'># Adjust names
3411
- </span> <span class='id identifier rubyid_names'>names</span> <span class='op'>=</span> <span class='id identifier rubyid_names'>names</span><span class='period'>.</span><span class='id identifier rubyid_ensure_array'>ensure_array</span>
3411
+ </span> <span class='id identifier rubyid_names'>names</span> <span class='op'>=</span> <span class='id identifier rubyid_names'>names</span><span class='period'>.</span><span class='id identifier rubyid_ensure_array'>ensure_array</span><span class='period'>.</span><span class='id identifier rubyid_uniq'>uniq</span><span class='period'>.</span><span class='id identifier rubyid_compact'>compact</span><span class='period'>.</span><span class='id identifier rubyid_collect'>collect</span> <span class='lbrace'>{</span><span class='op'>|</span><span class='id identifier rubyid_n'>n</span><span class='op'>|</span> <span class='id identifier rubyid_n'>n</span><span class='period'>.</span><span class='id identifier rubyid_ensure_string'>ensure_string</span><span class='period'>.</span><span class='id identifier rubyid_to_sym'>to_sym</span> <span class='rbrace'>}</span>
3412
3412
  <span class='id identifier rubyid_names'>names</span> <span class='op'>&lt;&lt;</span> <span class='lbracket'>[</span><span class='symbol'>:msie</span><span class='rbracket'>]</span> <span class='kw'>if</span> <span class='id identifier rubyid_names'>names</span><span class='period'>.</span><span class='id identifier rubyid_include?'>include?</span><span class='lparen'>(</span><span class='symbol'>:ie</span><span class='rparen'>)</span>
3413
3413
  <span class='id identifier rubyid_names'>names</span> <span class='op'>&lt;&lt;</span> <span class='lbracket'>[</span><span class='symbol'>:chromium</span><span class='rbracket'>]</span> <span class='kw'>if</span> <span class='id identifier rubyid_names'>names</span><span class='period'>.</span><span class='id identifier rubyid_include?'>include?</span><span class='lparen'>(</span><span class='symbol'>:chrome</span><span class='rparen'>)</span>
3414
3414
 
@@ -3631,7 +3631,7 @@
3631
3631
 
3632
3632
  <span class='kw'>def</span> <span class='id identifier rubyid_on'>on</span><span class='lparen'>(</span><span class='id identifier rubyid_platforms'>platforms</span> <span class='op'>=</span> <span class='lbracket'>[</span><span class='rbracket'>]</span><span class='rparen'>)</span>
3633
3633
  <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_parse_agent'>parse_agent</span><span class='lparen'>(</span><span class='ivar'>@agent</span><span class='rparen'>)</span> <span class='kw'>if</span> <span class='op'>!</span><span class='ivar'>@platform</span>
3634
- <span class='op'>::</span><span class='const'>Brauser</span><span class='op'>::</span><span class='const'>Query</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='kw'>self</span><span class='comma'>,</span> <span class='id identifier rubyid_platforms'>platforms</span><span class='period'>.</span><span class='id identifier rubyid_blank?'>blank?</span> <span class='op'>||</span> <span class='id identifier rubyid_platforms'>platforms</span><span class='period'>.</span><span class='id identifier rubyid_ensure_array'>ensure_array</span><span class='period'>.</span><span class='id identifier rubyid_collect'>collect</span> <span class='lbrace'>{</span><span class='op'>|</span><span class='id identifier rubyid_p'>p</span><span class='op'>|</span> <span class='id identifier rubyid_p'>p</span><span class='period'>.</span><span class='id identifier rubyid_ensure_string'>ensure_string</span><span class='period'>.</span><span class='id identifier rubyid_to_sym'>to_sym</span> <span class='rbrace'>}</span><span class='period'>.</span><span class='id identifier rubyid_include?'>include?</span><span class='lparen'>(</span><span class='ivar'>@platform</span><span class='rparen'>)</span><span class='rparen'>)</span>
3634
+ <span class='op'>::</span><span class='const'>Brauser</span><span class='op'>::</span><span class='const'>Query</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='kw'>self</span><span class='comma'>,</span> <span class='id identifier rubyid_platforms'>platforms</span><span class='period'>.</span><span class='id identifier rubyid_blank?'>blank?</span> <span class='op'>||</span> <span class='id identifier rubyid_platforms'>platforms</span><span class='period'>.</span><span class='id identifier rubyid_ensure_array'>ensure_array</span><span class='period'>.</span><span class='id identifier rubyid_uniq'>uniq</span><span class='period'>.</span><span class='id identifier rubyid_compact'>compact</span><span class='period'>.</span><span class='id identifier rubyid_collect'>collect</span> <span class='lbrace'>{</span><span class='op'>|</span><span class='id identifier rubyid_p'>p</span><span class='op'>|</span> <span class='id identifier rubyid_p'>p</span><span class='period'>.</span><span class='id identifier rubyid_ensure_string'>ensure_string</span><span class='period'>.</span><span class='id identifier rubyid_to_sym'>to_sym</span> <span class='rbrace'>}</span><span class='period'>.</span><span class='id identifier rubyid_include?'>include?</span><span class='lparen'>(</span><span class='ivar'>@platform</span><span class='rparen'>)</span><span class='rparen'>)</span>
3635
3635
  <span class='kw'>end</span></pre>
3636
3636
  </td>
3637
3637
  </tr>
@@ -4383,7 +4383,7 @@
4383
4383
  </div>
4384
4384
 
4385
4385
  <div id="footer">
4386
- Generated on Mon Aug 27 10:46:32 2012 by
4386
+ Generated on Tue Aug 28 09:55:47 2012 by
4387
4387
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
4388
4388
  0.8.2.1 (ruby-1.9.2).
4389
4389
  </div>
@@ -116,7 +116,7 @@
116
116
  </div>
117
117
 
118
118
  <div id="footer">
119
- Generated on Mon Aug 27 10:46:32 2012 by
119
+ Generated on Tue Aug 28 09:55:46 2012 by
120
120
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
121
121
  0.8.2.1 (ruby-1.9.2).
122
122
  </div>
@@ -323,7 +323,7 @@
323
323
  </div>
324
324
 
325
325
  <div id="footer">
326
- Generated on Mon Aug 27 10:46:32 2012 by
326
+ Generated on Tue Aug 28 09:55:46 2012 by
327
327
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
328
328
  0.8.2.1 (ruby-1.9.2).
329
329
  </div>
@@ -1306,7 +1306,7 @@
1306
1306
  </div>
1307
1307
 
1308
1308
  <div id="footer">
1309
- Generated on Mon Aug 27 10:46:32 2012 by
1309
+ Generated on Tue Aug 28 09:55:46 2012 by
1310
1310
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
1311
1311
  0.8.2.1 (ruby-1.9.2).
1312
1312
  </div>
@@ -149,7 +149,7 @@
149
149
 
150
150
  </div>
151
151
  </dt>
152
- <dd><pre class="code"><span class='int'>0</span></pre></dd>
152
+ <dd><pre class="code"><span class='int'>5</span></pre></dd>
153
153
 
154
154
  <dt id="STRING-constant" class="">STRING =
155
155
  <div class="docstring">
@@ -180,7 +180,7 @@
180
180
  </div>
181
181
 
182
182
  <div id="footer">
183
- Generated on Mon Aug 27 10:46:32 2012 by
183
+ Generated on Tue Aug 28 09:55:46 2012 by
184
184
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
185
185
  0.8.2.1 (ruby-1.9.2).
186
186
  </div>
@@ -168,7 +168,7 @@
168
168
  </div>
169
169
 
170
170
  <div id="footer">
171
- Generated on Mon Aug 27 10:46:31 2012 by
171
+ Generated on Tue Aug 28 09:55:46 2012 by
172
172
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
173
173
  0.8.2.1 (ruby-1.9.2).
174
174
  </div>
@@ -72,7 +72,177 @@
72
72
 
73
73
  <h2>Description</h2>
74
74
 
75
- <p><em>TODO</em></p>
75
+ <p>Brauser is a framework agnostic helper that helps you in targeting your applications against most diffused browsers.</p>
76
+
77
+ <h3>Installation</h3>
78
+
79
+ <p>Brauser comes with a Ruby on Rails hooks (more framework to follow), so for Rails you have just to add this to your Gemfile:</p>
80
+
81
+ <pre class="code ruby"><code><span class='id identifier rubyid_gem'>gem</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>brauser</span><span class='tstring_end'>&quot;</span></span>
82
+ </code></pre>
83
+
84
+ <p>Once done that, every controller in your application will have a <code>browser</code> method (also extended to views/layout via <code>helper_method</code>).</p>
85
+
86
+ <p>If you don&#39;t use Rails, you can instantiate a new browser by including the gem in your code and by doing something like this:</p>
87
+
88
+ <pre class="code ruby"><code><span class='id identifier rubyid_browser'>browser</span> <span class='op'>=</span> <span class='const'>Brauser</span><span class='op'>::</span><span class='const'>Browser</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='const'>USER_AGENT_HEADER</span><span class='comma'>,</span> <span class='const'>ACCEPT_LANGUAGE_HEADER</span><span class='rparen'>)</span>
89
+ </code></pre>
90
+
91
+ <p>where the first argument is the HTTP header <code>User-Agent</code>, and the second is the HTTP header <code>Accept-Language</code>.</p>
92
+
93
+ <p>For the rest of this document, let&#39;s assume you use Chrome 1.2.3 on Mac OS X.</p>
94
+
95
+ <h3>Getting browser information</h3>
96
+
97
+ <p>Once you instantiate the browser, you can query the browser about <code>name</code>, <code>version</code> and <code>platform</code>. You can also get readable name and platforms via <code>readable_name</code> and <code>platform_name</code>.</p>
98
+
99
+ <p>The version is returned as a <code>String</code>, and you can use <code>Brauser::Browser.compare_versions</code> to compare against another version.</p>
100
+
101
+ <p>The name and the platform are returned as <code>Symbol</code> and can be in the range of names and engines registered via <code>register_browser</code>, <code>register_default_browsers</code>, <code>register_platform</code> and <code>register_default_platforms</code>.</p>
102
+
103
+ <p>Also, you can get global information using <code>browser.to_s</code> or <code>browser.classes</code>. This will return an array or a string already formatted to be used in your views to scope your CSS.</p>
104
+
105
+ <p>For example, if you do this in a ERB view:</p>
106
+
107
+ <pre class="code html"><code>&lt;body class=&quot;&lt;%= browser.classes %&gt;&quot;&gt;
108
+ ...
109
+ </code></pre>
110
+
111
+ <p>The view will get compiled to this:</p>
112
+
113
+ <pre class="code html"><code>&lt;body class=&quot;chrome version-1 version-1_2 version-1_2_3 platform-osx&quot;&gt;
114
+ ...
115
+ </code></pre>
116
+
117
+ <p>And thus scoping your CSS will be trivial.</p>
118
+
119
+ <h3>Querying the browser</h3>
120
+
121
+ <p>Brauser supports querying about name (method <code>is</code>), version (method <code>v</code>), platform (method <code>on</code>) and language (method <code>accepts</code>).</p>
122
+
123
+ <p>The <code>is</code> method queries about a browser name (or a list of names) and optionally by version and platform:</p>
124
+
125
+ <pre class="code ruby"><code><span class='comment'># We talk about the ending ? later.
126
+ </span><span class='id identifier rubyid_browser'>browser</span><span class='period'>.</span><span class='id identifier rubyid_is?'>is?</span><span class='lparen'>(</span><span class='symbol'>:chrome</span><span class='rparen'>)</span>
127
+ <span class='comment'># =&gt; true
128
+ </span><span class='id identifier rubyid_browser'>browser</span><span class='period'>.</span><span class='id identifier rubyid_is?'>is?</span><span class='lparen'>(</span><span class='lbracket'>[</span><span class='symbol'>:msie</span><span class='comma'>,</span> <span class='symbol'>:firefox</span><span class='rbracket'>]</span><span class='rparen'>)</span>
129
+ <span class='comment'># =&gt; false
130
+ </span><span class='id identifier rubyid_browser'>browser</span><span class='period'>.</span><span class='id identifier rubyid_is?'>is?</span><span class='lparen'>(</span><span class='symbol'>:chrome</span><span class='comma'>,</span> <span class='lbrace'>{</span><span class='symbol'>:lt</span> <span class='op'>=&gt;</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>2</span><span class='tstring_end'>&quot;</span></span><span class='rbrace'>}</span><span class='comma'>,</span> <span class='symbol'>:osx</span><span class='rparen'>)</span>
131
+ <span class='comment'># =&gt; true
132
+ </span><span class='id identifier rubyid_browser'>browser</span><span class='period'>.</span><span class='id identifier rubyid_is?'>is?</span><span class='lparen'>(</span><span class='symbol'>:chrome</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>&gt;= 3</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='symbol'>:windows</span><span class='rparen'>)</span>
133
+ <span class='comment'># =&gt; false
134
+ </span></code></pre>
135
+
136
+ <p>The method <code>is</code> is the only which supports direct internal propagation to version and platform.</p>
137
+
138
+ <p>The <code>v</code> method queries about the browser version. You can specify the comparison with an hash or a little expression.</p>
139
+
140
+ <p>In the case of hash, the syntax is <code>{:operator =&gt; value}</code>, where <code>:operator</code> is one of <code>[:lt, :lte, :eq, :gte, :gt]</code> and value can be a Float or a String.</p>
141
+
142
+ <p>In the case of expression, the syntax is <code>OPERATOR VALUE &amp;&amp; ..</code>, where <code>OPERATOR</code> is one of <code>[&quot;&lt;&quot;, &quot;&lt;=&quot;, &quot;=&quot;, &quot;==&quot;, &quot;&gt;=&quot;, &quot;&gt;&quot;]</code> and value specifies the version.</p>
143
+
144
+ <p>Examples:</p>
145
+
146
+ <pre class="code ruby"><code><span class='comment'># Those two methods are equivalent.
147
+ </span><span class='id identifier rubyid_browser'>browser</span><span class='period'>.</span><span class='id identifier rubyid_v?'>v?</span><span class='lparen'>(</span><span class='lbrace'>{</span><span class='symbol'>:lt</span> <span class='op'>=&gt;</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>2</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='symbol'>:gt</span> <span class='op'>=&gt;</span> <span class='int'>1</span><span class='rbrace'>}</span><span class='rparen'>)</span>
148
+ <span class='comment'># =&gt; true
149
+ </span><span class='id identifier rubyid_browser'>browser</span><span class='period'>.</span><span class='id identifier rubyid_is?'>is?</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>&lt; 2 &amp;&amp; &gt; 1</span><span class='tstring_end'>&quot;</span></span><span class='rparen'>)</span>
150
+ <span class='comment'># =&gt; true
151
+ </span></code></pre>
152
+
153
+ <p>The method <code>on</code> check is the current browser in one of the specifed platform. The platform should be passed as <code>Symbol</code>.</p>
154
+
155
+ <pre class="code ruby"><code><span class='id identifier rubyid_browser'>browser</span><span class='period'>.</span><span class='id identifier rubyid_on?'>on?</span><span class='lparen'>(</span><span class='symbol'>:osx</span><span class='rparen'>)</span>
156
+ <span class='comment'># =&gt; true
157
+ </span><span class='id identifier rubyid_browser'>browser</span><span class='period'>.</span><span class='id identifier rubyid_on?'>on?</span><span class='lparen'>(</span><span class='lbracket'>[</span><span class='symbol'>:windows</span><span class='comma'>,</span> <span class='symbol'>:ios</span><span class='rbracket'>]</span><span class='rparen'>)</span>
158
+ <span class='comment'># =&gt; false
159
+ </span></code></pre>
160
+
161
+ <p>At the end, the method <code>accepts</code> checks if the browser accepts one of the specified languages. Languages should be passed as language codes in <code>String</code>.</p>
162
+
163
+ <pre class="code ruby"><code><span class='id identifier rubyid_browser'>browser</span><span class='period'>.</span><span class='id identifier rubyid_accepts?'>accepts?</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>en</span><span class='tstring_end'>&quot;</span></span><span class='rparen'>)</span>
164
+ <span class='comment'># =&gt; true
165
+ </span><span class='id identifier rubyid_browser'>browser</span><span class='period'>.</span><span class='id identifier rubyid_accepts?'>accepts?</span><span class='lparen'>(</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>de</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>es</span><span class='tstring_end'>&quot;</span></span><span class='rbracket'>]</span><span class='rparen'>)</span>
166
+ <span class='comment'># =&gt; false
167
+ </span></code></pre>
168
+
169
+ <p>Every query method exists in two forms: the concatenation one (the method name doesn&#39;t end with a <code>?</code>.</p>
170
+
171
+ <p>The former return a <code>Query</code> object, which supports the same query method of the browser and thus enables concatenation.</p>
172
+
173
+ <p>The latter return a boolean object, and it&#39;s equivalent to calling <code>result</code> on the query after concatenation.</p>
174
+
175
+ <p>Ideally, you should use the <code>?</code> version to end the query and fetch the result.</p>
176
+
177
+ <pre class="code ruby"><code><span class='comment'># These expressions are equivalent.
178
+ </span><span class='id identifier rubyid_browser'>browser</span><span class='period'>.</span><span class='id identifier rubyid_is?'>is?</span><span class='lparen'>(</span><span class='symbol'>:chrome</span><span class='comma'>,</span> <span class='lbrace'>{</span><span class='symbol'>:lt</span> <span class='op'>=&gt;</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>2</span><span class='tstring_end'>&quot;</span></span><span class='rbrace'>}</span><span class='comma'>,</span> <span class='symbol'>:osx</span><span class='rparen'>)</span>
179
+ <span class='id identifier rubyid_browser'>browser</span><span class='period'>.</span><span class='id identifier rubyid_is'>is</span><span class='lparen'>(</span><span class='symbol'>:chrome</span><span class='comma'>,</span> <span class='lbrace'>{</span><span class='symbol'>:lt</span> <span class='op'>=&gt;</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>2</span><span class='tstring_end'>&quot;</span></span><span class='rbrace'>}</span><span class='comma'>,</span> <span class='symbol'>:osx</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_result'>result</span>
180
+ <span class='id identifier rubyid_browser'>browser</span><span class='period'>.</span><span class='id identifier rubyid_is'>is</span><span class='lparen'>(</span><span class='symbol'>:chrome</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_v'>v</span><span class='lparen'>(</span><span class='lbrace'>{</span><span class='symbol'>:lt</span> <span class='op'>=&gt;</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>2</span><span class='tstring_end'>&quot;</span></span><span class='rbrace'>}</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_on?'>on?</span><span class='lparen'>(</span><span class='symbol'>:osx</span><span class='rparen'>)</span>
181
+ <span class='id identifier rubyid_browser'>browser</span><span class='period'>.</span><span class='id identifier rubyid_is'>is</span><span class='lparen'>(</span><span class='symbol'>:chrome</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_v'>v</span><span class='lparen'>(</span><span class='lbrace'>{</span><span class='symbol'>:lt</span> <span class='op'>=&gt;</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>2</span><span class='tstring_end'>&quot;</span></span><span class='rbrace'>}</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_on'>on</span><span class='lparen'>(</span><span class='symbol'>:osx</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_result'>result</span>
182
+ </code></pre>
183
+
184
+ <p>Finally, Brauser support dynamic query operator to write simple queries without using concatenation.</p>
185
+
186
+ <p>You construct the method just using operator specified above, separating method name and method arguments with a <code>_</code> and different methods with a <code>__</code>.</p>
187
+
188
+ <p>For the version, use the expression form but use symbol operators and replace <code>.</code> with <code>_</code> and <code>&amp;&amp;</code> with <code>and</code>.</p>
189
+
190
+ <p>Example:</p>
191
+
192
+ <pre class="code ruby"><code><span class='comment'># These expressions are equivalent.
193
+ </span><span class='id identifier rubyid_browser'>browser</span><span class='period'>.</span><span class='id identifier rubyid_is'>is</span><span class='lparen'>(</span><span class='symbol'>:chrome</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_v'>v</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>&lt; 2 &amp;&amp; &gt; 1.2</span><span class='tstring_end'>&quot;</span></span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_on'>on</span><span class='lparen'>(</span><span class='symbol'>:osx</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_result'>result</span>
194
+ <span class='id identifier rubyid_browser'>browser</span><span class='period'>.</span><span class='id identifier rubyid_is_chrome__v_lt_2_and_gt_1_2__on_osx'>is_chrome__v_lt_2_and_gt_1_2__on_osx</span><span class='period'>.</span><span class='id identifier rubyid_result'>result</span>
195
+
196
+ <span class='comment'># These expressions are equivalent.
197
+ </span><span class='id identifier rubyid_browser'>browser</span><span class='period'>.</span><span class='id identifier rubyid_is'>is</span><span class='lparen'>(</span><span class='symbol'>:chrome</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_v'>v</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>&lt; 2 &amp;&amp; &gt; 1.2</span><span class='tstring_end'>&quot;</span></span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_on?'>on?</span><span class='lparen'>(</span><span class='symbol'>:osx</span><span class='rparen'>)</span>
198
+ <span class='id identifier rubyid_browser'>browser</span><span class='period'>.</span><span class='id identifier rubyid_is_chrome__v_lt_2_and_gt_1_2__on_osx?'>is_chrome__v_lt_2_and_gt_1_2__on_osx?</span>
199
+ </code></pre>
200
+
201
+ <h3>Adding new browsers</h3>
202
+
203
+ <p>To add new browsers, simply call <code>register_browser</code>.</p>
204
+
205
+ <p>This methods accepts a single entry or an array of entries in the following format: <code>[name, name_match, version_match, label]</code>:</p>
206
+
207
+ <ul>
208
+ <li><code>name</code> is the name of the browser. Should be a <code>Symbol</code>.</li>
209
+ <li><code>name_match</code> is a <code>Regexp</code> to match against the user agent to detect the current browser.</li>
210
+ <li><code>version_match</code> is a <code>Regexp</code> which last capture group holds the version of the browser.</li>
211
+ <li><code>label</code> is the human readable name of the browser.</li>
212
+ </ul>
213
+
214
+ <p>For example, for Google Chrome the call should be:</p>
215
+
216
+ <pre class="code ruby"><code><span class='id identifier rubyid_browser'>browser</span><span class='period'>.</span><span class='id identifier rubyid_register_browser'>register_browser</span><span class='lparen'>(</span><span class='symbol'>:chrome</span><span class='comma'>,</span> <span class='tstring'><span class='regexp_beg'>/</span><span class='tstring_content'>((chrome)|(chromium))</span><span class='regexp_end'>/i</span></span><span class='comma'>,</span> <span class='tstring'><span class='regexp_beg'>/</span><span class='tstring_content'>(.+Chrom[a-z]+\/)([a-z0-9.]+)</span><span class='regexp_end'>/i</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Google Chrome</span><span class='tstring_end'>&quot;</span></span><span class='rparen'>)</span>
217
+ </code></pre>
218
+
219
+ <h3>Adding new platforms</h3>
220
+
221
+ <p>To add new platforms, simply call <code>register_platform</code>.</p>
222
+
223
+ <p>This method accepts a single entry or an array of entries in the following format: <code>[name, matcher, label]</code>:</p>
224
+
225
+ <ul>
226
+ <li><code>name</code> is the name of the platform. Should be a <code>Symbol</code>.</li>
227
+ <li><code>matcher</code> is a <code>Regexp</code> to match against the user agent to detect the current platform.</li>
228
+ <li><code>label</code> is the human readable name of the platform.</li>
229
+ </ul>
230
+
231
+ <p>For example, for Mac OS X the call should be:</p>
232
+
233
+ <pre class="code ruby"><code><span class='id identifier rubyid_browser'>browser</span><span class='period'>.</span><span class='id identifier rubyid_register_platform'>register_platform</span><span class='lparen'>(</span><span class='symbol'>:osx</span><span class='comma'>,</span> <span class='tstring'><span class='regexp_beg'>/</span><span class='tstring_content'>mac|macintosh|mac os x</span><span class='regexp_end'>/i</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Apple MacOS X</span><span class='tstring_end'>&quot;</span></span><span class='rparen'>)</span>
234
+ </code></pre>
235
+
236
+ <h3>Adding new languages</h3>
237
+
238
+ <p>To add new languages, simply call <code>register_language</code>.</p>
239
+
240
+ <p>This method accepts a single pair of code and label or an hash where keys are language code and values are labels.</p>
241
+
242
+ <p>For example, for Italian the call should be:</p>
243
+
244
+ <pre class="code ruby"><code><span class='id identifier rubyid_browser'>browser</span><span class='period'>.</span><span class='id identifier rubyid_register_language'>register_language</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>it</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Italian</span><span class='tstring_end'>&quot;</span></span><span class='rparen'>)</span>
245
+ </code></pre>
76
246
 
77
247
  <h2>Contributing to brauser</h2>
78
248
 
@@ -93,7 +263,7 @@ Licensed under the MIT license, which can be found at <a href="http://www.openso
93
263
  </div></div>
94
264
 
95
265
  <div id="footer">
96
- Generated on Mon Aug 27 10:46:31 2012 by
266
+ Generated on Tue Aug 28 09:55:46 2012 by
97
267
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
98
268
  0.8.2.1 (ruby-1.9.2).
99
269
  </div>
@@ -72,7 +72,177 @@
72
72
 
73
73
  <h2>Description</h2>
74
74
 
75
- <p><em>TODO</em></p>
75
+ <p>Brauser is a framework agnostic helper that helps you in targeting your applications against most diffused browsers.</p>
76
+
77
+ <h3>Installation</h3>
78
+
79
+ <p>Brauser comes with a Ruby on Rails hooks (more framework to follow), so for Rails you have just to add this to your Gemfile:</p>
80
+
81
+ <pre class="code ruby"><code><span class='id identifier rubyid_gem'>gem</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>brauser</span><span class='tstring_end'>&quot;</span></span>
82
+ </code></pre>
83
+
84
+ <p>Once done that, every controller in your application will have a <code>browser</code> method (also extended to views/layout via <code>helper_method</code>).</p>
85
+
86
+ <p>If you don&#39;t use Rails, you can instantiate a new browser by including the gem in your code and by doing something like this:</p>
87
+
88
+ <pre class="code ruby"><code><span class='id identifier rubyid_browser'>browser</span> <span class='op'>=</span> <span class='const'>Brauser</span><span class='op'>::</span><span class='const'>Browser</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='const'>USER_AGENT_HEADER</span><span class='comma'>,</span> <span class='const'>ACCEPT_LANGUAGE_HEADER</span><span class='rparen'>)</span>
89
+ </code></pre>
90
+
91
+ <p>where the first argument is the HTTP header <code>User-Agent</code>, and the second is the HTTP header <code>Accept-Language</code>.</p>
92
+
93
+ <p>For the rest of this document, let&#39;s assume you use Chrome 1.2.3 on Mac OS X.</p>
94
+
95
+ <h3>Getting browser information</h3>
96
+
97
+ <p>Once you instantiate the browser, you can query the browser about <code>name</code>, <code>version</code> and <code>platform</code>. You can also get readable name and platforms via <code>readable_name</code> and <code>platform_name</code>.</p>
98
+
99
+ <p>The version is returned as a <code>String</code>, and you can use <code>Brauser::Browser.compare_versions</code> to compare against another version.</p>
100
+
101
+ <p>The name and the platform are returned as <code>Symbol</code> and can be in the range of names and engines registered via <code>register_browser</code>, <code>register_default_browsers</code>, <code>register_platform</code> and <code>register_default_platforms</code>.</p>
102
+
103
+ <p>Also, you can get global information using <code>browser.to_s</code> or <code>browser.classes</code>. This will return an array or a string already formatted to be used in your views to scope your CSS.</p>
104
+
105
+ <p>For example, if you do this in a ERB view:</p>
106
+
107
+ <pre class="code html"><code>&lt;body class=&quot;&lt;%= browser.classes %&gt;&quot;&gt;
108
+ ...
109
+ </code></pre>
110
+
111
+ <p>The view will get compiled to this:</p>
112
+
113
+ <pre class="code html"><code>&lt;body class=&quot;chrome version-1 version-1_2 version-1_2_3 platform-osx&quot;&gt;
114
+ ...
115
+ </code></pre>
116
+
117
+ <p>And thus scoping your CSS will be trivial.</p>
118
+
119
+ <h3>Querying the browser</h3>
120
+
121
+ <p>Brauser supports querying about name (method <code>is</code>), version (method <code>v</code>), platform (method <code>on</code>) and language (method <code>accepts</code>).</p>
122
+
123
+ <p>The <code>is</code> method queries about a browser name (or a list of names) and optionally by version and platform:</p>
124
+
125
+ <pre class="code ruby"><code><span class='comment'># We talk about the ending ? later.
126
+ </span><span class='id identifier rubyid_browser'>browser</span><span class='period'>.</span><span class='id identifier rubyid_is?'>is?</span><span class='lparen'>(</span><span class='symbol'>:chrome</span><span class='rparen'>)</span>
127
+ <span class='comment'># =&gt; true
128
+ </span><span class='id identifier rubyid_browser'>browser</span><span class='period'>.</span><span class='id identifier rubyid_is?'>is?</span><span class='lparen'>(</span><span class='lbracket'>[</span><span class='symbol'>:msie</span><span class='comma'>,</span> <span class='symbol'>:firefox</span><span class='rbracket'>]</span><span class='rparen'>)</span>
129
+ <span class='comment'># =&gt; false
130
+ </span><span class='id identifier rubyid_browser'>browser</span><span class='period'>.</span><span class='id identifier rubyid_is?'>is?</span><span class='lparen'>(</span><span class='symbol'>:chrome</span><span class='comma'>,</span> <span class='lbrace'>{</span><span class='symbol'>:lt</span> <span class='op'>=&gt;</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>2</span><span class='tstring_end'>&quot;</span></span><span class='rbrace'>}</span><span class='comma'>,</span> <span class='symbol'>:osx</span><span class='rparen'>)</span>
131
+ <span class='comment'># =&gt; true
132
+ </span><span class='id identifier rubyid_browser'>browser</span><span class='period'>.</span><span class='id identifier rubyid_is?'>is?</span><span class='lparen'>(</span><span class='symbol'>:chrome</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>&gt;= 3</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='symbol'>:windows</span><span class='rparen'>)</span>
133
+ <span class='comment'># =&gt; false
134
+ </span></code></pre>
135
+
136
+ <p>The method <code>is</code> is the only which supports direct internal propagation to version and platform.</p>
137
+
138
+ <p>The <code>v</code> method queries about the browser version. You can specify the comparison with an hash or a little expression.</p>
139
+
140
+ <p>In the case of hash, the syntax is <code>{:operator =&gt; value}</code>, where <code>:operator</code> is one of <code>[:lt, :lte, :eq, :gte, :gt]</code> and value can be a Float or a String.</p>
141
+
142
+ <p>In the case of expression, the syntax is <code>OPERATOR VALUE &amp;&amp; ..</code>, where <code>OPERATOR</code> is one of <code>[&quot;&lt;&quot;, &quot;&lt;=&quot;, &quot;=&quot;, &quot;==&quot;, &quot;&gt;=&quot;, &quot;&gt;&quot;]</code> and value specifies the version.</p>
143
+
144
+ <p>Examples:</p>
145
+
146
+ <pre class="code ruby"><code><span class='comment'># Those two methods are equivalent.
147
+ </span><span class='id identifier rubyid_browser'>browser</span><span class='period'>.</span><span class='id identifier rubyid_v?'>v?</span><span class='lparen'>(</span><span class='lbrace'>{</span><span class='symbol'>:lt</span> <span class='op'>=&gt;</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>2</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='symbol'>:gt</span> <span class='op'>=&gt;</span> <span class='int'>1</span><span class='rbrace'>}</span><span class='rparen'>)</span>
148
+ <span class='comment'># =&gt; true
149
+ </span><span class='id identifier rubyid_browser'>browser</span><span class='period'>.</span><span class='id identifier rubyid_is?'>is?</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>&lt; 2 &amp;&amp; &gt; 1</span><span class='tstring_end'>&quot;</span></span><span class='rparen'>)</span>
150
+ <span class='comment'># =&gt; true
151
+ </span></code></pre>
152
+
153
+ <p>The method <code>on</code> check is the current browser in one of the specifed platform. The platform should be passed as <code>Symbol</code>.</p>
154
+
155
+ <pre class="code ruby"><code><span class='id identifier rubyid_browser'>browser</span><span class='period'>.</span><span class='id identifier rubyid_on?'>on?</span><span class='lparen'>(</span><span class='symbol'>:osx</span><span class='rparen'>)</span>
156
+ <span class='comment'># =&gt; true
157
+ </span><span class='id identifier rubyid_browser'>browser</span><span class='period'>.</span><span class='id identifier rubyid_on?'>on?</span><span class='lparen'>(</span><span class='lbracket'>[</span><span class='symbol'>:windows</span><span class='comma'>,</span> <span class='symbol'>:ios</span><span class='rbracket'>]</span><span class='rparen'>)</span>
158
+ <span class='comment'># =&gt; false
159
+ </span></code></pre>
160
+
161
+ <p>At the end, the method <code>accepts</code> checks if the browser accepts one of the specified languages. Languages should be passed as language codes in <code>String</code>.</p>
162
+
163
+ <pre class="code ruby"><code><span class='id identifier rubyid_browser'>browser</span><span class='period'>.</span><span class='id identifier rubyid_accepts?'>accepts?</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>en</span><span class='tstring_end'>&quot;</span></span><span class='rparen'>)</span>
164
+ <span class='comment'># =&gt; true
165
+ </span><span class='id identifier rubyid_browser'>browser</span><span class='period'>.</span><span class='id identifier rubyid_accepts?'>accepts?</span><span class='lparen'>(</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>de</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>es</span><span class='tstring_end'>&quot;</span></span><span class='rbracket'>]</span><span class='rparen'>)</span>
166
+ <span class='comment'># =&gt; false
167
+ </span></code></pre>
168
+
169
+ <p>Every query method exists in two forms: the concatenation one (the method name doesn&#39;t end with a <code>?</code>.</p>
170
+
171
+ <p>The former return a <code>Query</code> object, which supports the same query method of the browser and thus enables concatenation.</p>
172
+
173
+ <p>The latter return a boolean object, and it&#39;s equivalent to calling <code>result</code> on the query after concatenation.</p>
174
+
175
+ <p>Ideally, you should use the <code>?</code> version to end the query and fetch the result.</p>
176
+
177
+ <pre class="code ruby"><code><span class='comment'># These expressions are equivalent.
178
+ </span><span class='id identifier rubyid_browser'>browser</span><span class='period'>.</span><span class='id identifier rubyid_is?'>is?</span><span class='lparen'>(</span><span class='symbol'>:chrome</span><span class='comma'>,</span> <span class='lbrace'>{</span><span class='symbol'>:lt</span> <span class='op'>=&gt;</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>2</span><span class='tstring_end'>&quot;</span></span><span class='rbrace'>}</span><span class='comma'>,</span> <span class='symbol'>:osx</span><span class='rparen'>)</span>
179
+ <span class='id identifier rubyid_browser'>browser</span><span class='period'>.</span><span class='id identifier rubyid_is'>is</span><span class='lparen'>(</span><span class='symbol'>:chrome</span><span class='comma'>,</span> <span class='lbrace'>{</span><span class='symbol'>:lt</span> <span class='op'>=&gt;</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>2</span><span class='tstring_end'>&quot;</span></span><span class='rbrace'>}</span><span class='comma'>,</span> <span class='symbol'>:osx</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_result'>result</span>
180
+ <span class='id identifier rubyid_browser'>browser</span><span class='period'>.</span><span class='id identifier rubyid_is'>is</span><span class='lparen'>(</span><span class='symbol'>:chrome</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_v'>v</span><span class='lparen'>(</span><span class='lbrace'>{</span><span class='symbol'>:lt</span> <span class='op'>=&gt;</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>2</span><span class='tstring_end'>&quot;</span></span><span class='rbrace'>}</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_on?'>on?</span><span class='lparen'>(</span><span class='symbol'>:osx</span><span class='rparen'>)</span>
181
+ <span class='id identifier rubyid_browser'>browser</span><span class='period'>.</span><span class='id identifier rubyid_is'>is</span><span class='lparen'>(</span><span class='symbol'>:chrome</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_v'>v</span><span class='lparen'>(</span><span class='lbrace'>{</span><span class='symbol'>:lt</span> <span class='op'>=&gt;</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>2</span><span class='tstring_end'>&quot;</span></span><span class='rbrace'>}</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_on'>on</span><span class='lparen'>(</span><span class='symbol'>:osx</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_result'>result</span>
182
+ </code></pre>
183
+
184
+ <p>Finally, Brauser support dynamic query operator to write simple queries without using concatenation.</p>
185
+
186
+ <p>You construct the method just using operator specified above, separating method name and method arguments with a <code>_</code> and different methods with a <code>__</code>.</p>
187
+
188
+ <p>For the version, use the expression form but use symbol operators and replace <code>.</code> with <code>_</code> and <code>&amp;&amp;</code> with <code>and</code>.</p>
189
+
190
+ <p>Example:</p>
191
+
192
+ <pre class="code ruby"><code><span class='comment'># These expressions are equivalent.
193
+ </span><span class='id identifier rubyid_browser'>browser</span><span class='period'>.</span><span class='id identifier rubyid_is'>is</span><span class='lparen'>(</span><span class='symbol'>:chrome</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_v'>v</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>&lt; 2 &amp;&amp; &gt; 1.2</span><span class='tstring_end'>&quot;</span></span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_on'>on</span><span class='lparen'>(</span><span class='symbol'>:osx</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_result'>result</span>
194
+ <span class='id identifier rubyid_browser'>browser</span><span class='period'>.</span><span class='id identifier rubyid_is_chrome__v_lt_2_and_gt_1_2__on_osx'>is_chrome__v_lt_2_and_gt_1_2__on_osx</span><span class='period'>.</span><span class='id identifier rubyid_result'>result</span>
195
+
196
+ <span class='comment'># These expressions are equivalent.
197
+ </span><span class='id identifier rubyid_browser'>browser</span><span class='period'>.</span><span class='id identifier rubyid_is'>is</span><span class='lparen'>(</span><span class='symbol'>:chrome</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_v'>v</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>&lt; 2 &amp;&amp; &gt; 1.2</span><span class='tstring_end'>&quot;</span></span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_on?'>on?</span><span class='lparen'>(</span><span class='symbol'>:osx</span><span class='rparen'>)</span>
198
+ <span class='id identifier rubyid_browser'>browser</span><span class='period'>.</span><span class='id identifier rubyid_is_chrome__v_lt_2_and_gt_1_2__on_osx?'>is_chrome__v_lt_2_and_gt_1_2__on_osx?</span>
199
+ </code></pre>
200
+
201
+ <h3>Adding new browsers</h3>
202
+
203
+ <p>To add new browsers, simply call <code>register_browser</code>.</p>
204
+
205
+ <p>This methods accepts a single entry or an array of entries in the following format: <code>[name, name_match, version_match, label]</code>:</p>
206
+
207
+ <ul>
208
+ <li><code>name</code> is the name of the browser. Should be a <code>Symbol</code>.</li>
209
+ <li><code>name_match</code> is a <code>Regexp</code> to match against the user agent to detect the current browser.</li>
210
+ <li><code>version_match</code> is a <code>Regexp</code> which last capture group holds the version of the browser.</li>
211
+ <li><code>label</code> is the human readable name of the browser.</li>
212
+ </ul>
213
+
214
+ <p>For example, for Google Chrome the call should be:</p>
215
+
216
+ <pre class="code ruby"><code><span class='id identifier rubyid_browser'>browser</span><span class='period'>.</span><span class='id identifier rubyid_register_browser'>register_browser</span><span class='lparen'>(</span><span class='symbol'>:chrome</span><span class='comma'>,</span> <span class='tstring'><span class='regexp_beg'>/</span><span class='tstring_content'>((chrome)|(chromium))</span><span class='regexp_end'>/i</span></span><span class='comma'>,</span> <span class='tstring'><span class='regexp_beg'>/</span><span class='tstring_content'>(.+Chrom[a-z]+\/)([a-z0-9.]+)</span><span class='regexp_end'>/i</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Google Chrome</span><span class='tstring_end'>&quot;</span></span><span class='rparen'>)</span>
217
+ </code></pre>
218
+
219
+ <h3>Adding new platforms</h3>
220
+
221
+ <p>To add new platforms, simply call <code>register_platform</code>.</p>
222
+
223
+ <p>This method accepts a single entry or an array of entries in the following format: <code>[name, matcher, label]</code>:</p>
224
+
225
+ <ul>
226
+ <li><code>name</code> is the name of the platform. Should be a <code>Symbol</code>.</li>
227
+ <li><code>matcher</code> is a <code>Regexp</code> to match against the user agent to detect the current platform.</li>
228
+ <li><code>label</code> is the human readable name of the platform.</li>
229
+ </ul>
230
+
231
+ <p>For example, for Mac OS X the call should be:</p>
232
+
233
+ <pre class="code ruby"><code><span class='id identifier rubyid_browser'>browser</span><span class='period'>.</span><span class='id identifier rubyid_register_platform'>register_platform</span><span class='lparen'>(</span><span class='symbol'>:osx</span><span class='comma'>,</span> <span class='tstring'><span class='regexp_beg'>/</span><span class='tstring_content'>mac|macintosh|mac os x</span><span class='regexp_end'>/i</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Apple MacOS X</span><span class='tstring_end'>&quot;</span></span><span class='rparen'>)</span>
234
+ </code></pre>
235
+
236
+ <h3>Adding new languages</h3>
237
+
238
+ <p>To add new languages, simply call <code>register_language</code>.</p>
239
+
240
+ <p>This method accepts a single pair of code and label or an hash where keys are language code and values are labels.</p>
241
+
242
+ <p>For example, for Italian the call should be:</p>
243
+
244
+ <pre class="code ruby"><code><span class='id identifier rubyid_browser'>browser</span><span class='period'>.</span><span class='id identifier rubyid_register_language'>register_language</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>it</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Italian</span><span class='tstring_end'>&quot;</span></span><span class='rparen'>)</span>
245
+ </code></pre>
76
246
 
77
247
  <h2>Contributing to brauser</h2>
78
248
 
@@ -93,7 +263,7 @@ Licensed under the MIT license, which can be found at <a href="http://www.openso
93
263
  </div></div>
94
264
 
95
265
  <div id="footer">
96
- Generated on Mon Aug 27 10:46:31 2012 by
266
+ Generated on Tue Aug 28 09:55:46 2012 by
97
267
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
98
268
  0.8.2.1 (ruby-1.9.2).
99
269
  </div>
@@ -103,7 +103,7 @@
103
103
  </div>
104
104
 
105
105
  <div id="footer">
106
- Generated on Mon Aug 27 10:46:32 2012 by
106
+ Generated on Tue Aug 28 09:55:46 2012 by
107
107
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
108
108
  0.8.2.1 (ruby-1.9.2).
109
109
  </div>
@@ -555,7 +555,7 @@ module Brauser
555
555
  platforms = platforms.ensure_array
556
556
 
557
557
  # Adjust names
558
- names = names.ensure_array
558
+ names = names.ensure_array.uniq.compact.collect {|n| n.ensure_string.to_sym }
559
559
  names << [:msie] if names.include?(:ie)
560
560
  names << [:chromium] if names.include?(:chrome)
561
561
 
@@ -647,7 +647,7 @@ module Brauser
647
647
  # @return [Query] A query which can evaluated for concatenation or result.
648
648
  def on(platforms = [])
649
649
  self.parse_agent(@agent) if !@platform
650
- ::Brauser::Query.new(self, platforms.blank? || platforms.ensure_array.collect {|p| p.ensure_string.to_sym }.include?(@platform))
650
+ ::Brauser::Query.new(self, platforms.blank? || platforms.ensure_array.uniq.compact.collect {|p| p.ensure_string.to_sym }.include?(@platform))
651
651
  end
652
652
 
653
653
  # Check if the browser is on a specific platform.
@@ -664,7 +664,7 @@ module Brauser
664
664
  # @return [Query] A query which can evaluated for concatenation or result.
665
665
  def accepts(langs = [])
666
666
  self.parse_accept_language(@accept_language) if !@languages
667
- ::Brauser::Query.new(self, (@languages & langs.ensure_array).present?)
667
+ ::Brauser::Query.new(self, (@languages & langs.ensure_array.uniq.compact.collect {|l| l.to_s }).present?)
668
668
  end
669
669
 
670
670
  # Check if the browser accepts the specified languages.
@@ -16,7 +16,7 @@ module Brauser
16
16
  MINOR = 0
17
17
 
18
18
  # The patch version.
19
- PATCH = 1
19
+ PATCH = 5
20
20
 
21
21
  # The current version of brauser.
22
22
  STRING = [MAJOR, MINOR, PATCH].compact.join(".")
metadata CHANGED
@@ -1,157 +1,151 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: brauser
3
- version: !ruby/object:Gem::Version
4
- hash: 21
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.5
5
5
  prerelease:
6
- segments:
7
- - 1
8
- - 0
9
- - 1
10
- version: 1.0.1
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Shogun
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2012-08-27 00:00:00 Z
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
21
- version_requirements: &id001 !ruby/object:Gem::Requirement
12
+ date: 2012-08-28 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: lazier
16
+ requirement: !ruby/object:Gem::Requirement
22
17
  none: false
23
- requirements:
18
+ requirements:
24
19
  - - ~>
25
- - !ruby/object:Gem::Version
26
- hash: 15
27
- segments:
28
- - 1
29
- - 0
30
- version: "1.0"
31
- prerelease: false
20
+ - !ruby/object:Gem::Version
21
+ version: '1.0'
32
22
  type: :runtime
33
- name: lazier
34
- requirement: *id001
35
- - !ruby/object:Gem::Dependency
36
- version_requirements: &id002 !ruby/object:Gem::Requirement
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '1.0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rspec
32
+ requirement: !ruby/object:Gem::Requirement
37
33
  none: false
38
- requirements:
34
+ requirements:
39
35
  - - ~>
40
- - !ruby/object:Gem::Version
41
- hash: 35
42
- segments:
43
- - 2
44
- - 11
45
- - 0
36
+ - !ruby/object:Gem::Version
46
37
  version: 2.11.0
47
- prerelease: false
48
38
  type: :development
49
- name: rspec
50
- requirement: *id002
51
- - !ruby/object:Gem::Dependency
52
- version_requirements: &id003 !ruby/object:Gem::Requirement
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: 2.11.0
46
+ - !ruby/object:Gem::Dependency
47
+ name: rake
48
+ requirement: !ruby/object:Gem::Requirement
53
49
  none: false
54
- requirements:
50
+ requirements:
55
51
  - - ~>
56
- - !ruby/object:Gem::Version
57
- hash: 59
58
- segments:
59
- - 0
60
- - 9
61
- - 0
52
+ - !ruby/object:Gem::Version
62
53
  version: 0.9.0
63
- prerelease: false
64
54
  type: :development
65
- name: rake
66
- requirement: *id003
67
- - !ruby/object:Gem::Dependency
68
- version_requirements: &id004 !ruby/object:Gem::Requirement
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
69
57
  none: false
70
- requirements:
58
+ requirements:
71
59
  - - ~>
72
- - !ruby/object:Gem::Version
73
- hash: 7
74
- segments:
75
- - 0
76
- - 6
77
- - 0
60
+ - !ruby/object:Gem::Version
61
+ version: 0.9.0
62
+ - !ruby/object:Gem::Dependency
63
+ name: simplecov
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
78
69
  version: 0.6.0
79
- prerelease: false
80
70
  type: :development
81
- name: simplecov
82
- requirement: *id004
83
- - !ruby/object:Gem::Dependency
84
- version_requirements: &id005 !ruby/object:Gem::Requirement
85
- none: false
86
- requirements:
87
- - - ">="
88
- - !ruby/object:Gem::Version
89
- hash: 3
90
- segments:
91
- - 0
92
- version: "0"
93
71
  prerelease: false
94
- type: :development
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: 0.6.0
78
+ - !ruby/object:Gem::Dependency
95
79
  name: pry
96
- requirement: *id005
97
- - !ruby/object:Gem::Dependency
98
- version_requirements: &id006 !ruby/object:Gem::Requirement
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
99
89
  none: false
100
- requirements:
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: yard
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
101
99
  - - ~>
102
- - !ruby/object:Gem::Version
103
- hash: 63
104
- segments:
105
- - 0
106
- - 8
107
- - 0
100
+ - !ruby/object:Gem::Version
108
101
  version: 0.8.0
109
- prerelease: false
110
102
  type: :development
111
- name: yard
112
- requirement: *id006
113
- - !ruby/object:Gem::Dependency
114
- version_requirements: &id007 !ruby/object:Gem::Requirement
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ~>
108
+ - !ruby/object:Gem::Version
109
+ version: 0.8.0
110
+ - !ruby/object:Gem::Dependency
111
+ name: redcarpet
112
+ requirement: !ruby/object:Gem::Requirement
115
113
  none: false
116
- requirements:
114
+ requirements:
117
115
  - - ~>
118
- - !ruby/object:Gem::Version
119
- hash: 11
120
- segments:
121
- - 2
122
- - 1
123
- - 0
116
+ - !ruby/object:Gem::Version
124
117
  version: 2.1.0
125
- prerelease: false
126
118
  type: :development
127
- name: redcarpet
128
- requirement: *id007
129
- - !ruby/object:Gem::Dependency
130
- version_requirements: &id008 !ruby/object:Gem::Requirement
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ~>
124
+ - !ruby/object:Gem::Version
125
+ version: 2.1.0
126
+ - !ruby/object:Gem::Dependency
127
+ name: github-markup
128
+ requirement: !ruby/object:Gem::Requirement
131
129
  none: false
132
- requirements:
130
+ requirements:
133
131
  - - ~>
134
- - !ruby/object:Gem::Version
135
- hash: 3
136
- segments:
137
- - 0
138
- - 7
139
- - 0
132
+ - !ruby/object:Gem::Version
140
133
  version: 0.7.0
141
- prerelease: false
142
134
  type: :development
143
- name: github-markup
144
- requirement: *id008
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ~>
140
+ - !ruby/object:Gem::Version
141
+ version: 0.7.0
145
142
  description: A framework agnostic browser detection and querying helper.
146
- email:
143
+ email:
147
144
  - shogun_panda@me.com
148
145
  executables: []
149
-
150
146
  extensions: []
151
-
152
147
  extra_rdoc_files: []
153
-
154
- files:
148
+ files:
155
149
  - .gitignore
156
150
  - .travis.yml
157
151
  - .yardopts
@@ -193,38 +187,35 @@ files:
193
187
  - spec/spec_helper.rb
194
188
  homepage: http://github.com/ShogunPanda/brauser
195
189
  licenses: []
196
-
197
190
  post_install_message:
198
191
  rdoc_options: []
199
-
200
- require_paths:
192
+ require_paths:
201
193
  - lib
202
- required_ruby_version: !ruby/object:Gem::Requirement
194
+ required_ruby_version: !ruby/object:Gem::Requirement
203
195
  none: false
204
- requirements:
205
- - - ">="
206
- - !ruby/object:Gem::Version
207
- hash: 3
208
- segments:
196
+ requirements:
197
+ - - ! '>='
198
+ - !ruby/object:Gem::Version
199
+ version: '0'
200
+ segments:
209
201
  - 0
210
- version: "0"
211
- required_rubygems_version: !ruby/object:Gem::Requirement
202
+ hash: 4366897324243754710
203
+ required_rubygems_version: !ruby/object:Gem::Requirement
212
204
  none: false
213
- requirements:
214
- - - ">="
215
- - !ruby/object:Gem::Version
216
- hash: 3
217
- segments:
205
+ requirements:
206
+ - - ! '>='
207
+ - !ruby/object:Gem::Version
208
+ version: '0'
209
+ segments:
218
210
  - 0
219
- version: "0"
211
+ hash: 4366897324243754710
220
212
  requirements: []
221
-
222
213
  rubyforge_project: brauser
223
214
  rubygems_version: 1.8.24
224
215
  signing_key:
225
216
  specification_version: 3
226
217
  summary: A framework agnostic browser detection and querying helper.
227
- test_files:
218
+ test_files:
228
219
  - spec/brauser/browser_spec.rb
229
220
  - spec/brauser/hooks_spec.rb
230
221
  - spec/brauser/query_spec.rb