roadforest 0.1 → 0.5

Sign up to get free protection for your applications and to get access to all the features.
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