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.
Files changed (164) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +1321 -0
  3. data/LICENSE.txt +23 -0
  4. data/bin/pact +4 -0
  5. data/lib/pact/cli/generate_pact_docs.rb +4 -0
  6. data/lib/pact/cli/run_pact_verification.rb +99 -0
  7. data/lib/pact/cli/spec_criteria.rb +26 -0
  8. data/lib/pact/cli.rb +45 -0
  9. data/lib/pact/consumer/configuration/configuration_extensions.rb +90 -0
  10. data/lib/pact/consumer/configuration/dsl.rb +11 -0
  11. data/lib/pact/consumer/configuration/mock_service.rb +112 -0
  12. data/lib/pact/consumer/configuration/service_consumer.rb +51 -0
  13. data/lib/pact/consumer/configuration/service_provider.rb +40 -0
  14. data/lib/pact/consumer/configuration.rb +10 -0
  15. data/lib/pact/consumer/consumer_contract_builder.rb +82 -0
  16. data/lib/pact/consumer/consumer_contract_builders.rb +10 -0
  17. data/lib/pact/consumer/interaction_builder.rb +45 -0
  18. data/lib/pact/consumer/rspec.rb +35 -0
  19. data/lib/pact/consumer/spec_hooks.rb +40 -0
  20. data/lib/pact/consumer/world.rb +37 -0
  21. data/lib/pact/consumer.rb +7 -0
  22. data/lib/pact/doc/README.md +13 -0
  23. data/lib/pact/doc/doc_file.rb +40 -0
  24. data/lib/pact/doc/generate.rb +11 -0
  25. data/lib/pact/doc/generator.rb +82 -0
  26. data/lib/pact/doc/interaction_view_model.rb +124 -0
  27. data/lib/pact/doc/markdown/consumer_contract_renderer.rb +68 -0
  28. data/lib/pact/doc/markdown/generator.rb +26 -0
  29. data/lib/pact/doc/markdown/index_renderer.rb +43 -0
  30. data/lib/pact/doc/markdown/interaction.erb +14 -0
  31. data/lib/pact/doc/markdown/interaction_renderer.rb +43 -0
  32. data/lib/pact/doc/sort_interactions.rb +16 -0
  33. data/lib/pact/hal/authorization_header_redactor.rb +32 -0
  34. data/lib/pact/hal/entity.rb +110 -0
  35. data/lib/pact/hal/http_client.rb +128 -0
  36. data/lib/pact/hal/link.rb +112 -0
  37. data/lib/pact/hal/non_json_entity.rb +28 -0
  38. data/lib/pact/hash_refinements.rb +17 -0
  39. data/lib/pact/pact_broker/fetch_pact_uris_for_verification.rb +112 -0
  40. data/lib/pact/pact_broker/fetch_pacts.rb +103 -0
  41. data/lib/pact/pact_broker/notices.rb +34 -0
  42. data/lib/pact/pact_broker/pact_selection_description.rb +66 -0
  43. data/lib/pact/pact_broker.rb +25 -0
  44. data/lib/pact/project_root.rb +7 -0
  45. data/lib/pact/provider/configuration/configuration_extension.rb +69 -0
  46. data/lib/pact/provider/configuration/dsl.rb +18 -0
  47. data/lib/pact/provider/configuration/message_provider_dsl.rb +63 -0
  48. data/lib/pact/provider/configuration/pact_verification.rb +48 -0
  49. data/lib/pact/provider/configuration/pact_verification_from_broker.rb +126 -0
  50. data/lib/pact/provider/configuration/service_provider_config.rb +32 -0
  51. data/lib/pact/provider/configuration/service_provider_dsl.rb +107 -0
  52. data/lib/pact/provider/configuration.rb +7 -0
  53. data/lib/pact/provider/context.rb +0 -0
  54. data/lib/pact/provider/help/console_text.rb +76 -0
  55. data/lib/pact/provider/help/content.rb +38 -0
  56. data/lib/pact/provider/help/pact_diff.rb +43 -0
  57. data/lib/pact/provider/help/prompt_text.rb +49 -0
  58. data/lib/pact/provider/help/write.rb +56 -0
  59. data/lib/pact/provider/matchers/messages.rb +66 -0
  60. data/lib/pact/provider/pact_helper_locator.rb +24 -0
  61. data/lib/pact/provider/pact_source.rb +40 -0
  62. data/lib/pact/provider/pact_spec_runner.rb +188 -0
  63. data/lib/pact/provider/pact_uri.rb +55 -0
  64. data/lib/pact/provider/pact_verification.rb +17 -0
  65. data/lib/pact/provider/print_missing_provider_states.rb +35 -0
  66. data/lib/pact/provider/request.rb +77 -0
  67. data/lib/pact/provider/rspec/backtrace_formatter.rb +43 -0
  68. data/lib/pact/provider/rspec/calculate_exit_code.rb +18 -0
  69. data/lib/pact/provider/rspec/custom_options_file +0 -0
  70. data/lib/pact/provider/rspec/formatter_rspec_2.rb +76 -0
  71. data/lib/pact/provider/rspec/formatter_rspec_3.rb +195 -0
  72. data/lib/pact/provider/rspec/json_formatter.rb +100 -0
  73. data/lib/pact/provider/rspec/matchers.rb +80 -0
  74. data/lib/pact/provider/rspec/pact_broker_formatter.rb +76 -0
  75. data/lib/pact/provider/rspec.rb +234 -0
  76. data/lib/pact/provider/state/provider_state.rb +180 -0
  77. data/lib/pact/provider/state/provider_state_configured_modules.rb +15 -0
  78. data/lib/pact/provider/state/provider_state_manager.rb +42 -0
  79. data/lib/pact/provider/state/provider_state_proxy.rb +39 -0
  80. data/lib/pact/provider/state/set_up.rb +13 -0
  81. data/lib/pact/provider/state/tear_down.rb +13 -0
  82. data/lib/pact/provider/test_methods.rb +77 -0
  83. data/lib/pact/provider/verification_report.rb +36 -0
  84. data/lib/pact/provider/verification_results/create.rb +88 -0
  85. data/lib/pact/provider/verification_results/publish.rb +143 -0
  86. data/lib/pact/provider/verification_results/publish_all.rb +50 -0
  87. data/lib/pact/provider/verification_results/verification_result.rb +40 -0
  88. data/lib/pact/provider/world.rb +50 -0
  89. data/lib/pact/provider.rb +3 -0
  90. data/lib/pact/retry.rb +37 -0
  91. data/lib/pact/tasks/task_helper.rb +62 -0
  92. data/lib/pact/tasks/verification_task.rb +95 -0
  93. data/lib/pact/tasks.rb +2 -0
  94. data/lib/pact/templates/help.erb +22 -0
  95. data/lib/pact/templates/provider_state.erb +14 -0
  96. data/lib/pact/utils/metrics.rb +100 -0
  97. data/lib/pact/utils/string.rb +35 -0
  98. data/lib/pact/v2/configuration.rb +23 -0
  99. data/lib/pact/v2/consumer/grpc_interaction_builder.rb +187 -0
  100. data/lib/pact/v2/consumer/http_interaction_builder.rb +163 -0
  101. data/lib/pact/v2/consumer/interaction_contents.rb +54 -0
  102. data/lib/pact/v2/consumer/message_interaction_builder.rb +280 -0
  103. data/lib/pact/v2/consumer/mock_server.rb +99 -0
  104. data/lib/pact/v2/consumer/pact_config/base.rb +24 -0
  105. data/lib/pact/v2/consumer/pact_config/grpc.rb +26 -0
  106. data/lib/pact/v2/consumer/pact_config/http.rb +55 -0
  107. data/lib/pact/v2/consumer/pact_config/message.rb +17 -0
  108. data/lib/pact/v2/consumer/pact_config.rb +24 -0
  109. data/lib/pact/v2/consumer.rb +8 -0
  110. data/lib/pact/v2/matchers/base.rb +67 -0
  111. data/lib/pact/v2/matchers/v1/equality.rb +19 -0
  112. data/lib/pact/v2/matchers/v2/regex.rb +19 -0
  113. data/lib/pact/v2/matchers/v2/type.rb +17 -0
  114. data/lib/pact/v2/matchers/v3/boolean.rb +17 -0
  115. data/lib/pact/v2/matchers/v3/date.rb +18 -0
  116. data/lib/pact/v2/matchers/v3/date_time.rb +18 -0
  117. data/lib/pact/v2/matchers/v3/decimal.rb +17 -0
  118. data/lib/pact/v2/matchers/v3/each.rb +42 -0
  119. data/lib/pact/v2/matchers/v3/include.rb +17 -0
  120. data/lib/pact/v2/matchers/v3/integer.rb +17 -0
  121. data/lib/pact/v2/matchers/v3/number.rb +17 -0
  122. data/lib/pact/v2/matchers/v3/time.rb +18 -0
  123. data/lib/pact/v2/matchers/v4/each_key.rb +26 -0
  124. data/lib/pact/v2/matchers/v4/each_key_value.rb +32 -0
  125. data/lib/pact/v2/matchers/v4/each_value.rb +33 -0
  126. data/lib/pact/v2/matchers/v4/not_empty.rb +17 -0
  127. data/lib/pact/v2/matchers.rb +94 -0
  128. data/lib/pact/v2/native/blocking_verifier.rb +17 -0
  129. data/lib/pact/v2/native/logger.rb +25 -0
  130. data/lib/pact/v2/provider/async_message_verifier.rb +28 -0
  131. data/lib/pact/v2/provider/base_verifier.rb +242 -0
  132. data/lib/pact/v2/provider/grpc_verifier.rb +38 -0
  133. data/lib/pact/v2/provider/gruf_server.rb +75 -0
  134. data/lib/pact/v2/provider/http_server.rb +79 -0
  135. data/lib/pact/v2/provider/http_verifier.rb +43 -0
  136. data/lib/pact/v2/provider/message_provider_servlet.rb +79 -0
  137. data/lib/pact/v2/provider/mixed_verifier.rb +22 -0
  138. data/lib/pact/v2/provider/pact_broker_proxy.rb +71 -0
  139. data/lib/pact/v2/provider/pact_broker_proxy_runner.rb +77 -0
  140. data/lib/pact/v2/provider/pact_config/async.rb +29 -0
  141. data/lib/pact/v2/provider/pact_config/base.rb +101 -0
  142. data/lib/pact/v2/provider/pact_config/grpc.rb +26 -0
  143. data/lib/pact/v2/provider/pact_config/http.rb +27 -0
  144. data/lib/pact/v2/provider/pact_config/mixed.rb +39 -0
  145. data/lib/pact/v2/provider/pact_config.rb +26 -0
  146. data/lib/pact/v2/provider/provider_server_runner.rb +89 -0
  147. data/lib/pact/v2/provider/provider_state_configuration.rb +32 -0
  148. data/lib/pact/v2/provider/provider_state_servlet.rb +86 -0
  149. data/lib/pact/v2/provider.rb +8 -0
  150. data/lib/pact/v2/railtie.rb +13 -0
  151. data/lib/pact/v2/rspec/support/pact_consumer_helpers.rb +80 -0
  152. data/lib/pact/v2/rspec/support/pact_message_helpers.rb +42 -0
  153. data/lib/pact/v2/rspec/support/pact_provider_helpers.rb +129 -0
  154. data/lib/pact/v2/rspec/support/waterdrop/pact_waterdrop_client.rb +27 -0
  155. data/lib/pact/v2/rspec/support/webmock/webmock_helpers.rb +30 -0
  156. data/lib/pact/v2/rspec.rb +17 -0
  157. data/lib/pact/v2/tasks/pact.rake +13 -0
  158. data/lib/pact/v2/version.rb +8 -0
  159. data/lib/pact/v2.rb +71 -0
  160. data/lib/pact/version.rb +4 -0
  161. data/lib/pact.rb +13 -0
  162. data/lib/tasks/pact.rake +34 -0
  163. data/pact.gemspec +106 -0
  164. 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,7 @@
1
+ require 'pathname'
2
+
3
+ module Pact
4
+ def self.project_root
5
+ @project_root ||= Pathname.new(File.expand_path('../../../',__FILE__)).freeze
6
+ end
7
+ 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