activeadmin 0.3.4 → 0.4.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 (244) hide show
  1. data/.gitignore +1 -0
  2. data/.travis.yml +3 -0
  3. data/CHANGELOG.md +164 -5
  4. data/CONTRIBUTING.md +113 -0
  5. data/Gemfile +7 -9
  6. data/LICENSE +1 -1
  7. data/README.rdoc +19 -20
  8. data/activeadmin.gemspec +4 -2
  9. data/app/assets/javascripts/active_admin/application.js +9 -0
  10. data/app/assets/javascripts/active_admin/base.js +4 -12
  11. data/app/assets/stylesheets/active_admin/_base.css.scss +17 -341
  12. data/app/assets/stylesheets/active_admin/_forms.css.scss +13 -7
  13. data/app/assets/stylesheets/active_admin/_header.css.scss +23 -4
  14. data/app/assets/stylesheets/active_admin/components/_blank_slates.scss +31 -0
  15. data/app/assets/stylesheets/active_admin/components/_breadcrumbs.scss +20 -0
  16. data/app/assets/stylesheets/active_admin/components/_buttons.scss +12 -0
  17. data/app/assets/stylesheets/active_admin/components/_flash_messages.css.scss +2 -0
  18. data/app/assets/stylesheets/active_admin/components/_grid.scss +9 -0
  19. data/app/assets/stylesheets/active_admin/components/_links.scss +5 -0
  20. data/app/assets/stylesheets/active_admin/components/_pagination.scss +34 -0
  21. data/app/assets/stylesheets/active_admin/components/_panels.scss +6 -0
  22. data/app/assets/stylesheets/active_admin/components/_scopes.scss +10 -0
  23. data/app/assets/stylesheets/active_admin/components/_status_tags.scss +12 -0
  24. data/app/assets/stylesheets/active_admin/components/_table_tools.css.scss +101 -0
  25. data/app/assets/stylesheets/active_admin/components/_tables.css.scss +43 -2
  26. data/app/assets/stylesheets/active_admin/mixins/_all.css.scss +2 -1
  27. data/app/assets/stylesheets/active_admin/mixins/_buttons.css.scss +50 -13
  28. data/app/assets/stylesheets/active_admin/mixins/_gradients.css.scss +9 -1
  29. data/app/assets/stylesheets/active_admin/mixins/_sections.css.scss +7 -5
  30. data/app/assets/stylesheets/active_admin/mixins/_shadows.css.scss +1 -0
  31. data/app/assets/stylesheets/active_admin/mixins/_typography.scss +3 -0
  32. data/app/assets/stylesheets/active_admin/mixins/_utilities.scss +9 -0
  33. data/app/assets/stylesheets/active_admin/mixins/_variables.css.scss +1 -0
  34. data/app/assets/stylesheets/active_admin/pages/_dashboard.scss +5 -0
  35. data/app/assets/stylesheets/active_admin/pages/_logged_out.scss +44 -0
  36. data/app/assets/stylesheets/active_admin/structure/_footer.scss +14 -0
  37. data/app/assets/stylesheets/active_admin/structure/_main_structure.scss +26 -0
  38. data/app/assets/stylesheets/active_admin/structure/_title_bar.scss +44 -0
  39. data/app/views/active_admin/devise/passwords/edit.html.erb +1 -1
  40. data/app/views/active_admin/devise/passwords/new.html.erb +1 -1
  41. data/app/views/active_admin/devise/sessions/new.html.erb +1 -1
  42. data/app/views/active_admin/devise/shared/_links.erb +1 -1
  43. data/app/views/active_admin/devise/unlocks/new.html.erb +1 -1
  44. data/app/views/active_admin/page/index.html.arb +1 -0
  45. data/app/views/layouts/active_admin_logged_out.html.erb +2 -2
  46. data/cucumber.yml +3 -2
  47. data/docs/1-general-configuration.md +46 -10
  48. data/docs/6-show-screens.md +7 -0
  49. data/docs/8-custom-actions.md +12 -2
  50. data/docs/9-custom-pages.md +84 -0
  51. data/features/belongs_to.feature +27 -0
  52. data/features/comments/commenting.feature +3 -2
  53. data/features/dashboard.feature +18 -0
  54. data/features/development_reloading.feature +43 -0
  55. data/features/index/filter_with_check_boxes.feature +25 -0
  56. data/features/index/index_as_table.feature +14 -0
  57. data/features/index/index_scopes.feature +59 -0
  58. data/features/index/pagination.feature +19 -1
  59. data/features/menu.feature +22 -2
  60. data/features/registering_assets.feature +2 -2
  61. data/features/registering_pages.feature +66 -0
  62. data/features/specifying_actions.feature +5 -0
  63. data/features/step_definitions/action_item_steps.rb +2 -6
  64. data/features/step_definitions/action_link_steps.rb +7 -0
  65. data/features/step_definitions/additional_web_steps.rb +11 -3
  66. data/features/step_definitions/asset_steps.rb +5 -1
  67. data/features/step_definitions/breadcrumb_steps.rb +5 -0
  68. data/features/step_definitions/comment_steps.rb +3 -3
  69. data/features/step_definitions/configuration_steps.rb +69 -13
  70. data/features/step_definitions/dashboard_steps.rb +7 -3
  71. data/features/step_definitions/factory_steps.rb +9 -2
  72. data/features/step_definitions/flash_steps.rb +9 -1
  73. data/features/step_definitions/format_steps.rb +9 -1
  74. data/features/step_definitions/index_scope_steps.rb +18 -6
  75. data/features/step_definitions/member_link_steps.rb +7 -0
  76. data/features/step_definitions/pagination_steps.rb +2 -2
  77. data/features/step_definitions/site_title_steps.rb +15 -0
  78. data/features/step_definitions/tab_steps.rb +1 -1
  79. data/features/step_definitions/user_steps.rb +1 -1
  80. data/features/step_definitions/web_steps.rb +4 -4
  81. data/features/support/paths.rb +6 -0
  82. data/features/users/logging_out.feature +11 -0
  83. data/lib/active_admin.rb +26 -10
  84. data/lib/active_admin/application.rb +64 -22
  85. data/lib/active_admin/arbre.rb +0 -1
  86. data/lib/active_admin/arbre/builder.rb +8 -5
  87. data/lib/active_admin/arbre/context.rb +1 -1
  88. data/lib/active_admin/arbre/html/attributes.rb +1 -1
  89. data/lib/active_admin/arbre/html/class_list.rb +0 -4
  90. data/lib/active_admin/arbre/html/collection.rb +2 -2
  91. data/lib/active_admin/arbre/html/document.rb +1 -1
  92. data/lib/active_admin/arbre/html/element.rb +19 -9
  93. data/lib/active_admin/arbre/html/tag.rb +3 -3
  94. data/lib/active_admin/arbre/html/text_node.rb +2 -2
  95. data/lib/active_admin/asset_registration.rb +15 -2
  96. data/lib/active_admin/base_controller.rb +61 -0
  97. data/lib/active_admin/{resource_controller → base_controller}/menu.rb +1 -1
  98. data/lib/active_admin/callbacks.rb +16 -18
  99. data/lib/active_admin/comments.rb +48 -54
  100. data/lib/active_admin/comments/comment.rb +13 -2
  101. data/lib/active_admin/comments/namespace_helper.rb +1 -1
  102. data/lib/active_admin/comments/views/active_admin_comments.rb +7 -3
  103. data/lib/active_admin/dashboards.rb +4 -0
  104. data/lib/active_admin/dashboards/dashboard_controller.rb +21 -5
  105. data/lib/active_admin/dsl.rb +6 -159
  106. data/lib/active_admin/event.rb +5 -3
  107. data/lib/active_admin/filter_form_builder.rb +53 -0
  108. data/lib/active_admin/form_builder.rb +25 -19
  109. data/lib/active_admin/helpers/settings.rb +6 -10
  110. data/lib/active_admin/inputs.rb +14 -0
  111. data/lib/active_admin/inputs/datepicker_input.rb +11 -0
  112. data/lib/active_admin/inputs/filter_base.rb +46 -0
  113. data/lib/active_admin/inputs/filter_check_boxes_input.rb +40 -0
  114. data/lib/active_admin/inputs/filter_date_range_input.rb +34 -0
  115. data/lib/active_admin/inputs/filter_numeric_input.rb +55 -0
  116. data/lib/active_admin/inputs/filter_select_input.rb +23 -0
  117. data/lib/active_admin/inputs/filter_string_input.rb +22 -0
  118. data/lib/active_admin/locales/ca.yml +44 -0
  119. data/lib/active_admin/locales/cs.yml +14 -10
  120. data/lib/active_admin/locales/de.yml +44 -0
  121. data/lib/active_admin/locales/en.yml +5 -0
  122. data/lib/active_admin/locales/hr.yml +40 -0
  123. data/lib/active_admin/locales/hu.yml +45 -0
  124. data/lib/active_admin/locales/it.yml +11 -6
  125. data/lib/active_admin/locales/ko.yml +40 -0
  126. data/lib/active_admin/locales/lv.yml +43 -0
  127. data/lib/active_admin/locales/nl.yml +40 -0
  128. data/lib/active_admin/locales/no-NB.yml +40 -0
  129. data/lib/active_admin/locales/pl.yml +7 -1
  130. data/lib/active_admin/locales/pt-BR.yml +6 -2
  131. data/lib/active_admin/menu_item.rb +25 -17
  132. data/lib/active_admin/namespace.rb +48 -33
  133. data/lib/active_admin/page.rb +65 -0
  134. data/lib/active_admin/page_controller.rb +15 -0
  135. data/lib/active_admin/page_dsl.rb +21 -0
  136. data/lib/active_admin/page_presenter.rb +30 -0
  137. data/lib/active_admin/reloader.rb +109 -42
  138. data/lib/active_admin/resource.rb +38 -44
  139. data/lib/active_admin/resource/action_items.rb +5 -0
  140. data/lib/active_admin/resource/belongs_to.rb +4 -2
  141. data/lib/active_admin/resource/controllers.rb +35 -0
  142. data/lib/active_admin/resource/menu.rb +1 -2
  143. data/lib/active_admin/resource/naming.rb +53 -31
  144. data/lib/active_admin/resource/page_presenters.rb +28 -0
  145. data/lib/active_admin/resource/scopes.rb +16 -3
  146. data/lib/active_admin/resource/sidebars.rb +4 -0
  147. data/lib/active_admin/resource_collection.rb +88 -0
  148. data/lib/active_admin/resource_controller.rb +18 -54
  149. data/lib/active_admin/resource_controller/action_builder.rb +1 -1
  150. data/lib/active_admin/resource_controller/actions.rb +8 -8
  151. data/lib/active_admin/resource_controller/callbacks.rb +1 -1
  152. data/lib/active_admin/resource_controller/collection.rb +8 -4
  153. data/lib/active_admin/resource_controller/filters.rb +1 -1
  154. data/lib/active_admin/resource_controller/resource_class_methods.rb +24 -0
  155. data/lib/active_admin/resource_controller/scoping.rb +1 -1
  156. data/lib/active_admin/resource_controller/sidebars.rb +1 -1
  157. data/lib/active_admin/resource_dsl.rb +157 -0
  158. data/lib/active_admin/router.rb +21 -14
  159. data/lib/active_admin/scope.rb +15 -3
  160. data/lib/active_admin/version.rb +1 -1
  161. data/lib/active_admin/view_factory.rb +4 -3
  162. data/lib/active_admin/view_helpers/auto_link_helper.rb +1 -10
  163. data/lib/active_admin/view_helpers/breadcrumb_helper.rb +25 -21
  164. data/lib/active_admin/view_helpers/filter_form_helper.rb +0 -150
  165. data/lib/active_admin/views/components/attributes_table.rb +1 -1
  166. data/lib/active_admin/views/components/columns.rb +4 -4
  167. data/lib/active_admin/views/components/paginated_collection.rb +42 -13
  168. data/lib/active_admin/views/components/panel.rb +8 -0
  169. data/lib/active_admin/views/components/scopes.rb +24 -18
  170. data/lib/active_admin/views/components/status_tag.rb +6 -5
  171. data/lib/active_admin/views/components/table_for.rb +6 -2
  172. data/lib/active_admin/views/header_renderer.rb +31 -12
  173. data/lib/active_admin/views/index_as_block.rb +2 -2
  174. data/lib/active_admin/views/index_as_blog.rb +3 -3
  175. data/lib/active_admin/views/index_as_grid.rb +4 -4
  176. data/lib/active_admin/views/index_as_table.rb +13 -6
  177. data/lib/active_admin/views/pages/base.rb +4 -4
  178. data/lib/active_admin/views/pages/form.rb +49 -0
  179. data/lib/active_admin/views/pages/index.rb +18 -6
  180. data/lib/active_admin/views/pages/page.rb +24 -0
  181. data/lib/active_admin/views/pages/show.rb +1 -1
  182. data/lib/generators/active_admin/assets/assets_generator.rb +19 -1
  183. data/lib/generators/active_admin/install/templates/active_admin.rb.erb +38 -12
  184. data/lib/generators/active_admin/install/templates/dashboards.rb +6 -0
  185. data/script/use_rails +14 -7
  186. data/spec/spec_helper.rb +9 -14
  187. data/spec/spec_helper_without_rails.rb +10 -0
  188. data/spec/support/detect_rails_version.rb +22 -3
  189. data/spec/support/integration_example_group.rb +5 -7
  190. data/spec/support/rails_template.rb +11 -0
  191. data/spec/support/rails_template_with_data.rb +25 -0
  192. data/spec/support/templates/cucumber_with_reloading.rb +5 -0
  193. data/spec/unit/active_admin_spec.rb +8 -0
  194. data/spec/unit/application_spec.rb +48 -2
  195. data/spec/unit/arbre/context_spec.rb +1 -1
  196. data/spec/unit/arbre/html/element_finder_methods_spec.rb +58 -2
  197. data/spec/unit/arbre/html/element_spec.rb +18 -5
  198. data/spec/unit/arbre/html/tag_attributes_spec.rb +3 -3
  199. data/spec/unit/arbre/html/tag_spec.rb +1 -1
  200. data/spec/unit/arbre/html_spec.rb +32 -22
  201. data/spec/unit/asset_registration_spec.rb +9 -3
  202. data/spec/unit/auto_link_spec.rb +2 -2
  203. data/spec/unit/base_controller_shared_examples.rb +28 -0
  204. data/spec/unit/base_controller_spec.rb +8 -0
  205. data/spec/unit/belongs_to_spec.rb +30 -33
  206. data/spec/unit/comments_spec.rb +45 -15
  207. data/spec/unit/config_shared_examples.rb +119 -0
  208. data/spec/unit/dashboard_controller_spec.rb +44 -0
  209. data/spec/unit/event_spec.rb +6 -0
  210. data/spec/unit/filter_form_builder_spec.rb +9 -0
  211. data/spec/unit/form_builder_spec.rb +8 -14
  212. data/spec/unit/menu_item_spec.rb +25 -20
  213. data/spec/unit/namespace/register_page_spec.rb +102 -0
  214. data/spec/unit/namespace/register_resource_spec.rb +188 -0
  215. data/spec/unit/namespace_spec.rb +11 -183
  216. data/spec/unit/page_controller_spec.rb +8 -0
  217. data/spec/unit/page_spec.rb +60 -0
  218. data/spec/unit/reloader_spec.rb +82 -38
  219. data/spec/unit/resource/menu_spec.rb +1 -51
  220. data/spec/unit/resource/naming_spec.rb +25 -20
  221. data/spec/unit/resource/page_presenters_spec.rb +32 -0
  222. data/spec/unit/resource/scopes_spec.rb +13 -0
  223. data/spec/unit/resource_collection_spec.rb +101 -0
  224. data/spec/unit/resource_controller_spec.rb +40 -32
  225. data/spec/unit/{registration_spec.rb → resource_registration_spec.rb} +0 -0
  226. data/spec/unit/resource_spec.rb +8 -24
  227. data/spec/unit/routing_spec.rb +50 -1
  228. data/spec/unit/scope_spec.rb +18 -4
  229. data/spec/unit/views/components/paginated_collection_spec.rb +163 -0
  230. data/spec/unit/views/components/panel_spec.rb +9 -0
  231. data/spec/unit/views/components/status_tag_spec.rb +9 -0
  232. data/spec/unit/views/tabbed_navigation_spec.rb +2 -1
  233. data/tasks/test.rake +44 -26
  234. metadata +176 -69
  235. data/app/assets/javascripts/active_admin/vendor.js +0 -382
  236. data/lib/active_admin/arbre/core_extensions.rb +0 -5
  237. data/lib/active_admin/comments/configuration.rb +0 -18
  238. data/lib/active_admin/page_config.rb +0 -15
  239. data/lib/active_admin/resource_controller/form.rb +0 -42
  240. data/lib/active_admin/resource_controller/page_configurations.rb +0 -53
  241. data/lib/active_admin/views/pages/edit.rb +0 -28
  242. data/lib/active_admin/views/pages/new.rb +0 -28
  243. data/lib/generators/active_admin/assets/templates/3.0/active_admin.js +0 -427
  244. data/spec/integration/belongs_to_spec.rb +0 -42
@@ -34,5 +34,11 @@ ActiveAdmin::Dashboards.build do
34
34
  # section "Recent User", :priority => 1
35
35
  #
36
36
  # Will render the "Recent Users" then the "Recent Posts" sections on the dashboard.
37
+
38
+ # == Conditionally Display
39
+ # Provide a method name or Proc object to conditionally render a section at run time.
40
+ #
41
+ # section "Membership Summary", :if => :memberships_enabled?
42
+ # section "Membership Summary", :if => Proc.new { current_admin_user.account.memberships.any? }
37
43
 
38
44
  end
@@ -3,6 +3,8 @@
3
3
  # Switches the development environment to use the given
4
4
  # version of rails. Caches the Gemfile.locks so that
5
5
  # switching it very fast.
6
+ #
7
+ require File.expand_path("../../spec/support/detect_rails_version", __FILE__)
6
8
 
7
9
  def cmd(command)
8
10
  puts command
@@ -34,13 +36,18 @@ if File.exists?(gem_lock_file) && ARGV.include?('--clobber')
34
36
  cmd "rm #{gem_lock_file}"
35
37
  end
36
38
 
37
- unless File.exists?(gem_lock_file)
38
- # Generate it
39
+ write_rails_version(version)
40
+
41
+ # Ensure that bundler installs
42
+ ENV['RUBYOPT'] = ''
43
+
44
+ if File.exists?(gem_lock_file)
45
+ cmd("rm Gemfile.lock") if file_or_symlink?("Gemfile.lock")
46
+ cmd("ln -s #{gem_lock_file} Gemfile.lock")
47
+ cmd("bundle")
48
+ else
39
49
  cmd "rm Gemfile.lock" if file_or_symlink?("Gemfile.lock")
40
- cmd "export RAILS=#{version} && bundle install"
50
+ cmd "bundle install"
41
51
  cmd "mv Gemfile.lock #{gem_lock_file}"
52
+ cmd("ln -s #{gem_lock_file} Gemfile.lock")
42
53
  end
43
-
44
- cmd("rm Gemfile.lock") if file_or_symlink?("Gemfile.lock")
45
- cmd("ln -s #{gem_lock_file} Gemfile.lock")
46
- cmd("bundle")
@@ -1,16 +1,4 @@
1
- $LOAD_PATH.unshift(File.dirname(__FILE__))
2
- $LOAD_PATH << File.expand_path('../support', __FILE__)
3
-
4
- ENV['BUNDLE_GEMFILE'] = File.expand_path('../../Gemfile', __FILE__)
5
-
6
- require 'detect_rails_version'
7
- ENV['RAILS'] = detect_rails_version
8
-
9
- require "bundler"
10
- Bundler.setup
11
-
12
- require 'shoulda/active_record'
13
- include Shoulda::ActiveRecord::Macros
1
+ require File.expand_path("../spec_helper_without_rails", __FILE__)
14
2
 
15
3
  module ActiveAdminIntegrationSpecHelper
16
4
  extend self
@@ -90,10 +78,17 @@ module ActiveAdminIntegrationSpecHelper
90
78
  end
91
79
  alias_method :action_view, :mock_action_view
92
80
 
81
+ # A mock resource to register
82
+ class MockResource
83
+ end
84
+
93
85
  end
94
86
 
95
87
  ENV['RAILS_ENV'] = 'test'
96
- ENV['RAILS_ROOT'] = File.expand_path("../rails/rails-#{ENV["RAILS"]}", __FILE__)
88
+
89
+ require 'detect_rails_version'
90
+ rails_version = detect_rails_version
91
+ ENV['RAILS_ROOT'] = File.expand_path("../rails/rails-#{rails_version}", __FILE__)
97
92
 
98
93
  # Create the test app if it doesn't exists
99
94
  unless File.exists?(ENV['RAILS_ROOT'])
@@ -0,0 +1,10 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
+ $LOAD_PATH << File.expand_path('../support', __FILE__)
3
+
4
+ ENV['BUNDLE_GEMFILE'] = File.expand_path('../../Gemfile', __FILE__)
5
+
6
+ require 'detect_rails_version'
7
+ ENV['RAILS'] = detect_rails_version
8
+
9
+ require "bundler"
10
+ Bundler.setup
@@ -2,9 +2,28 @@
2
2
  #
3
3
  # You can pass it in as an ENV variable or it will use
4
4
  # the current Gemfile.lock to find it
5
+
6
+ unless defined?(RAILS_VERSION_FILE)
7
+ RAILS_VERSION_FILE = File.expand_path("../../../.rails-version", __FILE__)
8
+ end
9
+
10
+ unless defined?(DEFAULT_RAILS_VERSION)
11
+ DEFAULT_RAILS_VERSION = "3.2.0"
12
+ end
13
+
5
14
  def detect_rails_version
6
- return nil unless (File.exists?("Gemfile.lock") || File.symlink?("Gemfile.lock"))
15
+ detected_version = if File.exists?(RAILS_VERSION_FILE)
16
+ version = File.read(RAILS_VERSION_FILE).chomp.strip
17
+ version != "" ? version : DEFAULT_RAILS_VERSION
18
+ else
19
+ DEFAULT_RAILS_VERSION
20
+ end
21
+
22
+ puts "Detected Rails: #{detected_version}" if ENV['DEBUG']
23
+
24
+ detected_version
25
+ end
7
26
 
8
- File.read("Gemfile.lock").match(/^\W*rails \(([a-z\d.]*)\)/)
9
- return $1
27
+ def write_rails_version(version)
28
+ File.open(RAILS_VERSION_FILE, "w+"){|f| f << version }
10
29
  end
@@ -13,14 +13,12 @@ module RSpec
13
13
  include Capybara::DSL
14
14
  include RSpec::Matchers
15
15
 
16
- module InstanceMethods
17
- def app
18
- ::Rails.application
19
- end
16
+ def app
17
+ ::Rails.application
18
+ end
20
19
 
21
- def last_response
22
- page
23
- end
20
+ def last_response
21
+ page
24
22
  end
25
23
 
26
24
  included do
@@ -2,8 +2,11 @@
2
2
 
3
3
  # Create a cucumber database and environment
4
4
  copy_file File.expand_path('../templates/cucumber.rb', __FILE__), "config/environments/cucumber.rb"
5
+ copy_file File.expand_path('../templates/cucumber_with_reloading.rb', __FILE__), "config/environments/cucumber_with_reloading.rb"
6
+
5
7
  gsub_file 'config/database.yml', /^test:.*\n/, "test: &test\n"
6
8
  gsub_file 'config/database.yml', /\z/, "\ncucumber:\n <<: *test\n database: db/cucumber.sqlite3"
9
+ gsub_file 'config/database.yml', /\z/, "\ncucumber_with_reloading:\n <<: *test\n database: db/cucumber.sqlite3"
7
10
 
8
11
  # Generate some test models
9
12
  generate :model, "post title:string body:text published_at:datetime author_id:integer category_id:integer"
@@ -22,6 +25,14 @@ run "rm -r test"
22
25
  run "rm -r spec"
23
26
 
24
27
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
28
+
29
+ # we need this routing path, named "logout_path", for testing
30
+ route <<-EOS
31
+ devise_scope :user do
32
+ match '/admin/logout' => 'active_admin/devise/sessions#destroy', :as => :logout
33
+ end
34
+ EOS
35
+
25
36
  generate :'active_admin:install'
26
37
 
27
38
  # Setup a root path for devise
@@ -6,6 +6,27 @@ apply File.expand_path("../rails_template.rb", __FILE__)
6
6
  generate :'active_admin:resource', type
7
7
  end
8
8
 
9
+ scopes = <<-EOF
10
+ scope :all, :default => true
11
+
12
+ scope :drafts do |posts|
13
+ posts.where(["published_at IS NULL"])
14
+ end
15
+
16
+ scope :scheduled do |posts|
17
+ posts.where(["posts.published_at IS NOT NULL AND posts.published_at > ?", Time.now.utc])
18
+ end
19
+
20
+ scope :published do |posts|
21
+ posts.where(["posts.published_at IS NOT NULL AND posts.published_at < ?", Time.now.utc])
22
+ end
23
+
24
+ scope :my_posts do |posts|
25
+ posts.where(:author_id => current_admin_user.id)
26
+ end
27
+ EOF
28
+ inject_into_file 'app/admin/posts.rb', scopes , :after => "ActiveAdmin.register Post do\n"
29
+
9
30
  # Setup some default data
10
31
  append_file "db/seeds.rb", <<-EOF
11
32
  users = ["Jimi Hendrix", "Jimmy Page", "Yngwie Malmsteen", "Eric Clapton", "Kirk Hammett"].collect do |name|
@@ -20,12 +41,16 @@ append_file "db/seeds.rb", <<-EOF
20
41
  Category.create! :name => name
21
42
  end
22
43
 
44
+ published_at_values = [Time.now.utc - 5.days, Time.now.utc - 1.day, nil, Time.now.utc + 3.days]
45
+
23
46
  1_000.times do |i|
24
47
  user = users[i % users.size]
25
48
  cat = categories[i % categories.size]
49
+ published_at = published_at_values[i % published_at_values.size]
26
50
  Post.create :title => "Blog Post \#{i}",
27
51
  :body => "Blog post \#{i} is written by \#{user.username} about \#{cat.name}",
28
52
  :category => cat,
53
+ :published_at => published_at,
29
54
  :author => user
30
55
  end
31
56
  EOF
@@ -0,0 +1,5 @@
1
+ require File.expand_path('config/environments/cucumber', Rails.root)
2
+
3
+ Rails.application.class.configure do
4
+ config.cache_classes = false
5
+ end
@@ -14,4 +14,12 @@ describe ActiveAdmin do
14
14
  ActiveAdmin.default_namespace
15
15
  end
16
16
  end
17
+
18
+ %w(register register_page unload! load! routes).each do |method|
19
+ it "delegates ##{method} to application" do
20
+ ActiveAdmin.application.should_receive(method)
21
+
22
+ ActiveAdmin.send(method)
23
+ end
24
+ end
17
25
  end
@@ -39,6 +39,15 @@ describe ActiveAdmin::Application do
39
39
  application.site_title_link = "http://www.mygreatsite.com"
40
40
  application.site_title_link.should == "http://www.mygreatsite.com"
41
41
  end
42
+
43
+ it "should store the site's title image" do
44
+ application.site_title_image.should == ""
45
+ end
46
+
47
+ it "should set the site's title image" do
48
+ application.site_title_image = "http://railscasts.com/assets/episodes/stills/284-active-admin.png?1316476106"
49
+ application.site_title_image.should == "http://railscasts.com/assets/episodes/stills/284-active-admin.png?1316476106"
50
+ end
42
51
 
43
52
  it "should have a view factory" do
44
53
  application.view_factory.should be_an_instance_of(ActiveAdmin::ViewFactory)
@@ -48,8 +57,8 @@ describe ActiveAdmin::Application do
48
57
  application.admin_notes.should be_nil
49
58
  end
50
59
 
51
- it "should have admin notes in admin namespace by default" do
52
- application.allow_comments_in.should == [:admin]
60
+ it "should allow comments by default" do
61
+ application.allow_comments.should == true
53
62
  end
54
63
 
55
64
  describe "authentication settings" do
@@ -84,4 +93,41 @@ describe ActiveAdmin::Application do
84
93
  end
85
94
  end
86
95
 
96
+ describe "adding an inheritable setting" do
97
+
98
+ it "should add a setting to Application and Namespace" do
99
+ ActiveAdmin::Application.inheritable_setting :inheritable_setting, "inheritable_setting"
100
+ app = ActiveAdmin::Application.new
101
+ app.inheritable_setting.should == "inheritable_setting"
102
+ ns = ActiveAdmin::Namespace.new(app, :admin)
103
+ ns.inheritable_setting.should == "inheritable_setting"
104
+ end
105
+
106
+ end
107
+
108
+ describe "#namespace" do
109
+ it "should yield a new namespace" do
110
+ application.namespace :new_namespace do |ns|
111
+ ns.name.should == :new_namespace
112
+ end
113
+ end
114
+
115
+ it "should return an instantiated namespace" do
116
+ admin = application.find_or_create_namespace :admin
117
+ application.namespace :admin do |ns|
118
+ ns.should == admin
119
+ end
120
+ end
121
+ end
122
+
123
+ describe "#register_page" do
124
+ it "finds or create the namespace and register the page to it" do
125
+ namespace = mock
126
+ application.should_receive(:find_or_create_namespace).with("public").and_return namespace
127
+ namespace.should_receive(:register_page).with("My Page", {:namespace => "public"})
128
+
129
+ application.register_page("My Page", :namespace => "public")
130
+ end
131
+ end
132
+
87
133
  end
@@ -27,7 +27,7 @@ describe Arbre::Context do
27
27
  end
28
28
 
29
29
  it "should use a cached version of the HTML for method delegation" do
30
- current_dom_context.should_receive(:to_html).once.and_return("<h1>札幌市北区</h1>")
30
+ current_dom_context.should_receive(:to_s).once.and_return("<h1>札幌市北区</h1>")
31
31
  current_dom_context.index('<').should == 0
32
32
  current_dom_context.index('<').should == 0
33
33
  end
@@ -49,6 +49,62 @@ describe Arbre::HTML::Element, "Finder Methods" do
49
49
  end
50
50
  end
51
51
 
52
- describe "finding an element by id"
53
- describe "finding an element by a class name"
52
+ #TODO: describe "finding an element by id"
53
+
54
+ describe "finding an element by a class name" do
55
+ it "should return 0 when no elements exist" do
56
+ div.get_elements_by_class_name("my_class").size.should == 0
57
+ end
58
+ it "should return a child element" do
59
+ html = div do
60
+ div :class => "some_class"
61
+ div :class => "my_class"
62
+ end
63
+ elements = html.get_elements_by_class_name("my_class")
64
+ elements.size.should == 1
65
+ elements[0].should be_instance_of(Arbre::HTML::Div)
66
+ end
67
+
68
+ it "should return multple child elements" do
69
+ html = div do
70
+ div :class => "some_class"
71
+ div :class => "my_class"
72
+ div :class => "my_class"
73
+ end
74
+ elements = html.get_elements_by_class_name("my_class")
75
+ elements.size.should == 2
76
+ elements[0].should be_instance_of(Arbre::HTML::Div)
77
+ elements[1].should be_instance_of(Arbre::HTML::Div)
78
+ end
79
+
80
+ it "should return elements that match one of several classes" do
81
+ html = div do
82
+ div :class => "some_class this_class"
83
+ div :class => "some_class"
84
+ div :class => "other_class"
85
+
86
+ end
87
+ elements = html.get_elements_by_class_name("this_class")
88
+ elements.size.should == 1
89
+ elements[0].should be_instance_of(Arbre::HTML::Div)
90
+ end
91
+
92
+ #TODO: find children's children by class name
93
+
94
+ #it "should return elements that are nested" do
95
+ # html = div do
96
+ # div :class => "my_class"
97
+ # div :class => "some_class" do
98
+ # ul :class => "other_class" do
99
+ # li :class => "special_awesome_class"
100
+ # end
101
+ # end
102
+ # end
103
+ #
104
+ # elements = html.get_elements_by_class_name("special_awesome_class")
105
+ #
106
+ # elements.size.should == 1
107
+ # elements[0].should be_instance_of(Arbre::HTML::Li)
108
+ #end
109
+ end
54
110
  end
@@ -73,11 +73,24 @@ describe Arbre::HTML::Element do
73
73
  let(:child){ "Hello World" }
74
74
  it "should add as a TextNode" do
75
75
  element.children.first.should be_instance_of(Arbre::HTML::TextNode)
76
- element.children.first.to_html.should == "Hello World"
76
+ element.children.first.to_s.should == "Hello World"
77
77
  end
78
78
  end
79
79
  end
80
80
 
81
+ describe "#children?" do
82
+
83
+ it "returns true when a child has been added" do
84
+ element.add_child Arbre::HTML::Element.new
85
+ element.children?.should == true
86
+ end
87
+
88
+ it "returns false when no children" do
89
+ element.children?.should == false
90
+ end
91
+
92
+ end
93
+
81
94
  describe "setting the content" do
82
95
 
83
96
  context "when a string" do
@@ -90,13 +103,13 @@ describe Arbre::HTML::Element do
90
103
  end
91
104
 
92
105
  it "should add the string as a child" do
93
- element.children.first.to_html.should == "Goodbye"
106
+ element.children.first.to_s.should == "Goodbye"
94
107
  end
95
108
 
96
109
  it "should html escape the string" do
97
110
  string = "Goodbye <br />"
98
111
  element.content = string
99
- element.content.to_html.should == "Goodbye &lt;br /&gt;"
112
+ element.to_s.should == "Goodbye &lt;br /&gt;"
100
113
  end
101
114
  end
102
115
 
@@ -146,8 +159,8 @@ describe Arbre::HTML::Element do
146
159
 
147
160
  describe "rendering to html" do
148
161
  it "should render the children collection" do
149
- element.children.should_receive(:to_html).and_return("content")
150
- element.to_html.should == "content"
162
+ element.children.should_receive(:to_s).and_return("content")
163
+ element.to_s.should == "content"
151
164
  end
152
165
  end
153
166
 
@@ -14,7 +14,7 @@ describe Arbre::HTML::Tag, "Attributes" do
14
14
  end
15
15
 
16
16
  it "should render the attributes to html" do
17
- tag.to_html.should == <<-HTML
17
+ tag.to_s.should == <<-HTML
18
18
  <tag id="my_id"></tag>
19
19
  HTML
20
20
  end
@@ -47,13 +47,13 @@ HTML
47
47
  describe "rendering attributes" do
48
48
  it "should html safe the attribute values" do
49
49
  tag.set_attribute(:class, "\">bad things!")
50
- tag.to_html.should == <<-HTML
50
+ tag.to_s.should == <<-HTML
51
51
  <tag class="&quot;&gt;bad things!"></tag>
52
52
  HTML
53
53
  end
54
54
  it "should should escape the attribute names" do
55
55
  tag.set_attribute(">bad", "things")
56
- tag.to_html.should == <<-HTML
56
+ tag.to_s.should == <<-HTML
57
57
  <tag &gt;bad="things"></tag>
58
58
  HTML
59
59
  end