danger-shroud 0.0.5 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ef8bbfd7e32b3948a01570f48a893401eda640342e58fb4721c6da5dc66ea94e
4
- data.tar.gz: 8b4d3599b8eb136074632beba3c18c900ffea7b9ebc0d75abcaf9b986724e0d9
3
+ metadata.gz: 234c6bbce9b759a9a8b744c477e5b0f90ab40d742830635a6ff284f85b1b1015
4
+ data.tar.gz: 21e54c40b94bdd7d4989516d5287279427888f07efc48475e6f754908f0b72c8
5
5
  SHA512:
6
- metadata.gz: af7c215e0fbaf9a39a6d7af965e3f322bb0a49fe9703782df35f74b016b4c7d5e081f14a769c9c4a0c70d6c9c48036124982b93ef59f5556dff43dbfa219a548
7
- data.tar.gz: 31bc8ee27909c4164b77b276d69f9c8d30d49fb3e0ee32a4d60c64774e588a6a2d5c1fb0e17d145bd7dbc8867213de7f753dc92d1fccdec4ebcb8f7c5e8094d6
6
+ metadata.gz: 4ad01b61dfe54625578c9e8b8b26f0520cffcee3d63e5f7275a1a45c332e503f4c2d0d254fb6619e35e9d20d51fc982d917e370be23668ed82f3293343b77fa5
7
+ data.tar.gz: c5403ff85b292d6ad451ae73998e9fff69e76c462e260bf4dd8d918bc519fb88ff1fc38bde541421b25145eabbf70e96a04ceb4b1f26559b91f2f7fb53d30ef4
@@ -0,0 +1,10 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: "bundler"
4
+ directory: "/"
5
+ schedule:
6
+ interval: "daily"
7
+ open-pull-requests-limit: 0
8
+ # Add/Remove reviewers here
9
+ reviewers:
10
+ - "david-livefront"
@@ -4,6 +4,9 @@ on:
4
4
  push:
5
5
  branches: [ "master" ]
6
6
 
7
+ env:
8
+ RUBY_VERSION: 2.7.2
9
+
7
10
  jobs:
8
11
  build:
9
12
  name: Build + Publish
@@ -14,10 +17,10 @@ jobs:
14
17
 
15
18
  steps:
16
19
  - uses: actions/checkout@v3
17
- - name: Set up Ruby 2.6
18
- uses: actions/setup-ruby@v1
20
+ - name: Set up Ruby ${{ env.RUBY_VERSION }}
21
+ uses: ruby/setup-ruby@v1
19
22
  with:
20
- ruby-version: 2.6.x
23
+ ruby-version: ${{ env.RUBY_VERSION }}
21
24
 
22
25
  - name: Publish to RubyGems
23
26
  run: |
data/Gemfile.lock CHANGED
@@ -1,56 +1,59 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- danger-shroud (0.0.5)
4
+ danger-shroud (0.0.7)
5
5
  danger-plugin-api (~> 1.0)
6
6
  nokogiri
7
7
 
8
8
  GEM
9
9
  remote: https://rubygems.org/
10
10
  specs:
11
- addressable (2.8.0)
12
- public_suffix (>= 2.0.2, < 5.0)
13
- ast (2.4.0)
14
- claide (1.0.3)
11
+ addressable (2.8.4)
12
+ public_suffix (>= 2.0.2, < 6.0)
13
+ ast (2.4.2)
14
+ claide (1.1.0)
15
15
  claide-plugins (0.9.2)
16
16
  cork
17
17
  nap
18
18
  open4 (~> 1.3)
19
- coderay (1.1.2)
19
+ coderay (1.1.3)
20
20
  colored2 (3.1.2)
21
21
  cork (0.3.0)
22
22
  colored2 (~> 3.1)
23
- danger (6.3.2)
23
+ danger (9.2.0)
24
24
  claide (~> 1.0)
25
25
  claide-plugins (>= 0.9.2)
26
26
  colored2 (~> 3.1)
27
27
  cork (~> 0.1)
28
- faraday (~> 0.9)
28
+ faraday (>= 0.9.0, < 3.0)
29
29
  faraday-http-cache (~> 2.0)
30
- git (~> 1.6)
31
- kramdown (~> 2.0)
30
+ git (~> 1.7)
31
+ kramdown (~> 2.3)
32
32
  kramdown-parser-gfm (~> 1.0)
33
33
  no_proxy_fix
34
- octokit (~> 4.7)
35
- terminal-table (~> 1)
34
+ octokit (~> 5.0)
35
+ terminal-table (>= 1, < 4)
36
36
  danger-plugin-api (1.0.0)
37
37
  danger (> 2.0)
38
- diff-lcs (1.3)
39
- faraday (0.17.3)
40
- multipart-post (>= 1.2, < 3)
41
- faraday-http-cache (2.0.0)
42
- faraday (~> 0.8)
43
- ffi (1.11.1)
44
- formatador (0.2.5)
45
- git (1.11.0)
38
+ diff-lcs (1.5.0)
39
+ faraday (2.7.4)
40
+ faraday-net_http (>= 2.0, < 3.1)
41
+ ruby2_keywords (>= 0.0.4)
42
+ faraday-http-cache (2.4.1)
43
+ faraday (>= 0.8)
44
+ faraday-net_http (3.0.2)
45
+ ffi (1.15.5)
46
+ formatador (1.1.0)
47
+ git (1.18.0)
48
+ addressable (~> 2.8)
46
49
  rchardet (~> 1.8)
47
- guard (2.15.0)
50
+ guard (2.18.0)
48
51
  formatador (>= 0.2.4)
49
52
  listen (>= 2.7, < 4.0)
50
53
  lumberjack (>= 1.0.12, < 2.0)
51
54
  nenv (~> 0.1)
52
55
  notiffany (~> 0.0)
53
- pry (>= 0.9.12)
56
+ pry (>= 0.13.0)
54
57
  shellany (~> 0.0)
55
58
  thor (>= 0.18.1)
56
59
  guard-compat (1.2.1)
@@ -58,76 +61,82 @@ GEM
58
61
  guard (~> 2.1)
59
62
  guard-compat (~> 1.1)
60
63
  rspec (>= 2.99.0, < 4.0)
61
- jaro_winkler (1.5.2)
62
- kramdown (2.3.1)
64
+ json (2.6.3)
65
+ kramdown (2.4.0)
63
66
  rexml
64
67
  kramdown-parser-gfm (1.1.0)
65
68
  kramdown (~> 2.0)
66
69
  listen (3.0.7)
67
70
  rb-fsevent (>= 0.9.3)
68
71
  rb-inotify (>= 0.9.7)
69
- lumberjack (1.0.13)
70
- method_source (0.9.2)
71
- mini_portile2 (2.8.0)
72
- multipart-post (2.1.1)
72
+ lumberjack (1.2.8)
73
+ method_source (1.0.0)
74
+ mini_portile2 (2.8.1)
73
75
  nap (1.1.0)
74
76
  nenv (0.3.0)
75
77
  no_proxy_fix (0.1.2)
76
- nokogiri (1.13.6)
78
+ nokogiri (1.14.3)
77
79
  mini_portile2 (~> 2.8.0)
78
80
  racc (~> 1.4)
79
- notiffany (0.1.1)
81
+ notiffany (0.1.3)
80
82
  nenv (~> 0.1)
81
83
  shellany (~> 0.0)
82
- octokit (4.18.0)
83
- faraday (>= 0.9)
84
- sawyer (~> 0.8.0, >= 0.5.3)
84
+ octokit (5.6.1)
85
+ faraday (>= 1, < 3)
86
+ sawyer (~> 0.9)
85
87
  open4 (1.3.4)
86
- parallel (1.17.0)
87
- parser (2.6.3.0)
88
- ast (~> 2.4.0)
89
- pry (0.12.2)
90
- coderay (~> 1.1.0)
91
- method_source (~> 0.9.0)
92
- public_suffix (4.0.6)
93
- racc (1.6.0)
94
- rainbow (3.0.0)
95
- rake (13.0.3)
96
- rb-fsevent (0.10.3)
97
- rb-inotify (0.10.0)
88
+ parallel (1.22.1)
89
+ parser (3.2.2.0)
90
+ ast (~> 2.4.1)
91
+ pry (0.14.2)
92
+ coderay (~> 1.1)
93
+ method_source (~> 1.0)
94
+ public_suffix (5.0.1)
95
+ racc (1.6.2)
96
+ rainbow (3.1.1)
97
+ rake (13.0.6)
98
+ rb-fsevent (0.11.2)
99
+ rb-inotify (0.10.1)
98
100
  ffi (~> 1.0)
99
101
  rchardet (1.8.0)
102
+ regexp_parser (2.8.0)
100
103
  rexml (3.2.5)
101
- rspec (3.8.0)
102
- rspec-core (~> 3.8.0)
103
- rspec-expectations (~> 3.8.0)
104
- rspec-mocks (~> 3.8.0)
105
- rspec-core (3.8.0)
106
- rspec-support (~> 3.8.0)
107
- rspec-expectations (3.8.3)
104
+ rspec (3.12.0)
105
+ rspec-core (~> 3.12.0)
106
+ rspec-expectations (~> 3.12.0)
107
+ rspec-mocks (~> 3.12.0)
108
+ rspec-core (3.12.1)
109
+ rspec-support (~> 3.12.0)
110
+ rspec-expectations (3.12.2)
108
111
  diff-lcs (>= 1.2.0, < 2.0)
109
- rspec-support (~> 3.8.0)
110
- rspec-mocks (3.8.0)
112
+ rspec-support (~> 3.12.0)
113
+ rspec-mocks (3.12.5)
111
114
  diff-lcs (>= 1.2.0, < 2.0)
112
- rspec-support (~> 3.8.0)
113
- rspec-support (3.8.0)
114
- rubocop (0.71.0)
115
- jaro_winkler (~> 1.5.1)
115
+ rspec-support (~> 3.12.0)
116
+ rspec-support (3.12.0)
117
+ rubocop (1.50.2)
118
+ json (~> 2.3)
116
119
  parallel (~> 1.10)
117
- parser (>= 2.6)
120
+ parser (>= 3.2.0.0)
118
121
  rainbow (>= 2.2.2, < 4.0)
122
+ regexp_parser (>= 1.8, < 3.0)
123
+ rexml (>= 3.2.5, < 4.0)
124
+ rubocop-ast (>= 1.28.0, < 2.0)
119
125
  ruby-progressbar (~> 1.7)
120
- unicode-display_width (>= 1.4.0, < 1.7)
121
- ruby-progressbar (1.10.1)
122
- sawyer (0.8.2)
126
+ unicode-display_width (>= 2.4.0, < 3.0)
127
+ rubocop-ast (1.28.0)
128
+ parser (>= 3.2.1.0)
129
+ ruby-progressbar (1.13.0)
130
+ ruby2_keywords (0.0.5)
131
+ sawyer (0.9.2)
123
132
  addressable (>= 2.3.5)
124
- faraday (> 0.8, < 2.0)
133
+ faraday (>= 0.17.3, < 3)
125
134
  shellany (0.0.1)
126
- terminal-table (1.8.0)
127
- unicode-display_width (~> 1.1, >= 1.1.1)
128
- thor (0.20.3)
129
- unicode-display_width (1.6.0)
130
- yard (0.9.26)
135
+ terminal-table (3.0.2)
136
+ unicode-display_width (>= 1.1.1, < 3)
137
+ thor (1.2.1)
138
+ unicode-display_width (2.4.2)
139
+ yard (0.9.34)
131
140
 
132
141
  PLATFORMS
133
142
  ruby
@@ -145,4 +154,4 @@ DEPENDENCIES
145
154
  yard
146
155
 
147
156
  BUNDLED WITH
148
- 2.2.7
157
+ 2.3.18
data/README.md CHANGED
@@ -1,3 +1,14 @@
1
+
2
+ - [danger-shroud](#danger-shroud)
3
+ - [Installation](#installation)
4
+ - [Usage Kover](#usage-kover)
5
+ - [Parameters](#parameters)
6
+ - [Examples](#examples)
7
+ - [Usage Jacoco](#usage-jacoco)
8
+ - [Parameters](#parameters-1)
9
+ - [Examples](#examples-1)
10
+ - [Development](#development)
11
+
1
12
  # danger-shroud
2
13
 
3
14
  A danger plugin for enforcing code coverage coverage via a Kover or Jacoco coverage report.
@@ -16,6 +27,21 @@ gem 'danger-shroud'
16
27
 
17
28
  Shroud depends on having a Kover coverage report generated for your project. For Android projects, [kotlinx-kover](https://github.com/Kotlin/kotlinx-kover) works well.
18
29
 
30
+ ### Parameters
31
+
32
+ You can use the following parameters to control how shroud operates:
33
+
34
+ Param | Type | Description | Example
35
+ ---|---|---|---|
36
+ moduleName | String | the display name of the project or module |`'Module Name '`
37
+ file | String | file path to a Kover xml coverage report. | `'path/to/kover/report.xml'`
38
+ totalProjectThreshold | Integer | defines the required percentage of total project coverage for a passing build. | default `90`
39
+ modifiedFileThreshold | Integer | defines the required percentage of files modified in a PR for a passing build. | default `90`
40
+ failIfUnderProjectThreshold | Boolean | if true, will fail builds that are under the provided thresholds. if false, will only warn. | default `true`
41
+ failIfUnderFileThreshold | Boolean | if true, will fail builds that are under the provided thresholds. if false, will only warn. | default `true`
42
+
43
+ ### Examples
44
+
19
45
  Running shroud with default values:
20
46
 
21
47
  ```ruby
@@ -36,13 +62,27 @@ Warn on builds instead of fail:
36
62
 
37
63
  ```ruby
38
64
  # Report coverage of modified files the same as the above example, except the
39
- # builds will only warn instead of fail if below thresholds
40
- shroud.reportKover 'Module Name', 'path/to/kover/report.xml', 80, 95, false
65
+ # builds will only warn instead of fail if below project thresholds
66
+ shroud.reportKover 'Module Name', 'path/to/kover/report.xml', 80, 95, false, false
41
67
  ```
42
68
 
43
-
44
69
  ## Usage Jacoco
45
70
 
71
+ ### Parameters
72
+
73
+ You can use the following parameters to control how shroud operates:
74
+
75
+ Param | Type | Description | Example
76
+ ---|---|---|---|
77
+ moduleName | String | the display name of the project or module |`'Module Name '`
78
+ file | String | file path to a Kover xml coverage report. | `'path/to/jacoco/report.xml'`
79
+ totalProjectThreshold | Integer | defines the required percentage of total project coverage for a passing build. | default `90`
80
+ modifiedFileThreshold | Integer | defines the required percentage of files modified in a PR for a passing build. | default `90`
81
+ failIfUnderProjectThreshold | Boolean | if true, will fail builds that are under the provided thresholds. if false, will only warn. | default `true`
82
+ failIfUnderFileThreshold | Boolean | if true, will fail builds that are under the provided thresholds. if false, will only warn. | default `true`
83
+
84
+ ### Examples
85
+
46
86
  Shroud depends on having a Jacoco coverage report generated for your project. For Android projects, [jacoco-android-gradle-plugin](https://github.com/arturdm/jacoco-android-gradle-plugin) works well.
47
87
 
48
88
  Running shroud with default values:
@@ -66,12 +106,9 @@ Warn on builds instead of fail:
66
106
  ```ruby
67
107
  # Report coverage of modified files the same as the above example, except the
68
108
  # builds will only warn instead of fail if below thresholds
69
- shroud.reportJacoco 'Module Name', 'path/to/jacoco/report.xml', 80, 95, false
109
+ shroud.reportJacoco 'Module Name', 'path/to/jacoco/report.xml', 80, 95, false, false
70
110
  ```
71
111
 
72
-
73
-
74
-
75
112
  ## Development
76
113
 
77
114
  1. Clone this repo
@@ -1,3 +1,3 @@
1
1
  module Shroud
2
- VERSION = "0.0.5".freeze
2
+ VERSION = "0.0.7".freeze
3
3
  end
data/lib/shroud/plugin.rb CHANGED
@@ -23,7 +23,7 @@ module Danger
23
23
  #
24
24
  # # Report coverage of modified files the same as the above example, except the
25
25
  # # builds will only warn instead of fail if below thresholds
26
- # shroud.reportKover 'Project Name', 'path/to/kover/report.xml', 80, 95, false
26
+ # shroud.reportKover 'Project Name', 'path/to/kover/report.xml', 80, 95, false, false
27
27
  #
28
28
  # @example Running Shroud with default values for Jacoco
29
29
  #
@@ -41,7 +41,7 @@ module Danger
41
41
  #
42
42
  # # Report coverage of modified files the same as the above example, except the
43
43
  # # builds will only warn instead of fail if below thresholds
44
- # shroud.reportJacoco 'Project Name', 'path/to/jacoco/report.xml', 80, 95, false
44
+ # shroud.reportJacoco 'Project Name', 'path/to/jacoco/report.xml', 80, 95, false, false
45
45
  #
46
46
  # @tags android, kover, jacoco, coverage
47
47
  #
@@ -62,14 +62,18 @@ module Danger
62
62
  # defines the required percentage of files modified in a PR for a passing build.
63
63
  # default 90.
64
64
  #
65
- # @param [Boolean] failIfUnderThreshold
66
- # if true, will fail builds that are under the provided thresholds. if false, will only warn.
65
+ # @param [Boolean] failIfUnderProjectThreshold
66
+ # if true, will fail builds that are under the provided thresholds for the overall project. If false, will only warn.
67
+ # default true.
68
+ #
69
+ # @param [Boolean] failIfUnderFileThreshold
70
+ # if true, will fail builds that are under the provided thresholds per file. If false, will only warn.
67
71
  # default true.
68
72
  #
69
73
  # @return [void]
70
- def report(file, totalProjectThreshold = 90, modifiedFileThreshold = 90, failIfUnderThreshold = true)
74
+ def report(file, totalProjectThreshold = 90, modifiedFileThreshold = 90, failIfUnderProjectThreshold = true, failIfUnderFileThreshold = failIfUnderProjectThreshold)
71
75
  warn "[DEPRECATION] `report` is deprecated. Please use `reportJacoco` or `reportKover` instead."
72
- reportJacoco('Project', file, totalProjectThreshold = 90, modifiedFileThreshold = 90, failIfUnderThreshold = true)
76
+ reportJacoco('Project', file, totalProjectThreshold = 90, modifiedFileThreshold = 90, failIfUnderProjectThreshold, failIfUnderFileThreshold)
73
77
  end
74
78
 
75
79
  # Report coverage on diffed files, as well as overall coverage.
@@ -88,13 +92,17 @@ module Danger
88
92
  # defines the required percentage of files modified in a PR for a passing build.
89
93
  # default 90.
90
94
  #
91
- # @param [Boolean] failIfUnderThreshold
92
- # if true, will fail builds that are under the provided thresholds. if false, will only warn.
95
+ # @param [Boolean] failIfUnderProjectThreshold
96
+ # if true, will fail builds that are under the provided thresholds for the overall project. If false, will only warn.
97
+ # default true.
98
+ #
99
+ # @param [Boolean] failIfUnderFileThreshold
100
+ # if true, will fail builds that are under the provided thresholds per file. If false, will only warn.
93
101
  # default true.
94
102
  #
95
103
  # @return [void]
96
- def reportJacoco(moduleName, file, totalProjectThreshold = 90, modifiedFileThreshold = 90, failIfUnderThreshold = true)
97
- internalReport('Jacoco', moduleName, file, totalProjectThreshold, modifiedFileThreshold, failIfUnderThreshold)
104
+ def reportJacoco(moduleName, file, totalProjectThreshold = 90, modifiedFileThreshold = 90, failIfUnderProjectThreshold = true, failIfUnderFileThreshold = false)
105
+ internalReport('Jacoco', moduleName, file, totalProjectThreshold, modifiedFileThreshold, failIfUnderProjectThreshold, failIfUnderFileThreshold)
98
106
  end
99
107
 
100
108
  # Report coverage on diffed files, as well as overall coverage.
@@ -113,16 +121,20 @@ module Danger
113
121
  # defines the required percentage of files modified in a PR for a passing build.
114
122
  # default 90.
115
123
  #
116
- # @param [Boolean] failIfUnderThreshold
117
- # if true, will fail builds that are under the provided thresholds. if false, will only warn.
124
+ # @param [Boolean] failIfUnderProjectThreshold
125
+ # if true, will fail builds that are under the provided thresholds for the overall project. If false, will only warn.
126
+ # default true.
127
+ #
128
+ # @param [Boolean] failIfUnderFileThreshold
129
+ # if true, will fail builds that are under the provided thresholds per file. If false, will only warn.
118
130
  # default true.
119
131
  #
120
132
  # @return [void]
121
- def reportKover(moduleName, file, totalProjectThreshold = 90, modifiedFileThreshold = 90, failIfUnderThreshold = true)
122
- internalReport('Kover', moduleName, file, totalProjectThreshold, modifiedFileThreshold, failIfUnderThreshold)
133
+ def reportKover(moduleName, file, totalProjectThreshold = 90, modifiedFileThreshold = 90, failIfUnderProjectThreshold = true, failIfUnderFileThreshold = failIfUnderProjectThreshold)
134
+ internalReport('Kover', moduleName, file, totalProjectThreshold, modifiedFileThreshold, failIfUnderProjectThreshold, failIfUnderFileThreshold)
123
135
  end
124
136
 
125
- private def internalReport(reportType, moduleName, file, totalProjectThreshold, modifiedFileThreshold, failIfUnderThreshold)
137
+ private def internalReport(reportType, moduleName, file, totalProjectThreshold, modifiedFileThreshold, failIfUnderProjectThreshold, failIfUnderFileThreshold)
126
138
  raise "Please specify file name." if file.empty?
127
139
  raise "No #{reportType} xml report found at #{file}" unless File.exist? file
128
140
  rawXml = File.read(file)
@@ -177,7 +189,7 @@ module Danger
177
189
  # warn or fail if under specified file threshold:
178
190
  if (coveragePercent < modifiedFileThreshold)
179
191
  warningMessage = "Uh oh! #{fileName} is under #{modifiedFileThreshold}% coverage!"
180
- if (failIfUnderThreshold)
192
+ if (failIfUnderFileThreshold)
181
193
  fail warningMessage
182
194
  else
183
195
  warn warningMessage
@@ -190,13 +202,13 @@ module Danger
190
202
  output << "#{unreportedFileName}\n"
191
203
  end
192
204
 
193
- output << '> Codebase cunningly covered by count [Shroud 🧛](https://github.com/livefront/livefront-shroud-android/)'
205
+ output << '> Codebase cunningly covered by count [Shroud 🧛](https://github.com/livefront/danger-shroud)'
194
206
  markdown output
195
207
 
196
208
  # warn or fail if total coverage is under specified threshold
197
209
  if (coveragePercent < totalProjectThreshold)
198
210
  totalCoverageWarning = "Uh oh! Your project is under #{totalProjectThreshold}% coverage!"
199
- if (failIfUnderThreshold)
211
+ if (failIfUnderProjectThreshold)
200
212
  fail totalCoverageWarning
201
213
  else
202
214
  warn totalCoverageWarning
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: danger-shroud
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - andrewhaisting
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-07-14 00:00:00.000000000 Z
11
+ date: 2023-10-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: danger-plugin-api
@@ -171,6 +171,7 @@ executables: []
171
171
  extensions: []
172
172
  extra_rdoc_files: []
173
173
  files:
174
+ - ".github/dependabot.yml"
174
175
  - ".github/workflows/ci.yml"
175
176
  - ".github/workflows/publish.yml"
176
177
  - ".gitignore"
@@ -208,7 +209,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
208
209
  - !ruby/object:Gem::Version
209
210
  version: '0'
210
211
  requirements: []
211
- rubygems_version: 3.0.3.1
212
+ rubygems_version: 3.1.4
212
213
  signing_key:
213
214
  specification_version: 4
214
215
  summary: A danger plugin for enforcing code coverage via a Jacoco coverage report.