pact_broker 2.27.2 → 2.27.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. checksums.yaml +5 -5
  2. data/.travis.yml +1 -1
  3. data/CHANGELOG.md +32 -0
  4. data/DEVELOPER_SETUP.md +1 -0
  5. data/example/config.ru +1 -1
  6. data/lib/pact_broker.rb +1 -0
  7. data/lib/pact_broker/api.rb +1 -0
  8. data/lib/pact_broker/api/decorators/pact_version_decorator.rb +0 -5
  9. data/lib/pact_broker/api/decorators/tagged_pact_versions_decorator.rb +46 -0
  10. data/lib/pact_broker/api/renderers/html_pact_renderer.rb +1 -1
  11. data/lib/pact_broker/api/resources/error_handler.rb +1 -0
  12. data/lib/pact_broker/api/resources/index.rb +6 -0
  13. data/lib/pact_broker/api/resources/tagged_pact_versions.rb +38 -0
  14. data/lib/pact_broker/app.rb +12 -6
  15. data/lib/pact_broker/certificates/service.rb +1 -0
  16. data/lib/pact_broker/configuration.rb +11 -16
  17. data/lib/pact_broker/db/log_quietener.rb +38 -0
  18. data/lib/pact_broker/doc/views/index/tagged-pact-versions.markdown +7 -0
  19. data/lib/pact_broker/logging.rb +25 -20
  20. data/lib/pact_broker/logging/default_formatter.rb +16 -0
  21. data/lib/pact_broker/matrix/deployment_status_summary.rb +3 -1
  22. data/lib/pact_broker/pacticipants/service.rb +1 -1
  23. data/lib/pact_broker/pacts/all_pact_publications.rb +1 -1
  24. data/lib/pact_broker/pacts/repository.rb +18 -4
  25. data/lib/pact_broker/pacts/service.rb +4 -0
  26. data/lib/pact_broker/ui/views/index/show-with-tags.haml +34 -33
  27. data/lib/pact_broker/ui/views/index/show.haml +28 -27
  28. data/lib/pact_broker/ui/views/layouts/main.haml +2 -2
  29. data/lib/pact_broker/ui/views/matrix/show.haml +126 -127
  30. data/lib/pact_broker/verifications/service.rb +3 -1
  31. data/lib/pact_broker/version.rb +1 -1
  32. data/lib/pact_broker/versions/repository.rb +3 -1
  33. data/lib/pact_broker/webhooks/job.rb +1 -0
  34. data/pact_broker.gemspec +1 -0
  35. data/script/db-spec.sh +2 -0
  36. data/spec/features/delete_tagged_pact_versions_spec.rb +28 -0
  37. data/spec/features/get_tagged_pact_versions_spec.rb +26 -0
  38. data/spec/integration/ui/index_spec.rb +2 -2
  39. data/spec/lib/pact_broker/api/decorators/pact_version_decorator_spec.rb +0 -3
  40. data/spec/lib/pact_broker/api/decorators/tagged_pact_versions_decorator_spec.rb +79 -0
  41. data/spec/lib/pact_broker/api/renderers/html_pact_renderer_spec.rb +5 -6
  42. data/spec/lib/pact_broker/api/resources/error_handler_spec.rb +7 -1
  43. data/spec/lib/pact_broker/api/resources/tagged_pact_versions_spec.rb +88 -0
  44. data/spec/lib/pact_broker/badges/service_spec.rb +3 -2
  45. data/spec/lib/pact_broker/certificates/service_spec.rb +8 -3
  46. data/spec/lib/pact_broker/db/log_quietener_spec.rb +42 -0
  47. data/spec/lib/pact_broker/domain/webhook_request_spec.rb +17 -12
  48. data/spec/lib/pact_broker/domain/webhook_spec.rb +7 -2
  49. data/spec/lib/pact_broker/matrix/deployment_status_summary_spec.rb +8 -1
  50. data/spec/lib/pact_broker/pacticipants/service_spec.rb +5 -3
  51. data/spec/lib/pact_broker/pacts/repository_spec.rb +44 -3
  52. data/spec/lib/pact_broker/verifications/service_spec.rb +6 -2
  53. data/spec/lib/pact_broker/webhooks/job_spec.rb +2 -0
  54. data/spec/lib/pact_broker/webhooks/service_spec.rb +6 -1
  55. data/spec/spec_helper.rb +13 -13
  56. data/spec/support/database.rb +5 -0
  57. data/spec/support/fixture_pact.rb +34 -0
  58. data/spec/support/logging.rb +5 -0
  59. data/spec/support/shared_context.rb +10 -0
  60. data/tasks/development.rake +12 -3
  61. metadata +40 -3
@@ -0,0 +1,16 @@
1
+ require 'logger'
2
+ require 'semantic_logger'
3
+
4
+ module PactBroker
5
+ module Logging
6
+ class DefaultFormatter < SemanticLogger::Formatters::Default
7
+ def initialize
8
+ @formatter = ::Logger::Formatter.new
9
+ end
10
+
11
+ def call(log, output)
12
+ @formatter.call(log.level.upcase, log.time, nil, log.message)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -3,6 +3,8 @@ require 'pact_broker/logging'
3
3
  module PactBroker
4
4
  module Matrix
5
5
  class DeploymentStatusSummary
6
+ include PactBroker::Logging
7
+
6
8
  attr_reader :rows, :resolved_selectors, :integrations
7
9
 
8
10
  def initialize(rows, resolved_selectors, integrations)
@@ -88,7 +90,7 @@ module PactBroker
88
90
  if resolved_selector
89
91
  resolved_selector[:pacticipant_version_number]
90
92
  else
91
- PactBroker.logger.warn "Could not find the resolved version for pacticipant_id #{pacticipant_id} from integrations #{integrations.collect(&:to_s).join(", ")} in resolved selectors #{resolved_selectors.inspect}"
93
+ logger.warn "Could not find the resolved version for pacticipant_id #{pacticipant_id} from integrations #{integrations.collect(&:to_s).join(", ")} in resolved selectors #{resolved_selectors.inspect}"
92
94
  "unresolved version"
93
95
  end
94
96
  end
@@ -10,7 +10,7 @@ module PactBroker
10
10
 
11
11
  extend PactBroker::Repositories
12
12
  extend PactBroker::Services
13
- extend PactBroker::Logging
13
+ include PactBroker::Logging
14
14
 
15
15
  def self.messages_for_potential_duplicate_pacticipants pacticipant_names, base_url
16
16
  messages = []
@@ -15,7 +15,7 @@ module PactBroker
15
15
 
16
16
  set_primary_key :id
17
17
  associate(:one_to_many, :tags, :class => "PactBroker::Domain::Tag", :reciprocal => :version, :key => :version_id, :primary_key => :consumer_version_id)
18
- associate(:many_to_one, :pact_version, :key => :pact_version_sha, :primary_key => :sha)
18
+ associate(:many_to_one, :pact_version, :key => :pact_version_id, :primary_key => :id)
19
19
 
20
20
  dataset_module do
21
21
  include PactBroker::Repositories::Helpers
@@ -75,15 +75,18 @@ module PactBroker
75
75
  end
76
76
 
77
77
  def find_all_pact_versions_between consumer_name, options
78
- provider_name = options.fetch(:and)
79
- LatestPactPublicationsByConsumerVersion
78
+ find_all_database_versions_between(consumer_name, options)
80
79
  .eager(:tags)
81
- .consumer(consumer_name)
82
- .provider(provider_name)
83
80
  .reverse_order(:consumer_version_order)
84
81
  .collect(&:to_domain)
85
82
  end
86
83
 
84
+ def delete_all_pact_versions_between consumer_name, options
85
+ ids = find_all_database_versions_between(consumer_name, options).select_for_subquery(:id)
86
+ webhook_repository.delete_triggered_webhooks_by_pact_publication_ids(ids)
87
+ PactPublication.where(id: ids).delete
88
+ end
89
+
87
90
  def find_latest_pact_versions_for_provider provider_name, tag = nil
88
91
  if tag
89
92
  LatestTaggedPactPublications.provider(provider_name).order_ignore_case(:consumer_name).where(tag_name: tag).collect(&:to_domain)
@@ -255,6 +258,17 @@ module PactBroker
255
258
  pact_version = PactVersion.new(consumer_id: consumer_id, provider_id: provider_id, sha: sha, content: json_content)
256
259
  pact_version.save
257
260
  end
261
+
262
+ def find_all_database_versions_between(consumer_name, options)
263
+ provider_name = options.fetch(:and)
264
+
265
+ query = LatestPactPublicationsByConsumerVersion
266
+ .consumer(consumer_name)
267
+ .provider(provider_name)
268
+
269
+ query = query.tag(options[:tag]) if options[:tag]
270
+ query
271
+ end
258
272
  end
259
273
  end
260
274
  end
@@ -68,6 +68,10 @@ module PactBroker
68
68
  pact_repository.find_all_pact_versions_between consumer, options
69
69
  end
70
70
 
71
+ def delete_all_pact_versions_between consumer, options
72
+ pact_repository.delete_all_pact_versions_between consumer, options
73
+ end
74
+
71
75
  def find_latest_pact_versions_for_provider provider_name, options = {}
72
76
  pact_repository.find_latest_pact_versions_for_provider provider_name, options[:tag]
73
77
  end
@@ -18,27 +18,28 @@
18
18
  Pacts
19
19
  %table.table.table-bordered.table-striped{ id: 'relationships' }
20
20
  %thead
21
- %th.consumer
22
- Consumer
23
- %span.glyphicon.glyphicon-sort.relationships-sort
24
- %th.consumer-version-number
25
- Consumer<br>Version
26
- %span.glyphicon.glyphicon-sort.relationships-sort
27
- %th.pact{ style: 'width: 40px' }
28
- %th.provider
29
- Provider
30
- %span.glyphicon.glyphicon-sort.relationships-sort
31
- %th.provider-version-number
32
- Provider<br>Version
33
- %span.glyphicon.glyphicon-sort.relationships-sort
34
- %th
35
- Published
36
- %span.glyphicon.glyphicon-sort.relationships-sort
37
- %th
38
- Webhook<br>status
39
- %th
40
- Last<br>verified
41
- %span.glyphicon.glyphicon-sort.relationships-sort
21
+ %tr
22
+ %th.consumer
23
+ Consumer
24
+ %span.glyphicon.glyphicon-sort.relationships-sort
25
+ %th.consumer-version-number
26
+ Consumer<br>Version
27
+ %span.glyphicon.glyphicon-sort.relationships-sort
28
+ %th.pact{ style: 'width: 40px' }
29
+ %th.provider
30
+ Provider
31
+ %span.glyphicon.glyphicon-sort.relationships-sort
32
+ %th.provider-version-number
33
+ Provider<br>Version
34
+ %span.glyphicon.glyphicon-sort.relationships-sort
35
+ %th
36
+ Published
37
+ %span.glyphicon.glyphicon-sort.relationships-sort
38
+ %th
39
+ Webhook<br>status
40
+ %th
41
+ Last<br>verified
42
+ %span.glyphicon.glyphicon-sort.relationships-sort
42
43
  %tbody
43
44
 
44
45
  - index_items.each do | index_item |
@@ -84,17 +85,17 @@
84
85
  %div.relationships-size
85
86
  = index_items.size_label
86
87
 
87
- :javascript
88
- $(function(){
89
- $("#relationships").tablesorter();
90
- });
88
+ :javascript
89
+ $(function(){
90
+ $("#relationships").tablesorter();
91
+ });
91
92
 
92
- $(document).ready(function(){
93
- $("span.pact a").load("/images/doc-text.svg");
94
- $("span.pact-matrix a").load("/images/doc-matrix.svg");
95
- $('td[data-toggle="tooltip"]').each(function(index, td){
96
- //appended tooltip div screws up table if it's appended after a
97
- //td, so need to append it to a div
98
- $(td).tooltip({container: $(td).first()});
93
+ $(document).ready(function(){
94
+ $("span.pact a").load("/images/doc-text.svg");
95
+ $("span.pact-matrix a").load("/images/doc-matrix.svg");
96
+ $('td[data-toggle="tooltip"]').each(function(index, td){
97
+ //appended tooltip div screws up table if it's appended after a
98
+ //td, so need to append it to a div
99
+ $(td).tooltip({container: $(td).first()});
100
+ });
99
101
  });
100
- });
@@ -18,22 +18,23 @@
18
18
  Pacts
19
19
  %table.table.table-bordered.table-striped{ id: 'relationships' }
20
20
  %thead
21
- %th
22
- %th.consumer
23
- Consumer
24
- %span.glyphicon.glyphicon-sort.relationships-sort
25
- %th.pact
21
+ %tr
22
+ %th
23
+ %th.consumer
24
+ Consumer
25
+ %span.glyphicon.glyphicon-sort.relationships-sort
26
+ %th.pact
26
27
 
27
- %th.provider
28
- Provider
29
- %span.glyphicon.glyphicon-sort.relationships-sort
30
- %th
31
- %th
32
- Latest pact<br>published
33
- %th
34
- Webhook<br>status
35
- %th
36
- Last<br>verified
28
+ %th.provider
29
+ Provider
30
+ %span.glyphicon.glyphicon-sort.relationships-sort
31
+ %th
32
+ %th
33
+ Latest pact<br>published
34
+ %th
35
+ Webhook<br>status
36
+ %th
37
+ Last<br>verified
37
38
  %tbody
38
39
 
39
40
  - index_items.each do | index_item |
@@ -65,17 +66,17 @@
65
66
  %div.relationships-size
66
67
  = index_items.size_label
67
68
 
68
- :javascript
69
- $(function(){
70
- $("#relationships").tablesorter();
71
- });
69
+ :javascript
70
+ $(function(){
71
+ $("#relationships").tablesorter();
72
+ });
72
73
 
73
- $(document).ready(function(){
74
- $("span.pact a").load("/images/doc-text.svg");
75
- $("span.pact-matrix a").load("/images/doc-matrix.svg");
76
- $('td[data-toggle="tooltip"]').each(function(index, td){
77
- //appended tooltip div screws up table if it's appended after a
78
- //td, so need to append it to a div
79
- $(td).tooltip({container: $(td).first()});
74
+ $(document).ready(function(){
75
+ $("span.pact a").load("/images/doc-text.svg");
76
+ $("span.pact-matrix a").load("/images/doc-matrix.svg");
77
+ $('td[data-toggle="tooltip"]').each(function(index, td){
78
+ //appended tooltip div screws up table if it's appended after a
79
+ //td, so need to append it to a div
80
+ $(td).tooltip({container: $(td).first()});
81
+ });
80
82
  });
81
- });
@@ -1,6 +1,6 @@
1
+ <!DOCTYPE html>
1
2
  %html
2
3
  %head
3
4
  %title= defined?(title) ? title : ""
4
5
  %link{rel: 'shortcut icon', href: '/images/favicon.ico', type:'image/x-icon'}
5
- %body
6
- = yield
6
+ = yield
@@ -7,142 +7,141 @@
7
7
  %script{type: 'text/javascript', src:'/javascripts/matrix.js'}
8
8
  %script{type: 'text/javascript', src:'/js/bootstrap.min.js'}
9
9
 
10
- -# This code is an embarassment. Sorry. Just trying to get as much stuff done in the little time I have.
10
+ .container
11
+ .navbar-right
12
+ %a{href: '/'}
13
+ Home
14
+ %h1.page-header
15
+ = title
11
16
 
12
- .container
13
- .navbar-right
14
- %a{href: '/'}
15
- Home
16
- %h1.page-header
17
- = title
17
+ - if defined?(errors) && errors.any?
18
+ - errors.each do | error |
19
+ %div.alert.alert-danger
20
+ = error
18
21
 
19
- - if defined?(errors) && errors.any?
20
- - errors.each do | error |
21
- %div.alert.alert-danger
22
- = error
22
+ %form{action: '/matrix', onsubmit:'return onSubmit()'}
23
+ - selectors.each_with_index do | selector, index |
24
+ .selector
25
+ %label{for: "pacticipant#{index}"}
26
+ Pacticipant name
27
+ %input{name: 'q[]pacticipant', id: "pacticipant1#{index}", value: selector.pacticipant_name}
23
28
 
24
- %form{action: '/matrix', onsubmit:'return onSubmit()'}
25
- - selectors.each_with_index do | selector, index |
26
- .selector
27
- %label{for: "pacticipant#{index}"}
28
- Pacticipant name
29
- %input{name: 'q[]pacticipant', id: "pacticipant1#{index}", value: selector.pacticipant_name}
29
+ .input-group
30
30
 
31
- .input-group
32
-
33
- .input-group
34
- %select{ name: "ignorethis#{index}", class: 'version-selectorizor' }
35
- %option{ value: 'specify-all-versions', selected: selector.specify_all_versions }
36
- All versions
37
- %option{ value: 'specify-latest', selected: selector.specify_latest }
38
- Latest version
39
- %option{ value: 'specify-version', selected: selector.specify_version }
40
- Version number ...
41
- %option{ value: 'specify-latest-tag', selected: selector.specify_latest_tag }
42
- Latest version with tag ...
43
- %option{ value: 'specify-all-tagged', selected: selector.specify_all_tagged }
44
- All versions with tag...
31
+ .input-group
32
+ %select{ name: "ignorethis#{index}", class: 'version-selectorizor' }
33
+ %option{ value: 'specify-all-versions', selected: selector.specify_all_versions }
34
+ All versions
35
+ %option{ value: 'specify-latest', selected: selector.specify_latest }
36
+ Latest version
37
+ %option{ value: 'specify-version', selected: selector.specify_version }
38
+ Version number ...
39
+ %option{ value: 'specify-latest-tag', selected: selector.specify_latest_tag }
40
+ Latest version with tag ...
41
+ %option{ value: 'specify-all-tagged', selected: selector.specify_all_tagged }
42
+ All versions with tag...
45
43
 
46
- %input{name: 'q[]version', type: 'text', id: "pacticipant#{index}_version", class: 'version', value: selector.pacticipant_version_number}
44
+ %input{name: 'q[]version', type: 'text', id: "pacticipant#{index}_version", class: 'version', value: selector.pacticipant_version_number}
47
45
 
48
- %input{name: 'q[]tag', type: 'text', id: "pacticipant#{index}_tag", class: 'tag', value: selector.tag}
46
+ %input{name: 'q[]tag', type: 'text', id: "pacticipant#{index}_tag", class: 'tag', value: selector.tag}
49
47
 
50
- %input{name: 'q[]latest', value: 'true', hidden: true, class: 'latest-flag'}
48
+ %input{name: 'q[]latest', value: 'true', hidden: true, class: 'latest-flag'}
51
49
 
52
50
 
53
- %div.top-of-group
54
- .input-group
55
- %input{type: 'radio', name: "latestby", class: '', value: '', id: 'all_rows', checked: options.all_rows_checked}
56
- %label{for: 'all_rows'}
57
- Show all results
58
- %div
59
- .input-group
60
- %input{type: 'radio', name: "latestby", class: '', value: 'cvpv', id: 'cvpv', checked: options.cvpv_checked}
61
- %label{for: 'cvpv'}
62
- Show latest result for each consumer version/provider version
63
- %div
64
- .input-group
65
- %input{type: 'radio', name: "latestby", class: '', value: 'cvp', id: 'cvp', checked: options.cvp_checked}
66
- %label{for: 'cvp'}
67
- Show latest result for each consumer version/provider
68
- %div.top-of-group
69
- - limit_text = "Note that the 'Show latest...' options are summaries of the 'Show all results' query, and that the limit applies to the underlying query, rather than the number of rows returned in the summary."
70
- %label{for: "limit", "title": limit_text, "data-toggle": "tooltip", "data-placement": "right"}
71
- Limit*
72
- %input{name: 'limit', id: "limit", value: options.limit}
73
- %div.top-of-group
74
- %input{type: 'submit'}
51
+ %div.top-of-group
52
+ .input-group
53
+ %input{type: 'radio', name: "latestby", class: '', value: '', id: 'all_rows', checked: options.all_rows_checked}
54
+ %label{for: 'all_rows'}
55
+ Show all results
56
+ %div
57
+ .input-group
58
+ %input{type: 'radio', name: "latestby", class: '', value: 'cvpv', id: 'cvpv', checked: options.cvpv_checked}
59
+ %label{for: 'cvpv'}
60
+ Show latest result for each consumer version/provider version
61
+ %div
62
+ .input-group
63
+ %input{type: 'radio', name: "latestby", class: '', value: 'cvp', id: 'cvp', checked: options.cvp_checked}
64
+ %label{for: 'cvp'}
65
+ Show latest result for each consumer version/provider
66
+ %div.top-of-group
67
+ - limit_text = "Note that the 'Show latest...' options are summaries of the 'Show all results' query, and that the limit applies to the underlying query, rather than the number of rows returned in the summary."
68
+ %label{for: "limit", "title": limit_text, "data-toggle": "tooltip", "data-placement": "right"}
69
+ Limit*
70
+ %input{name: 'limit', id: "limit", value: options.limit}
71
+ %div.top-of-group
72
+ %input{type: 'submit'}
75
73
 
76
74
 
77
- %p{style: 'text-align:right'}
78
- = "#{lines.size} rows"
79
- %table.table.table-bordered.table-striped{id: 'matrix'}
80
- %thead
81
- %th.consumer
82
- = "Consumer"
83
- %span.glyphicon.glyphicon-sort.sort
84
- %th.consumer-version
85
- = "Consumer Version"
86
- %span.glyphicon.glyphicon-sort.sort
87
- %th.pact-published
88
- = "Pact Published"
89
- %span.glyphicon.glyphicon-sort.sort
90
- %th.provider
91
- = "Provider"
92
- %span.glyphicon.glyphicon-sort.sort
93
- %th.provider-version
94
- = "Provider Version"
95
- %span.glyphicon.glyphicon-sort.sort
96
- %th.verification-result
97
- Pact verified
98
- %span.glyphicon.glyphicon-sort.sort
99
- %tbody
100
- - lines.each do | line |
101
- %tr
102
- %td.consumer{'data-sort-value' => line.consumer_name}
103
- %a{href: line.consumer_name_url}
104
- = line.consumer_name
105
- %td.consumer-version{'data-sort-value' => line.consumer_version_order}
106
- %div
107
- %a{href: line.consumer_version_number_url}
108
- = line.display_consumer_version_number
109
- - line.latest_consumer_version_tags.each do | tag |
110
- .tag-parent{"title": tag.tooltip, "data-toggle": "tooltip", "data-placement": "right"}
111
- %a{href: tag.url}
112
- .tag.label.label-primary
113
- = tag.name
114
- - line.other_consumer_version_tags.each do | tag |
115
- .tag-parent{"title": tag.tooltip, "data-toggle": "tooltip", "data-placement": "right"}
116
- %a{href: tag.url}
117
- .tag.label.label-default
118
- = tag.name
119
- %td.pact-published{'data-sort-value' => line.pact_published_order, "title": line.inherited_verification_message, "data-toggle": "tooltip"}
120
- %a{href: line.pact_publication_date_url}
121
- - if options.all_rows_checked
122
- = "#{line.pact_publication_date} (revision #{line.pact_revision_number})"
123
- - else
124
- = line.pact_publication_date
75
+ %p{style: 'text-align:right'}
76
+ = "#{lines.size} rows"
77
+ %table.table.table-bordered.table-striped{id: 'matrix'}
78
+ %thead
79
+ %tr
80
+ %th.consumer
81
+ = "Consumer"
82
+ %span.glyphicon.glyphicon-sort.sort
83
+ %th.consumer-version
84
+ = "Consumer Version"
85
+ %span.glyphicon.glyphicon-sort.sort
86
+ %th.pact-published
87
+ = "Pact Published"
88
+ %span.glyphicon.glyphicon-sort.sort
89
+ %th.provider
90
+ = "Provider"
91
+ %span.glyphicon.glyphicon-sort.sort
92
+ %th.provider-version
93
+ = "Provider Version"
94
+ %span.glyphicon.glyphicon-sort.sort
95
+ %th.verification-result
96
+ Pact verified
97
+ %span.glyphicon.glyphicon-sort.sort
98
+ %tbody
99
+ - lines.each do | line |
100
+ %tr
101
+ %td.consumer{'data-sort-value' => line.consumer_name}
102
+ %a{href: line.consumer_name_url}
103
+ = line.consumer_name
104
+ %td.consumer-version{'data-sort-value' => line.consumer_version_order}
105
+ %div
106
+ %a{href: line.consumer_version_number_url}
107
+ = line.display_consumer_version_number
108
+ - line.latest_consumer_version_tags.each do | tag |
109
+ .tag-parent{"title": tag.tooltip, "data-toggle": "tooltip", "data-placement": "right"}
110
+ %a{href: tag.url}
111
+ .tag.label.label-primary
112
+ = tag.name
113
+ - line.other_consumer_version_tags.each do | tag |
114
+ .tag-parent{"title": tag.tooltip, "data-toggle": "tooltip", "data-placement": "right"}
115
+ %a{href: tag.url}
116
+ .tag.label.label-default
117
+ = tag.name
118
+ %td.pact-published{'data-sort-value' => line.pact_published_order, "title": line.inherited_verification_message, "data-toggle": "tooltip"}
119
+ %a{href: line.pact_publication_date_url}
120
+ - if options.all_rows_checked
121
+ = "#{line.pact_publication_date} (revision #{line.pact_revision_number})"
122
+ - else
123
+ = line.pact_publication_date
125
124
 
126
- %td.provider{'data-sort-value' => line.provider_name}
127
- %a{href: line.provider_name_url}
128
- = line.provider_name
129
- %td.provider-version{'data-sort-value' => line.provider_version_order}
130
- %div
131
- %a{href: line.provider_version_number_url}
132
- = line.display_provider_version_number
133
- - line.latest_provider_version_tags.each do | tag |
134
- .tag-parent{"title": tag.tooltip, "data-toggle": "tooltip", "data-placement": "right"}
135
- %a{href: tag.url}
136
- .tag.label.label-primary
137
- = tag.name
138
- - line.other_provider_version_tags.each do | tag |
139
- .tag-parent{"title": tag.tooltip, "data-toggle": "tooltip", "data-placement": "right"}
140
- %a{href: tag.url}
141
- .tag.label.label-default
142
- = tag.name
143
- %td.verification-result{class: line.verification_status_class, "title": line.inherited_verification_message, "data-toggle": "tooltip"}
144
- %a{href: line.verification_status_url}
145
- - if options.all_rows_checked && line.number
146
- = "#{line.verification_status} (number #{line.number})"
147
- - else
148
- = line.verification_status
125
+ %td.provider{'data-sort-value' => line.provider_name}
126
+ %a{href: line.provider_name_url}
127
+ = line.provider_name
128
+ %td.provider-version{'data-sort-value' => line.provider_version_order}
129
+ %div
130
+ %a{href: line.provider_version_number_url}
131
+ = line.display_provider_version_number
132
+ - line.latest_provider_version_tags.each do | tag |
133
+ .tag-parent{"title": tag.tooltip, "data-toggle": "tooltip", "data-placement": "right"}
134
+ %a{href: tag.url}
135
+ .tag.label.label-primary
136
+ = tag.name
137
+ - line.other_provider_version_tags.each do | tag |
138
+ .tag-parent{"title": tag.tooltip, "data-toggle": "tooltip", "data-placement": "right"}
139
+ %a{href: tag.url}
140
+ .tag.label.label-default
141
+ = tag.name
142
+ %td.verification-result{class: line.verification_status_class, "title": line.inherited_verification_message, "data-toggle": "tooltip"}
143
+ %a{href: line.verification_status_url}
144
+ - if options.all_rows_checked && line.number
145
+ = "#{line.verification_status} (number #{line.number})"
146
+ - else
147
+ = line.verification_status