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.
Files changed (116) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/CHANGELOG.md +30 -4
  4. data/db/migrations/{01_create_pacticipant_table.rb → 000001_create_pacticipant_table.rb} +0 -0
  5. data/db/migrations/{02_create_versions_table.rb → 000002_create_versions_table.rb} +0 -0
  6. data/db/migrations/{03_create_pacts_table.rb → 000003_create_pacts_table.rb} +0 -0
  7. data/db/migrations/{04_create_tags_table.rb → 000004_create_tags_table.rb} +0 -0
  8. data/db/migrations/{05_add_order_column_to_version.rb → 000005_add_order_column_to_version.rb} +0 -0
  9. data/db/migrations/{06_make_version_foreign_key_mandatory.rb → 000006_make_version_foreign_key_mandatory.rb} +0 -0
  10. data/db/migrations/{07_increase_json_content_length.rb → 000007_increase_json_content_length.rb} +0 -0
  11. data/db/migrations/{08_create_latest_pact_view.rb → 000008_create_latest_pact_view.rb} +0 -0
  12. data/db/migrations/{09_add_timestamps.rb → 000009_add_timestamps.rb} +0 -0
  13. data/db/migrations/{10_populate_timestamps.rb → 000010_populate_timestamps.rb} +0 -0
  14. data/db/migrations/{11_made_timestamps_mandatory.rb → 000011_made_timestamps_mandatory.rb} +0 -0
  15. data/db/migrations/{12_create_webhooks_table.rb → 000012_create_webhooks_table.rb} +0 -0
  16. data/db/migrations/{13_add_columns_to_webhooks.rb → 000013_add_columns_to_webhooks.rb} +0 -0
  17. data/db/migrations/{14_add_timestamps_to_pact_views.rb → 000014_add_timestamps_to_pact_views.rb} +0 -0
  18. data/db/migrations/{15_create_pact_version_content.rb → 000015_create_pact_version_content.rb} +0 -0
  19. data/db/migrations/{16_add_pact_content_foreign_key_to_pacts.rb → 000016_add_pact_content_foreign_key_to_pacts.rb} +0 -0
  20. 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
  21. data/db/migrations/{18_drop_json_content_column_from_pacts.rb → 000018_drop_json_content_column_from_pacts.rb} +0 -0
  22. data/db/migrations/{19_make_pact_version_content_sha_not_nullable.rb → 000019_make_pact_version_content_sha_not_nullable.rb} +0 -0
  23. 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
  24. data/db/migrations/{21_recreate_latest_pacts_view.rb → 000021_recreate_latest_pacts_view.rb} +0 -0
  25. data/db/migrations/{22_create_latest_tagged_pacts_view.rb → 000022_create_latest_tagged_pacts_view.rb} +0 -0
  26. data/db/migrations/{23_create_pact_versions_table.rb → 000023_create_pact_versions_table.rb} +0 -0
  27. data/db/migrations/{24_populate_pact_versions.rb → 000024_populate_pact_versions.rb} +0 -0
  28. data/db/migrations/{25_make_pv_pacticipants_mandatory.rb → 000025_make_pv_pacticipants_mandatory.rb} +0 -0
  29. data/db/migrations/{26_create_pact_publications.rb → 000026_create_pact_publications.rb} +0 -0
  30. data/db/migrations/{27_populate_pact_publications.rb → 000027_populate_pact_publications.rb} +0 -0
  31. data/db/migrations/{28_create_all_pact_publications.rb → 000028_create_all_pact_publications.rb} +0 -0
  32. data/db/migrations/{29_create_latest_tagged_pact_publications.rb → 000029_create_latest_tagged_pact_publications.rb} +0 -0
  33. data/db/migrations/{30_drop_old_tables_and_views.rb → 000030_drop_old_tables_and_views.rb} +0 -0
  34. data/db/migrations/{31_create_verifications.rb → 000031_create_verifications.rb} +0 -0
  35. data/db/migrations/{32_create_latest_verifications.rb → 000032_create_latest_verifications.rb} +0 -0
  36. data/db/migrations/{33_create_config_table.rb → 000033_create_config_table.rb} +0 -0
  37. data/db/migrations/{34_create_index_on_consumer_version_order.rb → 000034_create_index_on_consumer_version_order.rb} +0 -0
  38. data/db/migrations/{35_create_index_on_names.rb → 000035_create_index_on_names.rb} +0 -0
  39. data/db/migrations/{36_create_webhook_execution.rb → 000036_create_webhook_execution.rb} +0 -0
  40. data/db/migrations/{37_create_labels_table.rb → 000037_create_labels_table.rb} +0 -0
  41. data/db/migrations/{38_create_triggered_webhooks_table.rb → 000038_create_triggered_webhooks_table.rb} +0 -0
  42. data/db/migrations/{39_add_triggered_webhooks_fk_to_execution.rb → 000039_add_triggered_webhooks_fk_to_execution.rb} +0 -0
  43. data/db/migrations/{40_create_latest_triggered_webhooks_view.rb → 000040_create_latest_triggered_webhooks_view.rb} +0 -0
  44. data/db/migrations/{41_migrate_execution_data.rb → 000041_migrate_execution_data.rb} +0 -0
  45. data/db/migrations/{42_delete_orphan_webhook_data.rb → 000042_delete_orphan_webhook_data.rb} +0 -0
  46. data/db/migrations/{43_add_provider_version_to_verification.rb → 000043_add_provider_version_to_verification.rb} +0 -0
  47. data/db/migrations/{44_populate_verifications_provider_version_id.rb → 000044_populate_verifications_provider_version_id.rb} +0 -0
  48. data/db/migrations/{45_set_verification_provider_number_nullable.rb → 000045_set_verification_provider_number_nullable.rb} +0 -0
  49. data/db/migrations/{46_recreate_latest_verifications.rb → 000046_recreate_latest_verifications.rb} +0 -0
  50. data/db/migrations/{47_create_all_verifications.rb → 000047_create_all_verifications.rb} +4 -0
  51. data/db/pact_broker_database.sqlite3 +0 -0
  52. data/db/test/backwards_compatibility/Appraisals +8 -0
  53. data/db/test/backwards_compatibility/Rakefile +23 -6
  54. data/db/test/backwards_compatibility/gemfiles/1.18.0.gemfile.lock +20 -19
  55. data/db/test/backwards_compatibility/gemfiles/2.0.0.gemfile.lock +20 -19
  56. data/db/test/backwards_compatibility/gemfiles/2.1.0.gemfile.lock +20 -19
  57. data/db/test/backwards_compatibility/gemfiles/2.2.0.gemfile.lock +29 -26
  58. data/db/test/backwards_compatibility/gemfiles/2.3.0.gemfile.lock +29 -26
  59. data/db/test/backwards_compatibility/gemfiles/2.4.2.gemfile.lock +29 -26
  60. data/db/test/backwards_compatibility/gemfiles/2.5.1.gemfile +13 -0
  61. data/db/test/backwards_compatibility/gemfiles/2.5.1.gemfile.lock +199 -0
  62. data/db/test/backwards_compatibility/gemfiles/2.6.0.gemfile +13 -0
  63. data/db/test/backwards_compatibility/gemfiles/2.6.0.gemfile.lock +199 -0
  64. data/db/test/backwards_compatibility/gemfiles/head.gemfile.lock +30 -27
  65. data/db/test/backwards_compatibility/spec/publish_pact_spec.rb +1 -1
  66. data/db/test/change_migration_strategy/Rakefile +21 -0
  67. data/db/test/change_migration_strategy/before/Gemfile +6 -0
  68. data/lib/pact_broker/api/decorators/matrix_decorator.rb +19 -1
  69. data/lib/pact_broker/api/decorators/matrix_text_decorator.rb +29 -0
  70. data/lib/pact_broker/api/renderers/html_pact_renderer.rb +1 -1
  71. data/lib/pact_broker/api/resources/matrix.rb +21 -11
  72. data/lib/pact_broker/api/resources/matrix_for_consumer_and_provider.rb +2 -2
  73. data/lib/pact_broker/app.rb +27 -2
  74. data/lib/pact_broker/db/migrate.rb +1 -1
  75. data/lib/pact_broker/db/version.rb +4 -5
  76. data/lib/pact_broker/db.rb +1 -1
  77. data/lib/pact_broker/domain/relationship.rb +4 -24
  78. data/lib/pact_broker/matrix/parse_query.rb +22 -0
  79. data/lib/pact_broker/matrix/repository.rb +57 -26
  80. data/lib/pact_broker/matrix/service.rb +23 -16
  81. data/lib/pact_broker/pacticipants/service.rb +5 -21
  82. data/lib/pact_broker/pacts/pact_publication.rb +0 -4
  83. data/lib/pact_broker/pacts/repository.rb +1 -1
  84. data/lib/pact_broker/tags/service.rb +1 -0
  85. data/lib/pact_broker/ui/controllers/matrix.rb +3 -2
  86. data/lib/pact_broker/ui/controllers/relationships.rb +2 -2
  87. data/lib/pact_broker/ui/view_models/matrix_line.rb +38 -5
  88. data/lib/pact_broker/ui/view_models/relationship.rb +1 -19
  89. data/lib/pact_broker/ui/views/matrix/show.haml +18 -3
  90. data/lib/pact_broker/ui/views/relationships/show.haml +2 -2
  91. data/lib/pact_broker/verifications/repository.rb +0 -3
  92. data/lib/pact_broker/version.rb +1 -1
  93. data/lib/rack/hal_browser/redirect.rb +2 -2
  94. data/lib/rack/pact_broker/configurable_make_it_later.rb +24 -0
  95. data/lib/rack/pact_broker/no_auth.rb +13 -0
  96. data/pact_broker.gemspec +1 -0
  97. data/script/seed-matrix.rb +71 -0
  98. data/script/seed.rb +0 -5
  99. data/spec/features/get_matrix_spec.rb +4 -1
  100. data/spec/lib/pact_broker/api/decorators/matrix_decorator_spec.rb +41 -7
  101. data/spec/lib/pact_broker/api/resources/matrix_spec.rb +6 -2
  102. data/spec/lib/pact_broker/app_spec.rb +69 -0
  103. data/spec/lib/pact_broker/domain/relationship_spec.rb +1 -1
  104. data/spec/lib/pact_broker/matrix/parse_query_spec.rb +79 -0
  105. data/spec/lib/pact_broker/matrix/repository_spec.rb +244 -12
  106. data/spec/lib/pact_broker/matrix/service_spec.rb +39 -9
  107. data/spec/lib/pact_broker/pacticipants/service_spec.rb +4 -78
  108. data/spec/lib/pact_broker/pacts/repository_spec.rb +14 -16
  109. data/spec/lib/pact_broker/ui/view_models/relationship_spec.rb +5 -4
  110. data/spec/migrations/change_migration_strategy_spec.rb +86 -0
  111. data/spec/service_consumers/provider_states_for_pact_broker_client.rb +34 -0
  112. data/spec/support/test_data_builder.rb +6 -0
  113. data/tasks/database.rb +1 -1
  114. metadata +78 -52
  115. data/lib/pact_broker/ui/views/relationships/show-prod-tags.haml +0 -83
  116. 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, latest = true, latest_verification = nil, webhooks = [], triggered_webhooks = [], tags = []
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, latest, latest_verification, webhooks = [], triggered_webhooks = [], tags = []
22
- new consumer, provider, latest_pact, latest, latest_verification, webhooks, triggered_webhooks, tags
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
- def find pacticipant_1_name, pacticipant_2_name
10
- find_for_version_ids([], [pacticipant_1_name, pacticipant_2_name])
11
- .sort{|l1, l2| l2[:consumer_version_order] <=> l1[:consumer_version_order]}
12
- end
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
- # candidate_versions Hash of pacticipant name => version
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
- pacticipant_names = criteria.reject{|key, value| value }.keys
23
+ lines
24
+ end
25
25
 
26
- find_for_version_ids(version_ids, pacticipant_names)
27
- .group_by{|line| [line[:consumer_version_number], line[:provider_version_number]]}
28
- .values
29
- .collect(&:last)
30
- .select{ |line | line[:success] }
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
- def find_for_version_ids version_ids, pacticipant_names = []
34
- PactBroker::Pacts::LatestPactPublicationsByConsumerVersion
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
- .where(provider_version_id: version_ids)
42
- .or(provider_version_id: nil)
43
- .or(provider_name: pacticipant_names)
44
- .where(consumer_version_id: version_ids)
45
- .or(consumer_name: pacticipant_names)
46
- .order(:execution_date, :verification_id)
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 params
13
- matrix_repository.find params[:consumer_name], params[:provider_name]
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
- selectors.each do | version_selector |
23
- if !(version_selector =~ VERSION_SELECTOR_PATTERN)
24
- error_messages << "Invalid version selector '#{version_selector}'. Format must be <pacticipant_name>/version/<version>"
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 | version_selector |
29
- if match = version_selector.match(VERSION_SELECTOR_PATTERN)
30
- pacticipant_name = match[1]
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
- selected_versions = version_service.find_versions_by_selector(selectors)
39
- if selected_versions.any?(&:nil?)
40
- selected_versions.each_with_index do | selected_version, i |
41
- error_messages << "No pact or verification found for #{selectors[i]}" if selected_version.nil?
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
- latest_relationship = build_latest_pact_relationship(pact)
66
- prod_relationship = build_relationship_for_tagged_pact(pact, 'prod')
67
- production_relationship = build_relationship_for_tagged_pact(pact, 'production')
68
- [latest_relationship, prod_relationship, production_relationship].compact
69
- end.flatten
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
@@ -22,10 +22,6 @@ module PactBroker
22
22
  self.revision_number ||= 1
23
23
  end
24
24
 
25
- def latest_tag_names
26
- LatestTaggedPactPublications.where(id: id).select(:tag_name).collect{|t| t[:tag_name]}
27
- end
28
-
29
25
  def to_domain
30
26
  PactBroker::Domain::Pact.new(
31
27
  id: id,
@@ -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(&:to_domain)
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)
@@ -27,4 +27,5 @@ module PactBroker
27
27
 
28
28
  end
29
29
  end
30
+
30
31
  end
@@ -10,8 +10,9 @@ module PactBroker
10
10
  include PactBroker::Services
11
11
 
12
12
  get "/provider/:provider_name/consumer/:consumer_name" do
13
- lines = matrix_service.find consumer_name: params[:consumer_name], provider_name: params[:provider_name]
14
- lines = lines.collect{|line| PactBroker::UI::ViewDomain::MatrixLine.new(line)}
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
- page = params[:showProdPacts] == 'true' ? :'relationships/show-prod-tags' : :'relationships/show'
15
- haml page, {locals: {relationships: view_model, title: "Pacts"}, layout: :'layouts/main'}
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[:provider_version]
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
- case @line[:success]
63
- when true then "Verified"
64
- when false then "Failed"
65
- else ''
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 pact_url
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
- = "#{consumer_name} version"
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
- = "#{provider_name} version"
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
- Verification
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
- HAL Browser
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.pact_url, :title => "View pact"}
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
@@ -1,3 +1,3 @@
1
1
  module PactBroker
2
- VERSION = '2.7.0.beta.1'
2
+ VERSION = '2.7.0.beta.2'
3
3
  end
@@ -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
- Rack::Static.new(@app, :urls => ['/hal-browser'], :root => ::File.expand_path('../../../../vendor', __FILE__)).call(env)
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
@@ -0,0 +1,13 @@
1
+ module Rack
2
+ module PactBroker
3
+ class NoAuth
4
+ def initialize app, *args, &block
5
+ @app = app
6
+ end
7
+
8
+ def call(env)
9
+ @app.call(env)
10
+ end
11
+ end
12
+ end
13
+ 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'