sparql 3.2.1 → 3.2.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +57 -38
  3. data/VERSION +1 -1
  4. data/bin/sparql +2 -31
  5. data/lib/rack/sparql/conneg.rb +22 -1
  6. data/lib/sinatra/sparql/extensions.rb +1 -1
  7. data/lib/sinatra/sparql.rb +57 -12
  8. data/lib/sparql/algebra/expression.rb +35 -7
  9. data/lib/sparql/algebra/extensions.rb +18 -18
  10. data/lib/sparql/algebra/operator/adjust.rb +69 -0
  11. data/lib/sparql/algebra/operator/bgp.rb +1 -1
  12. data/lib/sparql/algebra/operator/construct.rb +1 -1
  13. data/lib/sparql/algebra/operator/dataset.rb +10 -0
  14. data/lib/sparql/algebra/operator/day.rb +2 -2
  15. data/lib/sparql/algebra/operator/delete.rb +1 -1
  16. data/lib/sparql/algebra/operator/delete_data.rb +1 -1
  17. data/lib/sparql/algebra/operator/delete_where.rb +1 -1
  18. data/lib/sparql/algebra/operator/extend.rb +32 -2
  19. data/lib/sparql/algebra/operator/group.rb +34 -6
  20. data/lib/sparql/algebra/operator/hours.rb +2 -2
  21. data/lib/sparql/algebra/operator/insert.rb +1 -1
  22. data/lib/sparql/algebra/operator/insert_data.rb +1 -1
  23. data/lib/sparql/algebra/operator/join.rb +3 -3
  24. data/lib/sparql/algebra/operator/left_join.rb +3 -3
  25. data/lib/sparql/algebra/operator/minus.rb +1 -1
  26. data/lib/sparql/algebra/operator/minutes.rb +2 -2
  27. data/lib/sparql/algebra/operator/modify.rb +21 -0
  28. data/lib/sparql/algebra/operator/month.rb +2 -2
  29. data/lib/sparql/algebra/operator/path_opt.rb +9 -65
  30. data/lib/sparql/algebra/operator/path_plus.rb +18 -10
  31. data/lib/sparql/algebra/operator/path_range.rb +178 -0
  32. data/lib/sparql/algebra/operator/path_star.rb +7 -4
  33. data/lib/sparql/algebra/operator/path_zero.rb +110 -0
  34. data/lib/sparql/algebra/operator/plus.rb +7 -5
  35. data/lib/sparql/algebra/operator/project.rb +42 -1
  36. data/lib/sparql/algebra/operator/seconds.rb +2 -2
  37. data/lib/sparql/algebra/operator/seq.rb +3 -3
  38. data/lib/sparql/algebra/operator/sequence.rb +10 -0
  39. data/lib/sparql/algebra/operator/subtract.rb +9 -5
  40. data/lib/sparql/algebra/operator/table.rb +11 -2
  41. data/lib/sparql/algebra/operator/timezone.rb +2 -2
  42. data/lib/sparql/algebra/operator/triple.rb +51 -0
  43. data/lib/sparql/algebra/operator/tz.rb +2 -2
  44. data/lib/sparql/algebra/operator/using.rb +2 -2
  45. data/lib/sparql/algebra/operator/year.rb +2 -2
  46. data/lib/sparql/algebra/operator.rb +27 -10
  47. data/lib/sparql/algebra/query.rb +5 -3
  48. data/lib/sparql/algebra.rb +22 -3
  49. data/lib/sparql/grammar/meta.rb +1367 -267
  50. data/lib/sparql/grammar/parser11.rb +826 -328
  51. data/lib/sparql/grammar/terminals11.rb +2 -2
  52. data/lib/sparql/grammar.rb +6 -4
  53. data/lib/sparql/results.rb +3 -2
  54. data/lib/sparql/server.rb +93 -0
  55. data/lib/sparql.rb +8 -5
  56. metadata +39 -17
@@ -91,7 +91,7 @@ module SPARQL::Grammar
91
91
  ANON = /\[#{WS}*\]/m.freeze
92
92
 
93
93
  # String terminals, case insensitive
94
- STR_EXPR = %r(ABS|ADD|ALL|ASC|ASK|AS|AVG|BASE|BINDINGS|BIND
94
+ STR_EXPR = %r(ABS|ADD|ADJUST|ALL|ASC|ASK|AS|AVG|BASE|BINDINGS|BIND
95
95
  |BNODE|BOUND|BY|CEIL|CLEAR|COALESCE|CONCAT
96
96
  |CONSTRUCT|CONTAINS|COPY|COUNT|CREATE|DATATYPE|DAY
97
97
  |DEFAULT|DELETE#{WS}DATA|DELETE#{WS}WHERE|DELETE
@@ -117,7 +117,7 @@ module SPARQL::Grammar
117
117
  )xim.freeze
118
118
 
119
119
  # Map terminals to canonical form
120
- STR_MAP = (%w{ABS ADD ALL ASC ASK AS AVG BASE BINDINGS BIND
120
+ STR_MAP = (%w{ABS ADD ADJUST ALL ASC ASK AS AVG BASE BINDINGS BIND
121
121
  BNODE BOUND BY CEIL CLEAR COALESCE CONCAT
122
122
  CONSTRUCT CONTAINS COPY COUNT CREATE DATATYPE DAY
123
123
  DEFAULT DELETE
@@ -184,7 +184,7 @@ module SPARQL
184
184
  # (?age ?src)
185
185
  # (bgp
186
186
  # (triple ?bob foaf:name "Bob")
187
- # (triple (triple ?bob foaf:age ?age) dct:source ?src)) ))
187
+ # (triple (qtriple ?bob foaf:age ?age) dct:source ?src)) ))
188
188
  #
189
189
  # SPARQL:
190
190
  #
@@ -212,11 +212,11 @@ module SPARQL
212
212
  # (construct
213
213
  # (
214
214
  # (triple ?bob foaf:name "Bob")
215
- # (triple (triple ?bob foaf:age ?age) dct:creator <http://example.com/crawlers#c1>)
216
- # (triple (triple ?bob foaf:age ?age) dct:source ?src))
215
+ # (triple (qtriple ?bob foaf:age ?age) dct:creator <http://example.com/crawlers#c1>)
216
+ # (triple (qtriple ?bob foaf:age ?age) dct:source ?src))
217
217
  # (bgp
218
218
  # (triple ?bob foaf:name "Bob")
219
- # (triple (triple ?bob foaf:age ?age) dct:source ?src)) ))
219
+ # (triple (qtriple ?bob foaf:age ?age) dct:source ?src)) ))
220
220
 
221
221
 
222
222
  # ## Implementation Notes
@@ -248,6 +248,7 @@ module SPARQL
248
248
  # Query may be an array of lexed tokens, a lexer, or a
249
249
  # string or open file.
250
250
  # @param [Hash{Symbol => Object}] options
251
+ # @option options (see SPARQL::Grammar::Parser#initialize)
251
252
  # @return [Parser]
252
253
  # @raise [Parser::Error] on invalid input
253
254
  def self.parse(query, **options, &block)
@@ -261,6 +262,7 @@ module SPARQL
261
262
  # @param [Hash{Symbol => Object}] options
262
263
  # any additional options (see `RDF::Reader#initialize` and `RDF::Format.for`)
263
264
  # @option options [Symbol] :format (:ntriples)
265
+ # @option options (see parse)
264
266
  # @yield [reader]
265
267
  # @yieldparam [RDF::Reader] reader
266
268
  # @yieldreturn [void] ignored
@@ -10,7 +10,7 @@ module SPARQL
10
10
  csv: 'text/csv',
11
11
  tsv: 'text/tab-separated-values'
12
12
  }
13
-
13
+
14
14
  ##
15
15
  # Generate Solutions as JSON
16
16
  # @return [String]
@@ -234,12 +234,13 @@ module SPARQL
234
234
  case format
235
235
  when :json
236
236
  require 'json' unless defined?(::JSON)
237
- {boolean: solutions}.to_json
237
+ {head: {}, boolean: solutions}.to_json
238
238
  when :xml
239
239
  require 'builder' unless defined?(::Builder)
240
240
  xml = ::Builder::XmlMarkup.new(indent: 2)
241
241
  xml.instruct!
242
242
  xml.sparql(xmlns: "http://www.w3.org/2005/sparql-results#") do
243
+ xml.head
243
244
  xml.boolean(solutions.to_s)
244
245
  end
245
246
  when :html
@@ -0,0 +1,93 @@
1
+ require 'sinatra/sparql'
2
+
3
+ module SPARQL
4
+ module Server
5
+ # A SPARQL Protocol and Graph Store server.
6
+ #
7
+ # Note, this is a trivial server and implementations may consider implementing integrating it into their own Rack or Sinatra server using {Rack::SPARQL} or {Sinatra::SPARQL}.
8
+ #
9
+ # Implements [SPARQL 1.1 Protocol](https://www.w3.org/TR/2013/REC-sparql11-protocol-20130321/)
10
+ # and [SPARQL 1.1 Graph Store HTTP Protocol](https://www.w3.org/TR/2013/REC-sparql11-http-rdf-update-20130321/).
11
+ #
12
+ # Protocol-specified dataset parameters create a merged repository as described in {Sinatra::SPARQL::Helpers#dataset} and {SPARQL::Algebra::Operator::Dataset}.
13
+ #
14
+ # @param [RDF::Dataset] dataset (RDF::Repository.new)
15
+ # @param [Hash{Symbol => Object}] options
16
+ # @return [Sinatra::Base]
17
+ def application(dataset: RDF::Repository.new, **options)
18
+ Sinatra.new do
19
+ register Sinatra::SPARQL
20
+ set :repository, dataset
21
+ enable :logging
22
+ disable :raise_errors, :show_exceptions if settings.production?
23
+
24
+ mime_type :jsonld, "application/ld+json"
25
+ mime_type :normalize, "application/normalized+n-quads"
26
+ mime_type :sparql, "application/sparql-query"
27
+ mime_type :ttl, "text/turtle"
28
+ mime_type :sse, "application/sse+sparql-query"
29
+
30
+ configure :development, :test do
31
+ set :logging, 0
32
+ end
33
+
34
+ get '/' do
35
+ opts = params.inject({}) {|memo, (k,v)| memo.merge(k.to_sym => v)}
36
+ if opts[:query]
37
+ query = opts[:query]
38
+ halt 403, "Update not possible using GET" if opts[:update]
39
+ repo = dataset(logger: request.logger, **opts)
40
+ url = RDF::URI(request.url).tap {|u| u.query = nil}
41
+ query = begin
42
+ SPARQL.parse(query, base_uri: url)
43
+ rescue SPARQL::Grammar::Parser::Error => e
44
+ halt 400, "Error parsing query: #{e.message}"
45
+ end
46
+ res = query.execute(repo,
47
+ logger: request.logger,
48
+ **options.merge(opts))
49
+ res.is_a?(RDF::Literal::Boolean) ? [res] : res
50
+ elsif opts[:update]
51
+ halt 406, "Inappropriate update option using GET"
52
+ else
53
+ settings.sparql_options.replace(standard_prefixes: true)
54
+ settings.sparql_options.merge!(prefixes: {
55
+ ssd: "http://www.w3.org/ns/sparql-service-description#",
56
+ void: "http://rdfs.org/ns/void#"
57
+ })
58
+ repo = dataset(logger: request.logger, **options)
59
+ service_description(repo: repo, endpoint: url)
60
+ end
61
+ end
62
+
63
+ post '/' do
64
+ opts = params.inject({}) {|memo, (k,v)| memo.merge(k.to_sym => v)}
65
+ # Note, this depends on the Rack::SPARQL::ContentNegotiation middleware to rewrite application/x-www-form-urlencoded to be conformat with either application/sparql-query or application/sparql-update.
66
+ query = begin
67
+ update = case request.content_type
68
+ when %r(application/sparql-query) then false
69
+ when %r(application/sparql-update) then true
70
+ else
71
+ halt 406, "No query found for #{request.content_type}"
72
+ end
73
+
74
+ # XXX Rack always sets input to ASCII-8BIT
75
+ #unless request.body.external_encoding == Encoding::UTF_8
76
+ # halt 400, "improper body encoding: #{request.body.external_encoding}"
77
+ #end
78
+ SPARQL.parse(request.body, base_uri: url, update: update)
79
+ rescue SPARQL::Grammar::Parser::Error => e
80
+ halt 400, "Error parsing #{update ? 'update' : 'query'}: #{e.message}"
81
+ end
82
+ repo = dataset(logger: request.logger, **opts)
83
+ url = RDF::URI(request.url).tap {|u| u.query = nil}
84
+ res = query.execute(repo,
85
+ logger: request.logger,
86
+ **options.merge(opts))
87
+ res.is_a?(RDF::Literal::Boolean) ? [res] : res
88
+ end
89
+ end
90
+ end
91
+ module_function :application
92
+ end
93
+ end
data/lib/sparql.rb CHANGED
@@ -10,6 +10,7 @@ module SPARQL
10
10
  autoload :Algebra, 'sparql/algebra'
11
11
  autoload :Grammar, 'sparql/grammar'
12
12
  autoload :Results, 'sparql/results'
13
+ autoload :Server, 'sparql/server'
13
14
  autoload :VERSION, 'sparql/version'
14
15
 
15
16
  # @see https://rubygems-client
@@ -25,13 +26,14 @@ module SPARQL
25
26
  # @param [Hash{Symbol => Object}] options
26
27
  # @option options [Boolean] :update (false)
27
28
  # Parse starting with UpdateUnit production, QueryUnit otherwise.
28
- # @return [SPARQL::Query]
29
+ # @option options (see SPARQL::Grammar::Parser#initialize)
30
+ # @return [RDF::Queryable]
29
31
  # The resulting query may be executed against
30
32
  # a `queryable` object such as an RDF::Graph
31
33
  # or RDF::Repository.
32
- # @raise [Parser::Error] on invalid input
34
+ # @raise [SPARQL::Grammar::Parser::Error] on invalid input
33
35
  def self.parse(query, **options)
34
- query = Grammar::Parser.new(query, **options).parse(options[:update] ? :UpdateUnit : :QueryUnit)
36
+ Grammar::Parser.new(query, **options).parse(options[:update] ? :UpdateUnit : :QueryUnit)
35
37
  end
36
38
 
37
39
  ##
@@ -63,11 +65,12 @@ module SPARQL
63
65
  # One or more URIs used to initialize a new instance of `queryable` in the default graph. One or more URIs used to initialize a new instance of `queryable` in the default graph.
64
66
  # @option options [RDF::URI, String, Array<RDF::URI, String>] :named_graph_uri
65
67
  # One or more URIs used to initialize the `queryable` as a named graph.
68
+ # @option options (see parse)
66
69
  # @yield [solution]
67
70
  # each matching solution, statement or boolean
68
71
  # @yieldparam [RDF::Statement, RDF::Query::Solution, Boolean] solution
69
72
  # @yieldreturn [void] ignored
70
- # @return [RDF::Graph, Boolean, RDF::Query::Solutions::Enumerator]
73
+ # @return [RDF::Graph, Boolean, RDF::Query::Solutions]
71
74
  # Note, results may be used with {SPARQL.serialize_results} to obtain appropriate output encoding.
72
75
  # @raise [SPARQL::MalformedQuery] on invalid input
73
76
  def self.execute(query, queryable, **options, &block)
@@ -88,7 +91,7 @@ module SPARQL
88
91
  queryable.load(uri, graph_name: uri)
89
92
  end
90
93
  end
91
- query.execute(queryable, &block)
94
+ query.execute(queryable, **options, &block)
92
95
  rescue SPARQL::Grammar::Parser::Error => e
93
96
  raise MalformedQuery, e.message
94
97
  rescue TypeError => e
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sparql
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.2.1
4
+ version: 3.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gregg Kellogg
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2022-01-19 00:00:00.000000000 Z
12
+ date: 2022-05-05 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rdf
@@ -20,7 +20,7 @@ dependencies:
20
20
  version: '3.2'
21
21
  - - ">="
22
22
  - !ruby/object:Gem::Version
23
- version: 3.2.3
23
+ version: 3.2.7
24
24
  type: :runtime
25
25
  prerelease: false
26
26
  version_requirements: !ruby/object:Gem::Requirement
@@ -30,7 +30,7 @@ dependencies:
30
30
  version: '3.2'
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 3.2.3
33
+ version: 3.2.7
34
34
  - !ruby/object:Gem::Dependency
35
35
  name: rdf-aggregate-repo
36
36
  requirement: !ruby/object:Gem::Requirement
@@ -52,6 +52,9 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '2.2'
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ version: 2.3.1
55
58
  type: :runtime
56
59
  prerelease: false
57
60
  version_requirements: !ruby/object:Gem::Requirement
@@ -59,6 +62,9 @@ dependencies:
59
62
  - - "~>"
60
63
  - !ruby/object:Gem::Version
61
64
  version: '2.2'
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: 2.3.1
62
68
  - !ruby/object:Gem::Dependency
63
69
  name: builder
64
70
  requirement: !ruby/object:Gem::Requirement
@@ -79,14 +85,14 @@ dependencies:
79
85
  requirements:
80
86
  - - "~>"
81
87
  - !ruby/object:Gem::Version
82
- version: '1.4'
88
+ version: '1.5'
83
89
  type: :runtime
84
90
  prerelease: false
85
91
  version_requirements: !ruby/object:Gem::Requirement
86
92
  requirements:
87
93
  - - "~>"
88
94
  - !ruby/object:Gem::Version
89
- version: '1.4'
95
+ version: '1.5'
90
96
  - !ruby/object:Gem::Dependency
91
97
  name: sxp
92
98
  requirement: !ruby/object:Gem::Requirement
@@ -96,7 +102,7 @@ dependencies:
96
102
  version: '1.2'
97
103
  - - ">="
98
104
  - !ruby/object:Gem::Version
99
- version: 1.2.1
105
+ version: 1.2.2
100
106
  type: :runtime
101
107
  prerelease: false
102
108
  version_requirements: !ruby/object:Gem::Requirement
@@ -106,7 +112,7 @@ dependencies:
106
112
  version: '1.2'
107
113
  - - ">="
108
114
  - !ruby/object:Gem::Version
109
- version: 1.2.1
115
+ version: 1.2.2
110
116
  - !ruby/object:Gem::Dependency
111
117
  name: sparql-client
112
118
  requirement: !ruby/object:Gem::Requirement
@@ -114,6 +120,9 @@ dependencies:
114
120
  - - "~>"
115
121
  - !ruby/object:Gem::Version
116
122
  version: '3.2'
123
+ - - ">="
124
+ - !ruby/object:Gem::Version
125
+ version: 3.2.1
117
126
  type: :runtime
118
127
  prerelease: false
119
128
  version_requirements: !ruby/object:Gem::Requirement
@@ -121,6 +130,9 @@ dependencies:
121
130
  - - "~>"
122
131
  - !ruby/object:Gem::Version
123
132
  version: '3.2'
133
+ - - ">="
134
+ - !ruby/object:Gem::Version
135
+ version: 3.2.1
124
136
  - !ruby/object:Gem::Dependency
125
137
  name: rdf-xsd
126
138
  requirement: !ruby/object:Gem::Requirement
@@ -141,14 +153,14 @@ dependencies:
141
153
  requirements:
142
154
  - - "~>"
143
155
  - !ruby/object:Gem::Version
144
- version: '2.1'
156
+ version: '2.2'
145
157
  type: :development
146
158
  prerelease: false
147
159
  version_requirements: !ruby/object:Gem::Requirement
148
160
  requirements:
149
161
  - - "~>"
150
162
  - !ruby/object:Gem::Version
151
- version: '2.1'
163
+ version: '2.2'
152
164
  - !ruby/object:Gem::Dependency
153
165
  name: rack
154
166
  requirement: !ruby/object:Gem::Requirement
@@ -197,42 +209,42 @@ dependencies:
197
209
  requirements:
198
210
  - - "~>"
199
211
  - !ruby/object:Gem::Version
200
- version: '3.1'
212
+ version: '3.2'
201
213
  type: :development
202
214
  prerelease: false
203
215
  version_requirements: !ruby/object:Gem::Requirement
204
216
  requirements:
205
217
  - - "~>"
206
218
  - !ruby/object:Gem::Version
207
- version: '3.1'
219
+ version: '3.2'
208
220
  - !ruby/object:Gem::Dependency
209
221
  name: rspec
210
222
  requirement: !ruby/object:Gem::Requirement
211
223
  requirements:
212
224
  - - "~>"
213
225
  - !ruby/object:Gem::Version
214
- version: '3.10'
226
+ version: '3.11'
215
227
  type: :development
216
228
  prerelease: false
217
229
  version_requirements: !ruby/object:Gem::Requirement
218
230
  requirements:
219
231
  - - "~>"
220
232
  - !ruby/object:Gem::Version
221
- version: '3.10'
233
+ version: '3.11'
222
234
  - !ruby/object:Gem::Dependency
223
235
  name: rspec-its
224
236
  requirement: !ruby/object:Gem::Requirement
225
237
  requirements:
226
238
  - - "~>"
227
239
  - !ruby/object:Gem::Version
228
- version: '1.2'
240
+ version: '1.3'
229
241
  type: :development
230
242
  prerelease: false
231
243
  version_requirements: !ruby/object:Gem::Requirement
232
244
  requirements:
233
245
  - - "~>"
234
246
  - !ruby/object:Gem::Version
235
- version: '1.2'
247
+ version: '1.3'
236
248
  - !ruby/object:Gem::Dependency
237
249
  name: yard
238
250
  requirement: !ruby/object:Gem::Requirement
@@ -274,6 +286,7 @@ files:
274
286
  - lib/sparql/algebra/operator.rb
275
287
  - lib/sparql/algebra/operator/abs.rb
276
288
  - lib/sparql/algebra/operator/add.rb
289
+ - lib/sparql/algebra/operator/adjust.rb
277
290
  - lib/sparql/algebra/operator/alt.rb
278
291
  - lib/sparql/algebra/operator/and.rb
279
292
  - lib/sparql/algebra/operator/asc.rb
@@ -358,7 +371,9 @@ files:
358
371
  - lib/sparql/algebra/operator/path.rb
359
372
  - lib/sparql/algebra/operator/path_opt.rb
360
373
  - lib/sparql/algebra/operator/path_plus.rb
374
+ - lib/sparql/algebra/operator/path_range.rb
361
375
  - lib/sparql/algebra/operator/path_star.rb
376
+ - lib/sparql/algebra/operator/path_zero.rb
362
377
  - lib/sparql/algebra/operator/plus.rb
363
378
  - lib/sparql/algebra/operator/predicate.rb
364
379
  - lib/sparql/algebra/operator/prefix.rb
@@ -394,6 +409,7 @@ files:
394
409
  - lib/sparql/algebra/operator/sum.rb
395
410
  - lib/sparql/algebra/operator/table.rb
396
411
  - lib/sparql/algebra/operator/timezone.rb
412
+ - lib/sparql/algebra/operator/triple.rb
397
413
  - lib/sparql/algebra/operator/tz.rb
398
414
  - lib/sparql/algebra/operator/ucase.rb
399
415
  - lib/sparql/algebra/operator/union.rb
@@ -412,11 +428,17 @@ files:
412
428
  - lib/sparql/grammar/parser11.rb
413
429
  - lib/sparql/grammar/terminals11.rb
414
430
  - lib/sparql/results.rb
431
+ - lib/sparql/server.rb
415
432
  - lib/sparql/version.rb
416
433
  homepage: https://github.com/ruby-rdf/sparql
417
434
  licenses:
418
435
  - Unlicense
419
- metadata: {}
436
+ metadata:
437
+ documentation_uri: https://ruby-rdf.github.io/sparql
438
+ bug_tracker_uri: https://github.com/ruby-rdf/sparql/issues
439
+ homepage_uri: https://github.com/ruby-rdf/sparql
440
+ mailing_list_uri: https://lists.w3.org/Archives/Public/public-rdf-ruby/
441
+ source_code_uri: https://github.com/ruby-rdf/sparql
420
442
  post_install_message:
421
443
  rdoc_options: []
422
444
  require_paths: