pasqual 0.1.3 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +6 -0
- data/bin/pasqual +6 -0
- data/lib/pasqual/cli.rb +118 -0
- data/lib/pasqual/version.rb +1 -1
- data/pasqual.gemspec +1 -0
- metadata +20 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 63f57b1365c84d913c39985c0673762ba445638f
|
4
|
+
data.tar.gz: 317c78bc15c24a6deb002976a0987b1bcd3b9d03
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a489963175a7d98be65d4eac1f9855bccf3040150be608d9cae3d3515c0f947e18ba998dd82d351949ff910c835f1d046d07f1de52c6dd75167ded514f1685c9
|
7
|
+
data.tar.gz: 5e6ad4fe9c88ca80bd60f499f55139b0299fc9a69e2b37a03945f8b3799af2bb07a4d0e9e3b7ee829799b9b1c13d7c1533a987673816f959c40b10cec27f904c
|
data/CHANGELOG
CHANGED
data/bin/pasqual
ADDED
data/lib/pasqual/cli.rb
ADDED
@@ -0,0 +1,118 @@
|
|
1
|
+
require 'thor'
|
2
|
+
|
3
|
+
require 'pasqual'
|
4
|
+
|
5
|
+
module Pasqual
|
6
|
+
class CLI < Thor
|
7
|
+
def self.exit_on_failure?
|
8
|
+
true
|
9
|
+
end
|
10
|
+
|
11
|
+
desc "create DATABASE_URL", "create database"
|
12
|
+
def create(url = nil)
|
13
|
+
puts "Creating #{pasqual(url).name}"
|
14
|
+
pasqual(url).createdb
|
15
|
+
rescue Pasqual::Createdb::AlreadyExists
|
16
|
+
puts "#{pasqual(url).name} already exists, skipped creation"
|
17
|
+
end
|
18
|
+
|
19
|
+
desc "drop DATABASE_URL", "drop database"
|
20
|
+
def drop(url = nil)
|
21
|
+
puts "Dropping #{pasqual(url).name}"
|
22
|
+
pasqual(url).dropdb
|
23
|
+
rescue Pasqual::Dropdb::Failed
|
24
|
+
puts "Could not drop #{pasqual(url).name}, skipped"
|
25
|
+
end
|
26
|
+
|
27
|
+
desc "poll DATABASE_URL", "poll for the existence of a database server"
|
28
|
+
def poll(url = nil)
|
29
|
+
say "Waiting for Postgres to come available"
|
30
|
+
if attempt_connect(url)
|
31
|
+
say "Connected!"
|
32
|
+
exit 0
|
33
|
+
else
|
34
|
+
say "Failed to connect"
|
35
|
+
exit 1
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
desc "reset [SQL_FILE] [DATABASE_URL]", "drop, create, structure"
|
40
|
+
def reset(path = nil, url = nil)
|
41
|
+
drop(url)
|
42
|
+
create(url)
|
43
|
+
file(path, url) if path
|
44
|
+
end
|
45
|
+
|
46
|
+
desc "psql [SQL] [DATABASE_URL]", "start a psql console or run an SQL statement"
|
47
|
+
def psql(*cmd_args)
|
48
|
+
url = nil
|
49
|
+
sql_args = []
|
50
|
+
cmd_args.each do |arg|
|
51
|
+
if arg =~ /postgres:/
|
52
|
+
url = arg
|
53
|
+
else
|
54
|
+
sql_args << arg
|
55
|
+
end
|
56
|
+
end
|
57
|
+
db = pasqual(url)
|
58
|
+
args = Pasqual::Arglist.
|
59
|
+
args(db.username, db.password, db.host, db.port, db.name)
|
60
|
+
if sql_args.any?
|
61
|
+
args << '-c'
|
62
|
+
args += sql_args.map(&:inspect)
|
63
|
+
puts "Executing in #{db.name}: #{sql_args.inspect}"
|
64
|
+
else
|
65
|
+
cmd = "psql #{args.join(' ')}"
|
66
|
+
end
|
67
|
+
puts "Running #{cmd}"
|
68
|
+
Kernel.exec({ 'PGPASSWORD' => db.password }, "psql #{args.join(' ')}")
|
69
|
+
end
|
70
|
+
|
71
|
+
|
72
|
+
desc "file PATH [DATABASE_URL]", "execute an SQL script in a file"
|
73
|
+
def file(path, url = nil)
|
74
|
+
puts "Structuring #{pasqual(url).name}"
|
75
|
+
pasqual(url).pipe_sql path
|
76
|
+
rescue Errno::EPIPE
|
77
|
+
puts "#{pasqual(url).name} doesn't exist, skipped structure"
|
78
|
+
end
|
79
|
+
|
80
|
+
private
|
81
|
+
|
82
|
+
def pasqual(url)
|
83
|
+
@pasqual ||= Pasqual.for(url || ENV['DATABASE_URL'])
|
84
|
+
end
|
85
|
+
|
86
|
+
def pg_connection(url, no_db: false)
|
87
|
+
db = pasqual(url)
|
88
|
+
conn = PG::Connection.connect_start(
|
89
|
+
host: db.host,
|
90
|
+
port: db.port,
|
91
|
+
dbname: no_db ? nil : db.name,
|
92
|
+
user: db.username,
|
93
|
+
password: db.password,
|
94
|
+
connect_timeout: (60 * 5))
|
95
|
+
end
|
96
|
+
|
97
|
+
def attempt_connect(url)
|
98
|
+
require 'pg'
|
99
|
+
|
100
|
+
timeout = Time.now.to_i + (60 * 5)
|
101
|
+
|
102
|
+
# Don't connect to a specific database because we may be polling the
|
103
|
+
# the server to know whether we can _create_ a database yet.
|
104
|
+
conn = pg_connection(url, no_db: true)
|
105
|
+
status = conn.connect_poll
|
106
|
+
while(Time.now.to_i < timeout && status != PG::PGRES_POLLING_OK) do
|
107
|
+
sleep 2
|
108
|
+
status = conn.connect_poll
|
109
|
+
|
110
|
+
conn = pg_connection(url, no_db: true) if status == PG::PGRES_POLLING_FAILED
|
111
|
+
puts "Status: #{status.inspect}, Timeout: #{Time.now.to_i - timeout}" if ENV['DEBUG']
|
112
|
+
end
|
113
|
+
conn.finish
|
114
|
+
status == PG::PGRES_POLLING_OK
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
118
|
+
end
|
data/lib/pasqual/version.rb
CHANGED
data/pasqual.gemspec
CHANGED
@@ -19,6 +19,7 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
21
|
spec.add_runtime_dependency "childprocess", "~> 0.5"
|
22
|
+
spec.add_runtime_dependency "thor", "~> 0.5"
|
22
23
|
|
23
24
|
spec.add_development_dependency "bundler", "~> 1.6"
|
24
25
|
spec.add_development_dependency "rake", "~> 10.0"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pasqual
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Derek Kastner
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-05-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: childprocess
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0.5'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: thor
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0.5'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0.5'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: bundler
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -70,7 +84,8 @@ description: Shortcuts for postgres commands, with option to use ENV-configured
|
|
70
84
|
URLs
|
71
85
|
email:
|
72
86
|
- dkastner@gmail.com
|
73
|
-
executables:
|
87
|
+
executables:
|
88
|
+
- pasqual
|
74
89
|
extensions: []
|
75
90
|
extra_rdoc_files: []
|
76
91
|
files:
|
@@ -81,8 +96,10 @@ files:
|
|
81
96
|
- LICENSE.txt
|
82
97
|
- README.md
|
83
98
|
- Rakefile
|
99
|
+
- bin/pasqual
|
84
100
|
- lib/pasqual.rb
|
85
101
|
- lib/pasqual/arglist.rb
|
102
|
+
- lib/pasqual/cli.rb
|
86
103
|
- lib/pasqual/command.rb
|
87
104
|
- lib/pasqual/createdb.rb
|
88
105
|
- lib/pasqual/database.rb
|