pact_broker 2.77.0 → 2.78.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 +9 -0
- data/db/migrations/20210210_create_environments_table.rb +16 -0
- data/lib/pact_broker/api.rb +5 -0
- 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/environment_decorator.rb +30 -0
- data/lib/pact_broker/api/decorators/environments_decorator.rb +21 -0
- data/lib/pact_broker/api/decorators/version_decorator.rb +12 -1
- data/lib/pact_broker/api/pact_broker_urls.rb +8 -0
- data/lib/pact_broker/api/resources/default_base_resource.rb +9 -0
- 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 +14 -0
- data/lib/pact_broker/api/resources/version.rb +2 -2
- data/lib/pact_broker/configuration.rb +1 -0
- data/lib/pact_broker/deployments/environment.rb +15 -0
- data/lib/pact_broker/deployments/environment_service.rb +39 -0
- 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/locale/en.yml +3 -1
- data/lib/pact_broker/services.rb +9 -0
- data/lib/pact_broker/test/test_data_builder.rb +14 -0
- data/lib/pact_broker/version.rb +1 -1
- data/lib/pact_broker/versions/repository.rb +15 -4
- data/lib/pact_broker/versions/service.rb +2 -2
- data/lib/pact_broker/webhooks/webhook_execution_result.rb +4 -1
- 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 +30 -4
- 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/lib/pact_broker/api/contracts/environment_schema_spec.rb +83 -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/webhook_execution_result_spec.rb +56 -0
- data/spec/lib/pact_broker/versions/repository_spec.rb +14 -4
- 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/support/shared_examples_for_responses.rb +11 -0
- metadata +33 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4260e4320105662bc678b63a94054f7485609557b2e967e58ac59512fca69f81
|
4
|
+
data.tar.gz: 4d40a31b9f93c9e08a67e2b1e50cff0fc0c59e0344d3a8672b629d425a93444a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b2dec2c3934c80e7edf5d85370aecf511e8ce8e403486c964182b8f2f397f91bdad7ac886c1dd2955f6d4c9cac52bbac81c22b89d824d7d19fe57d224715ecb5
|
7
|
+
data.tar.gz: 8d60c2beaa8719efe9bfd7551ddda158d4c4f06cdf92884fdbb1312e8a7a306b5fc5754f5f467bd922e688eb37c899ea60c1758de48fce7696553ee57b84fd32
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
<a name="v2.78.0"></a>
|
2
|
+
### v2.78.0 (2021-02-15)
|
3
|
+
|
4
|
+
#### Features
|
5
|
+
|
6
|
+
* support create, update and delete of environment resources (#379) ([410f2e80](/../../commit/410f2e80))
|
7
|
+
* allow version to be created with tags ([798afce9](/../../commit/798afce9))
|
8
|
+
* Follow up for #239 + adding list of success codes to SAVABLE_SETTING_NAMES variable (#388) ([08c0ad09](/../../commit/08c0ad09))
|
9
|
+
|
1
10
|
<a name="v2.77.0"></a>
|
2
11
|
### v2.77.0 (2021-02-11)
|
3
12
|
|
@@ -0,0 +1,16 @@
|
|
1
|
+
Sequel.migration do
|
2
|
+
change do
|
3
|
+
create_table(:environments, charset: 'utf8') do
|
4
|
+
primary_key :id
|
5
|
+
String :uuid, nullable: false
|
6
|
+
String :name, nullable: false
|
7
|
+
String :display_name
|
8
|
+
Boolean :production, nullable: false
|
9
|
+
String :contacts
|
10
|
+
DateTime :created_at, nullable: false
|
11
|
+
DateTime :updated_at, nullable: false
|
12
|
+
index [:uuid], unique: true, name: "environments_uuid_index"
|
13
|
+
index [:name], unique: true, name: "environments_name_index"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/lib/pact_broker/api.rb
CHANGED
@@ -105,6 +105,11 @@ module PactBroker
|
|
105
105
|
add ['dashboard', 'provider', :provider_name, 'consumer', :consumer_name ], Api::Resources::Dashboard, {resource_name: "integration_dashboard"}
|
106
106
|
add ['test','error'], Api::Resources::ErrorTest, {resource_name: "error_test"}
|
107
107
|
|
108
|
+
if PactBroker.feature_enabled?(:environments)
|
109
|
+
add ['environments'], Api::Resources::Environments, { resource_name: "environments" }
|
110
|
+
add ['environments', :environment_uuid], Api::Resources::Environment, { resource_name: "environment" }
|
111
|
+
end
|
112
|
+
|
108
113
|
add ['integrations'], Api::Resources::Integrations, {resource_name: "integrations"}
|
109
114
|
add ['integrations', 'provider', :provider_name, 'consumer', :consumer_name], Api::Resources::Integration, {resource_name: "integration"}
|
110
115
|
add ['metrics'], Api::Resources::Metrics, {resource_name: 'metrics'}
|
@@ -13,6 +13,14 @@ module PactBroker
|
|
13
13
|
predicate(:not_blank?) do | value |
|
14
14
|
value && value.is_a?(String) && value.strip.size > 0
|
15
15
|
end
|
16
|
+
|
17
|
+
predicate(:single_line?) do | value |
|
18
|
+
value && value.is_a?(String) && !value.include?("\n")
|
19
|
+
end
|
20
|
+
|
21
|
+
predicate(:no_spaces?) do | value |
|
22
|
+
value && value.is_a?(String) && !value.include?(" ")
|
23
|
+
end
|
16
24
|
end
|
17
25
|
end
|
18
26
|
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'dry-validation'
|
2
|
+
require 'pact_broker/api/contracts/dry_validation_workarounds'
|
3
|
+
require 'pact_broker/api/contracts/dry_validation_predicates'
|
4
|
+
require 'pact_broker/messages'
|
5
|
+
|
6
|
+
module PactBroker
|
7
|
+
module Api
|
8
|
+
module Contracts
|
9
|
+
class EnvironmentSchema
|
10
|
+
extend DryValidationWorkarounds
|
11
|
+
extend PactBroker::Messages
|
12
|
+
using PactBroker::HashRefinements
|
13
|
+
|
14
|
+
SCHEMA = Dry::Validation.Schema do
|
15
|
+
configure do
|
16
|
+
predicates(DryValidationPredicates)
|
17
|
+
config.messages_file = File.expand_path("../../../locale/en.yml", __FILE__)
|
18
|
+
end
|
19
|
+
required(:name).filled(:str?, :single_line?, :no_spaces?)
|
20
|
+
required(:displayName).filled(:str?, :single_line?)
|
21
|
+
required(:production).filled(included_in?: [true, false])
|
22
|
+
optional(:contacts).each do
|
23
|
+
schema do
|
24
|
+
required(:name).filled(:str?, :single_line?)
|
25
|
+
optional(:details).schema do
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.call(params_with_string_keys)
|
32
|
+
params = params_with_string_keys&.symbolize_keys
|
33
|
+
results = select_first_message(flatten_indexed_messages(SCHEMA.call(params).messages(full: true)))
|
34
|
+
validate_name(params, results)
|
35
|
+
results
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.validate_name(params, results)
|
39
|
+
if (environment_with_same_name = PactBroker::Deployments::EnvironmentService.find_by_name(params[:name]))
|
40
|
+
if environment_with_same_name.uuid != params[:uuid]
|
41
|
+
results[:name] ||= []
|
42
|
+
results[:name] << message('errors.validation.environment_name_must_be_unique', name: params[:name])
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -3,6 +3,7 @@ require 'roar/json/hal'
|
|
3
3
|
require 'pact_broker/api/pact_broker_urls'
|
4
4
|
require 'pact_broker/api/decorators/decorator_context'
|
5
5
|
require 'pact_broker/api/decorators/format_date_time'
|
6
|
+
require 'pact_broker/string_refinements'
|
6
7
|
|
7
8
|
module PactBroker
|
8
9
|
module Api
|
@@ -12,6 +13,16 @@ module PactBroker
|
|
12
13
|
include Roar::JSON::HAL::Links
|
13
14
|
include PactBroker::Api::PactBrokerUrls
|
14
15
|
include FormatDateTime
|
16
|
+
using PactBroker::StringRefinements
|
17
|
+
|
18
|
+
def self.property(name, options={}, &block)
|
19
|
+
if options.delete(:camelize)
|
20
|
+
camelized_name = name.to_s.camelcase(false).to_sym
|
21
|
+
super(name, { as: camelized_name }.merge(options), &block)
|
22
|
+
else
|
23
|
+
super
|
24
|
+
end
|
25
|
+
end
|
15
26
|
end
|
16
27
|
end
|
17
28
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require_relative 'base_decorator'
|
2
|
+
require_relative 'timestamps'
|
3
|
+
|
4
|
+
module PactBroker
|
5
|
+
module Api
|
6
|
+
module Decorators
|
7
|
+
class EnvironmentDecorator < BaseDecorator
|
8
|
+
property :uuid, writeable: false
|
9
|
+
property :name
|
10
|
+
property :display_name, camelize: true
|
11
|
+
property :production
|
12
|
+
|
13
|
+
collection :contacts, class: OpenStruct do
|
14
|
+
property :name
|
15
|
+
property :details
|
16
|
+
end
|
17
|
+
|
18
|
+
include Timestamps
|
19
|
+
|
20
|
+
link :self do | options |
|
21
|
+
{
|
22
|
+
title: 'Environment',
|
23
|
+
name: represented.name,
|
24
|
+
href: environment_url(represented, options[:base_url])
|
25
|
+
}
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'pact_broker/api/decorators/base_decorator'
|
2
|
+
require 'pact_broker/api/decorators/environment_decorator'
|
3
|
+
require 'pact_broker/deployments/environment'
|
4
|
+
|
5
|
+
module PactBroker
|
6
|
+
module Api
|
7
|
+
module Decorators
|
8
|
+
class EnvironmentsDecorator < BaseDecorator
|
9
|
+
|
10
|
+
collection :entries, :as => :environments, :class => PactBroker::Deployments::Environment, :extend => PactBroker::Api::Decorators::EnvironmentDecorator, embedded: true
|
11
|
+
|
12
|
+
link :self do | options |
|
13
|
+
{
|
14
|
+
title: 'Environments',
|
15
|
+
href: options[:resource_url]
|
16
|
+
}
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -10,7 +10,7 @@ module PactBroker
|
|
10
10
|
property :branch
|
11
11
|
property :build_url, as: :buildUrl
|
12
12
|
|
13
|
-
collection :tags, embedded: true,
|
13
|
+
collection :tags, embedded: true, :extend => PactBroker::Api::Decorators::EmbeddedTagDecorator, class: OpenStruct
|
14
14
|
|
15
15
|
include Timestamps
|
16
16
|
|
@@ -63,6 +63,17 @@ module PactBroker
|
|
63
63
|
}]
|
64
64
|
end
|
65
65
|
|
66
|
+
def from_hash(hash, options = {})
|
67
|
+
if hash["tags"]
|
68
|
+
updated_hash = hash.dup
|
69
|
+
updated_hash["_embedded"] ||= {}
|
70
|
+
updated_hash["_embedded"]["tags"] = updated_hash.delete("tags")
|
71
|
+
super(updated_hash, options)
|
72
|
+
else
|
73
|
+
super
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
66
77
|
private
|
67
78
|
|
68
79
|
def sorted_pacts
|
@@ -307,6 +307,14 @@ module PactBroker
|
|
307
307
|
"#{base_url}/groups/#{url_encode(pacticipant_name)}"
|
308
308
|
end
|
309
309
|
|
310
|
+
def environments_url(base_url = '')
|
311
|
+
"#{base_url}/environments"
|
312
|
+
end
|
313
|
+
|
314
|
+
def environment_url(environment, base_url = '')
|
315
|
+
"#{environments_url(base_url)}/#{environment.uuid}"
|
316
|
+
end
|
317
|
+
|
310
318
|
def hal_browser_url target_url, base_url = ''
|
311
319
|
"#{base_url}/hal-browser/browser.html#" + target_url
|
312
320
|
end
|
@@ -243,6 +243,15 @@ module PactBroker
|
|
243
243
|
def decorator_class(name)
|
244
244
|
application_context.decorator_configuration.class_for(name)
|
245
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
|
246
255
|
end
|
247
256
|
end
|
248
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
|
@@ -150,6 +150,20 @@ module PactBroker
|
|
150
150
|
}]
|
151
151
|
}
|
152
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
|
+
|
153
167
|
if PactBroker.feature_enabled?('disable_pacts_for_verification', true)
|
154
168
|
links_hash.delete('pb:provider-pacts-for-verification')
|
155
169
|
links_hash.delete('beta:provider-pacts-for-verification')
|
@@ -24,8 +24,8 @@ module PactBroker
|
|
24
24
|
|
25
25
|
def from_json
|
26
26
|
response_code = version ? 200 : 201
|
27
|
-
parsed_version = Decorators::VersionDecorator.new(
|
28
|
-
@version = version_service.
|
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
29
|
response.body = to_json
|
30
30
|
response_code
|
31
31
|
end
|