groupdate 2.4.0 → 2.5.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
-
[![Build Status](https://travis-ci.org/ankane/groupdate.
|
18
|
+
[![Build Status](https://travis-ci.org/ankane/groupdate.svg?branch=master)](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:
|