pact_broker 2.40.0 → 2.41.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (97) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +36 -0
  3. data/DEVELOPER_DOCUMENTATION.md +11 -0
  4. data/db/ddl_statements/head_pact_tags.rb +10 -0
  5. data/db/ddl_statements/latest_pact_consumer_version_orders.rb +16 -0
  6. data/db/ddl_statements/latest_pact_publications_by_consumer_versions.rb +16 -0
  7. data/db/ddl_statements/latest_tagged_pact_consumer_version_orders.rb +23 -0
  8. data/db/ddl_statements/latest_verification_ids_for_consumer_version_tags.rb +15 -0
  9. data/db/ddl_statements/{latest_verification_ids_for_pact_versions_v001.rb → latest_verification_ids_for_pact_versions.rb} +0 -0
  10. data/db/migrations/000028_create_all_pact_publications.rb +1 -0
  11. data/db/migrations/20180311_optimise_head_matrix.rb +1 -9
  12. data/db/migrations/20180722_recreate_views.rb +6 -19
  13. data/db/migrations/20191028_optimise_latest_tagged_pact_cv_orders.rb +13 -0
  14. data/db/migrations/20191030_optimise_latest_pact_publications_by_consumer_versions_.rb +13 -0
  15. data/db/migrations/20191031_optimise_latest_verification_ids_for_consumer_version_tags.rb +13 -0
  16. data/db/migrations/20191101_create_head_pact_tags.rb +11 -0
  17. data/lib/db.rb +1 -0
  18. data/lib/pact_broker/api/contracts/dry_validation_predicates.rb +15 -0
  19. data/lib/pact_broker/api/contracts/dry_validation_workarounds.rb +38 -0
  20. data/lib/pact_broker/api/contracts/verifiable_pacts_json_query_schema.rb +34 -0
  21. data/lib/pact_broker/api/contracts/verifiable_pacts_query_schema.rb +12 -20
  22. data/lib/pact_broker/api/decorators/matrix_decorator.rb +25 -6
  23. data/lib/pact_broker/api/decorators/relationships_csv_decorator.rb +4 -12
  24. data/lib/pact_broker/api/decorators/verifiable_pact_decorator.rb +5 -2
  25. data/lib/pact_broker/api/decorators/verifiable_pacts_query_decorator.rb +21 -9
  26. data/lib/pact_broker/api/renderers/integrations_dot_renderer.rb +1 -1
  27. data/lib/pact_broker/api/resources/base_resource.rb +1 -1
  28. data/lib/pact_broker/api/resources/can_i_deploy.rb +2 -9
  29. data/lib/pact_broker/api/resources/matrix.rb +2 -8
  30. data/lib/pact_broker/api/resources/matrix_for_consumer_and_provider.rb +1 -0
  31. data/lib/pact_broker/api/resources/provider_pacts_for_verification.rb +36 -7
  32. data/lib/pact_broker/app.rb +1 -0
  33. data/lib/pact_broker/db/data_migrations/migrate_webhook_headers.rb +1 -1
  34. data/lib/pact_broker/db/seed_example_data.rb +8 -5
  35. data/lib/pact_broker/diagnostic/resources/base_resource.rb +0 -8
  36. data/lib/pact_broker/domain/index_item.rb +47 -16
  37. data/lib/pact_broker/domain/pact.rb +12 -4
  38. data/lib/pact_broker/domain/version.rb +2 -0
  39. data/lib/pact_broker/hash_refinements.rb +48 -0
  40. data/lib/pact_broker/index/page.rb +12 -0
  41. data/lib/pact_broker/index/service.rb +156 -21
  42. data/lib/pact_broker/integrations/integration.rb +22 -0
  43. data/lib/pact_broker/locale/en.yml +2 -0
  44. data/lib/pact_broker/logging.rb +0 -1
  45. data/lib/pact_broker/matrix/aggregated_row.rb +3 -9
  46. data/lib/pact_broker/matrix/deployment_status_summary.rb +5 -5
  47. data/lib/pact_broker/matrix/head_row.rb +2 -0
  48. data/lib/pact_broker/matrix/quick_row.rb +7 -7
  49. data/lib/pact_broker/matrix/repository.rb +2 -4
  50. data/lib/pact_broker/pacticipants/repository.rb +1 -1
  51. data/lib/pact_broker/pacts/pact_publication.rb +27 -4
  52. data/lib/pact_broker/pacts/repository.rb +41 -18
  53. data/lib/pact_broker/pacts/service.rb +23 -3
  54. data/lib/pact_broker/pacts/verifiable_pact.rb +8 -2
  55. data/lib/pact_broker/pacts/verifiable_pact_messages.rb +14 -8
  56. data/lib/pact_broker/string_refinements.rb +36 -1
  57. data/lib/pact_broker/tags/head_pact_tags.rb +12 -0
  58. data/lib/pact_broker/tags/tag_with_latest_flag.rb +0 -1
  59. data/lib/pact_broker/test/test_data_builder.rb +1 -1
  60. data/lib/pact_broker/ui/controllers/index.rb +23 -2
  61. data/lib/pact_broker/ui/view_models/index_item.rb +7 -1
  62. data/lib/pact_broker/ui/view_models/index_items.rb +10 -8
  63. data/lib/pact_broker/ui/view_models/matrix_line.rb +14 -21
  64. data/lib/pact_broker/ui/view_models/matrix_tag.rb +6 -8
  65. data/lib/pact_broker/ui/views/index/_pagination.haml +31 -0
  66. data/lib/pact_broker/ui/views/index/show-with-tags.haml +6 -3
  67. data/lib/pact_broker/ui/views/index/show.haml +5 -2
  68. data/lib/pact_broker/ui/views/matrix/show.haml +6 -9
  69. data/lib/pact_broker/version.rb +1 -1
  70. data/lib/pact_broker/webhooks/webhook.rb +2 -2
  71. data/lib/pact_broker/webhooks/webhook_execution_result.rb +3 -18
  72. data/public/javascripts/matrix.js +26 -1
  73. data/public/javascripts/pagination.js +1127 -0
  74. data/public/stylesheets/index.css +13 -0
  75. data/public/stylesheets/matrix.css +10 -1
  76. data/spec/features/get_provider_pacts_for_verification_spec.rb +44 -9
  77. data/spec/features/pending_pacts_spec.rb +1 -1
  78. data/spec/features/wip_pacts_spec.rb +138 -0
  79. data/spec/integration/app_spec.rb +1 -1
  80. data/spec/lib/pact_broker/api/contracts/verifiable_pacts_json_query_schema_spec.rb +90 -0
  81. data/spec/lib/pact_broker/api/contracts/verifiable_pacts_query_schema_spec.rb +26 -4
  82. data/spec/lib/pact_broker/api/decorators/matrix_decorator_spec.rb +36 -2
  83. data/spec/lib/pact_broker/api/decorators/verifiable_pact_decorator_spec.rb +24 -1
  84. data/spec/lib/pact_broker/api/decorators/verifiable_pacts_query_decorator_spec.rb +62 -18
  85. data/spec/lib/pact_broker/api/resources/base_resource_spec.rb +10 -0
  86. data/spec/lib/pact_broker/api/resources/provider_pacts_for_verification_spec.rb +75 -6
  87. data/spec/lib/pact_broker/hash_refinements_spec.rb +24 -0
  88. data/spec/lib/pact_broker/index/service_spec.rb +38 -2
  89. data/spec/lib/pact_broker/integrations/integration_spec.rb +79 -41
  90. data/spec/lib/pact_broker/pacts/pact_publication_spec.rb +2 -0
  91. data/spec/lib/pact_broker/pacts/repository_find_wip_pact_versions_for_provider_spec.rb +17 -2
  92. data/spec/lib/pact_broker/pacts/service_spec.rb +56 -0
  93. data/spec/lib/pact_broker/pacts/verifiable_pact_messages_spec.rb +12 -1
  94. data/spec/lib/pact_broker/ui/controllers/index_spec.rb +28 -6
  95. data/spec/lib/pact_broker/ui/view_models/index_items_spec.rb +8 -29
  96. data/spec/lib/pact_broker/ui/view_models/matrix_line_spec.rb +41 -0
  97. metadata +24 -3
@@ -52,14 +52,15 @@ module PactBroker
52
52
  provider = OpenStruct.new(name: line.provider_name)
53
53
  consumer = OpenStruct.new(name: line.consumer_name)
54
54
  consumer_version = OpenStruct.new(number: line.consumer_version_number, pacticipant: consumer)
55
- line_hash(consumer, provider, consumer_version, line, base_url)
55
+ provider_version = line.provider_version_number ? OpenStruct.new(number: line.provider_version_number, pacticipant: provider) : nil
56
+ line_hash(consumer, provider, consumer_version, provider_version, line, base_url)
56
57
  end
57
58
  end
58
59
 
59
- def line_hash(consumer, provider, consumer_version, line, base_url)
60
+ def line_hash(consumer, provider, consumer_version, provider_version, line, base_url)
60
61
  {
61
62
  consumer: consumer_hash(line, consumer, consumer_version, base_url),
62
- provider: provider_hash(line, provider, base_url),
63
+ provider: provider_hash(line, provider, provider_version, base_url),
63
64
  pact: pact_hash(line, base_url),
64
65
  verificationResult: verification_hash(line, base_url)
65
66
  }
@@ -74,7 +75,8 @@ module PactBroker
74
75
  self: {
75
76
  href: version_url(base_url, consumer_version)
76
77
  }
77
- }
78
+ },
79
+ tags: tags(line.consumer_version_tags)
78
80
  },
79
81
  _links: {
80
82
  self: {
@@ -84,7 +86,16 @@ module PactBroker
84
86
  }
85
87
  end
86
88
 
87
- def provider_hash(line, provider, base_url)
89
+ def tags(tags)
90
+ tags.collect do | tag |
91
+ {
92
+ name: tag.name,
93
+ latest: tag.latest?
94
+ }
95
+ end
96
+ end
97
+
98
+ def provider_hash(line, provider, provider_version, base_url)
88
99
  hash = {
89
100
  name: line.provider_name,
90
101
  version: nil,
@@ -96,7 +107,15 @@ module PactBroker
96
107
  }
97
108
 
98
109
  if !line.provider_version_number.nil?
99
- hash[:version] = { number: line.provider_version_number }
110
+ hash[:version] = {
111
+ number: line.provider_version_number,
112
+ _links: {
113
+ self: {
114
+ href: version_url(base_url, provider_version)
115
+ }
116
+ },
117
+ tags: tags(line.provider_version_tags)
118
+ }
100
119
  end
101
120
 
102
121
  hash
@@ -1,22 +1,16 @@
1
1
  require 'csv'
2
- require 'set'
3
2
 
4
3
  module PactBroker
5
-
6
4
  module Api
7
-
8
5
  module Decorators
9
-
10
6
  class RelationshipsCsvDecorator
11
-
12
7
  def initialize pacts
13
8
  @pacts = pacts
14
- @index_items = pacts.collect{|pact| PactBroker::Domain::IndexItem.new(pact.consumer,pact.provider)}
9
+ @index_items = pacts.collect{|pact| PactBroker::Domain::IndexItem.new(pact.consumer, pact.provider)}
15
10
  end
16
11
 
17
12
  def to_csv
18
13
  hash = {}
19
- pacticipants = @index_items.collect{|r| r.pacticipants}.flatten.uniq
20
14
 
21
15
  @index_items.each do | index_item |
22
16
  hash[index_item.consumer.id] ||= pacticipant_array(index_item.consumer, hash.size + 1)
@@ -24,7 +18,7 @@ module PactBroker
24
18
  hash[index_item.consumer.id] << index_item.provider.id
25
19
  end
26
20
 
27
- max_length = hash.values.collect{|array| array.size}.max
21
+ max_length = hash.values.collect(&:size).max
28
22
 
29
23
  hash.values.each do | array |
30
24
  while array.size < max_length
@@ -37,7 +31,6 @@ module PactBroker
37
31
  csv << array
38
32
  end
39
33
  end
40
-
41
34
  end
42
35
 
43
36
  def pacticipant_array pacticipant, order
@@ -46,9 +39,8 @@ module PactBroker
46
39
 
47
40
  private
48
41
 
49
- attr_accessor :pacts
50
-
42
+ attr_reader :pacts
51
43
  end
52
44
  end
53
45
  end
54
- end
46
+ end
@@ -21,9 +21,12 @@ module PactBroker
21
21
  end
22
22
 
23
23
  property :verification_properties, as: :verificationProperties do
24
- property :pending
25
- property :pending_reason, as: :pendingReason, exec_context: :decorator
24
+ property :pending,
25
+ if: ->(context) { context[:options][:user_options][:include_pending_status] }
26
+ property :wip, if: -> (context) { context[:represented].wip }
26
27
  property :inclusion_reason, as: :inclusionReason, exec_context: :decorator
28
+ property :pending_reason, as: :pendingReason, exec_context: :decorator,
29
+ if: ->(context) { context[:options][:user_options][:include_pending_status] }
27
30
 
28
31
  def inclusion_reason
29
32
  PactBroker::Pacts::VerifiablePactMessages.new(represented).inclusion_reason
@@ -1,25 +1,37 @@
1
1
  require_relative 'base_decorator'
2
2
  require_relative 'verifiable_pact_decorator'
3
3
  require 'pact_broker/api/pact_broker_urls'
4
+ require 'pact_broker/hash_refinements'
4
5
 
5
6
  module PactBroker
6
7
  module Api
7
8
  module Decorators
8
9
  class VerifiablePactsQueryDecorator < BaseDecorator
9
- collection :provider_version_tags
10
+ using PactBroker::HashRefinements
10
11
 
11
- collection :consumer_version_selectors, class: OpenStruct do
12
+ collection :provider_version_tags, default: []
13
+
14
+ collection :consumer_version_selectors, default: [], class: OpenStruct do
12
15
  property :tag
13
- property :latest, setter: ->(fragment:, represented:, **) { represented.latest = (fragment == 'true') }
16
+ property :latest,
17
+ setter: ->(fragment:, represented:, **) {
18
+ represented.latest = (fragment == 'true' || fragment == true)
19
+ }
14
20
  end
15
21
 
22
+ property :include_pending_status, default: true,
23
+ setter: ->(fragment:, represented:, **) {
24
+ represented.include_pending_status = (fragment == 'true' || fragment == true)
25
+ }
26
+
27
+ property :include_wip_pacts_since, default: nil,
28
+ setter: ->(fragment:, represented:, **) {
29
+ represented.include_wip_pacts_since = fragment ? DateTime.parse(fragment) : nil
30
+ }
16
31
 
17
- def from_hash(*args)
18
- # Should remember how to do this via Representable...
19
- result = super
20
- result.consumer_version_selectors = [] if result.consumer_version_selectors.nil?
21
- result.provider_version_tags = [] if result.provider_version_tags.nil?
22
- result
32
+ def from_hash(hash)
33
+ # This handles both the snakecase keys from the GET query and the camelcase JSON POST body
34
+ super(hash&.snakecase_keys)
23
35
  end
24
36
  end
25
37
  end
@@ -28,7 +28,7 @@ module PactBroker
28
28
  end
29
29
 
30
30
  def escape_name(name)
31
- name.gsub(" ", "_")
31
+ name.tr(" ", "_")
32
32
  end
33
33
  end
34
34
  end
@@ -88,7 +88,7 @@ module PactBroker
88
88
  end
89
89
 
90
90
  def params_with_string_keys
91
- JSON.parse(request.body.to_s, {symbolize_names: false}.merge(PACT_PARSING_OPTIONS))
91
+ @params_with_string_keys ||= JSON.parse(request.body.to_s, {symbolize_names: false}.merge(PACT_PARSING_OPTIONS))
92
92
  end
93
93
 
94
94
  def pact_params
@@ -7,6 +7,7 @@ module PactBroker
7
7
  module Resources
8
8
  class CanIDeploy < Matrix
9
9
  def initialize
10
+ super
10
11
  @query_params = JSON.parse(Rack::Utils.parse_nested_query(request.uri.query).to_json, symbolize_names: true)
11
12
  @selectors, @options = PactBroker::Matrix::ParseCanIDeployQuery.call(query_params)
12
13
  end
@@ -22,19 +23,11 @@ module PactBroker
22
23
 
23
24
  private
24
25
 
25
- attr_reader :query_params
26
+ attr_reader :query_params, :selectors, :options
26
27
 
27
28
  def query_schema
28
29
  PactBroker::Api::Contracts::CanIDeployQuerySchema
29
30
  end
30
-
31
- def selectors
32
- @selectors
33
- end
34
-
35
- def options
36
- @options
37
- end
38
31
  end
39
32
  end
40
33
  end
@@ -7,8 +7,10 @@ module PactBroker
7
7
  module Api
8
8
  module Resources
9
9
  class Matrix < BaseResource
10
+ attr_reader :selectors, :options
10
11
 
11
12
  def initialize
13
+ super
12
14
  @selectors, @options = PactBroker::Matrix::ParseQuery.call(request.uri.query)
13
15
  end
14
16
 
@@ -44,14 +46,6 @@ module PactBroker
44
46
  def lines
45
47
  @lines ||= matrix_service.find(selectors, options)
46
48
  end
47
-
48
- def selectors
49
- @selectors
50
- end
51
-
52
- def options
53
- @options
54
- end
55
49
  end
56
50
  end
57
51
  end
@@ -7,6 +7,7 @@ module PactBroker
7
7
  class MatrixForConsumerAndProvider < BaseResource
8
8
 
9
9
  def initialize
10
+ super
10
11
  _, @options = PactBroker::Matrix::ParseQuery.call(request.uri.query)
11
12
  end
12
13
 
@@ -2,13 +2,21 @@ require 'pact_broker/api/resources/provider_pacts'
2
2
  require 'pact_broker/api/decorators/verifiable_pacts_decorator'
3
3
  require 'pact_broker/api/contracts/verifiable_pacts_query_schema'
4
4
  require 'pact_broker/api/decorators/verifiable_pacts_query_decorator'
5
+ require 'pact_broker/api/contracts/verifiable_pacts_json_query_schema'
6
+ require 'pact_broker/hash_refinements'
5
7
 
6
8
  module PactBroker
7
9
  module Api
8
10
  module Resources
9
11
  class ProviderPactsForVerification < ProviderPacts
10
- def initialize
11
- @query = Rack::Utils.parse_nested_query(request.uri.query)
12
+ using PactBroker::HashRefinements
13
+
14
+ def allowed_methods
15
+ ["GET", "POST", "OPTIONS"]
16
+ end
17
+
18
+ def content_types_accepted
19
+ [["application/json"]]
12
20
  end
13
21
 
14
22
  def malformed_request?
@@ -20,15 +28,19 @@ module PactBroker
20
28
  end
21
29
  end
22
30
 
23
- private
31
+ def process_post
32
+ response.body = to_json
33
+ true
34
+ end
24
35
 
25
- attr_reader :query
36
+ private
26
37
 
27
38
  def pacts
28
39
  pact_service.find_for_verification(
29
40
  provider_name,
30
41
  parsed_query_params.provider_version_tags,
31
- parsed_query_params.consumer_version_selectors
42
+ parsed_query_params.consumer_version_selectors,
43
+ { include_wip_pacts_since: parsed_query_params.include_wip_pacts_since }
32
44
  )
33
45
  end
34
46
 
@@ -40,14 +52,31 @@ module PactBroker
40
52
  PactBroker::Api::Decorators::VerifiablePactsDecorator.new(pacts).to_json(to_json_options)
41
53
  end
42
54
 
43
-
44
55
  def query_schema
45
- PactBroker::Api::Contracts::VerifiablePactsQuerySchema
56
+ if request.get?
57
+ PactBroker::Api::Contracts::VerifiablePactsQuerySchema
58
+ else
59
+ PactBroker::Api::Contracts::VerifiablePactsJSONQuerySchema
60
+ end
46
61
  end
47
62
 
48
63
  def parsed_query_params
49
64
  @parsed_query_params ||= PactBroker::Api::Decorators::VerifiablePactsQueryDecorator.new(OpenStruct.new).from_hash(query)
50
65
  end
66
+
67
+ def query
68
+ @query ||= begin
69
+ if request.get?
70
+ Rack::Utils.parse_nested_query(request.uri.query)
71
+ elsif request.post?
72
+ params_with_string_keys
73
+ end
74
+ end
75
+ end
76
+
77
+ def to_json_options
78
+ super.deep_merge(user_options: { include_pending_status: parsed_query_params.include_pending_status })
79
+ end
51
80
  end
52
81
  end
53
82
  end
@@ -110,6 +110,7 @@ module PactBroker
110
110
  PactBroker::DB.connection.timezone = :utc
111
111
  PactBroker::DB.validate_connection_config if configuration.validate_database_connection_config
112
112
  PactBroker::DB.set_mysql_strict_mode_if_mysql
113
+ PactBroker::DB.connection.extension(:pagination)
113
114
  Sequel.datetime_class = DateTime
114
115
  Sequel.database_timezone = :utc # Store all dates in UTC, assume any date without a TZ is UTC
115
116
  Sequel.application_timezone = :local # Convert dates to localtime when retrieving from database
@@ -11,7 +11,7 @@ module PactBroker
11
11
  connection[:webhook_headers].for_update.each do | webhook_header |
12
12
  webhook = connection[:webhooks].for_update.where(id: webhook_header[:webhook_id]).first
13
13
  new_headers = webhook[:headers] ? JSON.parse(webhook[:headers]) : {}
14
- new_headers.merge!(webhook_header[:name] => webhook_header[:value])
14
+ new_headers[webhook_header[:name]] = webhook_header[:value]
15
15
  connection[:webhooks].where(id: webhook[:id]).update(headers: new_headers.to_json)
16
16
  connection[:webhook_headers].where(webhook_header).delete
17
17
  end
@@ -18,21 +18,24 @@ module PactBroker
18
18
  .create_provider(provider_name, created_at: days_ago(16))
19
19
  .create_consumer_version("e15da45d3943bf10793a6d04cfb9f5dabe430fe2", created_at: days_ago(16))
20
20
  .create_consumer_version_tag("prod", created_at: days_ago(16))
21
- .create_consumer_version_tag("dev", created_at: days_ago(16))
21
+ .create_consumer_version_tag("master", created_at: days_ago(16))
22
22
  .create_pact(json_content: pact_1, created_at: days_ago(16))
23
23
  .create_verification(provider_version: "1315e0b1924cb6f42751f977789be3559373033a", execution_date: days_ago(15))
24
- .create_provider_version_tag("dev", created_at: days_ago(14))
24
+ .create_provider_version_tag("master", created_at: days_ago(14))
25
25
  .create_provider_version_tag("prod", created_at: days_ago(14))
26
26
  .create_verification(provider_version: "480e5aeb30467856ca995d0024d2c1800b0719e5", success: false, number: 2, execution_date: days_ago(14))
27
- .create_provider_version_tag("dev", created_at: days_ago(14))
27
+ .create_provider_version_tag("master", created_at: days_ago(14))
28
28
  .create_consumer_version("725c6ccb7cf7efc51b4394f9828585eea9c379d9", created_at: days_ago(7))
29
29
  .create_consumer_version_tag("feat-new-thing", created_at: days_ago(7))
30
30
  .create_pact(json_content: pact_2, created_at: days_ago(7))
31
31
  .create_consumer_version("7bd4d9173522826dc3e8704fd62dde0424f4c827", created_at: days_ago(1))
32
- .create_consumer_version_tag("dev", created_at: days_ago(1))
32
+ .create_consumer_version_tag("master", created_at: days_ago(1))
33
33
  .create_pact(json_content: pact_3, created_at: days_ago(1))
34
34
  .create_verification(provider_version: "4fdf20082263d4c5038355a3b734be1c0054d1e1", execution_date: days_ago(1))
35
- .create_provider_version_tag("dev", created_at: days_ago(1))
35
+ .create_provider_version_tag("master", created_at: days_ago(1))
36
+ .create_consumer_version("5556b8149bf8bac76bc30f50a8a2dd4c22c85f30", created_at: days_ago(0.5))
37
+ .create_consumer_version_tag("master", created_at: days_ago(0.5))
38
+ .republish_same_pact(created_at: days_ago(0.5))
36
39
  end
37
40
 
38
41
  def database_empty?
@@ -16,14 +16,6 @@ module PactBroker
16
16
  return false if PactBroker.configuration.authorize.nil?
17
17
  !PactBroker.configuration.authorize.call(self, {})
18
18
  end
19
-
20
- def initialize
21
- PactBroker.configuration.before_resource.call(self)
22
- end
23
-
24
- def finish_request
25
- PactBroker.configuration.after_resource.call(self)
26
- end
27
19
  end
28
20
  end
29
21
  end
@@ -4,10 +4,22 @@ require 'pact_broker/webhooks/status'
4
4
  module PactBroker
5
5
  module Domain
6
6
  class IndexItem
7
-
8
- attr_reader :consumer, :provider, :latest_pact, :latest_verification, :webhooks, :triggered_webhooks, :latest_verification_latest_tags
9
-
10
- def initialize consumer, provider, latest_pact = nil, latest = true, latest_verification = nil, webhooks = [], triggered_webhooks = [], tags = [], latest_verification_latest_tags = []
7
+ attr_reader :consumer,
8
+ :provider,
9
+ :latest_pact,
10
+ :latest_verification,
11
+ :webhooks,
12
+ :triggered_webhooks,
13
+ :latest_verification_latest_tags
14
+
15
+ # rubocop:disable Metrics/ParameterLists
16
+ def self.create(consumer, provider, latest_pact, latest, latest_verification, webhooks = [], triggered_webhooks = [], tags = [], latest_verification_latest_tags = [])
17
+ new(consumer, provider, latest_pact, latest, latest_verification, webhooks, triggered_webhooks, tags, latest_verification_latest_tags)
18
+ end
19
+ # rubocop:enable Metrics/ParameterLists
20
+
21
+ # rubocop:disable Metrics/ParameterLists
22
+ def initialize(consumer, provider, latest_pact = nil, latest = true, latest_verification = nil, webhooks = [], triggered_webhooks = [], tags = [], latest_verification_latest_tags = [])
11
23
  @consumer = consumer
12
24
  @provider = provider
13
25
  @latest_pact = latest_pact
@@ -18,10 +30,7 @@ module PactBroker
18
30
  @tags = tags
19
31
  @latest_verification_latest_tags = latest_verification_latest_tags
20
32
  end
21
-
22
- def self.create consumer, provider, latest_pact, latest, latest_verification, webhooks = [], triggered_webhooks = [], tags = [], latest_verification_latest_tags = []
23
- new consumer, provider, latest_pact, latest, latest_verification, webhooks, triggered_webhooks, tags, latest_verification_latest_tags
24
- end
33
+ # rubocop:enable Metrics/ParameterLists
25
34
 
26
35
  def eq? other
27
36
  IndexItem === other && other.consumer == consumer && other.provider == provider &&
@@ -43,10 +52,6 @@ module PactBroker
43
52
  provider.name
44
53
  end
45
54
 
46
- def latest_pact
47
- @latest_pact
48
- end
49
-
50
55
  def latest?
51
56
  @latest
52
57
  end
@@ -55,6 +60,10 @@ module PactBroker
55
60
  @latest_pact.consumer_version_number
56
61
  end
57
62
 
63
+ def consumer_version_order
64
+ consumer_version.order
65
+ end
66
+
58
67
  def consumer_version
59
68
  @latest_pact.consumer_version
60
69
  end
@@ -93,10 +102,6 @@ module PactBroker
93
102
  !!latest_verification
94
103
  end
95
104
 
96
- def latest_verification
97
- @latest_verification
98
- end
99
-
100
105
  def latest_verification_successful?
101
106
  latest_verification.success
102
107
  end
@@ -127,6 +132,32 @@ module PactBroker
127
132
  provider_name <=> other.provider_name
128
133
  end
129
134
 
135
+ # Add logic for ignoring case
136
+ def <=> other
137
+ comparisons = [
138
+ compare_name_asc(consumer_name, other.consumer_name),
139
+ compare_number_desc(consumer_version.order, other.consumer_version.order),
140
+ compare_number_desc(latest_pact.revision_number, other.latest_pact.revision_number),
141
+ compare_name_asc(provider_name, other.provider_name)
142
+ ]
143
+
144
+ comparisons.find{|c| c != 0 } || 0
145
+ end
146
+
147
+ def compare_name_asc name1, name2
148
+ name1&.downcase <=> name2&.downcase
149
+ end
150
+
151
+ def compare_number_desc number1, number2
152
+ if number1 && number2
153
+ number2 <=> number1
154
+ elsif number1
155
+ 1
156
+ else
157
+ -1
158
+ end
159
+ end
160
+
130
161
  def to_s
131
162
  "Pact between #{consumer_name} #{consumer_version_number} and #{provider_name} #{provider_version_number}"
132
163
  end