moneta 1.5.0 → 1.5.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +22 -12
  3. data/CHANGES +10 -0
  4. data/CONTRIBUTORS +3 -0
  5. data/Gemfile +20 -11
  6. data/README.md +4 -6
  7. data/feature_matrix.yaml +1 -1
  8. data/lib/moneta/adapters/file.rb +1 -1
  9. data/lib/moneta/adapters/mongo.rb +5 -3
  10. data/lib/moneta/proxy.rb +1 -1
  11. data/lib/moneta/version.rb +1 -1
  12. data/lib/moneta.rb +1 -1
  13. data/spec/features/null.rb +28 -28
  14. data/spec/features/persist.rb +3 -3
  15. data/spec/features/returndifferent.rb +4 -4
  16. data/spec/features/returnsame.rb +4 -4
  17. data/spec/features/store.rb +104 -104
  18. data/spec/helper.rb +2 -3
  19. data/spec/moneta/adapters/activerecord/adapter_activerecord_existing_connection_spec.rb +2 -1
  20. data/spec/moneta/adapters/activerecord/adapter_activerecord_spec.rb +3 -1
  21. data/spec/moneta/adapters/activerecord/standard_activerecord_spec.rb +2 -1
  22. data/spec/moneta/adapters/activerecord/standard_activerecord_with_expires_spec.rb +2 -1
  23. data/spec/moneta/adapters/activesupportcache/adapter_activesupportcache_spec.rb +1 -1
  24. data/spec/moneta/adapters/activesupportcache/adapter_activesupportcache_with_default_expires_spec.rb +1 -1
  25. data/spec/moneta/adapters/activesupportcache/standard_activesupportcache_spec.rb +1 -1
  26. data/spec/moneta/adapters/cassandra/adapter_cassandra_spec.rb +1 -1
  27. data/spec/moneta/adapters/cassandra/adapter_cassandra_with_default_expires_spec.rb +1 -1
  28. data/spec/moneta/adapters/cassandra/standard_cassandra_spec.rb +1 -1
  29. data/spec/moneta/adapters/datamapper/adapter_datamapper_spec.rb +10 -6
  30. data/spec/moneta/adapters/datamapper/standard_datamapper_spec.rb +2 -2
  31. data/spec/moneta/adapters/datamapper/standard_datamapper_with_expires_spec.rb +2 -2
  32. data/spec/moneta/adapters/datamapper/standard_datamapper_with_repository_spec.rb +2 -2
  33. data/spec/moneta/adapters/null/standard_null_spec.rb +5 -0
  34. data/spec/moneta/adapters/sequel/helper.rb +4 -1
  35. data/spec/moneta/proxies/enumerable/enumerable_spec.rb +2 -2
  36. data/test/action_dispatch/session_moneta_store_test.rb +5 -5
  37. metadata +6 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 67e7a85926fad89dd255f180a3455b67c923d0194d447a8fe82cca0dbb546bbe
4
- data.tar.gz: 51e15e0e3e1bafd312ee62d807afb72836e4f5c3cc036dc8c1ee0dcb8d51f80a
3
+ metadata.gz: 61d01584fc8497503e70aa6cb4fcea5ead6a05b9f4f1c2c9db138cd0470f948f
4
+ data.tar.gz: b7e2822f9aac62ab718964f4f8a3b4bf7a4473aa6ab9291b0df28882a3de2bca
5
5
  SHA512:
6
- metadata.gz: cc4340a0c94ce262108361a3ed49116980cc0ee94838810babe5015bb43d3084875fa3e76f232b182470dda6a5ab9ac7e09fe9917a97082047ec9d0b7112a02a
7
- data.tar.gz: a0f1c197e3222848e246bf0535805b4dd47bf8dbf9b3a383c619e187cb9b6d64ac6de4f711190630b4befac1e820061fd66a04d83a529a01bee519fbcde4af23
6
+ metadata.gz: fd8eb44d64eb8b62529497770bbea915fdd6880e907d697de82156aa1c9ca2f7bb58b7bb68157eefab138a8bc9aab8debf4186d4a8828bb664385c59027cd2a3
7
+ data.tar.gz: 1d97a4b4de9f0242fa260e1b197d35333a527019c43b01fab3a913c3f833a5963b47776ac78c3b9da7be70a117eaafcbb09e81108b233135ea6a018280f1b3a3
@@ -9,12 +9,13 @@ on:
9
9
  jobs:
10
10
  adapters:
11
11
  runs-on: ubuntu-latest
12
+ continue-on-error: ${{ matrix.ruby-version == '3.0' }}
12
13
 
13
14
  strategy:
14
15
  fail-fast: false
15
16
 
16
17
  matrix:
17
- ruby-version: [2.7, 2.6, 2.5, 2.4, jruby]
18
+ ruby-version: ['3.0', '2.7', '2.6', '2.5', '2.4', jruby]
18
19
  adapter:
19
20
  - Client
20
21
  - Cookie
@@ -66,6 +67,7 @@ jobs:
66
67
  couch:
67
68
  name: "Couch adapter"
68
69
  runs-on: ubuntu-latest
70
+ continue-on-error: ${{ matrix.ruby-version == '3.0' }}
69
71
 
70
72
  services:
71
73
  couch:
@@ -83,7 +85,7 @@ jobs:
83
85
 
84
86
  strategy:
85
87
  matrix:
86
- ruby-version: [2.7, 2.4, jruby]
88
+ ruby-version: ['3.0', '2.7', '2.4', jruby]
87
89
 
88
90
  env:
89
91
  BUNDLE_WITH: RestClient
@@ -118,7 +120,7 @@ jobs:
118
120
 
119
121
  strategy:
120
122
  matrix:
121
- ruby-version: [2.7, 2.4, jruby]
123
+ ruby-version: ['2.7', '2.4', jruby]
122
124
 
123
125
  env:
124
126
  BUNDLE_WITH: Cassandra
@@ -139,6 +141,7 @@ jobs:
139
141
  mysql-adapters:
140
142
  name: "MySQL adapters"
141
143
  runs-on: ubuntu-latest
144
+ continue-on-error: ${{ matrix.ruby-version == '3.0' }}
142
145
 
143
146
  services:
144
147
  mysql:
@@ -155,7 +158,7 @@ jobs:
155
158
 
156
159
  strategy:
157
160
  matrix:
158
- ruby-version: [2.7, 2.4, jruby]
161
+ ruby-version: ['3.0', '2.7', '2.4', jruby]
159
162
 
160
163
  env:
161
164
  BUNDLE_WITH: ActiveRecord Sequel DataMapper mysql
@@ -194,6 +197,7 @@ jobs:
194
197
  postgres-adapters:
195
198
  name: "Postgres adapters"
196
199
  runs-on: ubuntu-latest
200
+ continue-on-error: ${{ matrix.ruby-version == '3.0' }}
197
201
 
198
202
  services:
199
203
  postgres:
@@ -210,7 +214,7 @@ jobs:
210
214
 
211
215
  strategy:
212
216
  matrix:
213
- ruby-version: [2.7, 2.4, jruby]
217
+ ruby-version: ['3.0', '2.7', '2.4', jruby]
214
218
 
215
219
  env:
216
220
  BUNDLE_WITH: ActiveRecord Sequel DataMapper postgresql
@@ -243,10 +247,11 @@ jobs:
243
247
  sqlite-adapters:
244
248
  name: "SQLite adapters"
245
249
  runs-on: ubuntu-latest
250
+ continue-on-error: ${{ matrix.ruby-version == '3.0' }}
246
251
 
247
252
  strategy:
248
253
  matrix:
249
- ruby-version: [2.7, 2.4, jruby]
254
+ ruby-version: ['3.0', '2.7', '2.4', jruby]
250
255
 
251
256
  env:
252
257
  BUNDLE_WITH: ActiveRecord Sequel DataMapper sqlite
@@ -267,6 +272,7 @@ jobs:
267
272
  redis:
268
273
  name: "Redis adapters"
269
274
  runs-on: ubuntu-latest
275
+ continue-on-error: ${{ matrix.ruby-version == '3.0' }}
270
276
 
271
277
  services:
272
278
  redis:
@@ -281,7 +287,7 @@ jobs:
281
287
 
282
288
  strategy:
283
289
  matrix:
284
- ruby-version: [2.7, 2.4, jruby]
290
+ ruby-version: ['3.0', '2.7', '2.4', jruby]
285
291
 
286
292
  env:
287
293
  BUNDLE_WITH: Redis
@@ -302,10 +308,11 @@ jobs:
302
308
  memcached:
303
309
  name: "Memcached adapters"
304
310
  runs-on: ubuntu-latest
311
+ continue-on-error: ${{ matrix.ruby-version == '3.0' }}
305
312
 
306
313
  strategy:
307
314
  matrix:
308
- ruby-version: [2.7, 2.4, jruby]
315
+ ruby-version: ['3.0', '2.7', '2.4', jruby]
309
316
 
310
317
  env:
311
318
  BUNDLE_WITH: Memcached
@@ -332,10 +339,11 @@ jobs:
332
339
  mongo:
333
340
  name: "Mongo adapter"
334
341
  runs-on: ubuntu-latest
342
+ continue-on-error: ${{ matrix.ruby-version == '3.0' }}
335
343
 
336
344
  services:
337
345
  mongo:
338
- image: mongo
346
+ image: mongo:4.4
339
347
  options: >-
340
348
  --health-cmd "mongo --eval db"
341
349
  --health-interval 10s
@@ -346,7 +354,7 @@ jobs:
346
354
 
347
355
  strategy:
348
356
  matrix:
349
- ruby-version: [2.7, 2.4] #, jruby] - FIXME reenable once https://github.com/mongodb/mongo-ruby-driver/pull/2143 is released
357
+ ruby-version: ['3.0', '2.7', '2.4', jruby]
350
358
 
351
359
  env:
352
360
  BUNDLE_WITH: Mongo
@@ -367,10 +375,11 @@ jobs:
367
375
  residual-specs:
368
376
  name: "Proxies and other specs"
369
377
  runs-on: ubuntu-latest
378
+ continue-on-error: ${{ matrix.ruby-version == '3.0' }}
370
379
 
371
380
  strategy:
372
381
  matrix:
373
- ruby-version: [2.7, 2.4, jruby]
382
+ ruby-version: ['3.0', '2.7', '2.4', jruby]
374
383
 
375
384
  env:
376
385
  BUNDLE_WITH: transformers GDBM Fog
@@ -400,6 +409,7 @@ jobs:
400
409
  rubocop:
401
410
  name: "Rubocop"
402
411
  runs-on: ubuntu-latest
412
+ continue-on-error: ${{ matrix.ruby-version == '3.0' }}
403
413
 
404
414
  steps:
405
415
  - uses: actions/checkout@v2
@@ -407,7 +417,7 @@ jobs:
407
417
  - name: Set up Ruby
408
418
  uses: ruby/setup-ruby@v1
409
419
  with:
410
- ruby-version: 2.7
420
+ ruby-version: '3.0'
411
421
  bundler: latest
412
422
  bundler-cache: true
413
423
 
data/CHANGES CHANGED
@@ -1,3 +1,13 @@
1
+ 1.5.2
2
+
3
+ * Proxy - handle returning config when the adapter does not use config
4
+ * Avoid calling `supports?(:expires)` when expiry isn't needed
5
+ * Adapters::Mongo - fix `merge!` behaviour when no values are inserted
6
+
7
+ 1.5.1
8
+
9
+ * Adapters::File - fix an implicit hash issue in Ruby 3 (#222)
10
+
1
11
  1.5.0
2
12
 
3
13
  * Adapters - internally, most (all?) adapters now inherit from a base Adapter class
data/CONTRIBUTORS CHANGED
@@ -3,11 +3,13 @@ Alastair Pharo <me@asph.dev>
3
3
  Alejandro Crosa <acrosa@sharing.local>
4
4
  Alessio Signorini <alessio@signorini.us>
5
5
  Anthony Eden <anthonyeden@gmail.com>
6
+ Antoine Beaupré <anarcat@debian.org>
6
7
  Antonio Terceiro <terceiro@debian.org>
7
8
  Atoxhybrid <atoxhybrid@gmail.com>
8
9
  AtoxIO <atoxhybrid@gmail.com>
9
10
  Ben Schwarz <ben.schwarz@gmail.com>
10
11
  Benjamin Yu <benjaminlyu@gmail.com>
12
+ Corey Smith <korkey128k@gmail.com>
11
13
  Daniel Mendler <mail@daniel-mendler.de>
12
14
  Denis Defreyne <denis.defreyne@stoneship.org>
13
15
  Derek Kastner <dkastner@gmail.com>
@@ -34,6 +36,7 @@ Quin Hoxie <quin@aboutus.org>
34
36
  Ryan T. Hosford <tad.hosford@gmail.com>
35
37
  Scott Wadden <scott.wadden@gmail.com>
36
38
  Sven Riedel <sr@gimp.org>
39
+ Thomas R. Koll <tomk32@tomk32.de>
37
40
  Timo Goebel <timo.goebel@dm.de>
38
41
  Tom Meier <ozmeier@yahoo.co.uk>
39
42
  Tony Han <h.bing612@gmail.com>
data/Gemfile CHANGED
@@ -52,10 +52,6 @@ group :transformers, optional: true do
52
52
  gem 'snappy', platforms: :ruby
53
53
  end
54
54
 
55
- group :quicklz, optional: true do
56
- gem 'qlzruby', platforms: :ruby
57
- end
58
-
59
55
  # Hash transformer library
60
56
  group :city, optional: true do
61
57
  gem 'cityhash', platforms: :ruby
@@ -89,8 +85,8 @@ group :Memcached, optional: true do
89
85
  end
90
86
 
91
87
  group :MemcachedNative, optional: true do
92
- gem 'memcached', platforms: :ruby
93
88
  gem 'jruby-memcached', platforms: :jruby
89
+ gem 'memcached', platforms: :ruby
94
90
  end
95
91
  end
96
92
 
@@ -99,7 +95,9 @@ group :Riak, optional: true do
99
95
  end
100
96
 
101
97
  group :Cassandra, optional: true do
102
- gem 'cassandra-driver'
98
+ install_if lambda { RUBY_ENGINE != 'ruby' || Gem::Version.new(RUBY_VERSION) < Gem::Version.new('3.0.0') } do
99
+ gem 'cassandra-driver'
100
+ end
103
101
  end
104
102
 
105
103
  group :TokyoTyrant, optional: true do
@@ -131,7 +129,9 @@ group :TokyoCabinet, optional: true do
131
129
  end
132
130
 
133
131
  group :KyotoCabinet, optional: true do
134
- gem 'kyotocabinet-ruby-reanimated', platforms: [:ruby_23, :ruby_24, :ruby_25, :ruby_26]
132
+ install_if lambda { Gem::Version.new(RUBY_VERSION) < Gem::Version.new('2.7.0') } do
133
+ gem 'kyotocabinet-ruby-reanimated', platforms: :ruby
134
+ end
135
135
  end
136
136
 
137
137
  group :H2, optional: true do
@@ -148,9 +148,11 @@ group :RestClient do
148
148
  end
149
149
 
150
150
  group :DataMapper, optional: true do
151
- gem 'dm-core'
152
- gem 'dm-migrations'
153
- gem 'dm-mysql-adapter'
151
+ install_if lambda { RUBY_ENGINE == 'ruby' && Gem::Version.new(RUBY_VERSION) < Gem::Version.new('3.0.0') } do
152
+ gem 'dm-core'
153
+ gem 'dm-migrations'
154
+ gem 'dm-mysql-adapter'
155
+ end
154
156
  end
155
157
 
156
158
  group :Fog, optional: true do
@@ -165,7 +167,7 @@ end
165
167
 
166
168
  group :sqlite, optional: true do
167
169
  gem 'activerecord-jdbcsqlite3-adapter', platforms: :jruby
168
- gem 'sqlite3', '~> 1.3.6', platforms: :ruby
170
+ gem 'sqlite3', '~> 1.5.3', platforms: :ruby
169
171
  end
170
172
 
171
173
  group :postgresql, optional: true do
@@ -173,6 +175,12 @@ group :postgresql, optional: true do
173
175
  gem 'pg', platforms: :ruby
174
176
  end
175
177
 
178
+ group :SDBM, optional: true do
179
+ install_if lambda { Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('3.0.0') } do
180
+ gem 'sdbm', platforms: :ruby
181
+ end
182
+ end
183
+
176
184
  # Rack integration testing
177
185
  group :rack do
178
186
  gem 'rack'
@@ -194,4 +202,5 @@ end
194
202
  # Used for running a dev console
195
203
  group :console, optional: true do
196
204
  gem 'irb'
205
+ gem 'rdoc'
197
206
  end
data/README.md CHANGED
@@ -106,11 +106,11 @@ Out of the box, it supports the following backends. Use the backend name symbol
106
106
  * Key/value databases:
107
107
  * [Berkeley DB using DBM interface or NDBM (Depends on Ruby environment)](http://www.ruby-doc.org/stdlib/libdoc/dbm/rdoc/DBM.html) (`:DBM`)
108
108
  * [Cassandra](http://cassandra.apache.org/) (`:Cassandra`)
109
- * [Daybreak](http://propublica.github.com/daybreak/) (`:Daybreak`)
109
+ * [Daybreak](https://propublica.github.io/daybreak/) (`:Daybreak`)
110
110
  * [GDBM](http://www.ruby-doc.org/stdlib/libdoc/gdbm/rdoc/GDBM.html) (`:GDBM`)
111
111
  * [HBase](http://hbase.apache.org/) (`:HBase`)
112
112
  * [LevelDB](http://code.google.com/p/leveldb/) (`:LevelDB`)
113
- * [LMDB](http://symas.com/mdb/) (`:LMDB`)
113
+ * [LMDB](http://symas.com/lmdb) (`:LMDB`)
114
114
  * [Redis](http://redis.io/) (`:Redis`)
115
115
  * [Riak](http://docs.basho.com/) (`:Riak`)
116
116
  * [SDBM](http://www.ruby-doc.org/stdlib/libdoc/sdbm/rdoc/SDBM.html) (`:SDBM`)
@@ -150,7 +150,7 @@ __NOTE:__ <a name="backend-matrix"></a>The backend matrix is much more readable
150
150
 
151
151
  <tr><td>File</td><td>-</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#F44">✗</td><td>File store</td></tr>
152
152
 
153
- <tr><td>LMDB</td><td>lmdb</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td><a href="http://symas.com/mdb/">Symas Lightning Memory-Mapped Database (LMDB)</a></td></tr>
153
+ <tr><td>LMDB</td><td>lmdb</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td><a href="http://symas.com/lmdb">Symas Lightning Memory-Mapped Database (LMDB)</a></td></tr>
154
154
 
155
155
  <tr><td>Sequel</td><td>sequel</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#F44">✗</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td style="text-align:center;background:#5F5">✓</td><td><a href="http://sequel.rubyforge.org/">Sequel</a> ORM</td></tr>
156
156
 
@@ -221,9 +221,7 @@ __NOTE:__ <a name="backend-matrix"></a>The backend matrix is much more readable
221
221
  3. Share a Moneta store between multiple processes using `Moneta::Shared` (See below).
222
222
  4. If a store provides atomic increment it can be used with `Moneta::Semaphore`. You can add weak `#increment` support using the `Moneta::WeakIncrement` proxy.
223
223
  5. If a store provides atomic creation it can be used with `Moneta::Mutex`. You can add weak `#create` support using the `Moneta::WeakCreate` proxy.
224
- 6. Add expiration support by using `Moneta::Expires` or by passing the option
225
- `expires: true` (or `expires: <seconds>` if you want all values to expire by
226
- default) to `Moneta#new`.
224
+ 6. Add expiration support by using `Moneta::Expires` or by passing the option `expires: true` to `Moneta#new`.
227
225
  7. This indicates that there is some performance gain when fetching multiple values at once using `#values_at`/`#fetch_values` or `#slice`. For instance, the `MGET` instruction in Redis, or the ability to retrieve several rows in one query in SQL.
228
226
  8. This indicates that there is some performance gain when storing multiple key/value pairs at once using `#merge!`/`#update`.
229
227
  9. Sqlite/YAML/PStore are multiprocess safe, but the performance suffers badly since the whole database file must be locked for writing. Use a key/value server if you want multiprocess concurrency!
data/feature_matrix.yaml CHANGED
@@ -30,7 +30,7 @@ backends:
30
30
  platforms: [ MRI ]
31
31
  gems: lmdb
32
32
  features: [ threadsafe, multiprocess, increment, create, each_key, bulk_read, bulk_write ]
33
- description: "[Symas Lightning Memory-Mapped Database (LMDB)](http://symas.com/mdb/)"
33
+ description: "[Symas Lightning Memory-Mapped Database (LMDB)](http://symas.com/lmdb)"
34
34
  - adapter: Sequel
35
35
  platforms: [ MRI, JRuby ]
36
36
  gems: sequel
@@ -16,7 +16,7 @@ module Moneta
16
16
  # @param [Hash] options
17
17
  # @option options [String] :dir Directory where files will be stored
18
18
  def initialize(options = {})
19
- configure(options)
19
+ configure(**options)
20
20
  FileUtils.mkpath(config.dir)
21
21
  raise "#{config.dir} is not a directory" unless ::File.directory?(config.dir)
22
22
  end
@@ -164,9 +164,11 @@ module Moneta
164
164
  existing = Hash[slice(*pairs.map { |key, _| key })]
165
165
  update_pairs, insert_pairs = pairs.partition { |key, _| existing.key?(key) }
166
166
 
167
- @collection.insert_many(insert_pairs.map do |key, value|
168
- value_to_doc(to_binary(key), value, options)
169
- end)
167
+ unless insert_pairs.empty?
168
+ @collection.insert_many(insert_pairs.map do |key, value|
169
+ value_to_doc(to_binary(key), value, options)
170
+ end)
171
+ end
170
172
 
171
173
  update_pairs.each do |key, value|
172
174
  value = yield(key, existing[key], value) if block_given?
data/lib/moneta/proxy.rb CHANGED
@@ -145,7 +145,7 @@ module Moneta
145
145
  def config
146
146
  unless @proxy_config
147
147
  config = super
148
- adapter_config = adapter&.config
148
+ adapter_config = adapter.config if adapter.class.include?(Config)
149
149
 
150
150
  @proxy_config =
151
151
  if config && adapter_config
@@ -1,5 +1,5 @@
1
1
  module Moneta
2
2
  # Moneta version number
3
3
  # @api public
4
- VERSION = '1.5.0'.freeze
4
+ VERSION = '1.5.2'.freeze
5
5
  end
data/lib/moneta.rb CHANGED
@@ -144,7 +144,7 @@ module Moneta
144
144
  a = Adapters.const_get(name).new(options)
145
145
  build do
146
146
  use :Logger, Hash === logger ? logger : {} if logger
147
- use :Expires, expires: options[:expires] if !a.supports?(:expires) && expires
147
+ use :Expires, expires: options[:expires] if expires && !a.supports?(:expires)
148
148
  use :Transformer, transformer
149
149
  use :Lock if threadsafe
150
150
  adapter a
@@ -1,66 +1,66 @@
1
1
  shared_examples :null do
2
2
  it 'reads from keys like a Hash' do
3
- moneta_property_of(keys: 1).check do |keys:|
4
- store[keys[0]].should be_nil
5
- store.load(keys[0]).should be_nil
3
+ moneta_property_of(keys: 1).check do |m|
4
+ store[m.keys[0]].should be_nil
5
+ store.load(m.keys[0]).should be_nil
6
6
  end
7
7
  end
8
8
 
9
9
  it 'guarantees that the same value is returned when setting a key' do
10
- moneta_property_of(keys: 1, values: 1).check do |keys:, values:|
11
- (store[keys[0]] = values[0]).should equal(values[0])
10
+ moneta_property_of(keys: 1, values: 1).check do |m|
11
+ (store[m.keys[0]] = m.values[0]).should equal(m.values[0])
12
12
  end
13
13
  end
14
14
 
15
15
  it 'returns false from #key? if a key is not available' do
16
- moneta_property_of(keys: 1).check(1) do |keys:|
17
- store.key?(keys[0]).should be false
16
+ moneta_property_of(keys: 1).check(1) do |m|
17
+ store.key?(m.keys[0]).should be false
18
18
  end
19
19
  end
20
20
 
21
21
  it 'returns nil from delete if a value for a key does not exist' do
22
- moneta_property_of(keys: 1).check do |keys:|
23
- store.delete(keys[0]).should be_nil
22
+ moneta_property_of(keys: 1).check do |m|
23
+ store.delete(m.keys[0]).should be_nil
24
24
  end
25
25
  end
26
26
 
27
27
  it 'removes all keys from the store with clear' do
28
- moneta_property_of(keys: 2, values: 2).check do |keys:, values:|
29
- store[keys[0]] = values[0]
30
- store[keys[1]] = values[1]
28
+ moneta_property_of(keys: 2, values: 2).check do |m|
29
+ store[m.keys[0]] = m.values[0]
30
+ store[m.keys[1]] = m.values[1]
31
31
  store.clear.should equal(store)
32
- store.key?(keys[0]).should be false
33
- store.key?(keys[1]).should be false
32
+ store.key?(m.keys[0]).should be false
33
+ store.key?(m.keys[1]).should be false
34
34
  end
35
35
  end
36
36
 
37
37
  it 'fetches a key with a default value with fetch, if the key is not available' do
38
- moneta_property_of(keys: 1, values: 1).check do |keys:, values:|
39
- store.fetch(keys[0], values[0]).should == values[0]
38
+ moneta_property_of(keys: 1, values: 1).check do |m|
39
+ store.fetch(m.keys[0], m.values[0]).should == m.values[0]
40
40
  end
41
41
  end
42
42
 
43
43
  it 'fetches a key with a block with fetch, if the key is not available' do
44
- moneta_property_of(keys: 1, values: 1).check do |keys:, values:|
45
- store.fetch(keys[0]) do |k|
46
- k.should equal(keys[0])
47
- values[0]
48
- end.should equal(values[0])
44
+ moneta_property_of(keys: 1, values: 1).check do |m|
45
+ store.fetch(m.keys[0]) do |k|
46
+ k.should equal(m.keys[0])
47
+ m.values[0]
48
+ end.should equal(m.values[0])
49
49
  end
50
50
  end
51
51
 
52
52
  it 'accepts frozen options' do
53
- moneta_property_of(keys: 1, values: 1).check do |keys:, values:|
53
+ moneta_property_of(keys: 1, values: 1).check do |m|
54
54
  options = {option1: 1, options2: 2}
55
55
  options.freeze
56
56
  store.clear.should equal(store)
57
- store.key?(keys[0], options).should be false
58
- store.load(keys[0], options).should be_nil
59
- store.fetch(keys[0], 42, options).should == 42
60
- store.fetch(keys[0], options) { 42 }.should == 42
61
- store.delete(keys[0], options).should be_nil
57
+ store.key?(m.keys[0], options).should be false
58
+ store.load(m.keys[0], options).should be_nil
59
+ store.fetch(m.keys[0], 42, options).should == 42
60
+ store.fetch(m.keys[0], options) { 42 }.should == 42
61
+ store.delete(m.keys[0], options).should be_nil
62
62
  store.clear(options).should equal(store)
63
- store.store(keys[0], values[0], options).should == values[0]
63
+ store.store(m.keys[0], m.values[0], options).should == m.values[0]
64
64
  end
65
65
  end
66
66
  end
@@ -1,12 +1,12 @@
1
1
  shared_examples :persist do
2
2
  it 'persists values' do
3
- moneta_property_of(keys: 1, values: 1).check do |keys:, values:|
3
+ moneta_property_of(keys: 1, values: 1).check do |m|
4
4
  new_store.tap do |store|
5
- store[keys[0]] = values[0]
5
+ store[m.keys[0]] = m.values[0]
6
6
  store.close
7
7
  end
8
8
  new_store.tap do |store|
9
- store[keys[0]].should == values[0]
9
+ store[m.keys[0]].should == m.values[0]
10
10
  store.close
11
11
  end
12
12
  end
@@ -1,9 +1,9 @@
1
1
  shared_examples :returndifferent do
2
2
  it 'guarantees that a different value is retrieved' do
3
- moneta_property_of(keys: 1, values: 1).check do |keys:, values:|
4
- next if [TrueClass,FalseClass,NilClass,Numeric].any?(&values[0].method(:is_a?))
5
- store[keys[0]] = values[0]
6
- store[keys[0]].should_not be_equal(values[0])
3
+ moneta_property_of(keys: 1, values: 1).check do |m|
4
+ next if [TrueClass,FalseClass,NilClass,Numeric].any?(&m.values[0].method(:is_a?))
5
+ store[m.keys[0]] = m.values[0]
6
+ store[m.keys[0]].should_not be_equal(m.values[0])
7
7
  end
8
8
  end
9
9
  end
@@ -1,9 +1,9 @@
1
1
  shared_examples :returnsame do
2
2
  it 'guarantees that the same value is retrieved' do
3
- moneta_property_of(keys: 1, values: 1).check do |keys:, values:|
4
- next if [TrueClass,FalseClass,Numeric].any?(&values[0].method(:is_a?))
5
- store[keys[0]] = values[0]
6
- store[keys[0]].should be_equal(values[0])
3
+ moneta_property_of(keys: 1, values: 1).check do |m|
4
+ next if [TrueClass, FalseClass, Numeric].any?(&m.values[0].method(:is_a?))
5
+ store[m.keys[0]] = m.values[0]
6
+ store[m.keys[0]].should be_equal(m.values[0])
7
7
  end
8
8
  end
9
9
  end
@@ -1,106 +1,106 @@
1
1
  shared_examples :store do
2
2
  it 'writes values to keys that like a Hash' do
3
- moneta_property_of(keys: 1, values: 1).check do |keys:, values:|
4
- store[keys[0]] = values[0]
5
- store[keys[0]].should == values[0]
6
- store.load(keys[0]).should == values[0]
3
+ moneta_property_of(keys: 1, values: 1).check do |m|
4
+ store[m.keys[0]] = m.values[0]
5
+ store[m.keys[0]].should == m.values[0]
6
+ store.load(m.keys[0]).should == m.values[0]
7
7
  end
8
8
  end
9
9
 
10
10
  it 'returns true from #key? if a key is available' do
11
- moneta_property_of(keys: 1, values: 1).check do |keys:, values:|
12
- store[keys[0]] = values[0]
13
- store.key?(keys[0]).should be true
11
+ moneta_property_of(keys: 1, values: 1).check do |m|
12
+ store[m.keys[0]] = m.values[0]
13
+ store.key?(m.keys[0]).should be true
14
14
  end
15
15
  end
16
16
 
17
17
  it 'stores values with #store' do
18
- moneta_property_of(keys: 1, values: 1).check do |keys:, values:|
19
- value = values[0]
20
- store.store(keys[0], value).should equal(value)
21
- store[keys[0]].should == values[0]
22
- store.load(keys[0]).should == values[0]
18
+ moneta_property_of(keys: 1, values: 1).check do |m|
19
+ value = m.values[0]
20
+ store.store(m.keys[0], value).should equal(value)
21
+ store[m.keys[0]].should == m.values[0]
22
+ store.load(m.keys[0]).should == m.values[0]
23
23
  end
24
24
  end
25
25
 
26
26
  it 'stores values after clear' do
27
- moneta_property_of(keys: 2, values: 2).check do |keys:, values:|
28
- store[keys[0]] = values[0]
29
- store[keys[1]] = values[1]
27
+ moneta_property_of(keys: 2, values: 2).check do |m|
28
+ store[m.keys[0]] = m.values[0]
29
+ store[m.keys[1]] = m.values[1]
30
30
  store.clear.should equal(store)
31
- store[keys[0]] = values[0]
32
- store[keys[0]].should == values[0]
33
- store[keys[1]].should be_nil
31
+ store[m.keys[0]] = m.values[0]
32
+ store[m.keys[0]].should == m.values[0]
33
+ store[m.keys[1]].should be_nil
34
34
  end
35
35
  end
36
36
 
37
37
  it 'removes and returns a value from the backing store via delete if it exists' do
38
- moneta_property_of(keys: 1, values: 1).check do |keys:, values:|
39
- store[keys[0]] = values[0]
40
- store.delete(keys[0]).should == values[0]
41
- store.key?(keys[0]).should be false
38
+ moneta_property_of(keys: 1, values: 1).check do |m|
39
+ store[m.keys[0]] = m.values[0]
40
+ store.delete(m.keys[0]).should == m.values[0]
41
+ store.key?(m.keys[0]).should be false
42
42
  end
43
43
  end
44
44
 
45
45
  it 'overwrites existing values' do
46
- moneta_property_of(keys: 1, values: 2).check do |keys:, values:|
47
- store[keys[0]] = values[0]
48
- store[keys[0]].should == values[0]
49
- store[keys[0]] = values[1]
50
- store[keys[0]].should == values[1]
46
+ moneta_property_of(keys: 1, values: 2).check do |m|
47
+ store[m.keys[0]] = m.values[0]
48
+ store[m.keys[0]].should == m.values[0]
49
+ store[m.keys[0]] = m.values[1]
50
+ store[m.keys[0]].should == m.values[1]
51
51
  end
52
52
  end
53
53
 
54
54
  it 'stores frozen values' do
55
- moneta_property_of(keys: 1, values: 1).check do |keys:, values:|
56
- value = values[0].freeze
57
- (store[keys[0]] = value).should equal(value)
58
- store[keys[0]].should == values[0]
55
+ moneta_property_of(keys: 1, values: 1).check do |m|
56
+ value = m.values[0].freeze
57
+ (store[m.keys[0]] = value).should equal(value)
58
+ store[m.keys[0]].should == m.values[0]
59
59
  end
60
60
  end
61
61
 
62
62
  it 'stores frozen keys' do
63
- moneta_property_of(keys: 1, values: 1).check do |keys:, values:|
64
- key = keys[0].freeze
65
- store[key] = values[0]
66
- store[keys[0]].should == values[0]
63
+ moneta_property_of(keys: 1, values: 1).check do |m|
64
+ key = m.keys[0].freeze
65
+ store[key] = m.values[0]
66
+ store[m.keys[0]].should == m.values[0]
67
67
  end
68
68
  end
69
69
 
70
70
  it 'fetches a key with a default value with fetch, if the key is available' do
71
- moneta_property_of(keys: 1, values: 2).check do |keys:, values:|
72
- next if values[0].nil?
73
- store[keys[0]] = values[0]
74
- store.fetch(keys[0], values[1]).should == values[0]
71
+ moneta_property_of(keys: 1, values: 2).check do |m|
72
+ next if m.values[0].nil?
73
+ store[m.keys[0]] = m.values[0]
74
+ store.fetch(m.keys[0], m.values[1]).should == m.values[0]
75
75
  end
76
76
  end
77
77
 
78
78
  it 'does not run the block in fetch if the key is available' do
79
- moneta_property_of(keys: 1, values: 1).check do |keys:, values:|
80
- next if values[0].nil?
81
- store[keys[0]] = values[0]
79
+ moneta_property_of(keys: 1, values: 1).check do |m|
80
+ next if m.values[0].nil?
81
+ store[m.keys[0]] = m.values[0]
82
82
  unaltered = 'unaltered'
83
- store.fetch(keys[0]) { unaltered = 'altered' }
83
+ store.fetch(m.keys[0]) { unaltered = 'altered' }
84
84
  unaltered.should == 'unaltered'
85
85
  end
86
86
  end
87
87
 
88
88
  shared_examples :values_at do |name|
89
89
  it 'retrieves stored values' do
90
- moneta_property_of(keys: 3, values: 3).check do |keys:, values:|
91
- store[keys[0]] = values[0]
92
- store[keys[1]] = values[1]
93
- store[keys[2]] = values[2]
94
- expect(store.public_send(name, keys[1], keys[2], keys[0])).to eq [values[1], values[2], values[0]]
90
+ moneta_property_of(keys: 3, values: 3).check do |m|
91
+ store[m.keys[0]] = m.values[0]
92
+ store[m.keys[1]] = m.values[1]
93
+ store[m.keys[2]] = m.values[2]
94
+ expect(store.public_send(name, m.keys[1], m.keys[2], m.keys[0])).to eq [m.values[1], m.values[2], m.values[0]]
95
95
  store.clear
96
96
  end
97
97
  end
98
98
 
99
99
  it 'returns nil in place of missing values' do
100
- moneta_property_of(keys: 3, values: 2).check do |keys:, values:|
101
- store[keys[0]] = values[0]
102
- store[keys[1]] = values[1]
103
- expect(store.public_send(name, keys[1], keys[2], keys[0])).to eq [values[1], nil, values[0]]
100
+ moneta_property_of(keys: 3, values: 2).check do |m|
101
+ store[m.keys[0]] = m.values[0]
102
+ store[m.keys[1]] = m.values[1]
103
+ expect(store.public_send(name, m.keys[1], m.keys[2], m.keys[0])).to eq [m.values[1], nil, m.values[0]]
104
104
  store.clear
105
105
  end
106
106
  end
@@ -114,29 +114,29 @@ shared_examples :store do
114
114
  include_examples :values_at, :fetch_values
115
115
 
116
116
  it 'yields to the block, if given, for keys that are not in the store' do
117
- moneta_property_of(keys: 4, values: 3).check do |keys:, values:|
118
- store[keys[0]] = values[0]
119
- store[keys[1]] = values[1]
120
- store[keys[2]] = values[2]
117
+ moneta_property_of(keys: 4, values: 3).check do |m|
118
+ store[m.keys[0]] = m.values[0]
119
+ store[m.keys[1]] = m.values[1]
120
+ store[m.keys[2]] = m.values[2]
121
121
 
122
122
  expect do |b|
123
- store.fetch_values(keys[0], keys[1], keys[2], keys[3], &b)
124
- end.to yield_with_args(keys[3])
123
+ store.fetch_values(m.keys[0], m.keys[1], m.keys[2], m.keys[3], &b)
124
+ end.to yield_with_args(m.keys[3])
125
125
 
126
126
  store.clear
127
127
  end
128
128
  end
129
129
 
130
130
  it 'uses the value of the block, if given, for keys that are not in the store' do
131
- moneta_property_of(keys: 4, values: 4).check do |keys:, values:|
132
- store[keys[0]] = values[0]
133
- store[keys[1]] = values[1]
134
- store[keys[2]] = values[2]
131
+ moneta_property_of(keys: 4, values: 4).check do |m|
132
+ store[m.keys[0]] = m.values[0]
133
+ store[m.keys[1]] = m.values[1]
134
+ store[m.keys[2]] = m.values[2]
135
135
 
136
- expect(store.fetch_values(keys[0], keys[1], keys[2], keys[3]) do |key|
137
- expect(key).to eq keys[3]
138
- values[3]
139
- end).to eq [values[0], values[1], values[2], values[3]]
136
+ expect(store.fetch_values(m.keys[0], m.keys[1], m.keys[2], m.keys[3]) do |key|
137
+ expect(key).to eq m.keys[3]
138
+ m.values[3]
139
+ end).to eq [m.values[0], m.values[1], m.values[2], m.values[3]]
140
140
 
141
141
  store.clear
142
142
  end
@@ -149,26 +149,26 @@ shared_examples :store do
149
149
 
150
150
  describe '#slice' do
151
151
  it 'returns pairs of stored keys and values' do
152
- moneta_property_of(keys: 3, values: 3).check do |keys:, values:|
153
- store[keys[0]] = values[0]
154
- store[keys[1]] = values[1]
155
- store[keys[2]] = values[2]
152
+ moneta_property_of(keys: 3, values: 3).check do |m|
153
+ store[m.keys[0]] = m.values[0]
154
+ store[m.keys[1]] = m.values[1]
155
+ store[m.keys[2]] = m.values[2]
156
156
 
157
- expect(store.slice(*[keys[0], keys[1], keys[2]].shuffle).to_a).to \
158
- contain_exactly([keys[0], values[0]], [keys[1], values[1]], [keys[2], values[2]])
157
+ expect(store.slice(*[m.keys[0], m.keys[1], m.keys[2]].shuffle).to_a).to \
158
+ contain_exactly([m.keys[0], m.values[0]], [m.keys[1], m.values[1]], [m.keys[2], m.values[2]])
159
159
 
160
160
  store.clear
161
161
  end
162
162
  end
163
163
 
164
164
  it 'does not return pairs for any keys absent from the store' do
165
- moneta_property_of(keys: 4, values: 3).check do |keys:, values:|
166
- store[keys[0]] = values[0]
167
- store[keys[1]] = values[1]
168
- store[keys[2]] = values[2]
165
+ moneta_property_of(keys: 4, values: 3).check do |m|
166
+ store[m.keys[0]] = m.values[0]
167
+ store[m.keys[1]] = m.values[1]
168
+ store[m.keys[2]] = m.values[2]
169
169
 
170
- expect(store.slice(*[keys[0], keys[1], keys[2], keys[3]].shuffle).to_a).to \
171
- contain_exactly([keys[0], values[0]], [keys[1], values[1]], [keys[2], values[2]])
170
+ expect(store.slice(*[m.keys[0], m.keys[1], m.keys[2], m.keys[3]].shuffle).to_a).to \
171
+ contain_exactly([m.keys[0], m.values[0]], [m.keys[1], m.values[1]], [m.keys[2], m.values[2]])
172
172
 
173
173
  store.clear
174
174
  end
@@ -177,44 +177,44 @@ shared_examples :store do
177
177
 
178
178
  shared_examples :merge! do
179
179
  it 'stores values' do
180
- moneta_property_of(keys: 3, values: 3).check do |keys:, values:|
181
- expect(store.public_send(method, pairs.call({ keys[0] => values[0], keys[1] => values[1], keys[2] => values[2] }))).to be store
182
- expect(store.key?(keys[0])).to be true
183
- expect(store[keys[0]]).to eq values[0]
184
- expect(store.key?(keys[1])).to be true
185
- expect(store[keys[1]]).to eq values[1]
186
- expect(store.key?(keys[2])).to be true
187
- expect(store[keys[2]]).to eq values[2]
180
+ moneta_property_of(keys: 3, values: 3).check do |m|
181
+ expect(store.public_send(method, pairs.call({ m.keys[0] => m.values[0], m.keys[1] => m.values[1], m.keys[2] => m.values[2] }))).to be store
182
+ expect(store.key?(m.keys[0])).to be true
183
+ expect(store[m.keys[0]]).to eq m.values[0]
184
+ expect(store.key?(m.keys[1])).to be true
185
+ expect(store[m.keys[1]]).to eq m.values[1]
186
+ expect(store.key?(m.keys[2])).to be true
187
+ expect(store[m.keys[2]]).to eq m.values[2]
188
188
  store.clear
189
189
  end
190
190
  end
191
191
 
192
192
  it 'overwrites existing values' do
193
- moneta_property_of(keys: 2, values: 3).check do |keys:, values:|
194
- expect(store[keys[0]] = values[0]).to eq values[0]
195
- expect(store.public_send(method, pairs.call({ keys[0] => values[1], keys[1] => values[2] }))).to be store
196
- expect(store.key?(keys[0])).to be true
197
- expect(store[keys[0]]).to eq values[1]
198
- expect(store.key?(keys[1])).to be true
199
- expect(store[keys[1]]).to eq values[2]
193
+ moneta_property_of(keys: 2, values: 3).check do |m|
194
+ expect(store[m.keys[0]] = m.values[0]).to eq m.values[0]
195
+ expect(store.public_send(method, pairs.call({ m.keys[0] => m.values[1], m.keys[1] => m.values[2] }))).to be store
196
+ expect(store.key?(m.keys[0])).to be true
197
+ expect(store[m.keys[0]]).to eq m.values[1]
198
+ expect(store.key?(m.keys[1])).to be true
199
+ expect(store[m.keys[1]]).to eq m.values[2]
200
200
  store.clear
201
201
  end
202
202
  end
203
203
 
204
204
  it 'stores the return value of the block, if given, for keys that will be overwritten' do
205
- moneta_property_of(keys: 2, values: 4).check do |keys:, values:|
206
- expect(store[keys[0]] = values[0]).to eq values[0]
207
- expect(store.public_send(method, pairs.call({ keys[0] => values[1], keys[1] => values[2] })) do |key, old_val, new_val|
208
- expect(key).to eq keys[0]
209
- expect(old_val).to eq values[0]
210
- expect(new_val).to eq values[1]
211
- values[3]
205
+ moneta_property_of(keys: 2, values: 4).check do |m|
206
+ expect(store[m.keys[0]] = m.values[0]).to eq m.values[0]
207
+ expect(store.public_send(method, pairs.call({ m.keys[0] => m.values[1], m.keys[1] => m.values[2] })) do |key, old_val, new_val|
208
+ expect(key).to eq m.keys[0]
209
+ expect(old_val).to eq m.values[0]
210
+ expect(new_val).to eq m.values[1]
211
+ m.values[3]
212
212
  end).to be store
213
213
 
214
- expect(store.key?(keys[0])).to be true
215
- expect(store[keys[0]]).to eq values[3]
216
- expect(store.key?(keys[1])).to be true
217
- expect(store[keys[1]]).to eq values[2]
214
+ expect(store.key?(m.keys[0])).to be true
215
+ expect(store[m.keys[0]]).to eq m.values[3]
216
+ expect(store.key?(m.keys[1])).to be true
217
+ expect(store[m.keys[1]]).to eq m.values[2]
218
218
  store.clear
219
219
  end
220
220
  end
data/spec/helper.rb CHANGED
@@ -269,6 +269,7 @@ module MonetaHelpers
269
269
  # want to run the tests but don't want to grant root access to moneta
270
270
  let(:mysql_host) { ENV['MYSQL_HOST'] || 'localhost' }
271
271
  let(:mysql_port) { ENV['MYSQL_TCP_PORT'] || '3306' }
272
+ let(:mysql_socket) { ENV['MYSQL_SOCKET'] }
272
273
  let(:mysql_username) { ENV['MONETA_MYSQL_USERNAME'] || 'root' }
273
274
  let(:mysql_password) { ENV['MONETA_MYSQL_PASSWORD'] }
274
275
  let(:mysql_database1) { ENV['MONETA_MYSQL_DATABASE1'] || 'moneta' }
@@ -335,9 +336,7 @@ module MonetaHelpers
335
336
  value_values = values.times.map { call(values_meta) }
336
337
  guard value_values.uniq.length == value_values.length
337
338
 
338
- [[:keys, key_values], [:values, value_values]].
339
- reject { |key, value| value.empty? }.
340
- to_h
339
+ Struct.new(:keys, :values).new(key_values, value_values)
341
340
  end
342
341
  end
343
342
 
@@ -1,4 +1,4 @@
1
- describe 'adapter_activerecord_existing_connection', adapter: :ActiveRecord, mysql: true do
1
+ describe 'adapter_activerecord_existing_connection', adapter: :ActiveRecord, mysql: true, broken: ::Gem::Version.new(RUBY_ENGINE_VERSION) >= ::Gem::Version.new('3.0.0') do
2
2
  before :all do
3
3
  require 'active_record'
4
4
  end
@@ -8,6 +8,7 @@ describe 'adapter_activerecord_existing_connection', adapter: :ActiveRecord, mys
8
8
  ActiveRecord::Base.configurations = {
9
9
  default_env => {
10
10
  'adapter' => (defined?(JRUBY_VERSION) ? 'jdbcmysql' : 'mysql2'),
11
+ 'socket' => mysql_socket,
11
12
  'host' => mysql_host,
12
13
  'port' => mysql_port,
13
14
  'database' => mysql_database1,
@@ -1,4 +1,4 @@
1
- describe 'adapter_activerecord', adapter: :ActiveRecord do
1
+ describe 'adapter_activerecord', adapter: :ActiveRecord, broken: ::Gem::Version.new(RUBY_ENGINE_VERSION) >= ::Gem::Version.new('3.0.0') do
2
2
  activerecord_specs = ADAPTER_SPECS.with_values(:nil).with_each_key
3
3
 
4
4
  shared_examples :adapter_activerecord do |specs|
@@ -64,6 +64,7 @@ describe 'adapter_activerecord', adapter: :ActiveRecord do
64
64
  adapter: (defined?(JRUBY_VERSION) ? 'jdbcmysql' : 'mysql2'),
65
65
  host: mysql_host,
66
66
  port: mysql_port,
67
+ socket: mysql_socket,
67
68
  database: mysql_database1,
68
69
  username: mysql_username,
69
70
  password: mysql_password
@@ -75,6 +76,7 @@ describe 'adapter_activerecord', adapter: :ActiveRecord do
75
76
  adapter: (defined?(JRUBY_VERSION) ? 'jdbcmysql' : 'mysql2'),
76
77
  host: mysql_host,
77
78
  port: mysql_port,
79
+ socket: mysql_socket,
78
80
  database: mysql_database2,
79
81
  username: mysql_username,
80
82
  password: mysql_password
@@ -1,4 +1,4 @@
1
- describe "standard_activerecord", adapter: :ActiveRecord, mysql: true do
1
+ describe "standard_activerecord", adapter: :ActiveRecord, mysql: true, broken: ::Gem::Version.new(RUBY_ENGINE_VERSION) >= ::Gem::Version.new('3.0.0') do
2
2
  moneta_store :ActiveRecord do
3
3
  {
4
4
  table: 'standard_activerecord',
@@ -6,6 +6,7 @@ describe "standard_activerecord", adapter: :ActiveRecord, mysql: true do
6
6
  adapter: (defined?(JRUBY_VERSION) ? 'jdbcmysql' : 'mysql2'),
7
7
  host: mysql_host,
8
8
  port: mysql_port,
9
+ socket: mysql_socket,
9
10
  database: mysql_database1,
10
11
  username: mysql_username,
11
12
  password: mysql_password
@@ -1,4 +1,4 @@
1
- describe "standard_activerecord_with_expires", adapter: :ActiveRecord, mysql: true do
1
+ describe "standard_activerecord_with_expires", adapter: :ActiveRecord, mysql: true, broken: ::Gem::Version.new(RUBY_ENGINE_VERSION) >= ::Gem::Version.new('3.0.0') do
2
2
  let(:t_res) { 0.125 }
3
3
  let(:min_ttl) { t_res }
4
4
  use_timecop
@@ -10,6 +10,7 @@ describe "standard_activerecord_with_expires", adapter: :ActiveRecord, mysql: tr
10
10
  adapter: (defined?(JRUBY_VERSION) ? 'jdbcmysql' : 'mysql2'),
11
11
  host: mysql_host,
12
12
  port: mysql_port,
13
+ socket: mysql_socket,
13
14
  database: mysql_database1,
14
15
  username: mysql_username,
15
16
  password: mysql_password
@@ -1,6 +1,6 @@
1
1
  require_relative '../memcached_helper.rb'
2
2
 
3
- describe 'adapter_activesupportcache', adapter: :ActiveSupportCache do
3
+ describe 'adapter_activesupportcache', adapter: :ActiveSupportCache, broken: ::Gem::Version.new(RUBY_ENGINE_VERSION) >= ::Gem::Version.new('3.0.0') do
4
4
  before :all do
5
5
  require 'active_support'
6
6
  require 'active_support/cache/moneta_store'
@@ -1,6 +1,6 @@
1
1
  require_relative '../memcached_helper'
2
2
 
3
- describe 'adapter_activesupportcache_with_default_expires', adapter: :ActiveSupportCache do
3
+ describe 'adapter_activesupportcache_with_default_expires', adapter: :ActiveSupportCache, broken: ::Gem::Version.new(RUBY_ENGINE_VERSION) >= ::Gem::Version.new('3.0.0') do
4
4
  before :all do
5
5
  require 'active_support'
6
6
  require 'active_support/cache/moneta_store'
@@ -1,4 +1,4 @@
1
- describe 'standard_activesupportcache' do
1
+ describe 'standard_activesupportcache', adapter: :ActiveSupportCache, broken: ::Gem::Version.new(RUBY_ENGINE_VERSION) >= ::Gem::Version.new('3.0.0') do
2
2
  before :context do
3
3
  require 'active_support'
4
4
  end
@@ -1,6 +1,6 @@
1
1
  require_relative './helper.rb'
2
2
 
3
- describe 'adapter_cassandra', retry: 3, adapter: :Cassandra do
3
+ describe 'adapter_cassandra', retry: 3, adapter: :Cassandra, unsupported: RUBY_ENGINE == 'ruby' && Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('3.0.0') do
4
4
  let(:t_res) { 1 }
5
5
  let(:min_ttl) { 2 }
6
6
 
@@ -1,6 +1,6 @@
1
1
  require_relative './helper.rb'
2
2
 
3
- describe 'adapter_cassandra_with_default_expires', isolate: true, retry: 3, adapter: :Cassandra do
3
+ describe 'adapter_cassandra_with_default_expires', isolate: true, retry: 3, adapter: :Cassandra, unsupported: RUBY_ENGINE == 'ruby' && Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('3.0.0') do
4
4
  let(:t_res) { 1 }
5
5
  let(:min_ttl) { 2 }
6
6
 
@@ -1,6 +1,6 @@
1
1
  require_relative './helper.rb'
2
2
 
3
- describe "standard_cassandra", retry: 3, adapter: :Cassandra do
3
+ describe "standard_cassandra", retry: 3, adapter: :Cassandra, unsupported: RUBY_ENGINE == 'ruby' && Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('3.0.0') do
4
4
  let(:t_res) { 1 }
5
5
  let(:min_ttl) { 2 }
6
6
 
@@ -1,4 +1,4 @@
1
- describe 'adapter_datamapper', broken: defined?(JRUBY_VERSION), adapter: :DataMapper, mysql: true do
1
+ describe 'adapter_datamapper', unsupported: defined?(JRUBY_VERSION) || RUBY_ENGINE == 'ruby' && Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('3.0.0'), adapter: :DataMapper, mysql: true do
2
2
  before :all do
3
3
  require 'dm-core'
4
4
 
@@ -6,9 +6,13 @@ describe 'adapter_datamapper', broken: defined?(JRUBY_VERSION), adapter: :DataMa
6
6
  DataMapper.setup(:default, adapter: :in_memory)
7
7
  end
8
8
 
9
+ let :database_uri do
10
+ "mysql://#{mysql_username}:#{mysql_password}@#{mysql_host}:#{mysql_port}/#{mysql_database1}" + (mysql_socket ? "?socket=#{mysql_socket}" : "")
11
+ end
12
+
9
13
  moneta_build do
10
14
  Moneta::Adapters::DataMapper.new(
11
- setup: "mysql://#{mysql_username}:#{mysql_password}@#{mysql_host}:#{mysql_port}/#{mysql_database1}",
15
+ setup: database_uri,
12
16
  table: "adapter_datamapper"
13
17
  )
14
18
  end
@@ -17,14 +21,14 @@ describe 'adapter_datamapper', broken: defined?(JRUBY_VERSION), adapter: :DataMa
17
21
 
18
22
  it 'does not cross contaminate when storing' do
19
23
  first = Moneta::Adapters::DataMapper.new(
20
- setup: "mysql://#{mysql_username}:#{mysql_password}@#{mysql_host}:#{mysql_port}/#{mysql_database1}",
24
+ setup: database_uri,
21
25
  table: "datamapper_first"
22
26
  )
23
27
  first.clear
24
28
 
25
29
  second = Moneta::Adapters::DataMapper.new(
26
30
  repository: :sample,
27
- setup: "mysql://#{mysql_username}:#{mysql_password}@#{mysql_host}:#{mysql_port}/#{mysql_database1}",
31
+ setup: database_uri,
28
32
  table: "datamapper_second"
29
33
  )
30
34
  second.clear
@@ -38,14 +42,14 @@ describe 'adapter_datamapper', broken: defined?(JRUBY_VERSION), adapter: :DataMa
38
42
 
39
43
  it 'does not cross contaminate when deleting' do
40
44
  first = Moneta::Adapters::DataMapper.new(
41
- setup: "mysql://#{mysql_username}:#{mysql_password}@#{mysql_host}:#{mysql_port}/#{mysql_database1}",
45
+ setup: database_uri,
42
46
  table: "datamapper_first"
43
47
  )
44
48
  first.clear
45
49
 
46
50
  second = Moneta::Adapters::DataMapper.new(
47
51
  repository: :sample,
48
- setup: "mysql://#{mysql_username}:#{mysql_password}@#{mysql_host}:#{mysql_port}/#{mysql_database1}",
52
+ setup: database_uri,
49
53
  table: "datamapper_second"
50
54
  )
51
55
  second.clear
@@ -1,4 +1,4 @@
1
- describe "standard_datamapper", broken: defined?(JRUBY_VERSION), adapter: :DataMapper, mysql: true do
1
+ describe "standard_datamapper", unsupported: defined?(JRUBY_VERSION) || RUBY_ENGINE == 'ruby' && Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('3.0.0'), adapter: :DataMapper, mysql: true do
2
2
  before :all do
3
3
  require 'dm-core'
4
4
 
@@ -8,7 +8,7 @@ describe "standard_datamapper", broken: defined?(JRUBY_VERSION), adapter: :DataM
8
8
 
9
9
  moneta_store :DataMapper do
10
10
  {
11
- setup: "mysql://#{mysql_username}:#{mysql_password}@#{mysql_host}:#{mysql_port}/#{mysql_database1}",
11
+ setup: "mysql://#{mysql_username}:#{mysql_password}@#{mysql_host}:#{mysql_port}/#{mysql_database1}" + (mysql_socket ? "?socket=#{mysql_socket}" : ""),
12
12
  table: "simple_datamapper"
13
13
  }
14
14
  end
@@ -1,4 +1,4 @@
1
- describe "standard_datamapper_with_expires", broken: defined?(JRUBY_VERSION), adapter: :DataMapper, mysql: true do
1
+ describe "standard_datamapper_with_expires", unsupported: defined?(JRUBY_VERSION) || RUBY_ENGINE == 'ruby' && Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('3.0.0'), adapter: :DataMapper, mysql: true do
2
2
  let(:t_res) { 0.125 }
3
3
  let(:min_ttl) { t_res }
4
4
  use_timecop
@@ -12,7 +12,7 @@ describe "standard_datamapper_with_expires", broken: defined?(JRUBY_VERSION), ad
12
12
 
13
13
  moneta_store :DataMapper do
14
14
  {
15
- setup: "mysql://#{mysql_username}:#{mysql_password}@#{mysql_host}:#{mysql_port}/#{mysql_database1}",
15
+ setup: "mysql://#{mysql_username}:#{mysql_password}@#{mysql_host}:#{mysql_port}/#{mysql_database1}" + (mysql_socket ? "?socket=#{mysql_socket}" : ""),
16
16
  table: "simple_datamapper_with_expires",
17
17
  expires: true
18
18
  }
@@ -1,4 +1,4 @@
1
- describe 'standard_datamapper_with_repository', broken: defined?(JRUBY_VERSION), adapter: :DataMapper, mysql: true do
1
+ describe 'standard_datamapper_with_repository', unsupported: defined?(JRUBY_VERSION) || RUBY_ENGINE == 'ruby' && Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('3.0.0'), adapter: :DataMapper, mysql: true do
2
2
  before :all do
3
3
  require 'dm-core'
4
4
 
@@ -9,7 +9,7 @@ describe 'standard_datamapper_with_repository', broken: defined?(JRUBY_VERSION),
9
9
  moneta_store :DataMapper do
10
10
  {
11
11
  repository: :repo,
12
- setup: "mysql://#{mysql_username}:#{mysql_password}@#{mysql_host}:#{mysql_port}/#{mysql_database1}",
12
+ setup: "mysql://#{mysql_username}:#{mysql_password}@#{mysql_host}:#{mysql_port}/#{mysql_database1}" + (mysql_socket ? "?socket=#{mysql_socket}" : ""),
13
13
  table: "simple_datamapper_with_repository"
14
14
  }
15
15
  end
@@ -1,4 +1,9 @@
1
1
  describe 'standard_null', adapter: :Null do
2
2
  moneta_store :Null
3
3
  moneta_specs STANDARD_SPECS.without_increment.without_create.without_store.without_persist
4
+
5
+ it 'works when constructed with a proxy object' do
6
+ store = Moneta.new(:Null, expires: 1)
7
+ expect { store['moneta'] = 'test' }.not_to raise_error
8
+ end
4
9
  end
@@ -4,9 +4,12 @@ RSpec.shared_context :sequel do
4
4
  if defined?(JRUBY_VERSION)
5
5
  uri = "jdbc:mysql://#{mysql_host}:#{mysql_port}/#{database}?user=#{mysql_username}&useSSL=false"
6
6
  uri += "&password=#{mysql_password}" if mysql_password
7
+ uri += "&socket=#{mysql_socket}" if mysql_socket
7
8
  uri
8
9
  else
9
- "mysql2://#{mysql_username}:#{mysql_password}@#{mysql_host}:#{mysql_port}/#{database}"
10
+ uri = "mysql2://#{mysql_username}:#{mysql_password}@#{mysql_host}:#{mysql_port}/#{database}"
11
+ uri += "?socket=#{mysql_socket}" if mysql_socket
12
+ uri
10
13
  end
11
14
  end
12
15
 
@@ -14,8 +14,8 @@ describe 'enumerable', proxy: :Enumerable do
14
14
  end
15
15
 
16
16
  it 'allows enumeration over key-value pairs' do
17
- moneta_property_of(keys: 100, values: 100) do |keys:, values:|
18
- pairs = keys.zip(values)
17
+ moneta_property_of(keys: 100, values: 100) do |m|
18
+ pairs = m.keys.zip(m.values)
19
19
  store.merge!(pairs)
20
20
  expect(store.to_a).to contain_exactly(*pairs)
21
21
  expect(store.each.to_a).to contain_exactly(*pairs)
@@ -24,7 +24,7 @@ class MonetaStoreTest < ActionDispatch::IntegrationTest
24
24
  end
25
25
 
26
26
  def get_session_id
27
- render plain: "#{request.cookies['_session_id']}"
27
+ render plain: request.cookies['_session_id'].to_s
28
28
  end
29
29
 
30
30
  def call_reset_session
@@ -60,13 +60,13 @@ class MonetaStoreTest < ActionDispatch::IntegrationTest
60
60
  get '/set_session_value'
61
61
  assert_response :success
62
62
  assert cookies['_session_id']
63
- session_cookie = cookies.send(:hash_for)['_session_id']
63
+ session_cookie = cookies.to_hash['_session_id']
64
64
 
65
65
  get '/call_reset_session'
66
66
  assert_response :success
67
67
  assert_not_equal [], headers['Set-Cookie']
68
68
 
69
- cookies << session_cookie # replace our new session_id with our old, pre-reset session_id
69
+ cookies.merge(session_cookie) # replace our new session_id with our old, pre-reset session_id
70
70
 
71
71
  get '/get_session_value'
72
72
  assert_response :success
@@ -157,7 +157,7 @@ class MonetaStoreTest < ActionDispatch::IntegrationTest
157
157
 
158
158
  reset!
159
159
 
160
- get '/set_session_value', params: {_session_id: session_id}
160
+ get "/set_session_value?_session_id=#{session_id}"
161
161
  assert_response :success
162
162
  assert_not_equal session_id, cookies['_session_id']
163
163
  end
@@ -174,7 +174,7 @@ class MonetaStoreTest < ActionDispatch::IntegrationTest
174
174
  ActiveSupport::Dependencies.autoload_paths << path
175
175
  yield
176
176
  ensure
177
- ActiveSupport::Dependencies.autoload_paths.reject! {|p| p == path}
177
+ ActiveSupport::Dependencies.autoload_paths.reject! { |p| p == path }
178
178
  ActiveSupport::Dependencies.clear
179
179
  end
180
180
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: moneta
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.0
4
+ version: 1.5.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Mendler
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2022-04-06 00:00:00.000000000 Z
14
+ date: 2022-11-10 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: multi_json
@@ -446,9 +446,9 @@ licenses:
446
446
  - MIT
447
447
  metadata:
448
448
  bug_tracker_uri: https://github.com/moneta-rb/moneta/issues
449
- changelog_uri: https://github.com/moneta-rb/moneta/blob/v1.5.0/CHANGES
450
- documentation_uri: https://www.rubydoc.info/gems/moneta/1.5.0
451
- source_code_uri: https://github.com/moneta-rb/moneta/tree/v1.5.0
449
+ changelog_uri: https://github.com/moneta-rb/moneta/blob/v1.5.2/CHANGES
450
+ documentation_uri: https://www.rubydoc.info/gems/moneta/1.5.2
451
+ source_code_uri: https://github.com/moneta-rb/moneta/tree/v1.5.2
452
452
  post_install_message:
453
453
  rdoc_options: []
454
454
  require_paths:
@@ -464,7 +464,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
464
464
  - !ruby/object:Gem::Version
465
465
  version: '0'
466
466
  requirements: []
467
- rubygems_version: 3.3.8
467
+ rubygems_version: 3.3.25
468
468
  signing_key:
469
469
  specification_version: 4
470
470
  summary: A unified interface to key/value stores, including Redis, Memcached, TokyoCabinet,