undercarriage 0.1.0 → 0.4.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +42 -4
- data/lib/undercarriage.rb +15 -3
- data/lib/undercarriage/controllers/action_concern.rb +18 -0
- data/lib/undercarriage/controllers/kaminari_concern.rb +11 -0
- data/lib/undercarriage/controllers/locale_concern.rb +7 -1
- data/lib/undercarriage/controllers/restful/actions/base_concern.rb +120 -0
- data/lib/undercarriage/controllers/restful/actions/create_concern.rb +107 -0
- data/lib/undercarriage/controllers/restful/actions/destroy_concern.rb +97 -0
- data/lib/undercarriage/controllers/restful/actions/edit_concern.rb +94 -0
- data/lib/undercarriage/controllers/restful/actions/index_concern.rb +85 -0
- data/lib/undercarriage/controllers/restful/actions/new_concern.rb +96 -0
- data/lib/undercarriage/controllers/restful/actions/show_concern.rb +91 -0
- data/lib/undercarriage/controllers/restful/actions/update_concern.rb +105 -0
- data/lib/undercarriage/controllers/restful/flash_concern.rb +112 -0
- data/lib/undercarriage/controllers/restful/location_after_concern.rb +79 -0
- data/lib/undercarriage/controllers/restful/namespace_concern.rb +41 -0
- data/lib/undercarriage/controllers/restful/permitted_attributes_concern.rb +109 -0
- data/lib/undercarriage/controllers/restful/utility_concern.rb +74 -0
- data/lib/undercarriage/controllers/restful_concern.rb +34 -0
- data/lib/undercarriage/models/published_concern.rb +120 -0
- data/lib/undercarriage/version.rb +4 -1
- metadata +17 -4
- data/lib/tasks/undercarriage_tasks.rake +0 -6
- data/lib/undercarriage/railtie.rb +0 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b12f7949572ff816f2b669ca0a6d94bfe8bce39ba6a744092b16ceedfda4cdac
|
4
|
+
data.tar.gz: 651b54c29ed119c043ca0542dccadfc7e6f60ffd471d86cbe1988c7f377d7c90
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: de197de22b4c1cada28489687edeea986d628a7dc3245932e0b33565e9a4061c74dea37b7f5981e24e4348262d22d8df1df026b204edb008c86665299098b8fc
|
7
|
+
data.tar.gz: da32a07d87b9eccfc756de524410800fc36fa1b63814bb1ea5defa95bf870f854824c98ccae3fc3f8dbbd0192bb97f56e9a3f7921e5448a9a90746dd06ef7e81
|
data/README.md
CHANGED
@@ -2,6 +2,10 @@
|
|
2
2
|
|
3
3
|
**\*Undercarriage is currently under development. It is not ready for production use.\***
|
4
4
|
|
5
|
+
[![CircleCI](https://circleci.com/gh/dfreerksen/undercarriage.svg?style=shield)](https://circleci.com/gh/dfreerksen/undercarriage)
|
6
|
+
[![Maintainability](https://api.codeclimate.com/v1/badges/d15980a534f8db936469/maintainability)](https://codeclimate.com/github/dfreerksen/undercarriage/maintainability)
|
7
|
+
[![Test Coverage](https://api.codeclimate.com/v1/badges/d15980a534f8db936469/test_coverage)](https://codeclimate.com/github/dfreerksen/undercarriage/test_coverage)
|
8
|
+
|
5
9
|
Undercarriage is a set of concerns to add to your application to trim some of the fat from controllers and models.
|
6
10
|
|
7
11
|
## Requirements
|
@@ -13,13 +17,13 @@ Undercarriage is a set of concerns to add to your application to trim some of th
|
|
13
17
|
|
14
18
|
Add to your application's Gemfile
|
15
19
|
|
16
|
-
```
|
17
|
-
gem 'undercarriage', '~> 0.
|
20
|
+
```
|
21
|
+
gem 'undercarriage', '~> 0.4'
|
18
22
|
```
|
19
23
|
|
20
24
|
Run the bundle command
|
21
25
|
|
22
|
-
```
|
26
|
+
```
|
23
27
|
$ bundle install
|
24
28
|
```
|
25
29
|
|
@@ -31,9 +35,43 @@ TODO
|
|
31
35
|
|
32
36
|
* [ ] Allow a way to set locale instead of relying on browser preferred language in `Undercarriage::Controllers::LocaleConcern`
|
33
37
|
|
38
|
+
## Testing
|
39
|
+
|
40
|
+
Run tests with one of the following
|
41
|
+
|
42
|
+
```
|
43
|
+
$ bin/test
|
44
|
+
$ bundle exec rspec spec
|
45
|
+
```
|
46
|
+
|
34
47
|
## Code Analysis
|
35
48
|
|
36
|
-
|
49
|
+
Various tools are used to ensure code is linted and formatted correctly.
|
50
|
+
|
51
|
+
### RuboCop
|
52
|
+
|
53
|
+
[RuboCop](https://github.com/bbatsov/rubocop) is a Ruby static code analyzer.
|
54
|
+
|
55
|
+
```
|
56
|
+
$ rubocop
|
57
|
+
```
|
58
|
+
|
59
|
+
## Documentation
|
60
|
+
|
61
|
+
[Yard](https://github.com/lsegal/yard) is used to generate documentation. [Online documentation is available](http://www.rubydoc.info/github/dfreerksen/undercarriage/master)
|
62
|
+
|
63
|
+
Build the documentation with one of the following
|
64
|
+
|
65
|
+
```
|
66
|
+
$ yard
|
67
|
+
$ yard doc
|
68
|
+
```
|
69
|
+
|
70
|
+
Build the documentation and list all undocumented objects
|
71
|
+
|
72
|
+
```
|
73
|
+
$ yard stats --list-undoc
|
74
|
+
```
|
37
75
|
|
38
76
|
## License
|
39
77
|
|
data/lib/undercarriage.rb
CHANGED
@@ -3,8 +3,21 @@
|
|
3
3
|
require 'undercarriage/controllers/action_concern'
|
4
4
|
require 'undercarriage/controllers/kaminari_concern'
|
5
5
|
require 'undercarriage/controllers/locale_concern'
|
6
|
-
|
7
|
-
require 'undercarriage/
|
6
|
+
require 'undercarriage/controllers/restful_concern'
|
7
|
+
require 'undercarriage/controllers/restful/actions/base_concern'
|
8
|
+
require 'undercarriage/controllers/restful/actions/index_concern'
|
9
|
+
require 'undercarriage/controllers/restful/actions/show_concern'
|
10
|
+
require 'undercarriage/controllers/restful/actions/new_concern'
|
11
|
+
require 'undercarriage/controllers/restful/actions/create_concern'
|
12
|
+
require 'undercarriage/controllers/restful/actions/edit_concern'
|
13
|
+
require 'undercarriage/controllers/restful/actions/update_concern'
|
14
|
+
require 'undercarriage/controllers/restful/actions/destroy_concern'
|
15
|
+
require 'undercarriage/controllers/restful/flash_concern'
|
16
|
+
require 'undercarriage/controllers/restful/location_after_concern'
|
17
|
+
require 'undercarriage/controllers/restful/namespace_concern'
|
18
|
+
require 'undercarriage/controllers/restful/permitted_attributes_concern'
|
19
|
+
require 'undercarriage/controllers/restful/utility_concern'
|
20
|
+
require 'undercarriage/models/published_concern'
|
8
21
|
|
9
22
|
##
|
10
23
|
# Undercarriage
|
@@ -12,5 +25,4 @@ require 'undercarriage/railtie'
|
|
12
25
|
# Undercarriage is a set of concerns to add to your application to trim some of the fat from controllers and models.
|
13
26
|
#
|
14
27
|
module Undercarriage
|
15
|
-
# Your code goes here...
|
16
28
|
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Undercarriage
|
4
|
+
# :nodoc:
|
4
5
|
module Controllers
|
5
6
|
##
|
6
7
|
# Action helpers
|
@@ -209,22 +210,39 @@ module Undercarriage
|
|
209
210
|
|
210
211
|
protected
|
211
212
|
|
213
|
+
##
|
214
|
+
# Action symbol
|
215
|
+
#
|
216
|
+
# Take `action_name` (string) and turn it into a symbol
|
217
|
+
#
|
212
218
|
def action
|
213
219
|
action_name.to_sym
|
214
220
|
end
|
215
221
|
|
222
|
+
##
|
223
|
+
# Collection actions
|
224
|
+
#
|
216
225
|
def collection_actions
|
217
226
|
%i[index]
|
218
227
|
end
|
219
228
|
|
229
|
+
##
|
230
|
+
# Member actions
|
231
|
+
#
|
220
232
|
def member_actions
|
221
233
|
%i[edit show update]
|
222
234
|
end
|
223
235
|
|
236
|
+
##
|
237
|
+
# Create actions
|
238
|
+
#
|
224
239
|
def create_actions
|
225
240
|
%i[create new]
|
226
241
|
end
|
227
242
|
|
243
|
+
##
|
244
|
+
# Update actions
|
245
|
+
#
|
228
246
|
def update_actions
|
229
247
|
%i[edit update]
|
230
248
|
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Undercarriage
|
4
|
+
# :nodoc:
|
4
5
|
module Controllers
|
5
6
|
##
|
6
7
|
# Kaminari pagination
|
@@ -61,10 +62,20 @@ module Undercarriage
|
|
61
62
|
|
62
63
|
protected
|
63
64
|
|
65
|
+
##
|
66
|
+
# Items per page key
|
67
|
+
#
|
68
|
+
# Query param to be used to identify count to be returned
|
69
|
+
#
|
64
70
|
def per_page_key
|
65
71
|
:per
|
66
72
|
end
|
67
73
|
|
74
|
+
##
|
75
|
+
# Page numberkey
|
76
|
+
#
|
77
|
+
# Query param to be used to identify page offset
|
78
|
+
#
|
68
79
|
def page_num_key
|
69
80
|
Kaminari.config.param_name
|
70
81
|
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Undercarriage
|
4
|
+
# :nodoc:
|
4
5
|
module Controllers
|
5
6
|
##
|
6
7
|
# Identify locale for translations
|
@@ -65,6 +66,11 @@ module Undercarriage
|
|
65
66
|
|
66
67
|
protected
|
67
68
|
|
69
|
+
##
|
70
|
+
# Set I18n locale
|
71
|
+
#
|
72
|
+
# Set I18n locale for the request
|
73
|
+
#
|
68
74
|
def identify_locale(&action)
|
69
75
|
I18n.with_locale(first_available_locale, &action)
|
70
76
|
end
|
@@ -75,7 +81,7 @@ module Undercarriage
|
|
75
81
|
preferred_locales = (accepted_languages_header << I18n.default_locale.to_s).uniq
|
76
82
|
available_locales = I18n.available_locales.map(&:to_s)
|
77
83
|
|
78
|
-
preferred_locales
|
84
|
+
(preferred_locales & available_locales).first
|
79
85
|
end
|
80
86
|
|
81
87
|
def accepted_languages_header
|
@@ -0,0 +1,120 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Undercarriage
|
4
|
+
# :nodoc:
|
5
|
+
module Controllers
|
6
|
+
# :nodoc:
|
7
|
+
module Restful
|
8
|
+
# :nodoc:
|
9
|
+
module Actions
|
10
|
+
##
|
11
|
+
# Base restful action
|
12
|
+
#
|
13
|
+
# Usage
|
14
|
+
# class ExamplesController < ApplicationController
|
15
|
+
# include Undercarriage::Controllers::Restful::Actions::BaseConcern
|
16
|
+
# end
|
17
|
+
#
|
18
|
+
module BaseConcern
|
19
|
+
extend ActiveSupport::Concern
|
20
|
+
|
21
|
+
protected
|
22
|
+
|
23
|
+
##
|
24
|
+
# New content action
|
25
|
+
#
|
26
|
+
# Decide what content to load based on action name
|
27
|
+
#
|
28
|
+
def resource_new_content
|
29
|
+
action_name == 'new' ? new_resource_content : create_resource_content
|
30
|
+
end
|
31
|
+
|
32
|
+
##
|
33
|
+
# Resource action
|
34
|
+
#
|
35
|
+
# Used for `show`, `edit`, `update` and `destroy` actions unless overwritten
|
36
|
+
#
|
37
|
+
# Usage
|
38
|
+
# class ExamplesController < ApplicationController
|
39
|
+
# include Undercarriage::Controllers::RestfulConcern
|
40
|
+
#
|
41
|
+
# ##
|
42
|
+
# # This method is only needed if you want to override the query entirely. Otherwise, it is not needed.
|
43
|
+
# # Database resources can be accessed as `@example`
|
44
|
+
# #
|
45
|
+
# # def resource_content
|
46
|
+
# # ...
|
47
|
+
# # end
|
48
|
+
#
|
49
|
+
# ##
|
50
|
+
# # To add authorization through something like Pundit, the following could be used
|
51
|
+
# #
|
52
|
+
# # def resource_content
|
53
|
+
# # super
|
54
|
+
# #
|
55
|
+
# # authorize @example
|
56
|
+
# # end
|
57
|
+
# end
|
58
|
+
#
|
59
|
+
def resource_content
|
60
|
+
resource_id = params.fetch(:id)
|
61
|
+
resource_query = model_class.find(resource_id)
|
62
|
+
|
63
|
+
instance_variable_set("@#{instance_name}", resource_query)
|
64
|
+
end
|
65
|
+
|
66
|
+
##
|
67
|
+
# Build nested association before action
|
68
|
+
#
|
69
|
+
# Called first thing from `new`, `create`, `edit` and `update` actions. Meant to build a basic resource before
|
70
|
+
# the action is evaluated
|
71
|
+
#
|
72
|
+
# Usage
|
73
|
+
# nested_resource_pre_build
|
74
|
+
# @example.build_image if @example.image.blank?
|
75
|
+
# end
|
76
|
+
#
|
77
|
+
def nested_resource_pre_build; end
|
78
|
+
|
79
|
+
##
|
80
|
+
# Build nested association for action
|
81
|
+
#
|
82
|
+
# Similar to `nested_resource_pre_build` but called in different places. For the `new` and `edit` actions, it
|
83
|
+
# is called right after `nested_resource_pre_build`. For the `create` and `update` actions, it is only called
|
84
|
+
# after validation has failed and before the view is rendered.
|
85
|
+
#
|
86
|
+
# Usage
|
87
|
+
# nested_resource_build
|
88
|
+
# @example.build_image if @example.image.blank?
|
89
|
+
# end
|
90
|
+
#
|
91
|
+
def nested_resource_build; end
|
92
|
+
|
93
|
+
##
|
94
|
+
# After create callback
|
95
|
+
#
|
96
|
+
# Callback after `create` action has created the record.
|
97
|
+
#
|
98
|
+
# Usage
|
99
|
+
# after_create_action
|
100
|
+
# ExampleJob.perform_later(@example.id)
|
101
|
+
# end
|
102
|
+
#
|
103
|
+
def after_create_action; end
|
104
|
+
|
105
|
+
##
|
106
|
+
# After update callback
|
107
|
+
#
|
108
|
+
# Callback after `update` action has updated the record.
|
109
|
+
#
|
110
|
+
# Usage
|
111
|
+
# after_update_action
|
112
|
+
# ExampleJob.perform_later(@example.id)
|
113
|
+
# end
|
114
|
+
#
|
115
|
+
def after_update_action; end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
@@ -0,0 +1,107 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Undercarriage
|
4
|
+
# :nodoc:
|
5
|
+
module Controllers
|
6
|
+
# :nodoc:
|
7
|
+
module Restful
|
8
|
+
# :nodoc:
|
9
|
+
module Actions
|
10
|
+
##
|
11
|
+
# Create restful action
|
12
|
+
#
|
13
|
+
# Usage
|
14
|
+
# class ExamplesController < ApplicationController
|
15
|
+
# include Undercarriage::Controllers::RestfulConcern
|
16
|
+
# end
|
17
|
+
#
|
18
|
+
module CreateConcern
|
19
|
+
extend ActiveSupport::Concern
|
20
|
+
|
21
|
+
included do
|
22
|
+
before_action :create_resource, only: %i[create]
|
23
|
+
end
|
24
|
+
|
25
|
+
##
|
26
|
+
# Create action
|
27
|
+
#
|
28
|
+
# Usage
|
29
|
+
# class ExamplesController < ApplicationController
|
30
|
+
# include Undercarriage::Controllers::RestfulConcern
|
31
|
+
#
|
32
|
+
# ##
|
33
|
+
# # This method is only needed if you want to override the action entirely. Otherwise, it is not needed.
|
34
|
+
# # Database resources can be accessed as `@create_resource` or `@example`
|
35
|
+
# #
|
36
|
+
# # def create
|
37
|
+
# # ...
|
38
|
+
# # end
|
39
|
+
# end
|
40
|
+
#
|
41
|
+
def create
|
42
|
+
nested_resource_pre_build
|
43
|
+
|
44
|
+
if @create_resource.save
|
45
|
+
after_create_action
|
46
|
+
|
47
|
+
flash[flash_status_type] = flash_created_message
|
48
|
+
|
49
|
+
redirect_to location_after_create
|
50
|
+
else
|
51
|
+
nested_resource_build
|
52
|
+
|
53
|
+
render :new, status: :unprocessable_entity
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
protected
|
58
|
+
|
59
|
+
##
|
60
|
+
# Create restful action
|
61
|
+
#
|
62
|
+
# Usage
|
63
|
+
# class ExamplesController < ApplicationController
|
64
|
+
# include Undercarriage::Controllers::RestfulConcern
|
65
|
+
#
|
66
|
+
# ##
|
67
|
+
# # This method is only needed if you want to override the query entirely. Otherwise, it is not needed.
|
68
|
+
# # Database resources can be accessed as `@example`
|
69
|
+
# #
|
70
|
+
# # def create_resource_content
|
71
|
+
# # ...
|
72
|
+
# # end
|
73
|
+
#
|
74
|
+
# ##
|
75
|
+
# # To add authorization through something like Pundit, the following could be used
|
76
|
+
# #
|
77
|
+
# # def create_resource_content
|
78
|
+
# # super
|
79
|
+
# #
|
80
|
+
# # authorize @example
|
81
|
+
# # end
|
82
|
+
#
|
83
|
+
# ##
|
84
|
+
# # The `resource_new_content` method can also be overwritten. This method is meant to share content with
|
85
|
+
# # the `new` action
|
86
|
+
# #
|
87
|
+
# # def resource_new_content
|
88
|
+
# # ...
|
89
|
+
# # end
|
90
|
+
# end
|
91
|
+
#
|
92
|
+
def create_resource_content
|
93
|
+
resource_query = model_class.new(create_resource_params)
|
94
|
+
|
95
|
+
instance_variable_set("@#{instance_name}", resource_query)
|
96
|
+
end
|
97
|
+
|
98
|
+
private
|
99
|
+
|
100
|
+
def create_resource
|
101
|
+
@create_resource ||= resource_new_content
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|