dynamic_router 0.0.3 → 0.0.4
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/README.md +5 -17
- data/lib/dynamic_router/version.rb +1 -1
- data/lib/dynamic_router.rb +35 -5
- data/spec/dummy/config/routes.rb +1 -0
- data/spec/dynamic_router_spec.rb +22 -11
- metadata +21 -23
- data/lib/dynamic_router/class_methods.rb +0 -68
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bdd251c30a19c88907ea5056b56eeb712d82db5c
|
4
|
+
data.tar.gz: 3cea3b2431af8ac7e7514bf74559c477e8caae62
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
|
data/lib/dynamic_router.rb
CHANGED
@@ -1,8 +1,38 @@
|
|
1
1
|
require "dynamic_router/version"
|
2
|
-
require "dynamic_router/class_methods"
|
3
2
|
|
4
3
|
module DynamicRouter
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
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
|
data/spec/dummy/config/routes.rb
CHANGED
data/spec/dynamic_router_spec.rb
CHANGED
@@ -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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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.
|
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-
|
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
|
-
-
|
119
|
-
-
|
120
|
-
-
|
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
|