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.
@@ -24,34 +24,41 @@ class Tripleloop::Extractor
24
24
  end
25
25
 
26
26
  def extract
27
- self.class.fragment_map.reduce([]) do |memo, (path, block)|
28
- fragment = Tripleloop::Util.with_nested_fetch(context).get_in(*path)
29
- returned = instance_exec(fragment, &block)
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
- ensure_triple_or_quad(returned)
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 unless is_triple_or_quad?(value)
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? value.length
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 ArgumentError" do
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.1
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-02-22 00:00:00.000000000 Z
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: &12159420 !ruby/object:Gem::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: *12159420
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: &12277940 !ruby/object:Gem::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: *12277940
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: &12276080 !ruby/object:Gem::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: *12276080
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: &12274760 !ruby/object:Gem::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: *12274760
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: &12221100 !ruby/object:Gem::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: *12221100
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@googlemail.com
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.17
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