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,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
|
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
|
data/lib/pact/version.rb
ADDED
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
|
data/lib/tasks/pact.rake
ADDED
@@ -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
|