groupdate 2.3.0 → 2.4.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/.gitignore +1 -2
- data/.travis.yml +6 -1
- data/CHANGELOG.md +9 -1
- data/Gemfile +1 -1
- data/README.md +3 -15
- data/gemfiles/activerecord31.gemfile +1 -1
- data/gemfiles/activerecord32.gemfile +1 -1
- data/gemfiles/activerecord40.gemfile +1 -1
- data/gemfiles/activerecord41.gemfile +6 -0
- data/groupdate.gemspec +1 -1
- data/lib/groupdate/magic.rb +25 -8
- data/lib/groupdate/version.rb +1 -1
- data/test/test_helper.rb +55 -6
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 16e0f474a6785462e83ab5811c44e54bc71689ce
|
4
|
+
data.tar.gz: 7b66609e83996472c4e501f1502d4b76f73f4908
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 260e9bf32e334238baa95e59b085418aedc824046312699d69827f6b54a736287d68a70a87bb22a62f936b5336efe0f60012c59e1d1d9babc0c9b5434702767c
|
7
|
+
data.tar.gz: 5fe2dab3320cb3b0b119191440a490d967a12174290afa872d499858173c9a0c099867fff28e018369a3a8d8bc0e1afd2bc532ebcfa70c649e6dbbc4ae7a79f3
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
@@ -1,13 +1,14 @@
|
|
1
1
|
language: ruby
|
2
2
|
rvm:
|
3
3
|
- 1.9.3
|
4
|
-
- 2.
|
4
|
+
- 2.1
|
5
5
|
- jruby
|
6
6
|
gemfile:
|
7
7
|
- Gemfile
|
8
8
|
- gemfiles/activerecord31.gemfile
|
9
9
|
- gemfiles/activerecord32.gemfile
|
10
10
|
- gemfiles/activerecord40.gemfile
|
11
|
+
- gemfiles/activerecord41.gemfile
|
11
12
|
script: bundle exec rake test
|
12
13
|
before_script:
|
13
14
|
- mysql -e 'create database groupdate_test;'
|
@@ -17,3 +18,7 @@ notifications:
|
|
17
18
|
email:
|
18
19
|
on_success: never
|
19
20
|
on_failure: change
|
21
|
+
matrix:
|
22
|
+
allow_failures:
|
23
|
+
- rvm: jruby
|
24
|
+
gemfile: Gemfile
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
## 2.4.0
|
2
|
+
|
3
|
+
- Added localization
|
4
|
+
- Added `carry_forward` option
|
5
|
+
- Added `series: false` option for arrays and hashes
|
6
|
+
- Fixed issue w/ Brasilia Summer Time
|
7
|
+
- Fixed issues w/ ActiveRecord 4.2
|
8
|
+
|
1
9
|
## 2.3.0
|
2
10
|
|
3
11
|
- Raise error when ActiveRecord::Base.default_timezone is not `:utc`
|
@@ -11,7 +19,7 @@
|
|
11
19
|
|
12
20
|
## 2.2.0
|
13
21
|
|
14
|
-
- Added support for
|
22
|
+
- Added support for arrays and hashes
|
15
23
|
|
16
24
|
## 2.1.1
|
17
25
|
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -47,8 +47,8 @@ and
|
|
47
47
|
|
48
48
|
- hour_of_day
|
49
49
|
- day_of_week (Sunday = 0, Monday = 1, etc)
|
50
|
-
- day_of_month
|
51
|
-
- month_of_year
|
50
|
+
- day_of_month
|
51
|
+
- month_of_year
|
52
52
|
|
53
53
|
Use it anywhere you can use `group`.
|
54
54
|
|
@@ -137,7 +137,7 @@ To get keys in a different format, use:
|
|
137
137
|
User.group_by_hour_of_day(:created_at, format: "%l %P").count.keys.first # 12 am
|
138
138
|
```
|
139
139
|
|
140
|
-
Takes a `String`, which is passed to [strftime](http://strfti.me/), or a `Proc`
|
140
|
+
Takes a `String`, which is passed to [strftime](http://strfti.me/), or a `Proc`. You can pass a locale with the `locale` option.
|
141
141
|
|
142
142
|
## Arrays and Hashes
|
143
143
|
|
@@ -175,18 +175,6 @@ mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql
|
|
175
175
|
|
176
176
|
or copy and paste [these statements](https://gist.githubusercontent.com/ankane/1d6b0022173186accbf0/raw/time_zone_support.sql) into a SQL console.
|
177
177
|
|
178
|
-
#### For JRuby
|
179
|
-
|
180
|
-
Use the master version of your JDBC adapter. You will get incorrect results for versions before [this commit](https://github.com/jruby/activerecord-jdbc-adapter/commit/c1cdb7cec8d3f06fc54995e8d872d830bd0a4d91).
|
181
|
-
|
182
|
-
```ruby
|
183
|
-
# postgresql
|
184
|
-
gem "activerecord-jdbcpostgresql-adapter", :github => "jruby/activerecord-jdbc-adapter"
|
185
|
-
|
186
|
-
# mysql
|
187
|
-
gem "activerecord-jdbcmysql-adapter", :github => "jruby/activerecord-jdbc-adapter"
|
188
|
-
```
|
189
|
-
|
190
178
|
## Upgrading to 2.0
|
191
179
|
|
192
180
|
Groupdate 2.0 brings a number a great improvements. Here are two things to be aware of:
|
data/groupdate.gemspec
CHANGED
@@ -22,7 +22,7 @@ Gem::Specification.new do |spec|
|
|
22
22
|
|
23
23
|
spec.add_development_dependency "bundler", "~> 1.3"
|
24
24
|
spec.add_development_dependency "rake"
|
25
|
-
spec.add_development_dependency "minitest"
|
25
|
+
spec.add_development_dependency "minitest"
|
26
26
|
spec.add_development_dependency "activerecord"
|
27
27
|
|
28
28
|
if RUBY_PLATFORM == "java"
|
data/lib/groupdate/magic.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require "i18n"
|
2
|
+
|
1
3
|
module Groupdate
|
2
4
|
class Magic
|
3
5
|
attr_accessor :field, :options
|
@@ -16,7 +18,12 @@ module Groupdate
|
|
16
18
|
end
|
17
19
|
|
18
20
|
def group_by(enum, &block)
|
19
|
-
|
21
|
+
group = enum.group_by{|v| v = yield(v); v ? round_time(v) : nil }
|
22
|
+
if options[:series] == false
|
23
|
+
group
|
24
|
+
else
|
25
|
+
series(group, [])
|
26
|
+
end
|
20
27
|
end
|
21
28
|
|
22
29
|
def relation(column, relation)
|
@@ -103,13 +110,16 @@ module Groupdate
|
|
103
110
|
# undo reverse since we do not want this to appear in the query
|
104
111
|
reverse = relation.reverse_order_value
|
105
112
|
if reverse
|
106
|
-
relation = relation.reverse_order
|
113
|
+
relation = relation.except(:reverse_order)
|
107
114
|
end
|
108
115
|
order = relation.order_values.first
|
109
116
|
if order.is_a?(String)
|
110
117
|
parts = order.split(" ")
|
111
|
-
reverse_order = (parts.size == 2 && parts[0].to_sym == field && parts[1].to_s.downcase == "desc")
|
112
|
-
|
118
|
+
reverse_order = (parts.size == 2 && (parts[0].to_sym == field || (activerecord42? && parts[0] == "#{relation.quoted_table_name}.#{relation.quoted_primary_key}")) && parts[1].to_s.downcase == "desc")
|
119
|
+
if reverse_order
|
120
|
+
reverse = !reverse
|
121
|
+
relation = relation.reorder(relation.order_values[1..-1])
|
122
|
+
end
|
113
123
|
end
|
114
124
|
|
115
125
|
multiple_groups = relation.group_values.size > 1
|
@@ -198,8 +208,8 @@ module Groupdate
|
|
198
208
|
|
199
209
|
step = 1.send(field)
|
200
210
|
|
201
|
-
while
|
202
|
-
series <<
|
211
|
+
while (next_step = round_time(series.last + step)) and time_range.cover?(next_step)
|
212
|
+
series << next_step
|
203
213
|
end
|
204
214
|
|
205
215
|
if multiple_groups
|
@@ -221,6 +231,7 @@ module Groupdate
|
|
221
231
|
series = series.to_a.reverse
|
222
232
|
end
|
223
233
|
|
234
|
+
locale = options[:locale] || I18n.locale
|
224
235
|
key_format =
|
225
236
|
if options[:format]
|
226
237
|
if options[:format].respond_to?(:call)
|
@@ -238,15 +249,17 @@ module Groupdate
|
|
238
249
|
when :month_of_year
|
239
250
|
key = Date.new(2014, key, 1).to_time
|
240
251
|
end
|
241
|
-
|
252
|
+
I18n.localize(key, format: options[:format].to_s, locale: locale)
|
242
253
|
end
|
243
254
|
end
|
244
255
|
else
|
245
256
|
lambda{|k| k }
|
246
257
|
end
|
247
258
|
|
259
|
+
value = 0
|
248
260
|
Hash[series.map do |k|
|
249
|
-
|
261
|
+
value = count[k] || (@options[:carry_forward] && value) || default_value
|
262
|
+
[multiple_groups ? k[0...@group_index] + [key_format.call(k[@group_index])] + k[(@group_index + 1)..-1] : key_format.call(k), value]
|
250
263
|
end]
|
251
264
|
end
|
252
265
|
|
@@ -286,5 +299,9 @@ module Groupdate
|
|
286
299
|
time.is_a?(Time) ? time + day_start.hours : time
|
287
300
|
end
|
288
301
|
|
302
|
+
def activerecord42?
|
303
|
+
ActiveRecord::VERSION::STRING.starts_with?("4.2.")
|
304
|
+
end
|
305
|
+
|
289
306
|
end
|
290
307
|
end
|
data/lib/groupdate/version.rb
CHANGED
data/test/test_helper.rb
CHANGED
@@ -3,12 +3,10 @@ Bundler.require(:default)
|
|
3
3
|
require "minitest/autorun"
|
4
4
|
require "minitest/pride"
|
5
5
|
require "logger"
|
6
|
-
require "active_record"
|
7
6
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
end
|
7
|
+
Minitest::Test = Minitest::Unit::TestCase unless defined?(Minitest::Test)
|
8
|
+
|
9
|
+
ENV["TZ"] = "UTC"
|
12
10
|
|
13
11
|
# for debugging
|
14
12
|
# ActiveRecord::Base.logger = Logger.new(STDOUT)
|
@@ -24,6 +22,14 @@ end
|
|
24
22
|
class Post < ActiveRecord::Base
|
25
23
|
end
|
26
24
|
|
25
|
+
# i18n
|
26
|
+
I18n.enforce_available_locales = true
|
27
|
+
I18n.backend.store_translations :de, {
|
28
|
+
:date => {
|
29
|
+
:abbr_month_names => %w(Jan Feb Mar Apr Mai Jun Jul Aug Sep Okt Nov Dez).unshift(nil)
|
30
|
+
}
|
31
|
+
}
|
32
|
+
|
27
33
|
# migrations
|
28
34
|
%w(postgresql mysql2).each do |adapter|
|
29
35
|
ActiveRecord::Base.establish_connection :adapter => adapter, :database => "groupdate_test", :username => adapter == "mysql2" ? "root" : nil
|
@@ -49,7 +55,11 @@ module TestGroupdate
|
|
49
55
|
# second
|
50
56
|
|
51
57
|
def test_second_end_of_second
|
52
|
-
|
58
|
+
if ActiveRecord::Base.connection.adapter_name == "Mysql2" and ActiveRecord::VERSION::STRING.starts_with?("4.2.")
|
59
|
+
skip # no millisecond precision
|
60
|
+
else
|
61
|
+
assert_result_time :second, "2013-05-03 00:00:00 UTC", "2013-05-03 00:00:00.999"
|
62
|
+
end
|
53
63
|
end
|
54
64
|
|
55
65
|
def test_second_start_of_second
|
@@ -713,6 +723,19 @@ module TestGroupdate
|
|
713
723
|
assert_format :month_of_year, "Jan", "%b"
|
714
724
|
end
|
715
725
|
|
726
|
+
def test_format_locale
|
727
|
+
create_user "2014-10-01 00:00:00 UTC"
|
728
|
+
assert_equal ({"Okt" => 1}), User.group_by_day(:created_at, format: "%b", locale: :de).count
|
729
|
+
end
|
730
|
+
|
731
|
+
def test_format_locale_global
|
732
|
+
create_user "2014-10-01 00:00:00 UTC"
|
733
|
+
I18n.locale = :de
|
734
|
+
assert_equal ({"Okt" => 1}), User.group_by_day(:created_at, format: "%b").count
|
735
|
+
ensure
|
736
|
+
I18n.locale = :en
|
737
|
+
end
|
738
|
+
|
716
739
|
def test_format_multiple_groups
|
717
740
|
create_user "2014-03-01 00:00:00 UTC"
|
718
741
|
assert_equal ({["Sun", 1] => 1}), User.group_by_week(:created_at, format: "%a").group(:score).count
|
@@ -737,6 +760,28 @@ module TestGroupdate
|
|
737
760
|
end
|
738
761
|
end
|
739
762
|
|
763
|
+
# Brasilia Summer Time
|
764
|
+
|
765
|
+
def test_brasilia_summer_time
|
766
|
+
# must parse and convert to UTC for ActiveRecord 3.1
|
767
|
+
create_user(brasilia.parse("2014-10-19 02:00:00").utc.to_s)
|
768
|
+
create_user(brasilia.parse("2014-10-20 02:00:00").utc.to_s)
|
769
|
+
expected = {
|
770
|
+
brasilia.parse("2014-10-19 01:00:00") => 1,
|
771
|
+
brasilia.parse("2014-10-20 00:00:00") => 1
|
772
|
+
}
|
773
|
+
assert_equal expected, User.group_by_day(:created_at, time_zone: "Brasilia").count
|
774
|
+
end
|
775
|
+
|
776
|
+
# carry_forward option
|
777
|
+
|
778
|
+
def test_carry_forward
|
779
|
+
create_user "2014-05-01 00:00:00 UTC"
|
780
|
+
create_user "2014-05-01 00:00:00 UTC"
|
781
|
+
create_user "2014-05-03 00:00:00 UTC"
|
782
|
+
assert_equal 2, User.group_by_day(:created_at, carry_forward: true).count[utc.parse("2014-05-02 00:00:00 UTC")]
|
783
|
+
end
|
784
|
+
|
740
785
|
# helpers
|
741
786
|
|
742
787
|
def assert_format(method, expected, format, options = {})
|
@@ -778,6 +823,10 @@ module TestGroupdate
|
|
778
823
|
ActiveSupport::TimeZone["UTC"]
|
779
824
|
end
|
780
825
|
|
826
|
+
def brasilia
|
827
|
+
ActiveSupport::TimeZone["Brasilia"]
|
828
|
+
end
|
829
|
+
|
781
830
|
def teardown
|
782
831
|
User.delete_all
|
783
832
|
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.4.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: 2014-
|
11
|
+
date: 2014-12-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -58,14 +58,14 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
61
|
+
version: '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: '
|
68
|
+
version: '0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: activerecord
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -125,6 +125,7 @@ files:
|
|
125
125
|
- gemfiles/activerecord31.gemfile
|
126
126
|
- gemfiles/activerecord32.gemfile
|
127
127
|
- gemfiles/activerecord40.gemfile
|
128
|
+
- gemfiles/activerecord41.gemfile
|
128
129
|
- groupdate.gemspec
|
129
130
|
- lib/groupdate.rb
|
130
131
|
- lib/groupdate/active_record.rb
|
@@ -167,4 +168,3 @@ test_files:
|
|
167
168
|
- test/mysql_test.rb
|
168
169
|
- test/postgresql_test.rb
|
169
170
|
- test/test_helper.rb
|
170
|
-
has_rdoc:
|