activerdf 1.2.2 → 1.2.3
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/CHANGELOG +3 -0
- data/README +1 -1
- data/lib/active_rdf/federation/federation_manager.rb +1 -0
- data/lib/active_rdf/objectmanager/namespace.rb +24 -0
- data/lib/active_rdf/queryengine/ntriples_parser.rb +57 -0
- data/test/federation/test_federation_manager.rb +2 -5
- data/test/objectmanager/test_namespace.rb +12 -0
- data/test/objectmanager/test_resource_reading.rb +3 -4
- data/test/queryengine/test_ntriples_parser.rb +31 -0
- data/test/queryengine/test_query.rb +1 -1
- metadata +4 -2
data/CHANGELOG
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
== activerdf (1.2.3) Wed, 14 Feb 2007 16:07:41 +0000
|
2
|
+
* namespaced properties are first-class citizens: FOAF::name or RDFS::domain
|
3
|
+
|
1
4
|
== activerdf (1.2.2) Tue, 13 Feb 2007 19:40:19 +0000
|
2
5
|
* gems published automatically from Rakefile
|
3
6
|
* added support for namespaced attributes:
|
data/README
CHANGED
@@ -25,7 +25,7 @@ people found in the data source:
|
|
25
25
|
people = FOAF::Person.find_all
|
26
26
|
|
27
27
|
== License
|
28
|
-
ActiveRDF is distributed under the LGPL[
|
28
|
+
ActiveRDF is distributed under the LGPL[http://www.gnu.org/licenses/lgpl.html] license.
|
29
29
|
|
30
30
|
== Authors
|
31
31
|
* Eyal Oren
|
@@ -7,6 +7,7 @@ class FederationManager
|
|
7
7
|
# add triple s,p,o to the currently selected write-adapter
|
8
8
|
def FederationManager.add(s,p,o)
|
9
9
|
# TODO: allow addition of full graphs
|
10
|
+
raise ActiveRdfError, "cannot write without a write-adapter" unless ConnectionPool.write_adapter
|
10
11
|
ConnectionPool.write_adapter.add(s,p,o)
|
11
12
|
end
|
12
13
|
|
@@ -13,6 +13,30 @@ class Namespace
|
|
13
13
|
$activerdflog.info "Namespace: registering #{fullURI} to #{prefix}"
|
14
14
|
@@namespaces[prefix.to_sym] = fullURI.to_s
|
15
15
|
@@inverted_namespaces[fullURI.to_s] = prefix.to_sym
|
16
|
+
|
17
|
+
# enable namespace lookups through FOAF::name
|
18
|
+
# if FOAF defined, add to it
|
19
|
+
if Object.const_defined?(prefix.to_s.upcase)
|
20
|
+
ns = Object.const_get(prefix.to_s.upcase)
|
21
|
+
else
|
22
|
+
# otherwise create a new module for it
|
23
|
+
ns = Module.new
|
24
|
+
Object.const_set(prefix.to_s.upcase, ns)
|
25
|
+
end
|
26
|
+
|
27
|
+
# catch FOAF::name or all other lookups
|
28
|
+
class << ns
|
29
|
+
def method_missing(method, *args)
|
30
|
+
Namespace.lookup(self.to_s.downcase.to_sym, method)
|
31
|
+
end
|
32
|
+
|
33
|
+
# make some builtin methods private because lookup doesn't work otherwise
|
34
|
+
# on e.g. RDF::type and FOAF::name
|
35
|
+
[:type, :name].each {|m| private(m) }
|
36
|
+
end
|
37
|
+
|
38
|
+
# return the namespace proxy object
|
39
|
+
ns
|
16
40
|
end
|
17
41
|
|
18
42
|
# returns a resource whose URI is formed by concatenation of prefix and localname
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# Author:: Eyal Oren
|
2
|
+
# Copyright:: (c) 2005-2006 Eyal Oren
|
3
|
+
# License:: LGPL
|
4
|
+
require 'active_rdf'
|
5
|
+
require 'uuidtools'
|
6
|
+
|
7
|
+
# ntriples parser
|
8
|
+
class NTriplesParser
|
9
|
+
# parses an input string of ntriples and returns a nested array of [s, p, o]
|
10
|
+
# (which are in turn ActiveRDF objects)
|
11
|
+
def self.parse(input)
|
12
|
+
|
13
|
+
# need unique identifier for this batch of triples (to detect occurence of
|
14
|
+
# same bnodes _:#1
|
15
|
+
uuid = UUID.random_create.to_s
|
16
|
+
|
17
|
+
input.collect do |triple|
|
18
|
+
nodes = triple.scan(Node)
|
19
|
+
|
20
|
+
# handle bnodes if necessary (bnodes need to have uri generated)
|
21
|
+
subject = case nodes[0]
|
22
|
+
when BNode
|
23
|
+
RDFS::Resource.new("http://www.activerdf.org/bnode/#{uuid}/#$1")
|
24
|
+
else
|
25
|
+
RDFS::Resource.new(nodes[0])
|
26
|
+
end
|
27
|
+
|
28
|
+
predicate = RDFS::Resource.new(nodes[1])
|
29
|
+
|
30
|
+
# handle bnodes and literals if necessary (literals need unicode fixing)
|
31
|
+
object = case nodes[2]
|
32
|
+
when BNode
|
33
|
+
RDFS::Resource.new("http://www.activerdf.org/bnode/#{uuid}/#$1")
|
34
|
+
when Literal
|
35
|
+
fix_unicode(nodes[2])
|
36
|
+
else
|
37
|
+
RDFS::Resourec.new(nodes[2])
|
38
|
+
end
|
39
|
+
|
40
|
+
# collect s, p, o into array to be returned
|
41
|
+
[subject, predicate, object]
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
# constants for extracting resources/literals from sql results
|
47
|
+
Node = Regexp.union(/_:\S*/,/<[^>]*>/,/"[^"]*"/)
|
48
|
+
BNode = /_:(\S*)/
|
49
|
+
Resource = /<([^>]*)>/
|
50
|
+
Literal = /"([^"]*)"/
|
51
|
+
|
52
|
+
# fixes unicode characters in literals (because we parse them wrongly somehow)
|
53
|
+
def self.fix_unicode(str)
|
54
|
+
tmp = str.gsub(/\\\u([0-9a-fA-F]{4,4})/u){ "U+#$1" }
|
55
|
+
tmp.gsub(/U\+([0-9a-fA-F]{4,4})/u){["#$1".hex ].pack('U*')}
|
56
|
+
end
|
57
|
+
end
|
@@ -42,12 +42,9 @@ class TestFederationManager < Test::Unit::TestCase
|
|
42
42
|
|
43
43
|
def test_class_add_no_write_adapter
|
44
44
|
# zero write, one read -> must raise error
|
45
|
-
|
46
45
|
adapter = get_read_only_adapter
|
47
|
-
assert(
|
48
|
-
assert_raises
|
49
|
-
FederationManager.add(@@eyal, @@age, @@age_number)
|
50
|
-
end
|
46
|
+
assert (not adapter.writes?)
|
47
|
+
assert_raises(ActiveRdfError) { FederationManager.add(@@eyal, @@age, @@age_number) }
|
51
48
|
end
|
52
49
|
|
53
50
|
def test_class_add_one_write_one_read
|
@@ -62,4 +62,16 @@ class TestNamespace < Test::Unit::TestCase
|
|
62
62
|
|
63
63
|
assert_equal abc, Namespace.expand(:test, :abc)
|
64
64
|
end
|
65
|
+
|
66
|
+
def test_attributes
|
67
|
+
assert_nothing_raised { RDFS::domain }
|
68
|
+
assert_nothing_raised { RDF::type }
|
69
|
+
assert_raise(NameError) { FOAF::type }
|
70
|
+
|
71
|
+
foaf = 'http://xmlns.com/foaf/0.1/'
|
72
|
+
Namespace.register :foaf, foaf
|
73
|
+
|
74
|
+
foafname = RDFS::Resource.new(foaf + 'name')
|
75
|
+
assert_equal foafname, FOAF::name
|
76
|
+
end
|
65
77
|
end
|
@@ -12,6 +12,8 @@ class TestResourceReading < Test::Unit::TestCase
|
|
12
12
|
ConnectionPool.clear
|
13
13
|
@adapter = get_read_only_adapter
|
14
14
|
Namespace.register(:ar, 'http://activerdf.org/test/')
|
15
|
+
ObjectManager.construct_classes
|
16
|
+
|
15
17
|
@eyal = RDFS::Resource.new 'http://activerdf.org/test/eyal'
|
16
18
|
end
|
17
19
|
|
@@ -75,9 +77,6 @@ class TestResourceReading < Test::Unit::TestCase
|
|
75
77
|
|
76
78
|
# test for writing if no write adapter is defined (like only sparqls)
|
77
79
|
def test_write_without_write_adapter
|
78
|
-
assert_raises
|
79
|
-
@eyal.age = 18
|
80
|
-
end
|
80
|
+
assert_raises(ActiveRdfError) { @eyal.age = 18 }
|
81
81
|
end
|
82
|
-
|
83
82
|
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# Author:: Eyal Oren
|
2
|
+
# Copyright:: (c) 2005-2006
|
3
|
+
# License:: LGPL
|
4
|
+
|
5
|
+
require 'test/unit'
|
6
|
+
require 'active_rdf'
|
7
|
+
require 'queryengine/ntriples_parser'
|
8
|
+
require "#{File.dirname(__FILE__)}/../common"
|
9
|
+
|
10
|
+
class TestNTriplesParser < Test::Unit::TestCase
|
11
|
+
def setup
|
12
|
+
end
|
13
|
+
|
14
|
+
def teardown
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_the_parser
|
18
|
+
str = <<EOF
|
19
|
+
<http://www.johnbreslin.com/blog/author/cloud/#foaf> <http://xmlns.com/foaf/0.1/surname> "Breslin" .
|
20
|
+
<http://www.johnbreslin.com/blog/author/cloud/#foaf> <http://xmlns.com/foaf/0.1/firstName> "John" .
|
21
|
+
<http://www.johnbreslin.com/blog/author/cloud/> <http://purl.org/dc/terms/created> "1999-11-30T00:00:00" .
|
22
|
+
EOF
|
23
|
+
|
24
|
+
results = NTriplesParser.parse(str)
|
25
|
+
assert_equal 9, results.flatten.size
|
26
|
+
assert_equal 3, results[0].size
|
27
|
+
|
28
|
+
assert_equal RDFS::Resource, results[0][0].class
|
29
|
+
assert_equal String, results[0][2].class
|
30
|
+
end
|
31
|
+
end
|
@@ -48,7 +48,7 @@ class TestQuery < Test::Unit::TestCase
|
|
48
48
|
end
|
49
49
|
|
50
50
|
def test_query_refuses_string_in_where_clause_subject_or_predicate
|
51
|
-
assert_raises
|
51
|
+
assert_raises(ActiveRdfError)do
|
52
52
|
Query.new.select(:s).where("http://test.org/uri",:p, :o).execute
|
53
53
|
end
|
54
54
|
end
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.2
|
|
3
3
|
specification_version: 1
|
4
4
|
name: activerdf
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 1.2.
|
7
|
-
date: 2007-02-
|
6
|
+
version: 1.2.3
|
7
|
+
date: 2007-02-14 00:00:00 +00:00
|
8
8
|
summary: Offers object-oriented access to RDF (with adapters to several datastores).
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -48,6 +48,7 @@ files:
|
|
48
48
|
- test/queryengine/test_query2jars2.rb
|
49
49
|
- test/queryengine/test_query2sparql.rb
|
50
50
|
- test/queryengine/test_query_engine.rb
|
51
|
+
- test/queryengine/test_ntriples_parser.rb
|
51
52
|
- lib/active_rdf
|
52
53
|
- lib/active_rdf.rb
|
53
54
|
- lib/active_rdf_helpers.rb
|
@@ -64,6 +65,7 @@ files:
|
|
64
65
|
- lib/active_rdf/queryengine/query.rb
|
65
66
|
- lib/active_rdf/queryengine/query2jars2.rb
|
66
67
|
- lib/active_rdf/queryengine/query2sparql.rb
|
68
|
+
- lib/active_rdf/queryengine/ntriples_parser.rb
|
67
69
|
test_files: []
|
68
70
|
|
69
71
|
rdoc_options: []
|