pact_broker 2.75.0 → 2.78.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.codeclimate.yml +12 -0
- data/.github/workflows/test-ruby-3.yml +19 -0
- data/.github/workflows/test.yml +19 -4
- data/.gitignore +3 -1
- data/CHANGELOG.md +48 -0
- data/DEVELOPER_SETUP.md +62 -3
- data/Dockerfile +1 -0
- data/ISSUES.md +13 -5
- data/README.md +1 -1
- data/config.ru +1 -0
- data/db/ddl_statements/head_pact_tags.rb +24 -1
- data/db/ddl_statements/latest_tagged_pact_consumer_version_orders.rb +11 -0
- data/db/ddl_statements/latest_tagged_pact_publications.rb +6 -0
- data/db/ddl_statements/latest_verification_ids_for_consumer_version_tags.rb +13 -0
- data/db/migrations/20210117_add_branch_to_version.rb +9 -0
- data/db/migrations/20210202_add_created_at_to_head_pact_tags.rb +14 -0
- data/db/migrations/20210205_add_pacticipant_id_to_tag.rb +17 -0
- data/db/migrations/20210206_add_index_to_tags_and_versions.rb +27 -0
- data/db/migrations/20210207_optimise_latest_verification_ids_for_consumer_version_tags.rb +13 -0
- data/db/migrations/20210208_optimise_latest_tagged_pact_cv_orders.rb +13 -0
- data/db/migrations/20210210_create_environments_table.rb +16 -0
- data/docker-compose-issue-repro-with-pact-broker-docker-image.yml +44 -0
- data/lib/pact_broker/api.rb +7 -2
- data/lib/pact_broker/api/contracts/dry_validation_predicates.rb +8 -0
- data/lib/pact_broker/api/contracts/environment_schema.rb +49 -0
- data/lib/pact_broker/api/decorators/base_decorator.rb +11 -0
- data/lib/pact_broker/api/decorators/dashboard_decorator.rb +5 -1
- data/lib/pact_broker/api/decorators/environment_decorator.rb +30 -0
- data/lib/pact_broker/api/decorators/environments_decorator.rb +21 -0
- data/lib/pact_broker/api/decorators/matrix_decorator.rb +8 -2
- data/lib/pact_broker/api/decorators/reason_decorator.rb +2 -2
- data/lib/pact_broker/api/decorators/verifiable_pacts_query_decorator.rb +2 -0
- data/lib/pact_broker/api/decorators/version_decorator.rb +15 -2
- data/lib/pact_broker/api/pact_broker_urls.rb +8 -0
- data/lib/pact_broker/api/paths.rb +5 -0
- data/lib/pact_broker/api/resources/default_base_resource.rb +15 -2
- data/lib/pact_broker/api/resources/environment.rb +76 -0
- data/lib/pact_broker/api/resources/environments.rb +75 -0
- data/lib/pact_broker/api/resources/index.rb +20 -0
- data/lib/pact_broker/api/resources/latest_version.rb +27 -0
- data/lib/pact_broker/api/resources/provider_pacts_for_verification.rb +1 -0
- data/lib/pact_broker/api/resources/verifications.rb +5 -2
- data/lib/pact_broker/api/resources/version.rb +15 -9
- data/lib/pact_broker/api/resources/webhook_execution.rb +1 -1
- data/lib/pact_broker/app.rb +3 -0
- data/lib/pact_broker/certificates/certificate.rb +1 -1
- data/lib/pact_broker/config/setting.rb +1 -1
- data/lib/pact_broker/config/space_delimited_integer_list.rb +25 -0
- data/lib/pact_broker/configuration.rb +18 -1
- data/lib/pact_broker/db/data_migrations/helpers.rb +4 -0
- data/lib/pact_broker/db/data_migrations/set_extra_columns_for_tags.rb +29 -0
- data/lib/pact_broker/db/migrate_data.rb +1 -0
- data/lib/pact_broker/db/seed_example_data.rb +13 -13
- data/lib/pact_broker/deployments/environment.rb +15 -0
- data/lib/pact_broker/deployments/environment_service.rb +39 -0
- data/lib/pact_broker/doc/controllers/app.rb +1 -1
- data/lib/pact_broker/doc/views/index/environment.markdown +37 -0
- data/lib/pact_broker/doc/views/index/environments.markdown +53 -0
- data/lib/pact_broker/doc/views/index/latest-pact-versions.markdown +1 -1
- data/lib/pact_broker/doc/views/index/pacticipant-version-tag.markdown +1 -0
- data/lib/pact_broker/doc/views/index/pacticipant-version.markdown +13 -0
- data/lib/pact_broker/domain/index_item.rb +18 -4
- data/lib/pact_broker/domain/pacticipant.rb +9 -5
- data/lib/pact_broker/domain/tag.rb +131 -71
- data/lib/pact_broker/domain/verification.rb +3 -2
- data/lib/pact_broker/domain/version.rb +58 -23
- data/lib/pact_broker/domain/webhook.rb +12 -9
- data/lib/pact_broker/hash_refinements.rb +4 -0
- data/lib/pact_broker/index/service.rb +55 -49
- data/lib/pact_broker/locale/en.yml +3 -1
- data/lib/pact_broker/matrix/quick_row.rb +8 -0
- data/lib/pact_broker/metrics/service.rb +1 -1
- data/lib/pact_broker/pacts/eager_loaders.rb +52 -0
- data/lib/pact_broker/pacts/latest_pact_publication_id_for_consumer_version.rb +18 -13
- data/lib/pact_broker/pacts/lazy_loaders.rb +14 -0
- data/lib/pact_broker/pacts/pact_publication.rb +38 -84
- data/lib/pact_broker/pacts/pact_publication_dataset_module.rb +297 -0
- data/lib/pact_broker/pacts/pact_version.rb +1 -2
- data/lib/pact_broker/pacts/pacts_for_verification_repository.rb +286 -0
- data/lib/pact_broker/pacts/repository.rb +5 -231
- data/lib/pact_broker/pacts/selected_pact.rb +4 -0
- data/lib/pact_broker/pacts/selector.rb +56 -1
- data/lib/pact_broker/pacts/selectors.rb +16 -0
- data/lib/pact_broker/pacts/service.rb +6 -8
- data/lib/pact_broker/pacts/squash_pacts_for_verification.rb +1 -4
- data/lib/pact_broker/pacts/verifiable_pact.rb +45 -2
- data/lib/pact_broker/pacts/verifiable_pact_messages.rb +56 -16
- data/lib/pact_broker/repositories/helpers.rb +4 -0
- data/lib/pact_broker/services.rb +9 -0
- data/lib/pact_broker/tags/eager_loaders.rb +47 -0
- data/lib/pact_broker/tags/repository.rb +3 -1
- data/lib/pact_broker/tags/service.rb +0 -3
- data/lib/pact_broker/tags/tag_with_latest_flag.rb +1 -0
- data/lib/pact_broker/test/http_test_data_builder.rb +101 -35
- data/lib/pact_broker/test/test_data_builder.rb +50 -3
- data/lib/pact_broker/ui/app.rb +6 -0
- data/lib/pact_broker/ui/controllers/base_controller.rb +5 -1
- data/lib/pact_broker/ui/controllers/pacts.rb +18 -0
- data/lib/pact_broker/ui/view_models/index_item.rb +9 -0
- data/lib/pact_broker/ui/view_models/matrix_line.rb +36 -0
- data/lib/pact_broker/ui/views/index/show-with-tags.haml +8 -0
- data/lib/pact_broker/ui/views/matrix/show.haml +10 -0
- data/lib/pact_broker/verifications/latest_verification_id_for_pact_version_and_provider_version.rb +7 -5
- data/lib/pact_broker/verifications/service.rb +2 -1
- data/lib/pact_broker/version.rb +1 -1
- data/lib/pact_broker/versions/eager_loaders.rb +71 -0
- data/lib/pact_broker/versions/lazy_loaders.rb +13 -0
- data/lib/pact_broker/versions/repository.rb +22 -2
- data/lib/pact_broker/versions/service.rb +5 -1
- data/lib/pact_broker/webhooks/execution.rb +3 -2
- data/lib/pact_broker/webhooks/latest_triggered_webhook.rb +2 -0
- data/lib/pact_broker/webhooks/pact_and_verification_parameters.rb +10 -3
- data/lib/pact_broker/webhooks/service.rb +8 -7
- data/lib/pact_broker/webhooks/trigger_service.rb +56 -23
- data/lib/pact_broker/webhooks/triggered_webhook.rb +14 -5
- data/lib/pact_broker/webhooks/webhook.rb +1 -1
- data/lib/pact_broker/webhooks/webhook_event.rb +1 -1
- data/lib/pact_broker/webhooks/webhook_execution_result.rb +4 -1
- data/lib/pact_broker/webhooks/webhook_request_logger.rb +5 -1
- data/lib/rack/pact_broker/set_base_url.rb +22 -0
- data/lib/sequel/plugins/upsert.rb +18 -4
- data/public/stylesheets/index.css +22 -1
- data/public/stylesheets/matrix.css +0 -21
- data/regression/can_i_deploy_spec.rb +5 -4
- data/regression/index_spec.rb +26 -0
- data/regression/regression_helper.rb +29 -3
- data/regression/script/clear.sh +3 -0
- data/regression/script/run.sh +3 -0
- data/script/demonstrate-version-branches.rb +33 -0
- data/script/pry.rb +2 -2
- data/script/reproduce-issue-starting-up.rb +13 -23
- data/script/reproduce-issue.rb +18 -14
- data/script/trigger-release.sh +1 -1
- data/script/webhook-server.ru +5 -5
- data/spec/features/create_environment_spec.rb +47 -0
- data/spec/features/create_tag_spec.rb +32 -0
- data/spec/features/create_version_spec.rb +70 -0
- data/spec/features/delete_environment_spec.rb +16 -0
- data/spec/features/end_deployment_spec.rb +29 -0
- data/spec/features/get_environment_spec.rb +19 -0
- data/spec/features/get_environments_spec.rb +20 -0
- data/spec/features/record_deployment_spec.rb +28 -0
- data/spec/features/update_environment_spec.rb +44 -0
- data/spec/fixtures/approvals/modifiable_resources.approved.json +6 -0
- data/spec/fixtures/dashboard.json +4 -2
- data/spec/integration/ui/index_spec.rb +4 -4
- data/spec/lib/pact_broker/api/contracts/environment_schema_spec.rb +83 -0
- data/spec/lib/pact_broker/api/decorators/dashboard_decorator_spec.rb +4 -2
- data/spec/lib/pact_broker/api/decorators/matrix_decorator_spec.rb +11 -6
- data/spec/lib/pact_broker/api/decorators/reason_decorator_spec.rb +6 -6
- data/spec/lib/pact_broker/api/decorators/verifiable_pacts_query_decorator_spec.rb +6 -0
- data/spec/lib/pact_broker/api/decorators/version_decorator_spec.rb +18 -0
- data/spec/lib/pact_broker/api/resources/default_base_resource_approval_spec.rb +1 -1
- data/spec/lib/pact_broker/api/resources/default_base_resource_spec.rb +1 -12
- data/spec/lib/pact_broker/api/resources/provider_pacts_for_verification_spec.rb +4 -0
- data/spec/lib/pact_broker/api/resources/verifications_spec.rb +2 -5
- data/spec/lib/pact_broker/api/resources/webhook_execution_result_spec.rb +56 -0
- data/spec/lib/pact_broker/api/resources/webhook_execution_spec.rb +3 -2
- data/spec/lib/pact_broker/config/space_delimited_integer_list_spec.rb +47 -0
- data/spec/lib/pact_broker/configuration_spec.rb +12 -0
- data/spec/lib/pact_broker/doc/controllers/app_spec.rb +3 -5
- data/spec/lib/pact_broker/domain/tag_spec.rb +101 -27
- data/spec/lib/pact_broker/domain/version_spec.rb +103 -15
- data/spec/lib/pact_broker/domain/webhook_spec.rb +7 -7
- data/spec/lib/pact_broker/index/service_spec.rb +89 -15
- data/spec/lib/pact_broker/pacts/pact_publication_dataset_module_spec.rb +400 -0
- data/spec/lib/pact_broker/pacts/pact_publication_spec.rb +434 -14
- data/spec/lib/pact_broker/pacts/repository_find_for_verification_fallback_spec.rb +1 -1
- data/spec/lib/pact_broker/pacts/repository_find_for_verification_spec.rb +1 -1
- data/spec/lib/pact_broker/pacts/repository_find_wip_pact_versions_for_provider_branch_spec.rb +224 -0
- data/spec/lib/pact_broker/pacts/repository_find_wip_pact_versions_for_provider_spec.rb +46 -7
- data/spec/lib/pact_broker/pacts/selector_spec.rb +3 -2
- data/spec/lib/pact_broker/pacts/service_find_for_verification_spec.rb +2 -3
- data/spec/lib/pact_broker/pacts/service_spec.rb +9 -7
- data/spec/lib/pact_broker/pacts/verifiable_pact_messages_spec.rb +57 -10
- data/spec/lib/pact_broker/tags/repository_spec.rb +2 -0
- data/spec/lib/pact_broker/verifications/service_spec.rb +4 -1
- data/spec/lib/pact_broker/versions/repository_spec.rb +54 -0
- data/spec/lib/pact_broker/webhooks/render_spec.rb +6 -5
- data/spec/lib/pact_broker/webhooks/service_spec.rb +13 -9
- data/spec/lib/pact_broker/webhooks/trigger_service_spec.rb +60 -18
- data/spec/lib/pact_broker/webhooks/webhook_request_logger_spec.rb +8 -0
- data/spec/lib/sequel/plugins/upsert_spec.rb +31 -3
- data/spec/service_consumers/hal_relation_proxy_app.rb +3 -1
- data/spec/service_consumers/provider_states_for_pact_broker_client.rb +16 -0
- data/spec/spec_helper.rb +17 -5
- data/spec/support/approvals.rb +24 -0
- data/spec/support/shared_examples_for_responses.rb +11 -0
- data/tasks/db.rake +1 -0
- data/tasks/rspec.rake +1 -1
- metadata +69 -4
- data/docker-compose-issue-repro.yml +0 -22
@@ -68,12 +68,12 @@ module PactBroker
|
|
68
68
|
alias_method :path_info, :identifier_from_path
|
69
69
|
|
70
70
|
def base_url
|
71
|
-
request.env["pactbroker.base_url"] ||
|
71
|
+
request.env["pactbroker.base_url"] || request.base_uri.to_s.chomp('/')
|
72
72
|
end
|
73
73
|
|
74
74
|
# See comments for base_url in lib/pact_broker/doc/controllers/app.rb
|
75
75
|
def ui_base_url
|
76
|
-
request.env["pactbroker.base_url"] ||
|
76
|
+
request.env["pactbroker.base_url"] || ''
|
77
77
|
end
|
78
78
|
|
79
79
|
def charsets_provided
|
@@ -149,6 +149,10 @@ module PactBroker
|
|
149
149
|
identifier_from_path[:consumer_version_number]
|
150
150
|
end
|
151
151
|
|
152
|
+
def pacticipant_version_number
|
153
|
+
identifier_from_path[:pacticipant_version_number]
|
154
|
+
end
|
155
|
+
|
152
156
|
def consumer_specified?
|
153
157
|
identifier_from_path.key?(:consumer_name)
|
154
158
|
end
|
@@ -239,6 +243,15 @@ module PactBroker
|
|
239
243
|
def decorator_class(name)
|
240
244
|
application_context.decorator_configuration.class_for(name)
|
241
245
|
end
|
246
|
+
|
247
|
+
def validation_errors_for_schema?(schema, params_to_validate = params)
|
248
|
+
if (errors = schema.call(params_to_validate)).any?
|
249
|
+
set_json_validation_error_messages(errors)
|
250
|
+
true
|
251
|
+
else
|
252
|
+
false
|
253
|
+
end
|
254
|
+
end
|
242
255
|
end
|
243
256
|
end
|
244
257
|
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require 'pact_broker/api/resources/base_resource'
|
2
|
+
require 'pact_broker/api/resources/environment'
|
3
|
+
|
4
|
+
module PactBroker
|
5
|
+
module Api
|
6
|
+
module Resources
|
7
|
+
class Environment < BaseResource
|
8
|
+
def content_types_provided
|
9
|
+
[["application/hal+json", :to_json]]
|
10
|
+
end
|
11
|
+
|
12
|
+
def content_types_accepted
|
13
|
+
[["application/json", :from_json]]
|
14
|
+
end
|
15
|
+
|
16
|
+
def allowed_methods
|
17
|
+
["GET", "PUT", "DELETE", "OPTIONS"]
|
18
|
+
end
|
19
|
+
|
20
|
+
def resource_exists?
|
21
|
+
!!environment
|
22
|
+
end
|
23
|
+
|
24
|
+
def malformed_request?
|
25
|
+
if request.put? && environment
|
26
|
+
invalid_json? || validation_errors_for_schema?(schema, params.merge(uuid: uuid))
|
27
|
+
else
|
28
|
+
false
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def from_json
|
33
|
+
if environment
|
34
|
+
@environment = update_environment
|
35
|
+
response.body = to_json
|
36
|
+
else
|
37
|
+
response.code = 404
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def policy_name
|
42
|
+
:'deployments::environment'
|
43
|
+
end
|
44
|
+
|
45
|
+
def to_json
|
46
|
+
decorator_class(:environment_decorator).new(environment).to_json(decorator_options)
|
47
|
+
end
|
48
|
+
|
49
|
+
def parsed_environment
|
50
|
+
@parsed_environment ||= decorator_class(:environment_decorator).new(PactBroker::Deployments::Environment.new).from_json(request_body)
|
51
|
+
end
|
52
|
+
|
53
|
+
def environment
|
54
|
+
@environment ||= environment_service.find(uuid)
|
55
|
+
end
|
56
|
+
|
57
|
+
def delete_resource
|
58
|
+
environment_service.delete(uuid)
|
59
|
+
true
|
60
|
+
end
|
61
|
+
|
62
|
+
def uuid
|
63
|
+
identifier_from_path[:environment_uuid]
|
64
|
+
end
|
65
|
+
|
66
|
+
def update_environment
|
67
|
+
environment_service.update(uuid, parsed_environment)
|
68
|
+
end
|
69
|
+
|
70
|
+
def schema
|
71
|
+
PactBroker::Api::Contracts::EnvironmentSchema
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require 'pact_broker/api/resources/base_resource'
|
2
|
+
require 'pact_broker/api/resources/environment'
|
3
|
+
require 'pact_broker/api/contracts/environment_schema'
|
4
|
+
|
5
|
+
module PactBroker
|
6
|
+
module Api
|
7
|
+
module Resources
|
8
|
+
class Environments < BaseResource
|
9
|
+
def content_types_provided
|
10
|
+
[["application/hal+json", :to_json]]
|
11
|
+
end
|
12
|
+
|
13
|
+
def content_types_accepted
|
14
|
+
[["application/json", :from_json]]
|
15
|
+
end
|
16
|
+
|
17
|
+
def allowed_methods
|
18
|
+
["GET", "POST", "OPTIONS"]
|
19
|
+
end
|
20
|
+
|
21
|
+
def resource_exists?
|
22
|
+
true
|
23
|
+
end
|
24
|
+
|
25
|
+
def post_is_create?
|
26
|
+
true
|
27
|
+
end
|
28
|
+
|
29
|
+
def malformed_request?
|
30
|
+
if request.post?
|
31
|
+
invalid_json? || validation_errors_for_schema?(schema, params.merge(uuid: uuid))
|
32
|
+
else
|
33
|
+
false
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def create_path
|
38
|
+
environment_url(OpenStruct.new(uuid: uuid), base_url)
|
39
|
+
end
|
40
|
+
|
41
|
+
def from_json
|
42
|
+
response.body = decorator_class(:environment_decorator).new(create_environment).to_json(decorator_options)
|
43
|
+
end
|
44
|
+
|
45
|
+
def policy_name
|
46
|
+
:'deployments::environment'
|
47
|
+
end
|
48
|
+
|
49
|
+
def to_json
|
50
|
+
decorator_class(:environments_decorator).new(environments).to_json(decorator_options)
|
51
|
+
end
|
52
|
+
|
53
|
+
def parsed_environment
|
54
|
+
@parsed_environment ||= decorator_class(:environment_decorator).new(PactBroker::Deployments::Environment.new).from_json(request_body)
|
55
|
+
end
|
56
|
+
|
57
|
+
def create_environment
|
58
|
+
environment_service.create(uuid, parsed_environment)
|
59
|
+
end
|
60
|
+
|
61
|
+
def uuid
|
62
|
+
@uuid ||= environment_service.next_uuid
|
63
|
+
end
|
64
|
+
|
65
|
+
def environments
|
66
|
+
@environments ||= environment_service.find_all
|
67
|
+
end
|
68
|
+
|
69
|
+
def schema
|
70
|
+
PactBroker::Api::Contracts::EnvironmentSchema
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -110,6 +110,12 @@ module PactBroker
|
|
110
110
|
title: "Get, create or delete a tag for a pacticipant version",
|
111
111
|
templated: true
|
112
112
|
},
|
113
|
+
'pb:pacticipant-version' =>
|
114
|
+
{
|
115
|
+
href: base_url + '/pacticipants/{pacticipant}/versions/{version}',
|
116
|
+
title: "Get, create or delete a pacticipant version",
|
117
|
+
templated: true
|
118
|
+
},
|
113
119
|
'pb:metrics' =>
|
114
120
|
{
|
115
121
|
href: base_url + '/metrics',
|
@@ -144,6 +150,20 @@ module PactBroker
|
|
144
150
|
}]
|
145
151
|
}
|
146
152
|
|
153
|
+
if PactBroker.feature_enabled?(:environments)
|
154
|
+
links_hash['pb:environments'] = {
|
155
|
+
title: "Environments",
|
156
|
+
href: environments_url(base_url),
|
157
|
+
templated: false
|
158
|
+
}
|
159
|
+
|
160
|
+
links_hash['pb:environment'] = {
|
161
|
+
title: "Environment",
|
162
|
+
href: environments_url(base_url) + "/{uuid}",
|
163
|
+
templated: true
|
164
|
+
}
|
165
|
+
end
|
166
|
+
|
147
167
|
if PactBroker.feature_enabled?('disable_pacts_for_verification', true)
|
148
168
|
links_hash.delete('pb:provider-pacts-for-verification')
|
149
169
|
links_hash.delete('beta:provider-pacts-for-verification')
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'pact_broker/api/resources/version'
|
2
|
+
|
3
|
+
module PactBroker
|
4
|
+
module Api
|
5
|
+
module Resources
|
6
|
+
class LatestVersion < Version
|
7
|
+
def content_types_accepted
|
8
|
+
[]
|
9
|
+
end
|
10
|
+
|
11
|
+
def allowed_methods
|
12
|
+
["GET", "OPTIONS"]
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def version
|
18
|
+
if identifier_from_path[:tag]
|
19
|
+
@version ||= version_service.find_by_pacticipant_name_and_latest_tag(identifier_from_path[:pacticipant_name], identifier_from_path[:tag])
|
20
|
+
else
|
21
|
+
@version ||= version_service.find_latest_by_pacticpant_name(identifier_from_path)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -50,7 +50,7 @@ module PactBroker
|
|
50
50
|
end
|
51
51
|
|
52
52
|
def from_json
|
53
|
-
verification = verification_service.create(next_verification_number, verification_params, pact, webhook_options)
|
53
|
+
verification = verification_service.create(next_verification_number, verification_params, pact, event_context, webhook_options)
|
54
54
|
response.body = decorator_for(verification).to_json(decorator_options)
|
55
55
|
true
|
56
56
|
end
|
@@ -81,11 +81,14 @@ module PactBroker
|
|
81
81
|
metadata[:wip] == 'true'
|
82
82
|
end
|
83
83
|
|
84
|
+
def event_context
|
85
|
+
metadata
|
86
|
+
end
|
87
|
+
|
84
88
|
def webhook_options
|
85
89
|
{
|
86
90
|
database_connector: database_connector,
|
87
91
|
webhook_execution_configuration: webhook_execution_configuration
|
88
|
-
.with_webhook_context(metadata)
|
89
92
|
}
|
90
93
|
end
|
91
94
|
|
@@ -10,20 +10,32 @@ module PactBroker
|
|
10
10
|
[["application/hal+json", :to_json]]
|
11
11
|
end
|
12
12
|
|
13
|
+
def content_types_accepted
|
14
|
+
[["application/json", :from_json]]
|
15
|
+
end
|
16
|
+
|
13
17
|
def allowed_methods
|
14
|
-
["GET", "DELETE", "OPTIONS"]
|
18
|
+
["GET", "PUT", "DELETE", "OPTIONS"]
|
15
19
|
end
|
16
20
|
|
17
21
|
def resource_exists?
|
18
22
|
!!version
|
19
23
|
end
|
20
24
|
|
25
|
+
def from_json
|
26
|
+
response_code = version ? 200 : 201
|
27
|
+
parsed_version = Decorators::VersionDecorator.new(OpenStruct.new).from_json(request_body)
|
28
|
+
@version = version_service.create_or_overwrite(pacticipant_name, pacticipant_version_number, parsed_version)
|
29
|
+
response.body = to_json
|
30
|
+
response_code
|
31
|
+
end
|
32
|
+
|
21
33
|
def to_json
|
22
34
|
decorator_class(:version_decorator).new(version).to_json(decorator_options)
|
23
35
|
end
|
24
36
|
|
25
37
|
def delete_resource
|
26
|
-
version_service.delete
|
38
|
+
version_service.delete(version)
|
27
39
|
true
|
28
40
|
end
|
29
41
|
|
@@ -34,13 +46,7 @@ module PactBroker
|
|
34
46
|
private
|
35
47
|
|
36
48
|
def version
|
37
|
-
|
38
|
-
@version ||= version_service.find_by_pacticipant_name_and_latest_tag(identifier_from_path[:pacticipant_name], identifier_from_path[:tag])
|
39
|
-
elsif identifier_from_path[:pacticipant_version_number]
|
40
|
-
@version ||= version_service.find_by_pacticipant_name_and_number(identifier_from_path)
|
41
|
-
else
|
42
|
-
@version ||= version_service.find_latest_by_pacticpant_name(identifier_from_path)
|
43
|
-
end
|
49
|
+
@version ||= version_service.find_by_pacticipant_name_and_number(identifier_from_path)
|
44
50
|
end
|
45
51
|
end
|
46
52
|
end
|
@@ -26,7 +26,7 @@ module PactBroker
|
|
26
26
|
end
|
27
27
|
|
28
28
|
def process_post
|
29
|
-
webhook_execution_result = webhook_service.test_execution(webhook, webhook_execution_configuration)
|
29
|
+
webhook_execution_result = webhook_service.test_execution(webhook, webhook_execution_configuration.webhook_context, webhook_execution_configuration)
|
30
30
|
response.headers['Content-Type'] = 'application/hal+json;charset=utf-8'
|
31
31
|
response.body = post_response_body(webhook_execution_result)
|
32
32
|
true
|
data/lib/pact_broker/app.rb
CHANGED
@@ -5,6 +5,7 @@ require 'pact_broker/logging/default_formatter'
|
|
5
5
|
require 'pact_broker/policies'
|
6
6
|
require 'rack-protection'
|
7
7
|
require 'rack/hal_browser'
|
8
|
+
require 'rack/pact_broker/set_base_url'
|
8
9
|
require 'rack/pact_broker/add_pact_broker_version_header'
|
9
10
|
require 'rack/pact_broker/convert_file_extension_to_accept_header'
|
10
11
|
require 'rack/pact_broker/database_transaction'
|
@@ -189,6 +190,8 @@ module PactBroker
|
|
189
190
|
@app_builder.use Rack::Static, :urls => ["/stylesheets", "/css", "/fonts", "/js", "/javascripts", "/images"], :root => PactBroker.project_root.join("public")
|
190
191
|
@app_builder.use Rack::Static, :urls => ["/favicon.ico"], :root => PactBroker.project_root.join("public/images"), header_rules: [[:all, {'Content-Type' => 'image/x-icon'}]]
|
191
192
|
@app_builder.use Rack::PactBroker::ConvertFileExtensionToAcceptHeader
|
193
|
+
# Rack::PactBroker::SetBaseUrl needs to be before the Rack::PactBroker::HalBrowserRedirect
|
194
|
+
@app_builder.use Rack::PactBroker::SetBaseUrl, configuration.base_url
|
192
195
|
|
193
196
|
if configuration.use_hal_browser
|
194
197
|
logger.info "Mounting HAL browser"
|
@@ -9,7 +9,7 @@ end
|
|
9
9
|
|
10
10
|
# Table: certificates
|
11
11
|
# Columns:
|
12
|
-
# id | integer | PRIMARY KEY DEFAULT
|
12
|
+
# id | integer | PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY
|
13
13
|
# uuid | text | NOT NULL
|
14
14
|
# description | text |
|
15
15
|
# content | text | NOT NULL
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module PactBroker
|
2
|
+
module Config
|
3
|
+
class SpaceDelimitedIntegerList < Array
|
4
|
+
def initialize list
|
5
|
+
super(list)
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.integer?(string)
|
9
|
+
(Integer(string) rescue nil) != nil
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.parse(string)
|
13
|
+
array = (string || '')
|
14
|
+
.split(' ')
|
15
|
+
.select { |word| integer?(word) }
|
16
|
+
.collect(&:to_i)
|
17
|
+
SpaceDelimitedIntegerList.new(array)
|
18
|
+
end
|
19
|
+
|
20
|
+
def to_s
|
21
|
+
collect(&:to_s).join(' ')
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'pact_broker/version'
|
2
2
|
require 'pact_broker/error'
|
3
3
|
require 'pact_broker/config/space_delimited_string_list'
|
4
|
+
require 'pact_broker/config/space_delimited_integer_list'
|
4
5
|
require 'semantic_logger'
|
5
6
|
|
6
7
|
module PactBroker
|
@@ -30,6 +31,7 @@ module PactBroker
|
|
30
31
|
:webhook_http_method_whitelist,
|
31
32
|
:webhook_scheme_whitelist,
|
32
33
|
:webhook_host_whitelist,
|
34
|
+
:webhook_http_code_success,
|
33
35
|
:base_equality_only_on_content_that_affects_verification_results,
|
34
36
|
:seed_example_data,
|
35
37
|
:badge_provider_mode,
|
@@ -49,7 +51,7 @@ module PactBroker
|
|
49
51
|
attr_accessor :check_for_potential_duplicate_pacticipant_names
|
50
52
|
attr_accessor :webhook_retry_schedule
|
51
53
|
attr_accessor :user_agent
|
52
|
-
attr_reader :webhook_http_method_whitelist, :webhook_scheme_whitelist, :webhook_host_whitelist
|
54
|
+
attr_reader :webhook_http_method_whitelist, :webhook_scheme_whitelist, :webhook_host_whitelist, :webhook_http_code_success
|
53
55
|
attr_accessor :semver_formats
|
54
56
|
attr_accessor :enable_public_badge_access, :shields_io_base_url, :badge_provider_mode
|
55
57
|
attr_accessor :disable_ssl_verification
|
@@ -105,6 +107,7 @@ module PactBroker
|
|
105
107
|
config.check_for_potential_duplicate_pacticipant_names = true
|
106
108
|
config.disable_ssl_verification = false
|
107
109
|
config.webhook_http_method_whitelist = ['POST']
|
110
|
+
config.webhook_http_code_success = [200, 201, 202, 203, 204, 205, 206]
|
108
111
|
config.webhook_scheme_whitelist = ['https']
|
109
112
|
config.webhook_host_whitelist = []
|
110
113
|
# TODO get rid of unsafe-inline
|
@@ -240,6 +243,10 @@ module PactBroker
|
|
240
243
|
@webhook_http_method_whitelist = parse_space_delimited_string_list_property('webhook_http_method_whitelist', webhook_http_method_whitelist)
|
241
244
|
end
|
242
245
|
|
246
|
+
def webhook_http_code_success= webhook_http_code_success
|
247
|
+
@webhook_http_code_success = parse_space_delimited_integer_list_property('webhook_http_code_success', webhook_http_code_success)
|
248
|
+
end
|
249
|
+
|
243
250
|
def webhook_scheme_whitelist= webhook_scheme_whitelist
|
244
251
|
@webhook_scheme_whitelist = parse_space_delimited_string_list_property('webhook_scheme_whitelist', webhook_scheme_whitelist)
|
245
252
|
end
|
@@ -269,5 +276,15 @@ module PactBroker
|
|
269
276
|
raise ConfigurationError.new("Pact Broker configuration property `#{property_name}` must be a space delimited String or an Array")
|
270
277
|
end
|
271
278
|
end
|
279
|
+
|
280
|
+
def parse_space_delimited_integer_list_property property_name, property_value
|
281
|
+
case property_value
|
282
|
+
when String then Config::SpaceDelimitedIntegerList.parse(property_value)
|
283
|
+
when Array then Config::SpaceDelimitedIntegerList.new(property_value)
|
284
|
+
else
|
285
|
+
raise ConfigurationError.new("Pact Broker configuration property `#{property_name}` must be a space delimited String or an Array with Integer values")
|
286
|
+
end
|
287
|
+
end
|
288
|
+
|
272
289
|
end
|
273
290
|
end
|