pact_broker 2.96.0 → 2.99.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.
Files changed (52) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +43 -0
  3. data/Gemfile +1 -0
  4. data/docs/CONFIGURATION.md +131 -67
  5. data/lib/db.rb +1 -7
  6. data/lib/pact_broker/api/middleware/http_debug_logs.rb +42 -0
  7. data/lib/pact_broker/api/resources/base_resource.rb +4 -0
  8. data/lib/pact_broker/api/resources/latest_pacts.rb +1 -1
  9. data/lib/pact_broker/api/resources/pact.rb +0 -8
  10. data/lib/pact_broker/api/resources/pact_content_diff.rb +7 -2
  11. data/lib/pact_broker/api/resources/pact_versions.rb +1 -5
  12. data/lib/pact_broker/api/resources/pact_versions_for_branch.rb +1 -5
  13. data/lib/pact_broker/api/resources/provider_pacts.rb +1 -1
  14. data/lib/pact_broker/api/resources/tagged_pact_versions.rb +1 -5
  15. data/lib/pact_broker/api/resources/verification.rb +0 -4
  16. data/lib/pact_broker/api/resources/verifications.rb +0 -4
  17. data/lib/pact_broker/api/resources/version.rb +8 -0
  18. data/lib/pact_broker/app.rb +3 -7
  19. data/lib/pact_broker/config/runtime_configuration.rb +24 -5
  20. data/lib/pact_broker/config/runtime_configuration_coercion_methods.rb +11 -0
  21. data/lib/pact_broker/config/runtime_configuration_database_methods.rb +2 -2
  22. data/lib/pact_broker/config/runtime_configuration_logging_methods.rb +7 -2
  23. data/lib/pact_broker/configuration.rb +2 -0
  24. data/lib/pact_broker/db/models.rb +2 -2
  25. data/lib/pact_broker/index/service.rb +1 -2
  26. data/lib/pact_broker/integrations/integration.rb +21 -6
  27. data/lib/pact_broker/integrations/service.rb +1 -1
  28. data/lib/pact_broker/matrix/every_row.rb +19 -1
  29. data/lib/pact_broker/matrix/integration.rb +5 -5
  30. data/lib/pact_broker/matrix/quick_row.rb +36 -3
  31. data/lib/pact_broker/matrix/repository.rb +4 -3
  32. data/lib/pact_broker/matrix/service.rb +0 -1
  33. data/lib/pact_broker/metrics/service.rb +2 -2
  34. data/lib/pact_broker/pacts/create_formatted_diff.rb +1 -0
  35. data/lib/pact_broker/pacts/eager_loaders.rb +4 -1
  36. data/lib/pact_broker/pacts/pact_publication.rb +9 -6
  37. data/lib/pact_broker/pacts/pact_publication_dataset_module.rb +25 -0
  38. data/lib/pact_broker/pacts/pact_publication_wip_dataset_module.rb +0 -15
  39. data/lib/pact_broker/pacts/pact_version.rb +24 -28
  40. data/lib/pact_broker/pacts/pact_version_association_loaders.rb +36 -0
  41. data/lib/pact_broker/pacts/pacts_for_verification_repository.rb +9 -13
  42. data/lib/pact_broker/pacts/repository.rb +29 -27
  43. data/lib/pact_broker/test/http_test_data_builder.rb +11 -2
  44. data/lib/pact_broker/test/test_data_builder.rb +2 -1
  45. data/lib/pact_broker/ui/controllers/matrix.rb +14 -11
  46. data/lib/pact_broker/ui/views/groups/show.html.erb +2 -2
  47. data/lib/pact_broker/version.rb +1 -1
  48. data/pact_broker.gemspec +1 -1
  49. metadata +9 -16
  50. data/lib/pact_broker/matrix/aggregated_row.rb +0 -79
  51. data/lib/pact_broker/matrix/head_row.rb +0 -80
  52. data/lib/pact_broker/matrix/row.rb +0 -287
@@ -20,12 +20,11 @@ module PactBroker
20
20
  delegate [:consumer_version_number, :name, :provider_name, :consumer_name] => :cached_domain_for_delegation
21
21
 
22
22
  set_primary_key :id
23
- associate(:many_to_one, :provider, :class => "PactBroker::Domain::Pacticipant", :key => :provider_id, :primary_key => :id, forbid_lazy_load: false)
24
- associate(:many_to_one, :consumer, :class => "PactBroker::Domain::Pacticipant", :key => :consumer_id, :primary_key => :id, forbid_lazy_load: false)
25
- associate(:many_to_one, :consumer_version, :class => "PactBroker::Domain::Version", :key => :consumer_version_id, :primary_key => :id, forbid_lazy_load: false)
26
- associate(:many_to_one, :pact_version, class: "PactBroker::Pacts::PactVersion", :key => :pact_version_id, :primary_key => :id, forbid_lazy_load: false)
27
- associate(:many_to_one, :integration, class: "PactBroker::Integrations::Integration", key: [:consumer_id, :provider_id], primary_key: [:consumer_id, :provider_id], forbid_lazy_load: false)
28
-
23
+ associate(:many_to_one, :provider, :class => "PactBroker::Domain::Pacticipant", :key => :provider_id, :primary_key => :id)
24
+ associate(:many_to_one, :consumer, :class => "PactBroker::Domain::Pacticipant", :key => :consumer_id, :primary_key => :id)
25
+ associate(:many_to_one, :consumer_version, :class => "PactBroker::Domain::Version", :key => :consumer_version_id, :primary_key => :id)
26
+ associate(:many_to_one, :pact_version, class: "PactBroker::Pacts::PactVersion", :key => :pact_version_id, :primary_key => :id)
27
+ associate(:many_to_one, :integration, class: "PactBroker::Integrations::Integration", key: [:consumer_id, :provider_id], primary_key: [:consumer_id, :provider_id], read_only: true, forbid_lazy_load: false)
29
28
  # TODO rename to consumer_version_tags
30
29
  associate(:one_to_many, :tags, :class => "PactBroker::Domain::Tag", :key => :version_id, :primary_key => :consumer_version_id)
31
30
 
@@ -57,6 +56,10 @@ module PactBroker
57
56
  include PactPublicationDatasetModule
58
57
  include PactPublicationCleanSelectorDatasetModule
59
58
  include PactPublicationWipDatasetModule
59
+
60
+ def eager_for_domain_with_content
61
+ eager(:tags, :consumer, :provider, :consumer_version, :pact_version)
62
+ end
60
63
  end
61
64
 
62
65
  def self.subtract(a, *b)
@@ -111,7 +111,32 @@ module PactBroker
111
111
  .limit(1)
112
112
  end
113
113
 
114
+ # Return the pacts (if they exist) for the branch heads.
115
+ # This uses the new logic of finding the branch head and returning any associated pacts,
116
+ # rather than the old logic of returning the pact for the latest version
117
+ # on the branch that had a pact.
118
+ def for_branch_heads(branch_name)
119
+ branch_head_join = {
120
+ Sequel[:pact_publications][:consumer_version_id] => Sequel[:branch_heads][:version_id],
121
+ }
122
+
123
+ base_query = self
124
+ if no_columns_selected?
125
+ base_query = base_query.select_all_qualified.select_append(Sequel[:branch_heads][:branch_name].as(:branch_name))
126
+ end
127
+
128
+ base_query
129
+ .join(:branch_heads, branch_head_join) do
130
+ name_like(Sequel[:branch_heads][:branch_name], branch_name)
131
+ end
132
+ .remove_overridden_revisions_from_complete_query
133
+ end
134
+
114
135
  def latest_for_consumer_branch(branch_name)
136
+ for_branch_heads(branch_name)
137
+ end
138
+
139
+ def old_latest_for_consumer_branch(branch_name)
115
140
  branch_versions_join = {
116
141
  Sequel[:pact_publications][:consumer_version_id] => Sequel[:branch_versions][:version_id]
117
142
  }
@@ -47,21 +47,6 @@ module PactBroker
47
47
  end
48
48
 
49
49
  def successfully_verified_by_provider_another_tag_before_this_tag_first_created(provider_id, provider_tag)
50
- return new_successfully_verified_by_provider_another_tag_before_this_tag_first_created(provider_id, provider_tag) if PactBroker.feature_enabled?(:new_wip_calculation)
51
-
52
- first_tag_with_name = PactBroker::Domain::Tag.where(pacticipant_id: provider_id, name: provider_tag).order(:created_at).first
53
- from_self(alias: :pp)
54
- .select(Sequel[:pp].*)
55
- .where(Sequel[:pp][:provider_id] => provider_id)
56
- .join_successful_non_wip_verifications_for_provider_id(provider_id)
57
- .join_provider_version_tags do
58
- Sequel.lit("provider_tags.name != ?", provider_tag)
59
- end
60
- .verified_before_creation_date_of(first_tag_with_name)
61
- .distinct
62
- end
63
-
64
- def new_successfully_verified_by_provider_another_tag_before_this_tag_first_created(provider_id, provider_tag)
65
50
  first_tag_with_name = PactBroker::Domain::Tag.where(pacticipant_id: provider_id, name: provider_tag).order(:created_at).first
66
51
 
67
52
  pact_version_provider_tag_verifications_join = {
@@ -1,39 +1,32 @@
1
1
  require "sequel"
2
2
  require "pact_broker/repositories/helpers"
3
- require "pact_broker/verifications/latest_verification_id_for_pact_version_and_provider_version"
4
3
  require "pact_broker/pacts/content"
4
+ require "pact_broker/pacts/pact_version_association_loaders"
5
5
 
6
6
  module PactBroker
7
7
  module Pacts
8
8
  class PactVersion < Sequel::Model(:pact_versions)
9
+ include PactVersionAssociationLoaders
10
+
9
11
  plugin :timestamps
10
12
  plugin :upsert, identifying_columns: [:consumer_id, :provider_id, :sha]
11
13
 
12
- one_to_many :pact_publications, reciprocal: :pact_version
13
- one_to_many :verifications, reciprocal: :verification, order: :id, class: "PactBroker::Domain::Verification"
14
- associate(:many_to_one, :provider, class: "PactBroker::Domain::Pacticipant", key: :provider_id, primary_key: :id)
15
- associate(:many_to_one, :consumer, class: "PactBroker::Domain::Pacticipant", key: :consumer_id, primary_key: :id)
16
- associate(:many_to_many, :consumer_versions, class: "PactBroker::Domain::Version", join_table: :pact_publications, left_key: :pact_version_id, right_key: :consumer_version_id, order: :order)
14
+ one_to_many(:pact_publications, reciprocal: :pact_version)
15
+ one_to_many(:verifications, reciprocal: :verification, order: :id, class: "PactBroker::Domain::Verification")
16
+ many_to_one(:provider, class: "PactBroker::Domain::Pacticipant", key: :provider_id, primary_key: :id)
17
+ many_to_one(:consumer, class: "PactBroker::Domain::Pacticipant", key: :consumer_id, primary_key: :id)
18
+ many_to_many(:consumer_versions,
19
+ class: "PactBroker::Domain::Version",
20
+ join_table: :pact_publications,
21
+ left_key: :pact_version_id,
22
+ right_key: :consumer_version_id,
23
+ order: :order
24
+ )
17
25
 
18
26
  one_to_one(:latest_main_branch_verification,
19
27
  class: "PactBroker::Domain::Verification",
20
28
  read_only: true,
21
- dataset: lambda {
22
- providers_join = {
23
- Sequel[:providers][:id] => Sequel[:latest_verification_id_for_pact_version_and_provider_version][:provider_id]
24
- }
25
-
26
- branch_versions_join = {
27
- Sequel[:latest_verification_id_for_pact_version_and_provider_version][:provider_version_id] => Sequel[:branch_versions][:version_id],
28
- Sequel[:providers][:main_branch] => Sequel[:branch_versions][:branch_name]
29
- }
30
- max_verification_id_for_pact_version = PactBroker::Verifications::LatestVerificationIdForPactVersionAndProviderVersion
31
- .join(:pacticipants, providers_join, { table_alias: :providers })
32
- .join(:branch_versions, branch_versions_join)
33
- .select(Sequel.function(:max, :verification_id))
34
- .where(pact_version_id: id)
35
- PactBroker::Domain::Verification.where(id: max_verification_id_for_pact_version)
36
- },
29
+ dataset: LATEST_MAIN_BRANCH_VERIFICATION,
37
30
  key: :pact_version_id,
38
31
  primary_key: :id,
39
32
  eager_block: lambda { | ds | ds.from_provider_main_branch.latest_by_pact_version }
@@ -42,15 +35,18 @@ module PactBroker
42
35
  one_to_one(:latest_verification,
43
36
  class: "PactBroker::Domain::Verification",
44
37
  read_only: true,
45
- dataset: lambda { PactBroker::Domain::Verification.where(id: PactBroker::Verifications::LatestVerificationIdForPactVersionAndProviderVersion.select(Sequel.function(:max, :verification_id)).where(pact_version_id: id)) },
38
+ dataset: LATEST_VERIFICATION_DATASET,
46
39
  key: :pact_version_id, primary_key: :id,
47
40
  eager_block: lambda { | ds | ds.latest_by_pact_version }
48
41
  )
49
42
 
50
43
  # do not eager load this - it won't work because of the limit(1)
51
- one_through_one(:latest_consumer_version, class: "PactBroker::Domain::Version", join_table: :pact_publications, left_key: :pact_version_id, right_key: :consumer_version_id) do | ds |
52
- ds.unlimited.order(Sequel.desc(:order)).limit(1)
53
- end
44
+ one_through_one(:latest_consumer_version,
45
+ class: "PactBroker::Domain::Version",
46
+ join_table: :pact_publications,
47
+ left_key: :pact_version_id,
48
+ right_key: :consumer_version_id, &LATEST_CONSUMER_VERSION_LAZY_LOADER
49
+ )
54
50
 
55
51
  dataset_module do
56
52
  include PactBroker::Repositories::Helpers
@@ -89,11 +85,11 @@ module PactBroker
89
85
  end
90
86
 
91
87
  def provider_name
92
- pact_publications.last.provider.name
88
+ provider.name
93
89
  end
94
90
 
95
91
  def consumer_name
96
- pact_publications.last.consumer.name
92
+ consumer.name
97
93
  end
98
94
 
99
95
  def latest_pact_publication
@@ -0,0 +1,36 @@
1
+ require "pact_broker/verifications/latest_verification_id_for_pact_version_and_provider_version"
2
+
3
+ module PactBroker
4
+ module Pacts
5
+ module PactVersionAssociationLoaders
6
+
7
+ LATEST_MAIN_BRANCH_VERIFICATION = lambda {
8
+ providers_join = {
9
+ Sequel[:providers][:id] => Sequel[:latest_verification_id_for_pact_version_and_provider_version][:provider_id]
10
+ }
11
+
12
+ branch_versions_join = {
13
+ Sequel[:latest_verification_id_for_pact_version_and_provider_version][:provider_version_id] => Sequel[:branch_versions][:version_id],
14
+ Sequel[:providers][:main_branch] => Sequel[:branch_versions][:branch_name]
15
+ }
16
+ max_verification_id_for_pact_version = PactBroker::Verifications::LatestVerificationIdForPactVersionAndProviderVersion
17
+ .join(:pacticipants, providers_join, { table_alias: :providers })
18
+ .join(:branch_versions, branch_versions_join)
19
+ .select(Sequel.function(:max, :verification_id))
20
+ .where(pact_version_id: id)
21
+ PactBroker::Domain::Verification.where(id: max_verification_id_for_pact_version)
22
+ }
23
+
24
+ LATEST_VERIFICATION_DATASET = lambda {
25
+ PactBroker::Domain::Verification
26
+ .where(
27
+ id: PactBroker::Verifications::LatestVerificationIdForPactVersionAndProviderVersion.select(
28
+ Sequel.function(:max, :verification_id)
29
+ ).where(pact_version_id: id)
30
+ )
31
+ }
32
+
33
+ LATEST_CONSUMER_VERSION_LAZY_LOADER = lambda { | ds | ds.unlimited.order(Sequel.desc(:order)).limit(1) }
34
+ end
35
+ end
36
+ end
@@ -23,7 +23,7 @@ module PactBroker
23
23
  :provider,
24
24
  :consumer,
25
25
  :consumer_version,
26
- pact_version: :latest_verification
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
- .collect do | latest_tagged_pact_publication |
169
- pact_publication = unscoped(PactPublication).find(id: latest_tagged_pact_publication.id)
170
- SelectedPact.new(
171
- pact_publication.to_domain,
172
- Selectors.new(selector.resolve_for_fallback(pact_publication.consumer_version))
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(:provider)
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
- .eager(:consumer)
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
- .eager(:tags)
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,46 +254,39 @@ module PactBroker
249
254
 
250
255
  if consumer_version_number && !pact_version_sha
251
256
  pact_publication_by_consumer_version
252
- .eager(:tags)
253
- .all_allowing_lazy_load
254
- .collect(&:to_domain_with_content).first
257
+ .first&.to_domain_with_content
255
258
  elsif pact_version_sha && !consumer_version_number
256
259
  latest_pact_publication_by_sha
257
- .eager(:tags)
258
- .collect(&:to_domain_with_content).first
260
+ .first&.to_domain_with_content
259
261
  elsif consumer_version_number && pact_version_sha
260
- pact_publication = pact_publication_by_consumer_version.all_allowing_lazy_load.first
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
- .all_allowing_lazy_load
268
- .collect(&:to_domain_with_content).first
266
+ latest_pact_publication_by_sha.first&.to_domain_with_content
269
267
  end
270
268
  else
271
269
  pact_publication_by_consumer_version
272
- .eager(:tags)
273
270
  .reverse_order(:consumer_version_order, :revision_number)
274
- .all_allowing_lazy_load
275
- .collect(&:to_domain_with_content).first
271
+ .first&.to_domain_with_content
276
272
  end
277
273
  end
278
274
  # rubocop: enable Metrics/CyclomaticComplexity, Metrics/MethodLength
279
275
 
280
276
  def find_all_revisions consumer_name, consumer_version_number, provider_name
281
277
  scope_for(PactPublication)
278
+ .eager_for_domain_with_content
282
279
  .for_provider_name(provider_name)
283
280
  .for_consumer_name_and_maybe_version_number(consumer_name, consumer_version_number)
284
281
  .order_by_consumer_version_order
282
+ .all
285
283
  .collect(&:to_domain_with_content)
286
284
  end
287
285
 
288
286
  def find_previous_pact pact, tag = nil
289
287
  query = scope_for(PactPublication)
288
+ .eager_for_domain_with_content
290
289
  .remove_overridden_revisions
291
- .eager(:tags)
292
290
  .for_consumer_name(pact.consumer.name)
293
291
  .for_provider_name(pact.provider.name)
294
292
 
@@ -301,17 +299,19 @@ module PactBroker
301
299
  query
302
300
  .consumer_version_order_before(pact.consumer_version.order)
303
301
  .latest_by_consumer_version_order
302
+ .all
304
303
  .collect(&:to_domain_with_content)[0]
305
304
  end
306
305
 
307
306
  def find_next_pact pact
308
307
  scope_for(PactPublication)
309
- .eager(:tags)
308
+ .eager_for_domain_with_content
310
309
  .for_consumer_name(pact.consumer.name)
311
310
  .for_provider_name(pact.provider.name)
312
311
  .remove_overridden_revisions
313
312
  .consumer_version_order_after(pact.consumer_version.order)
314
313
  .earliest
314
+ .all_allowing_lazy_load
315
315
  .collect(&:to_domain_with_content)[0]
316
316
  end
317
317
 
@@ -343,12 +343,13 @@ module PactBroker
343
343
  def find_previous_distinct_pact_by_sha pact
344
344
  pact_version = PactVersion.for_pact_domain(pact)
345
345
  scope_for(PactPublication)
346
- .eager(:tags)
346
+ .eager_for_domain_with_content
347
347
  .for_consumer_name(pact.consumer.name)
348
348
  .for_provider_name(pact.provider.name)
349
349
  .consumer_version_order_before(pact.consumer_version.order)
350
350
  .exclude(pact_version_id: pact_version.id)
351
351
  .latest_by_consumer_version_order
352
+ .all_allowing_lazy_load
352
353
  .collect(&:to_domain_with_content)[0]
353
354
  end
354
355
 
@@ -377,6 +378,7 @@ module PactBroker
377
378
  provider_name = options.fetch(:and)
378
379
 
379
380
  query = scope_for(PactPublication)
381
+ .eager_for_domain_with_content
380
382
  .for_consumer_name(consumer_name)
381
383
  .for_provider_name(provider_name)
382
384
  .remove_overridden_revisions
@@ -57,6 +57,8 @@ module PactBroker
57
57
 
58
58
  def create_version(pacticipant:, version:, branch: nil)
59
59
  if branch
60
+ puts "Adding #{pacticipant} version #{version} to branch #{branch}"
61
+ puts ""
60
62
  client.put("pacticipants/#{encode(pacticipant)}/branches/#{encode(branch)}/versions/#{encode(version)}", {}).tap { |response| check_for_error(response) }
61
63
  else
62
64
  client.put("pacticipants/#{encode(pacticipant)}/versions/#{encode(version)}").tap { |response| check_for_error(response) }
@@ -74,8 +76,15 @@ module PactBroker
74
76
  def record_deployment(pacticipant:, version:, environment_name:)
75
77
  puts "Recording deployment of #{pacticipant} version #{version} to #{environment_name}"
76
78
  version_body = client.get("/pacticipants/#{encode(pacticipant)}/versions/#{encode(version)}").tap { |response| check_for_error(response) }.body
79
+
77
80
  environment_relation = version_body["_links"]["pb:record-deployment"].find { |relation| relation["name"] == environment_name }
78
- client.post(environment_relation["href"], { replacedPreviousDeployedVersion: true }).tap { |response| check_for_error(response) }
81
+ if environment_relation.nil?
82
+ available_environments = version_body["_links"]["pb:record-deployment"].collect{ | relation | relation["name"]}.join
83
+ puts "Environment with name #{environment_name} not found. Available environments: #{available_environments}"
84
+ else
85
+ client.post(environment_relation["href"]).tap { |response| check_for_error(response) }
86
+ end
87
+
79
88
  separate
80
89
  self
81
90
  end
@@ -84,7 +93,7 @@ module PactBroker
84
93
  puts "Recording release of #{pacticipant} version #{version} to #{environment_name}"
85
94
  version_body = client.get("/pacticipants/#{encode(pacticipant)}/versions/#{encode(version)}").tap { |response| check_for_error(response) }.body
86
95
  environment_relation = version_body["_links"]["pb:record-release"].find { |relation| relation["name"] == environment_name }
87
- client.post(environment_relation["href"], { replacedPreviousDeployedVersion: true }).tap { |response| check_for_error(response) }
96
+ client.post(environment_relation["href"]).tap { |response| check_for_error(response) }
88
97
  separate
89
98
  self
90
99
  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 = [ PactBroker::Matrix::UnresolvedSelector.new(pacticipant_name: params[:consumer_name]), PactBroker::Matrix::UnresolvedSelector.new(pacticipant_name: params[:provider_name]) ]
50
- options = {latestby: "cvpv", limit: 100}
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
- lines: lines,
55
- consumer_name: params[:consumer_name],
56
- provider_name: params[:provider_name],
57
- selectors: create_selector_objects(selectors),
58
- options: create_options_model(options),
59
- badge_url: nil,
60
- base_url: base_url
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
@@ -6,7 +6,7 @@
6
6
  <html lang="en">
7
7
  <head>
8
8
  <meta charset="utf-8">
9
- <title><%= pacticipant_name %></title>
9
+ <title><%= escape_html(pacticipant_name) %></title>
10
10
  <link rel='shortcut icon' href='<%= base_url %>/favicon.ico' type='image/x-icon'/>
11
11
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
12
12
  <meta name="description" content="">
@@ -69,7 +69,7 @@ svg{
69
69
  Main branch:
70
70
  </div>
71
71
  <div class="col col-md-6">
72
- <%= pacticipant.main_branch %>
72
+ <%= escape_html(pacticipant.main_branch) %>
73
73
  </div>
74
74
  </div>
75
75
  <div class="row">
@@ -1,3 +1,3 @@
1
1
  module PactBroker
2
- VERSION = "2.96.0"
2
+ VERSION = "2.99.0"
3
3
  end
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", ">= 5.2.1", "~> 5.2"
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"