groupdate 0.0.1 → 0.0.2
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/README.md +31 -20
- data/groupdate.gemspec +2 -0
- data/lib/groupdate.rb +2 -1
- data/lib/groupdate/version.rb +1 -1
- data/test/groupdate_test.rb +54 -0
- metadata +32 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6718db413e208c0735f68167fd6347a0e0770c28
|
4
|
+
data.tar.gz: 15f3b021beac304cca17c302fecafe71ddc9249f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 12ec543e69db27f0f499e170b8d10e3475024d08c776673fbd30423d9979e4407c7c6bbbd6a2ecee18d3687715e09dc77eec2b78f02981be330eddbaddb3d154
|
7
|
+
data.tar.gz: 7ae5b1a1d879fd25b4f20ff07c78c5840ec8b7b7241e876c3bc359c69c487adcdd1be9f5cf40f2fc6befae697bdf0da48606751a0957eff7ca74c40d9c419644
|
data/README.md
CHANGED
@@ -5,16 +5,8 @@ The simplest way to group by:
|
|
5
5
|
- day
|
6
6
|
- week
|
7
7
|
- month
|
8
|
-
- year
|
9
8
|
- hour
|
10
|
-
-
|
11
|
-
- milliseconds
|
12
|
-
- second
|
13
|
-
- minute
|
14
|
-
- quarter
|
15
|
-
- decade
|
16
|
-
- century
|
17
|
-
- millennium
|
9
|
+
- *and more* (complete list at bottom)
|
18
10
|
|
19
11
|
:tada: Time zones supported!!
|
20
12
|
|
@@ -24,34 +16,37 @@ PostgreSQL only at the moment - support for other datastores coming soon
|
|
24
16
|
|
25
17
|
```ruby
|
26
18
|
User.group_by_day(:created_at).count
|
27
|
-
# => {2013-04-16 00:00:00
|
19
|
+
# => {"2013-04-16 00:00:00+00" => 50, "2013-04-17 00:00:00+00" => 100}
|
28
20
|
|
29
21
|
Task.group_by_month(:updated_at).count
|
30
|
-
# => {2013-
|
22
|
+
# => {"2013-03-01 00:00:00+00" => 23, "2013-04-01 00:00:00+00" => 44}
|
31
23
|
|
32
24
|
Goal.group_by_year(:accomplished_at).count
|
33
|
-
# => {2012-01-01 00:00:00
|
25
|
+
# => {"2012-01-01 00:00:00+00" => 11, "2013-01-01 00:00:00+00" => 3}
|
34
26
|
```
|
35
27
|
|
36
28
|
The default time zone is `Time.zone`. Pass a time zone as the second argument.
|
37
29
|
|
38
30
|
```ruby
|
39
|
-
|
40
|
-
|
31
|
+
time_zone = ActiveSupport::TimeZone["Pacific Time (US & Canada)"]
|
32
|
+
User.group_by_week(:created_at, time_zone).count
|
33
|
+
# => {"2013-04-16 07:00:00+00" => 80, "2013-04-17 07:00:00+00" => 70}
|
41
34
|
```
|
42
35
|
|
43
|
-
Use it with anything
|
36
|
+
Use it with anything you can use `group` with:
|
44
37
|
|
45
38
|
```ruby
|
46
|
-
|
47
|
-
|
48
|
-
User.group_by_hour(:created_at).average(:tasks_count)
|
39
|
+
Task.completed.group_by_hour(:completed_at).average(:priority)
|
40
|
+
```
|
49
41
|
|
50
|
-
|
42
|
+
Go nuts!
|
51
43
|
|
52
|
-
|
44
|
+
```ruby
|
45
|
+
Request.where(page: "/home").group_by_minute(:started_at).maximum(:request_time)
|
53
46
|
```
|
54
47
|
|
48
|
+
**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)
|
49
|
+
|
55
50
|
## Installation
|
56
51
|
|
57
52
|
Add this line to your application's Gemfile:
|
@@ -60,6 +55,22 @@ Add this line to your application's Gemfile:
|
|
60
55
|
gem 'groupdate'
|
61
56
|
```
|
62
57
|
|
58
|
+
## Complete list
|
59
|
+
|
60
|
+
- microseconds
|
61
|
+
- milliseconds
|
62
|
+
- second
|
63
|
+
- minute
|
64
|
+
- hour
|
65
|
+
- day
|
66
|
+
- week
|
67
|
+
- month
|
68
|
+
- quarter
|
69
|
+
- year
|
70
|
+
- decade
|
71
|
+
- century
|
72
|
+
- millennium
|
73
|
+
|
63
74
|
## Contributing
|
64
75
|
|
65
76
|
1. Fork it
|
data/groupdate.gemspec
CHANGED
data/lib/groupdate.rb
CHANGED
@@ -29,9 +29,10 @@ module Groupdate
|
|
29
29
|
# http://www.postgresql.org/docs/9.1/static/functions-datetime.html
|
30
30
|
%w(microseconds milliseconds second minute hour day week month quarter year decade century millennium).each do |field|
|
31
31
|
self.scope :"group_by_#{field}", lambda {|column, time_zone = Time.zone|
|
32
|
-
if time_zone.is_a?(ActiveSupport::TimeZone)
|
32
|
+
if defined?(ActiveSupport::TimeZone) and time_zone.is_a?(ActiveSupport::TimeZone)
|
33
33
|
time_zone = time_zone.tzinfo.name
|
34
34
|
end
|
35
|
+
time_zone ||= "Etc/UTC"
|
35
36
|
sql = "DATE_TRUNC('#{field}', #{column}::timestamptz AT TIME ZONE ?) AT TIME ZONE ?"
|
36
37
|
group(sanitize_sql_array([sql, time_zone, time_zone]))
|
37
38
|
}
|
data/lib/groupdate/version.rb
CHANGED
@@ -0,0 +1,54 @@
|
|
1
|
+
require "minitest/autorun"
|
2
|
+
require "active_record"
|
3
|
+
require "groupdate"
|
4
|
+
require "logger"
|
5
|
+
|
6
|
+
# for debugging
|
7
|
+
# ActiveRecord::Base.logger = Logger.new(STDOUT)
|
8
|
+
|
9
|
+
# rails does this in activerecord/lib/active_record/railtie.rb
|
10
|
+
ActiveRecord::Base.default_timezone = :utc
|
11
|
+
ActiveRecord::Base.time_zone_aware_attributes = true
|
12
|
+
|
13
|
+
# start connection
|
14
|
+
ActiveRecord::Base.establish_connection adapter: "postgresql", database: "groupdate"
|
15
|
+
|
16
|
+
# ActiveRecord::Migration.create_table :users do |t|
|
17
|
+
# t.string :name
|
18
|
+
# t.integer :score
|
19
|
+
# t.timestamps
|
20
|
+
# end
|
21
|
+
|
22
|
+
class User < ActiveRecord::Base
|
23
|
+
end
|
24
|
+
|
25
|
+
class TestGroupdate < MiniTest::Unit::TestCase
|
26
|
+
def setup
|
27
|
+
User.delete_all
|
28
|
+
[
|
29
|
+
{name: "Andrew", score: 1, created_at: Time.parse("2013-04-01 00:00:00 UTC")},
|
30
|
+
{name: "Jordan", score: 2, created_at: Time.parse("2013-04-01 00:00:00 UTC")},
|
31
|
+
{name: "Nick", score: 3, created_at: Time.parse("2013-04-02 00:00:00 UTC")}
|
32
|
+
].each{|u| User.create!(u) }
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_count
|
36
|
+
expected = {
|
37
|
+
"2013-04-01 00:00:00+00" => 2,
|
38
|
+
"2013-04-02 00:00:00+00" => 1
|
39
|
+
}
|
40
|
+
assert_equal expected, User.group_by_day(:created_at).count
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_time_zone
|
44
|
+
expected = {
|
45
|
+
"2013-03-31 07:00:00+00" => 2,
|
46
|
+
"2013-04-01 07:00:00+00" => 1
|
47
|
+
}
|
48
|
+
assert_equal expected, User.group_by_day(:created_at, "America/Los_Angeles").count
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_where
|
52
|
+
assert_equal({"2013-04-02 00:00:00+00" => 1}, User.where("score > 2").group_by_day(:created_at).count)
|
53
|
+
end
|
54
|
+
end
|
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.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Kane
|
@@ -52,6 +52,34 @@ dependencies:
|
|
52
52
|
- - '>='
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: minitest
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: pg
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
55
83
|
description: The simplest way to group temporal data
|
56
84
|
email:
|
57
85
|
- acekane1@gmail.com
|
@@ -67,6 +95,7 @@ files:
|
|
67
95
|
- groupdate.gemspec
|
68
96
|
- lib/groupdate.rb
|
69
97
|
- lib/groupdate/version.rb
|
98
|
+
- test/groupdate_test.rb
|
70
99
|
homepage: ''
|
71
100
|
licenses:
|
72
101
|
- MIT
|
@@ -91,4 +120,5 @@ rubygems_version: 2.0.0
|
|
91
120
|
signing_key:
|
92
121
|
specification_version: 4
|
93
122
|
summary: The simplest way to group temporal data
|
94
|
-
test_files:
|
123
|
+
test_files:
|
124
|
+
- test/groupdate_test.rb
|