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,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Pact
|
4
|
+
module V2
|
5
|
+
module Matchers
|
6
|
+
module V3
|
7
|
+
class Date < Pact::V2::Matchers::Base
|
8
|
+
def initialize(format, template)
|
9
|
+
raise MatcherInitializationError, "#{self.class}: #{format} should be an instance of String" unless template.is_a?(String)
|
10
|
+
raise MatcherInitializationError, "#{self.class}: #{template} should be an instance of String" unless template.is_a?(String)
|
11
|
+
|
12
|
+
super(spec_version: Pact::V2::Matchers::PACT_SPEC_V3, kind: "date", template: template, opts: {format: format})
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Pact
|
4
|
+
module V2
|
5
|
+
module Matchers
|
6
|
+
module V3
|
7
|
+
class DateTime < Pact::V2::Matchers::Base
|
8
|
+
def initialize(format, template)
|
9
|
+
raise MatcherInitializationError, "#{self.class}: #{format} should be an instance of String" unless template.is_a?(String)
|
10
|
+
raise MatcherInitializationError, "#{self.class}: #{template} should be an instance of String" unless template.is_a?(String)
|
11
|
+
|
12
|
+
super(spec_version: Pact::V2::Matchers::PACT_SPEC_V3, kind: "datetime", template: template, opts: {format: format})
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Pact
|
4
|
+
module V2
|
5
|
+
module Matchers
|
6
|
+
module V3
|
7
|
+
class Decimal < Pact::V2::Matchers::Base
|
8
|
+
def initialize(template)
|
9
|
+
raise MatcherInitializationError, "#{self.class}: #{template} should be an instance of Float" unless template.is_a?(Float)
|
10
|
+
|
11
|
+
super(spec_version: Pact::V2::Matchers::PACT_SPEC_V3, kind: "decimal", template: template)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Pact
|
4
|
+
module V2
|
5
|
+
module Matchers
|
6
|
+
module V3
|
7
|
+
class Each < Pact::V2::Matchers::Base
|
8
|
+
def initialize(template, min)
|
9
|
+
raise MatcherInitializationError, "#{self.class}: #{min} should be greater than 0" if min.present? && min < 1
|
10
|
+
|
11
|
+
min_array_size = min.presence || 1
|
12
|
+
val = template.is_a?(Array) ? template : [template] * min_array_size
|
13
|
+
|
14
|
+
raise MatcherInitializationError, "#{self.class}: #{min} is invalid: template size is #{val.size}" if min_array_size != val.size
|
15
|
+
|
16
|
+
super(
|
17
|
+
spec_version: Pact::V2::Matchers::PACT_SPEC_V3,
|
18
|
+
kind: "type",
|
19
|
+
template: val,
|
20
|
+
opts: {min: min_array_size})
|
21
|
+
end
|
22
|
+
|
23
|
+
def as_plugin
|
24
|
+
if @template.first.is_a?(Hash)
|
25
|
+
return {
|
26
|
+
"pact:match" => "eachValue(matching($'SAMPLE'))",
|
27
|
+
"SAMPLE" => serialize!(@template.first.deep_dup, :plugin)
|
28
|
+
}
|
29
|
+
end
|
30
|
+
|
31
|
+
params = @opts.except(:min).values.map { |v| format_primitive(v) }.join(",")
|
32
|
+
value = format_primitive(@template.first)
|
33
|
+
|
34
|
+
return "eachValue(matching(#{@kind}, #{params}, #{value}))" if params.present?
|
35
|
+
|
36
|
+
"eachValue(matching(#{@kind}, #{value}))"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Pact
|
4
|
+
module V2
|
5
|
+
module Matchers
|
6
|
+
module V3
|
7
|
+
class Include < Pact::V2::Matchers::Base
|
8
|
+
def initialize(template)
|
9
|
+
raise MatcherInitializationError, "#{self.class}: #{template} should be an instance of String" unless template.is_a?(String)
|
10
|
+
|
11
|
+
super(spec_version: Pact::V2::Matchers::PACT_SPEC_V3, kind: "include", template: template)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Pact
|
4
|
+
module V2
|
5
|
+
module Matchers
|
6
|
+
module V3
|
7
|
+
class Integer < Pact::V2::Matchers::Base
|
8
|
+
def initialize(template)
|
9
|
+
raise MatcherInitializationError, "#{self.class}: #{template} should be an instance of Integer" unless template.is_a?(::Integer)
|
10
|
+
|
11
|
+
super(spec_version: Pact::V2::Matchers::PACT_SPEC_V3, kind: "integer", template: template)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Pact
|
4
|
+
module V2
|
5
|
+
module Matchers
|
6
|
+
module V3
|
7
|
+
class Number < Pact::V2::Matchers::Base
|
8
|
+
def initialize(template)
|
9
|
+
raise MatcherInitializationError, "#{self.class}: #{template} should be an instance of Numeric" unless template.is_a?(Numeric)
|
10
|
+
|
11
|
+
super(spec_version: Pact::V2::Matchers::PACT_SPEC_V3, kind: "number", template: template)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Pact
|
4
|
+
module V2
|
5
|
+
module Matchers
|
6
|
+
module V3
|
7
|
+
class Time < Pact::V2::Matchers::Base
|
8
|
+
def initialize(format, template)
|
9
|
+
raise MatcherInitializationError, "#{self.class}: #{format} should be an instance of String" unless template.is_a?(String)
|
10
|
+
raise MatcherInitializationError, "#{self.class}: #{template} should be an instance of String" unless template.is_a?(String)
|
11
|
+
|
12
|
+
super(spec_version: Pact::V2::Matchers::PACT_SPEC_V3, kind: "time", template: template, opts: {format: format})
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Pact
|
4
|
+
module V2
|
5
|
+
module Matchers
|
6
|
+
module V4
|
7
|
+
class EachKey < Pact::V2::Matchers::Base
|
8
|
+
def initialize(key_matchers, template)
|
9
|
+
raise MatcherInitializationError, "#{self.class}: #{template} should be a Hash" unless template.is_a?(Hash)
|
10
|
+
raise MatcherInitializationError, "#{self.class}: #{key_matchers} should be an Array" unless key_matchers.is_a?(Array)
|
11
|
+
raise MatcherInitializationError, "#{self.class}: #{key_matchers} should be instances of Pact::V2::Matchers::Base" unless key_matchers.all?(Pact::V2::Matchers::Base)
|
12
|
+
raise MatcherInitializationError, "#{self.class}: #{key_matchers} size should be greater than 0" unless key_matchers.size > 0
|
13
|
+
|
14
|
+
super(spec_version: Pact::V2::Matchers::PACT_SPEC_V4, kind: "each-key", template: template, opts: {rules: key_matchers})
|
15
|
+
end
|
16
|
+
|
17
|
+
def as_plugin
|
18
|
+
@opts[:rules].map do |matcher|
|
19
|
+
"eachKey(#{matcher.as_plugin})"
|
20
|
+
end.join(", ")
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Pact
|
4
|
+
module V2
|
5
|
+
module Matchers
|
6
|
+
module V4
|
7
|
+
class EachKeyValue < Pact::V2::Matchers::Base
|
8
|
+
def initialize(key_matchers, template)
|
9
|
+
raise MatcherInitializationError, "#{self.class}: #{template} should be a Hash" unless template.is_a?(Hash)
|
10
|
+
raise MatcherInitializationError, "#{self.class}: #{key_matchers} should be an Array" unless key_matchers.is_a?(Array)
|
11
|
+
raise MatcherInitializationError, "#{self.class}: #{key_matchers} should be instances of Pact::V2::Matchers::Base" unless key_matchers.all?(Pact::V2::Matchers::Base)
|
12
|
+
|
13
|
+
super(
|
14
|
+
spec_version: Pact::V2::Matchers::PACT_SPEC_V4,
|
15
|
+
kind: [
|
16
|
+
EachKey.new(key_matchers, {}),
|
17
|
+
EachValue.new([Pact::V2::Matchers::V2::Type.new("")], {})
|
18
|
+
],
|
19
|
+
template: template
|
20
|
+
)
|
21
|
+
|
22
|
+
@key_matchers = key_matchers
|
23
|
+
end
|
24
|
+
|
25
|
+
def as_plugin
|
26
|
+
raise MatcherInitializationError, "#{self.class}: each-key-value is not supported in plugin syntax. Use each / each_key / each_value matchers instead"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Pact
|
4
|
+
module V2
|
5
|
+
module Matchers
|
6
|
+
module V4
|
7
|
+
class EachValue < Pact::V2::Matchers::Base
|
8
|
+
def initialize(value_matchers, template)
|
9
|
+
# raise MatcherInitializationError, "#{self.class}: #{template} should be a Hash" unless template.is_a?(Hash)
|
10
|
+
raise MatcherInitializationError, "#{self.class}: #{value_matchers} should be an Array" unless value_matchers.is_a?(Array)
|
11
|
+
raise MatcherInitializationError, "#{self.class}: #{value_matchers} should be instances of Pact::V2::Matchers::Base" unless value_matchers.all?(Pact::V2::Matchers::Base)
|
12
|
+
raise MatcherInitializationError, "#{self.class}: #{value_matchers} size should be greater than 0" unless value_matchers.size > 0
|
13
|
+
|
14
|
+
super(spec_version: Pact::V2::Matchers::PACT_SPEC_V4, kind: "each-value", template: template, opts: {rules: value_matchers})
|
15
|
+
end
|
16
|
+
|
17
|
+
def as_plugin
|
18
|
+
if @template.is_a?(Hash)
|
19
|
+
return {
|
20
|
+
"pact:match" => "eachValue(matching($'SAMPLE'))",
|
21
|
+
"SAMPLE" => serialize!(@template.deep_dup, :plugin)
|
22
|
+
}
|
23
|
+
end
|
24
|
+
|
25
|
+
@opts[:rules].map do |matcher|
|
26
|
+
"eachValue(#{matcher.as_plugin})"
|
27
|
+
end.join(", ")
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Pact
|
4
|
+
module V2
|
5
|
+
module Matchers
|
6
|
+
module V4
|
7
|
+
class NotEmpty < Pact::V2::Matchers::Base
|
8
|
+
def initialize(template)
|
9
|
+
raise MatcherInitializationError, "#{self.class}: #{template} should not be empty" if template.blank?
|
10
|
+
|
11
|
+
super(spec_version: Pact::V2::Matchers::PACT_SPEC_V4, kind: "time", template: template)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,94 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Pact
|
4
|
+
module V2
|
5
|
+
module Matchers
|
6
|
+
PACT_SPEC_V1 = 1
|
7
|
+
PACT_SPEC_V2 = 2
|
8
|
+
PACT_SPEC_V3 = 3
|
9
|
+
PACT_SPEC_V4 = 4
|
10
|
+
|
11
|
+
ANY_STRING_REGEX = /.*/
|
12
|
+
UUID_REGEX = /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/i
|
13
|
+
|
14
|
+
# simplified
|
15
|
+
ISO8601_REGEX = /\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)*(.\d{2}:\d{2})*/i
|
16
|
+
|
17
|
+
def match_exactly(arg)
|
18
|
+
V1::Equality.new(arg)
|
19
|
+
end
|
20
|
+
|
21
|
+
def match_type_of(arg)
|
22
|
+
V2::Type.new(arg)
|
23
|
+
end
|
24
|
+
|
25
|
+
def match_include(arg)
|
26
|
+
V3::Include.new(arg)
|
27
|
+
end
|
28
|
+
|
29
|
+
def match_any_string(sample = "any")
|
30
|
+
V2::Regex.new(ANY_STRING_REGEX, sample)
|
31
|
+
end
|
32
|
+
|
33
|
+
def match_any_integer(sample = 10)
|
34
|
+
V3::Integer.new(sample)
|
35
|
+
end
|
36
|
+
|
37
|
+
def match_any_decimal(sample = 10.0)
|
38
|
+
V3::Decimal.new(sample)
|
39
|
+
end
|
40
|
+
|
41
|
+
def match_any_number(sample = 10.0)
|
42
|
+
V3::Number.new(sample)
|
43
|
+
end
|
44
|
+
|
45
|
+
def match_any_boolean(sample = true)
|
46
|
+
V3::Boolean.new(sample)
|
47
|
+
end
|
48
|
+
|
49
|
+
def match_uuid(sample = "e1d01e04-3a2b-4eed-a4fb-54f5cd257338")
|
50
|
+
V2::Regex.new(UUID_REGEX, sample)
|
51
|
+
end
|
52
|
+
|
53
|
+
def match_regex(regex, sample)
|
54
|
+
V2::Regex.new(regex, sample)
|
55
|
+
end
|
56
|
+
|
57
|
+
def match_datetime(format, sample)
|
58
|
+
V3::DateTime.new(format, sample)
|
59
|
+
end
|
60
|
+
|
61
|
+
def match_iso8601(sample = "2024-08-12T12:25:00.243118+03:00")
|
62
|
+
V2::Regex.new(ISO8601_REGEX, sample)
|
63
|
+
end
|
64
|
+
|
65
|
+
def match_date(format, sample)
|
66
|
+
V3::Date.new(format, sample)
|
67
|
+
end
|
68
|
+
|
69
|
+
def match_time(format, sample)
|
70
|
+
V3::Time.new(format, sample)
|
71
|
+
end
|
72
|
+
|
73
|
+
def match_each(template, min = nil)
|
74
|
+
V3::Each.new(template, min)
|
75
|
+
end
|
76
|
+
|
77
|
+
def match_each_regex(regex, sample)
|
78
|
+
match_each_value(sample, match_regex(regex, sample))
|
79
|
+
end
|
80
|
+
|
81
|
+
def match_each_key(template, key_matchers)
|
82
|
+
V4::EachKey.new(key_matchers.is_a?(Array) ? key_matchers : [key_matchers], template)
|
83
|
+
end
|
84
|
+
|
85
|
+
def match_each_value(template, value_matchers = V2::Type.new(""))
|
86
|
+
V4::EachValue.new(value_matchers.is_a?(Array) ? value_matchers : [value_matchers], template)
|
87
|
+
end
|
88
|
+
|
89
|
+
def match_each_kv(template, key_matchers)
|
90
|
+
V4::EachKeyValue.new(key_matchers.is_a?(Array) ? key_matchers : [key_matchers], template)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "ffi"
|
4
|
+
require "pact/ffi/verifier"
|
5
|
+
|
6
|
+
module Pact
|
7
|
+
module V2
|
8
|
+
module Native
|
9
|
+
module BlockingVerifier
|
10
|
+
extend FFI::Library
|
11
|
+
ffi_lib DetectOS.get_bin_path
|
12
|
+
|
13
|
+
attach_function :execute, :pactffi_verifier_execute, %i[pointer], :int32, blocking: true
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "pact/ffi/logger"
|
4
|
+
|
5
|
+
module Pact
|
6
|
+
module V2
|
7
|
+
module Native
|
8
|
+
module Logger
|
9
|
+
LOG_LEVELS = {
|
10
|
+
off: PactFfi::FfiLogLevelFilter["LOG_LEVEL_OFF"],
|
11
|
+
error: PactFfi::FfiLogLevelFilter["LOG_LEVEL_ERROR"],
|
12
|
+
warn: PactFfi::FfiLogLevelFilter["LOG_LEVEL_WARN"],
|
13
|
+
info: PactFfi::FfiLogLevelFilter["LOG_LEVEL_INFO"],
|
14
|
+
debug: PactFfi::FfiLogLevelFilter["LOG_LEVEL_DEBUG"],
|
15
|
+
trace: PactFfi::FfiLogLevelFilter["LOG_LEVEL_TRACE"]
|
16
|
+
}.freeze
|
17
|
+
|
18
|
+
def self.log_to_stdout(log_level)
|
19
|
+
raise "invalid log level for PactFfi::FfiLogLevelFilter" unless LOG_LEVELS.key?(log_level)
|
20
|
+
PactFfi::Logger.log_to_stdout(LOG_LEVELS[log_level])
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "pact/ffi/verifier"
|
4
|
+
require "pact/v2/native/logger"
|
5
|
+
|
6
|
+
module Pact
|
7
|
+
module V2
|
8
|
+
module Provider
|
9
|
+
class AsyncMessageVerifier < BaseVerifier
|
10
|
+
PROVIDER_TRANSPORT_TYPE = "message"
|
11
|
+
|
12
|
+
def initialize(pact_config, mixed_config = nil)
|
13
|
+
super
|
14
|
+
|
15
|
+
raise ArgumentError, "pact_config must be an instance of Pact::V2::Provider::PactConfig::Message" unless pact_config.is_a?(::Pact::V2::Provider::PactConfig::Async)
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def add_provider_transport(pact_handle)
|
21
|
+
setup_uri = URI(@pact_config.message_setup_url)
|
22
|
+
PactFfi::Verifier.add_provider_transport(pact_handle, PROVIDER_TRANSPORT_TYPE, setup_uri.port, setup_uri.path, "")
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|