pact_broker 2.109.1 → 2.111.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 +30 -0
- data/docs/developer/design_pattern_for_eager_loading_collections.md +23 -0
- data/docs/developer/matrix.md +95 -0
- data/docs/developer/rack.md +11 -0
- data/lib/pact_broker/api/contracts/consumer_version_selector_contract.rb +1 -1
- data/lib/pact_broker/api/decorators/base_decorator.rb +10 -1
- data/lib/pact_broker/api/decorators/label_decorator.rb +19 -13
- data/lib/pact_broker/api/decorators/labels_decorator.rb +23 -0
- data/lib/pact_broker/api/decorators/pacticipant_decorator.rb +1 -1
- data/lib/pact_broker/api/decorators/version_decorator.rb +14 -0
- data/lib/pact_broker/api/paths.rb +2 -1
- data/lib/pact_broker/api/resources/branch_versions.rb +1 -1
- data/lib/pact_broker/api/resources/can_i_merge_badge.rb +36 -0
- data/lib/pact_broker/api/resources/labels.rb +37 -0
- data/lib/pact_broker/api/resources/provider_pacts_for_verification.rb +5 -0
- data/lib/pact_broker/api/resources/versions.rb +1 -1
- data/lib/pact_broker/api.rb +4 -0
- data/lib/pact_broker/app.rb +24 -9
- data/lib/pact_broker/badges/service.rb +18 -0
- data/lib/pact_broker/contracts/service.rb +6 -2
- data/lib/pact_broker/db/advisory_lock.rb +58 -0
- data/lib/pact_broker/domain/version.rb +3 -2
- data/lib/pact_broker/integrations/integration.rb +11 -1
- data/lib/pact_broker/integrations/repository.rb +46 -7
- data/lib/pact_broker/integrations/service.rb +2 -0
- data/lib/pact_broker/labels/repository.rb +5 -0
- data/lib/pact_broker/labels/service.rb +4 -0
- data/lib/pact_broker/matrix/service.rb +26 -0
- data/lib/pact_broker/pacticipants/repository.rb +10 -1
- data/lib/pact_broker/pacts/pact_publication_dataset_module.rb +56 -3
- data/lib/pact_broker/pacts/pact_publication_selector_dataset_module.rb +1 -0
- data/lib/pact_broker/pacts/pacts_for_verification_repository.rb +4 -4
- data/lib/pact_broker/pacts/repository.rb +2 -2
- data/lib/pact_broker/pacts/selector.rb +8 -2
- data/lib/pact_broker/tasks/clean_task.rb +68 -26
- data/lib/pact_broker/test/test_data_builder.rb +17 -5
- data/lib/pact_broker/version.rb +1 -1
- data/lib/pact_broker/versions/repository.rb +2 -20
- data/lib/pact_broker/versions/service.rb +2 -6
- data/lib/pact_broker/webhooks/execution.rb +8 -8
- data/lib/sequel/extensions/pg_advisory_lock.rb +101 -0
- data/pact_broker.gemspec +1 -1
- metadata +13 -5
@@ -0,0 +1,101 @@
|
|
1
|
+
# Copied with thanks from https://github.com/yuryroot/sequel-pg_advisory_lock/blob/d7509aa/lib/sequel/extensions/pg_advisory_lock.rb
|
2
|
+
# The reason this is copy/pasted and modified is that I wanted to allow exact duplicate
|
3
|
+
# locks to be registered because different threads running the same code
|
4
|
+
# should not cause a Sequel::Error to be raised.
|
5
|
+
# Also, I wanted it to use Concurrent::Hash for multi-threaded environments.
|
6
|
+
|
7
|
+
require "sequel"
|
8
|
+
require "zlib"
|
9
|
+
require "concurrent/hash"
|
10
|
+
|
11
|
+
module Sequel
|
12
|
+
module Postgres
|
13
|
+
module PgAdvisoryLock
|
14
|
+
|
15
|
+
SESSION_LEVEL_LOCKS = [
|
16
|
+
:pg_advisory_lock,
|
17
|
+
:pg_try_advisory_lock
|
18
|
+
].freeze
|
19
|
+
|
20
|
+
TRANSACTION_LEVEL_LOCKS = [
|
21
|
+
:pg_advisory_xact_lock,
|
22
|
+
:pg_try_advisory_xact_lock
|
23
|
+
].freeze
|
24
|
+
|
25
|
+
LOCK_FUNCTIONS = (SESSION_LEVEL_LOCKS + TRANSACTION_LEVEL_LOCKS).freeze
|
26
|
+
|
27
|
+
DEFAULT_LOCK_FUNCTION = :pg_advisory_lock
|
28
|
+
UNLOCK_FUNCTION = :pg_advisory_unlock
|
29
|
+
|
30
|
+
class LockAlreadyRegistered < Sequel::Error; end
|
31
|
+
|
32
|
+
def registered_advisory_locks
|
33
|
+
@registered_advisory_locks ||= Concurrent::Hash.new
|
34
|
+
end
|
35
|
+
|
36
|
+
def with_advisory_lock(name, id = nil)
|
37
|
+
options = registered_advisory_locks.fetch(name.to_sym)
|
38
|
+
|
39
|
+
lock_key = options.fetch(:key)
|
40
|
+
function_params = [lock_key, id].compact
|
41
|
+
|
42
|
+
lock_function = options.fetch(:lock_function)
|
43
|
+
transaction_level_lock = TRANSACTION_LEVEL_LOCKS.include?(lock_function)
|
44
|
+
|
45
|
+
if transaction_level_lock
|
46
|
+
# TODO: It's allowed to specify additional options (in particular, :server)
|
47
|
+
# while opening database transaction.
|
48
|
+
# That's why this check must be smarter.
|
49
|
+
unless in_transaction?
|
50
|
+
raise Error, "Transaction must be manually opened before using transaction level lock '#{lock_function}'"
|
51
|
+
end
|
52
|
+
|
53
|
+
if get(Sequel.function(lock_function, *function_params))
|
54
|
+
yield
|
55
|
+
end
|
56
|
+
else
|
57
|
+
synchronize do
|
58
|
+
if get(Sequel.function(lock_function, *function_params))
|
59
|
+
begin
|
60
|
+
result = yield
|
61
|
+
ensure
|
62
|
+
get(Sequel.function(UNLOCK_FUNCTION, *function_params))
|
63
|
+
result
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
# Beth: not sure how much extra value this registration provides.
|
71
|
+
# It turns the name into a number, and makes sure the name/number is unique,
|
72
|
+
# and that you don't try and use a different lock function with the same name.
|
73
|
+
def register_advisory_lock(name, lock_function = DEFAULT_LOCK_FUNCTION)
|
74
|
+
name = name.to_sym
|
75
|
+
|
76
|
+
if registered_advisory_locks.key?(name) && registered_advisory_locks[name][:lock_function] != lock_function
|
77
|
+
raise LockAlreadyRegistered, "Lock with name :#{name} is already registered with a different lock function (#{registered_advisory_locks[name][:lock_function]})"
|
78
|
+
end
|
79
|
+
|
80
|
+
key = advisory_lock_key_for(name)
|
81
|
+
name_for_key = registered_advisory_locks.keys.find { |n| registered_advisory_locks[n].fetch(:key) == key }
|
82
|
+
if name_for_key && name_for_key != name
|
83
|
+
raise Error, "Lock key #{key} is already taken"
|
84
|
+
end
|
85
|
+
|
86
|
+
function = lock_function.to_sym
|
87
|
+
unless LOCK_FUNCTIONS.include?(function)
|
88
|
+
raise Error, "Invalid lock function :#{function}"
|
89
|
+
end
|
90
|
+
|
91
|
+
registered_advisory_locks[name] = { key: key, lock_function: function }
|
92
|
+
end
|
93
|
+
|
94
|
+
def advisory_lock_key_for(lock_name)
|
95
|
+
Zlib.crc32(lock_name.to_s) % 2 ** 31
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
Database.register_extension(:pg_advisory_lock, Postgres::PgAdvisoryLock)
|
101
|
+
end
|
data/pact_broker.gemspec
CHANGED
@@ -50,7 +50,7 @@ Gem::Specification.new do |gem|
|
|
50
50
|
gem.license = "MIT"
|
51
51
|
|
52
52
|
gem.add_runtime_dependency "json", "~> 2.3"
|
53
|
-
gem.add_runtime_dependency "psych", "~>
|
53
|
+
gem.add_runtime_dependency "psych", "~> 5.0"
|
54
54
|
gem.add_runtime_dependency "roar", "~> 1.1"
|
55
55
|
gem.add_runtime_dependency "dry-validation", "~> 1.8"
|
56
56
|
gem.add_runtime_dependency "reform", "~> 2.6"
|
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.111.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: 2024-
|
13
|
+
date: 2024-08-12 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: json
|
@@ -32,14 +32,14 @@ dependencies:
|
|
32
32
|
requirements:
|
33
33
|
- - "~>"
|
34
34
|
- !ruby/object:Gem::Version
|
35
|
-
version: '
|
35
|
+
version: '5.0'
|
36
36
|
type: :runtime
|
37
37
|
prerelease: false
|
38
38
|
version_requirements: !ruby/object:Gem::Requirement
|
39
39
|
requirements:
|
40
40
|
- - "~>"
|
41
41
|
- !ruby/object:Gem::Version
|
42
|
-
version: '
|
42
|
+
version: '5.0'
|
43
43
|
- !ruby/object:Gem::Dependency
|
44
44
|
name: roar
|
45
45
|
requirement: !ruby/object:Gem::Requirement
|
@@ -582,6 +582,9 @@ files:
|
|
582
582
|
- docs/api/PACTICIPANTS.md
|
583
583
|
- docs/api/PAGINATION.md
|
584
584
|
- docs/api/WEBHOOKS.md
|
585
|
+
- docs/developer/design_pattern_for_eager_loading_collections.md
|
586
|
+
- docs/developer/matrix.md
|
587
|
+
- docs/developer/rack.md
|
585
588
|
- lib/pact/doc/doc_file.rb
|
586
589
|
- lib/pact/doc/generate.rb
|
587
590
|
- lib/pact/doc/generator.rb
|
@@ -651,6 +654,7 @@ files:
|
|
651
654
|
- lib/pact_broker/api/decorators/integration_decorator.rb
|
652
655
|
- lib/pact_broker/api/decorators/integrations_decorator.rb
|
653
656
|
- lib/pact_broker/api/decorators/label_decorator.rb
|
657
|
+
- lib/pact_broker/api/decorators/labels_decorator.rb
|
654
658
|
- lib/pact_broker/api/decorators/latest_pact_decorator.rb
|
655
659
|
- lib/pact_broker/api/decorators/matrix_decorator.rb
|
656
660
|
- lib/pact_broker/api/decorators/matrix_text_decorator.rb
|
@@ -717,6 +721,7 @@ files:
|
|
717
721
|
- lib/pact_broker/api/resources/can_i_deploy_pacticipant_version_by_branch_to_environment_badge.rb
|
718
722
|
- lib/pact_broker/api/resources/can_i_deploy_pacticipant_version_by_tag_to_tag.rb
|
719
723
|
- lib/pact_broker/api/resources/can_i_deploy_pacticipant_version_by_tag_to_tag_badge.rb
|
724
|
+
- lib/pact_broker/api/resources/can_i_merge_badge.rb
|
720
725
|
- lib/pact_broker/api/resources/clean.rb
|
721
726
|
- lib/pact_broker/api/resources/currently_deployed_versions_for_environment.rb
|
722
727
|
- lib/pact_broker/api/resources/currently_supported_versions_for_environment.rb
|
@@ -736,6 +741,7 @@ files:
|
|
736
741
|
- lib/pact_broker/api/resources/integration.rb
|
737
742
|
- lib/pact_broker/api/resources/integrations.rb
|
738
743
|
- lib/pact_broker/api/resources/label.rb
|
744
|
+
- lib/pact_broker/api/resources/labels.rb
|
739
745
|
- lib/pact_broker/api/resources/latest_pact.rb
|
740
746
|
- lib/pact_broker/api/resources/latest_pacts.rb
|
741
747
|
- lib/pact_broker/api/resources/latest_provider_pacts.rb
|
@@ -812,6 +818,7 @@ files:
|
|
812
818
|
- lib/pact_broker/dataset/page.rb
|
813
819
|
- lib/pact_broker/date_helper.rb
|
814
820
|
- lib/pact_broker/db.rb
|
821
|
+
- lib/pact_broker/db/advisory_lock.rb
|
815
822
|
- lib/pact_broker/db/clean.rb
|
816
823
|
- lib/pact_broker/db/clean/selector.rb
|
817
824
|
- lib/pact_broker/db/clean_incremental.rb
|
@@ -1124,6 +1131,7 @@ files:
|
|
1124
1131
|
- lib/rack/pact_broker/ui_request_filter.rb
|
1125
1132
|
- lib/rack/pact_broker/use_when.rb
|
1126
1133
|
- lib/semantic_logger/formatters/short.rb
|
1134
|
+
- lib/sequel/extensions/pg_advisory_lock.rb
|
1127
1135
|
- lib/sequel/extensions/statement_timeout.rb
|
1128
1136
|
- lib/sequel/plugins/age.rb
|
1129
1137
|
- lib/sequel/plugins/insert_ignore.rb
|
@@ -1260,7 +1268,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
1260
1268
|
- !ruby/object:Gem::Version
|
1261
1269
|
version: '0'
|
1262
1270
|
requirements: []
|
1263
|
-
rubygems_version: 3.5.
|
1271
|
+
rubygems_version: 3.5.17
|
1264
1272
|
signing_key:
|
1265
1273
|
specification_version: 4
|
1266
1274
|
summary: See description
|