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.
- checksums.yaml +5 -5
- data/.travis.yml +1 -1
- data/CHANGELOG.md +32 -0
- data/DEVELOPER_SETUP.md +1 -0
- data/example/config.ru +1 -1
- data/lib/pact_broker.rb +1 -0
- data/lib/pact_broker/api.rb +1 -0
- data/lib/pact_broker/api/decorators/pact_version_decorator.rb +0 -5
- data/lib/pact_broker/api/decorators/tagged_pact_versions_decorator.rb +46 -0
- data/lib/pact_broker/api/renderers/html_pact_renderer.rb +1 -1
- data/lib/pact_broker/api/resources/error_handler.rb +1 -0
- data/lib/pact_broker/api/resources/index.rb +6 -0
- data/lib/pact_broker/api/resources/tagged_pact_versions.rb +38 -0
- data/lib/pact_broker/app.rb +12 -6
- data/lib/pact_broker/certificates/service.rb +1 -0
- data/lib/pact_broker/configuration.rb +11 -16
- data/lib/pact_broker/db/log_quietener.rb +38 -0
- data/lib/pact_broker/doc/views/index/tagged-pact-versions.markdown +7 -0
- data/lib/pact_broker/logging.rb +25 -20
- data/lib/pact_broker/logging/default_formatter.rb +16 -0
- data/lib/pact_broker/matrix/deployment_status_summary.rb +3 -1
- data/lib/pact_broker/pacticipants/service.rb +1 -1
- data/lib/pact_broker/pacts/all_pact_publications.rb +1 -1
- data/lib/pact_broker/pacts/repository.rb +18 -4
- data/lib/pact_broker/pacts/service.rb +4 -0
- data/lib/pact_broker/ui/views/index/show-with-tags.haml +34 -33
- data/lib/pact_broker/ui/views/index/show.haml +28 -27
- data/lib/pact_broker/ui/views/layouts/main.haml +2 -2
- data/lib/pact_broker/ui/views/matrix/show.haml +126 -127
- data/lib/pact_broker/verifications/service.rb +3 -1
- data/lib/pact_broker/version.rb +1 -1
- data/lib/pact_broker/versions/repository.rb +3 -1
- data/lib/pact_broker/webhooks/job.rb +1 -0
- data/pact_broker.gemspec +1 -0
- data/script/db-spec.sh +2 -0
- data/spec/features/delete_tagged_pact_versions_spec.rb +28 -0
- data/spec/features/get_tagged_pact_versions_spec.rb +26 -0
- data/spec/integration/ui/index_spec.rb +2 -2
- data/spec/lib/pact_broker/api/decorators/pact_version_decorator_spec.rb +0 -3
- data/spec/lib/pact_broker/api/decorators/tagged_pact_versions_decorator_spec.rb +79 -0
- data/spec/lib/pact_broker/api/renderers/html_pact_renderer_spec.rb +5 -6
- data/spec/lib/pact_broker/api/resources/error_handler_spec.rb +7 -1
- data/spec/lib/pact_broker/api/resources/tagged_pact_versions_spec.rb +88 -0
- data/spec/lib/pact_broker/badges/service_spec.rb +3 -2
- data/spec/lib/pact_broker/certificates/service_spec.rb +8 -3
- data/spec/lib/pact_broker/db/log_quietener_spec.rb +42 -0
- data/spec/lib/pact_broker/domain/webhook_request_spec.rb +17 -12
- data/spec/lib/pact_broker/domain/webhook_spec.rb +7 -2
- data/spec/lib/pact_broker/matrix/deployment_status_summary_spec.rb +8 -1
- data/spec/lib/pact_broker/pacticipants/service_spec.rb +5 -3
- data/spec/lib/pact_broker/pacts/repository_spec.rb +44 -3
- data/spec/lib/pact_broker/verifications/service_spec.rb +6 -2
- data/spec/lib/pact_broker/webhooks/job_spec.rb +2 -0
- data/spec/lib/pact_broker/webhooks/service_spec.rb +6 -1
- data/spec/spec_helper.rb +13 -13
- data/spec/support/database.rb +5 -0
- data/spec/support/fixture_pact.rb +34 -0
- data/spec/support/logging.rb +5 -0
- data/spec/support/shared_context.rb +10 -0
- data/tasks/development.rake +12 -3
- 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
|
-
|
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
|
@@ -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 => :
|
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
|
-
|
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
|
-
%
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
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
|
-
|
89
|
-
|
90
|
-
|
88
|
+
:javascript
|
89
|
+
$(function(){
|
90
|
+
$("#relationships").tablesorter();
|
91
|
+
});
|
91
92
|
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
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
|
-
%
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
21
|
+
%tr
|
22
|
+
%th
|
23
|
+
%th.consumer
|
24
|
+
Consumer
|
25
|
+
%span.glyphicon.glyphicon-sort.relationships-sort
|
26
|
+
%th.pact
|
26
27
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
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
|
-
|
70
|
-
|
71
|
-
|
69
|
+
:javascript
|
70
|
+
$(function(){
|
71
|
+
$("#relationships").tablesorter();
|
72
|
+
});
|
72
73
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
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
|
-
});
|
@@ -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
|
-
|
10
|
+
.container
|
11
|
+
.navbar-right
|
12
|
+
%a{href: '/'}
|
13
|
+
Home
|
14
|
+
%h1.page-header
|
15
|
+
= title
|
11
16
|
|
12
|
-
.
|
13
|
-
|
14
|
-
|
15
|
-
|
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
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
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
|
-
|
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
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
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
|
-
|
44
|
+
%input{name: 'q[]version', type: 'text', id: "pacticipant#{index}_version", class: 'version', value: selector.pacticipant_version_number}
|
47
45
|
|
48
|
-
|
46
|
+
%input{name: 'q[]tag', type: 'text', id: "pacticipant#{index}_tag", class: 'tag', value: selector.tag}
|
49
47
|
|
50
|
-
|
48
|
+
%input{name: 'q[]latest', value: 'true', hidden: true, class: 'latest-flag'}
|
51
49
|
|
52
50
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
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
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
%
|
103
|
-
%
|
104
|
-
|
105
|
-
|
106
|
-
%
|
107
|
-
%
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
%
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
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
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
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
|