redlander 0.2.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/README.rdoc +59 -0
- data/Rakefile +5 -0
- data/ext/README +1 -0
- data/ext/extconf.rb +17 -0
- data/ext/redland-pre.i +6 -0
- data/ext/redland-types.i +9 -0
- data/ext/redland_wrap.c +8052 -0
- data/lib/redlander.rb +61 -0
- data/lib/redlander/error_container.rb +41 -0
- data/lib/redlander/model.rb +33 -0
- data/lib/redlander/model_proxy.rb +85 -0
- data/lib/redlander/node.rb +90 -0
- data/lib/redlander/parser.rb +92 -0
- data/lib/redlander/parser_proxy.rb +18 -0
- data/lib/redlander/serializer.rb +80 -0
- data/lib/redlander/statement.rb +153 -0
- data/lib/redlander/statement_iterator.rb +37 -0
- data/lib/redlander/storage.rb +79 -0
- data/lib/redlander/version.rb +3 -0
- data/spec/redlander/model_spec.rb +239 -0
- data/spec/redlander/node_spec.rb +85 -0
- data/spec/redlander/parser_spec.rb +96 -0
- data/spec/redlander/serializer_spec.rb +52 -0
- data/spec/redlander/statement_spec.rb +86 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +10 -0
- metadata +127 -0
@@ -0,0 +1,85 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
require 'date'
|
4
|
+
|
5
|
+
describe Node do
|
6
|
+
|
7
|
+
it "should be created with default options" do
|
8
|
+
lambda { Node.new }.should_not raise_exception
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should create a blank node" do
|
12
|
+
Node.new.should be_blank
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should create a resource node" do
|
16
|
+
resource_uri = URI.parse('http://example.com/nodes#node_1')
|
17
|
+
Node.new(resource_uri).should be_resource
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should create a string literal" do
|
21
|
+
node = Node.new("hello, world")
|
22
|
+
node.should be_literal
|
23
|
+
node.datatype.should eql("http://www.w3.org/2001/XMLSchema#string")
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should create a boolean literal" do
|
27
|
+
node = Node.new(true)
|
28
|
+
node.should be_literal
|
29
|
+
node.datatype.should eql("http://www.w3.org/2001/XMLSchema#boolean")
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should create an integer number literal" do
|
33
|
+
node = Node.new(10)
|
34
|
+
node.should be_literal
|
35
|
+
node.datatype.should eql("http://www.w3.org/2001/XMLSchema#int")
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should create a floating-point number literal" do
|
39
|
+
node = Node.new(3.1416)
|
40
|
+
node.should be_literal
|
41
|
+
node.datatype.should eql("http://www.w3.org/2001/XMLSchema#float")
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should create a time literal" do
|
45
|
+
node = Node.new(Time.now)
|
46
|
+
node.should be_literal
|
47
|
+
node.datatype.should eql("http://www.w3.org/2001/XMLSchema#time")
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should create a date literal" do
|
51
|
+
node = Node.new(Date.today)
|
52
|
+
node.should be_literal
|
53
|
+
node.datatype.should eql("http://www.w3.org/2001/XMLSchema#date")
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should create a datetime literal" do
|
57
|
+
node = Node.new(DateTime.now)
|
58
|
+
node.should be_literal
|
59
|
+
node.datatype.should eql("http://www.w3.org/2001/XMLSchema#dateTime")
|
60
|
+
end
|
61
|
+
|
62
|
+
it "should have proper string representation" do
|
63
|
+
node = Node.new("Bye-bye, cruel world...")
|
64
|
+
node.to_s.should eql('"Bye-bye, cruel world..."^^<http://www.w3.org/2001/XMLSchema#string>')
|
65
|
+
end
|
66
|
+
|
67
|
+
it "should have a proper value for a literal node" do
|
68
|
+
t = Time.now
|
69
|
+
node = Node.new(t)
|
70
|
+
node.value.should be_an_instance_of(Time)
|
71
|
+
# surprisingly, two instances of the same time do not compare
|
72
|
+
node.value.xmlschema.should eql(t.xmlschema)
|
73
|
+
end
|
74
|
+
|
75
|
+
it "should have a blank identifier for a blank node" do
|
76
|
+
node = Node.new
|
77
|
+
node.value.should match(/^\(\w+\)$/)
|
78
|
+
end
|
79
|
+
|
80
|
+
it "should have an instance of URI for a resource node" do
|
81
|
+
resource_uri = URI.parse('http://example.com/nodes#node_1')
|
82
|
+
Node.new(resource_uri).value.should be_an_instance_of(URI::HTTP)
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Parser do
|
4
|
+
|
5
|
+
it "should be created with default values" do
|
6
|
+
lambda {
|
7
|
+
Parser.new
|
8
|
+
}.should_not raise_exception
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "string source" do
|
12
|
+
|
13
|
+
it "should be parsed into the model" do
|
14
|
+
parser = Parser.new
|
15
|
+
model = Model.new
|
16
|
+
lambda {
|
17
|
+
parser.from_string(model, content[:rdfxml], :base_uri => base_uri[:rdfxml])
|
18
|
+
}.should change(model.statements, :size).by(1)
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
describe "file source" do
|
24
|
+
|
25
|
+
before :each do
|
26
|
+
reference_model = Model.new
|
27
|
+
reference_model.from_rdfxml(content[:rdfxml], :base_uri => base_uri[:rdfxml])
|
28
|
+
reference_model.to_file(filename)
|
29
|
+
end
|
30
|
+
|
31
|
+
after :each do
|
32
|
+
cleanup
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should be parsed into the model" do
|
36
|
+
parser = Parser.new
|
37
|
+
model = Model.new
|
38
|
+
lambda {
|
39
|
+
parser.from_file(model, filename, :base_uri => base_uri[:rdfxml])
|
40
|
+
}.should change(model.statements, :size).by(1)
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
describe "statements" do
|
47
|
+
|
48
|
+
it do
|
49
|
+
Parser.new(:ntriples).statements(content[:ntriples]).should be_an_instance_of(ParserProxy)
|
50
|
+
end
|
51
|
+
|
52
|
+
[:rdfxml, :turtle, :ntriples].each do |format|
|
53
|
+
it "should parse #{format} content" do
|
54
|
+
parser = Parser.new(format)
|
55
|
+
statements = []
|
56
|
+
lambda {
|
57
|
+
parser.statements(content[format], :base_uri => base_uri[format]).each do |st|
|
58
|
+
statements << st
|
59
|
+
end
|
60
|
+
}.should change(statements, :size).by(1)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
|
66
|
+
|
67
|
+
private
|
68
|
+
|
69
|
+
def cleanup
|
70
|
+
File.delete(filename) if File.exists?(filename)
|
71
|
+
end
|
72
|
+
|
73
|
+
def filename
|
74
|
+
"test_model.rdf"
|
75
|
+
end
|
76
|
+
|
77
|
+
def content
|
78
|
+
{
|
79
|
+
:ntriples => '<http://example.org/ns/a2> <http://example.org/ns/b2> <http://example.org/ns/c2> .',
|
80
|
+
:turtle => '# this is a complete turtle document
|
81
|
+
@prefix foo: <http://example.org/ns#> .
|
82
|
+
@prefix : <http://other.example.org/ns#> .
|
83
|
+
foo:bar foo: : .',
|
84
|
+
:rdfxml => '<?xml version="1.0" encoding="utf-8"?><rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"><rdf:Description rdf:about="http://example.com/concepts#two-dimensional_seismic_imaging"><ns0:label xmlns:ns0="http://www.w3.org/2000/01/rdf-schema#" xml:lang="en">2-D seismic imaging</ns0:label></rdf:Description></rdf:RDF>'
|
85
|
+
}
|
86
|
+
end
|
87
|
+
|
88
|
+
def base_uri
|
89
|
+
{
|
90
|
+
:ntriples => nil,
|
91
|
+
:turtle => 'http://example.com/concepts',
|
92
|
+
:rdfxml => 'http://example.com/concepts'
|
93
|
+
}
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Serializer do
|
4
|
+
|
5
|
+
it "should be created with default values" do
|
6
|
+
lambda {
|
7
|
+
Serializer.new
|
8
|
+
}.should_not raise_exception
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "model" do
|
12
|
+
|
13
|
+
before :each do
|
14
|
+
@model = Model.new
|
15
|
+
s = URI.parse("http://example.com/concepts#two-dimensional_seismic_imaging")
|
16
|
+
p = URI.parse("http://www.w3.org/2000/01/rdf-schema#label")
|
17
|
+
o = "2-D seismic imaging@en"
|
18
|
+
@model.statements.create(:subject => s, :predicate => p, :object => o)
|
19
|
+
end
|
20
|
+
|
21
|
+
[:rdfxml, :ntriples, :turtle, :dot, :json].each do |format|
|
22
|
+
it "should be serialized into a #{format} string" do
|
23
|
+
serializer = Serializer.new(format)
|
24
|
+
output = serializer.to_string(@model)
|
25
|
+
output.should be_an_instance_of(String)
|
26
|
+
output.should_not be_empty
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should be serialized into a file" do
|
31
|
+
cleanup
|
32
|
+
serializer = Serializer.new(:ntriples)
|
33
|
+
serializer.to_file(@model, filename)
|
34
|
+
File.should be_exists(filename)
|
35
|
+
File.size(filename).should_not be_zero
|
36
|
+
cleanup
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def cleanup
|
43
|
+
File.delete(filename) if File.exists?(filename)
|
44
|
+
end
|
45
|
+
|
46
|
+
def filename
|
47
|
+
"test_model.nt"
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Statement do
|
4
|
+
|
5
|
+
it "should be created with default values" do
|
6
|
+
statement = nil
|
7
|
+
lambda { statement = Statement.new }.should_not raise_exception
|
8
|
+
statement.subject.should be_nil
|
9
|
+
statement.predicate.should be_nil
|
10
|
+
statement.object.should be_nil
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should be created with the given values" do
|
14
|
+
statement = create_statement
|
15
|
+
statement.subject.should be_an_instance_of(Node)
|
16
|
+
statement.predicate.should be_an_instance_of(Node)
|
17
|
+
statement.object.should be_an_instance_of(Node)
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should have proper attributes" do
|
21
|
+
statement = create_statement
|
22
|
+
statement.subject.value.to_s.should eql('http://example.com/concepts#subject')
|
23
|
+
statement.predicate.value.to_s.should eql('http://example.com/concepts#label')
|
24
|
+
statement.object.value.should eql('subject!')
|
25
|
+
end
|
26
|
+
|
27
|
+
it do
|
28
|
+
statement = Statement.new
|
29
|
+
lambda {
|
30
|
+
statement.should_not be_valid
|
31
|
+
}.should change(statement.errors, :size).by(1)
|
32
|
+
end
|
33
|
+
|
34
|
+
it do
|
35
|
+
create_statement.should be_valid
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should be added to the model" do
|
39
|
+
model = Model.new
|
40
|
+
statement = create_statement
|
41
|
+
lambda {
|
42
|
+
statement.model = model
|
43
|
+
}.should change(model.statements, :size).by(1)
|
44
|
+
statement.model.should be(model)
|
45
|
+
end
|
46
|
+
|
47
|
+
[:subject, :predicate, :object].each do |attribute|
|
48
|
+
it "should be assigned a #{attribute}" do
|
49
|
+
statement = Statement.new
|
50
|
+
attr = Node.new(statement_attributes[attribute])
|
51
|
+
lambda {
|
52
|
+
statement.send("#{attribute}=", attr)
|
53
|
+
}.should change(statement, attribute).from(nil).to(attr)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should not be assigned the same attribute twice" do
|
58
|
+
statement = Statement.new
|
59
|
+
object = "object!"
|
60
|
+
lambda {
|
61
|
+
2.times do
|
62
|
+
statement.object = object
|
63
|
+
end
|
64
|
+
}.should raise_exception
|
65
|
+
object.should be_frozen
|
66
|
+
end
|
67
|
+
|
68
|
+
|
69
|
+
private
|
70
|
+
|
71
|
+
def create_statement
|
72
|
+
Statement.new(statement_attributes)
|
73
|
+
end
|
74
|
+
|
75
|
+
def statement_attributes
|
76
|
+
s = URI.parse('http://example.com/concepts#subject')
|
77
|
+
p = URI.parse('http://example.com/concepts#label')
|
78
|
+
o = "subject!"
|
79
|
+
{
|
80
|
+
:subject => s,
|
81
|
+
:predicate => p,
|
82
|
+
:object => o
|
83
|
+
}
|
84
|
+
end
|
85
|
+
|
86
|
+
end
|
data/spec/spec.opts
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
$:.unshift(File.join(File.dirname(__FILE__), "..")) unless
|
2
|
+
$:.include?(File.join(File.dirname(__FILE__), "..")) || $:.include?(File.expand_path(File.join(File.dirname(__FILE__), "..")))
|
3
|
+
|
4
|
+
require 'spec/autorun'
|
5
|
+
|
6
|
+
require 'lib/redlander'
|
7
|
+
include Redlander
|
8
|
+
|
9
|
+
Spec::Runner.configure do |config|
|
10
|
+
end
|
metadata
ADDED
@@ -0,0 +1,127 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: redlander
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 21
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 2
|
9
|
+
- 1
|
10
|
+
version: 0.2.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Slava Kravchenko
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2011-06-18 00:00:00 +03:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: xml_schema
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - "="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 29
|
30
|
+
segments:
|
31
|
+
- 0
|
32
|
+
- 0
|
33
|
+
- 1
|
34
|
+
version: 0.0.1
|
35
|
+
type: :runtime
|
36
|
+
version_requirements: *id001
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: rspec
|
39
|
+
prerelease: false
|
40
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
hash: 1
|
46
|
+
segments:
|
47
|
+
- 1
|
48
|
+
version: "1"
|
49
|
+
type: :development
|
50
|
+
version_requirements: *id002
|
51
|
+
description: " Advanced Redland bindings.\n"
|
52
|
+
email: slava.kravchenko@gmail.com
|
53
|
+
executables: []
|
54
|
+
|
55
|
+
extensions:
|
56
|
+
- ext/extconf.rb
|
57
|
+
extra_rdoc_files:
|
58
|
+
- README.rdoc
|
59
|
+
files:
|
60
|
+
- lib/redlander/error_container.rb
|
61
|
+
- lib/redlander/model.rb
|
62
|
+
- lib/redlander/model_proxy.rb
|
63
|
+
- lib/redlander/node.rb
|
64
|
+
- lib/redlander/parser_proxy.rb
|
65
|
+
- lib/redlander/serializer.rb
|
66
|
+
- lib/redlander/statement.rb
|
67
|
+
- lib/redlander/statement_iterator.rb
|
68
|
+
- lib/redlander/storage.rb
|
69
|
+
- lib/redlander/version.rb
|
70
|
+
- lib/redlander/parser.rb
|
71
|
+
- spec/redlander/model_spec.rb
|
72
|
+
- spec/redlander/node_spec.rb
|
73
|
+
- spec/redlander/parser_spec.rb
|
74
|
+
- spec/redlander/serializer_spec.rb
|
75
|
+
- spec/redlander/statement_spec.rb
|
76
|
+
- spec/spec.opts
|
77
|
+
- spec/spec_helper.rb
|
78
|
+
- ext/extconf.rb
|
79
|
+
- ext/redland-pre.i
|
80
|
+
- ext/redland-types.i
|
81
|
+
- ext/redland_wrap.c
|
82
|
+
- ext/README
|
83
|
+
- Rakefile
|
84
|
+
- lib/redlander.rb
|
85
|
+
- README.rdoc
|
86
|
+
has_rdoc: true
|
87
|
+
homepage: https://github.com/cordawyn/redlander
|
88
|
+
licenses: []
|
89
|
+
|
90
|
+
post_install_message:
|
91
|
+
rdoc_options: []
|
92
|
+
|
93
|
+
require_paths:
|
94
|
+
- lib
|
95
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
96
|
+
none: false
|
97
|
+
requirements:
|
98
|
+
- - ">="
|
99
|
+
- !ruby/object:Gem::Version
|
100
|
+
hash: 3
|
101
|
+
segments:
|
102
|
+
- 0
|
103
|
+
version: "0"
|
104
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ">="
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
hash: 3
|
110
|
+
segments:
|
111
|
+
- 0
|
112
|
+
version: "0"
|
113
|
+
requirements: []
|
114
|
+
|
115
|
+
rubyforge_project:
|
116
|
+
rubygems_version: 1.6.2
|
117
|
+
signing_key:
|
118
|
+
specification_version: 3
|
119
|
+
summary: Advanced Redland bindings.
|
120
|
+
test_files:
|
121
|
+
- spec/redlander/model_spec.rb
|
122
|
+
- spec/redlander/node_spec.rb
|
123
|
+
- spec/redlander/parser_spec.rb
|
124
|
+
- spec/redlander/serializer_spec.rb
|
125
|
+
- spec/redlander/statement_spec.rb
|
126
|
+
- spec/spec.opts
|
127
|
+
- spec/spec_helper.rb
|