js-routes 1.0.1 → 1.2.9
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.
- checksums.yaml +4 -4
- data/.travis.yml +19 -4
- data/Appraisals +2 -2
- data/CHANGELOG.md +70 -0
- data/Rakefile +14 -1
- data/Readme.md +23 -11
- data/gemfiles/rails42.gemfile +1 -1
- data/gemfiles/rails42_sprockets3.gemfile +1 -1
- data/gemfiles/rails50.gemfile +8 -0
- data/gemfiles/rails50_sprockets3.gemfile +8 -0
- data/js-routes.gemspec +2 -2
- data/lib/js_routes/engine.rb +62 -14
- data/lib/js_routes/version.rb +1 -1
- data/lib/js_routes.rb +76 -60
- data/lib/routes.js +163 -100
- data/lib/routes.js.coffee +113 -54
- data/spec/js_routes/default_serializer_spec.rb +13 -0
- data/spec/js_routes/generated_javascript_spec.rb +12 -0
- data/spec/js_routes/options_spec.rb +90 -20
- data/spec/js_routes/rails_routes_compatibility_spec.rb +46 -49
- data/spec/js_routes/zzz_last_post_rails_init_spec.rb +3 -9
- data/spec/spec_helper.rb +31 -57
- data/spec/support/routes.rb +71 -0
- metadata +14 -12
- data/Guardfile +0 -3
- data/temp +0 -2
@@ -0,0 +1,13 @@
|
|
1
|
+
describe JsRoutes, "#default_serializer" do
|
2
|
+
|
3
|
+
before(:each) do
|
4
|
+
evaljs(JsRoutes.generate({}))
|
5
|
+
end
|
6
|
+
|
7
|
+
it "should provide this method" do
|
8
|
+
expect(evaljs("Routes.default_serializer({a: 1, b: [2,3], c: {d: 4, e: 5}, f: ''})")).to eq(
|
9
|
+
"a=1&b%5B%5D=2&b%5B%5D=3&c%5Bd%5D=4&c%5Be%5D=5&f="
|
10
|
+
)
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
@@ -9,6 +9,18 @@ describe JsRoutes do
|
|
9
9
|
|
10
10
|
describe "generated js" do
|
11
11
|
subject { JsRoutes.generate }
|
12
|
+
|
13
|
+
it "should set the default serializer when none is configured" do
|
14
|
+
is_expected.to match(%r(custom_serializer: null,\s+serialize: function\(object\) {\s+if \(\(this\.custom_serializer != null\) && this.get_object_type\(this\.custom_serializer\) === \"function\"\) {\s+return this\.custom_serializer\(object\);\s+} else {\s+return this\.default_serializer\(object\);\s+}\s+},))
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should include a comment in the header" do
|
18
|
+
app_class = "App"
|
19
|
+
|
20
|
+
is_expected.to include("File generated by js-routes #{JsRoutes::VERSION}")
|
21
|
+
is_expected.to include("Based on Rails routes of #{app_class}")
|
22
|
+
end
|
23
|
+
|
12
24
|
it "should call route function for each route" do
|
13
25
|
is_expected.to include("inboxes_path: Utils.route(")
|
14
26
|
end
|
@@ -13,6 +13,30 @@ describe JsRoutes, "options" do
|
|
13
13
|
let(:_options) { {} }
|
14
14
|
let(:_warnings) { true }
|
15
15
|
|
16
|
+
context "when serializer is specified" do
|
17
|
+
# define custom serializer
|
18
|
+
# this is a nonsense serializer, which always returns foo=bar
|
19
|
+
# for all inputs
|
20
|
+
let(:_presetup){ %q(function myCustomSerializer(object, prefix) { return "foo=bar"; }) }
|
21
|
+
let(:_options) { {:serializer => "myCustomSerializer"} }
|
22
|
+
|
23
|
+
it "should set configurable serializer" do
|
24
|
+
# expect the nonsense serializer above to have appened foo=bar
|
25
|
+
# to the end of the path
|
26
|
+
expect(evaljs(%q(Routes.inboxes_path()))).to eql("/inboxes?foo=bar")
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
context "when serializer is specified, but not function" do
|
31
|
+
let(:_presetup){ %q(var myCustomSerializer = 1) }
|
32
|
+
let(:_options) { {:serializer => "myCustomSerializer"} }
|
33
|
+
|
34
|
+
it "should set configurable serializer" do
|
35
|
+
# expect to use default
|
36
|
+
expect(evaljs(%q(Routes.inboxes_path({a: 1})))).to eql("/inboxes?a=1")
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
16
40
|
context "when exclude is specified" do
|
17
41
|
|
18
42
|
let(:_options) { {:exclude => /^admin_/} }
|
@@ -114,15 +138,18 @@ describe JsRoutes, "options" do
|
|
114
138
|
expect(evaljs("Routes.inbox_path(1, {format: null})")).to eq(routes.inbox_path(1))
|
115
139
|
end
|
116
140
|
|
117
|
-
it "shouldn't include the format when {:format => false} is specified" do
|
118
|
-
expect(evaljs("Routes.no_format_path()")).to eq(routes.no_format_path)
|
119
|
-
end
|
120
141
|
|
121
142
|
it "shouldn't require the format" do
|
143
|
+
pending if Rails.version < "4.0"
|
122
144
|
expect(evaljs("Routes.json_only_path()")).to eq(routes.json_only_path(:format => 'json'))
|
123
145
|
end
|
124
146
|
end
|
125
147
|
|
148
|
+
it "shouldn't include the format when {:format => false} is specified" do
|
149
|
+
expect(evaljs("Routes.no_format_path()")).to eq(routes.no_format_path())
|
150
|
+
expect(evaljs("Routes.no_format_path({format: 'json'})")).to eq(routes.no_format_path(format: 'json'))
|
151
|
+
end
|
152
|
+
|
126
153
|
describe "when namespace option is specified" do
|
127
154
|
let(:_options) { {:namespace => "PHM"} }
|
128
155
|
it "should use this namespace for routing" do
|
@@ -159,16 +186,24 @@ describe JsRoutes, "options" do
|
|
159
186
|
|
160
187
|
describe "default_url_options" do
|
161
188
|
context "with optional route parts" do
|
162
|
-
|
163
|
-
|
164
|
-
|
189
|
+
context "provided" do
|
190
|
+
let(:_options) { { :default_url_options => { :optional_id => "12", :format => "json" } } }
|
191
|
+
it "should use this opions to fill optional parameters" do
|
192
|
+
expect(evaljs("Routes.things_path()")).to eq(routes.things_path(:optional_id => 12, :format => "json"))
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
context "not provided" do
|
197
|
+
let(:_options) { { :default_url_options => { :format => "json" } } }
|
198
|
+
it "breaks" do
|
199
|
+
expect(evaljs("Routes.foo_all_path()")).to eq(routes.foo_all_path(:format => "json"))
|
200
|
+
end
|
165
201
|
end
|
166
202
|
end
|
167
203
|
|
168
204
|
context "with required route parts" do
|
169
205
|
let(:_options) { {:default_url_options => {:inbox_id => "12"}} }
|
170
206
|
it "should use this opions to fill optional parameters" do
|
171
|
-
pending
|
172
207
|
expect(evaljs("Routes.inbox_messages_path()")).to eq(routes.inbox_messages_path(:inbox_id => 12))
|
173
208
|
end
|
174
209
|
end
|
@@ -284,19 +319,13 @@ describe JsRoutes, "options" do
|
|
284
319
|
end
|
285
320
|
|
286
321
|
context "when configuring with default_url_options" do
|
287
|
-
context "when default host is not specified" do
|
288
|
-
it "raises an error" do
|
289
|
-
expect { JsRoutes.generate({ :url_links => true }) }.to raise_error RuntimeError
|
290
|
-
end
|
291
|
-
end
|
292
|
-
|
293
322
|
context "when only host option is specified" do
|
294
323
|
let(:_options) { { :url_links => true, :default_url_options => {:host => "example.com"} } }
|
295
|
-
|
324
|
+
|
296
325
|
it "uses the specified host, defaults protocol to http, defaults port to 80 (leaving it blank)" do
|
297
326
|
expect(evaljs("Routes.inbox_url(1)")).to eq("http://example.com#{routes.inbox_path(1)}")
|
298
327
|
end
|
299
|
-
|
328
|
+
|
300
329
|
it "does not override protocol when specified in route" do
|
301
330
|
expect(evaljs("Routes.new_session_url()")).to eq("https://example.com#{routes.new_session_path}")
|
302
331
|
end
|
@@ -316,7 +345,7 @@ describe JsRoutes, "options" do
|
|
316
345
|
it "uses the specified protocol and host, defaults port to 80 (leaving it blank)" do
|
317
346
|
expect(evaljs("Routes.inbox_url(1)")).to eq("ftp://example.com#{routes.inbox_path(1)}")
|
318
347
|
end
|
319
|
-
|
348
|
+
|
320
349
|
it "does not override protocol when specified in route" do
|
321
350
|
expect(evaljs("Routes.new_session_url()")).to eq("https://example.com#{routes.new_session_path}")
|
322
351
|
end
|
@@ -340,11 +369,11 @@ describe JsRoutes, "options" do
|
|
340
369
|
it "does not override protocol when specified in route" do
|
341
370
|
expect(evaljs("Routes.new_session_url()")).to eq("https://example.com:3000#{routes.new_session_path}")
|
342
371
|
end
|
343
|
-
|
372
|
+
|
344
373
|
it "does not override host, protocol, or port when host is specified in route" do
|
345
|
-
expect(evaljs("Routes.sso_url()")).to eq(routes.
|
374
|
+
expect(evaljs("Routes.sso_url()")).to eq("http://sso.example.com:3000" + routes.sso_path)
|
346
375
|
end
|
347
|
-
|
376
|
+
|
348
377
|
it "does not override port when specified in route" do
|
349
378
|
expect(evaljs("Routes.portals_url()")).to eq("http://example.com:8080#{routes.portals_path}")
|
350
379
|
end
|
@@ -380,6 +409,47 @@ describe JsRoutes, "options" do
|
|
380
409
|
end
|
381
410
|
end
|
382
411
|
end
|
412
|
+
|
413
|
+
context 'when window.location is present' do
|
414
|
+
let(:current_protocol) { 'http:' } # window.location.protocol includes the colon character
|
415
|
+
let(:current_hostname) { 'current.example.com' }
|
416
|
+
let(:current_port){ '' } # an empty string means port 80
|
417
|
+
let(:current_host) do
|
418
|
+
host = "#{current_hostname}"
|
419
|
+
host += ":#{current_port}" unless current_port == ''
|
420
|
+
host
|
421
|
+
end
|
422
|
+
|
423
|
+
before do
|
424
|
+
jscontext.eval("window = {'location': {'protocol': '#{current_protocol}', 'hostname': '#{current_hostname}', 'port': '#{current_port}', 'host': '#{current_host}'}}")
|
425
|
+
end
|
426
|
+
|
427
|
+
context "without specifying a default host" do
|
428
|
+
let(:_options) { { :url_links => true } }
|
429
|
+
|
430
|
+
it "uses the current host" do
|
431
|
+
expect(evaljs("Routes.inbox_path")).not_to be_nil
|
432
|
+
expect(evaljs("Routes.inbox_url")).not_to be_nil
|
433
|
+
expect(evaljs("Routes.inbox_url(1)")).to eq("http://current.example.com#{routes.inbox_path(1)}")
|
434
|
+
expect(evaljs("Routes.inbox_url(1, { test_key: \"test_val\" })")).to eq("http://current.example.com#{routes.inbox_path(1, :test_key => "test_val")}")
|
435
|
+
expect(evaljs("Routes.new_session_url()")).to eq("https://current.example.com#{routes.new_session_path}")
|
436
|
+
expect(evaljs("Routes.sso_url()")).to eq("http://sso.example.com#{routes.sso_path}")
|
437
|
+
|
438
|
+
end
|
439
|
+
|
440
|
+
it "uses host option as an argument" do
|
441
|
+
expect(evaljs("Routes.portals_url({host: 'another.com'})")).to eq(routes.portals_url(host: 'another.com'))
|
442
|
+
end
|
443
|
+
|
444
|
+
it "uses port option as an argument" do
|
445
|
+
expect(evaljs("Routes.portals_url({host: 'localhost', port: 8080})")).to eq(routes.portals_url(host: 'localhost', port: 8080))
|
446
|
+
end
|
447
|
+
|
448
|
+
it "uses protocol option as an argument" do
|
449
|
+
expect(evaljs("Routes.portals_url({host: 'localhost', protocol: 'https'})")).to eq(routes.portals_url(protocol: 'https', host: 'localhost'))
|
450
|
+
end
|
451
|
+
end
|
452
|
+
end
|
383
453
|
end
|
384
454
|
|
385
455
|
describe "when the compact mode is enabled" do
|
@@ -397,7 +467,7 @@ describe JsRoutes, "options" do
|
|
397
467
|
example.run
|
398
468
|
end
|
399
469
|
end
|
400
|
-
|
470
|
+
|
401
471
|
let(:_options) { { :compact => true, :url_links => "http://localhost" } }
|
402
472
|
it "should not strip urls" do
|
403
473
|
expect(evaljs("Routes.inbox(1)")).to eq(routes.inbox_path(1))
|
@@ -54,11 +54,43 @@ describe JsRoutes, "compatibility with Rails" do
|
|
54
54
|
expect(evaljs("Routes.inbox_path(1, {expanded: true, anchor: 'hello'})")).to eq(routes.inbox_path(1, :expanded => true, :anchor => "hello"))
|
55
55
|
end
|
56
56
|
|
57
|
+
it "should use irregular ActiveSupport pluralizations" do
|
58
|
+
expect(evaljs("Routes.budgies_path()")).to eq(routes.budgies_path)
|
59
|
+
expect(evaljs("Routes.budgie_path(1)")).to eq(routes.budgie_path(1))
|
60
|
+
expect(evaljs("Routes.budgy_path")).to eq(nil)
|
61
|
+
expect(evaljs("Routes.budgie_descendents_path(1)")).to eq(routes.budgie_descendents_path(1))
|
62
|
+
end
|
63
|
+
|
64
|
+
describe "when route has defaults" do
|
65
|
+
it "should support route default format" do
|
66
|
+
expect(evaljs("Routes.api_purchases_path()")).to eq(routes.api_purchases_path)
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'should support route default subdomain' do
|
70
|
+
# root inside namespace is broken
|
71
|
+
# https://github.com/rails/rails/pull/23235
|
72
|
+
pending if Rails.version == '5.0.0'
|
73
|
+
expect(evaljs("Routes.backend_root_path()")).to eq(routes.backend_root_path)
|
74
|
+
end
|
75
|
+
|
76
|
+
it "should support default format override" do
|
77
|
+
expect(evaljs("Routes.api_purchases_path({format: 'xml'})")).to eq(routes.api_purchases_path(format: 'xml'))
|
78
|
+
end
|
79
|
+
|
80
|
+
it "doesn't apply defaults to path" do
|
81
|
+
expect(evaljs("Routes.with_defaults_path()")).to eq(routes.with_defaults_path)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
57
85
|
context "with rails engines" do
|
58
86
|
it "should support simple route" do
|
59
87
|
expect(evaljs("Routes.blog_app_posts_path()")).to eq(blog_routes.posts_path())
|
60
88
|
end
|
61
89
|
|
90
|
+
it "should support root route" do
|
91
|
+
expect(evaljs("Routes.blog_app_path()")).to eq(routes.blog_app_path())
|
92
|
+
end
|
93
|
+
|
62
94
|
it "should support route with parameters" do
|
63
95
|
expect(evaljs("Routes.blog_app_post_path(1)")).to eq(blog_routes.post_path(1))
|
64
96
|
end
|
@@ -74,6 +106,10 @@ describe JsRoutes, "compatibility with Rails" do
|
|
74
106
|
expect(evaljs("Routes.json_only_path({format: 'json'})")).to eq(routes.json_only_path(:format => 'json'))
|
75
107
|
end
|
76
108
|
|
109
|
+
it "should serialize object with empty string value" do
|
110
|
+
expect(evaljs("Routes.inboxes_path({a: '', b: 1})")).to eq(routes.inboxes_path(:a => '', :b => 1))
|
111
|
+
end
|
112
|
+
|
77
113
|
it "should support utf-8 route" do
|
78
114
|
expect(evaljs("Routes.hello_path()")).to eq(routes.hello_path)
|
79
115
|
end
|
@@ -141,48 +177,8 @@ describe JsRoutes, "compatibility with Rails" do
|
|
141
177
|
expect(evaljs("Routes.search_path({q: 'hello'})")).to eq(routes.search_path(:q => 'hello'))
|
142
178
|
end
|
143
179
|
|
144
|
-
it "should
|
145
|
-
|
146
|
-
expect(evaljs("Routes.inboxes_path({hello: {world: null}})")).to eq(routes.inboxes_path(:hello => {world: nil}))
|
147
|
-
end
|
148
|
-
end
|
149
|
-
|
150
|
-
context "when jQuery is present" do
|
151
|
-
before do
|
152
|
-
evaljs("window.jQuery = {};")
|
153
|
-
jscontext[:parameterizeFunc] = lambda {|object| _value.to_param}
|
154
|
-
evaljs("window.jQuery.param = parameterizeFunc")
|
155
|
-
end
|
156
|
-
|
157
|
-
shared_examples_for "serialization" do
|
158
|
-
it "should support serialization of objects" do
|
159
|
-
expect(evaljs("window.jQuery.param(#{_value.to_json})")).to eq(_value.to_param)
|
160
|
-
expect(evaljs("Routes.inboxes_path(#{_value.to_json})")).to eq(routes.inboxes_path(_value))
|
161
|
-
expect(evaljs("Routes.inbox_path(1, #{_value.to_json})")).to eq(routes.inbox_path(1, _value))
|
162
|
-
end
|
163
|
-
end
|
164
|
-
context "when parameters is a hash" do
|
165
|
-
let(:_value) do
|
166
|
-
{:a => {:b => 'c'}, :q => [1,2]}
|
167
|
-
end
|
168
|
-
it_should_behave_like 'serialization'
|
169
|
-
end
|
170
|
-
context "when parameters is null" do
|
171
|
-
let(:_value) do
|
172
|
-
{:hello => {world: nil}}
|
173
|
-
end
|
174
|
-
it_should_behave_like 'serialization'
|
175
|
-
end
|
176
|
-
context "when parameters is null" do
|
177
|
-
let(:_value) do
|
178
|
-
nil
|
179
|
-
end
|
180
|
-
|
181
|
-
before do
|
182
|
-
pending("This test is invalid for nil/null and jruby #{JRUBY_VERSION}") if defined?(JRUBY_VERSION) && '1.7.13' == JRUBY_VERSION
|
183
|
-
end
|
184
|
-
|
185
|
-
it_should_behave_like 'serialization'
|
180
|
+
it "should support nested object null parameters" do
|
181
|
+
expect(evaljs("Routes.inboxes_path({hello: {world: null}})")).to eq(routes.inboxes_path(:hello => {:world => nil}))
|
186
182
|
end
|
187
183
|
end
|
188
184
|
|
@@ -204,17 +200,11 @@ describe JsRoutes, "compatibility with Rails" do
|
|
204
200
|
expect(evaljs("Routes.thing_path(null, 5)")).to eq(routes.thing_path(nil, 5))
|
205
201
|
end
|
206
202
|
|
207
|
-
# Fail for rails 4.2. Reason: https://github.com/rails/rails/issues/12178
|
208
203
|
it "should treat undefined as non-given optional part" do
|
209
|
-
# TODO: remove me after release of rails 4.2.1 (change Appraisals to "~> 4.2.1")
|
210
|
-
pending("This test is invalid for rails 4.2. Reason: https://github.com/rails/rails/issues/12178") if [4, 2, 0] == [Rails::VERSION::MAJOR, Rails::VERSION::MINOR, Rails::VERSION::TINY]
|
211
204
|
expect(evaljs("Routes.thing_path(5, {optional_id: undefined})")).to eq(routes.thing_path(5, :optional_id => nil))
|
212
205
|
end
|
213
206
|
|
214
|
-
# Fail for rails 4.2. Reason: https://github.com/rails/rails/issues/12178
|
215
207
|
it "should treat null as non-given optional part" do
|
216
|
-
# TODO: remove me after release of rails 4.2.1 (change Appraisals to "~> 4.2.1")
|
217
|
-
pending("This test is invalid for rails 4.2. Reason: https://github.com/rails/rails/issues/12178") if [4, 2, 0] == [Rails::VERSION::MAJOR, Rails::VERSION::MINOR, Rails::VERSION::TINY]
|
218
208
|
expect(evaljs("Routes.thing_path(5, {optional_id: null})")).to eq(routes.thing_path(5, :optional_id => nil))
|
219
209
|
end
|
220
210
|
end
|
@@ -224,6 +214,11 @@ describe JsRoutes, "compatibility with Rails" do
|
|
224
214
|
expect(evaljs("Routes.things_path({optional_id: 5})")).to eq(routes.things_path(:optional_id => 5))
|
225
215
|
end
|
226
216
|
|
217
|
+
context "on nested optional parts" do
|
218
|
+
it "should include everything that is not optional" do
|
219
|
+
expect(evaljs("Routes.classic_path({controller: 'classic', action: 'edit'})")).to eq(routes.classic_path(controller: :classic, action: :edit))
|
220
|
+
end
|
221
|
+
end
|
227
222
|
end
|
228
223
|
end
|
229
224
|
|
@@ -321,7 +316,7 @@ describe JsRoutes, "compatibility with Rails" do
|
|
321
316
|
end
|
322
317
|
end
|
323
318
|
|
324
|
-
|
319
|
+
describe "required_params" do
|
325
320
|
it "should show inbox spec" do
|
326
321
|
expect(evaljs("Routes.inbox_path.required_params").to_a).to eq(["id"])
|
327
322
|
end
|
@@ -330,4 +325,6 @@ describe JsRoutes, "compatibility with Rails" do
|
|
330
325
|
expect(evaljs("Routes.inbox_message_path.required_params").to_a).to eq(["inbox_id", "id"])
|
331
326
|
end
|
332
327
|
end
|
328
|
+
|
329
|
+
|
333
330
|
end
|
@@ -55,19 +55,13 @@ describe "after Rails initialization" do
|
|
55
55
|
FileUtils.rm_f(TEST_ASSET_PATH)
|
56
56
|
end
|
57
57
|
|
58
|
-
it "should have registered a preprocessor" do
|
59
|
-
pps = Rails.application.assets.preprocessors
|
60
|
-
js_pps = pps['application/javascript']
|
61
|
-
klass = sprockets_v3? ? 'LegacyProcProcessor' : 'Processor'
|
62
|
-
expect(js_pps.map(&:to_s)).to include("Sprockets::#{klass} (js-routes_dependent_on_routes)")
|
63
|
-
end
|
64
|
-
|
65
58
|
context "the preprocessor" do
|
66
59
|
before(:each) do
|
60
|
+
path = Rails.root.join('config','routes.rb').to_s
|
67
61
|
if sprockets_v3?
|
68
|
-
expect_any_instance_of(Sprockets::Context).to receive(:depend_on).with(
|
62
|
+
expect_any_instance_of(Sprockets::Context).to receive(:depend_on).with(path)
|
69
63
|
else
|
70
|
-
expect(ctx).to receive(:depend_on).with(
|
64
|
+
expect(ctx).to receive(:depend_on).with(path)
|
71
65
|
end
|
72
66
|
end
|
73
67
|
let!(:ctx) do
|
data/spec/spec_helper.rb
CHANGED
@@ -5,7 +5,7 @@ $:.unshift(File.dirname(__FILE__))
|
|
5
5
|
require 'rspec'
|
6
6
|
require 'rails/all'
|
7
7
|
require 'js-routes'
|
8
|
-
require
|
8
|
+
require 'active_support/core_ext/hash/slice'
|
9
9
|
require 'coffee-script'
|
10
10
|
# fix ends_with? error for rails 3.2
|
11
11
|
require 'active_support/core_ext/string/starts_ends_with' if 3 == Rails::VERSION::MAJOR
|
@@ -14,7 +14,7 @@ if defined?(JRUBY_VERSION)
|
|
14
14
|
require 'rhino'
|
15
15
|
JS_LIB_CLASS = Rhino
|
16
16
|
else
|
17
|
-
require
|
17
|
+
require 'v8'
|
18
18
|
JS_LIB_CLASS = V8
|
19
19
|
end
|
20
20
|
|
@@ -42,6 +42,10 @@ def blog_routes
|
|
42
42
|
BlogEngine::Engine.routes.url_helpers
|
43
43
|
end
|
44
44
|
|
45
|
+
ActiveSupport::Inflector.inflections do |inflect|
|
46
|
+
inflect.irregular "budgie", "budgies"
|
47
|
+
end
|
48
|
+
|
45
49
|
|
46
50
|
module BlogEngine
|
47
51
|
class Engine < Rails::Engine
|
@@ -66,59 +70,6 @@ class App < Rails::Application
|
|
66
70
|
config.root = File.expand_path('../dummy', __FILE__)
|
67
71
|
end
|
68
72
|
|
69
|
-
def draw_routes
|
70
|
-
|
71
|
-
BlogEngine::Engine.routes.draw do
|
72
|
-
root to: "application#index"
|
73
|
-
resources :posts
|
74
|
-
end
|
75
|
-
App.routes.draw do
|
76
|
-
|
77
|
-
get 'support(/page/:page)', to: BlogEngine::Engine, as: 'support'
|
78
|
-
|
79
|
-
resources :inboxes do
|
80
|
-
resources :messages do
|
81
|
-
resources :attachments
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
root :to => "inboxes#index"
|
86
|
-
|
87
|
-
namespace :admin do
|
88
|
-
resources :users
|
89
|
-
end
|
90
|
-
|
91
|
-
scope "/returns/:return" do
|
92
|
-
resources :objects
|
93
|
-
end
|
94
|
-
resources :returns
|
95
|
-
|
96
|
-
scope "(/optional/:optional_id)" do
|
97
|
-
resources :things
|
98
|
-
end
|
99
|
-
|
100
|
-
get "/other_optional/(:optional_id)" => "foo#foo", :as => :foo
|
101
|
-
|
102
|
-
get 'books/*section/:title' => 'books#show', :as => :book
|
103
|
-
get 'books/:title/*section' => 'books#show', :as => :book_title
|
104
|
-
|
105
|
-
mount BlogEngine::Engine => "/blog", :as => :blog_app
|
106
|
-
|
107
|
-
get '/no_format' => "foo#foo", :format => false, :as => :no_format
|
108
|
-
|
109
|
-
get '/json_only' => "foo#foo", :format => true, :constraints => {:format => /json/}, :as => :json_only
|
110
|
-
|
111
|
-
get '/привет' => "foo#foo", :as => :hello
|
112
|
-
get '(/o/:organization)/search/:q' => "foo#foo", as: :search
|
113
|
-
|
114
|
-
resources :sessions, :only => [:new, :create, :destroy], :protocol => 'https'
|
115
|
-
|
116
|
-
get '/' => 'sso#login', host: 'sso.example.com', as: :sso
|
117
|
-
|
118
|
-
resources :portals, :port => 8080
|
119
|
-
end
|
120
|
-
|
121
|
-
end
|
122
73
|
|
123
74
|
# prevent warning
|
124
75
|
Rails.configuration.active_support.deprecation = :log
|
@@ -135,7 +86,9 @@ RSpec.configure do |config|
|
|
135
86
|
config.before(:all) do
|
136
87
|
# compile all js files begin
|
137
88
|
Dir["#{File.expand_path(File.join(File.dirname(__FILE__), "..", "lib"))}/**/*.coffee"].each do |coffee|
|
138
|
-
File.open(coffee.gsub(/\.coffee$/, ""), 'w')
|
89
|
+
File.open(coffee.gsub(/\.coffee$/, ""), 'w') do |f|
|
90
|
+
f.write(CoffeeScript.compile(File.read(coffee)).lstrip)
|
91
|
+
end
|
139
92
|
end
|
140
93
|
# compile all js files end
|
141
94
|
draw_routes
|
@@ -143,6 +96,27 @@ RSpec.configure do |config|
|
|
143
96
|
|
144
97
|
config.before :each do
|
145
98
|
evaljs("var window = this;", true)
|
146
|
-
|
99
|
+
|
100
|
+
def inspectify(value)
|
101
|
+
case value
|
102
|
+
when V8::Array
|
103
|
+
value.map do |v|
|
104
|
+
inspectify(v)
|
105
|
+
end
|
106
|
+
when V8::Object
|
107
|
+
require 'byebug'; byebug
|
108
|
+
value.to_h.map do |k,v|
|
109
|
+
[k, inspectify(v)]
|
110
|
+
end.to_h
|
111
|
+
when String, nil, Fixnum, FalseClass, TrueClass
|
112
|
+
value
|
113
|
+
else
|
114
|
+
raise "wtf #{value.class}?"
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
118
|
+
jscontext[:log] = lambda do |context, value|
|
119
|
+
puts inspectify(value).to_json
|
120
|
+
end
|
147
121
|
end
|
148
122
|
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
def draw_routes
|
2
|
+
|
3
|
+
BlogEngine::Engine.routes.draw do
|
4
|
+
root to: "application#index"
|
5
|
+
resources :posts
|
6
|
+
end
|
7
|
+
App.routes.draw do
|
8
|
+
|
9
|
+
get 'support(/page/:page)', to: BlogEngine::Engine, as: 'support'
|
10
|
+
|
11
|
+
resources :inboxes do
|
12
|
+
resources :messages do
|
13
|
+
resources :attachments
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
root :to => "inboxes#index"
|
18
|
+
|
19
|
+
namespace :admin do
|
20
|
+
resources :users
|
21
|
+
end
|
22
|
+
|
23
|
+
scope "/returns/:return" do
|
24
|
+
resources :objects
|
25
|
+
end
|
26
|
+
resources :returns
|
27
|
+
|
28
|
+
scope "(/optional/:optional_id)" do
|
29
|
+
resources :things
|
30
|
+
end
|
31
|
+
|
32
|
+
get "/:controller(/:action(/:id))" => "classic#classic", :as => :classic
|
33
|
+
|
34
|
+
get "/other_optional/(:optional_id)" => "foo#foo", :as => :foo
|
35
|
+
get '/other_optional(/*optional_id)' => 'foo#foo', :as => :foo_all
|
36
|
+
|
37
|
+
get 'books/*section/:title' => 'books#show', :as => :book
|
38
|
+
get 'books/:title/*section' => 'books#show', :as => :book_title
|
39
|
+
|
40
|
+
mount BlogEngine::Engine => "/blog", :as => :blog_app
|
41
|
+
|
42
|
+
get '/no_format' => "foo#foo", :format => false, :as => :no_format
|
43
|
+
|
44
|
+
get '/json_only' => "foo#foo", :format => true, :constraints => {:format => /json/}, :as => :json_only
|
45
|
+
|
46
|
+
get '/привет' => "foo#foo", :as => :hello
|
47
|
+
get '(/o/:organization)/search/:q' => "foo#foo", as: :search
|
48
|
+
|
49
|
+
resources :sessions, :only => [:new, :create, :destroy], :protocol => 'https'
|
50
|
+
|
51
|
+
get '/' => 'sso#login', host: 'sso.example.com', as: :sso
|
52
|
+
|
53
|
+
resources :portals, :port => 8080
|
54
|
+
|
55
|
+
get '/with_defaults' => 'foo#foo', defaults: { bar: 'tested', format: :json }, format: :true
|
56
|
+
|
57
|
+
namespace :api, format: true, defaults: {format: 'json'} do
|
58
|
+
get "/purchases" => "purchases#index"
|
59
|
+
end
|
60
|
+
|
61
|
+
resources :budgies do
|
62
|
+
get "descendents"
|
63
|
+
end
|
64
|
+
|
65
|
+
namespace :backend, path: '', constraints: {subdomain: 'backend'} do
|
66
|
+
root to: 'backend#index'
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|