padrino-admin 0.16.2 → 0.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.rdoc +3 -3
- data/Rakefile +0 -21
- data/lib/padrino-admin/access_control.rb +17 -4
- data/lib/padrino-admin/generators/actions.rb +1 -1
- data/lib/padrino-admin/generators/admin_app.rb +9 -11
- data/lib/padrino-admin/generators/admin_page.rb +12 -2
- data/lib/padrino-admin/generators/orm.rb +30 -47
- data/lib/padrino-admin/generators/templates/account/seeds.rb.tt +7 -2
- data/lib/padrino-admin/generators/templates/app/controllers/sessions.rb.tt +0 -4
- data/lib/padrino-admin/generators/templates/app.rb.tt +4 -1
- data/lib/padrino-admin/generators/templates/assets/javascripts/bootstrap/affix.js +63 -36
- data/lib/padrino-admin/generators/templates/assets/javascripts/bootstrap/alert.js +18 -11
- data/lib/padrino-admin/generators/templates/assets/javascripts/bootstrap/bootstrap.min.js +4 -4
- data/lib/padrino-admin/generators/templates/assets/javascripts/bootstrap/button.js +41 -23
- data/lib/padrino-admin/generators/templates/assets/javascripts/bootstrap/carousel.js +90 -49
- data/lib/padrino-admin/generators/templates/assets/javascripts/bootstrap/collapse.js +86 -44
- data/lib/padrino-admin/generators/templates/assets/javascripts/bootstrap/dropdown.js +66 -48
- data/lib/padrino-admin/generators/templates/assets/javascripts/bootstrap/modal.js +167 -52
- data/lib/padrino-admin/generators/templates/assets/javascripts/bootstrap/popover.js +33 -20
- data/lib/padrino-admin/generators/templates/assets/javascripts/bootstrap/scrollspy.js +58 -39
- data/lib/padrino-admin/generators/templates/assets/javascripts/bootstrap/tab.js +55 -25
- data/lib/padrino-admin/generators/templates/assets/javascripts/bootstrap/tooltip.js +370 -92
- data/lib/padrino-admin/generators/templates/assets/javascripts/bootstrap/transition.js +22 -11
- data/lib/padrino-admin/generators/templates/assets/javascripts/jquery-3.7.1.min.js +2 -0
- data/lib/padrino-admin/generators/templates/assets/stylesheets/application.css +14 -0
- data/lib/padrino-admin/generators/templates/assets/stylesheets/bootstrap.css +6 -4
- data/lib/padrino-admin/generators/templates/erb/app/base/index.erb.tt +1 -1
- data/lib/padrino-admin/generators/templates/erb/app/layouts/application.erb.tt +1 -1
- data/lib/padrino-admin/generators/templates/erb/app/sessions/new.erb.tt +1 -1
- data/lib/padrino-admin/generators/templates/erb/page/index.erb.tt +2 -2
- data/lib/padrino-admin/generators/templates/haml/app/base/index.haml.tt +1 -1
- data/lib/padrino-admin/generators/templates/haml/app/layouts/application.haml.tt +1 -1
- data/lib/padrino-admin/generators/templates/haml/app/sessions/new.haml.tt +1 -1
- data/lib/padrino-admin/generators/templates/slim/app/base/index.slim.tt +1 -1
- data/lib/padrino-admin/generators/templates/slim/app/layouts/application.slim.tt +1 -1
- data/lib/padrino-admin/generators/templates/slim/app/sessions/new.slim.tt +1 -1
- data/lib/padrino-admin/generators/templates/slim/page/index.slim.tt +2 -2
- data/lib/padrino-admin/helpers/authentication_helpers.rb +1 -1
- data/lib/padrino-admin/helpers/view_helpers.rb +3 -3
- data/lib/padrino-admin/locale/orm/pl.yml +0 -11
- data/lib/padrino-admin.rb +1 -1
- data/padrino-admin.gemspec +0 -2
- data/test/generators/test_account_model_generator.rb +1 -60
- data/test/generators/test_admin_app_generator.rb +159 -25
- data/test/generators/test_admin_page_generator.rb +110 -9
- data/test/test_admin_application.rb +123 -0
- metadata +9 -124
- data/lib/padrino-admin/bootstrap-less/alerts.less +0 -67
- data/lib/padrino-admin/bootstrap-less/badges.less +0 -55
- data/lib/padrino-admin/bootstrap-less/bootstrap.less +0 -49
- data/lib/padrino-admin/bootstrap-less/breadcrumbs.less +0 -26
- data/lib/padrino-admin/bootstrap-less/button-groups.less +0 -226
- data/lib/padrino-admin/bootstrap-less/buttons.less +0 -155
- data/lib/padrino-admin/bootstrap-less/carousel.less +0 -232
- data/lib/padrino-admin/bootstrap-less/close.less +0 -33
- data/lib/padrino-admin/bootstrap-less/code.less +0 -63
- data/lib/padrino-admin/bootstrap-less/component-animations.less +0 -29
- data/lib/padrino-admin/bootstrap-less/dropdowns.less +0 -213
- data/lib/padrino-admin/bootstrap-less/font-awesome/bordered-pulled.less +0 -16
- data/lib/padrino-admin/bootstrap-less/font-awesome/core.less +0 -12
- data/lib/padrino-admin/bootstrap-less/font-awesome/fixed-width.less +0 -6
- data/lib/padrino-admin/bootstrap-less/font-awesome/font-awesome.less +0 -17
- data/lib/padrino-admin/bootstrap-less/font-awesome/icons.less +0 -412
- data/lib/padrino-admin/bootstrap-less/font-awesome/larger.less +0 -13
- data/lib/padrino-admin/bootstrap-less/font-awesome/list.less +0 -19
- data/lib/padrino-admin/bootstrap-less/font-awesome/mixins.less +0 -20
- data/lib/padrino-admin/bootstrap-less/font-awesome/path.less +0 -14
- data/lib/padrino-admin/bootstrap-less/font-awesome/rotated-flipped.less +0 -9
- data/lib/padrino-admin/bootstrap-less/font-awesome/spinning.less +0 -30
- data/lib/padrino-admin/bootstrap-less/font-awesome/stacked.less +0 -20
- data/lib/padrino-admin/bootstrap-less/font-awesome/variables.less +0 -381
- data/lib/padrino-admin/bootstrap-less/forms.less +0 -419
- data/lib/padrino-admin/bootstrap-less/glyphicons.less +0 -233
- data/lib/padrino-admin/bootstrap-less/grid.less +0 -100
- data/lib/padrino-admin/bootstrap-less/input-groups.less +0 -157
- data/lib/padrino-admin/bootstrap-less/jumbotron.less +0 -44
- data/lib/padrino-admin/bootstrap-less/labels.less +0 -64
- data/lib/padrino-admin/bootstrap-less/list-group.less +0 -110
- data/lib/padrino-admin/bootstrap-less/media.less +0 -56
- data/lib/padrino-admin/bootstrap-less/mixins.less +0 -926
- data/lib/padrino-admin/bootstrap-less/modals.less +0 -138
- data/lib/padrino-admin/bootstrap-less/navbar.less +0 -616
- data/lib/padrino-admin/bootstrap-less/navs.less +0 -242
- data/lib/padrino-admin/bootstrap-less/normalize.less +0 -423
- data/lib/padrino-admin/bootstrap-less/padrino-admin.less +0 -18
- data/lib/padrino-admin/bootstrap-less/pager.less +0 -55
- data/lib/padrino-admin/bootstrap-less/pagination.less +0 -88
- data/lib/padrino-admin/bootstrap-less/panels.less +0 -230
- data/lib/padrino-admin/bootstrap-less/popovers.less +0 -133
- data/lib/padrino-admin/bootstrap-less/print.less +0 -101
- data/lib/padrino-admin/bootstrap-less/progress-bars.less +0 -80
- data/lib/padrino-admin/bootstrap-less/responsive-utilities.less +0 -93
- data/lib/padrino-admin/bootstrap-less/scaffolding.less +0 -134
- data/lib/padrino-admin/bootstrap-less/tables.less +0 -233
- data/lib/padrino-admin/bootstrap-less/theme.less +0 -247
- data/lib/padrino-admin/bootstrap-less/thumbnails.less +0 -36
- data/lib/padrino-admin/bootstrap-less/tooltip.less +0 -95
- data/lib/padrino-admin/bootstrap-less/type.less +0 -296
- data/lib/padrino-admin/bootstrap-less/utilities.less +0 -56
- data/lib/padrino-admin/bootstrap-less/variables.less +0 -827
- data/lib/padrino-admin/bootstrap-less/wells.less +0 -29
- data/lib/padrino-admin/generators/templates/account/couchrest.rb.tt +0 -67
- data/lib/padrino-admin/generators/templates/account/datamapper.rb.tt +0 -61
- data/lib/padrino-admin/generators/templates/account/dynamoid.rb.tt +0 -55
- data/lib/padrino-admin/generators/templates/account/minirecord.rb.tt +0 -44
- data/lib/padrino-admin/generators/templates/account/mongomapper.rb.tt +0 -47
- data/lib/padrino-admin/generators/templates/account/ohm.rb.tt +0 -70
- data/lib/padrino-admin/generators/templates/assets/javascripts/jquery-1.11.0.min.js +0 -4
- data/lib/padrino-admin/locale/orm/cs.yml +0 -12
- data/lib/padrino-admin/locale/orm/da.yml +0 -12
- data/lib/padrino-admin/locale/orm/de.yml +0 -12
- data/lib/padrino-admin/locale/orm/en.yml +0 -12
- data/lib/padrino-admin/locale/orm/es.yml +0 -12
- data/lib/padrino-admin/locale/orm/fr.yml +0 -12
- data/lib/padrino-admin/locale/orm/hu.yml +0 -12
- data/lib/padrino-admin/locale/orm/it.yml +0 -12
- data/lib/padrino-admin/locale/orm/ja.yml +0 -12
- data/lib/padrino-admin/locale/orm/lv.yml +0 -12
- data/lib/padrino-admin/locale/orm/nl.yml +0 -12
- data/lib/padrino-admin/locale/orm/no.yml +0 -12
- data/lib/padrino-admin/locale/orm/pt_br.yml +0 -12
- data/lib/padrino-admin/locale/orm/ro.yml +0 -12
- data/lib/padrino-admin/locale/orm/ru.yml +0 -12
- data/lib/padrino-admin/locale/orm/sv.yml +0 -12
- data/lib/padrino-admin/locale/orm/tr.yml +0 -12
- data/lib/padrino-admin/locale/orm/uk.yml +0 -12
- data/lib/padrino-admin/locale/orm/zh_cn.yml +0 -12
- data/lib/padrino-admin/locale/orm/zh_tw.yml +0 -12
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
<div class=base-icons>
|
|
8
8
|
<div class=btn-group>
|
|
9
|
-
<div class="btn btn-primary" title="Adapters for
|
|
9
|
+
<div class="btn btn-primary" title="Adapters for activerecord, sequel, mongoid"><%%= tag_icon("cogs fa-2x", "Orm Agnostic") %></div>
|
|
10
10
|
<div class="btn btn-success" title="User Authentication Support, User Authorization Management"><%%= tag_icon("group fa-2x", "Authentication") %></div>
|
|
11
11
|
<div class="btn btn-info" title="Erb, Haml, Slim Rendering Support"><%%= tag_icon("tasks fa-2x", "Template Agnostic") %></div>
|
|
12
12
|
<div class="btn btn-warning" title="English, German, Russian, Danish, French, Brazilian and Italian localizations and many more!.."><%%= tag_icon("flag fa-2x", "Multi Language") %></div>
|
|
@@ -60,6 +60,6 @@
|
|
|
60
60
|
</div>
|
|
61
61
|
</footer>
|
|
62
62
|
|
|
63
|
-
<%%= javascript_include_tag 'jquery-
|
|
63
|
+
<%%= javascript_include_tag 'jquery-3.7.1.min', (Padrino.env == :production ? 'bootstrap/bootstrap.min' : %w[bootstrap/affix bootstrap/alert bootstrap/button bootstrap/carousel bootstrap/collapse bootstrap/dropdown bootstrap/tooltip bootstrap/transition bootstrap/modal bootstrap/popover bootstrap/scrollspy bootstrap/tab]), :application %>
|
|
64
64
|
</body>
|
|
65
65
|
</html>
|
|
@@ -40,6 +40,6 @@
|
|
|
40
40
|
</div>
|
|
41
41
|
<div class="login-footer modal-footer"><%%= submit_tag(pat('login.sign_in'), class: 'btn btn-primary pull-right') %></div>
|
|
42
42
|
<%% end %>
|
|
43
|
-
<%%= javascript_include_tag 'jquery-
|
|
43
|
+
<%%= javascript_include_tag 'jquery-3.7.1.min', (Padrino.env == :production ? 'bootstrap/bootstrap.min' : %w[bootstrap/affix bootstrap/alert bootstrap/button bootstrap/carousel bootstrap/collapse bootstrap/dropdown bootstrap/tooltip bootstrap/transition bootstrap/modal bootstrap/popover bootstrap/scrollspy bootstrap/tab]), :application %>
|
|
44
44
|
</body>
|
|
45
45
|
</html>
|
|
@@ -15,11 +15,11 @@
|
|
|
15
15
|
<li class=list-menu-wrapper>
|
|
16
16
|
<%%= link_to tag_icon('check-square-o', pat(:select_all)), '#', id: 'select-all', class: 'list-menu-link' %>
|
|
17
17
|
</li>
|
|
18
|
-
<li class=list-menu-wrapper
|
|
18
|
+
<li class="list-menu-wrapper list-menu-wrapper-disabled">
|
|
19
19
|
<%%= link_to tag_icon('square-o', pat(:deselect_all)), '#', id: 'deselect-all', class: 'list-menu-link list-menu-link-disabled' %>
|
|
20
20
|
</li>
|
|
21
21
|
<li class="list-menu-divider divider"></li>
|
|
22
|
-
<li class=list-menu-wrapper
|
|
22
|
+
<li class="list-menu-wrapper list-menu-wrapper-disabled">
|
|
23
23
|
<%%=link_to tag_icon('trash-o', pat(:delete_selected)), '#', id: 'delete-selected', class: 'list-menu-link list-menu-link-disabled' %>
|
|
24
24
|
<div class='list-menu-popover-delete-selected popover right'>
|
|
25
25
|
<div class=arrow></div>
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
.base-icons
|
|
7
7
|
.btn-group
|
|
8
|
-
.btn.btn-primary{title: 'Adapters for
|
|
8
|
+
.btn.btn-primary{title: 'Adapters for activerecord, sequel, mongoid'}
|
|
9
9
|
= tag_icon('cogs fa-2x', 'Orm Agnostic')
|
|
10
10
|
.btn.btn-success{title: 'User Authentication Support, User Authorization Management'}
|
|
11
11
|
= tag_icon('group fa-2x', 'Authentication')
|
|
@@ -46,4 +46,4 @@
|
|
|
46
46
|
%li= link_to tag_icon(:github, 'code'), 'https://github.com/padrino/padrino-framework', target: :_blank, class: 'footer-links-link'
|
|
47
47
|
%li= link_to tag_icon(:twitter, 'twitter'), 'http://twitter.com/padrinorb', target: :_blank, class: 'footer-links-link'
|
|
48
48
|
|
|
49
|
-
=javascript_include_tag 'jquery-
|
|
49
|
+
=javascript_include_tag 'jquery-3.7.1.min', (Padrino.env == :production ? 'bootstrap/bootstrap.min' : %w[bootstrap/affix bootstrap/alert bootstrap/button bootstrap/carousel bootstrap/collapse bootstrap/dropdown bootstrap/tooltip bootstrap/transition bootstrap/modal bootstrap/popover bootstrap/scrollspy bootstrap/tab]), :application
|
|
@@ -35,5 +35,5 @@
|
|
|
35
35
|
.login-footer.modal-footer
|
|
36
36
|
= submit_tag(pat('login.sign_in'), class: 'btn btn-primary pull-right')
|
|
37
37
|
|
|
38
|
-
=javascript_include_tag 'jquery-
|
|
38
|
+
=javascript_include_tag 'jquery-3.7.1.min', (Padrino.env == :production ? 'bootstrap/bootstrap.min' : %w[bootstrap/affix bootstrap/alert bootstrap/button bootstrap/carousel bootstrap/collapse bootstrap/dropdown bootstrap/tooltip bootstrap/transition bootstrap/modal bootstrap/popover bootstrap/scrollspy bootstrap/tab]), :application
|
|
39
39
|
|
|
@@ -5,7 +5,7 @@ div class="base-text"
|
|
|
5
5
|
|
|
6
6
|
div class="base-icons"
|
|
7
7
|
div class="btn-group"
|
|
8
|
-
div class="btn btn-primary" title="Adapters for
|
|
8
|
+
div class="btn btn-primary" title="Adapters for activerecord, sequel, mongoid" = tag_icon("cogs fa-2x", "Orm Agnostic")
|
|
9
9
|
div class="btn btn-success" title="User Authentication Support, User Authorization Management" = tag_icon("group fa-2x", "Authentication")
|
|
10
10
|
div class="btn btn-info" title="Erb, Haml, Slim Rendering Support" = tag_icon("tasks fa-2x", "Template Agnostic")
|
|
11
11
|
div class="btn btn-warning" title="English, German, Russian, Danish, French, Brazilian and Italian localizations" = tag_icon("flag fa-2x", "Multi Language")
|
|
@@ -46,4 +46,4 @@ html lang='en'
|
|
|
46
46
|
li = link_to tag_icon(:github, 'code'), 'https://github.com/padrino/padrino-framework', target: :_blank, class: 'footer-links-link'
|
|
47
47
|
li = link_to tag_icon(:twitter, 'twitter'), 'http://twitter.com/padrinorb', target: :_blank, class: 'footer-links-link'
|
|
48
48
|
|
|
49
|
-
= javascript_include_tag 'jquery-
|
|
49
|
+
= javascript_include_tag 'jquery-3.7.1.min', (Padrino.env == :production ? 'bootstrap/bootstrap.min' : %w[bootstrap/affix bootstrap/alert bootstrap/button bootstrap/carousel bootstrap/collapse bootstrap/dropdown bootstrap/tooltip bootstrap/transition bootstrap/modal bootstrap/popover bootstrap/scrollspy bootstrap/tab]), :application
|
|
@@ -34,4 +34,4 @@ html lang="en" xmlns="http://www.w3.org/1999/xhtml"
|
|
|
34
34
|
|
|
35
35
|
div class="login-footer modal-footer"
|
|
36
36
|
= submit_tag(pat('login.sign_in'), class: 'btn btn-primary pull-right')
|
|
37
|
-
= javascript_include_tag 'jquery-
|
|
37
|
+
= javascript_include_tag 'jquery-3.7.1.min', (Padrino.env == :production ? 'bootstrap/bootstrap.min' : %w[bootstrap/affix bootstrap/alert bootstrap/button bootstrap/carousel bootstrap/collapse bootstrap/dropdown bootstrap/tooltip bootstrap/transition bootstrap/modal bootstrap/popover bootstrap/scrollspy bootstrap/tab]), :application
|
|
@@ -8,10 +8,10 @@ div class="tabs-content"
|
|
|
8
8
|
tr
|
|
9
9
|
th class='header list-menu'
|
|
10
10
|
div class='dropdown'
|
|
11
|
-
a href='#' class='list-menu-toggle
|
|
11
|
+
a href='#' class='list-menu-toggle dropdown-toggle' data-toggle='dropdown'
|
|
12
12
|
= tag_icon :magic
|
|
13
13
|
span class='caret'
|
|
14
|
-
ul class='list-menu dropdown-menu' role='
|
|
14
|
+
ul class='list-menu dropdown-menu' role='menu'
|
|
15
15
|
li class='list-menu-wrapper' = link_to tag_icon('check-square-o', pat(:select_all)), '#', id: 'select-all', class: 'list-menu-link'
|
|
16
16
|
li class='list-menu-wrapper list-menu-wrapper-disabled' = link_to tag_icon('square-o', pat(:deselect_all)), '#', id: 'deselect-all', class: 'list-menu-link list-menu-link-disabled'
|
|
17
17
|
li class='list-menu-divider divider'
|
|
@@ -98,7 +98,7 @@ module Padrino
|
|
|
98
98
|
end
|
|
99
99
|
|
|
100
100
|
def admin_model_obj
|
|
101
|
-
@_admin_model_obj ||= settings.admin_model
|
|
101
|
+
@_admin_model_obj ||= Padrino::Inflections.constantize(settings.admin_model)
|
|
102
102
|
rescue NameError
|
|
103
103
|
raise Padrino::Admin::AccessControlError, "You must define an #{settings.admin_model} Model"
|
|
104
104
|
end
|
|
@@ -40,7 +40,7 @@ module Padrino
|
|
|
40
40
|
#
|
|
41
41
|
def padrino_admin_translate(word, *args)
|
|
42
42
|
options = args.last.is_a?(Hash) ? args.pop : {}
|
|
43
|
-
options[:default] ||=
|
|
43
|
+
options[:default] ||= Padrino::Inflections.humanize(word)
|
|
44
44
|
t("padrino.admin.#{word}", options)
|
|
45
45
|
end
|
|
46
46
|
alias pat padrino_admin_translate
|
|
@@ -60,7 +60,7 @@ module Padrino
|
|
|
60
60
|
# mat(:account, :email)
|
|
61
61
|
#
|
|
62
62
|
def model_attribute_translate(model, attribute)
|
|
63
|
-
t("models.#{model}.attributes.#{attribute}", default:
|
|
63
|
+
t("models.#{model}.attributes.#{attribute}", default: Padrino::Inflections.humanize(attribute))
|
|
64
64
|
end
|
|
65
65
|
alias t_attr model_attribute_translate
|
|
66
66
|
alias mat t_attr
|
|
@@ -78,7 +78,7 @@ module Padrino
|
|
|
78
78
|
# mt(:account)
|
|
79
79
|
#
|
|
80
80
|
def model_translate(model)
|
|
81
|
-
t("models.#{model}.name", default:
|
|
81
|
+
t("models.#{model}.name", default: Padrino::Inflections.humanize(model))
|
|
82
82
|
end
|
|
83
83
|
alias mt model_translate
|
|
84
84
|
end
|
|
@@ -25,14 +25,3 @@ pl:
|
|
|
25
25
|
record_invalid: "Negatywne sprawdzenie poprawności: %{errors}"
|
|
26
26
|
content_type: "nieodozwolony format pliku"
|
|
27
27
|
activerecord: *activemodel
|
|
28
|
-
ohm:
|
|
29
|
-
errors:
|
|
30
|
-
messages:
|
|
31
|
-
format: "jest nieprawidłowe"
|
|
32
|
-
not_present: "nie może być puste"
|
|
33
|
-
not_numeric: "nie jest liczbą"
|
|
34
|
-
not_url: "jest nieprawidłowe"
|
|
35
|
-
not_email: "jest nieprawidłowe"
|
|
36
|
-
not_valid: "nie znajduje się na liście dopuszczalnych wartości"
|
|
37
|
-
not_in_range: "nie znajduje się na liście dopuszczalnych wartości"
|
|
38
|
-
not_decimal: "jest nieprawidłowe"
|
data/lib/padrino-admin.rb
CHANGED
|
@@ -8,7 +8,7 @@ module Padrino
|
|
|
8
8
|
##
|
|
9
9
|
# Padrino::Admin is beautiful Ajax Admin, with these features:
|
|
10
10
|
#
|
|
11
|
-
# Orm Agnostic:: Adapters for
|
|
11
|
+
# Orm Agnostic:: Adapters for activerecord, sequel and mongoid
|
|
12
12
|
# Authentication:: Support for Account authentication, Account Permission management
|
|
13
13
|
# Scaffold:: You can simply create a new "admin interface" simply providing a Model
|
|
14
14
|
# Ajax Uploads:: You can upload file, manage them and attach them to any model in a quick and simple way (coming soon)
|
data/padrino-admin.gemspec
CHANGED
|
@@ -7,7 +7,7 @@ describe 'AccountModelGenerator' do
|
|
|
7
7
|
end
|
|
8
8
|
|
|
9
9
|
after do
|
|
10
|
-
|
|
10
|
+
`rm -rf #{@apptmp}`
|
|
11
11
|
end
|
|
12
12
|
|
|
13
13
|
describe 'activerecord' do
|
|
@@ -22,30 +22,6 @@ describe 'AccountModelGenerator' do
|
|
|
22
22
|
end
|
|
23
23
|
end
|
|
24
24
|
|
|
25
|
-
describe 'minirecord' do
|
|
26
|
-
before do
|
|
27
|
-
capture_io { generate(:project, 'sample_project', '-e=slim', "--root=#{@apptmp}", '-d=minirecord') }
|
|
28
|
-
capture_io { generate(:admin_app, "--root=#{@apptmp}/sample_project") }
|
|
29
|
-
@model = "#{@apptmp}/sample_project/models/account.rb"
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
it 'should be an activerecord model instance' do
|
|
33
|
-
assert_match_in_file(/class Account < ActiveRecord::Base/m, @model)
|
|
34
|
-
end
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
describe 'datamapper' do
|
|
38
|
-
before do
|
|
39
|
-
capture_io { generate(:project, 'sample_project', '-e=slim', "--root=#{@apptmp}", '-d=datamapper') }
|
|
40
|
-
capture_io { generate(:admin_app, "--root=#{@apptmp}/sample_project") }
|
|
41
|
-
@model = "#{@apptmp}/sample_project/models/account.rb"
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
it 'should include the datamapper resource' do
|
|
45
|
-
assert_match_in_file(/include DataMapper::Resource/m, @model)
|
|
46
|
-
end
|
|
47
|
-
end
|
|
48
|
-
|
|
49
25
|
describe 'mongoid' do
|
|
50
26
|
before do
|
|
51
27
|
capture_io { generate(:project, 'sample_project', '-e=slim', "--root=#{@apptmp}", '-d=mongoid') }
|
|
@@ -58,30 +34,6 @@ describe 'AccountModelGenerator' do
|
|
|
58
34
|
end
|
|
59
35
|
end
|
|
60
36
|
|
|
61
|
-
describe 'mongomapper' do
|
|
62
|
-
before do
|
|
63
|
-
capture_io { generate(:project, 'sample_project', '-e=slim', "--root=#{@apptmp}", '-d=mongomapper') }
|
|
64
|
-
capture_io { generate(:admin_app, "--root=#{@apptmp}/sample_project") }
|
|
65
|
-
@model = "#{@apptmp}/sample_project/models/account.rb"
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
it 'should include the mongomapper document' do
|
|
69
|
-
assert_match_in_file(/include MongoMapper::Document/m, @model)
|
|
70
|
-
end
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
describe 'ohm' do
|
|
74
|
-
before do
|
|
75
|
-
capture_io { generate(:project, 'sample_project', '-e=slim', "--root=#{@apptmp}", '-d=ohm') }
|
|
76
|
-
capture_io { generate(:admin_app, "--root=#{@apptmp}/sample_project") }
|
|
77
|
-
@model = "#{@apptmp}/sample_project/models/account.rb"
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
it 'should be an ohm model instance' do
|
|
81
|
-
assert_match_in_file(/class Account < Ohm::Model/m, @model)
|
|
82
|
-
end
|
|
83
|
-
end
|
|
84
|
-
|
|
85
37
|
describe 'sequel' do
|
|
86
38
|
before do
|
|
87
39
|
capture_io { generate(:project, 'sample_project', '-e=slim', "--root=#{@apptmp}", '-d=sequel') }
|
|
@@ -94,15 +46,4 @@ describe 'AccountModelGenerator' do
|
|
|
94
46
|
end
|
|
95
47
|
end
|
|
96
48
|
|
|
97
|
-
describe 'couchrest' do
|
|
98
|
-
before do
|
|
99
|
-
capture_io { generate(:project, 'sample_project', '-e=slim', "--root=#{@apptmp}", '-d=couchrest') }
|
|
100
|
-
capture_io { generate(:admin_app, "--root=#{@apptmp}/sample_project") }
|
|
101
|
-
@model = "#{@apptmp}/sample_project/models/account.rb"
|
|
102
|
-
end
|
|
103
|
-
|
|
104
|
-
it 'should be a couchrest model instance' do
|
|
105
|
-
assert_match_in_file(/class Account < CouchRest::Model::Base/m, @model)
|
|
106
|
-
end
|
|
107
|
-
end
|
|
108
49
|
end
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
require_relative '../helper'
|
|
2
|
+
require 'open3'
|
|
2
3
|
|
|
3
4
|
describe 'AdminAppGenerator' do
|
|
4
5
|
before do
|
|
@@ -12,25 +13,108 @@ describe 'AdminAppGenerator' do
|
|
|
12
13
|
|
|
13
14
|
describe 'the admin app generator' do
|
|
14
15
|
before do
|
|
15
|
-
# Account gets created by Datamapper's migration and then gets
|
|
16
|
-
# rejected by model generator as already defined
|
|
17
16
|
Object.send(:remove_const, :Account) if defined?(Account)
|
|
18
17
|
end
|
|
19
18
|
|
|
20
19
|
it 'should fail outside app root' do
|
|
21
|
-
out, = capture_io { generate(:admin_app, "-r=#{@apptmp}") }
|
|
20
|
+
out, = capture_io { assert_equal 1, assert_raises(SystemExit) { generate(:admin_app, "-r=#{@apptmp}") }.status }
|
|
22
21
|
assert_match(/not at the root/, out)
|
|
23
22
|
assert_no_file_exists("#{@apptmp}/admin")
|
|
24
23
|
end
|
|
25
24
|
|
|
26
25
|
it "should fail if we don't specify an orm on the project" do
|
|
27
26
|
capture_io { generate(:project, 'sample_project', '-e=slim', "--root=#{@apptmp}", '-e=haml') }
|
|
28
|
-
|
|
27
|
+
out, = capture_io { assert_equal 1, assert_raises(SystemExit) { generate(:admin_app, "-r=#{@apptmp}/sample_project") }.status }
|
|
28
|
+
assert_match(/Padrino only supports/, out)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
it 'should fail without writing anything when the project orm is no longer supported' do
|
|
32
|
+
capture_io { generate(:project, 'sample_project', '-e=slim', "--root=#{@apptmp}", '-d=sequel') }
|
|
33
|
+
components = "#{@apptmp}/sample_project/.components"
|
|
34
|
+
File.write(components, File.read(components).sub(':orm: sequel', ':orm: ohm'))
|
|
35
|
+
out, = capture_io { assert_equal 1, assert_raises(SystemExit) { generate(:admin_app, "-r=#{@apptmp}/sample_project") }.status }
|
|
36
|
+
assert_match(/only supports activerecord or mongoid or sequel\. Sorry!/, out)
|
|
37
|
+
assert_no_dir_exists("#{@apptmp}/sample_project/admin")
|
|
38
|
+
assert_no_file_exists("#{@apptmp}/sample_project/models/account.rb")
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
it 'should fail with an unsupported renderer' do
|
|
42
|
+
capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '-d=activerecord', '-e=haml') }
|
|
43
|
+
out, = capture_io { assert_equal 1, assert_raises(SystemExit) { generate(:admin_app, "-r=#{@apptmp}/sample_project", '-e=liquid') }.status }
|
|
44
|
+
assert_match(/for admin we only support/, out)
|
|
45
|
+
assert_no_file_exists("#{@apptmp}/sample_project/admin")
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
it 'should reuse an existing account model' do
|
|
49
|
+
capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '-d=activerecord', '-e=haml') }
|
|
50
|
+
Object.const_set(:Account, Class.new)
|
|
51
|
+
begin
|
|
52
|
+
capture_io { generate(:admin_app, "--root=#{@apptmp}/sample_project") }
|
|
53
|
+
rescue SystemExit => e
|
|
54
|
+
flunk "the admin generator exited with status #{e.status}"
|
|
55
|
+
end
|
|
56
|
+
assert_file_exists("#{@apptmp}/sample_project/admin/app.rb")
|
|
57
|
+
assert_match_in_file(/class Account < ActiveRecord::Base/, "#{@apptmp}/sample_project/models/account.rb")
|
|
58
|
+
assert_no_file_exists("#{@apptmp}/sample_project/db/migrate/001_create_accounts.rb")
|
|
59
|
+
ensure
|
|
60
|
+
Object.send(:remove_const, :Account) if defined?(Account)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
it 'should generate the account model test with the project test_config path' do
|
|
64
|
+
capture_io { generate(:project, 'sample_project', '-e=haml', "--root=#{@apptmp}", '-d=activerecord', '-t=minitest') }
|
|
65
|
+
capture_io { generate(:admin_app, "--root=#{@apptmp}/sample_project") }
|
|
66
|
+
assert_match_in_file %r{__dir__\}/\.\./test_config\.rb}, "#{@apptmp}/sample_project/test/models/account_test.rb"
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
it 'should generate seeds that read the account from piped input' do
|
|
70
|
+
capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '-d=sequel', '-e=haml') }
|
|
71
|
+
capture_io { generate(:admin_app, "--root=#{@apptmp}/sample_project") }
|
|
72
|
+
script = <<~RUBY
|
|
73
|
+
require 'thor'
|
|
74
|
+
# Thor's line editor can echo or buffer piped input, so without a terminal the
|
|
75
|
+
# seeds must not ask through it.
|
|
76
|
+
class NoAskShell < Thor::Base.shell
|
|
77
|
+
def ask(*)
|
|
78
|
+
raise 'shell.ask used without a terminal'
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def shell
|
|
83
|
+
@shell ||= NoAskShell.new
|
|
84
|
+
end
|
|
85
|
+
class Account
|
|
86
|
+
def initialize(attributes)
|
|
87
|
+
@attributes = attributes
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def valid?
|
|
91
|
+
true
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def save
|
|
95
|
+
puts "SAVED \#{@attributes[:email]} \#{@attributes[:password] == 'secret123'}"
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
load 'db/seeds.rb'
|
|
99
|
+
RUBY
|
|
100
|
+
env = { 'BUNDLE_GEMFILE' => File.expand_path('../../../Gemfile', __dir__) }
|
|
101
|
+
out, err, status = Open3.capture3(env, RbConfig.ruby, '-rbundler/setup', '-e', script,
|
|
102
|
+
chdir: "#{@apptmp}/sample_project", stdin_data: "admin@example.com \nsecret123\r\n")
|
|
103
|
+
assert status.success?, err
|
|
104
|
+
assert_includes out.lines.map(&:strip), 'SAVED admin@example.com true'
|
|
105
|
+
refute_includes out, 'secret123'
|
|
29
106
|
end
|
|
30
107
|
|
|
31
108
|
it 'should store and apply session_secret' do
|
|
32
|
-
capture_io { generate(:project, 'sample_project', '-e=slim', "--root=#{@apptmp}", '-d=
|
|
33
|
-
assert_match_in_file(
|
|
109
|
+
capture_io { generate(:project, 'sample_project', '-e=slim', "--root=#{@apptmp}", '-d=sequel', '-e=haml') }
|
|
110
|
+
assert_match_in_file(/^ set :session_secret, ENV\.fetch\('SESSION_SECRET'\) \{ '\h{64}' \}$/, "#{@apptmp}/sample_project/config/apps.rb")
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
it 'should set SameSite=Lax and Secure in production on the admin session cookie' do
|
|
114
|
+
capture_io { generate(:project, 'sample_project', '-e=haml', "--root=#{@apptmp}", '-d=activerecord') }
|
|
115
|
+
capture_io { generate(:admin_app, "--root=#{@apptmp}/sample_project") }
|
|
116
|
+
assert_match_in_file(/^ set :sessions, same_site: :lax, secure: Padrino\.env == :production$/, "#{@apptmp}/sample_project/admin/app.rb")
|
|
117
|
+
assert_no_match_in_file(/^\s*enable\s+:sessions/, "#{@apptmp}/sample_project/admin/app.rb")
|
|
34
118
|
end
|
|
35
119
|
|
|
36
120
|
it 'should generate the admin app' do
|
|
@@ -49,7 +133,7 @@ describe 'AdminAppGenerator' do
|
|
|
49
133
|
assert_file_exists("#{@apptmp}/sample_project/public/admin/stylesheets/application.css")
|
|
50
134
|
assert_file_exists("#{@apptmp}/sample_project/public/admin/stylesheets/bootstrap.css")
|
|
51
135
|
assert_file_exists("#{@apptmp}/sample_project/public/admin/javascripts/application.js")
|
|
52
|
-
assert_file_exists("#{@apptmp}/sample_project/public/admin/javascripts/jquery-
|
|
136
|
+
assert_file_exists("#{@apptmp}/sample_project/public/admin/javascripts/jquery-3.7.1.min.js")
|
|
53
137
|
assert_file_exists("#{@apptmp}/sample_project/models/account.rb")
|
|
54
138
|
assert_file_exists("#{@apptmp}/sample_project/db/seeds.rb")
|
|
55
139
|
assert_file_exists("#{@apptmp}/sample_project/db/migrate/001_create_accounts.rb")
|
|
@@ -74,6 +158,17 @@ describe 'AdminAppGenerator' do
|
|
|
74
158
|
assert_match_in_file(/Hello, custom generator/, "#{@apptmp}/sample_project/admin/views/layouts/application.slim")
|
|
75
159
|
end
|
|
76
160
|
|
|
161
|
+
it 'should generate the account pages in an admin app named with a plural' do
|
|
162
|
+
capture_io { generate(:project, 'sample_project', '-e=slim', "--root=#{@apptmp}", '-d=sequel') }
|
|
163
|
+
begin
|
|
164
|
+
capture_io { generate(:admin_app, '-a=admins', "--root=#{@apptmp}/sample_project") }
|
|
165
|
+
rescue SystemExit => e
|
|
166
|
+
flunk "the admin generator exited with status #{e.status}"
|
|
167
|
+
end
|
|
168
|
+
assert_file_exists("#{@apptmp}/sample_project/admins/controllers/accounts.rb")
|
|
169
|
+
assert_no_dir_exists("#{@apptmp}/sample_project/admin")
|
|
170
|
+
end
|
|
171
|
+
|
|
77
172
|
it 'should generate the admin app under a different folder' do
|
|
78
173
|
# TODO: FIXME Implement option --admin_root or something. See https://github.com/padrino/padrino-framework/issues/854#issuecomment-14749356
|
|
79
174
|
skip
|
|
@@ -124,6 +219,49 @@ describe 'AdminAppGenerator' do
|
|
|
124
219
|
assert_file_exists("#{@apptmp}/sample_project/admin/views/layouts/application.slim")
|
|
125
220
|
assert_file_exists("#{@apptmp}/sample_project/admin/views/sessions/new.slim")
|
|
126
221
|
end
|
|
222
|
+
|
|
223
|
+
%w[haml erb slim].each do |engine|
|
|
224
|
+
it "should serve every script the #{engine} admin pages include" do
|
|
225
|
+
skip 'the sqlite3 gem is only bundled on MRI' if RUBY_ENGINE == 'jruby'
|
|
226
|
+
capture_io { generate(:project, 'sample_project', "--root=#{@apptmp}", '-d=sequel', "-e=#{engine}") }
|
|
227
|
+
capture_io { generate(:admin_app, "--root=#{@apptmp}/sample_project") }
|
|
228
|
+
script = <<~'RUBY'
|
|
229
|
+
ENV['RACK_ENV'] = 'test'
|
|
230
|
+
%w[sequel haml slim erubi nokogiri rack/test].each { |lib| require lib }
|
|
231
|
+
Sequel.extension :migration
|
|
232
|
+
Sequel.sqlite('db/sample_project_test.db') { |db| Sequel::Migrator.run(db, 'db/migrate') }
|
|
233
|
+
require File.expand_path('config/boot')
|
|
234
|
+
account_id = Account.dataset.insert(email: 'admin@example.com', role: 'admin', crypted_password: 'unused')
|
|
235
|
+
|
|
236
|
+
browser = Rack::Test::Session.new(Padrino.application)
|
|
237
|
+
check = lambda do |page|
|
|
238
|
+
browser.get(page)
|
|
239
|
+
puts "PAGE #{page} #{browser.last_response.status}"
|
|
240
|
+
srcs = Nokogiri::HTML(browser.last_response.body).css('script[src]').map { |tag| tag['src'] }
|
|
241
|
+
srcs.select { |src| src.start_with?('/') }.each do |src|
|
|
242
|
+
puts "SCRIPT #{page} #{src} #{browser.get(src).status}"
|
|
243
|
+
end
|
|
244
|
+
end
|
|
245
|
+
check.call('/admin/sessions/new')
|
|
246
|
+
browser.env('rack.session', SampleProject::Admin.session_id => account_id)
|
|
247
|
+
check.call('/admin/')
|
|
248
|
+
check.call('/admin/accounts')
|
|
249
|
+
RUBY
|
|
250
|
+
env = { 'BUNDLE_GEMFILE' => File.expand_path('../../../Gemfile', __dir__) }
|
|
251
|
+
out, err, status = Open3.capture3(env, RbConfig.ruby, '-rbundler/setup', '-e', script, chdir: "#{@apptmp}/sample_project")
|
|
252
|
+
assert status.success?, err
|
|
253
|
+
pages = out.lines.grep(/\APAGE /).map(&:split)
|
|
254
|
+
scripts = out.lines.grep(/\ASCRIPT /).map(&:split)
|
|
255
|
+
statuses = pages.map { |line| line[1, 2] }
|
|
256
|
+
assert_equal [['/admin/sessions/new', '200'], ['/admin/', '200'], ['/admin/accounts', '200']], statuses
|
|
257
|
+
pages.each do |(_, page)|
|
|
258
|
+
refute_empty scripts.select { |line| line[1] == page }, "#{page} includes no local scripts"
|
|
259
|
+
end
|
|
260
|
+
scripts.each do |(_, page, src, code)|
|
|
261
|
+
assert_equal '200', code, "#{page} includes #{src}, which is not served"
|
|
262
|
+
end
|
|
263
|
+
end
|
|
264
|
+
end
|
|
127
265
|
end
|
|
128
266
|
|
|
129
267
|
it 'should correctly generate a new padrino admin application with a custom model' do
|
|
@@ -185,31 +323,27 @@ describe 'AdminAppGenerator' do
|
|
|
185
323
|
capture_io { generate(:admin_app, "--root=#{@apptmp}/sample_project") }
|
|
186
324
|
assert_match_in_file(/ use ConnectionPoolManagement/m, "#{@apptmp}/sample_project/admin/app.rb")
|
|
187
325
|
end
|
|
326
|
+
end
|
|
188
327
|
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
it 'should not add it for #datamapper' do
|
|
196
|
-
capture_io { generate(:project, 'sample_project', '-e=slim', "--root=#{@apptmp}", '-d=datamapper', '-e=haml') }
|
|
197
|
-
capture_io { generate(:admin_app, "--root=#{@apptmp}/sample_project") }
|
|
198
|
-
assert_no_match_in_file(/ use ConnectionPoolManagement/m, "#{@apptmp}/sample_project/admin/app.rb")
|
|
328
|
+
describe 'with the vite script component' do
|
|
329
|
+
def assert_activesupport_listed_once(gemfile)
|
|
330
|
+
Bundler.ui.expects(:warn).never
|
|
331
|
+
dsl = Bundler::Dsl.new
|
|
332
|
+
dsl.eval_gemfile(gemfile)
|
|
333
|
+
assert_equal(1, dsl.dependencies.count { |dep| dep.name == 'activesupport' })
|
|
199
334
|
end
|
|
200
|
-
end
|
|
201
335
|
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
capture_io { generate(:project, 'sample_project', '-e=slim', "--root=#{@apptmp}", '-d=datamapper', '-e=haml') }
|
|
336
|
+
it 'should list activesupport once when admin is added after vite' do
|
|
337
|
+
capture_io { generate(:project, 'sample_project', '-e=haml', "--root=#{@apptmp}", '-d=sequel', '--script=vite') }
|
|
205
338
|
capture_io { generate(:admin_app, "--root=#{@apptmp}/sample_project") }
|
|
206
|
-
|
|
339
|
+
assert_activesupport_listed_once("#{@apptmp}/sample_project/Gemfile")
|
|
207
340
|
end
|
|
208
341
|
|
|
209
|
-
it 'should
|
|
210
|
-
capture_io { generate(:project, 'sample_project', '-e=
|
|
342
|
+
it 'should list activesupport once when vite is added after admin' do
|
|
343
|
+
capture_io { generate(:project, 'sample_project', '-e=haml', "--root=#{@apptmp}", '-d=sequel') }
|
|
211
344
|
capture_io { generate(:admin_app, "--root=#{@apptmp}/sample_project") }
|
|
212
|
-
|
|
345
|
+
capture_io { generate(:component, '--script=vite', "-r=#{@apptmp}/sample_project") }
|
|
346
|
+
assert_activesupport_listed_once("#{@apptmp}/sample_project/Gemfile")
|
|
213
347
|
end
|
|
214
348
|
end
|
|
215
349
|
|