cknife 0.1.5 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 14209947e3be6f0beb5fcb80bbc9e6d949d3016e
4
+ data.tar.gz: 8f252a3c65e2457678ce467a4a423b330d8e078c
5
+ SHA512:
6
+ metadata.gz: c72064ad1f12de37de9a12b97d1e354e73e3b72921d171fba04deebd723607b9aa4013cef76cdb1b6ba6aeac6018bd568e55c5e40caf8f16f5b9fa03959acb0a
7
+ data.tar.gz: 7d0f4b2317cf17885daf81ca3be7d76fc2d7b8a7f385f9d6727c054d48f7340a8fb4006986ca9a039e2a5f5f52574a42b81cd31e47cff67bf92b215a2a85a979
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 1.9.3-p448
1
+ 2.0.0-p643
data/Gemfile CHANGED
@@ -1,22 +1,22 @@
1
1
  source "http://rubygems.org"
2
2
 
3
- gem "rest-client", '>= 1.6'
4
- gem "nokogiri", '>= 1.6'
5
- gem "i18n", "~> 0.6.0"
6
- gem "activesupport", '>= 3.0'
7
- gem "actionpack", '>= 3.0'
8
- gem "mail"
9
- gem "thor", '>= 0.14'
10
- gem "builder", '>= 3.0'
11
- gem "fog", '>= 1.15'
12
- gem "unf", '>= 0.1'
3
+ gem "rest-client", '>= 1.6', '~> 1'
4
+ gem "nokogiri", '>= 1.6', '~> 1'
5
+ gem "i18n", "~> 0"
6
+ gem "activesupport", '~> 3'
7
+ gem "actionpack", '~> 3'
8
+ gem "mail", '~> 2.4'
9
+ gem "thor", '>= 0.14', '~> 0'
10
+ gem "builder", '~> 3.0'
11
+ gem "fog", '>= 1.15', '<= 1.17'
12
+ gem "unf", '>= 0.1', '~> 0'
13
13
 
14
14
  # Add dependencies to develop your gem here.
15
15
  # Include everything needed to run rake, tests, features, etc.
16
16
  group :development do
17
17
  # gem "cknife", :path => "." # this arguably makes it easier to test quickly, locally.
18
18
  gem "bundler", "~> 1.0"
19
- gem "jeweler", ">= 2.0"
19
+ gem "jeweler", "~> 2.0"
20
20
  end
21
21
 
22
22
 
data/Gemfile.lock CHANGED
@@ -113,15 +113,18 @@ PLATFORMS
113
113
  ruby
114
114
 
115
115
  DEPENDENCIES
116
- actionpack (>= 3.0)
117
- activesupport (>= 3.0)
118
- builder (>= 3.0)
116
+ actionpack (~> 3)
117
+ activesupport (~> 3)
118
+ builder (~> 3.0)
119
119
  bundler (~> 1.0)
120
- fog (>= 1.15)
121
- i18n (~> 0.6.0)
122
- jeweler (>= 2.0)
123
- mail
124
- nokogiri (>= 1.6)
125
- rest-client (>= 1.6)
126
- thor (>= 0.14)
127
- unf (>= 0.1)
120
+ fog (>= 1.15, <= 1.17)
121
+ i18n (~> 0)
122
+ jeweler (~> 2.0)
123
+ mail (~> 2.4)
124
+ nokogiri (~> 1, >= 1.6)
125
+ rest-client (~> 1, >= 1.6)
126
+ thor (~> 0, >= 0.14)
127
+ unf (~> 0, >= 0.1)
128
+
129
+ BUNDLED WITH
130
+ 1.10.3
data/README.md CHANGED
@@ -194,6 +194,27 @@ switched to DNS Simple and don't use this much anymore.
194
194
  cknifezerigo help [TASK] # Describe available tasks or one specific task
195
195
  cknifezerigo list # List available host names.
196
196
 
197
+ # Postgre SQL Backups
198
+
199
+ This requires the following setup in the configuration:
200
+
201
+ pg:
202
+ host: localhost
203
+ database: dbname
204
+ username: dbuser
205
+ password: dbpassword
206
+
207
+ Setup Postgres credentials in a Rails-style configuration (in the same
208
+ cknife config file) and you can capture a snapshot of your database.
209
+
210
+ > bundle exec cknifepg help
211
+ Tasks:
212
+ cknifepg capture # Capture a dump of the database to db(current timestamp).dump.
213
+ cknifepg disconnect # Disconnect all sessions from the database. You must have a superuser configured for this to work.
214
+ cknifepg help [TASK] # Describe available tasks or one specific task
215
+ cknifepg restore # Restore a file. Use the one with the most recent mtime by default. Searches for db*.dump files in the CWD.
216
+ cknifepg sessions # List active sessions in this database and provide a string suitable for giving to kill for stopping those sessions.
217
+
197
218
  # Dub
198
219
 
199
220
  Like du, but sorts your output by size. This helps you determine
@@ -231,6 +252,18 @@ Make a gem release. This will generate a commit and a tag for v0.1.2.
231
252
 
232
253
  bundle exec rake release
233
254
 
255
+ You may also build a raw gem for testing installs without
256
+ releasing to Rubygems publically. Use scp
257
+ to move this .gem file to a machine you want to install
258
+ on:
259
+
260
+ bundle exec rake build
261
+
262
+ If a gem is already built, you can remove it with
263
+ something like the following:
264
+
265
+ rm pkg/cknife-0.1.6.gem
266
+
234
267
  ### Invoking commands without clobbering the gemspec
235
268
 
236
269
  You can uncommente the 'gem cknife' line in the Gemfile.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.5
1
+ 0.1.6
data/bin/cknifeaws CHANGED
@@ -5,6 +5,7 @@ require 'thor'
5
5
  require 'active_support/all'
6
6
  require 'zlib'
7
7
  require 'digest/md5'
8
+ require 'pathname'
8
9
 
9
10
  class Aws < Thor
10
11
 
data/bin/cknifepg ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'cknife/cknife_pg'
4
+
5
+ CKnifePg.start
data/cknife.gemspec CHANGED
@@ -2,17 +2,19 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
+ # stub: cknife 0.1.6 ruby lib
5
6
 
6
7
  Gem::Specification.new do |s|
7
8
  s.name = "cknife"
8
- s.version = "0.1.5"
9
+ s.version = "0.1.6"
9
10
 
10
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
12
+ s.require_paths = ["lib"]
11
13
  s.authors = ["Mike De La Loza"]
12
- s.date = "2014-09-07"
14
+ s.date = "2015-06-06"
13
15
  s.description = "Cali Army Knife, a collection of command line tools, especially for popular API services."
14
16
  s.email = "mikedll@mikedll.com"
15
- s.executables = ["cknifeaws", "cknifedub", "cknifemail", "cknifenowtimestamp", "cknifewcdir", "cknifezerigo"]
17
+ s.executables = ["cknifeaws", "cknifedub", "cknifemail", "cknifenowtimestamp", "cknifepg", "cknifewcdir", "cknifezerigo"]
16
18
  s.extra_rdoc_files = [
17
19
  "LICENSE",
18
20
  "README.md"
@@ -30,61 +32,62 @@ Gem::Specification.new do |s|
30
32
  "bin/cknifedub",
31
33
  "bin/cknifemail",
32
34
  "bin/cknifenowtimestamp",
35
+ "bin/cknifepg",
33
36
  "bin/cknifewcdir",
34
37
  "bin/cknifezerigo",
35
38
  "cknife.gemspec",
36
39
  "cknife.yml.sample",
40
+ "lib/cknife/cknife_pg.rb",
37
41
  "lib/cknife/config.rb"
38
42
  ]
39
43
  s.homepage = "http://github.com/mikedll/cali-army-knife"
40
44
  s.licenses = ["MIT"]
41
- s.require_paths = ["lib"]
42
- s.rubygems_version = "1.8.28"
45
+ s.rubygems_version = "2.4.7"
43
46
  s.summary = "Cali Army Knife"
44
47
 
45
48
  if s.respond_to? :specification_version then
46
- s.specification_version = 3
49
+ s.specification_version = 4
47
50
 
48
51
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
49
- s.add_runtime_dependency(%q<rest-client>, [">= 1.6"])
50
- s.add_runtime_dependency(%q<nokogiri>, [">= 1.6"])
51
- s.add_runtime_dependency(%q<i18n>, ["~> 0.6.0"])
52
- s.add_runtime_dependency(%q<activesupport>, [">= 3.0"])
53
- s.add_runtime_dependency(%q<actionpack>, [">= 3.0"])
54
- s.add_runtime_dependency(%q<mail>, [">= 0"])
55
- s.add_runtime_dependency(%q<thor>, [">= 0.14"])
56
- s.add_runtime_dependency(%q<builder>, [">= 3.0"])
57
- s.add_runtime_dependency(%q<fog>, [">= 1.15"])
58
- s.add_runtime_dependency(%q<unf>, [">= 0.1"])
52
+ s.add_runtime_dependency(%q<rest-client>, [">= 1.6", "~> 1"])
53
+ s.add_runtime_dependency(%q<nokogiri>, [">= 1.6", "~> 1"])
54
+ s.add_runtime_dependency(%q<i18n>, ["~> 0"])
55
+ s.add_runtime_dependency(%q<activesupport>, ["~> 3"])
56
+ s.add_runtime_dependency(%q<actionpack>, ["~> 3"])
57
+ s.add_runtime_dependency(%q<mail>, ["~> 2.4"])
58
+ s.add_runtime_dependency(%q<thor>, [">= 0.14", "~> 0"])
59
+ s.add_runtime_dependency(%q<builder>, ["~> 3.0"])
60
+ s.add_runtime_dependency(%q<fog>, ["<= 1.17", ">= 1.15"])
61
+ s.add_runtime_dependency(%q<unf>, [">= 0.1", "~> 0"])
59
62
  s.add_development_dependency(%q<bundler>, ["~> 1.0"])
60
- s.add_development_dependency(%q<jeweler>, [">= 2.0"])
63
+ s.add_development_dependency(%q<jeweler>, ["~> 2.0"])
61
64
  else
62
- s.add_dependency(%q<rest-client>, [">= 1.6"])
63
- s.add_dependency(%q<nokogiri>, [">= 1.6"])
64
- s.add_dependency(%q<i18n>, ["~> 0.6.0"])
65
- s.add_dependency(%q<activesupport>, [">= 3.0"])
66
- s.add_dependency(%q<actionpack>, [">= 3.0"])
67
- s.add_dependency(%q<mail>, [">= 0"])
68
- s.add_dependency(%q<thor>, [">= 0.14"])
69
- s.add_dependency(%q<builder>, [">= 3.0"])
70
- s.add_dependency(%q<fog>, [">= 1.15"])
71
- s.add_dependency(%q<unf>, [">= 0.1"])
65
+ s.add_dependency(%q<rest-client>, [">= 1.6", "~> 1"])
66
+ s.add_dependency(%q<nokogiri>, [">= 1.6", "~> 1"])
67
+ s.add_dependency(%q<i18n>, ["~> 0"])
68
+ s.add_dependency(%q<activesupport>, ["~> 3"])
69
+ s.add_dependency(%q<actionpack>, ["~> 3"])
70
+ s.add_dependency(%q<mail>, ["~> 2.4"])
71
+ s.add_dependency(%q<thor>, [">= 0.14", "~> 0"])
72
+ s.add_dependency(%q<builder>, ["~> 3.0"])
73
+ s.add_dependency(%q<fog>, ["<= 1.17", ">= 1.15"])
74
+ s.add_dependency(%q<unf>, [">= 0.1", "~> 0"])
72
75
  s.add_dependency(%q<bundler>, ["~> 1.0"])
73
- s.add_dependency(%q<jeweler>, [">= 2.0"])
76
+ s.add_dependency(%q<jeweler>, ["~> 2.0"])
74
77
  end
75
78
  else
76
- s.add_dependency(%q<rest-client>, [">= 1.6"])
77
- s.add_dependency(%q<nokogiri>, [">= 1.6"])
78
- s.add_dependency(%q<i18n>, ["~> 0.6.0"])
79
- s.add_dependency(%q<activesupport>, [">= 3.0"])
80
- s.add_dependency(%q<actionpack>, [">= 3.0"])
81
- s.add_dependency(%q<mail>, [">= 0"])
82
- s.add_dependency(%q<thor>, [">= 0.14"])
83
- s.add_dependency(%q<builder>, [">= 3.0"])
84
- s.add_dependency(%q<fog>, [">= 1.15"])
85
- s.add_dependency(%q<unf>, [">= 0.1"])
79
+ s.add_dependency(%q<rest-client>, [">= 1.6", "~> 1"])
80
+ s.add_dependency(%q<nokogiri>, [">= 1.6", "~> 1"])
81
+ s.add_dependency(%q<i18n>, ["~> 0"])
82
+ s.add_dependency(%q<activesupport>, ["~> 3"])
83
+ s.add_dependency(%q<actionpack>, ["~> 3"])
84
+ s.add_dependency(%q<mail>, ["~> 2.4"])
85
+ s.add_dependency(%q<thor>, [">= 0.14", "~> 0"])
86
+ s.add_dependency(%q<builder>, ["~> 3.0"])
87
+ s.add_dependency(%q<fog>, ["<= 1.17", ">= 1.15"])
88
+ s.add_dependency(%q<unf>, [">= 0.1", "~> 0"])
86
89
  s.add_dependency(%q<bundler>, ["~> 1.0"])
87
- s.add_dependency(%q<jeweler>, [">= 2.0"])
90
+ s.add_dependency(%q<jeweler>, ["~> 2.0"])
88
91
  end
89
92
  end
90
93
 
data/cknife.yml.sample CHANGED
@@ -11,3 +11,9 @@ mail:
11
11
  password: MYSESpassword
12
12
  domain: mydomain.com
13
13
 
14
+ pg:
15
+ host: localhost
16
+ database: dbname
17
+ username: dbuser
18
+ password: dbpassword
19
+
@@ -0,0 +1,161 @@
1
+ require 'open3'
2
+ require 'thor'
3
+ require 'cknife/config'
4
+
5
+ class CKnifePg < Thor
6
+
7
+ no_tasks do
8
+ def config
9
+ @config ||= CKnife::Config
10
+ end
11
+
12
+ def conf
13
+ @conf ||= {
14
+ :host => config['pg.host'] || "localhost",
15
+ :port => config['pg.port'] || 5432,
16
+ :database => config['pg.database'],
17
+ :username => config['pg.username'],
18
+ :password => config['pg.password']
19
+ }
20
+ end
21
+
22
+ def connection_options
23
+ "-h #{conf[:host]} -p #{conf[:port]} -U #{conf[:username]} --no-password"
24
+ end
25
+
26
+ def psql_invocation
27
+ "psql #{connection_options} -d #{conf[:database]} --no-align --tuples-only"
28
+ end
29
+
30
+ def pg_pass_file
31
+ @pg_pass_file = ".pgpass"
32
+ end
33
+
34
+ def pg_pass_file_execute(cmd, input = nil)
35
+ return if !@session_ok
36
+ puts cmd
37
+ stdin, stdout, stderr, wait_thread = Open3.popen3({'PGPASSFILE' => pg_pass_file}, cmd)
38
+ if input
39
+ puts input
40
+ stdin.write input
41
+ stdin.close
42
+ end
43
+ output = stdout.read
44
+ output += stderr.read
45
+ $stdout.write output
46
+ stdout.close
47
+ stderr.close
48
+ result = wait_thread.value.to_i
49
+ @session_ok = @session_ok && (result == 0)
50
+ yield if block_given?
51
+ output
52
+ end
53
+
54
+ def with_pg_pass_file
55
+ if @session_live
56
+ return yield
57
+ end
58
+
59
+ @session_live = true
60
+ @session_ok = true
61
+
62
+ if File.exists?(pg_pass_file)
63
+ say("This generates a pgpass file but one is already on disk. Exiting.")
64
+ return
65
+ end
66
+
67
+ # pgpass format
68
+ File.open(pg_pass_file, "w", 0600) { |f| f.write "#{conf[:host]}:#{conf[:port]}:*:#{conf[:username]}:#{conf[:password]}" }
69
+
70
+ result = yield
71
+
72
+ FileUtils.rm(pg_pass_file)
73
+ if File.exists?(pg_pass_file)
74
+ say("Failed to remove pg_pass file. Please remove it for security purposes.")
75
+ end
76
+
77
+ say
78
+ say("Command failed.", :red) if !@session_ok
79
+ @session_live = false
80
+
81
+ result
82
+ end
83
+ end
84
+
85
+ desc "disconnect", "Disconnect all sessions from the database. You must have a superuser configured for this to work."
86
+ def disconnect
87
+ with_pg_pass_file do
88
+ my_pid = pg_pass_file_execute(psql_invocation, "select pg_backend_pid();").split.first
89
+ ids = pg_pass_file_execute(psql_invocation, "SELECT procpid FROM pg_stat_activity WHERE datname = '#{conf[:database]}' AND procpid != #{my_pid};")
90
+ ids.split.each do |pid|
91
+ pg_pass_file_execute(psql_invocation, "select pg_terminate_backend(#{pid});")
92
+ end
93
+ end
94
+ end
95
+
96
+ desc "capture", "Capture a dump of the database to db(current timestamp).dump."
97
+ def capture
98
+ file_name = "db" + Time.now.strftime("%Y%m%d%H%M%S") + ".dump"
99
+
100
+ with_pg_pass_file do
101
+ pg_pass_file_execute("pg_dump -Fc --no-owner #{connection_options} -f #{file_name} #{conf[:database]}") do
102
+ say("Captured #{file_name}.")
103
+ end
104
+ end
105
+ end
106
+
107
+ desc "sessions", "List active sessions in this database and provide a string suitable for giving to kill for stopping those sessions."
108
+ def sessions
109
+ with_pg_pass_file do
110
+ my_pid = pg_pass_file_execute(psql_invocation, "select pg_backend_pid();").split.first
111
+ ids_output = pg_pass_file_execute(psql_invocation, "SELECT procpid, application_name FROM pg_stat_activity WHERE datname = '#{conf[:database]}' AND procpid != #{my_pid};")
112
+ table = ids_output.split.map { |line| line.split("|") }
113
+ print_table([["PID", "Application Name"]] + table, :indent => 2)
114
+ ids = table.map { |row| row.first }
115
+
116
+ say("If you would like to kill these sessions, you can do so with this command:")
117
+ say("kill -9 #{ids.join(' ')}")
118
+ end
119
+ end
120
+
121
+ desc "restore", "Restore a file. Use the one with the most recent mtime by default. Searches for db*.dump files in the CWD."
122
+ method_options :filename => nil
123
+ def restore
124
+ to_restore = options[:filename] if options[:filename]
125
+ if to_restore.nil?
126
+ files = Dir["db*.dump"]
127
+ with_mtime = files.map { |f| [f, File.mtime(f)] }
128
+ with_mtime.sort! { |a,b| a.last <=> b.last }
129
+ files = with_mtime.map(&:first)
130
+ to_restore = files.last
131
+ end
132
+
133
+ if to_restore.nil?
134
+ say("No backups file to restore. None given on the command line and none could be found in the CWD.", :red)
135
+ return
136
+ else
137
+ if !yes?("Restore #{to_restore}?", :green)
138
+ return
139
+ end
140
+ end
141
+
142
+ with_pg_pass_file do
143
+ output = pg_pass_file_execute("dropdb #{connection_options} #{conf[:database]}")
144
+
145
+ if !@session_ok
146
+ if output.split("\n").any? { |s| s =~ /There are [0-9]+ other session\(s\) using the database./ }
147
+ say
148
+ say("Other sessions are blocking the database from being dropped.")
149
+ say("You may want to terminate these sessions and try again. See the 'sessions' command.")
150
+ end
151
+ else
152
+ say("Doing restore...")
153
+
154
+ pg_pass_file_execute("createdb -T template0 #{connection_options} #{conf[:database]}")
155
+ pg_pass_file_execute("pg_restore -n public --no-privileges --no-owner #{connection_options} -d #{conf[:database]} #{to_restore}") do
156
+ say("Restored #{to_restore}")
157
+ end
158
+ end
159
+ end
160
+ end
161
+ end
data/lib/cknife/config.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require 'action_view'
2
+ require 'pathname'
2
3
 
3
4
  module CKnife
4
5
  class Formatter
metadata CHANGED
@@ -1,180 +1,188 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cknife
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
5
- prerelease:
4
+ version: 0.1.6
6
5
  platform: ruby
7
6
  authors:
8
7
  - Mike De La Loza
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2014-09-07 00:00:00.000000000 Z
11
+ date: 2015-06-06 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: rest-client
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - '>='
20
18
  - !ruby/object:Gem::Version
21
19
  version: '1.6'
20
+ - - ~>
21
+ - !ruby/object:Gem::Version
22
+ version: '1'
22
23
  type: :runtime
23
24
  prerelease: false
24
25
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
26
  requirements:
27
- - - ! '>='
27
+ - - '>='
28
28
  - !ruby/object:Gem::Version
29
29
  version: '1.6'
30
+ - - ~>
31
+ - !ruby/object:Gem::Version
32
+ version: '1'
30
33
  - !ruby/object:Gem::Dependency
31
34
  name: nokogiri
32
35
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
36
  requirements:
35
- - - ! '>='
37
+ - - '>='
36
38
  - !ruby/object:Gem::Version
37
39
  version: '1.6'
40
+ - - ~>
41
+ - !ruby/object:Gem::Version
42
+ version: '1'
38
43
  type: :runtime
39
44
  prerelease: false
40
45
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
46
  requirements:
43
- - - ! '>='
47
+ - - '>='
44
48
  - !ruby/object:Gem::Version
45
49
  version: '1.6'
50
+ - - ~>
51
+ - !ruby/object:Gem::Version
52
+ version: '1'
46
53
  - !ruby/object:Gem::Dependency
47
54
  name: i18n
48
55
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
56
  requirements:
51
57
  - - ~>
52
58
  - !ruby/object:Gem::Version
53
- version: 0.6.0
59
+ version: '0'
54
60
  type: :runtime
55
61
  prerelease: false
56
62
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
63
  requirements:
59
64
  - - ~>
60
65
  - !ruby/object:Gem::Version
61
- version: 0.6.0
66
+ version: '0'
62
67
  - !ruby/object:Gem::Dependency
63
68
  name: activesupport
64
69
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
70
  requirements:
67
- - - ! '>='
71
+ - - ~>
68
72
  - !ruby/object:Gem::Version
69
- version: '3.0'
73
+ version: '3'
70
74
  type: :runtime
71
75
  prerelease: false
72
76
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
77
  requirements:
75
- - - ! '>='
78
+ - - ~>
76
79
  - !ruby/object:Gem::Version
77
- version: '3.0'
80
+ version: '3'
78
81
  - !ruby/object:Gem::Dependency
79
82
  name: actionpack
80
83
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
84
  requirements:
83
- - - ! '>='
85
+ - - ~>
84
86
  - !ruby/object:Gem::Version
85
- version: '3.0'
87
+ version: '3'
86
88
  type: :runtime
87
89
  prerelease: false
88
90
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
91
  requirements:
91
- - - ! '>='
92
+ - - ~>
92
93
  - !ruby/object:Gem::Version
93
- version: '3.0'
94
+ version: '3'
94
95
  - !ruby/object:Gem::Dependency
95
96
  name: mail
96
97
  requirement: !ruby/object:Gem::Requirement
97
- none: false
98
98
  requirements:
99
- - - ! '>='
99
+ - - ~>
100
100
  - !ruby/object:Gem::Version
101
- version: '0'
101
+ version: '2.4'
102
102
  type: :runtime
103
103
  prerelease: false
104
104
  version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
105
  requirements:
107
- - - ! '>='
106
+ - - ~>
108
107
  - !ruby/object:Gem::Version
109
- version: '0'
108
+ version: '2.4'
110
109
  - !ruby/object:Gem::Dependency
111
110
  name: thor
112
111
  requirement: !ruby/object:Gem::Requirement
113
- none: false
114
112
  requirements:
115
- - - ! '>='
113
+ - - '>='
116
114
  - !ruby/object:Gem::Version
117
115
  version: '0.14'
116
+ - - ~>
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
118
119
  type: :runtime
119
120
  prerelease: false
120
121
  version_requirements: !ruby/object:Gem::Requirement
121
- none: false
122
122
  requirements:
123
- - - ! '>='
123
+ - - '>='
124
124
  - !ruby/object:Gem::Version
125
125
  version: '0.14'
126
+ - - ~>
127
+ - !ruby/object:Gem::Version
128
+ version: '0'
126
129
  - !ruby/object:Gem::Dependency
127
130
  name: builder
128
131
  requirement: !ruby/object:Gem::Requirement
129
- none: false
130
132
  requirements:
131
- - - ! '>='
133
+ - - ~>
132
134
  - !ruby/object:Gem::Version
133
135
  version: '3.0'
134
136
  type: :runtime
135
137
  prerelease: false
136
138
  version_requirements: !ruby/object:Gem::Requirement
137
- none: false
138
139
  requirements:
139
- - - ! '>='
140
+ - - ~>
140
141
  - !ruby/object:Gem::Version
141
142
  version: '3.0'
142
143
  - !ruby/object:Gem::Dependency
143
144
  name: fog
144
145
  requirement: !ruby/object:Gem::Requirement
145
- none: false
146
146
  requirements:
147
- - - ! '>='
147
+ - - <=
148
+ - !ruby/object:Gem::Version
149
+ version: '1.17'
150
+ - - '>='
148
151
  - !ruby/object:Gem::Version
149
152
  version: '1.15'
150
153
  type: :runtime
151
154
  prerelease: false
152
155
  version_requirements: !ruby/object:Gem::Requirement
153
- none: false
154
156
  requirements:
155
- - - ! '>='
157
+ - - <=
158
+ - !ruby/object:Gem::Version
159
+ version: '1.17'
160
+ - - '>='
156
161
  - !ruby/object:Gem::Version
157
162
  version: '1.15'
158
163
  - !ruby/object:Gem::Dependency
159
164
  name: unf
160
165
  requirement: !ruby/object:Gem::Requirement
161
- none: false
162
166
  requirements:
163
- - - ! '>='
167
+ - - '>='
164
168
  - !ruby/object:Gem::Version
165
169
  version: '0.1'
170
+ - - ~>
171
+ - !ruby/object:Gem::Version
172
+ version: '0'
166
173
  type: :runtime
167
174
  prerelease: false
168
175
  version_requirements: !ruby/object:Gem::Requirement
169
- none: false
170
176
  requirements:
171
- - - ! '>='
177
+ - - '>='
172
178
  - !ruby/object:Gem::Version
173
179
  version: '0.1'
180
+ - - ~>
181
+ - !ruby/object:Gem::Version
182
+ version: '0'
174
183
  - !ruby/object:Gem::Dependency
175
184
  name: bundler
176
185
  requirement: !ruby/object:Gem::Requirement
177
- none: false
178
186
  requirements:
179
187
  - - ~>
180
188
  - !ruby/object:Gem::Version
@@ -182,7 +190,6 @@ dependencies:
182
190
  type: :development
183
191
  prerelease: false
184
192
  version_requirements: !ruby/object:Gem::Requirement
185
- none: false
186
193
  requirements:
187
194
  - - ~>
188
195
  - !ruby/object:Gem::Version
@@ -190,17 +197,15 @@ dependencies:
190
197
  - !ruby/object:Gem::Dependency
191
198
  name: jeweler
192
199
  requirement: !ruby/object:Gem::Requirement
193
- none: false
194
200
  requirements:
195
- - - ! '>='
201
+ - - ~>
196
202
  - !ruby/object:Gem::Version
197
203
  version: '2.0'
198
204
  type: :development
199
205
  prerelease: false
200
206
  version_requirements: !ruby/object:Gem::Requirement
201
- none: false
202
207
  requirements:
203
- - - ! '>='
208
+ - - ~>
204
209
  - !ruby/object:Gem::Version
205
210
  version: '2.0'
206
211
  description: Cali Army Knife, a collection of command line tools, especially for popular
@@ -211,6 +216,7 @@ executables:
211
216
  - cknifedub
212
217
  - cknifemail
213
218
  - cknifenowtimestamp
219
+ - cknifepg
214
220
  - cknifewcdir
215
221
  - cknifezerigo
216
222
  extensions: []
@@ -230,37 +236,35 @@ files:
230
236
  - bin/cknifedub
231
237
  - bin/cknifemail
232
238
  - bin/cknifenowtimestamp
239
+ - bin/cknifepg
233
240
  - bin/cknifewcdir
234
241
  - bin/cknifezerigo
235
242
  - cknife.gemspec
236
243
  - cknife.yml.sample
244
+ - lib/cknife/cknife_pg.rb
237
245
  - lib/cknife/config.rb
238
246
  homepage: http://github.com/mikedll/cali-army-knife
239
247
  licenses:
240
248
  - MIT
249
+ metadata: {}
241
250
  post_install_message:
242
251
  rdoc_options: []
243
252
  require_paths:
244
253
  - lib
245
254
  required_ruby_version: !ruby/object:Gem::Requirement
246
- none: false
247
255
  requirements:
248
- - - ! '>='
256
+ - - '>='
249
257
  - !ruby/object:Gem::Version
250
258
  version: '0'
251
- segments:
252
- - 0
253
- hash: 1454050378644929282
254
259
  required_rubygems_version: !ruby/object:Gem::Requirement
255
- none: false
256
260
  requirements:
257
- - - ! '>='
261
+ - - '>='
258
262
  - !ruby/object:Gem::Version
259
263
  version: '0'
260
264
  requirements: []
261
265
  rubyforge_project:
262
- rubygems_version: 1.8.28
266
+ rubygems_version: 2.4.7
263
267
  signing_key:
264
- specification_version: 3
268
+ specification_version: 4
265
269
  summary: Cali Army Knife
266
270
  test_files: []