rdf-n3 0.2.2 → 0.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/History.txt +7 -0
- data/README.rdoc +3 -0
- data/Rakefile +7 -1
- data/VERSION +1 -1
- data/lib/rdf/n3.rb +3 -0
- data/lib/rdf/n3/reader.rb +14 -9
- data/lib/rdf/n3/reader/n3_grammar.rb +148 -260
- data/lib/rdf/n3/reader/n3_grammar.treetop +21 -21
- data/lib/rdf/n3/reader/n3_grammar_18.rb +3764 -0
- data/lib/rdf/n3/reader/n3_grammar_18.treetop +227 -0
- data/lib/rdf/n3/version.rb +4 -7
- data/lib/rdf/n3/writer.rb +61 -25
- data/rdf-n3.gemspec +7 -7
- data/script/parse +2 -2
- data/script/tc +1 -1
- data/spec/n3reader_spec.rb +53 -5
- data/spec/rdf_helper.rb +6 -6
- metadata +11 -9
- data/lib/rdf/n3/patches/literal_normalization.rb +0 -158
- data/lib/rdf/n3/patches/uri_hacks.rb +0 -29
@@ -0,0 +1,227 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
grammar N3Grammer
|
3
|
+
# Entry point to grammar
|
4
|
+
rule document
|
5
|
+
statements
|
6
|
+
end
|
7
|
+
|
8
|
+
rule barename
|
9
|
+
barename_start barename_tail*
|
10
|
+
end
|
11
|
+
|
12
|
+
rule barename_start
|
13
|
+
[A-Z_a-z\p{Alpha}]
|
14
|
+
end
|
15
|
+
|
16
|
+
rule barename_tail
|
17
|
+
barename_start / [-0-9\\]
|
18
|
+
end
|
19
|
+
|
20
|
+
rule hexdigit
|
21
|
+
[0-9a-fA-F]
|
22
|
+
end
|
23
|
+
|
24
|
+
rule integer
|
25
|
+
[+-]? [0-9]+
|
26
|
+
end
|
27
|
+
|
28
|
+
rule barename_csl
|
29
|
+
space+ barename barename_csl_tail
|
30
|
+
/ ""
|
31
|
+
end
|
32
|
+
|
33
|
+
rule barename_csl_tail
|
34
|
+
space* "," space* barename space* barename_csl_tail
|
35
|
+
/ ""
|
36
|
+
end
|
37
|
+
|
38
|
+
rule boolean
|
39
|
+
"@"* ("true" / "false")
|
40
|
+
end
|
41
|
+
|
42
|
+
rule comment
|
43
|
+
'#' (![\n\r] .)*
|
44
|
+
end
|
45
|
+
|
46
|
+
rule declaration
|
47
|
+
"@"? 'keywords' barename_csl {
|
48
|
+
def declaration; true; end
|
49
|
+
def keywords; true;end
|
50
|
+
}
|
51
|
+
/ "@"? 'base' space+ explicituri:explicituri {
|
52
|
+
def declaration; true; end
|
53
|
+
def base; true; end
|
54
|
+
}
|
55
|
+
/ "@"? 'prefix' space+ nprefix:nprefix? ':' space* explicituri:explicituri {
|
56
|
+
def declaration; true; end
|
57
|
+
}
|
58
|
+
end
|
59
|
+
|
60
|
+
rule decimal
|
61
|
+
integer '.' [0-9]+
|
62
|
+
end
|
63
|
+
|
64
|
+
rule double
|
65
|
+
decimal [eE] integer
|
66
|
+
end
|
67
|
+
|
68
|
+
rule existential
|
69
|
+
"@"? "forSome" space+ symbol_csl
|
70
|
+
end
|
71
|
+
|
72
|
+
rule explicituri
|
73
|
+
"<" uri:URI_Reference ">"
|
74
|
+
end
|
75
|
+
|
76
|
+
rule expression
|
77
|
+
pathitem space* '.' expression
|
78
|
+
/ pathitem space* "!" space* expression
|
79
|
+
/ pathitem space* "^" space* expression { def reverse; true; end }
|
80
|
+
/ pathitem
|
81
|
+
end
|
82
|
+
|
83
|
+
rule language
|
84
|
+
[a-zA-Z]+ ( "-" [a-zA-Z0-9]+ )*
|
85
|
+
end
|
86
|
+
|
87
|
+
rule literal
|
88
|
+
(string_single / string_multi) ("^^" symbol / "@" language )?
|
89
|
+
end
|
90
|
+
|
91
|
+
rule localname
|
92
|
+
barename
|
93
|
+
end
|
94
|
+
|
95
|
+
rule nprefix
|
96
|
+
barename
|
97
|
+
end
|
98
|
+
|
99
|
+
rule numericliteral
|
100
|
+
double { def numericliteral; "double"; end}
|
101
|
+
/ decimal { def numericliteral; "decimal"; end}
|
102
|
+
/ integer { def numericliteral; "integer"; end}
|
103
|
+
end
|
104
|
+
|
105
|
+
rule object
|
106
|
+
expression
|
107
|
+
end
|
108
|
+
|
109
|
+
rule object_list
|
110
|
+
object space* "," space* object_list
|
111
|
+
/ object
|
112
|
+
end
|
113
|
+
|
114
|
+
rule pathitem
|
115
|
+
boolean { def boolean; true; end }
|
116
|
+
/ literal { def literal; true; end }
|
117
|
+
/ numericliteral
|
118
|
+
#/ quickvariable
|
119
|
+
/ symbol
|
120
|
+
/ "[" space* "]" { def anonnode; true; end }
|
121
|
+
/ "[" space* property_list space* "]" { def anonnode; true; end }
|
122
|
+
/ "{" space* statements space* "}" { def anonnode; true; end }
|
123
|
+
/ "(" space* path_list space* ")" { def anonnode; true; end }
|
124
|
+
end
|
125
|
+
|
126
|
+
rule path_list
|
127
|
+
expression space* path_list
|
128
|
+
/ ""
|
129
|
+
end
|
130
|
+
|
131
|
+
rule prop
|
132
|
+
expression
|
133
|
+
end
|
134
|
+
|
135
|
+
rule property_list
|
136
|
+
verb space* object_list space* ";"+ space* property_list
|
137
|
+
/ verb space* object_list space* ";"*
|
138
|
+
/ verb space* ";"* {def object_missing; true; end}
|
139
|
+
/ ""
|
140
|
+
end
|
141
|
+
|
142
|
+
rule qname
|
143
|
+
nprefix ":" localname
|
144
|
+
/ nprefix ':' { def text_value; ""; end }
|
145
|
+
/ ':' localname*
|
146
|
+
/ localname { def barename; true; end }
|
147
|
+
end
|
148
|
+
|
149
|
+
rule simpleStatement
|
150
|
+
subject space+ property_list
|
151
|
+
/ subject # For [] and a.b
|
152
|
+
end
|
153
|
+
|
154
|
+
rule space
|
155
|
+
[ \t\n\r]+ / comment
|
156
|
+
end
|
157
|
+
|
158
|
+
rule statement
|
159
|
+
declaration
|
160
|
+
/ existential
|
161
|
+
/ simpleStatement
|
162
|
+
/ universal
|
163
|
+
end
|
164
|
+
|
165
|
+
rule statements
|
166
|
+
(space / statement space* ('.' space*)? )*
|
167
|
+
end
|
168
|
+
|
169
|
+
# " constant-value-with-escaping "
|
170
|
+
rule string_single
|
171
|
+
'""' !["] / '"' string_single_char+ '"'
|
172
|
+
end
|
173
|
+
|
174
|
+
rule string_single_char
|
175
|
+
!["\n\r] (
|
176
|
+
("\\"
|
177
|
+
[\\\"bfnrt]
|
178
|
+
/ ( "u" hexdigit hexdigit hexdigit hexdigit )
|
179
|
+
/ ( "U" "00" hexdigit hexdigit hexdigit hexdigit hexdigit hexdigit)
|
180
|
+
)
|
181
|
+
/ .)
|
182
|
+
end
|
183
|
+
|
184
|
+
# """ constant value with escaping including single or double occurrences of quotes and/or newlines """
|
185
|
+
rule string_multi
|
186
|
+
'"""' string_multi_single_char* '"""'
|
187
|
+
end
|
188
|
+
|
189
|
+
rule string_multi_single_char
|
190
|
+
"\\\""
|
191
|
+
/ !('"""') .
|
192
|
+
end
|
193
|
+
|
194
|
+
rule subject
|
195
|
+
expression
|
196
|
+
end
|
197
|
+
|
198
|
+
rule symbol
|
199
|
+
qname / explicituri
|
200
|
+
end
|
201
|
+
|
202
|
+
rule symbol_csl
|
203
|
+
symbol space* "," space* symbol_csl
|
204
|
+
/ symbol
|
205
|
+
end
|
206
|
+
|
207
|
+
rule verb
|
208
|
+
"@"? "has" space+ prop # has xxx
|
209
|
+
/ "@"? "is" space+ prop space+ "@"? "of" { # is xxx of
|
210
|
+
def invert; true; end
|
211
|
+
}
|
212
|
+
/ "@"? "a" !":" # has rdf:type
|
213
|
+
/ "=>" # has log:implies
|
214
|
+
/ "<=" { def invert; true; end } # is log:implies of
|
215
|
+
/ "=" # has owl:sameAs
|
216
|
+
/ prop # has xxx of -- shorthand
|
217
|
+
end
|
218
|
+
|
219
|
+
rule universal
|
220
|
+
"@"? "forAll" space+ symbol_csl
|
221
|
+
end
|
222
|
+
|
223
|
+
rule URI_Reference
|
224
|
+
[^{}<>]*
|
225
|
+
end
|
226
|
+
|
227
|
+
end
|
data/lib/rdf/n3/version.rb
CHANGED
@@ -1,11 +1,8 @@
|
|
1
1
|
module RDF::N3::VERSION
|
2
|
-
|
3
|
-
MINOR =
|
4
|
-
TINY = 2
|
5
|
-
EXTRA = nil
|
2
|
+
VERSION_FILE = File.join(File.expand_path(File.dirname(__FILE__)), "..", "..", "..", "VERSION")
|
3
|
+
MAJOR, MINOR, TINY, EXTRA = File.read(VERSION_FILE).chop.split(".")
|
6
4
|
|
7
|
-
STRING = [MAJOR, MINOR, TINY].join('.')
|
8
|
-
STRING << "-#{EXTRA}" if EXTRA
|
5
|
+
STRING = [MAJOR, MINOR, TINY, EXTRA].compact.join('.')
|
9
6
|
|
10
7
|
##
|
11
8
|
# @return [String]
|
@@ -17,5 +14,5 @@ module RDF::N3::VERSION
|
|
17
14
|
|
18
15
|
##
|
19
16
|
# @return [Array(Integer, Integer, Integer)]
|
20
|
-
def self.to_a()
|
17
|
+
def self.to_a() STRING.split(".") end
|
21
18
|
end
|
data/lib/rdf/n3/writer.rb
CHANGED
@@ -104,7 +104,7 @@ module RDF::N3
|
|
104
104
|
# @see #write_triple
|
105
105
|
def write_epilogue
|
106
106
|
@max_depth = @options[:max_depth] || 3
|
107
|
-
@
|
107
|
+
@base_uri = @options[:base_uri]
|
108
108
|
@debug = @options[:debug]
|
109
109
|
@default_namespace = @options[:default_namespace]
|
110
110
|
|
@@ -129,7 +129,7 @@ module RDF::N3
|
|
129
129
|
def start_document
|
130
130
|
@started = true
|
131
131
|
|
132
|
-
write("#{indent}@base <#{@
|
132
|
+
write("#{indent}@base <#{@base_uri}> .\n") if @base_uri
|
133
133
|
|
134
134
|
add_debug("start_document: #{@namespaces.inspect}")
|
135
135
|
@namespaces.keys.sort.each do |prefix|
|
@@ -137,28 +137,30 @@ module RDF::N3
|
|
137
137
|
end
|
138
138
|
end
|
139
139
|
|
140
|
-
def end_document
|
140
|
+
def end_document
|
141
|
+
write("\n")
|
142
|
+
end
|
141
143
|
|
142
144
|
# Checks if l is a valid RDF list, i.e. no nodes have other properties.
|
143
145
|
def is_valid_list(l)
|
144
146
|
props = @graph.properties(l)
|
145
|
-
#puts "is_valid_list: #{props.inspect}" if
|
147
|
+
#puts "is_valid_list: #{props.inspect}" if ::RDF::N3::debug?
|
146
148
|
return false unless props.has_key?(RDF.first.to_s) || l == RDF.nil
|
147
149
|
while l && l != RDF.nil do
|
148
|
-
#puts "is_valid_list(length): #{props.length}" if
|
150
|
+
#puts "is_valid_list(length): #{props.length}" if ::RDF::N3::debug?
|
149
151
|
return false unless props.has_key?(RDF.first.to_s) && props.has_key?(RDF.rest.to_s)
|
150
152
|
n = props[RDF.rest.to_s]
|
151
|
-
#puts "is_valid_list(n): #{n.inspect}" if
|
153
|
+
#puts "is_valid_list(n): #{n.inspect}" if ::RDF::N3::debug?
|
152
154
|
return false unless n.is_a?(Array) && n.length == 1
|
153
155
|
l = n.first
|
154
156
|
props = @graph.properties(l)
|
155
157
|
end
|
156
|
-
#puts "is_valid_list: valid" if
|
158
|
+
#puts "is_valid_list: valid" if ::RDF::N3::debug?
|
157
159
|
true
|
158
160
|
end
|
159
161
|
|
160
162
|
def do_list(l)
|
161
|
-
puts "do_list: #{l.inspect}" if
|
163
|
+
puts "do_list: #{l.inspect}" if ::RDF::N3::debug?
|
162
164
|
position = SUBJECT
|
163
165
|
while l do
|
164
166
|
p = @graph.properties(l)
|
@@ -174,7 +176,7 @@ module RDF::N3
|
|
174
176
|
|
175
177
|
def p_list(node, position)
|
176
178
|
return false if !is_valid_list(node)
|
177
|
-
#puts "p_list: #{node.inspect}, #{position}" if
|
179
|
+
#puts "p_list: #{node.inspect}, #{position}" if ::RDF::N3::debug?
|
178
180
|
|
179
181
|
write(position == SUBJECT ? "(" : " (")
|
180
182
|
@depth += 2
|
@@ -192,7 +194,7 @@ module RDF::N3
|
|
192
194
|
def p_squared(node, position)
|
193
195
|
return false unless p_squared?(node, position)
|
194
196
|
|
195
|
-
#puts "p_squared: #{node.inspect}, #{position}" if
|
197
|
+
#puts "p_squared: #{node.inspect}, #{position}" if ::RDF::N3::debug?
|
196
198
|
subject_done(node)
|
197
199
|
write(position == SUBJECT ? '[' : ' [')
|
198
200
|
@depth += 2
|
@@ -204,18 +206,18 @@ module RDF::N3
|
|
204
206
|
end
|
205
207
|
|
206
208
|
def p_default(node, position)
|
207
|
-
#puts "p_default: #{node.inspect}, #{position}" if
|
208
|
-
l = (position == SUBJECT ? "" : " ") +
|
209
|
+
#puts "p_default: #{node.inspect}, #{position}" if ::RDF::N3::debug?
|
210
|
+
l = (position == SUBJECT ? "" : " ") + format_value(node)
|
209
211
|
write(l)
|
210
212
|
end
|
211
213
|
|
212
214
|
def path(node, position)
|
213
|
-
puts "path: #{node.inspect}, pos: #{position}, []: #{is_valid_list(node)}, p2?: #{p_squared?(node, position)}, rc: #{ref_count(node)}" if
|
215
|
+
puts "path: #{node.inspect}, pos: #{position}, []: #{is_valid_list(node)}, p2?: #{p_squared?(node, position)}, rc: #{ref_count(node)}" if ::RDF::N3::debug?
|
214
216
|
raise RDF::WriterError, "Cannot serialize node '#{node}'" unless p_list(node, position) || p_squared(node, position) || p_default(node, position)
|
215
217
|
end
|
216
218
|
|
217
219
|
def verb(node)
|
218
|
-
puts "verb: #{node.inspect}" if
|
220
|
+
puts "verb: #{node.inspect}" if ::RDF::N3::debug?
|
219
221
|
if node == RDF.type
|
220
222
|
write(" a")
|
221
223
|
else
|
@@ -224,7 +226,7 @@ module RDF::N3
|
|
224
226
|
end
|
225
227
|
|
226
228
|
def object_list(objects)
|
227
|
-
puts "object_list: #{objects.inspect}" if
|
229
|
+
puts "object_list: #{objects.inspect}" if ::RDF::N3::debug?
|
228
230
|
return if objects.empty?
|
229
231
|
|
230
232
|
objects.each_with_index do |obj, i|
|
@@ -236,7 +238,7 @@ module RDF::N3
|
|
236
238
|
def predicate_list(subject)
|
237
239
|
properties = @graph.properties(subject)
|
238
240
|
prop_list = sort_properties(properties) - [RDF.first.to_s, RDF.rest.to_s]
|
239
|
-
puts "predicate_list: #{prop_list.inspect}" if
|
241
|
+
puts "predicate_list: #{prop_list.inspect}" if ::RDF::N3::debug?
|
240
242
|
return if prop_list.empty?
|
241
243
|
|
242
244
|
prop_list.each_with_index do |prop, i|
|
@@ -271,11 +273,11 @@ module RDF::N3
|
|
271
273
|
|
272
274
|
def relativize(uri)
|
273
275
|
uri = uri.to_s
|
274
|
-
@
|
276
|
+
@base_uri ? uri.sub(@base_uri.to_s, "") : uri
|
275
277
|
end
|
276
278
|
|
277
279
|
def statement(subject)
|
278
|
-
puts "statement: #{subject.inspect}, s2?: #{s_squared(subject)}" if
|
280
|
+
puts "statement: #{subject.inspect}, s2?: #{s_squared(subject)}" if ::RDF::N3::debug?
|
279
281
|
subject_done(subject)
|
280
282
|
s_squared(subject) || s_default(subject)
|
281
283
|
end
|
@@ -342,8 +344,8 @@ module RDF::N3
|
|
342
344
|
# Return a QName for the URI, or nil. Adds namespace of QName to defined namespaces
|
343
345
|
def get_qname(uri)
|
344
346
|
if uri.is_a?(RDF::URI)
|
345
|
-
md = uri
|
346
|
-
return "<#{md
|
347
|
+
md = relativize(uri)
|
348
|
+
return "<#{md}>" unless md == uri.to_s
|
347
349
|
|
348
350
|
# Duplicate logic from URI#qname to remember namespace assigned
|
349
351
|
|
@@ -373,10 +375,6 @@ module RDF::N3
|
|
373
375
|
end
|
374
376
|
end
|
375
377
|
|
376
|
-
def label(node)
|
377
|
-
get_qname(node) || node.to_ntriples
|
378
|
-
end
|
379
|
-
|
380
378
|
def add_namespace(prefix, ns)
|
381
379
|
return if @namespaces.has_key?(prefix.to_s)
|
382
380
|
uri = (ns.respond_to?(:to_uri) ? ns.to_uri : ns).to_s
|
@@ -429,7 +427,7 @@ module RDF::N3
|
|
429
427
|
#
|
430
428
|
# @param [String] message::
|
431
429
|
def add_debug(message)
|
432
|
-
STDERR.puts message if
|
430
|
+
STDERR.puts message if ::RDF::N3::debug?
|
433
431
|
@debug << message if @debug.is_a?(Array)
|
434
432
|
end
|
435
433
|
|
@@ -442,5 +440,43 @@ module RDF::N3
|
|
442
440
|
def write(text)
|
443
441
|
@stream.write(text)
|
444
442
|
end
|
443
|
+
|
444
|
+
##
|
445
|
+
# Returns the N-Triples representation of a literal.
|
446
|
+
#
|
447
|
+
# @param [RDF::Literal, String, #to_s] literal
|
448
|
+
# @param [Hash{Symbol => Object}] options
|
449
|
+
# @return [String]
|
450
|
+
def format_literal(literal, options = {})
|
451
|
+
case literal
|
452
|
+
when RDF::Literal
|
453
|
+
text = quoted(literal.value)
|
454
|
+
text << "@#{literal.language}" if literal.has_language?
|
455
|
+
text << "^^#{format_uri(literal.datatype)}" if literal.has_datatype?
|
456
|
+
text
|
457
|
+
else
|
458
|
+
quoted(literal.to_s)
|
459
|
+
end
|
460
|
+
end
|
461
|
+
|
462
|
+
##
|
463
|
+
# Returns the Turtle/N3 representation of a URI reference.
|
464
|
+
#
|
465
|
+
# @param [RDF::URI] literal
|
466
|
+
# @param [Hash{Symbol => Object}] options
|
467
|
+
# @return [String]
|
468
|
+
def format_uri(uri, options = {})
|
469
|
+
get_qname(uri) || "<%s>" % uri_for(uri)
|
470
|
+
end
|
471
|
+
|
472
|
+
##
|
473
|
+
# Returns the Turtle/N3 representation of a blank node.
|
474
|
+
#
|
475
|
+
# @param [RDF::Node] node
|
476
|
+
# @param [Hash{Symbol => Object}] options
|
477
|
+
# @return [String]
|
478
|
+
def format_node(node, options = {})
|
479
|
+
"_:%s" % node.id
|
480
|
+
end
|
445
481
|
end
|
446
482
|
end
|
data/rdf-n3.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{rdf-n3}
|
8
|
-
s.version = "0.2.
|
8
|
+
s.version = "0.2.3"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Gregg Kellogg"]
|
12
|
-
s.date = %q{2010-
|
12
|
+
s.date = %q{2010-11-10}
|
13
13
|
s.description = %q{ RDF::N3 is an Notation-3 (n3-rdf) parser for Ruby using the RDF.rb library suite.
|
14
14
|
}
|
15
15
|
s.email = %q{gregg@kellogg-assoc.com}
|
@@ -31,13 +31,13 @@ Gem::Specification.new do |s|
|
|
31
31
|
"lib/rdf/n3/format.rb",
|
32
32
|
"lib/rdf/n3/patches/array_hacks.rb",
|
33
33
|
"lib/rdf/n3/patches/graph_properties.rb",
|
34
|
-
"lib/rdf/n3/patches/literal_normalization.rb",
|
35
34
|
"lib/rdf/n3/patches/qname_hacks.rb",
|
36
35
|
"lib/rdf/n3/patches/seq.rb",
|
37
|
-
"lib/rdf/n3/patches/uri_hacks.rb",
|
38
36
|
"lib/rdf/n3/reader.rb",
|
39
37
|
"lib/rdf/n3/reader/n3_grammar.rb",
|
40
38
|
"lib/rdf/n3/reader/n3_grammar.treetop",
|
39
|
+
"lib/rdf/n3/reader/n3_grammar_18.rb",
|
40
|
+
"lib/rdf/n3/reader/n3_grammar_18.treetop",
|
41
41
|
"lib/rdf/n3/version.rb",
|
42
42
|
"lib/rdf/n3/vocab.rb",
|
43
43
|
"lib/rdf/n3/writer.rb",
|
@@ -631,7 +631,7 @@ Gem::Specification.new do |s|
|
|
631
631
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
632
632
|
s.add_runtime_dependency(%q<rdf>, [">= 0.2.1"])
|
633
633
|
s.add_runtime_dependency(%q<treetop>, [">= 1.4.0"])
|
634
|
-
s.add_development_dependency(%q<rspec>, ["
|
634
|
+
s.add_development_dependency(%q<rspec>, ["= 1.3.0"])
|
635
635
|
s.add_development_dependency(%q<rdf-spec>, [">= 0.2.1"])
|
636
636
|
s.add_development_dependency(%q<rdf-rdfxml>, [">= 0.2.1"])
|
637
637
|
s.add_development_dependency(%q<rdf-isomorphic>, [">= 0"])
|
@@ -639,7 +639,7 @@ Gem::Specification.new do |s|
|
|
639
639
|
else
|
640
640
|
s.add_dependency(%q<rdf>, [">= 0.2.1"])
|
641
641
|
s.add_dependency(%q<treetop>, [">= 1.4.0"])
|
642
|
-
s.add_dependency(%q<rspec>, ["
|
642
|
+
s.add_dependency(%q<rspec>, ["= 1.3.0"])
|
643
643
|
s.add_dependency(%q<rdf-spec>, [">= 0.2.1"])
|
644
644
|
s.add_dependency(%q<rdf-rdfxml>, [">= 0.2.1"])
|
645
645
|
s.add_dependency(%q<rdf-isomorphic>, [">= 0"])
|
@@ -648,7 +648,7 @@ Gem::Specification.new do |s|
|
|
648
648
|
else
|
649
649
|
s.add_dependency(%q<rdf>, [">= 0.2.1"])
|
650
650
|
s.add_dependency(%q<treetop>, [">= 1.4.0"])
|
651
|
-
s.add_dependency(%q<rspec>, ["
|
651
|
+
s.add_dependency(%q<rspec>, ["= 1.3.0"])
|
652
652
|
s.add_dependency(%q<rdf-spec>, [">= 0.2.1"])
|
653
653
|
s.add_dependency(%q<rdf-rdfxml>, [">= 0.2.1"])
|
654
654
|
s.add_dependency(%q<rdf-isomorphic>, [">= 0"])
|