rack-html5 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2010 Christian Felder
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -14,24 +14,24 @@ Rack::Html5 detects the browser and its version by parsing the user agent. It th
14
14
 
15
15
  Rack::Html5 then sets the following HTTP headers:
16
16
 
17
- * *X-Detected-Browser:* Browser that has been detected, eg.: Firefox
18
- * *X-Detected-Version:* Version of the browser that has been detected, eg.: 3.6.6
19
- * *X-Html5-Wysiwyg:* WYSIWYG editable elements
20
- * *X-Html5-Classname:* getElementsByClassName
21
- * *X-Html5-Elements:* Stylable HTML5 elements
22
- * *X-Html5-Canvas:* Canvas (basic support)
23
- * *X-Html5-Messaging:* Cross-document messaging
24
- * *X-Html5-Audio:* Audio element
25
- * *X-Html5-Video:* Video element
26
- * *X-Html5-Textapi:* Text API for canvas
27
- * *X-Html5-Draganddrop:* Drag and drop
28
- * *X-Html5-Offline:* Offline web applications
29
- * *X-Html5-Svg:* Inline SVG
30
- * *X-Html5-Form:* Form features (Web Forms 2.0)
17
+ * HTTP_X_DETECTED_BROWSER: Browser that has been DETECTED, eg.: Firefox
18
+ * HTTP_X_DETECTED_VERSION: Version of the browser that has been DETECTED, eg.: 3.6.6
19
+ * HTTP_X_SUPPORTS_HTML5_WYSIWYG: WYSIWYG editable elements
20
+ * HTTP_X_SUPPORTS_HTML5_CLASSNAME: getElementsByClassName
21
+ * HTTP_X_SUPPORTS_HTML5_ELEMENTS: Stylable HTML5 elements
22
+ * HTTP_X_SUPPORTS_HTML5_CANVAS: Canvas (basic support)
23
+ * HTTP_X_SUPPORTS_HTML5_MESSAGING: Cross-document messaging
24
+ * HTTP_X_SUPPORTS_HTML5_AUDIO: Audio element
25
+ * HTTP_X_SUPPORTS_HTML5_VIDEO: Video element
26
+ * HTTP_X_SUPPORTS_HTML5_TEXTAPI: Text API for canvas
27
+ * HTTP_X_SUPPORTS_HTML5_DRAGANDDROP: Drag and drop
28
+ * HTTP_X_SUPPORTS_HTML5_OFFLINE: Offline web applications
29
+ * HTTP_X_SUPPORTS_HTML5_SVG: Inline SVG
30
+ * HTTP_X_SUPPORTS_HTML5_FORMS: Form features (Web Forms 2.0)
31
31
 
32
32
  == Rails
33
33
 
34
- I plan on providing some rails helpers in the future.
34
+ The Rack-Html5-rails_helper gem provides Rails helper methods, so you don't have to read the headers by yourself: http://github.com/masone/rack-html5-rails_helper
35
35
 
36
36
  === Configuration for Rails 2
37
37
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.0
1
+ 1.0.1
@@ -4,50 +4,49 @@ module Rack # :nodoc:
4
4
  # It does this by parsing the user agent and matching the features to the browser version based on information provided on: http://caniuse.com/#eras=farpast,past,now&cats=HTML5&statuses=rec,pr,cr,wd,ietf&nodetails=1
5
5
  #
6
6
  # The headers that are being set:
7
- # * *X-Detected-Browser:* Browser that has been detected, eg.: Firefox
8
- # * *X-Detected-Version:* Version of the browser that has been detected, eg.: 3.6.6
9
- # * *X-Html5-Wysiwyg:* WYSIWYG editable elements
10
- # * *X-Html5-Classname:* getElementsByClassName
11
- # * *X-Html5-Elements:* Stylable HTML5 elements
12
- # * *X-Html5-Canvas:* Canvas (basic support)
13
- # * *X-Html5-Messaging:* Cross-document messaging
14
- # * *X-Html5-Audio:* Audio element
15
- # * *X-Html5-Video:* Video element
16
- # * *X-Html5-Textapi:* Text API for canvas
17
- # * *X-Html5-Draganddrop:* Drag and drop
18
- # * *X-Html5-Offline:* Offline web applications
19
- # * *X-Html5-Svg:* Inline SVG
20
- # * *X-Html5-Form:* Form features (Web Forms 2.0)
7
+ # * HTTP_X_DETECTED_BROWSER: Browser that has been DETECTED, eg.: Firefox
8
+ # * HTTP_X_DETECTED_VERSION: Version of the browser that has been DETECTED, eg.: 3.6.6
9
+ # * HTTP_X_SUPPORTS_HTML5_WYSIWYG: WYSIWYG editable elements
10
+ # * HTTP_X_SUPPORTS_HTML5_CLASSNAME: getElementsByClassName
11
+ # * HTTP_X_SUPPORTS_HTML5_ELEMENTS: Stylable HTML5 elements
12
+ # * HTTP_X_SUPPORTS_HTML5_CANVAS: Canvas (basic support)
13
+ # * HTTP_X_SUPPORTS_HTML5_MESSAGING: Cross-document messaging
14
+ # * HTTP_X_SUPPORTS_HTML5_AUDIO: Audio element
15
+ # * HTTP_X_SUPPORTS_HTML5_VIDEO: Video element
16
+ # * HTTP_X_SUPPORTS_HTML5_TEXTAPI: Text API for canvas
17
+ # * HTTP_X_SUPPORTS_HTML5_DRAGANDDROP: Drag and drop
18
+ # * HTTP_X_SUPPORTS_HTML5_OFFLINE: Offline web applications
19
+ # * HTTP_X_SUPPORTS_HTML5_SVG: Inline SVG
20
+ # * HTTP_X_SUPPORTS_HTML5_FORMS: Form features (Web Forms 2.0)
21
21
  #
22
22
  # Please note:
23
23
  # * If the feature is not supported, the header will not be set.
24
24
  # * If a browser implements a feature only partially, the corresponding header will not be set.
25
25
  class Html5
26
- attr_accessor :version, :browser, :user_agent, :features, :headers
26
+ attr_accessor :version, :browser, :user_agent, :features, :env
27
27
 
28
28
  def initialize(app)
29
29
  @app = app
30
+ @features = []
30
31
  end
31
32
 
32
33
  def generate_headers
33
- headers['x-detected-version'] = version
34
- headers['x-detected-browser'] = browser.to_s
34
+ @env['HTTP_X_DETECTED_VERSION'] = version
35
+ @env['HTTP_X_DETECTED_BROWSER'] = browser.to_s
35
36
  @features.each do |feature|
36
- headers["x-html5-#{feature}"] = "true"
37
+ @env["HTTP_X_SUPPORTS_HTML5_#{feature.upcase}"] = "true"
37
38
  end
38
39
  end
39
40
 
40
41
  def call(env)
41
- status, headers, response = @app.call(env)
42
- @user_agent = env['HTTP_USER_AGENT']
43
- @features = []
44
- @headers = headers
42
+ @env = env
43
+ @user_agent = @env['HTTP_USER_AGENT']
45
44
 
46
45
  detect_browser
47
46
  detect_features
48
47
  generate_headers
49
48
 
50
- [status, @headers, response]
49
+ @app.call(@env)
51
50
  end
52
51
 
53
52
  # Detects the browser and version based on the user agent
@@ -82,8 +81,6 @@ module Rack # :nodoc:
82
81
  def comparable_version(v)
83
82
  v.split(".")[0..1].join
84
83
  end
85
-
86
- private
87
84
 
88
85
  # Feature to browser version mapping according to the information provided on: http://caniuse.com/#eras=farpast,past,now&cats=HTML5&statuses=rec,pr,cr,wd,ietf&nodetails=1
89
86
  def feature_mapping
@@ -5,18 +5,20 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{rack-html5}
8
- s.version = "1.0.0"
8
+ s.version = "1.0.1"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Christian Felder (masone)"]
12
- s.date = %q{2010-07-14}
12
+ s.date = %q{2010-07-15}
13
13
  s.description = %q{Rack::Html5 sets custom headers for each HTML5 feature the browser supports.}
14
14
  s.email = %q{ema@rh-productions.ch}
15
15
  s.extra_rdoc_files = [
16
- "README.rdoc"
16
+ "LICENSE",
17
+ "README.rdoc"
17
18
  ]
18
19
  s.files = [
19
20
  ".gitignore",
21
+ "LICENSE",
20
22
  "README.rdoc",
21
23
  "Rakefile",
22
24
  "VERSION",
@@ -7,7 +7,7 @@ begin
7
7
  s.email = "ema@rh-productions.ch"
8
8
  s.homepage = "http://github.com/masone/rack-html5"
9
9
  s.authors = ["Christian Felder (masone)"]
10
- s.add_development_dependency "shoulda"
10
+ s.add_development_dependency "shoulda"
11
11
  end
12
12
  Jeweler::GemcutterTasks.new
13
13
  rescue LoadError
@@ -90,28 +90,66 @@ class Rack::Html5Test < Test::Unit::TestCase
90
90
 
91
91
  context "headers" do
92
92
 
93
- should "set the x-detected-version header to 5.0.307.11" do
93
+ should "set the HTTP_X_DETECTED_VERSION header to 5.0.307.11" do
94
94
  env = { 'HTTP_USER_AGENT' => "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; en-US) AppleWebKit/532.9 (KHTML, like Gecko) Chrome/5.0.307.11 Safari/532.9" }
95
- status, headers, response = @rack.call(env)
96
- assert_equal "5.0.307.11", headers['x-detected-version']
95
+ @rack.call(env)
96
+ assert_equal "5.0.307.11", @rack.env['HTTP_X_DETECTED_VERSION']
97
97
  end
98
98
 
99
- should "set the x-detected-browser header to " do
99
+ should "set the HTTP_X_DETECTED_BROWSER header to " do
100
100
  env = { 'HTTP_USER_AGENT' => "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; en-US) AppleWebKit/532.9 (KHTML, like Gecko) Chrome/5.0.307.11 Safari/532.9" }
101
- status, headers, response = @rack.call(env)
102
- assert_equal "chrome", headers['x-detected-browser']
101
+ @rack.call(env)
102
+ assert_equal "chrome", @rack.env['HTTP_X_DETECTED_BROWSER']
103
103
  end
104
104
 
105
- should "set the x-html5-elements header to true for Firefox 5.0" do
105
+ should "set the HTTP_X_SUPPORTS_HTML5_ELEMENTS header to true for Firefox 5.0" do
106
106
  env = { 'HTTP_USER_AGENT' => "Mozilla/5.0 (X11; U; Darwin Power Macintosh; en-US; rv:1.8.0.12) Gecko/20070803 Firefox/5.0.10 Fink Community Edition" }
107
- status, headers, response = @rack.call(env)
108
- assert_equal "true", headers['x-html5-elements']
107
+ @rack.call(env)
108
+ assert_equal "true", @rack.env['HTTP_X_SUPPORTS_HTML5_ELEMENTS']
109
109
  end
110
110
 
111
111
  should "not include the x headers if user agent cannot be detected properly" do
112
112
  env = { 'HTTP_USER_AGENT' => "Mozilla/5.0 Gecko/20070803 Notabrowser/9.9.99" }
113
113
  status, headers, response = @rack.call(env)
114
- assert_equal false, headers.include?('x-html5-wysiwyg')
114
+ assert_equal false, @rack.env.has_key?('HTTP_X_SUPPORTS_HTML5_WYSIWYG')
115
115
  end
116
116
  end
117
+
118
+ context "feature_mapping" do
119
+
120
+ setup do
121
+ @features = [:wysiwyg, :classname, :elements, :canvas, :messaging, :audio, :video, :textapi, :draganddrop, :offline, :forms, :svg]
122
+ end
123
+
124
+ should "map exactly the same number of elements as expected" do
125
+ @rack.feature_mapping.each do |browser, features|
126
+ assert_equal @features.length, features.keys.length, "Wrong number of elements for #{browser}"
127
+ end
128
+ end
129
+
130
+ should "contain all necessary elements for each browser" do
131
+ @rack.feature_mapping.each do |browser, features|
132
+ @features.each do |feature|
133
+ assert features.has_key?(feature), "Element #{feature} is missing for #{browser}"
134
+ end
135
+ end
136
+ end
137
+ end
138
+
139
+ context "comparable version" do
140
+
141
+ should "return 105 for 10.5" do
142
+ assert_equal "105", @rack.comparable_version("10.5")
143
+ end
144
+
145
+ should "return 1050 for 10.50.2.0" do
146
+ assert_equal "1050", @rack.comparable_version("10.50.2.0")
147
+ end
148
+
149
+ should "return 7 for 7" do
150
+ assert_equal "7", @rack.comparable_version("7")
151
+ end
152
+
153
+ end
154
+
117
155
  end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 1
7
7
  - 0
8
- - 0
9
- version: 1.0.0
8
+ - 1
9
+ version: 1.0.1
10
10
  platform: ruby
11
11
  authors:
12
12
  - Christian Felder (masone)
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-07-14 00:00:00 +02:00
17
+ date: 2010-07-15 00:00:00 +02:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -37,9 +37,11 @@ executables: []
37
37
  extensions: []
38
38
 
39
39
  extra_rdoc_files:
40
+ - LICENSE
40
41
  - README.rdoc
41
42
  files:
42
43
  - .gitignore
44
+ - LICENSE
43
45
  - README.rdoc
44
46
  - Rakefile
45
47
  - VERSION