cknife 1.3.0 → 1.4.1

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
- SHA1:
3
- metadata.gz: 8e24f7e41e3ed98f6d61a0d360b26f096862b121
4
- data.tar.gz: fa9e6591fa5c4ac455e161f8a0766c254fb3aa56
2
+ SHA256:
3
+ metadata.gz: e37b17c77acd0b4e3061acda6e7006191c5b273ebd4ece0a4c1684a200372238
4
+ data.tar.gz: 298ff9070254761d827c2c76e9bfa61f28b86415e8a313f6cb70793bc7688185
5
5
  SHA512:
6
- metadata.gz: 8678596a96eeff55e41a21af3c1b6ac27ed1c5749451c839e33d9051041c507bd17668c548049fce8588126a26d3f9ad2789ebb2755cf267156fcc807481a255
7
- data.tar.gz: 1510e3040a671d69d988f3cbfa7c0631f9ab68601b40d3aa1593bd1024995b70e4e39c677fea89ceaa172a35d5a8ada9124bb681606a0a5aaa802f6fb8635996
6
+ metadata.gz: e39607eff2db2b6648819c57af80575a64b7f3c912b2b6ceb86edb001d26c33dd5b0c07da2c585695ca8942b3c78fa49600442686162aaf052d8b72e51c4dec7
7
+ data.tar.gz: 0b2dd211a8216da414727601b60ac91c2570c7b8164791707d6f469b5882479fa38362d8d19ff74337ebbbdc4dfbd73626195fdc6ecb1811083a1affc6f300ce
data/Gemfile CHANGED
@@ -1,7 +1,7 @@
1
1
  source "http://rubygems.org"
2
2
 
3
3
  gem "rest-client", '>= 1.8.0', '~> 1'
4
- gem "nokogiri", '>= 1.8.2', '~> 1'
4
+ gem "nokogiri", ">= 1.10.4", '~> 1'
5
5
  gem "i18n", '>= 0.6.6'
6
6
  gem "activesupport", '>= 4.2.9'
7
7
  gem "actionpack", '>= 4.2.9'
@@ -11,6 +11,7 @@ gem "builder", '~> 3.0'
11
11
  gem "fog-aws", '< 3.0'
12
12
  gem "unf", '>= 0.1', '~> 0'
13
13
  gem "daemons"
14
+ gem 'loofah', '~> 2.2.3'
14
15
 
15
16
  # Add dependencies to develop your gem here.
16
17
  # Include everything needed to run rake, tests, features, etc.
@@ -75,21 +75,21 @@ GEM
75
75
  rdoc
76
76
  semver2
77
77
  jwt (1.5.6)
78
- loofah (2.2.2)
78
+ loofah (2.2.3)
79
79
  crass (~> 1.0.2)
80
80
  nokogiri (>= 1.5.9)
81
81
  mail (2.5.5)
82
82
  mime-types (~> 1.16)
83
83
  treetop (~> 1.4.8)
84
84
  mime-types (1.25.1)
85
- mini_portile2 (2.3.0)
85
+ mini_portile2 (2.4.0)
86
86
  minitest (5.11.3)
87
87
  multi_json (1.13.1)
88
88
  multi_xml (0.6.0)
89
89
  multipart-post (2.0.0)
90
90
  netrc (0.11.0)
91
- nokogiri (1.8.5)
92
- mini_portile2 (~> 2.3.0)
91
+ nokogiri (1.10.4)
92
+ mini_portile2 (~> 2.4.0)
93
93
  oauth2 (1.4.0)
94
94
  faraday (>= 0.8, < 0.13)
95
95
  jwt (~> 1.0)
@@ -139,11 +139,12 @@ DEPENDENCIES
139
139
  fog-aws (< 3.0)
140
140
  i18n (>= 0.6.6)
141
141
  jeweler (~> 2.1)
142
+ loofah (~> 2.2.3)
142
143
  mail (~> 2.5.5)
143
- nokogiri (~> 1, >= 1.8.2)
144
+ nokogiri (~> 1, >= 1.10.4)
144
145
  rest-client (~> 1, >= 1.8.0)
145
146
  thor (~> 0, >= 0.14)
146
147
  unf (~> 0, >= 0.1)
147
148
 
148
149
  BUNDLED WITH
149
- 1.16.5
150
+ 1.16.6
data/README.md CHANGED
@@ -1,4 +1,6 @@
1
1
 
2
+ [![Gem Version](https://badge.fury.io/rb/cknife.svg)](https://badge.fury.io/rb/cknife)
3
+
2
4
  # Quickstart
3
5
 
4
6
  cknife is a set of command line tools. They...do different things.
@@ -21,66 +23,13 @@ named `your-bucket-name`.
21
23
 
22
24
  > cknifeaws afew my-bucket --count=50
23
25
 
24
- That will show you 50 of them.
25
-
26
- # Why bother?
27
-
28
- What do you do when you don't want to write
29
- [bash](https://www.tldp.org/LDP/Bash-Beginners-Guide/html/Bash-Beginners-Guide.html),
30
- your `.bash_profile` already has more aliases than you can manage, and
31
- yet you still find it silly to be going to the same [old documentation
32
- websites](https://www.postgresql.org/docs/9.5/static/backup-dump.html)
33
- for things you are certain you once knew how to do?
34
-
35
- Well, you can write a script in something other than
36
- bash to automate the precise command line invocation
37
- that you used to accomplish a task. But when you
38
- move to a different project, how can you take your
39
- scripts with you? Why not design your scripts
40
- to be robust enough so that they are conventional?
41
-
42
- Why can't a [Stackoverflow](https://stackoverflow.com) question's
43
- answer be captured in a form that can be configured and called by you
44
- (or someone who was in your position before), so that you don't have
45
- to enter the same question into
46
- [google.com](https://www.google.com/?q=LOL%20HALP%20ME%20CODE) again
47
- later down the road?
48
-
49
- Why make a browser bookmark if you can skip the browser entirely?
50
- It's not like the browser bookmark can compile the answer into machine
51
- code for you, anyway.
52
-
53
- If someone turns the answer into a programmed tool, what if your IDE
54
- is no better than the command line when it comes to invoking it?
55
-
56
- I created cknife to have a set of scripts to fall back on when
57
- confronted with the above encounter I've been having for years. cknife
58
- is a toolset that encapsulates common command line expressions that
59
- developers use when at work.
60
-
61
- I've never used [chef](https://www.chef.io), but were I to grow
62
- cknife, I wouldn't be surprised to see it overlap with it.
63
-
64
- cknife currently has some wrappers around Amazon's EC2 and S3
65
- services. It has others around MySQL and PostgreSQL. It has a trivial
66
- one around [du](http://man7.org/linux/man-pages/man1/du.1.html). The
67
- `cknifemon` tool, meanwhile, is a daemon that can launch PUT HTTP
68
- requests to an endpoint you configure, on a schedule.
69
-
70
- It can be used for system administration, but it can be also be used
71
- to aid developers as they acclimate themselves to a piece of
72
- technology with which they may not be familiar, and for which
73
- documentation may be a little scattered. It can be used
74
- to bang on a piece of technology for the sake of your own
75
- learning, too.
76
-
77
- To be precise, cknife consists of command line executables. These
78
- tools often require more information from the user, which can be put
79
- into a configuration file, `cknife.yml`, in YAML format, and found by
80
- cknife in the current working directory ($CWD) when it is invoked.
81
-
82
- See the [Wiki](https://github.com/mikedll/cknife/wiki) for
83
- details on the tools cknife has.
26
+ That will show you 50 of them. You can see the help for this command, too.
27
+
28
+ > cknifeaws help
29
+
30
+ See the
31
+ [Wiki](https://github.com/mikedll/cknife/wiki) for details on the
32
+ tools cknife has. A complete list of the tools is below under 'usage'.
84
33
 
85
34
  # Requirements
86
35
 
@@ -118,14 +67,14 @@ these two places, in order:
118
67
 
119
68
  Here are the command line executables:
120
69
 
121
- - cknifeaws
122
- - cknifedub
123
- - cknifemail
124
- - cknifemon
125
- - cknifemysql
126
- - cknifenowtimestamp
127
- - cknifepg
128
- - cknifewcdir
70
+ - cknifeaws - AWS wrappers.
71
+ - cknifemail - SMTP email sender.
72
+ - cknifemon - Daemon that sends heartbeat signals to a place of your choosing.
73
+ - cknifemysql - MySQL utilities.
74
+ - cknifepg - PostgreSQL utilities.
75
+ - cknifewcdir - Lines-of-code calculator.
76
+ - cknifedub - Spot directories that are particularly space-consuming.
77
+ - cknifenowtimestamp - Get a now() timestamp string.
129
78
 
130
79
  You can invoke any of them like this:
131
80
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.3.0
1
+ 1.4.1
@@ -31,7 +31,7 @@ class CKnifeWcdir < Thor
31
31
  def count(*patterns)
32
32
  start_point = options[:start].empty? ? "." : options[:start].chomp('/')
33
33
 
34
- pattern_s = "\\( " + patterns.map { |p| "-name #{p}" }.join(' -o ') + " \\) "
34
+ pattern_s = "\\( " + patterns.map { |p| "-name '#{p}'" }.join(' -or ') + " \\) "
35
35
  skip_s = options[:skip].empty? ? "" : "-type d \\( " + options[:skip].map { |dir| "-path #{start_point}/#{dir.chomp('/')}" }.join(' -o ') + " \\) -prune -o "
36
36
 
37
37
  # note patterns must go after the skips (after the -prune -o)
@@ -2,16 +2,16 @@
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 1.3.0 ruby lib
5
+ # stub: cknife 1.4.1 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "cknife".freeze
9
- s.version = "1.3.0"
9
+ s.version = "1.4.1"
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
12
12
  s.require_paths = ["lib".freeze]
13
13
  s.authors = ["Michael Rivera".freeze]
14
- s.date = "2018-10-10"
14
+ s.date = "2019-08-31"
15
15
  s.description = "A collection of command line tools, especially for popular API services.".freeze
16
16
  s.email = "soymrmike@gmail.com".freeze
17
17
  s.executables = ["cknifeaws".freeze, "cknifedub".freeze, "cknifemail".freeze, "cknifemon".freeze, "cknifemysql".freeze, "cknifenowtimestamp".freeze, "cknifepg".freeze, "cknifewcdir".freeze]
@@ -51,53 +51,56 @@ Gem::Specification.new do |s|
51
51
  ]
52
52
  s.homepage = "http://github.com/mikedll/cknife".freeze
53
53
  s.licenses = ["".freeze]
54
- s.rubygems_version = "2.6.14.1".freeze
54
+ s.rubygems_version = "2.7.9".freeze
55
55
  s.summary = "CKnife".freeze
56
56
 
57
57
  if s.respond_to? :specification_version then
58
58
  s.specification_version = 4
59
59
 
60
60
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
61
- s.add_runtime_dependency(%q<rest-client>.freeze, [">= 1.8.0", "~> 1"])
62
- s.add_runtime_dependency(%q<nokogiri>.freeze, [">= 1.8.2", "~> 1"])
61
+ s.add_runtime_dependency(%q<rest-client>.freeze, ["~> 1", ">= 1.8.0"])
62
+ s.add_runtime_dependency(%q<nokogiri>.freeze, ["~> 1", ">= 1.10.4"])
63
63
  s.add_runtime_dependency(%q<i18n>.freeze, [">= 0.6.6"])
64
64
  s.add_runtime_dependency(%q<activesupport>.freeze, [">= 4.2.9"])
65
65
  s.add_runtime_dependency(%q<actionpack>.freeze, [">= 4.2.9"])
66
66
  s.add_runtime_dependency(%q<mail>.freeze, ["~> 2.5.5"])
67
- s.add_runtime_dependency(%q<thor>.freeze, [">= 0.14", "~> 0"])
67
+ s.add_runtime_dependency(%q<thor>.freeze, ["~> 0", ">= 0.14"])
68
68
  s.add_runtime_dependency(%q<builder>.freeze, ["~> 3.0"])
69
69
  s.add_runtime_dependency(%q<fog-aws>.freeze, ["< 3.0"])
70
- s.add_runtime_dependency(%q<unf>.freeze, [">= 0.1", "~> 0"])
70
+ s.add_runtime_dependency(%q<unf>.freeze, ["~> 0", ">= 0.1"])
71
71
  s.add_runtime_dependency(%q<daemons>.freeze, [">= 0"])
72
+ s.add_runtime_dependency(%q<loofah>.freeze, ["~> 2.2.3"])
72
73
  s.add_development_dependency(%q<bundler>.freeze, ["~> 1.0"])
73
74
  s.add_development_dependency(%q<jeweler>.freeze, ["~> 2.1"])
74
75
  else
75
- s.add_dependency(%q<rest-client>.freeze, [">= 1.8.0", "~> 1"])
76
- s.add_dependency(%q<nokogiri>.freeze, [">= 1.8.2", "~> 1"])
76
+ s.add_dependency(%q<rest-client>.freeze, ["~> 1", ">= 1.8.0"])
77
+ s.add_dependency(%q<nokogiri>.freeze, ["~> 1", ">= 1.10.4"])
77
78
  s.add_dependency(%q<i18n>.freeze, [">= 0.6.6"])
78
79
  s.add_dependency(%q<activesupport>.freeze, [">= 4.2.9"])
79
80
  s.add_dependency(%q<actionpack>.freeze, [">= 4.2.9"])
80
81
  s.add_dependency(%q<mail>.freeze, ["~> 2.5.5"])
81
- s.add_dependency(%q<thor>.freeze, [">= 0.14", "~> 0"])
82
+ s.add_dependency(%q<thor>.freeze, ["~> 0", ">= 0.14"])
82
83
  s.add_dependency(%q<builder>.freeze, ["~> 3.0"])
83
84
  s.add_dependency(%q<fog-aws>.freeze, ["< 3.0"])
84
- s.add_dependency(%q<unf>.freeze, [">= 0.1", "~> 0"])
85
+ s.add_dependency(%q<unf>.freeze, ["~> 0", ">= 0.1"])
85
86
  s.add_dependency(%q<daemons>.freeze, [">= 0"])
87
+ s.add_dependency(%q<loofah>.freeze, ["~> 2.2.3"])
86
88
  s.add_dependency(%q<bundler>.freeze, ["~> 1.0"])
87
89
  s.add_dependency(%q<jeweler>.freeze, ["~> 2.1"])
88
90
  end
89
91
  else
90
- s.add_dependency(%q<rest-client>.freeze, [">= 1.8.0", "~> 1"])
91
- s.add_dependency(%q<nokogiri>.freeze, [">= 1.8.2", "~> 1"])
92
+ s.add_dependency(%q<rest-client>.freeze, ["~> 1", ">= 1.8.0"])
93
+ s.add_dependency(%q<nokogiri>.freeze, ["~> 1", ">= 1.10.4"])
92
94
  s.add_dependency(%q<i18n>.freeze, [">= 0.6.6"])
93
95
  s.add_dependency(%q<activesupport>.freeze, [">= 4.2.9"])
94
96
  s.add_dependency(%q<actionpack>.freeze, [">= 4.2.9"])
95
97
  s.add_dependency(%q<mail>.freeze, ["~> 2.5.5"])
96
- s.add_dependency(%q<thor>.freeze, [">= 0.14", "~> 0"])
98
+ s.add_dependency(%q<thor>.freeze, ["~> 0", ">= 0.14"])
97
99
  s.add_dependency(%q<builder>.freeze, ["~> 3.0"])
98
100
  s.add_dependency(%q<fog-aws>.freeze, ["< 3.0"])
99
- s.add_dependency(%q<unf>.freeze, [">= 0.1", "~> 0"])
101
+ s.add_dependency(%q<unf>.freeze, ["~> 0", ">= 0.1"])
100
102
  s.add_dependency(%q<daemons>.freeze, [">= 0"])
103
+ s.add_dependency(%q<loofah>.freeze, ["~> 2.2.3"])
101
104
  s.add_dependency(%q<bundler>.freeze, ["~> 1.0"])
102
105
  s.add_dependency(%q<jeweler>.freeze, ["~> 2.1"])
103
106
  end
@@ -6,6 +6,8 @@ require 'cknife/command_line'
6
6
  module CKnife
7
7
  class CKnifeMysql < Thor
8
8
 
9
+ class_option :verbose, :default => false, :type => :boolean, :desc => "Show which commands are invoked, any input given to them, and any output they give back."
10
+
9
11
  no_tasks do
10
12
  def config
11
13
  @config ||= Config
@@ -30,8 +32,38 @@ module CKnife
30
32
  end
31
33
 
32
34
  def command_line
33
- @command_line ||= CommandLine.new(option_file, "[client]\npassword=\"#{conf[:password]}\"", self)
35
+ @command_line ||= CommandLine.new(option_file, "[client]\npassword=\"#{conf[:password]}\"", self, options)
36
+ end
37
+
38
+ def mysql_easy
39
+ "mysql #{connection_options} #{conf[:database]}"
40
+ end
41
+ end
42
+
43
+ desc "console", "Launch mysql console."
44
+ method_option :myfile, :type => :boolean, :default => false, :desc => "Write my.cnf file if it doesn't exist."
45
+ def console
46
+ if !File.exists?(option_file)
47
+ if !options[:myfile]
48
+ say("You must prepare a #{option_file} file for this command, or use --myfile to have this tool create it for you. Alternatively, you can create a #{option_file} file with the myfile command and delete it later with the dmyfile command.")
49
+ return
50
+ end
51
+
52
+ command_line.write_option_file
34
53
  end
54
+
55
+ dc(mysql_easy) if options[:verbose]
56
+ exec(mysql_easy)
57
+ end
58
+
59
+ desc "myfile", "Write a my.cnf file in $CWD. Useful for starting a mysql session on your own."
60
+ def myfile
61
+ command_line.create_opt_file("Connect command: #{mysql_easy}")
62
+ end
63
+
64
+ desc "dmyfile", "Delete the my.cnf file in $CWD, assuming it exactly matches what would be generated by this tool."
65
+ def dmyfile
66
+ command_line.delete_opt_file
35
67
  end
36
68
 
37
69
  desc "capture", "Capture a dump of the database to db(current timestamp).sql."
@@ -36,6 +36,7 @@ class CKnifePg < Thor
36
36
  @pg_pass_file = ".pgpass"
37
37
  end
38
38
 
39
+ # dump command?
39
40
  def dc(cmd)
40
41
  puts "PGPASSFILE=#{pg_pass_file} #{cmd}"
41
42
  end
@@ -304,7 +305,7 @@ AND
304
305
  return
305
306
  end
306
307
 
307
- f = write_pg_pass_file
308
+ write_pg_pass_file
308
309
  say("Wrote #{pg_pass_file} to $CWD.")
309
310
  say(connect_msg)
310
311
  say("Remember to delete the .pgpass file when you are finished.")
@@ -1,31 +1,76 @@
1
1
  module CKnife
2
2
  class CommandLine
3
3
 
4
- attr_accessor :option_file, :option_file_contents, :thor_output
4
+ attr_accessor :option_file, :option_file_contents, :thor_output, :options
5
5
 
6
- def initialize(f, s, o)
6
+ def initialize(f, s, o, opts)
7
7
  self.option_file = f
8
8
  self.option_file_contents = s
9
9
  self.thor_output = o
10
+ self.options = opts
11
+ end
12
+
13
+ # dump command?
14
+ def dc(cmd)
15
+ puts "PGPASSFILE=#{pg_pass_file} #{cmd}"
16
+ end
17
+
18
+ def write_option_file
19
+ File.open(option_file, "w", 0600) { |f| f.write option_file_contents }
20
+ end
21
+
22
+ def delete_opt_file
23
+ if !File.exists?(option_file)
24
+ thor_output.say("No #{option_file} file to delete.")
25
+ return
26
+ end
27
+
28
+ s = File.read(option_file)
29
+ if s == option_file_contents
30
+ File.unlink(option_file)
31
+ thor_output.say("Deleted #{option_file} file.")
32
+ else
33
+ thor_output.say("The #{option_file} file's contents do not match what this tool would have generated. Assuming you are trying to delete a #{option_file} file that this tool did not generate, please inspect the file to ensure it contains what you expect, and then delete it yourself.", :red)
34
+ end
35
+ end
36
+
37
+ def create_opt_file(connect_msg)
38
+ if File.exists?(option_file)
39
+ thor_output.say("A #{option_file} file is already present.")
40
+ thor_output.say(connect_msg)
41
+ return
42
+ end
43
+
44
+ write_option_file
45
+ thor_output.say("Wrote #{option_file} to $CWD.")
46
+ thor_output.say(connect_msg)
47
+ thor_output.say("Remember to delete the #{option_file} file when you are finished.")
10
48
  end
11
49
 
12
50
  def execute(cmd, input = nil)
13
51
  return if !@session_ok
14
- puts cmd
52
+ dc(cmd) if options[:verbose]
15
53
  stdin, stdout, stderr, wait_thread = Open3.popen3(cmd)
16
54
  if input
17
- puts input
55
+ puts input if options[:verbose]
18
56
  stdin.write input
19
57
  stdin.close
20
58
  end
21
59
  output = stdout.read
22
60
  output += stderr.read
23
- $stdout.write output
61
+ $stdout.write output if options[:verbose]
24
62
  stdout.close
25
63
  stderr.close
26
64
  result = wait_thread.value.to_i
27
- @session_ok = @session_ok && (result == 0)
28
- yield if @session_ok && block_given?
65
+
66
+ if result != 0
67
+ @session_ok = false
68
+ msg = "An error occurred."
69
+ msg += " If the --verbose flag is available for this command, you may try turning it on." if !options[:verbose]
70
+ thor_output.say(msg, :red)
71
+ end
72
+
73
+ yield if block_given?
29
74
  output
30
75
  end
31
76
 
@@ -37,24 +82,33 @@ module CKnife
37
82
  @session_live = true
38
83
  @session_ok = true
39
84
 
85
+ existing_option_file = false
40
86
  if File.exists?(option_file)
41
- thor_output.say("This generates a file named #{option_file}, but one is already on disk. Exiting.")
42
- return
87
+ existing_option_file = true
88
+ s = File.read(option_file)
89
+ if s != option_file_contents
90
+ thor_output.say("A #{option_file} file is present, but it does not match your database configuration. The contents of the #{option_file} file must exactly match what this tool would generate. Please reconcile the #{option_file} file with your configuration, and then try again. You can also delete the #{option_file} file since this tool generates one in order to do its job (and removes it after finishing).", :red)
91
+ return
92
+ end
43
93
  end
44
94
 
45
- File.open(option_file, "w", 0600) { |f| f.write option_file_contents }
46
-
47
- result = yield self
95
+ write_option_file
48
96
 
49
- FileUtils.rm(option_file)
50
- if File.exists?(option_file)
51
- thor_output.say("Failed to remove #{option_file} file. Please remove it for security purposes.")
97
+ result = nil
98
+ begin
99
+ result = yield self # don't know what we're planning to do with the result here...
100
+ ensure
101
+ if !existing_option_file
102
+ FileUtils.rm(option_file)
103
+ if File.exists?(option_file)
104
+ thor_output.say("Failed to remove #{option_file} file. Please remove it for your infrastructure's security.")
105
+ end
106
+ else
107
+ thor_output.say("Left existing #{option_file} file on disk.", :yellow)
108
+ end
52
109
  end
53
110
 
54
- thor_output.say
55
- thor_output.say("Command failed.", :red) if !@session_ok
56
111
  @session_live = false
57
-
58
112
  result
59
113
  end
60
114
  end
metadata CHANGED
@@ -1,55 +1,55 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cknife
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0
4
+ version: 1.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Rivera
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-10-10 00:00:00.000000000 Z
11
+ date: 2019-08-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rest-client
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: 1.8.0
20
17
  - - "~>"
21
18
  - !ruby/object:Gem::Version
22
19
  version: '1'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 1.8.0
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  requirements:
27
- - - ">="
28
- - !ruby/object:Gem::Version
29
- version: 1.8.0
30
27
  - - "~>"
31
28
  - !ruby/object:Gem::Version
32
29
  version: '1'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 1.8.0
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: nokogiri
35
35
  requirement: !ruby/object:Gem::Requirement
36
36
  requirements:
37
- - - ">="
38
- - !ruby/object:Gem::Version
39
- version: 1.8.2
40
37
  - - "~>"
41
38
  - !ruby/object:Gem::Version
42
39
  version: '1'
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: 1.10.4
43
43
  type: :runtime
44
44
  prerelease: false
45
45
  version_requirements: !ruby/object:Gem::Requirement
46
46
  requirements:
47
- - - ">="
48
- - !ruby/object:Gem::Version
49
- version: 1.8.2
50
47
  - - "~>"
51
48
  - !ruby/object:Gem::Version
52
49
  version: '1'
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: 1.10.4
53
53
  - !ruby/object:Gem::Dependency
54
54
  name: i18n
55
55
  requirement: !ruby/object:Gem::Requirement
@@ -110,22 +110,22 @@ dependencies:
110
110
  name: thor
111
111
  requirement: !ruby/object:Gem::Requirement
112
112
  requirements:
113
- - - ">="
114
- - !ruby/object:Gem::Version
115
- version: '0.14'
116
113
  - - "~>"
117
114
  - !ruby/object:Gem::Version
118
115
  version: '0'
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: '0.14'
119
119
  type: :runtime
120
120
  prerelease: false
121
121
  version_requirements: !ruby/object:Gem::Requirement
122
122
  requirements:
123
- - - ">="
124
- - !ruby/object:Gem::Version
125
- version: '0.14'
126
123
  - - "~>"
127
124
  - !ruby/object:Gem::Version
128
125
  version: '0'
126
+ - - ">="
127
+ - !ruby/object:Gem::Version
128
+ version: '0.14'
129
129
  - !ruby/object:Gem::Dependency
130
130
  name: builder
131
131
  requirement: !ruby/object:Gem::Requirement
@@ -158,22 +158,22 @@ dependencies:
158
158
  name: unf
159
159
  requirement: !ruby/object:Gem::Requirement
160
160
  requirements:
161
- - - ">="
162
- - !ruby/object:Gem::Version
163
- version: '0.1'
164
161
  - - "~>"
165
162
  - !ruby/object:Gem::Version
166
163
  version: '0'
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0.1'
167
167
  type: :runtime
168
168
  prerelease: false
169
169
  version_requirements: !ruby/object:Gem::Requirement
170
170
  requirements:
171
- - - ">="
172
- - !ruby/object:Gem::Version
173
- version: '0.1'
174
171
  - - "~>"
175
172
  - !ruby/object:Gem::Version
176
173
  version: '0'
174
+ - - ">="
175
+ - !ruby/object:Gem::Version
176
+ version: '0.1'
177
177
  - !ruby/object:Gem::Dependency
178
178
  name: daemons
179
179
  requirement: !ruby/object:Gem::Requirement
@@ -188,6 +188,20 @@ dependencies:
188
188
  - - ">="
189
189
  - !ruby/object:Gem::Version
190
190
  version: '0'
191
+ - !ruby/object:Gem::Dependency
192
+ name: loofah
193
+ requirement: !ruby/object:Gem::Requirement
194
+ requirements:
195
+ - - "~>"
196
+ - !ruby/object:Gem::Version
197
+ version: 2.2.3
198
+ type: :runtime
199
+ prerelease: false
200
+ version_requirements: !ruby/object:Gem::Requirement
201
+ requirements:
202
+ - - "~>"
203
+ - !ruby/object:Gem::Version
204
+ version: 2.2.3
191
205
  - !ruby/object:Gem::Dependency
192
206
  name: bundler
193
207
  requirement: !ruby/object:Gem::Requirement
@@ -280,7 +294,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
280
294
  version: '0'
281
295
  requirements: []
282
296
  rubyforge_project:
283
- rubygems_version: 2.6.14.1
297
+ rubygems_version: 2.7.9
284
298
  signing_key:
285
299
  specification_version: 4
286
300
  summary: CKnife