dbd 0.0.11 → 0.0.12
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Guardfile +0 -1
- data/HISTORY.txt +9 -0
- data/README.md +47 -39
- data/bin/test_1.rb +4 -4
- data/bin/test_5.rb +4 -4
- data/docs/test.rb +11 -11
- data/lib/dbd.rb +2 -2
- data/lib/dbd/context.rb +65 -0
- data/lib/dbd/context_fact.rb +76 -0
- data/lib/dbd/errors.rb +1 -1
- data/lib/dbd/fact.rb +37 -37
- data/lib/dbd/fact/collection.rb +5 -5
- data/lib/dbd/fact/factory.rb +6 -6
- data/lib/dbd/graph.rb +2 -2
- data/lib/dbd/resource.rb +25 -24
- data/lib/dbd/version.rb +1 -1
- data/spec/lib/dbd/context/context_spec.rb +74 -0
- data/spec/lib/dbd/context_fact/methods_spec.rb +79 -0
- data/spec/lib/dbd/context_fact/new_spec.rb +51 -0
- data/spec/lib/dbd/context_fact/test_factories_spec.rb +24 -0
- data/spec/lib/dbd/errors/errors_spec.rb +30 -0
- data/spec/lib/dbd/fact/collection/collection_spec.rb +58 -58
- data/spec/lib/dbd/fact/factory/factory_spec.rb +3 -3
- data/spec/lib/dbd/fact/methods_spec.rb +12 -12
- data/spec/lib/dbd/fact/new_spec.rb +9 -9
- data/spec/lib/dbd/fact/subject/test_factories_spec.rb +4 -4
- data/spec/lib/dbd/fact/test_factories_spec.rb +18 -18
- data/spec/lib/dbd/graph/add_to_graph_spec.rb +22 -22
- data/spec/lib/dbd/graph/from_csv_spec.rb +16 -16
- data/spec/lib/dbd/graph/test_factories_spec.rb +11 -11
- data/spec/lib/dbd/graph/to_csv_spec.rb +18 -18
- data/spec/lib/dbd/performance_spec.rb +4 -4
- data/spec/lib/dbd/resource/collection_spec.rb +28 -30
- data/spec/lib/dbd/resource/new_spec.rb +10 -11
- data/spec/lib/dbd/resource/test_factories_spec.rb +8 -7
- data/spec/lib/dbd/version/version_spec.rb +9 -0
- data/spec/test_factories/context.rb +16 -0
- data/spec/test_factories/{provenance_fact.rb → context_fact.rb} +6 -6
- data/spec/test_factories/fact.rb +23 -23
- data/spec/test_factories/fact/subject.rb +1 -1
- data/spec/test_factories/graph.rb +7 -7
- data/spec/test_factories/resource.rb +15 -10
- metadata +20 -16
- data/lib/dbd/provenance_fact.rb +0 -77
- data/lib/dbd/provenance_resource.rb +0 -63
- data/spec/lib/dbd/provenance_fact/methods_spec.rb +0 -78
- data/spec/lib/dbd/provenance_fact/new_spec.rb +0 -51
- data/spec/lib/dbd/provenance_fact/test_factories_spec.rb +0 -24
- data/spec/lib/dbd/provenance_resource/provenance_resource_spec.rb +0 -75
- data/spec/test_factories/provenance_resource.rb +0 -16
data/lib/dbd/fact/collection.rb
CHANGED
@@ -9,7 +9,7 @@ module Dbd
|
|
9
9
|
def initialize
|
10
10
|
super
|
11
11
|
@hash_by_subject = Hash.new { |h, k| h[k] = [] }
|
12
|
-
@
|
12
|
+
@used_context_subjects = {}
|
13
13
|
end
|
14
14
|
|
15
15
|
def newest_time_stamp
|
@@ -33,20 +33,20 @@ module Dbd
|
|
33
33
|
#
|
34
34
|
# Validates that added fact is newer.
|
35
35
|
#
|
36
|
-
# Validates that subject was never used as
|
36
|
+
# Validates that subject was never used as context_subject [A].
|
37
37
|
#
|
38
38
|
# Adds the fact and return the index in the collection.
|
39
39
|
#
|
40
40
|
# Store this index in the hash_by_subject.
|
41
41
|
#
|
42
|
-
# Mark the fact in the list of used
|
42
|
+
# Mark the fact in the list of used context_subjects (for [A]).
|
43
43
|
def <<(fact)
|
44
44
|
raise FactError, "#{fact.errors.join(', ')}." unless fact.errors.empty?
|
45
45
|
raise OutOfOrderError if (self.newest_time_stamp && fact.time_stamp <= self.newest_time_stamp)
|
46
|
-
raise OutOfOrderError if (@
|
46
|
+
raise OutOfOrderError if (@used_context_subjects[fact.subject])
|
47
47
|
index = Helpers::OrderedSetCollection.add_and_return_index(fact, @internal_collection)
|
48
48
|
@hash_by_subject[fact.subject] << index
|
49
|
-
fact.
|
49
|
+
fact.update_used_context_subjects(@used_context_subjects)
|
50
50
|
self
|
51
51
|
end
|
52
52
|
|
data/lib/dbd/fact/factory.rb
CHANGED
@@ -23,11 +23,11 @@ module Dbd
|
|
23
23
|
end
|
24
24
|
|
25
25
|
##
|
26
|
-
# Constructs a Fact or
|
26
|
+
# Constructs a Fact or ContextFact from a string values array
|
27
27
|
# (e.g. pulled from a CSV row).
|
28
28
|
#
|
29
29
|
# @param [Array] string_values Required : the array with values, organized as in attributes
|
30
|
-
# @return [Fact,
|
30
|
+
# @return [Fact, Context] the constructed fact
|
31
31
|
def from_string_values(string_values, options={})
|
32
32
|
string_hash = string_hash_from_values(string_values)
|
33
33
|
validate_string_hash(string_hash) if options[:validate]
|
@@ -39,7 +39,7 @@ module Dbd
|
|
39
39
|
{
|
40
40
|
id: [true, Fact::ID.valid_regexp],
|
41
41
|
time_stamp: [true, TimeStamp.valid_regexp],
|
42
|
-
|
42
|
+
context_subject: [false, Fact::Subject.valid_regexp],
|
43
43
|
subject: [true, Fact::Subject.valid_regexp],
|
44
44
|
predicate: [true, /./],
|
45
45
|
object: [true, /./]
|
@@ -50,7 +50,7 @@ module Dbd
|
|
50
50
|
|
51
51
|
def string_hash_from_values(string_values)
|
52
52
|
attributes_strings_array = [top_class.attributes, string_values].transpose
|
53
|
-
# Remove empty values (e.g. the
|
53
|
+
# Remove empty values (e.g. the context_subject for a ContextFact).
|
54
54
|
attributes_strings_array.delete_if{|a,v| v.nil? || v == ''}
|
55
55
|
Hash[attributes_strings_array]
|
56
56
|
end
|
@@ -62,10 +62,10 @@ module Dbd
|
|
62
62
|
end
|
63
63
|
|
64
64
|
def fact_from_values_hash(values_hash)
|
65
|
-
if values_hash[:
|
65
|
+
if values_hash[:context_subject]
|
66
66
|
Fact.new(values_hash)
|
67
67
|
else
|
68
|
-
|
68
|
+
ContextFact.new(values_hash)
|
69
69
|
end
|
70
70
|
end
|
71
71
|
|
data/lib/dbd/graph.rb
CHANGED
@@ -3,7 +3,7 @@ require 'csv'
|
|
3
3
|
module Dbd
|
4
4
|
|
5
5
|
##
|
6
|
-
# The Graph stores the Facts and
|
6
|
+
# The Graph stores the Facts and Contexts in an in-memory
|
7
7
|
# collection structure.
|
8
8
|
#
|
9
9
|
# On the other hand, it acts as an "interface" that can be
|
@@ -40,7 +40,7 @@ module Dbd
|
|
40
40
|
##
|
41
41
|
# Export the graph to a CSV file
|
42
42
|
#
|
43
|
-
# @param [String]
|
43
|
+
# @param [String] filename the filename to stream the CSV to
|
44
44
|
def to_CSV_file(filename)
|
45
45
|
CSV.open(filename, 'w', csv_defaults) do |csv|
|
46
46
|
push_facts(csv)
|
data/lib/dbd/resource.rb
CHANGED
@@ -13,19 +13,19 @@ module Dbd
|
|
13
13
|
# a subject is a random uuid (like a oid), not a meaningful URI
|
14
14
|
# as it is in RDF.
|
15
15
|
#
|
16
|
-
# A
|
17
|
-
# Practically, first a
|
18
|
-
# subject of that will be used as
|
16
|
+
# A context_subject is a required field in the options hash.
|
17
|
+
# Practically, first a Context will be created and the
|
18
|
+
# subject of that will be used as context_subject for the
|
19
19
|
# Resources that are associated with it.
|
20
20
|
#
|
21
|
-
# During build-up of a Fact, the subject and the
|
21
|
+
# During build-up of a Fact, the subject and the context_subject
|
22
22
|
# can be nil. These will then be set when the Fact is added
|
23
23
|
# (with '<<') to a resource.
|
24
24
|
class Resource
|
25
25
|
|
26
26
|
include Helpers::OrderedSetCollection
|
27
27
|
|
28
|
-
attr_reader :subject, :
|
28
|
+
attr_reader :subject, :context_subject
|
29
29
|
|
30
30
|
##
|
31
31
|
# @return [Fact::Subject] a new (random) Resource subject
|
@@ -41,32 +41,33 @@ module Dbd
|
|
41
41
|
# (this is best created with the new_subject class method for forward
|
42
42
|
# compatibility).
|
43
43
|
#
|
44
|
-
# The
|
45
|
-
# taken from an earlier created
|
44
|
+
# The context_subject argument is required. This will typically be
|
45
|
+
# taken from an earlier created Context.
|
46
46
|
#
|
47
47
|
# @param [Hash{Symbol => Object}] options
|
48
|
-
# @option options [Fact::Subject] :
|
48
|
+
# @option options [Fact::Subject] :context_subject (required) the subject of the context for this resource
|
49
49
|
# @option options [Fact::Subject] :subject (new_subject) Optional: the subject for the resource
|
50
50
|
def initialize(options)
|
51
51
|
set_subject(options)
|
52
|
-
|
52
|
+
set_context_subject(options)
|
53
53
|
super()
|
54
54
|
end
|
55
55
|
|
56
56
|
##
|
57
|
-
# Add a Fact (strictly not a
|
57
|
+
# Add a Fact (strictly not a ContextFact)
|
58
58
|
#
|
59
|
-
# Side effects on subject and
|
59
|
+
# Side effects on subject and context_subject:
|
60
60
|
# * if it has no subject, the subject is set (this modifies the fact !)
|
61
61
|
# * if is has the same subject as the resource, added unchanged.
|
62
62
|
# * if it has a different subject, a SubjectError is raised.
|
63
|
-
#
|
64
|
-
# * if
|
65
|
-
# * if
|
63
|
+
#
|
64
|
+
# * if it has no context_subject, the context_subject is set (this modifies the fact !)
|
65
|
+
# * if is has the same context_subject as the resource, added unchanged.
|
66
|
+
# * if it has a different context_subject, a ContextError is raised.
|
66
67
|
def <<(fact)
|
67
|
-
|
68
|
+
assert_fact_or_context_fact(fact)
|
68
69
|
set_fact_subject!(fact)
|
69
|
-
|
70
|
+
set_fact_context_subject!(fact)
|
70
71
|
super(fact)
|
71
72
|
end
|
72
73
|
|
@@ -76,22 +77,22 @@ module Dbd
|
|
76
77
|
@subject = options[:subject] || self.class.new_subject
|
77
78
|
end
|
78
79
|
|
79
|
-
def
|
80
|
-
@
|
81
|
-
raise
|
80
|
+
def set_context_subject(options)
|
81
|
+
@context_subject = options[:context_subject]
|
82
|
+
raise ContextError, "context_subject cannot be nil" if @context_subject.nil?
|
82
83
|
end
|
83
84
|
|
84
85
|
def set_fact_subject!(fact)
|
85
86
|
fact.subject = subject
|
86
87
|
end
|
87
88
|
|
88
|
-
def
|
89
|
-
fact.
|
89
|
+
def set_fact_context_subject!(fact)
|
90
|
+
fact.context_subject = context_subject
|
90
91
|
end
|
91
92
|
|
92
|
-
# Assert _no_
|
93
|
-
def
|
94
|
-
raise ArgumentError, "Trying to add a
|
93
|
+
# Assert _no_ Contexts here
|
94
|
+
def assert_fact_or_context_fact(fact)
|
95
|
+
raise ArgumentError, "Trying to add a ContextFact to a Resource." if fact.context_fact?
|
95
96
|
end
|
96
97
|
|
97
98
|
end
|
data/lib/dbd/version.rb
CHANGED
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Dbd
|
4
|
+
describe Context do
|
5
|
+
|
6
|
+
let(:context) { described_class.new }
|
7
|
+
let(:context_subject) { context.subject }
|
8
|
+
|
9
|
+
describe '.new' do
|
10
|
+
describe 'without a subject argument' do
|
11
|
+
it 'has created a new subject' do
|
12
|
+
context.subject.should be_a(described_class.new_subject.class)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe 'with a subject argument' do
|
17
|
+
it 'has stored the resource_subject' do
|
18
|
+
described_class.new(subject: context_subject).subject.
|
19
|
+
should == context_subject
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe 'with a context_subject argument' do
|
24
|
+
it 'raises an ContextError' do
|
25
|
+
lambda{ described_class.new(context_subject: context_subject) }.
|
26
|
+
should raise_error(ArgumentError)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe 'context_subject' do
|
32
|
+
it 'raises NoMethodError when called' do
|
33
|
+
lambda{ context.context_subject }.should raise_error(NoMethodError)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe 'TestFactories::Context' do
|
38
|
+
it '.context works' do
|
39
|
+
TestFactories::Context.context
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe 'the collection' do
|
44
|
+
|
45
|
+
let(:context_fact_visibility) { TestFactories::ContextFact.visibility } # nil subject
|
46
|
+
let(:context_visibility_with_incorrect_subject) { TestFactories::ContextFact.visibility(TestFactories::ContextFact.new_subject) }
|
47
|
+
let(:context_visibility_with_correct_subject) { TestFactories::ContextFact.visibility(context_subject) }
|
48
|
+
|
49
|
+
describe 'adding context_facts with << ' do
|
50
|
+
it 'with correct subject it works' do
|
51
|
+
context << context_visibility_with_correct_subject
|
52
|
+
context.first.subject.should == context_subject
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'with incorrect subject it raises SetOnceError' do
|
56
|
+
lambda{ context << context_visibility_with_incorrect_subject }.
|
57
|
+
should raise_error(RubyPeterV::SetOnceError),
|
58
|
+
"Value of subject was #{context_visibility_with_incorrect_subject.subject}, " \
|
59
|
+
"trying to set it to #{context.subject}"
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'with nil subject it sets the subject' do
|
63
|
+
context << context_fact_visibility
|
64
|
+
context.first.subject.should == context_subject
|
65
|
+
end
|
66
|
+
|
67
|
+
it 'with nil (=correct) context_subject it is a noop' do
|
68
|
+
context << context_fact_visibility
|
69
|
+
context.first.context_subject.should be_nil
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
|
4
|
+
module Dbd
|
5
|
+
describe ContextFact do
|
6
|
+
|
7
|
+
let(:subject) { described_class.factory.new_subject }
|
8
|
+
|
9
|
+
let(:context_fact_1) do
|
10
|
+
TestFactories::ContextFact.visibility(subject)
|
11
|
+
end
|
12
|
+
|
13
|
+
let(:context_fact_created) do
|
14
|
+
TestFactories::ContextFact.created(subject)
|
15
|
+
end
|
16
|
+
|
17
|
+
describe 'short' do
|
18
|
+
it 'for a context_fact fact shows [ cont ], subj, predicate, object' do
|
19
|
+
context_fact_1.short.should match(/^\[ cont \] : [0-9a-f]{8} : context:visibility : public$/)
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'for a context_fact fact with non string object also works' do
|
23
|
+
context_fact_created.short.should match(/^\[ cont \] : [0-9a-f]{8} : dcterms:created : \d{4}/)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe 'errors' do
|
28
|
+
it 'the factory has no errors' do
|
29
|
+
context_fact_1.errors.should be_empty
|
30
|
+
end
|
31
|
+
|
32
|
+
describe 'with a context_subject' do
|
33
|
+
|
34
|
+
before(:each) do
|
35
|
+
context_fact_1.stub(:context_subject).and_return(subject)
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'errors returns an array with 1 error message' do
|
39
|
+
context_fact_1.errors.single.should match(/ContextFact subject should not be present in ContextFact/)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe 'without subject' do
|
44
|
+
|
45
|
+
before(:each) do
|
46
|
+
context_fact_1.stub(:subject).and_return(nil)
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'errors returns an array with an error message' do
|
50
|
+
context_fact_1.errors.single.should match(/Subject is missing/)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
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
|
+
describe 'attributes and values' do
|
64
|
+
it 'there are 6 attributes' do
|
65
|
+
described_class.attributes.size.should == 6
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'there are 6 values' do
|
69
|
+
context_fact_1.values.size.should == 6
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
describe 'context_fact?' do
|
74
|
+
it 'is true for ContextFact or derived from it' do
|
75
|
+
context_fact_1.context_fact?.should be_true
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Dbd
|
4
|
+
describe ContextFact do
|
5
|
+
|
6
|
+
let(:subject) { described_class.factory.new_subject }
|
7
|
+
let(:id_class) { described_class.factory.new_id.class }
|
8
|
+
|
9
|
+
let(:context_fact_1) do
|
10
|
+
TestFactories::ContextFact.visibility(subject)
|
11
|
+
end
|
12
|
+
|
13
|
+
let(:context_fact_2) do
|
14
|
+
TestFactories::ContextFact.created_by(subject)
|
15
|
+
end
|
16
|
+
|
17
|
+
describe '#new' do
|
18
|
+
it 'has a unique id (new_id.class)' do
|
19
|
+
context_fact_1.id.should be_a(id_class)
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'two context_facts have different id' do
|
23
|
+
context_fact_1.id.should_not == context_fact_2.id
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'has nil context_subject' do
|
27
|
+
context_fact_1.context_subject.should be_nil
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'has correct subject' do
|
31
|
+
context_fact_1.subject.should == subject
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'has correct predicate' do
|
35
|
+
context_fact_1.predicate.should == 'context:visibility'
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'has correct object' do
|
39
|
+
context_fact_1.object.should == 'public'
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'raises a ContextError when context_subject is present in options hash' do
|
43
|
+
lambda { described_class.new(
|
44
|
+
context_subject: subject,
|
45
|
+
predicate: 'test',
|
46
|
+
object: 'test') } .
|
47
|
+
should raise_error ContextError
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module TestFactories
|
4
|
+
describe ContextFact do
|
5
|
+
|
6
|
+
describe 'TestFactories do not fail' do
|
7
|
+
it 'TestFactories::ContextFact.visibility is OK' do
|
8
|
+
described_class.visibility.should_not be_nil
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'TestFactories::ContextFact.created_by is OK' do
|
12
|
+
described_class.created_by.should_not be_nil
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'TestFactories::ContextFact.original_source is OK' do
|
16
|
+
described_class.original_source.should_not be_nil
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'TestFactories::ContextFact.new_subject is OK' do
|
20
|
+
described_class.new_subject.should be_a(ContextFact.new_subject.class)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Dbd
|
4
|
+
# TODO move this to dedicated Errors module
|
5
|
+
describe "Errors" do
|
6
|
+
it "OutOfOrderError" do
|
7
|
+
OutOfOrderError
|
8
|
+
end
|
9
|
+
|
10
|
+
it "FactError" do
|
11
|
+
FactError
|
12
|
+
end
|
13
|
+
|
14
|
+
it "ContextError" do
|
15
|
+
ContextError
|
16
|
+
end
|
17
|
+
|
18
|
+
it "SubjectError" do
|
19
|
+
SubjectError
|
20
|
+
end
|
21
|
+
|
22
|
+
it "PredicateError" do
|
23
|
+
PredicateError
|
24
|
+
end
|
25
|
+
|
26
|
+
it "ObjectError" do
|
27
|
+
ObjectError
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|