roadforest 0.1 → 0.5

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 (120) hide show
  1. checksums.yaml +4 -4
  2. data/examples/file-management.rb +12 -13
  3. data/lib/roadforest-client.rb +3 -0
  4. data/lib/roadforest-common.rb +2 -0
  5. data/lib/roadforest-server.rb +7 -0
  6. data/lib/roadforest-testing.rb +1 -0
  7. data/lib/roadforest/application.rb +9 -7
  8. data/lib/roadforest/application/dispatcher.rb +39 -63
  9. data/lib/roadforest/application/parameters.rb +1 -1
  10. data/lib/roadforest/application/path-provider.rb +2 -2
  11. data/lib/roadforest/application/route-adapter.rb +130 -18
  12. data/lib/roadforest/application/services-host.rb +0 -4
  13. data/lib/roadforest/augment/affordance.rb +78 -0
  14. data/lib/roadforest/augment/augmentation.rb +97 -0
  15. data/lib/roadforest/augment/augmenter.rb +54 -0
  16. data/lib/roadforest/augmentations.rb +1 -0
  17. data/lib/roadforest/content-handling.rb +1 -0
  18. data/lib/roadforest/content-handling/common-engines.rb +67 -0
  19. data/lib/roadforest/content-handling/engine.rb +2 -14
  20. data/lib/roadforest/content-handling/handler-wrap.rb +29 -31
  21. data/lib/roadforest/content-handling/media-type.rb +6 -0
  22. data/lib/roadforest/{rdf.rb → graph.rb} +1 -1
  23. data/lib/roadforest/{rdf → graph}/access-manager.rb +12 -74
  24. data/lib/roadforest/{rdf → graph}/document.rb +1 -1
  25. data/lib/roadforest/{rdf → graph}/etagging.rb +2 -2
  26. data/lib/roadforest/{rdf → graph}/focus-list.rb +1 -9
  27. data/lib/roadforest/{rdf → graph}/graph-copier.rb +2 -2
  28. data/lib/roadforest/{rdf → graph}/graph-focus.rb +5 -7
  29. data/lib/roadforest/{rdf → graph}/normalization.rb +1 -1
  30. data/lib/roadforest/{rdf → graph}/post-focus.rb +2 -3
  31. data/lib/roadforest/graph/vocabulary.rb +96 -0
  32. data/lib/roadforest/http/graph-transfer.rb +2 -2
  33. data/lib/roadforest/interface/application.rb +145 -0
  34. data/lib/roadforest/interface/blob.rb +38 -0
  35. data/lib/roadforest/interface/rdf.rb +77 -0
  36. data/lib/roadforest/interfaces.rb +2 -0
  37. data/lib/roadforest/remote-host.rb +17 -17
  38. data/lib/roadforest/resource.rb +4 -0
  39. data/lib/roadforest/resource/{rdf/leaf-item.rb → leaf-item.rb} +1 -1
  40. data/lib/roadforest/resource/{rdf/list.rb → list.rb} +1 -1
  41. data/lib/roadforest/resource/{rdf/parent-item.rb → parent-item.rb} +1 -1
  42. data/lib/roadforest/resource/{rdf/read-only.rb → read-only.rb} +18 -18
  43. data/lib/roadforest/resource/role/has-children.rb +1 -1
  44. data/lib/roadforest/resource/role/writable.rb +2 -2
  45. data/lib/roadforest/server.rb +1 -1
  46. data/lib/roadforest/source-rigor.rb +9 -0
  47. data/lib/roadforest/{rdf/source-rigor → source-rigor}/credence-annealer.rb +2 -2
  48. data/lib/roadforest/{rdf/source-rigor → source-rigor}/credence.rb +5 -5
  49. data/lib/roadforest/{rdf/source-rigor → source-rigor}/credence/any.rb +1 -1
  50. data/lib/roadforest/{rdf/source-rigor → source-rigor}/credence/none-if-role-absent.rb +1 -1
  51. data/lib/roadforest/{rdf/source-rigor → source-rigor}/credence/role-if-available.rb +1 -1
  52. data/lib/roadforest/source-rigor/engine.rb +45 -0
  53. data/lib/roadforest/{rdf → source-rigor}/graph-store.rb +9 -9
  54. data/lib/roadforest/{rdf/source-rigor → source-rigor}/http-investigator.rb +2 -2
  55. data/lib/roadforest/{rdf → source-rigor}/investigation.rb +2 -2
  56. data/lib/roadforest/{rdf/source-rigor → source-rigor}/investigator.rb +3 -3
  57. data/lib/roadforest/{rdf/source-rigor → source-rigor}/null-investigator.rb +3 -2
  58. data/lib/roadforest/{rdf → source-rigor}/parcel.rb +5 -5
  59. data/lib/roadforest/{rdf → source-rigor}/resource-pattern.rb +6 -6
  60. data/lib/roadforest/{rdf → source-rigor}/resource-query.rb +2 -2
  61. data/lib/roadforest/source-rigor/rigorous-access.rb +101 -0
  62. data/lib/roadforest/templates/affordance-doc.haml +23 -0
  63. data/lib/roadforest/templates/affordance-property-values.haml +13 -0
  64. data/lib/roadforest/templates/affordance-subject.haml +9 -0
  65. data/lib/roadforest/templates/affordance-uri-object.haml +2 -0
  66. data/lib/roadforest/templates/base/{property_value.haml → property-value.haml} +0 -0
  67. data/lib/roadforest/templates/base/{property_values.haml → property-values.haml} +0 -0
  68. data/lib/roadforest/templates/distiller/{property_value.haml → property-value.haml} +0 -0
  69. data/lib/roadforest/templates/distiller/{property_values.haml → property-values.haml} +0 -0
  70. data/lib/roadforest/templates/min/{property_values.haml → property-values.haml} +0 -0
  71. data/lib/roadforest/templates/rdfpost-curie.haml +6 -0
  72. data/lib/roadforest/test-support/dispatcher-facade.rb +2 -0
  73. data/lib/roadforest/test-support/matchers.rb +169 -5
  74. data/lib/roadforest/test-support/remote-host.rb +2 -2
  75. data/lib/roadforest/type-handlers/handler.rb +74 -0
  76. data/lib/roadforest/type-handlers/jsonld.rb +34 -0
  77. data/lib/roadforest/type-handlers/rdf-handler.rb +36 -0
  78. data/lib/roadforest/{content-handling/type-handlers → type-handlers}/rdfa-writer.rb +2 -2
  79. data/lib/roadforest/{content-handling/type-handlers → type-handlers}/rdfa-writer/document-environment.rb +9 -8
  80. data/lib/roadforest/type-handlers/rdfa-writer/environment-decorator.rb +312 -0
  81. data/lib/roadforest/{content-handling/type-handlers → type-handlers}/rdfa-writer/object-environment.rb +3 -3
  82. data/lib/roadforest/{content-handling/type-handlers → type-handlers}/rdfa-writer/property-environment.rb +5 -11
  83. data/lib/roadforest/type-handlers/rdfa-writer/render-engine.rb +427 -0
  84. data/lib/roadforest/{content-handling/type-handlers → type-handlers}/rdfa-writer/render-environment.rb +33 -26
  85. data/lib/roadforest/{content-handling/type-handlers → type-handlers}/rdfa-writer/subject-environment.rb +7 -23
  86. data/lib/roadforest/type-handlers/rdfa.rb +73 -0
  87. data/lib/roadforest/type-handlers/rdfpost.rb +301 -0
  88. data/lib/roadforest/utility/class-registry.rb +23 -5
  89. data/spec/.ctrlp-root +0 -0
  90. data/spec/affordance-augmenter.rb +75 -0
  91. data/spec/affordances-flow.rb +438 -0
  92. data/spec/authorization.rb +34 -0
  93. data/spec/client.rb +13 -12
  94. data/spec/credence-annealer.rb +5 -5
  95. data/spec/focus-list.rb +8 -8
  96. data/spec/full-integration.rb +3 -3
  97. data/spec/graph-copier.rb +4 -4
  98. data/spec/graph-store.rb +19 -31
  99. data/spec/keychain.rb +82 -0
  100. data/spec/rdf-normalization.rb +2 -2
  101. data/spec/rdf-parcel.rb +3 -3
  102. data/spec/rdfa-handler.rb +514 -0
  103. data/spec/rdfpost.rb +96 -0
  104. data/spec/source-rigor.rb +57 -0
  105. data/spec/update-focus.rb +11 -10
  106. metadata +91 -66
  107. data/lib/roadforest/blob-model.rb +0 -53
  108. data/lib/roadforest/content-handling/type-handler.rb +0 -76
  109. data/lib/roadforest/content-handling/type-handlers/jsonld.rb +0 -36
  110. data/lib/roadforest/content-handling/type-handlers/rdf-handler.rb +0 -38
  111. data/lib/roadforest/content-handling/type-handlers/rdfa-writer/render-engine.rb +0 -574
  112. data/lib/roadforest/content-handling/type-handlers/rdfa.rb +0 -175
  113. data/lib/roadforest/content-handling/type-handlers/rdfpost.rb +0 -297
  114. data/lib/roadforest/model.rb +0 -209
  115. data/lib/roadforest/models.rb +0 -2
  116. data/lib/roadforest/rdf/source-rigor.rb +0 -44
  117. data/lib/roadforest/rdf/vocabulary.rb +0 -11
  118. data/lib/roadforest/resource/http/form-parsing.rb +0 -81
  119. data/lib/roadforest/resource/rdf.rb +0 -4
  120. data/spec/form-parsing.rb +0 -1
@@ -1,6 +1,6 @@
1
1
  require 'rdf'
2
2
 
3
3
  module RoadForest
4
- module RDF
4
+ module Graph
5
5
  end
6
6
  end
@@ -1,17 +1,14 @@
1
1
  require 'rdf'
2
- require 'roadforest/rdf/resource-query'
3
- require 'roadforest/rdf/resource-pattern'
4
- require 'roadforest/rdf/normalization'
5
- require 'roadforest/rdf/parcel'
2
+ require 'roadforest/graph/normalization'
6
3
 
7
- module RoadForest::RDF
4
+ module RoadForest::Graph
8
5
  class ReadOnlyManager
9
6
  include ::RDF::Countable
10
7
  include ::RDF::Enumerable
11
8
  include ::RDF::Queryable
12
9
  include Normalization
13
10
 
14
- attr_accessor :resource, :rigor, :source_graph
11
+ attr_accessor :resource, :source_graph
15
12
 
16
13
  def resource=(resource)
17
14
  @resource = normalize_context(resource)
@@ -20,7 +17,6 @@ module RoadForest::RDF
20
17
  def dup
21
18
  other = self.class.allocate
22
19
  other.resource = self.resource
23
- other.rigor = self.rigor
24
20
  other.source_graph = self.source_graph
25
21
 
26
22
  return other
@@ -29,32 +25,28 @@ module RoadForest::RDF
29
25
  alias origin_graph source_graph
30
26
  alias destination_graph source_graph
31
27
 
28
+ def relevant_prefixes
29
+ relevant_prefixes_for_graph(origin_graph)
30
+ end
31
+
32
+ def each(&block)
33
+ origin_graph.each(&block)
34
+ end
35
+
32
36
  def build_query
33
- ResourceQuery.new([], {}) do |query|
34
- query.subject_context = resource
35
- query.source_rigor = rigor
37
+ ::RDF::Query.new([], {}) do |query|
36
38
  yield query
37
39
  end
38
40
  end
39
41
 
40
- def relevant_prefixes
41
- relevant_prefixes_for_graph(origin_graph)
42
- end
43
-
44
42
  def query_execute(query, &block)
45
- query = ResourceQuery.from(query, resource, rigor)
46
43
  execute_search(query, &block)
47
44
  end
48
45
 
49
46
  def query_pattern(pattern, &block)
50
- pattern = ResourcePattern.from(pattern, {:context_roles => {:subject => resource}, :source_rigor => rigor})
51
47
  execute_search(pattern, &block)
52
48
  end
53
49
 
54
- def each(&block)
55
- origin_graph.each(&block)
56
- end
57
-
58
50
  def execute_search(search, &block)
59
51
  search.execute(origin_graph, &block)
60
52
  end
@@ -73,9 +65,6 @@ module RoadForest::RDF
73
65
  end
74
66
  end
75
67
 
76
- class PostManager < WriteManager
77
- end
78
-
79
68
  class SplitManager < WriteManager
80
69
  attr_accessor :target_graph
81
70
 
@@ -92,57 +81,6 @@ module RoadForest::RDF
92
81
  end
93
82
  end
94
83
 
95
- class UpdateManager < SplitManager
96
- def initialize
97
- @copied_contexts = {}
98
- end
99
-
100
- attr_accessor :copied_contexts
101
-
102
- def dup
103
- other = super
104
- other.copied_contexts = self.copied_contexts
105
- return other
106
- end
107
-
108
- def execute_search(search, &block)
109
- enum = search.execute(destination_graph)
110
- if enum.any?{ true }
111
- enum.each(&block)
112
- return enum
113
- end
114
- search.execute(origin_graph, &block)
115
- end
116
-
117
- def insert(statement)
118
- copy_context
119
- super
120
- end
121
-
122
- def delete(statement)
123
- copy_context
124
- super
125
- end
126
-
127
- def parceller
128
- @parceller ||=
129
- begin
130
- parceller = Parcel.new
131
- parceller.graph = source_graph
132
- parceller
133
- end
134
- end
135
-
136
- def copy_context
137
- return if copied_contexts[resource]
138
- parceller.graph_for(resource).each_statement do |statement|
139
- statement.context = resource
140
- destination_graph << statement
141
- end
142
- copied_contexts[resource] = true
143
- end
144
- end
145
-
146
84
  class CopyManager < SplitManager
147
85
  def execute_search(search, &block)
148
86
  super(search) do |statement|
@@ -1,7 +1,7 @@
1
1
  require 'stringio'
2
2
  require 'roadforest'
3
3
 
4
- module RoadForest::RDF
4
+ module RoadForest::Graph
5
5
  #Wrapper for text to be parsed into RDF
6
6
  class Document
7
7
  attr_accessor :content_type, :code, :source, :root_url, :body, :body_string
@@ -1,6 +1,6 @@
1
- require 'roadforest/rdf'
1
+ require 'roadforest/graph'
2
2
 
3
- module RoadForest::RDF
3
+ module RoadForest::Graph
4
4
  module Etagging
5
5
  def etag_from(graph)
6
6
  require 'openssl'
@@ -1,18 +1,10 @@
1
1
  require 'rdf'
2
2
 
3
- require 'roadforest/rdf/resource-query'
4
- require 'roadforest/rdf/resource-pattern'
5
-
6
- module RoadForest::RDF
3
+ module RoadForest::Graph
7
4
  class FocusList < ::RDF::List
8
5
 
9
6
  attr_accessor :root_url, :base_node
10
7
 
11
- #XXX Can delete?
12
- def source_rigor
13
- graph.rigor
14
- end
15
-
16
8
  alias car first
17
9
  alias cdr rest
18
10
 
@@ -1,8 +1,8 @@
1
1
  require 'rdf'
2
- require 'roadforest/rdf/graph-focus'
2
+ require 'roadforest/graph/graph-focus'
3
3
 
4
4
  module RoadForest
5
- module RDF
5
+ module Graph
6
6
  class GraphCopier < GraphFocus
7
7
  def query_value(query)
8
8
  #This isn't the most efficient way to do this (the query essentially
@@ -1,13 +1,11 @@
1
1
  require 'rdf'
2
2
  require 'rdf/model/node'
3
- require 'roadforest/rdf'
4
- require 'roadforest/rdf/focus-list'
5
- require 'roadforest/rdf/normalization'
6
- require 'roadforest/rdf/resource-query'
7
- require 'roadforest/rdf/access-manager'
3
+ require 'roadforest/graph'
4
+ require 'roadforest/graph/focus-list'
5
+ require 'roadforest/graph/normalization'
6
+ require 'roadforest/graph/access-manager'
8
7
 
9
-
10
- module RoadForest::RDF
8
+ module RoadForest::Graph
11
9
  class NullFocus < ::BasicObject
12
10
  def initialize(focus, pattern, callsite)
13
11
  @focus, @pattern, @callsite = focus, pattern, callsite
@@ -1,7 +1,7 @@
1
1
  require 'addressable/uri'
2
2
  require 'rdf'
3
3
 
4
- module RoadForest::RDF
4
+ module RoadForest::Graph
5
5
  module Normalization
6
6
  Vocabs = {}
7
7
  Vocabs["rdf"] = RDF
@@ -1,6 +1,6 @@
1
- require 'roadforest/rdf/graph-focus'
1
+ require 'roadforest/graph/graph-focus'
2
2
 
3
- module RoadForest::RDF
3
+ module RoadForest::Graph
4
4
  class PostFocus < GraphFocus
5
5
 
6
6
  attr_accessor :graphs
@@ -14,7 +14,6 @@ module RoadForest::RDF
14
14
  def post_to
15
15
  graph = ::RDF::Graph.new
16
16
  access = WriteManager.new
17
- access.rigor = access_manager.rigor
18
17
  access.source_graph = graph
19
18
  focus = GraphFocus.new(access, subject)
20
19
 
@@ -0,0 +1,96 @@
1
+ require 'roadforest/graph'
2
+ require 'rdf'
3
+
4
+ module RoadForest::Graph
5
+ module Vocabulary
6
+ class RF < ::RDF::Vocabulary("http://lrdesign.com/graph/roadforest#")
7
+ property :Impulse
8
+ property :impulse
9
+ property :begunAt
10
+ end
11
+ end
12
+
13
+ class Af < ::RDF::StrictVocabulary("http://judsonlester.info/affordance#")
14
+
15
+ # Class definitions
16
+ property :Affordance, :comment =>
17
+ %(Base class for all affordances)
18
+ property :Control
19
+ property :Create, :comment =>
20
+ %(Triggering this affordance implies a request to create a new
21
+ resource)
22
+ property :Embed, :comment =>
23
+ %(A resource that should be properly displayed in-line rather
24
+ than provided as a hyperlink)
25
+ property :Idempotent, :comment =>
26
+ %(An affordance that will cause a change, but that can be
27
+ repeated without further hazard)
28
+ property :LiteralTemplate
29
+ property :Metadata, :comment =>
30
+ %(There is extra metadata available about this resource)
31
+ property :Mutate, :comment =>
32
+ %(Triggering this affordance expresses a desire to make changes
33
+ to a resource)
34
+ property :Navigate, :comment =>
35
+ %(A link to another resource. The assumption is that otherwise
36
+ undescribed URLs have a navigation affordance)
37
+ property :Null, :comment =>
38
+ %(The provided affordance is null. i.e. not dereferenceable, no
39
+ actions provided)
40
+ property :Remove, :comment =>
41
+ %(Triggering this affordance is a request to delete the resource)
42
+ property :ResourceTemplate
43
+ property :Safe, :comment =>
44
+ %(A safe affordance - it is asserted that no change will be
45
+ triggered by activating the affordance)
46
+ property :Unsafe, :comment =>
47
+ %(Affordances whose effects cannot be simply modeled and should
48
+ be triggered with care)
49
+ property :Update, :comment =>
50
+ %(Acting on this affordance will update the targeted resource.
51
+ Repeated updates will have not further effect)
52
+
53
+ # Property definitions
54
+ property :authorizedBy, :comment =>
55
+ %(Opaque descriptors of authorization tokens - resource can be
56
+ dereferenced by users with that token. It's recommended that
57
+ the tokens be defreferenceable, and that they be accessible
58
+ iff the user is authorized to activate the affordance in
59
+ question.)
60
+ property :controlName, :comment =>
61
+ %(Valid values are limited per application. Examples include
62
+ 'Media-Type', 'Encoding' or 'EntityTag')
63
+ property :controlValue
64
+ property :controlledBy
65
+ property :defaultValue
66
+ property :label
67
+ property :name
68
+ property :objectTemplate, :comment =>
69
+ %(Used to indicate that a resource or literal template can be
70
+ used as the property in a statement)
71
+ property :pattern, :comment =>
72
+ %(An IRITemplate \(RFC 5xxx\) that defines how the template is
73
+ rendered - implicitly, all the parameters of the template are
74
+ provided as a key, value set called param_list, so something
75
+ like \(?param_list*\) should work like an HTML action=GET form)
76
+ property :payload
77
+ property :predicateTemplate, :comment =>
78
+ %(Used to indicate that a resource template can be used as the
79
+ property in a statement)
80
+ property :range
81
+ property :statement
82
+ property :subjectTemplate, :comment =>
83
+ %(Used to indicate that a resource template can be used as the
84
+ subject in a statement)
85
+ property :target, :comment =>
86
+ %(Could be a templated URL, or a URL resource. If not a
87
+ template, but the Affordance has one or more uriVariable
88
+ properties, the implication is that the target resource should
89
+ be used as the basis of a URI template by appending
90
+ \(?name,other,...\) to the URI.)
91
+ property :var, :comment =>
92
+ %(When the object is list, the members of the list should be
93
+ Parameters, the the list order implies the order in which the
94
+ parameters should be used)
95
+ end
96
+ end
@@ -1,5 +1,5 @@
1
1
  require 'roadforest/http'
2
- require 'roadforest/content-handling/engine'
2
+ require 'roadforest/content-handling/common-engines'
3
3
 
4
4
  module RoadForest
5
5
  module HTTP
@@ -50,7 +50,7 @@ module RoadForest
50
50
  end
51
51
 
52
52
  def type_handling
53
- @type_handling ||= ContentHandling::Engine.default
53
+ @type_handling || ContentHandling.rdf_engine
54
54
  end
55
55
 
56
56
  def best_type_for(url)
@@ -0,0 +1,145 @@
1
+ require 'roadforest/source-rigor/graph-store'
2
+ require 'roadforest/graph/etagging'
3
+ require 'roadforest/graph/access-manager'
4
+ require 'roadforest/graph/graph-focus'
5
+
6
+ module RoadForest
7
+ module Interface
8
+ class ProcessingSequenceError < StandardError
9
+ end
10
+
11
+ class Application
12
+ def initialize(route_name, params, router, services)
13
+ @route_name = route_name
14
+ @params = params
15
+ @router = router
16
+ @services = services
17
+ @data = nil
18
+ @response_values = {}
19
+ end
20
+ attr_reader :route_name, :params, :services, :data, :router
21
+ attr_reader :response_values
22
+
23
+ #@!group Utility methods
24
+
25
+ def path_for(route_name = nil, params = nil)
26
+ router.path_for(route_name, params || self.params)
27
+ end
28
+
29
+ def url_for(route_name, params = nil)
30
+ Addressable::URI.parse(canonical_host.to_s).join(path_for(route_name, params))
31
+ end
32
+
33
+ def interface_for(route_name = nil, params = nil)
34
+ router.interface_for(route_name, params || self.params)
35
+ end
36
+
37
+ def canonical_uri
38
+ url_for(route_name, params)
39
+ end
40
+
41
+ def my_path
42
+ path_for(route_name, params)
43
+ end
44
+
45
+ def my_url
46
+ canonical_uri.to_s
47
+ end
48
+
49
+ #@!endgroup
50
+
51
+ #@!group Authorization
52
+
53
+ def required_grants(method)
54
+ services.authz.build_grants do |grants|
55
+ grants.add(:admin)
56
+ end
57
+ end
58
+
59
+ def authorization(method, header)
60
+ required = required_grants(method)
61
+ if required.empty?
62
+ :public
63
+ else
64
+ services.authz.authorization(header, required_grants(method))
65
+ end
66
+ end
67
+
68
+ def authentication_challenge
69
+ services.authz.challenge(:realm => "Roadforest")
70
+ end
71
+
72
+ #@!endgroup
73
+
74
+ def canonical_host
75
+ services.canonical_host
76
+ end
77
+
78
+ def reset #XXX remove?
79
+ end
80
+
81
+ #group Resource interface
82
+
83
+ def exists?
84
+ !data.nil?
85
+ end
86
+
87
+ def etag
88
+ nil
89
+ end
90
+
91
+ def last_modified
92
+ nil
93
+ end
94
+
95
+ def response_location
96
+ @response_values.fetch(:location) do
97
+ raise ProcessingSequenceError, "Location not available until request processed"
98
+ end
99
+ end
100
+
101
+ def response_location=(location)
102
+ @response_values[:location] = location
103
+ end
104
+
105
+ def response_data
106
+ @response_values.fetch(:data) do
107
+ raise ProcessingSequenceError, "Location not available until request processed"
108
+ end
109
+ end
110
+
111
+ def response_data=(data)
112
+ @response_values[:data] = data
113
+ end
114
+
115
+ def processed
116
+ [:location, :data].each do |key|
117
+ unless @response_values.has_key?(key)
118
+ @response_values[key] = nil
119
+ end
120
+ end
121
+ end
122
+
123
+ def expires
124
+ nil
125
+ end
126
+
127
+ def update(data)
128
+ raise NotImplementedError
129
+ end
130
+
131
+ def add_child(results)
132
+ raise NotImplementedError
133
+ end
134
+
135
+ def retrieve
136
+ raise NotImplementedError
137
+ end
138
+ alias retreive retrieve
139
+
140
+ def delete
141
+ false
142
+ end
143
+ end
144
+ end
145
+ end