trifle-stats 0.3.2 → 1.0.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.
@@ -0,0 +1,13 @@
1
+ # Enable Powerlevel10k instant prompt. Should stay close to the top of ~/.zshrc.
2
+ # Initialization code that may require console input (password prompts, [y/n]
3
+ # confirmations, etc.) must go above this block; everything else may go below.
4
+ if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then
5
+ source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh"
6
+ fi
7
+
8
+ source /root/powerlevel10k/powerlevel10k.zsh-theme
9
+
10
+ # To customize prompt, run `p10k configure` or edit ~/.p10k.zsh.
11
+ [[ ! -f /root/.p10k.zsh ]] || source /root/.p10k.zsh
12
+
13
+ POWERLEVEL9K_DISABLE_CONFIGURATION_WIZARD=true
@@ -0,0 +1,54 @@
1
+ FROM debian:latest
2
+
3
+ ENV TZ=Europe/Bratislava
4
+ RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
5
+
6
+ # install ubuntu packages
7
+ RUN apt-get update -q \
8
+ && apt-get install -y \
9
+ build-essential \
10
+ apt-transport-https \
11
+ zsh \
12
+ libpq-dev \
13
+ git \
14
+ curl \
15
+ wget \
16
+ unzip \
17
+ gpg \
18
+ gnupg2 \
19
+ locales \
20
+ autoconf \
21
+ libssl-dev \
22
+ libreadline-dev \
23
+ zlib1g-dev \
24
+ tmux \
25
+ htop \
26
+ vim \
27
+ && apt-get clean
28
+
29
+ #set the locale
30
+ RUN locale-gen en_US.UTF-8
31
+ ENV LANG en_US.UTF-8
32
+ ENV LANGUAGE en_US:en
33
+ ENV LC_ALL en_US.UTF-8
34
+
35
+ RUN wget https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh -O - | zsh || true
36
+ RUN git clone --depth=1 https://github.com/romkatv/powerlevel10k.git /root/powerlevel10k
37
+ COPY .zshrc /root/.zshrc
38
+ COPY .p10k.zsh /root/p10k.zsh
39
+
40
+ #install asdf
41
+ ENV ASDF_ROOT /root/.asdf
42
+ ENV PATH "${ASDF_ROOT}/bin:${ASDF_ROOT}/shims:$PATH"
43
+ RUN git clone https://github.com/asdf-vm/asdf.git ${ASDF_ROOT} --branch v0.10.0
44
+
45
+ RUN asdf plugin-add ruby https://github.com/asdf-vm/asdf-ruby.git
46
+
47
+ # install ruby
48
+ ENV RUBY_VERSION 3.0.0
49
+ RUN ASDF_RUBY_BUILD_VERSION=v20201225 asdf install ruby ${RUBY_VERSION} \
50
+ && asdf global ruby ${RUBY_VERSION}
51
+
52
+ RUN gem install bundler
53
+
54
+ CMD ["zsh"]
File without changes
File without changes
@@ -9,29 +9,28 @@ name: Ruby
9
9
 
10
10
  on:
11
11
  push:
12
- branches: [ main ]
12
+ branches: [main]
13
13
  pull_request:
14
- branches: [ main ]
14
+ branches: [main]
15
15
 
16
16
  jobs:
17
17
  test:
18
-
19
18
  runs-on: ubuntu-latest
20
19
  strategy:
21
20
  matrix:
22
- ruby-version: ['2.6', '2.7', '3.0']
21
+ ruby-version: ["3.0"]
23
22
 
24
23
  steps:
25
- - uses: actions/checkout@v2
26
- - name: Set up Ruby
27
- # To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
28
- # change this to (see https://github.com/ruby/setup-ruby#versioning):
29
- # uses: ruby/setup-ruby@v1
30
- uses: ruby/setup-ruby@473e4d8fe5dd94ee328fdfca9f8c9c7afc9dae5e
31
- with:
32
- ruby-version: ${{ matrix.ruby-version }}
33
- bundler-cache: true # runs 'bundle install' and caches installed gems automatically
34
- - name: Rspec
35
- run: bundle exec rspec
36
- - name: Rubocop
37
- run: bundle exec rubocop
24
+ - uses: actions/checkout@v2
25
+ - name: Set up Ruby
26
+ # To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
27
+ # change this to (see https://github.com/ruby/setup-ruby#versioning):
28
+ # uses: ruby/setup-ruby@v1
29
+ uses: ruby/setup-ruby@473e4d8fe5dd94ee328fdfca9f8c9c7afc9dae5e
30
+ with:
31
+ ruby-version: ${{ matrix.ruby-version }}
32
+ bundler-cache: true # runs 'bundle install' and caches installed gems automatically
33
+ - name: Rspec
34
+ run: bundle exec rspec
35
+ - name: Rubocop
36
+ run: bundle exec rubocop
data/.gitpod.yml CHANGED
@@ -1,5 +1,5 @@
1
1
  image:
2
- file: .gitpod/Dockerfile
2
+ file: .devops/docker/gitpod/Dockerfile
3
3
  tasks:
4
4
  - init: bundle install
5
5
  command: ./bin/console
data/Gemfile.lock CHANGED
@@ -1,26 +1,27 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- trifle-stats (0.3.2)
5
- pg (>= 1.2)
6
- redis (>= 4.2)
4
+ trifle-stats (1.0.0)
7
5
  tzinfo (~> 2.0)
8
6
 
9
7
  GEM
10
8
  remote: https://rubygems.org/
11
9
  specs:
12
10
  ast (2.4.2)
11
+ bson (4.12.1)
13
12
  byebug (11.1.3)
14
- concurrent-ruby (1.1.8)
13
+ concurrent-ruby (1.1.10)
15
14
  diff-lcs (1.4.4)
16
15
  dotenv (2.7.6)
16
+ mongo (2.14.0)
17
+ bson (>= 4.8.2, < 5.0.0)
17
18
  parallel (1.20.1)
18
19
  parser (3.0.0.0)
19
20
  ast (~> 2.4.1)
20
21
  pg (1.2.3)
21
22
  rainbow (3.0.0)
22
23
  rake (12.3.3)
23
- redis (4.2.5)
24
+ redis (4.3.1)
24
25
  regexp_parser (2.0.3)
25
26
  rexml (3.2.4)
26
27
  rspec (3.10.0)
@@ -60,7 +61,10 @@ DEPENDENCIES
60
61
  bundler (~> 2.1)
61
62
  byebug
62
63
  dotenv
64
+ mongo (>= 2.14.0)
65
+ pg (>= 1.2)
63
66
  rake (~> 12.0)
67
+ redis (>= 4.2)
64
68
  rspec (~> 3.0)
65
69
  rubocop (= 1.0.0)
66
70
  trifle-stats!
data/README.md CHANGED
@@ -8,7 +8,7 @@ Simple analytics backed by Redis, Postgres, MongoDB, Google Analytics, Segment,
8
8
 
9
9
  `Trifle::Stats` is a _way too_ simple timeline analytics that helps you track custom metrics. Automatically increments counters for each enabled range. It supports timezones and different week beginning.
10
10
 
11
- [^1]: TBH only Redis for now 💔.
11
+ [^1]: TBH only Redis, Postgres and MongoDB for now 💔.
12
12
 
13
13
  ## Documentation
14
14
 
@@ -24,11 +24,22 @@ gem 'trifle-stats'
24
24
 
25
25
  And then execute:
26
26
 
27
- $ bundle install
27
+ ```sh
28
+ $ bundle install
29
+ ```
28
30
 
29
31
  Or install it yourself as:
30
32
 
31
- $ gem install trifle-stats
33
+ ```sh
34
+ $ gem install trifle-stats
35
+ ```
36
+
37
+ Depending on driver you would like to use, make sure you add required gems into your `Gemfile`.
38
+ ```ruby
39
+ gem 'mongo', '>= 2.14.0'
40
+ gem 'pg', '>= 1.2'
41
+ gem 'redis', '>= 4.2'
42
+ ```
32
43
 
33
44
  ## Usage
34
45
 
@@ -45,25 +56,72 @@ end
45
56
 
46
57
  ### Track values
47
58
 
48
- Available ranges are `:minute`, `:hour`, `:day`, `:week`, `:month`, `:quarter`, `:year`.
59
+ Track your first metrics
49
60
 
50
- Now track your first metrics
51
61
  ```ruby
52
62
  Trifle::Stats.track(key: 'event::logs', at: Time.now, values: {count: 1, duration: 2, lines: 241})
53
63
  => [{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}}]
54
- # or do it few more times
64
+ ```
65
+
66
+ Then do it few more times
67
+
68
+ ```ruby
55
69
  Trifle::Stats.track(key: 'event::logs', at: Time.now, values: {count: 1, duration: 1, lines: 56})
56
70
  => [{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}}]
57
71
  Trifle::Stats.track(key: 'event::logs', at: Time.now, values: {count: 1, duration: 5, lines: 361})
58
72
  => [{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}}]
59
73
  ```
60
74
 
61
- ### Get values
75
+ You can also store nested counters like
76
+
77
+ ```ruby
78
+ Trifle::Stats.track(key: 'event::logs', at: Time.now, values: {
79
+ count: 1,
80
+ duration: {
81
+ parsing: 21,
82
+ compression: 8,
83
+ upload: 1
84
+ },
85
+ lines: 25432754
86
+ })
87
+ ```
88
+
89
+ #### Get values
90
+
91
+ Retrieve your values for specific `range`. Adding increments above will return sum of all the values you've tracked.
92
+
93
+ ```ruby
94
+ Trifle::Stats.values(key: 'event::logs', from: Time.now, to: Time.now, range: :day)
95
+ => {:at=>[2021-01-25 00:00:00 +0200], :values=>[{"count"=>3, "duration"=>8, "lines"=>658}]}
96
+ ```
97
+
98
+ ### Assert values
99
+
100
+ Asserting values works same way like incrementing, but instead of increment, it sets the value. Duh.
101
+
102
+ Set your first metrics
103
+
104
+ ```ruby
105
+ Trifle::Stats.assert(key: 'event::logs', at: Time.now, values: {count: 1, duration: 2, lines: 241})
106
+ => [{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}}]
107
+ ```
108
+
109
+ Then do it few more times
110
+
111
+ ```ruby
112
+ Trifle::Stats.assert(key: 'event::logs', at: Time.now, values: {count: 1, duration: 1, lines: 56})
113
+ => [{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}}]
114
+ Trifle::Stats.assert(key: 'event::logs', at: Time.now, values: {count: 1, duration: 5, lines: 361})
115
+ => [{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}}]
116
+ ```
117
+
118
+ #### Get values
119
+
120
+ Retrieve your values for specific `range`. As you just used `assert` above, it will return latest value you've asserted.
62
121
 
63
- Retrieve your values for specific `range`.
64
122
  ```ruby
65
123
  Trifle::Stats.values(key: 'event::logs', from: Time.now, to: Time.now, range: :day)
66
- => [{2021-01-25 00:00:00 +0100=>{"count"=>3, "duration"=>8, "lines"=>658}}]
124
+ => {:at=>[2021-01-25 00:00:00 +0200], :values=>[{"count"=>1, "duration"=>5, "lines"=>361}]}
67
125
  ```
68
126
 
69
127
  ## Contributing
@@ -2,9 +2,9 @@
2
2
 
3
3
  Driver is a wrapper class that persists and retrieves values from backend. It needs to implement:
4
4
 
5
- - `inc(key:, **values)` method add values
5
+ - `inc(key:, **values)` method increment values
6
6
  - `set(key:, **values)` method set values
7
- - `get(key:)` method to retrieve values
7
+ - `get(keys:)` method to retrieve values
8
8
 
9
9
  ## Documentation
10
10
 
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'mongo'
4
+ require_relative '../mixins/packer'
5
+
6
+ module Trifle
7
+ module Stats
8
+ module Driver
9
+ class Mongo
10
+ include Mixins::Packer
11
+ attr_accessor :client, :collection_name, :separator
12
+
13
+ def initialize(client, collection_name: 'trifle_stats')
14
+ @client = client
15
+ @collection_name = collection_name
16
+ @separator = '::'
17
+ end
18
+
19
+ def inc(key:, **values)
20
+ pkey = key.join(separator)
21
+
22
+ collection.bulk_write(
23
+ [upsert_operation('$inc', pkey: pkey, values: values)]
24
+ )
25
+ end
26
+
27
+ def set(key:, **values)
28
+ pkey = key.join(separator)
29
+
30
+ collection.bulk_write(
31
+ [upsert_operation('$set', pkey: pkey, values: values)]
32
+ )
33
+ end
34
+
35
+ def upsert_operation(operation, pkey:, values:)
36
+ data = self.class.pack(hash: { data: values })
37
+ {
38
+ update_many: {
39
+ filter: { key: pkey },
40
+ update: { operation => data },
41
+ upsert: true
42
+ }
43
+ }
44
+ end
45
+
46
+ def get(keys:)
47
+ pkeys = keys.map { |key| key.join(separator) }
48
+ data = collection.find(key: { '$in' => pkeys })
49
+ map = data.inject({}) { |o, d| o.merge(d['key'] => d['data']) }
50
+
51
+ pkeys.map { |pkey| map[pkey] || {} }
52
+ end
53
+
54
+ private
55
+
56
+ def collection
57
+ client[collection_name]
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -44,13 +44,15 @@ module Trifle
44
44
  client.exec(query)
45
45
  end
46
46
 
47
- def get(key:)
48
- pkey = key.join(separator)
47
+ def get(keys:)
48
+ keys.map do |key|
49
+ pkey = key.join(separator)
49
50
 
50
- data = _get(key: pkey)
51
- return {} if data.nil?
51
+ data = _get(key: pkey)
52
+ return {} if data.nil?
52
53
 
53
- self.class.unpack(hash: data)
54
+ self.class.unpack(hash: data)
55
+ end
54
56
  end
55
57
 
56
58
  def _get(key:)
@@ -28,10 +28,12 @@ module Trifle
28
28
  end
29
29
  end
30
30
 
31
- def get(key:)
32
- self.class.unpack(
33
- hash: @data.fetch(key.join(@separator), {})
34
- )
31
+ def get(keys:)
32
+ keys.map do |key|
33
+ self.class.unpack(
34
+ hash: @data.fetch(key.join(@separator), {})
35
+ )
36
+ end
35
37
  end
36
38
  end
37
39
  end
@@ -30,12 +30,14 @@ module Trifle
30
30
  client.hmset(pkey, *self.class.pack(hash: values))
31
31
  end
32
32
 
33
- def get(key:)
34
- pkey = ([prefix] + key).join(separator)
33
+ def get(keys:)
34
+ keys.map do |key|
35
+ pkey = ([prefix] + key).join(separator)
35
36
 
36
- self.class.unpack(
37
- hash: client.hgetall(pkey)
38
- )
37
+ self.class.unpack(
38
+ hash: client.hgetall(pkey)
39
+ )
40
+ end
39
41
  end
40
42
  end
41
43
  end
@@ -24,13 +24,14 @@ module Trifle
24
24
  end
25
25
 
26
26
  def perform
27
- timeline.map do |at|
28
- {
29
- at => config.driver.get(
30
- key: [key, range, at.to_i]
31
- )
32
- }
33
- end
27
+ {
28
+ at: timeline,
29
+ values: config.driver.get(
30
+ keys: timeline.map do |at|
31
+ [key, range, at.to_i]
32
+ end
33
+ )
34
+ }
34
35
  end
35
36
  end
36
37
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Trifle
4
4
  module Stats
5
- VERSION = '0.3.2'
5
+ VERSION = '1.0.0'
6
6
  end
7
7
  end
data/lib/trifle/stats.rb CHANGED
@@ -1,8 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'trifle/stats/driver/redis'
3
+ require 'trifle/stats/driver/mongo'
4
4
  require 'trifle/stats/driver/postgres'
5
5
  require 'trifle/stats/driver/process'
6
+ require 'trifle/stats/driver/redis'
6
7
  require 'trifle/stats/mixins/packer'
7
8
  require 'trifle/stats/nocturnal'
8
9
  require 'trifle/stats/configuration'
data/trifle-stats.gemspec CHANGED
@@ -12,7 +12,8 @@ Gem::Specification.new do |spec|
12
12
  'that helps you track custom metrics. Automatically '\
13
13
  'increments counters for each enabled range. '\
14
14
  'It supports timezones and different week beginning.'
15
- spec.homepage = "https://trifle.io"
15
+ spec.homepage = 'https://trifle.io'
16
+ spec.licenses = ['MIT']
16
17
  spec.required_ruby_version = Gem::Requirement.new('>= 2.6')
17
18
 
18
19
  spec.metadata['homepage_uri'] = spec.homepage
@@ -30,10 +31,12 @@ Gem::Specification.new do |spec|
30
31
  spec.add_development_dependency('bundler', '~> 2.1')
31
32
  spec.add_development_dependency('byebug', '>= 0')
32
33
  spec.add_development_dependency('dotenv')
34
+ spec.add_development_dependency('mongo', '>= 2.14.0')
35
+ spec.add_development_dependency('pg', '>= 1.2')
33
36
  spec.add_development_dependency('rake', '~> 13.0')
37
+ spec.add_development_dependency('redis', '>= 4.2')
34
38
  spec.add_development_dependency('rspec', '~> 3.2')
35
39
  spec.add_development_dependency('rubocop', '1.0.0')
36
- spec.add_runtime_dependency('redis', '>= 4.2')
37
- spec.add_runtime_dependency('pg', '>= 1.2')
40
+
38
41
  spec.add_runtime_dependency('tzinfo', '~> 2.0')
39
42
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: trifle-stats
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jozef Vaclavik
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-04-20 00:00:00.000000000 Z
11
+ date: 2022-06-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -53,47 +53,47 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: rake
56
+ name: mongo
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - "~>"
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: '13.0'
61
+ version: 2.14.0
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - "~>"
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
- version: '13.0'
68
+ version: 2.14.0
69
69
  - !ruby/object:Gem::Dependency
70
- name: rspec
70
+ name: pg
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - "~>"
73
+ - - ">="
74
74
  - !ruby/object:Gem::Version
75
- version: '3.2'
75
+ version: '1.2'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - "~>"
80
+ - - ">="
81
81
  - !ruby/object:Gem::Version
82
- version: '3.2'
82
+ version: '1.2'
83
83
  - !ruby/object:Gem::Dependency
84
- name: rubocop
84
+ name: rake
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - '='
87
+ - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: 1.0.0
89
+ version: '13.0'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - '='
94
+ - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: 1.0.0
96
+ version: '13.0'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: redis
99
99
  requirement: !ruby/object:Gem::Requirement
@@ -101,7 +101,7 @@ dependencies:
101
101
  - - ">="
102
102
  - !ruby/object:Gem::Version
103
103
  version: '4.2'
104
- type: :runtime
104
+ type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
@@ -109,19 +109,33 @@ dependencies:
109
109
  - !ruby/object:Gem::Version
110
110
  version: '4.2'
111
111
  - !ruby/object:Gem::Dependency
112
- name: pg
112
+ name: rspec
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
- - - ">="
115
+ - - "~>"
116
116
  - !ruby/object:Gem::Version
117
- version: '1.2'
118
- type: :runtime
117
+ version: '3.2'
118
+ type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
- - - ">="
122
+ - - "~>"
123
123
  - !ruby/object:Gem::Version
124
- version: '1.2'
124
+ version: '3.2'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rubocop
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - '='
130
+ - !ruby/object:Gem::Version
131
+ version: 1.0.0
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - '='
137
+ - !ruby/object:Gem::Version
138
+ version: 1.0.0
125
139
  - !ruby/object:Gem::Dependency
126
140
  name: tzinfo
127
141
  requirement: !ruby/object:Gem::Requirement
@@ -145,11 +159,17 @@ executables: []
145
159
  extensions: []
146
160
  extra_rdoc_files: []
147
161
  files:
162
+ - ".devcontainer.json"
163
+ - ".devops/docker/codespaces/Dockerfile"
164
+ - ".devops/docker/codespaces/docker-compose.yml"
165
+ - ".devops/docker/environment/.p10k.zsh"
166
+ - ".devops/docker/environment/.zshrc"
167
+ - ".devops/docker/environment/Dockerfile"
168
+ - ".devops/docker/gitpod/Dockerfile"
169
+ - ".devops/docker/gitpod/base/Dockerfile"
148
170
  - ".github/workflows/ruby.yml"
149
171
  - ".gitignore"
150
172
  - ".gitpod.yml"
151
- - ".gitpod/Dockerfile"
152
- - ".gitpod/base/Dockerfile"
153
173
  - ".rspec"
154
174
  - ".rubocop.yml"
155
175
  - ".ruby-version"
@@ -164,6 +184,7 @@ files:
164
184
  - lib/trifle/stats.rb
165
185
  - lib/trifle/stats/configuration.rb
166
186
  - lib/trifle/stats/driver/README.md
187
+ - lib/trifle/stats/driver/mongo.rb
167
188
  - lib/trifle/stats/driver/postgres.rb
168
189
  - lib/trifle/stats/driver/process.rb
169
190
  - lib/trifle/stats/driver/redis.rb
@@ -175,7 +196,8 @@ files:
175
196
  - lib/trifle/stats/version.rb
176
197
  - trifle-stats.gemspec
177
198
  homepage: https://trifle.io
178
- licenses: []
199
+ licenses:
200
+ - MIT
179
201
  metadata:
180
202
  homepage_uri: https://trifle.io
181
203
  source_code_uri: https://github.com/trifle-io/trifle-stats