ldpath 1.0.0 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,29 +1,33 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe Ldpath::Program do
4
6
  describe "Simple program" do
5
7
  subject do
6
- Ldpath::Program.parse <<-EOF
7
- @prefix dcterms : <http://purl.org/dc/terms/> ;
8
- title = dcterms:title :: xsd:string ;
9
- parent_title = dcterms:isPartOf / dcterms:title :: xsd:string ;
10
- titles = dcterms:title | (dcterms:isPartOf / dcterms:title) | (^dcterms:isPartOf / dcterms:title) :: xsd:string ;
11
- no_titles = dcterms:title & (dcterms:isPartOf / dcterms:title) & (^dcterms:isPartOf / dcterms:title) :: xsd:string ;
12
- self = . :: xsd:string ;
13
- wildcard = * ::xsd:string ;
14
- child_title = ^dcterms:isPartOf / dcterms:title :: xsd:string ;
15
- recursive = (dcterms:isPartOf)* ;
16
- en_description = dcterms:description[@en] ;
17
- conditional = dcterms:isPartOf[dcterms:title] ;
18
- conditional_false = dcterms:isPartOf[dcterms:description] ;
19
- int_value = <info:intProperty>[^^xsd:integer] :: xsd:integer ;
20
- numeric_value = <info:numericProperty> :: xsd:integer ;
21
- escaped_string = "\\"" :: xsd:string;
22
- and_test = .[dcterms:title & dcterms:gone] ;
23
- or_test = .[dcterms:title | dcterms:gone] ;
24
- is_test = .[dcterms:title is "Hello, world!"] ;
25
- is_not_test = .[!(dcterms:title is "Hello, world!")] ;
26
- EOF
8
+ Ldpath::Program.parse <<~EOF
9
+ @prefix dcterms : <http://purl.org/dc/terms/> ;
10
+ title = dcterms:title :: xsd:string ;
11
+ parent_title = dcterms:isPartOf / dcterms:title :: xsd:string ;
12
+ parent_title_en = dcterms:isPartOf / dcterms:title[@en] :: xsd:string ;
13
+ titles = dcterms:title | (dcterms:isPartOf / dcterms:title) | (^dcterms:isPartOf / dcterms:title) :: xsd:string ;
14
+ no_titles = dcterms:title & (dcterms:isPartOf / dcterms:title) & (^dcterms:isPartOf / dcterms:title) :: xsd:string ;
15
+ self = . :: xsd:string ;
16
+ wildcard = * ::xsd:string ;
17
+ child_title = ^dcterms:isPartOf / dcterms:title :: xsd:string ;
18
+ child_description_en = ^dcterms:isPartOf / dcterms:description[@en] :: xsd:string ;
19
+ recursive = (dcterms:isPartOf)* ;
20
+ en_description = dcterms:description[@en] ;
21
+ conditional = dcterms:isPartOf[dcterms:title] ;
22
+ conditional_false = dcterms:isPartOf[dcterms:description] ;
23
+ int_value = <info:intProperty>[^^xsd:integer] :: xsd:integer ;
24
+ numeric_value = <info:numericProperty> :: xsd:integer ;
25
+ escaped_string = "\\"" :: xsd:string;
26
+ and_test = .[dcterms:title & dcterms:gone] ;
27
+ or_test = .[dcterms:title | dcterms:gone] ;
28
+ is_test = .[dcterms:title is "Hello, world!"] ;
29
+ is_not_test = .[!(dcterms:title is "Hello, world!")] ;
30
+ EOF
27
31
  end
28
32
 
29
33
  let(:object) { RDF::URI.new("info:a") }
@@ -46,16 +50,18 @@ EOF
46
50
  graph << [parent, RDF::Vocab::DC.title, "Parent title"]
47
51
  graph << [child, RDF::Vocab::DC.isPartOf, object]
48
52
  graph << [child, RDF::Vocab::DC.title, "Child title"]
53
+ graph << [parent, RDF::Vocab::DC.title, RDF::Literal.new("Parent English!", language: "en")]
54
+ graph << [parent, RDF::Vocab::DC.title, RDF::Literal.new("Parent French!", language: "fr")]
49
55
  graph << [parent, RDF::Vocab::DC.isPartOf, grandparent]
50
56
 
51
57
  result = subject.evaluate object, context: graph
52
-
53
58
  expect(result["title"]).to match_array "Hello, world!"
54
- expect(result["parent_title"]).to match_array "Parent title"
59
+ expect(result["parent_title"]).to match_array ["Parent title", "Parent English!", "Parent French!"]
60
+ expect(result["parent_title_en"]).to match_array "Parent English!"
55
61
  expect(result["self"]).to match_array(object)
56
62
  expect(result["wildcard"]).to include "Hello, world!", parent
57
63
  expect(result["child_title"]).to match_array "Child title"
58
- expect(result["titles"]).to match_array ["Hello, world!", "Parent title", "Child title"]
64
+ expect(result["titles"]).to match_array ["Hello, world!", "Parent title", "Child title", "Parent English!", "Parent French!"]
59
65
  expect(result["no_titles"]).to be_empty
60
66
  expect(result["recursive"]).to match_array [parent, grandparent]
61
67
  expect(result["en_description"].first.to_s).to eq "English!"
@@ -73,24 +79,24 @@ EOF
73
79
 
74
80
  describe "functions" do
75
81
  let(:program) do
76
- Ldpath::Program.parse <<-EOF
77
- @prefix dcterms : <http://purl.org/dc/terms/> ;
78
- ab = fn:concat("a", "b") ;
79
- title = fn:concat(dcterms:title, dcterms:description) ;
80
- title_mix = fn:concat("!", dcterms:title) ;
81
- title_missing = fn:concat("z", dcterms:genre) ;
82
- first_a = fn:first("a", "b") ;
83
- first_b = fn:first(dcterms:genre, "b") ;
84
- last_a = fn:last("a", dcterms:genre) ;
85
- last_b = fn:last("a", "b") ;
86
- count_5 = fn:count("a", "b", "c", "d", "e");
87
- count_3 = fn:count(dcterms:hasPart);
88
- count_still_3 = fn:count(dcterms:hasPart, dcterms:genre);
89
- eq_true = fn:eq("a", "a");
90
- eq_false = fn:eq("a", "b");
91
- eq_node_true = fn:eq(dcterms:description, "Description");
92
- xpath_test = fn:xpath("//title", "<root><title>xyz</title></root>");
93
- EOF
82
+ Ldpath::Program.parse <<~EOF
83
+ @prefix dcterms : <http://purl.org/dc/terms/> ;
84
+ ab = fn:concat("a", "b") ;
85
+ title = fn:concat(dcterms:title, dcterms:description) ;
86
+ title_mix = fn:concat("!", dcterms:title) ;
87
+ title_missing = fn:concat("z", dcterms:genre) ;
88
+ first_a = fn:first("a", "b") ;
89
+ first_b = fn:first(dcterms:genre, "b") ;
90
+ last_a = fn:last("a", dcterms:genre) ;
91
+ last_b = fn:last("a", "b") ;
92
+ count_5 = fn:count("a", "b", "c", "d", "e");
93
+ count_3 = fn:count(dcterms:hasPart);
94
+ count_still_3 = fn:count(dcterms:hasPart, dcterms:genre);
95
+ eq_true = fn:eq("a", "a");
96
+ eq_false = fn:eq("a", "b");
97
+ eq_node_true = fn:eq(dcterms:description, "Description");
98
+ xpath_test = fn:xpath("//title", "<root><title>xyz</title></root>");
99
+ EOF
94
100
  end
95
101
 
96
102
  let(:object) { RDF::URI.new("info:a") }
@@ -185,29 +191,66 @@ EOF
185
191
 
186
192
  describe "Data loading" do
187
193
  subject do
188
- Ldpath::Program.parse <<-EOF
189
- @prefix dcterms : <http://purl.org/dc/terms/> ;
190
- title = foaf:primaryTopic / dc:title :: xsd:string ;
191
- EOF
194
+ Ldpath::Program.parse <<-EOF, context
195
+ @prefix dcterms : <http://purl.org/dc/terms/> ;
196
+ title = foaf:primaryTopic / dc:title :: xsd:string ;
197
+ EOF
192
198
  end
199
+ let(:context) { {} }
193
200
 
194
- before do
195
- stub_request(:get, 'http://www.bbc.co.uk/programmes/b0081dq5')
201
+ context 'with direct loading' do
202
+ let(:context) { { default_loader: Ldpath::Loaders::Direct.new } }
203
+
204
+ before do
205
+ stub_request(:get, 'http://www.bbc.co.uk/programmes/b0081dq5')
196
206
  .to_return(status: 200, body: webmock_fixture('bbc_b0081dq5.nt'), headers: { 'Content-Type' => 'application/n-triples' })
207
+ end
208
+
209
+ it "should work" do
210
+ result = subject.evaluate RDF::URI.new("http://www.bbc.co.uk/programmes/b0081dq5")
211
+ expect(result["title"]).to match_array "Huw Stephens"
212
+ end
197
213
  end
198
214
 
199
- it "should work" do
200
- result = subject.evaluate RDF::URI.new("http://www.bbc.co.uk/programmes/b0081dq5")
201
- expect(result["title"]).to match_array "Huw Stephens"
215
+ context 'with an existing graph' do
216
+ let(:graph) { RDF::Graph.new }
217
+ let(:graph_loader) { Ldpath::Loaders::Graph.new graph: graph }
218
+ let(:context) { { default_loader: graph_loader } }
219
+
220
+ before do
221
+ graph << [RDF::URI('http://www.bbc.co.uk/programmes/b0081dq5'), RDF::URI('http://xmlns.com/foaf/0.1/primaryTopic'),
222
+ RDF::URI('info:some_uri')]
223
+ graph << [RDF::URI('info:some_uri'), RDF::URI('http://purl.org/dc/elements/1.1/title'), 'Local Huw Stephens']
224
+ end
225
+
226
+ it "should work" do
227
+ result = subject.evaluate RDF::URI.new("http://www.bbc.co.uk/programmes/b0081dq5")
228
+ expect(result["title"]).to match_array "Local Huw Stephens"
229
+ end
230
+ end
231
+
232
+ context 'with linked data fragments' do
233
+ let(:graph_loader) { Ldpath::Loaders::LinkedDataFragment.new('http://example.com/ldf') }
234
+ let(:context) { { default_loader: graph_loader } }
235
+
236
+ before do
237
+ stub_request(:get, 'http://example.com/ldf?subject=http://www.bbc.co.uk/programmes/b0081dq5')
238
+ .to_return(status: 200, body: webmock_fixture('bbc_b0081dq5.nt'), headers: { 'Content-Type' => 'application/n-triples' })
239
+ end
240
+
241
+ it "should work" do
242
+ result = subject.evaluate RDF::URI.new("http://www.bbc.co.uk/programmes/b0081dq5")
243
+ expect(result["title"]).to match_array "Huw Stephens"
244
+ end
202
245
  end
203
246
  end
204
247
 
205
248
  describe "Predicate function" do
206
249
  subject do
207
- Ldpath::Program.parse <<-EOF
208
- @prefix dcterms : <http://purl.org/dc/terms/> ;
209
- predicates = <http://xmlns.com/foaf/0.1/primaryTopic> / fn:predicates() :: xsd:string ;
210
- EOF
250
+ Ldpath::Program.parse <<~EOF
251
+ @prefix dcterms : <http://purl.org/dc/terms/> ;
252
+ predicates = <http://xmlns.com/foaf/0.1/primaryTopic> / fn:predicates() :: xsd:string ;
253
+ EOF
211
254
  end
212
255
 
213
256
  before do
@@ -239,11 +282,11 @@ EOF
239
282
  end
240
283
 
241
284
  subject do
242
- Ldpath::Program.parse <<-EOF
243
- @prefix dcterms : <http://purl.org/dc/terms/> ;
244
- title = dcterms:title :: xsd:string ;
245
- child_title = dcterms:hasPart / dcterms:title :: xsd:string ;
246
- child_title_with_tap = dcterms:hasPart / ?<tap>fn:predicates() / dcterms:title :: xsd:string ;
285
+ Ldpath::Program.parse <<~EOF
286
+ @prefix dcterms : <http://purl.org/dc/terms/> ;
287
+ title = dcterms:title :: xsd:string ;
288
+ child_title = dcterms:hasPart / dcterms:title :: xsd:string ;
289
+ child_title_with_tap = dcterms:hasPart / ?<tap>fn:predicates() / dcterms:title :: xsd:string ;
247
290
  EOF
248
291
  end
249
292
 
@@ -270,11 +313,11 @@ child_title_with_tap = dcterms:hasPart / ?<tap>fn:predicates() / dcterms:title :
270
313
  end
271
314
 
272
315
  subject do
273
- Ldpath::Program.parse <<-EOF
274
- @prefix dcterms : <http://purl.org/dc/terms/> ;
275
- @prefix dc: <http://purl.org/dc/elements/1.1/> ;
276
- title = dcterms:title :: xsd:string ;
277
- title_with_loose = ~dc:title :: xsd:string ;
316
+ Ldpath::Program.parse <<~EOF
317
+ @prefix dcterms : <http://purl.org/dc/terms/> ;
318
+ @prefix dc: <http://purl.org/dc/elements/1.1/> ;
319
+ title = dcterms:title :: xsd:string ;
320
+ title_with_loose = ~dc:title :: xsd:string ;
278
321
  EOF
279
322
  end
280
323
 
@@ -327,10 +370,10 @@ title_with_loose = ~dc:title :: xsd:string ;
327
370
  describe '#evaluate' do
328
371
  context 'when passing limit_to_context' do
329
372
  subject do
330
- Ldpath::Program.parse <<-EOF
331
- @prefix madsrdf : <http://www.loc.gov/mads/rdf/v1#> ;
332
- @prefix schema: <http://www.w3.org/2000/01/rdf-schema#> ;
333
- property = madsrdf:authoritativeLabel :: xsd:string ;
373
+ Ldpath::Program.parse <<~EOF
374
+ @prefix madsrdf : <http://www.loc.gov/mads/rdf/v1#> ;
375
+ @prefix schema: <http://www.w3.org/2000/01/rdf-schema#> ;
376
+ property = madsrdf:authoritativeLabel :: xsd:string ;
334
377
  EOF
335
378
  end
336
379
 
@@ -344,7 +387,7 @@ property = madsrdf:authoritativeLabel :: xsd:string ;
344
387
 
345
388
  before do
346
389
  stub_request(:get, 'http://id.loc.gov/authorities/names/n79021164')
347
- .to_return(status: 200, body: webmock_fixture('loc_n79021164.nt'), headers: { 'Content-Type' => 'application/n-triples' })
390
+ .to_return(status: 200, body: webmock_fixture('loc_n79021164.nt'), headers: { 'Content-Type' => 'application/n-triples' })
348
391
  end
349
392
 
350
393
  context 'as false' do
data/spec/ldpath_spec.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe Ldpath do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
  require 'pp'
3
5
  describe Ldpath::Transform do
@@ -98,7 +100,7 @@ describe Ldpath::Transform do
98
100
  selector = actual.first.selector
99
101
  expect(selector).to be_a_kind_of Ldpath::RecursivePathSelector
100
102
  expect(selector.property.property).to eq RDF::URI.new("info:a")
101
- expect(selector.repeat).to eq 0..Ldpath::Transform::Infinity
103
+ expect(selector.repeat).to eq 0..Ldpath::Transform::INFINITY
102
104
  end
103
105
 
104
106
  it "is a 1-to-infinity matcher" do
@@ -107,7 +109,7 @@ describe Ldpath::Transform do
107
109
  selector = actual.first.selector
108
110
  expect(selector).to be_a_kind_of Ldpath::RecursivePathSelector
109
111
  expect(selector.property.property).to eq RDF::URI.new("info:a")
110
- expect(selector.repeat).to eq 1..Ldpath::Transform::Infinity
112
+ expect(selector.repeat).to eq 1..Ldpath::Transform::INFINITY
111
113
  end
112
114
 
113
115
  it "is a 0 to 5 matcher" do
@@ -134,7 +136,7 @@ describe Ldpath::Transform do
134
136
  selector = actual.first.selector
135
137
  expect(selector).to be_a_kind_of Ldpath::RecursivePathSelector
136
138
  expect(selector.property.property).to eq RDF::URI.new("info:a")
137
- expect(selector.repeat).to eq 2..Ldpath::Transform::Infinity
139
+ expect(selector.repeat).to eq 2..Ldpath::Transform::INFINITY
138
140
  end
139
141
  end
140
142
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe "LDPath list functions" do
data/spec/spec_helper.rb CHANGED
@@ -1,30 +1,14 @@
1
- $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
2
- require 'simplecov'
3
- SimpleCov.start
1
+ # frozen_string_literal: true
4
2
 
3
+ $LOAD_PATH.unshift File.expand_path('../lib', __dir__)
5
4
  require 'ldpath'
6
5
  require 'rdf/reasoner'
7
6
  require 'webmock/rspec'
8
-
9
- require 'simplecov'
10
- require 'coveralls'
11
7
  require 'byebug' unless ENV['TRAVIS']
12
8
 
13
9
  RDF::Reasoner.apply(:rdfs)
14
10
  RDF::Reasoner.apply(:owl)
15
11
 
16
- SimpleCov.formatter = Coveralls::SimpleCov::Formatter
17
- SimpleCov.start('rails') do
18
- add_filter '/.internal_test_app'
19
- add_filter '/lib/generators'
20
- add_filter '/spec'
21
- add_filter '/tasks'
22
- add_filter '/lib/qa/version.rb'
23
- add_filter '/lib/qa/engine.rb'
24
- end
25
- SimpleCov.command_name 'spec'
26
- Coveralls.wear!
27
-
28
12
  def webmock_fixture(fixture)
29
13
  File.new File.expand_path(File.join("../fixtures", fixture), __FILE__)
30
14
  end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ldpath
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Beer
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-03-30 00:00:00.000000000 Z
11
+ date: 2022-06-30 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: nokogiri
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.8'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.8'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: parslet
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -25,33 +39,47 @@ dependencies:
25
39
  - !ruby/object:Gem::Version
26
40
  version: '0'
27
41
  - !ruby/object:Gem::Dependency
28
- name: linkeddata
42
+ name: rdf
29
43
  requirement: !ruby/object:Gem::Requirement
30
44
  requirements:
31
45
  - - "~>"
32
46
  - !ruby/object:Gem::Version
33
- version: '2.0'
47
+ version: '3.0'
34
48
  type: :runtime
35
49
  prerelease: false
36
50
  version_requirements: !ruby/object:Gem::Requirement
37
51
  requirements:
38
52
  - - "~>"
39
53
  - !ruby/object:Gem::Version
40
- version: '2.0'
54
+ version: '3.0'
41
55
  - !ruby/object:Gem::Dependency
42
- name: bundler
56
+ name: rdf-vocab
43
57
  requirement: !ruby/object:Gem::Requirement
44
58
  requirements:
45
59
  - - "~>"
46
60
  - !ruby/object:Gem::Version
47
- version: '1.5'
61
+ version: '3.0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: bixby
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '5.0'
48
76
  type: :development
49
77
  prerelease: false
50
78
  version_requirements: !ruby/object:Gem::Requirement
51
79
  requirements:
52
80
  - - "~>"
53
81
  - !ruby/object:Gem::Version
54
- version: '1.5'
82
+ version: '5.0'
55
83
  - !ruby/object:Gem::Dependency
56
84
  name: byebug
57
85
  requirement: !ruby/object:Gem::Requirement
@@ -81,7 +109,7 @@ dependencies:
81
109
  - !ruby/object:Gem::Version
82
110
  version: '0'
83
111
  - !ruby/object:Gem::Dependency
84
- name: rspec
112
+ name: rdf-reasoner
85
113
  requirement: !ruby/object:Gem::Requirement
86
114
  requirements:
87
115
  - - ">="
@@ -95,7 +123,7 @@ dependencies:
95
123
  - !ruby/object:Gem::Version
96
124
  version: '0'
97
125
  - !ruby/object:Gem::Dependency
98
- name: rdf-reasoner
126
+ name: rspec
99
127
  requirement: !ruby/object:Gem::Requirement
100
128
  requirements:
101
129
  - - ">="
@@ -109,7 +137,7 @@ dependencies:
109
137
  - !ruby/object:Gem::Version
110
138
  version: '0'
111
139
  - !ruby/object:Gem::Dependency
112
- name: simplecov
140
+ name: rspec_junit_formatter
113
141
  requirement: !ruby/object:Gem::Requirement
114
142
  requirements:
115
143
  - - ">="
@@ -123,7 +151,7 @@ dependencies:
123
151
  - !ruby/object:Gem::Version
124
152
  version: '0'
125
153
  - !ruby/object:Gem::Dependency
126
- name: rubocop
154
+ name: rubocop-rake
127
155
  requirement: !ruby/object:Gem::Requirement
128
156
  requirements:
129
157
  - - ">="
@@ -150,7 +178,7 @@ dependencies:
150
178
  - - ">="
151
179
  - !ruby/object:Gem::Version
152
180
  version: '0'
153
- description:
181
+ description:
154
182
  email:
155
183
  - cabeer@stanford.edu
156
184
  executables:
@@ -158,6 +186,7 @@ executables:
158
186
  extensions: []
159
187
  extra_rdoc_files: []
160
188
  files:
189
+ - ".circleci/config.yml"
161
190
  - ".gitignore"
162
191
  - ".rspec"
163
192
  - ".rubocop.yml"
@@ -176,6 +205,10 @@ files:
176
205
  - lib/ldpath.rb
177
206
  - lib/ldpath/field_mapping.rb
178
207
  - lib/ldpath/functions.rb
208
+ - lib/ldpath/loaders.rb
209
+ - lib/ldpath/loaders/direct.rb
210
+ - lib/ldpath/loaders/graph.rb
211
+ - lib/ldpath/loaders/linked_data_fragment.rb
179
212
  - lib/ldpath/parser.rb
180
213
  - lib/ldpath/program.rb
181
214
  - lib/ldpath/result.rb
@@ -198,7 +231,7 @@ homepage: https://github.com/samvera-labs/ldpath
198
231
  licenses:
199
232
  - Apache 2
200
233
  metadata: {}
201
- post_install_message:
234
+ post_install_message:
202
235
  rdoc_options: []
203
236
  require_paths:
204
237
  - lib
@@ -206,16 +239,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
206
239
  requirements:
207
240
  - - ">="
208
241
  - !ruby/object:Gem::Version
209
- version: '0'
242
+ version: 2.7.5
210
243
  required_rubygems_version: !ruby/object:Gem::Requirement
211
244
  requirements:
212
245
  - - ">="
213
246
  - !ruby/object:Gem::Version
214
247
  version: '0'
215
248
  requirements: []
216
- rubyforge_project:
217
- rubygems_version: 2.6.14
218
- signing_key:
249
+ rubygems_version: 3.2.3
250
+ signing_key:
219
251
  specification_version: 4
220
252
  summary: Ruby implementation of LDPath
221
253
  test_files: