groupdate 2.4.0 → 2.5.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 +4 -4
- data/.travis.yml +1 -1
- data/CHANGELOG.md +6 -0
- data/Gemfile +1 -1
- data/README.md +41 -6
- data/groupdate.gemspec +6 -6
- data/lib/groupdate.rb +1 -1
- data/lib/groupdate/active_record.rb +1 -5
- data/lib/groupdate/enumerable.rb +14 -2
- data/lib/groupdate/magic.rb +26 -23
- data/lib/groupdate/scopes.rb +9 -1
- data/lib/groupdate/series.rb +1 -2
- data/lib/groupdate/version.rb +1 -1
- data/test/enumerable_test.rb +5 -2
- data/test/mysql_test.rb +0 -1
- data/test/postgresql_test.rb +0 -1
- data/test/test_helper.rb +72 -19
- metadata +8 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0b555424def0887e8b0ab933f26c84844a6e9b8b
|
4
|
+
data.tar.gz: c16d375c965c0d289ffc8476435b47b61e09ebf2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 835b67dacd82ce1fde549847fcf2647cad712ef75a14841c13b42d06ce95f606c4f5db124f0795dedace821d9c0113211b6d4c011a9c29cfc717fe2cbbc4e643
|
7
|
+
data.tar.gz: 3cb677877505d1f09ad3067fbc0777f4db8d0330429710d43f38544b0782dec7ce1c98f7f9d488c947f9c8de4bb638fced6475e98514c06c6a4ad72891852a01
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -15,7 +15,7 @@ Works with Rails 3.1+
|
|
15
15
|
|
16
16
|
Supports PostgreSQL and MySQL, plus arrays and hashes
|
17
17
|
|
18
|
-
[](https://travis-ci.org/ankane/groupdate)
|
19
19
|
|
20
20
|
:cupid: Goes hand in hand with [Chartkick](http://ankane.github.io/chartkick/)
|
21
21
|
|
@@ -115,6 +115,12 @@ To get the most recent time periods, use:
|
|
115
115
|
User.group_by_week(:created_at, last: 8).count # last 8 weeks
|
116
116
|
```
|
117
117
|
|
118
|
+
To exclude the current period, use:
|
119
|
+
|
120
|
+
```ruby
|
121
|
+
User.group_by_week(:created_at, last: 8, current: false).count
|
122
|
+
```
|
123
|
+
|
118
124
|
### Order
|
119
125
|
|
120
126
|
You can order in descending order with:
|
@@ -129,32 +135,61 @@ or
|
|
129
135
|
User.group_by_day(:created_at).order("day desc").count
|
130
136
|
```
|
131
137
|
|
132
|
-
###
|
138
|
+
### Format
|
133
139
|
|
134
140
|
To get keys in a different format, use:
|
135
141
|
|
136
142
|
```ruby
|
137
|
-
User.
|
143
|
+
User.group_by_day(:created_at, format: "%b %-e, %Y").count
|
144
|
+
# {
|
145
|
+
# "Jan 1, 2015" => 10
|
146
|
+
# "Jan 2, 2015" => 12
|
147
|
+
# }
|
148
|
+
```
|
149
|
+
|
150
|
+
or
|
151
|
+
|
152
|
+
```ruby
|
153
|
+
User.group_by_hour_of_day(:created_at, format: "%-l %P").count
|
154
|
+
# {
|
155
|
+
# "12 am" => 15,
|
156
|
+
# "1 am" => 11
|
157
|
+
# ...
|
158
|
+
# }
|
138
159
|
```
|
139
160
|
|
140
161
|
Takes a `String`, which is passed to [strftime](http://strfti.me/), or a `Proc`. You can pass a locale with the `locale` option.
|
141
162
|
|
163
|
+
### Dynamic Grouping
|
164
|
+
|
165
|
+
```ruby
|
166
|
+
User.group_by_period(:day, :created_at).count
|
167
|
+
```
|
168
|
+
|
169
|
+
Limit groupings with the `permit` option.
|
170
|
+
|
171
|
+
```ruby
|
172
|
+
User.group_by_period(params[:period], :created_at, permit: %w[day week]).count
|
173
|
+
```
|
174
|
+
|
175
|
+
Raises an `ArgumentError` for unpermitted periods.
|
176
|
+
|
142
177
|
## Arrays and Hashes
|
143
178
|
|
144
179
|
```ruby
|
145
|
-
users.group_by_day{|u| u.created_at } # or group_by_day(&:created_at)
|
180
|
+
users.group_by_day { |u| u.created_at } # or group_by_day(&:created_at)
|
146
181
|
```
|
147
182
|
|
148
183
|
Supports the same options as above
|
149
184
|
|
150
185
|
```ruby
|
151
|
-
users.group_by_day(time_zone: time_zone){|u| u.created_at }
|
186
|
+
users.group_by_day(time_zone: time_zone) { |u| u.created_at }
|
152
187
|
```
|
153
188
|
|
154
189
|
Count
|
155
190
|
|
156
191
|
```ruby
|
157
|
-
Hash[ users.group_by_day{|u| u.created_at }.map{|k, v| [k, v.size] } ]
|
192
|
+
Hash[ users.group_by_day { |u| u.created_at }.map { |k, v| [k, v.size] } ]
|
158
193
|
```
|
159
194
|
|
160
195
|
## Installation
|
data/groupdate.gemspec
CHANGED
@@ -1,19 +1,19 @@
|
|
1
1
|
# coding: utf-8
|
2
|
-
lib = File.expand_path(
|
2
|
+
lib = File.expand_path("../lib", __FILE__)
|
3
3
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require
|
4
|
+
require "groupdate/version"
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
7
|
spec.name = "groupdate"
|
8
8
|
spec.version = Groupdate::VERSION
|
9
9
|
spec.authors = ["Andrew Kane"]
|
10
10
|
spec.email = ["acekane1@gmail.com"]
|
11
|
-
spec.description =
|
12
|
-
spec.summary =
|
11
|
+
spec.description = "The simplest way to group temporal data"
|
12
|
+
spec.summary = "The simplest way to group temporal data"
|
13
13
|
spec.homepage = "https://github.com/ankane/groupdate"
|
14
14
|
spec.license = "MIT"
|
15
15
|
|
16
|
-
spec.files = `git ls-files`.split(
|
16
|
+
spec.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
|
17
17
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
@@ -30,6 +30,6 @@ Gem::Specification.new do |spec|
|
|
30
30
|
spec.add_development_dependency "activerecord-jdbcmysql-adapter"
|
31
31
|
else
|
32
32
|
spec.add_development_dependency "pg"
|
33
|
-
spec.add_development_dependency "mysql2"
|
33
|
+
spec.add_development_dependency "mysql2", "~> 0.3.20"
|
34
34
|
end
|
35
35
|
end
|
data/lib/groupdate.rb
CHANGED
@@ -5,7 +5,7 @@ require "groupdate/magic"
|
|
5
5
|
|
6
6
|
module Groupdate
|
7
7
|
FIELDS = [:second, :minute, :hour, :day, :week, :month, :year, :day_of_week, :hour_of_day, :day_of_month, :month_of_year]
|
8
|
-
METHODS = FIELDS.map{|v| :"group_by_#{v}" }
|
8
|
+
METHODS = FIELDS.map { |v| :"group_by_#{v}" }
|
9
9
|
|
10
10
|
mattr_accessor :week_start, :day_start, :time_zone
|
11
11
|
self.week_start = :sun
|
@@ -7,8 +7,7 @@ ActiveRecord::Base.send(:extend, Groupdate::Scopes)
|
|
7
7
|
|
8
8
|
module ActiveRecord
|
9
9
|
class Relation
|
10
|
-
|
11
|
-
if ActiveRecord::VERSION::MAJOR == 3 and ActiveRecord::VERSION::MINOR < 2
|
10
|
+
if ActiveRecord::VERSION::MAJOR == 3 && ActiveRecord::VERSION::MINOR < 2
|
12
11
|
|
13
12
|
def method_missing_with_hack(method, *args, &block)
|
14
13
|
if Groupdate::METHODS.include?(method)
|
@@ -20,7 +19,6 @@ module ActiveRecord
|
|
20
19
|
alias_method_chain :method_missing, :hack
|
21
20
|
|
22
21
|
end
|
23
|
-
|
24
22
|
end
|
25
23
|
end
|
26
24
|
|
@@ -38,7 +36,6 @@ end
|
|
38
36
|
# https://github.com/rails/rails/issues/7121
|
39
37
|
module ActiveRecord
|
40
38
|
module Calculations
|
41
|
-
|
42
39
|
private
|
43
40
|
|
44
41
|
def column_alias_for_with_hack(*keys)
|
@@ -49,6 +46,5 @@ module ActiveRecord
|
|
49
46
|
end
|
50
47
|
end
|
51
48
|
alias_method_chain :column_alias_for, :hack
|
52
|
-
|
53
49
|
end
|
54
50
|
end
|
data/lib/groupdate/enumerable.rb
CHANGED
@@ -1,9 +1,21 @@
|
|
1
1
|
module Enumerable
|
2
|
-
|
3
2
|
Groupdate::FIELDS.each do |field|
|
4
3
|
define_method :"group_by_#{field}" do |options = {}, &block|
|
5
|
-
|
4
|
+
if block
|
5
|
+
Groupdate::Magic.new(field, options).group_by(self, &block)
|
6
|
+
else
|
7
|
+
raise ArgumentError, "no block given"
|
8
|
+
end
|
6
9
|
end
|
7
10
|
end
|
8
11
|
|
12
|
+
def group_by_period(period, options = {}, &block)
|
13
|
+
# to_sym is unsafe on user input, so convert to strings
|
14
|
+
permitted_periods = ((options[:permit] || Groupdate::FIELDS).map(&:to_sym) & Groupdate::FIELDS).map(&:to_s)
|
15
|
+
if permitted_periods.include?(period.to_s)
|
16
|
+
send("group_by_#{period}", options, &block)
|
17
|
+
else
|
18
|
+
raise ArgumentError, "Unpermitted period"
|
19
|
+
end
|
20
|
+
end
|
9
21
|
end
|
data/lib/groupdate/magic.rb
CHANGED
@@ -8,17 +8,17 @@ module Groupdate
|
|
8
8
|
@field = field
|
9
9
|
@options = options
|
10
10
|
|
11
|
-
|
11
|
+
unless time_zone
|
12
12
|
raise "Unrecognized time zone"
|
13
13
|
end
|
14
14
|
|
15
|
-
if field == :week
|
15
|
+
if field == :week && !week_start
|
16
16
|
raise "Unrecognized :week_start option"
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
|
-
def group_by(enum, &
|
21
|
-
group = enum.group_by{|v| v = yield(v); v ? round_time(v) : nil }
|
20
|
+
def group_by(enum, &_block)
|
21
|
+
group = enum.group_by { |v| v = yield(v); v ? round_time(v) : nil }
|
22
22
|
if options[:series] == false
|
23
23
|
group
|
24
24
|
else
|
@@ -108,7 +108,7 @@ module Groupdate
|
|
108
108
|
|
109
109
|
def perform(relation, method, *args, &block)
|
110
110
|
# undo reverse since we do not want this to appear in the query
|
111
|
-
reverse = relation.reverse_order_value
|
111
|
+
reverse = relation.send(:reverse_order_value)
|
112
112
|
if reverse
|
113
113
|
relation = relation.except(:reverse_order)
|
114
114
|
end
|
@@ -127,15 +127,15 @@ module Groupdate
|
|
127
127
|
cast_method =
|
128
128
|
case field
|
129
129
|
when :day_of_week, :hour_of_day, :day_of_month, :month_of_year
|
130
|
-
lambda{|k| k.to_i }
|
130
|
+
lambda { |k| k.to_i }
|
131
131
|
else
|
132
132
|
utc = ActiveSupport::TimeZone["UTC"]
|
133
|
-
lambda{|k| (k.is_a?(String) ? utc.parse(k) : k.to_time).in_time_zone(time_zone) }
|
133
|
+
lambda { |k| (k.is_a?(String) ? utc.parse(k) : k.to_time).in_time_zone(time_zone) }
|
134
134
|
end
|
135
135
|
|
136
136
|
count =
|
137
137
|
begin
|
138
|
-
Hash[
|
138
|
+
Hash[relation.send(method, *args, &block).map { |k, v| [multiple_groups ? k[0...@group_index] + [cast_method.call(k[@group_index])] + k[(@group_index + 1)..-1] : cast_method.call(k), v] }]
|
139
139
|
rescue NoMethodError
|
140
140
|
raise "Be sure to install time zone support - https://github.com/ankane/groupdate#for-mysql"
|
141
141
|
end
|
@@ -163,10 +163,11 @@ module Groupdate
|
|
163
163
|
def time_range
|
164
164
|
@time_range ||= begin
|
165
165
|
time_range = options[:range]
|
166
|
-
if !time_range
|
166
|
+
if !time_range && options[:last]
|
167
167
|
step = 1.send(field) if 1.respond_to?(field)
|
168
168
|
if step
|
169
169
|
now = Time.now
|
170
|
+
now -= step if options[:current] == false
|
170
171
|
time_range = round_time(now - (options[:last].to_i - 1).send(field))..now
|
171
172
|
end
|
172
173
|
end
|
@@ -196,7 +197,7 @@ module Groupdate
|
|
196
197
|
# use first and last values
|
197
198
|
sorted_keys =
|
198
199
|
if multiple_groups
|
199
|
-
count.keys.map{|k| k[@group_index] }.sort
|
200
|
+
count.keys.map { |k| k[@group_index] }.sort
|
200
201
|
else
|
201
202
|
count.keys.sort
|
202
203
|
end
|
@@ -208,26 +209,29 @@ module Groupdate
|
|
208
209
|
|
209
210
|
step = 1.send(field)
|
210
211
|
|
211
|
-
while (next_step = round_time(series.last + step))
|
212
|
+
while (next_step = round_time(series.last + step)) && time_range.cover?(next_step)
|
212
213
|
series << next_step
|
213
214
|
end
|
214
215
|
|
215
|
-
|
216
|
-
keys = count.keys.map{|k| k[0...@group_index] + k[(@group_index + 1)..-1] }.uniq
|
217
|
-
series = series.reverse if reverse
|
218
|
-
keys.flat_map do |k|
|
219
|
-
series.map{|s| k[0...@group_index] + [s] + k[@group_index..-1] }
|
220
|
-
end
|
221
|
-
else
|
222
|
-
series
|
223
|
-
end
|
216
|
+
series
|
224
217
|
else
|
225
218
|
[]
|
226
219
|
end
|
227
220
|
end
|
228
221
|
|
222
|
+
series =
|
223
|
+
if multiple_groups
|
224
|
+
keys = count.keys.map { |k| k[0...@group_index] + k[(@group_index + 1)..-1] }.uniq
|
225
|
+
series = series.reverse if reverse
|
226
|
+
keys.flat_map do |k|
|
227
|
+
series.map { |s| k[0...@group_index] + [s] + k[@group_index..-1] }
|
228
|
+
end
|
229
|
+
else
|
230
|
+
series
|
231
|
+
end
|
232
|
+
|
229
233
|
# reversed above if multiple groups
|
230
|
-
if !multiple_groups
|
234
|
+
if !multiple_groups && reverse
|
231
235
|
series = series.to_a.reverse
|
232
236
|
end
|
233
237
|
|
@@ -253,7 +257,7 @@ module Groupdate
|
|
253
257
|
end
|
254
258
|
end
|
255
259
|
else
|
256
|
-
lambda{|k| k }
|
260
|
+
lambda { |k| k }
|
257
261
|
end
|
258
262
|
|
259
263
|
value = 0
|
@@ -302,6 +306,5 @@ module Groupdate
|
|
302
306
|
def activerecord42?
|
303
307
|
ActiveRecord::VERSION::STRING.starts_with?("4.2.")
|
304
308
|
end
|
305
|
-
|
306
309
|
end
|
307
310
|
end
|
data/lib/groupdate/scopes.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
module Groupdate
|
2
2
|
module Scopes
|
3
|
-
|
4
3
|
Groupdate::FIELDS.each do |field|
|
5
4
|
define_method :"group_by_#{field}" do |*args|
|
6
5
|
args = args.dup
|
@@ -12,5 +11,14 @@ module Groupdate
|
|
12
11
|
end
|
13
12
|
end
|
14
13
|
|
14
|
+
def group_by_period(period, field, options = {})
|
15
|
+
# to_sym is unsafe on user input, so convert to strings
|
16
|
+
permitted_periods = ((options[:permit] || Groupdate::FIELDS).map(&:to_sym) & Groupdate::FIELDS).map(&:to_s)
|
17
|
+
if permitted_periods.include?(period.to_s)
|
18
|
+
send("group_by_#{period}", field, options)
|
19
|
+
else
|
20
|
+
raise ArgumentError, "Unpermitted period"
|
21
|
+
end
|
22
|
+
end
|
15
23
|
end
|
16
24
|
end
|
data/lib/groupdate/series.rb
CHANGED
@@ -12,7 +12,7 @@ module Groupdate
|
|
12
12
|
# https://github.com/rails/rails/blob/master/activerecord/lib/active_record/relation/calculations.rb
|
13
13
|
if ActiveRecord::Calculations.method_defined?(method)
|
14
14
|
magic.perform(relation, method, *args, &block)
|
15
|
-
elsif @relation.respond_to?(method)
|
15
|
+
elsif @relation.respond_to?(method, true)
|
16
16
|
Groupdate::Series.new(magic, relation.send(method, *args, &block))
|
17
17
|
else
|
18
18
|
super
|
@@ -22,6 +22,5 @@ module Groupdate
|
|
22
22
|
def respond_to?(method, include_all = false)
|
23
23
|
ActiveRecord::Calculations.method_defined?(method) || relation.respond_to?(method) || super
|
24
24
|
end
|
25
|
-
|
26
25
|
end
|
27
26
|
end
|
data/lib/groupdate/version.rb
CHANGED
data/test/enumerable_test.rb
CHANGED
@@ -14,8 +14,11 @@ class TestEnumerable < Minitest::Test
|
|
14
14
|
assert_equal expected, [user_a, user_b].group_by_month(&:created_at)
|
15
15
|
end
|
16
16
|
|
17
|
-
def
|
18
|
-
|
17
|
+
def test_no_block
|
18
|
+
assert_raises(ArgumentError) { [].group_by_day(:created_at) }
|
19
19
|
end
|
20
20
|
|
21
|
+
def call_method(method, field, options)
|
22
|
+
Hash[User.all.to_a.group_by_period(method, options) { |u| u.send(field) }.map { |k, v| [k, v.size] }]
|
23
|
+
end
|
21
24
|
end
|
data/test/mysql_test.rb
CHANGED
data/test/postgresql_test.rb
CHANGED
data/test/test_helper.rb
CHANGED
@@ -24,10 +24,8 @@ end
|
|
24
24
|
|
25
25
|
# i18n
|
26
26
|
I18n.enforce_available_locales = true
|
27
|
-
I18n.backend.store_translations :de, {
|
28
|
-
:
|
29
|
-
:abbr_month_names => %w(Jan Feb Mar Apr Mai Jun Jul Aug Sep Okt Nov Dez).unshift(nil)
|
30
|
-
}
|
27
|
+
I18n.backend.store_translations :de, :date => {
|
28
|
+
:abbr_month_names => %w(Jan Feb Mar Apr Mai Jun Jul Aug Sep Okt Nov Dez).unshift(nil)
|
31
29
|
}
|
32
30
|
|
33
31
|
# migrations
|
@@ -47,7 +45,6 @@ I18n.backend.store_translations :de, {
|
|
47
45
|
end
|
48
46
|
|
49
47
|
module TestGroupdate
|
50
|
-
|
51
48
|
def setup
|
52
49
|
Groupdate.week_start = :sun
|
53
50
|
end
|
@@ -55,7 +52,7 @@ module TestGroupdate
|
|
55
52
|
# second
|
56
53
|
|
57
54
|
def test_second_end_of_second
|
58
|
-
if ActiveRecord::Base.connection.adapter_name == "Mysql2"
|
55
|
+
if ActiveRecord::Base.connection.adapter_name == "Mysql2" && ActiveRecord::VERSION::STRING.starts_with?("4.2.")
|
59
56
|
skip # no millisecond precision
|
60
57
|
else
|
61
58
|
assert_result_time :second, "2013-05-03 00:00:00 UTC", "2013-05-03 00:00:00.999"
|
@@ -639,6 +636,29 @@ module TestGroupdate
|
|
639
636
|
assert_equal expected, User.group_by_day(:created_at).group(:score).order(:score).count
|
640
637
|
end
|
641
638
|
|
639
|
+
def test_group_day_of_week
|
640
|
+
create_user "2013-05-01 00:00:00 UTC", 1
|
641
|
+
create_user "2013-05-02 00:00:00 UTC", 2
|
642
|
+
create_user "2013-05-03 00:00:00 UTC", 2
|
643
|
+
expected = {
|
644
|
+
[1, 0] => 0,
|
645
|
+
[1, 1] => 0,
|
646
|
+
[1, 2] => 0,
|
647
|
+
[1, 3] => 1,
|
648
|
+
[1, 4] => 0,
|
649
|
+
[1, 5] => 0,
|
650
|
+
[1, 6] => 0,
|
651
|
+
[2, 0] => 0,
|
652
|
+
[2, 1] => 0,
|
653
|
+
[2, 2] => 0,
|
654
|
+
[2, 3] => 0,
|
655
|
+
[2, 4] => 1,
|
656
|
+
[2, 5] => 1,
|
657
|
+
[2, 6] => 0
|
658
|
+
}
|
659
|
+
assert_equal expected, User.group(:score).group_by_day_of_week(:created_at).count
|
660
|
+
end
|
661
|
+
|
642
662
|
def test_groupdate_multiple
|
643
663
|
create_user "2013-05-01 00:00:00 UTC", 1
|
644
664
|
expected = {
|
@@ -668,16 +688,26 @@ module TestGroupdate
|
|
668
688
|
end
|
669
689
|
|
670
690
|
def test_last
|
671
|
-
create_user "
|
672
|
-
create_user "
|
691
|
+
create_user "2012-05-01 00:00:00 UTC"
|
692
|
+
create_user "2014-05-01 00:00:00 UTC"
|
673
693
|
expected = {
|
674
|
-
utc.parse("
|
675
|
-
utc.parse("
|
676
|
-
utc.parse("
|
694
|
+
utc.parse("2013-01-01 00:00:00 UTC") => 0,
|
695
|
+
utc.parse("2014-01-01 00:00:00 UTC") => 1,
|
696
|
+
utc.parse("2015-01-01 00:00:00 UTC") => 0
|
677
697
|
}
|
678
698
|
assert_equal expected, User.group_by_year(:created_at, last: 3).count
|
679
699
|
end
|
680
700
|
|
701
|
+
def test_current
|
702
|
+
create_user "2012-05-01 00:00:00 UTC"
|
703
|
+
create_user "2014-05-01 00:00:00 UTC"
|
704
|
+
expected = {
|
705
|
+
utc.parse("2013-01-01 00:00:00 UTC") => 0,
|
706
|
+
utc.parse("2014-01-01 00:00:00 UTC") => 1
|
707
|
+
}
|
708
|
+
assert_equal expected, User.group_by_year(:created_at, last: 2, current: false).count
|
709
|
+
end
|
710
|
+
|
681
711
|
def test_format_day
|
682
712
|
create_user "2014-03-01 00:00:00 UTC"
|
683
713
|
assert_format :day, "March 1, 2014", "%B %-e, %Y"
|
@@ -742,6 +772,32 @@ module TestGroupdate
|
|
742
772
|
assert_equal ({[1, "Sun"] => 1}), User.group(:score).group_by_week(:created_at, format: "%a").count
|
743
773
|
end
|
744
774
|
|
775
|
+
# permit
|
776
|
+
|
777
|
+
def test_permit
|
778
|
+
assert_raises(ArgumentError, "Unpermitted period") { User.group_by_period(:day, :created_at, permit: %w[week]).count }
|
779
|
+
end
|
780
|
+
|
781
|
+
def test_permit_bad_period
|
782
|
+
assert_raises(ArgumentError, "Unpermitted period") { User.group_by_period(:bad_period, :created_at).count }
|
783
|
+
end
|
784
|
+
|
785
|
+
def test_permit_symbol_symbols
|
786
|
+
assert_equal ({}), User.group_by_period(:day, :created_at, permit: [:day]).count
|
787
|
+
end
|
788
|
+
|
789
|
+
def test_permit_string_symbols
|
790
|
+
assert_equal ({}), User.group_by_period("day", :created_at, permit: [:day]).count
|
791
|
+
end
|
792
|
+
|
793
|
+
def test_permit_symbol_strings
|
794
|
+
assert_equal ({}), User.group_by_period(:day, :created_at, permit: %w[day]).count
|
795
|
+
end
|
796
|
+
|
797
|
+
def test_permit_string_strings
|
798
|
+
assert_equal ({}), User.group_by_period("day", :created_at, permit: %w[day]).count
|
799
|
+
end
|
800
|
+
|
745
801
|
# associations
|
746
802
|
|
747
803
|
def test_associations
|
@@ -752,12 +808,10 @@ module TestGroupdate
|
|
752
808
|
# activerecord default_timezone option
|
753
809
|
|
754
810
|
def test_default_timezone_local
|
755
|
-
|
756
|
-
|
757
|
-
|
758
|
-
|
759
|
-
User.default_timezone = :utc
|
760
|
-
end
|
811
|
+
User.default_timezone = :local
|
812
|
+
assert_raises(RuntimeError) { User.group_by_day(:created_at).count }
|
813
|
+
ensure
|
814
|
+
User.default_timezone = :utc
|
761
815
|
end
|
762
816
|
|
763
817
|
# Brasilia Summer Time
|
@@ -812,7 +866,7 @@ module TestGroupdate
|
|
812
866
|
end
|
813
867
|
|
814
868
|
def call_method(method, field, options)
|
815
|
-
User.
|
869
|
+
User.group_by_period(method, field, options).count
|
816
870
|
end
|
817
871
|
|
818
872
|
def create_user(created_at, score = 1)
|
@@ -830,5 +884,4 @@ module TestGroupdate
|
|
830
884
|
def teardown
|
831
885
|
User.delete_all
|
832
886
|
end
|
833
|
-
|
834
887
|
end
|
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: 2.
|
4
|
+
version: 2.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Kane
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-09-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -98,16 +98,16 @@ dependencies:
|
|
98
98
|
name: mysql2
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
|
-
- - "
|
101
|
+
- - "~>"
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version:
|
103
|
+
version: 0.3.20
|
104
104
|
type: :development
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
|
-
- - "
|
108
|
+
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version:
|
110
|
+
version: 0.3.20
|
111
111
|
description: The simplest way to group temporal data
|
112
112
|
email:
|
113
113
|
- acekane1@gmail.com
|
@@ -159,7 +159,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
159
159
|
version: '0'
|
160
160
|
requirements: []
|
161
161
|
rubyforge_project:
|
162
|
-
rubygems_version: 2.
|
162
|
+
rubygems_version: 2.4.5
|
163
163
|
signing_key:
|
164
164
|
specification_version: 4
|
165
165
|
summary: The simplest way to group temporal data
|
@@ -168,3 +168,4 @@ test_files:
|
|
168
168
|
- test/mysql_test.rb
|
169
169
|
- test/postgresql_test.rb
|
170
170
|
- test/test_helper.rb
|
171
|
+
has_rdoc:
|