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.
Files changed (255) hide show
  1. data/.document +5 -0
  2. data/.gitignore +32 -0
  3. data/.travis.yml +4 -0
  4. data/CHANGELOG.rdoc +76 -0
  5. data/Gemfile +26 -0
  6. data/LICENSE +25 -0
  7. data/README.rdoc +450 -0
  8. data/Rakefile +100 -0
  9. data/activeadmin.gemspec +28 -0
  10. data/cucumber.yml +2 -0
  11. data/features/comments/commenting.feature +99 -0
  12. data/features/comments/viewing_index.feature +19 -0
  13. data/features/dashboard.feature +26 -0
  14. data/features/edit_page.feature +77 -0
  15. data/features/first_boot.feature +16 -0
  16. data/features/global_navigation.feature +30 -0
  17. data/features/index/format_as_csv.feature +45 -0
  18. data/features/index/formats.feature +10 -0
  19. data/features/index/index_as_block.feature +15 -0
  20. data/features/index/index_as_blog.feature +50 -0
  21. data/features/index/index_as_grid.feature +45 -0
  22. data/features/index/index_as_table.feature +79 -0
  23. data/features/index/index_scopes.feature +52 -0
  24. data/features/index/pagination.feature +23 -0
  25. data/features/menu.feature +26 -0
  26. data/features/new_page.feature +75 -0
  27. data/features/registering_assets.feature +35 -0
  28. data/features/registering_resources.feature +33 -0
  29. data/features/show/default_content.feature +43 -0
  30. data/features/show/page_title.feature +33 -0
  31. data/features/sidebar_sections.feature +127 -0
  32. data/features/specifying_actions.feature +60 -0
  33. data/features/step_definitions/action_item_steps.rb +7 -0
  34. data/features/step_definitions/additional_web_steps.rb +67 -0
  35. data/features/step_definitions/asset_steps.rb +7 -0
  36. data/features/step_definitions/attribute_steps.rb +15 -0
  37. data/features/step_definitions/comment_steps.rb +8 -0
  38. data/features/step_definitions/configuration_steps.rb +31 -0
  39. data/features/step_definitions/dashboard_steps.rb +11 -0
  40. data/features/step_definitions/factory_steps.rb +28 -0
  41. data/features/step_definitions/flash_steps.rb +3 -0
  42. data/features/step_definitions/format_steps.rb +34 -0
  43. data/features/step_definitions/index_scope_steps.rb +20 -0
  44. data/features/step_definitions/menu_steps.rb +7 -0
  45. data/features/step_definitions/pagination_steps.rb +8 -0
  46. data/features/step_definitions/sidebar_steps.rb +11 -0
  47. data/features/step_definitions/tab_steps.rb +3 -0
  48. data/features/step_definitions/user_steps.rb +20 -0
  49. data/features/step_definitions/web_steps.rb +219 -0
  50. data/features/sti_resource.feature +49 -0
  51. data/features/support/env.rb +92 -0
  52. data/features/support/paths.rb +48 -0
  53. data/features/users/logging_in.feature +34 -0
  54. data/features/users/logging_out.feature +13 -0
  55. data/lib/active_admin/abstract_view_factory.rb +95 -0
  56. data/lib/active_admin/action_items.rb +37 -0
  57. data/lib/active_admin/application.rb +204 -0
  58. data/lib/active_admin/arbre/attributes.rb +20 -0
  59. data/lib/active_admin/arbre/class_list.rb +28 -0
  60. data/lib/active_admin/arbre/collection.rb +27 -0
  61. data/lib/active_admin/arbre/context.rb +8 -0
  62. data/lib/active_admin/arbre/core_extensions.rb +5 -0
  63. data/lib/active_admin/arbre/document.rb +42 -0
  64. data/lib/active_admin/arbre/element.rb +151 -0
  65. data/lib/active_admin/arbre/html.rb +84 -0
  66. data/lib/active_admin/arbre/html5_elements.rb +47 -0
  67. data/lib/active_admin/arbre/tag.rb +137 -0
  68. data/lib/active_admin/arbre/text_node.rb +35 -0
  69. data/lib/active_admin/arbre.rb +23 -0
  70. data/lib/active_admin/asset_registration.rb +34 -0
  71. data/lib/active_admin/callbacks.rb +87 -0
  72. data/lib/active_admin/comments/comment.rb +21 -0
  73. data/lib/active_admin/comments/configuration.rb +18 -0
  74. data/lib/active_admin/comments/namespace_helper.rb +14 -0
  75. data/lib/active_admin/comments/resource_helper.rb +17 -0
  76. data/lib/active_admin/comments/show_page_helper.rb +23 -0
  77. data/lib/active_admin/comments/views/active_admin_comment.rb +0 -0
  78. data/lib/active_admin/comments/views/active_admin_comments.rb +82 -0
  79. data/lib/active_admin/comments/views.rb +3 -0
  80. data/lib/active_admin/comments.rb +88 -0
  81. data/lib/active_admin/component.rb +22 -0
  82. data/lib/active_admin/controller_action.rb +12 -0
  83. data/lib/active_admin/csv_builder.rb +45 -0
  84. data/lib/active_admin/dashboards/dashboard_controller.rb +47 -0
  85. data/lib/active_admin/dashboards/section.rb +34 -0
  86. data/lib/active_admin/dashboards.rb +48 -0
  87. data/lib/active_admin/devise.rb +43 -0
  88. data/lib/active_admin/dsl.rb +215 -0
  89. data/lib/active_admin/event.rb +31 -0
  90. data/lib/active_admin/form_builder.rb +109 -0
  91. data/lib/active_admin/helpers/optional_display.rb +34 -0
  92. data/lib/active_admin/iconic/icons.rb +142 -0
  93. data/lib/active_admin/iconic.rb +51 -0
  94. data/lib/active_admin/locales/da.yml +26 -0
  95. data/lib/active_admin/locales/en.yml +34 -0
  96. data/lib/active_admin/locales/es.yml +34 -0
  97. data/lib/active_admin/locales/pt.yml +34 -0
  98. data/lib/active_admin/menu.rb +42 -0
  99. data/lib/active_admin/menu_item.rb +73 -0
  100. data/lib/active_admin/namespace.rb +198 -0
  101. data/lib/active_admin/page_config.rb +15 -0
  102. data/lib/active_admin/renderer.rb +87 -0
  103. data/lib/active_admin/resource/belongs_to.rb +31 -0
  104. data/lib/active_admin/resource.rb +229 -0
  105. data/lib/active_admin/resource_controller/action_builder.rb +21 -0
  106. data/lib/active_admin/resource_controller/actions.rb +79 -0
  107. data/lib/active_admin/resource_controller/callbacks.rb +47 -0
  108. data/lib/active_admin/resource_controller/collection.rb +144 -0
  109. data/lib/active_admin/resource_controller/filters.rb +58 -0
  110. data/lib/active_admin/resource_controller/form.rb +42 -0
  111. data/lib/active_admin/resource_controller/menu.rb +29 -0
  112. data/lib/active_admin/resource_controller/page_configurations.rb +53 -0
  113. data/lib/active_admin/resource_controller/scoping.rb +36 -0
  114. data/lib/active_admin/resource_controller/sidebars.rb +38 -0
  115. data/lib/active_admin/resource_controller.rb +119 -0
  116. data/lib/active_admin/router.rb +85 -0
  117. data/lib/active_admin/scope.rb +17 -0
  118. data/lib/active_admin/sidebar.rb +43 -0
  119. data/lib/active_admin/stylesheets/active_admin/_comments.scss +40 -0
  120. data/lib/active_admin/stylesheets/active_admin/_flash_messages.scss +13 -0
  121. data/lib/active_admin/stylesheets/active_admin/_forms.scss +168 -0
  122. data/lib/active_admin/stylesheets/active_admin/_header.scss +108 -0
  123. data/lib/active_admin/stylesheets/active_admin/_typography.scss +100 -0
  124. data/lib/active_admin/stylesheets/active_admin/mixins/_all.scss +8 -0
  125. data/lib/active_admin/stylesheets/active_admin/mixins/_buttons.scss +27 -0
  126. data/lib/active_admin/stylesheets/active_admin/mixins/_gradients.scss +21 -0
  127. data/lib/active_admin/stylesheets/active_admin/mixins/_icons.scss +20 -0
  128. data/lib/active_admin/stylesheets/active_admin/mixins/_reset.scss +165 -0
  129. data/lib/active_admin/stylesheets/active_admin/mixins/_rounded.scss +43 -0
  130. data/lib/active_admin/stylesheets/active_admin/mixins/_sections.scss +27 -0
  131. data/lib/active_admin/stylesheets/active_admin/mixins/_shadows.scss +21 -0
  132. data/lib/active_admin/stylesheets/active_admin/mixins/_variables.scss +12 -0
  133. data/lib/active_admin/stylesheets/active_admin.scss +429 -0
  134. data/lib/active_admin/version.rb +3 -0
  135. data/lib/active_admin/view_factory.rb +21 -0
  136. data/lib/active_admin/view_helpers/active_admin_application_helper.rb +12 -0
  137. data/lib/active_admin/view_helpers/assigns_with_indifferent_access_helper.rb +7 -0
  138. data/lib/active_admin/view_helpers/auto_link_helper.rb +42 -0
  139. data/lib/active_admin/view_helpers/breadcrumb_helper.rb +29 -0
  140. data/lib/active_admin/view_helpers/display_helper.rb +38 -0
  141. data/lib/active_admin/view_helpers/filter_form_helper.rb +185 -0
  142. data/lib/active_admin/view_helpers/form_helper.rb +12 -0
  143. data/lib/active_admin/view_helpers/icon_helper.rb +12 -0
  144. data/lib/active_admin/view_helpers/method_or_proc_helper.rb +26 -0
  145. data/lib/active_admin/view_helpers/renderer_helper.rb +29 -0
  146. data/lib/active_admin/view_helpers/sidebar_helper.rb +15 -0
  147. data/lib/active_admin/view_helpers/table_helper.rb +12 -0
  148. data/lib/active_admin/view_helpers/title_helper.rb +11 -0
  149. data/lib/active_admin/view_helpers/view_factory_helper.rb +11 -0
  150. data/lib/active_admin/view_helpers.rb +23 -0
  151. data/lib/active_admin/views/action_items.rb +17 -0
  152. data/lib/active_admin/views/components/attributes_table.rb +66 -0
  153. data/lib/active_admin/views/components/columns.rb +47 -0
  154. data/lib/active_admin/views/components/paginated_collection.rb +92 -0
  155. data/lib/active_admin/views/components/panel.rb +26 -0
  156. data/lib/active_admin/views/components/scopes.rb +70 -0
  157. data/lib/active_admin/views/components/sidebar_section.rb +30 -0
  158. data/lib/active_admin/views/components/status_tag.rb +55 -0
  159. data/lib/active_admin/views/components/table_for.rb +193 -0
  160. data/lib/active_admin/views/dashboard_section_renderer.rb +19 -0
  161. data/lib/active_admin/views/header_renderer.rb +37 -0
  162. data/lib/active_admin/views/index_as_block.rb +24 -0
  163. data/lib/active_admin/views/index_as_blog.rb +89 -0
  164. data/lib/active_admin/views/index_as_grid.rb +49 -0
  165. data/lib/active_admin/views/index_as_table.rb +75 -0
  166. data/lib/active_admin/views/pages/base.rb +144 -0
  167. data/lib/active_admin/views/pages/dashboard.rb +59 -0
  168. data/lib/active_admin/views/pages/edit.rb +27 -0
  169. data/lib/active_admin/views/pages/index.rb +66 -0
  170. data/lib/active_admin/views/pages/new.rb +27 -0
  171. data/lib/active_admin/views/pages/show.rb +56 -0
  172. data/lib/active_admin/views/tabs_renderer.rb +58 -0
  173. data/lib/active_admin/views/templates/active_admin/dashboard/index.html.arb +1 -0
  174. data/lib/active_admin/views/templates/active_admin/devise/mailer/reset_password_instructions.html.erb +8 -0
  175. data/lib/active_admin/views/templates/active_admin/devise/mailer/unlock_instructions.html.erb +7 -0
  176. data/lib/active_admin/views/templates/active_admin/devise/passwords/edit.html.erb +16 -0
  177. data/lib/active_admin/views/templates/active_admin/devise/passwords/new.html.erb +14 -0
  178. data/lib/active_admin/views/templates/active_admin/devise/sessions/new.html.erb +18 -0
  179. data/lib/active_admin/views/templates/active_admin/devise/shared/_links.erb +20 -0
  180. data/lib/active_admin/views/templates/active_admin/devise/unlocks/new.html.erb +12 -0
  181. data/lib/active_admin/views/templates/active_admin/resource/edit.html.arb +1 -0
  182. data/lib/active_admin/views/templates/active_admin/resource/index.csv.erb +20 -0
  183. data/lib/active_admin/views/templates/active_admin/resource/index.html.arb +1 -0
  184. data/lib/active_admin/views/templates/active_admin/resource/new.html.arb +1 -0
  185. data/lib/active_admin/views/templates/active_admin/resource/show.html.arb +1 -0
  186. data/lib/active_admin/views/templates/layouts/active_admin.html.erb +39 -0
  187. data/lib/active_admin/views/templates/layouts/active_admin_logged_out.html.erb +31 -0
  188. data/lib/active_admin/views.rb +8 -0
  189. data/lib/active_admin.rb +71 -0
  190. data/lib/activeadmin.rb +1 -0
  191. data/lib/generators/active_admin/devise/devise_generator.rb +49 -0
  192. data/lib/generators/active_admin/install/install_generator.rb +46 -0
  193. data/lib/generators/active_admin/install/templates/active_admin.js +51 -0
  194. data/lib/generators/active_admin/install/templates/active_admin.rb.erb +78 -0
  195. data/lib/generators/active_admin/install/templates/active_admin_vendor.js +382 -0
  196. data/lib/generators/active_admin/install/templates/dashboards.rb +38 -0
  197. data/lib/generators/active_admin/install/templates/images/admin_notes_icon.png +0 -0
  198. data/lib/generators/active_admin/install/templates/images/loading.gif +0 -0
  199. data/lib/generators/active_admin/install/templates/images/nested_menu_arrow.gif +0 -0
  200. data/lib/generators/active_admin/install/templates/images/nested_menu_arrow_dark.gif +0 -0
  201. data/lib/generators/active_admin/install/templates/images/orderable.png +0 -0
  202. data/lib/generators/active_admin/install/templates/migrations/1_create_admin_notes.rb +16 -0
  203. data/lib/generators/active_admin/install/templates/migrations/2_move_admin_notes_to_comments.rb +25 -0
  204. data/lib/generators/active_admin/resource/resource_generator.rb +16 -0
  205. data/lib/generators/active_admin/resource/templates/admin.rb +3 -0
  206. data/spec/integration/belongs_to_spec.rb +42 -0
  207. data/spec/spec_helper.rb +156 -0
  208. data/spec/support/integration_example_group.rb +33 -0
  209. data/spec/support/rails_template.rb +32 -0
  210. data/spec/support/rails_template_with_data.rb +32 -0
  211. data/spec/support/templates/cucumber.rb +24 -0
  212. data/spec/unit/abstract_view_factory_spec.rb +79 -0
  213. data/spec/unit/action_builder_spec.rb +88 -0
  214. data/spec/unit/action_items_spec.rb +27 -0
  215. data/spec/unit/application_spec.rb +67 -0
  216. data/spec/unit/arbre/html/element_finder_methods_spec.rb +54 -0
  217. data/spec/unit/arbre/html/element_spec.rb +224 -0
  218. data/spec/unit/arbre/html/tag_attributes_spec.rb +61 -0
  219. data/spec/unit/arbre/html/tag_spec.rb +63 -0
  220. data/spec/unit/arbre/html_spec.rb +210 -0
  221. data/spec/unit/asset_registration_spec.rb +37 -0
  222. data/spec/unit/auto_link_spec.rb +39 -0
  223. data/spec/unit/belongs_to_spec.rb +45 -0
  224. data/spec/unit/breadcrumbs_spec.rb +110 -0
  225. data/spec/unit/comments_spec.rb +57 -0
  226. data/spec/unit/component_spec.rb +18 -0
  227. data/spec/unit/components/attributes_table_spec.rb +100 -0
  228. data/spec/unit/components/columns_spec.rb +75 -0
  229. data/spec/unit/components/panel_spec.rb +31 -0
  230. data/spec/unit/components/sidebar_section_spec.rb +37 -0
  231. data/spec/unit/components/status_tag_spec.rb +81 -0
  232. data/spec/unit/components/table_for_spec.rb +130 -0
  233. data/spec/unit/controller_filters_spec.rb +27 -0
  234. data/spec/unit/csv_builder_spec.rb +83 -0
  235. data/spec/unit/dashboard_controller_spec.rb +26 -0
  236. data/spec/unit/dashboard_section_spec.rb +56 -0
  237. data/spec/unit/dashboards_spec.rb +59 -0
  238. data/spec/unit/display_name_spec.rb +29 -0
  239. data/spec/unit/event_spec.rb +41 -0
  240. data/spec/unit/filter_form_builder_spec.rb +179 -0
  241. data/spec/unit/form_builder_spec.rb +238 -0
  242. data/spec/unit/menu_item_spec.rb +143 -0
  243. data/spec/unit/menu_spec.rb +53 -0
  244. data/spec/unit/namespace_spec.rb +203 -0
  245. data/spec/unit/pretty_format_spec.rb +35 -0
  246. data/spec/unit/registration_spec.rb +76 -0
  247. data/spec/unit/renderer_spec.rb +108 -0
  248. data/spec/unit/resource_controller/collection_spec.rb +34 -0
  249. data/spec/unit/resource_controller_spec.rb +147 -0
  250. data/spec/unit/resource_spec.rb +290 -0
  251. data/spec/unit/routing_spec.rb +88 -0
  252. data/spec/unit/scope_spec.rb +31 -0
  253. data/spec/unit/tabs_renderer_spec.rb +85 -0
  254. data/spec/unit/view_factory_spec.rb +16 -0
  255. metadata +482 -0
@@ -0,0 +1,67 @@
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
+ it "should have no default current_user_method" do
47
+ application.current_user_method.should == false
48
+ end
49
+
50
+ it "should have no default authentication method" do
51
+ application.authentication_method.should == false
52
+ end
53
+
54
+ describe "files in load path" do
55
+ it "should load files in the first level directory" do
56
+ application.files_in_load_path.should include(File.expand_path("app/admin/dashboards.rb", Rails.root))
57
+ end
58
+
59
+ it "should load files from subdirectories" do
60
+ FileUtils.mkdir_p(File.expand_path("app/admin/public", Rails.root))
61
+ test_file = File.expand_path("app/admin/public/posts.rb", Rails.root)
62
+ FileUtils.touch(test_file)
63
+ application.files_in_load_path.should include(test_file)
64
+ end
65
+ end
66
+
67
+ 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 &lt;br /&gt;"
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
@@ -0,0 +1,61 @@
1
+ require 'spec_helper'
2
+
3
+ describe Arbre::HTML::Tag, "Attributes" do
4
+ include Arbre::HTML
5
+ let(:assigns){ {} }
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="&quot;&gt;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 &gt;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
+ include Arbre::HTML
5
+ let(:assigns){ {} }
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,210 @@
1
+ require 'spec_helper'
2
+
3
+ describe Arbre::HTML do
4
+ include Arbre::HTML
5
+
6
+ let(:assigns){ {} }
7
+
8
+ it "should render a single element" do
9
+ content = span("Hello World")
10
+ content.to_html.should == <<-HTML
11
+ <span>Hello World</span>
12
+ HTML
13
+ end
14
+
15
+ it "should render a child element" do
16
+ content = span do
17
+ span "Hello World"
18
+ end
19
+ content.to_html.should == <<-HTML
20
+ <span>
21
+ <span>Hello World</span>
22
+ </span>
23
+ HTML
24
+ end
25
+
26
+ it "should render an unordered list" do
27
+ content = ul do
28
+ li "First"
29
+ li "Second"
30
+ li "Third"
31
+ end
32
+ content.to_html.should == <<-HTML
33
+ <ul>
34
+ <li>First</li>
35
+ <li>Second</li>
36
+ <li>Third</li>
37
+ </ul>
38
+ HTML
39
+ end
40
+
41
+ it "should return the correct object" do
42
+ list_1 = ul
43
+ list_2 = li
44
+ list_1.should be_instance_of(Arbre::HTML::Ul)
45
+ list_2.should be_instance_of(Arbre::HTML::Li)
46
+ end
47
+
48
+ it "should allow local variables inside the tags" do
49
+ first = "First"
50
+ second = "Second"
51
+ content = ul do
52
+ li first
53
+ li second
54
+ end
55
+ content.to_html.should == <<-EOS
56
+ <ul>
57
+ <li>First</li>
58
+ <li>Second</li>
59
+ </ul>
60
+ EOS
61
+ end
62
+
63
+ it "should add children and nested" do
64
+ content = div do
65
+ ul
66
+ li do
67
+ li
68
+ end
69
+ end
70
+ content.to_html.should == <<-HTML
71
+ <div>
72
+ <ul></ul>
73
+ <li>
74
+ <li></li>
75
+ </li>
76
+ </div>
77
+ HTML
78
+ end
79
+
80
+ it "should pass the element in to the block if asked for" do
81
+ content = div do |d|
82
+ d.ul do
83
+ li
84
+ end
85
+ end
86
+ content.to_html.should == <<-HTML
87
+ <div>
88
+ <ul>
89
+ <li></li>
90
+ </ul>
91
+ </div>
92
+ HTML
93
+ end
94
+
95
+ it "should move content tags between parents" do
96
+ content = div do
97
+ span(ul(li))
98
+ end
99
+ content.to_html.should == <<-HTML
100
+ <div>
101
+ <span>
102
+ <ul>
103
+ <li></li>
104
+ </ul>
105
+ </span>
106
+ </div>
107
+ HTML
108
+ end
109
+
110
+ it "should add content to the parent if the element is passed into block" do
111
+ content = div do |d|
112
+ d.id = "my-tag"
113
+ ul do
114
+ li
115
+ end
116
+ end
117
+ content.to_html.should == <<-HTML
118
+ <div id="my-tag">
119
+ <ul>
120
+ <li></li>
121
+ </ul>
122
+ </div>
123
+ HTML
124
+ end
125
+
126
+ it "should have the parent set on it" do
127
+ item = nil
128
+ list = ul do
129
+ li "Hello"
130
+ item = li "World"
131
+ end
132
+ item.parent.should == list
133
+ end
134
+
135
+ it "should set a string content return value with no children" do
136
+ li do
137
+ "Hello World"
138
+ end.to_html.should == <<-HTML
139
+ <li>Hello World</li>
140
+ HTML
141
+ end
142
+
143
+ describe "text nodes" do
144
+ it "should turn strings into text nodes" do
145
+ li do
146
+ "Hello World"
147
+ end.children.first.should be_instance_of(Arbre::HTML::TextNode)
148
+ end
149
+ end
150
+
151
+ describe "self-closing nodes" do
152
+ it "should not self-close script tags" do
153
+ tag = script :type => 'text/javascript'
154
+ tag.to_html.should == <<-HTML
155
+ <script type="text/javascript"></script>
156
+ HTML
157
+ end
158
+ it "should self-close meta tags" do
159
+ tag = meta :content => "text/html; charset=utf-8"
160
+ tag.to_html.should == <<-HTML
161
+ <meta content="text/html; charset=utf-8\"/>
162
+ HTML
163
+ end
164
+ it "should self-close link tags" do
165
+ tag = link :rel => "stylesheet"
166
+ tag.to_html.should == <<-HTML
167
+ <link rel="stylesheet"/>
168
+ HTML
169
+ end
170
+ end
171
+
172
+ describe "html safe" do
173
+ it "should escape the contents" do
174
+ span("<br />").to_html.should == <<-HTML
175
+ <span>&lt;br /&gt;</span>
176
+ HTML
177
+ end
178
+
179
+ it "should return html safe strings" do
180
+ span("<br />").to_html.should be_html_safe
181
+ end
182
+
183
+ it "should not escape html passed in" do
184
+ span(span("<br />")).to_html.should == <<-HTML
185
+ <span>
186
+ <span>&lt;br /&gt;</span>
187
+ </span>
188
+ HTML
189
+ end
190
+
191
+ it "should escape string contents when passed in block" do
192
+ span {
193
+ span {
194
+ "<br />"
195
+ }
196
+ }.to_html.should == <<-HTML
197
+ <span>
198
+ <span>&lt;br /&gt;</span>
199
+ </span>
200
+ HTML
201
+ end
202
+
203
+ it "should escape the contents of attributes" do
204
+ span(:class => "<br />").to_html.should == <<-HTML
205
+ <span class="&lt;br /&gt;"></span>
206
+ HTML
207
+ end
208
+ end
209
+
210
+ end