geo_concerns 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (220) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +13 -0
  3. data/.rubocop.yml +101 -0
  4. data/.travis.yml +17 -0
  5. data/Gemfile +46 -0
  6. data/LICENSE +202 -0
  7. data/README.md +46 -0
  8. data/Rakefile +21 -0
  9. data/app/actors/geo_concerns/file_actor.rb +20 -0
  10. data/app/actors/geo_concerns/file_set_actor.rb +7 -0
  11. data/app/assets/images/geo_concerns/.keep +0 -0
  12. data/app/assets/images/geo_concerns/images/geocoder.png +0 -0
  13. data/app/assets/images/geo_concerns/images/throbber.gif +0 -0
  14. data/app/assets/images/geo_concerns/img/filter-icon.png +0 -0
  15. data/app/assets/images/geo_concerns/img/move-handle.png +0 -0
  16. data/app/assets/images/geo_concerns/img/resize-handle.png +0 -0
  17. data/app/assets/javascripts/geo_concerns/Control.Geocoder.js +1056 -0
  18. data/app/assets/javascripts/geo_concerns/application.js +5 -0
  19. data/app/assets/javascripts/geo_concerns/bounding_box_selector.js +100 -0
  20. data/app/assets/javascripts/geo_concerns/leaflet-boundingbox.js +467 -0
  21. data/app/assets/stylesheets/geo_concerns/Control.Geocoder.css +104 -0
  22. data/app/assets/stylesheets/geo_concerns/application.css +18 -0
  23. data/app/assets/stylesheets/geo_concerns/bounding_box.scss +7 -0
  24. data/app/assets/stylesheets/geo_concerns/leaflet-boundingbox.css +17 -0
  25. data/app/controllers/concerns/geo_concerns/file_sets_controller_behavior.rb +19 -0
  26. data/app/controllers/concerns/geo_concerns/image_works_controller_behavior.rb +13 -0
  27. data/app/controllers/concerns/geo_concerns/raster_works_controller_behavior.rb +23 -0
  28. data/app/controllers/concerns/geo_concerns/vector_works_controller_behavior.rb +23 -0
  29. data/app/forms/geo_concerns/basic_geo_metadata_form.rb +8 -0
  30. data/app/forms/geo_concerns/external_metadata_file_form.rb +8 -0
  31. data/app/forms/geo_concerns/georeferenced_form.rb +9 -0
  32. data/app/forms/geo_concerns/image_work_form.rb +9 -0
  33. data/app/forms/geo_concerns/raster_work_form.rb +8 -0
  34. data/app/forms/geo_concerns/vector_work_form.rb +8 -0
  35. data/app/helpers/bounding_box_helper.rb +24 -0
  36. data/app/helpers/geo_concerns/application_helper.rb +4 -0
  37. data/app/models/concerns/geo_concerns/basic_geo_metadata.rb +21 -0
  38. data/app/models/concerns/geo_concerns/external_metadata_file_behavior.rb +31 -0
  39. data/app/models/concerns/geo_concerns/extractors/fgdc_helper.rb +9 -0
  40. data/app/models/concerns/geo_concerns/extractors/fgdc_metadata_extractor.rb +114 -0
  41. data/app/models/concerns/geo_concerns/extractors/iso19139_helper.rb +50 -0
  42. data/app/models/concerns/geo_concerns/extractors/mods_helper.rb +15 -0
  43. data/app/models/concerns/geo_concerns/file_set/derivatives.rb +60 -0
  44. data/app/models/concerns/geo_concerns/file_set_presenter_behavior.rb +7 -0
  45. data/app/models/concerns/geo_concerns/geo_file_format_behavior.rb +37 -0
  46. data/app/models/concerns/geo_concerns/geo_file_set_behavior.rb +11 -0
  47. data/app/models/concerns/geo_concerns/georeferenced_behavior.rb +18 -0
  48. data/app/models/concerns/geo_concerns/image_file_behavior.rb +14 -0
  49. data/app/models/concerns/geo_concerns/image_work_behavior.rb +69 -0
  50. data/app/models/concerns/geo_concerns/metadata_extraction_helper.rb +28 -0
  51. data/app/models/concerns/geo_concerns/raster_file_behavior.rb +14 -0
  52. data/app/models/concerns/geo_concerns/raster_work_behavior.rb +82 -0
  53. data/app/models/concerns/geo_concerns/solr_document_behavior.rb +25 -0
  54. data/app/models/concerns/geo_concerns/vector_file_behavior.rb +14 -0
  55. data/app/models/concerns/geo_concerns/vector_work_behavior.rb +78 -0
  56. data/app/presenters/geo_concerns/geo_concerns_show_presenter.rb +30 -0
  57. data/app/presenters/geo_concerns/image_work_show_presenter.rb +18 -0
  58. data/app/presenters/geo_concerns/raster_work_show_presenter.rb +18 -0
  59. data/app/presenters/geo_concerns/vector_work_show_presenter.rb +10 -0
  60. data/app/processors/geo_concerns/processors/base_geo_processor.rb +86 -0
  61. data/app/processors/geo_concerns/processors/raster.rb +11 -0
  62. data/app/processors/geo_concerns/processors/raster/aig.rb +44 -0
  63. data/app/processors/geo_concerns/processors/raster/base.rb +74 -0
  64. data/app/processors/geo_concerns/processors/raster/dem.rb +46 -0
  65. data/app/processors/geo_concerns/processors/raster/processor.rb +27 -0
  66. data/app/processors/geo_concerns/processors/vector.rb +11 -0
  67. data/app/processors/geo_concerns/processors/vector/base.rb +68 -0
  68. data/app/processors/geo_concerns/processors/vector/processor.rb +25 -0
  69. data/app/processors/geo_concerns/processors/vector/shapefile.rb +20 -0
  70. data/app/processors/geo_concerns/processors/zip.rb +31 -0
  71. data/app/renderers/coverage_renderer.rb +34 -0
  72. data/app/runners/geo_concerns/runners/raster_derivatives.rb +9 -0
  73. data/app/runners/geo_concerns/runners/vector_derivatives.rb +9 -0
  74. data/app/schemas/geo_concerns/basic_geo_metadata_optional.rb +39 -0
  75. data/app/schemas/geo_concerns/basic_geo_metadata_required.rb +25 -0
  76. data/app/services/authority_service.rb +23 -0
  77. data/app/services/geo_concerns/derivative_path.rb +16 -0
  78. data/app/services/image_format_service.rb +4 -0
  79. data/app/services/metadata_format_service.rb +4 -0
  80. data/app/services/raster_format_service.rb +4 -0
  81. data/app/services/vector_format_service.rb +4 -0
  82. data/app/values/geo_concerns/coverage.rb +36 -0
  83. data/app/values/geo_concerns/time_period.rb +31 -0
  84. data/app/views/curation_concerns/file_sets/_form.html.erb +48 -0
  85. data/app/views/curation_concerns/image_works/_form.html.erb +23 -0
  86. data/app/views/curation_concerns/image_works/_image_work.html.erb +2 -0
  87. data/app/views/curation_concerns/image_works/_members.html.erb +30 -0
  88. data/app/views/curation_concerns/image_works/_related_image_files.html.erb +24 -0
  89. data/app/views/curation_concerns/image_works/_show_actions.html.erb +16 -0
  90. data/app/views/curation_concerns/image_works/show.html.erb +17 -0
  91. data/app/views/curation_concerns/raster_works/_form.html.erb +25 -0
  92. data/app/views/curation_concerns/raster_works/_members.html.erb +30 -0
  93. data/app/views/curation_concerns/raster_works/_raster_work.html.erb +2 -0
  94. data/app/views/curation_concerns/raster_works/_related_raster_files.html.erb +24 -0
  95. data/app/views/curation_concerns/raster_works/_show_actions.html.erb +16 -0
  96. data/app/views/curation_concerns/raster_works/show.html.erb +17 -0
  97. data/app/views/curation_concerns/vector_works/_form.html.erb +25 -0
  98. data/app/views/curation_concerns/vector_works/_related_vector_files.html.erb +24 -0
  99. data/app/views/curation_concerns/vector_works/_show_actions.html.erb +15 -0
  100. data/app/views/curation_concerns/vector_works/_vector_work.html.erb +2 -0
  101. data/app/views/curation_concerns/vector_works/show.html.erb +15 -0
  102. data/app/views/geo_concerns/_attribute_rows.html.erb +11 -0
  103. data/app/views/geo_concerns/_attributes.html.erb +13 -0
  104. data/app/views/geo_concerns/_form_additional_information.html.erb +11 -0
  105. data/app/views/geo_concerns/_form_bounding_box.html.erb +9 -0
  106. data/app/views/geo_concerns/_form_descriptive_fields.html.erb +9 -0
  107. data/app/views/geo_concerns/_form_files_and_links.html.erb +0 -0
  108. data/app/views/geo_concerns/_form_populate_metadata.html.erb +8 -0
  109. data/app/views/geo_concerns/_form_required_information.html.erb +12 -0
  110. data/app/views/geo_concerns/_form_supplementary_fields.html.erb +15 -0
  111. data/app/views/geo_concerns/_related_external_metadata_files.html.erb +24 -0
  112. data/app/vocabs/geo_concerns/geo_terms.rb +12 -0
  113. data/bin/rails +12 -0
  114. data/config/routes.rb +6 -0
  115. data/geo_concerns.gemspec +36 -0
  116. data/lib/generators/geo_concerns/install_generator.rb +119 -0
  117. data/lib/generators/geo_concerns/templates/actors/curation_concerns/image_work_actor.rb +4 -0
  118. data/lib/generators/geo_concerns/templates/actors/curation_concerns/raster_work_actor.rb +4 -0
  119. data/lib/generators/geo_concerns/templates/actors/curation_concerns/vector_work_actor.rb +4 -0
  120. data/lib/generators/geo_concerns/templates/config/authorities/image_formats.yml +5 -0
  121. data/lib/generators/geo_concerns/templates/config/authorities/metadata_formats.yml +7 -0
  122. data/lib/generators/geo_concerns/templates/config/authorities/raster_formats.yml +9 -0
  123. data/lib/generators/geo_concerns/templates/config/authorities/vector_formats.yml +5 -0
  124. data/lib/generators/geo_concerns/templates/controllers/curation_concerns/file_sets_controller.rb +6 -0
  125. data/lib/generators/geo_concerns/templates/controllers/curation_concerns/image_works_controller.rb +5 -0
  126. data/lib/generators/geo_concerns/templates/controllers/curation_concerns/raster_works_controller.rb +6 -0
  127. data/lib/generators/geo_concerns/templates/controllers/curation_concerns/vector_works_controller.rb +6 -0
  128. data/lib/generators/geo_concerns/templates/geo_concerns.js +1 -0
  129. data/lib/generators/geo_concerns/templates/geo_concerns.scss +3 -0
  130. data/lib/generators/geo_concerns/templates/jobs/characterize_job.rb +12 -0
  131. data/lib/generators/geo_concerns/templates/models/file_set.rb +4 -0
  132. data/lib/generators/geo_concerns/templates/models/image_work.rb +6 -0
  133. data/lib/generators/geo_concerns/templates/models/raster_work.rb +7 -0
  134. data/lib/generators/geo_concerns/templates/models/vector_work.rb +7 -0
  135. data/lib/generators/geo_concerns/templates/presenters/file_set_presenter.rb +3 -0
  136. data/lib/generators/geo_concerns/templates/spec/actor_spec.rb.erb +9 -0
  137. data/lib/generators/geo_concerns/templates/spec/controller_spec.rb.erb +9 -0
  138. data/lib/generators/geo_concerns/templates/spec/model_spec.rb.erb +9 -0
  139. data/lib/geo_concerns.rb +6 -0
  140. data/lib/geo_concerns/engine.rb +4 -0
  141. data/lib/geo_concerns/version.rb +3 -0
  142. data/lib/tasks/geo_concerns_tasks.rake +4 -0
  143. data/solr/config/_rest_managed.json +3 -0
  144. data/solr/config/admin-extra.html +31 -0
  145. data/solr/config/elevate.xml +36 -0
  146. data/solr/config/mapping-ISOLatin1Accent.txt +246 -0
  147. data/solr/config/protwords.txt +21 -0
  148. data/solr/config/schema.xml +372 -0
  149. data/solr/config/scripts.conf +24 -0
  150. data/solr/config/solrconfig.xml +312 -0
  151. data/solr/config/spellings.txt +2 -0
  152. data/solr/config/stopwords.txt +58 -0
  153. data/solr/config/stopwords_en.txt +58 -0
  154. data/solr/config/synonyms.txt +31 -0
  155. data/solr/config/xslt/example.xsl +132 -0
  156. data/solr/config/xslt/example_atom.xsl +67 -0
  157. data/solr/config/xslt/example_rss.xsl +66 -0
  158. data/solr/config/xslt/luke.xsl +337 -0
  159. data/spec/actors/geo_concerns/file_actor_spec.rb +26 -0
  160. data/spec/controllers/image_works_controller_spec.rb +25 -0
  161. data/spec/controllers/raster_works_controller_spec.rb +50 -0
  162. data/spec/controllers/vector_works_controller_spec.rb +50 -0
  163. data/spec/factories/external_metadata_files.rb +20 -0
  164. data/spec/factories/image_files.rb +32 -0
  165. data/spec/factories/image_works.rb +68 -0
  166. data/spec/factories/raster_files.rb +35 -0
  167. data/spec/factories/raster_works.rb +86 -0
  168. data/spec/factories/users.rb +26 -0
  169. data/spec/factories/vector_files.rb +31 -0
  170. data/spec/factories/vector_works.rb +83 -0
  171. data/spec/features/create_raster_work_spec.rb +49 -0
  172. data/spec/forms/geo_concerns/basic_geo_metadata_form_spec.rb +27 -0
  173. data/spec/forms/geo_concerns/external_metadata_file_form_spec.rb +27 -0
  174. data/spec/forms/geo_concerns/georeferenced_form_spec.rb +29 -0
  175. data/spec/forms/geo_concerns/image_work_form_spec.rb +11 -0
  176. data/spec/forms/geo_concerns/raster_work_form_spec.rb +15 -0
  177. data/spec/forms/geo_concerns/vector_work_form_spec.rb +15 -0
  178. data/spec/helpers/bounding_box_helper_spec.rb +34 -0
  179. data/spec/models/concerns/basic_geo_metadata_spec.rb +21 -0
  180. data/spec/models/concerns/geo_concerns/file_set/derivatives_spec.rb +108 -0
  181. data/spec/models/concerns/geo_concerns/file_set/geo_file_format_behavior_spec.rb +56 -0
  182. data/spec/models/external_metadata_file_spec.rb +118 -0
  183. data/spec/models/file_set_spec.rb +9 -0
  184. data/spec/models/image_file_spec.rb +48 -0
  185. data/spec/models/image_work_spec.rb +71 -0
  186. data/spec/models/raster_file_spec.rb +48 -0
  187. data/spec/models/raster_work_spec.rb +122 -0
  188. data/spec/models/solr_document_spec.rb +35 -0
  189. data/spec/models/vector_file_spec.rb +48 -0
  190. data/spec/models/vector_work_spec.rb +113 -0
  191. data/spec/presenters/file_set_presenter_spec.rb +13 -0
  192. data/spec/presenters/geo_concerns_show_presenter_spec.rb +56 -0
  193. data/spec/presenters/image_work_show_presenter_spec.rb +52 -0
  194. data/spec/presenters/raster_work_show_presenter_spec.rb +52 -0
  195. data/spec/presenters/vector_work_show_presenter_spec.rb +41 -0
  196. data/spec/processors/geo_concerns/processors/base_geo_processor_spec.rb +109 -0
  197. data/spec/processors/geo_concerns/processors/raster/aig_spec.rb +28 -0
  198. data/spec/processors/geo_concerns/processors/raster/base_spec.rb +86 -0
  199. data/spec/processors/geo_concerns/processors/raster/dem_spec.rb +26 -0
  200. data/spec/processors/geo_concerns/processors/raster/processor_spec.rb +39 -0
  201. data/spec/processors/geo_concerns/processors/vector/base_spec.rb +67 -0
  202. data/spec/processors/geo_concerns/processors/vector/processor_spec.rb +28 -0
  203. data/spec/processors/geo_concerns/processors/vector/shapefile_spec.rb +17 -0
  204. data/spec/processors/geo_concerns/processors/zip_spec.rb +39 -0
  205. data/spec/renderers/coverage_renderer_spec.rb +21 -0
  206. data/spec/services/derivative_path_spec.rb +12 -0
  207. data/spec/services/raster_format_service_spec.rb +13 -0
  208. data/spec/spec_helper.rb +34 -0
  209. data/spec/support/controllers/engine_helpers.rb +7 -0
  210. data/spec/support/database_cleaner.rb +18 -0
  211. data/spec/support/devise.rb +10 -0
  212. data/spec/support/devise_helpers.rb +6 -0
  213. data/spec/support/factory_girl.rb +3 -0
  214. data/spec/support/features.rb +14 -0
  215. data/spec/support/features/session_helpers.rb +40 -0
  216. data/spec/support/fixture_reader.rb +7 -0
  217. data/spec/test_app_templates/lib/generators/test_app_generator.rb +20 -0
  218. data/spec/values/coverage_spec.rb +40 -0
  219. data/tasks/ci.rake +49 -0
  220. metadata +527 -0
@@ -0,0 +1,118 @@
1
+ require 'spec_helper'
2
+
3
+ describe FileSet do
4
+ let(:user) { create(:user) }
5
+ subject { described_class.new(mime_type: 'application/xml; schema=iso19139') }
6
+
7
+ context "when mime_type is a metadata format" do
8
+ it "responds as a metadata file" do
9
+ expect(subject.external_metadata_file?).to be_truthy
10
+ end
11
+ it "doesn't respond as a vector file" do
12
+ expect(subject.vector_file?).to be_falsey
13
+ end
14
+ end
15
+
16
+ describe "to_solr" do
17
+ let(:solr_doc) { FactoryGirl.build(:external_metadata_file,
18
+ date_uploaded: Time.zone.today,
19
+ mime_type: 'application/xml; schema=iso19139').to_solr
20
+ }
21
+
22
+ it "does not index bbox field" do
23
+ expect(solr_doc.keys).not_to include 'coverage_tesim'
24
+ end
25
+ end
26
+
27
+ describe 'metadata' do
28
+ it 'has standard' do
29
+ expect(subject).to respond_to(:mime_type)
30
+ end
31
+ end
32
+
33
+ it 'will read the PCDM::File for its XML' do
34
+ expect(subject).to receive(:original_file) { Hydra::PCDM::File.new }
35
+ expect(subject.metadata_xml).to be_kind_of Nokogiri::XML::Document
36
+ end
37
+
38
+ it 'will route the extraction request for ISO' do
39
+ expect(subject).to receive(:original_file) { Hydra::PCDM::File.new }
40
+ expect(subject).to receive(:extract_iso19139_metadata)
41
+ subject.mime_type = 'application/xml; schema=iso19139'
42
+ expect(subject.extract_metadata).to be_nil
43
+ end
44
+
45
+ it 'will route the extraction request for FGDC' do
46
+ expect(subject).to receive(:original_file) { Hydra::PCDM::File.new }
47
+ expect(subject).to receive(:extract_fgdc_metadata)
48
+ subject.mime_type = 'application/xml; schema=fgdc'
49
+ expect(subject.extract_metadata).to be_nil
50
+ end
51
+
52
+ it 'will route the extraction request for MODS' do
53
+ expect(subject).to receive(:original_file) { Hydra::PCDM::File.new }
54
+ expect(subject).to receive(:extract_mods_metadata)
55
+ subject.mime_type = 'application/mods+xml'
56
+ expect(subject.extract_metadata).to be_nil
57
+ end
58
+
59
+ it 'will not route the extraction request for bogus standard' do
60
+ subject.mime_type = 'bogus'
61
+ expect { subject.extract_metadata }.to raise_error(ArgumentError)
62
+ end
63
+
64
+ it 'can extract ISO 19139 metadata - example 1' do
65
+ doc = Nokogiri::XML(read_test_data_fixture('McKay/S_566_1914_clip_iso.xml'))
66
+ expect(subject.extract_iso19139_metadata(doc)).to include(title: ['S_566_1914_clip.tif'],
67
+ coverage: GeoConcerns::Coverage.new(57.595712, -109.860605, 56.407644, -112.469675).to_s,
68
+ description: ['This raster file is the result of georeferencing using esri\'s ArcScan of Sheet 566: McKay, Alberta, 1st ed. 1st of July, 1914. This sheet is part of the 3-mile to 1-inch sectional maps of Western Canada. vectorization was undertaken to extract a measure of line work density in order to measure Cartographic Intactness. The map series is described in Dubreuil, Lorraine. 1989. Sectional maps of western Canada, 1871-1955: An early Canadian topographic map series. Occasional paper no. 2, Association of Canadian Map Libraries and Archives.'],
69
+ source: ['University of Alberta'])
70
+ end
71
+
72
+ it 'can extract ISO 19139 metadata - example 2' do
73
+ doc = Nokogiri::XML(read_test_data_fixture('McKay/S_566_1914_lines_iso.xml'))
74
+ expect(subject.extract_iso19139_metadata(doc)).to include(title: ['S_566_1914_lines'],
75
+ coverage: GeoConcerns::Coverage.new(57.450728, -109.898613, 56.600872, -112.1975).to_s,
76
+ description: ['This .shp file (lines) is the result of georeferencing and performing a raster to vector conversion using esri\'s ArcScan of Sheet 566: McKay, Alberta, 1st ed. 1st of July, 1914. This sheet is part of the 3-mile to 1-inch sectional maps of Western Canada. vectorization was undertaken to extract a measure of line work density in order to measure Cartographic Intactness. The map series is described in Dubreuil, Lorraine. 1989. Sectional maps of western Canada, 1871-1955: An early Canadian topographic map series. Occasional paper no. 2, Association of Canadian Map Libraries and Archives.'],
77
+ source: ['Larry Laliberte'])
78
+ end
79
+
80
+ it 'can extract FGDC metadata - example 1' do
81
+ doc = Nokogiri::XML(read_test_data_fixture('zipcodes_fgdc.xml'))
82
+ expect(subject.extract_fgdc_metadata(doc)).to include(title: ['Louisiana ZIP Code Areas 2002'],
83
+ coverage: GeoConcerns::Coverage.new(33.019481, -88.817478, 28.926478, -94.043286).to_s,
84
+ creator: ['Geographic Data Technology, Inc. (GDT)', 'Environmental Systems Research Institute, Inc. (ESRI)'],
85
+ description: ['Louisiana ZIP Code Areas represents five-digit ZIP Code areas used by the U.S. Postal Service to deliver mail more effectively. The first digit of a five-digit ZIP Code divides the country into 10 large groups of states numbered from 0 in the Northeast to 9 in the far West. Within these areas, each state is divided into an average of 10 smaller geographical areas, identified by the 2nd and 3rd digits. These digits, in conjunction with the first digit, represent a sectional center facility or a mail processing facility area. The 4th and 5th digits identify a post office, station, branch or local delivery area.'],
86
+ issued: 2002,
87
+ subject: ["polygon", "zip codes", "areas", "five-digit zip codes", "post offices", "population", "Location", "Society"],
88
+ publisher: ['Environmental Systems Research Institute, Inc. (ESRI)'],
89
+ spatial: ["United States", "Louisiana"],
90
+ temporal: ["2001", "2000"])
91
+ end
92
+
93
+ it 'can extract FGDC metadata - example 2' do
94
+ doc = Nokogiri::XML(read_test_data_fixture('McKay/S_566_1914_clip_fgdc.xml'))
95
+ expect(subject.extract_fgdc_metadata(doc)).to include(title: ['S_566_1914_clip.tif'],
96
+ coverage: GeoConcerns::Coverage.new(57.465375, -109.622454, 56.580532, -112.47033).to_s,
97
+ description: ['This raster file is the result of georeferencing using esri\'s ArcScan of Sheet 566: McKay, Alberta, 1st ed. 1st of July, 1914. This sheet is part of the 3-mile to 1-inch sectional maps of Western Canada. vectorization was undertaken to extract a measure of line work density in order to measure Cartographic Intactness. The map series is described in Dubreuil, Lorraine. 1989. Sectional maps of western Canada, 1871-1955: An early Canadian topographic map series. Occasional paper no. 2, Association of Canadian Map Libraries and Archives.'],
98
+ issued: 2014,
99
+ subject: ["Land cover", "Land use, rural", "Society", "Imagery and Base Maps", "Biology and Ecology"])
100
+ end
101
+
102
+ it 'can extract FGDC metadata - example 3' do
103
+ doc = Nokogiri::XML(read_test_data_fixture('McKay/S_566_1914_lines_fgdc.xml'))
104
+ expect(subject.extract_fgdc_metadata(doc)).to include(title: ['S_566_1914_lines'],
105
+ coverage: GeoConcerns::Coverage.new(57.450728, -109.898613, 56.600872, -112.1975).to_s,
106
+ description: ['This .shp file (lines) is the result of georeferencing and performing a raster to vector conversion using esri\'s ArcScan of Sheet 566: McKay, Alberta, 1st ed. 1st of July, 1914. This sheet is part of the 3-mile to 1-inch sectional maps of Western Canada. vectorization was undertaken to extract a measure of line work density in order to measure Cartographic Intactness. The map series is described in Dubreuil, Lorraine. 1989. Sectional maps of western Canada, 1871-1955: An early Canadian topographic map series. Occasional paper no. 2, Association of Canadian Map Libraries and Archives.'],
107
+ issued: 2014,
108
+ temporal: ['1914'],
109
+ spatial: ['McKay (Alta.)', 'Fort McMurray (Alta.)', 'Alberta', 'Western Canada'],
110
+ subject: ["Land cover", "Land use, rural", "Biology and Ecology", "Environment", "Imagery and Base Maps", "Society"])
111
+ end
112
+
113
+ it 'can extract MODS metadata' do
114
+ doc = Nokogiri::XML(read_test_data_fixture('bb099zb1450_mods.xml'))
115
+ expect(subject.extract_mods_metadata(doc)).to include(title: ['Department Boundary: Haute-Garonne, France, 2010 '],
116
+ description: ['This polygon shapefile represents the Department Boundary for the Haute-Garonne department of France for 2010. These are the level 2 administrative divisions (ADM2) of Haute-Garonne. Department is one of the three levels of government below the national level ("territorial collectivities"), between the region and the commune. There are 96 departments in metropolitan France and 5 overseas departments, which also are classified as regions. Departments are further subdivided into 342 arrondissements, themselves divided into cantons; the latter two have no autonomy and are used for the organisation of public services and sometimes elections.'])
117
+ end
118
+ end
@@ -0,0 +1,9 @@
1
+ require 'spec_helper'
2
+
3
+ describe FileSet do
4
+ let(:user) { create(:user) }
5
+
6
+ it 'is a Hydra::Works::FileSet' do
7
+ expect(subject).to be_file_set
8
+ end
9
+ end
@@ -0,0 +1,48 @@
1
+ require 'spec_helper'
2
+
3
+ describe FileSet do
4
+ let(:user) { create(:user) }
5
+ subject { described_class.new(mime_type: 'image/jpeg') }
6
+
7
+ context "when mime_type is an image format" do
8
+ it "responds as an image file" do
9
+ expect(subject.image_file?).to be_truthy
10
+ end
11
+ it "doesn't respond as a vector file" do
12
+ expect(subject.vector_file?).to be_falsey
13
+ end
14
+ it 'does not have an authoritative cartographic projection' do
15
+ # expect(subject).not_to respond_to(:cartographic_projection)
16
+ skip 'Our models for FileSet always include cartographic_projection'
17
+ end
18
+ end
19
+
20
+ describe 'image work association' do
21
+ let(:work) { FactoryGirl.create(:image_work_with_one_file) }
22
+ subject { work.file_sets.first.reload }
23
+ it 'belongs to image work' do
24
+ expect(subject.image_work).to eq [work]
25
+ end
26
+ end
27
+
28
+ describe "to_solr" do
29
+ let(:solr_doc) { FactoryGirl.build(:vector_file,
30
+ date_uploaded: Time.zone.today,
31
+ cartographic_projection: 'urn:ogc:def:crs:EPSG::6326').to_solr
32
+ }
33
+
34
+ it "indexes the coordinate reference system" do
35
+ expect(solr_doc.keys).to include 'cartographic_projection_tesim'
36
+ end
37
+ end
38
+
39
+ describe 'metadata' do
40
+ it 'has descriptive metadata' do
41
+ expect(subject).to respond_to(:title)
42
+ end
43
+
44
+ it 'has standard' do
45
+ expect(subject).to respond_to(:mime_type)
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,71 @@
1
+ require 'spec_helper'
2
+
3
+ describe ImageWork do
4
+ let(:user) { FactoryGirl.find_or_create(:jill) }
5
+ let(:image_file1) { FileSet.new(mime_type: 'image/jpeg') }
6
+ let(:ext_metadata_file1) { FileSet.new(mime_type: 'application/xml; schema=iso19139') }
7
+ let(:ext_metadata_file2) { FileSet.new(mime_type: 'application/xml; schema=iso19139') }
8
+ let(:raster1) { RasterWork.new }
9
+ let(:raster2) { RasterWork.new }
10
+ let(:coverage) { GeoConcerns::Coverage.new(43.039, -69.856, 42.943, -71.032) }
11
+
12
+ it 'updates the title' do
13
+ subject.attributes = { title: ['An image work'] }
14
+ expect(subject.title).to eq(['An image work'])
15
+ end
16
+
17
+ describe 'metadata' do
18
+ it 'has descriptive metadata' do
19
+ expect(subject).to respond_to(:title)
20
+ end
21
+ end
22
+
23
+ describe 'with acceptable inputs' do
24
+ subject { described_class.new }
25
+ it 'adds image file set, metadata file set, and raster work' do
26
+ subject.members << image_file1
27
+ subject.members << ext_metadata_file1
28
+ subject.members << ext_metadata_file2
29
+ subject.members << raster1
30
+ subject.members << raster2
31
+ expect(subject.image_file).to eq image_file1
32
+ expect(subject.metadata_files).to eq [ext_metadata_file1, ext_metadata_file2]
33
+ expect(subject.raster_works).to eq [raster1, raster2]
34
+ end
35
+ it 'defines what type of object it is' do
36
+ expect(subject.image_work?).to be_truthy
37
+ expect(subject.image_file?).to be_falsey
38
+ expect(subject.raster_work?).to be_falsey
39
+ expect(subject.raster_file?).to be_falsey
40
+ expect(subject.vector_work?).to be_falsey
41
+ expect(subject.vector_file?).to be_falsey
42
+ expect(subject.external_metadata_file?).to be_falsey
43
+ end
44
+ end
45
+
46
+ context 'georeferenced to a raster' do
47
+ subject { FactoryGirl.create(:image_work_with_raster_works, title: ['Test title 4'], coverage: coverage.to_s) }
48
+
49
+ it 'aggregates by raster resources' do
50
+ expect(subject.raster_works.size).to eq 2
51
+ expect(subject.raster_works.first).to be_kind_of RasterWork
52
+ end
53
+ end
54
+
55
+ describe 'populate_metadata' do
56
+ subject { FactoryGirl.create(:image_work_with_one_metadata_file) }
57
+ let(:doc) { Nokogiri::XML(read_test_data_fixture('McKay/S_566_1914_clip_iso.xml')) }
58
+
59
+ it 'has an extraction method' do
60
+ expect(subject).to respond_to(:extract_metadata)
61
+ end
62
+
63
+ it 'can perform extraction and set properties for ISO 19139' do
64
+ external_metadata_file = subject.metadata_files.first
65
+ allow(external_metadata_file).to receive(:metadata_xml) { doc }
66
+ allow(external_metadata_file).to receive(:mime_type) { 'application/xml; schema=iso19139' }
67
+ subject.populate_metadata
68
+ expect(subject.title).to eq(['S_566_1914_clip.tif'])
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,48 @@
1
+ require 'spec_helper'
2
+
3
+ describe FileSet do
4
+ let(:user) { create(:user) }
5
+ subject { described_class.new(mime_type: 'image/tiff; gdal-format=GTiff') }
6
+
7
+ context "when mime_type is a raster format" do
8
+ it "responds as a raster file" do
9
+ expect(subject.raster_file?).to be_truthy
10
+ end
11
+ it "doesn't respond as a vector file" do
12
+ expect(subject.vector_file?).to be_falsey
13
+ end
14
+ end
15
+
16
+ describe 'raster work association' do
17
+ let(:work) { FactoryGirl.create(:raster_work_with_one_file) }
18
+ subject { work.file_sets.first.reload }
19
+ it 'belongs to raster work' do
20
+ expect(subject.raster_work).to eq [work]
21
+ end
22
+ end
23
+
24
+ describe "to_solr" do
25
+ let(:solr_doc) { FactoryGirl.build(:vector_file,
26
+ date_uploaded: Time.zone.today,
27
+ cartographic_projection: 'urn:ogc:def:crs:EPSG::6326').to_solr
28
+ }
29
+
30
+ it "indexes the coordinate reference system" do
31
+ expect(solr_doc.keys).to include 'cartographic_projection_tesim'
32
+ end
33
+ end
34
+
35
+ describe 'metadata' do
36
+ it 'has descriptive metadata' do
37
+ expect(subject).to respond_to(:title)
38
+ end
39
+
40
+ it 'has an authoritative cartographic projection' do
41
+ expect(subject).to respond_to(:cartographic_projection)
42
+ end
43
+
44
+ it 'has standard' do
45
+ expect(subject).to respond_to(:mime_type)
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,122 @@
1
+ require 'spec_helper'
2
+
3
+ describe RasterWork do
4
+ let(:user) { FactoryGirl.find_or_create(:jill) }
5
+ let(:raster_file1) { FileSet.new(mime_type: 'image/tiff; gdal-format=GTiff') }
6
+ let(:raster_file2) { FileSet.new(mime_type: 'image/tiff; gdal-format=GTiff') }
7
+ let(:ext_metadata_file1) { FileSet.new(mime_type: 'application/xml; schema=iso19139') }
8
+ let(:ext_metadata_file2) { FileSet.new(mime_type: 'application/xml; schema=iso19139') }
9
+ let(:vector1) { VectorWork.new }
10
+ let(:vector2) { VectorWork.new }
11
+ let(:coverage) { GeoConcerns::Coverage.new(43.039, -69.856, 42.943, -71.032) }
12
+
13
+ it 'updates the title' do
14
+ subject.attributes = { title: ['A raster work'] }
15
+ expect(subject.title).to eq(['A raster work'])
16
+ end
17
+
18
+ it 'updates the bounding box' do
19
+ subject.attributes = { coverage: coverage.to_s }
20
+ expect(subject.coverage).to eq(coverage.to_s)
21
+ end
22
+
23
+ describe 'metadata' do
24
+ it 'has descriptive metadata' do
25
+ expect(subject).to respond_to(:title)
26
+ end
27
+
28
+ it 'has geospatial metadata' do
29
+ expect(subject).to respond_to(:coverage)
30
+ end
31
+ end
32
+
33
+ describe 'with acceptable inputs' do
34
+ subject { described_class.new }
35
+ it 'adds raster file set, metadata file set, vector work to file' do
36
+ subject.members << raster_file1
37
+ subject.members << raster_file2
38
+ subject.members << ext_metadata_file1
39
+ subject.members << ext_metadata_file2
40
+ subject.members << vector1
41
+ subject.members << vector2
42
+ expect(subject.raster_files).to eq [raster_file1, raster_file2]
43
+ expect(subject.metadata_files).to eq [ext_metadata_file1, ext_metadata_file2]
44
+ expect(subject.vector_works).to eq [vector1, vector2]
45
+ end
46
+ it 'defines what type of object it is' do
47
+ expect(subject.raster_work?).to be_truthy
48
+ expect(subject.raster_file?).to be_falsey
49
+ expect(subject.image_work?).to be_falsey
50
+ expect(subject.image_file?).to be_falsey
51
+ expect(subject.vector_work?).to be_falsey
52
+ expect(subject.vector_file?).to be_falsey
53
+ expect(subject.external_metadata_file?).to be_falsey
54
+ end
55
+ end
56
+
57
+ context 'with raster files' do
58
+ subject { FactoryGirl.create(:raster_work_with_files, title: ['Test title 4'], coverage: coverage.to_s) }
59
+
60
+ it 'has two files' do
61
+ expect(subject.raster_files.size).to eq 2
62
+ expect(subject.raster_files.first.mime_type).to eq 'image/tiff; gdal-format=GTiff'
63
+ end
64
+ end
65
+
66
+ context 'with vector feature extractions' do
67
+ subject { FactoryGirl.create(:raster_work_with_vector_works) }
68
+
69
+ it 'aggregates vector data set resources' do
70
+ expect(subject.vector_works.size).to eq 2
71
+ expect(subject.vector_works.first).to be_kind_of VectorWork
72
+ end
73
+ end
74
+
75
+ context 'with metadata files' do
76
+ subject { FactoryGirl.create(:raster_work_with_metadata_files) }
77
+
78
+ it 'aggregates external metadata files' do
79
+ expect(subject.metadata_files.size).to eq 2
80
+ expect(subject.metadata_files.first.mime_type).to eq 'application/xml; schema=iso19139'
81
+ end
82
+ end
83
+
84
+ describe '#image_work' do
85
+ let(:raster_work) { FactoryGirl.create(:raster_work, title: ['Raster'], coverage: coverage.to_s) }
86
+ let(:image_work) { FactoryGirl.create(:image_work, title: ['Image'], coverage: coverage.to_s) }
87
+
88
+ before do
89
+ image_work.ordered_members << raster_work
90
+ raster_work.save
91
+ image_work.save
92
+ end
93
+
94
+ it 'has a parent image work' do
95
+ expect(raster_work.image_work).to be_a ImageWork
96
+ end
97
+ end
98
+
99
+ describe "to_solr" do
100
+ subject { FactoryGirl.build(:raster_work, date_uploaded: Time.zone.today, coverage: coverage.to_s).to_solr }
101
+ it "indexes ordered_by_ssim field" do
102
+ expect(subject.keys).to include 'ordered_by_ssim'
103
+ end
104
+ end
105
+
106
+ describe 'populate_metadata' do
107
+ subject { FactoryGirl.create(:raster_work_with_one_metadata_file) }
108
+ let(:doc) { Nokogiri::XML(read_test_data_fixture('McKay/S_566_1914_clip_iso.xml')) }
109
+
110
+ it 'has an extraction method' do
111
+ expect(subject).to respond_to(:extract_metadata)
112
+ end
113
+
114
+ it 'can perform extraction and set properties for ISO 19139' do
115
+ external_metadata_file = subject.metadata_files.first
116
+ allow(external_metadata_file).to receive(:metadata_xml).and_return(doc)
117
+ allow(external_metadata_file).to receive(:mime_type).and_return('application/xml; schema=iso19139')
118
+ subject.should_populate_metadata = 'true'
119
+ expect(subject.title).to eq(['S_566_1914_clip.tif'])
120
+ end
121
+ end
122
+ end
@@ -0,0 +1,35 @@
1
+ require 'spec_helper'
2
+
3
+ describe SolrDocument do
4
+ let(:document) { described_class.new(attributes) }
5
+
6
+ describe "spatial" do
7
+ let(:attributes) { { Solrizer.solr_name('spatial') => ['one', 'two'] } }
8
+ subject { document.spatial }
9
+ it { is_expected.to eq ['one', 'two'] }
10
+ end
11
+
12
+ describe "temporal" do
13
+ let(:attributes) { { Solrizer.solr_name('temporal') => ['one', 'two'] } }
14
+ subject { document.temporal }
15
+ it { is_expected.to eq ['one', 'two'] }
16
+ end
17
+
18
+ describe "issued" do
19
+ let(:attributes) { { Solrizer.solr_name('issued') => 'one' } }
20
+ subject { document.issued }
21
+ it { is_expected.to eq 'one' }
22
+ end
23
+
24
+ describe "coverage" do
25
+ let(:attributes) { { Solrizer.solr_name('coverage') => 'one' } }
26
+ subject { document.coverage }
27
+ it { is_expected.to eq 'one' }
28
+ end
29
+
30
+ describe "provenance" do
31
+ let(:attributes) { { Solrizer.solr_name('provenance') => 'one' } }
32
+ subject { document.provenance }
33
+ it { is_expected.to eq 'one' }
34
+ end
35
+ end