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.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/Guardfile +0 -1
  3. data/HISTORY.txt +9 -0
  4. data/README.md +47 -39
  5. data/bin/test_1.rb +4 -4
  6. data/bin/test_5.rb +4 -4
  7. data/docs/test.rb +11 -11
  8. data/lib/dbd.rb +2 -2
  9. data/lib/dbd/context.rb +65 -0
  10. data/lib/dbd/context_fact.rb +76 -0
  11. data/lib/dbd/errors.rb +1 -1
  12. data/lib/dbd/fact.rb +37 -37
  13. data/lib/dbd/fact/collection.rb +5 -5
  14. data/lib/dbd/fact/factory.rb +6 -6
  15. data/lib/dbd/graph.rb +2 -2
  16. data/lib/dbd/resource.rb +25 -24
  17. data/lib/dbd/version.rb +1 -1
  18. data/spec/lib/dbd/context/context_spec.rb +74 -0
  19. data/spec/lib/dbd/context_fact/methods_spec.rb +79 -0
  20. data/spec/lib/dbd/context_fact/new_spec.rb +51 -0
  21. data/spec/lib/dbd/context_fact/test_factories_spec.rb +24 -0
  22. data/spec/lib/dbd/errors/errors_spec.rb +30 -0
  23. data/spec/lib/dbd/fact/collection/collection_spec.rb +58 -58
  24. data/spec/lib/dbd/fact/factory/factory_spec.rb +3 -3
  25. data/spec/lib/dbd/fact/methods_spec.rb +12 -12
  26. data/spec/lib/dbd/fact/new_spec.rb +9 -9
  27. data/spec/lib/dbd/fact/subject/test_factories_spec.rb +4 -4
  28. data/spec/lib/dbd/fact/test_factories_spec.rb +18 -18
  29. data/spec/lib/dbd/graph/add_to_graph_spec.rb +22 -22
  30. data/spec/lib/dbd/graph/from_csv_spec.rb +16 -16
  31. data/spec/lib/dbd/graph/test_factories_spec.rb +11 -11
  32. data/spec/lib/dbd/graph/to_csv_spec.rb +18 -18
  33. data/spec/lib/dbd/performance_spec.rb +4 -4
  34. data/spec/lib/dbd/resource/collection_spec.rb +28 -30
  35. data/spec/lib/dbd/resource/new_spec.rb +10 -11
  36. data/spec/lib/dbd/resource/test_factories_spec.rb +8 -7
  37. data/spec/lib/dbd/version/version_spec.rb +9 -0
  38. data/spec/test_factories/context.rb +16 -0
  39. data/spec/test_factories/{provenance_fact.rb → context_fact.rb} +6 -6
  40. data/spec/test_factories/fact.rb +23 -23
  41. data/spec/test_factories/fact/subject.rb +1 -1
  42. data/spec/test_factories/graph.rb +7 -7
  43. data/spec/test_factories/resource.rb +15 -10
  44. metadata +20 -16
  45. data/lib/dbd/provenance_fact.rb +0 -77
  46. data/lib/dbd/provenance_resource.rb +0 -63
  47. data/spec/lib/dbd/provenance_fact/methods_spec.rb +0 -78
  48. data/spec/lib/dbd/provenance_fact/new_spec.rb +0 -51
  49. data/spec/lib/dbd/provenance_fact/test_factories_spec.rb +0 -24
  50. data/spec/lib/dbd/provenance_resource/provenance_resource_spec.rb +0 -75
  51. data/spec/test_factories/provenance_resource.rb +0 -16
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4738e212a553b87a79d494de3a1825690de3af64
4
- data.tar.gz: f511eb469bd7d3705bb921bab74fa107e9852de5
3
+ metadata.gz: 49a3db0e5342a8c507f107cad3afd4ae3e21964c
4
+ data.tar.gz: 0118bb6bddcdc103577080f5deddc42ff3d2d5d8
5
5
  SHA512:
6
- metadata.gz: 8b25ea06edaed016cb0826836b8dbc3555df29ffece9f2ad534d00fb02bc6564c407ddbd5a01761fd843d516a0e29a3f6d2e0ea91f7e4529925bded33684494a
7
- data.tar.gz: 11c13f6dcde106d7d67018b6f07791b42165d62a605c9f3aee08c8483ead0f9b4ff6090252c19390629380e1fbdd159d95861e28ec4da6401992351aa9e10d4a
6
+ metadata.gz: 04d8a0525f3acf92a9203d63a846c829922f4363a65f7b1cfe900794f2a2ba0725de11a8a6cf330c3b6308a30e031c37d37052180c61adf99c8ab74d7b0a92f2
7
+ data.tar.gz: 03087f0151bbbe1d1b8c7f7e6a9dd090122136d597453459a8ee96e082f741c9bf4d86970255bc40f93bdd317ab9a1a113d2b2f940b9358ebec5bff11bffae9b
data/Guardfile CHANGED
@@ -2,7 +2,6 @@ guard 'rspec', :all_after_pass => true, :all_on_start => true do
2
2
  watch(%r{^spec/.+_spec\.rb$})
3
3
  watch(%r{^spec/test_factories}) { "spec" }
4
4
  watch(%r{^lib/dbd/helpers}) { "spec" }
5
- # watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
6
5
  watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}/" }
7
6
  watch('spec/spec_helper.rb') { "spec" }
8
7
  watch('lib/dbd.rb') { "spec" }
@@ -67,3 +67,12 @@
67
67
 
68
68
  * object in Fact#short now truncated to 80 bytes
69
69
  * using a utf-8 safe truncation (from ruby_peter_v)
70
+
71
+ 0.0.12 (10 July 2013)
72
+ ======
73
+
74
+ * major renaming
75
+ * ProvenanceFact => ContextFact
76
+ * ProvenanceResource => Context
77
+ * because the context of a fact is much more than the provenance
78
+ (also visibility, encryption, license, ...)
data/README.md CHANGED
@@ -9,6 +9,7 @@ This is facts based data store, inspired by [RDF] concepts, but adding a log bas
9
9
 
10
10
  [![Gem Version](https://badge.fury.io/rb/dbd.png)](http://badge.fury.io/rb/dbd)
11
11
  [![Build Status](https://travis-ci.org/petervandenabeele/dbd.png?branch=master)](http://travis-ci.org/petervandenabeele/dbd)
12
+ [![Code Climate](https://codeclimate.com/github/petervandenabeele/dbd.png)](https://codeclimate.com/github/petervandenabeele/dbd)
12
13
 
13
14
  ## Features
14
15
 
@@ -23,13 +24,14 @@ This is facts based data store, inspired by [RDF] concepts, but adding a log bas
23
24
  must remove this fact and replace the back-up
24
25
  * since one single back-up file suffices, replacing the *single* back-up
25
26
  file will actually remove the hard deleted fact(s) for good
26
- * Fine grained Provenance
27
- * Each base Fact points to a ProvenanceResource, so separate provenance
28
- possible for different facts about 1 resource
27
+ * Fine grained context (including provenance)
28
+ * Each base Fact points to a Context, so separate context and
29
+ provenance is possible per fact (e.g. different properties about the same
30
+ resource can come from different sources, different visibility etc.)
29
31
  * can keep the original_source reference, creator, date, …
30
32
  * can have a context that allows filtering data (e.g. private, professional, …)
31
33
  * separate encryption schemes per context are possible
32
- * ProvenanceResource is flexible, since built itself from Facts
34
+ * Context is flexible, since built itself from Facts
33
35
  * Schemaless
34
36
  * uses the [RDF] (subject, predicate, object) concepts
35
37
  * predicates, types can be defined in an ontology for declaring meaning
@@ -50,18 +52,24 @@ Open Source [MIT]
50
52
 
51
53
  Running `ruby docs/test.rb` will execute the script below.
52
54
 
55
+ * Facts are logically grouped (by subject) in a Resource
56
+ * ContextFacts are logically grouped (by subject) in a Context
57
+ * each Fact refers to a Context with its context_subject
58
+ * all Facts and ContextFacts are stored sequentially and immutably
59
+ in a Graph
60
+
53
61
  ```
54
62
  require 'dbd'
55
63
 
56
- provenance = Dbd::ProvenanceResource.new
64
+ context = Dbd::Context.new
57
65
 
58
- provenance << Dbd::ProvenanceFact.new(predicate: "prov:context", object: "public")
59
- provenance << Dbd::ProvenanceFact.new(predicate: "prov:source", object: "http://github.com/petervandenabeele/dbd")
60
- provenance << Dbd::ProvenanceFact.new(predicate: "dcterms:creator", object: "@peter_v")
61
- provenance << Dbd::ProvenanceFact.new(predicate: "dcterms:created", object: Time.now.utc)
62
- provenance << Dbd::ProvenanceFact.new(predicate: "prov:license", object: "MIT")
66
+ context << Dbd::ContextFact.new(predicate: "prov:context_fact", object: "public")
67
+ context << Dbd::ContextFact.new(predicate: "prov:source", object: "http://github.com/petervandenabeele/dbd")
68
+ context << Dbd::ContextFact.new(predicate: "dcterms:creator", object: "@peter_v")
69
+ context << Dbd::ContextFact.new(predicate: "dcterms:created", object: Time.now.utc)
70
+ context << Dbd::ContextFact.new(predicate: "prov:license", object: "MIT")
63
71
 
64
- nobel_peace_2012 = Dbd::Resource.new(provenance_subject: provenance.subject)
72
+ nobel_peace_2012 = Dbd::Resource.new(context_subject: context.subject)
65
73
 
66
74
  nobel_peace_2012 << Dbd::Fact.new(predicate: "todo:nobelPeacePriceWinner", object: "2012")
67
75
  nobel_peace_2012 << Dbd::Fact.new(predicate: "rdfs:label", object: "EU") # this will use some RDF predicates in future
@@ -70,21 +78,21 @@ nobel_peace_2012 << Dbd::Fact.new(predicate: "todo:story", object: "A long perio
70
78
 
71
79
  graph = Dbd::Graph.new
72
80
 
73
- graph << provenance << nobel_peace_2012
81
+ graph << context << nobel_peace_2012
74
82
 
75
83
  puts "facts in short representation:"
76
84
  puts graph.map(&:short)
77
85
 
78
86
  # facts in short representation:
79
- # [ prov ] : 5eb1ea27 : prov:context : public
80
- # [ prov ] : 5eb1ea27 : prov:source : http://github.com/petervandenabeele/dbd
81
- # [ prov ] : 5eb1ea27 : dcterms:creator : @peter_v
82
- # [ prov ] : 5eb1ea27 : dcterms:created : 2013-06-19 22:02:20 UTC
83
- # [ prov ] : 5eb1ea27 : prov:license : MIT
84
- # 5eb1ea27 : 3767c493 : todo:nobelPeacePriceWinn : 2012
85
- # 5eb1ea27 : 3767c493 : rdfs:label : EU
86
- # 5eb1ea27 : 3767c493 : rdfs:comment : European Union
87
- # 5eb1ea27 : 3767c493 : todo:story : A long period of peace,_ that is a "bliss".
87
+ # [ cont ] : 7d0ccaa8 : prov:context_fact : public
88
+ # [ cont ] : 7d0ccaa8 : prov:source : http://github.com/petervandenabeele/dbd
89
+ # [ cont ] : 7d0ccaa8 : dcterms:creator : @peter_v
90
+ # [ cont ] : 7d0ccaa8 : dcterms:created : 2013-07-10 21:34:32 UTC
91
+ # [ cont ] : 7d0ccaa8 : prov:license : MIT
92
+ # 7d0ccaa8 : 47acd35d : todo:nobelPeacePriceWinn : 2012
93
+ # 7d0ccaa8 : 47acd35d : rdfs:label : EU
94
+ # 7d0ccaa8 : 47acd35d : rdfs:comment : European Union
95
+ # 7d0ccaa8 : 47acd35d : todo:story : A long period of peace,_ that is a "bliss".
88
96
 
89
97
  csv = graph.to_CSV
90
98
 
@@ -92,30 +100,30 @@ puts "facts in full detail in CSV:"
92
100
  puts csv
93
101
 
94
102
  # facts in full detail in CSV:
95
- # "4720034a-01ea-4b6b-b9aa-45cb8c7c5e64","2013-06-19 22:02:20.489834224 UTC","","5eb1ea27-6691-4a57-ab13-8a59021968e1","prov:context","public"
96
- # "d05a0a6c-a003-4320-b52b-a6e49e854437","2013-06-19 22:02:20.489889896 UTC","","5eb1ea27-6691-4a57-ab13-8a59021968e1","prov:source","http://github.com/petervandenabeele/dbd"
97
- # "fc47abbd-da2d-4562-bb6b-ed8b84005734","2013-06-19 22:02:20.489913758 UTC","","5eb1ea27-6691-4a57-ab13-8a59021968e1","dcterms:creator","@peter_v"
98
- # "f240e975-5d39-41eb-bb5a-cc59ede4c1a6","2013-06-19 22:02:20.489932320 UTC","","5eb1ea27-6691-4a57-ab13-8a59021968e1","dcterms:created","2013-06-19 22:02:20 UTC"
99
- # "d592b1e8-2910-4329-b502-7d960cebb399","2013-06-19 22:02:20.489950713 UTC","","5eb1ea27-6691-4a57-ab13-8a59021968e1","prov:license","MIT"
100
- # "a2d55e46-03f2-470e-8347-c36b31e7facc","2013-06-19 22:02:20.489973271 UTC","5eb1ea27-6691-4a57-ab13-8a59021968e1","3767c493-79d3-4a97-a832-79e6361ddc4c","todo:nobelPeacePriceWinner","2012"
101
- # "0766dd24-70e5-487d-a018-d58da75dcdad","2013-06-19 22:02:20.489996422 UTC","5eb1ea27-6691-4a57-ab13-8a59021968e1","3767c493-79d3-4a97-a832-79e6361ddc4c","rdfs:label","EU"
102
- # "eda61baa-b331-462e-b7b5-5d6eb2e9a053","2013-06-19 22:02:20.490014676 UTC","5eb1ea27-6691-4a57-ab13-8a59021968e1","3767c493-79d3-4a97-a832-79e6361ddc4c","rdfs:comment","European Union"
103
- # "a3da9295-b43a-4c3a-8e8c-97c3f04c1fa3","2013-06-19 22:02:20.490036790 UTC","5eb1ea27-6691-4a57-ab13-8a59021968e1","3767c493-79d3-4a97-a832-79e6361ddc4c","todo:story","A long period of peace,
103
+ # "be44bc07-0c0e-450b-8bbc-4cc1f472be33","2013-07-10 21:34:32.759424573 UTC","","7d0ccaa8-b641-4f1b-82ad-f36ba3757aa0","prov:context_fact","public"
104
+ # "dae577a3-f210-4aab-9079-d87a4a362bd5","2013-07-10 21:34:32.759475097 UTC","","7d0ccaa8-b641-4f1b-82ad-f36ba3757aa0","prov:source","http://github.com/petervandenabeele/dbd"
105
+ # "750904f8-c052-46af-8b0a-266a701a6e06","2013-07-10 21:34:32.759497534 UTC","","7d0ccaa8-b641-4f1b-82ad-f36ba3757aa0","dcterms:creator","@peter_v"
106
+ # "a62ff09f-76a5-42ab-be9a-fc66c727ba41","2013-07-10 21:34:32.759513249 UTC","","7d0ccaa8-b641-4f1b-82ad-f36ba3757aa0","dcterms:created","2013-07-10 21:34:32 UTC"
107
+ # "427f9dc3-0544-4f33-9b30-ffa32930f5a8","2013-07-10 21:34:32.759528346 UTC","","7d0ccaa8-b641-4f1b-82ad-f36ba3757aa0","prov:license","MIT"
108
+ # "a8dbdfe6-6ead-4a35-bb6e-ec3f233aed5b","2013-07-10 21:34:32.759546366 UTC","7d0ccaa8-b641-4f1b-82ad-f36ba3757aa0","47acd35d-f2b1-4b36-8a37-90b0f08217d5","todo:nobelPeacePriceWinner","2012"
109
+ # "186571ac-1eca-4621-8b7e-9f263550e27b","2013-07-10 21:34:32.759564395 UTC","7d0ccaa8-b641-4f1b-82ad-f36ba3757aa0","47acd35d-f2b1-4b36-8a37-90b0f08217d5","rdfs:label","EU"
110
+ # "5a58d782-59bc-4ac0-b410-7ac637572f74","2013-07-10 21:34:32.759579688 UTC","7d0ccaa8-b641-4f1b-82ad-f36ba3757aa0","47acd35d-f2b1-4b36-8a37-90b0f08217d5","rdfs:comment","European Union"
111
+ # "2c3e9e63-fd94-4c0f-ac39-7a85b4dbb20d","2013-07-10 21:34:32.759594496 UTC","7d0ccaa8-b641-4f1b-82ad-f36ba3757aa0","47acd35d-f2b1-4b36-8a37-90b0f08217d5","todo:story","A long period of peace,
104
112
  # that is a ""bliss""."
105
113
 
106
114
  imported_graph = Dbd::Graph.new.from_CSV(csv)
107
115
 
108
116
  puts imported_graph.map(&:short)
109
117
 
110
- # [ prov ] : 5eb1ea27 : prov:context : public
111
- # [ prov ] : 5eb1ea27 : prov:source : http://github.com/petervandenabeele/dbd
112
- # [ prov ] : 5eb1ea27 : dcterms:creator : @peter_v
113
- # [ prov ] : 5eb1ea27 : dcterms:created : 2013-06-19 22:02:20 UTC
114
- # [ prov ] : 5eb1ea27 : prov:license : MIT
115
- # 5eb1ea27 : 3767c493 : todo:nobelPeacePriceWinn : 2012
116
- # 5eb1ea27 : 3767c493 : rdfs:label : EU
117
- # 5eb1ea27 : 3767c493 : rdfs:comment : European Union
118
- # 5eb1ea27 : 3767c493 : todo:story : A long period of peace,_ that is a "bliss".
118
+ # [ cont ] : 7d0ccaa8 : prov:context_fact : public
119
+ # [ cont ] : 7d0ccaa8 : prov:source : http://github.com/petervandenabeele/dbd
120
+ # [ cont ] : 7d0ccaa8 : dcterms:creator : @peter_v
121
+ # [ cont ] : 7d0ccaa8 : dcterms:created : 2013-07-10 21:34:32 UTC
122
+ # [ cont ] : 7d0ccaa8 : prov:license : MIT
123
+ # 7d0ccaa8 : 47acd35d : todo:nobelPeacePriceWinn : 2012
124
+ # 7d0ccaa8 : 47acd35d : rdfs:label : EU
125
+ # 7d0ccaa8 : 47acd35d : rdfs:comment : European Union
126
+ # 7d0ccaa8 : 47acd35d : todo:story : A long period of peace,_ that is a "bliss".
119
127
  ```
120
128
 
121
129
  ## Performance tests on 10 M facts
@@ -18,16 +18,16 @@ unless filename
18
18
  end
19
19
 
20
20
  require 'dbd'
21
- provenance_resource = Dbd::ProvenanceResource.new
22
- provenance_resource << Dbd::ProvenanceFact.new(predicate: "prov:test" , object: "A" * 10)
21
+ context = Dbd::Context.new
22
+ context << Dbd::ContextFact.new(predicate: "prov:test" , object: "A" * 10)
23
23
 
24
- resource = Dbd::Resource.new(provenance_subject: provenance_resource.subject)
24
+ resource = Dbd::Resource.new(context_subject: context.subject)
25
25
  (0...count).each do |i|
26
26
  resource << Dbd::Fact.new(predicate: "test", object: "#{'B' * 80} #{i}")
27
27
  end
28
28
 
29
29
  graph = Dbd::Graph.new
30
- graph << provenance_resource << resource
30
+ graph << context << resource
31
31
 
32
32
  File.open(filename, 'w') do |f|
33
33
  f << graph.to_CSV
@@ -23,15 +23,15 @@ start = Time.now
23
23
  graph = Dbd::Graph.new
24
24
 
25
25
  (0...count).each do |i|
26
- provenance_resource = Dbd::ProvenanceResource.new
27
- provenance_resource << Dbd::ProvenanceFact.new(predicate: "prov:test" , object: "A" * 10)
26
+ context = Dbd::Context.new
27
+ context << Dbd::ContextFact.new(predicate: "prov:test" , object: "A" * 10)
28
28
 
29
- resource = Dbd::Resource.new(provenance_subject: provenance_resource.subject)
29
+ resource = Dbd::Resource.new(context_subject: context.subject)
30
30
  (0...FACTS_PER_RESOURCE).each do |j|
31
31
  resource << Dbd::Fact.new(predicate: "test", object: "#{'B' * 80} #{i * FACTS_PER_RESOURCE + j}")
32
32
  end
33
33
 
34
- graph << provenance_resource << resource
34
+ graph << context << resource
35
35
  puts ("added resource #{i} to the graph")
36
36
  end
37
37
 
@@ -1,14 +1,14 @@
1
1
  require 'dbd'
2
2
 
3
- provenance = Dbd::ProvenanceResource.new
3
+ context = Dbd::Context.new
4
4
 
5
- provenance << Dbd::ProvenanceFact.new(predicate: "prov:context", object: "public")
6
- provenance << Dbd::ProvenanceFact.new(predicate: "prov:source", object: "http://github.com/petervandenabeele/dbd")
7
- provenance << Dbd::ProvenanceFact.new(predicate: "dcterms:creator", object: "@peter_v")
8
- provenance << Dbd::ProvenanceFact.new(predicate: "dcterms:created", object: Time.now.utc)
9
- provenance << Dbd::ProvenanceFact.new(predicate: "prov:license", object: "MIT")
5
+ context << Dbd::ContextFact.new(predicate: "prov:context_fact", object: "public")
6
+ context << Dbd::ContextFact.new(predicate: "prov:source", object: "http://github.com/petervandenabeele/dbd")
7
+ context << Dbd::ContextFact.new(predicate: "dcterms:creator", object: "@peter_v")
8
+ context << Dbd::ContextFact.new(predicate: "dcterms:created", object: Time.now.utc)
9
+ context << Dbd::ContextFact.new(predicate: "prov:license", object: "MIT")
10
10
 
11
- nobel_peace_2012 = Dbd::Resource.new(provenance_subject: provenance.subject)
11
+ nobel_peace_2012 = Dbd::Resource.new(context_subject: context.subject)
12
12
 
13
13
  nobel_peace_2012 << Dbd::Fact.new(predicate: "todo:nobelPeacePriceWinner", object: "2012")
14
14
  nobel_peace_2012 << Dbd::Fact.new(predicate: "rdfs:label", object: "EU") # this will use some RDF predicates in future
@@ -17,13 +17,13 @@ nobel_peace_2012 << Dbd::Fact.new(predicate: "todo:story", object: "A long perio
17
17
 
18
18
  graph = Dbd::Graph.new
19
19
 
20
- graph << provenance << nobel_peace_2012
20
+ graph << context << nobel_peace_2012
21
21
 
22
22
  puts "facts in short representation:"
23
23
  puts graph.map(&:short)
24
24
 
25
25
  # facts in short representation:
26
- # [ prov ] : 5eb1ea27 : prov:context : public
26
+ # [ prov ] : 5eb1ea27 : prov:context_fact : public
27
27
  # [ prov ] : 5eb1ea27 : prov:source : http://github.com/petervandenabeele/dbd
28
28
  # [ prov ] : 5eb1ea27 : dcterms:creator : @peter_v
29
29
  # [ prov ] : 5eb1ea27 : dcterms:created : 2013-06-19 22:02:20 UTC
@@ -39,7 +39,7 @@ puts "facts in full detail in CSV:"
39
39
  puts csv
40
40
 
41
41
  # facts in full detail in CSV:
42
- # "4720034a-01ea-4b6b-b9aa-45cb8c7c5e64","2013-06-19 22:02:20.489834224 UTC","","5eb1ea27-6691-4a57-ab13-8a59021968e1","prov:context","public"
42
+ # "4720034a-01ea-4b6b-b9aa-45cb8c7c5e64","2013-06-19 22:02:20.489834224 UTC","","5eb1ea27-6691-4a57-ab13-8a59021968e1","prov:context_fact","public"
43
43
  # "d05a0a6c-a003-4320-b52b-a6e49e854437","2013-06-19 22:02:20.489889896 UTC","","5eb1ea27-6691-4a57-ab13-8a59021968e1","prov:source","http://github.com/petervandenabeele/dbd"
44
44
  # "fc47abbd-da2d-4562-bb6b-ed8b84005734","2013-06-19 22:02:20.489913758 UTC","","5eb1ea27-6691-4a57-ab13-8a59021968e1","dcterms:creator","@peter_v"
45
45
  # "f240e975-5d39-41eb-bb5a-cc59ede4c1a6","2013-06-19 22:02:20.489932320 UTC","","5eb1ea27-6691-4a57-ab13-8a59021968e1","dcterms:created","2013-06-19 22:02:20 UTC"
@@ -54,7 +54,7 @@ imported_graph = Dbd::Graph.new.from_CSV(csv)
54
54
 
55
55
  puts imported_graph.map(&:short)
56
56
 
57
- # [ prov ] : 5eb1ea27 : prov:context : public
57
+ # [ prov ] : 5eb1ea27 : prov:context_fact : public
58
58
  # [ prov ] : 5eb1ea27 : prov:source : http://github.com/petervandenabeele/dbd
59
59
  # [ prov ] : 5eb1ea27 : dcterms:creator : @peter_v
60
60
  # [ prov ] : 5eb1ea27 : dcterms:created : 2013-06-19 22:02:20 UTC
data/lib/dbd.rb CHANGED
@@ -5,9 +5,9 @@ require 'dbd/version'
5
5
  require 'dbd/errors'
6
6
  require 'dbd/time_stamp'
7
7
  require 'dbd/fact'
8
- require 'dbd/provenance_fact'
8
+ require 'dbd/context_fact'
9
9
  require 'dbd/resource'
10
- require 'dbd/provenance_resource'
10
+ require 'dbd/context'
11
11
  require 'dbd/graph'
12
12
 
13
13
  require 'dbd/rdf_base'
@@ -0,0 +1,65 @@
1
+ module Dbd
2
+ ##
3
+ # A Context is derived from a Resource, and is the
4
+ # set of all Contexts that share the same subject.
5
+ #
6
+ # It is pointed to by a context_subject of a Fact and has
7
+ # no context_subject itself (the context_subject
8
+ # relationship from Fact to ContextFact is not recursive).
9
+ class Context < Resource
10
+
11
+ ##
12
+ # Build a new Context.
13
+ #
14
+ # The subject can be either given as an argument or a new (random)
15
+ # subject is automatically set (see Resource for details).
16
+ #
17
+ # A context_subject may not be given here.
18
+ # @option options [Fact::Subject] :subject (new_subject) Optional: the subject for the resource
19
+ def initialize(options = {})
20
+ super
21
+ end
22
+
23
+ ##
24
+ # Add a ContextFact (strictly only a ContextFact).
25
+ #
26
+ # Side effect on the context_fact argument:
27
+ # * if it has no subject, the subject is set in the context_fact
28
+ # * if is has the same subject as the resource, added unchanged.
29
+ # * if it has a different subject, a SubjectError is raised.
30
+ def <<(context_fact)
31
+ super
32
+ end
33
+
34
+ private
35
+
36
+ # Should not be called in Context subclass.
37
+ def context_subject
38
+ raise NoMethodError, "context_subject should not be called in Context."
39
+ end
40
+
41
+ def set_context_subject(options)
42
+ raise ArgumentError, "context_subject must not be in the options" if options[:context_subject]
43
+ end
44
+
45
+ # Validate that context_subject is not present here.
46
+ # This should never raise as the setter was blocked above.
47
+ def validate_context_subject
48
+ raise ContextError if @context_subject
49
+ end
50
+
51
+ ##
52
+ # Assert _only_ Contexts here
53
+ def assert_fact_or_context_fact(context_fact)
54
+ raise ArgumentError, "Trying to add a non-ContextFact to a Context." unless context_fact.context_fact?
55
+ end
56
+
57
+ ##
58
+ # A noop for Context.
59
+ # @param [ContextFact] context_fact
60
+ def set_fact_context_subject!(context_fact)
61
+ # Do nothing
62
+ end
63
+
64
+ end
65
+ end
@@ -0,0 +1,76 @@
1
+ module Dbd
2
+
3
+ ##
4
+ # ContextFact
5
+ #
6
+ # ContextFact is derived from Fact and behaves very similar.
7
+ #
8
+ # The ContextFacts with same subject form a Context and
9
+ # this is used as the target for the context_subject of a Fact.
10
+ #
11
+ # The context_subject of a ContextFact itself is empty, so the
12
+ # usage of context_subject is not recursive on this level (this
13
+ # allows efficient single pass loading in an underlying database).
14
+ #
15
+ # In the serialisation of a fact stream, the presence or absence of a
16
+ # context_subject marks the difference between a Fact and a ContextFact.
17
+ #
18
+ # The predicates of the ContextFacts in a Context would
19
+ # typically come from a defined context ontology (including provenance).
20
+ # Experimental examples of ontologies are built in the dbd_onto project.
21
+ class ContextFact < Fact
22
+
23
+ ##
24
+ # Builds a new ContextFact.
25
+ #
26
+ # @param [Hash{Symbol => Object}] options
27
+ # @option options [Fact::Subject] :subject (new_subject) Optional: the subject for the ContextFact
28
+ # @option options [String] :predicate Required: the subject for the ContextFact
29
+ # @option options [String] :object Required: the object for the ContextFact
30
+ def initialize(options)
31
+ validate_context_subject(options)
32
+ super
33
+ end
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
+ ##
45
+ # Validates the presence or absence of context_subject.
46
+ #
47
+ # Here, in the derived ContextFact, it must not be present.
48
+ # @param [#nil?] context_subject
49
+ # Return [nil, String] nil if valid, an error message if not
50
+ def context_subject_error(context_subject)
51
+ "ContextFact subject should not be present in ContextFact" if context_subject
52
+ end
53
+
54
+ ##
55
+ # Confirms this is a ContextFact
56
+ #
57
+ # Needed for validations that depend on different behavior for
58
+ # a context_fact (mainly, no context_subject).
59
+ def context_fact?
60
+ true
61
+ end
62
+
63
+ private
64
+
65
+ ##
66
+ # Validate that context_subject is not set here.
67
+ def validate_context_subject(options)
68
+ raise ContextError if options[:context_subject]
69
+ end
70
+
71
+ def context_subject_short
72
+ "[ cont ]"
73
+ end
74
+
75
+ end
76
+ end
@@ -3,7 +3,7 @@ module Dbd
3
3
  class OutOfOrderError < StandardError ; end
4
4
  class FactError < StandardError ; end
5
5
 
6
- class ProvenanceError < StandardError ; end
6
+ class ContextError < StandardError ; end
7
7
  class SubjectError < StandardError ; end
8
8
  class PredicateError < StandardError ; end
9
9
  class ObjectError < StandardError ; end
@@ -26,11 +26,11 @@ module Dbd
26
26
  # creation of the fact, but it has to increase in strictly monotic
27
27
  # order in a fact stream.
28
28
  #
29
- # * a *provenance_subject* (a uuid)
29
+ # * a *context_subject* (a uuid)
30
30
  #
31
- # The subject of the ProvenanceResource (a set of ProvenanceFacts with
31
+ # The subject of the Context (a set of Contexts with
32
32
  # the same subject) about this fact. Each Fact, points *back* to a
33
- # ProvenanceResource (the ProvenanceResource must have been fully
33
+ # Context (the Context must have been fully
34
34
  # defined, earlier in a fact stream).
35
35
  #
36
36
  # * a *subject* (a uuid)
@@ -69,7 +69,7 @@ module Dbd
69
69
  def self.attributes
70
70
  [:id,
71
71
  :time_stamp,
72
- :provenance_subject,
72
+ :context_subject,
73
73
  :subject,
74
74
  :predicate,
75
75
  :object]
@@ -88,24 +88,24 @@ module Dbd
88
88
  #
89
89
  # The input class is validated (easy confusion with String or Time).
90
90
  #
91
- # @param [TimeStamp] :time_stamp a time_stamp (not a Time or a String)
91
+ # @param [TimeStamp] time_stamp a time_stamp (not a Time or a String)
92
92
  def time_stamp=(time_stamp)
93
93
  validate_time_stamp_class(time_stamp)
94
94
  set_once(:time_stamp, time_stamp)
95
95
  end
96
96
 
97
97
  ##
98
- # A set_once setter for provenance_subject.
98
+ # A set_once setter for context_subject.
99
99
  #
100
- # @param [String] :provenance_subject a string representation of the uuid
101
- def provenance_subject=(provenance_subject)
102
- set_once(:provenance_subject, provenance_subject)
100
+ # @param [String] context_subject a string representation of the uuid
101
+ def context_subject=(context_subject)
102
+ set_once(:context_subject, context_subject)
103
103
  end
104
104
 
105
105
  ##
106
106
  # A set_once setter for subject.
107
107
  #
108
- # @param [String] :subject a string representation of the uuid
108
+ # @param [String] subject a string representation of the uuid
109
109
  def subject=(subject)
110
110
  set_once(:subject, subject)
111
111
  end
@@ -113,17 +113,17 @@ module Dbd
113
113
  ##
114
114
  # Builds a new Fact.
115
115
  #
116
- # @param [Hash{Symbol => Object}] :options
116
+ # @param [Hash{Symbol => Object}] options
117
117
  # @option options [#to_s] :predicate Required : the predicate for this Fact
118
118
  # @option options [#to_s] :object Required : the object for this Fact (required)
119
- # @option options [String (uuid)] :provenance_subject (nil) Optional: the subject of the provenance(resource|fact)
119
+ # @option options [String (uuid)] :context_subject (nil) Optional: the subject of the Context
120
120
  # @option options [String (uuid)] :subject (nil) Optional: the subject for this Fact
121
121
  # @option options [TimeStamp] :time_stamp (nil) Optional: the time_stamp for this Fact
122
122
  # @option options [String (uuid)] :id Optional : set the id
123
123
  def initialize(options)
124
124
  @id = options[:id] || self.class.factory.new_id
125
125
  @time_stamp = options[:time_stamp]
126
- @provenance_subject = options[:provenance_subject]
126
+ @context_subject = options[:context_subject]
127
127
  @subject = options[:subject]
128
128
  @predicate = options[:predicate]
129
129
  @object = options[:object]
@@ -157,7 +157,7 @@ module Dbd
157
157
  # of a few nanoseconds will be required to resolve collisions
158
158
  # on merge).
159
159
  #
160
- # @param [Fact] :other the other fact to compare with
160
+ # @param [Fact] other the other fact to compare with
161
161
  # @return [trueish]
162
162
  def equivalent?(other)
163
163
  (self.class.attributes - [:time_stamp]).
@@ -168,26 +168,26 @@ module Dbd
168
168
  ##
169
169
  # @return [String] a short string representation of a Fact
170
170
  def short
171
- "#{provenance_subject_short} : " \
171
+ "#{context_subject_short} : " \
172
172
  "#{subject.to_s[0...8]} : " \
173
173
  "#{predicate.to_s.ljust(24, ' ').truncate_utf8(24)} : " \
174
174
  "#{object.to_s.truncate_utf8(80).gsub(/\n/, '_')}"
175
175
  end
176
176
 
177
177
  ##
178
- # Executes the required update in used_provenance_subjects.
178
+ # Executes the required update in used_context_subjects.
179
179
  #
180
- # For a Fact, pointing to a ProvenanceResource in it's provenance_subject,
181
- # marks this provenance_subject in the "used_provenance_subjects" hash that
180
+ # For a Fact, pointing to a Context in it's context_subject,
181
+ # marks this context_subject in the "used_context_subjects" hash that
182
182
  # is passed in as an argument (DCI). This will avoid further changes to the
183
- # ProvenanceResource with this provenance_subject.
183
+ # Context with this context_subject.
184
184
  #
185
- # This is overridden in the ProvenanceFact, since only relevant for a Fact.
185
+ # This is overridden in the ContextFact, since only relevant for a Fact.
186
186
  #
187
- # @param[Hash] :h the hash that contains the provenance_subject index
188
- def update_used_provenance_subjects(h)
189
- # using a provenance_subject sets the key
190
- h[provenance_subject] = true
187
+ # @param[Hash] :h the hash that contains the context_subject index
188
+ def update_used_context_subjects(h)
189
+ # using a context_subject sets the key
190
+ h[context_subject] = true
191
191
  end
192
192
 
193
193
  ##
@@ -199,40 +199,40 @@ module Dbd
199
199
  # * time_stamp not validated, is set automatically later
200
200
  # * predicate not validated, is validated upon creation
201
201
  # * object not validated, is validated upon creation
202
- [provenance_subject_error(provenance_subject),
202
+ [context_subject_error(context_subject),
203
203
  subject ? nil : "Subject is missing"].compact
204
204
  end
205
205
 
206
206
  ##
207
- # Validates the presence or absence of provenance_subject.
207
+ # Validates the presence or absence of context_subject.
208
208
  #
209
- # Here, in (base) Fact, provenance_subject must be present.
209
+ # Here, in (base) Fact, context_subject must be present.
210
210
  #
211
- # In the derived ProvenanceFact it must NOT be present.
211
+ # In the derived ContextFact it must NOT be present.
212
212
  # This is how the difference is encoded between Fact and
213
- # ProvenanceFact in the fact stream.
213
+ # ContextFact in the fact stream.
214
214
  #
215
- # @param [Object] provenance_subject
215
+ # @param [Object] context_subject
216
216
  # Return [nil, String] nil or an error message
217
- def provenance_subject_error(provenance_subject)
218
- "Provenance subject is missing" unless provenance_subject
217
+ def context_subject_error(context_subject)
218
+ "ContextFact subject is missing" unless context_subject
219
219
  end
220
220
 
221
221
  ##
222
- # Confirms this is not a ProvenanceFact.
222
+ # Confirms this is not a ContextFact.
223
223
  #
224
224
  # Needed for validations that depend on different behavior for
225
- # a provenance_fact (mainly, no provenance_subject).
225
+ # a context_fact (mainly, no context_subject).
226
226
  #
227
227
  # @return [trueish] false in the Fact implementation
228
- def provenance_fact?
228
+ def context_fact?
229
229
  false
230
230
  end
231
231
 
232
232
  private
233
233
 
234
- def provenance_subject_short
235
- "#{provenance_subject.to_s[0...8]}"
234
+ def context_subject_short
235
+ "#{context_subject.to_s[0...8]}"
236
236
  end
237
237
 
238
238
  def validate_time_stamp_class(time_stamp)