clickhouse-activerecord 0.5.2 → 0.5.8

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: c75ca45e5f91a7d83d79b8583539e66021589fc76c7ce48a68f07f49176a6f5a
4
- data.tar.gz: 282fba24c4ecacdb11e4d358db15ba88beb0457099f3b9efe22d6c873676ead8
3
+ metadata.gz: c8f8d01291f12197d0b5d0b8f791631fe144cdc5d855de9dd9c8498e170fafdf
4
+ data.tar.gz: 2ebd5b6068a179a7c87679db0fe9c34bbe2f9197c6230da9aad1a6935fc9c7d9
5
5
  SHA512:
6
- metadata.gz: 69b20ad39aced0dc3ba4f6883664dabdba45c8c677848010b1dd926e26de36a707839cbc5d806e59f0bc73a786daeee6c3448681313de0f973d93faa16f63a5d
7
- data.tar.gz: cf195bf822304c31f3cd5121f3ca5ea0f5d5fc1b0211862e1cde9ffae32042960ad512a9c10a3a17d146205308aefdfcc09f5de95b07bab952baa9cffab4b60c
6
+ metadata.gz: 94abbef81ff0000ecbc05092dd3558dc90e53223fd0025c5a57549f4b5f98431a01ee9fceee5587887c9fa6fcc3411420e936ad942150caa8edc5146c7db54df
7
+ data.tar.gz: '03871bfe2bec394c9612928229cc3380615acd795b25c058072a3aec62a7852e06711f2811286438ab278c838d4ed65736bd47ae449bc0ca5bbad6763692a927'
data/CHANGELOG.md CHANGED
@@ -1,3 +1,15 @@
1
+ ### Version 0.5.6 (Oct 25, 2021)
2
+
3
+ * Added auto creating service distributed tables and additional options for creating view [@ygreeek](https://github.com/ygreeek)
4
+ * Added default user agent
5
+
6
+ ### Version 0.5.3 (Sep 22, 2021)
7
+
8
+ * Fix replica cluster for a new syntax MergeTree
9
+ * Fix support rails 5.2 on alter table
10
+ * Support array type of column
11
+ * Support Rails 6.1.0 [@bdevel](https://github.com/bdevel)
12
+
1
13
  ### Version 0.4.10 (Mar 10, 2021)
2
14
 
3
15
  * Support ClickHouse 20.9+
data/README.md CHANGED
@@ -196,6 +196,7 @@ false`. The default integer is `UInt32`
196
196
  | UInt32 | 0 to 4,294,967,295 | 3,4 |
197
197
  | UInt64 | 0 to 18446744073709551615 | 5,6,7,8 |
198
198
  | UInt256 | 0 to ... | 8+ |
199
+ | Array | ... | ... |
199
200
 
200
201
  Example:
201
202
 
@@ -26,7 +26,7 @@ Gem::Specification.new do |spec|
26
26
  spec.add_runtime_dependency 'bundler', '>= 1.13.4'
27
27
  spec.add_runtime_dependency 'activerecord', '>= 5.2'
28
28
 
29
- spec.add_development_dependency 'bundler', '~> 1.15'
29
+ spec.add_development_dependency 'bundler', '>= 1.15'
30
30
  spec.add_development_dependency 'rake', '~> 13.0'
31
31
  spec.add_development_dependency 'rspec', '~> 3.4'
32
32
  spec.add_development_dependency 'pry', '~> 0.12'
@@ -0,0 +1,18 @@
1
+ module CoreExtensions
2
+ module ActiveRecord
3
+ module Migration
4
+ module CommandRecorder
5
+ def create_view(*args, &block)
6
+ record(:create_view, args, &block)
7
+ end
8
+
9
+ private
10
+
11
+ def invert_create_view(args)
12
+ view_name, options = args
13
+ [:drop_table, view_name, options]
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -19,9 +19,18 @@ module ActiveRecord
19
19
  end
20
20
 
21
21
  def add_column_options!(sql, options)
22
+ if options[:value]
23
+ sql.gsub!(/\s+(.*)/, " \\1(#{options[:value]})")
24
+ end
25
+ if options[:fixed_string]
26
+ sql.gsub!(/\s+(.*)/, " FixedString(#{options[:fixed_string]})")
27
+ end
22
28
  if options[:null] || options[:null].nil?
23
29
  sql.gsub!(/\s+(.*)/, ' Nullable(\1)')
24
30
  end
31
+ if options[:low_cardinality]
32
+ sql.gsub!(/\s+(.*)/, ' LowCardinality(\1)')
33
+ end
25
34
  if options[:array]
26
35
  sql.gsub!(/\s+(.*)/, ' Array(\1)')
27
36
  end
@@ -46,17 +55,48 @@ module ActiveRecord
46
55
  create_sql
47
56
  end
48
57
 
58
+ def add_as_clause!(create_sql, options)
59
+ return unless options.as
60
+
61
+ assign_database_to_subquery!(options.as) if options.view
62
+ create_sql << " AS #{to_sql(options.as)}"
63
+ end
64
+
65
+ def assign_database_to_subquery!(subquery)
66
+ # If you do not specify a database explicitly, ClickHouse will use the "default" database.
67
+ return unless subquery
68
+
69
+ match = subquery.match(/(?<=from)[^.\w]+(?<database>\w+(?=\.))?(?<table_name>[.\w]+)/i)
70
+ return unless match
71
+ return if match[:database]
72
+
73
+ subquery[match.begin(:table_name)...match.end(:table_name)] =
74
+ "#{current_database}.#{match[:table_name].sub('.', '')}"
75
+ end
76
+
77
+ def add_to_clause!(create_sql, options)
78
+ # If you do not specify a database explicitly, ClickHouse will use the "default" database.
79
+ return unless options.to
80
+
81
+ match = options.to.match(/(?<database>.+(?=\.))?(?<table_name>.+)/i)
82
+ return unless match
83
+ return if match[:database]
84
+
85
+ create_sql << "TO #{current_database}.#{match[:table_name].sub('.', '')}"
86
+ end
87
+
49
88
  def visit_TableDefinition(o)
50
89
  create_sql = +"CREATE#{table_modifier_in_create(o)} #{o.view ? "VIEW" : "TABLE"} "
51
90
  create_sql << "IF NOT EXISTS " if o.if_not_exists
52
91
  create_sql << "#{quote_table_name(o.name)} "
92
+ add_to_clause!(create_sql, o) if o.materialized
53
93
 
54
94
  statements = o.columns.map { |c| accept c }
55
95
  statements << accept(o.primary_keys) if o.primary_keys
56
96
  create_sql << "(#{statements.join(', ')})" if statements.present?
57
- # Attach options for only table or materialized view
58
- add_table_options!(create_sql, o) if !o.view || o.view && o.materialized
59
- create_sql << " AS #{to_sql(o.as)}" if o.as
97
+ # Attach options for only table or materialized view without TO section
98
+ add_table_options!(create_sql, o) if !o.view || o.view && o.materialized && !o.to
99
+ add_as_clause!(create_sql, o)
60
100
  create_sql
61
101
  end
62
102
 
@@ -84,6 +124,9 @@ module ActiveRecord
84
124
  change_column_sql
85
125
  end
86
126
 
127
+ def current_database
128
+ ActiveRecord::Base.connection_db_config.database
129
+ end
87
130
  end
88
131
  end
89
132
  end
@@ -5,7 +5,7 @@ module ActiveRecord
5
5
  module Clickhouse
6
6
  class TableDefinition < ActiveRecord::ConnectionAdapters::TableDefinition
7
7
 
8
- attr_reader :view, :materialized, :if_not_exists
8
+ attr_reader :view, :materialized, :if_not_exists, :to
9
9
 
10
10
  def initialize(
11
11
  conn,
@@ -17,6 +17,7 @@ module ActiveRecord
17
17
  comment: nil,
18
18
  view: false,
19
19
  materialized: false,
20
+ to: nil,
20
21
  **
21
22
  )
22
23
  @conn = conn
@@ -32,6 +33,7 @@ module ActiveRecord
32
33
  @comment = comment
33
34
  @view = view || materialized
34
35
  @materialized = materialized
36
+ @to = to
35
37
  end
36
38
 
37
39
  def integer(*args, **options)
@@ -58,7 +60,39 @@ module ActiveRecord
58
60
  kind = :int256 if options[:limit] > 16
59
61
  end
60
62
  end
61
- args.each { |name| column(name, kind, options.except(:limit, :unsigned)) }
63
+ args.each { |name| column(name, kind, **options.except(:limit, :unsigned)) }
64
+ end
65
+
66
+ def datetime(*args, **options)
67
+ kind = :datetime
68
+
69
+ if options[:precision]
70
+ kind = :datetime64
71
+ options[:value] = options[:precision]
72
+ end
73
+
74
+ args.each { |name| column(name, kind, **options.except(:precision)) }
75
+ end
76
+
77
+ def uuid(*args, **options)
78
+ args.each { |name| column(name, :uuid, **options) }
79
+ end
80
+
81
+ def enum(*args, **options)
82
+ kind = :enum8
83
+
84
+ unless options[:value].is_a? Hash
85
+ raise ArgumentError, "Column #{args.first}: option 'value' must be Hash, got: #{options[:value].class}"
86
+ end
87
+
88
+ options[:value] = options[:value].each_with_object([]) { |(k, v), arr| arr.push("'#{k}' = #{v}") }.join(', ')
89
+
90
+ if options[:limit]
91
+ kind = :enum8 if options[:limit] == 1
92
+ kind = :enum16 if options[:limit] == 2
93
+ end
94
+
95
+ args.each { |name| column(name, kind, **options.except(:limit)) }
62
96
  end
63
97
  end
64
98
  end
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'clickhouse-activerecord/version'
4
+
3
5
  module ActiveRecord
4
6
  module ConnectionAdapters
5
7
  module Clickhouse
@@ -37,7 +39,7 @@ module ActiveRecord
37
39
  end
38
40
 
39
41
  def tables(name = nil)
40
- result = do_system_execute('SHOW TABLES', name)
42
+ result = do_system_execute("SHOW TABLES WHERE name NOT LIKE '.inner_id.%'", name)
41
43
  return [] if result.nil?
42
44
  result['data'].flatten
43
45
  end
@@ -58,7 +60,7 @@ module ActiveRecord
58
60
 
59
61
  def do_system_execute(sql, name = nil)
60
62
  log_with_debug(sql, "#{adapter_name} #{name}") do
61
- res = @connection.post("/?#{@config.to_param}", "#{sql} FORMAT JSONCompact")
63
+ res = @connection.post("/?#{@config.to_param}", "#{sql} FORMAT JSONCompact", 'User-Agent' => "Clickhouse ActiveRecord #{ClickhouseActiverecord::VERSION}")
62
64
 
63
65
  process_response(res)
64
66
  end
@@ -68,7 +70,7 @@ module ActiveRecord
68
70
  log(sql, "#{adapter_name} #{name}") do
69
71
  formatted_sql = apply_format(sql, format)
70
72
  request_params = @config || {}
71
- res = @connection.post("/?#{request_params.merge(settings).to_param}", formatted_sql)
73
+ res = @connection.post("/?#{request_params.merge(settings).to_param}", formatted_sql, 'User-Agent' => "Clickhouse ActiveRecord #{ClickhouseActiverecord::VERSION}")
72
74
 
73
75
  process_response(res)
74
76
  end
@@ -46,20 +46,18 @@ module ActiveRecord
46
46
  end
47
47
  end
48
48
 
49
- class Relation
50
-
51
- # Replace for only ClickhouseAdapter
49
+ module ClickhouseRelationReverseOrder
52
50
  def reverse_order!
53
- orders = order_values.uniq
54
- orders.reject!(&:blank?)
55
- if self.connection.is_a?(ConnectionAdapters::ClickhouseAdapter) && orders.empty? && !primary_key
56
- self.order_values = %w(date created_at).select {|c| column_names.include?(c) }.map{|c| arel_attribute(c).desc }
57
- else
58
- self.order_values = reverse_sql_order(orders)
59
- end
51
+ return super unless connection.is_a?(ConnectionAdapters::ClickhouseAdapter)
52
+
53
+ orders = order_values.uniq.compact_blank
54
+ return super unless orders.empty? && !primary_key
55
+
56
+ self.order_values = %w(date created_at).select {|c| column_names.include?(c) }.map{|c| arel_attribute(c).desc }
60
57
  self
61
58
  end
62
59
  end
60
+ Relation.prepend(ClickhouseRelationReverseOrder)
63
61
 
64
62
  module TypeCaster
65
63
  class Map
@@ -82,13 +80,19 @@ module ActiveRecord
82
80
  def is_view=(value)
83
81
  @is_view = value
84
82
  end
83
+ end
84
+ end
85
85
 
86
- def arel_table # :nodoc:
87
- @arel_table ||= ClickhouseActiverecord::Arel::Table.new(table_name, type_caster: type_caster)
88
- end
89
-
86
+ ActiveRecord::Core::ClassMethods.module_eval do
87
+ def arel_table
88
+ @arel_table ||=
89
+ if self.connection.is_a?(ConnectionAdapters::ClickhouseAdapter)
90
+ ClickhouseActiverecord::Arel::Table.new(table_name, type_caster: type_caster)
91
+ else
92
+ Arel::Table.new(table_name, klass: self)
93
+ end
90
94
  end
91
- end
95
+ end
92
96
 
93
97
  module ConnectionAdapters
94
98
  class ClickhouseColumn < Column
@@ -104,8 +108,13 @@ module ActiveRecord
104
108
  float: { name: 'Float32' },
105
109
  decimal: { name: 'Decimal' },
106
110
  datetime: { name: 'DateTime' },
111
+ datetime64: { name: 'DateTime64' },
107
112
  date: { name: 'Date' },
108
113
  boolean: { name: 'UInt8' },
114
+ uuid: { name: 'UUID' },
115
+
116
+ enum8: { name: 'Enum8' },
117
+ enum16: { name: 'Enum16' },
109
118
 
110
119
  int8: { name: 'Int8' },
111
120
  int16: { name: 'Int16' },
@@ -182,6 +191,20 @@ module ActiveRecord
182
191
  end
183
192
  end
184
193
 
194
+ # `extract_scale` and `extract_precision` are the same as in the Rails abstract base class,
195
+ # except this permits a space after the comma
196
+
197
+ def extract_scale(sql_type)
198
+ case sql_type
199
+ when /\((\d+)\)/ then 0
200
+ when /\((\d+)(,\s?(\d+))\)/ then $3.to_i
201
+ end
202
+ end
203
+
204
+ def extract_precision(sql_type)
205
+ $1.to_i if sql_type =~ /\((\d+)(,\s?\d+)?\)/
206
+ end
207
+
185
208
  def initialize_type_map(m) # :nodoc:
186
209
  super
187
210
  register_class_with_limit m, %r(String), Type::String
@@ -262,7 +285,7 @@ module ActiveRecord
262
285
  def create_view(table_name, **options)
263
286
  options.merge!(view: true)
264
287
  options = apply_replica(table_name, options)
265
- td = create_table_definition(apply_cluster(table_name), options)
288
+ td = create_table_definition(apply_cluster(table_name), **options)
266
289
  yield td if block_given?
267
290
 
268
291
  if options[:force]
@@ -272,16 +295,26 @@ module ActiveRecord
272
295
  execute schema_creation.accept td
273
296
  end
274
297
 
275
- def create_table(table_name, **options)
298
+ def create_table(table_name, **options, &block)
276
299
  options = apply_replica(table_name, options)
277
- td = create_table_definition(apply_cluster(table_name), options)
278
- yield td if block_given?
300
+ td = create_table_definition(apply_cluster(table_name), **options)
301
+ block.call td if block_given?
279
302
 
280
303
  if options[:force]
281
304
  drop_table(table_name, options.merge(if_exists: true))
282
305
  end
283
306
 
284
307
  execute schema_creation.accept td
308
+
309
+ if options[:with_distributed]
310
+ distributed_table_name = options.delete(:with_distributed)
311
+ sharding_key = options.delete(:sharding_key) || 'rand()'
312
+ raise 'Set a cluster' unless cluster
313
+
314
+ distributed_options =
315
+ "Distributed(#{cluster}, #{@config[:database]}, #{table_name}, #{sharding_key})"
316
+ create_table(distributed_table_name, **options.merge(options: distributed_options), &block)
317
+ end
285
318
  end
286
319
 
287
320
  # Drops a ClickHouse database.
@@ -299,6 +332,11 @@ module ActiveRecord
299
332
 
300
333
  def drop_table(table_name, options = {}) # :nodoc:
301
334
  do_execute apply_cluster "DROP TABLE#{' IF EXISTS' if options[:if_exists]} #{quote_table_name(table_name)}"
335
+
336
+ if options[:with_distributed]
337
+ distributed_table_name = options.delete(:with_distributed)
338
+ drop_table(distributed_table_name, **options)
339
+ end
302
340
  end
303
341
 
304
342
  def change_column(table_name, column_name, type, options = {})
@@ -324,10 +362,24 @@ module ActiveRecord
324
362
  @full_config[:replica_name]
325
363
  end
326
364
 
365
+ def use_default_replicated_merge_tree_params?
366
+ database_engine_atomic? && @full_config[:use_default_replicated_merge_tree_params]
367
+ end
368
+
369
+ def use_replica?
370
+ (replica || use_default_replicated_merge_tree_params?) && cluster
371
+ end
372
+
327
373
  def replica_path(table)
328
374
  "/clickhouse/tables/#{cluster}/#{@config[:database]}.#{table}"
329
375
  end
330
376
 
377
+ def database_engine_atomic?
378
+ current_database_engine = "select engine from system.databases where name = '#{@config[:database]}'"
379
+ res = ActiveRecord::Base.connection.select_one(current_database_engine)
380
+ res['engine'] == 'Atomic' if res
381
+ end
382
+
331
383
  def apply_cluster(sql)
332
384
  cluster ? "#{sql} ON CLUSTER #{cluster}" : sql
333
385
  end
@@ -370,14 +422,26 @@ module ActiveRecord
370
422
  end
371
423
 
372
424
  def apply_replica(table, options)
373
- if replica && cluster && options[:options]
374
- match = options[:options].match(/^(.*?MergeTree)\(([^\)]*)\)(.*?)$/)
375
- if match
376
- options[:options] = "Replicated#{match[1]}(#{([replica_path(table), replica].map{|v| "'#{v}'"} + [match[2].presence]).compact.join(', ')})#{match[3]}"
425
+ if use_replica? && options[:options]
426
+ if options[:options].match(/^Replicated/)
427
+ raise 'Do not try create Replicated table. It will be configured based on the *MergeTree engine.'
377
428
  end
429
+
430
+ options[:options] = configure_replica(table, options[:options])
378
431
  end
379
432
  options
380
433
  end
434
+
435
+ def configure_replica(table, options)
436
+ match = options.match(/^(.*?MergeTree)(?:\(([^\)]*)\))?((?:.|\n)*)/)
437
+ return options unless match
438
+
439
+ if replica
440
+ engine_params = ([replica_path(table), replica].map { |v| "'#{v}'" } + [match[2].presence]).compact.join(', ')
441
+ end
442
+
443
+ "Replicated#{match[1]}(#{engine_params})#{match[3]}"
444
+ end
381
445
  end
382
446
  end
383
447
  end
@@ -6,14 +6,24 @@ module ClickhouseActiverecord
6
6
  class << self
7
7
 
8
8
  def create_table
9
- unless table_exists?
10
- version_options = connection.internal_string_options_for_primary_key
11
-
12
- connection.create_table(table_name, id: false, options: 'ReplacingMergeTree(ver) PARTITION BY version ORDER BY (version)', if_not_exists: true) do |t|
13
- t.string :version, **version_options
14
- t.column :active, 'Int8', null: false, default: '1'
15
- t.datetime :ver, null: false, default: -> { 'now()' }
16
- end
9
+ return if table_exists?
10
+
11
+ version_options = connection.internal_string_options_for_primary_key
12
+ table_options = {
13
+ id: false, options: 'ReplacingMergeTree(ver) PARTITION BY version ORDER BY (version)', if_not_exists: true
14
+ }
15
+ full_config = connection.instance_variable_get(:@full_config) || {}
16
+
17
+ if full_config[:distributed_service_tables]
18
+ table_options.merge!(with_distributed: table_name, sharding_key: 'cityHash64(version)')
19
+
20
+ distributed_suffix = "_#{full_config[:distributed_service_tables_suffix] || 'distributed'}"
21
+ end
22
+
23
+ connection.create_table(table_name + distributed_suffix.to_s, **table_options) do |t|
24
+ t.string :version, **version_options
25
+ t.column :active, 'Int8', null: false, default: '1'
26
+ t.datetime :ver, null: false, default: -> { 'now()' }
17
27
  end
18
28
  end
19
29
 
@@ -26,14 +36,26 @@ module ClickhouseActiverecord
26
36
  class InternalMetadata < ::ActiveRecord::InternalMetadata
27
37
  class << self
28
38
  def create_table
29
- unless table_exists?
30
- key_options = connection.internal_string_options_for_primary_key
31
-
32
- connection.create_table(table_name, id: false, options: connection.adapter_name.downcase == 'clickhouse' ? 'MergeTree() PARTITION BY toDate(created_at) ORDER BY (created_at)' : '', if_not_exists: true) do |t|
33
- t.string :key, key_options
34
- t.string :value
35
- t.timestamps
36
- end
39
+ return if table_exists?
40
+
41
+ key_options = connection.internal_string_options_for_primary_key
42
+ table_options = {
43
+ id: false,
44
+ options: connection.adapter_name.downcase == 'clickhouse' ? 'MergeTree() PARTITION BY toDate(created_at) ORDER BY (created_at)' : '',
45
+ if_not_exists: true
46
+ }
47
+ full_config = connection.instance_variable_get(:@full_config) || {}
48
+
49
+ if full_config[:distributed_service_tables]
50
+ table_options.merge!(with_distributed: table_name, sharding_key: 'cityHash64(created_at)')
51
+
52
+ distributed_suffix = "_#{full_config[:distributed_service_tables_suffix] || 'distributed'}"
53
+ end
54
+
55
+ connection.create_table(table_name + distributed_suffix.to_s, **table_options) do |t|
56
+ t.string :key, **key_options
57
+ t.string :value
58
+ t.timestamps
37
59
  end
38
60
  end
39
61
  end
@@ -47,6 +69,16 @@ module ClickhouseActiverecord
47
69
  @schema_migration = schema_migration
48
70
  end
49
71
 
72
+ def up(target_version = nil)
73
+ selected_migrations = if block_given?
74
+ migrations.select { |m| yield m }
75
+ else
76
+ migrations
77
+ end
78
+
79
+ ClickhouseActiverecord::Migrator.new(:up, selected_migrations, schema_migration, target_version).migrate
80
+ end
81
+
50
82
  def down(target_version = nil)
51
83
  selected_migrations = if block_given?
52
84
  migrations.select { |m| yield m }
@@ -14,7 +14,7 @@ module ClickhouseActiverecord
14
14
  connection.create_database @configuration["database"]
15
15
  rescue ActiveRecord::StatementInvalid => e
16
16
  if e.cause.to_s.include?('already exists')
17
- raise ActiveRecord::Tasks::DatabaseAlreadyExists
17
+ raise ActiveRecord::DatabaseAlreadyExists
18
18
  else
19
19
  raise
20
20
  end
@@ -43,7 +43,15 @@ module ClickhouseActiverecord
43
43
  end
44
44
 
45
45
  def structure_load(*args)
46
- File.read(args.first).split(";\n\n").each { |sql| connection.execute(sql) }
46
+ File.read(args.first).split(";\n\n").each do |sql|
47
+ if sql.gsub(/[a-z]/i, '').blank?
48
+ next
49
+ elsif sql =~ /^INSERT INTO/
50
+ connection.do_execute(sql, nil, format: nil)
51
+ else
52
+ connection.execute(sql)
53
+ end
54
+ end
47
55
  end
48
56
 
49
57
  def migrate
@@ -1,3 +1,3 @@
1
1
  module ClickhouseActiverecord
2
- VERSION = '0.5.2'
2
+ VERSION = '0.5.8'
3
3
  end
@@ -2,6 +2,9 @@
2
2
 
3
3
  require 'active_record/connection_adapters/clickhouse_adapter'
4
4
 
5
+ require_relative '../core_extensions/active_record/migration/command_recorder'
6
+ ActiveRecord::Migration::CommandRecorder.include CoreExtensions::ActiveRecord::Migration::CommandRecorder
7
+
5
8
  if defined?(Rails::Railtie)
6
9
  require 'clickhouse-activerecord/railtie'
7
10
  require 'clickhouse-activerecord/schema'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: clickhouse-activerecord
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.2
4
+ version: 0.5.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sergey Odintsov
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-08-04 00:00:00.000000000 Z
11
+ date: 2022-05-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -42,14 +42,14 @@ dependencies:
42
42
  name: bundler
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: '1.15'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '1.15'
55
55
  - !ruby/object:Gem::Dependency
@@ -112,6 +112,7 @@ files:
112
112
  - bin/console
113
113
  - bin/setup
114
114
  - clickhouse-activerecord.gemspec
115
+ - core_extensions/active_record/migration/command_recorder.rb
115
116
  - lib/active_record/connection_adapters/clickhouse/oid/array.rb
116
117
  - lib/active_record/connection_adapters/clickhouse/oid/big_integer.rb
117
118
  - lib/active_record/connection_adapters/clickhouse/oid/date.rb
@@ -135,7 +136,7 @@ homepage: https://github.com/pnixx/clickhouse-activerecord
135
136
  licenses:
136
137
  - MIT
137
138
  metadata: {}
138
- post_install_message:
139
+ post_install_message:
139
140
  rdoc_options: []
140
141
  require_paths:
141
142
  - lib
@@ -150,8 +151,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
150
151
  - !ruby/object:Gem::Version
151
152
  version: '0'
152
153
  requirements: []
153
- rubygems_version: 3.0.4
154
- signing_key:
154
+ rubygems_version: 3.0.3
155
+ signing_key:
155
156
  specification_version: 4
156
157
  summary: ClickHouse ActiveRecord
157
158
  test_files: []