uri_service 0.5.6 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: a23d6006da06917691b8db5b5a1a7c77aa7cc50d
4
- data.tar.gz: f89dc8f0cabf1ccaccde2e6bb5d595b9a9e4a280
2
+ SHA256:
3
+ metadata.gz: 2a5e8309e33cf98f187e5f1dc39e5b0c52ea9098146cec6d417c7b4304b7cadc
4
+ data.tar.gz: d05d94ac0bbb449c1492a93fe4ad121dc8399a07843179899794ebdd8293b000
5
5
  SHA512:
6
- metadata.gz: 90e9d786e5bb9277c9118aed2fc38fb840f1d5a6d35d9f04a0a78b7bc04bed1182dc0312397d93f3dd37793d015faddab473ce883c17b1c0e85c1c054b6d747b
7
- data.tar.gz: fd86538bd5259d7300b26061030ad26f36c75aee391bd51456330996ee87dab85ba82fbd25fb91df8c5543af4f08149434d35cecdb13fb43fdacd19e663bcf30
6
+ metadata.gz: 419b95b61f9acd1f729543b49ba530f8f1112a3b5d22aebb1a9ea1308e2fd64057dfbd5a674ab65b2d617d04fc7158ab4367c8dac7e626b66264ad09969f86b6
7
+ data.tar.gz: 6de069fd580769f921b9ca9780a201bc2410f3e7b0f908740b93b37c1935b4b205db662b29c11e8e3d8faf381bfa6d44821f0d6299f21996d06a3a95d54f195c
data/README.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  A database-backed and Solr-cached lookup/creation service for URIs. Works with or without Rails.
4
4
 
5
+ Note: Version 0.6.x and later are meant for use with Solr 8.
6
+
5
7
  ### Major Concepts:
6
8
 
7
9
  **External Term (UriService::TermType::EXTERNAL)**
@@ -31,7 +33,7 @@ UriService::init({
31
33
  'local_uri_base' => 'http://id.example.com/term/',
32
34
  'temporary_uri_base' => 'com:example:id:temporary:',
33
35
  'solr' => {
34
- 'url' => 'http://localhost:8983/solr/uri_service_test',
36
+ 'url' => 'http://localhost:8983/solr/uri_service',
35
37
  'pool_size' => 5,
36
38
  'pool_timeout' => 5000
37
39
  }
@@ -53,7 +55,7 @@ client = UriService::Client.new({
53
55
  'local_uri_base' => 'http://id.example.com/term/',
54
56
  'temporary_uri_base' => 'com:example:id:temporary:',
55
57
  'solr' => {
56
- 'url' => 'http://localhost:8983/solr/uri_service_test',
58
+ 'url' => 'http://localhost:8983/solr/uri_service',
57
59
  'pool_size' => 5,
58
60
  'pool_timeout' => 5000
59
61
  }
@@ -83,7 +85,7 @@ development:
83
85
  local_uri_base: 'http://id.example.com/term/'
84
86
  temporary_uri_base: 'com:example:id:temporary:'
85
87
  solr:
86
- url: 'http://localhost:8983/solr/uri_service_development'
88
+ url: 'http://localhost:8983/solr/uri_service'
87
89
  pool_size: 5
88
90
  pool_timeout: 5000
89
91
  database:
@@ -96,7 +98,7 @@ test:
96
98
  local_uri_base: 'http://id.example.com/term/'
97
99
  temporary_uri_base: 'com:example:id:temporary:'
98
100
  solr:
99
- url: 'http://localhost:8983/solr/uri_service_test'
101
+ url: 'http://localhost:9983/solr/uri_service'
100
102
  pool_size: 5
101
103
  pool_timeout: 5000
102
104
  database:
@@ -109,7 +111,7 @@ production:
109
111
  local_uri_base: 'http://id.example.com/term/'
110
112
  temporary_uri_base: 'com:example:id:temporary:'
111
113
  solr:
112
- url: 'http://localhost:9983/solr/uri_service_production'
114
+ url: 'http://localhost:8983/solr/uri_service_prod'
113
115
  pool_size: 5
114
116
  pool_timeout: 5000
115
117
  database:
@@ -19,13 +19,15 @@ namespace :uri_service do
19
19
  puts "[Warning] Exception creating rspec rake tasks. This message can be ignored in environments that intentionally do not pull in the RSpec gem (i.e. production)."
20
20
  puts e
21
21
  end
22
-
22
+
23
23
  desc "CI build"
24
24
  task :ci do
25
- Rake::Task["uri_service:ci_with_solr_6_wrapper"].invoke
26
- #Rake::Task["uri_service:ci_with_jetty_wrapper"].invoke
25
+ ENV['APP_ENV'] = 'test'
26
+ Rake::Task["uri_service:ci_prepare"].invoke
27
+ Rake::Task["uri_service:docker:setup_config_files"].invoke
28
+ Rake::Task["uri_service:ci_impl"].invoke
27
29
  end
28
-
30
+
29
31
  desc "Preparation steps for the CI run"
30
32
  task :ci_prepare do
31
33
  # Delete existing test database
@@ -36,65 +38,36 @@ namespace :uri_service do
36
38
  client.create_required_tables
37
39
  FileUtils.mkdir_p('tmp')
38
40
  end
39
-
40
- desc "CI build (using SolrWrapper and Solr 6)"
41
- task ci_with_solr_6_wrapper: :ci_prepare do
42
- solr_version = '6.3.0'
43
- instance_dir = File.join('tmp', "solr-#{solr_version}")
44
- FileUtils.rm_rf(instance_dir)
45
-
46
- puts "Unpacking and starting solr...\n"
47
- SolrWrapper.wrap({
48
- port: 9983,
49
- version: solr_version,
50
- verbose: false,
51
- mirror_url: 'http://lib-solr-mirror.princeton.edu/dist/',
52
- managed: true,
53
- download_path: File.join('tmp', "solr-#{solr_version}.zip"),
54
- instance_dir: instance_dir,
55
- }) do |solr_wrapper_instance|
56
-
57
- # Create collection
58
- solr_wrapper_instance.with_collection(name: 'uri_service_test', dir: File.join('spec/fixtures', 'uri_service_test_cores/uri_service_test-solr6-conf')) do |collection_name|
41
+
42
+ desc 'CI build just running specs'
43
+ task :ci_impl do
44
+ docker_wrapper do
45
+ duration = Benchmark.realtime do
59
46
  Rake::Task["uri_service:rspec"].invoke
60
47
  end
61
-
62
- puts 'Stopping solr...'
48
+ puts "\nCI run finished in #{duration} seconds."
63
49
  end
64
50
  end
65
-
66
- desc "CI build (using JettyWrapper)"
67
- task ci_with_jetty_wrapper: :ci_prepare do
68
-
69
- Jettywrapper.url = "https://github.com/cul/hydra-jetty/archive/solr-only.zip"
70
- Jettywrapper.jetty_dir = File.join('tmp', 'jetty-test')
71
-
72
- unless File.exists?(Jettywrapper.jetty_dir)
73
- puts "\n" + 'No test jetty found. Will download / unzip a copy now.' + "\n"
51
+
52
+ def docker_wrapper(&block)
53
+ unless ENV['APP_ENV'] == 'test'
54
+ raise 'This task should only be run in the test environment (because it clears docker volumes)'
74
55
  end
75
-
76
- Rake::Task["jetty:clean"].invoke # Clear and recreate previous jetty directory
77
-
78
- # Copy solr core fixture to new solr instance
79
- FileUtils.cp_r('spec/fixtures/uri_service_test_cores/uri_service_test', File.join(Jettywrapper.jetty_dir, 'solr'))
80
- # Update solr.xml configuration file so that it recognizes this code
81
- solr_xml_data = File.read(File.join(Jettywrapper.jetty_dir, 'solr/solr.xml'))
82
- solr_xml_data.gsub!('</cores>', ' <core name="uri_service_test" instanceDir="uri_service_test" />' + "\n" + ' </cores>')
83
- File.open(File.join(Jettywrapper.jetty_dir, 'solr/solr.xml'), 'w') { |file| file.write(solr_xml_data) }
84
-
85
- jetty_params = Jettywrapper.load_config.merge({
86
- jetty_home: Jettywrapper.jetty_dir,
87
- solr_home: 'solr',
88
- startup_wait: 75,
89
- jetty_port: 9983,
90
- java_version: '>= 1.8',
91
- java_opts: ["-XX:MaxPermSize=128m", "-Xmx256m"]
92
- })
93
- error = Jettywrapper.wrap(jetty_params) do
94
- Rake::Task["uri_service:rspec"].invoke
56
+
57
+ # Stop docker if it's currently running (so we can delete any old volumes)
58
+ Rake::Task['uri_service:docker:stop'].invoke
59
+ # Rake tasks must be re-enabled if you want to call them again later during the same run
60
+ Rake::Task['uri_service:docker:stop'].reenable
61
+
62
+ ENV['app_env_confirmation'] = ENV['APP_ENV'] # setting this to skip prompt in volume deletion task
63
+ Rake::Task['uri_service:docker:delete_volumes'].invoke
64
+
65
+ Rake::Task['uri_service:docker:start'].invoke
66
+ begin
67
+ block.call
68
+ ensure
69
+ Rake::Task['uri_service:docker:stop'].invoke
95
70
  end
96
- raise "test failures: #{error}" if error
97
-
98
71
  end
99
72
 
100
- end
73
+ end
@@ -0,0 +1,127 @@
1
+ # frozen_string_literal: true
2
+ require 'open3'
3
+ require 'net/http'
4
+ require 'rainbow'
5
+
6
+ namespace :uri_service do
7
+ namespace :docker do
8
+ def docker_compose_file_path
9
+ UriService.root.join("docker/docker-compose.#{ENV['APP_ENV']}.yml")
10
+ end
11
+
12
+ def docker_compose_config
13
+ YAML.load_file(docker_compose_file_path)
14
+ end
15
+
16
+ def wait_for_solr_cores_to_load
17
+ expected_port = docker_compose_config['services']['solr']['ports'][0].split(':')[0]
18
+ url_to_check = "http://localhost:#{expected_port}/solr/uri_service/admin/system"
19
+ puts "Waiting for Solr to become available (at #{url_to_check})..."
20
+ Timeout.timeout(20, Timeout::Error, 'Timed out during Solr startup check.') do
21
+ loop do
22
+ begin
23
+ sleep 0.25
24
+ status_code = Net::HTTP.get_response(URI(url_to_check)).code
25
+ if status_code == '200' # Solr is ready to receive requests
26
+ puts 'Solr is available.'
27
+ break
28
+ end
29
+ rescue EOFError, Errno::ECONNRESET => e
30
+ # Try again in response to the above error types
31
+ next
32
+ end
33
+ end
34
+ end
35
+ end
36
+
37
+ def running?
38
+ status = `docker compose -f #{UriService.root.join(docker_compose_file_path)} ps`
39
+ status.split("n").count > 1
40
+ end
41
+
42
+ task :setup_config_files do
43
+ docker_compose_template_dir = UriService.root.join('docker/templates')
44
+ docker_compose_dest_dir = UriService.root.join('docker')
45
+ Dir.foreach(docker_compose_template_dir) do |entry|
46
+ next unless entry.end_with?('.yml')
47
+ src_path = File.join(docker_compose_template_dir, entry)
48
+ dst_path = File.join(docker_compose_dest_dir, entry.gsub('.template', ''))
49
+ if File.exist?(dst_path)
50
+ puts Rainbow("File already exists (skipping): #{dst_path}").blue.bright + "\n"
51
+ else
52
+ FileUtils.cp(src_path, dst_path)
53
+ puts Rainbow("Created file at: #{dst_path}").green
54
+ end
55
+ end
56
+ end
57
+
58
+ task :start do
59
+ puts "Starting...\n"
60
+ if running?
61
+ puts "\nAlready running."
62
+ else
63
+ # NOTE: This command rebuilds the container images before each run, to ensure they're
64
+ # always up to date. In most cases, the overhead is minimal if the Dockerfile for an image
65
+ # hasn't changed since the last build.
66
+ `docker compose -f #{docker_compose_file_path} up --build --detach --wait`
67
+ wait_for_solr_cores_to_load
68
+ puts "\nStarted."
69
+ end
70
+ end
71
+
72
+ task :stop do
73
+ puts "Stopping...\n"
74
+ if running?
75
+ puts "\n"
76
+ `docker compose -f #{UriService.root.join(docker_compose_file_path)} down`
77
+ puts "\nStopped"
78
+ else
79
+ puts "Already stopped."
80
+ end
81
+ end
82
+
83
+ task :restart do
84
+ Rake::Task['uri_service:docker:stop'].invoke
85
+ Rake::Task['uri_service:docker:start'].invoke
86
+ end
87
+
88
+ task :status do
89
+ puts running? ? 'Running.' : 'Not running.'
90
+ end
91
+
92
+ task :delete_volumes do
93
+ if running?
94
+ puts 'Error: The volumes are currently in use. Please stop the docker services before deleting the volumes.'
95
+ next
96
+ end
97
+
98
+ puts Rainbow("This will delete ALL Solr data for the selected app "\
99
+ "environment (#{ENV['APP_ENV']}) and cannot be undone. Please confirm that you want to continue "\
100
+ "by typing the name of the selected Rails environment (#{ENV['APP_ENV']}):").red.bright
101
+ print '> '
102
+ response = ENV['app_env_confirmation'] || $stdin.gets.chomp
103
+
104
+ puts ""
105
+
106
+ if response != ENV['APP_ENV']
107
+ puts "Aborting because \"#{ENV['APP_ENV']}\" was not entered."
108
+ next
109
+ end
110
+
111
+ config = docker_compose_config
112
+ volume_prefix = config['name']
113
+ full_volume_names = config['volumes'].keys.map { |short_name| "#{volume_prefix}_#{short_name}" }
114
+
115
+ full_volume_names.map do |full_volume_name|
116
+ if JSON.parse(Open3.capture3("docker volume inspect '#{full_volume_name}'")[0]).length.positive?
117
+ `docker volume rm '#{full_volume_name}'`
118
+ puts Rainbow("Deleted: #{full_volume_name}").green
119
+ else
120
+ puts Rainbow("Skipped: #{full_volume_name} (already deleted)").blue.bright
121
+ end
122
+ end
123
+
124
+ puts 'Done.'
125
+ end
126
+ end
127
+ end
@@ -96,7 +96,7 @@ class UriService::Client
96
96
  def test_connection
97
97
  @db.test_connection # Raises Sequel::DatabaseConnectionError if connection didn't work
98
98
  @rsolr_pool.with do |rsolr|
99
- rsolr.get('admin/ping') # Raises Errno::ECONNREFUSED if connection didn't work
99
+ rsolr.get('admin/system') # Raises Errno::ECONNREFUSED if connection didn't work
100
100
  end
101
101
  end
102
102
 
@@ -1,9 +1,9 @@
1
1
  module UriService
2
-
3
- VERSION = '0.5.6'
4
-
2
+
3
+ VERSION = '0.6.0'
4
+
5
5
  def self.version
6
6
  VERSION
7
7
  end
8
-
9
- end
8
+
9
+ end
data/lib/uri_service.rb CHANGED
@@ -6,36 +6,35 @@ require 'uri'
6
6
  require 'yaml'
7
7
 
8
8
  module UriService
9
-
10
9
  # Constants
11
10
  VOCABULARY = :vocabulary
12
11
  VOCABULARIES = :vocabularies
13
12
  TERM = :term
14
13
  TERMS = :terms
15
14
  VALID_URI_REGEX = /\A#{URI::regexp}\z/
16
-
15
+
17
16
  # Initialize the main instance of UriService::Client
18
17
  # opts format: { 'local_uri_base' => 'http://id.example.com/term/', temporary_uri_base: 'temporary:', 'solr' => {...solr config...}, 'database' => {...database config...} }
19
18
  def self.init(opts)
20
19
  if @client && @client.connected?
21
20
  @client.disconnect!
22
21
  end
23
-
22
+
24
23
  @client = UriService::Client.new(opts)
25
24
  end
26
25
 
27
26
  def self.client
28
27
  return @client
29
28
  end
30
-
29
+
31
30
  def self.version
32
31
  return UriService::VERSION
33
32
  end
34
-
33
+
35
34
  def self.required_tables
36
35
  return [UriService::VOCABULARIES, UriService::TERMS]
37
36
  end
38
-
37
+
39
38
  # Wrapper around escape method for different versions of RSolr
40
39
  def self.solr_escape(str)
41
40
  if RSolr.respond_to?(:solr_escape)
@@ -44,11 +43,14 @@ module UriService
44
43
  return RSolr.escape(str) # Fall back to older method
45
44
  end
46
45
  end
47
-
46
+
47
+ def self.root
48
+ Pathname.new(File.dirname(__dir__))
49
+ end
48
50
  end
49
51
 
50
52
  require "uri_service/version"
51
53
  require "uri_service/term_type"
52
54
  require "uri_service/client"
53
55
 
54
- require 'uri_service/railtie' if defined?(Rails)
56
+ require 'uri_service/railtie' if defined?(Rails)
metadata CHANGED
@@ -1,17 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: uri_service
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.6
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eric O'Hanlon
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
  date: 2015-08-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: rsolr
14
+ name: activesupport
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - ">="
@@ -25,21 +25,21 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: sequel
28
+ name: connection_pool
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 4.26.0
33
+ version: '0'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: 4.26.0
40
+ version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: connection_pool
42
+ name: rdf
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - ">="
@@ -53,7 +53,7 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: activesupport
56
+ name: rsolr
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - ">="
@@ -67,89 +67,89 @@ dependencies:
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: rdf
70
+ name: sequel
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - ">="
74
74
  - !ruby/object:Gem::Version
75
- version: '0'
75
+ version: 4.26.0
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
- version: '0'
82
+ version: 4.26.0
83
83
  - !ruby/object:Gem::Dependency
84
- name: rake
84
+ name: jettywrapper
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - ">="
88
88
  - !ruby/object:Gem::Version
89
- version: '10.1'
89
+ version: '0'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - ">="
95
95
  - !ruby/object:Gem::Version
96
- version: '10.1'
96
+ version: '0'
97
97
  - !ruby/object:Gem::Dependency
98
- name: rspec
98
+ name: rainbow
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: '3.1'
103
+ version: '3.0'
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: '3.1'
110
+ version: '3.0'
111
111
  - !ruby/object:Gem::Dependency
112
- name: jettywrapper
112
+ name: mysql2
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
115
  - - ">="
116
116
  - !ruby/object:Gem::Version
117
- version: '0'
117
+ version: 0.3.18
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
122
  - - ">="
123
123
  - !ruby/object:Gem::Version
124
- version: '0'
124
+ version: 0.3.18
125
125
  - !ruby/object:Gem::Dependency
126
- name: sqlite3
126
+ name: rake
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
129
  - - ">="
130
130
  - !ruby/object:Gem::Version
131
- version: '0'
131
+ version: '10.1'
132
132
  type: :development
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
136
  - - ">="
137
137
  - !ruby/object:Gem::Version
138
- version: '0'
138
+ version: '10.1'
139
139
  - !ruby/object:Gem::Dependency
140
- name: mysql2
140
+ name: rspec
141
141
  requirement: !ruby/object:Gem::Requirement
142
142
  requirements:
143
- - - ">="
143
+ - - "~>"
144
144
  - !ruby/object:Gem::Version
145
- version: 0.3.18
145
+ version: '3.1'
146
146
  type: :development
147
147
  prerelease: false
148
148
  version_requirements: !ruby/object:Gem::Requirement
149
149
  requirements:
150
- - - ">="
150
+ - - "~>"
151
151
  - !ruby/object:Gem::Version
152
- version: 0.3.18
152
+ version: '3.1'
153
153
  - !ruby/object:Gem::Dependency
154
154
  name: solr_wrapper
155
155
  requirement: !ruby/object:Gem::Requirement
@@ -164,6 +164,20 @@ dependencies:
164
164
  - - ">="
165
165
  - !ruby/object:Gem::Version
166
166
  version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: sqlite3
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - "<"
172
+ - !ruby/object:Gem::Version
173
+ version: '1.6'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - "<"
179
+ - !ruby/object:Gem::Version
180
+ version: '1.6'
167
181
  description: A service for registering local URIs and performing both local and remote
168
182
  URI lookups.
169
183
  email: elo2112@columbia.edu
@@ -175,6 +189,7 @@ files:
175
189
  - lib/tasks/uri_service.rake
176
190
  - lib/tasks/uri_service/ci.rake
177
191
  - lib/tasks/uri_service/db.rake
192
+ - lib/tasks/uri_service/docker.rake
178
193
  - lib/tasks/uri_service/solr.rake
179
194
  - lib/uri_service.rb
180
195
  - lib/uri_service/client.rb
@@ -185,7 +200,7 @@ homepage: https://github.com/cul/uri_service
185
200
  licenses:
186
201
  - MIT
187
202
  metadata: {}
188
- post_install_message:
203
+ post_install_message:
189
204
  rdoc_options: []
190
205
  require_paths:
191
206
  - lib
@@ -200,9 +215,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
200
215
  - !ruby/object:Gem::Version
201
216
  version: '0'
202
217
  requirements: []
203
- rubyforge_project:
204
- rubygems_version: 2.6.14
205
- signing_key:
218
+ rubygems_version: 3.0.3.1
219
+ signing_key:
206
220
  specification_version: 4
207
221
  summary: A service for registering local URIs and performing both local and remote
208
222
  URI lookups.