newspaper_works 0.1.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 (461) hide show
  1. checksums.yaml +7 -0
  2. data/.fcrepo_wrapper +4 -0
  3. data/.gitignore +43 -0
  4. data/.rubocop.yml +143 -0
  5. data/.solr_wrapper +8 -0
  6. data/.travis.yml +50 -0
  7. data/Gemfile +47 -0
  8. data/LICENSE +203 -0
  9. data/README.md +159 -0
  10. data/Rakefile +38 -0
  11. data/app/actors/hyrax/actors/newspaper_article_actor.rb +8 -0
  12. data/app/actors/hyrax/actors/newspaper_container_actor.rb +8 -0
  13. data/app/actors/hyrax/actors/newspaper_issue_actor.rb +8 -0
  14. data/app/actors/hyrax/actors/newspaper_page_actor.rb +8 -0
  15. data/app/actors/hyrax/actors/newspaper_title_actor.rb +8 -0
  16. data/app/actors/newspaper_works/actors/newspaper_works_upload_actor.rb +88 -0
  17. data/app/assets/config/newspaper_works_manifest.js +2 -0
  18. data/app/assets/images/newspaper_works/.keep +0 -0
  19. data/app/assets/javascripts/newspaper_works/autocomplete_fix.js +33 -0
  20. data/app/assets/javascripts/newspaper_works/ocr_search.js.erb +6 -0
  21. data/app/assets/javascripts/newspaper_works/thumbnail_highlights.js.erb +102 -0
  22. data/app/assets/javascripts/newspaper_works.js +4 -0
  23. data/app/assets/stylesheets/newspaper_works/_issue_search.scss +13 -0
  24. data/app/assets/stylesheets/newspaper_works/_issues_calendar.scss +18 -0
  25. data/app/assets/stylesheets/newspaper_works/_newspaper_works.scss +4 -0
  26. data/app/assets/stylesheets/newspaper_works/_newspapers_search.scss +38 -0
  27. data/app/assets/stylesheets/newspaper_works/_search_results.scss +12 -0
  28. data/app/controllers/hyrax/newspaper_articles_controller.rb +14 -0
  29. data/app/controllers/hyrax/newspaper_containers_controller.rb +14 -0
  30. data/app/controllers/hyrax/newspaper_issues_controller.rb +14 -0
  31. data/app/controllers/hyrax/newspaper_pages_controller.rb +14 -0
  32. data/app/controllers/hyrax/newspaper_titles_controller.rb +13 -0
  33. data/app/controllers/newspaper_works/newspapers_controller.rb +117 -0
  34. data/app/controllers/newspaper_works/newspapers_search_controller.rb +26 -0
  35. data/app/forms/hyrax/newspaper_article_form.rb +11 -0
  36. data/app/forms/hyrax/newspaper_container_form.rb +11 -0
  37. data/app/forms/hyrax/newspaper_issue_form.rb +11 -0
  38. data/app/forms/hyrax/newspaper_page_form.rb +15 -0
  39. data/app/forms/hyrax/newspaper_title_form.rb +12 -0
  40. data/app/forms/newspaper_works/newspaper_core_form_data.rb +17 -0
  41. data/app/helpers/hyrax/newspaper_articles_helper.rb +5 -0
  42. data/app/helpers/hyrax/newspaper_containers_helper.rb +5 -0
  43. data/app/helpers/hyrax/newspaper_issues_helper.rb +5 -0
  44. data/app/helpers/hyrax/newspaper_pages_helper.rb +5 -0
  45. data/app/helpers/newspaper_works/application_helper.rb +5 -0
  46. data/app/helpers/newspaper_works/breadcrumb_helper.rb +92 -0
  47. data/app/helpers/newspaper_works/newspaper_works_helper_behavior.rb +103 -0
  48. data/app/helpers/newspaper_works/newspapers_helper.rb +5 -0
  49. data/app/indexers/concerns/newspaper_works/indexes_full_text.rb +17 -0
  50. data/app/indexers/concerns/newspaper_works/indexes_place_of_publication.rb +67 -0
  51. data/app/indexers/concerns/newspaper_works/indexes_publication_date_range.rb +35 -0
  52. data/app/indexers/concerns/newspaper_works/indexes_relationships.rb +125 -0
  53. data/app/indexers/newspaper_article_indexer.rb +16 -0
  54. data/app/indexers/newspaper_container_indexer.rb +18 -0
  55. data/app/indexers/newspaper_issue_indexer.rb +26 -0
  56. data/app/indexers/newspaper_page_indexer.rb +9 -0
  57. data/app/indexers/newspaper_title_indexer.rb +19 -0
  58. data/app/indexers/newspaper_works/newspaper_core_indexer.rb +21 -0
  59. data/app/jobs/newspaper_works/application_job.rb +4 -0
  60. data/app/jobs/newspaper_works/compose_issue_pdf_job.rb +13 -0
  61. data/app/jobs/newspaper_works/create_issue_pages_job.rb +19 -0
  62. data/app/mailers/newspaper_works/application_mailer.rb +8 -0
  63. data/app/models/concerns/newspaper_works/blacklight_iiif_search/annotation_behavior.rb +82 -0
  64. data/app/models/concerns/newspaper_works/blacklight_iiif_search/search_behavior.rb +27 -0
  65. data/app/models/concerns/newspaper_works/newspaper_core_metadata.rb +67 -0
  66. data/app/models/concerns/newspaper_works/place_of_publication_behavior.rb +15 -0
  67. data/app/models/concerns/newspaper_works/scanned_media_metadata.rb +43 -0
  68. data/app/models/concerns/newspaper_works/solr/document.rb +25 -0
  69. data/app/models/file_set.rb +10 -0
  70. data/app/models/newspaper_article.rb +158 -0
  71. data/app/models/newspaper_container.rb +86 -0
  72. data/app/models/newspaper_issue.rb +115 -0
  73. data/app/models/newspaper_page.rb +70 -0
  74. data/app/models/newspaper_title.rb +111 -0
  75. data/app/models/newspaper_works/application_record.rb +6 -0
  76. data/app/models/newspaper_works/derivative_attachment.rb +8 -0
  77. data/app/models/newspaper_works/ingest_file_relation.rb +14 -0
  78. data/app/presenters/hyrax/newspaper_article_presenter.rb +38 -0
  79. data/app/presenters/hyrax/newspaper_container_presenter.rb +11 -0
  80. data/app/presenters/hyrax/newspaper_issue_presenter.rb +62 -0
  81. data/app/presenters/hyrax/newspaper_page_presenter.rb +72 -0
  82. data/app/presenters/hyrax/newspaper_title_presenter.rb +86 -0
  83. data/app/presenters/newspaper_works/iiif_manifest_presenter_behavior.rb +29 -0
  84. data/app/presenters/newspaper_works/issue_info_presenter.rb +29 -0
  85. data/app/presenters/newspaper_works/newspaper_core_presenter.rb +9 -0
  86. data/app/presenters/newspaper_works/persistent_url_presenter_behavior.rb +16 -0
  87. data/app/presenters/newspaper_works/place_of_publication_presenter_behavior.rb +8 -0
  88. data/app/presenters/newspaper_works/scanned_media_presenter.rb +7 -0
  89. data/app/presenters/newspaper_works/title_info_presenter.rb +13 -0
  90. data/app/search_builders/concerns/newspaper_works/exclude_models.rb +16 -0
  91. data/app/search_builders/concerns/newspaper_works/highlight_search_params.rb +14 -0
  92. data/app/search_builders/newspaper_works/newspapers_search_builder.rb +26 -0
  93. data/app/services/hyrax/article_genre_service.rb +9 -0
  94. data/app/services/newspaper_works/jp2_derivative_service.rb +120 -0
  95. data/app/services/newspaper_works/newspaper_page_derivative_service.rb +91 -0
  96. data/app/services/newspaper_works/pdf_derivative_service.rb +45 -0
  97. data/app/services/newspaper_works/pluggable_derivative_service.rb +114 -0
  98. data/app/services/newspaper_works/text_extraction_derivative_service.rb +56 -0
  99. data/app/services/newspaper_works/text_formats_from_alto_service.rb +77 -0
  100. data/app/services/newspaper_works/tiff_derivative_service.rb +54 -0
  101. data/app/validators/newspaper_works/publication_date_start_end_validator.rb +48 -0
  102. data/app/validators/newspaper_works/publication_date_validator.rb +16 -0
  103. data/app/views/catalog/_index_gallery_newspaper_article_wrapper.html.erb +9 -0
  104. data/app/views/catalog/_index_gallery_newspaper_page_wrapper.html.erb +9 -0
  105. data/app/views/catalog/_index_header_gallery_newspaper_article.html.erb +23 -0
  106. data/app/views/catalog/_index_header_gallery_newspaper_page.html.erb +23 -0
  107. data/app/views/catalog/_index_header_list_newspaper_article.html.erb +7 -0
  108. data/app/views/catalog/_index_header_list_newspaper_page.html.erb +7 -0
  109. data/app/views/catalog/_snippets_more.html.erb +16 -0
  110. data/app/views/catalog/_thumbnail_list_newspaper_article.html.erb +6 -0
  111. data/app/views/catalog/_thumbnail_list_newspaper_page.html.erb +6 -0
  112. data/app/views/hyrax/file_sets/_actions.html.erb +45 -0
  113. data/app/views/hyrax/newspaper_articles/_newspaper_article.html.erb +2 -0
  114. data/app/views/hyrax/newspaper_articles/show.html.erb +1 -0
  115. data/app/views/hyrax/newspaper_containers/_newspaper_container.html.erb +2 -0
  116. data/app/views/hyrax/newspaper_containers/show.html.erb +1 -0
  117. data/app/views/hyrax/newspaper_issues/_newspaper_issue.html.erb +2 -0
  118. data/app/views/hyrax/newspaper_issues/show.html.erb +1 -0
  119. data/app/views/hyrax/newspaper_pages/_newspaper_page.html.erb +2 -0
  120. data/app/views/hyrax/newspaper_pages/show.html.erb +1 -0
  121. data/app/views/hyrax/newspaper_titles/_all_front_pages_form.html.erb +5 -0
  122. data/app/views/hyrax/newspaper_titles/_issue_search_form.html.erb +33 -0
  123. data/app/views/hyrax/newspaper_titles/_issues_calendar.html.erb +63 -0
  124. data/app/views/hyrax/newspaper_titles/_newspaper_title.html.erb +2 -0
  125. data/app/views/hyrax/newspaper_titles/show.html.erb +54 -0
  126. data/app/views/newspaper_works/base/_attribute_rows.html.erb +42 -0
  127. data/app/views/newspaper_works/base/_attributes.html.erb +16 -0
  128. data/app/views/newspaper_works/base/_metadata.html.erb +6 -0
  129. data/app/views/newspaper_works/base/_newspaper_hierarchy.html.erb +14 -0
  130. data/app/views/newspaper_works/base/_persistent_url.html.erb +1 -0
  131. data/app/views/newspaper_works/base/_show.html.erb +45 -0
  132. data/app/views/newspaper_works/newspapers_search/_date_fields.html.erb +29 -0
  133. data/app/views/newspaper_works/newspapers_search/_facet_layout.html.erb +8 -0
  134. data/app/views/newspaper_works/newspapers_search/_facet_limit.html.erb +17 -0
  135. data/app/views/newspaper_works/newspapers_search/_front_pages_input.html.erb +5 -0
  136. data/app/views/newspaper_works/newspapers_search/_keyword_input.html.erb +18 -0
  137. data/app/views/newspaper_works/newspapers_search/_newspapers_facets.html.erb +5 -0
  138. data/app/views/newspaper_works/newspapers_search/_newspapers_search_form.html.erb +13 -0
  139. data/app/views/newspaper_works/newspapers_search/_newspapers_search_help.html.erb +8 -0
  140. data/app/views/newspaper_works/newspapers_search/search.html.erb +13 -0
  141. data/app/views/records/edit_fields/_alternate_title.html.erb +4 -0
  142. data/app/views/records/edit_fields/_genre.html.erb +4 -0
  143. data/app/views/records/edit_fields/_place_of_publication.html.erb +14 -0
  144. data/app/views/records/edit_fields/_subtitle.html.erb +4 -0
  145. data/bin/rails +13 -0
  146. data/config/fcrepo_wrapper_test.yml +5 -0
  147. data/config/initializers/assets.rb +2 -0
  148. data/config/locales/newspaper_article.de.yml +12 -0
  149. data/config/locales/newspaper_article.en.yml +12 -0
  150. data/config/locales/newspaper_article.es.yml +12 -0
  151. data/config/locales/newspaper_article.fr.yml +12 -0
  152. data/config/locales/newspaper_article.it.yml +12 -0
  153. data/config/locales/newspaper_article.pt-BR.yml +12 -0
  154. data/config/locales/newspaper_article.zh.yml +12 -0
  155. data/config/locales/newspaper_container.de.yml +8 -0
  156. data/config/locales/newspaper_container.en.yml +8 -0
  157. data/config/locales/newspaper_container.es.yml +8 -0
  158. data/config/locales/newspaper_container.fr.yml +8 -0
  159. data/config/locales/newspaper_container.it.yml +8 -0
  160. data/config/locales/newspaper_container.pt-BR.yml +8 -0
  161. data/config/locales/newspaper_container.zh.yml +8 -0
  162. data/config/locales/newspaper_issue.de.yml +8 -0
  163. data/config/locales/newspaper_issue.en.yml +8 -0
  164. data/config/locales/newspaper_issue.es.yml +8 -0
  165. data/config/locales/newspaper_issue.fr.yml +8 -0
  166. data/config/locales/newspaper_issue.it.yml +8 -0
  167. data/config/locales/newspaper_issue.pt-BR.yml +8 -0
  168. data/config/locales/newspaper_issue.zh.yml +8 -0
  169. data/config/locales/newspaper_page.de.yml +15 -0
  170. data/config/locales/newspaper_page.en.yml +15 -0
  171. data/config/locales/newspaper_page.es.yml +15 -0
  172. data/config/locales/newspaper_page.fr.yml +15 -0
  173. data/config/locales/newspaper_page.it.yml +15 -0
  174. data/config/locales/newspaper_page.pt-BR.yml +15 -0
  175. data/config/locales/newspaper_page.zh.yml +15 -0
  176. data/config/locales/newspaper_title.de.yml +8 -0
  177. data/config/locales/newspaper_title.en.yml +8 -0
  178. data/config/locales/newspaper_title.es.yml +8 -0
  179. data/config/locales/newspaper_title.fr.yml +8 -0
  180. data/config/locales/newspaper_title.it.yml +8 -0
  181. data/config/locales/newspaper_title.pt-BR.yml +8 -0
  182. data/config/locales/newspaper_title.zh.yml +8 -0
  183. data/config/locales/newspaper_works.de.yml +50 -0
  184. data/config/locales/newspaper_works.en.yml +52 -0
  185. data/config/locales/newspaper_works.es.yml +52 -0
  186. data/config/locales/newspaper_works.fr.yml +52 -0
  187. data/config/locales/newspaper_works.it.yml +52 -0
  188. data/config/locales/newspaper_works.pt-BR.yml +52 -0
  189. data/config/locales/newspaper_works.zh.yml +52 -0
  190. data/config/routes.rb +9 -0
  191. data/config/solr_wrapper_test.yml +9 -0
  192. data/config/test-fixture/solr-config/_rest_managed.json +3 -0
  193. data/config/test-fixture/solr-config/admin-extra.html +31 -0
  194. data/config/test-fixture/solr-config/elevate.xml +36 -0
  195. data/config/test-fixture/solr-config/mapping-ISOLatin1Accent.txt +246 -0
  196. data/config/test-fixture/solr-config/protwords.txt +21 -0
  197. data/config/test-fixture/solr-config/schema.xml +366 -0
  198. data/config/test-fixture/solr-config/scripts.conf +24 -0
  199. data/config/test-fixture/solr-config/solrconfig.xml +322 -0
  200. data/config/test-fixture/solr-config/spellings.txt +2 -0
  201. data/config/test-fixture/solr-config/stopwords.txt +58 -0
  202. data/config/test-fixture/solr-config/stopwords_en.txt +58 -0
  203. data/config/test-fixture/solr-config/synonyms.txt +31 -0
  204. data/config/test-fixture/solr-config/xslt/example.xsl +132 -0
  205. data/config/test-fixture/solr-config/xslt/example_atom.xsl +67 -0
  206. data/config/test-fixture/solr-config/xslt/example_rss.xsl +66 -0
  207. data/config/test-fixture/solr-config/xslt/luke.xsl +337 -0
  208. data/config/vendor/imagemagick-6-policy.xml +76 -0
  209. data/db/migrate/20181214181358_create_newspaper_works_derivative_attachments.rb +12 -0
  210. data/db/migrate/20190107165909_create_newspaper_works_ingest_file_relations.rb +11 -0
  211. data/lib/generators/newspaper_works/assets_generator.rb +29 -0
  212. data/lib/generators/newspaper_works/blacklight_advanced_search_generator.rb +44 -0
  213. data/lib/generators/newspaper_works/blacklight_iiif_search_generator.rb +41 -0
  214. data/lib/generators/newspaper_works/catalog_controller_generator.rb +60 -0
  215. data/lib/generators/newspaper_works/install_generator.rb +97 -0
  216. data/lib/generators/newspaper_works/templates/annotation_behavior.rb +6 -0
  217. data/lib/generators/newspaper_works/templates/config/authorities/newspaper_article_genres.yml +86 -0
  218. data/lib/generators/newspaper_works/templates/config/initializers/newspaper_works.rb +12 -0
  219. data/lib/generators/newspaper_works/templates/config/initializers/patch_blacklight_advanced_search.rb +74 -0
  220. data/lib/generators/newspaper_works/templates/custom_search_builder.rb +23 -0
  221. data/lib/generators/newspaper_works/templates/newspaper_works.scss +1 -0
  222. data/lib/generators/newspaper_works/templates/newspaper_works_helper.rb +3 -0
  223. data/lib/generators/newspaper_works/templates/search_behavior.rb +6 -0
  224. data/lib/newspaper_works/configuration.rb +14 -0
  225. data/lib/newspaper_works/data/fileset_helper.rb +25 -0
  226. data/lib/newspaper_works/data/path_helper.rb +40 -0
  227. data/lib/newspaper_works/data/work_derivatives.rb +314 -0
  228. data/lib/newspaper_works/data/work_file.rb +92 -0
  229. data/lib/newspaper_works/data/work_files.rb +181 -0
  230. data/lib/newspaper_works/data.rb +35 -0
  231. data/lib/newspaper_works/engine.rb +42 -0
  232. data/lib/newspaper_works/errors.rb +14 -0
  233. data/lib/newspaper_works/ingest/base_ingest.rb +69 -0
  234. data/lib/newspaper_works/ingest/base_publication_info.rb +35 -0
  235. data/lib/newspaper_works/ingest/batch_ingest_helper.rb +44 -0
  236. data/lib/newspaper_works/ingest/batch_issue_ingester.rb +129 -0
  237. data/lib/newspaper_works/ingest/chronam_publication_info.rb +133 -0
  238. data/lib/newspaper_works/ingest/from_command.rb +52 -0
  239. data/lib/newspaper_works/ingest/image_ingest_issues.rb +43 -0
  240. data/lib/newspaper_works/ingest/issue_images.rb +51 -0
  241. data/lib/newspaper_works/ingest/lc_publication_info.rb +144 -0
  242. data/lib/newspaper_works/ingest/named_issue_metadata.rb +60 -0
  243. data/lib/newspaper_works/ingest/ndnp/batch_ingester.rb +64 -0
  244. data/lib/newspaper_works/ingest/ndnp/batch_xml_ingest.rb +72 -0
  245. data/lib/newspaper_works/ingest/ndnp/container_ingest.rb +99 -0
  246. data/lib/newspaper_works/ingest/ndnp/container_ingester.rb +84 -0
  247. data/lib/newspaper_works/ingest/ndnp/container_metadata.rb +87 -0
  248. data/lib/newspaper_works/ingest/ndnp/issue_ingest.rb +81 -0
  249. data/lib/newspaper_works/ingest/ndnp/issue_ingester.rb +101 -0
  250. data/lib/newspaper_works/ingest/ndnp/issue_metadata.rb +96 -0
  251. data/lib/newspaper_works/ingest/ndnp/ndnp_asset_helper.rb +20 -0
  252. data/lib/newspaper_works/ingest/ndnp/ndnp_mets_helper.rb +70 -0
  253. data/lib/newspaper_works/ingest/ndnp/page_ingest.rb +47 -0
  254. data/lib/newspaper_works/ingest/ndnp/page_ingester.rb +157 -0
  255. data/lib/newspaper_works/ingest/ndnp/page_metadata.rb +112 -0
  256. data/lib/newspaper_works/ingest/ndnp.rb +21 -0
  257. data/lib/newspaper_works/ingest/newspaper_issue_ingest.rb +56 -0
  258. data/lib/newspaper_works/ingest/newspaper_page_ingest.rb +6 -0
  259. data/lib/newspaper_works/ingest/page_image.rb +52 -0
  260. data/lib/newspaper_works/ingest/path_enumeration.rb +52 -0
  261. data/lib/newspaper_works/ingest/pdf_images.rb +85 -0
  262. data/lib/newspaper_works/ingest/pdf_issue.rb +20 -0
  263. data/lib/newspaper_works/ingest/pdf_issues.rb +39 -0
  264. data/lib/newspaper_works/ingest/pdf_pages.rb +114 -0
  265. data/lib/newspaper_works/ingest/pub_finder.rb +89 -0
  266. data/lib/newspaper_works/ingest/publication_info.rb +44 -0
  267. data/lib/newspaper_works/ingest.rb +90 -0
  268. data/lib/newspaper_works/issue_pdf_composer.rb +111 -0
  269. data/lib/newspaper_works/logging.rb +54 -0
  270. data/lib/newspaper_works/page_finder.rb +62 -0
  271. data/lib/newspaper_works/resource_fetcher.rb +78 -0
  272. data/lib/newspaper_works/text_extraction/alto_reader.rb +122 -0
  273. data/lib/newspaper_works/text_extraction/page_ocr.rb +100 -0
  274. data/lib/newspaper_works/text_extraction/render_alto.rb +84 -0
  275. data/lib/newspaper_works/text_extraction/word_coords_builder.rb +30 -0
  276. data/lib/newspaper_works/text_extraction.rb +10 -0
  277. data/lib/newspaper_works/version.rb +3 -0
  278. data/lib/newspaper_works.rb +19 -0
  279. data/lib/tasks/newspaper_works_tasks.rake +39 -0
  280. data/newspaper_works.gemspec +49 -0
  281. data/spec/.keep.txt +1 -0
  282. data/spec/actors/newspaper_works/actors/newspaper_works_upload_actor_spec.rb +69 -0
  283. data/spec/controllers/catalog_controller_spec.rb +63 -0
  284. data/spec/controllers/newspaper_works/newspapers_controller_spec.rb +114 -0
  285. data/spec/controllers/newspaper_works/newspapers_search_controller_spec.rb +21 -0
  286. data/spec/factories/ability.rb +6 -0
  287. data/spec/factories/newspaper_issue.rb +7 -0
  288. data/spec/factories/newspaper_issue_ingest.rb +6 -0
  289. data/spec/factories/newspaper_page.rb +7 -0
  290. data/spec/factories/newspaper_page_ingest.rb +6 -0
  291. data/spec/factories/newspaper_page_solr_document.rb +12 -0
  292. data/spec/factories/newspaper_title.rb +8 -0
  293. data/spec/factories/uploaded_pdf_file.rb +9 -0
  294. data/spec/factories/user.rb +13 -0
  295. data/spec/features/front_pages_for_title_spec.rb +19 -0
  296. data/spec/features/newspaper_title_search_spec.rb +30 -0
  297. data/spec/features/newspapers_search_spec.rb +49 -0
  298. data/spec/features/search_results_thumbnail_highlights_spec.rb +33 -0
  299. data/spec/features_shared.rb +71 -0
  300. data/spec/fixtures/files/4.1.07.jp2 +0 -0
  301. data/spec/fixtures/files/4.1.07.tiff +0 -0
  302. data/spec/fixtures/files/README.md +7 -0
  303. data/spec/fixtures/files/alto-2-0.xsd +714 -0
  304. data/spec/fixtures/files/broken-truncated.pdf +0 -0
  305. data/spec/fixtures/files/credits.md +16 -0
  306. data/spec/fixtures/files/lowres-gray-via-ndnp-sample.tiff +0 -0
  307. data/spec/fixtures/files/minimal-1-page.pdf +0 -0
  308. data/spec/fixtures/files/minimal-2-page.pdf +0 -0
  309. data/spec/fixtures/files/minimal-alto.xml +31 -0
  310. data/spec/fixtures/files/ndnp-alto-sample.xml +24 -0
  311. data/spec/fixtures/files/ndnp-sample1-json.json +1 -0
  312. data/spec/fixtures/files/ndnp-sample1-txt.txt +1 -0
  313. data/spec/fixtures/files/ndnp-sample1.pdf +0 -0
  314. data/spec/fixtures/files/ocr_alto.xml +202 -0
  315. data/spec/fixtures/files/ocr_alto_scaled_4pts_per_px.xml +202 -0
  316. data/spec/fixtures/files/ocr_color.tiff +0 -0
  317. data/spec/fixtures/files/ocr_gray.jp2 +0 -0
  318. data/spec/fixtures/files/ocr_gray.tiff +0 -0
  319. data/spec/fixtures/files/ocr_mono.tiff +0 -0
  320. data/spec/fixtures/files/page1.tiff +0 -0
  321. data/spec/fixtures/files/resource_mocks/chronam/http404-expected +0 -0
  322. data/spec/fixtures/files/resource_mocks/chronam/sn84038814.rdf +1028 -0
  323. data/spec/fixtures/files/resource_mocks/chronam/sn93059126.rdf +36 -0
  324. data/spec/fixtures/files/resource_mocks/chronam/sn94051019.rdf +37 -0
  325. data/spec/fixtures/files/resource_mocks/geonames/Chicopee +1104 -0
  326. data/spec/fixtures/files/resource_mocks/geonames/Denver +1104 -0
  327. data/spec/fixtures/files/resource_mocks/geonames/Marysville +279 -0
  328. data/spec/fixtures/files/resource_mocks/geonames/Marysville2 +279 -0
  329. data/spec/fixtures/files/resource_mocks/geonames/SLC +1104 -0
  330. data/spec/fixtures/files/resource_mocks/lccn/sn2099999999 +1 -0
  331. data/spec/fixtures/files/resource_mocks/lccn/sn82014496 +2 -0
  332. data/spec/fixtures/files/resource_mocks/lccn/sn83020109 +1 -0
  333. data/spec/fixtures/files/resource_mocks/lccn/sn83021453 +2 -0
  334. data/spec/fixtures/files/resource_mocks/lccn/sn83045396 +2 -0
  335. data/spec/fixtures/files/resource_mocks/lccn/sn84038814 +2 -0
  336. data/spec/fixtures/files/resource_mocks/lccn/sn93059126 +1 -0
  337. data/spec/fixtures/files/resource_mocks/lccn/sn94051019 +1 -0
  338. data/spec/fixtures/files/resource_mocks/lccn/sn99999999 +1 -0
  339. data/spec/fixtures/files/resource_mocks/urls.json +82 -0
  340. data/spec/fixtures/files/sample-4page-issue.pdf +0 -0
  341. data/spec/fixtures/files/sample-color-newsletter.pdf +0 -0
  342. data/spec/fixtures/files/thumbnail.jpg +0 -0
  343. data/spec/forms/hyrax/newspaper_article_form_spec.rb +33 -0
  344. data/spec/forms/hyrax/newspaper_container_form_spec.rb +30 -0
  345. data/spec/forms/hyrax/newspaper_issue_form_spec.rb +31 -0
  346. data/spec/forms/hyrax/newspaper_page_form_spec.rb +28 -0
  347. data/spec/forms/hyrax/newspaper_title_form_spec.rb +31 -0
  348. data/spec/forms/newspaper_works/newspaper_core_form_data_spec.rb +12 -0
  349. data/spec/helpers/newspaper_works/breadcrumb_helper_spec.rb +82 -0
  350. data/spec/helpers/newspaper_works_helper_spec.rb +57 -0
  351. data/spec/indexers/concerns/newspaper_works/indexes_full_text_spec.rb +31 -0
  352. data/spec/indexers/concerns/newspaper_works/indexes_place_of_publication_spec.rb +53 -0
  353. data/spec/indexers/concerns/newspaper_works/indexes_publication_date_range_spec.rb +39 -0
  354. data/spec/indexers/concerns/newspaper_works/indexes_relationships_spec.rb +86 -0
  355. data/spec/indexers/newspaper_article_indexer_spec.rb +29 -0
  356. data/spec/indexers/newspaper_issue_indexer_spec.rb +19 -0
  357. data/spec/indexers/newspaper_title_indexer_spec.rb +22 -0
  358. data/spec/indexers/newspaper_works/newspaper_core_indexer_spec.rb +23 -0
  359. data/spec/lib/newspaper_works/configuration_spec.rb +18 -0
  360. data/spec/lib/newspaper_works/data/work_derivatives_spec.rb +245 -0
  361. data/spec/lib/newspaper_works/data/work_file_spec.rb +99 -0
  362. data/spec/lib/newspaper_works/data/work_files_spec.rb +224 -0
  363. data/spec/lib/newspaper_works/ingest/batch_issue_ingester_spec.rb +158 -0
  364. data/spec/lib/newspaper_works/ingest/chronam_publication_info_spec.rb +35 -0
  365. data/spec/lib/newspaper_works/ingest/from_command_spec.rb +75 -0
  366. data/spec/lib/newspaper_works/ingest/image_ingest_issues_spec.rb +62 -0
  367. data/spec/lib/newspaper_works/ingest/ingest_shared.rb +75 -0
  368. data/spec/lib/newspaper_works/ingest/issue_images_spec.rb +65 -0
  369. data/spec/lib/newspaper_works/ingest/lc_publication_info_spec.rb +34 -0
  370. data/spec/lib/newspaper_works/ingest/ndnp/batch_ingester_spec.rb +131 -0
  371. data/spec/lib/newspaper_works/ingest/ndnp/batch_xml_ingest_spec.rb +64 -0
  372. data/spec/lib/newspaper_works/ingest/ndnp/container_ingest_spec.rb +44 -0
  373. data/spec/lib/newspaper_works/ingest/ndnp/container_ingester_spec.rb +126 -0
  374. data/spec/lib/newspaper_works/ingest/ndnp/container_metadata_spec.rb +36 -0
  375. data/spec/lib/newspaper_works/ingest/ndnp/issue_ingest_spec.rb +108 -0
  376. data/spec/lib/newspaper_works/ingest/ndnp/issue_ingester_spec.rb +155 -0
  377. data/spec/lib/newspaper_works/ingest/ndnp/issue_metadata_spec.rb +84 -0
  378. data/spec/lib/newspaper_works/ingest/ndnp/page_ingest_spec.rb +79 -0
  379. data/spec/lib/newspaper_works/ingest/ndnp/page_ingester_spec.rb +184 -0
  380. data/spec/lib/newspaper_works/ingest/ndnp/page_metadata_spec.rb +85 -0
  381. data/spec/lib/newspaper_works/ingest/newspaper_issue_ingest_spec.rb +83 -0
  382. data/spec/lib/newspaper_works/ingest/newspaper_page_ingest_spec.rb +77 -0
  383. data/spec/lib/newspaper_works/ingest/page_image_spec.rb +29 -0
  384. data/spec/lib/newspaper_works/ingest/pdf_images_spec.rb +32 -0
  385. data/spec/lib/newspaper_works/ingest/pdf_issue_spec.rb +29 -0
  386. data/spec/lib/newspaper_works/ingest/pdf_issues_spec.rb +62 -0
  387. data/spec/lib/newspaper_works/ingest/pdf_pages_spec.rb +110 -0
  388. data/spec/lib/newspaper_works/ingest/pub_finder_spec.rb +58 -0
  389. data/spec/lib/newspaper_works/ingest/publication_info_spec.rb +61 -0
  390. data/spec/lib/newspaper_works/ingest_spec.rb +45 -0
  391. data/spec/lib/newspaper_works/issue_pdf_composer_spec.rb +101 -0
  392. data/spec/lib/newspaper_works/logging_spec.rb +53 -0
  393. data/spec/lib/newspaper_works/page_finder_spec.rb +53 -0
  394. data/spec/lib/newspaper_works/resource_fetcher_spec.rb +65 -0
  395. data/spec/lib/newspaper_works/text_extraction/alto_reader_spec.rb +49 -0
  396. data/spec/lib/newspaper_works/text_extraction/page_ocr_spec.rb +84 -0
  397. data/spec/lib/newspaper_works/text_extraction/render_alto_spec.rb +54 -0
  398. data/spec/lib/newspaper_works/text_extraction/word_coords_builder_spec.rb +30 -0
  399. data/spec/lib/tasks/newspaper_works_rake_spec.rb +124 -0
  400. data/spec/misc_shared.rb +109 -0
  401. data/spec/model_shared.rb +134 -0
  402. data/spec/models/concerns/newspaper_works/blacklight_iiif_search/annotation_behavior_spec.rb +45 -0
  403. data/spec/models/concerns/newspaper_works/blacklight_iiif_search/search_behavior_spec.rb +27 -0
  404. data/spec/models/concerns/newspaper_works/newspaper_core_metadata_spec.rb +45 -0
  405. data/spec/models/concerns/newspaper_works/place_of_publication_behavior_spec.rb +17 -0
  406. data/spec/models/concerns/newspaper_works/scanned_media_metadata_spec.rb +35 -0
  407. data/spec/models/newspaper_article_spec.rb +73 -0
  408. data/spec/models/newspaper_container_spec.rb +111 -0
  409. data/spec/models/newspaper_issue_spec.rb +91 -0
  410. data/spec/models/newspaper_page_spec.rb +44 -0
  411. data/spec/models/newspaper_title_spec.rb +116 -0
  412. data/spec/models/newspaper_works/derivative_attachment_spec.rb +37 -0
  413. data/spec/models/newspaper_works/ingest_file_relation_spec.rb +56 -0
  414. data/spec/models/solr_document_spec.rb +14 -0
  415. data/spec/ndnp_shared.rb +48 -0
  416. data/spec/presenters/hyrax/newspaper_article_presenter_spec.rb +53 -0
  417. data/spec/presenters/hyrax/newspaper_container_presenter_spec.rb +20 -0
  418. data/spec/presenters/hyrax/newspaper_issue_presenter_spec.rb +65 -0
  419. data/spec/presenters/hyrax/newspaper_page_presenter_spec.rb +75 -0
  420. data/spec/presenters/hyrax/newspaper_title_presenter_spec.rb +153 -0
  421. data/spec/presenters/newspaper_works/iiif_manifest_presenter_behavior_spec.rb +32 -0
  422. data/spec/presenters/newspaper_works/issue_info_presenter_spec.rb +51 -0
  423. data/spec/presenters/newspaper_works/newspaper_core_presenter_spec.rb +22 -0
  424. data/spec/presenters/newspaper_works/persistent_url_presenter_behavior_spec.rb +24 -0
  425. data/spec/presenters/newspaper_works/place_of_publication_presenter_behavior_spec.rb +17 -0
  426. data/spec/presenters/newspaper_works/scanned_media_presenter_spec.rb +18 -0
  427. data/spec/presenters/newspaper_works/title_info_presenter_spec.rb +23 -0
  428. data/spec/routing/route_spec.rb +52 -0
  429. data/spec/search_builders/custom_search_builder_spec.rb +34 -0
  430. data/spec/search_builders/newspaper_works/newspapers_search_builder_spec.rb +33 -0
  431. data/spec/services/hyrax/article_genre_service_spec.rb +12 -0
  432. data/spec/services/hyrax/resource_types_service_spec.rb +12 -0
  433. data/spec/services/newspaper_works/jp2_derivative_service_spec.rb +62 -0
  434. data/spec/services/newspaper_works/newspaper_page_derivative_service_spec.rb +125 -0
  435. data/spec/services/newspaper_works/pdf_derivative_service_spec.rb +62 -0
  436. data/spec/services/newspaper_works/pluggable_derivative_service_spec.rb +204 -0
  437. data/spec/services/newspaper_works/text_extraction_derivative_service_spec.rb +82 -0
  438. data/spec/services/newspaper_works/text_formats_from_alto_service_spec.rb +129 -0
  439. data/spec/services/newspaper_works/tiff_derivative_service_spec.rb +58 -0
  440. data/spec/spec_helper.rb +261 -0
  441. data/spec/support/controller_level_helpers.rb +28 -0
  442. data/spec/test_app_templates/lib/generators/test_app_generator.rb +22 -0
  443. data/spec/views/catalog/_index_gallery_newspaper_page_wrapper.html.erb_spec.rb +36 -0
  444. data/spec/views/catalog/_index_header_list_newspaper_page.html.erb_spec.rb +26 -0
  445. data/spec/views/catalog/_thumbnail_list_newspaper_page.html.erb_spec.rb +35 -0
  446. data/spec/views/hyrax/newspaper_titles/_all_front_pages_form.html.erb_spec.rb +16 -0
  447. data/spec/views/hyrax/newspaper_titles/_issue_search_form.html.erb_spec.rb +33 -0
  448. data/spec/views/hyrax/newspaper_titles/_issues_calendar.html.erb_spec.rb +37 -0
  449. data/spec/views/hyrax/newspaper_titles/show.html.erb_spec.rb +87 -0
  450. data/spec/views/newspaper_works/base/_attribute_rows.html.erb_spec.rb +60 -0
  451. data/spec/views/newspaper_works/base/_newspaper_hierarchy.html.erb_spec.rb +80 -0
  452. data/spec/views/newspaper_works/base/_show.html.erb_spec.rb +78 -0
  453. data/spec/views/newspaper_works/newspapers_search/search.html.erb_spec.rb +54 -0
  454. data/spec/views/records/edit_fields/_place_of_publication.html.erb_spec.rb +26 -0
  455. data/tasks/newspaperworks_dev.rake +26 -0
  456. data/test/integration/navigation_test.rb +7 -0
  457. data/test/lib/generators/newspaper_works/install_generator_test.rb +16 -0
  458. data/test/newspaper_works_test.rb +7 -0
  459. data/test/test_helper.rb +17 -0
  460. data/tmp/.keep +0 -0
  461. metadata +1037 -0
@@ -0,0 +1,69 @@
1
+ require 'faraday'
2
+ require 'spec_helper'
3
+ require 'misc_shared'
4
+
5
+ RSpec.describe NewspaperWorks::Actors::NewspaperWorksUploadActor, :perform_enqueued do
6
+ include_context 'shared setup'
7
+
8
+ let(:issue) { build(:newspaper_issue) }
9
+ let(:ability) { build(:ability) }
10
+ let(:uploaded_pdf_file) { create(:uploaded_pdf_file) }
11
+ let(:uploaded_file_ids) { [uploaded_pdf_file.id] }
12
+ let(:attributes) { { title: ['foo'], uploaded_files: uploaded_file_ids } }
13
+ let(:terminator) { Hyrax::Actors::Terminator.new }
14
+ # environment with uploads:
15
+ let(:env) { Hyrax::Actors::Environment.new(issue, ability, attributes) }
16
+ # environment with NO uploads:
17
+ let(:edit_env) { Hyrax::Actors::Environment.new(issue, ability, {}) }
18
+ let(:middleware) do
19
+ stack = ActionDispatch::MiddlewareStack.new.tap do |middleware|
20
+ middleware.use described_class
21
+ end
22
+ stack.build(terminator)
23
+ end
24
+
25
+ let(:uploaded_issue) do
26
+ middleware.public_send(:create, env)
27
+ # return work, reloaded, because env.curation_concern will be stale after
28
+ # running actor.
29
+ NewspaperIssue.find(env.curation_concern.id)
30
+ end
31
+
32
+ let(:edited_issue) do
33
+ middleware.public_send(:update, edit_env)
34
+ NewspaperIssue.find(edit_env.curation_concern.id)
35
+ end
36
+
37
+ describe "NewspaperIssue upload of PDF" do
38
+ do_now_jobs = [
39
+ NewspaperWorks::CreateIssuePagesJob,
40
+ IngestLocalFileJob,
41
+ IngestJob
42
+ ]
43
+
44
+ # we over-burden one example, because sadly RSpec does not do well with
45
+ # shared state across examples (without use of `before(:all)` which is
46
+ # mutually exclusive with `let` in practice, and ruffles rubocop's
47
+ # overzealous sense of moral duty, speaking of which:
48
+ it "creates child pages for issue", perform_enqueued: do_now_jobs do
49
+ pages = uploaded_issue.ordered_pages
50
+ expect(pages.size).to eq 2
51
+ page = pages[0]
52
+ # Page needs correct admin set:
53
+ expect(page.admin_set_id).to eq 'admin_set/default'
54
+ file_sets = page.members.select { |v| v.class == FileSet }
55
+ expect(file_sets.size).to eq 1
56
+ files = file_sets[0].files
57
+ url = files[0].uri.to_s
58
+ # fetch the thing from Fedora Commons:
59
+ response = Faraday.get(url)
60
+ stored_size = response.body.length
61
+ expect(stored_size).to be > 0
62
+ # expect that subsequent edits of same issue (run though update
63
+ # method of actor stack) do not duplicate pages (verify by count):
64
+ expect(edited_issue.id).to eq uploaded_issue.id
65
+ pages = edited_issue.ordered_pages
66
+ expect(pages.size).to eq 2 # still the same page count
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,63 @@
1
+ require 'spec_helper'
2
+
3
+ # specs to test that install generators have correctly modified CatalogController
4
+ RSpec.describe CatalogController do
5
+ describe 'NewspaperWorks::InstallGenerator#add_index_fields_to_catalog_controller' do
6
+ subject { described_class.blacklight_config.index_fields }
7
+
8
+ it 'has NewspaperWorks index fields' do
9
+ expect(subject['publication_title_ssi']).not_to be_falsey
10
+ expect(subject['place_of_publication_label_tesim']).not_to be_falsey
11
+ expect(subject['publication_date_dtsi'].class).to eq(Blacklight::Configuration::IndexField)
12
+ end
13
+ end
14
+
15
+ describe 'NewspaperWorks::InstallGenerator#add_facets_to_catalog_controller' do
16
+ subject { described_class.blacklight_config.facet_fields }
17
+
18
+ it 'has NewspaperWorks facet fields' do
19
+ expect(subject['place_of_publication_city_sim']).not_to be_falsey
20
+ expect(subject['publication_title_ssi'].class).to eq(Blacklight::Configuration::FacetField)
21
+ expect(subject['genre_sim'].label).to eq('Article type')
22
+ end
23
+
24
+ it 'has definitions for non-displaying facet fields' do
25
+ expect(subject['place_of_publication_label_sim']).not_to be_falsey
26
+ expect(subject['issn_sim']).not_to be_falsey
27
+ expect(subject['lccn_sim']).not_to be_falsey
28
+ expect(subject['oclcnum_sim']).not_to be_falsey
29
+ expect(subject['held_by_sim']).not_to be_falsey
30
+ expect(subject['author_sim']).not_to be_falsey
31
+ expect(subject['photographer_sim']).not_to be_falsey
32
+ expect(subject['geographic_coverage_sim']).not_to be_falsey
33
+ expect(subject['preceded_by_sim']).not_to be_falsey
34
+ expect(subject['succeeded_by_sim']).not_to be_falsey
35
+ end
36
+ end
37
+
38
+ describe 'NewspaperWorks::InstallGenerator#add_pubdate_sort_to_catalog_controller' do
39
+ subject { described_class.blacklight_config.sort_fields }
40
+
41
+ it 'has NewspaperWorks sort fields' do
42
+ expect(subject['publication_date_dtsi asc'].class).to eq Blacklight::Configuration::SortField
43
+ expect(subject['publication_date_dtsi desc'].field).to eq 'publication_date_dtsi desc'
44
+ end
45
+ end
46
+
47
+ describe 'NewspaperWorks::BlacklightAdvancedSearchGenerator' do
48
+ subject { described_class.blacklight_config }
49
+
50
+ describe '#update_search_builder' do
51
+ it 'sets the default SearchBuilder' do
52
+ expect(subject.search_builder_class).to eq CustomSearchBuilder
53
+ end
54
+ end
55
+
56
+ describe '#add_newspapers_advanced_config' do
57
+ it 'adds the advanced_search[:newspapers_search] config' do
58
+ expect(subject.advanced_search[:newspapers_search]).not_to be_falsey
59
+ expect(subject.advanced_search[:newspapers_search][:form_solr_parameters]['facet.field']).not_to be_blank
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,114 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe NewspaperWorks::NewspapersController do
4
+ pubdate = '2015-03-15'
5
+
6
+ # have to build a set of related objects first, can't use model_shared
7
+ # because we need a unique lccn every time specs are run
8
+ # otherwise query in NewspaperController#find_object returns false
9
+ # use before(:all) so we only create fixtures once
10
+ before(:all) do
11
+ @lccn = "sn#{rand(10_000)}"
12
+
13
+ title = NewspaperTitle.new
14
+ title.title = ["Yesterday's News"]
15
+ title.lccn = @lccn
16
+ title.visibility = 'open'
17
+
18
+ issue = NewspaperIssue.new
19
+ issue.title = ["Yesterday's News: December 7, 1941"]
20
+ issue.publication_date = pubdate
21
+ issue.visibility = 'open'
22
+
23
+ title.members.push issue
24
+
25
+ page1 = NewspaperPage.new
26
+ page1.title = ['Page 1']
27
+ page1.visibility = 'open'
28
+ page2 = NewspaperPage.new
29
+ page2.title = ['Page 2']
30
+ page2.visibility = 'open'
31
+
32
+ issue.ordered_members << page1
33
+ issue.ordered_members << page2
34
+
35
+ issue.save!
36
+ title.save!
37
+ page1.save!
38
+ page2.save!
39
+ end
40
+
41
+ describe 'GET "title"' do
42
+ describe 'with a valid unique_id' do
43
+ it 'renders the page' do
44
+ get :title, params: { unique_id: @lccn }
45
+ expect(response).to be_successful
46
+ expect(response).to render_template('hyrax/newspaper_titles/show')
47
+ end
48
+ end
49
+
50
+ describe 'with an invalid unique_id' do
51
+ it 'returns an error' do
52
+ expect do
53
+ get :title, params: { unique_id: 'foo' }
54
+ end.to raise_error ActionController::RoutingError
55
+ end
56
+ end
57
+ end
58
+
59
+ describe 'GET "issue"' do
60
+ describe 'with a valid date' do
61
+ it 'renders the page' do
62
+ get :issue, params: { unique_id: @lccn, date: pubdate }
63
+ expect(response).to be_successful
64
+ expect(response).to render_template('hyrax/newspaper_issues/show')
65
+ end
66
+ end
67
+
68
+ describe 'with an edition param' do
69
+ it 'renders the page' do
70
+ get :issue, params: { unique_id: @lccn, date: pubdate, edition: 'ed-1' }
71
+ expect(response).to be_successful
72
+ expect(response).to render_template('hyrax/newspaper_issues/show')
73
+ end
74
+ end
75
+
76
+ describe 'with an invalid date' do
77
+ it 'returns an error' do
78
+ expect do
79
+ get :issue, params: { unique_id: @lccn, date: '2015-02-31' }
80
+ end.to raise_error ActionController::RoutingError
81
+ end
82
+ end
83
+ end
84
+
85
+ describe 'GET "page"' do
86
+ describe 'with valid params' do
87
+ it 'renders the page' do
88
+ get :page,
89
+ params: {
90
+ unique_id: @lccn,
91
+ date: pubdate,
92
+ edition: 'ed-1',
93
+ page: 'seq-1'
94
+ }
95
+ expect(response).to be_successful
96
+ expect(response).to render_template('hyrax/newspaper_pages/show')
97
+ end
98
+ end
99
+
100
+ describe 'with invalid page params' do
101
+ it 'returns an error' do
102
+ expect do
103
+ get :page,
104
+ params: {
105
+ unique_id: @lccn,
106
+ date: pubdate,
107
+ edition: 'ed-1',
108
+ page: 'seq-3'
109
+ }
110
+ end.to raise_error ActionController::RoutingError
111
+ end
112
+ end
113
+ end
114
+ end
@@ -0,0 +1,21 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe NewspaperWorks::NewspapersSearchController do
4
+ describe 'GET "search"' do
5
+ before { get :search }
6
+
7
+ it 'renders the page' do
8
+ expect(response).to be_successful
9
+ expect(response).to render_template('newspaper_works/newspapers_search/search')
10
+ end
11
+
12
+ it 'sets the @response' do
13
+ expect(assigns(:response)).to be_a_kind_of(Blacklight::Solr::Response)
14
+ end
15
+ end
16
+
17
+ describe '#search_builder_class' do
18
+ subject { controller.search_builder_class }
19
+ it { is_expected.to eq NewspaperWorks::NewspapersSearchBuilder }
20
+ end
21
+ end
@@ -0,0 +1,6 @@
1
+ FactoryBot.define do
2
+ factory :ability do
3
+ user
4
+ initialize_with { new(user) }
5
+ end
6
+ end
@@ -0,0 +1,7 @@
1
+ # will infer, create a NewspaperIssue object
2
+ FactoryBot.define do
3
+ factory :newspaper_issue do
4
+ title { ['Here and There'] }
5
+ depositor { User.batch_user.user_key }
6
+ end
7
+ end
@@ -0,0 +1,6 @@
1
+ FactoryBot.define do
2
+ factory :newspaper_issue_ingest, class: NewspaperWorks::Ingest::NewspaperIssueIngest do
3
+ newspaper_issue
4
+ initialize_with { new(newspaper_issue) }
5
+ end
6
+ end
@@ -0,0 +1,7 @@
1
+ # will infer, create a NewspaperPage object
2
+ FactoryBot.define do
3
+ factory :newspaper_page do
4
+ title { ['Here and There'] }
5
+ depositor { User.batch_user.user_key }
6
+ end
7
+ end
@@ -0,0 +1,6 @@
1
+ FactoryBot.define do
2
+ factory :newspaper_page_ingest, class: NewspaperWorks::Ingest::NewspaperPageIngest do
3
+ newspaper_page
4
+ initialize_with { new(newspaper_page) }
5
+ end
6
+ end
@@ -0,0 +1,12 @@
1
+ FactoryBot.define do
2
+ factory :newspaper_page_solr_document, class: SolrDocument do
3
+ initialize_with do
4
+ new(id: '123456',
5
+ title_tesim: ['Page 1'],
6
+ has_model_ssim: ['NewspaperPage'],
7
+ issue_id_ssi: 'abc123',
8
+ file_set_ids_ssim: ['7891011'],
9
+ thumbnail_path_ss: '/downloads/123456?file=thumbnail')
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,8 @@
1
+ # will infer, create a NewspaperTitle object
2
+ FactoryBot.define do
3
+ factory :newspaper_title do
4
+ title { ['ACME Press'] }
5
+ lccn { 'sn2036999999' }
6
+ depositor { User.batch_user.user_key }
7
+ end
8
+ end
@@ -0,0 +1,9 @@
1
+ FactoryBot.define do
2
+ factory :uploaded_pdf_file, class: Hyrax::UploadedFile do
3
+ initialize_with do
4
+ base = File.join(NewspaperWorks::GEM_PATH, 'spec', 'fixtures', 'files')
5
+ pdf_path = File.join(base, 'minimal-2-page.pdf')
6
+ new(file: File.open(pdf_path), user: create(:user))
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,13 @@
1
+ FactoryBot.define do
2
+ factory :user do
3
+ id { "skroob" }
4
+ email { "spaceballs@example.com" }
5
+ password { "password_is_12345" }
6
+ initialize_with do
7
+ User.find_or_create_by(id: id) do |user|
8
+ user.email = email
9
+ user.password = password
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+ require 'features_shared'
3
+
4
+ RSpec.describe 'front_pages_for_title' do
5
+ include_context "fixtures_for_features"
6
+
7
+ # @title1 comes from fixtures_for_features
8
+ before do
9
+ visit hyrax_newspaper_title_path(@title1.id)
10
+ click_link('front_pages_search')
11
+ end
12
+
13
+ it 'returns the front pages' do
14
+ within "#search-results" do
15
+ expect(page).to have_content "#{title1_issue1_title_memo}: Page 1"
16
+ expect(page).not_to have_content "#{title1_issue1_title_memo}: Page 2"
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,30 @@
1
+ require 'spec_helper'
2
+ require 'features_shared'
3
+
4
+ RSpec.describe 'newspaper title search' do
5
+ include_context "fixtures_for_features"
6
+
7
+ # @title1 comes from fixtures_for_features
8
+ before do
9
+ visit hyrax_newspaper_title_path(@title1.id)
10
+ fill_in "q_issues", with: title_base_memo
11
+ end
12
+
13
+ it 'returns pages for this title' do
14
+ click_button('issue-search')
15
+ within "#search-results" do
16
+ expect(page).to have_content "#{title1_issue1_title_memo}: Page 1"
17
+ expect(page).to have_content "#{title1_issue1_title_memo}: Page 2"
18
+ expect(page).not_to have_content "#{title2_issue1_title_memo}: Page 1"
19
+ end
20
+ end
21
+
22
+ it 'returns only front pages if checked' do
23
+ check 'f_first_page_bsi_'
24
+ click_button('issue-search')
25
+ within "#search-results" do
26
+ expect(page).to have_content "#{title1_issue1_title_memo}: Page 1"
27
+ expect(page).not_to have_content "#{title1_issue1_title_memo}: Page 2"
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,49 @@
1
+ require 'spec_helper'
2
+ require 'features_shared'
3
+
4
+ RSpec.describe 'newspapers_search' do
5
+ include_context "fixtures_for_features"
6
+
7
+ # title_base_memo comes from fixtures_for_features
8
+ before do
9
+ visit newspaper_works.newspapers_search_path
10
+ fill_in "all_fields", with: title_base_memo
11
+ end
12
+
13
+ it 'returns results for keyword search' do
14
+ click_button('search-submit-newspapers')
15
+ within "#search-results" do
16
+ expect(page).to have_content "#{title1_issue1_title_memo}: Page 1"
17
+ expect(page).to have_content "#{title1_issue1_title_memo}: Page 2"
18
+ expect(page).to have_content "#{title2_issue1_title_memo}: Page 1"
19
+ end
20
+ end
21
+
22
+ it 'returns correct results for keyword search with front page' do
23
+ check 'f_first_page_bsi_'
24
+ click_button('search-submit-newspapers')
25
+ within "#search-results" do
26
+ expect(page).to have_content "#{title2_issue1_title_memo}: Page 1"
27
+ expect(page).not_to have_content "#{title1_issue1_title_memo}: Page 2"
28
+ end
29
+ end
30
+
31
+ it 'returns correct results for keyword search with date' do
32
+ fill_in "date_range_start", with: '1965'
33
+ fill_in "date_range_end", with: '1966'
34
+ click_button('search-submit-newspapers')
35
+ within "#search-results" do
36
+ expect(page).to have_content "#{title1_issue1_title_memo}: Page 1"
37
+ expect(page).not_to have_content "#{title2_issue1_title_memo}: Page 1"
38
+ end
39
+ end
40
+
41
+ it 'returns correct results for keyword search with facet' do
42
+ check 'f_inclusive_language_sim_spanish'
43
+ click_button('search-submit-newspapers')
44
+ within "#search-results" do
45
+ expect(page).to have_content "#{title2_issue1_title_memo}: Page 1"
46
+ expect(page).not_to have_content "#{title1_issue1_title_memo}: Page 1"
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,33 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe 'thumbnail_highlights', js: true do
4
+ fixture_path = File.join(NewspaperWorks::GEM_PATH, 'spec', 'fixtures', 'files')
5
+ let(:query_term) { 'rotunda' }
6
+
7
+ # use before(:all) so we only create fixtures once
8
+ # we use instance var for @work so we can access its id in specs
9
+ before(:all) do
10
+ whitelist = Hyrax.config.whitelisted_ingest_dirs
11
+ whitelist.push(fixture_path) unless whitelist.include?(fixture_path)
12
+
13
+ @work = NewspaperPage.create!(
14
+ title: ['Test Page for Thumbnail Highlights'],
15
+ visibility: "open"
16
+ )
17
+ attachment = NewspaperWorks::Data::WorkFiles.of(@work)
18
+ attachment.assign(File.join(fixture_path, 'page1.tiff'))
19
+ attachment.derivatives.assign(File.join(fixture_path, 'ndnp-sample1-txt.txt'))
20
+ attachment.derivatives.assign(File.join(fixture_path, 'ndnp-sample1-json.json'))
21
+ attachment.commit!
22
+ @work.save!
23
+ end
24
+
25
+ describe 'thumbnail highlighting' do
26
+ it 'adds highlight divs to thumbnail' do
27
+ visit search_catalog_path(q: 'rotunda scarcely')
28
+ within "#document_#{@work.id}" do
29
+ expect(page).to have_selector('.thumbnail_highlight', count: 2)
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,71 @@
1
+ # a set of Title, Issue, and Page objects that can be reused in feature specs
2
+ RSpec.shared_context "fixtures_for_features", shared_context: :metadata do
3
+ # use this so titles are different every time spec is run
4
+ # prevents tests from accidentally failing because search results view only shows 10 results
5
+ # and our newly created fixtures may not show up on first results page
6
+ title_base = 'Mxyzptlk'.chars.shuffle.join
7
+ title1_title = "#{title_base} Examiner"
8
+ title1_issue1_title = "#{title1_title}: July 4, 1965"
9
+ title2_title = "#{title_base} Courier"
10
+ title2_issue1_title = "#{title2_title}: July 4, 1969"
11
+
12
+ # memo-ize these so we can use it in specs
13
+ let!(:title_base_memo) { title_base }
14
+ let!(:title1_issue1_title_memo) { title1_issue1_title }
15
+ let!(:title2_issue1_title_memo) { title2_issue1_title }
16
+
17
+ # we use instance var for @title1 so we can access its id in specs
18
+ # # use before(:all) so we only create fixtures once
19
+ before(:all) do
20
+ @title1 = NewspaperTitle.new
21
+ @title1.title = [title1_title]
22
+ @title1.lccn = 'sn0000000'
23
+ @title1.visibility = 'open'
24
+
25
+ title1_issue1 = NewspaperIssue.new
26
+ title1_issue1.title = [title1_issue1_title]
27
+ title1_issue1.resource_type = ["newspaper"]
28
+ title1_issue1.language = ["English"]
29
+ title1_issue1.held_by = "Marriott Library"
30
+ title1_issue1.publication_date = '1965-07-04'
31
+ title1_issue1.visibility = 'open'
32
+ @title1.members << title1_issue1
33
+
34
+ title1_issue1_page1 = NewspaperPage.new
35
+ title1_issue1_page1.title = ["#{title1_issue1_title}: Page 1"]
36
+ title1_issue1_page1.visibility = 'open'
37
+ title1_issue1_page2 = NewspaperPage.new
38
+ title1_issue1_page2.title = ["#{title1_issue1_title}: Page 2"]
39
+ title1_issue1_page2.visibility = 'open'
40
+ title1_issue1.ordered_members << title1_issue1_page1
41
+ title1_issue1.ordered_members << title1_issue1_page2
42
+
43
+ title1_issue1.save
44
+ @title1.save
45
+ title1_issue1_page1.save
46
+ title1_issue1_page2.save
47
+
48
+ title2 = NewspaperTitle.new
49
+ title2.title = [title2_title]
50
+ title2.lccn = 'sn1111111'
51
+ title2.visibility = 'open'
52
+
53
+ title2_issue1 = NewspaperIssue.new
54
+ title2_issue1.title = [title2_issue1_title]
55
+ title2_issue1.resource_type = ["newspaper"]
56
+ title2_issue1.language = ["Spanish"]
57
+ title2_issue1.held_by = "Boston Public Library"
58
+ title2_issue1.publication_date = '1969-07-04'
59
+ title2_issue1.visibility = 'open'
60
+ title2.members << title2_issue1
61
+
62
+ title2_issue1_page1 = NewspaperPage.new
63
+ title2_issue1_page1.title = ["#{title2_issue1_title}: Page 1"]
64
+ title2_issue1_page1.visibility = 'open'
65
+ title2_issue1.ordered_members << title2_issue1_page1
66
+
67
+ title2_issue1.save
68
+ title2.save
69
+ title2_issue1_page1.save
70
+ end
71
+ end
Binary file
Binary file
@@ -0,0 +1,7 @@
1
+ ## Sample / fixture file manifest
2
+
3
+ * sample-4page-issue.pdf
4
+ - original: chicopee-weekly-journal_1856-05-24-p1.pdf
5
+ * page1.tiff
6
+ - first page from sample-4page-issue.pdf, converted to CCITT Group 4
7
+ encoded (lossless compressed) TIFF via Ghostscript.