roadforest 0.0.3 → 0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. checksums.yaml +7 -0
  2. data/examples/file-management.rb +7 -9
  3. data/lib/roadforest/application/dispatcher.rb +44 -31
  4. data/lib/roadforest/application/parameters.rb +5 -4
  5. data/lib/roadforest/application/path-provider.rb +14 -1
  6. data/lib/roadforest/application/route-adapter.rb +15 -4
  7. data/lib/roadforest/application/services-host.rb +41 -7
  8. data/lib/roadforest/application.rb +4 -8
  9. data/lib/roadforest/authorization.rb +231 -0
  10. data/lib/roadforest/blob-model.rb +2 -11
  11. data/lib/roadforest/content-handling/engine.rb +12 -6
  12. data/lib/roadforest/content-handling/handler-wrap.rb +45 -0
  13. data/lib/roadforest/content-handling/media-type.rb +20 -12
  14. data/lib/roadforest/content-handling/type-handler.rb +76 -0
  15. data/lib/roadforest/content-handling/type-handlers/jsonld.rb +2 -146
  16. data/lib/roadforest/content-handling/type-handlers/rdf-handler.rb +38 -0
  17. data/lib/roadforest/content-handling/type-handlers/rdfa-writer/document-environment.rb +34 -0
  18. data/lib/roadforest/content-handling/type-handlers/rdfa-writer/object-environment.rb +62 -0
  19. data/lib/roadforest/content-handling/type-handlers/rdfa-writer/property-environment.rb +46 -0
  20. data/lib/roadforest/content-handling/type-handlers/rdfa-writer/render-engine.rb +574 -0
  21. data/lib/roadforest/content-handling/type-handlers/rdfa-writer/render-environment.rb +144 -0
  22. data/lib/roadforest/content-handling/type-handlers/rdfa-writer/subject-environment.rb +80 -0
  23. data/lib/roadforest/content-handling/type-handlers/rdfa-writer.rb +163 -0
  24. data/lib/roadforest/content-handling/type-handlers/rdfa.rb +175 -0
  25. data/lib/roadforest/content-handling/type-handlers/rdfpost.rb +297 -0
  26. data/lib/roadforest/debug.rb +10 -0
  27. data/lib/roadforest/http/graph-response.rb +3 -7
  28. data/lib/roadforest/http/graph-transfer.rb +28 -106
  29. data/lib/roadforest/http/keychain.rb +79 -0
  30. data/lib/roadforest/http/message.rb +9 -1
  31. data/lib/roadforest/http/user-agent.rb +115 -0
  32. data/lib/roadforest/http.rb +8 -0
  33. data/lib/roadforest/model.rb +48 -3
  34. data/lib/roadforest/rdf/graph-focus.rb +5 -3
  35. data/lib/roadforest/rdf/graph-store.rb +4 -2
  36. data/lib/roadforest/rdf/normalization.rb +6 -1
  37. data/lib/roadforest/remote-host.rb +22 -7
  38. data/lib/roadforest/resource/rdf/read-only.rb +15 -1
  39. data/lib/roadforest/templates/base/doc.haml +13 -0
  40. data/lib/roadforest/templates/base/property_value.haml +12 -0
  41. data/lib/roadforest/templates/base/property_values.haml +6 -0
  42. data/lib/roadforest/templates/base/subject.haml +4 -0
  43. data/lib/roadforest/templates/distiller/doc.haml +20 -0
  44. data/lib/roadforest/templates/distiller/nil-object.haml +1 -0
  45. data/lib/roadforest/templates/distiller/property_value.haml +7 -0
  46. data/lib/roadforest/templates/distiller/property_values.haml +7 -0
  47. data/lib/roadforest/templates/distiller/subject.haml +5 -0
  48. data/lib/roadforest/templates/min/doc.haml +10 -0
  49. data/lib/roadforest/templates/min/property_values.haml +7 -0
  50. data/lib/roadforest/templates/min/subject.haml +2 -0
  51. data/lib/roadforest/templates/nil-object.haml +0 -0
  52. data/lib/roadforest/templates/node-object.haml +1 -0
  53. data/lib/roadforest/templates/object.haml +1 -0
  54. data/lib/roadforest/templates/uri-object.haml +1 -0
  55. data/lib/roadforest/templates/xml-literal-object.haml +1 -0
  56. data/lib/roadforest/utility/class-registry.rb +4 -0
  57. data/spec/client.rb +119 -77
  58. data/spec/{excon-adapater.rb → excon-adapter.rb} +4 -0
  59. data/spec/full-integration.rb +6 -2
  60. data/spec/graph-store.rb +1 -1
  61. data/spec/media-types.rb +29 -2
  62. metadata +102 -125
@@ -8,28 +8,32 @@ module RoadForest
8
8
  MEDIA_TYPE_REGEX = /^\s*([^;\s]+)\s*((?:;\s*\S+\s*)*)\s*$/
9
9
 
10
10
  # Matches sub-type parameters
11
- PARAMS_REGEX = /;\s*([^=]+)=([^;=\s]+)/
11
+ PARAMS_REGEX = /;\s*([^;=]+)(?:=([^;=\s]+))?/
12
12
 
13
13
  # Creates a new MediaType by parsing an alternate representation.
14
14
  # @param [MediaType, String, Array<String,Hash>] obj the raw type
15
15
  # to be parsed
16
16
  # @return [MediaType] the parsed media type
17
17
  # @raise [ArgumentError] when the type could not be parsed
18
- def self.parse(obj)
19
- case obj
20
- when MediaType
18
+ def self.parse(*args)
19
+ if args.length == 1
20
+ obj = args.first
21
+ else
22
+ obj = args
23
+ end
24
+
25
+ if obj.is_a? MediaType
21
26
  obj
22
- when MEDIA_TYPE_REGEX
23
- type, raw_params = $1, $2
27
+ elsif obj.is_a? String and !(match = MEDIA_TYPE_REGEX.match(obj)).nil?
28
+ type, raw_params = *match[1,2]
24
29
  params = Hash[raw_params.scan(PARAMS_REGEX)]
25
30
  new(type, params)
26
- else
27
- unless Array === obj && String === obj[0] && Hash === obj[1]
28
- raise ArgumentError, "Invalid media type #{obj.inspect}"
29
- end
31
+ elsif Array === obj && String === obj[0] && Hash === obj[1]
30
32
  type = parse(obj[0])
31
33
  type.params.merge!(obj[1])
32
34
  type
35
+ else
36
+ raise ArgumentError, "Invalid media type #{obj.inspect}"
33
37
  end
34
38
  end
35
39
 
@@ -95,12 +99,16 @@ module RoadForest
95
99
  end
96
100
  end
97
101
 
102
+ def params_for_header
103
+ params.map {|k,v| ";#{k}#{v ? "=":""}#{v}" }.join("")
104
+ end
105
+
98
106
  def accept_header
99
- [type, "q=#{quality}", *params.map {|k,v| "#{k}=#{v}" }].join(";")
107
+ "#{type};q=#{quality}#{params_for_header}"
100
108
  end
101
109
 
102
110
  def content_type_header
103
- [type, *params.map {|k,v| "#{k}=#{v}" }].join(";")
111
+ "#{type}#{params_for_header}"
104
112
  end
105
113
  alias to_s content_type_header
106
114
 
@@ -0,0 +1,76 @@
1
+ module RoadForest
2
+ module MediaType
3
+ module Handlers
4
+ class Handler
5
+ def network_to_local(base_uri, network)
6
+ return network
7
+ end
8
+
9
+ def local_to_network(base_uri, local)
10
+ return local
11
+ end
12
+
13
+ def parse_for(resource)
14
+ source = resource.request_body
15
+ model = resource.model
16
+ input_data = network_to_local(model.my_url, source)
17
+
18
+ update_model(model, input_data)
19
+
20
+ renderer = model.type_handling.choose_renderer(resource.request_accept_header)
21
+ body = renderer.local_to_network(model.my_url, model.response_data)
22
+
23
+ build_response(resource)
24
+ end
25
+
26
+ def render_for(resource)
27
+ model = resource.model
28
+ output_data = get_output(model)
29
+ local_to_network(model.my_url, output_data)
30
+ end
31
+
32
+ def add_child_to(resource)
33
+ model = resource.model
34
+ source = resource.request_body
35
+ input_data = network_to_local(model.my_url, source)
36
+
37
+ child_for_model(resource.model, input_data)
38
+
39
+ build_response(resource)
40
+ end
41
+
42
+ def build_response(resource)
43
+ model = resource.model
44
+
45
+ renderer = model.type_handling.choose_renderer(resource.request_accept_header)
46
+ body = renderer.local_to_network(model.my_url, model.response_data)
47
+
48
+ resource.response_content_type = renderer.content_type_header
49
+ resource.response_body = body
50
+ if model.response_location
51
+ resource.redirect_to(model.response_location)
52
+ end
53
+ end
54
+
55
+ def child_for_model(model, data)
56
+ model.add_child(data)
57
+ model.processed
58
+ end
59
+
60
+ def update_model(model, input_data)
61
+ result = model.update(input_data)
62
+ model.response_data = result
63
+ model.processed
64
+ result
65
+ end
66
+
67
+ def get_output(model)
68
+ result = model.retrieve
69
+ model.response_data = result
70
+ model.processed
71
+ result
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
@@ -1,152 +1,8 @@
1
- #@require 'rdf/rdfa' #XXX Otherwise json-ld grabs RDFa documents. Awaiting fix
2
- #upstream
3
1
  require 'json/ld'
4
- require 'roadforest/rdf/normalization'
5
-
2
+ require 'roadforest/content-handling/type-handlers/rdf-handler'
6
3
  module RoadForest
7
4
  module MediaType
8
5
  module Handlers
9
- module Wrap
10
- class Wrapper
11
- def initialize(type, handler)
12
- @type = type
13
- @handler = handler
14
- end
15
- attr_reader :type, :handler
16
-
17
- def local_to_network(base_uri, network)
18
- @handler.local_to_network(base_uri, network)
19
- end
20
- alias from_graph local_to_network
21
-
22
- def network_to_local(base_uri, source)
23
- @handler.network_to_local(base_uri, source)
24
- end
25
- alias to_graph network_to_local
26
- end
27
-
28
- class Render < Wrapper
29
- def call(resource)
30
- @handler.render_for(resource)
31
- end
32
-
33
- def content_type_header
34
- @type.content_type_header
35
- end
36
- end
37
-
38
- class Parse < Wrapper
39
- def call(resource)
40
- @handler.parse_for(resource)
41
- end
42
-
43
- def add_child(resource)
44
- @handler.add_child_to(resource)
45
- end
46
- end
47
- end
48
-
49
- class Handler
50
- def network_to_local(base_uri, network)
51
- return network
52
- end
53
-
54
- def local_to_network(base_uri, local)
55
- return local
56
- end
57
-
58
- def parse_for(resource)
59
- source = resource.request_body
60
- model = resource.model
61
- input_data = network_to_local(model.my_url, source)
62
-
63
- update_model(model, input_data)
64
-
65
- renderer = model.type_handling.choose_renderer(resource.request_accept_header)
66
- body = renderer.local_to_network(model.my_url, model.response_data)
67
-
68
- build_response(resource)
69
- end
70
-
71
- def render_for(resource)
72
- model = resource.model
73
- output_data = get_output(model)
74
- local_to_network(model.my_url, output_data)
75
- end
76
-
77
- def add_child_to(resource)
78
- model = resource.model
79
- source = resource.request_body
80
- input_data = network_to_local(model.my_url, source)
81
-
82
- child_for_model(resource.model, input_data)
83
-
84
- build_response(resource)
85
- end
86
-
87
- def build_response(resource)
88
- model = resource.model
89
-
90
- renderer = model.type_handling.choose_renderer(resource.request_accept_header)
91
- body = renderer.local_to_network(model.my_url, model.response_data)
92
-
93
- resource.response_content_type = renderer.content_type_header
94
- resource.response_body = body
95
- if model.response_location
96
- resource.redirect_to(model.response_location)
97
- end
98
- end
99
-
100
- def child_for_model(model, data)
101
- model.add_child(data)
102
- model.processed
103
- end
104
-
105
- def update_model(model, input_data)
106
- result = model.update(input_data)
107
- model.response_data = result
108
- model.processed
109
- result
110
- end
111
-
112
- def get_output(model)
113
- result = model.retrieve
114
- model.response_data = result
115
- model.processed
116
- result
117
- end
118
- end
119
- class RDFHandler < Handler
120
- include RDF::Normalization
121
-
122
- def get_output(model)
123
- graph = super
124
- root_uri = model.canonical_uri
125
-
126
- graph.each_statement do |statement|
127
- original = statement.dup
128
- if ::RDF::URI === statement.subject and statement.subject.relative?
129
- statement.subject = normalize_resource(root_uri.join(statement.subject))
130
- end
131
-
132
- if ::RDF::URI === statement.object and statement.object.relative?
133
- statement.object = normalize_resource(root_uri.join(statement.object))
134
- end
135
-
136
- if statement != original
137
- graph.delete(original)
138
- graph.insert(statement)
139
- end
140
- end
141
- graph
142
- end
143
-
144
- def child_for_model(model, data)
145
- model.add_graph_child(data)
146
- model.processed
147
- end
148
- end
149
-
150
6
  #application/ld+json
151
7
  class JSONLD < RDFHandler
152
8
  include RDF::Normalization
@@ -162,7 +18,7 @@ module RoadForest
162
18
  rdf.each_statement do |statement|
163
19
  writer << statement
164
20
  end
165
- end
21
+ end
166
22
  end
167
23
 
168
24
  def network_to_local(base_uri, source)
@@ -0,0 +1,38 @@
1
+ require 'roadforest/content-handling/type-handler'
2
+ require 'roadforest/rdf/normalization'
3
+ module RoadForest
4
+ module MediaType
5
+ module Handlers
6
+ class RDFHandler < Handler
7
+ include RDF::Normalization
8
+
9
+ def get_output(model)
10
+ graph = super
11
+ root_uri = model.canonical_uri
12
+
13
+ graph.each_statement do |statement|
14
+ original = statement.dup
15
+ if ::RDF::URI === statement.subject and statement.subject.relative?
16
+ statement.subject = normalize_resource(root_uri.join(statement.subject))
17
+ end
18
+
19
+ if ::RDF::URI === statement.object and statement.object.relative?
20
+ statement.object = normalize_resource(root_uri.join(statement.object))
21
+ end
22
+
23
+ if statement != original
24
+ graph.delete(original)
25
+ graph.insert(statement)
26
+ end
27
+ end
28
+ graph
29
+ end
30
+
31
+ def child_for_model(model, data)
32
+ model.add_graph_child(data)
33
+ model.processed
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,34 @@
1
+ require 'roadforest/content-handling/type-handlers/rdfa-writer/render-environment'
2
+ module RoadForest::MediaType
3
+ class RDFaWriter
4
+ class DocumentEnvironment < RenderEnvironment
5
+ attr_accessor :subject_terms, :title, :prefixes, :lang, :base
6
+ def yielded(item)
7
+ @_engine.render(item)
8
+ end
9
+
10
+ def subjects
11
+ enum_for(:each_subject_environment)
12
+ end
13
+
14
+ def each_subject_environment
15
+ subject_terms.each do |term|
16
+ yield @_engine.subject_env(term)
17
+ end
18
+ end
19
+
20
+ def template_kinds
21
+ %w{doc}
22
+ end
23
+
24
+ def prefix
25
+ @prefix ||=
26
+ if prefixes.empty?
27
+ nil
28
+ else
29
+ prefixes.keys.map {|pk| "#{pk}: #{prefixes[pk]}"}.sort.join(" ")
30
+ end.tap{|prefix| add_debug {"\nserialize: prefixes: #{prefixes.inspect} prefix src: #{prefix.inspect}"}}
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,62 @@
1
+ require 'roadforest/content-handling/type-handlers/rdfa-writer/render-environment'
2
+ module RoadForest::MediaType
3
+ class RDFaWriter
4
+ class ObjectEnvironment < RenderEnvironment
5
+ attr_accessor :predicate, :object, :inlist, :element
6
+
7
+ def simple_attrs
8
+ {:property => get_curie(predicate), :content => get_content(object), :lang => get_lang(object), :datatype => get_dt_curie(object), :inlist => inlist}
9
+ end
10
+
11
+ alias attrs simple_attrs
12
+
13
+ def template_kinds
14
+ %w{object}
15
+ end
16
+
17
+ def literal?
18
+ object.literal?
19
+ end
20
+ end
21
+
22
+ class NilObjectEnvironment < ObjectEnvironment
23
+ def attrs
24
+ {:rel => get_curie(predicate), :inlist => ''}
25
+ end
26
+
27
+ def template_kinds
28
+ %w{nil-object object}
29
+ end
30
+ end
31
+
32
+ class NodeObjectEnvironment < ObjectEnvironment
33
+ def attrs
34
+ {:property => get_curie(predicate), :resource => get_curie(object), :inlist => inlist}
35
+ end
36
+
37
+ def template_kinds
38
+ %w{node-object object}
39
+ end
40
+ end
41
+
42
+ class UriObjectEnvironment < ObjectEnvironment
43
+ def attrs
44
+ {}
45
+ end
46
+
47
+ def template_kinds
48
+ %w{uri-object object}
49
+ end
50
+ end
51
+
52
+ class XMLLiteralObjectEnvironment < ObjectEnvironment
53
+ def attrs
54
+ {:property => get_curie(predicate), :lang => get_lang(object), :datatype => get_curie(object.datatype), :inlist => inlist}
55
+ end
56
+
57
+ def template_kinds
58
+ %w{xml-literal-object object}
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,46 @@
1
+ require 'roadforest/content-handling/type-handlers/rdfa-writer/render-environment'
2
+ module RoadForest::MediaType
3
+ class RDFaWriter
4
+ class PropertyEnvironment < RenderEnvironment
5
+ attr_accessor :object_terms, :predicate, :inlist
6
+
7
+ def yielded(item)
8
+ @_engine.render(item)
9
+ end
10
+
11
+ def objects
12
+ enum_for(:each_object)
13
+ end
14
+
15
+ def each_object
16
+ object_terms.each do |term|
17
+ env = @_engine.object_env(predicate, term)
18
+ env.inlist = inlist
19
+ #XXX Remove element=
20
+ env.element = :li if object_terms.length > 1 || inlist
21
+ yield(env)
22
+ end
23
+ end
24
+
25
+ def object
26
+ objects.first
27
+ end
28
+
29
+ def property
30
+ get_curie(predicate)
31
+ end
32
+
33
+ def rel
34
+ get_curie(predicate)
35
+ end
36
+
37
+ def template_kinds
38
+ if objects.to_a.length > 1
39
+ %w{property_values}
40
+ else
41
+ %w{property_value property_values}
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end