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
@@ -26,10 +26,6 @@ module RoadForest
26
26
  end
27
27
  end
28
28
 
29
- def type_handling
30
- @type_handling ||= ContentHandling::Engine.default
31
- end
32
-
33
29
  def logger
34
30
  @logger ||=
35
31
  begin
@@ -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::MediaType::Handlers::Wrap::Parse.new(type, object)
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::MediaType::Handlers::Wrap::Render.new(type, object)
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 MediaType
3
- module Handlers
4
- module Wrap
5
- class Wrapper
6
- def initialize(type, handler)
7
- @type = type
8
- @handler = handler
9
- end
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
- def local_to_network(base_uri, network)
13
- @handler.local_to_network(base_uri, network)
14
- end
15
- alias from_graph local_to_network
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
- def network_to_local(base_uri, source)
18
- @handler.network_to_local(base_uri, source)
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
- class Render < Wrapper
24
- def call(resource)
25
- @handler.render_for(resource)
26
- end
22
+ class Render < Wrapper
23
+ def call(resource)
24
+ @handler.render_for(resource)
25
+ end
27
26
 
28
- def content_type_header
29
- @type.content_type_header
30
- end
27
+ def content_type_header
28
+ @type.content_type_header
31
29
  end
30
+ end
32
31
 
33
- class Parse < Wrapper
34
- def call(resource)
35
- @handler.parse_for(resource)
36
- end
32
+ class Parse < Wrapper
33
+ def call(resource)
34
+ @handler.parse_for(resource)
35
+ end
37
36
 
38
- def add_child(resource)
39
- @handler.add_child_to(resource)
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,