dbd 0.0.20 → 0.1.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.
- checksums.yaml +4 -4
- data/HISTORY.txt +9 -0
- data/README.md +40 -38
- data/bin/test_5.rb +10 -4
- data/docs/test.rb +40 -38
- data/lib/dbd/errors.rb +1 -0
- data/lib/dbd/fact.rb +42 -16
- data/lib/dbd/fact/collection.rb +52 -7
- data/lib/dbd/fact/factory.rb +13 -8
- data/lib/dbd/graph.rb +31 -14
- data/lib/dbd/version.rb +1 -1
- data/spec/lib/dbd/context_fact/methods_spec.rb +4 -4
- data/spec/lib/dbd/fact/collection/collection_spec.rb +18 -10
- data/spec/lib/dbd/fact/factory/factory_spec.rb +26 -7
- data/spec/lib/dbd/fact/methods_spec.rb +16 -8
- data/spec/lib/dbd/fact/new_spec.rb +10 -0
- data/spec/lib/dbd/fact/test_factories_spec.rb +16 -0
- data/spec/lib/dbd/graph/methods_spec.rb +29 -3
- data/spec/lib/dbd/graph/to_csv_spec.rb +12 -4
- data/spec/test_factories/context_fact.rb +4 -0
- data/spec/test_factories/fact.rb +28 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8607ede1e1aa2141008690009048e01e87313607
|
4
|
+
data.tar.gz: 44a0801f6e8669750994a76a68792d2dbb6bd050
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d3dc525ec006473250435416e275e52811e7a12c97fa12e5b2ff13cc012849e8724db670e46714639a6128f996fb1b36e091ee20df71371d4c046cbd1dfc2b3e
|
7
|
+
data.tar.gz: dc80a12708710a593fc05990a99dbfc3c6dccd52d1def98f4652b3b7d164f8cc2d0292ae39d5c2531a1bb2ba209da00a85c9eb9351be97be9ff5c313e3ef70bb
|
data/HISTORY.txt
CHANGED
@@ -122,3 +122,12 @@
|
|
122
122
|
======
|
123
123
|
|
124
124
|
* Resource can have facts with different context_subjects
|
125
|
+
|
126
|
+
0.1.0 (23 Oct 2013)
|
127
|
+
=====
|
128
|
+
|
129
|
+
* Not backwards compatible !
|
130
|
+
* Fact now has 7 attributes, added an object_type (required; can be 's','b','r')
|
131
|
+
* Graph#subjects method removed
|
132
|
+
* Graph#resource_subjects and Graph#Fact::Context.context_subjects added
|
133
|
+
* Graph#resources and Graph#contexts added
|
data/README.md
CHANGED
@@ -64,66 +64,68 @@ require 'dbd'
|
|
64
64
|
|
65
65
|
context = Dbd::Context.new
|
66
66
|
|
67
|
-
context << Dbd::ContextFact.new(predicate:
|
68
|
-
context << Dbd::ContextFact.new(predicate:
|
69
|
-
context << Dbd::ContextFact.new(predicate:
|
70
|
-
context << Dbd::ContextFact.new(predicate:
|
71
|
-
context << Dbd::ContextFact.new(predicate:
|
67
|
+
context << Dbd::ContextFact.new(predicate: 'prov:visibility', object_type: 's', object: 'public')
|
68
|
+
context << Dbd::ContextFact.new(predicate: 'prov:source', object_type: 's', object: 'http://github.com/petervandenabeele/dbd')
|
69
|
+
context << Dbd::ContextFact.new(predicate: 'dcterms:creator', object_type: 's', object: '@peter_v')
|
70
|
+
context << Dbd::ContextFact.new(predicate: 'dcterms:created', object_type: 's', object: Time.now.utc)
|
71
|
+
context << Dbd::ContextFact.new(predicate: 'prov:license', object_type: 's', object: 'MIT')
|
72
72
|
|
73
73
|
nobel_peace_2012 = Dbd::Resource.new(context_subject: context.subject)
|
74
74
|
|
75
|
-
nobel_peace_2012 << Dbd::Fact.new(predicate:
|
76
|
-
nobel_peace_2012 << Dbd::Fact.new(predicate:
|
77
|
-
nobel_peace_2012 << Dbd::Fact.new(predicate:
|
78
|
-
nobel_peace_2012 << Dbd::Fact.new(predicate:
|
75
|
+
nobel_peace_2012 << Dbd::Fact.new(predicate: 'todo:nobelPeacePriceWinner', object_type: 's', object: '2012')
|
76
|
+
nobel_peace_2012 << Dbd::Fact.new(predicate: 'rdfs:label', object_type: 's', object: 'EU') # this will use some RDF predicates in future
|
77
|
+
nobel_peace_2012 << Dbd::Fact.new(predicate: 'rdfs:comment', object_type: 's', object: 'European Union')
|
78
|
+
nobel_peace_2012 << Dbd::Fact.new(predicate: 'todo:story', object_type: 's', object: "A long period of peace,\n that is a \"bliss\".")
|
79
79
|
|
80
80
|
graph = Dbd::Graph.new
|
81
81
|
|
82
82
|
graph << context << nobel_peace_2012
|
83
83
|
|
84
|
-
puts
|
84
|
+
puts 'facts in short representation:'
|
85
85
|
puts graph.map(&:short)
|
86
86
|
|
87
87
|
# facts in short representation:
|
88
|
-
# [ cont ] :
|
89
|
-
# [ cont ] :
|
90
|
-
#
|
91
|
-
# [ cont ] :
|
92
|
-
# [ cont ] :
|
93
|
-
#
|
94
|
-
#
|
95
|
-
#
|
96
|
-
#
|
88
|
+
# [ cont ] : f53e7ac0 : prov:visibility : public
|
89
|
+
# [ cont ] : f53e7ac0 : prov:source
|
90
|
+
# : http://github.com/petervandenabeele/dbd
|
91
|
+
# [ cont ] : f53e7ac0 : dcterms:creator : @peter_v
|
92
|
+
# [ cont ] : f53e7ac0 : dcterms:created : 2013-10-22 19:59:20 UTC
|
93
|
+
# [ cont ] : f53e7ac0 : prov:license : MIT
|
94
|
+
# f53e7ac0 : 3da097f5 : todo:nobelPeacePriceWinn : 2012
|
95
|
+
# f53e7ac0 : 3da097f5 : rdfs:label : EU
|
96
|
+
# f53e7ac0 : 3da097f5 : rdfs:comment : European Union
|
97
|
+
# f53e7ac0 : 3da097f5 : todo:story : A long period of peace,_ that is a "bliss".
|
97
98
|
|
98
99
|
csv = graph.to_CSV
|
99
100
|
|
100
|
-
puts
|
101
|
+
puts 'facts in full detail in CSV:'
|
101
102
|
puts csv
|
102
103
|
|
103
104
|
# facts in full detail in CSV:
|
104
|
-
#
|
105
|
-
# "2013-
|
106
|
-
# "2013-
|
107
|
-
# "2013-
|
108
|
-
# "2013-
|
109
|
-
# "2013-
|
110
|
-
# "2013-
|
111
|
-
# "2013-
|
112
|
-
# "2013-
|
105
|
+
# "2013-10-22 19:59:20.797321024 UTC","10909776-cce4-4723-b6ce-1860a4322447","","f53e7ac0-c7b8-4f27-a90d-464faea98c98","prov:visibility","s","public"
|
106
|
+
# "2013-10-22 19:59:20.797374506 UTC","c31e582e-2f12-4c75-8593-3ae39b7292a3","","f53e7ac0-c7b8-4f27-a90d-464faea98c98","prov:source","s","http://github.com/petervandenabeele/dbd"
|
107
|
+
# "2013-10-22 19:59:20.797406087 UTC","f1822dd9-4863-4f8c-96f0-c3a2bd46f301","","f53e7ac0-c7b8-4f27-a90d-464faea98c98","dcterms:creator","s","@peter_v"
|
108
|
+
# "2013-10-22 19:59:20.797422478 UTC","494fc3d8-0968-4b86-a4f9-a4b1d3359d14","","f53e7ac0-c7b8-4f27-a90d-464faea98c98","dcterms:created","s","2013-10-22 19:59:20 UTC"
|
109
|
+
# "2013-10-22 19:59:20.797438736 UTC","9f8034b9-4d18-475a-b111-4ab9535e03ac","","f53e7ac0-c7b8-4f27-a90d-464faea98c98","prov:license","s","MIT"
|
110
|
+
# "2013-10-22 19:59:20.797456038 UTC","27819476-fbb3-4386-a4a8-dfe9af02ac7a","f53e7ac0-c7b8-4f27-a90d-464faea98c98","3da097f5-2792-4825-8148-286d102b65cc","todo:nobelPeacePriceWinner","s","2012"
|
111
|
+
# "2013-10-22 19:59:20.797484871 UTC","9e8c25a2-4a50-4020-81b8-ea1713c87885","f53e7ac0-c7b8-4f27-a90d-464faea98c98","3da097f5-2792-4825-8148-286d102b65cc","rdfs:label","s","EU"
|
112
|
+
# "2013-10-22 19:59:20.797499339 UTC","1f048c70-772c-429c-ad9f-6b6633205876","f53e7ac0-c7b8-4f27-a90d-464faea98c98","3da097f5-2792-4825-8148-286d102b65cc","rdfs:comment","s","European # Union"
|
113
|
+
# "2013-10-22 19:59:20.797514292 UTC","2c9c5e3c-d8d4-49b4-b133-384cf4a49e83","f53e7ac0-c7b8-4f27-a90d-464faea98c98","3da097f5-2792-4825-8148-286d102b65cc","todo:story","s","A long period of peace,\n that is a ""bliss""."
|
113
114
|
|
114
115
|
imported_graph = Dbd::Graph.new.from_CSV(csv)
|
115
116
|
|
116
117
|
puts imported_graph.map(&:short)
|
117
118
|
|
118
|
-
# [ cont ] :
|
119
|
-
# [ cont ] :
|
120
|
-
#
|
121
|
-
# [ cont ] :
|
122
|
-
# [ cont ] :
|
123
|
-
#
|
124
|
-
#
|
125
|
-
#
|
126
|
-
#
|
119
|
+
# [ cont ] : f53e7ac0 : prov:visibility : public
|
120
|
+
# [ cont ] : f53e7ac0 : prov:source
|
121
|
+
# : http://github.com/petervandenabeele/dbd
|
122
|
+
# [ cont ] : f53e7ac0 : dcterms:creator : @peter_v
|
123
|
+
# [ cont ] : f53e7ac0 : dcterms:created : 2013-10-22 19:59:20 UTC
|
124
|
+
# [ cont ] : f53e7ac0 : prov:license : MIT
|
125
|
+
# f53e7ac0 : 3da097f5 : todo:nobelPeacePriceWinn : 2012
|
126
|
+
# f53e7ac0 : 3da097f5 : rdfs:label : EU
|
127
|
+
# f53e7ac0 : 3da097f5 : rdfs:comment : European Union
|
128
|
+
# f53e7ac0 : 3da097f5 : todo:story : A long period of peace,_ that is a "bliss".
|
127
129
|
```
|
128
130
|
|
129
131
|
## Performance tests on 10 M facts
|
data/bin/test_5.rb
CHANGED
@@ -32,13 +32,13 @@ FACTS_PER_RESOURCE = 1000
|
|
32
32
|
|
33
33
|
count = ARGV[0].to_i
|
34
34
|
unless count > 0
|
35
|
-
puts
|
35
|
+
puts 'Give a "count" as first argument.'
|
36
36
|
exit(1)
|
37
37
|
end
|
38
38
|
|
39
39
|
filename = ARGV[1]
|
40
40
|
unless filename
|
41
|
-
puts
|
41
|
+
puts 'Give a "filename" as second argument.'
|
42
42
|
exit(1)
|
43
43
|
end
|
44
44
|
|
@@ -50,11 +50,17 @@ graph = Dbd::Graph.new
|
|
50
50
|
|
51
51
|
(0...count).each do |i|
|
52
52
|
context = Dbd::Context.new
|
53
|
-
context << Dbd::ContextFact.new(
|
53
|
+
context << Dbd::ContextFact.new(
|
54
|
+
predicate: 'prov:test',
|
55
|
+
object_type: 's',
|
56
|
+
object: 'A' * 10)
|
54
57
|
|
55
58
|
resource = Dbd::Resource.new(context_subject: context.subject)
|
56
59
|
(0...FACTS_PER_RESOURCE).each do |j|
|
57
|
-
resource << Dbd::Fact.new(
|
60
|
+
resource << Dbd::Fact.new(
|
61
|
+
predicate: 'test',
|
62
|
+
object_type: 's',
|
63
|
+
object: "#{'B' * 75} #{i * FACTS_PER_RESOURCE + j} \n CD")
|
58
64
|
end
|
59
65
|
|
60
66
|
graph << context << resource
|
data/docs/test.rb
CHANGED
@@ -2,63 +2,65 @@ require 'dbd'
|
|
2
2
|
|
3
3
|
context = Dbd::Context.new
|
4
4
|
|
5
|
-
context << Dbd::ContextFact.new(predicate:
|
6
|
-
context << Dbd::ContextFact.new(predicate:
|
7
|
-
context << Dbd::ContextFact.new(predicate:
|
8
|
-
context << Dbd::ContextFact.new(predicate:
|
9
|
-
context << Dbd::ContextFact.new(predicate:
|
5
|
+
context << Dbd::ContextFact.new(predicate: 'prov:visibility', object_type: 's', object: 'public')
|
6
|
+
context << Dbd::ContextFact.new(predicate: 'prov:source', object_type: 's', object: 'http://github.com/petervandenabeele/dbd')
|
7
|
+
context << Dbd::ContextFact.new(predicate: 'dcterms:creator', object_type: 's', object: '@peter_v')
|
8
|
+
context << Dbd::ContextFact.new(predicate: 'dcterms:created', object_type: 's', object: Time.now.utc)
|
9
|
+
context << Dbd::ContextFact.new(predicate: 'prov:license', object_type: 's', object: 'MIT')
|
10
10
|
|
11
11
|
nobel_peace_2012 = Dbd::Resource.new(context_subject: context.subject)
|
12
12
|
|
13
|
-
nobel_peace_2012 << Dbd::Fact.new(predicate:
|
14
|
-
nobel_peace_2012 << Dbd::Fact.new(predicate:
|
15
|
-
nobel_peace_2012 << Dbd::Fact.new(predicate:
|
16
|
-
nobel_peace_2012 << Dbd::Fact.new(predicate:
|
13
|
+
nobel_peace_2012 << Dbd::Fact.new(predicate: 'todo:nobelPeacePriceWinner', object_type: 's', object: '2012')
|
14
|
+
nobel_peace_2012 << Dbd::Fact.new(predicate: 'rdfs:label', object_type: 's', object: 'EU') # this will use some RDF predicates in future
|
15
|
+
nobel_peace_2012 << Dbd::Fact.new(predicate: 'rdfs:comment', object_type: 's', object: 'European Union')
|
16
|
+
nobel_peace_2012 << Dbd::Fact.new(predicate: 'todo:story', object_type: 's', object: "A long period of peace,\n that is a \"bliss\".")
|
17
17
|
|
18
18
|
graph = Dbd::Graph.new
|
19
19
|
|
20
20
|
graph << context << nobel_peace_2012
|
21
21
|
|
22
|
-
puts
|
22
|
+
puts 'facts in short representation:'
|
23
23
|
puts graph.map(&:short)
|
24
24
|
|
25
25
|
# facts in short representation:
|
26
|
-
# [ cont ] :
|
27
|
-
# [ cont ] :
|
28
|
-
#
|
29
|
-
# [ cont ] :
|
30
|
-
# [ cont ] :
|
31
|
-
#
|
32
|
-
#
|
33
|
-
#
|
34
|
-
#
|
26
|
+
# [ cont ] : f53e7ac0 : prov:visibility : public
|
27
|
+
# [ cont ] : f53e7ac0 : prov:source
|
28
|
+
# : http://github.com/petervandenabeele/dbd
|
29
|
+
# [ cont ] : f53e7ac0 : dcterms:creator : @peter_v
|
30
|
+
# [ cont ] : f53e7ac0 : dcterms:created : 2013-10-22 19:59:20 UTC
|
31
|
+
# [ cont ] : f53e7ac0 : prov:license : MIT
|
32
|
+
# f53e7ac0 : 3da097f5 : todo:nobelPeacePriceWinn : 2012
|
33
|
+
# f53e7ac0 : 3da097f5 : rdfs:label : EU
|
34
|
+
# f53e7ac0 : 3da097f5 : rdfs:comment : European Union
|
35
|
+
# f53e7ac0 : 3da097f5 : todo:story : A long period of peace,_ that is a "bliss".
|
35
36
|
|
36
37
|
csv = graph.to_CSV
|
37
38
|
|
38
|
-
puts
|
39
|
+
puts 'facts in full detail in CSV:'
|
39
40
|
puts csv
|
40
41
|
|
41
42
|
# facts in full detail in CSV:
|
42
|
-
#
|
43
|
-
# "2013-
|
44
|
-
# "2013-
|
45
|
-
# "2013-
|
46
|
-
# "2013-
|
47
|
-
# "2013-
|
48
|
-
# "2013-
|
49
|
-
# "2013-
|
50
|
-
# "2013-
|
43
|
+
# "2013-10-22 19:59:20.797321024 UTC","10909776-cce4-4723-b6ce-1860a4322447","","f53e7ac0-c7b8-4f27-a90d-464faea98c98","prov:visibility","s","public"
|
44
|
+
# "2013-10-22 19:59:20.797374506 UTC","c31e582e-2f12-4c75-8593-3ae39b7292a3","","f53e7ac0-c7b8-4f27-a90d-464faea98c98","prov:source","s","http://github.com/petervandenabeele/dbd"
|
45
|
+
# "2013-10-22 19:59:20.797406087 UTC","f1822dd9-4863-4f8c-96f0-c3a2bd46f301","","f53e7ac0-c7b8-4f27-a90d-464faea98c98","dcterms:creator","s","@peter_v"
|
46
|
+
# "2013-10-22 19:59:20.797422478 UTC","494fc3d8-0968-4b86-a4f9-a4b1d3359d14","","f53e7ac0-c7b8-4f27-a90d-464faea98c98","dcterms:created","s","2013-10-22 19:59:20 UTC"
|
47
|
+
# "2013-10-22 19:59:20.797438736 UTC","9f8034b9-4d18-475a-b111-4ab9535e03ac","","f53e7ac0-c7b8-4f27-a90d-464faea98c98","prov:license","s","MIT"
|
48
|
+
# "2013-10-22 19:59:20.797456038 UTC","27819476-fbb3-4386-a4a8-dfe9af02ac7a","f53e7ac0-c7b8-4f27-a90d-464faea98c98","3da097f5-2792-4825-8148-286d102b65cc","todo:nobelPeacePriceWinner","s","2012"
|
49
|
+
# "2013-10-22 19:59:20.797484871 UTC","9e8c25a2-4a50-4020-81b8-ea1713c87885","f53e7ac0-c7b8-4f27-a90d-464faea98c98","3da097f5-2792-4825-8148-286d102b65cc","rdfs:label","s","EU"
|
50
|
+
# "2013-10-22 19:59:20.797499339 UTC","1f048c70-772c-429c-ad9f-6b6633205876","f53e7ac0-c7b8-4f27-a90d-464faea98c98","3da097f5-2792-4825-8148-286d102b65cc","rdfs:comment","s","European # Union"
|
51
|
+
# "2013-10-22 19:59:20.797514292 UTC","2c9c5e3c-d8d4-49b4-b133-384cf4a49e83","f53e7ac0-c7b8-4f27-a90d-464faea98c98","3da097f5-2792-4825-8148-286d102b65cc","todo:story","s","A long period of peace,\n that is a ""bliss""."
|
51
52
|
|
52
53
|
imported_graph = Dbd::Graph.new.from_CSV(csv)
|
53
54
|
|
54
55
|
puts imported_graph.map(&:short)
|
55
56
|
|
56
|
-
# [ cont ] :
|
57
|
-
# [ cont ] :
|
58
|
-
#
|
59
|
-
# [ cont ] :
|
60
|
-
# [ cont ] :
|
61
|
-
#
|
62
|
-
#
|
63
|
-
#
|
64
|
-
#
|
57
|
+
# [ cont ] : f53e7ac0 : prov:visibility : public
|
58
|
+
# [ cont ] : f53e7ac0 : prov:source
|
59
|
+
# : http://github.com/petervandenabeele/dbd
|
60
|
+
# [ cont ] : f53e7ac0 : dcterms:creator : @peter_v
|
61
|
+
# [ cont ] : f53e7ac0 : dcterms:created : 2013-10-22 19:59:20 UTC
|
62
|
+
# [ cont ] : f53e7ac0 : prov:license : MIT
|
63
|
+
# f53e7ac0 : 3da097f5 : todo:nobelPeacePriceWinn : 2012
|
64
|
+
# f53e7ac0 : 3da097f5 : rdfs:label : EU
|
65
|
+
# f53e7ac0 : 3da097f5 : rdfs:comment : European Union
|
66
|
+
# f53e7ac0 : 3da097f5 : todo:story : A long period of peace,_ that is a "bliss".
|
data/lib/dbd/errors.rb
CHANGED
data/lib/dbd/fact.rb
CHANGED
@@ -22,20 +22,20 @@ module Dbd
|
|
22
22
|
# creation of the fact, but it has to increase in strictly monotic
|
23
23
|
# order in a fact stream.
|
24
24
|
#
|
25
|
-
# * a
|
25
|
+
# * a *id* (unique and invariant)
|
26
26
|
#
|
27
27
|
# To allow referencing back to it (e.g. to invalidate it later in a fact stream).
|
28
|
+
# The id is implemented as a uuid. In the CSV serialization the 32+4 character
|
29
|
+
# representation is used.
|
28
30
|
#
|
29
31
|
# * a *context_subject* (a uuid)
|
30
32
|
#
|
31
|
-
# The subject of the Context (a set of
|
32
|
-
#
|
33
|
-
# Context (the Context must have been fully
|
34
|
-
# defined, earlier in a fact stream).
|
33
|
+
# The subject of the Context (a set of ContextFacts with the same subject)
|
34
|
+
# about this fact. Each Fact, points *back* to a Context.
|
35
35
|
#
|
36
36
|
# * a *subject* (a uuid)
|
37
37
|
#
|
38
|
-
# "About which Resource is this fact?"
|
38
|
+
# "About which Resource is this fact?"
|
39
39
|
#
|
40
40
|
# Similar to the subject of an RDF triple, except that this subject is not
|
41
41
|
# a URI, but an abstract uuid (that is world-wide unique and invariant).
|
@@ -45,17 +45,39 @@ module Dbd
|
|
45
45
|
#
|
46
46
|
# * a *predicate* (a string)
|
47
47
|
#
|
48
|
-
# "Which property of the resource are we describing?"
|
48
|
+
# "Which property of the resource are we describing?"
|
49
49
|
#
|
50
50
|
# Currently this is a string, but I suggest modeling this similar to predicate
|
51
51
|
# in RDF. Probably more detailed modeling using RDF predicate will follow.
|
52
52
|
#
|
53
|
-
# * an *
|
53
|
+
# * an *object_type* (a short string)
|
54
|
+
#
|
55
|
+
# "What is the type of the object?"
|
56
|
+
#
|
57
|
+
# A short string that encodes the type of the object. Based loosely on
|
58
|
+
# thrift and RDF (xsd), following types are suggested:
|
59
|
+
#
|
60
|
+
# data types:
|
61
|
+
# * s : String (like xsd:string and thrift string)
|
62
|
+
# * b : Boolean (like xsd:boolean and thrift bool) ("true" or "false")
|
63
|
+
# * d : Decimal (like xsd:decimal ; not present in thrift)
|
64
|
+
# * f : Float (like xsd:double and thrift double)
|
65
|
+
# * l : Long Int (like thrift i64 signed 64 bit integer)
|
66
|
+
# * t : Time (like xsd:dateTime and Ruby Time (date + time combined))
|
67
|
+
#
|
68
|
+
# references:
|
69
|
+
# * i : ID (currently a UUID, with its 32+4 char representation)
|
70
|
+
# * r : Resource (currently a UUID, with its 32+4 char representation)
|
71
|
+
# * c : Context (currently a UUID, with its 32+4 char representation)
|
72
|
+
# * u : URI (like RDF URI's)
|
73
|
+
#
|
74
|
+
# In this version, only String, Boolean and Resource are implemented.
|
75
|
+
#
|
76
|
+
# * an *object* (a value, of type object_type)
|
54
77
|
#
|
55
78
|
# "What is the value of the property of the resource we are describing?".
|
56
79
|
#
|
57
|
-
#
|
58
|
-
# in RDF. Probably more detailed modeling using RDF object will follow.
|
80
|
+
# Serialized to a string, but can be of any of the object_types.
|
59
81
|
class Fact
|
60
82
|
|
61
83
|
##
|
@@ -65,13 +87,14 @@ module Dbd
|
|
65
87
|
end
|
66
88
|
|
67
89
|
##
|
68
|
-
# @return [Array] The
|
90
|
+
# @return [Array] The 7 attributes of a Fact.
|
69
91
|
def self.attributes
|
70
92
|
[:time_stamp,
|
71
93
|
:id,
|
72
94
|
:context_subject,
|
73
95
|
:subject,
|
74
96
|
:predicate,
|
97
|
+
:object_type,
|
75
98
|
:object]
|
76
99
|
end
|
77
100
|
|
@@ -115,6 +138,7 @@ module Dbd
|
|
115
138
|
#
|
116
139
|
# @param [Hash{Symbol => Object}] options
|
117
140
|
# @option options [#to_s] :object Required : the object for this Fact (required)
|
141
|
+
# @option options [#to_s] :object_type Required : the object_type for this Fact (required)
|
118
142
|
# @option options [#to_s] :predicate Required : the predicate for this Fact
|
119
143
|
# @option options [String (uuid)] :subject Optional : the subject for this Fact
|
120
144
|
# @option options [String (uuid)] :context_subject Optional : the subject of the Context
|
@@ -126,23 +150,25 @@ module Dbd
|
|
126
150
|
@context_subject = options[:context_subject]
|
127
151
|
@subject = options[:subject]
|
128
152
|
@predicate = options[:predicate]
|
153
|
+
@object_type = options[:object_type]
|
129
154
|
@object = options[:object]
|
130
155
|
validate_time_stamp_class(@time_stamp)
|
131
|
-
raise PredicateError, "predicate cannot be nil" if predicate.nil?
|
132
|
-
raise
|
156
|
+
raise PredicateError, "predicate cannot be nil" if @predicate.nil?
|
157
|
+
raise ObjectTypeError, "object_type cannot be nil" if @object_type !~ /^(s|b|r)$/
|
158
|
+
raise ObjectError, "object cannot be nil" if @object.nil?
|
133
159
|
end
|
134
160
|
|
135
161
|
##
|
136
|
-
# @return [Array] The
|
162
|
+
# @return [Array] The 7 values of a Fact.
|
137
163
|
def values
|
138
164
|
self.class.attributes.map{ |attribute| self.send(attribute) }
|
139
165
|
end
|
140
166
|
|
141
167
|
##
|
142
|
-
# @return [Array] The
|
168
|
+
# @return [Array] The 7 values of a Fact converted to a string.
|
143
169
|
# The individual strings are escaped:
|
144
170
|
# * newlines are escaped to '\n'
|
145
|
-
# This is used for the
|
171
|
+
# This is used for the 7 entries in the to_CSV mapping.
|
146
172
|
#
|
147
173
|
def string_values
|
148
174
|
values.map{ |value| escaped_string(value.to_s) }
|
data/lib/dbd/fact/collection.rb
CHANGED
@@ -8,7 +8,8 @@ module Dbd
|
|
8
8
|
|
9
9
|
def initialize
|
10
10
|
super
|
11
|
-
@
|
11
|
+
@resource_indices_by_subject = {}
|
12
|
+
@context_indices_by_subject = {}
|
12
13
|
end
|
13
14
|
|
14
15
|
def newest_time_stamp
|
@@ -38,27 +39,71 @@ module Dbd
|
|
38
39
|
def <<(fact)
|
39
40
|
raise FactError, "#{fact.errors.join(', ')}." unless fact.errors.empty?
|
40
41
|
validate_time_stamp(fact)
|
41
|
-
|
42
|
-
@hash_by_subject[fact.subject] << index
|
42
|
+
add_to_collection(fact)
|
43
43
|
self
|
44
44
|
end
|
45
45
|
|
46
|
+
##
|
47
|
+
# This method works on resource and context subjects.
|
48
|
+
#
|
49
|
+
# Should be less relevant, now that resources and contexts
|
50
|
+
# are available as methods to get proper access.
|
46
51
|
def by_subject(fact_subject)
|
47
|
-
|
52
|
+
hash_entry_from_indices(fact_subject).map do |index|
|
53
|
+
@internal_collection[index]
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
##
|
58
|
+
# Use this to get all resource subjects. But if the resources
|
59
|
+
# themselves are needed, there is a direct Graph#resources method.
|
60
|
+
def resource_subjects
|
61
|
+
@resource_indices_by_subject.keys
|
48
62
|
end
|
49
63
|
|
50
|
-
|
51
|
-
|
64
|
+
##
|
65
|
+
# Use this to get all contexte subjects. But if the contexts
|
66
|
+
# themselves are needed, there is a direct Graph#contexts method.
|
67
|
+
def context_subjects
|
68
|
+
@context_indices_by_subject.keys
|
52
69
|
end
|
53
70
|
|
54
71
|
private
|
55
72
|
|
73
|
+
##
|
74
|
+
# Because the subject are either in the resource or the context index,
|
75
|
+
# we need to search both. A subject should never be in both, but we
|
76
|
+
# do currently not defend against that error.
|
77
|
+
def hash_entry_from_indices(fact_subject)
|
78
|
+
@resource_indices_by_subject[fact_subject] || @context_indices_by_subject[fact_subject]
|
79
|
+
end
|
80
|
+
|
56
81
|
def validate_time_stamp(fact)
|
57
82
|
if (newest_time_stamp && fact.time_stamp <= newest_time_stamp)
|
58
|
-
raise OutOfOrderError,
|
83
|
+
raise OutOfOrderError, "time_stamp of fact was too old : #{fact.time_stamp}"
|
59
84
|
end
|
60
85
|
end
|
61
86
|
|
87
|
+
def add_to_collection(fact)
|
88
|
+
index = Helpers::OrderedSetCollection.add_and_return_index(fact, @internal_collection)
|
89
|
+
add_to_index_hash(fact, index)
|
90
|
+
end
|
91
|
+
|
92
|
+
def add_to_index_hash(fact, index)
|
93
|
+
if fact.context_fact?
|
94
|
+
add_to_index_hash_with_default_array(@context_indices_by_subject, fact.subject, index)
|
95
|
+
else
|
96
|
+
add_to_index_hash_with_default_array(@resource_indices_by_subject, fact.subject, index)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
def add_to_index_hash_with_default_array(index_hash, subject, index)
|
101
|
+
if (array = index_hash[subject])
|
102
|
+
array << index
|
103
|
+
else
|
104
|
+
index_hash[subject] = [index]
|
105
|
+
end
|
106
|
+
end
|
62
107
|
end
|
63
108
|
end
|
64
109
|
end
|
data/lib/dbd/fact/factory.rb
CHANGED
@@ -34,15 +34,15 @@ module Dbd
|
|
34
34
|
fact_from_values_hash(values_hash(string_hash))
|
35
35
|
end
|
36
36
|
|
37
|
+
##
|
38
|
+
# Formats for checking CSV fields
|
39
|
+
# the predicate, object_type and object are tested in the initializer
|
37
40
|
def attribute_formats
|
38
|
-
# TODO clean this up
|
39
41
|
{
|
40
42
|
id: [true, Fact::ID.valid_regexp],
|
41
43
|
time_stamp: [true, TimeStamp.valid_regexp],
|
42
44
|
context_subject: [false, Fact::Subject.valid_regexp],
|
43
|
-
subject: [true, Fact::Subject.valid_regexp]
|
44
|
-
predicate: [true, /./],
|
45
|
-
object: [true, /./]
|
45
|
+
subject: [true, Fact::Subject.valid_regexp]
|
46
46
|
}
|
47
47
|
end
|
48
48
|
|
@@ -64,7 +64,7 @@ module Dbd
|
|
64
64
|
unescaped_values = unescaped_string_values(string_values)
|
65
65
|
attributes_strings_array = [top_class.attributes, unescaped_values].transpose
|
66
66
|
# Remove empty values (e.g. the context_subject for a ContextFact).
|
67
|
-
attributes_strings_array.delete_if{ |
|
67
|
+
attributes_strings_array.delete_if{ |_, v| v == '' }
|
68
68
|
Hash[attributes_strings_array]
|
69
69
|
end
|
70
70
|
|
@@ -86,16 +86,21 @@ module Dbd
|
|
86
86
|
attribute_formats.each do |attr, validation|
|
87
87
|
string = string_hash[attr]
|
88
88
|
mandatory, format = validation
|
89
|
-
|
89
|
+
validate_string_by_regexp(mandatory, string, format)
|
90
90
|
end
|
91
|
+
|
91
92
|
end
|
92
93
|
|
93
|
-
def
|
94
|
+
def validate_string_by_regexp(mandatory, string, format)
|
94
95
|
if (mandatory || string) && (string !~ format)
|
95
|
-
|
96
|
+
report_invalid_entry(string)
|
96
97
|
end
|
97
98
|
end
|
98
99
|
|
100
|
+
def report_invalid_entry(string)
|
101
|
+
raise FactError, "invalid entry found : #{string}"
|
102
|
+
end
|
103
|
+
|
99
104
|
end
|
100
105
|
end
|
101
106
|
end
|
data/lib/dbd/graph.rb
CHANGED
@@ -90,23 +90,23 @@ module Dbd
|
|
90
90
|
#
|
91
91
|
# @return [Array] array with all resources
|
92
92
|
def resources
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
end.compact
|
93
|
+
@resource_indices_by_subject.map do |subject, fact_indices|
|
94
|
+
Resource.new(subject: subject) << facts_from_indices(fact_indices)
|
95
|
+
end
|
97
96
|
end
|
98
97
|
|
99
|
-
|
100
|
-
|
101
|
-
#
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
resource << facts
|
98
|
+
##
|
99
|
+
# Return an array of contexts for graph
|
100
|
+
#
|
101
|
+
# @return [Array] array with all contexts
|
102
|
+
def contexts
|
103
|
+
@context_indices_by_subject.map do |subject, fact_indices|
|
104
|
+
Context.new(subject: subject) << facts_from_indices(fact_indices)
|
107
105
|
end
|
108
106
|
end
|
109
107
|
|
108
|
+
private
|
109
|
+
|
110
110
|
##
|
111
111
|
# Setting a strictly monotonically increasing time_stamp (if not yet set).
|
112
112
|
# The time_stamp also has some randomness (1 .. 999 ns) to reduce the
|
@@ -115,17 +115,34 @@ module Dbd
|
|
115
115
|
fact.time_stamp = TimeStamp.new(larger_than: newest_time_stamp) unless fact.time_stamp
|
116
116
|
end
|
117
117
|
|
118
|
+
##
|
119
|
+
# Reach deep into the @internal_collection for the facts.
|
120
|
+
# In later implementations with external stores, this
|
121
|
+
# will probably change.
|
122
|
+
def facts_from_indices(fact_indices)
|
123
|
+
fact_indices.map do |index|
|
124
|
+
@internal_collection[index]
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
118
128
|
def csv_defaults
|
119
|
-
{force_quotes: true,
|
120
|
-
|
129
|
+
{ force_quotes: true,
|
130
|
+
encoding: 'utf-8' }
|
121
131
|
end
|
122
132
|
|
133
|
+
##
|
134
|
+
# Reach deep into the @internal_collection for the facts.
|
135
|
+
# In later implementations with external stores, this
|
136
|
+
# will probably change.
|
123
137
|
def push_facts(target)
|
124
138
|
@internal_collection.each do |fact|
|
125
139
|
target << fact.string_values
|
126
140
|
end
|
127
141
|
end
|
128
142
|
|
143
|
+
##
|
144
|
+
# It seems that sometimes temp files are not properly
|
145
|
+
# cleaned up.
|
129
146
|
def on_sorted_file(filename)
|
130
147
|
Tempfile.open('foo', 'data/') do |sorted_file|
|
131
148
|
create_sorted_file(filename, sorted_file)
|
data/lib/dbd/version.rb
CHANGED
@@ -53,12 +53,12 @@ module Dbd
|
|
53
53
|
end
|
54
54
|
|
55
55
|
describe 'attributes and values' do
|
56
|
-
it 'there are
|
57
|
-
described_class.attributes.size.should ==
|
56
|
+
it 'there are 7 attributes' do
|
57
|
+
described_class.attributes.size.should == 7
|
58
58
|
end
|
59
59
|
|
60
|
-
it 'there are
|
61
|
-
context_fact_1.values.size.should ==
|
60
|
+
it 'there are 7 values' do
|
61
|
+
context_fact_1.values.size.should == 7
|
62
62
|
end
|
63
63
|
end
|
64
64
|
|
@@ -62,10 +62,6 @@ module Dbd
|
|
62
62
|
subject << fact_2_with_subject
|
63
63
|
lambda { subject[0] } . should raise_exception NoMethodError
|
64
64
|
end
|
65
|
-
|
66
|
-
it '#<< returns self, so chaining is possible' do
|
67
|
-
(subject << fact_2_with_subject).should == subject
|
68
|
-
end
|
69
65
|
end
|
70
66
|
|
71
67
|
describe 'adding a fact with a ref to a context_fact' do
|
@@ -147,7 +143,7 @@ module Dbd
|
|
147
143
|
|
148
144
|
it 'raises FactError with message when fact.errors has errors' do
|
149
145
|
context_fact_visibility.stub(:errors).and_return(['Error 1', 'Error 2'])
|
150
|
-
lambda { subject << context_fact_visibility }
|
146
|
+
lambda { subject << context_fact_visibility }.should raise_error(
|
151
147
|
FactError,
|
152
148
|
'Error 1, Error 2.')
|
153
149
|
end
|
@@ -158,24 +154,36 @@ module Dbd
|
|
158
154
|
subject << context_fact_visibility
|
159
155
|
subject << context_fact_created_by
|
160
156
|
subject << context_fact_original_source
|
157
|
+
subject << fact_2_with_subject
|
161
158
|
context_fact_visibility.subject.should == context_subject_1 # assert test set-up
|
162
159
|
context_fact_created_by.subject.should == context_subject_1 # assert test set-up
|
163
160
|
context_fact_original_source.subject.should == context_subject_2 # assert test set-up
|
164
161
|
subject.by_subject(context_subject_1).first.should == context_fact_visibility
|
165
162
|
subject.by_subject(context_subject_1).last.should == context_fact_created_by
|
166
163
|
subject.by_subject(context_subject_2).single.should == context_fact_original_source
|
164
|
+
subject.by_subject(fact_2_with_subject.subject).single.should == fact_2_with_subject
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
describe 'resource_subjects : ' do
|
169
|
+
it 'finds all and only subjects of resources' do
|
170
|
+
subject << context_fact_visibility
|
171
|
+
subject << context_fact_created_by # same subject as previous line
|
172
|
+
subject << fact_2_with_subject
|
173
|
+
subject << fact_3_with_subject
|
174
|
+
subject.resource_subjects.first.should == fact_2_with_subject.subject
|
175
|
+
subject.resource_subjects.last.should == fact_3_with_subject.subject
|
176
|
+
subject.resource_subjects.size.should == 2
|
167
177
|
end
|
168
178
|
end
|
169
179
|
|
170
|
-
describe '
|
171
|
-
it 'finds all subjects' do
|
180
|
+
describe 'context_subjects : ' do
|
181
|
+
it 'finds all and only subjects of contexts' do
|
172
182
|
subject << context_fact_visibility
|
173
183
|
subject << context_fact_created_by # same subject as previous line
|
174
184
|
subject << fact_2_with_subject
|
175
185
|
subject << fact_3_with_subject
|
176
|
-
subject.
|
177
|
-
subject.subjects.last.should == fact_3_with_subject.subject
|
178
|
-
subject.subjects.size.should == 3
|
186
|
+
subject.context_subjects.single.should == context_fact_visibility.subject
|
179
187
|
end
|
180
188
|
end
|
181
189
|
|
@@ -78,34 +78,53 @@ module Dbd
|
|
78
78
|
end
|
79
79
|
|
80
80
|
describe 'does raise exception' do
|
81
|
+
|
82
|
+
def should_raise_fact_error
|
83
|
+
lambda{ with_validation(string_values) }.should raise_error(FactError)
|
84
|
+
end
|
85
|
+
|
86
|
+
def should_raise_object_type_error
|
87
|
+
lambda{ with_validation(string_values) }.should raise_error(ObjectTypeError)
|
88
|
+
end
|
89
|
+
|
81
90
|
it 'for invalid id' do
|
82
91
|
string_values[0] = 'foo'
|
83
|
-
|
92
|
+
should_raise_fact_error
|
84
93
|
end
|
85
94
|
|
86
95
|
it 'for invalid time_stamp' do
|
87
96
|
string_values[1] = 'foo'
|
88
|
-
|
97
|
+
should_raise_fact_error
|
89
98
|
end
|
90
99
|
|
91
100
|
it 'for invalid context_subject' do
|
92
101
|
string_values[2] = 'foo'
|
93
|
-
|
102
|
+
should_raise_fact_error
|
94
103
|
end
|
95
104
|
|
96
105
|
it 'for invalid subject' do
|
97
106
|
string_values[3] = 'foo'
|
98
|
-
|
107
|
+
should_raise_fact_error
|
99
108
|
end
|
100
109
|
|
101
110
|
it 'for invalid predicate' do
|
102
111
|
string_values[4] = ''
|
103
|
-
lambda{ with_validation(string_values) }.should raise_error(
|
112
|
+
lambda{ with_validation(string_values) }.should raise_error(PredicateError)
|
113
|
+
end
|
114
|
+
|
115
|
+
it 'for invalid object_type' do
|
116
|
+
string_values[5] = 'sb'
|
117
|
+
should_raise_object_type_error
|
118
|
+
end
|
119
|
+
|
120
|
+
it 'for other invalid object_type' do
|
121
|
+
string_values[5] = 'int'
|
122
|
+
should_raise_object_type_error
|
104
123
|
end
|
105
124
|
|
106
125
|
it 'for invalid object' do
|
107
|
-
string_values[
|
108
|
-
lambda{ with_validation(string_values) }.should raise_error(
|
126
|
+
string_values[6] = ''
|
127
|
+
lambda{ with_validation(string_values) }.should raise_error(ObjectError)
|
109
128
|
end
|
110
129
|
end
|
111
130
|
end
|
@@ -111,7 +111,7 @@ module Dbd
|
|
111
111
|
|
112
112
|
describe 'attributes' do
|
113
113
|
it 'there are 6 attributes' do
|
114
|
-
described_class.attributes.size.should ==
|
114
|
+
described_class.attributes.size.should == 7
|
115
115
|
end
|
116
116
|
|
117
117
|
it 'first attribute is :time_stamp' do
|
@@ -124,8 +124,8 @@ module Dbd
|
|
124
124
|
end
|
125
125
|
|
126
126
|
describe 'values' do
|
127
|
-
it 'there are
|
128
|
-
full_fact.values.size.should ==
|
127
|
+
it 'there are 7 values' do
|
128
|
+
full_fact.values.size.should == 7
|
129
129
|
end
|
130
130
|
|
131
131
|
it 'the first element (time_stamp) is a TimeStamp' do
|
@@ -134,8 +134,8 @@ module Dbd
|
|
134
134
|
end
|
135
135
|
|
136
136
|
describe 'string_values' do
|
137
|
-
it 'there are
|
138
|
-
full_fact.string_values.size.should ==
|
137
|
+
it 'there are 7 string_values' do
|
138
|
+
full_fact.string_values.size.should == 7
|
139
139
|
end
|
140
140
|
|
141
141
|
it 'the first element (time_stamp) is a String' do
|
@@ -168,13 +168,21 @@ module Dbd
|
|
168
168
|
end
|
169
169
|
|
170
170
|
it 'is false for each of the entries largely different' do
|
171
|
-
(0...string_values.size).each do |index|
|
171
|
+
((0...string_values.size).to_a - [5]).each do |index|
|
172
172
|
string_values_1_modified = string_values.dup.tap { |_string_values|
|
173
173
|
_string_values[index][3] = '4' # different and valid for all cases
|
174
174
|
}
|
175
|
-
|
176
|
-
other.should_not be_equivalent(ref)
|
175
|
+
should_not_be_equivalent(string_values_1_modified, ref)
|
177
176
|
end
|
177
|
+
|
178
|
+
string_values_1_modified = string_values.dup
|
179
|
+
string_values_1_modified[5] = 'r'
|
180
|
+
should_not_be_equivalent(string_values_1_modified, ref)
|
181
|
+
end
|
182
|
+
|
183
|
+
def should_not_be_equivalent(modified, ref)
|
184
|
+
other = factory.from_string_values(modified)
|
185
|
+
other.should_not be_equivalent(ref)
|
178
186
|
end
|
179
187
|
|
180
188
|
it 'is true when the time_stamp is 500 ns larger' do
|
@@ -50,6 +50,7 @@ module Dbd
|
|
50
50
|
lambda do
|
51
51
|
described_class.new(
|
52
52
|
predicate: nil,
|
53
|
+
object_type: 's',
|
53
54
|
object: string_object_1)
|
54
55
|
end.should raise_error(PredicateError)
|
55
56
|
end
|
@@ -58,9 +59,18 @@ module Dbd
|
|
58
59
|
lambda do
|
59
60
|
described_class.new(
|
60
61
|
predicate: data_predicate,
|
62
|
+
object_type: 's',
|
61
63
|
object: nil)
|
62
64
|
end.should raise_error(ObjectError)
|
63
65
|
end
|
66
|
+
|
67
|
+
it 'an nil object_type raises ObjectError' do
|
68
|
+
lambda do
|
69
|
+
described_class.new(
|
70
|
+
predicate: data_predicate,
|
71
|
+
object: 'foo')
|
72
|
+
end.should raise_error(ObjectTypeError)
|
73
|
+
end
|
64
74
|
end
|
65
75
|
|
66
76
|
describe 'create fact_1' do
|
@@ -8,6 +8,8 @@ module TestFactories
|
|
8
8
|
let(:string_object_1) { 'Gandhi' }
|
9
9
|
let(:fact_2_with_subject) { described_class.fact_2_with_subject(context_subject) }
|
10
10
|
let(:full_fact) { described_class.full_fact }
|
11
|
+
let(:fact_with_boolean_object) { described_class.fact_with_boolean_object }
|
12
|
+
let(:fact_with_resource_object) { described_class.fact_with_resource_object }
|
11
13
|
|
12
14
|
describe 'factory works' do
|
13
15
|
it 'with explicit context_subject' do
|
@@ -64,6 +66,20 @@ module TestFactories
|
|
64
66
|
end
|
65
67
|
end
|
66
68
|
|
69
|
+
describe 'fact_with_boolean_object' do
|
70
|
+
it 'has "b" as object_type' do
|
71
|
+
described_class.fact_with_boolean_object(context_subject, subject).
|
72
|
+
object_type.should == 'b'
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
describe 'fact_with_resource_object' do
|
77
|
+
it 'has "r" as object_type' do
|
78
|
+
described_class.fact_with_resource_object(context_subject, subject).
|
79
|
+
object_type.should == 'r'
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
67
83
|
describe 'full_fact' do
|
68
84
|
it 'does not fail' do
|
69
85
|
full_fact
|
@@ -15,12 +15,12 @@ module Dbd
|
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
|
-
it 'the
|
18
|
+
it 'the resources has the facts' do
|
19
19
|
facts = full_graph.reject(&:context_fact?)
|
20
20
|
full_graph.resources.single.should include(*facts)
|
21
21
|
end
|
22
22
|
|
23
|
-
it 'the
|
23
|
+
it 'the resources does not have context_facts' do
|
24
24
|
context_facts = full_graph.select(&:context_fact?)
|
25
25
|
full_graph.resources.single.should_not include(*context_facts)
|
26
26
|
end
|
@@ -29,5 +29,31 @@ module Dbd
|
|
29
29
|
full_graph.resources.should_not be_empty
|
30
30
|
end
|
31
31
|
end
|
32
|
+
|
33
|
+
context 'contexts' do
|
34
|
+
it 'is an array' do
|
35
|
+
full_graph.contexts.should be_a(Array)
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'is an array of contexts' do
|
39
|
+
full_graph.contexts.each do |context|
|
40
|
+
context.should be_a(Context)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'the contexts has the context_facts' do
|
45
|
+
context_facts = full_graph.select(&:context_fact?)
|
46
|
+
full_graph.contexts.single.should include(*context_facts)
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'the contexts does not have facts' do
|
50
|
+
facts = full_graph.reject(&:context_fact?)
|
51
|
+
full_graph.contexts.single.should_not include(*facts)
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'has at least one entry' do
|
55
|
+
full_graph.contexts.should_not be_empty
|
56
|
+
end
|
57
|
+
end
|
32
58
|
end
|
33
|
-
end
|
59
|
+
end
|
@@ -72,8 +72,12 @@ module Dbd
|
|
72
72
|
first_line.split(',')[4].should == '"context:visibility"'
|
73
73
|
end
|
74
74
|
|
75
|
-
it 'has
|
76
|
-
first_line.split(',')[5].should == '"
|
75
|
+
it 'has object_type as 6th value' do
|
76
|
+
first_line.split(',')[5].should == '"s"'
|
77
|
+
end
|
78
|
+
|
79
|
+
it 'has object as 7th value' do
|
80
|
+
first_line.split(',')[6].should == '"public"'
|
77
81
|
end
|
78
82
|
end
|
79
83
|
|
@@ -139,8 +143,12 @@ module Dbd
|
|
139
143
|
first_line.split(',')[4].should == '"http://example.org/test/name"'
|
140
144
|
end
|
141
145
|
|
142
|
-
it 'has
|
143
|
-
first_line.split(',')[5].should == '"
|
146
|
+
it 'has object_type as 6th value' do
|
147
|
+
first_line.split(',')[5].should == '"s"'
|
148
|
+
end
|
149
|
+
|
150
|
+
it 'has object as 7th value' do
|
151
|
+
first_line.split(',')[6].should == '"Mandela"'
|
144
152
|
end
|
145
153
|
end
|
146
154
|
end
|
@@ -13,6 +13,7 @@ module TestFactories
|
|
13
13
|
factory_for.new(
|
14
14
|
subject: subject,
|
15
15
|
predicate: 'context:visibility',
|
16
|
+
object_type: 's',
|
16
17
|
object: 'public')
|
17
18
|
end
|
18
19
|
|
@@ -20,6 +21,7 @@ module TestFactories
|
|
20
21
|
factory_for.new(
|
21
22
|
subject: subject,
|
22
23
|
predicate: 'dcterms:creator',
|
24
|
+
object_type: 's',
|
23
25
|
object: 'peter_v')
|
24
26
|
end
|
25
27
|
|
@@ -27,6 +29,7 @@ module TestFactories
|
|
27
29
|
factory_for.new(
|
28
30
|
subject: subject,
|
29
31
|
predicate: 'prov:source',
|
32
|
+
object_type: 's',
|
30
33
|
object: "this has a comma , a newline \n and a double quote \"")
|
31
34
|
end
|
32
35
|
|
@@ -34,6 +37,7 @@ module TestFactories
|
|
34
37
|
factory_for.new(
|
35
38
|
subject: subject,
|
36
39
|
predicate: 'dcterms:created',
|
40
|
+
object_type: 's',
|
37
41
|
object: Time.now.utc)
|
38
42
|
end
|
39
43
|
end
|
data/spec/test_factories/fact.rb
CHANGED
@@ -15,13 +15,16 @@ module TestFactories
|
|
15
15
|
'40fab407-9b04-4a51-9a52-d978abfcbb1f',
|
16
16
|
'2e9fbc87-2e94-47e9-a8fd-121cc4bc3e8f',
|
17
17
|
'http://example.org/test/name',
|
18
|
+
's',
|
18
19
|
"Gandhi\\nKing\\\\n"]
|
19
20
|
end
|
20
21
|
|
22
|
+
|
21
23
|
def self.fact_1(context_subject = nil)
|
22
24
|
factory_for.new(
|
23
25
|
context_subject: context_subject,
|
24
26
|
predicate: 'http://example.org/test/name',
|
27
|
+
object_type: 's',
|
25
28
|
object: 'Gandhi')
|
26
29
|
end
|
27
30
|
|
@@ -29,6 +32,7 @@ module TestFactories
|
|
29
32
|
factory_for.new(
|
30
33
|
id: forced_id,
|
31
34
|
predicate: 'http://example.org/test/name',
|
35
|
+
object_type: 's',
|
32
36
|
object: "Gandhi\nKing\\n") # newline and \n
|
33
37
|
end
|
34
38
|
|
@@ -37,6 +41,7 @@ module TestFactories
|
|
37
41
|
context_subject: context_subject,
|
38
42
|
subject: subject,
|
39
43
|
predicate: 'http://example.org/test/comment',
|
44
|
+
object_type: 's',
|
40
45
|
object: "A long story with a newline\nreally with a comma, a double quote \" and a non-ASCII char éà Über.")
|
41
46
|
end
|
42
47
|
|
@@ -44,6 +49,7 @@ module TestFactories
|
|
44
49
|
factory_for.new(
|
45
50
|
time_stamp: time_stamp,
|
46
51
|
predicate: 'http://example.org/test/name',
|
52
|
+
object_type: 's',
|
47
53
|
object: 'Gandhi')
|
48
54
|
end
|
49
55
|
|
@@ -52,6 +58,7 @@ module TestFactories
|
|
52
58
|
context_subject: context_subject,
|
53
59
|
subject: new_subject,
|
54
60
|
predicate: 'http://example.org/test/name',
|
61
|
+
object_type: 's',
|
55
62
|
object: 'Mandela')
|
56
63
|
end
|
57
64
|
|
@@ -60,6 +67,7 @@ module TestFactories
|
|
60
67
|
context_subject: context_subject,
|
61
68
|
subject: new_subject,
|
62
69
|
predicate: 'http://example.org/test/name',
|
70
|
+
object_type: 's',
|
63
71
|
object: 'King')
|
64
72
|
end
|
65
73
|
|
@@ -68,6 +76,7 @@ module TestFactories
|
|
68
76
|
context_subject: context_subject,
|
69
77
|
subject: subject,
|
70
78
|
predicate: 'http://example.org/test/name',
|
79
|
+
object_type: 's',
|
71
80
|
object: 'Aung San Suu Kyi')
|
72
81
|
end
|
73
82
|
|
@@ -76,6 +85,7 @@ module TestFactories
|
|
76
85
|
context_subject: context_subject,
|
77
86
|
subject: subject,
|
78
87
|
predicate: 'http://example.org/test/name',
|
88
|
+
object_type: 's',
|
79
89
|
object: "\\n\n\\n\n\\\n\\\\\n\\\\\\\nEuropean\nUnion\\n")
|
80
90
|
end
|
81
91
|
|
@@ -88,6 +98,24 @@ module TestFactories
|
|
88
98
|
end
|
89
99
|
end
|
90
100
|
|
101
|
+
def self.fact_with_boolean_object(context_subject = nil, subject = nil)
|
102
|
+
factory_for.new(
|
103
|
+
context_subject: context_subject,
|
104
|
+
subject: subject,
|
105
|
+
predicate: 'meta:predicate_used',
|
106
|
+
object_type: 'b',
|
107
|
+
object: 'true')
|
108
|
+
end
|
109
|
+
|
110
|
+
def self.fact_with_resource_object(context_subject = nil, subject = nil)
|
111
|
+
factory_for.new(
|
112
|
+
context_subject: context_subject,
|
113
|
+
subject: subject,
|
114
|
+
predicate: 'schema:attendee',
|
115
|
+
object_type: 'r',
|
116
|
+
object: '10db9097-8a59-497d-97d3-621fd1921e9f') # the subject for a resource
|
117
|
+
end
|
118
|
+
|
91
119
|
module Collection
|
92
120
|
def self.factory_for_instance
|
93
121
|
o = Object.new
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dbd
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Peter Vandenabeele
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-10-
|
11
|
+
date: 2013-10-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|