groupdate 0.1.2 → 0.1.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.
data/.travis.yml ADDED
@@ -0,0 +1,10 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ - 2.0.0
5
+ - jruby
6
+ script: bundle exec rake test
7
+ before_script:
8
+ - mysql -e 'create database groupdate_test;'
9
+ - mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql
10
+ - psql -c 'create database groupdate_test;' -U postgres
data/Gemfile CHANGED
@@ -4,3 +4,8 @@ source 'https://rubygems.org'
4
4
  gemspec
5
5
 
6
6
  # gem "activerecord", github: "rails/rails"
7
+
8
+ platform :jruby do
9
+ gem "activerecord-jdbcpostgresql-adapter", github: "jruby/activerecord-jdbc-adapter"
10
+ gem "activerecord-jdbcmysql-adapter", github: "jruby/activerecord-jdbc-adapter"
11
+ end
data/README.md CHANGED
@@ -15,6 +15,8 @@ Works with Rails 3.0+
15
15
 
16
16
  Supports PostgreSQL and MySQL
17
17
 
18
+ [![Build Status](https://travis-ci.org/ankane/groupdate.png)](https://travis-ci.org/ankane/groupdate)
19
+
18
20
  ## Usage
19
21
 
20
22
  ```ruby
@@ -79,13 +81,17 @@ User.group_by_hour_of_day(:created_at, "Pacific Time (US & Canada)").count
79
81
  # }
80
82
  ```
81
83
 
82
- You can order results with `group_field`.
84
+ You can order results with:
83
85
 
84
86
  ```ruby
85
- User.group_by_day(:created_at).order("group_field desc").limit(20).count
87
+ User.group_by_day(:created_at).order("day asc").count
88
+
89
+ User.group_by_week(:created_at).order("week desc").count
90
+
91
+ User.group_by_hour_of_day(:created_at).order("hour_of_day asc").count
86
92
  ```
87
93
 
88
- Use it with anything you can use `group` with:
94
+ Use it with anywhere you can use `group`.
89
95
 
90
96
  ```ruby
91
97
  Task.completed.group_by_hour(:completed_at).average(:priority)
@@ -109,10 +115,22 @@ gem 'groupdate'
109
115
 
110
116
  [Time zone support](http://dev.mysql.com/doc/refman/5.6/en/time-zone-support.html) must be installed on the server.
111
117
 
112
- ```
118
+ ```sh
113
119
  mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql
114
120
  ```
115
121
 
122
+ #### For JRuby
123
+
124
+ Use the master version of your JDBC adapter. You will get incorrect results for versions before [this commit](https://github.com/jruby/activerecord-jdbc-adapter/commit/c1cdb7cec8d3f06fc54995e8d872d830bd0a4d91).
125
+
126
+ ```sh
127
+ # postgresql
128
+ gem "activerecord-jdbcpostgresql-adapter", github: "jruby/activerecord-jdbc-adapter"
129
+
130
+ # mysql
131
+ gem "activerecord-jdbcmysql-adapter", github: "jruby/activerecord-jdbc-adapter"
132
+ ```
133
+
116
134
  ## Complete list
117
135
 
118
136
  group_by_?
data/Rakefile CHANGED
@@ -1 +1,9 @@
1
1
  require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+
4
+ Rake::TestTask.new do |t|
5
+ t.libs = ["lib"]
6
+ t.warning = false
7
+ t.verbose = false
8
+ t.test_files = FileList["test/*_test.rb"]
9
+ end
data/groupdate.gemspec CHANGED
@@ -23,6 +23,12 @@ Gem::Specification.new do |spec|
23
23
  spec.add_development_dependency "bundler", "~> 1.3"
24
24
  spec.add_development_dependency "rake"
25
25
  spec.add_development_dependency "minitest"
26
- spec.add_development_dependency "pg"
27
- spec.add_development_dependency "mysql2"
26
+
27
+ if RUBY_PLATFORM == "java"
28
+ spec.add_development_dependency "activerecord-jdbcpostgresql-adapter"
29
+ spec.add_development_dependency "activerecord-jdbcmysql-adapter"
30
+ else
31
+ spec.add_development_dependency "pg"
32
+ spec.add_development_dependency "mysql2"
33
+ end
28
34
  end
data/lib/groupdate.rb CHANGED
@@ -40,7 +40,7 @@ module Groupdate
40
40
  end
41
41
  query =
42
42
  case connection.adapter_name
43
- when "Mysql2"
43
+ when "MySQL", "Mysql2"
44
44
  case field
45
45
  when "day_of_week" # Sunday = 0, Monday = 1, etc
46
46
  # use CONCAT for consistent return type (String)
@@ -80,16 +80,23 @@ module Groupdate
80
80
  ["DATE_TRUNC('#{field}', #{column}::timestamptz AT TIME ZONE ?) AT TIME ZONE ?", time_zone, time_zone]
81
81
  end
82
82
  else
83
- raise "Connection adapter not supported"
83
+ raise "Connection adapter not supported: #{connection.adapter_name}"
84
84
  end
85
85
 
86
- group(Groupdate::OrderHack.new(sanitize_sql_array(query)))
86
+ group(Groupdate::OrderHack.new(sanitize_sql_array(query), field))
87
87
  }
88
88
  end
89
89
  end
90
90
  end
91
91
 
92
- class OrderHack < String; end
92
+ class OrderHack < String
93
+ attr_reader :field
94
+
95
+ def initialize(str, field)
96
+ super(str)
97
+ @field = field
98
+ end
99
+ end
93
100
  end
94
101
 
95
102
  ActiveRecord::Base.send :include, Groupdate
@@ -101,7 +108,7 @@ module ActiveRecord
101
108
 
102
109
  def column_alias_for_with_hack(*keys)
103
110
  if keys.first.is_a?(Groupdate::OrderHack)
104
- "group_field"
111
+ keys.first.field
105
112
  else
106
113
  column_alias_for_without_hack(*keys)
107
114
  end
@@ -1,3 +1,3 @@
1
1
  module Groupdate
2
- VERSION = "0.1.2"
2
+ VERSION = "0.1.3"
3
3
  end
@@ -14,18 +14,25 @@ ActiveRecord::Base.time_zone_aware_attributes = true
14
14
  class User < ActiveRecord::Base
15
15
  end
16
16
 
17
+ # migrations
18
+ %w(postgresql mysql2).each do |adapter|
19
+ ActiveRecord::Base.establish_connection adapter: adapter, database: "groupdate_test", username: adapter == "mysql2" ? "root" : nil
20
+
21
+ unless ActiveRecord::Base.connection.table_exists? "users"
22
+ ActiveRecord::Migration.create_table :users do |t|
23
+ t.string :name
24
+ t.integer :score
25
+ t.timestamps
26
+ end
27
+ end
28
+ end
29
+
17
30
  describe Groupdate do
18
31
  %w(postgresql mysql2).each do |adapter|
19
32
  describe adapter do
20
- before do
21
- ActiveRecord::Base.establish_connection adapter: adapter, database: "groupdate"
22
-
23
- # ActiveRecord::Migration.create_table :users do |t|
24
- # t.string :name
25
- # t.integer :score
26
- # t.timestamps
27
- # end
28
33
 
34
+ before do
35
+ User.establish_connection adapter: adapter, database: "groupdate_test", username: adapter == "mysql2" ? "root" : nil
29
36
  User.delete_all
30
37
  end
31
38
 
@@ -46,7 +53,9 @@ describe Groupdate do
46
53
  end
47
54
 
48
55
  it "doesn't throw exception with order" do
49
- User.group_by_day(:created_at).order("group_field desc").limit(20).count == {}
56
+ assert_equal({}, User.group_by_day(:created_at).order("day desc").limit(20).count)
57
+ assert_equal({}, User.group_by_week(:created_at).order("week asc").count)
58
+ assert_equal({}, User.group_by_hour_of_day(:created_at).order("hour_of_day desc").count)
50
59
  end
51
60
 
52
61
  it "group_by_second" do
@@ -132,11 +141,19 @@ describe Groupdate do
132
141
  end
133
142
 
134
143
  def time_key(key)
135
- User.connection.adapter_name == "PostgreSQL" && ActiveRecord::VERSION::MAJOR == 3 ? Time.parse(key).strftime("%Y-%m-%d %H:%M:%S+00") : Time.parse(key)
144
+ if RUBY_PLATFORM == "java"
145
+ User.connection.adapter_name == "PostgreSQL" ? Time.parse(key).strftime("%Y-%m-%d %H:%M:%S%z")[0..-3] : Time.parse(key).strftime("%Y-%m-%d %H:%M:%S").gsub(/ 00\:00\:00\z/, "")
146
+ else
147
+ User.connection.adapter_name == "PostgreSQL" && ActiveRecord::VERSION::MAJOR == 3 ? Time.parse(key).strftime("%Y-%m-%d %H:%M:%S%z")[0..-3] : Time.parse(key)
148
+ end
136
149
  end
137
150
 
138
151
  def number_key(key)
139
- User.connection.adapter_name == "PostgreSQL" ? (ActiveRecord::VERSION::MAJOR == 3 ? key.to_s : key.to_f) : key
152
+ if RUBY_PLATFORM == "java"
153
+ User.connection.adapter_name == "PostgreSQL" ? key.to_f : key
154
+ else
155
+ User.connection.adapter_name == "PostgreSQL" ? (ActiveRecord::VERSION::MAJOR == 3 ? key.to_s : key.to_f) : key
156
+ end
140
157
  end
141
158
 
142
159
  def create_user(created_at)
metadata CHANGED
@@ -1,7 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: groupdate
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
+ prerelease:
5
6
  platform: ruby
6
7
  authors:
7
8
  - Andrew Kane
@@ -13,20 +14,23 @@ dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: activerecord
15
16
  requirement: !ruby/object:Gem::Requirement
17
+ none: false
16
18
  requirements:
17
- - - '>='
19
+ - - ! '>='
18
20
  - !ruby/object:Gem::Version
19
21
  version: 3.0.0
20
22
  type: :runtime
21
23
  prerelease: false
22
24
  version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
23
26
  requirements:
24
- - - '>='
27
+ - - ! '>='
25
28
  - !ruby/object:Gem::Version
26
29
  version: 3.0.0
27
30
  - !ruby/object:Gem::Dependency
28
31
  name: bundler
29
32
  requirement: !ruby/object:Gem::Requirement
33
+ none: false
30
34
  requirements:
31
35
  - - ~>
32
36
  - !ruby/object:Gem::Version
@@ -34,6 +38,7 @@ dependencies:
34
38
  type: :development
35
39
  prerelease: false
36
40
  version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
37
42
  requirements:
38
43
  - - ~>
39
44
  - !ruby/object:Gem::Version
@@ -41,57 +46,65 @@ dependencies:
41
46
  - !ruby/object:Gem::Dependency
42
47
  name: rake
43
48
  requirement: !ruby/object:Gem::Requirement
49
+ none: false
44
50
  requirements:
45
- - - '>='
51
+ - - ! '>='
46
52
  - !ruby/object:Gem::Version
47
53
  version: '0'
48
54
  type: :development
49
55
  prerelease: false
50
56
  version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
51
58
  requirements:
52
- - - '>='
59
+ - - ! '>='
53
60
  - !ruby/object:Gem::Version
54
61
  version: '0'
55
62
  - !ruby/object:Gem::Dependency
56
63
  name: minitest
57
64
  requirement: !ruby/object:Gem::Requirement
65
+ none: false
58
66
  requirements:
59
- - - '>='
67
+ - - ! '>='
60
68
  - !ruby/object:Gem::Version
61
69
  version: '0'
62
70
  type: :development
63
71
  prerelease: false
64
72
  version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
65
74
  requirements:
66
- - - '>='
75
+ - - ! '>='
67
76
  - !ruby/object:Gem::Version
68
77
  version: '0'
69
78
  - !ruby/object:Gem::Dependency
70
79
  name: pg
71
80
  requirement: !ruby/object:Gem::Requirement
81
+ none: false
72
82
  requirements:
73
- - - '>='
83
+ - - ! '>='
74
84
  - !ruby/object:Gem::Version
75
85
  version: '0'
76
86
  type: :development
77
87
  prerelease: false
78
88
  version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
79
90
  requirements:
80
- - - '>='
91
+ - - ! '>='
81
92
  - !ruby/object:Gem::Version
82
93
  version: '0'
83
94
  - !ruby/object:Gem::Dependency
84
95
  name: mysql2
85
96
  requirement: !ruby/object:Gem::Requirement
97
+ none: false
86
98
  requirements:
87
- - - '>='
99
+ - - ! '>='
88
100
  - !ruby/object:Gem::Version
89
101
  version: '0'
90
102
  type: :development
91
103
  prerelease: false
92
104
  version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
93
106
  requirements:
94
- - - '>='
107
+ - - ! '>='
95
108
  - !ruby/object:Gem::Version
96
109
  version: '0'
97
110
  description: The simplest way to group temporal data
@@ -102,6 +115,7 @@ extensions: []
102
115
  extra_rdoc_files: []
103
116
  files:
104
117
  - .gitignore
118
+ - .travis.yml
105
119
  - Gemfile
106
120
  - LICENSE.txt
107
121
  - README.md
@@ -113,26 +127,27 @@ files:
113
127
  homepage: ''
114
128
  licenses:
115
129
  - MIT
116
- metadata: {}
117
130
  post_install_message:
118
131
  rdoc_options: []
119
132
  require_paths:
120
133
  - lib
121
134
  required_ruby_version: !ruby/object:Gem::Requirement
135
+ none: false
122
136
  requirements:
123
- - - '>='
137
+ - - ! '>='
124
138
  - !ruby/object:Gem::Version
125
139
  version: '0'
126
140
  required_rubygems_version: !ruby/object:Gem::Requirement
141
+ none: false
127
142
  requirements:
128
- - - '>='
143
+ - - ! '>='
129
144
  - !ruby/object:Gem::Version
130
145
  version: '0'
131
146
  requirements: []
132
147
  rubyforge_project:
133
- rubygems_version: 2.0.0
148
+ rubygems_version: 1.8.23
134
149
  signing_key:
135
- specification_version: 4
150
+ specification_version: 3
136
151
  summary: The simplest way to group temporal data
137
152
  test_files:
138
153
  - test/groupdate_test.rb
checksums.yaml DELETED
@@ -1,7 +0,0 @@
1
- ---
2
- SHA1:
3
- metadata.gz: ecaeb21da82e1d6200205f6c8f0de7675bd9a047
4
- data.tar.gz: 0f5c4ca2715331c187ba9fd343f68b9a5a5143b4
5
- SHA512:
6
- metadata.gz: 5a21d57c6b249f6de6e27bf27ce6acd5886c3395d5e98edfadb3c5dcebe77a52ec0fb4640a4ca731b59a15a54b398fcca8ecc72e09bbb07386f0c579d0cc3101
7
- data.tar.gz: dc3063e2885001609d9ee8cbccd38558b6e33cc2e7ae4af49b0b8b922fa68180c38b92e62b9416536fb399c7f20ad4d10686781f7f9452d6f86f548641b90b7d