undercarriage 0.1.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 +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +48 -0
- data/Rakefile +19 -0
- data/lib/tasks/undercarriage_tasks.rake +6 -0
- data/lib/undercarriage.rb +16 -0
- data/lib/undercarriage/controllers/action_concern.rb +233 -0
- data/lib/undercarriage/controllers/kaminari_concern.rb +83 -0
- data/lib/undercarriage/controllers/locale_concern.rb +90 -0
- data/lib/undercarriage/railtie.rb +6 -0
- data/lib/undercarriage/version.rb +5 -0
- metadata +73 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 2ec3241ab6e053eb78aa66e3aed56473b299ebef9c48c08c415a7f9c04b0eb70
|
4
|
+
data.tar.gz: c0e0393b7f2d1c383eadb22af21ac440fe5651eea335f71241289918f754b547
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 423946c74cd8e1f5d313627933fd3f6a27d663e0e580d78ae5d56f202117d8348d56eb42315498e32878e0bdb39e30f7e48c021e4207b2221197c0d0edf7c73b
|
7
|
+
data.tar.gz: 5613f293beb7bac032d58f7aed7f686f67e6c8219ba52708690e591e874246e4fd86a60c91dc98c04a518a739b2e883dc7fc8f1ed1e47f8955bef20e955cc270
|
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright 2021 David Freerksen
|
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.
|
data/README.md
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
# Undercarriage
|
2
|
+
|
3
|
+
**\*Undercarriage is currently under development. It is not ready for production use.\***
|
4
|
+
|
5
|
+
Undercarriage is a set of concerns to add to your application to trim some of the fat from controllers and models.
|
6
|
+
|
7
|
+
## Requirements
|
8
|
+
|
9
|
+
* Ruby >= 2.5
|
10
|
+
* Rails >= 6.0.3
|
11
|
+
|
12
|
+
## Installation
|
13
|
+
|
14
|
+
Add to your application's Gemfile
|
15
|
+
|
16
|
+
```ruby
|
17
|
+
gem 'undercarriage', '~> 0.1'
|
18
|
+
```
|
19
|
+
|
20
|
+
Run the bundle command
|
21
|
+
|
22
|
+
```bash
|
23
|
+
$ bundle install
|
24
|
+
```
|
25
|
+
|
26
|
+
## Usage
|
27
|
+
|
28
|
+
TODO
|
29
|
+
|
30
|
+
## TODO
|
31
|
+
|
32
|
+
* [ ] Allow a way to set locale instead of relying on browser preferred language in `Undercarriage::Controllers::LocaleConcern`
|
33
|
+
|
34
|
+
## Code Analysis
|
35
|
+
|
36
|
+
TODO
|
37
|
+
|
38
|
+
## License
|
39
|
+
|
40
|
+
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
41
|
+
|
42
|
+
## Contributing
|
43
|
+
|
44
|
+
1. Fork it ([https://github.com/dfreerksen/undercarriage/fork](https://github.com/dfreerksen/undercarriage/fork))
|
45
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
46
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
47
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
48
|
+
5. Create a new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
begin
|
4
|
+
require 'bundler/setup'
|
5
|
+
rescue LoadError
|
6
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
7
|
+
end
|
8
|
+
|
9
|
+
require 'rdoc/task'
|
10
|
+
|
11
|
+
RDoc::Task.new(:rdoc) do |rdoc|
|
12
|
+
rdoc.rdoc_dir = 'rdoc'
|
13
|
+
rdoc.title = 'Undercarriage'
|
14
|
+
rdoc.options << '--line-numbers'
|
15
|
+
rdoc.rdoc_files.include('README.md')
|
16
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
17
|
+
end
|
18
|
+
|
19
|
+
require 'bundler/gem_tasks'
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'undercarriage/controllers/action_concern'
|
4
|
+
require 'undercarriage/controllers/kaminari_concern'
|
5
|
+
require 'undercarriage/controllers/locale_concern'
|
6
|
+
|
7
|
+
require 'undercarriage/railtie'
|
8
|
+
|
9
|
+
##
|
10
|
+
# Undercarriage
|
11
|
+
#
|
12
|
+
# Undercarriage is a set of concerns to add to your application to trim some of the fat from controllers and models.
|
13
|
+
#
|
14
|
+
module Undercarriage
|
15
|
+
# Your code goes here...
|
16
|
+
end
|
@@ -0,0 +1,233 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Undercarriage
|
4
|
+
module Controllers
|
5
|
+
##
|
6
|
+
# Action helpers
|
7
|
+
#
|
8
|
+
# Helpers for the controller or view to help identify the action
|
9
|
+
#
|
10
|
+
# Usage
|
11
|
+
# class ExamplesController < ApplicationController
|
12
|
+
# include Undercarriage::Controllers::ActionConcern
|
13
|
+
# end
|
14
|
+
#
|
15
|
+
module ActionConcern
|
16
|
+
extend ActiveSupport::Concern
|
17
|
+
|
18
|
+
included do
|
19
|
+
helper_method :action?,
|
20
|
+
:collection_action?,
|
21
|
+
:create_action?,
|
22
|
+
:create_actions?,
|
23
|
+
:edit_action?,
|
24
|
+
:edit_actions?,
|
25
|
+
:index_action?,
|
26
|
+
:member_action?,
|
27
|
+
:new_action?,
|
28
|
+
:new_actions?,
|
29
|
+
:show_action?,
|
30
|
+
:update_action?,
|
31
|
+
:update_actions?
|
32
|
+
end
|
33
|
+
|
34
|
+
##
|
35
|
+
# Check action
|
36
|
+
#
|
37
|
+
# Check if action is a certain action type
|
38
|
+
#
|
39
|
+
# Usage
|
40
|
+
# action?(:show) # true
|
41
|
+
# action?('show') # true
|
42
|
+
# action?(:index) # false
|
43
|
+
#
|
44
|
+
# @param action_method [String, Symbol] the action to test
|
45
|
+
# @return [Boolean] if action matches
|
46
|
+
#
|
47
|
+
def action?(action_method)
|
48
|
+
action == action_method.to_sym
|
49
|
+
end
|
50
|
+
|
51
|
+
##
|
52
|
+
# Check if index
|
53
|
+
#
|
54
|
+
# Check if action is the index action type. The check will pass if it is an `index` action
|
55
|
+
#
|
56
|
+
# Usage
|
57
|
+
# index_action? # true
|
58
|
+
# index_action? # false
|
59
|
+
#
|
60
|
+
# @return [Boolean] if action is action type
|
61
|
+
#
|
62
|
+
def index_action?
|
63
|
+
action?('index')
|
64
|
+
end
|
65
|
+
|
66
|
+
##
|
67
|
+
# Check if show
|
68
|
+
#
|
69
|
+
# Check if action is the show action type. The check will pass if it is a `show` action
|
70
|
+
#
|
71
|
+
# Usage
|
72
|
+
# show_action? # true
|
73
|
+
# show_action? # false
|
74
|
+
#
|
75
|
+
# @return [Boolean] if action is action type
|
76
|
+
#
|
77
|
+
def show_action?
|
78
|
+
action?('show')
|
79
|
+
end
|
80
|
+
|
81
|
+
##
|
82
|
+
# Check if new
|
83
|
+
#
|
84
|
+
# Check if action is the new action type. The check will pass if it is a `new` action
|
85
|
+
#
|
86
|
+
# Usage
|
87
|
+
# new_action? # true
|
88
|
+
# new_action? # false
|
89
|
+
#
|
90
|
+
# @return [Boolean] if action is action type
|
91
|
+
#
|
92
|
+
def new_action?
|
93
|
+
action?('new')
|
94
|
+
end
|
95
|
+
|
96
|
+
##
|
97
|
+
# Check if create
|
98
|
+
#
|
99
|
+
# Check if action is the create action type. The check will pass if it is a `create` action
|
100
|
+
#
|
101
|
+
# Usage
|
102
|
+
# create_action? # true
|
103
|
+
# create_action? # false
|
104
|
+
#
|
105
|
+
# @return [Boolean] if action is action type
|
106
|
+
#
|
107
|
+
def create_action?
|
108
|
+
action?('create')
|
109
|
+
end
|
110
|
+
|
111
|
+
##
|
112
|
+
# Check if edit
|
113
|
+
#
|
114
|
+
# Check if action is the edit action type. The check will pass if it is an `edit` action
|
115
|
+
#
|
116
|
+
# Usage
|
117
|
+
# edit_action? # true
|
118
|
+
# edit_action? # false
|
119
|
+
#
|
120
|
+
# @return [Boolean] if action is action type
|
121
|
+
#
|
122
|
+
def edit_action?
|
123
|
+
action?('edit')
|
124
|
+
end
|
125
|
+
|
126
|
+
##
|
127
|
+
# Check if update
|
128
|
+
#
|
129
|
+
# Check if action is the update action type. The check will pass if it is an `update` action
|
130
|
+
#
|
131
|
+
# Usage
|
132
|
+
# update_action? # true
|
133
|
+
# update_action? # false
|
134
|
+
#
|
135
|
+
# @return [Boolean] if action is action type
|
136
|
+
#
|
137
|
+
def update_action?
|
138
|
+
action?('update')
|
139
|
+
end
|
140
|
+
|
141
|
+
##
|
142
|
+
# Check if collection
|
143
|
+
#
|
144
|
+
# Check if action is a collection action type. An action is a collection type if it is the `index` action
|
145
|
+
#
|
146
|
+
# Usage
|
147
|
+
# collection_action? # true
|
148
|
+
# collection_action? # false
|
149
|
+
#
|
150
|
+
# @return [Boolean] if action is collection type
|
151
|
+
#
|
152
|
+
def collection_action?
|
153
|
+
collection_actions.include?(action)
|
154
|
+
end
|
155
|
+
|
156
|
+
##
|
157
|
+
# Check if create or new
|
158
|
+
#
|
159
|
+
# Check if action is a create or new action type. The check will pass if it is a `create` or `new` action
|
160
|
+
#
|
161
|
+
# Usage
|
162
|
+
# create_actions? # true
|
163
|
+
# create_actions? # false
|
164
|
+
#
|
165
|
+
# new_actions? # true
|
166
|
+
# new_actions? # false
|
167
|
+
#
|
168
|
+
# @return [Boolean] if action is actions type
|
169
|
+
#
|
170
|
+
def create_actions?
|
171
|
+
create_actions.include?(action)
|
172
|
+
end
|
173
|
+
alias new_actions? create_actions?
|
174
|
+
|
175
|
+
##
|
176
|
+
# Check if member
|
177
|
+
#
|
178
|
+
# Check if action is a member action type. An action is a member type if it is the `edit`, `show`, or `update`
|
179
|
+
# action
|
180
|
+
#
|
181
|
+
# Usage
|
182
|
+
# member_action? # true
|
183
|
+
# member_action? # false
|
184
|
+
#
|
185
|
+
# @return [Boolean] if action is member type
|
186
|
+
#
|
187
|
+
def member_action?
|
188
|
+
member_actions.include?(action)
|
189
|
+
end
|
190
|
+
|
191
|
+
##
|
192
|
+
# Check if edit or update
|
193
|
+
#
|
194
|
+
# Check if action is an edit or update action type. The check will pass if it is an `edit` or `update` action
|
195
|
+
#
|
196
|
+
# Usage
|
197
|
+
# update_actions? # true
|
198
|
+
# update_actions? # false
|
199
|
+
#
|
200
|
+
# edit_actions? # true
|
201
|
+
# edit_actions? # false
|
202
|
+
#
|
203
|
+
# @return [Boolean] if action is actions type
|
204
|
+
#
|
205
|
+
def update_actions?
|
206
|
+
update_actions.include?(action)
|
207
|
+
end
|
208
|
+
alias edit_actions? update_actions?
|
209
|
+
|
210
|
+
protected
|
211
|
+
|
212
|
+
def action
|
213
|
+
action_name.to_sym
|
214
|
+
end
|
215
|
+
|
216
|
+
def collection_actions
|
217
|
+
%i[index]
|
218
|
+
end
|
219
|
+
|
220
|
+
def member_actions
|
221
|
+
%i[edit show update]
|
222
|
+
end
|
223
|
+
|
224
|
+
def create_actions
|
225
|
+
%i[create new]
|
226
|
+
end
|
227
|
+
|
228
|
+
def update_actions
|
229
|
+
%i[edit update]
|
230
|
+
end
|
231
|
+
end
|
232
|
+
end
|
233
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Undercarriage
|
4
|
+
module Controllers
|
5
|
+
##
|
6
|
+
# Kaminari pagination
|
7
|
+
#
|
8
|
+
# Helpers for Kaminari style pagination. Note that the Kaminari gem is not loaded with dependency. It must be added
|
9
|
+
# to your own Gemfile
|
10
|
+
#
|
11
|
+
# Usage
|
12
|
+
# class ExamplesController < ApplicationController
|
13
|
+
# include Undercarriage::Controllers::KaminariConcern
|
14
|
+
#
|
15
|
+
# def index
|
16
|
+
# @examples = Examples.page(page_num).per(per_page)
|
17
|
+
# end
|
18
|
+
# end
|
19
|
+
#
|
20
|
+
module KaminariConcern
|
21
|
+
extend ActiveSupport::Concern
|
22
|
+
|
23
|
+
included do
|
24
|
+
helper_method :page_num, :per_page
|
25
|
+
end
|
26
|
+
|
27
|
+
##
|
28
|
+
# Items per page
|
29
|
+
#
|
30
|
+
# The number of items to return in pagination. Will use the Kaminari config `default_per_page` (typically `25`)
|
31
|
+
# for the count and will look for `per` in the URL paramaters to override.
|
32
|
+
#
|
33
|
+
# This is asseccible from the View as `per_page`
|
34
|
+
#
|
35
|
+
# Usage
|
36
|
+
# /examples?per=100 # Return 100 items per page
|
37
|
+
# /examples?per=10&page=3 # Return page 3 of items with 10 items per page
|
38
|
+
#
|
39
|
+
# @return [Integer] the number of items per page
|
40
|
+
#
|
41
|
+
def per_page
|
42
|
+
params.fetch(per_page_key, per_page_default).to_i
|
43
|
+
end
|
44
|
+
|
45
|
+
##
|
46
|
+
# Page number
|
47
|
+
#
|
48
|
+
# Will look for the Kaminari config `param_name` (typically `page`) in the URL paramaters.
|
49
|
+
#
|
50
|
+
# This is asseccible from the View as `page_num`
|
51
|
+
#
|
52
|
+
# Usage
|
53
|
+
# /examples?page=5 # Return page 5 of items
|
54
|
+
# /examples?per=10&page=3 Return page 3 of items with 10 items per page
|
55
|
+
#
|
56
|
+
# @return [Integer] the page number
|
57
|
+
#
|
58
|
+
def page_num
|
59
|
+
params.fetch(page_num_key, page_num_default).to_i
|
60
|
+
end
|
61
|
+
|
62
|
+
protected
|
63
|
+
|
64
|
+
def per_page_key
|
65
|
+
:per
|
66
|
+
end
|
67
|
+
|
68
|
+
def page_num_key
|
69
|
+
Kaminari.config.param_name
|
70
|
+
end
|
71
|
+
|
72
|
+
private
|
73
|
+
|
74
|
+
def per_page_default
|
75
|
+
Kaminari.config.default_per_page
|
76
|
+
end
|
77
|
+
|
78
|
+
def page_num_default
|
79
|
+
1
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Undercarriage
|
4
|
+
module Controllers
|
5
|
+
##
|
6
|
+
# Identify locale for translations
|
7
|
+
#
|
8
|
+
# Identify locale based on `HTTP_ACCEPT_LANGUAGE`. Browser preferred language is passed with the request as
|
9
|
+
# `en-US, en;q=0.9` where `en-US` (English with US dialect) is the preferred language with `en` (generic English) as
|
10
|
+
# an acceptable language.
|
11
|
+
#
|
12
|
+
# When preferred language cannot be identified or no translation is available, fall back to `I18n.default_locale`
|
13
|
+
# (typically `en`).
|
14
|
+
#
|
15
|
+
# Usage
|
16
|
+
# class ExamplesController < ApplicationController
|
17
|
+
# include Undercarriage::Controllers::LocaleConcern
|
18
|
+
# end
|
19
|
+
#
|
20
|
+
module LocaleConcern
|
21
|
+
extend ActiveSupport::Concern
|
22
|
+
|
23
|
+
included do
|
24
|
+
around_action :identify_locale
|
25
|
+
|
26
|
+
helper_method :html_lang, :html_dir
|
27
|
+
end
|
28
|
+
|
29
|
+
##
|
30
|
+
# Lang
|
31
|
+
#
|
32
|
+
# Helper for Views to return the identified language.
|
33
|
+
#
|
34
|
+
# Usage
|
35
|
+
# <html lang="<%= html_lang %>"> #=> '<html lang="de">'
|
36
|
+
# <html lang="<%= html_lang %>"> #=> '<html lang="de-at">'
|
37
|
+
#
|
38
|
+
def html_lang
|
39
|
+
I18n.locale.to_s
|
40
|
+
end
|
41
|
+
|
42
|
+
##
|
43
|
+
# Text direction
|
44
|
+
#
|
45
|
+
# Helper for Views to return text direction based on locale. Display text left-to-right for all languages but a
|
46
|
+
# few languages which should display as right-to-left. Returns `rtl` for the following languages:
|
47
|
+
#
|
48
|
+
# * Arabic
|
49
|
+
# * Aramaic
|
50
|
+
# * Azeri
|
51
|
+
# * Divehi
|
52
|
+
# * Hebrew
|
53
|
+
# * Persian/Farsi
|
54
|
+
# * Urdu
|
55
|
+
#
|
56
|
+
# Usage
|
57
|
+
# <html dir="<%= html_dir %>"> #=> <html dir="ltr">
|
58
|
+
# <html dir="<%= html_dir %>"> #=> <html dir="rtl">
|
59
|
+
#
|
60
|
+
def html_dir
|
61
|
+
rtl_languages = %w[am ar az dv fa he ur]
|
62
|
+
|
63
|
+
html_lang.start_with?(*rtl_languages) ? 'rtl' : 'ltr'
|
64
|
+
end
|
65
|
+
|
66
|
+
protected
|
67
|
+
|
68
|
+
def identify_locale(&action)
|
69
|
+
I18n.with_locale(first_available_locale, &action)
|
70
|
+
end
|
71
|
+
|
72
|
+
private
|
73
|
+
|
74
|
+
def first_available_locale
|
75
|
+
preferred_locales = (accepted_languages_header << I18n.default_locale.to_s).uniq
|
76
|
+
available_locales = I18n.available_locales.map(&:to_s)
|
77
|
+
|
78
|
+
preferred_locales.intersection(available_locales).first
|
79
|
+
end
|
80
|
+
|
81
|
+
def accepted_languages_header
|
82
|
+
accepted_languages = request.env['HTTP_ACCEPT_LANGUAGE'] || ''
|
83
|
+
|
84
|
+
accepted_languages.gsub(/\s+/, '').split(',').map do |lang|
|
85
|
+
lang.split(';q=').first
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
metadata
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: undercarriage
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- David Freerksen
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2021-03-05 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rails
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 6.0.3
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 6.0.3
|
27
|
+
description: Undercarriage is a set of concerns to add to your application to trim
|
28
|
+
some of the fat from controllers and models.
|
29
|
+
email:
|
30
|
+
- dfreerksen@gmail.com
|
31
|
+
executables: []
|
32
|
+
extensions: []
|
33
|
+
extra_rdoc_files: []
|
34
|
+
files:
|
35
|
+
- MIT-LICENSE
|
36
|
+
- README.md
|
37
|
+
- Rakefile
|
38
|
+
- lib/tasks/undercarriage_tasks.rake
|
39
|
+
- lib/undercarriage.rb
|
40
|
+
- lib/undercarriage/controllers/action_concern.rb
|
41
|
+
- lib/undercarriage/controllers/kaminari_concern.rb
|
42
|
+
- lib/undercarriage/controllers/locale_concern.rb
|
43
|
+
- lib/undercarriage/railtie.rb
|
44
|
+
- lib/undercarriage/version.rb
|
45
|
+
homepage: https://github.com/dfreerksen/undercarriage
|
46
|
+
licenses:
|
47
|
+
- MIT
|
48
|
+
metadata:
|
49
|
+
bug_tracker_uri: https://github.com/dfreerksen/undercarriage/issues
|
50
|
+
documentation_uri: https://www.rubydoc.info/github/dfreerksen/undercarriage/master
|
51
|
+
homepage_uri: https://github.com/dfreerksen/undercarriage
|
52
|
+
source_code_uri: https://github.com/dfreerksen/undercarriage
|
53
|
+
wiki_uri: https://github.com/dfreerksen/undercarriage/wiki
|
54
|
+
post_install_message:
|
55
|
+
rdoc_options: []
|
56
|
+
require_paths:
|
57
|
+
- lib
|
58
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - ">="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '2.5'
|
63
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - ">="
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '0'
|
68
|
+
requirements: []
|
69
|
+
rubygems_version: 3.0.3
|
70
|
+
signing_key:
|
71
|
+
specification_version: 4
|
72
|
+
summary: Controller and model concerns for Ruby on Rails.
|
73
|
+
test_files: []
|