pact_broker-client 1.41.0 → 1.42.0
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/CHANGELOG.md +17 -0
- data/lib/pact_broker/client/backports.rb +9 -0
- data/lib/pact_broker/client/base_command.rb +95 -0
- data/lib/pact_broker/client/cli/broker.rb +11 -19
- data/lib/pact_broker/client/cli/custom_thor.rb +12 -0
- data/lib/pact_broker/client/cli/environment_commands.rb +70 -0
- data/lib/pact_broker/client/cli/pacticipant_commands.rb +44 -0
- data/lib/pact_broker/client/environments.rb +3 -0
- data/lib/pact_broker/client/environments/create_environment.rb +31 -0
- data/lib/pact_broker/client/environments/delete_environment.rb +27 -0
- data/lib/pact_broker/client/environments/describe_environment.rb +36 -0
- data/lib/pact_broker/client/environments/environment_command.rb +66 -0
- data/lib/pact_broker/client/environments/list_environments.rb +30 -0
- data/lib/pact_broker/client/environments/text_formatter.rb +30 -0
- data/lib/pact_broker/client/environments/update_environment.rb +31 -0
- data/lib/pact_broker/client/generate_display_name.rb +27 -0
- data/lib/pact_broker/client/hal/entity.rb +10 -3
- data/lib/pact_broker/client/hal/http_client.rb +5 -0
- data/lib/pact_broker/client/hal/link.rb +8 -0
- data/lib/pact_broker/client/hal_client_methods.rb +1 -3
- data/lib/pact_broker/client/matrix/text_formatter.rb +21 -13
- data/lib/pact_broker/client/pacticipants.rb +6 -0
- data/lib/pact_broker/client/pacticipants/create.rb +24 -34
- data/lib/pact_broker/client/pacticipants/list.rb +34 -0
- data/lib/pact_broker/client/pacticipants/text_formatter.rb +41 -0
- data/lib/pact_broker/client/string_refinements.rb +56 -0
- data/lib/pact_broker/client/version.rb +1 -1
- data/pact-broker-client.gemspec +1 -0
- data/spec/fixtures/approvals/describe_environment.approved.txt +7 -0
- data/spec/fixtures/approvals/list_environments.approved.txt +3 -0
- data/spec/lib/pact_broker/client/cli/broker_can_i_deploy_spec.rb +3 -3
- data/spec/lib/pact_broker/client/cli/broker_publish_spec.rb +1 -1
- data/spec/lib/pact_broker/client/cli/broker_run_webhook_commands_spec.rb +3 -3
- data/spec/lib/pact_broker/client/environments/delete_environment_spec.rb +120 -0
- data/spec/lib/pact_broker/client/environments/describe_environment_spec.rb +89 -0
- data/spec/lib/pact_broker/client/environments/update_environment_spec.rb +167 -0
- data/spec/lib/pact_broker/client/generate_display_name_spec.rb +39 -0
- data/spec/lib/pact_broker/client/hal/entity_spec.rb +2 -2
- data/spec/lib/pact_broker/client/pacticipants/create_spec.rb +2 -2
- data/spec/service_providers/create_environment_spec.rb +78 -0
- data/spec/service_providers/list_environments_spec.rb +77 -0
- data/spec/service_providers/pacticipants_create_spec.rb +5 -4
- data/spec/spec_helper.rb +1 -0
- data/spec/support/approvals.rb +1 -1
- metadata +48 -3
@@ -0,0 +1,66 @@
|
|
1
|
+
require 'pact_broker/client/base_command'
|
2
|
+
|
3
|
+
module PactBroker
|
4
|
+
module Client
|
5
|
+
module Environments
|
6
|
+
class EnvironmentCommand < PactBroker::Client::BaseCommand
|
7
|
+
NOT_SUPPORTED_MESSAGE = "This version of the Pact Broker does not support environments. Please upgrade to version 2.80.0 or later."
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def new_environment_body
|
12
|
+
{
|
13
|
+
"name" => params[:name],
|
14
|
+
"displayName" => params[:display_name],
|
15
|
+
"production" => params[:production],
|
16
|
+
"contacts" => contacts
|
17
|
+
}.compact
|
18
|
+
end
|
19
|
+
|
20
|
+
def environments_link
|
21
|
+
index_resource._link!("pb:environments")
|
22
|
+
end
|
23
|
+
|
24
|
+
def existing_environment_link
|
25
|
+
index_resource
|
26
|
+
._link!("pb:environment")
|
27
|
+
.expand(uuid: params[:uuid])
|
28
|
+
end
|
29
|
+
|
30
|
+
def existing_environment_resource
|
31
|
+
@existing_environment_resource ||= existing_environment_link.get
|
32
|
+
end
|
33
|
+
|
34
|
+
def existing_environment_resource!
|
35
|
+
existing_environment_resource.assert_success!
|
36
|
+
end
|
37
|
+
|
38
|
+
def existing_environment_body
|
39
|
+
@existing_environment_params ||= existing_environment_resource!
|
40
|
+
.response
|
41
|
+
.body
|
42
|
+
.except("uuid", "_links", "createdAt", "updatedAt")
|
43
|
+
end
|
44
|
+
|
45
|
+
def contacts
|
46
|
+
if params[:contact_name] || params[:contact_email_address]
|
47
|
+
contact = {}
|
48
|
+
contact["name"] = params[:contact_name] || "unknown"
|
49
|
+
if params[:contact_email_address]
|
50
|
+
contact["details"] = { "emailAddress" => params[:contact_email_address] }
|
51
|
+
end
|
52
|
+
[contact]
|
53
|
+
else
|
54
|
+
nil
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def check_if_command_supported
|
59
|
+
unless index_resource.can?("pb:environments")
|
60
|
+
raise PactBroker::Client::Error.new(NOT_SUPPORTED_MESSAGE)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'pact_broker/client/environments/environment_command'
|
2
|
+
require 'pact_broker/client/environments/text_formatter'
|
3
|
+
|
4
|
+
module PactBroker
|
5
|
+
module Client
|
6
|
+
module Environments
|
7
|
+
class ListEnvironments < PactBroker::Client::Environments::EnvironmentCommand
|
8
|
+
private
|
9
|
+
|
10
|
+
attr_reader :environments_resource
|
11
|
+
|
12
|
+
def do_call
|
13
|
+
PactBroker::Client::CommandResult.new(true, result_message)
|
14
|
+
end
|
15
|
+
|
16
|
+
def environments_resource
|
17
|
+
@environments_resource = environments_link.get!
|
18
|
+
end
|
19
|
+
|
20
|
+
def result_message
|
21
|
+
if json_output?
|
22
|
+
environments_resource.response.raw_body
|
23
|
+
else
|
24
|
+
PactBroker::Client::Environments::TextFormatter.call(environments_resource._embedded["environments"])
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'table_print'
|
2
|
+
require 'ostruct'
|
3
|
+
|
4
|
+
module PactBroker
|
5
|
+
module Client
|
6
|
+
module Environments
|
7
|
+
class TextFormatter
|
8
|
+
|
9
|
+
def self.call(environments)
|
10
|
+
return "" if environments.size == 0
|
11
|
+
|
12
|
+
data = environments.collect do | environment |
|
13
|
+
OpenStruct.new(environment)
|
14
|
+
end.sort_by{ | environment | environment.name.downcase }
|
15
|
+
|
16
|
+
uuid_width = data.collect(&:uuid).collect(&:size).max
|
17
|
+
|
18
|
+
tp_options = [
|
19
|
+
{ uuid: { width: uuid_width } },
|
20
|
+
{ name: {} },
|
21
|
+
{ displayName: { display_name: "Display name" } },
|
22
|
+
{ production: {} }
|
23
|
+
]
|
24
|
+
|
25
|
+
TablePrint::Printer.new(data, tp_options).table_print
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'pact_broker/client/environments/environment_command'
|
2
|
+
|
3
|
+
module PactBroker
|
4
|
+
module Client
|
5
|
+
module Environments
|
6
|
+
class UpdateEnvironment < PactBroker::Client::Environments::EnvironmentCommand
|
7
|
+
|
8
|
+
private
|
9
|
+
|
10
|
+
attr_reader :updated_environment_resource
|
11
|
+
|
12
|
+
def do_call
|
13
|
+
@updated_environment_resource = existing_environment_link.put!(request_body)
|
14
|
+
PactBroker::Client::CommandResult.new(updated_environment_resource.success?, result_message)
|
15
|
+
end
|
16
|
+
|
17
|
+
def request_body
|
18
|
+
@request_body ||= existing_environment_body.merge(new_environment_body)
|
19
|
+
end
|
20
|
+
|
21
|
+
def result_message
|
22
|
+
if json_output?
|
23
|
+
updated_environment_resource.response.raw_body
|
24
|
+
else
|
25
|
+
::Term::ANSIColor.green("Updated #{request_body["name"]} environment in #{pact_broker_name}")
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'pact_broker/client/string_refinements'
|
2
|
+
|
3
|
+
module PactBroker
|
4
|
+
module Client
|
5
|
+
module GenerateDisplayName
|
6
|
+
using PactBroker::Client::StringRefinements
|
7
|
+
|
8
|
+
def self.call(name)
|
9
|
+
return nil if name.nil?
|
10
|
+
name
|
11
|
+
.to_s
|
12
|
+
.gsub(/([A-Z])([A-Z])([a-z])/,'\1 \2\3')
|
13
|
+
.gsub(/([a-z\d])([A-Z])(\S)/,'\1 \2\3')
|
14
|
+
.gsub(/(\S)([\-_\s\.])(\S)/, '\1 \3')
|
15
|
+
.gsub(/\s+/, " ")
|
16
|
+
.strip
|
17
|
+
.split(" ")
|
18
|
+
.collect{ |word| word.camelcase(true) }
|
19
|
+
.join(" ")
|
20
|
+
end
|
21
|
+
|
22
|
+
def generate_display_name(name)
|
23
|
+
GenerateDisplayName.call(name)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -8,7 +8,14 @@ module PactBroker
|
|
8
8
|
module Client
|
9
9
|
module Hal
|
10
10
|
class RelationNotFoundError < ::PactBroker::Client::Error; end
|
11
|
-
class ErrorResponseReturned < ::PactBroker::Client::Error
|
11
|
+
class ErrorResponseReturned < ::PactBroker::Client::Error
|
12
|
+
attr_reader :entity
|
13
|
+
|
14
|
+
def initialize(message, entity)
|
15
|
+
super(message)
|
16
|
+
@entity = entity
|
17
|
+
end
|
18
|
+
end
|
12
19
|
|
13
20
|
class Entity
|
14
21
|
def initialize(href, data, http_client, response = nil)
|
@@ -159,13 +166,13 @@ module PactBroker
|
|
159
166
|
end
|
160
167
|
|
161
168
|
def assert_success!(messages = {})
|
162
|
-
default_message = "Error
|
169
|
+
default_message = "Error making request to #{@href} status=#{response ? response.status: nil} #{response ? response.raw_body : ''}".strip
|
163
170
|
message = if response && messages[response.status]
|
164
171
|
(messages[response.status] || "") + " (#{default_message})"
|
165
172
|
else
|
166
173
|
default_message
|
167
174
|
end
|
168
|
-
raise ErrorResponseReturned.new(message)
|
175
|
+
raise ErrorResponseReturned.new(message, self)
|
169
176
|
end
|
170
177
|
end
|
171
178
|
end
|
@@ -39,6 +39,11 @@ module PactBroker
|
|
39
39
|
perform_request(create_request(uri, 'Patch', body, headers), uri)
|
40
40
|
end
|
41
41
|
|
42
|
+
def delete href, body = nil, headers = {}
|
43
|
+
uri = URI(href)
|
44
|
+
perform_request(create_request(uri, 'Delete', body, headers), uri)
|
45
|
+
end
|
46
|
+
|
42
47
|
def create_request uri, http_method, body = nil, headers = {}
|
43
48
|
request = Net::HTTP.const_get(http_method).new(uri.request_uri)
|
44
49
|
request['Content-Type'] = "application/json" if ['Post', 'Put', 'Patch'].include?(http_method)
|
@@ -69,6 +69,14 @@ module PactBroker
|
|
69
69
|
patch(*args).assert_success!
|
70
70
|
end
|
71
71
|
|
72
|
+
def delete(payload = nil, headers = {})
|
73
|
+
wrap_response(href, @http_client.delete(href, payload ? JSON.dump(payload) : nil, headers))
|
74
|
+
end
|
75
|
+
|
76
|
+
def delete!(*args)
|
77
|
+
delete(*args).assert_success!
|
78
|
+
end
|
79
|
+
|
72
80
|
def expand(params)
|
73
81
|
expanded_url = expand_url(params, href)
|
74
82
|
new_attrs = @attrs.merge('href' => expanded_url)
|
@@ -11,21 +11,17 @@ module PactBroker
|
|
11
11
|
|
12
12
|
Line = Struct.new(:consumer, :consumer_version, :provider, :provider_version, :success, :ref, :ignored)
|
13
13
|
|
14
|
-
TP_OPTIONS = [
|
15
|
-
{ consumer: {} },
|
16
|
-
{ consumer_version: {display_name: 'C.VERSION'} },
|
17
|
-
{ provider: {} },
|
18
|
-
{ provider_version: {display_name: 'P.VERSION'} },
|
19
|
-
{ success: {display_name: 'SUCCESS?'} },
|
20
|
-
{ ref: { display_name: 'RESULT#' } }
|
21
|
-
]
|
22
|
-
|
23
14
|
def self.call(matrix)
|
24
|
-
tp_options = TP_OPTIONS.dup
|
25
15
|
matrix_rows = matrix[:matrix]
|
26
16
|
return "" if matrix_rows.size == 0
|
17
|
+
data = prepare_data(matrix_rows)
|
18
|
+
printer = TablePrint::Printer.new(data, tp_options(data))
|
19
|
+
printer.table_print + verification_result_urls_text(matrix)
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.prepare_data(matrix_rows)
|
27
23
|
verification_result_number = 0
|
28
|
-
|
24
|
+
matrix_rows.each_with_index.collect do | line |
|
29
25
|
has_verification_result_url = lookup(line, nil, :verificationResult, :_links, :self, :href)
|
30
26
|
if has_verification_result_url
|
31
27
|
verification_result_number += 1
|
@@ -40,9 +36,17 @@ module PactBroker
|
|
40
36
|
lookup(line, nil, :ignored)
|
41
37
|
)
|
42
38
|
end
|
39
|
+
end
|
43
40
|
|
44
|
-
|
45
|
-
|
41
|
+
def self.tp_options(data)
|
42
|
+
[
|
43
|
+
{ consumer: { width: max_width(data, :consumer, 'CONSUMER') } },
|
44
|
+
{ consumer_version: { display_name: 'C.VERSION', width: max_width(data, :consumer_version, 'C.VERSION') } },
|
45
|
+
{ provider: { width: max_width(data, :provider, 'PROVIDER') } },
|
46
|
+
{ provider_version: { display_name: 'P.VERSION', width: max_width(data, :provider_version, 'P.VERSION') } },
|
47
|
+
{ success: { display_name: 'SUCCESS?' } },
|
48
|
+
{ ref: { display_name: 'RESULT#' } }
|
49
|
+
]
|
46
50
|
end
|
47
51
|
|
48
52
|
def self.lookup line, default, *keys
|
@@ -75,6 +79,10 @@ module PactBroker
|
|
75
79
|
text
|
76
80
|
end
|
77
81
|
end
|
82
|
+
|
83
|
+
def self.max_width(data, column, title)
|
84
|
+
(data.collect{ |row| row.send(column) } + [title]).compact.collect(&:size).max
|
85
|
+
end
|
78
86
|
end
|
79
87
|
end
|
80
88
|
end
|
@@ -1,55 +1,45 @@
|
|
1
|
-
require 'pact_broker/client/
|
2
|
-
require 'json'
|
3
|
-
require 'pact_broker/client/command_result'
|
4
|
-
require 'pact_broker/client/hal_client_methods'
|
1
|
+
require 'pact_broker/client/base_command'
|
5
2
|
|
6
3
|
module PactBroker
|
7
4
|
module Client
|
8
5
|
module Pacticipants2
|
9
|
-
class Create
|
6
|
+
class Create < PactBroker::Client::BaseCommand
|
10
7
|
|
11
|
-
|
8
|
+
private
|
12
9
|
|
13
|
-
|
14
|
-
new(params, pact_broker_base_url, pact_broker_client_options).call
|
15
|
-
end
|
10
|
+
attr_reader :action, :response_entity
|
16
11
|
|
17
|
-
def
|
18
|
-
|
19
|
-
@index_entry_point = create_index_entry_point(pact_broker_base_url, pact_broker_client_options)
|
20
|
-
@verbose = pact_broker_client_options[:verbose]
|
21
|
-
end
|
12
|
+
def do_call
|
13
|
+
pacticipant_entity = index_resource._link('pb:pacticipant').expand('pacticipant' => params[:name]).get
|
22
14
|
|
23
|
-
def call
|
24
|
-
pacticipant_entity = index_entity._link('pb:pacticipant').expand('pacticipant' => params[:name]).get
|
25
|
-
message = nil
|
26
15
|
response_entity = if pacticipant_entity.does_not_exist?
|
27
|
-
|
28
|
-
|
16
|
+
@action = "created"
|
17
|
+
index_resource._link!('pb:pacticipants').post!(pacticipant_resource_params)
|
18
|
+
elsif pacticipant_entity.success?
|
19
|
+
@action = "updated"
|
20
|
+
pacticipant_entity._link!('self').patch!(pacticipant_resource_params)
|
29
21
|
else
|
30
|
-
|
31
|
-
pacticipant_entity._link!('self').patch(pacticipant_resource_params)
|
22
|
+
pacticipant_entity.assert_success!
|
32
23
|
end
|
33
24
|
|
34
25
|
response_entity.assert_success!
|
35
|
-
PactBroker::Client::CommandResult.new(true,
|
36
|
-
rescue StandardError => e
|
37
|
-
$stderr.puts("#{e.class} - #{e}\n#{e.backtrace.join("\n")}") if verbose
|
38
|
-
PactBroker::Client::CommandResult.new(false, "#{e.class} - #{e}")
|
26
|
+
PactBroker::Client::CommandResult.new(true, result_message)
|
39
27
|
end
|
40
28
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
29
|
+
def result_message
|
30
|
+
if json_output?
|
31
|
+
response_entity.response.raw_body
|
32
|
+
else
|
33
|
+
green(message = "Pacticipant \"#{params[:name]}\" #{action}")
|
34
|
+
end
|
47
35
|
end
|
48
36
|
|
49
37
|
def pacticipant_resource_params
|
50
|
-
|
51
|
-
|
52
|
-
|
38
|
+
{
|
39
|
+
name: params[:name],
|
40
|
+
repositoryUrl: params[:repository_url],
|
41
|
+
displayName: params[:display_name]
|
42
|
+
}.compact
|
53
43
|
end
|
54
44
|
end
|
55
45
|
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'pact_broker/client/base_command'
|
2
|
+
require 'pact_broker/client/pacticipants/text_formatter'
|
3
|
+
|
4
|
+
module PactBroker
|
5
|
+
module Client
|
6
|
+
module Pacticipants2
|
7
|
+
class List < PactBroker::Client::BaseCommand
|
8
|
+
private
|
9
|
+
|
10
|
+
attr_reader :environments_resource
|
11
|
+
|
12
|
+
def do_call
|
13
|
+
PactBroker::Client::CommandResult.new(true, result_message)
|
14
|
+
end
|
15
|
+
|
16
|
+
def environments_resource
|
17
|
+
@environments_resource = environments_link.get!
|
18
|
+
end
|
19
|
+
|
20
|
+
def environments_link
|
21
|
+
index_resource._link!('pb:pacticipants')
|
22
|
+
end
|
23
|
+
|
24
|
+
def result_message
|
25
|
+
if json_output?
|
26
|
+
environments_resource.response.raw_body
|
27
|
+
else
|
28
|
+
TextFormatter.call(environments_resource._embedded["pacticipants"])
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|