rack-backbone 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES.md +12 -0
- data/Rakefile +1 -1
- data/lib/rack/backbone.rb +37 -22
- data/lib/rack/backbone/version.rb +1 -1
- data/spec/rack_jquery_spec.rb +66 -29
- metadata +2 -2
data/CHANGES.md
CHANGED
@@ -1,5 +1,16 @@
|
|
1
1
|
# CH CH CH CHANGES #
|
2
2
|
|
3
|
+
|
4
|
+
## Thursday the 10th of October 2013 ##
|
5
|
+
|
6
|
+
### v0.0.5 ###
|
7
|
+
|
8
|
+
* Can pass `false` to the `cdn` method to just get the fallback with no CDN, useful for working locally.
|
9
|
+
* Fixed problem with the :http_path option for the fallback route.
|
10
|
+
|
11
|
+
----
|
12
|
+
|
13
|
+
|
3
14
|
## Thursday the 19th of September 2013 ##
|
4
15
|
|
5
16
|
### v0.0.4 ###
|
@@ -8,6 +19,7 @@
|
|
8
19
|
|
9
20
|
----
|
10
21
|
|
22
|
+
|
11
23
|
### v0.0.3 ###
|
12
24
|
|
13
25
|
* The vendored scripts weren't in the gem because of a cheeky line in the .gitignore file. Maybe DHH got hold of it ;) Fixed now.
|
data/Rakefile
CHANGED
data/lib/rack/backbone.rb
CHANGED
@@ -31,43 +31,60 @@ module Rack
|
|
31
31
|
|
32
32
|
end
|
33
33
|
|
34
|
+
|
35
|
+
# Default options hash for the middleware.
|
36
|
+
DEFAULT_OPTIONS = {
|
37
|
+
:http_path => "/js"
|
38
|
+
}
|
39
|
+
|
40
|
+
|
34
41
|
# This javascript checks if the Backbone object has loaded. If not, that most likely means the CDN is unreachable, so it uses the local minified Backbone.
|
35
|
-
|
42
|
+
# It's the top half, it gets pieced together elsewhere.
|
43
|
+
FALLBACK_TOP = <<STR
|
36
44
|
<script type="text/javascript">
|
37
45
|
if (typeof Backbone == 'undefined') {
|
38
|
-
document.write(unescape("%3Cscript src='
|
46
|
+
document.write(unescape("%3Cscript src='
|
47
|
+
STR
|
48
|
+
|
49
|
+
# Bottom half of the fallback script.
|
50
|
+
FALLBACK_BOTTOM = <<STR
|
51
|
+
' type='text/javascript'%3E%3C/script%3E"))
|
39
52
|
};
|
40
53
|
</script>
|
41
54
|
STR
|
42
55
|
|
43
56
|
# @param [Hash] env The rack env hash.
|
44
|
-
# @
|
57
|
+
# @option options [Symbol] organisation Choose which CDN to use, either :jsdelivr, or :cloudflare (the default). This will override anything set via the `use` statement. Pass in `false` to force use of the local Backbonejs script. `nil` will force choosing the default CDN.
|
45
58
|
# @return [String] The HTML script tags to get the CDN.
|
46
59
|
def self.cdn( env, options={} )
|
47
60
|
if env.nil? || env.has_key?(:organisation)
|
48
61
|
fail ArgumentError, "The Rack::Backbone.cdn method needs the Rack environment passed to it, or at the very least, an empty hash."
|
49
62
|
end
|
50
63
|
|
51
|
-
organisation = options[:organisation]
|
52
|
-
|
53
|
-
|
64
|
+
organisation = options[:organisation]
|
65
|
+
if organisation.nil?
|
66
|
+
organisation =
|
67
|
+
env["rack.backbone.organisation"] ||
|
68
|
+
:media_temple
|
69
|
+
end
|
54
70
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
71
|
+
warn "organisation = #{organisation.inspect}"
|
72
|
+
unless organisation == false
|
73
|
+
script_src = case organisation
|
74
|
+
when :cloudflare
|
75
|
+
CDN::CLOUDFLARE
|
76
|
+
when :jsdelivr
|
77
|
+
CDN::JSDELIVR
|
78
|
+
else
|
79
|
+
CDN::CLOUDFLARE
|
80
|
+
end
|
81
|
+
%Q!<script src='#{script_src}'></script>\n#{FALLBACK_TOP}#{env["rack.backbone.http_path"]}#{FALLBACK_BOTTOM}!
|
82
|
+
else
|
83
|
+
"<script src='#{env["rack.backbone.http_path"]}'></script>"
|
62
84
|
end
|
63
|
-
"<script src='#{script}'></script>\n#{FALLBACK}"
|
64
|
-
end
|
65
85
|
|
86
|
+
end
|
66
87
|
|
67
|
-
# Default options hash for the middleware.
|
68
|
-
DEFAULT_OPTIONS = {
|
69
|
-
:http_path => "/js"
|
70
|
-
}
|
71
88
|
|
72
89
|
|
73
90
|
# @param [#call] app
|
@@ -78,9 +95,6 @@ STR
|
|
78
95
|
# # The default:
|
79
96
|
# use Rack::Backbone
|
80
97
|
#
|
81
|
-
# # With a different route to the fallback:
|
82
|
-
# use Rack::Backbone, :http_path => "/assets/js"
|
83
|
-
#
|
84
98
|
# # With a default organisation:
|
85
99
|
# use Rack::Backbone, :organisation => :cloudflare
|
86
100
|
def initialize( app, options={} )
|
@@ -102,6 +116,7 @@ STR
|
|
102
116
|
def _call( env )
|
103
117
|
request = Rack::Request.new(env.dup)
|
104
118
|
env.merge! "rack.backbone.organisation" => @organisation
|
119
|
+
env.merge! "rack.backbone.http_path" => @http_path_to_backbone
|
105
120
|
if request.path_info == @http_path_to_backbone
|
106
121
|
response = Rack::Response.new
|
107
122
|
# for caching
|
data/spec/rack_jquery_spec.rb
CHANGED
@@ -3,22 +3,30 @@
|
|
3
3
|
require 'spec_helper'
|
4
4
|
require_relative "../lib/rack/backbone.rb"
|
5
5
|
|
6
|
+
class Rack::Backbone # for clarity!
|
7
|
+
|
6
8
|
describe "The class methods" do
|
7
|
-
let(:
|
8
|
-
|
9
|
+
let(:path) {::File.join(DEFAULT_OPTIONS[:http_path],BACKBONE_FILE_NAME)}
|
10
|
+
let(:env) { {"rack.backbone.http_path" => path} }
|
11
|
+
let(:default_options) { {} }
|
12
|
+
subject(:cdn) { Rack::Backbone.cdn env, default_options.merge(options) }
|
9
13
|
|
10
14
|
context "Given the organisation option" do
|
11
15
|
context "of nil (the default)" do
|
12
|
-
let(:
|
13
|
-
it { should == "<script src='#{
|
16
|
+
let(:options) { {:organisation => nil } }
|
17
|
+
it { should == "<script src='#{CDN::CLOUDFLARE}'></script>\n#{FALLBACK_TOP}#{path}#{FALLBACK_BOTTOM}" }
|
14
18
|
end
|
15
19
|
context "of :jsdelivr" do
|
16
|
-
let(:
|
17
|
-
it { should == "<script src='#{
|
20
|
+
let(:options) { {:organisation => :jsdelivr } }
|
21
|
+
it { should == "<script src='#{CDN::JSDELIVR}'></script>\n#{FALLBACK_TOP}#{path}#{FALLBACK_BOTTOM}" }
|
18
22
|
end
|
19
23
|
context "of :cloudflare" do
|
20
|
-
let(:
|
21
|
-
it { should == "<script src='#{
|
24
|
+
let(:options) { {:organisation => :cloudflare } }
|
25
|
+
it { should == "<script src='#{CDN::CLOUDFLARE}'></script>\n#{FALLBACK_TOP}#{path}#{FALLBACK_BOTTOM}" }
|
26
|
+
end
|
27
|
+
context "of false, to get the fallback script only" do
|
28
|
+
let(:options) { {:organisation => false } }
|
29
|
+
it { should == "<script src='#{path}'></script>" }
|
22
30
|
end
|
23
31
|
end
|
24
32
|
|
@@ -56,7 +64,7 @@ describe "Inserting the CDN" do
|
|
56
64
|
end
|
57
65
|
it_should_behave_like "Any route"
|
58
66
|
subject { last_response.body }
|
59
|
-
let(:expected) {
|
67
|
+
let(:expected) { CDN::JSDELIVR }
|
60
68
|
it { should include expected }
|
61
69
|
end
|
62
70
|
context "Unspecified CDN" do
|
@@ -65,7 +73,7 @@ describe "Inserting the CDN" do
|
|
65
73
|
end
|
66
74
|
it_should_behave_like "Any route"
|
67
75
|
subject { last_response.body }
|
68
|
-
let(:expected) {
|
76
|
+
let(:expected) { CDN::CLOUDFLARE }
|
69
77
|
it { should include expected }
|
70
78
|
end
|
71
79
|
context "Cloudflare CDN" do
|
@@ -74,7 +82,7 @@ describe "Inserting the CDN" do
|
|
74
82
|
end
|
75
83
|
it_should_behave_like "Any route"
|
76
84
|
subject { last_response.body }
|
77
|
-
let(:expected) {
|
85
|
+
let(:expected) { CDN::CLOUDFLARE }
|
78
86
|
it { should include expected }
|
79
87
|
end
|
80
88
|
end
|
@@ -92,7 +100,7 @@ describe "Inserting the CDN" do
|
|
92
100
|
end
|
93
101
|
it_should_behave_like "Any route"
|
94
102
|
subject { last_response.body }
|
95
|
-
let(:expected) {
|
103
|
+
let(:expected) { CDN::JSDELIVR }
|
96
104
|
it { should include expected }
|
97
105
|
end
|
98
106
|
context "Unspecified CDN" do
|
@@ -101,7 +109,7 @@ describe "Inserting the CDN" do
|
|
101
109
|
end
|
102
110
|
it_should_behave_like "Any route"
|
103
111
|
subject { last_response.body }
|
104
|
-
let(:expected) {
|
112
|
+
let(:expected) { CDN::CLOUDFLARE }
|
105
113
|
it { should include expected }
|
106
114
|
end
|
107
115
|
context "Cloudflare CDN" do
|
@@ -110,7 +118,7 @@ describe "Inserting the CDN" do
|
|
110
118
|
end
|
111
119
|
it_should_behave_like "Any route"
|
112
120
|
subject { last_response.body }
|
113
|
-
let(:expected) {
|
121
|
+
let(:expected) { CDN::CLOUDFLARE }
|
114
122
|
it { should include expected }
|
115
123
|
end
|
116
124
|
end
|
@@ -121,24 +129,53 @@ require 'timecop'
|
|
121
129
|
require 'time'
|
122
130
|
|
123
131
|
describe "Serving the fallback backbone" do
|
124
|
-
include_context "All routes"
|
125
132
|
before do
|
126
|
-
get
|
133
|
+
get path
|
127
134
|
end
|
128
|
-
it_should_behave_like "Any route"
|
129
135
|
subject { last_response.body }
|
130
|
-
|
136
|
+
let(:path){ ::File.join(http_path, BACKBONE_FILE_NAME) }
|
131
137
|
|
132
|
-
context "
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
138
|
+
context "With the default :http_path (none given)" do
|
139
|
+
include_context "All routes"
|
140
|
+
let(:http_path) { DEFAULT_OPTIONS[:http_path] }
|
141
|
+
|
142
|
+
it_should_behave_like "Any route"
|
143
|
+
it { should start_with "(function(){var t=this;var e=t.Backbone;" }
|
144
|
+
|
145
|
+
context "Re requests" do
|
146
|
+
before do
|
147
|
+
at_start = Time.parse(BACKBONE_VERSION_DATE) + 60 * 60 * 24 * 180
|
148
|
+
Timecop.freeze at_start
|
149
|
+
get path
|
150
|
+
Timecop.travel Time.now + 86400 # add a day
|
151
|
+
get path, {}, {"HTTP_IF_MODIFIED_SINCE" => Rack::Utils.rfc2109(at_start) }
|
152
|
+
end
|
153
|
+
subject { last_response }
|
154
|
+
its(:status) { should == 304 }
|
155
|
+
end
|
143
156
|
end
|
157
|
+
context "Given a different http_path via the options" do
|
158
|
+
include_context "All routes" do
|
159
|
+
let(:app) {
|
160
|
+
Sinatra.new do
|
161
|
+
use Rack::JQuery
|
162
|
+
use Rack::Lodash
|
163
|
+
use Rack::Backbone, :http_path => "/assets/javascripts"
|
164
|
+
end
|
165
|
+
}
|
166
|
+
end
|
167
|
+
context "That is valid" do
|
168
|
+
let(:http_path) { "/assets/javascripts" }
|
169
|
+
|
170
|
+
it_should_behave_like "Any route"
|
171
|
+
it { should start_with "(function(){var t=this;var e=t.Backbone;" }
|
172
|
+
end
|
173
|
+
context "That is not valid" do
|
174
|
+
let(:http_path) { "/this/is/not/the/path/it/was/setup/with" }
|
175
|
+
subject { last_response }
|
176
|
+
it { should_not be_ok }
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
144
181
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rack-backbone
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-10-10 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|