moneta 1.2.0 → 1.2.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4e697b98dafd89667bc720317d1e740691f4504cf6b7a33939d14251f2841fe3
4
- data.tar.gz: 13eede9fc91b2379921f28798b6bac79de69527682f208042345b5fe331bd32d
3
+ metadata.gz: 535578909c47f29047f67d577e053809a637f77ea8ba2dde7920198f8b08ac49
4
+ data.tar.gz: 275edd79995139f4918749d01ccdf8129748ea96e1ba4302716dd7cb1ed57bf9
5
5
  SHA512:
6
- metadata.gz: c1c9acbe14d38a5a300a8eb478225c8da317f2c6596b51e2421d5243aa6cd13020639e31594f03a1c43b6c537603402983cd5ca2a6deb900ac34cf5db3b99992
7
- data.tar.gz: 614bfcb466639b2d348e8f1bd29d732a1d57489e3a6e4d292ae2f4ab8e3f385c878b0c3f890ae1f2fb4f684e9c969e71ecd2a393d9e848345c63b7d9b0818f8b
6
+ metadata.gz: c07c093306f66138db9db041a15103420fdd0e5fef93ca429098de02a732055d441c0968570704ba39dcb08608b7dbfa12b5cd5797e257df1c8be28a7b3b028d
7
+ data.tar.gz: a654005281162398bf492fd7fa3e3c59ee40f675d6a187579d4cbfcb0bfbd14e0a78a9f9bb3227e5c64c02e4c97e60bb9b39075457803882aeaa3d585b0e9a51
data/CHANGES CHANGED
@@ -1,3 +1,7 @@
1
+ 1.2.1
2
+
3
+ * Transformer - fix :escape transformer deserialize implementation (#168)
4
+
1
5
  1.2.0
2
6
 
3
7
  * Adapters::Sequel - fix for compatibility with new version of JDBC SQLite
@@ -1,5 +1,5 @@
1
1
  Adrian Madrid <aemadrid@gmail.com>
2
- Alastair Pharo <asppsa@gmail.com>
2
+ 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>
@@ -24,6 +24,7 @@ Marek Skrobacki <skrobul@skrobul.com>
24
24
  Mauro Asprea <mauroasprea@gmail.com>
25
25
  Nathaniel Bibler <git@nathanielbibler.com>
26
26
  Olle Jonsson <olle.jonsson@gmail.com>
27
+ Orien Madgwick <_@orien.io>
27
28
  Patrik Rak <patrik@raxoft.cz>
28
29
  Piotr Murach <pmurach@gmail.com>
29
30
  Potapov Sergey <blake131313@gmail.com>
@@ -5,11 +5,11 @@ module Moneta
5
5
  extend self
6
6
 
7
7
  def escape(value)
8
- value.gsub(/[^a-zA-Z0-9_-]+/) { '%' + $&.unpack('H2' * $&.bytesize).join('%').upcase }
8
+ value.gsub(/[^a-zA-Z0-9_-]+/) { |match| '%' + match.unpack('H2' * match.bytesize).join('%').upcase }
9
9
  end
10
10
 
11
11
  def unescape(value)
12
- value.gsub(/((?:%[0-9a-fA-F]{2})+)/) { |matches| [matches[1].delete('%')].pack('H*') }
12
+ value.gsub(/(?:%[0-9a-fA-F]{2})+/) { |match| [match.delete('%')].pack('H*') }
13
13
  end
14
14
 
15
15
  def hmacverify(value, secret)
@@ -1,5 +1,5 @@
1
1
  module Moneta
2
2
  # Moneta version number
3
3
  # @api public
4
- VERSION = '1.2.0'.freeze
4
+ VERSION = '1.2.1'.freeze
5
5
  end
@@ -13,10 +13,18 @@ Gem::Specification.new do |s|
13
13
  s.files = `git ls-files`.split("\n")
14
14
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
15
15
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
16
- s.homepage = 'http://github.com/moneta-rb/moneta'
16
+ s.homepage = 'https://github.com/moneta-rb/moneta'
17
17
  s.licenses = %w(MIT)
18
18
  s.require_paths = %w(lib)
19
19
  s.summary = %{A unified interface to key/value stores, including Redis, Memcached, TokyoCabinet, ActiveRecord and many more}
20
+
21
+ s.metadata = {
22
+ 'bug_tracker_uri' => 'https://github.com/moneta-rb/moneta/issues',
23
+ 'changelog_uri' => "https://github.com/moneta-rb/moneta/blob/v#{s.version}/CHANGES",
24
+ 'documentation_uri' => "https://www.rubydoc.info/gems/moneta/#{s.version}",
25
+ 'source_code_uri' => "https://github.com/moneta-rb/moneta/tree/v#{s.version}",
26
+ }
27
+
20
28
  s.required_ruby_version = '>= 2.2.2'
21
29
 
22
30
  s.add_development_dependency 'rspec', '~> 3.0'
@@ -2,6 +2,7 @@
2
2
  git log --format='%aN <%aE>' |\
3
3
  sed -e 's/hiddenbek/Scott Wadden/g' |\
4
4
  sed -e 's/Asmod4n/Hendrik Beskow/' |\
5
+ sed -e 's/asppsa@gmail.com/me@asph.dev/' |\
5
6
  grep -v 'hannes.georg@xing.com\|spotapov\|yehuda-katzs-mac\|wycats ' |\
6
7
  sort -u | sort > CONTRIBUTORS
7
8
 
@@ -1,11 +1,26 @@
1
1
  shared_examples :transform_value do
2
- it 'allows to bypass transformer with :raw' do
3
- store['key'] = 'value'
4
- load_value(store.load('key', raw: true)).should == 'value'
2
+ describe 'with the :raw option' do
3
+ it 'can load without transforming the value' do
4
+ moneta_property_of(values: 1).check do |values:|
5
+ store['key'] = values[0]
6
+ load_value(store.load('key', raw: true)).should == values[0]
7
+ end
8
+ end
9
+
10
+ it 'can store without transforming the value' do
11
+ moneta_property_of(values: 1).check do |values:|
12
+ store['key'] = values[0]
13
+ store.store('key', store.load('key', raw: true), raw: true)
14
+ store.load('key').should == values[0]
15
+ end
16
+ end
5
17
 
6
- store.store('key', 'value', raw: true)
7
- store.load('key', raw: true).should == 'value'
8
- store.delete('key', raw: true).should == 'value'
18
+ it 'can delete without transforming the value' do
19
+ moneta_property_of(values: 1).check do |values:|
20
+ store['key'] = values[0]
21
+ load_value(store.delete('key', raw: true)).should == values[0]
22
+ end
23
+ end
9
24
  end
10
25
 
11
26
  it 'allows to bypass transformer with raw syntactic sugar' do
@@ -20,25 +35,4 @@ shared_examples :transform_value do
20
35
  store.raw['key'] = 'value2'
21
36
  store.raw['key'].should == 'value2'
22
37
  end
23
-
24
- it 'returns unmarshalled value' do
25
- store.store('key', 'unmarshalled value', raw: true)
26
- store.load('key', raw: true).should == 'unmarshalled value'
27
- end
28
-
29
- it 'might raise exception on invalid value' do
30
- store.store('key', 'unmarshalled value', raw: true)
31
-
32
- begin
33
- store['key'].should == load_value('unmarshalled value')
34
- store.delete('key').should == load_value('unmarshalled value')
35
- rescue Exception => ex
36
- expect do
37
- store['key']
38
- end.to raise_error
39
- expect do
40
- store.delete('key')
41
- end.to raise_error
42
- end
43
- end
44
38
  end
@@ -13,7 +13,6 @@ require 'timecop'
13
13
 
14
14
  class MonetaParallelFormatter < RSpec::Core::Formatters::BaseTextFormatter
15
15
  def start(*args)
16
-
17
16
  output.puts colorise_summary("STARTING #{ARGV.join(' ')}")
18
17
  @stopped = false
19
18
  @passed_count = 0
@@ -59,12 +58,12 @@ class MonetaSpecs
59
58
  'integer' => :integer,
60
59
  'float' => :float,
61
60
  'boolean' => :boolean,
62
- 'string' => proc{ sized(range 5, 10){ string(:alnum) } },
63
- 'path' => proc{ array(range 2, 3){ sized(range 5, 10){ string(:alpha) } }.join('/') },
61
+ 'string' => proc { sized(range(5, 10)) { string(:alnum) } },
62
+ 'path' => proc { array(range(2, 3)) { sized(range(5, 10)) { string(:alpha) } }.join('/') },
64
63
  'binary' => [:string, :cntrl],
65
- 'object' => proc{ choose Value.new(:objkey1), Value.new(:objkey2) },
66
- 'hash' => proc{ dict(2){ sized(range 5, 10){ [string(:alnum), string(:alnum)] } } }
67
- }
64
+ 'object' => proc { choose Value.new(:objkey1), Value.new(:objkey2) },
65
+ 'hash' => proc { dict(2) { sized(range(5, 10)) { [string(:alnum), string(:alnum)] } } }
66
+ }.freeze
68
67
 
69
68
  VALUES = {
70
69
  'nil' => [:literal, nil],
@@ -73,10 +72,10 @@ class MonetaSpecs
73
72
  'boolean' => :boolean,
74
73
  'string' => [:string, :alnum],
75
74
  'binary' => [:string, :cntrl],
76
- 'object' => proc{ choose Value.new(:objval1), Value.new(:objval2) },
77
- 'hash' => proc{ dict{ [string(:alnum), array(2){ choose(string(:alnum), integer, dict{ [string(:alnum), integer] }) }] } },
78
- 'smallhash' => proc{ dict(2){ sized(range 5, 10){ [string(:alnum), string(:alnum)] } } }
79
- }
75
+ 'object' => proc { choose Value.new(:objval1), Value.new(:objval2) },
76
+ 'hash' => proc { dict { [string(:alnum), array(2) { choose(string(:alnum), integer, dict { [string(:alnum), integer] }) }] } },
77
+ 'smallhash' => proc { dict(2) { sized(range(5, 10)) { [string(:alnum), string(:alnum)] } } }
78
+ }.freeze
80
79
 
81
80
  attr_reader :key, :value, :specs, :features
82
81
 
@@ -88,23 +87,23 @@ class MonetaSpecs
88
87
  end
89
88
 
90
89
  def new(options)
91
- self.class.new({specs: specs, key: key, value: value}.merge(options))
90
+ self.class.new({ specs: specs, key: key, value: value }.merge(options))
92
91
  end
93
92
 
94
93
  def with_keys(*keys)
95
- new(key: self.key | keys.map(&:to_s))
94
+ new(key: key | keys.map(&:to_s))
96
95
  end
97
96
 
98
97
  def without_keys(*keys)
99
- new(key: self.key - keys.map(&:to_s))
98
+ new(key: key - keys.map(&:to_s))
100
99
  end
101
100
 
102
101
  def with_values(*values)
103
- new(value: self.value | values.map(&:to_s))
102
+ new(value: value | values.map(&:to_s))
104
103
  end
105
104
 
106
105
  def without_values(*values)
107
- new(value: self.value - values.map(&:to_s))
106
+ new(value: value - values.map(&:to_s))
108
107
  end
109
108
 
110
109
  def without_keys_or_values(*types)
@@ -209,53 +208,55 @@ end
209
208
 
210
209
  ADAPTER_SPECS = MonetaSpecs.new(
211
210
  specs: [:null, :store, :returndifferent,
212
- :increment, :concurrent_increment, :concurrent_create, :persist, :multiprocess,
213
- :create, :features, :store_large, :not_each_key],
211
+ :increment, :concurrent_increment, :concurrent_create, :persist, :multiprocess,
212
+ :create, :features, :store_large, :not_each_key],
214
213
  key: %w(string path),
215
- value: %w(string path binary))
214
+ value: %w(string path binary)
215
+ )
216
216
  STANDARD_SPECS = MonetaSpecs.new(
217
217
  specs: [:null, :store, :returndifferent,
218
- :marshallable_key, :marshallable_value, :transform_value, :increment,
219
- :concurrent_increment, :concurrent_create, :persist, :multiprocess, :create,
220
- :features, :store_large, :not_each_key])
218
+ :marshallable_key, :marshallable_value, :transform_value, :increment,
219
+ :concurrent_increment, :concurrent_create, :persist, :multiprocess, :create,
220
+ :features, :store_large, :not_each_key]
221
+ )
221
222
  TRANSFORMER_SPECS = MonetaSpecs.new(
222
223
  specs: [:null, :store, :returndifferent,
223
- :transform_value, :increment, :create, :features, :store_large,
224
- :not_each_key])
224
+ :transform_value, :increment, :create, :features, :store_large,
225
+ :not_each_key]
226
+ )
225
227
 
226
228
  module MonetaHelpers
227
229
  module ClassMethods
228
-
229
- def moneta_store store_name, options={}, &block
230
- name = self.description
230
+ def moneta_store(store_name, options = {}, &block)
231
+ name = description
231
232
  builder = proc do
232
233
  if block
233
234
  options = instance_exec(&block)
234
235
  end
235
236
 
236
- Moneta.new(store_name, options.merge(logger: {file: File.join(tempdir, "#{name}.log")}))
237
+ Moneta.new(store_name, options.merge(logger: { file: File.join(tempdir, "#{name}.log") }))
237
238
  end
238
239
 
239
240
  include_context :setup_moneta_store, builder
240
241
  end
241
242
 
242
- def moneta_build &block
243
+ def moneta_build(&block)
243
244
  include_context :setup_moneta_store, block
244
245
  end
245
246
 
246
- def moneta_loader &block
247
+ def moneta_loader(&block)
247
248
  before do
248
249
  @moneta_value_loader = block
249
250
  end
250
251
  end
251
252
 
252
- def moneta_specs specs
253
- let(:features){ specs.features }
253
+ def moneta_specs(specs)
254
+ let(:features) { specs.features }
254
255
  let(:keys_meta) do
255
- [:branch, *specs.key.map{ |k| MonetaSpecs::KEYS[k] }.compact]
256
+ [:branch, *specs.key.map { |k| MonetaSpecs::KEYS[k] }.compact]
256
257
  end
257
258
  let(:values_meta) do
258
- [:branch, *specs.value.map{ |k| MonetaSpecs::VALUES[k] }.compact]
259
+ [:branch, *specs.value.map { |k| MonetaSpecs::VALUES[k] }.compact]
259
260
  end
260
261
 
261
262
  # Used by tests that rely on MySQL. These env vars can be used if you
@@ -298,7 +299,7 @@ module MonetaHelpers
298
299
  end
299
300
 
300
301
  def use_timecop
301
- before{ @timecop = true }
302
+ before { @timecop = true }
302
303
  end
303
304
  end
304
305
 
@@ -315,7 +316,7 @@ module MonetaHelpers
315
316
  @store ||= new_store
316
317
  end
317
318
 
318
- def load_value value
319
+ def load_value(value)
319
320
  if @moneta_value_loader
320
321
  @moneta_value_loader.call value
321
322
  else
@@ -341,9 +342,9 @@ module MonetaHelpers
341
342
  value_values = values.times.map { call(values_meta) }
342
343
  guard value_values.uniq.length == value_values.length
343
344
 
344
- [[:keys, key_values], [:values, value_values]].
345
- reject { |key, value| value.empty? }.
346
- to_h
345
+ [[:keys, key_values], [:values, value_values]]
346
+ .reject { |_key, value| value.empty? }
347
+ .to_h
347
348
  end
348
349
  end
349
350
 
@@ -361,8 +362,8 @@ end
361
362
  RSpec.configure do |config|
362
363
  config.verbose_retry = true
363
364
  config.color = true
364
- #config.tty = true
365
- #config.formatter = ENV['PARALLEL_TESTS'] ? MonetaParallelFormatter : :progress
365
+ # config.tty = true
366
+ # config.formatter = ENV['PARALLEL_TESTS'] ? MonetaParallelFormatter : :progress
366
367
  config.silence_filter_announcements = true if ENV['PARALLEL_TESTS']
367
368
 
368
369
  # Allow "should" syntax as well as "expect"
@@ -379,9 +380,9 @@ RSpec::Expectations.configuration.on_potential_false_positives = :nothing
379
380
  # Disable jruby stdout pollution by memcached
380
381
  if defined?(JRUBY_VERSION)
381
382
  require 'java'
382
- properties = java.lang.System.getProperties();
383
- properties.put('net.spy.log.LoggerImpl', 'net.spy.memcached.compat.log.SunLogger');
384
- java.lang.System.setProperties(properties);
383
+ properties = java.lang.System.getProperties
384
+ properties.put('net.spy.log.LoggerImpl', 'net.spy.memcached.compat.log.SunLogger')
385
+ java.lang.System.setProperties(properties)
385
386
  java.util.logging.Logger.getLogger('').setLevel(java.util.logging.Level::OFF)
386
387
  end
387
388
 
@@ -404,7 +405,6 @@ class Value
404
405
  end
405
406
  end
406
407
 
407
-
408
408
  def marshal_error
409
409
  # HACK: Marshalling structs in rubinius without class name throws
410
410
  # NoMethodError (to_sym). TODO: Create an issue for rubinius!
@@ -415,7 +415,6 @@ def marshal_error
415
415
  end
416
416
  end
417
417
 
418
-
419
418
  RSpec.shared_context :setup_moneta_store do |builder|
420
419
  before do
421
420
  @moneta_store_builder = builder
@@ -451,4 +450,4 @@ RSpec.shared_examples :at_usec do |usec|
451
450
  end
452
451
  end
453
452
 
454
- Dir['./spec/features/*.rb'].each{ |rb| require rb }
453
+ Dir['./spec/features/*.rb'].each { |rb| require rb }
@@ -1,15 +1,19 @@
1
1
  describe 'transformer_marshal_escape', proxy: :Transformer do
2
2
  moneta_build do
3
3
  Moneta.build do
4
- use :Transformer, key: [:marshal, :escape], value: :marshal
4
+ use :Transformer, key: [:marshal, :escape], value: [:marshal, :escape]
5
5
  adapter :Memory
6
6
  end
7
7
  end
8
8
 
9
+ moneta_loader do |value|
10
+ ::Marshal.load(::URI.decode_www_form_component(value))
11
+ end
12
+
9
13
  moneta_specs STANDARD_SPECS.without_persist
10
14
 
11
- it 'compile transformer class' do
15
+ it 'compiles the transformer class' do
12
16
  store.should_not be_nil
13
- Moneta::Transformer::MarshalEscapeKeyMarshalValue.should_not be_nil
17
+ Moneta::Transformer::MarshalEscapeKeyMarshalEscapeValue.should_not be_nil
14
18
  end
15
19
  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.2.0
4
+ version: 1.2.1
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: 2019-10-15 00:00:00.000000000 Z
14
+ date: 2019-11-08 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: rspec
@@ -438,10 +438,14 @@ files:
438
438
  - spec/restserver.rb
439
439
  - test/action_dispatch/fixtures/session_autoload_test/foo.rb
440
440
  - test/action_dispatch/session_moneta_store_test.rb
441
- homepage: http://github.com/moneta-rb/moneta
441
+ homepage: https://github.com/moneta-rb/moneta
442
442
  licenses:
443
443
  - MIT
444
- metadata: {}
444
+ metadata:
445
+ bug_tracker_uri: https://github.com/moneta-rb/moneta/issues
446
+ changelog_uri: https://github.com/moneta-rb/moneta/blob/v1.2.1/CHANGES
447
+ documentation_uri: https://www.rubydoc.info/gems/moneta/1.2.1
448
+ source_code_uri: https://github.com/moneta-rb/moneta/tree/v1.2.1
445
449
  post_install_message:
446
450
  rdoc_options: []
447
451
  require_paths: