search_solr_tools 3.1.2

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 (53) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +88 -0
  3. data/COPYING +674 -0
  4. data/README.md +203 -0
  5. data/bin/search_solr_tools +87 -0
  6. data/lib/search_solr_tools.rb +8 -0
  7. data/lib/search_solr_tools/config/environments.rb +12 -0
  8. data/lib/search_solr_tools/config/environments.yaml +73 -0
  9. data/lib/search_solr_tools/harvesters/ade_auto_suggest.rb +43 -0
  10. data/lib/search_solr_tools/harvesters/auto_suggest.rb +61 -0
  11. data/lib/search_solr_tools/harvesters/base.rb +183 -0
  12. data/lib/search_solr_tools/harvesters/bcodmo.rb +55 -0
  13. data/lib/search_solr_tools/harvesters/cisl.rb +63 -0
  14. data/lib/search_solr_tools/harvesters/echo.rb +50 -0
  15. data/lib/search_solr_tools/harvesters/eol.rb +53 -0
  16. data/lib/search_solr_tools/harvesters/ices.rb +55 -0
  17. data/lib/search_solr_tools/harvesters/nmi.rb +32 -0
  18. data/lib/search_solr_tools/harvesters/nodc.rb +72 -0
  19. data/lib/search_solr_tools/harvesters/nsidc_auto_suggest.rb +33 -0
  20. data/lib/search_solr_tools/harvesters/nsidc_json.rb +60 -0
  21. data/lib/search_solr_tools/harvesters/oai.rb +59 -0
  22. data/lib/search_solr_tools/harvesters/pdc.rb +38 -0
  23. data/lib/search_solr_tools/harvesters/rda.rb +33 -0
  24. data/lib/search_solr_tools/harvesters/tdar.rb +57 -0
  25. data/lib/search_solr_tools/harvesters/usgs.rb +74 -0
  26. data/lib/search_solr_tools/helpers/bounding_box_util.rb +37 -0
  27. data/lib/search_solr_tools/helpers/csw_iso_query_builder.rb +30 -0
  28. data/lib/search_solr_tools/helpers/facet_configuration.rb +19 -0
  29. data/lib/search_solr_tools/helpers/iso_namespaces.rb +30 -0
  30. data/lib/search_solr_tools/helpers/iso_to_solr.rb +96 -0
  31. data/lib/search_solr_tools/helpers/iso_to_solr_format.rb +198 -0
  32. data/lib/search_solr_tools/helpers/query_builder.rb +13 -0
  33. data/lib/search_solr_tools/helpers/selectors.rb +20 -0
  34. data/lib/search_solr_tools/helpers/solr_format.rb +260 -0
  35. data/lib/search_solr_tools/helpers/tdar_format.rb +70 -0
  36. data/lib/search_solr_tools/helpers/translate_spatial_coverage.rb +77 -0
  37. data/lib/search_solr_tools/helpers/translate_temporal_coverage.rb +40 -0
  38. data/lib/search_solr_tools/helpers/usgs_format.rb +50 -0
  39. data/lib/search_solr_tools/selectors/cisl.rb +112 -0
  40. data/lib/search_solr_tools/selectors/echo_iso.rb +111 -0
  41. data/lib/search_solr_tools/selectors/ices_iso.rb +107 -0
  42. data/lib/search_solr_tools/selectors/nmi.rb +106 -0
  43. data/lib/search_solr_tools/selectors/nodc_iso.rb +107 -0
  44. data/lib/search_solr_tools/selectors/pdc_iso.rb +108 -0
  45. data/lib/search_solr_tools/selectors/rda.rb +106 -0
  46. data/lib/search_solr_tools/selectors/tdar_opensearch.rb +89 -0
  47. data/lib/search_solr_tools/selectors/usgs_iso.rb +105 -0
  48. data/lib/search_solr_tools/translators/bcodmo_json.rb +69 -0
  49. data/lib/search_solr_tools/translators/eol_to_solr.rb +78 -0
  50. data/lib/search_solr_tools/translators/nsidc_json.rb +190 -0
  51. data/lib/search_solr_tools/version.rb +3 -0
  52. data/search_solr_tools.gemspec +45 -0
  53. metadata +345 -0
@@ -0,0 +1,69 @@
1
+ require 'json'
2
+ require 'rest-client'
3
+ require 'rgeo/geo_json'
4
+ require 'rgeo/wkrep/wkt_parser'
5
+
6
+ require 'search_solr_tools'
7
+
8
+ module SearchSolrTools
9
+ module Translators
10
+ # Translates Bcodmo json to solr json format
11
+ class BcodmoJsonToSolr
12
+ # rubocop:disable MethodLength
13
+ # rubocop:disable AbcSize
14
+ def translate(json_doc, json_record, geometry)
15
+ originators = json_doc.key?('people') ? JSON.parse(RestClient.get((json_doc['people']))) : []
16
+ spatial_values = translate_geometry geometry
17
+ temporal_coverage_values = Helpers::TranslateTemporalCoverage.translate_coverages [{ 'start' => "#{json_record['startDate']}", 'end' => "#{json_record['endDate']}" }]
18
+ {
19
+ 'title' => json_doc['dataset_name'],
20
+ 'authoritative_id' => json_record['id'] + json_doc['dataset_nid'],
21
+ 'dataset_version' => translate_dataset_version(json_doc['dataset_version']),
22
+ 'data_centers' => Helpers::SolrFormat::DATA_CENTER_NAMES[:BCODMO][:long_name],
23
+ 'facet_data_center' => "#{Helpers::SolrFormat::DATA_CENTER_NAMES[:BCODMO][:long_name]} | #{Helpers::SolrFormat::DATA_CENTER_NAMES[:BCODMO][:short_name]}",
24
+ 'summary' => json_doc['dataset_description'].to_s.empty? ? json_doc['dataset_brief_description'] : json_doc['dataset_description'],
25
+ 'temporal_coverages' => temporal_coverage_values['temporal_coverages'],
26
+ 'temporal_duration' => temporal_coverage_values['temporal_duration'],
27
+ 'temporal' => temporal_coverage_values['temporal'],
28
+ 'facet_temporal_duration' => temporal_coverage_values['facet_temporal_duration'],
29
+ 'last_revision_date' => json_doc['dataset_deployment_version_date'].to_s.empty? ? nil : Time.parse(json_doc['dataset_deployment_version_date']).strftime('%Y-%m-%dT%H:%M:%SZ'),
30
+ 'dataset_url' => json_doc['dataset_url'],
31
+ 'source' => 'ADE',
32
+ 'facet_spatial_coverage' => spatial_values[:global_facet],
33
+ 'facet_spatial_scope' => spatial_values[:spatial_scope_facet],
34
+ 'spatial_coverages' => spatial_values[:spatial_display],
35
+ 'spatial_area' => spatial_values[:spatial_area],
36
+ 'spatial' => spatial_values[:spatial_index],
37
+ 'data_access_urls' => json_doc.key?('dataset_deployment_url') ? json_doc['dataset_deployment_url'] : [],
38
+ 'authors' => parse_people(originators)
39
+ }
40
+ end
41
+ # rubocop:enable MethodLength
42
+
43
+ def translate_dataset_version(dataset_version)
44
+ version_translation = dataset_version.to_s.gsub(/\D/, '')
45
+ version_translation.empty? ? nil : version_translation
46
+ end
47
+
48
+ def parse_people(people_json)
49
+ people_json.map { |entry| entry['person_name'] } unless people_json.empty?
50
+ end
51
+
52
+ def translate_geometry(wkt_geom)
53
+ wkt_geom['geometry'].sub! '<http://www.opengis.net/def/crs/OGC/1.3/CRS84> ', ''
54
+ # Consider all linestring and polygon geometries to be multipoint for this provider
55
+ wkt_geom['geometry'].sub! 'LINESTRING', 'MULTIPOINT'
56
+ wkt_geom['geometry'].sub! 'POLYGON', 'MULTIPOINT'
57
+ parser = RGeo::WKRep::WKTParser.new(nil, {})
58
+ geometry = parser.parse(wkt_geom['geometry'])
59
+ {
60
+ spatial_display: Helpers::TranslateSpatialCoverage.geojson_to_spatial_display_str([geometry]),
61
+ spatial_index: Helpers::TranslateSpatialCoverage.geojson_to_spatial_index_str([geometry]),
62
+ spatial_area: Helpers::TranslateSpatialCoverage.geojson_to_spatial_area([geometry]),
63
+ global_facet: Helpers::TranslateSpatialCoverage.geojson_to_global_facet([geometry]),
64
+ spatial_scope_facet: Helpers::TranslateSpatialCoverage.geojson_to_spatial_scope_facet([geometry])
65
+ }
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,78 @@
1
+ module SearchSolrTools
2
+ module Translators
3
+ # Translates an EOL THREDDS dataset link set into a SOLR json ingest record
4
+ class EolToSolr
5
+ # rubocop:disable Metrics/AbcSize
6
+ # rubocop:disable Metrics/MethodLength
7
+
8
+ def translate(title_metadata, dataset_metadata)
9
+ temporal_coverage_values = Helpers::TranslateTemporalCoverage.translate_coverages get_time_coverages(dataset_metadata)
10
+ rev_date = dataset_metadata.xpath('//xmlns:date[@type="metadataCreated"]').text
11
+ geospatial_coverage = parse_geospatial_coverages(dataset_metadata)
12
+ {
13
+ 'title' => title_metadata.xpath('//xmlns:dataset').first['name'],
14
+ 'authoritative_id' => title_metadata.xpath('//xmlns:dataset').first['ID'],
15
+ 'data_centers' => Helpers::SolrFormat::DATA_CENTER_NAMES[:EOL][:long_name],
16
+ 'facet_data_center' => "#{Helpers::SolrFormat::DATA_CENTER_NAMES[:EOL][:long_name]} | #{Helpers::SolrFormat::DATA_CENTER_NAMES[:EOL][:short_name]}",
17
+ 'summary' => dataset_metadata.xpath('//xmlns:documentation[@type="summary"]').text,
18
+ 'temporal_coverages' => temporal_coverage_values['temporal_coverages'],
19
+ 'temporal_duration' => temporal_coverage_values['temporal_duration'],
20
+ 'temporal' => temporal_coverage_values['temporal'],
21
+ 'facet_temporal_duration' => temporal_coverage_values['facet_temporal_duration'],
22
+ 'last_revision_date' => rev_date.empty? ? Helpers::SolrFormat.date_str(DateTime.now) : Helpers::SolrFormat.date_str(rev_date),
23
+ 'source' => 'ADE',
24
+ 'keywords' => dataset_metadata.xpath('//xmlns:keyword').map(&:text),
25
+ 'authors' => dataset_metadata.xpath('//xmlns:contributor[@role="author"]').map { |node| parse_eol_authors(node.text) }.join(', '),
26
+ 'dataset_url' => eol_dataset_url(dataset_metadata),
27
+ 'facet_spatial_coverage' => Helpers::BoundingBoxUtil.box_global?(geospatial_coverage),
28
+ 'facet_spatial_scope' => Helpers::SolrFormat.get_spatial_scope_facet_with_bounding_box(geospatial_coverage),
29
+ 'spatial_coverages' => %i(south west north east).map { |d| geospatial_coverage[d] }.join(' '),
30
+ 'spatial_area' => spatial_coverage_to_spatial_area(geospatial_coverage),
31
+ 'spatial' => %i(west south east north).map { |d| geospatial_coverage[d] }.join(' ')
32
+ }
33
+ end
34
+
35
+ def eol_dataset_url(node)
36
+ node.xpath('//xmlns:documentation[@xlink:href]').each do |doc|
37
+ return doc['xlink:href'] if doc['xlink:href'].match('http://data.eol.ucar.edu/codiac/dss/id=(\S*)')
38
+ end
39
+ rescue Nokogiri::XML::XPath::SyntaxError
40
+ puts "Warning - no documentation URL found in the following node: #{node.to_html}"
41
+ end
42
+
43
+ def parse_eol_authors(author)
44
+ if author.include?(' AT ') && author.include?(' dot ')
45
+ author = author[0..author.rindex(',') - 1]
46
+ end
47
+ author
48
+ end
49
+
50
+ def get_time_coverages(doc)
51
+ doc.xpath('//xmlns:timeCoverage').map do |node|
52
+ { 'start' => node.xpath('./xmlns:start').text,
53
+ 'end' => node.xpath('./xmlns:end').text }
54
+ end
55
+ end
56
+
57
+ def spatial_coverage_to_spatial_area(coverage)
58
+ return if [:north, :south].any? { |x| coverage[x].nil? }
59
+ coverage[:north].abs - coverage[:south].abs
60
+ end
61
+
62
+ def parse_geospatial_coverages(doc)
63
+ node = doc.xpath('//xmlns:geospatialCoverage')
64
+ south = node.xpath('./xmlns:northsouth/xmlns:start').text.to_f
65
+ north = south + (node.xpath('./xmlns:northsouth/xmlns:size').text.to_f)
66
+ west = node.xpath('./xmlns:eastwest/xmlns:start').text.to_f
67
+ east = west + (node.xpath('./xmlns:eastwest/xmlns:size').text.to_f)
68
+ # EOL uses out-of-range east-west values to represent bounding boxes
69
+ # that cross the date line. For any box with a value out of range,
70
+ # adjust the east/west value to lie within the -180 to 180 range.
71
+ east -= 360 if east > 180
72
+ west += 360 if west < -180
73
+
74
+ { east: east, west: west, north: north, south: south }
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,190 @@
1
+ # rubocop:disable Metrics/ClassLength
2
+ require 'rgeo/geo_json'
3
+
4
+ require 'search_solr_tools'
5
+
6
+ module SearchSolrTools
7
+ module Translators
8
+ # Translates NSIDC JSON format to Solr JSON add format
9
+ class NsidcJsonToSolr
10
+ PARAMETER_PARTS = %w(category topic term variableLevel1 variableLevel2 variableLevel3 detailedVariable)
11
+
12
+ # rubocop:disable Metrics/MethodLength
13
+ # rubocop:disable Metrics/AbcSize
14
+ def translate(json_doc)
15
+ copy_keys = %w(title summary keywords brokered)
16
+ temporal_coverage_values = Helpers::TranslateTemporalCoverage.translate_coverages json_doc['temporalCoverages']
17
+ spatial_coverages = convert_spatial_coverages(json_doc['spatialCoverages'])
18
+
19
+ solr_add_hash = json_doc.select { |k, _v| copy_keys.include?(k) }
20
+ solr_add_hash.merge!(
21
+ 'authoritative_id' => json_doc['authoritativeId'],
22
+ 'dataset_version' => json_doc['majorVersion']['version'],
23
+ 'data_centers' => Helpers::SolrFormat::DATA_CENTER_NAMES[:NSIDC][:long_name],
24
+ 'facet_data_center' => "#{Helpers::SolrFormat::DATA_CENTER_NAMES[:NSIDC][:long_name]} | #{Helpers::SolrFormat::DATA_CENTER_NAMES[:NSIDC][:short_name]}",
25
+ 'authors' => translate_personnel_and_creators_to_authors(json_doc['personnel'], generate_data_citation_creators(json_doc['dataCitation'])),
26
+ 'topics' => translate_iso_topic_categories(json_doc['isoTopicCategories']),
27
+ 'parameters' => translate_parameters(json_doc['parameters']),
28
+ 'full_parameters' => translate_json_string(json_doc['parameters'], PARAMETER_PARTS),
29
+ 'facet_parameter' => translate_parameters_to_facet_parameters(json_doc['parameters']),
30
+ 'platforms' => translate_json_string(json_doc['platforms']),
31
+ 'sensors' => translate_json_string(json_doc['instruments']),
32
+ 'facet_sensor' => translate_sensor_to_facet_sensor(json_doc['instruments']),
33
+ 'published_date' => (Helpers::SolrFormat.date_str json_doc['releaseDate']),
34
+ 'spatial_coverages' => Helpers::TranslateSpatialCoverage.geojson_to_spatial_display_str(spatial_coverages),
35
+ 'spatial' => Helpers::TranslateSpatialCoverage.geojson_to_spatial_index_str(spatial_coverages),
36
+ 'spatial_area' => Helpers::TranslateSpatialCoverage.geojson_to_spatial_area(spatial_coverages),
37
+ 'facet_spatial_coverage' => Helpers::TranslateSpatialCoverage.geojson_to_global_facet(spatial_coverages),
38
+ 'facet_spatial_scope' => Helpers::TranslateSpatialCoverage.geojson_to_spatial_scope_facet(spatial_coverages),
39
+ 'temporal_coverages' => temporal_coverage_values['temporal_coverages'],
40
+ 'temporal_duration' => temporal_coverage_values['temporal_duration'],
41
+ 'temporal' => temporal_coverage_values['temporal'],
42
+ 'facet_temporal_duration' => temporal_coverage_values['facet_temporal_duration'],
43
+ 'last_revision_date' => (Helpers::SolrFormat.date_str json_doc['lastRevisionDate']),
44
+ 'dataset_url' => json_doc['datasetUrl'],
45
+ 'distribution_formats' => json_doc['distributionFormats'],
46
+ 'facet_format' => (json_doc['distributionFormats'].empty?) ? [Helpers::SolrFormat::NOT_SPECIFIED] : translate_format_to_facet_format(json_doc['distributionFormats']),
47
+ 'source' => %w(NSIDC ADE),
48
+ 'popularity' => json_doc['popularity'],
49
+ 'facet_sponsored_program' => translate_short_long_names_to_facet_value(json_doc['internalDataCenters']),
50
+ 'facet_temporal_resolution' => translate_temporal_resolution_facet_values(json_doc['parameters']),
51
+ 'facet_spatial_resolution' => translate_spatial_resolution_facet_values(json_doc['parameters'])
52
+ )
53
+ end
54
+ # rubocop:enable Metrics/MethodLength
55
+ # rubocop:enable Metrics/AbcSize
56
+
57
+ def convert_spatial_coverages(nsidc_geom)
58
+ geometries = []
59
+ nsidc_geom.each do |entry|
60
+ geometries << RGeo::GeoJSON.decode(entry['geom4326'])
61
+ end
62
+ geometries
63
+ end
64
+
65
+ def translate_sensor_to_facet_sensor(json)
66
+ facet_values = []
67
+ return facet_values if json.nil?
68
+ json.each do |json_entry|
69
+ sensor_bin = Helpers::SolrFormat.facet_binning('sensor', json_entry['shortName'].to_s)
70
+ if sensor_bin.eql? json_entry['shortName']
71
+ facet_values << "#{json_entry['longName']} | #{json_entry['shortName']}"
72
+ else
73
+ facet_values << " | #{sensor_bin}"
74
+ end
75
+ end
76
+ facet_values
77
+ end
78
+
79
+ def translate_temporal_resolution_facet_values(parameters_json)
80
+ temporal_resolutions = []
81
+ parameters_json.each do |param_json|
82
+ binned_temporal_res = Helpers::SolrFormat.resolution_value(param_json['temporalResolution'], :find_index_for_single_temporal_resolution_value, Helpers::SolrFormat::TEMPORAL_RESOLUTION_FACET_VALUES)
83
+ temporal_resolutions << binned_temporal_res unless binned_temporal_res.to_s.empty?
84
+ end
85
+ temporal_resolutions.flatten.uniq
86
+ end
87
+
88
+ def translate_spatial_resolution_facet_values(parameters_json)
89
+ spatial_resolutions = []
90
+ parameters_json.each do |param_json|
91
+ binned_res = Helpers::SolrFormat.resolution_value(param_json['spatialYResolution'], :find_index_for_single_spatial_resolution_value, Helpers::SolrFormat::SPATIAL_RESOLUTION_FACET_VALUES)
92
+ spatial_resolutions << binned_res unless binned_res.to_s.empty?
93
+ end
94
+ spatial_resolutions.flatten.uniq
95
+ end
96
+
97
+ def translate_iso_topic_categories(iso_topic_categories_json)
98
+ iso_topic_categories_json.map { |t| t['name'] } unless iso_topic_categories_json.nil?
99
+ end
100
+
101
+ def translate_short_long_names_to_facet_value(json)
102
+ facet_values = []
103
+ return facet_values if json.nil?
104
+ json.each do |json_entry|
105
+ long_name = json_entry['longName'].nil? ? '' : json_entry['longName']
106
+ short_name = json_entry['shortName'].nil? ? '' : json_entry['shortName']
107
+
108
+ facet_values << "#{long_name} | #{short_name}"
109
+ end
110
+ facet_values
111
+ end
112
+
113
+ def translate_personnel_and_creators_to_authors(personnel_json, creator_json)
114
+ author_set = (personnel_json.to_a | creator_json.to_a)
115
+
116
+ authors = author_set.map do |author|
117
+ first = author['firstName'].to_s
118
+ middle = author['middleName'].to_s
119
+ last = author['lastName'].to_s
120
+
121
+ full = [first, middle, last].reject(&:empty?)
122
+ full.join(' ').strip
123
+ end
124
+
125
+ authors.reject! do |author|
126
+ author.empty? || author == 'NSIDC User Services'
127
+ end
128
+
129
+ authors.uniq
130
+ end
131
+
132
+ def translate_parameters(parameters_json)
133
+ parameters = []
134
+ parameters_json.each do |param_json|
135
+ parameters.concat(generate_part_array(param_json, PARAMETER_PARTS))
136
+ end
137
+ parameters
138
+ end
139
+
140
+ def translate_parameters_to_facet_parameters(parameters_json)
141
+ parameters_strings = translate_json_string(parameters_json, PARAMETER_PARTS)
142
+ return [] if parameters_strings.nil?
143
+ facet_params = []
144
+ parameters_strings.each do |str|
145
+ facet_params << Helpers::SolrFormat.parameter_binning(str)
146
+ end
147
+ facet_params
148
+ end
149
+
150
+ def translate_format_to_facet_format(format_json)
151
+ return [] if format_json.nil?
152
+
153
+ facet_format = []
154
+
155
+ format_json.each do |format|
156
+ facet_format << Helpers::SolrFormat.facet_binning('format', format)
157
+ end
158
+ facet_format
159
+ end
160
+
161
+ def translate_json_string(json, limit_values = nil)
162
+ json_strings = []
163
+
164
+ json.each do |item|
165
+ json_string = generate_part_array(item, limit_values).join(' > ')
166
+ json_strings << json_string unless json_string.empty?
167
+ end
168
+
169
+ json_strings.uniq
170
+ end
171
+
172
+ def generate_data_citation_creators(data_citation)
173
+ data_citation.nil? ? creators = [] : creators = data_citation['creators']
174
+ creators
175
+ end
176
+
177
+ def generate_part_array(json, limit_values = nil)
178
+ parts = []
179
+ json = json.select { |k, _v| limit_values.include?(k) } unless limit_values.nil? || limit_values.empty?
180
+
181
+ json.each do |_k, v|
182
+ parts << v unless v.to_s.empty?
183
+ end
184
+
185
+ parts
186
+ end
187
+ end
188
+ # rubocop:enable Metrics/ClassLength
189
+ end
190
+ end
@@ -0,0 +1,3 @@
1
+ module SearchSolrTools
2
+ VERSION = '3.1.2'
3
+ end
@@ -0,0 +1,45 @@
1
+ $LOAD_PATH.unshift File.expand_path('../lib', __FILE__)
2
+ require 'search_solr_tools/version'
3
+
4
+ # no need for tests or dev files like .rubocop.yml to be packaged with the gem
5
+ gem_files = %(CHANGELOG.md COPYING README.md bin/ lib/ search_solr_tools.gemspec)
6
+
7
+ Gem::Specification.new do |spec|
8
+ spec.name = 'search_solr_tools'
9
+ spec.version = SearchSolrTools::VERSION
10
+ spec.authors = ['Chris Chalstrom', 'Michael Brandt', 'Jonathan Kovarik', 'Luis Lopez', 'Stuart Reed']
11
+ spec.email = ['cchalstr@nsidc.org', 'mbrandt@colorado.edu', 'kovarik@nsidc.org', 'luis.lopezespinosa@colorado.edu', 'stuart.reed@colorado.edu']
12
+ spec.summary = 'Tools to harvest and manage various scientific dataset feeds in a Solr instance.'
13
+ spec.description = <<-EOF
14
+ Ruby translators to transform various metadata feeds into solr documents and
15
+ a command-line utility to access/utilize the gem's translators to harvest
16
+ metadata into a working solr instance.
17
+ EOF
18
+ spec.homepage = 'https://github.com/nsidc/search-solr-tools'
19
+ spec.license = 'GNU GPL Version 3'
20
+
21
+ spec.files = `git ls-files -z #{gem_files}`.split("\x0")
22
+ spec.executables = spec.files.grep(/^bin\//) { |f| File.basename(f) }
23
+ spec.test_files = spec.files.grep(/^(test|spec|features)\//)
24
+ spec.require_paths = ['lib']
25
+
26
+ spec.required_ruby_version = '~> 2.0'
27
+
28
+ spec.add_runtime_dependency 'iso8601', '~> 0.8'
29
+ spec.add_runtime_dependency 'multi_json', '~> 1.11'
30
+ spec.add_runtime_dependency 'nokogiri', '~> 1.6'
31
+ spec.add_runtime_dependency 'require_all', '~> 1.3'
32
+ spec.add_runtime_dependency 'rest-client', '~> 1.6'
33
+ spec.add_runtime_dependency 'rgeo', '~> 0.3'
34
+ spec.add_runtime_dependency 'rgeo-geojson', '~> 0.3'
35
+ spec.add_runtime_dependency 'rsolr', '~> 1.0'
36
+ spec.add_runtime_dependency 'thor', '~> 0.18'
37
+ spec.add_development_dependency 'gem-release', '~> 0.7'
38
+ spec.add_development_dependency 'guard', '~> 2.12'
39
+ spec.add_development_dependency 'guard-rspec', '~> 4.6'
40
+ spec.add_development_dependency 'guard-rubocop', '~> 1.2'
41
+ spec.add_development_dependency 'rake', '~> 10.4'
42
+ spec.add_development_dependency 'rspec', '~> 3.2'
43
+ spec.add_development_dependency 'rubocop', '~> 0.32'
44
+ spec.add_development_dependency 'webmock', '~> 1.13'
45
+ end
metadata ADDED
@@ -0,0 +1,345 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: search_solr_tools
3
+ version: !ruby/object:Gem::Version
4
+ version: 3.1.2
5
+ platform: ruby
6
+ authors:
7
+ - Chris Chalstrom
8
+ - Michael Brandt
9
+ - Jonathan Kovarik
10
+ - Luis Lopez
11
+ - Stuart Reed
12
+ autorequire:
13
+ bindir: bin
14
+ cert_chain: []
15
+ date: 2015-06-30 00:00:00.000000000 Z
16
+ dependencies:
17
+ - !ruby/object:Gem::Dependency
18
+ name: iso8601
19
+ requirement: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - "~>"
22
+ - !ruby/object:Gem::Version
23
+ version: '0.8'
24
+ type: :runtime
25
+ prerelease: false
26
+ version_requirements: !ruby/object:Gem::Requirement
27
+ requirements:
28
+ - - "~>"
29
+ - !ruby/object:Gem::Version
30
+ version: '0.8'
31
+ - !ruby/object:Gem::Dependency
32
+ name: multi_json
33
+ requirement: !ruby/object:Gem::Requirement
34
+ requirements:
35
+ - - "~>"
36
+ - !ruby/object:Gem::Version
37
+ version: '1.11'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ requirements:
42
+ - - "~>"
43
+ - !ruby/object:Gem::Version
44
+ version: '1.11'
45
+ - !ruby/object:Gem::Dependency
46
+ name: nokogiri
47
+ requirement: !ruby/object:Gem::Requirement
48
+ requirements:
49
+ - - "~>"
50
+ - !ruby/object:Gem::Version
51
+ version: '1.6'
52
+ type: :runtime
53
+ prerelease: false
54
+ version_requirements: !ruby/object:Gem::Requirement
55
+ requirements:
56
+ - - "~>"
57
+ - !ruby/object:Gem::Version
58
+ version: '1.6'
59
+ - !ruby/object:Gem::Dependency
60
+ name: require_all
61
+ requirement: !ruby/object:Gem::Requirement
62
+ requirements:
63
+ - - "~>"
64
+ - !ruby/object:Gem::Version
65
+ version: '1.3'
66
+ type: :runtime
67
+ prerelease: false
68
+ version_requirements: !ruby/object:Gem::Requirement
69
+ requirements:
70
+ - - "~>"
71
+ - !ruby/object:Gem::Version
72
+ version: '1.3'
73
+ - !ruby/object:Gem::Dependency
74
+ name: rest-client
75
+ requirement: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - "~>"
78
+ - !ruby/object:Gem::Version
79
+ version: '1.6'
80
+ type: :runtime
81
+ prerelease: false
82
+ version_requirements: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - "~>"
85
+ - !ruby/object:Gem::Version
86
+ version: '1.6'
87
+ - !ruby/object:Gem::Dependency
88
+ name: rgeo
89
+ requirement: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - "~>"
92
+ - !ruby/object:Gem::Version
93
+ version: '0.3'
94
+ type: :runtime
95
+ prerelease: false
96
+ version_requirements: !ruby/object:Gem::Requirement
97
+ requirements:
98
+ - - "~>"
99
+ - !ruby/object:Gem::Version
100
+ version: '0.3'
101
+ - !ruby/object:Gem::Dependency
102
+ name: rgeo-geojson
103
+ requirement: !ruby/object:Gem::Requirement
104
+ requirements:
105
+ - - "~>"
106
+ - !ruby/object:Gem::Version
107
+ version: '0.3'
108
+ type: :runtime
109
+ prerelease: false
110
+ version_requirements: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - "~>"
113
+ - !ruby/object:Gem::Version
114
+ version: '0.3'
115
+ - !ruby/object:Gem::Dependency
116
+ name: rsolr
117
+ requirement: !ruby/object:Gem::Requirement
118
+ requirements:
119
+ - - "~>"
120
+ - !ruby/object:Gem::Version
121
+ version: '1.0'
122
+ type: :runtime
123
+ prerelease: false
124
+ version_requirements: !ruby/object:Gem::Requirement
125
+ requirements:
126
+ - - "~>"
127
+ - !ruby/object:Gem::Version
128
+ version: '1.0'
129
+ - !ruby/object:Gem::Dependency
130
+ name: thor
131
+ requirement: !ruby/object:Gem::Requirement
132
+ requirements:
133
+ - - "~>"
134
+ - !ruby/object:Gem::Version
135
+ version: '0.18'
136
+ type: :runtime
137
+ prerelease: false
138
+ version_requirements: !ruby/object:Gem::Requirement
139
+ requirements:
140
+ - - "~>"
141
+ - !ruby/object:Gem::Version
142
+ version: '0.18'
143
+ - !ruby/object:Gem::Dependency
144
+ name: gem-release
145
+ requirement: !ruby/object:Gem::Requirement
146
+ requirements:
147
+ - - "~>"
148
+ - !ruby/object:Gem::Version
149
+ version: '0.7'
150
+ type: :development
151
+ prerelease: false
152
+ version_requirements: !ruby/object:Gem::Requirement
153
+ requirements:
154
+ - - "~>"
155
+ - !ruby/object:Gem::Version
156
+ version: '0.7'
157
+ - !ruby/object:Gem::Dependency
158
+ name: guard
159
+ requirement: !ruby/object:Gem::Requirement
160
+ requirements:
161
+ - - "~>"
162
+ - !ruby/object:Gem::Version
163
+ version: '2.12'
164
+ type: :development
165
+ prerelease: false
166
+ version_requirements: !ruby/object:Gem::Requirement
167
+ requirements:
168
+ - - "~>"
169
+ - !ruby/object:Gem::Version
170
+ version: '2.12'
171
+ - !ruby/object:Gem::Dependency
172
+ name: guard-rspec
173
+ requirement: !ruby/object:Gem::Requirement
174
+ requirements:
175
+ - - "~>"
176
+ - !ruby/object:Gem::Version
177
+ version: '4.6'
178
+ type: :development
179
+ prerelease: false
180
+ version_requirements: !ruby/object:Gem::Requirement
181
+ requirements:
182
+ - - "~>"
183
+ - !ruby/object:Gem::Version
184
+ version: '4.6'
185
+ - !ruby/object:Gem::Dependency
186
+ name: guard-rubocop
187
+ requirement: !ruby/object:Gem::Requirement
188
+ requirements:
189
+ - - "~>"
190
+ - !ruby/object:Gem::Version
191
+ version: '1.2'
192
+ type: :development
193
+ prerelease: false
194
+ version_requirements: !ruby/object:Gem::Requirement
195
+ requirements:
196
+ - - "~>"
197
+ - !ruby/object:Gem::Version
198
+ version: '1.2'
199
+ - !ruby/object:Gem::Dependency
200
+ name: rake
201
+ requirement: !ruby/object:Gem::Requirement
202
+ requirements:
203
+ - - "~>"
204
+ - !ruby/object:Gem::Version
205
+ version: '10.4'
206
+ type: :development
207
+ prerelease: false
208
+ version_requirements: !ruby/object:Gem::Requirement
209
+ requirements:
210
+ - - "~>"
211
+ - !ruby/object:Gem::Version
212
+ version: '10.4'
213
+ - !ruby/object:Gem::Dependency
214
+ name: rspec
215
+ requirement: !ruby/object:Gem::Requirement
216
+ requirements:
217
+ - - "~>"
218
+ - !ruby/object:Gem::Version
219
+ version: '3.2'
220
+ type: :development
221
+ prerelease: false
222
+ version_requirements: !ruby/object:Gem::Requirement
223
+ requirements:
224
+ - - "~>"
225
+ - !ruby/object:Gem::Version
226
+ version: '3.2'
227
+ - !ruby/object:Gem::Dependency
228
+ name: rubocop
229
+ requirement: !ruby/object:Gem::Requirement
230
+ requirements:
231
+ - - "~>"
232
+ - !ruby/object:Gem::Version
233
+ version: '0.32'
234
+ type: :development
235
+ prerelease: false
236
+ version_requirements: !ruby/object:Gem::Requirement
237
+ requirements:
238
+ - - "~>"
239
+ - !ruby/object:Gem::Version
240
+ version: '0.32'
241
+ - !ruby/object:Gem::Dependency
242
+ name: webmock
243
+ requirement: !ruby/object:Gem::Requirement
244
+ requirements:
245
+ - - "~>"
246
+ - !ruby/object:Gem::Version
247
+ version: '1.13'
248
+ type: :development
249
+ prerelease: false
250
+ version_requirements: !ruby/object:Gem::Requirement
251
+ requirements:
252
+ - - "~>"
253
+ - !ruby/object:Gem::Version
254
+ version: '1.13'
255
+ description: |2
256
+ Ruby translators to transform various metadata feeds into solr documents and
257
+ a command-line utility to access/utilize the gem's translators to harvest
258
+ metadata into a working solr instance.
259
+ email:
260
+ - cchalstr@nsidc.org
261
+ - mbrandt@colorado.edu
262
+ - kovarik@nsidc.org
263
+ - luis.lopezespinosa@colorado.edu
264
+ - stuart.reed@colorado.edu
265
+ executables:
266
+ - search_solr_tools
267
+ extensions: []
268
+ extra_rdoc_files: []
269
+ files:
270
+ - CHANGELOG.md
271
+ - COPYING
272
+ - README.md
273
+ - bin/search_solr_tools
274
+ - lib/search_solr_tools.rb
275
+ - lib/search_solr_tools/config/environments.rb
276
+ - lib/search_solr_tools/config/environments.yaml
277
+ - lib/search_solr_tools/harvesters/ade_auto_suggest.rb
278
+ - lib/search_solr_tools/harvesters/auto_suggest.rb
279
+ - lib/search_solr_tools/harvesters/base.rb
280
+ - lib/search_solr_tools/harvesters/bcodmo.rb
281
+ - lib/search_solr_tools/harvesters/cisl.rb
282
+ - lib/search_solr_tools/harvesters/echo.rb
283
+ - lib/search_solr_tools/harvesters/eol.rb
284
+ - lib/search_solr_tools/harvesters/ices.rb
285
+ - lib/search_solr_tools/harvesters/nmi.rb
286
+ - lib/search_solr_tools/harvesters/nodc.rb
287
+ - lib/search_solr_tools/harvesters/nsidc_auto_suggest.rb
288
+ - lib/search_solr_tools/harvesters/nsidc_json.rb
289
+ - lib/search_solr_tools/harvesters/oai.rb
290
+ - lib/search_solr_tools/harvesters/pdc.rb
291
+ - lib/search_solr_tools/harvesters/rda.rb
292
+ - lib/search_solr_tools/harvesters/tdar.rb
293
+ - lib/search_solr_tools/harvesters/usgs.rb
294
+ - lib/search_solr_tools/helpers/bounding_box_util.rb
295
+ - lib/search_solr_tools/helpers/csw_iso_query_builder.rb
296
+ - lib/search_solr_tools/helpers/facet_configuration.rb
297
+ - lib/search_solr_tools/helpers/iso_namespaces.rb
298
+ - lib/search_solr_tools/helpers/iso_to_solr.rb
299
+ - lib/search_solr_tools/helpers/iso_to_solr_format.rb
300
+ - lib/search_solr_tools/helpers/query_builder.rb
301
+ - lib/search_solr_tools/helpers/selectors.rb
302
+ - lib/search_solr_tools/helpers/solr_format.rb
303
+ - lib/search_solr_tools/helpers/tdar_format.rb
304
+ - lib/search_solr_tools/helpers/translate_spatial_coverage.rb
305
+ - lib/search_solr_tools/helpers/translate_temporal_coverage.rb
306
+ - lib/search_solr_tools/helpers/usgs_format.rb
307
+ - lib/search_solr_tools/selectors/cisl.rb
308
+ - lib/search_solr_tools/selectors/echo_iso.rb
309
+ - lib/search_solr_tools/selectors/ices_iso.rb
310
+ - lib/search_solr_tools/selectors/nmi.rb
311
+ - lib/search_solr_tools/selectors/nodc_iso.rb
312
+ - lib/search_solr_tools/selectors/pdc_iso.rb
313
+ - lib/search_solr_tools/selectors/rda.rb
314
+ - lib/search_solr_tools/selectors/tdar_opensearch.rb
315
+ - lib/search_solr_tools/selectors/usgs_iso.rb
316
+ - lib/search_solr_tools/translators/bcodmo_json.rb
317
+ - lib/search_solr_tools/translators/eol_to_solr.rb
318
+ - lib/search_solr_tools/translators/nsidc_json.rb
319
+ - lib/search_solr_tools/version.rb
320
+ - search_solr_tools.gemspec
321
+ homepage: https://github.com/nsidc/search-solr-tools
322
+ licenses:
323
+ - GNU GPL Version 3
324
+ metadata: {}
325
+ post_install_message:
326
+ rdoc_options: []
327
+ require_paths:
328
+ - lib
329
+ required_ruby_version: !ruby/object:Gem::Requirement
330
+ requirements:
331
+ - - "~>"
332
+ - !ruby/object:Gem::Version
333
+ version: '2.0'
334
+ required_rubygems_version: !ruby/object:Gem::Requirement
335
+ requirements:
336
+ - - ">="
337
+ - !ruby/object:Gem::Version
338
+ version: '0'
339
+ requirements: []
340
+ rubyforge_project:
341
+ rubygems_version: 2.4.8
342
+ signing_key:
343
+ specification_version: 4
344
+ summary: Tools to harvest and manage various scientific dataset feeds in a Solr instance.
345
+ test_files: []