redlander 0.3.6 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +20 -0
- data/ChangeLog +19 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +30 -0
- data/LICENSE +7 -0
- data/README.rdoc +85 -12
- data/Rakefile +5 -4
- data/lib/redland.rb +6 -2
- data/lib/redlander.rb +5 -3
- data/lib/redlander/model.rb +98 -16
- data/lib/redlander/model_proxy.rb +115 -58
- data/lib/redlander/node.rb +62 -59
- data/lib/redlander/parsing.rb +123 -0
- data/lib/redlander/serializing.rb +89 -0
- data/lib/redlander/statement.rb +61 -60
- data/lib/redlander/uri.rb +20 -13
- data/lib/redlander/version.rb +2 -1
- data/redlander.gemspec +28 -0
- data/spec/fixtures/doap.nt +62 -0
- data/spec/fixtures/doap.rdf +189 -0
- data/spec/fixtures/doap.ttl +53 -0
- data/spec/lib/redlander/model_spec.rb +304 -0
- data/spec/{redlander → lib/redlander}/node_spec.rb +26 -12
- data/spec/lib/redlander/statement_spec.rb +56 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +15 -4
- metadata +49 -37
- data/lib/redlander/error_container.rb +0 -42
- data/lib/redlander/parser.rb +0 -92
- data/lib/redlander/parser_proxy.rb +0 -22
- data/lib/redlander/serializer.rb +0 -85
- data/lib/redlander/storage.rb +0 -56
- data/lib/redlander/stream.rb +0 -57
- data/lib/redlander/stream_enumerator.rb +0 -17
- data/spec/redlander/model_spec.rb +0 -255
- data/spec/redlander/parser_spec.rb +0 -96
- data/spec/redlander/serializer_spec.rb +0 -52
- data/spec/redlander/statement_spec.rb +0 -77
@@ -1,17 +1,25 @@
|
|
1
1
|
require "spec_helper"
|
2
|
-
|
3
|
-
require 'date'
|
2
|
+
require "date"
|
4
3
|
|
5
4
|
describe Node do
|
5
|
+
before { @options = {} }
|
6
6
|
|
7
7
|
describe "blank" do
|
8
|
-
subject {
|
8
|
+
subject { described_class.new(nil, @options) }
|
9
9
|
|
10
10
|
it { should be_blank }
|
11
11
|
|
12
12
|
it "should have a blank identifier for a blank node" do
|
13
13
|
subject.value.should match(/^_:\w+$/)
|
14
14
|
end
|
15
|
+
|
16
|
+
context "when given :blank_id" do
|
17
|
+
before { @options = {:blank_id => "blank0"} }
|
18
|
+
|
19
|
+
it "should create a node with the given identifier" do
|
20
|
+
expect(subject.value).to eql "_:blank0"
|
21
|
+
end
|
22
|
+
end
|
15
23
|
end
|
16
24
|
|
17
25
|
it "should create a resource node" do
|
@@ -19,46 +27,53 @@ describe Node do
|
|
19
27
|
Node.new(resource_uri).should be_resource
|
20
28
|
end
|
21
29
|
|
30
|
+
it "should create a literal node from a literal rdf_node" do
|
31
|
+
node1 = Node.new("hello, world")
|
32
|
+
node2 = Node.new(node1.rdf_node)
|
33
|
+
node2.datatype.should_not be_nil
|
34
|
+
node2.datatype.should eql node1.datatype
|
35
|
+
end
|
36
|
+
|
22
37
|
it "should create a string literal" do
|
23
38
|
node = Node.new("hello, world")
|
24
39
|
node.should be_literal
|
25
|
-
node.datatype.should eql("http://www.w3.org/2001/XMLSchema#string")
|
40
|
+
node.datatype.should eql URI("http://www.w3.org/2001/XMLSchema#string")
|
26
41
|
end
|
27
42
|
|
28
43
|
it "should create a boolean literal" do
|
29
44
|
node = Node.new(true)
|
30
45
|
node.should be_literal
|
31
|
-
node.datatype.should eql("http://www.w3.org/2001/XMLSchema#boolean")
|
46
|
+
node.datatype.should eql URI("http://www.w3.org/2001/XMLSchema#boolean")
|
32
47
|
end
|
33
48
|
|
34
49
|
it "should create an integer number literal" do
|
35
50
|
node = Node.new(10)
|
36
51
|
node.should be_literal
|
37
|
-
node.datatype.should eql("http://www.w3.org/2001/XMLSchema#int")
|
52
|
+
node.datatype.should eql URI("http://www.w3.org/2001/XMLSchema#int")
|
38
53
|
end
|
39
54
|
|
40
55
|
it "should create a floating-point number literal" do
|
41
56
|
node = Node.new(3.1416)
|
42
57
|
node.should be_literal
|
43
|
-
node.datatype.should eql("http://www.w3.org/2001/XMLSchema#float")
|
58
|
+
node.datatype.should eql URI("http://www.w3.org/2001/XMLSchema#float")
|
44
59
|
end
|
45
60
|
|
46
61
|
it "should create a time literal" do
|
47
62
|
node = Node.new(Time.now)
|
48
63
|
node.should be_literal
|
49
|
-
node.datatype.should eql("http://www.w3.org/2001/XMLSchema#time")
|
64
|
+
node.datatype.should eql URI("http://www.w3.org/2001/XMLSchema#time")
|
50
65
|
end
|
51
66
|
|
52
67
|
it "should create a date literal" do
|
53
68
|
node = Node.new(Date.today)
|
54
69
|
node.should be_literal
|
55
|
-
node.datatype.should eql("http://www.w3.org/2001/XMLSchema#date")
|
70
|
+
node.datatype.should eql URI("http://www.w3.org/2001/XMLSchema#date")
|
56
71
|
end
|
57
72
|
|
58
73
|
it "should create a datetime literal" do
|
59
74
|
node = Node.new(DateTime.now)
|
60
75
|
node.should be_literal
|
61
|
-
node.datatype.should eql("http://www.w3.org/2001/XMLSchema#dateTime")
|
76
|
+
node.datatype.should eql URI("http://www.w3.org/2001/XMLSchema#dateTime")
|
62
77
|
end
|
63
78
|
|
64
79
|
it "should have proper string representation" do
|
@@ -75,8 +90,7 @@ describe Node do
|
|
75
90
|
end
|
76
91
|
|
77
92
|
it "should have an instance of URI for a resource node" do
|
78
|
-
resource_uri = URI
|
93
|
+
resource_uri = URI('http://example.com/nodes#node_1')
|
79
94
|
Node.new(resource_uri).value.should be_an_instance_of(URI::HTTP)
|
80
95
|
end
|
81
|
-
|
82
96
|
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Statement do
|
4
|
+
subject { described_class.new(statement_attributes) }
|
5
|
+
|
6
|
+
context "with default values" do
|
7
|
+
subject { described_class.new }
|
8
|
+
|
9
|
+
it "should have nil subject" do
|
10
|
+
subject.subject.should be_nil
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should have nil predicate" do
|
14
|
+
subject.predicate.should be_nil
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should have nil object" do
|
18
|
+
subject.object.should be_nil
|
19
|
+
end
|
20
|
+
|
21
|
+
[:subject, :predicate, :object].each do |attribute|
|
22
|
+
it "should be assigned a #{attribute}" do
|
23
|
+
attr = Node.new(statement_attributes[attribute])
|
24
|
+
expect {
|
25
|
+
subject.send("#{attribute}=", attr)
|
26
|
+
}.to change(subject, attribute).from(nil).to(attr)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should be created with the given values" do
|
32
|
+
subject.subject.should be_an_instance_of(Node)
|
33
|
+
subject.predicate.should be_an_instance_of(Node)
|
34
|
+
subject.object.should be_an_instance_of(Node)
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should have proper attributes" do
|
38
|
+
subject.subject.value.to_s.should eql('http://example.com/concepts#subject')
|
39
|
+
subject.predicate.value.to_s.should eql('http://example.com/concepts#label')
|
40
|
+
subject.object.value.should eql('subject!')
|
41
|
+
end
|
42
|
+
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def statement_attributes
|
47
|
+
s = URI.parse('http://example.com/concepts#subject')
|
48
|
+
p = URI.parse('http://example.com/concepts#label')
|
49
|
+
o = "subject!"
|
50
|
+
{
|
51
|
+
:subject => s,
|
52
|
+
:predicate => p,
|
53
|
+
:object => o
|
54
|
+
}
|
55
|
+
end
|
56
|
+
end
|
data/spec/spec.opts
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
data/spec/spec_helper.rb
CHANGED
@@ -1,7 +1,18 @@
|
|
1
|
-
require '
|
2
|
-
|
3
|
-
require 'lib/redlander'
|
1
|
+
require 'redlander'
|
4
2
|
include Redlander
|
5
3
|
|
6
|
-
|
4
|
+
# Helpful testing methods
|
5
|
+
Redlander.module_eval <<HERE
|
6
|
+
class << self
|
7
|
+
def root
|
8
|
+
'#{File.expand_path(File.join(File.dirname(__FILE__), ".."))}'
|
9
|
+
end
|
10
|
+
|
11
|
+
def fixture_path(filename = "")
|
12
|
+
File.join(root, "spec", "fixtures", filename)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
HERE
|
16
|
+
|
17
|
+
RSpec.configure do |config|
|
7
18
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: redlander
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-07-
|
12
|
+
date: 2012-07-23 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: xml_schema
|
@@ -18,7 +18,7 @@ dependencies:
|
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: 0.0
|
21
|
+
version: 0.1.0
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -26,7 +26,7 @@ dependencies:
|
|
26
26
|
requirements:
|
27
27
|
- - ~>
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version: 0.0
|
29
|
+
version: 0.1.0
|
30
30
|
- !ruby/object:Gem::Dependency
|
31
31
|
name: ffi
|
32
32
|
requirement: !ruby/object:Gem::Requirement
|
@@ -34,7 +34,7 @@ dependencies:
|
|
34
34
|
requirements:
|
35
35
|
- - ~>
|
36
36
|
- !ruby/object:Gem::Version
|
37
|
-
version: '1.
|
37
|
+
version: '1.1'
|
38
38
|
type: :runtime
|
39
39
|
prerelease: false
|
40
40
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -42,7 +42,7 @@ dependencies:
|
|
42
42
|
requirements:
|
43
43
|
- - ~>
|
44
44
|
- !ruby/object:Gem::Version
|
45
|
-
version: '1.
|
45
|
+
version: '1.1'
|
46
46
|
- !ruby/object:Gem::Dependency
|
47
47
|
name: rspec
|
48
48
|
requirement: !ruby/object:Gem::Requirement
|
@@ -50,7 +50,7 @@ dependencies:
|
|
50
50
|
requirements:
|
51
51
|
- - ~>
|
52
52
|
- !ruby/object:Gem::Version
|
53
|
-
version: '
|
53
|
+
version: '2'
|
54
54
|
type: :development
|
55
55
|
prerelease: false
|
56
56
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -58,43 +58,52 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - ~>
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
62
|
-
description: ! '
|
61
|
+
version: '2'
|
62
|
+
description: ! 'Redlander is Ruby bindings to Redland library (see http://librdf.org)
|
63
|
+
written in C, which is used to manipulate RDF graphs. This is an alternative implementation
|
64
|
+
of Ruby bindings (as opposed to the official bindings), aiming to be more intuitive,
|
65
|
+
lightweight, high-performing and as bug-free as possible.
|
63
66
|
|
64
67
|
'
|
65
|
-
email:
|
68
|
+
email:
|
69
|
+
- slava.kravchenko@gmail.com
|
66
70
|
executables: []
|
67
71
|
extensions: []
|
68
72
|
extra_rdoc_files:
|
69
73
|
- README.rdoc
|
74
|
+
- ChangeLog
|
70
75
|
files:
|
76
|
+
- .gitignore
|
77
|
+
- ChangeLog
|
78
|
+
- Gemfile
|
79
|
+
- Gemfile.lock
|
80
|
+
- LICENSE
|
81
|
+
- README.rdoc
|
82
|
+
- Rakefile
|
71
83
|
- lib/redland.rb
|
72
|
-
- lib/redlander
|
73
|
-
- lib/redlander/model_proxy.rb
|
74
|
-
- lib/redlander/parser.rb
|
75
|
-
- lib/redlander/parser_proxy.rb
|
76
|
-
- lib/redlander/serializer.rb
|
77
|
-
- lib/redlander/storage.rb
|
78
|
-
- lib/redlander/stream.rb
|
79
|
-
- lib/redlander/stream_enumerator.rb
|
80
|
-
- lib/redlander/version.rb
|
81
|
-
- lib/redlander/uri.rb
|
84
|
+
- lib/redlander.rb
|
82
85
|
- lib/redlander/exceptions.rb
|
83
86
|
- lib/redlander/model.rb
|
87
|
+
- lib/redlander/model_proxy.rb
|
84
88
|
- lib/redlander/node.rb
|
89
|
+
- lib/redlander/parsing.rb
|
90
|
+
- lib/redlander/serializing.rb
|
85
91
|
- lib/redlander/statement.rb
|
86
|
-
- lib/redlander.rb
|
92
|
+
- lib/redlander/uri.rb
|
93
|
+
- lib/redlander/version.rb
|
94
|
+
- redlander.gemspec
|
95
|
+
- spec/fixtures/doap.nt
|
96
|
+
- spec/fixtures/doap.rdf
|
97
|
+
- spec/fixtures/doap.ttl
|
87
98
|
- spec/integration/memory_leak_spec.rb
|
88
|
-
- spec/redlander/model_spec.rb
|
89
|
-
- spec/redlander/
|
90
|
-
- spec/redlander/
|
91
|
-
- spec/
|
92
|
-
- spec/redlander/node_spec.rb
|
99
|
+
- spec/lib/redlander/model_spec.rb
|
100
|
+
- spec/lib/redlander/node_spec.rb
|
101
|
+
- spec/lib/redlander/statement_spec.rb
|
102
|
+
- spec/spec.opts
|
93
103
|
- spec/spec_helper.rb
|
94
|
-
- Rakefile
|
95
|
-
- README.rdoc
|
96
104
|
homepage: https://github.com/cordawyn/redlander
|
97
|
-
licenses:
|
105
|
+
licenses:
|
106
|
+
- The MIT License (MIT)
|
98
107
|
post_install_message:
|
99
108
|
rdoc_options: []
|
100
109
|
require_paths:
|
@@ -107,7 +116,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
107
116
|
version: '0'
|
108
117
|
segments:
|
109
118
|
- 0
|
110
|
-
hash:
|
119
|
+
hash: 3614393653179496496
|
111
120
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
112
121
|
none: false
|
113
122
|
requirements:
|
@@ -116,17 +125,20 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
116
125
|
version: '0'
|
117
126
|
segments:
|
118
127
|
- 0
|
119
|
-
hash:
|
128
|
+
hash: 3614393653179496496
|
120
129
|
requirements: []
|
121
130
|
rubyforge_project:
|
122
131
|
rubygems_version: 1.8.24
|
123
132
|
signing_key:
|
124
133
|
specification_version: 3
|
125
|
-
summary: Advanced Redland
|
134
|
+
summary: Advanced Ruby bindings for Redland runtime library (librdf).
|
126
135
|
test_files:
|
136
|
+
- spec/fixtures/doap.nt
|
137
|
+
- spec/fixtures/doap.rdf
|
138
|
+
- spec/fixtures/doap.ttl
|
127
139
|
- spec/integration/memory_leak_spec.rb
|
128
|
-
- spec/redlander/model_spec.rb
|
129
|
-
- spec/redlander/
|
130
|
-
- spec/redlander/
|
131
|
-
- spec/
|
132
|
-
- spec/
|
140
|
+
- spec/lib/redlander/model_spec.rb
|
141
|
+
- spec/lib/redlander/node_spec.rb
|
142
|
+
- spec/lib/redlander/statement_spec.rb
|
143
|
+
- spec/spec.opts
|
144
|
+
- spec/spec_helper.rb
|
@@ -1,42 +0,0 @@
|
|
1
|
-
module Redlander
|
2
|
-
module ErrorContainer
|
3
|
-
class Errors
|
4
|
-
include Enumerable
|
5
|
-
|
6
|
-
def initialize
|
7
|
-
@container = []
|
8
|
-
end
|
9
|
-
|
10
|
-
def add(error_message)
|
11
|
-
if @container.include?(error_message)
|
12
|
-
@container
|
13
|
-
else
|
14
|
-
@container << error_message
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
def each
|
19
|
-
@container.each do |err|
|
20
|
-
yield err
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
def empty?
|
25
|
-
@container.empty?
|
26
|
-
end
|
27
|
-
|
28
|
-
def clear
|
29
|
-
@container.clear
|
30
|
-
end
|
31
|
-
|
32
|
-
def size
|
33
|
-
@container.size
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
def errors
|
38
|
-
@errors ||= Errors.new
|
39
|
-
end
|
40
|
-
|
41
|
-
end
|
42
|
-
end
|
data/lib/redlander/parser.rb
DELETED
@@ -1,92 +0,0 @@
|
|
1
|
-
require 'redlander/parser_proxy'
|
2
|
-
|
3
|
-
module Redlander
|
4
|
-
class Parser
|
5
|
-
attr_reader :rdf_parser
|
6
|
-
|
7
|
-
# Create a new parser.
|
8
|
-
# Name can be either of [:rdfxml, :ntriples, :turtle],
|
9
|
-
# or nil, which defaults to :rdfxml.
|
10
|
-
#
|
11
|
-
# TODO: Only a small subset of parsers is implemented,
|
12
|
-
# because the rest seem to be very buggy.
|
13
|
-
def initialize(name = :rdfxml)
|
14
|
-
# name, mime-type and syntax uri can all be nil, which defaults to :rdfxml parser
|
15
|
-
@rdf_parser = Redland.librdf_new_parser(Redlander.rdf_world, name.to_s, nil, nil)
|
16
|
-
raise RedlandError.new("Failed to create a new parser") if @rdf_parser.null?
|
17
|
-
ObjectSpace.define_finalizer(self, proc { Redland.librdf_free_parser(@rdf_parser) })
|
18
|
-
end
|
19
|
-
|
20
|
-
# Parse the content (String) into the model.
|
21
|
-
#
|
22
|
-
# Options are:
|
23
|
-
# :base_uri base URI (String or URI)
|
24
|
-
#
|
25
|
-
# Returns true on success, or false.
|
26
|
-
def from_string(model, content, options = {})
|
27
|
-
# FIXME: A bug (?) in Redland breaks NTriples parser if its input is not terminated with "\n"
|
28
|
-
content.concat("\n") unless content.end_with?("\n")
|
29
|
-
base_uri = if options.has_key?(:base_uri)
|
30
|
-
Uri.new(options[:base_uri]).rdf_uri
|
31
|
-
else
|
32
|
-
nil
|
33
|
-
end
|
34
|
-
Redland.librdf_parser_parse_string_into_model(@rdf_parser, content, base_uri, model.rdf_model).zero?
|
35
|
-
end
|
36
|
-
|
37
|
-
# Parse the content from URI into the model.
|
38
|
-
# (It is possible to use "file:" schema for local files).
|
39
|
-
#
|
40
|
-
# Options are:
|
41
|
-
# :base_uri base URI (String or URI)
|
42
|
-
#
|
43
|
-
# Returns true on success, or false.
|
44
|
-
def from_uri(model, uri, options = {})
|
45
|
-
uri = URI.parse(uri)
|
46
|
-
uri = URI.parse("file://#{File.expand_path(uri.to_s)}") if uri.scheme.nil?
|
47
|
-
base_uri = if options.has_key?(:base_uri)
|
48
|
-
Uri.new(options[:base_uri]).rdf_uri
|
49
|
-
else
|
50
|
-
nil
|
51
|
-
end
|
52
|
-
Redland.librdf_parser_parse_into_model(@rdf_parser, Uri.new(uri).rdf_uri, base_uri, model.rdf_model).zero?
|
53
|
-
end
|
54
|
-
alias_method :from_file, :from_uri
|
55
|
-
|
56
|
-
def statements(content, options = {})
|
57
|
-
# FIXME: A bug (?) in Redland breaks NTriples parser if its input is not terminated with "\n"
|
58
|
-
content.concat("\n") unless content.end_with?("\n")
|
59
|
-
ParserProxy.new(self, content, options)
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
# Applied to Model
|
64
|
-
module ParsingInstanceMethods
|
65
|
-
def from_rdfxml(content, options = {})
|
66
|
-
parser = Parser.new(:rdfxml)
|
67
|
-
parser.from_string(self, content, options)
|
68
|
-
end
|
69
|
-
|
70
|
-
def from_ntriples(content, options = {})
|
71
|
-
parser = Parser.new(:ntriples)
|
72
|
-
parser.from_string(self, content, options)
|
73
|
-
end
|
74
|
-
|
75
|
-
def from_turtle(content, options = {})
|
76
|
-
parser = Parser.new(:turtle)
|
77
|
-
parser.from_string(self, content, options)
|
78
|
-
end
|
79
|
-
|
80
|
-
# Load the model from an URI content.
|
81
|
-
#
|
82
|
-
# Options are:
|
83
|
-
# :format - content format [:rdfxml (default), :ntriples, :turtle]
|
84
|
-
# :base_uri - base URI
|
85
|
-
def from_uri(uri, options = {})
|
86
|
-
parser_options = options.dup
|
87
|
-
parser = Parser.new(parser_options.delete(:format) || :rdfxml)
|
88
|
-
parser.from_uri(self, uri, parser_options)
|
89
|
-
end
|
90
|
-
alias_method :from_file, :from_uri
|
91
|
-
end
|
92
|
-
end
|