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,13 @@
1
+ module NewspaperWorks
2
+ # Compose and attach a multi-page PDF from constituent pages, if ready
3
+ # (if not ready, job retry requires Rails >= 5.1)
4
+ class ComposeIssuePDFJob < NewspaperWorks::ApplicationJob
5
+ retry_on NewspaperWorks::PagesNotReady,
6
+ wait: :exponentially_longer,
7
+ attempts: 8
8
+
9
+ def perform(issue)
10
+ NewspaperWorks::IssuePDFComposer.new(issue).compose
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,19 @@
1
+ module NewspaperWorks
2
+ # Create child page works for issue
3
+ class CreateIssuePagesJob < NewspaperWorks::ApplicationJob
4
+ def perform(work, pdf_paths, user, admin_set_id)
5
+ # we will need depositor set on work, if it is nil
6
+ work.depositor ||= user
7
+ # if we do not have admin_set_id yet, set it on the issue work:
8
+ work.admin_set_id ||= admin_set_id
9
+ # create child pages for each page within each PDF uploaded:
10
+ pdf_paths.each do |path|
11
+ adapter = NewspaperWorks::Ingest::NewspaperIssueIngest.new(work)
12
+ adapter.load(path)
13
+ adapter.create_child_pages
14
+ end
15
+ # re-save pages so that parent and sibling relationships are indexed
16
+ work.pages.each(&:save)
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,8 @@
1
+ # Application Mailer
2
+ module NewspaperWorks
3
+ # Application Mailer Class
4
+ class ApplicationMailer < ActionMailer::Base
5
+ default from: 'from@example.com'
6
+ layout 'mailer'
7
+ end
8
+ end
@@ -0,0 +1,82 @@
1
+ # customize behavior for IiifSearch
2
+ module NewspaperWorks
3
+ module BlacklightIiifSearch
4
+ module AnnotationBehavior
5
+ ##
6
+ # Create a URL for the annotation
7
+ # use a Hyrax-y URL syntax:
8
+ # protocol://host:port/concern/model_type/work_id/manifest/canvas/file_set_id/annotation/index
9
+ # @return [String]
10
+ def annotation_id
11
+ "#{base_url}/manifest/canvas/#{file_set_id}/annotation/#{hl_index}"
12
+ end
13
+
14
+ ##
15
+ # Create a URL for the canvas that the annotation refers to
16
+ # match the Hyrax default canvas URL syntax:
17
+ # protocol://host:port/concern/model_type/work_id/manifest/canvas/file_set_id
18
+ # @return [String]
19
+ def canvas_uri_for_annotation
20
+ "#{base_url}/manifest/canvas/#{file_set_id}#{coordinates}"
21
+ end
22
+
23
+ private
24
+
25
+ ##
26
+ # return a string like "#xywh=100,100,250,20"
27
+ # corresponding to coordinates of query term on image
28
+ # @return [String]
29
+ def coordinates
30
+ return default_coords if query.blank?
31
+ coords_json = fetch_and_parse_coords
32
+ return default_coords unless coords_json && coords_json['coords']
33
+ query_terms = query.split(' ').map(&:downcase)
34
+ matches = coords_json['coords'].select do |k, _v|
35
+ k.downcase =~ /(#{query_terms.join('|')})/
36
+ end
37
+ return default_coords if matches.blank?
38
+ coords_array = matches.values.flatten(1)[hl_index]
39
+ return default unless coords_array
40
+ "#xywh=#{coords_array.join(',')}"
41
+ end
42
+
43
+ ##
44
+ # return the JSON word-coordinates file contents
45
+ # @return [JSON]
46
+ def fetch_and_parse_coords
47
+ coords = NewspaperWorks::Data::WorkDerivatives.new(file_set_id).data('json')
48
+ return nil if coords.blank?
49
+ begin
50
+ JSON.parse(coords)
51
+ rescue JSON::ParserError
52
+ nil
53
+ end
54
+ end
55
+
56
+ ##
57
+ # a default set of coordinates
58
+ # @return [String]
59
+ def default_coords
60
+ '#xywh=0,0,0,0'
61
+ end
62
+
63
+ ##
64
+ # the base URL for the Newspaper object
65
+ # use polymorphic_url, since we deal with multiple object types
66
+ # @return [String]
67
+ def base_url
68
+ host = controller.request.base_url
69
+ controller.polymorphic_url(parent_document, host: host, locale: nil)
70
+ end
71
+
72
+ ##
73
+ # return the first file set id
74
+ # @return [String]
75
+ def file_set_id
76
+ file_set_ids = document['file_set_ids_ssim']
77
+ raise "#{self.class}: NO FILE SET ID" if file_set_ids.blank?
78
+ file_set_ids.first
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,27 @@
1
+ # customize behavior for IiifSearch
2
+ module NewspaperWorks
3
+ module BlacklightIiifSearch
4
+ module SearchBehavior
5
+ ##
6
+ # params to limit the search to items that are children of item
7
+ # modified to make search field conditional on parent object class
8
+ # @return [Hash]
9
+ def object_relation_solr_params
10
+ parent_model = parent_document['has_model_ssim'].find do |v|
11
+ v.include?('Newspaper')
12
+ end
13
+ solr_field_for_search = case parent_model
14
+ when 'NewspaperPage'
15
+ 'id'
16
+ when 'NewspaperIssue'
17
+ 'issue_id_ssi'
18
+ when 'NewspaperArticle'
19
+ 'article_ids_ssim'
20
+ else
21
+ iiif_config[:object_relation_field]
22
+ end
23
+ { solr_field_for_search => id }
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,67 @@
1
+ # module comment...
2
+ module NewspaperWorks
3
+ # core metadata for newspaper models
4
+ module NewspaperCoreMetadata
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ # common metadata for Newspaper title, issue, article; fields
9
+ # that are not in ::Hyrax::BasicMetadata are enumerated here.
10
+
11
+ # - Alternative Title
12
+ property(
13
+ :alternative_title,
14
+ predicate: ::RDF::Vocab::DC.alternative,
15
+ multiple: true
16
+ ) do |index|
17
+ index.as :stored_searchable
18
+ end
19
+
20
+ # - Place of Publication
21
+ property(
22
+ :place_of_publication,
23
+ predicate: ::RDF::Vocab::MARCRelators.pup,
24
+ multiple: true,
25
+ class_name: Hyrax::ControlledVocabularies::Location
26
+ ) do |index|
27
+ index.as :stored_searchable
28
+ end
29
+
30
+ # - ISSN
31
+ property(
32
+ :issn,
33
+ predicate: ::RDF::Vocab::Identifiers.issn,
34
+ multiple: false
35
+ ) do |index|
36
+ index.as :stored_searchable, :facetable
37
+ end
38
+
39
+ # - LCCN
40
+ property(
41
+ :lccn,
42
+ predicate: ::RDF::Vocab::Identifiers.lccn,
43
+ multiple: false
44
+ ) do |index|
45
+ index.as :stored_searchable, :facetable
46
+ end
47
+
48
+ # - OCLC Number
49
+ property(
50
+ :oclcnum,
51
+ predicate: ::RDF::Vocab::BIBO.oclcnum,
52
+ multiple: false
53
+ ) do |index|
54
+ index.as :stored_searchable, :facetable
55
+ end
56
+
57
+ # Holding location (held by):
58
+ property(
59
+ :held_by,
60
+ predicate: ::RDF::Vocab::BF2.heldBy,
61
+ multiple: false
62
+ ) do |index|
63
+ index.as :stored_searchable, :facetable
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,15 @@
1
+ # module comment...
2
+ module NewspaperWorks
3
+ # setting this allows us to use GeoNames autocomplete for place_of_publication property
4
+ # needs to be included in models after Hyrax::BasicMetadata
5
+ module PlaceOfPublicationBehavior
6
+ extend ActiveSupport::Concern
7
+
8
+ included do
9
+ self.controlled_properties = [:place_of_publication]
10
+ accepts_nested_attributes_for :place_of_publication,
11
+ reject_if: proc { |attributes| attributes[:id].blank? },
12
+ allow_destroy: true
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,43 @@
1
+ # Scanned Media: Shared Metadata
2
+ module NewspaperWorks
3
+ # scanned media metadata for newspaper models (e.g. page, article images)
4
+ module ScannedMediaMetadata
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ # common descriptive metadata properties for scanned media like pages
9
+ # that do not already have implementation in Hyrax::BasicMetadata
10
+
11
+ # - Label
12
+ # (implemented by Hyrax::Metadata as :title, we omit here)
13
+ # - Text direction
14
+ property(
15
+ :text_direction,
16
+ predicate: ::RDF::Vocab::OA.textDirection,
17
+ multiple: false
18
+ ) do |index|
19
+ index.as :stored_searchable
20
+ end
21
+
22
+ # - Page Number
23
+ property(
24
+ :page_number,
25
+ predicate: ::RDF::Vocab::SCHEMA.pagination,
26
+ multiple: false
27
+ ) do |index|
28
+ index.as :stored_searchable
29
+ end
30
+
31
+ # - Section
32
+ property(
33
+ :section,
34
+ predicate: ::RDF::Vocab::BIBO.section,
35
+ multiple: false
36
+ ) do |index|
37
+ index.as :stored_searchable
38
+ end
39
+
40
+ # - Reel # TBD TODO needs predicate TBD
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,25 @@
1
+ module NewspaperWorks::Solr::Document
2
+ SOLR_NAMES = %w[alternative_title genre place_of_publication
3
+ issn lccn oclcnum held_by text_direction
4
+ page_number section author photographer
5
+ volume issue_number geographic_coverage
6
+ extent publication_date height width
7
+ edition_number edition_name frequency preceded_by
8
+ succeeded_by publication_date_start
9
+ publication_date_end].freeze
10
+
11
+ def method_missing(m, *args, &block)
12
+ super unless SOLR_NAMES.include? m.to_s
13
+ self[Solrizer.solr_name(m.to_s)]
14
+ end
15
+
16
+ def respond_to_missing?(method_name, include_private = false)
17
+ SOLR_NAMES.include?(method_name.to_s) || super
18
+ end
19
+
20
+ # TODO: figure out if there is a cleaner way to get this
21
+ # adding file_set_ids to SOLR_NAMES does not work
22
+ def file_set_ids
23
+ self['file_set_ids_ssim']
24
+ end
25
+ end
@@ -0,0 +1,10 @@
1
+ # ---
2
+ # newspaper_works needs a fileset compatible with and mixing in
3
+ # ::Hyrax::FileSetBehavior, since Hyrax does not define such a class.
4
+ # Typically, this is provided by boilerplate Hyrax generates into an
5
+ # app, but this engine provides a compatible FileSet class for use
6
+ # and instantiaion by its models.
7
+ # ---
8
+ class FileSet < ActiveFedora::Base
9
+ include ::Hyrax::FileSetBehavior
10
+ end
@@ -0,0 +1,158 @@
1
+ # Newspaper Article Cass
2
+ class NewspaperArticle < ActiveFedora::Base
3
+ # WorkBehavior mixes in minimal ::Hyrax::CoreMetadata fields of
4
+ # depositor, title, date_uploaded, and date_modified.
5
+ # https://samvera.github.io/customize-metadata-model.html#core-metadata
6
+ include ::Hyrax::WorkBehavior
7
+ include NewspaperWorks::NewspaperCoreMetadata
8
+ include NewspaperWorks::ScannedMediaMetadata
9
+
10
+ self.indexer = NewspaperArticleIndexer
11
+
12
+ # containment/aggregation:
13
+ self.valid_child_concerns = [NewspaperPage]
14
+
15
+ validates_with NewspaperWorks::PublicationDateValidator
16
+
17
+ # Validation and required fields:
18
+ validates :title, presence: {
19
+ message: 'A newspaper article requires a title.'
20
+ }
21
+
22
+ # TODO: Implement validations
23
+ # validates :resource_type, presence: {
24
+ # message: 'A newspaper article requires a resource type.'
25
+ # }
26
+ # validates :language, presence: {
27
+ # message: 'A newspaper article requires a language.'
28
+ # }
29
+ # validates :held_by, presence: {
30
+ # message: 'A newspaper article requires a holding location.'
31
+ # }
32
+
33
+ # == Type-specific properties ==
34
+
35
+ # TODO: DRY on the indexing of fields, the index block is repetitive...
36
+
37
+ # TODO: Reel #: https://github.com/samvera-labs/uri_selection_wg/issues/2
38
+
39
+ # - Genre
40
+ property(
41
+ :genre,
42
+ predicate: ::RDF::Vocab::EDM.hasType,
43
+ multiple: true
44
+ ) do |index|
45
+ index.as :stored_searchable, :facetable
46
+ end
47
+
48
+ # - Author
49
+ property(
50
+ :author,
51
+ predicate: ::RDF::Vocab::MARCRelators.aut,
52
+ multiple: true
53
+ ) do |index|
54
+ index.as :stored_searchable, :facetable
55
+ end
56
+
57
+ # - Photographer
58
+ property(
59
+ :photographer,
60
+ predicate: ::RDF::Vocab::MARCRelators.pht,
61
+ multiple: true
62
+ ) do |index|
63
+ index.as :stored_searchable, :facetable
64
+ end
65
+
66
+ # - Volume
67
+ property(
68
+ :volume,
69
+ predicate: ::RDF::Vocab::BIBO.volume,
70
+ multiple: false
71
+ ) do |index|
72
+ index.as :stored_searchable
73
+ end
74
+
75
+ # - Edition name
76
+ property(
77
+ :edition_name,
78
+ predicate: ::RDF::Vocab::BF2.editionStatement,
79
+ multiple: false
80
+ ) do |index|
81
+ index.as :stored_searchable
82
+ end
83
+
84
+ # - Edition number / enumeration
85
+ property(
86
+ :edition_number,
87
+ predicate: ::RDF::Vocab::BF2.editionEnumeration,
88
+ multiple: false
89
+ ) do |index|
90
+ index.as :stored_searchable
91
+ end
92
+
93
+ # - Issue
94
+ property(
95
+ :issue_number,
96
+ predicate: ::RDF::Vocab::BIBO.issue,
97
+ multiple: false
98
+ ) do |index|
99
+ index.as :stored_searchable
100
+ end
101
+
102
+ # - Geographic coverage
103
+ property(
104
+ :geographic_coverage,
105
+ predicate: ::RDF::Vocab::DC.spatial,
106
+ multiple: true
107
+ ) do |index|
108
+ index.as :stored_searchable, :facetable
109
+ end
110
+
111
+ # - Extent
112
+ property(
113
+ :extent,
114
+ predicate: ::RDF::Vocab::DC.extent,
115
+ multiple: false
116
+ ) do |index|
117
+ index.as :stored_searchable
118
+ end
119
+
120
+ # - publication date
121
+ property(
122
+ :publication_date,
123
+ predicate: ::RDF::Vocab::DC.issued,
124
+ multiple: false
125
+ ) do |index|
126
+ index.type :date
127
+ index.as :stored_sortable
128
+ end
129
+
130
+ # TODO: Add Reel number: https://github.com/samvera-labs/uri_selection_wg/issues/2
131
+
132
+ # BasicMetadata must be included last
133
+ include ::Hyrax::BasicMetadata
134
+
135
+ # for GeoNames autocomplete lookup
136
+ include NewspaperWorks::PlaceOfPublicationBehavior
137
+
138
+ # relationship methods:
139
+
140
+ def pages
141
+ members.select { |v| v.instance_of?(NewspaperPage) }
142
+ end
143
+
144
+ def issue
145
+ issues = member_of.select { |v| v.instance_of?(NewspaperIssue) }
146
+ issues[0] unless issues.empty?
147
+ end
148
+
149
+ def publication
150
+ issue = self.issue
151
+ issue.publication unless issue.nil?
152
+ end
153
+
154
+ def container
155
+ pages = self.pages
156
+ pages.first.container unless pages.empty?
157
+ end
158
+ end
@@ -0,0 +1,86 @@
1
+ # Newspaper Container
2
+ class NewspaperContainer < ActiveFedora::Base
3
+ # WorkBehavior mixes in minimal ::Hyrax::CoreMetadata fields of
4
+ # depositor, title, date_uploaded, and date_modified.
5
+ # https://samvera.github.io/customize-metadata-model.html#core-metadata
6
+ include ::Hyrax::WorkBehavior
7
+ include NewspaperWorks::NewspaperCoreMetadata
8
+
9
+ self.indexer = NewspaperContainerIndexer
10
+
11
+ # containment/aggregation:
12
+ self.valid_child_concerns = [NewspaperPage]
13
+
14
+ # Validation and required fields:
15
+ validates :title, presence: {
16
+ message: 'A newspaper container requires a title.'
17
+ }
18
+
19
+ validates_with NewspaperWorks::PublicationDateStartEndValidator
20
+
21
+ # TODO: Implement validations
22
+ # validates :resource_type, presence: {
23
+ # message: 'A newspaper article requires a resource type.'
24
+ # }
25
+ # validates :language, presence: {
26
+ # message: 'A newspaper article requires a language.'
27
+ # }
28
+ # validates :held_by, presence: {
29
+ # message: 'A newspaper article requires a holding location.'
30
+ # }
31
+
32
+ # == Type-specific properties ==
33
+
34
+ # TODO: DRY on the indexing of fields, the index block is repetative...
35
+
36
+ # - Type (TODO: make a behavior mixin for common fields)
37
+
38
+ # - Extent
39
+ property(
40
+ :extent,
41
+ predicate: ::RDF::Vocab::DC.extent,
42
+ multiple: false
43
+ ) do |index|
44
+ index.as :stored_searchable
45
+ end
46
+
47
+ # - publication date start
48
+ property(
49
+ :publication_date_start,
50
+ predicate: ::RDF::Vocab::SCHEMA.startDate,
51
+ multiple: false
52
+ ) do |index|
53
+ index.type :date
54
+ index.as :stored_sortable
55
+ end
56
+
57
+ # - publication date end
58
+ property(
59
+ :publication_date_end,
60
+ predicate: ::RDF::Vocab::SCHEMA.endDate,
61
+ multiple: false
62
+ ) do |index|
63
+ index.type :date
64
+ index.as :stored_sortable
65
+ end
66
+
67
+ # TODO: Reel #: https://github.com/samvera-labs/uri_selection_wg/issues/2
68
+ # TODO: Titles on reel
69
+
70
+ # BasicMetadata must be included last
71
+ include ::Hyrax::BasicMetadata
72
+
73
+ # for GeoNames autocomplete lookup
74
+ include NewspaperWorks::PlaceOfPublicationBehavior
75
+
76
+ # relationship methods
77
+
78
+ def publication
79
+ result = member_of.select { |v| v.instance_of?(NewspaperTitle) }
80
+ result[0] unless result.empty?
81
+ end
82
+
83
+ def pages
84
+ members.select { |v| v.instance_of?(NewspaperPage) }
85
+ end
86
+ end
@@ -0,0 +1,115 @@
1
+ # Newspaper Issue
2
+ class NewspaperIssue < ActiveFedora::Base
3
+ # WorkBehavior mixes in minimal ::Hyrax::CoreMetadata fields of
4
+ # depositor, title, date_uploaded, and date_modified.
5
+ # https://samvera.github.io/customize-metadata-model.html#core-metadata
6
+ include ::Hyrax::WorkBehavior
7
+ include NewspaperWorks::NewspaperCoreMetadata
8
+
9
+ self.indexer = NewspaperIssueIndexer
10
+ # Change this to restrict which works can be added as a child.
11
+ # self.valid_child_concerns = []
12
+
13
+ # Validation and required fields:
14
+ validates :title, presence: {
15
+ message: 'Your work must have a title.'
16
+ }
17
+
18
+ validates_with NewspaperWorks::PublicationDateValidator
19
+
20
+ # TODO: Implement validations
21
+ # validates :resource_type, presence: {
22
+ # message: 'A newspaper article requires a resource type.'
23
+ # }
24
+ # validates :language, presence: {
25
+ # message: 'A newspaper article requires a language.'
26
+ # }
27
+ # validates :held_by, presence: {
28
+ # message: 'A newspaper article requires a holding location.'
29
+ # }
30
+
31
+ # TODO: Reel #: https://github.com/samvera-labs/uri_selection_wg/issues/2
32
+
33
+ # - Volume
34
+ property(
35
+ :volume,
36
+ predicate: ::RDF::Vocab::BIBO.volume,
37
+ multiple: false
38
+ ) do |index|
39
+ index.as :stored_searchable
40
+ end
41
+
42
+ # - Edition name
43
+ property(
44
+ :edition_name,
45
+ predicate: ::RDF::Vocab::BF2.editionStatement,
46
+ multiple: false
47
+ ) do |index|
48
+ index.as :stored_searchable
49
+ end
50
+
51
+ # - Edition number / enumeration
52
+ property(
53
+ :edition_number,
54
+ predicate: ::RDF::Vocab::BF2.editionEnumeration,
55
+ multiple: false
56
+ ) do |index|
57
+ index.as :stored_searchable
58
+ end
59
+
60
+ # - Issue
61
+ property(
62
+ :issue_number,
63
+ predicate: ::RDF::Vocab::BIBO.issue,
64
+ multiple: false
65
+ ) do |index|
66
+ index.as :stored_searchable
67
+ end
68
+
69
+ # - Extent
70
+ property(
71
+ :extent,
72
+ predicate: ::RDF::Vocab::DC.extent,
73
+ multiple: false
74
+ ) do |index|
75
+ index.as :stored_searchable
76
+ end
77
+
78
+ # - publication date
79
+ property(
80
+ :publication_date,
81
+ predicate: ::RDF::Vocab::DC.issued,
82
+ multiple: false
83
+ ) do |index|
84
+ index.type :date
85
+ index.as :stored_sortable
86
+ end
87
+
88
+ # BasicMetadata must be included last
89
+ include ::Hyrax::BasicMetadata
90
+
91
+ # for GeoNames autocomplete lookup
92
+ include NewspaperWorks::PlaceOfPublicationBehavior
93
+
94
+ # relationship methods
95
+ def publication
96
+ result = member_of.select { |v| v.instance_of?(NewspaperTitle) }
97
+ result[0] unless result.empty?
98
+ end
99
+
100
+ def articles
101
+ members.select { |v| v.instance_of?(NewspaperArticle) }
102
+ end
103
+
104
+ def pages
105
+ members.select { |v| v.instance_of?(NewspaperPage) }
106
+ end
107
+
108
+ def ordered_pages
109
+ ordered_members.to_a.select { |v| v.instance_of?(NewspaperPage) }
110
+ end
111
+
112
+ def ordered_page_ids
113
+ ordered_pages.map(&:id)
114
+ end
115
+ end