groupdate 6.4.0 → 6.5.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
  SHA256:
3
- metadata.gz: cdca24f5af218da761aff856a2798e39d4469fa5cdf5186d061572cea4b256a6
4
- data.tar.gz: 3b327397c8ba2638ccda503d3d3fd9d641b86cf8018161fc3cbb7891122d3b3f
3
+ metadata.gz: f55bd15dca1c101b40370cd1fb1f82eca0567fb73511849135a1989fa4a6a11a
4
+ data.tar.gz: 7299ac70d10043b1f95de4885bb02683f55b33f1b075c7e5aced130ef8a6d979
5
5
  SHA512:
6
- metadata.gz: 0b06dcf600f13158dbf4d5edeab2212aedd21b4a2e4efb36d26ab1635c035c562e28932b03ed26bdb452c5118c125d38fc8ea665e2dc5c458a986bd87e62912b
7
- data.tar.gz: 0b78a8ee21b370052d1eacffa3c5c42ceb059ec1a1d14a7b992076cd02cfe158dc6ecee027578aeb233d2adc1c3fa4e71b2f572bf87affd51077b2282e6b2e21
6
+ metadata.gz: 9c1d74da58305bdf89f9c5196ef730712463e4c001ca4592a2f4d1b60d88deb5ca3ba6650f19d307a56e6ffc465f551b7d70ea14008c0445cad8d9f056e751f5
7
+ data.tar.gz: 8ce0e0a7b317214b1eb31913083d9f8f6657b62255617752432c6ede1d3fb1e83cab133bc7cdd725c11522f4d2548ebef2df6bff271f06d02dfa6302e0954d77
data/CHANGELOG.md CHANGED
@@ -1,3 +1,12 @@
1
+ ## 6.5.1 (2024-10-07)
2
+
3
+ - Fixed connection leasing for Active Record 7.2+
4
+
5
+ ## 6.5.0 (2024-10-01)
6
+
7
+ - Added support for Active Record 8
8
+ - Dropped support for Ruby < 3.1 and Active Record < 7
9
+
1
10
  ## 6.4.0 (2023-09-13)
2
11
 
3
12
  - Added support for Trilogy
@@ -173,7 +182,7 @@ Breaking changes
173
182
  - Added `default_value` option
174
183
  - Accept symbol for `format` option
175
184
  - Raise `ArgumentError` if no field specified
176
- - Added support for ActiveRecord 5 beta
185
+ - Added support for Active Record 5 beta
177
186
 
178
187
  ## 2.5.0 (2015-09-29)
179
188
 
@@ -187,18 +196,18 @@ Breaking changes
187
196
  - Added `carry_forward` option
188
197
  - Added `series: false` option for arrays and hashes
189
198
  - Fixed issue w/ Brasilia Summer Time
190
- - Fixed issues w/ ActiveRecord 4.2
199
+ - Fixed issues w/ Active Record 4.2
191
200
 
192
201
  ## 2.3.0 (2014-08-31)
193
202
 
194
- - Raise error when ActiveRecord::Base.default_timezone is not `:utc`
203
+ - Raise error when `ActiveRecord::Base.default_timezone` is not `:utc`
195
204
  - Added `day_of_month`
196
205
  - Added `month_of_year`
197
206
  - Do not quote column name
198
207
 
199
208
  ## 2.2.1 (2014-06-23)
200
209
 
201
- - Fixed ActiveRecord 3 associations
210
+ - Fixed Active Record 3 associations
202
211
 
203
212
  ## 2.2.0 (2014-06-22)
204
213
 
data/LICENSE.txt CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2013-2022 Andrew Kane
1
+ Copyright (c) 2013-2024 Andrew Kane
2
2
 
3
3
  MIT License
4
4
 
data/README.md CHANGED
@@ -11,11 +11,11 @@ The simplest way to group by:
11
11
 
12
12
  :cake: Get the entire series - **the other best part**
13
13
 
14
- Supports PostgreSQL, MySQL, and Redshift, plus arrays and hashes (and limited support for [SQLite](#for-sqlite))
14
+ Supports PostgreSQL, MySQL, MariaDB, and Redshift, plus arrays and hashes (and limited support for [SQLite](#for-sqlite))
15
15
 
16
16
  :cupid: Goes hand in hand with [Chartkick](https://www.chartkick.com)
17
17
 
18
- [![Build Status](https://github.com/ankane/groupdate/workflows/build/badge.svg?branch=master)](https://github.com/ankane/groupdate/actions)
18
+ [![Build Status](https://github.com/ankane/groupdate/actions/workflows/build.yml/badge.svg)](https://github.com/ankane/groupdate/actions)
19
19
 
20
20
  ## Installation
21
21
 
@@ -25,7 +25,7 @@ Add this line to your application’s Gemfile:
25
25
  gem "groupdate"
26
26
  ```
27
27
 
28
- For MySQL and SQLite, also follow [these instructions](#additional-instructions).
28
+ For MySQL, MariaDB, and SQLite, also follow [these instructions](#additional-instructions).
29
29
 
30
30
  ## Getting Started
31
31
 
@@ -250,7 +250,9 @@ users.group_by_day { |u| u.created_at }.to_h { |k, v| [k, v.count] }
250
250
 
251
251
  ## Additional Instructions
252
252
 
253
- ### For MySQL
253
+ <a name="for-mysql"></a>
254
+
255
+ ### For MySQL and MariaDB
254
256
 
255
257
  [Time zone support](https://dev.mysql.com/doc/refman/8.0/en/time-zone-support.html) must be installed on the server.
256
258
 
@@ -280,18 +282,6 @@ If your application’s time zone is set to something other than `Etc/UTC` (the
280
282
  Groupdate.time_zone = false
281
283
  ```
282
284
 
283
- ## Upgrading
284
-
285
- ### 6.0
286
-
287
- Groupdate 6.0 protects against unsafe input by default. For non-attribute arguments, use:
288
-
289
- ```ruby
290
- User.group_by_day(Arel.sql(known_safe_value)).count
291
- ```
292
-
293
- Also, the `dates` option has been removed.
294
-
295
285
  ## History
296
286
 
297
287
  View the [changelog](https://github.com/ankane/groupdate/blob/master/CHANGELOG.md)
@@ -3,7 +3,7 @@ module Groupdate
3
3
  class BaseAdapter
4
4
  attr_reader :period, :column, :day_start, :week_start, :n_seconds
5
5
 
6
- def initialize(relation, column:, period:, time_zone:, time_range:, week_start:, day_start:, n_seconds:)
6
+ def initialize(relation, column:, period:, time_zone:, time_range:, week_start:, day_start:, n_seconds:, adapter_name: nil)
7
7
  @relation = relation
8
8
  @column = column
9
9
  @period = period
@@ -12,6 +12,7 @@ module Groupdate
12
12
  @week_start = week_start
13
13
  @day_start = day_start
14
14
  @n_seconds = n_seconds
15
+ @adapter_name = adapter_name
15
16
 
16
17
  if ActiveRecord::VERSION::MAJOR >= 7
17
18
  if ActiveRecord.default_timezone == :local
@@ -23,7 +23,7 @@ module Groupdate
23
23
  when :week
24
24
  ["(DATE_TRUNC('day', #{day_start_column} - INTERVAL '1 day' * ((? + EXTRACT(DOW FROM #{day_start_column})::integer) % 7)) + INTERVAL ?)::date", time_zone, day_start_interval, 13 - week_start, time_zone, day_start_interval, day_start_interval]
25
25
  when :custom
26
- if @relation.connection.adapter_name == "Redshift"
26
+ if @adapter_name == "Redshift"
27
27
  ["TIMESTAMP 'epoch' + (FLOOR(EXTRACT(EPOCH FROM #{column}::timestamp) / ?) * ?) * INTERVAL '1 second'", n_seconds, n_seconds]
28
28
  else
29
29
  ["TO_TIMESTAMP(FLOOR(EXTRACT(EPOCH FROM #{column}::timestamptz) / ?) * ?)", n_seconds, n_seconds]
@@ -5,7 +5,7 @@ module Enumerable
5
5
  raise ArgumentError, "wrong number of arguments (given #{args.size}, expected 0)" if args.any?
6
6
  Groupdate::Magic::Enumerable.group_by(self, period, options, &block)
7
7
  elsif respond_to?(:scoping)
8
- scoping { @klass.group_by_period(period, *args, **options, &block) }
8
+ scoping { klass.group_by_period(period, *args, **options, &block) }
9
9
  else
10
10
  raise ArgumentError, "no block given"
11
11
  end
@@ -19,7 +19,7 @@ module Enumerable
19
19
  Groupdate::Magic.validate_period(period, options.delete(:permit))
20
20
  send("group_by_#{period}", **options, &block)
21
21
  else
22
- scoping { @klass.group_by_period(period, *args, **options, &block) }
22
+ scoping { klass.group_by_period(period, *args, **options, &block) }
23
23
  end
24
24
  end
25
25
  end
@@ -180,12 +180,13 @@ module Groupdate
180
180
  end
181
181
 
182
182
  def time_zone_support?(relation)
183
- if relation.connection.adapter_name =~ /mysql/i
184
- # need to call klass for Rails < 5.2
185
- sql = relation.klass.send(:sanitize_sql_array, ["SELECT CONVERT_TZ(NOW(), '+00:00', ?)", time_zone.tzinfo.name])
186
- !relation.connection.select_all(sql).first.values.first.nil?
187
- else
188
- true
183
+ relation.connection_pool.with_connection do |connection|
184
+ if connection.adapter_name.match?(/mysql|trilogy/i)
185
+ sql = relation.send(:sanitize_sql_array, ["SELECT CONVERT_TZ(NOW(), '+00:00', ?)", time_zone.tzinfo.name])
186
+ !connection.select_all(sql).to_a.first.values.first.nil?
187
+ else
188
+ true
189
+ end
189
190
  end
190
191
  end
191
192
 
@@ -203,7 +204,7 @@ module Groupdate
203
204
  def self.generate_relation(relation, field:, **options)
204
205
  magic = Groupdate::Magic::Relation.new(**options)
205
206
 
206
- adapter_name = relation.connection.adapter_name
207
+ adapter_name = relation.connection_pool.with_connection { |c| c.adapter_name }
207
208
  adapter = Groupdate.adapters[adapter_name]
208
209
  raise Groupdate::Error, "Connection adapter not supported: #{adapter_name}" unless adapter
209
210
 
@@ -221,7 +222,8 @@ module Groupdate
221
222
  time_range: magic.time_range,
222
223
  week_start: magic.week_start,
223
224
  day_start: magic.day_start,
224
- n_seconds: magic.n_seconds
225
+ n_seconds: magic.n_seconds,
226
+ adapter_name: adapter_name
225
227
  ).generate
226
228
 
227
229
  # add Groupdate info
@@ -238,7 +240,7 @@ module Groupdate
238
240
  def validate_column(column)
239
241
  unless column.is_a?(Symbol) || column.is_a?(Arel::Nodes::SqlLiteral)
240
242
  column = column.to_s
241
- unless /\A\w+(\.\w+)?\z/i.match(column)
243
+ unless /\A\w+(\.\w+)?\z/i.match?(column)
242
244
  raise ActiveRecord::UnknownAttributeReference, "Query method called with non-attribute argument(s): #{column.inspect}. Use Arel.sql() for known-safe values."
243
245
  end
244
246
  end
@@ -251,13 +253,13 @@ module Groupdate
251
253
  def resolve_column(relation, column)
252
254
  node = relation.send(:relation).send(:arel_columns, [column]).first
253
255
  node = Arel::Nodes::SqlLiteral.new(node) if node.is_a?(String)
254
- relation.connection.visitor.accept(node, Arel::Collectors::SQLString.new).value
256
+ relation.connection_pool.with_connection { |c| c.visitor.accept(node, Arel::Collectors::SQLString.new).value }
255
257
  end
256
258
  end
257
259
 
258
260
  # allow any options to keep flexible for future
259
261
  def self.process_result(relation, result, **options)
260
- relation.groupdate_values.reverse.each do |gv|
262
+ relation.groupdate_values.reverse_each do |gv|
261
263
  result = gv.perform(relation, result, default_value: options[:default_value])
262
264
  end
263
265
  result
@@ -1,3 +1,3 @@
1
1
  module Groupdate
2
- VERSION = "6.4.0"
2
+ VERSION = "6.5.1"
3
3
  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: 6.4.0
4
+ version: 6.5.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: 2023-09-14 00:00:00.000000000 Z
11
+ date: 2024-10-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '6.1'
19
+ version: '7'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '6.1'
26
+ version: '7'
27
27
  description:
28
28
  email: andrew@ankane.org
29
29
  executables: []
@@ -58,14 +58,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: '3'
61
+ version: '3.1'
62
62
  required_rubygems_version: !ruby/object:Gem::Requirement
63
63
  requirements:
64
64
  - - ">="
65
65
  - !ruby/object:Gem::Version
66
66
  version: '0'
67
67
  requirements: []
68
- rubygems_version: 3.4.10
68
+ rubygems_version: 3.5.16
69
69
  signing_key:
70
70
  specification_version: 4
71
71
  summary: The simplest way to group temporal data