mtncloud-cli 1.0.0 → 1.0.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 +4 -4
- data/.dockerignore +20 -20
- data/.github/pull_request_template.md +14 -14
- data/.github/workflows/ci.yml +56 -56
- data/.gitignore +24 -24
- data/CLAUDE.md +24 -24
- data/CONTRIBUTING.md +91 -91
- data/Dockerfile +19 -19
- data/Gemfile +4 -4
- data/README.md +187 -187
- data/Rakefile +26 -26
- data/bin/mcs +3 -3
- data/bin/mtncloud +0 -0
- data/lib/mtncloud/cli/cli_command.rb +2281 -2281
- data/lib/mtncloud/cli/version.rb +1 -1
- data/lib/mtncloud/ext/hash.rb +109 -109
- data/lib/mtncloud/ext/nil_class.rb +5 -5
- data/lib/mtncloud/ext/rest_client.rb +37 -37
- data/lib/mtncloud/ext/string.rb +66 -66
- data/mtncloud-cli.gemspec +38 -38
- metadata +9 -4
data/lib/mtncloud/cli/version.rb
CHANGED
data/lib/mtncloud/ext/hash.rb
CHANGED
|
@@ -1,109 +1,109 @@
|
|
|
1
|
-
# Provide deep_merge.
|
|
2
|
-
# Borrowed from rails active_support
|
|
3
|
-
# https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/hash/deep_merge.rb
|
|
4
|
-
#
|
|
5
|
-
class Hash
|
|
6
|
-
# Returns a new hash with +self+ and +other_hash+ merged recursively.
|
|
7
|
-
#
|
|
8
|
-
# h1 = { a: true, b: { c: [1, 2, 3] } }
|
|
9
|
-
# h2 = { a: false, b: { x: [3, 4, 5] } }
|
|
10
|
-
#
|
|
11
|
-
# h1.deep_merge(h2) # => { a: false, b: { c: [1, 2, 3], x: [3, 4, 5] } }
|
|
12
|
-
#
|
|
13
|
-
# Like with Hash#merge in the standard library, a block can be provided
|
|
14
|
-
# to merge values:
|
|
15
|
-
#
|
|
16
|
-
# h1 = { a: 100, b: 200, c: { c1: 100 } }
|
|
17
|
-
# h2 = { b: 250, c: { c1: 200 } }
|
|
18
|
-
# h1.deep_merge(h2) { |key, this_val, other_val| this_val + other_val }
|
|
19
|
-
# # => { a: 100, b: 450, c: { c1: 300 } }
|
|
20
|
-
def deep_merge(other_hash, &block)
|
|
21
|
-
dup.deep_merge!(other_hash, &block)
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
# Same as +deep_merge+, but modifies +self+.
|
|
25
|
-
def deep_merge!(other_hash, &block)
|
|
26
|
-
other_hash.each_pair do |current_key, other_value|
|
|
27
|
-
this_value = self[current_key]
|
|
28
|
-
|
|
29
|
-
self[current_key] = if this_value.is_a?(Hash) && other_value.is_a?(Hash)
|
|
30
|
-
this_value.deep_merge(other_value, &block)
|
|
31
|
-
else
|
|
32
|
-
if block_given? && key?(current_key)
|
|
33
|
-
block.call(current_key, this_value, other_value)
|
|
34
|
-
else
|
|
35
|
-
other_value
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
self
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
def deep_compact!
|
|
44
|
-
self.each_pair do |k, v|
|
|
45
|
-
if v.is_a?(Hash)
|
|
46
|
-
self[k].deep_compact!
|
|
47
|
-
elsif v.is_a?(Array)
|
|
48
|
-
self[k].each do |it|
|
|
49
|
-
if it.is_a?(Hash)
|
|
50
|
-
it.deep_compact!
|
|
51
|
-
elsif self[k] == nil || self[k] == ''
|
|
52
|
-
# meh, preserve 'empty' array elements
|
|
53
|
-
end
|
|
54
|
-
end
|
|
55
|
-
else
|
|
56
|
-
if self[k] == nil || self[k] == ''
|
|
57
|
-
self.delete(k)
|
|
58
|
-
end
|
|
59
|
-
end
|
|
60
|
-
end
|
|
61
|
-
self
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
# convert recognizable strings to booleans
|
|
65
|
-
def booleanize!(true_values=['true','on'], false_values=['false','off'])
|
|
66
|
-
self.each_pair do |k, v|
|
|
67
|
-
if v.is_a?(Hash)
|
|
68
|
-
self[k].booleanize!
|
|
69
|
-
elsif v.is_a?(Array)
|
|
70
|
-
self[k].each do |it|
|
|
71
|
-
if it.is_a?(Hash)
|
|
72
|
-
it.booleanize!
|
|
73
|
-
elsif self[k] == nil || self[k] == ''
|
|
74
|
-
# meh, preserve 'empty' array elements
|
|
75
|
-
end
|
|
76
|
-
end
|
|
77
|
-
else
|
|
78
|
-
if true_values.include?(v)
|
|
79
|
-
self[k] = true
|
|
80
|
-
elsif false_values.include?(v)
|
|
81
|
-
self[k] = false
|
|
82
|
-
end
|
|
83
|
-
end
|
|
84
|
-
end
|
|
85
|
-
self
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
def upcase_keys!
|
|
89
|
-
self.keys.each do |k|
|
|
90
|
-
self[k.to_s.upcase] = self.delete(k)
|
|
91
|
-
end
|
|
92
|
-
self
|
|
93
|
-
end
|
|
94
|
-
|
|
95
|
-
def downcase_keys!
|
|
96
|
-
self.keys.each do |k|
|
|
97
|
-
self[k.to_s.downcase] = self.delete(k)
|
|
98
|
-
end
|
|
99
|
-
self
|
|
100
|
-
end
|
|
101
|
-
|
|
102
|
-
def capitalize_keys!
|
|
103
|
-
self.keys.each do |k|
|
|
104
|
-
self[k.to_s.capitalize] = self.delete(k)
|
|
105
|
-
end
|
|
106
|
-
self
|
|
107
|
-
end
|
|
108
|
-
|
|
109
|
-
end
|
|
1
|
+
# Provide deep_merge.
|
|
2
|
+
# Borrowed from rails active_support
|
|
3
|
+
# https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/hash/deep_merge.rb
|
|
4
|
+
#
|
|
5
|
+
class Hash
|
|
6
|
+
# Returns a new hash with +self+ and +other_hash+ merged recursively.
|
|
7
|
+
#
|
|
8
|
+
# h1 = { a: true, b: { c: [1, 2, 3] } }
|
|
9
|
+
# h2 = { a: false, b: { x: [3, 4, 5] } }
|
|
10
|
+
#
|
|
11
|
+
# h1.deep_merge(h2) # => { a: false, b: { c: [1, 2, 3], x: [3, 4, 5] } }
|
|
12
|
+
#
|
|
13
|
+
# Like with Hash#merge in the standard library, a block can be provided
|
|
14
|
+
# to merge values:
|
|
15
|
+
#
|
|
16
|
+
# h1 = { a: 100, b: 200, c: { c1: 100 } }
|
|
17
|
+
# h2 = { b: 250, c: { c1: 200 } }
|
|
18
|
+
# h1.deep_merge(h2) { |key, this_val, other_val| this_val + other_val }
|
|
19
|
+
# # => { a: 100, b: 450, c: { c1: 300 } }
|
|
20
|
+
def deep_merge(other_hash, &block)
|
|
21
|
+
dup.deep_merge!(other_hash, &block)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Same as +deep_merge+, but modifies +self+.
|
|
25
|
+
def deep_merge!(other_hash, &block)
|
|
26
|
+
other_hash.each_pair do |current_key, other_value|
|
|
27
|
+
this_value = self[current_key]
|
|
28
|
+
|
|
29
|
+
self[current_key] = if this_value.is_a?(Hash) && other_value.is_a?(Hash)
|
|
30
|
+
this_value.deep_merge(other_value, &block)
|
|
31
|
+
else
|
|
32
|
+
if block_given? && key?(current_key)
|
|
33
|
+
block.call(current_key, this_value, other_value)
|
|
34
|
+
else
|
|
35
|
+
other_value
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
self
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def deep_compact!
|
|
44
|
+
self.each_pair do |k, v|
|
|
45
|
+
if v.is_a?(Hash)
|
|
46
|
+
self[k].deep_compact!
|
|
47
|
+
elsif v.is_a?(Array)
|
|
48
|
+
self[k].each do |it|
|
|
49
|
+
if it.is_a?(Hash)
|
|
50
|
+
it.deep_compact!
|
|
51
|
+
elsif self[k] == nil || self[k] == ''
|
|
52
|
+
# meh, preserve 'empty' array elements
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
else
|
|
56
|
+
if self[k] == nil || self[k] == ''
|
|
57
|
+
self.delete(k)
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
self
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# convert recognizable strings to booleans
|
|
65
|
+
def booleanize!(true_values=['true','on'], false_values=['false','off'])
|
|
66
|
+
self.each_pair do |k, v|
|
|
67
|
+
if v.is_a?(Hash)
|
|
68
|
+
self[k].booleanize!
|
|
69
|
+
elsif v.is_a?(Array)
|
|
70
|
+
self[k].each do |it|
|
|
71
|
+
if it.is_a?(Hash)
|
|
72
|
+
it.booleanize!
|
|
73
|
+
elsif self[k] == nil || self[k] == ''
|
|
74
|
+
# meh, preserve 'empty' array elements
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
else
|
|
78
|
+
if true_values.include?(v)
|
|
79
|
+
self[k] = true
|
|
80
|
+
elsif false_values.include?(v)
|
|
81
|
+
self[k] = false
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
self
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def upcase_keys!
|
|
89
|
+
self.keys.each do |k|
|
|
90
|
+
self[k.to_s.upcase] = self.delete(k)
|
|
91
|
+
end
|
|
92
|
+
self
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def downcase_keys!
|
|
96
|
+
self.keys.each do |k|
|
|
97
|
+
self[k.to_s.downcase] = self.delete(k)
|
|
98
|
+
end
|
|
99
|
+
self
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def capitalize_keys!
|
|
103
|
+
self.keys.each do |k|
|
|
104
|
+
self[k.to_s.capitalize] = self.delete(k)
|
|
105
|
+
end
|
|
106
|
+
self
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
end
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
class NilClass
|
|
2
|
-
def empty?
|
|
3
|
-
true
|
|
4
|
-
end
|
|
5
|
-
end
|
|
1
|
+
class NilClass
|
|
2
|
+
def empty?
|
|
3
|
+
true
|
|
4
|
+
end
|
|
5
|
+
end
|
|
@@ -1,37 +1,37 @@
|
|
|
1
|
-
# this does some monkey patching of third party RestClient
|
|
2
|
-
# to modify the logging output a bit
|
|
3
|
-
require 'rest-client'
|
|
4
|
-
|
|
5
|
-
module RestClient
|
|
6
|
-
class Request
|
|
7
|
-
|
|
8
|
-
alias_method :original_log_request, :log_request
|
|
9
|
-
def log_request
|
|
10
|
-
begin
|
|
11
|
-
return unless RestClient.log
|
|
12
|
-
out = []
|
|
13
|
-
# out << "RestClient.#{method} #{redacted_url.inspect}"
|
|
14
|
-
out << "#{method.to_s.upcase} #{redacted_url.inspect}"
|
|
15
|
-
out << payload.short_inspect if payload
|
|
16
|
-
out << processed_headers.to_a.sort.map { |(k, v)| [k.inspect, v.inspect].join("=>") }.join(", ")
|
|
17
|
-
RestClient.log << out.join(', ') + "\n"
|
|
18
|
-
rescue
|
|
19
|
-
# something went wrong, wrong gem version maybe...above is from rest-client 2.0.2
|
|
20
|
-
# do it the old way
|
|
21
|
-
original_log_request()
|
|
22
|
-
end
|
|
23
|
-
end
|
|
24
|
-
=begin
|
|
25
|
-
def log_response res
|
|
26
|
-
return unless RestClient.log
|
|
27
|
-
size = if @raw_response
|
|
28
|
-
File.size(@tf.path)
|
|
29
|
-
else
|
|
30
|
-
res.body.nil? ? 0 : res.body.size
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
RestClient.log << "# => #{res.code} #{res.class.to_s.gsub(/^Net::HTTP/, '')} | #{(res['Content-type'] || '').gsub(/;.*$/, '')} #{size} bytes\n"
|
|
34
|
-
end
|
|
35
|
-
=end
|
|
36
|
-
end
|
|
37
|
-
end
|
|
1
|
+
# this does some monkey patching of third party RestClient
|
|
2
|
+
# to modify the logging output a bit
|
|
3
|
+
require 'rest-client'
|
|
4
|
+
|
|
5
|
+
module RestClient
|
|
6
|
+
class Request
|
|
7
|
+
|
|
8
|
+
alias_method :original_log_request, :log_request
|
|
9
|
+
def log_request
|
|
10
|
+
begin
|
|
11
|
+
return unless RestClient.log
|
|
12
|
+
out = []
|
|
13
|
+
# out << "RestClient.#{method} #{redacted_url.inspect}"
|
|
14
|
+
out << "#{method.to_s.upcase} #{redacted_url.inspect}"
|
|
15
|
+
out << payload.short_inspect if payload
|
|
16
|
+
out << processed_headers.to_a.sort.map { |(k, v)| [k.inspect, v.inspect].join("=>") }.join(", ")
|
|
17
|
+
RestClient.log << out.join(', ') + "\n"
|
|
18
|
+
rescue
|
|
19
|
+
# something went wrong, wrong gem version maybe...above is from rest-client 2.0.2
|
|
20
|
+
# do it the old way
|
|
21
|
+
original_log_request()
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
=begin
|
|
25
|
+
def log_response res
|
|
26
|
+
return unless RestClient.log
|
|
27
|
+
size = if @raw_response
|
|
28
|
+
File.size(@tf.path)
|
|
29
|
+
else
|
|
30
|
+
res.body.nil? ? 0 : res.body.size
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
RestClient.log << "# => #{res.code} #{res.class.to_s.gsub(/^Net::HTTP/, '')} | #{(res['Content-type'] || '').gsub(/;.*$/, '')} #{size} bytes\n"
|
|
34
|
+
end
|
|
35
|
+
=end
|
|
36
|
+
end
|
|
37
|
+
end
|
data/lib/mtncloud/ext/string.rb
CHANGED
|
@@ -1,66 +1,66 @@
|
|
|
1
|
-
class String
|
|
2
|
-
|
|
3
|
-
def pluralize
|
|
4
|
-
# hacky version of this until we want to depend on ActiveSupport
|
|
5
|
-
value = self.dup
|
|
6
|
-
if value == ""
|
|
7
|
-
value
|
|
8
|
-
elsif value[-1].chr == "y"
|
|
9
|
-
value[0..-2] + "ies"
|
|
10
|
-
elsif value[-1].chr == "s"
|
|
11
|
-
if value[-2..-1] == "ss"
|
|
12
|
-
value + "es"
|
|
13
|
-
else
|
|
14
|
-
value
|
|
15
|
-
end
|
|
16
|
-
else
|
|
17
|
-
value + "s"
|
|
18
|
-
end
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
def singularize
|
|
22
|
-
# hacky version of this until we want to depend on ActiveSupport
|
|
23
|
-
value = self.dup
|
|
24
|
-
if value == ""
|
|
25
|
-
value
|
|
26
|
-
elsif value.size > 3 && value[-3..-1] == "ies"
|
|
27
|
-
value[0..-4] + "y"
|
|
28
|
-
elsif value.size > 2 && value[-3..-1] == "ses"
|
|
29
|
-
value[0..-2]
|
|
30
|
-
elsif value[-1] == "s"
|
|
31
|
-
value[0..-2]
|
|
32
|
-
else
|
|
33
|
-
value
|
|
34
|
-
end
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
def underscore
|
|
38
|
-
value = self.dup
|
|
39
|
-
value.gsub!(/::/, '/')
|
|
40
|
-
value.gsub!(/([A-Z]+)([A-Z][a-z])/,'\1_\2')
|
|
41
|
-
value.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
|
|
42
|
-
value.tr!("-", "_")
|
|
43
|
-
value.tr!(" ", "_")
|
|
44
|
-
value.downcase!
|
|
45
|
-
value
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
def camelcase
|
|
49
|
-
value = self.underscore.gsub(/\_([a-z])/) do $1.upcase end
|
|
50
|
-
value = value[0, 1].downcase + value[1..-1]
|
|
51
|
-
value
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
def upcamelcase
|
|
55
|
-
self.camelcase.capitalize
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
def titleize
|
|
59
|
-
self.underscore.split("_").map(&:capitalize).join(" ")
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
def dasherize
|
|
63
|
-
self.underscore.gsub("_", "-")
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
end
|
|
1
|
+
class String
|
|
2
|
+
|
|
3
|
+
def pluralize
|
|
4
|
+
# hacky version of this until we want to depend on ActiveSupport
|
|
5
|
+
value = self.dup
|
|
6
|
+
if value == ""
|
|
7
|
+
value
|
|
8
|
+
elsif value[-1].chr == "y"
|
|
9
|
+
value[0..-2] + "ies"
|
|
10
|
+
elsif value[-1].chr == "s"
|
|
11
|
+
if value[-2..-1] == "ss"
|
|
12
|
+
value + "es"
|
|
13
|
+
else
|
|
14
|
+
value
|
|
15
|
+
end
|
|
16
|
+
else
|
|
17
|
+
value + "s"
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def singularize
|
|
22
|
+
# hacky version of this until we want to depend on ActiveSupport
|
|
23
|
+
value = self.dup
|
|
24
|
+
if value == ""
|
|
25
|
+
value
|
|
26
|
+
elsif value.size > 3 && value[-3..-1] == "ies"
|
|
27
|
+
value[0..-4] + "y"
|
|
28
|
+
elsif value.size > 2 && value[-3..-1] == "ses"
|
|
29
|
+
value[0..-2]
|
|
30
|
+
elsif value[-1] == "s"
|
|
31
|
+
value[0..-2]
|
|
32
|
+
else
|
|
33
|
+
value
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def underscore
|
|
38
|
+
value = self.dup
|
|
39
|
+
value.gsub!(/::/, '/')
|
|
40
|
+
value.gsub!(/([A-Z]+)([A-Z][a-z])/,'\1_\2')
|
|
41
|
+
value.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
|
|
42
|
+
value.tr!("-", "_")
|
|
43
|
+
value.tr!(" ", "_")
|
|
44
|
+
value.downcase!
|
|
45
|
+
value
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def camelcase
|
|
49
|
+
value = self.underscore.gsub(/\_([a-z])/) do $1.upcase end
|
|
50
|
+
value = value[0, 1].downcase + value[1..-1]
|
|
51
|
+
value
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def upcamelcase
|
|
55
|
+
self.camelcase.capitalize
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def titleize
|
|
59
|
+
self.underscore.split("_").map(&:capitalize).join(" ")
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def dasherize
|
|
63
|
+
self.underscore.gsub("_", "-")
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
end
|
data/mtncloud-cli.gemspec
CHANGED
|
@@ -1,38 +1,38 @@
|
|
|
1
|
-
# coding: utf-8
|
|
2
|
-
lib = File.expand_path('../lib', __FILE__)
|
|
3
|
-
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
|
-
require 'mtncloud/cli/version'
|
|
5
|
-
|
|
6
|
-
Gem::Specification.new do |spec|
|
|
7
|
-
spec.name = "mtncloud-cli"
|
|
8
|
-
spec.version = MtnCloud::Cli::VERSION
|
|
9
|
-
spec.authors = ["
|
|
10
|
-
spec.summary = "Provides CLI Interface to MTN Cloud"
|
|
11
|
-
spec.description = "Cloud application management & orchestration CLI for MTN Cloud. Easily manage and orchestrate VMs on private or public infrastructure and containerized architectures."
|
|
12
|
-
spec.license = "MIT"
|
|
13
|
-
|
|
14
|
-
spec.files = `git ls-files -z`.split("\x0")
|
|
15
|
-
|
|
16
|
-
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
|
17
|
-
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
|
18
|
-
spec.require_paths = ["lib"]
|
|
19
|
-
|
|
20
|
-
spec.required_ruby_version = '>= 2.5.1' # according to http.rb doc
|
|
21
|
-
spec.add_dependency "tins", '~> 1.43.0'
|
|
22
|
-
spec.add_dependency "public_suffix", "4.0.7" # https://github.com/weppos/publicsuffix-ruby/blob/main/CHANGELOG.md
|
|
23
|
-
spec.add_dependency "ffi", "1.15.5" # Fix for mismatched deps: https://github.com/ffi/ffi/issues/1103
|
|
24
|
-
spec.add_development_dependency "bundler", ">= 2.2"
|
|
25
|
-
spec.add_development_dependency "rake"
|
|
26
|
-
spec.add_dependency 'term-ansicolor', '~> 1.3.0'
|
|
27
|
-
spec.add_dependency "rest-client", "2.0.2"
|
|
28
|
-
spec.add_dependency 'multipart-post'
|
|
29
|
-
spec.add_dependency "filesize"
|
|
30
|
-
spec.add_dependency 'mime-types'
|
|
31
|
-
spec.add_dependency "http", "5.3.1"
|
|
32
|
-
spec.add_dependency "rubyzip", '~> 2.3.2'
|
|
33
|
-
spec.add_dependency "test-unit"
|
|
34
|
-
# No longer part of Ruby's default libraries as of Ruby 4.0
|
|
35
|
-
spec.add_dependency "readline"
|
|
36
|
-
spec.add_dependency "logger"
|
|
37
|
-
spec.add_dependency "ostruct"
|
|
38
|
-
end
|
|
1
|
+
# coding: utf-8
|
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
|
+
require 'mtncloud/cli/version'
|
|
5
|
+
|
|
6
|
+
Gem::Specification.new do |spec|
|
|
7
|
+
spec.name = "mtncloud-cli"
|
|
8
|
+
spec.version = MtnCloud::Cli::VERSION
|
|
9
|
+
spec.authors = ["Joseph Henry", "Joshua Ukpozi", "MTN Cloud"]
|
|
10
|
+
spec.summary = "Provides CLI Interface to MTN Cloud"
|
|
11
|
+
spec.description = "Cloud application management & orchestration CLI for MTN Cloud. Easily manage and orchestrate VMs on private or public infrastructure and containerized architectures."
|
|
12
|
+
spec.license = "MIT"
|
|
13
|
+
|
|
14
|
+
spec.files = `git ls-files -z`.split("\x0")
|
|
15
|
+
|
|
16
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
|
17
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
|
18
|
+
spec.require_paths = ["lib"]
|
|
19
|
+
|
|
20
|
+
spec.required_ruby_version = '>= 2.5.1' # according to http.rb doc
|
|
21
|
+
spec.add_dependency "tins", '~> 1.43.0'
|
|
22
|
+
spec.add_dependency "public_suffix", "4.0.7" # https://github.com/weppos/publicsuffix-ruby/blob/main/CHANGELOG.md
|
|
23
|
+
spec.add_dependency "ffi", "1.15.5" # Fix for mismatched deps: https://github.com/ffi/ffi/issues/1103
|
|
24
|
+
spec.add_development_dependency "bundler", ">= 2.2"
|
|
25
|
+
spec.add_development_dependency "rake"
|
|
26
|
+
spec.add_dependency 'term-ansicolor', '~> 1.3.0'
|
|
27
|
+
spec.add_dependency "rest-client", "2.0.2"
|
|
28
|
+
spec.add_dependency 'multipart-post'
|
|
29
|
+
spec.add_dependency "filesize"
|
|
30
|
+
spec.add_dependency 'mime-types'
|
|
31
|
+
spec.add_dependency "http", "5.3.1"
|
|
32
|
+
spec.add_dependency "rubyzip", '~> 2.3.2'
|
|
33
|
+
spec.add_dependency "test-unit"
|
|
34
|
+
# No longer part of Ruby's default libraries as of Ruby 4.0
|
|
35
|
+
spec.add_dependency "readline"
|
|
36
|
+
spec.add_dependency "logger"
|
|
37
|
+
spec.add_dependency "ostruct"
|
|
38
|
+
end
|
metadata
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: mtncloud-cli
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.0.
|
|
4
|
+
version: 1.0.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
|
-
- Joshua Ukpozi
|
|
8
7
|
- Joseph Henry
|
|
8
|
+
- Joshua Ukpozi
|
|
9
9
|
- MTN Cloud
|
|
10
|
+
autorequire:
|
|
10
11
|
bindir: bin
|
|
11
12
|
cert_chain: []
|
|
12
|
-
date:
|
|
13
|
+
date: 2026-11-02 00:00:00.000000000 Z
|
|
13
14
|
dependencies:
|
|
14
15
|
- !ruby/object:Gem::Dependency
|
|
15
16
|
name: tins
|
|
@@ -238,6 +239,7 @@ dependencies:
|
|
|
238
239
|
description: Cloud application management & orchestration CLI for MTN Cloud. Easily
|
|
239
240
|
manage and orchestrate VMs on private or public infrastructure and containerized
|
|
240
241
|
architectures.
|
|
242
|
+
email:
|
|
241
243
|
executables:
|
|
242
244
|
- mcs
|
|
243
245
|
- mtncloud
|
|
@@ -741,9 +743,11 @@ files:
|
|
|
741
743
|
- test/test_case.rb
|
|
742
744
|
- test/test_config.rb
|
|
743
745
|
- test/test_data_helper.rb
|
|
746
|
+
homepage:
|
|
744
747
|
licenses:
|
|
745
748
|
- MIT
|
|
746
749
|
metadata: {}
|
|
750
|
+
post_install_message:
|
|
747
751
|
rdoc_options: []
|
|
748
752
|
require_paths:
|
|
749
753
|
- lib
|
|
@@ -758,7 +762,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
758
762
|
- !ruby/object:Gem::Version
|
|
759
763
|
version: '0'
|
|
760
764
|
requirements: []
|
|
761
|
-
rubygems_version:
|
|
765
|
+
rubygems_version: 3.5.22
|
|
766
|
+
signing_key:
|
|
762
767
|
specification_version: 4
|
|
763
768
|
summary: Provides CLI Interface to MTN Cloud
|
|
764
769
|
test_files:
|