roadforest 0.1 → 0.5

Sign up to get free protection for your applications and to get access to all the features.
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