pact 2.0.3 → 2.1.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9fedd79fe261a6e6b2a21eba15e1adfddd50ae8a39c947894284eaa693c2a7c0
4
- data.tar.gz: 9f07589709bc8423566ca1eb7621240bd3e8cca1e4ebc31c1e018c0f7aa70890
3
+ metadata.gz: f0938fad8f436d5e1e6f143ec47f38ac8ff9de8891c85f3327c51a512d007409
4
+ data.tar.gz: 4f550fb8e2b8890e298a17d9b176aedf919baec7c84feaee0049c80ad4789d0d
5
5
  SHA512:
6
- metadata.gz: 876698c72508446aecad3723893eb3b68e789042801b39c4da3f661c6e5c22bb1bdc7f06de2b7fe93a1ff9b69a01468efefe4acba3c77288784ab40bfd2aca67
7
- data.tar.gz: 0d4342358605a35a9da2a1e441e5b25f82957211627c2cf7bea5f6fea2bf556083d329c976ff18e9a32821f66b6da2e52d07deb376db661d930e935a87de1d89
6
+ metadata.gz: 5f7fc288b6d58e1fb87e4e9f216d19434c41c94f4ab2e39d8bc9f88fdb332f682bdc0e5c4c505569c058da9b96c8378bd2d60dc63cbe0194276ff93228515a3a
7
+ data.tar.gz: 4a07df495c3984d5b5344ce7c1b92496f69da4f888f18027184638480df328f71bcc57f8a73b03d696ad3d56ba2ee245119382b9dd16653e8d67a0740ad6b005
data/CHANGELOG.md CHANGED
@@ -1,3 +1,17 @@
1
+ <a name="v2.1.1"></a>
2
+ ### v2.1.1 (2026-10-19)
3
+
4
+ #### Bug Fixes
5
+
6
+ * add interaction references to the interaction, not the pact ([c79cba5](/../../commit/c79cba5))
7
+
8
+ <a name="v2.1.0"></a>
9
+ ### v2.1.0 (2026-09-14)
10
+
11
+ #### Features
12
+
13
+ * add interaction reference (#416) ([7953bca](/../../commit/7953bca))
14
+
1
15
  <a name="v2.0.3"></a>
2
16
  ### v2.0.3 (2026-09-12)
3
17
 
@@ -48,6 +48,7 @@ module Pact
48
48
  @response = nil
49
49
  @response_meta = nil
50
50
  @provider_state_meta = nil
51
+ @references = []
51
52
  end
52
53
 
53
54
  def with_service(proto_path, method, include_dirs = [])
@@ -89,6 +90,14 @@ module Pact
89
90
  self
90
91
  end
91
92
 
93
+ def reference(group, name, value)
94
+ raise InteractionBuilderError.new("group is required") if group.blank?
95
+ raise InteractionBuilderError.new("name is required") if name.blank?
96
+ raise InteractionBuilderError.new("value is required") if value.blank?
97
+ @references << [group, name, value]
98
+ self
99
+ end
100
+
92
101
  def will_respond_with(resp_hash)
93
102
  @response = InteractionContents.plugin(resp_hash)
94
103
  self
@@ -138,6 +147,12 @@ module Pact
138
147
  end
139
148
  end
140
149
 
150
+ @references.each do |group, name, value|
151
+ next if PactFfi.add_interaction_reference(message_pact, group, name, value)
152
+
153
+ raise InteractionBuilderError.new("could not add reference #{group}/#{name}")
154
+ end
155
+
141
156
  result = PactFfi::PluginConsumer.interaction_contents(message_pact, 0, GRPC_CONTENT_TYPE, interaction_json)
142
157
  if CREATE_INTERACTION_ERRORS[result].present?
143
158
  error = CREATE_INTERACTION_ERRORS[result]
@@ -34,6 +34,7 @@ module Pact
34
34
  def initialize(pact_config, description: nil)
35
35
  @pact_config = pact_config
36
36
  @description = description || ""
37
+ @references = []
37
38
 
38
39
  @pact_handle = pact_config.pact_handle ||= init_pact
39
40
  @pact_interaction = PactFfi.new_interaction(pact_handle, @description)
@@ -88,6 +89,14 @@ module Pact
88
89
  self
89
90
  end
90
91
 
92
+ def reference(group, name, value)
93
+ raise InteractionBuilderError.new("group is required") if group.blank?
94
+ raise InteractionBuilderError.new("name is required") if name.blank?
95
+ raise InteractionBuilderError.new("value is required") if value.blank?
96
+ @references << [group, name, value]
97
+ self
98
+ end
99
+
91
100
  def will_respond_with(status: nil, headers: {}, body: nil)
92
101
  interaction_part = PactFfi::FfiInteractionPart["INTERACTION_PART_RESPONSE"]
93
102
  PactFfi.response_status(pact_interaction, status)
@@ -106,6 +115,12 @@ module Pact
106
115
  def execute(&block)
107
116
  raise InteractionBuilderError.new("interaction is designed to be used one-time only") if defined?(@used)
108
117
 
118
+ @references.each do |group, name, value|
119
+ next if PactFfi.add_interaction_reference(pact_interaction, group, name, value)
120
+
121
+ raise InteractionBuilderError.new("could not add reference #{group}/#{name}")
122
+ end
123
+
109
124
  mock_server = MockServer.create_for_http!(
110
125
  pact: pact_handle, host: pact_config.mock_host, port: pact_config.mock_port
111
126
  )
@@ -58,6 +58,7 @@ module Pact
58
58
  @meta = {}
59
59
  @headers = {}
60
60
  @provider_state_meta = nil
61
+ @references = []
61
62
  end
62
63
 
63
64
  def given(provider_state, metadata = {})
@@ -75,6 +76,14 @@ module Pact
75
76
  self
76
77
  end
77
78
 
79
+ def reference(group, name, value)
80
+ raise InteractionBuilderError.new("group is required") if group.blank?
81
+ raise InteractionBuilderError.new("name is required") if name.blank?
82
+ raise InteractionBuilderError.new("value is required") if value.blank?
83
+ @references << [group, name, value]
84
+ self
85
+ end
86
+
78
87
  def with_proto_class(proto_path, message_class_name, include_dirs = [])
79
88
  absolute_path = File.expand_path(proto_path)
80
89
  raise InteractionBuilderError.new("proto file #{proto_path} does not exist") unless File.exist?(absolute_path)
@@ -131,6 +140,12 @@ module Pact
131
140
 
132
141
  message_pact = PactFfi::MessageConsumer.new_message_interaction(pact_handle, @description)
133
142
 
143
+ @references.each do |group, name, value|
144
+ next if PactFfi.add_interaction_reference(message_pact, group, name, value)
145
+
146
+ raise InteractionBuilderError.new("could not add reference #{group}/#{name}")
147
+ end
148
+
134
149
  configure_interaction!(message_pact)
135
150
 
136
151
  # strip out matchers and get raw payload/metadata
@@ -38,6 +38,7 @@ module Pact
38
38
  @description = description || ""
39
39
  @contents = nil
40
40
  @provider_state_meta = nil
41
+ @references = []
41
42
  end
42
43
 
43
44
  def with_plugin(plugin_name, plugin_version)
@@ -79,6 +80,14 @@ module Pact
79
80
  self
80
81
  end
81
82
 
83
+ def reference(group, name, value)
84
+ raise InteractionBuilderError.new("group is required") if group.blank?
85
+ raise InteractionBuilderError.new("name is required") if name.blank?
86
+ raise InteractionBuilderError.new("value is required") if value.blank?
87
+ @references << [group, name, value]
88
+ self
89
+ end
90
+
82
91
  def interaction_json
83
92
  result = {
84
93
  contents: @contents
@@ -101,6 +110,12 @@ module Pact
101
110
 
102
111
  interaction = PactFfi::AsyncMessageConsumer.new(pact_handle, @description)
103
112
 
113
+ @references.each do |group, name, value|
114
+ next if PactFfi.add_interaction_reference(interaction, group, name, value)
115
+
116
+ raise InteractionBuilderError.new("could not add reference #{group}/#{name}")
117
+ end
118
+
104
119
  @provider_state_meta&.each_pair do |provider_state, meta|
105
120
  if meta.present?
106
121
  meta.each_pair do |k, v|
@@ -38,6 +38,7 @@ module Pact
38
38
  @description = description || ""
39
39
  @contents = nil
40
40
  @provider_state_meta = nil
41
+ @references = []
41
42
  end
42
43
 
43
44
  def with_plugin(plugin_name, plugin_version)
@@ -95,6 +96,14 @@ module Pact
95
96
  self
96
97
  end
97
98
 
99
+ def reference(group, name, value)
100
+ raise InteractionBuilderError.new("group is required") if group.blank?
101
+ raise InteractionBuilderError.new("name is required") if name.blank?
102
+ raise InteractionBuilderError.new("value is required") if value.blank?
103
+ @references << [group, name, value]
104
+ self
105
+ end
106
+
98
107
  def interaction_json
99
108
  result = {
100
109
  request: @request,
@@ -118,6 +127,13 @@ module Pact
118
127
  init_plugin!(pact_handle)
119
128
 
120
129
  interaction = PactFfi.new_interaction(pact_handle, @description)
130
+
131
+ @references.each do |group, name, value|
132
+ next if PactFfi.add_interaction_reference(interaction, group, name, value)
133
+
134
+ raise InteractionBuilderError.new("could not add reference #{group}/#{name}")
135
+ end
136
+
121
137
  @provider_state_meta&.each_pair do |provider_state, meta|
122
138
  if meta.present?
123
139
  meta.each_pair do |k, v|
@@ -40,6 +40,7 @@ module Pact
40
40
  @response = nil
41
41
  @response_meta = nil
42
42
  @provider_state_meta = nil
43
+ @references = []
43
44
  end
44
45
 
45
46
  def with_plugin(plugin_name, plugin_version)
@@ -91,6 +92,14 @@ module Pact
91
92
  self
92
93
  end
93
94
 
95
+ def reference(group, name, value)
96
+ raise InteractionBuilderError.new("group is required") if group.blank?
97
+ raise InteractionBuilderError.new("name is required") if name.blank?
98
+ raise InteractionBuilderError.new("value is required") if value.blank?
99
+ @references << [group, name, value]
100
+ self
101
+ end
102
+
94
103
  def interaction_json
95
104
  result = {
96
105
  request: @request
@@ -117,6 +126,13 @@ module Pact
117
126
  init_plugin!(pact_handle)
118
127
 
119
128
  message_pact = PactFfi::SyncMessageConsumer.new_interaction(pact_handle, @description)
129
+
130
+ @references.each do |group, name, value|
131
+ next if PactFfi.add_interaction_reference(message_pact, group, name, value)
132
+
133
+ raise InteractionBuilderError.new("could not add reference #{group}/#{name}")
134
+ end
135
+
120
136
  @provider_state_meta&.each_pair do |provider_state, meta|
121
137
  if meta.present?
122
138
  meta.each_pair { |k, v| PactFfi.given_with_param(message_pact, provider_state, k.to_s, v.to_s) }
data/lib/pact/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  # Remember to bump pact-provider-proxy when this changes major version
2
2
  module Pact
3
- VERSION = "2.0.3"
3
+ VERSION = "2.1.1"
4
4
  end
data/pact.gemspec CHANGED
@@ -36,7 +36,7 @@ Gem::Specification.new do |gem|
36
36
  # Core dependencies (code loading)
37
37
  gem.add_dependency 'zeitwerk', '~> 2.3'
38
38
  # For Pact support via Pact Rust Core
39
- gem.add_dependency 'pact-ffi', '~> 0.4.28'
39
+ gem.add_dependency 'pact-ffi', '~> 0.5.8'
40
40
  # For Provider Side Verification
41
41
  gem.add_dependency 'rack'
42
42
  gem.add_dependency 'rack-proxy'
@@ -48,12 +48,8 @@ Gem::Specification.new do |gem|
48
48
  # For Kafka support
49
49
  unless RUBY_PLATFORM =~ /win32|x64-mingw32|x64-mingw-ucrt/
50
50
  # windows does not support librdkafka
51
- gem.add_development_dependency 'sbmt-kafka_consumer', '>= 2.0.1'
52
- gem.add_development_dependency 'sbmt-kafka_producer', '>= 1.0'
53
- end
54
- if ENV['X_PACT_DEVELOPMENT_RDKAFKA'] == 'true'
55
- # darwin-arm64 prebuilt gems available from 0.20.0
56
- gem.add_development_dependency 'karafka-rdkafka', '>= 0.20.0'
51
+ gem.add_development_dependency 'sbmt-kafka_consumer', '>= 3.0.0'
52
+ gem.add_development_dependency 'sbmt-kafka_producer', '>= 3.0.0'
57
53
  end
58
54
  # For gRPC support
59
55
  gem.add_development_dependency 'gruf', '>= 2.18'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pact
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.3
4
+ version: 2.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Fraser
@@ -33,14 +33,14 @@ dependencies:
33
33
  requirements:
34
34
  - - "~>"
35
35
  - !ruby/object:Gem::Version
36
- version: 0.4.28
36
+ version: 0.5.8
37
37
  type: :runtime
38
38
  prerelease: false
39
39
  version_requirements: !ruby/object:Gem::Requirement
40
40
  requirements:
41
41
  - - "~>"
42
42
  - !ruby/object:Gem::Version
43
- version: 0.4.28
43
+ version: 0.5.8
44
44
  - !ruby/object:Gem::Dependency
45
45
  name: rack
46
46
  requirement: !ruby/object:Gem::Requirement
@@ -117,28 +117,28 @@ dependencies:
117
117
  requirements:
118
118
  - - ">="
119
119
  - !ruby/object:Gem::Version
120
- version: 2.0.1
120
+ version: 3.0.0
121
121
  type: :development
122
122
  prerelease: false
123
123
  version_requirements: !ruby/object:Gem::Requirement
124
124
  requirements:
125
125
  - - ">="
126
126
  - !ruby/object:Gem::Version
127
- version: 2.0.1
127
+ version: 3.0.0
128
128
  - !ruby/object:Gem::Dependency
129
129
  name: sbmt-kafka_producer
130
130
  requirement: !ruby/object:Gem::Requirement
131
131
  requirements:
132
132
  - - ">="
133
133
  - !ruby/object:Gem::Version
134
- version: '1.0'
134
+ version: 3.0.0
135
135
  type: :development
136
136
  prerelease: false
137
137
  version_requirements: !ruby/object:Gem::Requirement
138
138
  requirements:
139
139
  - - ">="
140
140
  - !ruby/object:Gem::Version
141
- version: '1.0'
141
+ version: 3.0.0
142
142
  - !ruby/object:Gem::Dependency
143
143
  name: gruf
144
144
  requirement: !ruby/object:Gem::Requirement
@@ -513,7 +513,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
513
513
  - !ruby/object:Gem::Version
514
514
  version: '0'
515
515
  requirements: []
516
- rubygems_version: 4.0.20
516
+ rubygems_version: 4.0.23
517
517
  specification_version: 4
518
518
  summary: Enables consumer driven contract testing, providing a mock service and DSL
519
519
  for the consumer project, and interaction playback and verification for the service