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,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