js-routes 0.9.9 → 1.0.0
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 +13 -2
- data/Appraisals +4 -2
- data/CHANGELOG.md +10 -1
- data/Readme.md +35 -7
- data/gemfiles/rails32.gemfile +1 -1
- data/gemfiles/rails40.gemfile +1 -2
- data/gemfiles/rails41.gemfile +1 -2
- data/gemfiles/rails42.gemfile +7 -0
- data/js-routes.gemspec +2 -4
- data/lib/js_routes.rb +45 -15
- data/lib/js_routes/version.rb +1 -1
- data/lib/routes.js +41 -0
- data/lib/routes.js.coffee +32 -0
- data/spec/js_routes/generated_javascript_spec.rb +14 -4
- data/spec/js_routes/options_spec.rb +157 -26
- data/spec/js_routes/rails_routes_compatibility_spec.rb +41 -2
- data/spec/spec_helper.rb +6 -0
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 82dc4e938c01969d6fa291afba76adbdc12106ce
|
4
|
+
data.tar.gz: ccab6107d6e2a86ab1529a2fa4ce06e4af50c820
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 027362db5b8c3f3848cdea09fa9095364a3307e9f492ca5d871d9174e676e05492d5149818f76df989b53e15499465287c93644fa19b0b55117da8b1ed0db0b8
|
7
|
+
data.tar.gz: bbe7ac6a521322201322a01dcb847dcee803f8524dd1f190c17e5c99fe24fb5a6b57d27dd66644ff0b5be4c4fbc733dc69853d619cda8c975e7269f182daddcb
|
data/.travis.yml
CHANGED
@@ -1,22 +1,33 @@
|
|
1
1
|
language: ruby
|
2
|
+
cache: bundler
|
3
|
+
|
2
4
|
rvm:
|
3
5
|
- 1.9.3
|
4
|
-
- 2.0
|
5
|
-
- 2.1
|
6
|
+
- 2.0
|
7
|
+
- 2.1
|
8
|
+
- 2.2
|
6
9
|
- jruby-19mode
|
7
10
|
- ruby-head
|
8
11
|
- jruby-head
|
12
|
+
|
9
13
|
gemfile:
|
10
14
|
- gemfiles/rails32.gemfile
|
11
15
|
- gemfiles/rails40.gemfile
|
12
16
|
- gemfiles/rails41.gemfile
|
17
|
+
- gemfiles/rails42.gemfile
|
18
|
+
|
19
|
+
sudo: false
|
20
|
+
|
13
21
|
notifications:
|
14
22
|
email:
|
15
23
|
- agresso@gmail.com
|
24
|
+
|
16
25
|
branches:
|
17
26
|
only:
|
18
27
|
- master
|
28
|
+
|
19
29
|
matrix:
|
20
30
|
allow_failures:
|
31
|
+
- rvm: jruby-19mode
|
21
32
|
- rvm: ruby-head
|
22
33
|
- rvm: jruby-head
|
data/Appraisals
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,14 @@
|
|
1
1
|
## master
|
2
2
|
|
3
|
+
* Add the compact mode [#125](https://github.com/railsware/js-routes/pull/125)
|
4
|
+
* Add support for host, protocol, and port configuration [#137](https://github.com/railsware/js-routes/pull/137)
|
5
|
+
* Routes path specs [#135](https://github.com/railsware/js-routes/pull/135)
|
6
|
+
* Support Rails 4.2 and Ruby 2.2 [#140](https://github.com/railsware/js-routes/pull/140)
|
7
|
+
|
8
|
+
## v0.9.9
|
9
|
+
|
10
|
+
* Bugfix Rails Engine subapplication route generation when they are nested [#120](https://github.com/railsware/js-routes/pull/120)
|
11
|
+
|
3
12
|
## v0.9.8
|
4
13
|
|
5
14
|
* Support AMD/Require.js [#111](https://github.com/railsware/js-routes/pull/111)
|
@@ -11,4 +20,4 @@
|
|
11
20
|
* Fix typeof error for IE [#95](https://github.com/railsware/js-routes/pull/95)
|
12
21
|
* Fix testing on ruby-head [#92](https://github.com/railsware/js-routes/pull/92)
|
13
22
|
* Correct thread safety issue in js-routes generation [#90](https://github.com/railsware/js-routes/pull/90)
|
14
|
-
* Use the `of` operator to detect for `to_param` and `id` in objects [#87](https://github.com/railsware/js-routes/pull/87)
|
23
|
+
* Use the `of` operator to detect for `to_param` and `id` in objects [#87](https://github.com/railsware/js-routes/pull/87)
|
data/Readme.md
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# JsRoutes
|
2
|
-
[](https://travis-ci.org/railsware/js-routes)
|
3
3
|
|
4
4
|
Generates javascript file that defines all Rails named routes as javascript helpers
|
5
5
|
|
@@ -43,9 +43,10 @@ end
|
|
43
43
|
|
44
44
|
Available options:
|
45
45
|
|
46
|
-
* `default_url_options` - default parameters
|
47
|
-
* Note that
|
48
|
-
*
|
46
|
+
* `default_url_options` - default parameters used when generating URLs
|
47
|
+
* Note that only specific options are supported at this time.
|
48
|
+
* Supported options: `:format`, `:trailing_slash`, `:protocol`, `:host`, `:port`
|
49
|
+
* Example: {:format => "json", :trailing_slash => true, :protocol => "https", :host => "example.com", :port => 3000}
|
49
50
|
* Default: {}
|
50
51
|
* `exclude` - Array of regexps to exclude from js routes.
|
51
52
|
* Default: []
|
@@ -61,9 +62,13 @@ Available options:
|
|
61
62
|
* Default: blank
|
62
63
|
* `camel_case` (version >= 0.8.8) - Generate camel case route names.
|
63
64
|
* Default: false
|
64
|
-
* `url_links` (version >= 0.8.9) - Generate `*_url`
|
65
|
-
* Example:
|
65
|
+
* `url_links` (version >= 0.8.9) - Generate `*_url` helpers (in addition to the default `*_path` helpers).
|
66
|
+
* Example: true
|
66
67
|
* Default: false
|
68
|
+
* Be sure to specify a default host in `default_url_options`. Routes which specify a specific host, protocol, or port will be used instead of their corresponding default.
|
69
|
+
* `compact` (version > 0.9.9) - Remove `_path` suffix in path routes(`*_url` routes stay untouched if they were enabled)
|
70
|
+
* Default: false
|
71
|
+
* Sample route call when option is set to true: Routes.users() => `/users`
|
67
72
|
|
68
73
|
### Very Advanced Setup
|
69
74
|
|
@@ -129,6 +134,29 @@ In order to make routes helpers available globally:
|
|
129
134
|
jQuery.extend(window, Routes)
|
130
135
|
```
|
131
136
|
|
137
|
+
## Get spec of routes and required params
|
138
|
+
|
139
|
+
Possible to get `spec` of route by function `toString`:
|
140
|
+
|
141
|
+
```js
|
142
|
+
Routes.users_path.toString() // => "/users(.:format)"
|
143
|
+
Routes.user_path.toString() // => "/users/:id(.:format)"
|
144
|
+
```
|
145
|
+
|
146
|
+
This function allow to get the same `spec` for route, if you will get string representation of the route function:
|
147
|
+
|
148
|
+
```js
|
149
|
+
'' + Routes.users_path // => "/users(.:format)", a string representation of the object
|
150
|
+
'' + Routes.user_path // => "/users/:id(.:format)"
|
151
|
+
```
|
152
|
+
|
153
|
+
Route function also contain inside attribute `required_params` required param names as array:
|
154
|
+
|
155
|
+
```js
|
156
|
+
Routes.users_path.required_params // => []
|
157
|
+
Routes.user_path.required_params // => ['id']
|
158
|
+
```
|
159
|
+
|
132
160
|
## What about security?
|
133
161
|
|
134
162
|
js-routes itself do not have security holes. It makes URLs
|
@@ -145,7 +173,7 @@ Spork.trap_method(JsRoutes, :generate!)
|
|
145
173
|
|
146
174
|
## JS-Routes and heroku
|
147
175
|
|
148
|
-
Heroku environment has a specific problems with setup. It is impossible to use asset pipeline in this
|
176
|
+
Heroku environment has a specific problems with setup. It is impossible to use asset pipeline in this environment. You should use "Very Advanced Setup" schema in this case.
|
149
177
|
|
150
178
|
For example create routes.js.erb in assets folder with needed content:
|
151
179
|
|
data/gemfiles/rails32.gemfile
CHANGED
data/gemfiles/rails40.gemfile
CHANGED
data/gemfiles/rails41.gemfile
CHANGED
data/js-routes.gemspec
CHANGED
@@ -18,7 +18,6 @@ Gem::Specification.new do |s|
|
|
18
18
|
s.homepage = %q{http://github.com/railsware/js-routes}
|
19
19
|
s.licenses = ["MIT"]
|
20
20
|
s.require_paths = ["lib"]
|
21
|
-
s.rubygems_version = %q{1.6.0}
|
22
21
|
s.summary = %q{Brings Rails named routes to javascript}
|
23
22
|
|
24
23
|
s.add_runtime_dependency(%q<railties>, [">= 3.2"])
|
@@ -29,10 +28,9 @@ Gem::Specification.new do |s|
|
|
29
28
|
s.add_development_dependency(%q<guard-coffeescript>, [">= 0"])
|
30
29
|
s.add_development_dependency(%q<appraisal>, [">= 0.5.2"])
|
31
30
|
if defined?(JRUBY_VERSION)
|
32
|
-
s.add_development_dependency(%q<therubyrhino>, [">= 0"])
|
31
|
+
s.add_development_dependency(%q<therubyrhino>, [">= 2.0.4"])
|
33
32
|
else
|
34
|
-
s.add_development_dependency(%q<
|
35
|
-
s.add_development_dependency(%q<therubyracer>, [">= 0"])
|
33
|
+
s.add_development_dependency(%q<therubyracer>, [">= 0.12.1"])
|
36
34
|
end
|
37
35
|
end
|
38
36
|
|
data/lib/js_routes.rb
CHANGED
@@ -18,7 +18,8 @@ class JsRoutes
|
|
18
18
|
prefix: nil,
|
19
19
|
url_links: nil,
|
20
20
|
camel_case: false,
|
21
|
-
default_url_options: {}
|
21
|
+
default_url_options: {},
|
22
|
+
compact: false
|
22
23
|
}
|
23
24
|
|
24
25
|
NODE_TYPES = {
|
@@ -124,8 +125,9 @@ class JsRoutes
|
|
124
125
|
|
125
126
|
def js_routes
|
126
127
|
js_routes = Rails.application.routes.named_routes.routes.sort_by(&:to_s).map do |_, route|
|
127
|
-
|
128
|
-
|
128
|
+
rails_engine_app = get_app_from_route(route)
|
129
|
+
if rails_engine_app.respond_to?(:superclass) && rails_engine_app.superclass == Rails::Engine && !route.path.anchored
|
130
|
+
rails_engine_app.routes.named_routes.map do |_, engine_route|
|
129
131
|
build_route_if_match(engine_route, route)
|
130
132
|
end
|
131
133
|
else
|
@@ -136,6 +138,15 @@ class JsRoutes
|
|
136
138
|
"{\n" + js_routes.join(",\n") + "}\n"
|
137
139
|
end
|
138
140
|
|
141
|
+
def get_app_from_route(route)
|
142
|
+
# rails engine in Rails 4.2 use additional ActionDispatch::Routing::Mapper::Constraints, which contain app
|
143
|
+
if route.app.respond_to?(:app) && route.app.respond_to?(:constraints)
|
144
|
+
route.app.app
|
145
|
+
else
|
146
|
+
route.app
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
139
150
|
def build_route_if_match(route, parent_route=nil)
|
140
151
|
if any_match?(route, parent_route, @options[:exclude]) || !any_match?(route, parent_route, @options[:include])
|
141
152
|
nil
|
@@ -154,28 +165,47 @@ class JsRoutes
|
|
154
165
|
parent_spec = parent_route.try(:path).try(:spec)
|
155
166
|
required_parts, optional_parts = route.required_parts.clone, route.optional_parts.clone
|
156
167
|
optional_parts.push(required_parts.delete :format) if required_parts.include?(:format)
|
157
|
-
route_name = generate_route_name(name)
|
158
|
-
url_link = generate_url_link(name, route_name, required_parts)
|
168
|
+
route_name = generate_route_name(name, (:path unless @options[:compact]))
|
169
|
+
url_link = generate_url_link(name, route_name, required_parts, route)
|
159
170
|
_ = <<-JS.strip!
|
160
171
|
// #{name.join('.')} => #{parent_spec}#{route.path.spec}
|
161
|
-
|
162
|
-
|
163
|
-
}#{",\n" + url_link if url_link.length > 0}
|
172
|
+
// function(#{[required_parts, LAST_OPTIONS_KEY].flatten.join(', ')})
|
173
|
+
#{route_name}: Utils.route(#{json(required_parts)}, #{json(optional_parts)}, #{json(serialize(route.path.spec, parent_spec))}, arguments)#{",\n" + url_link if url_link.length > 0}
|
164
174
|
JS
|
165
175
|
end
|
166
176
|
|
167
|
-
def generate_url_link(name, route_name, required_parts)
|
177
|
+
def generate_url_link(name, route_name, required_parts, route)
|
168
178
|
return "" unless @options[:url_links]
|
169
|
-
raise "invalid URL format in url_links (ex: http[s]://example.com)" if @options[:url_links].match(URI::regexp(%w(http https))).nil?
|
170
179
|
_ = <<-JS.strip!
|
171
|
-
#{generate_route_name(name,
|
172
|
-
return
|
180
|
+
#{generate_route_name(name, :url)}: function(#{build_params(required_parts)}) {
|
181
|
+
return #{generate_base_url_js(route)} + this.#{route_name}(#{build_params(required_parts)});
|
173
182
|
}
|
174
183
|
JS
|
175
184
|
end
|
176
185
|
|
177
|
-
def
|
178
|
-
|
186
|
+
def generate_base_url_js(route)
|
187
|
+
# preserve and deprecate previous behavior
|
188
|
+
unless @options[:url_links] == true
|
189
|
+
ActiveSupport::Deprecation.warn('js-routes url_links config value must be a boolean. Use default_url_options for specifying a default host.')
|
190
|
+
raise "invalid URL format in url_links (ex: http[s]://example.com)" if @options[:url_links].match(URI::Parser.new.make_regexp(%w(http https))).nil?
|
191
|
+
return "#{@options[:url_links].inspect}"
|
192
|
+
else
|
193
|
+
protocol = route.defaults[:protocol] || @options[:default_url_options][:protocol] || 'http'
|
194
|
+
hostname = route.defaults[:host] || @options[:default_url_options][:host]
|
195
|
+
port = route.defaults[:port] || (@options[:default_url_options][:port] unless route.defaults[:host])
|
196
|
+
port = ":#{port}" if port
|
197
|
+
|
198
|
+
unless hostname
|
199
|
+
raise "A :default_url_options[:host] must be configured in order to generate *_url helpers"
|
200
|
+
end
|
201
|
+
|
202
|
+
return %Q|'#{protocol}://#{hostname}#{port}'|
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
206
|
+
def generate_route_name(name, suffix)
|
207
|
+
route_name = name.join('_')
|
208
|
+
route_name << "_#{ suffix }" if suffix
|
179
209
|
@options[:camel_case] ? route_name.camelize(:lower) : route_name
|
180
210
|
end
|
181
211
|
|
@@ -183,7 +213,7 @@ class JsRoutes
|
|
183
213
|
self.class.json(string)
|
184
214
|
end
|
185
215
|
|
186
|
-
def build_params
|
216
|
+
def build_params(required_parts)
|
187
217
|
params = required_parts.map do |name|
|
188
218
|
# prepending each parameter name with underscore
|
189
219
|
# to prevent conflict with JS reserved words
|
data/lib/js_routes/version.rb
CHANGED
data/lib/routes.js
CHANGED
@@ -233,6 +233,35 @@
|
|
233
233
|
throw new Error("Unknown Rails node type");
|
234
234
|
}
|
235
235
|
},
|
236
|
+
build_path_spec: function(route, wildcard) {
|
237
|
+
var left, right, type;
|
238
|
+
|
239
|
+
if (wildcard == null) {
|
240
|
+
wildcard = false;
|
241
|
+
}
|
242
|
+
type = route[0], left = route[1], right = route[2];
|
243
|
+
switch (type) {
|
244
|
+
case NodeTypes.GROUP:
|
245
|
+
return "(" + (this.build_path_spec(left)) + ")";
|
246
|
+
case NodeTypes.CAT:
|
247
|
+
return "" + (this.build_path_spec(left)) + (this.build_path_spec(right));
|
248
|
+
case NodeTypes.STAR:
|
249
|
+
return this.build_path_spec(left, true);
|
250
|
+
case NodeTypes.SYMBOL:
|
251
|
+
if (wildcard === true) {
|
252
|
+
return "" + (left[0] === '*' ? '' : '*') + left;
|
253
|
+
} else {
|
254
|
+
return ":" + left;
|
255
|
+
}
|
256
|
+
break;
|
257
|
+
case NodeTypes.SLASH:
|
258
|
+
case NodeTypes.DOT:
|
259
|
+
case NodeTypes.LITERAL:
|
260
|
+
return left;
|
261
|
+
default:
|
262
|
+
throw new Error("Unknown Rails node type");
|
263
|
+
}
|
264
|
+
},
|
236
265
|
visit_globbing: function(route, parameters, optional) {
|
237
266
|
var left, right, type, value;
|
238
267
|
|
@@ -263,6 +292,18 @@
|
|
263
292
|
}
|
264
293
|
return prefix;
|
265
294
|
},
|
295
|
+
route: function(required_parts, optional_parts, route_spec) {
|
296
|
+
var path_fn;
|
297
|
+
|
298
|
+
path_fn = function() {
|
299
|
+
return Utils.build_path(required_parts, optional_parts, route_spec, arguments);
|
300
|
+
};
|
301
|
+
path_fn.required_params = required_parts;
|
302
|
+
path_fn.toString = function() {
|
303
|
+
return Utils.build_path_spec(route_spec);
|
304
|
+
};
|
305
|
+
return path_fn;
|
306
|
+
},
|
266
307
|
_classToTypeCache: null,
|
267
308
|
_classToType: function() {
|
268
309
|
var name, _i, _len, _ref;
|
data/lib/routes.js.coffee
CHANGED
@@ -167,6 +167,29 @@ Utils =
|
|
167
167
|
else
|
168
168
|
throw new Error("Unknown Rails node type")
|
169
169
|
|
170
|
+
#
|
171
|
+
# This method build spec for route
|
172
|
+
#
|
173
|
+
build_path_spec: (route, wildcard=false) ->
|
174
|
+
[type, left, right] = route
|
175
|
+
switch type
|
176
|
+
when NodeTypes.GROUP
|
177
|
+
"(#{@build_path_spec(left)})"
|
178
|
+
when NodeTypes.CAT
|
179
|
+
"#{@build_path_spec(left)}#{@build_path_spec(right)}"
|
180
|
+
when NodeTypes.STAR
|
181
|
+
@build_path_spec(left, true)
|
182
|
+
when NodeTypes.SYMBOL
|
183
|
+
if wildcard is true
|
184
|
+
"#{if left[0] is '*' then '' else '*'}#{left}"
|
185
|
+
else
|
186
|
+
":#{left}"
|
187
|
+
when NodeTypes.SLASH, NodeTypes.DOT, NodeTypes.LITERAL
|
188
|
+
left
|
189
|
+
# Not sure about this one
|
190
|
+
# when NodeTypes.OR
|
191
|
+
else throw new Error("Unknown Rails node type")
|
192
|
+
|
170
193
|
#
|
171
194
|
# This method convert value for globbing in right value for rails route
|
172
195
|
#
|
@@ -191,6 +214,15 @@ Utils =
|
|
191
214
|
prefix = (if prefix.match("/$") then prefix else "#{prefix}/") if prefix isnt ""
|
192
215
|
prefix
|
193
216
|
|
217
|
+
#
|
218
|
+
# route function: create route path function and add spec to it
|
219
|
+
#
|
220
|
+
route: (required_parts, optional_parts, route_spec) ->
|
221
|
+
path_fn = -> Utils.build_path(required_parts, optional_parts, route_spec, arguments)
|
222
|
+
path_fn.required_params = required_parts
|
223
|
+
path_fn.toString = -> Utils.build_path_spec(route_spec)
|
224
|
+
path_fn
|
225
|
+
|
194
226
|
#
|
195
227
|
# This is helper method to define object type.
|
196
228
|
# The typeof operator is probably the biggest design flaw of JavaScript, simply because it's basically completely broken.
|
@@ -9,14 +9,24 @@ describe JsRoutes do
|
|
9
9
|
|
10
10
|
describe "generated js" do
|
11
11
|
subject { JsRoutes.generate }
|
12
|
+
it "should call route function for each route" do
|
13
|
+
is_expected.to include("inboxes_path: Utils.route(")
|
14
|
+
end
|
12
15
|
it "should have correct function without arguments signature" do
|
13
|
-
is_expected.to include("inboxes_path:
|
16
|
+
is_expected.to include("inboxes_path: Utils.route([]")
|
14
17
|
end
|
15
18
|
it "should have correct function with arguments signature" do
|
16
|
-
is_expected.to include("inbox_message_path:
|
19
|
+
is_expected.to include("inbox_message_path: Utils.route([\"inbox_id\",\"id\"]")
|
17
20
|
end
|
18
21
|
it "should have correct function signature with unordered hash" do
|
19
|
-
is_expected.to include("inbox_message_attachment_path:
|
22
|
+
is_expected.to include("inbox_message_attachment_path: Utils.route([\"inbox_id\",\"message_id\",\"id\"]")
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should have correct function comment with options argument" do
|
26
|
+
is_expected.to include("// function(options)\n inboxes_path: Utils.route")
|
27
|
+
end
|
28
|
+
it "should have correct function comment with arguments" do
|
29
|
+
is_expected.to include("// function(inbox_id, message_id, options)\n new_inbox_message_attachment_path: Utils.route")
|
20
30
|
end
|
21
31
|
|
22
32
|
it "routes should be sorted in alphabetical order" do
|
@@ -51,7 +61,7 @@ describe JsRoutes do
|
|
51
61
|
describe "compiled javascript asset" do
|
52
62
|
subject { ERB.new(File.read("app/assets/javascripts/js-routes.js.erb")).result(binding) }
|
53
63
|
it "should have js routes code" do
|
54
|
-
is_expected.to include("inbox_message_path:
|
64
|
+
is_expected.to include("inbox_message_path: Utils.route([\"inbox_id\",\"id\"]")
|
55
65
|
end
|
56
66
|
end
|
57
67
|
end
|
@@ -238,40 +238,171 @@ describe JsRoutes, "options" do
|
|
238
238
|
end
|
239
239
|
end
|
240
240
|
|
241
|
-
context
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
241
|
+
context 'with deprecated, non-boolean config value' do
|
242
|
+
around(:each) do |example|
|
243
|
+
ActiveSupport::Deprecation.silence do
|
244
|
+
example.run
|
245
|
+
end
|
246
|
+
end
|
247
|
+
|
248
|
+
context "with host" do
|
249
|
+
let(:_options) { { :url_links => "http://localhost" } }
|
250
|
+
it "should generate path and url links" do
|
251
|
+
expect(evaljs("Routes.inbox_path")).not_to be_nil
|
252
|
+
expect(evaljs("Routes.inbox_url")).not_to be_nil
|
253
|
+
expect(evaljs("Routes.inbox_path(1)")).to eq(routes.inbox_path(1))
|
254
|
+
expect(evaljs("Routes.inbox_url(1)")).to eq("http://localhost#{routes.inbox_path(1)}")
|
255
|
+
expect(evaljs("Routes.inbox_url(1, { test_key: \"test_val\" })")).to eq("http://localhost#{routes.inbox_path(1, :test_key => "test_val")}")
|
256
|
+
end
|
249
257
|
end
|
250
|
-
end
|
251
258
|
|
252
|
-
|
253
|
-
|
254
|
-
|
259
|
+
context "with invalid host" do
|
260
|
+
it "should raise error" do
|
261
|
+
expect { JsRoutes.generate({ :url_links => "localhost" }) }.to raise_error RuntimeError
|
262
|
+
end
|
263
|
+
end
|
264
|
+
|
265
|
+
context "with host and camel_case" do
|
266
|
+
let(:_options) { { :camel_case => true, :url_links => "http://localhost" } }
|
267
|
+
it "should generate path and url links" do
|
268
|
+
expect(evaljs("Routes.inboxPath")).not_to be_nil
|
269
|
+
expect(evaljs("Routes.inboxUrl")).not_to be_nil
|
270
|
+
expect(evaljs("Routes.inboxPath(1)")).to eq(routes.inbox_path(1))
|
271
|
+
expect(evaljs("Routes.inboxUrl(1)")).to eq("http://localhost#{routes.inbox_path(1)}")
|
272
|
+
end
|
273
|
+
end
|
274
|
+
|
275
|
+
context "with host and prefix" do
|
276
|
+
let(:_options) { { :prefix => "/api", :url_links => "https://example.com" } }
|
277
|
+
it "should generate path and url links" do
|
278
|
+
expect(evaljs("Routes.inbox_path")).not_to be_nil
|
279
|
+
expect(evaljs("Routes.inbox_url")).not_to be_nil
|
280
|
+
expect(evaljs("Routes.inbox_path(1)")).to eq("/api#{routes.inbox_path(1)}")
|
281
|
+
expect(evaljs("Routes.inbox_url(1)")).to eq("https://example.com/api#{routes.inbox_path(1)}")
|
282
|
+
end
|
255
283
|
end
|
256
284
|
end
|
257
285
|
|
258
|
-
context "
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
286
|
+
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
|
+
context "when only host option is specified" do
|
294
|
+
let(:_options) { { :url_links => true, :default_url_options => {:host => "example.com"} } }
|
295
|
+
|
296
|
+
it "uses the specified host, defaults protocol to http, defaults port to 80 (leaving it blank)" do
|
297
|
+
expect(evaljs("Routes.inbox_url(1)")).to eq("http://example.com#{routes.inbox_path(1)}")
|
298
|
+
end
|
299
|
+
|
300
|
+
it "does not override protocol when specified in route" do
|
301
|
+
expect(evaljs("Routes.new_session_url()")).to eq("https://example.com#{routes.new_session_path}")
|
302
|
+
end
|
303
|
+
|
304
|
+
it "does not override host when specified in route" do
|
305
|
+
expect(evaljs("Routes.sso_url()")).to eq(routes.sso_url)
|
306
|
+
end
|
307
|
+
|
308
|
+
it "does not override port when specified in route" do
|
309
|
+
expect(evaljs("Routes.portals_url()")).to eq("http://example.com:8080#{routes.portals_path}")
|
310
|
+
end
|
311
|
+
end
|
312
|
+
|
313
|
+
context "when default host and protocol are specified" do
|
314
|
+
let(:_options) { { :url_links => true, :default_url_options => {:host => "example.com", :protocol => "ftp"} } }
|
315
|
+
|
316
|
+
it "uses the specified protocol and host, defaults port to 80 (leaving it blank)" do
|
317
|
+
expect(evaljs("Routes.inbox_url(1)")).to eq("ftp://example.com#{routes.inbox_path(1)}")
|
318
|
+
end
|
319
|
+
|
320
|
+
it "does not override protocol when specified in route" do
|
321
|
+
expect(evaljs("Routes.new_session_url()")).to eq("https://example.com#{routes.new_session_path}")
|
322
|
+
end
|
323
|
+
|
324
|
+
it "does not override host when host is specified in route" do
|
325
|
+
expect(evaljs("Routes.sso_url()")).to eq("ftp://sso.example.com#{routes.sso_path}")
|
326
|
+
end
|
327
|
+
|
328
|
+
it "does not override port when specified in route" do
|
329
|
+
expect(evaljs("Routes.portals_url()")).to eq("ftp://example.com:8080#{routes.portals_path}")
|
330
|
+
end
|
331
|
+
end
|
332
|
+
|
333
|
+
context "when default host and port are specified" do
|
334
|
+
let(:_options) { { :url_links => true, :default_url_options => {:host => "example.com", :port => 3000} } }
|
335
|
+
|
336
|
+
it "uses the specified host and port, defaults protocol to http" do
|
337
|
+
expect(evaljs("Routes.inbox_url(1)")).to eq("http://example.com:3000#{routes.inbox_path(1)}")
|
338
|
+
end
|
339
|
+
|
340
|
+
it "does not override protocol when specified in route" do
|
341
|
+
expect(evaljs("Routes.new_session_url()")).to eq("https://example.com:3000#{routes.new_session_path}")
|
342
|
+
end
|
343
|
+
|
344
|
+
it "does not override host, protocol, or port when host is specified in route" do
|
345
|
+
expect(evaljs("Routes.sso_url()")).to eq(routes.sso_url)
|
346
|
+
end
|
347
|
+
|
348
|
+
it "does not override port when specified in route" do
|
349
|
+
expect(evaljs("Routes.portals_url()")).to eq("http://example.com:8080#{routes.portals_path}")
|
350
|
+
end
|
351
|
+
end
|
352
|
+
|
353
|
+
context "with camel_case option" do
|
354
|
+
let(:_options) { { :camel_case => true, :url_links => true, :default_url_options => {:host => "example.com"} } }
|
355
|
+
it "should generate path and url links" do
|
356
|
+
expect(evaljs("Routes.inboxUrl(1)")).to eq("http://example.com#{routes.inbox_path(1)}")
|
357
|
+
expect(evaljs("Routes.newSessionUrl()")).to eq("https://example.com#{routes.new_session_path}")
|
358
|
+
expect(evaljs("Routes.ssoUrl()")).to eq(routes.sso_url)
|
359
|
+
expect(evaljs("Routes.portalsUrl()")).to eq("http://example.com:8080#{routes.portals_path}")
|
360
|
+
end
|
361
|
+
end
|
362
|
+
|
363
|
+
context "with prefix option" do
|
364
|
+
let(:_options) { { :prefix => "/api", :url_links => true, :default_url_options => {:host => 'example.com'} } }
|
365
|
+
it "should generate path and url links" do
|
366
|
+
expect(evaljs("Routes.inbox_url(1)")).to eq("http://example.com/api#{routes.inbox_path(1)}")
|
367
|
+
expect(evaljs("Routes.new_session_url()")).to eq("https://example.com/api#{routes.new_session_path}")
|
368
|
+
expect(evaljs("Routes.sso_url()")).to eq("http://sso.example.com/api#{routes.sso_path}")
|
369
|
+
expect(evaljs("Routes.portals_url()")).to eq("http://example.com:8080/api#{routes.portals_path}")
|
370
|
+
end
|
371
|
+
end
|
372
|
+
|
373
|
+
context "with compact option" do
|
374
|
+
let(:_options) { { :compact => true, :url_links => true, :default_url_options => {:host => 'example.com'} } }
|
375
|
+
it "does not affect url helpers" do
|
376
|
+
expect(evaljs("Routes.inbox_url(1)")).to eq("http://example.com#{routes.inbox_path(1)}")
|
377
|
+
expect(evaljs("Routes.new_session_url()")).to eq("https://example.com#{routes.new_session_path}")
|
378
|
+
expect(evaljs("Routes.sso_url()")).to eq(routes.sso_url)
|
379
|
+
expect(evaljs("Routes.portals_url()")).to eq("http://example.com:8080#{routes.portals_path}")
|
380
|
+
end
|
265
381
|
end
|
266
382
|
end
|
383
|
+
end
|
267
384
|
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
385
|
+
describe "when the compact mode is enabled" do
|
386
|
+
let(:_options) { { :compact => true } }
|
387
|
+
it "removes _path suffix from path helpers" do
|
388
|
+
expect(evaljs("Routes.inbox_path")).to be_nil
|
389
|
+
expect(evaljs("Routes.inboxes()")).to eq(routes.inboxes_path())
|
390
|
+
expect(evaljs("Routes.inbox(2)")).to eq(routes.inbox_path(2))
|
391
|
+
end
|
392
|
+
|
393
|
+
context "with url_links option" do
|
394
|
+
context "with deprecated url_links config value" do
|
395
|
+
around(:each) do |example|
|
396
|
+
ActiveSupport::Deprecation.silence do
|
397
|
+
example.run
|
398
|
+
end
|
399
|
+
end
|
400
|
+
|
401
|
+
let(:_options) { { :compact => true, :url_links => "http://localhost" } }
|
402
|
+
it "should not strip urls" do
|
403
|
+
expect(evaljs("Routes.inbox(1)")).to eq(routes.inbox_path(1))
|
404
|
+
expect(evaljs("Routes.inbox_url(1)")).to eq("http://localhost#{routes.inbox_path(1)}")
|
405
|
+
end
|
275
406
|
end
|
276
407
|
end
|
277
408
|
end
|
@@ -150,8 +150,8 @@ describe JsRoutes, "compatibility with Rails" do
|
|
150
150
|
context "when jQuery is present" do
|
151
151
|
before do
|
152
152
|
evaljs("window.jQuery = {};")
|
153
|
-
jscontext[:
|
154
|
-
evaljs("window.jQuery.param =
|
153
|
+
jscontext[:parameterizeFunc] = lambda {|object| _value.to_param}
|
154
|
+
evaljs("window.jQuery.param = parameterizeFunc")
|
155
155
|
end
|
156
156
|
|
157
157
|
shared_examples_for "serialization" do
|
@@ -177,6 +177,11 @@ describe JsRoutes, "compatibility with Rails" do
|
|
177
177
|
let(:_value) do
|
178
178
|
nil
|
179
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
|
+
|
180
185
|
it_should_behave_like 'serialization'
|
181
186
|
end
|
182
187
|
end
|
@@ -199,11 +204,17 @@ describe JsRoutes, "compatibility with Rails" do
|
|
199
204
|
expect(evaljs("Routes.thing_path(null, 5)")).to eq(routes.thing_path(nil, 5))
|
200
205
|
end
|
201
206
|
|
207
|
+
# Fail for rails 4.2. Reason: https://github.com/rails/rails/issues/12178
|
202
208
|
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]
|
203
211
|
expect(evaljs("Routes.thing_path(5, {optional_id: undefined})")).to eq(routes.thing_path(5, :optional_id => nil))
|
204
212
|
end
|
205
213
|
|
214
|
+
# Fail for rails 4.2. Reason: https://github.com/rails/rails/issues/12178
|
206
215
|
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]
|
207
218
|
expect(evaljs("Routes.thing_path(5, {optional_id: null})")).to eq(routes.thing_path(5, :optional_id => nil))
|
208
219
|
end
|
209
220
|
end
|
@@ -291,4 +302,32 @@ describe JsRoutes, "compatibility with Rails" do
|
|
291
302
|
end
|
292
303
|
end
|
293
304
|
end
|
305
|
+
|
306
|
+
context "when specs" do
|
307
|
+
it "should show inbox spec" do
|
308
|
+
expect(evaljs("Routes.inbox_path.toString()")).to eq('/inboxes/:id(.:format)')
|
309
|
+
end
|
310
|
+
|
311
|
+
it "should show inbox spec convert to string" do
|
312
|
+
expect(evaljs("'' + Routes.inbox_path")).to eq('/inboxes/:id(.:format)')
|
313
|
+
end
|
314
|
+
|
315
|
+
it "should show inbox message spec" do
|
316
|
+
expect(evaljs("Routes.inbox_message_path.toString()")).to eq('/inboxes/:inbox_id/messages/:id(.:format)')
|
317
|
+
end
|
318
|
+
|
319
|
+
it "should show inbox message spec convert to string" do
|
320
|
+
expect(evaljs("'' + Routes.inbox_message_path")).to eq('/inboxes/:inbox_id/messages/:id(.:format)')
|
321
|
+
end
|
322
|
+
end
|
323
|
+
|
324
|
+
context "when params" do
|
325
|
+
it "should show inbox spec" do
|
326
|
+
expect(evaljs("Routes.inbox_path.required_params").to_a).to eq(["id"])
|
327
|
+
end
|
328
|
+
|
329
|
+
it "should show inbox message spec" do
|
330
|
+
expect(evaljs("Routes.inbox_message_path.required_params").to_a).to eq(["inbox_id", "id"])
|
331
|
+
end
|
332
|
+
end
|
294
333
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -108,6 +108,12 @@ def draw_routes
|
|
108
108
|
|
109
109
|
get '/привет' => "foo#foo", :as => :hello
|
110
110
|
get '(/o/:organization)/search/:q' => "foo#foo", as: :search
|
111
|
+
|
112
|
+
resources :sessions, :only => [:new, :create, :destroy], :protocol => 'https'
|
113
|
+
|
114
|
+
get '/' => 'sso#login', host: 'sso.example.com', as: :sso
|
115
|
+
|
116
|
+
resources :portals, :port => 8080
|
111
117
|
end
|
112
118
|
|
113
119
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: js-routes
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bogdan Gusiev
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-12-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: railties
|
@@ -114,14 +114,14 @@ dependencies:
|
|
114
114
|
requirements:
|
115
115
|
- - ">="
|
116
116
|
- !ruby/object:Gem::Version
|
117
|
-
version:
|
117
|
+
version: 0.12.1
|
118
118
|
type: :development
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
122
|
- - ">="
|
123
123
|
- !ruby/object:Gem::Version
|
124
|
-
version:
|
124
|
+
version: 0.12.1
|
125
125
|
description: Generates javascript file that defines all Rails named routes as javascript
|
126
126
|
helpers
|
127
127
|
email: agresso@gmail.com
|
@@ -145,6 +145,7 @@ files:
|
|
145
145
|
- gemfiles/rails32.gemfile
|
146
146
|
- gemfiles/rails40.gemfile
|
147
147
|
- gemfiles/rails41.gemfile
|
148
|
+
- gemfiles/rails42.gemfile
|
148
149
|
- js-routes.gemspec
|
149
150
|
- lib/js-routes.rb
|
150
151
|
- lib/js_routes.rb
|