pact-v2 2.0.0.pre.preview1
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 +7 -0
- data/CHANGELOG.md +1321 -0
- data/LICENSE.txt +23 -0
- data/bin/pact +4 -0
- data/lib/pact/cli/generate_pact_docs.rb +4 -0
- data/lib/pact/cli/run_pact_verification.rb +99 -0
- data/lib/pact/cli/spec_criteria.rb +26 -0
- data/lib/pact/cli.rb +45 -0
- data/lib/pact/consumer/configuration/configuration_extensions.rb +90 -0
- data/lib/pact/consumer/configuration/dsl.rb +11 -0
- data/lib/pact/consumer/configuration/mock_service.rb +112 -0
- data/lib/pact/consumer/configuration/service_consumer.rb +51 -0
- data/lib/pact/consumer/configuration/service_provider.rb +40 -0
- data/lib/pact/consumer/configuration.rb +10 -0
- data/lib/pact/consumer/consumer_contract_builder.rb +82 -0
- data/lib/pact/consumer/consumer_contract_builders.rb +10 -0
- data/lib/pact/consumer/interaction_builder.rb +45 -0
- data/lib/pact/consumer/rspec.rb +35 -0
- data/lib/pact/consumer/spec_hooks.rb +40 -0
- data/lib/pact/consumer/world.rb +37 -0
- data/lib/pact/consumer.rb +7 -0
- data/lib/pact/doc/README.md +13 -0
- data/lib/pact/doc/doc_file.rb +40 -0
- data/lib/pact/doc/generate.rb +11 -0
- data/lib/pact/doc/generator.rb +82 -0
- data/lib/pact/doc/interaction_view_model.rb +124 -0
- data/lib/pact/doc/markdown/consumer_contract_renderer.rb +68 -0
- data/lib/pact/doc/markdown/generator.rb +26 -0
- data/lib/pact/doc/markdown/index_renderer.rb +43 -0
- data/lib/pact/doc/markdown/interaction.erb +14 -0
- data/lib/pact/doc/markdown/interaction_renderer.rb +43 -0
- data/lib/pact/doc/sort_interactions.rb +16 -0
- data/lib/pact/hal/authorization_header_redactor.rb +32 -0
- data/lib/pact/hal/entity.rb +110 -0
- data/lib/pact/hal/http_client.rb +128 -0
- data/lib/pact/hal/link.rb +112 -0
- data/lib/pact/hal/non_json_entity.rb +28 -0
- data/lib/pact/hash_refinements.rb +17 -0
- data/lib/pact/pact_broker/fetch_pact_uris_for_verification.rb +112 -0
- data/lib/pact/pact_broker/fetch_pacts.rb +103 -0
- data/lib/pact/pact_broker/notices.rb +34 -0
- data/lib/pact/pact_broker/pact_selection_description.rb +66 -0
- data/lib/pact/pact_broker.rb +25 -0
- data/lib/pact/project_root.rb +7 -0
- data/lib/pact/provider/configuration/configuration_extension.rb +69 -0
- data/lib/pact/provider/configuration/dsl.rb +18 -0
- data/lib/pact/provider/configuration/message_provider_dsl.rb +63 -0
- data/lib/pact/provider/configuration/pact_verification.rb +48 -0
- data/lib/pact/provider/configuration/pact_verification_from_broker.rb +126 -0
- data/lib/pact/provider/configuration/service_provider_config.rb +32 -0
- data/lib/pact/provider/configuration/service_provider_dsl.rb +107 -0
- data/lib/pact/provider/configuration.rb +7 -0
- data/lib/pact/provider/context.rb +0 -0
- data/lib/pact/provider/help/console_text.rb +76 -0
- data/lib/pact/provider/help/content.rb +38 -0
- data/lib/pact/provider/help/pact_diff.rb +43 -0
- data/lib/pact/provider/help/prompt_text.rb +49 -0
- data/lib/pact/provider/help/write.rb +56 -0
- data/lib/pact/provider/matchers/messages.rb +66 -0
- data/lib/pact/provider/pact_helper_locator.rb +24 -0
- data/lib/pact/provider/pact_source.rb +40 -0
- data/lib/pact/provider/pact_spec_runner.rb +188 -0
- data/lib/pact/provider/pact_uri.rb +55 -0
- data/lib/pact/provider/pact_verification.rb +17 -0
- data/lib/pact/provider/print_missing_provider_states.rb +35 -0
- data/lib/pact/provider/request.rb +77 -0
- data/lib/pact/provider/rspec/backtrace_formatter.rb +43 -0
- data/lib/pact/provider/rspec/calculate_exit_code.rb +18 -0
- data/lib/pact/provider/rspec/custom_options_file +0 -0
- data/lib/pact/provider/rspec/formatter_rspec_2.rb +76 -0
- data/lib/pact/provider/rspec/formatter_rspec_3.rb +195 -0
- data/lib/pact/provider/rspec/json_formatter.rb +100 -0
- data/lib/pact/provider/rspec/matchers.rb +80 -0
- data/lib/pact/provider/rspec/pact_broker_formatter.rb +76 -0
- data/lib/pact/provider/rspec.rb +234 -0
- data/lib/pact/provider/state/provider_state.rb +180 -0
- data/lib/pact/provider/state/provider_state_configured_modules.rb +15 -0
- data/lib/pact/provider/state/provider_state_manager.rb +42 -0
- data/lib/pact/provider/state/provider_state_proxy.rb +39 -0
- data/lib/pact/provider/state/set_up.rb +13 -0
- data/lib/pact/provider/state/tear_down.rb +13 -0
- data/lib/pact/provider/test_methods.rb +77 -0
- data/lib/pact/provider/verification_report.rb +36 -0
- data/lib/pact/provider/verification_results/create.rb +88 -0
- data/lib/pact/provider/verification_results/publish.rb +143 -0
- data/lib/pact/provider/verification_results/publish_all.rb +50 -0
- data/lib/pact/provider/verification_results/verification_result.rb +40 -0
- data/lib/pact/provider/world.rb +50 -0
- data/lib/pact/provider.rb +3 -0
- data/lib/pact/retry.rb +37 -0
- data/lib/pact/tasks/task_helper.rb +62 -0
- data/lib/pact/tasks/verification_task.rb +95 -0
- data/lib/pact/tasks.rb +2 -0
- data/lib/pact/templates/help.erb +22 -0
- data/lib/pact/templates/provider_state.erb +14 -0
- data/lib/pact/utils/metrics.rb +100 -0
- data/lib/pact/utils/string.rb +35 -0
- data/lib/pact/v2/configuration.rb +23 -0
- data/lib/pact/v2/consumer/grpc_interaction_builder.rb +187 -0
- data/lib/pact/v2/consumer/http_interaction_builder.rb +163 -0
- data/lib/pact/v2/consumer/interaction_contents.rb +54 -0
- data/lib/pact/v2/consumer/message_interaction_builder.rb +280 -0
- data/lib/pact/v2/consumer/mock_server.rb +99 -0
- data/lib/pact/v2/consumer/pact_config/base.rb +24 -0
- data/lib/pact/v2/consumer/pact_config/grpc.rb +26 -0
- data/lib/pact/v2/consumer/pact_config/http.rb +55 -0
- data/lib/pact/v2/consumer/pact_config/message.rb +17 -0
- data/lib/pact/v2/consumer/pact_config.rb +24 -0
- data/lib/pact/v2/consumer.rb +8 -0
- data/lib/pact/v2/matchers/base.rb +67 -0
- data/lib/pact/v2/matchers/v1/equality.rb +19 -0
- data/lib/pact/v2/matchers/v2/regex.rb +19 -0
- data/lib/pact/v2/matchers/v2/type.rb +17 -0
- data/lib/pact/v2/matchers/v3/boolean.rb +17 -0
- data/lib/pact/v2/matchers/v3/date.rb +18 -0
- data/lib/pact/v2/matchers/v3/date_time.rb +18 -0
- data/lib/pact/v2/matchers/v3/decimal.rb +17 -0
- data/lib/pact/v2/matchers/v3/each.rb +42 -0
- data/lib/pact/v2/matchers/v3/include.rb +17 -0
- data/lib/pact/v2/matchers/v3/integer.rb +17 -0
- data/lib/pact/v2/matchers/v3/number.rb +17 -0
- data/lib/pact/v2/matchers/v3/time.rb +18 -0
- data/lib/pact/v2/matchers/v4/each_key.rb +26 -0
- data/lib/pact/v2/matchers/v4/each_key_value.rb +32 -0
- data/lib/pact/v2/matchers/v4/each_value.rb +33 -0
- data/lib/pact/v2/matchers/v4/not_empty.rb +17 -0
- data/lib/pact/v2/matchers.rb +94 -0
- data/lib/pact/v2/native/blocking_verifier.rb +17 -0
- data/lib/pact/v2/native/logger.rb +25 -0
- data/lib/pact/v2/provider/async_message_verifier.rb +28 -0
- data/lib/pact/v2/provider/base_verifier.rb +242 -0
- data/lib/pact/v2/provider/grpc_verifier.rb +38 -0
- data/lib/pact/v2/provider/gruf_server.rb +75 -0
- data/lib/pact/v2/provider/http_server.rb +79 -0
- data/lib/pact/v2/provider/http_verifier.rb +43 -0
- data/lib/pact/v2/provider/message_provider_servlet.rb +79 -0
- data/lib/pact/v2/provider/mixed_verifier.rb +22 -0
- data/lib/pact/v2/provider/pact_broker_proxy.rb +71 -0
- data/lib/pact/v2/provider/pact_broker_proxy_runner.rb +77 -0
- data/lib/pact/v2/provider/pact_config/async.rb +29 -0
- data/lib/pact/v2/provider/pact_config/base.rb +101 -0
- data/lib/pact/v2/provider/pact_config/grpc.rb +26 -0
- data/lib/pact/v2/provider/pact_config/http.rb +27 -0
- data/lib/pact/v2/provider/pact_config/mixed.rb +39 -0
- data/lib/pact/v2/provider/pact_config.rb +26 -0
- data/lib/pact/v2/provider/provider_server_runner.rb +89 -0
- data/lib/pact/v2/provider/provider_state_configuration.rb +32 -0
- data/lib/pact/v2/provider/provider_state_servlet.rb +86 -0
- data/lib/pact/v2/provider.rb +8 -0
- data/lib/pact/v2/railtie.rb +13 -0
- data/lib/pact/v2/rspec/support/pact_consumer_helpers.rb +80 -0
- data/lib/pact/v2/rspec/support/pact_message_helpers.rb +42 -0
- data/lib/pact/v2/rspec/support/pact_provider_helpers.rb +129 -0
- data/lib/pact/v2/rspec/support/waterdrop/pact_waterdrop_client.rb +27 -0
- data/lib/pact/v2/rspec/support/webmock/webmock_helpers.rb +30 -0
- data/lib/pact/v2/rspec.rb +17 -0
- data/lib/pact/v2/tasks/pact.rake +13 -0
- data/lib/pact/v2/version.rb +8 -0
- data/lib/pact/v2.rb +71 -0
- data/lib/pact/version.rb +4 -0
- data/lib/pact.rb +13 -0
- data/lib/tasks/pact.rake +34 -0
- data/pact.gemspec +106 -0
- metadata +529 -0
@@ -0,0 +1,66 @@
|
|
1
|
+
module Pact
|
2
|
+
module PactBroker
|
3
|
+
module PactSelectionDescription
|
4
|
+
def pact_selection_description(provider, consumer_version_selectors, options, broker_base_url)
|
5
|
+
message = "Fetching pacts for #{provider} from #{broker_base_url} with the selection criteria: "
|
6
|
+
if consumer_version_selectors.any?
|
7
|
+
desc = consumer_version_selectors.collect do |selector|
|
8
|
+
desc = nil
|
9
|
+
if selector[:tag]
|
10
|
+
desc = !selector[:latest] ? "all for tag #{selector[:tag]}" : "latest for tag #{selector[:tag]}"
|
11
|
+
desc = "#{desc} of #{selector[:consumer]}" if selector[:consumer]
|
12
|
+
elsif selector[:branch]
|
13
|
+
desc = "latest from branch #{selector[:branch]}"
|
14
|
+
desc = "#{desc} of #{selector[:consumer]}" if selector[:consumer]
|
15
|
+
elsif selector[:mainBranch]
|
16
|
+
desc = "latest from main branch"
|
17
|
+
desc = "#{desc} of #{selector[:consumer]}" if selector[:consumer]
|
18
|
+
elsif selector[:deployed]
|
19
|
+
if selector[:environment]
|
20
|
+
desc = "currently deployed to #{selector[:environment]}"
|
21
|
+
else
|
22
|
+
desc = "currently deployed"
|
23
|
+
end
|
24
|
+
desc = "#{selector[:consumer]} #{desc}" if selector[:consumer]
|
25
|
+
elsif selector[:released]
|
26
|
+
if selector[:environment]
|
27
|
+
desc = "currently released to #{selector[:environment]}"
|
28
|
+
else
|
29
|
+
desc = "currently released"
|
30
|
+
end
|
31
|
+
desc = "#{selector[:consumer]} #{desc}" if selector[:consumer]
|
32
|
+
elsif selector[:deployedOrReleased]
|
33
|
+
if selector[:environment]
|
34
|
+
desc = "currently deployed or released to #{selector[:environment]}"
|
35
|
+
else
|
36
|
+
desc = "currently deployed or released"
|
37
|
+
end
|
38
|
+
desc = "#{selector[:consumer]} #{desc}" if selector[:consumer]
|
39
|
+
elsif selector[:environment]
|
40
|
+
desc = "currently in #{selector[:environment]}"
|
41
|
+
desc = "#{selector[:consumer]} #{desc}" if selector[:consumer]
|
42
|
+
elsif selector[:matchingBranch]
|
43
|
+
desc = "matching current branch"
|
44
|
+
desc = "#{desc} for #{selector[:consumer]}" if selector[:consumer]
|
45
|
+
elsif selector[:matchingTag]
|
46
|
+
desc = "matching tag"
|
47
|
+
desc = "#{desc} for #{selector[:consumer]}" if selector[:consumer]
|
48
|
+
else
|
49
|
+
desc = selector.to_s
|
50
|
+
end
|
51
|
+
|
52
|
+
fallback = selector[:fallback] || selector[:fallbackTag]
|
53
|
+
desc = "#{desc} (or #{fallback} if not found)" if fallback
|
54
|
+
|
55
|
+
desc
|
56
|
+
end.join(", ")
|
57
|
+
if options[:include_wip_pacts_since]
|
58
|
+
desc = "#{desc}, work in progress pacts created after #{options[:include_wip_pacts_since]}"
|
59
|
+
end
|
60
|
+
message << "#{desc}"
|
61
|
+
end
|
62
|
+
message
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'pact/pact_broker/fetch_pacts'
|
2
|
+
require 'pact/pact_broker/fetch_pact_uris_for_verification'
|
3
|
+
require 'pact/provider/pact_uri'
|
4
|
+
|
5
|
+
#
|
6
|
+
# @public Used by Pact Provider Verifier
|
7
|
+
#
|
8
|
+
module Pact
|
9
|
+
module PactBroker
|
10
|
+
extend self
|
11
|
+
|
12
|
+
# Keep for backwards compatibility with pact-provider-verifier < 1.23.1
|
13
|
+
def fetch_pact_uris *args
|
14
|
+
Pact::PactBroker::FetchPacts.call(*args).collect(&:uri)
|
15
|
+
end
|
16
|
+
|
17
|
+
def fetch_pact_uris_for_verification *args
|
18
|
+
Pact::PactBroker::FetchPactURIsForVerification.call(*args)
|
19
|
+
end
|
20
|
+
|
21
|
+
def build_pact_uri(*args)
|
22
|
+
Pact::Provider::PactURI.new(*args)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'pact/provider/state/provider_state'
|
2
|
+
require 'pact/provider/state/provider_state_configured_modules'
|
3
|
+
require 'pact/provider/state/set_up'
|
4
|
+
require 'pact/provider/state/tear_down'
|
5
|
+
|
6
|
+
module Pact
|
7
|
+
|
8
|
+
module Provider
|
9
|
+
|
10
|
+
module Configuration
|
11
|
+
|
12
|
+
module ConfigurationExtension
|
13
|
+
|
14
|
+
attr_accessor :provider_application_version
|
15
|
+
|
16
|
+
def provider= provider
|
17
|
+
@provider = provider
|
18
|
+
end
|
19
|
+
|
20
|
+
def provider
|
21
|
+
if defined? @provider
|
22
|
+
@provider
|
23
|
+
else
|
24
|
+
raise "Please configure your provider. See the Provider section in the README for examples."
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def config_ru_path
|
29
|
+
@config_ru_path ||= './config.ru'
|
30
|
+
end
|
31
|
+
|
32
|
+
def config_ru_path= config_ru_path
|
33
|
+
@config_ru_path = config_ru_path
|
34
|
+
end
|
35
|
+
|
36
|
+
def interactions_replay_order
|
37
|
+
@interactions_replay_order ||= :recorded #or :random
|
38
|
+
end
|
39
|
+
|
40
|
+
def interactions_replay_order= interactions_replay_order
|
41
|
+
@interactions_replay_order = interactions_replay_order.to_sym
|
42
|
+
end
|
43
|
+
|
44
|
+
def provider_state_set_up
|
45
|
+
@provider_state_set_up ||= Pact::Provider::State::SetUp
|
46
|
+
end
|
47
|
+
|
48
|
+
def provider_state_set_up= provider_state_set_up
|
49
|
+
@provider_state_set_up = provider_state_set_up
|
50
|
+
end
|
51
|
+
|
52
|
+
def provider_state_tear_down
|
53
|
+
@provider_state_tear_down ||= Pact::Provider::State::TearDown
|
54
|
+
end
|
55
|
+
|
56
|
+
def provider_state_tear_down= provider_state_tear_down
|
57
|
+
@provider_state_tear_down = provider_state_tear_down
|
58
|
+
end
|
59
|
+
|
60
|
+
def include mod
|
61
|
+
Pact::Provider::State::ProviderStateConfiguredModules.instance_eval do
|
62
|
+
include mod
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'pact/provider/configuration/service_provider_dsl'
|
2
|
+
require 'pact/provider/configuration/message_provider_dsl'
|
3
|
+
|
4
|
+
module Pact
|
5
|
+
|
6
|
+
module Provider
|
7
|
+
|
8
|
+
module DSL
|
9
|
+
def service_provider name, &block
|
10
|
+
Configuration::ServiceProviderDSL.build(name, &block)
|
11
|
+
end
|
12
|
+
|
13
|
+
def message_provider name, &block
|
14
|
+
Configuration::MessageProviderDSL.build(name, &block)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'pact/provider/configuration/service_provider_dsl'
|
2
|
+
|
3
|
+
module Pact
|
4
|
+
module Provider
|
5
|
+
module Configuration
|
6
|
+
class MessageProviderDSL < ServiceProviderDSL
|
7
|
+
class RackToMessageAdapter
|
8
|
+
def initialize(message_builder)
|
9
|
+
@message_builder = message_builder
|
10
|
+
end
|
11
|
+
|
12
|
+
def call(env)
|
13
|
+
request_body_json = JSON.parse(env['rack.input'].read)
|
14
|
+
contents = @message_builder.call(request_body_json['description'])
|
15
|
+
[200, {"Content-Type" => "application/json"}, [{ contents: contents }.to_json]]
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def initialize name
|
20
|
+
super
|
21
|
+
@mapper_block = lambda { |args| }
|
22
|
+
end
|
23
|
+
|
24
|
+
dsl do
|
25
|
+
def app &block
|
26
|
+
self.app_block = block
|
27
|
+
end
|
28
|
+
|
29
|
+
def app_version application_version
|
30
|
+
self.application_version = application_version
|
31
|
+
end
|
32
|
+
|
33
|
+
def app_version_tags tags
|
34
|
+
self.tags = tags
|
35
|
+
end
|
36
|
+
|
37
|
+
def app_version_branch branch
|
38
|
+
self.branch = branch
|
39
|
+
end
|
40
|
+
|
41
|
+
def publish_verification_results publish_verification_results
|
42
|
+
self.publish_verification_results = publish_verification_results
|
43
|
+
Pact::RSpec.with_rspec_2 do
|
44
|
+
Pact.configuration.error_stream.puts "WARN: Publishing of verification results is currently not supported with rspec 2. If you would like this functionality, please feel free to submit a PR!"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def honours_pact_with consumer_name, options = {}, &block
|
49
|
+
create_pact_verification consumer_name, options, &block
|
50
|
+
end
|
51
|
+
|
52
|
+
def honours_pacts_from_pact_broker &block
|
53
|
+
create_pact_verification_from_broker(&block)
|
54
|
+
end
|
55
|
+
|
56
|
+
def builder &block
|
57
|
+
self.app_block = lambda { RackToMessageAdapter.new(block) }
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'pact/provider/pact_verification'
|
2
|
+
require 'pact/provider/pact_uri'
|
3
|
+
require 'pact/shared/dsl'
|
4
|
+
require 'pact/provider/world'
|
5
|
+
|
6
|
+
module Pact
|
7
|
+
module Provider
|
8
|
+
|
9
|
+
module Configuration
|
10
|
+
|
11
|
+
class PactVerification
|
12
|
+
|
13
|
+
extend Pact::DSL
|
14
|
+
|
15
|
+
attr_accessor :consumer_name, :pact_uri, :ref
|
16
|
+
|
17
|
+
def initialize consumer_name, options = {}
|
18
|
+
@consumer_name = consumer_name
|
19
|
+
@ref = options.fetch(:ref, :head)
|
20
|
+
@pact_uri = nil
|
21
|
+
end
|
22
|
+
|
23
|
+
dsl do
|
24
|
+
def pact_uri pact_uri, options = {}
|
25
|
+
self.pact_uri = ::Pact::Provider::PactURI.new(pact_uri, options) if pact_uri
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def finalize
|
30
|
+
validate
|
31
|
+
create_pact_verification
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def create_pact_verification
|
37
|
+
verification = Pact::Provider::PactVerification.new(consumer_name, pact_uri, ref)
|
38
|
+
Pact.provider_world.add_pact_verification verification
|
39
|
+
end
|
40
|
+
|
41
|
+
def validate
|
42
|
+
raise "Please provide a pact_uri for the verification" unless pact_uri
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,126 @@
|
|
1
|
+
require 'pact/shared/dsl'
|
2
|
+
require 'pact/provider/world'
|
3
|
+
require 'pact/pact_broker/fetch_pact_uris_for_verification'
|
4
|
+
require 'pact/errors'
|
5
|
+
require 'pact/utils/string'
|
6
|
+
|
7
|
+
module Pact
|
8
|
+
module Provider
|
9
|
+
module Configuration
|
10
|
+
class PactVerificationFromBroker
|
11
|
+
|
12
|
+
extend Pact::DSL
|
13
|
+
|
14
|
+
# If user declares a variable with the same name as one of these attributes
|
15
|
+
# in parent scope, it will clash with these ones,
|
16
|
+
# so put an underscore in front of the name to be safer.
|
17
|
+
|
18
|
+
attr_accessor :_provider_name, :_pact_broker_base_url, :_consumer_version_tags, :_provider_version_branch, :_provider_version_tags, :_basic_auth_options, :_enable_pending, :_include_wip_pacts_since, :_verbose, :_consumer_version_selectors, :_fail_if_no_pacts_found
|
19
|
+
|
20
|
+
def initialize(provider_name, provider_version_branch, provider_version_tags)
|
21
|
+
@_provider_name = provider_name
|
22
|
+
@_provider_version_branch = provider_version_branch
|
23
|
+
@_provider_version_tags = provider_version_tags
|
24
|
+
@_consumer_version_tags = []
|
25
|
+
@_consumer_version_selectors = []
|
26
|
+
@_enable_pending = false
|
27
|
+
@_include_wip_pacts_since = nil
|
28
|
+
@_verbose = false
|
29
|
+
@_fail_if_no_pacts_found = true # CLI defaults to false, unfortunately for consistency
|
30
|
+
end
|
31
|
+
|
32
|
+
dsl do
|
33
|
+
def pact_broker_base_url pact_broker_base_url, basic_auth_options = {}
|
34
|
+
self._pact_broker_base_url = pact_broker_base_url
|
35
|
+
self._basic_auth_options = basic_auth_options
|
36
|
+
end
|
37
|
+
|
38
|
+
def consumer_version_tags consumer_version_tags
|
39
|
+
self._consumer_version_tags = *consumer_version_tags
|
40
|
+
end
|
41
|
+
|
42
|
+
def consumer_version_selectors consumer_version_selectors
|
43
|
+
self._consumer_version_selectors = *consumer_version_selectors
|
44
|
+
end
|
45
|
+
|
46
|
+
def enable_pending enable_pending
|
47
|
+
self._enable_pending = enable_pending
|
48
|
+
end
|
49
|
+
|
50
|
+
# Underlying code defaults to true if not specified
|
51
|
+
def fail_if_no_pacts_found fail_if_no_pacts_found
|
52
|
+
self._fail_if_no_pacts_found = fail_if_no_pacts_found
|
53
|
+
end
|
54
|
+
|
55
|
+
def include_wip_pacts_since since
|
56
|
+
self._include_wip_pacts_since = if since.respond_to?(:xmlschema)
|
57
|
+
since.xmlschema
|
58
|
+
else
|
59
|
+
since
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def verbose verbose
|
64
|
+
self._verbose = verbose
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def finalize
|
69
|
+
validate
|
70
|
+
create_pact_verification
|
71
|
+
end
|
72
|
+
|
73
|
+
private
|
74
|
+
|
75
|
+
def create_pact_verification
|
76
|
+
fetch_pacts = Pact::PactBroker::FetchPactURIsForVerification.new(
|
77
|
+
_provider_name,
|
78
|
+
consumer_version_selectors,
|
79
|
+
_provider_version_branch,
|
80
|
+
_provider_version_tags,
|
81
|
+
_pact_broker_base_url,
|
82
|
+
_basic_auth_options.merge(verbose: _verbose),
|
83
|
+
{ include_pending_status: _enable_pending, include_wip_pacts_since: _include_wip_pacts_since, fail_if_no_pacts_found: _fail_if_no_pacts_found }
|
84
|
+
)
|
85
|
+
|
86
|
+
Pact.provider_world.add_pact_uri_source fetch_pacts
|
87
|
+
end
|
88
|
+
|
89
|
+
def consumer_version_selectors
|
90
|
+
convert_tags_to_selectors + convert_consumer_version_selectors
|
91
|
+
end
|
92
|
+
|
93
|
+
def convert_tags_to_selectors
|
94
|
+
_consumer_version_tags.collect do | tag |
|
95
|
+
if tag.is_a?(Hash)
|
96
|
+
{
|
97
|
+
tag: tag.fetch(:name),
|
98
|
+
latest: !tag[:all],
|
99
|
+
fallbackTag: tag[:fallback]
|
100
|
+
}
|
101
|
+
elsif tag.is_a?(String)
|
102
|
+
{
|
103
|
+
tag: tag,
|
104
|
+
latest: true
|
105
|
+
}
|
106
|
+
else
|
107
|
+
raise Pact::Error.new("The value supplied for consumer_version_tags must be a String or a Hash. Found #{tag.class}")
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
def convert_consumer_version_selectors
|
113
|
+
_consumer_version_selectors.collect do | selector |
|
114
|
+
selector.each_with_object({}) do | (key, value), new_selector |
|
115
|
+
new_selector[Pact::Utils::String.camelcase(key.to_s).to_sym] = value
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
def validate
|
121
|
+
raise Pact::Error.new("Please provide a pact_broker_base_url from which to retrieve the pacts") unless _pact_broker_base_url
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Pact
|
2
|
+
module Provider
|
3
|
+
module Configuration
|
4
|
+
class ServiceProviderConfig
|
5
|
+
|
6
|
+
attr_accessor :application_version
|
7
|
+
attr_reader :branch, :build_url
|
8
|
+
|
9
|
+
def initialize application_version, branch, tags, publish_verification_results, build_url, &app_block
|
10
|
+
@application_version = application_version
|
11
|
+
@branch = branch
|
12
|
+
@tags = [*tags]
|
13
|
+
@publish_verification_results = publish_verification_results
|
14
|
+
@app_block = app_block
|
15
|
+
@build_url = build_url
|
16
|
+
end
|
17
|
+
|
18
|
+
def app
|
19
|
+
@app_block.call
|
20
|
+
end
|
21
|
+
|
22
|
+
def publish_verification_results?
|
23
|
+
@publish_verification_results
|
24
|
+
end
|
25
|
+
|
26
|
+
def tags
|
27
|
+
@tags
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,107 @@
|
|
1
|
+
require 'pact/provider/configuration/pact_verification'
|
2
|
+
require 'pact/provider/configuration/pact_verification_from_broker'
|
3
|
+
require 'pact/provider/configuration/service_provider_config'
|
4
|
+
require 'pact/errors'
|
5
|
+
|
6
|
+
module Pact
|
7
|
+
|
8
|
+
module Provider
|
9
|
+
|
10
|
+
module Configuration
|
11
|
+
|
12
|
+
class Error < ::Pact::Error; end
|
13
|
+
|
14
|
+
class ServiceProviderDSL
|
15
|
+
|
16
|
+
extend Pact::DSL
|
17
|
+
|
18
|
+
attr_accessor :name, :app_block, :application_version, :branch, :tags, :publish_verification_results, :build_url
|
19
|
+
|
20
|
+
CONFIG_RU_APP = lambda {
|
21
|
+
unless File.exist? Pact.configuration.config_ru_path
|
22
|
+
raise "Could not find config.ru file at #{Pact.configuration.config_ru_path} Please configure the service provider app or create a config.ru file in the root directory of the project. See https://github.com/pact-foundation/pact-ruby/wiki/Verifying-pacts for more information."
|
23
|
+
end
|
24
|
+
result = Rack::Builder.parse_file(Pact.configuration.config_ru_path)
|
25
|
+
|
26
|
+
if result.respond_to?(:first) # rack 2
|
27
|
+
result.first
|
28
|
+
else # rack 3
|
29
|
+
result
|
30
|
+
end
|
31
|
+
}
|
32
|
+
|
33
|
+
def initialize name
|
34
|
+
@name = name
|
35
|
+
@publish_verification_results = false
|
36
|
+
@tags = []
|
37
|
+
@app_block = CONFIG_RU_APP
|
38
|
+
end
|
39
|
+
|
40
|
+
dsl do
|
41
|
+
def app &block
|
42
|
+
self.app_block = block
|
43
|
+
end
|
44
|
+
|
45
|
+
def app_version application_version
|
46
|
+
self.application_version = application_version
|
47
|
+
end
|
48
|
+
|
49
|
+
def app_version_tags tags
|
50
|
+
self.tags = tags
|
51
|
+
end
|
52
|
+
|
53
|
+
def app_version_branch branch
|
54
|
+
self.branch = branch
|
55
|
+
end
|
56
|
+
|
57
|
+
def build_url build_url
|
58
|
+
self.build_url = build_url
|
59
|
+
end
|
60
|
+
|
61
|
+
def publish_verification_results publish_verification_results
|
62
|
+
self.publish_verification_results = publish_verification_results
|
63
|
+
Pact::RSpec.with_rspec_2 do
|
64
|
+
Pact.configuration.error_stream.puts "WARN: Publishing of verification results is currently not supported with rspec 2. If you would like this functionality, please feel free to submit a PR!"
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def honours_pact_with consumer_name, options = {}, &block
|
69
|
+
create_pact_verification consumer_name, options, &block
|
70
|
+
end
|
71
|
+
|
72
|
+
def honours_pacts_from_pact_broker &block
|
73
|
+
create_pact_verification_from_broker(&block)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def create_pact_verification consumer_name, options, &block
|
78
|
+
PactVerification.build(consumer_name, options, &block)
|
79
|
+
end
|
80
|
+
|
81
|
+
def create_pact_verification_from_broker(&block)
|
82
|
+
PactVerificationFromBroker.build(name, branch, tags, &block)
|
83
|
+
end
|
84
|
+
|
85
|
+
def finalize
|
86
|
+
validate
|
87
|
+
create_service_provider
|
88
|
+
end
|
89
|
+
|
90
|
+
private
|
91
|
+
|
92
|
+
def validate
|
93
|
+
raise Error.new("Please provide a name for the Provider") unless name && !name.strip.empty?
|
94
|
+
raise Error.new("Please set the app_version when publish_verification_results is true") if publish_verification_results && application_version_blank?
|
95
|
+
end
|
96
|
+
|
97
|
+
def application_version_blank?
|
98
|
+
application_version.nil? || application_version.strip.empty?
|
99
|
+
end
|
100
|
+
|
101
|
+
def create_service_provider
|
102
|
+
Pact.configuration.provider = ServiceProviderConfig.new(application_version, branch, tags, publish_verification_results, build_url, &@app_block)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
@@ -0,0 +1,7 @@
|
|
1
|
+
require 'pact/provider/configuration/dsl'
|
2
|
+
require 'pact/provider/configuration/configuration_extension'
|
3
|
+
require 'pact/provider/state/provider_state'
|
4
|
+
|
5
|
+
Pact.send(:extend, Pact::Provider::DSL)
|
6
|
+
Pact.send(:extend, Pact::Provider::State::DSL)
|
7
|
+
Pact::Configuration.send(:include, Pact::Provider::Configuration::ConfigurationExtension)
|
File without changes
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require 'pact/provider/help/content'
|
2
|
+
require 'fileutils'
|
3
|
+
require 'pact/consumer/configuration'
|
4
|
+
require 'pact/provider/help/write'
|
5
|
+
require 'rainbow'
|
6
|
+
|
7
|
+
module Pact
|
8
|
+
module Provider
|
9
|
+
module Help
|
10
|
+
class ConsoleText
|
11
|
+
|
12
|
+
def self.call reports_dir = Pact.configuration.reports_dir, options = {color: true}
|
13
|
+
new(reports_dir || Pact.configuration.reports_dir, options).call
|
14
|
+
end
|
15
|
+
|
16
|
+
def initialize reports_dir, options
|
17
|
+
@reports_dir = File.expand_path(reports_dir)
|
18
|
+
@options = options
|
19
|
+
end
|
20
|
+
|
21
|
+
def call
|
22
|
+
begin
|
23
|
+
options[:color] ? ColorizeMarkdown.(help_text) : help_text
|
24
|
+
rescue Errno::ENOENT
|
25
|
+
options[:color] ? error_text_coloured : error_text_plain
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
attr_reader :reports_dir, :options
|
32
|
+
|
33
|
+
def help_text
|
34
|
+
File.read(help_file_path)
|
35
|
+
end
|
36
|
+
|
37
|
+
def help_file_path
|
38
|
+
File.join(reports_dir, Write::HELP_FILE_NAME)
|
39
|
+
end
|
40
|
+
|
41
|
+
def error_text_plain
|
42
|
+
"Sorry, could not find help file at #{help_file_path}. Please ensure you have run `rake pact:verify`.\n" +
|
43
|
+
"If this does not fix the problem, please raise a github issues for this bug."
|
44
|
+
end
|
45
|
+
|
46
|
+
def error_text_coloured
|
47
|
+
Rainbow(error_text_plain).red
|
48
|
+
end
|
49
|
+
|
50
|
+
class ColorizeMarkdown
|
51
|
+
|
52
|
+
def self.call markdown
|
53
|
+
markdown.split("\n").collect do | line |
|
54
|
+
if line.start_with?("# ")
|
55
|
+
yellow_underling line.gsub(/^# /, '')
|
56
|
+
elsif line.start_with?("* ")
|
57
|
+
green("* ") + line.gsub(/^\* /, '')
|
58
|
+
else
|
59
|
+
line
|
60
|
+
end
|
61
|
+
end.join("\n")
|
62
|
+
end
|
63
|
+
|
64
|
+
def self.yellow_underling string
|
65
|
+
Rainbow(string).yellow.underline
|
66
|
+
end
|
67
|
+
|
68
|
+
def self.green string
|
69
|
+
Rainbow(string).green
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'pact/provider/help/pact_diff'
|
2
|
+
|
3
|
+
module Pact
|
4
|
+
module Provider
|
5
|
+
module Help
|
6
|
+
class Content
|
7
|
+
|
8
|
+
def initialize pact_sources
|
9
|
+
@pact_sources = pact_sources
|
10
|
+
end
|
11
|
+
|
12
|
+
def text
|
13
|
+
help_text + "\n\n" + pact_diffs
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
attr_reader :pact_sources
|
19
|
+
|
20
|
+
def help_text
|
21
|
+
temp_dir = Pact.configuration.tmp_dir
|
22
|
+
log_path = Pact.configuration.log_path
|
23
|
+
ERB.new(template_string).result(binding)
|
24
|
+
end
|
25
|
+
|
26
|
+
def template_string
|
27
|
+
File.read(File.expand_path( '../../../templates/help.erb', __FILE__))
|
28
|
+
end
|
29
|
+
|
30
|
+
def pact_diffs
|
31
|
+
pact_sources.collect do | pact_json |
|
32
|
+
PactDiff.call(pact_json)
|
33
|
+
end.compact.join("\n")
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|