currmap-sesame 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,7 @@
1
+ pkg
2
+ doc
3
+ Manifest
4
+ spec/tests-config
5
+ *.gemspec
6
+ *.gem
7
+ coverage
data/README.rdoc ADDED
@@ -0,0 +1,20 @@
1
+ = Sesame ORM
2
+
3
+ This is a simple object mapping system for a Sesame triple store database.
4
+
5
+ Although it aims to be generally useful, it is designed specifically for use
6
+ with the CurrMap project, and hence there may be some manner of coupling to
7
+ the aforementioned.
8
+
9
+ == Testing
10
+
11
+ To run the tests, you'll have to create a file in the "spec" directory named
12
+ tests-config that specificies the host, port, sesame directory, repository,
13
+ username, and password used to access the test server.
14
+
15
+ You'll also need to completely change the test results to be what you want.
16
+ Like I said, pretty tightly coupled. Suck it.
17
+
18
+
19
+
20
+
data/Rakefile ADDED
@@ -0,0 +1,43 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |gem|
7
+ gem.name = "currmap-sesame"
8
+ gem.summary = "Sesame RDF database ORM"
9
+ gem.email = "james.cash@occasionallycogent.com"
10
+ gem.homepage = "http://github.com/jamesnvc/currmap-sesame"
11
+ gem.description = "Establish an object-database mapping to an OpenRDF Sesame Triple Store database"
12
+ gem.authors = ["James N. V. Cash"]
13
+ gem.add_dependency 'nokogiri', ">= 0"
14
+ gem.add_development_dependency 'rspec', '>= 0'
15
+ end
16
+ Jeweler::GemcutterTasks.new
17
+ rescue LoadError
18
+ puts "Jeweler, or one of its dependencies, is not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
19
+ end
20
+
21
+ require 'spec/rake/spectask'
22
+ Spec::Rake::SpecTask.new(:spec) do |spec|
23
+ spec.libs << 'lib' << 'spec'
24
+ spec.spec_files = FileList['spec/**/*_spec.rb']
25
+ end
26
+
27
+ Spec::Rake::SpecTask.new(:rcov) do |spec|
28
+ spec.libs << 'lib' << 'spec'
29
+ spec.pattern = 'spec/**/*_spec.rb'
30
+ spec.rcov = true
31
+ end
32
+
33
+ task :default => :spec
34
+
35
+ require 'rake/rdoctask'
36
+ Rake::RDocTask.new do |rdoc|
37
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
38
+
39
+ rdoc.rdoc_dir = 'rdoc'
40
+ rdoc.title = "currmap-sesame #{version}"
41
+ rdoc.rdoc_files.include('README*')
42
+ rdoc.rdoc_files.include('lib/**/*.rb')
43
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.0
data/lib/sesame.rb ADDED
@@ -0,0 +1,84 @@
1
+ require 'net/http'
2
+ require 'uri'
3
+ require 'rubygems'
4
+ require 'nokogiri'
5
+
6
+ module Sesame
7
+
8
+ class Server
9
+ attr_reader :uri, :repo
10
+
11
+ def initialize(host, port, sesamedir, repo, user, pass, options=nil)
12
+ @host = host
13
+ @port = port
14
+ @sesamedir = sesamedir
15
+ @repo = repo
16
+ @user = user
17
+ @pass = pass
18
+ @options = options
19
+ @uri =
20
+ URI.parse("http://#{@host}:#{@port}/#{@sesamedir}/repositories")
21
+ end
22
+
23
+ def select(query_str, query_lang="sparql")
24
+ params = { "query" => query_str, "queryLn" => query_lang }
25
+ query_params = params.collect { |k,v| "#{k}=#{URI.escape(v.to_s)}" }.
26
+ reverse.join '&'
27
+ req = Net::HTTP::Get.new("#{@uri.path}/#{@repo}?#{query_params}",
28
+ {'Accept' => 'application/sparql-results+xml' })
29
+ req.basic_auth @user, @pass
30
+ xml = Nokogiri::XML.parse(request(req).body)
31
+ res = Hash.new
32
+ # Get variables from query
33
+ xml.xpath('//xmlns:head/xmlns:variable').each do |var|
34
+ res[var['name']] = Array.new
35
+ end
36
+ # Populate result hash by variable
37
+ xml.xpath('//xmlns:result/xmlns:binding').each do |binding|
38
+ res[binding['name']] << (binding / 'uri')[0].content
39
+ end
40
+ return res
41
+ end
42
+
43
+ def list_repos
44
+ req = Net::HTTP::Get.new(@uri.path,
45
+ {'Accept' => "application/sparql-results+xml" })
46
+ xml = Nokogiri::XML.parse(request(req).body)
47
+ res = Array.new
48
+ xml.xpath('//xmlns:binding[@name="id"]/xmlns:literal').each do |repo|
49
+ res << repo.content
50
+ end
51
+ return res
52
+ end
53
+
54
+ def list_namespaces repo
55
+ req = Net::HTTP::Get.new("#{@uri.path}/#{repo}/namespaces",
56
+ {'Accept' => "application/sparql-results+xml" })
57
+ xml = Nokogiri::XML.parse(request(req).body)
58
+ res = Hash.new
59
+ xml.xpath('//xmlns:result').each do |result|
60
+ prefix = result.xpath('.//xmlns:binding[@name="prefix"]/xmlns:literal')[0].content
61
+ namespc = result.xpath('.//xmlns:binding[@name="namespace"]/xmlns:literal')[0].content
62
+ res[prefix] = namespc
63
+ end
64
+ return res
65
+ end
66
+
67
+ def request(req)
68
+ res = Net::HTTP.start(@host, @port) {|http|
69
+ http.request(req)
70
+ }
71
+ if (not res.kind_of?(Net::HTTPSuccess))
72
+ handle_error(req, res)
73
+ end
74
+ res
75
+ end
76
+
77
+ private
78
+
79
+ def handle_error(req, res)
80
+ e = RuntimeError.new("#{res.code}:#{res.message}\nMETHOD:#{req.method}\nURI:#{req.path}\n#{res.body}")
81
+ raise e
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,63 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+ require 'rubygems'
3
+ require 'parseconfig'
4
+
5
+ describe Sesame::Server do
6
+
7
+ before :all do
8
+ config = ParseConfig.new "#{File.dirname(__FILE__)}/tests-config"
9
+ @host = config.get_value('host')
10
+ @port = config.get_value('port').to_i
11
+ @sesame_dir = config.get_value('sesame_dir')
12
+ @repo = config.get_value('repo')
13
+ @user = config.get_value('username')
14
+ @pass = config.get_value('password')
15
+ end
16
+
17
+ before :each do
18
+ @serv = Sesame::Server.new(@host, @port, @sesame_dir, @repo, @user, @pass)
19
+ end
20
+
21
+ it "should get a list of repos" do
22
+ repos = @serv.list_repos
23
+ repos.should == [ "SYSTEM", "CurrMap" ]
24
+ end
25
+
26
+ it "should get a list of all namespaces" do
27
+ namespaces = @serv.list_namespaces "CurrMap"
28
+ namespaces.should == {
29
+ "rdfs"=>"http://www.w3.org/2000/01/rdf-schema#",
30
+ "xsd"=>"http://www.w3.org/2001/XMLSchema#",
31
+ "rdf"=>"http://www.w3.org/1999/02/22-rdf-syntax-ns#",
32
+ "base"=>"file://schema.xml#"
33
+ }
34
+ end
35
+
36
+ it "should run a SeRQL query" do
37
+ query = <<EOF
38
+ SELECT C
39
+ FROM {C} rdf:type {base:Course}
40
+ USING NAMESPACE base = <file://schema.xml#>
41
+ EOF
42
+ res = @serv.select(query, "serql")
43
+ res.keys.should == ["C"]
44
+ res["C"].length.should == 1000
45
+ res
46
+ end
47
+
48
+ it "should run a SPARQL query" do
49
+ query = <<EOF
50
+ PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#>
51
+ PREFIX base:<file://schema.xml#>
52
+ PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>
53
+ PREFIX xsd:<http://www.w3.org/2001/XMLSchema#>
54
+ SELECT ?x
55
+ WHERE
56
+ { ?x rdf:type base:Course }
57
+ EOF
58
+ res = @serv.select(query, "sparql")
59
+ res.keys.should == ["x"]
60
+ res["x"].length.should == 1000
61
+ end
62
+
63
+ end
data/spec/spec.opts ADDED
@@ -0,0 +1 @@
1
+ --color
@@ -0,0 +1,9 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
+ require 'sesame'
4
+ require 'spec'
5
+ require 'spec/autorun'
6
+
7
+ Spec::Runner.configure do |config|
8
+
9
+ end
metadata ADDED
@@ -0,0 +1,93 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: currmap-sesame
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 1
8
+ - 0
9
+ version: 0.1.0
10
+ platform: ruby
11
+ authors:
12
+ - James N. V. Cash
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2010-05-13 00:00:00 -04:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: nokogiri
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ segments:
28
+ - 0
29
+ version: "0"
30
+ type: :runtime
31
+ version_requirements: *id001
32
+ - !ruby/object:Gem::Dependency
33
+ name: rspec
34
+ prerelease: false
35
+ requirement: &id002 !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ segments:
40
+ - 0
41
+ version: "0"
42
+ type: :development
43
+ version_requirements: *id002
44
+ description: Establish an object-database mapping to an OpenRDF Sesame Triple Store database
45
+ email: james.cash@occasionallycogent.com
46
+ executables: []
47
+
48
+ extensions: []
49
+
50
+ extra_rdoc_files:
51
+ - README.rdoc
52
+ files:
53
+ - .gitignore
54
+ - README.rdoc
55
+ - Rakefile
56
+ - VERSION
57
+ - lib/sesame.rb
58
+ - spec/sesame_spec.rb
59
+ - spec/spec.opts
60
+ - spec/spec_helper.rb
61
+ has_rdoc: true
62
+ homepage: http://github.com/jamesnvc/currmap-sesame
63
+ licenses: []
64
+
65
+ post_install_message:
66
+ rdoc_options:
67
+ - --charset=UTF-8
68
+ require_paths:
69
+ - lib
70
+ required_ruby_version: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ segments:
75
+ - 0
76
+ version: "0"
77
+ required_rubygems_version: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ segments:
82
+ - 0
83
+ version: "0"
84
+ requirements: []
85
+
86
+ rubyforge_project:
87
+ rubygems_version: 1.3.6
88
+ signing_key:
89
+ specification_version: 3
90
+ summary: Sesame RDF database ORM
91
+ test_files:
92
+ - spec/sesame_spec.rb
93
+ - spec/spec_helper.rb