pact_broker 2.58.0 → 2.58.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (97) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/release_gem.yml +25 -0
  3. data/.travis.yml +5 -3
  4. data/CHANGELOG.md +8 -0
  5. data/DEVELOPER_SETUP.md +46 -16
  6. data/Dockerfile +23 -2
  7. data/Gemfile +29 -2
  8. data/config.ru +32 -12
  9. data/config/database.yml +7 -0
  10. data/docker-compose-dev-postgres.yml +35 -0
  11. data/docker-compose-test.yml +100 -0
  12. data/lib/pact_broker/api/decorators/decorator_context.rb +1 -1
  13. data/lib/pact_broker/api/pact_broker_urls.rb +4 -4
  14. data/lib/pact_broker/api/paths.rb +15 -0
  15. data/lib/pact_broker/api/resources/all_webhooks.rb +3 -3
  16. data/lib/pact_broker/api/resources/base_resource.rb +2 -174
  17. data/lib/pact_broker/api/resources/default_base_resource.rb +211 -0
  18. data/lib/pact_broker/api/resources/error_handler.rb +1 -1
  19. data/lib/pact_broker/api/resources/group.rb +1 -13
  20. data/lib/pact_broker/api/resources/label.rb +5 -2
  21. data/lib/pact_broker/api/resources/latest_pact.rb +4 -0
  22. data/lib/pact_broker/api/resources/latest_pacts.rb +1 -4
  23. data/lib/pact_broker/api/resources/latest_verifications_for_consumer_version.rb +8 -2
  24. data/lib/pact_broker/api/resources/matrix.rb +2 -2
  25. data/lib/pact_broker/api/resources/matrix_for_consumer_and_provider.rb +1 -1
  26. data/lib/pact_broker/api/resources/pact.rb +5 -1
  27. data/lib/pact_broker/api/resources/pact_content_diff.rb +1 -2
  28. data/lib/pact_broker/api/resources/pact_triggered_webhooks.rb +1 -7
  29. data/lib/pact_broker/api/resources/pact_versions.rb +1 -3
  30. data/lib/pact_broker/api/resources/pact_webhooks.rb +2 -5
  31. data/lib/pact_broker/api/resources/pact_webhooks_status.rb +1 -17
  32. data/lib/pact_broker/api/resources/pacticipant.rb +7 -14
  33. data/lib/pact_broker/api/resources/pacticipants.rb +1 -1
  34. data/lib/pact_broker/api/resources/pacticipants_for_label.rb +1 -1
  35. data/lib/pact_broker/api/resources/previous_distinct_pact_version.rb +4 -0
  36. data/lib/pact_broker/api/resources/provider_pacts.rb +5 -1
  37. data/lib/pact_broker/api/resources/provider_pacts_for_verification.rb +1 -1
  38. data/lib/pact_broker/api/resources/tag.rb +5 -1
  39. data/lib/pact_broker/api/resources/tagged_pact_versions.rb +1 -2
  40. data/lib/pact_broker/api/resources/triggered_webhook_logs.rb +4 -0
  41. data/lib/pact_broker/api/resources/verification.rb +7 -3
  42. data/lib/pact_broker/api/resources/verification_triggered_webhooks.rb +5 -1
  43. data/lib/pact_broker/api/resources/verifications.rb +7 -3
  44. data/lib/pact_broker/api/resources/version.rb +4 -1
  45. data/lib/pact_broker/api/resources/versions.rb +1 -3
  46. data/lib/pact_broker/api/resources/webhook.rb +6 -2
  47. data/lib/pact_broker/api/resources/webhook_execution.rb +4 -0
  48. data/lib/pact_broker/api/resources/webhooks.rb +3 -18
  49. data/lib/pact_broker/app.rb +1 -0
  50. data/lib/pact_broker/configuration.rb +8 -1
  51. data/lib/pact_broker/db/clean.rb +0 -6
  52. data/lib/pact_broker/domain/pacticipant.rb +7 -2
  53. data/lib/pact_broker/domain/version.rb +3 -0
  54. data/lib/pact_broker/index/service.rb +5 -45
  55. data/lib/pact_broker/pacticipants/repository.rb +2 -2
  56. data/lib/pact_broker/pacts/latest_pact_publication_id_for_consumer_version.rb +2 -5
  57. data/lib/pact_broker/pacts/pact_publication.rb +11 -9
  58. data/lib/pact_broker/pacts/pact_version.rb +3 -4
  59. data/lib/pact_broker/pacts/repository.rb +53 -39
  60. data/lib/pact_broker/pacts/verifiable_pact.rb +8 -0
  61. data/lib/pact_broker/policies.rb +53 -0
  62. data/lib/pact_broker/repositories/helpers.rb +3 -20
  63. data/lib/pact_broker/ui/controllers/index.rb +0 -2
  64. data/lib/pact_broker/verifications/latest_verification_id_for_pact_version_and_provider_version.rb +3 -5
  65. data/lib/pact_broker/version.rb +1 -1
  66. data/lib/pact_broker/versions/repository.rb +2 -4
  67. data/lib/rack/pact_broker/request_target.rb +6 -1
  68. data/lib/sequel/plugins/insert_ignore.rb +69 -0
  69. data/lib/sequel/plugins/upsert.rb +103 -0
  70. data/pact_broker.gemspec +22 -41
  71. data/script/docker/db-execute-sql-file.sh +2 -0
  72. data/script/issues/consumer-version-selectors-docs/issue-text.txt +11 -0
  73. data/script/issues/consumer-version-selectors-docs/issues.txt +6 -0
  74. data/script/issues/consumer-version-selectors-docs/raise-issue-in-client-repos.sh +10 -0
  75. data/script/prod/redact-data.sql +1 -0
  76. data/script/release-via-github-action.sh +7 -0
  77. data/script/trigger-release.sh +30 -0
  78. data/spec/features/get_versions_spec.rb +1 -6
  79. data/spec/lib/pact_broker/api/pact_broker_urls_spec.rb +2 -2
  80. data/spec/lib/pact_broker/api/resources/all_webhooks_spec.rb +1 -1
  81. data/spec/lib/pact_broker/api/resources/default_base_resource_spec.rb +158 -0
  82. data/spec/lib/pact_broker/api/resources/tag_spec.rb +2 -2
  83. data/spec/lib/pact_broker/api/resources/webhook_spec.rb +1 -1
  84. data/spec/lib/pact_broker/api/resources/webhooks_spec.rb +1 -1
  85. data/spec/lib/pact_broker/db/clean_old_spec.rb +125 -0
  86. data/spec/lib/pact_broker/db/clean_spec.rb +45 -11
  87. data/spec/lib/pact_broker/index/service_spec.rb +2 -3
  88. data/spec/lib/pact_broker/pacts/repository_find_wip_pact_versions_for_provider_spec.rb +36 -0
  89. data/spec/lib/pact_broker/versions/repository_spec.rb +8 -0
  90. data/spec/lib/rack/pact_broker/request_target_spec.rb +7 -0
  91. data/spec/lib/sequel/plugins/insert_ignore_spec.rb +82 -0
  92. data/spec/lib/sequel/plugins/upsert_spec.rb +125 -0
  93. data/spec/spec_helper.rb +1 -0
  94. data/tasks/audit.rake +6 -2
  95. data/tasks/development.rake +2 -2
  96. metadata +46 -284
  97. data/spec/lib/pact_broker/api/resources/base_resource_spec.rb +0 -78
@@ -27,7 +27,7 @@ module PactBroker
27
27
  end
28
28
 
29
29
  def self.reportable?(e)
30
- !e.is_a?(PactBroker::Error) && !e.is_a?(JSON::GeneratorError)
30
+ !e.is_a?(PactBroker::Error) && !e.is_a?(JSON::JSONError)
31
31
  end
32
32
 
33
33
  def self.log_as_warning?(e)
@@ -2,10 +2,8 @@ require 'pact_broker/api/resources/base_resource'
2
2
  require 'pact_broker/api/decorators/relationships_csv_decorator'
3
3
 
4
4
  module PactBroker
5
-
6
5
  module Api
7
6
  module Resources
8
-
9
7
  class Group < BaseResource
10
8
 
11
9
  def content_types_provided
@@ -26,20 +24,10 @@ module PactBroker
26
24
 
27
25
  private
28
26
 
29
- def pacticipant_name
30
- identifier_from_path[:pacticipant_name]
31
- end
32
-
33
- def pacticipant
34
- @pacticipant ||= pacticipant_service.find_pacticipant_by_name(pacticipant_name)
35
- end
36
-
37
27
  def group
38
- @group ||= group_service.find_group_containing pacticipant
28
+ @group ||= group_service.find_group_containing(pacticipant)
39
29
  end
40
-
41
30
  end
42
31
  end
43
-
44
32
  end
45
33
  end
@@ -5,7 +5,6 @@ module PactBroker
5
5
  module Api
6
6
  module Resources
7
7
  class Label < BaseResource
8
-
9
8
  def content_types_provided
10
9
  [["application/hal+json", :to_json]]
11
10
  end
@@ -28,11 +27,15 @@ module PactBroker
28
27
  end
29
28
 
30
29
  def resource_exists?
30
+ !!resource_object
31
+ end
32
+
33
+ def resource_object
31
34
  label
32
35
  end
33
36
 
34
37
  def to_json
35
- PactBroker::Api::Decorators::LabelDecorator.new(label).to_json(user_options: { base_url: base_url })
38
+ PactBroker::Api::Decorators::LabelDecorator.new(label).to_json(decorator_options)
36
39
  end
37
40
 
38
41
  def label
@@ -21,6 +21,10 @@ module PactBroker
21
21
  end
22
22
 
23
23
  def resource_exists?
24
+ !!resource_object
25
+ end
26
+
27
+ def resource_object
24
28
  pact
25
29
  end
26
30
 
@@ -3,7 +3,6 @@ require 'pact_broker/api/resources/base_resource'
3
3
  module PactBroker
4
4
  module Api
5
5
  module Resources
6
-
7
6
  class LatestPacts < BaseResource
8
7
 
9
8
  def content_types_provided
@@ -15,15 +14,13 @@ module PactBroker
15
14
  end
16
15
 
17
16
  def to_json
18
- PactBroker::Api::Decorators::PactCollectionDecorator.new(pacts).to_json(user_options: { base_url: base_url })
17
+ PactBroker::Api::Decorators::PactCollectionDecorator.new(pacts).to_json(decorator_options)
19
18
  end
20
19
 
21
20
  def pacts
22
21
  pact_service.find_latest_pacts
23
22
  end
24
-
25
23
  end
26
24
  end
27
-
28
25
  end
29
26
  end
@@ -18,8 +18,7 @@ module PactBroker
18
18
  end
19
19
 
20
20
  def resource_exists?
21
- version_params = {pacticipant_name: identifier_from_path[:consumer_name], pacticipant_version_number: identifier_from_path[:consumer_version_number]}
22
- !!version_service.find_by_pacticipant_name_and_number(version_params)
21
+ !!version
23
22
  end
24
23
 
25
24
  def to_json
@@ -29,6 +28,13 @@ module PactBroker
29
28
 
30
29
  private
31
30
 
31
+ def version
32
+ version_service.find_by_pacticipant_name_and_number(
33
+ pacticipant_name: consumer_name,
34
+ pacticipant_version_number: consumer_version_number
35
+ )
36
+ end
37
+
32
38
  def decorator_for summary
33
39
  PactBroker::Api::Decorators::VerificationSummaryDecorator.new(summary)
34
40
  end
@@ -36,11 +36,11 @@ module PactBroker
36
36
  end
37
37
 
38
38
  def to_json
39
- PactBroker::Api::Decorators::MatrixDecorator.new(results).to_json(user_options: { base_url: base_url })
39
+ PactBroker::Api::Decorators::MatrixDecorator.new(results).to_json(decorator_options)
40
40
  end
41
41
 
42
42
  def to_text
43
- PactBroker::Api::Decorators::MatrixTextDecorator.new(results).to_text(user_options: { base_url: base_url })
43
+ PactBroker::Api::Decorators::MatrixTextDecorator.new(results).to_text(decorator_options)
44
44
  end
45
45
 
46
46
  def results
@@ -24,7 +24,7 @@ module PactBroker
24
24
  end
25
25
 
26
26
  def to_json
27
- PactBroker::Api::Decorators::MatrixDecorator.new(results).to_json(user_options: { base_url: base_url })
27
+ PactBroker::Api::Decorators::MatrixDecorator.new(results).to_json(decorator_options)
28
28
  end
29
29
 
30
30
  private
@@ -50,7 +50,11 @@ module PactBroker
50
50
  end
51
51
 
52
52
  def resource_exists?
53
- !!pact
53
+ !!resource_object
54
+ end
55
+
56
+ def resource_object
57
+ pact
54
58
  end
55
59
 
56
60
  def from_json
@@ -15,8 +15,7 @@ module PactBroker
15
15
  end
16
16
 
17
17
  def resource_exists?
18
- pacticipant_service.find_pacticipant_by_name(consumer_name) &&
19
- pacticipant_service.find_pacticipant_by_name(provider_name)
18
+ consumer && provider
20
19
  end
21
20
 
22
21
  def to_text
@@ -18,7 +18,7 @@ module PactBroker
18
18
  end
19
19
 
20
20
  def to_json
21
- Decorators::TriggeredWebhooksDecorator.new(triggered_webhooks).to_json(decorator_options)
21
+ Decorators::TriggeredWebhooksDecorator.new(triggered_webhooks).to_json(decorator_options(resource_title: resource_title))
22
22
  end
23
23
 
24
24
  private
@@ -30,12 +30,6 @@ module PactBroker
30
30
  def resource_title
31
31
  "Webhooks triggered by the publication of the #{pact.name[0].downcase}#{pact.name[1..-1]}"
32
32
  end
33
-
34
- def decorator_options
35
- {
36
- user_options: decorator_context.merge(resource_title: resource_title)
37
- }
38
- end
39
33
  end
40
34
  end
41
35
  end
@@ -6,7 +6,6 @@ module PactBroker
6
6
  module Api
7
7
  module Resources
8
8
  class PactVersions < BaseResource
9
-
10
9
  def content_types_provided
11
10
  [["application/hal+json", :to_json]]
12
11
  end
@@ -16,8 +15,7 @@ module PactBroker
16
15
  end
17
16
 
18
17
  def resource_exists?
19
- pacticipant_service.find_pacticipant_by_name(consumer_name) &&
20
- pacticipant_service.find_pacticipant_by_name(provider_name)
18
+ consumer && provider
21
19
  end
22
20
 
23
21
  def to_json
@@ -4,10 +4,8 @@ require 'pact_broker/api/decorators/webhooks_decorator'
4
4
  require 'pact_broker/api/contracts/webhook_contract'
5
5
 
6
6
  module PactBroker
7
-
8
7
  module Api
9
8
  module Resources
10
-
11
9
  class PactWebhooks < BaseResource
12
10
 
13
11
  def allowed_methods
@@ -23,8 +21,7 @@ module PactBroker
23
21
  end
24
22
 
25
23
  def resource_exists?
26
- (identifier_from_path[:consumer_name].nil? || consumer) &&
27
- (identifier_from_path[:provider_name].nil? || provider)
24
+ (!consumer_specified? || consumer) && (!provider_specified? || provider)
28
25
  end
29
26
 
30
27
  def malformed_request?
@@ -55,7 +52,7 @@ module PactBroker
55
52
 
56
53
  def from_json
57
54
  saved_webhook = webhook_service.create next_uuid, webhook, consumer, provider
58
- response.body = Decorators::WebhookDecorator.new(saved_webhook).to_json(user_options: { base_url: base_url })
55
+ response.body = Decorators::WebhookDecorator.new(saved_webhook).to_json(decoractor_options)
59
56
  end
60
57
 
61
58
  def to_json
@@ -2,10 +2,8 @@ require 'pact_broker/api/resources/base_resource'
2
2
  require 'pact_broker/api/decorators/pact_webhooks_status_decorator'
3
3
 
4
4
  module PactBroker
5
-
6
5
  module Api
7
6
  module Resources
8
-
9
7
  class PactWebhooksStatus < BaseResource
10
8
 
11
9
  def allowed_methods
@@ -35,21 +33,7 @@ module PactBroker
35
33
  end
36
34
 
37
35
  def webhooks
38
- webhook_service.find_by_consumer_and_provider consumer, provider
39
- end
40
-
41
- def consumer
42
- @consumer ||= find_pacticipant(identifier_from_path[:consumer_name], "consumer")
43
- end
44
-
45
- def provider
46
- @provider ||= find_pacticipant(identifier_from_path[:provider_name], "provider")
47
- end
48
-
49
- def find_pacticipant name, role
50
- pacticipant_service.find_pacticipant_by_name(name).tap do | pacticipant |
51
- set_json_error_message("No #{role} with name '#{name}' found") if pacticipant.nil?
52
- end
36
+ webhook_service.find_by_consumer_and_provider(consumer, provider)
53
37
  end
54
38
 
55
39
  def decorator_for latest_triggered_webhooks
@@ -11,7 +11,6 @@ end
11
11
  module PactBroker
12
12
  module Api
13
13
  module Resources
14
-
15
14
  class Pacticipant < BaseResource
16
15
 
17
16
  def content_types_provided
@@ -32,7 +31,7 @@ module PactBroker
32
31
 
33
32
  def from_json
34
33
  if pacticipant
35
- @pacticipant = pacticipant_service.update params_with_string_keys.merge('name' => pacticipant_name)
34
+ @pacticipant = pacticipant_service.update params(symbolize_names: false).merge('name' => pacticipant_name)
36
35
  else
37
36
  @pacticipant = pacticipant_service.create params.merge(:name => pacticipant_name)
38
37
  response.headers["Location"] = pacticipant_url(base_url, pacticipant)
@@ -41,26 +40,20 @@ module PactBroker
41
40
  end
42
41
 
43
42
  def resource_exists?
43
+ !!resource_object
44
+ end
45
+
46
+ def resource_object
44
47
  pacticipant
45
48
  end
46
49
 
47
50
  def delete_resource
48
- pacticipant_service.delete pacticipant_name
51
+ pacticipant_service.delete(pacticipant_name)
49
52
  true
50
53
  end
51
54
 
52
55
  def to_json
53
- PactBroker::Api::Decorators::PacticipantDecorator.new(pacticipant).to_json(user_options: { base_url: base_url })
54
- end
55
-
56
- private
57
-
58
- def pacticipant
59
- @pacticipant ||= pacticipant_service.find_pacticipant_by_name(pacticipant_name)
60
- end
61
-
62
- def pacticipant_name
63
- identifier_from_path[:pacticipant_name]
56
+ PactBroker::Api::Decorators::PacticipantDecorator.new(pacticipant).to_json(decorator_options)
64
57
  end
65
58
  end
66
59
  end
@@ -46,7 +46,7 @@ module PactBroker
46
46
  end
47
47
 
48
48
  def generate_json pacticipants
49
- PactBroker::Api::Decorators::DeprecatedPacticipantCollectionDecorator.new(pacticipants).to_json(user_options: { base_url: base_url })
49
+ PactBroker::Api::Decorators::DeprecatedPacticipantCollectionDecorator.new(pacticipants).to_json(decorator_options)
50
50
  end
51
51
 
52
52
  def decorator_for model
@@ -19,7 +19,7 @@ module PactBroker
19
19
  end
20
20
 
21
21
  def generate_json pacticipants
22
- PactBroker::Api::Decorators::PacticipantCollectionDecorator.new(pacticipants).to_json(user_options: { base_url: base_url })
22
+ PactBroker::Api::Decorators::PacticipantCollectionDecorator.new(pacticipants).to_json(decorator_options)
23
23
  end
24
24
  end
25
25
  end
@@ -18,6 +18,10 @@ module PactBroker
18
18
  end
19
19
 
20
20
  def resource_exists?
21
+ !!resource_object
22
+ end
23
+
24
+ def resource_object
21
25
  pact
22
26
  end
23
27
 
@@ -16,7 +16,11 @@ module PactBroker
16
16
  end
17
17
 
18
18
  def resource_exists?
19
- pacticipant_service.find_pacticipant_by_name(provider_name)
19
+ !!provider
20
+ end
21
+
22
+ def resource_object
23
+ provider
20
24
  end
21
25
 
22
26
  def to_json
@@ -72,7 +72,7 @@ module PactBroker
72
72
  if request.get?
73
73
  Rack::Utils.parse_nested_query(request.uri.query)
74
74
  elsif request.post?
75
- params_with_string_keys
75
+ params(symbolize_names: false, default: {})
76
76
  end
77
77
  end
78
78
  end
@@ -27,11 +27,15 @@ module PactBroker
27
27
  end
28
28
 
29
29
  def resource_exists?
30
+ !!resource_object
31
+ end
32
+
33
+ def resource_object
30
34
  tag
31
35
  end
32
36
 
33
37
  def to_json
34
- PactBroker::Api::Decorators::TagDecorator.new(tag).to_json(user_options: { base_url: base_url })
38
+ PactBroker::Api::Decorators::TagDecorator.new(tag).to_json(decorator_options)
35
39
  end
36
40
 
37
41
  def tag
@@ -16,8 +16,7 @@ module PactBroker
16
16
  end
17
17
 
18
18
  def resource_exists?
19
- pacticipant_service.find_pacticipant_by_name(consumer_name) &&
20
- pacticipant_service.find_pacticipant_by_name(provider_name)
19
+ consumer && provider
21
20
  end
22
21
 
23
22
  def to_json
@@ -16,6 +16,10 @@ module PactBroker
16
16
  end
17
17
 
18
18
  def resource_exists?
19
+ !!resource_object
20
+ end
21
+
22
+ def resource_object
19
23
  triggered_webhook
20
24
  end
21
25
 
@@ -28,16 +28,20 @@ module PactBroker
28
28
  set_json_error_message("To see all the verifications for a pact, use the Matrix page")
29
29
  false
30
30
  else
31
- !!verification
31
+ !!resource_object
32
32
  end
33
33
  end
34
34
 
35
+ def resource_object
36
+ verification
37
+ end
38
+
35
39
  def to_json
36
- decorator_for(verification).to_json(user_options: { base_url: base_url })
40
+ decorator_for(verification).to_json(decorator_options)
37
41
  end
38
42
 
39
43
  def to_extended_json
40
- extended_decorator_for(verification).to_json(user_options: { base_url: base_url })
44
+ extended_decorator_for(verification).to_json(decorator_options)
41
45
  end
42
46
 
43
47
  def delete_resource