roadforest 0.1 → 0.5
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 +4 -4
- data/examples/file-management.rb +12 -13
- data/lib/roadforest-client.rb +3 -0
- data/lib/roadforest-common.rb +2 -0
- data/lib/roadforest-server.rb +7 -0
- data/lib/roadforest-testing.rb +1 -0
- data/lib/roadforest/application.rb +9 -7
- data/lib/roadforest/application/dispatcher.rb +39 -63
- data/lib/roadforest/application/parameters.rb +1 -1
- data/lib/roadforest/application/path-provider.rb +2 -2
- data/lib/roadforest/application/route-adapter.rb +130 -18
- data/lib/roadforest/application/services-host.rb +0 -4
- data/lib/roadforest/augment/affordance.rb +78 -0
- data/lib/roadforest/augment/augmentation.rb +97 -0
- data/lib/roadforest/augment/augmenter.rb +54 -0
- data/lib/roadforest/augmentations.rb +1 -0
- data/lib/roadforest/content-handling.rb +1 -0
- data/lib/roadforest/content-handling/common-engines.rb +67 -0
- data/lib/roadforest/content-handling/engine.rb +2 -14
- data/lib/roadforest/content-handling/handler-wrap.rb +29 -31
- data/lib/roadforest/content-handling/media-type.rb +6 -0
- data/lib/roadforest/{rdf.rb → graph.rb} +1 -1
- data/lib/roadforest/{rdf → graph}/access-manager.rb +12 -74
- data/lib/roadforest/{rdf → graph}/document.rb +1 -1
- data/lib/roadforest/{rdf → graph}/etagging.rb +2 -2
- data/lib/roadforest/{rdf → graph}/focus-list.rb +1 -9
- data/lib/roadforest/{rdf → graph}/graph-copier.rb +2 -2
- data/lib/roadforest/{rdf → graph}/graph-focus.rb +5 -7
- data/lib/roadforest/{rdf → graph}/normalization.rb +1 -1
- data/lib/roadforest/{rdf → graph}/post-focus.rb +2 -3
- data/lib/roadforest/graph/vocabulary.rb +96 -0
- data/lib/roadforest/http/graph-transfer.rb +2 -2
- data/lib/roadforest/interface/application.rb +145 -0
- data/lib/roadforest/interface/blob.rb +38 -0
- data/lib/roadforest/interface/rdf.rb +77 -0
- data/lib/roadforest/interfaces.rb +2 -0
- data/lib/roadforest/remote-host.rb +17 -17
- data/lib/roadforest/resource.rb +4 -0
- data/lib/roadforest/resource/{rdf/leaf-item.rb → leaf-item.rb} +1 -1
- data/lib/roadforest/resource/{rdf/list.rb → list.rb} +1 -1
- data/lib/roadforest/resource/{rdf/parent-item.rb → parent-item.rb} +1 -1
- data/lib/roadforest/resource/{rdf/read-only.rb → read-only.rb} +18 -18
- data/lib/roadforest/resource/role/has-children.rb +1 -1
- data/lib/roadforest/resource/role/writable.rb +2 -2
- data/lib/roadforest/server.rb +1 -1
- data/lib/roadforest/source-rigor.rb +9 -0
- data/lib/roadforest/{rdf/source-rigor → source-rigor}/credence-annealer.rb +2 -2
- data/lib/roadforest/{rdf/source-rigor → source-rigor}/credence.rb +5 -5
- data/lib/roadforest/{rdf/source-rigor → source-rigor}/credence/any.rb +1 -1
- data/lib/roadforest/{rdf/source-rigor → source-rigor}/credence/none-if-role-absent.rb +1 -1
- data/lib/roadforest/{rdf/source-rigor → source-rigor}/credence/role-if-available.rb +1 -1
- data/lib/roadforest/source-rigor/engine.rb +45 -0
- data/lib/roadforest/{rdf → source-rigor}/graph-store.rb +9 -9
- data/lib/roadforest/{rdf/source-rigor → source-rigor}/http-investigator.rb +2 -2
- data/lib/roadforest/{rdf → source-rigor}/investigation.rb +2 -2
- data/lib/roadforest/{rdf/source-rigor → source-rigor}/investigator.rb +3 -3
- data/lib/roadforest/{rdf/source-rigor → source-rigor}/null-investigator.rb +3 -2
- data/lib/roadforest/{rdf → source-rigor}/parcel.rb +5 -5
- data/lib/roadforest/{rdf → source-rigor}/resource-pattern.rb +6 -6
- data/lib/roadforest/{rdf → source-rigor}/resource-query.rb +2 -2
- data/lib/roadforest/source-rigor/rigorous-access.rb +101 -0
- data/lib/roadforest/templates/affordance-doc.haml +23 -0
- data/lib/roadforest/templates/affordance-property-values.haml +13 -0
- data/lib/roadforest/templates/affordance-subject.haml +9 -0
- data/lib/roadforest/templates/affordance-uri-object.haml +2 -0
- data/lib/roadforest/templates/base/{property_value.haml → property-value.haml} +0 -0
- data/lib/roadforest/templates/base/{property_values.haml → property-values.haml} +0 -0
- data/lib/roadforest/templates/distiller/{property_value.haml → property-value.haml} +0 -0
- data/lib/roadforest/templates/distiller/{property_values.haml → property-values.haml} +0 -0
- data/lib/roadforest/templates/min/{property_values.haml → property-values.haml} +0 -0
- data/lib/roadforest/templates/rdfpost-curie.haml +6 -0
- data/lib/roadforest/test-support/dispatcher-facade.rb +2 -0
- data/lib/roadforest/test-support/matchers.rb +169 -5
- data/lib/roadforest/test-support/remote-host.rb +2 -2
- data/lib/roadforest/type-handlers/handler.rb +74 -0
- data/lib/roadforest/type-handlers/jsonld.rb +34 -0
- data/lib/roadforest/type-handlers/rdf-handler.rb +36 -0
- data/lib/roadforest/{content-handling/type-handlers → type-handlers}/rdfa-writer.rb +2 -2
- data/lib/roadforest/{content-handling/type-handlers → type-handlers}/rdfa-writer/document-environment.rb +9 -8
- data/lib/roadforest/type-handlers/rdfa-writer/environment-decorator.rb +312 -0
- data/lib/roadforest/{content-handling/type-handlers → type-handlers}/rdfa-writer/object-environment.rb +3 -3
- data/lib/roadforest/{content-handling/type-handlers → type-handlers}/rdfa-writer/property-environment.rb +5 -11
- data/lib/roadforest/type-handlers/rdfa-writer/render-engine.rb +427 -0
- data/lib/roadforest/{content-handling/type-handlers → type-handlers}/rdfa-writer/render-environment.rb +33 -26
- data/lib/roadforest/{content-handling/type-handlers → type-handlers}/rdfa-writer/subject-environment.rb +7 -23
- data/lib/roadforest/type-handlers/rdfa.rb +73 -0
- data/lib/roadforest/type-handlers/rdfpost.rb +301 -0
- data/lib/roadforest/utility/class-registry.rb +23 -5
- data/spec/.ctrlp-root +0 -0
- data/spec/affordance-augmenter.rb +75 -0
- data/spec/affordances-flow.rb +438 -0
- data/spec/authorization.rb +34 -0
- data/spec/client.rb +13 -12
- data/spec/credence-annealer.rb +5 -5
- data/spec/focus-list.rb +8 -8
- data/spec/full-integration.rb +3 -3
- data/spec/graph-copier.rb +4 -4
- data/spec/graph-store.rb +19 -31
- data/spec/keychain.rb +82 -0
- data/spec/rdf-normalization.rb +2 -2
- data/spec/rdf-parcel.rb +3 -3
- data/spec/rdfa-handler.rb +514 -0
- data/spec/rdfpost.rb +96 -0
- data/spec/source-rigor.rb +57 -0
- data/spec/update-focus.rb +11 -10
- metadata +91 -66
- data/lib/roadforest/blob-model.rb +0 -53
- data/lib/roadforest/content-handling/type-handler.rb +0 -76
- data/lib/roadforest/content-handling/type-handlers/jsonld.rb +0 -36
- data/lib/roadforest/content-handling/type-handlers/rdf-handler.rb +0 -38
- data/lib/roadforest/content-handling/type-handlers/rdfa-writer/render-engine.rb +0 -574
- data/lib/roadforest/content-handling/type-handlers/rdfa.rb +0 -175
- data/lib/roadforest/content-handling/type-handlers/rdfpost.rb +0 -297
- data/lib/roadforest/model.rb +0 -209
- data/lib/roadforest/models.rb +0 -2
- data/lib/roadforest/rdf/source-rigor.rb +0 -44
- data/lib/roadforest/rdf/vocabulary.rb +0 -11
- data/lib/roadforest/resource/http/form-parsing.rb +0 -81
- data/lib/roadforest/resource/rdf.rb +0 -4
- data/spec/form-parsing.rb +0 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: c6aad7c24680d035ff3f8a2a72d660888d400be6
|
|
4
|
+
data.tar.gz: 4ed267799005efaba995beab6a5adfff4e171021
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: c1a97a99c84940a429ebf824b919704d336d21d28a7113c0663a35dbc37ee451be3af7a6913b45e915a75d0d1f5fbf69ef2cc6a684df1d3f5a389f65526f1d62
|
|
7
|
+
data.tar.gz: 986679ca8ed11258a435a0f7b14d9f79b91487e7a2ec16dc2712b944fac032c5bd037a511725f62bc350f3c770401558b0b54ae76955710ade5f613fa4338911
|
data/examples/file-management.rb
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
require 'roadforest-server'
|
|
1
2
|
require 'rdf/vocab/skos'
|
|
2
3
|
|
|
3
4
|
module FileManagementExample
|
|
@@ -17,14 +18,16 @@ module FileManagementExample
|
|
|
17
18
|
|
|
18
19
|
class Application < RoadForest::Application
|
|
19
20
|
def setup
|
|
20
|
-
router.add :root, [], :read_only,
|
|
21
|
-
router.add :unresolved_needs, ["unresolved_needs"], :parent,
|
|
22
|
-
router.add_traced :need, ["needs",'*'], :leaf,
|
|
23
|
-
router.add :file_content, ["files","*"], :leaf,
|
|
21
|
+
router.add :root, [], :read_only, Interfaces::Navigation
|
|
22
|
+
router.add :unresolved_needs, ["unresolved_needs"], :parent, Interfaces::UnresolvedNeedsList
|
|
23
|
+
router.add_traced :need, ["needs",'*'], :leaf, Interfaces::Need
|
|
24
|
+
router.add :file_content, ["files","*"], :leaf, RoadForest::Interface::Blob do |route|
|
|
25
|
+
route.content_engine = RoadForest::ContentHandling.plaintext_engine
|
|
26
|
+
end
|
|
24
27
|
end
|
|
25
28
|
|
|
26
|
-
module
|
|
27
|
-
class Navigation < RoadForest::
|
|
29
|
+
module Interfaces
|
|
30
|
+
class Navigation < RoadForest::Interface::RDF
|
|
28
31
|
def exists?
|
|
29
32
|
true
|
|
30
33
|
end
|
|
@@ -47,7 +50,7 @@ module FileManagementExample
|
|
|
47
50
|
end
|
|
48
51
|
end
|
|
49
52
|
|
|
50
|
-
class UnresolvedNeedsList < RoadForest::
|
|
53
|
+
class UnresolvedNeedsList < RoadForest::Interface::RDF
|
|
51
54
|
def exists?
|
|
52
55
|
true
|
|
53
56
|
end
|
|
@@ -65,7 +68,7 @@ module FileManagementExample
|
|
|
65
68
|
graph.add_list(:lc, "needs") do |list|
|
|
66
69
|
services.file_records.each do |record|
|
|
67
70
|
if !record.resolved
|
|
68
|
-
need =
|
|
71
|
+
need = copy_interface(graph, :need, '*' => [record.name])
|
|
69
72
|
need[:lc, :name]
|
|
70
73
|
need[:lc, :digest]
|
|
71
74
|
|
|
@@ -76,11 +79,7 @@ module FileManagementExample
|
|
|
76
79
|
end
|
|
77
80
|
end
|
|
78
81
|
|
|
79
|
-
class
|
|
80
|
-
add_type TypeHandlers::Handler.new, "text/plain"
|
|
81
|
-
end
|
|
82
|
-
|
|
83
|
-
class Need < RoadForest::RDFModel
|
|
82
|
+
class Need < RoadForest::Interface::RDF
|
|
84
83
|
def data
|
|
85
84
|
@data = services.file_records.find do |record|
|
|
86
85
|
record.name == params.remainder
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require 'roadforest/test-support'
|
|
@@ -6,14 +6,14 @@ end
|
|
|
6
6
|
require 'roadforest/application/dispatcher'
|
|
7
7
|
require 'roadforest/application/path-provider'
|
|
8
8
|
require 'roadforest/application/services-host'
|
|
9
|
-
require 'roadforest/resource
|
|
10
|
-
require 'roadforest/content-handling/
|
|
11
|
-
require 'roadforest/
|
|
9
|
+
require 'roadforest/resource'
|
|
10
|
+
require 'roadforest/content-handling/common-engines'
|
|
11
|
+
require 'roadforest/graph/normalization'
|
|
12
12
|
require 'roadforest/authorization'
|
|
13
13
|
|
|
14
14
|
module RoadForest
|
|
15
15
|
class Application
|
|
16
|
-
include
|
|
16
|
+
include Graph::Normalization
|
|
17
17
|
|
|
18
18
|
def initialize(canonical_host, services = nil, configuration = nil, dispatcher = nil)
|
|
19
19
|
@canonical_host = normalize_resource(canonical_host)
|
|
@@ -28,7 +28,7 @@ module RoadForest
|
|
|
28
28
|
def setup
|
|
29
29
|
end
|
|
30
30
|
|
|
31
|
-
attr_accessor :services, :canonical_host
|
|
31
|
+
attr_accessor :services, :canonical_host, :default_content_engine
|
|
32
32
|
|
|
33
33
|
alias router dispatcher
|
|
34
34
|
|
|
@@ -36,8 +36,10 @@ module RoadForest
|
|
|
36
36
|
def services=(service_host)
|
|
37
37
|
@services = service_host
|
|
38
38
|
service_host.application = self
|
|
39
|
-
|
|
40
|
-
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def default_content_engine
|
|
42
|
+
@default_content_engine || ContentHandling.rdf_engine
|
|
41
43
|
end
|
|
42
44
|
end
|
|
43
45
|
end
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
require 'webmachine'
|
|
2
2
|
require 'roadforest/application/route-adapter'
|
|
3
|
+
require 'roadforest/resource'
|
|
3
4
|
|
|
4
5
|
module RoadForest
|
|
5
6
|
class Dispatcher < Webmachine::Dispatcher
|
|
@@ -15,82 +16,57 @@ module RoadForest
|
|
|
15
16
|
@route_names.fetch(name)
|
|
16
17
|
end
|
|
17
18
|
|
|
18
|
-
def
|
|
19
|
-
|
|
20
|
-
return add_traced_route(name, path_spec, resource_type, model_class, bindings, &block)
|
|
21
|
-
else
|
|
22
|
-
return add_untraced_route(name, path_spec, resource_type, model_class, bindings, &block)
|
|
23
|
-
end
|
|
19
|
+
def default_content_engine
|
|
20
|
+
@application.default_content_engine
|
|
24
21
|
end
|
|
25
|
-
alias add add_route
|
|
26
22
|
|
|
27
|
-
def
|
|
28
|
-
|
|
29
|
-
resource_route(resource, name, path_spec, bindings, &block)
|
|
23
|
+
def path_provider
|
|
24
|
+
@path_provider ||= PathProvider.new(self)
|
|
30
25
|
end
|
|
31
|
-
alias add_untraced add_untraced_route
|
|
32
26
|
|
|
33
|
-
def
|
|
34
|
-
|
|
35
|
-
resource_route(resource, name, path_spec, bindings, &block)
|
|
27
|
+
def services
|
|
28
|
+
@application.services
|
|
36
29
|
end
|
|
37
|
-
alias add_traced add_traced_route
|
|
38
30
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
31
|
+
# Add a named route to the dispatcher - the 90% case is handled by passing
|
|
32
|
+
# arguments in, but more control is available but manipulating the
|
|
33
|
+
# RouteBinding object used to create the Route and ResourceAdapter
|
|
34
|
+
#
|
|
35
|
+
# @yields [RouteBinding] temporary configuration object
|
|
36
|
+
def add_route(name=nil, path_spec=nil, resource_type=nil, interface_class=nil)
|
|
37
|
+
binder = Application::RouteBinding.new(self)
|
|
46
38
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
end
|
|
52
|
-
end
|
|
39
|
+
binder.route_name = name
|
|
40
|
+
binder.path_spec = path_spec
|
|
41
|
+
binder.resource_type = resource_type
|
|
42
|
+
binder.interface_class = interface_class
|
|
53
43
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
44
|
+
yield binder if block_given?
|
|
45
|
+
|
|
46
|
+
binder.validate!
|
|
47
|
+
|
|
48
|
+
@route_names[name] = binder.route
|
|
49
|
+
@routes << binder.route
|
|
50
|
+
binder.route
|
|
60
51
|
end
|
|
52
|
+
alias add add_route
|
|
61
53
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
def build_path(vars = nil)
|
|
68
|
-
vars ||= {}
|
|
69
|
-
"/" + path_spec.map do |segment|
|
|
70
|
-
case segment
|
|
71
|
-
when '*',Symbol
|
|
72
|
-
vars.fetch(segment)
|
|
73
|
-
when String
|
|
74
|
-
segment
|
|
75
|
-
end
|
|
76
|
-
end.join("/")
|
|
54
|
+
# @deprecated Just use add_route
|
|
55
|
+
def add_untraced_route(name = nil, path_spec = nil, resource_type = nil, interface_class = nil)
|
|
56
|
+
add_route(name, path_spec, resource_type, interface_class) do |binder|
|
|
57
|
+
binder.trace = false
|
|
58
|
+
yield binder if block_given?
|
|
77
59
|
end
|
|
60
|
+
end
|
|
61
|
+
alias add_untraced add_untraced_route
|
|
78
62
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
if(path_set.has_key?(key))
|
|
85
|
-
params.path_info[key] = value
|
|
86
|
-
elsif(key == '*')
|
|
87
|
-
params.path_tokens = value
|
|
88
|
-
else
|
|
89
|
-
params.query_params[key] = value
|
|
90
|
-
end
|
|
91
|
-
end
|
|
92
|
-
params
|
|
63
|
+
# @deprecated Just use add_route
|
|
64
|
+
def add_traced_route(name, path_spec, resource_type, interface_class, bindings = nil, &block)
|
|
65
|
+
add_route(name, path_spec, resource_type, interface_class) do |binder|
|
|
66
|
+
binder.trace = true
|
|
67
|
+
yield binder if block_given?
|
|
93
68
|
end
|
|
94
69
|
end
|
|
70
|
+
alias add_traced add_traced_route
|
|
95
71
|
end
|
|
96
72
|
end
|
|
@@ -22,10 +22,10 @@ module RoadForest
|
|
|
22
22
|
Webmachine::Request.new(method, url, headers, body)
|
|
23
23
|
end
|
|
24
24
|
|
|
25
|
-
def
|
|
25
|
+
def interface_for(name, vars = nil)
|
|
26
26
|
route = @dispatcher.route_for_name(name)
|
|
27
27
|
params = route.build_params(vars)
|
|
28
|
-
route.resource.
|
|
28
|
+
route.resource.build_interface(params)
|
|
29
29
|
end
|
|
30
30
|
end
|
|
31
31
|
end
|
|
@@ -1,34 +1,146 @@
|
|
|
1
1
|
module RoadForest
|
|
2
2
|
class Application
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
#Embedded in WebMachine's Routes to compose the object structure at need
|
|
4
|
+
class ResourceAdapter
|
|
5
|
+
attr_accessor :resource_builder, :interface_builder, :route_name, :router, :services, :content_engine, :trace, :router
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
7
|
+
def <(klass)
|
|
8
|
+
if klass <= Webmachine::Resource
|
|
9
|
+
return true
|
|
10
|
+
else
|
|
11
|
+
return false
|
|
12
|
+
end
|
|
12
13
|
end
|
|
13
|
-
attr_accessor :route_name, :resource_class, :model_class, :application, :trace
|
|
14
14
|
|
|
15
15
|
def new(request, response)
|
|
16
|
-
resource =
|
|
17
|
-
resource.
|
|
18
|
-
resource.
|
|
16
|
+
resource = resource_builder.call(request, response)
|
|
17
|
+
resource.interface = build_interface(resource.params)
|
|
18
|
+
resource.content_engine = content_engine || router.default_content_engine
|
|
19
|
+
resource.trace = trace?
|
|
19
20
|
resource
|
|
20
21
|
end
|
|
21
22
|
|
|
22
|
-
def
|
|
23
|
-
|
|
23
|
+
def build_interface(params)
|
|
24
|
+
interface_builder.call(route_name, params, router, router.services)
|
|
24
25
|
end
|
|
25
26
|
|
|
26
|
-
def
|
|
27
|
-
if
|
|
28
|
-
|
|
27
|
+
def trace?
|
|
28
|
+
if @trace.nil?
|
|
29
|
+
router.trace_by_default
|
|
29
30
|
else
|
|
30
|
-
|
|
31
|
+
!!@trace
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
#Extension of Webmachine's Routes that allows for rendering url paths and
|
|
37
|
+
#parameter lists.
|
|
38
|
+
class Route < Webmachine::Dispatcher::Route
|
|
39
|
+
# Create a complete URL for this route, doing any necessary variable
|
|
40
|
+
# substitution.
|
|
41
|
+
# @param [Hash] vars values for the path variables
|
|
42
|
+
# @return [String] the valid URL for the route
|
|
43
|
+
def build_path(vars = nil)
|
|
44
|
+
vars ||= {}
|
|
45
|
+
"/" + path_spec.map do |segment|
|
|
46
|
+
case segment
|
|
47
|
+
when '*',Symbol
|
|
48
|
+
vars.fetch(segment)
|
|
49
|
+
when String
|
|
50
|
+
segment
|
|
51
|
+
end
|
|
52
|
+
end.join("/")
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def build_params(vars = nil)
|
|
56
|
+
vars ||= {}
|
|
57
|
+
params = Application::Parameters.new
|
|
58
|
+
path_set = Hash[path_spec.find_all{|segment| segment.is_a? Symbol}.map{|seg| [seg, true]}]
|
|
59
|
+
vars.to_hash.each do |key, value|
|
|
60
|
+
if(path_set.has_key?(key))
|
|
61
|
+
params.path_info[key] = value
|
|
62
|
+
elsif(key == '*')
|
|
63
|
+
params.path_tokens = value
|
|
64
|
+
else
|
|
65
|
+
params.query_params[key] = value
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
params
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
class RouteBinding
|
|
73
|
+
def initialize(router)
|
|
74
|
+
@router = router
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
attr_accessor :route_name, :path_spec, :bindings, :guard
|
|
78
|
+
attr_accessor :resource_type, :interface_class, :services, :trace, :content_engine
|
|
79
|
+
|
|
80
|
+
def resource_builder
|
|
81
|
+
@resource_builder ||= proc do |request, response|
|
|
82
|
+
Resource.get(resource_type).new(request, response)
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def build_resource(&block)
|
|
87
|
+
@resource_builder = block
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def interface_builder
|
|
91
|
+
@interface_builder ||= proc do |name, params, router, services|
|
|
92
|
+
interface_class.new(name, params, router.path_provider, services)
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def build_interface(&block)
|
|
97
|
+
@interface_builder = block
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def route
|
|
101
|
+
@route ||=
|
|
102
|
+
begin
|
|
103
|
+
if guard.nil?
|
|
104
|
+
Route.new(path_spec, resource_adapter, bindings || {})
|
|
105
|
+
else
|
|
106
|
+
Route.new(path_spec, resource_adapter, bindings || {}, &guard)
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def resource_adapter
|
|
112
|
+
@resource_adapter ||=
|
|
113
|
+
begin
|
|
114
|
+
ResourceAdapter.new.tap do |adapter|
|
|
115
|
+
adapter.router = @router
|
|
116
|
+
adapter.route_name = route_name
|
|
117
|
+
adapter.interface_builder = interface_builder
|
|
118
|
+
adapter.resource_builder = resource_builder
|
|
119
|
+
adapter.content_engine = content_engine
|
|
120
|
+
adapter.trace = trace
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def validate!
|
|
126
|
+
problems = []
|
|
127
|
+
|
|
128
|
+
if @path_spec.nil?
|
|
129
|
+
problems << "Path specification is nil - no way to route URLs here."
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
if @resource_builder.nil? && @resource_type.nil?
|
|
133
|
+
problems << "No means provided to build a resource adapter: set resource_type or resource_builder"
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
if @interface_builder.nil? and @interface_class.nil?
|
|
137
|
+
problems << "No means provided to build an application interface: set interface_class or interface_builder"
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
unless problems.empty?
|
|
141
|
+
raise InvalidRouteDefinition, "Route invalid:\n #{problems.join(" \n")}"
|
|
31
142
|
end
|
|
143
|
+
return true
|
|
32
144
|
end
|
|
33
145
|
end
|
|
34
146
|
end
|