dynamic_router 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 59b9c8ce0c8e7f5607f7f6f66dce1a35f31292f2
4
- data.tar.gz: 7b9a38b8bea748f00c1029e6e33f8264855b6fd4
3
+ metadata.gz: bdd251c30a19c88907ea5056b56eeb712d82db5c
4
+ data.tar.gz: 3cea3b2431af8ac7e7514bf74559c477e8caae62
5
5
  SHA512:
6
- metadata.gz: 076391a6883e1a5457bb6572cb24bbda2c5332e36ecd12e8a86672fab621ca72a006cefc98351502fe7ef3df17c424d66bdb4f82e3074d4f2ecc0cf5324dddec
7
- data.tar.gz: 3458f3b113f4d67dfe49d1ebc7baffc9da0deb32a0064fe871431d7fb66446453f7fbaacbdf0da1f10d58cff56e2acfc8adbfb1228b77f86fcdfb6c9862ea0cd
6
+ metadata.gz: f7cdbfdfbd559459367aa9f000c5d12a5e41232b8850f4d797f088bbd61b7645a9d399fd97e8973b4315cb73246cc2e87e69cec2c5cbad7df6ccb21fa7b95c36
7
+ data.tar.gz: 5ddf82072defc141a98ba7d5b34107ac77bc69aa23f9c81afb568f450f6b9aaaf228635be3002eea36bc5048b8cd329b77dce0e927b5e349a602543eccca23e8
data/README.md CHANGED
@@ -26,15 +26,11 @@ Suppose you want to create a friendly URL for a resource based on fields of an e
26
26
  # This model has a field called 'url'
27
27
  end
28
28
 
29
- You can create a route to a resource using this field as URL, just use the notation:
29
+ To create a route to a resource using the field 'url' as URL, add the following line to your routes.rb:
30
30
 
31
- class Example < ActiveRecord::Base
32
- # This model has a field called 'url'
33
-
34
- has_dynamic_route Proc.new {|example| "/#{example.url}"}, "dummy#dummy_method"
35
- end
31
+ DynamicRouter.has_dynamic_route_for Example, Proc.new {|example| "/#{example.url}"}, "dummy#dummy_method"
36
32
 
37
- With this notation, when you create models like:
33
+ After this when you create models like:
38
34
 
39
35
  Example.create!(:url => "abc")
40
36
  Example.create!(:url => "123")
@@ -43,19 +39,11 @@ The dynamic router will create the routes "/abc" and "/123" mapping to DummyCont
43
39
 
44
40
  You can pass the desired HTTP method also:
45
41
 
46
- class Example < ActiveRecord::Base
47
- # This model has a field called 'url'
48
-
49
- has_dynamic_route Proc.new {|example| "/#{example.url}"}, "dummy#dummy_method", :method => :post
50
- end
42
+ DynamicRouter.has_dynamic_route_for Example, Proc.new {|example| "/#{example.url}"}, "dummy#dummy_method", :method => :post
51
43
 
52
44
  And can specify default values to be passed, like:
53
45
 
54
- class Example < ActiveRecord::Base
55
- # This model has two fields called 'url' and 'default_field'
56
-
57
- has_dynamic_route Proc.new {|example| "/#{example.url}"}, "dummy#dummy_method", :defaults => {:some_value => Proc.new {|example| example.default_field}}
58
- end
46
+ DynamicRouter.has_dynamic_route_for Example, Proc.new {|example| "/#{example.url}"}, "dummy#dummy_method", :defaults => {:some_value => Proc.new {|example| example.default_field}}
59
47
 
60
48
  The dynamic router will map ALL records of the model on the startup and will create an after_save hook to create new routes as the models are created.
61
49
 
@@ -1,3 +1,3 @@
1
1
  module DynamicRouter
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
@@ -1,8 +1,38 @@
1
1
  require "dynamic_router/version"
2
- require "dynamic_router/class_methods"
3
2
 
4
3
  module DynamicRouter
5
- def self.extended(receiver)
6
- receiver.extend ClassMethods
7
- end
8
- end
4
+ module_function
5
+ def has_dynamic_route_for(klass, url, target, options = {})
6
+ route_method = options[:method] || :get
7
+
8
+ if ActiveRecord::Base.connection.table_exists? klass.table_name
9
+ Rails.application.routes.draw do
10
+ klass.find_each do |model|
11
+ unless options[:defaults].blank?
12
+ defaults = {}
13
+
14
+ options[:defaults].each do |key, value|
15
+ defaults[key.to_sym] = value.call(model)
16
+ end
17
+ end
18
+
19
+ _url = url.call(model).to_s
20
+ _target = target.to_s
21
+
22
+ unless _url.blank? || _url.gsub(/\//, "").blank?
23
+ #puts "Routing #{route_method.to_s.upcase} #{_url}, to #{target}, defaults : #{defaults}"
24
+ send(route_method, _url, :to => _target, :defaults => defaults)
25
+ end
26
+ end
27
+ end
28
+ end
29
+
30
+ klass.class_eval do
31
+ after_save :create_route
32
+
33
+ def create_route
34
+ Rails.application.routes_reloader.reload!
35
+ end
36
+ end
37
+ end
38
+ end
@@ -1,2 +1,3 @@
1
1
  Dummy::Application.routes.draw do
2
+ DynamicRouter.has_dynamic_route_for(Example, Proc.new {|example| "/#{example.first_path}/#{example.second_path}"}, "dummy#dummy_method")
2
3
  end
@@ -2,11 +2,8 @@ require 'spec_helper'
2
2
 
3
3
  RSpec.describe DynamicRouter do
4
4
  before(:each) do
5
- class Example < ActiveRecord::Base
6
- extend DynamicRouter
7
- end
8
-
9
5
  Example.destroy_all
6
+
10
7
  Example.create!(:first_path => "path_a", :second_path => "path_a_a", :default_field => "default_value")
11
8
  Example.create!(:first_path => "path_a", :second_path => "path_a_c", :default_field => "default_value")
12
9
  end
@@ -17,30 +14,40 @@ RSpec.describe DynamicRouter do
17
14
  allow(ActiveRecord::Base).to receive(:connection).and_return(connection)
18
15
  expect(connection).to receive(:table_exists?).with(Example.table_name)
19
16
 
20
- Example.send(:has_dynamic_route, Proc.new {|example| "/#{example.first_path}/#{example.second_path}"}, "dummy#dummy_method")
17
+ Rails.application.routes.draw do
18
+ DynamicRouter.has_dynamic_route_for(Example, Proc.new {|example| "/#{example.first_path}/#{example.second_path}"}, "dummy#dummy_method")
19
+ end
21
20
  end
22
21
 
23
22
  it "should create a get route with the supplied url" do
24
- Example.send(:has_dynamic_route, Proc.new {|example| "/#{example.first_path}/#{example.second_path}"}, "dummy#dummy_method")
23
+ Rails.application.routes.draw do
24
+ DynamicRouter.has_dynamic_route_for(Example, Proc.new {|example| "/#{example.first_path}/#{example.second_path}"}, "dummy#dummy_method")
25
+ end
25
26
 
26
27
  expect(Rails.application.routes.recognize_path('/path_a/path_a_a', :method => :get))
27
28
  expect(Rails.application.routes.recognize_path('/path_a/path_a_c', :method => :get))
28
29
  end
29
30
 
30
31
  it "should accept the method option" do
31
- Example.send(:has_dynamic_route, Proc.new {|example| "/#{example.first_path}/#{example.second_path}"}, "dummy#dummy_method", :method => :post)
32
+ Rails.application.routes.draw do
33
+ DynamicRouter.has_dynamic_route_for(Example, Proc.new {|example| "/#{example.first_path}/#{example.second_path}"}, "dummy#dummy_method", :method => :post)
34
+ end
32
35
 
33
36
  expect(Rails.application.routes.recognize_path('/path_a/path_a_a', :method => :post))
34
37
  end
35
38
 
36
39
  it "should accept the defaults option" do
37
- Example.send(:has_dynamic_route, Proc.new {|example| "/#{example.first_path}/#{example.second_path}"}, "dummy#dummy_method", :defaults => {:default_value => Proc.new {|example| example.default_field}})
40
+ Rails.application.routes.draw do
41
+ DynamicRouter.has_dynamic_route_for(Example, Proc.new {|example| "/#{example.first_path}/#{example.second_path}"}, "dummy#dummy_method", :defaults => {:default_value => Proc.new {|example| example.default_field}})
42
+ end
38
43
 
39
44
  expect(Rails.application.routes.routes.named_routes["path_a_path_a_a"].defaults).to match a_hash_including(:default_value => "default_value")
40
45
  end
41
46
 
42
47
  it "should create the route after save the model" do
43
- Example.send(:has_dynamic_route, Proc.new {|example| "/#{example.first_path}/#{example.second_path}"}, "dummy#dummy_method", :defaults => {:default_value => Proc.new {|example| example.default_field}})
48
+ Rails.application.routes.draw do
49
+ DynamicRouter.has_dynamic_route_for(Example, Proc.new {|example| "/#{example.first_path}/#{example.second_path}"}, "dummy#dummy_method", :defaults => {:default_value => Proc.new {|example| example.default_field}})
50
+ end
44
51
 
45
52
  Example.create!(:first_path => "path_a", :second_path => "path_a_b")
46
53
 
@@ -48,13 +55,17 @@ RSpec.describe DynamicRouter do
48
55
  end
49
56
 
50
57
  it "should not create the route if the url is blank" do
51
- Example.send(:has_dynamic_route, Proc.new {|example| ""}, "dummy#dummy_method")
58
+ Rails.application.routes.draw do
59
+ DynamicRouter.has_dynamic_route_for(Example, Proc.new {|example| ""}, "dummy#dummy_method")
60
+ end
52
61
 
53
62
  expect(Rails.application.routes.routes.named_routes).to be_empty
54
63
  end
55
64
 
56
65
  it "should not create the route if the url eval to blank" do
57
- Example.send(:has_dynamic_route, Proc.new {|example| "/#{example.first_path}/#{example.second_path}"}, "dummy#dummy_method")
66
+ Rails.application.routes.draw do
67
+ DynamicRouter.has_dynamic_route_for(Example, Proc.new {|example| "/#{example.first_path}/#{example.second_path}"}, "dummy#dummy_method")
68
+ end
58
69
 
59
70
  Example.create!(:first_path => "")
60
71
 
metadata CHANGED
@@ -1,111 +1,111 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dynamic_router
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gustavo Berdugo
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-10-15 00:00:00.000000000 Z
11
+ date: 2014-10-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ~>
18
18
  - !ruby/object:Gem::Version
19
19
  version: '4.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ~>
25
25
  - !ruby/object:Gem::Version
26
26
  version: '4.0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ~>
32
32
  - !ruby/object:Gem::Version
33
33
  version: '1.6'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ~>
39
39
  - !ruby/object:Gem::Version
40
40
  version: '1.6'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ~>
46
46
  - !ruby/object:Gem::Version
47
47
  version: '10.3'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ~>
53
53
  - !ruby/object:Gem::Version
54
54
  version: '10.3'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rspec
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - "~>"
59
+ - - ~>
60
60
  - !ruby/object:Gem::Version
61
61
  version: '3.1'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - "~>"
66
+ - - ~>
67
67
  - !ruby/object:Gem::Version
68
68
  version: '3.1'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: pry
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - "~>"
73
+ - - ~>
74
74
  - !ruby/object:Gem::Version
75
75
  version: '0.10'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - "~>"
80
+ - - ~>
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0.10'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: coveralls
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - "~>"
87
+ - - ~>
88
88
  - !ruby/object:Gem::Version
89
89
  version: '0.7'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - "~>"
94
+ - - ~>
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0.7'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: sqlite3
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
- - - "~>"
101
+ - - ~>
102
102
  - !ruby/object:Gem::Version
103
103
  version: '1.3'
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
- - - "~>"
108
+ - - ~>
109
109
  - !ruby/object:Gem::Version
110
110
  version: '1.3'
111
111
  description: Use this gem to add dynamic routes to your project.
@@ -115,9 +115,9 @@ executables: []
115
115
  extensions: []
116
116
  extra_rdoc_files: []
117
117
  files:
118
- - ".coveralls.yml"
119
- - ".gitignore"
120
- - ".travis.yml"
118
+ - .coveralls.yml
119
+ - .gitignore
120
+ - .travis.yml
121
121
  - Gemfile
122
122
  - LICENSE
123
123
  - LICENSE.txt
@@ -125,7 +125,6 @@ files:
125
125
  - Rakefile
126
126
  - dynamic_router.gemspec
127
127
  - lib/dynamic_router.rb
128
- - lib/dynamic_router/class_methods.rb
129
128
  - lib/dynamic_router/version.rb
130
129
  - spec/db/create_database.rb
131
130
  - spec/dummy/Rakefile
@@ -168,12 +167,12 @@ require_paths:
168
167
  - lib
169
168
  required_ruby_version: !ruby/object:Gem::Requirement
170
169
  requirements:
171
- - - ">="
170
+ - - '>='
172
171
  - !ruby/object:Gem::Version
173
172
  version: '0'
174
173
  required_rubygems_version: !ruby/object:Gem::Requirement
175
174
  requirements:
176
- - - ">="
175
+ - - '>='
177
176
  - !ruby/object:Gem::Version
178
177
  version: '0'
179
178
  requirements: []
@@ -214,4 +213,3 @@ test_files:
214
213
  - spec/dummy/script/rails
215
214
  - spec/dynamic_router_spec.rb
216
215
  - spec/spec_helper.rb
217
- has_rdoc:
@@ -1,68 +0,0 @@
1
- module DynamicRouter
2
- module ClassMethods
3
- def has_dynamic_route(url, target, options = {})
4
- method = options[:method] || :get
5
- klass = self
6
-
7
- if ActiveRecord::Base.connection.table_exists? klass.table_name
8
- Rails.application.routes.draw do
9
- klass.find_each do |model|
10
- defaults = DynamicRouter::ClassMethods.parse_defaults(options[:defaults], model)
11
-
12
- DynamicRouter::ClassMethods.draw_route(self, method, url.call(model).to_s, target.to_s, defaults)
13
- end
14
- end
15
- end
16
-
17
- add_after_save_callback(klass, method, url, target, options[:defaults])
18
- end
19
-
20
- def add_after_save_callback(klass, method, url, target, defaults)
21
- klass.cattr_accessor :_method
22
- klass.cattr_accessor :_url
23
- klass.cattr_accessor :_target
24
- klass.cattr_accessor :_defaults
25
-
26
- klass._method = method
27
- klass._url = url
28
- klass._target = target
29
- klass._defaults = defaults
30
-
31
- klass.class_eval do
32
- after_save :create_route
33
-
34
- def create_route
35
- klass = self
36
-
37
- _routes = Rails.application.routes
38
- _routes.disable_clear_and_finalize = true
39
-
40
- _routes.draw do
41
- defaults = DynamicRouter::ClassMethods.parse_defaults(klass._defaults, klass)
42
-
43
- DynamicRouter::ClassMethods.draw_route(self, klass._method, klass._url.call(klass).to_s, klass._target.to_s, defaults)
44
- end
45
-
46
- _routes.disable_clear_and_finalize = false
47
- end
48
- end
49
- end
50
-
51
- module_function
52
- def parse_defaults(_defaults, klass)
53
- unless _defaults.blank?
54
- defaults = {}
55
-
56
- _defaults.each do |key, value|
57
- defaults[key.to_sym] = value.call(klass)
58
- end
59
- end
60
-
61
- defaults
62
- end
63
-
64
- def draw_route(route, method, url, target, defaults)
65
- route.send(method, url, :to => target, :defaults => defaults) unless url.blank? || url.gsub(/\//, "").blank?
66
- end
67
- end
68
- end