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,9 @@
1
+ module GeoWorks
2
+ module Runners
3
+ class RasterDerivatives < Hydra::Derivatives::Runner
4
+ def self.processor_class
5
+ GeoWorks::Processors::Raster::Processor
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module GeoWorks
2
+ module Runners
3
+ class VectorDerivatives < Hydra::Derivatives::Runner
4
+ def self.processor_class
5
+ GeoWorks::Processors::Vector::Processor
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,40 @@
1
+ module GeoWorks
2
+ class BasicGeoMetadataOptional < ActiveTriples::Schema
3
+ #
4
+ # The following properties are inherited from Curation Concerns' metadata
5
+ #
6
+ # @see https://github.com/projecthydra/hyrax/blob/v1.6.0/app/models/concerns/hyrax/basic_metadata.rb
7
+ # Optional:
8
+ # :contributor
9
+ # :creator
10
+ # :date_created (DC.created)
11
+ # :description
12
+ # :identifier
13
+ # :language
14
+ # :part_of
15
+ # :publisher
16
+ # :resource_type (DC.type)
17
+ # :rights (license)
18
+ # :rights
19
+ # :source
20
+ # :subject
21
+ # :tag (DC11.relation)
22
+ #
23
+
24
+ # Defines the placenames related to the layer
25
+ # @example
26
+ # image.spatial = [ 'France', 'Spain' ]
27
+ property :spatial, predicate: ::RDF::Vocab::DC.spatial
28
+
29
+ # Defines the temporal coverage of the layer
30
+ # @example
31
+ # vector.temporal = [ '1998-2006', 'circa 2000' ]
32
+ property :temporal, predicate: ::RDF::Vocab::DC.temporal
33
+
34
+ # Defines the issued date for the layer, using XML Schema dateTime format
35
+ # (YYYY-MM-DDThh:mm:ssZ).
36
+ # @example
37
+ # vector.issued = '2001-01-01T00:00:00Z'
38
+ property :issued, predicate: ::RDF::Vocab::DC.issued, multiple: false
39
+ end
40
+ end
@@ -0,0 +1,25 @@
1
+ module GeoWorks
2
+ class BasicGeoMetadataRequired < ActiveTriples::Schema
3
+ #
4
+ # The following properties are inherited from Curation Concerns' metadata
5
+ #
6
+ # @see https://github.com/projecthydra/hyrax/blob/v1.6.0/app/models/concerns/hyrax/required_metadata.rb
7
+ # Required:
8
+ # :title
9
+ # :date_uploaded (DC.dateSubmitted)
10
+ # :date_modified (DC.modified)
11
+ #
12
+
13
+ # Defines the bounding box for the layer.
14
+ # We always assert units of decimal degrees and EPSG:4326 projection.
15
+ # @see http://dublincore.org/documents/dcmi-box/
16
+ # @example
17
+ # vector.coverage = 'northlimit=43.039; eastlimit=-69.856; southlimit=42.943; westlimit=-71.032; units=degrees; projection=EPSG:4326'
18
+ property :coverage, predicate: ::RDF::Vocab::DC11.coverage, multiple: false
19
+
20
+ # Defines the institution which holds the layer
21
+ # @example
22
+ # raster.provenance = 'Stanford University'
23
+ property :provenance, predicate: ::RDF::Vocab::DC.provenance, multiple: false
24
+ end
25
+ end
@@ -0,0 +1,5 @@
1
+ module GeoWorks
2
+ class FileSetMetadataRequired < ActiveTriples::Schema
3
+ property :geo_mime_type, predicate: RDF::Vocab::EBUCore.hasMimeType, multiple: false
4
+ end
5
+ end
@@ -0,0 +1,29 @@
1
+ module GeoWorks
2
+ module AuthorityService
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ mattr_accessor :authority
7
+ end
8
+
9
+ class_methods do
10
+ def select_options
11
+ authority.all.map do |element|
12
+ [element[:label], element[:id]]
13
+ end
14
+ end
15
+
16
+ def label(id)
17
+ (authority.find(id) || {}).fetch('term', nil)
18
+ end
19
+
20
+ def code(id)
21
+ (authority.find(id) || {}).fetch('code', nil)
22
+ end
23
+
24
+ def include?(id)
25
+ !authority.find(id).nil? && !authority.find(id).empty?
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,118 @@
1
+ require 'active_support/core_ext/hash/indifferent_access'
2
+ require 'rgeoserver'
3
+ require 'yaml'
4
+ require 'erb'
5
+
6
+ module GeoWorks
7
+ module Delivery
8
+ class Geoserver
9
+ attr_reader :config, :workspace_name, :file_set, :file_path
10
+
11
+ def initialize(file_set, file_path)
12
+ @file_set = file_set
13
+ @file_path = file_path
14
+ @config = fetch_config
15
+ @workspace_name = @config[:workspace]
16
+ validate!
17
+ end
18
+
19
+ def catalog
20
+ @catalog ||= RGeoServer.catalog(config)
21
+ end
22
+
23
+ def publish
24
+ case type
25
+ when :vector
26
+ publish_vector
27
+ when :raster
28
+ publish_raster
29
+ end
30
+ rescue StandardError => e
31
+ Rails.logger.error("GeoServer delivery job failed with: #{e}")
32
+ end
33
+
34
+ private
35
+
36
+ def fetch_config
37
+ raise ArgumentError, "FileSet visibility must be open or authenticated" unless visibility
38
+ GeoWorks::GeoServer.config[visibility]
39
+ end
40
+
41
+ def visibility
42
+ return file_set.visibility if file_set.visibility == 'open'
43
+ return file_set.visibility if file_set.visibility == 'authenticated'
44
+ end
45
+
46
+ def validate!
47
+ %w(url user password).map(&:to_sym).each do |k|
48
+ raise ArgumentError, "Missing #{k} in configuration" unless config[k].present?
49
+ end
50
+ end
51
+
52
+ def type
53
+ return :vector if file_path =~ /\.zip$/
54
+ return :raster if file_path =~ /\.tif$/
55
+ raise ArgumentError, "Not a ZIPed Shapefile or GeoTIFF: #{file_path}"
56
+ end
57
+
58
+ def workspace
59
+ workspace = RGeoServer::Workspace.new catalog, name: workspace_name
60
+ workspace.save if workspace.new?
61
+ workspace
62
+ end
63
+
64
+ def datastore
65
+ @datastore ||= RGeoServer::DataStore.new catalog, workspace: workspace,
66
+ name: file_set.id
67
+ end
68
+
69
+ def coveragestore
70
+ @coveragestore ||= RGeoServer::CoverageStore.new catalog, workspace: workspace,
71
+ name: file_set.id
72
+ end
73
+
74
+ def base_path(path)
75
+ path.gsub(Hyrax.config.derivatives_path.to_s, '')
76
+ end
77
+
78
+ def shapefile_dir
79
+ "#{File.dirname(file_path)}/#{File.basename(file_path, '.zip')}"
80
+ end
81
+
82
+ def persist_coveragestore
83
+ url = "file:///#{@config[:derivatives_path]}#{base_path(file_path)}"
84
+ coveragestore.url = url
85
+ coveragestore.enabled = 'true'
86
+ coveragestore.data_type = 'GeoTIFF'
87
+ coveragestore.save
88
+ end
89
+
90
+ def persist_coverage
91
+ coverage = RGeoServer::Coverage.new catalog, workspace: workspace,
92
+ coverage_store: coveragestore,
93
+ name: coveragestore.name
94
+ coverage.title = coveragestore.name
95
+ coverage.metadata_links = []
96
+ coverage.save
97
+ end
98
+
99
+ def publish_vector
100
+ # Delete existing shapefile
101
+ FileUtils.rm_rf(shapefile_dir)
102
+
103
+ # Unzip derivative shapefiles
104
+ system "unzip -o #{file_path} -d #{shapefile_dir}"
105
+
106
+ shape_path = Dir.glob("#{shapefile_dir}/*.shp").first
107
+ raise Errno::ENOENT, 'Shapefile not found' unless shape_path
108
+ url = "file:///#{@config[:derivatives_path]}#{base_path(shape_path)}"
109
+ datastore.upload_external url, publish: true
110
+ end
111
+
112
+ def publish_raster
113
+ persist_coveragestore
114
+ persist_coverage
115
+ end
116
+ end
117
+ end
118
+ end
@@ -0,0 +1,11 @@
1
+ module GeoWorks
2
+ class DeliveryService
3
+ attr_reader :geoserver
4
+
5
+ def initialize(file_set, file_path)
6
+ @geoserver = GeoWorks::Delivery::Geoserver.new(file_set, file_path)
7
+ end
8
+
9
+ delegate :publish, to: :geoserver
10
+ end
11
+ end
@@ -0,0 +1,4 @@
1
+ module GeoWorks
2
+ module Discovery
3
+ end
4
+ end
@@ -0,0 +1,37 @@
1
+ module GeoWorks
2
+ module Discovery
3
+ class AbstractDocument
4
+ attr_accessor :identifier, :provenance, :creator, :subject, :spatial, :temporal,
5
+ :title, :description, :access_rights, :language, :issued,
6
+ :publisher, :slug, :solr_coverage, :layer_year,
7
+ :layer_modified, :geom_type, :format, :resource_type, :wxs_identifier,
8
+ :dct_references, :fgdc, :iso19139, :mods, :download, :url, :thumbnail,
9
+ :wxs_identifier, :wms_path, :wfs_path
10
+
11
+ # Cleans the document hash by removing unused fields.
12
+ # @param [Hash] document hash
13
+ # @return [Hash] cleaned document hash
14
+ def clean_document(hash)
15
+ hash.delete_if do |_k, v|
16
+ begin
17
+ v.nil? || v.empty?
18
+ rescue
19
+ false
20
+ end
21
+ end
22
+ end
23
+
24
+ def to_hash(_arg)
25
+ raise 'this method should be overriden and return the document as a hash'
26
+ end
27
+
28
+ def to_json(_arg)
29
+ raise 'this method should be overriden and return the document as json'
30
+ end
31
+
32
+ def to_xml(_arg)
33
+ raise 'this method should be overriden and return the document as xml'
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,46 @@
1
+ module GeoWorks
2
+ module Discovery
3
+ class DocumentBuilder
4
+ class_attribute :services, :root_path_class
5
+
6
+ # Array of document builder services.
7
+ # - BasicMetadataBuilder: builds fields such as id, subject, and publisher.
8
+ # - SpatialBuilder: builds spatial fields such as bounding box and solr geometry.
9
+ # - DateBuilder: builds date fields such as layer year and modified date.
10
+ # - ReferencesBuilder: builds service reference fields such as thumbnail and download url.
11
+ # - LayerInfoBuilder: builds fields about the geospatial file such as geometry and format.
12
+ # - SlugBuilder: builds the Geoblacklight slug field.
13
+ self.services = [
14
+ BasicMetadataBuilder,
15
+ SpatialBuilder,
16
+ DateBuilder,
17
+ ReferencesBuilder,
18
+ LayerInfoBuilder,
19
+ SlugBuilder
20
+ ]
21
+
22
+ # Class used to generate urls for links in the document.
23
+ self.root_path_class = DocumentPath
24
+
25
+ def initialize(geo_concern, document)
26
+ @geo_concern = geo_concern
27
+ @document = document
28
+ builders.build(document)
29
+ end
30
+
31
+ attr_reader :geo_concern, :document
32
+ delegate :to_json, :to_xml, :to_hash, to: :document
33
+
34
+ private
35
+
36
+ # Instantiates a CompositeBuilder object with an array of
37
+ # builder instances that are used to create the document.
38
+ # @return [CompositeBuilder] composite builder for document
39
+ def builders
40
+ @builders ||= CompositeBuilder.new(
41
+ services.map { |service| service.new(geo_concern) }
42
+ )
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,71 @@
1
+ ##
2
+ # Workaround for setting the identifier in the geoblacklight document
3
+ # Remove once
4
+ module GeoWorks
5
+ module Discovery
6
+ class DocumentBuilder
7
+ class BasicMetadataBuilder
8
+ attr_reader :geo_concern
9
+
10
+ def initialize(geo_concern)
11
+ @geo_concern = geo_concern
12
+ end
13
+
14
+ # Builds fields such as id, subject, and publisher.
15
+ # @param [AbstractDocument] discovery document
16
+ def build(document)
17
+ build_simple_attributes(document)
18
+ build_complex_attributes(document)
19
+ end
20
+
21
+ private
22
+
23
+ # Returns an array of attributes to add to document.
24
+ # @return [Array] attributes
25
+ def simple_attributes
26
+ [:creator, :subject, :spatial, :temporal,
27
+ :title, :provenance, :language, :publisher]
28
+ end
29
+
30
+ # Builds simple metadata attributes.
31
+ # @param [AbstractDocument] discovery document
32
+ def build_simple_attributes(document)
33
+ simple_attributes.each do |a|
34
+ document.send("#{a}=", geo_concern.send(a.to_s))
35
+ end
36
+ end
37
+
38
+ # Builds more complex metadata attributes.
39
+ # @param [AbstractDocument] discovery document
40
+ def build_complex_attributes(document)
41
+ document.identifier = identifier
42
+ document.description = description
43
+ document.access_rights = geo_concern.solr_document.visibility
44
+ end
45
+
46
+ # Returns the work indentifier. This is (usually) different from the hydra/fedora work id.
47
+ # The identifier might be an ARK, DOI, PURL, etc.
48
+ # If identifier is not set, the work id is used.
49
+ # @return [String] identifier
50
+ def identifier
51
+ identifiers = geo_concern.identifier
52
+ if identifiers.nil? || identifiers.empty?
53
+ geo_concern.id
54
+ elsif identifiers.is_a?(String)
55
+ identifiers
56
+ else
57
+ identifiers.first
58
+ end
59
+ end
60
+
61
+ # Returns the work description. If none is available,
62
+ # a basic description is created.
63
+ # @return [String] description
64
+ def description
65
+ return geo_concern.description.first if geo_concern.description.first
66
+ "A #{geo_concern.human_readable_type.downcase} object."
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,21 @@
1
+ module GeoWorks
2
+ module Discovery
3
+ class DocumentBuilder
4
+ class CompositeBuilder
5
+ attr_reader :services
6
+
7
+ def initialize(services)
8
+ @services = services
9
+ end
10
+
11
+ # Runs each builder service to build a discovery document.
12
+ # @param [AbstractDocument] discovery document
13
+ def build(document)
14
+ services.each do |service|
15
+ service.build(document)
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end