redis_counters-dumpers 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: baf28efb0b4f140dae575fd7aa300a1dbb1486ec
4
- data.tar.gz: e525a5a8049f12af5c7985a77dc6748901b64181
3
+ metadata.gz: a60e1ec26471d5763627a8a3ab246e67ef0e9953
4
+ data.tar.gz: e67d6186b99f2a423fc58ac4e3573aa273541f98
5
5
  SHA512:
6
- metadata.gz: d808c8e16e3438efc682c06161a51d05612fb02c3fbb286f1cd68fa714eedc25d4be52b76b0b4cae3a579b36c07726abd9946f02f11195ae18958e6535a2c4ae
7
- data.tar.gz: d51ac56268477487b776b17fa583b5a5ab020af09acd54ae445d42f3ad4f8c94d34917da02585b2b870f8c0a3c49343579b1de69fc393ab21513d96079acde05
6
+ metadata.gz: 60efde8a403440f3c6748ad59937ae3bd4d9c748c30e77e5bb531dd915ed30ffea1b2dab5654536bc07611007c7e2084a7d94e5a3dba9809d2652bd883dd4e9d
7
+ data.tar.gz: ecaf2c8adc08a8bec2e48fa312bd58b7f015141c96c7d063580a410c3088f3f2c7b071fa37a34fd37fbfb83db95cde447a2d1d2d038efc9c7f5db13f64044853
data/.drone.yml ADDED
@@ -0,0 +1,21 @@
1
+ build:
2
+ test:
3
+ image: abakpress/dind-testing
4
+ pull: true
5
+ privileged: true
6
+ volumes:
7
+ - /home/data/drone/images:/images
8
+ - /home/data/drone/gems:/bundle
9
+ environment:
10
+ - COMPOSE_FILE_EXT=drone
11
+ - POSTGRES_IMAGE_TAG=9.6-latest
12
+ - RUBY_IMAGE_TAG=2.2-latest
13
+ commands:
14
+ - wrapdocker docker -v
15
+
16
+ - fetch-images
17
+ --image abakpress/ruby-app:$RUBY_IMAGE_TAG
18
+ --image abakpress/postgres-db:$POSTGRES_IMAGE_TAG
19
+
20
+ - dip provision
21
+ - dip rspec
data/.gitignore CHANGED
@@ -7,6 +7,8 @@
7
7
  /pkg/
8
8
  /spec/reports/
9
9
  /tmp/
10
+ /spec/internal/log
11
+ /gemfiles
10
12
  *.bundle
11
13
  *.so
12
14
  *.o
data/Appraisals CHANGED
@@ -1,11 +1,6 @@
1
- appraise 'rails3.1' do
2
- gem 'activesupport', '~> 3.1.0'
3
- gem 'activerecord', '~> 3.1.0'
4
- end
5
-
6
1
  appraise 'rails3.2' do
7
- gem 'activesupport', '~> 3.2.0'
8
- gem 'activerecord', '~> 3.2.0'
2
+ gem 'activesupport', '~> 3.2.14'
3
+ gem 'activerecord', '~> 3.2.14'
9
4
  end
10
5
 
11
6
  appraise 'rails4.0' do
data/Gemfile CHANGED
@@ -1,13 +1,3 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- # Specify your gem's dependencies in redis_counters-dumpers.gemspec
4
-
5
- group :development, :test do
6
- gem 'combustion', github: 'pat/combustion', ref: '7d0d24c3f36ce0eb336177fc493be0721bc26665'
7
- gem 'activerecord-postgres-hstore', require: false
8
- gem 'simple_hstore_accessor', '~> 0.2', require: false
9
- end
10
-
11
- gem 'rack', '< 2' if RUBY_VERSION < '2.2.0'
12
-
13
3
  gemspec
data/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # RedisCounters::Dumpers
2
2
 
3
+ [![Build Status](https://drone.railsc.ru/api/badges/abak-press/redis_counters-dumpers/status.svg)](https://drone.railsc.ru/abak-press/redis_counters-dumpers)
4
+
3
5
  Dump statistics from Redis to DB
4
6
 
5
7
  ## Installation
data/dip.yml ADDED
@@ -0,0 +1,46 @@
1
+ version: '1'
2
+
3
+ environment:
4
+ DOCKER_RUBY_VERSION: 2.2
5
+ RUBY_IMAGE_TAG: 2.2-latest
6
+ POSTGRES_IMAGE_TAG: 9.6-latest
7
+ COMPOSE_FILE_EXT: development
8
+
9
+ compose:
10
+ files:
11
+ - docker-compose.yml
12
+ - docker-compose.${COMPOSE_FILE_EXT}.yml
13
+
14
+ interaction:
15
+ sh:
16
+ service: app
17
+
18
+ irb:
19
+ service: app
20
+ command: irb
21
+
22
+ bundle:
23
+ service: app
24
+ command: bundle
25
+
26
+ rake:
27
+ service: app
28
+ command: bundle exec rake
29
+
30
+ appraisal:
31
+ service: app
32
+ command: bundle exec appraisal
33
+
34
+ rspec:
35
+ service: app
36
+ command: bundle exec appraisal bundle exec rspec
37
+
38
+ clean:
39
+ service: app
40
+ command: rm -f Gemfile.lock gemfiles/*.gemfile.*
41
+
42
+ provision:
43
+ - docker volume create --name bundler_data
44
+ - dip bundle config --local https://gems.railsc.ru/ ${APRESS_GEMS_CREDENTIALS}
45
+ - dip bundle install --full-index
46
+ - dip appraisal 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,19 @@
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_DB_HOST=db
10
+ - TEST_DB_NAME=docker
11
+ - TEST_DB_USERNAME=postgres
12
+ command: bash
13
+ depends_on:
14
+ - db
15
+
16
+ db:
17
+ image: abakpress/postgres-db:$POSTGRES_IMAGE_TAG
18
+ environment:
19
+ - POSTGRES_DB=docker
@@ -1,4 +1,3 @@
1
- # coding: utf-8
2
1
  require 'forwardable'
3
2
  require 'active_support/core_ext/hash/indifferent_access'
4
3
  require 'active_support/core_ext/object/blank'
@@ -65,6 +64,18 @@ module RedisCounters
65
64
  # Условия соединяются через AND.
66
65
  attr_accessor :source_conditions
67
66
 
67
+ # Public: Опциональное выражение для определения одинаковых записей в исходной (source) и целевой (target)
68
+ # таблицах. Эту опцию имеет смысл использовать если например нужно добавить функцию на какую-нибудь колонку,
69
+ # например:
70
+ #
71
+ # matching_expr <<-SQL
72
+ # (source.company_id, source.date, coalesce(source.referer, '')) =
73
+ # (target.company_id, target.date, coalesce(target.referer, ''))
74
+ # SQL
75
+ #
76
+ # Returns String
77
+ attr_accessor :matching_expr
78
+
68
79
  def initialize(engine)
69
80
  @engine = engine
70
81
  @fields_map = HashWithIndifferentAccess.new
@@ -167,6 +178,10 @@ module RedisCounters
167
178
  end
168
179
 
169
180
  def matching_expression
181
+ matching_expr || default_matching_expr
182
+ end
183
+
184
+ def default_matching_expr
170
185
  source_key_fields = key_fields.map { |field| "source.#{field}" }.join(', ')
171
186
  target_key_fields = key_fields.map { |field| "target.#{field}" }.join(', ')
172
187
  "(#{source_key_fields}) = (#{target_key_fields})"
@@ -1,4 +1,3 @@
1
- # coding: utf-8
2
1
  module RedisCounters
3
2
  module Dumpers
4
3
  module Dsl
@@ -1,4 +1,3 @@
1
- # coding: utf-8
2
1
  require 'active_support/concern'
3
2
  require_relative 'base'
4
3
 
@@ -13,6 +12,7 @@ module RedisCounters
13
12
  alias_method :destination, :target
14
13
 
15
14
  setter :model
15
+ setter :matching_expr
16
16
 
17
17
  varags_setter :fields
18
18
  varags_setter :key_fields
@@ -1,4 +1,3 @@
1
- # coding: utf-8
2
1
  require 'active_support/concern'
3
2
  require_relative 'base'
4
3
 
@@ -1,4 +1,3 @@
1
- # coding: utf-8
2
1
  require 'active_support/concern'
3
2
  require 'redis_counters/dumpers/engine'
4
3
 
@@ -1,4 +1,3 @@
1
- # coding: utf-8
2
1
  require 'forwardable'
3
2
  require 'callbacks_rb'
4
3
  require 'active_support/core_ext/hash/indifferent_access'
@@ -1,4 +1,3 @@
1
- # coding: utf-8
2
1
  require 'active_support/core_ext/hash/indifferent_access'
3
2
  require_relative 'dsl/list'
4
3
 
@@ -1,5 +1,5 @@
1
1
  module RedisCounters
2
2
  module Dumpers
3
- VERSION = '1.0.0'
3
+ VERSION = '1.1.0'.freeze
4
4
  end
5
5
  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/dumpers/version'
@@ -17,20 +16,23 @@ Gem::Specification.new do |spec|
17
16
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
17
  spec.require_paths = ['lib']
19
18
 
20
- spec.add_dependency 'activesupport', '>= 3.0'
21
- spec.add_dependency 'activerecord', '>= 3.0'
22
- spec.add_dependency 'pg'
23
- spec.add_dependency 'redis', '>= 3.0'
24
- spec.add_dependency 'redis-namespace', '>= 1.3'
25
- spec.add_dependency 'callbacks_rb', '>= 0.0.1'
26
- spec.add_dependency 'redis_counters', '>= 1.3'
19
+ spec.add_runtime_dependency 'activesupport', '>= 3.0', '< 5'
20
+ spec.add_runtime_dependency 'activerecord', '>= 3.0'
21
+ spec.add_runtime_dependency 'pg'
22
+ spec.add_runtime_dependency 'redis', '>= 3.0'
23
+ spec.add_runtime_dependency 'redis-namespace', '>= 1.3'
24
+ spec.add_runtime_dependency 'callbacks_rb', '>= 0.0.1'
25
+ spec.add_runtime_dependency 'redis_counters', '>= 1.3'
26
+ spec.add_runtime_dependency 'activerecord-postgres-hstore'
27
+ spec.add_runtime_dependency 'simple_hstore_accessor', '~> 0.2'
27
28
 
28
29
  spec.add_development_dependency 'bundler', '>= 1.7'
29
30
  spec.add_development_dependency 'rake', '>= 10.0'
30
31
  spec.add_development_dependency 'rspec', '>= 3.2'
31
32
  spec.add_development_dependency 'rspec-rails', '>= 3.2'
32
- spec.add_development_dependency 'rspec-given', '>= 3.5'
33
33
  spec.add_development_dependency 'appraisal', '>= 1.0.2'
34
34
  spec.add_development_dependency 'mock_redis'
35
- spec.add_development_dependency 'apress-changelogger'
35
+ spec.add_development_dependency 'combustion'
36
+ spec.add_development_dependency 'pry-byebug'
37
+ spec.add_development_dependency 'test-unit'
36
38
  end
@@ -0,0 +1,2 @@
1
+ class NullableStat < ActiveRecord::Base
2
+ end
@@ -0,0 +1,5 @@
1
+ test:
2
+ adapter: postgresql
3
+ host: <%= ENV.fetch('TEST_DB_HOST', 'localhost') %>
4
+ database: <%= ENV.fetch('TEST_DB_NAME', 'docker') %>
5
+ username: <%= ENV.fetch('TEST_DB_USERNAME', 'docker') %>
@@ -46,4 +46,10 @@ ActiveRecord::Schema.define do
46
46
  end
47
47
 
48
48
  add_index :stats_agg_totals, [:record_id], unique: true
49
+
50
+ create_table :nullable_stats do |t|
51
+ t.date :date, null: false
52
+ t.integer :value, null: false, default: 0
53
+ t.string :payload
54
+ end
49
55
  end
@@ -83,23 +83,23 @@ describe RedisCounters::Dumpers::Engine do
83
83
  dumper.process!(counter, date: date)
84
84
  end
85
85
 
86
- Then { expect(StatsByDay.count).to eq 7 }
87
- And { expect(StatsByDay.where(record_id: 1, column_id: 100, date: prev_date).first.hits).to eq 1 }
88
- And { expect(StatsByDay.where(record_id: 1, column_id: 200, date: prev_date).first.hits).to eq 2 }
89
- And { expect(StatsByDay.where(record_id: 2, column_id: 100, date: prev_date).first.hits).to eq 1 }
90
- And { expect(StatsByDay.where(record_id: 3, column_id: 300, date: prev_date).first.params).to eq("a" => "1") }
91
- And { expect(StatsByDay.where(record_id: 1, column_id: 100, date: date).first.hits).to eq 1 }
92
- And { expect(StatsByDay.where(record_id: 1, column_id: 200, date: date).first.hits).to eq 2 }
93
- And { expect(StatsByDay.where(record_id: 2, column_id: 100, date: date).first.hits).to eq 1 }
94
-
95
- And { expect(StatsTotal.count).to eq 4 }
96
- And { expect(StatsTotal.where(record_id: 1, column_id: 100).first.hits).to eq 2 }
97
- And { expect(StatsTotal.where(record_id: 1, column_id: 200).first.hits).to eq 4 }
98
- And { expect(StatsTotal.where(record_id: 2, column_id: 100).first.hits).to eq 2 }
99
-
100
- And { expect(StatsAggTotal.count).to eq 3 }
101
- And { expect(StatsAggTotal.where(record_id: 1).first.hits).to eq 6 }
102
- And { expect(StatsAggTotal.where(record_id: 2).first.hits).to eq 2 }
86
+ it { expect(StatsByDay.count).to eq 7 }
87
+ it { expect(StatsByDay.where(record_id: 1, column_id: 100, date: prev_date).first.hits).to eq 1 }
88
+ it { expect(StatsByDay.where(record_id: 1, column_id: 200, date: prev_date).first.hits).to eq 2 }
89
+ it { expect(StatsByDay.where(record_id: 2, column_id: 100, date: prev_date).first.hits).to eq 1 }
90
+ it { expect(StatsByDay.where(record_id: 3, column_id: 300, date: prev_date).first.params).to eq("a" => "1") }
91
+ it { expect(StatsByDay.where(record_id: 1, column_id: 100, date: date).first.hits).to eq 1 }
92
+ it { expect(StatsByDay.where(record_id: 1, column_id: 200, date: date).first.hits).to eq 2 }
93
+ it { expect(StatsByDay.where(record_id: 2, column_id: 100, date: date).first.hits).to eq 1 }
94
+
95
+ it { expect(StatsTotal.count).to eq 4 }
96
+ it { expect(StatsTotal.where(record_id: 1, column_id: 100).first.hits).to eq 2 }
97
+ it { expect(StatsTotal.where(record_id: 1, column_id: 200).first.hits).to eq 4 }
98
+ it { expect(StatsTotal.where(record_id: 2, column_id: 100).first.hits).to eq 2 }
99
+
100
+ it { expect(StatsAggTotal.count).to eq 3 }
101
+ it { expect(StatsAggTotal.where(record_id: 1).first.hits).to eq 6 }
102
+ it { expect(StatsAggTotal.where(record_id: 2).first.hits).to eq 2 }
103
103
 
104
104
  context 'with source conditions' do
105
105
  let(:dumper) do
@@ -145,19 +145,19 @@ describe RedisCounters::Dumpers::Engine do
145
145
  end
146
146
  end
147
147
 
148
- Then { expect(StatsByDay.count).to eq 4 }
149
- And { expect(StatsByDay.where(record_id: 1, column_id: 100, date: prev_date).first.hits).to eq 1 }
150
- And { expect(StatsByDay.where(record_id: 2, column_id: 100, date: prev_date).first.hits).to eq 1 }
151
- And { expect(StatsByDay.where(record_id: 1, column_id: 100, date: date).first.hits).to eq 1 }
152
- And { expect(StatsByDay.where(record_id: 2, column_id: 100, date: date).first.hits).to eq 1 }
148
+ it { expect(StatsByDay.count).to eq 4 }
149
+ it { expect(StatsByDay.where(record_id: 1, column_id: 100, date: prev_date).first.hits).to eq 1 }
150
+ it { expect(StatsByDay.where(record_id: 2, column_id: 100, date: prev_date).first.hits).to eq 1 }
151
+ it { expect(StatsByDay.where(record_id: 1, column_id: 100, date: date).first.hits).to eq 1 }
152
+ it { expect(StatsByDay.where(record_id: 2, column_id: 100, date: date).first.hits).to eq 1 }
153
153
 
154
- And { expect(StatsTotal.count).to eq 2 }
155
- And { expect(StatsTotal.where(record_id: 1, column_id: 100).first.hits).to eq 2 }
156
- And { expect(StatsTotal.where(record_id: 2, column_id: 100).first.hits).to eq 2 }
154
+ it { expect(StatsTotal.count).to eq 2 }
155
+ it { expect(StatsTotal.where(record_id: 1, column_id: 100).first.hits).to eq 2 }
156
+ it { expect(StatsTotal.where(record_id: 2, column_id: 100).first.hits).to eq 2 }
157
157
 
158
- And { expect(StatsAggTotal.count).to eq 2 }
159
- And { expect(StatsAggTotal.where(record_id: 1).first.hits).to eq 2 }
160
- And { expect(StatsAggTotal.where(record_id: 2).first.hits).to eq 2 }
158
+ it { expect(StatsAggTotal.count).to eq 2 }
159
+ it { expect(StatsAggTotal.where(record_id: 1).first.hits).to eq 2 }
160
+ it { expect(StatsAggTotal.where(record_id: 2).first.hits).to eq 2 }
161
161
  end
162
162
  end
163
163
 
@@ -209,10 +209,68 @@ describe RedisCounters::Dumpers::Engine do
209
209
  dumper.process!(counter, entity_type: 'Type2')
210
210
  end
211
211
 
212
- Then { expect(Stat.count).to eq 6 }
213
- And { expect(Stat.where(entity_type: 'Type1').count).to eq 5 }
214
- And { expect(Stat.where(entity_type: 'Type2').count).to eq 1 }
215
- And { expect(Stat.where(record_id: 3, entity_type: 'Type1').first.params).to eq("a" => "1") }
212
+ it { expect(Stat.count).to eq 6 }
213
+ it { expect(Stat.where(entity_type: 'Type1').count).to eq 5 }
214
+ it { expect(Stat.where(entity_type: 'Type2').count).to eq 1 }
215
+ it { expect(Stat.where(record_id: 3, entity_type: 'Type1').first.params).to eq("a" => "1") }
216
+ end
217
+
218
+ context 'matching_expr is specified' do
219
+ let(:dumper) do
220
+ RedisCounters::Dumpers::Engine.build do
221
+ name :nullable_stats
222
+
223
+ fields date: :date,
224
+ value: :integer,
225
+ payload: :string
226
+
227
+ destination do
228
+ model NullableStat
229
+ take :date, :value, :payload
230
+ key_fields :date, :value, :payload
231
+ increment_fields :value
232
+ condition 'target.date = :date'
233
+ matching_expr <<-EXPR
234
+ (source.date, coalesce(source.payload, '')) =
235
+ (target.date, coalesce(target.payload, ''))
236
+ EXPR
237
+ end
238
+
239
+ on_before_merge do |dumper, _|
240
+ dumper.common_params = {date: dumper.args[:date].strftime('%Y-%m-%d')}
241
+ end
242
+ end
243
+ end
244
+
245
+ let(:counter) do
246
+ RedisCounters.create_counter(
247
+ Redis.current,
248
+ counter_class: RedisCounters::HashCounter,
249
+ counter_name: :nullable_stats,
250
+ group_keys: [:payload],
251
+ partition_keys: [:date]
252
+ )
253
+ end
254
+
255
+ before do
256
+ counter.increment(date: date_s, value: 1, payload: 'foobar')
257
+ counter.increment(date: date_s, value: 1, payload: nil)
258
+
259
+ dumper.process!(counter, date: date)
260
+ counter.delete_all!
261
+
262
+ counter.increment(date: date_s, value: 1, payload: 'foobar')
263
+ counter.increment(date: date_s, value: 1, payload: nil)
264
+
265
+ dumper.process!(counter, date: date)
266
+ counter.delete_all!
267
+ end
268
+
269
+ it 'treats nulls as equal to each other because they are coalesced to an empty string' do
270
+ expect(NullableStat.count).to eq(2)
271
+ expect(NullableStat.find_by_payload('foobar').value).to eq(2)
272
+ expect(NullableStat.find_by_payload(nil).value).to eq(2)
273
+ end
216
274
  end
217
275
  end
218
276
  end
data/spec/spec_helper.rb CHANGED
@@ -1,5 +1,3 @@
1
- # coding: utf-8
2
- require 'bundler/setup'
3
1
  require 'redis_counters/dumpers'
4
2
 
5
3
  if ::ActiveRecord::VERSION::MAJOR < 4
@@ -11,7 +9,7 @@ require 'combustion'
11
9
  Combustion.initialize! :active_record
12
10
 
13
11
  require 'rspec/rails'
14
- require 'rspec/given'
12
+ require 'pry-byebug'
15
13
 
16
14
  require 'mock_redis'
17
15
  require 'redis'
metadata CHANGED
@@ -1,225 +1,273 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redis_counters-dumpers
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Merkushin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-10-14 00:00:00.000000000 Z
11
+ date: 2017-07-11 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: '3.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
29
  version: '3.0'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '5'
33
+ - !ruby/object:Gem::Dependency
34
+ name: activerecord
19
35
  requirement: !ruby/object:Gem::Requirement
20
36
  requirements:
21
- - - '>='
37
+ - - ">="
22
38
  - !ruby/object:Gem::Version
23
39
  version: '3.0'
24
40
  type: :runtime
25
- name: activesupport
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: '3.0'
47
+ - !ruby/object:Gem::Dependency
48
+ name: pg
33
49
  requirement: !ruby/object:Gem::Requirement
34
50
  requirements:
35
- - - '>='
51
+ - - ">="
36
52
  - !ruby/object:Gem::Version
37
- version: '3.0'
53
+ version: '0'
38
54
  type: :runtime
39
- name: activerecord
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
62
+ name: redis
47
63
  requirement: !ruby/object:Gem::Requirement
48
64
  requirements:
49
- - - '>='
65
+ - - ">="
50
66
  - !ruby/object:Gem::Version
51
- version: '0'
67
+ version: '3.0'
52
68
  type: :runtime
53
- name: pg
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
74
  version: '3.0'
75
+ - !ruby/object:Gem::Dependency
76
+ name: redis-namespace
61
77
  requirement: !ruby/object:Gem::Requirement
62
78
  requirements:
63
- - - '>='
79
+ - - ">="
64
80
  - !ruby/object:Gem::Version
65
- version: '3.0'
81
+ version: '1.3'
66
82
  type: :runtime
67
- name: redis
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
88
  version: '1.3'
89
+ - !ruby/object:Gem::Dependency
90
+ name: callbacks_rb
75
91
  requirement: !ruby/object:Gem::Requirement
76
92
  requirements:
77
- - - '>='
93
+ - - ">="
78
94
  - !ruby/object:Gem::Version
79
- version: '1.3'
95
+ version: 0.0.1
80
96
  type: :runtime
81
- name: redis-namespace
82
97
  prerelease: false
83
- - !ruby/object:Gem::Dependency
84
98
  version_requirements: !ruby/object:Gem::Requirement
85
99
  requirements:
86
- - - '>='
100
+ - - ">="
87
101
  - !ruby/object:Gem::Version
88
102
  version: 0.0.1
103
+ - !ruby/object:Gem::Dependency
104
+ name: redis_counters
89
105
  requirement: !ruby/object:Gem::Requirement
90
106
  requirements:
91
- - - '>='
107
+ - - ">="
92
108
  - !ruby/object:Gem::Version
93
- version: 0.0.1
109
+ version: '1.3'
94
110
  type: :runtime
95
- name: callbacks_rb
96
111
  prerelease: false
97
- - !ruby/object:Gem::Dependency
98
112
  version_requirements: !ruby/object:Gem::Requirement
99
113
  requirements:
100
- - - '>='
114
+ - - ">="
101
115
  - !ruby/object:Gem::Version
102
116
  version: '1.3'
117
+ - !ruby/object:Gem::Dependency
118
+ name: activerecord-postgres-hstore
103
119
  requirement: !ruby/object:Gem::Requirement
104
120
  requirements:
105
- - - '>='
121
+ - - ">="
106
122
  - !ruby/object:Gem::Version
107
- version: '1.3'
123
+ version: '0'
108
124
  type: :runtime
109
- name: redis_counters
110
125
  prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
111
131
  - !ruby/object:Gem::Dependency
132
+ name: simple_hstore_accessor
133
+ requirement: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - "~>"
136
+ - !ruby/object:Gem::Version
137
+ version: '0.2'
138
+ type: :runtime
139
+ prerelease: false
112
140
  version_requirements: !ruby/object:Gem::Requirement
113
141
  requirements:
114
- - - '>='
142
+ - - "~>"
115
143
  - !ruby/object:Gem::Version
116
- version: '1.7'
144
+ version: '0.2'
145
+ - !ruby/object:Gem::Dependency
146
+ name: bundler
117
147
  requirement: !ruby/object:Gem::Requirement
118
148
  requirements:
119
- - - '>='
149
+ - - ">="
120
150
  - !ruby/object:Gem::Version
121
151
  version: '1.7'
122
152
  type: :development
123
- name: bundler
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: '10.0'
158
+ version: '1.7'
159
+ - !ruby/object:Gem::Dependency
160
+ name: rake
131
161
  requirement: !ruby/object:Gem::Requirement
132
162
  requirements:
133
- - - '>='
163
+ - - ">="
134
164
  - !ruby/object:Gem::Version
135
165
  version: '10.0'
136
166
  type: :development
137
- name: rake
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: '3.2'
172
+ version: '10.0'
173
+ - !ruby/object:Gem::Dependency
174
+ name: rspec
145
175
  requirement: !ruby/object:Gem::Requirement
146
176
  requirements:
147
- - - '>='
177
+ - - ">="
148
178
  - !ruby/object:Gem::Version
149
179
  version: '3.2'
150
180
  type: :development
151
- name: rspec
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: '3.2'
187
+ - !ruby/object:Gem::Dependency
188
+ name: rspec-rails
159
189
  requirement: !ruby/object:Gem::Requirement
160
190
  requirements:
161
- - - '>='
191
+ - - ">="
162
192
  - !ruby/object:Gem::Version
163
193
  version: '3.2'
164
194
  type: :development
165
- name: rspec-rails
166
195
  prerelease: false
167
- - !ruby/object:Gem::Dependency
168
196
  version_requirements: !ruby/object:Gem::Requirement
169
197
  requirements:
170
- - - '>='
198
+ - - ">="
171
199
  - !ruby/object:Gem::Version
172
- version: '3.5'
200
+ version: '3.2'
201
+ - !ruby/object:Gem::Dependency
202
+ name: appraisal
173
203
  requirement: !ruby/object:Gem::Requirement
174
204
  requirements:
175
- - - '>='
205
+ - - ">="
176
206
  - !ruby/object:Gem::Version
177
- version: '3.5'
207
+ version: 1.0.2
178
208
  type: :development
179
- name: rspec-given
180
209
  prerelease: false
181
- - !ruby/object:Gem::Dependency
182
210
  version_requirements: !ruby/object:Gem::Requirement
183
211
  requirements:
184
- - - '>='
212
+ - - ">="
185
213
  - !ruby/object:Gem::Version
186
214
  version: 1.0.2
215
+ - !ruby/object:Gem::Dependency
216
+ name: mock_redis
187
217
  requirement: !ruby/object:Gem::Requirement
188
218
  requirements:
189
- - - '>='
219
+ - - ">="
190
220
  - !ruby/object:Gem::Version
191
- version: 1.0.2
221
+ version: '0'
192
222
  type: :development
193
- name: appraisal
194
223
  prerelease: false
195
- - !ruby/object:Gem::Dependency
196
224
  version_requirements: !ruby/object:Gem::Requirement
197
225
  requirements:
198
- - - '>='
226
+ - - ">="
199
227
  - !ruby/object:Gem::Version
200
228
  version: '0'
229
+ - !ruby/object:Gem::Dependency
230
+ name: combustion
201
231
  requirement: !ruby/object:Gem::Requirement
202
232
  requirements:
203
- - - '>='
233
+ - - ">="
204
234
  - !ruby/object:Gem::Version
205
235
  version: '0'
206
236
  type: :development
207
- name: mock_redis
208
237
  prerelease: false
238
+ version_requirements: !ruby/object:Gem::Requirement
239
+ requirements:
240
+ - - ">="
241
+ - !ruby/object:Gem::Version
242
+ version: '0'
209
243
  - !ruby/object:Gem::Dependency
244
+ name: pry-byebug
245
+ requirement: !ruby/object:Gem::Requirement
246
+ requirements:
247
+ - - ">="
248
+ - !ruby/object:Gem::Version
249
+ version: '0'
250
+ type: :development
251
+ prerelease: false
210
252
  version_requirements: !ruby/object:Gem::Requirement
211
253
  requirements:
212
- - - '>='
254
+ - - ">="
213
255
  - !ruby/object:Gem::Version
214
256
  version: '0'
257
+ - !ruby/object:Gem::Dependency
258
+ name: test-unit
215
259
  requirement: !ruby/object:Gem::Requirement
216
260
  requirements:
217
- - - '>='
261
+ - - ">="
218
262
  - !ruby/object:Gem::Version
219
263
  version: '0'
220
264
  type: :development
221
- name: apress-changelogger
222
265
  prerelease: false
266
+ version_requirements: !ruby/object:Gem::Requirement
267
+ requirements:
268
+ - - ">="
269
+ - !ruby/object:Gem::Version
270
+ version: '0'
223
271
  description:
224
272
  email:
225
273
  - bibendi@bk.ru
@@ -227,20 +275,18 @@ executables: []
227
275
  extensions: []
228
276
  extra_rdoc_files: []
229
277
  files:
230
- - .gitignore
231
- - .rspec
278
+ - ".drone.yml"
279
+ - ".gitignore"
280
+ - ".rspec"
232
281
  - Appraisals
233
282
  - CHANGELOG.md
234
283
  - Gemfile
235
284
  - LICENSE.txt
236
- - Makefile
237
285
  - README.md
238
- - Rakefile
239
- - gemfiles/.gitignore
240
- - gemfiles/rails3.1.gemfile
241
- - gemfiles/rails3.2.gemfile
242
- - gemfiles/rails4.0.gemfile
243
- - gemfiles/rails4.1.gemfile
286
+ - dip.yml
287
+ - docker-compose.development.yml
288
+ - docker-compose.drone.yml
289
+ - docker-compose.yml
244
290
  - lib/redis_counters/dumpers.rb
245
291
  - lib/redis_counters/dumpers/destination.rb
246
292
  - lib/redis_counters/dumpers/dsl/base.rb
@@ -251,13 +297,13 @@ files:
251
297
  - lib/redis_counters/dumpers/list.rb
252
298
  - lib/redis_counters/dumpers/version.rb
253
299
  - redis_counters-dumpers.gemspec
300
+ - spec/internal/app/models/nullable_stat.rb
254
301
  - spec/internal/app/models/stat.rb
255
302
  - spec/internal/app/models/stats_agg_total.rb
256
303
  - spec/internal/app/models/stats_by_day.rb
257
304
  - spec/internal/app/models/stats_total.rb
258
- - spec/internal/config/.gitignore
305
+ - spec/internal/config/database.yml
259
306
  - spec/internal/db/schema.rb
260
- - spec/internal/log/.gitignore
261
307
  - spec/lib/redis_counters/dumpers/engine_spec.rb
262
308
  - spec/spec_helper.rb
263
309
  homepage: https://github.com/abak-press/redis_counters-dumpers
@@ -270,27 +316,27 @@ require_paths:
270
316
  - lib
271
317
  required_ruby_version: !ruby/object:Gem::Requirement
272
318
  requirements:
273
- - - '>='
319
+ - - ">="
274
320
  - !ruby/object:Gem::Version
275
321
  version: '0'
276
322
  required_rubygems_version: !ruby/object:Gem::Requirement
277
323
  requirements:
278
- - - '>='
324
+ - - ">="
279
325
  - !ruby/object:Gem::Version
280
326
  version: '0'
281
327
  requirements: []
282
328
  rubyforge_project:
283
- rubygems_version: 2.6.1
329
+ rubygems_version: 2.4.6
284
330
  signing_key:
285
331
  specification_version: 4
286
332
  summary: Dump statistics from Redis to DB
287
333
  test_files:
334
+ - spec/internal/app/models/nullable_stat.rb
288
335
  - spec/internal/app/models/stat.rb
289
336
  - spec/internal/app/models/stats_agg_total.rb
290
337
  - spec/internal/app/models/stats_by_day.rb
291
338
  - spec/internal/app/models/stats_total.rb
292
- - spec/internal/config/.gitignore
339
+ - spec/internal/config/database.yml
293
340
  - spec/internal/db/schema.rb
294
- - spec/internal/log/.gitignore
295
341
  - spec/lib/redis_counters/dumpers/engine_spec.rb
296
342
  - spec/spec_helper.rb
data/Makefile DELETED
@@ -1,28 +0,0 @@
1
- RAILS_ENV = test
2
- BUNDLE = RAILS_ENV=${RAILS_ENV} bundle
3
- BUNDLE_OPTIONS = -j 2
4
- RSPEC = rspec
5
- APPRAISAL = appraisal
6
-
7
- all: test
8
-
9
- test: config/database bundler/install appraisal/install
10
- ${BUNDLE} exec ${APPRAISAL} ${RSPEC} spec 2>&1
11
-
12
- config/database:
13
- touch spec/internal/config/database.yml
14
- echo 'test:' >> spec/internal/config/database.yml
15
- echo ' adapter: postgresql' >> spec/internal/config/database.yml
16
- echo ' database: docker' >> spec/internal/config/database.yml
17
- echo ' username: docker' >> spec/internal/config/database.yml
18
- echo ' host: localhost' >> spec/internal/config/database.yml
19
- echo ' min_messages: warning' >> spec/internal/config/database.yml
20
-
21
- bundler/install:
22
- if ! gem list bundler -i > /dev/null; then \
23
- gem install bundler; \
24
- fi
25
- ${BUNDLE} install ${BUNDLE_OPTIONS}
26
-
27
- appraisal/install:
28
- ${BUNDLE} exec ${APPRAISAL} install
data/Rakefile DELETED
@@ -1,2 +0,0 @@
1
- require "bundler/gem_tasks"
2
-
data/gemfiles/.gitignore DELETED
@@ -1 +0,0 @@
1
- *.gemfile.lock
@@ -1,12 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "activesupport", "~> 3.1.0"
6
- gem "activerecord", "~> 3.1.0"
7
-
8
- group :development, :test do
9
- gem "combustion", :github => "pat/combustion", :ref => "7d0d24c3f36ce0eb336177fc493be0721bc26665"
10
- end
11
-
12
- gemspec :path => "../"
@@ -1,12 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "activesupport", "~> 3.2.0"
6
- gem "activerecord", "~> 3.2.0"
7
-
8
- group :development, :test do
9
- gem "combustion", :github => "pat/combustion", :ref => "7d0d24c3f36ce0eb336177fc493be0721bc26665"
10
- end
11
-
12
- gemspec :path => "../"
@@ -1,12 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "activesupport", "~> 4.0.0"
6
- gem "activerecord", "~> 4.0.0"
7
-
8
- group :development, :test do
9
- gem "combustion", :github => "pat/combustion", :ref => "7d0d24c3f36ce0eb336177fc493be0721bc26665"
10
- end
11
-
12
- gemspec :path => "../"
@@ -1,12 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "activesupport", "~> 4.1.0"
6
- gem "activerecord", "~> 4.1.0"
7
-
8
- group :development, :test do
9
- gem "combustion", :github => "pat/combustion", :ref => "7d0d24c3f36ce0eb336177fc493be0721bc26665"
10
- end
11
-
12
- gemspec :path => "../"
@@ -1 +0,0 @@
1
- database.yml
@@ -1 +0,0 @@
1
- *.log