groupdate 3.0.0 → 3.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1388ce20a1c1a41fdd0fe87d5cda7d28522ad2d2
4
- data.tar.gz: 62660c4bb7aabbf6e619274038f2335c0dbed0dd
3
+ metadata.gz: dd126e51d0c9b683eae721f9c2bf6a133409039b
4
+ data.tar.gz: 0f5f4487b87fbe82f22eea5edebe9558cc883593
5
5
  SHA512:
6
- metadata.gz: 471f406dd29530940a51bd7b1547a3a19d8399098a6949d50a94e08be5fefb1e256cd3b996f0f964101541858b4744d85e6e85d1eb2c162e35ffc3fec2eb4df5
7
- data.tar.gz: d199353fbccd7b4c1aa74609e4c28d187fc19036785c236cd23e4d0559a2c50a380fe3e273fd8a1f324d13b42e9e3b90b9ebc75bea7527a2661083bca1e2f43f
6
+ metadata.gz: 7b9c7878256b705354bb3ccef1c87946fa94815f34144cf1332775ec448f2db35bcd485399dc91bddef7089d56d92e94ed9be18acf4332fe415074b927a1d32e
7
+ data.tar.gz: 8653c47e5f08f1001974aad183fbd7c182673a0da9436d8e1d79b288cac728621a472d3c9abc92ee5b5303ffc0d4a5d2090e96a69df3b33786096e92d845d35f
data/.travis.yml CHANGED
@@ -8,7 +8,7 @@ gemfile:
8
8
  - test/gemfiles/activerecord32.gemfile
9
9
  - test/gemfiles/activerecord40.gemfile
10
10
  - test/gemfiles/activerecord41.gemfile
11
- - test/gemfiles/activerecord50.gemfile
11
+ - test/gemfiles/activerecord42.gemfile
12
12
  sudo: false
13
13
  script: bundle exec rake test
14
14
  before_install:
@@ -24,4 +24,5 @@ matrix:
24
24
  allow_failures:
25
25
  - rvm: jruby
26
26
  gemfile: Gemfile
27
- - gemfile: test/gemfiles/activerecord50.gemfile
27
+ - rvm: jruby
28
+ gemfile: test/gemfiles/activerecord42.gemfile
data/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+ ## 3.0.1
2
+
3
+ - Added support for Redshift
4
+ - Fix for infinite loop in certain cases for Rails 5
5
+
1
6
  ## 3.0.0
2
7
 
3
8
  Breaking changes
data/Gemfile CHANGED
@@ -3,4 +3,4 @@ source "https://rubygems.org"
3
3
  # Specify your gem's dependencies in groupdate.gemspec
4
4
  gemspec
5
5
 
6
- gem "activerecord", "~> 4.2.0"
6
+ gem "activerecord", "~> 5.0.0"
data/README.md CHANGED
@@ -13,7 +13,7 @@ The simplest way to group by:
13
13
 
14
14
  Works with Rails 3.1+
15
15
 
16
- Supports PostgreSQL and MySQL, plus arrays and hashes
16
+ Supports PostgreSQL, MySQL, and Redshift, plus arrays and hashes
17
17
 
18
18
  [![Build Status](https://travis-ci.org/ankane/groupdate.svg?branch=master)](https://travis-ci.org/ankane/groupdate)
19
19
 
@@ -164,6 +164,20 @@ User.group_by_hour_of_day(:created_at, format: "%-l %P").count
164
164
 
165
165
  Takes a `String`, which is passed to [strftime](http://strfti.me/), or a `Symbol`, which is looked up by `I18n.localize` in `i18n` scope 'time.formats', or a `Proc`. You can pass a locale with the `locale` option.
166
166
 
167
+ ### Series
168
+
169
+ The entire series is returned by default. To exclude points without data, use:
170
+
171
+ ```ruby
172
+ User.group_by_day(:created_at, series: false).count
173
+ ```
174
+
175
+ Or change the default value with:
176
+
177
+ ```ruby
178
+ User.group_by_day(:created_at, default_value: "missing").count
179
+ ```
180
+
167
181
  ### Dynamic Grouping
168
182
 
169
183
  ```ruby
data/Rakefile CHANGED
@@ -4,7 +4,7 @@ require "rake/testtask"
4
4
  task default: :test
5
5
  Rake::TestTask.new do |t|
6
6
  t.libs << "test"
7
- t.pattern = "test/**/*_test.rb"
7
+ t.test_files = FileList["test/**/*_test.rb"].exclude(/redshift/)
8
8
  end
9
9
 
10
10
  namespace :test do
@@ -16,4 +16,8 @@ namespace :test do
16
16
  t.libs << "test"
17
17
  t.pattern = "test/mysql_test.rb"
18
18
  end
19
+ Rake::TestTask.new(:redshift) do |t|
20
+ t.libs << "test"
21
+ t.pattern = "test/redshift_test.rb"
22
+ end
19
23
  end
@@ -77,6 +77,25 @@ module Groupdate
77
77
  else
78
78
  ["(DATE_TRUNC('#{field}', (#{column}::timestamptz - INTERVAL '#{day_start} second') AT TIME ZONE ?) + INTERVAL '#{day_start} second') AT TIME ZONE ?", time_zone, time_zone]
79
79
  end
80
+ when "Redshift"
81
+ case field
82
+ when :day_of_week # Sunday = 0, Monday = 1, etc.
83
+ ["EXTRACT(DOW from CONVERT_TIMEZONE(?, #{column}::timestamp) - INTERVAL '#{day_start} second')::integer", time_zone]
84
+ when :hour_of_day
85
+ ["EXTRACT(HOUR from CONVERT_TIMEZONE(?, #{column}::timestamp) - INTERVAL '#{day_start} second')::integer", time_zone]
86
+ when :day_of_month
87
+ ["EXTRACT(DAY from CONVERT_TIMEZONE(?, #{column}::timestamp) - INTERVAL '#{day_start} second')::integer", time_zone]
88
+ when :month_of_year
89
+ ["EXTRACT(MONTH from CONVERT_TIMEZONE(?, #{column}::timestamp) - INTERVAL '#{day_start} second')::integer", time_zone]
90
+ when :week # start on Sunday, not Redshift default Monday
91
+ # Redshift does not return timezone information; it
92
+ # always says it is in UTC time, so we must convert
93
+ # back to UTC to play properly with the rest of Groupdate.
94
+ #
95
+ ["CONVERT_TIMEZONE(?, 'Etc/UTC', DATE_TRUNC(?, CONVERT_TIMEZONE(?, #{column}) - INTERVAL '#{week_start} day' - INTERVAL '#{day_start} second'))::timestamp + INTERVAL '#{week_start} day' + INTERVAL '#{day_start} second'", time_zone, field, time_zone]
96
+ else
97
+ ["CONVERT_TIMEZONE(?, 'Etc/UTC', DATE_TRUNC(?, CONVERT_TIMEZONE(?, #{column}) - INTERVAL '#{day_start} second'))::timestamp + INTERVAL '#{day_start} second'", time_zone, field, time_zone]
98
+ end
80
99
  else
81
100
  raise "Connection adapter not supported: #{adapter_name}"
82
101
  end
@@ -205,8 +224,14 @@ module Groupdate
205
224
  step = 1.send(field)
206
225
  end
207
226
 
208
- while (next_step = round_time(series.last + step)) && time_range.cover?(next_step)
227
+ last_step = series.last
228
+ while (next_step = round_time(last_step + step)) && time_range.cover?(next_step)
229
+ if next_step == last_step
230
+ last_step += step
231
+ next
232
+ end
209
233
  series << next_step
234
+ last_step = next_step
210
235
  end
211
236
 
212
237
  series
@@ -1,3 +1,3 @@
1
1
  module Groupdate
2
- VERSION = "3.0.0"
2
+ VERSION = "3.0.1"
3
3
  end
@@ -3,4 +3,4 @@ source 'https://rubygems.org'
3
3
  # Specify your gem's dependencies in searchkick.gemspec
4
4
  gemspec path: "../../"
5
5
 
6
- gem "activerecord", "~> 5.0.0.rc1"
6
+ gem "activerecord", "~> 4.2.0"
@@ -0,0 +1,7 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in searchkick.gemspec
4
+ gemspec path: "../../"
5
+
6
+ gem "activerecord", "~> 4.2.0"
7
+ gem "activerecord4-redshift-adapter", "~> 0.2.0"
@@ -0,0 +1,18 @@
1
+ require_relative "test_helper"
2
+
3
+ class TestRedshift < Minitest::Test
4
+ include TestGroupdate
5
+ include TestDatabase
6
+
7
+ def setup
8
+ super
9
+ @@setup ||= begin
10
+ abort("REDSHIFT_URL environment variable must be set in order to run tests") unless ENV["REDSHIFT_URL"].present?
11
+
12
+ ActiveRecord::Base.establish_connection(ENV["REDSHIFT_URL"])
13
+
14
+ create_redshift_tables
15
+ true
16
+ end
17
+ end
18
+ end
data/test/test_helper.rb CHANGED
@@ -49,6 +49,22 @@ def create_tables
49
49
  end
50
50
  end
51
51
 
52
+ def create_redshift_tables
53
+ ActiveRecord::Migration.verbose = false
54
+
55
+ if ActiveRecord::Migration.table_exists?(:users)
56
+ ActiveRecord::Migration.drop_table(:users, force: :cascade)
57
+ end
58
+
59
+ if ActiveRecord::Migration.table_exists?(:posts)
60
+ ActiveRecord::Migration.drop_table(:posts, force: :cascade)
61
+ end
62
+
63
+ ActiveRecord::Migration.execute "CREATE TABLE users (id INT IDENTITY(1,1) PRIMARY KEY, name VARCHAR(255), score INT, created_at DATETIME, created_on DATE);"
64
+
65
+ ActiveRecord::Migration.execute "CREATE TABLE posts (id INT IDENTITY(1,1) PRIMARY KEY, user_id INT REFERENCES users, created_at DATETIME);"
66
+ end
67
+
52
68
  module TestDatabase
53
69
  def test_zeros_previous_scope
54
70
  create_user "2013-05-01"
@@ -332,12 +348,19 @@ module TestDatabase
332
348
  created_on: created_at ? Date.parse(created_at) : nil
333
349
  )
334
350
 
335
- # hack for MySQL adapter
336
- # user.update_attributes(created_at: nil, created_on: nil) if created_at.nil?
351
+ # hack for Redshift adapter, which doesn't return id on creation...
352
+ user = User.last if user.id.nil?
353
+
354
+ # hack for MySQL & Redshift adapters
355
+ user.update_attributes(created_at: nil, created_on: nil) if created_at.nil? && is_redshift?
337
356
 
338
357
  user
339
358
  end
340
359
 
360
+ def is_redshift?
361
+ ActiveRecord::Base.connection.adapter_name == "Redshift"
362
+ end
363
+
341
364
  def teardown
342
365
  User.delete_all
343
366
  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: 3.0.0
4
+ version: 3.0.1
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-05-31 00:00:00.000000000 Z
11
+ date: 2016-07-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -136,9 +136,11 @@ files:
136
136
  - test/gemfiles/activerecord32.gemfile
137
137
  - test/gemfiles/activerecord40.gemfile
138
138
  - test/gemfiles/activerecord41.gemfile
139
- - test/gemfiles/activerecord50.gemfile
139
+ - test/gemfiles/activerecord42.gemfile
140
+ - test/gemfiles/redshift.gemfile
140
141
  - test/mysql_test.rb
141
142
  - test/postgresql_test.rb
143
+ - test/redshift_test.rb
142
144
  - test/test_helper.rb
143
145
  homepage: https://github.com/ankane/groupdate
144
146
  licenses:
@@ -170,8 +172,10 @@ test_files:
170
172
  - test/gemfiles/activerecord32.gemfile
171
173
  - test/gemfiles/activerecord40.gemfile
172
174
  - test/gemfiles/activerecord41.gemfile
173
- - test/gemfiles/activerecord50.gemfile
175
+ - test/gemfiles/activerecord42.gemfile
176
+ - test/gemfiles/redshift.gemfile
174
177
  - test/mysql_test.rb
175
178
  - test/postgresql_test.rb
179
+ - test/redshift_test.rb
176
180
  - test/test_helper.rb
177
181
  has_rdoc: