groupdate 4.0.1 → 4.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/CONTRIBUTING.md +9 -7
- data/README.md +3 -3
- data/lib/groupdate.rb +8 -0
- data/lib/groupdate/magic.rb +5 -4
- data/lib/groupdate/relation.rb +2 -5
- data/lib/groupdate/series_builder.rb +10 -2
- data/lib/groupdate/version.rb +1 -1
- metadata +6 -33
- data/.github/ISSUE_TEMPLATE.md +0 -7
- data/.gitignore +0 -19
- data/.travis.yml +0 -26
- data/Gemfile +0 -12
- data/Rakefile +0 -9
- data/groupdate.gemspec +0 -38
- data/test/enumerable_test.rb +0 -60
- data/test/gemfiles/activerecord42.gemfile +0 -12
- data/test/gemfiles/activerecord50.gemfile +0 -12
- data/test/gemfiles/activerecord51.gemfile +0 -12
- data/test/gemfiles/redshift.gemfile +0 -7
- data/test/mysql_test.rb +0 -15
- data/test/postgresql_test.rb +0 -15
- data/test/redshift_test.rb +0 -18
- data/test/sqlite_test.rb +0 -29
- data/test/test_helper.rb +0 -1246
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 624c0ae83a0c0952676b3d3efb79826b2b470d0a5efab6da31523ca8284db8f3
|
4
|
+
data.tar.gz: 6c15c17557aee5b8babd8b2939af9325449a4831ed0ee24901c27d37b7352fe3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dfa2c03830675352029e74768bad800acd7ac56edc9dbcdb01f58787f34858120c4f9f1d1436ee4bdb38480922b111d746b75e3f0b7ff59f5bb770e74e01c4c9
|
7
|
+
data.tar.gz: f300e95cb3a7098486c910a4e94a8ecd4313fad14988b78fc68495783d99f49fef643f8361a4566f9ad2737238393a88c79efbc7df41cd28251d962916264626
|
data/CHANGELOG.md
CHANGED
data/CONTRIBUTING.md
CHANGED
@@ -2,17 +2,15 @@
|
|
2
2
|
|
3
3
|
First, thanks for wanting to contribute. You’re awesome! :heart:
|
4
4
|
|
5
|
-
##
|
5
|
+
## Help
|
6
6
|
|
7
|
-
|
7
|
+
We’re not able to provide support through GitHub Issues. If you’re looking for help with your code, try posting on [Stack Overflow](https://stackoverflow.com/).
|
8
8
|
|
9
|
-
|
9
|
+
All features should be documented. If you don’t see a feature in the docs, assume it doesn’t exist.
|
10
10
|
|
11
|
-
|
11
|
+
## Bugs
|
12
12
|
|
13
|
-
|
14
|
-
|
15
|
-
Think you’ve discovered an issue?
|
13
|
+
Think you’ve discovered a bug?
|
16
14
|
|
17
15
|
1. Search existing issues to see if it’s been reported.
|
18
16
|
2. Try the `master` branch to make sure it hasn’t been fixed.
|
@@ -26,6 +24,10 @@ If the above steps don’t help, create an issue. Include:
|
|
26
24
|
- Detailed steps to reproduce
|
27
25
|
- Complete backtraces for exceptions
|
28
26
|
|
27
|
+
## New Features
|
28
|
+
|
29
|
+
If you’d like to discuss a new feature, create an issue and start the title with `[Idea]`.
|
30
|
+
|
29
31
|
## Pull Requests
|
30
32
|
|
31
33
|
Fork the project and create a pull request. A few tips:
|
data/README.md
CHANGED
@@ -252,7 +252,7 @@ Groupdate.time_zone = false
|
|
252
252
|
|
253
253
|
### 4.0
|
254
254
|
|
255
|
-
Groupdate 4.0 brings a number of improvements.
|
255
|
+
Groupdate 4.0 brings a number of improvements. Here are a few to be aware of:
|
256
256
|
|
257
257
|
- `group_by` methods return an `ActiveRecord::Relation` instead of a `Groupdate::Series`
|
258
258
|
- Invalid options now throw an `ArgumentError`
|
@@ -261,7 +261,7 @@ Groupdate 4.0 brings a number of improvements. Here are a few to be aware of:
|
|
261
261
|
|
262
262
|
### 3.0
|
263
263
|
|
264
|
-
Groupdate 3.0 brings a number of improvements.
|
264
|
+
Groupdate 3.0 brings a number of improvements. Here are a few to be aware of:
|
265
265
|
|
266
266
|
- `Date` objects are now returned for day, week, month, quarter, and year by default. Use `dates: false` for the previous behavior, or change this globally with `Groupdate.dates = false`.
|
267
267
|
- Array and hash methods no longer return the entire series by default. Use `series: true` for the previous behavior.
|
@@ -269,7 +269,7 @@ Groupdate 3.0 brings a number of improvements. Here are a few to be aware of:
|
|
269
269
|
|
270
270
|
### 2.0
|
271
271
|
|
272
|
-
Groupdate 2.0 brings a number of improvements.
|
272
|
+
Groupdate 2.0 brings a number of improvements. Here are two things to be aware of:
|
273
273
|
|
274
274
|
- the entire series is returned by default
|
275
275
|
- `ActiveSupport::TimeWithZone` keys are now returned for every database adapter - adapters previously returned `Time` or `String` keys
|
data/lib/groupdate.rb
CHANGED
@@ -15,6 +15,14 @@ module Groupdate
|
|
15
15
|
self.week_start = :sun
|
16
16
|
self.day_start = 0
|
17
17
|
self.dates = true
|
18
|
+
|
19
|
+
# api for gems like ActiveMedian
|
20
|
+
def self.process_result(relation, result, **options)
|
21
|
+
if relation.groupdate_values
|
22
|
+
result = Groupdate::Magic::Relation.process_result(relation, result, **options)
|
23
|
+
end
|
24
|
+
result
|
25
|
+
end
|
18
26
|
end
|
19
27
|
|
20
28
|
require "groupdate/enumerable"
|
data/lib/groupdate/magic.rb
CHANGED
@@ -63,7 +63,7 @@ module Groupdate
|
|
63
63
|
@options = options
|
64
64
|
end
|
65
65
|
|
66
|
-
def perform(relation, result)
|
66
|
+
def perform(relation, result, default_value:)
|
67
67
|
multiple_groups = relation.group_values.size > 1
|
68
68
|
|
69
69
|
check_time_zone_support(result, multiple_groups)
|
@@ -71,7 +71,7 @@ module Groupdate
|
|
71
71
|
|
72
72
|
series_builder.generate(
|
73
73
|
result,
|
74
|
-
default_value: options.key?(:default_value) ? options[:default_value] :
|
74
|
+
default_value: options.key?(:default_value) ? options[:default_value] : default_value,
|
75
75
|
multiple_groups: multiple_groups,
|
76
76
|
group_index: group_index
|
77
77
|
)
|
@@ -122,9 +122,10 @@ module Groupdate
|
|
122
122
|
relation
|
123
123
|
end
|
124
124
|
|
125
|
-
|
125
|
+
# allow any options to keep flexible for future
|
126
|
+
def self.process_result(relation, result, **options)
|
126
127
|
relation.groupdate_values.reverse.each do |gv|
|
127
|
-
result = gv.perform(relation, result)
|
128
|
+
result = gv.perform(relation, result, default_value: options[:default_value])
|
128
129
|
end
|
129
130
|
result
|
130
131
|
end
|
data/lib/groupdate/relation.rb
CHANGED
@@ -9,11 +9,8 @@ module Groupdate
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def calculate(*args, &block)
|
12
|
-
|
13
|
-
|
14
|
-
else
|
15
|
-
super
|
16
|
-
end
|
12
|
+
default_value = [:count, :sum].include?(args[0]) ? 0 : nil
|
13
|
+
Groupdate.process_result(self, super, default_value: default_value)
|
17
14
|
end
|
18
15
|
end
|
19
16
|
end
|
@@ -90,7 +90,6 @@ module Groupdate
|
|
90
90
|
raise ArgumentError, "Cannot use last option with #{period}"
|
91
91
|
end
|
92
92
|
if step
|
93
|
-
now = time_zone.now
|
94
93
|
# loop instead of multiply to change start_at - see #151
|
95
94
|
start_at = now
|
96
95
|
(options[:last].to_i - 1).times do
|
@@ -111,6 +110,10 @@ module Groupdate
|
|
111
110
|
|
112
111
|
private
|
113
112
|
|
113
|
+
def now
|
114
|
+
@now ||= time_zone.now
|
115
|
+
end
|
116
|
+
|
114
117
|
def generate_series(data, multiple_groups, group_index)
|
115
118
|
case period
|
116
119
|
when :day_of_week
|
@@ -136,7 +139,12 @@ module Groupdate
|
|
136
139
|
else
|
137
140
|
data.keys.sort
|
138
141
|
end
|
139
|
-
|
142
|
+
|
143
|
+
tr = sorted_keys.first..sorted_keys.last
|
144
|
+
if options[:current] == false && round_time(now) >= tr.last
|
145
|
+
tr = tr.first...round_time(now)
|
146
|
+
end
|
147
|
+
tr
|
140
148
|
end
|
141
149
|
|
142
150
|
if time_range.first
|
data/lib/groupdate/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: groupdate
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.0.
|
4
|
+
version: 4.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Kane
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-10-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -123,22 +123,15 @@ dependencies:
|
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: '0'
|
125
125
|
description:
|
126
|
-
email:
|
127
|
-
- andrew@chartkick.com
|
126
|
+
email: andrew@chartkick.com
|
128
127
|
executables: []
|
129
128
|
extensions: []
|
130
129
|
extra_rdoc_files: []
|
131
130
|
files:
|
132
|
-
- ".github/ISSUE_TEMPLATE.md"
|
133
|
-
- ".gitignore"
|
134
|
-
- ".travis.yml"
|
135
131
|
- CHANGELOG.md
|
136
132
|
- CONTRIBUTING.md
|
137
|
-
- Gemfile
|
138
133
|
- LICENSE.txt
|
139
134
|
- README.md
|
140
|
-
- Rakefile
|
141
|
-
- groupdate.gemspec
|
142
135
|
- lib/groupdate.rb
|
143
136
|
- lib/groupdate/active_record.rb
|
144
137
|
- lib/groupdate/enumerable.rb
|
@@ -148,16 +141,6 @@ files:
|
|
148
141
|
- lib/groupdate/relation_builder.rb
|
149
142
|
- lib/groupdate/series_builder.rb
|
150
143
|
- lib/groupdate/version.rb
|
151
|
-
- test/enumerable_test.rb
|
152
|
-
- test/gemfiles/activerecord42.gemfile
|
153
|
-
- test/gemfiles/activerecord50.gemfile
|
154
|
-
- test/gemfiles/activerecord51.gemfile
|
155
|
-
- test/gemfiles/redshift.gemfile
|
156
|
-
- test/mysql_test.rb
|
157
|
-
- test/postgresql_test.rb
|
158
|
-
- test/redshift_test.rb
|
159
|
-
- test/sqlite_test.rb
|
160
|
-
- test/test_helper.rb
|
161
144
|
homepage: https://github.com/ankane/groupdate
|
162
145
|
licenses:
|
163
146
|
- MIT
|
@@ -170,7 +153,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
170
153
|
requirements:
|
171
154
|
- - ">="
|
172
155
|
- !ruby/object:Gem::Version
|
173
|
-
version: 2.2
|
156
|
+
version: '2.2'
|
174
157
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
175
158
|
requirements:
|
176
159
|
- - ">="
|
@@ -178,18 +161,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
178
161
|
version: '0'
|
179
162
|
requirements: []
|
180
163
|
rubyforge_project:
|
181
|
-
rubygems_version: 2.7.
|
164
|
+
rubygems_version: 2.7.7
|
182
165
|
signing_key:
|
183
166
|
specification_version: 4
|
184
167
|
summary: The simplest way to group temporal data
|
185
|
-
test_files:
|
186
|
-
- test/enumerable_test.rb
|
187
|
-
- test/gemfiles/activerecord42.gemfile
|
188
|
-
- test/gemfiles/activerecord50.gemfile
|
189
|
-
- test/gemfiles/activerecord51.gemfile
|
190
|
-
- test/gemfiles/redshift.gemfile
|
191
|
-
- test/mysql_test.rb
|
192
|
-
- test/postgresql_test.rb
|
193
|
-
- test/redshift_test.rb
|
194
|
-
- test/sqlite_test.rb
|
195
|
-
- test/test_helper.rb
|
168
|
+
test_files: []
|
data/.github/ISSUE_TEMPLATE.md
DELETED
data/.gitignore
DELETED
data/.travis.yml
DELETED
@@ -1,26 +0,0 @@
|
|
1
|
-
language: ruby
|
2
|
-
rvm:
|
3
|
-
- 2.4.2
|
4
|
-
- jruby-9.1.9.0
|
5
|
-
gemfile:
|
6
|
-
- Gemfile
|
7
|
-
- test/gemfiles/activerecord51.gemfile
|
8
|
-
- test/gemfiles/activerecord50.gemfile
|
9
|
-
- test/gemfiles/activerecord42.gemfile
|
10
|
-
sudo: false
|
11
|
-
script: bundle exec rake test
|
12
|
-
before_install:
|
13
|
-
- gem install bundler
|
14
|
-
- mysql -e 'create database groupdate_test;'
|
15
|
-
- mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql
|
16
|
-
- psql -c 'create database groupdate_test;' -U postgres
|
17
|
-
notifications:
|
18
|
-
email:
|
19
|
-
on_success: never
|
20
|
-
on_failure: change
|
21
|
-
matrix:
|
22
|
-
allow_failures:
|
23
|
-
- rvm: jruby-9.1.9.0
|
24
|
-
gemfile: Gemfile
|
25
|
-
- rvm: jruby-9.1.9.0
|
26
|
-
gemfile: test/gemfiles/activerecord51.gemfile
|
data/Gemfile
DELETED
@@ -1,12 +0,0 @@
|
|
1
|
-
source "https://rubygems.org"
|
2
|
-
|
3
|
-
# Specify your gem's dependencies in groupdate.gemspec
|
4
|
-
gemspec
|
5
|
-
|
6
|
-
gem "activerecord", "~> 5.2.0"
|
7
|
-
|
8
|
-
if defined?(JRUBY_VERSION)
|
9
|
-
gem "activerecord-jdbcpostgresql-adapter", git: "https://github.com/jruby/activerecord-jdbc-adapter.git"
|
10
|
-
gem "activerecord-jdbcmysql-adapter", git: "https://github.com/jruby/activerecord-jdbc-adapter.git"
|
11
|
-
gem "activerecord-jdbcsqlite3-adapter", git: "https://github.com/jruby/activerecord-jdbc-adapter.git"
|
12
|
-
end
|
data/Rakefile
DELETED
data/groupdate.gemspec
DELETED
@@ -1,38 +0,0 @@
|
|
1
|
-
# coding: utf-8
|
2
|
-
lib = File.expand_path("../lib", __FILE__)
|
3
|
-
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require "groupdate/version"
|
5
|
-
|
6
|
-
Gem::Specification.new do |spec|
|
7
|
-
spec.name = "groupdate"
|
8
|
-
spec.version = Groupdate::VERSION
|
9
|
-
spec.authors = ["Andrew Kane"]
|
10
|
-
spec.email = ["andrew@chartkick.com"]
|
11
|
-
spec.summary = "The simplest way to group temporal data"
|
12
|
-
spec.homepage = "https://github.com/ankane/groupdate"
|
13
|
-
spec.license = "MIT"
|
14
|
-
|
15
|
-
spec.files = `git ls-files`.split($/)
|
16
|
-
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
17
|
-
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
18
|
-
spec.require_paths = ["lib"]
|
19
|
-
|
20
|
-
spec.required_ruby_version = ">= 2.2.0"
|
21
|
-
|
22
|
-
spec.add_dependency "activesupport", ">= 4.2"
|
23
|
-
|
24
|
-
spec.add_development_dependency "bundler"
|
25
|
-
spec.add_development_dependency "rake"
|
26
|
-
spec.add_development_dependency "minitest"
|
27
|
-
spec.add_development_dependency "activerecord"
|
28
|
-
|
29
|
-
if RUBY_PLATFORM == "java"
|
30
|
-
spec.add_development_dependency "activerecord-jdbcpostgresql-adapter"
|
31
|
-
spec.add_development_dependency "activerecord-jdbcmysql-adapter"
|
32
|
-
spec.add_development_dependency "activerecord-jdbcsqlite3-adapter"
|
33
|
-
else
|
34
|
-
spec.add_development_dependency "pg", "< 1"
|
35
|
-
spec.add_development_dependency "mysql2", "< 0.5"
|
36
|
-
spec.add_development_dependency "sqlite3"
|
37
|
-
end
|
38
|
-
end
|
data/test/enumerable_test.rb
DELETED
@@ -1,60 +0,0 @@
|
|
1
|
-
require_relative "test_helper"
|
2
|
-
require "ostruct"
|
3
|
-
|
4
|
-
class EnumerableTest < Minitest::Test
|
5
|
-
include TestGroupdate
|
6
|
-
|
7
|
-
def test_enumerable
|
8
|
-
user_a = create_user("2014-01-21")
|
9
|
-
user_b = create_user("2014-03-14")
|
10
|
-
expected = {
|
11
|
-
Date.parse("2014-01-01") => [user_a],
|
12
|
-
Date.parse("2014-03-01") => [user_b]
|
13
|
-
}
|
14
|
-
assert_equal expected, [user_a, user_b].group_by_month(&:created_at)
|
15
|
-
end
|
16
|
-
|
17
|
-
def test_enumerable_series
|
18
|
-
user_a = create_user("2014-01-21")
|
19
|
-
user_b = create_user("2014-03-14")
|
20
|
-
expected = {
|
21
|
-
Date.parse("2014-01-01") => [user_a],
|
22
|
-
Date.parse("2014-02-01") => [],
|
23
|
-
Date.parse("2014-03-01") => [user_b]
|
24
|
-
}
|
25
|
-
assert_equal expected, [user_a, user_b].group_by_month(series: true, &:created_at)
|
26
|
-
end
|
27
|
-
|
28
|
-
def test_no_block
|
29
|
-
assert_raises(ArgumentError) { [].group_by_day(:created_at) }
|
30
|
-
end
|
31
|
-
|
32
|
-
def call_method(method, field, options)
|
33
|
-
Hash[@users.group_by_period(method, options) { |u| u.send(field) }.map { |k, v| [k, v.size] }]
|
34
|
-
end
|
35
|
-
|
36
|
-
def create_user(created_at, score = 1)
|
37
|
-
user =
|
38
|
-
OpenStruct.new(
|
39
|
-
name: "Andrew",
|
40
|
-
score: score,
|
41
|
-
created_at: created_at ? utc.parse(created_at) : nil,
|
42
|
-
created_on: created_at ? Date.parse(created_at) : nil
|
43
|
-
)
|
44
|
-
@users << user
|
45
|
-
user
|
46
|
-
end
|
47
|
-
|
48
|
-
def setup
|
49
|
-
super
|
50
|
-
@users = []
|
51
|
-
end
|
52
|
-
|
53
|
-
def teardown
|
54
|
-
# do nothing
|
55
|
-
end
|
56
|
-
|
57
|
-
def enumerable_test?
|
58
|
-
true
|
59
|
-
end
|
60
|
-
end
|