lightrdf 0.1.9 → 0.2.0
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/History.txt +4 -0
- data/Manifest +1 -0
- data/README.rdoc +46 -0
- data/lib/lightrdf/graph.rb +6 -0
- data/lib/lightrdf/id.rb +1 -0
- data/lib/lightrdf/node.rb +3 -0
- data/lib/lightrdf/node_proxy.rb +66 -0
- data/lib/lightrdf.rb +2 -1
- data/lightrdf.gemspec +4 -4
- data/test/test_lightrdf.rb +56 -6
- metadata +6 -4
data/History.txt
CHANGED
data/Manifest
CHANGED
data/README.rdoc
CHANGED
@@ -103,6 +103,52 @@ Also, queries for triples can be performed on a graph:
|
|
103
103
|
# Find all predicates bob has
|
104
104
|
g.find(Node('ex:bob'), nil, []) # => [Node('foaf:name'), Node('foaf:age')]
|
105
105
|
|
106
|
+
== INSTANTIATING OBJECTS:
|
107
|
+
|
108
|
+
LightRDF allows defining a class hierarchy that is instantiated using RDF data. Simply match
|
109
|
+
modules to prefix names and classes to RDF types and include RDF::NodeProxy:
|
110
|
+
|
111
|
+
module Foaf
|
112
|
+
class Person
|
113
|
+
include RDF::NodeProxy
|
114
|
+
# Optionally, you can specify the mapped URI:
|
115
|
+
# maps 'foaf:Person'
|
116
|
+
# or
|
117
|
+
# maps 'http://xmlns.com/foaf/0.1/Person'
|
118
|
+
|
119
|
+
# Adds 1 year to the person's age
|
120
|
+
def happy_birthday!
|
121
|
+
foaf::age = (foaf::age.first.to_i + 1).to_s
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
This class can be instantiated by passing an RDF node or a hash with predicates:
|
127
|
+
|
128
|
+
Foaf::Person.new.rdf::type # => [Node("http://xmlns.com/foaf/0.1/Person")]
|
129
|
+
|
130
|
+
person_node = Node(nil)
|
131
|
+
person_node.rdf::type = Node('foaf:Person')
|
132
|
+
person_node.foaf::age = "19"
|
133
|
+
person = Foaf::Person.new(person_node)
|
134
|
+
person.foaf::age # => ["19"]
|
135
|
+
|
136
|
+
person = Foaf::Person.new('foaf:age'=>"25")
|
137
|
+
person.happy_birthday!
|
138
|
+
person.foaf::age # => ["26"]
|
139
|
+
|
140
|
+
Also, you can use Graph#node to get instances of class Person out of an RDF graph:
|
141
|
+
|
142
|
+
graph = RDF::Graph.new
|
143
|
+
person_node = Node(nil)
|
144
|
+
person_node.rdf::type = Node('foaf:Person')
|
145
|
+
person_node.foaf::age = "25"
|
146
|
+
graph << person_node
|
147
|
+
|
148
|
+
person = graph.node(person_node)
|
149
|
+
person.happy_birthday!
|
150
|
+
person.foaf::age # => ["26"]
|
151
|
+
|
106
152
|
== PARSING AND SERIALIZING:
|
107
153
|
|
108
154
|
LightRDF uses Raptor library internally to support many RDF formats. It also introduces
|
data/lib/lightrdf/graph.rb
CHANGED
@@ -41,6 +41,12 @@ module RDF
|
|
41
41
|
values.select &block
|
42
42
|
end
|
43
43
|
|
44
|
+
# This is equivalent to [], but tries to return a NodeProxy
|
45
|
+
def node id
|
46
|
+
node = self[id]
|
47
|
+
Node.classes[node.rdf::type.first].new node
|
48
|
+
end
|
49
|
+
|
44
50
|
def find subject, predicate, object
|
45
51
|
# Convert nodes into IDs
|
46
52
|
subject = subject.id if subject.is_a?(Node)
|
data/lib/lightrdf/id.rb
CHANGED
data/lib/lightrdf/node.rb
CHANGED
@@ -0,0 +1,66 @@
|
|
1
|
+
module RDF
|
2
|
+
# This class allows instantiating RDF resources as Ruby objects
|
3
|
+
module NodeProxy
|
4
|
+
def self.included base
|
5
|
+
base.extend ClassMethods
|
6
|
+
base.send :attr_reader, :node
|
7
|
+
base.maps base.to_s.gsub("::",":").gsub(/\A.*:/) { |a| a.downcase }
|
8
|
+
end
|
9
|
+
|
10
|
+
module ClassMethods
|
11
|
+
def maps id
|
12
|
+
@rdf_type = Node(id)
|
13
|
+
Node.classes.delete Node.classes.invert[self]
|
14
|
+
Node.classes[@rdf_type] = self
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
# Constructor that allows
|
19
|
+
def initialize arg=nil
|
20
|
+
@node = if arg.is_a?(RDF::Node)
|
21
|
+
arg
|
22
|
+
elsif arg.is_a?(Hash)
|
23
|
+
new_node = Node('*')
|
24
|
+
new_node.rdf::type = rdf_type
|
25
|
+
arg.each { |k,v| new_node[k] = (new_node[k] + [v].flatten).uniq }
|
26
|
+
new_node
|
27
|
+
else
|
28
|
+
new_node = Node('*')
|
29
|
+
new_node.rdf::type = rdf_type
|
30
|
+
new_node
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
# Equality method delegated to node
|
35
|
+
def == other_node
|
36
|
+
@node.eql? other_node.node
|
37
|
+
end
|
38
|
+
# Equality method delegated to node
|
39
|
+
def eql? other_node
|
40
|
+
self.class == other_node.class and @node.id == other_node.node.id
|
41
|
+
end
|
42
|
+
# Hash method delegated to node
|
43
|
+
def hash # Hack for Ruby 1.8.6
|
44
|
+
@node.id.hash ^ self.class.hash
|
45
|
+
end
|
46
|
+
|
47
|
+
# to_s method delegated to node
|
48
|
+
def to_s
|
49
|
+
@node.to_s
|
50
|
+
end
|
51
|
+
|
52
|
+
# id method delegated to node
|
53
|
+
def id
|
54
|
+
@node.id
|
55
|
+
end
|
56
|
+
|
57
|
+
def rdf_type
|
58
|
+
self.class.instance_variable_get("@rdf_type")
|
59
|
+
end
|
60
|
+
|
61
|
+
# Any other method (including any predicate) delegated to node
|
62
|
+
def method_missing method, *args
|
63
|
+
@node.send method, args
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
data/lib/lightrdf.rb
CHANGED
@@ -2,7 +2,7 @@ $:.unshift(File.dirname(__FILE__)) unless
|
|
2
2
|
$:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
3
3
|
|
4
4
|
module RDF
|
5
|
-
VERSION = '0.
|
5
|
+
VERSION = '0.2.0'
|
6
6
|
end
|
7
7
|
|
8
8
|
require 'rubygems'
|
@@ -20,4 +20,5 @@ require "lightrdf/id"
|
|
20
20
|
require "lightrdf/parser"
|
21
21
|
require "lightrdf/graph"
|
22
22
|
require "lightrdf/node"
|
23
|
+
require "lightrdf/node_proxy"
|
23
24
|
require "lightrdf/repository"
|
data/lightrdf.gemspec
CHANGED
@@ -2,17 +2,17 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{lightrdf}
|
5
|
-
s.version = "0.
|
5
|
+
s.version = "0.2.0"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["Jose Ignacio"]
|
9
|
-
s.date = %q{2011-
|
9
|
+
s.date = %q{2011-03-03}
|
10
10
|
s.default_executable = %q{yarfp}
|
11
11
|
s.description = %q{RDF library}
|
12
12
|
s.email = %q{joseignacio.fernandez@gmail.com}
|
13
13
|
s.executables = ["yarfp"]
|
14
|
-
s.extra_rdoc_files = ["README.rdoc", "bin/yarfp", "lib/lightrdf.rb", "lib/lightrdf/graph.rb", "lib/lightrdf/node.rb", "lib/lightrdf/parser.rb", "lib/lightrdf/repository.rb", "lib/lightrdf/id.rb"]
|
15
|
-
s.files = ["History.txt", "Manifest", "README.rdoc", "Rakefile", "bin/yarfp", "lib/lightrdf.rb", "lib/lightrdf/graph.rb", "lib/lightrdf/node.rb", "lib/lightrdf/parser.rb", "lib/lightrdf/repository.rb", "lib/lightrdf/id.rb", "test/test_helper.rb", "test/test_lightrdf.rb", "lightrdf.gemspec"]
|
14
|
+
s.extra_rdoc_files = ["README.rdoc", "bin/yarfp", "lib/lightrdf.rb", "lib/lightrdf/graph.rb", "lib/lightrdf/node.rb", "lib/lightrdf/node_proxy.rb", "lib/lightrdf/parser.rb", "lib/lightrdf/repository.rb", "lib/lightrdf/id.rb"]
|
15
|
+
s.files = ["History.txt", "Manifest", "README.rdoc", "Rakefile", "bin/yarfp", "lib/lightrdf.rb", "lib/lightrdf/graph.rb", "lib/lightrdf/node.rb", "lib/lightrdf/node_proxy.rb", "lib/lightrdf/parser.rb", "lib/lightrdf/repository.rb", "lib/lightrdf/id.rb", "test/test_helper.rb", "test/test_lightrdf.rb", "lightrdf.gemspec"]
|
16
16
|
s.homepage = %q{http://github.com/josei/lighrdf}
|
17
17
|
s.post_install_message = %q{**Remember to install raptor RDF tools and (optionally for RDF PNG output) Graphviz**}
|
18
18
|
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Lightrdf", "--main", "README.rdoc"]
|
data/test/test_lightrdf.rb
CHANGED
@@ -1,12 +1,27 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/test_helper.rb'
|
2
2
|
|
3
|
-
|
3
|
+
Namespace :ex, 'http://www.example.com/ontology#'
|
4
|
+
Namespace :foaf, 'http://xmlns.com/foaf/0.1/'
|
5
|
+
|
6
|
+
module Foaf
|
7
|
+
class Person
|
8
|
+
include RDF::NodeProxy
|
9
|
+
|
10
|
+
# Adds 1 year to the person's age
|
11
|
+
def happy_birthday!
|
12
|
+
foaf::age = (foaf::age.first.to_i + 1).to_s
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
4
16
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
17
|
+
module Foaf
|
18
|
+
class Thing
|
19
|
+
include RDF::NodeProxy
|
20
|
+
maps 'http://xmlns.com/foaf/0.1/Agent'
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
class TestLightRDF < Test::Unit::TestCase
|
10
25
|
def test_equality
|
11
26
|
assert Node('_:something') == Node(Node('_:something'))
|
12
27
|
assert ID('_:2') == ID('_:2')
|
@@ -167,4 +182,39 @@ foaf: http://xmlns.com/foaf/0.1/
|
|
167
182
|
# Check if the added context is there
|
168
183
|
assert contexts.include?("http://test_repository_contexts.org")
|
169
184
|
end
|
185
|
+
|
186
|
+
def test_instantiation
|
187
|
+
assert_equal Node("foaf:Person"), Foaf::Person.new.rdf::type.first
|
188
|
+
assert_equal Node("foaf:Agent"), Foaf::Thing.new.rdf::type.first
|
189
|
+
|
190
|
+
person_node = Node(nil)
|
191
|
+
person_node.foaf::age = "19"
|
192
|
+
person = Foaf::Person.new(person_node)
|
193
|
+
assert_equal ["19"], person.foaf::age
|
194
|
+
|
195
|
+
person = Foaf::Person.new('foaf:age'=>"25", 'rdf:type'=>Node('rdf:Resource'))
|
196
|
+
person.happy_birthday!
|
197
|
+
assert_equal ["26"], person.foaf::age
|
198
|
+
assert_equal Node("foaf:Person"), person.rdf::type.first
|
199
|
+
end
|
200
|
+
|
201
|
+
def test_graph_instantiation
|
202
|
+
graph = RDF::Graph.new
|
203
|
+
person_node = Node(nil)
|
204
|
+
person_node.rdf::type = Node('foaf:Person')
|
205
|
+
person_node.foaf::age = "25"
|
206
|
+
graph << person_node
|
207
|
+
|
208
|
+
person = graph.node(person_node)
|
209
|
+
person.happy_birthday!
|
210
|
+
assert_equal ["26"], person.foaf::age
|
211
|
+
end
|
212
|
+
|
213
|
+
def test_instance_equality
|
214
|
+
node = Node(nil)
|
215
|
+
node.foaf::age = "25"
|
216
|
+
person1 = Foaf::Person.new(node)
|
217
|
+
person2 = Foaf::Person.new(node)
|
218
|
+
assert_equal person1.id, person2.id
|
219
|
+
end
|
170
220
|
end
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
8
|
-
-
|
9
|
-
version: 0.
|
7
|
+
- 2
|
8
|
+
- 0
|
9
|
+
version: 0.2.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Jose Ignacio
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2011-
|
17
|
+
date: 2011-03-03 00:00:00 +01:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -71,6 +71,7 @@ extra_rdoc_files:
|
|
71
71
|
- lib/lightrdf.rb
|
72
72
|
- lib/lightrdf/graph.rb
|
73
73
|
- lib/lightrdf/node.rb
|
74
|
+
- lib/lightrdf/node_proxy.rb
|
74
75
|
- lib/lightrdf/parser.rb
|
75
76
|
- lib/lightrdf/repository.rb
|
76
77
|
- lib/lightrdf/id.rb
|
@@ -83,6 +84,7 @@ files:
|
|
83
84
|
- lib/lightrdf.rb
|
84
85
|
- lib/lightrdf/graph.rb
|
85
86
|
- lib/lightrdf/node.rb
|
87
|
+
- lib/lightrdf/node_proxy.rb
|
86
88
|
- lib/lightrdf/parser.rb
|
87
89
|
- lib/lightrdf/repository.rb
|
88
90
|
- lib/lightrdf/id.rb
|