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
@@ -4,31 +4,28 @@ module Blacklight
4
4
  # Blacklight::Configuration holds the configuration for a Blacklight::Controller, including
5
5
  # fields to display, facets to show, sort options, and search fields.
6
6
  class Configuration < OpenStructWithHashAccess
7
- # Using required_dependency to work around Rails autoloading
8
- # problems when developing blacklight. Without this, any change
9
- # to this class breaks other classes in this namespace
10
-
11
- require_dependency 'blacklight/configuration/context'
12
- require_dependency 'blacklight/configuration/view_config'
13
- require_dependency 'blacklight/configuration/tool_config'
14
- # XXX this isn't very pretty, but it works.
15
- require_dependency 'blacklight/configuration/fields'
16
- require_dependency 'blacklight/configuration/field'
17
- require_dependency 'blacklight/configuration/null_field'
18
- require_dependency 'blacklight/configuration/search_field'
19
- require_dependency 'blacklight/configuration/facet_field'
20
- require_dependency 'blacklight/configuration/sort_field'
7
+ extend ActiveSupport::Autoload
8
+ eager_autoload do
9
+ autoload :Context
10
+ autoload :ViewConfig
11
+ autoload :ToolConfig
12
+ autoload :Fields
13
+ autoload :Field
14
+ autoload :NullField
15
+ autoload :SearchField
16
+ autoload :FacetField
17
+ autoload :SortField
18
+ end
19
+
21
20
  include Fields
22
21
 
23
- # Set up Blacklight::Configuration.default_values to contain
24
- # the basic, required Blacklight fields
22
+ # Set up Blacklight::Configuration.default_values to contain the basic, required Blacklight fields
25
23
  class << self
24
+ # rubocop:disable Metrics/MethodLength
26
25
  def default_values
27
26
  @default_values ||= begin
28
27
  {
29
- ##
30
28
  # === Search request configuration
31
- ##
32
29
  # HTTP method to use when making requests to solr; valid
33
30
  # values are :get and :post.
34
31
  http_method: :get,
@@ -38,24 +35,14 @@ module Blacklight
38
35
  default_solr_params: {},
39
36
  ##
40
37
  # === Single document request configuration
41
- ##
42
- # The solr rqeuest handler to use when requesting only a single document
43
- document_solr_request_handler: 'document',
44
- # THe path to send single document requests to solr
45
- document_solr_path: nil,
46
- document_unique_id_param: :id,
38
+ # The solr request handler to use when requesting only a single document
39
+ document_solr_request_handler: nil,
40
+ # The path to send single document requests to solr
41
+ document_solr_path: 'get',
42
+ document_unique_id_param: :ids,
47
43
  # Default values of parameters to send when requesting a single document
48
- default_document_solr_params: {
49
- ## Blacklight provides these settings in the /document request handler
50
- ## by default, we just ask for all fields.
51
- #fl: '*',
52
- ## this is a fancy way to say "find the document by id using
53
- ## the value in the id query parameter"
54
- #q: "{!term f=#{unique_key} v=$id}",
55
- ## disable features we don't need
56
- #facet: false,
57
- #rows: 1
58
- },
44
+ default_document_solr_params: {},
45
+ fetch_many_document_params: {},
59
46
  document_pagination_params: {},
60
47
  ##
61
48
  # == Response models
@@ -67,16 +54,13 @@ module Blacklight
67
54
  response_model: nil,
68
55
  # the model to use for each response document
69
56
  document_model: nil,
70
- # document presenter class used by helpers and views
71
- document_presenter_class: nil, # deprecated
72
57
  # Class for paginating long lists of facet fields
73
58
  facet_paginator_class: nil,
74
59
  # repository connection configuration
75
60
  connection_config: nil,
76
61
  ##
77
62
  # == Blacklight view configuration
78
- ##
79
- navbar: OpenStructWithHashAccess.new(partials: { }),
63
+ navbar: OpenStructWithHashAccess.new(partials: {}),
80
64
  # General configuration for all views
81
65
  index: ViewConfig::Index.new(
82
66
  # document presenter class used by helpers and views
@@ -98,10 +82,10 @@ module Blacklight
98
82
  show: ViewConfig::Show.new(
99
83
  # document presenter class used by helpers and views
100
84
  document_presenter_class: nil,
101
- # default route parameters for 'show' requests
102
- # set this to a hash with additional arguments to merge into
103
- # the route, or set `controller: :current` to route to the
104
- # current controller.
85
+ display_type_field: 'format',
86
+ # Default route parameters for 'show' requests.
87
+ # Set this to a hash with additional arguments to merge into the route,
88
+ # or set `controller: :current` to route to the current controller.
105
89
  route: nil,
106
90
  # partials to render for each document(see #render_document_partials)
107
91
  partials: [:show_header, :show],
@@ -109,17 +93,17 @@ module Blacklight
109
93
  ),
110
94
  # Configurations for specific types of index views
111
95
  view: NestedOpenStructWithHashAccess.new(ViewConfig,
112
- 'list',
113
- atom: {
114
- if: false, # by default, atom should not show up as an alternative view
115
- partials: [:document]
116
- },
117
- rss: {
118
- if: false, # by default, rss should not show up as an alternative view
119
- partials: [:document]
120
- }),
96
+ list: {},
97
+ atom: {
98
+ if: false, # by default, atom should not show up as an alternative view
99
+ partials: [:document]
100
+ },
101
+ rss: {
102
+ if: false, # by default, rss should not show up as an alternative view
103
+ partials: [:document]
104
+ }),
121
105
  #
122
- # These fields are created and managed below by `defined_field_access`
106
+ # These fields are created and managed below by `define_field_access`
123
107
  # facet_fields
124
108
  # index_fields
125
109
  # show_fields
@@ -127,7 +111,6 @@ module Blacklight
127
111
  # search_fields
128
112
  ##
129
113
  # === Blacklight behavior configuration
130
- ##
131
114
  # Maxiumum number of spelling suggestions to offer
132
115
  spell_max: 5,
133
116
  # Maximum number of results to show per page
@@ -141,9 +124,12 @@ module Blacklight
141
124
  default_more_limit: 20,
142
125
  # proc for determining whether the session is a crawler/bot
143
126
  # ex.: crawler_detector: lambda { |req| req.env['HTTP_USER_AGENT'] =~ /bot/ }
144
- crawler_detector: nil
127
+ crawler_detector: nil,
128
+ autocomplete_suggester: 'mySuggester',
129
+ raw_endpoint: OpenStructWithHashAccess.new(enabled: false)
145
130
  }
146
131
  end
132
+ # rubocop:enable Metrics/MethodLength
147
133
  end
148
134
  end
149
135
 
@@ -177,6 +163,11 @@ module Blacklight
177
163
  super || ::SolrDocument
178
164
  end
179
165
 
166
+ # A class that builds documents
167
+ def document_factory
168
+ super || Blacklight::DocumentFactory
169
+ end
170
+
180
171
  # only here to support alias_method
181
172
  def document_model=(*args)
182
173
  super
@@ -186,17 +177,6 @@ module Blacklight
186
177
  super || Blacklight::Solr::Response
187
178
  end
188
179
 
189
- # @deprecated
190
- def document_presenter_class
191
- super || Blacklight::DocumentPresenter
192
- end
193
-
194
- # @deprecated
195
- def document_presenter_class=(klass)
196
- super
197
- end
198
- deprecation_deprecate :document_presenter_class= => "replaced by show.presenter_class and index.presenter_class"
199
-
200
180
  def response_model=(*args)
201
181
  super
202
182
  end
@@ -205,6 +185,10 @@ module Blacklight
205
185
  super || Blacklight::Solr::Repository
206
186
  end
207
187
 
188
+ def repository
189
+ repository_class.new(self)
190
+ end
191
+
208
192
  def connection_config
209
193
  super || Blacklight.connection_config
210
194
  end
@@ -234,16 +218,14 @@ module Blacklight
234
218
  # Returns default search field, used for simpler display in history, etc.
235
219
  # if not set, defaults to first defined search field
236
220
  def default_search_field
237
- field = super
238
- field ||= search_fields.values.find { |f| f.default == true }
221
+ field = super || search_fields.values.find { |f| f.default == true }
239
222
  field || search_fields.values.first
240
223
  end
241
224
 
242
225
  # Returns default sort field, used for simpler display in history, etc.
243
226
  # if not set, defaults to first defined sort field
244
227
  def default_sort_field
245
- field = super
246
- field ||= sort_fields.values.find { |f| f.default == true }
228
+ field = super || sort_fields.values.find { |f| f.default == true }
247
229
  field || sort_fields.values.first
248
230
  end
249
231
 
@@ -271,11 +253,10 @@ module Blacklight
271
253
  if fields.empty?
272
254
  self.add_facet_fields_to_solr_request = true
273
255
  else
274
- facet_fields.slice(*fields).each { |_k, v| v.include_in_request = true }
256
+ facet_fields.slice(*fields).each_value { |v| v.include_in_request = true }
275
257
  end
276
258
  end
277
259
 
278
- ##
279
260
  # Add any configured facet fields to the default solr parameters hash
280
261
  # @overload add_field_configuration_to_solr_request!
281
262
  # add all index, show, and facet fields to the solr request
@@ -285,9 +266,9 @@ module Blacklight
285
266
  if fields.empty?
286
267
  self.add_field_configuration_to_solr_request = true
287
268
  else
288
- index_fields.slice(*fields).each { |_k, v| v.include_in_request = true }
289
- show_fields.slice(*fields).each { |_k, v| v.include_in_request = true }
290
- facet_fields.slice(*fields).each { |_k, v| v.include_in_request = true }
269
+ index_fields.slice(*fields).each_value { |v| v.include_in_request = true }
270
+ show_fields.slice(*fields).each_value { |v| v.include_in_request = true }
271
+ facet_fields.slice(*fields).each_value { |v| v.include_in_request = true }
291
272
  end
292
273
  end
293
274
 
@@ -304,17 +285,22 @@ module Blacklight
304
285
  end
305
286
  end
306
287
  end
307
- alias_method :inheritable_copy, :deep_copy
308
288
 
309
- ##
289
+ # builds a copy for the provided controller class
290
+ def build(klass)
291
+ deep_copy.tap do |conf|
292
+ conf.klass = klass
293
+ end
294
+ end
295
+ alias_method :inheritable_copy, :build
296
+
310
297
  # Get a view configuration for the given view type
311
298
  # including default values from the index configuration
299
+ # @param [Symbol,#to_sym] view_type
300
+ # @return [Blacklight::Configuration::ViewConfig]
312
301
  def view_config(view_type)
313
- if view_type == :show
314
- self.index.merge self.show
315
- else
316
- self.index.merge view.fetch(view_type, {})
317
- end
302
+ view_type = view_type.to_sym unless view_type.is_a? Symbol
303
+ index.merge(view_type == :show ? show : view.fetch(view_type, {}))
318
304
  end
319
305
 
320
306
  # YARD will include inline disabling as docs, cannot do multiline inside @!macro. AND this must be separate from doc block.
@@ -329,6 +315,7 @@ module Blacklight
329
315
  def add_show_tools_partial(name, opts = {})
330
316
  opts[:partial] ||= 'document_action'
331
317
  add_action(show.document_actions, name, opts)
318
+ klass && ActionBuilder.new(klass, name, opts).build
332
319
  end
333
320
  # rubocop:enable Metrics/LineLength
334
321
 
@@ -350,13 +337,39 @@ module Blacklight
350
337
  add_action(navbar.partials, name, opts)
351
338
  end
352
339
 
353
- private
340
+ ##
341
+ # Add a section of config that only applies to documents with a matching display type
342
+ def for_display_type display_type, &_block
343
+ self.fields_for_type ||= {}
354
344
 
355
- def add_action(config_hash, name, opts)
356
- config = Blacklight::Configuration::ToolConfig.new opts
357
- config.name = name
358
- yield(config) if block_given?
359
- config_hash[name] = config
345
+ (fields_for_type[display_type] ||= self.class.new).tap do |conf|
346
+ yield(conf) if block_given?
360
347
  end
348
+ end
349
+
350
+ ##
351
+ # Return a list of fields for the index display that should be used for the
352
+ # provided document. This respects any configuration made using for_display_type
353
+ def index_fields_for(document)
354
+ display_type = document.first(index.display_type_field)
355
+ for_display_type(display_type).index_fields.merge(index_fields)
356
+ end
357
+
358
+ ##
359
+ # Return a list of fields for the show page that should be used for the
360
+ # provided document. This respects any configuration made using for_display_type
361
+ def show_fields_for(document)
362
+ display_type = document.first(show.display_type_field)
363
+ for_display_type(display_type).show_fields.merge(show_fields)
364
+ end
365
+
366
+ private
367
+
368
+ def add_action(config_hash, name, opts)
369
+ config = Blacklight::Configuration::ToolConfig.new opts
370
+ config.name = name
371
+ yield(config) if block_given?
372
+ config_hash[name] = config
373
+ end
361
374
  end
362
375
  end
@@ -3,12 +3,9 @@ module Blacklight
3
3
  class Engine < Rails::Engine
4
4
  engine_name "blacklight"
5
5
 
6
- require 'bootstrap-sass'
7
- require 'twitter-typeahead-rails'
8
-
9
6
  # BlacklightHelper is needed by all helpers, so we inject it
10
- # into action view base here.
11
- initializer 'blacklight.helpers' do |app|
7
+ # into action view base here.
8
+ initializer 'blacklight.helpers' do
12
9
  ActionView::Base.send :include, BlacklightHelper
13
10
  end
14
11
 
@@ -28,7 +25,10 @@ module Blacklight
28
25
  end
29
26
 
30
27
  initializer "blacklight.assets.precompile" do |app|
31
- app.config.assets.precompile += %w(favicon.ico)
28
+ # When Rails has been generated in API mode, it does not have sprockets available
29
+ if defined? Sprockets
30
+ app.config.assets.precompile += %w(favicon.ico)
31
+ end
32
32
  end
33
33
 
34
34
  Blacklight::Engine.config.sms_mappings = {
@@ -43,7 +43,11 @@ module Blacklight
43
43
  }
44
44
 
45
45
  config.bookmarks_http_method = :post
46
-
46
+
47
47
  config.email_regexp = defined?(Devise) ? Devise.email_regexp : /\A[^@\s]+@[^@\s]+\z/
48
+
49
+ config.action_dispatch.rescue_responses.merge!(
50
+ "Blacklight::Exceptions::RecordNotFound" => :not_found
51
+ )
48
52
  end
49
53
  end
@@ -4,13 +4,7 @@ module Blacklight
4
4
  class AccessDenied < StandardError
5
5
  end
6
6
 
7
- # When a request for a single solr document by id
8
- # is not successful, we can raise this exception.
9
- # Deprecated; this will be removed in Blacklight 6.0:
10
- class InvalidSolrID < RuntimeError
11
- end
12
- # In Blacklight 6.0, this exception can subclass RuntimeError directly
13
- class RecordNotFound < InvalidSolrID
7
+ class RecordNotFound < RuntimeError
14
8
  end
15
9
 
16
10
  class InvalidRequest < StandardError
@@ -20,5 +14,8 @@ module Blacklight
20
14
  end
21
15
 
22
16
  class ECONNREFUSED < ::Errno::ECONNREFUSED; end
17
+
18
+ class IconNotFound < StandardError
19
+ end
23
20
  end
24
21
  end
@@ -1,96 +1,24 @@
1
1
  # frozen_string_literal: true
2
2
  require 'ostruct'
3
3
  module Blacklight
4
- module Utils
5
- def self.needs_attr_accessible?
6
- protected_attributes_enabled?
7
- end
8
-
9
- def self.protected_attributes_enabled?
10
- defined?(ActiveModel::MassAssignmentSecurity)
11
- end
12
- end
13
-
14
4
  ##
15
- # An OpenStruct that responds to common Hash methods
16
- class OpenStructWithHashAccess < OpenStruct
17
- delegate :keys, :each, :map, :has_key?, :key?, :include?, :empty?, :length, :delete, :delete_if, :keep_if, :clear, :reject!, :select!, :replace, :fetch, :to_json, :as_json, :any?, to: :to_h
18
-
19
- ##
20
- # Expose the internal hash
21
- # @return [Hash]
22
- def to_h
23
- @table
24
- end
25
-
26
- def select *args, &block
27
- self.class.new to_h.select(*args, &block)
28
- end
29
-
30
- def sort_by *args, &block
31
- self.class.new Hash[to_h.sort_by(*args, &block)]
32
- end
33
-
34
- def sort_by! *args, &block
35
- replace Hash[to_h.sort_by(*args, &block)]
36
- self
37
- end
38
-
39
- ##
40
- # Merge the values of this OpenStruct with another OpenStruct or Hash
41
- # @param [Hash,#to_h] other_hash
42
- # @return [OpenStructWithHashAccess] a new instance of an OpenStructWithHashAccess
43
- def merge other_hash
44
- self.class.new to_h.merge((other_hash if other_hash.is_a? Hash) || other_hash.to_h)
45
- end
46
-
47
- ##
48
- # Merge the values of another OpenStruct or Hash into this object
49
- # @param [Hash,#to_h] other_hash
50
- # @return [OpenStructWithHashAccess] a new instance of an OpenStructWithHashAccess
51
- def merge! other_hash
52
- @table.merge!((other_hash if other_hash.is_a? Hash) || other_hash.to_h)
53
- end
54
-
55
- def deep_dup
56
- self.class.new @table.deep_dup
57
- end
58
- end
59
-
60
- ##
61
- # An OpenStruct refinement that converts any hash-keys into
5
+ # An OpenStruct refinement that converts any hash-keys into
62
6
  # additional instances of NestedOpenStructWithHashAccess
63
7
  class NestedOpenStructWithHashAccess < OpenStructWithHashAccess
64
8
  attr_reader :nested_class
65
- delegate :default_proc=, :to => :to_h
9
+ delegate :default_proc=, to: :to_h
66
10
 
67
- def initialize klass, *args
11
+ def initialize(klass, hash = {})
68
12
  @nested_class = klass
69
- hash = {}
70
-
71
- hashes_and_keys = args.flatten
72
- lazy_configs = hashes_and_keys.extract_options!
73
-
74
- hashes_and_keys.each do |v|
13
+ value = hash.transform_values do |v|
75
14
  if v.is_a? Hash
76
- key = v.first
77
- value = v[key]
78
-
79
- hash[key] = nested_class.new value
15
+ nested_class.new(v)
80
16
  else
81
- hash[v] = nested_class.new
17
+ v
82
18
  end
83
19
  end
84
20
 
85
- lazy_configs.each do |k,v|
86
- hash[k] = if v.is_a? nested_class
87
- v
88
- else
89
- nested_class.new v
90
- end
91
- end
92
-
93
- super hash
21
+ super value
94
22
  set_default_proc!
95
23
  end
96
24
 
@@ -131,7 +59,7 @@ module Blacklight
131
59
  end
132
60
 
133
61
  def deep_dup
134
- self.class.new self.nested_class, @table.deep_dup
62
+ self.class.new nested_class, @table.deep_dup
135
63
  end
136
64
 
137
65
  def select *args, &block
@@ -172,7 +100,7 @@ module Blacklight
172
100
 
173
101
  def set_default_proc!
174
102
  self.default_proc = lambda do |hash, key|
175
- hash[key] = self.nested_class.new
103
+ hash[key] = nested_class.new
176
104
  end
177
105
  end
178
106
  end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+ require 'ostruct'
3
+ module Blacklight
4
+ ##
5
+ # An OpenStruct that responds to common Hash methods
6
+ class OpenStructWithHashAccess < OpenStruct
7
+ delegate :keys, :each, :map, :has_key?, :key?, :include?, :empty?, :length, :delete, :delete_if, :keep_if, :clear, :reject!, :select!, :replace, :fetch, :to_json, :as_json, :any?, to: :to_h
8
+
9
+ ##
10
+ # Expose the internal hash
11
+ # @return [Hash]
12
+ def to_h
13
+ @table
14
+ end
15
+
16
+ def select *args, &block
17
+ self.class.new to_h.select(*args, &block)
18
+ end
19
+
20
+ def sort_by *args, &block
21
+ self.class.new Hash[to_h.sort_by(*args, &block)]
22
+ end
23
+
24
+ def sort_by! *args, &block
25
+ replace Hash[to_h.sort_by(*args, &block)]
26
+ self
27
+ end
28
+
29
+ ##
30
+ # Merge the values of this OpenStruct with another OpenStruct or Hash
31
+ # @param [Hash,#to_h] other_hash
32
+ # @return [OpenStructWithHashAccess] a new instance of an OpenStructWithHashAccess
33
+ def merge other_hash
34
+ self.class.new to_h.merge((other_hash if other_hash.is_a? Hash) || other_hash.to_h)
35
+ end
36
+
37
+ ##
38
+ # Merge the values of another OpenStruct or Hash into this object
39
+ # @param [Hash,#to_h] other_hash
40
+ # @return [OpenStructWithHashAccess] a new instance of an OpenStructWithHashAccess
41
+ def merge! other_hash
42
+ @table.merge!((other_hash if other_hash.is_a? Hash) || other_hash.to_h)
43
+ end
44
+
45
+ def deep_dup
46
+ self.class.new @table.deep_dup
47
+ end
48
+ end
49
+ end
@@ -6,7 +6,7 @@ module Blacklight
6
6
  # from the provided parameters.
7
7
  # @param [Hash] params parameters
8
8
  def self.sanitize params
9
- params.reject { |k,v| v.nil? }
9
+ params.reject { |_k, v| v.nil? }
10
10
  .except(:action, :controller, :id, :commit, :utf8)
11
11
  end
12
12
  end
@@ -6,9 +6,7 @@ module Blacklight
6
6
  @defaults = defaults
7
7
  end
8
8
 
9
- def call(mapper, options = {})
10
- options = @defaults.merge(options)
11
-
9
+ def call(mapper, _options = {})
12
10
  mapper.member do
13
11
  mapper.match 'email', via: [:get, :post]
14
12
  mapper.match 'sms', via: [:get, :post]
@@ -6,14 +6,14 @@ module Blacklight
6
6
  @defaults = defaults
7
7
  end
8
8
 
9
- def call(mapper, options = {})
10
- options = @defaults.merge(options)
11
-
9
+ def call(mapper, _options = {})
12
10
  mapper.match '/', action: 'index', as: 'search', via: [:get, :post]
13
11
 
14
12
  mapper.post ":id/track", action: 'track', as: 'track'
13
+ mapper.get ":id/raw", action: 'raw', as: 'raw', defaults: { format: 'json' }
15
14
 
16
15
  mapper.get "opensearch"
16
+ mapper.get 'suggest', as: 'suggest_index', defaults: { format: 'json' }
17
17
  mapper.get "facet/:id", action: 'facet', as: 'facet'
18
18
  end
19
19
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'active_support/per_thread_registry'
2
4
 
3
5
  module Blacklight