saulolso-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 +32 -0
- data/.travis.yml +4 -0
- data/CHANGELOG.rdoc +76 -0
- data/Gemfile +26 -0
- data/LICENSE +25 -0
- data/README.rdoc +450 -0
- data/Rakefile +100 -0
- data/activeadmin.gemspec +28 -0
- data/cucumber.yml +2 -0
- data/features/comments/commenting.feature +99 -0
- data/features/comments/viewing_index.feature +19 -0
- data/features/dashboard.feature +26 -0
- data/features/edit_page.feature +77 -0
- data/features/first_boot.feature +16 -0
- data/features/global_navigation.feature +30 -0
- data/features/index/format_as_csv.feature +45 -0
- data/features/index/formats.feature +10 -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 +79 -0
- data/features/index/index_scopes.feature +52 -0
- data/features/index/pagination.feature +23 -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 +60 -0
- data/features/step_definitions/action_item_steps.rb +7 -0
- data/features/step_definitions/additional_web_steps.rb +67 -0
- data/features/step_definitions/asset_steps.rb +7 -0
- data/features/step_definitions/attribute_steps.rb +15 -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 +28 -0
- data/features/step_definitions/flash_steps.rb +3 -0
- data/features/step_definitions/format_steps.rb +34 -0
- data/features/step_definitions/index_scope_steps.rb +20 -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 +11 -0
- data/features/step_definitions/tab_steps.rb +3 -0
- data/features/step_definitions/user_steps.rb +20 -0
- data/features/step_definitions/web_steps.rb +219 -0
- data/features/sti_resource.feature +49 -0
- data/features/support/env.rb +92 -0
- data/features/support/paths.rb +48 -0
- data/features/users/logging_in.feature +34 -0
- data/features/users/logging_out.feature +13 -0
- data/lib/active_admin/abstract_view_factory.rb +95 -0
- data/lib/active_admin/action_items.rb +37 -0
- data/lib/active_admin/application.rb +204 -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 +8 -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/arbre.rb +23 -0
- data/lib/active_admin/asset_registration.rb +34 -0
- data/lib/active_admin/callbacks.rb +87 -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/active_admin_comment.rb +0 -0
- data/lib/active_admin/comments/views/active_admin_comments.rb +82 -0
- data/lib/active_admin/comments/views.rb +3 -0
- data/lib/active_admin/comments.rb +88 -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/dashboard_controller.rb +47 -0
- data/lib/active_admin/dashboards/section.rb +34 -0
- data/lib/active_admin/dashboards.rb +48 -0
- data/lib/active_admin/devise.rb +43 -0
- data/lib/active_admin/dsl.rb +215 -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/iconic/icons.rb +142 -0
- data/lib/active_admin/iconic.rb +51 -0
- data/lib/active_admin/locales/da.yml +26 -0
- data/lib/active_admin/locales/en.yml +34 -0
- data/lib/active_admin/locales/es.yml +34 -0
- data/lib/active_admin/locales/pt.yml +34 -0
- data/lib/active_admin/menu.rb +42 -0
- data/lib/active_admin/menu_item.rb +73 -0
- data/lib/active_admin/namespace.rb +198 -0
- data/lib/active_admin/page_config.rb +15 -0
- data/lib/active_admin/renderer.rb +87 -0
- data/lib/active_admin/resource/belongs_to.rb +31 -0
- data/lib/active_admin/resource.rb +229 -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 +38 -0
- data/lib/active_admin/resource_controller.rb +119 -0
- data/lib/active_admin/router.rb +85 -0
- data/lib/active_admin/scope.rb +17 -0
- data/lib/active_admin/sidebar.rb +43 -0
- data/lib/active_admin/stylesheets/active_admin/_comments.scss +40 -0
- data/lib/active_admin/stylesheets/active_admin/_flash_messages.scss +13 -0
- data/lib/active_admin/stylesheets/active_admin/_forms.scss +168 -0
- data/lib/active_admin/stylesheets/active_admin/_header.scss +108 -0
- data/lib/active_admin/stylesheets/active_admin/_typography.scss +100 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_all.scss +8 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_buttons.scss +27 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_gradients.scss +21 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_icons.scss +20 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_reset.scss +165 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_rounded.scss +43 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_sections.scss +27 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_shadows.scss +21 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_variables.scss +12 -0
- data/lib/active_admin/stylesheets/active_admin.scss +429 -0
- data/lib/active_admin/version.rb +3 -0
- data/lib/active_admin/view_factory.rb +21 -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 +185 -0
- data/lib/active_admin/view_helpers/form_helper.rb +12 -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/table_helper.rb +12 -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/view_helpers.rb +23 -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/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 +30 -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 +37 -0
- data/lib/active_admin/views/index_as_block.rb +24 -0
- data/lib/active_admin/views/index_as_blog.rb +89 -0
- data/lib/active_admin/views/index_as_grid.rb +49 -0
- data/lib/active_admin/views/index_as_table.rb +75 -0
- data/lib/active_admin/views/pages/base.rb +144 -0
- data/lib/active_admin/views/pages/dashboard.rb +59 -0
- data/lib/active_admin/views/pages/edit.rb +27 -0
- data/lib/active_admin/views/pages/index.rb +66 -0
- data/lib/active_admin/views/pages/new.rb +27 -0
- data/lib/active_admin/views/pages/show.rb +56 -0
- data/lib/active_admin/views/tabs_renderer.rb +58 -0
- data/lib/active_admin/views/templates/active_admin/dashboard/index.html.arb +1 -0
- data/lib/active_admin/views/templates/active_admin/devise/mailer/reset_password_instructions.html.erb +8 -0
- data/lib/active_admin/views/templates/active_admin/devise/mailer/unlock_instructions.html.erb +7 -0
- data/lib/active_admin/views/templates/active_admin/devise/passwords/edit.html.erb +16 -0
- data/lib/active_admin/views/templates/active_admin/devise/passwords/new.html.erb +14 -0
- data/lib/active_admin/views/templates/active_admin/devise/sessions/new.html.erb +18 -0
- data/lib/active_admin/views/templates/active_admin/devise/shared/_links.erb +20 -0
- data/lib/active_admin/views/templates/active_admin/devise/unlocks/new.html.erb +12 -0
- data/lib/active_admin/views/templates/active_admin/resource/edit.html.arb +1 -0
- data/lib/active_admin/views/templates/active_admin/resource/index.csv.erb +20 -0
- data/lib/active_admin/views/templates/active_admin/resource/index.html.arb +1 -0
- data/lib/active_admin/views/templates/active_admin/resource/new.html.arb +1 -0
- data/lib/active_admin/views/templates/active_admin/resource/show.html.arb +1 -0
- data/lib/active_admin/views/templates/layouts/active_admin.html.erb +39 -0
- data/lib/active_admin/views/templates/layouts/active_admin_logged_out.html.erb +31 -0
- data/lib/active_admin/views.rb +8 -0
- data/lib/active_admin.rb +71 -0
- data/lib/activeadmin.rb +1 -0
- data/lib/generators/active_admin/devise/devise_generator.rb +49 -0
- data/lib/generators/active_admin/install/install_generator.rb +46 -0
- data/lib/generators/active_admin/install/templates/active_admin.js +51 -0
- data/lib/generators/active_admin/install/templates/active_admin.rb.erb +78 -0
- data/lib/generators/active_admin/install/templates/active_admin_vendor.js +382 -0
- data/lib/generators/active_admin/install/templates/dashboards.rb +38 -0
- data/lib/generators/active_admin/install/templates/images/admin_notes_icon.png +0 -0
- data/lib/generators/active_admin/install/templates/images/loading.gif +0 -0
- data/lib/generators/active_admin/install/templates/images/nested_menu_arrow.gif +0 -0
- data/lib/generators/active_admin/install/templates/images/nested_menu_arrow_dark.gif +0 -0
- data/lib/generators/active_admin/install/templates/images/orderable.png +0 -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/spec/integration/belongs_to_spec.rb +42 -0
- data/spec/spec_helper.rb +156 -0
- data/spec/support/integration_example_group.rb +33 -0
- data/spec/support/rails_template.rb +32 -0
- data/spec/support/rails_template_with_data.rb +32 -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/action_items_spec.rb +27 -0
- data/spec/unit/application_spec.rb +67 -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/components/attributes_table_spec.rb +100 -0
- data/spec/unit/components/columns_spec.rb +75 -0
- data/spec/unit/components/panel_spec.rb +31 -0
- data/spec/unit/components/sidebar_section_spec.rb +37 -0
- data/spec/unit/components/status_tag_spec.rb +81 -0
- data/spec/unit/components/table_for_spec.rb +130 -0
- data/spec/unit/controller_filters_spec.rb +27 -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 +179 -0
- data/spec/unit/form_builder_spec.rb +238 -0
- data/spec/unit/menu_item_spec.rb +143 -0
- data/spec/unit/menu_spec.rb +53 -0
- data/spec/unit/namespace_spec.rb +203 -0
- data/spec/unit/pretty_format_spec.rb +35 -0
- data/spec/unit/registration_spec.rb +76 -0
- data/spec/unit/renderer_spec.rb +108 -0
- data/spec/unit/resource_controller/collection_spec.rb +34 -0
- data/spec/unit/resource_controller_spec.rb +147 -0
- data/spec/unit/resource_spec.rb +290 -0
- data/spec/unit/routing_spec.rb +88 -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 +16 -0
- metadata +482 -0
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
ActiveAdmin::Dashboards.build do
|
|
2
|
+
|
|
3
|
+
# Define your dashboard sections here. Each block will be
|
|
4
|
+
# rendered on the dashboard in the context of the view. So just
|
|
5
|
+
# return the content which you would like to display.
|
|
6
|
+
|
|
7
|
+
# == Simple Dashboard Section
|
|
8
|
+
# Here is an example of a simple dashboard section
|
|
9
|
+
#
|
|
10
|
+
# section "Recent Posts" do
|
|
11
|
+
# ul do
|
|
12
|
+
# Post.recent(5).collect do |post|
|
|
13
|
+
# li link_to(post.title, admin_post_path(post))
|
|
14
|
+
# end
|
|
15
|
+
# end
|
|
16
|
+
# end
|
|
17
|
+
|
|
18
|
+
# == Render Partial Section
|
|
19
|
+
# The block is rendererd within the context of the view, so you can
|
|
20
|
+
# easily render a partial rather than build content in ruby.
|
|
21
|
+
#
|
|
22
|
+
# section "Recent Posts" do
|
|
23
|
+
# div do
|
|
24
|
+
# render 'recent_posts' # => this will render /app/views/admin/dashboard/_recent_posts.html.erb
|
|
25
|
+
# end
|
|
26
|
+
# end
|
|
27
|
+
|
|
28
|
+
# == Section Ordering
|
|
29
|
+
# The dashboard sections are ordered by a given priority from top left to
|
|
30
|
+
# bottom right. The default priority is 10. By giving a section numerically lower
|
|
31
|
+
# priority it will be sorted higher. For example:
|
|
32
|
+
#
|
|
33
|
+
# section "Recent Posts", :priority => 10
|
|
34
|
+
# section "Recent User", :priority => 1
|
|
35
|
+
#
|
|
36
|
+
# Will render the "Recent Users" then the "Recent Posts" sections on the dashboard.
|
|
37
|
+
|
|
38
|
+
end
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
class CreateAdminNotes < ActiveRecord::Migration
|
|
2
|
+
def self.up
|
|
3
|
+
create_table :admin_notes do |t|
|
|
4
|
+
t.references :resource, :polymorphic => true, :null => false
|
|
5
|
+
t.references :admin_user, :polymorphic => true
|
|
6
|
+
t.text :body
|
|
7
|
+
t.timestamps
|
|
8
|
+
end
|
|
9
|
+
add_index :admin_notes, [:resource_type, :resource_id]
|
|
10
|
+
add_index :admin_notes, [:admin_user_type, :admin_user_id]
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def self.down
|
|
14
|
+
drop_table :admin_notes
|
|
15
|
+
end
|
|
16
|
+
end
|
data/lib/generators/active_admin/install/templates/migrations/2_move_admin_notes_to_comments.rb
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
class MoveAdminNotesToComments < ActiveRecord::Migration
|
|
2
|
+
def self.up
|
|
3
|
+
remove_index :admin_notes, [:admin_user_type, :admin_user_id]
|
|
4
|
+
rename_table :admin_notes, :active_admin_comments
|
|
5
|
+
rename_column :active_admin_comments, :admin_user_type, :author_type
|
|
6
|
+
rename_column :active_admin_comments, :admin_user_id, :author_id
|
|
7
|
+
add_column :active_admin_comments, :namespace, :string
|
|
8
|
+
add_index :active_admin_comments, [:namespace]
|
|
9
|
+
add_index :active_admin_comments, [:author_type, :author_id]
|
|
10
|
+
|
|
11
|
+
# Update all the existing comments to the default namespace
|
|
12
|
+
say "Updating any existing comments to the #{ActiveAdmin.application.default_namespace} namespace."
|
|
13
|
+
execute "UPDATE active_admin_comments SET namespace='#{ActiveAdmin.application.default_namespace}'"
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def self.down
|
|
17
|
+
remove_index :active_admin_comments, :column => [:author_type, :author_id]
|
|
18
|
+
remove_index :active_admin_comments, :column => [:namespace]
|
|
19
|
+
remove_column :active_admin_comments, :namespace
|
|
20
|
+
rename_column :active_admin_comments, :author_id, :admin_user_id
|
|
21
|
+
rename_column :active_admin_comments, :author_type, :admin_user_type
|
|
22
|
+
rename_table :active_admin_comments, :admin_notes
|
|
23
|
+
add_index :admin_notes, [:admin_user_type, :admin_user_id]
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
module ActiveAdmin
|
|
2
|
+
module Generators
|
|
3
|
+
class ResourceGenerator < Rails::Generators::NamedBase
|
|
4
|
+
desc "Installs ActiveAdmin in a rails 3 application"
|
|
5
|
+
|
|
6
|
+
def self.source_root
|
|
7
|
+
@_active_admin_source_root ||= File.expand_path("../templates", __FILE__)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def generate_config_file
|
|
11
|
+
template "admin.rb", "app/admin/#{file_path.gsub('/', '_').pluralize}.rb"
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe_with_capybara "Belongs To" do
|
|
4
|
+
|
|
5
|
+
let(:user){ User.create(:first_name => "John", :last_name => "Doe", :username => "johndoe") }
|
|
6
|
+
let(:post){ user.posts.create :title => "Hello World", :body => "woot!"}
|
|
7
|
+
|
|
8
|
+
before do
|
|
9
|
+
# Make sure both are created
|
|
10
|
+
user
|
|
11
|
+
post
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
describe "the index page" do
|
|
15
|
+
before do
|
|
16
|
+
visit admin_user_posts_path(user)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
describe "the main content" do
|
|
20
|
+
it "should display the default table" do
|
|
21
|
+
page.should have_content(post.title)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
describe "the breadcrumb" do
|
|
26
|
+
it "should have a link to the parent's index" do
|
|
27
|
+
page.body.should have_tag("a", "Users", :attributes => { :href => "/admin/users" })
|
|
28
|
+
end
|
|
29
|
+
it "should have a link to the parent" do
|
|
30
|
+
page.body.should have_tag("a", user.id.to_s, :attributes => { :href => "/admin/users/#{user.id}" })
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
describe "the view links" do
|
|
35
|
+
it "should take you to the sub resource" do
|
|
36
|
+
click "View"
|
|
37
|
+
current_path.should == "/admin/users/#{user.id}/posts/#{post.id}"
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
end
|
data/spec/spec_helper.rb
ADDED
|
@@ -0,0 +1,156 @@
|
|
|
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 "bundler"
|
|
7
|
+
Bundler.setup
|
|
8
|
+
|
|
9
|
+
require 'shoulda/active_record'
|
|
10
|
+
include Shoulda::ActiveRecord::Macros
|
|
11
|
+
|
|
12
|
+
module ActiveAdminIntegrationSpecHelper
|
|
13
|
+
extend self
|
|
14
|
+
|
|
15
|
+
def load_defaults!
|
|
16
|
+
ActiveAdmin.unload!
|
|
17
|
+
ActiveAdmin.load!
|
|
18
|
+
ActiveAdmin.register(Category)
|
|
19
|
+
ActiveAdmin.register(User)
|
|
20
|
+
ActiveAdmin.register(Post){ belongs_to :user, :optional => true }
|
|
21
|
+
reload_menus!
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def reload_menus!
|
|
25
|
+
ActiveAdmin.application.namespaces.values.each{|n| n.load_menu! }
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Sometimes we need to reload the routes within
|
|
29
|
+
# the application to test them out
|
|
30
|
+
def reload_routes!
|
|
31
|
+
Rails.application.reload_routes!
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Helper method to load resources and ensure that Active Admin is
|
|
35
|
+
# setup with the new configurations.
|
|
36
|
+
#
|
|
37
|
+
# Eg:
|
|
38
|
+
# load_resources do
|
|
39
|
+
# ActiveAdmin.regiser(Post)
|
|
40
|
+
# end
|
|
41
|
+
#
|
|
42
|
+
def load_resources
|
|
43
|
+
ActiveAdmin.unload!
|
|
44
|
+
yield
|
|
45
|
+
reload_menus!
|
|
46
|
+
reload_routes!
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Sets up a describe block where you can render controller
|
|
50
|
+
# actions. Uses the Admin::PostsController as the subject
|
|
51
|
+
# for the describe block
|
|
52
|
+
def describe_with_render(*args, &block)
|
|
53
|
+
describe *args do
|
|
54
|
+
include RSpec::Rails::ControllerExampleGroup
|
|
55
|
+
render_views
|
|
56
|
+
# metadata[:behaviour][:describes] = ActiveAdmin.namespaces[:admin].resources['Post'].controller
|
|
57
|
+
module_eval &block
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# Setup a describe block which uses capybara and rails integration
|
|
62
|
+
# test methods.
|
|
63
|
+
def describe_with_capybara(*args, &block)
|
|
64
|
+
describe *args do
|
|
65
|
+
include RSpec::Rails::IntegrationExampleGroup
|
|
66
|
+
module_eval &block
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# Returns a fake action view instance to use with our renderers
|
|
71
|
+
def mock_action_view(assigns = {})
|
|
72
|
+
controller = ActionView::TestCase::TestController.new
|
|
73
|
+
ActionView::Base.send :include, ActionView::Helpers
|
|
74
|
+
ActionView::Base.send :include, ActiveAdmin::ViewHelpers
|
|
75
|
+
ActionView::Base.send :include, Rails.application.routes.url_helpers
|
|
76
|
+
ActionView::Base.new(ActionController::Base.view_paths, assigns, controller)
|
|
77
|
+
end
|
|
78
|
+
alias_method :action_view, :mock_action_view
|
|
79
|
+
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
ENV['RAILS'] ||= '3.0.0'
|
|
83
|
+
ENV['RAILS_ENV'] = 'test'
|
|
84
|
+
|
|
85
|
+
ENV['RAILS_ROOT'] = File.expand_path("../rails/rails-#{ENV["RAILS"]}", __FILE__)
|
|
86
|
+
|
|
87
|
+
# Create the test app if it doesn't exists
|
|
88
|
+
unless File.exists?(ENV['RAILS_ROOT'])
|
|
89
|
+
system 'rake setup'
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
# Ensure the Active Admin load path is happy
|
|
93
|
+
require 'rails'
|
|
94
|
+
require 'active_admin'
|
|
95
|
+
ActiveAdmin.application.load_paths = [ENV['RAILS_ROOT'] + "/app/admin"]
|
|
96
|
+
|
|
97
|
+
require ENV['RAILS_ROOT'] + '/config/environment'
|
|
98
|
+
require 'rspec/rails'
|
|
99
|
+
|
|
100
|
+
# Setup Some Admin stuff for us to play with
|
|
101
|
+
include ActiveAdminIntegrationSpecHelper
|
|
102
|
+
load_defaults!
|
|
103
|
+
reload_routes!
|
|
104
|
+
|
|
105
|
+
# Disabling authentication in specs so that we don't have to worry about
|
|
106
|
+
# it allover the place
|
|
107
|
+
ActiveAdmin.application.authentication_method = false
|
|
108
|
+
ActiveAdmin.application.current_user_method = false
|
|
109
|
+
|
|
110
|
+
# Don't add asset cache timestamps. Makes it easy to integration
|
|
111
|
+
# test for the presence of an asset file
|
|
112
|
+
ENV["RAILS_ASSET_ID"] = ''
|
|
113
|
+
|
|
114
|
+
RSpec.configure do |config|
|
|
115
|
+
config.use_transactional_fixtures = true
|
|
116
|
+
config.use_instantiated_fixtures = false
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
# All RSpec configuration needs to happen before any examples
|
|
120
|
+
# or else it whines.
|
|
121
|
+
require 'integration_example_group'
|
|
122
|
+
RSpec.configure do |c|
|
|
123
|
+
c.include RSpec::Rails::IntegrationExampleGroup, :example_group => { :file_path => /\bspec\/integration\// }
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
# Ensure this is defined for Ruby 1.8
|
|
127
|
+
module MiniTest; class Assertion < Exception; end; end
|
|
128
|
+
|
|
129
|
+
RSpec::Matchers.define :have_tag do |*args|
|
|
130
|
+
|
|
131
|
+
match_unless_raises Test::Unit::AssertionFailedError do |response|
|
|
132
|
+
tag = args.shift
|
|
133
|
+
content = args.first.is_a?(Hash) ? nil : args.shift
|
|
134
|
+
|
|
135
|
+
options = {
|
|
136
|
+
:tag => tag.to_s
|
|
137
|
+
}.merge(args[0] || {})
|
|
138
|
+
|
|
139
|
+
options[:content] = content if content
|
|
140
|
+
|
|
141
|
+
begin
|
|
142
|
+
begin
|
|
143
|
+
assert_tag(options)
|
|
144
|
+
rescue NoMethodError
|
|
145
|
+
# We are not in a controller, so let's do the checking ourselves
|
|
146
|
+
doc = HTML::Document.new(response, false, false)
|
|
147
|
+
tag = doc.find(options)
|
|
148
|
+
assert tag, "expected tag, but no tag found matching #{options.inspect} in:\n#{response.inspect}"
|
|
149
|
+
end
|
|
150
|
+
# In Ruby 1.9, MiniTest::Assertion get's raised, so we'll
|
|
151
|
+
# handle raising a Test::Unit::AssertionFailedError
|
|
152
|
+
rescue MiniTest::Assertion => e
|
|
153
|
+
raise Test::Unit::AssertionFailedError, e.message
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
require 'action_dispatch'
|
|
2
|
+
require 'capybara/rails'
|
|
3
|
+
require 'capybara/dsl'
|
|
4
|
+
|
|
5
|
+
module RSpec
|
|
6
|
+
module Rails
|
|
7
|
+
module IntegrationExampleGroup
|
|
8
|
+
extend ActiveSupport::Concern
|
|
9
|
+
|
|
10
|
+
include ActionDispatch::Integration::Runner
|
|
11
|
+
include RSpec::Rails::TestUnitAssertionAdapter
|
|
12
|
+
include ActionDispatch::Assertions
|
|
13
|
+
include Capybara
|
|
14
|
+
include RSpec::Matchers
|
|
15
|
+
|
|
16
|
+
module InstanceMethods
|
|
17
|
+
def app
|
|
18
|
+
::Rails.application
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def last_response
|
|
22
|
+
page
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
included do
|
|
27
|
+
before do
|
|
28
|
+
@router = ::Rails.application.routes
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Rails template to build the sample app for specs
|
|
2
|
+
|
|
3
|
+
# Create a cucumber database and environment
|
|
4
|
+
copy_file File.expand_path('../templates/cucumber.rb', __FILE__), "config/environments/cucumber.rb"
|
|
5
|
+
gsub_file 'config/database.yml', /^test:.*\n/, "test: &test\n"
|
|
6
|
+
gsub_file 'config/database.yml', /\z/, "\ncucumber:\n <<: *test\n database: db/cucumber.sqlite3"
|
|
7
|
+
|
|
8
|
+
# Generate some test models
|
|
9
|
+
generate :model, "post title:string body:text published_at:datetime author_id:integer category_id:integer"
|
|
10
|
+
inject_into_file 'app/models/post.rb', " belongs_to :author, :class_name => 'User'\n belongs_to :category\n accepts_nested_attributes_for :author\n", :after => "class Post < ActiveRecord::Base\n"
|
|
11
|
+
generate :model, "user type:string first_name:string last_name:string username:string"
|
|
12
|
+
inject_into_file 'app/models/user.rb', " has_many :posts, :foreign_key => 'author_id'\n", :after => "class User < ActiveRecord::Base\n"
|
|
13
|
+
generate :model, "publisher --migration=false --parent=User"
|
|
14
|
+
generate :model, 'category name:string description:text'
|
|
15
|
+
inject_into_file 'app/models/category.rb', " has_many :posts\n", :after => "class Category < ActiveRecord::Base\n"
|
|
16
|
+
|
|
17
|
+
# Add our local Active Admin to the load path
|
|
18
|
+
inject_into_file "config/environment.rb", "\n$LOAD_PATH.unshift('#{File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'lib'))}')\nrequire \"active_admin\"\n", :after => "require File.expand_path('../application', __FILE__)"
|
|
19
|
+
|
|
20
|
+
run "rm Gemfile"
|
|
21
|
+
run "rm -r test"
|
|
22
|
+
run "rm -r spec"
|
|
23
|
+
|
|
24
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
|
25
|
+
generate :'active_admin:install'
|
|
26
|
+
|
|
27
|
+
# Setup a root path for devise
|
|
28
|
+
route "root :to => 'admin/dashboard#index'"
|
|
29
|
+
|
|
30
|
+
rake "db:migrate"
|
|
31
|
+
rake "db:test:prepare"
|
|
32
|
+
run "/usr/bin/env RAILS_ENV=cucumber rake db:migrate"
|
|
@@ -0,0 +1,32 @@
|
|
|
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
|
+
end
|
|
17
|
+
|
|
18
|
+
categories = ["Rock", "Pop Rock", "Alt-Country", "Blues", "Dub-Step"].collect do |name|
|
|
19
|
+
Category.create! :name => name
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
1_000.times do |i|
|
|
23
|
+
user = users[i % users.size]
|
|
24
|
+
cat = categories[i % categories.size]
|
|
25
|
+
Post.create :title => "Blog Post \#{i}",
|
|
26
|
+
:body => "Blog post \#{i} is written by \#{user.username} about \#{cat.name}",
|
|
27
|
+
:category => cat,
|
|
28
|
+
:author => user
|
|
29
|
+
end
|
|
30
|
+
EOF
|
|
31
|
+
|
|
32
|
+
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,27 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe ActiveAdmin::ActionItems do
|
|
4
|
+
|
|
5
|
+
describe "rendering" do
|
|
6
|
+
include Arbre::HTML
|
|
7
|
+
let(:assigns){ {} }
|
|
8
|
+
let(:action_item) do
|
|
9
|
+
ActiveAdmin::ActionItems::ActionItem.new do
|
|
10
|
+
h2 "Hello World"
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
let(:rendered){ insert_tag ActiveAdmin::Views::ActionItems, [action_item]}
|
|
15
|
+
|
|
16
|
+
it "should have a parent .action_items div" do
|
|
17
|
+
rendered.tag_name.should == 'div'
|
|
18
|
+
rendered.class_list.should include('action_items')
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
it "should render the contents of each action item" do
|
|
22
|
+
rendered.children.size.should == 1
|
|
23
|
+
rendered.content.strip.should == "<span class=\"action_item\">\n <h2>Hello World</h2>\n </span>"
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
end
|