admin-panel 0.1.1 → 0.1.2
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 +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +3 -3
- data/admin-panel.gemspec +20 -20
- data/lib/admin-panel/version.rb +1 -1
- data/lib/generators/admin_panel/install/install_generator.rb +43 -43
- data/lib/generators/admin_panel/install/templates/controllers/admin/dashboard_controller.rb +1 -1
- data/lib/generators/admin_panel/install/templates/controllers/admin/passwords_controller.rb +2 -2
- data/lib/generators/admin_panel/install/templates/controllers/admin/sessions_controller.rb +2 -2
- data/lib/generators/admin_panel/install/templates/controllers/concerns/administrable.rb +6 -6
- data/lib/generators/admin_panel/install/templates/helpers/admin_helper.rb +15 -15
- data/lib/generators/admin_panel/install/templates/layouts/admin/_messages.html.erb +6 -6
- data/lib/generators/admin_panel/install/templates/layouts/admin/_navigation.html.erb +17 -17
- data/lib/generators/admin_panel/install/templates/layouts/admin/application.html.erb +15 -15
- data/lib/generators/admin_panel/install/templates/views/admin/passwords/new.html.erb +0 -2
- data/lib/generators/admin_panel/install/templates/views/admin/sessions/new.html.erb +2 -2
- data/lib/generators/admin_panel/scaffold/scaffold_generator.rb +160 -159
- data/lib/generators/admin_panel/scaffold/templates/views/erb/edit.html.erb.erb +8 -8
- data/lib/generators/admin_panel/scaffold/templates/views/erb/index.html.erb.erb +28 -28
- data/lib/generators/admin_panel/scaffold/templates/views/erb/new.html.erb.erb +8 -8
- data/lib/generators/admin_panel/scaffold/templates/views/erb/show.html.erb.erb +13 -13
- data/spec/dummy/bin/rails +5 -5
- data/spec/dummy/config/routes.rb +1 -1
- data/spec/generators/admin_panel/install/install_generator_spec.rb +54 -54
- data/spec/generators/admin_panel/scaffold/scaffold_generator_spec.rb +21 -21
- data/spec/spec_helper.rb +5 -5
- metadata +1 -2
- data/lib/generators/admin_panel/scaffold/templates/tests/test_unit/functional_test.rb.erb +0 -51
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2bbe264a8f0f9ce2982096d8dc4b8873c1cdf736
|
4
|
+
data.tar.gz: 3bb81974a0670450b6530da533311a6325dd5edb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bf8e131f97cc7c676133a242eff4c57a49627f8ad229f2d783fbe86ce5429d4b48bb8444d818127c56307ef6b6e827216b5a788dfdc5eaa5d56bd9562a2e8b7b
|
7
|
+
data.tar.gz: 4ad86baa443f5c7c2e6cbf594f3dc11270cc833b316fae60c34b1aabc43fb6b5d3432fa285ba95bb439138d99ea37464c6de032e4c0e695f628dde3929bba142
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -9,13 +9,13 @@ Installation
|
|
9
9
|
Start with adding these gems to your Gemfile:
|
10
10
|
|
11
11
|
```ruby
|
12
|
-
gem 'admin-panel', '~> 0.1.
|
12
|
+
gem 'admin-panel', '~> 0.1.1'
|
13
13
|
gem 'devise', '~> 3.2'
|
14
14
|
gem 'simple_form', '3.1.0.rc1'
|
15
15
|
gem 'bootstrap-sass', '~> 3.1'
|
16
16
|
```
|
17
17
|
|
18
|
-
Then do
|
18
|
+
Then do `bundle install` and run the installer:
|
19
19
|
|
20
20
|
```bash
|
21
21
|
$ rails generate admin_panel:install
|
@@ -33,7 +33,7 @@ $ rails generate admin_panel:scaffold NAME [field:type field:type ...]
|
|
33
33
|
Running tests
|
34
34
|
-------------
|
35
35
|
|
36
|
-
Tests can be run using
|
36
|
+
Tests can be run using `rake spec`. They are written using rspec and [ammeter](https://github.com/alexrothenberg/ammeter).
|
37
37
|
|
38
38
|
Thanks
|
39
39
|
------
|
data/admin-panel.gemspec
CHANGED
@@ -2,28 +2,28 @@ $:.push File.expand_path("../lib", __FILE__)
|
|
2
2
|
require 'admin-panel/version'
|
3
3
|
|
4
4
|
Gem::Specification.new do |spec|
|
5
|
-
|
6
|
-
|
5
|
+
spec.name = 'admin-panel'
|
6
|
+
spec.version = AdminPanel::VERSION
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
8
|
+
spec.authors = ['Michał Matyas']
|
9
|
+
spec.email = ['michal@higher.lv']
|
10
|
+
spec.summary = 'Generates Twitter Bootstrap based admin panel with scaffolder'
|
11
|
+
spec.description = 'Generates Twitter Bootstrap based admin panel with scaffolder. Project is quite opinionated, requires Rails 4, SASS, SimpleForm and Devise.'
|
12
|
+
spec.homepage = 'https://github.com/d4rky-pl/admin-panel'
|
13
|
+
spec.license = 'MIT'
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
|
15
|
+
spec.files = `git ls-files`.split($/)
|
16
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
17
|
+
spec.require_paths = ["lib"]
|
18
18
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
19
|
+
spec.add_development_dependency 'bundler', '~> 1.5'
|
20
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
21
|
+
spec.add_development_dependency 'rspec', '~> 3.0'
|
22
|
+
spec.add_development_dependency 'ammeter', '~> 1.0'
|
23
23
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
24
|
+
spec.add_runtime_dependency 'railties', '>= 4.0.0'
|
25
|
+
spec.add_runtime_dependency 'sass-rails', '>= 4.0.0'
|
26
|
+
spec.add_runtime_dependency 'bootstrap-sass', '~> 3.1'
|
27
|
+
spec.add_runtime_dependency 'simple_form', '>= 3.1.0.rc1'
|
28
|
+
spec.add_runtime_dependency 'devise', '~> 3.2'
|
29
29
|
end
|
data/lib/admin-panel/version.rb
CHANGED
@@ -1,56 +1,56 @@
|
|
1
1
|
require 'rails/generators'
|
2
2
|
|
3
3
|
module AdminPanel
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
4
|
+
module Generators
|
5
|
+
class InstallGenerator < ::Rails::Generators::Base
|
6
|
+
desc 'Generate basic admin panel with authentication namespaced as Admin'
|
7
|
+
source_root ::File.expand_path('../templates', __FILE__)
|
8
8
|
|
9
|
-
|
9
|
+
class_option :template_engine
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
|
11
|
+
def install_devise
|
12
|
+
invoke 'devise:install'
|
13
|
+
end
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
|
15
|
+
def install_simple_form
|
16
|
+
invoke 'simple_form:install', [], ['--bootstrap']
|
17
|
+
end
|
18
18
|
|
19
|
-
|
19
|
+
attr_reader :app_name
|
20
20
|
|
21
|
-
|
22
|
-
|
23
|
-
|
21
|
+
def copy_layout
|
22
|
+
@app_name = ::Rails.application.class.to_s.split("::").first.humanize
|
23
|
+
extension = "html.#{options[:template_engine]}"
|
24
24
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
25
|
+
template "layouts/admin/application.#{extension}", "app/views/layouts/admin/application.#{extension}"
|
26
|
+
['_messages', '_navigation'].each do |file|
|
27
|
+
filename = "#{file}.#{extension}"
|
28
|
+
copy_file "layouts/admin/#{filename}", "app/views/layouts/admin/#{filename}"
|
29
|
+
end
|
30
|
+
end
|
31
31
|
|
32
|
-
|
33
|
-
|
34
|
-
|
32
|
+
def copy_assets
|
33
|
+
directory 'assets', 'app/assets'
|
34
|
+
end
|
35
35
|
|
36
|
-
|
37
|
-
|
38
|
-
|
36
|
+
def copy_helpers
|
37
|
+
directory 'helpers', 'app/helpers'
|
38
|
+
end
|
39
39
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
40
|
+
def copy_scaffold
|
41
|
+
directory 'controllers', 'app/controllers'
|
42
|
+
directory 'views', 'app/views'
|
43
|
+
end
|
44
44
|
|
45
|
-
|
46
|
-
|
47
|
-
|
45
|
+
def create_admin_model
|
46
|
+
invoke 'active_record:devise', ['admin'], ['--routes', false]
|
47
|
+
append_to_file 'db/seeds.rb', %Q(
|
48
48
|
Admin.create!({ email: 'admin@example.com', password: 'administrator' })
|
49
49
|
)
|
50
|
-
|
50
|
+
end
|
51
51
|
|
52
|
-
|
53
|
-
|
52
|
+
def create_routes
|
53
|
+
route %Q(
|
54
54
|
devise_for :admin,
|
55
55
|
:only => [:sessions, :passwords],
|
56
56
|
:controllers => { :sessions => 'admin/sessions', :passwords => 'admin/passwords' }
|
@@ -59,11 +59,11 @@ Admin.create!({ email: 'admin@example.com', password: 'administrator' })
|
|
59
59
|
get '/', to: 'dashboard#index', as: :dashboard
|
60
60
|
end
|
61
61
|
)
|
62
|
-
|
62
|
+
end
|
63
63
|
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
64
|
+
def show_install_message
|
65
|
+
readme "README"
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
69
|
end
|
@@ -1,9 +1,9 @@
|
|
1
1
|
module Administrable
|
2
|
-
|
2
|
+
extend ActiveSupport::Concern
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
4
|
+
included do
|
5
|
+
before_filter :authenticate_admin!
|
6
|
+
helper AdminHelper
|
7
|
+
layout 'admin/application'
|
8
|
+
end
|
9
9
|
end
|
@@ -1,19 +1,19 @@
|
|
1
1
|
module AdminHelper
|
2
|
-
|
3
|
-
|
4
|
-
|
2
|
+
def admin_pages
|
3
|
+
# TODO: something more elegant
|
4
|
+
non_scaffold_pages = %w(dashboard sessions passwords)
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
6
|
+
Dir.glob(Rails.root.join('app', 'controllers', 'admin', '*.rb')).map do |path|
|
7
|
+
filename = File.basename(path)
|
8
|
+
resource_name = filename.sub(/_controller\.rb$/, '')
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
10
|
+
unless non_scaffold_pages.include? resource_name
|
11
|
+
{
|
12
|
+
name: resource_name.humanize,
|
13
|
+
controller: "#{resource_name}",
|
14
|
+
url: self.send("admin_#{resource_name}_path")
|
15
|
+
}
|
16
|
+
end
|
17
|
+
end.compact
|
18
|
+
end
|
19
19
|
end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
<% flash.each do |name, msg| %>
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
2
|
+
<% if msg.is_a?(String) %>
|
3
|
+
<div class="alert alert-<%= name.to_s == 'notice' ? 'success' : 'danger' %>">
|
4
|
+
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
|
5
|
+
<%= content_tag :div, msg, :id => "flash_#{name}" %>
|
6
|
+
</div>
|
7
|
+
<% end %>
|
8
8
|
<% end %>
|
@@ -1,20 +1,20 @@
|
|
1
1
|
<nav class="navbar navbar-default" role="navigation">
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
2
|
+
<div class="container-fluid">
|
3
|
+
<div class="navbar-header">
|
4
|
+
<a class="navbar-brand" href="<%= admin_dashboard_path %>">App name</a>
|
5
|
+
</div>
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
7
|
+
<% if admin_signed_in? %>
|
8
|
+
<ul class="nav navbar-nav">
|
9
|
+
<% admin_pages.each do |page| %>
|
10
|
+
<li class="<%= controller_name == page[:controller] ? 'active' : '' %>">
|
11
|
+
<a href="<%= page[:url] %>"><%= page[:name] %></a>
|
12
|
+
</li>
|
13
|
+
<% end %>
|
14
|
+
</ul>
|
15
|
+
<ul class="nav navbar-nav navbar-right">
|
16
|
+
<li><%= link_to 'Sign out', destroy_admin_session_path, method: :delete %></li>
|
17
|
+
</ul>
|
18
|
+
<% end %>
|
19
|
+
</div>
|
20
20
|
</nav>
|
@@ -1,22 +1,22 @@
|
|
1
1
|
<!DOCTYPE html>
|
2
2
|
<html>
|
3
3
|
<head>
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
4
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
5
|
+
<title><%%= content_for?(:title) ? yield(:title) : "<%= app_name.underscore.titleize %>" %></title>
|
6
|
+
<meta name="description" content="<%%= content_for?(:description) ? yield(:description) : "<%= app_name.underscore.titleize %>" %>">
|
7
|
+
<%%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %>
|
8
|
+
<%%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
|
9
|
+
<%%= csrf_meta_tags %>
|
10
10
|
</head>
|
11
11
|
<body>
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
12
|
+
<header>
|
13
|
+
<%%= render partial: 'layouts/admin/navigation' %>
|
14
|
+
</header>
|
15
|
+
<main role="main">
|
16
|
+
<div class="container">
|
17
|
+
<%%= render partial: 'layouts/admin/messages' %>
|
18
|
+
<%%= yield %>
|
19
|
+
</div>
|
20
|
+
</main>
|
21
21
|
</body>
|
22
22
|
</html>
|
@@ -12,6 +12,6 @@
|
|
12
12
|
</div>
|
13
13
|
<% end %>
|
14
14
|
|
15
|
-
<%- if devise_mapping.recoverable?
|
16
|
-
|
15
|
+
<%- if devise_mapping.recoverable? %>
|
16
|
+
<%= link_to "Forgot your password?", new_password_path(resource_name) %><br />
|
17
17
|
<% end -%>
|
@@ -3,166 +3,167 @@ require 'rails/generators/named_base'
|
|
3
3
|
require 'rails/generators/resource_helpers'
|
4
4
|
|
5
5
|
module AdminPanel
|
6
|
-
|
7
|
-
|
8
|
-
|
6
|
+
module Generators
|
7
|
+
class ScaffoldGenerator < Rails::Generators::NamedBase
|
8
|
+
include Rails::Generators::ResourceHelpers
|
9
|
+
|
10
|
+
source_root File.expand_path('../templates', __FILE__)
|
9
11
|
|
10
|
-
|
12
|
+
class_option :template_engine, desc: 'Template engine to be invoked (erb or haml).'
|
13
|
+
class_option :test_framework, desc: 'Test framework to be used.'
|
11
14
|
|
12
|
-
|
15
|
+
check_class_collision suffix: "Controller"
|
16
|
+
check_class_collision suffix: "ControllerTest"
|
17
|
+
check_class_collision suffix: "Helper"
|
13
18
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
end
|
165
|
-
|
166
|
-
end
|
167
|
-
end
|
19
|
+
class_option :orm, banner: "NAME", type: :string, required: true,
|
20
|
+
desc: "ORM to generate the controller for"
|
21
|
+
|
22
|
+
class_option :parent_controller, banner: "admin", type: :string, default: "application",
|
23
|
+
desc: "Define the parent controller"
|
24
|
+
|
25
|
+
argument :attributes, type: :array, default: [], banner: "field:type field:type"
|
26
|
+
|
27
|
+
def initialize(args, *options) #:nodoc:
|
28
|
+
super
|
29
|
+
end
|
30
|
+
|
31
|
+
hook_for :resource_route, in: :rails do |resource_route|
|
32
|
+
invoke resource_route, [prefixed_class_name]
|
33
|
+
end
|
34
|
+
|
35
|
+
def create_model
|
36
|
+
# There is no sane way of converting Rails::Generators::GeneratedAttribute back to string
|
37
|
+
attributes_string = attributes.map do |attr|
|
38
|
+
index = (attr.instance_variable_get("@has_uniq_index") && ':uniq') ||
|
39
|
+
(attr.instance_variable_get("@has_index") && ':index') ||
|
40
|
+
''
|
41
|
+
"#{attr.name}:#{attr.type}#{index}"
|
42
|
+
end
|
43
|
+
generate 'model', class_name, *attributes_string
|
44
|
+
end
|
45
|
+
|
46
|
+
def create_controller_files
|
47
|
+
template "controllers/controller.rb.erb", File.join('app/controllers', prefix, class_path, "#{controller_file_name}_controller.rb")
|
48
|
+
end
|
49
|
+
|
50
|
+
hook_for :test_framework, in: :rails do |helper|
|
51
|
+
invoke helper, [prefixed_controller_class_name]
|
52
|
+
end
|
53
|
+
|
54
|
+
hook_for :helper, in: :rails do |helper|
|
55
|
+
invoke helper, [prefixed_controller_class_name]
|
56
|
+
end
|
57
|
+
|
58
|
+
def create_root_folder
|
59
|
+
empty_directory File.join("app/views", prefix, controller_file_path)
|
60
|
+
end
|
61
|
+
|
62
|
+
def copy_view_files
|
63
|
+
available_views.each do |view|
|
64
|
+
filename = filename_with_extensions(view)
|
65
|
+
template "views/#{handler}/#{filename}.erb", File.join("app/views", prefix, controller_file_path, filename)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
hook_for :assets, in: :rails do |assets|
|
70
|
+
invoke assets, [prefixed_class_name]
|
71
|
+
end
|
72
|
+
|
73
|
+
protected
|
74
|
+
|
75
|
+
def prefix
|
76
|
+
'admin'
|
77
|
+
end
|
78
|
+
|
79
|
+
def prefixed_class_name
|
80
|
+
"#{prefix.capitalize}::#{class_name}"
|
81
|
+
end
|
82
|
+
|
83
|
+
def prefixed_controller_class_name
|
84
|
+
"#{prefix.capitalize}::#{controller_class_name}"
|
85
|
+
end
|
86
|
+
|
87
|
+
def parent_controller_class_name
|
88
|
+
options[:parent_controller].capitalize
|
89
|
+
end
|
90
|
+
|
91
|
+
def prefixed_route_url
|
92
|
+
"/#{prefix}#{route_url}"
|
93
|
+
end
|
94
|
+
|
95
|
+
def prefixed_plain_model_url
|
96
|
+
"#{prefix}_#{singular_table_name}"
|
97
|
+
end
|
98
|
+
|
99
|
+
def prefixed_index_helper
|
100
|
+
"#{prefix}_#{index_helper}"
|
101
|
+
end
|
102
|
+
|
103
|
+
def available_views
|
104
|
+
%w(index edit show new _form)
|
105
|
+
end
|
106
|
+
|
107
|
+
def format
|
108
|
+
:html
|
109
|
+
end
|
110
|
+
|
111
|
+
def handler
|
112
|
+
options[:template_engine]
|
113
|
+
end
|
114
|
+
|
115
|
+
def filename_with_extensions(name)
|
116
|
+
[name, format, handler].compact.join(".")
|
117
|
+
end
|
118
|
+
|
119
|
+
# Add a class collisions name to be checked on class initialization. You
|
120
|
+
# can supply a hash with a :prefix or :suffix to be tested.
|
121
|
+
#
|
122
|
+
# ==== Examples
|
123
|
+
#
|
124
|
+
# check_class_collision suffix: "Decorator"
|
125
|
+
#
|
126
|
+
# If the generator is invoked with class name Admin, it will check for
|
127
|
+
# the presence of "AdminDecorator".
|
128
|
+
#
|
129
|
+
def self.check_class_collision(options={})
|
130
|
+
define_method :check_class_collision do
|
131
|
+
name = if self.respond_to?(:prefixed_controller_class_name) # for ScaffoldBase
|
132
|
+
prefixed_controller_class_name
|
133
|
+
elsif self.respond_to?(:prefixed_controller_class_name) # for ScaffoldBase
|
134
|
+
controller_class_name
|
135
|
+
else
|
136
|
+
class_name
|
137
|
+
end
|
138
|
+
|
139
|
+
class_collisions "#{options[:prefix]}#{name}#{options[:suffix]}"
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
def attributes_hash
|
144
|
+
return if attributes_names.empty?
|
145
|
+
|
146
|
+
attributes_names.map do |name|
|
147
|
+
if %w(password password_confirmation).include?(name) && attributes.any?(&:password_digest?)
|
148
|
+
"#{name}: 'secret'"
|
149
|
+
else
|
150
|
+
"#{name}: @#{singular_table_name}.#{name}"
|
151
|
+
end
|
152
|
+
end.sort.join(', ')
|
153
|
+
end
|
154
|
+
|
155
|
+
def attributes_list_with_timestamps
|
156
|
+
attributes_list(attributes_names + %w(created_at updated_at))
|
157
|
+
end
|
158
|
+
|
159
|
+
def attributes_list(attributes = attributes_names)
|
160
|
+
if self.attributes.any? { |attr| attr.name == 'password' && attr.type == :digest }
|
161
|
+
attributes = attributes.reject { |name| %w(password password_confirmation).include? name }
|
162
|
+
end
|
163
|
+
|
164
|
+
attributes.map { |a| ":#{a}" } * ', '
|
165
|
+
end
|
166
|
+
|
167
|
+
end
|
168
|
+
end
|
168
169
|
end
|
@@ -1,12 +1,12 @@
|
|
1
1
|
<div class="page-header">
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
2
|
+
<div class="row">
|
3
|
+
<div class="col-md-8">
|
4
|
+
<h2>Editing <%= singular_table_name %></h2>
|
5
|
+
</div>
|
6
|
+
<div class="col-md-4 text-right">
|
7
|
+
<%%= link_to 'Back', <%= prefixed_index_helper %>_path, class: 'btn btn-default' %>
|
8
|
+
</div>
|
9
|
+
</div>
|
10
10
|
</div>
|
11
11
|
|
12
12
|
<%%= render 'form' %>
|
@@ -1,37 +1,37 @@
|
|
1
1
|
<div class="page-header">
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
2
|
+
<div class="row">
|
3
|
+
<div class="col-md-8">
|
4
|
+
<h2>Listing <%= plural_table_name %></h2>
|
5
|
+
</div>
|
6
|
+
<div class="col-md-4 text-right">
|
7
|
+
<%%= link_to 'New <%= human_name %>', new_<%= prefixed_plain_model_url %>_path, class: 'btn btn-success'%>
|
8
|
+
</div>
|
9
|
+
</div>
|
10
10
|
</div>
|
11
11
|
|
12
12
|
<table class="table table-striped">
|
13
|
-
|
14
|
-
|
13
|
+
<thead>
|
14
|
+
<tr>
|
15
15
|
<% attributes.reject(&:password_digest?).each do |attribute| -%>
|
16
|
-
|
16
|
+
<th><%= attribute.human_name %></th>
|
17
17
|
<% end -%>
|
18
|
-
|
19
|
-
|
20
|
-
|
18
|
+
<th class="text-right">Actions</th>
|
19
|
+
</tr>
|
20
|
+
</thead>
|
21
21
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
22
|
+
<tbody>
|
23
|
+
<%% @<%= plural_table_name %>.each do |<%= singular_table_name %>| %>
|
24
|
+
<tr>
|
25
|
+
<% attributes.reject(&:password_digest?).each do |attribute| -%>
|
26
|
+
<td><%%= link_to <%= singular_table_name %>.<%= attribute.name %>, <%= "[:#{prefix}, #{singular_table_name}]" %> %></td>
|
27
|
+
<% end -%>
|
28
|
+
<td class="text-right">
|
29
|
+
<%%= link_to 'Show', <%= "[:#{prefix}, #{singular_table_name}]" %>, class: 'btn btn-default' %>
|
30
|
+
<%%= link_to 'Edit', edit_<%= prefixed_plain_model_url %>_path(<%= singular_table_name %>), class: 'btn btn-primary' %>
|
31
|
+
<%%= link_to 'Destroy', <%= "[:#{prefix}, #{singular_table_name}]" %>, method: :delete, data: { confirm: 'Are you sure?' }, class: 'btn btn-danger' %>
|
32
|
+
</td>
|
33
|
+
</tr>
|
34
|
+
<%% end %>
|
35
|
+
</tbody>
|
36
36
|
</table>
|
37
37
|
|
@@ -1,12 +1,12 @@
|
|
1
1
|
<div class="page-header">
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
2
|
+
<div class="row">
|
3
|
+
<div class="col-md-8">
|
4
|
+
<h2>New <%= singular_table_name %></h2>
|
5
|
+
</div>
|
6
|
+
<div class="col-md-4 text-right">
|
7
|
+
<%%= link_to 'Back', <%= prefixed_index_helper %>_path, class: 'btn btn-default' %>
|
8
|
+
</div>
|
9
|
+
</div>
|
10
10
|
</div>
|
11
11
|
|
12
12
|
|
@@ -2,21 +2,21 @@
|
|
2
2
|
|
3
3
|
<table class="table table-striped">
|
4
4
|
<tbody>
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
5
|
+
<% attributes.reject(&:password_digest?).each do |attribute| -%>
|
6
|
+
<tr>
|
7
|
+
<td><strong><%= attribute.human_name %>:</strong></td>
|
8
|
+
<td><%%= @<%= singular_table_name %>.<%= attribute.name %> %></td>
|
9
|
+
</tr>
|
10
|
+
<% end -%>
|
11
11
|
</tbody>
|
12
12
|
</table>
|
13
13
|
|
14
14
|
<div class="row">
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
15
|
+
<div class="col-md-6">
|
16
|
+
<%%= link_to 'Back', <%= prefixed_index_helper %>_path, class: 'btn btn-default' %>
|
17
|
+
</div
|
18
|
+
<div class="col-md-6 text-right">
|
19
|
+
<%%= link_to 'Edit', edit_<%= prefixed_plain_model_url %>_path(@<%= singular_table_name %>), class: 'btn btn-primary' %>
|
20
|
+
<%%= link_to 'Destroy', <%= "[:#{prefix}, @#{singular_table_name}]" %>, method: :delete, data: { confirm: 'Are you sure?' }, class: 'btn btn-danger' %>
|
21
|
+
</div>
|
22
22
|
</div>
|
data/spec/dummy/bin/rails
CHANGED
@@ -2,10 +2,10 @@ require 'fileutils'
|
|
2
2
|
|
3
3
|
# This code only makes sure that invoke method in scaffold generator has been run correctly
|
4
4
|
if ARGV[0] == "generate" && ARGV[1] == "model"
|
5
|
-
|
6
|
-
|
7
|
-
|
5
|
+
root_path = File.expand_path('../../', __FILE__)
|
6
|
+
models_path = File.join(root_path, 'app', 'models')
|
7
|
+
filename = ARGV[2]
|
8
8
|
|
9
|
-
|
10
|
-
|
9
|
+
FileUtils.mkdir_p models_path
|
10
|
+
FileUtils.touch File.join(models_path, "#{filename.downcase}.rb")
|
11
11
|
end
|
data/spec/dummy/config/routes.rb
CHANGED
@@ -2,68 +2,68 @@ require 'spec_helper'
|
|
2
2
|
require 'generators/admin_panel/install/install_generator'
|
3
3
|
|
4
4
|
describe AdminPanel::Generators::InstallGenerator do
|
5
|
-
|
5
|
+
destination File.expand_path('../../../../../tmp', __FILE__)
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
7
|
+
before do
|
8
|
+
prepare_destination
|
9
|
+
prepare_rails_dummy
|
10
|
+
end
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
12
|
+
describe 'installer' do
|
13
|
+
before { run_generator }
|
14
|
+
describe 'devise:install' do
|
15
|
+
it_should_exist 'config/initializers/devise.rb'
|
16
|
+
end
|
17
17
|
|
18
|
-
|
19
|
-
|
20
|
-
|
18
|
+
describe 'simple_form:install' do
|
19
|
+
it_should_exist 'config/initializers/simple_form.rb'
|
20
|
+
end
|
21
21
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
22
|
+
describe 'copying layout' do
|
23
|
+
it_should_exist 'app/views/layouts/admin/application.html.erb'
|
24
|
+
it_should_exist 'app/views/layouts/admin/_messages.html.erb'
|
25
|
+
it_should_exist 'app/views/layouts/admin/_navigation.html.erb'
|
26
|
+
end
|
27
27
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
28
|
+
describe 'copying assets' do
|
29
|
+
it_should_exist 'app/assets/javascripts/admin.js'
|
30
|
+
it_should_exist 'app/assets/stylesheets/admin.css.scss'
|
31
|
+
end
|
32
32
|
|
33
|
-
|
34
|
-
|
35
|
-
|
33
|
+
describe 'copying helper' do
|
34
|
+
it_should_exist 'app/helpers/admin_helper.rb'
|
35
|
+
end
|
36
36
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
37
|
+
describe 'copying controllers' do
|
38
|
+
it_should_exist 'app/controllers/admin/dashboard_controller.rb'
|
39
|
+
it_should_exist 'app/controllers/admin/passwords_controller.rb'
|
40
|
+
it_should_exist 'app/controllers/admin/sessions_controller.rb'
|
41
|
+
end
|
42
42
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
43
|
+
describe 'copying views' do
|
44
|
+
it_should_exist 'app/views/admin/dashboard/index.html.erb'
|
45
|
+
it_should_exist 'app/views/admin/passwords/edit.html.erb'
|
46
|
+
it_should_exist 'app/views/admin/passwords/new.html.erb'
|
47
|
+
it_should_exist 'app/views/admin/sessions/new.html.erb'
|
48
|
+
end
|
49
49
|
|
50
|
-
|
51
|
-
|
52
|
-
|
50
|
+
describe 'active_record:devise' do
|
51
|
+
it_should_exist 'app/models/admin.rb'
|
52
|
+
end
|
53
53
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
54
|
+
describe 'seeding default admin user' do
|
55
|
+
describe 'seeds.rb' do
|
56
|
+
subject { file('db/seeds.rb') }
|
57
|
+
it { should exist }
|
58
|
+
it { should contain %Q(Admin.create!({ email: 'admin@example.com', password: 'administrator' })) }
|
59
|
+
end
|
60
|
+
end
|
61
61
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
62
|
+
describe 'routing generation' do
|
63
|
+
describe 'routes.rb' do
|
64
|
+
subject { file('config/routes.rb') }
|
65
|
+
it { should exist }
|
66
|
+
it { should contain %Q(
|
67
67
|
devise_for :admin,
|
68
68
|
:only => [:sessions, :passwords],
|
69
69
|
:controllers => { :sessions => 'admin/sessions', :passwords => 'admin/passwords' }
|
@@ -73,7 +73,7 @@ describe AdminPanel::Generators::InstallGenerator do
|
|
73
73
|
end
|
74
74
|
) }
|
75
75
|
|
76
|
-
|
77
|
-
|
78
|
-
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
79
|
end
|
@@ -2,30 +2,30 @@ require 'spec_helper'
|
|
2
2
|
require 'generators/admin_panel/scaffold/scaffold_generator'
|
3
3
|
|
4
4
|
describe AdminPanel::Generators::ScaffoldGenerator do
|
5
|
-
|
5
|
+
destination File.expand_path('../../../../../tmp', __FILE__)
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
7
|
+
before do
|
8
|
+
prepare_destination
|
9
|
+
prepare_rails_dummy
|
10
|
+
end
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
12
|
+
describe 'scaffolder' do
|
13
|
+
before { run_generator(%w(post title:string description:text public:boolean)) }
|
14
|
+
# @see spec/dummy/bin/rails
|
15
|
+
it_should_exist 'app/models/post.rb'
|
16
16
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
17
|
+
describe 'posts controller' do
|
18
|
+
subject { file('app/controllers/admin/posts_controller.rb') }
|
19
|
+
it { should exist }
|
20
|
+
it { should contain 'include Administrable' }
|
21
|
+
it { should contain '@posts = Post.all' }
|
22
|
+
end
|
23
23
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
24
|
+
it_should_exist 'app/views/admin/posts/index.html.erb'
|
25
|
+
it_should_exist 'app/views/admin/posts/edit.html.erb'
|
26
|
+
it_should_exist 'app/views/admin/posts/show.html.erb'
|
27
|
+
it_should_exist 'app/views/admin/posts/new.html.erb'
|
28
|
+
it_should_exist 'app/views/admin/posts/_form.html.erb'
|
29
29
|
|
30
|
-
|
30
|
+
end
|
31
31
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -6,12 +6,12 @@ require 'fileutils'
|
|
6
6
|
require 'ammeter/init'
|
7
7
|
|
8
8
|
def prepare_rails_dummy
|
9
|
-
|
9
|
+
FileUtils.cp_r('spec/dummy/.', destination_root)
|
10
10
|
end
|
11
11
|
|
12
12
|
def it_should_exist(path)
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
13
|
+
describe "file #{File.basename(path)}" do
|
14
|
+
subject { file(path) }
|
15
|
+
it { should exist }
|
16
|
+
end
|
17
17
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: admin-panel
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michał Matyas
|
@@ -170,7 +170,6 @@ files:
|
|
170
170
|
- lib/generators/admin_panel/install/templates/views/admin/sessions/new.html.erb
|
171
171
|
- lib/generators/admin_panel/scaffold/scaffold_generator.rb
|
172
172
|
- lib/generators/admin_panel/scaffold/templates/controllers/controller.rb.erb
|
173
|
-
- lib/generators/admin_panel/scaffold/templates/tests/test_unit/functional_test.rb.erb
|
174
173
|
- lib/generators/admin_panel/scaffold/templates/views/erb/_form.html.erb.erb
|
175
174
|
- lib/generators/admin_panel/scaffold/templates/views/erb/edit.html.erb.erb
|
176
175
|
- lib/generators/admin_panel/scaffold/templates/views/erb/index.html.erb.erb
|
@@ -1,51 +0,0 @@
|
|
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 -%>
|