dry_crud 2.1.2 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -13
- data/README.rdoc +1 -2
- data/VERSION +1 -1
- data/app/controllers/crud_controller.rb +96 -61
- data/app/controllers/dry_crud/generic_model.rb +1 -5
- data/app/controllers/dry_crud/rememberable.rb +1 -1
- data/app/controllers/dry_crud/render_callbacks.rb +2 -4
- data/app/controllers/list_controller.rb +4 -5
- data/app/helpers/dry_crud/form/builder.rb +4 -30
- data/app/helpers/format_helper.rb +2 -0
- data/app/helpers/utility_helper.rb +2 -3
- data/app/views/crud/show.json.jbuilder +1 -0
- data/app/views/layouts/_flash.html.erb +1 -1
- data/app/views/layouts/_flash.html.haml +1 -1
- data/app/views/list/index.json.jbuilder +4 -0
- data/config/locales/crud.de.yml +1 -1
- data/lib/generators/dry_crud/templates/spec/controllers/crud_test_models_controller_spec.rb +141 -139
- data/lib/generators/dry_crud/templates/spec/helpers/dry_crud/form/builder_spec.rb +47 -48
- data/lib/generators/dry_crud/templates/spec/helpers/dry_crud/table/builder_spec.rb +6 -6
- data/lib/generators/dry_crud/templates/spec/helpers/form_helper_spec.rb +66 -66
- data/lib/generators/dry_crud/templates/spec/helpers/format_helper_spec.rb +62 -61
- data/lib/generators/dry_crud/templates/spec/helpers/i18n_helper_spec.rb +13 -13
- data/lib/generators/dry_crud/templates/spec/helpers/table_helper_spec.rb +42 -38
- data/lib/generators/dry_crud/templates/spec/helpers/utility_helper_spec.rb +22 -22
- data/lib/generators/dry_crud/templates/spec/support/crud_controller_examples.rb +72 -72
- data/lib/generators/dry_crud/templates/spec/support/crud_controller_test_helper.rb +54 -45
- data/lib/generators/dry_crud/templates/test/controllers/crud_test_models_controller_test.rb +8 -11
- data/lib/generators/dry_crud/templates/test/helpers/dry_crud/form/builder_test.rb +1 -6
- data/lib/generators/dry_crud/templates/test/helpers/form_helper_test.rb +47 -46
- data/lib/generators/dry_crud/templates/test/helpers/format_helper_test.rb +1 -1
- data/lib/generators/dry_crud/templates/test/helpers/table_helper_test.rb +9 -3
- data/lib/generators/dry_crud/templates/test/support/crud_controller_test_helper.rb +2 -2
- data/lib/generators/dry_crud/templates/test/support/crud_test_helper.rb +1 -1
- data/lib/generators/dry_crud/templates/test/support/crud_test_model.rb +0 -4
- data/lib/generators/dry_crud/templates/test/support/crud_test_models_controller.rb +5 -10
- metadata +15 -18
- data/app/controllers/dry_crud/responder.rb +0 -34
@@ -49,7 +49,7 @@ class CrudTestModelsControllerTest < ActionController::TestCase
|
|
49
49
|
def test_index_search
|
50
50
|
super
|
51
51
|
assert_equal 1, entries.size
|
52
|
-
assert_equal({ q
|
52
|
+
assert_equal({ 'q' => 'AAAA' }, session[:list_params]['/crud_test_models'])
|
53
53
|
end
|
54
54
|
|
55
55
|
def test_index_with_custom_options
|
@@ -68,7 +68,7 @@ class CrudTestModelsControllerTest < ActionController::TestCase
|
|
68
68
|
assert entries.present?
|
69
69
|
assert_equal 1, entries.size
|
70
70
|
assert_equal [CrudTestModel.find_by_name('BBBBB')], entries
|
71
|
-
assert_equal({ q
|
71
|
+
assert_equal({ 'q' => 'DDD' }, session[:list_params]['/crud_test_models'])
|
72
72
|
end
|
73
73
|
|
74
74
|
def test_sort_given_column
|
@@ -78,7 +78,7 @@ class CrudTestModelsControllerTest < ActionController::TestCase
|
|
78
78
|
assert entries.present?
|
79
79
|
assert_equal 6, entries.size
|
80
80
|
assert_equal CrudTestModel.all.sort_by(&:children), entries
|
81
|
-
assert_equal({ sort
|
81
|
+
assert_equal({ 'sort' => 'children', 'sort_dir' => 'asc' },
|
82
82
|
session[:list_params]['/crud_test_models'])
|
83
83
|
end
|
84
84
|
|
@@ -88,7 +88,7 @@ class CrudTestModelsControllerTest < ActionController::TestCase
|
|
88
88
|
assert_template 'index'
|
89
89
|
assert entries.present?
|
90
90
|
assert_equal 6, entries.size
|
91
|
-
assert_equal({ sort
|
91
|
+
assert_equal({ 'sort' => 'chatty', 'sort_dir' => 'desc' },
|
92
92
|
session[:list_params]['/crud_test_models'])
|
93
93
|
|
94
94
|
# sort order is ambiguous, use index
|
@@ -108,15 +108,15 @@ class CrudTestModelsControllerTest < ActionController::TestCase
|
|
108
108
|
assert entries.present?
|
109
109
|
assert_equal 3, entries.size
|
110
110
|
assert_equal %w(CCCCC DDDDD BBBBB), entries.map(&:name)
|
111
|
-
assert_equal({ sort
|
111
|
+
assert_equal({ 'sort' => 'chatty', 'sort_dir' => 'asc', 'q' => 'DDD' },
|
112
112
|
session[:list_params]['/crud_test_models'])
|
113
113
|
end
|
114
114
|
|
115
115
|
def test_index_returning
|
116
116
|
session[:list_params] = {}
|
117
|
-
session[:list_params]['/crud_test_models'] = { q
|
118
|
-
sort
|
119
|
-
sort_dir
|
117
|
+
session[:list_params]['/crud_test_models'] = { 'q' => 'DDD',
|
118
|
+
'sort' => 'chatty',
|
119
|
+
'sort_dir' => 'desc' }
|
120
120
|
get :index, returning: true
|
121
121
|
assert_response :success
|
122
122
|
assert_template 'index'
|
@@ -234,7 +234,6 @@ class CrudTestModelsControllerTest < ActionController::TestCase
|
|
234
234
|
end
|
235
235
|
assert_response :unprocessable_entity
|
236
236
|
assert entry.new_record?
|
237
|
-
assert_match(/errors/, @response.body)
|
238
237
|
assert_equal [:before_create, :before_save], @controller.called_callbacks
|
239
238
|
end
|
240
239
|
|
@@ -257,7 +256,6 @@ class CrudTestModelsControllerTest < ActionController::TestCase
|
|
257
256
|
format: 'json'
|
258
257
|
assert_response :unprocessable_entity
|
259
258
|
assert entry.changed?
|
260
|
-
assert_match(/errors/, @response.body)
|
261
259
|
assert flash[:notice].blank?
|
262
260
|
assert_equal 20, entry.rating
|
263
261
|
assert_equal [:before_update, :before_save], @controller.called_callbacks
|
@@ -291,7 +289,6 @@ class CrudTestModelsControllerTest < ActionController::TestCase
|
|
291
289
|
format: 'json')
|
292
290
|
end
|
293
291
|
assert_response :unprocessable_entity
|
294
|
-
assert_match(/errors/, @response.body)
|
295
292
|
assert flash[:notice].blank?
|
296
293
|
end
|
297
294
|
|
@@ -21,12 +21,7 @@ module DryCrud
|
|
21
21
|
|
22
22
|
def create_form
|
23
23
|
@entry = CrudTestModel.first
|
24
|
-
|
25
|
-
@form = DryCrud::Form::Builder.new(:entry, @entry, self, {},
|
26
|
-
->(form) { form })
|
27
|
-
else
|
28
|
-
@form = DryCrud::Form::Builder.new(:entry, @entry, self, {})
|
29
|
-
end
|
24
|
+
@form = DryCrud::Form::Builder.new(:entry, @entry, self, {})
|
30
25
|
end
|
31
26
|
|
32
27
|
test 'input_field dispatches string attr to string_field' do
|
@@ -1,6 +1,7 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
require 'test_helper'
|
3
3
|
require 'support/crud_test_model'
|
4
|
+
require 'support/crud_test_helper'
|
4
5
|
|
5
6
|
# Test FormHelper
|
6
7
|
class FormHelperTest < ActionView::TestCase
|
@@ -23,15 +24,15 @@ class FormHelperTest < ActionView::TestCase
|
|
23
24
|
end
|
24
25
|
end
|
25
26
|
|
26
|
-
assert_match(/form .*?
|
27
|
-
.*?
|
27
|
+
assert_match(/form .*?class="special\ form-horizontal"
|
28
|
+
.*?action="\/crud_test_models\/#{e.id}"
|
28
29
|
.*?method="post"/x, f)
|
29
|
-
assert_match(/input .*?
|
30
|
-
.*?
|
30
|
+
assert_match(/input .*?type="hidden"
|
31
|
+
.*?name="_method"
|
31
32
|
.*?value="(patch|put)"/x, f)
|
32
|
-
assert_match(/input .*?
|
33
|
-
.*?
|
34
|
-
.*?
|
33
|
+
assert_match(/input .*?type="text"
|
34
|
+
.*?value="AAAAA"
|
35
|
+
.*?name="crud_test_model\[name\]"/x, f)
|
35
36
|
end
|
36
37
|
|
37
38
|
test 'standard form' do
|
@@ -46,22 +47,22 @@ class FormHelperTest < ActionView::TestCase
|
|
46
47
|
end
|
47
48
|
|
48
49
|
assert_match(/form .*?action="\/crud_test_models\/#{e.id}"
|
49
|
-
.*?
|
50
|
-
|
51
|
-
assert_match(/input .*?
|
52
|
-
.*?
|
50
|
+
.*?method="post"/x, f)
|
51
|
+
assert_match(/form .*?class="special\ form-horizontal"/x, f)
|
52
|
+
assert_match(/input .*?type="hidden"
|
53
|
+
.*?name="_method"
|
53
54
|
.*?value="(patch|put)"/x, f)
|
54
|
-
assert_match(/input .*?
|
55
|
-
.*?
|
56
|
-
.*?
|
57
|
-
assert_match(/input .*?
|
58
|
-
.*?
|
59
|
-
assert_match(/input .*?
|
60
|
-
.*?
|
61
|
-
.*?
|
62
|
-
assert_match(/input .*?
|
63
|
-
.*?
|
64
|
-
assert_match(/button\ .*?type="submit"
|
55
|
+
assert_match(/input .*?type="text"
|
56
|
+
.*?value="AAAAA"
|
57
|
+
.*?name="crud_test_model\[name\]"/x, f)
|
58
|
+
assert_match(/input .*?type="date"
|
59
|
+
.*?name="crud_test_model\[birthdate\]"/x, f)
|
60
|
+
assert_match(/input .*?type="number"
|
61
|
+
.*?value=\"9\"
|
62
|
+
.*?name="crud_test_model\[children\]"/x, f)
|
63
|
+
assert_match(/input .*?type="checkbox"
|
64
|
+
.*?name="crud_test_model\[human\]"/x, f)
|
65
|
+
assert_match(/button\ .*?type="submit".*\>
|
65
66
|
#{t('global.button.save')}
|
66
67
|
\<\/button\>/x, f)
|
67
68
|
assert_match(/\<a\ .*href="\/somewhere".*\>
|
@@ -84,16 +85,16 @@ class FormHelperTest < ActionView::TestCase
|
|
84
85
|
|
85
86
|
assert_match(/form .*?action="\/crud_test_models\/#{e.id}"
|
86
87
|
.*?method="post"/x, f)
|
87
|
-
assert_match(/input .*?
|
88
|
-
.*?
|
88
|
+
assert_match(/input .*?type="hidden"
|
89
|
+
.*?name="_method"
|
89
90
|
.*?value="(patch|put)"/x, f)
|
90
91
|
assert_match(/div[^>]* id='error_explanation'/, f)
|
91
92
|
assert_match(/div\ class="form-group\ has-error"\>.*?
|
92
|
-
\<input .*?
|
93
|
-
.*?
|
94
|
-
assert_match(/input .*?
|
93
|
+
\<input .*?type="text"
|
94
|
+
.*?name="crud_test_model\[name\]"/x, f)
|
95
|
+
assert_match(/input .*?value="1910-01-01"
|
95
96
|
.*?type="date"
|
96
|
-
.*?
|
97
|
+
.*?name="crud_test_model\[birthdate\]"/x, f)
|
97
98
|
end
|
98
99
|
|
99
100
|
test 'crud form' do
|
@@ -102,24 +103,24 @@ class FormHelperTest < ActionView::TestCase
|
|
102
103
|
end
|
103
104
|
|
104
105
|
assert_match(/form .*?action="\/crud_test_models\/#{entry.id}"/, f)
|
105
|
-
assert_match(/input .*?
|
106
|
-
.*?
|
107
|
-
assert_match(/input .*?
|
108
|
-
.*?
|
109
|
-
assert_match(/input .*?
|
110
|
-
.*?
|
111
|
-
assert_match(/input .*?
|
112
|
-
.*?
|
113
|
-
assert_match(/input .*?
|
114
|
-
.*?
|
115
|
-
assert_match(/input .*?
|
116
|
-
.*?
|
117
|
-
assert_match(/input .*?
|
118
|
-
.*?
|
119
|
-
assert_match(/input .*?
|
120
|
-
.*?
|
121
|
-
assert_match(/input .*?
|
122
|
-
.*?
|
106
|
+
assert_match(/input .*?type="text"
|
107
|
+
.*?name="crud_test_model\[name\]"/x, f)
|
108
|
+
assert_match(/input .*?type="text"
|
109
|
+
.*?name="crud_test_model\[whatever\]"/x, f)
|
110
|
+
assert_match(/input .*?type="number"
|
111
|
+
.*?name="crud_test_model\[children\]"/x, f)
|
112
|
+
assert_match(/input .*?type="number"
|
113
|
+
.*?name="crud_test_model\[rating\]"/x, f)
|
114
|
+
assert_match(/input .*?type="number"
|
115
|
+
.*?name="crud_test_model\[income\]"/x, f)
|
116
|
+
assert_match(/input .*?type="date"
|
117
|
+
.*?name="crud_test_model\[birthdate\]"/x, f)
|
118
|
+
assert_match(/input .*?type="time"
|
119
|
+
.*?name="crud_test_model\[gets_up_at\]"/x, f)
|
120
|
+
assert_match(/input .*?type="datetime"
|
121
|
+
.*?name="crud_test_model\[last_seen\]"/x, f)
|
122
|
+
assert_match(/input .*?type="checkbox"
|
123
|
+
.*?name="crud_test_model\[human\]"/x, f)
|
123
124
|
assert_match(/select .*?name="crud_test_model\[companion_id\]"/, f)
|
124
125
|
assert_match(/textarea .*?name="crud_test_model\[remarks\]"/, f)
|
125
126
|
assert_match(/a .*href="\/crud_test_models\/#{entry.id}\?returning=true"
|
@@ -96,7 +96,7 @@ class FormatHelperTest < ActionView::TestCase
|
|
96
96
|
assert_equal '9', format_type(m, :children)
|
97
97
|
|
98
98
|
m.children = 10_000
|
99
|
-
assert_equal '
|
99
|
+
assert_equal '10,000', format_type(m, :children)
|
100
100
|
end
|
101
101
|
|
102
102
|
unless ENV['NON_LOCALIZED'] # localization dependent tests
|
@@ -12,7 +12,7 @@ class TableHelperTest < ActionView::TestCase
|
|
12
12
|
include CustomAssertions
|
13
13
|
include CrudTestHelper
|
14
14
|
|
15
|
-
setup :reset_db, :setup_db, :create_test_data
|
15
|
+
setup :reset_db, :setup_db, :create_test_data, :empty_params
|
16
16
|
teardown :reset_db
|
17
17
|
|
18
18
|
attr_reader :entries
|
@@ -25,13 +25,19 @@ class TableHelperTest < ActionView::TestCase
|
|
25
25
|
"#{f(obj.size)} chars"
|
26
26
|
end
|
27
27
|
|
28
|
-
|
28
|
+
def empty_params
|
29
|
+
def params
|
30
|
+
{}
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
test 'empty table renders message' do
|
29
35
|
result = plain_table_or_message([]) {}
|
30
36
|
assert result.html_safe?
|
31
37
|
assert_match(/\<div class=["']table["']\>.*\<\/div\>/, result)
|
32
38
|
end
|
33
39
|
|
34
|
-
test 'non empty table
|
40
|
+
test 'non empty table renders table' do
|
35
41
|
result = plain_table_or_message(%w(foo bar)) do |t|
|
36
42
|
t.attrs :size, :upcase
|
37
43
|
end
|
@@ -91,7 +91,7 @@ module CrudControllerTestHelper
|
|
91
91
|
format: 'json')
|
92
92
|
end
|
93
93
|
assert_response :success
|
94
|
-
assert @response.body.starts_with?('{')
|
94
|
+
assert @response.body.starts_with?('{"id":')
|
95
95
|
end
|
96
96
|
|
97
97
|
def test_edit # :nodoc:
|
@@ -117,7 +117,7 @@ module CrudControllerTestHelper
|
|
117
117
|
format: 'json')
|
118
118
|
end
|
119
119
|
assert_response :success
|
120
|
-
|
120
|
+
assert @response.body.starts_with?('{"id":')
|
121
121
|
end
|
122
122
|
|
123
123
|
def test_destroy # :nodoc:
|
@@ -13,8 +13,6 @@ class CrudTestModel < ActiveRecord::Base #:nodoc:
|
|
13
13
|
validates :name, presence: true
|
14
14
|
validates :rating, inclusion: { in: 1..10 }
|
15
15
|
|
16
|
-
attr_protected nil if Rails.version < '4.0'
|
17
|
-
|
18
16
|
def to_s
|
19
17
|
name
|
20
18
|
end
|
@@ -40,8 +38,6 @@ class OtherCrudTestModel < ActiveRecord::Base #:nodoc:
|
|
40
38
|
has_and_belongs_to_many :others, class_name: 'CrudTestModel'
|
41
39
|
belongs_to :more, foreign_key: :more_id, class_name: 'CrudTestModel'
|
42
40
|
|
43
|
-
attr_protected nil if Rails.version < '4.0'
|
44
|
-
|
45
41
|
def to_s
|
46
42
|
name
|
47
43
|
end
|
@@ -7,11 +7,9 @@ class CrudTestModelsController < CrudController #:nodoc:
|
|
7
7
|
self.search_columns = [:name, :whatever, :remarks]
|
8
8
|
self.sort_mappings = { chatty: 'length(remarks)' }
|
9
9
|
self.default_sort = 'name'
|
10
|
-
<% if Rails.version >= '4.0' -%>
|
11
10
|
self.permitted_attrs = [:name, :email, :password, :whatever, :children,
|
12
11
|
:companion_id, :rating, :income, :birthdate,
|
13
12
|
:gets_up_at, :last_seen, :human, :remarks]
|
14
|
-
<% end -%>
|
15
13
|
|
16
14
|
before_create :possibly_redirect
|
17
15
|
before_create :handle_name
|
@@ -30,20 +28,17 @@ class CrudTestModelsController < CrudController #:nodoc:
|
|
30
28
|
layout false
|
31
29
|
|
32
30
|
def index
|
33
|
-
|
34
|
-
|
35
|
-
end
|
31
|
+
entries
|
32
|
+
render text: 'index js' if request.format.js?
|
36
33
|
end
|
37
34
|
|
38
35
|
def show
|
39
|
-
|
40
|
-
format.html { render text: 'custom html' } if entry.name == 'BBBBB'
|
41
|
-
end
|
36
|
+
render text: 'custom html' if entry.name == 'BBBBB'
|
42
37
|
end
|
43
38
|
|
44
39
|
def create
|
45
|
-
super do |_format|
|
46
|
-
flash[:notice] = 'model got created' if
|
40
|
+
super do |_format, success|
|
41
|
+
flash[:notice] = 'model got created' if success
|
47
42
|
end
|
48
43
|
end
|
49
44
|
|
metadata
CHANGED
@@ -1,37 +1,33 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dry_crud
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pascal Zumkehr
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-01-12 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
19
|
version: '3.2'
|
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
26
|
version: '3.2'
|
27
|
-
description:
|
28
|
-
support you
|
29
|
-
|
27
|
+
description: |
|
28
|
+
Generates simple and extendable controller, views and helpers that support you
|
30
29
|
to DRY up the CRUD code in your Rails project. Start with these elements and
|
31
|
-
|
32
30
|
build a clean base to efficiently develop your application upon.
|
33
|
-
|
34
|
-
'
|
35
31
|
email: spam@codez.ch
|
36
32
|
executables: []
|
37
33
|
extensions: []
|
@@ -55,7 +51,6 @@ files:
|
|
55
51
|
- app/controllers/dry_crud/nestable.rb
|
56
52
|
- app/controllers/dry_crud/rememberable.rb
|
57
53
|
- app/controllers/dry_crud/render_callbacks.rb
|
58
|
-
- app/controllers/dry_crud/responder.rb
|
59
54
|
- app/controllers/dry_crud/searchable.rb
|
60
55
|
- app/controllers/dry_crud/sortable.rb
|
61
56
|
- app/controllers/list_controller.rb
|
@@ -89,6 +84,7 @@ files:
|
|
89
84
|
- app/views/crud/new.html.haml
|
90
85
|
- app/views/crud/show.html.erb
|
91
86
|
- app/views/crud/show.html.haml
|
87
|
+
- app/views/crud/show.json.jbuilder
|
92
88
|
- app/views/layouts/_flash.html.erb
|
93
89
|
- app/views/layouts/_flash.html.haml
|
94
90
|
- app/views/layouts/_nav.html.erb
|
@@ -103,6 +99,7 @@ files:
|
|
103
99
|
- app/views/list/_search.html.haml
|
104
100
|
- app/views/list/index.html.erb
|
105
101
|
- app/views/list/index.html.haml
|
102
|
+
- app/views/list/index.json.jbuilder
|
106
103
|
- app/views/shared/_error_messages.html.erb
|
107
104
|
- app/views/shared/_error_messages.html.haml
|
108
105
|
- app/views/shared/_labeled.html.erb
|
@@ -146,26 +143,26 @@ licenses: []
|
|
146
143
|
metadata: {}
|
147
144
|
post_install_message:
|
148
145
|
rdoc_options:
|
149
|
-
- --title
|
150
|
-
-
|
151
|
-
- --main
|
146
|
+
- "--title"
|
147
|
+
- '"Dry Crud"'
|
148
|
+
- "--main"
|
152
149
|
- README.rdoc
|
153
|
-
- --line-numbers
|
150
|
+
- "--line-numbers"
|
154
151
|
require_paths:
|
155
152
|
- lib
|
156
153
|
required_ruby_version: !ruby/object:Gem::Requirement
|
157
154
|
requirements:
|
158
|
-
- -
|
155
|
+
- - ">="
|
159
156
|
- !ruby/object:Gem::Version
|
160
157
|
version: '0'
|
161
158
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
162
159
|
requirements:
|
163
|
-
- -
|
160
|
+
- - ">="
|
164
161
|
- !ruby/object:Gem::Version
|
165
162
|
version: '0'
|
166
163
|
requirements: []
|
167
164
|
rubyforge_project:
|
168
|
-
rubygems_version: 2.
|
165
|
+
rubygems_version: 2.4.3
|
169
166
|
signing_key:
|
170
167
|
specification_version: 4
|
171
168
|
summary: Generates DRY and specifically extendable CRUD controller, views and helpers
|