belly_wash 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: bce82093a4bc9682241ec228c4b40c0c0bb4e97677dfd9748f89bb8f940f412e
4
+ data.tar.gz: 83b1793de32e46e40402ecb28e28d837140d0e64053b156de08ccf1848f2f247
5
+ SHA512:
6
+ metadata.gz: 32979a7d2bbf496b0c75cedc1829c5973ece3a6bcf1a33b8a5bfffc372456db3656ba8520be825859ba2f7493372a18ad2804273f28d80e6cf2a115dae141786
7
+ data.tar.gz: d7497357caeb43ee083ff07bd85bb6d5274d93e5dd930d8391d6edaaa483e3acd4d2d086ceab577a62d2cfac1aec6a45621bdd2d5547acbe0fb6304b09811a8d
@@ -0,0 +1,12 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+
10
+ # rspec failure tracking
11
+ .rspec_status
12
+ /.byebug_history
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
@@ -0,0 +1,14 @@
1
+ AllCops:
2
+ TargetRubyVersion: '3.0.0'
3
+ Exclude:
4
+ - 'bin/**/*'
5
+ - 'Rakefile'
6
+ - 'spec/**/*'
7
+ - 'Gemfile'
8
+ - belly_wash.gemspec
9
+
10
+ Style/Documentation:
11
+ Enabled: false
12
+ #
13
+ # Layout/LineLength:
14
+ # Max: 80
@@ -0,0 +1 @@
1
+ ruby-3.0.0
@@ -0,0 +1 @@
1
+ ruby 3.0.0
@@ -0,0 +1,6 @@
1
+ ---
2
+ language: ruby
3
+ cache: bundler
4
+ rvm:
5
+ - 2.7.0
6
+ before_install: gem install bundler -v 2.1.4
data/Gemfile ADDED
@@ -0,0 +1,7 @@
1
+ source "https://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in belly_wash.gemspec
4
+ gemspec
5
+
6
+ gem "rake", "~> 12.0"
7
+ gem "rspec", "~> 3.0"
@@ -0,0 +1,66 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ belly_wash (0.1.1)
5
+ redis (>= 4.2)
6
+ tzinfo (~> 2.0)
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ ast (2.4.2)
12
+ byebug (11.1.3)
13
+ concurrent-ruby (1.1.8)
14
+ diff-lcs (1.4.4)
15
+ dotenv (2.7.6)
16
+ parallel (1.20.1)
17
+ parser (3.0.0.0)
18
+ ast (~> 2.4.1)
19
+ rainbow (3.0.0)
20
+ rake (12.3.3)
21
+ redis (4.2.5)
22
+ regexp_parser (2.0.3)
23
+ rexml (3.2.4)
24
+ rspec (3.10.0)
25
+ rspec-core (~> 3.10.0)
26
+ rspec-expectations (~> 3.10.0)
27
+ rspec-mocks (~> 3.10.0)
28
+ rspec-core (3.10.1)
29
+ rspec-support (~> 3.10.0)
30
+ rspec-expectations (3.10.1)
31
+ diff-lcs (>= 1.2.0, < 2.0)
32
+ rspec-support (~> 3.10.0)
33
+ rspec-mocks (3.10.1)
34
+ diff-lcs (>= 1.2.0, < 2.0)
35
+ rspec-support (~> 3.10.0)
36
+ rspec-support (3.10.1)
37
+ rubocop (1.0.0)
38
+ parallel (~> 1.10)
39
+ parser (>= 2.7.1.5)
40
+ rainbow (>= 2.2.2, < 4.0)
41
+ regexp_parser (>= 1.8)
42
+ rexml
43
+ rubocop-ast (>= 0.6.0)
44
+ ruby-progressbar (~> 1.7)
45
+ unicode-display_width (>= 1.4.0, < 2.0)
46
+ rubocop-ast (1.4.1)
47
+ parser (>= 2.7.1.5)
48
+ ruby-progressbar (1.11.0)
49
+ tzinfo (2.0.4)
50
+ concurrent-ruby (~> 1.0)
51
+ unicode-display_width (1.7.0)
52
+
53
+ PLATFORMS
54
+ x86_64-darwin-20
55
+
56
+ DEPENDENCIES
57
+ belly_wash!
58
+ bundler (~> 2.1)
59
+ byebug
60
+ dotenv
61
+ rake (~> 12.0)
62
+ rspec (~> 3.0)
63
+ rubocop (= 1.0.0)
64
+
65
+ BUNDLED WITH
66
+ 2.2.3
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2021 Jozef Vaclavik
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,78 @@
1
+ # BellyWash
2
+
3
+ BellyWash ~ way too simple analytics backed by Redis, Postgres, MongoDB, Google Analytics, Segment, or whatever*.
4
+
5
+ BellyWash is a simple timeline analytics plugin that helps you track custom metrics. Automatically increments counters for each enabled range. It supports timezones and different week beginning.
6
+
7
+ * TBH only Redis for now </3
8
+
9
+ ## Installation
10
+
11
+ Add this line to your application's Gemfile:
12
+
13
+ ```ruby
14
+ gem 'belly_wash'
15
+ ```
16
+
17
+ And then execute:
18
+
19
+ $ bundle install
20
+
21
+ Or install it yourself as:
22
+
23
+ $ gem install belly_wash
24
+
25
+ ## Usage
26
+
27
+ You don't need to use it with Rails, but you still need to run `BellyWash.configure`. If youre running it with Rails, create `config/initializers/belly_wash.rb` and configure the gem.
28
+
29
+ ```ruby
30
+ BellyWash.configure do |config|
31
+ config.driver = BellyWash::Driver::Redis.new
32
+ config.track_ranges = [:hour, :day]
33
+ config.time_zone = 'Europe/Bratislava'
34
+ config.beginning_of_week = :monday
35
+ end
36
+ ```
37
+
38
+ Available ranges are `:minute`, `:hour`, `:day`, `:week`, `:month`, `:quarter`, `:year`.
39
+
40
+ Now track your first metrics
41
+ ```ruby
42
+ BellyWash.track(key: 'event::logs', at: Time.zone.now, values: {count: 1, duration: 2, lines: 241})
43
+ => [{2021-01-25 16:00:00 +0100=>{:count=>1, :duration=>2, :lines=>241}}, {2021-01-25 00:00:00 +0100=>{:count=>1, :duration=>2, :lines=>241}}]
44
+ # or do it few more times
45
+ BellyWash.track(key: 'event::logs', at: Time.zone.now, values: {count: 1, duration: 1, lines: 56})
46
+ => [{2021-01-25 16:00:00 +0100=>{:count=>1, :duration=>1, :lines=>56}}, {2021-01-25 00:00:00 +0100=>{:count=>1, :duration=>1, :lines=>56}}]
47
+ BellyWash.track(key: 'event::logs', at: Time.zone.now, values: {count: 1, duration: 5, lines: 361})
48
+ => [{2021-01-25 16:00:00 +0100=>{:count=>1, :duration=>5, :lines=>361}}, {2021-01-25 00:00:00 +0100=>{:count=>1, :duration=>5, :lines=>361}}]
49
+ ```
50
+
51
+ You can then retrieve your values for specific `range`.
52
+ ```ruby
53
+ BellyWash.values_for(key: 'event::logs', from: Time.now.beginning_of_day, to: Time.now.end_of_day, range: :hour)
54
+ => [{2021-01-25 00:00:00 +0100=>{"count"=>3, "duration"=>8, "lines"=>658}}]
55
+ ```
56
+
57
+ You can also store nested counters like
58
+ ```ruby
59
+ BellyWash.track(key: 'event::logs', at: Time.zone.now, values: {
60
+ count: 1,
61
+ duration: {
62
+ parsing: 21,
63
+ compression: 8,
64
+ upload: 1
65
+ },
66
+ lines: 25432754
67
+ })
68
+ ```
69
+
70
+ ## Development
71
+
72
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
73
+
74
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
75
+
76
+ ## Contributing
77
+
78
+ Bug reports and pull requests are welcome on GitHub at https://github.com/jozefvaclavik/belly_wash.
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
@@ -0,0 +1,36 @@
1
+ require_relative 'lib/belly_wash/version'
2
+
3
+ Gem::Specification.new do |spec|
4
+ spec.name = 'belly_wash'
5
+ spec.version = BellyWash::VERSION
6
+ spec.authors = ['Jozef Vaclavik']
7
+ spec.email = ['jozef@hey.com']
8
+
9
+ spec.summary = 'Simple analytics for tracking events and status counts'
10
+ spec.description = 'BellyWash allows you to report statistics and cache'\
11
+ 'them under differentt time-ranges (day, week, ...)'\
12
+ 'while storing them with different backend driver.'
13
+ spec.homepage = "https://github.com/jozefvaclavik/belly_wash"
14
+ spec.required_ruby_version = Gem::Requirement.new('>= 3.0')
15
+
16
+ spec.metadata['homepage_uri'] = spec.homepage
17
+ spec.metadata['source_code_uri'] = "https://github.com/jozefvaclavik/belly_wash"
18
+
19
+ # Specify which files should be added to the gem when it is released.
20
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
21
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
22
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
23
+ end
24
+ spec.bindir = 'exe'
25
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
26
+ spec.require_paths = ['lib']
27
+
28
+ spec.add_development_dependency('bundler', '~> 2.1')
29
+ spec.add_development_dependency('byebug', '>= 0')
30
+ spec.add_development_dependency('dotenv')
31
+ spec.add_development_dependency('rake', '~> 13.0')
32
+ spec.add_development_dependency('rspec', '~> 3.2')
33
+ spec.add_development_dependency('rubocop', '1.0.0')
34
+ spec.add_runtime_dependency('redis', '>= 4.2')
35
+ spec.add_runtime_dependency('tzinfo', '~> 2.0')
36
+ end
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "belly_wash"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start(__FILE__)
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'belly_wash/driver/redis'
4
+ require 'belly_wash/mixins/packer'
5
+ require 'belly_wash/nocturnal'
6
+ require 'belly_wash/client'
7
+ require 'belly_wash/configuration'
8
+ require 'belly_wash/resource'
9
+ require 'belly_wash/version'
10
+
11
+ module BellyWash
12
+ class Error < StandardError; end
13
+
14
+ def self.config
15
+ @config ||= Configuration.new
16
+ end
17
+
18
+ def self.configure
19
+ yield(config)
20
+
21
+ config
22
+ end
23
+
24
+ def self.client
25
+ @client ||= Client.new
26
+ end
27
+
28
+ def self.track(key:, at:, values:)
29
+ config.ranges.map do |range|
30
+ Resource.new(
31
+ key: key,
32
+ range: range,
33
+ at: Nocturnal.new(at).send("beginning_of_#{range}")
34
+ ).increment(**values)
35
+ end
36
+ end
37
+
38
+ def self.values_for(key:, from:, to:, range:)
39
+ Nocturnal.timeline(from: from, to: to, range: range).map do |at|
40
+ Resource.new(key: key, range: range, at: at).values
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BellyWash
4
+ class Client
5
+ def get(key:)
6
+ driver.get(key: key)
7
+ end
8
+
9
+ def inc(key:, **values)
10
+ driver.inc(key: key, **values)
11
+ end
12
+
13
+ private
14
+
15
+ def driver
16
+ @driver ||= BellyWash.config.driver
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'tzinfo'
4
+
5
+ module BellyWash
6
+ class Configuration
7
+ attr_accessor :driver, :track_ranges, :separator, :time_zone,
8
+ :beginning_of_week
9
+
10
+ def initialize
11
+ @separator = '::'
12
+ @ranges = %i[minute hour day week month quarter year]
13
+ @beginning_of_week = :monday
14
+ end
15
+
16
+ def tz
17
+ TZInfo::Timezone.get(@time_zone)
18
+ rescue TZInfo::InvalidTimezoneIdentifier => e
19
+ puts "BellyWash: #{e} - #{time_zone_name}; Defaulting to GMT."
20
+
21
+ TZInfo::Timezone.get('GMT')
22
+ end
23
+
24
+ def ranges
25
+ return @ranges if blank?(track_ranges)
26
+
27
+ @ranges & track_ranges
28
+ end
29
+
30
+ private
31
+
32
+ def blank?(obj)
33
+ obj.respond_to?(:empty?) ? !!obj.empty? : !obj
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'redis'
4
+
5
+ module BellyWash
6
+ module Driver
7
+ class Redis
8
+ attr_accessor :prefix
9
+
10
+ def initialize(client = ::Redis.current, prefix: 'bw')
11
+ @client = client
12
+ @prefix = prefix
13
+ end
14
+
15
+ def inc(key:, **values)
16
+ pkey = [@prefix, key].join('::')
17
+ values.each do |k, c|
18
+ @client.hincrby(pkey, k, c)
19
+ end
20
+ end
21
+
22
+ def get(key:)
23
+ pkey = [@prefix, key].join('::')
24
+ @client.hgetall(pkey)
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BellyWash
4
+ module Mixins
5
+ module Packer
6
+ def self.included(base)
7
+ base.extend ClassMethods
8
+ end
9
+
10
+ module ClassMethods
11
+ def pack(hash:, prefix: nil)
12
+ hash.inject({}) do |o, (k, v)|
13
+ key = [prefix, k].compact.join('.')
14
+ if v.instance_of?(Hash)
15
+ o.update(
16
+ pack(hash: v, prefix: key)
17
+ )
18
+ else
19
+ o.update({ key => v })
20
+ end
21
+ end
22
+ end
23
+
24
+ def unpack(hash:)
25
+ hash.inject({}) do |out, (key, v)|
26
+ deep_merge(
27
+ out,
28
+ key.split('.').reverse.inject(v.to_i) { |o, k| { k => o } }
29
+ )
30
+ end
31
+ end
32
+
33
+ def deep_merge(this_hash, other_hash, &block)
34
+ deep_merge!(this_hash.dup, other_hash, &block)
35
+ end
36
+
37
+ def deep_merge!(this_hash, other_hash, &block)
38
+ this_hash.merge!(other_hash) do |key, this_val, other_val|
39
+ if this_val.is_a?(Hash) && other_val.is_a?(Hash)
40
+ deep_merge(this_val, other_val, &block)
41
+ elsif block_given?
42
+ block.call(key, this_val, other_val)
43
+ else
44
+ other_val
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,124 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BellyWash
4
+ class Nocturnal
5
+ DAYS_INTO_WEEK = {
6
+ sunday: 0, monday: 1, tuesday: 2, wednesday: 3,
7
+ thursday: 4, friday: 5, saturday: 6
8
+ }.freeze
9
+
10
+ def self.timeline(from:, to:, range:)
11
+ list = []
12
+ item = new(from).send("beginning_of_#{range}")
13
+ while item < to
14
+ list << item
15
+ item = BellyWash::Nocturnal.new(list.last).send("next_#{range}")
16
+ end
17
+ list
18
+ end
19
+
20
+ def initialize(at)
21
+ @at = at
22
+ @tz = BellyWash.config.tz
23
+ end
24
+
25
+ def change(**fractions)
26
+ Time.new(
27
+ fractions.fetch(:year, @at.year),
28
+ fractions.fetch(:month, @at.month),
29
+ fractions.fetch(:day, @at.day),
30
+ fractions.fetch(:hour, @at.hour),
31
+ fractions.fetch(:minute, @at.min),
32
+ 0, # second
33
+ @tz.utc_offset
34
+ )
35
+ end
36
+
37
+ def beginning_of_minute
38
+ change
39
+ end
40
+
41
+ def next_minute
42
+ Nocturnal.new(
43
+ beginning_of_minute + 60
44
+ ).beginning_of_minute
45
+ end
46
+
47
+ def beginning_of_hour
48
+ change(minute: 0)
49
+ end
50
+
51
+ def next_hour
52
+ Nocturnal.new(
53
+ beginning_of_hour + 60 * 60
54
+ ).beginning_of_hour
55
+ end
56
+
57
+ def beginning_of_day
58
+ change(hour: 0, minute: 0)
59
+ end
60
+
61
+ def next_day
62
+ Nocturnal.new(
63
+ beginning_of_day + 60 * 60 * 24
64
+ ).beginning_of_day
65
+ end
66
+
67
+ def beginning_of_week
68
+ today = beginning_of_day
69
+
70
+ (today.to_date - days_to_week_start).to_time
71
+ end
72
+
73
+ def next_week
74
+ Nocturnal.new(
75
+ beginning_of_week + 60 * 60 * 24 * 7
76
+ ).beginning_of_week
77
+ end
78
+
79
+ def days_to_week_start
80
+ start_day_number = DAYS_INTO_WEEK.fetch(
81
+ BellyWash.config.beginning_of_week
82
+ )
83
+
84
+ (@at.wday - start_day_number) % 7
85
+ end
86
+
87
+ def beginning_of_month
88
+ change(day: 1, hour: 0, minute: 0)
89
+ end
90
+
91
+ def next_month
92
+ Nocturnal.new(
93
+ beginning_of_month + 60 * 60 * 24 * 31
94
+ ).beginning_of_month
95
+ end
96
+
97
+ def beginning_of_quarter
98
+ first_quarter_month = @at.month - (2 + @at.month) % 3
99
+
100
+ change(
101
+ month: first_quarter_month,
102
+ day: 1,
103
+ hour: 0,
104
+ minute: 0
105
+ )
106
+ end
107
+
108
+ def next_quarter
109
+ Nocturnal.new(
110
+ beginning_of_quarter + 60 * 60 * 24 * 31 * 3
111
+ ).beginning_of_quarter
112
+ end
113
+
114
+ def beginning_of_year
115
+ change(month: 1, day: 1, hour: 0, minute: 0)
116
+ end
117
+
118
+ def next_year
119
+ Nocturnal.new(
120
+ beginning_of_year + 60 * 60 * 24 * 31 * 12
121
+ ).beginning_of_year
122
+ end
123
+ end
124
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BellyWash
4
+ class Resource
5
+ include Mixins::Packer
6
+ attr_accessor :key, :range, :at
7
+
8
+ def initialize(key:, range:, at:)
9
+ @key = key
10
+ @range = range
11
+ @at = at
12
+ end
13
+
14
+ def full_key
15
+ [key, range, at.to_i].join(BellyWash.config.separator)
16
+ end
17
+
18
+ def increment(**values)
19
+ packed = self.class.pack(hash: values)
20
+ BellyWash.client.inc(key: full_key, **packed)
21
+ {
22
+ at => values
23
+ }
24
+ end
25
+
26
+ def values
27
+ {
28
+ at => self.class.unpack(
29
+ hash: BellyWash.client.get(key: full_key)
30
+ )
31
+ }
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BellyWash
4
+ VERSION = '0.1.1'
5
+ end
metadata ADDED
@@ -0,0 +1,179 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: belly_wash
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Jozef Vaclavik
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2021-01-25 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.1'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.1'
27
+ - !ruby/object:Gem::Dependency
28
+ name: byebug
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: dotenv
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '13.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '13.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '3.2'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '3.2'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rubocop
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '='
88
+ - !ruby/object:Gem::Version
89
+ version: 1.0.0
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '='
95
+ - !ruby/object:Gem::Version
96
+ version: 1.0.0
97
+ - !ruby/object:Gem::Dependency
98
+ name: redis
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '4.2'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '4.2'
111
+ - !ruby/object:Gem::Dependency
112
+ name: tzinfo
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '2.0'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '2.0'
125
+ description: BellyWash allows you to report statistics and cachethem under differentt
126
+ time-ranges (day, week, ...)while storing them with different backend driver.
127
+ email:
128
+ - jozef@hey.com
129
+ executables: []
130
+ extensions: []
131
+ extra_rdoc_files: []
132
+ files:
133
+ - ".gitignore"
134
+ - ".rspec"
135
+ - ".rubocop.yml"
136
+ - ".ruby-version"
137
+ - ".tool-versions"
138
+ - ".travis.yml"
139
+ - Gemfile
140
+ - Gemfile.lock
141
+ - LICENSE
142
+ - README.md
143
+ - Rakefile
144
+ - belly_wash.gemspec
145
+ - bin/console
146
+ - bin/setup
147
+ - lib/belly_wash.rb
148
+ - lib/belly_wash/client.rb
149
+ - lib/belly_wash/configuration.rb
150
+ - lib/belly_wash/driver/redis.rb
151
+ - lib/belly_wash/mixins/packer.rb
152
+ - lib/belly_wash/nocturnal.rb
153
+ - lib/belly_wash/resource.rb
154
+ - lib/belly_wash/version.rb
155
+ homepage: https://github.com/jozefvaclavik/belly_wash
156
+ licenses: []
157
+ metadata:
158
+ homepage_uri: https://github.com/jozefvaclavik/belly_wash
159
+ source_code_uri: https://github.com/jozefvaclavik/belly_wash
160
+ post_install_message:
161
+ rdoc_options: []
162
+ require_paths:
163
+ - lib
164
+ required_ruby_version: !ruby/object:Gem::Requirement
165
+ requirements:
166
+ - - ">="
167
+ - !ruby/object:Gem::Version
168
+ version: '3.0'
169
+ required_rubygems_version: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ requirements: []
175
+ rubygems_version: 3.2.3
176
+ signing_key:
177
+ specification_version: 4
178
+ summary: Simple analytics for tracking events and status counts
179
+ test_files: []