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