ldpath 1.0.0 → 1.2.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.
@@ -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: