uri_service 0.5.6 → 0.6.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.
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.