geo_concerns 0.0.10 → 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 (89) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +1 -0
  3. data/.travis.yml +8 -4
  4. data/README.md +23 -8
  5. data/app/controllers/concerns/geo_concerns/messenger_behavior.rb +29 -0
  6. data/app/jobs/delivery_job.rb +15 -2
  7. data/app/jobs/geoblacklight_job.rb +10 -0
  8. data/app/models/concerns/geo_concerns/file_set/derivatives.rb +11 -9
  9. data/app/models/concerns/geo_concerns/solr_document_behavior.rb +5 -0
  10. data/app/presenters/geo_concerns/geo_concerns_show_presenter.rb +1 -1
  11. data/app/processors/geo_concerns/processors/base_geo_processor.rb +9 -24
  12. data/app/processors/geo_concerns/processors/image.rb +59 -0
  13. data/app/processors/geo_concerns/processors/ogr.rb +1 -1
  14. data/app/processors/geo_concerns/processors/raster.rb +18 -3
  15. data/app/processors/geo_concerns/processors/raster/base.rb +1 -0
  16. data/app/processors/geo_concerns/processors/rendering.rb +79 -0
  17. data/app/processors/geo_concerns/processors/vector.rb +16 -3
  18. data/app/processors/geo_concerns/processors/vector/base.rb +3 -2
  19. data/app/processors/geo_concerns/processors/vector/info.rb +21 -3
  20. data/app/services/geo_concerns/delivery/geoserver.rb +43 -6
  21. data/app/services/geo_concerns/discovery/abstract_document.rb +2 -1
  22. data/app/services/geo_concerns/discovery/document_builder.rb +2 -3
  23. data/app/services/geo_concerns/discovery/document_builder/basic_metadata_builder.rb +13 -2
  24. data/app/services/geo_concerns/discovery/document_builder/date_builder.rb +2 -0
  25. data/app/services/geo_concerns/discovery/document_builder/document_path.rb +12 -7
  26. data/app/services/geo_concerns/discovery/document_builder/references_builder.rb +20 -1
  27. data/app/services/geo_concerns/discovery/document_builder/spatial_builder.rb +2 -0
  28. data/app/services/geo_concerns/discovery/document_builder/wxs.rb +81 -0
  29. data/app/services/geo_concerns/discovery/geoblacklight_document.rb +9 -3
  30. data/app/services/geo_concerns/events_generator.rb +25 -0
  31. data/app/services/geo_concerns/events_generator/base_events_generator.rb +22 -0
  32. data/app/services/geo_concerns/events_generator/composite_generator.rb +18 -0
  33. data/app/services/geo_concerns/events_generator/geoblacklight_event_generator.rb +44 -0
  34. data/app/services/geo_concerns/events_generator/geoserver_event_generator.rb +30 -0
  35. data/app/services/geo_concerns/local_messaging_client.rb +18 -0
  36. data/app/services/geo_concerns/rabbit_messaging_client.rb +38 -0
  37. data/app/values/geo_concerns/time_period.rb +4 -5
  38. data/app/views/geo_concerns/_attribute_rows.html.erb +1 -0
  39. data/app/views/geo_concerns/_form_additional_information.html.erb +1 -0
  40. data/app/views/geo_concerns/file_sets/actions/_default_actions.html.erb +1 -1
  41. data/app/views/geo_concerns/file_sets/actions/_image_actions.html.erb +1 -1
  42. data/app/views/geo_concerns/file_sets/actions/_metadata_actions.html.erb +1 -1
  43. data/app/views/geo_concerns/file_sets/actions/_raster_actions.html.erb +2 -2
  44. data/app/views/geo_concerns/file_sets/actions/_vector_actions.html.erb +2 -2
  45. data/app/views/geo_concerns/file_sets/media_display/_geo.html.erb +2 -1
  46. data/docker-compose-full.yml +30 -0
  47. data/docker-compose.yml +4 -5
  48. data/geo_concerns.gemspec +5 -4
  49. data/lib/generators/geo_concerns/install_generator.rb +19 -25
  50. data/lib/generators/geo_concerns/templates/config/geoblacklight.yml +12 -0
  51. data/lib/generators/geo_concerns/templates/config/geoserver.yml +2 -0
  52. data/lib/generators/geo_concerns/templates/config/initializers/geoblacklight_config.rb +13 -0
  53. data/lib/generators/geo_concerns/templates/config/initializers/messaging_config.rb +34 -0
  54. data/lib/generators/geo_concerns/templates/config/initializers/simpler_tiles.rb +65 -0
  55. data/lib/generators/geo_concerns/templates/config/messaging.yml +15 -0
  56. data/lib/generators/geo_concerns/templates/config/simpler_tiles.yml +24 -0
  57. data/lib/generators/geo_concerns/templates/controllers/curation_concerns/file_sets_controller.rb +1 -0
  58. data/lib/generators/geo_concerns/templates/controllers/curation_concerns/image_works_controller.rb +1 -0
  59. data/lib/generators/geo_concerns/templates/controllers/curation_concerns/raster_works_controller.rb +1 -0
  60. data/lib/generators/geo_concerns/templates/controllers/curation_concerns/vector_works_controller.rb +1 -0
  61. data/lib/geo_concerns/version.rb +1 -1
  62. data/run-docker.sh +11 -1
  63. data/spec/controllers/file_sets_controller_spec.rb +50 -0
  64. data/spec/jobs/delivery_job_spec.rb +30 -7
  65. data/spec/models/concerns/geo_concerns/file_set/derivatives_spec.rb +9 -3
  66. data/spec/models/solr_document_spec.rb +6 -0
  67. data/spec/processors/geo_concerns/processors/base_geo_processor_spec.rb +15 -22
  68. data/spec/processors/geo_concerns/processors/image_spec.rb +71 -0
  69. data/spec/processors/geo_concerns/processors/rendering_spec.rb +64 -0
  70. data/spec/processors/geo_concerns/processors/vector/base_spec.rb +1 -1
  71. data/spec/processors/geo_concerns/processors/vector/info_spec.rb +10 -1
  72. data/spec/services/geo_concerns/delivery/geoserver_spec.rb +30 -6
  73. data/spec/services/{derivative_path_spec.rb → geo_concerns/derivative_path_spec.rb} +0 -0
  74. data/spec/services/geo_concerns/discovery/document_builder/wxs_spec.rb +69 -0
  75. data/spec/services/geo_concerns/discovery/document_builder_spec.rb +48 -32
  76. data/spec/services/geo_concerns/discovery/geoblacklight_document_spec.rb +1 -0
  77. data/spec/services/geo_concerns/events_generator/geoblacklight_event_generator_spec.rb +87 -0
  78. data/spec/services/geo_concerns/events_generator/geoserver_event_generator_spec.rb +40 -0
  79. data/spec/services/geo_concerns/local_messaging_client_spec.rb +35 -0
  80. data/spec/services/geo_concerns/rabbit_messaging_client_spec.rb +35 -0
  81. data/spec/services/{raster_format_service_spec.rb → geo_concerns/raster_format_service_spec.rb} +0 -0
  82. data/template.rb +1 -1
  83. metadata +85 -31
  84. data/app/processors/geo_concerns/processors/mapnik.rb +0 -35
  85. data/app/processors/geo_concerns/processors/raster/processor.rb +0 -26
  86. data/app/processors/geo_concerns/processors/vector/processor.rb +0 -24
  87. data/lib/generators/geo_concerns/templates/config/locales/geo_concerns.en.yml +0 -4
  88. data/lib/generators/geo_concerns/templates/config/mapnik.yml +0 -24
  89. data/spec/processors/geo_concerns/processors/mapnik_spec.rb +0 -70
@@ -0,0 +1,25 @@
1
+ module GeoConcerns
2
+ class EventsGenerator
3
+ delegate :record_created, to: :generators
4
+ delegate :record_deleted, to: :generators
5
+ delegate :record_updated, to: :generators
6
+ delegate :derivatives_created, to: :generators
7
+
8
+ def generators
9
+ @generators ||= CompositeGenerator.new(
10
+ geoblacklight_event_generator,
11
+ geoserver_event_generator
12
+ )
13
+ end
14
+
15
+ private
16
+
17
+ def geoblacklight_event_generator
18
+ GeoblacklightEventGenerator.new(Messaging.geoblacklight_client)
19
+ end
20
+
21
+ def geoserver_event_generator
22
+ GeoserverEventGenerator.new(Messaging.geoserver_client)
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,22 @@
1
+ module GeoConcerns
2
+ class EventsGenerator
3
+ class BaseEventsGenerator
4
+ def initialize(messaging_client)
5
+ @messaging_client = messaging_client
6
+ end
7
+
8
+ private
9
+
10
+ def base_message(type, record)
11
+ {
12
+ "id" => record.id,
13
+ "event" => type
14
+ }
15
+ end
16
+
17
+ def publish_message(message)
18
+ @messaging_client.publish(message.to_json)
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,18 @@
1
+ module GeoConcerns
2
+ class EventsGenerator
3
+ class CompositeGenerator
4
+ attr_reader :generators
5
+
6
+ def initialize(*generators)
7
+ @generators = generators.compact
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,44 @@
1
+ module GeoConcerns
2
+ class EventsGenerator
3
+ class GeoblacklightEventGenerator < BaseEventsGenerator
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
+ def message(type, record)
23
+ base_message(type, record).merge("exchange" => :geoblacklight,
24
+ "doc" => generate_document(record))
25
+ end
26
+
27
+ def delete_message(type, record)
28
+ base_message(type, record).merge("exchange" => :geoblacklight,
29
+ "id" => slug(record))
30
+ end
31
+
32
+ private
33
+
34
+ def generate_document(record)
35
+ Discovery::DocumentBuilder.new(record, Discovery::GeoblacklightDocument.new)
36
+ end
37
+
38
+ def slug(record)
39
+ return record.id unless record.respond_to?(:provenance)
40
+ "#{record.provenance.parameterize}-#{record.id}"
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,30 @@
1
+ module GeoConcerns
2
+ class EventsGenerator
3
+ class GeoserverEventGenerator < BaseEventsGenerator
4
+ def derivatives_created(record)
5
+ return unless geo_file?(record)
6
+ publish_message(
7
+ message("CREATED", record)
8
+ )
9
+ end
10
+
11
+ # Message that file set has update.
12
+ def record_updated(record)
13
+ return unless geo_file?(record)
14
+ publish_message(
15
+ message("UPDATED", record)
16
+ )
17
+ end
18
+
19
+ def message(type, record)
20
+ base_message(type, record).merge("exchange" => :geoserver)
21
+ end
22
+
23
+ private
24
+
25
+ def geo_file?(record)
26
+ record.respond_to?(:geo_file_format?) && record.geo_file_format?
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,18 @@
1
+ module GeoConcerns
2
+ class LocalMessagingClient
3
+ def publish(message)
4
+ processor = JSON.parse(message)['exchange']
5
+ send(processor, JSON.parse(message))
6
+ rescue
7
+ Rails.logger.warn "Unable to publish message with the local message client"
8
+ end
9
+
10
+ def geoblacklight(message)
11
+ GeoblacklightJob.perform_later(message)
12
+ end
13
+
14
+ def geoserver(message)
15
+ DeliveryJob.perform_later(message)
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,38 @@
1
+ require 'bunny'
2
+
3
+ module GeoConcerns
4
+ class RabbitMessagingClient
5
+ attr_reader :amqp_url
6
+ def initialize(amqp_url)
7
+ @amqp_url = amqp_url
8
+ end
9
+
10
+ def publish(message)
11
+ exchange_type = JSON.parse(message)['exchange']
12
+ send(exchange_type)
13
+ @exchange.publish(message, persistent: true)
14
+ rescue
15
+ Rails.logger.warn "Unable to publish message to #{amqp_url}"
16
+ end
17
+
18
+ def geoblacklight
19
+ exchange_name = Messaging.config['events']['exchange']['geoblacklight']
20
+ @exchange ||= channel.fanout(exchange_name, durable: true)
21
+ end
22
+
23
+ def geoserver
24
+ exchange_name = Messaging.config['events']['exchange']['geoserver']
25
+ @exchange ||= channel.fanout(exchange_name, durable: true)
26
+ end
27
+
28
+ private
29
+
30
+ def bunny_client
31
+ @bunny_client ||= Bunny.new(amqp_url).tap(&:start)
32
+ end
33
+
34
+ def channel
35
+ @channel ||= bunny_client.create_channel
36
+ end
37
+ end
38
+ end
@@ -2,15 +2,14 @@ module GeoConcerns
2
2
  class TimePeriod
3
3
  attr_accessor :doc, :initial_value
4
4
  def initialize(initial_value, doc)
5
- @initial_value = initial_value
5
+ @initial_value = initial_value || []
6
6
  @doc = doc
7
- append_caldate
8
- append_begdate
9
- initial_value.uniq!
10
7
  end
11
8
 
12
9
  def value
13
- return nil unless initial_value.present?
10
+ append_caldate
11
+ append_begdate
12
+ initial_value.uniq!
14
13
  initial_value
15
14
  end
16
15
 
@@ -9,3 +9,4 @@
9
9
  <%= presenter.attribute_to_html(:issued) %>
10
10
  <%= presenter.attribute_to_html(:coverage) %>
11
11
  <%= presenter.attribute_to_html(:provenance) %>
12
+ <%= presenter.attribute_to_html(:identifier) %>
@@ -1,5 +1,6 @@
1
1
  <fieldset class="optional prompt">
2
2
  <legend>Additional Information</legend>
3
+ <%= f.input :identifier, as: :multi_value, input_html: { class: 'form-control' } %>
3
4
  <%= f.input :contributor, as: :multi_value, input_html: { class: 'form-control' } %>
4
5
  <%= f.input :subject, as: :multi_value, input_html: { class: 'form-control' } %>
5
6
  <%= f.input :publisher, as: :multi_value, input_html: { class: 'form-control' } %>
@@ -12,5 +12,5 @@
12
12
  <% end %>
13
13
  <% if can?(:read, file_set.id) %>
14
14
  <%= link_to 'Download', main_app.download_path(file_set),
15
- class: 'btn btn-default', title: "Download #{file_set.to_s.inspect}", target: "_blank" %>
15
+ class: 'btn btn-default', title: "Download #{file_set.to_s.inspect}", target: "_blank", data: { turbolinks: false }%>
16
16
  <% end %>
@@ -15,7 +15,7 @@
15
15
  <button class="btn btn-default btn-small dropdown-toggle" data-toggle="dropdown" href="#"> Download <span class="caret"></span></button>
16
16
  <ul class="dropdown-menu">
17
17
  <li>
18
- <%= link_to "File", main_app.download_path(file_set), target: '_blank' %>
18
+ <%= link_to "File", main_app.download_path(file_set), target: '_blank', data: { turbolinks: false } %>
19
19
  </li>
20
20
  </ul>
21
21
  </div>
@@ -12,5 +12,5 @@
12
12
  <% end %>
13
13
  <% if can?(:read, file_set.id) %>
14
14
  <%= link_to 'Download', main_app.download_path(file_set),
15
- class: 'btn btn-default', title: "Download #{file_set.to_s.inspect}", target: "_blank" %>
15
+ class: 'btn btn-default', title: "Download #{file_set.to_s.inspect}", target: "_blank", data: { turbolinks: false } %>
16
16
  <% end %>
@@ -15,10 +15,10 @@
15
15
  <button class="btn btn-default btn-small dropdown-toggle" data-toggle="dropdown" href="#"> Download <span class="caret"></span></button>
16
16
  <ul class="dropdown-menu">
17
17
  <li>
18
- <%= link_to "File", main_app.download_path(file_set), target: '_blank' %>
18
+ <%= link_to "File", main_app.download_path(file_set), target: '_blank', data: { turbolinks: false } %>
19
19
  </li>
20
20
  <li>
21
- <%= link_to "Display Raster", main_app.download_path(file_set, file: 'display_raster'), target: '_blank' %>
21
+ <%= link_to "Display Raster", main_app.download_path(file_set, file: 'display_raster'), target: '_blank', data: { turbolinks: false } %>
22
22
  </li>
23
23
  </ul>
24
24
  </div>
@@ -15,10 +15,10 @@
15
15
  <button class="btn btn-default btn-small dropdown-toggle" data-toggle="dropdown" href="#"> Download <span class="caret"></span></button>
16
16
  <ul class="dropdown-menu">
17
17
  <li>
18
- <%= link_to "File", main_app.download_path(file_set), target: '_blank' %>
18
+ <%= link_to "File", main_app.download_path(file_set), target: '_blank', data: { turbolinks: false } %>
19
19
  </li>
20
20
  <li>
21
- <%= link_to "Display Vector",main_app.download_path(file_set, file: 'display_vector'), target: '_blank' %>
21
+ <%= link_to "Display Vector",main_app.download_path(file_set, file: 'display_vector'), target: '_blank', data: { turbolinks: false } %>
22
22
  </li>
23
23
  </ul>
24
24
  </div>
@@ -6,7 +6,8 @@
6
6
  alt: "",
7
7
  role: "presentation" %>
8
8
  <%= link_to main_app.download_path(file_set),
9
- target: "_new",
9
+ target: "_blank",
10
+ data: { turbolinks: false },
10
11
  class: "btn btn-default" do %>
11
12
  <%= 'Download data' %>
12
13
  <% end %>
@@ -0,0 +1,30 @@
1
+ version: '2'
2
+ services:
3
+ redis:
4
+ image: redis:3.2.4-alpine
5
+ ports:
6
+ - "6379:6379"
7
+ geoserver:
8
+ image: geoconcerns/geoserver
9
+ ports:
10
+ - "8181:8080"
11
+ geoblacklight:
12
+ image: geoconcerns/geoblacklight
13
+ ports:
14
+ - "3001:3000"
15
+ links:
16
+ - gblsolr:solr
17
+ - rabbitmq
18
+ environment:
19
+ RABBIT_SERVER: amqp://rabbitmq:5672
20
+ gblsolr:
21
+ image: geoconcerns/geoblacklight-solr
22
+ expose:
23
+ - "8983"
24
+ ports:
25
+ - "9983:8983"
26
+ rabbitmq:
27
+ image: rabbitmq:3.6.5-management
28
+ ports:
29
+ - "5672:5672"
30
+ - "15672:15672"
data/docker-compose.yml CHANGED
@@ -1,10 +1,9 @@
1
1
  version: '2'
2
+ # More services can be found in docker-compose-full.yml
2
3
  services:
3
- rabbitmq:
4
- image: rabbitmq
5
- ports:
6
- - "8081:8080"
7
4
  geoserver:
8
- image: thinkwhere/geoserver
5
+ image: geoconcerns/geoserver
9
6
  ports:
10
7
  - "8181:8080"
8
+ volumes:
9
+ - ./.internal_test_app/tmp/derivatives:/opt/geoserver/data_dir/derivatives
data/geo_concerns.gemspec CHANGED
@@ -20,18 +20,19 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.required_ruby_version = '>= 2.2.2' # same as Rails 5
22
22
 
23
- spec.add_dependency 'curation_concerns', '1.6.0'
23
+ spec.add_dependency 'curation_concerns', '>= 1.6'
24
24
  spec.add_dependency 'leaflet-rails', '~> 0.7'
25
- spec.add_dependency 'simple_mapnik', '0.1.2'
26
25
  spec.add_dependency 'json-schema', '>= 2.6.2'
27
26
  spec.add_dependency 'rgeoserver', '>= 0.10.0'
28
-
27
+ spec.add_dependency 'simpler-tiles'
28
+ spec.add_dependency 'bunny'
29
+ spec.add_dependency 'geoblacklight_messaging'
29
30
 
30
31
  spec.add_development_dependency 'bundler', '~> 1.13'
31
32
  spec.add_development_dependency 'sqlite3'
32
33
  spec.add_development_dependency 'devise', '>= 3.0', '< 5'
33
34
  spec.add_development_dependency 'rspec-rails', '>= 3.5.2'
34
- spec.add_development_dependency 'engine_cart', '~> 1.0', '>= 1.0.0'
35
+ spec.add_development_dependency 'engine_cart', '~> 1.0', '>= 1.0.1'
35
36
  spec.add_development_dependency 'solr_wrapper', '~> 0.18', '>= 0.18.0'
36
37
  spec.add_development_dependency 'fcrepo_wrapper', '~> 0.6', '>= 0.6.0'
37
38
  spec.add_development_dependency 'pry-byebug'
@@ -9,24 +9,6 @@ module GeoConcerns
9
9
  inject_into_file 'config/routes.rb', after: /curation_concerns_embargo_management\s*\n/ do
10
10
  " mount GeoConcerns::Engine => '/'\n"\
11
11
  end
12
-
13
- inject_into_file 'config/routes.rb', after: /root 'welcome#index'\s*\n/ do
14
- " default_url_options Rails.application.config.action_mailer.default_url_options\n"\
15
- end
16
- end
17
-
18
- def install_default_url
19
- inject_into_file 'config/environments/development.rb', after: /Rails.application.configure do\s*\n/ do
20
- " config.action_mailer.default_url_options = { host: 'localhost:3000' }\n"\
21
- end
22
-
23
- inject_into_file 'config/environments/test.rb', after: /Rails.application.configure do\s*\n/ do
24
- " config.action_mailer.default_url_options = { host: 'localhost:3000' }\n"\
25
- end
26
-
27
- inject_into_file 'config/environments/production.rb', after: /Rails.application.configure do\s*\n/ do
28
- " config.action_mailer.default_url_options = { host: 'geo.example.com', protocol: 'https' }\n"\
29
- end
30
12
  end
31
13
 
32
14
  def install_ability
@@ -79,9 +61,11 @@ module GeoConcerns
79
61
  end
80
62
  end
81
63
 
82
- def install_mapnik_config
83
- file_path = 'config/mapnik.yml'
84
- copy_file file_path, file_path
64
+ def install_simpler_tiles_config
65
+ initializer_path = 'config/initializers/simpler_tiles.rb'
66
+ yaml_path = 'config/simpler_tiles.yml'
67
+ copy_file yaml_path, yaml_path
68
+ copy_file initializer_path, initializer_path
85
69
  end
86
70
 
87
71
  def install_geoserver_config
@@ -89,6 +73,20 @@ module GeoConcerns
89
73
  copy_file file_path, file_path
90
74
  end
91
75
 
76
+ def install_messaging_config
77
+ config_file_path = 'config/messaging.yml'
78
+ initializer_file_path = 'config/initializers/messaging_config.rb'
79
+ copy_file config_file_path, config_file_path
80
+ copy_file initializer_file_path, initializer_file_path
81
+ end
82
+
83
+ def install_geoblacklight_config
84
+ config_file_path = 'config/geoblacklight.yml'
85
+ initializer_file_path = 'config/initializers/geoblacklight_config.rb'
86
+ copy_file config_file_path, config_file_path
87
+ copy_file initializer_file_path, initializer_file_path
88
+ end
89
+
92
90
  def inject_into_file_set
93
91
  file_path = 'app/models/file_set.rb'
94
92
  if File.exist?(file_path)
@@ -138,10 +136,6 @@ module GeoConcerns
138
136
  end
139
137
  end
140
138
 
141
- def install_locale_config
142
- copy_file 'config/locales/geo_concerns.en.yml'
143
- end
144
-
145
139
  private
146
140
 
147
141
  def install_work