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,4 +1,4 @@
1
- require 'roadforest/rdf/graph-store'
1
+ require 'roadforest/source-rigor/graph-store'
2
2
  require 'roadforest/remote-host'
3
3
  require 'roadforest/test-support/http-client'
4
4
  module RoadForest::TestSupport
@@ -9,7 +9,7 @@ module RoadForest::TestSupport
9
9
  end
10
10
 
11
11
  def build_graph_store
12
- RoadForest::RDF::GraphStore.new
12
+ RoadForest::SourceRigor::GraphStore.new
13
13
  end
14
14
 
15
15
  def http_client
@@ -0,0 +1,74 @@
1
+ module RoadForest
2
+ module TypeHandlers
3
+ class Handler
4
+ def network_to_local(base_uri, network)
5
+ return network
6
+ end
7
+
8
+ def local_to_network(base_uri, local)
9
+ return local
10
+ end
11
+
12
+ def parse_for(resource)
13
+ source = resource.request_body
14
+ interface = resource.interface
15
+ input_data = network_to_local(interface.my_url, source)
16
+
17
+ update_interface(interface, input_data)
18
+
19
+ renderer = resource.content_engine.choose_renderer(resource.request_accept_header)
20
+ body = renderer.local_to_network(interface.my_url, interface.response_data)
21
+
22
+ build_response(resource)
23
+ end
24
+
25
+ def render_for(resource)
26
+ interface = resource.interface
27
+ output_data = get_output(interface)
28
+ local_to_network(interface.my_url, output_data)
29
+ end
30
+
31
+ def add_child_to(resource)
32
+ interface = resource.interface
33
+ source = resource.request_body
34
+ input_data = network_to_local(interface.my_url, source)
35
+
36
+ child_for_interface(resource.interface, input_data)
37
+
38
+ build_response(resource)
39
+ end
40
+
41
+ def build_response(resource)
42
+ interface = resource.interface
43
+
44
+ renderer = resource.content_engine.choose_renderer(resource.request_accept_header)
45
+ body = renderer.local_to_network(interface.my_url, interface.response_data)
46
+
47
+ resource.response_content_type = renderer.content_type_header
48
+ resource.response_body = body
49
+ if interface.response_location
50
+ resource.redirect_to(interface.response_location)
51
+ end
52
+ end
53
+
54
+ def child_for_interface(interface, data)
55
+ interface.add_child(data)
56
+ interface.processed
57
+ end
58
+
59
+ def update_interface(interface, input_data)
60
+ result = interface.update(input_data)
61
+ interface.response_data = result
62
+ interface.processed
63
+ result
64
+ end
65
+
66
+ def get_output(interface)
67
+ result = interface.retrieve
68
+ interface.response_data = result
69
+ interface.processed
70
+ result
71
+ end
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,34 @@
1
+ require 'json/ld'
2
+ require 'roadforest/type-handlers/rdf-handler'
3
+ module RoadForest
4
+ module TypeHandlers
5
+ #application/ld+json
6
+ class JSONLD < RDFHandler
7
+ include Graph::Normalization
8
+
9
+ def local_to_network(base_uri, rdf)
10
+ raise "Invalid base uri: #{base_uri}" if base_uri.nil?
11
+ prefixes = relevant_prefixes_for_graph(rdf)
12
+ prefixes.keys.each do |prefix|
13
+ prefixes[prefix.to_sym] = prefixes[prefix]
14
+ end
15
+ JSON::LD::Writer.buffer(:base_uri => base_uri.to_s,
16
+ :prefixes => prefixes) do |writer|
17
+ rdf.each_statement do |statement|
18
+ writer << statement
19
+ end
20
+ end
21
+ end
22
+
23
+ def network_to_local(base_uri, source)
24
+ raise "Invalid base uri: #{base_uri.inspect}" if base_uri.nil?
25
+ graph = ::RDF::Graph.new
26
+ reader = JSON::LD::Reader.new(source.to_s, :base_uri => base_uri.to_s)
27
+ reader.each_statement do |statement|
28
+ graph.insert(statement)
29
+ end
30
+ graph
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,36 @@
1
+ require 'roadforest/type-handlers/handler'
2
+ require 'roadforest/graph/normalization'
3
+ module RoadForest
4
+ module TypeHandlers
5
+ class RDFHandler < Handler
6
+ include Graph::Normalization
7
+
8
+ def get_output(interface)
9
+ graph = super
10
+ root_uri = interface.canonical_uri
11
+
12
+ graph.each_statement do |statement|
13
+ original = statement.dup
14
+ if ::RDF::URI === statement.subject and statement.subject.relative?
15
+ statement.subject = normalize_resource(root_uri.join(statement.subject))
16
+ end
17
+
18
+ if ::RDF::URI === statement.object and statement.object.relative?
19
+ statement.object = normalize_resource(root_uri.join(statement.object))
20
+ end
21
+
22
+ if statement != original
23
+ graph.delete(original)
24
+ graph.insert(statement)
25
+ end
26
+ end
27
+ graph
28
+ end
29
+
30
+ def child_for_interface(interface, data)
31
+ interface.add_graph_child(data)
32
+ interface.processed
33
+ end
34
+ end
35
+ end
36
+ end
@@ -2,7 +2,7 @@ require 'cgi'
2
2
  require 'roadforest/debug'
3
3
  require 'rdf/rdfa'
4
4
 
5
- module RoadForest::MediaType
5
+ module RoadForest::TypeHandlers
6
6
  ##
7
7
  # An RDFa 1.1 serialiser in Ruby. The RDFa serializer makes use of Haml templates, allowing runtime-replacement with alternate templates. Note, however, that templates should be checked against the W3C test suite to ensure that valid RDFa is emitted.
8
8
  #
@@ -134,7 +134,7 @@ module RoadForest::MediaType
134
134
  #
135
135
  # @return [void]
136
136
  def write_epilogue
137
- require 'roadforest/content-handling/type-handlers/rdfa-writer/render-engine'
137
+ require 'roadforest/type-handlers/rdfa-writer/render-engine'
138
138
  @base_uri = RDF::URI(@options[:base_uri]) if @options[:base_uri]
139
139
  @lang = @options[:lang]
140
140
  @debug = @options[:debug]
@@ -1,11 +1,9 @@
1
- require 'roadforest/content-handling/type-handlers/rdfa-writer/render-environment'
2
- module RoadForest::MediaType
1
+ require 'roadforest/type-handlers/rdfa-writer/render-environment'
2
+
3
+ module RoadForest::TypeHandlers
3
4
  class RDFaWriter
4
5
  class DocumentEnvironment < RenderEnvironment
5
6
  attr_accessor :subject_terms, :title, :prefixes, :lang, :base
6
- def yielded(item)
7
- @_engine.render(item)
8
- end
9
7
 
10
8
  def subjects
11
9
  enum_for(:each_subject_environment)
@@ -13,7 +11,7 @@ module RoadForest::MediaType
13
11
 
14
12
  def each_subject_environment
15
13
  subject_terms.each do |term|
16
- yield @_engine.subject_env(term)
14
+ yield subject_env(term)
17
15
  end
18
16
  end
19
17
 
@@ -21,14 +19,17 @@ module RoadForest::MediaType
21
19
  %w{doc}
22
20
  end
23
21
 
24
- def prefix
25
- @prefix ||=
22
+ def build_prefix_header(prefixes)
26
23
  if prefixes.empty?
27
24
  nil
28
25
  else
29
26
  prefixes.keys.map {|pk| "#{pk}: #{prefixes[pk]}"}.sort.join(" ")
30
27
  end.tap{|prefix| add_debug {"\nserialize: prefixes: #{prefixes.inspect} prefix src: #{prefix.inspect}"}}
31
28
  end
29
+
30
+ def prefix
31
+ @prefix ||= build_prefix_header(prefixes)
32
+ end
32
33
  end
33
34
  end
34
35
  end
@@ -0,0 +1,312 @@
1
+ require 'roadforest/utility/class-registry'
2
+ require 'roadforest/graph/vocabulary'
3
+
4
+ module RoadForest
5
+ module AffordanceClient
6
+ Af = Graph::Af
7
+ def all_affordances
8
+ @all_affordances ||=
9
+ [
10
+ Af.Affordance,
11
+ Af.Null,
12
+ Af.Safe,
13
+ Af.Idempotent,
14
+ Af.Unsafe,
15
+ Af.Navigate,
16
+ Af.Embed,
17
+ Af.Metadata,
18
+ Af.Update,
19
+ Af.Remove,
20
+ Af.Create,
21
+ Af.Mutate,
22
+ ]
23
+ end
24
+
25
+ def affordance_present(aff)
26
+ ::RDF::Query.new do
27
+ pattern [:any, ::RDF.type, aff ]
28
+ end
29
+ end
30
+
31
+ def has_affordance(node, type)
32
+ if type.is_a? Symbol
33
+ type = Af[type]
34
+ end
35
+ ::RDF::Query.new do
36
+ pattern([:node, ::RDF.type, type, nil])
37
+ pattern([:node, Af.target, node, nil])
38
+ end
39
+ end
40
+
41
+ def payload_has_param(node)
42
+ ::RDF::Query.new do
43
+ pattern([:node, Af.payload, :context, nil])
44
+ pattern([ :param, ::RDF.type, Af.Parameter, :context ])
45
+ end
46
+ end
47
+
48
+ def query_matches(query, graph)
49
+ return (not graph.first(query).nil?)
50
+ end
51
+
52
+ def affordances_in_graph?(graph)
53
+ all_affordances.each do |aff|
54
+ return true if query_matches(affordance_present(aff), graph)
55
+ end
56
+ return false
57
+ end
58
+
59
+ def affordance_node?(node, graph)
60
+ query = ::RDF::Query.new do
61
+ pattern [node, ::RDF.type, :type]
62
+ end
63
+ !!( query.execute(graph).find do |solution|
64
+ all_affordances.include?(solution[:type])
65
+ end)
66
+ end
67
+
68
+ def affordance_type_in_graph?(node, type, graph)
69
+ #puts "\n#{__FILE__}:#{__LINE__} => \n#{graph.dump(:nquads)}"
70
+ query_matches(has_affordance(node, type).tap{|value|
71
+ #puts "#{__FILE__}:#{__LINE__} => #{[value.patterns,
72
+ #value.execute(graph)].inspect}"
73
+ }, graph).tap{|value|
74
+ #puts "#{__FILE__}:#{__LINE__} => #{value.inspect}"
75
+ }
76
+ end
77
+
78
+ def parameterized_navigation_affordance_in_graph?(node, graph)
79
+ return false #to be implemented
80
+ query_matches(has_affordance(node, :Navigate) + payload_has_param(node), graph)
81
+ end
82
+ end
83
+
84
+ module TypeHandlers
85
+ class RDFaWriter
86
+ class DecorationSet
87
+ def initialize
88
+ @names = EnvironmentDecorator.all_names
89
+ end
90
+ attr_accessor :names
91
+
92
+ def decoration_for(env)
93
+ names.inject(env) do |env, name|
94
+ EnvironmentDecorator[name].perhaps_decorate(env)
95
+ end
96
+ end
97
+ end
98
+
99
+ class EnvironmentDecorator
100
+ extend Utility::ClassRegistry::Registrar
101
+
102
+ class << self
103
+ def registry_purpose
104
+ "render environment decoration"
105
+ end
106
+
107
+ def decorates(klass)
108
+ register(self.name)
109
+ @decorated_class = klass
110
+ methods = klass.instance_methods
111
+ methods -= self.instance_methods
112
+ methods.each do |method|
113
+ define_method(method) do |*args, &block|
114
+ @_decorated_.__send__(method, *args, &block)
115
+ end
116
+ end
117
+ end
118
+
119
+ def can_decorate?(env)
120
+ return (env._base_env_.class <= @decorated_class)
121
+ end
122
+
123
+ def perhaps_decorate(env)
124
+ if can_decorate?(env)
125
+ self.new(env)
126
+ else
127
+ env
128
+ end
129
+ end
130
+
131
+ end
132
+
133
+ def initialize(env)
134
+ @_decorated_ = env
135
+ setup
136
+ end
137
+
138
+ def setup
139
+ end
140
+
141
+ def like_a?(klass)
142
+ is_a?(klass) || _decorated_.like_a?(klass)
143
+ end
144
+
145
+ attr_reader :_decorated_
146
+ end
147
+
148
+ class RDFPostCurie < RenderEnvironment
149
+ def initialize(engine, kind, uri)
150
+ super(engine)
151
+ @kind, @uri = kind, uri
152
+ end
153
+
154
+ attr_reader :kind, :uri
155
+
156
+ def curie
157
+ @curie ||= get_curie(uri)
158
+ end
159
+
160
+ def reduced?
161
+ curie != uri
162
+ end
163
+
164
+ def prefix
165
+ @prefix ||= curie.split(":").first
166
+ end
167
+
168
+ def suffix
169
+ @suffix ||= curie.split(":").last
170
+ end
171
+
172
+ def template_kinds
173
+ %w{rdfpost-curie}
174
+ end
175
+ end
176
+
177
+ class AffordanceDecorator < EnvironmentDecorator
178
+ include AffordanceClient
179
+ extend AffordanceClient
180
+
181
+ def graph
182
+ _engine.graph
183
+ end
184
+
185
+ def affordance?
186
+ true
187
+ end
188
+
189
+ def rdfpost_curie(kind, uri)
190
+ curie = RDFPostCurie.new(_engine, kind, uri)
191
+
192
+ _engine.render(curie)
193
+ end
194
+
195
+ def template_kinds
196
+ _base_env_.template_kinds.map{|kind| "affordance-" + kind} + _base_env_.template_kinds
197
+ end
198
+ end
199
+
200
+ class DocumentAffordanceDecorator < AffordanceDecorator
201
+ decorates DocumentEnvironment
202
+
203
+ def self.can_decorate?(env)
204
+ return false unless env._base_env_.class <= DocumentEnvironment
205
+ affordances_in_graph?(env._engine.graph)
206
+ end
207
+
208
+
209
+ def subjects
210
+ _decorated_.subjects.reject do |subject_env|
211
+ affordance_node?(subject_env.subject, graph)
212
+ end
213
+ end
214
+
215
+ def prefixes
216
+ dec_prefixes = _decorated_.prefixes
217
+
218
+ dec_prefixes.keys.find_all do |key|
219
+ dec_prefixes[key] == Af.to_uri
220
+ end.each do |key|
221
+ dec_prefixes.delete(key)
222
+ end
223
+ dec_prefixes
224
+ end
225
+
226
+ def prefix
227
+ @prefix ||= build_prefix_header(prefixes)
228
+ end
229
+ end
230
+
231
+ class SubjectAffordanceDecorator < AffordanceDecorator
232
+ decorates SubjectEnvironment
233
+
234
+ def self.can_decorate?(env)
235
+ return false unless env._base_env_.class <= SubjectEnvironment
236
+ return false unless env.parent.like_a? AffordanceDecorator
237
+
238
+ return (
239
+ [:Update, :Remove, :Create].find do |type|
240
+ affordance_type_in_graph?(env.subject, type, env._engine.graph)
241
+ end || parameterized_navigation_affordance_in_graph?(env.subject, env._engine.graph))
242
+ end
243
+
244
+ def predicate_nodes
245
+ @predicate_nodes ||=
246
+ begin
247
+ [].tap do |nodes|
248
+ each_predicate do |pred|
249
+ pred.each_object do |object|
250
+ subj = _engine.subject_env(object)
251
+ next if subj.nil?
252
+ subj.rel = get_curie(pred.predicate)
253
+ nodes << subj
254
+ end
255
+ end
256
+ end
257
+ end
258
+ @predicate_nodes.enum_for(:each)
259
+ end
260
+
261
+ def prefixes
262
+ _engine.prefixes
263
+ end
264
+
265
+ def attrs
266
+ _decorated_.attrs.merge(
267
+ :method => "POST", :action => subject.join("put")
268
+ )
269
+ end
270
+ end
271
+
272
+ class PropertyAffordanceDecorator < AffordanceDecorator
273
+ decorates PropertyEnvironment
274
+
275
+ def self.can_decorate?(env)
276
+ return false unless (env._base_env_.class <= PropertyEnvironment)
277
+ return false unless (env.parent.like_a? AffordanceDecorator)
278
+ return true
279
+ end
280
+
281
+ end
282
+
283
+ class ObjectAffordanceDecorator < AffordanceDecorator
284
+ decorates ObjectEnvironment
285
+
286
+ def self.can_decorate?(env)
287
+ return false unless env._base_env_.class <= ObjectEnvironment
288
+ return false unless env.parent.like_a? AffordanceDecorator
289
+ return true
290
+ end
291
+
292
+ def label_attrs
293
+ {}
294
+ end
295
+
296
+ def type_uri
297
+ if object.literal? and object.datatype?
298
+ object.datatype
299
+ end
300
+ end
301
+
302
+ def input_attrs(value)
303
+ @_decorated_.attrs.merge(
304
+ :name => "ol",
305
+ :content => value,
306
+ :value => value,
307
+ )
308
+ end
309
+ end
310
+ end
311
+ end
312
+ end