js-routes 0.8.1 → 0.8.2

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -38,12 +38,3 @@ end
38
38
 
39
39
  task :default => :spec
40
40
 
41
- require 'rake/rdoctask'
42
- Rake::RDocTask.new do |rdoc|
43
- version = File.exist?('VERSION') ? File.read('VERSION') : ""
44
-
45
- rdoc.rdoc_dir = 'rdoc'
46
- rdoc.title = "js-routes #{version}"
47
- rdoc.rdoc_files.include('README*')
48
- rdoc.rdoc_files.include('lib/**/*.rb')
49
- end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.8.1
1
+ 0.8.2
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "js-routes"
8
- s.version = "0.8.1"
8
+ s.version = "0.8.2"
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"]
12
- s.date = "2012-05-04"
12
+ s.date = "2012-06-23"
13
13
  s.description = "Generates javascript file that defines all Rails named routes as javascript helpers"
14
14
  s.email = "agresso@gmail.com"
15
15
  s.extra_rdoc_files = [
@@ -108,7 +108,7 @@ class JsRoutes
108
108
 
109
109
  def js_routes
110
110
  Rails.application.reload_routes!
111
- js_routes = Rails.application.routes.named_routes.routes.map do |_, route|
111
+ js_routes = Rails.application.routes.named_routes.routes.sort_by(&:to_s).map do |_, route|
112
112
  if route.app.respond_to?(:superclass) && route.app.superclass == Rails::Engine
113
113
  route.app.routes.named_routes.map do |_, engine_route|
114
114
  build_route_if_match(engine_route, route)
@@ -137,10 +137,13 @@ class JsRoutes
137
137
  def build_js(route, parent_route)
138
138
  name = [parent_route.try(:name), route.name].compact
139
139
  parent_spec = parent_route.try(:path).try(:spec)
140
+ required_parts = route.required_parts.clone
141
+ optional_parts = route.optional_parts.clone
142
+ optional_parts.push(required_parts.delete :format) if required_parts.include?(:format)
140
143
  _ = <<-JS.strip!
141
144
  // #{name.join('.')} => #{parent_spec}#{route.path.spec}
142
- #{name.join('_')}_path: function(#{build_params(route)}) {
143
- return Utils.build_path(#{json(route.required_parts)}, #{json(serialize(route.path.spec, parent_spec))}, arguments);
145
+ #{name.join('_')}_path: function(#{build_params(required_parts)}) {
146
+ return Utils.build_path(#{json(required_parts)}, #{json(optional_parts)}, #{json(serialize(route.path.spec, parent_spec))}, arguments);
144
147
  }
145
148
  JS
146
149
  end
@@ -149,8 +152,8 @@ class JsRoutes
149
152
  self.class.json(string)
150
153
  end
151
154
 
152
- def build_params route
153
- params = route.required_parts.map do |name|
155
+ def build_params required_parts
156
+ params = required_parts.map do |name|
154
157
  # prepending each parameter name with underscore
155
158
  # to prevent conflict with JS reserved words
156
159
  "_" + name.to_s
@@ -1,15 +1,13 @@
1
- if defined?(Rails) && Rails.version >= "3.1"
2
- class JsRoutes
3
- class Engine < Rails::Engine
4
- JS_ROUTES_ASSET = 'js-routes'
1
+ class JsRoutes
2
+ class Engine < Rails::Engine
3
+ JS_ROUTES_ASSET = 'js-routes'
5
4
 
6
- initializer 'js-routes.dependent_on_routes', :after => "sprockets.environment" do
7
- if Rails.application.assets.respond_to?(:register_preprocessor)
8
- routes = Rails.root.join('config','routes.rb')
9
- Rails.application.assets.register_preprocessor 'application/javascript', :'js-routes_dependent_on_routes' do |ctx,data|
10
- ctx.depend_on(routes) if ctx.logical_path == JS_ROUTES_ASSET
11
- data
12
- end
5
+ initializer 'js-routes.dependent_on_routes', :after => "sprockets.environment" do
6
+ if Rails.application.assets.respond_to?(:register_preprocessor)
7
+ routes = Rails.root.join('config','routes.rb')
8
+ Rails.application.assets.register_preprocessor 'application/javascript', :'js-routes_dependent_on_routes' do |ctx,data|
9
+ ctx.depend_on(routes) if ctx.logical_path == JS_ROUTES_ASSET
10
+ data
13
11
  end
14
12
  end
15
13
  end
@@ -15,7 +15,11 @@
15
15
  var Utils = {
16
16
 
17
17
  serialize: function(obj){
18
- if (obj === null) {return '';}
18
+ if (!obj) {return '';}
19
+ if (window.jQuery) {
20
+ var result = window.jQuery.param(obj);
21
+ return !result ? "" : "?" + result
22
+ }
19
23
  var s = [];
20
24
  for (prop in obj){
21
25
  if (obj[prop]) {
@@ -36,7 +40,10 @@
36
40
  },
37
41
 
38
42
  clean_path: function(path) {
39
- return path.replace(/\/+/g, "/").replace(/[\)\(]/g, "").replace(/\.$/m, '').replace(/\/$/m, '');
43
+ path = path.split("://");
44
+ last_index = path.length - 1;
45
+ path[last_index] = path[last_index].replace(/\/+/g, "/").replace(/\/$/m, '');
46
+ return path.join("://");
40
47
  },
41
48
 
42
49
  set_default_format: function(options) {
@@ -82,14 +89,14 @@
82
89
  },
83
90
 
84
91
  prepare_parameters: function(required_parameters, actual_parameters, options) {
85
- var result = this.clone(options);
92
+ var result = this.clone(options) || {};
86
93
  for (var i=0; i < required_parameters.length; i++) {
87
94
  result[required_parameters[i]] = actual_parameters[i];
88
95
  }
89
96
  return result;
90
97
  },
91
98
 
92
- build_path: function(required_parameters, route, args) {
99
+ build_path: function(required_parameters, optional_parts, route, args) {
93
100
  args = Array.prototype.slice.call(args);
94
101
  var opts = this.extract_options(required_parameters.length, args);
95
102
  if (args.length > required_parameters.length) {
@@ -97,7 +104,9 @@
97
104
  }
98
105
 
99
106
  parameters = this.prepare_parameters(required_parameters, args, opts);
100
- this.set_default_format(parameters);
107
+ if (optional_parts.indexOf('format') != -1) {
108
+ this.set_default_format(parameters);
109
+ }
101
110
  var result = Utils.get_prefix();
102
111
  var anchor = Utils.extract_anchor(parameters);
103
112
 
@@ -69,6 +69,10 @@ describe JsRoutes do
69
69
  evaljs("Routes.blog_app_post_path(1)").should == blog_routes.post_path(1)
70
70
  end
71
71
 
72
+ it "shouldn't require the format" do
73
+ evaljs("Routes.json_only_path({format: 'json'})").should == routes.json_only_path(:format => 'json')
74
+ end
75
+
72
76
  context "routes globbing" do
73
77
  it "should be supported as parameters" do
74
78
  evaljs("Routes.book_path('thrillers', 1)").should == routes.book_path('thrillers', 1)
@@ -83,6 +87,33 @@ describe JsRoutes do
83
87
  end
84
88
  end
85
89
 
90
+ context "when jQuery is present" do
91
+ before do
92
+ evaljs("window.jQuery = {};")
93
+ jscontext[:parameterize] = lambda {|object| _value.to_param}
94
+ evaljs("window.jQuery.param = parameterize")
95
+ end
96
+
97
+ shared_examples_for "serialization" do
98
+ it "should support serialization of objects" do
99
+ evaljs("window.jQuery.param(#{_value.to_json})").should == _value.to_param
100
+ evaljs("Routes.inboxes_path(#{_value.to_json})").should == routes.inboxes_path(_value)
101
+ end
102
+ end
103
+ context "when parameters is a hash" do
104
+ let(:_value) do
105
+ {a: {b: 'c'}, q: [1,2]}
106
+ end
107
+ it_should_behave_like 'serialization'
108
+ end
109
+ context "when parameters is null" do
110
+ let(:_value) do
111
+ nil
112
+ end
113
+ it_should_behave_like 'serialization'
114
+ end
115
+ end
116
+
86
117
  context "using optional path fragments" do
87
118
  context "including not optional parts" do
88
119
  it "should include everything that is not optional" do
@@ -176,6 +207,15 @@ describe JsRoutes do
176
207
  end
177
208
 
178
209
  end
210
+
211
+ context "when prefix with http:// is specified" do
212
+
213
+ let(:_options) { {:prefix => "http://localhost:3000" } }
214
+
215
+ it "should render routing with prefix" do
216
+ evaljs("Routes.inbox_path(1)").should == _options[:prefix] + routes.inbox_path(1)
217
+ end
218
+ end
179
219
 
180
220
  context "when prefix without trailing slash is specified" do
181
221
 
@@ -207,6 +247,13 @@ describe JsRoutes do
207
247
  evaljs("Routes.inbox_path(1, {format: null})").should == routes.inbox_path(1)
208
248
  end
209
249
 
250
+ it "shouldn't include the format when {:format => false} is specified" do
251
+ evaljs("Routes.no_format_path()").should == routes.no_format_path
252
+ end
253
+
254
+ it "shouldn't require the format" do
255
+ evaljs("Routes.json_only_path()").should == routes.json_only_path(:format => 'json')
256
+ end
210
257
  end
211
258
 
212
259
  describe "when namespace option is specified" do
@@ -282,6 +329,10 @@ describe JsRoutes do
282
329
  it "should have correct function signature with Ruby 1.8.7 and unordered hash" do
283
330
  should include("inbox_message_attachment_path: function(_inbox_id, _message_id, _id, options)")
284
331
  end
332
+
333
+ it "routes should be sorted in alphabetical order" do
334
+ subject.index("book_path").should <= subject.index("inboxes_path")
335
+ end
285
336
  end
286
337
 
287
338
  describe ".generate!" do
@@ -56,6 +56,10 @@ class App < Rails::Application
56
56
  match 'books/*section/:title' => 'books#show', :as => :book
57
57
 
58
58
  mount BlogEngine::Engine => "/blog", :as => :blog_app
59
+
60
+ get '/no_format' => "foo#foo", :format => false, :as => :no_format
61
+
62
+ get '/json_only' => "foo#foo", :format => true, :constraints => {:format => /json/}, :as => :json_only
59
63
  end
60
64
 
61
65
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: js-routes
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.1
4
+ version: 0.8.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-05-04 00:00:00.000000000 Z
12
+ date: 2012-06-23 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
16
- requirement: &16473680 !ruby/object:Gem::Requirement
16
+ requirement: &12169560 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '3.2'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *16473680
24
+ version_requirements: *12169560
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: therubyracer
27
- requirement: &16471960 !ruby/object:Gem::Requirement
27
+ requirement: &12167600 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *16471960
35
+ version_requirements: *12167600
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rspec
38
- requirement: &16469100 !ruby/object:Gem::Requirement
38
+ requirement: &12164260 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: 2.7.0
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *16469100
46
+ version_requirements: *12164260
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: bundler
49
- requirement: &16488880 !ruby/object:Gem::Requirement
49
+ requirement: &12177960 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: 1.1.0
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *16488880
57
+ version_requirements: *12177960
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: jeweler
60
- requirement: &16486860 !ruby/object:Gem::Requirement
60
+ requirement: &12176940 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ~>
@@ -65,7 +65,7 @@ dependencies:
65
65
  version: 1.6.2
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *16486860
68
+ version_requirements: *12176940
69
69
  description: Generates javascript file that defines all Rails named routes as javascript
70
70
  helpers
71
71
  email: agresso@gmail.com
@@ -108,7 +108,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
108
108
  version: '0'
109
109
  segments:
110
110
  - 0
111
- hash: 950059294616459731
111
+ hash: 379600740285990591
112
112
  required_rubygems_version: !ruby/object:Gem::Requirement
113
113
  none: false
114
114
  requirements: