rails-rapido 0.4.0 → 0.5.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 +5 -5
- data/README.md +75 -3
- data/lib/rapido/api_controller.rb +20 -6
- data/lib/rapido/controller.rb +21 -0
- data/lib/rapido/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: eae5461189f3b0d670b870ac16c3f8e5b04ca3b57465e95151a360fd563cfa71
|
4
|
+
data.tar.gz: d89ae7dbcb57d036a65bf4f507f36b331e00ba77bb34e6305bd86f46e844e463
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ac1880f71e3289703a168beb617dcacb8136f6aceafddda189e143bd35e059608da3d6c6d4b6d7143a2af8dea1993dfee283d54407b9e5ad214c6807f5e317ea
|
7
|
+
data.tar.gz: be1bea5642f1da1261b786abe9c668737ef96fac8525207322635c937a158deb32759a03f68b93e9907132fd77dfc5ceb8462b8656860467e2a444b2a7b0803e
|
data/README.md
CHANGED
@@ -4,7 +4,79 @@
|
|
4
4
|
|
5
5
|
Rapido is a simple, highly opinionated library that can be included into your Rails controllers to enforce standardized behavior and security.
|
6
6
|
|
7
|
-
|
7
|
+
## API
|
8
|
+
|
9
|
+
#### `belongs_to`
|
10
|
+
|
11
|
+
Specifies the owner of the resource. For example, if many `Post` belonged to `User`, then in the `PostsController`, the following would be included: `belongs_to :user` and `Post` would be retrieved like so:
|
12
|
+
|
13
|
+
`User.find(params[:user_id]).posts.find([params[:id])`.
|
14
|
+
|
15
|
+
##### Optional Parameters
|
16
|
+
|
17
|
+
**has_one**
|
18
|
+
|
19
|
+
Default `false`. If `true`, will treat the `belongs_to` as `has_one`.
|
20
|
+
|
21
|
+
**owner**
|
22
|
+
|
23
|
+
This is the owner of the owner - if supplied, will be used to retrieve the owner. For example, if `User` belongs to `Group`, `Post` belongs to `User`, then in the `PostsController` if `belongs_to :user, owner: :current_group` was supplied, then the User would be retrieved from group before Post is retrieved from user, like so:
|
24
|
+
|
25
|
+
`current_group.users.find(params[:user_id]).posts.find(params[:id])`.
|
26
|
+
|
27
|
+
**getter**
|
28
|
+
|
29
|
+
Specifies the method to call to retrieve the owner, rather than retrieving by with URL parameters. For example, if `Post` belongs to `User`, then in the `PostsController` if `belongs_to :user, getter: :current_user` was supplied, then the post would be retrieved like so:
|
30
|
+
|
31
|
+
`current_user.posts.find(params[:id])`.
|
32
|
+
|
33
|
+
This can be useful when ownership exists but is not reflected in the route structure explicitly.
|
34
|
+
|
35
|
+
**foreign_key**
|
36
|
+
|
37
|
+
Default `id`. Specifies the name of the lookup column for the owner. For example, if `Post` belongs to `User`, then in the `PostsController` if `belongs_to :user, foreign_key: :token` is supplied, then the post would be retrieved like so:
|
38
|
+
|
39
|
+
`User.find_by(token: id).posts.find(params[:id])`.
|
40
|
+
|
41
|
+
**foreign_key_param**
|
42
|
+
|
43
|
+
Default `[singular owner name]_id`. Specifies the param used as the owner's foreign key. For example, if `Post` belongs to `User`, then in the `PostsController` if `belongs_to :user, foreign_key_param: :author_id` is supplied, then the post would be retrieved like so:
|
44
|
+
|
45
|
+
`User.find(params[:author_id]).posts.find(params[:id])`.
|
46
|
+
|
47
|
+
#### `lookup_param`
|
48
|
+
|
49
|
+
Specifies the param used to retrieve the resource. For example, if `Post` belongs to `User`, then in the `PostsController` if `lookup_param :token` is supplied, then the post would be retrieved like so:
|
50
|
+
|
51
|
+
`User.find_by(params[:id]).posts.find_by(token: params[:token])`.
|
52
|
+
|
53
|
+
#### `presented_by`
|
54
|
+
|
55
|
+
Specifies the class that will present the resource. This class must accept the resource as the only parameter at initialization, and respond to the `as_json` for output when used with the `Rapido::ApiController`.
|
56
|
+
|
57
|
+
#### `collection_presented_by`
|
58
|
+
|
59
|
+
Specifies the class that will present a collection of resources, as in the index method. Similar to `presented_by`, the class must accept the resource collection as the only argument at initialization, and respond to `as_json` for output when used with the `Rapido::ApiController`. The `collection_presented_by` can also accept a list of arguments, as symbols, that should be pulled from the `params` hash and passed to presenter class at initialization as optional argments.
|
60
|
+
|
61
|
+
For example, if `params` contained a `:filter` parameter which should be used by the presenter to filter the collection, then the following would work:
|
62
|
+
|
63
|
+
`collection_presented_by WidgetsCollectionPresenter, :filter`
|
64
|
+
|
65
|
+
The `initialize` method of the presenter should be structured as such:
|
66
|
+
|
67
|
+
`def initialize(widgets, filter = nil)`
|
68
|
+
|
69
|
+
#### `attr_permitted`
|
70
|
+
|
71
|
+
Accepts a list of symbols. These symbols specify the attributes that are supplied to StrongParameters as permitted parameters in `create` and `update` actions.
|
72
|
+
|
73
|
+
#### `permit_no_params!`
|
74
|
+
|
75
|
+
This will disallow any parameters in `create` and `update` actions.
|
76
|
+
|
77
|
+
#### `permit_all_params!`
|
78
|
+
|
79
|
+
This will permit all parameters in `create` and `update` actions.
|
8
80
|
|
9
81
|
## Development
|
10
82
|
|
@@ -14,9 +86,9 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
14
86
|
|
15
87
|
## Testing
|
16
88
|
|
17
|
-
Run `
|
89
|
+
Run `cucumber test/test_5_1` to execute all the tests in the test application.
|
18
90
|
|
19
91
|
## Contributing
|
20
92
|
|
21
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
93
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/starfighter/rapido.
|
22
94
|
|
@@ -16,35 +16,49 @@ module Rapido
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def index
|
19
|
-
render json: resource_collection
|
19
|
+
render json: present_resource_collection(resource_collection)
|
20
20
|
end
|
21
21
|
|
22
22
|
def show
|
23
|
-
render json: resource
|
23
|
+
render json: present_resource(resource)
|
24
24
|
end
|
25
25
|
|
26
26
|
def create
|
27
27
|
new_resource = build_resource(resource_params)
|
28
28
|
if new_resource.save
|
29
|
-
render json: new_resource
|
29
|
+
render json: present_resource(new_resource), status: :created
|
30
30
|
else
|
31
31
|
render json: { errors: new_resource.errors.full_messages }, status: 422
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
35
35
|
def destroy
|
36
|
-
|
36
|
+
resource_before_destruction = present_resource(resource)
|
37
37
|
resource.destroy
|
38
|
-
render json:
|
38
|
+
render json: resource_before_destruction
|
39
39
|
end
|
40
40
|
|
41
41
|
def update
|
42
42
|
resource.assign_attributes(resource_params)
|
43
43
|
if resource.save
|
44
|
-
render json: resource
|
44
|
+
render json: present_resource(resource)
|
45
45
|
else
|
46
46
|
render json: { errors: resource.errors.full_messages }, status: 422
|
47
47
|
end
|
48
48
|
end
|
49
|
+
|
50
|
+
private
|
51
|
+
|
52
|
+
def present_resource(resource)
|
53
|
+
return presenter.new(resource).as_json if presenter
|
54
|
+
resource.to_h
|
55
|
+
end
|
56
|
+
|
57
|
+
def present_resource_collection(resource_collection)
|
58
|
+
args = collection_presenter_args.nil? ? nil : collection_presenter_args.map { |arg| params[arg] }
|
59
|
+
return collection_presenter.new(*[resource_collection, *args].compact).as_json if collection_presenter
|
60
|
+
return resource_collection.map{ |r| presenter.new(r).as_json } if presenter
|
61
|
+
resource_collection.map(&:to_h)
|
62
|
+
end
|
49
63
|
end
|
50
64
|
end
|
data/lib/rapido/controller.rb
CHANGED
@@ -44,6 +44,11 @@ module Rapido
|
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
47
|
+
def collection_presented_by(presenter_class, *args)
|
48
|
+
@collection_presenter ||= presenter_class
|
49
|
+
@collection_presenter_args = args if args.count > 0
|
50
|
+
end
|
51
|
+
|
47
52
|
def owner_lookup_defaults
|
48
53
|
owner_lookup_param(@owner_class, :id)
|
49
54
|
owner_lookup_field(:id)
|
@@ -81,6 +86,10 @@ module Rapido
|
|
81
86
|
def resource_class_name
|
82
87
|
resource_class_from_controller
|
83
88
|
end
|
89
|
+
|
90
|
+
def presented_by(presenter_class)
|
91
|
+
@presenter ||= presenter_class
|
92
|
+
end
|
84
93
|
end
|
85
94
|
|
86
95
|
private
|
@@ -95,6 +104,14 @@ module Rapido
|
|
95
104
|
end
|
96
105
|
end
|
97
106
|
|
107
|
+
def collection_presenter
|
108
|
+
setting(:collection_presenter)
|
109
|
+
end
|
110
|
+
|
111
|
+
def collection_presenter_args
|
112
|
+
setting(:collection_presenter_args)
|
113
|
+
end
|
114
|
+
|
98
115
|
def owner_class
|
99
116
|
return nil unless setting(:owner_class)
|
100
117
|
@owner_class ||= begin
|
@@ -138,6 +155,10 @@ module Rapido
|
|
138
155
|
end
|
139
156
|
end
|
140
157
|
|
158
|
+
def presenter
|
159
|
+
setting(:presenter)
|
160
|
+
end
|
161
|
+
|
141
162
|
def resource
|
142
163
|
@resource ||= begin
|
143
164
|
if setting(:has_one)
|
data/lib/rapido/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails-rapido
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jonathan Kirst
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-09-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: kaminari
|
@@ -104,7 +104,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
104
104
|
version: '0'
|
105
105
|
requirements: []
|
106
106
|
rubyforge_project:
|
107
|
-
rubygems_version: 2.6
|
107
|
+
rubygems_version: 2.7.6
|
108
108
|
signing_key:
|
109
109
|
specification_version: 4
|
110
110
|
summary: Rails API Dryer-o
|