andrewroth_activeadmin 0.3.4
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 +35 -0
- data/.travis.yml +4 -0
- data/.yardopts +8 -0
- data/CHANGELOG.md +301 -0
- data/Gemfile +40 -0
- data/Guardfile +8 -0
- data/LICENSE +25 -0
- data/README.rdoc +113 -0
- data/Rakefile +18 -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 +363 -0
- data/app/assets/stylesheets/active_admin/_forms.css.scss +259 -0
- data/app/assets/stylesheets/active_admin/_header.css.scss +121 -0
- data/app/assets/stylesheets/active_admin/_mixins.css.scss +1 -0
- data/app/assets/stylesheets/active_admin/_typography.css.scss +102 -0
- data/app/assets/stylesheets/active_admin/components/_comments.css.scss +43 -0
- data/app/assets/stylesheets/active_admin/components/_date_picker.css.scss +125 -0
- data/app/assets/stylesheets/active_admin/components/_flash_messages.css.scss +39 -0
- data/app/assets/stylesheets/active_admin/components/_tables.css.scss +68 -0
- data/app/assets/stylesheets/active_admin/mixins/_all.css.scss +10 -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/_utilities.scss +17 -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/0-installation.md +50 -0
- data/docs/1-general-configuration.md +43 -0
- data/docs/2-resource-customization.md +114 -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 +90 -0
- data/docs/4-csv-format.md +14 -0
- data/docs/5-forms.md +39 -0
- data/docs/6-show-screens.md +36 -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/filters.feature +35 -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 +56 -0
- data/features/index/index_scopes.feature +52 -0
- data/features/index/pagination.feature +17 -0
- data/features/menu.feature +37 -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 +96 -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 +82 -0
- data/lib/active_admin/abstract_view_factory.rb +95 -0
- data/lib/active_admin/application.rb +231 -0
- data/lib/active_admin/arbre.rb +23 -0
- data/lib/active_admin/arbre/builder.rb +111 -0
- data/lib/active_admin/arbre/context.rb +45 -0
- data/lib/active_admin/arbre/core_extensions.rb +5 -0
- data/lib/active_admin/arbre/html/attributes.rb +20 -0
- data/lib/active_admin/arbre/html/class_list.rb +28 -0
- data/lib/active_admin/arbre/html/collection.rb +27 -0
- data/lib/active_admin/arbre/html/document.rb +42 -0
- data/lib/active_admin/arbre/html/element.rb +151 -0
- data/lib/active_admin/arbre/html/html5_elements.rb +47 -0
- data/lib/active_admin/arbre/html/tag.rb +137 -0
- data/lib/active_admin/arbre/html/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/dependency_checker.rb +30 -0
- data/lib/active_admin/deprecation.rb +36 -0
- data/lib/active_admin/devise.rb +54 -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 +118 -0
- data/lib/active_admin/helpers/optional_display.rb +34 -0
- data/lib/active_admin/helpers/scope_chain.rb +23 -0
- data/lib/active_admin/helpers/settings.rb +70 -0
- data/lib/active_admin/iconic.rb +51 -0
- data/lib/active_admin/iconic/icons.rb +142 -0
- data/lib/active_admin/locales/bg.yml +40 -0
- data/lib/active_admin/locales/cs.yml +34 -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 +40 -0
- data/lib/active_admin/locales/fr.yml +40 -0
- data/lib/active_admin/locales/it.yml +40 -0
- data/lib/active_admin/locales/ja.yml +40 -0
- data/lib/active_admin/locales/pl.yml +34 -0
- data/lib/active_admin/locales/pt-BR.yml +41 -0
- data/lib/active_admin/locales/ru.yml +40 -0
- data/lib/active_admin/locales/sv-SE.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 +64 -0
- data/lib/active_admin/renderer.rb +87 -0
- data/lib/active_admin/resource.rb +159 -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 +50 -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 +105 -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 +138 -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 +45 -0
- data/lib/active_admin/scope.rb +31 -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 +17 -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 +69 -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 +57 -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 +164 -0
- data/lib/active_admin/views/pages/base.rb +167 -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 +91 -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/tabbed_navigation.rb +94 -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 +103 -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 +46 -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/memory_spec.rb +38 -0
- data/spec/integration/stylesheets_spec.rb +41 -0
- data/spec/spec_helper.rb +167 -0
- data/spec/support/detect_rails_version.rb +10 -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/active_admin_spec.rb +17 -0
- data/spec/unit/application_spec.rb +87 -0
- data/spec/unit/arbre/context_spec.rb +35 -0
- data/spec/unit/arbre/html/element_finder_methods_spec.rb +54 -0
- data/spec/unit/arbre/html/element_spec.rb +223 -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 +209 -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/devise_spec.rb +66 -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 +256 -0
- data/spec/unit/generators/install_rails_3_1_spec.rb +16 -0
- data/spec/unit/helpers/scope_chain_spec.rb +36 -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 +80 -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 +75 -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 +269 -0
- data/spec/unit/routing_spec.rb +88 -0
- data/spec/unit/sass/helpers_spec.rb +47 -0
- data/spec/unit/scope_spec.rb +41 -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 +15 -0
- data/spec/unit/views/components/columns_spec.rb +75 -0
- data/spec/unit/views/components/panel_spec.rb +29 -0
- data/spec/unit/views/components/sidebar_section_spec.rb +37 -0
- data/spec/unit/views/components/status_tag_spec.rb +79 -0
- data/spec/unit/views/components/table_for_spec.rb +131 -0
- data/spec/unit/views/pages/layout_spec.rb +22 -0
- data/spec/unit/views/tabbed_navigation_spec.rb +125 -0
- data/tasks/docs.rake +39 -0
- data/tasks/test.rake +57 -0
- data/tasks/yard.rake +6 -0
- metadata +646 -0
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Arbre::HTML::Element do
|
|
4
|
+
|
|
5
|
+
setup_arbre_context!
|
|
6
|
+
|
|
7
|
+
let(:element){ Arbre::HTML::Element.new }
|
|
8
|
+
|
|
9
|
+
context "when initialized" do
|
|
10
|
+
it "should have no children" do
|
|
11
|
+
element.children.should be_empty
|
|
12
|
+
end
|
|
13
|
+
it "should have no parent" do
|
|
14
|
+
element.parent.should be_nil
|
|
15
|
+
end
|
|
16
|
+
it "should have no document" do
|
|
17
|
+
element.document.should be_nil
|
|
18
|
+
end
|
|
19
|
+
it "should respond to the HTML builder methods" do
|
|
20
|
+
element.should respond_to(:span)
|
|
21
|
+
end
|
|
22
|
+
it "should have a set of local assigns" do
|
|
23
|
+
element = Arbre::HTML::Element.new :hello => "World"
|
|
24
|
+
element.assigns[:hello].should == "World"
|
|
25
|
+
end
|
|
26
|
+
it "should have an empty hash with no local assigns" do
|
|
27
|
+
element.assigns.should == {}
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
describe "passing in a helper object" do
|
|
32
|
+
let(:element){ Arbre::HTML::Element.new(nil, action_view) }
|
|
33
|
+
it "should call methods on the helper object and return TextNode objects" do
|
|
34
|
+
element.content_tag(:div).should == "<div></div>"
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
it "should raise a NoMethodError if not found" do
|
|
38
|
+
lambda {
|
|
39
|
+
element.a_method_that_doesnt_exist
|
|
40
|
+
}.should raise_error(NoMethodError)
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
describe "passing in assigns" do
|
|
45
|
+
let(:assigns){ {:post => Post.new(:title => "Hello")} }
|
|
46
|
+
it "should be accessible via a method call" do
|
|
47
|
+
post.should be_an_instance_of(Post)
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
describe "adding a child" do
|
|
52
|
+
let(:child){ Arbre::HTML::Element.new }
|
|
53
|
+
before do
|
|
54
|
+
element.add_child child
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
it "should add the child to the parent" do
|
|
58
|
+
element.children.first.should == child
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
it "should set the parent of the child" do
|
|
62
|
+
child.parent.should == element
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
context "when the child is nil" do
|
|
66
|
+
let(:child){ nil }
|
|
67
|
+
it "should not add the child" do
|
|
68
|
+
element.children.should be_empty
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
context "when the child is a string" do
|
|
73
|
+
let(:child){ "Hello World" }
|
|
74
|
+
it "should add as a TextNode" do
|
|
75
|
+
element.children.first.should be_instance_of(Arbre::HTML::TextNode)
|
|
76
|
+
element.children.first.to_html.should == "Hello World"
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
describe "setting the content" do
|
|
82
|
+
|
|
83
|
+
context "when a string" do
|
|
84
|
+
before do
|
|
85
|
+
element.add_child "Hello World"
|
|
86
|
+
element.content = "Goodbye"
|
|
87
|
+
end
|
|
88
|
+
it "should clear the existing children" do
|
|
89
|
+
element.children.size.should == 1
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
it "should add the string as a child" do
|
|
93
|
+
element.children.first.to_html.should == "Goodbye"
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
it "should html escape the string" do
|
|
97
|
+
string = "Goodbye <br />"
|
|
98
|
+
element.content = string
|
|
99
|
+
element.content.to_html.should == "Goodbye <br />"
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
context "when a tag" do
|
|
104
|
+
before do
|
|
105
|
+
element.content = h2("Hello")
|
|
106
|
+
end
|
|
107
|
+
it "should set the content tag" do
|
|
108
|
+
element.children.first.should be_an_instance_of(Arbre::HTML::H2)
|
|
109
|
+
end
|
|
110
|
+
it "should set the tags parent" do
|
|
111
|
+
element.children.first.parent.should == element
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
context "when an array of tags" do
|
|
116
|
+
before do
|
|
117
|
+
element.content = [ul,div]
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
it "should set the content tag" do
|
|
121
|
+
element.children.first.should be_an_instance_of(Arbre::HTML::Ul)
|
|
122
|
+
end
|
|
123
|
+
it "should set the tags parent" do
|
|
124
|
+
element.children.first.parent.should == element
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
describe "setting the parent" do
|
|
131
|
+
let(:parent) do
|
|
132
|
+
doc = Arbre::HTML::Document.new
|
|
133
|
+
parent = Arbre::HTML::Element.new
|
|
134
|
+
doc << parent
|
|
135
|
+
parent
|
|
136
|
+
end
|
|
137
|
+
before { element.parent = parent }
|
|
138
|
+
|
|
139
|
+
it "should set the parent" do
|
|
140
|
+
element.parent.should == parent
|
|
141
|
+
end
|
|
142
|
+
it "should set the document to the parent's document" do
|
|
143
|
+
element.document.should == parent.document
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
describe "rendering to html" do
|
|
148
|
+
it "should render the children collection" do
|
|
149
|
+
element.children.should_receive(:to_html).and_return("content")
|
|
150
|
+
element.to_html.should == "content"
|
|
151
|
+
end
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
describe "adding elements together" do
|
|
155
|
+
|
|
156
|
+
context "when both elements are tags" do
|
|
157
|
+
let(:collection){ h1 + h2}
|
|
158
|
+
|
|
159
|
+
it "should return an instance of Collection" do
|
|
160
|
+
collection.should be_an_instance_of(Arbre::HTML::Collection)
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
it "should return the elements in the collection" do
|
|
164
|
+
collection.size.should == 2
|
|
165
|
+
collection.first.should be_an_instance_of(Arbre::HTML::H1)
|
|
166
|
+
collection[1].should be_an_instance_of(Arbre::HTML::H2)
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
context "when the left is a collection and the right is a tag" do
|
|
171
|
+
let(:collection){ Arbre::HTML::Collection.new([h1, h2]) + h3}
|
|
172
|
+
|
|
173
|
+
it "should return an instance of Collection" do
|
|
174
|
+
collection.should be_an_instance_of(Arbre::HTML::Collection)
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
it "should return the elements in the collection flattened" do
|
|
178
|
+
collection.size.should == 3
|
|
179
|
+
collection[0].should be_an_instance_of(Arbre::HTML::H1)
|
|
180
|
+
collection[1].should be_an_instance_of(Arbre::HTML::H2)
|
|
181
|
+
collection[2].should be_an_instance_of(Arbre::HTML::H3)
|
|
182
|
+
end
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
context "when the right is a collection and the left is a tag" do
|
|
186
|
+
let(:collection){ h1 + Arbre::HTML::Collection.new([h2,h3]) }
|
|
187
|
+
|
|
188
|
+
it "should return an instance of Collection" do
|
|
189
|
+
collection.should be_an_instance_of(Arbre::HTML::Collection)
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
it "should return the elements in the collection flattened" do
|
|
193
|
+
collection.size.should == 3
|
|
194
|
+
collection[0].should be_an_instance_of(Arbre::HTML::H1)
|
|
195
|
+
collection[1].should be_an_instance_of(Arbre::HTML::H2)
|
|
196
|
+
collection[2].should be_an_instance_of(Arbre::HTML::H3)
|
|
197
|
+
end
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
context "when the left is a tag and the right is a string" do
|
|
201
|
+
let(:collection){ h1 + "Hello World"}
|
|
202
|
+
|
|
203
|
+
it "should return an instance of Collection" do
|
|
204
|
+
collection.should be_an_instance_of(Arbre::HTML::Collection)
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
it "should return the elements in the collection" do
|
|
208
|
+
collection.size.should == 2
|
|
209
|
+
collection[0].should be_an_instance_of(Arbre::HTML::H1)
|
|
210
|
+
collection[1].should be_an_instance_of(Arbre::HTML::TextNode)
|
|
211
|
+
end
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
context "when the left is a string and the right is a tag" do
|
|
215
|
+
let(:collection){ "hello World" + h1}
|
|
216
|
+
|
|
217
|
+
it "should return a string" do
|
|
218
|
+
collection.strip.chomp.should == "hello World<h1></h1>"
|
|
219
|
+
end
|
|
220
|
+
end
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
end
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Arbre::HTML::Tag, "Attributes" do
|
|
4
|
+
|
|
5
|
+
setup_arbre_context!
|
|
6
|
+
|
|
7
|
+
let(:tag){ Arbre::HTML::Tag.new }
|
|
8
|
+
|
|
9
|
+
describe "attributes" do
|
|
10
|
+
before { tag.build :id => "my_id" }
|
|
11
|
+
|
|
12
|
+
it "should have an attributes hash" do
|
|
13
|
+
tag.attributes.should == {:id => "my_id"}
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
it "should render the attributes to html" do
|
|
17
|
+
tag.to_html.should == <<-HTML
|
|
18
|
+
<tag id="my_id"></tag>
|
|
19
|
+
HTML
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
it "should get an attribute value" do
|
|
23
|
+
tag.attr(:id).should == "my_id"
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
describe "#has_attribute?" do
|
|
27
|
+
context "when the attribute exists" do
|
|
28
|
+
it "should return true" do
|
|
29
|
+
tag.has_attribute?(:id).should == true
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
context "when the attribute does not exist" do
|
|
34
|
+
it "should return false" do
|
|
35
|
+
tag.has_attribute?(:class).should == false
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
it "should remove an attribute" do
|
|
41
|
+
tag.attributes.should == {:id => "my_id"}
|
|
42
|
+
tag.remove_attribute(:id).should == "my_id"
|
|
43
|
+
tag.attributes.should == {}
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
describe "rendering attributes" do
|
|
48
|
+
it "should html safe the attribute values" do
|
|
49
|
+
tag.set_attribute(:class, "\">bad things!")
|
|
50
|
+
tag.to_html.should == <<-HTML
|
|
51
|
+
<tag class="">bad things!"></tag>
|
|
52
|
+
HTML
|
|
53
|
+
end
|
|
54
|
+
it "should should escape the attribute names" do
|
|
55
|
+
tag.set_attribute(">bad", "things")
|
|
56
|
+
tag.to_html.should == <<-HTML
|
|
57
|
+
<tag >bad="things"></tag>
|
|
58
|
+
HTML
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Arbre::HTML::Tag do
|
|
4
|
+
|
|
5
|
+
setup_arbre_context!
|
|
6
|
+
|
|
7
|
+
let(:tag){ Arbre::HTML::Tag.new }
|
|
8
|
+
|
|
9
|
+
describe "building a new tag" do
|
|
10
|
+
before { tag.build "Hello World", :id => "my_id" }
|
|
11
|
+
|
|
12
|
+
it "should set the contents to a string" do
|
|
13
|
+
tag.content.should == "Hello World"
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
it "should set the hash of options to the attributes" do
|
|
17
|
+
tag.attributes.should == { :id => "my_id" }
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
describe "creating a tag 'for' an object" do
|
|
22
|
+
let(:model_name){ mock(:singular => "resource_class")}
|
|
23
|
+
let(:resource_class){ mock(:model_name => model_name) }
|
|
24
|
+
let(:resource){ mock(:class => resource_class, :to_key => ['5'])}
|
|
25
|
+
|
|
26
|
+
before do
|
|
27
|
+
tag.build :for => resource
|
|
28
|
+
end
|
|
29
|
+
it "should set the id to the type and id" do
|
|
30
|
+
tag.id.should == "resource_class_5"
|
|
31
|
+
end
|
|
32
|
+
it "should add a class name" do
|
|
33
|
+
tag.class_list.should include("resource_class")
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
describe "css class names" do
|
|
38
|
+
it "should add a class" do
|
|
39
|
+
tag.add_class "hello_world"
|
|
40
|
+
tag.class_names.should == "hello_world"
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
it "should remove_class" do
|
|
44
|
+
tag.add_class "hello_world"
|
|
45
|
+
tag.class_names.should == "hello_world"
|
|
46
|
+
tag.remove_class "hello_world"
|
|
47
|
+
tag.class_names.should == ""
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
it "should not add a class if it already exists" do
|
|
51
|
+
tag.add_class "hello_world"
|
|
52
|
+
tag.add_class "hello_world"
|
|
53
|
+
tag.class_names.should == "hello_world"
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
it "should seperate classes with space" do
|
|
57
|
+
tag.add_class "hello world"
|
|
58
|
+
tag.class_list.size.should == 2
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
end
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Arbre do
|
|
4
|
+
|
|
5
|
+
setup_arbre_context!
|
|
6
|
+
|
|
7
|
+
it "should render a single element" do
|
|
8
|
+
content = span("Hello World")
|
|
9
|
+
content.to_html.should == <<-HTML
|
|
10
|
+
<span>Hello World</span>
|
|
11
|
+
HTML
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it "should render a child element" do
|
|
15
|
+
content = span do
|
|
16
|
+
span "Hello World"
|
|
17
|
+
end
|
|
18
|
+
content.to_html.should == <<-HTML
|
|
19
|
+
<span>
|
|
20
|
+
<span>Hello World</span>
|
|
21
|
+
</span>
|
|
22
|
+
HTML
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it "should render an unordered list" do
|
|
26
|
+
content = ul do
|
|
27
|
+
li "First"
|
|
28
|
+
li "Second"
|
|
29
|
+
li "Third"
|
|
30
|
+
end
|
|
31
|
+
content.to_html.should == <<-HTML
|
|
32
|
+
<ul>
|
|
33
|
+
<li>First</li>
|
|
34
|
+
<li>Second</li>
|
|
35
|
+
<li>Third</li>
|
|
36
|
+
</ul>
|
|
37
|
+
HTML
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
it "should return the correct object" do
|
|
41
|
+
list_1 = ul
|
|
42
|
+
list_2 = li
|
|
43
|
+
list_1.should be_instance_of(Arbre::HTML::Ul)
|
|
44
|
+
list_2.should be_instance_of(Arbre::HTML::Li)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
it "should allow local variables inside the tags" do
|
|
48
|
+
first = "First"
|
|
49
|
+
second = "Second"
|
|
50
|
+
content = ul do
|
|
51
|
+
li first
|
|
52
|
+
li second
|
|
53
|
+
end
|
|
54
|
+
content.to_html.should == <<-EOS
|
|
55
|
+
<ul>
|
|
56
|
+
<li>First</li>
|
|
57
|
+
<li>Second</li>
|
|
58
|
+
</ul>
|
|
59
|
+
EOS
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
it "should add children and nested" do
|
|
63
|
+
content = div do
|
|
64
|
+
ul
|
|
65
|
+
li do
|
|
66
|
+
li
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
content.to_html.should == <<-HTML
|
|
70
|
+
<div>
|
|
71
|
+
<ul></ul>
|
|
72
|
+
<li>
|
|
73
|
+
<li></li>
|
|
74
|
+
</li>
|
|
75
|
+
</div>
|
|
76
|
+
HTML
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
it "should pass the element in to the block if asked for" do
|
|
80
|
+
content = div do |d|
|
|
81
|
+
d.ul do
|
|
82
|
+
li
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
content.to_html.should == <<-HTML
|
|
86
|
+
<div>
|
|
87
|
+
<ul>
|
|
88
|
+
<li></li>
|
|
89
|
+
</ul>
|
|
90
|
+
</div>
|
|
91
|
+
HTML
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
it "should move content tags between parents" do
|
|
95
|
+
content = div do
|
|
96
|
+
span(ul(li))
|
|
97
|
+
end
|
|
98
|
+
content.to_html.should == <<-HTML
|
|
99
|
+
<div>
|
|
100
|
+
<span>
|
|
101
|
+
<ul>
|
|
102
|
+
<li></li>
|
|
103
|
+
</ul>
|
|
104
|
+
</span>
|
|
105
|
+
</div>
|
|
106
|
+
HTML
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
it "should add content to the parent if the element is passed into block" do
|
|
110
|
+
content = div do |d|
|
|
111
|
+
d.id = "my-tag"
|
|
112
|
+
ul do
|
|
113
|
+
li
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
content.to_html.should == <<-HTML
|
|
117
|
+
<div id="my-tag">
|
|
118
|
+
<ul>
|
|
119
|
+
<li></li>
|
|
120
|
+
</ul>
|
|
121
|
+
</div>
|
|
122
|
+
HTML
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
it "should have the parent set on it" do
|
|
126
|
+
item = nil
|
|
127
|
+
list = ul do
|
|
128
|
+
li "Hello"
|
|
129
|
+
item = li "World"
|
|
130
|
+
end
|
|
131
|
+
item.parent.should == list
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
it "should set a string content return value with no children" do
|
|
135
|
+
li do
|
|
136
|
+
"Hello World"
|
|
137
|
+
end.to_html.should == <<-HTML
|
|
138
|
+
<li>Hello World</li>
|
|
139
|
+
HTML
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
describe "text nodes" do
|
|
143
|
+
it "should turn strings into text nodes" do
|
|
144
|
+
li do
|
|
145
|
+
"Hello World"
|
|
146
|
+
end.children.first.should be_instance_of(Arbre::HTML::TextNode)
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
describe "self-closing nodes" do
|
|
151
|
+
it "should not self-close script tags" do
|
|
152
|
+
tag = script :type => 'text/javascript'
|
|
153
|
+
tag.to_html.should == <<-HTML
|
|
154
|
+
<script type="text/javascript"></script>
|
|
155
|
+
HTML
|
|
156
|
+
end
|
|
157
|
+
it "should self-close meta tags" do
|
|
158
|
+
tag = meta :content => "text/html; charset=utf-8"
|
|
159
|
+
tag.to_html.should == <<-HTML
|
|
160
|
+
<meta content="text/html; charset=utf-8\"/>
|
|
161
|
+
HTML
|
|
162
|
+
end
|
|
163
|
+
it "should self-close link tags" do
|
|
164
|
+
tag = link :rel => "stylesheet"
|
|
165
|
+
tag.to_html.should == <<-HTML
|
|
166
|
+
<link rel="stylesheet"/>
|
|
167
|
+
HTML
|
|
168
|
+
end
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
describe "html safe" do
|
|
172
|
+
it "should escape the contents" do
|
|
173
|
+
span("<br />").to_html.should == <<-HTML
|
|
174
|
+
<span><br /></span>
|
|
175
|
+
HTML
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
it "should return html safe strings" do
|
|
179
|
+
span("<br />").to_html.should be_html_safe
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
it "should not escape html passed in" do
|
|
183
|
+
span(span("<br />")).to_html.should == <<-HTML
|
|
184
|
+
<span>
|
|
185
|
+
<span><br /></span>
|
|
186
|
+
</span>
|
|
187
|
+
HTML
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
it "should escape string contents when passed in block" do
|
|
191
|
+
span {
|
|
192
|
+
span {
|
|
193
|
+
"<br />"
|
|
194
|
+
}
|
|
195
|
+
}.to_html.should == <<-HTML
|
|
196
|
+
<span>
|
|
197
|
+
<span><br /></span>
|
|
198
|
+
</span>
|
|
199
|
+
HTML
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
it "should escape the contents of attributes" do
|
|
203
|
+
span(:class => "<br />").to_html.should == <<-HTML
|
|
204
|
+
<span class="<br />"></span>
|
|
205
|
+
HTML
|
|
206
|
+
end
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
end
|