pact_broker 2.7.0.beta.1 → 2.7.0.beta.2
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/.gitignore +1 -0
- data/CHANGELOG.md +30 -4
- data/db/migrations/{01_create_pacticipant_table.rb → 000001_create_pacticipant_table.rb} +0 -0
- data/db/migrations/{02_create_versions_table.rb → 000002_create_versions_table.rb} +0 -0
- data/db/migrations/{03_create_pacts_table.rb → 000003_create_pacts_table.rb} +0 -0
- data/db/migrations/{04_create_tags_table.rb → 000004_create_tags_table.rb} +0 -0
- data/db/migrations/{05_add_order_column_to_version.rb → 000005_add_order_column_to_version.rb} +0 -0
- data/db/migrations/{06_make_version_foreign_key_mandatory.rb → 000006_make_version_foreign_key_mandatory.rb} +0 -0
- data/db/migrations/{07_increase_json_content_length.rb → 000007_increase_json_content_length.rb} +0 -0
- data/db/migrations/{08_create_latest_pact_view.rb → 000008_create_latest_pact_view.rb} +0 -0
- data/db/migrations/{09_add_timestamps.rb → 000009_add_timestamps.rb} +0 -0
- data/db/migrations/{10_populate_timestamps.rb → 000010_populate_timestamps.rb} +0 -0
- data/db/migrations/{11_made_timestamps_mandatory.rb → 000011_made_timestamps_mandatory.rb} +0 -0
- data/db/migrations/{12_create_webhooks_table.rb → 000012_create_webhooks_table.rb} +0 -0
- data/db/migrations/{13_add_columns_to_webhooks.rb → 000013_add_columns_to_webhooks.rb} +0 -0
- data/db/migrations/{14_add_timestamps_to_pact_views.rb → 000014_add_timestamps_to_pact_views.rb} +0 -0
- data/db/migrations/{15_create_pact_version_content.rb → 000015_create_pact_version_content.rb} +0 -0
- data/db/migrations/{16_add_pact_content_foreign_key_to_pacts.rb → 000016_add_pact_content_foreign_key_to_pacts.rb} +0 -0
- data/db/migrations/{17_migrate_json_content_to_pact_version_content_table.rb → 000017_migrate_json_content_to_pact_version_content_table.rb} +0 -0
- data/db/migrations/{18_drop_json_content_column_from_pacts.rb → 000018_drop_json_content_column_from_pacts.rb} +0 -0
- data/db/migrations/{19_make_pact_version_content_sha_not_nullable.rb → 000019_make_pact_version_content_sha_not_nullable.rb} +0 -0
- data/db/migrations/{20_add_pact_version_content_sha_to_all_pacts_view.rb → 000020_add_pact_version_content_sha_to_all_pacts_view.rb} +0 -0
- data/db/migrations/{21_recreate_latest_pacts_view.rb → 000021_recreate_latest_pacts_view.rb} +0 -0
- data/db/migrations/{22_create_latest_tagged_pacts_view.rb → 000022_create_latest_tagged_pacts_view.rb} +0 -0
- data/db/migrations/{23_create_pact_versions_table.rb → 000023_create_pact_versions_table.rb} +0 -0
- data/db/migrations/{24_populate_pact_versions.rb → 000024_populate_pact_versions.rb} +0 -0
- data/db/migrations/{25_make_pv_pacticipants_mandatory.rb → 000025_make_pv_pacticipants_mandatory.rb} +0 -0
- data/db/migrations/{26_create_pact_publications.rb → 000026_create_pact_publications.rb} +0 -0
- data/db/migrations/{27_populate_pact_publications.rb → 000027_populate_pact_publications.rb} +0 -0
- data/db/migrations/{28_create_all_pact_publications.rb → 000028_create_all_pact_publications.rb} +0 -0
- data/db/migrations/{29_create_latest_tagged_pact_publications.rb → 000029_create_latest_tagged_pact_publications.rb} +0 -0
- data/db/migrations/{30_drop_old_tables_and_views.rb → 000030_drop_old_tables_and_views.rb} +0 -0
- data/db/migrations/{31_create_verifications.rb → 000031_create_verifications.rb} +0 -0
- data/db/migrations/{32_create_latest_verifications.rb → 000032_create_latest_verifications.rb} +0 -0
- data/db/migrations/{33_create_config_table.rb → 000033_create_config_table.rb} +0 -0
- data/db/migrations/{34_create_index_on_consumer_version_order.rb → 000034_create_index_on_consumer_version_order.rb} +0 -0
- data/db/migrations/{35_create_index_on_names.rb → 000035_create_index_on_names.rb} +0 -0
- data/db/migrations/{36_create_webhook_execution.rb → 000036_create_webhook_execution.rb} +0 -0
- data/db/migrations/{37_create_labels_table.rb → 000037_create_labels_table.rb} +0 -0
- data/db/migrations/{38_create_triggered_webhooks_table.rb → 000038_create_triggered_webhooks_table.rb} +0 -0
- data/db/migrations/{39_add_triggered_webhooks_fk_to_execution.rb → 000039_add_triggered_webhooks_fk_to_execution.rb} +0 -0
- data/db/migrations/{40_create_latest_triggered_webhooks_view.rb → 000040_create_latest_triggered_webhooks_view.rb} +0 -0
- data/db/migrations/{41_migrate_execution_data.rb → 000041_migrate_execution_data.rb} +0 -0
- data/db/migrations/{42_delete_orphan_webhook_data.rb → 000042_delete_orphan_webhook_data.rb} +0 -0
- data/db/migrations/{43_add_provider_version_to_verification.rb → 000043_add_provider_version_to_verification.rb} +0 -0
- data/db/migrations/{44_populate_verifications_provider_version_id.rb → 000044_populate_verifications_provider_version_id.rb} +0 -0
- data/db/migrations/{45_set_verification_provider_number_nullable.rb → 000045_set_verification_provider_number_nullable.rb} +0 -0
- data/db/migrations/{46_recreate_latest_verifications.rb → 000046_recreate_latest_verifications.rb} +0 -0
- data/db/migrations/{47_create_all_verifications.rb → 000047_create_all_verifications.rb} +4 -0
- data/db/pact_broker_database.sqlite3 +0 -0
- data/db/test/backwards_compatibility/Appraisals +8 -0
- data/db/test/backwards_compatibility/Rakefile +23 -6
- data/db/test/backwards_compatibility/gemfiles/1.18.0.gemfile.lock +20 -19
- data/db/test/backwards_compatibility/gemfiles/2.0.0.gemfile.lock +20 -19
- data/db/test/backwards_compatibility/gemfiles/2.1.0.gemfile.lock +20 -19
- data/db/test/backwards_compatibility/gemfiles/2.2.0.gemfile.lock +29 -26
- data/db/test/backwards_compatibility/gemfiles/2.3.0.gemfile.lock +29 -26
- data/db/test/backwards_compatibility/gemfiles/2.4.2.gemfile.lock +29 -26
- data/db/test/backwards_compatibility/gemfiles/2.5.1.gemfile +13 -0
- data/db/test/backwards_compatibility/gemfiles/2.5.1.gemfile.lock +199 -0
- data/db/test/backwards_compatibility/gemfiles/2.6.0.gemfile +13 -0
- data/db/test/backwards_compatibility/gemfiles/2.6.0.gemfile.lock +199 -0
- data/db/test/backwards_compatibility/gemfiles/head.gemfile.lock +30 -27
- data/db/test/backwards_compatibility/spec/publish_pact_spec.rb +1 -1
- data/db/test/change_migration_strategy/Rakefile +21 -0
- data/db/test/change_migration_strategy/before/Gemfile +6 -0
- data/lib/pact_broker/api/decorators/matrix_decorator.rb +19 -1
- data/lib/pact_broker/api/decorators/matrix_text_decorator.rb +29 -0
- data/lib/pact_broker/api/renderers/html_pact_renderer.rb +1 -1
- data/lib/pact_broker/api/resources/matrix.rb +21 -11
- data/lib/pact_broker/api/resources/matrix_for_consumer_and_provider.rb +2 -2
- data/lib/pact_broker/app.rb +27 -2
- data/lib/pact_broker/db/migrate.rb +1 -1
- data/lib/pact_broker/db/version.rb +4 -5
- data/lib/pact_broker/db.rb +1 -1
- data/lib/pact_broker/domain/relationship.rb +4 -24
- data/lib/pact_broker/matrix/parse_query.rb +22 -0
- data/lib/pact_broker/matrix/repository.rb +57 -26
- data/lib/pact_broker/matrix/service.rb +23 -16
- data/lib/pact_broker/pacticipants/service.rb +5 -21
- data/lib/pact_broker/pacts/pact_publication.rb +0 -4
- data/lib/pact_broker/pacts/repository.rb +1 -1
- data/lib/pact_broker/tags/service.rb +1 -0
- data/lib/pact_broker/ui/controllers/matrix.rb +3 -2
- data/lib/pact_broker/ui/controllers/relationships.rb +2 -2
- data/lib/pact_broker/ui/view_models/matrix_line.rb +38 -5
- data/lib/pact_broker/ui/view_models/relationship.rb +1 -19
- data/lib/pact_broker/ui/views/matrix/show.haml +18 -3
- data/lib/pact_broker/ui/views/relationships/show.haml +2 -2
- data/lib/pact_broker/verifications/repository.rb +0 -3
- data/lib/pact_broker/version.rb +1 -1
- data/lib/rack/hal_browser/redirect.rb +2 -2
- data/lib/rack/pact_broker/configurable_make_it_later.rb +24 -0
- data/lib/rack/pact_broker/no_auth.rb +13 -0
- data/pact_broker.gemspec +1 -0
- data/script/seed-matrix.rb +71 -0
- data/script/seed.rb +0 -5
- data/spec/features/get_matrix_spec.rb +4 -1
- data/spec/lib/pact_broker/api/decorators/matrix_decorator_spec.rb +41 -7
- data/spec/lib/pact_broker/api/resources/matrix_spec.rb +6 -2
- data/spec/lib/pact_broker/app_spec.rb +69 -0
- data/spec/lib/pact_broker/domain/relationship_spec.rb +1 -1
- data/spec/lib/pact_broker/matrix/parse_query_spec.rb +79 -0
- data/spec/lib/pact_broker/matrix/repository_spec.rb +244 -12
- data/spec/lib/pact_broker/matrix/service_spec.rb +39 -9
- data/spec/lib/pact_broker/pacticipants/service_spec.rb +4 -78
- data/spec/lib/pact_broker/pacts/repository_spec.rb +14 -16
- data/spec/lib/pact_broker/ui/view_models/relationship_spec.rb +5 -4
- data/spec/migrations/change_migration_strategy_spec.rb +86 -0
- data/spec/service_consumers/provider_states_for_pact_broker_client.rb +34 -0
- data/spec/support/test_data_builder.rb +6 -0
- data/tasks/database.rb +1 -1
- metadata +78 -52
- data/lib/pact_broker/ui/views/relationships/show-prod-tags.haml +0 -83
- data/spec/lib/pact_broker/pacts/pact_publication_spec.rb +0 -35
|
@@ -7,26 +7,22 @@ module PactBroker
|
|
|
7
7
|
|
|
8
8
|
attr_reader :consumer, :provider, :latest_pact, :latest_verification, :webhooks
|
|
9
9
|
|
|
10
|
-
def initialize consumer, provider, latest_pact = nil,
|
|
10
|
+
def initialize consumer, provider, latest_pact = nil, latest_verification = nil, webhooks = [], triggered_webhooks = []
|
|
11
11
|
@consumer = consumer
|
|
12
12
|
@provider = provider
|
|
13
13
|
@latest_pact = latest_pact
|
|
14
|
-
@latest = latest
|
|
15
14
|
@latest_verification = latest_verification
|
|
16
15
|
@webhooks = webhooks
|
|
17
16
|
@triggered_webhooks = triggered_webhooks
|
|
18
|
-
@tags = tags
|
|
19
17
|
end
|
|
20
18
|
|
|
21
|
-
def self.create consumer, provider, latest_pact,
|
|
22
|
-
new consumer, provider, latest_pact,
|
|
19
|
+
def self.create consumer, provider, latest_pact, latest_verification, webhooks = [], triggered_webhooks = []
|
|
20
|
+
new consumer, provider, latest_pact, latest_verification, webhooks, triggered_webhooks
|
|
23
21
|
end
|
|
24
22
|
|
|
25
23
|
def eq? other
|
|
26
24
|
Relationship === other && other.consumer == consumer && other.provider == provider &&
|
|
27
|
-
other.latest_pact == latest_pact &&
|
|
28
|
-
other.latest? == latest? &&
|
|
29
|
-
other.latest_verification == latest_verification &&
|
|
25
|
+
other.latest_pact == latest_pact && other.latest_verification == latest_verification &&
|
|
30
26
|
other.webhooks == webhooks
|
|
31
27
|
end
|
|
32
28
|
|
|
@@ -46,22 +42,6 @@ module PactBroker
|
|
|
46
42
|
@latest_pact
|
|
47
43
|
end
|
|
48
44
|
|
|
49
|
-
def latest?
|
|
50
|
-
@latest
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
def consumer_version_number
|
|
54
|
-
@latest_pact.consumer_version_number
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
def provider_version_number
|
|
58
|
-
@latest_verification ? @latest_verification.provider_version_number : nil
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
def tag_names
|
|
62
|
-
@tags
|
|
63
|
-
end
|
|
64
|
-
|
|
65
45
|
def any_webhooks?
|
|
66
46
|
@webhooks.any?
|
|
67
47
|
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
require 'rack/utils'
|
|
2
|
+
|
|
3
|
+
module PactBroker
|
|
4
|
+
module Matrix
|
|
5
|
+
class ParseQuery
|
|
6
|
+
def self.call query
|
|
7
|
+
params = Rack::Utils.parse_nested_query(query)
|
|
8
|
+
selectors = (params['q'] || []).collect{ |i| { pacticipant_name: i['pacticipant'], pacticipant_version_number: i['version'] } }
|
|
9
|
+
options = {}
|
|
10
|
+
if params.key?('success') && params['success'].is_a?(Array)
|
|
11
|
+
options[:success] = params['success'].collect do | value |
|
|
12
|
+
value == '' ? nil : value == 'true'
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
if params.key?('success') && params['success'].is_a?(String)
|
|
16
|
+
options[:success] = [params['success'] == '' ? nil : params['success'] == 'true']
|
|
17
|
+
end
|
|
18
|
+
return selectors, options
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -6,46 +6,77 @@ module PactBroker
|
|
|
6
6
|
include PactBroker::Repositories::Helpers
|
|
7
7
|
include PactBroker::Repositories
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
9
|
+
# Return the latest matrix row (pact/verification) for each consumer_version_number/provider_version_number
|
|
10
|
+
def find selectors, options = {}
|
|
11
|
+
# The group with the nil provider_version_numbers will be the results of the left outer join
|
|
12
|
+
# that don't have verifications, so we need to include them all.
|
|
13
|
+
lines = find_all(selectors)
|
|
14
|
+
.group_by{|line| [line[:consumer_name], line[:consumer_version_number], line[:provider_name], line[:provider_version_number]]}
|
|
15
|
+
.values
|
|
16
|
+
.collect{ | lines | lines.first[:provider_version_number].nil? ? lines : lines.last }
|
|
17
|
+
.flatten
|
|
13
18
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
# Ihe value is nil, it means all versions for that pacticipant are to be included
|
|
17
|
-
# Returns a list of matrix lines indicating the compatible versions
|
|
18
|
-
#
|
|
19
|
-
def find_compatible_pacticipant_versions criteria
|
|
20
|
-
version_ids = criteria.reject{ |key, value| !value }.collect do | key, value |
|
|
21
|
-
version_repository.find_by_pacticipant_name_and_number(key, value).id
|
|
19
|
+
if options.key?(:success)
|
|
20
|
+
lines = lines.select{ |l| options[:success].include?(l[:success]) }
|
|
22
21
|
end
|
|
23
22
|
|
|
24
|
-
|
|
23
|
+
lines
|
|
24
|
+
end
|
|
25
25
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
.
|
|
30
|
-
|
|
26
|
+
def find_for_consumer_and_provider pacticipant_1_name, pacticipant_2_name
|
|
27
|
+
selectors = [{ pacticipant_name: pacticipant_1_name }, { pacticipant_name: pacticipant_2_name }]
|
|
28
|
+
find_all(selectors)
|
|
29
|
+
.sort{|l1, l2| l2[:consumer_version_order] <=> l1[:consumer_version_order]}
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def find_compatible_pacticipant_versions selectors
|
|
33
|
+
find(selectors).select{ |line | line[:success] }
|
|
31
34
|
end
|
|
32
35
|
|
|
33
|
-
|
|
34
|
-
|
|
36
|
+
##
|
|
37
|
+
# If the version is nil, it means all versions for that pacticipant are to be included
|
|
38
|
+
#
|
|
39
|
+
def find_all selectors
|
|
40
|
+
query = PactBroker::Pacts::LatestPactPublicationsByConsumerVersion
|
|
35
41
|
.select_append(:consumer_version_number, :provider_name, :consumer_name, :provider_version_id, :provider_version_number, :success)
|
|
36
42
|
.select_append(Sequel[:latest_pact_publications_by_consumer_versions][:created_at].as(:pact_created_at))
|
|
37
43
|
.select_append(Sequel[:all_verifications][:number])
|
|
38
44
|
.select_append(Sequel[:all_verifications][:id].as(:verification_id))
|
|
39
45
|
.select_append(Sequel[:execution_date].as(:verification_executed_at))
|
|
40
46
|
.left_outer_join(:all_verifications, pact_version_id: :pact_version_id)
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
+
|
|
48
|
+
if selectors.size == 1
|
|
49
|
+
query = where_consumer_or_provider_is(selectors.first, query)
|
|
50
|
+
else
|
|
51
|
+
query = where_consumer_and_provider_within(selectors, query)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
query.order(:execution_date, :verification_id)
|
|
47
55
|
.collect(&:values)
|
|
48
56
|
end
|
|
57
|
+
|
|
58
|
+
def where_consumer_and_provider_within selectors, query
|
|
59
|
+
query.where{
|
|
60
|
+
Sequel.&(
|
|
61
|
+
Sequel.|(
|
|
62
|
+
*selectors.collect{ |s| s[:pacticipant_version_number] ? Sequel.&(consumer_name: s[:pacticipant_name], consumer_version_number: s[:pacticipant_version_number]) : Sequel.&(consumer_name: s[:pacticipant_name]) }
|
|
63
|
+
),
|
|
64
|
+
Sequel.|(
|
|
65
|
+
*(selectors.collect{ |s| s[:pacticipant_version_number] ? Sequel.&(provider_name: s[:pacticipant_name], provider_version_number: s[:pacticipant_version_number]) : Sequel.&(provider_name: s[:pacticipant_name]) } +
|
|
66
|
+
selectors.collect{ |s| Sequel.&(provider_name: s[:pacticipant_name], provider_version_number: nil) })
|
|
67
|
+
)
|
|
68
|
+
)
|
|
69
|
+
}
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def where_consumer_or_provider_is s, query
|
|
73
|
+
query.where{
|
|
74
|
+
Sequel.|(
|
|
75
|
+
s[:pacticipant_version_number] ? Sequel.&(consumer_name: s[:pacticipant_name], consumer_version_number: s[:pacticipant_version_number]) : Sequel.&(consumer_name: s[:pacticipant_name]),
|
|
76
|
+
s[:pacticipant_version_number] ? Sequel.&(provider_name: s[:pacticipant_name], provider_version_number: s[:pacticipant_version_number]) : Sequel.&(provider_name: s[:pacticipant_name])
|
|
77
|
+
)
|
|
78
|
+
}
|
|
79
|
+
end
|
|
49
80
|
end
|
|
50
81
|
end
|
|
51
82
|
end
|
|
@@ -3,14 +3,17 @@ require 'pact_broker/repositories'
|
|
|
3
3
|
module PactBroker
|
|
4
4
|
module Matrix
|
|
5
5
|
module Service
|
|
6
|
-
VERSION_SELECTOR_PATTERN = %r{(^[^/]+)/version/[^/]+$}.freeze
|
|
7
6
|
|
|
8
7
|
extend self
|
|
9
8
|
extend PactBroker::Repositories
|
|
10
9
|
extend PactBroker::Services
|
|
11
10
|
|
|
12
|
-
def find
|
|
13
|
-
matrix_repository.find
|
|
11
|
+
def find criteria, options = {}
|
|
12
|
+
matrix_repository.find criteria, options
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def find_for_consumer_and_provider params
|
|
16
|
+
matrix_repository.find_for_consumer_and_provider params[:consumer_name], params[:provider_name]
|
|
14
17
|
end
|
|
15
18
|
|
|
16
19
|
def find_compatible_pacticipant_versions criteria
|
|
@@ -19,30 +22,34 @@ module PactBroker
|
|
|
19
22
|
|
|
20
23
|
def validate_selectors selectors
|
|
21
24
|
error_messages = []
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
+
|
|
26
|
+
selectors.each do | selector |
|
|
27
|
+
if selector[:pacticipant_name].nil? && selector[:pacticipant_version_number].nil?
|
|
28
|
+
error_messages << "Please specify the pacticipant name and version"
|
|
29
|
+
elsif selector[:pacticipant_name].nil?
|
|
30
|
+
error_messages << "Please specify the pacticipant name"
|
|
25
31
|
end
|
|
26
32
|
end
|
|
27
33
|
|
|
28
|
-
selectors.each do |
|
|
29
|
-
|
|
30
|
-
pacticipant_name
|
|
31
|
-
unless pacticipant_service.find_pacticipant_by_name(pacticipant_name)
|
|
32
|
-
error_messages << "Pacticipant '#{pacticipant_name}' not found"
|
|
33
|
-
end
|
|
34
|
+
selectors.collect{ |selector| selector[:pacticipant_name] }.compact.each do | pacticipant_name |
|
|
35
|
+
unless pacticipant_service.find_pacticipant_by_name(pacticipant_name)
|
|
36
|
+
error_messages << "Pacticipant '#{pacticipant_name}' not found"
|
|
34
37
|
end
|
|
35
38
|
end
|
|
36
39
|
|
|
37
40
|
if error_messages.empty?
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
error_messages << "No pact or verification found for #{
|
|
41
|
+
selectors.each do | selector |
|
|
42
|
+
if selector[:pacticipant_version_number]
|
|
43
|
+
version = version_service.find_by_pacticipant_name_and_number(pacticipant_name: selector[:pacticipant_name], pacticipant_version_number: selector[:pacticipant_version_number])
|
|
44
|
+
error_messages << "No pact or verification found for #{selector[:pacticipant_name]} version #{selector[:pacticipant_version_number]}" if version.nil?
|
|
42
45
|
end
|
|
43
46
|
end
|
|
44
47
|
end
|
|
45
48
|
|
|
49
|
+
if selectors.size == 0
|
|
50
|
+
error_messages << "Please provide 1 or more version selectors."
|
|
51
|
+
end
|
|
52
|
+
|
|
46
53
|
error_messages
|
|
47
54
|
end
|
|
48
55
|
end
|
|
@@ -62,27 +62,11 @@ module PactBroker
|
|
|
62
62
|
def self.find_relationships
|
|
63
63
|
pact_repository.find_latest_pacts
|
|
64
64
|
.collect do | pact|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
end
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
def self.build_latest_pact_relationship pact
|
|
73
|
-
latest_verification = verification_service.find_latest_verification_for(pact.consumer, pact.provider)
|
|
74
|
-
webhooks = webhook_service.find_by_consumer_and_provider pact.consumer, pact.provider
|
|
75
|
-
triggered_webhooks = webhook_service.find_latest_triggered_webhooks pact.consumer, pact.provider
|
|
76
|
-
tag_names = pact.consumer_version_tag_names.select{ |name| name == 'prod' || name == 'production' }
|
|
77
|
-
PactBroker::Domain::Relationship.create pact.consumer, pact.provider, pact, true, latest_verification, webhooks, triggered_webhooks, tag_names
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
def self.build_relationship_for_tagged_pact latest_pact, tag
|
|
81
|
-
pact = pact_service.find_latest_pact consumer_name: latest_pact.consumer_name, provider_name: latest_pact.provider_name, tag: tag
|
|
82
|
-
return nil unless pact
|
|
83
|
-
return nil if pact.id == latest_pact.id
|
|
84
|
-
verification = verification_repository.find_latest_verification_for pact.consumer_name, pact.provider_name, tag
|
|
85
|
-
PactBroker::Domain::Relationship.create pact.consumer, pact.provider, pact, false, verification, [], [], [tag]
|
|
65
|
+
latest_verification = verification_service.find_latest_verification_for(pact.consumer, pact.provider)
|
|
66
|
+
webhooks = webhook_service.find_by_consumer_and_provider pact.consumer, pact.provider
|
|
67
|
+
triggered_webhooks = webhook_service.find_latest_triggered_webhooks pact.consumer, pact.provider
|
|
68
|
+
PactBroker::Domain::Relationship.create pact.consumer, pact.provider, pact, latest_verification, webhooks, triggered_webhooks
|
|
69
|
+
end
|
|
86
70
|
end
|
|
87
71
|
|
|
88
72
|
def self.update params
|
|
@@ -86,7 +86,7 @@ module PactBroker
|
|
|
86
86
|
end
|
|
87
87
|
|
|
88
88
|
def find_latest_pacts
|
|
89
|
-
LatestPactPublications.order(:consumer_name, :provider_name).collect(&:
|
|
89
|
+
LatestPactPublications.order(:consumer_name, :provider_name).collect(&:to_domain_without_tags)
|
|
90
90
|
end
|
|
91
91
|
|
|
92
92
|
def find_latest_pact(consumer_name, provider_name, tag = nil)
|
|
@@ -10,8 +10,9 @@ module PactBroker
|
|
|
10
10
|
include PactBroker::Services
|
|
11
11
|
|
|
12
12
|
get "/provider/:provider_name/consumer/:consumer_name" do
|
|
13
|
-
|
|
14
|
-
lines =
|
|
13
|
+
selectors = [{ pacticipant_name: params[:consumer_name] }, { pacticipant_name: params[:provider_name] } ]
|
|
14
|
+
lines = matrix_service.find(selectors)
|
|
15
|
+
lines = lines.collect{|line| PactBroker::UI::ViewDomain::MatrixLine.new(line) }.sort
|
|
15
16
|
locals = {
|
|
16
17
|
lines: lines,
|
|
17
18
|
title: "The Matrix",
|
|
@@ -11,8 +11,8 @@ module PactBroker
|
|
|
11
11
|
|
|
12
12
|
get "/" do
|
|
13
13
|
view_model = ViewDomain::Relationships.new(pacticipant_service.find_relationships)
|
|
14
|
-
|
|
15
|
-
haml
|
|
14
|
+
|
|
15
|
+
haml :'relationships/show', {locals: {relationships: view_model, title: "Pacts"}, layout: :'layouts/main'}
|
|
16
16
|
end
|
|
17
17
|
|
|
18
18
|
end
|
|
@@ -30,6 +30,10 @@ module PactBroker
|
|
|
30
30
|
@line[:number]
|
|
31
31
|
end
|
|
32
32
|
|
|
33
|
+
def consumer_name
|
|
34
|
+
@line[:consumer_name]
|
|
35
|
+
end
|
|
36
|
+
|
|
33
37
|
def consumer_version_number
|
|
34
38
|
@line[:consumer_version_number]
|
|
35
39
|
end
|
|
@@ -42,8 +46,16 @@ module PactBroker
|
|
|
42
46
|
@line[:consumer_version_order]
|
|
43
47
|
end
|
|
44
48
|
|
|
49
|
+
def provider_name
|
|
50
|
+
@line[:provider_name]
|
|
51
|
+
end
|
|
52
|
+
|
|
45
53
|
def provider_version_number
|
|
46
|
-
@line[:
|
|
54
|
+
@line[:provider_version_number]
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def provider_version_order
|
|
58
|
+
@line[:provider_version_order]
|
|
47
59
|
end
|
|
48
60
|
|
|
49
61
|
def provider_version_number_url
|
|
@@ -58,12 +70,33 @@ module PactBroker
|
|
|
58
70
|
end
|
|
59
71
|
end
|
|
60
72
|
|
|
73
|
+
def orderable_fields
|
|
74
|
+
[consumer_name, provider_name, consumer_version_order, provider_version_order]
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def <=> other
|
|
78
|
+
self.orderable_fields <=> other.orderable_fields
|
|
79
|
+
end
|
|
80
|
+
|
|
61
81
|
def verification_status
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
82
|
+
if @line[:verification_executed_at]
|
|
83
|
+
DateHelper.distance_of_time_in_words(@line[:verification_executed_at], DateTime.now) + " ago"
|
|
84
|
+
else
|
|
85
|
+
''
|
|
66
86
|
end
|
|
87
|
+
# case @line[:success]
|
|
88
|
+
# when true then "Verified"
|
|
89
|
+
# when false then "Failed"
|
|
90
|
+
# else ''
|
|
91
|
+
# end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def pact_publication_date
|
|
95
|
+
DateHelper.distance_of_time_in_words(@line[:pact_created_at], DateTime.now) + " ago"
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def pact_published_order
|
|
99
|
+
@line[:pact_created_at].to_time.to_i
|
|
67
100
|
end
|
|
68
101
|
|
|
69
102
|
def verification_status_class
|
|
@@ -21,18 +21,6 @@ module PactBroker
|
|
|
21
21
|
@relationship.provider_name
|
|
22
22
|
end
|
|
23
23
|
|
|
24
|
-
def consumer_version_number
|
|
25
|
-
@relationship.consumer_version_number
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
def provider_version_number
|
|
29
|
-
@relationship.provider_version_number
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
def tag_names
|
|
33
|
-
@relationship.tag_names.any? ? " (#{@relationship.tag_names.join(', ')}) ": ""
|
|
34
|
-
end
|
|
35
|
-
|
|
36
24
|
def consumer_group_url
|
|
37
25
|
Helpers::URLHelper.group_url consumer_name
|
|
38
26
|
end
|
|
@@ -41,7 +29,7 @@ module PactBroker
|
|
|
41
29
|
Helpers::URLHelper.group_url provider_name
|
|
42
30
|
end
|
|
43
31
|
|
|
44
|
-
def
|
|
32
|
+
def latest_pact_url
|
|
45
33
|
"#{pactigration_base_url('', @relationship)}/latest"
|
|
46
34
|
end
|
|
47
35
|
|
|
@@ -50,7 +38,6 @@ module PactBroker
|
|
|
50
38
|
end
|
|
51
39
|
|
|
52
40
|
def webhook_label
|
|
53
|
-
return "" unless show_webhook_status?
|
|
54
41
|
case @relationship.webhook_status
|
|
55
42
|
when :none then "Create"
|
|
56
43
|
when :success, :failure then webhook_last_execution_date
|
|
@@ -60,7 +47,6 @@ module PactBroker
|
|
|
60
47
|
end
|
|
61
48
|
|
|
62
49
|
def webhook_status
|
|
63
|
-
return "" unless show_webhook_status?
|
|
64
50
|
case @relationship.webhook_status
|
|
65
51
|
when :success then "success"
|
|
66
52
|
when :failure then "danger"
|
|
@@ -69,10 +55,6 @@ module PactBroker
|
|
|
69
55
|
end
|
|
70
56
|
end
|
|
71
57
|
|
|
72
|
-
def show_webhook_status?
|
|
73
|
-
@relationship.latest?
|
|
74
|
-
end
|
|
75
|
-
|
|
76
58
|
def webhook_last_execution_date
|
|
77
59
|
PactBroker::DateHelper.distance_of_time_in_words(@relationship.last_webhook_execution_date, DateTime.now) + " ago"
|
|
78
60
|
end
|
|
@@ -11,21 +11,36 @@
|
|
|
11
11
|
%table.table.table-bordered.table-striped{id: 'matrix'}
|
|
12
12
|
%thead
|
|
13
13
|
%th.consumer
|
|
14
|
-
= "
|
|
14
|
+
= "Consumer"
|
|
15
|
+
%span.glyphicon.glyphicon-sort.sort
|
|
16
|
+
%th.consumer-version
|
|
17
|
+
= "Version"
|
|
18
|
+
%span.glyphicon.glyphicon-sort.sort
|
|
19
|
+
%th.pact-published
|
|
20
|
+
= "Pact Published"
|
|
15
21
|
%span.glyphicon.glyphicon-sort.sort
|
|
16
22
|
%th.provider
|
|
17
|
-
= "
|
|
23
|
+
= "Provider"
|
|
24
|
+
%span.glyphicon.glyphicon-sort.sort
|
|
25
|
+
%th.provider-version
|
|
26
|
+
= "Version"
|
|
18
27
|
%span.glyphicon.glyphicon-sort.sort
|
|
19
28
|
%th.verification-result
|
|
20
|
-
|
|
29
|
+
Pact verified
|
|
21
30
|
%span.glyphicon.glyphicon-sort.sort
|
|
22
31
|
%tbody
|
|
23
32
|
- lines.each do | line |
|
|
24
33
|
%tr
|
|
34
|
+
%td.consumer{'data-sort-value' => line.consumer_name}
|
|
35
|
+
= line.consumer_name
|
|
25
36
|
%td.consumer-version{'data-sort-value' => line.consumer_version_order}
|
|
26
37
|
%a{href: line.consumer_version_number_url}
|
|
27
38
|
= line.consumer_version_number
|
|
39
|
+
%td.pact-published{'data-sort-value' => line.pact_published_order}
|
|
40
|
+
= line.pact_publication_date
|
|
28
41
|
%td.provider{'data-sort-value' => line.provider_version_order}
|
|
42
|
+
= line.provider_name
|
|
43
|
+
%td.provider-version{'data-sort-value' => line.provider_version_order}
|
|
29
44
|
%a{href: line.provider_version_number_url}
|
|
30
45
|
= line.provider_version_number
|
|
31
46
|
%td.verification-result{class: line.verification_status_class}
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
%ul
|
|
10
10
|
%li.navbar-right
|
|
11
11
|
%a{href: '/hal-browser/browser.html'}
|
|
12
|
-
|
|
12
|
+
API Browser
|
|
13
13
|
.container
|
|
14
14
|
%h1.page-header
|
|
15
15
|
Pacts
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
%a{:href => relationship.consumer_group_url}
|
|
41
41
|
= relationship.consumer_name
|
|
42
42
|
%td.pact
|
|
43
|
-
%a{:href => relationship.
|
|
43
|
+
%a{:href => relationship.latest_pact_url, :title => "View pact"}
|
|
44
44
|
%span.pact
|
|
45
45
|
%td.provider
|
|
46
46
|
%a{:href => relationship.provider_group_url}
|
|
@@ -43,9 +43,6 @@ module PactBroker
|
|
|
43
43
|
.all
|
|
44
44
|
end
|
|
45
45
|
|
|
46
|
-
# The most recent verification for the latest revision of the pact
|
|
47
|
-
# belonging to the version with the largest consumer_version_order.
|
|
48
|
-
|
|
49
46
|
def find_latest_verification_for consumer_name, provider_name, tag = nil
|
|
50
47
|
query = LatestVerificationsByConsumerVersion
|
|
51
48
|
.select_all_qualified
|
data/lib/pact_broker/version.rb
CHANGED
|
@@ -9,6 +9,7 @@ module Rack
|
|
|
9
9
|
def initialize(app, options = {}, &block)
|
|
10
10
|
@app = app
|
|
11
11
|
@excluded_paths = Array(options[:exclude]) << '/hal-browser'
|
|
12
|
+
@hal_browser = Rack::Static.new(@app, :urls => ['/hal-browser'], :root => ::File.expand_path('../../../../vendor', __FILE__))
|
|
12
13
|
end
|
|
13
14
|
|
|
14
15
|
def call(env)
|
|
@@ -16,7 +17,7 @@ module Rack
|
|
|
16
17
|
if match?(request)
|
|
17
18
|
return [303, {'Location' => hal_browser_url_from_request(request)}, []]
|
|
18
19
|
end
|
|
19
|
-
|
|
20
|
+
@hal_browser.call(env)
|
|
20
21
|
end
|
|
21
22
|
|
|
22
23
|
private
|
|
@@ -39,7 +40,6 @@ module Rack
|
|
|
39
40
|
url.fragment = request.path_info
|
|
40
41
|
url.to_s
|
|
41
42
|
end
|
|
42
|
-
|
|
43
43
|
end
|
|
44
44
|
end
|
|
45
45
|
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
|
|
2
|
+
# Allows a default Rack middlware implementation to be set,
|
|
3
|
+
# and then be optionally changed out for a different implementation
|
|
4
|
+
# after the app has been built.
|
|
5
|
+
# Used for allowing the authorization code to set after the
|
|
6
|
+
# `app = PactBroker::App.new` has been called
|
|
7
|
+
|
|
8
|
+
module Rack
|
|
9
|
+
module PactBroker
|
|
10
|
+
class ConfigurableMakeItLater
|
|
11
|
+
def initialize default_clazz
|
|
12
|
+
@clazz = default_clazz
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def make_it_later clazz
|
|
16
|
+
@clazz = clazz
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def new *args, &block
|
|
20
|
+
@clazz.new(*args, &block)
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
data/pact_broker.gemspec
CHANGED
|
@@ -37,6 +37,7 @@ Gem::Specification.new do |gem|
|
|
|
37
37
|
gem.add_runtime_dependency 'sucker_punch', '~>2.0'
|
|
38
38
|
gem.add_runtime_dependency 'rack-protection', '~>2.0'
|
|
39
39
|
gem.add_runtime_dependency 'dry-types', '~> 0.10.3' # https://travis-ci.org/pact-foundation/pact_broker/jobs/249448621
|
|
40
|
+
gem.add_runtime_dependency 'table_print', '~> 1.5'
|
|
40
41
|
|
|
41
42
|
gem.add_development_dependency 'bundler-audit', '~>0.4'
|
|
42
43
|
gem.add_development_dependency 'sqlite3', '~>1.3'
|