groupdate 0.1.0 → 0.1.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 51407cdc14a5d08e4a7f50111c5d5bd91f7d2a8a
4
- data.tar.gz: 00650eedbd754abced4b15701c631eee2baa9e61
3
+ metadata.gz: db67453333111a42475d9ca697eb81181c6f291d
4
+ data.tar.gz: bf1a4d74a65edc1aa710ac417800fe5d5d2c43bb
5
5
  SHA512:
6
- metadata.gz: 9528a76cc3e2a523216c18b0692c5edb4b6739c34e720e2ae35797305266125bc059b60dbe5cca9ea36e981a85b538600f9aa1ebb8613c87538066453b0c0175
7
- data.tar.gz: 2be5da38025c0865eaaf8e8086dd146378172187972ec80efa72171331134088388d96dd2296b1567e10ab0f2ff74bd2e3b63168129abf2ddf552986d4910e3b
6
+ metadata.gz: cc7436598003f15a4219dc3fae9964b99bba54cb610b2a553b84b5365e5434f2ccca3c3c0ed2fb344a00e64c03e61a334700a32d837c687460e24b334dabab1f
7
+ data.tar.gz: dd4de87e97a685898f3d61f465e768cf6886df28497b5b9b1f7015b9c1ca9ab48870e3acc1dc8bc59279824f14ba252cd4db9f85bcae0cc2b0722a37487cab2b
data/Gemfile CHANGED
@@ -2,3 +2,5 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in groupdate.gemspec
4
4
  gemspec
5
+
6
+ gem "activerecord", github: "rails/rails"
data/README.md CHANGED
@@ -18,23 +18,23 @@ PostgreSQL and MySQL only at the moment - support for other datastores coming so
18
18
  ```ruby
19
19
  User.group_by_day(:created_at).count
20
20
  # {
21
- # "2013-04-16 00:00:00+00" => 50,
22
- # "2013-04-17 00:00:00+00" => 100,
23
- # "2013-04-18 00:00:00+00" => 34
21
+ # 2013-04-16 00:00:00 UTC => 50,
22
+ # 2013-04-17 00:00:00 UTC => 100,
23
+ # 2013-04-18 00:00:00 UTC => 34
24
24
  # }
25
25
 
26
26
  Task.group_by_month(:updated_at).count
27
27
  # {
28
- # "2013-02-01 00:00:00+00" => 84,
29
- # "2013-03-01 00:00:00+00" => 23,
30
- # "2013-04-01 00:00:00+00" => 44
28
+ # 2013-02-01 00:00:00 UTC => 84,
29
+ # 2013-03-01 00:00:00 UTC => 23,
30
+ # 2013-04-01 00:00:00 UTC => 44
31
31
  # }
32
32
 
33
33
  Goal.group_by_year(:accomplished_at).count
34
34
  # {
35
- # "2011-01-01 00:00:00+00" => 7,
36
- # "2012-01-01 00:00:00+00" => 11,
37
- # "2013-01-01 00:00:00+00" => 3
35
+ # 2011-01-01 00:00:00 UTC => 7,
36
+ # 2012-01-01 00:00:00 UTC => 11,
37
+ # 2013-01-01 00:00:00 UTC => 3
38
38
  # }
39
39
  ```
40
40
 
@@ -43,9 +43,9 @@ The default time zone is `Time.zone`. Pass a time zone as the second argument.
43
43
  ```ruby
44
44
  User.group_by_week(:created_at, "Pacific Time (US & Canada)").count
45
45
  # {
46
- # "2013-03-03 08:00:00+00" => 80,
47
- # "2013-03-10 08:00:00+00" => 70,
48
- # "2013-03-17 07:00:00+00" => 54
46
+ # 2013-03-03 08:00:00 UTC => 80,
47
+ # 2013-03-10 08:00:00 UTC => 70,
48
+ # 2013-03-17 07:00:00 UTC => 54
49
49
  # }
50
50
 
51
51
  # equivalently
@@ -61,19 +61,19 @@ You can also group by the day of the week or hour of the day.
61
61
  # day of the week
62
62
  User.group_by_day_of_week(:created_at).count
63
63
  # {
64
- # "0" => 54, # Sunday
65
- # "1" => 2, # Monday
64
+ # 0 => 54, # Sunday
65
+ # 1 => 2, # Monday
66
66
  # ...
67
- # "6" => 3 # Saturday
67
+ # 6 => 3 # Saturday
68
68
  # }
69
69
 
70
70
  # hour of the day
71
71
  User.group_by_hour_of_day(:created_at, "Pacific Time (US & Canada)").count
72
72
  # {
73
- # "0" => 34,
74
- # "1" => 61,
73
+ # 0 => 34,
74
+ # 1 => 61,
75
75
  # ...
76
- # "23" => 12
76
+ # 23 => 12
77
77
  # }
78
78
  ```
79
79
 
@@ -89,7 +89,38 @@ Go nuts!
89
89
  Request.where(page: "/home").group_by_minute(:started_at).maximum(:request_time)
90
90
  ```
91
91
 
92
- **Note:** On Rails 4 edge, queries return a Time object (much better!) as a result of [this commit](https://github.com/rails/rails/commit/2cc09441c2de57b024b11ba666ba1e72c2b20cfe)
92
+ ### Note
93
+
94
+ activerecord <= 4.0.0.beta1 and the pg gem returns String objects instead of Time objects.
95
+ [This is fixed on activerecord master](https://github.com/rails/rails/commit/2cc09441c2de57b024b11ba666ba1e72c2b20cfe)
96
+
97
+ ```ruby
98
+ User.group_by_day(:created_at).count
99
+
100
+ # mysql2
101
+ # pg and activerecord master
102
+ {2013-04-22 00:00:00 UTC => 1} # Time object
103
+
104
+ # pg and activerecord <= 4.0.0.beta1
105
+ {"2013-04-22 00:00:00+00" => 1} # String
106
+ ```
107
+
108
+ Another data type inconsistency
109
+
110
+ ```ruby
111
+ User.group_by_day_of_week(:created_at).count
112
+
113
+ # mysql2
114
+ {0 => 1, 4 => 1} # Integer
115
+
116
+ # pg and activerecord <= 4.0.0.beta1
117
+ {"0" => 1, "4" => 1} # String
118
+
119
+ # pg and activerecord master
120
+ {0.0 => 1, 4.0 => 1} # Float
121
+ ```
122
+
123
+ These are *not* a result of groupdate (and unfortunately cannot be fixed by groupdate)
93
124
 
94
125
  ## Installation
95
126
 
@@ -99,6 +130,14 @@ Add this line to your application's Gemfile:
99
130
  gem 'groupdate'
100
131
  ```
101
132
 
133
+ ### MySQL only
134
+
135
+ [Time zone support](http://dev.mysql.com/doc/refman/5.6/en/time-zone-support.html) must be installed on the server.
136
+
137
+ ```
138
+ mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql
139
+ ```
140
+
102
141
  ## Complete list
103
142
 
104
143
  group_by_?
data/groupdate.gemspec CHANGED
@@ -24,6 +24,5 @@ Gem::Specification.new do |spec|
24
24
  spec.add_development_dependency "rake"
25
25
  spec.add_development_dependency "minitest"
26
26
  spec.add_development_dependency "pg"
27
- spec.add_development_dependency "mysql"
28
27
  spec.add_development_dependency "mysql2"
29
28
  end
data/lib/groupdate.rb CHANGED
@@ -39,15 +39,15 @@ module Groupdate
39
39
  end
40
40
  query =
41
41
  case connection.adapter_name
42
- when "MySQL", "Mysql2"
42
+ when "Mysql2"
43
43
  case field
44
44
  when "day_of_week" # Sunday = 0, Monday = 1, etc
45
45
  # use CONCAT for consistent return type (String)
46
- ["CONCAT('', DAYOFWEEK(CONVERT_TZ(#{column}, '+00:00', ?)) - 1)", time_zone]
46
+ ["DAYOFWEEK(CONVERT_TZ(#{column}, '+00:00', ?)) - 1", time_zone]
47
47
  when "hour_of_day"
48
- ["CONCAT('', EXTRACT(HOUR from CONVERT_TZ(#{column}, '+00:00', ?)))", time_zone]
48
+ ["EXTRACT(HOUR from CONVERT_TZ(#{column}, '+00:00', ?))", time_zone]
49
49
  when "week"
50
- ["CONCAT(CONVERT_TZ(DATE_FORMAT(CONVERT_TZ(DATE_SUB(#{column}, INTERVAL (DAYOFWEEK(CONVERT_TZ(#{column}, '+00:00', ?)) - 1) DAY), '+00:00', ?), '%Y-%m-%d 00:00:00'), ?, '+00:00'), '+00')", time_zone, time_zone, time_zone]
50
+ ["CONVERT_TZ(DATE_FORMAT(CONVERT_TZ(DATE_SUB(#{column}, INTERVAL (DAYOFWEEK(CONVERT_TZ(#{column}, '+00:00', ?)) - 1) DAY), '+00:00', ?), '%Y-%m-%d 00:00:00'), ?, '+00:00')", time_zone, time_zone, time_zone]
51
51
  else
52
52
  format =
53
53
  case field
@@ -65,7 +65,7 @@ module Groupdate
65
65
  "%Y-01-01 00:00:00"
66
66
  end
67
67
 
68
- ["CONCAT(CONVERT_TZ(DATE_FORMAT(CONVERT_TZ(#{column}, '+00:00', ?), '#{format}'), ?, '+00:00'), '+00')", time_zone, time_zone]
68
+ ["CONVERT_TZ(DATE_FORMAT(CONVERT_TZ(#{column}, '+00:00', ?), '#{format}'), ?, '+00:00')", time_zone, time_zone]
69
69
  end
70
70
  when "PostgreSQL"
71
71
  case field
@@ -1,3 +1,3 @@
1
1
  module Groupdate
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
@@ -1,5 +1,5 @@
1
- require "minitest/spec"
2
1
  require "minitest/autorun"
2
+ require "minitest/pride"
3
3
  require "active_record"
4
4
  require "groupdate"
5
5
  require "logger"
@@ -15,7 +15,7 @@ class User < ActiveRecord::Base
15
15
  end
16
16
 
17
17
  describe Groupdate do
18
- %w(postgresql mysql mysql2).each do |adapter|
18
+ %w(postgresql mysql2).each do |adapter|
19
19
  describe adapter do
20
20
  before do
21
21
  ActiveRecord::Base.establish_connection adapter: adapter, database: "groupdate"
@@ -37,84 +37,88 @@ describe Groupdate do
37
37
  ].each{|u| User.create!(u) }
38
38
 
39
39
  assert_equal(
40
- {"2013-04-01 00:00:00+00" => 1, "2013-04-02 00:00:00+00" => 1},
40
+ {"2013-04-01 00:00:00+00".to_time => 1, "2013-04-02 00:00:00+00".to_time => 1},
41
41
  User.where("score > 1").group_by_day(:created_at).count
42
42
  )
43
43
  end
44
44
 
45
45
  it "group_by_second" do
46
46
  create_user "2013-04-01 00:00:01 UTC"
47
- assert_equal({"2013-04-01 00:00:01+00" => 1}, User.group_by_second(:created_at).count)
47
+ assert_equal({"2013-04-01 00:00:01+00".to_time => 1}, User.group_by_second(:created_at).count)
48
48
  end
49
49
 
50
50
  it "group_by_minute" do
51
51
  create_user "2013-04-01 00:01:01 UTC"
52
- assert_equal({"2013-04-01 00:01:00+00" => 1}, User.group_by_minute(:created_at).count)
52
+ assert_equal({"2013-04-01 00:01:00+00".to_time => 1}, User.group_by_minute(:created_at).count)
53
53
  end
54
54
 
55
55
  it "group_by_hour" do
56
56
  create_user "2013-04-01 01:01:01 UTC"
57
- assert_equal({"2013-04-01 01:00:00+00" => 1}, User.group_by_hour(:created_at).count)
57
+ assert_equal({"2013-04-01 01:00:00+00".to_time => 1}, User.group_by_hour(:created_at).count)
58
58
  end
59
59
 
60
60
  it "group_by_day" do
61
61
  create_user "2013-04-01 01:01:01 UTC"
62
- assert_equal({"2013-04-01 00:00:00+00" => 1}, User.group_by_day(:created_at).count)
62
+ assert_equal({"2013-04-01 00:00:00+00".to_time => 1}, User.group_by_day(:created_at).count)
63
63
  end
64
64
 
65
65
  it "group_by_day with time zone" do
66
66
  create_user "2013-04-01 01:01:01 UTC"
67
- assert_equal({"2013-03-31 07:00:00+00" => 1}, User.group_by_day(:created_at, "Pacific Time (US & Canada)").count)
67
+ assert_equal({"2013-03-31 07:00:00+00".to_time => 1}, User.group_by_day(:created_at, "Pacific Time (US & Canada)").count)
68
68
  end
69
69
 
70
70
  it "group_by_week" do
71
71
  create_user "2013-03-17 01:01:01 UTC"
72
- assert_equal({"2013-03-17 00:00:00+00" => 1}, User.group_by_week(:created_at).count)
72
+ assert_equal({"2013-03-17 00:00:00+00".to_time => 1}, User.group_by_week(:created_at).count)
73
73
  end
74
74
 
75
75
  it "group_by_week with time zone" do # day of DST
76
76
  create_user "2013-03-17 01:01:01 UTC"
77
- assert_equal({"2013-03-10 08:00:00+00" => 1}, User.group_by_week(:created_at, "Pacific Time (US & Canada)").count)
77
+ assert_equal({"2013-03-10 08:00:00+00".to_time => 1}, User.group_by_week(:created_at, "Pacific Time (US & Canada)").count)
78
78
  end
79
79
 
80
80
  it "group_by_month" do
81
81
  create_user "2013-04-01 01:01:01 UTC"
82
- assert_equal({"2013-04-01 00:00:00+00" => 1}, User.group_by_month(:created_at).count)
82
+ assert_equal({"2013-04-01 00:00:00+00".to_time(:utc) => 1}, User.group_by_month(:created_at).count)
83
83
  end
84
84
 
85
85
  it "group_by_month with time zone" do
86
86
  create_user "2013-04-01 01:01:01 UTC"
87
- assert_equal({"2013-03-01 08:00:00+00" => 1}, User.group_by_month(:created_at, "Pacific Time (US & Canada)").count)
87
+ assert_equal({"2013-03-01 08:00:00+00".to_time(:utc) => 1}, User.group_by_month(:created_at, "Pacific Time (US & Canada)").count)
88
88
  end
89
89
 
90
90
  it "group_by_year" do
91
91
  create_user "2013-01-01 01:01:01 UTC"
92
- assert_equal({"2013-01-01 00:00:00+00" => 1}, User.group_by_year(:created_at).count)
92
+ assert_equal({"2013-01-01 00:00:00+00".to_time(:utc) => 1}, User.group_by_year(:created_at).count)
93
93
  end
94
94
 
95
95
  it "group_by_year with time zone" do
96
96
  create_user "2013-01-01 01:01:01 UTC"
97
- assert_equal({"2012-01-01 08:00:00+00" => 1}, User.group_by_year(:created_at, "Pacific Time (US & Canada)").count)
97
+ assert_equal({"2012-01-01 08:00:00+00".to_time(:utc) => 1}, User.group_by_year(:created_at, "Pacific Time (US & Canada)").count)
98
98
  end
99
99
 
100
100
  it "group_by_hour_of_day" do
101
101
  create_user "2013-01-01 11:00:00 UTC"
102
- assert_equal({"11" => 1}, User.group_by_hour_of_day(:created_at).count)
102
+ expected = adapter == "mysql2" ? {11 => 1} : {11.0 => 1}
103
+ assert_equal(expected, User.group_by_hour_of_day(:created_at).count)
103
104
  end
104
105
 
105
106
  it "group_by_hour_of_day with time zone" do
106
107
  create_user "2013-01-01 11:00:00 UTC"
107
- assert_equal({"3" => 1}, User.group_by_hour_of_day(:created_at, "Pacific Time (US & Canada)").count)
108
+ expected = adapter == "mysql2" ? {3 => 1} : {3.0 => 1}
109
+ assert_equal(expected, User.group_by_hour_of_day(:created_at, "Pacific Time (US & Canada)").count)
108
110
  end
109
111
 
110
112
  it "group_by_day_of_week" do
111
113
  create_user "2013-03-03 00:00:00 UTC"
112
- assert_equal({"0" => 1}, User.group_by_day_of_week(:created_at).count)
114
+ expected = adapter == "mysql2" ? {0 => 1} : {0.0 => 1}
115
+ assert_equal(expected, User.group_by_day_of_week(:created_at).count)
113
116
  end
114
117
 
115
118
  it "group_by_day_of_week with time zone" do
116
119
  create_user "2013-03-03 00:00:00 UTC"
117
- assert_equal({"6" => 1}, User.group_by_day_of_week(:created_at, "Pacific Time (US & Canada)").count)
120
+ expected = adapter == "mysql2" ? {6 => 1} : {6.0 => 1}
121
+ assert_equal(expected, User.group_by_day_of_week(:created_at, "Pacific Time (US & Canada)").count)
118
122
  end
119
123
 
120
124
  # helper methods
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: groupdate
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Kane
@@ -80,20 +80,6 @@ dependencies:
80
80
  - - '>='
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
- - !ruby/object:Gem::Dependency
84
- name: mysql
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - '>='
88
- - !ruby/object:Gem::Version
89
- version: '0'
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - '>='
95
- - !ruby/object:Gem::Version
96
- version: '0'
97
83
  - !ruby/object:Gem::Dependency
98
84
  name: mysql2
99
85
  requirement: !ruby/object:Gem::Requirement