redis_counters 1.4.0 → 1.5.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 21ad3dea600e503c5c78e5f7b1c2c44df42b9c6c
4
- data.tar.gz: daa6aaaf6b4f4e9e4900d019c5bbbb9c0d675936
2
+ SHA256:
3
+ metadata.gz: ee8632f37abf5f884a41073d7da1d6af0d03a42124aa5667bcd4c867872f4a23
4
+ data.tar.gz: 5999cedae855634e290a58b1bc17fbbb5ab596d57ff48a6847c8e85bda013809
5
5
  SHA512:
6
- metadata.gz: 4a59daf0d09208f4779758224ae19e03cc54dbea4623c4dac78a9aaf334a921513040c5cf60317f3f16528399b011b3faa8a759c2f21bdf02c8061a2593f9631
7
- data.tar.gz: 9afa7121c971ae69a1c5c2b868f42f871d6d28eef44394f7be8e52946b6e6fcfe8e7b35d831668debf33415b259ea7aad6bb14d494123d3522c9e8c7fdc0e022
6
+ metadata.gz: 800be8089bfe3444442ac06c0c49c656aa73bcfc06282de92949a89dfc40035198ba472ae8b7d75ff9cfde680a04af96e1e97f7497b601dde17e6205fb4d4243
7
+ data.tar.gz: ec6cd875271549cff1ebce5b0febe55d4901c8f956aa5e436a3d427ec3ac83096058d87912b33e7162e8da475db713d8b1468bbe5c7675bb2d0f156810f7259b
data/.drone.yml ADDED
@@ -0,0 +1,64 @@
1
+ name: build
2
+
3
+ kind: pipeline
4
+ type: docker
5
+
6
+ volumes:
7
+ - name: rubygems
8
+ host:
9
+ path: /home/data/drone/rubygems
10
+ - name: images
11
+ host:
12
+ path: /home/data/drone/images
13
+ - name: bundle
14
+ host:
15
+ path: /home/data/drone/gems
16
+ - name: keys
17
+ host:
18
+ path: /home/data/drone/key_cache
19
+
20
+ spec_step_common: &spec_step_common
21
+ image: abakpress/dind-testing:1.0.3
22
+ pull: if-not-exists
23
+ privileged: true
24
+ volumes:
25
+ - name: images
26
+ path: /images
27
+ - name: bundle
28
+ path: /bundle
29
+ - name: keys
30
+ path: /ssh_keys
31
+ commands:
32
+ - prepare-build
33
+
34
+ - fetch-images
35
+ --image whilp/ssh-agent
36
+ --image abakpress/ruby-app:$RUBY_IMAGE_TAG
37
+ --image redis:$REDIS_IMAGE_TAG
38
+
39
+ - dip ssh add -T -v /ssh_keys -k /ssh_keys/id_rsa
40
+ - dip provision
41
+ - dip rspec
42
+
43
+ steps:
44
+ - name: Tests Ruby 2.4
45
+ environment:
46
+ COMPOSE_FILE_EXT: drone
47
+ DOCKER_RUBY_VERSION: 2.4
48
+ RUBY_IMAGE_TAG: 2.4-latest
49
+ REDIS_IMAGE_TAG: 4-alpine
50
+ RAILS_ENV: test
51
+ <<: *spec_step_common
52
+
53
+ - name: release
54
+ image: abakpress/gem-publication:latest
55
+ pull: if-not-exists
56
+ when:
57
+ event: push
58
+ branch: master
59
+ status: success
60
+ volumes:
61
+ - name: rubygems
62
+ path: /root/.gem
63
+ commands:
64
+ - release-gem --public
data/.rspec ADDED
@@ -0,0 +1,5 @@
1
+ --color
2
+ --tty
3
+ --format progress
4
+ --order random
5
+ --backtrace
data/Appraisals ADDED
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+ appraise 'rails4.2' do
3
+ gem 'activesupport', '~> 4.2.0'
4
+ end
data/CHANGELOG.md CHANGED
@@ -1,42 +1,67 @@
1
+ # v1.5.2
1
2
 
2
- #### [Current]
3
- * 2016-07-21 [4f56a74](../../commit/4f56a74) - __(Stanislav Gordanov)__ Release 1.4.0
4
- * 2016-07-20 [e6be297](../../commit/e6be297) - __(Stanislav Gordanov)__ feat: переместит значение инкремента в начало массива данных
5
- * 2015-07-26 [e4771c5](../../commit/e4771c5) - __(Artem Napolskih)__ Update README.md
6
- * 2015-02-19 [c86a1aa](../../commit/c86a1aa) - __(bibendi)__ commit changelog after generate it
7
- * 2015-02-19 [b5ec9f8](../../commit/b5ec9f8) - __(bibendi)__ change releasing tasks to upload on rubygems
8
-
9
- #### v1.2.0
10
- * 2014-11-10 [be642ce](../../commit/be642ce) - __(Artem Napolskih)__ Release 1.2.0
11
- * 2014-11-10 [6257dc2](../../commit/6257dc2) - __(Artem Napolskih)__ feature(hash_counter): added float mode
12
- * 2014-10-17 [48deb40](../../commit/48deb40) - __(Artem Napolskih)__ feature(unique_values_list): introduced a list of unique values to expiry of the members
13
- * 2014-10-17 [e1206b7](../../commit/e1206b7) - __(Artem Napolskih)__ feature(unique_values_list): introduce has_value? method
14
- * 2014-10-17 [cccc2be](../../commit/cccc2be) - __(Artem Napolskih)__ feature(unique_values_list): rename Standard and Fast unique values list to Blocking and NonBlocking respectively
15
- * 2014-10-17 [7521fd8](../../commit/7521fd8) - __(Artem Napolskih)__ chore(specs): reorganize unique lists specs
16
- * 2014-04-23 [94fada3](../../commit/94fada3) - __(Artem Napolskih)__ chore(all): fix circleci badge
17
- * 2013-11-20 [0ae5531](../../commit/0ae5531) - __(Artem Napolskih)__ Release 1.1.0
18
-
19
- #### v1.1.0
20
- * 2013-11-20 [01f12f9](../../commit/01f12f9) - __(Artem Napolskih)__ Release 1.1.0
21
- * 2013-11-20 [3897988](../../commit/3897988) - __(Artem Napolskih)__ refactor(all): back delete_all! methods
22
- * 2013-11-15 [2d1c733](../../commit/2d1c733) - __(Artem Napolskih)__ refactor(all): extract Cluster and Partition classes
23
- * 2013-10-22 [020cc8e](../../commit/020cc8e) - __(Napolskih)__ refactor(all): shared code of clustering and partitioning extracted into module - group_keys -> cluster_keys - shared code of clustering and partitioning extracted into module
24
-
25
- #### v1.0.1
26
- * 2013-10-21 [9b5e13b](../../commit/9b5e13b) - __(Artem Napolskih)__ Release 1.0.1
27
- * 2013-10-21 [bfa328a](../../commit/bfa328a) - __(Artem Napolskih)__ feature(hash_counter): method date when called with a block, now returns the total number of lines
28
- * 2013-10-21 [6d04c95](../../commit/6d04c95) - __(Artem Napolskih)__ Release 1.0.0
29
-
30
- #### v1.0.0
31
- * 2013-10-21 [b5f5344](../../commit/b5f5344) - __(Artem Napolskih)__ Release 1.0.0
32
- * 2013-10-10 [b29eab7](../../commit/b29eab7) - __(Artem Napolskih)__ feature(unique_values_lists): added methods to read and delete data
33
- * 2013-10-10 [67c5200](../../commit/67c5200) - __(Artem Napolskih)__ feature(unique_hash_counter): introduce unique list postfix delimiter
34
- * 2013-10-08 [8a9a2a9](../../commit/8a9a2a9) - __(Artem Napolskih)__ feature(hash_counter): added methods to read and delete data
35
- * 2013-09-13 [f8d037c](../../commit/f8d037c) - __(Artem Napolskih)__ docs(all): documenting
36
-
37
- #### v1.0.0beta1
38
- * 2013-09-13 [43016ec](../../commit/43016ec) - __(Artem Napolskih)__ Release 1.0.0beta1
39
- * 2013-09-12 [0a176fa](../../commit/0a176fa) - __(Artem Napolskih)__ feature(all) introduce key and value delimiters
40
- * 2013-09-12 [addbb40](../../commit/addbb40) - __(Artem Napolskih)__ feature(unique_values_list): fast (non blocking) unique values list added
41
- * 2013-08-23 [897418d](../../commit/897418d) - __(Artem Napolskih)__ Initial commit
42
- * 2013-08-21 [21ed53b](../../commit/21ed53b) - __(napolskih)__ dummy commit
3
+ * 2022-05-05 [9c3a157](../../commit/9c3a157) - __(Igor Prudnikov)__ Release 1.5.2
4
+ * 2022-05-05 [fb05645](../../commit/fb05645) - __(Igor Prudnikov)__ fix: fix hash counter with delimeters containing non-utf8 data
5
+ https://jira.railsc.ru/browse/BPC-20533
6
+
7
+ * 2022-05-05 [e10e51d](../../commit/e10e51d) - __(Igor Prudnikov)__ chore: remove older ruby versions support
8
+
9
+ # v1.5.1
10
+
11
+ * 2021-08-06 [09ed078](../../commit/09ed078) - __(TamarinEA)__ chore: support ruby 2.4 and use redis in test
12
+
13
+ # v1.5.0
14
+
15
+ * 2017-04-21 [d64da5e](../../commit/d64da5e) - __(Pavel Galkin)__ feat: support two value delimiters
16
+ https://jira.railsc.ru/browse/CK-862
17
+
18
+ * 2017-04-21 [a4f458c](../../commit/a4f458c) - __(Pavel Galkin)__ chore: update infrastructure
19
+
20
+ # v1.4.0
21
+
22
+ * 2016-07-20 [e6be297](../../commit/e6be297) - __(Stanislav Gordanov)__ feat: переместит значение инкремента в начало массива данных
23
+ * 2015-07-26 [e4771c5](../../commit/e4771c5) - __(Artem Napolskih)__ Update README.md
24
+ * 2015-02-19 [c86a1aa](../../commit/c86a1aa) - __(bibendi)__ commit changelog after generate it
25
+ * 2015-02-19 [b5ec9f8](../../commit/b5ec9f8) - __(bibendi)__ change releasing tasks to upload on rubygems
26
+
27
+ # v1.2.0
28
+
29
+ * 2014-11-10 [6257dc2](../../commit/6257dc2) - __(Artem Napolskih)__ feature(hash_counter): added float mode
30
+ * 2014-10-17 [48deb40](../../commit/48deb40) - __(Artem Napolskih)__ feature(unique_values_list): introduced a list of unique values to expiry of the members
31
+ * 2014-10-17 [e1206b7](../../commit/e1206b7) - __(Artem Napolskih)__ feature(unique_values_list): introduce has_value? method
32
+ * 2014-10-17 [cccc2be](../../commit/cccc2be) - __(Artem Napolskih)__ feature(unique_values_list): rename Standard and Fast unique values list to Blocking and NonBlocking respectively
33
+ * 2014-10-17 [7521fd8](../../commit/7521fd8) - __(Artem Napolskih)__ chore(specs): reorganize unique lists specs
34
+ * 2014-04-23 [94fada3](../../commit/94fada3) - __(Artem Napolskih)__ chore(all): fix circleci badge
35
+ * 2013-11-20 [0ae5531](../../commit/0ae5531) - __(Artem Napolskih)__ Release 1.1.0
36
+
37
+ # v1.1.0
38
+
39
+ * 2013-11-20 [3897988](../../commit/3897988) - __(Artem Napolskih)__ refactor(all): back delete_all! methods
40
+ * 2013-11-15 [2d1c733](../../commit/2d1c733) - __(Artem Napolskih)__ refactor(all): extract Cluster and Partition classes
41
+ * 2013-10-22 [020cc8e](../../commit/020cc8e) - __(Napolskih)__ refactor(all): shared code of clustering and partitioning extracted into module - group_keys -> cluster_keys - shared code of clustering and partitioning extracted into module
42
+
43
+ # v1.0.1
44
+
45
+ * 2013-10-21 [bfa328a](../../commit/bfa328a) - __(Artem Napolskih)__ feature(hash_counter): method date when called with a block, now returns the total number of lines
46
+ * 2013-10-21 [6d04c95](../../commit/6d04c95) - __(Artem Napolskih)__ Release 1.0.0
47
+ * 2013-10-10 [b29eab7](../../commit/b29eab7) - __(Artem Napolskih)__ feature(unique_values_lists): added methods to read and delete data
48
+ * 2013-10-10 [67c5200](../../commit/67c5200) - __(Artem Napolskih)__ feature(unique_hash_counter): introduce unique list postfix delimiter
49
+ * 2013-10-08 [8a9a2a9](../../commit/8a9a2a9) - __(Artem Napolskih)__ feature(hash_counter): added methods to read and delete data
50
+ * 2013-09-13 [f8d037c](../../commit/f8d037c) - __(Artem Napolskih)__ docs(all): documenting
51
+
52
+ # v1.0.0beta1
53
+
54
+ # v1.0.0
55
+
56
+ * 2013-10-10 [b29eab7](../../commit/b29eab7) - __(Artem Napolskih)__ feature(unique_values_lists): added methods to read and delete data
57
+ * 2013-10-10 [67c5200](../../commit/67c5200) - __(Artem Napolskih)__ feature(unique_hash_counter): introduce unique list postfix delimiter
58
+ * 2013-10-08 [8a9a2a9](../../commit/8a9a2a9) - __(Artem Napolskih)__ feature(hash_counter): added methods to read and delete data
59
+ * 2013-09-13 [f8d037c](../../commit/f8d037c) - __(Artem Napolskih)__ docs(all): documenting
60
+ * 2013-09-12 [0a176fa](../../commit/0a176fa) - __(Artem Napolskih)__ feature(all) introduce key and value delimiters
61
+ * 2013-09-12 [addbb40](../../commit/addbb40) - __(Artem Napolskih)__ feature(unique_values_list): fast (non blocking) unique values list added
62
+ - refactoring unique_values_list;
63
+ - fast (non blocking) unique values list added;
64
+ - unique_list[:list_class] property introduced on UniqueHashCounter.
65
+
66
+ * 2013-08-23 [897418d](../../commit/897418d) - __(Artem Napolskih)__ Initial commit
67
+ * 2013-08-21 [21ed53b](../../commit/21ed53b) - __(napolskih)__ dummy commit
data/Gemfile CHANGED
@@ -1,6 +1,8 @@
1
+ # frozen_string_literal: true
1
2
  source 'https://rubygems.org'
2
3
 
3
- gem 'json', '< 2' if RUBY_VERSION < '2'
4
- gem 'activesupport', '< 5' if RUBY_VERSION < '2'
5
-
6
4
  gemspec
5
+
6
+ gem 'nokogiri', '< 1.11.0', require: false
7
+ gem 'parallel', '< 1.21.0'
8
+ gem 'racc', ' < 1.6.0', require: false
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # RedisCounters
2
2
 
3
- [![Dolly](http://dolly.railsc.ru/badges/abak-press/redis_counters/master)](http://dolly.railsc.ru/projects/36/builds/latest/?ref=master)
3
+ [![Build Status](https://drone.railsc.ru/api/badges/abak-press/redis_counters/status.svg)](https://drone.railsc.ru/abak-press/redis_counters)
4
4
  [![Code Climate](https://codeclimate.com/github/abak-press/redis_counters/badges/gpa.svg)](https://codeclimate.com/github/abak-press/redis_counters)
5
5
  [![Test Coverage](https://codeclimate.com/github/abak-press/redis_counters/badges/coverage.svg)](https://codeclimate.com/github/abak-press/redis_counters/coverage)
6
6
 
data/dip.yml ADDED
@@ -0,0 +1,42 @@
1
+ version: '1'
2
+
3
+ environment:
4
+ DOCKER_RUBY_VERSION: 2.4
5
+ RUBY_IMAGE_TAG: 2.4-latest
6
+ REDIS_IMAGE_TAG: 4-alpine
7
+ COMPOSE_FILE_EXT: development
8
+ RAILS_ENV: test
9
+
10
+ compose:
11
+ files:
12
+ - docker-compose.yml
13
+ - docker-compose.${COMPOSE_FILE_EXT}.yml
14
+
15
+ interaction:
16
+ sh:
17
+ service: app
18
+
19
+ irb:
20
+ service: app
21
+ command: irb
22
+
23
+ bundle:
24
+ service: app
25
+ command: bundle
26
+
27
+ rake:
28
+ service: app
29
+ command: bundle exec rake
30
+
31
+ rspec:
32
+ service: app
33
+ command: bundle exec rspec
34
+
35
+ clean:
36
+ service: app
37
+ command: rm -f Gemfile.lock gemfiles/*.gemfile.*
38
+
39
+ provision:
40
+ - docker volume create --name bundler_data
41
+ - dip clean
42
+ - dip bundle install
@@ -0,0 +1,13 @@
1
+ version: '2'
2
+
3
+ services:
4
+ app:
5
+ volumes:
6
+ - .:/app
7
+ - ../:/localgems
8
+ - bundler-data:/bundle
9
+
10
+ volumes:
11
+ bundler-data:
12
+ external:
13
+ name: bundler_data
@@ -0,0 +1,7 @@
1
+ version: '2'
2
+
3
+ services:
4
+ app:
5
+ volumes:
6
+ - .:/app
7
+ - /bundle:/bundle
@@ -0,0 +1,16 @@
1
+ version: '2'
2
+
3
+ services:
4
+ app:
5
+ image: abakpress/ruby-app:$RUBY_IMAGE_TAG
6
+ environment:
7
+ - BUNDLE_PATH=/bundle/$DOCKER_RUBY_VERSION
8
+ - BUNDLE_CONFIG=/app/.bundle/config
9
+ - TEST_REDIS_HOST=redis
10
+ command: bash
11
+ depends_on:
12
+ - redis
13
+
14
+ redis:
15
+ image: redis:$REDIS_IMAGE_TAG
16
+ command: 'redis-server --bind 0.0.0.0'
@@ -1,11 +1,8 @@
1
- # coding: utf-8
2
1
  require 'forwardable'
3
2
  require 'active_support/core_ext/class/attribute'
4
3
 
5
4
  module RedisCounters
6
-
7
5
  # Базовый класс счетчика на основе Redis.
8
-
9
6
  class BaseCounter
10
7
  extend Forwardable
11
8
 
@@ -22,10 +19,13 @@ module RedisCounters
22
19
  # opts - Hash - хеш опций счетчика:
23
20
  # counter_name - Symbol/String - идентификатор счетчика.
24
21
  # key_delimiter - String - разделитель ключа (опционально).
25
- # value_delimiter - String - разделитель значений (опционально).
22
+ # value_delimiter - Array[String] или String, разделитель значений. Если это массив, то первый элемент будет
23
+ # считатся новым разделителем, а второй старым. Все данные будут записываться, используя
24
+ # новый. Старый будет использоваться только для старых данных. Так что если надо сменить
25
+ # делимитр у счётчика, например с ':' на '�', то сперва надо будет установить его на ['�',
26
+ # ':'], а после дампа старых данных в БД, на '�'.
26
27
  #
27
28
  # Returns RedisCounters::BaseCounter.
28
- #
29
29
  def self.create(redis, opts)
30
30
  counter_class = opts.fetch(:counter_class).to_s.constantize
31
31
  counter_class.new(redis, opts)
@@ -80,5 +80,4 @@ module RedisCounters
80
80
 
81
81
  def_delegator :redis, :multi, :transaction
82
82
  end
83
-
84
- end
83
+ end
@@ -191,4 +191,4 @@ module RedisCounters
191
191
  result
192
192
  end
193
193
  end
194
- end
194
+ end
@@ -1,11 +1,9 @@
1
- # coding: utf-8
2
1
  require 'redis_counters/base_counter'
3
2
  require 'redis_counters/clusterize_and_partitionize'
3
+ require 'string_tools'
4
4
 
5
5
  module RedisCounters
6
-
7
6
  # Счетчик на основе redis-hash, с возможностью партиционирования и кластеризации значений.
8
-
9
7
  class HashCounter < BaseCounter
10
8
  include ClusterizeAndPartitionize
11
9
 
@@ -24,7 +22,11 @@ module RedisCounters
24
22
  group_params = [field_name]
25
23
  end
26
24
 
27
- group_params.join(value_delimiter)
25
+ if value_delimiter.is_a?(Array)
26
+ group_params.join(value_delimiter.first)
27
+ else
28
+ group_params.join(value_delimiter)
29
+ end
28
30
  end
29
31
 
30
32
  def field_name
@@ -43,12 +45,27 @@ module RedisCounters
43
45
  # cluster - Array - листовой кластер - массив параметров однозначно идентифицирующий кластер.
44
46
  # partition - Array - листовая партиция - массив параметров однозначно идентифицирующий партицию.
45
47
  #
46
- # Returns Array of WithIndifferentAccess.
47
- #
48
+ # Returns Array of HashWithIndifferentAccess.
48
49
  def partition_data(cluster, partition)
49
50
  keys = group_keys.dup.unshift(:value)
51
+
52
+ if delimiter_is_ary = value_delimiter.is_a?(Array)
53
+ new_delim, old_delim = value_delimiter
54
+ end
55
+
50
56
  redis.hgetall(key(partition, cluster)).inject(Array.new) do |result, (key, value)|
51
- values = key.split(value_delimiter, -1).unshift(format_value(value))
57
+ key = key.dup.to_utf8
58
+ values = if delimiter_is_ary
59
+ if key.include?(new_delim)
60
+ key.split(new_delim, -1)
61
+ else
62
+ key.split(old_delim, -1)
63
+ end
64
+ else
65
+ key.split(value_delimiter, -1)
66
+ end
67
+
68
+ values = values.map(&:presence).unshift(format_value(value))
52
69
  values.delete_at(1) unless group_keys.present?
53
70
  result << Hash[keys.zip(values)].with_indifferent_access
54
71
  end
@@ -66,5 +83,4 @@ module RedisCounters
66
83
  @float_mode ||= options.fetch(:float_mode, false)
67
84
  end
68
85
  end
69
-
70
86
  end
@@ -1,3 +1,3 @@
1
1
  module RedisCounters
2
- VERSION = '1.4.0'
3
- end
2
+ VERSION = '1.5.2'.freeze
3
+ end
@@ -1,4 +1,3 @@
1
- # encoding: utf-8
2
1
  require 'redis_counters/version'
3
2
  require 'redis_counters/base_counter'
4
3
  require 'redis_counters/hash_counter'
@@ -12,10 +11,9 @@ require 'active_support'
12
11
  require 'active_support/core_ext'
13
12
 
14
13
  module RedisCounters
15
-
16
14
  def create_counter(redis, opts)
17
15
  BaseCounter.create(redis, opts)
18
16
  end
19
17
 
20
18
  module_function :create_counter
21
- end
19
+ end
@@ -1,4 +1,3 @@
1
- # coding: utf-8
2
1
  lib = File.expand_path('../lib', __FILE__)
3
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
3
  require 'redis_counters/version'
@@ -16,16 +15,18 @@ Gem::Specification.new do |spec|
16
15
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
17
16
  spec.require_paths = ['lib']
18
17
 
19
- spec.add_dependency 'activesupport', '>= 3.0'
18
+ spec.add_runtime_dependency 'activesupport', '>= 4.0', '< 5'
19
+ spec.add_runtime_dependency 'string_tools'
20
20
 
21
21
  spec.add_development_dependency 'bundler'
22
22
  spec.add_development_dependency 'rake'
23
23
  spec.add_development_dependency 'rspec', '~> 2.14.0'
24
- spec.add_development_dependency 'mock_redis'
24
+ spec.add_development_dependency 'redis', '>= 3.0'
25
+ spec.add_development_dependency 'appraisal', '>= 1.0.2'
25
26
  spec.add_development_dependency 'timecop'
26
27
  spec.add_development_dependency 'codeclimate-test-reporter', '>= 0.4.1'
27
28
  spec.add_development_dependency 'simplecov'
28
29
  spec.add_development_dependency 'cane', '>= 2.6.0'
29
30
  spec.add_development_dependency 'bundler-audit'
30
- spec.add_development_dependency 'apress-changelogger'
31
+ spec.add_development_dependency 'pry-byebug'
31
32
  end
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe RedisCounters::BaseCounter do
4
- let(:redis) { MockRedis.new }
4
+ let(:redis) { Redis.current }
5
5
 
6
6
  let(:options) { {
7
7
  :counter_class => RedisCounters::HashCounter,
@@ -26,4 +26,4 @@ describe RedisCounters::BaseCounter do
26
26
 
27
27
  it { expect { counter }.to raise_error KeyError }
28
28
  end
29
- end
29
+ end
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe RedisCounters::HashCounter do
4
- let(:redis) { MockRedis.new }
4
+ let(:redis) { Redis.current }
5
5
  let(:value) { rand(10) + 1 }
6
6
  let(:options) { { :counter_name => :test_counter, :field_name => :test_field } }
7
7
  let(:counter) { described_class.new(redis, options) }
@@ -89,8 +89,7 @@ describe RedisCounters::HashCounter do
89
89
  before { 3.times { counter.process(:param1 => 21, :param2 => 22, :param3 => 33) } }
90
90
 
91
91
  it { expect(redis.keys('*')).to have(2).key }
92
- it { expect(redis.keys('*').first).to eq 'test_counter:11:22' }
93
- it { expect(redis.keys('*').last).to eq 'test_counter:21:22' }
92
+ it { expect(redis.keys('*')).to match_array ['test_counter:11:22', 'test_counter:21:22'] }
94
93
  it { expect(redis.hexists('test_counter:11:22', 'test_field')).to be_true }
95
94
  it { expect(redis.hget('test_counter:11:22', 'test_field')).to eq value.to_s }
96
95
  it { expect(redis.hexists('test_counter:21:22', 'test_field')).to be_true }
@@ -108,8 +107,7 @@ describe RedisCounters::HashCounter do
108
107
  before { 3.times { counter.process(:param1 => 2, :param2 => 2) } }
109
108
 
110
109
  it { expect(redis.keys('*')).to have(2).key }
111
- it { expect(redis.keys('*').first).to eq 'test_counter:true' }
112
- it { expect(redis.keys('*').last).to eq 'test_counter:false' }
110
+ it { expect(redis.keys('*')).to match_array ['test_counter:true', 'test_counter:false'] }
113
111
  it { expect(redis.hexists('test_counter:true', 'test_field')).to be_true }
114
112
  it { expect(redis.hget('test_counter:true', 'test_field')).to eq 2.to_s }
115
113
  it { expect(redis.hexists('test_counter:false', 'test_field')).to be_true }
@@ -129,9 +127,7 @@ describe RedisCounters::HashCounter do
129
127
  before { 1.times { counter.process(:param1 => 21, :param2 => '', :param3 => 33) } }
130
128
 
131
129
  it { expect(redis.keys('*')).to have(3).key }
132
- it { expect(redis.keys('*').first).to eq 'test_counter:11:22' }
133
- it { expect(redis.keys('*').second).to eq 'test_counter:21:22' }
134
- it { expect(redis.keys('*').third).to eq 'test_counter:21:' }
130
+ it { expect(redis.keys('*')).to match_array ['test_counter:11:22', 'test_counter:21:22', 'test_counter:21:'] }
135
131
  it { expect(redis.hexists('test_counter:11:22', 'test_field')).to be_true }
136
132
  it { expect(redis.hget('test_counter:11:22', 'test_field')).to eq value.to_s }
137
133
  it { expect(redis.hexists('test_counter:21:22', 'test_field')).to be_true }
@@ -153,9 +149,13 @@ describe RedisCounters::HashCounter do
153
149
  before { 1.times { counter.process(:param1 => 2, :param2 => 2, :date => '2013-04-28') } }
154
150
 
155
151
  it { expect(redis.keys('*')).to have(3).key }
156
- it { expect(redis.keys('*').first).to eq 'test_counter:2013-04-27:true' }
157
- it { expect(redis.keys('*').second).to eq 'test_counter:2013-04-27:false' }
158
- it { expect(redis.keys('*').third).to eq 'test_counter:2013-04-28:false' }
152
+ it do
153
+ expect(redis.keys('*')).to match_array [
154
+ 'test_counter:2013-04-27:true',
155
+ 'test_counter:2013-04-27:false',
156
+ 'test_counter:2013-04-28:false'
157
+ ]
158
+ end
159
159
  it { expect(redis.hexists('test_counter:2013-04-27:true', 'test_field')).to be_true }
160
160
  it { expect(redis.hget('test_counter:2013-04-27:true', 'test_field')).to eq 3.to_s }
161
161
  it { expect(redis.hexists('test_counter:2013-04-27:false', 'test_field')).to be_true }
@@ -182,17 +182,14 @@ describe RedisCounters::HashCounter do
182
182
 
183
183
  context 'when no partition params given' do
184
184
  it { expect(counter.partitions).to have(3).partition }
185
- it { expect(counter.partitions.first).to eq partition_1 }
186
- it { expect(counter.partitions.second).to eq partition_2 }
187
- it { expect(counter.partitions.third).to eq partition_3 }
185
+ it { expect(counter.partitions).to match_array [partition_1, partition_2, partition_3] }
188
186
  end
189
187
 
190
188
  context 'when one partition param given' do
191
189
  it { expect(counter.partitions(:param1 => 11)).to have(1).partition }
192
190
  it { expect(counter.partitions(:param1 => 11).first).to eq partition_1 }
193
191
  it { expect(counter.partitions(:param1 => 21)).to have(2).partition }
194
- it { expect(counter.partitions(:param1 => 21).first).to eq partition_2 }
195
- it { expect(counter.partitions('param1' => 21).second).to eq partition_3 }
192
+ it { expect(counter.partitions(:param1 => 21)).to match_array [partition_2, partition_3] }
196
193
  end
197
194
 
198
195
  context 'when two partition params given' do
@@ -231,9 +228,7 @@ describe RedisCounters::HashCounter do
231
228
  before { 4.times { counter.process(:param1 => 21, :param2 => '', :param3 => 31) } }
232
229
 
233
230
  it { expect(counter.data(partitions)).to have(3).row }
234
- it { expect(counter.data(partitions).first[:value]).to eq 3 }
235
- it { expect(counter.data(partitions).second[:value]).to eq 2 }
236
- it { expect(counter.data(partitions).third[:value]).to eq 5 }
231
+ it { expect(counter.data(partitions)).to match_array [{'value' => 3}, {'value' => 2}, {'value' => 5}] }
237
232
  end
238
233
 
239
234
  context 'when group_keys and one group key is nil' do
@@ -257,7 +252,7 @@ describe RedisCounters::HashCounter do
257
252
  it { expect(counter.data(partitions).first[:param4]).to eq '1' }
258
253
  it { expect(counter.data(partitions).second[:value]).to eq 5 }
259
254
  it { expect(counter.data(partitions).second[:param3]).to eq '31' }
260
- it { expect(counter.data(partitions).second[:param4]).to eq '' }
255
+ it { expect(counter.data(partitions).second[:param4]).to eq nil }
261
256
  end
262
257
 
263
258
  context 'when group_keys given' do
@@ -375,8 +370,7 @@ describe RedisCounters::HashCounter do
375
370
  before { counter.delete_partitions!(partition_2) }
376
371
 
377
372
  it { expect(counter.partitions).to have(2).row }
378
- it { expect(counter.partitions.first).to eq partition_1 }
379
- it { expect(counter.partitions.last).to eq partition_3 }
373
+ it { expect(counter.partitions).to match_array [partition_1, partition_3] }
380
374
  end
381
375
 
382
376
  context 'when not leaf partition given' do
@@ -396,9 +390,7 @@ describe RedisCounters::HashCounter do
396
390
  before { counter.delete_partitions!(:param1 => 21, &error_proc) rescue nil }
397
391
 
398
392
  it { expect(counter.partitions).to have(3).row }
399
- it { expect(counter.partitions.first).to eq partition_1 }
400
- it { expect(counter.partitions.second).to eq partition_2 }
401
- it { expect(counter.partitions.last).to eq partition_3 }
393
+ it { expect(counter.partitions).to match_array [partition_1, partition_2, partition_3] }
402
394
  end
403
395
  end
404
396
 
@@ -407,8 +399,7 @@ describe RedisCounters::HashCounter do
407
399
  before { counter.delete_partitions!(partition_2) }
408
400
 
409
401
  it { expect(counter.partitions).to have(2).row }
410
- it { expect(counter.partitions.first).to eq partition_1 }
411
- it { expect(counter.partitions.last).to eq partition_3 }
402
+ it { expect(counter.partitions).to match_array [partition_1, partition_3] }
412
403
  end
413
404
 
414
405
  context 'when not leaf partition given' do
@@ -434,16 +425,104 @@ describe RedisCounters::HashCounter do
434
425
  before { 2.times { counter.process(partition_2) } }
435
426
  before { 3.times { counter.process(partition_3) } }
436
427
 
437
- it { expect(counter.partitions.first[:param2]).to eq '22:35' }
438
- it { expect(counter.partitions.second[:param2]).to eq '23:26' }
439
- it { expect(counter.partitions.third[:param2]).to eq '24:26' }
428
+ it do
429
+ expect(counter.partitions).to match_array [
430
+ {'param1' => '11', 'param2' => '22:35'},
431
+ {'param1' => '11', 'param2' => '23:26'},
432
+ {'param1' => '11', 'param2' => '24:26'}
433
+ ]
434
+ end
440
435
 
441
- it { expect(counter.data.first[:param3]).to eq '11:64' }
442
- it { expect(counter.data.first[:value]).to eq 1 }
443
- it { expect(counter.data.second[:param3]).to eq '11:36' }
444
- it { expect(counter.data.second[:value]).to eq 2 }
445
- it { expect(counter.data.third[:param3]).to eq '21:54' }
446
- it { expect(counter.data.third[:value]).to eq 3 }
436
+ it do
437
+ expect(counter.data).to match_array [
438
+ {'value' => 1, 'param3' => '11:64'},
439
+ {'value' => 2, 'param3' => '11:36'},
440
+ {'value' => 3, 'param3' => '21:54'}
441
+ ]
442
+ end
443
+ end
444
+
445
+ context 'two delimiters' do
446
+ let(:options) do
447
+ {
448
+ counter_name: :test_counter,
449
+ group_keys: [:title, :url],
450
+ partition_keys: [:date],
451
+ key_delimiter: '&',
452
+ value_delimiter: %W(\uFFFD :)
453
+ }
454
+ end
455
+ let(:partition) { {title: 'Main', url: 'http://example.com', date: '2017-04-21'} }
456
+
457
+ before { counter.increment(partition) }
458
+
459
+ it 'uses the first (new) delimiter for writing' do
460
+ expect(counter.send(:field)).to eq('Main�http://example.com')
461
+ expect(counter.data).to eq([{'value' => 1, 'title' => 'Main', 'url' => 'http://example.com'}])
462
+ end
463
+ end
464
+
465
+ context 'new delimiter added when there is data separated by the old one' do
466
+ let(:options) do
467
+ {
468
+ counter_name: :test_counter,
469
+ group_keys: [:title, :url],
470
+ partition_keys: [:date],
471
+ key_delimiter: '&',
472
+ value_delimiter: %W(\uFFFD :)
473
+ }
474
+ end
475
+ let(:partition) { {title: 'Main', url: 'http://example.com', date: '2017-04-21'} }
476
+
477
+ before do
478
+ redis.hincrbyfloat('test_counter&2017-04-21', 'Main:/about', 1.0)
479
+ end
480
+
481
+ it 'understands the old delimiter' do
482
+ expect(counter.data).to eq([{'value' => 1, 'title' => 'Main', 'url' => '/about'}])
483
+ end
484
+ end
485
+
486
+ context 'new delimiter added and there is data separated by it but contains the old delimiter' do
487
+ let(:options) do
488
+ {
489
+ counter_name: :test_counter,
490
+ group_keys: [:title, :url],
491
+ partition_keys: [:date],
492
+ key_delimiter: '&',
493
+ value_delimiter: %W(\uFFFD :)
494
+ }
495
+ end
496
+ let(:partition) { {title: 'Main', url: 'http://example.com', date: '2017-04-21'} }
497
+
498
+ before do
499
+ redis.hincrbyfloat('test_counter&2017-04-21', 'Main�http://example.com', 1.0)
500
+ end
501
+
502
+ it 'uses the new delimiter' do
503
+ expect(counter.data).to eq([{'value' => 1, 'title' => 'Main', 'url' => 'http://example.com'}])
504
+ end
505
+ end
506
+
507
+ context 'when non-utf8 data contains delimeters' do
508
+ let(:options) do
509
+ {
510
+ counter_name: :test_counter,
511
+ group_keys: [:title, :url],
512
+ partition_keys: [:date],
513
+ key_delimiter: '&',
514
+ value_delimiter: '|'
515
+ }
516
+ end
517
+ let(:partition) { {title: "Erg\xE4nzendes", url: 'http://example.com', date: '2022-05-04'} }
518
+
519
+ before do
520
+ redis.hincrbyfloat('test_counter&2022-05-04', "Erg\xE4nzendes|http://example.com", 1.0)
521
+ end
522
+
523
+ it 'successfully splits data' do
524
+ expect(counter.data).to eq([{'value' => 1, 'title' => 'Ergänzendes', 'url' => 'http://example.com'}])
525
+ end
447
526
  end
448
527
 
449
528
  context 'when check custom increment' do
@@ -459,4 +538,4 @@ describe RedisCounters::HashCounter do
459
538
  it { expect(redis.hexists('test_counter', 'test_field')).to be_true }
460
539
  it { expect(redis.hget('test_counter', 'test_field').to_f).to be_within(0.001).of value*0.2.to_f }
461
540
  end
462
- end
541
+ end
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe RedisCounters::UniqueHashCounter do
4
- let(:redis) { MockRedis.new }
4
+ let(:redis) { Redis.current }
5
5
  let(:unique_list_postfix) { described_class.const_get(:UNIQUE_LIST_POSTFIX) }
6
6
 
7
7
  let(:options) { {
@@ -76,8 +76,8 @@ describe RedisCounters::UniqueHashCounter do
76
76
 
77
77
  it { expect(redis.lrange('test_counter_uq:1:partitions', 0, -1)).to eq ['2013-04-28', '2013-04-27'] }
78
78
  it { expect(redis.lrange('test_counter_uq:2:partitions', 0, -1)).to eq ['2013-04-27'] }
79
- it { expect(redis.smembers('test_counter_uq:1:2013-04-27')).to eq ['4'] }
80
- it { expect(redis.smembers('test_counter_uq:2:2013-04-27')).to eq ['3', '2', '1'] }
81
- it { expect(redis.smembers('test_counter_uq:1:2013-04-28')).to eq ['5', '1'] }
79
+ it { expect(redis.smembers('test_counter_uq:1:2013-04-27')).to match_array ['4'] }
80
+ it { expect(redis.smembers('test_counter_uq:2:2013-04-27')).to match_array ['3', '2', '1'] }
81
+ it { expect(redis.smembers('test_counter_uq:1:2013-04-28')).to match_array ['5', '1'] }
82
82
  end
83
- end
83
+ end
@@ -5,7 +5,7 @@ describe RedisCounters::UniqueValuesLists::Blocking do
5
5
  it_behaves_like 'unique_values_lists/set'
6
6
 
7
7
  context 'when check partitions list' do
8
- let(:redis) { MockRedis.new }
8
+ let(:redis) { Redis.current }
9
9
  let(:values) { rand(10) + 1 }
10
10
  let(:partitions_list_postfix) { described_class.const_get(:PARTITIONS_LIST_POSTFIX) }
11
11
 
@@ -91,4 +91,4 @@ describe RedisCounters::UniqueValuesLists::Blocking do
91
91
  end
92
92
  end
93
93
  end
94
- end
94
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,16 +1,16 @@
1
- require 'rubygems'
2
1
  require 'bundler/setup'
3
2
  require 'rspec'
4
- require 'mock_redis'
5
3
  require 'timecop'
6
-
7
4
  require 'codeclimate-test-reporter'
8
- CodeClimate::TestReporter.start
9
-
10
5
  require 'simplecov'
6
+ require 'pry-byebug'
7
+
11
8
  SimpleCov.start('test_frameworks')
12
9
 
13
10
  require 'redis_counters'
11
+ require 'redis'
12
+
13
+ Redis.current = Redis.new(host: ENV['TEST_REDIS_HOST'])
14
14
 
15
15
  # require helpers
16
16
  support_dir = File.expand_path(File.join('..', 'support'), __FILE__)
@@ -18,7 +18,5 @@ Dir[File.join(support_dir, '**', '*.rb')].each { |f| require f }
18
18
 
19
19
  RSpec.configure do |config|
20
20
  config.backtrace_exclusion_patterns = [/lib\/rspec\/(core|expectations|matchers|mocks)/]
21
- config.color_enabled = true
22
- config.formatter = 'documentation'
23
- config.order = 'random'
24
- end
21
+ config.before { Redis.current.flushdb }
22
+ end
@@ -1,6 +1,5 @@
1
- # coding: utf-8
2
1
  shared_examples_for 'unique_values_lists/common' do
3
- let(:redis) { MockRedis.new }
2
+ let(:redis) { Redis.current }
4
3
  let(:values) { rand(10) + 1 }
5
4
 
6
5
  let(:options) { {
@@ -139,9 +138,10 @@ shared_examples_for 'unique_values_lists/common' do
139
138
 
140
139
  context 'when no partition given' do
141
140
  it { expect(counter.partitions(cluster1_subcluster1)).to have(3).partitions }
142
- it { expect(counter.partitions(cluster1_subcluster1).first).to eq part1_subpart1 }
143
- it { expect(counter.partitions(cluster1_subcluster1).second).to eq part1_subpart2 }
144
- it { expect(counter.partitions(cluster1_subcluster1).third).to eq part2_subpart1 }
141
+ it do
142
+ expect(counter.partitions(cluster1_subcluster1)).
143
+ to match_array [part1_subpart1, part1_subpart2, part2_subpart1]
144
+ end
145
145
  #
146
146
  it { expect(counter.partitions(cluster2_subcluster1)).to have(1).partitions }
147
147
  it { expect(counter.partitions(cluster2_subcluster1).first).to eq part1_subpart1 }
@@ -149,8 +149,10 @@ shared_examples_for 'unique_values_lists/common' do
149
149
 
150
150
  context 'when not leaf partition given' do
151
151
  it { expect(counter.partitions(cluster1_subcluster1.merge(:part => :part1))).to have(2).partitions }
152
- it { expect(counter.partitions(cluster1_subcluster1.merge(:part => :part1)).first).to eq part1_subpart1 }
153
- it { expect(counter.partitions(cluster1_subcluster1.merge(:part => :part1)).second).to eq part1_subpart2 }
152
+ it do
153
+ expect(counter.partitions(cluster1_subcluster1.merge(:part => :part1))).
154
+ to match_array [part1_subpart1, part1_subpart2]
155
+ end
154
156
  end
155
157
 
156
158
  context 'when leaf partition given' do
@@ -182,15 +184,12 @@ shared_examples_for 'unique_values_lists/common' do
182
184
 
183
185
  context 'when no partition given' do
184
186
  it { expect(counter.partitions).to have(3).partitions }
185
- it { expect(counter.partitions.first).to eq part1_subpart1 }
186
- it { expect(counter.partitions.second).to eq part1_subpart2 }
187
- it { expect(counter.partitions.third).to eq part2_subpart1 }
187
+ it { expect(counter.partitions).to match_array [part1_subpart1, part1_subpart2, part2_subpart1] }
188
188
  end
189
189
 
190
190
  context 'when not leaf partition given' do
191
191
  it { expect(counter.partitions(:part => :part1)).to have(2).partitions }
192
- it { expect(counter.partitions(:part => :part1).first).to eq part1_subpart1 }
193
- it { expect(counter.partitions(:part => :part1).second).to eq part1_subpart2 }
192
+ it { expect(counter.partitions(:part => :part1)).to match_array [part1_subpart1, part1_subpart2] }
194
193
  end
195
194
 
196
195
  context 'when leaf partition given' do
@@ -560,4 +559,4 @@ shared_examples_for 'unique_values_lists/common' do
560
559
  end
561
560
  end
562
561
  end
563
- end
562
+ end
@@ -1,6 +1,5 @@
1
- # coding: utf-8
2
1
  shared_examples_for 'unique_values_lists/expirable' do
3
- let(:redis) { MockRedis.new }
2
+ let(:redis) { Redis.current }
4
3
  let(:counter) { described_class.new(redis, options) }
5
4
 
6
5
  after do
@@ -159,4 +158,4 @@ shared_examples_for 'unique_values_lists/expirable' do
159
158
  end
160
159
  end
161
160
  end
162
- end
161
+ end
@@ -1,6 +1,5 @@
1
- # coding: utf-8
2
1
  shared_examples_for 'unique_values_lists/set' do
3
- let(:redis) { MockRedis.new }
2
+ let(:redis) { Redis.current }
4
3
  let(:values) { rand(10) + 1 }
5
4
 
6
5
  let(:counter) { described_class.new(redis, options) }
@@ -116,4 +115,4 @@ shared_examples_for 'unique_values_lists/set' do
116
115
  it { expect(redis.smembers("test_counter:cluster2")).to include '4:5' }
117
116
  end
118
117
  end
119
- end
118
+ end
metadata CHANGED
@@ -1,169 +1,203 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redis_counters
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.0
4
+ version: 1.5.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Artem Napolskih
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-07-21 00:00:00.000000000 Z
11
+ date: 2022-05-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '4.0'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '5'
23
+ type: :runtime
24
+ prerelease: false
14
25
  version_requirements: !ruby/object:Gem::Requirement
15
26
  requirements:
16
- - - '>='
27
+ - - ">="
17
28
  - !ruby/object:Gem::Version
18
- version: '3.0'
19
- name: activesupport
29
+ version: '4.0'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '5'
33
+ - !ruby/object:Gem::Dependency
34
+ name: string_tools
20
35
  requirement: !ruby/object:Gem::Requirement
21
36
  requirements:
22
- - - '>='
37
+ - - ">="
23
38
  - !ruby/object:Gem::Version
24
- version: '3.0'
39
+ version: '0'
25
40
  type: :runtime
26
41
  prerelease: false
27
- - !ruby/object:Gem::Dependency
28
42
  version_requirements: !ruby/object:Gem::Requirement
29
43
  requirements:
30
- - - '>='
44
+ - - ">="
31
45
  - !ruby/object:Gem::Version
32
46
  version: '0'
47
+ - !ruby/object:Gem::Dependency
33
48
  name: bundler
34
49
  requirement: !ruby/object:Gem::Requirement
35
50
  requirements:
36
- - - '>='
51
+ - - ">="
37
52
  - !ruby/object:Gem::Version
38
53
  version: '0'
39
54
  type: :development
40
55
  prerelease: false
41
- - !ruby/object:Gem::Dependency
42
56
  version_requirements: !ruby/object:Gem::Requirement
43
57
  requirements:
44
- - - '>='
58
+ - - ">="
45
59
  - !ruby/object:Gem::Version
46
60
  version: '0'
61
+ - !ruby/object:Gem::Dependency
47
62
  name: rake
48
63
  requirement: !ruby/object:Gem::Requirement
49
64
  requirements:
50
- - - '>='
65
+ - - ">="
51
66
  - !ruby/object:Gem::Version
52
67
  version: '0'
53
68
  type: :development
54
69
  prerelease: false
55
- - !ruby/object:Gem::Dependency
56
70
  version_requirements: !ruby/object:Gem::Requirement
57
71
  requirements:
58
- - - ~>
72
+ - - ">="
59
73
  - !ruby/object:Gem::Version
60
- version: 2.14.0
74
+ version: '0'
75
+ - !ruby/object:Gem::Dependency
61
76
  name: rspec
62
77
  requirement: !ruby/object:Gem::Requirement
63
78
  requirements:
64
- - - ~>
79
+ - - "~>"
65
80
  - !ruby/object:Gem::Version
66
81
  version: 2.14.0
67
82
  type: :development
68
83
  prerelease: false
69
- - !ruby/object:Gem::Dependency
70
84
  version_requirements: !ruby/object:Gem::Requirement
71
85
  requirements:
72
- - - '>='
86
+ - - "~>"
73
87
  - !ruby/object:Gem::Version
74
- version: '0'
75
- name: mock_redis
88
+ version: 2.14.0
89
+ - !ruby/object:Gem::Dependency
90
+ name: redis
76
91
  requirement: !ruby/object:Gem::Requirement
77
92
  requirements:
78
- - - '>='
93
+ - - ">="
79
94
  - !ruby/object:Gem::Version
80
- version: '0'
95
+ version: '3.0'
81
96
  type: :development
82
97
  prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: '3.0'
83
103
  - !ruby/object:Gem::Dependency
104
+ name: appraisal
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: 1.0.2
110
+ type: :development
111
+ prerelease: false
84
112
  version_requirements: !ruby/object:Gem::Requirement
85
113
  requirements:
86
- - - '>='
114
+ - - ">="
87
115
  - !ruby/object:Gem::Version
88
- version: '0'
116
+ version: 1.0.2
117
+ - !ruby/object:Gem::Dependency
89
118
  name: timecop
90
119
  requirement: !ruby/object:Gem::Requirement
91
120
  requirements:
92
- - - '>='
121
+ - - ">="
93
122
  - !ruby/object:Gem::Version
94
123
  version: '0'
95
124
  type: :development
96
125
  prerelease: false
97
- - !ruby/object:Gem::Dependency
98
126
  version_requirements: !ruby/object:Gem::Requirement
99
127
  requirements:
100
- - - '>='
128
+ - - ">="
101
129
  - !ruby/object:Gem::Version
102
- version: 0.4.1
130
+ version: '0'
131
+ - !ruby/object:Gem::Dependency
103
132
  name: codeclimate-test-reporter
104
133
  requirement: !ruby/object:Gem::Requirement
105
134
  requirements:
106
- - - '>='
135
+ - - ">="
107
136
  - !ruby/object:Gem::Version
108
137
  version: 0.4.1
109
138
  type: :development
110
139
  prerelease: false
111
- - !ruby/object:Gem::Dependency
112
140
  version_requirements: !ruby/object:Gem::Requirement
113
141
  requirements:
114
- - - '>='
142
+ - - ">="
115
143
  - !ruby/object:Gem::Version
116
- version: '0'
144
+ version: 0.4.1
145
+ - !ruby/object:Gem::Dependency
117
146
  name: simplecov
118
147
  requirement: !ruby/object:Gem::Requirement
119
148
  requirements:
120
- - - '>='
149
+ - - ">="
121
150
  - !ruby/object:Gem::Version
122
151
  version: '0'
123
152
  type: :development
124
153
  prerelease: false
125
- - !ruby/object:Gem::Dependency
126
154
  version_requirements: !ruby/object:Gem::Requirement
127
155
  requirements:
128
- - - '>='
156
+ - - ">="
129
157
  - !ruby/object:Gem::Version
130
- version: 2.6.0
158
+ version: '0'
159
+ - !ruby/object:Gem::Dependency
131
160
  name: cane
132
161
  requirement: !ruby/object:Gem::Requirement
133
162
  requirements:
134
- - - '>='
163
+ - - ">="
135
164
  - !ruby/object:Gem::Version
136
165
  version: 2.6.0
137
166
  type: :development
138
167
  prerelease: false
139
- - !ruby/object:Gem::Dependency
140
168
  version_requirements: !ruby/object:Gem::Requirement
141
169
  requirements:
142
- - - '>='
170
+ - - ">="
143
171
  - !ruby/object:Gem::Version
144
- version: '0'
172
+ version: 2.6.0
173
+ - !ruby/object:Gem::Dependency
145
174
  name: bundler-audit
146
175
  requirement: !ruby/object:Gem::Requirement
147
176
  requirements:
148
- - - '>='
177
+ - - ">="
149
178
  - !ruby/object:Gem::Version
150
179
  version: '0'
151
180
  type: :development
152
181
  prerelease: false
153
- - !ruby/object:Gem::Dependency
154
182
  version_requirements: !ruby/object:Gem::Requirement
155
183
  requirements:
156
- - - '>='
184
+ - - ">="
157
185
  - !ruby/object:Gem::Version
158
186
  version: '0'
159
- name: apress-changelogger
187
+ - !ruby/object:Gem::Dependency
188
+ name: pry-byebug
160
189
  requirement: !ruby/object:Gem::Requirement
161
190
  requirements:
162
- - - '>='
191
+ - - ">="
163
192
  - !ruby/object:Gem::Version
164
193
  version: '0'
165
194
  type: :development
166
195
  prerelease: false
196
+ version_requirements: !ruby/object:Gem::Requirement
197
+ requirements:
198
+ - - ">="
199
+ - !ruby/object:Gem::Version
200
+ version: '0'
167
201
  description:
168
202
  email:
169
203
  - napolskih@gmail.com
@@ -171,12 +205,19 @@ executables: []
171
205
  extensions: []
172
206
  extra_rdoc_files: []
173
207
  files:
174
- - .gitignore
208
+ - ".drone.yml"
209
+ - ".gitignore"
210
+ - ".rspec"
211
+ - Appraisals
175
212
  - CHANGELOG.md
176
213
  - Gemfile
177
214
  - Makefile
178
215
  - README.md
179
216
  - Rakefile
217
+ - dip.yml
218
+ - docker-compose.development.yml
219
+ - docker-compose.drone.yml
220
+ - docker-compose.yml
180
221
  - lib/redis_counters.rb
181
222
  - lib/redis_counters/base_counter.rb
182
223
  - lib/redis_counters/bucket.rb
@@ -215,17 +256,16 @@ require_paths:
215
256
  - lib
216
257
  required_ruby_version: !ruby/object:Gem::Requirement
217
258
  requirements:
218
- - - '>='
259
+ - - ">="
219
260
  - !ruby/object:Gem::Version
220
261
  version: '0'
221
262
  required_rubygems_version: !ruby/object:Gem::Requirement
222
263
  requirements:
223
- - - '>='
264
+ - - ">="
224
265
  - !ruby/object:Gem::Version
225
266
  version: '0'
226
267
  requirements: []
227
- rubyforge_project:
228
- rubygems_version: 2.4.6
268
+ rubygems_version: 3.0.3
229
269
  signing_key:
230
270
  specification_version: 4
231
271
  summary: Redis Counters