pact_broker 2.95.1 → 2.98.0
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 +4 -4
- data/CHANGELOG.md +31 -0
- data/Gemfile +1 -0
- data/docs/CONFIGURATION.md +120 -66
- data/lib/db.rb +1 -7
- data/lib/pact_broker/api/middleware/http_debug_logs.rb +36 -0
- data/lib/pact_broker/app.rb +3 -7
- data/lib/pact_broker/config/basic_auth_configuration.rb +7 -0
- data/lib/pact_broker/config/runtime_configuration.rb +22 -4
- data/lib/pact_broker/config/runtime_configuration_coercion_methods.rb +11 -0
- data/lib/pact_broker/config/runtime_configuration_database_methods.rb +6 -1
- data/lib/pact_broker/config/runtime_configuration_logging_methods.rb +13 -2
- data/lib/pact_broker/configuration.rb +2 -12
- data/lib/pact_broker/db/models.rb +2 -2
- data/lib/pact_broker/index/service.rb +2 -3
- data/lib/pact_broker/integrations/integration.rb +21 -6
- data/lib/pact_broker/integrations/service.rb +1 -1
- data/lib/pact_broker/matrix/repository.rb +2 -3
- data/lib/pact_broker/matrix/service.rb +0 -1
- data/lib/pact_broker/metrics/service.rb +2 -2
- data/lib/pact_broker/pacts/lazy_loaders.rb +26 -0
- data/lib/pact_broker/pacts/pact_publication.rb +13 -34
- data/lib/pact_broker/pacts/pact_version.rb +24 -28
- data/lib/pact_broker/pacts/pact_version_association_loaders.rb +36 -0
- data/lib/pact_broker/pacts/pacts_for_verification_repository.rb +9 -13
- data/lib/pact_broker/pacts/repository.rb +29 -25
- data/lib/pact_broker/repositories/helpers.rb +4 -0
- data/lib/pact_broker/test/http_test_data_builder.rb +8 -1
- data/lib/pact_broker/test/test_data_builder.rb +2 -1
- data/lib/pact_broker/ui/controllers/matrix.rb +14 -11
- data/lib/pact_broker/version.rb +1 -1
- data/pact_broker.gemspec +1 -1
- metadata +9 -16
- data/lib/pact_broker/matrix/aggregated_row.rb +0 -79
- data/lib/pact_broker/matrix/head_row.rb +0 -80
- data/lib/pact_broker/matrix/row.rb +0 -287
@@ -23,7 +23,7 @@ module PactBroker
|
|
23
23
|
:provider,
|
24
24
|
:consumer,
|
25
25
|
:consumer_version,
|
26
|
-
pact_version
|
26
|
+
:pact_version
|
27
27
|
]
|
28
28
|
|
29
29
|
def find(provider_name, consumer_version_selectors)
|
@@ -162,16 +162,14 @@ module PactBroker
|
|
162
162
|
|
163
163
|
def find_pacts_for_which_the_latest_version_for_the_fallback_tag_is_required(provider_name, selectors)
|
164
164
|
selectors.collect do | selector |
|
165
|
-
query = scope_for(PactPublication).for_provider_name(provider_name).for_latest_consumer_versions_with_tag(selector.fallback_tag)
|
165
|
+
query = scope_for(PactPublication).eager_for_domain_with_content.for_provider_name(provider_name).for_latest_consumer_versions_with_tag(selector.fallback_tag)
|
166
166
|
query = query.for_consumer_name(selector.consumer) if selector.consumer
|
167
|
-
query.all
|
168
|
-
.
|
169
|
-
pact_publication
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
)
|
174
|
-
end
|
167
|
+
query.all.collect do | pact_publication |
|
168
|
+
SelectedPact.new(
|
169
|
+
pact_publication.to_domain,
|
170
|
+
Selectors.new(selector.resolve_for_fallback(pact_publication.consumer_version))
|
171
|
+
)
|
172
|
+
end
|
175
173
|
end.flatten
|
176
174
|
end
|
177
175
|
|
@@ -300,9 +298,7 @@ module PactBroker
|
|
300
298
|
|
301
299
|
def collect_consumer_name_and_version_number(pact_publications_query)
|
302
300
|
pact_publications = pact_publications_query
|
303
|
-
.eager(:
|
304
|
-
.eager(:consumer)
|
305
|
-
.eager(:consumer_version)
|
301
|
+
.eager(:consumer, :consumer_version)
|
306
302
|
.order(:consumer_version_order)
|
307
303
|
.all_forbidding_lazy_load
|
308
304
|
.sort
|
@@ -7,7 +7,6 @@ require "pact_broker/pacts/pact_version"
|
|
7
7
|
require "pact/shared/json_differ"
|
8
8
|
require "pact_broker/domain"
|
9
9
|
require "pact_broker/pacts/parse"
|
10
|
-
require "pact_broker/matrix/head_row"
|
11
10
|
require "pact_broker/pacts/latest_pact_publication_id_for_consumer_version"
|
12
11
|
require "pact_broker/pacts/verifiable_pact"
|
13
12
|
require "pact_broker/repositories/helpers"
|
@@ -117,8 +116,8 @@ module PactBroker
|
|
117
116
|
|
118
117
|
def find_all_pact_versions_between consumer_name, options
|
119
118
|
find_all_database_versions_between(consumer_name, options)
|
120
|
-
.eager(:tags)
|
121
119
|
.reverse_order(:consumer_version_order)
|
120
|
+
.all
|
122
121
|
.collect(&:to_domain)
|
123
122
|
end
|
124
123
|
|
@@ -143,7 +142,7 @@ module PactBroker
|
|
143
142
|
def find_latest_pacts_for_provider provider_name, tag = nil
|
144
143
|
query = scope_for(PactPublication)
|
145
144
|
.for_provider_name(provider_name)
|
146
|
-
.
|
145
|
+
.eager_for_domain_with_content
|
147
146
|
|
148
147
|
if tag
|
149
148
|
query = query.latest_for_consumer_tag(tag)
|
@@ -151,7 +150,7 @@ module PactBroker
|
|
151
150
|
query = query.overall_latest
|
152
151
|
end
|
153
152
|
|
154
|
-
query.sort_by{ | p| p.consumer_name.downcase }.collect(&:to_head_pact)
|
153
|
+
query.all.sort_by{ | p| p.consumer_name.downcase }.collect(&:to_head_pact)
|
155
154
|
end
|
156
155
|
|
157
156
|
def find_for_verification(provider_name, consumer_version_selectors)
|
@@ -165,41 +164,45 @@ module PactBroker
|
|
165
164
|
def find_pact_versions_for_provider provider_name, tag = nil
|
166
165
|
query = scope_for(PactPublication)
|
167
166
|
.select_all_qualified
|
167
|
+
.eager_for_domain_with_content
|
168
168
|
.for_provider_name(provider_name)
|
169
|
-
.eager(:consumer)
|
170
|
-
.eager(:provider)
|
171
169
|
query = query.for_consumer_version_tag(tag) if tag
|
172
|
-
query.collect(&:to_domain).sort
|
170
|
+
query.all.collect(&:to_domain).sort
|
173
171
|
end
|
174
172
|
|
175
173
|
# Returns latest pact version for the consumer_version_number
|
176
174
|
def find_by_consumer_version consumer_name, consumer_version_number
|
177
175
|
scope_for(PactPublication)
|
176
|
+
.eager_for_domain_with_content
|
178
177
|
.for_consumer_name_and_maybe_version_number(consumer_name, consumer_version_number)
|
179
178
|
.remove_overridden_revisions_from_complete_query
|
179
|
+
.all
|
180
180
|
.collect(&:to_domain_with_content)
|
181
181
|
end
|
182
182
|
|
183
183
|
def find_by_version_and_provider version_id, provider_id
|
184
184
|
scope_for(PactPublication)
|
185
|
-
.
|
185
|
+
.eager_for_domain_with_content
|
186
186
|
.where(consumer_version_id: version_id, provider_id: provider_id)
|
187
187
|
.remove_overridden_revisions_from_complete_query
|
188
188
|
.limit(1)
|
189
|
+
.all
|
189
190
|
.collect(&:to_domain_with_content)[0]
|
190
191
|
end
|
191
192
|
|
192
193
|
def find_latest_pacts
|
193
194
|
scope_for(PactPublication)
|
195
|
+
.eager_for_domain_with_content
|
194
196
|
.overall_latest
|
195
|
-
.eager(:consumer)
|
196
197
|
.eager(:provider)
|
198
|
+
.all
|
197
199
|
.collect(&:to_domain)
|
198
200
|
.sort
|
199
201
|
end
|
200
202
|
|
201
203
|
def find_latest_pact(consumer_name, provider_name, tag = nil)
|
202
204
|
query = scope_for(PactPublication)
|
205
|
+
.eager_for_domain_with_content
|
203
206
|
.select_all_qualified
|
204
207
|
.for_consumer_name(consumer_name)
|
205
208
|
.for_provider_name(provider_name)
|
@@ -214,7 +217,7 @@ module PactBroker
|
|
214
217
|
|
215
218
|
# Allows optional consumer_name and provider_name
|
216
219
|
def search_for_latest_pact(consumer_name, provider_name, tag = nil)
|
217
|
-
query = scope_for(PactPublication).select_all_qualified
|
220
|
+
query = scope_for(PactPublication).select_all_qualified.eager_for_domain_with_content
|
218
221
|
query = query.for_consumer_name(consumer_name) if consumer_name
|
219
222
|
query = query.for_provider_name(provider_name) if provider_name
|
220
223
|
|
@@ -233,6 +236,7 @@ module PactBroker
|
|
233
236
|
# rubocop: disable Metrics/CyclomaticComplexity, Metrics/MethodLength
|
234
237
|
def find_pact consumer_name, consumer_version_number, provider_name, pact_version_sha = nil
|
235
238
|
pact_publication_by_consumer_version = scope_for(PactPublication)
|
239
|
+
.eager_for_domain_with_content
|
236
240
|
.select_all_qualified
|
237
241
|
.for_consumer_name_and_maybe_version_number(consumer_name, consumer_version_number)
|
238
242
|
.for_provider_name(provider_name)
|
@@ -240,6 +244,7 @@ module PactBroker
|
|
240
244
|
.limit(1)
|
241
245
|
|
242
246
|
latest_pact_publication_by_sha = scope_for(PactPublication)
|
247
|
+
.eager_for_domain_with_content
|
243
248
|
.select_all_qualified
|
244
249
|
.for_consumer_name(consumer_name)
|
245
250
|
.for_provider_name(provider_name)
|
@@ -249,44 +254,39 @@ module PactBroker
|
|
249
254
|
|
250
255
|
if consumer_version_number && !pact_version_sha
|
251
256
|
pact_publication_by_consumer_version
|
252
|
-
.
|
253
|
-
.collect(&:to_domain_with_content).first
|
257
|
+
.first&.to_domain_with_content
|
254
258
|
elsif pact_version_sha && !consumer_version_number
|
255
259
|
latest_pact_publication_by_sha
|
256
|
-
.
|
257
|
-
.collect(&:to_domain_with_content).first
|
260
|
+
.first&.to_domain_with_content
|
258
261
|
elsif consumer_version_number && pact_version_sha
|
259
|
-
pact_publication = pact_publication_by_consumer_version.
|
260
|
-
pact_publication&.allow_lazy_load
|
262
|
+
pact_publication = pact_publication_by_consumer_version.first
|
261
263
|
if pact_publication && pact_publication.pact_version.sha == pact_version_sha
|
262
|
-
pact_publication.tags
|
263
264
|
pact_publication.to_domain_with_content
|
264
265
|
else
|
265
|
-
latest_pact_publication_by_sha
|
266
|
-
.eager(:tags)
|
267
|
-
.collect(&:to_domain_with_content).first
|
266
|
+
latest_pact_publication_by_sha.first&.to_domain_with_content
|
268
267
|
end
|
269
268
|
else
|
270
269
|
pact_publication_by_consumer_version
|
271
|
-
.eager(:tags)
|
272
270
|
.reverse_order(:consumer_version_order, :revision_number)
|
273
|
-
.
|
271
|
+
.first&.to_domain_with_content
|
274
272
|
end
|
275
273
|
end
|
276
274
|
# rubocop: enable Metrics/CyclomaticComplexity, Metrics/MethodLength
|
277
275
|
|
278
276
|
def find_all_revisions consumer_name, consumer_version_number, provider_name
|
279
277
|
scope_for(PactPublication)
|
278
|
+
.eager_for_domain_with_content
|
280
279
|
.for_provider_name(provider_name)
|
281
280
|
.for_consumer_name_and_maybe_version_number(consumer_name, consumer_version_number)
|
282
281
|
.order_by_consumer_version_order
|
282
|
+
.all
|
283
283
|
.collect(&:to_domain_with_content)
|
284
284
|
end
|
285
285
|
|
286
286
|
def find_previous_pact pact, tag = nil
|
287
287
|
query = scope_for(PactPublication)
|
288
|
+
.eager_for_domain_with_content
|
288
289
|
.remove_overridden_revisions
|
289
|
-
.eager(:tags)
|
290
290
|
.for_consumer_name(pact.consumer.name)
|
291
291
|
.for_provider_name(pact.provider.name)
|
292
292
|
|
@@ -299,17 +299,19 @@ module PactBroker
|
|
299
299
|
query
|
300
300
|
.consumer_version_order_before(pact.consumer_version.order)
|
301
301
|
.latest_by_consumer_version_order
|
302
|
+
.all
|
302
303
|
.collect(&:to_domain_with_content)[0]
|
303
304
|
end
|
304
305
|
|
305
306
|
def find_next_pact pact
|
306
307
|
scope_for(PactPublication)
|
307
|
-
.
|
308
|
+
.eager_for_domain_with_content
|
308
309
|
.for_consumer_name(pact.consumer.name)
|
309
310
|
.for_provider_name(pact.provider.name)
|
310
311
|
.remove_overridden_revisions
|
311
312
|
.consumer_version_order_after(pact.consumer_version.order)
|
312
313
|
.earliest
|
314
|
+
.all_allowing_lazy_load
|
313
315
|
.collect(&:to_domain_with_content)[0]
|
314
316
|
end
|
315
317
|
|
@@ -341,12 +343,13 @@ module PactBroker
|
|
341
343
|
def find_previous_distinct_pact_by_sha pact
|
342
344
|
pact_version = PactVersion.for_pact_domain(pact)
|
343
345
|
scope_for(PactPublication)
|
344
|
-
.
|
346
|
+
.eager_for_domain_with_content
|
345
347
|
.for_consumer_name(pact.consumer.name)
|
346
348
|
.for_provider_name(pact.provider.name)
|
347
349
|
.consumer_version_order_before(pact.consumer_version.order)
|
348
350
|
.exclude(pact_version_id: pact_version.id)
|
349
351
|
.latest_by_consumer_version_order
|
352
|
+
.all_allowing_lazy_load
|
350
353
|
.collect(&:to_domain_with_content)[0]
|
351
354
|
end
|
352
355
|
|
@@ -375,6 +378,7 @@ module PactBroker
|
|
375
378
|
provider_name = options.fetch(:and)
|
376
379
|
|
377
380
|
query = scope_for(PactPublication)
|
381
|
+
.eager_for_domain_with_content
|
378
382
|
.for_consumer_name(consumer_name)
|
379
383
|
.for_provider_name(provider_name)
|
380
384
|
.remove_overridden_revisions
|
@@ -10,6 +10,10 @@ module PactBroker
|
|
10
10
|
all.each{ | row | row.forbid_lazy_load if row.respond_to?(:forbid_lazy_load) }
|
11
11
|
end
|
12
12
|
|
13
|
+
def all_allowing_lazy_load
|
14
|
+
all.each{ | row | row.allow_lazy_load if row.respond_to?(:allow_lazy_load) }
|
15
|
+
end
|
16
|
+
|
13
17
|
def name_like column_name, value
|
14
18
|
if PactBroker.configuration.use_case_sensitive_resource_names
|
15
19
|
if mysql?
|
@@ -74,8 +74,15 @@ module PactBroker
|
|
74
74
|
def record_deployment(pacticipant:, version:, environment_name:)
|
75
75
|
puts "Recording deployment of #{pacticipant} version #{version} to #{environment_name}"
|
76
76
|
version_body = client.get("/pacticipants/#{encode(pacticipant)}/versions/#{encode(version)}").tap { |response| check_for_error(response) }.body
|
77
|
+
|
77
78
|
environment_relation = version_body["_links"]["pb:record-deployment"].find { |relation| relation["name"] == environment_name }
|
78
|
-
|
79
|
+
if environment_relation.nil?
|
80
|
+
available_environments = version_body["_links"]["pb:record-deployment"].collect{ | relation | relation["name"]}.join
|
81
|
+
puts "Environment with name #{environment_name} not found. Available environments: #{available_environments}"
|
82
|
+
else
|
83
|
+
client.post(environment_relation["href"], { replacedPreviousDeployedVersion: true }).tap { |response| check_for_error(response) }
|
84
|
+
end
|
85
|
+
|
79
86
|
separate
|
80
87
|
self
|
81
88
|
end
|
@@ -25,7 +25,6 @@ require "pact_broker/verifications/service"
|
|
25
25
|
require "pact_broker/tags/repository"
|
26
26
|
require "pact_broker/webhooks/repository"
|
27
27
|
require "pact_broker/certificates/certificate"
|
28
|
-
require "pact_broker/matrix/row"
|
29
28
|
require "pact_broker/deployments/environment_service"
|
30
29
|
require "pact_broker/deployments/deployed_version_service"
|
31
30
|
require "pact_broker/deployments/released_version_service"
|
@@ -260,6 +259,8 @@ module PactBroker
|
|
260
259
|
set_created_at_if_set(params[:created_at], :pact_versions, sha: @pact.pact_version_sha) if pact_versions_count_after > pact_versions_count_before
|
261
260
|
set_created_at_if_set(params[:created_at], :latest_pact_publication_ids_for_consumer_versions, consumer_version_id: @consumer_version.id)
|
262
261
|
@pact = PactBroker::Pacts::PactPublication.find(id: @pact.id).to_domain
|
262
|
+
consumer_version.reload
|
263
|
+
consumer_version.pact_publications.each{ | pp | pp.allow_lazy_load if pp.respond_to?(:allow_lazy_load) }
|
263
264
|
self
|
264
265
|
end
|
265
266
|
|
@@ -46,19 +46,22 @@ module PactBroker
|
|
46
46
|
end
|
47
47
|
|
48
48
|
get "/provider/:provider_name/consumer/:consumer_name" do
|
49
|
-
selectors = [
|
50
|
-
|
49
|
+
selectors = [
|
50
|
+
PactBroker::Matrix::UnresolvedSelector.new(pacticipant_name: params[:consumer_name]),
|
51
|
+
PactBroker::Matrix::UnresolvedSelector.new(pacticipant_name: params[:provider_name])
|
52
|
+
]
|
53
|
+
options = { latestby: "cvpv", limit: 100 }
|
51
54
|
lines = matrix_service.find(selectors, options)
|
52
55
|
lines = PactBroker::UI::ViewDomain::MatrixLines.new(lines, base_url: base_url)
|
53
|
-
locals =
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
56
|
+
locals = {
|
57
|
+
lines: lines,
|
58
|
+
consumer_name: params[:consumer_name],
|
59
|
+
provider_name: params[:provider_name],
|
60
|
+
selectors: create_selector_objects(selectors),
|
61
|
+
options: create_options_model(options),
|
62
|
+
badge_url: nil,
|
63
|
+
base_url: base_url
|
64
|
+
}
|
62
65
|
haml :'matrix/show', { locals: locals, layout: :'layouts/main', escape_html: true }
|
63
66
|
end
|
64
67
|
end
|
data/lib/pact_broker/version.rb
CHANGED
data/pact_broker.gemspec
CHANGED
@@ -73,7 +73,7 @@ Gem::Specification.new do |gem|
|
|
73
73
|
gem.add_runtime_dependency "dry-logic", "0.4.2" # Later version cases ArgumentError: wrong number of arguments
|
74
74
|
gem.add_runtime_dependency "table_print", "~> 1.5"
|
75
75
|
gem.add_runtime_dependency "semantic_logger", "~> 4.3"
|
76
|
-
gem.add_runtime_dependency "sanitize", "
|
76
|
+
gem.add_runtime_dependency "sanitize", "6.0"
|
77
77
|
gem.add_runtime_dependency "wisper", "~> 2.0"
|
78
78
|
gem.add_runtime_dependency "anyway_config", "~> 2.1"
|
79
79
|
gem.add_runtime_dependency "request_store", "~> 1.5"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pact_broker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.98.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bethany Skurrie
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2022-03-
|
13
|
+
date: 2022-03-29 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: httparty
|
@@ -346,22 +346,16 @@ dependencies:
|
|
346
346
|
name: sanitize
|
347
347
|
requirement: !ruby/object:Gem::Requirement
|
348
348
|
requirements:
|
349
|
-
- -
|
350
|
-
- !ruby/object:Gem::Version
|
351
|
-
version: 5.2.1
|
352
|
-
- - "~>"
|
349
|
+
- - '='
|
353
350
|
- !ruby/object:Gem::Version
|
354
|
-
version: '
|
351
|
+
version: '6.0'
|
355
352
|
type: :runtime
|
356
353
|
prerelease: false
|
357
354
|
version_requirements: !ruby/object:Gem::Requirement
|
358
355
|
requirements:
|
359
|
-
- -
|
360
|
-
- !ruby/object:Gem::Version
|
361
|
-
version: 5.2.1
|
362
|
-
- - "~>"
|
356
|
+
- - '='
|
363
357
|
- !ruby/object:Gem::Version
|
364
|
-
version: '
|
358
|
+
version: '6.0'
|
365
359
|
- !ruby/object:Gem::Dependency
|
366
360
|
name: wisper
|
367
361
|
requirement: !ruby/object:Gem::Requirement
|
@@ -689,6 +683,7 @@ files:
|
|
689
683
|
- lib/pact_broker/api/decorators/webhooks_decorator.rb
|
690
684
|
- lib/pact_broker/api/middleware/basic_auth.rb
|
691
685
|
- lib/pact_broker/api/middleware/configuration.rb
|
686
|
+
- lib/pact_broker/api/middleware/http_debug_logs.rb
|
692
687
|
- lib/pact_broker/api/pact_broker_urls.rb
|
693
688
|
- lib/pact_broker/api/paths.rb
|
694
689
|
- lib/pact_broker/api/renderers/html_pact_renderer.rb
|
@@ -918,11 +913,9 @@ files:
|
|
918
913
|
- lib/pact_broker/locale/en.yml
|
919
914
|
- lib/pact_broker/logging.rb
|
920
915
|
- lib/pact_broker/logging/default_formatter.rb
|
921
|
-
- lib/pact_broker/matrix/aggregated_row.rb
|
922
916
|
- lib/pact_broker/matrix/can_i_deploy_query_schema.rb
|
923
917
|
- lib/pact_broker/matrix/deployment_status_summary.rb
|
924
918
|
- lib/pact_broker/matrix/every_row.rb
|
925
|
-
- lib/pact_broker/matrix/head_row.rb
|
926
919
|
- lib/pact_broker/matrix/integration.rb
|
927
920
|
- lib/pact_broker/matrix/parse_can_i_deploy_query.rb
|
928
921
|
- lib/pact_broker/matrix/parse_query.rb
|
@@ -934,7 +927,6 @@ files:
|
|
934
927
|
- lib/pact_broker/matrix/reason.rb
|
935
928
|
- lib/pact_broker/matrix/repository.rb
|
936
929
|
- lib/pact_broker/matrix/resolved_selector.rb
|
937
|
-
- lib/pact_broker/matrix/row.rb
|
938
930
|
- lib/pact_broker/matrix/service.rb
|
939
931
|
- lib/pact_broker/matrix/unresolved_selector.rb
|
940
932
|
- lib/pact_broker/messages.rb
|
@@ -963,6 +955,7 @@ files:
|
|
963
955
|
- lib/pact_broker/pacts/pact_publication_selector_dataset_module.rb
|
964
956
|
- lib/pact_broker/pacts/pact_publication_wip_dataset_module.rb
|
965
957
|
- lib/pact_broker/pacts/pact_version.rb
|
958
|
+
- lib/pact_broker/pacts/pact_version_association_loaders.rb
|
966
959
|
- lib/pact_broker/pacts/pacts_for_verification_repository.rb
|
967
960
|
- lib/pact_broker/pacts/parse.rb
|
968
961
|
- lib/pact_broker/pacts/placeholder_pact.rb
|
@@ -1229,7 +1222,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
1229
1222
|
- !ruby/object:Gem::Version
|
1230
1223
|
version: '0'
|
1231
1224
|
requirements: []
|
1232
|
-
rubygems_version: 3.3.
|
1225
|
+
rubygems_version: 3.3.10
|
1233
1226
|
signing_key:
|
1234
1227
|
specification_version: 4
|
1235
1228
|
summary: See description
|
@@ -1,79 +0,0 @@
|
|
1
|
-
require "forwardable"
|
2
|
-
require "pact_broker/verifications/repository"
|
3
|
-
|
4
|
-
# A collection of matrix rows with the same pact publication id
|
5
|
-
# It's basically a normalised view of a denormalised view :(
|
6
|
-
# A pact publication may be the overall latest, and/or the latest for a tag
|
7
|
-
module PactBroker
|
8
|
-
module Matrix
|
9
|
-
class AggregatedRow
|
10
|
-
extend Forwardable
|
11
|
-
|
12
|
-
delegate [:consumer, :consumer_name, :consumer_version, :consumer_version_number, :consumer_version_order, :consumer_version_tags] => :first_row
|
13
|
-
delegate [:provider, :provider_name, :provider_version, :provider_version_number, :provider_version_order, :provider_version_tags] => :first_row
|
14
|
-
delegate [:pact, :pact_version, :pact_revision_number, :webhooks, :latest_triggered_webhooks, :'<=>'] => :first_row
|
15
|
-
delegate [:verification_id, :verification] => :first_row
|
16
|
-
|
17
|
-
def initialize matrix_rows
|
18
|
-
@matrix_rows = matrix_rows
|
19
|
-
@first_row = matrix_rows.first
|
20
|
-
end
|
21
|
-
|
22
|
-
def overall_latest?
|
23
|
-
!!matrix_rows.find{ | row| row.consumer_version_tag_name.nil? }
|
24
|
-
end
|
25
|
-
|
26
|
-
# If this comes back nil, it won't be "cached", but it's a reasonably
|
27
|
-
# quick query, so it's probably ok.
|
28
|
-
# The collection of pacts that belong to the same tag can be considered
|
29
|
-
# a pseudo branch. Find the latest verification for each pseudo branch
|
30
|
-
# and return the most recent. If this pact is the most recent overall,
|
31
|
-
# and there were no verifications found for any of the tags, then
|
32
|
-
# return the most recent verification
|
33
|
-
def latest_verification_for_pseudo_branch
|
34
|
-
@latest_verification ||= begin
|
35
|
-
verification = matrix_rows.collect do | row|
|
36
|
-
row.verification || latest_verification_for_consumer_version_tag(row)
|
37
|
-
end.compact.sort_by(&:id).last
|
38
|
-
|
39
|
-
if !verification && overall_latest?
|
40
|
-
overall_latest_verification
|
41
|
-
else
|
42
|
-
verification
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
def latest_verification_for_pact_version
|
48
|
-
@latest_verificaton_for_pact_version ||= begin
|
49
|
-
matrix_rows.collect(&:verification).compact.sort_by(&:id).last
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
# The list of tag names for which this pact publication is the most recent with that tag
|
54
|
-
# There could, however, be a later consumer version that does't have a pact (perhaps because it was deleted)
|
55
|
-
# that has the same tag.
|
56
|
-
# TODO show a warning when the data is "corrupted" as above.
|
57
|
-
def consumer_head_tag_names
|
58
|
-
matrix_rows.collect(&:consumer_version_tag_name).compact
|
59
|
-
end
|
60
|
-
|
61
|
-
private
|
62
|
-
|
63
|
-
attr_reader :matrix_rows, :first_row
|
64
|
-
|
65
|
-
def latest_verification_for_consumer_version_tag row
|
66
|
-
row.latest_verification_for_consumer_version_tag if row.consumer_version_tag_name
|
67
|
-
end
|
68
|
-
|
69
|
-
def overall_latest_verification
|
70
|
-
# not eager loaded because it shouldn't be called that often
|
71
|
-
first_row.latest_verification_for_consumer_and_provider
|
72
|
-
end
|
73
|
-
|
74
|
-
def consumer_version_tag_names
|
75
|
-
matrix_rows.collect(&:consumer_version_tag_name)
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
@@ -1,80 +0,0 @@
|
|
1
|
-
require "pact_broker/matrix/row"
|
2
|
-
require "pact_broker/webhooks/webhook"
|
3
|
-
|
4
|
-
module PactBroker
|
5
|
-
module Matrix
|
6
|
-
# A row for each of the overall latest pacts, and a row for each of the latest tagged pacts
|
7
|
-
# Rows with a nil consumer_tag_name are the overall latest
|
8
|
-
class HeadRow < Row
|
9
|
-
set_dataset(:head_matrix)
|
10
|
-
|
11
|
-
# one_to_one :latest_verification_for_consumer_version_tag,
|
12
|
-
# :class => "PactBroker::Verifications::LatestVerificationForConsumerVersionTag",
|
13
|
-
# primary_key: [:provider_id, :consumer_id, :consumer_version_tag_name], key: [:provider_id, :consumer_id, :consumer_version_tag_name]
|
14
|
-
|
15
|
-
# Loading the latest_verification_for_consumer_version_tag objects this way is quicker than
|
16
|
-
# doing it using an inbult relation with primary_key/key, if we are loading the relation for
|
17
|
-
# the entire HeadRow table
|
18
|
-
# Using the inbuilt relation puts constraints on the columns that are not necessary and slow
|
19
|
-
# the query down.
|
20
|
-
# This relation relies on consumer_version_tags already being loaded
|
21
|
-
one_to_one :latest_verification_for_consumer_version_tag, :class => "PactBroker::Verifications::LatestVerificationForConsumerVersionTag", primary_keys: [], key: [], :eager_loader=>(proc do |eo_opts|
|
22
|
-
# create an index of provider_id/consumer_id/consumer_version_tag_name => row
|
23
|
-
tag_to_row = eo_opts[:rows].each_with_object({}) { | row, map | map[[row.provider_id, row.consumer_id, row.consumer_version_tag_name]] = row }
|
24
|
-
# Initialise the association with nil - not sure why?
|
25
|
-
eo_opts[:rows].each{|row| row.associations[:latest_verification_for_consumer_version_tag] = nil}
|
26
|
-
|
27
|
-
# Need the all then the each to ensure the eager loading works
|
28
|
-
PactBroker::Verifications::LatestVerificationForConsumerVersionTag.each do | verification |
|
29
|
-
key = [verification.provider_id, verification.consumer_id, verification.consumer_version_tag_name]
|
30
|
-
if tag_to_row[key]
|
31
|
-
tag_to_row[key].associations[:latest_verification_for_consumer_version_tag] = verification
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end)
|
35
|
-
|
36
|
-
# When viewing the index, every webhook in the database will match at least one of the rows, so
|
37
|
-
# it makes sense to load the entire table and match each webhook to the appropriate row.
|
38
|
-
# This will only work when using eager loading. The keys are just blanked out to avoid errors.
|
39
|
-
# I don't understand how they work at all.
|
40
|
-
# It would be nice to do this declaratively.
|
41
|
-
many_to_many :webhooks, class: :'PactBroker::Webhooks::Webhook', :left_key => [], left_primary_key: [], :eager_loader=>(proc do |eo_opts|
|
42
|
-
eo_opts[:rows].each do |row|
|
43
|
-
row.associations[:webhooks] = []
|
44
|
-
end
|
45
|
-
|
46
|
-
PactBroker::Webhooks::Webhook.each do | webhook |
|
47
|
-
eo_opts[:rows].each do | row |
|
48
|
-
if webhook.is_for?(row)
|
49
|
-
row.associations[:webhooks] << webhook
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end)
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
# Table: head_matrix
|
59
|
-
# Columns:
|
60
|
-
# consumer_id | integer |
|
61
|
-
# consumer_name | text |
|
62
|
-
# consumer_version_id | integer |
|
63
|
-
# consumer_version_number | text |
|
64
|
-
# consumer_version_order | integer |
|
65
|
-
# pact_publication_id | integer |
|
66
|
-
# pact_version_id | integer |
|
67
|
-
# pact_version_sha | text |
|
68
|
-
# pact_revision_number | integer |
|
69
|
-
# pact_created_at | timestamp without time zone |
|
70
|
-
# provider_id | integer |
|
71
|
-
# provider_name | text |
|
72
|
-
# provider_version_id | integer |
|
73
|
-
# provider_version_number | text |
|
74
|
-
# provider_version_order | integer |
|
75
|
-
# verification_id | integer |
|
76
|
-
# success | boolean |
|
77
|
-
# verification_number | integer |
|
78
|
-
# verification_executed_at | timestamp without time zone |
|
79
|
-
# verification_build_url | text |
|
80
|
-
# consumer_version_tag_name | text |
|