roadforest 0.0.3 → 0.1

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 (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