click_house 1.3.0 → 1.3.5

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: 73a7b3a1d277214b437bf34712185e436d372a6396d0e388a446e3f29c61ac0e
4
- data.tar.gz: 42869ca836d053d80299126149dc88266da4a0b31ce96837fc02348d60dc0394
3
+ metadata.gz: fd545a5ce410be500540a02ef1f46e57b9a7a2dfe2df8b5be47022ac2cd1f5b4
4
+ data.tar.gz: 19b872a4901d7543ddf7fbb23ca53ac8f6731023b74ae5af24a52aac4b054fc3
5
5
  SHA512:
6
- metadata.gz: 5e308c6f52fc984e3532453a869603d727620d3db61533ff80307caa06c481a5dec29685c38fb46527dea94e9d3577ee5c8918af79aa85bd8697ae7a22063b26
7
- data.tar.gz: 9dc3e6b31f65c6b3cee80aaa657fe924face07474d256714da34d4287128a26563a463e7b14019564895d4d6821b5b2aaf7324418530fd8c548d629522f15008
6
+ metadata.gz: 6ad04e10ecb7acce32f3c18225b62aad8b83ef79f46e176678bbaadf0b274e8b0cefbe72c678e7ba9d047a22d98912a4de2e89b73957b721731e3666caf3850c
7
+ data.tar.gz: 0155f69f8faf71b9fbf95a1d32f04dce4c3eb2a9b43752aac786ee29a3f0db882afd85c1e44178e366938a18053f99eead8d247267d53a49f6dffd63ac0223f5
@@ -0,0 +1,68 @@
1
+ name: CI
2
+
3
+ on: [push, pull_request]
4
+
5
+ jobs:
6
+ rspec:
7
+ runs-on: ubuntu-latest
8
+
9
+ services:
10
+ clickhouse:
11
+ image: yandex/clickhouse-server:20.11.4.13
12
+ ports:
13
+ - 8123:8123
14
+
15
+ strategy:
16
+ matrix:
17
+ ruby-version: [2.7, 2.6, 2.5]
18
+
19
+ steps:
20
+ - uses: actions/checkout@v2
21
+
22
+ - name: Set up Ruby ${{ matrix.ruby-version }}
23
+ uses: ruby/setup-ruby@v1
24
+ with:
25
+ ruby-version: ${{ matrix.ruby-version }}
26
+
27
+ - name: Cache gems
28
+ uses: actions/cache@v1
29
+ with:
30
+ path: vendor/bundle
31
+ key: ${{ runner.os }}-${{ matrix.ruby-version }}-bundler-${{ hashFiles('**/Gemfile.lock') }}
32
+ restore-keys: |
33
+ ${{ runner.os }}-${{ matrix.ruby-version }}-bundler-
34
+
35
+ - name: Install gems
36
+ run: |
37
+ bundle config path vendor/bundle
38
+ bundle install --jobs 4 --retry 3
39
+
40
+ - name: Run tests
41
+ run: bundle exec rspec
42
+
43
+ rubocop:
44
+ runs-on: ubuntu-latest
45
+
46
+ steps:
47
+ - uses: actions/checkout@v2
48
+
49
+ - name: Set up Ruby 2.7
50
+ uses: ruby/setup-ruby@v1
51
+ with:
52
+ ruby-version: 2.7
53
+
54
+ - name: Cache gems
55
+ uses: actions/cache@v1
56
+ with:
57
+ path: vendor/bundle
58
+ key: ${{ runner.os }}-bundler-${{ hashFiles('**/Gemfile.lock') }}
59
+ restore-keys: |
60
+ ${{ runner.os }}-bundler-
61
+
62
+ - name: Install gems
63
+ run: |
64
+ bundle config path vendor/bundle
65
+ bundle install --jobs 4 --retry 3
66
+
67
+ - name: Run Rubocop
68
+ run: bundle exec rubocop
@@ -3,13 +3,13 @@ require:
3
3
 
4
4
  AllCops:
5
5
  AutoCorrect: false
6
+ SuggestExtensions: false
6
7
  Exclude:
7
8
  - 'click_house.gemspec'
8
9
  - 'bin/*'
9
10
  - 'spec/**/*'
10
11
  - 'vendor/**/*'
11
12
  TargetRubyVersion: 2.7
12
-
13
13
  Bundler/OrderedGems:
14
14
  Enabled: false
15
15
 
@@ -34,6 +34,18 @@ Performance/Squeeze:
34
34
  Enabled: true
35
35
  Performance/StringInclude:
36
36
  Enabled: true
37
+ Performance/Sum:
38
+ Enabled: true
39
+ Performance/ArraySemiInfiniteRangeSlice:
40
+ Enabled: true
41
+ Performance/BlockGivenWithExplicitBlock:
42
+ Enabled: true
43
+ Performance/CollectionLiteralInLoop:
44
+ Enabled: true
45
+ Performance/ConstantRegexp:
46
+ Enabled: true
47
+ Performance/MethodObjectAsBlock:
48
+ Enabled: false
37
49
 
38
50
  # ============================== Metrics ============================
39
51
  Metrics/ClassLength:
@@ -181,6 +193,30 @@ Style/SingleArgumentDig:
181
193
  Enabled: true
182
194
  Style/StringConcatenation:
183
195
  Enabled: true
196
+ Style/ClassEqualityComparison:
197
+ Enabled: true
198
+ Style/CombinableLoops:
199
+ Enabled: true
200
+ Style/KeywordParametersOrder:
201
+ Enabled: false
202
+ Style/RedundantSelfAssignment:
203
+ Enabled: true
204
+ Style/SoleNestedConditional:
205
+ Enabled: true
206
+ Style/ArgumentsForwarding:
207
+ Enabled: true
208
+ Style/CollectionCompact:
209
+ Enabled: true
210
+ Style/DocumentDynamicEvalDefinition:
211
+ Enabled: false
212
+ Style/NegatedIfElseCondition:
213
+ Enabled: true
214
+ Style/NilLambda:
215
+ Enabled: true
216
+ Style/SwapValues:
217
+ Enabled: true
218
+ Style/RedundantArgument:
219
+ Enabled: true
184
220
 
185
221
  # ============================== Lint ==============================
186
222
  Lint/DuplicateMethods:
@@ -215,3 +251,39 @@ Lint/TopLevelReturnWithArgument:
215
251
  Enabled: true
216
252
  Lint/UnreachableLoop:
217
253
  Enabled: true
254
+ Layout/BeginEndAlignment:
255
+ Enabled: true
256
+ Lint/ConstantDefinitionInBlock:
257
+ Enabled: true
258
+ Lint/DuplicateRequire:
259
+ Enabled: true
260
+ Lint/EmptyFile:
261
+ Enabled: true
262
+ Lint/HashCompareByIdentity:
263
+ Enabled: true
264
+ Lint/IdentityComparison:
265
+ Enabled: true
266
+ Lint/RedundantSafeNavigation:
267
+ Enabled: true
268
+ Lint/TrailingCommaInAttributeDeclaration:
269
+ Enabled: true
270
+ Lint/UselessMethodDefinition:
271
+ Enabled: true
272
+ Lint/UselessTimes:
273
+ Enabled: true
274
+ Lint/DuplicateBranch:
275
+ Enabled: true
276
+ Lint/DuplicateRegexpCharacterClassElement:
277
+ Enabled: true
278
+ Lint/EmptyBlock:
279
+ Enabled: true
280
+ Lint/EmptyClass:
281
+ Enabled: true
282
+ Lint/NoReturnInBeginEndBlocks:
283
+ Enabled: true
284
+ Lint/ToEnumArguments:
285
+ Enabled: true
286
+ Lint/UnmodifiedReduceAccumulator:
287
+ Enabled: true
288
+ Lint/UnexpectedBlockArity:
289
+ Enabled: true
@@ -1,3 +1,20 @@
1
+ # 1.3.5
2
+ * added `ClickHouse.connexction.explain("sql")`
3
+
4
+ # 1.3.4
5
+ * added `ClickHouse.type_names(nullable: false)`
6
+ * fixed `connection#create_table` column definitions
7
+ * `ClickHouse.add_type` now handles Nullable types automatically
8
+
9
+ # 1.3.3
10
+ * fix logger typo
11
+
12
+ # 1.3.2
13
+ * fix null logger for windows users
14
+
15
+ # 1.3.1
16
+ * added request [headers](https://github.com/shlima/click_house/pull/8) support
17
+
1
18
  # 1.3.0
2
19
  * added support for IPv4/IPv6 types
3
20
 
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- click_house (1.3.0)
4
+ click_house (1.3.5)
5
5
  faraday
6
6
  faraday_middleware
7
7
 
@@ -11,49 +11,52 @@ GEM
11
11
  ast (2.4.1)
12
12
  coderay (1.1.3)
13
13
  diff-lcs (1.4.4)
14
- faraday (1.0.1)
14
+ faraday (1.1.0)
15
15
  multipart-post (>= 1.2, < 3)
16
+ ruby2_keywords
16
17
  faraday_middleware (1.0.0)
17
18
  faraday (~> 1.0)
18
19
  method_source (1.0.0)
19
20
  multipart-post (2.1.1)
20
- parallel (1.19.2)
21
- parser (2.7.1.4)
21
+ parallel (1.20.1)
22
+ parser (2.7.2.0)
22
23
  ast (~> 2.4.1)
23
24
  pry (0.13.1)
24
25
  coderay (~> 1.1)
25
26
  method_source (~> 1.0)
26
27
  rainbow (3.0.0)
27
28
  rake (13.0.1)
28
- regexp_parser (1.7.1)
29
+ regexp_parser (2.0.0)
29
30
  rexml (3.2.4)
30
- rspec (3.9.0)
31
- rspec-core (~> 3.9.0)
32
- rspec-expectations (~> 3.9.0)
33
- rspec-mocks (~> 3.9.0)
34
- rspec-core (3.9.2)
35
- rspec-support (~> 3.9.3)
36
- rspec-expectations (3.9.2)
31
+ rspec (3.10.0)
32
+ rspec-core (~> 3.10.0)
33
+ rspec-expectations (~> 3.10.0)
34
+ rspec-mocks (~> 3.10.0)
35
+ rspec-core (3.10.0)
36
+ rspec-support (~> 3.10.0)
37
+ rspec-expectations (3.10.0)
37
38
  diff-lcs (>= 1.2.0, < 2.0)
38
- rspec-support (~> 3.9.0)
39
- rspec-mocks (3.9.1)
39
+ rspec-support (~> 3.10.0)
40
+ rspec-mocks (3.10.0)
40
41
  diff-lcs (>= 1.2.0, < 2.0)
41
- rspec-support (~> 3.9.0)
42
- rspec-support (3.9.3)
43
- rubocop (0.89.1)
42
+ rspec-support (~> 3.10.0)
43
+ rspec-support (3.10.0)
44
+ rubocop (1.5.2)
44
45
  parallel (~> 1.10)
45
- parser (>= 2.7.1.1)
46
+ parser (>= 2.7.1.5)
46
47
  rainbow (>= 2.2.2, < 4.0)
47
- regexp_parser (>= 1.7)
48
+ regexp_parser (>= 1.8, < 3.0)
48
49
  rexml
49
- rubocop-ast (>= 0.3.0, < 1.0)
50
+ rubocop-ast (>= 1.2.0, < 2.0)
50
51
  ruby-progressbar (~> 1.7)
51
52
  unicode-display_width (>= 1.4.0, < 2.0)
52
- rubocop-ast (0.3.0)
53
- parser (>= 2.7.1.4)
54
- rubocop-performance (1.7.1)
55
- rubocop (>= 0.82.0)
53
+ rubocop-ast (1.3.0)
54
+ parser (>= 2.7.1.5)
55
+ rubocop-performance (1.9.1)
56
+ rubocop (>= 0.90.0, < 2.0)
57
+ rubocop-ast (>= 0.4.0)
56
58
  ruby-progressbar (1.10.1)
59
+ ruby2_keywords (0.0.2)
57
60
  unicode-display_width (1.7.0)
58
61
 
59
62
  PLATFORMS
data/README.md CHANGED
@@ -2,12 +2,12 @@
2
2
 
3
3
  # ClickHouse Ruby driver
4
4
 
5
- [![pipeline status](https://travis-ci.com/shlima/click_house.svg?branch=master)](https://travis-ci.com/shlima/click_house)
5
+ ![CI](https://github.com/shlima/click_house/workflows/CI/badge.svg)
6
6
  [![Code Climate](https://codeclimate.com/github/shlima/click_house/badges/gpa.svg)](https://codeclimate.com/github/shlima/click_house)
7
7
  [![Gem Version](https://badge.fury.io/rb/click_house.svg)](https://badge.fury.io/rb/click_house)
8
8
 
9
9
  ```bash
10
- # Requires modern Ruby (>= 2.5), tested with Yandex.Clickhouse v 20.9.2.20
10
+ # Requires Ruby >= 2.5
11
11
  gem install click_house
12
12
  ```
13
13
 
@@ -53,6 +53,7 @@ ClickHouse.config do |config|
53
53
  config.timeout = 60
54
54
  config.open_timeout = 3
55
55
  config.ssl_verify = false
56
+ config.headers = {}
56
57
 
57
58
  # or provide connection options separately
58
59
  config.scheme = 'http'
@@ -104,6 +105,11 @@ ClickHouse.connection.truncate_tables(['table_1', 'table_2'], if_exists: true, c
104
105
  ClickHouse.connection.truncate_tables # will truncate all tables in database
105
106
  ClickHouse.connection.rename_table('old_name', 'new_name', cluster: nil)
106
107
  ClickHouse.connection.rename_table(%w[table_1 table_2], %w[new_1 new_2], cluster: nil)
108
+
109
+ ClickHouse.connection.select_all('SELECT * FROM visits')
110
+ ClickHouse.connection.select_one('SELECT * FROM visits LIMIT 1')
111
+ ClickHouse.connection.select_value('SELECT ip FROM visits LIMIT 1')
112
+ ClickHouse.connection.explain('SELECT * FROM visits CROSS JOIN visits')
107
113
  ```
108
114
 
109
115
  ## Queries
@@ -216,7 +222,8 @@ ClickHouse.connection.create_table('visits', if_not_exists: true, engine: 'Merge
216
222
  t.Decimal :money, 5, 4
217
223
  t.String :event
218
224
  t.UInt32 :user_id
219
- t.UInt32 :Float32
225
+ t.IPv4 :ipv4
226
+ t.IPv6 :ipv6
220
227
  end
221
228
  ```
222
229
 
@@ -328,11 +335,11 @@ ClickHouse.add_type('Date', DateType.new)
328
335
  Actually `serialize` function is not used for now, but you may use it manually:
329
336
 
330
337
  ```ruby
331
- time_type = DateTimeType.new
332
- string_type = FixedStringType.new
338
+ time_type = ClickHouse::Type::DateTimeType.new
339
+ string_type = ClickHouse::Type::FixedStringType.new
333
340
 
334
341
  ClickHouse.connection.insert('table', columns: %i[name time]) do |buffer|
335
- buffer << [string_type.serialize('a' * 1000, 20), time.serialize(Time.current, 'Europe/Moscow')]
342
+ buffer << [string_type.serialize('a' * 1000, 20), time_type.serialize(Time.current, 'Europe/Moscow')]
336
343
  end
337
344
 
338
345
  ## alternatively
@@ -344,7 +351,8 @@ data = @records.map do |record|
344
351
  end
345
352
  ```
346
353
 
347
- If native type supports arguments, define type with `%s` argument:
354
+ If native type supports arguments, define *String* type with `%s`
355
+ argument and *Numeric* type with `%d` argument:
348
356
 
349
357
  ```ruby
350
358
  class DateTimeType
@@ -396,6 +404,10 @@ development:
396
404
  test:
397
405
  database: ecliptic_test
398
406
  <<: *default
407
+
408
+ production:
409
+ <<: *default
410
+ database: ecliptic_production
399
411
  ```
400
412
 
401
413
  ```ruby
@@ -448,11 +460,6 @@ class CreateAdvertVisits < ActiveRecord::Migration[6.0]
448
460
  t.UInt16 :account_id
449
461
  t.UInt16 :user_id
450
462
  t.Date :date
451
- t.DateTime :time, 'UTC'
452
- t.IPv4 :ipv4
453
- t.IPv6 :ipv6
454
- t.UInt32 :device_type_id
455
- t.UInt32 :os_family_id
456
463
  end
457
464
  end
458
465
 
@@ -2,7 +2,7 @@ version: '3.5'
2
2
 
3
3
  services:
4
4
  clickhouse:
5
- image: yandex/clickhouse-server:20.9.2.20
5
+ image: yandex/clickhouse-server:20.11.4.13
6
6
  ports:
7
7
  - "8123:8123"
8
8
  - "9000:9000"
@@ -28,41 +28,33 @@ module ClickHouse
28
28
 
29
29
  %w[Date].each do |column|
30
30
  add_type column, Type::DateType.new
31
- add_type "Nullable(#{column})", Type::NullableType.new(Type::DateType.new)
32
31
  end
33
32
 
34
- %w[String].each do |column|
33
+ %w[String FixedString(%d) UUID].each do |column|
35
34
  add_type column, Type::StringType.new
36
- add_type "Nullable(#{column})", Type::NullableType.new(Type::StringType.new)
37
35
  end
38
36
 
39
37
  ['DateTime(%s)'].each do |column|
40
38
  add_type column, Type::DateTimeType.new
41
- add_type "Nullable(#{column})", Type::NullableType.new(Type::DateTimeType.new)
42
39
  end
43
40
 
44
41
  ['DateTime64(%d, %s)'].each do |column|
45
42
  add_type column, Type::DateTime64Type.new
46
- add_type "Nullable(#{column})", Type::NullableType.new(Type::DateTime64Type.new)
47
43
  end
48
44
 
49
- ['Decimal(%s, %s)', 'Decimal32(%s)', 'Decimal64(%s)', 'Decimal128(%s)'].each do |column|
45
+ ['Decimal(%d, %d)', 'Decimal32(%d)', 'Decimal64(%d)', 'Decimal128(%d)'].each do |column|
50
46
  add_type column, Type::DecimalType.new
51
- add_type "Nullable(#{column})", Type::NullableType.new(Type::DecimalType.new)
52
47
  end
53
48
 
54
49
  %w[UInt8 UInt16 UInt32 UInt64 Int8 Int16 Int32 Int64].each do |column|
55
50
  add_type column, Type::IntegerType.new
56
- add_type "Nullable(#{column})", Type::NullableType.new(Type::IntegerType.new)
57
51
  end
58
52
 
59
53
  %w[Float32 Float64].each do |column|
60
54
  add_type column, Type::FloatType.new
61
- add_type "Nullable(#{column})", Type::NullableType.new(Type::IntegerType.new)
62
55
  end
63
56
 
64
57
  %w[IPv4 IPv6].each do |column|
65
58
  add_type column, Type::IPType.new
66
- add_type "Nullable(#{column})", Type::NullableType.new(Type::IPType.new)
67
59
  end
68
60
  end
@@ -18,7 +18,8 @@ module ClickHouse
18
18
  password: nil,
19
19
  timeout: nil,
20
20
  open_timeout: nil,
21
- ssl_verify: false
21
+ ssl_verify: false,
22
+ headers: {}
22
23
  }.freeze
23
24
 
24
25
  attr_accessor :adapter
@@ -33,6 +34,7 @@ module ClickHouse
33
34
  attr_accessor :timeout
34
35
  attr_accessor :open_timeout
35
36
  attr_accessor :ssl_verify
37
+ attr_accessor :headers
36
38
 
37
39
  def initialize(params = {})
38
40
  assign(DEFAULTS.merge(params))
@@ -51,7 +53,7 @@ module ClickHouse
51
53
  end
52
54
 
53
55
  def logger!
54
- @logger || Logger.new('/dev/null')
56
+ @logger || Logger.new(IO::NULL)
55
57
  end
56
58
 
57
59
  def url!
@@ -8,9 +8,11 @@ module ClickHouse
8
8
  include Extend::ConnectionSelective
9
9
  include Extend::ConnectionInserting
10
10
  include Extend::ConnectionAltering
11
+ include Extend::ConnectionExplaining
11
12
 
12
13
  attr_reader :config
13
14
 
15
+ # @param [Config]
14
16
  def initialize(config)
15
17
  @config = config
16
18
  end
@@ -31,6 +33,7 @@ module ClickHouse
31
33
  @transport ||= Faraday.new(config.url!) do |conn|
32
34
  conn.options.timeout = config.timeout
33
35
  conn.options.open_timeout = config.open_timeout
36
+ conn.headers = config.headers
34
37
  conn.ssl.verify = config.ssl_verify
35
38
  conn.basic_auth(config.username, config.password) if config.auth?
36
39
  conn.response Middleware::Logging, logger: config.logger!
@@ -3,17 +3,7 @@
3
3
  module ClickHouse
4
4
  module Definition
5
5
  class ColumnSet
6
- TYPES = [
7
- 'UInt8', 'UInt16', 'UInt32', 'UInt64', 'Int8', 'Int16', 'Int32', 'Int64',
8
- 'Float32', 'Float64',
9
- 'Decimal(%d, %d)', 'Decimal32(%d)', 'Decimal64(%d)', 'Decimal128(%d)',
10
- 'String',
11
- 'FixedString(%d)',
12
- 'UUID',
13
- 'Date',
14
- 'IPv4', 'IPv6',
15
- "DateTime('%s')", "DateTime64(%d, '%s')"
16
- ].freeze
6
+ TYPES = ClickHouse.type_names(nullable: false).map { |s| s.sub('%s', "'%s'") }.freeze
17
7
 
18
8
  class << self
19
9
  # @input "DateTime('%s')"
@@ -11,5 +11,6 @@ module ClickHouse
11
11
  autoload :ConnectionSelective, 'click_house/extend/connection_selective'
12
12
  autoload :ConnectionInserting, 'click_house/extend/connection_inserting'
13
13
  autoload :ConnectionAltering, 'click_house/extend/connection_altering'
14
+ autoload :ConnectionExplaining, 'click_house/extend/connection_explaining'
14
15
  end
15
16
  end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ClickHouse
4
+ module Extend
5
+ module ConnectionExplaining
6
+ EXPLAIN = 'EXPLAIN'
7
+ EXPLAIN_RE = /\A(\s*#{EXPLAIN})/io.freeze
8
+
9
+ def explain(sql, io: $stdout)
10
+ res = execute("#{EXPLAIN} #{sql.gsub(EXPLAIN_RE, '')}")
11
+ io << res.body
12
+ end
13
+ end
14
+ end
15
+ end
@@ -3,12 +3,21 @@
3
3
  module ClickHouse
4
4
  module Extend
5
5
  module TypeDefinition
6
+ NULLABLE = 'Nullable'
7
+ NULLABLE_RE = /#{NULLABLE}/i.freeze
8
+
6
9
  def types
7
10
  @types ||= Hash.new(Type::UndefinedType.new)
8
11
  end
9
12
 
10
- def add_type(type, klass)
13
+ def add_type(type, klass, nullable: true)
11
14
  types[type] = klass
15
+ types["#{NULLABLE}(#{type})"] = Type::NullableType.new(klass) if nullable
16
+ end
17
+
18
+ # @return [Enum<String>]
19
+ def type_names(nullable:)
20
+ nullable ? types.keys : types.keys.grep_v(NULLABLE_RE)
12
21
  end
13
22
  end
14
23
  end
@@ -34,7 +34,7 @@ module ClickHouse
34
34
 
35
35
  logger.info("\e[1mSQL (#{Util::Pretty.measure(elapsed)})\e[0m #{query};")
36
36
  logger.debug(body) if body
37
- logger.info("\e[1mRead: #{summary.fetch(:read_rows)} rows, #{summary.fetch(:read_bytes)}. Written: #{summary.fetch(:written_rows)}, rows #{summary.fetch(:written_bytes)}\e[0m")
37
+ logger.info("\e[1mRead: #{summary.fetch(:read_rows)} rows, #{summary.fetch(:read_bytes)}. Written: #{summary.fetch(:written_rows)} rows, #{summary.fetch(:written_bytes)}\e[0m")
38
38
  end
39
39
  # rubocop:enable Layout/LineLength
40
40
 
@@ -8,6 +8,7 @@ module ClickHouse
8
8
 
9
9
  TYPE_ARGV_DELIM = ','
10
10
  NULLABLE = 'Nullable'
11
+ NULLABLE_TYPE_RE = /#{NULLABLE}\((.+)\)/i.freeze
11
12
 
12
13
  def_delegators :to_a,
13
14
  :each, :fetch, :length, :count, :size, :first, :last, :[], :to_h
@@ -28,7 +29,7 @@ module ClickHouse
28
29
  # @input "Decimal(10, 5)"
29
30
  # @output "Decimal(%s, %s)"
30
31
  def extract_type_info(type)
31
- type = type.gsub(/#{NULLABLE}\((.+)\)/i, '\1')
32
+ type = type.gsub(NULLABLE_TYPE_RE, '\1')
32
33
  nullable = Regexp.last_match(1)
33
34
  argv = []
34
35
 
@@ -4,6 +4,7 @@ module ClickHouse
4
4
  module Util
5
5
  module Statement
6
6
  END_OF_STATEMENT = ';'
7
+ END_OF_STATEMENT_RE = /#{END_OF_STATEMENT}(\s+|\Z)/.freeze
7
8
 
8
9
  module_function
9
10
 
@@ -14,7 +15,7 @@ module ClickHouse
14
15
  def format(sql, format)
15
16
  return sql if sql.match?(/FORMAT/i)
16
17
 
17
- "#{sql.sub(/#{END_OF_STATEMENT}(\s+|\Z)/, '')} FORMAT #{format};"
18
+ "#{sql.sub(END_OF_STATEMENT_RE, '')} FORMAT #{format};"
18
19
  end
19
20
  end
20
21
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ClickHouse
4
- VERSION = '1.3.0'
4
+ VERSION = '1.3.5'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: click_house
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0
4
+ version: 1.3.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aliaksandr Shylau
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-09-23 00:00:00.000000000 Z
11
+ date: 2020-12-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -129,10 +129,10 @@ executables: []
129
129
  extensions: []
130
130
  extra_rdoc_files: []
131
131
  files:
132
+ - ".github/workflows/main.yml"
132
133
  - ".gitignore"
133
134
  - ".rspec"
134
135
  - ".rubocop.yml"
135
- - ".travis.yml"
136
136
  - CHANGELOG.md
137
137
  - Gemfile
138
138
  - Gemfile.lock
@@ -158,6 +158,7 @@ files:
158
158
  - lib/click_house/extend/connectible.rb
159
159
  - lib/click_house/extend/connection_altering.rb
160
160
  - lib/click_house/extend/connection_database.rb
161
+ - lib/click_house/extend/connection_explaining.rb
161
162
  - lib/click_house/extend/connection_healthy.rb
162
163
  - lib/click_house/extend/connection_inserting.rb
163
164
  - lib/click_house/extend/connection_selective.rb
@@ -1,16 +0,0 @@
1
- language: ruby
2
-
3
- rvm:
4
- - 2.6.5
5
-
6
- services:
7
- - docker
8
-
9
- before_install:
10
- - docker pull yandex/clickhouse-server
11
- - docker run -d -p 127.0.0.1:8123:8123 yandex/clickhouse-server
12
- - bundle install
13
-
14
- script:
15
- - bundle exec rubocop
16
- - bundle exec rspec