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.
Files changed (129) hide show
  1. checksums.yaml +4 -4
  2. data/README.rdoc +3 -3
  3. data/Rakefile +0 -21
  4. data/lib/padrino-admin/access_control.rb +17 -4
  5. data/lib/padrino-admin/generators/actions.rb +1 -1
  6. data/lib/padrino-admin/generators/admin_app.rb +9 -11
  7. data/lib/padrino-admin/generators/admin_page.rb +12 -2
  8. data/lib/padrino-admin/generators/orm.rb +30 -47
  9. data/lib/padrino-admin/generators/templates/account/seeds.rb.tt +7 -2
  10. data/lib/padrino-admin/generators/templates/app/controllers/sessions.rb.tt +0 -4
  11. data/lib/padrino-admin/generators/templates/app.rb.tt +4 -1
  12. data/lib/padrino-admin/generators/templates/assets/javascripts/bootstrap/affix.js +63 -36
  13. data/lib/padrino-admin/generators/templates/assets/javascripts/bootstrap/alert.js +18 -11
  14. data/lib/padrino-admin/generators/templates/assets/javascripts/bootstrap/bootstrap.min.js +4 -4
  15. data/lib/padrino-admin/generators/templates/assets/javascripts/bootstrap/button.js +41 -23
  16. data/lib/padrino-admin/generators/templates/assets/javascripts/bootstrap/carousel.js +90 -49
  17. data/lib/padrino-admin/generators/templates/assets/javascripts/bootstrap/collapse.js +86 -44
  18. data/lib/padrino-admin/generators/templates/assets/javascripts/bootstrap/dropdown.js +66 -48
  19. data/lib/padrino-admin/generators/templates/assets/javascripts/bootstrap/modal.js +167 -52
  20. data/lib/padrino-admin/generators/templates/assets/javascripts/bootstrap/popover.js +33 -20
  21. data/lib/padrino-admin/generators/templates/assets/javascripts/bootstrap/scrollspy.js +58 -39
  22. data/lib/padrino-admin/generators/templates/assets/javascripts/bootstrap/tab.js +55 -25
  23. data/lib/padrino-admin/generators/templates/assets/javascripts/bootstrap/tooltip.js +370 -92
  24. data/lib/padrino-admin/generators/templates/assets/javascripts/bootstrap/transition.js +22 -11
  25. data/lib/padrino-admin/generators/templates/assets/javascripts/jquery-3.7.1.min.js +2 -0
  26. data/lib/padrino-admin/generators/templates/assets/stylesheets/application.css +14 -0
  27. data/lib/padrino-admin/generators/templates/assets/stylesheets/bootstrap.css +6 -4
  28. data/lib/padrino-admin/generators/templates/erb/app/base/index.erb.tt +1 -1
  29. data/lib/padrino-admin/generators/templates/erb/app/layouts/application.erb.tt +1 -1
  30. data/lib/padrino-admin/generators/templates/erb/app/sessions/new.erb.tt +1 -1
  31. data/lib/padrino-admin/generators/templates/erb/page/index.erb.tt +2 -2
  32. data/lib/padrino-admin/generators/templates/haml/app/base/index.haml.tt +1 -1
  33. data/lib/padrino-admin/generators/templates/haml/app/layouts/application.haml.tt +1 -1
  34. data/lib/padrino-admin/generators/templates/haml/app/sessions/new.haml.tt +1 -1
  35. data/lib/padrino-admin/generators/templates/slim/app/base/index.slim.tt +1 -1
  36. data/lib/padrino-admin/generators/templates/slim/app/layouts/application.slim.tt +1 -1
  37. data/lib/padrino-admin/generators/templates/slim/app/sessions/new.slim.tt +1 -1
  38. data/lib/padrino-admin/generators/templates/slim/page/index.slim.tt +2 -2
  39. data/lib/padrino-admin/helpers/authentication_helpers.rb +1 -1
  40. data/lib/padrino-admin/helpers/view_helpers.rb +3 -3
  41. data/lib/padrino-admin/locale/orm/pl.yml +0 -11
  42. data/lib/padrino-admin.rb +1 -1
  43. data/padrino-admin.gemspec +0 -2
  44. data/test/generators/test_account_model_generator.rb +1 -60
  45. data/test/generators/test_admin_app_generator.rb +159 -25
  46. data/test/generators/test_admin_page_generator.rb +110 -9
  47. data/test/test_admin_application.rb +123 -0
  48. metadata +9 -124
  49. data/lib/padrino-admin/bootstrap-less/alerts.less +0 -67
  50. data/lib/padrino-admin/bootstrap-less/badges.less +0 -55
  51. data/lib/padrino-admin/bootstrap-less/bootstrap.less +0 -49
  52. data/lib/padrino-admin/bootstrap-less/breadcrumbs.less +0 -26
  53. data/lib/padrino-admin/bootstrap-less/button-groups.less +0 -226
  54. data/lib/padrino-admin/bootstrap-less/buttons.less +0 -155
  55. data/lib/padrino-admin/bootstrap-less/carousel.less +0 -232
  56. data/lib/padrino-admin/bootstrap-less/close.less +0 -33
  57. data/lib/padrino-admin/bootstrap-less/code.less +0 -63
  58. data/lib/padrino-admin/bootstrap-less/component-animations.less +0 -29
  59. data/lib/padrino-admin/bootstrap-less/dropdowns.less +0 -213
  60. data/lib/padrino-admin/bootstrap-less/font-awesome/bordered-pulled.less +0 -16
  61. data/lib/padrino-admin/bootstrap-less/font-awesome/core.less +0 -12
  62. data/lib/padrino-admin/bootstrap-less/font-awesome/fixed-width.less +0 -6
  63. data/lib/padrino-admin/bootstrap-less/font-awesome/font-awesome.less +0 -17
  64. data/lib/padrino-admin/bootstrap-less/font-awesome/icons.less +0 -412
  65. data/lib/padrino-admin/bootstrap-less/font-awesome/larger.less +0 -13
  66. data/lib/padrino-admin/bootstrap-less/font-awesome/list.less +0 -19
  67. data/lib/padrino-admin/bootstrap-less/font-awesome/mixins.less +0 -20
  68. data/lib/padrino-admin/bootstrap-less/font-awesome/path.less +0 -14
  69. data/lib/padrino-admin/bootstrap-less/font-awesome/rotated-flipped.less +0 -9
  70. data/lib/padrino-admin/bootstrap-less/font-awesome/spinning.less +0 -30
  71. data/lib/padrino-admin/bootstrap-less/font-awesome/stacked.less +0 -20
  72. data/lib/padrino-admin/bootstrap-less/font-awesome/variables.less +0 -381
  73. data/lib/padrino-admin/bootstrap-less/forms.less +0 -419
  74. data/lib/padrino-admin/bootstrap-less/glyphicons.less +0 -233
  75. data/lib/padrino-admin/bootstrap-less/grid.less +0 -100
  76. data/lib/padrino-admin/bootstrap-less/input-groups.less +0 -157
  77. data/lib/padrino-admin/bootstrap-less/jumbotron.less +0 -44
  78. data/lib/padrino-admin/bootstrap-less/labels.less +0 -64
  79. data/lib/padrino-admin/bootstrap-less/list-group.less +0 -110
  80. data/lib/padrino-admin/bootstrap-less/media.less +0 -56
  81. data/lib/padrino-admin/bootstrap-less/mixins.less +0 -926
  82. data/lib/padrino-admin/bootstrap-less/modals.less +0 -138
  83. data/lib/padrino-admin/bootstrap-less/navbar.less +0 -616
  84. data/lib/padrino-admin/bootstrap-less/navs.less +0 -242
  85. data/lib/padrino-admin/bootstrap-less/normalize.less +0 -423
  86. data/lib/padrino-admin/bootstrap-less/padrino-admin.less +0 -18
  87. data/lib/padrino-admin/bootstrap-less/pager.less +0 -55
  88. data/lib/padrino-admin/bootstrap-less/pagination.less +0 -88
  89. data/lib/padrino-admin/bootstrap-less/panels.less +0 -230
  90. data/lib/padrino-admin/bootstrap-less/popovers.less +0 -133
  91. data/lib/padrino-admin/bootstrap-less/print.less +0 -101
  92. data/lib/padrino-admin/bootstrap-less/progress-bars.less +0 -80
  93. data/lib/padrino-admin/bootstrap-less/responsive-utilities.less +0 -93
  94. data/lib/padrino-admin/bootstrap-less/scaffolding.less +0 -134
  95. data/lib/padrino-admin/bootstrap-less/tables.less +0 -233
  96. data/lib/padrino-admin/bootstrap-less/theme.less +0 -247
  97. data/lib/padrino-admin/bootstrap-less/thumbnails.less +0 -36
  98. data/lib/padrino-admin/bootstrap-less/tooltip.less +0 -95
  99. data/lib/padrino-admin/bootstrap-less/type.less +0 -296
  100. data/lib/padrino-admin/bootstrap-less/utilities.less +0 -56
  101. data/lib/padrino-admin/bootstrap-less/variables.less +0 -827
  102. data/lib/padrino-admin/bootstrap-less/wells.less +0 -29
  103. data/lib/padrino-admin/generators/templates/account/couchrest.rb.tt +0 -67
  104. data/lib/padrino-admin/generators/templates/account/datamapper.rb.tt +0 -61
  105. data/lib/padrino-admin/generators/templates/account/dynamoid.rb.tt +0 -55
  106. data/lib/padrino-admin/generators/templates/account/minirecord.rb.tt +0 -44
  107. data/lib/padrino-admin/generators/templates/account/mongomapper.rb.tt +0 -47
  108. data/lib/padrino-admin/generators/templates/account/ohm.rb.tt +0 -70
  109. data/lib/padrino-admin/generators/templates/assets/javascripts/jquery-1.11.0.min.js +0 -4
  110. data/lib/padrino-admin/locale/orm/cs.yml +0 -12
  111. data/lib/padrino-admin/locale/orm/da.yml +0 -12
  112. data/lib/padrino-admin/locale/orm/de.yml +0 -12
  113. data/lib/padrino-admin/locale/orm/en.yml +0 -12
  114. data/lib/padrino-admin/locale/orm/es.yml +0 -12
  115. data/lib/padrino-admin/locale/orm/fr.yml +0 -12
  116. data/lib/padrino-admin/locale/orm/hu.yml +0 -12
  117. data/lib/padrino-admin/locale/orm/it.yml +0 -12
  118. data/lib/padrino-admin/locale/orm/ja.yml +0 -12
  119. data/lib/padrino-admin/locale/orm/lv.yml +0 -12
  120. data/lib/padrino-admin/locale/orm/nl.yml +0 -12
  121. data/lib/padrino-admin/locale/orm/no.yml +0 -12
  122. data/lib/padrino-admin/locale/orm/pt_br.yml +0 -12
  123. data/lib/padrino-admin/locale/orm/ro.yml +0 -12
  124. data/lib/padrino-admin/locale/orm/ru.yml +0 -12
  125. data/lib/padrino-admin/locale/orm/sv.yml +0 -12
  126. data/lib/padrino-admin/locale/orm/tr.yml +0 -12
  127. data/lib/padrino-admin/locale/orm/uk.yml +0 -12
  128. data/lib/padrino-admin/locale/orm/zh_cn.yml +0 -12
  129. 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 datamapper, sequel, activerecord, minirecord, mongomapper, mongoid, couchrest"><%%= tag_icon("cogs fa-2x", "Orm Agnostic") %></div>
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-1.11.0.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 %>
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-1.11.0.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 %>
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.list-menu-wrapper-disabled>
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.list-menu-wrapper-disabled>
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 datamapper, sequel, activerecord, minirecord, mongomapper, mongoid, couchrest'}
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-1.11.0.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
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-1.11.0.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
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 datamapper, sequel, activerecord, minirecord, mongomapper, mongoid, couchrest" = tag_icon("cogs fa-2x", "Orm Agnostic")
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-1.11.0.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
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-1.11.0.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
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.dropdown-toggle dropdown-toggle' data-toggle='dropdown'
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='dropdown'
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.constantize
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] ||= word.to_s.humanize
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: attribute.to_s.humanize)
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: model.to_s.humanize)
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 datamapper, activerecord, mongomapper, couchdb (now only: datamapper and activerecord), ohm
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)
@@ -24,6 +24,4 @@ Gem::Specification.new do |s|
24
24
 
25
25
  s.add_dependency('padrino-core', Padrino.version)
26
26
  s.add_dependency('padrino-helpers', Padrino.version)
27
- s.add_development_dependency('therubyracer', '~> 0.11.1')
28
- s.add_development_dependency('less', '~> 2.2.2')
29
27
  end
@@ -7,7 +7,7 @@ describe 'AccountModelGenerator' do
7
7
  end
8
8
 
9
9
  after do
10
- %(rm -rf #{@apptmp})
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
- assert_raises(SystemExit) { @out, @err = capture_io { generate(:admin_app, "-r=#{@apptmp}/sample_project") } }
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=datamapper', '-e=haml') }
33
- assert_match_in_file(/set :session_secret, '[0-9A-z]*'/, "#{@apptmp}/sample_project/config/apps.rb")
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-1.11.0.min.js")
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
- it 'should add it #minirecord' do
190
- capture_io { generate(:project, 'sample_project', '-e=slim', "--root=#{@apptmp}", '-d=minirecord', '-e=haml') }
191
- capture_io { generate(:admin_app, "--root=#{@apptmp}/sample_project") }
192
- assert_match_in_file(/ use ConnectionPoolManagement/m, "#{@apptmp}/sample_project/admin/app.rb")
193
- end
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
- describe 'datamapper middleware' do
203
- it 'should add it for #datamapper' do
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
- assert_match_in_file(/ use IdentityMap/m, "#{@apptmp}/sample_project/admin/app.rb")
339
+ assert_activesupport_listed_once("#{@apptmp}/sample_project/Gemfile")
207
340
  end
208
341
 
209
- it 'should not add it for #activerecord' do
210
- capture_io { generate(:project, 'sample_project', '-e=slim', "--root=#{@apptmp}", '-d=activerecord', '-e=haml') }
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
- assert_no_match_in_file(/ use IdentityMap/m, "#{@apptmp}/sample_project/admin/app.rb")
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