geo_works 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (336) hide show
  1. checksums.yaml +7 -0
  2. data/.codeclimate.yml +34 -0
  3. data/.csslintrc +2 -0
  4. data/.engine_cart.yml +1 -0
  5. data/.eslintignore +1 -0
  6. data/.eslintrc +8 -0
  7. data/.fcrepo_wrapper +3 -0
  8. data/.gitignore +14 -0
  9. data/.rubocop.yml +105 -0
  10. data/.solr_wrapper +7 -0
  11. data/.travis.yml +33 -0
  12. data/CONTRIBUTING.md +159 -0
  13. data/Gemfile +48 -0
  14. data/LICENSE +202 -0
  15. data/README.md +143 -0
  16. data/Rakefile +25 -0
  17. data/app/assets/images/geo_works/.keep +0 -0
  18. data/app/assets/images/geo_works/images/geocoder.png +0 -0
  19. data/app/assets/images/geo_works/images/move-handle.png +0 -0
  20. data/app/assets/images/geo_works/images/resize-handle.png +0 -0
  21. data/app/assets/images/geo_works/images/throbber.gif +0 -0
  22. data/app/assets/javascripts/geo_works/Control.Geocoder.js +1056 -0
  23. data/app/assets/javascripts/geo_works/application.js +4 -0
  24. data/app/assets/javascripts/geo_works/bounding_box_selector.js +107 -0
  25. data/app/assets/javascripts/geo_works/es6-modules.js +7 -0
  26. data/app/assets/javascripts/geo_works/geo_works_boot.es6 +8 -0
  27. data/app/assets/javascripts/geo_works/leaflet-boundingbox.js +467 -0
  28. data/app/assets/javascripts/geo_works/relationships.js +3 -0
  29. data/app/assets/javascripts/geo_works/relationships/child_works.es6 +20 -0
  30. data/app/assets/javascripts/geo_works/relationships/parent_works.es6 +20 -0
  31. data/app/assets/javascripts/geo_works/relationships/related_works.es6 +187 -0
  32. data/app/assets/stylesheets/geo_works/Control.Geocoder.scss +104 -0
  33. data/app/assets/stylesheets/geo_works/application.css +18 -0
  34. data/app/assets/stylesheets/geo_works/bounding_box.scss +15 -0
  35. data/app/assets/stylesheets/geo_works/leaflet-boundingbox.scss +17 -0
  36. data/app/assets/stylesheets/geo_works/related_works.scss +29 -0
  37. data/app/assets/stylesheets/geo_works/thumbnails.scss +13 -0
  38. data/app/controllers/concerns/geo_works/events_behavior.rb +29 -0
  39. data/app/controllers/concerns/geo_works/file_sets_controller_behavior.rb +31 -0
  40. data/app/controllers/concerns/geo_works/geoblacklight_controller_behavior.rb +29 -0
  41. data/app/controllers/concerns/geo_works/image_works_controller_behavior.rb +9 -0
  42. data/app/controllers/concerns/geo_works/raster_works_controller_behavior.rb +9 -0
  43. data/app/controllers/concerns/geo_works/vector_works_controller_behavior.rb +9 -0
  44. data/app/forms/geo_works/basic_geo_metadata_form.rb +9 -0
  45. data/app/forms/geo_works/external_metadata_file_form.rb +8 -0
  46. data/app/forms/geo_works/georeferenced_form.rb +9 -0
  47. data/app/forms/hyrax/image_work_form.rb +7 -0
  48. data/app/forms/hyrax/raster_work_form.rb +8 -0
  49. data/app/forms/hyrax/vector_work_form.rb +8 -0
  50. data/app/helpers/geo_works/application_helper.rb +4 -0
  51. data/app/helpers/geo_works/bounding_box_helper.rb +73 -0
  52. data/app/helpers/geo_works/file_set_actions_helper.rb +31 -0
  53. data/app/helpers/geo_works/geo_works_helper.rb +22 -0
  54. data/app/helpers/geo_works/populate_metadata_helper.rb +7 -0
  55. data/app/jobs/geoblacklight_job.rb +10 -0
  56. data/app/jobs/geoserver_delivery_job.rb +36 -0
  57. data/app/models/concerns/geo_works/ability.rb +12 -0
  58. data/app/models/concerns/geo_works/basic_geo_metadata.rb +21 -0
  59. data/app/models/concerns/geo_works/external_metadata_file_behavior.rb +31 -0
  60. data/app/models/concerns/geo_works/extractors/fgdc_helper.rb +9 -0
  61. data/app/models/concerns/geo_works/extractors/fgdc_metadata_extractor.rb +114 -0
  62. data/app/models/concerns/geo_works/extractors/iso19139_helper.rb +50 -0
  63. data/app/models/concerns/geo_works/extractors/mods_helper.rb +15 -0
  64. data/app/models/concerns/geo_works/file_set_metadata.rb +15 -0
  65. data/app/models/concerns/geo_works/file_set_presenter_behavior.rb +7 -0
  66. data/app/models/concerns/geo_works/geo_file_format_behavior.rb +37 -0
  67. data/app/models/concerns/geo_works/geo_file_set_behavior.rb +11 -0
  68. data/app/models/concerns/geo_works/georeferenced_behavior.rb +18 -0
  69. data/app/models/concerns/geo_works/image_file_behavior.rb +14 -0
  70. data/app/models/concerns/geo_works/image_work_behavior.rb +69 -0
  71. data/app/models/concerns/geo_works/metadata_extraction_helper.rb +27 -0
  72. data/app/models/concerns/geo_works/raster_file_behavior.rb +14 -0
  73. data/app/models/concerns/geo_works/raster_work_behavior.rb +82 -0
  74. data/app/models/concerns/geo_works/solr_document_behavior.rb +46 -0
  75. data/app/models/concerns/geo_works/vector_file_behavior.rb +14 -0
  76. data/app/models/concerns/geo_works/vector_work_behavior.rb +78 -0
  77. data/app/presenters/geo_works/geo_works_show_presenter.rb +48 -0
  78. data/app/presenters/geo_works/image_work_show_presenter.rb +5 -0
  79. data/app/presenters/geo_works/raster_work_show_presenter.rb +5 -0
  80. data/app/presenters/geo_works/vector_work_show_presenter.rb +5 -0
  81. data/app/processors/geo_works/geoblacklight_event_processor.rb +29 -0
  82. data/app/processors/geo_works/geoblacklight_event_processor/delete_processor.rb +13 -0
  83. data/app/processors/geo_works/geoblacklight_event_processor/processor.rb +28 -0
  84. data/app/processors/geo_works/geoblacklight_event_processor/unknown_event.rb +15 -0
  85. data/app/processors/geo_works/geoblacklight_event_processor/update_processor.rb +15 -0
  86. data/app/processors/geo_works/processors/base_geo_processor.rb +81 -0
  87. data/app/processors/geo_works/processors/gdal.rb +49 -0
  88. data/app/processors/geo_works/processors/image.rb +66 -0
  89. data/app/processors/geo_works/processors/ogr.rb +19 -0
  90. data/app/processors/geo_works/processors/raster.rb +26 -0
  91. data/app/processors/geo_works/processors/raster/aig.rb +40 -0
  92. data/app/processors/geo_works/processors/raster/base.rb +41 -0
  93. data/app/processors/geo_works/processors/raster/dem.rb +29 -0
  94. data/app/processors/geo_works/processors/raster/info.rb +52 -0
  95. data/app/processors/geo_works/processors/rendering.rb +79 -0
  96. data/app/processors/geo_works/processors/vector.rb +24 -0
  97. data/app/processors/geo_works/processors/vector/base.rb +44 -0
  98. data/app/processors/geo_works/processors/vector/info.rb +84 -0
  99. data/app/processors/geo_works/processors/vector/shapefile.rb +20 -0
  100. data/app/processors/geo_works/processors/zip.rb +29 -0
  101. data/app/renderers/geo_works/coverage_renderer.rb +39 -0
  102. data/app/runners/geo_works/runners/raster_derivatives.rb +9 -0
  103. data/app/runners/geo_works/runners/vector_derivatives.rb +9 -0
  104. data/app/schemas/geo_works/basic_geo_metadata_optional.rb +40 -0
  105. data/app/schemas/geo_works/basic_geo_metadata_required.rb +25 -0
  106. data/app/schemas/geo_works/file_set_metadata_required.rb +5 -0
  107. data/app/services/geo_works/authority_service.rb +29 -0
  108. data/app/services/geo_works/delivery/geoserver.rb +118 -0
  109. data/app/services/geo_works/delivery_service.rb +11 -0
  110. data/app/services/geo_works/discovery.rb +4 -0
  111. data/app/services/geo_works/discovery/abstract_document.rb +37 -0
  112. data/app/services/geo_works/discovery/document_builder.rb +46 -0
  113. data/app/services/geo_works/discovery/document_builder/basic_metadata_builder.rb +71 -0
  114. data/app/services/geo_works/discovery/document_builder/composite_builder.rb +21 -0
  115. data/app/services/geo_works/discovery/document_builder/date_builder.rb +53 -0
  116. data/app/services/geo_works/discovery/document_builder/document_helper.rb +10 -0
  117. data/app/services/geo_works/discovery/document_builder/document_path.rb +91 -0
  118. data/app/services/geo_works/discovery/document_builder/layer_info_builder.rb +65 -0
  119. data/app/services/geo_works/discovery/document_builder/references_builder.rb +101 -0
  120. data/app/services/geo_works/discovery/document_builder/slug_builder.rb +24 -0
  121. data/app/services/geo_works/discovery/document_builder/spatial_builder.rb +37 -0
  122. data/app/services/geo_works/discovery/document_builder/wxs.rb +76 -0
  123. data/app/services/geo_works/discovery/geoblacklight_document.rb +152 -0
  124. data/app/services/geo_works/events_generator.rb +24 -0
  125. data/app/services/geo_works/events_generator/composite_generator.rb +18 -0
  126. data/app/services/geo_works/events_generator/geoblacklight_event_generator.rb +53 -0
  127. data/app/services/geo_works/events_generator/geoserver_event_generator.rb +33 -0
  128. data/app/services/geo_works/file_set_derivatives_service.rb +67 -0
  129. data/app/services/geo_works/image_format_service.rb +6 -0
  130. data/app/services/geo_works/metadata_format_service.rb +6 -0
  131. data/app/services/geo_works/raster_format_service.rb +6 -0
  132. data/app/services/geo_works/vector_format_service.rb +6 -0
  133. data/app/services/hyrax/curation_concern.rb +18 -0
  134. data/app/values/geo_works/coverage.rb +36 -0
  135. data/app/values/geo_works/time_period.rb +30 -0
  136. data/app/views/geo_works/_attribute_rows.html.erb +4 -0
  137. data/app/views/geo_works/_form_progress.html.erb +50 -0
  138. data/app/views/geo_works/_guts4form.html.erb +47 -0
  139. data/app/views/geo_works/_member.html.erb +11 -0
  140. data/app/views/geo_works/_metadata.html.erb +13 -0
  141. data/app/views/geo_works/_relationships.html.erb +12 -0
  142. data/app/views/geo_works/_representative_media.html.erb +5 -0
  143. data/app/views/geo_works/file_sets/_form.html.erb +48 -0
  144. data/app/views/geo_works/file_sets/actions/_default_actions.html.erb +16 -0
  145. data/app/views/geo_works/file_sets/actions/_image_actions.html.erb +22 -0
  146. data/app/views/geo_works/file_sets/actions/_metadata_actions.html.erb +16 -0
  147. data/app/views/geo_works/file_sets/actions/_raster_actions.html.erb +25 -0
  148. data/app/views/geo_works/file_sets/actions/_vector_actions.html.erb +25 -0
  149. data/app/views/geo_works/file_sets/media_display/_geo.html.erb +16 -0
  150. data/app/views/geo_works/file_sets/new.html.erb +12 -0
  151. data/app/views/geo_works/related/_child_member.html.erb +13 -0
  152. data/app/views/geo_works/related/_child_works.html.erb +24 -0
  153. data/app/views/geo_works/related/_external_metadata_file_member.html.erb +11 -0
  154. data/app/views/geo_works/related/_external_metadata_files.html.erb +24 -0
  155. data/app/views/geo_works/related/_geo_files.html.erb +24 -0
  156. data/app/views/geo_works/related/_new_child_member.html.erb +22 -0
  157. data/app/views/geo_works/related/_new_parent_member.html.erb +13 -0
  158. data/app/views/geo_works/related/_parent_member.html.erb +13 -0
  159. data/app/views/geo_works/related/_parent_works.html.erb +22 -0
  160. data/app/views/hyrax/image_works/_file_actions.html.erb +8 -0
  161. data/app/views/hyrax/image_works/_form.html.erb +16 -0
  162. data/app/views/hyrax/image_works/_image_actions.html.erb +11 -0
  163. data/app/views/hyrax/image_works/_image_work.html.erb +2 -0
  164. data/app/views/hyrax/image_works/_show_actions.html.erb +22 -0
  165. data/app/views/hyrax/image_works/show.html.erb +31 -0
  166. data/app/views/hyrax/raster_works/_file_actions.html.erb +8 -0
  167. data/app/views/hyrax/raster_works/_form.html.erb +16 -0
  168. data/app/views/hyrax/raster_works/_raster_actions.html.erb +11 -0
  169. data/app/views/hyrax/raster_works/_raster_work.html.erb +2 -0
  170. data/app/views/hyrax/raster_works/_show_actions.html.erb +22 -0
  171. data/app/views/hyrax/raster_works/show.html.erb +31 -0
  172. data/app/views/hyrax/vector_works/_file_actions.html.erb +8 -0
  173. data/app/views/hyrax/vector_works/_form.html.erb +16 -0
  174. data/app/views/hyrax/vector_works/_show_actions.html.erb +22 -0
  175. data/app/views/hyrax/vector_works/_vector_actions.html.erb +11 -0
  176. data/app/views/hyrax/vector_works/_vector_work.html.erb +2 -0
  177. data/app/views/hyrax/vector_works/show.html.erb +31 -0
  178. data/app/views/records/edit_fields/_coverage.html.erb +3 -0
  179. data/app/views/records/edit_fields/_should_populate_metadata.html.erb +10 -0
  180. data/app/vocabs/geo_works/geo_terms.rb +12 -0
  181. data/config/discovery/geoblacklight-schema.json +214 -0
  182. data/config/fcrepo_wrapper_test.yml +3 -0
  183. data/config/geoblacklight.yml +12 -0
  184. data/config/geoserver.yml +27 -0
  185. data/config/initializers/geo_server.rb +17 -0
  186. data/config/initializers/geoblacklight_config.rb +18 -0
  187. data/config/initializers/simpler_tiles.rb +65 -0
  188. data/config/locales/image_work.en.yml +8 -0
  189. data/config/locales/raster_work.en.yml +8 -0
  190. data/config/locales/vector_work.en.yml +8 -0
  191. data/config/routes.rb +24 -0
  192. data/config/simpler_tiles.yml +24 -0
  193. data/config/solr_wrapper_test.yml +7 -0
  194. data/docker-compose-full.yml +30 -0
  195. data/docker-compose.yml +9 -0
  196. data/geo_works.gemspec +44 -0
  197. data/lib/generators/geo_works/install_generator.rb +152 -0
  198. data/lib/generators/geo_works/templates/actors/hyrax/actors/image_work_actor.rb +6 -0
  199. data/lib/generators/geo_works/templates/actors/hyrax/actors/raster_work_actor.rb +6 -0
  200. data/lib/generators/geo_works/templates/actors/hyrax/actors/vector_work_actor.rb +6 -0
  201. data/lib/generators/geo_works/templates/config/authorities/image_formats.yml +7 -0
  202. data/lib/generators/geo_works/templates/config/authorities/metadata_formats.yml +7 -0
  203. data/lib/generators/geo_works/templates/config/authorities/raster_formats.yml +13 -0
  204. data/lib/generators/geo_works/templates/config/authorities/vector_formats.yml +7 -0
  205. data/lib/generators/geo_works/templates/config/initializers/hyrax_derivative_path_monkey_patch.rb +18 -0
  206. data/lib/generators/geo_works/templates/controllers/hyrax/file_sets_controller.rb +7 -0
  207. data/lib/generators/geo_works/templates/controllers/hyrax/image_works_controller.rb +7 -0
  208. data/lib/generators/geo_works/templates/controllers/hyrax/raster_works_controller.rb +8 -0
  209. data/lib/generators/geo_works/templates/controllers/hyrax/vector_works_controller.rb +8 -0
  210. data/lib/generators/geo_works/templates/geo_works.js +1 -0
  211. data/lib/generators/geo_works/templates/geo_works.scss +3 -0
  212. data/lib/generators/geo_works/templates/models/file_set.rb +4 -0
  213. data/lib/generators/geo_works/templates/models/image_work.rb +7 -0
  214. data/lib/generators/geo_works/templates/models/raster_work.rb +8 -0
  215. data/lib/generators/geo_works/templates/models/vector_work.rb +8 -0
  216. data/lib/generators/geo_works/templates/presenters/file_set_presenter.rb +3 -0
  217. data/lib/generators/geo_works/templates/spec/actor_spec.rb.erb +9 -0
  218. data/lib/generators/geo_works/templates/spec/controller_spec.rb.erb +9 -0
  219. data/lib/generators/geo_works/templates/spec/model_spec.rb.erb +9 -0
  220. data/lib/geo_works.rb +9 -0
  221. data/lib/geo_works/engine.rb +4 -0
  222. data/lib/geo_works/version.rb +3 -0
  223. data/lib/tasks/geo_works_tasks.rake +4 -0
  224. data/run-docker.sh +16 -0
  225. data/solr/config/_rest_managed.json +3 -0
  226. data/solr/config/admin-extra.html +31 -0
  227. data/solr/config/elevate.xml +36 -0
  228. data/solr/config/mapping-ISOLatin1Accent.txt +246 -0
  229. data/solr/config/protwords.txt +21 -0
  230. data/solr/config/schema.xml +372 -0
  231. data/solr/config/scripts.conf +24 -0
  232. data/solr/config/solrconfig.xml +321 -0
  233. data/solr/config/spellings.txt +2 -0
  234. data/solr/config/stopwords.txt +58 -0
  235. data/solr/config/stopwords_en.txt +58 -0
  236. data/solr/config/synonyms.txt +31 -0
  237. data/solr/config/xslt/example.xsl +132 -0
  238. data/solr/config/xslt/example_atom.xsl +67 -0
  239. data/solr/config/xslt/example_rss.xsl +66 -0
  240. data/solr/config/xslt/luke.xsl +337 -0
  241. data/spec/controllers/file_sets_controller_spec.rb +70 -0
  242. data/spec/controllers/image_works_controller_spec.rb +40 -0
  243. data/spec/controllers/raster_works_controller_spec.rb +36 -0
  244. data/spec/controllers/vector_works_controller_spec.rb +69 -0
  245. data/spec/factories/collections.rb +17 -0
  246. data/spec/factories/external_metadata_files.rb +20 -0
  247. data/spec/factories/image_files.rb +32 -0
  248. data/spec/factories/image_works.rb +69 -0
  249. data/spec/factories/permission_templates.rb +41 -0
  250. data/spec/factories/raster_files.rb +35 -0
  251. data/spec/factories/raster_works.rb +88 -0
  252. data/spec/factories/sipity_entities.rb +7 -0
  253. data/spec/factories/users.rb +26 -0
  254. data/spec/factories/vector_files.rb +31 -0
  255. data/spec/factories/vector_works.rb +84 -0
  256. data/spec/factories/workflow_states.rb +6 -0
  257. data/spec/factories/workflows.rb +6 -0
  258. data/spec/features/create_image_work_spec.rb +34 -0
  259. data/spec/features/create_raster_work_spec.rb +35 -0
  260. data/spec/features/create_vector_work_spec.rb +34 -0
  261. data/spec/features/image_work_show_spec.rb +62 -0
  262. data/spec/features/raster_work_show_spec.rb +62 -0
  263. data/spec/features/vector_work_show_spec.rb +61 -0
  264. data/spec/forms/geo_works/basic_geo_metadata_form_spec.rb +31 -0
  265. data/spec/forms/geo_works/external_metadata_file_form_spec.rb +30 -0
  266. data/spec/forms/geo_works/georeferenced_form_spec.rb +33 -0
  267. data/spec/forms/hyrax/image_work_form_spec.rb +11 -0
  268. data/spec/forms/hyrax/raster_work_form_spec.rb +17 -0
  269. data/spec/forms/hyrax/vector_work_form_spec.rb +17 -0
  270. data/spec/helpers/bounding_box_helper_spec.rb +39 -0
  271. data/spec/helpers/geo_works/file_set_actions_helper_spec.rb +70 -0
  272. data/spec/helpers/geo_works/populate_metadata_helper_spec.rb +31 -0
  273. data/spec/helpers/geo_works_helper_spec.rb +30 -0
  274. data/spec/jobs/geoblacklight_job_spec.rb +18 -0
  275. data/spec/jobs/geoserver_delivery_job_spec.rb +45 -0
  276. data/spec/models/concerns/basic_geo_metadata_spec.rb +21 -0
  277. data/spec/models/concerns/geo_works/file_set/derivatives_spec.rb +102 -0
  278. data/spec/models/concerns/geo_works/file_set/geo_file_format_behavior_spec.rb +56 -0
  279. data/spec/models/external_metadata_file_spec.rb +118 -0
  280. data/spec/models/file_set_spec.rb +9 -0
  281. data/spec/models/image_file_spec.rb +48 -0
  282. data/spec/models/image_work_spec.rb +71 -0
  283. data/spec/models/raster_file_spec.rb +48 -0
  284. data/spec/models/raster_work_spec.rb +122 -0
  285. data/spec/models/solr_document_spec.rb +41 -0
  286. data/spec/models/vector_file_spec.rb +48 -0
  287. data/spec/models/vector_work_spec.rb +109 -0
  288. data/spec/presenters/file_set_presenter_spec.rb +13 -0
  289. data/spec/presenters/geo_works_show_presenter_spec.rb +46 -0
  290. data/spec/presenters/image_work_show_presenter_spec.rb +51 -0
  291. data/spec/presenters/raster_work_show_presenter_spec.rb +74 -0
  292. data/spec/presenters/vector_work_show_presenter_spec.rb +41 -0
  293. data/spec/processors/geo_works/geoblacklight_event_processor_spec.rb +80 -0
  294. data/spec/processors/geo_works/processors/base_geo_processor_spec.rb +115 -0
  295. data/spec/processors/geo_works/processors/gdal_spec.rb +59 -0
  296. data/spec/processors/geo_works/processors/image_spec.rb +64 -0
  297. data/spec/processors/geo_works/processors/ogr_spec.rb +36 -0
  298. data/spec/processors/geo_works/processors/raster/aig_spec.rb +35 -0
  299. data/spec/processors/geo_works/processors/raster/base_spec.rb +54 -0
  300. data/spec/processors/geo_works/processors/raster/dem_spec.rb +30 -0
  301. data/spec/processors/geo_works/processors/raster/info_spec.rb +35 -0
  302. data/spec/processors/geo_works/processors/raster/processor_spec.rb +39 -0
  303. data/spec/processors/geo_works/processors/rendering_spec.rb +64 -0
  304. data/spec/processors/geo_works/processors/vector/base_spec.rb +54 -0
  305. data/spec/processors/geo_works/processors/vector/info_spec.rb +50 -0
  306. data/spec/processors/geo_works/processors/vector/processor_spec.rb +28 -0
  307. data/spec/processors/geo_works/processors/vector/shapefile_spec.rb +17 -0
  308. data/spec/processors/geo_works/processors/zip_spec.rb +39 -0
  309. data/spec/renderers/geo_works/coverage_renderer_spec.rb +21 -0
  310. data/spec/services/geo_works/delivery/geoserver_spec.rb +117 -0
  311. data/spec/services/geo_works/delivery_service_spec.rb +24 -0
  312. data/spec/services/geo_works/discovery/abstract_document_spec.rb +23 -0
  313. data/spec/services/geo_works/discovery/document_builder/basic_metadata_builder_spec.rb +35 -0
  314. data/spec/services/geo_works/discovery/document_builder/wxs_spec.rb +71 -0
  315. data/spec/services/geo_works/discovery/document_builder_spec.rb +220 -0
  316. data/spec/services/geo_works/discovery/geoblacklight_document_spec.rb +20 -0
  317. data/spec/services/geo_works/event_generator_spec.rb +18 -0
  318. data/spec/services/geo_works/events_generator/geoblacklight_event_generator_spec.rb +84 -0
  319. data/spec/services/geo_works/events_generator/geoserver_event_generator_spec.rb +22 -0
  320. data/spec/services/geo_works/raster_format_service_spec.rb +13 -0
  321. data/spec/services/hyrax/derivative_path_spec.rb +26 -0
  322. data/spec/spec_helper.rb +77 -0
  323. data/spec/support/backport_test.rb +14 -0
  324. data/spec/support/controllers/engine_helpers.rb +7 -0
  325. data/spec/support/database_cleaner.rb +18 -0
  326. data/spec/support/factory_girl.rb +3 -0
  327. data/spec/support/features.rb +14 -0
  328. data/spec/support/features/session_helpers.rb +40 -0
  329. data/spec/support/fixture_reader.rb +7 -0
  330. data/spec/support/helpers/controller_level_helpers.rb +27 -0
  331. data/spec/support/views/test_view_helpers.rb +10 -0
  332. data/spec/test_app_templates/lib/generators/test_app_generator.rb +24 -0
  333. data/spec/values/coverage_spec.rb +40 -0
  334. data/tasks/geo_works.rake +39 -0
  335. data/template.rb +10 -0
  336. metadata +789 -0
@@ -0,0 +1,152 @@
1
+ require 'json-schema'
2
+ require 'open-uri'
3
+
4
+ module GeoWorks
5
+ module Discovery
6
+ # For details on the schema,
7
+ # @see 'https://github.com/geoblacklight/geoblacklight/wiki/Schema'
8
+ class GeoblacklightDocument < AbstractDocument
9
+ # Implements the to_hash method on the abstract document.
10
+ # @param _args [Array<Object>] arguments needed for the renderer, unused here
11
+ # @return [Hash] geoblacklight document as a hash
12
+ def to_hash(_args = nil)
13
+ return {} unless rights
14
+ document
15
+ end
16
+
17
+ # Implements the to_json method on the abstract document.
18
+ # @param _args [Array<Object>] arguments needed for the json renderer, unused here
19
+ # @return [String] geoblacklight document as a json string
20
+ def to_json(_args = nil)
21
+ return '{}' unless rights
22
+ document.to_json
23
+ end
24
+
25
+ private
26
+
27
+ # Builds the geoblacklight document hash.
28
+ # @return [Hash] geoblacklight document as a hash
29
+ def document_hash
30
+ document_hash_required.merge(document_hash_optional)
31
+ end
32
+
33
+ def document_hash_required
34
+ {
35
+ geoblacklight_version: '1.0',
36
+ dc_identifier_s: identifier,
37
+ layer_slug_s: slug,
38
+ uuid: slug,
39
+ dc_title_s: title.first,
40
+ solr_geom: solr_coverage,
41
+ dct_provenance_s: provenance,
42
+ dc_rights_s: rights
43
+ }
44
+ end
45
+
46
+ # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
47
+ def document_hash_optional
48
+ {
49
+ dc_description_s: description,
50
+ dc_creator_sm: creator,
51
+ dc_language_s: language.try(:first),
52
+ dc_publisher_s: publisher.try(:first),
53
+ dc_subject_sm: subject,
54
+ dct_spatial_sm: spatial,
55
+ dct_temporal_sm: temporal,
56
+ solr_year_i: layer_year,
57
+ layer_modified_dt: layer_modified,
58
+ layer_id_s: layer_id,
59
+ dct_references_s: clean_document(references).to_json.to_s,
60
+ layer_geom_type_s: geom_type,
61
+ dc_format_s: process_format_codes(format),
62
+ dct_issued_dt: issued
63
+ }
64
+ end
65
+ # rubocop:enable Metrics/LineLength, Metrics/AbcSize
66
+
67
+ # Builds the dct_references hash.
68
+ # @return [Hash] geoblacklight references as a hash
69
+ def references
70
+ {
71
+ 'http://schema.org/url' => url,
72
+ 'http://www.opengis.net/cat/csw/csdgm' => fgdc,
73
+ 'http://www.isotc211.org/schemas/2005/gmd/' => iso19139,
74
+ 'http://www.loc.gov/mods/v3' => mods,
75
+ 'http://schema.org/downloadUrl' => download,
76
+ 'http://schema.org/thumbnailUrl' => thumbnail,
77
+ 'http://www.opengis.net/def/serviceType/ogc/wms' => wms_path,
78
+ 'http://www.opengis.net/def/serviceType/ogc/wfs' => wfs_path
79
+ }
80
+ end
81
+
82
+ # Returns the geoblacklight rights field based on work visibility.
83
+ # @return [String] geoblacklight access rights
84
+ def rights
85
+ case access_rights
86
+ when Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_PUBLIC
87
+ 'Public'
88
+ when Hydra::AccessControls::AccessRight::VISIBILITY_TEXT_VALUE_AUTHENTICATED
89
+ 'Restricted'
90
+ end
91
+ end
92
+
93
+ # Transforms shapfile, tiff, and arc grid format codes into geoblacklight format codes.
94
+ # @return [String] geoblacklight format codes
95
+ def process_format_codes(format)
96
+ case format
97
+ when 'ESRI Shapefile'
98
+ 'Shapefile'
99
+ when 'GTiff'
100
+ 'GeoTIFF'
101
+ when 'AIG'
102
+ 'ArcGRID'
103
+ else
104
+ format
105
+ end
106
+ end
107
+
108
+ # Returns the content of geoblacklight JSON-Schema document.
109
+ # @return [Hash] geoblacklight json schema
110
+ def schema
111
+ JSON.parse(File.read(schema_path))
112
+ end
113
+
114
+ # Returns a path to the geoblackligh schema document
115
+ # @return [String]
116
+ def schema_path
117
+ File.join(GeoWorks.root, 'config', 'discovery', 'geoblacklight-schema.json')
118
+ end
119
+
120
+ # Validates the geoblacklight document against the json schema.
121
+ # @return [Boolean] is the document valid?
122
+ def valid?(doc)
123
+ JSON::Validator.validate(schema, doc, fragment: '#/definitions/layer')
124
+ end
125
+
126
+ # Returns a hash of errors from json schema validation.
127
+ # @return [Hash] json schema validation errors
128
+ def schema_errors(doc)
129
+ { error: JSON::Validator.fully_validate(schema, doc, fragment: '#/definitions/layer') }
130
+ end
131
+
132
+ # Cleans the geoblacklight document hash by removing unused fields,
133
+ # then validates it again a json schema. If there are errors, an
134
+ # error hash is returned, otherwise, the cleaned doc is returned.
135
+ # @return [Hash] geoblacklight document hash or error hash
136
+ def document
137
+ clean = clean_document(document_hash)
138
+ if valid?(clean)
139
+ clean
140
+ else
141
+ schema_errors(clean)
142
+ end
143
+ end
144
+
145
+ # Use identifier as layer_id id when there is no wxs_identifier.
146
+ # Causes errors in Geoblacklight views.
147
+ def layer_id
148
+ wxs_identifier || identifier
149
+ end
150
+ end
151
+ end
152
+ end
@@ -0,0 +1,24 @@
1
+ module GeoWorks
2
+ class EventsGenerator
3
+ class_attribute :services
4
+
5
+ # Array of event generator services.
6
+ # - GeoblacklightEventGenerator: synchronizes with geoblacklight instance.
7
+ # - GeoserverEventGenerator: synchronizes with geoserver instance.
8
+ self.services = [
9
+ GeoblacklightEventGenerator,
10
+ GeoserverEventGenerator
11
+ ]
12
+
13
+ delegate :record_created, to: :generators
14
+ delegate :record_deleted, to: :generators
15
+ delegate :record_updated, to: :generators
16
+ delegate :derivatives_created, to: :generators
17
+
18
+ def generators
19
+ @generators ||= CompositeGenerator.new(
20
+ services.map(&:new)
21
+ )
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,18 @@
1
+ module GeoWorks
2
+ class EventsGenerator
3
+ class CompositeGenerator
4
+ attr_reader :generators
5
+
6
+ def initialize(generators)
7
+ @generators = generators
8
+ end
9
+
10
+ def method_missing(m, *args)
11
+ generators.each do |generator|
12
+ next unless generator.respond_to? m
13
+ generator.send(m, args.first)
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,53 @@
1
+ module GeoWorks
2
+ class EventsGenerator
3
+ class GeoblacklightEventGenerator
4
+ def record_created(record)
5
+ publish_message(
6
+ message("CREATED", record)
7
+ )
8
+ end
9
+
10
+ def record_deleted(record)
11
+ publish_message(
12
+ delete_message("DELETED", record)
13
+ )
14
+ end
15
+
16
+ def record_updated(record)
17
+ publish_message(
18
+ message("UPDATED", record)
19
+ )
20
+ end
21
+
22
+ private
23
+
24
+ def publish_message(message)
25
+ GeoblacklightJob.perform_later(message)
26
+ end
27
+
28
+ def message(type, record)
29
+ base_message(type, record).merge("doc" => generate_document(record).to_hash)
30
+ end
31
+
32
+ def delete_message(type, record)
33
+ base_message(type, record).merge("id" => slug(record))
34
+ end
35
+
36
+ def base_message(type, record)
37
+ {
38
+ "id" => record.id,
39
+ "event" => type
40
+ }
41
+ end
42
+
43
+ def generate_document(record)
44
+ Discovery::DocumentBuilder.new(record, Discovery::GeoblacklightDocument.new)
45
+ end
46
+
47
+ def slug(record)
48
+ return record.id unless record.respond_to?(:provenance)
49
+ "#{record.provenance.parameterize}-#{record.id}"
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,33 @@
1
+ module GeoWorks
2
+ class EventsGenerator
3
+ class GeoserverEventGenerator
4
+ def derivatives_created(record)
5
+ return unless geo_file_set?(record)
6
+ publish_message(
7
+ message("CREATED", record)
8
+ )
9
+ end
10
+
11
+ private
12
+
13
+ def publish_message(message)
14
+ GeoserverDeliveryJob.perform_later(message)
15
+ end
16
+
17
+ def message(type, record)
18
+ base_message(type, record)
19
+ end
20
+
21
+ def base_message(type, record)
22
+ {
23
+ "id" => record.id,
24
+ "event" => type
25
+ }
26
+ end
27
+
28
+ def geo_file_set?(record)
29
+ record.respond_to?(:geo_file_format?) && record.geo_file_format?
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,67 @@
1
+ module GeoWorks
2
+ class FileSetDerivativesService < Hyrax::FileSetDerivativesService
3
+ attr_reader :file_set
4
+ delegate :id, :geo_mime_type, to: :file_set
5
+
6
+ def initialize(file_set)
7
+ @file_set = file_set
8
+ end
9
+
10
+ def valid?
11
+ supported_geo_mime_types.include?(geo_mime_type)
12
+ end
13
+
14
+ def create_derivatives(filename)
15
+ case geo_mime_type
16
+ when *GeoWorks::RasterFormatService.select_options.map(&:last)
17
+ create_raster_derivatives(filename)
18
+ when *GeoWorks::VectorFormatService.select_options.map(&:last)
19
+ create_vector_derivatives(filename)
20
+ end
21
+
22
+ # Once all the derivatives are created, send a created message
23
+ geo_works_events_generator.derivatives_created(file_set)
24
+ end
25
+
26
+ private
27
+
28
+ def create_raster_derivatives(filename)
29
+ GeoWorks::Runners::RasterDerivatives
30
+ .create(filename, outputs: [{ input_format: geo_mime_type,
31
+ label: :display_raster,
32
+ id: id,
33
+ format: 'tif',
34
+ url: derivative_url('display_raster') },
35
+ { input_format: geo_mime_type,
36
+ label: :thumbnail,
37
+ id: id,
38
+ format: 'png',
39
+ size: '200x150',
40
+ url: derivative_url('thumbnail') }])
41
+ end
42
+
43
+ def create_vector_derivatives(filename)
44
+ GeoWorks::Runners::VectorDerivatives
45
+ .create(filename, outputs: [{ input_format: geo_mime_type,
46
+ label: :display_vector,
47
+ id: id,
48
+ format: 'zip',
49
+ url: derivative_url('display_vector') },
50
+ { input_format: geo_mime_type,
51
+ label: :thumbnail,
52
+ id: id,
53
+ format: 'png',
54
+ size: '200x150',
55
+ url: derivative_url('thumbnail') }])
56
+ end
57
+
58
+ def supported_geo_mime_types
59
+ GeoWorks::RasterFormatService.select_options.map(&:last) +
60
+ GeoWorks::VectorFormatService.select_options.map(&:last)
61
+ end
62
+
63
+ def geo_works_events_generator
64
+ @geo_works_events_generator ||= GeoWorks::EventsGenerator.new
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,6 @@
1
+ module GeoWorks
2
+ class ImageFormatService
3
+ include GeoWorks::AuthorityService
4
+ self.authority = Qa::Authorities::Local.subauthority_for('image_formats')
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ module GeoWorks
2
+ class MetadataFormatService
3
+ include GeoWorks::AuthorityService
4
+ self.authority = Qa::Authorities::Local.subauthority_for('metadata_formats')
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ module GeoWorks
2
+ class RasterFormatService
3
+ include GeoWorks::AuthorityService
4
+ self.authority = Qa::Authorities::Local.subauthority_for('raster_formats')
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ module GeoWorks
2
+ class VectorFormatService
3
+ include GeoWorks::AuthorityService
4
+ self.authority = Qa::Authorities::Local.subauthority_for('vector_formats')
5
+ end
6
+ end
@@ -0,0 +1,18 @@
1
+ module Hyrax
2
+ class CurationConcern
3
+ # This attribute is set by Hyrax::Engine
4
+ class_attribute :actor_factory
5
+
6
+ self.actor_factory = Hyrax::ActorFactory
7
+
8
+ # A consumer of this method can inject a different factory
9
+ # into this class in order to change the behavior of this method.
10
+ # @param [ActiveFedora::Base] curation_concern a work to be updated
11
+ # @param [Ability] current_ability the permission object for depositing this
12
+ # work.
13
+ # @return [#create, #update] an actor that can create and update the work
14
+ def self.actor(curation_concern, current_ability)
15
+ actor_factory.build(curation_concern, current_ability)
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,36 @@
1
+ module GeoWorks
2
+ class Coverage
3
+ class ParseError < StandardError; end
4
+ class InvalidGeometryError < StandardError; end
5
+
6
+ attr_reader :n, :e, :s, :w
7
+
8
+ def self.parse(str)
9
+ n = parse_coordinate(str, /northlimit=([\.\d\-]+);/)
10
+ e = parse_coordinate(str, /eastlimit=([\.\d\-]+);/)
11
+ s = parse_coordinate(str, /southlimit=([\.\d\-]+);/)
12
+ w = parse_coordinate(str, /westlimit=([\.\d\-]+);/)
13
+ raise ParseError, str if n.nil? || e.nil? || s.nil? || w.nil?
14
+ new(n, e, s, w)
15
+ rescue
16
+ nil
17
+ end
18
+
19
+ def self.parse_coordinate(str, regex)
20
+ Regexp.last_match(1).to_f if str =~ regex
21
+ end
22
+
23
+ def initialize(n, e, s, w)
24
+ raise InvalidGeometryError, "n=#{n} < s=#{s}" if n.to_f < s.to_f
25
+ raise InvalidGeometryError, "e=#{e} < w=#{w}" if e.to_f < w.to_f
26
+ @n = n
27
+ @e = e
28
+ @s = s
29
+ @w = w
30
+ end
31
+
32
+ def to_s
33
+ "northlimit=#{n}; eastlimit=#{e}; southlimit=#{s}; westlimit=#{w}; units=degrees; projection=EPSG:4326"
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,30 @@
1
+ module GeoWorks
2
+ class TimePeriod
3
+ attr_accessor :doc, :initial_value
4
+ def initialize(initial_value, doc)
5
+ @initial_value = initial_value || []
6
+ @doc = doc
7
+ end
8
+
9
+ def value
10
+ append_caldate
11
+ append_begdate
12
+ initial_value.uniq!
13
+ initial_value
14
+ end
15
+
16
+ private
17
+
18
+ def append_caldate
19
+ doc.at_xpath('//idinfo/timeperd/timeinfo/mdattim/sngdate/caldate | //idinfo/timeperd/timeinfo/sngdate/caldate').tap do |node|
20
+ initial_value << node.text[0..3] unless node.nil? # extract year only
21
+ end
22
+ end
23
+
24
+ def append_begdate
25
+ doc.at_xpath('//idinfo/timeperd/timeinfo/rngdates/begdate').tap do |node|
26
+ initial_value << node.text[0..3] unless node.nil? # extract year only
27
+ end
28
+ end
29
+ end
30
+ end