rest_area 1.4.3 → 2.0.0
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 +7 -55
- data/app/controllers/rest_area/application_controller.rb +1 -12
- data/app/controllers/rest_area/rest_controller.rb +22 -29
- data/config/routes.rb +0 -1
- data/lib/rest_area/version.rb +1 -1
- data/lib/rest_area.rb +1 -26
- metadata +24 -84
- data/app/controllers/concerns/gets_klass.rb +0 -26
- data/app/controllers/rest_area/message_controller.rb +0 -38
- data/lib/rest_area/configuration.rb +0 -45
- data/lib/rest_area/resource.rb +0 -75
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8e8eafe9476bbb11ea8d35670e7c04fa4d00fe1a
|
4
|
+
data.tar.gz: 189aca44997b83a548bacff763d2b766fe953852
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a386cbaabf1f1c0afd3649372b5e1ecea5ee83774cdb7d43deb84de0e6375da643140a6cdca2eed193d7e844c291e433ea2382695847ed5c94130d9e560dc7b9
|
7
|
+
data.tar.gz: 6665be2ee5be3c856ec171e480f05435a5f67bc5c46e0e162e0df4281c86aaa651a1c89d84e1202c37af3d0cbf0591cc6456c643bd5b01c768e8d973b6b3419e
|
data/README.md
CHANGED
@@ -1,18 +1,16 @@
|
|
1
|
-
[](https://codeclimate.com/github/bguest/rest_area) [](https://travis-ci.org/bguest/rest_area) [](https://coveralls.io/r/bguest/rest_area) [](http://badge.fury.io/rb/rest_area) [](https://gemnasium.com/bguest/rest_area)
|
2
|
-
|
3
1
|
# RestArea
|
4
2
|
|
5
|
-
This gem adds a bare bones rest api to a rails application. Simply
|
6
|
-
create the
|
3
|
+
This gem adds a off bare bones rest api to a rails application. Simply
|
4
|
+
create the initilizers file with the classes that you want to be in the
|
7
5
|
rest api and you will get the get basic rest routes for that class
|
8
6
|
This project rocks and uses MIT-LICENSE.
|
9
7
|
|
10
|
-
##
|
8
|
+
## Versions
|
11
9
|
|
12
10
|
This library supports both Rails 3.2.x and Rails 4.1.x.
|
13
11
|
|
14
12
|
### Rails 3.2.x
|
15
|
-
If you are
|
13
|
+
If you are useing Rails 3.2.x you should use the `rails-3_2` branch and/or version/tags 1.x.x, ie
|
16
14
|
|
17
15
|
gem 'rest_area', '~>1.0'
|
18
16
|
|
@@ -21,60 +19,14 @@ If you are using Rails 4.1.x you should use the master branch and/or versions/ta
|
|
21
19
|
|
22
20
|
gem 'rest_area', '~>2.0'
|
23
21
|
|
24
|
-
##
|
25
|
-
|
26
|
-
1. Create a file called `rest_area.rb` in your initializers file
|
27
|
-
2. Add configuration like the following in that file.
|
28
|
-
|
29
|
-
RestArea.configure do
|
30
|
-
resources :thing_one, :thing_two # Defaults to all actions
|
31
|
-
|
32
|
-
resources :cereal, :thing do
|
33
|
-
action :index, :show, :create, :update, :delete
|
34
|
-
key :name
|
35
|
-
headers({
|
36
|
-
'Cache-Control' => 'public, max-age=86400'
|
37
|
-
'Expires' => ->{Date.today + 1}
|
38
|
-
})
|
39
|
-
end
|
22
|
+
## Initilization / Setup
|
40
23
|
|
41
|
-
|
42
|
-
|
43
|
-
messages :say_hello, :ring_it_up
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
Alternatively you can still just pass in a class whitelist, but this is being deprecated.
|
24
|
+
1. Create a file called `rest_area.rb` in your initilizers file
|
25
|
+
2. Add something the following in that file.
|
48
26
|
|
49
27
|
RestArea.class_whitelist = [YourModel, ThatYouWant, ToBeInYour, RestApi]
|
50
28
|
|
51
|
-
|
52
29
|
3. Add something like the following to your `config/routes.rb` file.
|
53
30
|
|
54
31
|
mount RestArea::Engine => "/your_base_route"
|
55
32
|
|
56
|
-
### Config Settings
|
57
|
-
|
58
|
-
Within the RestArea.config block, use `resource` to specify a single resource and `resources` to specify mulitiple resources
|
59
|
-
|
60
|
-
With in the `resource` / `resources` block,
|
61
|
-
+ Use `action` to specify what actions that resource will respond to, the available actions are
|
62
|
-
`:index`, `:show`, `:create`, `:create`, `:update`, and `:delete`, the default is to use all actions
|
63
|
-
|
64
|
-
+ Use `read_only!` to specify that the resource will only respond to the `index` and `show` actions
|
65
|
-
|
66
|
-
+ Use `key` to specify what column rest_area will use to look up a resource. This is the column name
|
67
|
-
that is used for the `:key` in `/:resource/:key` part of the restful path. This defaults to `:id`
|
68
|
-
|
69
|
-
+ Use `message` or `messages` to whitelist methods for a class. Methods much be defined at
|
70
|
-
launch. Methods must respond with an object that responds to `.to_json`
|
71
|
-
|
72
|
-
+ Use `headers` to specify the response headers hash, this will be merged with existing headers
|
73
|
-
|
74
|
-
# Serializers
|
75
|
-
|
76
|
-
But what if I want to customize the JSON that comes back? Simple this
|
77
|
-
gem supports [active_model_serializer][1]. Go there, ignore the stuff
|
78
|
-
about controllers.
|
79
|
-
|
80
|
-
[1]:https://github.com/rails-api/active_model_serializers
|
@@ -1,15 +1,4 @@
|
|
1
1
|
module RestArea
|
2
|
-
class ApplicationController < ::
|
3
|
-
|
4
|
-
private
|
5
|
-
|
6
|
-
def rescue_uninitialized_constant
|
7
|
-
yield
|
8
|
-
rescue NameError => e
|
9
|
-
unless e.message =~ /uninitialized constant/
|
10
|
-
throw e
|
11
|
-
end
|
12
|
-
end
|
2
|
+
class ApplicationController < ActionController::Base
|
13
3
|
end
|
14
|
-
|
15
4
|
end
|
@@ -1,13 +1,7 @@
|
|
1
|
-
require 'saneitized'
|
2
|
-
|
3
1
|
module RestArea
|
4
2
|
class RestController < ApplicationController
|
5
3
|
skip_before_filter :verify_authenticity_token
|
6
|
-
|
7
|
-
before_filter :test_action
|
8
|
-
before_filter :set_class_serializer
|
9
|
-
before_filter :add_headers
|
10
|
-
before_filter :add_query_params, :only => [:index]
|
4
|
+
before_filter :get_class, :set_class_serializer
|
11
5
|
|
12
6
|
# GET
|
13
7
|
def index
|
@@ -19,13 +13,13 @@ module RestArea
|
|
19
13
|
end
|
20
14
|
|
21
15
|
def show
|
22
|
-
render json: @
|
16
|
+
render json: @klass.find(params[:id]), root: @root
|
23
17
|
end
|
24
18
|
alias_method :edit, :show
|
25
19
|
|
26
20
|
# POST
|
27
21
|
def create
|
28
|
-
object = @klass.new(
|
22
|
+
object = @klass.new(klass_params)
|
29
23
|
if object.save
|
30
24
|
render json: object, root:@root
|
31
25
|
else
|
@@ -35,8 +29,8 @@ module RestArea
|
|
35
29
|
|
36
30
|
# PUT
|
37
31
|
def update
|
38
|
-
object = @
|
39
|
-
if object.update_attributes(
|
32
|
+
object = @klass.find(params[:id])
|
33
|
+
if object.update_attributes(klass_params)
|
40
34
|
render json: object, root:@root
|
41
35
|
else
|
42
36
|
render_errors(object)
|
@@ -45,7 +39,7 @@ module RestArea
|
|
45
39
|
|
46
40
|
# DELETE
|
47
41
|
def delete
|
48
|
-
object = @
|
42
|
+
object = @klass.find(params[:id])
|
49
43
|
if object.destroy
|
50
44
|
render json: object, root:@root
|
51
45
|
else
|
@@ -59,34 +53,33 @@ module RestArea
|
|
59
53
|
render json: {errors: object.errors}, :status => :unprocessable_entity
|
60
54
|
end
|
61
55
|
|
62
|
-
def
|
63
|
-
|
64
|
-
raise ActionController::RoutingError.new("Resource Does Not Exist")
|
65
|
-
end
|
56
|
+
def query_params
|
57
|
+
params.slice('limit','order').symbolize_keys
|
66
58
|
end
|
67
59
|
|
68
60
|
def klass_params
|
69
|
-
params.require(@root.to_sym).permit
|
70
|
-
end
|
71
|
-
|
72
|
-
def add_headers
|
73
|
-
response.headers.merge! @resource.headers
|
74
|
-
end
|
75
|
-
|
76
|
-
def add_query_params
|
77
|
-
where_params = params.slice(*@klass.column_names)
|
78
|
-
if where_params.any?
|
79
|
-
@klass = @klass.where(Saneitized.convert(where_params).to_h)
|
80
|
-
end
|
61
|
+
params.require(@root.to_sym).permit(@klass.column_names.map(&:to_sym))
|
81
62
|
end
|
82
63
|
|
83
64
|
def set_class_serializer
|
84
65
|
@serializer = ( '::' + @klass.to_s + "Serializer" ).constantize
|
85
66
|
rescue NameError => e
|
86
|
-
|
67
|
+
if e.message =~ /uninitialized constant/
|
68
|
+
@serializer = false
|
69
|
+
else
|
87
70
|
throw e
|
88
71
|
end
|
89
72
|
end
|
90
73
|
|
74
|
+
def get_class
|
75
|
+
@klass = params[:klass].singularize.camelize.constantize
|
76
|
+
unless RestArea.class_whitelist.include? @klass
|
77
|
+
raise ActionController::RoutingError.new("Resource Does Not Exist")
|
78
|
+
end
|
79
|
+
|
80
|
+
@roots = ActionController::Base.helpers.sanitize(params[:klass])
|
81
|
+
@root = @roots.singularize
|
82
|
+
end
|
83
|
+
|
91
84
|
end
|
92
85
|
end
|
data/config/routes.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
RestArea::Engine.routes.draw do
|
2
2
|
get '/:klass', :to => "rest#index"
|
3
3
|
get '/:klass/:id', :to => "rest#show"
|
4
|
-
get '/:klass/:id/:message', :to => 'message#get'
|
5
4
|
post '/:klass', :to => "rest#create"
|
6
5
|
put '/:klass/:id', :to => "rest#update"
|
7
6
|
delete '/:klass/:id', :to => "rest#delete"
|
data/lib/rest_area/version.rb
CHANGED
data/lib/rest_area.rb
CHANGED
@@ -1,30 +1,5 @@
|
|
1
1
|
require "rest_area/engine"
|
2
|
-
require 'rest_area/resource'
|
3
|
-
require 'rest_area/configuration'
|
4
|
-
|
5
2
|
|
6
3
|
module RestArea
|
7
|
-
|
8
|
-
|
9
|
-
class << self
|
10
|
-
|
11
|
-
def config
|
12
|
-
@config ||= RestArea::Configuration.new
|
13
|
-
end
|
14
|
-
|
15
|
-
def configure(&block)
|
16
|
-
self.config.instance_eval(&block) if block_given?
|
17
|
-
end
|
18
|
-
|
19
|
-
def resources
|
20
|
-
self.config.resources
|
21
|
-
end
|
22
|
-
|
23
|
-
def class_whitelist=(array)
|
24
|
-
resources.clear
|
25
|
-
array.each do |klass|
|
26
|
-
self.config.resource klass.name.underscore.to_sym
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
4
|
+
mattr_accessor :class_whitelist
|
30
5
|
end
|
metadata
CHANGED
@@ -1,141 +1,85 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rest_area
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Benjamin Guest
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2014-04-30 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
|
-
version:
|
19
|
+
version: '4.1'
|
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:
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: saneitized
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - ~>
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '1.2'
|
34
|
-
type: :runtime
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - ~>
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '1.2'
|
26
|
+
version: '4.1'
|
41
27
|
- !ruby/object:Gem::Dependency
|
42
28
|
name: rspec-rails
|
43
29
|
requirement: !ruby/object:Gem::Requirement
|
44
30
|
requirements:
|
45
|
-
- - ~>
|
31
|
+
- - "~>"
|
46
32
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
33
|
+
version: 3.0.0.beta
|
48
34
|
type: :development
|
49
35
|
prerelease: false
|
50
36
|
version_requirements: !ruby/object:Gem::Requirement
|
51
37
|
requirements:
|
52
|
-
- - ~>
|
38
|
+
- - "~>"
|
53
39
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
40
|
+
version: 3.0.0.beta
|
55
41
|
- !ruby/object:Gem::Dependency
|
56
42
|
name: mocha
|
57
43
|
requirement: !ruby/object:Gem::Requirement
|
58
44
|
requirements:
|
59
|
-
- - ~>
|
45
|
+
- - "~>"
|
60
46
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
47
|
+
version: 1.0.0
|
62
48
|
type: :development
|
63
49
|
prerelease: false
|
64
50
|
version_requirements: !ruby/object:Gem::Requirement
|
65
51
|
requirements:
|
66
|
-
- - ~>
|
52
|
+
- - "~>"
|
67
53
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: sqlite3
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - ~>
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: '1.3'
|
76
|
-
type: :development
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - ~>
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: '1.3'
|
54
|
+
version: 1.0.0
|
83
55
|
- !ruby/object:Gem::Dependency
|
84
56
|
name: combustion
|
85
57
|
requirement: !ruby/object:Gem::Requirement
|
86
58
|
requirements:
|
87
|
-
- - ~>
|
59
|
+
- - "~>"
|
88
60
|
- !ruby/object:Gem::Version
|
89
61
|
version: 0.5.1
|
90
62
|
type: :development
|
91
63
|
prerelease: false
|
92
64
|
version_requirements: !ruby/object:Gem::Requirement
|
93
65
|
requirements:
|
94
|
-
- - ~>
|
66
|
+
- - "~>"
|
95
67
|
- !ruby/object:Gem::Version
|
96
68
|
version: 0.5.1
|
97
69
|
- !ruby/object:Gem::Dependency
|
98
|
-
name:
|
99
|
-
requirement: !ruby/object:Gem::Requirement
|
100
|
-
requirements:
|
101
|
-
- - ~>
|
102
|
-
- !ruby/object:Gem::Version
|
103
|
-
version: '0.9'
|
104
|
-
type: :development
|
105
|
-
prerelease: false
|
106
|
-
version_requirements: !ruby/object:Gem::Requirement
|
107
|
-
requirements:
|
108
|
-
- - ~>
|
109
|
-
- !ruby/object:Gem::Version
|
110
|
-
version: '0.9'
|
111
|
-
- !ruby/object:Gem::Dependency
|
112
|
-
name: coveralls
|
113
|
-
requirement: !ruby/object:Gem::Requirement
|
114
|
-
requirements:
|
115
|
-
- - ~>
|
116
|
-
- !ruby/object:Gem::Version
|
117
|
-
version: '0.7'
|
118
|
-
type: :development
|
119
|
-
prerelease: false
|
120
|
-
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
requirements:
|
122
|
-
- - ~>
|
123
|
-
- !ruby/object:Gem::Version
|
124
|
-
version: '0.7'
|
125
|
-
- !ruby/object:Gem::Dependency
|
126
|
-
name: timecop
|
70
|
+
name: sqlite3
|
127
71
|
requirement: !ruby/object:Gem::Requirement
|
128
72
|
requirements:
|
129
|
-
- - ~>
|
73
|
+
- - "~>"
|
130
74
|
- !ruby/object:Gem::Version
|
131
|
-
version:
|
75
|
+
version: '1.3'
|
132
76
|
type: :development
|
133
77
|
prerelease: false
|
134
78
|
version_requirements: !ruby/object:Gem::Requirement
|
135
79
|
requirements:
|
136
|
-
- - ~>
|
80
|
+
- - "~>"
|
137
81
|
- !ruby/object:Gem::Version
|
138
|
-
version:
|
82
|
+
version: '1.3'
|
139
83
|
description: RestArea adds a restfull controller and api to any Rails Application,
|
140
84
|
simply add the gem and whitelist of available models
|
141
85
|
email:
|
@@ -149,17 +93,13 @@ files:
|
|
149
93
|
- Rakefile
|
150
94
|
- app/assets/javascripts/rest_area/application.js
|
151
95
|
- app/assets/stylesheets/rest_area/application.css
|
152
|
-
- app/controllers/concerns/gets_klass.rb
|
153
96
|
- app/controllers/rest_area/application_controller.rb
|
154
|
-
- app/controllers/rest_area/message_controller.rb
|
155
97
|
- app/controllers/rest_area/rest_controller.rb
|
156
98
|
- app/helpers/rest_area/application_helper.rb
|
157
99
|
- app/views/layouts/rest_area/application.html.erb
|
158
100
|
- config/routes.rb
|
159
101
|
- lib/rest_area.rb
|
160
|
-
- lib/rest_area/configuration.rb
|
161
102
|
- lib/rest_area/engine.rb
|
162
|
-
- lib/rest_area/resource.rb
|
163
103
|
- lib/rest_area/version.rb
|
164
104
|
- lib/tasks/rest_area_tasks.rake
|
165
105
|
homepage: https://github.com/bguest/rest_area
|
@@ -171,17 +111,17 @@ require_paths:
|
|
171
111
|
- lib
|
172
112
|
required_ruby_version: !ruby/object:Gem::Requirement
|
173
113
|
requirements:
|
174
|
-
- -
|
114
|
+
- - ">="
|
175
115
|
- !ruby/object:Gem::Version
|
176
116
|
version: '0'
|
177
117
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
178
118
|
requirements:
|
179
|
-
- -
|
119
|
+
- - ">="
|
180
120
|
- !ruby/object:Gem::Version
|
181
121
|
version: '0'
|
182
122
|
requirements: []
|
183
123
|
rubyforge_project:
|
184
|
-
rubygems_version: 2.
|
124
|
+
rubygems_version: 2.2.2
|
185
125
|
signing_key:
|
186
126
|
specification_version: 4
|
187
127
|
summary: Adds a restfull controller and api to a Rails Application
|
@@ -1,26 +0,0 @@
|
|
1
|
-
module GetsKlass
|
2
|
-
extend ActiveSupport::Concern
|
3
|
-
|
4
|
-
included do
|
5
|
-
before_filter :get_klass
|
6
|
-
end
|
7
|
-
|
8
|
-
def get_klass
|
9
|
-
rescue_uninitialized_constant do
|
10
|
-
klass = params[:klass].classify.constantize
|
11
|
-
@resource = RestArea.resources[klass.name.underscore.to_sym]
|
12
|
-
@klass = @resource.klass
|
13
|
-
end
|
14
|
-
test_class(@klass)
|
15
|
-
|
16
|
-
@roots = ActionController::Base.helpers.sanitize(params[:klass]).pluralize
|
17
|
-
@root = @roots.singularize
|
18
|
-
end
|
19
|
-
|
20
|
-
def test_class(klass)
|
21
|
-
if klass.nil? || !RestArea.resources.include?(klass.name.underscore.to_sym)
|
22
|
-
raise ActionController::RoutingError.new("Resource Does Not Exist")
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
end
|
@@ -1,38 +0,0 @@
|
|
1
|
-
module RestArea
|
2
|
-
class MessageController < ApplicationController
|
3
|
-
include GetsKlass
|
4
|
-
before_filter :get_message, :set_message_class, :set_message_serializer
|
5
|
-
|
6
|
-
def get
|
7
|
-
if @message_serializer
|
8
|
-
render json: @resource.find(params[:id]).send(@message).all, each_serializer: @message_serializer, root:@message
|
9
|
-
elsif @message_class
|
10
|
-
render json: { @message => @resource.find(params[:id]).send(@message).all }.to_json(root:false)
|
11
|
-
elsif @resource.can_send?(@message)
|
12
|
-
render json: @resource.find(params[:id]).send(@message).to_json(root:false)
|
13
|
-
else
|
14
|
-
raise ActionController::RoutingError.new("Resource Does Not Exist")
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
private
|
19
|
-
|
20
|
-
def get_message
|
21
|
-
@message = params[:message]
|
22
|
-
end
|
23
|
-
|
24
|
-
def set_message_class
|
25
|
-
rescue_uninitialized_constant do
|
26
|
-
@message_class = @message.classify.constantize
|
27
|
-
end
|
28
|
-
test_class(@message_class) if @message_class
|
29
|
-
end
|
30
|
-
|
31
|
-
def set_message_serializer
|
32
|
-
return unless @message_class
|
33
|
-
rescue_uninitialized_constant do
|
34
|
-
@message_serializer = ( '::' + @message.classify + "Serializer" ).constantize
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
@@ -1,45 +0,0 @@
|
|
1
|
-
##
|
2
|
-
# Used for configuring rest_area
|
3
|
-
#
|
4
|
-
# Example:
|
5
|
-
#
|
6
|
-
# RestArea.configure do
|
7
|
-
# resources :cereal, :thing do
|
8
|
-
# action :index, :show, :create, :update, :delete
|
9
|
-
# messages :say_hello, :say_goodbye
|
10
|
-
# headers ({
|
11
|
-
# 'Cache-Control' => 'public, max-age=86400'
|
12
|
-
# 'Expires' => ->{Date.today + 1}
|
13
|
-
# })
|
14
|
-
# end
|
15
|
-
#
|
16
|
-
# resource :supermarket do
|
17
|
-
# read_only!
|
18
|
-
# key :name
|
19
|
-
# message :ring_it_up
|
20
|
-
# end
|
21
|
-
# end
|
22
|
-
#
|
23
|
-
module RestArea
|
24
|
-
class Configuration
|
25
|
-
|
26
|
-
def initialize()
|
27
|
-
@resources = {}
|
28
|
-
end
|
29
|
-
|
30
|
-
def resources(*args, &block)
|
31
|
-
if args.any?
|
32
|
-
args.each do |klass| resource(klass, &block) end
|
33
|
-
else
|
34
|
-
@resources
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
def resource(klass, &block)
|
39
|
-
resource = @resources[klass] || Resource.new(klass)
|
40
|
-
resource.instance_eval(&block) if block_given?
|
41
|
-
@resources[klass] = resource
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
end
|
data/lib/rest_area/resource.rb
DELETED
@@ -1,75 +0,0 @@
|
|
1
|
-
module RestArea
|
2
|
-
class Resource
|
3
|
-
|
4
|
-
attr_reader :actions, :klass
|
5
|
-
|
6
|
-
def initialize(klss)
|
7
|
-
@actions = []
|
8
|
-
@klass = klss.to_s.classify.constantize
|
9
|
-
end
|
10
|
-
|
11
|
-
def action(*args)
|
12
|
-
@actions ||= []
|
13
|
-
@actions += args
|
14
|
-
@actions.uniq!
|
15
|
-
end
|
16
|
-
|
17
|
-
def messages(*args)
|
18
|
-
@messages ||= []
|
19
|
-
if args.any?
|
20
|
-
args.each do |m| message(m) end
|
21
|
-
else
|
22
|
-
@messages
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
def message(msg)
|
27
|
-
@messages ||= []
|
28
|
-
if klass.method_defined? msg
|
29
|
-
@messages << msg
|
30
|
-
@messages.uniq!
|
31
|
-
else
|
32
|
-
raise NoMethodError.new("#{klass} will not respond to #{msg}")
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
def headers(hdrs = nil)
|
37
|
-
@headers ||= {}
|
38
|
-
if hdrs
|
39
|
-
@headers.merge! hdrs
|
40
|
-
else
|
41
|
-
@headers.inject({}){ |hash, (key, value)|
|
42
|
-
value = value.call if value.kind_of? Proc
|
43
|
-
hash.merge(key => value)
|
44
|
-
}
|
45
|
-
end
|
46
|
-
end
|
47
|
-
alias_method :headers=, :headers
|
48
|
-
|
49
|
-
def read_only!
|
50
|
-
@actions = [:index, :show]
|
51
|
-
end
|
52
|
-
|
53
|
-
def can_do?(act)
|
54
|
-
self.actions.empty? || self.actions.include?(act)
|
55
|
-
end
|
56
|
-
|
57
|
-
def can_send?(msg)
|
58
|
-
self.messages.include?(msg.to_sym)
|
59
|
-
end
|
60
|
-
|
61
|
-
def key(key = nil)
|
62
|
-
key ? @key = key : (@key || :id)
|
63
|
-
end
|
64
|
-
|
65
|
-
# Wrapped Methods
|
66
|
-
def find(*args)
|
67
|
-
if key == :id
|
68
|
-
klass.find(*args)
|
69
|
-
else
|
70
|
-
klass.where(key => args[0]).first!
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
end
|
75
|
-
end
|