rails-admin-scaffold 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE +20 -0
- data/README.md +17 -0
- data/lib/generators/admin/scaffold_controller/USAGE +12 -0
- data/lib/generators/admin/scaffold_controller/scaffold_controller_generator.rb +141 -0
- data/lib/generators/admin/scaffold_controller/templates/controllers/controller.erb +68 -0
- data/lib/generators/admin/scaffold_controller/templates/tests/test_unit/functional_test.erb +51 -0
- data/lib/generators/admin/scaffold_controller/templates/views/erb/_form.html.erb +37 -0
- data/lib/generators/admin/scaffold_controller/templates/views/erb/edit.html.erb +6 -0
- data/lib/generators/admin/scaffold_controller/templates/views/erb/index.html.erb +31 -0
- data/lib/generators/admin/scaffold_controller/templates/views/erb/new.html.erb +5 -0
- data/lib/generators/admin/scaffold_controller/templates/views/erb/show.html.erb +11 -0
- data/lib/rails-admin-scaffold/version.rb +3 -0
- data/lib/rails_admin_scaffold.rb +1 -0
- data/test/fixtures/routes.rb +58 -0
- data/test/lib/generators/admin/scaffold_controller_generator_test.rb +111 -0
- data/test/lib/generators/admin/testing_helper.rb +1 -0
- data/test/test_helper.rb +74 -0
- metadata +134 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 4e1fac9b29b5562ab5219bf487e07bf173c8ba84
|
4
|
+
data.tar.gz: bf8cc2870b83ef67ee11d82d057edf3987b5f7c0
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 482201651a09ede8bec6c05f08f3e467220ee4d0b81193e5c5aeec0817e208039e065565b280e9150f5d391541ab3c74e7c333bfda145654ec105b516d48d33a
|
7
|
+
data.tar.gz: 6fef87346c1730351ee0712d342c89d43b9bd2731633a9e6edfb4808fabdb40ae0340af7ae64b300b80b6bf180992181c1a8136b187e616f515d48cd69955f11
|
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2013 Kirill Kalachev (aka dhampik)
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
6
|
+
this software and associated documentation files (the "Software"), to deal in
|
7
|
+
the Software without restriction, including without limitation the rights to
|
8
|
+
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
9
|
+
the Software, and to permit persons to whom the Software is furnished to do so,
|
10
|
+
subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
17
|
+
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
18
|
+
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
19
|
+
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
20
|
+
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
rails-admin-scaffold
|
2
|
+
====================
|
3
|
+
|
4
|
+
Rails generator which allows to scaffold admin controllers, views with proper (non-namespaced) models, helpers, tests and routes
|
5
|
+
|
6
|
+
How to use:
|
7
|
+
-----------
|
8
|
+
* Add ```gem 'rails-admin-scaffold', 'x.x.x'``` to your Gemfile
|
9
|
+
* Run ```bundle install```
|
10
|
+
* Create admin scaffold with e. g. ```bin/rails g admin:scaffold_controller Post title:string content:text published:boolean```
|
11
|
+
|
12
|
+
Plans:
|
13
|
+
------
|
14
|
+
* add haml suppurt
|
15
|
+
* add jbuilder support
|
16
|
+
* improve tests
|
17
|
+
* use travis for ci
|
@@ -0,0 +1,12 @@
|
|
1
|
+
Description:
|
2
|
+
Stubs out a scaffolded controller, its seven RESTful actions and related
|
3
|
+
views. Pass the model name, either CamelCased or under_scored. The
|
4
|
+
controller name is retrieved as a pluralized version of the model name
|
5
|
+
namespaces within Admin namespaced.
|
6
|
+
|
7
|
+
This generates a controller class in app/controllers/admin and invokes helper,
|
8
|
+
template engine and test framework generators.
|
9
|
+
It uses non-namespaced model in app/models
|
10
|
+
|
11
|
+
Example:
|
12
|
+
`rails generate admin:scaffold_controller Post`
|
@@ -0,0 +1,141 @@
|
|
1
|
+
require 'rails/generators/named_base'
|
2
|
+
require 'rails/generators/resource_helpers'
|
3
|
+
|
4
|
+
module Admin
|
5
|
+
module Generators
|
6
|
+
class ScaffoldControllerGenerator < Rails::Generators::NamedBase
|
7
|
+
include Rails::Generators::ResourceHelpers
|
8
|
+
|
9
|
+
source_root File.expand_path('../templates', __FILE__)
|
10
|
+
|
11
|
+
check_class_collision suffix: "Controller"
|
12
|
+
|
13
|
+
check_class_collision suffix: "ControllerTest"
|
14
|
+
|
15
|
+
check_class_collision suffix: "Helper"
|
16
|
+
|
17
|
+
class_option :orm, banner: "NAME", type: :string, required: true,
|
18
|
+
desc: "ORM to generate the controller for"
|
19
|
+
|
20
|
+
class_option :html, type: :boolean, default: true,
|
21
|
+
desc: "Generate a scaffold with HTML output"
|
22
|
+
|
23
|
+
argument :attributes, type: :array, default: [], banner: "field:type field:type"
|
24
|
+
|
25
|
+
def initialize(args, *options) #:nodoc:
|
26
|
+
super
|
27
|
+
end
|
28
|
+
|
29
|
+
hook_for :resource_route, in: :rails do |resource_route|
|
30
|
+
invoke resource_route, [prefixed_class_name]
|
31
|
+
end
|
32
|
+
|
33
|
+
def create_controller_files
|
34
|
+
template "controllers/controller.erb", File.join('app/controllers', prefix, class_path, "#{controller_file_name}_controller.rb")
|
35
|
+
end
|
36
|
+
|
37
|
+
def create_test_files
|
38
|
+
template "tests/test_unit/functional_test.erb",
|
39
|
+
File.join("test/controllers", prefix, controller_class_path, "#{controller_file_name}_controller_test.rb")
|
40
|
+
end
|
41
|
+
|
42
|
+
hook_for :helper, in: :rails do |helper|
|
43
|
+
invoke helper, [prefixed_controller_class_name]
|
44
|
+
end
|
45
|
+
|
46
|
+
def create_root_folder
|
47
|
+
empty_directory File.join("app/views", prefix, controller_file_path)
|
48
|
+
end
|
49
|
+
|
50
|
+
def copy_view_files
|
51
|
+
available_views.each do |view|
|
52
|
+
filename = filename_with_extensions(view)
|
53
|
+
template "views/#{handler}/#{filename}", File.join("app/views", prefix, controller_file_path, filename)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
hook_for :assets, in: :rails do |assets|
|
58
|
+
invoke assets, [prefixed_class_name]
|
59
|
+
end
|
60
|
+
|
61
|
+
protected
|
62
|
+
|
63
|
+
def prefix
|
64
|
+
'admin'
|
65
|
+
end
|
66
|
+
|
67
|
+
def prefixed_class_name
|
68
|
+
"#{prefix.capitalize}::#{class_name}"
|
69
|
+
end
|
70
|
+
|
71
|
+
def prefixed_controller_class_name
|
72
|
+
"#{prefix.capitalize}::#{controller_class_name}"
|
73
|
+
end
|
74
|
+
|
75
|
+
def prefixed_route_url
|
76
|
+
"/#{prefix}#{route_url}"
|
77
|
+
end
|
78
|
+
|
79
|
+
def prefixed_plain_model_url
|
80
|
+
"#{prefix}_#{singular_table_name}"
|
81
|
+
end
|
82
|
+
|
83
|
+
def prefixed_index_helper
|
84
|
+
"#{prefix}_#{index_helper}"
|
85
|
+
end
|
86
|
+
|
87
|
+
def available_views
|
88
|
+
%w(index edit show new _form)
|
89
|
+
end
|
90
|
+
|
91
|
+
def format
|
92
|
+
:html
|
93
|
+
end
|
94
|
+
|
95
|
+
def handler
|
96
|
+
:erb
|
97
|
+
end
|
98
|
+
|
99
|
+
def filename_with_extensions(name)
|
100
|
+
[name, format, handler].compact.join(".")
|
101
|
+
end
|
102
|
+
|
103
|
+
# Add a class collisions name to be checked on class initialization. You
|
104
|
+
# can supply a hash with a :prefix or :suffix to be tested.
|
105
|
+
#
|
106
|
+
# ==== Examples
|
107
|
+
#
|
108
|
+
# check_class_collision suffix: "Decorator"
|
109
|
+
#
|
110
|
+
# If the generator is invoked with class name Admin, it will check for
|
111
|
+
# the presence of "AdminDecorator".
|
112
|
+
#
|
113
|
+
def self.check_class_collision(options={})
|
114
|
+
define_method :check_class_collision do
|
115
|
+
name = if self.respond_to?(:prefixed_controller_class_name) # for ScaffoldBase
|
116
|
+
prefixed_controller_class_name
|
117
|
+
elsif self.respond_to?(:prefixed_controller_class_name) # for ScaffoldBase
|
118
|
+
controller_class_name
|
119
|
+
else
|
120
|
+
class_name
|
121
|
+
end
|
122
|
+
|
123
|
+
class_collisions "#{options[:prefix]}#{name}#{options[:suffix]}"
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
def attributes_hash
|
128
|
+
return if attributes_names.empty?
|
129
|
+
|
130
|
+
attributes_names.map do |name|
|
131
|
+
if %w(password password_confirmation).include?(name) && attributes.any?(&:password_digest?)
|
132
|
+
"#{name}: 'secret'"
|
133
|
+
else
|
134
|
+
"#{name}: @#{singular_table_name}.#{name}"
|
135
|
+
end
|
136
|
+
end.sort.join(', ')
|
137
|
+
end
|
138
|
+
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
<% if namespaced? -%>
|
2
|
+
require_dependency "<%= namespaced_file_path %>/application_controller"
|
3
|
+
|
4
|
+
<% end -%>
|
5
|
+
<% module_namespacing do -%>
|
6
|
+
class <%= prefixed_controller_class_name %>Controller < ApplicationController
|
7
|
+
before_action :set_<%= singular_table_name %>, only: [:show, :edit, :update, :destroy]
|
8
|
+
|
9
|
+
# GET <%= prefixed_route_url %>
|
10
|
+
def index
|
11
|
+
@<%= plural_table_name %> = <%= orm_class.all(class_name) %>
|
12
|
+
end
|
13
|
+
|
14
|
+
# GET <%= prefixed_route_url %>/1
|
15
|
+
def show
|
16
|
+
end
|
17
|
+
|
18
|
+
# GET <%= prefixed_route_url %>/new
|
19
|
+
def new
|
20
|
+
@<%= singular_table_name %> = <%= orm_class.build(class_name) %>
|
21
|
+
end
|
22
|
+
|
23
|
+
# GET <%= prefixed_route_url %>/1/edit
|
24
|
+
def edit
|
25
|
+
end
|
26
|
+
|
27
|
+
# POST <%= prefixed_route_url %>
|
28
|
+
def create
|
29
|
+
@<%= singular_table_name %> = <%= orm_class.build(class_name, "#{singular_table_name}_params") %>
|
30
|
+
|
31
|
+
if @<%= orm_instance.save %>
|
32
|
+
redirect_to <%= "[:#{prefix}, @#{singular_table_name}]" %>, notice: <%= "'#{human_name} was successfully created.'" %>
|
33
|
+
else
|
34
|
+
render action: 'new'
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# PATCH/PUT <%= prefixed_route_url %>/1
|
39
|
+
def update
|
40
|
+
if @<%= orm_instance.update("#{singular_table_name}_params") %>
|
41
|
+
redirect_to <%= "[:#{prefix}, @#{singular_table_name}]" %>, notice: <%= "'#{human_name} was successfully updated.'" %>
|
42
|
+
else
|
43
|
+
render action: 'edit'
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
# DELETE <%= prefixed_route_url %>/1
|
48
|
+
def destroy
|
49
|
+
@<%= orm_instance.destroy %>
|
50
|
+
redirect_to <%= prefixed_index_helper %>_url, notice: <%= "'#{human_name} was successfully destroyed.'" %>
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
54
|
+
# Use callbacks to share common setup or constraints between actions.
|
55
|
+
def set_<%= singular_table_name %>
|
56
|
+
@<%= singular_table_name %> = <%= orm_class.find(class_name, "params[:id]") %>
|
57
|
+
end
|
58
|
+
|
59
|
+
# Only allow a trusted parameter "white list" through.
|
60
|
+
def <%= "#{singular_table_name}_params" %>
|
61
|
+
<%- if attributes_names.empty? -%>
|
62
|
+
params[<%= ":#{singular_table_name}" %>]
|
63
|
+
<%- else -%>
|
64
|
+
params.require(<%= ":#{singular_table_name}" %>).permit(<%= attributes_names.map { |name| ":#{name}" }.join(', ') %>)
|
65
|
+
<%- end -%>
|
66
|
+
end
|
67
|
+
end
|
68
|
+
<% end -%>
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
<% module_namespacing do -%>
|
4
|
+
class <%= prefixed_controller_class_name %>ControllerTest < ActionController::TestCase
|
5
|
+
setup do
|
6
|
+
@<%= singular_table_name %> = <%= table_name %>(:one)
|
7
|
+
end
|
8
|
+
|
9
|
+
test "should get index" do
|
10
|
+
get :index
|
11
|
+
assert_response :success
|
12
|
+
assert_not_nil assigns(:<%= table_name %>)
|
13
|
+
end
|
14
|
+
|
15
|
+
test "should get new" do
|
16
|
+
get :new
|
17
|
+
assert_response :success
|
18
|
+
end
|
19
|
+
|
20
|
+
test "should create <%= singular_table_name %>" do
|
21
|
+
assert_difference('<%= class_name %>.count') do
|
22
|
+
post :create, <%= "#{singular_table_name}: { #{attributes_hash} }" %>
|
23
|
+
end
|
24
|
+
|
25
|
+
assert_redirected_to <%= prefixed_plain_model_url %>_path(assigns(:<%= singular_table_name %>))
|
26
|
+
end
|
27
|
+
|
28
|
+
test "should show <%= singular_table_name %>" do
|
29
|
+
get :show, id: <%= "@#{singular_table_name}" %>
|
30
|
+
assert_response :success
|
31
|
+
end
|
32
|
+
|
33
|
+
test "should get edit" do
|
34
|
+
get :edit, id: <%= "@#{singular_table_name}" %>
|
35
|
+
assert_response :success
|
36
|
+
end
|
37
|
+
|
38
|
+
test "should update <%= singular_table_name %>" do
|
39
|
+
patch :update, id: <%= "@#{singular_table_name}" %>, <%= "#{singular_table_name}: { #{attributes_hash} }" %>
|
40
|
+
assert_redirected_to <%= prefixed_plain_model_url %>_path(assigns(:<%= singular_table_name %>))
|
41
|
+
end
|
42
|
+
|
43
|
+
test "should destroy <%= singular_table_name %>" do
|
44
|
+
assert_difference('<%= class_name %>.count', -1) do
|
45
|
+
delete :destroy, id: <%= "@#{singular_table_name}" %>
|
46
|
+
end
|
47
|
+
|
48
|
+
assert_redirected_to <%= prefixed_index_helper %>_path
|
49
|
+
end
|
50
|
+
end
|
51
|
+
<% end -%>
|
@@ -0,0 +1,37 @@
|
|
1
|
+
<%%= form_for(<%= "[:#{prefix}, @#{singular_table_name}]" %>) do |f| %>
|
2
|
+
<%% if @<%= singular_table_name %>.errors.any? %>
|
3
|
+
<div id="error_explanation">
|
4
|
+
<h2><%%= pluralize(@<%= singular_table_name %>.errors.count, "error") %> prohibited this <%= singular_table_name %> from being saved:</h2>
|
5
|
+
|
6
|
+
<ul>
|
7
|
+
<%% @<%= singular_table_name %>.errors.full_messages.each do |msg| %>
|
8
|
+
<li><%%= msg %></li>
|
9
|
+
<%% end %>
|
10
|
+
</ul>
|
11
|
+
</div>
|
12
|
+
<%% end %>
|
13
|
+
|
14
|
+
<% attributes.each do |attribute| -%>
|
15
|
+
<div class="field">
|
16
|
+
<% if attribute.password_digest? -%>
|
17
|
+
<%%= f.label :password %><br>
|
18
|
+
<%%= f.password_field :password %>
|
19
|
+
</div>
|
20
|
+
<div>
|
21
|
+
<%%= f.label :password_confirmation %><br>
|
22
|
+
<%%= f.password_field :password_confirmation %>
|
23
|
+
<% else -%>
|
24
|
+
<% if attribute.reference? -%>
|
25
|
+
<%%= f.label :<%= attribute.column_name %> %><br>
|
26
|
+
<%%= f.<%= attribute.field_type %> :<%= attribute.column_name %> %>
|
27
|
+
<% else -%>
|
28
|
+
<%%= f.label :<%= attribute.name %> %><br>
|
29
|
+
<%%= f.<%= attribute.field_type %> :<%= attribute.name %> %>
|
30
|
+
<% end -%>
|
31
|
+
<% end -%>
|
32
|
+
</div>
|
33
|
+
<% end -%>
|
34
|
+
<div class="actions">
|
35
|
+
<%%= f.submit %>
|
36
|
+
</div>
|
37
|
+
<%% end %>
|
@@ -0,0 +1,31 @@
|
|
1
|
+
<h1>Listing <%= plural_table_name %></h1>
|
2
|
+
|
3
|
+
<table>
|
4
|
+
<thead>
|
5
|
+
<tr>
|
6
|
+
<% attributes.reject(&:password_digest?).each do |attribute| -%>
|
7
|
+
<th><%= attribute.human_name %></th>
|
8
|
+
<% end -%>
|
9
|
+
<th></th>
|
10
|
+
<th></th>
|
11
|
+
<th></th>
|
12
|
+
</tr>
|
13
|
+
</thead>
|
14
|
+
|
15
|
+
<tbody>
|
16
|
+
<%% @<%= plural_table_name %>.each do |<%= singular_table_name %>| %>
|
17
|
+
<tr>
|
18
|
+
<% attributes.reject(&:password_digest?).each do |attribute| -%>
|
19
|
+
<td><%%= <%= singular_table_name %>.<%= attribute.name %> %></td>
|
20
|
+
<% end -%>
|
21
|
+
<td><%%= link_to 'Show', <%= "[:#{prefix}, #{singular_table_name}]" %> %></td>
|
22
|
+
<td><%%= link_to 'Edit', edit_<%= prefixed_plain_model_url %>_path(<%= singular_table_name %>) %></td>
|
23
|
+
<td><%%= link_to 'Destroy', <%= "[:#{prefix}, #{singular_table_name}]" %>, method: :delete, data: { confirm: 'Are you sure?' } %></td>
|
24
|
+
</tr>
|
25
|
+
<%% end %>
|
26
|
+
</tbody>
|
27
|
+
</table>
|
28
|
+
|
29
|
+
<br>
|
30
|
+
|
31
|
+
<%%= link_to 'New <%= human_name %>', new_<%= prefixed_plain_model_url %>_path %>
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<p id="notice"><%%= notice %></p>
|
2
|
+
|
3
|
+
<% attributes.reject(&:password_digest?).each do |attribute| -%>
|
4
|
+
<p>
|
5
|
+
<strong><%= attribute.human_name %>:</strong>
|
6
|
+
<%%= @<%= singular_table_name %>.<%= attribute.name %> %>
|
7
|
+
</p>
|
8
|
+
|
9
|
+
<% end -%>
|
10
|
+
<%%= link_to 'Edit', edit_<%= prefixed_plain_model_url %>_path(@<%= singular_table_name %>) %> |
|
11
|
+
<%%= link_to 'Back', <%= prefixed_index_helper %>_path %>
|
@@ -0,0 +1 @@
|
|
1
|
+
require "rails-admin-scaffold/version"
|
@@ -0,0 +1,58 @@
|
|
1
|
+
TestApp.routes.draw do |map|
|
2
|
+
# The priority is based upon order of creation:
|
3
|
+
# first created -> highest priority.
|
4
|
+
|
5
|
+
# Sample of regular route:
|
6
|
+
# match 'products/:id' => 'catalog#view'
|
7
|
+
# Keep in mind you can assign values other than :controller and :action
|
8
|
+
|
9
|
+
# Sample of named route:
|
10
|
+
# match 'products/:id/purchase' => 'catalog#purchase', :as => :purchase
|
11
|
+
# This route can be invoked with purchase_url(:id => product.id)
|
12
|
+
|
13
|
+
# Sample resource route (maps HTTP verbs to controller actions automatically):
|
14
|
+
# resources :products
|
15
|
+
|
16
|
+
# Sample resource route with options:
|
17
|
+
# resources :products do
|
18
|
+
# member do
|
19
|
+
# get :short
|
20
|
+
# post :toggle
|
21
|
+
# end
|
22
|
+
#
|
23
|
+
# collection do
|
24
|
+
# get :sold
|
25
|
+
# end
|
26
|
+
# end
|
27
|
+
|
28
|
+
# Sample resource route with sub-resources:
|
29
|
+
# resources :products do
|
30
|
+
# resources :comments, :sales
|
31
|
+
# resource :seller
|
32
|
+
# end
|
33
|
+
|
34
|
+
# Sample resource route with more complex sub-resources
|
35
|
+
# resources :products do
|
36
|
+
# resources :comments
|
37
|
+
# resources :sales do
|
38
|
+
# get :recent, :on => :collection
|
39
|
+
# end
|
40
|
+
# end
|
41
|
+
|
42
|
+
# Sample resource route within a namespace:
|
43
|
+
# namespace :admin do
|
44
|
+
# # Directs /admin/products/* to Admin::ProductsController
|
45
|
+
# # (app/controllers/admin/products_controller.rb)
|
46
|
+
# resources :products
|
47
|
+
# end
|
48
|
+
|
49
|
+
# You can have the root of your site routed with "root"
|
50
|
+
# just remember to delete public/index.html.
|
51
|
+
# root :to => "welcome#index"
|
52
|
+
|
53
|
+
# See how all your routes lay out with "rake routes"
|
54
|
+
|
55
|
+
# This is a legacy wild controller route that's not recommended for RESTful applications.
|
56
|
+
# Note: This route will make all actions in every controller accessible via GET requests.
|
57
|
+
# match ':controller(/:action(/:id(.:format)))'
|
58
|
+
end
|
@@ -0,0 +1,111 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'lib/generators/admin/testing_helper'
|
3
|
+
|
4
|
+
class Admin::Generators::ScaffoldControllerGeneratorTest < Rails::Generators::TestCase
|
5
|
+
destination File.join(Rails.root)
|
6
|
+
tests Admin::Generators::ScaffoldControllerGenerator
|
7
|
+
arguments %w(User name:string age:integer)
|
8
|
+
|
9
|
+
setup :prepare_destination
|
10
|
+
setup :copy_routes
|
11
|
+
|
12
|
+
def test_controller_skeleton_is_created
|
13
|
+
run_generator
|
14
|
+
|
15
|
+
assert_file "app/controllers/admin/users_controller.rb" do |content|
|
16
|
+
assert_match(/class Admin::UsersController < ApplicationController/, content)
|
17
|
+
|
18
|
+
assert_instance_method :index, content do |m|
|
19
|
+
assert_match(/@users = User\.all/, m)
|
20
|
+
end
|
21
|
+
|
22
|
+
assert_instance_method :show, content
|
23
|
+
|
24
|
+
assert_instance_method :new, content do |m|
|
25
|
+
assert_match(/@user = User\.new/, m)
|
26
|
+
end
|
27
|
+
|
28
|
+
assert_instance_method :edit, content
|
29
|
+
|
30
|
+
assert_instance_method :create, content do |m|
|
31
|
+
assert_match(/@user = User\.new\(user_params\)/, m)
|
32
|
+
assert_match(/@user\.save/, m)
|
33
|
+
end
|
34
|
+
|
35
|
+
assert_instance_method :update, content do |m|
|
36
|
+
assert_match(/@user\.update\(user_params\)/, m)
|
37
|
+
end
|
38
|
+
|
39
|
+
assert_instance_method :destroy, content do |m|
|
40
|
+
assert_match(/@user\.destroy/, m)
|
41
|
+
assert_match(/User was successfully destroyed/, m)
|
42
|
+
end
|
43
|
+
|
44
|
+
assert_instance_method :set_user, content do |m|
|
45
|
+
assert_match(/@user = User\.find\(params\[:id\]\)/, m)
|
46
|
+
end
|
47
|
+
|
48
|
+
assert_match(/def user_params/, content)
|
49
|
+
assert_match(/params\.require\(:user\)\.permit\(:name, :age\)/, content)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_dont_use_require_or_permit_if_there_are_no_attributes
|
54
|
+
run_generator ["User"]
|
55
|
+
|
56
|
+
assert_file "app/controllers/admin/users_controller.rb" do |content|
|
57
|
+
assert_match(/def user_params/, content)
|
58
|
+
assert_match(/params\[:user\]/, content)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_helper_are_invoked_with_a_pluralized_name
|
63
|
+
run_generator
|
64
|
+
assert_file "app/helpers/admin/users_helper.rb", /module Admin::UsersHelper/
|
65
|
+
assert_file "test/helpers/admin/users_helper_test.rb", /class Admin::UsersHelperTest < ActionView::TestCase/
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_views_are_generated
|
69
|
+
run_generator
|
70
|
+
|
71
|
+
%w(index edit new show).each do |view|
|
72
|
+
assert_file "app/views/admin/users/#{view}.html.erb"
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def test_functional_tests
|
77
|
+
run_generator ["User", "name:string", "age:integer", "organization:references{polymorphic}"]
|
78
|
+
|
79
|
+
assert_file "test/controllers/admin/users_controller_test.rb" do |content|
|
80
|
+
assert_match(/class Admin::UsersControllerTest < ActionController::TestCase/, content)
|
81
|
+
assert_match(/test "should get index"/, content)
|
82
|
+
assert_match(/post :create, user: \{ age: @user\.age, name: @user\.name, organization_id: @user\.organization_id, organization_type: @user\.organization_type \}/, content)
|
83
|
+
assert_match(/patch :update, id: @user, user: \{ age: @user\.age, name: @user\.name, organization_id: @user\.organization_id, organization_type: @user\.organization_type \}/, content)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def test_functional_tests_without_attributes
|
88
|
+
run_generator ["User"]
|
89
|
+
|
90
|
+
assert_file "test/controllers/admin/users_controller_test.rb" do |content|
|
91
|
+
assert_match(/class Admin::UsersControllerTest < ActionController::TestCase/, content)
|
92
|
+
assert_match(/test "should get index"/, content)
|
93
|
+
assert_match(/post :create, user: \{ \}/, content)
|
94
|
+
assert_match(/patch :update, id: @user, user: \{ \}/, content)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def test_skip_helper_if_required
|
99
|
+
run_generator ["User", "name:string", "age:integer", "--no-helper"]
|
100
|
+
assert_no_file "app/helpers/admin/users_helper.rb"
|
101
|
+
assert_no_file "test/helpers/admin/users_helper_test.rb"
|
102
|
+
end
|
103
|
+
|
104
|
+
def test_new_hash_style
|
105
|
+
run_generator
|
106
|
+
assert_file "app/controllers/admin/users_controller.rb" do |content|
|
107
|
+
assert_match(/render action: 'new'/, content)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require_generators :admin => ['scaffold_controller']
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'test/unit'
|
3
|
+
require 'rails/all'
|
4
|
+
require 'rails/generators'
|
5
|
+
require 'rails/generators/test_case'
|
6
|
+
|
7
|
+
class TestApp < Rails::Application
|
8
|
+
config.root = File.dirname(__FILE__)
|
9
|
+
end
|
10
|
+
Rails.application = TestApp
|
11
|
+
|
12
|
+
module Rails
|
13
|
+
def self.root
|
14
|
+
@root ||= File.expand_path(File.join(File.dirname(__FILE__), '..', 'tmp', 'rails'))
|
15
|
+
end
|
16
|
+
end
|
17
|
+
Rails.application.config.root = Rails.root
|
18
|
+
|
19
|
+
# Call configure to load the settings from
|
20
|
+
# Rails.application.config.generators to Rails::Generators
|
21
|
+
Rails::Generators.configure! Rails.application.config.generators
|
22
|
+
|
23
|
+
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
|
24
|
+
|
25
|
+
def copy_routes
|
26
|
+
routes = File.expand_path(File.join(File.dirname(__FILE__), 'fixtures', 'routes.rb'))
|
27
|
+
destination = File.join(Rails.root, "config")
|
28
|
+
FileUtils.mkdir_p(destination)
|
29
|
+
FileUtils.cp File.expand_path(routes), destination
|
30
|
+
end
|
31
|
+
|
32
|
+
# Asserts the given class exists in the given content. When a block is given,
|
33
|
+
# it yields the content of the class.
|
34
|
+
#
|
35
|
+
# assert_file "test/functional/accounts_controller_test.rb" do |controller_test|
|
36
|
+
# assert_class "AccountsControllerTest", controller_test do |klass|
|
37
|
+
# assert_match /context "index action"/, klass
|
38
|
+
# end
|
39
|
+
# end
|
40
|
+
#
|
41
|
+
def assert_class(klass, content)
|
42
|
+
assert content =~ /class #{klass}(\(.+\))?(.*?)\nend/m, "Expected to have class #{klass}"
|
43
|
+
yield $2.strip if block_given?
|
44
|
+
end
|
45
|
+
|
46
|
+
def generator_list
|
47
|
+
{
|
48
|
+
:admin => ['scaffold_controller']
|
49
|
+
}
|
50
|
+
end
|
51
|
+
|
52
|
+
def path_prefix(name)
|
53
|
+
case name
|
54
|
+
when :rails
|
55
|
+
'rails/generators'
|
56
|
+
else
|
57
|
+
'generators'
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def require_generators(generator_list)
|
62
|
+
generator_list.each do |name, generators|
|
63
|
+
generators.each do |generator_name|
|
64
|
+
if name.to_s == 'rails' && generator_name.to_s == 'mailer'
|
65
|
+
require File.join(path_prefix(name), generator_name.to_s, "#{generator_name}_generator")
|
66
|
+
else
|
67
|
+
require File.join(path_prefix(name), name.to_s, generator_name.to_s, "#{generator_name}_generator")
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
alias :require_generator :require_generators
|
73
|
+
|
74
|
+
require_generators generator_list
|
metadata
ADDED
@@ -0,0 +1,134 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rails-admin-scaffold
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Kirill Kalachev
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-08-15 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: railties
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '4.0'
|
20
|
+
- - <
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '4.1'
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '4.0'
|
30
|
+
- - <
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '4.1'
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: rails
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - '>='
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '3.1'
|
40
|
+
- - <
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: '4.1'
|
43
|
+
type: :development
|
44
|
+
prerelease: false
|
45
|
+
version_requirements: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - '>='
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '3.1'
|
50
|
+
- - <
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: '4.1'
|
53
|
+
- !ruby/object:Gem::Dependency
|
54
|
+
name: bundler
|
55
|
+
requirement: !ruby/object:Gem::Requirement
|
56
|
+
requirements:
|
57
|
+
- - ~>
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: '1.2'
|
60
|
+
type: :development
|
61
|
+
prerelease: false
|
62
|
+
version_requirements: !ruby/object:Gem::Requirement
|
63
|
+
requirements:
|
64
|
+
- - ~>
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: '1.2'
|
67
|
+
- !ruby/object:Gem::Dependency
|
68
|
+
name: rake
|
69
|
+
requirement: !ruby/object:Gem::Requirement
|
70
|
+
requirements:
|
71
|
+
- - '>='
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
version: '0'
|
74
|
+
type: :development
|
75
|
+
prerelease: false
|
76
|
+
version_requirements: !ruby/object:Gem::Requirement
|
77
|
+
requirements:
|
78
|
+
- - '>='
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
version: '0'
|
81
|
+
description: Rails generator which allows to scaffold admin controllers, views with
|
82
|
+
proper (non-namespaced) models, helpers, tests and routes
|
83
|
+
email:
|
84
|
+
- dhampik@gmail.com
|
85
|
+
executables: []
|
86
|
+
extensions: []
|
87
|
+
extra_rdoc_files: []
|
88
|
+
files:
|
89
|
+
- LICENSE
|
90
|
+
- README.md
|
91
|
+
- lib/rails-admin-scaffold/version.rb
|
92
|
+
- lib/generators/admin/scaffold_controller/templates/tests/test_unit/functional_test.erb
|
93
|
+
- lib/generators/admin/scaffold_controller/templates/controllers/controller.erb
|
94
|
+
- lib/generators/admin/scaffold_controller/templates/views/erb/new.html.erb
|
95
|
+
- lib/generators/admin/scaffold_controller/templates/views/erb/show.html.erb
|
96
|
+
- lib/generators/admin/scaffold_controller/templates/views/erb/edit.html.erb
|
97
|
+
- lib/generators/admin/scaffold_controller/templates/views/erb/index.html.erb
|
98
|
+
- lib/generators/admin/scaffold_controller/templates/views/erb/_form.html.erb
|
99
|
+
- lib/generators/admin/scaffold_controller/scaffold_controller_generator.rb
|
100
|
+
- lib/generators/admin/scaffold_controller/USAGE
|
101
|
+
- lib/rails_admin_scaffold.rb
|
102
|
+
- test/fixtures/routes.rb
|
103
|
+
- test/test_helper.rb
|
104
|
+
- test/lib/generators/admin/scaffold_controller_generator_test.rb
|
105
|
+
- test/lib/generators/admin/testing_helper.rb
|
106
|
+
homepage: http://github.com/dhampik/rails-admin-scaffold
|
107
|
+
licenses:
|
108
|
+
- MIT
|
109
|
+
metadata: {}
|
110
|
+
post_install_message:
|
111
|
+
rdoc_options: []
|
112
|
+
require_paths:
|
113
|
+
- lib
|
114
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
115
|
+
requirements:
|
116
|
+
- - '>='
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: '0'
|
119
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
120
|
+
requirements:
|
121
|
+
- - '>='
|
122
|
+
- !ruby/object:Gem::Version
|
123
|
+
version: 1.3.6
|
124
|
+
requirements: []
|
125
|
+
rubyforge_project: rails-admin-scaffold
|
126
|
+
rubygems_version: 2.0.6
|
127
|
+
signing_key:
|
128
|
+
specification_version: 4
|
129
|
+
summary: Rails admin controllers scaffolding generator
|
130
|
+
test_files:
|
131
|
+
- test/fixtures/routes.rb
|
132
|
+
- test/test_helper.rb
|
133
|
+
- test/lib/generators/admin/scaffold_controller_generator_test.rb
|
134
|
+
- test/lib/generators/admin/testing_helper.rb
|