dbd 0.0.14 → 0.0.15
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 +6 -1
- data/README.md +5 -2
- data/lib/dbd/context_fact.rb +0 -9
- data/lib/dbd/fact.rb +0 -16
- data/lib/dbd/fact/collection.rb +9 -8
- data/lib/dbd/version.rb +1 -1
- data/spec/lib/dbd/context_fact/methods_spec.rb +0 -8
- data/spec/lib/dbd/fact/collection/collection_spec.rb +6 -37
- data/spec/lib/dbd/fact/new_spec.rb +0 -8
- data/spec/lib/dbd/graph/from_csv_spec.rb +9 -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: a631ac1b673b24327126207b5898c6132a08f41f
|
4
|
+
data.tar.gz: 2abdda7d7da624dace39c486381130a813c28e92
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 03eac42ce2d9216371065f46a2ab8ab0dc19a88b9270f59cdcd50496d771dc4852fd30f471514028b00da6ed1de71787c8767388c697158e21b73e0e625b636a
|
7
|
+
data.tar.gz: 4baa8c0d598d1982442ee8c31a1e612939b5ae39c0167eb32eab25ebfa919c3a37523bb3a249a35f504d4bd67a08cdd65bdc76a2d9010846420ba7a3ab1fc265
|
data/HISTORY.txt
CHANGED
@@ -90,4 +90,9 @@
|
|
90
90
|
======
|
91
91
|
|
92
92
|
* in to_CSV the time_stamp now comes first (swapped with id)
|
93
|
-
* this will allow file level 'sort' on the ISO dates
|
93
|
+
* this will allow file level 'sort' on the ISO dates
|
94
|
+
|
95
|
+
0.0.15 (25 Aug 2013)
|
96
|
+
======
|
97
|
+
|
98
|
+
* better exception message for an OutOfOrder exception
|
data/README.md
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
# Dbd: A data store that (almost) never forgets
|
2
2
|
|
3
|
-
This is facts based data store, inspired by [RDF] concepts, but adding a
|
3
|
+
This is facts based data store, inspired by [RDF] concepts, but adding a
|
4
|
+
log based structure and fine-grained context (with provenance) for each fact.
|
5
|
+
I am building a simple demo application in [DbdDemo].
|
4
6
|
|
5
7
|
* [Why?][Rationale]
|
6
8
|
* <https://github.com/petervandenabeele/dbd>
|
@@ -150,7 +152,7 @@ This version also has input validation on the strings in the CSV. The time neede
|
|
150
152
|
and memory size (RSS) for reading the file (and populating the in-memory dataset
|
151
153
|
was):
|
152
154
|
|
153
|
-
Read from CSV (
|
155
|
+
Read from CSV (from_CSV) 10 M facts (of 250 Bytes; 2.5 GB netto data):
|
154
156
|
|
155
157
|
| ruby | time | memory (RSS) |
|
156
158
|
|------------|---------------|--------------:|
|
@@ -169,3 +171,4 @@ gsub with a regexp).
|
|
169
171
|
[RDF]: http://www.w3.org/RDF/
|
170
172
|
[Rationale]: http://github.com/petervandenabeele/dbd/blob/master/docs/rationale.md
|
171
173
|
[MIT]: https://github.com/petervandenabeele/dbd/blob/master/LICENSE.txt
|
174
|
+
[DbdDemo]: https://github.com/petervandenabeele/dbd_demo#readme
|
data/lib/dbd/context_fact.rb
CHANGED
@@ -32,15 +32,6 @@ module Dbd
|
|
32
32
|
super
|
33
33
|
end
|
34
34
|
|
35
|
-
##
|
36
|
-
# Executes the required update in used_context_subjects.
|
37
|
-
#
|
38
|
-
# For a ContextFact, there is no context_subject, so
|
39
|
-
# pointless to mark it in used_context_subjects hash.
|
40
|
-
def update_used_context_subjects(h)
|
41
|
-
# Do nothing (override the behaviour from super).
|
42
|
-
end
|
43
|
-
|
44
35
|
##
|
45
36
|
# Validates the presence or absence of context_subject.
|
46
37
|
#
|
data/lib/dbd/fact.rb
CHANGED
@@ -177,22 +177,6 @@ module Dbd
|
|
177
177
|
"#{object.to_s.truncate_utf8(80).gsub(/\n/, '_')}"
|
178
178
|
end
|
179
179
|
|
180
|
-
##
|
181
|
-
# Executes the required update in used_context_subjects.
|
182
|
-
#
|
183
|
-
# For a Fact, pointing to a Context in it's context_subject,
|
184
|
-
# marks this context_subject in the "used_context_subjects" hash that
|
185
|
-
# is passed in as an argument (DCI). This will avoid further changes to the
|
186
|
-
# Context with this context_subject.
|
187
|
-
#
|
188
|
-
# This is overridden in the ContextFact, since only relevant for a Fact.
|
189
|
-
#
|
190
|
-
# @param[Hash] :h the hash that contains the context_subject index
|
191
|
-
def update_used_context_subjects(h)
|
192
|
-
# using a context_subject sets the key
|
193
|
-
h[context_subject] = true
|
194
|
-
end
|
195
|
-
|
196
180
|
##
|
197
181
|
# Checks if a fact has errors for storing in the graph.
|
198
182
|
#
|
data/lib/dbd/fact/collection.rb
CHANGED
@@ -9,7 +9,6 @@ module Dbd
|
|
9
9
|
def initialize
|
10
10
|
super
|
11
11
|
@hash_by_subject = Hash.new { |h, k| h[k] = [] }
|
12
|
-
@used_context_subjects = {}
|
13
12
|
end
|
14
13
|
|
15
14
|
def newest_time_stamp
|
@@ -33,20 +32,14 @@ module Dbd
|
|
33
32
|
#
|
34
33
|
# Validates that added fact is newer.
|
35
34
|
#
|
36
|
-
# Validates that subject was never used as context_subject [A].
|
37
|
-
#
|
38
35
|
# Adds the fact and return the index in the collection.
|
39
36
|
#
|
40
37
|
# Store this index in the hash_by_subject.
|
41
|
-
#
|
42
|
-
# Mark the fact in the list of used context_subjects (for [A]).
|
43
38
|
def <<(fact)
|
44
39
|
raise FactError, "#{fact.errors.join(', ')}." unless fact.errors.empty?
|
45
|
-
|
46
|
-
raise OutOfOrderError if (@used_context_subjects[fact.subject])
|
40
|
+
validate_time_stamp(fact)
|
47
41
|
index = Helpers::OrderedSetCollection.add_and_return_index(fact, @internal_collection)
|
48
42
|
@hash_by_subject[fact.subject] << index
|
49
|
-
fact.update_used_context_subjects(@used_context_subjects)
|
50
43
|
self
|
51
44
|
end
|
52
45
|
|
@@ -54,6 +47,14 @@ module Dbd
|
|
54
47
|
@hash_by_subject[fact_subject].map{ |index| @internal_collection[index]}
|
55
48
|
end
|
56
49
|
|
50
|
+
private
|
51
|
+
|
52
|
+
def validate_time_stamp(fact)
|
53
|
+
if (newest_time_stamp && fact.time_stamp <= newest_time_stamp)
|
54
|
+
raise OutOfOrderError, "time_stamp of fact was too old : #{fact.time_stamp}"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
57
58
|
end
|
58
59
|
end
|
59
60
|
end
|
data/lib/dbd/version.rb
CHANGED
@@ -52,14 +52,6 @@ module Dbd
|
|
52
52
|
end
|
53
53
|
end
|
54
54
|
|
55
|
-
describe 'update_used_context_subjects' do
|
56
|
-
it 'does nothing for a context_fact' do
|
57
|
-
h = {}
|
58
|
-
context_fact_1.update_used_context_subjects(h)
|
59
|
-
h.should be_empty
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
55
|
describe 'attributes and values' do
|
64
56
|
it 'there are 6 attributes' do
|
65
57
|
described_class.attributes.size.should == 6
|
@@ -110,12 +110,16 @@ module Dbd
|
|
110
110
|
it 'adding an element with an older time_stamp fails' do
|
111
111
|
fact_2_with_subject # will be older then fact_3_with_subject
|
112
112
|
subject << fact_3_with_subject
|
113
|
-
lambda
|
113
|
+
lambda{ subject << fact_2_with_subject }.should raise_error(
|
114
|
+
OutOfOrderError,
|
115
|
+
"time_stamp of fact was too old : #{fact_2_with_subject.time_stamp}")
|
114
116
|
end
|
115
117
|
|
116
118
|
it 'adding an element with an equal time_stamp fails' do
|
117
119
|
subject << fact_2_with_subject
|
118
|
-
lambda
|
120
|
+
lambda{ subject << fact_2_with_subject }.should raise_error(
|
121
|
+
OutOfOrderError,
|
122
|
+
"time_stamp of fact was too old : #{fact_2_with_subject.time_stamp}")
|
119
123
|
end
|
120
124
|
end
|
121
125
|
|
@@ -136,41 +140,6 @@ module Dbd
|
|
136
140
|
end
|
137
141
|
end
|
138
142
|
|
139
|
-
describe 'context_facts must all come before first use by a fact' do
|
140
|
-
it 'adding a context_fact, depending fact, another context_fact with same subject fail' do
|
141
|
-
subject << context_fact_visibility
|
142
|
-
subject << fact_2_with_subject
|
143
|
-
lambda{ subject << context_fact_created_by }.should raise_error OutOfOrderError
|
144
|
-
end
|
145
|
-
|
146
|
-
# testing private functionality (kept temporarily as documentation)
|
147
|
-
# A hash with all the context_subjects that are used by at least one fact.
|
148
|
-
# Needed for the validation that no context_fact may be added that is
|
149
|
-
# referred from a fact that is already in the fact stream.
|
150
|
-
describe 'used_context_subjects' do
|
151
|
-
# testing an internal variable ...
|
152
|
-
|
153
|
-
let(:used_context_subjects) do
|
154
|
-
subject.instance_variable_get(:@used_context_subjects)
|
155
|
-
end
|
156
|
-
|
157
|
-
it 'is empty initially' do
|
158
|
-
used_context_subjects.should be_empty
|
159
|
-
end
|
160
|
-
|
161
|
-
it 'adding a context_fact alone does not create an entry' do
|
162
|
-
subject << context_fact_visibility
|
163
|
-
used_context_subjects.should be_empty
|
164
|
-
end
|
165
|
-
|
166
|
-
it 'adding a context_fact and a depending fact create an entry' do
|
167
|
-
subject << context_fact_visibility
|
168
|
-
subject << fact_2_with_subject
|
169
|
-
used_context_subjects[context_subject_1].should == true
|
170
|
-
end
|
171
|
-
end
|
172
|
-
end
|
173
|
-
|
174
143
|
describe 'validate that facts do not have errors when loading in the Fact::Collection' do
|
175
144
|
it 'succeeds with a fact from factory' do
|
176
145
|
subject << fact_2_with_subject # should_not raise_error
|
@@ -74,13 +74,5 @@ module Dbd
|
|
74
74
|
end
|
75
75
|
end
|
76
76
|
end
|
77
|
-
|
78
|
-
describe 'update_used_context_subjects' do
|
79
|
-
it 'sets the value for context_subject to true for a fact' do
|
80
|
-
h = {}
|
81
|
-
fact_1.update_used_context_subjects(h)
|
82
|
-
h[fact_1.context_subject].should == true
|
83
|
-
end
|
84
|
-
end
|
85
77
|
end
|
86
78
|
end
|
@@ -89,5 +89,14 @@ module Dbd
|
|
89
89
|
graph_from_CSV.first.should be_equivalent(graph.first)
|
90
90
|
end
|
91
91
|
end
|
92
|
+
|
93
|
+
describe 'error handling' do
|
94
|
+
it 'gives better description on incorrect fact size' do
|
95
|
+
#TODO present a nicer error (check the amount of entries in a CSV input line)
|
96
|
+
csv = 'foo, bar'
|
97
|
+
lambda { described_class.new.from_CSV(csv) }.should raise_error IndexError
|
98
|
+
end
|
99
|
+
|
100
|
+
end
|
92
101
|
end
|
93
102
|
end
|
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.0.15
|
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-08-
|
11
|
+
date: 2013-08-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|