dbd 0.0.11 → 0.0.12
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/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
|