3scale_toolbox 0.16.0 → 0.17.0

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
2
  SHA256:
3
- metadata.gz: 77ce2f220c416d634541773317d35da8018a75d7e3d91c009338b7a971614eee
4
- data.tar.gz: 4d5ee60b4cc55c0ba002fc007ba578801012c9c5580b4fe540f03c3c9dbb2d26
3
+ metadata.gz: 5065a7adfb9986662d24bb6b27a74d710400af999968086f52188477cc1670f3
4
+ data.tar.gz: d8ce25654cdae1d44e02900507c9b69b649fccbce69be0b234861ffd8611aa16
5
5
  SHA512:
6
- metadata.gz: 947d84f88a8b8e673ea313ba79a3e72eda4b03b85af30f12003b8c6b867f98addf8bc0eebea2e4a3c3bdbc64f80f241346c0e70bdb2ec9e5e9b3a698ab539438
7
- data.tar.gz: 106e99be0a64a27284d6b7a64b796ac0ef6b14e30011b3d42366d1e6494e9f623fdb6221924204830e4e9dbb59a6086b0aac8601a4e7b5a968a59f9bfaefed61
6
+ metadata.gz: fc9c2335031b36bd08fa916c4aa0bef4c65228c8bc6ff91fdb9769ee737541d23473738c51c627b5c2e8ec91a837a00a5570030fdd8aa767b1e61798669a63f9
7
+ data.tar.gz: 0a9733d12ea3a912e50cd47c1083d960b8b4e0065976e5ef9ed0fb572ee2ce25570d0dd52725cd34d3324d683f8ec67f36c6f838e6c30a864720df4bb62b7824
@@ -31,12 +31,12 @@ Gem::Specification.new do |spec|
31
31
 
32
32
  spec.add_development_dependency 'bundler'
33
33
  spec.add_development_dependency 'dotenv'
34
- spec.add_development_dependency 'rake', '~> 10.0'
34
+ spec.add_development_dependency 'rake', '~> 13.0'
35
35
  spec.add_development_dependency 'rspec', '~> 3.8'
36
36
  spec.add_development_dependency 'webmock', '~> 3.4'
37
37
  spec.required_ruby_version = '>= 2.5'
38
38
 
39
- spec.add_dependency '3scale-api', '~> 1.0'
39
+ spec.add_dependency '3scale-api', '~> 1.1'
40
40
  spec.add_dependency 'cri', '~> 2.15'
41
41
  spec.add_dependency 'json-schema', '~> 2.8'
42
42
  spec.add_dependency 'oas_parser', '~> 0.20'
data/README.md CHANGED
@@ -1,9 +1,7 @@
1
1
  # 3scale toolbox
2
2
  [![CircleCI](https://circleci.com/gh/3scale/3scale_toolbox.svg?style=svg)](https://circleci.com/gh/3scale/3scale_toolbox)
3
-
4
- This software is licensed under the [Apache 2.0 license](https://www.apache.org/licenses/LICENSE-2.0).
5
-
6
- See the LICENSE and NOTICE files that should have been provided along with this software for details.
3
+ [![License](https://img.shields.io/badge/license-Apache--2.0-blue.svg)](http://www.apache.org/licenses/LICENSE-2.0)
4
+ [![GitHub release](https://img.shields.io/github/v/release/3scale/3scale_toolbox.svg)](https://github.com/3scale/3scale_toolbox/releases/latest)
7
5
 
8
6
  ## Description
9
7
  3scale toolbox is a set of tools to help you manage your 3scale product. Using the [3scale API Ruby Client](https://github.com/3scale/3scale-api-ruby).
@@ -23,7 +21,7 @@ See the LICENSE and NOTICE files that should have been provided along with this
23
21
  * Create, Apply, List, Delete [Method](docs/method.md)
24
22
  * Create, Apply, List, Show, Delete [Service](docs/service.md)
25
23
  * Create, Apply, List, Delete [ActiveDocs](docs/activedocs.md)
26
- * List, Show, Promote [Proxy Configuration](docs/proxy-config.md)
24
+ * List, Show, Promote, Export [Proxy Configuration](docs/proxy-config.md)
27
25
  * [Copy Policy Registry](docs/copy-policy-registry.md)
28
26
  * Create, Apply, List, Show, Delete, Suspend, Resume [Applications](docs/applications.md)
29
27
  * [Remotes](docs/remotes.md)
@@ -32,6 +30,7 @@ See the LICENSE and NOTICE files that should have been provided along with this
32
30
  * [Develop your own core command](#develop-core-command)
33
31
  * [Licenses](#licenses)
34
32
  * [Plugins](#plugins)
33
+ * [Error Reporting](docs/errors.md)
35
34
  * [Troubleshooting](#troubleshooting)
36
35
  * [Contributing](#contributing)
37
36
 
@@ -82,10 +81,11 @@ COMMANDS
82
81
  method method super command
83
82
  metric metric super command
84
83
  policy-registry policy-registry super command
84
+ product product super command
85
85
  proxy-config proxy-config super command
86
86
  remote remotes super command
87
87
  service services super command
88
- update [DEPRECTATED] update super command
88
+ update [DEPRECATED] update super command
89
89
 
90
90
  OPTIONS
91
91
  -c --config-file=<value> 3scale toolbox configuration file (default:
@@ -20,10 +20,9 @@ module ThreeScaleToolbox
20
20
 
21
21
  def handle_error(error)
22
22
  if expected_error?(error)
23
- warn
24
- warn "\e[1m\e[31mError: #{error.message}\e[0m"
23
+ warn error_serialize(error)
25
24
  else
26
- print_error(error)
25
+ print_unexpected_error(error)
27
26
  end
28
27
  end
29
28
 
@@ -36,21 +35,12 @@ module ThreeScaleToolbox
36
35
  end
37
36
  end
38
37
 
39
- def print_error(error)
40
- write_error(error, $stderr)
41
-
38
+ def print_unexpected_error(error)
42
39
  File.open('crash.log', 'w') do |io|
43
40
  write_verbose_error(error, io)
44
41
  end
45
42
 
46
- write_section_header($stderr, 'Detailed information')
47
- warn
48
- warn 'A detailed crash log has been written to ./crash.log.'
49
- end
50
-
51
- def write_error(error, stream)
52
- write_error_message(error, stream)
53
- write_stack_trace(error, stream)
43
+ warn error_serialize(UnexpectedError.new(error))
54
44
  end
55
45
 
56
46
  def write_error_message(error, stream)
@@ -113,6 +103,19 @@ module ThreeScaleToolbox
113
103
  stream.puts "===== #{title.upcase}:"
114
104
  stream.puts
115
105
  end
106
+
107
+ def error_serialize(error)
108
+ JSON.pretty_generate format_error(error)
109
+ end
110
+
111
+ def format_error(error)
112
+ {
113
+ code: error.code,
114
+ message: error.message,
115
+ class: error.kind,
116
+ stacktrace: error.stacktrace
117
+ }.compact
118
+ end
116
119
  end
117
120
  end
118
121
  end
@@ -7,25 +7,24 @@ module ThreeScaleToolbox
7
7
  ##
8
8
  # Writes Plan limits
9
9
  def call
10
- missing_limits.each do |limit|
11
- metric_id = limit.delete('metric_id')
12
- limit_obj = plan.create_limit(metric_id, limit)
13
- if (errors = limit_obj['errors'])
14
- raise ThreeScaleToolbox::Error, "Plan limit has not been created. #{errors}"
15
- end
10
+ # SET semantics
11
+ # First, delete existing limits
12
+ # Second, add new limits
13
+ plan.limits.each do |limit|
14
+ metric_id = limit.fetch('metric_id')
15
+ plan.delete_limit metric_id, limit.fetch('id')
16
+ puts "Deleted existing plan limit: [metric: #{metric_id}, #{limit}]"
17
+ end
16
18
 
19
+ resource_limits_processed.each do |limit|
20
+ metric_id = limit.delete('metric_id')
21
+ plan.create_limit(metric_id, limit)
17
22
  puts "Created plan limit: [metric: #{metric_id}, #{limit}]"
18
23
  end
19
24
  end
20
25
 
21
26
  private
22
27
 
23
- def missing_limits
24
- ThreeScaleToolbox::Helper.array_difference(resource_limits_processed, plan.limits) do |a, b|
25
- ThreeScaleToolbox::Helper.compare_hashes(a, b, %w[metric_id period])
26
- end
27
- end
28
-
29
28
  def resource_limits_processed
30
29
  resource_limits.map do |limit|
31
30
  metric = find_metric_by_system_name(limit.delete('metric_system_name'))
@@ -7,25 +7,24 @@ module ThreeScaleToolbox
7
7
  ##
8
8
  # Writes Plan pricing rules
9
9
  def call
10
- missing_pricing_rules.each do |pr|
11
- metric_id = pr.delete('metric_id')
12
- resp = plan.create_pricing_rule(metric_id, pr)
13
- if (errors = resp['errors'])
14
- raise ThreeScaleToolbox::Error, "Plan pricing rule has not been created. #{errors}"
15
- end
10
+ # SET semantics
11
+ # First, delete existing pricing rules
12
+ # Second, add new pricing rules
13
+ remote_pr_processed.each do |pr|
14
+ metric_id = pr.fetch('metric_id')
15
+ plan.delete_pricing_rule metric_id, pr.fetch('id')
16
+ puts "Deleted existing plan pricing rule: [metric: #{metric_id}, #{pr}]"
17
+ end
16
18
 
19
+ resource_pr_processed.each do |pr|
20
+ metric_id = pr.delete('metric_id')
21
+ plan.create_pricing_rule(metric_id, pr)
17
22
  puts "Created plan pricing rule: [metric: #{metric_id}, #{pr}]"
18
23
  end
19
24
  end
20
25
 
21
26
  private
22
27
 
23
- def missing_pricing_rules
24
- ThreeScaleToolbox::Helper.array_difference(resource_pr_processed, remote_pr_processed) do |a, b|
25
- ThreeScaleToolbox::Helper.compare_hashes(a, b, %w[metric_id cost_per_unit min max])
26
- end
27
- end
28
-
29
28
  def remote_pr_processed
30
29
  plan.pricing_rules.map do |pr|
31
30
  pr.merge('cost_per_unit' => pr.fetch('cost_per_unit').to_f)
@@ -1,8 +1,10 @@
1
1
  require 'cri'
2
2
  require '3scale_toolbox/base_command'
3
+ require '3scale_toolbox/commands/proxy_config_command/helper'
3
4
  require '3scale_toolbox/commands/proxy_config_command/list_command'
4
5
  require '3scale_toolbox/commands/proxy_config_command/show_command'
5
6
  require '3scale_toolbox/commands/proxy_config_command/promote_command'
7
+ require '3scale_toolbox/commands/proxy_config_command/export_command'
6
8
 
7
9
  module ThreeScaleToolbox
8
10
  module Commands
@@ -25,6 +27,7 @@ module ThreeScaleToolbox
25
27
  add_subcommand(List::ListSubcommand)
26
28
  add_subcommand(Show::ShowSubcommand)
27
29
  add_subcommand(Promote::PromoteSubcommand)
30
+ add_subcommand(Export::ExportSubcommand)
28
31
  end
29
32
  end
30
33
  end
@@ -0,0 +1,74 @@
1
+ module ThreeScaleToolbox
2
+ module Commands
3
+ module ProxyConfigCommand
4
+ module Export
5
+ class ExportSubcommand < Cri::CommandRunner
6
+ include ThreeScaleToolbox::Command
7
+
8
+ def self.command
9
+ Cri::Command.define do
10
+ name 'export'
11
+ usage 'export <remote>'
12
+ summary 'Export proxy configuration for the entire provider account'
13
+ description <<-HEREDOC
14
+ Export proxy configuration for the entire provider account
15
+ \n Can be used as 3scale apicast configuration file
16
+ \n https://github.com/3scale/apicast/blob/master/doc/parameters.md#threescale_config_file
17
+ HEREDOC
18
+
19
+ param :remote
20
+
21
+ ThreeScaleToolbox::CLI.output_flag(self)
22
+ option nil, :environment, "Gateway environment. Must be 'sandbox' or 'production'", default: 'sandbox', argument: :required, transform: ProxyConfigCommand::EnvironmentTransformer.new
23
+
24
+ runner ExportSubcommand
25
+ end
26
+ end
27
+
28
+ def run
29
+ printer.print_record proxy_config_list_obj
30
+ end
31
+
32
+ private
33
+
34
+ def proxy_config_list_obj
35
+ {
36
+ 'services' => proxy_config_list
37
+ }
38
+ end
39
+
40
+ def proxy_config_list
41
+ service_list.map do |service|
42
+ pc = Entities::ProxyConfig.find_latest(service: service, environment: environment)
43
+ pc.attrs['content'] unless pc.nil?
44
+ end.compact
45
+ end
46
+
47
+ def service_list
48
+ tmp_list = remote.list_services
49
+
50
+ if tmp_list.respond_to?(:has_key?) && (errors = tmp_list['errors'])
51
+ raise ThreeScaleToolbox::ThreeScaleApiError.new('Service list not read', errors)
52
+ end
53
+
54
+ tmp_list.map do |svc_attrs|
55
+ Entities::Service.new(id: svc_attrs.fetch('id'), remote: remote, attrs: svc_attrs)
56
+ end
57
+ end
58
+
59
+ def remote
60
+ @remote ||= threescale_client(arguments[:remote])
61
+ end
62
+
63
+ def environment
64
+ options[:environment]
65
+ end
66
+
67
+ def printer
68
+ options.fetch(:output, CLI::JsonPrinter.new)
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,15 @@
1
+ module ThreeScaleToolbox
2
+ module Commands
3
+ module ProxyConfigCommand
4
+ class EnvironmentTransformer
5
+ def call(param_str)
6
+ raise ArgumentError unless param_str.is_a?(String)
7
+
8
+ raise ArgumentError unless %w[production sandbox].include? param_str
9
+
10
+ param_str
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -6,10 +6,25 @@ module ThreeScaleToolbox
6
6
  include Task
7
7
 
8
8
  def call
9
- target.update_proxy source.proxy
9
+ target.update_proxy target_proxy_attrs
10
10
  target.update_oidc source.oidc if source.attrs['backend_version'] == 'oidc'
11
11
  puts "updated proxy of #{target.id} to match the original"
12
12
  end
13
+
14
+ def target_proxy_attrs
15
+ if source.attrs['deployment_option'] == 'hosted'
16
+ # For services with "hosted" deployment config,
17
+ # "Public Base URL" should not be copied, mainly because public base URL is self-assigned.
18
+ # Two 3scale products (aka services) cannot be served using the same public base URL.
19
+ source_proxy.dup.delete_if { |key, _v| %w[endpoint sandbox_endpoint].include? key }
20
+ else
21
+ source_proxy
22
+ end
23
+ end
24
+
25
+ def source_proxy
26
+ @source_proxy ||= source.proxy
27
+ end
13
28
  end
14
29
  end
15
30
  end
@@ -8,7 +8,7 @@ module ThreeScaleToolbox
8
8
  Cri::Command.define do
9
9
  name 'update'
10
10
  usage 'update <sub-command> [options]'
11
- summary '[DEPRECTATED] update super command'
11
+ summary '[DEPRECATED] update super command'
12
12
  description 'Update 3scale entities between tenants'
13
13
 
14
14
  run do |_opts, _args, cmd|
@@ -11,9 +11,9 @@ module ThreeScaleToolbox
11
11
  Cri::Command.define do
12
12
  name 'service'
13
13
  usage 'service [opts] -s <src> -d <dst> <src_service_id> <dst_service_id>'
14
- summary '[DEPRECTATED] update service'
14
+ summary '[DEPRECATED] update service'
15
15
  description <<-HEREDOC
16
- This command has been deprecated. Use '3scale copy service' instead.
16
+ This command has been deprecated. Use '3scale service copy' instead.
17
17
  \n Update existing service, update proxy settings, metrics, methods, application plans and mapping rules.'
18
18
  HEREDOC
19
19
 
@@ -30,6 +30,7 @@ module ThreeScaleToolbox
30
30
  end
31
31
 
32
32
  def run
33
+ warn "\e[1m\e[31mThis command has been deprecated. Use '3scale service copy' instead\e[0m"
33
34
  source_service = Entities::Service.new(
34
35
  id: arguments[:src_service_id],
35
36
  remote: threescale_client(fetch_required_option(:source))
@@ -142,19 +142,46 @@ module ThreeScaleToolbox
142
142
  end
143
143
 
144
144
  def create_pricing_rule(metric_id, pr_attrs)
145
- remote.create_pricingrule id, metric_id, pr_attrs
145
+ pricing_rule_attrs = remote.create_pricingrule id, metric_id, pr_attrs
146
+ if (errors = pricing_rule_attrs['errors'])
147
+ raise ThreeScaleToolbox::Error, "Pricing rule has not been created. #{errors}"
148
+ end
149
+
150
+ pricing_rule_attrs
151
+ end
152
+
153
+ def delete_pricing_rule(metric_id, rule_id)
154
+ remote.delete_application_plan_pricingrule(id, metric_id, rule_id)
146
155
  end
147
156
 
148
157
  def pricing_rules
149
- remote.list_pricingrules_per_application_plan id
158
+ pr_list = remote.list_pricingrules_per_application_plan id
159
+
160
+ if pr_list.respond_to?(:has_key?) && (errors = pr_list['errors'])
161
+ raise ThreeScaleToolbox::ThreeScaleApiError.new('pricing rules not read', errors)
162
+ end
163
+
164
+ pr_list
150
165
  end
151
166
 
152
167
  def features
153
- remote.list_features_per_application_plan id
168
+ feature_list = remote.list_features_per_application_plan id
169
+
170
+ if feature_list.respond_to?(:has_key?) && (errors = feature_list['errors'])
171
+ raise ThreeScaleToolbox::ThreeScaleApiError.new('features not read', errors)
172
+ end
173
+
174
+ feature_list
154
175
  end
155
176
 
156
177
  def create_feature(feature_id)
157
- remote.create_application_plan_feature id, feature_id
178
+ feature = remote.create_application_plan_feature id, feature_id
179
+
180
+ if (errors = feature['errors'])
181
+ raise ThreeScaleToolbox::ThreeScaleApiError.new('feature not created', errors)
182
+ end
183
+
184
+ feature
158
185
  end
159
186
 
160
187
  def delete
@@ -1,9 +1,24 @@
1
1
  module ThreeScaleToolbox
2
2
  # Generic error. Superclass for all specific errors.
3
3
  class Error < ::StandardError
4
+ def code
5
+ 'E_3SCALE'
6
+ end
7
+
8
+ def kind
9
+ self.class
10
+ end
11
+
12
+ def stacktrace
13
+ # For managed errors, stacktrace should not be necessary
14
+ nil
15
+ end
4
16
  end
5
17
 
6
18
  class InvalidUrlError < Error
19
+ def code
20
+ 'E_INVALID_URL'
21
+ end
7
22
  end
8
23
 
9
24
  class ActiveDocsNotFoundError < Error
@@ -12,6 +27,10 @@ module ThreeScaleToolbox
12
27
  def initialize(id)
13
28
  super("ActiveDocs with ID #{id} not found")
14
29
  end
30
+
31
+ def code
32
+ 'E_ACTIVEDOCS_NOT_FOUND'
33
+ end
15
34
  end
16
35
 
17
36
  class ThreeScaleApiError < Error
@@ -25,8 +44,39 @@ module ThreeScaleToolbox
25
44
  def message
26
45
  "#{super}. Errors: #{apierrors}"
27
46
  end
47
+
48
+ def code
49
+ 'E_3SCALE_API'
50
+ end
28
51
  end
29
52
 
30
53
  class InvalidIdError < Error
54
+ def code
55
+ 'E_INVALID_ID'
56
+ end
57
+ end
58
+
59
+ class UnexpectedError < ::StandardError
60
+ attr_reader :unexpectederror
61
+
62
+ def initialize(err)
63
+ @unexpectederror = err
64
+ end
65
+
66
+ def message
67
+ unexpectederror.message
68
+ end
69
+
70
+ def kind
71
+ unexpectederror.class
72
+ end
73
+
74
+ def code
75
+ 'E_UNKNOWN'
76
+ end
77
+
78
+ def stacktrace
79
+ unexpectederror.backtrace
80
+ end
31
81
  end
32
82
  end
@@ -1,3 +1,3 @@
1
1
  module ThreeScaleToolbox
2
- VERSION = '0.16.0'
2
+ VERSION = '0.17.0'
3
3
  end
@@ -3,7 +3,7 @@
3
3
  <dependencies>
4
4
  <dependency>
5
5
  <packageName>3scale-api</packageName>
6
- <version>1.0.0</version>
6
+ <version>1.1.0</version>
7
7
  <licenses>
8
8
  <license>
9
9
  <name>MIT</name>
@@ -13,7 +13,7 @@
13
13
  </dependency>
14
14
  <dependency>
15
15
  <packageName>3scale_toolbox</packageName>
16
- <version>0.16.0</version>
16
+ <version>0.17.0</version>
17
17
  <licenses>
18
18
  <license>
19
19
  <name>MIT</name>
@@ -23,7 +23,7 @@
23
23
  </dependency>
24
24
  <dependency>
25
25
  <packageName>activesupport</packageName>
26
- <version>6.0.2.1</version>
26
+ <version>6.0.3.2</version>
27
27
  <licenses>
28
28
  <license>
29
29
  <name>MIT</name>
@@ -53,7 +53,7 @@
53
53
  </dependency>
54
54
  <dependency>
55
55
  <packageName>bundler</packageName>
56
- <version>1.16.1</version>
56
+ <version>1.17.3</version>
57
57
  <licenses>
58
58
  <license>
59
59
  <name>unknown</name>
@@ -73,7 +73,7 @@
73
73
  </dependency>
74
74
  <dependency>
75
75
  <packageName>concurrent-ruby</packageName>
76
- <version>1.1.5</version>
76
+ <version>1.1.6</version>
77
77
  <licenses>
78
78
  <license>
79
79
  <name>MIT</name>
@@ -161,7 +161,7 @@
161
161
  </dependency>
162
162
  <dependency>
163
163
  <packageName>hashdiff</packageName>
164
- <version>1.0.0</version>
164
+ <version>1.0.1</version>
165
165
  <licenses>
166
166
  <license>
167
167
  <name>MIT</name>
@@ -171,7 +171,7 @@
171
171
  </dependency>
172
172
  <dependency>
173
173
  <packageName>i18n</packageName>
174
- <version>1.8.2</version>
174
+ <version>1.8.3</version>
175
175
  <licenses>
176
176
  <license>
177
177
  <name>MIT</name>
@@ -191,7 +191,7 @@
191
191
  </dependency>
192
192
  <dependency>
193
193
  <packageName>license_finder</packageName>
194
- <version>5.10.2</version>
194
+ <version>5.11.1</version>
195
195
  <licenses>
196
196
  <license>
197
197
  <name>MIT</name>
@@ -201,7 +201,7 @@
201
201
  </dependency>
202
202
  <dependency>
203
203
  <packageName>method_source</packageName>
204
- <version>0.9.2</version>
204
+ <version>1.0.0</version>
205
205
  <licenses>
206
206
  <license>
207
207
  <name>MIT</name>
@@ -221,7 +221,7 @@
221
221
  </dependency>
222
222
  <dependency>
223
223
  <packageName>minitest</packageName>
224
- <version>5.14.0</version>
224
+ <version>5.14.1</version>
225
225
  <licenses>
226
226
  <license>
227
227
  <name>MIT</name>
@@ -231,7 +231,7 @@
231
231
  </dependency>
232
232
  <dependency>
233
233
  <packageName>mustermann</packageName>
234
- <version>1.0.3</version>
234
+ <version>1.1.1</version>
235
235
  <licenses>
236
236
  <license>
237
237
  <name>MIT</name>
@@ -241,7 +241,7 @@
241
241
  </dependency>
242
242
  <dependency>
243
243
  <packageName>mustermann-contrib</packageName>
244
- <version>1.0.3</version>
244
+ <version>1.1.1</version>
245
245
  <licenses>
246
246
  <license>
247
247
  <name>MIT</name>
@@ -251,7 +251,7 @@
251
251
  </dependency>
252
252
  <dependency>
253
253
  <packageName>nokogiri</packageName>
254
- <version>1.10.7</version>
254
+ <version>1.10.9</version>
255
255
  <licenses>
256
256
  <license>
257
257
  <name>MIT</name>
@@ -261,7 +261,7 @@
261
261
  </dependency>
262
262
  <dependency>
263
263
  <packageName>oas_parser</packageName>
264
- <version>0.23.0</version>
264
+ <version>0.25.1</version>
265
265
  <licenses>
266
266
  <license>
267
267
  <name>MIT</name>
@@ -281,7 +281,7 @@
281
281
  </dependency>
282
282
  <dependency>
283
283
  <packageName>pry</packageName>
284
- <version>0.12.2</version>
284
+ <version>0.13.1</version>
285
285
  <licenses>
286
286
  <license>
287
287
  <name>MIT</name>
@@ -291,7 +291,7 @@
291
291
  </dependency>
292
292
  <dependency>
293
293
  <packageName>public_suffix</packageName>
294
- <version>4.0.1</version>
294
+ <version>4.0.4</version>
295
295
  <licenses>
296
296
  <license>
297
297
  <name>MIT</name>
@@ -301,7 +301,7 @@
301
301
  </dependency>
302
302
  <dependency>
303
303
  <packageName>rake</packageName>
304
- <version>10.5.0</version>
304
+ <version>13.0.1</version>
305
305
  <licenses>
306
306
  <license>
307
307
  <name>MIT</name>
@@ -311,7 +311,7 @@
311
311
  </dependency>
312
312
  <dependency>
313
313
  <packageName>rspec</packageName>
314
- <version>3.8.0</version>
314
+ <version>3.9.0</version>
315
315
  <licenses>
316
316
  <license>
317
317
  <name>MIT</name>
@@ -321,7 +321,7 @@
321
321
  </dependency>
322
322
  <dependency>
323
323
  <packageName>rspec-core</packageName>
324
- <version>3.8.2</version>
324
+ <version>3.9.1</version>
325
325
  <licenses>
326
326
  <license>
327
327
  <name>MIT</name>
@@ -331,7 +331,7 @@
331
331
  </dependency>
332
332
  <dependency>
333
333
  <packageName>rspec-expectations</packageName>
334
- <version>3.8.4</version>
334
+ <version>3.9.1</version>
335
335
  <licenses>
336
336
  <license>
337
337
  <name>MIT</name>
@@ -341,7 +341,7 @@
341
341
  </dependency>
342
342
  <dependency>
343
343
  <packageName>rspec-mocks</packageName>
344
- <version>3.8.1</version>
344
+ <version>3.9.1</version>
345
345
  <licenses>
346
346
  <license>
347
347
  <name>MIT</name>
@@ -351,17 +351,27 @@
351
351
  </dependency>
352
352
  <dependency>
353
353
  <packageName>rspec-support</packageName>
354
- <version>3.8.2</version>
354
+ <version>3.9.2</version>
355
355
  <licenses>
356
356
  <license>
357
357
  <name>MIT</name>
358
358
  <url>http://opensource.org/licenses/mit-license</url>
359
359
  </license>
360
360
  </licenses>
361
+ </dependency>
362
+ <dependency>
363
+ <packageName>ruby2_keywords</packageName>
364
+ <version>0.0.2</version>
365
+ <licenses>
366
+ <license>
367
+ <name>ruby</name>
368
+ <url>http://www.ruby-lang.org/en/LICENSE.txt</url>
369
+ </license>
370
+ </licenses>
361
371
  </dependency>
362
372
  <dependency>
363
373
  <packageName>rubyzip</packageName>
364
- <version>2.0.0</version>
374
+ <version>2.3.0</version>
365
375
  <licenses>
366
376
  <license>
367
377
  <name>Simplified BSD</name>
@@ -381,7 +391,7 @@
381
391
  </dependency>
382
392
  <dependency>
383
393
  <packageName>thor</packageName>
384
- <version>0.20.3</version>
394
+ <version>1.0.1</version>
385
395
  <licenses>
386
396
  <license>
387
397
  <name>MIT</name>
@@ -411,7 +421,7 @@
411
421
  </dependency>
412
422
  <dependency>
413
423
  <packageName>tzinfo</packageName>
414
- <version>1.2.6</version>
424
+ <version>1.2.7</version>
415
425
  <licenses>
416
426
  <license>
417
427
  <name>MIT</name>
@@ -421,7 +431,7 @@
421
431
  </dependency>
422
432
  <dependency>
423
433
  <packageName>webmock</packageName>
424
- <version>3.7.5</version>
434
+ <version>3.8.3</version>
425
435
  <licenses>
426
436
  <license>
427
437
  <name>MIT</name>
@@ -451,7 +461,7 @@
451
461
  </dependency>
452
462
  <dependency>
453
463
  <packageName>zeitwerk</packageName>
454
- <version>2.2.2</version>
464
+ <version>2.3.1</version>
455
465
  <licenses>
456
466
  <license>
457
467
  <name>MIT</name>
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: 3scale_toolbox
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.16.0
4
+ version: 0.17.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michal Cichra
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2020-02-05 00:00:00.000000000 Z
12
+ date: 2020-07-20 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -45,14 +45,14 @@ dependencies:
45
45
  requirements:
46
46
  - - "~>"
47
47
  - !ruby/object:Gem::Version
48
- version: '10.0'
48
+ version: '13.0'
49
49
  type: :development
50
50
  prerelease: false
51
51
  version_requirements: !ruby/object:Gem::Requirement
52
52
  requirements:
53
53
  - - "~>"
54
54
  - !ruby/object:Gem::Version
55
- version: '10.0'
55
+ version: '13.0'
56
56
  - !ruby/object:Gem::Dependency
57
57
  name: rspec
58
58
  requirement: !ruby/object:Gem::Requirement
@@ -87,14 +87,14 @@ dependencies:
87
87
  requirements:
88
88
  - - "~>"
89
89
  - !ruby/object:Gem::Version
90
- version: '1.0'
90
+ version: '1.1'
91
91
  type: :runtime
92
92
  prerelease: false
93
93
  version_requirements: !ruby/object:Gem::Requirement
94
94
  requirements:
95
95
  - - "~>"
96
96
  - !ruby/object:Gem::Version
97
- version: '1.0'
97
+ version: '1.1'
98
98
  - !ruby/object:Gem::Dependency
99
99
  name: cri
100
100
  requirement: !ruby/object:Gem::Requirement
@@ -241,6 +241,8 @@ files:
241
241
  - lib/3scale_toolbox/commands/product_command/copy_command/copy_backends_task.rb
242
242
  - lib/3scale_toolbox/commands/product_command/copy_command/delete_target_backend_usages_task.rb
243
243
  - lib/3scale_toolbox/commands/proxy_config_command.rb
244
+ - lib/3scale_toolbox/commands/proxy_config_command/export_command.rb
245
+ - lib/3scale_toolbox/commands/proxy_config_command/helper.rb
244
246
  - lib/3scale_toolbox/commands/proxy_config_command/list_command.rb
245
247
  - lib/3scale_toolbox/commands/proxy_config_command/promote_command.rb
246
248
  - lib/3scale_toolbox/commands/proxy_config_command/show_command.rb
@@ -320,8 +322,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
320
322
  - !ruby/object:Gem::Version
321
323
  version: '0'
322
324
  requirements: []
323
- rubyforge_project:
324
- rubygems_version: 2.7.6
325
+ rubygems_version: 3.1.2
325
326
  signing_key:
326
327
  specification_version: 4
327
328
  summary: 3scale Toolbox.