bricolage 6.0.0beta1 → 6.0.0beta6

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: 111b4bb62234f5a428ccd1da5a5ee2d6d4b1a051c8fda9ddd6fac3e590356797
4
- data.tar.gz: 77c3857f92a721503bd07f6e235c81f454d61e3a55e111e7a2c0ce72efa8f6ed
3
+ metadata.gz: d057475396d2f1e47cfccc490ec4ab07467c0056f519abd5a7c9bafdfdb63714
4
+ data.tar.gz: 252a0d2c7cb00f1fee102b25eec0b0f0a52919652f2210e2a8c877ec9e532638
5
5
  SHA512:
6
- metadata.gz: ca02be7fe28f3323f8dcfa1f9c88a0dd70050f7af75109ee077d0347a5f7a4420bb7f7a6b80d9ad207bd447b640089b979e319fa9ed3cf3465e11039327bc2f3
7
- data.tar.gz: 7d9d77d27f31d5368a694b9514a1276532335e1f980b2dd45fa77b7a4f30cc500b4dc1fb6a99a0a2f5dd35b42c9e155201764ba3d1d9a253b52790acf1f92857
6
+ metadata.gz: 685f46050cb796689a9756387dabad8dcae318e6f7ae342f130d0b470b2375986b36aba65284d3cb516bdf9630aae8372eb47426f314dd233abea50bc087c86b
7
+ data.tar.gz: b50a8d23ec9b1df0e0303b0d6dee90a1c896fabb085943557158e61504107b64fbeaadfc15b83931a56db987ad524933281403ef1f0c41f56e2a0e5b7ac8c043
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 3.0
data/README.md CHANGED
@@ -11,6 +11,9 @@ See LICENSES file for details.
11
11
 
12
12
  ## Running Test
13
13
 
14
+ Create bricolage_test database and user on your local machine.
15
+ See config/test/datasource.yml for details. Then type:
16
+
14
17
  % rake test
15
18
 
16
19
  ## How to use
data/RELEASE.md CHANGED
@@ -1,5 +1,31 @@
1
1
  # Bricolage Release Note
2
2
 
3
+ ## version 6.0.0 beta 6
4
+
5
+ - [new] Now you can refer job file local variables from job parameters.
6
+
7
+ ## version 6.0.0 beta 5
8
+
9
+ - [new] Supports Ruby 3.0.
10
+
11
+ ## version 6.0.0 beta 4
12
+
13
+ - [fix] rebuild-rename did not work with ALTER RENAME syntax error.
14
+
15
+ ## version 6.0.0 beta 3
16
+
17
+ - [new] Upgrades pg from 0.18 to 1.2.
18
+
19
+ ## version 6.0.0 beta 2
20
+
21
+ - [fix] Always transmit error messages from jobs in the jobnet.
22
+
23
+ ## version 6.0.0 beta 1
24
+
25
+ - [new] Introduces database queue. Database queue saves job states in the PostgreSQL instance, we now can run bricolage on container environment.
26
+ - [new] Default log level is DEBUG on development environment, INFO on production environment.
27
+ - [new] Only updating query is logged as INFO level. Read-only queries are logged in DEBUG level.
28
+
3
29
  ## version 5.30.0
4
30
 
5
31
  - [new] streaming_load: new option --ctl-ds to change S3 data source for metadata files.
data/Rakefile CHANGED
@@ -1,3 +1,13 @@
1
+ require 'rake/testtask'
2
+
1
3
  task :test do
2
- load "#{__dir__}/test/all.rb"
4
+ desc 'Run tests'
5
+ Rake::TestTask.new do |t|
6
+ # To run test cases of specific file(s), Use:
7
+ # % rake test TEST=test/test_specified_path.rb
8
+ t.libs << "test"
9
+ t.test_files = Dir["test/**/test_*.rb"]
10
+ t.verbose = true
11
+ t.warning = true
12
+ end
3
13
  end
data/bricolage.gemspec CHANGED
@@ -16,12 +16,13 @@ Gem::Specification.new do |s|
16
16
  s.executables = s.files.grep(%r{bin/}).map {|path| File.basename(path) }
17
17
  s.require_path = 'lib'
18
18
 
19
- s.required_ruby_version = '>= 2.0.0'
20
- s.add_dependency 'pg', '~> 0.18.0'
21
- s.add_dependency 'aws-sdk-s3', '~> 1'
22
- s.add_dependency 'aws-sdk-sns', '~> 1'
23
- s.add_development_dependency 'test-unit'
24
- s.add_development_dependency 'rake'
25
- s.add_development_dependency 'mocha'
26
- s.add_development_dependency 'pry-byebug'
19
+ s.required_ruby_version = '>= 2.4.0'
20
+ s.add_dependency 'pg', '~> 1.2.3'
21
+ s.add_dependency 'aws-sdk-s3', '~> 1.64'
22
+ s.add_dependency 'aws-sdk-sns', '~> 1.23'
23
+ s.add_dependency 'nokogiri' # aws-sdk-core requires this
24
+ s.add_development_dependency 'test-unit', '~> 3.3'
25
+ s.add_development_dependency 'rake', '~> 13.0'
26
+ s.add_development_dependency 'mocha', '~> 1.11'
27
+ s.add_development_dependency 'pry-byebug', '~> 3.9'
27
28
  end
@@ -0,0 +1,9 @@
1
+ test_db:
2
+ type: psql
3
+ host: localhost
4
+ port: 5432
5
+ database: bricolage_test
6
+ username: bricolage_test
7
+ password: bricolage_test
8
+ encoding: utf8
9
+ sql_log_level: DEBUG
@@ -21,18 +21,18 @@ JobClass.define('rebuild-rename') {
21
21
 
22
22
  script {|params, script|
23
23
  script.task(params['data-source']) {|task|
24
- dest_table = '$dest_table'
25
- prev_table = '${dest_table}_old'
26
- work_table = '${dest_table}_wk'
24
+ dest_table = params['dest-table']
25
+ prev_table = TableSpec.parse("#{dest_table}_old")
26
+ work_table = TableSpec.parse("#{dest_table}_wk")
27
27
 
28
28
  task.transaction {
29
29
  # CREATE
30
30
  task.drop_force prev_table
31
31
  task.drop_force work_table
32
- task.exec params['table-def'].replace(/\$\{?dest_table\}?\b/, work_table)
32
+ task.exec params['table-def'].replace(/\$\{?dest_table\}?\b/, work_table.to_s)
33
33
 
34
34
  # INSERT
35
- task.exec params['sql-file'].replace(/\$\{?dest_table\}?\b/, work_table)
35
+ task.exec params['sql-file'].replace(/\$\{?dest_table\}?\b/, work_table.to_s)
36
36
 
37
37
  # GRANT
38
38
  task.grant_if params['grant'], work_table
@@ -45,8 +45,8 @@ JobClass.define('rebuild-rename') {
45
45
  # RENAME
46
46
  task.transaction {
47
47
  task.create_dummy_table dest_table
48
- task.rename_table dest_table, prev_table
49
- task.rename_table work_table, dest_table
48
+ task.rename_table dest_table, prev_table.name
49
+ task.rename_table work_table, dest_table.name
50
50
  }
51
51
  }
52
52
  }
@@ -144,7 +144,7 @@ class StreamingLoadJobClass < RubyJobClass
144
144
  @ds.open {|conn|
145
145
  execute_update conn, "delete #{log_table_wk};"
146
146
  execute_update conn, load_log_copy_stmt(log_table_wk, log_url, @src.credential_string)
147
- loaded, not_loaded = partition_loaded_objects(conn, objects, log_table_wk)
147
+ loaded, _not_loaded = partition_loaded_objects(conn, objects, log_table_wk)
148
148
  loaded.each do |obj|
149
149
  obj.dequeue(force: true, noop: @noop)
150
150
  end
@@ -32,7 +32,7 @@ module Bricolage
32
32
  end
33
33
 
34
34
  def eruby(text, path)
35
- erb = ERB.new(text, nil, '%-')
35
+ erb = ERB.new(text, trim_mode: '%-')
36
36
  erb.filename = path.to_s
37
37
  push_base_dir(path) {
38
38
  erb.result(binding())
@@ -141,7 +141,7 @@ module Bricolage
141
141
  end
142
142
 
143
143
  def clear_lock(jobnet_id)
144
- records = connect {|conn|
144
+ connect {|conn|
145
145
  conn.execute_update(<<~EndSQL)
146
146
  update jobnets
147
147
  set
@@ -6,7 +6,7 @@ module Bricolage
6
6
  class FileDataSource < DataSource
7
7
  declare_type 'file'
8
8
 
9
- def initialize(opts)
9
+ def initialize
10
10
  end
11
11
 
12
12
  def new_task
@@ -4,8 +4,7 @@ module Bricolage
4
4
  class GenericDataSource < DataSource
5
5
  declare_type 'generic'
6
6
 
7
- # FIXME: keyword argument placeholder is required
8
- def initialize(**)
7
+ def initialize
9
8
  end
10
9
 
11
10
  def new_task
data/lib/bricolage/job.rb CHANGED
@@ -6,6 +6,7 @@ require 'bricolage/variables'
6
6
  require 'bricolage/configloader'
7
7
  require 'bricolage/loglocator'
8
8
  require 'bricolage/exception'
9
+ require 'tmpdir'
9
10
  require 'fileutils'
10
11
 
11
12
  module Bricolage
@@ -50,6 +51,8 @@ module Bricolage
50
51
  end
51
52
 
52
53
  attr_reader :id
54
+ attr_reader :job_class
55
+ attr_reader :context
53
56
 
54
57
  def class_id
55
58
  @job_class.id
@@ -96,6 +99,7 @@ module Bricolage
96
99
  base_vars = Variables.union(
97
100
  # ^ Low precedence
98
101
  @global_variables,
102
+ job_file_rest_vars,
99
103
  cmd_v_opt_vars,
100
104
  job_v_opt_vars
101
105
  # v High precedence
@@ -151,9 +155,7 @@ module Bricolage
151
155
  end
152
156
 
153
157
  def execute_in_process(log_locator:)
154
- # ??? FIXME: status_path should be independent from log_path.
155
- # Also, status_path should be defined regardless of log_path.
156
- status_path = log_locator.path ? "#{log_locator.path}.status" : nil
158
+ status_path = "#{Dir.tmpdir}/bricolage.#{$$}.status.#{"%010x" % rand(1000000000000)}"
157
159
  isolate_process(status_path) {
158
160
  log_locator.redirect_stdouts {
159
161
  do_execute
@@ -57,7 +57,7 @@ module Bricolage
57
57
  case
58
58
  when seconds > 60 * 60
59
59
  h, secs = seconds.divmod(60 * 60)
60
- m, s = secs.divmod(60)
60
+ m, _sec = secs.divmod(60)
61
61
  "%d hours %d minutes" % [h, m]
62
62
  when seconds > 60
63
63
  "%d minutes %d seconds" % seconds.divmod(60)
@@ -117,21 +117,28 @@ module Bricolage
117
117
  raise ParameterError, "could not read password: #{path}, #{user}"
118
118
  end
119
119
 
120
- def open(&block)
120
+ def open
121
121
  retries = (ENV['BRICOLAGE_OPEN_RETRY_LIMIT'] || DEFAULT_RETRY_LIMIT).to_i
122
122
  begin
123
123
  conn = PostgresConnection.open_data_source(self)
124
- conn.execute_query('select 1'){}
124
+ conn.execute_query('select 1') {}
125
125
  rescue PG::ConnectionBad, PG::UnableToSend => ex
126
+ conn.close rescue nil
126
127
  retries -= 1
127
128
  if retries >= 0
128
- logger.warn "Retry PG connection for execute query: #{ex.message}"
129
+ logger.warn "Could not open postgres connection; retry: #{ex.message}"
129
130
  sleep 1
130
131
  retry
132
+ else
133
+ raise
131
134
  end
132
135
  end
133
136
  if block_given?
134
- yield conn
137
+ begin
138
+ yield conn
139
+ ensure
140
+ conn.close
141
+ end
135
142
  else
136
143
  return conn
137
144
  end
@@ -140,23 +147,35 @@ module Bricolage
140
147
  def open_shared_connection
141
148
  raise ParameterError, 'open_shared_connection require block' unless block_given?
142
149
  conn = nil
143
- if @connection_pool.empty?
144
- conn = open
145
- else
146
- begin
147
- conn = @connection_pool.shift
148
- conn.execute_query('select 1'){}
149
- rescue
150
- conn.close
150
+ until conn
151
+ if conn_tmp = @connection_pool.shift
152
+ begin
153
+ conn_tmp.query('select 1') {}
154
+ rescue PG::ConnectionBad, PG::UnableToSend
155
+ # retry
156
+ else
157
+ # no exception occured
158
+ conn = conn_tmp
159
+ conn_tmp = nil
160
+ ensure
161
+ if conn_tmp
162
+ conn_tmp.close
163
+ conn_tmp = nil
164
+ end
165
+ end
166
+ else
167
+ # Get a fresh connection instead of pooled connections.
151
168
  conn = open
152
169
  end
153
170
  end
154
-
155
- yield conn
156
- ensure
157
- @connection_pool.push(conn)
171
+ begin
172
+ yield conn
173
+ ensure
174
+ @connection_pool.push(conn)
175
+ end
158
176
  end
159
177
 
178
+ # not MT-safe
160
179
  def clear_connection_pool
161
180
  @connection_pool.map(&:close)
162
181
  @connection_pool = []
@@ -50,8 +50,7 @@ module Bricolage
50
50
  class RubyDataSource < DataSource
51
51
  declare_type 'ruby'
52
52
 
53
- # FIXME: keyword argument placeholder is required
54
- def initialize(**)
53
+ def initialize
55
54
  end
56
55
 
57
56
  def new_task
@@ -32,7 +32,7 @@ module Bricolage
32
32
 
33
33
  def psql_serialize_vacuum_end
34
34
  if enable_vacuum_lock?
35
- path, timeout = vacuum_lock_parameters
35
+ path, _timeout = vacuum_lock_parameters
36
36
  "\\! rm -f #{path}"
37
37
  else
38
38
  ';'
@@ -88,7 +88,7 @@ module Bricolage
88
88
 
89
89
  def VacuumLock.cleanup_vacuum_lock
90
90
  return unless enable_vacuum_lock?
91
- path, timeout = vacuum_lock_parameters
91
+ path, _timeout = vacuum_lock_parameters
92
92
  if locking?(path)
93
93
  $stderr.puts "remove VACUUM lock by #{Process.pid}"
94
94
  FileUtils.rm_f path
@@ -1,4 +1,4 @@
1
1
  module Bricolage
2
2
  APPLICATION_NAME = 'Bricolage'
3
- VERSION = '6.0.0beta1'
3
+ VERSION = '6.0.0beta6'
4
4
  end
data/schema/Dockerfile CHANGED
@@ -1,13 +1,16 @@
1
- FROM ruby:2.6.5-stretch
1
+ FROM ruby:3.0-slim
2
2
 
3
3
  RUN apt-get update -qq && apt-get install -y build-essential libpq-dev libpq5 postgresql-client
4
4
 
5
- COPY ./Gemfile /tmp/Gemfile
6
- COPY ./Gemfile.lock /tmp/Gemfile.lock
7
- RUN cd /tmp && bundle install -j4 --deployment --without 'development test'
8
-
9
5
  WORKDIR /app
10
- COPY . /app
11
- RUN cp -a /tmp/vendor /app/
6
+
7
+ COPY ./Gemfile .
8
+ COPY ./Gemfile.lock .
9
+ RUN gem install bundler:2.2.15 && \
10
+ bundle config set --local deployment true && \
11
+ bundle config set --local without 'development test' && \
12
+ bundle install -j4
13
+
14
+ COPY . .
12
15
 
13
16
  CMD ["bundle", "exec", "ridgepole", "-f", "Schemafile", "-c", "database.yml", "--merge", "--dry-run"]
data/schema/Gemfile CHANGED
@@ -1,4 +1,5 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
3
  gem 'ridgepole'
4
+ gem 'activerecord', '~> 6.0.0' # activerecord 6.1 did not work with check_constraint
4
5
  gem 'pg'
data/schema/Gemfile.lock CHANGED
@@ -1,37 +1,38 @@
1
1
  GEM
2
2
  remote: https://rubygems.org/
3
3
  specs:
4
- activemodel (5.2.4.3)
5
- activesupport (= 5.2.4.3)
6
- activerecord (5.2.4.3)
7
- activemodel (= 5.2.4.3)
8
- activesupport (= 5.2.4.3)
9
- arel (>= 9.0)
10
- activesupport (5.2.4.3)
4
+ activemodel (6.0.3.6)
5
+ activesupport (= 6.0.3.6)
6
+ activerecord (6.0.3.6)
7
+ activemodel (= 6.0.3.6)
8
+ activesupport (= 6.0.3.6)
9
+ activesupport (6.0.3.6)
11
10
  concurrent-ruby (~> 1.0, >= 1.0.2)
12
11
  i18n (>= 0.7, < 2)
13
12
  minitest (~> 5.1)
14
13
  tzinfo (~> 1.1)
15
- arel (9.0.0)
16
- concurrent-ruby (1.1.6)
17
- diffy (3.3.0)
18
- i18n (1.8.2)
14
+ zeitwerk (~> 2.2, >= 2.2.2)
15
+ concurrent-ruby (1.1.8)
16
+ diffy (3.4.0)
17
+ i18n (1.8.10)
19
18
  concurrent-ruby (~> 1.0)
20
- minitest (5.14.1)
21
- pg (1.1.4)
22
- ridgepole (0.7.7)
23
- activerecord (>= 5.0.1, < 6)
19
+ minitest (5.14.4)
20
+ pg (1.2.3)
21
+ ridgepole (0.9.2)
22
+ activerecord (>= 5.1, < 6.2)
24
23
  diffy
25
24
  thread_safe (0.3.6)
26
- tzinfo (1.2.7)
25
+ tzinfo (1.2.9)
27
26
  thread_safe (~> 0.1)
27
+ zeitwerk (2.4.2)
28
28
 
29
29
  PLATFORMS
30
30
  ruby
31
31
 
32
32
  DEPENDENCIES
33
+ activerecord (~> 6.0.0)
33
34
  pg
34
35
  ridgepole
35
36
 
36
37
  BUNDLED WITH
37
- 1.17.2
38
+ 2.2.15
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bricolage
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.0.0beta1
4
+ version: 6.0.0beta6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Minero Aoki
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-07-27 00:00:00.000000000 Z
11
+ date: 2021-05-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pg
@@ -16,98 +16,112 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 0.18.0
19
+ version: 1.2.3
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 0.18.0
26
+ version: 1.2.3
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: aws-sdk-s3
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '1'
33
+ version: '1.64'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '1'
40
+ version: '1.64'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: aws-sdk-sns
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '1'
47
+ version: '1.23'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '1'
54
+ version: '1.23'
55
55
  - !ruby/object:Gem::Dependency
56
- name: test-unit
56
+ name: nokogiri
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - ">="
60
60
  - !ruby/object:Gem::Version
61
61
  version: '0'
62
- type: :development
62
+ type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: test-unit
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '3.3'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '3.3'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: rake
71
85
  requirement: !ruby/object:Gem::Requirement
72
86
  requirements:
73
- - - ">="
87
+ - - "~>"
74
88
  - !ruby/object:Gem::Version
75
- version: '0'
89
+ version: '13.0'
76
90
  type: :development
77
91
  prerelease: false
78
92
  version_requirements: !ruby/object:Gem::Requirement
79
93
  requirements:
80
- - - ">="
94
+ - - "~>"
81
95
  - !ruby/object:Gem::Version
82
- version: '0'
96
+ version: '13.0'
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: mocha
85
99
  requirement: !ruby/object:Gem::Requirement
86
100
  requirements:
87
- - - ">="
101
+ - - "~>"
88
102
  - !ruby/object:Gem::Version
89
- version: '0'
103
+ version: '1.11'
90
104
  type: :development
91
105
  prerelease: false
92
106
  version_requirements: !ruby/object:Gem::Requirement
93
107
  requirements:
94
- - - ">="
108
+ - - "~>"
95
109
  - !ruby/object:Gem::Version
96
- version: '0'
110
+ version: '1.11'
97
111
  - !ruby/object:Gem::Dependency
98
112
  name: pry-byebug
99
113
  requirement: !ruby/object:Gem::Requirement
100
114
  requirements:
101
- - - ">="
115
+ - - "~>"
102
116
  - !ruby/object:Gem::Version
103
- version: '0'
117
+ version: '3.9'
104
118
  type: :development
105
119
  prerelease: false
106
120
  version_requirements: !ruby/object:Gem::Requirement
107
121
  requirements:
108
- - - ">="
122
+ - - "~>"
109
123
  - !ruby/object:Gem::Version
110
- version: '0'
124
+ version: '3.9'
111
125
  description: Redshift-oriented Data Warehouse Batch Framework
112
126
  email: aamine@loveruby.net
113
127
  executables:
@@ -117,6 +131,7 @@ extensions: []
117
131
  extra_rdoc_files: []
118
132
  files:
119
133
  - ".gitignore"
134
+ - ".ruby-version"
120
135
  - Gemfile
121
136
  - LICENSES
122
137
  - README.md
@@ -125,6 +140,7 @@ files:
125
140
  - bin/bricolage
126
141
  - bin/bricolage-jobnet
127
142
  - bricolage.gemspec
143
+ - config/test/datasource.yml
128
144
  - jobclass/adhoc.rb
129
145
  - jobclass/create.rb
130
146
  - jobclass/createview.rb
@@ -194,7 +210,7 @@ homepage: https://github.com/bricolages/bricolage
194
210
  licenses:
195
211
  - MIT
196
212
  metadata: {}
197
- post_install_message:
213
+ post_install_message:
198
214
  rdoc_options: []
199
215
  require_paths:
200
216
  - lib
@@ -202,15 +218,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
202
218
  requirements:
203
219
  - - ">="
204
220
  - !ruby/object:Gem::Version
205
- version: 2.0.0
221
+ version: 2.4.0
206
222
  required_rubygems_version: !ruby/object:Gem::Requirement
207
223
  requirements:
208
224
  - - ">"
209
225
  - !ruby/object:Gem::Version
210
226
  version: 1.3.1
211
227
  requirements: []
212
- rubygems_version: 3.1.2
213
- signing_key:
228
+ rubygems_version: 3.2.3
229
+ signing_key:
214
230
  specification_version: 4
215
231
  summary: SQL Batch Framework
216
232
  test_files: []