dog_biscuits 0.4.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 (272) hide show
  1. checksums.yaml +7 -0
  2. data/.circleci/config.yml +115 -0
  3. data/.codeclimate.yml +52 -0
  4. data/.gitignore +24 -0
  5. data/.rspec +3 -0
  6. data/.rubocop.yml +45 -0
  7. data/.rubocop_todo.yml +92 -0
  8. data/.travis.yml +18 -0
  9. data/CODE_OF_CONDUCT.md +36 -0
  10. data/CONTRIBUTING.md +161 -0
  11. data/Gemfile +40 -0
  12. data/LICENSE +14 -0
  13. data/README.md +98 -0
  14. data/Rakefile +35 -0
  15. data/SUPPORT.md +5 -0
  16. data/bin/console +15 -0
  17. data/bin/setup +7 -0
  18. data/dog_biscuits.gemspec +38 -0
  19. data/lib/dog_biscuits.rb +352 -0
  20. data/lib/dog_biscuits/actors/apply_authorities.rb +32 -0
  21. data/lib/dog_biscuits/actors/singular_attributes.rb +17 -0
  22. data/lib/dog_biscuits/blacklight/commands.rb +118 -0
  23. data/lib/dog_biscuits/configuration.rb +506 -0
  24. data/lib/dog_biscuits/importers/authority.rb +65 -0
  25. data/lib/dog_biscuits/indexers/collection_indexer.rb +10 -0
  26. data/lib/dog_biscuits/indexers/concerns/indexes_common.rb +58 -0
  27. data/lib/dog_biscuits/indexers/conference_item_indexer.rb +17 -0
  28. data/lib/dog_biscuits/indexers/dataset_indexer.rb +25 -0
  29. data/lib/dog_biscuits/indexers/digital_archival_object_indexer.rb +19 -0
  30. data/lib/dog_biscuits/indexers/exam_paper_indexer.rb +10 -0
  31. data/lib/dog_biscuits/indexers/journal_article_indexer.rb +15 -0
  32. data/lib/dog_biscuits/indexers/package_indexer.rb +19 -0
  33. data/lib/dog_biscuits/indexers/published_work_indexer.rb +16 -0
  34. data/lib/dog_biscuits/indexers/thesis_indexer.rb +16 -0
  35. data/lib/dog_biscuits/models/authorities/agent.rb +78 -0
  36. data/lib/dog_biscuits/models/authorities/agents/group.rb +59 -0
  37. data/lib/dog_biscuits/models/authorities/agents/historic_person.rb +55 -0
  38. data/lib/dog_biscuits/models/authorities/agents/organisation.rb +56 -0
  39. data/lib/dog_biscuits/models/authorities/agents/person.rb +75 -0
  40. data/lib/dog_biscuits/models/authorities/concept.rb +91 -0
  41. data/lib/dog_biscuits/models/authorities/concept_scheme.rb +65 -0
  42. data/lib/dog_biscuits/models/authorities/event.rb +74 -0
  43. data/lib/dog_biscuits/models/authorities/place.rb +86 -0
  44. data/lib/dog_biscuits/models/authorities/project.rb +60 -0
  45. data/lib/dog_biscuits/models/authority.rb +42 -0
  46. data/lib/dog_biscuits/models/collections/collection.rb +32 -0
  47. data/lib/dog_biscuits/models/concerns/behaviours/pure_specific_behaviour.rb +17 -0
  48. data/lib/dog_biscuits/models/concerns/behaviours/validate_concept_related.rb +12 -0
  49. data/lib/dog_biscuits/models/concerns/behaviours/validate_concept_scheme.rb +16 -0
  50. data/lib/dog_biscuits/models/concerns/behaviours/validate_label.rb +12 -0
  51. data/lib/dog_biscuits/models/concerns/behaviours/validate_place.rb +12 -0
  52. data/lib/dog_biscuits/models/concerns/behaviours/work_behaviour.rb +21 -0
  53. data/lib/dog_biscuits/models/concerns/extended_solr_document.rb +147 -0
  54. data/lib/dog_biscuits/models/concerns/metadata_properties/archivematica/archivematica.rb +73 -0
  55. data/lib/dog_biscuits/models/concerns/metadata_properties/archives_hub/access_provided_by.rb +14 -0
  56. data/lib/dog_biscuits/models/concerns/metadata_properties/archives_hub/country_code.rb +15 -0
  57. data/lib/dog_biscuits/models/concerns/metadata_properties/archives_hub/hub_dates.rb +17 -0
  58. data/lib/dog_biscuits/models/concerns/metadata_properties/archives_hub/maintenance_agency_code.rb +15 -0
  59. data/lib/dog_biscuits/models/concerns/metadata_properties/bibframe/awarding_institution.rb +13 -0
  60. data/lib/dog_biscuits/models/concerns/metadata_properties/bibframe/edition.rb +13 -0
  61. data/lib/dog_biscuits/models/concerns/metadata_properties/bibframe/identified_by.rb +14 -0
  62. data/lib/dog_biscuits/models/concerns/metadata_properties/bibframe/part.rb +13 -0
  63. data/lib/dog_biscuits/models/concerns/metadata_properties/bibframe/part_of.rb +14 -0
  64. data/lib/dog_biscuits/models/concerns/metadata_properties/bibframe/series.rb +13 -0
  65. data/lib/dog_biscuits/models/concerns/metadata_properties/bibframe/subtitle.rb +14 -0
  66. data/lib/dog_biscuits/models/concerns/metadata_properties/bibo/presented_at.rb +13 -0
  67. data/lib/dog_biscuits/models/concerns/metadata_properties/bibo/publication_status.rb +13 -0
  68. data/lib/dog_biscuits/models/concerns/metadata_properties/datacite/resource_type_general.rb +13 -0
  69. data/lib/dog_biscuits/models/concerns/metadata_properties/dc/abstract.rb +14 -0
  70. data/lib/dog_biscuits/models/concerns/metadata_properties/dc/access_rights.rb +14 -0
  71. data/lib/dog_biscuits/models/concerns/metadata_properties/dc/bibliographic_citation.rb +13 -0
  72. data/lib/dog_biscuits/models/concerns/metadata_properties/dc/contributor.rb +14 -0
  73. data/lib/dog_biscuits/models/concerns/metadata_properties/dc/creator.rb +14 -0
  74. data/lib/dog_biscuits/models/concerns/metadata_properties/dc/date.rb +13 -0
  75. data/lib/dog_biscuits/models/concerns/metadata_properties/dc/date_accepted.rb +13 -0
  76. data/lib/dog_biscuits/models/concerns/metadata_properties/dc/date_available.rb +14 -0
  77. data/lib/dog_biscuits/models/concerns/metadata_properties/dc/date_copyrighted.rb +14 -0
  78. data/lib/dog_biscuits/models/concerns/metadata_properties/dc/date_created.rb +13 -0
  79. data/lib/dog_biscuits/models/concerns/metadata_properties/dc/date_issued.rb +14 -0
  80. data/lib/dog_biscuits/models/concerns/metadata_properties/dc/description.rb +14 -0
  81. data/lib/dog_biscuits/models/concerns/metadata_properties/dc/extent.rb +13 -0
  82. data/lib/dog_biscuits/models/concerns/metadata_properties/dc/format.rb +13 -0
  83. data/lib/dog_biscuits/models/concerns/metadata_properties/dc/identifier.rb +13 -0
  84. data/lib/dog_biscuits/models/concerns/metadata_properties/dc/language.rb +17 -0
  85. data/lib/dog_biscuits/models/concerns/metadata_properties/dc/publisher.rb +14 -0
  86. data/lib/dog_biscuits/models/concerns/metadata_properties/dc/resource_type.rb +13 -0
  87. data/lib/dog_biscuits/models/concerns/metadata_properties/dc/rights.rb +17 -0
  88. data/lib/dog_biscuits/models/concerns/metadata_properties/dc/rights_holder.rb +14 -0
  89. data/lib/dog_biscuits/models/concerns/metadata_properties/dc/simple_versions.rb +18 -0
  90. data/lib/dog_biscuits/models/concerns/metadata_properties/dc/source.rb +13 -0
  91. data/lib/dog_biscuits/models/concerns/metadata_properties/dc/subject.rb +13 -0
  92. data/lib/dog_biscuits/models/concerns/metadata_properties/dwc/event_date.rb +14 -0
  93. data/lib/dog_biscuits/models/concerns/metadata_properties/edm/edm_rights.rb +13 -0
  94. data/lib/dog_biscuits/models/concerns/metadata_properties/fabio/date_collected.rb +15 -0
  95. data/lib/dog_biscuits/models/concerns/metadata_properties/foaf/based_near.rb +12 -0
  96. data/lib/dog_biscuits/models/concerns/metadata_properties/foaf/foaf_name.rb +16 -0
  97. data/lib/dog_biscuits/models/concerns/metadata_properties/frapo/output_of.rb +18 -0
  98. data/lib/dog_biscuits/models/concerns/metadata_properties/geo/geo.rb +27 -0
  99. data/lib/dog_biscuits/models/concerns/metadata_properties/geonames/country_code.rb +15 -0
  100. data/lib/dog_biscuits/models/concerns/metadata_properties/geonames/place_properties.rb +66 -0
  101. data/lib/dog_biscuits/models/concerns/metadata_properties/lc_identifiers/doi.rb +13 -0
  102. data/lib/dog_biscuits/models/concerns/metadata_properties/lc_identifiers/isbn.rb +13 -0
  103. data/lib/dog_biscuits/models/concerns/metadata_properties/lc_identifiers/official_url.rb +13 -0
  104. data/lib/dog_biscuits/models/concerns/metadata_properties/lc_identifiers/orcid.rb +13 -0
  105. data/lib/dog_biscuits/models/concerns/metadata_properties/local/for_indexing.rb +14 -0
  106. data/lib/dog_biscuits/models/concerns/metadata_properties/local/former_identifier.rb +13 -0
  107. data/lib/dog_biscuits/models/concerns/metadata_properties/local/generic_authority_terms.rb +22 -0
  108. data/lib/dog_biscuits/models/concerns/metadata_properties/local/generic_qualifier.rb +16 -0
  109. data/lib/dog_biscuits/models/concerns/metadata_properties/local/last_access.rb +15 -0
  110. data/lib/dog_biscuits/models/concerns/metadata_properties/local/main_file.rb +24 -0
  111. data/lib/dog_biscuits/models/concerns/metadata_properties/local/module_code.rb +13 -0
  112. data/lib/dog_biscuits/models/concerns/metadata_properties/local/number_of_downloads.rb +14 -0
  113. data/lib/dog_biscuits/models/concerns/metadata_properties/local/packaged_by.rb +13 -0
  114. data/lib/dog_biscuits/models/concerns/metadata_properties/local/readme_file.rb +26 -0
  115. data/lib/dog_biscuits/models/concerns/metadata_properties/local/requestor_email.rb +13 -0
  116. data/lib/dog_biscuits/models/concerns/metadata_properties/mads/related_authority.rb +14 -0
  117. data/lib/dog_biscuits/models/concerns/metadata_properties/marc_relators/advisor.rb +14 -0
  118. data/lib/dog_biscuits/models/concerns/metadata_properties/marc_relators/editor.rb +14 -0
  119. data/lib/dog_biscuits/models/concerns/metadata_properties/marc_relators/funder.rb +13 -0
  120. data/lib/dog_biscuits/models/concerns/metadata_properties/marc_relators/place_of_publication.rb +13 -0
  121. data/lib/dog_biscuits/models/concerns/metadata_properties/mods/date_valid.rb +14 -0
  122. data/lib/dog_biscuits/models/concerns/metadata_properties/owl/owl_same_as.rb +13 -0
  123. data/lib/dog_biscuits/models/concerns/metadata_properties/premis/has_restriction.rb +15 -0
  124. data/lib/dog_biscuits/models/concerns/metadata_properties/property_sets/person_properties.rb +92 -0
  125. data/lib/dog_biscuits/models/concerns/metadata_properties/pure/managing_organisation.rb +14 -0
  126. data/lib/dog_biscuits/models/concerns/metadata_properties/pure/pure.rb +28 -0
  127. data/lib/dog_biscuits/models/concerns/metadata_properties/rdf/rdf_type.rb +12 -0
  128. data/lib/dog_biscuits/models/concerns/metadata_properties/rdf/rdfs_label.rb +14 -0
  129. data/lib/dog_biscuits/models/concerns/metadata_properties/rdf/related_url.rb +13 -0
  130. data/lib/dog_biscuits/models/concerns/metadata_properties/schema/alternate_name.rb +13 -0
  131. data/lib/dog_biscuits/models/concerns/metadata_properties/schema/content_version.rb +13 -0
  132. data/lib/dog_biscuits/models/concerns/metadata_properties/schema/date_published.rb +13 -0
  133. data/lib/dog_biscuits/models/concerns/metadata_properties/schema/date_updated.rb +13 -0
  134. data/lib/dog_biscuits/models/concerns/metadata_properties/schema/department.rb +13 -0
  135. data/lib/dog_biscuits/models/concerns/metadata_properties/schema/end_date.rb +13 -0
  136. data/lib/dog_biscuits/models/concerns/metadata_properties/schema/issue_number.rb +13 -0
  137. data/lib/dog_biscuits/models/concerns/metadata_properties/schema/keyword.rb +13 -0
  138. data/lib/dog_biscuits/models/concerns/metadata_properties/schema/location.rb +13 -0
  139. data/lib/dog_biscuits/models/concerns/metadata_properties/schema/pagination.rb +13 -0
  140. data/lib/dog_biscuits/models/concerns/metadata_properties/schema/start_date.rb +13 -0
  141. data/lib/dog_biscuits/models/concerns/metadata_properties/schema/volume_number.rb +13 -0
  142. data/lib/dog_biscuits/models/concerns/metadata_properties/skos/skos_labels.rb +18 -0
  143. data/lib/dog_biscuits/models/concerns/metadata_properties/skos/skos_note.rb +13 -0
  144. data/lib/dog_biscuits/models/concerns/metadata_properties/skos/skos_related.rb +13 -0
  145. data/lib/dog_biscuits/models/concerns/metadata_properties/uketd/date_of_award.rb +13 -0
  146. data/lib/dog_biscuits/models/concerns/metadata_properties/uketd/qualification.rb +17 -0
  147. data/lib/dog_biscuits/models/concerns/metadata_properties/ulcc/date_submitted.rb +14 -0
  148. data/lib/dog_biscuits/models/concerns/metadata_properties/ulcc/official_url.rb +13 -0
  149. data/lib/dog_biscuits/models/concerns/metadata_properties/ulcc/refereed.rb +13 -0
  150. data/lib/dog_biscuits/models/concerns/model_property_sets/common/common_labels.rb +9 -0
  151. data/lib/dog_biscuits/models/concerns/model_property_sets/common/common_metadata.rb +64 -0
  152. data/lib/dog_biscuits/models/concerns/model_property_sets/common/common_rights.rb +10 -0
  153. data/lib/dog_biscuits/models/concerns/model_property_sets/conference_item_metadata.rb +24 -0
  154. data/lib/dog_biscuits/models/concerns/model_property_sets/dataset_metadata.rb +36 -0
  155. data/lib/dog_biscuits/models/concerns/model_property_sets/digital_archival_object_metadata.rb +13 -0
  156. data/lib/dog_biscuits/models/concerns/model_property_sets/exam_paper_metadata.rb +14 -0
  157. data/lib/dog_biscuits/models/concerns/model_property_sets/journal_article_metadata.rb +24 -0
  158. data/lib/dog_biscuits/models/concerns/model_property_sets/package_metadata.rb +13 -0
  159. data/lib/dog_biscuits/models/concerns/model_property_sets/published_work_metadata.rb +26 -0
  160. data/lib/dog_biscuits/models/concerns/model_property_sets/thesis_metadata.rb +17 -0
  161. data/lib/dog_biscuits/models/filesets/file_set.rb +30 -0
  162. data/lib/dog_biscuits/models/to_refactor_or_remove/canvas.rb +15 -0
  163. data/lib/dog_biscuits/models/to_refactor_or_remove/contained_file.rb +13 -0
  164. data/lib/dog_biscuits/models/to_refactor_or_remove/db/db_date_certainty.rb +5 -0
  165. data/lib/dog_biscuits/models/to_refactor_or_remove/db/db_editorial_note.rb +5 -0
  166. data/lib/dog_biscuits/models/to_refactor_or_remove/db/db_entry.rb +19 -0
  167. data/lib/dog_biscuits/models/to_refactor_or_remove/db/db_entry_date.rb +10 -0
  168. data/lib/dog_biscuits/models/to_refactor_or_remove/db/db_entry_type.rb +5 -0
  169. data/lib/dog_biscuits/models/to_refactor_or_remove/db/db_is_referenced_by.rb +5 -0
  170. data/lib/dog_biscuits/models/to_refactor_or_remove/db/db_language.rb +5 -0
  171. data/lib/dog_biscuits/models/to_refactor_or_remove/db/db_marginalium.rb +5 -0
  172. data/lib/dog_biscuits/models/to_refactor_or_remove/db/db_note.rb +5 -0
  173. data/lib/dog_biscuits/models/to_refactor_or_remove/db/db_person_as_written.rb +5 -0
  174. data/lib/dog_biscuits/models/to_refactor_or_remove/db/db_person_descriptor.rb +5 -0
  175. data/lib/dog_biscuits/models/to_refactor_or_remove/db/db_person_descriptor_as_written.rb +5 -0
  176. data/lib/dog_biscuits/models/to_refactor_or_remove/db/db_person_note.rb +5 -0
  177. data/lib/dog_biscuits/models/to_refactor_or_remove/db/db_person_related_person.rb +5 -0
  178. data/lib/dog_biscuits/models/to_refactor_or_remove/db/db_person_related_place.rb +5 -0
  179. data/lib/dog_biscuits/models/to_refactor_or_remove/db/db_person_role.rb +5 -0
  180. data/lib/dog_biscuits/models/to_refactor_or_remove/db/db_place_as_written.rb +5 -0
  181. data/lib/dog_biscuits/models/to_refactor_or_remove/db/db_place_note.rb +5 -0
  182. data/lib/dog_biscuits/models/to_refactor_or_remove/db/db_place_role.rb +5 -0
  183. data/lib/dog_biscuits/models/to_refactor_or_remove/db/db_place_type.rb +5 -0
  184. data/lib/dog_biscuits/models/to_refactor_or_remove/db/db_related_agent.rb +20 -0
  185. data/lib/dog_biscuits/models/to_refactor_or_remove/db/db_related_place.rb +13 -0
  186. data/lib/dog_biscuits/models/to_refactor_or_remove/db/db_section_type.rb +5 -0
  187. data/lib/dog_biscuits/models/to_refactor_or_remove/db/db_single_date.rb +10 -0
  188. data/lib/dog_biscuits/models/to_refactor_or_remove/db/db_subject.rb +5 -0
  189. data/lib/dog_biscuits/models/to_refactor_or_remove/entry.rb +59 -0
  190. data/lib/dog_biscuits/models/to_refactor_or_remove/entry/entry_date.rb +17 -0
  191. data/lib/dog_biscuits/models/to_refactor_or_remove/entry/related_agent.rb +62 -0
  192. data/lib/dog_biscuits/models/to_refactor_or_remove/entry/related_place.rb +28 -0
  193. data/lib/dog_biscuits/models/to_refactor_or_remove/entry/single_date.rb +19 -0
  194. data/lib/dog_biscuits/models/to_refactor_or_remove/folio.rb +42 -0
  195. data/lib/dog_biscuits/models/to_refactor_or_remove/image.rb +25 -0
  196. data/lib/dog_biscuits/models/to_refactor_or_remove/manifest.rb +15 -0
  197. data/lib/dog_biscuits/models/to_refactor_or_remove/register.rb +21 -0
  198. data/lib/dog_biscuits/models/work.rb +37 -0
  199. data/lib/dog_biscuits/models/works/conference_item.rb +37 -0
  200. data/lib/dog_biscuits/models/works/dataset.rb +42 -0
  201. data/lib/dog_biscuits/models/works/digital_archival_object.rb +28 -0
  202. data/lib/dog_biscuits/models/works/exam_paper.rb +33 -0
  203. data/lib/dog_biscuits/models/works/journal_article.rb +37 -0
  204. data/lib/dog_biscuits/models/works/package.rb +47 -0
  205. data/lib/dog_biscuits/models/works/published_work.rb +38 -0
  206. data/lib/dog_biscuits/models/works/thesis.rb +34 -0
  207. data/lib/dog_biscuits/property_mappings/property_mappings.rb +585 -0
  208. data/lib/dog_biscuits/railtie.rb +13 -0
  209. data/lib/dog_biscuits/services/table_based_authority_extended.rb +10 -0
  210. data/lib/dog_biscuits/services/terms.rb +57 -0
  211. data/lib/dog_biscuits/services/terms_service.rb +162 -0
  212. data/lib/dog_biscuits/solr/index_types.rb +33 -0
  213. data/lib/dog_biscuits/validators/concept_related_validator.rb +13 -0
  214. data/lib/dog_biscuits/validators/concept_scheme_member_validator.rb +10 -0
  215. data/lib/dog_biscuits/validators/label_validator.rb +55 -0
  216. data/lib/dog_biscuits/validators/place_validator.rb +10 -0
  217. data/lib/dog_biscuits/version.rb +5 -0
  218. data/lib/dog_biscuits/vocab/borthwick_registers.rb +321 -0
  219. data/lib/dog_biscuits/vocab/generic.rb +204 -0
  220. data/lib/dog_biscuits/vocab/oais_archivematica.rb +116 -0
  221. data/lib/dog_biscuits/vocab/pure_terms.rb +65 -0
  222. data/lib/dog_biscuits/vocab/uketd.rb +45 -0
  223. data/lib/dog_biscuits/vocab/ulcc_terms.rb +55 -0
  224. data/lib/generators/dog_biscuits/USAGE +50 -0
  225. data/lib/generators/dog_biscuits/authority_generator.rb +55 -0
  226. data/lib/generators/dog_biscuits/catalog_generator.rb +18 -0
  227. data/lib/generators/dog_biscuits/dates_generator.rb +98 -0
  228. data/lib/generators/dog_biscuits/generate_all_generator.rb +29 -0
  229. data/lib/generators/dog_biscuits/imagify_generator.rb +67 -0
  230. data/lib/generators/dog_biscuits/install_generator.rb +82 -0
  231. data/lib/generators/dog_biscuits/locales_generator.rb +20 -0
  232. data/lib/generators/dog_biscuits/schema_org_generator.rb +20 -0
  233. data/lib/generators/dog_biscuits/templates/_date_template.html.erb +7 -0
  234. data/lib/generators/dog_biscuits/templates/app/controllers/catalog_controller.rb +133 -0
  235. data/lib/generators/dog_biscuits/templates/app/helpers/dog_biscuits_helper.rb +43 -0
  236. data/lib/generators/dog_biscuits/templates/app/renderers/package_ids_renderer.rb +13 -0
  237. data/lib/generators/dog_biscuits/templates/app/renderers/packaged_by_ids_renderer.rb +11 -0
  238. data/lib/generators/dog_biscuits/templates/app/renderers/publication_status_renderer.rb +16 -0
  239. data/lib/generators/dog_biscuits/templates/app/services/concerns/file_authority_concern.rb +14 -0
  240. data/lib/generators/dog_biscuits/templates/app/services/concerns/local_authority_concern.rb +18 -0
  241. data/lib/generators/dog_biscuits/templates/app/services/local_form_metadata_service.rb +15 -0
  242. data/lib/generators/dog_biscuits/templates/app/views/hyrax/base/_form_metadata.html.erb +23 -0
  243. data/lib/generators/dog_biscuits/templates/app/views/records/edit_fields/_abstract.html.erb +5 -0
  244. data/lib/generators/dog_biscuits/templates/app/views/records/edit_fields/_default.html.erb +6 -0
  245. data/lib/generators/dog_biscuits/templates/app/views/records/edit_fields/_funder.html.erb +8 -0
  246. data/lib/generators/dog_biscuits/templates/app/views/records/edit_fields/_note.html.erb +5 -0
  247. data/lib/generators/dog_biscuits/templates/app/views/records/edit_fields/_part_of.html.erb +17 -0
  248. data/lib/generators/dog_biscuits/templates/app/views/records/edit_fields/_publication_status.html.erb +6 -0
  249. data/lib/generators/dog_biscuits/templates/app/views/records/edit_fields/_refereed.html.erb +5 -0
  250. data/lib/generators/dog_biscuits/templates/app/views/records/edit_fields/_resource_type_general.html.erb +2 -0
  251. data/lib/generators/dog_biscuits/templates/authority_service.rb.erb +25 -0
  252. data/lib/generators/dog_biscuits/templates/config/authorities/content_versions.yml +25 -0
  253. data/lib/generators/dog_biscuits/templates/config/authorities/publication_statuses.yml +19 -0
  254. data/lib/generators/dog_biscuits/templates/config/authorities/qualification_levels.yml +13 -0
  255. data/lib/generators/dog_biscuits/templates/config/authorities/qualification_names.yml +31 -0
  256. data/lib/generators/dog_biscuits/templates/config/authorities/resource_type_generals.yml +47 -0
  257. data/lib/generators/dog_biscuits/templates/config/dog_biscuits.yml +3 -0
  258. data/lib/generators/dog_biscuits/templates/config/initializers/catalog_search_builder_overrides.rb +18 -0
  259. data/lib/generators/dog_biscuits/templates/config/initializers/dog_biscuits.rb +144 -0
  260. data/lib/generators/dog_biscuits/templates/dog_biscuits.en.yml.erb +11 -0
  261. data/lib/generators/dog_biscuits/templates/schema_org.yml.erb +4 -0
  262. data/lib/generators/dog_biscuits/work/USAGE +35 -0
  263. data/lib/generators/dog_biscuits/work/templates/README +31 -0
  264. data/lib/generators/dog_biscuits/work/templates/_attribute_rows.html.erb +22 -0
  265. data/lib/generators/dog_biscuits/work/templates/actor.rb.erb +25 -0
  266. data/lib/generators/dog_biscuits/work/templates/form.rb.erb +18 -0
  267. data/lib/generators/dog_biscuits/work/templates/indexer.rb.erb +23 -0
  268. data/lib/generators/dog_biscuits/work/templates/model.rb.erb +16 -0
  269. data/lib/generators/dog_biscuits/work/templates/presenter.rb.erb +20 -0
  270. data/lib/generators/dog_biscuits/work/work_generator.rb +102 -0
  271. data/lib/tasks/authorities.rake +22 -0
  272. metadata +476 -0
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DogBiscuits
4
+ class Package < Work
5
+ # Needed to set the type
6
+ include ::Hydra::Works::WorkBehavior
7
+
8
+ # Order matters because included metadata finalises things:
9
+ # 1) type and local metadata
10
+ # 2) indexer
11
+ # 3) included metadata
12
+
13
+ type << DogBiscuits::Vocab::Generic.Package
14
+
15
+ # Local metadata
16
+ has_and_belongs_to_many :packages,
17
+ class_name: 'DogBiscuits::Work',
18
+ predicate: DogBiscuits::Vocab::Generic.packages,
19
+ inverse_of: :packaged_by
20
+
21
+ # Indexer
22
+ # Metadata
23
+ # include DogBiscuits::PackageMetadata
24
+
25
+ before_save :add_types
26
+
27
+ def package?
28
+ true
29
+ end
30
+
31
+ # It's an AIP if it has an AIP UUID
32
+ def aip?
33
+ aip_uuid.blank? ? false : true
34
+ end
35
+
36
+ # It's a DIP if it has a DIP UUID
37
+ def dip?
38
+ dip_uuid.blank? ? false : true
39
+ end
40
+
41
+ # If object is a DIP/AIP, add the rdf type
42
+ def add_types
43
+ rdf_type << DogBiscuits::Vocab::OaisArchivematica.DisseminationInformationPackage if dip?
44
+ rdf_type << DogBiscuits::Vocab::OaisArchivematica.ArchivalInformationPackage if aip?
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DogBiscuits
4
+ class PublishedWork < Work
5
+ # Needed to set the type
6
+ include ::Hydra::Works::WorkBehavior
7
+
8
+ # Order matters because included metadata finalises things:
9
+ # 1) type and local metadata
10
+ # 2) indexer
11
+ # 3) included metadata
12
+
13
+ type << DogBiscuits::Vocab::UlccTerms.PublishedWork
14
+ type << ::RDF::Vocab::SCHEMA.Book
15
+
16
+ # Indexer
17
+ # self.indexer = DogBiscuits::PublishedWorkIndexer
18
+ # Metadata
19
+ # include DogBiscuits::PublishedWorkMetadata
20
+
21
+ # before_save :combine_dates
22
+
23
+ def published_work?
24
+ true
25
+ end
26
+
27
+ # Create single date field from all dates.
28
+ def combine_dates
29
+ tmpdate = date
30
+ tmpdate << date_published
31
+ tmpdate << date_available
32
+ tmpdate << date_accepted
33
+ tmpdate << date_submitted
34
+ tmpdate << date_created
35
+ self.date = tmpdate
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DogBiscuits
4
+ class Thesis < Work
5
+ # Needed to set the type
6
+ include ::Hydra::Works::WorkBehavior
7
+
8
+ # Order matters because included metadata finalises things:
9
+ # 1) type and local metadata
10
+ # 2) indexer
11
+ # 3) included metadata
12
+
13
+ type << ::RDF::URI.intern('https://bib.schema.org/Thesis')
14
+
15
+ ## Indexer
16
+ # self.indexer = DogBiscuits::ThesisIndexer
17
+ # Metadata
18
+ # include DogBiscuits::ThesisMetadata
19
+
20
+ # before_save :combine_dates
21
+
22
+ def thesis?
23
+ true
24
+ end
25
+
26
+ # Create single date field from all dates.
27
+ def combine_dates
28
+ tmpdate = date
29
+ tmpdate << date_of_award
30
+ tmpdate << date_created
31
+ self.date = tmpdate
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,585 @@
1
+ # frozen_string_literal: true
2
+
3
+ # rubocop:disable Metrics/LineLength
4
+ # rubocop:disable Metrics/MethodLength
5
+ # rubocop:disable Metrics/ModuleLength
6
+
7
+ module DogBiscuits
8
+ module PropertyMappings
9
+ attr_writer :property_mappings
10
+
11
+ # Add all properties to the property_mappings hash.
12
+ # Allowed values:
13
+ # label: a human-readable label for the property REQUIRED
14
+ # index: any additional options for the blacklight index in an array
15
+ # excluding helper_method and item prop
16
+ # provide in a hash, eg. [{ if: false }], or [{ link_to_search: true }]
17
+ # nb. for link_to_search, just provide true
18
+ # schema_org: hash containing property; can also include type and value
19
+ # help_text: help text to include in the form
20
+ # render_as: a custom renderer for the field (omit facetable)
21
+ # helper_method: a helper method used to render this property in the catalog
22
+
23
+ # NOTE: Labels MUST be wrapped in single quotes and help_text MUST be wrapped in double quotes
24
+ def property_mappings
25
+ @property_mappings ||=
26
+ {
27
+ file_format: {
28
+ label: 'File format',
29
+ index: [{ link_to_search: true }]
30
+ },
31
+ embargo_release_date: {
32
+ label: 'Embargo releases on',
33
+ index: [{ type: :date }],
34
+ helper_method: :human_readable_date
35
+ },
36
+ lease_expiration_date: {
37
+ label: 'Lease expires on',
38
+ index: [{ type: :date }],
39
+ helper_method: :human_readable_date
40
+ },
41
+ depositor: {
42
+ helper_method: :link_to_profile,
43
+ label: 'Owner'
44
+ },
45
+ proxy_depositor: {
46
+ # index: "('proxy_depositor', :symbol",
47
+ helper_method: :link_to_profile,
48
+ label: 'Depositor'
49
+ },
50
+ date_uploaded: {
51
+ label: 'Date uploaded',
52
+ helper_method: :human_readable_date
53
+ },
54
+ date_modified: {
55
+ label: 'Date modified',
56
+ helper_method: :human_readable_date
57
+ },
58
+ abstract: {
59
+ label: 'Abstract',
60
+ helper_method: :truncate_text_and_iconify_link,
61
+ schema_org: {
62
+ property: "description"
63
+ }
64
+ },
65
+ advisor: {
66
+ schema_org: {
67
+ property: "contributor",
68
+ type: "http://schema.org/Person",
69
+ value: "name"
70
+ },
71
+ label: 'Advisor / supervisor',
72
+ help_text: 'Thesis advisor or supervisor.'
73
+ },
74
+ access_provided_by: {
75
+ schema_org: {
76
+ property: "provider",
77
+ type: "http://schema.org/Organization",
78
+ value: "name"
79
+ },
80
+ label: 'Access provided by',
81
+ help_text: 'Repository'
82
+ },
83
+ alt: {
84
+ label: 'Altitude'
85
+ },
86
+ awarding_institution: {
87
+ index: [{ link_to_search: true }],
88
+ label: 'Awarding institution'
89
+ },
90
+ based_near: {
91
+ index: [{ link_to_search: true }],
92
+ schema_org: {
93
+ property: "contentLocation",
94
+ type: "http://schema.org/Place",
95
+ value: "name"
96
+ },
97
+ label: 'Location',
98
+ help_text: "A place name related to the work, such as its site of publication, or the city, state, or country the work contents are about. Calls upon the <a href='http://www.geonames.org'>GeoNames web service</a>."
99
+ },
100
+ based_near_label: {
101
+ index: [{ link_to_search: true }],
102
+ schema_org: {
103
+ property: "contentLocation",
104
+ type: "http://schema.org/Place",
105
+ value: "name"
106
+ },
107
+ label: 'Location',
108
+ help_text: "A place name related to the work, such as its site of publication, or the city, state, or country the work contents are about. Calls upon the <a href='http://www.geonames.org'>GeoNames web service</a>."
109
+ },
110
+ content_version: {
111
+ help_text: "The version of the file, eg. Author's Original or Accepted Manuscript."
112
+ },
113
+ contributor: {
114
+ index: [{ link_to_search: true }],
115
+ schema_org: {
116
+ property: "contributor",
117
+ type: "http://schema.org/Person",
118
+ value: "name"
119
+ },
120
+ label: 'Contributor',
121
+ help_text: "A person or group you want to recognize for playing a role in the creation of the work, but not the primary role."
122
+ },
123
+ contributor_combined: {
124
+ index: [{ link_to_search: true }],
125
+ schema_org: {
126
+ property: "contributor",
127
+ type: "http://schema.org/Person",
128
+ value: "name"
129
+ },
130
+ label: 'Contributor'
131
+ },
132
+ contributor_type: {
133
+ label: 'Contributor type'
134
+ },
135
+ creator: {
136
+ index: [{ link_to_search: true }],
137
+ label: 'Creator',
138
+ schema_org: {
139
+ property: "creator",
140
+ type: "http://schema.org/Person",
141
+ value: "name"
142
+ },
143
+ help_text: "The person or group responsible for the work. Usually this is the author of the content. Personal names should be entered with the last name first, e.g. &quot;Smith, John.&quot;."
144
+ },
145
+ date: {
146
+ label: 'Date',
147
+ help_text: 'A date for the work.'
148
+ },
149
+ date_accepted: {
150
+ label: 'Date accepted'
151
+ },
152
+ date_available: {
153
+ schema_org: {
154
+ property: "datePublished"
155
+ }
156
+ },
157
+ date_collected: {
158
+ label: 'Date collected'
159
+ },
160
+ date_copyrighted: {
161
+ label: 'Date copyrighted'
162
+ },
163
+ date_created: {
164
+ schema_org: {
165
+ property: "dateCreated"
166
+ },
167
+ help_text: "The date on which the work was created."
168
+ },
169
+ date_issued: {
170
+ label: 'Date issued'
171
+ },
172
+ # Only used for the date range facet
173
+ date_range: {
174
+ label: 'Date range'
175
+ },
176
+ date_published: {
177
+ schema_org: {
178
+ property: "datePublished"
179
+ },
180
+ label: 'Publication date'
181
+ },
182
+ date_submitted: {
183
+ label: 'Date submitted'
184
+ },
185
+ date_of_award: {
186
+ label: 'Date of award'
187
+ },
188
+ date_updated: {
189
+ helper_method: :human_readable_date
190
+ },
191
+ date_valid: {
192
+ label: 'Date valid'
193
+ },
194
+ dc_access_rights: {
195
+ label: 'Access rights'
196
+ },
197
+ department: {
198
+ label: 'Department, School or Faculty'
199
+ },
200
+ description: {
201
+ label: 'Description or summary',
202
+ helper_method: :truncate_text_and_iconify_link,
203
+ schema_org: {
204
+ property: "description"
205
+ },
206
+ help_text: "Free-text notes about the work. Examples include abstracts of a paper or citation information for a journal article."
207
+ },
208
+ doi: {
209
+ schema_org: {
210
+ property: "identifier"
211
+ },
212
+ label: 'DOI',
213
+ help_text: 'Digital Object Identifier (DOI) for the work.'
214
+ },
215
+ edition: {
216
+ label: 'Edition',
217
+ schema_org: {
218
+ property: "version"
219
+ }
220
+ },
221
+ editor: {
222
+ label: 'Editor',
223
+ schema_org: {
224
+ property: "editor"
225
+ }
226
+ },
227
+ extent: {
228
+ label: 'Extent'
229
+ },
230
+ event_date: {
231
+ label: 'Date of event'
232
+ },
233
+ start_date: {
234
+ label: 'Start date'
235
+ },
236
+ end_date: {
237
+ label: 'End date'
238
+ },
239
+ dc_format: {
240
+ label: 'Format'
241
+ },
242
+ former_identifier: {
243
+ label: 'Former identifier',
244
+ schema_org: {
245
+ property: "identifier"
246
+ },
247
+ help_text: 'A former identifier, URL or other reference for the work.'
248
+ },
249
+ funder: {
250
+ label: 'Funder',
251
+ schema_org: {
252
+ property: "funder"
253
+ },
254
+ help_text: 'Funding body or oraganisation funding the work.'
255
+ },
256
+ has_restriction: {
257
+ label: 'Restriction note'
258
+ },
259
+ human_readable_type: {
260
+ label: 'Type',
261
+ schema_org: {
262
+ 'Conference Item' => 'http://schema.org/ScholarlyArticle',
263
+ 'Dataset' => 'http://schema.org/Dataset',
264
+ 'Exam Paper' => 'http://schema.org/CreativeWork',
265
+ 'Journal Article' => 'http://schema.org/ScholarlyArticle',
266
+ 'Package' => 'http://schema.org/Dataset',
267
+ 'Published Work' => 'http://schema.org/CreativeWork'
268
+ }
269
+ },
270
+ identifier: {
271
+ label: 'Identifier',
272
+ helper_method: :index_field_link,
273
+ schema_org: {
274
+ property: "identifier"
275
+ },
276
+ help_text: "A unique handle identifying the work. An example would be a DOI for a journal article, or an ISBN or OCLC number for a book."
277
+ },
278
+ isbn: {
279
+ schema_org: {
280
+ property: "identifier"
281
+ },
282
+ label: 'ISBN',
283
+ help_text: 'The International Standard Book Number for the work.'
284
+ },
285
+ issue_number: {
286
+ schema_org: {
287
+ property: "issueNumber"
288
+ },
289
+ label: 'Issue'
290
+ },
291
+ journal: {
292
+ schema_org: {
293
+ property: "isPartOf",
294
+ type: "http://schema.org/CreativeWork",
295
+ value: "name"
296
+ },
297
+ label: 'Journal name'
298
+ },
299
+ keyword: {
300
+ index: [{ link_to_search: true }],
301
+ label: 'Keywords',
302
+ schema_org: {
303
+ property: "keywords"
304
+ },
305
+ help_text: "Words or phrases you select to describe what the work is about. These are used to search for content."
306
+ },
307
+ language: {
308
+ index: [{ link_to_search: true }],
309
+ label: 'Language',
310
+ schema_org: {
311
+ property: "language"
312
+ },
313
+ help_text: "The language of the work's content."
314
+ },
315
+ last_access: {
316
+ label: 'Date of last access'
317
+ },
318
+ lat: {
319
+ label: 'Latitude'
320
+ },
321
+ license: {
322
+ label: 'License',
323
+ helper_method: :license_links,
324
+ render_as: :license,
325
+ help_text: "Licensing and distribution information governing access to the work. Select from the provided drop-down list."
326
+ },
327
+ location: {
328
+ label: 'Location'
329
+ },
330
+ long: {
331
+ label: 'Longitude'
332
+ },
333
+ managing_organisation: {
334
+ label: 'Managing organisation'
335
+ },
336
+ module_code: {
337
+ schema_org: {
338
+ property: "identifier"
339
+ },
340
+ label: 'Module code'
341
+ },
342
+ note: {
343
+ label: 'Note',
344
+ schema_org: {
345
+ property: "note"
346
+ },
347
+ help_text: "A general note about the work."
348
+ },
349
+ number_of_downloads: {
350
+ label: 'Number of downloads'
351
+ },
352
+ official_url: {
353
+ schema_org: {
354
+ property: "significantLink"
355
+ },
356
+ label: 'Official URL',
357
+ render_as: :external_link
358
+ },
359
+ output_of: {
360
+ label: 'Output of project or grant'
361
+ },
362
+ package_ids: {
363
+ label: "Package contains",
364
+ help_text: 'Packages these works. Customarily, the package is a digital preservation AIP or DIP.',
365
+ render_as: :package_ids
366
+ },
367
+ packaged_by_ids: {
368
+ label: "In package",
369
+ help_text: 'Packaged by the following work. Customarily, the package is a digital preservation AIP or DIP.',
370
+ render_as: :packaged_by_ids
371
+ },
372
+ packaged_by_titles: {
373
+ label: "In package"
374
+ },
375
+ pagination: {
376
+ schema_org: {
377
+ property: "pagination"
378
+ },
379
+ label: 'Pages'
380
+ },
381
+ part: {
382
+ label: 'Part name',
383
+ schema_org: {
384
+ property: "isPartOf",
385
+ type: "http://schema.org/CreativeWork",
386
+ value: "name"
387
+ }
388
+ },
389
+ place_of_publication: {
390
+ label: 'Place of publication',
391
+ schema_org: {
392
+ property: "location",
393
+ type: "http://schema.org/Place",
394
+ value: "name"
395
+ }
396
+ },
397
+ presented_at: {
398
+ label: 'Presented at',
399
+ schema_org: {
400
+ property: "workPerformed",
401
+ type: "http://schema.org/Event",
402
+ value: "name"
403
+ }
404
+ },
405
+ part_of: {
406
+ label: 'Part of',
407
+ help_text: "A Work that this this physically or logically contained in, such as a conference proceeding, or series.",
408
+ schema_org: {
409
+ property: "isPartOf",
410
+ type: "http://schema.org/CreativeWork",
411
+ value: "name"
412
+ }
413
+ },
414
+ publication_status: {
415
+ label: 'Publication status',
416
+ render_as: 'publication_status',
417
+ helper_method: 'publication_status'
418
+ },
419
+ publisher: {
420
+ index: [{ link_to_search: true }],
421
+ schema_org: {
422
+ property: "publisher",
423
+ type: "http://schema.org/Organization",
424
+ value: "name"
425
+ },
426
+ help_text: "The person or group making the work available. Generally this is the institution.",
427
+ label: 'Publisher'
428
+ },
429
+ qualification_level: {
430
+ label: 'Qualification level'
431
+ },
432
+ qualification_name: {
433
+ label: 'Qualification name'
434
+ },
435
+ refereed: {
436
+ label: 'Peer reviewed?'
437
+ },
438
+ related_url: {
439
+ schema_org: {
440
+ property: "relatedLink"
441
+ },
442
+ render_as: :external_link,
443
+ help_text: "A link to a website or other specific content (audio, video, PDF document) related to the work. An example is the URL of a research project from which the work was derived.",
444
+ label: 'Related URL'
445
+ },
446
+ resource_type: {
447
+ index: [{ link_to_search: true }],
448
+ schema_org: {
449
+ 'Article' => "http://schema.org/Article",
450
+ 'Audio' => "http://schema.org/AudioObject",
451
+ 'Book' => "http://schema.org/Book",
452
+ 'Conference Proceeding' => "http://schema.org/ScholarlyArticle",
453
+ 'Dataset' => "http://schema.org/Dataset",
454
+ 'Dissertation' => "http://schema.org/ScholarlyArticle",
455
+ 'Image' => "http://schema.org/ImageObject",
456
+ 'Map or Cartographic Material' => "http://schema.org/Map",
457
+ 'Masters Thesis' => "http://schema.org/ScholarlyArticle",
458
+ 'Part of Book' => "http://schema.org/Book",
459
+ 'Research Paper' => "http://schema.org/ScholarlyArticle",
460
+ 'Software or Program Code' => "http://schema.org/Code",
461
+ 'Video' => "http://schema.org/VideoObject"
462
+ },
463
+ label: 'Resource type',
464
+ help_text: "Pre-defined categories to describe the type of content being uploaded, such as &quot;article&quot; or &quot;dataset.&quot; More than one type may be selected."
465
+ },
466
+ # datacite-specific
467
+ resource_type_general: {
468
+ schema_org: {
469
+ 'Audiovisual' => "http://schema.org/MediaObject",
470
+ 'Collection' => "http://bib.schema.org/Collection",
471
+ 'DataPaper' => "http://schema.org/CreativeWork",
472
+ 'Dataset' => "http://schema.org/Dataset",
473
+ 'Event' => "http://schema.org/Event",
474
+ 'Image' => "http://schema.org/ImageObject",
475
+ 'InteractiveResource' => "http://schema.org/CreativeWork",
476
+ 'Model' => "http://schema.org/CreativeWork",
477
+ 'PhysicalObject' => "http://schema.org/Thing",
478
+ 'Service' => "http://schema.org/Service",
479
+ 'Software' => "http://schema.org/Code",
480
+ 'Sound' => "http://schema.org/AudioObject",
481
+ 'Text' => "http://schema.org/CreativeWork",
482
+ 'Workflow' => "http://schema.org/CreativeWork",
483
+ 'Other' => "http://schema.org/Thing"
484
+ },
485
+ label: 'General resource type'
486
+ },
487
+ rights_statement: {
488
+ helper_method: :rights_statement_links,
489
+ render_as: :rights_statement,
490
+ label: 'Rights statement'
491
+ },
492
+ series: {
493
+ schema_org: {
494
+ property: "isPartOf",
495
+ type: "http://schema.org/CreativeWork",
496
+ value: "name"
497
+ },
498
+ label: 'Series'
499
+ },
500
+ source: {
501
+ label: 'Source'
502
+ },
503
+ subject: {
504
+ index: [{ link_to_search: true }],
505
+ schema_org: {
506
+ property: "about",
507
+ type: "http://schema.org/Thing",
508
+ value: "name"
509
+ },
510
+ help_text: "Headings or index terms describing what the work is about; these do need to conform to an existing vocabulary.",
511
+ label: 'Subject'
512
+ },
513
+ subtitle: {
514
+ schema_org: {
515
+ property: "name"
516
+ },
517
+ label: 'Subtitle'
518
+ },
519
+ title: {
520
+ index: [{ if: false }],
521
+ schema_org: {
522
+ property: "name"
523
+ },
524
+ label: 'Title',
525
+ help_text: "A name to aid in identifying a work."
526
+ },
527
+ volume_number: {
528
+ schema_org: {
529
+ property: "volumeNumber"
530
+ },
531
+ label: 'Volume'
532
+ },
533
+ aip_uuid: {
534
+ label: 'AIP UUID'
535
+ },
536
+ transfer_uuid: {
537
+ label: 'Transfer UUID'
538
+ },
539
+ sip_uuid: {
540
+ label: 'SIP UUID'
541
+ },
542
+ dip_uuid: {
543
+ label: 'DIP UUID'
544
+ },
545
+ aip_status: {
546
+ label: 'AIP Status'
547
+ },
548
+ dip_status: {
549
+ label: 'DIP Status'
550
+ },
551
+ aip_size: {
552
+ label: 'AIP Size'
553
+ },
554
+ dip_size: {
555
+ label: 'DIP Size'
556
+ },
557
+ aip_current_path: {
558
+ label: 'AIP Current Path'
559
+ },
560
+ dip_current_path: {
561
+ label: 'DIP Current Path'
562
+ },
563
+ aip_current_location: {
564
+ label: 'AIP Current Location'
565
+ },
566
+ dip_current_location: {
567
+ label: 'DIP Current Location'
568
+ },
569
+ aip_resource_uri: {
570
+ label: 'AIP Resource URI'
571
+ },
572
+ dip_resource_uri: {
573
+ label: 'DIP Resource URI'
574
+ },
575
+ origin_pipeline: {
576
+ label: 'Origin Pipeline'
577
+ }
578
+ }
579
+ end
580
+ end
581
+ end
582
+
583
+ # rubocop:enable Metrics/LineLength
584
+ # rubocop:enable Metrics/MethodLength
585
+ # rubocop:enable Metrics/ModuleLength