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.
- checksums.yaml +7 -0
- data/.fcrepo_wrapper +4 -0
- data/.gitignore +43 -0
- data/.rubocop.yml +143 -0
- data/.solr_wrapper +8 -0
- data/.travis.yml +50 -0
- data/Gemfile +47 -0
- data/LICENSE +203 -0
- data/README.md +159 -0
- data/Rakefile +38 -0
- data/app/actors/hyrax/actors/newspaper_article_actor.rb +8 -0
- data/app/actors/hyrax/actors/newspaper_container_actor.rb +8 -0
- data/app/actors/hyrax/actors/newspaper_issue_actor.rb +8 -0
- data/app/actors/hyrax/actors/newspaper_page_actor.rb +8 -0
- data/app/actors/hyrax/actors/newspaper_title_actor.rb +8 -0
- data/app/actors/newspaper_works/actors/newspaper_works_upload_actor.rb +88 -0
- data/app/assets/config/newspaper_works_manifest.js +2 -0
- data/app/assets/images/newspaper_works/.keep +0 -0
- data/app/assets/javascripts/newspaper_works/autocomplete_fix.js +33 -0
- data/app/assets/javascripts/newspaper_works/ocr_search.js.erb +6 -0
- data/app/assets/javascripts/newspaper_works/thumbnail_highlights.js.erb +102 -0
- data/app/assets/javascripts/newspaper_works.js +4 -0
- data/app/assets/stylesheets/newspaper_works/_issue_search.scss +13 -0
- data/app/assets/stylesheets/newspaper_works/_issues_calendar.scss +18 -0
- data/app/assets/stylesheets/newspaper_works/_newspaper_works.scss +4 -0
- data/app/assets/stylesheets/newspaper_works/_newspapers_search.scss +38 -0
- data/app/assets/stylesheets/newspaper_works/_search_results.scss +12 -0
- data/app/controllers/hyrax/newspaper_articles_controller.rb +14 -0
- data/app/controllers/hyrax/newspaper_containers_controller.rb +14 -0
- data/app/controllers/hyrax/newspaper_issues_controller.rb +14 -0
- data/app/controllers/hyrax/newspaper_pages_controller.rb +14 -0
- data/app/controllers/hyrax/newspaper_titles_controller.rb +13 -0
- data/app/controllers/newspaper_works/newspapers_controller.rb +117 -0
- data/app/controllers/newspaper_works/newspapers_search_controller.rb +26 -0
- data/app/forms/hyrax/newspaper_article_form.rb +11 -0
- data/app/forms/hyrax/newspaper_container_form.rb +11 -0
- data/app/forms/hyrax/newspaper_issue_form.rb +11 -0
- data/app/forms/hyrax/newspaper_page_form.rb +15 -0
- data/app/forms/hyrax/newspaper_title_form.rb +12 -0
- data/app/forms/newspaper_works/newspaper_core_form_data.rb +17 -0
- data/app/helpers/hyrax/newspaper_articles_helper.rb +5 -0
- data/app/helpers/hyrax/newspaper_containers_helper.rb +5 -0
- data/app/helpers/hyrax/newspaper_issues_helper.rb +5 -0
- data/app/helpers/hyrax/newspaper_pages_helper.rb +5 -0
- data/app/helpers/newspaper_works/application_helper.rb +5 -0
- data/app/helpers/newspaper_works/breadcrumb_helper.rb +92 -0
- data/app/helpers/newspaper_works/newspaper_works_helper_behavior.rb +103 -0
- data/app/helpers/newspaper_works/newspapers_helper.rb +5 -0
- data/app/indexers/concerns/newspaper_works/indexes_full_text.rb +17 -0
- data/app/indexers/concerns/newspaper_works/indexes_place_of_publication.rb +67 -0
- data/app/indexers/concerns/newspaper_works/indexes_publication_date_range.rb +35 -0
- data/app/indexers/concerns/newspaper_works/indexes_relationships.rb +125 -0
- data/app/indexers/newspaper_article_indexer.rb +16 -0
- data/app/indexers/newspaper_container_indexer.rb +18 -0
- data/app/indexers/newspaper_issue_indexer.rb +26 -0
- data/app/indexers/newspaper_page_indexer.rb +9 -0
- data/app/indexers/newspaper_title_indexer.rb +19 -0
- data/app/indexers/newspaper_works/newspaper_core_indexer.rb +21 -0
- data/app/jobs/newspaper_works/application_job.rb +4 -0
- data/app/jobs/newspaper_works/compose_issue_pdf_job.rb +13 -0
- data/app/jobs/newspaper_works/create_issue_pages_job.rb +19 -0
- data/app/mailers/newspaper_works/application_mailer.rb +8 -0
- data/app/models/concerns/newspaper_works/blacklight_iiif_search/annotation_behavior.rb +82 -0
- data/app/models/concerns/newspaper_works/blacklight_iiif_search/search_behavior.rb +27 -0
- data/app/models/concerns/newspaper_works/newspaper_core_metadata.rb +67 -0
- data/app/models/concerns/newspaper_works/place_of_publication_behavior.rb +15 -0
- data/app/models/concerns/newspaper_works/scanned_media_metadata.rb +43 -0
- data/app/models/concerns/newspaper_works/solr/document.rb +25 -0
- data/app/models/file_set.rb +10 -0
- data/app/models/newspaper_article.rb +158 -0
- data/app/models/newspaper_container.rb +86 -0
- data/app/models/newspaper_issue.rb +115 -0
- data/app/models/newspaper_page.rb +70 -0
- data/app/models/newspaper_title.rb +111 -0
- data/app/models/newspaper_works/application_record.rb +6 -0
- data/app/models/newspaper_works/derivative_attachment.rb +8 -0
- data/app/models/newspaper_works/ingest_file_relation.rb +14 -0
- data/app/presenters/hyrax/newspaper_article_presenter.rb +38 -0
- data/app/presenters/hyrax/newspaper_container_presenter.rb +11 -0
- data/app/presenters/hyrax/newspaper_issue_presenter.rb +62 -0
- data/app/presenters/hyrax/newspaper_page_presenter.rb +72 -0
- data/app/presenters/hyrax/newspaper_title_presenter.rb +86 -0
- data/app/presenters/newspaper_works/iiif_manifest_presenter_behavior.rb +29 -0
- data/app/presenters/newspaper_works/issue_info_presenter.rb +29 -0
- data/app/presenters/newspaper_works/newspaper_core_presenter.rb +9 -0
- data/app/presenters/newspaper_works/persistent_url_presenter_behavior.rb +16 -0
- data/app/presenters/newspaper_works/place_of_publication_presenter_behavior.rb +8 -0
- data/app/presenters/newspaper_works/scanned_media_presenter.rb +7 -0
- data/app/presenters/newspaper_works/title_info_presenter.rb +13 -0
- data/app/search_builders/concerns/newspaper_works/exclude_models.rb +16 -0
- data/app/search_builders/concerns/newspaper_works/highlight_search_params.rb +14 -0
- data/app/search_builders/newspaper_works/newspapers_search_builder.rb +26 -0
- data/app/services/hyrax/article_genre_service.rb +9 -0
- data/app/services/newspaper_works/jp2_derivative_service.rb +120 -0
- data/app/services/newspaper_works/newspaper_page_derivative_service.rb +91 -0
- data/app/services/newspaper_works/pdf_derivative_service.rb +45 -0
- data/app/services/newspaper_works/pluggable_derivative_service.rb +114 -0
- data/app/services/newspaper_works/text_extraction_derivative_service.rb +56 -0
- data/app/services/newspaper_works/text_formats_from_alto_service.rb +77 -0
- data/app/services/newspaper_works/tiff_derivative_service.rb +54 -0
- data/app/validators/newspaper_works/publication_date_start_end_validator.rb +48 -0
- data/app/validators/newspaper_works/publication_date_validator.rb +16 -0
- data/app/views/catalog/_index_gallery_newspaper_article_wrapper.html.erb +9 -0
- data/app/views/catalog/_index_gallery_newspaper_page_wrapper.html.erb +9 -0
- data/app/views/catalog/_index_header_gallery_newspaper_article.html.erb +23 -0
- data/app/views/catalog/_index_header_gallery_newspaper_page.html.erb +23 -0
- data/app/views/catalog/_index_header_list_newspaper_article.html.erb +7 -0
- data/app/views/catalog/_index_header_list_newspaper_page.html.erb +7 -0
- data/app/views/catalog/_snippets_more.html.erb +16 -0
- data/app/views/catalog/_thumbnail_list_newspaper_article.html.erb +6 -0
- data/app/views/catalog/_thumbnail_list_newspaper_page.html.erb +6 -0
- data/app/views/hyrax/file_sets/_actions.html.erb +45 -0
- data/app/views/hyrax/newspaper_articles/_newspaper_article.html.erb +2 -0
- data/app/views/hyrax/newspaper_articles/show.html.erb +1 -0
- data/app/views/hyrax/newspaper_containers/_newspaper_container.html.erb +2 -0
- data/app/views/hyrax/newspaper_containers/show.html.erb +1 -0
- data/app/views/hyrax/newspaper_issues/_newspaper_issue.html.erb +2 -0
- data/app/views/hyrax/newspaper_issues/show.html.erb +1 -0
- data/app/views/hyrax/newspaper_pages/_newspaper_page.html.erb +2 -0
- data/app/views/hyrax/newspaper_pages/show.html.erb +1 -0
- data/app/views/hyrax/newspaper_titles/_all_front_pages_form.html.erb +5 -0
- data/app/views/hyrax/newspaper_titles/_issue_search_form.html.erb +33 -0
- data/app/views/hyrax/newspaper_titles/_issues_calendar.html.erb +63 -0
- data/app/views/hyrax/newspaper_titles/_newspaper_title.html.erb +2 -0
- data/app/views/hyrax/newspaper_titles/show.html.erb +54 -0
- data/app/views/newspaper_works/base/_attribute_rows.html.erb +42 -0
- data/app/views/newspaper_works/base/_attributes.html.erb +16 -0
- data/app/views/newspaper_works/base/_metadata.html.erb +6 -0
- data/app/views/newspaper_works/base/_newspaper_hierarchy.html.erb +14 -0
- data/app/views/newspaper_works/base/_persistent_url.html.erb +1 -0
- data/app/views/newspaper_works/base/_show.html.erb +45 -0
- data/app/views/newspaper_works/newspapers_search/_date_fields.html.erb +29 -0
- data/app/views/newspaper_works/newspapers_search/_facet_layout.html.erb +8 -0
- data/app/views/newspaper_works/newspapers_search/_facet_limit.html.erb +17 -0
- data/app/views/newspaper_works/newspapers_search/_front_pages_input.html.erb +5 -0
- data/app/views/newspaper_works/newspapers_search/_keyword_input.html.erb +18 -0
- data/app/views/newspaper_works/newspapers_search/_newspapers_facets.html.erb +5 -0
- data/app/views/newspaper_works/newspapers_search/_newspapers_search_form.html.erb +13 -0
- data/app/views/newspaper_works/newspapers_search/_newspapers_search_help.html.erb +8 -0
- data/app/views/newspaper_works/newspapers_search/search.html.erb +13 -0
- data/app/views/records/edit_fields/_alternate_title.html.erb +4 -0
- data/app/views/records/edit_fields/_genre.html.erb +4 -0
- data/app/views/records/edit_fields/_place_of_publication.html.erb +14 -0
- data/app/views/records/edit_fields/_subtitle.html.erb +4 -0
- data/bin/rails +13 -0
- data/config/fcrepo_wrapper_test.yml +5 -0
- data/config/initializers/assets.rb +2 -0
- data/config/locales/newspaper_article.de.yml +12 -0
- data/config/locales/newspaper_article.en.yml +12 -0
- data/config/locales/newspaper_article.es.yml +12 -0
- data/config/locales/newspaper_article.fr.yml +12 -0
- data/config/locales/newspaper_article.it.yml +12 -0
- data/config/locales/newspaper_article.pt-BR.yml +12 -0
- data/config/locales/newspaper_article.zh.yml +12 -0
- data/config/locales/newspaper_container.de.yml +8 -0
- data/config/locales/newspaper_container.en.yml +8 -0
- data/config/locales/newspaper_container.es.yml +8 -0
- data/config/locales/newspaper_container.fr.yml +8 -0
- data/config/locales/newspaper_container.it.yml +8 -0
- data/config/locales/newspaper_container.pt-BR.yml +8 -0
- data/config/locales/newspaper_container.zh.yml +8 -0
- data/config/locales/newspaper_issue.de.yml +8 -0
- data/config/locales/newspaper_issue.en.yml +8 -0
- data/config/locales/newspaper_issue.es.yml +8 -0
- data/config/locales/newspaper_issue.fr.yml +8 -0
- data/config/locales/newspaper_issue.it.yml +8 -0
- data/config/locales/newspaper_issue.pt-BR.yml +8 -0
- data/config/locales/newspaper_issue.zh.yml +8 -0
- data/config/locales/newspaper_page.de.yml +15 -0
- data/config/locales/newspaper_page.en.yml +15 -0
- data/config/locales/newspaper_page.es.yml +15 -0
- data/config/locales/newspaper_page.fr.yml +15 -0
- data/config/locales/newspaper_page.it.yml +15 -0
- data/config/locales/newspaper_page.pt-BR.yml +15 -0
- data/config/locales/newspaper_page.zh.yml +15 -0
- data/config/locales/newspaper_title.de.yml +8 -0
- data/config/locales/newspaper_title.en.yml +8 -0
- data/config/locales/newspaper_title.es.yml +8 -0
- data/config/locales/newspaper_title.fr.yml +8 -0
- data/config/locales/newspaper_title.it.yml +8 -0
- data/config/locales/newspaper_title.pt-BR.yml +8 -0
- data/config/locales/newspaper_title.zh.yml +8 -0
- data/config/locales/newspaper_works.de.yml +50 -0
- data/config/locales/newspaper_works.en.yml +52 -0
- data/config/locales/newspaper_works.es.yml +52 -0
- data/config/locales/newspaper_works.fr.yml +52 -0
- data/config/locales/newspaper_works.it.yml +52 -0
- data/config/locales/newspaper_works.pt-BR.yml +52 -0
- data/config/locales/newspaper_works.zh.yml +52 -0
- data/config/routes.rb +9 -0
- data/config/solr_wrapper_test.yml +9 -0
- data/config/test-fixture/solr-config/_rest_managed.json +3 -0
- data/config/test-fixture/solr-config/admin-extra.html +31 -0
- data/config/test-fixture/solr-config/elevate.xml +36 -0
- data/config/test-fixture/solr-config/mapping-ISOLatin1Accent.txt +246 -0
- data/config/test-fixture/solr-config/protwords.txt +21 -0
- data/config/test-fixture/solr-config/schema.xml +366 -0
- data/config/test-fixture/solr-config/scripts.conf +24 -0
- data/config/test-fixture/solr-config/solrconfig.xml +322 -0
- data/config/test-fixture/solr-config/spellings.txt +2 -0
- data/config/test-fixture/solr-config/stopwords.txt +58 -0
- data/config/test-fixture/solr-config/stopwords_en.txt +58 -0
- data/config/test-fixture/solr-config/synonyms.txt +31 -0
- data/config/test-fixture/solr-config/xslt/example.xsl +132 -0
- data/config/test-fixture/solr-config/xslt/example_atom.xsl +67 -0
- data/config/test-fixture/solr-config/xslt/example_rss.xsl +66 -0
- data/config/test-fixture/solr-config/xslt/luke.xsl +337 -0
- data/config/vendor/imagemagick-6-policy.xml +76 -0
- data/db/migrate/20181214181358_create_newspaper_works_derivative_attachments.rb +12 -0
- data/db/migrate/20190107165909_create_newspaper_works_ingest_file_relations.rb +11 -0
- data/lib/generators/newspaper_works/assets_generator.rb +29 -0
- data/lib/generators/newspaper_works/blacklight_advanced_search_generator.rb +44 -0
- data/lib/generators/newspaper_works/blacklight_iiif_search_generator.rb +41 -0
- data/lib/generators/newspaper_works/catalog_controller_generator.rb +60 -0
- data/lib/generators/newspaper_works/install_generator.rb +97 -0
- data/lib/generators/newspaper_works/templates/annotation_behavior.rb +6 -0
- data/lib/generators/newspaper_works/templates/config/authorities/newspaper_article_genres.yml +86 -0
- data/lib/generators/newspaper_works/templates/config/initializers/newspaper_works.rb +12 -0
- data/lib/generators/newspaper_works/templates/config/initializers/patch_blacklight_advanced_search.rb +74 -0
- data/lib/generators/newspaper_works/templates/custom_search_builder.rb +23 -0
- data/lib/generators/newspaper_works/templates/newspaper_works.scss +1 -0
- data/lib/generators/newspaper_works/templates/newspaper_works_helper.rb +3 -0
- data/lib/generators/newspaper_works/templates/search_behavior.rb +6 -0
- data/lib/newspaper_works/configuration.rb +14 -0
- data/lib/newspaper_works/data/fileset_helper.rb +25 -0
- data/lib/newspaper_works/data/path_helper.rb +40 -0
- data/lib/newspaper_works/data/work_derivatives.rb +314 -0
- data/lib/newspaper_works/data/work_file.rb +92 -0
- data/lib/newspaper_works/data/work_files.rb +181 -0
- data/lib/newspaper_works/data.rb +35 -0
- data/lib/newspaper_works/engine.rb +42 -0
- data/lib/newspaper_works/errors.rb +14 -0
- data/lib/newspaper_works/ingest/base_ingest.rb +69 -0
- data/lib/newspaper_works/ingest/base_publication_info.rb +35 -0
- data/lib/newspaper_works/ingest/batch_ingest_helper.rb +44 -0
- data/lib/newspaper_works/ingest/batch_issue_ingester.rb +129 -0
- data/lib/newspaper_works/ingest/chronam_publication_info.rb +133 -0
- data/lib/newspaper_works/ingest/from_command.rb +52 -0
- data/lib/newspaper_works/ingest/image_ingest_issues.rb +43 -0
- data/lib/newspaper_works/ingest/issue_images.rb +51 -0
- data/lib/newspaper_works/ingest/lc_publication_info.rb +144 -0
- data/lib/newspaper_works/ingest/named_issue_metadata.rb +60 -0
- data/lib/newspaper_works/ingest/ndnp/batch_ingester.rb +64 -0
- data/lib/newspaper_works/ingest/ndnp/batch_xml_ingest.rb +72 -0
- data/lib/newspaper_works/ingest/ndnp/container_ingest.rb +99 -0
- data/lib/newspaper_works/ingest/ndnp/container_ingester.rb +84 -0
- data/lib/newspaper_works/ingest/ndnp/container_metadata.rb +87 -0
- data/lib/newspaper_works/ingest/ndnp/issue_ingest.rb +81 -0
- data/lib/newspaper_works/ingest/ndnp/issue_ingester.rb +101 -0
- data/lib/newspaper_works/ingest/ndnp/issue_metadata.rb +96 -0
- data/lib/newspaper_works/ingest/ndnp/ndnp_asset_helper.rb +20 -0
- data/lib/newspaper_works/ingest/ndnp/ndnp_mets_helper.rb +70 -0
- data/lib/newspaper_works/ingest/ndnp/page_ingest.rb +47 -0
- data/lib/newspaper_works/ingest/ndnp/page_ingester.rb +157 -0
- data/lib/newspaper_works/ingest/ndnp/page_metadata.rb +112 -0
- data/lib/newspaper_works/ingest/ndnp.rb +21 -0
- data/lib/newspaper_works/ingest/newspaper_issue_ingest.rb +56 -0
- data/lib/newspaper_works/ingest/newspaper_page_ingest.rb +6 -0
- data/lib/newspaper_works/ingest/page_image.rb +52 -0
- data/lib/newspaper_works/ingest/path_enumeration.rb +52 -0
- data/lib/newspaper_works/ingest/pdf_images.rb +85 -0
- data/lib/newspaper_works/ingest/pdf_issue.rb +20 -0
- data/lib/newspaper_works/ingest/pdf_issues.rb +39 -0
- data/lib/newspaper_works/ingest/pdf_pages.rb +114 -0
- data/lib/newspaper_works/ingest/pub_finder.rb +89 -0
- data/lib/newspaper_works/ingest/publication_info.rb +44 -0
- data/lib/newspaper_works/ingest.rb +90 -0
- data/lib/newspaper_works/issue_pdf_composer.rb +111 -0
- data/lib/newspaper_works/logging.rb +54 -0
- data/lib/newspaper_works/page_finder.rb +62 -0
- data/lib/newspaper_works/resource_fetcher.rb +78 -0
- data/lib/newspaper_works/text_extraction/alto_reader.rb +122 -0
- data/lib/newspaper_works/text_extraction/page_ocr.rb +100 -0
- data/lib/newspaper_works/text_extraction/render_alto.rb +84 -0
- data/lib/newspaper_works/text_extraction/word_coords_builder.rb +30 -0
- data/lib/newspaper_works/text_extraction.rb +10 -0
- data/lib/newspaper_works/version.rb +3 -0
- data/lib/newspaper_works.rb +19 -0
- data/lib/tasks/newspaper_works_tasks.rake +39 -0
- data/newspaper_works.gemspec +49 -0
- data/spec/.keep.txt +1 -0
- data/spec/actors/newspaper_works/actors/newspaper_works_upload_actor_spec.rb +69 -0
- data/spec/controllers/catalog_controller_spec.rb +63 -0
- data/spec/controllers/newspaper_works/newspapers_controller_spec.rb +114 -0
- data/spec/controllers/newspaper_works/newspapers_search_controller_spec.rb +21 -0
- data/spec/factories/ability.rb +6 -0
- data/spec/factories/newspaper_issue.rb +7 -0
- data/spec/factories/newspaper_issue_ingest.rb +6 -0
- data/spec/factories/newspaper_page.rb +7 -0
- data/spec/factories/newspaper_page_ingest.rb +6 -0
- data/spec/factories/newspaper_page_solr_document.rb +12 -0
- data/spec/factories/newspaper_title.rb +8 -0
- data/spec/factories/uploaded_pdf_file.rb +9 -0
- data/spec/factories/user.rb +13 -0
- data/spec/features/front_pages_for_title_spec.rb +19 -0
- data/spec/features/newspaper_title_search_spec.rb +30 -0
- data/spec/features/newspapers_search_spec.rb +49 -0
- data/spec/features/search_results_thumbnail_highlights_spec.rb +33 -0
- data/spec/features_shared.rb +71 -0
- data/spec/fixtures/files/4.1.07.jp2 +0 -0
- data/spec/fixtures/files/4.1.07.tiff +0 -0
- data/spec/fixtures/files/README.md +7 -0
- data/spec/fixtures/files/alto-2-0.xsd +714 -0
- data/spec/fixtures/files/broken-truncated.pdf +0 -0
- data/spec/fixtures/files/credits.md +16 -0
- data/spec/fixtures/files/lowres-gray-via-ndnp-sample.tiff +0 -0
- data/spec/fixtures/files/minimal-1-page.pdf +0 -0
- data/spec/fixtures/files/minimal-2-page.pdf +0 -0
- data/spec/fixtures/files/minimal-alto.xml +31 -0
- data/spec/fixtures/files/ndnp-alto-sample.xml +24 -0
- data/spec/fixtures/files/ndnp-sample1-json.json +1 -0
- data/spec/fixtures/files/ndnp-sample1-txt.txt +1 -0
- data/spec/fixtures/files/ndnp-sample1.pdf +0 -0
- data/spec/fixtures/files/ocr_alto.xml +202 -0
- data/spec/fixtures/files/ocr_alto_scaled_4pts_per_px.xml +202 -0
- data/spec/fixtures/files/ocr_color.tiff +0 -0
- data/spec/fixtures/files/ocr_gray.jp2 +0 -0
- data/spec/fixtures/files/ocr_gray.tiff +0 -0
- data/spec/fixtures/files/ocr_mono.tiff +0 -0
- data/spec/fixtures/files/page1.tiff +0 -0
- data/spec/fixtures/files/resource_mocks/chronam/http404-expected +0 -0
- data/spec/fixtures/files/resource_mocks/chronam/sn84038814.rdf +1028 -0
- data/spec/fixtures/files/resource_mocks/chronam/sn93059126.rdf +36 -0
- data/spec/fixtures/files/resource_mocks/chronam/sn94051019.rdf +37 -0
- data/spec/fixtures/files/resource_mocks/geonames/Chicopee +1104 -0
- data/spec/fixtures/files/resource_mocks/geonames/Denver +1104 -0
- data/spec/fixtures/files/resource_mocks/geonames/Marysville +279 -0
- data/spec/fixtures/files/resource_mocks/geonames/Marysville2 +279 -0
- data/spec/fixtures/files/resource_mocks/geonames/SLC +1104 -0
- data/spec/fixtures/files/resource_mocks/lccn/sn2099999999 +1 -0
- data/spec/fixtures/files/resource_mocks/lccn/sn82014496 +2 -0
- data/spec/fixtures/files/resource_mocks/lccn/sn83020109 +1 -0
- data/spec/fixtures/files/resource_mocks/lccn/sn83021453 +2 -0
- data/spec/fixtures/files/resource_mocks/lccn/sn83045396 +2 -0
- data/spec/fixtures/files/resource_mocks/lccn/sn84038814 +2 -0
- data/spec/fixtures/files/resource_mocks/lccn/sn93059126 +1 -0
- data/spec/fixtures/files/resource_mocks/lccn/sn94051019 +1 -0
- data/spec/fixtures/files/resource_mocks/lccn/sn99999999 +1 -0
- data/spec/fixtures/files/resource_mocks/urls.json +82 -0
- data/spec/fixtures/files/sample-4page-issue.pdf +0 -0
- data/spec/fixtures/files/sample-color-newsletter.pdf +0 -0
- data/spec/fixtures/files/thumbnail.jpg +0 -0
- data/spec/forms/hyrax/newspaper_article_form_spec.rb +33 -0
- data/spec/forms/hyrax/newspaper_container_form_spec.rb +30 -0
- data/spec/forms/hyrax/newspaper_issue_form_spec.rb +31 -0
- data/spec/forms/hyrax/newspaper_page_form_spec.rb +28 -0
- data/spec/forms/hyrax/newspaper_title_form_spec.rb +31 -0
- data/spec/forms/newspaper_works/newspaper_core_form_data_spec.rb +12 -0
- data/spec/helpers/newspaper_works/breadcrumb_helper_spec.rb +82 -0
- data/spec/helpers/newspaper_works_helper_spec.rb +57 -0
- data/spec/indexers/concerns/newspaper_works/indexes_full_text_spec.rb +31 -0
- data/spec/indexers/concerns/newspaper_works/indexes_place_of_publication_spec.rb +53 -0
- data/spec/indexers/concerns/newspaper_works/indexes_publication_date_range_spec.rb +39 -0
- data/spec/indexers/concerns/newspaper_works/indexes_relationships_spec.rb +86 -0
- data/spec/indexers/newspaper_article_indexer_spec.rb +29 -0
- data/spec/indexers/newspaper_issue_indexer_spec.rb +19 -0
- data/spec/indexers/newspaper_title_indexer_spec.rb +22 -0
- data/spec/indexers/newspaper_works/newspaper_core_indexer_spec.rb +23 -0
- data/spec/lib/newspaper_works/configuration_spec.rb +18 -0
- data/spec/lib/newspaper_works/data/work_derivatives_spec.rb +245 -0
- data/spec/lib/newspaper_works/data/work_file_spec.rb +99 -0
- data/spec/lib/newspaper_works/data/work_files_spec.rb +224 -0
- data/spec/lib/newspaper_works/ingest/batch_issue_ingester_spec.rb +158 -0
- data/spec/lib/newspaper_works/ingest/chronam_publication_info_spec.rb +35 -0
- data/spec/lib/newspaper_works/ingest/from_command_spec.rb +75 -0
- data/spec/lib/newspaper_works/ingest/image_ingest_issues_spec.rb +62 -0
- data/spec/lib/newspaper_works/ingest/ingest_shared.rb +75 -0
- data/spec/lib/newspaper_works/ingest/issue_images_spec.rb +65 -0
- data/spec/lib/newspaper_works/ingest/lc_publication_info_spec.rb +34 -0
- data/spec/lib/newspaper_works/ingest/ndnp/batch_ingester_spec.rb +131 -0
- data/spec/lib/newspaper_works/ingest/ndnp/batch_xml_ingest_spec.rb +64 -0
- data/spec/lib/newspaper_works/ingest/ndnp/container_ingest_spec.rb +44 -0
- data/spec/lib/newspaper_works/ingest/ndnp/container_ingester_spec.rb +126 -0
- data/spec/lib/newspaper_works/ingest/ndnp/container_metadata_spec.rb +36 -0
- data/spec/lib/newspaper_works/ingest/ndnp/issue_ingest_spec.rb +108 -0
- data/spec/lib/newspaper_works/ingest/ndnp/issue_ingester_spec.rb +155 -0
- data/spec/lib/newspaper_works/ingest/ndnp/issue_metadata_spec.rb +84 -0
- data/spec/lib/newspaper_works/ingest/ndnp/page_ingest_spec.rb +79 -0
- data/spec/lib/newspaper_works/ingest/ndnp/page_ingester_spec.rb +184 -0
- data/spec/lib/newspaper_works/ingest/ndnp/page_metadata_spec.rb +85 -0
- data/spec/lib/newspaper_works/ingest/newspaper_issue_ingest_spec.rb +83 -0
- data/spec/lib/newspaper_works/ingest/newspaper_page_ingest_spec.rb +77 -0
- data/spec/lib/newspaper_works/ingest/page_image_spec.rb +29 -0
- data/spec/lib/newspaper_works/ingest/pdf_images_spec.rb +32 -0
- data/spec/lib/newspaper_works/ingest/pdf_issue_spec.rb +29 -0
- data/spec/lib/newspaper_works/ingest/pdf_issues_spec.rb +62 -0
- data/spec/lib/newspaper_works/ingest/pdf_pages_spec.rb +110 -0
- data/spec/lib/newspaper_works/ingest/pub_finder_spec.rb +58 -0
- data/spec/lib/newspaper_works/ingest/publication_info_spec.rb +61 -0
- data/spec/lib/newspaper_works/ingest_spec.rb +45 -0
- data/spec/lib/newspaper_works/issue_pdf_composer_spec.rb +101 -0
- data/spec/lib/newspaper_works/logging_spec.rb +53 -0
- data/spec/lib/newspaper_works/page_finder_spec.rb +53 -0
- data/spec/lib/newspaper_works/resource_fetcher_spec.rb +65 -0
- data/spec/lib/newspaper_works/text_extraction/alto_reader_spec.rb +49 -0
- data/spec/lib/newspaper_works/text_extraction/page_ocr_spec.rb +84 -0
- data/spec/lib/newspaper_works/text_extraction/render_alto_spec.rb +54 -0
- data/spec/lib/newspaper_works/text_extraction/word_coords_builder_spec.rb +30 -0
- data/spec/lib/tasks/newspaper_works_rake_spec.rb +124 -0
- data/spec/misc_shared.rb +109 -0
- data/spec/model_shared.rb +134 -0
- data/spec/models/concerns/newspaper_works/blacklight_iiif_search/annotation_behavior_spec.rb +45 -0
- data/spec/models/concerns/newspaper_works/blacklight_iiif_search/search_behavior_spec.rb +27 -0
- data/spec/models/concerns/newspaper_works/newspaper_core_metadata_spec.rb +45 -0
- data/spec/models/concerns/newspaper_works/place_of_publication_behavior_spec.rb +17 -0
- data/spec/models/concerns/newspaper_works/scanned_media_metadata_spec.rb +35 -0
- data/spec/models/newspaper_article_spec.rb +73 -0
- data/spec/models/newspaper_container_spec.rb +111 -0
- data/spec/models/newspaper_issue_spec.rb +91 -0
- data/spec/models/newspaper_page_spec.rb +44 -0
- data/spec/models/newspaper_title_spec.rb +116 -0
- data/spec/models/newspaper_works/derivative_attachment_spec.rb +37 -0
- data/spec/models/newspaper_works/ingest_file_relation_spec.rb +56 -0
- data/spec/models/solr_document_spec.rb +14 -0
- data/spec/ndnp_shared.rb +48 -0
- data/spec/presenters/hyrax/newspaper_article_presenter_spec.rb +53 -0
- data/spec/presenters/hyrax/newspaper_container_presenter_spec.rb +20 -0
- data/spec/presenters/hyrax/newspaper_issue_presenter_spec.rb +65 -0
- data/spec/presenters/hyrax/newspaper_page_presenter_spec.rb +75 -0
- data/spec/presenters/hyrax/newspaper_title_presenter_spec.rb +153 -0
- data/spec/presenters/newspaper_works/iiif_manifest_presenter_behavior_spec.rb +32 -0
- data/spec/presenters/newspaper_works/issue_info_presenter_spec.rb +51 -0
- data/spec/presenters/newspaper_works/newspaper_core_presenter_spec.rb +22 -0
- data/spec/presenters/newspaper_works/persistent_url_presenter_behavior_spec.rb +24 -0
- data/spec/presenters/newspaper_works/place_of_publication_presenter_behavior_spec.rb +17 -0
- data/spec/presenters/newspaper_works/scanned_media_presenter_spec.rb +18 -0
- data/spec/presenters/newspaper_works/title_info_presenter_spec.rb +23 -0
- data/spec/routing/route_spec.rb +52 -0
- data/spec/search_builders/custom_search_builder_spec.rb +34 -0
- data/spec/search_builders/newspaper_works/newspapers_search_builder_spec.rb +33 -0
- data/spec/services/hyrax/article_genre_service_spec.rb +12 -0
- data/spec/services/hyrax/resource_types_service_spec.rb +12 -0
- data/spec/services/newspaper_works/jp2_derivative_service_spec.rb +62 -0
- data/spec/services/newspaper_works/newspaper_page_derivative_service_spec.rb +125 -0
- data/spec/services/newspaper_works/pdf_derivative_service_spec.rb +62 -0
- data/spec/services/newspaper_works/pluggable_derivative_service_spec.rb +204 -0
- data/spec/services/newspaper_works/text_extraction_derivative_service_spec.rb +82 -0
- data/spec/services/newspaper_works/text_formats_from_alto_service_spec.rb +129 -0
- data/spec/services/newspaper_works/tiff_derivative_service_spec.rb +58 -0
- data/spec/spec_helper.rb +261 -0
- data/spec/support/controller_level_helpers.rb +28 -0
- data/spec/test_app_templates/lib/generators/test_app_generator.rb +22 -0
- data/spec/views/catalog/_index_gallery_newspaper_page_wrapper.html.erb_spec.rb +36 -0
- data/spec/views/catalog/_index_header_list_newspaper_page.html.erb_spec.rb +26 -0
- data/spec/views/catalog/_thumbnail_list_newspaper_page.html.erb_spec.rb +35 -0
- data/spec/views/hyrax/newspaper_titles/_all_front_pages_form.html.erb_spec.rb +16 -0
- data/spec/views/hyrax/newspaper_titles/_issue_search_form.html.erb_spec.rb +33 -0
- data/spec/views/hyrax/newspaper_titles/_issues_calendar.html.erb_spec.rb +37 -0
- data/spec/views/hyrax/newspaper_titles/show.html.erb_spec.rb +87 -0
- data/spec/views/newspaper_works/base/_attribute_rows.html.erb_spec.rb +60 -0
- data/spec/views/newspaper_works/base/_newspaper_hierarchy.html.erb_spec.rb +80 -0
- data/spec/views/newspaper_works/base/_show.html.erb_spec.rb +78 -0
- data/spec/views/newspaper_works/newspapers_search/search.html.erb_spec.rb +54 -0
- data/spec/views/records/edit_fields/_place_of_publication.html.erb_spec.rb +26 -0
- data/tasks/newspaperworks_dev.rake +26 -0
- data/test/integration/navigation_test.rb +7 -0
- data/test/lib/generators/newspaper_works/install_generator_test.rb +16 -0
- data/test/newspaper_works_test.rb +7 -0
- data/test/test_helper.rb +17 -0
- data/tmp/.keep +0 -0
- 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,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
|