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
@@ -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,