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 +4 -4
- data/README.md +77 -2
- data/lib/timescaledb/rails/extensions/active_record/database_tasks.rb +77 -0
- data/lib/timescaledb/rails/extensions/active_record/schema_dumper.rb +83 -0
- data/lib/timescaledb/rails/extensions/active_record/schema_statements.rb +57 -0
- data/lib/timescaledb/rails/models/compression_setting.rb +14 -0
- data/lib/timescaledb/rails/models/dimension.rb +16 -0
- data/lib/timescaledb/rails/models/hypertable.rb +50 -0
- data/lib/timescaledb/rails/models/job.rb +15 -0
- data/lib/timescaledb/rails/models.rb +6 -0
- data/lib/timescaledb/rails/orderby_compression.rb +20 -0
- data/lib/timescaledb/rails/railtie.rb +36 -0
- data/lib/timescaledb/rails/version.rb +4 -1
- data/lib/timescaledb/rails.rb +7 -0
- data/lib/timescaledb-rails.rb +6 -0
- metadata +117 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9c8d3c2c06646deb35ad9d586965b9e4147504559734212b3f95168cb9db9e53
|
4
|
+
data.tar.gz: 6754f263db1dd6dcf3fad150de76bc6eb6cdc72958c68187fab4ee087d2b825f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 806178772e4b1138ccce2b8e99ef8196e12b31023c339ba2383919c4f0eb199ce6d2f9af592411dd59c3c07a2dcc1a946a6bff8d926091d296693ba78af442b7
|
7
|
+
data.tar.gz: e92a57a816dee7069f65c9b68bb578b3bcef4670ae3f87e63f47420b26af2c9cc27cf011e49cece36c33ab9fd3f8deb0ce68794023f4a17f479672572716d4d4
|
data/README.md
CHANGED
@@ -1,2 +1,77 @@
|
|
1
|
-
# timescaledb-rails
|
2
|
-
|
1
|
+
# TimescaleDB extension for Rails [](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
|
+

|
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,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
|
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.
|
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-
|
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.
|
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.
|
153
|
+
rubygems_version: 3.3.26
|
43
154
|
signing_key:
|
44
155
|
specification_version: 4
|
45
156
|
summary: TimescaleDB Rails integration
|