sadi-rb 0.0.1 → 0.0.2
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.
- checksums.yaml +4 -4
- data/Gemfile +5 -0
- data/README.md +46 -4
- data/Rakefile +2 -1
- data/bin/sadi-rb +4 -0
- data/lib/sadi-rb/converter.rb +1 -0
- data/lib/sadi-rb/example_service.rb +4 -1
- data/lib/sadi-rb/server.rb +44 -6
- data/lib/sadi-rb/services.rb +35 -0
- data/lib/sadi-rb/synchronous_service.rb +18 -0
- data/lib/sadi-rb.rb +4 -0
- data/sadi-rb.gemspec +84 -0
- metadata +20 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ab2044de34253723c4b946f38ffd1aa6c05ecc4f
|
4
|
+
data.tar.gz: 0f6b13b3ee863ab5cf5fe751c4511f7ceacc44f0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4282d1f8e806189166e83517603e57a4718d4a55e7d528c359f1e3b4778c10fdb107fc765a070e3faf336bd89e7790aa8eb5e0502844af1212e8a40a5f2b7d36
|
7
|
+
data.tar.gz: ba25e5a446f0229053c126cefbe0cc3b4caba059214f81efc0841d6d941b00566de933c164e4d6212e7390586ef4e29e70d4ca7d5af9367a715a738e0cae68d4
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,10 +1,21 @@
|
|
1
1
|
# sadi-rb
|
2
2
|
|
3
|
+
### Installation
|
4
|
+
`gem install sadi-rb`
|
5
|
+
|
6
|
+
or clone the repository and run `rake install` for the latest version
|
7
|
+
|
8
|
+
### Description
|
9
|
+
|
3
10
|
Write [SADI] Services in Ruby, then host them as a Sinatra server
|
4
11
|
|
5
|
-
Currently only supports synchronous
|
12
|
+
Currently only supports [synchronous] service have been implemented.
|
13
|
+
|
14
|
+
### Usage
|
6
15
|
|
7
|
-
To
|
16
|
+
To test the server, use the gem's executable `sadi-rb`. This will start the server on [http://localhost:4567](http://localhost:4567), and load the [demo service].
|
17
|
+
|
18
|
+
The server can also be run as part of a script using
|
8
19
|
|
9
20
|
```ruby
|
10
21
|
require 'sadi-rb'
|
@@ -12,7 +23,37 @@ require 'sadi-rb'
|
|
12
23
|
SADI::Server.run!
|
13
24
|
```
|
14
25
|
|
15
|
-
|
26
|
+
### Writing your own services
|
27
|
+
|
28
|
+
To create an asynchronous service, simply extend the `SADI::SynchronousService` module and implement the interface methods it requires;
|
29
|
+
|
30
|
+
```ruby
|
31
|
+
require 'sadi-rb'
|
32
|
+
|
33
|
+
Class MyService
|
34
|
+
def service_name
|
35
|
+
"my_service_name"
|
36
|
+
end
|
37
|
+
|
38
|
+
def service_description
|
39
|
+
# an RDF::Graph of your service's description
|
40
|
+
end
|
41
|
+
|
42
|
+
def service_owl
|
43
|
+
# an RDF::Graph of your service's OWL classes
|
44
|
+
end
|
45
|
+
|
46
|
+
def process_object(input_graph, owl_object)
|
47
|
+
# Service logic goes here
|
48
|
+
|
49
|
+
# Should return an RDF::Graph of
|
50
|
+
# the output for the resource specified by the URI owl_object,
|
51
|
+
# from the RDF::Graph input_graph
|
52
|
+
end
|
53
|
+
end
|
54
|
+
```
|
55
|
+
|
56
|
+
Although SADI can theoretically use any vocabulary for its service description, the gem internals currently require that you use the [mygrid ontology] in implementing your `service_description` method
|
16
57
|
|
17
58
|
## Contributing to sadi-rb
|
18
59
|
|
@@ -30,4 +71,5 @@ Copyright (c) 2013 Will Strinz. See LICENSE.txt for
|
|
30
71
|
further details.
|
31
72
|
|
32
73
|
[demo service]: http://sadiframework.org/content/how-sadi-works/synchronous-sadi-services/
|
33
|
-
[SADI]: http://sadiframework.org
|
74
|
+
[SADI]: http://sadiframework.org
|
75
|
+
[mygrid ontology]: http://www.mygrid.org.uk/tools/service-management/mygrid-ontology/
|
data/Rakefile
CHANGED
@@ -20,8 +20,9 @@ Jeweler::Tasks.new do |gem|
|
|
20
20
|
gem.summary = %Q{Build and run SADI services with ruby-rdf and sinatra}
|
21
21
|
gem.description = %Q{Build and run SADI services with ruby-rdf and sinatra}
|
22
22
|
gem.email = "wstrinz@gmail.com"
|
23
|
+
# gem.executables = gem.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
23
24
|
gem.authors = ["Will Strinz"]
|
24
|
-
gem.version = '0.0.
|
25
|
+
gem.version = '0.0.2'
|
25
26
|
# dependencies defined in Gemfile
|
26
27
|
end
|
27
28
|
Jeweler::RubygemsDotOrgTasks.new
|
data/bin/sadi-rb
ADDED
data/lib/sadi-rb/converter.rb
CHANGED
@@ -1,6 +1,10 @@
|
|
1
1
|
class ExampleService
|
2
2
|
extend SADI::SynchronousService
|
3
3
|
class << self
|
4
|
+
def service_name
|
5
|
+
"hello"
|
6
|
+
end
|
7
|
+
|
4
8
|
def service_description
|
5
9
|
str = <<-EOS
|
6
10
|
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
|
@@ -71,7 +75,6 @@ foaf:name a owl:DatatypeProperty;
|
|
71
75
|
def process_object(in_graph, object)
|
72
76
|
out_graph = RDF::Graph.new
|
73
77
|
|
74
|
-
# obj = input_objects(in_graph).first
|
75
78
|
name = RDF::Query.execute(in_graph) do
|
76
79
|
pattern [object, RDF::FOAF.name, :name]
|
77
80
|
end
|
data/lib/sadi-rb/server.rb
CHANGED
@@ -5,8 +5,13 @@ module SADI
|
|
5
5
|
class Server < Sinatra::Base
|
6
6
|
register Sinatra::LinkedData
|
7
7
|
|
8
|
-
|
9
|
-
|
8
|
+
configure do
|
9
|
+
enable :inline_templates
|
10
|
+
end
|
11
|
+
|
12
|
+
get '/' do
|
13
|
+
# "This is a SADI "
|
14
|
+
haml :index
|
10
15
|
end
|
11
16
|
|
12
17
|
get '/services/:service' do
|
@@ -27,14 +32,47 @@ module SADI
|
|
27
32
|
repo
|
28
33
|
end
|
29
34
|
|
30
|
-
|
31
35
|
def handle_synchronous(service)
|
32
|
-
|
36
|
+
svc = SADI.service_for(service)
|
37
|
+
raise "no service exists with name '#{service}'" unless svc
|
38
|
+
rdf_response svc.process_input(request.body.read,request.content_type)
|
33
39
|
end
|
34
40
|
|
35
41
|
def get_description(service)
|
36
|
-
|
42
|
+
svc = SADI.service_for(service)
|
43
|
+
raise "no service exists with name '#{service}'" unless svc
|
44
|
+
svc.service_description
|
45
|
+
end
|
46
|
+
|
47
|
+
def service_list
|
48
|
+
SADI.services.keys.map{|k| "<a href=\"/services/#{k}\"> #{k} </a>"}.join("<br>")
|
49
|
+
end
|
50
|
+
|
51
|
+
def format_list
|
52
|
+
RDF::Format.each.to_a.uniq{|f| f.content_type}
|
53
|
+
.reject{|f| f.content_type.size == 0}
|
54
|
+
.map{|f| "#{f.content_type} (#{f.to_sym})"}
|
55
|
+
.join('<br>')
|
37
56
|
end
|
38
57
|
end
|
39
58
|
end
|
40
|
-
end
|
59
|
+
end
|
60
|
+
|
61
|
+
__END__
|
62
|
+
|
63
|
+
@@ index
|
64
|
+
%h1
|
65
|
+
This is a
|
66
|
+
%a{href: 'http://sadiframework.org'} SADI
|
67
|
+
Server
|
68
|
+
|
69
|
+
%div
|
70
|
+
%strong Available services are: <br>
|
71
|
+
= service_list
|
72
|
+
|
73
|
+
%br
|
74
|
+
%br
|
75
|
+
|
76
|
+
%div
|
77
|
+
%strong Valid RDF formats are: <br>
|
78
|
+
= "#{format_list}"
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module SADI
|
2
|
+
class << self
|
3
|
+
|
4
|
+
def service_for(name)
|
5
|
+
services[name]
|
6
|
+
end
|
7
|
+
|
8
|
+
def register_service(name, object)
|
9
|
+
services[name] = object
|
10
|
+
end
|
11
|
+
|
12
|
+
def services
|
13
|
+
@@services ||= {}
|
14
|
+
end
|
15
|
+
|
16
|
+
def reload_services
|
17
|
+
@@services = {}
|
18
|
+
|
19
|
+
SADI::SynchronousService.classes.each do |service|
|
20
|
+
if service.respond_to? 'service_name'
|
21
|
+
name = service.service_name
|
22
|
+
puts "Warning: service #{@@services[name]} already using name '#{name}', overwriting" if @@services[name]
|
23
|
+
@@services[name] = service
|
24
|
+
elsif service.instance_methods.include? :service_name
|
25
|
+
service = service.new
|
26
|
+
name = service.service_name
|
27
|
+
puts "Warning: service #{@@services[name]} already using name '#{name}', overwriting" if @@services[name]
|
28
|
+
@@services[name] = service
|
29
|
+
else
|
30
|
+
raise "service #{service} does not define a proper interface"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -2,6 +2,20 @@ module SADI
|
|
2
2
|
module SynchronousService
|
3
3
|
include SADI::Converter
|
4
4
|
|
5
|
+
def self.included(base)
|
6
|
+
@classes ||= []
|
7
|
+
@classes << base
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.extended(base)
|
11
|
+
@classes ||= []
|
12
|
+
@classes << base
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.classes
|
16
|
+
@classes
|
17
|
+
end
|
18
|
+
|
5
19
|
def process_input(input, format)
|
6
20
|
gr = RDF::Graph.new
|
7
21
|
in_graph = parse_string(input,format)
|
@@ -54,5 +68,9 @@ module SADI
|
|
54
68
|
def process_object(owl_graph, object)
|
55
69
|
raise "Must implement a #process_input that takes an RDF::Graph or Repository as input and returns a new one"
|
56
70
|
end
|
71
|
+
|
72
|
+
def service_name
|
73
|
+
raise "Must define a service name"
|
74
|
+
end
|
57
75
|
end
|
58
76
|
end
|
data/lib/sadi-rb.rb
CHANGED
data/sadi-rb.gemspec
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = "sadi-rb"
|
8
|
+
s.version = "0.0.2"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Will Strinz"]
|
12
|
+
s.date = "2013-10-15"
|
13
|
+
s.description = "Build and run SADI services with ruby-rdf and sinatra"
|
14
|
+
s.email = "wstrinz@gmail.com"
|
15
|
+
s.executables = ["sadi-rb"]
|
16
|
+
s.extra_rdoc_files = [
|
17
|
+
"LICENSE.txt",
|
18
|
+
"README.md"
|
19
|
+
]
|
20
|
+
s.files = [
|
21
|
+
".document",
|
22
|
+
"Gemfile",
|
23
|
+
"LICENSE.txt",
|
24
|
+
"README.md",
|
25
|
+
"Rakefile",
|
26
|
+
"bin/sadi-rb",
|
27
|
+
"lib/sadi-rb.rb",
|
28
|
+
"lib/sadi-rb/converter.rb",
|
29
|
+
"lib/sadi-rb/example_service.rb",
|
30
|
+
"lib/sadi-rb/server.rb",
|
31
|
+
"lib/sadi-rb/services.rb",
|
32
|
+
"lib/sadi-rb/synchronous_service.rb",
|
33
|
+
"sadi-rb.gemspec",
|
34
|
+
"spec/server_spec.rb"
|
35
|
+
]
|
36
|
+
s.homepage = "http://github.com/wstrinz/sadi-rb"
|
37
|
+
s.licenses = ["MIT"]
|
38
|
+
s.require_paths = ["lib"]
|
39
|
+
s.rubygems_version = "2.0.3"
|
40
|
+
s.summary = "Build and run SADI services with ruby-rdf and sinatra"
|
41
|
+
|
42
|
+
if s.respond_to? :specification_version then
|
43
|
+
s.specification_version = 4
|
44
|
+
|
45
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
46
|
+
s.add_runtime_dependency(%q<sinatra>, [">= 0"])
|
47
|
+
s.add_runtime_dependency(%q<sinatra-linkeddata>, [">= 0"])
|
48
|
+
s.add_runtime_dependency(%q<equivalent-xml>, [">= 0"])
|
49
|
+
s.add_runtime_dependency(%q<thin>, [">= 0"])
|
50
|
+
s.add_development_dependency(%q<shoulda>, [">= 0"])
|
51
|
+
s.add_development_dependency(%q<rdoc>, ["~> 3.12"])
|
52
|
+
s.add_development_dependency(%q<bundler>, ["~> 1.0"])
|
53
|
+
s.add_development_dependency(%q<jeweler>, ["~> 1.8.7"])
|
54
|
+
s.add_development_dependency(%q<rspec>, [">= 0"])
|
55
|
+
s.add_development_dependency(%q<rack-test>, [">= 0"])
|
56
|
+
s.add_development_dependency(%q<pry>, [">= 0"])
|
57
|
+
else
|
58
|
+
s.add_dependency(%q<sinatra>, [">= 0"])
|
59
|
+
s.add_dependency(%q<sinatra-linkeddata>, [">= 0"])
|
60
|
+
s.add_dependency(%q<equivalent-xml>, [">= 0"])
|
61
|
+
s.add_dependency(%q<thin>, [">= 0"])
|
62
|
+
s.add_dependency(%q<shoulda>, [">= 0"])
|
63
|
+
s.add_dependency(%q<rdoc>, ["~> 3.12"])
|
64
|
+
s.add_dependency(%q<bundler>, ["~> 1.0"])
|
65
|
+
s.add_dependency(%q<jeweler>, ["~> 1.8.7"])
|
66
|
+
s.add_dependency(%q<rspec>, [">= 0"])
|
67
|
+
s.add_dependency(%q<rack-test>, [">= 0"])
|
68
|
+
s.add_dependency(%q<pry>, [">= 0"])
|
69
|
+
end
|
70
|
+
else
|
71
|
+
s.add_dependency(%q<sinatra>, [">= 0"])
|
72
|
+
s.add_dependency(%q<sinatra-linkeddata>, [">= 0"])
|
73
|
+
s.add_dependency(%q<equivalent-xml>, [">= 0"])
|
74
|
+
s.add_dependency(%q<thin>, [">= 0"])
|
75
|
+
s.add_dependency(%q<shoulda>, [">= 0"])
|
76
|
+
s.add_dependency(%q<rdoc>, ["~> 3.12"])
|
77
|
+
s.add_dependency(%q<bundler>, ["~> 1.0"])
|
78
|
+
s.add_dependency(%q<jeweler>, ["~> 1.8.7"])
|
79
|
+
s.add_dependency(%q<rspec>, [">= 0"])
|
80
|
+
s.add_dependency(%q<rack-test>, [">= 0"])
|
81
|
+
s.add_dependency(%q<pry>, [">= 0"])
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sadi-rb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Will Strinz
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - '>='
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: thin
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: shoulda
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -152,7 +166,8 @@ dependencies:
|
|
152
166
|
version: '0'
|
153
167
|
description: Build and run SADI services with ruby-rdf and sinatra
|
154
168
|
email: wstrinz@gmail.com
|
155
|
-
executables:
|
169
|
+
executables:
|
170
|
+
- sadi-rb
|
156
171
|
extensions: []
|
157
172
|
extra_rdoc_files:
|
158
173
|
- LICENSE.txt
|
@@ -163,11 +178,14 @@ files:
|
|
163
178
|
- LICENSE.txt
|
164
179
|
- README.md
|
165
180
|
- Rakefile
|
181
|
+
- bin/sadi-rb
|
166
182
|
- lib/sadi-rb.rb
|
167
183
|
- lib/sadi-rb/converter.rb
|
168
184
|
- lib/sadi-rb/example_service.rb
|
169
185
|
- lib/sadi-rb/server.rb
|
186
|
+
- lib/sadi-rb/services.rb
|
170
187
|
- lib/sadi-rb/synchronous_service.rb
|
188
|
+
- sadi-rb.gemspec
|
171
189
|
- spec/server_spec.rb
|
172
190
|
homepage: http://github.com/wstrinz/sadi-rb
|
173
191
|
licenses:
|