cknife 0.1.5 → 0.1.6

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 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: []