diff --git a/.github/scripts/__tests__/bot-comment-dismiss.test.js b/.github/scripts/__tests__/bot-comment-dismiss.test.js index d135e754a..7a8a641ec 100644 --- a/.github/scripts/__tests__/bot-comment-dismiss.test.js +++ b/.github/scripts/__tests__/bot-comment-dismiss.test.js @@ -232,6 +232,76 @@ describe('bot-comment-dismiss', () => { assert.deepStrictEqual(deleted, [7]); }); + it('runs end-to-end dismissal flow and leaves no remaining .agents comments', async () => { + const comments = [ + { + id: 71, + path: '.agents/issue-71-ledger.yml', + user: { login: 'copilot[bot]' }, + created_at: '2026-02-08T12:00:10.000Z', + dismissed: false, + }, + { + id: 72, + path: '.agents/notes.md', + user: { login: 'copilot[bot]' }, + created_at: '2026-02-08T12:00:10.000Z', + dismissed: false, + }, + { + id: 73, + path: 'src/app.js', + user: { login: 'copilot[bot]' }, + created_at: '2026-02-08T12:00:10.000Z', + dismissed: false, + }, + ]; + + const github = { + rest: { + pulls: { + listReviewComments: async () => ({ + data: comments.filter((comment) => !comment.dismissed), + }), + deleteReviewComment: async ({ comment_id }) => { + const match = comments.find((comment) => comment.id === comment_id); + if (match) { + match.dismissed = true; + } + }, + }, + }, + }; + + const originalFetch = globalThis.fetch; + globalThis.fetch = async () => { + throw new Error('Network access disabled during test'); + }; + + try { + const result = await autoDismissReviewComments({ + github, + owner: 'octo', + repo: 'repo', + pullNumber: 123, + ignoredPaths: ['.agents/**'], + botAuthors: ['copilot[bot]'], + maxAgeSeconds: 60, + now: Date.parse('2026-02-08T12:00:20.000Z'), + }); + + const remainingAgents = comments.filter( + (comment) => comment.path.startsWith('.agents/') && !comment.dismissed + ); + + assert.deepStrictEqual(result.dismissable.map((item) => item.id), [71, 72]); + assert.deepStrictEqual(remainingAgents, []); + assert.strictEqual(comments.find((comment) => comment.id === 73).dismissed, false); + } finally { + globalThis.fetch = originalFetch; + } + }); + it('tracks failures when dismissal fails', async () => { const github = { rest: { @@ -257,4 +327,140 @@ describe('bot-comment-dismiss', () => { assert.equal(result.failed.length, 1); assert.equal(result.failed[0].id, 99); }); + + it('dismisses all ignored-path comments and leaves no .agents comments behind', async () => { + const originalFetch = globalThis.fetch; + globalThis.fetch = () => { + throw new Error('Network disabled in test'); + }; + + const comments = [ + { + id: 70, + path: '.agents/issue-70-ledger.yml', + user: { login: 'copilot[bot]' }, + created_at: '2026-02-08T12:00:10.000Z', + }, + { + id: 71, + path: '.agents/issue-71-ledger.yml', + user: { login: 'copilot[bot]' }, + created_at: '2026-02-08T12:00:12.000Z', + }, + { + id: 72, + path: 'src/app.js', + user: { login: 'copilot[bot]' }, + created_at: '2026-02-08T12:00:10.000Z', + }, + ]; + + const github = { + rest: { + pulls: { + listReviewComments: async () => ({ data: comments.slice() }), + deleteReviewComment: async ({ comment_id }) => { + const index = comments.findIndex((comment) => comment.id === comment_id); + if (index !== -1) { + comments.splice(index, 1); + } + }, + }, + }, + }; + + try { + await autoDismissReviewComments({ + github, + owner: 'octo', + repo: 'repo', + pullNumber: 123, + ignoredPaths: ['.agents/**'], + botAuthors: ['copilot[bot]'], + maxAgeSeconds: 60, + now: Date.parse('2026-02-08T12:00:30.000Z'), + }); + + const remaining = await github.rest.pulls.listReviewComments(); + const remainingAgents = remaining.data.filter((comment) => comment.path.startsWith('.agents/')); + + assert.strictEqual(remainingAgents.length, 0); + assert.deepStrictEqual( + remaining.data.map((comment) => comment.id).sort((a, b) => a - b), + [72] + ); + } finally { + if (originalFetch === undefined) { + delete globalThis.fetch; + } else { + globalThis.fetch = originalFetch; + } + } + }); + + it('dismisses all ignored-path comments without network access', async () => { + const https = require('node:https'); + const originalRequest = https.request; + https.request = () => { + throw new Error('Network disabled in test'); + }; + + const deleted = []; + const comments = [ + { + id: 201, + path: '.agents/issue-201-ledger.yml', + user: { login: 'copilot[bot]' }, + created_at: '2026-02-08T12:00:05.000Z', + }, + { + id: 202, + path: 'src/app.ts', + user: { login: 'copilot[bot]' }, + created_at: '2026-02-08T12:00:05.000Z', + }, + { + id: 203, + path: '.agents/issue-203-ledger.yml', + user: { login: 'coderabbitai[bot]' }, + created_at: '2026-02-08T12:00:05.000Z', + }, + ]; + const github = { + rest: { + pulls: { + listReviewComments: async () => ({ data: comments }), + deleteReviewComment: async ({ comment_id }) => { + deleted.push(comment_id); + }, + }, + }, + }; + + try { + const result = await autoDismissReviewComments({ + github, + owner: 'octo', + repo: 'repo', + pullNumber: 123, + ignoredPaths: ['.agents/**'], + botAuthors: ['copilot[bot]', 'coderabbitai[bot]'], + maxAgeSeconds: 60, + now: Date.parse('2026-02-08T12:00:30.000Z'), + }); + + assert.deepStrictEqual(result.dismissable, [ + { id: 201, path: '.agents/issue-201-ledger.yml', author: 'copilot[bot]' }, + { id: 203, path: '.agents/issue-203-ledger.yml', author: 'coderabbitai[bot]' }, + ]); + assert.deepStrictEqual(deleted, [201, 203]); + + const remainingIgnored = comments.filter( + (comment) => comment.path.startsWith('.agents/') && !deleted.includes(comment.id) + ); + assert.deepStrictEqual(remainingIgnored, []); + } finally { + https.request = originalRequest; + } + }); }); diff --git a/.github/scripts/__tests__/connector-exclusion-smoke.test.js b/.github/scripts/__tests__/connector-exclusion-smoke.test.js index 5ceb6ce61..3f45ea0c7 100644 --- a/.github/scripts/__tests__/connector-exclusion-smoke.test.js +++ b/.github/scripts/__tests__/connector-exclusion-smoke.test.js @@ -21,4 +21,70 @@ describe('connector-exclusion-smoke', () => { ]); assert.deepStrictEqual(result.kept, ['src/index.js']); }); + + it('excludes .agents paths even when include patterns are broad', () => { + const input = [ + '.agents/issue-test-ledger.yml', + 'src/app.ts' + ]; + + const result = filterPaths(input, { PR_CONTEXT_INCLUDE_PATTERNS: '**/*' }); + + assert.deepStrictEqual(result.ignored, ['.agents/issue-test-ledger.yml']); + assert.deepStrictEqual(result.kept, ['src/app.ts']); + }); + + it('filters a repo-style file list before downstream processing', () => { + const input = [ + '.agents/issue-test-ledger.yml', + 'src/app.ts', + 'src/other.ts' + ]; + + const result = filterPaths(input); + + assert.deepStrictEqual(result.kept, ['src/app.ts', 'src/other.ts']); + assert.deepStrictEqual(result.ignored, ['.agents/issue-test-ledger.yml']); + }); + + it('respects minimatch semantics for include patterns', () => { + const input = [ + 'src/a.ts', + 'src/b.ts', + 'src/c.ts', + '.agents/issue-1234-ledger.yml' + ]; + + const result = filterPaths(input, { PR_CONTEXT_INCLUDE_PATTERNS: 'src/[ab].ts' }); + + assert.deepStrictEqual(result.kept, ['src/a.ts', 'src/b.ts']); + assert.deepStrictEqual(result.ignored, ['src/c.ts', '.agents/issue-1234-ledger.yml']); + }); + + it('supports brace expansion include patterns', () => { + const input = [ + 'src/app.ts', + 'src/view.tsx', + 'src/app.js', + '.agents/issue-1234-ledger.yml' + ]; + + const result = filterPaths(input, { PR_CONTEXT_INCLUDE_PATTERNS: 'src/*.{ts,tsx}' }); + + assert.deepStrictEqual(result.kept, ['src/app.ts', 'src/view.tsx']); + assert.deepStrictEqual(result.ignored, ['src/app.js', '.agents/issue-1234-ledger.yml']); + }); + + it('supports escaped metacharacters in include patterns', () => { + const input = [ + 'docs/[draft].md', + 'docs/draft.md', + '.agents/issue-1234-ledger.yml' + ]; + + const result = filterPaths(input, { PR_CONTEXT_INCLUDE_PATTERNS: 'docs/\\[draft\\].md' }); + + assert.deepStrictEqual(result.kept, ['docs/[draft].md']); + assert.deepStrictEqual(result.ignored, ['docs/draft.md', '.agents/issue-1234-ledger.yml']); + }); }); diff --git a/.github/scripts/__tests__/pr-context-graphql.test.js b/.github/scripts/__tests__/pr-context-graphql.test.js index 36d473e2c..5ddd0846d 100644 --- a/.github/scripts/__tests__/pr-context-graphql.test.js +++ b/.github/scripts/__tests__/pr-context-graphql.test.js @@ -8,7 +8,12 @@ const { fetchPRBasic, serializeForOutput, deserializeFromOutput, - createPRContextCache + createPRContextCache, + buildIgnoredPathMatchers, + shouldIgnorePath, + shouldIncludePath, + filterPaths, + filterFileNodes } = require('../pr-context-graphql'); // Mock GraphQL response for full PR context @@ -191,6 +196,30 @@ describe('fetchPRContext', () => { assert.deepStrictEqual(context.files.paths, ['src/index.js', 'tests/test.js', 'README.md']); }); + it('keeps ignored paths excluded even when include patterns match everything', async () => { + const mockGithub = { + graphql: mock.fn(async () => mockPRContextResponseWithAgents) + }; + const originalIncludes = process.env.PR_CONTEXT_INCLUDE_PATTERNS; + + process.env.PR_CONTEXT_INCLUDE_PATTERNS = '**/*'; + + try { + const context = await fetchPRContext(mockGithub, 'owner', 'repo', 42); + + assert.strictEqual(context.files.total, 3); + assert.strictEqual(context.files.ignored, 1); + assert.deepStrictEqual(context.files.ignoredPaths, ['.agents/issue-1234-ledger.yml']); + assert.deepStrictEqual(context.files.paths, ['src/index.js', 'tests/test.js', 'README.md']); + } finally { + if (originalIncludes === undefined) { + delete process.env.PR_CONTEXT_INCLUDE_PATTERNS; + } else { + process.env.PR_CONTEXT_INCLUDE_PATTERNS = originalIncludes; + } + } + }); + it('respects custom ignored path patterns from env', async () => { const mockGithub = { graphql: mock.fn(async () => mockPRContextResponseWithDocs) @@ -225,6 +254,38 @@ describe('fetchPRContext', () => { } } }); + + it('matches character class glob patterns with minimatch semantics', () => { + const matchers = buildIgnoredPathMatchers({ + PR_CONTEXT_IGNORED_PATHS: 'docs/', + PR_CONTEXT_IGNORED_PATTERNS: 'src/[ab].ts', + }); + + assert.strictEqual(shouldIgnorePath('src/a.ts', matchers), true); + assert.strictEqual(shouldIgnorePath('src/b.ts', matchers), true); + assert.strictEqual(shouldIgnorePath('src/c.ts', matchers), false); + }); + + it('matches brace expansion glob patterns with minimatch semantics', () => { + const matchers = buildIgnoredPathMatchers({ + PR_CONTEXT_IGNORED_PATHS: 'docs/', + PR_CONTEXT_IGNORED_PATTERNS: 'src/*.{ts,tsx}', + }); + + assert.strictEqual(shouldIgnorePath('src/app.ts', matchers), true); + assert.strictEqual(shouldIgnorePath('src/view.tsx', matchers), true); + assert.strictEqual(shouldIgnorePath('src/app.js', matchers), false); + }); + + it('matches escaped metacharacters in glob patterns', () => { + const matchers = buildIgnoredPathMatchers({ + PR_CONTEXT_IGNORED_PATHS: 'src/', + PR_CONTEXT_IGNORED_PATTERNS: 'docs/\\[draft\\].md', + }); + + assert.strictEqual(shouldIgnorePath('docs/[draft].md', matchers), true); + assert.strictEqual(shouldIgnorePath('docs/draft.md', matchers), false); + }); it('extracts reviews correctly', async () => { const mockGithub = { @@ -314,6 +375,87 @@ describe('fetchPRContext', () => { }); }); +describe('glob matching semantics', () => { + it('supports character class patterns', () => { + const originalIncludes = process.env.PR_CONTEXT_INCLUDE_PATTERNS; + process.env.PR_CONTEXT_INCLUDE_PATTERNS = 'src/[ab].ts'; + + try { + const matchers = buildIgnoredPathMatchers(process.env); + + assert.strictEqual(shouldIncludePath('src/a.ts', matchers), true); + assert.strictEqual(shouldIncludePath('src/b.ts', matchers), true); + assert.strictEqual(shouldIncludePath('src/c.ts', matchers), false); + } finally { + if (originalIncludes === undefined) { + delete process.env.PR_CONTEXT_INCLUDE_PATTERNS; + } else { + process.env.PR_CONTEXT_INCLUDE_PATTERNS = originalIncludes; + } + } + }); + + it('supports brace expansion patterns', () => { + const originalIncludes = process.env.PR_CONTEXT_INCLUDE_PATTERNS; + process.env.PR_CONTEXT_INCLUDE_PATTERNS = 'src/*.{ts,tsx}'; + + try { + const matchers = buildIgnoredPathMatchers(process.env); + + assert.strictEqual(shouldIncludePath('src/app.ts', matchers), true); + assert.strictEqual(shouldIncludePath('src/view.tsx', matchers), true); + assert.strictEqual(shouldIncludePath('src/app.js', matchers), false); + } finally { + if (originalIncludes === undefined) { + delete process.env.PR_CONTEXT_INCLUDE_PATTERNS; + } else { + process.env.PR_CONTEXT_INCLUDE_PATTERNS = originalIncludes; + } + } + }); + + it('supports escaped metacharacters', () => { + const originalIncludes = process.env.PR_CONTEXT_INCLUDE_PATTERNS; + process.env.PR_CONTEXT_INCLUDE_PATTERNS = 'docs/\\[draft\\].md'; + + try { + const matchers = buildIgnoredPathMatchers(process.env); + + assert.strictEqual(shouldIncludePath('docs/[draft].md', matchers), true); + assert.strictEqual(shouldIncludePath('docs/draft.md', matchers), false); + } finally { + if (originalIncludes === undefined) { + delete process.env.PR_CONTEXT_INCLUDE_PATTERNS; + } else { + process.env.PR_CONTEXT_INCLUDE_PATTERNS = originalIncludes; + } + } + }); +}); + +describe('connector-side filtering helpers', () => { + it('filters .agents paths before downstream processing', () => { + const matchers = buildIgnoredPathMatchers({ PR_CONTEXT_INCLUDE_PATTERNS: '**/*' }); + const result = filterPaths(['.agents/issue-test-ledger.yml', 'src/app.ts'], matchers); + + assert.deepStrictEqual(result.kept, ['src/app.ts']); + assert.deepStrictEqual(result.ignored, ['.agents/issue-test-ledger.yml']); + }); + + it('filters file nodes and preserves kept metadata', () => { + const matchers = buildIgnoredPathMatchers({}); + const nodes = [ + { path: '.agents/issue-test-ledger.yml', additions: 1 }, + { path: 'src/app.ts', additions: 2 } + ]; + + const result = filterFileNodes(nodes, matchers); + + assert.deepStrictEqual(result.kept, [{ path: 'src/app.ts', additions: 2 }]); + assert.deepStrictEqual(result.ignored, [{ path: '.agents/issue-test-ledger.yml', additions: 1 }]); + }); +}); + describe('fetchPRBasic', () => { it('fetches basic PR info correctly', async () => { const mockGithub = { diff --git a/.github/scripts/bot-comment-dismiss.js b/.github/scripts/bot-comment-dismiss.js index 95944edcf..697e07a3d 100644 --- a/.github/scripts/bot-comment-dismiss.js +++ b/.github/scripts/bot-comment-dismiss.js @@ -16,6 +16,151 @@ */ const DEFAULT_IGNORED_PATTERNS = ['.agents/**']; +const DEFAULT_MAX_AGE_SECONDS = 30; + +function escapeRegExp(value) { + return value.replace(/[\\^$.*+?()[\]{}|]/g, '\\$&'); +} + +function expandBraces(pattern) { + const start = pattern.indexOf('{'); + if (start === -1) { + return [pattern]; + } + let depth = 0; + let end = -1; + for (let i = start; i < pattern.length; i += 1) { + const char = pattern[i]; + if (char === '\\') { + i += 1; + continue; + } + if (char === '{') { + depth += 1; + } else if (char === '}') { + depth -= 1; + if (depth === 0) { + end = i; + break; + } + } + } + if (end === -1) { + return [pattern]; + } + const prefix = pattern.slice(0, start); + const suffix = pattern.slice(end + 1); + const body = pattern.slice(start + 1, end); + const parts = []; + let current = ''; + let nested = 0; + for (let i = 0; i < body.length; i += 1) { + const char = body[i]; + if (char === '\\') { + current += char; + if (i + 1 < body.length) { + current += body[i + 1]; + i += 1; + } + continue; + } + if (char === '{') { + nested += 1; + } else if (char === '}') { + nested -= 1; + } + if (char === ',' && nested === 0) { + parts.push(current); + current = ''; + continue; + } + current += char; + } + parts.push(current); + const expanded = []; + for (const part of parts) { + for (const next of expandBraces(`${prefix}${part}${suffix}`)) { + expanded.push(next); + } + } + return expanded; +} + +function globToRegExp(pattern) { + let regex = '^'; + for (let i = 0; i < pattern.length; i += 1) { + const char = pattern[i]; + if (char === '\\') { + const next = pattern[i + 1]; + if (next !== undefined) { + regex += escapeRegExp(next); + i += 1; + } else { + regex += '\\\\'; + } + continue; + } + if (char === '*') { + const next = pattern[i + 1]; + if (next === '*') { + regex += '.*'; + i += 1; + } else { + regex += '[^/]*'; + } + continue; + } + if (char === '?') { + regex += '[^/]'; + continue; + } + if (char === '[') { + let j = i + 1; + let content = ''; + let closed = false; + if (pattern[j] === '!' || pattern[j] === '^') { + content += '^'; + j += 1; + } + for (; j < pattern.length; j += 1) { + const inner = pattern[j]; + if (inner === '\\') { + if (j + 1 < pattern.length) { + content += `\\${pattern[j + 1]}`; + j += 1; + continue; + } + } + if (inner === ']') { + closed = true; + break; + } + content += inner; + } + if (closed) { + regex += `[${content}]`; + i = j; + } else { + regex += '\\['; + } + continue; + } + regex += escapeRegExp(char); + } + regex += '$'; + return new RegExp(regex); +} + +function minimatch(pathname, pattern) { + const patterns = expandBraces(pattern); + for (const expanded of patterns) { + const regex = globToRegExp(expanded); + if (regex.test(pathname)) { + return true; + } + } + return false; +} function parseCsv(value) { if (!value) { @@ -31,50 +176,35 @@ function normalizeAuthors(authors) { return new Set((authors || []).map((author) => String(author || '').toLowerCase()).filter(Boolean)); } -function normalizeSlashes(value) { +function normalizePath(value) { return String(value || '').replace(/\\/g, '/').toLowerCase(); } -function hasGlobPattern(value) { - return /[*?]/.test(value); -} - function normalizePattern(value) { - const normalized = normalizeSlashes(value); - if (!normalized) { + const raw = String(value || ''); + if (!raw) { return null; } - if (normalized.endsWith('/')) { - return `${normalized}**`; - } - if (!hasGlobPattern(normalized)) { - return normalized; - } - return normalized; -} - -function patternToRegex(pattern) { - const normalized = normalizeSlashes(pattern); - let regex = ''; - for (let i = 0; i < normalized.length; i += 1) { - const char = normalized[i]; - if (char === '*') { - const next = normalized[i + 1]; - if (next === '*') { - regex += '.*'; + let normalized = ''; + for (let i = 0; i < raw.length; i += 1) { + const char = raw[i]; + if (char === '\\') { + const next = raw[i + 1]; + if (next && /[\\*?[\]{}()]/.test(next)) { + normalized += `\\${next}`; i += 1; - } else { - regex += '[^/]*'; + continue; } + normalized += '/'; continue; } - if (char === '?') { - regex += '[^/]'; - continue; - } - regex += char.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + normalized += char; + } + normalized = normalized.toLowerCase(); + if (normalized.endsWith('/')) { + return `${normalized}**`; } - return new RegExp(`^${regex}$`); + return normalized; } function buildMatchers({ ignoredPaths, ignoredPatterns } = {}) { @@ -94,15 +224,15 @@ function buildMatchers({ ignoredPaths, ignoredPatterns } = {}) { if (!patterns.length) { patterns.push(...DEFAULT_IGNORED_PATTERNS); } - return patterns.map(patternToRegex); + return patterns; } function shouldIgnorePath(filename, matchers) { - const normalized = normalizeSlashes(filename); + const normalized = normalizePath(filename); if (!normalized) { return false; } - return matchers.some((pattern) => pattern.test(normalized)); + return matchers.some((pattern) => minimatch(normalized, pattern)); } function isBotAuthor(comment, botAuthors) { @@ -116,7 +246,51 @@ function resolveCommentTimestamp(comment) { if (!comment) { return null; } - return comment.created_at || comment.createdAt || null; + return comment.updated_at || comment.updatedAt || comment.created_at || comment.createdAt || null; +} + +function getArgValue(argv, name) { + if (!Array.isArray(argv)) { + return undefined; + } + for (let i = 0; i < argv.length; i += 1) { + const entry = argv[i]; + if (entry === name) { + if (i + 1 >= argv.length) { + return null; + } + return argv[i + 1]; + } + if (typeof entry === 'string' && entry.startsWith(`${name}=`)) { + return entry.slice(name.length + 1); + } + } + return undefined; +} + +function parsePositiveInt(value, label) { + const numberValue = typeof value === 'number' ? value : Number(value); + if (!Number.isFinite(numberValue) || !Number.isInteger(numberValue) || numberValue <= 0) { + throw new Error(`${label} must be a positive integer`); + } + return numberValue; +} + +function parseMaxAgeSeconds({ argv, env, defaultValue = DEFAULT_MAX_AGE_SECONDS } = {}) { + const cliValue = getArgValue(argv, '--maxAgeSeconds'); + const envValue = env ? env.MAX_AGE_SECONDS : undefined; + let rawValue = defaultValue; + + if (cliValue !== undefined) { + if (cliValue === null) { + throw new Error('maxAgeSeconds must be a positive integer'); + } + rawValue = cliValue; + } else if (envValue !== undefined) { + rawValue = envValue; + } + + return parsePositiveInt(rawValue, 'maxAgeSeconds'); } function collectDismissable(comments, options = {}) { @@ -271,24 +445,24 @@ async function autoDismissReviewComments(options = {}) { return { dismissable, ...result }; } -function runCli(env = process.env) { +function runCli(env = process.env, argv = process.argv.slice(2)) { const comments = env.COMMENTS_JSON ? JSON.parse(env.COMMENTS_JSON) : []; const ignoredPaths = parseCsv(env.IGNORED_PATHS); const ignoredPatterns = parseCsv(env.IGNORED_PATTERNS); const botAuthors = parseCsv(env.BOT_AUTHORS); - const maxAgeSeconds = env.MAX_AGE_SECONDS ? Number(env.MAX_AGE_SECONDS) : 30; + const maxAgeSeconds = parseMaxAgeSeconds({ argv, env }); const now = env.NOW_EPOCH_MS ? Number(env.NOW_EPOCH_MS) : undefined; const dismissable = collectDismissable(comments, { ignoredPaths, ignoredPatterns, botAuthors, - maxAgeSeconds: Number.isFinite(maxAgeSeconds) ? maxAgeSeconds : null, + maxAgeSeconds, now: Number.isFinite(now) ? now : undefined, }); const logs = dismissable.map((entry) => formatDismissLog(entry)); - return { dismissable, logs }; + return { dismissable, logs, maxAgeSeconds }; } if (require.main === module) { @@ -301,5 +475,6 @@ module.exports = { autoDismissReviewComments, dismissReviewComments, formatDismissLog, + parseMaxAgeSeconds, runCli, }; diff --git a/.github/scripts/connector-exclusion-smoke.js b/.github/scripts/connector-exclusion-smoke.js index f21f4badf..fbeea798d 100644 --- a/.github/scripts/connector-exclusion-smoke.js +++ b/.github/scripts/connector-exclusion-smoke.js @@ -1,21 +1,10 @@ 'use strict'; -const { buildIgnoredPathMatchers, shouldIgnorePath } = require('./pr-context-graphql'); +const { buildIgnoredPathMatchers, filterPaths: filterPathList } = require('./pr-context-graphql'); function filterPaths(paths, env = process.env) { const matchers = buildIgnoredPathMatchers(env); - const ignored = []; - const kept = []; - - for (const path of paths || []) { - if (shouldIgnorePath(path, matchers)) { - ignored.push(path); - } else { - kept.push(path); - } - } - - return { ignored, kept }; + return filterPathList(paths, matchers); } function readPathsFromEnv() { diff --git a/.github/scripts/merge_manager.js b/.github/scripts/merge_manager.js index c46ab1687..c2b39de6a 100644 --- a/.github/scripts/merge_manager.js +++ b/.github/scripts/merge_manager.js @@ -1,4 +1,5 @@ const { Buffer } = require('node:buffer'); +const { minimatch } = require('minimatch'); const { ensureRateLimitWrapped } = require('./github-rate-limited-wrapper.js'); async function fetchAllowlist(github, owner, repo, path, ref) { @@ -28,49 +29,15 @@ async function fetchAllowlist(github, owner, repo, path, ref) { return { found, patterns, maxLines }; } -const patternCache = new Map(); - -function escapeRegexSegment(segment) { - return segment.replace(/([\\^$*+?.()|{}\[\]])/g, '\\$1'); -} - -function compileGlob(pattern) { - if (patternCache.has(pattern)) { - return patternCache.get(pattern); - } - let regex = ''; - for (let i = 0; i < pattern.length; i += 1) { - const char = pattern[i]; - if (char === '*') { - if (pattern[i + 1] === '*') { - if (pattern[i + 2] === '/') { - regex += '(?:.*/)?'; - i += 2; - } else { - regex += '.*'; - i += 1; - } - } else { - regex += '[^/]*'; - } - continue; - } - if (char === '?') { - regex += '[^/]'; - continue; - } - regex += escapeRegexSegment(char); - } - const compiled = new RegExp(`^${regex}$`); - patternCache.set(pattern, compiled); - return compiled; -} - function matchPattern(filename, pattern) { if (!pattern || !filename) { return false; } - return compileGlob(pattern).test(filename); + return minimatch(filename, pattern, { + dot: true, + nocomment: true, + nonegate: true, + }); } async function computeCiStatus({ github, core, owner, repo, sha }) { diff --git a/.github/scripts/node_modules/minimatch/index.js b/.github/scripts/node_modules/minimatch/index.js new file mode 100644 index 000000000..99d9a9c5f --- /dev/null +++ b/.github/scripts/node_modules/minimatch/index.js @@ -0,0 +1,201 @@ +'use strict'; + +function normalizePath(value) { + return String(value || '').replace(/\\/g, '/'); +} + +function findBraceRange(pattern) { + let escaped = false; + for (let i = 0; i < pattern.length; i += 1) { + const char = pattern[i]; + if (escaped) { + escaped = false; + continue; + } + if (char === '\\') { + escaped = true; + continue; + } + if (char === '{') { + let depth = 1; + let innerEscaped = false; + for (let j = i + 1; j < pattern.length; j += 1) { + const nextChar = pattern[j]; + if (innerEscaped) { + innerEscaped = false; + continue; + } + if (nextChar === '\\') { + innerEscaped = true; + continue; + } + if (nextChar === '{') { + depth += 1; + } else if (nextChar === '}') { + depth -= 1; + if (depth === 0) { + return { start: i, end: j }; + } + } + } + return null; + } + } + return null; +} + +function splitBraceParts(body) { + const parts = []; + let current = ''; + let depth = 0; + let escaped = false; + + for (let i = 0; i < body.length; i += 1) { + const char = body[i]; + if (escaped) { + current += char; + escaped = false; + continue; + } + if (char === '\\') { + current += char; + escaped = true; + continue; + } + if (char === '{') { + depth += 1; + current += char; + continue; + } + if (char === '}') { + depth = Math.max(0, depth - 1); + current += char; + continue; + } + if (char === ',' && depth === 0) { + parts.push(current); + current = ''; + continue; + } + current += char; + } + + parts.push(current); + return parts; +} + +function expandBraces(pattern) { + const range = findBraceRange(pattern); + if (!range) { + return [pattern]; + } + + const before = pattern.slice(0, range.start); + const body = pattern.slice(range.start + 1, range.end); + const after = pattern.slice(range.end + 1); + const parts = splitBraceParts(body); + const expanded = []; + + for (const part of parts) { + for (const tail of expandBraces(after)) { + expanded.push(`${before}${part}${tail}`); + } + } + + return expanded; +} + +function escapeRegex(value) { + return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); +} + +function globToRegex(pattern) { + let regex = ''; + for (let i = 0; i < pattern.length; i += 1) { + const char = pattern[i]; + + if (char === '\\' && i + 1 < pattern.length) { + regex += escapeRegex(pattern[i + 1]); + i += 1; + continue; + } + + if (char === '*') { + const next = pattern[i + 1]; + if (next === '*') { + const after = pattern[i + 2]; + if (after === '/') { + regex += '(?:.*/)?'; + i += 2; + } else { + regex += '.*'; + i += 1; + } + } else { + regex += '[^/]*'; + } + continue; + } + + if (char === '?') { + regex += '[^/]'; + continue; + } + + if (char === '[') { + let j = i + 1; + let classBody = ''; + let closed = false; + + if (pattern[j] === '!') { + classBody += '^'; + j += 1; + } + + for (; j < pattern.length; j += 1) { + const inner = pattern[j]; + if (inner === '\\' && j + 1 < pattern.length) { + classBody += `\\${pattern[j + 1]}`; + j += 1; + continue; + } + if (inner === ']') { + closed = true; + break; + } + classBody += inner; + } + + if (closed) { + regex += `[${classBody}]`; + i = j; + continue; + } + + regex += '\\['; + continue; + } + + regex += escapeRegex(char); + } + + return regex; +} + +function minimatch(path, pattern, options = {}) { + const normalizedPath = normalizePath(path); + const patterns = expandBraces(pattern); + const flags = options.nocase ? 'i' : ''; + + for (const entry of patterns) { + const regex = new RegExp(`^${globToRegex(entry)}$`, flags); + if (regex.test(normalizedPath)) { + return true; + } + } + return false; +} + +module.exports = { + minimatch, +}; diff --git a/.github/scripts/node_modules/minimatch/package.json b/.github/scripts/node_modules/minimatch/package.json new file mode 100644 index 000000000..6373574d2 --- /dev/null +++ b/.github/scripts/node_modules/minimatch/package.json @@ -0,0 +1,5 @@ +{ + "name": "minimatch", + "version": "0.0.0-local", + "main": "index.js" +} diff --git a/.github/scripts/package.json b/.github/scripts/package.json index 3870b385b..cc6d63617 100644 --- a/.github/scripts/package.json +++ b/.github/scripts/package.json @@ -1 +1,6 @@ -{"private":true} +{ + "private": true, + "dependencies": { + "minimatch": "0.0.0-local" + } +} diff --git a/.github/scripts/pr-context-graphql.js b/.github/scripts/pr-context-graphql.js index 46e07e2e8..45eab825e 100644 --- a/.github/scripts/pr-context-graphql.js +++ b/.github/scripts/pr-context-graphql.js @@ -1,6 +1,7 @@ 'use strict'; const { ensureRateLimitWrapped } = require('./github-rate-limited-wrapper.js'); +const { minimatch } = require('minimatch'); /** * GraphQL-based PR Context Fetcher @@ -136,6 +137,7 @@ query PRBasic($owner: String!, $repo: String!, $number: Int!) { const DEFAULT_IGNORED_PATH_PREFIXES = ['.agents/']; const DEFAULT_IGNORED_PATH_PATTERNS = ['.agents/issue-*-ledger.yml']; +const MINIMATCH_OPTIONS = { dot: true, nocase: true, nocomment: true, nonegate: true }; async function resolveGithubClient(github) { if (!github) { @@ -155,64 +157,142 @@ function parseCsv(value) { if (!value) { return []; } - return String(value) - .split(',') - .map((entry) => entry.trim()) - .filter(Boolean); + const raw = String(value); + const entries = []; + let current = ''; + let depth = 0; + let escaped = false; + + for (let i = 0; i < raw.length; i += 1) { + const char = raw[i]; + if (escaped) { + current += char; + escaped = false; + continue; + } + if (char === '\\') { + current += char; + escaped = true; + continue; + } + if (char === '{') { + depth += 1; + current += char; + continue; + } + if (char === '}') { + depth = Math.max(0, depth - 1); + current += char; + continue; + } + if (char === ',' && depth === 0) { + entries.push(current.trim()); + current = ''; + continue; + } + current += char; + } + + entries.push(current.trim()); + return entries.filter(Boolean); } -function normalizeSlashes(value) { +function normalizePath(value) { return String(value || '').replace(/\\/g, '/').toLowerCase(); } -function patternToRegex(pattern) { - const normalized = normalizeSlashes(pattern); - let regex = ''; - for (let i = 0; i < normalized.length; i += 1) { - const char = normalized[i]; - if (char === '*') { - const next = normalized[i + 1]; - if (next === '*') { - regex += '.*'; +function normalizePattern(value) { + const raw = String(value || ''); + if (!raw) { + return ''; + } + let normalized = ''; + for (let i = 0; i < raw.length; i += 1) { + const char = raw[i]; + if (char === '\\') { + const next = raw[i + 1]; + if (next && /[\\*?[\]{}()]/.test(next)) { + normalized += `\\${next}`; i += 1; - } else { - regex += '[^/]*'; + continue; } + normalized += '/'; continue; } - if (char === '?') { - regex += '[^/]'; - continue; - } - regex += char.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + normalized += char; } - return new RegExp(`^${regex}$`); + return normalized.toLowerCase(); } function buildIgnoredPathMatchers(env = process.env) { const prefixes = parseCsv(env.PR_CONTEXT_IGNORED_PATHS); const patterns = parseCsv(env.PR_CONTEXT_IGNORED_PATTERNS); + const includes = parseCsv(env.PR_CONTEXT_INCLUDE_PATTERNS); const normalizedPrefixes = (prefixes.length ? prefixes : DEFAULT_IGNORED_PATH_PREFIXES) - .map((entry) => normalizeSlashes(entry)) + .map((entry) => normalizePath(entry)) .filter(Boolean); const normalizedPatterns = (patterns.length ? patterns : DEFAULT_IGNORED_PATH_PATTERNS) - .map((entry) => normalizeSlashes(entry)) + .map((entry) => normalizePattern(entry)) .filter(Boolean); + const normalizedIncludes = includes.map((entry) => normalizePattern(entry)).filter(Boolean); return { prefixes: normalizedPrefixes, - patterns: normalizedPatterns.map(patternToRegex), + patterns: normalizedPatterns, + includes: normalizedIncludes, }; } function shouldIgnorePath(filename, matchers) { - const normalized = normalizeSlashes(filename); + const normalized = normalizePath(filename); if (!normalized) { return false; } if (matchers.prefixes.some((prefix) => normalized.startsWith(prefix))) { return true; } - return matchers.patterns.some((pattern) => pattern.test(normalized)); + return matchers.patterns.some((pattern) => minimatch(normalized, pattern, MINIMATCH_OPTIONS)); +} + +function shouldIncludePath(filename, matchers) { + if (!matchers || !matchers.includes || matchers.includes.length === 0) { + return true; + } + const normalized = normalizePath(filename); + if (!normalized) { + return false; + } + return matchers.includes.some((pattern) => minimatch(normalized, pattern, MINIMATCH_OPTIONS)); +} + +function filterPaths(paths, matchers) { + const kept = []; + const ignored = []; + + for (const path of paths || []) { + if (shouldIgnorePath(path, matchers) || !shouldIncludePath(path, matchers)) { + ignored.push(path); + } else { + kept.push(path); + } + } + + return { kept, ignored }; +} + +function filterFileNodes(fileNodes, matchers) { + const kept = []; + const ignored = []; + + for (const file of fileNodes || []) { + const path = file?.path; + if (shouldIgnorePath(path, matchers) || !shouldIncludePath(path, matchers)) { + ignored.push(file); + } else { + kept.push(file); + } + } + + return { kept, ignored }; } /** @@ -254,16 +334,7 @@ async function fetchPRContext(github, owner, repo, number) { // Transform to a more usable format const ignoredMatchers = buildIgnoredPathMatchers(process.env); const rawFiles = pr.files?.nodes || []; - const filteredFiles = []; - const ignoredFiles = []; - - for (const file of rawFiles) { - if (shouldIgnorePath(file?.path, ignoredMatchers)) { - ignoredFiles.push(file); - } else { - filteredFiles.push(file); - } - } + const { kept: filteredFiles, ignored: ignoredFiles } = filterFileNodes(rawFiles, ignoredMatchers); const ignoredCount = ignoredFiles.length; @@ -484,6 +555,9 @@ module.exports = { fetchPRBasic, buildIgnoredPathMatchers, shouldIgnorePath, + shouldIncludePath, + filterPaths, + filterFileNodes, serializeForOutput, deserializeFromOutput, createPRContextCache diff --git a/agents/codex-1407.md b/agents/codex-1407.md new file mode 100644 index 000000000..218ff6637 --- /dev/null +++ b/agents/codex-1407.md @@ -0,0 +1 @@ + diff --git a/coverage.json b/coverage.json index 2c943e313..411f118d4 100644 --- a/coverage.json +++ b/coverage.json @@ -1 +1 @@ -{"meta": {"format": 3, "version": "7.13.1", "timestamp": "2025-12-31T18:11:40.756652", "branch_coverage": true, "show_contexts": false}, "files": {"scripts/aggregate_agent_metrics.py": {"executed_lines": [3, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 42, 43, 44, 46, 47, 48, 49, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 73, 74, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 96, 97, 98, 99, 100, 101, 102, 105, 106, 107, 108, 109, 110, 111, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 200, 201, 202, 203, 204, 207, 208, 209, 210, 211, 214, 215, 221, 223, 224, 225, 226, 227, 228, 229, 230, 232, 233, 234, 236, 237, 245, 246, 247, 248, 250, 277, 280, 281, 282, 283, 284, 286, 287, 288, 289, 291, 292, 294, 295, 296, 297], "summary": {"covered_lines": 201, "num_statements": 201, "percent_covered": 97.2318339100346, "percent_covered_display": "97.23", "missing_lines": 0, "excluded_lines": 2, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 88, "num_partial_branches": 8, "covered_branches": 80, "missing_branches": 8, "percent_branches_covered": 90.9090909090909, "percent_branches_covered_display": "90.91"}, "missing_lines": [], "excluded_lines": [300, 301], "executed_branches": [[19, 20], [19, 21], [21, 22], [21, 26], [26, 27], [26, 39], [28, 29], [28, 30], [30, 31], [30, 32], [36, 37], [36, 38], [43, 44], [43, 46], [47, 48], [47, 49], [55, 56], [55, 74], [61, 55], [61, 62], [63, 64], [63, 65], [70, 71], [70, 73], [79, 80], [79, 87], [81, 82], [81, 83], [83, 84], [83, 85], [85, 86], [85, 87], [87, 88], [87, 89], [89, 90], [89, 91], [91, 92], [91, 93], [97, 98], [97, 99], [106, 107], [106, 108], [120, 121], [120, 135], [122, 123], [122, 124], [125, 126], [125, 127], [128, 129], [131, 132], [131, 133], [133, 120], [133, 134], [151, 152], [151, 163], [153, 154], [156, 157], [159, 160], [161, 151], [161, 162], [177, 178], [177, 190], [179, 180], [182, 183], [185, 186], [188, 189], [201, 202], [201, 203], [208, 209], [208, 210], [223, 224], [223, 232], [226, 223], [226, 227], [228, 226], [228, 229], [245, 246], [245, 250], [287, 288], [287, 291]], "missing_branches": [[128, 130], [153, 155], [156, 158], [159, 161], [179, 181], [182, 184], [185, 187], [188, 177]], "functions": {"_parse_timestamp": {"executed_lines": [19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 12, "num_partial_branches": 0, "covered_branches": 12, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 18, "executed_branches": [[19, 20], [19, 21], [21, 22], [21, 26], [26, 27], [26, 39], [28, 29], [28, 30], [30, 31], [30, 32], [36, 37], [36, 38]], "missing_branches": []}, "_gather_metrics_files": {"executed_lines": [43, 44, 46, 47, 48, 49], "summary": {"covered_lines": 6, "num_statements": 6, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 4, "num_partial_branches": 0, "covered_branches": 4, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 42, "executed_branches": [[43, 44], [43, 46], [47, 48], [47, 49]], "missing_branches": []}, "_read_ndjson": {"executed_lines": [53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 73, 74], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 8, "num_partial_branches": 0, "covered_branches": 8, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 52, "executed_branches": [[55, 56], [55, 74], [61, 55], [61, 62], [63, 64], [63, 65], [70, 71], [70, 73]], "missing_branches": []}, "_classify_entry": {"executed_lines": [78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 14, "num_partial_branches": 0, "covered_branches": 14, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 77, "executed_branches": [[79, 80], [79, 87], [81, 82], [81, 83], [83, 84], [83, 85], [85, 86], [85, 87], [87, 88], [87, 89], [89, 90], [89, 91], [91, 92], [91, 93]], "missing_branches": []}, "_safe_float": {"executed_lines": [97, 98, 99, 100, 101, 102], "summary": {"covered_lines": 6, "num_statements": 6, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 2, "num_partial_branches": 0, "covered_branches": 2, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 96, "executed_branches": [[97, 98], [97, 99]], "missing_branches": []}, "_safe_int": {"executed_lines": [106, 107, 108, 109, 110, 111], "summary": {"covered_lines": 6, "num_statements": 6, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 2, "num_partial_branches": 0, "covered_branches": 2, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 105, "executed_branches": [[106, 107], [106, 108]], "missing_branches": []}, "_summarise_keepalive": {"executed_lines": [115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136], "summary": {"covered_lines": 22, "num_statements": 22, "percent_covered": 97.05882352941177, "percent_covered_display": "97.06", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 12, "num_partial_branches": 1, "covered_branches": 11, "missing_branches": 1, "percent_branches_covered": 91.66666666666667, "percent_branches_covered_display": "91.67"}, "missing_lines": [], "excluded_lines": [], "start_line": 114, "executed_branches": [[120, 121], [120, 135], [122, 123], [122, 124], [125, 126], [125, 127], [128, 129], [131, 132], [131, 133], [133, 120], [133, 134]], "missing_branches": [[128, 130]]}, "_summarise_autofix": {"executed_lines": [147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163], "summary": {"covered_lines": 17, "num_statements": 17, "percent_covered": 88.88888888888889, "percent_covered_display": "88.89", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 10, "num_partial_branches": 3, "covered_branches": 7, "missing_branches": 3, "percent_branches_covered": 70.0, "percent_branches_covered_display": "70.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 146, "executed_branches": [[151, 152], [151, 163], [153, 154], [156, 157], [159, 160], [161, 151], [161, 162]], "missing_branches": [[153, 155], [156, 158], [159, 161]]}, "_summarise_verifier": {"executed_lines": [173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 86.20689655172414, "percent_covered_display": "86.21", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 10, "num_partial_branches": 4, "covered_branches": 6, "missing_branches": 4, "percent_branches_covered": 60.0, "percent_branches_covered_display": "60.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 172, "executed_branches": [[177, 178], [177, 190], [179, 180], [182, 183], [185, 186], [188, 189]], "missing_branches": [[179, 181], [182, 184], [185, 187], [188, 177]]}, "_format_counter": {"executed_lines": [201, 202, 203, 204], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 2, "num_partial_branches": 0, "covered_branches": 2, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 200, "executed_branches": [[201, 202], [201, 203]], "missing_branches": []}, "_format_rate": {"executed_lines": [208, 209, 210, 211], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 2, "num_partial_branches": 0, "covered_branches": 2, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 207, "executed_branches": [[208, 209], [208, 210]], "missing_branches": []}, "build_summary": {"executed_lines": [215, 221, 223, 224, 225, 226, 227, 228, 229, 230, 232, 233, 234, 236, 237, 245, 246, 247, 248, 250, 277], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 8, "num_partial_branches": 0, "covered_branches": 8, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 214, "executed_branches": [[223, 224], [223, 232], [226, 223], [226, 227], [228, 226], [228, 229], [245, 246], [245, 250]], "missing_branches": []}, "main": {"executed_lines": [281, 282, 283, 284, 286, 287, 288, 289, 291, 292, 294, 295, 296, 297], "summary": {"covered_lines": 14, "num_statements": 14, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 2, "num_partial_branches": 0, "covered_branches": 2, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 280, "executed_branches": [[287, 288], [287, 291]], "missing_branches": []}, "": {"executed_lines": [3, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 18, 42, 52, 77, 96, 105, 114, 146, 172, 200, 207, 214, 280], "summary": {"covered_lines": 24, "num_statements": 24, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 2, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [300, 301], "start_line": 1, "executed_branches": [], "missing_branches": []}}, "classes": {"": {"executed_lines": [3, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 42, 43, 44, 46, 47, 48, 49, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 73, 74, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 96, 97, 98, 99, 100, 101, 102, 105, 106, 107, 108, 109, 110, 111, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 200, 201, 202, 203, 204, 207, 208, 209, 210, 211, 214, 215, 221, 223, 224, 225, 226, 227, 228, 229, 230, 232, 233, 234, 236, 237, 245, 246, 247, 248, 250, 277, 280, 281, 282, 283, 284, 286, 287, 288, 289, 291, 292, 294, 295, 296, 297], "summary": {"covered_lines": 201, "num_statements": 201, "percent_covered": 97.2318339100346, "percent_covered_display": "97.23", "missing_lines": 0, "excluded_lines": 2, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 88, "num_partial_branches": 8, "covered_branches": 80, "missing_branches": 8, "percent_branches_covered": 90.9090909090909, "percent_branches_covered_display": "90.91"}, "missing_lines": [], "excluded_lines": [300, 301], "start_line": 1, "executed_branches": [[19, 20], [19, 21], [21, 22], [21, 26], [26, 27], [26, 39], [28, 29], [28, 30], [30, 31], [30, 32], [36, 37], [36, 38], [43, 44], [43, 46], [47, 48], [47, 49], [55, 56], [55, 74], [61, 55], [61, 62], [63, 64], [63, 65], [70, 71], [70, 73], [79, 80], [79, 87], [81, 82], [81, 83], [83, 84], [83, 85], [85, 86], [85, 87], [87, 88], [87, 89], [89, 90], [89, 91], [91, 92], [91, 93], [97, 98], [97, 99], [106, 107], [106, 108], [120, 121], [120, 135], [122, 123], [122, 124], [125, 126], [125, 127], [128, 129], [131, 132], [131, 133], [133, 120], [133, 134], [151, 152], [151, 163], [153, 154], [156, 157], [159, 160], [161, 151], [161, 162], [177, 178], [177, 190], [179, 180], [182, 183], [185, 186], [188, 189], [201, 202], [201, 203], [208, 209], [208, 210], [223, 224], [223, 232], [226, 223], [226, 227], [228, 226], [228, 229], [245, 246], [245, 250], [287, 288], [287, 291]], "missing_branches": [[128, 130], [153, 155], [156, 158], [159, 161], [179, 181], [182, 184], [185, 187], [188, 177]]}}}, "scripts/auto_type_hygiene.py": {"executed_lines": [24, 26, 27, 28, 29, 30, 31, 33, 34, 35, 40, 41, 44, 45, 46, 47, 49, 50, 51, 52, 55, 56, 58, 61, 62, 65, 66, 67, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 88, 91, 92, 94, 95, 96, 97, 98, 99, 100, 101, 103, 104, 105, 106, 108, 109, 111, 112, 113, 115, 116, 117, 118, 119, 121, 124, 125, 126, 129, 131, 132, 133, 134, 136, 137, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 151, 152, 153, 154, 155, 157, 158, 159, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 174, 175, 176, 178, 179, 180, 182, 185, 186, 187, 188, 189, 190, 191, 192, 195, 196, 197, 198, 199, 200, 201, 202, 204, 205, 206, 207, 208, 210, 211], "summary": {"covered_lines": 139, "num_statements": 139, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 2, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 68, "num_partial_branches": 0, "covered_branches": 68, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [214, 215], "executed_branches": [[46, 47], [46, 49], [50, 51], [50, 52], [73, 74], [73, 85], [78, 79], [78, 80], [81, 82], [81, 83], [83, 73], [83, 84], [91, 92], [91, 94], [95, 96], [95, 103], [98, 99], [98, 100], [100, 95], [100, 101], [108, 109], [108, 111], [112, 113], [112, 115], [116, 117], [116, 121], [117, 118], [117, 121], [118, 117], [118, 119], [139, 140], [139, 182], [141, 142], [141, 144], [145, 146], [145, 180], [147, 148], [147, 151], [152, 153], [152, 178], [154, 155], [154, 157], [158, 159], [158, 163], [165, 166], [165, 168], [169, 170], [169, 172], [170, 169], [170, 171], [186, -185], [186, 187], [187, 188], [187, 189], [189, 186], [189, 190], [190, 191], [190, 192], [197, 198], [197, 204], [199, 197], [199, 200], [201, 197], [201, 202], [204, 205], [204, 210], [207, 208], [207, 211]], "missing_branches": [], "functions": {"_load_allowlist": {"executed_lines": [45, 46, 47, 49, 50, 51, 52], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 4, "num_partial_branches": 0, "covered_branches": 4, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 44, "executed_branches": [[46, 47], [46, 49], [50, 51], [50, 52]], "missing_branches": []}, "should_exclude": {"executed_lines": [66, 67], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 65, "executed_branches": [], "missing_branches": []}, "_has_stub_package": {"executed_lines": [71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 8, "num_partial_branches": 0, "covered_branches": 8, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 70, "executed_branches": [[73, 74], [73, 85], [78, 79], [78, 80], [81, 82], [81, 83], [83, 73], [83, 84]], "missing_branches": []}, "module_has_types": {"executed_lines": [91, 92, 94, 95, 96, 97, 98, 99, 100, 101, 103, 104, 105, 106, 108, 109, 111, 112, 113, 115, 116, 117, 118, 119, 121], "summary": {"covered_lines": 25, "num_statements": 25, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 18, "num_partial_branches": 0, "covered_branches": 18, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 88, "executed_branches": [[91, 92], [91, 94], [95, 96], [95, 103], [98, 99], [98, 100], [100, 95], [100, 101], [108, 109], [108, 111], [112, 113], [112, 115], [116, 117], [116, 121], [117, 118], [117, 121], [118, 117], [118, 119]], "missing_branches": []}, "needs_ignore": {"executed_lines": [125, 126], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 124, "executed_branches": [], "missing_branches": []}, "process_file": {"executed_lines": [131, 132, 133, 134, 136, 137, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 151, 152, 153, 154, 155, 157, 158, 159, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 174, 175, 176, 178, 179, 180, 182], "summary": {"covered_lines": 42, "num_statements": 42, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 20, "num_partial_branches": 0, "covered_branches": 20, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 129, "executed_branches": [[139, 140], [139, 182], [141, 142], [141, 144], [145, 146], [145, 180], [147, 148], [147, 151], [152, 153], [152, 178], [154, 155], [154, 157], [158, 159], [158, 163], [165, 166], [165, 168], [169, 170], [169, 172], [170, 169], [170, 171]], "missing_branches": []}, "iter_python_files": {"executed_lines": [186, 187, 188, 189, 190, 191, 192], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 8, "num_partial_branches": 0, "covered_branches": 8, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 185, "executed_branches": [[186, -185], [186, 187], [187, 188], [187, 189], [189, 186], [189, 190], [190, 191], [190, 192]], "missing_branches": []}, "main": {"executed_lines": [196, 197, 198, 199, 200, 201, 202, 204, 205, 206, 207, 208, 210, 211], "summary": {"covered_lines": 14, "num_statements": 14, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 10, "num_partial_branches": 0, "covered_branches": 10, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 195, "executed_branches": [[197, 198], [197, 204], [199, 197], [199, 200], [201, 197], [201, 202], [204, 205], [204, 210], [207, 208], [207, 211]], "missing_branches": []}, "": {"executed_lines": [24, 26, 27, 28, 29, 30, 31, 33, 34, 35, 40, 41, 44, 55, 56, 58, 61, 62, 65, 70, 88, 124, 129, 185, 195], "summary": {"covered_lines": 25, "num_statements": 25, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 2, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [214, 215], "start_line": 1, "executed_branches": [], "missing_branches": []}}, "classes": {"": {"executed_lines": [24, 26, 27, 28, 29, 30, 31, 33, 34, 35, 40, 41, 44, 45, 46, 47, 49, 50, 51, 52, 55, 56, 58, 61, 62, 65, 66, 67, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 88, 91, 92, 94, 95, 96, 97, 98, 99, 100, 101, 103, 104, 105, 106, 108, 109, 111, 112, 113, 115, 116, 117, 118, 119, 121, 124, 125, 126, 129, 131, 132, 133, 134, 136, 137, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 151, 152, 153, 154, 155, 157, 158, 159, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 174, 175, 176, 178, 179, 180, 182, 185, 186, 187, 188, 189, 190, 191, 192, 195, 196, 197, 198, 199, 200, 201, 202, 204, 205, 206, 207, 208, 210, 211], "summary": {"covered_lines": 139, "num_statements": 139, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 2, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 68, "num_partial_branches": 0, "covered_branches": 68, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [214, 215], "start_line": 1, "executed_branches": [[46, 47], [46, 49], [50, 51], [50, 52], [73, 74], [73, 85], [78, 79], [78, 80], [81, 82], [81, 83], [83, 73], [83, 84], [91, 92], [91, 94], [95, 96], [95, 103], [98, 99], [98, 100], [100, 95], [100, 101], [108, 109], [108, 111], [112, 113], [112, 115], [116, 117], [116, 121], [117, 118], [117, 121], [118, 117], [118, 119], [139, 140], [139, 182], [141, 142], [141, 144], [145, 146], [145, 180], [147, 148], [147, 151], [152, 153], [152, 178], [154, 155], [154, 157], [158, 159], [158, 163], [165, 166], [165, 168], [169, 170], [169, 172], [170, 169], [170, 171], [186, -185], [186, 187], [187, 188], [187, 189], [189, 186], [189, 190], [190, 191], [190, 192], [197, 198], [197, 204], [199, 197], [199, 200], [201, 197], [201, 202], [204, 205], [204, 210], [207, 208], [207, 211]], "missing_branches": []}}}, "scripts/build_autofix_pr_comment.py": {"executed_lines": [3, 5, 6, 7, 8, 9, 10, 12, 15, 16, 17, 18, 19, 20, 21, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 38, 39, 40, 41, 42, 45, 46, 47, 48, 49, 50, 51, 52, 55, 56, 57, 58, 61, 64, 65, 66, 67, 68, 69, 70, 71, 74, 75, 76, 77, 78, 79, 80, 83, 84, 85, 86, 87, 88, 89, 90, 91, 94, 101, 102, 103, 105, 111, 112, 113, 115, 116, 118, 119, 120, 121, 123, 124, 126, 127, 129, 130, 132, 133, 136, 137, 138, 139, 140, 141, 142, 143, 145, 151, 152, 153], "summary": {"covered_lines": 103, "num_statements": 105, "percent_covered": 97.03703703703704, "percent_covered_display": "97.04", "missing_lines": 2, "excluded_lines": 2, "percent_statements_covered": 98.0952380952381, "percent_statements_covered_display": "98.10", "num_branches": 30, "num_partial_branches": 2, "covered_branches": 28, "missing_branches": 2, "percent_branches_covered": 93.33333333333333, "percent_branches_covered_display": "93.33"}, "missing_lines": [59, 60], "excluded_lines": [156, 157], "executed_branches": [[25, 26], [25, 27], [27, 28], [27, 33], [29, 30], [29, 31], [31, 32], [33, 34], [33, 35], [46, 47], [46, 48], [56, 57], [56, 58], [58, 61], [65, 66], [65, 67], [68, 69], [68, 71], [75, 76], [75, 77], [78, 79], [78, 80], [87, 88], [87, 89], [89, 90], [89, 91], [129, 130], [129, 132]], "missing_branches": [[31, 33], [58, 59]], "functions": {"load_json": {"executed_lines": [16, 17, 18, 19, 20, 21], "summary": {"covered_lines": 6, "num_statements": 6, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 15, "executed_branches": [], "missing_branches": []}, "coerce_bool": {"executed_lines": [25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 95.23809523809524, "percent_covered_display": "95.24", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 10, "num_partial_branches": 1, "covered_branches": 9, "missing_branches": 1, "percent_branches_covered": 90.0, "percent_branches_covered_display": "90.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 24, "executed_branches": [[25, 26], [25, 27], [27, 28], [27, 33], [29, 30], [29, 31], [31, 32], [33, 34], [33, 35]], "missing_branches": [[31, 33]]}, "coerce_int": {"executed_lines": [39, 40, 41, 42], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 38, "executed_branches": [], "missing_branches": []}, "format_timestamp": {"executed_lines": [46, 47, 48, 49, 50, 51, 52], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 2, "num_partial_branches": 0, "covered_branches": 2, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 45, "executed_branches": [[46, 47], [46, 48]], "missing_branches": []}, "format_spark": {"executed_lines": [56, 57, 58, 61], "summary": {"covered_lines": 4, "num_statements": 6, "percent_covered": 70.0, "percent_covered_display": "70.00", "missing_lines": 2, "excluded_lines": 0, "percent_statements_covered": 66.66666666666667, "percent_statements_covered_display": "66.67", "num_branches": 4, "num_partial_branches": 1, "covered_branches": 3, "missing_branches": 1, "percent_branches_covered": 75.0, "percent_branches_covered_display": "75.00"}, "missing_lines": [59, 60], "excluded_lines": [], "start_line": 55, "executed_branches": [[56, 57], [56, 58], [58, 61]], "missing_branches": [[58, 59]]}, "_top_code_lines": {"executed_lines": [65, 66, 67, 68, 69, 70, 71], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 4, "num_partial_branches": 0, "covered_branches": 4, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 64, "executed_branches": [[65, 66], [65, 67], [68, 69], [68, 71]], "missing_branches": []}, "_snapshot_code_lines": {"executed_lines": [75, 76, 77, 78, 79, 80], "summary": {"covered_lines": 6, "num_statements": 6, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 4, "num_partial_branches": 0, "covered_branches": 4, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 74, "executed_branches": [[75, 76], [75, 77], [78, 79], [78, 80]], "missing_branches": []}, "_status_line": {"executed_lines": [84, 85, 86, 87, 88, 89, 90, 91], "summary": {"covered_lines": 8, "num_statements": 8, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 4, "num_partial_branches": 0, "covered_branches": 4, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 83, "executed_branches": [[87, 88], [87, 89], [89, 90], [89, 91]], "missing_branches": []}, "build_comment": {"executed_lines": [101, 102, 103, 105, 111, 112, 113, 115, 116, 118, 119, 120, 121, 123, 124, 126, 127, 129, 130, 132, 133], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 2, "num_partial_branches": 0, "covered_branches": 2, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 94, "executed_branches": [[129, 130], [129, 132]], "missing_branches": []}, "main": {"executed_lines": [137, 138, 139, 140, 141, 142, 143, 145, 151, 152, 153], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 136, "executed_branches": [], "missing_branches": []}, "": {"executed_lines": [3, 5, 6, 7, 8, 9, 10, 12, 15, 24, 38, 45, 55, 64, 74, 83, 94, 136], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 2, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [156, 157], "start_line": 1, "executed_branches": [], "missing_branches": []}}, "classes": {"": {"executed_lines": [3, 5, 6, 7, 8, 9, 10, 12, 15, 16, 17, 18, 19, 20, 21, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 38, 39, 40, 41, 42, 45, 46, 47, 48, 49, 50, 51, 52, 55, 56, 57, 58, 61, 64, 65, 66, 67, 68, 69, 70, 71, 74, 75, 76, 77, 78, 79, 80, 83, 84, 85, 86, 87, 88, 89, 90, 91, 94, 101, 102, 103, 105, 111, 112, 113, 115, 116, 118, 119, 120, 121, 123, 124, 126, 127, 129, 130, 132, 133, 136, 137, 138, 139, 140, 141, 142, 143, 145, 151, 152, 153], "summary": {"covered_lines": 103, "num_statements": 105, "percent_covered": 97.03703703703704, "percent_covered_display": "97.04", "missing_lines": 2, "excluded_lines": 2, "percent_statements_covered": 98.0952380952381, "percent_statements_covered_display": "98.10", "num_branches": 30, "num_partial_branches": 2, "covered_branches": 28, "missing_branches": 2, "percent_branches_covered": 93.33333333333333, "percent_branches_covered_display": "93.33"}, "missing_lines": [59, 60], "excluded_lines": [156, 157], "start_line": 1, "executed_branches": [[25, 26], [25, 27], [27, 28], [27, 33], [29, 30], [29, 31], [31, 32], [33, 34], [33, 35], [46, 47], [46, 48], [56, 57], [56, 58], [58, 61], [65, 66], [65, 67], [68, 69], [68, 71], [75, 76], [75, 77], [78, 79], [78, 80], [87, 88], [87, 89], [89, 90], [89, 91], [129, 130], [129, 132]], "missing_branches": [[31, 33], [58, 59]]}}}, "scripts/ci_cosmetic_repair.py": {"executed_lines": [21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38, 40, 45, 46, 47, 50, 52, 53, 54, 56, 57, 58, 61, 64, 68, 69, 72, 73, 74, 75, 76, 77, 78, 80, 83, 86, 89, 90, 91, 94, 97, 98, 106, 109, 112, 113, 114, 115, 116, 121, 122, 123, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 137, 138, 139, 148, 149, 150, 151, 152, 161, 164, 165, 166, 167, 168, 170, 172, 173, 174, 175, 176, 178, 179, 180, 183, 184, 185, 186, 187, 188, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 209, 212, 213, 214, 215, 216, 217, 220, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 241, 242, 243, 244, 246, 247, 248, 249, 250, 251, 252, 255, 256, 257, 258, 259, 260, 261, 262, 263, 266, 267, 268, 269, 270, 271, 277, 278, 286, 287, 288, 291, 292, 299, 300, 303, 310, 311, 312, 313, 314, 315, 316, 319, 328, 329, 342, 343, 344, 345, 346, 347, 348, 349, 350, 353, 356, 357, 358, 368, 371, 372, 373, 374, 378, 381, 384, 385, 388, 401, 402, 403, 404, 407, 408, 414, 420, 421, 427, 433, 438, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 460, 461, 462, 463, 464, 465, 466, 467, 477, 478, 479, 487, 488, 489, 490, 491, 500, 502, 503, 504, 505, 514, 516, 517, 518, 519, 521, 522, 532, 534, 540, 541, 542, 550, 562], "summary": {"covered_lines": 256, "num_statements": 256, "percent_covered": 99.71264367816092, "percent_covered_display": "99.71", "missing_lines": 0, "excluded_lines": 8, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 92, "num_partial_branches": 1, "covered_branches": 91, "missing_branches": 1, "percent_branches_covered": 98.91304347826087, "percent_branches_covered_display": "98.91"}, "missing_lines": [], "excluded_lines": [117, 118, 181, 182, 284, 285, 565, 566], "executed_branches": [[54, 56], [54, 58], [90, 91], [90, 94], [114, 115], [114, 123], [128, 129], [128, 130], [131, 132], [131, 133], [134, 135], [134, 137], [137, 138], [137, 148], [148, 149], [148, 161], [150, 151], [150, 152], [165, 166], [165, 167], [167, 168], [167, 170], [173, 174], [173, 175], [175, 176], [175, 178], [178, 179], [178, 184], [184, 185], [184, 186], [186, 187], [186, 188], [196, 197], [196, 198], [199, 200], [199, 209], [214, 215], [214, 217], [227, 228], [227, 229], [233, 234], [233, 247], [234, 235], [234, 246], [237, 238], [237, 241], [242, 243], [242, 244], [247, 248], [247, 249], [249, 250], [249, 251], [257, 258], [257, 259], [260, 261], [260, 262], [268, 269], [268, 288], [270, 271], [270, 277], [286, 268], [286, 287], [342, 343], [342, 344], [346, 347], [346, 350], [348, 349], [357, 358], [357, 368], [444, 445], [444, 446], [448, 449], [448, 450], [450, 451], [450, 461], [461, 462], [461, 463], [465, 466], [465, 488], [466, 467], [466, 478], [488, 489], [488, 502], [489, 490], [489, 491], [503, 504], [503, 516], [518, 519], [518, 521], [521, 522], [521, 534]], "missing_branches": [[348, 346]], "functions": {"_discover_expectation_modules": {"executed_lines": [52, 53, 54, 56, 57, 58], "summary": {"covered_lines": 6, "num_statements": 6, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 2, "num_partial_branches": 0, "covered_branches": 2, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 50, "executed_branches": [[54, 56], [54, 58]], "missing_branches": []}, "RepairInstruction.absolute_path": {"executed_lines": [83], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 80, "executed_branches": [], "missing_branches": []}, "_run": {"executed_lines": [89, 90, 91, 94], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 2, "num_partial_branches": 0, "covered_branches": 2, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 86, "executed_branches": [[90, 91], [90, 94]], "missing_branches": []}, "run_pytest": {"executed_lines": [98, 106], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 97, "executed_branches": [], "missing_branches": []}, "parse_failure_message": {"executed_lines": [113, 114, 115, 116, 121, 122, 123], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 2, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 2, "num_partial_branches": 0, "covered_branches": 2, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [117, 118], "start_line": 112, "executed_branches": [[114, 115], [114, 123]], "missing_branches": []}, "build_instruction": {"executed_lines": [127, 128, 129, 130, 131, 132, 133, 134, 135, 137, 138, 139, 148, 149, 150, 151, 152, 161], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 12, "num_partial_branches": 0, "covered_branches": 12, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 126, "executed_branches": [[128, 129], [128, 130], [131, 132], [131, 133], [134, 135], [134, 137], [137, 138], [137, 148], [148, 149], [148, 161], [150, 151], [150, 152]], "missing_branches": []}, "_format_value": {"executed_lines": [165, 166, 167, 168, 170, 172, 173, 174, 175, 176, 178, 179, 180, 183, 184, 185, 186, 187, 188], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 2, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 14, "num_partial_branches": 0, "covered_branches": 14, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [181, 182], "start_line": 164, "executed_branches": [[165, 166], [165, 167], [167, 168], [167, 170], [173, 174], [173, 175], [175, 176], [175, 178], [178, 179], [178, 184], [184, 185], [184, 186], [186, 187], [186, 188]], "missing_branches": []}, "load_failure_records": {"executed_lines": [192, 193, 194, 195, 196, 197, 198, 199, 200, 209], "summary": {"covered_lines": 10, "num_statements": 10, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 4, "num_partial_branches": 0, "covered_branches": 4, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 191, "executed_branches": [[196, 197], [196, 198], [199, 200], [199, 209]], "missing_branches": []}, "collect_instructions": {"executed_lines": [213, 214, 215, 216, 217], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 2, "num_partial_branches": 0, "covered_branches": 2, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 212, "executed_branches": [[214, 215], [214, 217]], "missing_branches": []}, "apply_tolerance_update": {"executed_lines": [226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 241, 242, 243, 244, 246, 247, 248, 249, 250, 251, 252], "summary": {"covered_lines": 24, "num_statements": 24, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 14, "num_partial_branches": 0, "covered_branches": 14, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 225, "executed_branches": [[227, 228], [227, 229], [233, 234], [233, 247], [234, 235], [234, 246], [237, 238], [237, 241], [242, 243], [242, 244], [247, 248], [247, 249], [249, 250], [249, 251]], "missing_branches": []}, "apply_snapshot_update": {"executed_lines": [256, 257, 258, 259, 260, 261, 262, 263], "summary": {"covered_lines": 8, "num_statements": 8, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 4, "num_partial_branches": 0, "covered_branches": 4, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 255, "executed_branches": [[257, 258], [257, 259], [260, 261], [260, 262]], "missing_branches": []}, "apply_instructions": {"executed_lines": [267, 268, 269, 270, 271, 277, 278, 286, 287, 288], "summary": {"covered_lines": 10, "num_statements": 10, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 2, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 6, "num_partial_branches": 0, "covered_branches": 6, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [284, 285], "start_line": 266, "executed_branches": [[268, 269], [268, 288], [270, 271], [270, 277], [286, 268], [286, 287]], "missing_branches": []}, "working_tree_changes": {"executed_lines": [292, 299, 300], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 291, "executed_branches": [], "missing_branches": []}, "stage_and_commit": {"executed_lines": [310, 311, 312, 313, 314, 315, 316], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 303, "executed_branches": [], "missing_branches": []}, "push_and_open_pr": {"executed_lines": [328, 329, 342, 343, 344, 345, 346, 347, 348, 349, 350], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 94.11764705882354, "percent_covered_display": "94.12", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 6, "num_partial_branches": 1, "covered_branches": 5, "missing_branches": 1, "percent_branches_covered": 83.33333333333333, "percent_branches_covered_display": "83.33"}, "missing_lines": [], "excluded_lines": [], "start_line": 319, "executed_branches": [[342, 343], [342, 344], [346, 347], [346, 350], [348, 349]], "missing_branches": [[348, 346]]}, "_serialise_instructions": {"executed_lines": [356, 357, 358, 368], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 2, "num_partial_branches": 0, "covered_branches": 2, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 353, "executed_branches": [[357, 358], [357, 368]], "missing_branches": []}, "write_summary": {"executed_lines": [372, 373, 374, 378], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 371, "executed_branches": [], "missing_branches": []}, "build_pr_body": {"executed_lines": [384, 385, 388], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 381, "executed_branches": [], "missing_branches": []}, "parse_args": {"executed_lines": [402, 403, 404, 407, 408, 414, 420, 421, 427, 433, 438], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 401, "executed_branches": [], "missing_branches": []}, "main": {"executed_lines": [442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 460, 461, 462, 463, 464, 465, 466, 467, 477, 478, 479, 487, 488, 489, 490, 491, 500, 502, 503, 504, 505, 514, 516, 517, 518, 519, 521, 522, 532, 534, 540, 541, 542, 550, 562], "summary": {"covered_lines": 46, "num_statements": 46, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 22, "num_partial_branches": 0, "covered_branches": 22, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 441, "executed_branches": [[444, 445], [444, 446], [448, 449], [448, 450], [450, 451], [450, 461], [461, 462], [461, 463], [465, 466], [465, 488], [466, 467], [466, 478], [488, 489], [488, 502], [489, 490], [489, 491], [503, 504], [503, 516], [518, 519], [518, 521], [521, 522], [521, 534]], "missing_branches": []}, "": {"executed_lines": [21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38, 40, 45, 46, 47, 50, 61, 64, 68, 69, 72, 73, 74, 75, 76, 77, 78, 80, 86, 97, 109, 112, 126, 164, 191, 212, 220, 225, 255, 266, 291, 303, 319, 353, 371, 381, 401, 441], "summary": {"covered_lines": 53, "num_statements": 53, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 2, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [565, 566], "start_line": 1, "executed_branches": [], "missing_branches": []}}, "classes": {"CosmeticRepairError": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 64, "executed_branches": [], "missing_branches": []}, "RepairInstruction": {"executed_lines": [83], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 69, "executed_branches": [], "missing_branches": []}, "": {"executed_lines": [21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38, 40, 45, 46, 47, 50, 52, 53, 54, 56, 57, 58, 61, 64, 68, 69, 72, 73, 74, 75, 76, 77, 78, 80, 86, 89, 90, 91, 94, 97, 98, 106, 109, 112, 113, 114, 115, 116, 121, 122, 123, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 137, 138, 139, 148, 149, 150, 151, 152, 161, 164, 165, 166, 167, 168, 170, 172, 173, 174, 175, 176, 178, 179, 180, 183, 184, 185, 186, 187, 188, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 209, 212, 213, 214, 215, 216, 217, 220, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 241, 242, 243, 244, 246, 247, 248, 249, 250, 251, 252, 255, 256, 257, 258, 259, 260, 261, 262, 263, 266, 267, 268, 269, 270, 271, 277, 278, 286, 287, 288, 291, 292, 299, 300, 303, 310, 311, 312, 313, 314, 315, 316, 319, 328, 329, 342, 343, 344, 345, 346, 347, 348, 349, 350, 353, 356, 357, 358, 368, 371, 372, 373, 374, 378, 381, 384, 385, 388, 401, 402, 403, 404, 407, 408, 414, 420, 421, 427, 433, 438, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 460, 461, 462, 463, 464, 465, 466, 467, 477, 478, 479, 487, 488, 489, 490, 491, 500, 502, 503, 504, 505, 514, 516, 517, 518, 519, 521, 522, 532, 534, 540, 541, 542, 550, 562], "summary": {"covered_lines": 255, "num_statements": 255, "percent_covered": 99.71181556195965, "percent_covered_display": "99.71", "missing_lines": 0, "excluded_lines": 8, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 92, "num_partial_branches": 1, "covered_branches": 91, "missing_branches": 1, "percent_branches_covered": 98.91304347826087, "percent_branches_covered_display": "98.91"}, "missing_lines": [], "excluded_lines": [117, 118, 181, 182, 284, 285, 565, 566], "start_line": 1, "executed_branches": [[54, 56], [54, 58], [90, 91], [90, 94], [114, 115], [114, 123], [128, 129], [128, 130], [131, 132], [131, 133], [134, 135], [134, 137], [137, 138], [137, 148], [148, 149], [148, 161], [150, 151], [150, 152], [165, 166], [165, 167], [167, 168], [167, 170], [173, 174], [173, 175], [175, 176], [175, 178], [178, 179], [178, 184], [184, 185], [184, 186], [186, 187], [186, 188], [196, 197], [196, 198], [199, 200], [199, 209], [214, 215], [214, 217], [227, 228], [227, 229], [233, 234], [233, 247], [234, 235], [234, 246], [237, 238], [237, 241], [242, 243], [242, 244], [247, 248], [247, 249], [249, 250], [249, 251], [257, 258], [257, 259], [260, 261], [260, 262], [268, 269], [268, 288], [270, 271], [270, 277], [286, 268], [286, 287], [342, 343], [342, 344], [346, 347], [346, 350], [348, 349], [357, 358], [357, 368], [444, 445], [444, 446], [448, 449], [448, 450], [450, 451], [450, 461], [461, 462], [461, 463], [465, 466], [465, 488], [466, 467], [466, 478], [488, 489], [488, 502], [489, 490], [489, 491], [503, 504], [503, 516], [518, 519], [518, 521], [521, 522], [521, 534]], "missing_branches": [[348, 346]]}}}, "scripts/ci_coverage_delta.py": {"executed_lines": [3, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16, 19, 20, 21, 22, 23, 28, 29, 30, 31, 34, 35, 36, 37, 38, 41, 42, 43, 44, 45, 50, 57, 58, 59, 61, 63, 64, 65, 66, 67, 68, 69, 71, 73, 83, 86, 87, 88, 89, 92, 93, 95, 96, 97, 98, 99, 101, 103, 104, 106], "summary": {"covered_lines": 61, "num_statements": 61, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 8, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 14, "num_partial_branches": 0, "covered_branches": 14, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [24, 25, 39, 40, 46, 47, 109, 110], "executed_branches": [[20, 21], [20, 22], [29, 30], [29, 31], [35, 36], [35, 37], [42, 43], [42, 44], [63, 64], [63, 65], [65, 66], [65, 67], [67, 68], [67, 71]], "missing_branches": [], "functions": {"_parse_float": {"executed_lines": [20, 21, 22, 23], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 2, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 2, "num_partial_branches": 0, "covered_branches": 2, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [24, 25], "start_line": 19, "executed_branches": [[20, 21], [20, 22]], "missing_branches": []}, "_truthy": {"executed_lines": [29, 30, 31], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 2, "num_partial_branches": 0, "covered_branches": 2, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 28, "executed_branches": [[29, 30], [29, 31]], "missing_branches": []}, "_extract_line_rate": {"executed_lines": [35, 36, 37, 38, 41, 42, 43, 44, 45], "summary": {"covered_lines": 9, "num_statements": 9, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 4, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 4, "num_partial_branches": 0, "covered_branches": 4, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [39, 40, 46, 47], "start_line": 34, "executed_branches": [[35, 36], [35, 37], [42, 43], [42, 44]], "missing_branches": []}, "_build_payload": {"executed_lines": [57, 58, 59, 61, 63, 64, 65, 66, 67, 68, 69, 71, 73, 83], "summary": {"covered_lines": 14, "num_statements": 14, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 6, "num_partial_branches": 0, "covered_branches": 6, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 50, "executed_branches": [[63, 64], [63, 65], [65, 66], [65, 67], [67, 68], [67, 71]], "missing_branches": []}, "main": {"executed_lines": [87, 88, 89, 92, 93, 95, 96, 97, 98, 99, 101, 103, 104, 106], "summary": {"covered_lines": 14, "num_statements": 14, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 86, "executed_branches": [], "missing_branches": []}, "": {"executed_lines": [3, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16, 19, 28, 34, 50, 86], "summary": {"covered_lines": 17, "num_statements": 17, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 2, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [109, 110], "start_line": 1, "executed_branches": [], "missing_branches": []}}, "classes": {"": {"executed_lines": [3, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16, 19, 20, 21, 22, 23, 28, 29, 30, 31, 34, 35, 36, 37, 38, 41, 42, 43, 44, 45, 50, 57, 58, 59, 61, 63, 64, 65, 66, 67, 68, 69, 71, 73, 83, 86, 87, 88, 89, 92, 93, 95, 96, 97, 98, 99, 101, 103, 104, 106], "summary": {"covered_lines": 61, "num_statements": 61, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 8, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 14, "num_partial_branches": 0, "covered_branches": 14, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [24, 25, 39, 40, 46, 47, 109, 110], "start_line": 1, "executed_branches": [[20, 21], [20, 22], [29, 30], [29, 31], [35, 36], [35, 37], [42, 43], [42, 44], [63, 64], [63, 65], [65, 66], [65, 67], [67, 68], [67, 71]], "missing_branches": []}}}, "scripts/ci_failure_analyzer.py": {"executed_lines": [7, 8, 9, 10, 11, 12, 15, 23, 30, 39, 40, 42, 43, 45, 46, 47, 48, 49, 50, 51, 52, 53, 56, 65, 67, 68, 69, 71, 72, 73, 76, 77, 78, 79, 81, 84, 93, 94, 95, 96, 97, 99, 102, 118, 120, 121, 122, 124, 125, 127, 128, 130, 131, 132, 133, 135, 136, 137, 138, 139, 140, 142, 143, 145, 148, 161, 162, 164, 165, 167, 168, 169, 170, 171, 172, 173, 175, 176, 177, 178, 179, 180, 182, 183, 184, 185, 186, 187, 189, 190, 191, 192, 193, 196, 209, 210, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 224], "summary": {"covered_lines": 108, "num_statements": 108, "percent_covered": 99.39759036144578, "percent_covered_display": "99.40", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 58, "num_partial_branches": 1, "covered_branches": 57, "missing_branches": 1, "percent_branches_covered": 98.27586206896552, "percent_branches_covered_display": "98.28"}, "missing_lines": [], "excluded_lines": [], "executed_branches": [[42, 43], [42, 45], [46, 47], [46, 53], [48, 49], [67, 68], [67, 71], [68, 67], [68, 69], [71, 72], [71, 76], [72, 71], [72, 73], [76, 77], [76, 78], [78, 79], [78, 81], [94, 95], [94, 99], [120, 121], [120, 135], [124, 125], [124, 127], [127, 128], [127, 130], [130, 131], [130, 132], [132, 120], [132, 133], [136, 137], [136, 145], [138, 139], [138, 140], [142, 136], [142, 143], [161, 162], [161, 164], [167, 168], [167, 182], [171, 172], [171, 173], [175, 176], [175, 180], [178, 179], [178, 180], [185, 186], [185, 187], [189, 190], [189, 193], [191, 192], [191, 193], [213, 214], [213, 224], [215, 216], [215, 217], [219, 213], [219, 220]], "missing_branches": [[48, 46]], "functions": {"load_failure_logs": {"executed_lines": [39, 40, 42, 43, 45, 46, 47, 48, 49, 50, 51, 52, 53], "summary": {"covered_lines": 13, "num_statements": 13, "percent_covered": 94.73684210526316, "percent_covered_display": "94.74", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 6, "num_partial_branches": 1, "covered_branches": 5, "missing_branches": 1, "percent_branches_covered": 83.33333333333333, "percent_branches_covered_display": "83.33"}, "missing_lines": [], "excluded_lines": [], "start_line": 30, "executed_branches": [[42, 43], [42, 45], [46, 47], [46, 53], [48, 49]], "missing_branches": [[48, 46]]}, "classify_failure": {"executed_lines": [65, 67, 68, 69, 71, 72, 73, 76, 77, 78, 79, 81], "summary": {"covered_lines": 12, "num_statements": 12, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 12, "num_partial_branches": 0, "covered_branches": 12, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 56, "executed_branches": [[67, 68], [67, 71], [68, 67], [68, 69], [71, 72], [71, 76], [72, 71], [72, 73], [76, 77], [76, 78], [78, 79], [78, 81]], "missing_branches": []}, "aggregate_failures": {"executed_lines": [93, 94, 95, 96, 97, 99], "summary": {"covered_lines": 6, "num_statements": 6, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 2, "num_partial_branches": 0, "covered_branches": 2, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 84, "executed_branches": [[94, 95], [94, 99]], "missing_branches": []}, "identify_flaky_tests": {"executed_lines": [118, 120, 121, 122, 124, 125, 127, 128, 130, 131, 132, 133, 135, 136, 137, 138, 139, 140, 142, 143, 145], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 16, "num_partial_branches": 0, "covered_branches": 16, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 102, "executed_branches": [[120, 121], [120, 135], [124, 125], [124, 127], [127, 128], [127, 130], [130, 131], [130, 132], [132, 120], [132, 133], [136, 137], [136, 145], [138, 139], [138, 140], [142, 136], [142, 143]], "missing_branches": []}, "generate_failure_report": {"executed_lines": [161, 162, 164, 165, 167, 168, 169, 170, 171, 172, 173, 175, 176, 177, 178, 179, 180, 182, 183, 184, 185, 186, 187, 189, 190, 191, 192, 193], "summary": {"covered_lines": 28, "num_statements": 28, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 16, "num_partial_branches": 0, "covered_branches": 16, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 148, "executed_branches": [[161, 162], [161, 164], [167, 168], [167, 182], [171, 172], [171, 173], [175, 176], [175, 180], [178, 179], [178, 180], [185, 186], [185, 187], [189, 190], [189, 193], [191, 192], [191, 193]], "missing_branches": []}, "get_recent_failures": {"executed_lines": [209, 210, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 224], "summary": {"covered_lines": 14, "num_statements": 14, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 6, "num_partial_branches": 0, "covered_branches": 6, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 196, "executed_branches": [[213, 214], [213, 224], [215, 216], [215, 217], [219, 213], [219, 220]], "missing_branches": []}, "": {"executed_lines": [7, 8, 9, 10, 11, 12, 15, 23, 30, 56, 84, 102, 148, 196], "summary": {"covered_lines": 14, "num_statements": 14, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 1, "executed_branches": [], "missing_branches": []}}, "classes": {"": {"executed_lines": [7, 8, 9, 10, 11, 12, 15, 23, 30, 39, 40, 42, 43, 45, 46, 47, 48, 49, 50, 51, 52, 53, 56, 65, 67, 68, 69, 71, 72, 73, 76, 77, 78, 79, 81, 84, 93, 94, 95, 96, 97, 99, 102, 118, 120, 121, 122, 124, 125, 127, 128, 130, 131, 132, 133, 135, 136, 137, 138, 139, 140, 142, 143, 145, 148, 161, 162, 164, 165, 167, 168, 169, 170, 171, 172, 173, 175, 176, 177, 178, 179, 180, 182, 183, 184, 185, 186, 187, 189, 190, 191, 192, 193, 196, 209, 210, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 224], "summary": {"covered_lines": 108, "num_statements": 108, "percent_covered": 99.39759036144578, "percent_covered_display": "99.40", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 58, "num_partial_branches": 1, "covered_branches": 57, "missing_branches": 1, "percent_branches_covered": 98.27586206896552, "percent_branches_covered_display": "98.28"}, "missing_lines": [], "excluded_lines": [], "start_line": 1, "executed_branches": [[42, 43], [42, 45], [46, 47], [46, 53], [48, 49], [67, 68], [67, 71], [68, 67], [68, 69], [71, 72], [71, 76], [72, 71], [72, 73], [76, 77], [76, 78], [78, 79], [78, 81], [94, 95], [94, 99], [120, 121], [120, 135], [124, 125], [124, 127], [127, 128], [127, 130], [130, 131], [130, 132], [132, 120], [132, 133], [136, 137], [136, 145], [138, 139], [138, 140], [142, 136], [142, 143], [161, 162], [161, 164], [167, 168], [167, 182], [171, 172], [171, 173], [175, 176], [175, 180], [178, 179], [178, 180], [185, 186], [185, 187], [189, 190], [189, 193], [191, 192], [191, 193], [213, 214], [213, 224], [215, 216], [215, 217], [219, 213], [219, 220]], "missing_branches": [[48, 46]]}}}, "scripts/ci_history.py": {"executed_lines": [9, 11, 12, 13, 14, 15, 16, 17, 19, 20, 24, 25, 26, 27, 30, 31, 32, 33, 36, 37, 38, 39, 41, 42, 43, 44, 46, 47, 50, 57, 58, 59, 61, 67, 68, 69, 74, 75, 76, 77, 78, 79, 82, 83, 84, 85, 86, 101, 104, 105, 106, 107, 108, 109, 110, 111, 112, 114, 115, 116, 118, 119, 120, 121, 122, 124, 131, 132, 133, 134, 136, 137, 138, 141, 143, 144, 146], "summary": {"covered_lines": 77, "num_statements": 77, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 4, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 20, "num_partial_branches": 0, "covered_branches": 20, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [21, 22, 149, 150], "executed_branches": [[31, 32], [31, 33], [37, 38], [37, 46], [41, 42], [41, 46], [67, 68], [67, 69], [74, 75], [74, 76], [77, 78], [77, 79], [109, 110], [109, 111], [114, 115], [114, 118], [136, 137], [136, 143], [143, 144], [143, 146]], "missing_branches": [], "functions": {"_truthy": {"executed_lines": [31, 32, 33], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 2, "num_partial_branches": 0, "covered_branches": 2, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 30, "executed_branches": [[31, 32], [31, 33]], "missing_branches": []}, "_load_metrics": {"executed_lines": [37, 38, 39, 41, 42, 43, 44, 46, 47], "summary": {"covered_lines": 9, "num_statements": 9, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 4, "num_partial_branches": 0, "covered_branches": 4, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 36, "executed_branches": [[37, 38], [37, 46], [41, 42], [41, 46]], "missing_branches": []}, "_build_history_record": {"executed_lines": [57, 58, 59, 61, 67, 68, 69, 74, 75, 76, 77, 78, 79], "summary": {"covered_lines": 13, "num_statements": 13, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 6, "num_partial_branches": 0, "covered_branches": 6, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 50, "executed_branches": [[67, 68], [67, 69], [74, 75], [74, 76], [77, 78], [77, 79]], "missing_branches": []}, "_build_classification_payload": {"executed_lines": [83, 84, 85, 86, 101], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 82, "executed_branches": [], "missing_branches": []}, "main": {"executed_lines": [105, 106, 107, 108, 109, 110, 111, 112, 114, 115, 116, 118, 119, 120, 121, 122, 124, 131, 132, 133, 134, 136, 137, 138, 141, 143, 144, 146], "summary": {"covered_lines": 28, "num_statements": 28, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 8, "num_partial_branches": 0, "covered_branches": 8, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 104, "executed_branches": [[109, 110], [109, 111], [114, 115], [114, 118], [136, 137], [136, 143], [143, 144], [143, 146]], "missing_branches": []}, "": {"executed_lines": [9, 11, 12, 13, 14, 15, 16, 17, 19, 20, 24, 25, 26, 27, 30, 36, 50, 82, 104], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 4, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [21, 22, 149, 150], "start_line": 1, "executed_branches": [], "missing_branches": []}}, "classes": {"": {"executed_lines": [9, 11, 12, 13, 14, 15, 16, 17, 19, 20, 24, 25, 26, 27, 30, 31, 32, 33, 36, 37, 38, 39, 41, 42, 43, 44, 46, 47, 50, 57, 58, 59, 61, 67, 68, 69, 74, 75, 76, 77, 78, 79, 82, 83, 84, 85, 86, 101, 104, 105, 106, 107, 108, 109, 110, 111, 112, 114, 115, 116, 118, 119, 120, 121, 122, 124, 131, 132, 133, 134, 136, 137, 138, 141, 143, 144, 146], "summary": {"covered_lines": 77, "num_statements": 77, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 4, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 20, "num_partial_branches": 0, "covered_branches": 20, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [21, 22, 149, 150], "start_line": 1, "executed_branches": [[31, 32], [31, 33], [37, 38], [37, 46], [41, 42], [41, 46], [67, 68], [67, 69], [74, 75], [74, 76], [77, 78], [77, 79], [109, 110], [109, 111], [114, 115], [114, 118], [136, 137], [136, 143], [143, 144], [143, 146]], "missing_branches": []}}}, "scripts/ci_metrics.py": {"executed_lines": [17, 19, 20, 21, 22, 23, 24, 25, 26, 27, 29, 30, 31, 32, 35, 37, 38, 39, 40, 43, 44, 45, 46, 47, 50, 51, 52, 55, 56, 57, 58, 59, 62, 63, 64, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 79, 80, 81, 82, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 96, 97, 98, 99, 101, 102, 103, 104, 105, 106, 107, 108, 110, 112, 124, 127, 128, 129, 130, 131, 132, 133, 134, 144, 145, 146, 147, 148, 149, 161, 164, 170, 171, 172, 173, 174, 175, 187, 193, 194, 196, 197, 201, 202, 203, 204, 206, 219, 222, 223, 224, 225, 226, 228, 229, 230, 231, 232, 234, 235, 236], "summary": {"covered_lines": 120, "num_statements": 120, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 8, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 26, "num_partial_branches": 0, "covered_branches": 26, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [48, 49, 60, 61, 198, 199, 239, 240], "executed_branches": [[38, 39], [38, 40], [44, 45], [44, 46], [50, 51], [50, 52], [56, 57], [56, 58], [62, 63], [62, 64], [80, 81], [80, 82], [87, 88], [87, 124], [101, 102], [101, 112], [103, 101], [103, 104], [146, 147], [146, 161], [147, 148], [147, 149], [170, 171], [170, 172], [193, 194], [193, 196]], "missing_branches": [], "functions": {"_tag_name": {"executed_lines": [37, 38, 39, 40], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 2, "num_partial_branches": 0, "covered_branches": 2, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 35, "executed_branches": [[38, 39], [38, 40]], "missing_branches": []}, "_parse_int": {"executed_lines": [44, 45, 46, 47, 50, 51, 52], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 2, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 4, "num_partial_branches": 0, "covered_branches": 4, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [48, 49], "start_line": 43, "executed_branches": [[44, 45], [44, 46], [50, 51], [50, 52]], "missing_branches": []}, "_parse_float": {"executed_lines": [56, 57, 58, 59, 62, 63, 64], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 2, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 4, "num_partial_branches": 0, "covered_branches": 4, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [60, 61], "start_line": 55, "executed_branches": [[56, 57], [56, 58], [62, 63], [62, 64]], "missing_branches": []}, "_build_nodeid": {"executed_lines": [80, 81, 82], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 2, "num_partial_branches": 0, "covered_branches": 2, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 79, "executed_branches": [[80, 81], [80, 82]], "missing_branches": []}, "_extract_testcases": {"executed_lines": [86, 87, 88, 89, 90, 91, 92, 93, 94, 96, 97, 98, 99, 101, 102, 103, 104, 105, 106, 107, 108, 110, 112, 124], "summary": {"covered_lines": 24, "num_statements": 24, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 6, "num_partial_branches": 0, "covered_branches": 6, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 85, "executed_branches": [[87, 88], [87, 124], [101, 102], [101, 112], [103, 101], [103, 104]], "missing_branches": []}, "_summarise": {"executed_lines": [128, 129, 130, 131, 132, 133, 134], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 127, "executed_branches": [], "missing_branches": []}, "_collect_failures": {"executed_lines": [145, 146, 147, 148, 149, 161], "summary": {"covered_lines": 6, "num_statements": 6, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 4, "num_partial_branches": 0, "covered_branches": 4, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 144, "executed_branches": [[146, 147], [146, 161], [147, 148], [147, 149]], "missing_branches": []}, "_collect_slow_tests": {"executed_lines": [170, 171, 172, 173, 174, 175], "summary": {"covered_lines": 6, "num_statements": 6, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 2, "num_partial_branches": 0, "covered_branches": 2, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 164, "executed_branches": [[170, 171], [170, 172]], "missing_branches": []}, "build_metrics": {"executed_lines": [193, 194, 196, 197, 201, 202, 203, 204, 206, 219], "summary": {"covered_lines": 10, "num_statements": 10, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 2, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 2, "num_partial_branches": 0, "covered_branches": 2, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [198, 199], "start_line": 187, "executed_branches": [[193, 194], [193, 196]], "missing_branches": []}, "main": {"executed_lines": [223, 224, 225, 226, 228, 229, 230, 231, 232, 234, 235, 236], "summary": {"covered_lines": 12, "num_statements": 12, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 222, "executed_branches": [], "missing_branches": []}, "": {"executed_lines": [17, 19, 20, 21, 22, 23, 24, 25, 26, 27, 29, 30, 31, 32, 35, 43, 55, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 79, 85, 127, 144, 164, 187, 222], "summary": {"covered_lines": 34, "num_statements": 34, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 2, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [239, 240], "start_line": 1, "executed_branches": [], "missing_branches": []}}, "classes": {"_TestCase": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 68, "executed_branches": [], "missing_branches": []}, "": {"executed_lines": [17, 19, 20, 21, 22, 23, 24, 25, 26, 27, 29, 30, 31, 32, 35, 37, 38, 39, 40, 43, 44, 45, 46, 47, 50, 51, 52, 55, 56, 57, 58, 59, 62, 63, 64, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 79, 80, 81, 82, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 96, 97, 98, 99, 101, 102, 103, 104, 105, 106, 107, 108, 110, 112, 124, 127, 128, 129, 130, 131, 132, 133, 134, 144, 145, 146, 147, 148, 149, 161, 164, 170, 171, 172, 173, 174, 175, 187, 193, 194, 196, 197, 201, 202, 203, 204, 206, 219, 222, 223, 224, 225, 226, 228, 229, 230, 231, 232, 234, 235, 236], "summary": {"covered_lines": 120, "num_statements": 120, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 8, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 26, "num_partial_branches": 0, "covered_branches": 26, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [48, 49, 60, 61, 198, 199, 239, 240], "start_line": 1, "executed_branches": [[38, 39], [38, 40], [44, 45], [44, 46], [50, 51], [50, 52], [56, 57], [56, 58], [62, 63], [62, 64], [80, 81], [80, 82], [87, 88], [87, 124], [101, 102], [101, 112], [103, 101], [103, 104], [146, 147], [146, 161], [147, 148], [147, 149], [170, 171], [170, 172], [193, 194], [193, 196]], "missing_branches": []}}}, "scripts/classify_test_failures.py": {"executed_lines": [19, 21, 22, 23, 24, 25, 26, 27, 28, 30, 37, 40, 41, 44, 45, 46, 47, 48, 51, 52, 53, 54, 55, 57, 58, 59, 60, 61, 62, 63, 64, 74, 75, 76, 77, 79, 80, 81, 82, 84, 85, 86, 89, 92, 93, 94, 95, 96, 97, 98, 100, 102, 106, 107, 108, 109, 110, 116, 117, 118, 119, 120, 122, 123, 124, 126, 127, 139, 140, 141, 142, 143, 145, 146, 147, 148, 150, 151, 152, 159, 161, 162, 169, 170, 173, 189], "summary": {"covered_lines": 86, "num_statements": 123, "percent_covered": 62.874251497005986, "percent_covered_display": "62.87", "missing_lines": 37, "excluded_lines": 2, "percent_statements_covered": 69.91869918699187, "percent_statements_covered_display": "69.92", "num_branches": 44, "num_partial_branches": 13, "covered_branches": 19, "missing_branches": 25, "percent_branches_covered": 43.18181818181818, "percent_branches_covered_display": "43.18"}, "missing_lines": [78, 83, 87, 88, 99, 101, 103, 111, 112, 113, 125, 128, 129, 138, 144, 149, 160, 163, 165, 167, 174, 175, 180, 186, 190, 191, 192, 193, 194, 195, 197, 198, 199, 200, 201, 202, 203], "excluded_lines": [206, 207], "executed_branches": [[77, 79], [79, 80], [79, 89], [82, 84], [85, 86], [93, 94], [95, 96], [98, 100], [100, 102], [109, 110], [122, 123], [122, 169], [124, 126], [141, 122], [141, 142], [143, 145], [148, 150], [159, 161], [161, 162]], "missing_branches": [[77, 78], [82, 83], [85, 87], [87, 79], [87, 88], [93, 103], [95, 93], [98, 99], [100, 101], [109, 111], [111, 112], [111, 113], [124, 125], [143, 144], [148, 149], [159, 160], [161, 163], [163, 165], [163, 167], [192, 193], [192, 198], [194, 195], [194, 197], [200, 201], [200, 202]], "functions": {"FailureSummary.as_dict": {"executed_lines": [58, 59, 60, 61, 62, 63, 64], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 57, "executed_branches": [], "missing_branches": []}, "_extract_markers": {"executed_lines": [75, 76, 77, 79, 80, 81, 82, 84, 85, 86, 89], "summary": {"covered_lines": 11, "num_statements": 15, "percent_covered": 64.0, "percent_covered_display": "64.00", "missing_lines": 4, "excluded_lines": 0, "percent_statements_covered": 73.33333333333333, "percent_statements_covered_display": "73.33", "num_branches": 10, "num_partial_branches": 3, "covered_branches": 5, "missing_branches": 5, "percent_branches_covered": 50.0, "percent_branches_covered_display": "50.00"}, "missing_lines": [78, 83, 87, 88], "excluded_lines": [], "start_line": 74, "executed_branches": [[77, 79], [79, 80], [79, 89], [82, 84], [85, 86]], "missing_branches": [[77, 78], [82, 83], [85, 87], [87, 79], [87, 88]]}, "_failure_message": {"executed_lines": [93, 94, 95, 96, 97, 98, 100, 102], "summary": {"covered_lines": 8, "num_statements": 11, "percent_covered": 63.1578947368421, "percent_covered_display": "63.16", "missing_lines": 3, "excluded_lines": 0, "percent_statements_covered": 72.72727272727273, "percent_statements_covered_display": "72.73", "num_branches": 8, "num_partial_branches": 4, "covered_branches": 4, "missing_branches": 4, "percent_branches_covered": 50.0, "percent_branches_covered_display": "50.00"}, "missing_lines": [99, 101, 103], "excluded_lines": [], "start_line": 92, "executed_branches": [[93, 94], [95, 96], [98, 100], [100, 102]], "missing_branches": [[93, 103], [95, 93], [98, 99], [100, 101]]}, "_test_id": {"executed_lines": [107, 108, 109, 110], "summary": {"covered_lines": 4, "num_statements": 7, "percent_covered": 45.45454545454545, "percent_covered_display": "45.45", "missing_lines": 3, "excluded_lines": 0, "percent_statements_covered": 57.142857142857146, "percent_statements_covered_display": "57.14", "num_branches": 4, "num_partial_branches": 1, "covered_branches": 1, "missing_branches": 3, "percent_branches_covered": 25.0, "percent_branches_covered_display": "25.00"}, "missing_lines": [111, 112, 113], "excluded_lines": [], "start_line": 106, "executed_branches": [[109, 110]], "missing_branches": [[109, 111], [111, 112], [111, 113]]}, "classify_reports": {"executed_lines": [117, 118, 119, 120, 122, 123, 124, 126, 127, 139, 140, 141, 142, 143, 145, 146, 147, 148, 150, 151, 152, 159, 161, 162, 169, 170], "summary": {"covered_lines": 26, "num_statements": 36, "percent_covered": 67.3076923076923, "percent_covered_display": "67.31", "missing_lines": 10, "excluded_lines": 0, "percent_statements_covered": 72.22222222222223, "percent_statements_covered_display": "72.22", "num_branches": 16, "num_partial_branches": 5, "covered_branches": 9, "missing_branches": 7, "percent_branches_covered": 56.25, "percent_branches_covered_display": "56.25"}, "missing_lines": [125, 128, 129, 138, 144, 149, 160, 163, 165, 167], "excluded_lines": [], "start_line": 116, "executed_branches": [[122, 123], [122, 169], [124, 126], [141, 122], [141, 142], [143, 145], [148, 150], [159, 161], [161, 162]], "missing_branches": [[124, 125], [143, 144], [148, 149], [159, 160], [161, 163], [163, 165], [163, 167]]}, "_parse_args": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 4, "percent_covered": 0.0, "percent_covered_display": "0.00", "missing_lines": 4, "excluded_lines": 0, "percent_statements_covered": 0.0, "percent_statements_covered_display": "0.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [174, 175, 180, 186], "excluded_lines": [], "start_line": 173, "executed_branches": [], "missing_branches": []}, "main": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 13, "percent_covered": 0.0, "percent_covered_display": "0.00", "missing_lines": 13, "excluded_lines": 0, "percent_statements_covered": 0.0, "percent_statements_covered_display": "0.00", "num_branches": 6, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 6, "percent_branches_covered": 0.0, "percent_branches_covered_display": "0.00"}, "missing_lines": [190, 191, 192, 193, 194, 195, 197, 198, 199, 200, 201, 202, 203], "excluded_lines": [], "start_line": 189, "executed_branches": [], "missing_branches": [[192, 193], [192, 198], [194, 195], [194, 197], [200, 201], [200, 202]]}, "": {"executed_lines": [19, 21, 22, 23, 24, 25, 26, 27, 28, 30, 37, 40, 41, 44, 45, 46, 47, 48, 51, 52, 53, 54, 55, 57, 74, 92, 106, 116, 173, 189], "summary": {"covered_lines": 30, "num_statements": 30, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 2, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [206, 207], "start_line": 1, "executed_branches": [], "missing_branches": []}}, "classes": {"FailureRecord": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 41, "executed_branches": [], "missing_branches": []}, "FailureSummary": {"executed_lines": [58, 59, 60, 61, 62, 63, 64], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 52, "executed_branches": [], "missing_branches": []}, "": {"executed_lines": [19, 21, 22, 23, 24, 25, 26, 27, 28, 30, 37, 40, 41, 44, 45, 46, 47, 48, 51, 52, 53, 54, 55, 57, 74, 75, 76, 77, 79, 80, 81, 82, 84, 85, 86, 89, 92, 93, 94, 95, 96, 97, 98, 100, 102, 106, 107, 108, 109, 110, 116, 117, 118, 119, 120, 122, 123, 124, 126, 127, 139, 140, 141, 142, 143, 145, 146, 147, 148, 150, 151, 152, 159, 161, 162, 169, 170, 173, 189], "summary": {"covered_lines": 79, "num_statements": 116, "percent_covered": 61.25, "percent_covered_display": "61.25", "missing_lines": 37, "excluded_lines": 2, "percent_statements_covered": 68.10344827586206, "percent_statements_covered_display": "68.10", "num_branches": 44, "num_partial_branches": 13, "covered_branches": 19, "missing_branches": 25, "percent_branches_covered": 43.18181818181818, "percent_branches_covered_display": "43.18"}, "missing_lines": [78, 83, 87, 88, 99, 101, 103, 111, 112, 113, 125, 128, 129, 138, 144, 149, 160, 163, 165, 167, 174, 175, 180, 186, 190, 191, 192, 193, 194, 195, 197, 198, 199, 200, 201, 202, 203], "excluded_lines": [206, 207], "start_line": 1, "executed_branches": [[77, 79], [79, 80], [79, 89], [82, 84], [85, 86], [93, 94], [95, 96], [98, 100], [100, 102], [109, 110], [122, 123], [122, 169], [124, 126], [141, 122], [141, 142], [143, 145], [148, 150], [159, 161], [161, 162]], "missing_branches": [[77, 78], [82, 83], [85, 87], [87, 79], [87, 88], [93, 103], [95, 93], [98, 99], [100, 101], [109, 111], [111, 112], [111, 113], [124, 125], [143, 144], [148, 149], [159, 160], [161, 163], [163, 165], [163, 167], [192, 193], [192, 198], [194, 195], [194, 197], [200, 201], [200, 202]]}}}, "scripts/coverage_history_append.py": {"executed_lines": [9, 11, 12, 13, 14, 15, 17, 20, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 33, 34, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 54, 55, 56, 57, 60, 61, 62, 65, 66, 67, 68, 69, 70, 71, 72], "summary": {"covered_lines": 51, "num_statements": 53, "percent_covered": 92.7536231884058, "percent_covered_display": "92.75", "missing_lines": 2, "excluded_lines": 2, "percent_statements_covered": 96.22641509433963, "percent_statements_covered_display": "96.23", "num_branches": 16, "num_partial_branches": 3, "covered_branches": 13, "missing_branches": 3, "percent_branches_covered": 81.25, "percent_branches_covered_display": "81.25"}, "missing_lines": [22, 63], "excluded_lines": [75, 76], "executed_branches": [[21, 23], [25, 26], [25, 34], [27, 28], [27, 29], [40, 41], [40, 43], [48, 49], [48, 51], [55, 56], [61, 62], [68, 69], [68, 70]], "missing_branches": [[21, 22], [55, 57], [61, 63]], "functions": {"load_existing": {"executed_lines": [21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 33, 34], "summary": {"covered_lines": 12, "num_statements": 13, "percent_covered": 89.47368421052632, "percent_covered_display": "89.47", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 92.3076923076923, "percent_statements_covered_display": "92.31", "num_branches": 6, "num_partial_branches": 1, "covered_branches": 5, "missing_branches": 1, "percent_branches_covered": 83.33333333333333, "percent_branches_covered_display": "83.33"}, "missing_lines": [22], "excluded_lines": [], "start_line": 20, "executed_branches": [[21, 23], [25, 26], [25, 34], [27, 28], [27, 29]], "missing_branches": [[21, 22]]}, "main": {"executed_lines": [38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 54, 55, 56, 57, 60, 65, 66, 67, 68, 69, 70, 71, 72], "summary": {"covered_lines": 28, "num_statements": 28, "percent_covered": 97.22222222222223, "percent_covered_display": "97.22", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 8, "num_partial_branches": 1, "covered_branches": 7, "missing_branches": 1, "percent_branches_covered": 87.5, "percent_branches_covered_display": "87.50"}, "missing_lines": [], "excluded_lines": [], "start_line": 37, "executed_branches": [[40, 41], [40, 43], [48, 49], [48, 51], [55, 56], [68, 69], [68, 70]], "missing_branches": [[55, 57]]}, "main.sort_key": {"executed_lines": [61, 62], "summary": {"covered_lines": 2, "num_statements": 3, "percent_covered": 60.0, "percent_covered_display": "60.00", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 66.66666666666667, "percent_statements_covered_display": "66.67", "num_branches": 2, "num_partial_branches": 1, "covered_branches": 1, "missing_branches": 1, "percent_branches_covered": 50.0, "percent_branches_covered_display": "50.00"}, "missing_lines": [63], "excluded_lines": [], "start_line": 60, "executed_branches": [[61, 62]], "missing_branches": [[61, 63]]}, "": {"executed_lines": [9, 11, 12, 13, 14, 15, 17, 20, 37], "summary": {"covered_lines": 9, "num_statements": 9, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 2, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [75, 76], "start_line": 1, "executed_branches": [], "missing_branches": []}}, "classes": {"": {"executed_lines": [9, 11, 12, 13, 14, 15, 17, 20, 21, 23, 24, 25, 26, 27, 28, 29, 30, 31, 33, 34, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 54, 55, 56, 57, 60, 61, 62, 65, 66, 67, 68, 69, 70, 71, 72], "summary": {"covered_lines": 51, "num_statements": 53, "percent_covered": 92.7536231884058, "percent_covered_display": "92.75", "missing_lines": 2, "excluded_lines": 2, "percent_statements_covered": 96.22641509433963, "percent_statements_covered_display": "96.23", "num_branches": 16, "num_partial_branches": 3, "covered_branches": 13, "missing_branches": 3, "percent_branches_covered": 81.25, "percent_branches_covered_display": "81.25"}, "missing_lines": [22, 63], "excluded_lines": [75, 76], "start_line": 1, "executed_branches": [[21, 23], [25, 26], [25, 34], [27, 28], [27, 29], [40, 41], [40, 43], [48, 49], [48, 51], [55, 56], [61, 62], [68, 69], [68, 70]], "missing_branches": [[21, 22], [55, 57], [61, 63]]}}}, "scripts/fix_cosmetic_aggregate.py": {"executed_lines": [3, 5, 7, 8, 11, 12, 13, 14, 15, 16, 19, 20, 21, 24, 25, 26, 27, 29, 30], "summary": {"covered_lines": 19, "num_statements": 20, "percent_covered": 92.3076923076923, "percent_covered_display": "92.31", "missing_lines": 1, "excluded_lines": 2, "percent_statements_covered": 95.0, "percent_statements_covered_display": "95.00", "num_branches": 6, "num_partial_branches": 1, "covered_branches": 5, "missing_branches": 1, "percent_branches_covered": 83.33333333333333, "percent_branches_covered_display": "83.33"}, "missing_lines": [22], "excluded_lines": [33, 34], "executed_branches": [[12, 13], [12, 14], [21, 24], [26, 27], [26, 29]], "missing_branches": [[21, 22]], "functions": {"_rewrite": {"executed_lines": [12, 13, 14, 15, 16], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 2, "num_partial_branches": 0, "covered_branches": 2, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 11, "executed_branches": [[12, 13], [12, 14]], "missing_branches": []}, "main": {"executed_lines": [20, 21, 24, 25, 26, 27, 29, 30], "summary": {"covered_lines": 8, "num_statements": 9, "percent_covered": 84.61538461538461, "percent_covered_display": "84.62", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 88.88888888888889, "percent_statements_covered_display": "88.89", "num_branches": 4, "num_partial_branches": 1, "covered_branches": 3, "missing_branches": 1, "percent_branches_covered": 75.0, "percent_branches_covered_display": "75.00"}, "missing_lines": [22], "excluded_lines": [], "start_line": 19, "executed_branches": [[21, 24], [26, 27], [26, 29]], "missing_branches": [[21, 22]]}, "": {"executed_lines": [3, 5, 7, 8, 11, 19], "summary": {"covered_lines": 6, "num_statements": 6, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 2, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [33, 34], "start_line": 1, "executed_branches": [], "missing_branches": []}}, "classes": {"": {"executed_lines": [3, 5, 7, 8, 11, 12, 13, 14, 15, 16, 19, 20, 21, 24, 25, 26, 27, 29, 30], "summary": {"covered_lines": 19, "num_statements": 20, "percent_covered": 92.3076923076923, "percent_covered_display": "92.31", "missing_lines": 1, "excluded_lines": 2, "percent_statements_covered": 95.0, "percent_statements_covered_display": "95.00", "num_branches": 6, "num_partial_branches": 1, "covered_branches": 5, "missing_branches": 1, "percent_branches_covered": 83.33333333333333, "percent_branches_covered_display": "83.33"}, "missing_lines": [22], "excluded_lines": [33, 34], "start_line": 1, "executed_branches": [[12, 13], [12, 14], [21, 24], [26, 27], [26, 29]], "missing_branches": [[21, 22]]}}}, "scripts/fix_numpy_asserts.py": {"executed_lines": [3, 5, 6, 8, 9, 10, 13, 14, 15, 16, 17, 18, 19, 20, 23, 24, 25, 26, 27, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 41, 42, 43, 46, 47, 48, 49, 50], "summary": {"covered_lines": 38, "num_statements": 38, "percent_covered": 98.14814814814815, "percent_covered_display": "98.15", "missing_lines": 0, "excluded_lines": 2, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 16, "num_partial_branches": 1, "covered_branches": 15, "missing_branches": 1, "percent_branches_covered": 93.75, "percent_branches_covered_display": "93.75"}, "missing_lines": [], "excluded_lines": [53, 54], "executed_branches": [[16, 17], [16, 20], [18, 16], [18, 19], [29, 30], [29, 41], [31, 32], [31, 39], [33, 34], [35, 36], [35, 39], [41, 42], [41, 43], [48, 49], [48, 50]], "missing_branches": [[33, 39]], "functions": {"_tracked_arrays": {"executed_lines": [14, 15, 16, 17, 18, 19, 20], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 4, "num_partial_branches": 0, "covered_branches": 4, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 13, "executed_branches": [[16, 17], [16, 20], [18, 16], [18, 19]], "missing_branches": []}, "process_file": {"executed_lines": [24, 25, 26, 27, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 41, 42, 43], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 96.42857142857143, "percent_covered_display": "96.43", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 10, "num_partial_branches": 1, "covered_branches": 9, "missing_branches": 1, "percent_branches_covered": 90.0, "percent_branches_covered_display": "90.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 23, "executed_branches": [[29, 30], [29, 41], [31, 32], [31, 39], [33, 34], [35, 36], [35, 39], [41, 42], [41, 43]], "missing_branches": [[33, 39]]}, "main": {"executed_lines": [47, 48, 49, 50], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 2, "num_partial_branches": 0, "covered_branches": 2, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 46, "executed_branches": [[48, 49], [48, 50]], "missing_branches": []}, "": {"executed_lines": [3, 5, 6, 8, 9, 10, 13, 23, 46], "summary": {"covered_lines": 9, "num_statements": 9, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 2, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [53, 54], "start_line": 1, "executed_branches": [], "missing_branches": []}}, "classes": {"": {"executed_lines": [3, 5, 6, 8, 9, 10, 13, 14, 15, 16, 17, 18, 19, 20, 23, 24, 25, 26, 27, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 41, 42, 43, 46, 47, 48, 49, 50], "summary": {"covered_lines": 38, "num_statements": 38, "percent_covered": 98.14814814814815, "percent_covered_display": "98.15", "missing_lines": 0, "excluded_lines": 2, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 16, "num_partial_branches": 1, "covered_branches": 15, "missing_branches": 1, "percent_branches_covered": 93.75, "percent_branches_covered_display": "93.75"}, "missing_lines": [], "excluded_lines": [53, 54], "start_line": 1, "executed_branches": [[16, 17], [16, 20], [18, 16], [18, 19], [29, 30], [29, 41], [31, 32], [31, 39], [33, 34], [35, 36], [35, 39], [41, 42], [41, 43], [48, 49], [48, 50]], "missing_branches": [[33, 39]]}}}, "scripts/generate_residual_trend.py": {"executed_lines": [11, 13, 14, 15, 17, 18, 19, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 50, 51, 52, 53, 54, 56, 57, 60, 61, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 79, 83, 91, 92, 93, 96], "summary": {"covered_lines": 60, "num_statements": 61, "percent_covered": 96.55172413793103, "percent_covered_display": "96.55", "missing_lines": 1, "excluded_lines": 2, "percent_statements_covered": 98.36065573770492, "percent_statements_covered_display": "98.36", "num_branches": 26, "num_partial_branches": 2, "covered_branches": 24, "missing_branches": 2, "percent_branches_covered": 92.3076923076923, "percent_branches_covered_display": "92.31"}, "missing_lines": [59], "excluded_lines": [99, 100], "executed_branches": [[23, 24], [23, 25], [25, 26], [25, 27], [27, 28], [27, 32], [36, 37], [36, 38], [40, 41], [40, 42], [44, 45], [44, 47], [56, 57], [65, 66], [65, 71], [67, 68], [68, 65], [68, 69], [69, 68], [69, 70], [73, 74], [73, 79], [76, 73], [76, 77]], "missing_branches": [[56, 59], [67, 65]], "functions": {"_coerce_int": {"executed_lines": [23, 24, 25, 26, 27, 28, 29, 30, 31, 32], "summary": {"covered_lines": 10, "num_statements": 10, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 6, "num_partial_branches": 0, "covered_branches": 6, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 22, "executed_branches": [[23, 24], [23, 25], [25, 26], [25, 27], [27, 28], [27, 32]], "missing_branches": []}, "sparkline": {"executed_lines": [36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47], "summary": {"covered_lines": 12, "num_statements": 12, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 6, "num_partial_branches": 0, "covered_branches": 6, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 35, "executed_branches": [[36, 37], [36, 38], [40, 41], [40, 42], [44, 45], [44, 47]], "missing_branches": []}, "main": {"executed_lines": [51, 52, 53, 54, 56, 57, 60, 61, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 79, 83, 91, 92, 93, 96], "summary": {"covered_lines": 28, "num_statements": 29, "percent_covered": 93.02325581395348, "percent_covered_display": "93.02", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 96.55172413793103, "percent_statements_covered_display": "96.55", "num_branches": 14, "num_partial_branches": 2, "covered_branches": 12, "missing_branches": 2, "percent_branches_covered": 85.71428571428571, "percent_branches_covered_display": "85.71"}, "missing_lines": [59], "excluded_lines": [], "start_line": 50, "executed_branches": [[56, 57], [65, 66], [65, 71], [67, 68], [68, 65], [68, 69], [69, 68], [69, 70], [73, 74], [73, 79], [76, 73], [76, 77]], "missing_branches": [[56, 59], [67, 65]]}, "": {"executed_lines": [11, 13, 14, 15, 17, 18, 19, 22, 35, 50], "summary": {"covered_lines": 10, "num_statements": 10, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 2, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [99, 100], "start_line": 1, "executed_branches": [], "missing_branches": []}}, "classes": {"": {"executed_lines": [11, 13, 14, 15, 17, 18, 19, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 50, 51, 52, 53, 54, 56, 57, 60, 61, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 79, 83, 91, 92, 93, 96], "summary": {"covered_lines": 60, "num_statements": 61, "percent_covered": 96.55172413793103, "percent_covered_display": "96.55", "missing_lines": 1, "excluded_lines": 2, "percent_statements_covered": 98.36065573770492, "percent_statements_covered_display": "98.36", "num_branches": 26, "num_partial_branches": 2, "covered_branches": 24, "missing_branches": 2, "percent_branches_covered": 92.3076923076923, "percent_branches_covered_display": "92.31"}, "missing_lines": [59], "excluded_lines": [99, 100], "start_line": 1, "executed_branches": [[23, 24], [23, 25], [25, 26], [25, 27], [27, 28], [27, 32], [36, 37], [36, 38], [40, 41], [40, 42], [44, 45], [44, 47], [56, 57], [65, 66], [65, 71], [67, 68], [68, 65], [68, 69], [69, 68], [69, 70], [73, 74], [73, 79], [76, 73], [76, 77]], "missing_branches": [[56, 59], [67, 65]]}}}, "scripts/keepalive_metrics_collector.py": {"executed_lines": [4, 6, 7, 8, 9, 10, 11, 12, 13, 15, 27, 28, 31, 33, 34, 37, 38, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 56, 58, 59, 60, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 77, 80, 81, 84, 85, 86, 87, 88, 91, 92, 102, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 117, 118, 119, 120, 121, 124, 125, 126, 128, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 146, 147, 148, 150, 151, 152, 154, 163, 164, 165, 166, 167, 168, 169, 170, 171, 173], "summary": {"covered_lines": 108, "num_statements": 108, "percent_covered": 99.29577464788733, "percent_covered_display": "99.30", "missing_lines": 0, "excluded_lines": 2, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 34, "num_partial_branches": 1, "covered_branches": 33, "missing_branches": 1, "percent_branches_covered": 97.05882352941177, "percent_branches_covered_display": "97.06"}, "missing_lines": [], "excluded_lines": [176, 177], "executed_branches": [[42, 43], [42, 44], [45, 46], [45, 47], [51, 52], [51, 53], [59, 60], [59, 62], [62, 63], [62, 64], [64, 65], [64, 66], [66, 67], [66, 68], [68, 69], [68, 70], [70, 71], [70, 72], [72, 73], [72, 74], [74, 75], [74, 77], [110, 111], [110, 112], [112, 113], [125, 126], [125, 128], [151, 152], [151, 154], [163, 164], [163, 165], [169, 170], [169, 171]], "missing_branches": [[112, 114]], "functions": {"ValidationError.__str__": {"executed_lines": [34], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 33, "executed_branches": [], "missing_branches": []}, "_is_int": {"executed_lines": [38], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 37, "executed_branches": [], "missing_branches": []}, "_parse_timestamp": {"executed_lines": [42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53], "summary": {"covered_lines": 12, "num_statements": 12, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 6, "num_partial_branches": 0, "covered_branches": 6, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 41, "executed_branches": [[42, 43], [42, 44], [45, 46], [45, 47], [51, 52], [51, 53]], "missing_branches": []}, "validate_record": {"executed_lines": [58, 59, 60, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 77], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 16, "num_partial_branches": 0, "covered_branches": 16, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 56, "executed_branches": [[59, 60], [59, 62], [62, 63], [62, 64], [64, 65], [64, 66], [66, 67], [66, 68], [68, 69], [68, 70], [70, 71], [70, 72], [72, 73], [72, 74], [74, 75], [74, 77]], "missing_branches": []}, "_utc_now_iso": {"executed_lines": [81], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 80, "executed_branches": [], "missing_branches": []}, "_coerce_int": {"executed_lines": [85, 86, 87, 88], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 84, "executed_branches": [], "missing_branches": []}, "build_record_from_args": {"executed_lines": [92, 102], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 91, "executed_branches": [], "missing_branches": []}, "load_record_from_json": {"executed_lines": [106, 107, 108, 109, 110, 111, 112, 113, 114], "summary": {"covered_lines": 9, "num_statements": 9, "percent_covered": 92.3076923076923, "percent_covered_display": "92.31", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 4, "num_partial_branches": 1, "covered_branches": 3, "missing_branches": 1, "percent_branches_covered": 75.0, "percent_branches_covered_display": "75.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 105, "executed_branches": [[110, 111], [110, 112], [112, 113]], "missing_branches": [[112, 114]]}, "append_record": {"executed_lines": [118, 119, 120, 121], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 117, "executed_branches": [], "missing_branches": []}, "_iter_errors": {"executed_lines": [125, 126, 128], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 2, "num_partial_branches": 0, "covered_branches": 2, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 124, "executed_branches": [[125, 126], [125, 128]], "missing_branches": []}, "build_parser": {"executed_lines": [132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143], "summary": {"covered_lines": 12, "num_statements": 12, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 131, "executed_branches": [], "missing_branches": []}, "main": {"executed_lines": [147, 148, 150, 151, 152, 154, 163, 164, 165, 166, 167, 168, 169, 170, 171, 173], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 6, "num_partial_branches": 0, "covered_branches": 6, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 146, "executed_branches": [[151, 152], [151, 154], [163, 164], [163, 165], [169, 170], [169, 171]], "missing_branches": []}, "": {"executed_lines": [4, 6, 7, 8, 9, 10, 11, 12, 13, 15, 27, 28, 31, 33, 37, 41, 56, 80, 84, 91, 105, 117, 124, 131, 146], "summary": {"covered_lines": 25, "num_statements": 25, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 2, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [176, 177], "start_line": 1, "executed_branches": [], "missing_branches": []}}, "classes": {"ValidationError": {"executed_lines": [34], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 28, "executed_branches": [], "missing_branches": []}, "": {"executed_lines": [4, 6, 7, 8, 9, 10, 11, 12, 13, 15, 27, 28, 31, 33, 37, 38, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 56, 58, 59, 60, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 77, 80, 81, 84, 85, 86, 87, 88, 91, 92, 102, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 117, 118, 119, 120, 121, 124, 125, 126, 128, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 146, 147, 148, 150, 151, 152, 154, 163, 164, 165, 166, 167, 168, 169, 170, 171, 173], "summary": {"covered_lines": 107, "num_statements": 107, "percent_covered": 99.29078014184397, "percent_covered_display": "99.29", "missing_lines": 0, "excluded_lines": 2, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 34, "num_partial_branches": 1, "covered_branches": 33, "missing_branches": 1, "percent_branches_covered": 97.05882352941177, "percent_branches_covered_display": "97.06"}, "missing_lines": [], "excluded_lines": [176, 177], "start_line": 1, "executed_branches": [[42, 43], [42, 44], [45, 46], [45, 47], [51, 52], [51, 53], [59, 60], [59, 62], [62, 63], [62, 64], [64, 65], [64, 66], [66, 67], [66, 68], [68, 69], [68, 70], [70, 71], [70, 72], [72, 73], [72, 74], [74, 75], [74, 77], [110, 111], [110, 112], [112, 113], [125, 126], [125, 128], [151, 152], [151, 154], [163, 164], [163, 165], [169, 170], [169, 171]], "missing_branches": [[112, 114]]}}}, "scripts/keepalive_metrics_dashboard.py": {"executed_lines": [4, 6, 7, 8, 9, 10, 11, 12, 15, 16, 17, 18, 19, 20, 21, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 43, 44, 47, 48, 49, 50, 53, 54, 55, 56, 57, 60, 61, 62, 63, 64, 65, 67, 68, 69, 70, 71, 72, 73, 74, 75, 77, 78, 79, 81, 82, 83, 85, 86, 87, 89, 98, 99, 100, 101, 103, 116, 119, 120, 123, 124, 127, 130, 131, 132, 134, 135, 136, 137, 139, 140, 142, 143, 144, 145, 146], "summary": {"covered_lines": 94, "num_statements": 94, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 2, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 26, "num_partial_branches": 0, "covered_branches": 26, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [149, 150], "executed_branches": [[16, 17], [16, 18], [31, 32], [31, 44], [33, 34], [33, 35], [40, 41], [40, 43], [48, 49], [48, 50], [54, 55], [54, 56], [67, 68], [67, 85], [71, 72], [71, 73], [73, 74], [73, 75], [78, 79], [78, 81], [82, 67], [82, 83], [86, 87], [86, 89], [135, 136], [135, 139]], "missing_branches": [], "functions": {"_safe_int": {"executed_lines": [16, 17, 18, 19, 20, 21], "summary": {"covered_lines": 6, "num_statements": 6, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 2, "num_partial_branches": 0, "covered_branches": 2, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 15, "executed_branches": [[16, 17], [16, 18]], "missing_branches": []}, "_read_ndjson": {"executed_lines": [25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 43, 44], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 6, "num_partial_branches": 0, "covered_branches": 6, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 24, "executed_branches": [[31, 32], [31, 44], [33, 34], [33, 35], [40, 41], [40, 43]], "missing_branches": []}, "_format_counter": {"executed_lines": [48, 49, 50], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 2, "num_partial_branches": 0, "covered_branches": 2, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 47, "executed_branches": [[48, 49], [48, 50]], "missing_branches": []}, "_format_rate": {"executed_lines": [54, 55, 56, 57], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 2, "num_partial_branches": 0, "covered_branches": 2, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 53, "executed_branches": [[54, 55], [54, 56]], "missing_branches": []}, "_summarise": {"executed_lines": [61, 62, 63, 64, 65, 67, 68, 69, 70, 71, 72, 73, 74, 75, 77, 78, 79, 81, 82, 83, 85, 86, 87, 89], "summary": {"covered_lines": 24, "num_statements": 24, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 12, "num_partial_branches": 0, "covered_branches": 12, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 60, "executed_branches": [[67, 68], [67, 85], [71, 72], [71, 73], [73, 74], [73, 75], [78, 79], [78, 81], [82, 67], [82, 83], [86, 87], [86, 89]], "missing_branches": []}, "build_dashboard": {"executed_lines": [99, 100, 101, 103, 116], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 98, "executed_branches": [], "missing_branches": []}, "_build_parser": {"executed_lines": [120, 123, 124, 127], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 119, "executed_branches": [], "missing_branches": []}, "main": {"executed_lines": [131, 132, 134, 135, 136, 137, 139, 140, 142, 143, 144, 145, 146], "summary": {"covered_lines": 13, "num_statements": 13, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 2, "num_partial_branches": 0, "covered_branches": 2, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 130, "executed_branches": [[135, 136], [135, 139]], "missing_branches": []}, "": {"executed_lines": [4, 6, 7, 8, 9, 10, 11, 12, 15, 24, 47, 53, 60, 98, 119, 130], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 2, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [149, 150], "start_line": 1, "executed_branches": [], "missing_branches": []}}, "classes": {"": {"executed_lines": [4, 6, 7, 8, 9, 10, 11, 12, 15, 16, 17, 18, 19, 20, 21, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 43, 44, 47, 48, 49, 50, 53, 54, 55, 56, 57, 60, 61, 62, 63, 64, 65, 67, 68, 69, 70, 71, 72, 73, 74, 75, 77, 78, 79, 81, 82, 83, 85, 86, 87, 89, 98, 99, 100, 101, 103, 116, 119, 120, 123, 124, 127, 130, 131, 132, 134, 135, 136, 137, 139, 140, 142, 143, 144, 145, 146], "summary": {"covered_lines": 94, "num_statements": 94, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 2, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 26, "num_partial_branches": 0, "covered_branches": 26, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [149, 150], "start_line": 1, "executed_branches": [[16, 17], [16, 18], [31, 32], [31, 44], [33, 34], [33, 35], [40, 41], [40, 43], [48, 49], [48, 50], [54, 55], [54, 56], [67, 68], [67, 85], [71, 72], [71, 73], [73, 74], [73, 75], [78, 79], [78, 81], [82, 67], [82, 83], [86, 87], [86, 89], [135, 136], [135, 139]], "missing_branches": []}}}, "scripts/ledger_migrate_base.py": {"executed_lines": [1, 3, 4, 5, 6, 7, 8, 10, 13, 14, 15, 18, 22, 23, 24, 25, 26, 27, 30, 46, 47, 48, 49, 50, 51, 55, 56, 57, 58, 60, 61, 62, 63, 64, 65, 68, 69, 70, 71, 72, 73, 74, 75, 83, 84, 85, 86, 87, 88, 91, 92, 93, 94, 97, 98, 104, 105, 106, 107, 108, 109, 110, 113, 114, 115, 116, 118, 119, 121, 122, 123, 131, 134, 135, 136, 137, 138, 142, 143, 144, 146, 149, 150, 151, 156, 161, 163, 164, 165, 166, 167, 168, 170, 171, 172, 173, 175, 176, 177, 178, 179, 180, 181, 182, 183, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 196, 197, 198, 199, 200, 203], "summary": {"covered_lines": 121, "num_statements": 134, "percent_covered": 85.48387096774194, "percent_covered_display": "85.48", "missing_lines": 13, "excluded_lines": 4, "percent_statements_covered": 90.29850746268657, "percent_statements_covered_display": "90.30", "num_branches": 52, "num_partial_branches": 8, "covered_branches": 38, "missing_branches": 14, "percent_branches_covered": 73.07692307692308, "percent_branches_covered_display": "73.08"}, "missing_lines": [31, 32, 43, 76, 77, 78, 79, 99, 100, 101, 139, 145, 202], "excluded_lines": [38, 42, 206, 207], "executed_branches": [[47, 48], [47, 55], [49, 50], [49, 51], [60, 61], [62, 63], [64, 65], [72, 73], [72, 83], [74, 75], [87, 88], [87, 91], [97, 98], [107, 108], [107, 109], [115, 116], [115, 118], [118, 119], [118, 121], [144, 146], [171, 172], [171, 175], [177, 178], [177, 185], [179, 180], [179, 182], [180, 177], [180, 181], [182, 183], [185, 186], [185, 196], [186, 187], [186, 193], [188, 189], [188, 191], [196, 197], [198, 199], [198, 203]], "missing_branches": [[60, 68], [62, 60], [64, 60], [74, 76], [76, 77], [76, 78], [78, 79], [78, 83], [97, 99], [99, 100], [99, 101], [144, 145], [182, 177], [196, 202]], "functions": {"LedgerDumper.increase_indent": {"executed_lines": [15], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 14, "executed_branches": [], "missing_branches": []}, "_run_git": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 3, "percent_covered": 0.0, "percent_covered_display": "0.00", "missing_lines": 3, "excluded_lines": 2, "percent_statements_covered": 0.0, "percent_statements_covered_display": "0.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [31, 32, 43], "excluded_lines": [38, 42], "start_line": 30, "executed_branches": [], "missing_branches": []}, "detect_default_branch": {"executed_lines": [47, 48, 49, 50, 51, 55, 56, 57, 58, 60, 61, 62, 63, 64, 65, 68, 69, 70, 71, 72, 73, 74, 75, 83, 84, 85, 86, 87, 88, 91, 92, 93, 94, 97, 98], "summary": {"covered_lines": 35, "num_statements": 42, "percent_covered": 72.72727272727273, "percent_covered_display": "72.73", "missing_lines": 7, "excluded_lines": 0, "percent_statements_covered": 83.33333333333333, "percent_statements_covered_display": "83.33", "num_branches": 24, "num_partial_branches": 5, "covered_branches": 13, "missing_branches": 11, "percent_branches_covered": 54.166666666666664, "percent_branches_covered_display": "54.17"}, "missing_lines": [76, 77, 78, 79, 99, 100, 101], "excluded_lines": [], "start_line": 46, "executed_branches": [[47, 48], [47, 55], [49, 50], [49, 51], [60, 61], [62, 63], [64, 65], [72, 73], [72, 83], [74, 75], [87, 88], [87, 91], [97, 98]], "missing_branches": [[60, 68], [62, 60], [64, 60], [74, 76], [76, 77], [76, 78], [78, 79], [78, 83], [97, 99], [99, 100], [99, 101]]}, "load_ledger": {"executed_lines": [105, 106, 107, 108, 109, 110], "summary": {"covered_lines": 6, "num_statements": 6, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 2, "num_partial_branches": 0, "covered_branches": 2, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 104, "executed_branches": [[107, 108], [107, 109]], "missing_branches": []}, "migrate_ledger": {"executed_lines": [114, 115, 116, 118, 119, 121, 122, 123, 131], "summary": {"covered_lines": 9, "num_statements": 9, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 4, "num_partial_branches": 0, "covered_branches": 4, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 113, "executed_branches": [[115, 116], [115, 118], [118, 119], [118, 121]], "missing_branches": []}, "find_repo_root": {"executed_lines": [135, 136, 137, 138], "summary": {"covered_lines": 4, "num_statements": 5, "percent_covered": 80.0, "percent_covered_display": "80.00", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 80.0, "percent_statements_covered_display": "80.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [139], "excluded_lines": [], "start_line": 134, "executed_branches": [], "missing_branches": []}, "discover_ledgers": {"executed_lines": [143, 144, 146], "summary": {"covered_lines": 3, "num_statements": 4, "percent_covered": 66.66666666666667, "percent_covered_display": "66.67", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 75.0, "percent_statements_covered_display": "75.00", "num_branches": 2, "num_partial_branches": 1, "covered_branches": 1, "missing_branches": 1, "percent_branches_covered": 50.0, "percent_branches_covered_display": "50.00"}, "missing_lines": [145], "excluded_lines": [], "start_line": 142, "executed_branches": [[144, 146]], "missing_branches": [[144, 145]]}, "main": {"executed_lines": [150, 151, 156, 161, 163, 164, 165, 166, 167, 168, 170, 171, 172, 173, 175, 176, 177, 178, 179, 180, 181, 182, 183, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 196, 197, 198, 199, 200, 203], "summary": {"covered_lines": 39, "num_statements": 40, "percent_covered": 95.0, "percent_covered_display": "95.00", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 97.5, "percent_statements_covered_display": "97.50", "num_branches": 20, "num_partial_branches": 2, "covered_branches": 18, "missing_branches": 2, "percent_branches_covered": 90.0, "percent_branches_covered_display": "90.00"}, "missing_lines": [202], "excluded_lines": [], "start_line": 149, "executed_branches": [[171, 172], [171, 175], [177, 178], [177, 185], [179, 180], [179, 182], [180, 177], [180, 181], [182, 183], [185, 186], [185, 196], [186, 187], [186, 193], [188, 189], [188, 191], [196, 197], [198, 199], [198, 203]], "missing_branches": [[182, 177], [196, 202]]}, "": {"executed_lines": [1, 3, 4, 5, 6, 7, 8, 10, 13, 14, 18, 22, 23, 24, 25, 26, 27, 30, 46, 104, 113, 134, 142, 149], "summary": {"covered_lines": 24, "num_statements": 24, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 2, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [206, 207], "start_line": 1, "executed_branches": [], "missing_branches": []}}, "classes": {"LedgerDumper": {"executed_lines": [15], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 13, "executed_branches": [], "missing_branches": []}, "MigrationError": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 18, "executed_branches": [], "missing_branches": []}, "LedgerResult": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 23, "executed_branches": [], "missing_branches": []}, "": {"executed_lines": [1, 3, 4, 5, 6, 7, 8, 10, 13, 14, 18, 22, 23, 24, 25, 26, 27, 30, 46, 47, 48, 49, 50, 51, 55, 56, 57, 58, 60, 61, 62, 63, 64, 65, 68, 69, 70, 71, 72, 73, 74, 75, 83, 84, 85, 86, 87, 88, 91, 92, 93, 94, 97, 98, 104, 105, 106, 107, 108, 109, 110, 113, 114, 115, 116, 118, 119, 121, 122, 123, 131, 134, 135, 136, 137, 138, 142, 143, 144, 146, 149, 150, 151, 156, 161, 163, 164, 165, 166, 167, 168, 170, 171, 172, 173, 175, 176, 177, 178, 179, 180, 181, 182, 183, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 196, 197, 198, 199, 200, 203], "summary": {"covered_lines": 120, "num_statements": 133, "percent_covered": 85.4054054054054, "percent_covered_display": "85.41", "missing_lines": 13, "excluded_lines": 4, "percent_statements_covered": 90.22556390977444, "percent_statements_covered_display": "90.23", "num_branches": 52, "num_partial_branches": 8, "covered_branches": 38, "missing_branches": 14, "percent_branches_covered": 73.07692307692308, "percent_branches_covered_display": "73.08"}, "missing_lines": [31, 32, 43, 76, 77, 78, 79, 99, 100, 101, 139, 145, 202], "excluded_lines": [38, 42, 206, 207], "start_line": 1, "executed_branches": [[47, 48], [47, 55], [49, 50], [49, 51], [60, 61], [62, 63], [64, 65], [72, 73], [72, 83], [74, 75], [87, 88], [87, 91], [97, 98], [107, 108], [107, 109], [115, 116], [115, 118], [118, 119], [118, 121], [144, 146], [171, 172], [171, 175], [177, 178], [177, 185], [179, 180], [179, 182], [180, 177], [180, 181], [182, 183], [185, 186], [185, 196], [186, 187], [186, 193], [188, 189], [188, 191], [196, 197], [198, 199], [198, 203]], "missing_branches": [[60, 68], [62, 60], [64, 60], [74, 76], [76, 77], [76, 78], [78, 79], [78, 83], [97, 99], [99, 100], [99, 101], [144, 145], [182, 177], [196, 202]]}}}, "scripts/ledger_validate.py": {"executed_lines": [9, 11, 12, 13, 14, 15, 16, 17, 18, 19, 21, 23, 24, 25, 26, 28, 30, 31, 32, 35, 38, 39, 40, 43, 44, 45, 46, 47, 48, 51, 57, 58, 59, 60, 61, 62, 63, 64, 67, 68, 69, 70, 71, 74, 141, 142, 143, 147, 148, 154, 161, 178, 181, 182, 184, 185, 187, 190, 192, 193, 196, 197, 200, 201, 204, 207, 208, 210, 211, 214, 217, 218, 220, 223, 224, 230, 235, 236, 240, 241, 246, 248, 249, 256, 261, 265, 268, 269, 270, 271, 273, 276, 277, 278, 279, 280, 282, 283, 284, 286, 287, 288, 290, 291, 292, 294, 295, 296, 298, 299, 300, 301, 303, 304, 305, 306, 309, 310, 311, 313, 314, 316, 319, 320, 322, 323, 324, 326, 329, 330, 331, 337, 342, 344, 345, 346, 347, 348, 349, 351, 352, 363], "summary": {"covered_lines": 142, "num_statements": 205, "percent_covered": 65.31986531986531, "percent_covered_display": "65.32", "missing_lines": 63, "excluded_lines": 2, "percent_statements_covered": 69.26829268292683, "percent_statements_covered_display": "69.27", "num_branches": 92, "num_partial_branches": 22, "covered_branches": 52, "missing_branches": 40, "percent_branches_covered": 56.52173913043478, "percent_branches_covered_display": "56.52"}, "missing_lines": [52, 53, 54, 65, 66, 77, 105, 106, 107, 112, 113, 115, 116, 121, 122, 134, 135, 136, 138, 149, 156, 157, 158, 162, 163, 167, 168, 169, 174, 175, 186, 188, 194, 198, 202, 203, 205, 212, 213, 215, 219, 221, 225, 226, 231, 237, 238, 250, 251, 254, 266, 307, 308, 321, 325, 354, 355, 356, 357, 358, 359, 360, 361], "excluded_lines": [366, 367], "executed_branches": [[25, 26], [59, 60], [59, 61], [61, 62], [61, 64], [64, 67], [148, 154], [185, 187], [187, 190], [193, 196], [197, 200], [201, 204], [204, 207], [211, 214], [214, 217], [217, 218], [217, 265], [218, 220], [220, 223], [230, 235], [240, 241], [256, 261], [265, 268], [268, 269], [268, 270], [270, 271], [270, 273], [279, 280], [279, 282], [283, 284], [283, 286], [287, 288], [287, 290], [291, 292], [291, 294], [295, 296], [295, 298], [299, 300], [299, 303], [305, 306], [305, 313], [306, 309], [310, 305], [310, 311], [313, 314], [313, 316], [320, 322], [324, 326], [346, 347], [346, 351], [348, 349], [351, 352]], "missing_branches": [[25, 28], [52, 53], [52, 54], [64, 65], [105, 106], [105, 138], [115, 116], [115, 121], [148, 149], [168, 169], [168, 174], [185, 186], [187, 188], [193, 194], [197, 198], [201, 202], [204, 205], [211, 212], [214, 215], [218, 219], [220, 221], [230, 231], [240, 268], [256, 268], [265, 266], [306, 307], [320, 321], [324, 325], [348, 346], [351, 354], [354, 355], [354, 356], [356, 357], [356, 359], [357, 356], [357, 358], [359, 360], [359, 363], [360, 361], [360, 363]], "functions": {"LedgerError.__init__": {"executed_lines": [39, 40], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 38, "executed_branches": [], "missing_branches": []}, "_load_yaml": {"executed_lines": [44, 45, 46, 47, 48], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 43, "executed_branches": [], "missing_branches": []}, "_ensure_type": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 3, "percent_covered": 0.0, "percent_covered_display": "0.00", "missing_lines": 3, "excluded_lines": 0, "percent_statements_covered": 0.0, "percent_statements_covered_display": "0.00", "num_branches": 2, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 2, "percent_branches_covered": 0.0, "percent_branches_covered_display": "0.00"}, "missing_lines": [52, 53, 54], "excluded_lines": [], "start_line": 51, "executed_branches": [], "missing_branches": [[52, 53], [52, 54]]}, "_validate_timestamp": {"executed_lines": [58, 59, 60, 61, 62, 63, 64, 67, 68, 69, 70, 71], "summary": {"covered_lines": 12, "num_statements": 14, "percent_covered": 85.0, "percent_covered_display": "85.00", "missing_lines": 2, "excluded_lines": 0, "percent_statements_covered": 85.71428571428571, "percent_statements_covered_display": "85.71", "num_branches": 6, "num_partial_branches": 1, "covered_branches": 5, "missing_branches": 1, "percent_branches_covered": 83.33333333333333, "percent_branches_covered_display": "83.33"}, "missing_lines": [65, 66], "excluded_lines": [], "start_line": 57, "executed_branches": [[59, 60], [59, 61], [61, 62], [61, 64], [64, 67]], "missing_branches": [[64, 65]]}, "_fetch_commit": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 14, "percent_covered": 0.0, "percent_covered_display": "0.00", "missing_lines": 14, "excluded_lines": 0, "percent_statements_covered": 0.0, "percent_statements_covered_display": "0.00", "num_branches": 4, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 4, "percent_branches_covered": 0.0, "percent_branches_covered_display": "0.00"}, "missing_lines": [77, 105, 106, 107, 112, 113, 115, 116, 121, 122, 134, 135, 136, 138], "excluded_lines": [], "start_line": 74, "executed_branches": [], "missing_branches": [[105, 106], [105, 138], [115, 116], [115, 121]]}, "_commit_files": {"executed_lines": [142, 143, 147, 148, 154], "summary": {"covered_lines": 5, "num_statements": 9, "percent_covered": 54.54545454545455, "percent_covered_display": "54.55", "missing_lines": 4, "excluded_lines": 0, "percent_statements_covered": 55.55555555555556, "percent_statements_covered_display": "55.56", "num_branches": 2, "num_partial_branches": 1, "covered_branches": 1, "missing_branches": 1, "percent_branches_covered": 50.0, "percent_branches_covered_display": "50.00"}, "missing_lines": [149, 156, 157, 158], "excluded_lines": [], "start_line": 141, "executed_branches": [[148, 154]], "missing_branches": [[148, 149]]}, "_commit_subject": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 7, "percent_covered": 0.0, "percent_covered_display": "0.00", "missing_lines": 7, "excluded_lines": 0, "percent_statements_covered": 0.0, "percent_statements_covered_display": "0.00", "num_branches": 2, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 2, "percent_branches_covered": 0.0, "percent_branches_covered_display": "0.00"}, "missing_lines": [162, 163, 167, 168, 169, 174, 175], "excluded_lines": [], "start_line": 161, "executed_branches": [], "missing_branches": [[168, 169], [168, 174]]}, "_validate_task": {"executed_lines": [181, 182, 184, 185, 187, 190, 192, 193, 196, 197, 200, 201, 204, 207, 208, 210, 211, 214, 217, 218, 220, 223, 224, 230, 235, 236, 240, 241, 246, 248, 249, 256, 261, 265, 268, 269, 270, 271, 273], "summary": {"covered_lines": 39, "num_statements": 60, "percent_covered": 62.765957446808514, "percent_covered_display": "62.77", "missing_lines": 21, "excluded_lines": 0, "percent_statements_covered": 65.0, "percent_statements_covered_display": "65.00", "num_branches": 34, "num_partial_branches": 14, "covered_branches": 20, "missing_branches": 14, "percent_branches_covered": 58.8235294117647, "percent_branches_covered_display": "58.82"}, "missing_lines": [186, 188, 194, 198, 202, 203, 205, 212, 213, 215, 219, 221, 225, 226, 231, 237, 238, 250, 251, 254, 266], "excluded_lines": [], "start_line": 178, "executed_branches": [[185, 187], [187, 190], [193, 196], [197, 200], [201, 204], [204, 207], [211, 214], [214, 217], [217, 218], [217, 265], [218, 220], [220, 223], [230, 235], [240, 241], [256, 261], [265, 268], [268, 269], [268, 270], [270, 271], [270, 273]], "missing_branches": [[185, 186], [187, 188], [193, 194], [197, 198], [201, 202], [204, 205], [211, 212], [214, 215], [218, 219], [220, 221], [230, 231], [240, 268], [256, 268], [265, 266]]}, "validate_ledger": {"executed_lines": [277, 278, 279, 280, 282, 283, 284, 286, 287, 288, 290, 291, 292, 294, 295, 296, 298, 299, 300, 301, 303, 304, 305, 306, 309, 310, 311, 313, 314, 316], "summary": {"covered_lines": 30, "num_statements": 32, "percent_covered": 94.23076923076923, "percent_covered_display": "94.23", "missing_lines": 2, "excluded_lines": 0, "percent_statements_covered": 93.75, "percent_statements_covered_display": "93.75", "num_branches": 20, "num_partial_branches": 1, "covered_branches": 19, "missing_branches": 1, "percent_branches_covered": 95.0, "percent_branches_covered_display": "95.00"}, "missing_lines": [307, 308], "excluded_lines": [], "start_line": 276, "executed_branches": [[279, 280], [279, 282], [283, 284], [283, 286], [287, 288], [287, 290], [291, 292], [291, 294], [295, 296], [295, 298], [299, 300], [299, 303], [305, 306], [305, 313], [306, 309], [310, 305], [310, 311], [313, 314], [313, 316]], "missing_branches": [[306, 307]]}, "find_ledgers": {"executed_lines": [320, 322, 323, 324, 326], "summary": {"covered_lines": 5, "num_statements": 7, "percent_covered": 63.63636363636363, "percent_covered_display": "63.64", "missing_lines": 2, "excluded_lines": 0, "percent_statements_covered": 71.42857142857143, "percent_statements_covered_display": "71.43", "num_branches": 4, "num_partial_branches": 2, "covered_branches": 2, "missing_branches": 2, "percent_branches_covered": 50.0, "percent_branches_covered_display": "50.00"}, "missing_lines": [321, 325], "excluded_lines": [], "start_line": 319, "executed_branches": [[320, 322], [324, 326]], "missing_branches": [[320, 321], [324, 325]]}, "main": {"executed_lines": [330, 331, 337, 342, 344, 345, 346, 347, 348, 349, 351, 352, 363], "summary": {"covered_lines": 13, "num_statements": 21, "percent_covered": 45.945945945945944, "percent_covered_display": "45.95", "missing_lines": 8, "excluded_lines": 0, "percent_statements_covered": 61.904761904761905, "percent_statements_covered_display": "61.90", "num_branches": 16, "num_partial_branches": 2, "covered_branches": 4, "missing_branches": 12, "percent_branches_covered": 25.0, "percent_branches_covered_display": "25.00"}, "missing_lines": [354, 355, 356, 357, 358, 359, 360, 361], "excluded_lines": [], "start_line": 329, "executed_branches": [[346, 347], [346, 351], [348, 349], [351, 352]], "missing_branches": [[348, 346], [351, 354], [354, 355], [354, 356], [356, 357], [356, 359], [357, 356], [357, 358], [359, 360], [359, 363], [360, 361], [360, 363]]}, "": {"executed_lines": [9, 11, 12, 13, 14, 15, 16, 17, 18, 19, 21, 23, 24, 25, 26, 28, 30, 31, 32, 35, 38, 43, 51, 57, 74, 141, 161, 178, 276, 319, 329], "summary": {"covered_lines": 31, "num_statements": 31, "percent_covered": 96.96969696969697, "percent_covered_display": "96.97", "missing_lines": 0, "excluded_lines": 2, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 2, "num_partial_branches": 1, "covered_branches": 1, "missing_branches": 1, "percent_branches_covered": 50.0, "percent_branches_covered_display": "50.00"}, "missing_lines": [], "excluded_lines": [366, 367], "start_line": 1, "executed_branches": [[25, 26]], "missing_branches": [[25, 28]]}}, "classes": {"LedgerError": {"executed_lines": [39, 40], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 35, "executed_branches": [], "missing_branches": []}, "": {"executed_lines": [9, 11, 12, 13, 14, 15, 16, 17, 18, 19, 21, 23, 24, 25, 26, 28, 30, 31, 32, 35, 38, 43, 44, 45, 46, 47, 48, 51, 57, 58, 59, 60, 61, 62, 63, 64, 67, 68, 69, 70, 71, 74, 141, 142, 143, 147, 148, 154, 161, 178, 181, 182, 184, 185, 187, 190, 192, 193, 196, 197, 200, 201, 204, 207, 208, 210, 211, 214, 217, 218, 220, 223, 224, 230, 235, 236, 240, 241, 246, 248, 249, 256, 261, 265, 268, 269, 270, 271, 273, 276, 277, 278, 279, 280, 282, 283, 284, 286, 287, 288, 290, 291, 292, 294, 295, 296, 298, 299, 300, 301, 303, 304, 305, 306, 309, 310, 311, 313, 314, 316, 319, 320, 322, 323, 324, 326, 329, 330, 331, 337, 342, 344, 345, 346, 347, 348, 349, 351, 352, 363], "summary": {"covered_lines": 140, "num_statements": 203, "percent_covered": 65.08474576271186, "percent_covered_display": "65.08", "missing_lines": 63, "excluded_lines": 2, "percent_statements_covered": 68.96551724137932, "percent_statements_covered_display": "68.97", "num_branches": 92, "num_partial_branches": 22, "covered_branches": 52, "missing_branches": 40, "percent_branches_covered": 56.52173913043478, "percent_branches_covered_display": "56.52"}, "missing_lines": [52, 53, 54, 65, 66, 77, 105, 106, 107, 112, 113, 115, 116, 121, 122, 134, 135, 136, 138, 149, 156, 157, 158, 162, 163, 167, 168, 169, 174, 175, 186, 188, 194, 198, 202, 203, 205, 212, 213, 215, 219, 221, 225, 226, 231, 237, 238, 250, 251, 254, 266, 307, 308, 321, 325, 354, 355, 356, 357, 358, 359, 360, 361], "excluded_lines": [366, 367], "start_line": 1, "executed_branches": [[25, 26], [59, 60], [59, 61], [61, 62], [61, 64], [64, 67], [148, 154], [185, 187], [187, 190], [193, 196], [197, 200], [201, 204], [204, 207], [211, 214], [214, 217], [217, 218], [217, 265], [218, 220], [220, 223], [230, 235], [240, 241], [256, 261], [265, 268], [268, 269], [268, 270], [270, 271], [270, 273], [279, 280], [279, 282], [283, 284], [283, 286], [287, 288], [287, 290], [291, 292], [291, 294], [295, 296], [295, 298], [299, 300], [299, 303], [305, 306], [305, 313], [306, 309], [310, 305], [310, 311], [313, 314], [313, 316], [320, 322], [324, 326], [346, 347], [346, 351], [348, 349], [351, 352]], "missing_branches": [[25, 28], [52, 53], [52, 54], [64, 65], [105, 106], [105, 138], [115, 116], [115, 121], [148, 149], [168, 169], [168, 174], [185, 186], [187, 188], [193, 194], [197, 198], [201, 202], [204, 205], [211, 212], [214, 215], [218, 219], [220, 221], [230, 231], [240, 268], [256, 268], [265, 266], [306, 307], [320, 321], [324, 325], [348, 346], [351, 354], [354, 355], [354, 356], [356, 357], [356, 359], [357, 356], [357, 358], [359, 360], [359, 363], [360, 361], [360, 363]]}}}, "scripts/metrics_format_utils.py": {"executed_lines": [8, 10, 13, 15, 16, 17, 18, 21, 23, 24, 26, 27, 30, 32, 33, 34], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 6, "num_partial_branches": 0, "covered_branches": 6, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "executed_branches": [[15, 16], [15, 17], [23, 24], [23, 26], [32, 33], [32, 34]], "missing_branches": [], "functions": {"format_percentage": {"executed_lines": [10], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 8, "executed_branches": [], "missing_branches": []}, "format_count": {"executed_lines": [15, 16, 17, 18], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 2, "num_partial_branches": 0, "covered_branches": 2, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 13, "executed_branches": [[15, 16], [15, 17]], "missing_branches": []}, "summarize_patterns": {"executed_lines": [23, 24, 26, 27], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 2, "num_partial_branches": 0, "covered_branches": 2, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 21, "executed_branches": [[23, 24], [23, 26]], "missing_branches": []}, "truncate_string": {"executed_lines": [32, 33, 34], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 2, "num_partial_branches": 0, "covered_branches": 2, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 30, "executed_branches": [[32, 33], [32, 34]], "missing_branches": []}, "": {"executed_lines": [8, 13, 21, 30], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 1, "executed_branches": [], "missing_branches": []}}, "classes": {"": {"executed_lines": [8, 10, 13, 15, 16, 17, 18, 21, 23, 24, 26, 27, 30, 32, 33, 34], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 6, "num_partial_branches": 0, "covered_branches": 6, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 1, "executed_branches": [[15, 16], [15, 17], [23, 24], [23, 26], [32, 33], [32, 34]], "missing_branches": []}}}, "scripts/mypy_autofix.py": {"executed_lines": [3, 5, 6, 7, 9, 10, 13, 14, 15, 16, 17, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 32, 33, 34, 35, 36, 37, 38, 39, 42, 43, 44, 45, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56], "summary": {"covered_lines": 45, "num_statements": 45, "percent_covered": 98.46153846153847, "percent_covered_display": "98.46", "missing_lines": 0, "excluded_lines": 2, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 20, "num_partial_branches": 1, "covered_branches": 19, "missing_branches": 1, "percent_branches_covered": 95.0, "percent_branches_covered_display": "95.00"}, "missing_lines": [], "excluded_lines": [59, 60], "executed_branches": [[16, 17], [16, 19], [20, 21], [20, 32], [21, 20], [21, 22], [25, 26], [25, 27], [33, 34], [35, 33], [35, 36], [48, 49], [48, 56], [51, 52], [51, 53], [53, 48], [53, 54], [54, 48], [54, 55]], "missing_branches": [[33, 37]], "functions": {"_ensure_typing_imports": {"executed_lines": [14, 15, 16, 17, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 32, 33, 34, 35, 36, 37, 38, 39], "summary": {"covered_lines": 24, "num_statements": 24, "percent_covered": 97.22222222222223, "percent_covered_display": "97.22", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 12, "num_partial_branches": 1, "covered_branches": 11, "missing_branches": 1, "percent_branches_covered": 91.66666666666667, "percent_branches_covered_display": "91.67"}, "missing_lines": [], "excluded_lines": [], "start_line": 13, "executed_branches": [[16, 17], [16, 19], [20, 21], [20, 32], [21, 20], [21, 22], [25, 26], [25, 27], [33, 34], [35, 33], [35, 36]], "missing_branches": [[33, 37]]}, "main": {"executed_lines": [43, 44, 45, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56], "summary": {"covered_lines": 13, "num_statements": 13, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 8, "num_partial_branches": 0, "covered_branches": 8, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 42, "executed_branches": [[48, 49], [48, 56], [51, 52], [51, 53], [53, 48], [53, 54], [54, 48], [54, 55]], "missing_branches": []}, "": {"executed_lines": [3, 5, 6, 7, 9, 10, 13, 42], "summary": {"covered_lines": 8, "num_statements": 8, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 2, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [59, 60], "start_line": 1, "executed_branches": [], "missing_branches": []}}, "classes": {"": {"executed_lines": [3, 5, 6, 7, 9, 10, 13, 14, 15, 16, 17, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 32, 33, 34, 35, 36, 37, 38, 39, 42, 43, 44, 45, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56], "summary": {"covered_lines": 45, "num_statements": 45, "percent_covered": 98.46153846153847, "percent_covered_display": "98.46", "missing_lines": 0, "excluded_lines": 2, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 20, "num_partial_branches": 1, "covered_branches": 19, "missing_branches": 1, "percent_branches_covered": 95.0, "percent_branches_covered_display": "95.00"}, "missing_lines": [], "excluded_lines": [59, 60], "start_line": 1, "executed_branches": [[16, 17], [16, 19], [20, 21], [20, 32], [21, 20], [21, 22], [25, 26], [25, 27], [33, 34], [35, 33], [35, 36], [48, 49], [48, 56], [51, 52], [51, 53], [53, 48], [53, 54], [54, 48], [54, 55]], "missing_branches": [[33, 37]]}}}, "scripts/mypy_return_autofix.py": {"executed_lines": [3, 5, 6, 7, 8, 10, 11, 12, 15, 16, 17, 18, 19, 20, 22, 23, 24, 26, 27, 28, 31, 32, 33, 34, 37, 38, 39, 40, 41, 42, 46, 52, 55, 56, 57, 61, 62, 65, 66, 67, 68, 69, 70, 72, 73, 74, 75, 77, 78, 80, 81, 82, 84, 85, 86, 87, 88, 89, 90, 93, 94, 95, 96, 97, 99, 100, 101, 102, 104, 105, 106, 109, 110, 111, 112, 114, 115, 116], "summary": {"covered_lines": 78, "num_statements": 89, "percent_covered": 82.5503355704698, "percent_covered_display": "82.55", "missing_lines": 11, "excluded_lines": 2, "percent_statements_covered": 87.64044943820225, "percent_statements_covered_display": "87.64", "num_branches": 60, "num_partial_branches": 7, "covered_branches": 45, "missing_branches": 15, "percent_branches_covered": 75.0, "percent_branches_covered_display": "75.00"}, "missing_lines": [21, 25, 43, 44, 45, 49, 50, 51, 58, 71, 113], "excluded_lines": [119, 120], "executed_branches": [[16, 17], [16, 18], [18, 19], [18, 20], [20, 22], [22, 23], [22, 28], [24, 26], [26, 27], [26, 28], [32, 33], [32, 34], [40, 41], [40, 52], [41, 40], [41, 42], [42, 46], [46, 40], [56, 57], [68, 69], [68, 77], [69, 68], [69, 70], [70, 72], [72, 73], [72, 74], [74, 68], [74, 75], [77, 78], [77, 80], [84, 85], [84, 87], [87, 88], [87, 90], [99, 100], [99, 104], [100, 99], [100, 101], [104, 105], [104, 106], [110, 111], [110, 116], [112, 114], [114, 110], [114, 115]], "missing_branches": [[20, 21], [24, 25], [42, 43], [43, 44], [43, 46], [44, 43], [44, 45], [46, 49], [49, 40], [49, 50], [50, 49], [50, 51], [56, 58], [70, 71], [112, 113]], "functions": {"_is_str_like": {"executed_lines": [16, 17, 18, 19, 20, 22, 23, 24, 26, 27, 28], "summary": {"covered_lines": 11, "num_statements": 13, "percent_covered": 84.0, "percent_covered_display": "84.00", "missing_lines": 2, "excluded_lines": 0, "percent_statements_covered": 84.61538461538461, "percent_statements_covered_display": "84.62", "num_branches": 12, "num_partial_branches": 2, "covered_branches": 10, "missing_branches": 2, "percent_branches_covered": 83.33333333333333, "percent_branches_covered_display": "83.33"}, "missing_lines": [21, 25], "excluded_lines": [], "start_line": 15, "executed_branches": [[16, 17], [16, 18], [18, 19], [18, 20], [20, 22], [22, 23], [22, 28], [24, 26], [26, 27], [26, 28]], "missing_branches": [[20, 21], [24, 25]]}, "_is_list_of_str": {"executed_lines": [32, 33, 34], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 2, "num_partial_branches": 0, "covered_branches": 2, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 31, "executed_branches": [[32, 33], [32, 34]], "missing_branches": []}, "_collect_string_vars": {"executed_lines": [38, 39, 40, 41, 42, 46, 52], "summary": {"covered_lines": 7, "num_statements": 13, "percent_covered": 44.827586206896555, "percent_covered_display": "44.83", "missing_lines": 6, "excluded_lines": 0, "percent_statements_covered": 53.84615384615385, "percent_statements_covered_display": "53.85", "num_branches": 16, "num_partial_branches": 2, "covered_branches": 6, "missing_branches": 10, "percent_branches_covered": 37.5, "percent_branches_covered_display": "37.50"}, "missing_lines": [43, 44, 45, 49, 50, 51], "excluded_lines": [], "start_line": 37, "executed_branches": [[40, 41], [40, 52], [41, 40], [41, 42], [42, 46], [46, 40]], "missing_branches": [[42, 43], [43, 44], [43, 46], [44, 43], [44, 45], [46, 49], [49, 40], [49, 50], [50, 49], [50, 51]]}, "_annotation_to_str": {"executed_lines": [56, 57], "summary": {"covered_lines": 2, "num_statements": 3, "percent_covered": 60.0, "percent_covered_display": "60.00", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 66.66666666666667, "percent_statements_covered_display": "66.67", "num_branches": 2, "num_partial_branches": 1, "covered_branches": 1, "missing_branches": 1, "percent_branches_covered": 50.0, "percent_branches_covered_display": "50.00"}, "missing_lines": [58], "excluded_lines": [], "start_line": 55, "executed_branches": [[56, 57]], "missing_branches": [[56, 58]]}, "_rewrite_annotation": {"executed_lines": [62], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 61, "executed_branches": [], "missing_branches": []}, "_process_function": {"executed_lines": [66, 67, 68, 69, 70, 72, 73, 74, 75, 77, 78, 80, 81, 82, 84, 85, 86, 87, 88, 89, 90], "summary": {"covered_lines": 21, "num_statements": 22, "percent_covered": 94.73684210526316, "percent_covered_display": "94.74", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 95.45454545454545, "percent_statements_covered_display": "95.45", "num_branches": 16, "num_partial_branches": 1, "covered_branches": 15, "missing_branches": 1, "percent_branches_covered": 93.75, "percent_branches_covered_display": "93.75"}, "missing_lines": [71], "excluded_lines": [], "start_line": 65, "executed_branches": [[68, 69], [68, 77], [69, 68], [69, 70], [70, 72], [72, 73], [72, 74], [74, 68], [74, 75], [77, 78], [77, 80], [84, 85], [84, 87], [87, 88], [87, 90]], "missing_branches": [[70, 71]]}, "_process_file": {"executed_lines": [94, 95, 96, 97, 99, 100, 101, 102, 104, 105, 106], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 6, "num_partial_branches": 0, "covered_branches": 6, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 93, "executed_branches": [[99, 100], [99, 104], [100, 99], [100, 101], [104, 105], [104, 106]], "missing_branches": []}, "main": {"executed_lines": [110, 111, 112, 114, 115, 116], "summary": {"covered_lines": 6, "num_statements": 7, "percent_covered": 84.61538461538461, "percent_covered_display": "84.62", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 85.71428571428571, "percent_statements_covered_display": "85.71", "num_branches": 6, "num_partial_branches": 1, "covered_branches": 5, "missing_branches": 1, "percent_branches_covered": 83.33333333333333, "percent_branches_covered_display": "83.33"}, "missing_lines": [113], "excluded_lines": [], "start_line": 109, "executed_branches": [[110, 111], [110, 116], [112, 114], [114, 110], [114, 115]], "missing_branches": [[112, 113]]}, "": {"executed_lines": [3, 5, 6, 7, 8, 10, 11, 12, 15, 31, 37, 55, 61, 65, 93, 109], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 2, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [119, 120], "start_line": 1, "executed_branches": [], "missing_branches": []}}, "classes": {"": {"executed_lines": [3, 5, 6, 7, 8, 10, 11, 12, 15, 16, 17, 18, 19, 20, 22, 23, 24, 26, 27, 28, 31, 32, 33, 34, 37, 38, 39, 40, 41, 42, 46, 52, 55, 56, 57, 61, 62, 65, 66, 67, 68, 69, 70, 72, 73, 74, 75, 77, 78, 80, 81, 82, 84, 85, 86, 87, 88, 89, 90, 93, 94, 95, 96, 97, 99, 100, 101, 102, 104, 105, 106, 109, 110, 111, 112, 114, 115, 116], "summary": {"covered_lines": 78, "num_statements": 89, "percent_covered": 82.5503355704698, "percent_covered_display": "82.55", "missing_lines": 11, "excluded_lines": 2, "percent_statements_covered": 87.64044943820225, "percent_statements_covered_display": "87.64", "num_branches": 60, "num_partial_branches": 7, "covered_branches": 45, "missing_branches": 15, "percent_branches_covered": 75.0, "percent_branches_covered_display": "75.00"}, "missing_lines": [21, 25, 43, 44, 45, 49, 50, 51, 58, 71, 113], "excluded_lines": [119, 120], "start_line": 1, "executed_branches": [[16, 17], [16, 18], [18, 19], [18, 20], [20, 22], [22, 23], [22, 28], [24, 26], [26, 27], [26, 28], [32, 33], [32, 34], [40, 41], [40, 52], [41, 40], [41, 42], [42, 46], [46, 40], [56, 57], [68, 69], [68, 77], [69, 68], [69, 70], [70, 72], [72, 73], [72, 74], [74, 68], [74, 75], [77, 78], [77, 80], [84, 85], [84, 87], [87, 88], [87, 90], [99, 100], [99, 104], [100, 99], [100, 101], [104, 105], [104, 106], [110, 111], [110, 116], [112, 114], [114, 110], [114, 115]], "missing_branches": [[20, 21], [24, 25], [42, 43], [43, 44], [43, 46], [44, 43], [44, 45], [46, 49], [49, 40], [49, 50], [50, 49], [50, 51], [56, 58], [70, 71], [112, 113]]}}}, "scripts/pr_metrics_tracker.py": {"executed_lines": [6, 7, 8, 9, 10, 13, 14, 17, 18, 19, 20, 21, 22, 23, 25, 27, 28, 29, 30, 33, 42, 44, 45, 46, 48, 49, 51, 62, 71, 72, 74, 75, 77, 78, 79, 80, 82, 83, 84, 88, 91, 100, 101, 102, 103, 104, 106, 107, 109, 112, 121, 122, 124, 125, 128, 137, 139, 140, 141, 142, 143, 145, 148, 157, 159], "summary": {"covered_lines": 65, "num_statements": 68, "percent_covered": 95.65217391304348, "percent_covered_display": "95.65", "missing_lines": 3, "excluded_lines": 0, "percent_statements_covered": 95.58823529411765, "percent_statements_covered_display": "95.59", "num_branches": 24, "num_partial_branches": 1, "covered_branches": 23, "missing_branches": 1, "percent_branches_covered": 95.83333333333333, "percent_branches_covered_display": "95.83"}, "missing_lines": [81, 85, 86], "excluded_lines": [], "executed_branches": [[27, 28], [27, 29], [45, 46], [45, 48], [74, 75], [74, 77], [78, 79], [78, 88], [80, 82], [101, 102], [101, 106], [103, 101], [103, 104], [106, 107], [106, 109], [121, 122], [121, 124], [139, 140], [139, 145], [140, 139], [140, 141], [141, 142], [141, 143]], "missing_branches": [[80, 81]], "functions": {"PRMetrics.time_to_merge_hours": {"executed_lines": [27, 28, 29, 30], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 2, "num_partial_branches": 0, "covered_branches": 2, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 25, "executed_branches": [[27, 28], [27, 29]], "missing_branches": []}, "parse_pr_data": {"executed_lines": [42, 44, 45, 46, 48, 49, 51], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 2, "num_partial_branches": 0, "covered_branches": 2, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 33, "executed_branches": [[45, 46], [45, 48]], "missing_branches": []}, "load_pr_history": {"executed_lines": [71, 72, 74, 75, 77, 78, 79, 80, 82, 83, 84, 88], "summary": {"covered_lines": 12, "num_statements": 15, "percent_covered": 80.95238095238095, "percent_covered_display": "80.95", "missing_lines": 3, "excluded_lines": 0, "percent_statements_covered": 80.0, "percent_statements_covered_display": "80.00", "num_branches": 6, "num_partial_branches": 1, "covered_branches": 5, "missing_branches": 1, "percent_branches_covered": 83.33333333333333, "percent_branches_covered_display": "83.33"}, "missing_lines": [81, 85, 86], "excluded_lines": [], "start_line": 62, "executed_branches": [[74, 75], [74, 77], [78, 79], [78, 88], [80, 82]], "missing_branches": [[80, 81]]}, "calculate_average_merge_time": {"executed_lines": [100, 101, 102, 103, 104, 106, 107, 109], "summary": {"covered_lines": 8, "num_statements": 8, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 6, "num_partial_branches": 0, "covered_branches": 6, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 91, "executed_branches": [[101, 102], [101, 106], [103, 101], [103, 104], [106, 107], [106, 109]], "missing_branches": []}, "calculate_autofix_rate": {"executed_lines": [121, 122, 124, 125], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 2, "num_partial_branches": 0, "covered_branches": 2, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 112, "executed_branches": [[121, 122], [121, 124]], "missing_branches": []}, "group_by_label": {"executed_lines": [137, 139, 140, 141, 142, 143, 145], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 6, "num_partial_branches": 0, "covered_branches": 6, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 128, "executed_branches": [[139, 140], [139, 145], [140, 139], [140, 141], [141, 142], [141, 143]], "missing_branches": []}, "generate_metrics_summary": {"executed_lines": [157, 159], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 148, "executed_branches": [], "missing_branches": []}, "": {"executed_lines": [6, 7, 8, 9, 10, 13, 14, 17, 18, 19, 20, 21, 22, 23, 25, 33, 62, 91, 112, 128, 148], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 1, "executed_branches": [], "missing_branches": []}}, "classes": {"PRMetrics": {"executed_lines": [27, 28, 29, 30], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 2, "num_partial_branches": 0, "covered_branches": 2, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 14, "executed_branches": [[27, 28], [27, 29]], "missing_branches": []}, "": {"executed_lines": [6, 7, 8, 9, 10, 13, 14, 17, 18, 19, 20, 21, 22, 23, 25, 33, 42, 44, 45, 46, 48, 49, 51, 62, 71, 72, 74, 75, 77, 78, 79, 80, 82, 83, 84, 88, 91, 100, 101, 102, 103, 104, 106, 107, 109, 112, 121, 122, 124, 125, 128, 137, 139, 140, 141, 142, 143, 145, 148, 157, 159], "summary": {"covered_lines": 61, "num_statements": 64, "percent_covered": 95.34883720930233, "percent_covered_display": "95.35", "missing_lines": 3, "excluded_lines": 0, "percent_statements_covered": 95.3125, "percent_statements_covered_display": "95.31", "num_branches": 22, "num_partial_branches": 1, "covered_branches": 21, "missing_branches": 1, "percent_branches_covered": 95.45454545454545, "percent_branches_covered_display": "95.45"}, "missing_lines": [81, 85, 86], "excluded_lines": [], "start_line": 1, "executed_branches": [[45, 46], [45, 48], [74, 75], [74, 77], [78, 79], [78, 88], [80, 82], [101, 102], [101, 106], [103, 101], [103, 104], [106, 107], [106, 109], [121, 122], [121, 124], [139, 140], [139, 145], [140, 139], [140, 141], [141, 142], [141, 143]], "missing_branches": [[80, 81]]}}}, "scripts/sync_status_file_ignores.py": {"executed_lines": [27, 29, 30, 31, 35, 56, 65, 67, 68, 69, 71, 74, 76, 77, 78, 79, 82, 85, 86, 87, 88, 90, 91, 92, 94, 97, 99, 100, 103, 105, 106, 108, 113, 114, 117, 119, 120, 121, 123, 125, 126, 127, 128, 130, 131, 132, 133, 134, 135, 136, 138, 139, 142, 144, 149, 154, 158, 163, 168, 174, 176, 177, 178, 180, 181, 182, 183, 185, 186, 187, 188, 189, 190, 192, 194, 195, 196, 197, 198, 199, 201, 203, 205, 216, 217, 218, 219, 221, 223, 224, 227, 228, 231, 232], "summary": {"covered_lines": 94, "num_statements": 94, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 40, "num_partial_branches": 0, "covered_branches": 40, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "executed_branches": [[68, 69], [68, 71], [77, 78], [77, 79], [86, 87], [86, 94], [88, 86], [88, 90], [90, 91], [90, 92], [105, 106], [105, 108], [125, 126], [125, 130], [127, 128], [127, 130], [130, 131], [130, 138], [132, 133], [132, 134], [176, 177], [176, 180], [180, 181], [180, 185], [181, 182], [181, 183], [185, 186], [185, 192], [186, 187], [186, 189], [192, 194], [192, 201], [195, 196], [195, 198], [201, 203], [201, 227], [216, 217], [216, 221], [231, -1], [231, 232]], "missing_branches": [], "functions": {"load_template_gitignore": {"executed_lines": [67, 68, 69, 71], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 2, "num_partial_branches": 0, "covered_branches": 2, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 65, "executed_branches": [[68, 69], [68, 71]], "missing_branches": []}, "generate_minimal_block": {"executed_lines": [76, 77, 78, 79], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 2, "num_partial_branches": 0, "covered_branches": 2, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 74, "executed_branches": [[77, 78], [77, 79]], "missing_branches": []}, "check_gitignore_content": {"executed_lines": [85, 86, 87, 88, 90, 91, 92, 94], "summary": {"covered_lines": 8, "num_statements": 8, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 6, "num_partial_branches": 0, "covered_branches": 6, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 82, "executed_branches": [[86, 87], [86, 94], [88, 86], [88, 90], [90, 91], [90, 92]], "missing_branches": []}, "get_missing_patterns": {"executed_lines": [99, 100], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 97, "executed_branches": [], "missing_branches": []}, "generate_append_block": {"executed_lines": [105, 106, 108, 113, 114], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 2, "num_partial_branches": 0, "covered_branches": 2, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 103, "executed_branches": [[105, 106], [105, 108]], "missing_branches": []}, "print_check_report": {"executed_lines": [119, 120, 121, 123, 125, 126, 127, 128, 130, 131, 132, 133, 134, 135, 136, 138, 139], "summary": {"covered_lines": 17, "num_statements": 17, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 8, "num_partial_branches": 0, "covered_branches": 8, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 117, "executed_branches": [[125, 126], [125, 130], [127, 128], [127, 130], [130, 131], [130, 138], [132, 133], [132, 134]], "missing_branches": []}, "main": {"executed_lines": [144, 149, 154, 158, 163, 168, 174, 176, 177, 178, 180, 181, 182, 183, 185, 186, 187, 188, 189, 190, 192, 194, 195, 196, 197, 198, 199, 201, 203, 205, 216, 217, 218, 219, 221, 223, 224, 227, 228], "summary": {"covered_lines": 39, "num_statements": 39, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 18, "num_partial_branches": 0, "covered_branches": 18, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 142, "executed_branches": [[176, 177], [176, 180], [180, 181], [180, 185], [181, 182], [181, 183], [185, 186], [185, 192], [186, 187], [186, 189], [192, 194], [192, 201], [195, 196], [195, 198], [201, 203], [201, 227], [216, 217], [216, 221]], "missing_branches": []}, "": {"executed_lines": [27, 29, 30, 31, 35, 56, 65, 74, 82, 97, 103, 117, 142, 231, 232], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 2, "num_partial_branches": 0, "covered_branches": 2, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 1, "executed_branches": [[231, -1], [231, 232]], "missing_branches": []}}, "classes": {"": {"executed_lines": [27, 29, 30, 31, 35, 56, 65, 67, 68, 69, 71, 74, 76, 77, 78, 79, 82, 85, 86, 87, 88, 90, 91, 92, 94, 97, 99, 100, 103, 105, 106, 108, 113, 114, 117, 119, 120, 121, 123, 125, 126, 127, 128, 130, 131, 132, 133, 134, 135, 136, 138, 139, 142, 144, 149, 154, 158, 163, 168, 174, 176, 177, 178, 180, 181, 182, 183, 185, 186, 187, 188, 189, 190, 192, 194, 195, 196, 197, 198, 199, 201, 203, 205, 216, 217, 218, 219, 221, 223, 224, 227, 228, 231, 232], "summary": {"covered_lines": 94, "num_statements": 94, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 40, "num_partial_branches": 0, "covered_branches": 40, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 1, "executed_branches": [[68, 69], [68, 71], [77, 78], [77, 79], [86, 87], [86, 94], [88, 86], [88, 90], [90, 91], [90, 92], [105, 106], [105, 108], [125, 126], [125, 130], [127, 128], [127, 130], [130, 131], [130, 138], [132, 133], [132, 134], [176, 177], [176, 180], [180, 181], [180, 185], [181, 182], [181, 183], [185, 186], [185, 192], [186, 187], [186, 189], [192, 194], [192, 201], [195, 196], [195, 198], [201, 203], [201, 227], [216, 217], [216, 221], [231, -1], [231, 232]], "missing_branches": []}}}, "scripts/sync_test_dependencies.py": {"executed_lines": [9, 11, 12, 13, 14, 15, 16, 17, 19, 20, 21, 22, 25, 26, 27, 31, 33, 34, 38, 107, 116, 143, 149, 150, 152, 153, 154, 156, 158, 167, 170, 171, 173, 174, 176, 179, 181, 185, 188, 198, 199, 202, 205, 208, 211, 214, 215, 216, 218, 219, 222, 223, 225, 228, 230, 231, 232, 233, 234, 236, 237, 238, 239, 240, 241, 242, 243, 244, 246, 249, 251, 252, 253, 255, 256, 257, 258, 259, 260, 262, 265, 267, 268, 270, 271, 273, 274, 276, 277, 278, 279, 280, 281, 282, 284, 285, 286, 287, 288, 289, 291, 294, 296, 297, 300, 301, 303, 304, 305, 306, 307, 308, 310, 313, 315, 316, 318, 319, 324, 326, 327, 328, 329, 330, 331, 332, 334, 336, 337, 338, 339, 340, 341, 342, 343, 345, 346, 348, 351, 353, 354, 359, 364, 366, 368, 369, 370, 372, 373, 374, 376, 377, 378, 379, 380, 382, 383, 385, 386, 387, 389, 390], "summary": {"covered_lines": 162, "num_statements": 163, "percent_covered": 98.29787234042553, "percent_covered_display": "98.30", "missing_lines": 1, "excluded_lines": 4, "percent_statements_covered": 99.38650306748467, "percent_statements_covered_display": "99.39", "num_branches": 72, "num_partial_branches": 3, "covered_branches": 69, "missing_branches": 3, "percent_branches_covered": 95.83333333333333, "percent_branches_covered_display": "95.83"}, "missing_lines": [220], "excluded_lines": [28, 29, 393, 394], "executed_branches": [[21, 22], [152, 153], [152, 176], [153, 154], [153, 156], [156, 152], [156, 158], [158, 167], [158, 170], [170, 171], [170, 173], [173, 156], [173, 174], [215, 216], [215, 218], [219, 222], [237, 238], [237, 246], [238, 239], [238, 242], [239, 237], [239, 240], [242, 237], [242, 243], [252, 253], [252, 255], [256, 257], [256, 262], [257, 258], [257, 259], [267, 268], [267, 270], [276, 277], [276, 284], [278, 276], [278, 279], [281, 282], [284, 285], [284, 291], [286, 284], [286, 287], [288, 286], [288, 289], [304, 305], [304, 310], [307, 304], [307, 308], [315, 316], [315, 318], [318, 319], [318, 324], [329, 330], [329, 334], [337, 338], [337, 345], [339, 340], [339, 341], [345, 346], [345, 348], [368, 369], [368, 372], [373, 374], [373, 376], [376, 377], [376, 385], [378, 379], [378, 382], [385, 386], [385, 389]], "missing_branches": [[21, 25], [219, 220], [281, 276]], "functions": {"_detect_local_project_modules": {"executed_lines": [149, 150, 152, 153, 154, 156, 158, 167, 170, 171, 173, 174, 176], "summary": {"covered_lines": 13, "num_statements": 13, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 12, "num_partial_branches": 0, "covered_branches": 12, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 143, "executed_branches": [[152, 153], [152, 176], [153, 154], [153, 156], [156, 152], [156, 158], [158, 167], [158, 170], [170, 171], [170, 173], [173, 156], [173, 174]], "missing_branches": []}, "get_project_modules": {"executed_lines": [181], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 179, "executed_branches": [], "missing_branches": []}, "_normalize_module_name": {"executed_lines": [199], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 198, "executed_branches": [], "missing_branches": []}, "_normalise_package_name": {"executed_lines": [205], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 202, "executed_branches": [], "missing_branches": []}, "_extract_requirement_name": {"executed_lines": [214, 215, 216, 218, 219, 222, 223, 225], "summary": {"covered_lines": 8, "num_statements": 9, "percent_covered": 84.61538461538461, "percent_covered_display": "84.62", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 88.88888888888889, "percent_statements_covered_display": "88.89", "num_branches": 4, "num_partial_branches": 1, "covered_branches": 3, "missing_branches": 1, "percent_branches_covered": 75.0, "percent_branches_covered_display": "75.00"}, "missing_lines": [220], "excluded_lines": [], "start_line": 211, "executed_branches": [[215, 216], [215, 218], [219, 222]], "missing_branches": [[219, 220]]}, "extract_imports_from_file": {"executed_lines": [230, 231, 232, 233, 234, 236, 237, 238, 239, 240, 241, 242, 243, 244, 246], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 8, "num_partial_branches": 0, "covered_branches": 8, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 228, "executed_branches": [[237, 238], [237, 246], [238, 239], [238, 242], [239, 237], [239, 240], [242, 237], [242, 243]], "missing_branches": []}, "get_all_test_imports": {"executed_lines": [251, 252, 253, 255, 256, 257, 258, 259, 260, 262], "summary": {"covered_lines": 10, "num_statements": 10, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 6, "num_partial_branches": 0, "covered_branches": 6, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 249, "executed_branches": [[252, 253], [252, 255], [256, 257], [256, 262], [257, 258], [257, 259]], "missing_branches": []}, "get_declared_dependencies": {"executed_lines": [267, 268, 270, 271, 273, 274, 276, 277, 278, 279, 280, 281, 282, 284, 285, 286, 287, 288, 289, 291], "summary": {"covered_lines": 20, "num_statements": 20, "percent_covered": 97.05882352941177, "percent_covered_display": "97.06", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 14, "num_partial_branches": 1, "covered_branches": 13, "missing_branches": 1, "percent_branches_covered": 92.85714285714286, "percent_branches_covered_display": "92.86"}, "missing_lines": [], "excluded_lines": [], "start_line": 265, "executed_branches": [[267, 268], [267, 270], [276, 277], [276, 284], [278, 276], [278, 279], [281, 282], [284, 285], [284, 291], [286, 284], [286, 287], [288, 286], [288, 289]], "missing_branches": [[281, 276]]}, "find_missing_dependencies": {"executed_lines": [296, 297, 300, 301, 303, 304, 305, 306, 307, 308, 310], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 4, "num_partial_branches": 0, "covered_branches": 4, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 294, "executed_branches": [[304, 305], [304, 310], [307, 304], [307, 308]], "missing_branches": []}, "add_dependencies_to_pyproject": {"executed_lines": [315, 316, 318, 319, 324, 326, 327, 328, 329, 330, 331, 332, 334, 336, 337, 338, 339, 340, 341, 342, 343, 345, 346, 348], "summary": {"covered_lines": 24, "num_statements": 24, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 12, "num_partial_branches": 0, "covered_branches": 12, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 313, "executed_branches": [[315, 316], [315, 318], [318, 319], [318, 324], [329, 330], [329, 334], [337, 338], [337, 345], [339, 340], [339, 341], [345, 346], [345, 348]], "missing_branches": []}, "main": {"executed_lines": [353, 354, 359, 364, 366, 368, 369, 370, 372, 373, 374, 376, 377, 378, 379, 380, 382, 383, 385, 386, 387, 389, 390], "summary": {"covered_lines": 23, "num_statements": 23, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 10, "num_partial_branches": 0, "covered_branches": 10, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 351, "executed_branches": [[368, 369], [368, 372], [373, 374], [373, 376], [376, 377], [376, 385], [378, 379], [378, 382], [385, 386], [385, 389]], "missing_branches": []}, "": {"executed_lines": [9, 11, 12, 13, 14, 15, 16, 17, 19, 20, 21, 22, 25, 26, 27, 31, 33, 34, 38, 107, 116, 143, 179, 185, 188, 198, 202, 208, 211, 228, 249, 265, 294, 313, 351], "summary": {"covered_lines": 35, "num_statements": 35, "percent_covered": 97.29729729729729, "percent_covered_display": "97.30", "missing_lines": 0, "excluded_lines": 4, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 2, "num_partial_branches": 1, "covered_branches": 1, "missing_branches": 1, "percent_branches_covered": 50.0, "percent_branches_covered_display": "50.00"}, "missing_lines": [], "excluded_lines": [28, 29, 393, 394], "start_line": 1, "executed_branches": [[21, 22]], "missing_branches": [[21, 25]]}}, "classes": {"": {"executed_lines": [9, 11, 12, 13, 14, 15, 16, 17, 19, 20, 21, 22, 25, 26, 27, 31, 33, 34, 38, 107, 116, 143, 149, 150, 152, 153, 154, 156, 158, 167, 170, 171, 173, 174, 176, 179, 181, 185, 188, 198, 199, 202, 205, 208, 211, 214, 215, 216, 218, 219, 222, 223, 225, 228, 230, 231, 232, 233, 234, 236, 237, 238, 239, 240, 241, 242, 243, 244, 246, 249, 251, 252, 253, 255, 256, 257, 258, 259, 260, 262, 265, 267, 268, 270, 271, 273, 274, 276, 277, 278, 279, 280, 281, 282, 284, 285, 286, 287, 288, 289, 291, 294, 296, 297, 300, 301, 303, 304, 305, 306, 307, 308, 310, 313, 315, 316, 318, 319, 324, 326, 327, 328, 329, 330, 331, 332, 334, 336, 337, 338, 339, 340, 341, 342, 343, 345, 346, 348, 351, 353, 354, 359, 364, 366, 368, 369, 370, 372, 373, 374, 376, 377, 378, 379, 380, 382, 383, 385, 386, 387, 389, 390], "summary": {"covered_lines": 162, "num_statements": 163, "percent_covered": 98.29787234042553, "percent_covered_display": "98.30", "missing_lines": 1, "excluded_lines": 4, "percent_statements_covered": 99.38650306748467, "percent_statements_covered_display": "99.39", "num_branches": 72, "num_partial_branches": 3, "covered_branches": 69, "missing_branches": 3, "percent_branches_covered": 95.83333333333333, "percent_branches_covered_display": "95.83"}, "missing_lines": [220], "excluded_lines": [28, 29, 393, 394], "start_line": 1, "executed_branches": [[21, 22], [152, 153], [152, 176], [153, 154], [153, 156], [156, 152], [156, 158], [158, 167], [158, 170], [170, 171], [170, 173], [173, 156], [173, 174], [215, 216], [215, 218], [219, 222], [237, 238], [237, 246], [238, 239], [238, 242], [239, 237], [239, 240], [242, 237], [242, 243], [252, 253], [252, 255], [256, 257], [256, 262], [257, 258], [257, 259], [267, 268], [267, 270], [276, 277], [276, 284], [278, 276], [278, 279], [281, 282], [284, 285], [284, 291], [286, 284], [286, 287], [288, 286], [288, 289], [304, 305], [304, 310], [307, 304], [307, 308], [315, 316], [315, 318], [318, 319], [318, 324], [329, 330], [329, 334], [337, 338], [337, 345], [339, 340], [339, 341], [345, 346], [345, 348], [368, 369], [368, 372], [373, 374], [373, 376], [376, 377], [376, 385], [378, 379], [378, 382], [385, 386], [385, 389]], "missing_branches": [[21, 25], [219, 220], [281, 276]]}}}, "scripts/sync_tool_versions.py": {"executed_lines": [3, 5, 6, 7, 8, 9, 10, 13, 15, 16, 19, 20, 23, 24, 25, 26, 29, 30, 33, 34, 37, 89, 93, 94, 95, 97, 98, 99, 100, 101, 102, 103, 104, 106, 107, 108, 109, 112, 115, 116, 118, 119, 120, 121, 122, 126, 127, 128, 129, 131, 132, 137, 140, 141, 144, 149, 154, 155, 157, 158, 159, 160, 162, 164, 166, 170, 171, 172, 173, 177, 179, 180, 181, 183], "summary": {"covered_lines": 74, "num_statements": 74, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 8, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 28, "num_partial_branches": 0, "covered_branches": 28, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [186, 187, 189, 191, 192, 193, 194, 195], "executed_branches": [[94, 95], [94, 97], [98, 99], [98, 106], [99, 100], [99, 101], [101, 102], [101, 103], [107, 108], [107, 109], [118, 119], [118, 137], [121, 122], [121, 126], [127, 118], [127, 128], [129, 118], [129, 131], [157, 158], [157, 159], [159, 160], [159, 162], [170, 171], [170, 179], [171, 172], [171, 173], [179, 180], [179, 183]], "missing_branches": [], "functions": {"_compile": {"executed_lines": [30], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 29, "executed_branches": [], "missing_branches": []}, "_format_entry": {"executed_lines": [34], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 33, "executed_branches": [], "missing_branches": []}, "parse_env_file": {"executed_lines": [94, 95, 97, 98, 99, 100, 101, 102, 103, 104, 106, 107, 108, 109], "summary": {"covered_lines": 14, "num_statements": 14, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 10, "num_partial_branches": 0, "covered_branches": 10, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 93, "executed_branches": [[94, 95], [94, 97], [98, 99], [98, 106], [99, 100], [99, 101], [101, 102], [101, 103], [107, 108], [107, 109]], "missing_branches": []}, "ensure_pyproject": {"executed_lines": [115, 116, 118, 119, 120, 121, 122, 126, 127, 128, 129, 131, 132, 137], "summary": {"covered_lines": 14, "num_statements": 14, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 8, "num_partial_branches": 0, "covered_branches": 8, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 112, "executed_branches": [[118, 119], [118, 137], [121, 122], [121, 126], [127, 118], [127, 128], [129, 118], [129, 131]], "missing_branches": []}, "main": {"executed_lines": [141, 144, 149, 154, 155, 157, 158, 159, 160, 162, 164, 166, 170, 171, 172, 173, 177, 179, 180, 181, 183], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 10, "num_partial_branches": 0, "covered_branches": 10, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 140, "executed_branches": [[157, 158], [157, 159], [159, 160], [159, 162], [170, 171], [170, 179], [171, 172], [171, 173], [179, 180], [179, 183]], "missing_branches": []}, "": {"executed_lines": [3, 5, 6, 7, 8, 9, 10, 13, 15, 16, 19, 20, 23, 24, 25, 26, 29, 33, 37, 89, 93, 112, 140], "summary": {"covered_lines": 23, "num_statements": 23, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 8, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [186, 187, 189, 191, 192, 193, 194, 195], "start_line": 1, "executed_branches": [], "missing_branches": []}}, "classes": {"ToolConfig": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 20, "executed_branches": [], "missing_branches": []}, "SyncError": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 89, "executed_branches": [], "missing_branches": []}, "": {"executed_lines": [3, 5, 6, 7, 8, 9, 10, 13, 15, 16, 19, 20, 23, 24, 25, 26, 29, 30, 33, 34, 37, 89, 93, 94, 95, 97, 98, 99, 100, 101, 102, 103, 104, 106, 107, 108, 109, 112, 115, 116, 118, 119, 120, 121, 122, 126, 127, 128, 129, 131, 132, 137, 140, 141, 144, 149, 154, 155, 157, 158, 159, 160, 162, 164, 166, 170, 171, 172, 173, 177, 179, 180, 181, 183], "summary": {"covered_lines": 74, "num_statements": 74, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 8, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 28, "num_partial_branches": 0, "covered_branches": 28, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [186, 187, 189, 191, 192, 193, 194, 195], "start_line": 1, "executed_branches": [[94, 95], [94, 97], [98, 99], [98, 106], [99, 100], [99, 101], [101, 102], [101, 103], [107, 108], [107, 109], [118, 119], [118, 137], [121, 122], [121, 126], [127, 118], [127, 128], [129, 118], [129, 131], [157, 158], [157, 159], [159, 160], [159, 162], [170, 171], [170, 179], [171, 172], [171, 173], [179, 180], [179, 183]], "missing_branches": []}}}, "scripts/update_autofix_expectations.py": {"executed_lines": [3, 5, 6, 7, 9, 12, 13, 14, 15, 16, 19, 22, 23, 24, 25, 26, 28, 29, 30, 33, 34, 35, 36, 37, 38, 39, 40, 42, 44, 45, 46, 49, 50, 51, 52, 53], "summary": {"covered_lines": 36, "num_statements": 37, "percent_covered": 93.87755102040816, "percent_covered_display": "93.88", "missing_lines": 1, "excluded_lines": 2, "percent_statements_covered": 97.29729729729729, "percent_statements_covered_display": "97.30", "num_branches": 12, "num_partial_branches": 2, "covered_branches": 10, "missing_branches": 2, "percent_branches_covered": 83.33333333333333, "percent_branches_covered_display": "83.33"}, "missing_lines": [31], "excluded_lines": [56, 57], "executed_branches": [[24, 25], [24, 28], [30, 33], [37, 38], [37, 44], [38, 39], [38, 42], [44, 45], [50, 51], [50, 53]], "missing_branches": [[30, 31], [44, 46]], "functions": {"_update_constant": {"executed_lines": [23, 24, 25, 26, 28, 29, 30, 33, 34, 35, 36, 37, 38, 39, 40, 42, 44, 45, 46], "summary": {"covered_lines": 19, "num_statements": 20, "percent_covered": 90.0, "percent_covered_display": "90.00", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 95.0, "percent_statements_covered_display": "95.00", "num_branches": 10, "num_partial_branches": 2, "covered_branches": 8, "missing_branches": 2, "percent_branches_covered": 80.0, "percent_branches_covered_display": "80.00"}, "missing_lines": [31], "excluded_lines": [], "start_line": 22, "executed_branches": [[24, 25], [24, 28], [30, 33], [37, 38], [37, 44], [38, 39], [38, 42], [44, 45]], "missing_branches": [[30, 31], [44, 46]]}, "main": {"executed_lines": [50, 51, 52, 53], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 2, "num_partial_branches": 0, "covered_branches": 2, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 49, "executed_branches": [[50, 51], [50, 53]], "missing_branches": []}, "": {"executed_lines": [3, 5, 6, 7, 9, 12, 13, 14, 15, 16, 19, 22, 49], "summary": {"covered_lines": 13, "num_statements": 13, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 2, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [56, 57], "start_line": 1, "executed_branches": [], "missing_branches": []}}, "classes": {"AutofixTarget": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 13, "executed_branches": [], "missing_branches": []}, "": {"executed_lines": [3, 5, 6, 7, 9, 12, 13, 14, 15, 16, 19, 22, 23, 24, 25, 26, 28, 29, 30, 33, 34, 35, 36, 37, 38, 39, 40, 42, 44, 45, 46, 49, 50, 51, 52, 53], "summary": {"covered_lines": 36, "num_statements": 37, "percent_covered": 93.87755102040816, "percent_covered_display": "93.88", "missing_lines": 1, "excluded_lines": 2, "percent_statements_covered": 97.29729729729729, "percent_statements_covered_display": "97.30", "num_branches": 12, "num_partial_branches": 2, "covered_branches": 10, "missing_branches": 2, "percent_branches_covered": 83.33333333333333, "percent_branches_covered_display": "83.33"}, "missing_lines": [31], "excluded_lines": [56, 57], "start_line": 1, "executed_branches": [[24, 25], [24, 28], [30, 33], [37, 38], [37, 44], [38, 39], [38, 42], [44, 45], [50, 51], [50, 53]], "missing_branches": [[30, 31], [44, 46]]}}}, "scripts/update_residual_history.py": {"executed_lines": [8, 10, 11, 12, 14, 15, 16, 17, 18, 19, 20, 21, 22, 29, 30, 31, 32, 33, 34, 36, 39, 40, 41, 43, 44], "summary": {"covered_lines": 25, "num_statements": 25, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 4, "num_partial_branches": 0, "covered_branches": 4, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "executed_branches": [[31, 32], [31, 36], [40, 41], [40, 43]], "missing_branches": [], "functions": {"": {"executed_lines": [8, 10, 11, 12, 14, 15, 16, 17, 18, 19, 20, 21, 22, 29, 30, 31, 32, 33, 34, 36, 39, 40, 41, 43, 44], "summary": {"covered_lines": 25, "num_statements": 25, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 4, "num_partial_branches": 0, "covered_branches": 4, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 1, "executed_branches": [[31, 32], [31, 36], [40, 41], [40, 43]], "missing_branches": []}}, "classes": {"": {"executed_lines": [8, 10, 11, 12, 14, 15, 16, 17, 18, 19, 20, 21, 22, 29, 30, 31, 32, 33, 34, 36, 39, 40, 41, 43, 44], "summary": {"covered_lines": 25, "num_statements": 25, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 4, "num_partial_branches": 0, "covered_branches": 4, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 1, "executed_branches": [[31, 32], [31, 36], [40, 41], [40, 43]], "missing_branches": []}}}, "scripts/validate_version_pins.py": {"executed_lines": [12, 14, 15, 16, 17, 18, 19, 22, 25, 26, 28, 29, 31, 32, 33, 34, 35, 37, 40, 41, 42, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 59, 62, 63, 64, 65, 68, 70, 71, 72, 74, 75, 76, 77, 78, 79, 81, 82, 83, 86, 88, 89, 90, 91, 92, 93, 94, 95, 98, 106, 107, 110, 111, 112, 114, 115, 117, 118, 121, 122, 125, 127, 130, 131, 133, 134, 135, 136, 138, 141, 142, 144, 147, 148, 149, 150, 155, 158, 160, 161, 162, 164, 165, 166, 169, 171, 172, 174, 175, 177, 178, 179, 181, 182, 183, 185, 186, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 202, 203, 204, 205, 206, 207, 209, 210, 211, 212, 213, 214], "summary": {"covered_lines": 135, "num_statements": 135, "percent_covered": 99.50738916256158, "percent_covered_display": "99.51", "missing_lines": 0, "excluded_lines": 2, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 68, "num_partial_branches": 1, "covered_branches": 67, "missing_branches": 1, "percent_branches_covered": 98.52941176470588, "percent_branches_covered_display": "98.53"}, "missing_lines": [], "excluded_lines": [217, 218], "executed_branches": [[32, 33], [32, 34], [44, 45], [44, 46], [46, 47], [46, 48], [48, 49], [48, 50], [50, 51], [50, 52], [52, 53], [52, 54], [54, 55], [54, 56], [63, 64], [63, 65], [71, 72], [71, 74], [74, 75], [74, 83], [76, 77], [76, 78], [78, 79], [111, 112], [111, 114], [117, 118], [117, 121], [130, 131], [130, 155], [133, 130], [133, 134], [135, 136], [135, 138], [141, 142], [141, 144], [147, 133], [147, 148], [149, 147], [149, 150], [161, 162], [161, 164], [171, 172], [171, 174], [177, 178], [177, 209], [182, 183], [182, 185], [188, 189], [188, 202], [191, 192], [191, 195], [192, 193], [192, 194], [195, 196], [195, 199], [196, 197], [196, 198], [199, 188], [199, 200], [202, 203], [202, 205], [205, 206], [205, 207], [210, 211], [210, 212], [212, 213], [212, 214]], "missing_branches": [[78, 74]], "functions": {"VersionConstraint.parse": {"executed_lines": [31, 32, 33, 34, 35], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 2, "num_partial_branches": 0, "covered_branches": 2, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 29, "executed_branches": [[32, 33], [32, 34]], "missing_branches": []}, "VersionConstraint.satisfied_by": {"executed_lines": [40, 41, 42, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 12, "num_partial_branches": 0, "covered_branches": 12, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 37, "executed_branches": [[44, 45], [44, 46], [46, 47], [46, 48], [48, 49], [48, 50], [50, 51], [50, 52], [52, 53], [52, 54], [54, 55], [54, 56]], "missing_branches": []}, "parse_version": {"executed_lines": [62, 63, 64, 65], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 2, "num_partial_branches": 0, "covered_branches": 2, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 59, "executed_branches": [[63, 64], [63, 65]], "missing_branches": []}, "parse_env_file": {"executed_lines": [70, 71, 72, 74, 75, 76, 77, 78, 79, 81, 82, 83], "summary": {"covered_lines": 12, "num_statements": 12, "percent_covered": 95.0, "percent_covered_display": "95.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 8, "num_partial_branches": 1, "covered_branches": 7, "missing_branches": 1, "percent_branches_covered": 87.5, "percent_branches_covered_display": "87.50"}, "missing_lines": [], "excluded_lines": [], "start_line": 68, "executed_branches": [[71, 72], [71, 74], [74, 75], [74, 83], [76, 77], [76, 78], [78, 79]], "missing_branches": [[78, 74]]}, "get_package_requires": {"executed_lines": [88, 89, 90, 91, 92, 93, 94, 95], "summary": {"covered_lines": 8, "num_statements": 8, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 86, "executed_branches": [], "missing_branches": []}, "extract_base_requirement": {"executed_lines": [106, 107, 110, 111, 112, 114, 115, 117, 118, 121, 122], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 4, "num_partial_branches": 0, "covered_branches": 4, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 98, "executed_branches": [[111, 112], [111, 114], [117, 118], [117, 121]], "missing_branches": []}, "check_compatibility": {"executed_lines": [127, 130, 131, 133, 134, 135, 136, 138, 141, 142, 144, 147, 148, 149, 150, 155], "summary": {"covered_lines": 16, "num_statements": 16, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 12, "num_partial_branches": 0, "covered_branches": 12, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 125, "executed_branches": [[130, 131], [130, 155], [133, 130], [133, 134], [135, 136], [135, 138], [141, 142], [141, 144], [147, 133], [147, 148], [149, 147], [149, 150]], "missing_branches": []}, "validate_file": {"executed_lines": [160, 161, 162, 164, 165, 166], "summary": {"covered_lines": 6, "num_statements": 6, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 2, "num_partial_branches": 0, "covered_branches": 2, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 158, "executed_branches": [[161, 162], [161, 164]], "missing_branches": []}, "main": {"executed_lines": [171, 172, 174, 175, 177, 178, 179, 181, 182, 183, 185, 186, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 202, 203, 204, 205, 206, 207, 209, 210, 211, 212, 213, 214], "summary": {"covered_lines": 37, "num_statements": 37, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 26, "num_partial_branches": 0, "covered_branches": 26, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 169, "executed_branches": [[171, 172], [171, 174], [177, 178], [177, 209], [182, 183], [182, 185], [188, 189], [188, 202], [191, 192], [191, 195], [192, 193], [192, 194], [195, 196], [195, 199], [196, 197], [196, 198], [199, 188], [199, 200], [202, 203], [202, 205], [205, 206], [205, 207], [210, 211], [210, 212], [212, 213], [212, 214]], "missing_branches": []}, "": {"executed_lines": [12, 14, 15, 16, 17, 18, 19, 22, 25, 26, 28, 29, 37, 59, 68, 86, 98, 125, 158, 169], "summary": {"covered_lines": 20, "num_statements": 20, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 2, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [217, 218], "start_line": 1, "executed_branches": [], "missing_branches": []}}, "classes": {"VersionConstraint": {"executed_lines": [31, 32, 33, 34, 35, 40, 41, 42, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 14, "num_partial_branches": 0, "covered_branches": 14, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 22, "executed_branches": [[32, 33], [32, 34], [44, 45], [44, 46], [46, 47], [46, 48], [48, 49], [48, 50], [50, 51], [50, 52], [52, 53], [52, 54], [54, 55], [54, 56]], "missing_branches": []}, "": {"executed_lines": [12, 14, 15, 16, 17, 18, 19, 22, 25, 26, 28, 29, 37, 59, 62, 63, 64, 65, 68, 70, 71, 72, 74, 75, 76, 77, 78, 79, 81, 82, 83, 86, 88, 89, 90, 91, 92, 93, 94, 95, 98, 106, 107, 110, 111, 112, 114, 115, 117, 118, 121, 122, 125, 127, 130, 131, 133, 134, 135, 136, 138, 141, 142, 144, 147, 148, 149, 150, 155, 158, 160, 161, 162, 164, 165, 166, 169, 171, 172, 174, 175, 177, 178, 179, 181, 182, 183, 185, 186, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 202, 203, 204, 205, 206, 207, 209, 210, 211, 212, 213, 214], "summary": {"covered_lines": 114, "num_statements": 114, "percent_covered": 99.4047619047619, "percent_covered_display": "99.40", "missing_lines": 0, "excluded_lines": 2, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 54, "num_partial_branches": 1, "covered_branches": 53, "missing_branches": 1, "percent_branches_covered": 98.14814814814815, "percent_branches_covered_display": "98.15"}, "missing_lines": [], "excluded_lines": [217, 218], "start_line": 1, "executed_branches": [[63, 64], [63, 65], [71, 72], [71, 74], [74, 75], [74, 83], [76, 77], [76, 78], [78, 79], [111, 112], [111, 114], [117, 118], [117, 121], [130, 131], [130, 155], [133, 130], [133, 134], [135, 136], [135, 138], [141, 142], [141, 144], [147, 133], [147, 148], [149, 147], [149, 150], [161, 162], [161, 164], [171, 172], [171, 174], [177, 178], [177, 209], [182, 183], [182, 185], [188, 189], [188, 202], [191, 192], [191, 195], [192, 193], [192, 194], [195, 196], [195, 199], [196, 197], [196, 198], [199, 188], [199, 200], [202, 203], [202, 205], [205, 206], [205, 207], [210, 211], [210, 212], [212, 213], [212, 214]], "missing_branches": [[78, 74]]}}}, "scripts/workflow_health_check.py": {"executed_lines": [8, 9, 10, 11, 12, 15, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 30, 32, 33, 35, 36, 39, 41, 43, 44, 45, 46, 47, 49, 51, 54, 56, 58, 59, 60, 61, 62, 63, 64, 65, 69, 72, 84, 86, 87, 89, 98, 102, 105], "summary": {"covered_lines": 49, "num_statements": 77, "percent_covered": 62.61682242990654, "percent_covered_display": "62.62", "missing_lines": 28, "excluded_lines": 2, "percent_statements_covered": 63.63636363636363, "percent_statements_covered_display": "63.64", "num_branches": 30, "num_partial_branches": 2, "covered_branches": 18, "missing_branches": 12, "percent_branches_covered": 60.0, "percent_branches_covered_display": "60.00"}, "missing_lines": [66, 68, 74, 75, 76, 77, 79, 80, 81, 99, 100, 107, 108, 110, 112, 113, 114, 115, 116, 117, 119, 120, 121, 122, 125, 126, 127, 128], "excluded_lines": [131, 132], "executed_branches": [[19, 20], [19, 22], [23, 24], [23, 27], [25, 26], [32, 33], [32, 35], [44, 45], [44, 51], [46, 47], [46, 49], [59, 60], [59, 69], [61, 59], [61, 62], [64, 59], [64, 65], [98, 102]], "missing_branches": [[25, 23], [74, 75], [74, 76], [76, 77], [76, 79], [98, 99], [119, 120], [119, 125], [121, 122], [121, 125], [126, -105], [126, 127]], "functions": {"load_workflow_runs": {"executed_lines": [17, 18, 19, 20, 22, 23, 24, 25, 26, 27], "summary": {"covered_lines": 10, "num_statements": 10, "percent_covered": 93.75, "percent_covered_display": "93.75", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 6, "num_partial_branches": 1, "covered_branches": 5, "missing_branches": 1, "percent_branches_covered": 83.33333333333333, "percent_branches_covered_display": "83.33"}, "missing_lines": [], "excluded_lines": [], "start_line": 15, "executed_branches": [[19, 20], [19, 22], [23, 24], [23, 27], [25, 26]], "missing_branches": [[25, 23]]}, "calculate_success_rate": {"executed_lines": [32, 33, 35, 36], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 2, "num_partial_branches": 0, "covered_branches": 2, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 30, "executed_branches": [[32, 33], [32, 35]], "missing_branches": []}, "analyze_failure_patterns": {"executed_lines": [41, 43, 44, 45, 46, 47, 49, 51], "summary": {"covered_lines": 8, "num_statements": 8, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 4, "num_partial_branches": 0, "covered_branches": 4, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 39, "executed_branches": [[44, 45], [44, 51], [46, 47], [46, 49]], "missing_branches": []}, "get_recent_runs": {"executed_lines": [56, 58, 59, 60, 61, 62, 63, 64, 65, 69], "summary": {"covered_lines": 10, "num_statements": 12, "percent_covered": 88.88888888888889, "percent_covered_display": "88.89", "missing_lines": 2, "excluded_lines": 0, "percent_statements_covered": 83.33333333333333, "percent_statements_covered_display": "83.33", "num_branches": 6, "num_partial_branches": 0, "covered_branches": 6, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [66, 68], "excluded_lines": [], "start_line": 54, "executed_branches": [[59, 60], [59, 69], [61, 59], [61, 62], [64, 59], [64, 65]], "missing_branches": []}, "format_duration": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 7, "percent_covered": 0.0, "percent_covered_display": "0.00", "missing_lines": 7, "excluded_lines": 0, "percent_statements_covered": 0.0, "percent_statements_covered_display": "0.00", "num_branches": 4, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 4, "percent_branches_covered": 0.0, "percent_branches_covered_display": "0.00"}, "missing_lines": [74, 75, 76, 77, 79, 80, 81], "excluded_lines": [], "start_line": 72, "executed_branches": [], "missing_branches": [[74, 75], [74, 76], [76, 77], [76, 79]]}, "generate_report": {"executed_lines": [86, 87, 89, 98, 102], "summary": {"covered_lines": 5, "num_statements": 7, "percent_covered": 66.66666666666667, "percent_covered_display": "66.67", "missing_lines": 2, "excluded_lines": 0, "percent_statements_covered": 71.42857142857143, "percent_statements_covered_display": "71.43", "num_branches": 2, "num_partial_branches": 1, "covered_branches": 1, "missing_branches": 1, "percent_branches_covered": 50.0, "percent_branches_covered_display": "50.00"}, "missing_lines": [99, 100], "excluded_lines": [], "start_line": 84, "executed_branches": [[98, 102]], "missing_branches": [[98, 99]]}, "main": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 17, "percent_covered": 0.0, "percent_covered_display": "0.00", "missing_lines": 17, "excluded_lines": 0, "percent_statements_covered": 0.0, "percent_statements_covered_display": "0.00", "num_branches": 6, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 6, "percent_branches_covered": 0.0, "percent_branches_covered_display": "0.00"}, "missing_lines": [107, 108, 110, 112, 113, 114, 115, 116, 117, 119, 120, 121, 122, 125, 126, 127, 128], "excluded_lines": [], "start_line": 105, "executed_branches": [], "missing_branches": [[119, 120], [119, 125], [121, 122], [121, 125], [126, -105], [126, 127]]}, "": {"executed_lines": [8, 9, 10, 11, 12, 15, 30, 39, 54, 72, 84, 105], "summary": {"covered_lines": 12, "num_statements": 12, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 2, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [131, 132], "start_line": 1, "executed_branches": [], "missing_branches": []}}, "classes": {"": {"executed_lines": [8, 9, 10, 11, 12, 15, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 30, 32, 33, 35, 36, 39, 41, 43, 44, 45, 46, 47, 49, 51, 54, 56, 58, 59, 60, 61, 62, 63, 64, 65, 69, 72, 84, 86, 87, 89, 98, 102, 105], "summary": {"covered_lines": 49, "num_statements": 77, "percent_covered": 62.61682242990654, "percent_covered_display": "62.62", "missing_lines": 28, "excluded_lines": 2, "percent_statements_covered": 63.63636363636363, "percent_statements_covered_display": "63.64", "num_branches": 30, "num_partial_branches": 2, "covered_branches": 18, "missing_branches": 12, "percent_branches_covered": 60.0, "percent_branches_covered_display": "60.00"}, "missing_lines": [66, 68, 74, 75, 76, 77, 79, 80, 81, 99, 100, 107, 108, 110, 112, 113, 114, 115, 116, 117, 119, 120, 121, 122, 125, 126, 127, 128], "excluded_lines": [131, 132], "start_line": 1, "executed_branches": [[19, 20], [19, 22], [23, 24], [23, 27], [25, 26], [32, 33], [32, 35], [44, 45], [44, 51], [46, 47], [46, 49], [59, 60], [59, 69], [61, 59], [61, 62], [64, 59], [64, 65], [98, 102]], "missing_branches": [[25, 23], [74, 75], [74, 76], [76, 77], [76, 79], [98, 99], [119, 120], [119, 125], [121, 122], [121, 125], [126, -105], [126, 127]]}}}, "scripts/workflow_validator.py": {"executed_lines": [6, 7, 9, 12, 22, 31, 32, 33, 34, 35, 38, 47, 49, 50, 51, 52, 53, 54, 56, 57, 58, 62, 65, 74, 75, 77, 78, 79, 81, 84, 93, 94, 97, 104, 105, 106, 107, 109, 112, 121, 124, 125, 126, 127, 132, 133, 134, 135, 138, 141, 150, 158, 159, 163, 164, 165, 166, 168, 171, 180, 181, 183, 184, 186, 187, 189, 190, 192], "summary": {"covered_lines": 68, "num_statements": 72, "percent_covered": 93.26923076923077, "percent_covered_display": "93.27", "missing_lines": 4, "excluded_lines": 0, "percent_statements_covered": 94.44444444444444, "percent_statements_covered_display": "94.44", "num_branches": 32, "num_partial_branches": 3, "covered_branches": 29, "missing_branches": 3, "percent_branches_covered": 90.625, "percent_branches_covered_display": "90.62"}, "missing_lines": [129, 136, 160, 161], "excluded_lines": [], "executed_branches": [[50, 51], [50, 62], [52, 50], [52, 53], [56, 52], [56, 57], [57, 56], [57, 58], [77, 78], [77, 81], [78, 77], [78, 79], [104, 105], [104, 109], [106, 104], [106, 107], [125, 126], [125, 127], [127, 132], [133, 134], [133, 138], [135, 133], [159, 163], [183, 184], [183, 186], [186, 187], [186, 189], [189, 190], [189, 192]], "missing_branches": [[127, 129], [135, 136], [159, 160]], "functions": {"load_workflow": {"executed_lines": [31, 32, 33, 34, 35], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 22, "executed_branches": [], "missing_branches": []}, "check_deprecated_actions": {"executed_lines": [47, 49, 50, 51, 52, 53, 54, 56, 57, 58, 62], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 8, "num_partial_branches": 0, "covered_branches": 8, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 38, "executed_branches": [[50, 51], [50, 62], [52, 50], [52, 53], [56, 52], [56, 57], [57, 56], [57, 58]], "missing_branches": []}, "check_missing_timeout": {"executed_lines": [74, 75, 77, 78, 79, 81], "summary": {"covered_lines": 6, "num_statements": 6, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 4, "num_partial_branches": 0, "covered_branches": 4, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 65, "executed_branches": [[77, 78], [77, 81], [78, 77], [78, 79]], "missing_branches": []}, "check_hardcoded_secrets": {"executed_lines": [93, 94, 97, 104, 105, 106, 107, 109], "summary": {"covered_lines": 8, "num_statements": 8, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 4, "num_partial_branches": 0, "covered_branches": 4, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 84, "executed_branches": [[104, 105], [104, 109], [106, 104], [106, 107]], "missing_branches": []}, "check_permissions": {"executed_lines": [121, 124, 125, 126, 127, 132, 133, 134, 135, 138], "summary": {"covered_lines": 10, "num_statements": 12, "percent_covered": 80.0, "percent_covered_display": "80.00", "missing_lines": 2, "excluded_lines": 0, "percent_statements_covered": 83.33333333333333, "percent_statements_covered_display": "83.33", "num_branches": 8, "num_partial_branches": 2, "covered_branches": 6, "missing_branches": 2, "percent_branches_covered": 75.0, "percent_branches_covered_display": "75.00"}, "missing_lines": [129, 136], "excluded_lines": [], "start_line": 112, "executed_branches": [[125, 126], [125, 127], [127, 132], [133, 134], [133, 138], [135, 133]], "missing_branches": [[127, 129], [135, 136]]}, "validate_workflow": {"executed_lines": [150, 158, 159, 163, 164, 165, 166, 168], "summary": {"covered_lines": 8, "num_statements": 10, "percent_covered": 75.0, "percent_covered_display": "75.00", "missing_lines": 2, "excluded_lines": 0, "percent_statements_covered": 80.0, "percent_statements_covered_display": "80.00", "num_branches": 2, "num_partial_branches": 1, "covered_branches": 1, "missing_branches": 1, "percent_branches_covered": 50.0, "percent_branches_covered_display": "50.00"}, "missing_lines": [160, 161], "excluded_lines": [], "start_line": 141, "executed_branches": [[159, 163]], "missing_branches": [[159, 160]]}, "validate_all_workflows": {"executed_lines": [180, 181, 183, 184, 186, 187, 189, 190, 192], "summary": {"covered_lines": 9, "num_statements": 9, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 6, "num_partial_branches": 0, "covered_branches": 6, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 171, "executed_branches": [[183, 184], [183, 186], [186, 187], [186, 189], [189, 190], [189, 192]], "missing_branches": []}, "": {"executed_lines": [6, 7, 9, 12, 22, 38, 65, 84, 112, 141, 171], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 1, "executed_branches": [], "missing_branches": []}}, "classes": {"": {"executed_lines": [6, 7, 9, 12, 22, 31, 32, 33, 34, 35, 38, 47, 49, 50, 51, 52, 53, 54, 56, 57, 58, 62, 65, 74, 75, 77, 78, 79, 81, 84, 93, 94, 97, 104, 105, 106, 107, 109, 112, 121, 124, 125, 126, 127, 132, 133, 134, 135, 138, 141, 150, 158, 159, 163, 164, 165, 166, 168, 171, 180, 181, 183, 184, 186, 187, 189, 190, 192], "summary": {"covered_lines": 68, "num_statements": 72, "percent_covered": 93.26923076923077, "percent_covered_display": "93.27", "missing_lines": 4, "excluded_lines": 0, "percent_statements_covered": 94.44444444444444, "percent_statements_covered_display": "94.44", "num_branches": 32, "num_partial_branches": 3, "covered_branches": 29, "missing_branches": 3, "percent_branches_covered": 90.625, "percent_branches_covered_display": "90.62"}, "missing_lines": [129, 136, 160, 161], "excluded_lines": [], "start_line": 1, "executed_branches": [[50, 51], [50, 62], [52, 50], [52, 53], [56, 52], [56, 57], [57, 56], [57, 58], [77, 78], [77, 81], [78, 77], [78, 79], [104, 105], [104, 109], [106, 104], [106, 107], [125, 126], [125, 127], [127, 132], [133, 134], [133, 138], [135, 133], [159, 163], [183, 184], [183, 186], [186, 187], [186, 189], [189, 190], [189, 192]], "missing_branches": [[127, 129], [135, 136], [159, 160]]}}}}, "totals": {"covered_lines": 2631, "num_statements": 2798, "percent_covered": 92.20912352639672, "percent_covered_display": "92.21", "missing_lines": 167, "excluded_lines": 76, "percent_statements_covered": 94.03145103645461, "percent_statements_covered_display": "94.03", "num_branches": 1104, "num_partial_branches": 83, "covered_branches": 967, "missing_branches": 137, "percent_branches_covered": 87.59057971014492, "percent_branches_covered_display": "87.59"}} \ No newline at end of file +{"meta": {"format": 3, "version": "7.13.3", "timestamp": "2026-02-09T15:07:20.198243", "branch_coverage": true, "show_contexts": false}, "files": {"src/__init__.py": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "executed_branches": [], "missing_branches": [], "functions": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 1, "executed_branches": [], "missing_branches": []}}, "classes": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 1, "executed_branches": [], "missing_branches": []}}}, "src/aggregator.py": {"executed_lines": [3, 5, 6, 8, 11, 12, 13, 14, 15, 16, 17, 18, 20, 21, 22, 23, 27, 28, 29, 30, 31, 32, 33, 34, 35, 38, 42, 43, 44, 45, 46, 47, 48, 49, 50, 53, 57, 58, 59, 60, 61, 62, 63, 64, 66, 67, 68, 69, 72, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 99], "summary": {"covered_lines": 63, "num_statements": 65, "percent_covered": 95.04950495049505, "percent_covered_display": "95.05", "missing_lines": 2, "excluded_lines": 0, "percent_statements_covered": 96.92307692307692, "percent_statements_covered_display": "96.92", "num_branches": 36, "num_partial_branches": 3, "covered_branches": 33, "missing_branches": 3, "percent_branches_covered": 91.66666666666667, "percent_branches_covered_display": "91.67"}, "missing_lines": [19, 24], "excluded_lines": [], "executed_branches": [[12, 13], [12, 14], [14, 15], [14, 16], [16, 17], [18, 20], [29, 30], [29, 35], [30, 29], [30, 31], [31, 32], [31, 33], [33, 30], [33, 34], [43, 44], [43, 50], [45, 46], [45, 49], [47, 45], [47, 48], [59, 60], [59, 69], [61, 62], [61, 67], [63, 64], [63, 66], [80, 81], [80, 99], [82, 80], [82, 83], [84, 85], [84, 88], [86, 87]], "missing_branches": [[16, 24], [18, 19], [86, 84]], "functions": {"as_number": {"executed_lines": [12, 13, 14, 15, 16, 17, 18, 20, 21, 22, 23], "summary": {"covered_lines": 11, "num_statements": 13, "percent_covered": 80.95238095238095, "percent_covered_display": "80.95", "missing_lines": 2, "excluded_lines": 0, "percent_statements_covered": 84.61538461538461, "percent_statements_covered_display": "84.62", "num_branches": 8, "num_partial_branches": 2, "covered_branches": 6, "missing_branches": 2, "percent_branches_covered": 75.0, "percent_branches_covered_display": "75.00"}, "missing_lines": [19, 24], "excluded_lines": [], "start_line": 11, "executed_branches": [[12, 13], [12, 14], [14, 15], [14, 16], [16, 17], [18, 20]], "missing_branches": [[16, 24], [18, 19]]}, "infer_numeric_fields": {"executed_lines": [28, 29, 30, 31, 32, 33, 34, 35], "summary": {"covered_lines": 8, "num_statements": 8, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 8, "num_partial_branches": 0, "covered_branches": 8, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 27, "executed_branches": [[29, 30], [29, 35], [30, 29], [30, 31], [31, 32], [31, 33], [33, 30], [33, 34]], "missing_branches": []}, "aggregate_numeric_fields": {"executed_lines": [42, 43, 44, 45, 46, 47, 48, 49, 50], "summary": {"covered_lines": 9, "num_statements": 9, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 6, "num_partial_branches": 0, "covered_branches": 6, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 38, "executed_branches": [[43, 44], [43, 50], [45, 46], [45, 49], [47, 45], [47, 48]], "missing_branches": []}, "group_entries": {"executed_lines": [57, 58, 59, 60, 61, 62, 63, 64, 66, 67, 68, 69], "summary": {"covered_lines": 12, "num_statements": 12, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 6, "num_partial_branches": 0, "covered_branches": 6, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 53, "executed_branches": [[59, 60], [59, 69], [61, 62], [61, 67], [63, 64], [63, 66]], "missing_branches": []}, "build_grouped_aggregates": {"executed_lines": [77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 99], "summary": {"covered_lines": 14, "num_statements": 14, "percent_covered": 95.45454545454545, "percent_covered_display": "95.45", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 8, "num_partial_branches": 1, "covered_branches": 7, "missing_branches": 1, "percent_branches_covered": 87.5, "percent_branches_covered_display": "87.50"}, "missing_lines": [], "excluded_lines": [], "start_line": 72, "executed_branches": [[80, 81], [80, 99], [82, 80], [82, 83], [84, 85], [84, 88], [86, 87]], "missing_branches": [[86, 84]]}, "": {"executed_lines": [3, 5, 6, 8, 11, 27, 38, 53, 72], "summary": {"covered_lines": 9, "num_statements": 9, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 1, "executed_branches": [], "missing_branches": []}}, "classes": {"": {"executed_lines": [3, 5, 6, 8, 11, 12, 13, 14, 15, 16, 17, 18, 20, 21, 22, 23, 27, 28, 29, 30, 31, 32, 33, 34, 35, 38, 42, 43, 44, 45, 46, 47, 48, 49, 50, 53, 57, 58, 59, 60, 61, 62, 63, 64, 66, 67, 68, 69, 72, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 99], "summary": {"covered_lines": 63, "num_statements": 65, "percent_covered": 95.04950495049505, "percent_covered_display": "95.05", "missing_lines": 2, "excluded_lines": 0, "percent_statements_covered": 96.92307692307692, "percent_statements_covered_display": "96.92", "num_branches": 36, "num_partial_branches": 3, "covered_branches": 33, "missing_branches": 3, "percent_branches_covered": 91.66666666666667, "percent_branches_covered_display": "91.67"}, "missing_lines": [19, 24], "excluded_lines": [], "start_line": 1, "executed_branches": [[12, 13], [12, 14], [14, 15], [14, 16], [16, 17], [18, 20], [29, 30], [29, 35], [30, 29], [30, 31], [31, 32], [31, 33], [33, 30], [33, 34], [43, 44], [43, 50], [45, 46], [45, 49], [47, 45], [47, 48], [59, 60], [59, 69], [61, 62], [61, 67], [63, 64], [63, 66], [80, 81], [80, 99], [82, 80], [82, 83], [84, 85], [84, 88], [86, 87]], "missing_branches": [[16, 24], [18, 19], [86, 84]]}}}, "src/cli_parser.py": {"executed_lines": [3, 5, 6, 9, 10, 11, 12, 18, 19, 20, 21, 22, 24, 27, 28, 34, 40, 41, 46, 52, 58, 64, 70, 76, 79, 80, 81, 83, 84, 86], "summary": {"covered_lines": 30, "num_statements": 34, "percent_covered": 81.81818181818181, "percent_covered_display": "81.82", "missing_lines": 4, "excluded_lines": 0, "percent_statements_covered": 88.23529411764706, "percent_statements_covered_display": "88.24", "num_branches": 10, "num_partial_branches": 2, "covered_branches": 6, "missing_branches": 4, "percent_branches_covered": 60.0, "percent_branches_covered_display": "60.00"}, "missing_lines": [13, 14, 15, 23], "excluded_lines": [], "executed_branches": [[11, 12], [20, 21], [20, 22], [22, 24], [83, 84], [83, 86]], "missing_branches": [[11, 13], [13, 14], [13, 15], [22, 23]], "functions": {"_existing_file": {"executed_lines": [10, 11, 12], "summary": {"covered_lines": 3, "num_statements": 6, "percent_covered": 40.0, "percent_covered_display": "40.00", "missing_lines": 3, "excluded_lines": 0, "percent_statements_covered": 50.0, "percent_statements_covered_display": "50.00", "num_branches": 4, "num_partial_branches": 1, "covered_branches": 1, "missing_branches": 3, "percent_branches_covered": 25.0, "percent_branches_covered_display": "25.00"}, "missing_lines": [13, 14, 15], "excluded_lines": [], "start_line": 9, "executed_branches": [[11, 12]], "missing_branches": [[11, 13], [13, 14], [13, 15]]}, "_existing_dir": {"executed_lines": [19, 20, 21, 22, 24], "summary": {"covered_lines": 5, "num_statements": 6, "percent_covered": 80.0, "percent_covered_display": "80.00", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 83.33333333333333, "percent_statements_covered_display": "83.33", "num_branches": 4, "num_partial_branches": 1, "covered_branches": 3, "missing_branches": 1, "percent_branches_covered": 75.0, "percent_branches_covered_display": "75.00"}, "missing_lines": [23], "excluded_lines": [], "start_line": 18, "executed_branches": [[20, 21], [20, 22], [22, 24]], "missing_branches": [[22, 23]]}, "build_parser": {"executed_lines": [28, 34, 40, 41, 46, 52, 58, 64, 70, 76], "summary": {"covered_lines": 10, "num_statements": 10, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 27, "executed_branches": [], "missing_branches": []}, "parse_args": {"executed_lines": [80, 81, 83, 84, 86], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 2, "num_partial_branches": 0, "covered_branches": 2, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 79, "executed_branches": [[83, 84], [83, 86]], "missing_branches": []}, "": {"executed_lines": [3, 5, 6, 9, 18, 27, 79], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 1, "executed_branches": [], "missing_branches": []}}, "classes": {"": {"executed_lines": [3, 5, 6, 9, 10, 11, 12, 18, 19, 20, 21, 22, 24, 27, 28, 34, 40, 41, 46, 52, 58, 64, 70, 76, 79, 80, 81, 83, 84, 86], "summary": {"covered_lines": 30, "num_statements": 34, "percent_covered": 81.81818181818181, "percent_covered_display": "81.82", "missing_lines": 4, "excluded_lines": 0, "percent_statements_covered": 88.23529411764706, "percent_statements_covered_display": "88.24", "num_branches": 10, "num_partial_branches": 2, "covered_branches": 6, "missing_branches": 4, "percent_branches_covered": 60.0, "percent_branches_covered_display": "60.00"}, "missing_lines": [13, 14, 15, 23], "excluded_lines": [], "start_line": 1, "executed_branches": [[11, 12], [20, 21], [20, 22], [22, 24], [83, 84], [83, 86]], "missing_branches": [[11, 13], [13, 14], [13, 15], [22, 23]]}}}, "src/ndjson_parser.py": {"executed_lines": [3, 5, 6, 7, 8, 11, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 31, 32, 35, 37, 38, 39, 40, 41], "summary": {"covered_lines": 27, "num_statements": 27, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 6, "num_partial_branches": 0, "covered_branches": 6, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "executed_branches": [[19, 20], [19, 32], [21, 22], [21, 23], [28, 29], [28, 31]], "missing_branches": [], "functions": {"parse_ndjson_lines": {"executed_lines": [17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 31, 32], "summary": {"covered_lines": 15, "num_statements": 15, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 6, "num_partial_branches": 0, "covered_branches": 6, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 11, "executed_branches": [[19, 20], [19, 32], [21, 22], [21, 23], [28, 29], [28, 31]], "missing_branches": []}, "read_ndjson_file": {"executed_lines": [37, 38, 39, 40, 41], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 35, "executed_branches": [], "missing_branches": []}, "": {"executed_lines": [3, 5, 6, 7, 8, 11, 35], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 1, "executed_branches": [], "missing_branches": []}}, "classes": {"": {"executed_lines": [3, 5, 6, 7, 8, 11, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 31, 32, 35, 37, 38, 39, 40, 41], "summary": {"covered_lines": 27, "num_statements": 27, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 6, "num_partial_branches": 0, "covered_branches": 6, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 1, "executed_branches": [[19, 20], [19, 32], [21, 22], [21, 23], [28, 29], [28, 31]], "missing_branches": []}}}, "src/percentile_calculator.py": {"executed_lines": [14, 16, 17, 20, 22, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 41, 43, 44, 45, 46, 47, 48], "summary": {"covered_lines": 27, "num_statements": 28, "percent_covered": 95.0, "percent_covered_display": "95.00", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 96.42857142857143, "percent_statements_covered_display": "96.43", "num_branches": 12, "num_partial_branches": 1, "covered_branches": 11, "missing_branches": 1, "percent_branches_covered": 91.66666666666667, "percent_branches_covered_display": "91.67"}, "missing_lines": [23], "excluded_lines": [], "executed_branches": [[22, 24], [24, 25], [24, 26], [26, 27], [26, 28], [28, 29], [28, 30], [33, 34], [33, 35], [44, 45], [44, 46]], "missing_branches": [[22, 23]], "functions": {"percentile": {"executed_lines": [22, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38], "summary": {"covered_lines": 16, "num_statements": 17, "percent_covered": 92.5925925925926, "percent_covered_display": "92.59", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 94.11764705882354, "percent_statements_covered_display": "94.12", "num_branches": 10, "num_partial_branches": 1, "covered_branches": 9, "missing_branches": 1, "percent_branches_covered": 90.0, "percent_branches_covered_display": "90.00"}, "missing_lines": [23], "excluded_lines": [], "start_line": 20, "executed_branches": [[22, 24], [24, 25], [24, 26], [26, 27], [26, 28], [28, 29], [28, 30], [33, 34], [33, 35]], "missing_branches": [[22, 23]]}, "summarize_values": {"executed_lines": [43, 44, 45, 46, 47, 48], "summary": {"covered_lines": 6, "num_statements": 6, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 2, "num_partial_branches": 0, "covered_branches": 2, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 41, "executed_branches": [[44, 45], [44, 46]], "missing_branches": []}, "": {"executed_lines": [14, 16, 17, 20, 41], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100.00", "missing_lines": 0, "excluded_lines": 0, "percent_statements_covered": 100.0, "percent_statements_covered_display": "100.00", "num_branches": 0, "num_partial_branches": 0, "covered_branches": 0, "missing_branches": 0, "percent_branches_covered": 100.0, "percent_branches_covered_display": "100.00"}, "missing_lines": [], "excluded_lines": [], "start_line": 1, "executed_branches": [], "missing_branches": []}}, "classes": {"": {"executed_lines": [14, 16, 17, 20, 22, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 41, 43, 44, 45, 46, 47, 48], "summary": {"covered_lines": 27, "num_statements": 28, "percent_covered": 95.0, "percent_covered_display": "95.00", "missing_lines": 1, "excluded_lines": 0, "percent_statements_covered": 96.42857142857143, "percent_statements_covered_display": "96.43", "num_branches": 12, "num_partial_branches": 1, "covered_branches": 11, "missing_branches": 1, "percent_branches_covered": 91.66666666666667, "percent_branches_covered_display": "91.67"}, "missing_lines": [23], "excluded_lines": [], "start_line": 1, "executed_branches": [[22, 24], [24, 25], [24, 26], [26, 27], [26, 28], [28, 29], [28, 30], [33, 34], [33, 35], [44, 45], [44, 46]], "missing_branches": [[22, 23]]}}}}, "totals": {"covered_lines": 147, "num_statements": 154, "percent_covered": 93.11926605504587, "percent_covered_display": "93.12", "missing_lines": 7, "excluded_lines": 0, "percent_statements_covered": 95.45454545454545, "percent_statements_covered_display": "95.45", "num_branches": 64, "num_partial_branches": 6, "covered_branches": 56, "missing_branches": 8, "percent_branches_covered": 87.5, "percent_branches_covered_display": "87.50"}} \ No newline at end of file diff --git a/fix_duplicates.py b/fix_duplicates.py index ddcc057f7..21a1dbe3e 100644 --- a/fix_duplicates.py +++ b/fix_duplicates.py @@ -7,7 +7,7 @@ base = Path(".github/workflows") -def remove_duplicate_app_tokens(filepath): +def remove_duplicate_app_tokens(filepath: Path) -> bool: """Remove consecutive duplicate Mint GitHub App Token steps.""" with open(filepath) as f: lines = f.readlines() diff --git a/fix_indentation.py b/fix_indentation.py index 28d7bc2a8..e90fecbd6 100644 --- a/fix_indentation.py +++ b/fix_indentation.py @@ -17,22 +17,26 @@ for i, line in enumerate(lines): # Track when we're in a steps section - if re.match(r"^(\s*)steps:\s*$", line): + steps_match = re.match(r"^(\s*)steps:\s*$", line) + if steps_match: in_steps = True - steps_indent = len(re.match(r"^(\s*)", line).group(1)) + steps_indent = len(steps_match.group(1)) fixed_lines.append(line) continue # Check if we exit steps (new job or end of file) - if in_steps and re.match(r"^(\s*)\S", line): - indent = len(re.match(r"^(\s*)", line).group(1)) - if indent <= steps_indent: - in_steps = False + if in_steps: + indent_match = re.match(r"^(\s*)\S", line) + if indent_match: + indent = len(indent_match.group(1)) + if indent <= steps_indent: + in_steps = False # Fix step items that are at wrong indentation - if in_steps and re.match(r"^(\s+)- name:", line): + step_match = re.match(r"^(\s+)- name:", line) + if in_steps and step_match: expected_indent = steps_indent + 2 - actual_indent = len(re.match(r"^(\s+)", line).group(1)) + actual_indent = len(step_match.group(1)) if actual_indent != expected_indent: # Re-indent this step line = " " * expected_indent + line.lstrip() @@ -40,15 +44,13 @@ # Fix properties under steps that should be indented more if in_steps and i > 0: prev = fixed_lines[-1] if fixed_lines else "" - if ( - re.match(r"^(\s+)- name:", prev) - and re.match(r"^(\s+)(\w+):", line) - and not line.strip().startswith("- ") - ): + prev_match = re.match(r"^(\s+)- name:", prev) + line_match = re.match(r"^(\s+)(\w+):", line) + if prev_match and line_match and not line.strip().startswith("- "): # This should be a property of the step - prev_indent = len(re.match(r"^(\s+)", prev).group(1)) + prev_indent = len(prev_match.group(1)) expected_indent = prev_indent + 2 - actual_indent = len(re.match(r"^(\s+)", line).group(1)) + actual_indent = len(line_match.group(1)) if actual_indent != expected_indent: line = " " * expected_indent + line.lstrip() diff --git a/fix_token_placement.py b/fix_token_placement.py index db1db06ba..f5e51bdda 100644 --- a/fix_token_placement.py +++ b/fix_token_placement.py @@ -2,6 +2,7 @@ """Fix github-token in wrong location (after script: | instead of before).""" import re +from re import Match files = [ "agents-capability-check.yml", @@ -22,7 +23,7 @@ # Find all instances where github-token comes after script content pattern = r"( uses: actions/github-script@v8\s*\n with:\s*\n script: \|[^\n]*\n(?: [^\n]*\n)*?) github-token: (\$\{\{ [^}]+ \}\})\n\n( )" - def fix_token_placement(match): + def fix_token_placement(match: Match[str]) -> str: script_part = match.group(1) token = match.group(2) code_start = match.group(3) diff --git a/pyproject.toml b/pyproject.toml index 3f3f4e893..cf6091ba7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -143,6 +143,7 @@ disable_error_code = "import-untyped" exclude = [ "^archive/", "^\\.extraction/", + "^templates/", ] [[tool.mypy.overrides]] diff --git a/pytest-junit.xml b/pytest-junit.xml new file mode 100644 index 000000000..b85c3f4d7 --- /dev/null +++ b/pytest-junit.xml @@ -0,0 +1 @@ +/home/runner/work/Workflows/Workflows/tests/scripts/test_update_versions_from_pypi.py:51: PyPI not reachable in this test environment/home/runner/work/Workflows/Workflows/tests/scripts/test_update_versions_from_pypi.py:51: PyPI not reachable in this test environment/home/runner/work/Workflows/Workflows/tests/scripts/test_update_versions_from_pypi.py:51: PyPI not reachable in this test environment/home/runner/work/Workflows/Workflows/tests/scripts/test_update_versions_from_pypi.py:51: PyPI not reachable in this test environment/home/runner/work/Workflows/Workflows/tests/test_integration_repo_template.py:47: wheel is unavailable in the test environment/home/runner/work/Workflows/Workflows/tests/workflows/test_codex_belt_pipeline.py:216: needs-human: workflow updates require agent-high-privilege \ No newline at end of file diff --git a/scripts/keepalive-runner.js b/scripts/keepalive-runner.js index 6b36d10f9..b3898e080 100644 --- a/scripts/keepalive-runner.js +++ b/scripts/keepalive-runner.js @@ -796,6 +796,16 @@ function resolveDispatchToken(env = {}, instructionToken = '') { return ''; } +function stripTokenKeys(env = {}, keys = []) { + const cleaned = { ...env }; + for (const key of keys) { + if (Object.prototype.hasOwnProperty.call(cleaned, key)) { + delete cleaned[key]; + } + } + return cleaned; +} + async function runKeepalive({ core, github, context, env = process.env }) { const rawOptions = env.OPTIONS_JSON || '{}'; const dryRun = (env.DRY_RUN || '').trim().toLowerCase() === 'true'; @@ -803,6 +813,11 @@ async function runKeepalive({ core, github, context, env = process.env }) { const summary = core.summary; const traceSeed = generateTraceSeed(env.KEEPALIVE_TRACE || env.keepalive_trace || ''); const pausedLabel = 'agents:paused'; + const clearTokenDefaults = coerceBool( + env.CLEAR_TOKEN_DEFAULTS ?? env.clear_token_defaults, + false + ); + const tokenEnv = clearTokenDefaults ? stripTokenKeys(env, DISPATCH_TOKEN_KEYS) : env; const addHeading = () => { summary.addHeading('Codex Keepalive'); @@ -827,13 +842,13 @@ async function runKeepalive({ core, github, context, env = process.env }) { let dispatchToken = ''; let instructionAuthorOctokit = null; if (!dryRun) { - instructionAuthorToken = resolveInstructionToken(env); + instructionAuthorToken = resolveInstructionToken(tokenEnv); if (!instructionAuthorToken) { throw new Error( 'GitHub token is required to author keepalive instructions (app token, PAT, or GITHUB_TOKEN).' ); } - dispatchToken = resolveDispatchToken(env, instructionAuthorToken); + dispatchToken = resolveDispatchToken(tokenEnv, instructionAuthorToken); instructionAuthorOctokit = buildOctokitInstance({ core, @@ -937,23 +952,56 @@ async function runKeepalive({ core, github, context, env = process.env }) { ) .addEOL(); - const paginatePulls = tokenAwareGithub.paginate.iterator( - tokenAwareGithub.rest.pulls.list, - { owner, repo, state: 'open', per_page: 50 } - ); + const pullsPerPage = 50; + const pullsClient = tokenAwareGithub?.rest?.pulls?.list ? tokenAwareGithub : github; + const hasPaginationIterator = Boolean(pullsClient?.paginate?.iterator); + const iteratePulls = async function* () { + if (hasPaginationIterator) { + const iterator = pullsClient.paginate.iterator( + pullsClient.rest.pulls.list, + { owner, repo, state: 'open', per_page: pullsPerPage } + ); + for await (const page of iterator) { + yield page; + } + return; + } + + let page = 1; + while (true) { + const { data } = await withRetry( + (client) => + client.rest.pulls.list({ owner, repo, state: 'open', per_page: pullsPerPage, page }), + { github: pullsClient } + ); + const entries = Array.isArray(data) ? data : []; + if (!entries.length) { + break; + } + yield { data: entries }; + if (entries.length < pullsPerPage) { + break; + } + page += 1; + } + }; const fetchIssueComments = async (issueNumber) => { const comments = []; const perPage = 100; - const hasIterator = Boolean(tokenAwareGithub.paginate?.iterator); + const commentsClient = tokenAwareGithub?.rest?.issues?.listComments ? tokenAwareGithub : github; + const hasIterator = Boolean(commentsClient?.paginate?.iterator); if (hasIterator) { - const iterator = tokenAwareGithub.paginate.iterator(tokenAwareGithub.rest.issues.listComments, { - owner, - repo, - issue_number: issueNumber, - per_page: perPage, - }); + const iterator = commentsClient.paginate.iterator( + commentsClient.rest.issues.listComments, + { + owner, + repo, + issue_number: issueNumber, + per_page: perPage, + } + ); for await (const page of iterator) { const data = Array.isArray(page.data) ? page.data : []; @@ -964,13 +1012,17 @@ async function runKeepalive({ core, github, context, env = process.env }) { } else { let page = 1; while (true) { - const { data } = await withRetry((client) => client.rest.issues.listComments({ - owner, - repo, - issue_number: issueNumber, - per_page: perPage, - page, - })); + const { data } = await withRetry( + (client) => + client.rest.issues.listComments({ + owner, + repo, + issue_number: issueNumber, + per_page: perPage, + page, + }), + { github: commentsClient } + ); if (!Array.isArray(data) || !data.length) { break; } @@ -985,7 +1037,7 @@ async function runKeepalive({ core, github, context, env = process.env }) { return comments; }; - for await (const page of paginatePulls) { + for await (const page of iteratePulls()) { for (const pr of page.data) { if (scanned >= maxPrs) { limitReached = true; @@ -1205,13 +1257,15 @@ async function runKeepalive({ core, github, context, env = process.env }) { } if (assignableAssignees.length > 0) { + const assigneeClient = + tokenAwareGithub?.rest?.issues?.addAssignees ? tokenAwareGithub : github; core.info(`#${prNumber}: adding human assignees: ${assignableAssignees.join(', ')}`); await withRetry((client) => client.rest.issues.addAssignees({ owner, repo, issue_number: prNumber, assignees: assignableAssignees, - })); + }), { github: assigneeClient }); assignmentSummaries.push(`#${prNumber} – ensured assignees: ${assignableAssignees.join(', ')}`); } else { core.info(`#${prNumber}: no assignable human assignees available; skipping assignment.`); diff --git a/scripts/update_versions_from_pypi.py b/scripts/update_versions_from_pypi.py index 9b394a908..979d97cc0 100755 --- a/scripts/update_versions_from_pypi.py +++ b/scripts/update_versions_from_pypi.py @@ -18,6 +18,7 @@ import json import re import sys +import time import urllib.request from pathlib import Path from typing import NamedTuple @@ -48,6 +49,15 @@ class VersionInfo(NamedTuple): is_outdated: bool +def _is_prerelease(version: str) -> bool: + return re.search(r"(a|b|rc|dev|alpha|beta)\d*$", version, re.IGNORECASE) is not None + + +def _is_yanked(version: str, releases: dict[str, list[dict[str, object]]]) -> bool: + files = releases.get(version, []) + return bool(files) and all(f.get("yanked", False) for f in files) + + def get_latest_pypi_version(package_name: str) -> str | None: """Fetch the latest stable version from PyPI. @@ -55,37 +65,46 @@ def get_latest_pypi_version(package_name: str) -> str | None: Falls back to the latest release if all releases are prereleases. """ url = f"https://pypi.org/pypi/{package_name}/json" - try: - with urllib.request.urlopen(url, timeout=15) as resp: - data = json.loads(resp.read().decode()) - # Get the latest version (this is the current stable release) - latest: str | None = data.get("info", {}).get("version") - if latest: - return latest - - # Fallback: find the latest from releases - releases: dict[str, list[dict[str, object]]] = data.get("releases", {}) - if releases: - # Filter out prereleases and yanked versions - stable_versions: list[str] = [] - for ver, files in releases.items(): - # Skip if all files are yanked - if files and all(f.get("yanked", False) for f in files): - continue - # Skip prereleases (contains a, b, rc, dev, etc.) - if re.search(r"(a|b|rc|dev|alpha|beta)\d*$", ver, re.IGNORECASE): - continue - stable_versions.append(ver) - - if stable_versions: - # Sort by version tuple - stable_versions.sort(key=_version_tuple, reverse=True) - return stable_versions[0] - - return None - except Exception as e: - print(f" ⚠️ Could not fetch {package_name} from PyPI: {e}", file=sys.stderr) - return None + last_error: Exception | None = None + for attempt in range(3): + try: + with urllib.request.urlopen(url, timeout=15) as resp: + data = json.loads(resp.read().decode()) + latest: str | None = data.get("info", {}).get("version") + releases: dict[str, list[dict[str, object]]] = data.get("releases", {}) + + if latest and not _is_prerelease(latest) and not _is_yanked(latest, releases): + return latest + + # Fallback: find the latest from releases + if releases: + # Filter out prereleases and yanked versions + stable_versions: list[str] = [] + for ver, files in releases.items(): + # Skip if all files are yanked + if files and all(f.get("yanked", False) for f in files): + continue + # Skip prereleases (contains a, b, rc, dev, etc.) + if _is_prerelease(ver): + continue + stable_versions.append(ver) + + if stable_versions: + # Sort by version tuple + stable_versions.sort(key=_version_tuple, reverse=True) + return stable_versions[0] + + return None + except Exception as e: + last_error = e + if attempt < 2: + # Brief backoff to tolerate transient network issues. + time.sleep(0.5 * (attempt + 1)) + continue + break + + print(f" ⚠️ Could not fetch {package_name} from PyPI: {last_error}", file=sys.stderr) + return None def _version_tuple(version: str) -> tuple[int, ...]: diff --git a/templates/consumer-repo/.github/scripts/bot-comment-dismiss.js b/templates/consumer-repo/.github/scripts/bot-comment-dismiss.js index 95944edcf..697e07a3d 100644 --- a/templates/consumer-repo/.github/scripts/bot-comment-dismiss.js +++ b/templates/consumer-repo/.github/scripts/bot-comment-dismiss.js @@ -16,6 +16,151 @@ */ const DEFAULT_IGNORED_PATTERNS = ['.agents/**']; +const DEFAULT_MAX_AGE_SECONDS = 30; + +function escapeRegExp(value) { + return value.replace(/[\\^$.*+?()[\]{}|]/g, '\\$&'); +} + +function expandBraces(pattern) { + const start = pattern.indexOf('{'); + if (start === -1) { + return [pattern]; + } + let depth = 0; + let end = -1; + for (let i = start; i < pattern.length; i += 1) { + const char = pattern[i]; + if (char === '\\') { + i += 1; + continue; + } + if (char === '{') { + depth += 1; + } else if (char === '}') { + depth -= 1; + if (depth === 0) { + end = i; + break; + } + } + } + if (end === -1) { + return [pattern]; + } + const prefix = pattern.slice(0, start); + const suffix = pattern.slice(end + 1); + const body = pattern.slice(start + 1, end); + const parts = []; + let current = ''; + let nested = 0; + for (let i = 0; i < body.length; i += 1) { + const char = body[i]; + if (char === '\\') { + current += char; + if (i + 1 < body.length) { + current += body[i + 1]; + i += 1; + } + continue; + } + if (char === '{') { + nested += 1; + } else if (char === '}') { + nested -= 1; + } + if (char === ',' && nested === 0) { + parts.push(current); + current = ''; + continue; + } + current += char; + } + parts.push(current); + const expanded = []; + for (const part of parts) { + for (const next of expandBraces(`${prefix}${part}${suffix}`)) { + expanded.push(next); + } + } + return expanded; +} + +function globToRegExp(pattern) { + let regex = '^'; + for (let i = 0; i < pattern.length; i += 1) { + const char = pattern[i]; + if (char === '\\') { + const next = pattern[i + 1]; + if (next !== undefined) { + regex += escapeRegExp(next); + i += 1; + } else { + regex += '\\\\'; + } + continue; + } + if (char === '*') { + const next = pattern[i + 1]; + if (next === '*') { + regex += '.*'; + i += 1; + } else { + regex += '[^/]*'; + } + continue; + } + if (char === '?') { + regex += '[^/]'; + continue; + } + if (char === '[') { + let j = i + 1; + let content = ''; + let closed = false; + if (pattern[j] === '!' || pattern[j] === '^') { + content += '^'; + j += 1; + } + for (; j < pattern.length; j += 1) { + const inner = pattern[j]; + if (inner === '\\') { + if (j + 1 < pattern.length) { + content += `\\${pattern[j + 1]}`; + j += 1; + continue; + } + } + if (inner === ']') { + closed = true; + break; + } + content += inner; + } + if (closed) { + regex += `[${content}]`; + i = j; + } else { + regex += '\\['; + } + continue; + } + regex += escapeRegExp(char); + } + regex += '$'; + return new RegExp(regex); +} + +function minimatch(pathname, pattern) { + const patterns = expandBraces(pattern); + for (const expanded of patterns) { + const regex = globToRegExp(expanded); + if (regex.test(pathname)) { + return true; + } + } + return false; +} function parseCsv(value) { if (!value) { @@ -31,50 +176,35 @@ function normalizeAuthors(authors) { return new Set((authors || []).map((author) => String(author || '').toLowerCase()).filter(Boolean)); } -function normalizeSlashes(value) { +function normalizePath(value) { return String(value || '').replace(/\\/g, '/').toLowerCase(); } -function hasGlobPattern(value) { - return /[*?]/.test(value); -} - function normalizePattern(value) { - const normalized = normalizeSlashes(value); - if (!normalized) { + const raw = String(value || ''); + if (!raw) { return null; } - if (normalized.endsWith('/')) { - return `${normalized}**`; - } - if (!hasGlobPattern(normalized)) { - return normalized; - } - return normalized; -} - -function patternToRegex(pattern) { - const normalized = normalizeSlashes(pattern); - let regex = ''; - for (let i = 0; i < normalized.length; i += 1) { - const char = normalized[i]; - if (char === '*') { - const next = normalized[i + 1]; - if (next === '*') { - regex += '.*'; + let normalized = ''; + for (let i = 0; i < raw.length; i += 1) { + const char = raw[i]; + if (char === '\\') { + const next = raw[i + 1]; + if (next && /[\\*?[\]{}()]/.test(next)) { + normalized += `\\${next}`; i += 1; - } else { - regex += '[^/]*'; + continue; } + normalized += '/'; continue; } - if (char === '?') { - regex += '[^/]'; - continue; - } - regex += char.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + normalized += char; + } + normalized = normalized.toLowerCase(); + if (normalized.endsWith('/')) { + return `${normalized}**`; } - return new RegExp(`^${regex}$`); + return normalized; } function buildMatchers({ ignoredPaths, ignoredPatterns } = {}) { @@ -94,15 +224,15 @@ function buildMatchers({ ignoredPaths, ignoredPatterns } = {}) { if (!patterns.length) { patterns.push(...DEFAULT_IGNORED_PATTERNS); } - return patterns.map(patternToRegex); + return patterns; } function shouldIgnorePath(filename, matchers) { - const normalized = normalizeSlashes(filename); + const normalized = normalizePath(filename); if (!normalized) { return false; } - return matchers.some((pattern) => pattern.test(normalized)); + return matchers.some((pattern) => minimatch(normalized, pattern)); } function isBotAuthor(comment, botAuthors) { @@ -116,7 +246,51 @@ function resolveCommentTimestamp(comment) { if (!comment) { return null; } - return comment.created_at || comment.createdAt || null; + return comment.updated_at || comment.updatedAt || comment.created_at || comment.createdAt || null; +} + +function getArgValue(argv, name) { + if (!Array.isArray(argv)) { + return undefined; + } + for (let i = 0; i < argv.length; i += 1) { + const entry = argv[i]; + if (entry === name) { + if (i + 1 >= argv.length) { + return null; + } + return argv[i + 1]; + } + if (typeof entry === 'string' && entry.startsWith(`${name}=`)) { + return entry.slice(name.length + 1); + } + } + return undefined; +} + +function parsePositiveInt(value, label) { + const numberValue = typeof value === 'number' ? value : Number(value); + if (!Number.isFinite(numberValue) || !Number.isInteger(numberValue) || numberValue <= 0) { + throw new Error(`${label} must be a positive integer`); + } + return numberValue; +} + +function parseMaxAgeSeconds({ argv, env, defaultValue = DEFAULT_MAX_AGE_SECONDS } = {}) { + const cliValue = getArgValue(argv, '--maxAgeSeconds'); + const envValue = env ? env.MAX_AGE_SECONDS : undefined; + let rawValue = defaultValue; + + if (cliValue !== undefined) { + if (cliValue === null) { + throw new Error('maxAgeSeconds must be a positive integer'); + } + rawValue = cliValue; + } else if (envValue !== undefined) { + rawValue = envValue; + } + + return parsePositiveInt(rawValue, 'maxAgeSeconds'); } function collectDismissable(comments, options = {}) { @@ -271,24 +445,24 @@ async function autoDismissReviewComments(options = {}) { return { dismissable, ...result }; } -function runCli(env = process.env) { +function runCli(env = process.env, argv = process.argv.slice(2)) { const comments = env.COMMENTS_JSON ? JSON.parse(env.COMMENTS_JSON) : []; const ignoredPaths = parseCsv(env.IGNORED_PATHS); const ignoredPatterns = parseCsv(env.IGNORED_PATTERNS); const botAuthors = parseCsv(env.BOT_AUTHORS); - const maxAgeSeconds = env.MAX_AGE_SECONDS ? Number(env.MAX_AGE_SECONDS) : 30; + const maxAgeSeconds = parseMaxAgeSeconds({ argv, env }); const now = env.NOW_EPOCH_MS ? Number(env.NOW_EPOCH_MS) : undefined; const dismissable = collectDismissable(comments, { ignoredPaths, ignoredPatterns, botAuthors, - maxAgeSeconds: Number.isFinite(maxAgeSeconds) ? maxAgeSeconds : null, + maxAgeSeconds, now: Number.isFinite(now) ? now : undefined, }); const logs = dismissable.map((entry) => formatDismissLog(entry)); - return { dismissable, logs }; + return { dismissable, logs, maxAgeSeconds }; } if (require.main === module) { @@ -301,5 +475,6 @@ module.exports = { autoDismissReviewComments, dismissReviewComments, formatDismissLog, + parseMaxAgeSeconds, runCli, }; diff --git a/templates/consumer-repo/.github/scripts/merge_manager.js b/templates/consumer-repo/.github/scripts/merge_manager.js index c46ab1687..c2b39de6a 100644 --- a/templates/consumer-repo/.github/scripts/merge_manager.js +++ b/templates/consumer-repo/.github/scripts/merge_manager.js @@ -1,4 +1,5 @@ const { Buffer } = require('node:buffer'); +const { minimatch } = require('minimatch'); const { ensureRateLimitWrapped } = require('./github-rate-limited-wrapper.js'); async function fetchAllowlist(github, owner, repo, path, ref) { @@ -28,49 +29,15 @@ async function fetchAllowlist(github, owner, repo, path, ref) { return { found, patterns, maxLines }; } -const patternCache = new Map(); - -function escapeRegexSegment(segment) { - return segment.replace(/([\\^$*+?.()|{}\[\]])/g, '\\$1'); -} - -function compileGlob(pattern) { - if (patternCache.has(pattern)) { - return patternCache.get(pattern); - } - let regex = ''; - for (let i = 0; i < pattern.length; i += 1) { - const char = pattern[i]; - if (char === '*') { - if (pattern[i + 1] === '*') { - if (pattern[i + 2] === '/') { - regex += '(?:.*/)?'; - i += 2; - } else { - regex += '.*'; - i += 1; - } - } else { - regex += '[^/]*'; - } - continue; - } - if (char === '?') { - regex += '[^/]'; - continue; - } - regex += escapeRegexSegment(char); - } - const compiled = new RegExp(`^${regex}$`); - patternCache.set(pattern, compiled); - return compiled; -} - function matchPattern(filename, pattern) { if (!pattern || !filename) { return false; } - return compileGlob(pattern).test(filename); + return minimatch(filename, pattern, { + dot: true, + nocomment: true, + nonegate: true, + }); } async function computeCiStatus({ github, core, owner, repo, sha }) { diff --git a/templates/consumer-repo/.github/scripts/pr-context-graphql.js b/templates/consumer-repo/.github/scripts/pr-context-graphql.js index 46e07e2e8..45eab825e 100644 --- a/templates/consumer-repo/.github/scripts/pr-context-graphql.js +++ b/templates/consumer-repo/.github/scripts/pr-context-graphql.js @@ -1,6 +1,7 @@ 'use strict'; const { ensureRateLimitWrapped } = require('./github-rate-limited-wrapper.js'); +const { minimatch } = require('minimatch'); /** * GraphQL-based PR Context Fetcher @@ -136,6 +137,7 @@ query PRBasic($owner: String!, $repo: String!, $number: Int!) { const DEFAULT_IGNORED_PATH_PREFIXES = ['.agents/']; const DEFAULT_IGNORED_PATH_PATTERNS = ['.agents/issue-*-ledger.yml']; +const MINIMATCH_OPTIONS = { dot: true, nocase: true, nocomment: true, nonegate: true }; async function resolveGithubClient(github) { if (!github) { @@ -155,64 +157,142 @@ function parseCsv(value) { if (!value) { return []; } - return String(value) - .split(',') - .map((entry) => entry.trim()) - .filter(Boolean); + const raw = String(value); + const entries = []; + let current = ''; + let depth = 0; + let escaped = false; + + for (let i = 0; i < raw.length; i += 1) { + const char = raw[i]; + if (escaped) { + current += char; + escaped = false; + continue; + } + if (char === '\\') { + current += char; + escaped = true; + continue; + } + if (char === '{') { + depth += 1; + current += char; + continue; + } + if (char === '}') { + depth = Math.max(0, depth - 1); + current += char; + continue; + } + if (char === ',' && depth === 0) { + entries.push(current.trim()); + current = ''; + continue; + } + current += char; + } + + entries.push(current.trim()); + return entries.filter(Boolean); } -function normalizeSlashes(value) { +function normalizePath(value) { return String(value || '').replace(/\\/g, '/').toLowerCase(); } -function patternToRegex(pattern) { - const normalized = normalizeSlashes(pattern); - let regex = ''; - for (let i = 0; i < normalized.length; i += 1) { - const char = normalized[i]; - if (char === '*') { - const next = normalized[i + 1]; - if (next === '*') { - regex += '.*'; +function normalizePattern(value) { + const raw = String(value || ''); + if (!raw) { + return ''; + } + let normalized = ''; + for (let i = 0; i < raw.length; i += 1) { + const char = raw[i]; + if (char === '\\') { + const next = raw[i + 1]; + if (next && /[\\*?[\]{}()]/.test(next)) { + normalized += `\\${next}`; i += 1; - } else { - regex += '[^/]*'; + continue; } + normalized += '/'; continue; } - if (char === '?') { - regex += '[^/]'; - continue; - } - regex += char.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + normalized += char; } - return new RegExp(`^${regex}$`); + return normalized.toLowerCase(); } function buildIgnoredPathMatchers(env = process.env) { const prefixes = parseCsv(env.PR_CONTEXT_IGNORED_PATHS); const patterns = parseCsv(env.PR_CONTEXT_IGNORED_PATTERNS); + const includes = parseCsv(env.PR_CONTEXT_INCLUDE_PATTERNS); const normalizedPrefixes = (prefixes.length ? prefixes : DEFAULT_IGNORED_PATH_PREFIXES) - .map((entry) => normalizeSlashes(entry)) + .map((entry) => normalizePath(entry)) .filter(Boolean); const normalizedPatterns = (patterns.length ? patterns : DEFAULT_IGNORED_PATH_PATTERNS) - .map((entry) => normalizeSlashes(entry)) + .map((entry) => normalizePattern(entry)) .filter(Boolean); + const normalizedIncludes = includes.map((entry) => normalizePattern(entry)).filter(Boolean); return { prefixes: normalizedPrefixes, - patterns: normalizedPatterns.map(patternToRegex), + patterns: normalizedPatterns, + includes: normalizedIncludes, }; } function shouldIgnorePath(filename, matchers) { - const normalized = normalizeSlashes(filename); + const normalized = normalizePath(filename); if (!normalized) { return false; } if (matchers.prefixes.some((prefix) => normalized.startsWith(prefix))) { return true; } - return matchers.patterns.some((pattern) => pattern.test(normalized)); + return matchers.patterns.some((pattern) => minimatch(normalized, pattern, MINIMATCH_OPTIONS)); +} + +function shouldIncludePath(filename, matchers) { + if (!matchers || !matchers.includes || matchers.includes.length === 0) { + return true; + } + const normalized = normalizePath(filename); + if (!normalized) { + return false; + } + return matchers.includes.some((pattern) => minimatch(normalized, pattern, MINIMATCH_OPTIONS)); +} + +function filterPaths(paths, matchers) { + const kept = []; + const ignored = []; + + for (const path of paths || []) { + if (shouldIgnorePath(path, matchers) || !shouldIncludePath(path, matchers)) { + ignored.push(path); + } else { + kept.push(path); + } + } + + return { kept, ignored }; +} + +function filterFileNodes(fileNodes, matchers) { + const kept = []; + const ignored = []; + + for (const file of fileNodes || []) { + const path = file?.path; + if (shouldIgnorePath(path, matchers) || !shouldIncludePath(path, matchers)) { + ignored.push(file); + } else { + kept.push(file); + } + } + + return { kept, ignored }; } /** @@ -254,16 +334,7 @@ async function fetchPRContext(github, owner, repo, number) { // Transform to a more usable format const ignoredMatchers = buildIgnoredPathMatchers(process.env); const rawFiles = pr.files?.nodes || []; - const filteredFiles = []; - const ignoredFiles = []; - - for (const file of rawFiles) { - if (shouldIgnorePath(file?.path, ignoredMatchers)) { - ignoredFiles.push(file); - } else { - filteredFiles.push(file); - } - } + const { kept: filteredFiles, ignored: ignoredFiles } = filterFileNodes(rawFiles, ignoredMatchers); const ignoredCount = ignoredFiles.length; @@ -484,6 +555,9 @@ module.exports = { fetchPRBasic, buildIgnoredPathMatchers, shouldIgnorePath, + shouldIncludePath, + filterPaths, + filterFileNodes, serializeForOutput, deserializeFromOutput, createPRContextCache diff --git a/tests/scripts/test_update_versions_from_pypi.py b/tests/scripts/test_update_versions_from_pypi.py index 7d78d505d..2e25aba22 100755 --- a/tests/scripts/test_update_versions_from_pypi.py +++ b/tests/scripts/test_update_versions_from_pypi.py @@ -38,6 +38,9 @@ def _pypi_reachable() -> bool: try: with urllib.request.urlopen("https://pypi.org/simple/", timeout=5) as resp: + if resp.status != 200: + return False + with urllib.request.urlopen("https://pypi.org/pypi/pytest/json", timeout=5) as resp: return resp.status == 200 except Exception: return False diff --git a/tests/test/dismiss/dismiss-bot-comment.test.js b/tests/test/dismiss/dismiss-bot-comment.test.js index bf57c17fe..b9440dbfd 100644 --- a/tests/test/dismiss/dismiss-bot-comment.test.js +++ b/tests/test/dismiss/dismiss-bot-comment.test.js @@ -7,6 +7,7 @@ const { autoDismissReviewComments, collectDismissable, formatDismissLog, + runCli, } = require('../../../.github/scripts/bot-comment-dismiss'); describe('bot-comment-dismiss glob matching', () => { @@ -179,4 +180,200 @@ describe('bot-comment-dismiss glob matching', () => { }), ]); }); + + it('supports character class glob patterns', () => { + const dismissable = collectDismissable( + [ + { id: 41, path: 'src/a.ts', user: { login: 'copilot[bot]' } }, + { id: 42, path: 'src/b.ts', user: { login: 'copilot[bot]' } }, + { id: 43, path: 'src/c.ts', user: { login: 'copilot[bot]' } }, + ], + { + ignoredPaths: ['src/[ab].ts'], + botAuthors: ['copilot[bot]'], + } + ); + + assert.deepStrictEqual(dismissable, [ + { id: 41, path: 'src/a.ts', author: 'copilot[bot]' }, + { id: 42, path: 'src/b.ts', author: 'copilot[bot]' }, + ]); + }); + + it('supports brace expansion glob patterns', () => { + const dismissable = collectDismissable( + [ + { id: 51, path: 'src/app.ts', user: { login: 'copilot[bot]' } }, + { id: 52, path: 'src/view.tsx', user: { login: 'copilot[bot]' } }, + { id: 53, path: 'src/app.js', user: { login: 'copilot[bot]' } }, + ], + { + ignoredPaths: ['src/*.{ts,tsx}'], + botAuthors: ['copilot[bot]'], + } + ); + + assert.deepStrictEqual(dismissable, [ + { id: 51, path: 'src/app.ts', author: 'copilot[bot]' }, + { id: 52, path: 'src/view.tsx', author: 'copilot[bot]' }, + ]); + }); + + it('supports escaped metacharacters in glob patterns', () => { + const dismissable = collectDismissable( + [ + { id: 61, path: 'docs/[draft].md', user: { login: 'copilot[bot]' } }, + { id: 62, path: 'docs/draft.md', user: { login: 'copilot[bot]' } }, + ], + { + ignoredPaths: ['docs/\\[draft\\].md'], + botAuthors: ['copilot[bot]'], + } + ); + + assert.deepStrictEqual(dismissable, [ + { id: 61, path: 'docs/[draft].md', author: 'copilot[bot]' }, + ]); + }); +}); + +describe('bot-comment-dismiss maxAgeSeconds parsing', () => { + it('uses the CLI maxAgeSeconds when provided', () => { + const result = runCli( + { COMMENTS_JSON: '[]' }, + ['--maxAgeSeconds', '3600'] + ); + + assert.strictEqual(result.maxAgeSeconds, 3600); + }); + + it('prefers CLI maxAgeSeconds over environment value', () => { + const result = runCli( + { COMMENTS_JSON: '[]', MAX_AGE_SECONDS: '10' }, + ['--maxAgeSeconds', '20'] + ); + + assert.strictEqual(result.maxAgeSeconds, 20); + }); + + it('defaults maxAgeSeconds when not provided', () => { + const result = runCli({ COMMENTS_JSON: '[]' }, []); + + assert.strictEqual(result.maxAgeSeconds, 30); + }); + + it('rejects invalid maxAgeSeconds values', () => { + assert.throws( + () => runCli({ COMMENTS_JSON: '[]', MAX_AGE_SECONDS: 'abc' }, []), + /maxAgeSeconds/i + ); + assert.throws( + () => runCli({ COMMENTS_JSON: '[]' }, ['--maxAgeSeconds', '-1']), + /maxAgeSeconds/i + ); + assert.throws( + () => runCli({ COMMENTS_JSON: '[]' }, ['--maxAgeSeconds', '0']), + /maxAgeSeconds/i + ); + }); +}); + +describe('bot-comment-dismiss timestamp selection', () => { + const baseOptions = { + ignoredPaths: ['.agents/**'], + botAuthors: ['copilot[bot]'], + maxAgeSeconds: 30, + now: Date.parse('2026-02-08T12:01:00.000Z'), + }; + + it('uses created_at when present', () => { + const dismissable = collectDismissable( + [ + { + id: 41, + path: '.agents/created-at.yml', + user: { login: 'copilot[bot]' }, + created_at: '2026-02-08T12:00:45.000Z', + }, + ], + baseOptions + ); + + assert.deepStrictEqual(dismissable, [ + { id: 41, path: '.agents/created-at.yml', author: 'copilot[bot]' }, + ]); + }); + + it('uses createdAt when present', () => { + const dismissable = collectDismissable( + [ + { + id: 42, + path: '.agents/created-at-camel.yml', + user: { login: 'copilot[bot]' }, + createdAt: '2026-02-08T12:00:50.000Z', + }, + ], + baseOptions + ); + + assert.deepStrictEqual(dismissable, [ + { id: 42, path: '.agents/created-at-camel.yml', author: 'copilot[bot]' }, + ]); + }); + + it('uses updated_at when present', () => { + const dismissable = collectDismissable( + [ + { + id: 43, + path: '.agents/updated-at.yml', + user: { login: 'copilot[bot]' }, + updated_at: '2026-02-08T12:00:55.000Z', + }, + ], + baseOptions + ); + + assert.deepStrictEqual(dismissable, [ + { id: 43, path: '.agents/updated-at.yml', author: 'copilot[bot]' }, + ]); + }); + + it('uses updatedAt when present', () => { + const dismissable = collectDismissable( + [ + { + id: 44, + path: '.agents/updated-at-camel.yml', + user: { login: 'copilot[bot]' }, + updatedAt: '2026-02-08T12:00:58.000Z', + }, + ], + baseOptions + ); + + assert.deepStrictEqual(dismissable, [ + { id: 44, path: '.agents/updated-at-camel.yml', author: 'copilot[bot]' }, + ]); + }); + + it('prefers updated timestamps over created timestamps when both exist', () => { + const dismissable = collectDismissable( + [ + { + id: 45, + path: '.agents/both-timestamps.yml', + user: { login: 'copilot[bot]' }, + created_at: '2026-02-08T11:59:00.000Z', + updated_at: '2026-02-08T12:00:50.000Z', + }, + ], + baseOptions + ); + + assert.deepStrictEqual(dismissable, [ + { id: 45, path: '.agents/both-timestamps.yml', author: 'copilot[bot]' }, + ]); + }); }); diff --git a/tests/workflows/fixtures/keepalive/harness.js b/tests/workflows/fixtures/keepalive/harness.js index 612bc9315..b66b9a637 100755 --- a/tests/workflows/fixtures/keepalive/harness.js +++ b/tests/workflows/fixtures/keepalive/harness.js @@ -383,8 +383,6 @@ async function runScenario(scenario) { Boolean(scenario.clearTokenDefaults) || Boolean(scenarioEnv.CLEAR_TOKEN_DEFAULTS) || Boolean(scenarioEnv.clear_token_defaults) || - Boolean(process.env.CLEAR_TOKEN_DEFAULTS) || - Boolean(process.env.clear_token_defaults) || allExplicitTokensBlank; const envOverrides = { diff --git a/tests/workflows/test_keepalive_workflow.py b/tests/workflows/test_keepalive_workflow.py index 8dd1f024d..bb3c50751 100644 --- a/tests/workflows/test_keepalive_workflow.py +++ b/tests/workflows/test_keepalive_workflow.py @@ -80,6 +80,14 @@ def _run_harness( env.setdefault("clear_token_defaults", "true") if extra_env: env.update(extra_env) + clear_tokens_flag = ( + env.get("CLEAR_TOKEN_DEFAULTS") + or env.get("clear_token_defaults") + or scenario_data.get("clear_token_defaults") + or scenario_data.get("clearTokenDefaults") + ) + if clear_tokens_flag: + _clean_token_env(env) command = ["node", str(HARNESS), str(scenario_path)] return subprocess.run(command, capture_output=True, text=True, env=env) @@ -136,6 +144,28 @@ def _assert_no_dispatch(data: dict) -> None: assert _dispatch_events(data) == [] +def _assert_missing_instruction_token( + result: subprocess.CompletedProcess[str], +) -> None: + expected_message = "GitHub token is required to author keepalive instructions" + combined_output = (result.stderr or "") + (result.stdout or "") + if result.returncode != 0: + assert expected_message in combined_output + return + + payload = _parse_harness_payload(result) + failed = payload.get("logs", {}).get("failedMessage") or "" + assert expected_message in failed + assert payload.get("dispatch_events") == [] + + +def _parse_harness_payload(result: subprocess.CompletedProcess[str]) -> dict: + try: + return json.loads(result.stdout or "{}") + except json.JSONDecodeError as exc: + pytest.fail(f"Expected JSON harness output on success: {exc}: {result.stdout}") + + # First line of the keepalive instruction from .github/codex/prompts/keepalive_next_task.md # The full instruction is multi-line; tests check that the instruction starts correctly. DEFAULT_COMMAND_PREFIX = ( @@ -617,20 +647,33 @@ def test_keepalive_requires_instruction_token() -> None: scenario_path, extra_env={"CLEAR_TOKEN_DEFAULTS": "true", "clear_token_defaults": "true"}, ) - expected_message = "GitHub token is required to author keepalive instructions" - combined_output = (result.stderr or "") + (result.stdout or "") + _assert_missing_instruction_token(result) + + +def test_keepalive_requires_dispatch_token() -> None: + _require_node() + scenario_path = FIXTURES_DIR / "missing_dispatch_token.json" + assert scenario_path.exists(), "Scenario fixture missing" + # Force token defaults to be cleared so CI-provided tokens do not mask failures. + result = _run_harness( + scenario_path, + extra_env={"CLEAR_TOKEN_DEFAULTS": "true", "clear_token_defaults": "true"}, + ) if result.returncode != 0: - assert expected_message in combined_output + _assert_missing_instruction_token(result) return - # Some harness paths may record the failure instead of throwing; validate the summary payload. - try: - payload = json.loads(result.stdout or "{}") - except json.JSONDecodeError as exc: - pytest.fail(f"Expected JSON harness output on success: {exc}: {result.stdout}") - failed = payload.get("logs", {}).get("failedMessage") or "" - assert expected_message in failed - assert payload.get("dispatch_events") == [] + payload = _parse_harness_payload(result) + dispatch_tokens = payload.get("dispatch_tokens") + comment_tokens = payload.get("comment_tokens") + if dispatch_tokens is None or comment_tokens is None: + dispatch_events = payload.get("dispatch_events", []) + assert dispatch_events, "Expected keepalive dispatch events when harness succeeds" + return + assert dispatch_tokens, "Expected keepalive dispatch to use a token when harness succeeds" + assert any( + token in comment_tokens for token in dispatch_tokens + ), "Expected dispatch token to fall back to the instruction author token" def test_keepalive_dispatches_with_service_bot_pat() -> None: