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.
Files changed (120) hide show
  1. checksums.yaml +4 -4
  2. data/examples/file-management.rb +12 -13
  3. data/lib/roadforest-client.rb +3 -0
  4. data/lib/roadforest-common.rb +2 -0
  5. data/lib/roadforest-server.rb +7 -0
  6. data/lib/roadforest-testing.rb +1 -0
  7. data/lib/roadforest/application.rb +9 -7
  8. data/lib/roadforest/application/dispatcher.rb +39 -63
  9. data/lib/roadforest/application/parameters.rb +1 -1
  10. data/lib/roadforest/application/path-provider.rb +2 -2
  11. data/lib/roadforest/application/route-adapter.rb +130 -18
  12. data/lib/roadforest/application/services-host.rb +0 -4
  13. data/lib/roadforest/augment/affordance.rb +78 -0
  14. data/lib/roadforest/augment/augmentation.rb +97 -0
  15. data/lib/roadforest/augment/augmenter.rb +54 -0
  16. data/lib/roadforest/augmentations.rb +1 -0
  17. data/lib/roadforest/content-handling.rb +1 -0
  18. data/lib/roadforest/content-handling/common-engines.rb +67 -0
  19. data/lib/roadforest/content-handling/engine.rb +2 -14
  20. data/lib/roadforest/content-handling/handler-wrap.rb +29 -31
  21. data/lib/roadforest/content-handling/media-type.rb +6 -0
  22. data/lib/roadforest/{rdf.rb → graph.rb} +1 -1
  23. data/lib/roadforest/{rdf → graph}/access-manager.rb +12 -74
  24. data/lib/roadforest/{rdf → graph}/document.rb +1 -1
  25. data/lib/roadforest/{rdf → graph}/etagging.rb +2 -2
  26. data/lib/roadforest/{rdf → graph}/focus-list.rb +1 -9
  27. data/lib/roadforest/{rdf → graph}/graph-copier.rb +2 -2
  28. data/lib/roadforest/{rdf → graph}/graph-focus.rb +5 -7
  29. data/lib/roadforest/{rdf → graph}/normalization.rb +1 -1
  30. data/lib/roadforest/{rdf → graph}/post-focus.rb +2 -3
  31. data/lib/roadforest/graph/vocabulary.rb +96 -0
  32. data/lib/roadforest/http/graph-transfer.rb +2 -2
  33. data/lib/roadforest/interface/application.rb +145 -0
  34. data/lib/roadforest/interface/blob.rb +38 -0
  35. data/lib/roadforest/interface/rdf.rb +77 -0
  36. data/lib/roadforest/interfaces.rb +2 -0
  37. data/lib/roadforest/remote-host.rb +17 -17
  38. data/lib/roadforest/resource.rb +4 -0
  39. data/lib/roadforest/resource/{rdf/leaf-item.rb → leaf-item.rb} +1 -1
  40. data/lib/roadforest/resource/{rdf/list.rb → list.rb} +1 -1
  41. data/lib/roadforest/resource/{rdf/parent-item.rb → parent-item.rb} +1 -1
  42. data/lib/roadforest/resource/{rdf/read-only.rb → read-only.rb} +18 -18
  43. data/lib/roadforest/resource/role/has-children.rb +1 -1
  44. data/lib/roadforest/resource/role/writable.rb +2 -2
  45. data/lib/roadforest/server.rb +1 -1
  46. data/lib/roadforest/source-rigor.rb +9 -0
  47. data/lib/roadforest/{rdf/source-rigor → source-rigor}/credence-annealer.rb +2 -2
  48. data/lib/roadforest/{rdf/source-rigor → source-rigor}/credence.rb +5 -5
  49. data/lib/roadforest/{rdf/source-rigor → source-rigor}/credence/any.rb +1 -1
  50. data/lib/roadforest/{rdf/source-rigor → source-rigor}/credence/none-if-role-absent.rb +1 -1
  51. data/lib/roadforest/{rdf/source-rigor → source-rigor}/credence/role-if-available.rb +1 -1
  52. data/lib/roadforest/source-rigor/engine.rb +45 -0
  53. data/lib/roadforest/{rdf → source-rigor}/graph-store.rb +9 -9
  54. data/lib/roadforest/{rdf/source-rigor → source-rigor}/http-investigator.rb +2 -2
  55. data/lib/roadforest/{rdf → source-rigor}/investigation.rb +2 -2
  56. data/lib/roadforest/{rdf/source-rigor → source-rigor}/investigator.rb +3 -3
  57. data/lib/roadforest/{rdf/source-rigor → source-rigor}/null-investigator.rb +3 -2
  58. data/lib/roadforest/{rdf → source-rigor}/parcel.rb +5 -5
  59. data/lib/roadforest/{rdf → source-rigor}/resource-pattern.rb +6 -6
  60. data/lib/roadforest/{rdf → source-rigor}/resource-query.rb +2 -2
  61. data/lib/roadforest/source-rigor/rigorous-access.rb +101 -0
  62. data/lib/roadforest/templates/affordance-doc.haml +23 -0
  63. data/lib/roadforest/templates/affordance-property-values.haml +13 -0
  64. data/lib/roadforest/templates/affordance-subject.haml +9 -0
  65. data/lib/roadforest/templates/affordance-uri-object.haml +2 -0
  66. data/lib/roadforest/templates/base/{property_value.haml → property-value.haml} +0 -0
  67. data/lib/roadforest/templates/base/{property_values.haml → property-values.haml} +0 -0
  68. data/lib/roadforest/templates/distiller/{property_value.haml → property-value.haml} +0 -0
  69. data/lib/roadforest/templates/distiller/{property_values.haml → property-values.haml} +0 -0
  70. data/lib/roadforest/templates/min/{property_values.haml → property-values.haml} +0 -0
  71. data/lib/roadforest/templates/rdfpost-curie.haml +6 -0
  72. data/lib/roadforest/test-support/dispatcher-facade.rb +2 -0
  73. data/lib/roadforest/test-support/matchers.rb +169 -5
  74. data/lib/roadforest/test-support/remote-host.rb +2 -2
  75. data/lib/roadforest/type-handlers/handler.rb +74 -0
  76. data/lib/roadforest/type-handlers/jsonld.rb +34 -0
  77. data/lib/roadforest/type-handlers/rdf-handler.rb +36 -0
  78. data/lib/roadforest/{content-handling/type-handlers → type-handlers}/rdfa-writer.rb +2 -2
  79. data/lib/roadforest/{content-handling/type-handlers → type-handlers}/rdfa-writer/document-environment.rb +9 -8
  80. data/lib/roadforest/type-handlers/rdfa-writer/environment-decorator.rb +312 -0
  81. data/lib/roadforest/{content-handling/type-handlers → type-handlers}/rdfa-writer/object-environment.rb +3 -3
  82. data/lib/roadforest/{content-handling/type-handlers → type-handlers}/rdfa-writer/property-environment.rb +5 -11
  83. data/lib/roadforest/type-handlers/rdfa-writer/render-engine.rb +427 -0
  84. data/lib/roadforest/{content-handling/type-handlers → type-handlers}/rdfa-writer/render-environment.rb +33 -26
  85. data/lib/roadforest/{content-handling/type-handlers → type-handlers}/rdfa-writer/subject-environment.rb +7 -23
  86. data/lib/roadforest/type-handlers/rdfa.rb +73 -0
  87. data/lib/roadforest/type-handlers/rdfpost.rb +301 -0
  88. data/lib/roadforest/utility/class-registry.rb +23 -5
  89. data/spec/.ctrlp-root +0 -0
  90. data/spec/affordance-augmenter.rb +75 -0
  91. data/spec/affordances-flow.rb +438 -0
  92. data/spec/authorization.rb +34 -0
  93. data/spec/client.rb +13 -12
  94. data/spec/credence-annealer.rb +5 -5
  95. data/spec/focus-list.rb +8 -8
  96. data/spec/full-integration.rb +3 -3
  97. data/spec/graph-copier.rb +4 -4
  98. data/spec/graph-store.rb +19 -31
  99. data/spec/keychain.rb +82 -0
  100. data/spec/rdf-normalization.rb +2 -2
  101. data/spec/rdf-parcel.rb +3 -3
  102. data/spec/rdfa-handler.rb +514 -0
  103. data/spec/rdfpost.rb +96 -0
  104. data/spec/source-rigor.rb +57 -0
  105. data/spec/update-focus.rb +11 -10
  106. metadata +91 -66
  107. data/lib/roadforest/blob-model.rb +0 -53
  108. data/lib/roadforest/content-handling/type-handler.rb +0 -76
  109. data/lib/roadforest/content-handling/type-handlers/jsonld.rb +0 -36
  110. data/lib/roadforest/content-handling/type-handlers/rdf-handler.rb +0 -38
  111. data/lib/roadforest/content-handling/type-handlers/rdfa-writer/render-engine.rb +0 -574
  112. data/lib/roadforest/content-handling/type-handlers/rdfa.rb +0 -175
  113. data/lib/roadforest/content-handling/type-handlers/rdfpost.rb +0 -297
  114. data/lib/roadforest/model.rb +0 -209
  115. data/lib/roadforest/models.rb +0 -2
  116. data/lib/roadforest/rdf/source-rigor.rb +0 -44
  117. data/lib/roadforest/rdf/vocabulary.rb +0 -11
  118. data/lib/roadforest/resource/http/form-parsing.rb +0 -81
  119. data/lib/roadforest/resource/rdf.rb +0 -4
  120. data/spec/form-parsing.rb +0 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f4089bbfd4e58f956b5088ab646d62d904f11120
4
- data.tar.gz: ebbccc85db766f417254b23aee95d022392e1b58
3
+ metadata.gz: c6aad7c24680d035ff3f8a2a72d660888d400be6
4
+ data.tar.gz: 4ed267799005efaba995beab6a5adfff4e171021
5
5
  SHA512:
6
- metadata.gz: ecbf4fd992414ab2b73de911097455ef4712fbb9cb0c6f7bd7316a62abad9ca7b12ea5415b33817aaf9fc3bf83731500e684fe1099fa9ac217247ce94fe66883
7
- data.tar.gz: 0a4125f562e7c390e5a515e4e06ba9099bd50268fa596734de825bce26c038d85c612594bc2b4db5ec521506430db1797e4ba3d3e772604f71de3c2a314d0c07
6
+ metadata.gz: c1a97a99c84940a429ebf824b919704d336d21d28a7113c0663a35dbc37ee451be3af7a6913b45e915a75d0d1f5fbf69ef2cc6a684df1d3f5a389f65526f1d62
7
+ data.tar.gz: 986679ca8ed11258a435a0f7b14d9f79b91487e7a2ec16dc2712b944fac032c5bd037a511725f62bc350f3c770401558b0b54ae76955710ade5f613fa4338911
@@ -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, Models::Navigation
21
- router.add :unresolved_needs, ["unresolved_needs"], :parent, Models::UnresolvedNeedsList
22
- router.add_traced :need, ["needs",'*'], :leaf, Models::Need
23
- router.add :file_content, ["files","*"], :leaf, Models::NeedContent
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 Models
27
- class Navigation < RoadForest::RDFModel
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::RDFModel
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 = copy_model(graph, :need, '*' => [record.name])
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 NeedContent < RoadForest::BlobModel
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,3 @@
1
+ require 'roadforest-common'
2
+ require 'roadforest/remote-host'
3
+ require 'roadforest/source-rigor'
@@ -0,0 +1,2 @@
1
+ require 'roadforest/content-handling'
2
+ require 'roadforest/graph'
@@ -0,0 +1,7 @@
1
+ require 'roadforest-common'
2
+ require 'roadforest/server'
3
+ require 'roadforest/application'
4
+ require 'roadforest/augmentations'
5
+ require 'roadforest/authorization'
6
+ require 'roadforest/interfaces'
7
+ require 'roadforest/resource'
@@ -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/rdf'
10
- require 'roadforest/content-handling/engine'
11
- require 'roadforest/rdf/normalization'
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 RDF::Normalization
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
- @services.canonical_host = canonical_host
40
- @services.router = PathProvider.new(@dispatcher)
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 add_route(name, path_spec, resource_type, model_class, bindings = nil, &block)
19
- if trace_by_default
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 add_untraced_route(name, path_spec, resource_type, model_class, bindings = nil, &block)
28
- resource = bundle_typed_resource(resource_type, model_class, name)
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 add_traced_route(name, path_spec, resource_type, model_class, bindings = nil, &block)
34
- resource = bundle_traced_resource(resource_type, model_class, name)
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
- def resource_route(resource, name, path_spec, bindings)
40
- route = Route.new(path_spec, resource, bindings || {})
41
- yield route if block_given?
42
- @route_names[name] = route
43
- @routes << route
44
- route
45
- end
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
- def bundle_typed_resource(resource_type, model_class, route_name)
48
- resource_class = Resource.get(resource_type)
49
- Application::RouteAdapter.new(route_name, resource_class, model_class) do |adapter|
50
- adapter.application = application
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
- def bundle_traced_resource(resource_type, model_class, route_name)
55
- resource_class = Resource.get(resource_type)
56
- Application::RouteAdapter.new(route_name, resource_class, model_class) do |adapter|
57
- adapter.application = application
58
- adapter.trace = true
59
- end
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
- class Route < Webmachine::Dispatcher::Route
63
- # Create a complete URL for this route, doing any necessary variable
64
- # substitution.
65
- # @param [Hash] vars values for the path variables
66
- # @return [String] the valid URL for the route
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
- def build_params(vars = nil)
80
- vars ||= {}
81
- params = Application::Parameters.new
82
- path_set = Hash[path_spec.find_all{|segment| segment.is_a? Symbol}.map{|seg| [seg, true]}]
83
- vars.to_hash.each do |key, value|
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
@@ -1,6 +1,6 @@
1
1
  module RoadForest
2
2
  class Application
3
- #Parameters extracted from a URL, which a model object can use to identify
3
+ #Parameters extracted from a URL, which a interface object can use to identify
4
4
  #the resource being discussed
5
5
  class Parameters
6
6
  def initialize
@@ -22,10 +22,10 @@ module RoadForest
22
22
  Webmachine::Request.new(method, url, headers, body)
23
23
  end
24
24
 
25
- def model_for(name, vars = nil)
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.build_model(params)
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
- class RouteAdapter
4
- def initialize(route_name, resource_class, model_class)
5
- @resource_class = resource_class
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
- @route_name = route_name
8
- @model_class = model_class
9
- @application = nil
10
- @trace = false
11
- yield self if block_given?
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 = resource_class.new(request, response)
17
- resource.model = build_model(resource.params)
18
- resource.trace = trace
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 build_model(params)
23
- model_class.new(route_name, params, application.services)
23
+ def build_interface(params)
24
+ interface_builder.call(route_name, params, router, router.services)
24
25
  end
25
26
 
26
- def <(klass)
27
- if klass <= Webmachine::Resource
28
- return true
27
+ def trace?
28
+ if @trace.nil?
29
+ router.trace_by_default
29
30
  else
30
- return false
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