blacklight 6.14.0 → 7.0.0

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 (422) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +1 -0
  3. data/.npmignore +23 -0
  4. data/.rubocop.yml +40 -16
  5. data/.rubocop_todo.yml +479 -375
  6. data/.solr_wrapper.yml +9 -2
  7. data/.travis.yml +27 -20
  8. data/Gemfile +3 -1
  9. data/README.md +22 -5
  10. data/Rakefile +3 -2
  11. data/VERSION +1 -1
  12. data/Vagrantfile +2 -0
  13. data/app/assets/images/blacklight/list.svg +1 -0
  14. data/app/assets/images/blacklight/search.svg +1 -0
  15. data/app/assets/javascripts/blacklight/blacklight.js +497 -57
  16. data/app/assets/stylesheets/blacklight/_balanced_list.scss +7 -12
  17. data/app/assets/stylesheets/blacklight/_blacklight_base.scss +18 -15
  18. data/app/assets/stylesheets/blacklight/_bookmark.scss +1 -13
  19. data/app/assets/stylesheets/blacklight/_bootstrap_overrides.scss +27 -0
  20. data/app/assets/stylesheets/blacklight/_constraints.scss +17 -25
  21. data/app/assets/stylesheets/blacklight/_controls.scss +8 -16
  22. data/app/assets/stylesheets/blacklight/_facets.scss +64 -93
  23. data/app/assets/stylesheets/blacklight/_header.scss +35 -48
  24. data/app/assets/stylesheets/blacklight/_icons.scss +35 -0
  25. data/app/assets/stylesheets/blacklight/_layout.scss +0 -10
  26. data/app/assets/stylesheets/blacklight/_mixins.scss +15 -0
  27. data/app/assets/stylesheets/blacklight/_modal.scss +9 -17
  28. data/app/assets/stylesheets/blacklight/_pagination.scss +2 -17
  29. data/app/assets/stylesheets/blacklight/_search_form.scss +7 -0
  30. data/app/assets/stylesheets/blacklight/_search_history.scss +5 -13
  31. data/app/assets/stylesheets/blacklight/_search_results.scss +9 -8
  32. data/app/assets/stylesheets/blacklight/_twitter_typeahead.scss +1 -2
  33. data/app/assets/stylesheets/blacklight/blacklight.scss +1 -1
  34. data/app/builders/blacklight/action_builder.rb +57 -0
  35. data/app/controllers/bookmarks_controller.rb +2 -2
  36. data/app/controllers/catalog_controller.rb +2 -2
  37. data/app/controllers/concerns/blacklight/base.rb +0 -33
  38. data/app/controllers/concerns/blacklight/bookmarks.rb +36 -33
  39. data/app/controllers/concerns/blacklight/catalog.rb +266 -210
  40. data/app/controllers/concerns/blacklight/controller.rb +111 -126
  41. data/app/controllers/concerns/blacklight/default_component_configuration.rb +12 -43
  42. data/app/controllers/concerns/blacklight/facet.rb +3 -0
  43. data/app/controllers/concerns/blacklight/search_context.rb +16 -14
  44. data/app/controllers/concerns/blacklight/search_fields.rb +4 -14
  45. data/app/controllers/concerns/blacklight/search_history.rb +1 -6
  46. data/app/controllers/concerns/blacklight/token_based_user.rb +24 -9
  47. data/app/helpers/blacklight/blacklight_helper_behavior.rb +39 -119
  48. data/app/helpers/blacklight/catalog_helper_behavior.rb +94 -88
  49. data/app/helpers/blacklight/component_helper_behavior.rb +21 -19
  50. data/app/helpers/blacklight/configuration_helper_behavior.rb +30 -57
  51. data/app/helpers/blacklight/facets_helper_behavior.rb +55 -51
  52. data/app/helpers/blacklight/hash_as_hidden_fields_helper_behavior.rb +9 -11
  53. data/app/helpers/blacklight/icon_helper_behavior.rb +18 -0
  54. data/app/helpers/blacklight/layout_helper_behavior.rb +3 -3
  55. data/app/helpers/blacklight/render_constraints_helper_behavior.rb +8 -6
  56. data/app/helpers/blacklight/render_partials_helper_behavior.rb +195 -0
  57. data/app/helpers/blacklight/search_history_constraints_helper_behavior.rb +19 -11
  58. data/app/helpers/blacklight/suggest_helper_behavior.rb +1 -0
  59. data/app/helpers/blacklight/url_helper_behavior.rb +50 -41
  60. data/app/{assets/javascripts → javascript}/blacklight/autocomplete.js +3 -2
  61. data/app/javascript/blacklight/bookmark_toggle.js +25 -0
  62. data/app/javascript/blacklight/checkbox_submit.js +134 -0
  63. data/app/{assets/javascripts → javascript}/blacklight/collapsable.js +1 -1
  64. data/app/{assets/javascripts → javascript}/blacklight/core.js +10 -8
  65. data/app/{assets/javascripts → javascript}/blacklight/facet_load.js +6 -6
  66. data/app/{assets/javascripts/blacklight/ajax_modal.js → javascript/blacklight/modal.js} +62 -64
  67. data/app/{assets/javascripts → javascript}/blacklight/search_context.js +10 -3
  68. data/app/models/blacklight/facet_paginator.rb +3 -3
  69. data/app/models/blacklight/icon.rb +56 -0
  70. data/app/models/blacklight/solr/facet_paginator.rb +3 -3
  71. data/app/models/blacklight/suggest_search.rb +4 -15
  72. data/app/models/bookmark.rb +5 -10
  73. data/app/models/concerns/blacklight/configurable.rb +13 -13
  74. data/app/models/concerns/blacklight/document/active_model_shim.rb +13 -11
  75. data/app/models/concerns/blacklight/document/cache_key.rb +1 -1
  76. data/app/models/concerns/blacklight/document/dublin_core.rb +2 -2
  77. data/app/models/concerns/blacklight/document/email.rb +1 -1
  78. data/app/models/concerns/blacklight/document/extensions.rb +5 -5
  79. data/app/models/concerns/blacklight/document/semantic_fields.rb +9 -9
  80. data/app/models/concerns/blacklight/document/sms.rb +1 -1
  81. data/app/models/concerns/blacklight/document.rb +26 -40
  82. data/app/models/concerns/blacklight/solr/document.rb +8 -8
  83. data/app/models/concerns/blacklight/suggest/response.rb +5 -3
  84. data/app/models/concerns/blacklight/user.rb +7 -6
  85. data/app/models/record_mailer.rb +5 -6
  86. data/app/models/search.rb +5 -7
  87. data/app/presenters/blacklight/document_presenter.rb +25 -140
  88. data/app/presenters/blacklight/field_presenter.rb +7 -5
  89. data/app/presenters/blacklight/index_presenter.rb +41 -58
  90. data/app/presenters/blacklight/json_presenter.rb +10 -14
  91. data/app/presenters/blacklight/link_alternate_presenter.rb +3 -1
  92. data/app/presenters/blacklight/rendering/abstract_step.rb +7 -5
  93. data/app/presenters/blacklight/rendering/helper_method.rb +10 -8
  94. data/app/presenters/blacklight/rendering/join.rb +5 -3
  95. data/app/presenters/blacklight/rendering/link_to_facet.rb +23 -19
  96. data/app/presenters/blacklight/rendering/microdata.rb +6 -3
  97. data/app/presenters/blacklight/rendering/pipeline.rb +7 -5
  98. data/app/presenters/blacklight/rendering/terminator.rb +2 -0
  99. data/app/presenters/blacklight/search_bar_presenter.rb +39 -0
  100. data/app/presenters/blacklight/show_presenter.rb +26 -63
  101. data/app/presenters/blacklight/thumbnail_presenter.rb +74 -0
  102. data/app/services/blacklight/document_factory.rb +13 -0
  103. data/app/services/blacklight/field_retriever.rb +26 -24
  104. data/app/services/blacklight/search_service.rb +152 -0
  105. data/app/values/blacklight/types.rb +31 -0
  106. data/app/views/blacklight/nav/_bookmark.html.erb +2 -2
  107. data/app/views/blacklight/nav/_search_history.html.erb +1 -1
  108. data/app/views/bookmarks/_tools.html.erb +2 -2
  109. data/app/views/bookmarks/index.html.erb +12 -13
  110. data/app/views/catalog/_bookmark_control.html.erb +26 -10
  111. data/app/views/catalog/_citation.html.erb +4 -4
  112. data/app/views/catalog/_constraints.html.erb +6 -7
  113. data/app/views/catalog/_constraints_element.html.erb +6 -6
  114. data/app/views/catalog/_did_you_mean.html.erb +1 -1
  115. data/app/views/catalog/{_document_default.atom.builder → _document.atom.builder} +19 -18
  116. data/app/views/catalog/_document.html.erb +5 -3
  117. data/app/views/catalog/{_document_default.rss.builder → _document.rss.builder} +2 -0
  118. data/app/views/catalog/_document_action.html.erb +2 -1
  119. data/app/views/catalog/_email_form.html.erb +8 -4
  120. data/app/views/catalog/_facet_index_navigation.html.erb +5 -4
  121. data/app/views/catalog/_facet_layout.html.erb +6 -10
  122. data/app/views/catalog/_facet_limit.html.erb +3 -2
  123. data/app/views/catalog/_facet_pagination.html.erb +8 -8
  124. data/app/views/catalog/_facet_pivot.html.erb +2 -2
  125. data/app/views/catalog/_facets.html.erb +9 -12
  126. data/app/views/catalog/_field.json.jbuilder +10 -0
  127. data/app/views/catalog/{_group_default.html.erb → _group.html.erb} +1 -1
  128. data/app/views/catalog/_home_text.html.erb +32 -36
  129. data/app/views/catalog/_index.html.erb +10 -0
  130. data/app/views/catalog/{_index_header_default.html.erb → _index_header.html.erb} +3 -3
  131. data/app/views/catalog/_per_page_widget.html.erb +6 -7
  132. data/app/views/catalog/_previous_next_doc.html.erb +6 -14
  133. data/app/views/catalog/_results_pagination.html.erb +2 -2
  134. data/app/views/catalog/_search_form.html.erb +12 -8
  135. data/app/views/catalog/_search_header.html.erb +0 -3
  136. data/app/views/catalog/_search_results.html.erb +6 -2
  137. data/app/views/catalog/_show.html.erb +8 -0
  138. data/app/views/catalog/_show_main_content.html.erb +4 -4
  139. data/app/views/catalog/_show_more_like_this.html.erb +1 -1
  140. data/app/views/catalog/_show_sidebar.html.erb +3 -3
  141. data/app/views/catalog/_show_tools.html.erb +10 -12
  142. data/app/views/catalog/_sms_form.html.erb +8 -4
  143. data/app/views/catalog/_sort_and_per_page.html.erb +3 -3
  144. data/app/views/catalog/_sort_widget.html.erb +7 -7
  145. data/app/views/catalog/_thumbnail.html.erb +5 -0
  146. data/app/views/catalog/_view_type_group.html.erb +2 -2
  147. data/app/views/catalog/_zero_results.html.erb +1 -1
  148. data/app/views/catalog/citation.js.erb +4 -2
  149. data/app/views/catalog/email.html.erb +5 -3
  150. data/app/views/catalog/email_success.html.erb +12 -8
  151. data/app/views/catalog/facet.html.erb +10 -8
  152. data/app/views/catalog/facet.json.jbuilder +2 -0
  153. data/app/views/catalog/index.atom.builder +13 -16
  154. data/app/views/catalog/index.html.erb +9 -11
  155. data/app/views/catalog/index.json.jbuilder +84 -3
  156. data/app/views/catalog/index.rss.builder +7 -5
  157. data/app/views/catalog/opensearch.xml.builder +12 -10
  158. data/app/views/catalog/show.html.erb +11 -6
  159. data/app/views/catalog/show.json.jbuilder +21 -0
  160. data/app/views/catalog/sms.html.erb +3 -1
  161. data/app/views/catalog/sms_success.html.erb +12 -8
  162. data/app/views/kaminari/blacklight/_first_page.html.erb +2 -2
  163. data/app/views/kaminari/blacklight/_gap.html.erb +2 -2
  164. data/app/views/kaminari/blacklight/_last_page.html.erb +2 -2
  165. data/app/views/kaminari/blacklight/_next_page.html.erb +5 -5
  166. data/app/views/kaminari/blacklight/_page.html.erb +5 -3
  167. data/app/views/kaminari/blacklight/_prev_page.html.erb +4 -4
  168. data/app/views/kaminari/blacklight_compact/_paginator.html.erb +4 -4
  169. data/app/views/layouts/blacklight/base.html.erb +35 -0
  170. data/app/views/layouts/blacklight.html.erb +14 -41
  171. data/app/views/layouts/catalog_result.html.erb +11 -0
  172. data/app/views/search_history/index.html.erb +16 -21
  173. data/app/views/shared/_header_navbar.html.erb +8 -13
  174. data/app/views/shared/_modal.html.erb +6 -0
  175. data/app/views/shared/_user_util_links.html.erb +22 -0
  176. data/blacklight.gemspec +10 -11
  177. data/config/i18n-tasks.yml +17 -0
  178. data/config/locales/blacklight.de.yml +71 -82
  179. data/config/locales/blacklight.en.yml +15 -27
  180. data/config/locales/blacklight.es.yml +14 -26
  181. data/config/locales/blacklight.fr.yml +16 -33
  182. data/config/locales/blacklight.hu.yml +212 -0
  183. data/config/locales/blacklight.it.yml +15 -26
  184. data/config/locales/blacklight.nl.yml +212 -0
  185. data/config/locales/blacklight.pt-BR.yml +24 -29
  186. data/config/locales/blacklight.sq.yml +4 -28
  187. data/config/locales/blacklight.zh.yml +3 -25
  188. data/config/routes.rb +2 -10
  189. data/db/migrate/20140202020202_create_bookmarks.rb +0 -1
  190. data/db/migrate/20140320000000_add_polymorphic_type_to_bookmarks.rb +1 -1
  191. data/lib/blacklight/abstract_repository.rb +22 -10
  192. data/lib/blacklight/configuration/context.rb +12 -1
  193. data/lib/blacklight/configuration/facet_field.rb +16 -9
  194. data/lib/blacklight/configuration/field.rb +32 -3
  195. data/lib/blacklight/configuration/fields.rb +61 -58
  196. data/lib/blacklight/configuration/null_field.rb +2 -0
  197. data/lib/blacklight/configuration/search_field.rb +2 -2
  198. data/lib/blacklight/configuration/sort_field.rb +2 -2
  199. data/lib/blacklight/configuration/view_config.rb +4 -0
  200. data/lib/blacklight/configuration.rb +101 -88
  201. data/lib/blacklight/engine.rb +11 -7
  202. data/lib/blacklight/exceptions.rb +4 -7
  203. data/lib/blacklight/{utils.rb → nested_open_struct_with_hash_access.rb} +9 -81
  204. data/lib/blacklight/open_struct_with_hash_access.rb +49 -0
  205. data/lib/blacklight/parameters.rb +1 -1
  206. data/lib/blacklight/routes/exportable.rb +1 -3
  207. data/lib/blacklight/routes/searchable.rb +3 -3
  208. data/lib/blacklight/runtime_registry.rb +2 -0
  209. data/lib/blacklight/search_builder.rb +28 -35
  210. data/lib/blacklight/search_state.rb +10 -8
  211. data/lib/blacklight/solr/repository.rb +40 -6
  212. data/lib/blacklight/solr/request.rb +1 -1
  213. data/lib/blacklight/solr/response/facets.rb +29 -31
  214. data/lib/blacklight/solr/response/group.rb +3 -3
  215. data/lib/blacklight/solr/response/group_response.rb +1 -1
  216. data/lib/blacklight/solr/response/more_like_this.rb +2 -2
  217. data/lib/blacklight/solr/response/response.rb +2 -2
  218. data/lib/blacklight/solr/response/spelling.rb +4 -3
  219. data/lib/blacklight/solr/response.rb +29 -30
  220. data/lib/blacklight/solr/search_builder_behavior.rb +25 -29
  221. data/lib/blacklight/version.rb +1 -1
  222. data/lib/blacklight.rb +10 -8
  223. data/lib/generators/blacklight/assets_generator.rb +18 -12
  224. data/lib/generators/blacklight/controller_generator.rb +4 -5
  225. data/lib/generators/blacklight/document_generator.rb +1 -1
  226. data/lib/generators/blacklight/install_generator.rb +18 -28
  227. data/lib/generators/blacklight/search_builder_generator.rb +1 -1
  228. data/lib/generators/blacklight/{solr5_generator.rb → solr_generator.rb} +12 -6
  229. data/lib/generators/blacklight/templates/.solr_wrapper.yml +5 -0
  230. data/lib/generators/blacklight/templates/alternate_controller.rb +4 -4
  231. data/lib/generators/blacklight/templates/blacklight.scss +0 -2
  232. data/lib/generators/blacklight/templates/catalog_controller.rb +59 -49
  233. data/lib/generators/blacklight/templates/config/blacklight.yml +1 -13
  234. data/lib/generators/blacklight/templates/solr/conf/schema.xml +388 -0
  235. data/lib/generators/blacklight/templates/solr/conf/solrconfig.xml +195 -0
  236. data/lib/generators/blacklight/test_support_generator.rb +10 -10
  237. data/lib/generators/blacklight/user_generator.rb +5 -6
  238. data/lib/railties/blacklight.rake +17 -21
  239. data/package-lock.json +2195 -0
  240. data/package.json +29 -0
  241. data/spec/controllers/alternate_controller_spec.rb +5 -4
  242. data/spec/controllers/application_controller_spec.rb +1 -5
  243. data/spec/controllers/blacklight/base_spec.rb +6 -3
  244. data/spec/controllers/blacklight/catalog/component_configuration_spec.rb +11 -7
  245. data/spec/controllers/blacklight/facet_spec.rb +1 -2
  246. data/spec/controllers/blacklight/search_fields_spec.rb +25 -34
  247. data/spec/controllers/bookmarks_controller_spec.rb +46 -11
  248. data/spec/controllers/catalog_controller_spec.rb +334 -161
  249. data/spec/controllers/search_history_controller_spec.rb +6 -6
  250. data/spec/features/alternate_controller_spec.rb +4 -4
  251. data/spec/features/autocomplete_spec.rb +4 -2
  252. data/spec/features/bookmarks_spec.rb +10 -10
  253. data/spec/features/did_you_mean_spec.rb +7 -12
  254. data/spec/features/facets_spec.rb +29 -17
  255. data/spec/features/record_view_spec.rb +12 -18
  256. data/spec/features/search_context_spec.rb +6 -7
  257. data/spec/features/search_crawler_spec.rb +3 -5
  258. data/spec/features/search_filters_spec.rb +80 -80
  259. data/spec/features/search_formats_spec.rb +1 -1
  260. data/spec/features/search_history_spec.rb +6 -29
  261. data/spec/features/search_pagination_spec.rb +4 -2
  262. data/spec/features/search_results_spec.rb +14 -12
  263. data/spec/features/search_sort_spec.rb +2 -2
  264. data/spec/features/search_spec.rb +8 -9
  265. data/spec/features/sitelinks_search_box.rb +4 -4
  266. data/{solr → spec/fixtures}/sample_solr_documents.yml +688 -688
  267. data/spec/helpers/{configuration_helper_spec.rb → blacklight/configuration_helper_behavior_spec.rb} +97 -92
  268. data/spec/helpers/{facets_helper_spec.rb → blacklight/facets_helper_behavior_spec.rb} +72 -67
  269. data/spec/helpers/{hash_as_hidden_fields_spec.rb → blacklight/hash_as_hidden_fields_behavior_spec.rb} +2 -2
  270. data/spec/helpers/blacklight/icon_helper_behavior_spec.rb +10 -0
  271. data/spec/helpers/{layout_helper_spec.rb → blacklight/layout_helper_behavior_spec.rb} +5 -5
  272. data/spec/helpers/{render_constraints_helper_spec.rb → blacklight/render_constraints_helper_behavior_spec.rb} +10 -6
  273. data/spec/helpers/blacklight/render_partials_helper_behavior_spec.rb +92 -0
  274. data/spec/helpers/{search_history_constraints_helper_spec.rb → blacklight/search_history_constraints_helper_behavior_spec.rb} +29 -30
  275. data/spec/helpers/{suggest_helper_spec.rb → blacklight/suggest_helper_behavior_spec.rb} +9 -2
  276. data/spec/helpers/{url_helper_spec.rb → blacklight/url_helper_behavior_spec.rb} +56 -54
  277. data/spec/helpers/blacklight_helper_spec.rb +65 -150
  278. data/spec/helpers/catalog_helper_spec.rb +80 -96
  279. data/spec/i18n_spec.rb +18 -0
  280. data/spec/integration/generators/blacklight/{solr5_generator_spec.rb → solr_generator_spec.rb} +21 -13
  281. data/spec/lib/blacklight/configuration/facet_field_spec.rb +13 -0
  282. data/spec/lib/blacklight/configuration/field_spec.rb +15 -0
  283. data/spec/lib/blacklight/nested_open_struct_with_hash_access_spec.rb +17 -0
  284. data/spec/lib/blacklight/open_struct_with_hash_access_spec.rb +148 -0
  285. data/spec/lib/blacklight/parameters_spec.rb +4 -2
  286. data/spec/lib/blacklight/search_state_spec.rb +53 -36
  287. data/spec/lib/blacklight_spec.rb +14 -15
  288. data/spec/lib/tasks/blacklight_task_spec.rb +4 -6
  289. data/spec/models/blacklight/configurable_spec.rb +24 -27
  290. data/spec/models/blacklight/configuration/context_spec.rb +9 -10
  291. data/spec/models/blacklight/configuration_spec.rb +248 -223
  292. data/spec/models/blacklight/document/active_model_shim_spec.rb +15 -6
  293. data/spec/models/blacklight/document/cache_key_spec.rb +9 -2
  294. data/spec/models/blacklight/document/dublin_core_spec.rb +17 -20
  295. data/spec/models/blacklight/document/email_spec.rb +10 -10
  296. data/spec/models/blacklight/document/sms_spec.rb +10 -10
  297. data/spec/models/blacklight/document_spec.rb +10 -22
  298. data/spec/models/blacklight/facet_paginator_spec.rb +40 -30
  299. data/spec/models/blacklight/icon_spec.rb +44 -0
  300. data/spec/models/blacklight/search_builder_spec.rb +41 -26
  301. data/spec/models/blacklight/solr/document_spec.rb +224 -216
  302. data/spec/models/blacklight/solr/facet_paginator_spec.rb +6 -4
  303. data/spec/models/blacklight/solr/repository_spec.rb +61 -46
  304. data/spec/models/blacklight/solr/request_spec.rb +17 -18
  305. data/spec/models/blacklight/solr/response/facets_spec.rb +58 -58
  306. data/spec/models/blacklight/solr/response/group_response_spec.rb +16 -22
  307. data/spec/models/blacklight/solr/response/group_spec.rb +18 -25
  308. data/spec/models/blacklight/solr/response_spec.rb +56 -55
  309. data/spec/models/blacklight/solr/search_builder_spec.rb +150 -164
  310. data/spec/models/blacklight/suggest/response_spec.rb +6 -4
  311. data/spec/models/blacklight/suggest_search_spec.rb +9 -16
  312. data/spec/models/blacklight/user_spec.rb +9 -11
  313. data/spec/models/bookmark_spec.rb +7 -6
  314. data/spec/models/record_mailer_spec.rb +23 -21
  315. data/spec/models/search_spec.rb +19 -18
  316. data/spec/models/solr_document_spec.rb +33 -5
  317. data/spec/presenters/blacklight/document_presenter_spec.rb +86 -0
  318. data/spec/presenters/blacklight/index_presenter_spec.rb +186 -0
  319. data/spec/presenters/blacklight/json_presenter_spec.rb +59 -0
  320. data/spec/presenters/blacklight/link_alternate_presenter_spec.rb +3 -0
  321. data/spec/presenters/blacklight/search_bar_presenter_spec.rb +79 -0
  322. data/spec/presenters/blacklight/show_presenter_spec.rb +333 -0
  323. data/spec/presenters/pipeline_spec.rb +18 -11
  324. data/spec/presenters/thumbnail_presenter_spec.rb +174 -0
  325. data/spec/routing/catalog_routing_spec.rb +13 -15
  326. data/spec/services/blacklight/search_service_spec.rb +488 -0
  327. data/spec/spec_helper.rb +20 -19
  328. data/spec/support/features/session_helpers.rb +4 -4
  329. data/spec/support/features.rb +1 -1
  330. data/spec/test_app_templates/Gemfile.extra +2 -4
  331. data/spec/test_app_templates/lib/generators/test_app_generator.rb +12 -13
  332. data/spec/views/catalog/_constraints.html.erb_spec.rb +3 -6
  333. data/spec/views/catalog/_constraints_element.html.erb_spec.rb +17 -13
  334. data/spec/views/catalog/_document.html.erb_spec.rb +11 -11
  335. data/spec/views/catalog/_document_list.html.erb_spec.rb +2 -1
  336. data/spec/views/catalog/_facet_index_navigation.html.erb_spec.rb +5 -5
  337. data/spec/views/catalog/_facet_layout.html.erb_spec.rb +6 -6
  338. data/spec/views/catalog/_facets.html.erb_spec.rb +10 -12
  339. data/spec/views/catalog/{_index_default.erb_spec.rb → _index.html.erb_spec.rb} +14 -15
  340. data/spec/views/catalog/{_index_header_default.html.erb_spec.rb → _index_header.html.erb_spec.rb} +6 -9
  341. data/spec/views/catalog/_paginate_compact.html.erb_spec.rb +7 -30
  342. data/spec/views/catalog/_search_header.erb_spec.rb +1 -3
  343. data/spec/views/catalog/{_show_default.erb_spec.rb → _show.html.erb_spec.rb} +13 -14
  344. data/spec/views/catalog/_show_sidebar.erb_spec.rb +6 -9
  345. data/spec/views/catalog/_show_tools.html.erb_spec.rb +5 -5
  346. data/spec/views/catalog/_sort_and_per_page.html.erb_spec.rb +1 -2
  347. data/spec/views/catalog/_sort_widget.html.erb_spec.rb +3 -1
  348. data/spec/views/catalog/{_thumbnail_default.erb_spec.rb → _thumbnail.html.erb_spec.rb} +7 -9
  349. data/spec/views/catalog/_view_type_group.html.erb_spec.rb +12 -10
  350. data/spec/views/catalog/email_success.html.erb_spec.rb +8 -0
  351. data/spec/views/catalog/facet.html.erb_spec.rb +4 -3
  352. data/spec/views/catalog/facet.json.jbuilder_spec.rb +3 -2
  353. data/spec/views/catalog/index.atom.builder_spec.rb +11 -6
  354. data/spec/views/catalog/index.html.erb_spec.rb +6 -8
  355. data/spec/views/catalog/index.json.jbuilder_spec.rb +119 -26
  356. data/spec/views/catalog/opensearch.xml.builder_spec.rb +1 -1
  357. data/spec/views/catalog/show.html.erb_spec.rb +8 -8
  358. data/spec/views/catalog/show.json.jbuilder_spec.rb +40 -0
  359. data/spec/views/catalog/sms_success.html.erb_spec.rb +8 -0
  360. data/spec/views/{_user_util_links.html.erb_spec.rb → shared/_user_util_links.html.erb_spec.rb} +4 -7
  361. data/tasks/blacklight.rake +10 -8
  362. data/template.demo.rb +3 -11
  363. metadata +188 -189
  364. data/app/assets/javascripts/blacklight/autofocus.js +0 -16
  365. data/app/assets/javascripts/blacklight/bookmark_toggle.js +0 -23
  366. data/app/assets/javascripts/blacklight/checkbox_submit.js +0 -135
  367. data/app/controllers/concerns/blacklight/request_builders.rb +0 -77
  368. data/app/controllers/concerns/blacklight/saved_searches.rb +0 -70
  369. data/app/controllers/concerns/blacklight/search_helper.rb +0 -155
  370. data/app/controllers/concerns/blacklight/suggest.rb +0 -25
  371. data/app/controllers/saved_searches_controller.rb +0 -4
  372. data/app/controllers/suggest_controller.rb +0 -4
  373. data/app/helpers/blacklight/deprecated_url_helper_behavior.rb +0 -57
  374. data/app/helpers/blacklight/render_partials_helper.rb +0 -205
  375. data/app/helpers/blacklight_configuration_helper.rb +0 -4
  376. data/app/helpers/blacklight_url_helper.rb +0 -4
  377. data/app/helpers/component_helper.rb +0 -4
  378. data/app/helpers/facets_helper.rb +0 -4
  379. data/app/helpers/hash_as_hidden_fields_helper.rb +0 -4
  380. data/app/helpers/layout_helper.rb +0 -4
  381. data/app/helpers/render_constraints_helper.rb +0 -4
  382. data/app/helpers/search_history_constraints_helper.rb +0 -4
  383. data/app/helpers/suggest_helper.rb +0 -4
  384. data/app/models/concerns/blacklight/solr/document/more_like_this.rb +0 -6
  385. data/app/views/_user_util_links.html.erb +0 -26
  386. data/app/views/blacklight/nav/_saved_searches.html.erb +0 -1
  387. data/app/views/catalog/_index_default.html.erb +0 -12
  388. data/app/views/catalog/_show_default.html.erb +0 -10
  389. data/app/views/catalog/_thumbnail_default.html.erb +0 -5
  390. data/app/views/saved_searches/index.html.erb +0 -32
  391. data/app/views/shared/_ajax_modal.html.erb +0 -6
  392. data/lib/generators/blacklight/solr4_generator.rb +0 -31
  393. data/lib/generators/blacklight/templates/config/jetty.yml +0 -13
  394. data/solr/conf/schema.xml +0 -629
  395. data/solr/conf/solrconfig.xml +0 -411
  396. data/spec/controllers/blacklight/search_helper_spec.rb +0 -470
  397. data/spec/controllers/saved_searches_controller_spec.rb +0 -32
  398. data/spec/controllers/suggest_controller_spec.rb +0 -17
  399. data/spec/features/saved_searches_spec.rb +0 -47
  400. data/spec/helpers/deprecated_url_helper_behavior_spec.rb +0 -101
  401. data/spec/lib/blacklight/utils_spec.rb +0 -167
  402. data/spec/models/blacklight/solr/document/more_like_this_spec.rb +0 -18
  403. data/spec/presenters/document_presenter_spec.rb +0 -438
  404. data/spec/presenters/index_presenter_spec.rb +0 -173
  405. data/spec/presenters/show_presenter_spec.rb +0 -313
  406. data/spec/support/backport_test.rb +0 -14
  407. /data/app/views/catalog/{_show_header_default.html.erb → _show_header.html.erb} +0 -0
  408. /data/app/views/{_flash_msg.html.erb → shared/_flash_msg.html.erb} +0 -0
  409. /data/{solr → lib/generators/blacklight/templates/solr}/conf/_rest_managed.json +0 -0
  410. /data/{solr → lib/generators/blacklight/templates/solr}/conf/admin-extra.html +0 -0
  411. /data/{solr → lib/generators/blacklight/templates/solr}/conf/elevate.xml +0 -0
  412. /data/{solr → lib/generators/blacklight/templates/solr}/conf/mapping-ISOLatin1Accent.txt +0 -0
  413. /data/{solr → lib/generators/blacklight/templates/solr}/conf/protwords.txt +0 -0
  414. /data/{solr → lib/generators/blacklight/templates/solr}/conf/scripts.conf +0 -0
  415. /data/{solr → lib/generators/blacklight/templates/solr}/conf/spellings.txt +0 -0
  416. /data/{solr → lib/generators/blacklight/templates/solr}/conf/stopwords.txt +0 -0
  417. /data/{solr → lib/generators/blacklight/templates/solr}/conf/stopwords_en.txt +0 -0
  418. /data/{solr → lib/generators/blacklight/templates/solr}/conf/synonyms.txt +0 -0
  419. /data/{solr → lib/generators/blacklight/templates/solr}/conf/xslt/example.xsl +0 -0
  420. /data/{solr → lib/generators/blacklight/templates/solr}/conf/xslt/example_atom.xsl +0 -0
  421. /data/{solr → lib/generators/blacklight/templates/solr}/conf/xslt/example_rss.xsl +0 -0
  422. /data/{solr → lib/generators/blacklight/templates/solr}/conf/xslt/luke.xsl +0 -0
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- describe CatalogHelper do
3
+ RSpec.describe CatalogHelper do
4
4
  include ERB::Util
5
- include CatalogHelper
5
+ include described_class
6
6
 
7
7
  def mock_response args
8
8
  current_page = args[:current_page] || 1
@@ -22,18 +22,17 @@ describe CatalogHelper do
22
22
  false
23
23
  end
24
24
 
25
-
26
25
  describe "page_entries_info" do
27
26
  it "with no results" do
28
- @response = mock_response :total => 0
27
+ @response = mock_response total: 0
29
28
 
30
- html = page_entries_info(@response, { :entry_name => 'entry_name' })
29
+ html = page_entries_info(@response, entry_name: 'entry_name')
31
30
  expect(html).to eq "No entry_names found"
32
31
  expect(html).to be_html_safe
33
32
  end
34
33
 
35
34
  it "with no results (and no entry_name provided)" do
36
- @response = mock_response :total => 0
35
+ @response = mock_response total: 0
37
36
 
38
37
  html = page_entries_info(@response)
39
38
  expect(html).to eq "No entries found"
@@ -49,15 +48,15 @@ describe CatalogHelper do
49
48
 
50
49
  describe "with a single result" do
51
50
  it "uses the provided entry name" do
52
- response = mock_response :total => 1
51
+ response = mock_response total: 1
53
52
 
54
- html = page_entries_info(response, { :entry_name => 'entry_name' })
53
+ html = page_entries_info(response, entry_name: 'entry_name')
55
54
  expect(html).to eq "<strong>1</strong> entry_name found"
56
55
  expect(html).to be_html_safe
57
56
  end
58
57
 
59
58
  it "infers a name" do
60
- response = mock_response :total => 1
59
+ response = mock_response total: 1
61
60
 
62
61
  html = page_entries_info(response)
63
62
  expect(html).to eq "<strong>1</strong> entry found"
@@ -65,8 +64,8 @@ describe CatalogHelper do
65
64
  end
66
65
 
67
66
  it "uses the model_name from the response" do
68
- response = mock_response :total => 1
69
- allow(response).to receive(:model_name).and_return(double(:human => 'thingy'))
67
+ response = mock_response total: 1
68
+ allow(response).to receive(:model_name).and_return(double(human: 'thingy'))
70
69
 
71
70
  html = page_entries_info(response)
72
71
  expect(html).to eq "<strong>1</strong> thingy found"
@@ -75,55 +74,57 @@ describe CatalogHelper do
75
74
  end
76
75
 
77
76
  it "with a single page of results" do
78
- response = mock_response :total => 7
77
+ response = mock_response total: 7
79
78
 
80
- html = page_entries_info(response, { :entry_name => 'entry_name' })
79
+ html = page_entries_info(response, entry_name: 'entry_name')
81
80
  expect(html).to eq "<strong>1</strong> - <strong>7</strong> of <strong>7</strong>"
82
81
  expect(html).to be_html_safe
83
82
  end
84
83
 
85
84
  it "on the first page of multiple pages of results" do
86
- @response = mock_response :total => 15, :per_page => 10
85
+ @response = mock_response total: 15, per_page: 10
87
86
 
88
- html = page_entries_info(@response, { :entry_name => 'entry_name' })
87
+ html = page_entries_info(@response, entry_name: 'entry_name')
89
88
  expect(html).to eq "<strong>1</strong> - <strong>10</strong> of <strong>15</strong>"
90
89
  expect(html).to be_html_safe
91
90
  end
92
91
 
93
92
  it "on the second page of multiple pages of results" do
94
- @response = mock_response :total => 47, :per_page => 10, :current_page => 2
93
+ @response = mock_response total: 47, per_page: 10, current_page: 2
95
94
 
96
- html = page_entries_info(@response, { :entry_name => 'entry_name' })
95
+ html = page_entries_info(@response, entry_name: 'entry_name')
97
96
  expect(html).to eq "<strong>11</strong> - <strong>20</strong> of <strong>47</strong>"
98
97
  expect(html).to be_html_safe
99
98
  end
100
99
 
101
100
  it "on the last page of results" do
102
- @response = mock_response :total => 47, :per_page => 10, :current_page => 5
101
+ @response = mock_response total: 47, per_page: 10, current_page: 5
103
102
 
104
- html = page_entries_info(@response, { :entry_name => 'entry_name' })
103
+ html = page_entries_info(@response, entry_name: 'entry_name')
105
104
  expect(html).to eq "<strong>41</strong> - <strong>47</strong> of <strong>47</strong>"
106
105
  expect(html).to be_html_safe
107
106
  end
108
107
  it "works with rows the same as per_page" do
109
- @response = mock_response :total => 47, :rows => 20, :current_page => 2
108
+ @response = mock_response total: 47, rows: 20, current_page: 2
110
109
 
111
- html = page_entries_info(@response, { :entry_name => 'entry_name' })
110
+ html = page_entries_info(@response, entry_name: 'entry_name')
112
111
  expect(html).to eq "<strong>21</strong> - <strong>40</strong> of <strong>47</strong>"
113
112
  expect(html).to be_html_safe
114
113
  end
115
114
 
116
115
  it "uses delimiters with large numbers" do
117
- @response = mock_response :total => 5000, :rows => 10, :current_page => 101
118
- html = page_entries_info(@response, { :entry_name => 'entry_name' })
116
+ @response = mock_response total: 5000, rows: 10, current_page: 101
117
+ html = page_entries_info(@response, entry_name: 'entry_name')
119
118
 
120
119
  expect(html).to eq "<strong>1,001</strong> - <strong>1,010</strong> of <strong>5,000</strong>"
121
120
  end
122
121
 
123
122
  context "with an ActiveRecord collection" do
123
+ subject { helper.page_entries_info(Bookmark.page(1).per(25)) }
124
+
124
125
  let(:user) { User.create! email: 'xyz@example.com', password: 'xyz12345' }
126
+
125
127
  before { 50.times { Bookmark.create!(user: user) } }
126
- subject { helper.page_entries_info(Bookmark.page(1).per(25)) }
127
128
 
128
129
  it { is_expected.to eq "<strong>1</strong> - <strong>25</strong> of <strong>50</strong>" }
129
130
  end
@@ -174,6 +175,10 @@ describe CatalogHelper do
174
175
  end
175
176
 
176
177
  describe "should_autofocus_on_search_box?" do
178
+ before do
179
+ expect(Deprecation).to receive(:warn)
180
+ end
181
+
177
182
  it "is focused if we're on a catalog-like index page without query or facet parameters" do
178
183
  allow(helper).to receive_messages(controller: CatalogController.new, action_name: "index", has_search_parameters?: false)
179
184
  expect(helper.should_autofocus_on_search_box?).to be true
@@ -196,102 +201,81 @@ describe CatalogHelper do
196
201
  end
197
202
 
198
203
  describe "has_thumbnail?" do
199
- let(:document) { instance_double(SolrDocument) }
204
+ before do
205
+ expect(Deprecation).to receive(:warn)
206
+ end
207
+
208
+ let(:document) { SolrDocument.new(data) }
209
+ let(:data) { {} }
210
+
200
211
  it "has a thumbnail if a thumbnail_method is configured" do
201
- allow(helper).to receive_messages(:blacklight_config => Blacklight::Configuration.new(:index => Blacklight::OpenStructWithHashAccess.new(:thumbnail_method => :xyz) ))
202
- expect(helper.has_thumbnail? document).to be true
212
+ allow(helper).to receive_messages(blacklight_config: Blacklight::Configuration.new(index: Blacklight::OpenStructWithHashAccess.new(thumbnail_method: :xyz, document_presenter_class: Blacklight::IndexPresenter)))
213
+ expect(helper.has_thumbnail?(document)).to be true
203
214
  end
204
215
 
205
- it "has a thumbnail if a thumbnail_field is configured and it exists in the document" do
206
- allow(helper).to receive_messages(:blacklight_config => Blacklight::Configuration.new(:index => Blacklight::OpenStructWithHashAccess.new(:thumbnail_field => :xyz) ))
207
- allow(document).to receive_messages(has?: true)
208
- expect(helper.has_thumbnail? document).to be true
216
+ context "if a thumbnail_field is configured and it exists in the document" do
217
+ let(:data) { { xyz: 'abc' } }
218
+
219
+ it "has a thumbnail" do
220
+ allow(helper).to receive_messages(blacklight_config: Blacklight::Configuration.new(index: Blacklight::OpenStructWithHashAccess.new(thumbnail_field: :xyz, document_presenter_class: Blacklight::IndexPresenter)))
221
+ expect(helper.has_thumbnail?(document)).to be true
222
+ end
209
223
  end
210
-
224
+
211
225
  it "does not have a thumbnail if the thumbnail_field is missing from the document" do
212
- allow(helper).to receive_messages(:blacklight_config => Blacklight::Configuration.new(:index => Blacklight::OpenStructWithHashAccess.new(:thumbnail_field => :xyz) ))
226
+ allow(helper).to receive_messages(blacklight_config: Blacklight::Configuration.new(index: Blacklight::OpenStructWithHashAccess.new(thumbnail_field: :xyz, document_presenter_class: Blacklight::IndexPresenter)))
213
227
  allow(document).to receive_messages(has?: false)
214
- expect(helper.has_thumbnail? document).to be false
228
+ expect(helper.has_thumbnail?(document)).to be false
215
229
  end
216
230
 
217
231
  it "does not have a thumbnail if none of the fields are configured" do
218
- allow(helper).to receive_messages(:blacklight_config => Blacklight::Configuration.new(:index => Blacklight::OpenStructWithHashAccess.new() ))
219
- expect(helper.has_thumbnail? document).to be_falsey
232
+ allow(helper).to receive_messages(blacklight_config: Blacklight::Configuration.new(index: Blacklight::OpenStructWithHashAccess.new(document_presenter_class: Blacklight::IndexPresenter)))
233
+ expect(helper).not_to have_thumbnail(document)
220
234
  end
221
235
  end
222
236
 
223
237
  describe "render_thumbnail_tag" do
224
- let(:document) { instance_double(SolrDocument) }
225
- it "calls the provided thumbnail method" do
226
- allow(helper).to receive_messages(:blacklight_config => Blacklight::Configuration.new(:index => Blacklight::OpenStructWithHashAccess.new(:thumbnail_method => :xyz) ))
227
- expect(helper).to receive_messages(:xyz => "some-thumbnail")
228
-
229
- allow(helper).to receive(:link_to_document).with(document, "some-thumbnail", {})
230
- helper.render_thumbnail_tag document
238
+ let(:index_presenter) do
239
+ instance_double(Blacklight::IndexPresenter, thumbnail: thumbnail_presenter)
231
240
  end
241
+ let(:thumbnail_presenter) { instance_double(Blacklight::ThumbnailPresenter) }
232
242
 
233
- it "creates an image tag from the given field" do
234
- allow(helper).to receive_messages(:blacklight_config => Blacklight::Configuration.new(:index => Blacklight::OpenStructWithHashAccess.new(:thumbnail_field => :xyz) ))
235
-
236
- allow(document).to receive(:has?).with(:xyz).and_return(true)
237
- allow(document).to receive(:first).with(:xyz).and_return("http://example.com/some.jpg")
238
-
239
- expect(helper).to receive(:link_to_document).with(document, image_tag("http://example.com/some.jpg"), {})
240
- helper.render_thumbnail_tag document
241
- end
242
-
243
- it "does not link to the document if the url options are false" do
244
- allow(helper).to receive_messages(:blacklight_config => Blacklight::Configuration.new(:index => Blacklight::OpenStructWithHashAccess.new(:thumbnail_method => :xyz) ))
245
- allow(helper).to receive_messages(:xyz => "some-thumbnail")
243
+ before do
246
244
  expect(Deprecation).to receive(:warn)
247
- result = helper.render_thumbnail_tag document, {}, false
248
- expect(result).to eq "some-thumbnail"
249
- end
250
-
251
- it "does not link to the document if the url options have :suppress_link" do
252
- allow(helper).to receive_messages(:blacklight_config => Blacklight::Configuration.new(:index => Blacklight::OpenStructWithHashAccess.new(:thumbnail_method => :xyz) ))
253
- allow(helper).to receive_messages(:xyz => "some-thumbnail")
254
-
255
- result = helper.render_thumbnail_tag document, {}, suppress_link: true
256
- expect(result).to eq "some-thumbnail"
245
+ allow(helper).to receive(:index_presenter).with(document).and_return(index_presenter)
257
246
  end
258
247
 
248
+ let(:document) { instance_double(SolrDocument) }
259
249
 
260
- it "returns nil if no thumbnail is available" do
261
- allow(helper).to receive_messages(:blacklight_config => Blacklight::Configuration.new(:index => Blacklight::OpenStructWithHashAccess.new() ))
262
- expect(helper.render_thumbnail_tag document).to be_nil
250
+ it "calls thumbnail presenter with default values" do
251
+ expect(thumbnail_presenter).to receive(:thumbnail_tag).with({}, {})
252
+ helper.render_thumbnail_tag document
263
253
  end
264
254
 
265
- it "returns nil if no thumbnail is returned from the thumbnail method" do
266
- allow(helper).to receive_messages(:blacklight_config => Blacklight::Configuration.new(:index => Blacklight::OpenStructWithHashAccess.new(:thumbnail_method => :xyz) ))
267
- allow(helper).to receive_messages(:xyz => nil)
268
-
269
- expect(helper.render_thumbnail_tag document).to be_nil
270
- end
271
-
272
- it "returns nil if no thumbnail is in the document" do
273
- allow(helper).to receive_messages(:blacklight_config => Blacklight::Configuration.new(:index => Blacklight::OpenStructWithHashAccess.new(:thumbnail_field => :xyz) ))
274
-
275
- allow(document).to receive(:has?).with(:xyz).and_return(false)
276
-
277
- expect(helper.render_thumbnail_tag document).to be_nil
255
+ it "calls thumbnail presenter with provided values" do
256
+ expect(thumbnail_presenter).to receive(:thumbnail_tag).with({}, suppress_link: true)
257
+ helper.render_thumbnail_tag document, {}, suppress_link: true
278
258
  end
279
259
  end
280
260
 
281
261
  describe "thumbnail_url" do
262
+ before do
263
+ expect(Deprecation).to receive(:warn)
264
+ end
265
+
282
266
  it "pulls the configured thumbnail field out of the document" do
283
- allow(helper).to receive_messages(:blacklight_config => Blacklight::Configuration.new(:index => Blacklight::OpenStructWithHashAccess.new(:thumbnail_field => :xyz) ))
267
+ allow(helper).to receive_messages(blacklight_config: Blacklight::Configuration.new(index: Blacklight::OpenStructWithHashAccess.new(thumbnail_field: :xyz)))
284
268
  document = instance_double(SolrDocument)
285
269
  allow(document).to receive(:has?).with(:xyz).and_return(true)
286
270
  allow(document).to receive(:first).with(:xyz).and_return("asdf")
287
- expect(helper.thumbnail_url document).to eq("asdf")
271
+ expect(helper.thumbnail_url(document)).to eq("asdf")
288
272
  end
289
273
 
290
274
  it "returns nil if the thumbnail field doesn't exist" do
291
- allow(helper).to receive_messages(:blacklight_config => Blacklight::Configuration.new(:index => Blacklight::OpenStructWithHashAccess.new(:thumbnail_field => :xyz) ))
275
+ allow(helper).to receive_messages(blacklight_config: Blacklight::Configuration.new(index: Blacklight::OpenStructWithHashAccess.new(thumbnail_field: :xyz)))
292
276
  document = instance_double(SolrDocument)
293
277
  allow(document).to receive(:has?).with(:xyz).and_return(false)
294
- expect(helper.thumbnail_url document).to be_nil
278
+ expect(helper.thumbnail_url(document)).to be_nil
295
279
  end
296
280
  end
297
281
 
@@ -325,38 +309,37 @@ describe CatalogHelper do
325
309
 
326
310
  it "pulls data out of a document's field" do
327
311
  blacklight_config.index.display_type_field = :type
328
- doc = { :type => 'book' }
312
+ doc = { type: 'book' }
329
313
  expect(helper.render_document_class(doc)).to eq "blacklight-book"
330
314
  end
331
315
 
332
316
  it "supports multivalued fields" do
333
317
  blacklight_config.index.display_type_field = :type
334
- doc = { :type => ['book', 'mss'] }
318
+ doc = { type: %w[book mss] }
335
319
  expect(helper.render_document_class(doc)).to eq "blacklight-book blacklight-mss"
336
320
  end
337
321
 
338
322
  it "supports empty fields" do
339
323
  blacklight_config.index.display_type_field = :type
340
- doc = { :type => [] }
324
+ doc = { type: [] }
341
325
  expect(helper.render_document_class(doc)).to be_blank
342
326
  end
343
327
 
344
328
  it "supports missing fields" do
345
329
  blacklight_config.index.display_type_field = :type
346
- doc = { }
330
+ doc = {}
347
331
  expect(helper.render_document_class(doc)).to be_blank
348
332
  end
349
333
 
350
334
  it "supports view-specific field configuration" do
351
335
  allow(helper).to receive(:document_index_view_type).and_return(:some_view_type)
352
336
  blacklight_config.view.some_view_type.display_type_field = :other_type
353
- doc = { other_type: "document"}
337
+ doc = { other_type: "document" }
354
338
  expect(helper.render_document_class(doc)).to eq "blacklight-document"
355
339
  end
356
340
  end
357
341
 
358
342
  describe "#bookmarked?" do
359
-
360
343
  let(:bookmark) { Bookmark.new document: bookmarked_document }
361
344
  let(:bookmarked_document) { SolrDocument.new(id: 'a') }
362
345
 
@@ -387,24 +370,25 @@ describe CatalogHelper do
387
370
  end
388
371
 
389
372
  it "renders a facet with two values" do
390
- expect(helper.render_search_to_page_title_filter('foo', ['bar', 'baz'])).to eq "Foo: bar and baz"
373
+ expect(helper.render_search_to_page_title_filter('foo', %w[bar baz])).to eq "Foo: bar and baz"
391
374
  end
392
375
 
393
376
  it "renders a facet with more than two values" do
394
- expect(helper.render_search_to_page_title_filter('foo', ['bar', 'baz', 'foobar'])).to eq "Foo: 3 selected"
377
+ expect(helper.render_search_to_page_title_filter('foo', %w[bar baz foobar])).to eq "Foo: 3 selected"
395
378
  end
396
379
  end
397
380
 
398
381
  describe "#render_search_to_page_title" do
382
+ subject { helper.render_search_to_page_title(params) }
383
+
399
384
  before do
400
385
  allow(helper).to receive(:blacklight_config).and_return(blacklight_config)
401
- allow(helper).to receive(:default_search_field).and_return(Blacklight::Configuration::SearchField.new(:key => 'default_search_field', :display_label => 'Default'))
386
+ allow(helper).to receive(:default_search_field).and_return(Blacklight::Configuration::SearchField.new(key: 'default_search_field', display_label: 'Default'))
402
387
  allow(helper).to receive(:label_for_search_field).with(nil).and_return('')
403
388
  end
404
389
 
405
390
  let(:blacklight_config) { Blacklight::Configuration.new }
406
391
  let(:params) { ActionController::Parameters.new(q: 'foobar', f: { format: ["Book"] }) }
407
- subject { helper.render_search_to_page_title(params) }
408
392
 
409
393
  it { is_expected.to eq "foobar / Format: Book" }
410
394
  end
data/spec/i18n_spec.rb ADDED
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+ require 'i18n/tasks'
3
+
4
+ RSpec.describe 'I18n', type: :i18n do
5
+ let(:i18n) { I18n::Tasks::BaseTask.new }
6
+ let(:missing_keys) { i18n.missing_keys }
7
+ let(:unused_keys) { i18n.unused_keys }
8
+
9
+ it 'does not have missing keys' do
10
+ expect(missing_keys).to be_empty,
11
+ "Missing #{missing_keys.leaves.count} i18n keys, run `i18n-tasks missing' to show them"
12
+ end
13
+
14
+ pending 'does not have unused keys' do
15
+ expect(unused_keys).to be_empty,
16
+ "#{unused_keys.leaves.count} unused i18n keys, run `i18n-tasks unused' to show them"
17
+ end
18
+ end
@@ -1,19 +1,22 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
- require 'generators/blacklight/solr5_generator'
4
+ require 'generators/blacklight/solr_generator'
3
5
 
4
- describe Blacklight::Solr5Generator do
6
+ RSpec.describe Blacklight::SolrGenerator do
5
7
  let(:destination) { Dir.mktmpdir }
6
8
 
7
9
  describe "#solr_wrapper_config" do
8
10
  let(:generator) { described_class.new }
9
- let(:files_to_test) {[
10
- File.join("#{destination}", '.solr_wrapper.yml')
11
- ]}
11
+ let(:files_to_test) do
12
+ [
13
+ File.join(destination.to_s, '.solr_wrapper.yml')
14
+ ]
15
+ end
12
16
 
13
17
  before do
14
18
  generator.destination_root = destination
15
19
  generator.solr_wrapper_config
16
-
17
20
  end
18
21
 
19
22
  after do
@@ -29,12 +32,17 @@ describe Blacklight::Solr5Generator do
29
32
 
30
33
  describe "#copy_solr_conf" do
31
34
  let(:generator) { described_class.new }
32
- let(:dirs_to_test) {[
33
- File.join("#{destination}", 'solr'),
34
- File.join("#{destination}", 'solr/conf')]}
35
- let(:files_to_test) {[
36
- File.join("#{destination}", 'solr/conf/solrconfig.xml')
37
- ]}
35
+ let(:dirs_to_test) do
36
+ [
37
+ File.join(destination.to_s, 'solr'),
38
+ File.join(destination.to_s, 'solr/conf')
39
+ ]
40
+ end
41
+ let(:files_to_test) do
42
+ [
43
+ File.join(destination.to_s, 'solr/conf/solrconfig.xml')
44
+ ]
45
+ end
38
46
 
39
47
  before do
40
48
  generator.destination_root = destination
@@ -57,4 +65,4 @@ describe Blacklight::Solr5Generator do
57
65
  end
58
66
  end
59
67
  end
60
- end
68
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Blacklight::Configuration::FacetField do
4
+ describe 'link_to_search' do
5
+ subject { described_class.new(link_to_search: true) }
6
+
7
+ it 'is deprecated' do
8
+ expect(Deprecation).to receive(:warn)
9
+ expect(subject.normalize!)
10
+ expect(subject.link_to_facet).to eq true
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Blacklight::Configuration::Field do
4
+ subject { described_class.new(key: key, label: label) }
5
+
6
+ let(:key) { 'some_key' }
7
+ let(:label) { 'some label' }
8
+
9
+ describe '#display_label' do
10
+ it "looks up the label to display for the given document and field" do
11
+ allow(I18n).to receive(:t).with(:"blacklight.search.fields.my_context.some_key", default: [:"blacklight.search.fields.some_key", label, subject.default_label]).and_return('x')
12
+ expect(subject.display_label('my_context')).to eq 'x'
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Blacklight::NestedOpenStructWithHashAccess do
4
+ describe "#deep_dup" do
5
+ it "preserves the current class" do
6
+ expect(described_class.new(described_class).deep_dup).to be_a_kind_of described_class
7
+ end
8
+
9
+ it "preserves the default proc" do
10
+ nested = described_class.new Hash
11
+
12
+ copy = nested.deep_dup
13
+ copy.a[:b] = 1
14
+ expect(copy.a[:b]).to eq 1
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,148 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Blacklight::OpenStructWithHashAccess do
4
+ it "provides hash-like accessors for OpenStruct data" do
5
+ a = described_class.new foo: :bar, baz: 1
6
+
7
+ expect(a[:foo]).to eq :bar
8
+ expect(a[:baz]).to eq 1
9
+ expect(a[:asdf]).to be_nil
10
+ end
11
+
12
+ it "provides hash-like writers for OpenStruct data" do
13
+ a = described_class.new foo: :bar, baz: 1
14
+
15
+ a[:asdf] = 'qwerty'
16
+ expect(a.asdf).to eq 'qwerty'
17
+ end
18
+
19
+ it "treats symbols and strings interchangeably in hash access" do
20
+ h = described_class.new
21
+
22
+ h["string"] = "value"
23
+ expect(h[:string]).to eq "value"
24
+ expect(h.string).to eq "value"
25
+
26
+ h[:symbol] = "value"
27
+ expect(h["symbol"]).to eq "value"
28
+ expect(h.symbol).to eq "value"
29
+ end
30
+
31
+ describe "internal hash table" do
32
+ before do
33
+ @h = described_class.new
34
+ @h[:a] = 1
35
+ @h[:b] = 2
36
+ end
37
+
38
+ it "exposes the internal hash table" do
39
+ expect(@h.to_h).to be_a_kind_of(Hash)
40
+ expect(@h.to_h[:a]).to eq 1
41
+ end
42
+
43
+ it "exposes keys" do
44
+ expect(@h.keys).to include(:a, :b)
45
+ end
46
+ end
47
+
48
+ describe "#key?" do
49
+ subject do
50
+ h = described_class.new
51
+ h[:a] = 1
52
+ h[:b] = 2
53
+ h
54
+ end
55
+
56
+ it "is true if the key exists" do
57
+ expect(subject.key?(:a)).to eq true
58
+ end
59
+
60
+ it "is false if the key does not exist" do
61
+ expect(subject.key?(:c)).to eq false
62
+ end
63
+ end
64
+
65
+ describe "#replace" do
66
+ subject { described_class.new a: 1 }
67
+
68
+ it "can use #replace to reorder the hash" do
69
+ subject.replace b: 1
70
+ expect(subject.b).to eq 1
71
+ end
72
+ end
73
+
74
+ describe "#sort_by" do
75
+ subject { described_class.new c: 3, b: 1, a: 2 }
76
+
77
+ it "sorts the underlying hash" do
78
+ sorted = subject.sort_by { |_k, v| v }
79
+ expect(sorted.keys).to match_array [:b, :a, :c]
80
+ end
81
+ end
82
+
83
+ describe "#sort_by!" do
84
+ subject { described_class.new c: 3, b: 1, a: 2 }
85
+
86
+ it "sorts the underlying hash" do
87
+ subject.sort_by! { |_k, v| v }
88
+ expect(subject.keys).to match_array [:b, :a, :c]
89
+ end
90
+ end
91
+
92
+ describe "#merge" do
93
+ before do
94
+ @h = described_class.new
95
+ @h[:a] = 1
96
+ @h[:b] = 2
97
+ end
98
+
99
+ it "merges the object with a hash" do
100
+ expect(@h.merge(a: 'a')[:a]).to eq 'a'
101
+ end
102
+
103
+ it "merges the object with another struct" do
104
+ expect(@h.merge(described_class.new(a: 'a'))[:a]).to eq 'a'
105
+ end
106
+ end
107
+
108
+ describe "#merge!" do
109
+ before do
110
+ @h = described_class.new
111
+ @h[:a] = 1
112
+ @h[:b] = 2
113
+ end
114
+
115
+ it "merges the object with a hash" do
116
+ @h[:a] = 'a'
117
+ expect(@h[:a]).to eq 'a'
118
+ end
119
+
120
+ it "merges the object with another struct" do
121
+ @h.merge!(described_class.new(a: 'a'))
122
+ expect(@h[:a]).to eq 'a'
123
+ end
124
+ end
125
+
126
+ describe "#to_json" do
127
+ subject { described_class.new a: 1, b: 2 }
128
+
129
+ it "serializes as json" do
130
+ expect(subject.to_json).to eq({ a: 1, b: 2 }.to_json)
131
+ end
132
+ end
133
+
134
+ describe "#deep_dup" do
135
+ subject { described_class.new a: 1, b: { c: 1 } }
136
+
137
+ it "duplicates nested hashes" do
138
+ copy = subject.deep_dup
139
+ copy.a = 2
140
+ copy.b[:c] = 2
141
+
142
+ expect(subject.a).to eq 1
143
+ expect(subject.b[:c]).to eq 1
144
+ expect(copy.a).to eq 2
145
+ expect(copy.b[:c]).to eq 2
146
+ end
147
+ end
148
+ end
@@ -1,19 +1,21 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- describe Blacklight::Parameters do
3
+ RSpec.describe Blacklight::Parameters do
4
4
  describe "sanitize_search_params" do
5
5
  subject { described_class.sanitize(params) }
6
6
 
7
7
  context "with nil values" do
8
8
  let(:params) { ActionController::Parameters.new a: nil, b: 1 }
9
+
9
10
  it "removes them" do
10
- expect(subject).to_not have_key(:a)
11
+ expect(subject).not_to have_key(:a)
11
12
  expect(subject[:b]).to eq 1
12
13
  end
13
14
  end
14
15
 
15
16
  context "with blacklisted keys" do
16
17
  let(:params) { ActionController::Parameters.new action: true, controller: true, id: true, commit: true, utf8: true }
18
+
17
19
  it "removes them" do
18
20
  expect(subject).to be_empty
19
21
  end