tripleloop 0.0.1 → 0.0.5
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.
- data/lib/tripleloop/extractor.rb +20 -13
- data/spec/tripleloop/extractor_spec.rb +41 -2
- metadata +39 -14
data/lib/tripleloop/extractor.rb
CHANGED
@@ -24,34 +24,41 @@ class Tripleloop::Extractor
|
|
24
24
|
end
|
25
25
|
|
26
26
|
def extract
|
27
|
-
self.class.fragment_map.reduce([]) do |
|
28
|
-
fragment = Tripleloop::Util.with_nested_fetch(context).get_in(*path)
|
29
|
-
|
30
|
-
|
31
|
-
if nested_triples?(returned)
|
32
|
-
returned.each do |value|
|
33
|
-
ensure_triple_or_quad(value)
|
34
|
-
end
|
35
|
-
memo.concat(returned)
|
27
|
+
self.class.fragment_map.reduce([]) do |accu, (path, block)|
|
28
|
+
if fragment = Tripleloop::Util.with_nested_fetch(context).get_in(*path)
|
29
|
+
add_to_triples(accu, fragment, &block)
|
36
30
|
else
|
37
|
-
|
38
|
-
memo << returned
|
31
|
+
accu
|
39
32
|
end
|
40
33
|
end
|
41
34
|
end
|
42
35
|
|
43
36
|
private
|
37
|
+
def add_to_triples(triples, fragment, &block)
|
38
|
+
returned = Array(instance_exec(fragment, &block))
|
39
|
+
|
40
|
+
if nested_triples?(returned)
|
41
|
+
returned.each do |value|
|
42
|
+
ensure_triple_or_quad(value)
|
43
|
+
end
|
44
|
+
triples.concat(returned)
|
45
|
+
else
|
46
|
+
ensure_triple_or_quad(returned)
|
47
|
+
triples << returned
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
44
51
|
def nested_triples?(value)
|
45
52
|
value.all? { |object| object.is_a?(Array) }
|
46
53
|
end
|
47
54
|
|
48
55
|
def ensure_triple_or_quad(value)
|
49
56
|
message = "Cannot build a triple or a quad with #{value}."
|
50
|
-
raise BrokenMappingError, message
|
57
|
+
raise BrokenMappingError, message if value.any?(&:nil?) || !is_triple_or_quad?(value)
|
51
58
|
end
|
52
59
|
|
53
60
|
def is_triple_or_quad?(value)
|
54
|
-
[3,4].include?
|
61
|
+
[3,4].include?(value.length)
|
55
62
|
end
|
56
63
|
|
57
64
|
def bind_variables!
|
@@ -11,6 +11,8 @@ describe Tripleloop::Extractor do
|
|
11
11
|
[:subject, item, :object]
|
12
12
|
}
|
13
13
|
}
|
14
|
+
|
15
|
+
map(:path, :to, :missing, :key) { nil }
|
14
16
|
end
|
15
17
|
|
16
18
|
class BrokenExtractor < Tripleloop::Extractor
|
@@ -20,6 +22,12 @@ describe Tripleloop::Extractor do
|
|
20
22
|
}
|
21
23
|
end
|
22
24
|
|
25
|
+
class OtherBrokenExtractor < Tripleloop::Extractor
|
26
|
+
map(:path, :to, :key) { |value|
|
27
|
+
[:subject, :pred, nil] # <= nil value
|
28
|
+
}
|
29
|
+
end
|
30
|
+
|
23
31
|
let(:document) {{
|
24
32
|
:path => {
|
25
33
|
:to => {
|
@@ -50,13 +58,44 @@ describe Tripleloop::Extractor do
|
|
50
58
|
end
|
51
59
|
end
|
52
60
|
|
53
|
-
context "when a block does not return a valid constructor argument for RDF::Statement" do
|
54
|
-
it "raises an
|
61
|
+
context "when a map block does not return a valid constructor argument for RDF::Statement" do
|
62
|
+
it "raises an error" do
|
55
63
|
expect {
|
56
64
|
BrokenExtractor.new(document).extract
|
57
65
|
}.to raise_error(Tripleloop::Extractor::BrokenMappingError)
|
58
66
|
end
|
59
67
|
end
|
68
|
+
|
69
|
+
context "when a map block returns an array containing a nil value" do
|
70
|
+
it "raises an error" do
|
71
|
+
expect {
|
72
|
+
OtherBrokenExtractor.new(document).extract
|
73
|
+
}.to raise_error(Tripleloop::Extractor::BrokenMappingError)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
context "when a map block returns a nil value" do
|
78
|
+
it "ignores the nil value" do
|
79
|
+
triples.should_not include(nil)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
context "when map points to a nil document fragment" do
|
84
|
+
my_block = proc { raise "This should not be called" }
|
85
|
+
|
86
|
+
klass = Class.new(SampleExtractor) do
|
87
|
+
map(:path, :to, :nil, :key, &my_block)
|
88
|
+
map(:path, :to, :key) { |v| [:s, :p, v] }
|
89
|
+
end
|
90
|
+
|
91
|
+
it "ignores the mapped block" do
|
92
|
+
my_block.should_not_receive(:call)
|
93
|
+
extractor = klass.new(document)
|
94
|
+
extractor.extract.should eq([
|
95
|
+
[:s, :p, :test_key]
|
96
|
+
])
|
97
|
+
end
|
98
|
+
end
|
60
99
|
end
|
61
100
|
|
62
101
|
describe ".define" do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tripleloop
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-03-05 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rdf
|
16
|
-
requirement:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,15 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
25
30
|
- !ruby/object:Gem::Dependency
|
26
31
|
name: rspec
|
27
|
-
requirement:
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
28
33
|
none: false
|
29
34
|
requirements:
|
30
35
|
- - ~>
|
@@ -32,10 +37,15 @@ dependencies:
|
|
32
37
|
version: 2.12.0
|
33
38
|
type: :development
|
34
39
|
prerelease: false
|
35
|
-
version_requirements:
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 2.12.0
|
36
46
|
- !ruby/object:Gem::Dependency
|
37
47
|
name: fakefs
|
38
|
-
requirement:
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
39
49
|
none: false
|
40
50
|
requirements:
|
41
51
|
- - ~>
|
@@ -43,10 +53,15 @@ dependencies:
|
|
43
53
|
version: 0.4.0
|
44
54
|
type: :development
|
45
55
|
prerelease: false
|
46
|
-
version_requirements:
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.4.0
|
47
62
|
- !ruby/object:Gem::Dependency
|
48
63
|
name: pry
|
49
|
-
requirement:
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
50
65
|
none: false
|
51
66
|
requirements:
|
52
67
|
- - ! '>='
|
@@ -54,10 +69,15 @@ dependencies:
|
|
54
69
|
version: '0'
|
55
70
|
type: :development
|
56
71
|
prerelease: false
|
57
|
-
version_requirements:
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
58
78
|
- !ruby/object:Gem::Dependency
|
59
79
|
name: babosa
|
60
|
-
requirement:
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
61
81
|
none: false
|
62
82
|
requirements:
|
63
83
|
- - ! '>='
|
@@ -65,9 +85,14 @@ dependencies:
|
|
65
85
|
version: '0'
|
66
86
|
type: :development
|
67
87
|
prerelease: false
|
68
|
-
version_requirements:
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
69
94
|
description: Simple tool for extracting RDF triples from Ruby hashes
|
70
|
-
email: andrea.giulio.fiore@
|
95
|
+
email: andrea.giulio.fiore@gmail.com
|
71
96
|
executables: []
|
72
97
|
extensions: []
|
73
98
|
extra_rdoc_files: []
|
@@ -104,7 +129,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
104
129
|
version: '0'
|
105
130
|
requirements: []
|
106
131
|
rubyforge_project: tripleloop
|
107
|
-
rubygems_version: 1.8.
|
132
|
+
rubygems_version: 1.8.25
|
108
133
|
signing_key:
|
109
134
|
specification_version: 2
|
110
135
|
summary: Simple tool for extracting RDF triples from Ruby hashes
|