chrono_model 2.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
  SHA256:
3
- metadata.gz: e9dc931f360178771e212906ec3a02d1ff49ffc2393b457a7f531b101bc1e8ce
4
- data.tar.gz: 7606b75d5eaf453e0d0f90c760607af50bdf862744f7048cc2c8061f41018bc5
3
+ metadata.gz: 222db0e6673e7171d44dac2163b5048ebf6b459c18fa2a2609a3051fce8c6591
4
+ data.tar.gz: 871fdf28717c85267e6b783f1f2d6ba3a24b1261e974e53a25de28d745bc8579
5
5
  SHA512:
6
- metadata.gz: e64bea647172199e03703f0f4be8538d48276a8cb02fedb2309a68913ed6dad910d01f9ed4498fe345119ff1a12e25a0dda16f2b5976a0cb1b587dc4548eef4a
7
- data.tar.gz: e326f5fce5a0fc94df9e23618840edb6baeaf307e85bbb3449fad7540cd85863be533caca5e30d073fc880a2759ce21ceed74f471dbba4959ead30e9ce43e5b5
6
+ metadata.gz: 0bf942259052f134ea38de898307a65f20a6b448d8e8ff99a09ae06cd751f9834e1eb22abd4498c880005b8fc91f44ecebea4702be8c174570c50027dce13a75
7
+ data.tar.gz: 2b894f82a0cb9687d59dca9c3427a854cf6dc02191a08df71a215dfc577a8d1dd58632d44eb179395f097aa7d2391a7c738968d0f4c68f16cc14fffd2d18e034
data/LICENSE CHANGED
@@ -1,8 +1,8 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2012-2022 Marcello Barnaba <m.barnaba@ifad.org>
4
- Copyright (c) 2012-2022 Peter J. Brindisi <p.brindisi@ifad.org>
5
- Copyright (c) 2012-2022 IFAD
3
+ Copyright (c) 2012-2024 Marcello Barnaba <m.barnaba@ifad.org>
4
+ Copyright (c) 2012-2024 Peter J. Brindisi <p.brindisi@ifad.org>
5
+ Copyright (c) 2012-2024 IFAD
6
6
 
7
7
  Permission is hereby granted, free of charge, to any person obtaining a copy
8
8
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -1,7 +1,6 @@
1
1
  # Temporal database system on PostgreSQL using [updatable views][pg-updatable-views], [table inheritance][pg-table-inheritance] and [INSTEAD OF triggers][pg-instead-of-triggers].
2
2
 
3
3
  [![Build Status][build-status-badge]][build-status]
4
- [![Legacy Build Status][legacy-build-status-badge]][build-status]
5
4
  [![Code Climate][code-analysis-badge]][code-analysis]
6
5
  [![Test Coverage][test-coverage-badge]][test-coverage]
7
6
  [![Gem Version][gem-version-badge]][gem-version]
@@ -63,9 +62,9 @@ All timestamps are _forcibly_ stored in as UTC, bypassing the
63
62
 
64
63
  ## Requirements
65
64
 
66
- * Ruby >= 2.2.2
67
- * Active Record >= 5.0. See the [detailed supported versions matrix on Ruby GitHub Actions workflows](https://github.com/ifad/chronomodel/blob/master/.github/workflows)
68
- * PostgreSQL >= 9.4 (legacy support for 9.3)
65
+ * Ruby >= 3.0
66
+ * Active Record >= 7.0. See the [detailed supported versions matrix on Ruby GitHub Actions workflows](https://github.com/ifad/chronomodel/blob/master/.github/workflows)
67
+ * PostgreSQL >= 9.4
69
68
  * The `btree_gist` PostgreSQL extension
70
69
 
71
70
  With Homebrew:
@@ -318,29 +317,17 @@ only against ActiveRecord by using
318
317
 
319
318
  Ensure to run the full test suite before pushing.
320
319
 
321
- ## Usage with JSON (*not* JSONB) columns
322
-
323
- **DEPRECATED**: Please migrate to JSONB. It has an equality operator built-in,
324
- it's faster and stricter, and offers many more indexing abilities and better
325
- performance than JSON. It is going to be desupported soon because PostgreSQL 10
326
- does not support these anymore.
327
-
328
- The [JSON][pg-json-type] does not provide an [equality operator][pg-json-func].
329
- As both unnecessary update suppression and selective journaling require
330
- comparing the OLD and NEW rows fields, this fails by default.
331
-
332
- ChronoModel provides a naive and heavyweight JSON equality operator using
333
- [pl/python][pg-json-opclass] and associated Postgres objects.
334
-
335
- To set up you can use
336
-
337
- ```ruby
338
- require 'chrono_model/json'
339
- ChronoModel::Json.create
340
- ```
341
-
342
320
  ## Caveats
343
321
 
322
+ * Considering the nature of modern applications, it's crucial to understand
323
+ that the database time does not necessarily align with the application time
324
+ due to the delay introduced by communication between the application and
325
+ the database server. Consequently, there is no assurance that the application
326
+ time will always be less than the database time. Therefore, relying solely
327
+ on `created_at` and `updated_at` fields as timestamps to determine the state
328
+ of an object at a specific point in time within the application could
329
+ lead to inaccuracies.
330
+
344
331
  * Rails 4+ support requires disabling tsrange parsing support, as it
345
332
  [is broken][r4-tsrange-broken] and [incomplete][r4-tsrange-incomplete]
346
333
  as of now, mainly due to a [design clash with ruby][pg-tsrange-and-ruby].
@@ -371,6 +358,9 @@ ChronoModel::Json.create
371
358
  * Different historical objects are considered the identical. [See issue
372
359
  #206][gh-issue-206]
373
360
 
361
+ * Use with caution when implementing inline editing features, as Chronomodel
362
+ creates a new record for each modification. This will lead to increased
363
+ storage requirements and bloated history
374
364
 
375
365
  ## Contributing
376
366
 
@@ -402,7 +392,6 @@ This software is Made in Italy :it: :smile:.
402
392
  [docs-analysis-badge]: https://inch-ci.org/github/ifad/chronomodel.svg?branch=master
403
393
  [gem-version]: https://rubygems.org/gems/chrono_model
404
394
  [gem-version-badge]: https://badge.fury.io/rb/chrono_model.svg
405
- [legacy-build-status-badge]: https://github.com/ifad/chronomodel/actions/workflows/legacy_ruby.yml/badge.svg
406
395
  [test-coverage]: https://codeclimate.com/github/ifad/chronomodel
407
396
  [test-coverage-badge]: https://codeclimate.com/github/ifad/chronomodel/badges/coverage.svg
408
397
 
@@ -16,9 +16,7 @@ module ActiveRecord
16
16
  def chronomodel_connection(config) # :nodoc:
17
17
  return chronomodel_adapter_class.new(config) if ActiveRecord::VERSION::STRING >= '7.1'
18
18
 
19
- conn_params = config.symbolize_keys
20
-
21
- conn_params.delete_if { |_, v| v.nil? }
19
+ conn_params = config.symbolize_keys.compact
22
20
 
23
21
  # Map ActiveRecords param names to PGs.
24
22
  conn_params[:user] = conn_params.delete(:username) if conn_params[:username]
@@ -28,7 +26,7 @@ module ActiveRecord
28
26
  valid_conn_param_keys = PG::Connection.conndefaults_hash.keys + [:requiressl]
29
27
  conn_params.slice!(*valid_conn_param_keys)
30
28
 
31
- conn = PG.connect(conn_params) if ActiveRecord::VERSION::MAJOR >= 6
29
+ conn = PG.connect(conn_params)
32
30
 
33
31
  adapter = ChronoModel::Adapter.new(conn, logger, conn_params, config)
34
32
 
@@ -40,10 +38,6 @@ module ActiveRecord
40
38
  adapter.chrono_setup!
41
39
 
42
40
  adapter
43
- rescue ::PG::Error => e
44
- raise ActiveRecord::NoDatabaseError if e.message.include?(conn_params[:dbname])
45
-
46
- raise
47
41
  end
48
42
  end
49
43
  end
@@ -24,8 +24,6 @@ module ActiveRecord
24
24
  filename = arguments.first
25
25
  sql = File.read(filename).gsub(/CREATE SCHEMA (?!IF NOT EXISTS)/, '\&IF NOT EXISTS ')
26
26
  File.open(filename, 'w') { |file| file << sql }
27
-
28
- remove_sql_header_comments(filename) if ActiveRecord::VERSION::STRING < '5.1'
29
27
  end
30
28
 
31
29
  def data_dump(target)
@@ -48,15 +46,8 @@ module ActiveRecord
48
46
 
49
47
  private
50
48
 
51
- # In Rails 6.1.x the configuration instance variable is not available
52
- # and it's been replaced by @configuration_hash (which is frozen).
53
49
  def chronomodel_configuration
54
- @chronomodel_configuration ||=
55
- if defined?(@configuration_hash)
56
- @configuration_hash
57
- else
58
- configuration.with_indifferent_access
59
- end
50
+ @chronomodel_configuration ||= @configuration_hash
60
51
  end
61
52
 
62
53
  # If a schema search path is defined in the configuration file, it will
@@ -77,46 +68,15 @@ module ActiveRecord
77
68
 
78
69
  chronomodel_schema_search_path = "#{schema_search_path},#{CHRONOMODEL_SCHEMAS.join(',')}"
79
70
 
80
- if defined?(@configuration_hash)
81
- @configuration_hash = @configuration_hash.dup
82
- @configuration_hash[:schema_search_path] = chronomodel_schema_search_path
83
- @configuration_hash.freeze
84
- else
85
- configuration['schema_search_path'] = chronomodel_schema_search_path
86
- end
71
+ @configuration_hash = @configuration_hash.dup
72
+ @configuration_hash[:schema_search_path] = chronomodel_schema_search_path
73
+ @configuration_hash.freeze
87
74
  end
88
75
 
89
76
  def reset_configuration!
90
- if defined?(@configuration_hash)
91
- @configuration_hash = @configuration_hash.dup
92
- @configuration_hash[:schema_search_path] = @original_schema_search_path
93
- @configuration_hash.freeze
94
- else
95
- configuration['schema_search_path'] = @original_schema_search_path
96
- end
97
- end
98
-
99
- unless private_instance_methods.include?(:remove_sql_header_comments)
100
- def remove_sql_header_comments(filename)
101
- sql_comment_begin = '--'
102
- removing_comments = true
103
- tempfile = Tempfile.open('uncommented_structure.sql')
104
- begin
105
- File.foreach(filename) do |line|
106
- unless removing_comments && (line.start_with?(sql_comment_begin) || line.blank?)
107
- tempfile << line
108
- removing_comments = false
109
- end
110
- end
111
- ensure
112
- tempfile.close
113
- end
114
- FileUtils.mv(tempfile.path, filename)
115
- end
116
- end
117
-
118
- unless private_instance_methods.include?(:psql_env)
119
- alias psql_env set_psql_env
77
+ @configuration_hash = @configuration_hash.dup
78
+ @configuration_hash[:schema_search_path] = @original_schema_search_path
79
+ @configuration_hash.freeze
120
80
  end
121
81
 
122
82
  def schema_search_path
@@ -82,7 +82,7 @@ module ChronoModel
82
82
  # allow setting the PK to a specific value (think migration scenario).
83
83
  #
84
84
  def chrono_create_INSERT_trigger(table, pk, current, history, fields, values)
85
- execute <<-SQL.strip_heredoc # rubocop:disable Rails/SquishedSQLHeredocs
85
+ execute <<-SQL.strip_heredoc # rubocop:disable Rails/SquishedSQLHeredocs,Rails/StripHeredoc
86
86
  CREATE OR REPLACE FUNCTION chronomodel_#{table}_insert() RETURNS TRIGGER AS $$
87
87
  BEGIN
88
88
  #{insert_sequence_sql(pk, current)} INTO #{current} ( #{pk}, #{fields} )
@@ -135,7 +135,7 @@ module ChronoModel
135
135
 
136
136
  journal &= columns
137
137
 
138
- execute <<-SQL.strip_heredoc # rubocop:disable Rails/SquishedSQLHeredocs
138
+ execute <<-SQL.strip_heredoc # rubocop:disable Rails/SquishedSQLHeredocs,Rails/StripHeredoc
139
139
  CREATE OR REPLACE FUNCTION chronomodel_#{table}_update() RETURNS TRIGGER AS $$
140
140
  DECLARE _now timestamp;
141
141
  DECLARE _hid integer;
@@ -189,7 +189,7 @@ module ChronoModel
189
189
  # DELETEd in the same transaction.
190
190
  #
191
191
  def chrono_create_DELETE_trigger(table, pk, current, history)
192
- execute <<-SQL.strip_heredoc # rubocop:disable Rails/SquishedSQLHeredocs
192
+ execute <<-SQL.strip_heredoc # rubocop:disable Rails/SquishedSQLHeredocs,Rails/StripHeredoc
193
193
  CREATE OR REPLACE FUNCTION chronomodel_#{table}_delete() RETURNS TRIGGER AS $$
194
194
  DECLARE _now timestamp;
195
195
  BEGIN
@@ -3,12 +3,7 @@
3
3
  require 'active_record/connection_adapters/postgresql_adapter'
4
4
 
5
5
  require 'chrono_model/adapter/migrations'
6
-
7
- if ActiveRecord::VERSION::STRING >= '6.1'
8
- require 'chrono_model/adapter/migrations_modules/stable'
9
- else
10
- require 'chrono_model/adapter/migrations_modules/legacy'
11
- end
6
+ require 'chrono_model/adapter/migrations_modules/stable'
12
7
 
13
8
  require 'chrono_model/adapter/ddl'
14
9
  require 'chrono_model/adapter/indexes'
@@ -4,7 +4,7 @@ module ChronoModel
4
4
  module Conversions
5
5
  module_function
6
6
 
7
- ISO_DATETIME = /\A(\d{4})-(\d\d)-(\d\d) (\d\d):(\d\d):(\d\d)(?:\.(\d+))?\z/.freeze
7
+ ISO_DATETIME = /\A(\d{4})-(\d\d)-(\d\d) (\d\d):(\d\d):(\d\d)(?:\.(\d+))?\z/
8
8
 
9
9
  # rubocop:disable Style/PerlBackrefs
10
10
  def string_to_utc_time(string)
@@ -20,7 +20,7 @@ module ChronoModel
20
20
  # rubocop:enable Style/PerlBackrefs
21
21
 
22
22
  def time_to_utc_string(time)
23
- time.to_formatted_s(:db) << '.' << format('%06d', time.usec)
23
+ time.to_fs(:db) << '.' << format('%06d', time.usec)
24
24
  end
25
25
  end
26
26
  end
@@ -2,8 +2,4 @@
2
2
 
3
3
  require 'chrono_model/patches/db_console'
4
4
 
5
- if Rails.version < '6.1'
6
- Rails::DBConsole.prepend ChronoModel::Patches::DBConsole::Config
7
- else
8
- Rails::DBConsole.prepend ChronoModel::Patches::DBConsole::DbConfig
9
- end
5
+ Rails::DBConsole.prepend ChronoModel::Patches::DBConsole::DbConfig
@@ -4,16 +4,6 @@ module ChronoModel
4
4
  module Patches
5
5
  # This class is a dummy relation whose scope is only to pass around the
6
6
  # as_of_time parameters across ActiveRecord call chains.
7
- #
8
- # With AR 5.2 a simple relation can be used, as the only required argument
9
- # is the model. 5.0 and 5.1 require more arguments, that are passed here.
10
- #
11
- class AsOfTimeRelation < ActiveRecord::Relation
12
- if ActiveRecord::VERSION::STRING.to_f < 5.2
13
- def initialize(klass, table: klass.arel_table, predicate_builder: klass.predicate_builder, values: {})
14
- super(klass, table, predicate_builder, values)
15
- end
16
- end
17
- end
7
+ class AsOfTimeRelation < ActiveRecord::Relation; end
18
8
  end
19
9
  end
@@ -3,14 +3,10 @@
3
3
  module ChronoModel
4
4
  module Patches
5
5
  module Batches
6
- module BatchEnumerator
7
- def each(&block)
8
- if @relation.try(:history?)
9
- @relation.with_hid_pkey { super }
10
- else
11
- super
12
- end
13
- end
6
+ def in_batches(**)
7
+ return super unless try(:history?)
8
+
9
+ with_hid_pkey { super }
14
10
  end
15
11
  end
16
12
  end
@@ -5,17 +5,15 @@ module ChronoModel
5
5
  module Relation
6
6
  include ChronoModel::Patches::AsOfTimeHolder
7
7
 
8
- if ActiveRecord::Associations::Preloader.instance_methods.include?(:call)
9
- def preload_associations(records) # :nodoc:
10
- preload = preload_values
11
- preload += includes_values unless eager_loading?
12
- scope = StrictLoadingScope if strict_loading_value
13
-
14
- preload.each do |associations|
15
- ActiveRecord::Associations::Preloader.new(
16
- records: records, associations: associations, scope: scope, model: model, as_of_time: as_of_time
17
- ).call
18
- end
8
+ def preload_associations(records) # :nodoc:
9
+ preload = preload_values
10
+ preload += includes_values unless eager_loading?
11
+ scope = StrictLoadingScope if strict_loading_value
12
+
13
+ preload.each do |associations|
14
+ ActiveRecord::Associations::Preloader.new(
15
+ records: records, associations: associations, scope: scope, model: model, as_of_time: as_of_time
16
+ ).call
19
17
  end
20
18
  end
21
19
 
@@ -7,30 +7,11 @@ module ChronoModel
7
7
  TASKS_CLASS = ActiveRecord::Tasks::ChronomodelDatabaseTasks
8
8
 
9
9
  # Register our database tasks under our adapter name
10
- if Rails.version < '5.2'
11
- ActiveRecord::Tasks::DatabaseTasks.register_task(/chronomodel/, TASKS_CLASS)
12
- else
13
- ActiveRecord::Tasks::DatabaseTasks.register_task(/chronomodel/, TASKS_CLASS.to_s)
14
- end
10
+ ActiveRecord::Tasks::DatabaseTasks.register_task(/chronomodel/, TASKS_CLASS.to_s)
15
11
 
16
12
  rake_tasks do
17
13
  def task_config
18
- if Rails.version < '6.1'
19
- ActiveRecord::Tasks::DatabaseTasks.current_config.with_indifferent_access
20
- else
21
- ActiveRecord::Base.connection_db_config
22
- end
23
- end
24
-
25
- if Rails.version < '6.1'
26
- # Make schema:dump and schema:load invoke structure:dump and structure:load
27
- Rake::Task['db:schema:dump'].clear.enhance(['environment']) do
28
- Rake::Task['db:structure:dump'].invoke
29
- end
30
-
31
- Rake::Task['db:schema:load'].clear.enhance(['environment']) do
32
- Rake::Task['db:structure:load'].invoke
33
- end
14
+ ActiveRecord::Base.connection_db_config
34
15
  end
35
16
 
36
17
  desc 'Dumps database into db/data.NOW.sql or file specified via DUMP='
@@ -59,7 +59,7 @@ module ChronoModel
59
59
  relation = relation.from("public.#{quoted_table_name}") unless chrono?
60
60
  relation = relation.where(id: rid) if rid
61
61
 
62
- sql = "SELECT ts FROM ( #{relation.to_sql} ) AS foo WHERE ts IS NOT NULL".dup
62
+ sql = +"SELECT ts FROM ( #{relation.to_sql} ) AS foo WHERE ts IS NOT NULL"
63
63
 
64
64
  if options.key?(:before)
65
65
  sql << " AND ts < '#{Conversions.time_to_utc_string(options[:before])}'"
@@ -22,37 +22,28 @@ module ChronoModel
22
22
  ChronoModel.history_models[table_name] = history
23
23
 
24
24
  class << self
25
- if Rails.version >= '7.0'
26
- def subclasses(with_history: false)
27
- subclasses = super()
28
- subclasses.reject!(&:history?) unless with_history
29
- subclasses
30
- end
31
-
32
- def subclasses_with_history
33
- subclasses(with_history: true)
34
- end
25
+ def subclasses(with_history: false)
26
+ subclasses = super()
27
+ subclasses.reject!(&:history?) unless with_history
28
+ subclasses
29
+ end
35
30
 
36
- # `direct_descendants` is deprecated method in 7.0 and has been
37
- # removed in 7.1
38
- if method_defined?(:direct_descendants)
39
- alias_method :direct_descendants_with_history, :subclasses_with_history
40
- alias_method :direct_descendants, :subclasses
41
- end
31
+ def subclasses_with_history
32
+ subclasses(with_history: true)
33
+ end
42
34
 
43
- # Ruby 3.1 has a native subclasses method and descendants is
44
- # implemented with recursion of subclasses
45
- if Class.method_defined?(:subclasses)
46
- def descendants_with_history
47
- subclasses_with_history.concat(subclasses.flat_map(&:descendants_with_history))
48
- end
49
- end
50
- else
51
- alias_method :descendants_with_history, :descendants
35
+ # `direct_descendants` is deprecated method in 7.0 and has been
36
+ # removed in 7.1
37
+ if method_defined?(:direct_descendants)
38
+ alias_method :direct_descendants_with_history, :subclasses_with_history
39
+ alias_method :direct_descendants, :subclasses
40
+ end
52
41
 
53
- alias_method :direct_descendants_with_history, :direct_descendants
54
- def direct_descendants
55
- direct_descendants_with_history.reject(&:history?)
42
+ # Ruby 3.1 has a native subclasses method and descendants is
43
+ # implemented with recursion of subclasses
44
+ if Class.method_defined?(:subclasses)
45
+ def descendants_with_history
46
+ subclasses_with_history.concat(subclasses.flat_map(&:descendants_with_history))
56
47
  end
57
48
  end
58
49
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ChronoModel
4
- VERSION = '2.0.0'
4
+ VERSION = '3.0.1'
5
5
  end
data/lib/chrono_model.rb CHANGED
@@ -33,7 +33,7 @@ module ChronoModel
33
33
  # Computed upon inclusion of the +TimeMachine+ module.
34
34
  #
35
35
  def self.history_models
36
- @_history_models ||= {}
36
+ @history_models ||= {}
37
37
  end
38
38
  end
39
39
 
@@ -56,7 +56,7 @@ ActiveSupport.on_load :active_record do
56
56
 
57
57
  ActiveRecord::Associations::Preloader::ThroughAssociation.prepend ChronoModel::Patches::Preloader::ThroughAssociation
58
58
 
59
- ActiveRecord::Batches::BatchEnumerator.prepend ChronoModel::Patches::Batches::BatchEnumerator
59
+ ActiveRecord::Batches.prepend ChronoModel::Patches::Batches
60
60
  end
61
61
 
62
62
  ActiveSupport.on_load :after_initialize do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chrono_model
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 3.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Marcello Barnaba
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2024-01-09 00:00:00.000000000 Z
12
+ date: 2024-02-26 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activerecord
@@ -17,14 +17,14 @@ dependencies:
17
17
  requirements:
18
18
  - - ">="
19
19
  - !ruby/object:Gem::Version
20
- version: '5.0'
20
+ version: '7.0'
21
21
  type: :runtime
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
25
  - - ">="
26
26
  - !ruby/object:Gem::Version
27
- version: '5.0'
27
+ version: '7.0'
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: multi_json
30
30
  requirement: !ruby/object:Gem::Requirement
@@ -41,152 +41,12 @@ dependencies:
41
41
  version: '0'
42
42
  - !ruby/object:Gem::Dependency
43
43
  name: pg
44
- requirement: !ruby/object:Gem::Requirement
45
- requirements:
46
- - - ">"
47
- - !ruby/object:Gem::Version
48
- version: '1.1'
49
- type: :runtime
50
- prerelease: false
51
- version_requirements: !ruby/object:Gem::Requirement
52
- requirements:
53
- - - ">"
54
- - !ruby/object:Gem::Version
55
- version: '1.1'
56
- - !ruby/object:Gem::Dependency
57
- name: aruba
58
- requirement: !ruby/object:Gem::Requirement
59
- requirements:
60
- - - ">="
61
- - !ruby/object:Gem::Version
62
- version: '0'
63
- type: :development
64
- prerelease: false
65
- version_requirements: !ruby/object:Gem::Requirement
66
- requirements:
67
- - - ">="
68
- - !ruby/object:Gem::Version
69
- version: '0'
70
- - !ruby/object:Gem::Dependency
71
- name: bundler
72
- requirement: !ruby/object:Gem::Requirement
73
- requirements:
74
- - - ">="
75
- - !ruby/object:Gem::Version
76
- version: '0'
77
- type: :development
78
- prerelease: false
79
- version_requirements: !ruby/object:Gem::Requirement
80
- requirements:
81
- - - ">="
82
- - !ruby/object:Gem::Version
83
- version: '0'
84
- - !ruby/object:Gem::Dependency
85
- name: byebug
86
- requirement: !ruby/object:Gem::Requirement
87
- requirements:
88
- - - ">="
89
- - !ruby/object:Gem::Version
90
- version: '0'
91
- type: :development
92
- prerelease: false
93
- version_requirements: !ruby/object:Gem::Requirement
94
- requirements:
95
- - - ">="
96
- - !ruby/object:Gem::Version
97
- version: '0'
98
- - !ruby/object:Gem::Dependency
99
- name: fuubar
100
- requirement: !ruby/object:Gem::Requirement
101
- requirements:
102
- - - ">="
103
- - !ruby/object:Gem::Version
104
- version: '0'
105
- type: :development
106
- prerelease: false
107
- version_requirements: !ruby/object:Gem::Requirement
108
- requirements:
109
- - - ">="
110
- - !ruby/object:Gem::Version
111
- version: '0'
112
- - !ruby/object:Gem::Dependency
113
- name: hirb
114
- requirement: !ruby/object:Gem::Requirement
115
- requirements:
116
- - - ">="
117
- - !ruby/object:Gem::Version
118
- version: '0'
119
- type: :development
120
- prerelease: false
121
- version_requirements: !ruby/object:Gem::Requirement
122
- requirements:
123
- - - ">="
124
- - !ruby/object:Gem::Version
125
- version: '0'
126
- - !ruby/object:Gem::Dependency
127
- name: pry
128
- requirement: !ruby/object:Gem::Requirement
129
- requirements:
130
- - - ">="
131
- - !ruby/object:Gem::Version
132
- version: '0'
133
- type: :development
134
- prerelease: false
135
- version_requirements: !ruby/object:Gem::Requirement
136
- requirements:
137
- - - ">="
138
- - !ruby/object:Gem::Version
139
- version: '0'
140
- - !ruby/object:Gem::Dependency
141
- name: rails
142
44
  requirement: !ruby/object:Gem::Requirement
143
45
  requirements:
144
46
  - - ">="
145
47
  - !ruby/object:Gem::Version
146
48
  version: '0'
147
- type: :development
148
- prerelease: false
149
- version_requirements: !ruby/object:Gem::Requirement
150
- requirements:
151
- - - ">="
152
- - !ruby/object:Gem::Version
153
- version: '0'
154
- - !ruby/object:Gem::Dependency
155
- name: rake
156
- requirement: !ruby/object:Gem::Requirement
157
- requirements:
158
- - - ">="
159
- - !ruby/object:Gem::Version
160
- version: '0'
161
- type: :development
162
- prerelease: false
163
- version_requirements: !ruby/object:Gem::Requirement
164
- requirements:
165
- - - ">="
166
- - !ruby/object:Gem::Version
167
- version: '0'
168
- - !ruby/object:Gem::Dependency
169
- name: rspec
170
- requirement: !ruby/object:Gem::Requirement
171
- requirements:
172
- - - ">="
173
- - !ruby/object:Gem::Version
174
- version: '0'
175
- type: :development
176
- prerelease: false
177
- version_requirements: !ruby/object:Gem::Requirement
178
- requirements:
179
- - - ">="
180
- - !ruby/object:Gem::Version
181
- version: '0'
182
- - !ruby/object:Gem::Dependency
183
- name: simplecov
184
- requirement: !ruby/object:Gem::Requirement
185
- requirements:
186
- - - ">="
187
- - !ruby/object:Gem::Version
188
- version: '0'
189
- type: :development
49
+ type: :runtime
190
50
  prerelease: false
191
51
  version_requirements: !ruby/object:Gem::Requirement
192
52
  requirements:
@@ -211,14 +71,12 @@ files:
211
71
  - lib/chrono_model/adapter/ddl.rb
212
72
  - lib/chrono_model/adapter/indexes.rb
213
73
  - lib/chrono_model/adapter/migrations.rb
214
- - lib/chrono_model/adapter/migrations_modules/legacy.rb
215
74
  - lib/chrono_model/adapter/migrations_modules/stable.rb
216
75
  - lib/chrono_model/adapter/tsrange.rb
217
76
  - lib/chrono_model/adapter/upgrade.rb
218
77
  - lib/chrono_model/chrono.rb
219
78
  - lib/chrono_model/conversions.rb
220
79
  - lib/chrono_model/db_console.rb
221
- - lib/chrono_model/json.rb
222
80
  - lib/chrono_model/patches.rb
223
81
  - lib/chrono_model/patches/as_of_time_holder.rb
224
82
  - lib/chrono_model/patches/as_of_time_relation.rb
@@ -252,14 +110,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
252
110
  requirements:
253
111
  - - ">="
254
112
  - !ruby/object:Gem::Version
255
- version: 2.2.2
113
+ version: '3.0'
256
114
  required_rubygems_version: !ruby/object:Gem::Requirement
257
115
  requirements:
258
116
  - - ">="
259
117
  - !ruby/object:Gem::Version
260
118
  version: '0'
261
119
  requirements: []
262
- rubygems_version: 3.5.3
120
+ rubygems_version: 3.5.5
263
121
  signing_key:
264
122
  specification_version: 4
265
123
  summary: Temporal extensions (SCD Type II) for Active Record
@@ -1,41 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ChronoModel
4
- class Adapter
5
- module MigrationsModules
6
- module Legacy
7
- # If adding an index to a temporal table, add it to the one in the
8
- # temporal schema and to the history one. If the `:unique` option is
9
- # present, it is removed from the index created in the history table.
10
- #
11
- def add_index(table_name, column_name, options = {})
12
- return super unless is_chrono?(table_name)
13
-
14
- transaction do
15
- on_temporal_schema { super }
16
-
17
- # Uniqueness constraints do not make sense in the history table
18
- options = options.dup.tap { |o| o.delete(:unique) } if options[:unique].present?
19
-
20
- on_history_schema { super(table_name, column_name, options) }
21
- end
22
- end
23
-
24
- # If removing an index from a temporal table, remove it both from the
25
- # temporal and the history schemas.
26
- #
27
- def remove_index(table_name, options = {})
28
- return super unless is_chrono?(table_name)
29
-
30
- transaction do
31
- on_temporal_schema { super }
32
-
33
- on_history_schema { super }
34
- end
35
- end
36
- end
37
- end
38
- end
39
- end
40
-
41
- ChronoModel::Adapter::Migrations.include ChronoModel::Adapter::MigrationsModules::Legacy
@@ -1,31 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ChronoModel
4
- module Json
5
- extend self
6
-
7
- def create
8
- ActiveSupport::Deprecation.warn <<-MSG.squish
9
- ChronoModel: JSON ops are deprecated. Please migrate to JSONB.
10
- MSG
11
-
12
- adapter.execute 'CREATE OR REPLACE LANGUAGE plpythonu'
13
- adapter.execute File.read(sql('json_ops.sql'))
14
- end
15
-
16
- def drop
17
- adapter.execute File.read(sql('uninstall-json_ops.sql'))
18
- adapter.execute 'DROP LANGUAGE IF EXISTS plpythonu'
19
- end
20
-
21
- private
22
-
23
- def sql(file)
24
- "#{File.dirname(__FILE__)}/../../sql/#{file}"
25
- end
26
-
27
- def adapter
28
- ActiveRecord::Base.connection
29
- end
30
- end
31
- end