activeadmin-orac 1.0.0.pre4

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 (529) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +49 -0
  3. data/.hound.yml +14 -0
  4. data/.travis.yml +40 -0
  5. data/.yardopts +8 -0
  6. data/CHANGELOG.md +120 -0
  7. data/CODE_OF_CONDUCT.md +22 -0
  8. data/CONTRIBUTING.md +144 -0
  9. data/Gemfile +78 -0
  10. data/Guardfile +8 -0
  11. data/LICENSE +20 -0
  12. data/README.md +102 -0
  13. data/Rakefile +33 -0
  14. data/activeadmin.gemspec +31 -0
  15. data/app/assets/images/active_admin/datepicker/datepicker-input-icon.png +0 -0
  16. data/app/assets/images/active_admin/nested_menu_arrow.gif +0 -0
  17. data/app/assets/images/active_admin/nested_menu_arrow_dark.gif +0 -0
  18. data/app/assets/images/active_admin/orderable.png +0 -0
  19. data/app/assets/javascripts/active_admin/base.js.coffee +9 -0
  20. data/app/assets/javascripts/active_admin/ext/jquery-ui.js.coffee +6 -0
  21. data/app/assets/javascripts/active_admin/ext/jquery.js.coffee +7 -0
  22. data/app/assets/javascripts/active_admin/initializers/batch_actions.js.coffee +7 -0
  23. data/app/assets/javascripts/active_admin/initializers/datepicker.js.coffee +10 -0
  24. data/app/assets/javascripts/active_admin/initializers/filters.js.coffee +22 -0
  25. data/app/assets/javascripts/active_admin/initializers/tabs.js.coffee +3 -0
  26. data/app/assets/javascripts/active_admin/jquery_ui.js.erb +11 -0
  27. data/app/assets/javascripts/active_admin/lib/batch_actions.js.coffee +39 -0
  28. data/app/assets/javascripts/active_admin/lib/checkbox-toggler.js.coffee +44 -0
  29. data/app/assets/javascripts/active_admin/lib/dropdown-menu.js.coffee +101 -0
  30. data/app/assets/javascripts/active_admin/lib/flash.js.coffee +19 -0
  31. data/app/assets/javascripts/active_admin/lib/has_many.js.coffee +79 -0
  32. data/app/assets/javascripts/active_admin/lib/modal_dialog.js.coffee +45 -0
  33. data/app/assets/javascripts/active_admin/lib/per_page.js.coffee +42 -0
  34. data/app/assets/javascripts/active_admin/lib/table-checkbox-toggler.js.coffee +24 -0
  35. data/app/assets/stylesheets/active_admin/_base.scss +41 -0
  36. data/app/assets/stylesheets/active_admin/_forms.scss +333 -0
  37. data/app/assets/stylesheets/active_admin/_header.scss +156 -0
  38. data/app/assets/stylesheets/active_admin/_mixins.scss +1 -0
  39. data/app/assets/stylesheets/active_admin/_typography.scss +100 -0
  40. data/app/assets/stylesheets/active_admin/components/_batch_actions.scss +11 -0
  41. data/app/assets/stylesheets/active_admin/components/_blank_slates.scss +30 -0
  42. data/app/assets/stylesheets/active_admin/components/_breadcrumbs.scss +20 -0
  43. data/app/assets/stylesheets/active_admin/components/_buttons.scss +6 -0
  44. data/app/assets/stylesheets/active_admin/components/_columns.scss +3 -0
  45. data/app/assets/stylesheets/active_admin/components/_comments.scss +41 -0
  46. data/app/assets/stylesheets/active_admin/components/_date_picker.scss +149 -0
  47. data/app/assets/stylesheets/active_admin/components/_dropdown_menu.scss +152 -0
  48. data/app/assets/stylesheets/active_admin/components/_flash_messages.scss +37 -0
  49. data/app/assets/stylesheets/active_admin/components/_grid.scss +9 -0
  50. data/app/assets/stylesheets/active_admin/components/_index_list.scss +12 -0
  51. data/app/assets/stylesheets/active_admin/components/_links.scss +5 -0
  52. data/app/assets/stylesheets/active_admin/components/_modal_dialog.scss +34 -0
  53. data/app/assets/stylesheets/active_admin/components/_pagination.scss +44 -0
  54. data/app/assets/stylesheets/active_admin/components/_panels.scss +6 -0
  55. data/app/assets/stylesheets/active_admin/components/_scopes.scss +10 -0
  56. data/app/assets/stylesheets/active_admin/components/_status_tags.scss +16 -0
  57. data/app/assets/stylesheets/active_admin/components/_table_tools.scss +67 -0
  58. data/app/assets/stylesheets/active_admin/components/_tables.scss +110 -0
  59. data/app/assets/stylesheets/active_admin/components/_tabs.scss +65 -0
  60. data/app/assets/stylesheets/active_admin/components/_unsupported_browser.scss +16 -0
  61. data/app/assets/stylesheets/active_admin/mixins/_all.scss +10 -0
  62. data/app/assets/stylesheets/active_admin/mixins/_buttons.scss +65 -0
  63. data/app/assets/stylesheets/active_admin/mixins/_gradients.scss +28 -0
  64. data/app/assets/stylesheets/active_admin/mixins/_reset.scss +165 -0
  65. data/app/assets/stylesheets/active_admin/mixins/_rounded.scss +22 -0
  66. data/app/assets/stylesheets/active_admin/mixins/_sections.scss +41 -0
  67. data/app/assets/stylesheets/active_admin/mixins/_shadows.scss +15 -0
  68. data/app/assets/stylesheets/active_admin/mixins/_typography.scss +3 -0
  69. data/app/assets/stylesheets/active_admin/mixins/_utilities.scss +17 -0
  70. data/app/assets/stylesheets/active_admin/mixins/_variables.scss +34 -0
  71. data/app/assets/stylesheets/active_admin/pages/_logged_out.scss +44 -0
  72. data/app/assets/stylesheets/active_admin/print.scss +288 -0
  73. data/app/assets/stylesheets/active_admin/structure/_footer.scss +14 -0
  74. data/app/assets/stylesheets/active_admin/structure/_main_structure.scss +29 -0
  75. data/app/assets/stylesheets/active_admin/structure/_title_bar.scss +41 -0
  76. data/app/views/active_admin/devise/confirmations/new.html.erb +15 -0
  77. data/app/views/active_admin/devise/mailer/reset_password_instructions.html.erb +8 -0
  78. data/app/views/active_admin/devise/mailer/unlock_instructions.html.erb +7 -0
  79. data/app/views/active_admin/devise/passwords/edit.html.erb +18 -0
  80. data/app/views/active_admin/devise/passwords/new.html.erb +15 -0
  81. data/app/views/active_admin/devise/registrations/new.html.erb +22 -0
  82. data/app/views/active_admin/devise/sessions/new.html.erb +20 -0
  83. data/app/views/active_admin/devise/shared/_links.erb +27 -0
  84. data/app/views/active_admin/devise/unlocks/new.html.erb +15 -0
  85. data/app/views/active_admin/page/index.html.arb +1 -0
  86. data/app/views/active_admin/resource/edit.html.arb +1 -0
  87. data/app/views/active_admin/resource/index.html.arb +1 -0
  88. data/app/views/active_admin/resource/new.html.arb +1 -0
  89. data/app/views/active_admin/resource/show.html.arb +1 -0
  90. data/app/views/layouts/active_admin.html.arb +1 -0
  91. data/app/views/layouts/active_admin_logged_out.html.erb +39 -0
  92. data/config/locales/ar.yml +136 -0
  93. data/config/locales/bg.yml +121 -0
  94. data/config/locales/bs.yml +122 -0
  95. data/config/locales/ca.yml +107 -0
  96. data/config/locales/cs.yml +110 -0
  97. data/config/locales/da.yml +106 -0
  98. data/config/locales/de-CH.yml +102 -0
  99. data/config/locales/de.yml +135 -0
  100. data/config/locales/el.yml +127 -0
  101. data/config/locales/en-GB.yml +98 -0
  102. data/config/locales/en.yml +136 -0
  103. data/config/locales/es-MX.yml +94 -0
  104. data/config/locales/es.yml +136 -0
  105. data/config/locales/fa.yml +120 -0
  106. data/config/locales/fi.yml +113 -0
  107. data/config/locales/fr.yml +119 -0
  108. data/config/locales/he.yml +95 -0
  109. data/config/locales/hr.yml +124 -0
  110. data/config/locales/hu.yml +99 -0
  111. data/config/locales/id.yml +136 -0
  112. data/config/locales/it.yml +136 -0
  113. data/config/locales/ja.yml +136 -0
  114. data/config/locales/ko.yml +121 -0
  115. data/config/locales/lt.yml +121 -0
  116. data/config/locales/lv.yml +93 -0
  117. data/config/locales/nb.yml +121 -0
  118. data/config/locales/nl.yml +134 -0
  119. data/config/locales/pl.yml +98 -0
  120. data/config/locales/pt-BR.yml +136 -0
  121. data/config/locales/pt-PT.yml +93 -0
  122. data/config/locales/ro.yml +97 -0
  123. data/config/locales/ru.yml +140 -0
  124. data/config/locales/sv-SE.yml +134 -0
  125. data/config/locales/tr.yml +136 -0
  126. data/config/locales/uk.yml +137 -0
  127. data/config/locales/vi.yml +94 -0
  128. data/config/locales/zh-CN.yml +112 -0
  129. data/config/locales/zh-TW.yml +136 -0
  130. data/cucumber.yml +3 -0
  131. data/docs/0-installation.md +112 -0
  132. data/docs/1-general-configuration.md +171 -0
  133. data/docs/10-custom-pages.md +106 -0
  134. data/docs/11-decorators.md +55 -0
  135. data/docs/12-arbre-components.md +150 -0
  136. data/docs/13-authorization-adapter.md +248 -0
  137. data/docs/14-gotchas.md +116 -0
  138. data/docs/2-resource-customization.md +422 -0
  139. data/docs/3-index-pages.md +272 -0
  140. data/docs/3-index-pages/custom-index.md +31 -0
  141. data/docs/3-index-pages/index-as-block.md +21 -0
  142. data/docs/3-index-pages/index-as-blog.md +71 -0
  143. data/docs/3-index-pages/index-as-grid.md +29 -0
  144. data/docs/3-index-pages/index-as-table.md +213 -0
  145. data/docs/4-csv-format.md +58 -0
  146. data/docs/5-forms.md +172 -0
  147. data/docs/6-show-pages.md +105 -0
  148. data/docs/7-sidebars.md +71 -0
  149. data/docs/8-custom-actions.md +160 -0
  150. data/docs/9-batch-actions.md +233 -0
  151. data/docs/README.md +24 -0
  152. data/features/action_item.feature +73 -0
  153. data/features/authorization.feature +64 -0
  154. data/features/authorization_cancan.feature +52 -0
  155. data/features/authorization_pundit.feature +37 -0
  156. data/features/belongs_to.feature +66 -0
  157. data/features/breadcrumb.feature +75 -0
  158. data/features/comments/commenting.feature +171 -0
  159. data/features/comments/viewing_index.feature +19 -0
  160. data/features/dashboard.feature +16 -0
  161. data/features/decorators.feature +43 -0
  162. data/features/development_reloading.feature +30 -0
  163. data/features/edit_page.feature +117 -0
  164. data/features/favicon.feature +20 -0
  165. data/features/first_boot.feature +16 -0
  166. data/features/global_navigation.feature +29 -0
  167. data/features/i18n.feature +43 -0
  168. data/features/index/batch_actions.feature +196 -0
  169. data/features/index/filters.feature +161 -0
  170. data/features/index/format_as_csv.feature +203 -0
  171. data/features/index/formats.feature +66 -0
  172. data/features/index/index_as_block.feature +15 -0
  173. data/features/index/index_as_blog.feature +69 -0
  174. data/features/index/index_as_grid.feature +45 -0
  175. data/features/index/index_as_table.feature +291 -0
  176. data/features/index/index_blank_slate.feature +83 -0
  177. data/features/index/index_parameters.feature +75 -0
  178. data/features/index/index_scope_to.feature +56 -0
  179. data/features/index/index_scopes.feature +251 -0
  180. data/features/index/page_title.feature +42 -0
  181. data/features/index/pagination.feature +63 -0
  182. data/features/index/switch_index_view.feature +73 -0
  183. data/features/menu.feature +53 -0
  184. data/features/meta_tags.feature +21 -0
  185. data/features/new_page.feature +109 -0
  186. data/features/registering_assets.feature +34 -0
  187. data/features/registering_pages.feature +148 -0
  188. data/features/registering_resources.feature +33 -0
  189. data/features/renamed_resource.feature +32 -0
  190. data/features/root_to.feature +17 -0
  191. data/features/show/columns.feature +40 -0
  192. data/features/show/default_content.feature +44 -0
  193. data/features/show/page_title.feature +59 -0
  194. data/features/show/tabs.feature +27 -0
  195. data/features/sidebar_sections.feature +210 -0
  196. data/features/site_title.feature +47 -0
  197. data/features/specifying_actions.feature +93 -0
  198. data/features/step_definitions/action_item_steps.rb +7 -0
  199. data/features/step_definitions/action_link_steps.rb +20 -0
  200. data/features/step_definitions/additional_web_steps.rb +81 -0
  201. data/features/step_definitions/asset_steps.rb +15 -0
  202. data/features/step_definitions/attribute_steps.rb +18 -0
  203. data/features/step_definitions/batch_action_steps.rb +81 -0
  204. data/features/step_definitions/blog_steps.rb +3 -0
  205. data/features/step_definitions/breadcrumb_steps.rb +3 -0
  206. data/features/step_definitions/column_steps.rb +8 -0
  207. data/features/step_definitions/comment_steps.rb +12 -0
  208. data/features/step_definitions/configuration_steps.rb +100 -0
  209. data/features/step_definitions/dashboard_steps.rb +15 -0
  210. data/features/step_definitions/factory_steps.rb +35 -0
  211. data/features/step_definitions/filter_steps.rb +39 -0
  212. data/features/step_definitions/flash_steps.rb +11 -0
  213. data/features/step_definitions/format_steps.rb +52 -0
  214. data/features/step_definitions/i18n_steps.rb +3 -0
  215. data/features/step_definitions/index_scope_steps.rb +21 -0
  216. data/features/step_definitions/index_views_steps.rb +3 -0
  217. data/features/step_definitions/layout_steps.rb +3 -0
  218. data/features/step_definitions/member_link_steps.rb +7 -0
  219. data/features/step_definitions/menu_steps.rb +11 -0
  220. data/features/step_definitions/meta_tag_steps.rb +3 -0
  221. data/features/step_definitions/pagination_steps.rb +15 -0
  222. data/features/step_definitions/sidebar_steps.rb +13 -0
  223. data/features/step_definitions/site_title_steps.rb +17 -0
  224. data/features/step_definitions/symbol_leak_steps.rb +3 -0
  225. data/features/step_definitions/tab_steps.rb +8 -0
  226. data/features/step_definitions/table_steps.rb +116 -0
  227. data/features/step_definitions/user_steps.rb +52 -0
  228. data/features/step_definitions/web_steps.rb +85 -0
  229. data/features/sti_resource.feature +65 -0
  230. data/features/strong_parameters.feature +73 -0
  231. data/features/support/env.rb +162 -0
  232. data/features/support/paths.rb +71 -0
  233. data/features/support/selectors.rb +45 -0
  234. data/features/symbol_leak.feature +35 -0
  235. data/features/users/logging_in.feature +36 -0
  236. data/features/users/logging_out.feature +13 -0
  237. data/features/users/resetting_password.feature +34 -0
  238. data/lib/active_admin.rb +130 -0
  239. data/lib/active_admin/abstract_view_factory.rb +85 -0
  240. data/lib/active_admin/application.rb +324 -0
  241. data/lib/active_admin/asset_registration.rb +29 -0
  242. data/lib/active_admin/authorization_adapter.rb +132 -0
  243. data/lib/active_admin/base_controller.rb +87 -0
  244. data/lib/active_admin/base_controller/authorization.rb +130 -0
  245. data/lib/active_admin/base_controller/menu.rb +38 -0
  246. data/lib/active_admin/batch_actions.rb +16 -0
  247. data/lib/active_admin/batch_actions/controller.rb +40 -0
  248. data/lib/active_admin/batch_actions/resource_extension.rb +159 -0
  249. data/lib/active_admin/batch_actions/views/batch_action_form.rb +38 -0
  250. data/lib/active_admin/batch_actions/views/batch_action_selector.rb +58 -0
  251. data/lib/active_admin/batch_actions/views/selection_cells.rb +37 -0
  252. data/lib/active_admin/callbacks.rb +88 -0
  253. data/lib/active_admin/cancan_adapter.rb +36 -0
  254. data/lib/active_admin/component.rb +5 -0
  255. data/lib/active_admin/controller_action.rb +12 -0
  256. data/lib/active_admin/csv_builder.rb +129 -0
  257. data/lib/active_admin/dependency.rb +168 -0
  258. data/lib/active_admin/deprecation.rb +35 -0
  259. data/lib/active_admin/devise.rb +80 -0
  260. data/lib/active_admin/dsl.rb +173 -0
  261. data/lib/active_admin/engine.rb +16 -0
  262. data/lib/active_admin/error.rb +62 -0
  263. data/lib/active_admin/event.rb +24 -0
  264. data/lib/active_admin/filters.rb +9 -0
  265. data/lib/active_admin/filters/active.rb +30 -0
  266. data/lib/active_admin/filters/dsl.rb +21 -0
  267. data/lib/active_admin/filters/forms.rb +83 -0
  268. data/lib/active_admin/filters/formtastic_addons.rb +79 -0
  269. data/lib/active_admin/filters/humanized.rb +68 -0
  270. data/lib/active_admin/filters/resource_extension.rb +194 -0
  271. data/lib/active_admin/form_builder.rb +145 -0
  272. data/lib/active_admin/generators/boilerplate.rb +45 -0
  273. data/lib/active_admin/helpers/collection.rb +17 -0
  274. data/lib/active_admin/helpers/i18n.rb +7 -0
  275. data/lib/active_admin/helpers/optional_display.rb +38 -0
  276. data/lib/active_admin/helpers/routes/url_helpers.rb +15 -0
  277. data/lib/active_admin/helpers/scope_chain.rb +23 -0
  278. data/lib/active_admin/helpers/settings.rb +115 -0
  279. data/lib/active_admin/inputs.rb +20 -0
  280. data/lib/active_admin/inputs/datepicker_input.rb +20 -0
  281. data/lib/active_admin/inputs/filters/base.rb +44 -0
  282. data/lib/active_admin/inputs/filters/base/search_method_select.rb +75 -0
  283. data/lib/active_admin/inputs/filters/boolean_input.rb +24 -0
  284. data/lib/active_admin/inputs/filters/check_boxes_input.rb +50 -0
  285. data/lib/active_admin/inputs/filters/date_picker_input.rb +13 -0
  286. data/lib/active_admin/inputs/filters/date_range_input.rb +36 -0
  287. data/lib/active_admin/inputs/filters/numeric_input.rb +12 -0
  288. data/lib/active_admin/inputs/filters/select_input.rb +55 -0
  289. data/lib/active_admin/inputs/filters/string_input.rb +26 -0
  290. data/lib/active_admin/menu.rb +108 -0
  291. data/lib/active_admin/menu_collection.rb +93 -0
  292. data/lib/active_admin/menu_item.rb +97 -0
  293. data/lib/active_admin/namespace.rb +247 -0
  294. data/lib/active_admin/order_clause.rb +26 -0
  295. data/lib/active_admin/orm/active_record.rb +5 -0
  296. data/lib/active_admin/orm/active_record/comments.rb +95 -0
  297. data/lib/active_admin/orm/active_record/comments/comment.rb +45 -0
  298. data/lib/active_admin/orm/active_record/comments/namespace_helper.rb +14 -0
  299. data/lib/active_admin/orm/active_record/comments/resource_helper.rb +17 -0
  300. data/lib/active_admin/orm/active_record/comments/show_page_helper.rb +23 -0
  301. data/lib/active_admin/orm/active_record/comments/views.rb +2 -0
  302. data/lib/active_admin/orm/active_record/comments/views/active_admin_comments.rb +88 -0
  303. data/lib/active_admin/orm/mongoid.rb +1 -0
  304. data/lib/active_admin/orm/mongoid/.gitkeep +0 -0
  305. data/lib/active_admin/page.rb +92 -0
  306. data/lib/active_admin/page_controller.rb +33 -0
  307. data/lib/active_admin/page_dsl.rb +28 -0
  308. data/lib/active_admin/page_presenter.rb +32 -0
  309. data/lib/active_admin/pundit_adapter.rb +68 -0
  310. data/lib/active_admin/reloader.rb +25 -0
  311. data/lib/active_admin/resource.rb +168 -0
  312. data/lib/active_admin/resource/action_items.rb +108 -0
  313. data/lib/active_admin/resource/belongs_to.rb +44 -0
  314. data/lib/active_admin/resource/controllers.rb +19 -0
  315. data/lib/active_admin/resource/includes.rb +12 -0
  316. data/lib/active_admin/resource/menu.rb +64 -0
  317. data/lib/active_admin/resource/naming.rb +62 -0
  318. data/lib/active_admin/resource/page_presenters.rb +82 -0
  319. data/lib/active_admin/resource/pagination.rb +23 -0
  320. data/lib/active_admin/resource/routes.rb +115 -0
  321. data/lib/active_admin/resource/scope_to.rb +74 -0
  322. data/lib/active_admin/resource/scopes.rb +50 -0
  323. data/lib/active_admin/resource/sidebars.rb +28 -0
  324. data/lib/active_admin/resource_collection.rb +72 -0
  325. data/lib/active_admin/resource_controller.rb +51 -0
  326. data/lib/active_admin/resource_controller/action_builder.rb +21 -0
  327. data/lib/active_admin/resource_controller/data_access.rb +317 -0
  328. data/lib/active_admin/resource_controller/decorators.rb +102 -0
  329. data/lib/active_admin/resource_controller/resource_class_methods.rb +24 -0
  330. data/lib/active_admin/resource_controller/scoping.rb +31 -0
  331. data/lib/active_admin/resource_controller/sidebars.rb +18 -0
  332. data/lib/active_admin/resource_controller/streaming.rb +43 -0
  333. data/lib/active_admin/resource_dsl.rb +190 -0
  334. data/lib/active_admin/router.rb +106 -0
  335. data/lib/active_admin/scope.rb +56 -0
  336. data/lib/active_admin/sidebar_section.rb +37 -0
  337. data/lib/active_admin/version.rb +3 -0
  338. data/lib/active_admin/view_factory.rb +27 -0
  339. data/lib/active_admin/view_helpers.rb +19 -0
  340. data/lib/active_admin/view_helpers/active_admin_application_helper.rb +12 -0
  341. data/lib/active_admin/view_helpers/auto_link_helper.rb +45 -0
  342. data/lib/active_admin/view_helpers/breadcrumb_helper.rb +33 -0
  343. data/lib/active_admin/view_helpers/display_helper.rb +97 -0
  344. data/lib/active_admin/view_helpers/download_format_links_helper.rb +46 -0
  345. data/lib/active_admin/view_helpers/fields_for.rb +51 -0
  346. data/lib/active_admin/view_helpers/flash_helper.rb +14 -0
  347. data/lib/active_admin/view_helpers/form_helper.rb +20 -0
  348. data/lib/active_admin/view_helpers/method_or_proc_helper.rb +97 -0
  349. data/lib/active_admin/view_helpers/sidebar_helper.rb +15 -0
  350. data/lib/active_admin/view_helpers/title_helper.rb +11 -0
  351. data/lib/active_admin/view_helpers/view_factory_helper.rb +11 -0
  352. data/lib/active_admin/views.rb +8 -0
  353. data/lib/active_admin/views/action_items.rb +17 -0
  354. data/lib/active_admin/views/components/active_admin_form.rb +124 -0
  355. data/lib/active_admin/views/components/attributes_table.rb +94 -0
  356. data/lib/active_admin/views/components/blank_slate.rb +17 -0
  357. data/lib/active_admin/views/components/columns.rb +161 -0
  358. data/lib/active_admin/views/components/dropdown_menu.rb +71 -0
  359. data/lib/active_admin/views/components/index_list.rb +68 -0
  360. data/lib/active_admin/views/components/paginated_collection.rb +163 -0
  361. data/lib/active_admin/views/components/panel.rb +38 -0
  362. data/lib/active_admin/views/components/scopes.rb +66 -0
  363. data/lib/active_admin/views/components/sidebar_section.rb +34 -0
  364. data/lib/active_admin/views/components/site_title.rb +55 -0
  365. data/lib/active_admin/views/components/status_tag.rb +80 -0
  366. data/lib/active_admin/views/components/table_for.rb +218 -0
  367. data/lib/active_admin/views/components/tabs.rb +28 -0
  368. data/lib/active_admin/views/components/unsupported_browser.rb +11 -0
  369. data/lib/active_admin/views/footer.rb +20 -0
  370. data/lib/active_admin/views/header.rb +32 -0
  371. data/lib/active_admin/views/index_as_block.rb +36 -0
  372. data/lib/active_admin/views/index_as_blog.rb +156 -0
  373. data/lib/active_admin/views/index_as_grid.rb +80 -0
  374. data/lib/active_admin/views/index_as_table.rb +373 -0
  375. data/lib/active_admin/views/pages/base.rb +147 -0
  376. data/lib/active_admin/views/pages/form.rb +65 -0
  377. data/lib/active_admin/views/pages/index.rb +163 -0
  378. data/lib/active_admin/views/pages/layout.rb +26 -0
  379. data/lib/active_admin/views/pages/page.rb +30 -0
  380. data/lib/active_admin/views/pages/show.rb +59 -0
  381. data/lib/active_admin/views/tabbed_navigation.rb +66 -0
  382. data/lib/active_admin/views/title_bar.rb +55 -0
  383. data/lib/activeadmin.rb +1 -0
  384. data/lib/generators/active_admin/assets/assets_generator.rb +14 -0
  385. data/lib/generators/active_admin/assets/templates/active_admin.js.coffee +1 -0
  386. data/lib/generators/active_admin/assets/templates/active_admin.scss +17 -0
  387. data/lib/generators/active_admin/devise/devise_generator.rb +65 -0
  388. data/lib/generators/active_admin/install/install_generator.rb +45 -0
  389. data/lib/generators/active_admin/install/templates/active_admin.rb.erb +272 -0
  390. data/lib/generators/active_admin/install/templates/admin_user.rb.erb +30 -0
  391. data/lib/generators/active_admin/install/templates/dashboard.rb +33 -0
  392. data/lib/generators/active_admin/install/templates/migrations/create_active_admin_comments.rb +19 -0
  393. data/lib/generators/active_admin/page/USAGE +8 -0
  394. data/lib/generators/active_admin/page/page_generator.rb +12 -0
  395. data/lib/generators/active_admin/page/templates/page.rb +5 -0
  396. data/lib/generators/active_admin/resource/resource_generator.rb +20 -0
  397. data/lib/generators/active_admin/resource/templates/admin.rb +45 -0
  398. data/lib/ransack_ext.rb +20 -0
  399. data/script/local +53 -0
  400. data/script/travis_cache +107 -0
  401. data/script/use_rails +53 -0
  402. data/spec/javascripts/coffeescripts/jquery.aa.checkbox-toggler-spec.js.coffee +50 -0
  403. data/spec/javascripts/coffeescripts/jquery.aa.flash.js.coffee +25 -0
  404. data/spec/javascripts/coffeescripts/jquery.aa.table-checkbox-toggler-spec.js.coffee +34 -0
  405. data/spec/javascripts/fixtures/checkboxes.html +9 -0
  406. data/spec/javascripts/fixtures/flashes.html +2 -0
  407. data/spec/javascripts/fixtures/table_checkboxes.html +17 -0
  408. data/spec/javascripts/helpers/SpecHelper.js +3 -0
  409. data/spec/javascripts/support/jasmine.yml +74 -0
  410. data/spec/javascripts/support/jasmine_config.rb +23 -0
  411. data/spec/javascripts/support/jasmine_runner.rb +32 -0
  412. data/spec/rails_helper.rb +161 -0
  413. data/spec/requests/default_namespace_spec.rb +61 -0
  414. data/spec/requests/javascript_spec.rb +22 -0
  415. data/spec/requests/memory_spec.rb +21 -0
  416. data/spec/requests/stylesheets_spec.rb +18 -0
  417. data/spec/spec_helper.rb +17 -0
  418. data/spec/support/active_admin_request_helpers.rb +27 -0
  419. data/spec/support/deferred_garbage_collection.rb +19 -0
  420. data/spec/support/detect_rails_version.rb +34 -0
  421. data/spec/support/jslint.yml +80 -0
  422. data/spec/support/rails_template.rb +162 -0
  423. data/spec/support/rails_template_with_data.rb +74 -0
  424. data/spec/support/templates/admin/stores.rb +9 -0
  425. data/spec/support/templates/en.yml +8 -0
  426. data/spec/support/templates/manifest.js +3 -0
  427. data/spec/support/templates/policies/active_admin/comment_policy.rb +9 -0
  428. data/spec/support/templates/policies/active_admin/page_policy.rb +18 -0
  429. data/spec/support/templates/policies/admin_user_policy.rb +11 -0
  430. data/spec/support/templates/policies/application_policy.rb +45 -0
  431. data/spec/support/templates/policies/category_policy.rb +7 -0
  432. data/spec/support/templates/policies/post_policy.rb +15 -0
  433. data/spec/support/templates/policies/store_policy.rb +11 -0
  434. data/spec/support/templates/policies/user_policy.rb +11 -0
  435. data/spec/support/templates/post_decorator.rb +11 -0
  436. data/spec/unit/abstract_view_factory_spec.rb +79 -0
  437. data/spec/unit/action_builder_spec.rb +134 -0
  438. data/spec/unit/active_admin_spec.rb +11 -0
  439. data/spec/unit/application_spec.rb +165 -0
  440. data/spec/unit/asset_registration_spec.rb +52 -0
  441. data/spec/unit/authorization/authorization_adapter_spec.rb +61 -0
  442. data/spec/unit/authorization/controller_authorization_spec.rb +39 -0
  443. data/spec/unit/authorization/index_overriding_spec.rb +23 -0
  444. data/spec/unit/auto_link_spec.rb +69 -0
  445. data/spec/unit/batch_actions/resource_spec.rb +97 -0
  446. data/spec/unit/batch_actions/settings_spec.rb +61 -0
  447. data/spec/unit/belongs_to_spec.rb +65 -0
  448. data/spec/unit/cancan_adapter_spec.rb +43 -0
  449. data/spec/unit/comments_spec.rb +188 -0
  450. data/spec/unit/component_spec.rb +18 -0
  451. data/spec/unit/config_shared_examples.rb +59 -0
  452. data/spec/unit/controller_filters_spec.rb +41 -0
  453. data/spec/unit/csv_builder_spec.rb +303 -0
  454. data/spec/unit/dependency_spec.rb +135 -0
  455. data/spec/unit/devise_spec.rb +96 -0
  456. data/spec/unit/dsl_spec.rb +122 -0
  457. data/spec/unit/filters/filter_form_builder_spec.rb +434 -0
  458. data/spec/unit/filters/humanized_spec.rb +64 -0
  459. data/spec/unit/filters/resource_spec.rb +128 -0
  460. data/spec/unit/form_builder_spec.rb +932 -0
  461. data/spec/unit/generators/install_spec.rb +24 -0
  462. data/spec/unit/helpers/collection_spec.rb +65 -0
  463. data/spec/unit/helpers/scope_chain_spec.rb +36 -0
  464. data/spec/unit/helpers/settings_spec.rb +30 -0
  465. data/spec/unit/i18n_spec.rb +12 -0
  466. data/spec/unit/menu_collection_spec.rb +62 -0
  467. data/spec/unit/menu_item_spec.rb +143 -0
  468. data/spec/unit/menu_spec.rb +71 -0
  469. data/spec/unit/namespace/authorization_spec.rb +27 -0
  470. data/spec/unit/namespace/register_page_spec.rb +73 -0
  471. data/spec/unit/namespace/register_resource_spec.rb +160 -0
  472. data/spec/unit/namespace_spec.rb +103 -0
  473. data/spec/unit/order_clause_spec.rb +81 -0
  474. data/spec/unit/page_controller_spec.rb +5 -0
  475. data/spec/unit/page_spec.rb +78 -0
  476. data/spec/unit/pretty_format_spec.rb +77 -0
  477. data/spec/unit/pundit_adapter_spec.rb +98 -0
  478. data/spec/unit/resource/action_items_spec.rb +65 -0
  479. data/spec/unit/resource/includes_spec.rb +21 -0
  480. data/spec/unit/resource/menu_spec.rb +18 -0
  481. data/spec/unit/resource/naming_spec.rb +122 -0
  482. data/spec/unit/resource/page_presenters_spec.rb +44 -0
  483. data/spec/unit/resource/pagination_spec.rb +38 -0
  484. data/spec/unit/resource/routes_spec.rb +77 -0
  485. data/spec/unit/resource/scopes_spec.rb +50 -0
  486. data/spec/unit/resource/sidebars_spec.rb +43 -0
  487. data/spec/unit/resource_collection_spec.rb +175 -0
  488. data/spec/unit/resource_controller/data_access_spec.rb +140 -0
  489. data/spec/unit/resource_controller/decorators_spec.rb +94 -0
  490. data/spec/unit/resource_controller/sidebars_spec.rb +38 -0
  491. data/spec/unit/resource_controller_spec.rb +269 -0
  492. data/spec/unit/resource_registration_spec.rb +56 -0
  493. data/spec/unit/resource_spec.rb +337 -0
  494. data/spec/unit/routing_spec.rb +185 -0
  495. data/spec/unit/scope_spec.rb +185 -0
  496. data/spec/unit/settings_spec.rb +118 -0
  497. data/spec/unit/view_factory_spec.rb +19 -0
  498. data/spec/unit/view_helpers/breadcrumbs_spec.rb +217 -0
  499. data/spec/unit/view_helpers/display_helper_spec.rb +165 -0
  500. data/spec/unit/view_helpers/download_format_links_helper_spec.rb +39 -0
  501. data/spec/unit/view_helpers/fields_for_spec.rb +50 -0
  502. data/spec/unit/view_helpers/flash_helper_spec.rb +25 -0
  503. data/spec/unit/view_helpers/form_helper_spec.rb +43 -0
  504. data/spec/unit/view_helpers/method_or_proc_helper_spec.rb +139 -0
  505. data/spec/unit/views/components/attributes_table_spec.rb +272 -0
  506. data/spec/unit/views/components/batch_action_selector_spec.rb +43 -0
  507. data/spec/unit/views/components/blank_slate_spec.rb +27 -0
  508. data/spec/unit/views/components/columns_spec.rb +189 -0
  509. data/spec/unit/views/components/index_list_spec.rb +35 -0
  510. data/spec/unit/views/components/index_table_for_spec.rb +127 -0
  511. data/spec/unit/views/components/paginated_collection_spec.rb +249 -0
  512. data/spec/unit/views/components/panel_spec.rb +58 -0
  513. data/spec/unit/views/components/sidebar_section_spec.rb +68 -0
  514. data/spec/unit/views/components/site_title_spec.rb +78 -0
  515. data/spec/unit/views/components/status_tag_spec.rb +249 -0
  516. data/spec/unit/views/components/table_for_spec.rb +434 -0
  517. data/spec/unit/views/components/tabs_spec.rb +39 -0
  518. data/spec/unit/views/components/unsupported_browser_spec.rb +41 -0
  519. data/spec/unit/views/index_as_blog_spec.rb +76 -0
  520. data/spec/unit/views/pages/form_spec.rb +51 -0
  521. data/spec/unit/views/pages/index_spec.rb +60 -0
  522. data/spec/unit/views/pages/layout_spec.rb +59 -0
  523. data/spec/unit/views/pages/show_spec.rb +33 -0
  524. data/spec/unit/views/tabbed_navigation_spec.rb +158 -0
  525. data/tasks/docs.rake +37 -0
  526. data/tasks/parallel_tests.rake +66 -0
  527. data/tasks/test.rake +91 -0
  528. data/tasks/yard.rake +9 -0
  529. metadata +974 -0
@@ -0,0 +1,43 @@
1
+ require 'rails_helper'
2
+
3
+ describe ActiveAdmin::CanCanAdapter do
4
+
5
+ describe "full integration" do
6
+
7
+ let(:application){ ActiveAdmin::Application.new }
8
+ let(:namespace){ ActiveAdmin::Namespace.new(application, "Admin") }
9
+ let(:resource){ namespace.register(Post) }
10
+
11
+ let :ability_class do
12
+ Class.new do
13
+ include CanCan::Ability
14
+
15
+ def initialize(user)
16
+ can :read, Post
17
+ cannot :update, Post
18
+ end
19
+
20
+ end
21
+ end
22
+
23
+ let(:auth) { namespace.authorization_adapter.new(resource, double) }
24
+
25
+ before do
26
+ namespace.authorization_adapter = ActiveAdmin::CanCanAdapter
27
+ namespace.cancan_ability_class = ability_class
28
+ end
29
+
30
+ it "should initialize the ability stored in the namespace configuration" do
31
+ expect(auth.authorized?(:read, Post)).to eq true
32
+ expect(auth.authorized?(:update, Post)).to eq false
33
+ end
34
+
35
+ it "should scope the collection with accessible_by" do
36
+ collection = double
37
+ expect(collection).to receive(:accessible_by).with(auth.cancan_ability, :edit)
38
+ auth.scope_collection(collection, :edit)
39
+ end
40
+
41
+ end
42
+
43
+ end
@@ -0,0 +1,188 @@
1
+ require 'rails_helper'
2
+
3
+ describe "Comments" do
4
+ let(:application) { ActiveAdmin::Application.new }
5
+
6
+ describe ActiveAdmin::Comment do
7
+ subject(:comment){ ActiveAdmin::Comment.new }
8
+
9
+ it "has valid Associations and Validations" do
10
+ expect(comment).to belong_to :resource
11
+ expect(comment).to belong_to :author
12
+ expect(comment).to validate_presence_of :resource
13
+ expect(comment).to validate_presence_of :body
14
+ expect(comment).to validate_presence_of :namespace
15
+ end
16
+
17
+ describe ".find_for_resource_in_namespace" do
18
+ let(:post) { Post.create!(title: "Hello World") }
19
+ let(:namespace_name) { "admin" }
20
+
21
+ before do
22
+ @comment = ActiveAdmin::Comment.create! resource: post,
23
+ body: "A Comment",
24
+ namespace: namespace_name
25
+ end
26
+
27
+ it "should return a comment for the resource in the same namespace" do
28
+ expect(ActiveAdmin::Comment.find_for_resource_in_namespace(post, namespace_name)).to eq [@comment]
29
+ end
30
+
31
+ it "should not return a comment for the same resource in a different namespace" do
32
+ ActiveAdmin.application.namespaces[:public] = ActiveAdmin.application.namespaces[:admin]
33
+ expect(ActiveAdmin::Comment.find_for_resource_in_namespace(post, 'public')).to eq []
34
+ ActiveAdmin.application.namespaces.instance_variable_get(:@namespaces).delete(:public)
35
+ end
36
+
37
+ it "should not return a comment for a different resource" do
38
+ another_post = Post.create! title: "Another Hello World"
39
+ expect(ActiveAdmin::Comment.find_for_resource_in_namespace(another_post, namespace_name)).to eq []
40
+ end
41
+
42
+ it "should return the most recent comment first" do
43
+ ActiveAdmin::Comment.class_eval { attr_accessible :created_at } if Rails::VERSION::MAJOR == 3
44
+ another_comment = ActiveAdmin::Comment.create! resource: post,
45
+ body: "Another Comment",
46
+ namespace: namespace_name,
47
+ created_at: @comment.created_at + 20.minutes
48
+
49
+ yet_another_comment = ActiveAdmin::Comment.create! resource: post,
50
+ body: "Yet Another Comment",
51
+ namespace: namespace_name,
52
+ created_at: @comment.created_at + 10.minutes
53
+
54
+ comments = ActiveAdmin::Comment.find_for_resource_in_namespace(post, namespace_name)
55
+ expect(comments.size).to eq 3
56
+ expect(comments.first).to eq(@comment)
57
+ expect(comments.second).to eq(yet_another_comment)
58
+ expect(comments.last).to eq(another_comment)
59
+ end
60
+
61
+ it "should return the correctly ordered comments" do
62
+ ActiveAdmin::Application.inheritable_setting(
63
+ :comments_order, "created_at DESC"
64
+ )
65
+
66
+ another_comment = ActiveAdmin::Comment.create!(
67
+ resource: post,
68
+ body: "Another Comment",
69
+ namespace: namespace_name,
70
+ created_at: @comment.created_at + 20.minutes
71
+ )
72
+
73
+ comments = ActiveAdmin::Comment.find_for_resource_in_namespace(
74
+ post, namespace_name
75
+ )
76
+ expect(comments.size).to eq 2
77
+ expect(comments.first).to eq(another_comment)
78
+ expect(comments.last).to eq(@comment)
79
+ end
80
+ end
81
+
82
+ describe ".resource_id_cast" do
83
+ let(:post) { Post.create!(title: "Testing.") }
84
+ let(:namespace_name) { "admin" }
85
+
86
+ it "should cast resource_id as string" do
87
+ comment = ActiveAdmin::Comment.create! resource: post,
88
+ body: "Another Comment",
89
+ namespace: namespace_name
90
+ expect(ActiveAdmin::Comment.resource_id_cast(comment).class).to eql String
91
+ end
92
+ end
93
+
94
+ describe ".resource_type" do
95
+ let(:post) { Post.create!(title: "Testing.") }
96
+ let(:post_decorator) { double 'PostDecorator' }
97
+
98
+ before do
99
+ allow(post_decorator).to receive(:model).and_return(post)
100
+ allow(post_decorator).to receive(:decorated?).and_return(true)
101
+ end
102
+
103
+ context "when a decorated object is passed" do
104
+ let(:resource) { post_decorator }
105
+
106
+ it "returns undeorated object class string" do
107
+ expect(ActiveAdmin::Comment.resource_type resource).to eql 'Post'
108
+ end
109
+ end
110
+
111
+ context "when an undecorated object is passed" do
112
+ let(:resource) { post }
113
+
114
+ it "returns object class string" do
115
+ expect(ActiveAdmin::Comment.resource_type resource).to eql 'Post'
116
+ end
117
+ end
118
+ end
119
+
120
+ describe ".resource_id_type" do
121
+ it "should be :string" do
122
+ expect(ActiveAdmin::Comment.resource_id_type).to eql :string
123
+ end
124
+ end
125
+
126
+ describe "Commenting on resource with string id" do
127
+ let(:tag) { Tag.create!(name: "cooltags") }
128
+ let(:namespace_name) { "admin" }
129
+
130
+ it "should allow commenting" do
131
+ comment = ActiveAdmin::Comment.create!(
132
+ resource: tag,
133
+ body: "Another Comment",
134
+ namespace: namespace_name)
135
+
136
+ expect(ActiveAdmin::Comment.find_for_resource_in_namespace(tag, namespace_name)).to eq [comment]
137
+ end
138
+ end
139
+
140
+ describe "commenting on child of STI resource" do
141
+ let(:publisher) { Publisher.create!(username: "tenderlove") }
142
+ let(:namespace_name) { "admin" }
143
+
144
+ it "should assign child class as commented resource" do
145
+ comment = ActiveAdmin::Comment.create!(
146
+ resource: publisher,
147
+ body: "Lorem Ipsum",
148
+ namespace: namespace_name)
149
+
150
+ expect(ActiveAdmin::Comment.find_for_resource_in_namespace(publisher, namespace_name).last.resource_type).
151
+ to eq("User")
152
+ end
153
+ end
154
+ end
155
+
156
+ describe ActiveAdmin::Comments::NamespaceHelper do
157
+ describe "#comments?" do
158
+
159
+ it "should have comments when the namespace allows comments" do
160
+ ns = ActiveAdmin::Namespace.new(application, :admin)
161
+ ns.comments = true
162
+ expect(ns.comments?).to eq true
163
+ end
164
+
165
+ it "should not have comments when the namespace does not allow comments" do
166
+ ns = ActiveAdmin::Namespace.new(application, :admin)
167
+ ns.comments = false
168
+ expect(ns.comments?).to eq false
169
+ end
170
+ end
171
+ end
172
+
173
+ describe ActiveAdmin::Comments::ResourceHelper do
174
+ it "should add an attr_accessor :comments to ActiveAdmin::Resource" do
175
+ ns = ActiveAdmin::Namespace.new(application, :admin)
176
+ resource = ActiveAdmin::Resource.new(ns, Post)
177
+ expect(resource.comments).to eq nil
178
+ resource.comments = true
179
+ expect(resource.comments).to eq true
180
+ end
181
+ it "should disable comments if set to false" do
182
+ ns = ActiveAdmin::Namespace.new(application, :admin)
183
+ resource = ActiveAdmin::Resource.new(ns, Post)
184
+ resource.comments = false
185
+ expect(resource.comments?).to eq false
186
+ end
187
+ end
188
+ end
@@ -0,0 +1,18 @@
1
+ require 'rails_helper'
2
+
3
+ class MockComponentClass < ActiveAdmin::Component; end
4
+
5
+ describe ActiveAdmin::Component do
6
+
7
+ let(:component_class){ MockComponentClass }
8
+ let(:component){ component_class.new }
9
+
10
+ it "should be a subclass of an html div" do
11
+ expect(ActiveAdmin::Component.ancestors).to include(Arbre::HTML::Div)
12
+ end
13
+
14
+ it "should render to a div, even as a subclass" do
15
+ expect(component.tag_name).to eq 'div'
16
+ end
17
+
18
+ end
@@ -0,0 +1,59 @@
1
+ shared_examples_for "ActiveAdmin::Resource" do
2
+ describe "namespace" do
3
+ it "should return the namespace" do
4
+ expect(config.namespace).to eq(namespace)
5
+ end
6
+ end
7
+
8
+ describe "page_presenters" do
9
+ it "should return an empty hash by default" do
10
+ expect(config.page_presenters).to eq({})
11
+ end
12
+ end
13
+
14
+ it { respond_to :controller_name }
15
+ it { respond_to :controller }
16
+ it { respond_to :route_prefix }
17
+ it { respond_to :route_collection_path }
18
+ it { respond_to :comments? }
19
+ it { respond_to :belongs_to? }
20
+ it { respond_to :action_items? }
21
+ it { respond_to :sidebar_sections? }
22
+
23
+ describe "Naming" do
24
+ it "implements #resource_label" do
25
+ expect { config.resource_label }.to_not raise_error
26
+ end
27
+
28
+ it "implements #plural_resource_label" do
29
+ expect { config.plural_resource_label }.to_not raise_error
30
+ end
31
+ end
32
+
33
+ describe "Menu" do
34
+ describe "#menu_item_options" do
35
+
36
+ it "initializes a new menu item with defaults" do
37
+ expect(config.menu_item_options[:label].call).to eq(config.plural_resource_label)
38
+ end
39
+
40
+ it "initialize a new menu item with custom options" do
41
+ config.menu_item_options = { label: "Hello" }
42
+ expect(config.menu_item_options[:label]).to eq("Hello")
43
+ end
44
+
45
+ end
46
+
47
+ describe "#include_in_menu?" do
48
+ it "should be included in menu by default" do
49
+ expect(config.include_in_menu?).to eq(true)
50
+ end
51
+
52
+ it "should not be included in menu when menu set to false" do
53
+ config.menu_item_options = false
54
+ expect(config.include_in_menu?).to eq(false)
55
+ end
56
+ end
57
+
58
+ end
59
+ end
@@ -0,0 +1,41 @@
1
+ require 'rails_helper'
2
+
3
+ describe ActiveAdmin::Application do
4
+ let(:application){ ActiveAdmin::Application.new }
5
+ let(:controllers){ application.controllers_for_filters }
6
+
7
+ it 'controllers_for_filters' do
8
+ expect(application.controllers_for_filters).to eq [
9
+ ActiveAdmin::BaseController, ActiveAdmin::Devise::SessionsController,
10
+ ActiveAdmin::Devise::PasswordsController, ActiveAdmin::Devise::UnlocksController,
11
+ ActiveAdmin::Devise::RegistrationsController, ActiveAdmin::Devise::ConfirmationsController
12
+ ]
13
+ end
14
+
15
+ expected_actions = (
16
+ prefixes = %w(skip append prepend) << nil
17
+ positions = %w(before around after)
18
+ suffixes = %w(filter)
19
+ base = %w(skip_filter)
20
+ if Rails::VERSION::MAJOR >= 4
21
+ suffixes += %w(action)
22
+ base += %w(skip_action_callback)
23
+ end
24
+
25
+ prefixes.each_with_object(base) do |prefix, stack|
26
+ positions.each do |position|
27
+ suffixes.each do |suffix|
28
+ stack << [prefix, position, suffix].compact.join("_").to_sym
29
+ end
30
+ end
31
+ end
32
+ )
33
+
34
+ expected_actions.each do |action|
35
+ it action do
36
+ args = [:my_filter, { only: :show }]
37
+ controllers.each { |c| expect(c).to receive(action).with(args) }
38
+ application.public_send action, args
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,303 @@
1
+ # Encoding: UTF-8
2
+
3
+ require 'rails_helper'
4
+
5
+ describe ActiveAdmin::CSVBuilder do
6
+
7
+ describe '.default_for_resource using Post' do
8
+ let(:csv_builder) { ActiveAdmin::CSVBuilder.default_for_resource(Post).tap(&:exec_columns) }
9
+
10
+ it 'returns a default csv_builder for Post' do
11
+ expect(csv_builder).to be_a(ActiveAdmin::CSVBuilder)
12
+ end
13
+
14
+ it 'defines Id as the first column' do
15
+ expect(csv_builder.columns.first.name).to eq 'Id'
16
+ expect(csv_builder.columns.first.data).to eq :id
17
+ end
18
+
19
+ it "has Post's content_columns" do
20
+ csv_builder.columns[1..-1].each_with_index do |column, index|
21
+ expect(column.name).to eq Post.content_columns[index].name.humanize
22
+ expect(column.data).to eq Post.content_columns[index].name.to_sym
23
+ end
24
+ end
25
+
26
+ context 'when column has a localized name' do
27
+ let(:localized_name) { 'Titulo' }
28
+
29
+ before do
30
+ allow(Post).to receive(:human_attribute_name).and_call_original
31
+ allow(Post).to receive(:human_attribute_name).with(:title){ localized_name }
32
+ end
33
+
34
+ it 'gets name from I18n' do
35
+ title_index = Post.content_columns.map(&:name).index('title') + 1 # First col is always id
36
+ expect(csv_builder.columns[title_index].name).to eq localized_name
37
+ end
38
+ end
39
+ end
40
+
41
+ context 'when empty' do
42
+ let(:builder){ ActiveAdmin::CSVBuilder.new.tap(&:exec_columns) }
43
+
44
+ it "should have no columns" do
45
+ expect(builder.columns).to eq []
46
+ end
47
+ end
48
+
49
+ context "with a symbol column (:title)" do
50
+ let(:builder) do
51
+ ActiveAdmin::CSVBuilder.new do
52
+ column :title
53
+ end.tap(&:exec_columns)
54
+ end
55
+
56
+ it "should have one column" do
57
+ expect(builder.columns.size).to eq 1
58
+ end
59
+
60
+ describe "the column" do
61
+ let(:column){ builder.columns.first }
62
+
63
+ it "should have a name of 'Title'" do
64
+ expect(column.name).to eq "Title"
65
+ end
66
+
67
+ it "should have the data :title" do
68
+ expect(column.data).to eq :title
69
+ end
70
+ end
71
+ end
72
+
73
+ context "with a block and title" do
74
+ let(:builder) do
75
+ ActiveAdmin::CSVBuilder.new do
76
+ column "My title" do
77
+ # nothing
78
+ end
79
+ end.tap(&:exec_columns)
80
+ end
81
+
82
+ it "should have one column" do
83
+ expect(builder.columns.size).to eq 1
84
+ end
85
+
86
+ describe "the column" do
87
+ let(:column){ builder.columns.first }
88
+
89
+ it "should have a name of 'My title'" do
90
+ expect(column.name).to eq "My title"
91
+ end
92
+
93
+ it "should have the data :title" do
94
+ expect(column.data).to be_an_instance_of(Proc)
95
+ end
96
+ end
97
+ end
98
+
99
+ context "with a humanize_name column option" do
100
+ context "with symbol column name" do
101
+ let(:builder) do
102
+ ActiveAdmin::CSVBuilder.new do
103
+ column :my_title, humanize_name: false
104
+ end.tap(&:exec_columns)
105
+ end
106
+
107
+ describe "the column" do
108
+ let(:column){ builder.columns.first }
109
+
110
+ it "should have a name of 'my_title'" do
111
+ expect(column.name).to eq "my_title"
112
+ end
113
+ end
114
+ end
115
+
116
+ context "with string column name" do
117
+ let(:builder) do
118
+ ActiveAdmin::CSVBuilder.new do
119
+ column "my_title", humanize_name: false
120
+ end.tap(&:exec_columns)
121
+ end
122
+
123
+ describe "the column" do
124
+ let(:column){ builder.columns.first }
125
+
126
+ it "should have a name of 'my_title'" do
127
+ expect(column.name).to eq "my_title"
128
+ end
129
+ end
130
+ end
131
+ end
132
+
133
+ context "with a separator" do
134
+ let(:builder) do
135
+ ActiveAdmin::CSVBuilder.new(col_sep: ";").tap(&:exec_columns)
136
+ end
137
+
138
+ it "should have proper separator" do
139
+ expect(builder.options).to eq({col_sep: ";"})
140
+ end
141
+ end
142
+
143
+ context "with humanize_name option" do
144
+ let(:builder) do
145
+ ActiveAdmin::CSVBuilder.new(humanize_name: false) do
146
+ column :my_title
147
+ end.tap(&:exec_columns)
148
+ end
149
+
150
+ describe "the column" do
151
+ let(:column){ builder.columns.first }
152
+
153
+ it "should have humanize_name option set" do
154
+ expect(column.options).to eq humanize_name: false
155
+ end
156
+
157
+ it "should have a name of 'my_title'" do
158
+ expect(column.name).to eq "my_title"
159
+ end
160
+ end
161
+ end
162
+
163
+ context "with csv_options" do
164
+ let(:builder) do
165
+ ActiveAdmin::CSVBuilder.new(force_quotes: true).tap(&:exec_columns)
166
+ end
167
+
168
+ it "should have proper separator" do
169
+ expect(builder.options).to eq({force_quotes: true})
170
+ end
171
+ end
172
+
173
+ context "with access to the controller" do
174
+ let(:dummy_view_context) { double(controller: dummy_controller) }
175
+ let(:dummy_controller) { double(names: %w(title summary updated_at created_at))}
176
+ let(:builder) do
177
+ ActiveAdmin::CSVBuilder.new do
178
+ column "id"
179
+ controller.names.each do |name|
180
+ column(name)
181
+ end
182
+ end.tap{ |b| b.exec_columns(dummy_view_context) }
183
+ end
184
+
185
+ it "should build columns provided by the controller" do
186
+ expect(builder.columns.map(&:data)).to match_array([:id, :title, :summary, :updated_at, :created_at])
187
+ end
188
+ end
189
+
190
+ context "build csv using the supplied order" do
191
+ before do
192
+ @post1 = Post.create!(title: "Hello1", published_at: Date.today - 2.day )
193
+ @post2 = Post.create!(title: "Hello2", published_at: Date.today - 1.day )
194
+ end
195
+ let(:dummy_controller) {
196
+ class DummyController
197
+ def find_collection(*)
198
+ collection
199
+ end
200
+
201
+ def collection
202
+ Post.order('published_at DESC')
203
+ end
204
+
205
+ def apply_decorator(resource)
206
+ resource
207
+ end
208
+
209
+ def view_context
210
+ end
211
+ end
212
+ DummyController.new
213
+ }
214
+ let(:builder) do
215
+ ActiveAdmin::CSVBuilder.new do
216
+ column "id"
217
+ column "title"
218
+ column "published_at"
219
+ end
220
+ end
221
+
222
+ it "should generate data with the supplied order" do
223
+ expect(builder).to receive(:build_row).and_return([]).once.ordered { |post| expect(post.id).to eq @post2.id }
224
+ expect(builder).to receive(:build_row).and_return([]).once.ordered { |post| expect(post.id).to eq @post1.id }
225
+ builder.build dummy_controller, []
226
+ end
227
+
228
+ it "should generate data ignoring pagination" do
229
+ expect(dummy_controller).to receive(:find_collection).
230
+ with(except: :pagination).once.
231
+ and_call_original
232
+ expect(builder).to receive(:build_row).and_return([]).twice
233
+ builder.build dummy_controller, []
234
+ end
235
+
236
+ end
237
+
238
+ context "build csv using specified encoding and encoding_options" do
239
+ let(:dummy_controller) do
240
+ class DummyController
241
+ def find_collection(*)
242
+ collection
243
+ end
244
+
245
+ def collection
246
+ Post
247
+ end
248
+
249
+ def apply_decorator(resource)
250
+ resource
251
+ end
252
+
253
+ def view_context
254
+ end
255
+ end
256
+ DummyController.new
257
+ end
258
+ let(:encoding) { Encoding::ASCII }
259
+ let(:opts) { {} }
260
+ let(:builder) do
261
+ ActiveAdmin::CSVBuilder.new(encoding: encoding, encoding_options: opts) do
262
+ column "おはようございます"
263
+ column "title"
264
+ end
265
+ end
266
+
267
+ context "Shift-JIS with options" do
268
+ let(:encoding) { Encoding::Shift_JIS }
269
+ let(:opts) { { invalid: :replace, undef: :replace, replace: "?" } }
270
+
271
+ it "encodes the CSV" do
272
+ receiver = []
273
+ builder.build dummy_controller, receiver
274
+ line = receiver.last
275
+ expect(line.encoding).to eq(encoding)
276
+ end
277
+ end
278
+
279
+ context "ASCII with options" do
280
+ let(:encoding) { Encoding::ASCII }
281
+ let(:opts) do
282
+ { invalid: :replace, undef: :replace, replace: "__REPLACED__" }
283
+ end
284
+
285
+ it "encodes the CSV without errors" do
286
+ receiver = []
287
+ builder.build dummy_controller, receiver
288
+ line = receiver.last
289
+ expect(line.encoding).to eq(encoding)
290
+ expect(line).to include("__REPLACED__")
291
+ end
292
+ end
293
+ end
294
+
295
+ skip '#exec_columns'
296
+
297
+ skip '#build_row' do
298
+ it 'renders non-strings'
299
+ it 'encodes values correctly'
300
+ it 'passes custom encoding options to String#encode!'
301
+ end
302
+
303
+ end