pact_broker 2.16.1 → 2.17.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/ISSUE_TEMPLATE.md +22 -0
- data/.github/PULL_REQUEST_TEMPLATE.md +9 -0
- data/CHANGELOG.md +28 -0
- data/DEVELOPER_DOCUMENTATION.md +5 -0
- data/db/migrations/000046_recreate_latest_verifications.rb +2 -2
- data/db/migrations/20180311_optimise_head_matrix.rb +80 -0
- data/db/migrations/20180315_create_verification_sequence.rb +14 -0
- data/db/migrations/migration_helper.rb +1 -1
- data/lib/db.rb +3 -2
- data/lib/pact_broker/api/resources/base_resource.rb +10 -13
- data/lib/pact_broker/api/resources/error_handler.rb +30 -0
- data/lib/pact_broker/api/resources/pact.rb +6 -1
- data/lib/pact_broker/api/resources/pacticipant.rb +8 -2
- data/lib/pact_broker/api/resources/tag.rb +4 -2
- data/lib/pact_broker/api/resources/verifications.rb +5 -1
- data/lib/pact_broker/api/resources/version.rb +3 -1
- data/lib/pact_broker/api.rb +1 -1
- data/lib/pact_broker/config/load.rb +1 -0
- data/lib/pact_broker/configuration.rb +16 -0
- data/lib/pact_broker/matrix/head_row.rb +19 -0
- data/lib/pact_broker/matrix/repository.rb +39 -2
- data/lib/pact_broker/matrix/row.rb +16 -28
- data/lib/pact_broker/matrix/service.rb +6 -2
- data/lib/pact_broker/pacticipants/service.rb +1 -0
- data/lib/pact_broker/ui/controllers/base_controller.rb +2 -1
- data/lib/pact_broker/ui/controllers/error_test.rb +0 -1
- data/lib/pact_broker/ui/controllers/matrix.rb +3 -4
- data/lib/pact_broker/ui/view_models/matrix_line.rb +6 -0
- data/lib/pact_broker/ui/views/matrix/show.haml +14 -10
- data/lib/pact_broker/ui.rb +6 -6
- data/lib/pact_broker/verifications/repository.rb +9 -4
- data/lib/pact_broker/verifications/sequence.rb +34 -0
- data/lib/pact_broker/verifications/service.rb +2 -2
- data/lib/pact_broker/version.rb +1 -1
- data/lib/webmachine/convert_request_to_rack_env.rb +37 -0
- data/script/publish.sh +13 -2
- data/script/recreate-mysql-db.sh +2 -1
- data/script/seed-matrix.rb +1 -1
- data/spec/features/publish_verification_spec.rb +0 -1
- data/spec/features/update_matrix_spec.rb +146 -0
- data/spec/fixtures/foo-bar.json +22 -0
- data/spec/lib/pact_broker/api/resources/error_handler_spec.rb +55 -0
- data/spec/lib/pact_broker/api/resources/verifications_spec.rb +1 -1
- data/spec/lib/pact_broker/configuration_spec.rb +19 -1
- data/spec/lib/pact_broker/matrix/head_row_spec.rb +52 -0
- data/spec/lib/pact_broker/matrix/repository_spec.rb +20 -0
- data/spec/lib/pact_broker/matrix/row_spec.rb +10 -10
- data/spec/lib/pact_broker/pacticipants/service_spec.rb +1 -0
- data/spec/lib/pact_broker/verifications/repository_spec.rb +0 -29
- data/spec/lib/pact_broker/verifications/sequence_spec.rb +47 -0
- data/spec/lib/pact_broker/verifications/service_spec.rb +0 -13
- data/spec/lib/webmachine/convert_request_to_rack_env_spec.rb +68 -0
- data/spec/support/test_data_builder.rb +2 -0
- data/tasks/development.rake +10 -0
- metadata +22 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4a081cfe7629357b678f7769d2fdcf69b75e8e27
|
4
|
+
data.tar.gz: 9c8913b7ad996fb1b7d59429cd47f3451bcb5c5e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f227bb7729f0a18640ba8faffe8432ceb8ad4d6a4e07a491dd0a8443fc351c76140c54ec31143640e37bc8dec9903297eca011bc5e5a882c6fcf74aadcf33317
|
7
|
+
data.tar.gz: d241902a991c46875e6c396ce407a135d40a2a7318039827f624d3425a53516543ff7f9c37b79f8f27bae153fb01faefa4953c52c5419fb8dce553e3498cee7d
|
@@ -0,0 +1,22 @@
|
|
1
|
+
## Software versions
|
2
|
+
|
3
|
+
* **pact-broker gem version:** eg 2.3.1
|
4
|
+
* **pact-broker docker version:** eg 2.3.1-1
|
5
|
+
* **OS**: e.g. Mac OSX 10.11.5
|
6
|
+
* **pact broker client details:** eg. pact-ruby-standalone CLI v 1.23.0
|
7
|
+
|
8
|
+
## Expected behaviour
|
9
|
+
|
10
|
+
TBC
|
11
|
+
|
12
|
+
## Actual behaviour
|
13
|
+
|
14
|
+
TBC
|
15
|
+
|
16
|
+
## Steps to reproduce
|
17
|
+
|
18
|
+
Provide a repository, gist or reproducable code snippet so that we can test the problem.
|
19
|
+
|
20
|
+
## Relevent log files
|
21
|
+
|
22
|
+
Please ensure you set logging to `DEBUG` and attach any relevant log files here (or link from a gist).
|
@@ -0,0 +1,9 @@
|
|
1
|
+
# Pull request guidelines
|
2
|
+
|
3
|
+
* Please [squash your commits](squash) into one commit.
|
4
|
+
* Please use [semantic commit messages](semantic-commit-messages) so that your changes will show up correctly in the generated change log.
|
5
|
+
* Please ensure you have followed the guidelines in [CONTRIBUTING.md](./CONTRIBUTING.md)
|
6
|
+
* And please remove this text before opening a PR
|
7
|
+
|
8
|
+
[semantic-commit-messages]: http://karma-runner.github.io/2.0/dev/git-commit-msg.html
|
9
|
+
[squash]: https://github.com/todotxt/todo.txt-android/wiki/Squash-All-Commits-Related-to-a-Single-Issue-into-a-Single-Commit
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,31 @@
|
|
1
|
+
<a name="v2.17.0"></a>
|
2
|
+
### v2.17.0 (2018-03-30)
|
3
|
+
|
4
|
+
|
5
|
+
#### Features
|
6
|
+
|
7
|
+
* ensure migrations in optimise_head_matrix work on mysql ([35874a9](/../../commit/35874a9))
|
8
|
+
* show verification number in matrix when viewing all results ([5693430](/../../commit/5693430))
|
9
|
+
* redact auth headers from rack env used to report errors ([94f8f13](/../../commit/94f8f13))
|
10
|
+
* add api error reporters ([579fa39](/../../commit/579fa39))
|
11
|
+
* log debug message when loading configuration setting from database ([9ffcc1a](/../../commit/9ffcc1a))
|
12
|
+
* optimise head matrix refresh when adding or deleting tags ([263c2a4](/../../commit/263c2a4))
|
13
|
+
* disable sinatra dump_errors ([d59c7e5](/../../commit/d59c7e5))
|
14
|
+
* send padrino logs to a file in the log dir by default ([7408be0](/../../commit/7408be0))
|
15
|
+
|
16
|
+
* **matrix ui**
|
17
|
+
* add tooltip explaining the situation when verification date is before pact publication date ([fd6e1c9](/../../commit/fd6e1c9))
|
18
|
+
* change default to show all results ([f7bea07](/../../commit/f7bea07))
|
19
|
+
|
20
|
+
|
21
|
+
#### Bug Fixes
|
22
|
+
|
23
|
+
* ensure publishing a verification does not cause a unique constraint violation ([ecfb385](/../../commit/ecfb385))
|
24
|
+
* optimize matrix query to speed up lengthy pact publication times ([e09d528](/../../commit/e09d528))
|
25
|
+
* ensure matrix is updated when pacticipant is deleted ([6c11cbe](/../../commit/6c11cbe))
|
26
|
+
* delete pacticipant labels before deleting pacticipant ([18b9b7e](/../../commit/18b9b7e))
|
27
|
+
|
28
|
+
|
1
29
|
<a name="v2.16.1"></a>
|
2
30
|
### v2.16.1 (2018-03-08)
|
3
31
|
|
data/DEVELOPER_DOCUMENTATION.md
CHANGED
@@ -86,3 +86,8 @@ materialized_head_matrix table (is populated from...)
|
|
86
86
|
-> versions table
|
87
87
|
-> latest_verification_id_for_consumer_version_and_provider_version view
|
88
88
|
-> latest_pact_publication_revision_numbers view
|
89
|
+
|
90
|
+
### Useful to know stuff
|
91
|
+
|
92
|
+
* The supported database types are Postgres (recommended), MySQL (sigh) and Sqlite (just for testing, not recommended for production). Check the travis.yml file for the supported database versions.
|
93
|
+
* Any migration that uses the "order" column has to be defined using the Sequel DSL rather than pure SQL, because the word "order" is a key word, and it has to be escaped correctly and differently on each database (Postgres, MySQL, Sqlite).
|
@@ -5,8 +5,8 @@ Sequel.migration do
|
|
5
5
|
FROM verifications
|
6
6
|
GROUP BY pact_version_id")
|
7
7
|
|
8
|
-
# The most recent verification for each
|
9
|
-
# provider_version is DEPRECATED, use provider_version_number
|
8
|
+
# The most recent verification for each pact_version
|
9
|
+
# provider_version column is DEPRECATED, use provider_version_number
|
10
10
|
create_or_replace_view(:latest_verifications,
|
11
11
|
"SELECT v.id, v.number, v.success, s.number as provider_version, v.build_url, v.pact_version_id, v.execution_date, v.created_at, v.provider_version_id, s.number as provider_version_number
|
12
12
|
FROM verifications v
|
@@ -0,0 +1,80 @@
|
|
1
|
+
require_relative 'migration_helper'
|
2
|
+
|
3
|
+
Sequel.migration do
|
4
|
+
up do
|
5
|
+
pp = :pact_publications
|
6
|
+
# For each consumer_id/provider_id/tag_name, the version order of the latest version that has a pact
|
7
|
+
create_or_replace_view(:latest_tagged_pact_consumer_version_orders,
|
8
|
+
from(:pact_publications)
|
9
|
+
.select_group(
|
10
|
+
Sequel[pp][:provider_id],
|
11
|
+
Sequel[:cv][:pacticipant_id].as(:consumer_id),
|
12
|
+
Sequel[:t][:name].as(:tag_name))
|
13
|
+
.select_append{ max(order).as(latest_consumer_version_order) }
|
14
|
+
.join(:versions, { Sequel[pp][:consumer_version_id] => Sequel[:cv][:id] }, { table_alias: :cv} )
|
15
|
+
.join(:tags, { Sequel[:t][:version_id] => Sequel[pp][:consumer_version_id] }, { table_alias: :t })
|
16
|
+
)
|
17
|
+
|
18
|
+
# Add provider_version_order to original definition
|
19
|
+
v = :verifications
|
20
|
+
create_or_replace_view(:latest_verifications,
|
21
|
+
from(v)
|
22
|
+
.select(
|
23
|
+
Sequel[v][:id],
|
24
|
+
Sequel[v][:number],
|
25
|
+
Sequel[v][:success],
|
26
|
+
Sequel[:s][:number].as(:provider_version),
|
27
|
+
Sequel[v][:build_url],
|
28
|
+
Sequel[v][:pact_version_id],
|
29
|
+
Sequel[v][:execution_date],
|
30
|
+
Sequel[v][:created_at],
|
31
|
+
Sequel[v][:provider_version_id],
|
32
|
+
Sequel[:s][:number].as(:provider_version_number),
|
33
|
+
Sequel[:s][:order].as(:provider_version_order))
|
34
|
+
.join(:latest_verification_numbers,
|
35
|
+
{
|
36
|
+
Sequel[v][:pact_version_id] => Sequel[:lv][:pact_version_id],
|
37
|
+
Sequel[v][:number] => Sequel[:lv][:latest_number]
|
38
|
+
}, { table_alias: :lv })
|
39
|
+
.join(:versions,
|
40
|
+
{
|
41
|
+
Sequel[v][:provider_version_id] => Sequel[:s][:id]
|
42
|
+
}, { table_alias: :s })
|
43
|
+
)
|
44
|
+
|
45
|
+
|
46
|
+
create_or_replace_view(:head_matrix,
|
47
|
+
"
|
48
|
+
select
|
49
|
+
p.consumer_id, p.consumer_name, p.consumer_version_id, p.consumer_version_number, p.consumer_version_order,
|
50
|
+
p.id as pact_publication_id, p.pact_version_id, p.pact_version_sha, p.revision_number as pact_revision_number,
|
51
|
+
p.created_at as pact_created_at,
|
52
|
+
p.provider_id, p.provider_name, lv.provider_version_id, lv.provider_version_number, lv.provider_version_order,
|
53
|
+
lv.id as verification_id, lv.success, lv.number as verification_number, lv.execution_date as verification_executed_at,
|
54
|
+
lv.build_url as verification_build_url,
|
55
|
+
null as consumer_version_tag_name
|
56
|
+
from latest_pact_publications p
|
57
|
+
left outer join latest_verifications lv
|
58
|
+
on p.pact_version_id = lv.pact_version_id
|
59
|
+
|
60
|
+
union all
|
61
|
+
|
62
|
+
select
|
63
|
+
p.consumer_id, p.consumer_name, p.consumer_version_id, p.consumer_version_number, p.consumer_version_order,
|
64
|
+
p.id as pact_publication_id, p.pact_version_id, p.pact_version_sha, p.revision_number as pact_revision_number,
|
65
|
+
p.created_at as pact_created_at,
|
66
|
+
p.provider_id, p.provider_name, lv.provider_version_id, lv.provider_version_number, lv.provider_version_order,
|
67
|
+
lv.id as verification_id, lv.success, lv.number as verification_number, lv.execution_date as verification_executed_at,
|
68
|
+
lv.build_url as verification_build_url,
|
69
|
+
lt.tag_name as consumer_version_tag_name
|
70
|
+
from latest_tagged_pact_consumer_version_orders lt
|
71
|
+
inner join latest_pact_publications_by_consumer_versions p
|
72
|
+
on lt.consumer_id = p.consumer_id
|
73
|
+
and lt.provider_id = p.provider_id
|
74
|
+
and lt.latest_consumer_version_order = p.consumer_version_order
|
75
|
+
left outer join latest_verifications lv
|
76
|
+
on p.pact_version_id = lv.pact_version_id
|
77
|
+
"
|
78
|
+
)
|
79
|
+
end
|
80
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
Sequel.migration do
|
2
|
+
up do
|
3
|
+
create_table(:verification_sequence_number) do
|
4
|
+
Integer :value, null: false
|
5
|
+
end
|
6
|
+
|
7
|
+
start = (from(:verifications).max(:number) || 0) + 100
|
8
|
+
from(:verification_sequence_number).insert(value: start)
|
9
|
+
end
|
10
|
+
|
11
|
+
down do
|
12
|
+
drop_table(:verification_sequence_number)
|
13
|
+
end
|
14
|
+
end
|
data/lib/db.rb
CHANGED
@@ -35,8 +35,9 @@ module DB
|
|
35
35
|
end
|
36
36
|
|
37
37
|
def self.connection_for_env env
|
38
|
-
|
39
|
-
|
38
|
+
config = configuration_for_env(env)
|
39
|
+
logger.info "Connecting to #{env} #{config['adapter']} database #{config['database']}."
|
40
|
+
connect config
|
40
41
|
end
|
41
42
|
|
42
43
|
def self.configuration_for_env env
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'webmachine'
|
2
|
+
require 'pact_broker/api/resources/error_handler'
|
2
3
|
require 'pact_broker/services'
|
3
4
|
require 'pact_broker/api/decorators'
|
4
5
|
require 'pact_broker/logging'
|
@@ -15,17 +16,6 @@ module PactBroker
|
|
15
16
|
|
16
17
|
class InvalidJsonError < StandardError ; end
|
17
18
|
|
18
|
-
class ErrorHandler
|
19
|
-
|
20
|
-
include PactBroker::Logging
|
21
|
-
|
22
|
-
def self.handle_exception e, response
|
23
|
-
logger.error e
|
24
|
-
logger.error e.backtrace
|
25
|
-
response.body = {:message => e.message, :backtrace => e.backtrace }.to_json
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
19
|
class BaseResource < Webmachine::Resource
|
30
20
|
|
31
21
|
include PactBroker::Services
|
@@ -40,8 +30,12 @@ module PactBroker
|
|
40
30
|
PactBroker.configuration.before_resource.call(self)
|
41
31
|
end
|
42
32
|
|
33
|
+
def update_matrix_after_request?
|
34
|
+
false
|
35
|
+
end
|
36
|
+
|
43
37
|
def finish_request
|
44
|
-
if
|
38
|
+
if update_matrix_after_request?
|
45
39
|
matrix_service.refresh(identifier_from_path)
|
46
40
|
end
|
47
41
|
PactBroker.configuration.after_resource.call(self)
|
@@ -86,7 +80,7 @@ module PactBroker
|
|
86
80
|
end
|
87
81
|
|
88
82
|
def handle_exception e
|
89
|
-
PactBroker::Api::Resources::ErrorHandler.
|
83
|
+
PactBroker::Api::Resources::ErrorHandler.call(e, request, response)
|
90
84
|
end
|
91
85
|
|
92
86
|
def params
|
@@ -155,6 +149,9 @@ module PactBroker
|
|
155
149
|
invalid
|
156
150
|
end
|
157
151
|
|
152
|
+
def with_matrix_refresh &block
|
153
|
+
matrix_service.refresh(identifier_from_path, &block)
|
154
|
+
end
|
158
155
|
end
|
159
156
|
end
|
160
157
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'webmachine/convert_request_to_rack_env'
|
2
|
+
require 'pact_broker/configuration'
|
3
|
+
|
4
|
+
module PactBroker
|
5
|
+
module Api
|
6
|
+
module Resources
|
7
|
+
class ErrorHandler
|
8
|
+
|
9
|
+
include PactBroker::Logging
|
10
|
+
|
11
|
+
def self.call e, request, response
|
12
|
+
logger.error e
|
13
|
+
logger.error e.backtrace
|
14
|
+
response.body = {:message => e.message, :backtrace => e.backtrace }.to_json
|
15
|
+
report e, request
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.report e, request
|
19
|
+
PactBroker.configuration.api_error_reporters.each do | error_notifier |
|
20
|
+
begin
|
21
|
+
error_notifier.call(e, env: Webmachine::ConvertRequestToRackEnv.call(request))
|
22
|
+
rescue StandardError => e
|
23
|
+
log_error(e, "Error executing api_error_reporter")
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -87,7 +87,9 @@ module PactBroker
|
|
87
87
|
end
|
88
88
|
|
89
89
|
def delete_resource
|
90
|
-
|
90
|
+
with_matrix_refresh do
|
91
|
+
pact_service.delete(pact_params)
|
92
|
+
end
|
91
93
|
true
|
92
94
|
end
|
93
95
|
|
@@ -101,6 +103,9 @@ module PactBroker
|
|
101
103
|
@pact_params ||= PactBroker::Pacts::PactParams.from_request request, path_info
|
102
104
|
end
|
103
105
|
|
106
|
+
def update_matrix_after_request?
|
107
|
+
request.put? || request.patch?
|
108
|
+
end
|
104
109
|
end
|
105
110
|
end
|
106
111
|
end
|
@@ -45,7 +45,9 @@ module PactBroker
|
|
45
45
|
end
|
46
46
|
|
47
47
|
def delete_resource
|
48
|
-
|
48
|
+
with_matrix_refresh do
|
49
|
+
pacticipant_service.delete pacticipant_name
|
50
|
+
end
|
49
51
|
true
|
50
52
|
end
|
51
53
|
|
@@ -60,7 +62,11 @@ module PactBroker
|
|
60
62
|
end
|
61
63
|
|
62
64
|
def pacticipant_name
|
63
|
-
identifier_from_path[:
|
65
|
+
identifier_from_path[:pacticipant_name]
|
66
|
+
end
|
67
|
+
|
68
|
+
def update_matrix_after_request?
|
69
|
+
request.patch?
|
64
70
|
end
|
65
71
|
end
|
66
72
|
end
|
@@ -22,6 +22,7 @@ module PactBroker
|
|
22
22
|
@tag = tag_service.create identifier_from_path
|
23
23
|
# Make it return a 201 by setting the Location header
|
24
24
|
response.headers["Location"] = tag_url(base_url, tag)
|
25
|
+
matrix_service.refresh_tags(identifier_from_path)
|
25
26
|
end
|
26
27
|
response.body = to_json
|
27
28
|
end
|
@@ -39,10 +40,11 @@ module PactBroker
|
|
39
40
|
end
|
40
41
|
|
41
42
|
def delete_resource
|
42
|
-
|
43
|
+
matrix_service.refresh_tags(identifier_from_path) do
|
44
|
+
tag_service.delete identifier_from_path
|
45
|
+
end
|
43
46
|
true
|
44
47
|
end
|
45
|
-
|
46
48
|
end
|
47
49
|
end
|
48
50
|
|
@@ -55,12 +55,16 @@ module PactBroker
|
|
55
55
|
end
|
56
56
|
|
57
57
|
def next_verification_number
|
58
|
-
@next_verification_number ||= verification_service.
|
58
|
+
@next_verification_number ||= verification_service.next_number
|
59
59
|
end
|
60
60
|
|
61
61
|
def decorator_for model
|
62
62
|
PactBroker::Api::Decorators::VerificationDecorator.new(model)
|
63
63
|
end
|
64
|
+
|
65
|
+
def update_matrix_after_request?
|
66
|
+
request.post?
|
67
|
+
end
|
64
68
|
end
|
65
69
|
end
|
66
70
|
end
|
data/lib/pact_broker/api.rb
CHANGED
@@ -41,7 +41,7 @@ module PactBroker
|
|
41
41
|
# Pacticipants
|
42
42
|
add ['pacticipants'], Api::Resources::Pacticipants, {resource_name: "pacticipants"}
|
43
43
|
add ['pacticipants', 'label', :label_name], PactBroker::Api::Resources::PacticipantsForLabel, {resource_name: "pacticipants_for_label"}
|
44
|
-
add ['pacticipants', :
|
44
|
+
add ['pacticipants', :pacticipant_name], Api::Resources::Pacticipant, {resource_name: "pacticipant"}
|
45
45
|
add ['pacticipants', :pacticipant_name, 'versions'], Api::Resources::Versions, {resource_name: "pacticipant_versions"}
|
46
46
|
add ['pacticipants', :pacticipant_name, 'versions', :pacticipant_version_number], Api::Resources::Version, {resource_name: "pacticipant_version"}
|
47
47
|
add ['pacticipants', :pacticipant_name, 'latest-version', :tag], Api::Resources::Version, {resource_name: "latest_tagged_pacticipant_version"}
|
@@ -32,6 +32,7 @@ module PactBroker
|
|
32
32
|
|
33
33
|
def set_value_on_configuration setting
|
34
34
|
if configuration_attribute_exists? setting
|
35
|
+
logger.debug("Loading #{setting.name} configuration from database.")
|
35
36
|
configuration.send("#{setting.name}=", get_value_from_setting(setting))
|
36
37
|
else
|
37
38
|
logger.warn("Could not load configuration setting \"#{setting.name}\" as there is no matching attribute on the Configuration class")
|
@@ -1,5 +1,9 @@
|
|
1
|
+
require 'pact_broker/error'
|
2
|
+
|
1
3
|
module PactBroker
|
2
4
|
|
5
|
+
class ConfigurationError < PactBroker::Error; end
|
6
|
+
|
3
7
|
def self.configuration
|
4
8
|
@@configuration ||= Configuration.default_configuration
|
5
9
|
end
|
@@ -30,6 +34,7 @@ module PactBroker
|
|
30
34
|
attr_accessor :enable_public_badge_access, :shields_io_base_url
|
31
35
|
attr_accessor :webhook_retry_schedule
|
32
36
|
attr_accessor :disable_ssl_verification
|
37
|
+
attr_reader :api_error_reporters
|
33
38
|
attr_writer :logger
|
34
39
|
|
35
40
|
def initialize
|
@@ -37,6 +42,7 @@ module PactBroker
|
|
37
42
|
@after_resource_hook = ->(resource){}
|
38
43
|
@authenticate_with_basic_auth = nil
|
39
44
|
@authorize = nil
|
45
|
+
@api_error_reporters = []
|
40
46
|
end
|
41
47
|
|
42
48
|
def logger
|
@@ -121,6 +127,16 @@ module PactBroker
|
|
121
127
|
end
|
122
128
|
end
|
123
129
|
|
130
|
+
def add_api_error_reporter &block
|
131
|
+
if block_given?
|
132
|
+
unless block.arity == 2
|
133
|
+
raise ConfigurationError.new("api_error_notfifier block must accept two arguments, 'error' and 'options'")
|
134
|
+
end
|
135
|
+
@api_error_reporters << block
|
136
|
+
nil
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
124
140
|
def enable_badge_resources= enable_badge_resources
|
125
141
|
puts "Pact Broker configuration property `enable_badge_resources` is deprecated. Please use `enable_public_badge_access`"
|
126
142
|
self.enable_public_badge_access = enable_badge_resources
|
@@ -6,6 +6,25 @@ module PactBroker
|
|
6
6
|
# Rows with a nil consumer_tag_name are the overall latest
|
7
7
|
class HeadRow < Row
|
8
8
|
set_dataset(:materialized_head_matrix)
|
9
|
+
|
10
|
+
dataset_module do
|
11
|
+
include PactBroker::Repositories::Helpers
|
12
|
+
include PactBroker::Logging
|
13
|
+
|
14
|
+
def refresh ids
|
15
|
+
return super unless ids[:tag_name]
|
16
|
+
|
17
|
+
logger.debug("Refreshing #{model.table_name} for #{ids}")
|
18
|
+
db = model.db
|
19
|
+
table_name = model.table_name
|
20
|
+
criteria = { consumer_id: ids[:pacticipant_id], consumer_version_tag_name: ids[:tag_name] }
|
21
|
+
db.transaction do
|
22
|
+
db[table_name].where(criteria).delete
|
23
|
+
new_rows = db[source_view_name].where(criteria)
|
24
|
+
db[table_name].insert(new_rows)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
9
28
|
end
|
10
29
|
end
|
11
30
|
end
|
@@ -22,9 +22,46 @@ module PactBroker
|
|
22
22
|
GROUP_BY_PROVIDER = [:consumer_name, :consumer_version_number, :provider_name]
|
23
23
|
GROUP_BY_PACT = [:consumer_name, :provider_name]
|
24
24
|
|
25
|
+
# Use a block when the refresh is caused by a resource deletion
|
26
|
+
# This allows us to store the correct object ids for use afterwards
|
25
27
|
def refresh params
|
26
|
-
|
27
|
-
|
28
|
+
criteria = find_ids_for_pacticipant_names(params)
|
29
|
+
yield if block_given?
|
30
|
+
PactBroker::Matrix::Row.refresh(criteria)
|
31
|
+
PactBroker::Matrix::HeadRow.refresh(criteria)
|
32
|
+
end
|
33
|
+
|
34
|
+
# Only need to update the HeadRow table when tags change
|
35
|
+
# because it only changes which rows are the latest tagged ones -
|
36
|
+
# it doesn't change the actual values in the underlying matrix.
|
37
|
+
def refresh_tags params
|
38
|
+
criteria = find_ids_for_pacticipant_names(params)
|
39
|
+
yield if block_given?
|
40
|
+
PactBroker::Matrix::HeadRow.refresh(criteria)
|
41
|
+
end
|
42
|
+
|
43
|
+
def find_ids_for_pacticipant_names params
|
44
|
+
criteria = {}
|
45
|
+
|
46
|
+
if params[:consumer_name] || params[:provider_name]
|
47
|
+
if params[:consumer_name]
|
48
|
+
pacticipant = PactBroker::Domain::Pacticipant.where(name_like(:name, params[:consumer_name])).single_record
|
49
|
+
criteria[:consumer_id] = pacticipant.id if pacticipant
|
50
|
+
end
|
51
|
+
|
52
|
+
if params[:provider_name]
|
53
|
+
pacticipant = PactBroker::Domain::Pacticipant.where(name_like(:name, params[:provider_name])).single_record
|
54
|
+
criteria[:provider_id] = pacticipant.id if pacticipant
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
if params[:pacticipant_name]
|
59
|
+
pacticipant = PactBroker::Domain::Pacticipant.where(name_like(:name, params[:pacticipant_name])).single_record
|
60
|
+
criteria[:pacticipant_id] = pacticipant.id if pacticipant
|
61
|
+
end
|
62
|
+
|
63
|
+
criteria[:tag_name] = params[:tag_name] if params[:tag_name].is_a?(String) # Could be a sym from resource parameters in api.rb
|
64
|
+
criteria
|
28
65
|
end
|
29
66
|
|
30
67
|
# Return the latest matrix row (pact/verification) for each consumer_version_number/provider_version_number
|
@@ -19,42 +19,30 @@ module PactBroker
|
|
19
19
|
include PactBroker::Repositories::Helpers
|
20
20
|
include PactBroker::Logging
|
21
21
|
|
22
|
-
def refresh
|
23
|
-
logger.debug("Refreshing #{model.table_name} for #{
|
22
|
+
def refresh ids
|
23
|
+
logger.debug("Refreshing #{model.table_name} for #{ids}")
|
24
24
|
|
25
25
|
db = model.db
|
26
26
|
table_name = model.table_name
|
27
27
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
criteria[:consumer_id] = pacticipant.id if pacticipant
|
28
|
+
if ids[:pacticipant_id]
|
29
|
+
db.transaction do
|
30
|
+
db[table_name].where(consumer_id: ids[:pacticipant_id]).or(provider_id: ids[:pacticipant_id]).delete
|
31
|
+
new_rows = db[source_view_name].where(consumer_id: ids[:pacticipant_id]).or(provider_id: ids[:pacticipant_id]).distinct
|
32
|
+
db[table_name].insert(new_rows)
|
34
33
|
end
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
db.transaction do
|
42
|
-
db[table_name].where(criteria).delete
|
43
|
-
db[table_name].insert(db[source_view_name].where(criteria).distinct)
|
44
|
-
end
|
34
|
+
elsif ids.any?
|
35
|
+
accepted_columns = [:consumer_id, :consumer_name, :provider_id, :provider_name]
|
36
|
+
criteria = ids.reject{ |k, v| !accepted_columns.include?(k) }
|
37
|
+
db.transaction do
|
38
|
+
db[table_name].where(criteria).delete
|
39
|
+
db[table_name].insert(db[source_view_name].where(criteria))
|
45
40
|
end
|
46
41
|
end
|
42
|
+
end
|
47
43
|
|
48
|
-
|
49
|
-
|
50
|
-
if pacticipant
|
51
|
-
db.transaction do
|
52
|
-
db[table_name].where(consumer_id: pacticipant.id).or(provider_id: pacticipant.id).delete
|
53
|
-
new_rows = db[source_view_name].where(consumer_id: pacticipant.id).or(provider_id: pacticipant.id).distinct
|
54
|
-
db[table_name].insert(new_rows)
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
44
|
+
def source_view_name
|
45
|
+
model.table_name.to_s.gsub('materialized_', '').to_sym
|
58
46
|
end
|
59
47
|
|
60
48
|
def matching_selectors selectors
|
@@ -9,8 +9,12 @@ module PactBroker
|
|
9
9
|
extend PactBroker::Repositories
|
10
10
|
extend PactBroker::Services
|
11
11
|
|
12
|
-
def refresh params
|
13
|
-
matrix_repository.refresh
|
12
|
+
def refresh params, &block
|
13
|
+
matrix_repository.refresh(params, &block)
|
14
|
+
end
|
15
|
+
|
16
|
+
def refresh_tags params, &block
|
17
|
+
matrix_repository.refresh_tags(params, &block)
|
14
18
|
end
|
15
19
|
|
16
20
|
def find criteria, options = {}
|
@@ -86,6 +86,7 @@ module PactBroker
|
|
86
86
|
connection.run("delete from pact_versions where consumer_id = #{pacticipant.id}")
|
87
87
|
connection.run("delete from versions where pacticipant_id = #{pacticipant.id}")
|
88
88
|
version_repository.delete_by_id version_ids
|
89
|
+
label_repository.delete_by_pacticipant_id(pacticipant.id)
|
89
90
|
connection.run("delete from pacticipants where id = #{pacticipant.id}")
|
90
91
|
end
|
91
92
|
|
@@ -9,8 +9,9 @@ module PactBroker
|
|
9
9
|
|
10
10
|
set :root, File.join(File.dirname(__FILE__), '..')
|
11
11
|
set :show_exceptions, ENV['RACK_ENV'] != 'production'
|
12
|
+
set :dump_errors, false # The padrino logger logs these for us. If this is enabled we get duplicate logging.
|
12
13
|
|
13
14
|
end
|
14
15
|
end
|
15
16
|
end
|
16
|
-
end
|
17
|
+
end
|