timescaledb-rails 0.0.1 → 0.1.1

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: ff972c0e2773b5032e350089f1f7c75c6975aa619db5c7b8b99350c5f9250347
4
- data.tar.gz: 2b799232bb7927e2c73dd35d2c54b90c23b1a86f424d282593512269988d06c4
3
+ metadata.gz: 9c8d3c2c06646deb35ad9d586965b9e4147504559734212b3f95168cb9db9e53
4
+ data.tar.gz: 6754f263db1dd6dcf3fad150de76bc6eb6cdc72958c68187fab4ee087d2b825f
5
5
  SHA512:
6
- metadata.gz: 1e0229939288334ef8a612f16fd5f721b24fcba54340093ab9fa65ae538effd2a864294c3f3b6cf9f08ebc3db95fffe26b7f355503639630f7db48a15a57b942
7
- data.tar.gz: 04d6a4d2fd560a53ecbe45ed3a20fba0d901971b10b0a7af80b61ec9dc80c0ae2c2adf1715f4e484edaf15da3a7aaf213343e716368f5d278093e66fdb5d7ae5
6
+ metadata.gz: 806178772e4b1138ccce2b8e99ef8196e12b31023c339ba2383919c4f0eb199ce6d2f9af592411dd59c3c07a2dcc1a946a6bff8d926091d296693ba78af442b7
7
+ data.tar.gz: e92a57a816dee7069f65c9b68bb578b3bcef4670ae3f87e63f47420b26af2c9cc27cf011e49cece36c33ab9fd3f8deb0ce68794023f4a17f479672572716d4d4
data/README.md CHANGED
@@ -1,2 +1,77 @@
1
- # timescaledb-rails
2
- Ruby on Rails helpers for TimescaleDB
1
+ # TimescaleDB extension for Rails [![Actions Status](https://github.com/crunchloop/timescaledb-rails/workflows/CI/badge.svg?branch=main)](https://github.com/crunchloop/timescaledb-rails/actions?query=workflow%3ACI)
2
+
3
+ `timescaledb-rails` extends ActiveRecord PostgreSQL adapter and provides features from [`TimescaleDB`](https://www.timescale.com). It provides support for hypertables and other features added by TimescaleDB PostgreSQL extension.
4
+
5
+
6
+ ## Installation
7
+
8
+ Install `timescaledb-rails` from RubyGems:
9
+
10
+ ``` sh
11
+ $ gem install timescaledb-rails
12
+ ```
13
+
14
+ Or include it in your project's `Gemfile` with Bundler:
15
+
16
+ ``` ruby
17
+ gem 'timescaledb-rails', '~> 0.1'
18
+ ```
19
+
20
+ ## Examples
21
+
22
+ Create a hypertable from a PostgreSQL table by doing:
23
+
24
+ ```ruby
25
+ class CreateEvent < ActiveRecord::Migration[7.0]
26
+ def change
27
+ create_table :events, id: false do |t|
28
+ t.string :name, null: false
29
+ t.time :occured_at, null: false
30
+
31
+ t.timestamps
32
+ end
33
+
34
+ create_hypertable :events, :created_at, chunk_time_interval: '2 days'
35
+ end
36
+ end
37
+ ```
38
+
39
+ Create a hypertable without a PostgreSQL table by doing:
40
+
41
+ ```ruby
42
+ class CreatePayloadHypertable < ActiveRecord::Migration[7.0]
43
+ def change
44
+ create_hypertable :payloads, :created_at, chunk_time_interval: '5 days' do |t|
45
+ t.string :ip, null: false
46
+
47
+ t.timestamps
48
+ end
49
+ end
50
+ end
51
+ ```
52
+
53
+ Enable hypertable compression by doing:
54
+
55
+ ```ruby
56
+ class AddEventCompression < ActiveRecord::Migration[7.0]
57
+ def change
58
+ add_hypertable_compression :events, 20.days, segment_by: :name, order_by: 'occured_at DESC'
59
+ end
60
+ end
61
+ ```
62
+
63
+ ## Supported Ruby/Rails versions
64
+
65
+ Supported Ruby/Rails versions are listed in [`.github/workflows/ci.yaml`](https://github.com/crunchloop/timescaledb-rails/blob/main/.github/workflows/ci.yaml)
66
+
67
+ ## License
68
+
69
+ Released under the MIT License. See the [LICENSE][] file for further details.
70
+
71
+ [license]: LICENSE
72
+
73
+ ## About Crunchloop
74
+
75
+ ![crunchloop](https://crunchloop.io/logo-blue.png)
76
+
77
+ `timescaledb-rails` is supported with :heart: by [Crunchloop](https://crunchloop.io). We strongly believe in giving back :rocket:. Let's work together [`Get in touch`](https://crunchloop.io/contact).
@@ -0,0 +1,77 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'active_record/tasks/postgresql_database_tasks'
4
+ require 'timescaledb/rails/orderby_compression'
5
+
6
+ module Timescaledb
7
+ module Rails
8
+ module ActiveRecord
9
+ # :nodoc:
10
+ module DatabaseTasks
11
+ def structure_dump(filename, extra_flags)
12
+ super
13
+
14
+ return unless timescale_enabled?
15
+
16
+ File.open(filename, 'a') do |file|
17
+ Timescaledb::Rails::Hypertable.all.each do |hypertable|
18
+ drop_ts_insert_trigger_statment(hypertable, file)
19
+ create_hypertable_statement(hypertable, file)
20
+ add_hypertable_compression_statement(hypertable, file)
21
+ end
22
+ end
23
+ end
24
+
25
+ def drop_ts_insert_trigger_statment(hypertable, file)
26
+ file << "---\n"
27
+ file << "--- Drop ts_insert_blocker previously created by pg_dump to avoid pg errors, create_hypertable will re-create it again.\n" # rubocop:disable Layout/LineLength
28
+ file << "---\n\n"
29
+ file << "DROP TRIGGER IF EXISTS ts_insert_blocker ON #{hypertable.hypertable_name};\n"
30
+ end
31
+
32
+ def create_hypertable_statement(hypertable, file)
33
+ options = hypertable_options(hypertable)
34
+
35
+ file << "SELECT create_hypertable('#{hypertable.hypertable_name}', '#{hypertable.time_column_name}', #{options});\n\n" # rubocop:disable Layout/LineLength
36
+ end
37
+
38
+ def add_hypertable_compression_statement(hypertable, file)
39
+ return unless hypertable.compression?
40
+
41
+ options = hypertable_compression_options(hypertable)
42
+
43
+ file << "ALTER TABLE #{hypertable.hypertable_name} SET (#{options});\n\n"
44
+ file << "SELECT add_compression_policy('#{hypertable.hypertable_name}', INTERVAL '#{hypertable.compression_policy_interval}');\n\n" # rubocop:disable Layout/LineLength
45
+ end
46
+
47
+ def hypertable_options(hypertable)
48
+ sql_statements = ["if_not_exists => 'TRUE'"]
49
+ sql_statements << "chunk_time_interval => INTERVAL '#{hypertable.chunk_time_interval.inspect}'"
50
+
51
+ sql_statements.compact.join(', ')
52
+ end
53
+
54
+ def hypertable_compression_options(hypertable)
55
+ segmentby_setting = hypertable.compression_settings.segmentby_setting.first
56
+ orderby_setting = hypertable.compression_settings.orderby_setting.first
57
+
58
+ sql_statements = ['timescaledb.compress']
59
+ sql_statements << "timescaledb.compress_segmentby = '#{segmentby_setting.attname}'" if segmentby_setting
60
+
61
+ if orderby_setting
62
+ orderby = Timescaledb::Rails::OrderbyCompression.new(orderby_setting.attname,
63
+ orderby_setting.orderby_asc).to_s
64
+
65
+ sql_statements << "timescaledb.compress_orderby = '#{orderby}'"
66
+ end
67
+
68
+ sql_statements.join(', ')
69
+ end
70
+
71
+ def timescale_enabled?
72
+ Timescaledb::Rails::Hypertable.table_exists?
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,83 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'active_record/connection_adapters/postgresql_adapter'
4
+ require 'timescaledb/rails/orderby_compression'
5
+
6
+ module Timescaledb
7
+ module Rails
8
+ module ActiveRecord
9
+ # :nodoc:
10
+ module SchemaDumper
11
+ def table(table, stream)
12
+ super(table, stream)
13
+
14
+ return unless timescale_enabled?
15
+ return if (hypertable = Timescaledb::Rails::Hypertable.find_by(hypertable_name: table)).nil?
16
+
17
+ hypertable(hypertable, stream)
18
+ hypertable_compression(hypertable, stream)
19
+ end
20
+
21
+ private
22
+
23
+ def hypertable(hypertable, stream)
24
+ options = [hypertable.hypertable_name.inspect, hypertable.time_column_name.inspect]
25
+ options |= hypertable_options(hypertable)
26
+
27
+ stream.puts " create_hypertable #{options.join(', ')}"
28
+ stream.puts
29
+ end
30
+
31
+ def hypertable_compression(hypertable, stream)
32
+ return unless hypertable.compression?
33
+
34
+ options = [hypertable.hypertable_name.inspect, hypertable.compression_policy_interval.inspect]
35
+ options |= hypertable_compression_options(hypertable)
36
+
37
+ stream.puts " add_hypertable_compression #{options.join(', ')}"
38
+ stream.puts
39
+ end
40
+
41
+ def hypertable_options(hypertable)
42
+ options = {
43
+ chunk_time_interval: hypertable.chunk_time_interval
44
+ }
45
+
46
+ options.each_with_object([]) do |(key, value), memo|
47
+ memo << "#{key}: #{format_hypertable_option_value(value)}"
48
+ memo
49
+ end
50
+ end
51
+
52
+ def hypertable_compression_options(hypertable)
53
+ segmentby_setting = hypertable.compression_settings.segmentby_setting.first
54
+ orderby_setting = hypertable.compression_settings.orderby_setting.first
55
+
56
+ [].tap do |result|
57
+ result << "segment_by: #{segmentby_setting.attname.inspect}" if segmentby_setting
58
+
59
+ if orderby_setting
60
+ orderby = Timescaledb::Rails::OrderbyCompression.new(orderby_setting.attname,
61
+ orderby_setting.orderby_asc).to_s
62
+
63
+ result << "order_by: #{orderby.inspect}"
64
+ end
65
+ end
66
+ end
67
+
68
+ def format_hypertable_option_value(value)
69
+ case value
70
+ when String then value.inspect
71
+ when ActiveSupport::Duration then value.inspect.inspect
72
+ else
73
+ value
74
+ end
75
+ end
76
+
77
+ def timescale_enabled?
78
+ Timescaledb::Rails::Hypertable.table_exists?
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'active_record/connection_adapters/postgresql_adapter'
4
+
5
+ module Timescaledb
6
+ module Rails
7
+ module ActiveRecord
8
+ # :nodoc:
9
+ module SchemaStatements
10
+ # Converts given standard PG table into a hypertable.
11
+ #
12
+ # create_hypertable('readings', 'created_at', chunk_time_interval: '7 days')
13
+ #
14
+ def create_hypertable(table_name, time_column_name, **options, &block)
15
+ options = options.symbolize_keys
16
+ options_as_sql = hypertable_options_to_sql(options)
17
+
18
+ if block
19
+ primary_key = options[:primary_key]
20
+ force = options[:force]
21
+
22
+ create_table(table_name, id: false, primary_key: primary_key, force: force, **options, &block)
23
+ end
24
+
25
+ execute "SELECT create_hypertable('#{table_name}', '#{time_column_name}', #{options_as_sql})"
26
+ end
27
+
28
+ # Enables compression and sets compression options.
29
+ #
30
+ # add_hypertable_compression('events', 7.days, segment_by: :created_at, order_by: :name)
31
+ #
32
+ def add_hypertable_compression(table_name, compress_after, segment_by: nil, order_by: nil)
33
+ compress_after = compress_after.inspect if compress_after.is_a?(ActiveSupport::Duration)
34
+
35
+ options = ['timescaledb.compress']
36
+ options << "timescaledb.compress_orderby = '#{order_by}'" unless order_by.nil?
37
+ options << "timescaledb.compress_segmentby = '#{segment_by}'" unless segment_by.nil?
38
+
39
+ execute "ALTER TABLE #{table_name} SET (#{options.join(', ')})"
40
+
41
+ execute "SELECT add_compression_policy('#{table_name}', INTERVAL '#{compress_after}')"
42
+ end
43
+
44
+ def hypertable_options_to_sql(options)
45
+ sql_statements = options.map do |option, value|
46
+ case option
47
+ when :chunk_time_interval then "chunk_time_interval => INTERVAL '#{value}'"
48
+ when :if_not_exists then "if_not_exists => #{value ? 'TRUE' : 'FALSE'}"
49
+ end
50
+ end
51
+
52
+ sql_statements.compact.join(', ')
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Timescaledb
4
+ module Rails
5
+ # :nodoc:
6
+ class CompressionSetting < ::ActiveRecord::Base
7
+ self.table_name = 'timescaledb_information.compression_settings'
8
+ self.primary_key = 'hypertable_name'
9
+
10
+ scope :segmentby_setting, -> { where.not(segmentby_column_index: nil).order(:segmentby_column_index) }
11
+ scope :orderby_setting, -> { where.not(orderby_column_index: nil).order(:orderby_column_index) }
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Timescaledb
4
+ module Rails
5
+ # :nodoc:
6
+ class Dimension < ::ActiveRecord::Base
7
+ TIME_TYPE = 'Time'
8
+
9
+ self.table_name = 'timescaledb_information.dimensions'
10
+
11
+ attribute :time_interval, :interval if ::Rails.version.to_i >= 7
12
+
13
+ scope :time, -> { where(dimension_type: TIME_TYPE) }
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Timescaledb
4
+ module Rails
5
+ # :nodoc:
6
+ class Hypertable < ::ActiveRecord::Base
7
+ self.table_name = 'timescaledb_information.hypertables'
8
+ self.primary_key = 'hypertable_name'
9
+
10
+ has_many :compression_settings, foreign_key: 'hypertable_name',
11
+ class_name: 'Timescaledb::Rails::CompressionSetting'
12
+ has_many :dimensions, foreign_key: 'hypertable_name', class_name: 'Timescaledb::Rails::Dimension'
13
+ has_many :jobs, foreign_key: 'hypertable_name', class_name: 'Timescaledb::Rails::Job'
14
+
15
+ # @return [String]
16
+ def time_column_name
17
+ time_dimension.column_name
18
+ end
19
+
20
+ # @return [String]
21
+ def chunk_time_interval
22
+ time_dimension.time_interval
23
+ end
24
+
25
+ # @return [String]
26
+ def compression_policy_interval
27
+ ActiveSupport::Duration.parse(compression_job.config['compress_after']).inspect
28
+ rescue ActiveSupport::Duration::ISO8601Parser::ParsingError
29
+ compression_job.config['compress_after']
30
+ end
31
+
32
+ # @return [Boolean]
33
+ def compression?
34
+ compression_job.present?
35
+ end
36
+
37
+ private
38
+
39
+ # @return [Job]
40
+ def compression_job
41
+ @compression_job ||= jobs.policy_compression.first
42
+ end
43
+
44
+ # @return [Dimension]
45
+ def time_dimension
46
+ @time_dimension ||= dimensions.time.first
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Timescaledb
4
+ module Rails
5
+ # :nodoc:
6
+ class Job < ::ActiveRecord::Base
7
+ self.table_name = 'timescaledb_information.jobs'
8
+ self.primary_key = 'hypertable_name'
9
+
10
+ POLICY_COMPRESSION = 'policy_compression'
11
+
12
+ scope :policy_compression, -> { where(proc_name: POLICY_COMPRESSION) }
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative './models/compression_setting'
4
+ require_relative './models/dimension'
5
+ require_relative './models/job'
6
+ require_relative './models/hypertable'
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Timescaledb
4
+ module Rails
5
+ # :nodoc:
6
+ class OrderbyCompression
7
+ # @param [String] column_name.
8
+ # @param [Boolean] orderby_asc.
9
+ def initialize(column_name, orderby_asc)
10
+ @column_name = column_name
11
+ @orderby_asc = orderby_asc
12
+ end
13
+
14
+ # @return [String]
15
+ def to_s
16
+ [@column_name, (@orderby_asc ? 'ASC' : 'DESC')].join(' ')
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails'
4
+
5
+ require_relative 'extensions/active_record/database_tasks'
6
+ require_relative 'extensions/active_record/schema_dumper'
7
+ require_relative 'extensions/active_record/schema_statements'
8
+
9
+ module Timescaledb
10
+ module Rails
11
+ # :nodoc:
12
+ class Railtie < ::Rails::Railtie
13
+ initializer 'timescaledb-rails.require_timescale_models' do
14
+ ActiveSupport.on_load(:active_record) do
15
+ require 'timescaledb/rails/models'
16
+ end
17
+ end
18
+
19
+ initializer 'timescaledb-rails.add_timescale_support_to_active_record' do
20
+ ActiveSupport.on_load(:active_record) do
21
+ ::ActiveRecord::Tasks::PostgreSQLDatabaseTasks.prepend(
22
+ Timescaledb::Rails::ActiveRecord::DatabaseTasks
23
+ )
24
+
25
+ ::ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.prepend(
26
+ Timescaledb::Rails::ActiveRecord::SchemaStatements
27
+ )
28
+
29
+ ::ActiveRecord::ConnectionAdapters::PostgreSQL::SchemaDumper.prepend(
30
+ Timescaledb::Rails::ActiveRecord::SchemaDumper
31
+ )
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -1,5 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Timescaledb
4
+ # :nodoc:
2
5
  module Rails
3
- VERSION = '0.0.1'
6
+ VERSION = '0.1.1'
4
7
  end
5
8
  end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Timescaledb
4
+ # :nodoc:
5
+ module Rails
6
+ end
7
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'timescaledb/rails/version'
4
+ require_relative 'timescaledb/rails/railtie'
5
+
6
+ require_relative 'timescaledb/rails'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: timescaledb-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Iván Etchart
@@ -9,8 +9,106 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2022-10-27 00:00:00.000000000 Z
13
- dependencies: []
12
+ date: 2022-11-22 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rails
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ">="
19
+ - !ruby/object:Gem::Version
20
+ version: '6.0'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ version: '6.0'
28
+ - !ruby/object:Gem::Dependency
29
+ name: pg
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - "~>"
33
+ - !ruby/object:Gem::Version
34
+ version: '1.2'
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: '1.2'
42
+ - !ruby/object:Gem::Dependency
43
+ name: rspec
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - "~>"
47
+ - !ruby/object:Gem::Version
48
+ version: '3.12'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "~>"
54
+ - !ruby/object:Gem::Version
55
+ version: '3.12'
56
+ - !ruby/object:Gem::Dependency
57
+ name: rubocop
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - "~>"
61
+ - !ruby/object:Gem::Version
62
+ version: '1.39'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '1.39'
70
+ - !ruby/object:Gem::Dependency
71
+ name: rubocop-performance
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - "~>"
75
+ - !ruby/object:Gem::Version
76
+ version: '1.15'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - "~>"
82
+ - !ruby/object:Gem::Version
83
+ version: '1.15'
84
+ - !ruby/object:Gem::Dependency
85
+ name: rubocop-rails
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - "~>"
89
+ - !ruby/object:Gem::Version
90
+ version: '2.17'
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - "~>"
96
+ - !ruby/object:Gem::Version
97
+ version: '2.17'
98
+ - !ruby/object:Gem::Dependency
99
+ name: rubocop-rspec
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - "~>"
103
+ - !ruby/object:Gem::Version
104
+ version: '2.15'
105
+ type: :development
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - "~>"
110
+ - !ruby/object:Gem::Version
111
+ version: '2.15'
14
112
  description:
15
113
  email: oss@crunchloop.io
16
114
  executables: []
@@ -19,11 +117,24 @@ extra_rdoc_files: []
19
117
  files:
20
118
  - LICENSE
21
119
  - README.md
120
+ - lib/timescaledb-rails.rb
121
+ - lib/timescaledb/rails.rb
122
+ - lib/timescaledb/rails/extensions/active_record/database_tasks.rb
123
+ - lib/timescaledb/rails/extensions/active_record/schema_dumper.rb
124
+ - lib/timescaledb/rails/extensions/active_record/schema_statements.rb
125
+ - lib/timescaledb/rails/models.rb
126
+ - lib/timescaledb/rails/models/compression_setting.rb
127
+ - lib/timescaledb/rails/models/dimension.rb
128
+ - lib/timescaledb/rails/models/hypertable.rb
129
+ - lib/timescaledb/rails/models/job.rb
130
+ - lib/timescaledb/rails/orderby_compression.rb
131
+ - lib/timescaledb/rails/railtie.rb
22
132
  - lib/timescaledb/rails/version.rb
23
133
  homepage: http://github.com/crunchloop/timescaledb-rails
24
134
  licenses:
25
135
  - MIT
26
- metadata: {}
136
+ metadata:
137
+ rubygems_mfa_required: 'true'
27
138
  post_install_message:
28
139
  rdoc_options: []
29
140
  require_paths:
@@ -32,14 +143,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
32
143
  requirements:
33
144
  - - ">="
34
145
  - !ruby/object:Gem::Version
35
- version: '2.5'
146
+ version: '2.6'
36
147
  required_rubygems_version: !ruby/object:Gem::Requirement
37
148
  requirements:
38
149
  - - ">="
39
150
  - !ruby/object:Gem::Version
40
151
  version: '0'
41
152
  requirements: []
42
- rubygems_version: 3.0.3.1
153
+ rubygems_version: 3.3.26
43
154
  signing_key:
44
155
  specification_version: 4
45
156
  summary: TimescaleDB Rails integration