js-routes 0.2.0 → 0.3.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.
- data/Readme.md +21 -3
- data/VERSION +1 -1
- data/{jsroutes.gemspec → js-routes.gemspec} +7 -7
- data/lib/js_routes.rb +14 -3
- data/lib/routes.js +29 -24
- data/spec/js_routes_spec.rb +26 -7
- data/spec/spec_helper.rb +5 -1
- metadata +4 -4
data/Readme.md
CHANGED
@@ -14,11 +14,29 @@ Your application initializer, like `config/initializers/jsroutes.rb`:
|
|
14
14
|
|
15
15
|
``` ruby
|
16
16
|
JsRoutes.generate!(
|
17
|
-
:file => "#{Rails.root}app/assets/javascripts/routes.js",
|
18
|
-
:default_format => "json"
|
17
|
+
:file => "#{Rails.root}app/assets/javascripts/routes.js",
|
18
|
+
:default_format => "json",
|
19
|
+
:exclude => [/^admin_/, /paypal/, /^api_/]
|
19
20
|
)
|
20
21
|
```
|
21
22
|
|
23
|
+
Available options:
|
24
|
+
|
25
|
+
* `:file` - the file to generate the routes. Default:
|
26
|
+
* `#{Rails.root}/app/assets/javascripts/routes.js` for Rails >= 3.1
|
27
|
+
* `#{Rails.root}/public/javascripts/routes.js` for Rails < 3.1
|
28
|
+
* `:default_format` - Format to append to urls. Default: blank
|
29
|
+
* `:exclude` - Array of regexps to exclude form js routes. Default: []
|
30
|
+
* Note that regexp applied to **named route** not to *URL*
|
31
|
+
* `:namespace` - global object used to access routes. Default: `Routes`
|
32
|
+
* Possible variants: `MyProject.routes`, `MyProjectRoutes`
|
33
|
+
|
34
|
+
In order to generate routes to string and manipulate them yourself:
|
35
|
+
|
36
|
+
``` ruby
|
37
|
+
JsRoutes.generate(options)
|
38
|
+
```
|
39
|
+
|
22
40
|
### Usage
|
23
41
|
|
24
42
|
This will create a nice javascript file with `Routes` object that has all the rails routes available:
|
@@ -26,7 +44,7 @@ This will create a nice javascript file with `Routes` object that has all the ra
|
|
26
44
|
``` js
|
27
45
|
Routes.users_path() // => "/users"
|
28
46
|
Routes.user_path(1, {format: 'json'}) // => "/users/1.json"
|
29
|
-
Routes.
|
47
|
+
Routes.user_project_path(1,2, {q: 'hello', custom: true}) // => "/users/1/projects/2?q=hello&custom=true"
|
30
48
|
```
|
31
49
|
|
32
50
|
In order to make routes helpers available globally:
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.3.0
|
@@ -4,8 +4,8 @@
|
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
|
-
s.name = %q{
|
8
|
-
s.version = "0.
|
7
|
+
s.name = %q{js-routes}
|
8
|
+
s.version = "0.3.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Bogdan Gusiev"]
|
@@ -24,7 +24,7 @@ Gem::Specification.new do |s|
|
|
24
24
|
"Rakefile",
|
25
25
|
"Readme.md",
|
26
26
|
"VERSION",
|
27
|
-
"
|
27
|
+
"js-routes.gemspec",
|
28
28
|
"lib/js_routes.rb",
|
29
29
|
"lib/jsroutes.rb",
|
30
30
|
"lib/routes.js",
|
@@ -32,7 +32,7 @@ Gem::Specification.new do |s|
|
|
32
32
|
"spec/js_routes_spec.rb",
|
33
33
|
"spec/spec_helper.rb"
|
34
34
|
]
|
35
|
-
s.homepage = %q{http://github.com/
|
35
|
+
s.homepage = %q{http://github.com/railsware/js-routes}
|
36
36
|
s.licenses = ["MIT"]
|
37
37
|
s.require_paths = ["lib"]
|
38
38
|
s.rubygems_version = %q{1.3.7}
|
@@ -43,14 +43,14 @@ Gem::Specification.new do |s|
|
|
43
43
|
s.specification_version = 3
|
44
44
|
|
45
45
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
46
|
-
s.add_runtime_dependency(%q<rails>, [">= 0"])
|
46
|
+
s.add_runtime_dependency(%q<rails>, [">= 3.0"])
|
47
47
|
s.add_development_dependency(%q<therubyracer>, [">= 0"])
|
48
48
|
s.add_development_dependency(%q<rspec>, ["~> 2.3.0"])
|
49
49
|
s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
|
50
50
|
s.add_development_dependency(%q<jeweler>, ["~> 1.6.2"])
|
51
51
|
s.add_development_dependency(%q<rcov>, [">= 0"])
|
52
52
|
else
|
53
|
-
s.add_dependency(%q<rails>, [">= 0"])
|
53
|
+
s.add_dependency(%q<rails>, [">= 3.0"])
|
54
54
|
s.add_dependency(%q<therubyracer>, [">= 0"])
|
55
55
|
s.add_dependency(%q<rspec>, ["~> 2.3.0"])
|
56
56
|
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
@@ -58,7 +58,7 @@ Gem::Specification.new do |s|
|
|
58
58
|
s.add_dependency(%q<rcov>, [">= 0"])
|
59
59
|
end
|
60
60
|
else
|
61
|
-
s.add_dependency(%q<rails>, [">= 0"])
|
61
|
+
s.add_dependency(%q<rails>, [">= 3.0"])
|
62
62
|
s.add_dependency(%q<therubyracer>, [">= 0"])
|
63
63
|
s.add_dependency(%q<rspec>, ["~> 2.3.0"])
|
64
64
|
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
data/lib/js_routes.rb
CHANGED
@@ -4,7 +4,9 @@ module JsRoutes
|
|
4
4
|
|
5
5
|
def generate(options = {})
|
6
6
|
js = File.read(File.dirname(__FILE__) + "/routes.js")
|
7
|
-
|
7
|
+
options[:namespace] ||= "Routes"
|
8
|
+
js.gsub!("NAMESPACE", options[:namespace])
|
9
|
+
js.gsub!("ROUTES", js_routes(options))
|
8
10
|
end
|
9
11
|
|
10
12
|
def generate!(options = {})
|
@@ -22,10 +24,20 @@ module JsRoutes
|
|
22
24
|
def js_routes(options = {})
|
23
25
|
|
24
26
|
options[:default_format] ||= ""
|
27
|
+
exclude = Array(options[:exclude])
|
25
28
|
|
26
29
|
Rails.application.reload_routes!
|
27
30
|
Rails.application.routes.named_routes.routes.map do |name, route|
|
28
|
-
|
31
|
+
if exclude.find {|e| name.to_s =~ e}
|
32
|
+
""
|
33
|
+
else
|
34
|
+
build_js(name, route, options)
|
35
|
+
end
|
36
|
+
end.join("\n")
|
37
|
+
end
|
38
|
+
|
39
|
+
def build_js(name, route, options)
|
40
|
+
_ = <<-JS
|
29
41
|
// #{route.name} => #{route.path}
|
30
42
|
#{name.to_s}_path: function(#{build_params route}) {
|
31
43
|
var opts = options || {};
|
@@ -35,7 +47,6 @@ module JsRoutes
|
|
35
47
|
return Routes.check_path('#{build_path route}' + format) + Routes.serialize(opts);
|
36
48
|
},
|
37
49
|
JS
|
38
|
-
end.join("\n")
|
39
50
|
end
|
40
51
|
|
41
52
|
|
data/lib/routes.js
CHANGED
@@ -1,29 +1,34 @@
|
|
1
|
-
|
1
|
+
(function(){
|
2
2
|
|
3
|
-
|
3
|
+
var Routes = {
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
s
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
5
|
+
ROUTES
|
6
|
+
|
7
|
+
serialize: function(obj){
|
8
|
+
if (obj == null) {return '';}
|
9
|
+
var s = [];
|
10
|
+
for (prop in obj){
|
11
|
+
s.push(prop + "=" + obj[prop]);
|
12
|
+
}
|
13
|
+
if (s.length == 0) {
|
14
|
+
return '';
|
15
|
+
}
|
16
|
+
return "?" + s.join('&');
|
17
|
+
},
|
16
18
|
|
17
19
|
|
18
|
-
|
19
|
-
|
20
|
-
|
20
|
+
check_parameter: function(param) {
|
21
|
+
if (param === undefined) {
|
22
|
+
param = '';
|
23
|
+
}
|
24
|
+
return param;
|
25
|
+
},
|
26
|
+
|
27
|
+
check_path: function(path) {
|
28
|
+
return path.replace(/\.$/m, '');
|
21
29
|
}
|
22
|
-
|
23
|
-
}
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
}
|
28
|
-
|
29
|
-
}
|
30
|
+
|
31
|
+
};
|
32
|
+
|
33
|
+
window.NAMESPACE = Routes;
|
34
|
+
})();
|
data/spec/js_routes_spec.rb
CHANGED
@@ -5,45 +5,64 @@ require "fileutils"
|
|
5
5
|
|
6
6
|
describe JsRoutes do
|
7
7
|
before(:each) do
|
8
|
+
Rails.application.stub!(:reload_routes!).and_return(true)
|
9
|
+
evaljs("var window = {};")
|
8
10
|
evaljs(JsRoutes.generate(_options))
|
9
11
|
end
|
10
12
|
|
11
13
|
let(:_options) { {} }
|
12
14
|
|
13
15
|
it "should generate collection routing" do
|
14
|
-
evaljs("Routes.inboxes_path()").should == "/inboxes"
|
16
|
+
evaljs("window.Routes.inboxes_path()").should == "/inboxes"
|
15
17
|
end
|
16
18
|
|
17
19
|
it "should generate member routing" do
|
18
|
-
evaljs("Routes.inbox_path(1)").should == "/inboxes/1"
|
20
|
+
evaljs("window.Routes.inbox_path(1)").should == "/inboxes/1"
|
19
21
|
end
|
20
22
|
|
21
23
|
it "should generate nested routing" do
|
22
|
-
evaljs("Routes.inbox_message_path(1,2)").should == "/inboxes/1/messages/2"
|
24
|
+
evaljs("window.Routes.inbox_message_path(1,2)").should == "/inboxes/1/messages/2"
|
23
25
|
end
|
24
26
|
|
25
27
|
it "should generate routing with format" do
|
26
|
-
evaljs("Routes.inbox_path(1, {format: 'json'})").should == "/inboxes/1.json"
|
28
|
+
evaljs("window.Routes.inbox_path(1, {format: 'json'})").should == "/inboxes/1.json"
|
27
29
|
end
|
28
30
|
|
29
31
|
it "should support get parameters" do
|
30
|
-
evaljs("Routes.inbox_path(1, {format: 'json', q: 'hello', lang: 'ua'})").should == "/inboxes/1.json?q=hello&lang=ua"
|
32
|
+
evaljs("window.Routes.inbox_path(1, {format: 'json', q: 'hello', lang: 'ua'})").should == "/inboxes/1.json?q=hello&lang=ua"
|
31
33
|
end
|
32
34
|
|
35
|
+
context "when exclude is specified" do
|
36
|
+
|
37
|
+
let(:_options) { {:exclude => /^admin_/} }
|
38
|
+
|
39
|
+
it "should exclude specified routes from file" do
|
40
|
+
evaljs("window.Routes.admin_users_path").should be_nil
|
41
|
+
end
|
42
|
+
end
|
33
43
|
|
34
44
|
context "when default_format is specified" do
|
35
45
|
let(:_options) { {:default_format => "json"} }
|
36
46
|
|
37
47
|
it "should render routing with default_format" do
|
38
|
-
evaljs("Routes.inbox_path(1)").should == "/inboxes/1.json"
|
48
|
+
evaljs("window.Routes.inbox_path(1)").should == "/inboxes/1.json"
|
39
49
|
end
|
40
50
|
|
41
51
|
it "should override default_format implicitly" do
|
42
|
-
evaljs("Routes.inbox_path(1, {format: 'xml'})").should == "/inboxes/1.xml"
|
52
|
+
evaljs("window.Routes.inbox_path(1, {format: 'xml'})").should == "/inboxes/1.xml"
|
43
53
|
end
|
44
54
|
|
45
55
|
end
|
46
56
|
|
57
|
+
context "when namspace option is specified" do
|
58
|
+
let(:_options) { {:namespace => "PHM"} }
|
59
|
+
it "should use this name space for routing" do
|
60
|
+
evaljs("window.Routes").should be_nil
|
61
|
+
evaljs("window.PHM.inbox_path").should_not be_nil
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
|
47
66
|
describe ".generate!" do
|
48
67
|
let(:name) { "#{File.dirname(__FILE__)}/../routes.js" }
|
49
68
|
it "should generate routes file" do
|
data/spec/spec_helper.rb
CHANGED
@@ -11,16 +11,20 @@ def evaljs(string)
|
|
11
11
|
@context.eval(string)
|
12
12
|
end
|
13
13
|
|
14
|
+
|
14
15
|
class App < Rails::Application
|
15
16
|
self.routes.draw do
|
16
17
|
resources :inboxes do
|
17
18
|
resources :messages
|
18
19
|
end
|
20
|
+
|
21
|
+
namespace :admin do
|
22
|
+
resources :users
|
23
|
+
end
|
19
24
|
end
|
20
25
|
end
|
21
26
|
|
22
27
|
|
23
|
-
|
24
28
|
# Requires supporting files with custom matchers and macros, etc,
|
25
29
|
# in ./support/ and its subdirectories.
|
26
30
|
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: js-routes
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
8
|
+
- 3
|
9
9
|
- 0
|
10
|
-
version: 0.
|
10
|
+
version: 0.3.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Bogdan Gusiev
|
@@ -126,7 +126,7 @@ files:
|
|
126
126
|
- Rakefile
|
127
127
|
- Readme.md
|
128
128
|
- VERSION
|
129
|
-
-
|
129
|
+
- js-routes.gemspec
|
130
130
|
- lib/js_routes.rb
|
131
131
|
- lib/jsroutes.rb
|
132
132
|
- lib/routes.js
|