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,129 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "pact_message_helpers"
4
+ require_relative "webmock/webmock_helpers"
5
+
6
+ module PactV2ProducerDsl
7
+ module ClassMethods
8
+ PACT_PROVIDER_NOT_DECLARED_MESSAGE = "http_pact_provider or grpc_pact_provider should be declared first"
9
+
10
+ def http_pact_provider(provider, opts: {})
11
+ _pact_provider(:http, provider, opts: opts)
12
+ end
13
+
14
+ def grpc_pact_provider(provider, opts: {})
15
+ _pact_provider(:grpc, provider, opts: opts)
16
+ end
17
+
18
+ def message_pact_provider(provider, opts: {})
19
+ _pact_provider(:async, provider, opts: opts)
20
+ end
21
+
22
+ def mixed_pact_provider(provider, opts: {})
23
+ execute_mixed_pact_provider(:mixed, provider, opts: opts)
24
+ end
25
+
26
+ def execute_mixed_pact_provider(transport_type, provider, opts: {})
27
+ raise "#{transport_type}_pact_provider is designed to be used with RSpec" unless defined?(::RSpec)
28
+ raise "#{transport_type}_pact_provider has to be declared at the top level of a suite" unless top_level?
29
+ raise "mixed_pact_provider is designed to be run once per provider so cannot be declared more than once" if defined?(@_pact_config)
30
+
31
+ pact_config_instance = Pact::V2::Provider::PactConfig.new(transport_type, provider_name: provider, opts: opts)
32
+ instance_variable_set(:@_pact_config, pact_config_instance)
33
+
34
+ # rubocop:disable RSpec/BeforeAfterAll
35
+ before(:context) do
36
+ # rspec allows only context ivars in specs and ignores the rest
37
+ # so we use block-as-a-closure feature to save pact_config ivar reference and make it available for descendants
38
+ @_pact_config = pact_config_instance
39
+ end
40
+ # rubocop:enable RSpec/BeforeAfterAll
41
+
42
+ it "verifies mixed interactions with provider #{provider}" do
43
+ pact_config.start_servers
44
+ # todo: call any available verifier, or exit if none specified
45
+ pact_config.http_config.new_verifier(@_pact_config).verify!
46
+ end
47
+ end
48
+
49
+ def _pact_provider(transport_type, provider, opts: {})
50
+ raise "#{transport_type}_pact_provider is designed to be used with RSpec" unless defined?(::RSpec)
51
+ raise "#{transport_type}_pact_provider has to be declared at the top level of a suite" unless top_level?
52
+ raise "*_pact_provider is designed to be run once per provider so cannot be declared more than once" if defined?(@_pact_config)
53
+
54
+ pact_config_instance = Pact::V2::Provider::PactConfig.new(transport_type, provider_name: provider, opts: opts)
55
+ instance_variable_set(:@_pact_config, pact_config_instance)
56
+
57
+ # rubocop:disable RSpec/BeforeAfterAll
58
+ before(:context) do
59
+ # rspec allows only context ivars in specs and ignores the rest
60
+ # so we use block-as-a-closure feature to save pact_config ivar reference and make it available for descendants
61
+ @_pact_config = pact_config_instance
62
+ end
63
+ # rubocop:enable RSpec/BeforeAfterAll
64
+
65
+ it "verifies interactions with provider #{provider}" do
66
+ pact_config.new_verifier.verify!
67
+ end
68
+ end
69
+
70
+ def before_state_setup(&block)
71
+ raise PACT_PROVIDER_NOT_DECLARED_MESSAGE unless pact_config
72
+ pact_config.before_setup(&block)
73
+ end
74
+
75
+ def after_state_teardown(&block)
76
+ raise PACT_PROVIDER_NOT_DECLARED_MESSAGE unless pact_config
77
+ pact_config.after_teardown(&block)
78
+ end
79
+
80
+ def provider_state(name, opts: {}, &block)
81
+ raise PACT_PROVIDER_NOT_DECLARED_MESSAGE unless pact_config
82
+ pact_config.new_provider_state(name, opts: opts, &block)
83
+ end
84
+
85
+ def handle_message(name, opts: {}, &block)
86
+ async_klass = Pact::V2::Provider::PactConfig::Async
87
+ if defined?(@_pact_config) &&
88
+ @_pact_config.respond_to?(:async_config) &&
89
+ @_pact_config.async_config.is_a?(async_klass)
90
+ @_pact_config.async_config.new_message_handler(name, opts: opts, &block)
91
+ elsif pact_config &&
92
+ pact_config.respond_to?(:async_config) &&
93
+ pact_config.async_config.is_a?(async_klass)
94
+ pact_config.async_config.new_message_handler(name, opts: opts, &block)
95
+ elsif defined?(@_pact_config) &&
96
+ @_pact_config.is_a?(async_klass)
97
+ @_pact_config.new_message_handler(name, opts: opts, &block)
98
+ elsif pact_config.is_a?(async_klass)
99
+ pact_config.new_message_handler(name, opts: opts, &block)
100
+
101
+ else
102
+ raise "handle_message can only be used with message_pact_provider or mixed_pact_provider with an async block"
103
+ end
104
+ end
105
+
106
+ def pact_config
107
+ instance_variable_get(:@_pact_config)
108
+ end
109
+ end
110
+
111
+ def pact_config
112
+ instance_variable_get(:@_pact_config)
113
+ end
114
+ end
115
+
116
+ RSpec.configure do |config|
117
+ config.include PactV2ProducerDsl, pact_entity: :provider
118
+ config.extend PactV2ProducerDsl::ClassMethods, pact_entity: :provider
119
+
120
+ config.around pact_entity: :provider do |example|
121
+ WebmockHelpers.turned_off do
122
+ if defined?(::VCR)
123
+ VCR.turned_off { example.run }
124
+ else
125
+ example.run
126
+ end
127
+ end
128
+ end
129
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ class PactWaterdropClient
4
+ attr_reader :message
5
+
6
+ Report = Struct.new(:partition, :offset, :topic_name, keyword_init: true)
7
+
8
+ def produce_async(message)
9
+ @message = message
10
+ end
11
+
12
+ def produce_sync(message)
13
+ @message = message
14
+ Report.new(partition: 0, offset: 0, topic_name: message[:topic])
15
+ end
16
+
17
+ def to_pact(content_type: nil)
18
+ payload = message[:payload]
19
+ metadata = {
20
+ key: message[:key],
21
+ topic: message[:topic],
22
+ content_type: content_type
23
+ }.merge(message[:headers] || {})
24
+
25
+ [payload, metadata]
26
+ end
27
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module WebmockHelpers
4
+ def self.turned_off
5
+ yield unless defined?(::WebMock)
6
+
7
+ allow_net_connect = WebMock::Config.instance.allow_net_connect
8
+ allow_localhost = WebMock::Config.instance.allow_localhost
9
+ allow_hosts = WebMock::Config.instance.allow
10
+ net_http_connect_on_start = WebMock::Config.instance.net_http_connect_on_start
11
+
12
+ return yield if allow_net_connect
13
+
14
+ WebMock.allow_net_connect!
15
+
16
+ result = yield
17
+
18
+ # disable_net_connect! resets previous config settings
19
+ # so we need to specify them explicitly
20
+ WebMock.disable_net_connect!(
21
+ {
22
+ allow_localhost: allow_localhost,
23
+ allow: allow_hosts,
24
+ net_http_connect_on_start: net_http_connect_on_start
25
+ }
26
+ )
27
+
28
+ result
29
+ end
30
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rspec"
4
+ require_relative "rspec/support/pact_consumer_helpers"
5
+ require_relative "rspec/support/pact_provider_helpers"
6
+
7
+ RSpec.configure do |config|
8
+ config.define_derived_metadata(file_path: %r{spec/pact/}) { |metadata| metadata[:pact] = true }
9
+
10
+ # it's not an error: consumer tests contain `providers` subdirectory (because we're testing against different providers)
11
+ config.define_derived_metadata(file_path: %r{spec/pact/providers/}) { |metadata| metadata[:pact_entity] = :consumer }
12
+ # for provider tests it's the same thing: we're running tests which test consumers
13
+ config.define_derived_metadata(file_path: %r{spec/pact/consumers/}) { |metadata| metadata[:pact_entity] = :provider }
14
+
15
+ # exclude pact specs from generic rspec pipeline
16
+ config.filter_run_excluding :pact_v2
17
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rspec/core/rake_task"
4
+
5
+ RSpec::Core::RakeTask.new(:pact_v2).tap do |task|
6
+ task.pattern = "spec/pact/consumers/**/*_spec.rb"
7
+ task.rspec_opts = "--require rails_helper_v2 --tag pact_v2"
8
+ end
9
+
10
+ namespace :pact_v2 do
11
+ desc "Verifies the pact files"
12
+ task verify: :pact_v2
13
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pact
4
+ module V2
5
+ VERSION = '2.0.0-preview1'
6
+ Version = '2.0.0-preview1'
7
+ end
8
+ end
data/lib/pact/v2.rb ADDED
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "zeitwerk"
4
+ require "pact/ffi"
5
+
6
+ require "pact/v2/railtie" if defined?(Rails::Railtie)
7
+
8
+ module Pact
9
+ module V2
10
+ class Error < StandardError; end
11
+
12
+ class ImplementationRequired < Error; end
13
+
14
+ class FfiError < Error
15
+ def initialize(msg, reason, status)
16
+ super(msg)
17
+
18
+ @msg = msg
19
+ @reason = reason
20
+ @status = status
21
+ end
22
+
23
+ def message
24
+ "FFI error: reason: #{@reason}, status: #{@status}, message: #{@msg}"
25
+ end
26
+ end
27
+
28
+ def self.configure
29
+ yield configuration if block_given?
30
+ end
31
+
32
+ def self.configuration
33
+ @configuration ||= Pact::V2::Configuration.new
34
+ end
35
+ end
36
+ end
37
+
38
+ loader = Zeitwerk::Loader.new
39
+ loader.push_dir(File.join(__dir__, ".."))
40
+
41
+ loader.tag = "pact-v2"
42
+
43
+ # existing pact-ruby ignores
44
+ # loader.ignore("#{__dir__}/../pact") # ignore the pact dir at the root of the repo
45
+ # loader.ignore("#{__dir__}/../pact/v2",false) # ignore the pact dir at the root of the repo
46
+ # loader.push_dir(File.join(__dir__))
47
+
48
+
49
+ loader.ignore("#{__dir__}/../pact/version.rb")
50
+ loader.ignore("#{__dir__}/../pact/cli")
51
+ loader.ignore("#{__dir__}/../pact/cli.rb")
52
+ loader.ignore("#{__dir__}/../pact/consumer")
53
+ loader.ignore("#{__dir__}/../pact/consumer.rb")
54
+ loader.ignore("#{__dir__}/../pact/doc")
55
+ loader.ignore("#{__dir__}/../pact/hal")
56
+ loader.ignore("#{__dir__}/../pact/hash_refinements.rb")
57
+ loader.ignore("#{__dir__}/../pact/pact_broker")
58
+ loader.ignore("#{__dir__}/../pact/pact_broker.rb")
59
+ loader.ignore("#{__dir__}/../pact/project_root.rb")
60
+ loader.ignore("#{__dir__}/../pact/provider")
61
+ loader.ignore("#{__dir__}/../pact/provider.rb")
62
+ loader.ignore("#{__dir__}/../pact/retry.rb")
63
+ loader.ignore("#{__dir__}/../pact/tasks")
64
+ loader.ignore("#{__dir__}/../pact/tasks.rb")
65
+ loader.ignore("#{__dir__}/../pact/templates")
66
+ loader.ignore("#{__dir__}/../pact/utils")
67
+ loader.ignore("#{__dir__}/../pact/v2/rspec.rb")
68
+ loader.ignore("#{__dir__}/../pact/v2/rspec")
69
+ loader.ignore("#{__dir__}/../pact/v2/railtie.rb") unless defined?(Rails::Railtie)
70
+ loader.setup
71
+ loader.eager_load
@@ -0,0 +1,4 @@
1
+ # Remember to bump pact-provider-proxy when this changes major version
2
+ module Pact
3
+ VERSION = '2.0.0-preview1'
4
+ end
data/lib/pact.rb ADDED
@@ -0,0 +1,13 @@
1
+
2
+ # Selective loading of pact v1 and v2 based on environment variables
3
+ if ENV['PACT_RUBY_V1_ENABLE'] != 'false'
4
+ require 'pact/support'
5
+ require 'pact/version'
6
+ require 'pact/configuration'
7
+ require 'pact/consumer'
8
+ require 'pact/provider'
9
+ require 'pact/consumer_contract'
10
+ end
11
+ if ENV['PACT_RUBY_V2_ENABLE'] == 'true'
12
+ require 'pact/v2'
13
+ end
@@ -0,0 +1,34 @@
1
+
2
+ namespace :pact do
3
+
4
+ desc "Verifies the pact files configured in the pact_helper.rb against this service provider."
5
+ task :verify do
6
+
7
+ require 'pact/tasks/task_helper'
8
+
9
+ include Pact::TaskHelper
10
+
11
+ handle_verification_failure do
12
+ execute_pact_verify
13
+ end
14
+ end
15
+
16
+ desc "Verifies the pact at the given URI against this service provider."
17
+ task 'verify:at', :pact_uri do | t, args |
18
+ require 'rainbow'
19
+ require 'pact/tasks/task_helper'
20
+
21
+ include Pact::TaskHelper
22
+
23
+ abort(Rainbow("Please provide a pact URI. eg. rake pact:verify:at[../my-consumer/spec/pacts/my_consumer-my_provider.json]").red) unless args[:pact_uri]
24
+ handle_verification_failure do
25
+ execute_pact_verify args[:pact_uri]
26
+ end
27
+ end
28
+
29
+ desc "Get help debugging pact:verify failures."
30
+ task 'verify:help', :reports_dir do | t, args |
31
+ require 'pact/provider/help/console_text'
32
+ puts Pact::Provider::Help::ConsoleText.(args[:reports_dir])
33
+ end
34
+ end
data/pact.gemspec ADDED
@@ -0,0 +1,106 @@
1
+ lib = File.expand_path("lib", __dir__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require 'pact/version'
4
+
5
+ Gem::Specification.new do |gem|
6
+ gem.name = "pact-v2"
7
+ gem.version = Pact::VERSION
8
+ gem.authors = ["James Fraser", "Sergei Matheson", "Brent Snook", "Ronald Holshausen", "Beth Skurrie"]
9
+ gem.email = ["james.fraser@alumni.swinburne.edu", "sergei.matheson@gmail.com", "brent@fuglylogic.com", "uglyog@gmail.com", "bskurrie@dius.com.au"]
10
+ gem.description = %q{Enables consumer driven contract testing, providing a mock service and DSL for the consumer project, and interaction playback and verification for the service provider project.}
11
+ gem.summary = %q{Enables consumer driven contract testing, providing a mock service and DSL for the consumer project, and interaction playback and verification for the service provider project.}
12
+ gem.homepage = "https://github.com/pact-foundation/pact-ruby"
13
+
14
+ gem.required_ruby_version = '>= 2.0'
15
+
16
+ gem.files = `git ls-files bin lib pact.gemspec CHANGELOG.md LICENSE.txt`.split($/)
17
+ gem.executables = gem.files.grep(%r{^bin/}).map { |f| File.basename(f) }
18
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
19
+ gem.require_paths = ["lib"]
20
+ gem.license = 'MIT'
21
+
22
+ gem.metadata = {
23
+ 'changelog_uri' => 'https://github.com/pact-foundation/pact-ruby/blob/master/CHANGELOG.md',
24
+ 'source_code_uri' => 'https://github.com/pact-foundation/pact-ruby',
25
+ 'bug_tracker_uri' => 'https://github.com/pact-foundation/pact-ruby/issues',
26
+ 'documentation_uri' => 'https://github.com/pact-foundation/pact-ruby/blob/master/README.md'
27
+ }
28
+
29
+ # Shared dependencies between v1 and v2
30
+ gem.add_development_dependency 'rake', '~> 13.0'
31
+ gem.add_development_dependency 'faraday', '~>2.0', '<3.0'
32
+ gem.add_development_dependency 'webmock', '~> 3.0'
33
+
34
+ # Control which version of pact to use
35
+ # PACT_RUBY_V1_ENABLE=true to disable v1 (default is enabled)
36
+ # PACT_RUBY_V2_ENABLE=true to enable v2 (default is disabled)
37
+ # Both can be enabled at the same time, to enable transition
38
+
39
+ if ENV['PACT_RUBY_V1_ENABLE'] != 'false'
40
+ gem.add_runtime_dependency 'rspec', '~> 3.0'
41
+ gem.add_runtime_dependency 'rack-test', '>= 0.6.3', '< 3.0.0'
42
+ gem.add_runtime_dependency 'thor', '>= 0.20', '< 2.0'
43
+ gem.add_runtime_dependency "rainbow", '~> 3.1'
44
+ gem.add_runtime_dependency 'string_pattern', '~> 2.0'
45
+ gem.add_runtime_dependency 'jsonpath', '~> 1.0'
46
+
47
+ gem.add_runtime_dependency "pact-support" , "~> 1.21", ">=1.21.2"
48
+ gem.add_runtime_dependency 'pact-mock_service', '~> 3.0', '>= 3.3.1'
49
+ gem.add_development_dependency 'fakefs', '2.4'
50
+ gem.add_development_dependency 'hashie', '~> 5.0'
51
+ gem.add_development_dependency 'faraday-multipart', '~> 1.0'
52
+ gem.add_development_dependency 'conventional-changelog', '~> 1.3'
53
+ gem.add_development_dependency 'bump', '~> 0.5'
54
+ gem.add_development_dependency 'pact-message', '~> 0.8'
55
+ gem.add_development_dependency 'rspec-its', '~> 1.3'
56
+ gem.add_development_dependency 'webrick', '~> 1.8'
57
+ gem.add_development_dependency 'ostruct'
58
+ end
59
+
60
+ if ENV['PACT_RUBY_V2_ENABLE'] == 'true'
61
+
62
+ # Core dependencies (code loading)
63
+ gem.add_dependency "zeitwerk", "~> 2.3"
64
+
65
+ # For Pact support via Pact Rust Core
66
+ gem.add_dependency "pact-ffi", "~> 0.4.28"
67
+
68
+ # For Provider Side Verification
69
+ gem.add_dependency "rack"
70
+ gem.add_dependency "rack-proxy"
71
+ gem.add_dependency "webrick", '~> 1.8'
72
+
73
+ # For Rails support, including testing non rails apps
74
+ gem.add_development_dependency "combustion", ">= 1.3"
75
+
76
+ # For Kafka support
77
+ unless RUBY_PLATFORM =~ /win32|x64-mingw32|x64-mingw-ucrt/
78
+ # windows does not support librdkafka
79
+ gem.add_development_dependency "sbmt-kafka_consumer", ">= 2.0.1"
80
+ gem.add_development_dependency "sbmt-kafka_producer", ">= 1.0"
81
+ end
82
+ if ENV['X_PACT_DEVELOPMENT_RDKAFKA'] == 'true'
83
+ # darwin-arm64 prebuilt gems available from 0.20.0
84
+ gem.add_development_dependency "karafka-rdkafka", ">= 0.20.0"
85
+ end
86
+
87
+ # For gRPC support
88
+ gem.add_development_dependency "gruf", ">= 2.18"
89
+ gem.add_development_dependency "gruf-rspec", ">= 0.6.0"
90
+
91
+ # Testing tools
92
+ gem.add_development_dependency "rspec"
93
+ gem.add_development_dependency "rspec-rails"
94
+ gem.add_development_dependency "rspec_junit_formatter"
95
+ gem.add_development_dependency "vcr", ">= 6.0"
96
+
97
+ # Development and linting tools
98
+ gem.add_development_dependency "appraisal", ">= 2.4"
99
+ gem.add_development_dependency "bundler", ">= 2.2"
100
+ gem.add_development_dependency "rubocop"
101
+ gem.add_development_dependency "rubocop-rspec"
102
+ gem.add_development_dependency "rubocop-rails"
103
+ gem.add_development_dependency "rubocop-performance"
104
+ gem.add_development_dependency "standard", ">= 1.35.1"
105
+ end
106
+ end