roadforest 0.1 → 0.5
Sign up to get free protection for your applications and to get access to all the features.
- 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
@@ -0,0 +1,78 @@
|
|
1
|
+
require 'roadforest/augment/augmentation'
|
2
|
+
require 'roadforest/graph/vocabulary'
|
3
|
+
|
4
|
+
module RoadForest
|
5
|
+
module Augment
|
6
|
+
module Affordance
|
7
|
+
Af = Graph::Af
|
8
|
+
|
9
|
+
class Remove < Augmentation
|
10
|
+
register_for_subjects
|
11
|
+
|
12
|
+
def apply(term)
|
13
|
+
if term.resource.allowed_methods.include?("DELETE")
|
14
|
+
node = ::RDF::Node.new
|
15
|
+
yield [node, ::RDF.type, Af.Remove]
|
16
|
+
yield [node, Af.target, term.uri]
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class Links < Augmentation
|
22
|
+
register_for_subjects
|
23
|
+
register_for_objects
|
24
|
+
|
25
|
+
def apply(term)
|
26
|
+
if term.uri.host != canonical_uri.hostname
|
27
|
+
return
|
28
|
+
end
|
29
|
+
|
30
|
+
case term.resource
|
31
|
+
when Webmachine::Dispatcher::NotFoundResource
|
32
|
+
node = ::RDF::Node.new
|
33
|
+
yield [node, ::RDF.type, Af.Null]
|
34
|
+
yield [node, Af.target, term.uri]
|
35
|
+
else
|
36
|
+
if term.resource.allowed_methods.include?("GET")
|
37
|
+
embeddable = ContentHandling::MediaTypeList.build(["image/jpeg"])
|
38
|
+
|
39
|
+
if embeddable.matches?(term.type_list)
|
40
|
+
node = ::RDF::Node.new
|
41
|
+
yield [node, ::RDF.type, Af.Embed]
|
42
|
+
yield [node, Af.target, term.uri]
|
43
|
+
else
|
44
|
+
node = ::RDF::Node.new
|
45
|
+
yield [node, ::RDF.type, Af.Navigate]
|
46
|
+
yield [node, Af.target, term.uri]
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
class Update < Augmentation
|
54
|
+
register_for_subjects
|
55
|
+
|
56
|
+
def apply(term)
|
57
|
+
if term.resource.allowed_methods.include?("PUT")
|
58
|
+
node = ::RDF::Node.new
|
59
|
+
yield [node, ::RDF.type, Af.Update]
|
60
|
+
yield [node, Af.target, term.uri]
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
class Create < Augmentation
|
66
|
+
register_for_subjects
|
67
|
+
|
68
|
+
def apply(term)
|
69
|
+
if term.resource.allowed_methods.include?("POST")
|
70
|
+
node = ::RDF::Node.new
|
71
|
+
yield [node, ::RDF.type, Af.Create]
|
72
|
+
yield [node, Af.target, term.uri]
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
require 'roadforest/augment/augmenter'
|
2
|
+
module RoadForest
|
3
|
+
module Augment
|
4
|
+
class Augmentation
|
5
|
+
def self.register_for_subjects
|
6
|
+
Augmenter.subject_augmentations_registry.add(self.name, self)
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.register_for_objects
|
10
|
+
Augmenter.object_augmentations_registry.add(self.name, self)
|
11
|
+
end
|
12
|
+
|
13
|
+
def initialize(augmenter)
|
14
|
+
@augmenter = augmenter
|
15
|
+
end
|
16
|
+
|
17
|
+
def canonical_uri
|
18
|
+
@augmenter.canonical_uri
|
19
|
+
end
|
20
|
+
|
21
|
+
def router
|
22
|
+
@augmenter.router
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
class LazyResource
|
27
|
+
def initialize(uri, router)
|
28
|
+
@uri = uri
|
29
|
+
@router = router
|
30
|
+
end
|
31
|
+
|
32
|
+
attr_accessor :uri, :router
|
33
|
+
|
34
|
+
def request
|
35
|
+
@request ||= Webmachine::Request.new("GET", uri, {}, nil)
|
36
|
+
end
|
37
|
+
|
38
|
+
def response
|
39
|
+
@response ||= Webmachine::Response.new
|
40
|
+
end
|
41
|
+
|
42
|
+
def route
|
43
|
+
@route ||= router.find_route(request)
|
44
|
+
end
|
45
|
+
|
46
|
+
def resource
|
47
|
+
@resource ||= router.find_resource(request, response)
|
48
|
+
end
|
49
|
+
|
50
|
+
def type_list
|
51
|
+
@type_list ||=
|
52
|
+
resource.content_types_provided.inject(ContentHandling::MediaTypeList.new) do |list, (type, method)|
|
53
|
+
list.add_header_val(type)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
class Process
|
59
|
+
attr_accessor :base_graph, :subjects
|
60
|
+
|
61
|
+
def initialize(base_graph)
|
62
|
+
@base_graph = base_graph
|
63
|
+
end
|
64
|
+
|
65
|
+
def target_graph
|
66
|
+
@target_graph ||=
|
67
|
+
begin
|
68
|
+
::RDF::Repository.new.tap do |graph|
|
69
|
+
base_graph.each_statement do |stmt|
|
70
|
+
graph << stmt
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def subjects
|
77
|
+
@subjects ||= base_graph.subjects.select{|obj| ::RDF::URI === obj }
|
78
|
+
end
|
79
|
+
|
80
|
+
def objects
|
81
|
+
@objects ||= base_graph.objects.select{|obj| ::RDF::URI === obj}
|
82
|
+
end
|
83
|
+
|
84
|
+
def subject_resources(router)
|
85
|
+
subjects.map do |uri|
|
86
|
+
LazyResource.new(uri, router)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def object_resources(router)
|
91
|
+
objects.map do |uri|
|
92
|
+
LazyResource.new(uri, router)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'rdf'
|
2
|
+
require 'roadforest/utility/class-registry'
|
3
|
+
|
4
|
+
module RoadForest
|
5
|
+
module Augment
|
6
|
+
class Augmenter
|
7
|
+
attr_accessor :router
|
8
|
+
|
9
|
+
def self.subject_augmentations_registry
|
10
|
+
@subject_registry ||= Utility::ClassRegistry.new(self, "subject augmentation")
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.object_augmentations_registry
|
14
|
+
@object_registry ||= Utility::ClassRegistry.new(self, "object augmentation")
|
15
|
+
end
|
16
|
+
|
17
|
+
def subject_augmentations
|
18
|
+
self.class.subject_augmentations_registry.map_classes do |klass|
|
19
|
+
klass.new(self)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def object_augmentations
|
24
|
+
self.class.object_augmentations_registry.map_classes do |klass|
|
25
|
+
klass.new(self)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
attr_accessor :canonical_uri
|
30
|
+
|
31
|
+
def augment(graph)
|
32
|
+
augmenting = Augment::Process.new(graph)
|
33
|
+
|
34
|
+
augmenting.subject_resources(router).each do |resource|
|
35
|
+
subject_augmentations.each do |augmentation|
|
36
|
+
augmentation.apply(resource) do |statement|
|
37
|
+
augmenting.target_graph << statement
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
augmenting.object_resources(router).each do |resource|
|
43
|
+
object_augmentations.each do |augmentation|
|
44
|
+
augmentation.apply(resource) do |statement|
|
45
|
+
augmenting.target_graph << statement
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
augmenting.target_graph
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'roadforest/augment/affordance'
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'roadforest/content-handling/common-engines'
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'roadforest/content-handling/engine'
|
2
|
+
|
3
|
+
module RoadForest
|
4
|
+
module ContentHandling
|
5
|
+
class << self
|
6
|
+
def rdf_engine
|
7
|
+
@rdf_engine ||=
|
8
|
+
begin
|
9
|
+
require 'roadforest/type-handlers/jsonld'
|
10
|
+
require 'roadforest/type-handlers/rdfa'
|
11
|
+
rdfa = RoadForest::TypeHandlers::RDFa.new
|
12
|
+
jsonld = RoadForest::TypeHandlers::JSONLD.new
|
13
|
+
|
14
|
+
ContentHandling::Engine.new.tap do |engine|
|
15
|
+
engine.add rdfa, "text/html;q=1;rdfa=1"
|
16
|
+
engine.add rdfa, "application/xhtml+xml;q=1;rdfa=1"
|
17
|
+
engine.add jsonld, "application/ld+json"
|
18
|
+
engine.add rdfa, "text/html;q=0.5"
|
19
|
+
engine.add rdfa, "application/xhtml+xml;q=0.5"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def plaintext_engine
|
25
|
+
@plaintext_engine ||=
|
26
|
+
begin
|
27
|
+
require 'roadforest/type-handlers/handler'
|
28
|
+
text = RoadForest::TypeHandlers::Handler.new
|
29
|
+
|
30
|
+
ContentHandling::Engine.new.tap do |engine|
|
31
|
+
engine.add text, "text/plain"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
# @warning This is only the most nebulous beginning of image handling
|
37
|
+
def images_engine
|
38
|
+
@image_engine ||=
|
39
|
+
begin
|
40
|
+
require 'roadforest/type-handlers/handler'
|
41
|
+
data = RoadForest::TypeHandlers::Handler.new
|
42
|
+
|
43
|
+
RoadForest::ContentHandling::Engine.new.tap do |engine|
|
44
|
+
engine.add data, "image/jpeg"
|
45
|
+
engine.add data, "image/png;q=0.9"
|
46
|
+
engine.add data, "image/gif;q=0.7"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
# @warning This is only the most nebulous beginning of image handling
|
52
|
+
def graphics_engine
|
53
|
+
@graphics_engine ||=
|
54
|
+
begin
|
55
|
+
require 'roadforest/type-handlers/handler'
|
56
|
+
data = RoadForest::TypeHandlers::Handler.new
|
57
|
+
|
58
|
+
RoadForest::ContentHandling::Engine.new.tap do |engine|
|
59
|
+
engine.add data, "image/png"
|
60
|
+
engine.add data, "image/gif;q=0.9"
|
61
|
+
engine.add data, "image/jpeg;q=0.7"
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -46,18 +46,6 @@ module RoadForest
|
|
46
46
|
end
|
47
47
|
end
|
48
48
|
|
49
|
-
def self.default
|
50
|
-
require 'roadforest/content-handling/type-handlers/jsonld'
|
51
|
-
require 'roadforest/content-handling/type-handlers/rdfa'
|
52
|
-
self.new.tap do |engine|
|
53
|
-
engine.add RoadForest::MediaType::Handlers::RDFa.new, "text/html;q=1;rdfa=1"
|
54
|
-
engine.add RoadForest::MediaType::Handlers::RDFa.new, "application/xhtml+xml;q=1;rdfa=1"
|
55
|
-
engine.add RoadForest::MediaType::Handlers::JSONLD.new, "application/ld+json"
|
56
|
-
engine.add RoadForest::MediaType::Handlers::RDFa.new, "text/html;q=0.5"
|
57
|
-
engine.add RoadForest::MediaType::Handlers::RDFa.new, "application/xhtml+xml;q=0.5"
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
49
|
def initialize
|
62
50
|
@renderers = TypeHandlerList.new("provide")
|
63
51
|
@parsers = TypeHandlerList.new("accept")
|
@@ -74,14 +62,14 @@ module RoadForest
|
|
74
62
|
|
75
63
|
def add_parser(object, type)
|
76
64
|
type = MediaType.parse(type)
|
77
|
-
wrapper = RoadForest::
|
65
|
+
wrapper = RoadForest::ContentHandling::Wrap::Parse.new(type, object)
|
78
66
|
parsers.add(wrapper)
|
79
67
|
end
|
80
68
|
alias accept add_parser
|
81
69
|
|
82
70
|
def add_renderer(object, type)
|
83
71
|
type = MediaType.parse(type)
|
84
|
-
wrapper = RoadForest::
|
72
|
+
wrapper = RoadForest::ContentHandling::Wrap::Render.new(type, object)
|
85
73
|
renderers.add(wrapper)
|
86
74
|
end
|
87
75
|
alias provide add_renderer
|
@@ -1,43 +1,41 @@
|
|
1
1
|
module RoadForest
|
2
|
-
module
|
3
|
-
module
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
attr_reader :type, :handler
|
2
|
+
module ContentHandling
|
3
|
+
module Wrap
|
4
|
+
class Wrapper
|
5
|
+
def initialize(type, handler)
|
6
|
+
@type = type
|
7
|
+
@handler = handler
|
8
|
+
end
|
9
|
+
attr_reader :type, :handler
|
11
10
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
11
|
+
def local_to_network(base_uri, network)
|
12
|
+
@handler.local_to_network(base_uri, network)
|
13
|
+
end
|
14
|
+
alias from_graph local_to_network
|
16
15
|
|
17
|
-
|
18
|
-
|
19
|
-
end
|
20
|
-
alias to_graph network_to_local
|
16
|
+
def network_to_local(base_uri, source)
|
17
|
+
@handler.network_to_local(base_uri, source)
|
21
18
|
end
|
19
|
+
alias to_graph network_to_local
|
20
|
+
end
|
22
21
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
22
|
+
class Render < Wrapper
|
23
|
+
def call(resource)
|
24
|
+
@handler.render_for(resource)
|
25
|
+
end
|
27
26
|
|
28
|
-
|
29
|
-
|
30
|
-
end
|
27
|
+
def content_type_header
|
28
|
+
@type.content_type_header
|
31
29
|
end
|
30
|
+
end
|
32
31
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
32
|
+
class Parse < Wrapper
|
33
|
+
def call(resource)
|
34
|
+
@handler.parse_for(resource)
|
35
|
+
end
|
37
36
|
|
38
|
-
|
39
|
-
|
40
|
-
end
|
37
|
+
def add_child(resource)
|
38
|
+
@handler.add_child_to(resource)
|
41
39
|
end
|
42
40
|
end
|
43
41
|
end
|
@@ -190,6 +190,11 @@ module RoadForest
|
|
190
190
|
end
|
191
191
|
end
|
192
192
|
|
193
|
+
def matches?(other)
|
194
|
+
type = best_match_from(other)
|
195
|
+
include?(type) && other.include?(type)
|
196
|
+
end
|
197
|
+
|
193
198
|
def by_precedence
|
194
199
|
self.sort do |left, right|
|
195
200
|
right.precedence_index <=> left.precedence_index
|
@@ -201,6 +206,7 @@ module RoadForest
|
|
201
206
|
# @param [String] choice the acceptable item
|
202
207
|
def add(type)
|
203
208
|
@list << type
|
209
|
+
self
|
204
210
|
end
|
205
211
|
|
206
212
|
# Given a raw acceptable value from an acceptance header,
|