sparql-client 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/README CHANGED
@@ -8,43 +8,62 @@ This is a pure-Ruby implementation of a [SPARQL][] client for [RDF.rb][].
8
8
  Features
9
9
  --------
10
10
 
11
- * Queries SPARQL HTTP endpoints.
11
+ * Executes queries against any SPARQL 1.0-compatible endpoints over HTTP.
12
+ * Provides a query builder [DSL][] for `ASK`, `SELECT`, `DESCRIBE` and
13
+ `CONSTRUCT` queries.
14
+ * Supports tuple result sets in both XML and JSON formats, with JSON being
15
+ the preferred default for content negotiation purposes.
16
+ * Supports graph results in any RDF serialization format understood by RDF.rb.
17
+ * Returns results using the [RDF.rb object model][RDF.rb model].
18
+ * Supports accessing endpoints as read-only [`RDF::Repository`][RDF::Repository]
19
+ instances.
12
20
 
13
21
  Examples
14
22
  --------
15
23
 
16
24
  require 'sparql/client'
17
25
 
18
- sparql = SPARQL::Client.new('http://dbpedia.org/sparql')
26
+ sparql = SPARQL::Client.new("http://dbpedia.org/sparql")
19
27
 
20
- ### Executing a boolean query
28
+ ### Executing a boolean query and outputting the result
21
29
 
22
- result = sparql.query('ASK WHERE { ?s ?p ?o }')
30
+ # ASK WHERE { ?s ?p ?o }
31
+ result = sparql.ask.whether([:s, :p, :o]).true?
23
32
 
24
33
  puts result.inspect #=> true or false
25
34
 
26
- ### Executing a tuple query
35
+ ### Executing a tuple query and iterating over the returned solutions
27
36
 
28
- result = sparql.query('SELECT * WHERE { ?s ?p ?o } LIMIT 10')
37
+ # SELECT * WHERE { ?s ?p ?o } OFFSET 100 LIMIT 10
38
+ query = sparql.select.where([:s, :p, :o]).offset(100).limit(10)
29
39
 
30
- result.each do |bindings|
31
- puts bindings.inspect
40
+ query.each_solution do |solution|
41
+ puts solution.inspect
32
42
  end
33
43
 
34
- ### Executing a graph query
44
+ ### Executing a graph query and iterating over the returned statements
35
45
 
36
- result = sparql.query('CONSTRUCT { ?s ?p ?o } WHERE { ?s ?p ?o } LIMIT 10')
46
+ # CONSTRUCT { ?s ?p ?o } WHERE { ?s ?p ?o } LIMIT 10
47
+ query = sparql.construct([:s, :p, :o]).where([:s, :p, :o]).limit(10)
37
48
 
38
- result.each_statement do |statement|
49
+ query.each_statement do |statement|
39
50
  puts statement.inspect
40
51
  end
41
52
 
53
+ ### Executing an arbitrary textual SPARQL query string
54
+
55
+ result = sparql.query("ASK WHERE { ?s ?p ?o }")
56
+
57
+ puts result.inspect #=> true or false
58
+
42
59
  Documentation
43
60
  -------------
44
61
 
45
- <http://sparql.rubyforge.org/>
62
+ <http://sparql.rubyforge.org/client/>
46
63
 
47
64
  * {SPARQL::Client}
65
+ * {SPARQL::Client::Query}
66
+ * {SPARQL::Client::Repository}
48
67
 
49
68
  Dependencies
50
69
  ------------
@@ -75,7 +94,7 @@ as follows:
75
94
  Resources
76
95
  ---------
77
96
 
78
- * <http://sparql.rubyforge.org/>
97
+ * <http://sparql.rubyforge.org/client/>
79
98
  * <http://github.com/bendiken/sparql-client>
80
99
  * <http://rubygems.org/gems/sparql-client>
81
100
  * <http://rubyforge.org/projects/sparql/>
@@ -94,6 +113,11 @@ License
94
113
  `SPARQL::Client` is free and unencumbered public domain software. For more
95
114
  information, see <http://unlicense.org/> or the accompanying UNLICENSE file.
96
115
 
97
- [RDF]: http://www.w3.org/RDF/
98
- [SPARQL]: http://en.wikipedia.org/wiki/SPARQL
99
- [RDF.rb]: http://rdf.rubyforge.org/
116
+ [RDF]: http://www.w3.org/RDF/
117
+ [SPARQL]: http://en.wikipedia.org/wiki/SPARQL
118
+ [SPARQL JSON]: http://www.w3.org/TR/rdf-sparql-json-res/
119
+ [RDF.rb]: http://rdf.rubyforge.org/
120
+ [RDF.rb model]: http://blog.datagraph.org/2010/03/rdf-for-ruby
121
+ [RDF::Repository]: http://rdf.rubyforge.org/RDF/Repository.html
122
+ [DSL]: http://en.wikipedia.org/wiki/Domain-specific_language
123
+ "domain-specific language"
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.1
1
+ 0.0.2
@@ -1 +1,3 @@
1
- require 'sparql/client'
1
+ module SPARQL
2
+ autoload :Client, 'sparql/client'
3
+ end
@@ -1,12 +1,19 @@
1
1
  require 'net/http'
2
2
  require 'rdf'
3
3
  require 'rdf/ntriples'
4
- require 'sparql/version'
5
4
 
6
5
  module SPARQL
7
6
  ##
8
7
  # A SPARQL client for RDF.rb.
9
8
  class Client
9
+ autoload :Query, 'sparql/client/query'
10
+ autoload :Repository, 'sparql/client/repository'
11
+ autoload :VERSION, 'sparql/client/version'
12
+
13
+ class ClientError < StandardError; end
14
+ class MalformedQuery < ClientError; end
15
+ class ServerError < StandardError; end
16
+
10
17
  RESULT_BOOL = 'text/boolean'.freeze # Sesame-specific
11
18
  RESULT_JSON = 'application/sparql-results+json'.freeze
12
19
  RESULT_XML = 'application/sparql-results+xml'.freeze
@@ -21,7 +28,7 @@ module SPARQL
21
28
  # @param [Hash{Symbol => Object}] options
22
29
  def initialize(url, options = {}, &block)
23
30
  @url, @options = RDF::URI.new(url.to_s), options
24
- @headers = {'Accept' => "#{RESULT_XML}, #{RESULT_JSON}, text/plain"}
31
+ @headers = {'Accept' => "#{RESULT_JSON}, #{RESULT_XML}, text/plain"}
25
32
 
26
33
  if block_given?
27
34
  case block.arity
@@ -31,19 +38,63 @@ module SPARQL
31
38
  end
32
39
  end
33
40
 
41
+ ##
42
+ # Executes a boolean `ASK` query.
43
+ #
44
+ # @return [Query]
45
+ def ask(*args)
46
+ client = self
47
+ result = Query.ask(*args)
48
+ (class << result; self; end).send(:define_method, :execute) do
49
+ client.query(self)
50
+ end
51
+ result
52
+ end
53
+
54
+ ##
55
+ # Executes a tuple `SELECT` query.
56
+ #
57
+ # @param [Array<Symbol>] variables
58
+ # @return [Query]
59
+ def select(*args)
60
+ client = self
61
+ result = Query.select(*args)
62
+ (class << result; self; end).send(:define_method, :execute) do
63
+ client.query(self)
64
+ end
65
+ result
66
+ end
67
+
68
+ ##
69
+ # Executes a graph `CONSTRUCT` query.
70
+ #
71
+ # @param [Array<Symbol>] pattern
72
+ # @return [Query]
73
+ def construct(*args)
74
+ client = self
75
+ result = Query.construct(*args)
76
+ (class << result; self; end).send(:define_method, :execute) do
77
+ client.query(self)
78
+ end
79
+ result
80
+ end
81
+
34
82
  ##
35
83
  # Executes a SPARQL query.
36
84
  #
37
85
  # @param [String, #to_s] url
38
86
  # @param [Hash{Symbol => Object}] options
87
+ # @return [Array<RDF::Query::Solution>]
39
88
  def query(query, options = {})
40
- get(query.to_s) do |response|
89
+ get(query) do |response|
41
90
  case response
42
- when Net::HTTPClientError
43
- abort response.inspect # FIXME
44
- when Net::HTTPServerError
45
- abort response.inspect # FIXME
46
- when Net::HTTPSuccess
91
+ when Net::HTTPBadRequest # 400 Bad Request
92
+ raise MalformedQuery.new(response.body)
93
+ when Net::HTTPClientError # 4xx
94
+ raise ClientError.new(response.body)
95
+ when Net::HTTPServerError # 5xx
96
+ raise ServerError.new(response.body)
97
+ when Net::HTTPSuccess # 2xx
47
98
  parse_response(response)
48
99
  end
49
100
  end
@@ -79,7 +130,7 @@ module SPARQL
79
130
  when json['results']
80
131
  json['results']['bindings'].map do |row|
81
132
  row = row.inject({}) do |cols, (name, value)|
82
- cols.merge(name => parse_json_value(value))
133
+ cols.merge(name.to_sym => parse_json_value(value))
83
134
  end
84
135
  RDF::Query::Solution.new(row)
85
136
  end
@@ -0,0 +1,267 @@
1
+ module SPARQL; class Client
2
+ ##
3
+ # A SPARQL query builder.
4
+ #
5
+ # @example Iterating over all found solutions
6
+ # query.each_solution { |solution| puts solution.inspect }
7
+ #
8
+ class Query < RDF::Query
9
+ ##
10
+ # @return [Symbol]
11
+ # @see http://www.w3.org/TR/rdf-sparql-query/#QueryForms
12
+ attr_reader :form
13
+
14
+ ##
15
+ # @return [Hash{Symbol => Object}]
16
+ attr_reader :options
17
+
18
+ ##
19
+ # Creates a boolean `ASK` query.
20
+ #
21
+ # @param [Hash{Symbol => Object}] options
22
+ # @return [Query]
23
+ # @see http://www.w3.org/TR/rdf-sparql-query/#ask
24
+ def self.ask(options = {})
25
+ self.new(:ask, options)
26
+ end
27
+
28
+ ##
29
+ # Creates a tuple `SELECT` query.
30
+ #
31
+ # @param [Array<Symbol>] variables
32
+ # @param [Hash{Symbol => Object}] options
33
+ # @return [Query]
34
+ # @see http://www.w3.org/TR/rdf-sparql-query/#select
35
+ def self.select(*variables)
36
+ options = variables.last.is_a?(Hash) ? variables.pop : {}
37
+ self.new(:select, options).select(*variables) # FIXME
38
+ end
39
+
40
+ ##
41
+ # Creates a graph `CONSTRUCT` query.
42
+ #
43
+ # @param [Array<RDF::Query::Pattern, Array>] patterns
44
+ # @param [Hash{Symbol => Object}] options
45
+ # @return [Query]
46
+ # @see http://www.w3.org/TR/rdf-sparql-query/#construct
47
+ def self.construct(*patterns)
48
+ options = patterns.last.is_a?(Hash) ? patterns.pop : {}
49
+ self.new(:construct, options).construct(*patterns) # FIXME
50
+ end
51
+
52
+ ##
53
+ # @param [Symbol, #to_s] form
54
+ # @param [Hash{Symbol => Object}] options
55
+ # @yield [query]
56
+ # @yieldparam [Query]
57
+ def initialize(form = :ask, options = {}, &block)
58
+ @form = form.respond_to?(:to_sym) ? form.to_sym : form.to_s.to_sym
59
+ super(options.dup, &block)
60
+ end
61
+
62
+ ##
63
+ # @return [Query]
64
+ # @see http://www.w3.org/TR/rdf-sparql-query/#ask
65
+ def ask
66
+ @form = :ask
67
+ self
68
+ end
69
+
70
+ ##
71
+ # @param [Array<Symbol>] variables
72
+ # @param [Hash{Symbol => Object}] options
73
+ # @return [Query]
74
+ # @see http://www.w3.org/TR/rdf-sparql-query/#select
75
+ def select(*variables)
76
+ @form = :select
77
+ options = variables.last.is_a?(Hash) ? variables.pop : {}
78
+ @variables = variables.inject({}) do |vars, var|
79
+ vars.merge(var.to_sym => RDF::Query::Variable.new(var))
80
+ end
81
+ self
82
+ end
83
+
84
+ ##
85
+ # @param [Array<RDF::Query::Pattern, Array>] patterns
86
+ # @return [Query]
87
+ def construct(*patterns)
88
+ options[:template] = patterns.map do |pattern|
89
+ case pattern
90
+ when RDF::Query::Pattern then pattern
91
+ else RDF::Query::Pattern.new(*pattern.to_a)
92
+ end
93
+ end
94
+ self
95
+ end
96
+
97
+ ##
98
+ # @param [Array<RDF::Query::Pattern, Array>] patterns
99
+ # @return [Query]
100
+ # @see http://www.w3.org/TR/rdf-sparql-query/#GraphPattern
101
+ def where(*patterns)
102
+ @patterns += patterns.map do |pattern|
103
+ case pattern
104
+ when RDF::Query::Pattern then pattern
105
+ else RDF::Query::Pattern.new(*pattern.to_a)
106
+ end
107
+ end
108
+ self
109
+ end
110
+
111
+ alias_method :whether, :where
112
+
113
+ ##
114
+ # @param [Array<Symbol>] variables
115
+ # @return [Query]
116
+ # @see http://www.w3.org/TR/rdf-sparql-query/#modOrderBy
117
+ def order(*variables)
118
+ options[:order_by] = variables
119
+ self
120
+ end
121
+
122
+ alias_method :order_by, :order
123
+
124
+ ##
125
+ # @return [Query]
126
+ # @see http://www.w3.org/TR/rdf-sparql-query/#modDistinct
127
+ def distinct(state = true)
128
+ options[:distinct] = state
129
+ self
130
+ end
131
+
132
+ ##
133
+ # @return [Query]
134
+ # @see http://www.w3.org/TR/rdf-sparql-query/#modReduced
135
+ def reduced(state = true)
136
+ options[:reduced] = state
137
+ self
138
+ end
139
+
140
+ ##
141
+ # @param [Integer, #to_i] start
142
+ # @return [Query]
143
+ # @see http://www.w3.org/TR/rdf-sparql-query/#modOffset
144
+ def offset(start)
145
+ slice(start, nil)
146
+ end
147
+
148
+ ##
149
+ # @param [Integer, #to_i] length
150
+ # @return [Query]
151
+ # @see http://www.w3.org/TR/rdf-sparql-query/#modResultLimit
152
+ def limit(length)
153
+ slice(nil, length)
154
+ end
155
+
156
+ ##
157
+ # @param [Integer, #to_i] start
158
+ # @param [Integer, #to_i] length
159
+ # @return [Query]
160
+ def slice(start, length)
161
+ options[:offset] = start.to_i if start
162
+ options[:limit] = length.to_i if length
163
+ self
164
+ end
165
+
166
+ ##
167
+ # @private
168
+ def filter(string)
169
+ (options[:filters] ||= []) << string
170
+ self
171
+ end
172
+
173
+ ##
174
+ # @return [Boolean]
175
+ def true?
176
+ case result
177
+ when TrueClass, FalseClass then result
178
+ when Enumerable then !result.empty?
179
+ else false
180
+ end
181
+ end
182
+
183
+ ##
184
+ # @return [Boolean]
185
+ def false?
186
+ !true?
187
+ end
188
+
189
+ ##
190
+ # @return [Enumerable<RDF::Query::Solution>]
191
+ def solutions
192
+ result
193
+ end
194
+
195
+ ##
196
+ # @yield [statement]
197
+ # @yieldparam [RDF::Statement]
198
+ # @return [Enumerator]
199
+ def each_statement(&block)
200
+ result.each_statement(&block)
201
+ end
202
+
203
+ ##
204
+ # @return [Object]
205
+ def result
206
+ @result ||= execute
207
+ end
208
+
209
+ ##
210
+ # @return [Object]
211
+ def execute
212
+ raise NotImplementedError
213
+ end
214
+
215
+ ##
216
+ # Returns the string representation of this query.
217
+ #
218
+ # @return [String]
219
+ def to_s
220
+ buffer = [form.to_s.upcase]
221
+ case form
222
+ when :select
223
+ buffer << 'DISTINCT' if options[:distinct]
224
+ buffer << 'REDUCED' if options[:reduced]
225
+ buffer << (variables.empty? ? '*' : variables.values.map(&:to_s).join(' '))
226
+ when :construct
227
+ buffer << '{'
228
+ buffer += options[:template].map(&:to_s)
229
+ buffer << '}'
230
+ end
231
+
232
+ buffer << 'WHERE {'
233
+ buffer += patterns.map(&:to_s)
234
+ if options[:filters]
235
+ buffer += options[:filters].map { |filter| "FILTER(#{filter})" }
236
+ end
237
+ buffer << '}'
238
+
239
+ if options[:order_by]
240
+ buffer << 'ORDER BY'
241
+ buffer += options[:order_by].map { |var| "?#{var}" }
242
+ end
243
+
244
+ buffer << "OFFSET #{options[:offset]}" if options[:offset]
245
+ buffer << "LIMIT #{options[:limit]}" if options[:limit]
246
+
247
+ buffer.join(' ')
248
+ end
249
+
250
+ ##
251
+ # Outputs a developer-friendly representation of this query to `stderr`.
252
+ #
253
+ # @return [void]
254
+ def inspect!
255
+ warn(inspect)
256
+ self
257
+ end
258
+
259
+ ##
260
+ # Returns a developer-friendly representation of this query.
261
+ #
262
+ # @return [String]
263
+ def inspect
264
+ sprintf("#<%s:%#0x(%s)>", self.class.name, __id__, to_s)
265
+ end
266
+ end
267
+ end; end
@@ -0,0 +1,170 @@
1
+ module SPARQL; class Client
2
+ ##
3
+ # A read-only repository view of a SPARQL endpoint.
4
+ #
5
+ # @see RDF::Repository
6
+ class Repository < ::RDF::Repository
7
+ # @return [SPARQL::Client]
8
+ attr_reader :client
9
+
10
+ ##
11
+ # @param [String, #to_s] endpoint
12
+ # @param [Hash{Symbol => Object}] options
13
+ def initialize(endpoint, options = {})
14
+ @options = options.dup
15
+ @client = SPARQL::Client.new(endpoint, options)
16
+ end
17
+
18
+ ##
19
+ # Enumerates each RDF statement in this repository.
20
+ #
21
+ # @yield [statement]
22
+ # @yieldparam [RDF::Statement] statement
23
+ # @return [Enumerator]
24
+ # @see RDF::Repository#each
25
+ def each(&block)
26
+ unless block_given?
27
+ require 'enumerator' unless defined?(::Enumerable::Enumerator)
28
+ ::Enumerable::Enumerator.new(self, :each)
29
+ else
30
+ client.construct([:s, :p, :o]).where([:s, :p, :o]).each_statement(&block)
31
+ end
32
+ end
33
+
34
+ ##
35
+ # Returns `true` if this repository contains the given subject.
36
+ #
37
+ # @param [RDF::Resource]
38
+ # @return [Boolean]
39
+ # @see RDF::Repository#has_subject?
40
+ def has_subject?(subject)
41
+ client.ask.whether([subject, :p, :o]).true?
42
+ end
43
+
44
+ ##
45
+ # Returns `true` if this repository contains the given predicate.
46
+ #
47
+ # @param [RDF::URI]
48
+ # @return [Boolean]
49
+ # @see RDF::Repository#has_predicate?
50
+ def has_predicate?(predicate)
51
+ client.ask.whether([:s, predicate, :o]).true?
52
+ end
53
+
54
+ ##
55
+ # Returns `true` if this repository contains the given object.
56
+ #
57
+ # @param [RDF::Value]
58
+ # @return [Boolean]
59
+ # @see RDF::Repository#has_object?
60
+ def has_object?(object)
61
+ client.ask.whether([:s, :p, object]).true?
62
+ end
63
+
64
+ ##
65
+ # Iterates over each subject in this repository.
66
+ #
67
+ # @yield [subject]
68
+ # @yieldparam [RDF::Resource] subject
69
+ # @return [Enumerator]
70
+ # @see RDF::Repository#each_subject?
71
+ def each_subject(&block)
72
+ unless block_given?
73
+ require 'enumerator' unless defined?(::Enumerable::Enumerator)
74
+ ::Enumerable::Enumerator.new(self, :each_subject)
75
+ else
76
+ client.select(:s, :distinct => true).where([:s, :p, :o]).each { |solution| block.call(solution[:s]) }
77
+ end
78
+ end
79
+
80
+ ##
81
+ # Iterates over each predicate in this repository.
82
+ #
83
+ # @yield [predicate]
84
+ # @yieldparam [RDF::URI] predicate
85
+ # @return [Enumerator]
86
+ # @see RDF::Repository#each_predicate?
87
+ def each_predicate(&block)
88
+ unless block_given?
89
+ require 'enumerator' unless defined?(::Enumerable::Enumerator)
90
+ ::Enumerable::Enumerator.new(self, :each_predicate)
91
+ else
92
+ client.select(:p, :distinct => true).where([:s, :p, :o]).each { |solution| block.call(solution[:p]) }
93
+ end
94
+ end
95
+
96
+ ##
97
+ # Iterates over each object in this repository.
98
+ #
99
+ # @yield [object]
100
+ # @yieldparam [RDF::Value] object
101
+ # @return [Enumerator]
102
+ # @see RDF::Repository#each_object?
103
+ def each_object(&block)
104
+ unless block_given?
105
+ require 'enumerator' unless defined?(::Enumerable::Enumerator)
106
+ ::Enumerable::Enumerator.new(self, :each_object)
107
+ else
108
+ client.select(:o, :distinct => true).where([:s, :p, :o]).each { |solution| block.call(solution[:o]) }
109
+ end
110
+ end
111
+
112
+ ##
113
+ # Returns `true` if this repository contains the given `triple`.
114
+ #
115
+ # @param [Array<RDF::Resource, RDF::URI, RDF::Value>] triple
116
+ # @return [Boolean]
117
+ # @see RDF::Repository#has_triple?
118
+ def has_triple?(triple)
119
+ client.ask.whether(triple.to_a[0...3]).true?
120
+ end
121
+
122
+ ##
123
+ # Returns `true` if this repository contains the given `statement`.
124
+ #
125
+ # @param [RDF::Statement] statement
126
+ # @return [Boolean]
127
+ # @see RDF::Repository#has_statement?
128
+ def has_statement?(statement)
129
+ has_triple?(statement.to_triple)
130
+ end
131
+
132
+ ##
133
+ # Returns the number of statements in this repository.
134
+ #
135
+ # @return [Integer]
136
+ # @see RDF::Repository#count?
137
+ def count
138
+ begin
139
+ binding = client.query("SELECT COUNT(*) WHERE { ?s ?p ?o }").first.to_hash
140
+ binding[binding.keys.first].value.to_i
141
+ rescue SPARQL::Client::MalformedQuery => e
142
+ # SPARQL 1.0 does not include support for aggregate functions:
143
+ count = 0
144
+ each_statement { count += 1 } # TODO: optimize this
145
+ count
146
+ end
147
+ end
148
+
149
+ alias_method :size, :count
150
+ alias_method :length, :count
151
+
152
+ ##
153
+ # Returns `true` if this repository contains no statements.
154
+ #
155
+ # @return [Boolean]
156
+ # @see RDF::Repository#empty?
157
+ def empty?
158
+ client.ask.whether([:s, :p, :o]).false?
159
+ end
160
+
161
+ ##
162
+ # Returns `false` to indicate that this is a read-only repository.
163
+ #
164
+ # @return [Boolean]
165
+ # @see RDF::Mutable#mutable?
166
+ def writable?
167
+ false
168
+ end
169
+ end
170
+ end; end
@@ -2,7 +2,7 @@ module SPARQL; class Client
2
2
  module VERSION
3
3
  MAJOR = 0
4
4
  MINOR = 0
5
- TINY = 1
5
+ TINY = 2
6
6
  EXTRA = nil
7
7
 
8
8
  STRING = [MAJOR, MINOR, TINY].join('.')
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 0
8
- - 1
9
- version: 0.0.1
8
+ - 2
9
+ version: 0.0.2
10
10
  platform: ruby
11
11
  authors:
12
12
  - Arto Bendiken
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-04-07 00:00:00 +02:00
18
+ date: 2010-04-12 00:00:00 +02:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -28,8 +28,8 @@ dependencies:
28
28
  segments:
29
29
  - 0
30
30
  - 1
31
- - 4
32
- version: 0.1.4
31
+ - 6
32
+ version: 0.1.6
33
33
  type: :development
34
34
  version_requirements: *id001
35
35
  - !ruby/object:Gem::Dependency
@@ -70,8 +70,8 @@ dependencies:
70
70
  segments:
71
71
  - 0
72
72
  - 1
73
- - 5
74
- version: 0.1.5
73
+ - 6
74
+ version: 0.1.6
75
75
  type: :runtime
76
76
  version_requirements: *id004
77
77
  - !ruby/object:Gem::Dependency
@@ -101,8 +101,10 @@ files:
101
101
  - README
102
102
  - UNLICENSE
103
103
  - VERSION
104
+ - lib/sparql/client/query.rb
105
+ - lib/sparql/client/repository.rb
106
+ - lib/sparql/client/version.rb
104
107
  - lib/sparql/client.rb
105
- - lib/sparql/version.rb
106
108
  - lib/sparql.rb
107
109
  has_rdoc: false
108
110
  homepage: http://sparql.rubyforge.org/