roadforest 0.0.3 → 0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/examples/file-management.rb +7 -9
- data/lib/roadforest/application/dispatcher.rb +44 -31
- data/lib/roadforest/application/parameters.rb +5 -4
- data/lib/roadforest/application/path-provider.rb +14 -1
- data/lib/roadforest/application/route-adapter.rb +15 -4
- data/lib/roadforest/application/services-host.rb +41 -7
- data/lib/roadforest/application.rb +4 -8
- data/lib/roadforest/authorization.rb +231 -0
- data/lib/roadforest/blob-model.rb +2 -11
- data/lib/roadforest/content-handling/engine.rb +12 -6
- data/lib/roadforest/content-handling/handler-wrap.rb +45 -0
- data/lib/roadforest/content-handling/media-type.rb +20 -12
- data/lib/roadforest/content-handling/type-handler.rb +76 -0
- data/lib/roadforest/content-handling/type-handlers/jsonld.rb +2 -146
- data/lib/roadforest/content-handling/type-handlers/rdf-handler.rb +38 -0
- data/lib/roadforest/content-handling/type-handlers/rdfa-writer/document-environment.rb +34 -0
- data/lib/roadforest/content-handling/type-handlers/rdfa-writer/object-environment.rb +62 -0
- data/lib/roadforest/content-handling/type-handlers/rdfa-writer/property-environment.rb +46 -0
- data/lib/roadforest/content-handling/type-handlers/rdfa-writer/render-engine.rb +574 -0
- data/lib/roadforest/content-handling/type-handlers/rdfa-writer/render-environment.rb +144 -0
- data/lib/roadforest/content-handling/type-handlers/rdfa-writer/subject-environment.rb +80 -0
- data/lib/roadforest/content-handling/type-handlers/rdfa-writer.rb +163 -0
- data/lib/roadforest/content-handling/type-handlers/rdfa.rb +175 -0
- data/lib/roadforest/content-handling/type-handlers/rdfpost.rb +297 -0
- data/lib/roadforest/debug.rb +10 -0
- data/lib/roadforest/http/graph-response.rb +3 -7
- data/lib/roadforest/http/graph-transfer.rb +28 -106
- data/lib/roadforest/http/keychain.rb +79 -0
- data/lib/roadforest/http/message.rb +9 -1
- data/lib/roadforest/http/user-agent.rb +115 -0
- data/lib/roadforest/http.rb +8 -0
- data/lib/roadforest/model.rb +48 -3
- data/lib/roadforest/rdf/graph-focus.rb +5 -3
- data/lib/roadforest/rdf/graph-store.rb +4 -2
- data/lib/roadforest/rdf/normalization.rb +6 -1
- data/lib/roadforest/remote-host.rb +22 -7
- data/lib/roadforest/resource/rdf/read-only.rb +15 -1
- data/lib/roadforest/templates/base/doc.haml +13 -0
- data/lib/roadforest/templates/base/property_value.haml +12 -0
- data/lib/roadforest/templates/base/property_values.haml +6 -0
- data/lib/roadforest/templates/base/subject.haml +4 -0
- data/lib/roadforest/templates/distiller/doc.haml +20 -0
- data/lib/roadforest/templates/distiller/nil-object.haml +1 -0
- data/lib/roadforest/templates/distiller/property_value.haml +7 -0
- data/lib/roadforest/templates/distiller/property_values.haml +7 -0
- data/lib/roadforest/templates/distiller/subject.haml +5 -0
- data/lib/roadforest/templates/min/doc.haml +10 -0
- data/lib/roadforest/templates/min/property_values.haml +7 -0
- data/lib/roadforest/templates/min/subject.haml +2 -0
- data/lib/roadforest/templates/nil-object.haml +0 -0
- data/lib/roadforest/templates/node-object.haml +1 -0
- data/lib/roadforest/templates/object.haml +1 -0
- data/lib/roadforest/templates/uri-object.haml +1 -0
- data/lib/roadforest/templates/xml-literal-object.haml +1 -0
- data/lib/roadforest/utility/class-registry.rb +4 -0
- data/spec/client.rb +119 -77
- data/spec/{excon-adapater.rb → excon-adapter.rb} +4 -0
- data/spec/full-integration.rb +6 -2
- data/spec/graph-store.rb +1 -1
- data/spec/media-types.rb +29 -2
- 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*([
|
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(
|
19
|
-
|
20
|
-
|
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
|
-
|
23
|
-
type, raw_params =
|
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
|
-
|
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
|
-
|
107
|
+
"#{type};q=#{quality}#{params_for_header}"
|
100
108
|
end
|
101
109
|
|
102
110
|
def content_type_header
|
103
|
-
|
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
|
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
|
-
|
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
|