groupdate 2.5.2 → 2.5.3
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/README.md +6 -5
 - data/lib/groupdate.rb +3 -5
 - data/lib/groupdate/magic.rb +23 -19
 - data/lib/groupdate/series.rb +4 -0
 - data/lib/groupdate/version.rb +1 -1
 - data/test/enumerable_test.rb +29 -3
 - data/test/mysql_test.rb +6 -1
 - data/test/postgresql_test.rb +6 -5
 - data/test/test_helper.rb +318 -253
 - metadata +3 -3
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA1:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 2e5361eb118741ab6aae412f5463db1813f85fe2
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 0aa40c54eadeb578914db75567bff930fb0dbef8
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: e642a4eb6084d4a1d339a193b549dd34e13298d082f42ecc58b02803c37296e62d8f5df7773a5cfbe4e8ba087ece17b7b52c362219d0cc307ab2210e25a88f4e
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: f55793c8987b1dd1d49ce7dbba35ddaf8033e5a4b627e983b208df5daf296b150afc4816fcd8c425bfaccc1c3842a83af631cb50e5d21b0fa700d36ef563b5e7
         
     | 
    
        data/CHANGELOG.md
    CHANGED
    
    
    
        data/README.md
    CHANGED
    
    | 
         @@ -21,8 +21,6 @@ Supports PostgreSQL and MySQL, plus arrays and hashes 
     | 
|
| 
       21 
21 
     | 
    
         | 
| 
       22 
22 
     | 
    
         
             
            ## Get Started
         
     | 
| 
       23 
23 
     | 
    
         | 
| 
       24 
     | 
    
         
            -
            Group by day
         
     | 
| 
       25 
     | 
    
         
            -
             
     | 
| 
       26 
24 
     | 
    
         
             
            ```ruby
         
     | 
| 
       27 
25 
     | 
    
         
             
            User.group_by_day(:created_at).count
         
     | 
| 
       28 
26 
     | 
    
         
             
            # {
         
     | 
| 
         @@ -34,11 +32,12 @@ User.group_by_day(:created_at).count 
     | 
|
| 
       34 
32 
     | 
    
         | 
| 
       35 
33 
     | 
    
         
             
            Results are returned in ascending order by default, so no need to sort.
         
     | 
| 
       36 
34 
     | 
    
         | 
| 
       37 
     | 
    
         
            -
            You can  
     | 
| 
      
 35 
     | 
    
         
            +
            You can group by:
         
     | 
| 
       38 
36 
     | 
    
         | 
| 
       39 
37 
     | 
    
         
             
            - second
         
     | 
| 
       40 
38 
     | 
    
         
             
            - minute
         
     | 
| 
       41 
39 
     | 
    
         
             
            - hour
         
     | 
| 
      
 40 
     | 
    
         
            +
            - day
         
     | 
| 
       42 
41 
     | 
    
         
             
            - week
         
     | 
| 
       43 
42 
     | 
    
         
             
            - month
         
     | 
| 
       44 
43 
     | 
    
         
             
            - quarter
         
     | 
| 
         @@ -72,7 +71,7 @@ User.group_by_week(:created_at, time_zone: "Pacific Time (US & Canada)").count 
     | 
|
| 
       72 
71 
     | 
    
         
             
            # }
         
     | 
| 
       73 
72 
     | 
    
         
             
            ```
         
     | 
| 
       74 
73 
     | 
    
         | 
| 
       75 
     | 
    
         
            -
            Time zone objects also work.
         
     | 
| 
      
 74 
     | 
    
         
            +
            Time zone objects also work. To see a list of available time zones in Rails, run `rake time:zones:all`.
         
     | 
| 
       76 
75 
     | 
    
         | 
| 
       77 
76 
     | 
    
         
             
            ### Week Start
         
     | 
| 
       78 
77 
     | 
    
         | 
| 
         @@ -138,7 +137,9 @@ User.group_by_day(:created_at).order("day desc").count 
     | 
|
| 
       138 
137 
     | 
    
         | 
| 
       139 
138 
     | 
    
         
             
            ### Keys
         
     | 
| 
       140 
139 
     | 
    
         | 
| 
       141 
     | 
    
         
            -
             
     | 
| 
      
 140 
     | 
    
         
            +
            Keys are returned as time objects for the start of the period.
         
     | 
| 
      
 141 
     | 
    
         
            +
             
     | 
| 
      
 142 
     | 
    
         
            +
            To get keys as date objects instead, use:
         
     | 
| 
       142 
143 
     | 
    
         | 
| 
       143 
144 
     | 
    
         
             
            ```ruby
         
     | 
| 
       144 
145 
     | 
    
         
             
            User.group_by_day(:created_at, dates: true).count
         
     | 
    
        data/lib/groupdate.rb
    CHANGED
    
    | 
         @@ -16,9 +16,7 @@ module Groupdate 
     | 
|
| 
       16 
16 
     | 
    
         
             
            end
         
     | 
| 
       17 
17 
     | 
    
         | 
| 
       18 
18 
     | 
    
         
             
            require "groupdate/enumerable"
         
     | 
| 
       19 
     | 
    
         
            -
             
     | 
| 
       20 
     | 
    
         
            -
             
     | 
| 
       21 
     | 
    
         
            -
             
     | 
| 
       22 
     | 
    
         
            -
              # do nothing
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
            ActiveSupport.on_load(:active_record) do
         
     | 
| 
      
 21 
     | 
    
         
            +
              require "groupdate/active_record"
         
     | 
| 
       23 
22 
     | 
    
         
             
            end
         
     | 
| 
       24 
     | 
    
         
            -
            require "groupdate/active_record" if defined?(ActiveRecord)
         
     | 
    
        data/lib/groupdate/magic.rb
    CHANGED
    
    | 
         @@ -36,17 +36,17 @@ module Groupdate 
     | 
|
| 
       36 
36 
     | 
    
         
             
                      case field
         
     | 
| 
       37 
37 
     | 
    
         
             
                      when :day_of_week # Sunday = 0, Monday = 1, etc
         
     | 
| 
       38 
38 
     | 
    
         
             
                        # use CONCAT for consistent return type (String)
         
     | 
| 
       39 
     | 
    
         
            -
                        ["DAYOFWEEK(CONVERT_TZ(DATE_SUB(#{column}, INTERVAL #{day_start}  
     | 
| 
      
 39 
     | 
    
         
            +
                        ["DAYOFWEEK(CONVERT_TZ(DATE_SUB(#{column}, INTERVAL #{day_start} second), '+00:00', ?)) - 1", time_zone]
         
     | 
| 
       40 
40 
     | 
    
         
             
                      when :hour_of_day
         
     | 
| 
       41 
     | 
    
         
            -
                        ["(EXTRACT(HOUR from CONVERT_TZ(#{column}, '+00:00', ?)) + 24 - #{day_start}) % 24", time_zone]
         
     | 
| 
      
 41 
     | 
    
         
            +
                        ["(EXTRACT(HOUR from CONVERT_TZ(#{column}, '+00:00', ?)) + 24 - #{day_start / 3600}) % 24", time_zone]
         
     | 
| 
       42 
42 
     | 
    
         
             
                      when :day_of_month
         
     | 
| 
       43 
     | 
    
         
            -
                        ["DAYOFMONTH(CONVERT_TZ(DATE_SUB(#{column}, INTERVAL #{day_start}  
     | 
| 
      
 43 
     | 
    
         
            +
                        ["DAYOFMONTH(CONVERT_TZ(DATE_SUB(#{column}, INTERVAL #{day_start} second), '+00:00', ?))", time_zone]
         
     | 
| 
       44 
44 
     | 
    
         
             
                      when :month_of_year
         
     | 
| 
       45 
     | 
    
         
            -
                        ["MONTH(CONVERT_TZ(DATE_SUB(#{column}, INTERVAL #{day_start}  
     | 
| 
      
 45 
     | 
    
         
            +
                        ["MONTH(CONVERT_TZ(DATE_SUB(#{column}, INTERVAL #{day_start} second), '+00:00', ?))", time_zone]
         
     | 
| 
       46 
46 
     | 
    
         
             
                      when :week
         
     | 
| 
       47 
     | 
    
         
            -
                        ["CONVERT_TZ(DATE_FORMAT(CONVERT_TZ(DATE_SUB(#{column}, INTERVAL ((#{7 - week_start} + WEEKDAY(CONVERT_TZ(#{column}, '+00:00', ?) - INTERVAL #{day_start}  
     | 
| 
      
 47 
     | 
    
         
            +
                        ["CONVERT_TZ(DATE_FORMAT(CONVERT_TZ(DATE_SUB(#{column}, INTERVAL ((#{7 - week_start} + WEEKDAY(CONVERT_TZ(#{column}, '+00:00', ?) - INTERVAL #{day_start} second)) % 7) DAY) - INTERVAL #{day_start} second, '+00:00', ?), '%Y-%m-%d 00:00:00') + INTERVAL #{day_start} second, ?, '+00:00')", time_zone, time_zone, time_zone]
         
     | 
| 
       48 
48 
     | 
    
         
             
                      when :quarter
         
     | 
| 
       49 
     | 
    
         
            -
                        ["DATE_ADD(CONVERT_TZ(DATE_FORMAT(DATE(CONCAT(EXTRACT(YEAR FROM CONVERT_TZ(DATE_SUB(#{column}, INTERVAL #{day_start}  
     | 
| 
      
 49 
     | 
    
         
            +
                        ["DATE_ADD(CONVERT_TZ(DATE_FORMAT(DATE(CONCAT(EXTRACT(YEAR FROM CONVERT_TZ(DATE_SUB(#{column}, INTERVAL #{day_start} second), '+00:00', ?)), '-', LPAD(1 + 3 * (QUARTER(CONVERT_TZ(DATE_SUB(#{column}, INTERVAL #{day_start} second), '+00:00', ?)) - 1), 2, '00'), '-01')), '%Y-%m-%d %H:%i:%S'), ?, '+00:00'), INTERVAL #{day_start} second)", time_zone, time_zone, time_zone]
         
     | 
| 
       50 
50 
     | 
    
         
             
                      else
         
     | 
| 
       51 
51 
     | 
    
         
             
                        format =
         
     | 
| 
       52 
52 
     | 
    
         
             
                          case field
         
     | 
| 
         @@ -64,27 +64,31 @@ module Groupdate 
     | 
|
| 
       64 
64 
     | 
    
         
             
                            "%Y-01-01 00:00:00"
         
     | 
| 
       65 
65 
     | 
    
         
             
                          end
         
     | 
| 
       66 
66 
     | 
    
         | 
| 
       67 
     | 
    
         
            -
                        ["DATE_ADD(CONVERT_TZ(DATE_FORMAT(CONVERT_TZ(DATE_SUB(#{column}, INTERVAL #{day_start}  
     | 
| 
      
 67 
     | 
    
         
            +
                        ["DATE_ADD(CONVERT_TZ(DATE_FORMAT(CONVERT_TZ(DATE_SUB(#{column}, INTERVAL #{day_start} second), '+00:00', ?), '#{format}'), ?, '+00:00'), INTERVAL #{day_start} second)", time_zone, time_zone]
         
     | 
| 
       68 
68 
     | 
    
         
             
                      end
         
     | 
| 
       69 
69 
     | 
    
         
             
                    when "PostgreSQL", "PostGIS"
         
     | 
| 
       70 
70 
     | 
    
         
             
                      case field
         
     | 
| 
       71 
71 
     | 
    
         
             
                      when :day_of_week
         
     | 
| 
       72 
     | 
    
         
            -
                        ["EXTRACT(DOW from #{column}::timestamptz AT TIME ZONE ? - INTERVAL '#{day_start}  
     | 
| 
      
 72 
     | 
    
         
            +
                        ["EXTRACT(DOW from #{column}::timestamptz AT TIME ZONE ? - INTERVAL '#{day_start} second')::integer", time_zone]
         
     | 
| 
       73 
73 
     | 
    
         
             
                      when :hour_of_day
         
     | 
| 
       74 
     | 
    
         
            -
                        ["EXTRACT(HOUR from #{column}::timestamptz AT TIME ZONE ? - INTERVAL '#{day_start}  
     | 
| 
      
 74 
     | 
    
         
            +
                        ["EXTRACT(HOUR from #{column}::timestamptz AT TIME ZONE ? - INTERVAL '#{day_start} second')::integer", time_zone]
         
     | 
| 
       75 
75 
     | 
    
         
             
                      when :day_of_month
         
     | 
| 
       76 
     | 
    
         
            -
                        ["EXTRACT(DAY from #{column}::timestamptz AT TIME ZONE ? - INTERVAL '#{day_start}  
     | 
| 
      
 76 
     | 
    
         
            +
                        ["EXTRACT(DAY from #{column}::timestamptz AT TIME ZONE ? - INTERVAL '#{day_start} second')::integer", time_zone]
         
     | 
| 
       77 
77 
     | 
    
         
             
                      when :month_of_year
         
     | 
| 
       78 
     | 
    
         
            -
                        ["EXTRACT(MONTH from #{column}::timestamptz AT TIME ZONE ? - INTERVAL '#{day_start}  
     | 
| 
      
 78 
     | 
    
         
            +
                        ["EXTRACT(MONTH from #{column}::timestamptz AT TIME ZONE ? - INTERVAL '#{day_start} second')::integer", time_zone]
         
     | 
| 
       79 
79 
     | 
    
         
             
                      when :week # start on Sunday, not PostgreSQL default Monday
         
     | 
| 
       80 
     | 
    
         
            -
                        ["(DATE_TRUNC('#{field}', (#{column}::timestamptz - INTERVAL '#{week_start} day' - INTERVAL '#{day_start}' 
     | 
| 
      
 80 
     | 
    
         
            +
                        ["(DATE_TRUNC('#{field}', (#{column}::timestamptz - INTERVAL '#{week_start} day' - INTERVAL '#{day_start} second') AT TIME ZONE ?) + INTERVAL '#{week_start} day' + INTERVAL '#{day_start} second') AT TIME ZONE ?", time_zone, time_zone]
         
     | 
| 
       81 
81 
     | 
    
         
             
                      else
         
     | 
| 
       82 
     | 
    
         
            -
                        ["(DATE_TRUNC('#{field}', (#{column}::timestamptz - INTERVAL '#{day_start}  
     | 
| 
      
 82 
     | 
    
         
            +
                        ["(DATE_TRUNC('#{field}', (#{column}::timestamptz - INTERVAL '#{day_start} second') AT TIME ZONE ?) + INTERVAL '#{day_start} second') AT TIME ZONE ?", time_zone, time_zone]
         
     | 
| 
       83 
83 
     | 
    
         
             
                      end
         
     | 
| 
       84 
84 
     | 
    
         
             
                    else
         
     | 
| 
       85 
85 
     | 
    
         
             
                      raise "Connection adapter not supported: #{adapter_name}"
         
     | 
| 
       86 
86 
     | 
    
         
             
                    end
         
     | 
| 
       87 
87 
     | 
    
         | 
| 
      
 88 
     | 
    
         
            +
                  if adapter_name == "MySQL" && field == :week
         
     | 
| 
      
 89 
     | 
    
         
            +
                    query[0] = "CAST(#{query[0]} AS DATETIME)"
         
     | 
| 
      
 90 
     | 
    
         
            +
                  end
         
     | 
| 
      
 91 
     | 
    
         
            +
             
     | 
| 
       88 
92 
     | 
    
         
             
                  group = relation.group(Groupdate::OrderHack.new(relation.send(:sanitize_sql_array, query), field, time_zone))
         
     | 
| 
       89 
93 
     | 
    
         
             
                  if options[:series] == false
         
     | 
| 
       90 
94 
     | 
    
         
             
                    group
         
     | 
| 
         @@ -126,7 +130,7 @@ module Groupdate 
     | 
|
| 
       126 
130 
     | 
    
         
             
                      lambda { |k| k.to_i }
         
     | 
| 
       127 
131 
     | 
    
         
             
                    else
         
     | 
| 
       128 
132 
     | 
    
         
             
                      utc = ActiveSupport::TimeZone["UTC"]
         
     | 
| 
       129 
     | 
    
         
            -
                      lambda { |k| (k.is_a?(String) ? utc.parse(k) : k.to_time).in_time_zone(time_zone) }
         
     | 
| 
      
 133 
     | 
    
         
            +
                      lambda { |k| (k.is_a?(String) || !k.respond_to?(:to_time) ? utc.parse(k.to_s) : k.to_time).in_time_zone(time_zone) }
         
     | 
| 
       130 
134 
     | 
    
         
             
                    end
         
     | 
| 
       131 
135 
     | 
    
         | 
| 
       132 
136 
     | 
    
         
             
                  count =
         
     | 
| 
         @@ -153,7 +157,7 @@ module Groupdate 
     | 
|
| 
       153 
157 
     | 
    
         
             
                end
         
     | 
| 
       154 
158 
     | 
    
         | 
| 
       155 
159 
     | 
    
         
             
                def day_start
         
     | 
| 
       156 
     | 
    
         
            -
                  @day_start ||= (options[:day_start] || Groupdate.day_start). 
     | 
| 
      
 160 
     | 
    
         
            +
                  @day_start ||= ((options[:day_start] || Groupdate.day_start).to_f * 3600).round
         
     | 
| 
       157 
161 
     | 
    
         
             
                end
         
     | 
| 
       158 
162 
     | 
    
         | 
| 
       159 
163 
     | 
    
         
             
                def time_range
         
     | 
| 
         @@ -222,7 +226,7 @@ module Groupdate 
     | 
|
| 
       222 
226 
     | 
    
         
             
                  series =
         
     | 
| 
       223 
227 
     | 
    
         
             
                    if multiple_groups
         
     | 
| 
       224 
228 
     | 
    
         
             
                      keys = count.keys.map { |k| k[0...@group_index] + k[(@group_index + 1)..-1] }.uniq
         
     | 
| 
       225 
     | 
    
         
            -
                      series = series.reverse if reverse
         
     | 
| 
      
 229 
     | 
    
         
            +
                      series = series.to_a.reverse if reverse
         
     | 
| 
       226 
230 
     | 
    
         
             
                      keys.flat_map do |k|
         
     | 
| 
       227 
231 
     | 
    
         
             
                        series.map { |s| k[0...@group_index] + [s] + k[@group_index..-1] }
         
     | 
| 
       228 
232 
     | 
    
         
             
                      end
         
     | 
| 
         @@ -243,7 +247,7 @@ module Groupdate 
     | 
|
| 
       243 
247 
     | 
    
         
             
                        lambda do |key|
         
     | 
| 
       244 
248 
     | 
    
         
             
                          case field
         
     | 
| 
       245 
249 
     | 
    
         
             
                          when :hour_of_day
         
     | 
| 
       246 
     | 
    
         
            -
                            key = sunday + key.hours + day_start. 
     | 
| 
      
 250 
     | 
    
         
            +
                            key = sunday + key.hours + day_start.seconds
         
     | 
| 
       247 
251 
     | 
    
         
             
                          when :day_of_week
         
     | 
| 
       248 
252 
     | 
    
         
             
                            key = sunday + key.days
         
     | 
| 
       249 
253 
     | 
    
         
             
                          when :day_of_month
         
     | 
| 
         @@ -268,7 +272,7 @@ module Groupdate 
     | 
|
| 
       268 
272 
     | 
    
         
             
                end
         
     | 
| 
       269 
273 
     | 
    
         | 
| 
       270 
274 
     | 
    
         
             
                def round_time(time)
         
     | 
| 
       271 
     | 
    
         
            -
                  time = time.to_time.in_time_zone(time_zone) - day_start. 
     | 
| 
      
 275 
     | 
    
         
            +
                  time = time.to_time.in_time_zone(time_zone) - day_start.seconds
         
     | 
| 
       272 
276 
     | 
    
         | 
| 
       273 
277 
     | 
    
         
             
                  time =
         
     | 
| 
       274 
278 
     | 
    
         
             
                    case field
         
     | 
| 
         @@ -302,7 +306,7 @@ module Groupdate 
     | 
|
| 
       302 
306 
     | 
    
         
             
                      raise "Invalid field"
         
     | 
| 
       303 
307 
     | 
    
         
             
                    end
         
     | 
| 
       304 
308 
     | 
    
         | 
| 
       305 
     | 
    
         
            -
                  time.is_a?(Time) ? time + day_start. 
     | 
| 
      
 309 
     | 
    
         
            +
                  time.is_a?(Time) ? time + day_start.seconds : time
         
     | 
| 
       306 
310 
     | 
    
         
             
                end
         
     | 
| 
       307 
311 
     | 
    
         | 
| 
       308 
312 
     | 
    
         
             
                def activerecord42?
         
     | 
    
        data/lib/groupdate/series.rb
    CHANGED
    
    
    
        data/lib/groupdate/version.rb
    CHANGED
    
    
    
        data/test/enumerable_test.rb
    CHANGED
    
    | 
         @@ -1,11 +1,12 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            require_relative "test_helper"
         
     | 
| 
      
 2 
     | 
    
         
            +
            require "ostruct"
         
     | 
| 
       2 
3 
     | 
    
         | 
| 
       3 
4 
     | 
    
         
             
            class TestEnumerable < Minitest::Test
         
     | 
| 
       4 
5 
     | 
    
         
             
              include TestGroupdate
         
     | 
| 
       5 
6 
     | 
    
         | 
| 
       6 
7 
     | 
    
         
             
              def test_enumerable
         
     | 
| 
       7 
     | 
    
         
            -
                user_a =  
     | 
| 
       8 
     | 
    
         
            -
                user_b =  
     | 
| 
      
 8 
     | 
    
         
            +
                user_a = create_user("2014-01-21")
         
     | 
| 
      
 9 
     | 
    
         
            +
                user_b = create_user("2014-03-14")
         
     | 
| 
       9 
10 
     | 
    
         
             
                expected = {
         
     | 
| 
       10 
11 
     | 
    
         
             
                  utc.parse("2014-01-01") => [user_a],
         
     | 
| 
       11 
12 
     | 
    
         
             
                  utc.parse("2014-02-01") => [],
         
     | 
| 
         @@ -19,6 +20,31 @@ class TestEnumerable < Minitest::Test 
     | 
|
| 
       19 
20 
     | 
    
         
             
              end
         
     | 
| 
       20 
21 
     | 
    
         | 
| 
       21 
22 
     | 
    
         
             
              def call_method(method, field, options)
         
     | 
| 
       22 
     | 
    
         
            -
                Hash[ 
     | 
| 
      
 23 
     | 
    
         
            +
                Hash[@users.group_by_period(method, options) { |u| u.send(field) }.map { |k, v| [k, v.size] }]
         
     | 
| 
      
 24 
     | 
    
         
            +
              end
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
              def create_user(created_at, score = 1)
         
     | 
| 
      
 27 
     | 
    
         
            +
                user =
         
     | 
| 
      
 28 
     | 
    
         
            +
                  OpenStruct.new(
         
     | 
| 
      
 29 
     | 
    
         
            +
                    name: "Andrew",
         
     | 
| 
      
 30 
     | 
    
         
            +
                    score: score,
         
     | 
| 
      
 31 
     | 
    
         
            +
                    created_at: created_at ? utc.parse(created_at) : nil,
         
     | 
| 
      
 32 
     | 
    
         
            +
                    created_on: created_at ? Date.parse(created_at) : nil
         
     | 
| 
      
 33 
     | 
    
         
            +
                  )
         
     | 
| 
      
 34 
     | 
    
         
            +
                @users << user
         
     | 
| 
      
 35 
     | 
    
         
            +
                user
         
     | 
| 
      
 36 
     | 
    
         
            +
              end
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
              def setup
         
     | 
| 
      
 39 
     | 
    
         
            +
                super
         
     | 
| 
      
 40 
     | 
    
         
            +
                @users = []
         
     | 
| 
      
 41 
     | 
    
         
            +
              end
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
      
 43 
     | 
    
         
            +
              def teardown
         
     | 
| 
      
 44 
     | 
    
         
            +
                # do nothing
         
     | 
| 
      
 45 
     | 
    
         
            +
              end
         
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
      
 47 
     | 
    
         
            +
              def enumerable_test?
         
     | 
| 
      
 48 
     | 
    
         
            +
                true
         
     | 
| 
       23 
49 
     | 
    
         
             
              end
         
     | 
| 
       24 
50 
     | 
    
         
             
            end
         
     | 
    
        data/test/mysql_test.rb
    CHANGED
    
    | 
         @@ -2,9 +2,14 @@ require_relative "test_helper" 
     | 
|
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            class TestMysql < Minitest::Test
         
     | 
| 
       4 
4 
     | 
    
         
             
              include TestGroupdate
         
     | 
| 
      
 5 
     | 
    
         
            +
              include TestDatabase
         
     | 
| 
       5 
6 
     | 
    
         | 
| 
       6 
7 
     | 
    
         
             
              def setup
         
     | 
| 
       7 
8 
     | 
    
         
             
                super
         
     | 
| 
       8 
     | 
    
         
            -
                 
     | 
| 
      
 9 
     | 
    
         
            +
                @@setup ||= begin
         
     | 
| 
      
 10 
     | 
    
         
            +
                  ActiveRecord::Base.establish_connection adapter: "mysql2", database: "groupdate_test", username: "root"
         
     | 
| 
      
 11 
     | 
    
         
            +
                  create_tables
         
     | 
| 
      
 12 
     | 
    
         
            +
                  true
         
     | 
| 
      
 13 
     | 
    
         
            +
                end
         
     | 
| 
       9 
14 
     | 
    
         
             
              end
         
     | 
| 
       10 
15 
     | 
    
         
             
            end
         
     | 
    
        data/test/postgresql_test.rb
    CHANGED
    
    | 
         @@ -2,13 +2,14 @@ require_relative "test_helper" 
     | 
|
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            class TestPostgresql < Minitest::Test
         
     | 
| 
       4 
4 
     | 
    
         
             
              include TestGroupdate
         
     | 
| 
      
 5 
     | 
    
         
            +
              include TestDatabase
         
     | 
| 
       5 
6 
     | 
    
         | 
| 
       6 
7 
     | 
    
         
             
              def setup
         
     | 
| 
       7 
8 
     | 
    
         
             
                super
         
     | 
| 
       8 
     | 
    
         
            -
                 
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
       12 
     | 
    
         
            -
                 
     | 
| 
      
 9 
     | 
    
         
            +
                @@setup ||= begin
         
     | 
| 
      
 10 
     | 
    
         
            +
                  ActiveRecord::Base.establish_connection adapter: "postgresql", database: "groupdate_test"
         
     | 
| 
      
 11 
     | 
    
         
            +
                  create_tables
         
     | 
| 
      
 12 
     | 
    
         
            +
                  true
         
     | 
| 
      
 13 
     | 
    
         
            +
                end
         
     | 
| 
       13 
14 
     | 
    
         
             
              end
         
     | 
| 
       14 
15 
     | 
    
         
             
            end
         
     | 
    
        data/test/test_helper.rb
    CHANGED
    
    | 
         @@ -3,6 +3,7 @@ Bundler.require(:default) 
     | 
|
| 
       3 
3 
     | 
    
         
             
            require "minitest/autorun"
         
     | 
| 
       4 
4 
     | 
    
         
             
            require "minitest/pride"
         
     | 
| 
       5 
5 
     | 
    
         
             
            require "logger"
         
     | 
| 
      
 6 
     | 
    
         
            +
            require "active_record"
         
     | 
| 
       6 
7 
     | 
    
         | 
| 
       7 
8 
     | 
    
         
             
            Minitest::Test = Minitest::Unit::TestCase unless defined?(Minitest::Test)
         
     | 
| 
       8 
9 
     | 
    
         | 
| 
         @@ -32,13 +33,14 @@ time: { 
     | 
|
| 
       32 
33 
     | 
    
         
             
            }
         
     | 
| 
       33 
34 
     | 
    
         | 
| 
       34 
35 
     | 
    
         
             
            # migrations
         
     | 
| 
       35 
     | 
    
         
            -
             
     | 
| 
       36 
     | 
    
         
            -
              ActiveRecord:: 
     | 
| 
      
 36 
     | 
    
         
            +
            def create_tables
         
     | 
| 
      
 37 
     | 
    
         
            +
              ActiveRecord::Migration.verbose = false
         
     | 
| 
       37 
38 
     | 
    
         | 
| 
       38 
39 
     | 
    
         
             
              ActiveRecord::Migration.create_table :users, force: true do |t|
         
     | 
| 
       39 
40 
     | 
    
         
             
                t.string :name
         
     | 
| 
       40 
41 
     | 
    
         
             
                t.integer :score
         
     | 
| 
       41 
42 
     | 
    
         
             
                t.timestamp :created_at
         
     | 
| 
      
 43 
     | 
    
         
            +
                t.date :created_on
         
     | 
| 
       42 
44 
     | 
    
         
             
              end
         
     | 
| 
       43 
45 
     | 
    
         | 
| 
       44 
46 
     | 
    
         
             
              ActiveRecord::Migration.create_table :posts, force: true do |t|
         
     | 
| 
         @@ -47,6 +49,304 @@ time: { 
     | 
|
| 
       47 
49 
     | 
    
         
             
              end
         
     | 
| 
       48 
50 
     | 
    
         
             
            end
         
     | 
| 
       49 
51 
     | 
    
         | 
| 
      
 52 
     | 
    
         
            +
            module TestDatabase
         
     | 
| 
      
 53 
     | 
    
         
            +
              def test_zeros_previous_scope
         
     | 
| 
      
 54 
     | 
    
         
            +
                create_user "2013-05-01 00:00:00 UTC"
         
     | 
| 
      
 55 
     | 
    
         
            +
                expected = {
         
     | 
| 
      
 56 
     | 
    
         
            +
                  utc.parse("2013-05-01 00:00:00 UTC") => 0
         
     | 
| 
      
 57 
     | 
    
         
            +
                }
         
     | 
| 
      
 58 
     | 
    
         
            +
                assert_equal expected, User.where("id = 0").group_by_day(:created_at, range: Time.parse("2013-05-01 00:00:00 UTC")..Time.parse("2013-05-01 23:59:59 UTC")).count
         
     | 
| 
      
 59 
     | 
    
         
            +
              end
         
     | 
| 
      
 60 
     | 
    
         
            +
             
     | 
| 
      
 61 
     | 
    
         
            +
              def test_order_hour_of_day
         
     | 
| 
      
 62 
     | 
    
         
            +
                assert_equal 23, User.group_by_hour_of_day(:created_at).order("hour_of_day desc").count.keys.first
         
     | 
| 
      
 63 
     | 
    
         
            +
              end
         
     | 
| 
      
 64 
     | 
    
         
            +
             
     | 
| 
      
 65 
     | 
    
         
            +
              def test_order_hour_of_day_case
         
     | 
| 
      
 66 
     | 
    
         
            +
                assert_equal 23, User.group_by_hour_of_day(:created_at).order("hour_of_day DESC").count.keys.first
         
     | 
| 
      
 67 
     | 
    
         
            +
              end
         
     | 
| 
      
 68 
     | 
    
         
            +
             
     | 
| 
      
 69 
     | 
    
         
            +
              def test_order_hour_of_day_reverse
         
     | 
| 
      
 70 
     | 
    
         
            +
                skip if ActiveRecord::VERSION::MAJOR == 5
         
     | 
| 
      
 71 
     | 
    
         
            +
                assert_equal 23, User.group_by_hour_of_day(:created_at).reverse_order.count.keys.first
         
     | 
| 
      
 72 
     | 
    
         
            +
              end
         
     | 
| 
      
 73 
     | 
    
         
            +
             
     | 
| 
      
 74 
     | 
    
         
            +
              def test_order_hour_of_day_order_reverse
         
     | 
| 
      
 75 
     | 
    
         
            +
                skip if ActiveRecord::VERSION::MAJOR == 5
         
     | 
| 
      
 76 
     | 
    
         
            +
                assert_equal 0, User.group_by_hour_of_day(:created_at).order("hour_of_day desc").reverse_order.count.keys.first
         
     | 
| 
      
 77 
     | 
    
         
            +
              end
         
     | 
| 
      
 78 
     | 
    
         
            +
             
     | 
| 
      
 79 
     | 
    
         
            +
              def test_table_name
         
     | 
| 
      
 80 
     | 
    
         
            +
                assert_empty User.group_by_day("users.created_at").count
         
     | 
| 
      
 81 
     | 
    
         
            +
              end
         
     | 
| 
      
 82 
     | 
    
         
            +
             
     | 
| 
      
 83 
     | 
    
         
            +
              def test_previous_scopes
         
     | 
| 
      
 84 
     | 
    
         
            +
                create_user "2013-05-01 00:00:00 UTC"
         
     | 
| 
      
 85 
     | 
    
         
            +
                assert_empty User.where("id = 0").group_by_day(:created_at).count
         
     | 
| 
      
 86 
     | 
    
         
            +
              end
         
     | 
| 
      
 87 
     | 
    
         
            +
             
     | 
| 
      
 88 
     | 
    
         
            +
              def test_where_after
         
     | 
| 
      
 89 
     | 
    
         
            +
                create_user "2013-05-01 00:00:00 UTC"
         
     | 
| 
      
 90 
     | 
    
         
            +
                create_user "2013-05-02 00:00:00 UTC"
         
     | 
| 
      
 91 
     | 
    
         
            +
                expected = {utc.parse("2013-05-02 00:00:00 UTC") => 1}
         
     | 
| 
      
 92 
     | 
    
         
            +
                assert_equal expected, User.group_by_day(:created_at).where("created_at > ?", "2013-05-01 00:00:00 UTC").count
         
     | 
| 
      
 93 
     | 
    
         
            +
              end
         
     | 
| 
      
 94 
     | 
    
         
            +
             
     | 
| 
      
 95 
     | 
    
         
            +
              def test_group_before
         
     | 
| 
      
 96 
     | 
    
         
            +
                create_user "2013-05-01 00:00:00 UTC", 1
         
     | 
| 
      
 97 
     | 
    
         
            +
                create_user "2013-05-02 00:00:00 UTC", 2
         
     | 
| 
      
 98 
     | 
    
         
            +
                create_user "2013-05-03 00:00:00 UTC", 2
         
     | 
| 
      
 99 
     | 
    
         
            +
                expected = {
         
     | 
| 
      
 100 
     | 
    
         
            +
                  [1, utc.parse("2013-05-01 00:00:00 UTC")] => 1,
         
     | 
| 
      
 101 
     | 
    
         
            +
                  [1, utc.parse("2013-05-02 00:00:00 UTC")] => 0,
         
     | 
| 
      
 102 
     | 
    
         
            +
                  [1, utc.parse("2013-05-03 00:00:00 UTC")] => 0,
         
     | 
| 
      
 103 
     | 
    
         
            +
                  [2, utc.parse("2013-05-01 00:00:00 UTC")] => 0,
         
     | 
| 
      
 104 
     | 
    
         
            +
                  [2, utc.parse("2013-05-02 00:00:00 UTC")] => 1,
         
     | 
| 
      
 105 
     | 
    
         
            +
                  [2, utc.parse("2013-05-03 00:00:00 UTC")] => 1
         
     | 
| 
      
 106 
     | 
    
         
            +
                }
         
     | 
| 
      
 107 
     | 
    
         
            +
                assert_equal expected, User.group(:score).group_by_day(:created_at).order(:score).count
         
     | 
| 
      
 108 
     | 
    
         
            +
              end
         
     | 
| 
      
 109 
     | 
    
         
            +
             
     | 
| 
      
 110 
     | 
    
         
            +
              def test_group_after
         
     | 
| 
      
 111 
     | 
    
         
            +
                create_user "2013-05-01 00:00:00 UTC", 1
         
     | 
| 
      
 112 
     | 
    
         
            +
                create_user "2013-05-02 00:00:00 UTC", 2
         
     | 
| 
      
 113 
     | 
    
         
            +
                create_user "2013-05-03 00:00:00 UTC", 2
         
     | 
| 
      
 114 
     | 
    
         
            +
                expected = {
         
     | 
| 
      
 115 
     | 
    
         
            +
                  [utc.parse("2013-05-01 00:00:00 UTC"), 1] => 1,
         
     | 
| 
      
 116 
     | 
    
         
            +
                  [utc.parse("2013-05-02 00:00:00 UTC"), 1] => 0,
         
     | 
| 
      
 117 
     | 
    
         
            +
                  [utc.parse("2013-05-03 00:00:00 UTC"), 1] => 0,
         
     | 
| 
      
 118 
     | 
    
         
            +
                  [utc.parse("2013-05-01 00:00:00 UTC"), 2] => 0,
         
     | 
| 
      
 119 
     | 
    
         
            +
                  [utc.parse("2013-05-02 00:00:00 UTC"), 2] => 1,
         
     | 
| 
      
 120 
     | 
    
         
            +
                  [utc.parse("2013-05-03 00:00:00 UTC"), 2] => 1
         
     | 
| 
      
 121 
     | 
    
         
            +
                }
         
     | 
| 
      
 122 
     | 
    
         
            +
                assert_equal expected, User.group_by_day(:created_at).group(:score).order(:score).count
         
     | 
| 
      
 123 
     | 
    
         
            +
              end
         
     | 
| 
      
 124 
     | 
    
         
            +
             
     | 
| 
      
 125 
     | 
    
         
            +
              def test_group_day_of_week
         
     | 
| 
      
 126 
     | 
    
         
            +
                create_user "2013-05-01 00:00:00 UTC", 1
         
     | 
| 
      
 127 
     | 
    
         
            +
                create_user "2013-05-02 00:00:00 UTC", 2
         
     | 
| 
      
 128 
     | 
    
         
            +
                create_user "2013-05-03 00:00:00 UTC", 2
         
     | 
| 
      
 129 
     | 
    
         
            +
                expected = {
         
     | 
| 
      
 130 
     | 
    
         
            +
                  [1, 0] => 0,
         
     | 
| 
      
 131 
     | 
    
         
            +
                  [1, 1] => 0,
         
     | 
| 
      
 132 
     | 
    
         
            +
                  [1, 2] => 0,
         
     | 
| 
      
 133 
     | 
    
         
            +
                  [1, 3] => 1,
         
     | 
| 
      
 134 
     | 
    
         
            +
                  [1, 4] => 0,
         
     | 
| 
      
 135 
     | 
    
         
            +
                  [1, 5] => 0,
         
     | 
| 
      
 136 
     | 
    
         
            +
                  [1, 6] => 0,
         
     | 
| 
      
 137 
     | 
    
         
            +
                  [2, 0] => 0,
         
     | 
| 
      
 138 
     | 
    
         
            +
                  [2, 1] => 0,
         
     | 
| 
      
 139 
     | 
    
         
            +
                  [2, 2] => 0,
         
     | 
| 
      
 140 
     | 
    
         
            +
                  [2, 3] => 0,
         
     | 
| 
      
 141 
     | 
    
         
            +
                  [2, 4] => 1,
         
     | 
| 
      
 142 
     | 
    
         
            +
                  [2, 5] => 1,
         
     | 
| 
      
 143 
     | 
    
         
            +
                  [2, 6] => 0
         
     | 
| 
      
 144 
     | 
    
         
            +
                }
         
     | 
| 
      
 145 
     | 
    
         
            +
                assert_equal expected, User.group(:score).group_by_day_of_week(:created_at).count
         
     | 
| 
      
 146 
     | 
    
         
            +
              end
         
     | 
| 
      
 147 
     | 
    
         
            +
             
     | 
| 
      
 148 
     | 
    
         
            +
              def test_groupdate_multiple
         
     | 
| 
      
 149 
     | 
    
         
            +
                create_user "2013-05-01 00:00:00 UTC", 1
         
     | 
| 
      
 150 
     | 
    
         
            +
                expected = {
         
     | 
| 
      
 151 
     | 
    
         
            +
                  [utc.parse("2013-05-01 00:00:00 UTC"), utc.parse("2013-01-01 00:00:00 UTC")] => 1
         
     | 
| 
      
 152 
     | 
    
         
            +
                }
         
     | 
| 
      
 153 
     | 
    
         
            +
                assert_equal expected, User.group_by_day(:created_at).group_by_year(:created_at).count
         
     | 
| 
      
 154 
     | 
    
         
            +
              end
         
     | 
| 
      
 155 
     | 
    
         
            +
             
     | 
| 
      
 156 
     | 
    
         
            +
              def test_groupdate_multiple_hour_of_day_day_of_week
         
     | 
| 
      
 157 
     | 
    
         
            +
                create_user "2013-05-01 00:00:00 UTC", 1
         
     | 
| 
      
 158 
     | 
    
         
            +
                expected = {}
         
     | 
| 
      
 159 
     | 
    
         
            +
                24.times do |i|
         
     | 
| 
      
 160 
     | 
    
         
            +
                  7.times do |j|
         
     | 
| 
      
 161 
     | 
    
         
            +
                    expected[[i, j]] = i == 0 && j == 3 ? 1 : 0
         
     | 
| 
      
 162 
     | 
    
         
            +
                  end
         
     | 
| 
      
 163 
     | 
    
         
            +
                end
         
     | 
| 
      
 164 
     | 
    
         
            +
                assert_equal expected, User.group_by_hour_of_day(:created_at).group_by_day_of_week(:created_at).count
         
     | 
| 
      
 165 
     | 
    
         
            +
              end
         
     | 
| 
      
 166 
     | 
    
         
            +
             
     | 
| 
      
 167 
     | 
    
         
            +
              def test_not_modified
         
     | 
| 
      
 168 
     | 
    
         
            +
                create_user "2013-05-01 00:00:00 UTC"
         
     | 
| 
      
 169 
     | 
    
         
            +
                expected = {utc.parse("2013-05-01 00:00:00 UTC") => 1}
         
     | 
| 
      
 170 
     | 
    
         
            +
                relation = User.group_by_day(:created_at)
         
     | 
| 
      
 171 
     | 
    
         
            +
                relation.where("created_at > ?", "2013-05-01 00:00:00 UTC")
         
     | 
| 
      
 172 
     | 
    
         
            +
                assert_equal expected, relation.count
         
     | 
| 
      
 173 
     | 
    
         
            +
              end
         
     | 
| 
      
 174 
     | 
    
         
            +
             
     | 
| 
      
 175 
     | 
    
         
            +
              def test_bad_method
         
     | 
| 
      
 176 
     | 
    
         
            +
                assert_raises(NoMethodError) { User.group_by_day(:created_at).no_such_method }
         
     | 
| 
      
 177 
     | 
    
         
            +
              end
         
     | 
| 
      
 178 
     | 
    
         
            +
             
     | 
| 
      
 179 
     | 
    
         
            +
              def test_respond_to_where
         
     | 
| 
      
 180 
     | 
    
         
            +
                assert User.group_by_day(:created_at).respond_to?(:order)
         
     | 
| 
      
 181 
     | 
    
         
            +
              end
         
     | 
| 
      
 182 
     | 
    
         
            +
             
     | 
| 
      
 183 
     | 
    
         
            +
              def test_respond_to_bad_method
         
     | 
| 
      
 184 
     | 
    
         
            +
                assert !User.group_by_day(:created_at).respond_to?(:no_such_method)
         
     | 
| 
      
 185 
     | 
    
         
            +
              end
         
     | 
| 
      
 186 
     | 
    
         
            +
             
     | 
| 
      
 187 
     | 
    
         
            +
              def test_last
         
     | 
| 
      
 188 
     | 
    
         
            +
                create_user "#{this_year - 3}-01-01 00:00:00 UTC"
         
     | 
| 
      
 189 
     | 
    
         
            +
                create_user "#{this_year - 1}-01-01 00:00:00 UTC"
         
     | 
| 
      
 190 
     | 
    
         
            +
                expected = {
         
     | 
| 
      
 191 
     | 
    
         
            +
                  utc.parse("#{this_year - 2}-01-01 00:00:00 UTC") => 0,
         
     | 
| 
      
 192 
     | 
    
         
            +
                  utc.parse("#{this_year - 1}-01-01 00:00:00 UTC") => 1,
         
     | 
| 
      
 193 
     | 
    
         
            +
                  utc.parse("#{this_year}-01-01 00:00:00 UTC") => 0
         
     | 
| 
      
 194 
     | 
    
         
            +
                }
         
     | 
| 
      
 195 
     | 
    
         
            +
                assert_equal expected, User.group_by_year(:created_at, last: 3).count
         
     | 
| 
      
 196 
     | 
    
         
            +
              end
         
     | 
| 
      
 197 
     | 
    
         
            +
             
     | 
| 
      
 198 
     | 
    
         
            +
              def test_current
         
     | 
| 
      
 199 
     | 
    
         
            +
                create_user "#{this_year - 3}-01-01 00:00:00 UTC"
         
     | 
| 
      
 200 
     | 
    
         
            +
                create_user "#{this_year - 1}-01-01 00:00:00 UTC"
         
     | 
| 
      
 201 
     | 
    
         
            +
                expected = {
         
     | 
| 
      
 202 
     | 
    
         
            +
                  utc.parse("#{this_year - 2}-01-01 00:00:00 UTC") => 0,
         
     | 
| 
      
 203 
     | 
    
         
            +
                  utc.parse("#{this_year - 1}-01-01 00:00:00 UTC") => 1
         
     | 
| 
      
 204 
     | 
    
         
            +
                }
         
     | 
| 
      
 205 
     | 
    
         
            +
                assert_equal expected, User.group_by_year(:created_at, last: 2, current: false).count
         
     | 
| 
      
 206 
     | 
    
         
            +
              end
         
     | 
| 
      
 207 
     | 
    
         
            +
             
     | 
| 
      
 208 
     | 
    
         
            +
              def test_format_locale
         
     | 
| 
      
 209 
     | 
    
         
            +
                create_user "2014-10-01 00:00:00 UTC"
         
     | 
| 
      
 210 
     | 
    
         
            +
                assert_equal ({"Okt" => 1}), User.group_by_day(:created_at, format: "%b", locale: :de).count
         
     | 
| 
      
 211 
     | 
    
         
            +
              end
         
     | 
| 
      
 212 
     | 
    
         
            +
             
     | 
| 
      
 213 
     | 
    
         
            +
              def test_format_locale_by_symbol
         
     | 
| 
      
 214 
     | 
    
         
            +
                create_user "2014-10-01 00:00:00 UTC"
         
     | 
| 
      
 215 
     | 
    
         
            +
                assert_equal ({"Okt  1, 2014" => 1}), User.group_by_day(:created_at, format: :special, locale: :de).count
         
     | 
| 
      
 216 
     | 
    
         
            +
              end
         
     | 
| 
      
 217 
     | 
    
         
            +
             
     | 
| 
      
 218 
     | 
    
         
            +
              def test_format_locale_global
         
     | 
| 
      
 219 
     | 
    
         
            +
                create_user "2014-10-01 00:00:00 UTC"
         
     | 
| 
      
 220 
     | 
    
         
            +
                I18n.locale = :de
         
     | 
| 
      
 221 
     | 
    
         
            +
                assert_equal ({"Okt" => 1}), User.group_by_day(:created_at, format: "%b").count
         
     | 
| 
      
 222 
     | 
    
         
            +
              ensure
         
     | 
| 
      
 223 
     | 
    
         
            +
                I18n.locale = :en
         
     | 
| 
      
 224 
     | 
    
         
            +
              end
         
     | 
| 
      
 225 
     | 
    
         
            +
             
     | 
| 
      
 226 
     | 
    
         
            +
              def test_format_multiple_groups
         
     | 
| 
      
 227 
     | 
    
         
            +
                create_user "2014-03-01 00:00:00 UTC"
         
     | 
| 
      
 228 
     | 
    
         
            +
                assert_equal ({["Sun", 1] => 1}), User.group_by_week(:created_at, format: "%a").group(:score).count
         
     | 
| 
      
 229 
     | 
    
         
            +
                assert_equal ({[1, "Sun"] => 1}), User.group(:score).group_by_week(:created_at, format: "%a").count
         
     | 
| 
      
 230 
     | 
    
         
            +
              end
         
     | 
| 
      
 231 
     | 
    
         
            +
             
     | 
| 
      
 232 
     | 
    
         
            +
              # permit
         
     | 
| 
      
 233 
     | 
    
         
            +
             
     | 
| 
      
 234 
     | 
    
         
            +
              def test_permit
         
     | 
| 
      
 235 
     | 
    
         
            +
                assert_raises(ArgumentError, "Unpermitted period") { User.group_by_period(:day, :created_at, permit: %w(week)).count }
         
     | 
| 
      
 236 
     | 
    
         
            +
              end
         
     | 
| 
      
 237 
     | 
    
         
            +
             
     | 
| 
      
 238 
     | 
    
         
            +
              def test_permit_bad_period
         
     | 
| 
      
 239 
     | 
    
         
            +
                assert_raises(ArgumentError, "Unpermitted period") { User.group_by_period(:bad_period, :created_at).count }
         
     | 
| 
      
 240 
     | 
    
         
            +
              end
         
     | 
| 
      
 241 
     | 
    
         
            +
             
     | 
| 
      
 242 
     | 
    
         
            +
              def test_permit_symbol_symbols
         
     | 
| 
      
 243 
     | 
    
         
            +
                assert_equal ({}), User.group_by_period(:day, :created_at, permit: [:day]).count
         
     | 
| 
      
 244 
     | 
    
         
            +
              end
         
     | 
| 
      
 245 
     | 
    
         
            +
             
     | 
| 
      
 246 
     | 
    
         
            +
              def test_permit_string_symbols
         
     | 
| 
      
 247 
     | 
    
         
            +
                assert_equal ({}), User.group_by_period("day", :created_at, permit: [:day]).count
         
     | 
| 
      
 248 
     | 
    
         
            +
              end
         
     | 
| 
      
 249 
     | 
    
         
            +
             
     | 
| 
      
 250 
     | 
    
         
            +
              def test_permit_symbol_strings
         
     | 
| 
      
 251 
     | 
    
         
            +
                assert_equal ({}), User.group_by_period(:day, :created_at, permit: %w(day)).count
         
     | 
| 
      
 252 
     | 
    
         
            +
              end
         
     | 
| 
      
 253 
     | 
    
         
            +
             
     | 
| 
      
 254 
     | 
    
         
            +
              def test_permit_string_strings
         
     | 
| 
      
 255 
     | 
    
         
            +
                assert_equal ({}), User.group_by_period("day", :created_at, permit: %w(day)).count
         
     | 
| 
      
 256 
     | 
    
         
            +
              end
         
     | 
| 
      
 257 
     | 
    
         
            +
             
     | 
| 
      
 258 
     | 
    
         
            +
              # default value
         
     | 
| 
      
 259 
     | 
    
         
            +
             
     | 
| 
      
 260 
     | 
    
         
            +
              def test_default_value
         
     | 
| 
      
 261 
     | 
    
         
            +
                create_user "#{this_year}-01-01 00:00:00 UTC"
         
     | 
| 
      
 262 
     | 
    
         
            +
                expected = {
         
     | 
| 
      
 263 
     | 
    
         
            +
                  utc.parse("#{this_year - 1}-01-01 00:00:00 UTC") => nil,
         
     | 
| 
      
 264 
     | 
    
         
            +
                  utc.parse("#{this_year}-01-01 00:00:00 UTC") => 1
         
     | 
| 
      
 265 
     | 
    
         
            +
                }
         
     | 
| 
      
 266 
     | 
    
         
            +
                assert_equal expected, User.group_by_year(:created_at, last: 2, default_value: nil).count
         
     | 
| 
      
 267 
     | 
    
         
            +
              end
         
     | 
| 
      
 268 
     | 
    
         
            +
             
     | 
| 
      
 269 
     | 
    
         
            +
              # associations
         
     | 
| 
      
 270 
     | 
    
         
            +
             
     | 
| 
      
 271 
     | 
    
         
            +
              def test_associations
         
     | 
| 
      
 272 
     | 
    
         
            +
                user = create_user("2014-03-01 00:00:00 UTC")
         
     | 
| 
      
 273 
     | 
    
         
            +
                user.posts.create!(created_at: "2014-04-01 00:00:00 UTC")
         
     | 
| 
      
 274 
     | 
    
         
            +
                expected = {
         
     | 
| 
      
 275 
     | 
    
         
            +
                  utc.parse("2014-04-01 00:00:00 UTC") => 1
         
     | 
| 
      
 276 
     | 
    
         
            +
                }
         
     | 
| 
      
 277 
     | 
    
         
            +
                assert_equal expected, user.posts.group_by_day(:created_at).count
         
     | 
| 
      
 278 
     | 
    
         
            +
              end
         
     | 
| 
      
 279 
     | 
    
         
            +
             
     | 
| 
      
 280 
     | 
    
         
            +
              # activerecord default_timezone option
         
     | 
| 
      
 281 
     | 
    
         
            +
             
     | 
| 
      
 282 
     | 
    
         
            +
              def test_default_timezone_local
         
     | 
| 
      
 283 
     | 
    
         
            +
                User.default_timezone = :local
         
     | 
| 
      
 284 
     | 
    
         
            +
                assert_raises(RuntimeError) { User.group_by_day(:created_at).count }
         
     | 
| 
      
 285 
     | 
    
         
            +
              ensure
         
     | 
| 
      
 286 
     | 
    
         
            +
                User.default_timezone = :utc
         
     | 
| 
      
 287 
     | 
    
         
            +
              end
         
     | 
| 
      
 288 
     | 
    
         
            +
             
     | 
| 
      
 289 
     | 
    
         
            +
              # Brasilia Summer Time
         
     | 
| 
      
 290 
     | 
    
         
            +
             
     | 
| 
      
 291 
     | 
    
         
            +
              def test_brasilia_summer_time
         
     | 
| 
      
 292 
     | 
    
         
            +
                # must parse and convert to UTC for ActiveRecord 3.1
         
     | 
| 
      
 293 
     | 
    
         
            +
                create_user(brasilia.parse("2014-10-19 02:00:00").utc.to_s)
         
     | 
| 
      
 294 
     | 
    
         
            +
                create_user(brasilia.parse("2014-10-20 02:00:00").utc.to_s)
         
     | 
| 
      
 295 
     | 
    
         
            +
                expected = {
         
     | 
| 
      
 296 
     | 
    
         
            +
                  brasilia.parse("2014-10-19 01:00:00") => 1,
         
     | 
| 
      
 297 
     | 
    
         
            +
                  brasilia.parse("2014-10-20 00:00:00") => 1
         
     | 
| 
      
 298 
     | 
    
         
            +
                }
         
     | 
| 
      
 299 
     | 
    
         
            +
                assert_equal expected, User.group_by_day(:created_at, time_zone: "Brasilia").count
         
     | 
| 
      
 300 
     | 
    
         
            +
              end
         
     | 
| 
      
 301 
     | 
    
         
            +
             
     | 
| 
      
 302 
     | 
    
         
            +
              # carry_forward option
         
     | 
| 
      
 303 
     | 
    
         
            +
             
     | 
| 
      
 304 
     | 
    
         
            +
              def test_carry_forward
         
     | 
| 
      
 305 
     | 
    
         
            +
                create_user "2014-05-01 00:00:00 UTC"
         
     | 
| 
      
 306 
     | 
    
         
            +
                create_user "2014-05-01 00:00:00 UTC"
         
     | 
| 
      
 307 
     | 
    
         
            +
                create_user "2014-05-03 00:00:00 UTC"
         
     | 
| 
      
 308 
     | 
    
         
            +
                assert_equal 2, User.group_by_day(:created_at, carry_forward: true).count[utc.parse("2014-05-02 00:00:00 UTC")]
         
     | 
| 
      
 309 
     | 
    
         
            +
              end
         
     | 
| 
      
 310 
     | 
    
         
            +
             
     | 
| 
      
 311 
     | 
    
         
            +
              # dates
         
     | 
| 
      
 312 
     | 
    
         
            +
             
     | 
| 
      
 313 
     | 
    
         
            +
              def test_dates
         
     | 
| 
      
 314 
     | 
    
         
            +
                create_user "2014-03-01 12:00:00 UTC"
         
     | 
| 
      
 315 
     | 
    
         
            +
                assert_equal ({Date.parse("2014-03-01") => 1}), User.group_by_day(:created_at, dates: true).count
         
     | 
| 
      
 316 
     | 
    
         
            +
              end
         
     | 
| 
      
 317 
     | 
    
         
            +
             
     | 
| 
      
 318 
     | 
    
         
            +
              def test_no_column
         
     | 
| 
      
 319 
     | 
    
         
            +
                assert_raises(ArgumentError) { User.group_by_day.first }
         
     | 
| 
      
 320 
     | 
    
         
            +
              end
         
     | 
| 
      
 321 
     | 
    
         
            +
             
     | 
| 
      
 322 
     | 
    
         
            +
              def call_method(method, field, options)
         
     | 
| 
      
 323 
     | 
    
         
            +
                User.group_by_period(method, field, options).count
         
     | 
| 
      
 324 
     | 
    
         
            +
              end
         
     | 
| 
      
 325 
     | 
    
         
            +
             
     | 
| 
      
 326 
     | 
    
         
            +
              def create_user(created_at, score = 1)
         
     | 
| 
      
 327 
     | 
    
         
            +
                user =
         
     | 
| 
      
 328 
     | 
    
         
            +
                  User.create!(
         
     | 
| 
      
 329 
     | 
    
         
            +
                    name: "Andrew",
         
     | 
| 
      
 330 
     | 
    
         
            +
                    score: score,
         
     | 
| 
      
 331 
     | 
    
         
            +
                    created_at: created_at ? utc.parse(created_at) : nil,
         
     | 
| 
      
 332 
     | 
    
         
            +
                    created_on: created_at ? Date.parse(created_at) : nil
         
     | 
| 
      
 333 
     | 
    
         
            +
                  )
         
     | 
| 
      
 334 
     | 
    
         
            +
             
     | 
| 
      
 335 
     | 
    
         
            +
                # hack for MySQL adapter
         
     | 
| 
      
 336 
     | 
    
         
            +
                user.update_attributes(created_at: nil, created_on: nil) if created_at.nil?
         
     | 
| 
      
 337 
     | 
    
         
            +
             
     | 
| 
      
 338 
     | 
    
         
            +
                user
         
     | 
| 
      
 339 
     | 
    
         
            +
              end
         
     | 
| 
      
 340 
     | 
    
         
            +
             
     | 
| 
      
 341 
     | 
    
         
            +
              def teardown
         
     | 
| 
      
 342 
     | 
    
         
            +
                User.delete_all
         
     | 
| 
      
 343 
     | 
    
         
            +
              end
         
     | 
| 
      
 344 
     | 
    
         
            +
             
     | 
| 
      
 345 
     | 
    
         
            +
              def enumerable_test?
         
     | 
| 
      
 346 
     | 
    
         
            +
                false
         
     | 
| 
      
 347 
     | 
    
         
            +
              end
         
     | 
| 
      
 348 
     | 
    
         
            +
            end
         
     | 
| 
      
 349 
     | 
    
         
            +
             
     | 
| 
       50 
350 
     | 
    
         
             
            module TestGroupdate
         
     | 
| 
       51 
351 
     | 
    
         
             
              def setup
         
     | 
| 
       52 
352 
     | 
    
         
             
                Groupdate.week_start = :sun
         
     | 
| 
         @@ -55,7 +355,7 @@ module TestGroupdate 
     | 
|
| 
       55 
355 
     | 
    
         
             
              # second
         
     | 
| 
       56 
356 
     | 
    
         | 
| 
       57 
357 
     | 
    
         
             
              def test_second_end_of_second
         
     | 
| 
       58 
     | 
    
         
            -
                if ActiveRecord::Base.connection.adapter_name == "Mysql2" && ActiveRecord::VERSION::STRING.starts_with?("4.2.")
         
     | 
| 
      
 358 
     | 
    
         
            +
                if enumerable_test? || (ActiveRecord::Base.connection.adapter_name == "Mysql2" && ActiveRecord::VERSION::STRING.starts_with?("4.2."))
         
     | 
| 
       59 
359 
     | 
    
         
             
                  skip # no millisecond precision
         
     | 
| 
       60 
360 
     | 
    
         
             
                else
         
     | 
| 
       61 
361 
     | 
    
         
             
                  assert_result_time :second, "2013-05-03 00:00:00 UTC", "2013-05-03 00:00:00.999"
         
     | 
| 
         @@ -564,14 +864,6 @@ module TestGroupdate 
     | 
|
| 
       564 
864 
     | 
    
         
             
                assert_equal expected, call_method(:day, :created_at, range: Time.parse("2013-05-01 00:00:00 UTC")...Time.parse("2013-05-02 00:00:00 UTC"))
         
     | 
| 
       565 
865 
     | 
    
         
             
              end
         
     | 
| 
       566 
866 
     | 
    
         | 
| 
       567 
     | 
    
         
            -
              def test_zeros_previous_scope
         
     | 
| 
       568 
     | 
    
         
            -
                create_user "2013-05-01 00:00:00 UTC"
         
     | 
| 
       569 
     | 
    
         
            -
                expected = {
         
     | 
| 
       570 
     | 
    
         
            -
                  utc.parse("2013-05-01 00:00:00 UTC") => 0
         
     | 
| 
       571 
     | 
    
         
            -
                }
         
     | 
| 
       572 
     | 
    
         
            -
                assert_equal expected, User.where("id = 0").group_by_day(:created_at, range: Time.parse("2013-05-01 00:00:00 UTC")..Time.parse("2013-05-01 23:59:59 UTC")).count
         
     | 
| 
       573 
     | 
    
         
            -
              end
         
     | 
| 
       574 
     | 
    
         
            -
             
     | 
| 
       575 
867 
     | 
    
         
             
              def test_zeros_datetime
         
     | 
| 
       576 
868 
     | 
    
         
             
                create_user "2013-05-01 00:00:00 UTC"
         
     | 
| 
       577 
869 
     | 
    
         
             
                expected = {
         
     | 
| 
         @@ -581,8 +873,7 @@ module TestGroupdate 
     | 
|
| 
       581 
873 
     | 
    
         
             
              end
         
     | 
| 
       582 
874 
     | 
    
         | 
| 
       583 
875 
     | 
    
         
             
              def test_zeros_null_value
         
     | 
| 
       584 
     | 
    
         
            -
                 
     | 
| 
       585 
     | 
    
         
            -
                user.update_column :created_at, nil
         
     | 
| 
      
 876 
     | 
    
         
            +
                create_user nil
         
     | 
| 
       586 
877 
     | 
    
         
             
                assert_equal 0, call_method(:hour_of_day, :created_at, range: true)[0]
         
     | 
| 
       587 
878 
     | 
    
         
             
              end
         
     | 
| 
       588 
879 
     | 
    
         | 
| 
         @@ -611,152 +902,16 @@ module TestGroupdate 
     | 
|
| 
       611 
902 
     | 
    
         | 
| 
       612 
903 
     | 
    
         
             
              # misc
         
     | 
| 
       613 
904 
     | 
    
         | 
| 
       614 
     | 
    
         
            -
              def test_order_hour_of_day
         
     | 
| 
       615 
     | 
    
         
            -
                assert_equal 23, User.group_by_hour_of_day(:created_at).order("hour_of_day desc").count.keys.first
         
     | 
| 
       616 
     | 
    
         
            -
              end
         
     | 
| 
       617 
     | 
    
         
            -
             
     | 
| 
       618 
     | 
    
         
            -
              def test_order_hour_of_day_case
         
     | 
| 
       619 
     | 
    
         
            -
                assert_equal 23, User.group_by_hour_of_day(:created_at).order("hour_of_day DESC").count.keys.first
         
     | 
| 
       620 
     | 
    
         
            -
              end
         
     | 
| 
       621 
     | 
    
         
            -
             
     | 
| 
       622 
     | 
    
         
            -
              def test_order_hour_of_day_reverse
         
     | 
| 
       623 
     | 
    
         
            -
                skip if ActiveRecord::VERSION::MAJOR == 5
         
     | 
| 
       624 
     | 
    
         
            -
                assert_equal 23, User.group_by_hour_of_day(:created_at).reverse_order.count.keys.first
         
     | 
| 
       625 
     | 
    
         
            -
              end
         
     | 
| 
       626 
     | 
    
         
            -
             
     | 
| 
       627 
     | 
    
         
            -
              def test_order_hour_of_day_order_reverse
         
     | 
| 
       628 
     | 
    
         
            -
                skip if ActiveRecord::VERSION::MAJOR == 5
         
     | 
| 
       629 
     | 
    
         
            -
                assert_equal 0, User.group_by_hour_of_day(:created_at).order("hour_of_day desc").reverse_order.count.keys.first
         
     | 
| 
       630 
     | 
    
         
            -
              end
         
     | 
| 
       631 
     | 
    
         
            -
             
     | 
| 
       632 
905 
     | 
    
         
             
              def test_order_hour_of_day_reverse_option
         
     | 
| 
       633 
906 
     | 
    
         
             
                assert_equal 23, call_method(:hour_of_day, :created_at, reverse: true).keys.first
         
     | 
| 
       634 
907 
     | 
    
         
             
              end
         
     | 
| 
       635 
908 
     | 
    
         | 
| 
       636 
     | 
    
         
            -
              def test_table_name
         
     | 
| 
       637 
     | 
    
         
            -
                assert_empty User.group_by_day("users.created_at").count
         
     | 
| 
       638 
     | 
    
         
            -
              end
         
     | 
| 
       639 
     | 
    
         
            -
             
     | 
| 
       640 
     | 
    
         
            -
              def test_previous_scopes
         
     | 
| 
       641 
     | 
    
         
            -
                create_user "2013-05-01 00:00:00 UTC"
         
     | 
| 
       642 
     | 
    
         
            -
                assert_empty User.where("id = 0").group_by_day(:created_at).count
         
     | 
| 
       643 
     | 
    
         
            -
              end
         
     | 
| 
       644 
     | 
    
         
            -
             
     | 
| 
       645 
909 
     | 
    
         
             
              def test_time_zone
         
     | 
| 
       646 
910 
     | 
    
         
             
                create_user "2013-05-01 00:00:00 UTC"
         
     | 
| 
       647 
911 
     | 
    
         
             
                time_zone = "Pacific Time (US & Canada)"
         
     | 
| 
       648 
912 
     | 
    
         
             
                assert_equal time_zone, call_method(:day, :created_at, time_zone: time_zone).keys.first.time_zone.name
         
     | 
| 
       649 
913 
     | 
    
         
             
              end
         
     | 
| 
       650 
914 
     | 
    
         | 
| 
       651 
     | 
    
         
            -
              def test_where_after
         
     | 
| 
       652 
     | 
    
         
            -
                create_user "2013-05-01 00:00:00 UTC"
         
     | 
| 
       653 
     | 
    
         
            -
                create_user "2013-05-02 00:00:00 UTC"
         
     | 
| 
       654 
     | 
    
         
            -
                expected = {utc.parse("2013-05-02 00:00:00 UTC") => 1}
         
     | 
| 
       655 
     | 
    
         
            -
                assert_equal expected, User.group_by_day(:created_at).where("created_at > ?", "2013-05-01 00:00:00 UTC").count
         
     | 
| 
       656 
     | 
    
         
            -
              end
         
     | 
| 
       657 
     | 
    
         
            -
             
     | 
| 
       658 
     | 
    
         
            -
              def test_group_before
         
     | 
| 
       659 
     | 
    
         
            -
                create_user "2013-05-01 00:00:00 UTC", 1
         
     | 
| 
       660 
     | 
    
         
            -
                create_user "2013-05-02 00:00:00 UTC", 2
         
     | 
| 
       661 
     | 
    
         
            -
                create_user "2013-05-03 00:00:00 UTC", 2
         
     | 
| 
       662 
     | 
    
         
            -
                expected = {
         
     | 
| 
       663 
     | 
    
         
            -
                  [1, utc.parse("2013-05-01 00:00:00 UTC")] => 1,
         
     | 
| 
       664 
     | 
    
         
            -
                  [1, utc.parse("2013-05-02 00:00:00 UTC")] => 0,
         
     | 
| 
       665 
     | 
    
         
            -
                  [1, utc.parse("2013-05-03 00:00:00 UTC")] => 0,
         
     | 
| 
       666 
     | 
    
         
            -
                  [2, utc.parse("2013-05-01 00:00:00 UTC")] => 0,
         
     | 
| 
       667 
     | 
    
         
            -
                  [2, utc.parse("2013-05-02 00:00:00 UTC")] => 1,
         
     | 
| 
       668 
     | 
    
         
            -
                  [2, utc.parse("2013-05-03 00:00:00 UTC")] => 1
         
     | 
| 
       669 
     | 
    
         
            -
                }
         
     | 
| 
       670 
     | 
    
         
            -
                assert_equal expected, User.group(:score).group_by_day(:created_at).order(:score).count
         
     | 
| 
       671 
     | 
    
         
            -
              end
         
     | 
| 
       672 
     | 
    
         
            -
             
     | 
| 
       673 
     | 
    
         
            -
              def test_group_after
         
     | 
| 
       674 
     | 
    
         
            -
                create_user "2013-05-01 00:00:00 UTC", 1
         
     | 
| 
       675 
     | 
    
         
            -
                create_user "2013-05-02 00:00:00 UTC", 2
         
     | 
| 
       676 
     | 
    
         
            -
                create_user "2013-05-03 00:00:00 UTC", 2
         
     | 
| 
       677 
     | 
    
         
            -
                expected = {
         
     | 
| 
       678 
     | 
    
         
            -
                  [utc.parse("2013-05-01 00:00:00 UTC"), 1] => 1,
         
     | 
| 
       679 
     | 
    
         
            -
                  [utc.parse("2013-05-02 00:00:00 UTC"), 1] => 0,
         
     | 
| 
       680 
     | 
    
         
            -
                  [utc.parse("2013-05-03 00:00:00 UTC"), 1] => 0,
         
     | 
| 
       681 
     | 
    
         
            -
                  [utc.parse("2013-05-01 00:00:00 UTC"), 2] => 0,
         
     | 
| 
       682 
     | 
    
         
            -
                  [utc.parse("2013-05-02 00:00:00 UTC"), 2] => 1,
         
     | 
| 
       683 
     | 
    
         
            -
                  [utc.parse("2013-05-03 00:00:00 UTC"), 2] => 1
         
     | 
| 
       684 
     | 
    
         
            -
                }
         
     | 
| 
       685 
     | 
    
         
            -
                assert_equal expected, User.group_by_day(:created_at).group(:score).order(:score).count
         
     | 
| 
       686 
     | 
    
         
            -
              end
         
     | 
| 
       687 
     | 
    
         
            -
             
     | 
| 
       688 
     | 
    
         
            -
              def test_group_day_of_week
         
     | 
| 
       689 
     | 
    
         
            -
                create_user "2013-05-01 00:00:00 UTC", 1
         
     | 
| 
       690 
     | 
    
         
            -
                create_user "2013-05-02 00:00:00 UTC", 2
         
     | 
| 
       691 
     | 
    
         
            -
                create_user "2013-05-03 00:00:00 UTC", 2
         
     | 
| 
       692 
     | 
    
         
            -
                expected = {
         
     | 
| 
       693 
     | 
    
         
            -
                  [1, 0] => 0,
         
     | 
| 
       694 
     | 
    
         
            -
                  [1, 1] => 0,
         
     | 
| 
       695 
     | 
    
         
            -
                  [1, 2] => 0,
         
     | 
| 
       696 
     | 
    
         
            -
                  [1, 3] => 1,
         
     | 
| 
       697 
     | 
    
         
            -
                  [1, 4] => 0,
         
     | 
| 
       698 
     | 
    
         
            -
                  [1, 5] => 0,
         
     | 
| 
       699 
     | 
    
         
            -
                  [1, 6] => 0,
         
     | 
| 
       700 
     | 
    
         
            -
                  [2, 0] => 0,
         
     | 
| 
       701 
     | 
    
         
            -
                  [2, 1] => 0,
         
     | 
| 
       702 
     | 
    
         
            -
                  [2, 2] => 0,
         
     | 
| 
       703 
     | 
    
         
            -
                  [2, 3] => 0,
         
     | 
| 
       704 
     | 
    
         
            -
                  [2, 4] => 1,
         
     | 
| 
       705 
     | 
    
         
            -
                  [2, 5] => 1,
         
     | 
| 
       706 
     | 
    
         
            -
                  [2, 6] => 0
         
     | 
| 
       707 
     | 
    
         
            -
                }
         
     | 
| 
       708 
     | 
    
         
            -
                assert_equal expected, User.group(:score).group_by_day_of_week(:created_at).count
         
     | 
| 
       709 
     | 
    
         
            -
              end
         
     | 
| 
       710 
     | 
    
         
            -
             
     | 
| 
       711 
     | 
    
         
            -
              def test_groupdate_multiple
         
     | 
| 
       712 
     | 
    
         
            -
                create_user "2013-05-01 00:00:00 UTC", 1
         
     | 
| 
       713 
     | 
    
         
            -
                expected = {
         
     | 
| 
       714 
     | 
    
         
            -
                  [utc.parse("2013-05-01 00:00:00 UTC"), utc.parse("2013-01-01 00:00:00 UTC")] => 1
         
     | 
| 
       715 
     | 
    
         
            -
                }
         
     | 
| 
       716 
     | 
    
         
            -
                assert_equal expected, User.group_by_day(:created_at).group_by_year(:created_at).count
         
     | 
| 
       717 
     | 
    
         
            -
              end
         
     | 
| 
       718 
     | 
    
         
            -
             
     | 
| 
       719 
     | 
    
         
            -
              def test_not_modified
         
     | 
| 
       720 
     | 
    
         
            -
                create_user "2013-05-01 00:00:00 UTC"
         
     | 
| 
       721 
     | 
    
         
            -
                expected = {utc.parse("2013-05-01 00:00:00 UTC") => 1}
         
     | 
| 
       722 
     | 
    
         
            -
                relation = User.group_by_day(:created_at)
         
     | 
| 
       723 
     | 
    
         
            -
                relation.where("created_at > ?", "2013-05-01 00:00:00 UTC")
         
     | 
| 
       724 
     | 
    
         
            -
                assert_equal expected, relation.count
         
     | 
| 
       725 
     | 
    
         
            -
              end
         
     | 
| 
       726 
     | 
    
         
            -
             
     | 
| 
       727 
     | 
    
         
            -
              def test_bad_method
         
     | 
| 
       728 
     | 
    
         
            -
                assert_raises(NoMethodError) { User.group_by_day(:created_at).no_such_method }
         
     | 
| 
       729 
     | 
    
         
            -
              end
         
     | 
| 
       730 
     | 
    
         
            -
             
     | 
| 
       731 
     | 
    
         
            -
              def test_respond_to_where
         
     | 
| 
       732 
     | 
    
         
            -
                assert User.group_by_day(:created_at).respond_to?(:order)
         
     | 
| 
       733 
     | 
    
         
            -
              end
         
     | 
| 
       734 
     | 
    
         
            -
             
     | 
| 
       735 
     | 
    
         
            -
              def test_respond_to_bad_method
         
     | 
| 
       736 
     | 
    
         
            -
                assert !User.group_by_day(:created_at).respond_to?(:no_such_method)
         
     | 
| 
       737 
     | 
    
         
            -
              end
         
     | 
| 
       738 
     | 
    
         
            -
             
     | 
| 
       739 
     | 
    
         
            -
              def test_last
         
     | 
| 
       740 
     | 
    
         
            -
                create_user "#{this_year - 3}-01-01 00:00:00 UTC"
         
     | 
| 
       741 
     | 
    
         
            -
                create_user "#{this_year - 1}-01-01 00:00:00 UTC"
         
     | 
| 
       742 
     | 
    
         
            -
                expected = {
         
     | 
| 
       743 
     | 
    
         
            -
                  utc.parse("#{this_year - 2}-01-01 00:00:00 UTC") => 0,
         
     | 
| 
       744 
     | 
    
         
            -
                  utc.parse("#{this_year - 1}-01-01 00:00:00 UTC") => 1,
         
     | 
| 
       745 
     | 
    
         
            -
                  utc.parse("#{this_year}-01-01 00:00:00 UTC") => 0
         
     | 
| 
       746 
     | 
    
         
            -
                }
         
     | 
| 
       747 
     | 
    
         
            -
                assert_equal expected, User.group_by_year(:created_at, last: 3).count
         
     | 
| 
       748 
     | 
    
         
            -
              end
         
     | 
| 
       749 
     | 
    
         
            -
             
     | 
| 
       750 
     | 
    
         
            -
              def test_current
         
     | 
| 
       751 
     | 
    
         
            -
                create_user "#{this_year - 3}-01-01 00:00:00 UTC"
         
     | 
| 
       752 
     | 
    
         
            -
                create_user "#{this_year - 1}-01-01 00:00:00 UTC"
         
     | 
| 
       753 
     | 
    
         
            -
                expected = {
         
     | 
| 
       754 
     | 
    
         
            -
                  utc.parse("#{this_year - 2}-01-01 00:00:00 UTC") => 0,
         
     | 
| 
       755 
     | 
    
         
            -
                  utc.parse("#{this_year - 1}-01-01 00:00:00 UTC") => 1
         
     | 
| 
       756 
     | 
    
         
            -
                }
         
     | 
| 
       757 
     | 
    
         
            -
                assert_equal expected, User.group_by_year(:created_at, last: 2, current: false).count
         
     | 
| 
       758 
     | 
    
         
            -
              end
         
     | 
| 
       759 
     | 
    
         
            -
             
     | 
| 
       760 
915 
     | 
    
         
             
              def test_format_day
         
     | 
| 
       761 
916 
     | 
    
         
             
                create_user "2014-03-01 00:00:00 UTC"
         
     | 
| 
       762 
917 
     | 
    
         
             
                assert_format :day, "March 1, 2014", "%B %-e, %Y"
         
     | 
| 
         @@ -807,110 +962,32 @@ module TestGroupdate 
     | 
|
| 
       807 
962 
     | 
    
         
             
                assert_format :month_of_year, "Jan", "%b"
         
     | 
| 
       808 
963 
     | 
    
         
             
              end
         
     | 
| 
       809 
964 
     | 
    
         | 
| 
       810 
     | 
    
         
            -
               
     | 
| 
       811 
     | 
    
         
            -
                create_user "2014-10-01 00:00:00 UTC"
         
     | 
| 
       812 
     | 
    
         
            -
                assert_equal ({"Okt" => 1}), User.group_by_day(:created_at, format: "%b", locale: :de).count
         
     | 
| 
       813 
     | 
    
         
            -
              end
         
     | 
| 
       814 
     | 
    
         
            -
             
     | 
| 
       815 
     | 
    
         
            -
              def test_format_locale_by_symbol
         
     | 
| 
       816 
     | 
    
         
            -
                create_user "2014-10-01 00:00:00 UTC"
         
     | 
| 
       817 
     | 
    
         
            -
                assert_equal ({"Okt  1, 2014" => 1}), User.group_by_day(:created_at, format: :special, locale: :de).count
         
     | 
| 
       818 
     | 
    
         
            -
              end
         
     | 
| 
       819 
     | 
    
         
            -
             
     | 
| 
       820 
     | 
    
         
            -
              def test_format_locale_global
         
     | 
| 
       821 
     | 
    
         
            -
                create_user "2014-10-01 00:00:00 UTC"
         
     | 
| 
       822 
     | 
    
         
            -
                I18n.locale = :de
         
     | 
| 
       823 
     | 
    
         
            -
                assert_equal ({"Okt" => 1}), User.group_by_day(:created_at, format: "%b").count
         
     | 
| 
       824 
     | 
    
         
            -
              ensure
         
     | 
| 
       825 
     | 
    
         
            -
                I18n.locale = :en
         
     | 
| 
       826 
     | 
    
         
            -
              end
         
     | 
| 
       827 
     | 
    
         
            -
             
     | 
| 
       828 
     | 
    
         
            -
              def test_format_multiple_groups
         
     | 
| 
       829 
     | 
    
         
            -
                create_user "2014-03-01 00:00:00 UTC"
         
     | 
| 
       830 
     | 
    
         
            -
                assert_equal ({["Sun", 1] => 1}), User.group_by_week(:created_at, format: "%a").group(:score).count
         
     | 
| 
       831 
     | 
    
         
            -
                assert_equal ({[1, "Sun"] => 1}), User.group(:score).group_by_week(:created_at, format: "%a").count
         
     | 
| 
       832 
     | 
    
         
            -
              end
         
     | 
| 
       833 
     | 
    
         
            -
             
     | 
| 
       834 
     | 
    
         
            -
              # permit
         
     | 
| 
       835 
     | 
    
         
            -
             
     | 
| 
       836 
     | 
    
         
            -
              def test_permit
         
     | 
| 
       837 
     | 
    
         
            -
                assert_raises(ArgumentError, "Unpermitted period") { User.group_by_period(:day, :created_at, permit: %w(week)).count }
         
     | 
| 
       838 
     | 
    
         
            -
              end
         
     | 
| 
       839 
     | 
    
         
            -
             
     | 
| 
       840 
     | 
    
         
            -
              def test_permit_bad_period
         
     | 
| 
       841 
     | 
    
         
            -
                assert_raises(ArgumentError, "Unpermitted period") { User.group_by_period(:bad_period, :created_at).count }
         
     | 
| 
       842 
     | 
    
         
            -
              end
         
     | 
| 
       843 
     | 
    
         
            -
             
     | 
| 
       844 
     | 
    
         
            -
              def test_permit_symbol_symbols
         
     | 
| 
       845 
     | 
    
         
            -
                assert_equal ({}), User.group_by_period(:day, :created_at, permit: [:day]).count
         
     | 
| 
       846 
     | 
    
         
            -
              end
         
     | 
| 
       847 
     | 
    
         
            -
             
     | 
| 
       848 
     | 
    
         
            -
              def test_permit_string_symbols
         
     | 
| 
       849 
     | 
    
         
            -
                assert_equal ({}), User.group_by_period("day", :created_at, permit: [:day]).count
         
     | 
| 
       850 
     | 
    
         
            -
              end
         
     | 
| 
       851 
     | 
    
         
            -
             
     | 
| 
       852 
     | 
    
         
            -
              def test_permit_symbol_strings
         
     | 
| 
       853 
     | 
    
         
            -
                assert_equal ({}), User.group_by_period(:day, :created_at, permit: %w(day)).count
         
     | 
| 
       854 
     | 
    
         
            -
              end
         
     | 
| 
       855 
     | 
    
         
            -
             
     | 
| 
       856 
     | 
    
         
            -
              def test_permit_string_strings
         
     | 
| 
       857 
     | 
    
         
            -
                assert_equal ({}), User.group_by_period("day", :created_at, permit: %w(day)).count
         
     | 
| 
       858 
     | 
    
         
            -
              end
         
     | 
| 
       859 
     | 
    
         
            -
             
     | 
| 
       860 
     | 
    
         
            -
              # default value
         
     | 
| 
      
 965 
     | 
    
         
            +
              # date column
         
     | 
| 
       861 
966 
     | 
    
         | 
| 
       862 
     | 
    
         
            -
              def  
     | 
| 
       863 
     | 
    
         
            -
                create_user "#{this_year}-01-01 00:00:00 UTC"
         
     | 
| 
      
 967 
     | 
    
         
            +
              def test_date_column
         
     | 
| 
       864 
968 
     | 
    
         
             
                expected = {
         
     | 
| 
       865 
     | 
    
         
            -
                   
     | 
| 
       866 
     | 
    
         
            -
                  utc.parse("#{this_year}-01-01 00:00:00 UTC") => 1
         
     | 
| 
      
 969 
     | 
    
         
            +
                  Date.parse("2013-05-03") => 1
         
     | 
| 
       867 
970 
     | 
    
         
             
                }
         
     | 
| 
       868 
     | 
    
         
            -
                assert_equal expected,  
     | 
| 
       869 
     | 
    
         
            -
              end
         
     | 
| 
       870 
     | 
    
         
            -
             
     | 
| 
       871 
     | 
    
         
            -
              # associations
         
     | 
| 
       872 
     | 
    
         
            -
             
     | 
| 
       873 
     | 
    
         
            -
              def test_associations
         
     | 
| 
       874 
     | 
    
         
            -
                user = create_user("2014-03-01 00:00:00 UTC")
         
     | 
| 
       875 
     | 
    
         
            -
                assert_empty user.posts.group_by_day(:created_at).count
         
     | 
| 
       876 
     | 
    
         
            -
              end
         
     | 
| 
       877 
     | 
    
         
            -
             
     | 
| 
       878 
     | 
    
         
            -
              # activerecord default_timezone option
         
     | 
| 
       879 
     | 
    
         
            -
             
     | 
| 
       880 
     | 
    
         
            -
              def test_default_timezone_local
         
     | 
| 
       881 
     | 
    
         
            -
                User.default_timezone = :local
         
     | 
| 
       882 
     | 
    
         
            -
                assert_raises(RuntimeError) { User.group_by_day(:created_at).count }
         
     | 
| 
       883 
     | 
    
         
            -
              ensure
         
     | 
| 
       884 
     | 
    
         
            -
                User.default_timezone = :utc
         
     | 
| 
      
 971 
     | 
    
         
            +
                assert_equal expected, result(:day, "2013-05-03", false, dates: true)
         
     | 
| 
       885 
972 
     | 
    
         
             
              end
         
     | 
| 
       886 
973 
     | 
    
         | 
| 
       887 
     | 
    
         
            -
               
     | 
| 
       888 
     | 
    
         
            -
             
     | 
| 
       889 
     | 
    
         
            -
             
     | 
| 
       890 
     | 
    
         
            -
                # must parse and convert to UTC for ActiveRecord 3.1
         
     | 
| 
       891 
     | 
    
         
            -
                create_user(brasilia.parse("2014-10-19 02:00:00").utc.to_s)
         
     | 
| 
       892 
     | 
    
         
            -
                create_user(brasilia.parse("2014-10-20 02:00:00").utc.to_s)
         
     | 
| 
      
 974 
     | 
    
         
            +
              def test_date_column_with_time_zone
         
     | 
| 
      
 975 
     | 
    
         
            +
                # TODO change for Groupdate 3.0
         
     | 
| 
      
 976 
     | 
    
         
            +
                skip
         
     | 
| 
       893 
977 
     | 
    
         
             
                expected = {
         
     | 
| 
       894 
     | 
    
         
            -
                   
     | 
| 
       895 
     | 
    
         
            -
                  brasilia.parse("2014-10-20 00:00:00") => 1
         
     | 
| 
      
 978 
     | 
    
         
            +
                  Date.parse("2013-05-03") => 1
         
     | 
| 
       896 
979 
     | 
    
         
             
                }
         
     | 
| 
       897 
     | 
    
         
            -
                assert_equal expected,  
     | 
| 
      
 980 
     | 
    
         
            +
                assert_equal expected, result(:day, "2013-05-03", true, dates: true)
         
     | 
| 
       898 
981 
     | 
    
         
             
              end
         
     | 
| 
       899 
982 
     | 
    
         | 
| 
       900 
     | 
    
         
            -
              #  
     | 
| 
      
 983 
     | 
    
         
            +
              # day start
         
     | 
| 
       901 
984 
     | 
    
         | 
| 
       902 
     | 
    
         
            -
              def  
     | 
| 
       903 
     | 
    
         
            -
                 
     | 
| 
       904 
     | 
    
         
            -
                create_user "2014-05-01 00:00:00 UTC"
         
     | 
| 
       905 
     | 
    
         
            -
                create_user "2014-05-03 00:00:00 UTC"
         
     | 
| 
       906 
     | 
    
         
            -
                assert_equal 2, User.group_by_day(:created_at, carry_forward: true).count[utc.parse("2014-05-02 00:00:00 UTC")]
         
     | 
| 
      
 985 
     | 
    
         
            +
              def test_day_start_decimal_end_of_day
         
     | 
| 
      
 986 
     | 
    
         
            +
                assert_result_time :day, "2013-05-03 02:30:00 UTC", "2013-05-04 02:29:59", false, day_start: 2.5
         
     | 
| 
       907 
987 
     | 
    
         
             
              end
         
     | 
| 
       908 
988 
     | 
    
         | 
| 
       909 
     | 
    
         
            -
               
     | 
| 
       910 
     | 
    
         
            -
             
     | 
| 
       911 
     | 
    
         
            -
              def test_dates
         
     | 
| 
       912 
     | 
    
         
            -
                create_user "2014-03-01 12:00:00 UTC"
         
     | 
| 
       913 
     | 
    
         
            -
                assert_equal ({Date.parse("2014-03-01") => 1}), User.group_by_day(:created_at, dates: true).count
         
     | 
| 
      
 989 
     | 
    
         
            +
              def test_day_start_decimal_start_of_day
         
     | 
| 
      
 990 
     | 
    
         
            +
                assert_result_time :day, "2013-05-03 02:30:00 UTC", "2013-05-03 02:30:00", false, day_start: 2.5
         
     | 
| 
       914 
991 
     | 
    
         
             
              end
         
     | 
| 
       915 
992 
     | 
    
         | 
| 
       916 
993 
     | 
    
         
             
              # helpers
         
     | 
| 
         @@ -942,14 +1019,6 @@ module TestGroupdate 
     | 
|
| 
       942 
1019 
     | 
    
         
             
                assert_equal expected, call_method(method, :created_at, options.merge(time_zone: time_zone ? "Pacific Time (US & Canada)" : nil, range: Time.parse(range_start)..Time.parse(range_end)))
         
     | 
| 
       943 
1020 
     | 
    
         
             
              end
         
     | 
| 
       944 
1021 
     | 
    
         | 
| 
       945 
     | 
    
         
            -
              def call_method(method, field, options)
         
     | 
| 
       946 
     | 
    
         
            -
                User.group_by_period(method, field, options).count
         
     | 
| 
       947 
     | 
    
         
            -
              end
         
     | 
| 
       948 
     | 
    
         
            -
             
     | 
| 
       949 
     | 
    
         
            -
              def create_user(created_at, score = 1)
         
     | 
| 
       950 
     | 
    
         
            -
                User.create! name: "Andrew", score: score, created_at: utc.parse(created_at)
         
     | 
| 
       951 
     | 
    
         
            -
              end
         
     | 
| 
       952 
     | 
    
         
            -
             
     | 
| 
       953 
1022 
     | 
    
         
             
              def this_year
         
     | 
| 
       954 
1023 
     | 
    
         
             
                Time.now.utc.year
         
     | 
| 
       955 
1024 
     | 
    
         
             
              end
         
     | 
| 
         @@ -961,8 +1030,4 @@ module TestGroupdate 
     | 
|
| 
       961 
1030 
     | 
    
         
             
              def brasilia
         
     | 
| 
       962 
1031 
     | 
    
         
             
                ActiveSupport::TimeZone["Brasilia"]
         
     | 
| 
       963 
1032 
     | 
    
         
             
              end
         
     | 
| 
       964 
     | 
    
         
            -
             
     | 
| 
       965 
     | 
    
         
            -
              def teardown
         
     | 
| 
       966 
     | 
    
         
            -
                User.delete_all
         
     | 
| 
       967 
     | 
    
         
            -
              end
         
     | 
| 
       968 
1033 
     | 
    
         
             
            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.5. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 2.5.3
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Andrew Kane
         
     | 
| 
       8 
8 
     | 
    
         
             
            autorequire: 
         
     | 
| 
       9 
9 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       10 
10 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       11 
     | 
    
         
            -
            date: 2016- 
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2016-04-28 00:00:00.000000000 Z
         
     | 
| 
       12 
12 
     | 
    
         
             
            dependencies:
         
     | 
| 
       13 
13 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       14 
14 
     | 
    
         
             
              name: activesupport
         
     | 
| 
         @@ -160,7 +160,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement 
     | 
|
| 
       160 
160 
     | 
    
         
             
                  version: '0'
         
     | 
| 
       161 
161 
     | 
    
         
             
            requirements: []
         
     | 
| 
       162 
162 
     | 
    
         
             
            rubyforge_project: 
         
     | 
| 
       163 
     | 
    
         
            -
            rubygems_version: 2. 
     | 
| 
      
 163 
     | 
    
         
            +
            rubygems_version: 2.6.1
         
     | 
| 
       164 
164 
     | 
    
         
             
            signing_key: 
         
     | 
| 
       165 
165 
     | 
    
         
             
            specification_version: 4
         
     | 
| 
       166 
166 
     | 
    
         
             
            summary: The simplest way to group temporal data
         
     |