grape-dsl 1.3.0 → 2.0.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0d49f85e73510207801984abfad36a45999bf54c
4
- data.tar.gz: e1aa53de44935e387db8121c2985aaf388d360e9
3
+ metadata.gz: c7fd4082602f01e51467ed2c8140655173728963
4
+ data.tar.gz: 2f7021dfcfb5c9ca5c62f7c7b0e8fd5e52a8cea0
5
5
  SHA512:
6
- metadata.gz: a0cb2d97ce1259c36bbff809b037d91efd52076aa789af65bd095c16ab00221862887711fe0e85ada408c312845c7d86b3007681b9ad38f373de66077ab3e5ed
7
- data.tar.gz: 62e02105d1be4a63d276077cc3dd8ef12a7eab75dea64db53dda3cb1c5fc728dea4e3eafad527d07232f0ae5074444e4013228411ba9b6b6826b9f598d8731ac
6
+ metadata.gz: e10239cd86baaa86728eb9bf0dc68fd7d01d1dca05905a1b196a7e83c65014a6f216018251255170342b67cf177e2785763ded55807b5e678d240f41bb1b1ff6
7
+ data.tar.gz: ef7859cc6a82767ec9b0246b59f432bbd6d4dd5a06e93c217418ed46f94d29b33a5ca44864529dffe6d16d34f462f3f74a63f0959ffe7067d8c10b1b18e343e9
data/Gemfile.lock ADDED
@@ -0,0 +1,63 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ grape-dsl (2.0.0)
5
+ grape
6
+ mpatch
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ activesupport (4.1.0)
12
+ i18n (~> 0.6, >= 0.6.9)
13
+ json (~> 1.7, >= 1.7.7)
14
+ minitest (~> 5.1)
15
+ thread_safe (~> 0.1)
16
+ tzinfo (~> 1.1)
17
+ axiom-types (0.1.1)
18
+ descendants_tracker (~> 0.0.4)
19
+ ice_nine (~> 0.11.0)
20
+ thread_safe (~> 0.3, >= 0.3.1)
21
+ builder (3.2.2)
22
+ coercible (1.0.0)
23
+ descendants_tracker (~> 0.0.1)
24
+ descendants_tracker (0.0.4)
25
+ thread_safe (~> 0.3, >= 0.3.1)
26
+ equalizer (0.0.9)
27
+ grape (0.7.0)
28
+ activesupport
29
+ builder
30
+ hashie (>= 1.2.0)
31
+ multi_json (>= 1.3.2)
32
+ multi_xml (>= 0.5.2)
33
+ rack (>= 1.3.0)
34
+ rack-accept
35
+ rack-mount
36
+ virtus (>= 1.0.0)
37
+ hashie (2.1.1)
38
+ i18n (0.6.9)
39
+ ice_nine (0.11.0)
40
+ json (1.8.1)
41
+ minitest (5.3.2)
42
+ mpatch (2.8.0)
43
+ multi_json (1.9.2)
44
+ multi_xml (0.5.5)
45
+ rack (1.5.2)
46
+ rack-accept (0.4.5)
47
+ rack (>= 0.4)
48
+ rack-mount (0.8.3)
49
+ rack (>= 1.0.0)
50
+ thread_safe (0.3.3)
51
+ tzinfo (1.1.0)
52
+ thread_safe (~> 0.1)
53
+ virtus (1.0.2)
54
+ axiom-types (~> 0.1)
55
+ coercible (~> 1.0)
56
+ descendants_tracker (~> 0.0.3)
57
+ equalizer (~> 0.0.9)
58
+
59
+ PLATFORMS
60
+ ruby
61
+
62
+ DEPENDENCIES
63
+ grape-dsl!
data/LICENSE CHANGED
@@ -1,20 +1,20 @@
1
- The MIT License (MIT)
1
+ Copyright (c) 2013 Adam Luzsi
2
2
 
3
- Copyright (c) 2014 Adam Luzsi
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
4
10
 
5
- Permission is hereby granted, free of charge, to any person obtaining a copy of
6
- this software and associated documentation files (the "Software"), to deal in
7
- the Software without restriction, including without limitation the rights to
8
- use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
9
- the Software, and to permit persons to whom the Software is furnished to do so,
10
- subject to the following conditions:
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
11
13
 
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
17
- FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
18
- COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
19
- IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20
- CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md CHANGED
@@ -4,17 +4,63 @@ Grape-DSL
4
4
  DSL for Grape module that let you use some basic function much easier
5
5
  if you use redmine wiki you can even create doc into it
6
6
 
7
- ### Use case
7
+ ## Use case
8
+
9
+ ### Mount Grape api subclasses
8
10
 
9
11
  you can mount Grape::API-s all child class with
10
12
  ```ruby
13
+
14
+ # options = grape options for call
15
+ # class = target class
16
+ # rest = method name / REST METHOD NAME
17
+ # prc = These procs will be called with the binding of GrapeEndpoint,
18
+ # so params and headers Hash::Mash will be allowed to use
19
+ # they will run BEFORE the method been called, so ideal for auth stuffs
20
+ #
21
+ # args = This is for argument pre parsing,
22
+ # like when you use "hash" type for an argument
23
+ # and the input should be sent as json, but you want it to be preparsed when the method receive
24
+ #
25
+ # #> method hello parameter will be preparsed before passing to method
26
+ # simple use case => args: [:hello,:json],[:sup,:yaml]
27
+ # or
28
+ # args: { hello: :json, sup: :yaml }
29
+ #
30
+ # you can give hash options just like to any other get,post put delete etc methods, it will work
31
+ #
32
+
33
+ class HelloApi < Grape::API
34
+
35
+ get 'hello' do
36
+ puts 'hello world'
37
+ end
38
+
39
+ end
40
+
41
+ class SupApi < Grape::API
42
+
43
+ get 'sup' do
44
+ puts 'what\'s up?'
45
+ end
46
+
47
+ end
48
+
49
+
11
50
  class MainApi < Grape::API
51
+
52
+ # all pre app now is mounted here ("/hello","/sup")
12
53
  mount_subclasses
54
+
13
55
  end
56
+
14
57
  ```
15
58
 
16
- you can mount only a single singleton method from a class like this
17
- ps.: you can even set arguments to be json or yaml so it will be parsed before passing to method
59
+ ### Mount singleton methods as Rest calls
60
+
61
+ You can even set arguments to be json or yaml so it will be parsed before passing to method
62
+ In the default usecase, the mount process will read the method source for documentation for making desc
63
+
18
64
  ```ruby
19
65
 
20
66
  class TestClass
@@ -23,7 +69,6 @@ ps.: you can even set arguments to be json or yaml so it will be parsed before p
23
69
 
24
70
  end
25
71
 
26
- def self.complex_method
27
72
  def self.complex_method hello, world="default", opts={},*args
28
73
 
29
74
  puts "hello: #{hello}"
@@ -38,43 +83,57 @@ ps.: you can even set arguments to be json or yaml so it will be parsed before p
38
83
 
39
84
  class Api < Grape::API
40
85
 
41
- mount_method TestClass, :test_method
42
- mount_method Test,:test, "hello_world",[:opts,:json],[:args,:json]
86
+ mount_method class: TestClass,method: :test_method
87
+ # or
88
+ mount_method method: TestClass.method(:test_method)
89
+
90
+ mount_method class: Test,
91
+ method: :test,
92
+ path: "hello_world",
93
+ args: [[:opts,:yaml],[:args,:json]]
94
+
43
95
 
44
96
  end
45
97
 
46
98
  ```
47
99
 
48
- or if you are big fan of the CURS , then you can use this two method:
49
- response_headers_to_new_calls
50
- response_headers_to_routes_options_request
100
+ ### Access Control for ips
101
+
102
+ you can manipulate and ban ips from unwelcomed sources
51
103
 
52
- there is description in he headers file.
104
+ you can give static ips , or ranges by replacing number parts with stars
105
+
106
+ ```ruby
53
107
 
54
- so stuffs like this can be found in this project
108
+ "192.168.1.2" == "192.168.1.2"
109
+ "192.168.1.*" == ["192.168.1.0".."192.168.1.255"]
55
110
 
111
+ ```
112
+
113
+ here is an example for the use
114
+
115
+ ```ruby
56
116
 
57
- ## LICENSE
117
+ class API < Grape::API
58
118
 
59
- (The MIT License)
119
+ get :hello do
60
120
 
61
- Copyright (c) 2014++ Adam Luzsi <adamluzsi@gmail.com>
121
+ allowed_ips "192.168.*.*"
122
+ banned_ip "192.168.1.2"
62
123
 
63
- Permission is hereby granted, free of charge, to any person obtaining
64
- a copy of this software and associated documentation files (the
65
- 'Software'), to deal in the Software without restriction, including
66
- without limitation the rights to use, copy, modify, merge, publish,
67
- distribute, sublicense, and/or sell copies of the Software, and to
68
- permit persons to whom the Software is furnished to do so, subject to
69
- the following conditions:
124
+ # some stuff to do here
70
125
 
71
- The above copyright notice and this permission notice shall be
72
- included in all copies or substantial portions of the Software.
126
+ end
127
+
128
+ get :hello_world do
129
+
130
+ allowed_ips %W[ 192.168.*.* 127.0.0.1 ]
131
+ banned_ip ["192.168.1.2","192.168.1.1"]
132
+
133
+ # some stuff to do here
134
+
135
+ end
136
+
137
+ end
73
138
 
74
- THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
75
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
76
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
77
- IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
78
- CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
79
- TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
80
- SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
139
+ ```
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.3.0
1
+ 2.0.1
data/grape-dsl.gemspec CHANGED
@@ -19,8 +19,8 @@ Gem::Specification.new do |spec|
19
19
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
20
20
  spec.require_paths = ["lib"]
21
21
 
22
- spec.add_dependency "loader"
22
+ #spec.add_dependency "bindless"
23
+ spec.add_dependency "mpatch", '>= 2.8.0'
23
24
  spec.add_dependency "grape"
24
- spec.add_dependency "bindless"
25
25
 
26
26
  end
data/lib/grape-dsl.rb CHANGED
@@ -1,11 +1,22 @@
1
1
  #encoding: UTF-8
2
2
  module GrapeDSL
3
3
 
4
- require 'procemon'
4
+ #require 'bindless'
5
+ #require 'procemon'
6
+ #require 'mpatch'
7
+
8
+ require 'mpatch/module'
9
+ require 'mpatch/method'
10
+ MPatch.patch!
11
+
5
12
  require 'grape'
13
+
6
14
  require 'json'
7
15
  require 'yaml'
8
16
 
9
- require_relative_directory 'grape-dsl'
17
+ require 'grape-dsl/doc'
18
+ require 'grape-dsl/dsl'
19
+ require 'grape-dsl/ace'
20
+ require 'grape-dsl/mnt'
10
21
 
11
22
  end
@@ -0,0 +1,110 @@
1
+ module GrapeDSL
2
+ module Include
3
+ module AccessControlEndpoint
4
+
5
+ def generate_ip_regexp_collection *args
6
+
7
+ if args.empty?
8
+ raise ArgumentError, "missing ip(s) for allowed sources"
9
+ end
10
+
11
+ @cached_regexp_collection ||= {}
12
+ if @cached_regexp_collection[args].nil?
13
+ @cached_regexp_collection= {}
14
+
15
+ ip_regex_collection= []
16
+ args.each do |ip_addr|
17
+
18
+ ip_regex_builder= [[],[],[],[]]
19
+
20
+ #ip_addr.to_s.check(/([0-9\*]{1,3}\.){3}([0-9\*]{1,3})/)#(/([0-9\*]{1,3}\.){3}(0|\*)$/)
21
+ if (ip_addr.to_s =~ /([0-9\*]{1,3}\.){3}([0-9\*]{1,3})/).nil? ? false : true
22
+
23
+ ip_addr_index= 0
24
+ ip_addr.split('.').each do |ip_addr_part|
25
+
26
+ # 0.0.0.0
27
+ # 255.255.255.255
28
+
29
+ if ip_addr_part.include?("*")
30
+ ip_regex_builder[ip_addr_index]= "([0-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])"
31
+ else
32
+ ip_regex_builder[ip_addr_index].push(ip_addr_part)
33
+ end
34
+
35
+ # increment index
36
+ ip_addr_index += 1
37
+
38
+ end
39
+
40
+ else
41
+ next
42
+ end
43
+
44
+ ip_regex_builder.map! do |element|
45
+
46
+ case true
47
+
48
+ when element.class <= Regexp
49
+ element.inspect[1..(element.inspect.length-2)]
50
+
51
+ when element.class <= String
52
+ element
53
+
54
+ when element.class <= Array
55
+ "(#{element.join('|')})"
56
+
57
+ else
58
+ element.to_s
59
+
60
+ end
61
+
62
+ end
63
+
64
+ ip_regex_collection.push /#{ip_regex_builder.join('\.')}/
65
+
66
+ end
67
+
68
+ @cached_regexp_collection[args]= ip_regex_collection
69
+
70
+ end
71
+
72
+ return @cached_regexp_collection[args]
73
+
74
+ end
75
+
76
+ def allowed_ips *args
77
+
78
+ tests= generate_ip_regexp_collection(*args).map{ |regexp|
79
+ request.instance_variable_get("@env")['REMOTE_ADDR'] =~ regexp
80
+ }.compact
81
+
82
+ if tests.empty?
83
+ error!('403.6 - IP address rejected.', 403)
84
+ end
85
+
86
+ end
87
+
88
+ alias :allowed_ip :allowed_ips
89
+
90
+ def banned_ips *args
91
+
92
+ tests= generate_ip_regexp_collection(*args).map{ |regexp|
93
+ request.instance_variable_get("@env")['REMOTE_ADDR'] =~ regexp
94
+ }.compact
95
+
96
+ unless tests.empty?
97
+ error!('403.6 - IP address rejected.', 403)
98
+ end
99
+
100
+ end
101
+
102
+ alias :banned_ip :banned_ips
103
+
104
+
105
+
106
+ end
107
+ end
108
+ end
109
+
110
+ Grape::Endpoint.__send__ :include, ::GrapeDSL::Include::AccessControlEndpoint
data/lib/grape-dsl/doc.rb CHANGED
@@ -1,52 +1,3 @@
1
-
2
- class Array
3
- def convert_all_value_to_s
4
-
5
- self.count.times do |index|
6
-
7
- case self[index].class.to_s.downcase
8
-
9
- when "hash"
10
- self[index].convert_all_value_to_s
11
-
12
- when "array"
13
- self[index].convert_all_value_to_s
14
-
15
- else
16
- self[index]= self[index].to_s
17
-
18
-
19
- end
20
-
21
- end
22
-
23
- return self
24
- end
25
- end
26
- class Hash
27
- def convert_all_value_to_s
28
-
29
- self.each do |key,value|
30
-
31
- case value.class.to_s.downcase
32
-
33
- when "hash"
34
- value.convert_all_value_to_s
35
-
36
- when "array"
37
- value.convert_all_value_to_s
38
-
39
- else
40
- self[key]= value.to_s
41
-
42
- end
43
-
44
- end
45
-
46
- return self
47
- end
48
- end
49
-
50
1
  module GrapeDSL
51
2
  module Extend
52
3
  module Doc
@@ -58,6 +9,8 @@ module GrapeDSL
58
9
  # helpers for doc generation
59
10
  def wiki_body(route,wrapper_begin,wrapper_end,wrapper_close)
60
11
 
12
+ require 'grape-dsl/doc_mp'
13
+
61
14
  description_key= :body
62
15
  tmp_array= Array.new()
63
16
  params= nil
@@ -296,12 +249,12 @@ module GrapeDSL
296
249
  isym= "_"
297
250
 
298
251
  htsym= "* "
299
- mtsym= htsym[0]*2 +" "
300
- stsym= htsym[0]*3 +" "
252
+ mtsym= " * "
253
+ stsym= " * "
301
254
 
302
- hheader= "# "
303
- mheader= hheader[0]*2 +" "
304
- sheader= hheader[0]*3 +" "
255
+ hheader= "## "
256
+ mheader= "### "
257
+ sheader= "#### "
305
258
 
306
259
  container_markup_begin= "```"
307
260
  container_markup_end= ""
@@ -0,0 +1,58 @@
1
+
2
+ module GrapeDSL
3
+ module EXT
4
+
5
+ module ArrayMP
6
+ def convert_all_value_to_s
7
+
8
+ self.count.times do |index|
9
+
10
+ case self[index].class.to_s.downcase
11
+
12
+ when "hash"
13
+ self[index].convert_all_value_to_s
14
+
15
+ when "array"
16
+ self[index].convert_all_value_to_s
17
+
18
+ else
19
+ self[index]= self[index].to_s
20
+
21
+
22
+ end
23
+
24
+ end
25
+
26
+ return self
27
+ end
28
+ end
29
+
30
+ module HashMP
31
+ def convert_all_value_to_s
32
+
33
+ self.each do |key,value|
34
+
35
+ case value.class.to_s.downcase
36
+
37
+ when "hash"
38
+ value.convert_all_value_to_s
39
+
40
+ when "array"
41
+ value.convert_all_value_to_s
42
+
43
+ else
44
+ self[key]= value.to_s
45
+
46
+ end
47
+
48
+ end
49
+
50
+ return self
51
+ end
52
+ end
53
+
54
+ end
55
+ end
56
+
57
+ Array.__send__ :include, GrapeDSL::EXT::ArrayMP
58
+ Hash.__send__ :include, GrapeDSL::EXT::HashMP
data/lib/grape-dsl/dsl.rb CHANGED
@@ -1,75 +1,91 @@
1
1
  #encoding: UTF-8
2
-
3
2
  module GrapeDSL
4
3
  module Extend
5
4
 
6
- module API
5
+ module APIMNT
7
6
 
8
- # defaults
9
- # desc -> description for path
10
- # body -> return body from the call
11
- # convent_type -> real content type
12
- def description
7
+ # defaults
8
+ # desc -> description for path
9
+ # body -> return body from the call
10
+ # convent_type -> real content type
11
+ def description
13
12
 
14
- if desc.class <= String
15
- tmp_string= desc
16
- desc ::Hashie::Mash.new
17
- desc[:desc]= tmp_string
18
- end
13
+ if desc.class <= String
14
+ tmp_string= desc
15
+ desc ::Hashie::Mash.new
16
+ desc[:desc]= tmp_string
17
+ end
19
18
 
20
- unless desc.class <= Hash
21
- desc ::Hashie::Mash.new
22
- end
19
+ unless desc.class <= Hash
20
+ desc ::Hashie::Mash.new
21
+ end
23
22
 
24
- unless self.content_types.keys.empty?
23
+ unless self.content_types.keys.empty?
25
24
 
26
- content_type_name= nil
27
- [:json,:xml,:txt].each do |element|
28
- if self.content_types.keys.include? element
29
- content_type_name ||= element.to_s.upcase
30
- end
25
+ content_type_name= nil
26
+ [:json,:xml,:txt].each do |element|
27
+ if self.content_types.keys.include? element
28
+ content_type_name ||= element.to_s.upcase
31
29
  end
32
- desc[:convent_type] ||= content_type_name
33
-
34
30
  end
35
-
36
- return desc
31
+ desc[:convent_type] ||= content_type_name
37
32
 
38
33
  end
39
34
 
40
- # mount all the rest api classes that is subclass of the Grape::API
41
- # make easy to manage
42
- def mount_subclasses(*exception)
35
+ return desc
43
36
 
44
- # mark self as exception
45
- begin
46
- exception.push(self)
47
- end
37
+ end
48
38
 
49
- # mount components
50
- begin
51
- Grape::API.subclasses.each do |component|
52
- unless exception.include?(component)
53
- mount(component)
54
- end
55
- end
56
- end
39
+ # mount all the rest api classes that is subclass of the Grape::API
40
+ # make easy to manage
57
41
 
58
- return nil
42
+ def mount_api opts= {}
59
43
 
44
+ unless opts.class <= Hash
45
+ raise ArgumentError,"invalid option object given, must be hash like!"
60
46
  end
61
47
 
62
- # write out to the console the class routes
63
- def console_write_out_routes
48
+ opts[:ex] ||= opts[:except] || opts[:exception] || opts[:e] || []
49
+ opts[:in] ||= opts[:include] || opts[:inclusion] || opts[:i] || []
50
+
51
+ [:ex,:in].each{|sym| (opts[sym]=[opts[sym]]) unless opts[sym].class <= Array }
52
+
53
+ # mount components
54
+ Grape::API.inherited_by.each do |component|
64
55
 
65
- $stdout.puts "\n\nREST::API ROUTES:"
66
- self.routes.map do |route|
67
- $stdout.puts "\t#{route.route_method}","#{route.route_path}"
56
+ unless opts[:ex].include?(component) || self == component
57
+ mount(component)
68
58
  end
69
59
 
70
- return nil
71
60
  end
72
61
 
62
+ opts[:in].each{|cls| self.mount(cls) }
63
+
64
+ return nil
65
+
66
+ end
67
+
68
+ alias :mount_apis :mount_api
69
+
70
+ def mount_subclasses(*exception)
71
+ mount_api ex: exception
72
+ end
73
+
74
+ alias :mount_classes :mount_subclasses
75
+
76
+ # write out to the console the class routes
77
+ def console_write_out_routes
78
+
79
+ $stdout.puts "\n\nREST::API ROUTES:"
80
+ self.routes.each do |route|
81
+ $stdout.puts "#{route.route_method}","\t#{route.route_path}\n---\n"
82
+ end
83
+
84
+ return nil
85
+ end
86
+
87
+ alias :cw_routes :console_write_out_routes
88
+
73
89
 
74
90
  end
75
91
 
@@ -77,4 +93,4 @@ module GrapeDSL
77
93
 
78
94
  end
79
95
 
80
- Grape::API.__send__ :extend, ::GrapeDSL::Extend::API
96
+ Grape::API.__send__ :extend, ::GrapeDSL::Extend::APIMNT
@@ -0,0 +1,155 @@
1
+ # this is super if you want CORS with Grape
2
+ # This is a plugin for Mongoid
3
+ # models rest layer generate
4
+ module GrapeDSL
5
+ module Extend
6
+ module Mounter
7
+
8
+ # options = grape options element
9
+ # class = target class
10
+ # rest = method name / REST METHOD NAME
11
+ # prc = These procs will be called with the binding of GrapeEndpoint,
12
+ # so params and headers Hash::Mash will be allowed to use
13
+ # they will run BEFORE the method been called, so ideal for auth stuffs
14
+ #
15
+ # args = This is for argument pre parsing,
16
+ # like when you use "hash" type for an argument
17
+ # and the input should be sent as json, but you want it to be preparsed when the method receive
18
+ #
19
+ # #> method hello parameter will be preparsed before passing to method
20
+ # simple use case => args: [:hello,:json],[:sup,:yaml]
21
+ # or
22
+ # args: { hello: :json, sup: :yaml }
23
+ #
24
+ #
25
+ # ---------------
26
+ #
27
+ # looks like this with FULL POWER:
28
+ # mount_method rest: :get,
29
+ # class: TestClass,
30
+ # method: :test_method,
31
+ # path: "funny_path/okey",
32
+ # args: [[:arg_hello,:json]],#> or args: { arg_hello: :json }
33
+ # prc: Proc{ authorize_instance_method_from_grape_endpoint }
34
+ #
35
+ # you can give hash options just like to any other get,post put delete etc methods, it will work
36
+ #
37
+ def mount_method opts= {}, &block
38
+
39
+ unless opts.class <= Hash
40
+ raise ArgumentError, "invalid input, must be Hash like obj"
41
+ end
42
+
43
+ # required
44
+ opts[:method] ||= opts[:m] || raise(ArgumentError,"missing method input(:method)")
45
+
46
+ # optional
47
+ opts[:options] ||= opts[:o] || {}
48
+ opts[:rest_method] ||= opts[:r] || opts[:protocol] || opts[:rest] || opts[:rm] || :get
49
+ opts[:proc] ||= opts[:h] || opts[:prc] || opts[:hook] || block || Proc.new{}
50
+ opts[:path] ||= opts[:p] || opts[:method].name
51
+ opts[:args] ||= opts[:a] || opts[:arg] || {}
52
+
53
+ if opts[:method].class <= String || opts[:method].class <= Symbol
54
+
55
+ opts[:class] ||= opts[:c] || opts[:module] || raise(ArgumentError,"missing method input(:method)")
56
+ opts[:method] = opts[:class].method(opts[:method])
57
+
58
+ end
59
+
60
+ if opts[:args].class <= Array
61
+
62
+ tmp_hash = Hash.new
63
+ opts[:args].each do |array_obj|
64
+ if array_obj.count == 2
65
+ tmp_hash[array_obj[0]]= array_obj[1]
66
+ end
67
+ end
68
+ opts[:args]= tmp_hash
69
+
70
+ end
71
+
72
+ {
73
+
74
+ options: Hash,
75
+ rest_method: Symbol,
76
+ proc: Proc,
77
+ path: String,
78
+ args: Hash,
79
+ method: Method
80
+
81
+ }.each { |key,type|
82
+ unless opts[key].class <= type
83
+ raise(ArgumentError,"invalid #{key} value, must instance of an inherited class from #{type}")
84
+ end
85
+ }
86
+
87
+ opts[:rest_method] = opts[:rest_method].to_s.downcase.to_sym
88
+
89
+ desc opts[:method].get_comments
90
+
91
+ params do
92
+
93
+ opts[:method].parameters.each do |array_obj|
94
+
95
+ case array_obj[0]
96
+
97
+ when :req
98
+ requires array_obj[1]
99
+ when :opt
100
+ optional array_obj[1]
101
+ when :rest
102
+ optional array_obj[1],
103
+ type: Array
104
+
105
+ #when :block
106
+ # optional array_obj[1],
107
+ # type: String,
108
+ # desc: "Ruby code to be used"
109
+
110
+
111
+ end
112
+
113
+ end
114
+
115
+ end
116
+
117
+ self.__send__(opts[:rest_method], opts[:path], opts[:options]) do
118
+
119
+ opts[:proc].call_with_binding self.binding?
120
+ opts[:method].call(
121
+
122
+ *opts[:method].parameters.map { |element|
123
+
124
+ unless params[element[1]].nil?
125
+
126
+ # parse if requested
127
+ case opts[:args][element[1]].to_s
128
+ when 'json'
129
+ params[element[1]]= JSON.parse(params[element[1]])
130
+
131
+ when 'yaml', 'yml'
132
+ params[element[1]]= YAML.parse(params[element[1]])
133
+
134
+ end
135
+
136
+ # add new element
137
+ params[element[1]]
138
+
139
+ end
140
+
141
+ }.compact
142
+
143
+ )
144
+
145
+ end
146
+
147
+
148
+ end
149
+
150
+
151
+ end
152
+ end
153
+ end
154
+
155
+ Grape::API.__send__ :extend, ::GrapeDSL::Extend::Mounter
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: grape-dsl
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0
4
+ version: 2.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam Luzsi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-04-04 00:00:00.000000000 Z
11
+ date: 2014-04-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: loader
14
+ name: mpatch
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
19
+ version: 2.8.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
- version: '0'
26
+ version: 2.8.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: grape
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -38,20 +38,6 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
- - !ruby/object:Gem::Dependency
42
- name: bindless
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - ">="
46
- - !ruby/object:Gem::Version
47
- version: '0'
48
- type: :runtime
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- version: '0'
55
41
  description: DSL for Grape module that let you use some basic function much easier.
56
42
  For example mount all Grape class into a single one with a simple line
57
43
  email:
@@ -61,19 +47,19 @@ extensions: []
61
47
  extra_rdoc_files: []
62
48
  files:
63
49
  - Gemfile
50
+ - Gemfile.lock
64
51
  - LICENSE
65
- - LICENSE.txt
66
52
  - README.md
67
53
  - Rakefile
68
54
  - VERSION
69
55
  - files.rb
70
56
  - grape-dsl.gemspec
71
57
  - lib/grape-dsl.rb
58
+ - lib/grape-dsl/ace.rb
72
59
  - lib/grape-dsl/doc.rb
60
+ - lib/grape-dsl/doc_mp.rb
73
61
  - lib/grape-dsl/dsl.rb
74
- - lib/grape-dsl/endpoint.rb
75
- - lib/grape-dsl/headers.rb
76
- - lib/grape-dsl/mounter.rb
62
+ - lib/grape-dsl/mnt.rb
77
63
  homepage: https://github.com/adamluzsi/grape-dsl
78
64
  licenses:
79
65
  - MIT
data/LICENSE.txt DELETED
@@ -1,20 +0,0 @@
1
- Copyright (c) 2013 Adam Luzsi
2
-
3
- Permission is hereby granted, free of charge, to any person obtaining
4
- a copy of this software and associated documentation files (the
5
- "Software"), to deal in the Software without restriction, including
6
- without limitation the rights to use, copy, modify, merge, publish,
7
- distribute, sublicense, and/or sell copies of the Software, and to
8
- permit persons to whom the Software is furnished to do so, subject to
9
- the following conditions:
10
-
11
- The above copyright notice and this permission notice shall be
12
- included in all copies or substantial portions of the Software.
13
-
14
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -1,13 +0,0 @@
1
- module GrapeDSL
2
- module Extend
3
- module Endpoint
4
-
5
- attr_accessor :header_config_obj
6
- alias :config_obj :header_config_obj
7
- alias :config_obj= :header_config_obj=
8
-
9
- end
10
- end
11
- end
12
-
13
- Grape::Endpoint.__send__ :extend, ::GrapeDSL::Extend::Endpoint
@@ -1,78 +0,0 @@
1
-
2
- module GrapeDSL
3
- module Extend
4
- module Headers
5
-
6
- # example in yaml format
7
- # "header_name":
8
- # - "header values"
9
- # - "header value 2"
10
- #
11
- #
12
- # real example for cors
13
- # "Access-Control-Allow-Headers":
14
- # - "X-Idp-Id"
15
- # - "X-Token"
16
- # - "Content-Type"
17
- # "Access-Control-Allow-Origin":
18
- # - "*"
19
- # "Access-Control-Allow-Methods":
20
- # - HEAD
21
- # - OPTIONS
22
- # - GET
23
- # - POST
24
- # - PUT
25
- # - DELETE
26
- #
27
- #
28
- # This will give headers to all call request response made after this
29
- # make sure to load BEFORE every route call going to be made
30
- def response_headers_to_new_calls(config_obj=nil)
31
-
32
- Grape::Endpoint.config_obj= config_obj unless config_obj.nil?
33
- Grape::API.inject_singleton_method :inherited, add: "after" do |subclass|
34
-
35
- subclass.class_eval do
36
-
37
- before do
38
- Grape::Endpoint.header_config_obj.each do |header_key,header_value|
39
- header header_key, header_value.join(', ')
40
- end
41
- end
42
-
43
- end
44
-
45
- end
46
-
47
- return nil
48
- end
49
-
50
- # same config obj format like to "response_headers_to_new_calls"
51
- # this will create headers for the options call to ALL already made route
52
- # make sure to load after every route has been made
53
- def response_headers_to_routes_options_request(config_obj=nil)
54
-
55
- Grape::Endpoint.header_config_obj= config_obj unless config_obj.nil?
56
- Grape::API.subclasses.each do |rest_api_model|
57
- rest_api_model.routes.map { |route| route.route_path.split('(.:format)')[0] }.uniq.each do |path|
58
- rest_api_model.class_eval do
59
-
60
- options path do
61
- Grape::Endpoint.header_config_obj.each do |header_key,header_value|
62
- header header_key, header_value.join(', ')
63
- end
64
- end
65
-
66
- end
67
- end
68
-
69
- end
70
-
71
- return nil
72
- end
73
-
74
- end
75
- end
76
- end
77
-
78
- Grape.__send__ :extend, ::GrapeDSL::Extend::Headers
@@ -1,131 +0,0 @@
1
- # this is super if you want CORS with Grape
2
- # This is a plugin for Mongoid
3
- # models rest layer generate
4
- module GrapeDSL
5
- module Extend
6
- module Mounter
7
-
8
- # Args will be seperated by they class type
9
- # string = path part, will be joined with "/"
10
- # hash = grape options element
11
- # Class = target class
12
- # Symbol = method name / REST METHOD NAME
13
- # Proc = These procs will be called with the binding of GrapeEndpoint,
14
- # so params and headers Hash::Mash will be allowed to use
15
- # they will run BEFORE the method been called, so ideal for auth stuffs
16
- #
17
- # Array = This is for argument pre parsing, like when you use "hash" and the input will be a json
18
- #
19
- # simple use case: [:hello,:json],[:sup,:yaml]
20
- #
21
- #
22
- # ---------------
23
- #
24
- # looks like this with FULL POWER:
25
- # mount_method :GET,
26
- # TestClass,
27
- # :test_method,
28
- # "funny_path_first_part",
29
- # "funny_path_second_part",
30
- # [:arg_hello,:json],
31
- # Proc{ authorize_instance_method_from_grape_endpoint }
32
- #
33
- # you can give hash options just like to any other get,post put delete etc methods, it will work
34
- #
35
- def mount_method *args
36
-
37
- options = Hash[*args.extract_class!(Hash)]
38
- path_name = args.extract_class!(String).join('/')
39
- class_name = args.extract_class!(Class)[0]
40
- before_procs = args.extract_class!(Proc)
41
-
42
- tmp_array = args.extract_class!(Array)
43
- adapter_opt = Hash.new
44
-
45
- tmp_array.each do |array_obj|
46
- if array_obj.count == 2
47
- adapter_opt[array_obj[0]]= array_obj[1]
48
- end
49
- end
50
-
51
- method_name = nil
52
- rest_method = nil
53
-
54
- args.extract_class!(Symbol).each do |element|
55
- if element.to_s == element.to_s.downcase
56
- method_name = element
57
- elsif element.to_s == element.to_s.upcase
58
- rest_method = element.to_s.downcase
59
- end
60
- end
61
-
62
- rest_method ||= "get"
63
- method_obj = class_name.method(method_name).clone
64
-
65
- if path_name == String.new
66
- path_name= method_name.to_s
67
- end
68
-
69
-
70
- params do
71
-
72
- method_obj.parameters.each do |array_obj|
73
-
74
- case array_obj[0]
75
-
76
- when :req
77
- requires array_obj[1]
78
- when :opt
79
- optional array_obj[1]
80
- when :rest
81
- optional array_obj[1],
82
- type: Array
83
-
84
- #when :block
85
- # optional array_obj[1],
86
- # type: String,
87
- # desc: "Ruby code to be used"
88
-
89
-
90
- end
91
-
92
- end
93
-
94
- end
95
-
96
- __send__(rest_method,path_name,options) do
97
-
98
-
99
- method_arguments= (method_obj.parameters.map{|element|
100
- if !params[element[1]].nil?
101
-
102
- case adapter_opt[element[1]]
103
- when :json
104
- params[element[1]]= JSON.parse(params[element[1]])
105
-
106
- when :yaml
107
- params[element[1]]= YAML.parse(params[element[1]])
108
-
109
- end
110
-
111
- params[element[1]]
112
- end
113
- }-[nil])
114
-
115
- before_procs.each do |proc_obj|
116
- proc_obj.call_with_binding self.binding?
117
- end
118
-
119
- method_obj.call(*method_arguments)
120
-
121
- end
122
-
123
-
124
- end
125
-
126
-
127
- end
128
- end
129
- end
130
-
131
- Grape::API.__send__ :extend, ::GrapeDSL::Extend::Mounter