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.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +30 -0
  3. data/docs/developer/design_pattern_for_eager_loading_collections.md +23 -0
  4. data/docs/developer/matrix.md +95 -0
  5. data/docs/developer/rack.md +11 -0
  6. data/lib/pact_broker/api/contracts/consumer_version_selector_contract.rb +1 -1
  7. data/lib/pact_broker/api/decorators/base_decorator.rb +10 -1
  8. data/lib/pact_broker/api/decorators/label_decorator.rb +19 -13
  9. data/lib/pact_broker/api/decorators/labels_decorator.rb +23 -0
  10. data/lib/pact_broker/api/decorators/pacticipant_decorator.rb +1 -1
  11. data/lib/pact_broker/api/decorators/version_decorator.rb +14 -0
  12. data/lib/pact_broker/api/paths.rb +2 -1
  13. data/lib/pact_broker/api/resources/branch_versions.rb +1 -1
  14. data/lib/pact_broker/api/resources/can_i_merge_badge.rb +36 -0
  15. data/lib/pact_broker/api/resources/labels.rb +37 -0
  16. data/lib/pact_broker/api/resources/provider_pacts_for_verification.rb +5 -0
  17. data/lib/pact_broker/api/resources/versions.rb +1 -1
  18. data/lib/pact_broker/api.rb +4 -0
  19. data/lib/pact_broker/app.rb +24 -9
  20. data/lib/pact_broker/badges/service.rb +18 -0
  21. data/lib/pact_broker/contracts/service.rb +6 -2
  22. data/lib/pact_broker/db/advisory_lock.rb +58 -0
  23. data/lib/pact_broker/domain/version.rb +3 -2
  24. data/lib/pact_broker/integrations/integration.rb +11 -1
  25. data/lib/pact_broker/integrations/repository.rb +46 -7
  26. data/lib/pact_broker/integrations/service.rb +2 -0
  27. data/lib/pact_broker/labels/repository.rb +5 -0
  28. data/lib/pact_broker/labels/service.rb +4 -0
  29. data/lib/pact_broker/matrix/service.rb +26 -0
  30. data/lib/pact_broker/pacticipants/repository.rb +10 -1
  31. data/lib/pact_broker/pacts/pact_publication_dataset_module.rb +56 -3
  32. data/lib/pact_broker/pacts/pact_publication_selector_dataset_module.rb +1 -0
  33. data/lib/pact_broker/pacts/pacts_for_verification_repository.rb +4 -4
  34. data/lib/pact_broker/pacts/repository.rb +2 -2
  35. data/lib/pact_broker/pacts/selector.rb +8 -2
  36. data/lib/pact_broker/tasks/clean_task.rb +68 -26
  37. data/lib/pact_broker/test/test_data_builder.rb +17 -5
  38. data/lib/pact_broker/version.rb +1 -1
  39. data/lib/pact_broker/versions/repository.rb +2 -20
  40. data/lib/pact_broker/versions/service.rb +2 -6
  41. data/lib/pact_broker/webhooks/execution.rb +8 -8
  42. data/lib/sequel/extensions/pg_advisory_lock.rb +101 -0
  43. data/pact_broker.gemspec +1 -1
  44. 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", "~> 4.0" # TODO identify breaking changes and see if we can use 5
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.109.1
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-02-21 00:00:00.000000000 Z
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: '4.0'
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: '4.0'
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.6
1271
+ rubygems_version: 3.5.17
1264
1272
  signing_key:
1265
1273
  specification_version: 4
1266
1274
  summary: See description