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,7 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Ldpath
2
4
  class Selector
3
5
  def evaluate(program, uris, context)
4
6
  return to_enum(:evaluate, program, uris, context) unless block_given?
7
+
5
8
  enum_wrap(uris).map do |uri|
6
9
  loading program, uri, context
7
10
  enum_flatten_one(evaluate_one(uri, context)).each do |x|
@@ -14,6 +17,10 @@ module Ldpath
14
17
  program.loading uri, context
15
18
  end
16
19
 
20
+ def initialize(*_args)
21
+ # abstract base class
22
+ end
23
+
17
24
  protected
18
25
 
19
26
  def enum_wrap(object)
@@ -29,14 +36,12 @@ module Ldpath
29
36
  [object]
30
37
  end
31
38
  end
32
-
33
- def enum_flatten_one(object)
39
+
40
+ def enum_flatten_one(object, &block)
34
41
  return to_enum(:enum_flatten_one, object) unless block_given?
35
42
 
36
43
  enum_wrap(object).each do |e|
37
- enum_wrap(e).each do |v|
38
- yield v
39
- end
44
+ enum_wrap(e).each(&block)
40
45
  end
41
46
  end
42
47
  end
@@ -53,6 +58,8 @@ module Ldpath
53
58
  def initialize(fname, arguments = [])
54
59
  @fname = fname
55
60
  @arguments = Array(arguments)
61
+
62
+ super
56
63
  end
57
64
 
58
65
  def evaluate(program, uris, context)
@@ -77,8 +84,11 @@ module Ldpath
77
84
 
78
85
  class PropertySelector < Selector
79
86
  attr_reader :property
87
+
80
88
  def initialize(property)
81
89
  @property = property
90
+
91
+ super
82
92
  end
83
93
 
84
94
  def evaluate_one(uri, context)
@@ -88,8 +98,11 @@ module Ldpath
88
98
 
89
99
  class LoosePropertySelector < Selector
90
100
  attr_reader :property
101
+
91
102
  def initialize(property)
92
103
  @property = property
104
+
105
+ super
93
106
  end
94
107
 
95
108
  def evaluate_one(uri, context)
@@ -103,8 +116,11 @@ module Ldpath
103
116
 
104
117
  class NegatedPropertySelector < Selector
105
118
  attr_reader :properties
119
+
106
120
  def initialize(*properties)
107
121
  @properties = properties
122
+
123
+ super
108
124
  end
109
125
 
110
126
  def evaluate_one(uri, context)
@@ -122,8 +138,11 @@ module Ldpath
122
138
 
123
139
  class ReversePropertySelector < Selector
124
140
  attr_reader :property
141
+
125
142
  def initialize(property)
126
143
  @property = property
144
+
145
+ super
127
146
  end
128
147
 
129
148
  def evaluate_one(uri, context)
@@ -133,34 +152,39 @@ module Ldpath
133
152
 
134
153
  class RecursivePathSelector < Selector
135
154
  attr_reader :property, :repeat
155
+
136
156
  def initialize(property, repeat)
137
157
  @property = property
138
158
  @repeat = repeat
159
+
160
+ super
139
161
  end
140
162
 
141
- def evaluate(program, uris, context)
163
+ def evaluate(program, uris, context, &block)
142
164
  return to_enum(:evaluate, program, uris, context) unless block_given?
143
165
 
144
166
  input = enum_wrap(uris)
145
167
 
146
- (0..repeat.max).each_with_index do |i, idx|
147
- break if input.none? || (repeat.max == Ldpath::Transform::Infinity && idx > 25) # we're probably lost..
168
+ (0..repeat.max).each_with_index do |_i, idx|
169
+ break if input.none? || (repeat.max == Ldpath::Transform::INFINITY && idx > 25) # we're probably lost..
170
+
148
171
  input = property.evaluate program, input, context
149
172
 
150
173
  next unless idx >= repeat.min
151
174
 
152
- enum_wrap(input).each do |x|
153
- yield x
154
- end
175
+ enum_wrap(input).each(&block)
155
176
  end
156
177
  end
157
178
  end
158
179
 
159
180
  class CompoundSelector < Selector
160
181
  attr_reader :left, :right
182
+
161
183
  def initialize(left, right)
162
184
  @left = left
163
185
  @right = right
186
+
187
+ super
164
188
  end
165
189
  end
166
190
 
@@ -174,46 +198,41 @@ module Ldpath
174
198
  end
175
199
 
176
200
  class UnionSelector < CompoundSelector
177
- def evaluate(program, uris, context)
201
+ def evaluate(program, uris, context, &block)
178
202
  return to_enum(:evaluate, program, uris, context) unless block_given?
179
203
 
180
- enum_union(left.evaluate(program, uris, context), right.evaluate(program, uris, context)).each do |x|
181
- yield x
182
- end
204
+ enum_union(left.evaluate(program, uris, context), right.evaluate(program, uris, context)).each(&block)
183
205
  end
184
206
 
185
207
  private
186
208
 
187
- def enum_union(left, right)
209
+ def enum_union(left, right, &block)
188
210
  return to_enum(:enum_union, left, right) unless block_given?
189
211
 
190
- enum_wrap(left).each do |e|
191
- yield e
192
- end
212
+ enum_wrap(left).each(&block)
193
213
 
194
- enum_wrap(right).each do |e|
195
- yield e
196
- end
214
+ enum_wrap(right).each(&block)
197
215
  end
198
216
  end
199
217
 
200
218
  class IntersectionSelector < CompoundSelector
201
- def evaluate(program, uris, context)
219
+ def evaluate(program, uris, context, &block)
202
220
  return to_enum(:evaluate, program, uris, context) unless block_given?
203
221
 
204
222
  result = left.evaluate(program, uris, context).to_a & right.evaluate(program, uris, context).to_a
205
223
 
206
- result.each do |x|
207
- yield x
208
- end
224
+ result.each(&block)
209
225
  end
210
226
  end
211
227
 
212
228
  class TapSelector < Selector
213
229
  attr_reader :identifier, :tap
230
+
214
231
  def initialize(identifier, tap)
215
232
  @identifier = identifier
216
233
  @tap = tap
234
+
235
+ super
217
236
  end
218
237
 
219
238
  def evaluate(program, uris, context)
data/lib/ldpath/tests.rb CHANGED
@@ -1,42 +1,55 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Ldpath
2
4
  class TestSelector < Selector
3
5
  attr_reader :delegate, :test
4
6
 
5
- def initialize(delegate, test)
7
+ def initialize(delegate = nil, test = nil)
6
8
  @delegate = delegate
7
9
  @test = test
10
+
11
+ super
8
12
  end
9
13
 
10
14
  def evaluate(program, uris, context)
15
+ return to_enum(:evaluate, program, uris, context) unless block_given?
16
+
11
17
  entries = delegate.evaluate program, uris, context
12
18
  entries.select do |uri|
13
- enum_wrap(test.evaluate(program, uri, context)).any? do |x|
19
+ result = enum_wrap(test.evaluate(program, uri, context)).any? do |x|
14
20
  x
15
21
  end
22
+ yield uri if result
16
23
  end
17
24
  end
18
25
  end
19
26
 
20
27
  class LanguageTest < TestSelector
21
28
  attr_reader :lang
29
+
22
30
  def initialize(lang)
23
31
  @lang = lang
32
+
33
+ super
24
34
  end
25
35
 
26
36
  def evaluate(_program, uri, _context)
27
37
  return unless uri.literal?
28
38
 
29
- uri if (lang == "none" && !uri.has_language?) || uri.language == lang
39
+ uri if (lang.to_s == "none" && !uri.has_language?) || uri.language.to_s == lang.to_s
30
40
  end
31
41
  end
32
42
 
33
43
  class TypeTest < TestSelector
34
44
  attr_reader :type
45
+
35
46
  def initialize(type)
36
47
  @type = type
48
+
49
+ super
37
50
  end
38
51
 
39
- def evaluate(program, uri, _context)
52
+ def evaluate(_program, uri, _context)
40
53
  return unless uri.literal?
41
54
 
42
55
  uri if uri.has_datatype? && uri.datatype == type
@@ -48,10 +61,12 @@ module Ldpath
48
61
 
49
62
  def initialize(delegate)
50
63
  @delegate = delegate
64
+
65
+ super
51
66
  end
52
67
 
53
68
  def evaluate(program, uri, context)
54
- !enum_wrap(delegate.evaluate(program, uri, context)).any? { |x| x }
69
+ enum_wrap(delegate.evaluate(program, uri, context)).none? { |x| x }
55
70
  end
56
71
  end
57
72
 
@@ -61,6 +76,8 @@ module Ldpath
61
76
  def initialize(left, right)
62
77
  @left = left
63
78
  @right = right
79
+
80
+ super
64
81
  end
65
82
 
66
83
  def evaluate(program, uri, context)
@@ -74,6 +91,8 @@ module Ldpath
74
91
  def initialize(left, right)
75
92
  @left = left
76
93
  @right = right
94
+
95
+ super
77
96
  end
78
97
 
79
98
  def evaluate(program, uri, context)
@@ -88,6 +107,8 @@ module Ldpath
88
107
  def initialize(left, right)
89
108
  @left = left
90
109
  @right = right
110
+
111
+ super
91
112
  end
92
113
 
93
114
  def evaluate(program, uri, context)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Ldpath
2
4
  class Transform < Parslet::Transform
3
5
  attr_reader :prefixes
@@ -5,17 +7,17 @@ module Ldpath
5
7
  class << self
6
8
  def default_prefixes
7
9
  @default_prefixes ||= {
8
- "rdf" => RDF::Vocabulary.new("http://www.w3.org/1999/02/22-rdf-syntax-ns#"),
10
+ "rdf" => RDF::Vocabulary.new("http://www.w3.org/1999/02/22-rdf-syntax-ns#"),
9
11
  "rdfs" => RDF::Vocabulary.new("http://www.w3.org/2000/01/rdf-schema#"),
10
- "owl" => RDF::Vocabulary.new("http://www.w3.org/2002/07/owl#"),
12
+ "owl" => RDF::Vocabulary.new("http://www.w3.org/2002/07/owl#"),
11
13
  "skos" => RDF::Vocabulary.new("http://www.w3.org/2004/02/skos/core#"),
12
- "dc" => RDF::Vocabulary.new("http://purl.org/dc/elements/1.1/"),
13
- "xsd" => RDF::Vocabulary.new("http://www.w3.org/2001/XMLSchema#"), # (LMF base index datatypes/XML Schema)
14
- "lmf" => RDF::Vocabulary.new("http://www.newmedialab.at/lmf/types/1.0/"), # (LMF extended index datatypes)
15
- "fn" => RDF::Vocabulary.new("http://www.newmedialab.at/lmf/functions/1.0/"), # (LMF index functions)
14
+ "dc" => RDF::Vocabulary.new("http://purl.org/dc/elements/1.1/"),
15
+ "xsd" => RDF::Vocabulary.new("http://www.w3.org/2001/XMLSchema#"), # (LMF base index datatypes/XML Schema)
16
+ "lmf" => RDF::Vocabulary.new("http://www.newmedialab.at/lmf/types/1.0/"), # (LMF extended index datatypes)
17
+ "fn" => RDF::Vocabulary.new("http://www.newmedialab.at/lmf/functions/1.0/"), # (LMF index functions)
16
18
  "foaf" => RDF::Vocabulary.new("http://xmlns.com/foaf/0.1/"),
17
19
  "info" => RDF::Vocabulary.new("info:"),
18
- "urn" => RDF::Vocabulary.new("urn:")
20
+ "urn" => RDF::Vocabulary.new("urn:")
19
21
  }
20
22
  end
21
23
  end
@@ -29,8 +31,8 @@ module Ldpath
29
31
  end
30
32
 
31
33
  # Core types
32
- rule(true: simple(:true)) { true }
33
- rule(false: simple(:false)) { false }
34
+ rule(true => simple(true)) { true }
35
+ rule(false => simple(false)) { false }
34
36
  rule(integer: simple(:integer)) { integer.to_i }
35
37
  rule(double: simple(:double)) { double.to_f }
36
38
  rule(decimal: simple(:decimal)) { decimal.to_f }
@@ -71,7 +73,7 @@ module Ldpath
71
73
  # Mappings
72
74
 
73
75
  rule(mapping: subtree(:mapping)) do
74
- FieldMapping.new mapping
76
+ FieldMapping.new(**mapping)
75
77
  end
76
78
 
77
79
  ## Selectors
@@ -106,11 +108,11 @@ module Ldpath
106
108
  end
107
109
 
108
110
  rule(range: subtree(:range)) do
109
- range.fetch(:min, 0).to_i..range.fetch(:max, Infinity).to_f
111
+ range.fetch(:min, 0).to_i..range.fetch(:max, INFINITY).to_f
110
112
  end
111
113
 
112
- rule(range: '*') { 0..Infinity }
113
- rule(range: '+') { 1..Infinity }
114
+ rule(range: '*') { 0..INFINITY }
115
+ rule(range: '+') { 1..INFINITY }
114
116
  rule(range: '?') { 0..1 }
115
117
 
116
118
  rule(delegate: subtree(:delegate), repeat: simple(:repeat)) do
@@ -177,6 +179,6 @@ module Ldpath
177
179
  IntersectionSelector.new left, right
178
180
  end
179
181
 
180
- Infinity = 1.0 / 0.0
182
+ INFINITY = 1.0 / 0.0
181
183
  end
182
184
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Ldpath
2
- VERSION = '1.0.0'.freeze
4
+ VERSION = '1.2.0'
3
5
  end
data/lib/ldpath.rb CHANGED
@@ -1,6 +1,14 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "ldpath/version"
2
- require 'linkeddata'
3
4
  require 'logger'
5
+ require 'nokogiri'
6
+ require 'rdf'
7
+ require 'rdf/vocab'
8
+ # require rdf/ntriples may not be necessary, may only really be necessary
9
+ # for ldpath_program_spec.rb tests, but I'm not certain, and I don't think it hurts
10
+ # to do it here.
11
+ require 'rdf/ntriples'
4
12
 
5
13
  module Ldpath
6
14
  require 'ldpath/field_mapping'
@@ -11,6 +19,7 @@ module Ldpath
11
19
  require 'ldpath/functions'
12
20
  require 'ldpath/program'
13
21
  require 'ldpath/result'
22
+ require 'ldpath/loaders'
14
23
 
15
24
  class << self
16
25
  attr_writer :logger
@@ -20,13 +29,11 @@ module Ldpath
20
29
  end
21
30
 
22
31
  def logger
23
- @logger ||= begin
24
- if defined? Rails
25
- Rails.logger
26
- else
27
- Logger.new(STDERR)
28
- end
29
- end
32
+ @logger ||= if defined? Rails
33
+ Rails.logger
34
+ else
35
+ Logger.new($stderr)
36
+ end
30
37
  end
31
38
  end
32
39
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
  require 'pp'
3
5
  require 'parslet/convenience'
@@ -228,10 +230,10 @@ describe Ldpath::Parser do
228
230
 
229
231
  describe "integration tests" do
230
232
  it "should parse a simple example" do
231
- tree = subject.parse <<-EOF
232
- @prefix dcterms : <http://purl.org/dc/terms/> ;
233
- topic = <http://xmlns.com/foaf/0.1/primaryTopic> :: xsd:string ;
234
- EOF
233
+ tree = subject.parse <<~EOF
234
+ @prefix dcterms : <http://purl.org/dc/terms/> ;
235
+ topic = <http://xmlns.com/foaf/0.1/primaryTopic> :: xsd:string ;
236
+ EOF
235
237
  expect(tree.length).to eq 2
236
238
  expect(tree.first).to include :prefixID
237
239
  expect(tree.first[:prefixID]).to include id: 'dcterms'