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,134 @@
1
+ # Shared Model
2
+ RSpec.shared_examples 'a persistent work type' do
3
+ let(:work) { described_class.new }
4
+ let(:cls) { described_class }
5
+
6
+ describe 'class membership' do
7
+ it 'has correct instance type' do
8
+ expect(work).to be_an_instance_of(cls)
9
+ end
10
+
11
+ it 'initially has nil id' do
12
+ expect(work.id).to be_nil
13
+ end
14
+ end
15
+
16
+ describe 'object persistence' do
17
+ before do
18
+ work.title = ['San Diego Evening Tribune']
19
+ work.save!
20
+ end
21
+
22
+ it 'has non-nil id after save' do
23
+ expect(work.id).not_to be_nil
24
+ end
25
+
26
+ it 'appears to be persisted in fcrepo' do
27
+ expect(cls.all.map(&:id)).to include(work.id)
28
+ end
29
+
30
+ describe 'deletion' do
31
+ it 'deletes via delete' do
32
+ work.delete
33
+ expect(cls.all.map(&:id)).not_to include(work.id)
34
+ end
35
+ end
36
+ end
37
+ end
38
+
39
+ RSpec.shared_examples 'a PCDM file set' do
40
+ let(:work) { described_class.new }
41
+ let(:cls) { described_class }
42
+
43
+ it 'looks like a fileset by method introspection' do
44
+ expect(work.file_set?).to be true
45
+ end
46
+
47
+ it 'does not look like a work' do
48
+ expect(work.work?).to be false
49
+ end
50
+
51
+ it 'still looks like a PCDM object, though' do
52
+ expect(work.pcdm_object?).to be true
53
+ end
54
+ end
55
+
56
+ RSpec.shared_examples 'a work and PCDM object' do
57
+ let(:work) { described_class.new }
58
+ let(:cls) { described_class }
59
+
60
+ it 'looks like a work' do
61
+ expect(work.work?).to be true
62
+ end
63
+
64
+ it 'also looks like a PCDM object' do
65
+ expect(work.pcdm_object?).to be true
66
+ end
67
+
68
+ it 'does not look like a fileset' do
69
+ expect(work.file_set?).to be false
70
+ end
71
+ end
72
+
73
+ def model_fixtures(target_type)
74
+ # set up graph of related objects, setting membership on aggregating
75
+ # parents via members setter method, per PCDM Profile for Newspapers.
76
+ publication = NewspaperTitle.new
77
+ publication.title = ["Yesterday's News"]
78
+ publication.lccn = 'sn1234567'
79
+ issue1 = NewspaperIssue.new
80
+ issue1.title = ['December 7, 1941']
81
+ issue1.publication_date = '1941-12-07'
82
+ issue1.resource_type = ["newspaper"]
83
+ issue1.language = ["eng"]
84
+ issue1.held_by = "Marriott Library"
85
+ # issue1.save
86
+ publication.members.push issue1
87
+ page1 = NewspaperPage.new
88
+ page1.title = ['Page 1']
89
+ page1.page_number = '1'
90
+ page1.height = "200"
91
+ page1.width = "200"
92
+ page2 = NewspaperPage.new
93
+ page2.title = ['Page 2']
94
+ page2.page_number = '2'
95
+ page2.height = "200"
96
+ page2.width = "200"
97
+ issue1.ordered_members << page1
98
+ issue1.ordered_members << page2
99
+ article1 = NewspaperArticle.new
100
+ article1.title = ['Happening now']
101
+ article2 = NewspaperArticle.new
102
+ article2.title = ['Yesterday Summary']
103
+ # issue aggregates articles
104
+ issue1.members.push(article1, article2)
105
+ # article has pages associated, article aggregates pages:
106
+ article1.members.push(page1)
107
+ # presume article 2 has a jump
108
+ article2.members.push(page1, page2)
109
+ # container for title, has a page
110
+ container = NewspaperContainer.new
111
+ container.title = ['Reel123a']
112
+ publication.members.push(container)
113
+ container.members.push(page1, page2)
114
+
115
+ # save swarm, persist all the things!
116
+ issue1.save!
117
+ container.save!
118
+ publication.save!
119
+ page1.save!
120
+ page2.save!
121
+ article1.save!
122
+ article2.save!
123
+
124
+ # return types appropriate to target class: return correct starting point
125
+ # for the object graph of these fixtures, in the context of their use.
126
+ return publication if target_type == NewspaperTitle
127
+ return issue1 if target_type == NewspaperIssue
128
+ return page1 if target_type == NewspaperPage
129
+ return article2 if target_type == NewspaperArticle
130
+ return container if target_type == NewspaperContainer
131
+
132
+ # return multiple objects as needed for testing
133
+ return [page1, page2] if target_type == :newspaper_pages
134
+ end
@@ -0,0 +1,45 @@
1
+ require 'spec_helper'
2
+ RSpec.describe NewspaperWorks::BlacklightIiifSearch::AnnotationBehavior do
3
+ let(:page_document) { build(:newspaper_page_solr_document) }
4
+ let(:controller) { CatalogController.new }
5
+ let(:coordinates) do
6
+ JSON.parse("{\"coords\":{\"software\":[[2641,4102,512,44]]}}")
7
+ end
8
+ let(:parent_document) do
9
+ SolrDocument.new('id' => page_document[:issue_id_ssi],
10
+ 'has_model_ssim' => ['NewspaperIssue'])
11
+ end
12
+ let(:iiif_search_annotation) do
13
+ BlacklightIiifSearch::IiifSearchAnnotation.new(page_document, 'software',
14
+ 0, nil, controller,
15
+ parent_document)
16
+ end
17
+ let(:test_request) { ActionDispatch::TestRequest.new({}) }
18
+
19
+ before { allow(controller).to receive(:request).and_return(test_request) }
20
+
21
+ describe '#annotation_id' do
22
+ subject { iiif_search_annotation.annotation_id }
23
+ it 'returns a properly formatted URL' do
24
+ expect(subject).to include("#{page_document[:issue_id_ssi]}/manifest/canvas/#{page_document[:file_set_ids_ssim].first}/annotation/0")
25
+ end
26
+ end
27
+
28
+ describe '#canvas_uri_for_annotation' do
29
+ before { allow(iiif_search_annotation).to receive(:fetch_and_parse_coords).and_return(coordinates) }
30
+
31
+ subject { iiif_search_annotation.canvas_uri_for_annotation }
32
+ it 'returns a properly formatted URL' do
33
+ expect(subject).to include("#{page_document[:issue_id_ssi]}/manifest/canvas/#{page_document[:file_set_ids_ssim].first}")
34
+ end
35
+
36
+ describe 'private methods' do
37
+ # test #coordinates based on output of #canvas_uri_for_annotation, which calls it
38
+ describe '#coordinates' do
39
+ it 'gets the expected value from #coordinates' do
40
+ expect(subject).to include("#xywh=2641,4102,512,44")
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,27 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe NewspaperWorks::BlacklightIiifSearch::SearchBehavior do
4
+ let(:parent_id) { 'abc123' }
5
+ let(:search_params) do
6
+ { q: 'foo', solr_document_id: parent_id }
7
+ end
8
+ let(:controller) { CatalogController.new }
9
+ let(:blacklight_config) { controller.blacklight_config }
10
+ let(:parent_document) do
11
+ SolrDocument.new('id' => parent_id,
12
+ 'has_model_ssim' => ['NewspaperIssue'])
13
+ end
14
+ let(:iiif_search) do
15
+ BlacklightIiifSearch::IiifSearch.new(search_params,
16
+ blacklight_config.iiif_search,
17
+ parent_document)
18
+ end
19
+
20
+ describe '#object_relation_solr_params' do
21
+ subject { iiif_search.object_relation_solr_params }
22
+ it 'returns a hash with the correct content' do
23
+ expect(subject.keys).to include('issue_id_ssi')
24
+ expect(subject.values).to include(parent_id)
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,45 @@
1
+ require 'spec_helper'
2
+
3
+ # Core Metadata Spec Tests
4
+ RSpec.describe NewspaperWorks::NewspaperCoreMetadata do
5
+ class NewspaperishWork < ActiveFedora::Base
6
+ include ::Hyrax::WorkBehavior
7
+ include NewspaperWorks::NewspaperCoreMetadata
8
+ include ::Hyrax::BasicMetadata
9
+ end
10
+
11
+ let(:work) { NewspaperishWork.new }
12
+
13
+ it 'creates work using mixin' do
14
+ expect(work).to be_an_instance_of(NewspaperishWork)
15
+ end
16
+
17
+ it 'has expected properties' do
18
+ expect(work).to respond_to(:alternative_title)
19
+ expect(work).to respond_to(:place_of_publication)
20
+ expect(work).to respond_to(:issn)
21
+ expect(work).to respond_to(:lccn)
22
+ expect(work).to respond_to(:oclcnum)
23
+ expect(work).to respond_to(:held_by)
24
+ end
25
+
26
+ it 'uses correct class for place_of_publication' do
27
+ pop_class = work.class.properties['place_of_publication'].class_name
28
+ expect(pop_class).to eq Hyrax::ControlledVocabularies::Location
29
+ end
30
+
31
+ it 'work can set/get properties' do
32
+ issn_value = '0000-1111'
33
+ work.issn = issn_value
34
+ expect(work.issn).to eq issn_value
35
+ end
36
+
37
+ it 'work using mixin saves' do
38
+ work.place_of_publication = ['http://www.geonames.org/5780993/about.rdf']
39
+ work.alternative_title = ['The alt title']
40
+ expect(work.id).to be_nil
41
+ work.save!
42
+ expect(work.id).not_to be_nil
43
+ expect(NewspaperishWork.all.map(&:id)).to include(work.id)
44
+ end
45
+ end
@@ -0,0 +1,17 @@
1
+ require 'spec_helper'
2
+
3
+ # Core Metadata Spec Tests
4
+ RSpec.describe NewspaperWorks::PlaceOfPublicationBehavior do
5
+ class NewspaperishWork < ActiveFedora::Base
6
+ include ::Hyrax::WorkBehavior
7
+ include NewspaperWorks::NewspaperCoreMetadata
8
+ include ::Hyrax::BasicMetadata
9
+ include NewspaperWorks::PlaceOfPublicationBehavior
10
+ end
11
+
12
+ let(:work) { NewspaperishWork.new }
13
+
14
+ it 'has controlled properties' do
15
+ expect(work.controlled_properties).to eq([:place_of_publication])
16
+ end
17
+ end
@@ -0,0 +1,35 @@
1
+ require 'spec_helper'
2
+
3
+ # Scanned Media Metadata Spec Tests
4
+ RSpec.describe NewspaperWorks::ScannedMediaMetadata do
5
+ class ScannedMediaWork < ActiveFedora::Base
6
+ include ::Hyrax::WorkBehavior
7
+ include NewspaperWorks::ScannedMediaMetadata
8
+ include ::Hyrax::BasicMetadata
9
+ end
10
+
11
+ let(:work) { ScannedMediaWork.new }
12
+
13
+ it 'creates work using mixin' do
14
+ expect(work).to be_an_instance_of(ScannedMediaWork)
15
+ end
16
+
17
+ it 'has expected properties' do
18
+ expect(work).to respond_to(:text_direction)
19
+ expect(work).to respond_to(:page_number)
20
+ expect(work).to respond_to(:section)
21
+ end
22
+
23
+ it 'work can set/get properties' do
24
+ work.section = 'foo'
25
+ expect(work.section).to include 'foo'
26
+ end
27
+
28
+ it 'work using mixin saves' do
29
+ work.title = ['label able label']
30
+ expect(work.id).to be_nil
31
+ work.save!
32
+ expect(work.id).not_to be_nil
33
+ expect(ScannedMediaWork.all.map(&:id)).to include(work.id)
34
+ end
35
+ end
@@ -0,0 +1,73 @@
1
+ # Generated via
2
+ # `rails generate hyrax:work NewspaperArticle`
3
+ require 'spec_helper'
4
+ require 'model_shared'
5
+
6
+ RSpec.describe NewspaperArticle do
7
+ before(:all) do
8
+ @fixture = model_fixtures(described_class)
9
+ end
10
+
11
+ # shared behaviors
12
+ it_behaves_like('a work and PCDM object')
13
+ it_behaves_like('a persistent work type')
14
+
15
+ describe 'Metadata properties' do
16
+ it 'has expected properties' do
17
+ expect(@fixture).to respond_to(:author)
18
+ expect(@fixture).to respond_to(:photographer)
19
+ expect(@fixture).to respond_to(:genre)
20
+ expect(@fixture).to respond_to(:volume)
21
+ expect(@fixture).to respond_to(:edition_number)
22
+ expect(@fixture).to respond_to(:edition_name)
23
+ expect(@fixture).to respond_to(:issue_number)
24
+ expect(@fixture).to respond_to(:geographic_coverage)
25
+ expect(@fixture).to respond_to(:extent)
26
+ expect(@fixture).to respond_to(:publication_date)
27
+ end
28
+ end
29
+
30
+ describe 'Relationship methods' do
31
+ it 'has expected test fixture' do
32
+ expect(@fixture).to be_an_instance_of(described_class)
33
+ end
34
+
35
+ it 'can get aggregated pages' do
36
+ pages = @fixture.pages
37
+ expect(pages).to be_an_instance_of(Array)
38
+ expect(pages.length).to be > 0
39
+ pages.each do |e|
40
+ expect(e).to be_an_instance_of(NewspaperPage)
41
+ end
42
+ end
43
+
44
+ it 'can get aggregating issue' do
45
+ issue = @fixture.issue
46
+ expect(issue).to be_an_instance_of(NewspaperIssue)
47
+ end
48
+
49
+ it 'can get publication (transitive)' do
50
+ publication = @fixture.publication
51
+ expect(publication).to be_an_instance_of(NewspaperTitle)
52
+ end
53
+
54
+ it 'can get aggregating container (transitive)' do
55
+ container = @fixture.container
56
+ expect(container).to be_an_instance_of(NewspaperContainer)
57
+ end
58
+ end
59
+
60
+ describe 'publication_date' do
61
+ it "is not valid with bad date format" do
62
+ na = described_class.new(title: ["Breaking News!"],
63
+ publication_date: "06/21/1978")
64
+ expect(na).not_to be_valid
65
+ end
66
+
67
+ it "is valid with proper date format" do
68
+ na = described_class.new(title: ["Breaking News!"],
69
+ publication_date: "1978-06-21")
70
+ expect(na).to be_valid
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,111 @@
1
+ # Generated via
2
+ # `rails generate hyrax:work NewspaperContainer`
3
+ require 'spec_helper'
4
+ require 'model_shared'
5
+
6
+ RSpec.describe NewspaperContainer do
7
+ before(:all) do
8
+ @fixture = model_fixtures(described_class)
9
+ end
10
+
11
+ # shared behaviors
12
+ it_behaves_like('a work and PCDM object')
13
+ it_behaves_like('a persistent work type')
14
+
15
+ describe "Metadata properties" do
16
+ it "has expected properties" do
17
+ expect(@fixture).to respond_to(:extent)
18
+ expect(@fixture).to respond_to(:publication_date_start)
19
+ expect(@fixture).to respond_to(:publication_date_end)
20
+ end
21
+ end
22
+
23
+ describe "Relationship methods" do
24
+ it "has expected test fixture" do
25
+ expect(@fixture).to be_an_instance_of(described_class)
26
+ end
27
+
28
+ it "can get aggregating publication/title" do
29
+ parent = @fixture.publication
30
+ expect(parent).not_to be_nil
31
+ expect(parent).to be_an_instance_of(NewspaperTitle)
32
+ # reciprocity and round-trip
33
+ expect(parent.containers).to include @fixture
34
+ end
35
+
36
+ it "can get aggregated pages" do
37
+ contained_pages = @fixture.pages
38
+ expect(contained_pages).to be_an_instance_of(Array)
39
+ expect(contained_pages.length).to be > 0
40
+ contained_pages.each do |e|
41
+ expect(e).to be_an_instance_of(NewspaperPage)
42
+ end
43
+ end
44
+ end
45
+
46
+ describe 'publication_date_start' do
47
+ it "is not valid with bad date format" do
48
+ nc = described_class.new(title: ["Breaking News!"],
49
+ publication_date_start: "06/21/1978")
50
+ expect(nc).not_to be_valid
51
+ end
52
+
53
+ it "is valid with proper date format" do
54
+ nc = described_class.new(title: ["Breaking News!"],
55
+ publication_date_start: "1978-06-21")
56
+ expect(nc).to be_valid
57
+ end
58
+
59
+ it "is valid with a year" do
60
+ nc = described_class.new(title: ["Breaking News!"],
61
+ publication_date_start: "1978")
62
+ expect(nc).to be_valid
63
+ end
64
+
65
+ it "is valid with a year and month" do
66
+ nc = described_class.new(title: ["Breaking News!"],
67
+ publication_date_start: "1978-06")
68
+ expect(nc).to be_valid
69
+ end
70
+
71
+ it "is not valid with start date after end date" do
72
+ nc = described_class.new(title: ["Breaking News!"],
73
+ publication_date_start: "1978-06-01",
74
+ publication_date_end: "1977-06-01")
75
+ expect(nc).not_to be_valid
76
+ end
77
+
78
+ it "is valid with start date before end date" do
79
+ nc = described_class.new(title: ["Breaking News!"],
80
+ publication_date_start: "1978-06-01",
81
+ publication_date_end: "1979-06-01")
82
+ expect(nc).to be_valid
83
+ end
84
+ end
85
+
86
+ describe 'publication_date_end' do
87
+ it "is not valid with bad date format" do
88
+ nc = described_class.new(title: ["Breaking News!"],
89
+ publication_date_end: "06/21/1978")
90
+ expect(nc).not_to be_valid
91
+ end
92
+
93
+ it "is valid with proper date format" do
94
+ nc = described_class.new(title: ["Breaking News!"],
95
+ publication_date_end: "1978-06-21")
96
+ expect(nc).to be_valid
97
+ end
98
+
99
+ it "is valid with a year" do
100
+ nc = described_class.new(title: ["Breaking News!"],
101
+ publication_date_end: "1978")
102
+ expect(nc).to be_valid
103
+ end
104
+
105
+ it "is valid with a year and month" do
106
+ nc = described_class.new(title: ["Breaking News!"],
107
+ publication_date_end: "1978-06")
108
+ expect(nc).to be_valid
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,91 @@
1
+ # Generated via
2
+ # `rails generate hyrax:work NewspaperIssue`
3
+ require 'spec_helper'
4
+ require 'model_shared'
5
+
6
+ RSpec.describe NewspaperIssue do
7
+ before(:all) do
8
+ @fixture = model_fixtures(described_class)
9
+ end
10
+
11
+ # shared behaviors
12
+ it_behaves_like('a work and PCDM object')
13
+ it_behaves_like('a persistent work type')
14
+
15
+ describe 'Metadata properties' do
16
+ it 'has expected properties' do
17
+ expect(@fixture).to respond_to(:volume)
18
+ expect(@fixture).to respond_to(:edition_number)
19
+ expect(@fixture).to respond_to(:edition_name)
20
+ expect(@fixture).to respond_to(:issue_number)
21
+ expect(@fixture).to respond_to(:extent)
22
+ expect(@fixture).to respond_to(:publication_date)
23
+ end
24
+ end
25
+
26
+ describe 'Relationship methods' do
27
+ it 'has expected test fixture' do
28
+ expect(@fixture).to be_an_instance_of(described_class)
29
+ end
30
+
31
+ it 'can get aggregating publication/title' do
32
+ parent = @fixture.publication
33
+ expect(parent).not_to be_nil
34
+ expect(parent).to be_an_instance_of(NewspaperTitle)
35
+ # reciprocity and round-trip
36
+ expect(parent.issues).to include @fixture
37
+ end
38
+
39
+ it 'can get aggregated pages' do
40
+ contained_pages = @fixture.pages
41
+ expect(contained_pages).to be_an_instance_of(Array)
42
+ expect(contained_pages.length).to be > 0
43
+ contained_pages.each do |e|
44
+ expect(e).to be_an_instance_of(NewspaperPage)
45
+ end
46
+ end
47
+
48
+ it 'can get ordered pages' do
49
+ ordered_pages = @fixture.ordered_pages
50
+ expect(ordered_pages).to be_an_instance_of(Array)
51
+ expect(ordered_pages.length).to be > 0
52
+ ordered_pages.each do |e|
53
+ expect(e).to be_an_instance_of(NewspaperPage)
54
+ end
55
+ # same constituent pages as members:
56
+ expect(@fixture.pages.to_a).to match_array ordered_pages
57
+ end
58
+
59
+ it 'can get ordered page ids' do
60
+ ordered_page_ids = @fixture.ordered_page_ids
61
+ expect(ordered_page_ids).to be_an_instance_of(Array)
62
+ expect(ordered_page_ids.length).to be > 0
63
+ ordered_page_ids.each do |e|
64
+ expect(e).to be_an_instance_of(String)
65
+ end
66
+ end
67
+
68
+ it 'can get aggregated articles' do
69
+ contained_articles = @fixture.articles
70
+ expect(contained_articles).to be_an_instance_of(Array)
71
+ expect(contained_articles.length).to be > 0
72
+ contained_articles.each do |e|
73
+ expect(e).to be_an_instance_of(NewspaperArticle)
74
+ end
75
+ end
76
+ end
77
+
78
+ describe 'publication_date' do
79
+ it "is not valid with bad date format" do
80
+ ni = described_class.new(title: ["Breaking News!"],
81
+ publication_date: "06/21/1978")
82
+ expect(ni).not_to be_valid
83
+ end
84
+
85
+ it "is valid with proper date format" do
86
+ ni = described_class.new(title: ["Breaking News!"],
87
+ publication_date: "1978-06-21")
88
+ expect(ni).to be_valid
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,44 @@
1
+ # Generated via
2
+ # `rails generate hyrax:work NewspaperPage`
3
+ require 'spec_helper'
4
+ require 'model_shared'
5
+
6
+ RSpec.describe NewspaperPage do
7
+ before(:all) do
8
+ @fixture = model_fixtures(described_class)
9
+ end
10
+
11
+ it_behaves_like('a work and PCDM object')
12
+ it_behaves_like('a persistent work type')
13
+
14
+ describe 'Relationship methods' do
15
+ it 'has expected test fixture' do
16
+ expect(@fixture).to be_an_instance_of(described_class)
17
+ end
18
+
19
+ it 'can get aggregating articles for page' do
20
+ articles = @fixture.articles
21
+ expect(articles).to be_an_instance_of(Array)
22
+ expect(articles.length).to be > 0
23
+ articles.each do |e|
24
+ expect(e).to be_an_instance_of(NewspaperArticle)
25
+ end
26
+ end
27
+
28
+ it 'can get aggregating issue for page' do
29
+ issue = @fixture.issue
30
+ expect(issue).to be_an_instance_of(NewspaperIssue)
31
+ end
32
+
33
+ it 'can get aggregating container for page' do
34
+ container = @fixture.container
35
+ expect(container).to be_an_instance_of(NewspaperContainer)
36
+ end
37
+
38
+ it 'can get publication (transitive)' do
39
+ publication = @fixture.publication
40
+ expect(publication).not_to be_nil
41
+ expect(publication).to be_an_instance_of(NewspaperTitle)
42
+ end
43
+ end
44
+ end