rdf-hamster-repo 3.2.0

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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: f9a06151808cb3e8163fb27a8f378e9b507c99c784761ac3dfc6bcd9efc42306
4
+ data.tar.gz: b3353ac4627e79194ed360cf022d51a98f1d0c96062527cee36d653e2eb8dabc
5
+ SHA512:
6
+ metadata.gz: fe7606f4c71c852706b6a97a2e8632ca32921768280dda101e946c44c010d04cc438bc8436865f22dc698f6608f9369cff98b8fa4f38ed6569ee0a85ac9f9d15
7
+ data.tar.gz: e27972369c6fb37e6d616329266dd09c69740d8bc5bfe508c5b3b7dca04df6723d73c40f9191d78a3839970afa57372d191387badcad7fe1a6819ca823c423db
data/AUTHORS ADDED
@@ -0,0 +1 @@
1
+ * Gregg Kellogg <gregg@greggkellogg.net>
data/README.md ADDED
@@ -0,0 +1,62 @@
1
+ # RDF::HamsterRepo
2
+ An RDF repository implementation using an in-memory Hamster Hash.
3
+
4
+ [![Gem Version](https://badge.fury.io/rb/rdf-hamster-repo.png)](https://badge.fury.io/rb/rdf-hamster-repo)
5
+ [![Build Status](https://github.com/ruby-rdf/rdf-hamster-repo/workflows/CI/badge.svg?branch=develop)](https://github.com/ruby-rdf/rdf-hamster-repo/actions?query=workflow%3ACI)
6
+ [![Coverage Status](https://coveralls.io/repos/ruby-rdf/rdf-hamster-repo/badge.svg?branch=develop)](https://coveralls.io/github/ruby-rdf/rdf-hamster-repo?branch=develop)
7
+ [![Gitter chat](https://badges.gitter.im/ruby-rdf/rdf.png)](https://gitter.im/ruby-rdf/rdf)
8
+
9
+ ## Description
10
+
11
+ An in-memory implementation of RDF::Repository using an efficient, immutable, and thread-safe Hash.
12
+
13
+ ## Examples
14
+
15
+ require 'rdf/hamster_repo'
16
+ require 'rdf/nquads'
17
+ repo = RDF::HamsterRepo.load("https://ruby-rdf.github.com/rdf/etc/doap.nq")
18
+
19
+ ## Dependencies
20
+
21
+ * [Ruby](https://ruby-lang.org/) (>= 2.6)
22
+ * [RDF.rb][] (~> 3.2)
23
+ * [Hamster][] (~> 3.0)
24
+
25
+ ## Mailing List
26
+
27
+ * <https://lists.w3.org/Archives/Public/public-rdf-ruby/>
28
+
29
+ ## Author
30
+
31
+ * [Gregg Kellogg](https://github.com/gkellogg) - <https://greggkellogg.net/>
32
+
33
+ ## Contributing
34
+ This repository uses [Git Flow](https://github.com/nvie/gitflow) to mange development and release activity. All submissions _must_ be on a feature branch based on the _develop_ branch to ease staging and integration.
35
+
36
+ * Do your best to adhere to the existing coding conventions and idioms.
37
+ * Don't use hard tabs, and don't leave trailing whitespace on any line.
38
+ Before committing, run `git diff --check` to make sure of this.
39
+ * Do document every method you add using [YARD][] annotations. Read the
40
+ [tutorial][YARD-GS] or just look at the existing code for examples.
41
+ * Don't touch the `.gemspec` or `VERSION` files. If you need to change them,
42
+ do so on your private branch only.
43
+ * Do feel free to add yourself to the `CREDITS` file and the
44
+ corresponding list in the the `README`. Alphabetical order applies.
45
+ * Don't touch the `AUTHORS` file. If your contributions are significant
46
+ enough, be assured we will eventually add you in there.
47
+ * Do note that in order for us to merge any non-trivial changes (as a rule
48
+ of thumb, additions larger than about 15 lines of code), we need an
49
+ explicit [public domain dedication][PDD] on record from you,
50
+ which you will be asked to agree to on the first commit to a repo within the organization.
51
+ Note that the agreement applies to all repos in the [Ruby RDF](https://github.com/ruby-rdf/) organization.
52
+
53
+ ## License
54
+
55
+ This is free and unencumbered public domain software. For more information,
56
+ see <https://unlicense.org/> or the accompanying {file:UNLICENSE} file.
57
+
58
+ [RDF.rb]: https://ruby-rdf.github.com/
59
+ [YARD]: https://yardoc.org/
60
+ [YARD-GS]: https://rubydoc.info/docs/yard/file/docs/GettingStarted.md
61
+ [PDD]: https://unlicense.org/#unlicensing-contributions
62
+ [Hamster]: https://github.com/hamstergem/hamster
data/UNLICENSE ADDED
@@ -0,0 +1,24 @@
1
+ This is free and unencumbered software released into the public domain.
2
+
3
+ Anyone is free to copy, modify, publish, use, compile, sell, or
4
+ distribute this software, either in source code form or as a compiled
5
+ binary, for any purpose, commercial or non-commercial, and by any
6
+ means.
7
+
8
+ In jurisdictions that recognize copyright laws, the author or authors
9
+ of this software dedicate any and all copyright interest in the
10
+ software to the public domain. We make this dedication for the benefit
11
+ of the public at large and to the detriment of our heirs and
12
+ successors. We intend this dedication to be an overt act of
13
+ relinquishment in perpetuity of all present and future rights to this
14
+ software under copyright law.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
19
+ IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
20
+ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21
+ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22
+ OTHER DEALINGS IN THE SOFTWARE.
23
+
24
+ For more information, please refer to <https://unlicense.org>
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 3.2.0
data/etc/doap.ttl ADDED
@@ -0,0 +1,29 @@
1
+ @base <https://rubygems.org/gems/rdf-hamster-repo> .
2
+ @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
3
+ @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
4
+ @prefix dc: <http://purl.org/dc/terms/> .
5
+ @prefix foaf: <http://xmlns.com/foaf/0.1/> .
6
+ @prefix doap: <http://usefulinc.com/ns/doap#> .
7
+ @prefix ex: <http://example.org/> .
8
+ @prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
9
+
10
+ <> a doap:Project ;
11
+ doap:name "RDF::HamsterRepo" ;
12
+ doap:homepage <https://github.com/ruby-rdf/rdf-hamster-repo> ;
13
+ doap:license <https://unlicense.org/1.0/> ;
14
+ doap:shortdesc "An RDF repository implementation using an in-memory Hamster Hash."@en ;
15
+ doap:description "An in-memory implementation of RDF::Repository using an efficient, immutable, and thread-safe Hash."@en ;
16
+ doap:created "2021-12-28"^^xsd:date;
17
+ doap:programming-language "Ruby" ;
18
+ doap:implements <http://www.w3.org/TR/rdf11-concepts/> ;
19
+ doap:category <http://dbpedia.org/resource/Resource_Description_Framework>,
20
+ <http://dbpedia.org/resource/Ruby_(programming_language)> ;
21
+ doap:download-page <> ;
22
+ doap:mailing-list <https://lists.w3.org/Archives/Public/public-rdf-ruby/> ;
23
+ doap:bug-database <https://github.com/ruby-rdf/rdf-hamster-repo/issues> ;
24
+ doap:blog <https://greggkellogg.net/> ;
25
+ doap:developer <https://greggkellogg.net/foaf#me> ;
26
+ doap:maintainer <https://greggkellogg.net/foaf#me> ;
27
+ doap:documenter <https://greggkellogg.net/foaf#me> ;
28
+ foaf:maker <https://greggkellogg.net/foaf#me> ;
29
+ dc:creator <https://greggkellogg.net/foaf#me> .
@@ -0,0 +1,437 @@
1
+ require 'rdf'
2
+ require 'hamster'
3
+
4
+ module RDF
5
+ ##
6
+ # Sub-class of RDF::Repository with order-preserving properties.
7
+ class HamsterRepo < RDF::Repository
8
+ DEFAULT_GRAPH = false
9
+
10
+ ##
11
+ # @private
12
+ def self.extend_object(obj)
13
+ obj.instance_variable_set(:@data, obj.options.delete(:data) ||
14
+ Hamster::Hash.new)
15
+ obj.instance_variable_set(:@tx_class,
16
+ obj.options.delete(:transaction_class) ||
17
+ SerializedTransaction)
18
+ super
19
+ end
20
+
21
+ ##
22
+ # Initializes this repository instance.
23
+ #
24
+ # @param [URI, #to_s] uri (nil)
25
+ # @param [String, #to_s] title (nil)
26
+ # @param [Hash{Symbol => Object}] options
27
+ # @option options [Boolean] :with_graph_name (true)
28
+ # Indicates that the repository supports named graphs, otherwise,
29
+ # only the default graph is supported.
30
+ # @option options [Boolean] :with_validity (true)
31
+ # Indicates that the repository supports named validation.
32
+ # @option options [Boolean] :transaction_class (SerializedTransaction)
33
+ # Specifies the RDF::Transaction implementation to use in this Repository.
34
+ # @yield [repository]
35
+ # @yieldparam [Repository] repository
36
+ def initialize(uri: nil, title: nil, **options, &block)
37
+ @data = options.delete(:data) || Hamster::Hash.new
38
+ super do
39
+ if block_given?
40
+ case block.arity
41
+ when 1 then block.call(self)
42
+ else instance_eval(&block)
43
+ end
44
+ end
45
+ end
46
+ end
47
+
48
+ ##
49
+ # Returns `true` if this respository supports the given `feature`.
50
+ #
51
+ # This repository supports list_terms.
52
+ def supports?(feature)
53
+ case feature.to_sym
54
+ when :atomic_write then true
55
+ when :rdfstar then true
56
+ when :snapshots then true
57
+ else super
58
+ end
59
+ end
60
+
61
+ ##
62
+ # Creates a query from the statements in this repository, turning blank nodes into non-distinguished variables. This can be used to determine if this repository is logically a subset of another repository.
63
+ #
64
+ # @return [RDF::Query]
65
+ def to_query
66
+ RDF::Query.new do |query|
67
+ each do |statement|
68
+ query.pattern RDF::Query::Pattern.from(statement, ndvars: true)
69
+ end
70
+ end
71
+ end
72
+
73
+ ##
74
+ # @private
75
+ # @see RDF::Countable#count
76
+ def count
77
+ count = 0
78
+ @data.each do |_, ss|
79
+ ss.each do |_, ps|
80
+ ps.each { |_, os| count += os.size }
81
+ end
82
+ end
83
+ count
84
+ end
85
+
86
+ ##
87
+ # @overload graph?
88
+ # Returns `false` to indicate that this is not a graph.
89
+ #
90
+ # @return [Boolean]
91
+ # @overload graph?(name)
92
+ # Returns `true` if `self` contains the given RDF graph_name.
93
+ #
94
+ # @param [RDF::Resource, false] graph_name
95
+ # Use value `false` to query for the default graph_name
96
+ # @return [Boolean]
97
+ def graph?(*args)
98
+ case args.length
99
+ when 0 then false
100
+ when 1 then @data.key?(args.first)
101
+ else raise ArgumentError("wrong number of arguments (given #{args.length}, expected 0 or 1)")
102
+ end
103
+ end
104
+ alias_method :has_graph?, :graph?
105
+
106
+ ##
107
+ # @private
108
+ # @see RDF::Enumerable#each_graph
109
+ def graph_names(options = nil, &block)
110
+ @data.keys.reject { |g| g == DEFAULT_GRAPH }.to_a
111
+ end
112
+
113
+ ##
114
+ # @private
115
+ # @see RDF::Enumerable#each_graph
116
+ def each_graph(&block)
117
+ if block_given?
118
+ @data.each_key do |gn|
119
+ yield RDF::Graph.new(graph_name: (gn == DEFAULT_GRAPH ? nil : gn), data: self)
120
+ end
121
+ end
122
+ enum_graph
123
+ end
124
+
125
+ ##
126
+ # @overload statement?
127
+ # Returns `false` indicating this is not an RDF::Statemenet.
128
+ # @return [Boolean]
129
+ # @see RDF::Value#statement?
130
+ # @overload statement?(statement)
131
+ # @private
132
+ # @see RDF::Enumerable#statement?
133
+ def statement?(*args)
134
+ case args.length
135
+ when 0 then false
136
+ when 1 then args.first && statement_in?(@data, args.first)
137
+ else raise ArgumentError("wrong number of arguments (given #{args.length}, expected 0 or 1)")
138
+ end
139
+ end
140
+ alias_method :has_statement?, :statement?
141
+
142
+ ##
143
+ # @private
144
+ # @see RDF::Enumerable#each_statement
145
+ def each_statement(&block)
146
+ if block_given?
147
+ @data.each do |g, ss|
148
+ ss.each do |s, ps|
149
+ ps.each do |p, os|
150
+ os.each do |o, object_options|
151
+ yield RDF::Statement.new(s, p, o, object_options.merge(graph_name: g.equal?(DEFAULT_GRAPH) ? nil : g))
152
+ end
153
+ end
154
+ end
155
+ end
156
+ end
157
+ enum_statement
158
+ end
159
+ alias_method :each, :each_statement
160
+
161
+ ##
162
+ # @see Mutable#apply_changeset
163
+ def apply_changeset(changeset)
164
+ data = @data
165
+ changeset.deletes.each do |del|
166
+ if del.constant?
167
+ data = delete_from(data, del)
168
+ else
169
+ # we need this condition to handle wildcard statements
170
+ query_pattern(del) { |stmt| data = delete_from(data, stmt) }
171
+ end
172
+ end
173
+ changeset.inserts.each { |ins| data = insert_to(data, ins) }
174
+ @data = data
175
+ end
176
+
177
+ ##
178
+ # @see RDF::Dataset#isolation_level
179
+ def isolation_level
180
+ :serializable
181
+ end
182
+
183
+ ##
184
+ # A readable & queryable snapshot of the repository for isolated reads.
185
+ #
186
+ # @return [Dataset] an immutable Dataset containing a current snapshot of
187
+ # the Repository contents.
188
+ #
189
+ # @see Mutable#snapshot
190
+ def snapshot
191
+ self.class.new(data: @data).freeze
192
+ end
193
+
194
+ protected
195
+
196
+ ##
197
+ # Match elements with `eql?`, not `==`
198
+ #
199
+ # `graph_name` of `false` matches default graph. Unbound variable matches
200
+ # non-false graph name.
201
+ #
202
+ # Matches terms which are native lists.
203
+ #
204
+ # @private
205
+ # @see RDF::Queryable#query_pattern
206
+ def query_pattern(pattern, **options, &block)
207
+ snapshot = @data
208
+ if block_given?
209
+ graph_name = pattern.graph_name
210
+ subject = pattern.subject
211
+ predicate = pattern.predicate
212
+ object = pattern.object
213
+
214
+ cs = snapshot.has_key?(graph_name) ? { graph_name => snapshot[graph_name] } : snapshot
215
+
216
+ cs.each do |c, ss|
217
+ next unless graph_name.nil? ||
218
+ graph_name == DEFAULT_GRAPH && !c ||
219
+ graph_name.eql?(c)
220
+
221
+ ss = if subject.nil? || subject.is_a?(RDF::Query::Variable)
222
+ ss
223
+ elsif subject.is_a?(RDF::Query::Pattern)
224
+ # Match subjects which are statements matching this pattern
225
+ ss.keys.select {|s| s.statement? && subject.eql?(s)}.inject({}) do |memo, st|
226
+ memo.merge(st => ss[st])
227
+ end
228
+ elsif ss.has_key?(subject)
229
+ { subject => ss[subject] }
230
+ else
231
+ []
232
+ end
233
+ ss.each do |s, ps|
234
+ ps = if predicate.nil? || predicate.is_a?(RDF::Query::Variable)
235
+ ps
236
+ elsif ps.has_key?(predicate)
237
+ { predicate => ps[predicate] }
238
+ else
239
+ []
240
+ end
241
+ ps.each do |p, os|
242
+ os.each do |o, object_options|
243
+ next unless object.nil? || object.eql?(o)
244
+ yield RDF::Statement.new(s, p, o, object_options.merge(graph_name: c.equal?(DEFAULT_GRAPH) ? nil : c))
245
+ end
246
+ end
247
+ end
248
+ end
249
+ else
250
+ enum_for(:query_pattern, pattern, **options)
251
+ end
252
+ end
253
+
254
+ ##
255
+ # @private
256
+ # @see RDF::Mutable#insert
257
+ def insert_statement(statement)
258
+ @data = insert_to(@data, statement)
259
+ end
260
+
261
+ ##
262
+ # @private
263
+ # @see RDF::Mutable#delete
264
+ def delete_statement(statement)
265
+ @data = delete_from(@data, statement)
266
+ end
267
+
268
+ ##
269
+ # @private
270
+ # @see RDF::Mutable#clear
271
+ def clear_statements
272
+ @data = @data.clear
273
+ end
274
+
275
+ ##
276
+ # @private
277
+ # @return [Hash]
278
+ def data
279
+ @data
280
+ end
281
+
282
+ ##
283
+ # @private
284
+ # @return [Hash]
285
+ def data=(hash)
286
+ @data = hash
287
+ end
288
+
289
+ private
290
+
291
+ ##
292
+ # @private
293
+ # @see #statement?
294
+ def statement_in?(data, statement)
295
+ s, p, o, g = statement.to_quad
296
+ g ||= DEFAULT_GRAPH
297
+
298
+ data.key?(g) &&
299
+ data[g].key?(s) &&
300
+ data[g][s].key?(p) &&
301
+ data[g][s][p].key?(o)
302
+ end
303
+ alias_method :has_statement_in?, :statement_in?
304
+
305
+ ##
306
+ # @private
307
+ # @return [Hash] a new, updated hash
308
+ def insert_to(data, statement)
309
+ raise ArgumentError, "Statement #{statement.inspect} is incomplete" if statement.incomplete?
310
+
311
+ unless statement_in?(data, statement)
312
+ s, p, o, c = statement.to_quad
313
+ c ||= DEFAULT_GRAPH
314
+
315
+ return data.put(c) do |subs|
316
+ (subs || Hamster::Hash.new).put(s) do |preds|
317
+ (preds || Hamster::Hash.new).put(p) do |objs|
318
+ (objs || Hamster::Hash.new).put(o, statement.options)
319
+ end
320
+ end
321
+ end
322
+ end
323
+ data
324
+ end
325
+
326
+ ##
327
+ # @private
328
+ # @return [Hash] a new, updated hash
329
+ def delete_from(data, statement)
330
+ if has_statement_in?(data, statement)
331
+ s, p, o, g = statement.to_quad
332
+ g = DEFAULT_GRAPH unless supports?(:graph_name)
333
+ g ||= DEFAULT_GRAPH
334
+
335
+ os = data[g][s][p].delete(o)
336
+ ps = os.empty? ? data[g][s].delete(p) : data[g][s].put(p, os)
337
+ ss = ps.empty? ? data[g].delete(s) : data[g].put(s, ps)
338
+ return ss.empty? ? data.delete(g) : data.put(g, ss)
339
+ end
340
+ data
341
+ end
342
+
343
+ ##
344
+ # A transaction for the Hamster-based `RDF::Repository::Implementation`
345
+ # with full serializability.
346
+ #
347
+ # @todo refactor me!
348
+ # @see RDF::Transaction
349
+ class SerializedTransaction < Transaction
350
+ ##
351
+ # @see Transaction#initialize
352
+ def initialize(*args, **options, &block)
353
+ super(*args, **options, &block)
354
+ @base_snapshot = @snapshot
355
+ end
356
+
357
+ ##
358
+ # Inserts the statement to the transaction's working snapshot.
359
+ #
360
+ # @see Transaction#insert_statement
361
+ def insert_statement(statement)
362
+ @snapshot = @snapshot.class
363
+ .new(data: @snapshot.send(:insert_to,
364
+ @snapshot.send(:data),
365
+ process_statement(statement)))
366
+ end
367
+
368
+ ##
369
+ # Deletes the statement from the transaction's working snapshot.
370
+ #
371
+ # @see Transaction#insert_statement
372
+ def delete_statement(statement)
373
+ @snapshot = @snapshot.class
374
+ .new(data: @snapshot.send(:delete_from,
375
+ @snapshot.send(:data),
376
+ process_statement(statement)))
377
+ end
378
+
379
+ ##
380
+ # @see RDF::Dataset#isolation_level
381
+ def isolation_level
382
+ :serializable
383
+ end
384
+
385
+ ##
386
+ # @note this is a simple object equality check.
387
+ #
388
+ # @see RDF::Transaction#mutated?
389
+ def mutated?
390
+ !@snapshot.send(:data).equal?(repository.send(:data))
391
+ end
392
+
393
+ ##
394
+ # Replaces repository data with the transaction's snapshot in a safely
395
+ # serializable fashion.
396
+ #
397
+ # @note this transaction uses a pessimistic merge strategy which
398
+ # fails the transaction if any data has changed in the repository
399
+ # since transaction start time. However, the specific guarantee is
400
+ # softer: multiple concurrent conflicting transactions will not
401
+ # succeed. We may choose to implement a less pessimistic merge
402
+ # strategy as a non-breaking change.
403
+ #
404
+ # @raise [TransactionError] when the transaction can't be merged.
405
+ # @see Transaction#execute
406
+ def execute
407
+ raise TransactionError, 'Cannot execute a rolled back transaction. ' \
408
+ 'Open a new one instead.' if instance_variable_defined?(:@rolledback) && @rolledback
409
+
410
+ raise TransactionError, 'Error merging transaction. Repository' \
411
+ 'has changed during transaction time.' unless
412
+ repository.send(:data).equal? @base_snapshot.send(:data)
413
+
414
+ repository.send(:data=, @snapshot.send(:data))
415
+ end
416
+ end
417
+
418
+ module VERSION
419
+ VERSION_FILE = File.expand_path("../../../VERSION", __FILE__)
420
+ MAJOR, MINOR, TINY, EXTRA = File.read(VERSION_FILE).chop.split(".")
421
+
422
+ STRING = [MAJOR, MINOR, TINY, EXTRA].compact.join('.')
423
+
424
+ ##
425
+ # @return [String]
426
+ def self.to_s() STRING end
427
+
428
+ ##
429
+ # @return [String]
430
+ def self.to_str() STRING end
431
+
432
+ ##
433
+ # @return [Array(Integer, Integer, Integer)]
434
+ def self.to_a() STRING.split(".") end
435
+ end
436
+ end
437
+ end
metadata ADDED
@@ -0,0 +1,119 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rdf-hamster-repo
3
+ version: !ruby/object:Gem::Version
4
+ version: 3.2.0
5
+ platform: ruby
6
+ authors:
7
+ - Gregg Kellogg
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2021-12-28 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rdf
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '3.2'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '3.2'
27
+ - !ruby/object:Gem::Dependency
28
+ name: hamster
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '3.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '3.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rdf-spec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.2'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.2'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.10'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.10'
69
+ - !ruby/object:Gem::Dependency
70
+ name: yard
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.9'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0.9'
83
+ description: An in-memory implementation of RDF::Repository using an efficient, immutable,
84
+ and thread-safe Hash.
85
+ email: public-rdf-ruby@w3.org
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - AUTHORS
91
+ - README.md
92
+ - UNLICENSE
93
+ - VERSION
94
+ - etc/doap.ttl
95
+ - lib/rdf/hamster_repo.rb
96
+ homepage: https://github.com/ruby-rdf/rdf-hamster-repo
97
+ licenses:
98
+ - Unlicense
99
+ metadata: {}
100
+ post_install_message:
101
+ rdoc_options: []
102
+ require_paths:
103
+ - lib
104
+ required_ruby_version: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - ">="
107
+ - !ruby/object:Gem::Version
108
+ version: '2.6'
109
+ required_rubygems_version: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - ">="
112
+ - !ruby/object:Gem::Version
113
+ version: '0'
114
+ requirements: []
115
+ rubygems_version: 3.3.3
116
+ signing_key:
117
+ specification_version: 4
118
+ summary: An RDF repository implementation using an in-memory Hamster Hash.
119
+ test_files: []