padrino-admin 0.12.0 → 0.12.1
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/README.rdoc +1 -1
- data/lib/padrino-admin/generators/actions.rb +1 -1
- data/lib/padrino-admin/generators/admin_app.rb +6 -3
- data/lib/padrino-admin/generators/orm.rb +5 -3
- data/lib/padrino-admin/generators/templates/account/dynamoid.rb.tt +55 -0
- data/lib/padrino-admin/generators/templates/app.rb.tt +0 -1
- data/lib/padrino-admin/generators/templates/assets/stylesheets/application.css +6 -0
- data/test/generators/test_account_model_generator.rb +1 -1
- data/test/generators/test_admin_app_generator.rb +7 -1
- data/test/generators/test_admin_page_generator.rb +1 -1
- data/test/helper.rb +4 -10
- data/test/test_admin_application.rb +10 -10
- metadata +7 -6
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 6aa5241218d4e62f8664281acaf75964a7b5b662
|
|
4
|
+
data.tar.gz: 089b931c4d3e737172ef6232a9c93ac620197e36
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: b5945cd2a39ba565ed28e72162f60f697f6d80e6614127bf2fca30a7ab699eb70d4a856f334c2534528e35b571308a5cb6871eeed0be75345181bfc76978a58d
|
|
7
|
+
data.tar.gz: c937c3b00babd88d49325a6edc47d98ba9637343c958c2c98155fd063f48ad36c541471ac8b93c217e0d3477acf2e20d75bbe666263434a55420dd133bc19ee3
|
data/README.rdoc
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
Padrino has a beautiful Admin management dashboard with these features:
|
|
6
6
|
|
|
7
|
-
Orm Agnostic:: Data Adapters for Datamapper, Activerecord, Sequel, Mongomapper, Mongoid, Couchrest
|
|
7
|
+
Orm Agnostic:: Data Adapters for Datamapper, Activerecord, Sequel, Mongomapper, Mongoid, Couchrest, Dynamoid
|
|
8
8
|
Template Agnostic:: Erb, Erubis and Haml Renderer
|
|
9
9
|
Authentication:: Support for Account authentication, Account Permission management
|
|
10
10
|
Scaffold:: You can simply create a new "admin interface" by providing a Model
|
|
@@ -27,7 +27,7 @@ module Padrino
|
|
|
27
27
|
# Tell us for now which orm we support
|
|
28
28
|
#
|
|
29
29
|
def supported_orm
|
|
30
|
-
[:minirecord, :datamapper, :activerecord, :mongomapper, :mongoid, :couchrest, :sequel, :ohm]
|
|
30
|
+
[:minirecord, :datamapper, :activerecord, :mongomapper, :mongoid, :couchrest, :sequel, :ohm, :dynamoid]
|
|
31
31
|
end
|
|
32
32
|
|
|
33
33
|
##
|
|
@@ -34,7 +34,7 @@ module Padrino
|
|
|
34
34
|
# class_option :models_path, :desc => 'The models destination path', :default => '.', :type => :string
|
|
35
35
|
class_option :root, :desc => "The root destination", :aliases => '-r', :default => ".", :type => :string
|
|
36
36
|
class_option :destroy, :aliases => '-d', :default => false, :type => :boolean
|
|
37
|
-
class_option :renderer, :aliases => '-e', :desc => "Rendering engine (erb, haml)", :type => :string
|
|
37
|
+
class_option :renderer, :aliases => '-e', :desc => "Rendering engine (erb, haml, slim)", :type => :string
|
|
38
38
|
class_option :admin_model, :aliases => '-m', :desc => "The name of model for access controlling", :default => 'Account', :type => :string
|
|
39
39
|
class_option :admin_name, :aliases => '-a', :desc => 'The admin application name and path', :default => 'admin', :type => :string
|
|
40
40
|
|
|
@@ -131,7 +131,7 @@ module Padrino
|
|
|
131
131
|
|
|
132
132
|
unless options[:destroy]
|
|
133
133
|
add_project_module @model_plural
|
|
134
|
-
require_dependencies('bcrypt
|
|
134
|
+
require_dependencies('bcrypt')
|
|
135
135
|
end
|
|
136
136
|
|
|
137
137
|
# A nicer select box.
|
|
@@ -144,7 +144,10 @@ module Padrino
|
|
|
144
144
|
|
|
145
145
|
instructions = []
|
|
146
146
|
instructions << "Run 'bundle'"
|
|
147
|
-
|
|
147
|
+
if [:activerecord, :datamapper, :sequel].include?(orm)
|
|
148
|
+
instructions << "Run 'bundle exec rake db:create' if you have not created a database yet"
|
|
149
|
+
instructions << "Run 'bundle exec rake db:migrate'"
|
|
150
|
+
end
|
|
148
151
|
instructions << "Now repeat after me... 'ohm mani padme hum', 'ohm mani padme hum'... :)" if orm == :ohm
|
|
149
152
|
instructions << "Run 'bundle exec rake db:seed'"
|
|
150
153
|
instructions << "Visit the admin panel in the browser at '/#{@admin_path}'"
|
|
@@ -56,6 +56,7 @@ module Padrino
|
|
|
56
56
|
when :mongomapper then @klass.keys.values.reject { |key| key.name == "_id" } # On MongoMapper keys are an hash
|
|
57
57
|
when :sequel then @klass.db_schema.map { |k,v| v[:type] = :text if v[:db_type] =~ /^text/i; Column.new(k, v[:type]) }
|
|
58
58
|
when :ohm then @klass.attributes.map { |a| Column.new(a.to_s, :string) } # ohm has strings
|
|
59
|
+
when :dynamoid then @klass.attributes.map { |k,v| Column.new(k.to_s, v[:type]) }
|
|
59
60
|
else raise OrmError, "Adapter #{orm} is not yet supported!"
|
|
60
61
|
end
|
|
61
62
|
end
|
|
@@ -99,7 +100,7 @@ module Padrino
|
|
|
99
100
|
|
|
100
101
|
def find(params=nil)
|
|
101
102
|
case orm
|
|
102
|
-
when :activerecord, :minirecord, :mongomapper, :mongoid then "#{klass_name}.find(#{params})"
|
|
103
|
+
when :activerecord, :minirecord, :mongomapper, :mongoid, :dynamoid then "#{klass_name}.find(#{params})"
|
|
103
104
|
when :datamapper, :couchrest then "#{klass_name}.get(#{params})"
|
|
104
105
|
when :sequel, :ohm then "#{klass_name}[#{params}]"
|
|
105
106
|
else raise OrmError, "Adapter #{orm} is not yet supported!"
|
|
@@ -123,7 +124,7 @@ module Padrino
|
|
|
123
124
|
|
|
124
125
|
def update_attributes(params=nil)
|
|
125
126
|
case orm
|
|
126
|
-
when :activerecord, :minirecord, :mongomapper, :mongoid, :couchrest then "@#{name_singular}.update_attributes(#{params})"
|
|
127
|
+
when :activerecord, :minirecord, :mongomapper, :mongoid, :couchrest, :dynamoid then "@#{name_singular}.update_attributes(#{params})"
|
|
127
128
|
when :datamapper, :ohm then "@#{name_singular}.update(#{params})"
|
|
128
129
|
when :sequel then "@#{name_singular}.modified! && @#{name_singular}.update(#{params})"
|
|
129
130
|
else raise OrmError, "Adapter #{orm} is not yet supported!"
|
|
@@ -144,6 +145,7 @@ module Padrino
|
|
|
144
145
|
when :sequel then "#{klass_name}.where(:id => #{params})"
|
|
145
146
|
when :mongoid then "#{klass_name}.find(#{params})"
|
|
146
147
|
when :couchrest then "#{klass_name}.all(:keys => #{params})"
|
|
148
|
+
when :dynamoid then "#{klass_name}.find(#{params})"
|
|
147
149
|
else find(params)
|
|
148
150
|
end
|
|
149
151
|
end
|
|
@@ -153,7 +155,7 @@ module Padrino
|
|
|
153
155
|
when :ohm then "#{params}.each(&:delete)"
|
|
154
156
|
when :sequel then "#{params}.destroy"
|
|
155
157
|
when :datamapper then "#{params}.destroy"
|
|
156
|
-
when :couchrest, :mongoid, :mongomapper then "#{params}.each(&:destroy)"
|
|
158
|
+
when :couchrest, :mongoid, :mongomapper, :dynamoid then "#{params}.each(&:destroy)"
|
|
157
159
|
else "#{klass_name}.destroy #{params}"
|
|
158
160
|
end
|
|
159
161
|
end
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
class <%= @model_name %>
|
|
2
|
+
include Dynamoid::Document
|
|
3
|
+
attr_accessor :password, :password_confirmation
|
|
4
|
+
|
|
5
|
+
# Fields
|
|
6
|
+
field :name
|
|
7
|
+
field :surname
|
|
8
|
+
field :email
|
|
9
|
+
field :crypted_password
|
|
10
|
+
field :role
|
|
11
|
+
|
|
12
|
+
# Validations
|
|
13
|
+
validates_presence_of :email, :role
|
|
14
|
+
validates_presence_of :password, :if => :password_required
|
|
15
|
+
validates_presence_of :password_confirmation, :if => :password_required
|
|
16
|
+
validates_length_of :password, :within => 4..40, :if => :password_required
|
|
17
|
+
validates_confirmation_of :password, :if => :password_required
|
|
18
|
+
validates_length_of :email, :within => 3..100
|
|
19
|
+
validates_format_of :email, :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i
|
|
20
|
+
validates_format_of :role, :with => /[A-Za-z]/
|
|
21
|
+
|
|
22
|
+
# Callbacks
|
|
23
|
+
before_save :encrypt_password, :if => :password_required
|
|
24
|
+
|
|
25
|
+
##
|
|
26
|
+
# This method is for authentication purpose.
|
|
27
|
+
#
|
|
28
|
+
def self.authenticate(email, password)
|
|
29
|
+
account = find_by_email(email) if email.present?
|
|
30
|
+
account && account.has_password?(password) ? account : nil
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
##
|
|
34
|
+
# This method is used by AuthenticationHelper.
|
|
35
|
+
#
|
|
36
|
+
def self.find_by_id(id, options = {})
|
|
37
|
+
id ? super(id, options) : nil
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def has_password?(password)
|
|
41
|
+
::BCrypt::Password.new(crypted_password) == password
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
private
|
|
45
|
+
|
|
46
|
+
def encrypt_password
|
|
47
|
+
value = ::BCrypt::Password.create(password)
|
|
48
|
+
value = value.force_encoding(Encoding::UTF_8) if value.encoding == Encoding::ASCII_8BIT
|
|
49
|
+
self.crypted_password = value
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def password_required
|
|
53
|
+
crypted_password.blank? || password.present?
|
|
54
|
+
end
|
|
55
|
+
end
|
|
@@ -209,6 +209,12 @@ footer p {
|
|
|
209
209
|
font-size: 2.5em;
|
|
210
210
|
line-height: 1em;
|
|
211
211
|
}
|
|
212
|
+
.navbar .navbar-nav > .active > a,
|
|
213
|
+
.navbar .navbar-nav > .active > a:hover,
|
|
214
|
+
.navbar .navbar-nav > .active > a:focus {
|
|
215
|
+
color: #555;
|
|
216
|
+
background-color: #e7e7e7;
|
|
217
|
+
}
|
|
212
218
|
/* --- End Application::TopBar --- */
|
|
213
219
|
|
|
214
220
|
/* --- Begin Application::List --- */
|
|
@@ -2,7 +2,7 @@ require File.expand_path(File.dirname(__FILE__) + '/../helper')
|
|
|
2
2
|
|
|
3
3
|
describe "AccountModelGenerator" do
|
|
4
4
|
before do
|
|
5
|
-
@apptmp = "#{Dir.tmpdir}/padrino-tests/#{
|
|
5
|
+
@apptmp = "#{Dir.tmpdir}/padrino-tests/#{SecureRandom.hex}"
|
|
6
6
|
%x[mkdir -p #{@apptmp}]
|
|
7
7
|
end
|
|
8
8
|
|
|
@@ -2,7 +2,7 @@ require File.expand_path(File.dirname(__FILE__) + '/../helper')
|
|
|
2
2
|
|
|
3
3
|
describe "AdminAppGenerator" do
|
|
4
4
|
before do
|
|
5
|
-
@apptmp = "#{Dir.tmpdir}/padrino-tests/#{
|
|
5
|
+
@apptmp = "#{Dir.tmpdir}/padrino-tests/#{SecureRandom.hex}"
|
|
6
6
|
`mkdir -p #{@apptmp}`
|
|
7
7
|
end
|
|
8
8
|
|
|
@@ -11,6 +11,12 @@ describe "AdminAppGenerator" do
|
|
|
11
11
|
end
|
|
12
12
|
|
|
13
13
|
describe 'the admin app generator' do
|
|
14
|
+
before do
|
|
15
|
+
# Account gets created by Datamapper's migration and then gets
|
|
16
|
+
# rejected by model generator as already defined
|
|
17
|
+
Object.send(:remove_const, :Account) if defined?(Account)
|
|
18
|
+
end
|
|
19
|
+
|
|
14
20
|
it 'should fail outside app root' do
|
|
15
21
|
out, err = capture_io { generate(:admin_app, "-r=#{@apptmp}") }
|
|
16
22
|
assert_match(/not at the root/, out)
|
data/test/helper.rb
CHANGED
|
@@ -2,12 +2,12 @@ ENV['RACK_ENV'] = 'test'
|
|
|
2
2
|
PADRINO_ROOT = File.dirname(__FILE__) unless defined? PADRINO_ROOT
|
|
3
3
|
|
|
4
4
|
require File.expand_path('../../../load_paths', __FILE__)
|
|
5
|
-
require
|
|
5
|
+
require 'minitest/autorun'
|
|
6
|
+
require 'minitest/pride'
|
|
7
|
+
require 'mocha/setup'
|
|
6
8
|
require 'rack/test'
|
|
7
9
|
require 'rack'
|
|
8
|
-
require 'uuid'
|
|
9
10
|
require 'thor/group'
|
|
10
|
-
require 'padrino-core/support_lite' unless defined?(SupportLite)
|
|
11
11
|
require 'padrino-admin'
|
|
12
12
|
require 'dm-core'
|
|
13
13
|
require 'dm-migrations'
|
|
@@ -25,11 +25,6 @@ module Kernel
|
|
|
25
25
|
end
|
|
26
26
|
end
|
|
27
27
|
|
|
28
|
-
class Class
|
|
29
|
-
# Allow assertions in request context
|
|
30
|
-
include MiniTest::Assertions
|
|
31
|
-
end
|
|
32
|
-
|
|
33
28
|
class MiniTest::Spec
|
|
34
29
|
include Rack::Test::Methods
|
|
35
30
|
|
|
@@ -38,7 +33,6 @@ class MiniTest::Spec
|
|
|
38
33
|
# the application.
|
|
39
34
|
def mock_app(base=Padrino::Application, &block)
|
|
40
35
|
@app = Sinatra.new(base, &block)
|
|
41
|
-
@app.send :include, MiniTest::Assertions
|
|
42
36
|
@app.register Padrino::Helpers
|
|
43
37
|
end
|
|
44
38
|
|
|
@@ -67,7 +61,7 @@ class MiniTest::Spec
|
|
|
67
61
|
end
|
|
68
62
|
|
|
69
63
|
def assert_no_match_in_file(pattern, file)
|
|
70
|
-
File.exist?(file) ?
|
|
64
|
+
File.exist?(file) ? refute_match(pattern, File.read(file)) : assert_file_exists(file)
|
|
71
65
|
end
|
|
72
66
|
|
|
73
67
|
# Delegate other missing methods to response.
|
|
@@ -108,16 +108,6 @@ describe "AdminApplication" do
|
|
|
108
108
|
role.project_module :posts, "/posts"
|
|
109
109
|
end
|
|
110
110
|
|
|
111
|
-
assert access_control.allowed?(Account.admin, "/login")
|
|
112
|
-
assert access_control.allowed?(Account.admin, "/any")
|
|
113
|
-
assert access_control.allowed?(Account.admin, "/settings")
|
|
114
|
-
assert ! access_control.allowed?(Account.admin, "/posts")
|
|
115
|
-
|
|
116
|
-
assert access_control.allowed?(Account.editor, "/login")
|
|
117
|
-
assert access_control.allowed?(Account.editor, "/any")
|
|
118
|
-
assert ! access_control.allowed?(Account.editor, "/settings")
|
|
119
|
-
assert access_control.allowed?(Account.editor, "/posts")
|
|
120
|
-
|
|
121
111
|
# Prepare a basic page
|
|
122
112
|
get "/login(/:role)" do
|
|
123
113
|
set_current_account(Account.send(params[:role])) if params[:role]
|
|
@@ -129,6 +119,16 @@ describe "AdminApplication" do
|
|
|
129
119
|
get "/posts" do; "posts"; end
|
|
130
120
|
end
|
|
131
121
|
|
|
122
|
+
assert @app.access_control.allowed?(Account.admin, "/login")
|
|
123
|
+
assert @app.access_control.allowed?(Account.admin, "/any")
|
|
124
|
+
assert @app.access_control.allowed?(Account.admin, "/settings")
|
|
125
|
+
assert ! @app.access_control.allowed?(Account.admin, "/posts")
|
|
126
|
+
|
|
127
|
+
assert @app.access_control.allowed?(Account.editor, "/login")
|
|
128
|
+
assert @app.access_control.allowed?(Account.editor, "/any")
|
|
129
|
+
assert ! @app.access_control.allowed?(Account.editor, "/settings")
|
|
130
|
+
assert @app.access_control.allowed?(Account.editor, "/posts")
|
|
131
|
+
|
|
132
132
|
get "/login"
|
|
133
133
|
assert_equal "logged as any", body
|
|
134
134
|
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: padrino-admin
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.12.
|
|
4
|
+
version: 0.12.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Padrino Team
|
|
@@ -11,7 +11,7 @@ authors:
|
|
|
11
11
|
autorequire:
|
|
12
12
|
bindir: bin
|
|
13
13
|
cert_chain: []
|
|
14
|
-
date: 2014-
|
|
14
|
+
date: 2014-04-04 00:00:00.000000000 Z
|
|
15
15
|
dependencies:
|
|
16
16
|
- !ruby/object:Gem::Dependency
|
|
17
17
|
name: padrino-core
|
|
@@ -19,28 +19,28 @@ dependencies:
|
|
|
19
19
|
requirements:
|
|
20
20
|
- - '='
|
|
21
21
|
- !ruby/object:Gem::Version
|
|
22
|
-
version: 0.12.
|
|
22
|
+
version: 0.12.1
|
|
23
23
|
type: :runtime
|
|
24
24
|
prerelease: false
|
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
|
26
26
|
requirements:
|
|
27
27
|
- - '='
|
|
28
28
|
- !ruby/object:Gem::Version
|
|
29
|
-
version: 0.12.
|
|
29
|
+
version: 0.12.1
|
|
30
30
|
- !ruby/object:Gem::Dependency
|
|
31
31
|
name: padrino-helpers
|
|
32
32
|
requirement: !ruby/object:Gem::Requirement
|
|
33
33
|
requirements:
|
|
34
34
|
- - '='
|
|
35
35
|
- !ruby/object:Gem::Version
|
|
36
|
-
version: 0.12.
|
|
36
|
+
version: 0.12.1
|
|
37
37
|
type: :runtime
|
|
38
38
|
prerelease: false
|
|
39
39
|
version_requirements: !ruby/object:Gem::Requirement
|
|
40
40
|
requirements:
|
|
41
41
|
- - '='
|
|
42
42
|
- !ruby/object:Gem::Version
|
|
43
|
-
version: 0.12.
|
|
43
|
+
version: 0.12.1
|
|
44
44
|
- !ruby/object:Gem::Dependency
|
|
45
45
|
name: therubyracer
|
|
46
46
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -144,6 +144,7 @@ files:
|
|
|
144
144
|
- lib/padrino-admin/generators/templates/account/activerecord.rb.tt
|
|
145
145
|
- lib/padrino-admin/generators/templates/account/couchrest.rb.tt
|
|
146
146
|
- lib/padrino-admin/generators/templates/account/datamapper.rb.tt
|
|
147
|
+
- lib/padrino-admin/generators/templates/account/dynamoid.rb.tt
|
|
147
148
|
- lib/padrino-admin/generators/templates/account/minirecord.rb.tt
|
|
148
149
|
- lib/padrino-admin/generators/templates/account/mongoid.rb.tt
|
|
149
150
|
- lib/padrino-admin/generators/templates/account/mongomapper.rb.tt
|