roadforest 0.0.1
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.
- data/examples/file-management.rb +98 -0
- data/lib/roadforest/application/dispatcher.rb +54 -0
- data/lib/roadforest/application/parameters.rb +39 -0
- data/lib/roadforest/application/path-provider.rb +18 -0
- data/lib/roadforest/application/route-adapter.rb +24 -0
- data/lib/roadforest/application/services-host.rb +10 -0
- data/lib/roadforest/application.rb +42 -0
- data/lib/roadforest/blob-model.rb +56 -0
- data/lib/roadforest/content-handling/engine.rb +113 -0
- data/lib/roadforest/content-handling/media-type.rb +222 -0
- data/lib/roadforest/content-handling/type-handlers/jsonld.rb +172 -0
- data/lib/roadforest/http/adapters/excon.rb +47 -0
- data/lib/roadforest/http/graph-response.rb +20 -0
- data/lib/roadforest/http/graph-transfer.rb +112 -0
- data/lib/roadforest/http/message.rb +91 -0
- data/lib/roadforest/model.rb +151 -0
- data/lib/roadforest/models.rb +2 -0
- data/lib/roadforest/rdf/context-fascade.rb +25 -0
- data/lib/roadforest/rdf/document.rb +23 -0
- data/lib/roadforest/rdf/focus-list.rb +19 -0
- data/lib/roadforest/rdf/focus-wrapping.rb +30 -0
- data/lib/roadforest/rdf/graph-copier.rb +16 -0
- data/lib/roadforest/rdf/graph-focus.rb +95 -0
- data/lib/roadforest/rdf/graph-reading.rb +145 -0
- data/lib/roadforest/rdf/graph-store.rb +217 -0
- data/lib/roadforest/rdf/investigation.rb +90 -0
- data/lib/roadforest/rdf/normalization.rb +150 -0
- data/lib/roadforest/rdf/parcel.rb +47 -0
- data/lib/roadforest/rdf/post-focus.rb +35 -0
- data/lib/roadforest/rdf/resource-pattern.rb +60 -0
- data/lib/roadforest/rdf/resource-query.rb +58 -0
- data/lib/roadforest/rdf/source-rigor/credence/any.rb +9 -0
- data/lib/roadforest/rdf/source-rigor/credence/none-if-role-absent.rb +19 -0
- data/lib/roadforest/rdf/source-rigor/credence/role-if-available.rb +19 -0
- data/lib/roadforest/rdf/source-rigor/credence-annealer.rb +22 -0
- data/lib/roadforest/rdf/source-rigor/credence.rb +29 -0
- data/lib/roadforest/rdf/source-rigor/http-investigator.rb +20 -0
- data/lib/roadforest/rdf/source-rigor/investigator.rb +17 -0
- data/lib/roadforest/rdf/source-rigor/null-investigator.rb +10 -0
- data/lib/roadforest/rdf/source-rigor.rb +44 -0
- data/lib/roadforest/rdf/update-focus.rb +73 -0
- data/lib/roadforest/rdf/vocabulary.rb +11 -0
- data/lib/roadforest/rdf.rb +6 -0
- data/lib/roadforest/remote-host.rb +96 -0
- data/lib/roadforest/resource/handlers.rb +43 -0
- data/lib/roadforest/resource/http/form-parsing.rb +81 -0
- data/lib/roadforest/resource/rdf/leaf-item.rb +21 -0
- data/lib/roadforest/resource/rdf/list.rb +19 -0
- data/lib/roadforest/resource/rdf/parent-item.rb +26 -0
- data/lib/roadforest/resource/rdf/read-only.rb +100 -0
- data/lib/roadforest/resource/rdf.rb +4 -0
- data/lib/roadforest/resource/role/has-children.rb +22 -0
- data/lib/roadforest/resource/role/writable.rb +43 -0
- data/lib/roadforest/server.rb +3 -0
- data/lib/roadforest/test-support/dispatcher-facade.rb +77 -0
- data/lib/roadforest/test-support/http-client.rb +151 -0
- data/lib/roadforest/test-support/matchers.rb +67 -0
- data/lib/roadforest/test-support/remote-host.rb +23 -0
- data/lib/roadforest/test-support/trace-formatter.rb +140 -0
- data/lib/roadforest/test-support.rb +2 -0
- data/lib/roadforest/utility/class-registry.rb +49 -0
- data/lib/roadforest.rb +2 -0
- data/spec/client.rb +152 -0
- data/spec/credence-annealer.rb +44 -0
- data/spec/graph-copier.rb +87 -0
- data/spec/graph-store.rb +142 -0
- data/spec/media-types.rb +14 -0
- data/spec/rdf-parcel.rb +158 -0
- data/spec/update-focus.rb +117 -0
- data/spec_support/gem_test_suite.rb +0 -0
- metadata +241 -0
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'roadforest/rdf'
|
2
|
+
require 'roadforest/rdf/normalization'
|
3
|
+
|
4
|
+
module RoadForest::RDF
|
5
|
+
class Parcel
|
6
|
+
include Normalization
|
7
|
+
|
8
|
+
attr_accessor :graph
|
9
|
+
|
10
|
+
def resources
|
11
|
+
resource_hash = {}
|
12
|
+
graph.each_subject do |subject|
|
13
|
+
next unless RDF::URI === subject
|
14
|
+
resource_hash[normalize_context(subject)] = true
|
15
|
+
end
|
16
|
+
resource_hash.keys
|
17
|
+
end
|
18
|
+
|
19
|
+
def subjects_for_resource(resource)
|
20
|
+
resource = normalize_context(resource)
|
21
|
+
graph.each_subject.find_all do |subject|
|
22
|
+
normalize_context(subject) == resource
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def graph_for(resource)
|
27
|
+
new_graph = RDF::Graph.new
|
28
|
+
subjects = {}
|
29
|
+
subjects_for_resource(resource).each do |subject|
|
30
|
+
subjects[subject] ||= :open
|
31
|
+
end
|
32
|
+
|
33
|
+
until (open_subjects = subjects.keys.find_all{|subject| subjects[subject] == :open }).empty?
|
34
|
+
open_subjects.each do |subject|
|
35
|
+
subjects[subject] = :closed
|
36
|
+
graph.query(:subject => subject) do |statement|
|
37
|
+
if RDF::Node === statement.object
|
38
|
+
subjects[statement.object] ||= :open
|
39
|
+
end
|
40
|
+
new_graph << statement
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
new_graph
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'roadforest/rdf/graph-focus'
|
2
|
+
|
3
|
+
module RoadForest::RDF
|
4
|
+
class PostFocus < GraphFocus
|
5
|
+
def initialize(subject = nil, graph = nil , rigor = nil)
|
6
|
+
super(subject, graph, rigor)
|
7
|
+
@graphs = {}
|
8
|
+
end
|
9
|
+
attr_accessor :graphs
|
10
|
+
|
11
|
+
def dup
|
12
|
+
other = super
|
13
|
+
other.graphs = graphs
|
14
|
+
other
|
15
|
+
end
|
16
|
+
|
17
|
+
def graph_transfer
|
18
|
+
source_rigor.graph_transfer
|
19
|
+
end
|
20
|
+
|
21
|
+
def post_to
|
22
|
+
graph = ::RDF::Graph.new
|
23
|
+
focus = GraphFocus.new(subject, graph, source_rigor) #XXX non-client version
|
24
|
+
graphs[subject] = graph
|
25
|
+
yield focus if block_given?
|
26
|
+
return focus
|
27
|
+
end
|
28
|
+
|
29
|
+
def send_graphs
|
30
|
+
@graphs.each_pair do |url, graph|
|
31
|
+
graph_transfer.post(url, graph)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'rdf/query/pattern'
|
2
|
+
require 'roadforest/rdf'
|
3
|
+
require 'roadforest/rdf/investigation'
|
4
|
+
|
5
|
+
module RoadForest::RDF
|
6
|
+
class ResourcePattern < ::RDF::Query::Pattern
|
7
|
+
def self.from(pattern, options)
|
8
|
+
pattern = case pattern
|
9
|
+
when self
|
10
|
+
pattern
|
11
|
+
when ::RDF::Query::Pattern
|
12
|
+
options ||= {}
|
13
|
+
self.new(pattern.subject, pattern.predicate, pattern.object, options.merge(:context => pattern.context))
|
14
|
+
when Array, ::RDF::Statement
|
15
|
+
options ||= {}
|
16
|
+
self.new(pattern[0], pattern[1], pattern[2], options.merge(:context => pattern[3]))
|
17
|
+
when Hash
|
18
|
+
options ||= {}
|
19
|
+
self.new(options.merge(pattern))
|
20
|
+
else
|
21
|
+
raise ArgumentError, "expected RoadForest::RDF::ResourcePattern, RDF::Query::Pattern, RDF::Statement, Hash, or Array, but got #{pattern.inspect}"
|
22
|
+
end
|
23
|
+
|
24
|
+
unless options.nil?
|
25
|
+
pattern.context_roles = options[:context_roles]
|
26
|
+
pattern.source_rigor = options[:source_rigor]
|
27
|
+
end
|
28
|
+
|
29
|
+
yield pattern if block_given?
|
30
|
+
|
31
|
+
pattern
|
32
|
+
end
|
33
|
+
|
34
|
+
attr_accessor :context_roles, :source_rigor
|
35
|
+
|
36
|
+
def execute(queryable, bindings = nil, query_context_roles = nil, &block)
|
37
|
+
unless queryable.is_a? RoadForest::RDF::GraphStore
|
38
|
+
return super(queryable, bindings || {}, &block)
|
39
|
+
end
|
40
|
+
|
41
|
+
investigation = Investigation.new
|
42
|
+
investigation.queryable = queryable
|
43
|
+
investigation.context_roles = (query_context_roles || {}).merge(context_roles)
|
44
|
+
investigation.source_rigor = source_rigor
|
45
|
+
|
46
|
+
results = investigation.result do |results|
|
47
|
+
super(queryable, bindings || {}) do |statement|
|
48
|
+
results << statement
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
results.each(&block) if block_given?
|
53
|
+
results
|
54
|
+
end
|
55
|
+
|
56
|
+
def context
|
57
|
+
@context ||= ::RDF::Query::Variable.new(:context)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'roadforest/rdf'
|
2
|
+
require 'rdf/query'
|
3
|
+
|
4
|
+
module RoadForest::RDF
|
5
|
+
class ResourceQuery < ::RDF::Query
|
6
|
+
def initialize(patterns = [], options = {}, &block)
|
7
|
+
@subject_context = options[:subject_context]
|
8
|
+
@source_rigor = options[:source_rigor]
|
9
|
+
super
|
10
|
+
patterns = @patterns.dup
|
11
|
+
@patterns.clear
|
12
|
+
patterns.each do |pattern|
|
13
|
+
pattern(pattern)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
attr_accessor :subject_context, :source_rigor
|
18
|
+
attr_accessor :patterns, :variables, :solutions, :options
|
19
|
+
|
20
|
+
def <<(pattern)
|
21
|
+
pattern(pattern)
|
22
|
+
end
|
23
|
+
|
24
|
+
def pattern(pattern, options = nil)
|
25
|
+
options = {
|
26
|
+
:context_roles => {:subject => subject_context},
|
27
|
+
:source_rigor => source_rigor
|
28
|
+
}.merge(options || {})
|
29
|
+
|
30
|
+
@patterns << ResourcePattern.from(pattern, options)
|
31
|
+
self
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.from(other, subject_context = nil, source_rigor = nil)
|
35
|
+
query = self.new
|
36
|
+
|
37
|
+
if subject_context.nil? and other.respond_to?(:subject_context)
|
38
|
+
query.subject_context = other.subject_context
|
39
|
+
else
|
40
|
+
query.subject_context = subject_context
|
41
|
+
end
|
42
|
+
|
43
|
+
if source_rigor.nil? and other.respond_to?(:source_rigor)
|
44
|
+
query.source_rigor = other.source_rigor
|
45
|
+
else
|
46
|
+
query.source_rigor = source_rigor
|
47
|
+
end
|
48
|
+
|
49
|
+
other.patterns.each do |pattern|
|
50
|
+
query.pattern(pattern)
|
51
|
+
end
|
52
|
+
query.variables = other.variables
|
53
|
+
query.solutions = other.solutions
|
54
|
+
query.options = other.options
|
55
|
+
return query
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
class RoadForest::RDF::SourceRigor
|
2
|
+
module Credence
|
3
|
+
#Unless we have results for the subject context, nothing is valid
|
4
|
+
class NoneIfRoleAbsent
|
5
|
+
def initialize(role)
|
6
|
+
@role = role
|
7
|
+
end
|
8
|
+
attr_reader :role
|
9
|
+
|
10
|
+
def credible(contexts, results)
|
11
|
+
if contexts.include?(results.context_roles[role])
|
12
|
+
contexts
|
13
|
+
else
|
14
|
+
[]
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
class RoadForest::RDF::SourceRigor
|
2
|
+
module Credence
|
3
|
+
#If there are any results for the subject context, they're good
|
4
|
+
class RoleIfAvailable
|
5
|
+
def initialize(role)
|
6
|
+
@role = role
|
7
|
+
end
|
8
|
+
attr_reader :role
|
9
|
+
|
10
|
+
def credible(contexts, results)
|
11
|
+
if contexts.include?(results.context_roles[role])
|
12
|
+
[results.context_roles[role]]
|
13
|
+
else
|
14
|
+
contexts
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'roadforest/rdf'
|
2
|
+
|
3
|
+
class RoadForest::RDF::SourceRigor
|
4
|
+
class CredenceAnnealer
|
5
|
+
def initialize(graph)
|
6
|
+
@graph = graph
|
7
|
+
@attempts = 5
|
8
|
+
end
|
9
|
+
|
10
|
+
attr_accessor :attempts
|
11
|
+
|
12
|
+
def resolve(&block)
|
13
|
+
attempts = @attempts
|
14
|
+
|
15
|
+
begin
|
16
|
+
raise "Annealing failed after #@attempts attempts" if (attempts -= 1) < 0
|
17
|
+
@graph.next_impulse
|
18
|
+
block.call
|
19
|
+
end until @graph.quiet_impulse?
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
class RoadForest::RDF::SourceRigor
|
2
|
+
module Credence
|
3
|
+
require 'roadforest/rdf/source-rigor/credence/role-if-available'
|
4
|
+
require 'roadforest/rdf/source-rigor/credence/any'
|
5
|
+
require 'roadforest/rdf/source-rigor/credence/none-if-role-absent'
|
6
|
+
|
7
|
+
def self.policies
|
8
|
+
@policies ||= {
|
9
|
+
:any => Any.new,
|
10
|
+
:may_subject => RoleIfAvailable.new(:subject),
|
11
|
+
:must_subject => NoneIfRoleAbsent.new(:subject),
|
12
|
+
:may_local => RoleIfAvailable.new(:local),
|
13
|
+
:must_local => NoneIfRoleAbsent.new(:local)
|
14
|
+
}
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.policy(name)
|
18
|
+
if block_given?
|
19
|
+
policies[name] ||= yield
|
20
|
+
else
|
21
|
+
begin
|
22
|
+
policies.fetch(name)
|
23
|
+
rescue KeyError
|
24
|
+
raise "No Credence policy for #{name.inspect} (available named policies are #{policies.keys.inspect})"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'roadforest/rdf/source-rigor/investigator'
|
2
|
+
class RoadForest::RDF::SourceRigor
|
3
|
+
class HTTPInvestigator < Investigator
|
4
|
+
register :http
|
5
|
+
|
6
|
+
def pursue(investigation)
|
7
|
+
response = investigation.make_request("GET", investigation.context_roles[:subject])
|
8
|
+
case response.status
|
9
|
+
when (200..299)
|
10
|
+
investigation.insert_graph(response.url, response.graph)
|
11
|
+
when (300..399)
|
12
|
+
#client should follow redirects
|
13
|
+
when (400..499)
|
14
|
+
when (500..599)
|
15
|
+
raise NotCredible #hrm
|
16
|
+
end
|
17
|
+
rescue NotCredible
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'roadforest/utility/class-registry'
|
2
|
+
|
3
|
+
class RoadForest::RDF::SourceRigor
|
4
|
+
class NotCredible < StandardError; end
|
5
|
+
class NoCredibleResults < StandardError; end
|
6
|
+
|
7
|
+
class Investigator
|
8
|
+
extend ::RoadForest::Utility::ClassRegistry::Registrar
|
9
|
+
def self.registry_purpose; "investigator"; end
|
10
|
+
|
11
|
+
def pursue(investigation)
|
12
|
+
raise NoCredibleResults
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
require 'roadforest/rdf/source-rigor/null-investigator'
|
17
|
+
require 'roadforest/rdf/source-rigor/http-investigator'
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'roadforest'
|
2
|
+
|
3
|
+
module RoadForest::RDF
|
4
|
+
class SourceRigor
|
5
|
+
require 'roadforest/rdf/source-rigor/investigator'
|
6
|
+
require 'roadforest/rdf/source-rigor/credence'
|
7
|
+
|
8
|
+
class << self
|
9
|
+
def simple
|
10
|
+
rigor = self.new
|
11
|
+
rigor.policy_list(:must_local, :may_local)
|
12
|
+
rigor.investigator_list(:null)
|
13
|
+
rigor
|
14
|
+
end
|
15
|
+
|
16
|
+
def http
|
17
|
+
rigor = self.new
|
18
|
+
rigor.policy_list(:may_subject, :any) #XXX
|
19
|
+
rigor.investigator_list(:http, :null)
|
20
|
+
rigor
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def initialize
|
25
|
+
@investigators = []
|
26
|
+
@investigation_limit = 3
|
27
|
+
@credence_policies = []
|
28
|
+
end
|
29
|
+
|
30
|
+
attr_accessor :graph_transfer, :investigators, :investigation_limit, :credence_policies
|
31
|
+
|
32
|
+
def policy_list(*names)
|
33
|
+
self.credence_policies = names.map do |name|
|
34
|
+
Credence.policy(name)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def investigator_list(*names)
|
39
|
+
self.investigators = names.map do |name|
|
40
|
+
Investigator[name].new
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require 'roadforest/rdf/graph-focus'
|
2
|
+
require 'roadforest/rdf/parcel'
|
3
|
+
|
4
|
+
module RoadForest::RDF
|
5
|
+
class UpdateFocus < GraphFocus
|
6
|
+
attr_accessor :target_graph
|
7
|
+
|
8
|
+
alias source_graph= graph=
|
9
|
+
alias source_graph graph
|
10
|
+
|
11
|
+
def dup
|
12
|
+
other = super
|
13
|
+
other.target_graph = target_graph
|
14
|
+
other
|
15
|
+
end
|
16
|
+
|
17
|
+
def parceller
|
18
|
+
@parceller ||=
|
19
|
+
begin
|
20
|
+
parceller = Parcel.new
|
21
|
+
parceller.graph = source_graph
|
22
|
+
parceller
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def copy_context
|
27
|
+
unless target_graph.has_context?(root_url)
|
28
|
+
parceller.graph_for(root_url).each_statement do |statement|
|
29
|
+
statement.context = root_url
|
30
|
+
target_graph << statement
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def add(property, value, extra=nil)
|
36
|
+
copy_context
|
37
|
+
property, value = normalize_triple(property, value, extra)
|
38
|
+
target_graph.insert([subject, property, value, root_url])
|
39
|
+
end
|
40
|
+
|
41
|
+
def set(property, value, extra=nil)
|
42
|
+
copy_context
|
43
|
+
super
|
44
|
+
end
|
45
|
+
|
46
|
+
def delete(property, extra=nil)
|
47
|
+
copy_context
|
48
|
+
property, value = normalize_triple(property, value, extra)
|
49
|
+
target_graph.query([subject, property]) do |statement|
|
50
|
+
target_graph.delete(statement)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def query_value(query)
|
55
|
+
source_result = super
|
56
|
+
target_result = query.execute(target_graph).map do |solution|
|
57
|
+
unwrap_value(solution.value)
|
58
|
+
end
|
59
|
+
|
60
|
+
if target_result.empty?
|
61
|
+
source_result
|
62
|
+
else
|
63
|
+
target_result
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def wrap_node(value)
|
68
|
+
focus = super
|
69
|
+
focus.target_graph = self.target_graph
|
70
|
+
focus
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
require 'roadforest/rdf/source-rigor'
|
2
|
+
require 'roadforest/rdf/source-rigor/credence-annealer'
|
3
|
+
require 'roadforest/http/graph-transfer'
|
4
|
+
require 'roadforest/http/adapters/excon'
|
5
|
+
require 'roadforest/rdf/graph-store'
|
6
|
+
|
7
|
+
module RoadForest
|
8
|
+
class RemoteHost
|
9
|
+
include RDF::Normalization
|
10
|
+
|
11
|
+
def initialize(well_known_url)
|
12
|
+
@url = normalize_resource(well_known_url)
|
13
|
+
@graph = build_graph_store
|
14
|
+
end
|
15
|
+
|
16
|
+
def build_graph_store
|
17
|
+
RDF::GraphStore.new
|
18
|
+
end
|
19
|
+
|
20
|
+
attr_writer :http_client
|
21
|
+
def http_client
|
22
|
+
@http_client ||= HTTP::ExconAdapter.new(@url)
|
23
|
+
end
|
24
|
+
|
25
|
+
def graph_transfer
|
26
|
+
@graph_transfer ||= HTTP::GraphTransfer.new.tap do |transfer|
|
27
|
+
transfer.http_client = http_client
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def source_rigor
|
32
|
+
@source_rigor ||=
|
33
|
+
begin
|
34
|
+
rigor = RDF::SourceRigor.http
|
35
|
+
rigor.graph_transfer = graph_transfer
|
36
|
+
rigor
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def render_graph(graph)
|
41
|
+
Resource::ContentType::JSONLD.from_graph(graph)
|
42
|
+
end
|
43
|
+
|
44
|
+
def anneal(focus)
|
45
|
+
annealer = RDF::SourceRigor::CredenceAnnealer.new(@graph)
|
46
|
+
annealer.resolve do
|
47
|
+
yield focus
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def putting(&block)
|
52
|
+
require 'roadforest/rdf/update-focus'
|
53
|
+
target_graph = ::RDF::Repository.new
|
54
|
+
updater = RDF::UpdateFocus.new(@url, @graph, source_rigor)
|
55
|
+
updater.target_graph = target_graph
|
56
|
+
|
57
|
+
anneal(updater, &block)
|
58
|
+
|
59
|
+
target_graph.each_context do |context|
|
60
|
+
graph = ::RDF::Graph.new(context, :data => target_graph)
|
61
|
+
graph_transfer.put(context, graph)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def posting(&block)
|
66
|
+
require 'roadforest/rdf/post-focus'
|
67
|
+
poster = RDF::PostFocus.new(@url, @graph, source_rigor)
|
68
|
+
|
69
|
+
anneal(poster, &block)
|
70
|
+
|
71
|
+
poster.send_graphs
|
72
|
+
end
|
73
|
+
|
74
|
+
def getting(&block)
|
75
|
+
reader = RDF::GraphReading.new(@url, @graph, source_rigor)
|
76
|
+
|
77
|
+
anneal(reader, &block)
|
78
|
+
end
|
79
|
+
|
80
|
+
def put_file(destination, type, io)
|
81
|
+
if destination.respond_to?(:to_context)
|
82
|
+
destination = destination.to_context
|
83
|
+
elsif destination.respond_to?(:to_s)
|
84
|
+
destination = destination.to_s
|
85
|
+
end
|
86
|
+
request = HTTP::Request.new("PUT", destination)
|
87
|
+
request.body = io
|
88
|
+
request.headers["Content-Type"] = type
|
89
|
+
response = http_client.do_request request
|
90
|
+
end
|
91
|
+
|
92
|
+
#TODO:
|
93
|
+
#def deleting
|
94
|
+
#def patching
|
95
|
+
end
|
96
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'roadforest/application/route-adapter'
|
2
|
+
|
3
|
+
module RoadForest
|
4
|
+
module Resource
|
5
|
+
module Handlers
|
6
|
+
def self.registry
|
7
|
+
@registry ||= {}
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.register(handler_type, klass)
|
11
|
+
registry[handler_type] = klass
|
12
|
+
|
13
|
+
method_name = "#{handler_type}_model"
|
14
|
+
define_method(method_name) do |model_class|
|
15
|
+
if block_given?
|
16
|
+
bundle_model(klass, model_class){|model| yield(model)}
|
17
|
+
else
|
18
|
+
bundle_model(klass, model_class)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def bundle(resource_class, &block)
|
24
|
+
Application::RouteAdapter.new(resource_class, &block)
|
25
|
+
end
|
26
|
+
|
27
|
+
def bundle_typed_resource(resource_type, model_class, route_name)
|
28
|
+
resource_class = Resource::Handlers.registry.fetch(resource_type)
|
29
|
+
bundle(resource_class) do |resource, request, response|
|
30
|
+
resource.model = model_class.new(route_name, resource.params, services)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def bundle_traced_resource(resource_type, model_class, route_name)
|
35
|
+
resource_class = Resource::Handlers.registry.fetch(resource_type)
|
36
|
+
bundle(resource_class) do |resource, request, response|
|
37
|
+
resource.model = model_class.new(route_name, resource.params, services)
|
38
|
+
resource.trace = true
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|