pg_party 1.0.0 → 1.3.0

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
  SHA256:
3
- metadata.gz: b3eb42aaee8d1f94ffd962760c6f4596330cbdc899a314738848861bfc01e29c
4
- data.tar.gz: '049172b0bb51a0d8664ad54b4599a588c448b8558861c3f50688fb938aaf7680'
3
+ metadata.gz: ee226c4523ca2b7099761ad517be99938078f7977281d88920beff47396f0c51
4
+ data.tar.gz: 2843ee1eb9fbe92e9998d8da0a3a20dfa989fa6c6dfcf3a261b80bac0caa47da
5
5
  SHA512:
6
- metadata.gz: 0e00484e8d7142cdff81b64301f5cf2207318e07dd9f918730472ece7840e2025e71e15a827987042c3ede9c66ad41633af88cc4ec7e0f83d7a4e28c57e822a8
7
- data.tar.gz: c3fa8f87087bd47e87910fcb2707cd58d83c7e6bf91207dfde299b550c9aace44cc905a7781d9ddc5b4281a8de654bf096813420aa8937442bf09a053f13f549
6
+ metadata.gz: 6cb4e5e42f08dcca3ec065c5d73656b6075e5a647d60722607cb4a9ff3cfeee24a94f4048544f3442284c816e7e37fe196579b9037e1ddacaaf1136e440efd4a
7
+ data.tar.gz: fdb593463dace1bdcfd844cac214cb6e6489dc7cd533226b90d11e506955ff48ad959fa80320423f3485637f89e3f6dbaeec5812ec0c1f640eb2d620e91de6dc
data/README.md CHANGED
@@ -48,6 +48,32 @@ $ gem install pg_party
48
48
  Note that the gemspec does not require `pg`, as some model methods _may_ work for other databases.
49
49
  Migration methods will be unavailable unless `pg` is installed.
50
50
 
51
+ ## Configuration
52
+
53
+ These values can be accessed and set via `PgParty.config` and `PgParty.configure`.
54
+
55
+ - `caching`
56
+ - Whether to cache currently attached partitions and anonymous model classes
57
+ - Default: `true`
58
+ - `caching_ttl`
59
+ - Length of time (in seconds) that cache entries are considered valid
60
+ - Default: `-1` (never expire cache entries)
61
+ - `schema_exclude_partitions`
62
+ - Whether to exclude child partitions in `rake db:structure:dump`
63
+ - Default: `true`
64
+
65
+ Note that caching is done in-memory for each process of an application. Attaching / detaching partitions _will_ clear the cache, but only for the process that initiated the request. For multi-process web servers, it is recommended to use a TTL or disable caching entirely.
66
+
67
+ ### Example
68
+
69
+ ```ruby
70
+ # in a Rails initializer
71
+ PgParty.configure do |c|
72
+ c.caching_ttl = 60
73
+ c.schema_exclude_partitions = false
74
+ end
75
+ ```
76
+
51
77
  ## Usage
52
78
 
53
79
  ### Migrations
@@ -170,6 +196,7 @@ end
170
196
  Attach an existing table to a _range_ partitioned table:
171
197
 
172
198
  ```ruby
199
+ class AttachRangePartition < ActiveRecord::Migration[5.1]
173
200
  def up
174
201
  attach_range_partition \
175
202
  :some_range_records,
@@ -324,9 +351,35 @@ SomeRangeRecord.in_partition(:some_range_records_partition_name)
324
351
  SomeListRecord.in_partition(:some_list_records_partition_name)
325
352
  ```
326
353
 
354
+ To create _range_ partitions by month for previous, current and next months it's possible to use this example. To automate creation of partitions, run `Log.maintenance` every day with cron:
355
+
356
+ ```ruby
357
+ class Log < ApplicationRecord
358
+ range_partition_by { '(created_at::date)' }
359
+
360
+ def self.maintenance
361
+ partitions = [Date.today.prev_month, Date.today, Date.today.next_month]
362
+
363
+ partitions.each do |day|
364
+ name = Log.partition_name_for(day)
365
+ next if ActiveRecord::Base.connection.table_exists?(name)
366
+ Log.create_partition(
367
+ name: name,
368
+ start_range: day.beginning_of_month,
369
+ end_range: day.next_month.beginning_of_month
370
+ )
371
+ end
372
+ end
373
+
374
+ def self.partition_name_for(day)
375
+ "logs_y#{day.year}_m#{day.month}"
376
+ end
377
+ end
378
+ ```
379
+
327
380
  For more examples, take a look at the model integration specs:
328
381
 
329
- - https://github.com/rkrage/pg_party/tree/documentation/spec/integration/model
382
+ - https://github.com/rkrage/pg_party/tree/master/spec/integration/model
330
383
 
331
384
  ## Development
332
385
 
@@ -1,8 +1,28 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "pg_party/version"
4
+ require "pg_party/config"
5
+ require "pg_party/cache"
4
6
  require "active_support"
5
7
 
8
+ module PgParty
9
+ @config = Config.new
10
+ @cache = Cache.new
11
+
12
+ class << self
13
+ attr_reader :config, :cache
14
+
15
+ def configure(&blk)
16
+ blk.call(config)
17
+ end
18
+
19
+ def reset
20
+ @config = Config.new
21
+ @cache = Cache.new
22
+ end
23
+ end
24
+ end
25
+
6
26
  ActiveSupport.on_load(:active_record) do
7
27
  require "pg_party/model/methods"
8
28
 
@@ -14,10 +34,11 @@ ActiveSupport.on_load(:active_record) do
14
34
  PgParty::Adapter::AbstractMethods
15
35
  )
16
36
 
17
- require "pg_party/hacks/schema_cache"
37
+ require "active_record/tasks/postgresql_database_tasks"
38
+ require "pg_party/hacks/postgresql_database_tasks"
18
39
 
19
- ActiveRecord::ConnectionAdapters::SchemaCache.include(
20
- PgParty::Hacks::SchemaCache
40
+ ActiveRecord::Tasks::PostgreSQLDatabaseTasks.prepend(
41
+ PgParty::Hacks::PostgreSQLDatabaseTasks
21
42
  )
22
43
 
23
44
  begin
@@ -1,39 +1,40 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "pg_party/adapter_decorator"
4
+ require "ruby2_keywords"
4
5
 
5
6
  module PgParty
6
7
  module Adapter
7
8
  module PostgreSQLMethods
8
- def create_range_partition(*args, &blk)
9
+ ruby2_keywords def create_range_partition(*args, &blk)
9
10
  PgParty::AdapterDecorator.new(self).create_range_partition(*args, &blk)
10
11
  end
11
12
 
12
- def create_list_partition(*args, &blk)
13
+ ruby2_keywords def create_list_partition(*args, &blk)
13
14
  PgParty::AdapterDecorator.new(self).create_list_partition(*args, &blk)
14
15
  end
15
16
 
16
- def create_range_partition_of(*args)
17
+ ruby2_keywords def create_range_partition_of(*args)
17
18
  PgParty::AdapterDecorator.new(self).create_range_partition_of(*args)
18
19
  end
19
20
 
20
- def create_list_partition_of(*args)
21
+ ruby2_keywords def create_list_partition_of(*args)
21
22
  PgParty::AdapterDecorator.new(self).create_list_partition_of(*args)
22
23
  end
23
24
 
24
- def create_table_like(*args)
25
+ ruby2_keywords def create_table_like(*args)
25
26
  PgParty::AdapterDecorator.new(self).create_table_like(*args)
26
27
  end
27
28
 
28
- def attach_range_partition(*args)
29
+ ruby2_keywords def attach_range_partition(*args)
29
30
  PgParty::AdapterDecorator.new(self).attach_range_partition(*args)
30
31
  end
31
32
 
32
- def attach_list_partition(*args)
33
+ ruby2_keywords def attach_list_partition(*args)
33
34
  PgParty::AdapterDecorator.new(self).attach_list_partition(*args)
34
35
  end
35
36
 
36
- def detach_partition(*args)
37
+ ruby2_keywords def detach_partition(*args)
37
38
  PgParty::AdapterDecorator.new(self).detach_partition(*args)
38
39
  end
39
40
  end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "digest"
4
- require "pg_party/cache"
5
4
 
6
5
  module PgParty
7
6
  class AdapterDecorator < SimpleDelegator
@@ -61,7 +60,7 @@ module PgParty
61
60
  DETACH PARTITION #{quote_table_name(child_table_name)}
62
61
  SQL
63
62
 
64
- PgParty::Cache.clear!
63
+ PgParty.cache.clear!
65
64
  end
66
65
 
67
66
  private
@@ -118,7 +117,7 @@ module PgParty
118
117
  FOR VALUES #{constraint_clause}
119
118
  SQL
120
119
 
121
- PgParty::Cache.clear!
120
+ PgParty.cache.clear!
122
121
  end
123
122
 
124
123
  # Rails 5.2 now returns boolean literals
@@ -149,7 +148,7 @@ module PgParty
149
148
  if key.is_a?(Proc)
150
149
  key.call.to_s # very difficult to determine how to sanitize a complex expression
151
150
  else
152
- quote_column_name(key)
151
+ Array.wrap(key).map(&method(:quote_column_name)).join(",")
153
152
  end
154
153
  end
155
154
 
@@ -6,32 +6,66 @@ module PgParty
6
6
  class Cache
7
7
  LOCK = Mutex.new
8
8
 
9
- class << self
10
- def clear!
11
- LOCK.synchronize { store.clear }
9
+ def initialize
10
+ # automatically initialize a new hash when
11
+ # accessing an object id that doesn't exist
12
+ @store = Hash.new { |h, k| h[k] = { models: {}, partitions: nil } }
13
+ end
14
+
15
+ def clear!
16
+ LOCK.synchronize { @store.clear }
17
+
18
+ nil
19
+ end
20
+
21
+ def fetch_model(key, child_table, &block)
22
+ return block.call unless caching_enabled?
23
+
24
+ LOCK.synchronize { fetch_value(@store[key][:models], child_table.to_sym, block) }
25
+ end
26
+
27
+ def fetch_partitions(key, &block)
28
+ return block.call unless caching_enabled?
29
+
30
+ LOCK.synchronize { fetch_value(@store[key], :partitions, block) }
31
+ end
32
+
33
+ private
34
+
35
+ def caching_enabled?
36
+ PgParty.config.caching
37
+ end
38
+
39
+ def fetch_value(subhash, key, block)
40
+ entry = subhash[key]
12
41
 
13
- nil
42
+ if entry.nil? || entry.expired?
43
+ entry = Entry.new(block.call)
44
+ subhash[key] = entry
14
45
  end
15
46
 
16
- def fetch_model(key, child_table, &block)
17
- LOCK.synchronize do
18
- store[key][:models][child_table.to_sym] ||= block.call
19
- end
47
+ entry.value
48
+ end
49
+
50
+ class Entry
51
+ attr_reader :value
52
+
53
+ def initialize(value)
54
+ @value = value
55
+ @timestamp = Time.now
20
56
  end
21
57
 
22
- def fetch_partitions(key, &block)
23
- LOCK.synchronize do
24
- store[key][:partitions] ||= block.call
25
- end
58
+ def expired?
59
+ ttl.positive? && Time.now - @timestamp > ttl
26
60
  end
27
61
 
28
62
  private
29
63
 
30
- def store
31
- # automatically initialize a new hash when
32
- # accessing an object id that doesn't exist
33
- @store ||= Hash.new { |h, k| h[k] = { models: {}, partitions: nil } }
64
+ def ttl
65
+ PgParty.config.caching_ttl
34
66
  end
35
67
  end
68
+
69
+ private_constant :Entry
36
70
  end
37
71
  end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PgParty
4
+ class Config
5
+ attr_accessor \
6
+ :caching,
7
+ :caching_ttl,
8
+ :schema_exclude_partitions
9
+
10
+ def initialize
11
+ @caching = true
12
+ @caching_ttl = -1
13
+ @schema_exclude_partitions = true
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PgParty
4
+ module Hacks
5
+ module PostgreSQLDatabaseTasks
6
+ def run_cmd(cmd, args, action)
7
+ if action != "dumping" || !PgParty.config.schema_exclude_partitions
8
+ return super
9
+ end
10
+
11
+ partitions = begin
12
+ ActiveRecord::Base.connection.select_values(
13
+ "SELECT DISTINCT inhrelid::regclass::text FROM pg_inherits"
14
+ )
15
+ rescue
16
+ []
17
+ end
18
+
19
+ excluded_tables = partitions.flat_map { |table| ["-T", "*.#{table}"] }
20
+
21
+ super(cmd, args + excluded_tables, action)
22
+ end
23
+ end
24
+ end
25
+ end
@@ -1,15 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "pg_party/model_decorator"
4
+ require "ruby2_keywords"
4
5
 
5
6
  module PgParty
6
7
  module Model
7
8
  module ListMethods
8
- def create_partition(*args)
9
+ ruby2_keywords def create_partition(*args)
9
10
  PgParty::ModelDecorator.new(self).create_list_partition(*args)
10
11
  end
11
12
 
12
- def partition_key_in(*args)
13
+ ruby2_keywords def partition_key_in(*args)
13
14
  PgParty::ModelDecorator.new(self).list_partition_key_in(*args)
14
15
  end
15
16
  end
@@ -5,12 +5,12 @@ require "pg_party/model_injector"
5
5
  module PgParty
6
6
  module Model
7
7
  module Methods
8
- def range_partition_by(key=nil, &blk)
9
- PgParty::ModelInjector.new(self, key || blk).inject_range_methods
8
+ def range_partition_by(*key, &blk)
9
+ PgParty::ModelInjector.new(self, *key, &blk).inject_range_methods
10
10
  end
11
11
 
12
- def list_partition_by(key=nil, &blk)
13
- PgParty::ModelInjector.new(self, key || blk).inject_list_methods
12
+ def list_partition_by(*key, &blk)
13
+ PgParty::ModelInjector.new(self, *key, &blk).inject_list_methods
14
14
  end
15
15
 
16
16
  def partitioned?
@@ -1,15 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "pg_party/model_decorator"
4
+ require "ruby2_keywords"
4
5
 
5
6
  module PgParty
6
7
  module Model
7
8
  module RangeMethods
8
- def create_partition(*args)
9
+ ruby2_keywords def create_partition(*args)
9
10
  PgParty::ModelDecorator.new(self).create_range_partition(*args)
10
11
  end
11
12
 
12
- def partition_key_in(*args)
13
+ ruby2_keywords def partition_key_in(*args)
13
14
  PgParty::ModelDecorator.new(self).range_partition_key_in(*args)
14
15
  end
15
16
  end
@@ -6,11 +6,19 @@ module PgParty
6
6
  module Model
7
7
  module SharedMethods
8
8
  def reset_primary_key
9
- PgParty::ModelDecorator.new(self).partition_primary_key
9
+ if self != base_class
10
+ base_class.primary_key
11
+ elsif partition_name = partitions.first
12
+ in_partition(partition_name).get_primary_key(base_class.name)
13
+ else
14
+ get_primary_key(base_class.name)
15
+ end
10
16
  end
11
17
 
12
18
  def table_exists?
13
- PgParty::ModelDecorator.new(self).partition_table_exists?
19
+ target_table = partitions.first || table_name
20
+
21
+ connection.schema_cache.data_source_exists?(target_table)
14
22
  end
15
23
 
16
24
  def partitions
@@ -1,27 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "pg_party/cache"
4
-
5
3
  module PgParty
6
4
  class ModelDecorator < SimpleDelegator
7
- def partition_primary_key
8
- if self != base_class
9
- base_class.primary_key
10
- elsif partition_name = partitions.first
11
- in_partition(partition_name).get_primary_key(base_class.name)
12
- else
13
- get_primary_key(base_class.name)
14
- end
15
- end
16
-
17
- def partition_table_exists?
18
- target_table = partitions.first || table_name
19
-
20
- connection.schema_cache.data_source_exists?(target_table)
21
- end
22
-
23
5
  def in_partition(child_table_name)
24
- PgParty::Cache.fetch_model(cache_key, child_table_name) do
6
+ PgParty.cache.fetch_model(cache_key, child_table_name) do
25
7
  Class.new(__getobj__) do
26
8
  self.table_name = child_table_name
27
9
 
@@ -41,6 +23,11 @@ module PgParty
41
23
  def self.new(*args, &blk)
42
24
  superclass.new(*args, &blk)
43
25
  end
26
+
27
+ # to avoid unnecessary db lookups
28
+ def self.partitions
29
+ []
30
+ end
44
31
  end
45
32
  end
46
33
  end
@@ -49,7 +36,7 @@ module PgParty
49
36
  if complex_partition_key
50
37
  complex_partition_key_query("(#{partition_key}) = (?)", value)
51
38
  else
52
- where(current_arel_table[partition_key].eq(value))
39
+ where_partition_key(:eq, value)
53
40
  end
54
41
  end
55
42
 
@@ -61,9 +48,9 @@ module PgParty
61
48
  end_range
62
49
  )
63
50
  else
64
- node = current_arel_table[partition_key]
65
-
66
- where(node.gteq(start_range).and(node.lt(end_range)))
51
+ where_partition_key(:gteq, start_range).merge(
52
+ where_partition_key(:lt, end_range)
53
+ )
67
54
  end
68
55
  end
69
56
 
@@ -76,7 +63,7 @@ module PgParty
76
63
  end
77
64
 
78
65
  def partitions
79
- PgParty::Cache.fetch_partitions(cache_key) do
66
+ PgParty.cache.fetch_partitions(cache_key) do
80
67
  connection.select_values(<<-SQL)
81
68
  SELECT pg_inherits.inhrelid::regclass::text
82
69
  FROM pg_tables
@@ -139,12 +126,32 @@ module PgParty
139
126
  end
140
127
 
141
128
  def complex_partition_key_query(clause, *interpolated_values)
142
- subquery = base_class
143
- .unscoped
129
+ subquery = unscoped
144
130
  .select("*")
145
131
  .where(clause, *interpolated_values)
146
132
 
147
133
  from(subquery, current_alias)
148
134
  end
135
+
136
+ def where_partition_key(meth, values)
137
+ partition_key_array = Array.wrap(partition_key)
138
+ values = Array.wrap(values)
139
+
140
+ if partition_key_array.size != values.size
141
+ raise "number of provided values does not match the number of partition key columns"
142
+ end
143
+
144
+ arel_query = partition_key_array.zip(values).inject(nil) do |obj, (column, value)|
145
+ node = current_arel_table[column].send(meth, value)
146
+
147
+ if obj.nil?
148
+ node
149
+ else
150
+ obj.and(node)
151
+ end
152
+ end
153
+
154
+ where(arel_query)
155
+ end
149
156
  end
150
157
  end
@@ -2,9 +2,10 @@
2
2
 
3
3
  module PgParty
4
4
  class ModelInjector
5
- def initialize(model, key)
5
+ def initialize(model, *key, &blk)
6
6
  @model = model
7
- @key = key
7
+ @key = key.flatten.compact
8
+ @key_blk = blk
8
9
  end
9
10
 
10
11
  def inject_range_methods
@@ -38,11 +39,16 @@ module PgParty
38
39
  instance_predicate: false
39
40
  )
40
41
 
41
- if @key.is_a?(Proc)
42
- @model.partition_key = @key.call
42
+ if @key_blk
43
+ @model.partition_key = @key_blk.call
43
44
  @model.complex_partition_key = true
44
45
  else
45
- @model.partition_key = @key
46
+ if @key.size == 1
47
+ @model.partition_key = @key.first
48
+ else
49
+ @model.partition_key = @key
50
+ end
51
+
46
52
  @model.complex_partition_key = false
47
53
  end
48
54
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PgParty
4
- VERSION = "1.0.0"
4
+ VERSION = "1.3.0"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pg_party
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Krage
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-06-07 00:00:00.000000000 Z
11
+ date: 2020-06-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -16,7 +16,7 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '4.2'
19
+ version: '5.0'
20
20
  - - "<"
21
21
  - !ruby/object:Gem::Version
22
22
  version: '6.1'
@@ -26,52 +26,52 @@ dependencies:
26
26
  requirements:
27
27
  - - ">="
28
28
  - !ruby/object:Gem::Version
29
- version: '4.2'
29
+ version: '5.0'
30
30
  - - "<"
31
31
  - !ruby/object:Gem::Version
32
32
  version: '6.1'
33
33
  - !ruby/object:Gem::Dependency
34
- name: appraisal
34
+ name: ruby2_keywords
35
35
  requirement: !ruby/object:Gem::Requirement
36
36
  requirements:
37
37
  - - "~>"
38
38
  - !ruby/object:Gem::Version
39
- version: '2.2'
40
- type: :development
39
+ version: 0.0.2
40
+ type: :runtime
41
41
  prerelease: false
42
42
  version_requirements: !ruby/object:Gem::Requirement
43
43
  requirements:
44
44
  - - "~>"
45
45
  - !ruby/object:Gem::Version
46
- version: '2.2'
46
+ version: 0.0.2
47
47
  - !ruby/object:Gem::Dependency
48
- name: bundler
48
+ name: appraisal
49
49
  requirement: !ruby/object:Gem::Requirement
50
50
  requirements:
51
51
  - - "~>"
52
52
  - !ruby/object:Gem::Version
53
- version: '1.15'
53
+ version: '2.2'
54
54
  type: :development
55
55
  prerelease: false
56
56
  version_requirements: !ruby/object:Gem::Requirement
57
57
  requirements:
58
58
  - - "~>"
59
59
  - !ruby/object:Gem::Version
60
- version: '1.15'
60
+ version: '2.2'
61
61
  - !ruby/object:Gem::Dependency
62
62
  name: byebug
63
63
  requirement: !ruby/object:Gem::Requirement
64
64
  requirements:
65
65
  - - "~>"
66
66
  - !ruby/object:Gem::Version
67
- version: '10.0'
67
+ version: '11.0'
68
68
  type: :development
69
69
  prerelease: false
70
70
  version_requirements: !ruby/object:Gem::Requirement
71
71
  requirements:
72
72
  - - "~>"
73
73
  - !ruby/object:Gem::Version
74
- version: '10.0'
74
+ version: '11.0'
75
75
  - !ruby/object:Gem::Dependency
76
76
  name: combustion
77
77
  requirement: !ruby/object:Gem::Requirement
@@ -92,112 +92,118 @@ dependencies:
92
92
  requirements:
93
93
  - - "~>"
94
94
  - !ruby/object:Gem::Version
95
- version: '1.6'
95
+ version: '1.7'
96
96
  type: :development
97
97
  prerelease: false
98
98
  version_requirements: !ruby/object:Gem::Requirement
99
99
  requirements:
100
100
  - - "~>"
101
101
  - !ruby/object:Gem::Version
102
- version: '1.6'
102
+ version: '1.7'
103
103
  - !ruby/object:Gem::Dependency
104
104
  name: nokogiri
105
105
  requirement: !ruby/object:Gem::Requirement
106
106
  requirements:
107
- - - "~>"
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: 1.10.4
110
+ - - "<"
108
111
  - !ruby/object:Gem::Version
109
- version: 1.9.1
112
+ version: '2.0'
110
113
  type: :development
111
114
  prerelease: false
112
115
  version_requirements: !ruby/object:Gem::Requirement
113
116
  requirements:
114
- - - "~>"
117
+ - - ">="
118
+ - !ruby/object:Gem::Version
119
+ version: 1.10.4
120
+ - - "<"
115
121
  - !ruby/object:Gem::Version
116
- version: 1.9.1
122
+ version: '2.0'
117
123
  - !ruby/object:Gem::Dependency
118
124
  name: pry-byebug
119
125
  requirement: !ruby/object:Gem::Requirement
120
126
  requirements:
121
127
  - - "~>"
122
128
  - !ruby/object:Gem::Version
123
- version: '3.4'
129
+ version: '3.7'
124
130
  type: :development
125
131
  prerelease: false
126
132
  version_requirements: !ruby/object:Gem::Requirement
127
133
  requirements:
128
134
  - - "~>"
129
135
  - !ruby/object:Gem::Version
130
- version: '3.4'
136
+ version: '3.7'
131
137
  - !ruby/object:Gem::Dependency
132
138
  name: rake
133
139
  requirement: !ruby/object:Gem::Requirement
134
140
  requirements:
135
141
  - - "~>"
136
142
  - !ruby/object:Gem::Version
137
- version: '12.0'
143
+ version: '12.3'
138
144
  type: :development
139
145
  prerelease: false
140
146
  version_requirements: !ruby/object:Gem::Requirement
141
147
  requirements:
142
148
  - - "~>"
143
149
  - !ruby/object:Gem::Version
144
- version: '12.0'
150
+ version: '12.3'
145
151
  - !ruby/object:Gem::Dependency
146
152
  name: rspec-its
147
153
  requirement: !ruby/object:Gem::Requirement
148
154
  requirements:
149
155
  - - "~>"
150
156
  - !ruby/object:Gem::Version
151
- version: '1.2'
157
+ version: '1.3'
152
158
  type: :development
153
159
  prerelease: false
154
160
  version_requirements: !ruby/object:Gem::Requirement
155
161
  requirements:
156
162
  - - "~>"
157
163
  - !ruby/object:Gem::Version
158
- version: '1.2'
164
+ version: '1.3'
159
165
  - !ruby/object:Gem::Dependency
160
166
  name: rspec-rails
161
167
  requirement: !ruby/object:Gem::Requirement
162
168
  requirements:
163
169
  - - "~>"
164
170
  - !ruby/object:Gem::Version
165
- version: '3.6'
171
+ version: '3.8'
166
172
  type: :development
167
173
  prerelease: false
168
174
  version_requirements: !ruby/object:Gem::Requirement
169
175
  requirements:
170
176
  - - "~>"
171
177
  - !ruby/object:Gem::Version
172
- version: '3.6'
178
+ version: '3.8'
173
179
  - !ruby/object:Gem::Dependency
174
180
  name: rspec_junit_formatter
175
181
  requirement: !ruby/object:Gem::Requirement
176
182
  requirements:
177
183
  - - "~>"
178
184
  - !ruby/object:Gem::Version
179
- version: '0.3'
185
+ version: '0.4'
180
186
  type: :development
181
187
  prerelease: false
182
188
  version_requirements: !ruby/object:Gem::Requirement
183
189
  requirements:
184
190
  - - "~>"
185
191
  - !ruby/object:Gem::Version
186
- version: '0.3'
192
+ version: '0.4'
187
193
  - !ruby/object:Gem::Dependency
188
194
  name: simplecov
189
195
  requirement: !ruby/object:Gem::Requirement
190
196
  requirements:
191
197
  - - "~>"
192
198
  - !ruby/object:Gem::Version
193
- version: '0.15'
199
+ version: 0.17.0
194
200
  type: :development
195
201
  prerelease: false
196
202
  version_requirements: !ruby/object:Gem::Requirement
197
203
  requirements:
198
204
  - - "~>"
199
205
  - !ruby/object:Gem::Version
200
- version: '0.15'
206
+ version: 0.17.0
201
207
  - !ruby/object:Gem::Dependency
202
208
  name: timecop
203
209
  requirement: !ruby/object:Gem::Requirement
@@ -227,7 +233,8 @@ files:
227
233
  - lib/pg_party/adapter/postgresql_methods.rb
228
234
  - lib/pg_party/adapter_decorator.rb
229
235
  - lib/pg_party/cache.rb
230
- - lib/pg_party/hacks/schema_cache.rb
236
+ - lib/pg_party/config.rb
237
+ - lib/pg_party/hacks/postgresql_database_tasks.rb
231
238
  - lib/pg_party/model/list_methods.rb
232
239
  - lib/pg_party/model/methods.rb
233
240
  - lib/pg_party/model/range_methods.rb
@@ -247,14 +254,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
247
254
  requirements:
248
255
  - - ">="
249
256
  - !ruby/object:Gem::Version
250
- version: 2.2.2
257
+ version: 2.5.0
251
258
  required_rubygems_version: !ruby/object:Gem::Requirement
252
259
  requirements:
253
260
  - - ">="
254
261
  - !ruby/object:Gem::Version
255
- version: 1.8.11
262
+ version: '0'
256
263
  requirements: []
257
- rubygems_version: 3.0.3
264
+ rubygems_version: 3.1.4
258
265
  signing_key:
259
266
  specification_version: 4
260
267
  summary: ActiveRecord PostgreSQL Partitioning
@@ -1,13 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module PgParty
4
- module Hacks
5
- module SchemaCache
6
- def self.included(base)
7
- return if base.method_defined?(:data_source_exists?)
8
-
9
- base.send(:alias_method, :data_source_exists?, :table_exists?)
10
- end
11
- end
12
- end
13
- end