nsm-activeadmin 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.document +5 -0
- data/.gitignore +34 -0
- data/.travis.yml +4 -0
- data/.yardopts +8 -0
- data/CHANGELOG.rdoc +76 -0
- data/Gemfile +39 -0
- data/LICENSE +25 -0
- data/README.rdoc +487 -0
- data/Rakefile +27 -0
- data/activeadmin.gemspec +28 -0
- data/app/assets/images/active_admin/admin_notes_icon.png +0 -0
- data/app/assets/images/active_admin/datepicker/datepicker-header-bg.png +0 -0
- data/app/assets/images/active_admin/datepicker/datepicker-input-icon.png +0 -0
- data/app/assets/images/active_admin/datepicker/datepicker-next-link-icon.png +0 -0
- data/app/assets/images/active_admin/datepicker/datepicker-nipple.png +0 -0
- data/app/assets/images/active_admin/datepicker/datepicker-prev-link-icon.png +0 -0
- data/app/assets/images/active_admin/loading.gif +0 -0
- data/app/assets/images/active_admin/nested_menu_arrow.gif +0 -0
- data/app/assets/images/active_admin/nested_menu_arrow_dark.gif +0 -0
- data/app/assets/images/active_admin/orderable.png +0 -0
- data/app/assets/javascripts/active_admin/base.js +12 -0
- data/app/assets/javascripts/active_admin/vendor.js +382 -0
- data/app/assets/stylesheets/active_admin/_base.css.scss +400 -0
- data/app/assets/stylesheets/active_admin/_forms.css.scss +256 -0
- data/app/assets/stylesheets/active_admin/_header.css.scss +110 -0
- data/app/assets/stylesheets/active_admin/_mixins.css.scss +1 -0
- data/app/assets/stylesheets/active_admin/_typography.css.scss +100 -0
- data/app/assets/stylesheets/active_admin/components/_comments.css.scss +40 -0
- data/app/assets/stylesheets/active_admin/components/_date_picker.css.scss +123 -0
- data/app/assets/stylesheets/active_admin/components/_flash_messages.css.scss +38 -0
- data/app/assets/stylesheets/active_admin/mixins/_all.css.scss +8 -0
- data/app/assets/stylesheets/active_admin/mixins/_buttons.css.scss +27 -0
- data/app/assets/stylesheets/active_admin/mixins/_gradients.css.scss +29 -0
- data/app/assets/stylesheets/active_admin/mixins/_icons.css.scss +20 -0
- data/app/assets/stylesheets/active_admin/mixins/_reset.css.scss +165 -0
- data/app/assets/stylesheets/active_admin/mixins/_rounded.css.scss +43 -0
- data/app/assets/stylesheets/active_admin/mixins/_sections.css.scss +34 -0
- data/app/assets/stylesheets/active_admin/mixins/_shadows.css.scss +21 -0
- data/app/assets/stylesheets/active_admin/mixins/_variables.css.scss +21 -0
- data/app/views/active_admin/dashboard/index.html.arb +1 -0
- data/app/views/active_admin/devise/mailer/reset_password_instructions.html.erb +8 -0
- data/app/views/active_admin/devise/mailer/unlock_instructions.html.erb +7 -0
- data/app/views/active_admin/devise/passwords/edit.html.erb +16 -0
- data/app/views/active_admin/devise/passwords/new.html.erb +14 -0
- data/app/views/active_admin/devise/sessions/new.html.erb +18 -0
- data/app/views/active_admin/devise/shared/_links.erb +20 -0
- data/app/views/active_admin/devise/unlocks/new.html.erb +12 -0
- data/app/views/active_admin/resource/edit.html.arb +1 -0
- data/app/views/active_admin/resource/index.csv.erb +20 -0
- data/app/views/active_admin/resource/index.html.arb +1 -0
- data/app/views/active_admin/resource/new.html.arb +1 -0
- data/app/views/active_admin/resource/show.html.arb +1 -0
- data/app/views/layouts/active_admin.html.arb +1 -0
- data/app/views/layouts/active_admin_logged_out.html.erb +35 -0
- data/cucumber.yml +2 -0
- data/docs/1-general-configuration.md +52 -0
- data/docs/2-resource-customization.md +35 -0
- data/docs/3-index-pages.md +55 -0
- data/docs/3-index-pages/index-as-block.md +16 -0
- data/docs/3-index-pages/index-as-blog.md +61 -0
- data/docs/3-index-pages/index-as-grid.md +21 -0
- data/docs/3-index-pages/index-as-table.md +74 -0
- data/docs/4-csv-format.md +14 -0
- data/docs/5-forms.md +39 -0
- data/docs/6-show-screens.md +22 -0
- data/docs/7-sidebars.md +35 -0
- data/docs/8-custom-actions.md +123 -0
- data/features/comments/commenting.feature +112 -0
- data/features/comments/viewing_index.feature +19 -0
- data/features/dashboard.feature +26 -0
- data/features/edit_page.feature +106 -0
- data/features/first_boot.feature +16 -0
- data/features/global_navigation.feature +30 -0
- data/features/index/format_as_csv.feature +46 -0
- data/features/index/formats.feature +12 -0
- data/features/index/index_as_block.feature +15 -0
- data/features/index/index_as_blog.feature +50 -0
- data/features/index/index_as_grid.feature +45 -0
- data/features/index/index_as_table.feature +81 -0
- data/features/index/index_blank_slate.feature +55 -0
- data/features/index/index_scopes.feature +52 -0
- data/features/index/pagination.feature +17 -0
- data/features/menu.feature +26 -0
- data/features/new_page.feature +75 -0
- data/features/registering_assets.feature +35 -0
- data/features/registering_resources.feature +33 -0
- data/features/show/default_content.feature +43 -0
- data/features/show/page_title.feature +33 -0
- data/features/sidebar_sections.feature +127 -0
- data/features/specifying_actions.feature +87 -0
- data/features/step_definitions/action_item_steps.rb +7 -0
- data/features/step_definitions/additional_web_steps.rb +77 -0
- data/features/step_definitions/asset_steps.rb +7 -0
- data/features/step_definitions/attribute_steps.rb +13 -0
- data/features/step_definitions/comment_steps.rb +8 -0
- data/features/step_definitions/configuration_steps.rb +31 -0
- data/features/step_definitions/dashboard_steps.rb +11 -0
- data/features/step_definitions/factory_steps.rb +29 -0
- data/features/step_definitions/flash_steps.rb +3 -0
- data/features/step_definitions/format_steps.rb +35 -0
- data/features/step_definitions/index_scope_steps.rb +20 -0
- data/features/step_definitions/layout_steps.rb +3 -0
- data/features/step_definitions/menu_steps.rb +7 -0
- data/features/step_definitions/pagination_steps.rb +8 -0
- data/features/step_definitions/sidebar_steps.rb +7 -0
- data/features/step_definitions/tab_steps.rb +3 -0
- data/features/step_definitions/user_steps.rb +26 -0
- data/features/step_definitions/web_steps.rb +211 -0
- data/features/sti_resource.feature +61 -0
- data/features/support/env.rb +90 -0
- data/features/support/paths.rb +50 -0
- data/features/support/selectors.rb +45 -0
- data/features/users/logging_in.feature +34 -0
- data/features/users/logging_out.feature +13 -0
- data/lib/active_admin.rb +74 -0
- data/lib/active_admin/abstract_view_factory.rb +95 -0
- data/lib/active_admin/application.rb +228 -0
- data/lib/active_admin/arbre.rb +23 -0
- data/lib/active_admin/arbre/attributes.rb +20 -0
- data/lib/active_admin/arbre/class_list.rb +28 -0
- data/lib/active_admin/arbre/collection.rb +27 -0
- data/lib/active_admin/arbre/context.rb +14 -0
- data/lib/active_admin/arbre/core_extensions.rb +5 -0
- data/lib/active_admin/arbre/document.rb +42 -0
- data/lib/active_admin/arbre/element.rb +151 -0
- data/lib/active_admin/arbre/html.rb +84 -0
- data/lib/active_admin/arbre/html5_elements.rb +47 -0
- data/lib/active_admin/arbre/tag.rb +137 -0
- data/lib/active_admin/arbre/text_node.rb +35 -0
- data/lib/active_admin/asset_registration.rb +34 -0
- data/lib/active_admin/callbacks.rb +89 -0
- data/lib/active_admin/comments.rb +88 -0
- data/lib/active_admin/comments/comment.rb +21 -0
- data/lib/active_admin/comments/configuration.rb +18 -0
- data/lib/active_admin/comments/namespace_helper.rb +14 -0
- data/lib/active_admin/comments/resource_helper.rb +17 -0
- data/lib/active_admin/comments/show_page_helper.rb +23 -0
- data/lib/active_admin/comments/views.rb +3 -0
- data/lib/active_admin/comments/views/active_admin_comment.rb +0 -0
- data/lib/active_admin/comments/views/active_admin_comments.rb +82 -0
- data/lib/active_admin/component.rb +22 -0
- data/lib/active_admin/controller_action.rb +12 -0
- data/lib/active_admin/csv_builder.rb +45 -0
- data/lib/active_admin/dashboards.rb +48 -0
- data/lib/active_admin/dashboards/dashboard_controller.rb +38 -0
- data/lib/active_admin/dashboards/section.rb +34 -0
- data/lib/active_admin/deprecation.rb +36 -0
- data/lib/active_admin/devise.rb +43 -0
- data/lib/active_admin/dsl.rb +224 -0
- data/lib/active_admin/engine.rb +4 -0
- data/lib/active_admin/event.rb +31 -0
- data/lib/active_admin/form_builder.rb +109 -0
- data/lib/active_admin/helpers/optional_display.rb +34 -0
- data/lib/active_admin/helpers/settings.rb +63 -0
- data/lib/active_admin/iconic.rb +51 -0
- data/lib/active_admin/iconic/icons.rb +142 -0
- data/lib/active_admin/locales/da.yml +28 -0
- data/lib/active_admin/locales/en.yml +40 -0
- data/lib/active_admin/locales/es.yml +39 -0
- data/lib/active_admin/locales/it.yml +39 -0
- data/lib/active_admin/locales/pt-BR.yml +36 -0
- data/lib/active_admin/locales/ru.yml +40 -0
- data/lib/active_admin/locales/zh_cn.yml +40 -0
- data/lib/active_admin/menu.rb +42 -0
- data/lib/active_admin/menu_item.rb +73 -0
- data/lib/active_admin/namespace.rb +206 -0
- data/lib/active_admin/page_config.rb +15 -0
- data/lib/active_admin/reloader.rb +30 -0
- data/lib/active_admin/renderer.rb +87 -0
- data/lib/active_admin/resource.rb +151 -0
- data/lib/active_admin/resource/action_items.rb +88 -0
- data/lib/active_admin/resource/belongs_to.rb +31 -0
- data/lib/active_admin/resource/menu.rb +45 -0
- data/lib/active_admin/resource/naming.rb +36 -0
- data/lib/active_admin/resource/scopes.rb +33 -0
- data/lib/active_admin/resource/sidebars.rb +36 -0
- data/lib/active_admin/resource_controller.rb +103 -0
- data/lib/active_admin/resource_controller/action_builder.rb +21 -0
- data/lib/active_admin/resource_controller/actions.rb +79 -0
- data/lib/active_admin/resource_controller/callbacks.rb +47 -0
- data/lib/active_admin/resource_controller/collection.rb +144 -0
- data/lib/active_admin/resource_controller/filters.rb +58 -0
- data/lib/active_admin/resource_controller/form.rb +42 -0
- data/lib/active_admin/resource_controller/menu.rb +29 -0
- data/lib/active_admin/resource_controller/page_configurations.rb +53 -0
- data/lib/active_admin/resource_controller/scoping.rb +36 -0
- data/lib/active_admin/resource_controller/sidebars.rb +18 -0
- data/lib/active_admin/router.rb +85 -0
- data/lib/active_admin/sass/active_admin.scss +3 -0
- data/lib/active_admin/sass/css_loader.rb +16 -0
- data/lib/active_admin/sass/helpers.rb +40 -0
- data/lib/active_admin/scope.rb +17 -0
- data/lib/active_admin/sidebar_section.rb +41 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_utilities.scss +0 -0
- data/lib/active_admin/version.rb +3 -0
- data/lib/active_admin/view_factory.rb +23 -0
- data/lib/active_admin/view_helpers.rb +22 -0
- data/lib/active_admin/view_helpers/active_admin_application_helper.rb +12 -0
- data/lib/active_admin/view_helpers/assigns_with_indifferent_access_helper.rb +7 -0
- data/lib/active_admin/view_helpers/auto_link_helper.rb +42 -0
- data/lib/active_admin/view_helpers/breadcrumb_helper.rb +29 -0
- data/lib/active_admin/view_helpers/display_helper.rb +38 -0
- data/lib/active_admin/view_helpers/filter_form_helper.rb +186 -0
- data/lib/active_admin/view_helpers/form_helper.rb +13 -0
- data/lib/active_admin/view_helpers/icon_helper.rb +12 -0
- data/lib/active_admin/view_helpers/method_or_proc_helper.rb +26 -0
- data/lib/active_admin/view_helpers/renderer_helper.rb +29 -0
- data/lib/active_admin/view_helpers/sidebar_helper.rb +15 -0
- data/lib/active_admin/view_helpers/title_helper.rb +11 -0
- data/lib/active_admin/view_helpers/view_factory_helper.rb +11 -0
- data/lib/active_admin/views.rb +8 -0
- data/lib/active_admin/views/action_items.rb +17 -0
- data/lib/active_admin/views/components/attributes_table.rb +66 -0
- data/lib/active_admin/views/components/blank_slate.rb +33 -0
- data/lib/active_admin/views/components/columns.rb +47 -0
- data/lib/active_admin/views/components/paginated_collection.rb +92 -0
- data/lib/active_admin/views/components/panel.rb +26 -0
- data/lib/active_admin/views/components/scopes.rb +70 -0
- data/lib/active_admin/views/components/sidebar_section.rb +28 -0
- data/lib/active_admin/views/components/status_tag.rb +55 -0
- data/lib/active_admin/views/components/table_for.rb +193 -0
- data/lib/active_admin/views/dashboard_section_renderer.rb +19 -0
- data/lib/active_admin/views/header_renderer.rb +53 -0
- data/lib/active_admin/views/index_as_block.rb +29 -0
- data/lib/active_admin/views/index_as_blog.rb +129 -0
- data/lib/active_admin/views/index_as_grid.rb +70 -0
- data/lib/active_admin/views/index_as_table.rb +148 -0
- data/lib/active_admin/views/pages/base.rb +155 -0
- data/lib/active_admin/views/pages/dashboard.rb +62 -0
- data/lib/active_admin/views/pages/edit.rb +28 -0
- data/lib/active_admin/views/pages/index.rb +74 -0
- data/lib/active_admin/views/pages/layout.rb +26 -0
- data/lib/active_admin/views/pages/new.rb +28 -0
- data/lib/active_admin/views/pages/show.rb +56 -0
- data/lib/active_admin/views/tabs_renderer.rb +58 -0
- data/lib/activeadmin.rb +1 -0
- data/lib/generators/active_admin/assets/assets_generator.rb +21 -0
- data/lib/generators/active_admin/assets/templates/3.0/active_admin.js +427 -0
- data/lib/generators/active_admin/assets/templates/3.1/active_admin.css.scss +6 -0
- data/lib/generators/active_admin/assets/templates/3.1/active_admin.js +1 -0
- data/lib/generators/active_admin/assets/templates/dashboards.rb +36 -0
- data/lib/generators/active_admin/devise/devise_generator.rb +49 -0
- data/lib/generators/active_admin/install/install_generator.rb +44 -0
- data/lib/generators/active_admin/install/templates/active_admin.rb.erb +93 -0
- data/lib/generators/active_admin/install/templates/dashboards.rb +38 -0
- data/lib/generators/active_admin/install/templates/migrations/1_create_admin_notes.rb +16 -0
- data/lib/generators/active_admin/install/templates/migrations/2_move_admin_notes_to_comments.rb +25 -0
- data/lib/generators/active_admin/resource/resource_generator.rb +16 -0
- data/lib/generators/active_admin/resource/templates/admin.rb +3 -0
- data/script/local +44 -0
- data/script/use_rails +45 -0
- data/spec/integration/belongs_to_spec.rb +42 -0
- data/spec/integration/default_namespace.rb +77 -0
- data/spec/integration/javascript_spec.rb +20 -0
- data/spec/integration/stylesheets_spec.rb +41 -0
- data/spec/spec_helper.rb +157 -0
- data/spec/support/detect_rails_version.rb +11 -0
- data/spec/support/integration_example_group.rb +33 -0
- data/spec/support/jslint.yml +80 -0
- data/spec/support/rails_template.rb +32 -0
- data/spec/support/rails_template_with_data.rb +33 -0
- data/spec/support/templates/cucumber.rb +24 -0
- data/spec/unit/abstract_view_factory_spec.rb +79 -0
- data/spec/unit/action_builder_spec.rb +88 -0
- data/spec/unit/application_spec.rb +78 -0
- data/spec/unit/arbre/html/context_spec.rb +22 -0
- data/spec/unit/arbre/html/element_finder_methods_spec.rb +54 -0
- data/spec/unit/arbre/html/element_spec.rb +224 -0
- data/spec/unit/arbre/html/tag_attributes_spec.rb +61 -0
- data/spec/unit/arbre/html/tag_spec.rb +63 -0
- data/spec/unit/arbre/html_spec.rb +210 -0
- data/spec/unit/asset_registration_spec.rb +37 -0
- data/spec/unit/auto_link_spec.rb +39 -0
- data/spec/unit/belongs_to_spec.rb +45 -0
- data/spec/unit/breadcrumbs_spec.rb +110 -0
- data/spec/unit/comments_spec.rb +57 -0
- data/spec/unit/component_spec.rb +18 -0
- data/spec/unit/controller_filters_spec.rb +34 -0
- data/spec/unit/csv_builder_spec.rb +83 -0
- data/spec/unit/dashboard_controller_spec.rb +26 -0
- data/spec/unit/dashboard_section_spec.rb +56 -0
- data/spec/unit/dashboards_spec.rb +59 -0
- data/spec/unit/display_name_spec.rb +29 -0
- data/spec/unit/event_spec.rb +41 -0
- data/spec/unit/filter_form_builder_spec.rb +182 -0
- data/spec/unit/form_builder_spec.rb +239 -0
- data/spec/unit/generators/install_rails_3_1_spec.rb +16 -0
- data/spec/unit/helpers/settings_spec.rb +30 -0
- data/spec/unit/menu_item_spec.rb +143 -0
- data/spec/unit/menu_spec.rb +53 -0
- data/spec/unit/namespace_spec.rb +214 -0
- data/spec/unit/pretty_format_spec.rb +35 -0
- data/spec/unit/rails_spec.rb +43 -0
- data/spec/unit/registration_spec.rb +76 -0
- data/spec/unit/reloader_spec.rb +28 -0
- data/spec/unit/renderer_spec.rb +108 -0
- data/spec/unit/resource/action_items_spec.rb +62 -0
- data/spec/unit/resource/menu_spec.rb +80 -0
- data/spec/unit/resource/naming_spec.rb +56 -0
- data/spec/unit/resource/scopes_spec.rb +30 -0
- data/spec/unit/resource/sidebars_spec.rb +50 -0
- data/spec/unit/resource_controller/collection_spec.rb +34 -0
- data/spec/unit/resource_controller_spec.rb +152 -0
- data/spec/unit/resource_spec.rb +260 -0
- data/spec/unit/routing_spec.rb +88 -0
- data/spec/unit/sass/helpers_spec.rb +47 -0
- data/spec/unit/scope_spec.rb +31 -0
- data/spec/unit/tabs_renderer_spec.rb +85 -0
- data/spec/unit/view_factory_spec.rb +19 -0
- data/spec/unit/views/components/attributes_table_spec.rb +100 -0
- data/spec/unit/views/components/blank_slate_spec.rb +31 -0
- data/spec/unit/views/components/columns_spec.rb +75 -0
- data/spec/unit/views/components/panel_spec.rb +31 -0
- data/spec/unit/views/components/sidebar_section_spec.rb +37 -0
- data/spec/unit/views/components/status_tag_spec.rb +81 -0
- data/spec/unit/views/components/table_for_spec.rb +130 -0
- data/spec/unit/views/pages/layout_spec.rb +22 -0
- data/tasks/docs.rake +39 -0
- data/tasks/test.rake +49 -0
- data/tasks/yard.rake +6 -0
- metadata +510 -0
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Use the default
|
|
2
|
+
apply File.expand_path("../rails_template.rb", __FILE__)
|
|
3
|
+
|
|
4
|
+
# Register Active Admin controllers
|
|
5
|
+
%w{ Post User Category }.each do |type|
|
|
6
|
+
generate :'active_admin:resource', type
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
# Setup some default data
|
|
10
|
+
append_file "db/seeds.rb", <<-EOF
|
|
11
|
+
users = ["Jimi Hendrix", "Jimmy Page", "Yngwie Malmsteen", "Eric Clapton", "Kirk Hammett"].collect do |name|
|
|
12
|
+
first, last = name.split(" ")
|
|
13
|
+
User.create! :first_name => first,
|
|
14
|
+
:last_name => last,
|
|
15
|
+
:username => [first,last].join('-').downcase,
|
|
16
|
+
:age => rand(80)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
categories = ["Rock", "Pop Rock", "Alt-Country", "Blues", "Dub-Step"].collect do |name|
|
|
20
|
+
Category.create! :name => name
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
1_000.times do |i|
|
|
24
|
+
user = users[i % users.size]
|
|
25
|
+
cat = categories[i % categories.size]
|
|
26
|
+
Post.create :title => "Blog Post \#{i}",
|
|
27
|
+
:body => "Blog post \#{i} is written by \#{user.username} about \#{cat.name}",
|
|
28
|
+
:category => cat,
|
|
29
|
+
:author => user
|
|
30
|
+
end
|
|
31
|
+
EOF
|
|
32
|
+
|
|
33
|
+
rake 'db:seed'
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
require File.expand_path('config/environments/test', Rails.root)
|
|
2
|
+
|
|
3
|
+
# rails/railties/lib/rails/test_help.rb aborts if the environment is not 'test'. (Rails 3.0.0.beta3)
|
|
4
|
+
# We can't run Cucumber/RSpec/Test_Unit tests in different environments then.
|
|
5
|
+
#
|
|
6
|
+
# For now, I patch StringInquirer so that Rails.env.test? returns true when Rails.env is 'test' or 'cucumber'
|
|
7
|
+
#
|
|
8
|
+
# https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/4458-rails-should-allow-test-to-run-in-cucumber-environment
|
|
9
|
+
module ActiveSupport
|
|
10
|
+
class StringInquirer < String
|
|
11
|
+
def method_missing(method_name, *arguments)
|
|
12
|
+
if method_name.to_s[-1,1] == "?"
|
|
13
|
+
test_string = method_name.to_s[0..-2]
|
|
14
|
+
if test_string == 'test'
|
|
15
|
+
self == 'test' or self == 'cucumber'
|
|
16
|
+
else
|
|
17
|
+
self == test_string
|
|
18
|
+
end
|
|
19
|
+
else
|
|
20
|
+
super
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
require 'active_admin/abstract_view_factory'
|
|
4
|
+
|
|
5
|
+
describe ActiveAdmin::AbstractViewFactory do
|
|
6
|
+
|
|
7
|
+
let(:view_factory){ ActiveAdmin::AbstractViewFactory.new }
|
|
8
|
+
let(:mock_view){ Class.new }
|
|
9
|
+
|
|
10
|
+
describe "registering a new view key" do
|
|
11
|
+
before do
|
|
12
|
+
view_factory.register :my_new_view_class => mock_view
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it "should respond to :my_new_view_class" do
|
|
16
|
+
view_factory.respond_to?(:my_new_view_class)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it "should respond to :my_new_view_class=" do
|
|
20
|
+
view_factory.respond_to?(:my_new_view_class=)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
it "should generate a getter method" do
|
|
24
|
+
view_factory.my_new_view_class.should == mock_view
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
it "should be settable view a setter method" do
|
|
28
|
+
view_factory.my_new_view_class = "Some Obj"
|
|
29
|
+
view_factory.my_new_view_class.should == "Some Obj"
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
describe "array syntax access" do
|
|
34
|
+
before do
|
|
35
|
+
view_factory.register :my_new_view_class => mock_view
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
it "should be available through array syntax" do
|
|
39
|
+
view_factory[:my_new_view_class].should == mock_view
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
it "should be settable through array syntax" do
|
|
43
|
+
view_factory[:my_new_view_class] = "My New View Class"
|
|
44
|
+
view_factory[:my_new_view_class].should == "My New View Class"
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
describe "registering default views" do
|
|
49
|
+
before do
|
|
50
|
+
ActiveAdmin::AbstractViewFactory.register :my_default_view_class => mock_view
|
|
51
|
+
end
|
|
52
|
+
it "should generate a getter method" do
|
|
53
|
+
view_factory.my_default_view_class.should == mock_view
|
|
54
|
+
end
|
|
55
|
+
it "should be settable view a setter method and not change default" do
|
|
56
|
+
view_factory.my_default_view_class = "Some Obj"
|
|
57
|
+
view_factory.my_default_view_class.should == "Some Obj"
|
|
58
|
+
view_factory.default_for(:my_default_view_class).should == mock_view
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
describe "subclassing the ViewFactory" do
|
|
63
|
+
let(:subclass) do
|
|
64
|
+
ActiveAdmin::AbstractViewFactory.register :my_subclassed_view => "From Parent"
|
|
65
|
+
Class.new(ActiveAdmin::AbstractViewFactory) do
|
|
66
|
+
def my_subclassed_view
|
|
67
|
+
"From Subclass"
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
it "should use the subclass implementation" do
|
|
73
|
+
factory = subclass.new
|
|
74
|
+
factory.my_subclassed_view.should == "From Subclass"
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
end
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe 'defining new actions from registration blocks' do
|
|
4
|
+
|
|
5
|
+
let(:controller){ Admin::PostsController }
|
|
6
|
+
|
|
7
|
+
describe "generating a new member action" do
|
|
8
|
+
before do
|
|
9
|
+
action!
|
|
10
|
+
reload_routes!
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
after(:each) do
|
|
14
|
+
controller.clear_member_actions!
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
context "with a block" do
|
|
18
|
+
let(:action!) do
|
|
19
|
+
ActiveAdmin.register Post do
|
|
20
|
+
member_action :comment do
|
|
21
|
+
# Do nothing
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it "should create a new public instance method" do
|
|
27
|
+
controller.public_instance_methods.collect(&:to_s).should include("comment")
|
|
28
|
+
end
|
|
29
|
+
it "should add itself to the member actions config" do
|
|
30
|
+
controller.active_admin_config.member_actions.size.should == 1
|
|
31
|
+
end
|
|
32
|
+
it "should create a new named route" do
|
|
33
|
+
Rails.application.routes.url_helpers.methods.collect(&:to_s).should include("comment_admin_post_path")
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
context "without a block" do
|
|
38
|
+
let(:action!) do
|
|
39
|
+
ActiveAdmin.register Post do
|
|
40
|
+
member_action :comment
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
it "should still generate a new empty action" do
|
|
44
|
+
controller.public_instance_methods.collect(&:to_s).should include("comment")
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
describe "generate a new collection action" do
|
|
50
|
+
before do
|
|
51
|
+
action!
|
|
52
|
+
reload_routes!
|
|
53
|
+
end
|
|
54
|
+
after(:each) do
|
|
55
|
+
controller.clear_collection_actions!
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
context "with a block" do
|
|
59
|
+
let(:action!) do
|
|
60
|
+
ActiveAdmin.register Post do
|
|
61
|
+
collection_action :comments do
|
|
62
|
+
# Do nothing
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
it "should create a new public instance method" do
|
|
67
|
+
controller.public_instance_methods.collect(&:to_s).should include("comments")
|
|
68
|
+
end
|
|
69
|
+
it "should add itself to the member actions config" do
|
|
70
|
+
controller.active_admin_config.collection_actions.size.should == 1
|
|
71
|
+
end
|
|
72
|
+
it "should create a new named route" do
|
|
73
|
+
Rails.application.routes.url_helpers.methods.collect(&:to_s).should include("comments_admin_posts_path")
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
context "without a block" do
|
|
77
|
+
let(:action!) do
|
|
78
|
+
ActiveAdmin.register Post do
|
|
79
|
+
collection_action :comments
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
it "should still generate a new empty action" do
|
|
83
|
+
controller.public_instance_methods.collect(&:to_s).should include("comments")
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
end
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'fileutils'
|
|
3
|
+
|
|
4
|
+
describe ActiveAdmin::Application do
|
|
5
|
+
|
|
6
|
+
let(:application) do
|
|
7
|
+
ActiveAdmin::Application.new.tap do |app|
|
|
8
|
+
# Manually override the load paths becuase RSpec messes these up
|
|
9
|
+
app.load_paths = [File.expand_path('app/admin', Rails.root)]
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
it "should have a default load path of ['app/admin']" do
|
|
14
|
+
application.load_paths.should == [File.expand_path('app/admin', Rails.root)]
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
it "should remove app/admin from the autoload path to remove the possibility of conflicts" do
|
|
18
|
+
ActiveSupport::Dependencies.autoload_paths.should_not include(File.join(Rails.root, "app/admin"))
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
it "should remove app/admin from the eager load paths (Active Admin deals with loading)" do
|
|
22
|
+
Rails.application.config.eager_load_paths.should_not include(File.join(Rails.root, "app/admin"))
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it "should store the site's title" do
|
|
26
|
+
application.site_title.should == ""
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it "should set the site title" do
|
|
30
|
+
application.site_title = "New Title"
|
|
31
|
+
application.site_title.should == "New Title"
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
it "should have a view factory" do
|
|
35
|
+
application.view_factory.should be_an_instance_of(ActiveAdmin::ViewFactory)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
it "should have deprecated admin notes by default" do
|
|
39
|
+
application.admin_notes.should be_nil
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
it "should have admin notes in admin namespace by default" do
|
|
43
|
+
application.allow_comments_in.should == [:admin]
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
describe "authentication settings" do
|
|
47
|
+
|
|
48
|
+
it "should have no default current_user_method" do
|
|
49
|
+
application.current_user_method.should == false
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
it "should have no default authentication method" do
|
|
53
|
+
application.authentication_method.should == false
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
it "should have a logout link path" do
|
|
57
|
+
application.logout_link_path.should == :destroy_admin_user_session_path
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
it "should have a logout link method" do
|
|
61
|
+
application.logout_link_method.should == :delete
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
describe "files in load path" do
|
|
66
|
+
it "should load files in the first level directory" do
|
|
67
|
+
application.files_in_load_path.should include(File.expand_path("app/admin/dashboards.rb", Rails.root))
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
it "should load files from subdirectories" do
|
|
71
|
+
FileUtils.mkdir_p(File.expand_path("app/admin/public", Rails.root))
|
|
72
|
+
test_file = File.expand_path("app/admin/public/posts.rb", Rails.root)
|
|
73
|
+
FileUtils.touch(test_file)
|
|
74
|
+
application.files_in_load_path.should include(test_file)
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Arbre::Context do
|
|
4
|
+
include Arbre::HTML
|
|
5
|
+
let(:assigns){ {} }
|
|
6
|
+
|
|
7
|
+
before do
|
|
8
|
+
h1 # Add some HTML to the context
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
it "should return a bytesize" do
|
|
12
|
+
current_dom_context.bytesize.should == 10
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it "should return a length" do
|
|
16
|
+
current_dom_context.length.should == 10
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it "should not increment the indent_level" do
|
|
20
|
+
current_dom_context.indent_level.should == -1
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Arbre::HTML::Element, "Finder Methods" do
|
|
4
|
+
include Arbre::HTML
|
|
5
|
+
let(:assigns){ {} }
|
|
6
|
+
|
|
7
|
+
describe "finding elements by tag name" do
|
|
8
|
+
|
|
9
|
+
it "should return 0 when no elements exist" do
|
|
10
|
+
div.get_elements_by_tag_name("li").size.should == 0
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
it "should return a child element" do
|
|
14
|
+
html = div do
|
|
15
|
+
ul
|
|
16
|
+
li
|
|
17
|
+
ul
|
|
18
|
+
end
|
|
19
|
+
elements = html.get_elements_by_tag_name("li")
|
|
20
|
+
elements.size.should == 1
|
|
21
|
+
elements[0].should be_instance_of(Arbre::HTML::Li)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it "should return multple child elements" do
|
|
25
|
+
html = div do
|
|
26
|
+
ul
|
|
27
|
+
li
|
|
28
|
+
ul
|
|
29
|
+
li
|
|
30
|
+
end
|
|
31
|
+
elements = html.get_elements_by_tag_name("li")
|
|
32
|
+
elements.size.should == 2
|
|
33
|
+
elements[0].should be_instance_of(Arbre::HTML::Li)
|
|
34
|
+
elements[1].should be_instance_of(Arbre::HTML::Li)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
it "should return children's child elements" do
|
|
38
|
+
html = div do
|
|
39
|
+
ul
|
|
40
|
+
li do
|
|
41
|
+
li
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
elements = html.get_elements_by_tag_name("li")
|
|
45
|
+
elements.size.should == 2
|
|
46
|
+
elements[0].should be_instance_of(Arbre::HTML::Li)
|
|
47
|
+
elements[1].should be_instance_of(Arbre::HTML::Li)
|
|
48
|
+
elements[1].parent.should == elements[0]
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
describe "finding an element by id"
|
|
53
|
+
describe "finding an element by a class name"
|
|
54
|
+
end
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'active_admin/arbre/element'
|
|
3
|
+
|
|
4
|
+
describe Arbre::HTML::Element do
|
|
5
|
+
include Arbre::HTML
|
|
6
|
+
|
|
7
|
+
let(:assigns){ {} }
|
|
8
|
+
let(:element){ Arbre::HTML::Element.new }
|
|
9
|
+
|
|
10
|
+
context "when initialized" do
|
|
11
|
+
it "should have no children" do
|
|
12
|
+
element.children.should be_empty
|
|
13
|
+
end
|
|
14
|
+
it "should have no parent" do
|
|
15
|
+
element.parent.should be_nil
|
|
16
|
+
end
|
|
17
|
+
it "should have no document" do
|
|
18
|
+
element.document.should be_nil
|
|
19
|
+
end
|
|
20
|
+
it "should respond to the HTML builder methods" do
|
|
21
|
+
element.should respond_to(:span)
|
|
22
|
+
end
|
|
23
|
+
it "should have a set of local assigns" do
|
|
24
|
+
element = Arbre::HTML::Element.new :hello => "World"
|
|
25
|
+
element.assigns[:hello].should == "World"
|
|
26
|
+
end
|
|
27
|
+
it "should have an empty hash with no local assigns" do
|
|
28
|
+
element.assigns.should == {}
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
describe "passing in a helper object" do
|
|
33
|
+
let(:element){ Arbre::HTML::Element.new(nil, action_view) }
|
|
34
|
+
it "should call methods on the helper object and return TextNode objects" do
|
|
35
|
+
element.content_tag(:div).should == "<div></div>"
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
it "should raise a NoMethodError if not found" do
|
|
39
|
+
lambda {
|
|
40
|
+
element.a_method_that_doesnt_exist
|
|
41
|
+
}.should raise_error(NoMethodError)
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
describe "passing in assigns" do
|
|
46
|
+
let(:assigns){ {:post => Post.new(:title => "Hello")} }
|
|
47
|
+
it "should be accessible via a method call" do
|
|
48
|
+
post.should be_an_instance_of(Post)
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
describe "adding a child" do
|
|
53
|
+
let(:child){ Arbre::HTML::Element.new }
|
|
54
|
+
before do
|
|
55
|
+
element.add_child child
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
it "should add the child to the parent" do
|
|
59
|
+
element.children.first.should == child
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
it "should set the parent of the child" do
|
|
63
|
+
child.parent.should == element
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
context "when the child is nil" do
|
|
67
|
+
let(:child){ nil }
|
|
68
|
+
it "should not add the child" do
|
|
69
|
+
element.children.should be_empty
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
context "when the child is a string" do
|
|
74
|
+
let(:child){ "Hello World" }
|
|
75
|
+
it "should add as a TextNode" do
|
|
76
|
+
element.children.first.should be_instance_of(Arbre::HTML::TextNode)
|
|
77
|
+
element.children.first.to_html.should == "Hello World"
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
describe "setting the content" do
|
|
83
|
+
|
|
84
|
+
context "when a string" do
|
|
85
|
+
before do
|
|
86
|
+
element.add_child "Hello World"
|
|
87
|
+
element.content = "Goodbye"
|
|
88
|
+
end
|
|
89
|
+
it "should clear the existing children" do
|
|
90
|
+
element.children.size.should == 1
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
it "should add the string as a child" do
|
|
94
|
+
element.children.first.to_html.should == "Goodbye"
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
it "should html escape the string" do
|
|
98
|
+
string = "Goodbye <br />"
|
|
99
|
+
element.content = string
|
|
100
|
+
element.content.to_html.should == "Goodbye <br />"
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
context "when a tag" do
|
|
105
|
+
before do
|
|
106
|
+
element.content = h2("Hello")
|
|
107
|
+
end
|
|
108
|
+
it "should set the content tag" do
|
|
109
|
+
element.children.first.should be_an_instance_of(Arbre::HTML::H2)
|
|
110
|
+
end
|
|
111
|
+
it "should set the tags parent" do
|
|
112
|
+
element.children.first.parent.should == element
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
context "when an array of tags" do
|
|
117
|
+
before do
|
|
118
|
+
element.content = [ul,div]
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
it "should set the content tag" do
|
|
122
|
+
element.children.first.should be_an_instance_of(Arbre::HTML::Ul)
|
|
123
|
+
end
|
|
124
|
+
it "should set the tags parent" do
|
|
125
|
+
element.children.first.parent.should == element
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
describe "setting the parent" do
|
|
132
|
+
let(:parent) do
|
|
133
|
+
doc = Arbre::HTML::Document.new
|
|
134
|
+
parent = Arbre::HTML::Element.new
|
|
135
|
+
doc << parent
|
|
136
|
+
parent
|
|
137
|
+
end
|
|
138
|
+
before { element.parent = parent }
|
|
139
|
+
|
|
140
|
+
it "should set the parent" do
|
|
141
|
+
element.parent.should == parent
|
|
142
|
+
end
|
|
143
|
+
it "should set the document to the parent's document" do
|
|
144
|
+
element.document.should == parent.document
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
describe "rendering to html" do
|
|
149
|
+
it "should render the children collection" do
|
|
150
|
+
element.children.should_receive(:to_html).and_return("content")
|
|
151
|
+
element.to_html.should == "content"
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
describe "adding elements together" do
|
|
156
|
+
|
|
157
|
+
context "when both elements are tags" do
|
|
158
|
+
let(:collection){ h1 + h2}
|
|
159
|
+
|
|
160
|
+
it "should return an instance of Collection" do
|
|
161
|
+
collection.should be_an_instance_of(Arbre::HTML::Collection)
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
it "should return the elements in the collection" do
|
|
165
|
+
collection.size.should == 2
|
|
166
|
+
collection.first.should be_an_instance_of(Arbre::HTML::H1)
|
|
167
|
+
collection[1].should be_an_instance_of(Arbre::HTML::H2)
|
|
168
|
+
end
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
context "when the left is a collection and the right is a tag" do
|
|
172
|
+
let(:collection){ Arbre::HTML::Collection.new([h1, h2]) + h3}
|
|
173
|
+
|
|
174
|
+
it "should return an instance of Collection" do
|
|
175
|
+
collection.should be_an_instance_of(Arbre::HTML::Collection)
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
it "should return the elements in the collection flattened" do
|
|
179
|
+
collection.size.should == 3
|
|
180
|
+
collection[0].should be_an_instance_of(Arbre::HTML::H1)
|
|
181
|
+
collection[1].should be_an_instance_of(Arbre::HTML::H2)
|
|
182
|
+
collection[2].should be_an_instance_of(Arbre::HTML::H3)
|
|
183
|
+
end
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
context "when the right is a collection and the left is a tag" do
|
|
187
|
+
let(:collection){ h1 + Arbre::HTML::Collection.new([h2,h3]) }
|
|
188
|
+
|
|
189
|
+
it "should return an instance of Collection" do
|
|
190
|
+
collection.should be_an_instance_of(Arbre::HTML::Collection)
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
it "should return the elements in the collection flattened" do
|
|
194
|
+
collection.size.should == 3
|
|
195
|
+
collection[0].should be_an_instance_of(Arbre::HTML::H1)
|
|
196
|
+
collection[1].should be_an_instance_of(Arbre::HTML::H2)
|
|
197
|
+
collection[2].should be_an_instance_of(Arbre::HTML::H3)
|
|
198
|
+
end
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
context "when the left is a tag and the right is a string" do
|
|
202
|
+
let(:collection){ h1 + "Hello World"}
|
|
203
|
+
|
|
204
|
+
it "should return an instance of Collection" do
|
|
205
|
+
collection.should be_an_instance_of(Arbre::HTML::Collection)
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
it "should return the elements in the collection" do
|
|
209
|
+
collection.size.should == 2
|
|
210
|
+
collection[0].should be_an_instance_of(Arbre::HTML::H1)
|
|
211
|
+
collection[1].should be_an_instance_of(Arbre::HTML::TextNode)
|
|
212
|
+
end
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
context "when the left is a string and the right is a tag" do
|
|
216
|
+
let(:collection){ "hello World" + h1}
|
|
217
|
+
|
|
218
|
+
it "should return a string" do
|
|
219
|
+
collection.strip.chomp.should == "hello World<h1></h1>"
|
|
220
|
+
end
|
|
221
|
+
end
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
end
|