redis_counters-dumpers 1.0.0 → 1.1.0

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
  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