rails-dsl 0.3.3 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (5) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +62 -1
  3. data/VERSION +1 -1
  4. data/lib/rails-dsl/routes_ext.rb +125 -17
  5. metadata +1 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 01f607ff8fd5ab8b6495e6ebdac3a4543115108a
4
- data.tar.gz: 69e2fe3545fbe251df679ea8950c9669beae733e
3
+ metadata.gz: e002eeafc2ccfe491ccb4c9f159e88086a35a510
4
+ data.tar.gz: 1d972d46a8325b825d544781d2ef61b232b55408
5
5
  SHA512:
6
- metadata.gz: 6d738c5f7a6d362c84d168ec7259c7b3349433ea699e99d5a08bac08433d7ba1b72a429b73298cbfbe3884eae916c7f5639b726ae5ee6409d939d032c0d51c10
7
- data.tar.gz: 6552d5ba39ecb756a58588bceba05e6c1c66b76e75be2656301521d01549f51a73576d99aa4afabaf8a582446bbbf3e31810cfd6572121f360643c97445d12fe
6
+ metadata.gz: 1628d1b0e72ddd6714c076e3b4eeb181d4a89d7490a0ce1736b2df6b1cb6d3b452c9284f6ae4787713ce5015d1a901258369121028ad2cbd5170d53e40c5faf6
7
+ data.tar.gz: b5c0ca8fef074376e9903610c36e2d2ab6efc1403d282e37e8fd1f21bf7ead550015cb3f2523bd02643f3a321f1fee1c40f7db7aa732352a332c1284eef7f818
data/README.md CHANGED
@@ -21,7 +21,9 @@ if you call rails with 'kill' / 'k' command from now on, it will kill the applic
21
21
 
22
22
  ### Routing
23
23
 
24
- #### mount controller
24
+ #### Mount controller
25
+
26
+ ##### As pages
25
27
 
26
28
  * mount a controller public methods as routes.
27
29
  * the method name will be the path
@@ -61,4 +63,63 @@ you can use the following options (name: [aliases])
61
63
 
62
64
  #> mount not private methods from PagesController
63
65
 
66
+ ```
67
+
68
+ ##### As API behavor
69
+
70
+ in this mount options
71
+
72
+ * the methods return value will be sent back parsed object to the requester
73
+ * you dont have to set up render options
74
+
75
+ * arguments will be parsed into route :params so the othere side can cache based on url
76
+ * the method actualy receive the passed parameter so you can use like in the example
77
+
78
+ * by extend the method name you can set the methods REST method by the followind endings:
79
+ * _get
80
+ * _post
81
+ * _put
82
+ * _delete
83
+
84
+ ```ruby
85
+
86
+
87
+ #> controller
88
+ class PagesController < ApplicationController
89
+
90
+ #> this generate /test1/:hello.:format path
91
+ def test1 hello
92
+ {hello: hello }
93
+ end
94
+
95
+ #> this generate /test2/:hello.:format path
96
+ def test2
97
+ {hello: 'hello' }
98
+ end
99
+
100
+ def test2_post
101
+ {hello: 'blabla' }
102
+ end
103
+ #> POST /test.:format -> default json
104
+
105
+ end
106
+
107
+ #> routes.rb
108
+
109
+ HeartShoot::Application.routes.draw do
110
+
111
+ # you can still use the Class name too
112
+ mount_controller_as_api :pages
113
+
114
+ # or as alias
115
+ mount_api :pages
116
+
117
+ # or you can use well defaults key to set up parameters
118
+ # if you prefer the XML as default over JSON output
119
+ mount_api :pages, defaults: { format: :xml }
120
+
121
+ end
122
+
123
+ #> mount not private methods as apit from PagesController
124
+
64
125
  ```
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.3
1
+ 0.4.1
@@ -6,6 +6,28 @@ module Rails
6
6
  module Helpers
7
7
  class << self
8
8
 
9
+ def array_to_url_params array,method_name
10
+
11
+ return "" unless array.class <= ::Array
12
+
13
+ var=nil
14
+ array.each do |ary|
15
+
16
+ if ary[0].to_s == method_name.to_s
17
+ var = ary[1]
18
+ break
19
+ end
20
+
21
+ end
22
+
23
+ if !var.nil?
24
+ return "/:#{var.join('/:')}"
25
+ else
26
+ return ""
27
+ end
28
+
29
+ end
30
+
9
31
  def process_args *args
10
32
 
11
33
  opts= args.select{|e|(e.class <= ::Hash)}.reduce( {}, :merge! )
@@ -13,9 +35,12 @@ module Rails
13
35
  # search for alt keys
14
36
  {
15
37
 
16
- scope: [:s,:namespace,:path],
38
+ urls: [:p,:paths,:url,:u],
39
+ scope: [:s],
17
40
  resource: [:r,:class],
18
41
  defaults: [:d,:default],
42
+ params: [:url_params],
43
+ ne: [:exception,:exceptions,:ex],
19
44
 
20
45
  get: [:read],
21
46
  post: [:create],
@@ -32,14 +57,57 @@ module Rails
32
57
  opts[:defaults] ||= {}
33
58
  opts[:resource] ||= args.select{|e|([::Class,::String,::Symbol].include?(e.class))}[0]
34
59
 
60
+ opts[:params] ||= args.select{|e|(e.class <= ::Array)}
61
+ opts[:params] ||= []
62
+
63
+ opts[:urls] ||= {}
64
+ opts[:ne] ||= []
65
+
66
+ opts[:ne].map!{|method_name_to_sym| method_name_to_sym.to_s.to_sym }
67
+
35
68
  [:get,:post,:put,:delete,:options].each{|sym| opts[sym] ||= [] ; opts[sym]= [opts[sym]] unless opts[sym].class <= ::Array }
36
69
 
70
+ unless opts[:params].class <= ::Array
71
+ raise(ArgumentError,"invalid argument for url params: #{opts[:params]}.\nmust be something like [:method_name,[:url_params]] || [:method_name,:url_params]")
72
+ end
73
+
74
+ unless opts[:urls].class <= ::Hash
75
+ raise(ArgumentError,"invalid argument for urls group: #{opts[:urls]}.\nmust be something like {method_name: '/path'}")
76
+ end
77
+
78
+ unless opts[:params].empty?
79
+
80
+ opts[:params].each{|ary| raise unless ary.size == 2 }
81
+ opts[:params].each{|ary| ary[1]= [ary[1]] unless ary[1].class <= ::Array }
82
+
83
+ end
84
+
37
85
  # validations
38
86
  raise(ArgumentError,"Invalid defaults given") unless opts[:defaults].class <= ::Hash
39
87
 
40
88
  opts[:short_class_name]= opts[:resource].to_s.underscore.split('_')[0]
41
- opts[:class] = ( opts[:resource].class == Class ? opts[:resource] : opts[:resource].to_s.concat('_controller').classify.constantize )
89
+ opts[:class] = ( opts[:resource].class == Class ? opts[:resource] : opts[:resource].to_s.concat('_controller').classify.constantize )
90
+ opts[:pim] = opts[:class].public_instance_methods(false).select{|e|(e.to_s.last != '?')} - opts[:ne]
91
+
92
+ # make setup able method configs
93
+ opts[:pim].each do |sym|
94
+
95
+ sym_str= sym.to_s
96
+ {
97
+ get: /_get$/,
98
+ post: /_post$/,
99
+ put: /_put$/,
100
+ delete: /_delete$/
101
+ }.each do |type,regex|
102
+
103
+ if sym_str =~ regex
104
+ opts[type].push(sym)
105
+ opts[:urls][sym] ||= "/#{sym_str.gsub(regex,"")}"
106
+ end
107
+
108
+ end
42
109
 
110
+ end
43
111
 
44
112
  return opts
45
113
 
@@ -51,13 +119,18 @@ module Rails
51
119
 
52
120
  def mount_controller *args
53
121
 
54
- opts= Rails::DSL::ActionDispatchRouteEXT::Helpers.process_args(*args)
122
+ opts= nil
123
+ if args.size == 1 && args[0].class <= ::Hash
124
+ opts= args[0]
125
+ else
126
+ opts= Rails::DSL::ActionDispatchRouteEXT::Helpers.process_args(*args)
127
+ end
55
128
 
56
129
  # helper lambdas
57
130
 
58
131
  create_mapping= lambda do
59
132
 
60
- opts[:class].public_instance_methods(false).each do |method_name|
133
+ opts[:pim].each do |method_name|
61
134
 
62
135
  method_to_use= nil
63
136
  [:get,:post,:put,:delete,:options].each do |pre_spec_method_call_type|
@@ -67,7 +140,11 @@ module Rails
67
140
  end
68
141
  method_to_use ||= :get
69
142
 
70
- self.__send__ method_to_use,"/#{method_name}",{to: "#{opts[:short_class_name]}##{method_name}"}.merge({defaults: opts[:defaults]})
143
+ url_path = opts[:urls][method_name].nil? ? "/#{method_name}" : opts[:urls][method_name].to_s
144
+
145
+ self.__send__ method_to_use,
146
+ "#{url_path}#{Rails::DSL::ActionDispatchRouteEXT::Helpers.array_to_url_params(opts[:params],method_name)}",
147
+ {to: "#{opts[:short_class_name]}##{method_name}", defaults: opts[:defaults].dup }
71
148
 
72
149
  end
73
150
 
@@ -82,20 +159,51 @@ module Rails
82
159
  create_mapping.call
83
160
  end
84
161
 
162
+ return nil
163
+
85
164
  end
86
165
 
87
- # def mount_controller_api *args
88
- # opts= Rails::DSL::ActionDispatchRouteEXT::Helpers.process_args(*args)
89
- #
90
- # # respond_to do |format|
91
- # # format.html
92
- # # format.json{
93
- # # render :json => {hello: 'world'}
94
- # # }
95
- # # end
96
- #
97
- # end
98
- # alias mount_controller_as_api mount_controller_api
166
+ def mount_controller_as_api *args
167
+
168
+ opts= Rails::DSL::ActionDispatchRouteEXT::Helpers.process_args(*args)
169
+ conv_params= []
170
+
171
+ # make last value return as value object rendered as the specific format
172
+ opts[:class].class_eval do
173
+
174
+ opts[:pim].each do |sym|
175
+
176
+ var= self.instance_method(sym)
177
+ parameters= []
178
+
179
+ unless var.parameters.select{|ary|(ary[0] ==:req)}.empty?
180
+ parameters += var.parameters.select{|ary|(ary[0] ==:req)}.map{|ary| ary[1] }
181
+ conv_params.push [ sym, parameters ]
182
+ end
183
+
184
+ define_method(sym) do
185
+
186
+ value= var.bind(self).call(*parameters.map{ |param_key| params[param_key] })
187
+
188
+ respond_to do |format|
189
+ format.html
190
+ format.json { render json: value }
191
+ format.xml { render xml: value }
192
+ end
193
+
194
+ end
195
+
196
+ end
197
+
198
+ end
199
+
200
+ # mount controller methods
201
+ mount_controller *args,*conv_params, { defaults: {format: :json} }
202
+
203
+ return nil
204
+
205
+ end
206
+ alias mount_api mount_controller_as_api
99
207
 
100
208
  end
101
209
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails-dsl
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.3
4
+ version: 0.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam Luzsi