pgtk 0.29.0 → 0.29.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: d009986ef367b868cc530dde2ba4984390fd9489fc61e39a0ea280494e57b327
4
- data.tar.gz: bae12eef5b8477fd361ffb2167ffadd823f65f488fa15cf7828f216fa496a87e
3
+ metadata.gz: 9058b06e680aa6404b1c6f9dc3bdd1f908ac24bc60068e413f979ffa92b7bc07
4
+ data.tar.gz: 59e67475bb42279e43ef93cda5930a89edf2e0f4006fd3601a6b5f48f1c32692
5
5
  SHA512:
6
- metadata.gz: a28a8ba102a0f7b19341ac639c2860ae92048c672781e89ce195768f418fdfaf2fc4e2d56e723a270e1af954a8482a141acad4644290bd1e0677cc6d2829d0b0
7
- data.tar.gz: 9a75b7c6631915d6e9e066da596ed630dd73ebb1df0ca343510adc3b7dbc749b70b1be42fa5d96227c8fdd0ca7397a826da4026526cb0ee9b1c7fa0923090141
6
+ metadata.gz: 9e827f631278939888b20c21ff7bd7961db5017f845ca4864144334044b44cb96d4814518c93b55f04a41897fcf52fa90c9e37a2058f1e18d5f555eda553c8b8
7
+ data.tar.gz: d97fa97e0981a3164aa721f56e28c991fc11661ae83b67f0dbabd651cdb0eaceb15f650fe4d27ad5781fe61b95d04895f820be328a0b39c6f7ba7ee6b02b4abb
data/Gemfile CHANGED
@@ -6,8 +6,10 @@
6
6
  source 'https://rubygems.org'
7
7
  gemspec
8
8
 
9
- gem 'minitest', '~>5.25', require: false
9
+ gem 'minitest', '~>6.0', require: false
10
+ gem 'minitest-mock', '~>5.27', require: false
10
11
  gem 'minitest-reporters', '~>1.7', require: false
12
+ gem 'minitest-stub-const', '~>0.6', require: false
11
13
  gem 'rack', '~>3.1', require: false
12
14
  gem 'rake', '~>13.2', require: false
13
15
  gem 'rubocop', '~>1.73', require: false
data/Gemfile.lock CHANGED
@@ -11,6 +11,7 @@ PATH
11
11
  qbash (~> 0.4)
12
12
  random-port (~> 0.7)
13
13
  tago (~> 0.1)
14
+ waitutil (~> 0.2)
14
15
 
15
16
  GEM
16
17
  remote: https://rubygems.org/
@@ -19,25 +20,28 @@ GEM
19
20
  ast (2.4.3)
20
21
  backtrace (0.4.1)
21
22
  builder (3.3.0)
22
- concurrent-ruby (1.3.5)
23
+ concurrent-ruby (1.3.6)
23
24
  differ (0.1.2)
24
25
  docile (1.4.1)
25
- elapsed (0.2.0)
26
+ elapsed (0.2.1)
26
27
  loog (~> 0.6)
27
28
  tago (~> 0.1)
28
29
  joined (0.4.0)
29
- json (2.16.0)
30
+ json (2.18.0)
30
31
  language_server-protocol (3.17.0.5)
31
32
  lint_roller (1.1.0)
32
33
  logger (1.7.0)
33
34
  loog (0.6.1)
34
35
  logger (~> 1.0)
35
- minitest (5.26.2)
36
+ minitest (6.0.0)
37
+ prism (~> 1.5)
38
+ minitest-mock (5.27.0)
36
39
  minitest-reporters (1.7.1)
37
40
  ansi
38
41
  builder
39
42
  minitest (>= 5.0)
40
43
  ruby-progressbar
44
+ minitest-stub-const (0.6)
41
45
  nokogiri (1.18.10-arm64-darwin)
42
46
  racc (~> 1.4)
43
47
  nokogiri (1.18.10-x64-mingw-ucrt)
@@ -51,7 +55,7 @@ GEM
51
55
  pg (1.6.2-arm64-darwin)
52
56
  pg (1.6.2-x64-mingw-ucrt)
53
57
  pg (1.6.2-x86_64-linux)
54
- prism (1.6.0)
58
+ prism (1.7.0)
55
59
  qbash (0.4.8)
56
60
  backtrace (> 0)
57
61
  elapsed (> 0)
@@ -65,7 +69,7 @@ GEM
65
69
  tago (~> 0.0)
66
70
  regexp_parser (2.11.3)
67
71
  rexml (3.4.4)
68
- rubocop (1.81.7)
72
+ rubocop (1.82.0)
69
73
  json (~> 2.3)
70
74
  language_server-protocol (~> 3.17.0.2)
71
75
  lint_roller (~> 1.1.0)
@@ -73,7 +77,7 @@ GEM
73
77
  parser (>= 3.3.0.2)
74
78
  rainbow (>= 2.2.2, < 4.0)
75
79
  regexp_parser (>= 2.9.3, < 3.0)
76
- rubocop-ast (>= 1.47.1, < 2.0)
80
+ rubocop-ast (>= 1.48.0, < 2.0)
77
81
  ruby-progressbar (~> 1.7)
78
82
  unicode-display_width (>= 2.4.0, < 4.0)
79
83
  rubocop-ast (1.48.0)
@@ -101,14 +105,15 @@ GEM
101
105
  simplecov-html (0.13.2)
102
106
  simplecov_json_formatter (0.1.4)
103
107
  slop (4.10.1)
104
- tago (0.4.0)
108
+ tago (0.6.0)
105
109
  threads (0.5.0)
106
110
  backtrace (~> 0)
107
111
  concurrent-ruby (~> 1.0)
108
- timeout (0.5.0)
112
+ timeout (0.6.0)
109
113
  unicode-display_width (3.2.0)
110
114
  unicode-emoji (~> 4.1)
111
- unicode-emoji (4.1.0)
115
+ unicode-emoji (4.2.0)
116
+ waitutil (0.2.1)
112
117
  xcop (0.8.0)
113
118
  differ (~> 0.1.2)
114
119
  nokogiri (~> 1.10)
@@ -124,8 +129,10 @@ PLATFORMS
124
129
  x86_64-linux
125
130
 
126
131
  DEPENDENCIES
127
- minitest (~> 5.25)
132
+ minitest (~> 6.0)
133
+ minitest-mock (~> 5.27)
128
134
  minitest-reporters (~> 1.7)
135
+ minitest-stub-const (~> 0.6)
129
136
  pgtk!
130
137
  rack (~> 3.1)
131
138
  rake (~> 13.2)
@@ -10,8 +10,10 @@ require 'rake'
10
10
  require 'rake/tasklib'
11
11
  require 'random-port'
12
12
  require 'shellwords'
13
+ require 'securerandom'
13
14
  require 'tempfile'
14
15
  require 'yaml'
16
+ require 'waitutil'
15
17
  require_relative '../pgtk'
16
18
 
17
19
  # Pgsql rake task.
@@ -59,6 +61,10 @@ class Pgtk::PgsqlTask < Rake::TaskLib
59
61
  # @return [Hash]
60
62
  attr_accessor :config
61
63
 
64
+ # Use force docker
65
+ # @return [Boolean]
66
+ attr_accessor :force_docker
67
+
62
68
  # Initialize a new PostgreSQL server task.
63
69
  #
64
70
  # @param [Array] args Task arguments
@@ -85,12 +91,85 @@ class Pgtk::PgsqlTask < Rake::TaskLib
85
91
  private
86
92
 
87
93
  def run
94
+ local = qbash('postgres -V').start_with?('postgres') && qbash('initdb -V').start_with?('initdb')
95
+ docker = qbash('docker -v').start_with?('Docker')
96
+ raise 'You must have PostgreSQL or Docker installed locally' unless local && docker
97
+ raise 'You cannot force Docker to run, because it is not installed locally' if @force_docker && !docker
88
98
  raise "Option 'dir' is mandatory" unless @dir
89
99
  raise "Option 'yaml' is mandatory" unless @yaml
90
100
  home = File.expand_path(@dir)
91
101
  FileUtils.rm_rf(home) if @fresh_start
92
102
  raise "Directory/file #{home} is present, use fresh_start=true" if File.exist?(home)
93
103
  stdout = @quiet ? nil : $stdout
104
+ port = @port
105
+ if port.nil?
106
+ port = RandomPort::Pool::SINGLETON.acquire
107
+ puts "Random TCP port #{port} is used for PostgreSQL server" unless @quiet
108
+ else
109
+ puts "Required TCP port #{port} is used for PostgreSQL server" unless @quiet
110
+ end
111
+ if local && !@force_docker
112
+ pid = run_local(home, stdout, port)
113
+ place = "in process ##{pid}"
114
+ else
115
+ container = run_docker(home, stdout, port)
116
+ place = "in container #{container}"
117
+ end
118
+ File.write(
119
+ @yaml,
120
+ {
121
+ 'pgsql' => {
122
+ 'host' => 'localhost',
123
+ 'port' => port,
124
+ 'dbname' => @dbname,
125
+ 'user' => @user,
126
+ 'password' => @password,
127
+ 'url' => [
128
+ "jdbc:postgresql://localhost:#{port}/",
129
+ "#{CGI.escape(@dbname)}?user=#{CGI.escape(@user)}"
130
+ ].join
131
+ }
132
+ }.to_yaml
133
+ )
134
+ return if @quiet
135
+ puts "PostgreSQL has been started #{place}, port #{port}"
136
+ puts "YAML config saved to #{@yaml}"
137
+ end
138
+
139
+ def run_docker(home, stdout, port)
140
+ FileUtils.mkdir_p(home)
141
+ out =
142
+ qbash(
143
+ [
144
+ 'docker',
145
+ 'run',
146
+ '--name pgtk',
147
+ "--publish #{port}:5432",
148
+ "-e POSTGRES_USER=#{Shellwords.escape(@user)}",
149
+ "-e POSTGRES_PASSWORD=#{Shellwords.escape(@password)}",
150
+ "-e POSTGRES_DB=#{Shellwords.escape(@dbname)}",
151
+ '--detach',
152
+ '--rm',
153
+ 'postgres:18.1',
154
+ @config.map { |k, v| "-c #{Shellwords.escape("#{k}=#{v}")}" }
155
+ ],
156
+ log: stdout
157
+ )
158
+ container = out.scan(/[a-f0-9]+\Z/).first
159
+ File.write(File.join(home, 'docker-container'), container)
160
+ at_exit do
161
+ qbash("docker stop #{container}")
162
+ puts "PostgreSQL docker container #{container.inspect} was stopped" unless @quiet
163
+ end
164
+ begin
165
+ WaitUtil.wait_for_service('PG in Docker', 'localhost', port, timeout_sec: 10, delay_sec: 0.1)
166
+ rescue WaitUtil::TimeoutError => e
167
+ raise "Failed to start PostgreSQL Docker container #{container.inspect}: #{e.message}"
168
+ end
169
+ container
170
+ end
171
+
172
+ def run_local(home, stdout, port)
94
173
  Tempfile.open do |pwfile|
95
174
  File.write(pwfile.path, @password)
96
175
  qbash(
@@ -107,13 +186,6 @@ class Pgtk::PgsqlTask < Rake::TaskLib
107
186
  log: stdout
108
187
  )
109
188
  end
110
- port = @port
111
- if port.nil?
112
- port = RandomPort::Pool::SINGLETON.acquire
113
- puts "Random TCP port #{port} is used for PostgreSQL server" unless @quiet
114
- else
115
- puts "Required TCP port #{port} is used for PostgreSQL server" unless @quiet
116
- end
117
189
  cmd = [
118
190
  'postgres',
119
191
  '-k', Shellwords.escape(home),
@@ -131,19 +203,13 @@ class Pgtk::PgsqlTask < Rake::TaskLib
131
203
  qbash("kill -TERM #{pid}", log: stdout)
132
204
  puts "PostgreSQL killed in PID #{pid}" unless @quiet
133
205
  end
134
- attempt = 0
135
206
  begin
136
- TCPSocket.new('localhost', port)
137
- rescue StandardError => e
138
- sleep(0.1)
139
- attempt += 1
140
- if attempt > 50
141
- puts "+ #{cmd}"
142
- puts "stdout:\n#{File.read(File.join(home, 'stdout.txt'))}"
143
- puts "stderr:\n#{File.read(File.join(home, 'stderr.txt'))}"
144
- raise "Failed to start PostgreSQL database server on port #{port}: #{e.message}"
145
- end
146
- retry
207
+ WaitUtil.wait_for_service('PG in local', 'localhost', port, timeout_sec: 10, delay_sec: 0.1)
208
+ rescue WaitUtil::TimeoutError => e
209
+ puts "+ #{cmd}"
210
+ puts "stdout:\n#{File.read(File.join(home, 'stdout.txt'))}"
211
+ puts "stderr:\n#{File.read(File.join(home, 'stderr.txt'))}"
212
+ raise "Failed to start PostgreSQL database server on port #{port}: #{e.message}"
147
213
  end
148
214
  qbash(
149
215
  [
@@ -155,24 +221,6 @@ class Pgtk::PgsqlTask < Rake::TaskLib
155
221
  ],
156
222
  log: stdout
157
223
  )
158
- File.write(
159
- @yaml,
160
- {
161
- 'pgsql' => {
162
- 'host' => 'localhost',
163
- 'port' => port,
164
- 'dbname' => @dbname,
165
- 'user' => @user,
166
- 'password' => @password,
167
- 'url' => [
168
- "jdbc:postgresql://localhost:#{port}/",
169
- "#{CGI.escape(@dbname)}?user=#{CGI.escape(@user)}"
170
- ].join
171
- }
172
- }.to_yaml
173
- )
174
- return if @quiet
175
- puts "PostgreSQL has been started in process ##{pid}, port #{port}"
176
- puts "YAML config saved to #{@yaml}"
224
+ pid
177
225
  end
178
226
  end
data/lib/pgtk/version.rb CHANGED
@@ -11,5 +11,5 @@ require_relative '../pgtk'
11
11
  # License:: MIT
12
12
  module Pgtk
13
13
  # Current version of the library.
14
- VERSION = '0.29.0'
14
+ VERSION = '0.29.1'
15
15
  end
data/pgtk.gemspec CHANGED
@@ -35,5 +35,6 @@ Gem::Specification.new do |s|
35
35
  s.add_dependency 'qbash', '~>0.4'
36
36
  s.add_dependency 'random-port', '~>0.7'
37
37
  s.add_dependency 'tago', '~>0.1'
38
+ s.add_dependency 'waitutil', '~> 0.2'
38
39
  s.metadata['rubygems_mfa_required'] = 'true'
39
40
  end
data/resources/pom.xml CHANGED
@@ -30,6 +30,7 @@
30
30
  <configuration>
31
31
  <driver>org.postgresql.Driver</driver>
32
32
  <verbose>false</verbose>
33
+ <promptOnNonLocalDatabase>false</promptOnNonLocalDatabase>
33
34
  </configuration>
34
35
  <executions>
35
36
  <execution>
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pgtk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.29.0
4
+ version: 0.29.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yegor Bugayenko
@@ -135,6 +135,20 @@ dependencies:
135
135
  - - "~>"
136
136
  - !ruby/object:Gem::Version
137
137
  version: '0.1'
138
+ - !ruby/object:Gem::Dependency
139
+ name: waitutil
140
+ requirement: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - "~>"
143
+ - !ruby/object:Gem::Version
144
+ version: '0.2'
145
+ type: :runtime
146
+ prerelease: false
147
+ version_requirements: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - "~>"
150
+ - !ruby/object:Gem::Version
151
+ version: '0.2'
138
152
  description: This small Ruby gem helps you integrate PostgreSQL with your Ruby web
139
153
  app, through Liquibase. It also adds a simple connection pool and query processor,
140
154
  to make SQL manipulation simpler.