From 6c3e1c988f3fcb15141b541f264cbb1955c5da01 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 5 Dec 2024 20:15:37 +0000 Subject: [PATCH 01/11] Update coverage data --- README.md | 38 ++++++++++++++++++++++++++++++++++++++ badge.svg | 1 + data.json | 1 + endpoint.json | 1 + 4 files changed, 41 insertions(+) create mode 100644 README.md create mode 100644 badge.svg create mode 100644 data.json create mode 100644 endpoint.json diff --git a/README.md b/README.md new file mode 100644 index 0000000..037dfe6 --- /dev/null +++ b/README.md @@ -0,0 +1,38 @@ +# Repository Coverage + + + +| Name | Stmts | Miss | Cover | Missing | +|---------------------------------- | -------: | -------: | -------: | --------: | +| annotated\_logger/\_\_init\_\_.py | 313 | 0 | 100% | | +| annotated\_logger/filter.py | 31 | 0 | 100% | | +| annotated\_logger/mocks.py | 124 | 0 | 100% | | +| annotated\_logger/plugins.py | 92 | 0 | 100% | | +| example/\_\_init\_\_.py | 0 | 0 | 100% | | +| example/actions.py | 19 | 0 | 100% | | +| example/api.py | 40 | 0 | 100% | | +| example/calculator.py | 106 | 0 | 100% | | +| example/default.py | 53 | 0 | 100% | | +| example/invalid\_order.py | 5 | 0 | 100% | | +| example/logging\_config.py | 37 | 0 | 100% | | +| **TOTAL** | **820** | **0** | **100%** | | + + +## Setup coverage badge + +Below are examples of the badges you can use in your main branch `README` file. + +### Direct image + +[![Coverage badge](https://github.com/github/annotated-logger/raw/python-coverage-comment-action-data/badge.svg)](https://github.com/github/annotated-logger/tree/python-coverage-comment-action-data) + +This is the one to use if your repository is private or if you don't want to customize anything. + + + +## What is that? + +This branch is part of the +[python-coverage-comment-action](https://github.com/marketplace/actions/python-coverage-comment) +GitHub Action. All the files in this branch are automatically generated and may be +overwritten at any moment. \ No newline at end of file diff --git a/badge.svg b/badge.svg new file mode 100644 index 0000000..5bb55be --- /dev/null +++ b/badge.svg @@ -0,0 +1 @@ +Coverage: 100%Coverage100% \ No newline at end of file diff --git a/data.json b/data.json new file mode 100644 index 0000000..cba97d2 --- /dev/null +++ b/data.json @@ -0,0 +1 @@ +{"coverage": 100.0, "raw_data": {"meta": {"format": 3, "version": "7.6.4", "timestamp": "2024-12-05T20:15:35.623649", "branch_coverage": false, "show_contexts": false}, "files": {"annotated_logger/__init__.py": {"executed_lines": [1, 3, 4, 5, 6, 7, 8, 9, 10, 24, 26, 27, 29, 32, 34, 35, 36, 37, 38, 39, 40, 41, 44, 45, 47, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 61, 62, 63, 64, 67, 68, 70, 80, 88, 91, 122, 123, 125, 135, 136, 137, 138, 139, 146, 148, 150, 151, 153, 155, 156, 157, 158, 159, 160, 161, 163, 164, 167, 168, 170, 177, 178, 179, 180, 184, 186, 195, 197, 209, 211, 219, 220, 222, 223, 224, 226, 227, 228, 229, 230, 231, 232, 233, 234, 240, 241, 242, 244, 246, 247, 249, 252, 253, 269, 301, 302, 304, 305, 306, 307, 308, 309, 310, 312, 313, 314, 315, 316, 317, 318, 324, 325, 327, 329, 341, 342, 346, 348, 350, 353, 355, 362, 363, 364, 365, 366, 367, 368, 370, 371, 372, 374, 381, 382, 391, 392, 402, 403, 413, 414, 424, 425, 434, 435, 446, 447, 458, 459, 470, 471, 484, 485, 496, 497, 507, 508, 519, 520, 531, 532, 545, 546, 556, 557, 568, 569, 580, 581, 596, 597, 608, 609, 622, 623, 636, 637, 652, 695, 696, 700, 701, 705, 706, 710, 711, 715, 716, 718, 721, 723, 726, 729, 730, 731, 732, 734, 736, 740, 744, 745, 747, 749, 752, 753, 754, 755, 756, 758, 759, 760, 761, 762, 763, 764, 765, 766, 768, 769, 771, 775, 776, 777, 778, 779, 780, 783, 784, 785, 786, 788, 790, 792, 804, 805, 806, 807, 810, 811, 812, 813, 815, 816, 817, 819, 824, 825, 828, 830, 834, 835, 836, 838, 839, 840, 841, 850, 858, 860, 862, 871, 872, 873, 874, 876, 877, 880, 881, 883, 885, 895, 896, 897, 898, 900, 901, 904, 905, 906, 908, 911, 912, 913, 914, 915, 916, 917, 918, 920, 922, 929, 930, 931, 932, 933, 935, 936, 937, 938, 941, 943, 949, 955, 956, 957, 958, 959, 960, 961], "summary": {"covered_lines": 313, "num_statements": 313, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 30], "functions": {"AnnotatedIterator.__init__": {"executed_lines": [135, 136, 137, 138, 139, 146], "summary": {"covered_lines": 6, "num_statements": 6, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedIterator.__iter__": {"executed_lines": [150, 151], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedIterator.__next__": {"executed_lines": [155, 156, 157, 158, 159, 160, 161, 163, 164], "summary": {"covered_lines": 9, "num_statements": 9, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedAdapter.__init__": {"executed_lines": [177, 178, 179, 180, 184], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedAdapter.iterator": {"executed_lines": [195], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedAdapter.process": {"executed_lines": [209], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedAdapter.log": {"executed_lines": [219, 220, 222, 223, 224, 226, 227, 228, 229, 230, 231, 232, 233, 234, 240, 241, 242], "summary": {"covered_lines": 17, "num_statements": 17, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedAdapter.annotate": {"executed_lines": [246, 247, 249], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger.__init__": {"executed_lines": [301, 302, 304, 305, 306, 307, 308, 309, 310, 312, 313, 314, 315, 316, 317, 318, 324, 325, 327], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger._generate_logger": {"executed_lines": [341, 342, 346, 348], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger._action_annotation": {"executed_lines": [353], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger.generate_filter": {"executed_lines": [362, 363, 364, 365, 366, 367, 368, 370, 371, 372, 374], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger.annotate_logs": {"executed_lines": [695, 696, 700, 701, 705, 706, 710, 711, 715, 718, 790], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger.annotate_logs.decorator": {"executed_lines": [721, 723, 734, 736, 740, 744, 788], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger.annotate_logs.decorator.wrap_class": {"executed_lines": [726, 729, 730, 731, 732], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger.annotate_logs.decorator.wrap_function": {"executed_lines": [745, 747, 749, 752, 753, 754, 755, 756, 758, 759, 760, 761, 762, 763, 764, 765, 766, 768, 769, 771, 775, 776, 777, 778, 779, 780, 783, 784, 785, 786], "summary": {"covered_lines": 30, "num_statements": 30, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger._determine_signature_adjustments": {"executed_lines": [804, 805, 806, 807, 810, 811, 812, 813, 815, 816, 817, 819, 860], "summary": {"covered_lines": 13, "num_statements": 13, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger._determine_signature_adjustments.inject_logger": {"executed_lines": [824, 825, 828, 830, 834, 835, 836, 838, 839, 840, 841, 850, 858], "summary": {"covered_lines": 13, "num_statements": 13, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger._inject_by_kwarg": {"executed_lines": [871, 872, 873, 874, 876, 877, 880, 881, 883], "summary": {"covered_lines": 9, "num_statements": 9, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger._inject_by_index": {"executed_lines": [895, 896, 897, 898, 900, 901, 904, 905, 906], "summary": {"covered_lines": 9, "num_statements": 9, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger._check_parameters_for_self_and_cls": {"executed_lines": [911, 912, 913, 914, 915, 916, 917, 918, 920], "summary": {"covered_lines": 9, "num_statements": 9, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger._pick_correct_logger": {"executed_lines": [929, 930, 931, 932, 933, 935, 936, 937, 938, 941, 943], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "_attempt_post_call": {"executed_lines": [955, 956, 957, 958, 959, 960, 961], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 3, 4, 5, 6, 7, 8, 9, 10, 24, 26, 27, 29, 32, 34, 35, 36, 37, 38, 39, 40, 41, 44, 45, 47, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 61, 62, 63, 64, 67, 68, 70, 80, 88, 91, 122, 123, 125, 148, 153, 167, 168, 170, 186, 197, 211, 244, 252, 253, 269, 329, 350, 355, 381, 382, 391, 392, 402, 403, 413, 414, 424, 425, 434, 435, 446, 447, 458, 459, 470, 471, 484, 485, 496, 497, 507, 508, 519, 520, 531, 532, 545, 546, 556, 557, 568, 569, 580, 581, 596, 597, 608, 609, 622, 623, 636, 637, 652, 792, 862, 885, 908, 922, 949], "summary": {"covered_lines": 109, "num_statements": 109, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 30]}}, "classes": {"AnnotatedClass": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedIterator": {"executed_lines": [135, 136, 137, 138, 139, 146, 150, 151, 155, 156, 157, 158, 159, 160, 161, 163, 164], "summary": {"covered_lines": 17, "num_statements": 17, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedAdapter": {"executed_lines": [177, 178, 179, 180, 184, 195, 209, 219, 220, 222, 223, 224, 226, 227, 228, 229, 230, 231, 232, 233, 234, 240, 241, 242, 246, 247, 249], "summary": {"covered_lines": 27, "num_statements": 27, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger": {"executed_lines": [301, 302, 304, 305, 306, 307, 308, 309, 310, 312, 313, 314, 315, 316, 317, 318, 324, 325, 327, 341, 342, 346, 348, 353, 362, 363, 364, 365, 366, 367, 368, 370, 371, 372, 374, 695, 696, 700, 701, 705, 706, 710, 711, 715, 716, 718, 721, 723, 726, 729, 730, 731, 732, 734, 736, 740, 744, 745, 747, 749, 752, 753, 754, 755, 756, 758, 759, 760, 761, 762, 763, 764, 765, 766, 768, 769, 771, 775, 776, 777, 778, 779, 780, 783, 784, 785, 786, 788, 790, 804, 805, 806, 807, 810, 811, 812, 813, 815, 816, 817, 819, 824, 825, 828, 830, 834, 835, 836, 838, 839, 840, 841, 850, 858, 860, 871, 872, 873, 874, 876, 877, 880, 881, 883, 895, 896, 897, 898, 900, 901, 904, 905, 906, 911, 912, 913, 914, 915, 916, 917, 918, 920, 929, 930, 931, 932, 933, 935, 936, 937, 938, 941, 943], "summary": {"covered_lines": 153, "num_statements": 153, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 3, 4, 5, 6, 7, 8, 9, 10, 24, 26, 27, 29, 32, 34, 35, 36, 37, 38, 39, 40, 41, 44, 45, 47, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 61, 62, 63, 64, 67, 68, 70, 80, 88, 91, 122, 123, 125, 148, 153, 167, 168, 170, 186, 197, 211, 244, 252, 253, 269, 329, 350, 355, 381, 382, 391, 392, 402, 403, 413, 414, 424, 425, 434, 435, 446, 447, 458, 459, 470, 471, 484, 485, 496, 497, 507, 508, 519, 520, 531, 532, 545, 546, 556, 557, 568, 569, 580, 581, 596, 597, 608, 609, 622, 623, 636, 637, 652, 792, 862, 885, 908, 922, 949, 955, 956, 957, 958, 959, 960, 961], "summary": {"covered_lines": 116, "num_statements": 116, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 30]}}}, "annotated_logger/filter.py": {"executed_lines": [1, 3, 4, 5, 7, 9, 12, 13, 15, 22, 23, 24, 29, 31, 32, 33, 34, 35, 36, 38, 46, 47, 48, 49, 50, 51, 52, 53, 54, 56, 57, 58], "summary": {"covered_lines": 31, "num_statements": 31, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"AnnotatedFilter.__init__": {"executed_lines": [22, 23, 24, 29], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedFilter._all_annotations": {"executed_lines": [32, 33, 34, 35, 36], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedFilter.filter": {"executed_lines": [46, 47, 48, 49, 50, 51, 52, 53, 54, 56, 57, 58], "summary": {"covered_lines": 12, "num_statements": 12, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 3, 4, 5, 7, 9, 12, 13, 15, 31, 38], "summary": {"covered_lines": 10, "num_statements": 10, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"AnnotatedFilter": {"executed_lines": [22, 23, 24, 29, 32, 33, 34, 35, 36, 46, 47, 48, 49, 50, 51, 52, 53, 54, 56, 57, 58], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 3, 4, 5, 7, 9, 12, 13, 15, 31, 38], "summary": {"covered_lines": 10, "num_statements": 10, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "annotated_logger/mocks.py": {"executed_lines": [1, 3, 4, 6, 7, 10, 11, 13, 23, 24, 25, 26, 27, 28, 29, 31, 33, 34, 35, 36, 37, 38, 39, 41, 43, 44, 45, 47, 48, 49, 50, 51, 52, 53, 58, 61, 63, 65, 66, 67, 68, 72, 73, 74, 75, 76, 78, 79, 80, 82, 83, 84, 87, 90, 91, 92, 97, 98, 100, 101, 102, 104, 108, 111, 117, 125, 126, 130, 131, 135, 136, 138, 139, 140, 141, 142, 143, 144, 145, 147, 149, 156, 159, 160, 162, 163, 191, 193, 194, 195, 197, 199, 201, 203, 204, 205, 207, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 237, 238, 240, 243, 244, 246, 247, 248, 252, 253], "summary": {"covered_lines": 124, "num_statements": 124, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"AssertLogged.__init__": {"executed_lines": [23, 24, 25, 26, 27, 28, 29], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AssertLogged.check": {"executed_lines": [33, 34, 35, 36, 37, 38, 39, 41, 43, 44, 45], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AssertLogged._failed_sort_key": {"executed_lines": [48, 49, 50, 51, 52, 53, 58, 61], "summary": {"covered_lines": 8, "num_statements": 8, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AssertLogged.build_message": {"executed_lines": [65, 66, 67, 68, 72, 73, 74, 75, 76, 78, 79, 80, 82, 83, 84, 87, 90, 91, 92, 97, 98, 100, 101, 102], "summary": {"covered_lines": 24, "num_statements": 24, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AssertLogged._check_record_matches": {"executed_lines": [108, 111, 117, 125, 126, 130, 131, 135, 136, 138, 139, 140, 141, 142, 143, 144, 145, 147, 149, 156], "summary": {"covered_lines": 20, "num_statements": 20, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogMock.__init__": {"executed_lines": [193, 194, 195], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogMock.__getattr__": {"executed_lines": [199], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogMock.handle": {"executed_lines": [203, 204, 205], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogMock.assert_logged": {"executed_lines": [216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "annotated_logger_object": {"executed_lines": [240], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "annotated_logger_mock": {"executed_lines": [246, 247, 248, 252, 253], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 3, 4, 6, 7, 10, 11, 13, 31, 47, 63, 104, 159, 160, 162, 163, 191, 197, 201, 207, 237, 238, 243, 244], "summary": {"covered_lines": 22, "num_statements": 22, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"AssertLogged": {"executed_lines": [23, 24, 25, 26, 27, 28, 29, 33, 34, 35, 36, 37, 38, 39, 41, 43, 44, 45, 48, 49, 50, 51, 52, 53, 58, 61, 65, 66, 67, 68, 72, 73, 74, 75, 76, 78, 79, 80, 82, 83, 84, 87, 90, 91, 92, 97, 98, 100, 101, 102, 108, 111, 117, 125, 126, 130, 131, 135, 136, 138, 139, 140, 141, 142, 143, 144, 145, 147, 149, 156], "summary": {"covered_lines": 70, "num_statements": 70, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogMock": {"executed_lines": [193, 194, 195, 199, 203, 204, 205, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234], "summary": {"covered_lines": 26, "num_statements": 26, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 3, 4, 6, 7, 10, 11, 13, 31, 47, 63, 104, 159, 160, 162, 163, 191, 197, 201, 207, 237, 238, 240, 243, 244, 246, 247, 248, 252, 253], "summary": {"covered_lines": 28, "num_statements": 28, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "annotated_logger/plugins.py": {"executed_lines": [1, 3, 4, 5, 7, 9, 11, 15, 16, 18, 20, 22, 26, 27, 28, 29, 30, 33, 34, 36, 40, 42, 44, 45, 46, 49, 50, 52, 56, 57, 58, 59, 62, 63, 65, 66, 68, 70, 71, 73, 75, 76, 77, 78, 79, 80, 81, 84, 85, 87, 89, 90, 91, 93, 95, 96, 97, 98, 101, 102, 104, 106, 107, 108, 110, 112, 113, 114, 115, 116, 117, 120, 121, 123, 125, 127, 130, 134, 135, 136, 137, 138, 139, 140, 142, 143, 146, 147, 149, 151, 152, 153, 155, 157, 158, 160, 165, 166, 167, 168, 169, 171, 173, 175], "summary": {"covered_lines": 92, "num_statements": 92, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 4}, "missing_lines": [], "excluded_lines": [11, 12, 167, 168], "functions": {"BasePlugin.filter": {"executed_lines": [20], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "BasePlugin.uncaught_exception": {"executed_lines": [26, 27, 28, 29, 30], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "RuntimeAnnotationsPlugin.__init__": {"executed_lines": [40], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "RuntimeAnnotationsPlugin.filter": {"executed_lines": [44, 45, 46], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "RequestsPlugin.uncaught_exception": {"executed_lines": [56, 57, 58, 59], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "RenamerPlugin.__init__": {"executed_lines": [70, 71], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "RenamerPlugin.filter": {"executed_lines": [75, 76, 77, 78, 79, 80, 81], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "RemoverPlugin.__init__": {"executed_lines": [89, 90, 91], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "RemoverPlugin.filter": {"executed_lines": [95, 96, 97, 98], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "NameAdjusterPlugin.__init__": {"executed_lines": [106, 107, 108], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "NameAdjusterPlugin.filter": {"executed_lines": [112, 113, 114, 115, 116, 117], "summary": {"covered_lines": 6, "num_statements": 6, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "NestedRemoverPlugin.__init__": {"executed_lines": [125], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "NestedRemoverPlugin.filter": {"executed_lines": [130, 142, 143], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "NestedRemoverPlugin.filter.delete_keys_nested": {"executed_lines": [134, 135, 136, 137, 138, 139, 140], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "GitHubActionsPlugin.__init__": {"executed_lines": [151, 152, 153], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "GitHubActionsPlugin.filter": {"executed_lines": [157, 158, 160, 165, 166, 167, 168, 169, 171], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [167, 168]}, "GitHubActionsPlugin.logging_config": {"executed_lines": [175], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 3, 4, 5, 7, 9, 11, 15, 16, 18, 22, 33, 34, 36, 42, 49, 50, 52, 62, 63, 65, 66, 68, 73, 84, 85, 87, 93, 101, 102, 104, 110, 120, 121, 123, 127, 146, 147, 149, 155, 173], "summary": {"covered_lines": 31, "num_statements": 31, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [11, 12]}}, "classes": {"BasePlugin": {"executed_lines": [20, 26, 27, 28, 29, 30], "summary": {"covered_lines": 6, "num_statements": 6, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "RuntimeAnnotationsPlugin": {"executed_lines": [40, 44, 45, 46], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "RequestsPlugin": {"executed_lines": [56, 57, 58, 59], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "RenamerPlugin": {"executed_lines": [70, 71, 75, 76, 77, 78, 79, 80, 81], "summary": {"covered_lines": 9, "num_statements": 9, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "RenamerPlugin.FieldNotPresentError": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "RemoverPlugin": {"executed_lines": [89, 90, 91, 95, 96, 97, 98], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "NameAdjusterPlugin": {"executed_lines": [106, 107, 108, 112, 113, 114, 115, 116, 117], "summary": {"covered_lines": 9, "num_statements": 9, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "NestedRemoverPlugin": {"executed_lines": [125, 130, 134, 135, 136, 137, 138, 139, 140, 142, 143], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "GitHubActionsPlugin": {"executed_lines": [151, 152, 153, 157, 158, 160, 165, 166, 167, 168, 169, 171, 175], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [167, 168]}, "": {"executed_lines": [1, 3, 4, 5, 7, 9, 11, 15, 16, 18, 22, 33, 34, 36, 42, 49, 50, 52, 62, 63, 65, 66, 68, 73, 84, 85, 87, 93, 101, 102, 104, 110, 120, 121, 123, 127, 146, 147, 149, 155, 173], "summary": {"covered_lines": 31, "num_statements": 31, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [11, 12]}}}, "example/__init__.py": {"executed_lines": [0], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "example/actions.py": {"executed_lines": [1, 2, 4, 9, 11, 13, 21, 22, 23, 24, 26, 34, 37, 38, 40, 41, 43, 45, 46, 48], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"ActionsExample.first_step": {"executed_lines": [43], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "ActionsExample.second_step": {"executed_lines": [48], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 2, 4, 9, 11, 13, 21, 22, 23, 24, 26, 34, 37, 38, 40, 41, 45, 46], "summary": {"covered_lines": 17, "num_statements": 17, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"ActionsExample": {"executed_lines": [43, 48], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 2, 4, 9, 11, 13, 21, 22, 23, 24, 26, 34, 37, 38, 40, 41, 45, 46], "summary": {"covered_lines": 17, "num_statements": 17, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "example/api.py": {"executed_lines": [1, 3, 4, 6, 7, 9, 10, 13, 15, 18, 28, 31, 32, 33, 35, 37, 39, 40, 42, 43, 44, 45, 47, 48, 50, 51, 52, 53, 54, 56, 57, 59, 60, 61, 62, 64, 66, 68, 69, 70, 71], "summary": {"covered_lines": 40, "num_statements": 40, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"runtime": {"executed_lines": [15], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "ApiClient.pre_call": {"executed_lines": [37], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "ApiClient.check": {"executed_lines": [42, 43, 44, 45], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "ApiClient.check_again": {"executed_lines": [50, 51, 52, 53, 54], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "ApiClient.prepare": {"executed_lines": [59, 60, 61, 62], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "ApiClient.throw_http_exception": {"executed_lines": [68, 69, 70, 71], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 3, 4, 6, 7, 9, 10, 13, 18, 28, 31, 32, 33, 35, 39, 40, 47, 48, 56, 57, 64, 66], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"ApiClient": {"executed_lines": [37, 42, 43, 44, 45, 50, 51, 52, 53, 54, 59, 60, 61, 62, 68, 69, 70, 71], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 3, 4, 6, 7, 9, 10, 13, 15, 18, 28, 31, 32, 33, 35, 39, 40, 47, 48, 56, 57, 64, 66], "summary": {"covered_lines": 22, "num_statements": 22, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "example/calculator.py": {"executed_lines": [1, 3, 5, 6, 14, 15, 18, 20, 23, 39, 41, 44, 45, 51, 57, 58, 59, 61, 63, 64, 65, 66, 68, 75, 77, 84, 85, 86, 87, 88, 89, 90, 94, 100, 102, 106, 107, 108, 111, 112, 114, 120, 124, 126, 128, 129, 133, 134, 136, 138, 139, 143, 144, 145, 146, 147, 149, 150, 153, 155, 159, 162, 163, 164, 165, 167, 168, 170, 171, 173, 174, 176, 177, 178, 179, 180, 182, 183, 185, 187, 188, 190, 192, 193, 195, 196, 199, 200, 201, 202, 204, 205, 209, 212, 213, 214, 215, 217, 218, 219, 221, 222, 223, 225, 226, 227, 231, 232], "summary": {"covered_lines": 106, "num_statements": 106, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"runtime": {"executed_lines": [20], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.__init__": {"executed_lines": [57, 58, 59], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.check_zero_division": {"executed_lines": [63, 64, 65, 66], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.will_pass": {"executed_lines": [75], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.check_prediction_crashed_correctly": {"executed_lines": [84, 85, 86, 87, 88, 89, 90], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.divide": {"executed_lines": [102, 106, 107, 108, 111, 112], "summary": {"covered_lines": 6, "num_statements": 6, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.multiply": {"executed_lines": [124, 126], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.multiply2": {"executed_lines": [133, 134, 136], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.power": {"executed_lines": [143, 144, 145, 146, 147], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.add": {"executed_lines": [153, 155, 159, 162, 163, 164, 165], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.subtract": {"executed_lines": [170, 171], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.inverse": {"executed_lines": [176, 177, 178, 179, 180], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.pemdas_example": {"executed_lines": [185], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.is_odd": {"executed_lines": [190], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.factorial": {"executed_lines": [195, 196, 199, 200, 201, 202], "summary": {"covered_lines": 6, "num_statements": 6, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.sensitive_factorial": {"executed_lines": [209, 212, 213, 214, 215], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.is_math_cool": {"executed_lines": [221, 222, 223], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.sanity_check": {"executed_lines": [231, 232], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 3, 5, 6, 14, 15, 18, 23, 39, 41, 44, 45, 51, 61, 68, 77, 94, 100, 114, 120, 128, 129, 138, 139, 149, 150, 167, 168, 173, 174, 182, 183, 187, 188, 192, 193, 204, 205, 217, 218, 219, 225, 226, 227], "summary": {"covered_lines": 42, "num_statements": 42, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"BoomError": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator": {"executed_lines": [57, 58, 59, 63, 64, 65, 66, 75, 84, 85, 86, 87, 88, 89, 90, 102, 106, 107, 108, 111, 112, 124, 126, 133, 134, 136, 143, 144, 145, 146, 147, 153, 155, 159, 162, 163, 164, 165, 170, 171, 176, 177, 178, 179, 180, 185, 190, 195, 196, 199, 200, 201, 202, 209, 212, 213, 214, 215, 221, 222, 223, 231, 232], "summary": {"covered_lines": 63, "num_statements": 63, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 3, 5, 6, 14, 15, 18, 20, 23, 39, 41, 44, 45, 51, 61, 68, 77, 94, 100, 114, 120, 128, 129, 138, 139, 149, 150, 167, 168, 173, 174, 182, 183, 187, 188, 192, 193, 204, 205, 217, 218, 219, 225, 226, 227], "summary": {"covered_lines": 43, "num_statements": 43, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "example/default.py": {"executed_lines": [1, 2, 6, 8, 11, 12, 14, 15, 17, 19, 20, 27, 28, 30, 31, 33, 34, 38, 40, 41, 43, 44, 48, 50, 51, 52, 53, 55, 56, 60, 61, 65, 66, 70, 72, 73, 74, 75, 77, 78, 87, 88, 89, 92, 93, 97, 98, 101, 102, 106, 108, 109, 110, 111], "summary": {"covered_lines": 53, "num_statements": 53, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"DefaultExample.foo": {"executed_lines": [17], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "DefaultExample.var_args": {"executed_lines": [27, 28, 30, 31], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "DefaultExample.var_kwargs": {"executed_lines": [38, 40, 41], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "DefaultExample.var_args_and_kwargs": {"executed_lines": [48, 50, 51, 52, 53], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "DefaultExample.var_args_and_kwargs_provided_outer": {"executed_lines": [60, 61], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "DefaultExample.var_args_and_kwargs_provided": {"executed_lines": [70, 72, 73, 74, 75], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "DefaultExample.positional_only": {"executed_lines": [87, 88, 89], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "var_args_and_kwargs_provided_outer": {"executed_lines": [97, 98], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "var_args_and_kwargs_provided": {"executed_lines": [106, 108, 109, 110, 111], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 2, 6, 8, 11, 12, 14, 15, 19, 20, 33, 34, 43, 44, 55, 56, 65, 66, 77, 78, 92, 93, 101, 102], "summary": {"covered_lines": 23, "num_statements": 23, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"DefaultExample": {"executed_lines": [17, 27, 28, 30, 31, 38, 40, 41, 48, 50, 51, 52, 53, 60, 61, 70, 72, 73, 74, 75, 87, 88, 89], "summary": {"covered_lines": 23, "num_statements": 23, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 2, 6, 8, 11, 12, 14, 15, 19, 20, 33, 34, 43, 44, 55, 56, 65, 66, 77, 78, 92, 93, 97, 98, 101, 102, 106, 108, 109, 110, 111], "summary": {"covered_lines": 30, "num_statements": 30, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "example/invalid_order.py": {"executed_lines": [1, 5, 7, 10, 11], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1}, "missing_lines": [], "excluded_lines": [13], "functions": {"wrong_order": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1}, "missing_lines": [], "excluded_lines": [13]}, "": {"executed_lines": [1, 5, 7, 10, 11], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"": {"executed_lines": [1, 5, 7, 10, 11], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1}, "missing_lines": [], "excluded_lines": [13]}}}, "example/logging_config.py": {"executed_lines": [1, 2, 4, 5, 35, 151, 153, 156, 171, 173, 180, 182, 183, 186, 188, 189, 190, 191, 194, 195, 197, 198, 199, 200, 203, 207, 209, 210, 211, 212, 215, 221, 223, 224, 225, 226, 227], "summary": {"covered_lines": 37, "num_statements": 37, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"runtime": {"executed_lines": [153], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "make_some_logs": {"executed_lines": [188, 189, 190, 191], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "make_some_annotated_logs": {"executed_lines": [197, 198, 199, 200], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "make_some_weird_logs": {"executed_lines": [209, 210, 211, 212], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "log_really_long_message": {"executed_lines": [223, 224, 225, 226, 227], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 2, 4, 5, 35, 151, 156, 171, 173, 180, 182, 183, 186, 194, 195, 203, 207, 215, 221], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"": {"executed_lines": [1, 2, 4, 5, 35, 151, 153, 156, 171, 173, 180, 182, 183, 186, 188, 189, 190, 191, 194, 195, 197, 198, 199, 200, 203, 207, 209, 210, 211, 212, 215, 221, 223, 224, 225, 226, 227], "summary": {"covered_lines": 37, "num_statements": 37, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}}, "totals": {"covered_lines": 820, "num_statements": 820, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 7}}, "coverage_path": "."} \ No newline at end of file diff --git a/endpoint.json b/endpoint.json new file mode 100644 index 0000000..2c66a68 --- /dev/null +++ b/endpoint.json @@ -0,0 +1 @@ +{"schemaVersion": 1, "label": "Coverage", "message": "100%", "color": "brightgreen"} \ No newline at end of file From 1257f93a10c075c7cccf660762e180c359ecf05a Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 11 Dec 2024 21:45:45 +0000 Subject: [PATCH 02/11] Update coverage data --- README.md | 15 +- data.json | 2 +- htmlcov/class_index.html | 332 ++++++ htmlcov/coverage_html_cb_6fb7b396.js | 733 ++++++++++++ htmlcov/favicon_32_cb_58284776.png | Bin 0 -> 1732 bytes htmlcov/function_index.html | 948 +++++++++++++++ htmlcov/index.html | 175 +++ htmlcov/keybd_closed_cb_ce680311.png | Bin 0 -> 9004 bytes htmlcov/status.json | 1 + htmlcov/style_cb_8e611ae1.css | 337 ++++++ htmlcov/z_70983d692f648185_actions_py.html | 145 +++ htmlcov/z_70983d692f648185_api_py.html | 168 +++ htmlcov/z_70983d692f648185_calculator_py.html | 329 +++++ htmlcov/z_70983d692f648185_default_py.html | 208 ++++ .../z_70983d692f648185_invalid_order_py.html | 110 ++ .../z_70983d692f648185_logging_config_py.html | 324 +++++ htmlcov/z_beb44c9891d1179a___init___py.html | 1058 +++++++++++++++++ htmlcov/z_beb44c9891d1179a_filter_py.html | 155 +++ htmlcov/z_beb44c9891d1179a_mocks_py.html | 350 ++++++ htmlcov/z_beb44c9891d1179a_plugins_py.html | 305 +++++ 20 files changed, 5692 insertions(+), 3 deletions(-) create mode 100644 htmlcov/class_index.html create mode 100644 htmlcov/coverage_html_cb_6fb7b396.js create mode 100644 htmlcov/favicon_32_cb_58284776.png create mode 100644 htmlcov/function_index.html create mode 100644 htmlcov/index.html create mode 100644 htmlcov/keybd_closed_cb_ce680311.png create mode 100644 htmlcov/status.json create mode 100644 htmlcov/style_cb_8e611ae1.css create mode 100644 htmlcov/z_70983d692f648185_actions_py.html create mode 100644 htmlcov/z_70983d692f648185_api_py.html create mode 100644 htmlcov/z_70983d692f648185_calculator_py.html create mode 100644 htmlcov/z_70983d692f648185_default_py.html create mode 100644 htmlcov/z_70983d692f648185_invalid_order_py.html create mode 100644 htmlcov/z_70983d692f648185_logging_config_py.html create mode 100644 htmlcov/z_beb44c9891d1179a___init___py.html create mode 100644 htmlcov/z_beb44c9891d1179a_filter_py.html create mode 100644 htmlcov/z_beb44c9891d1179a_mocks_py.html create mode 100644 htmlcov/z_beb44c9891d1179a_plugins_py.html diff --git a/README.md b/README.md index 037dfe6..16bf818 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Repository Coverage - +[Full report](https://htmlpreview.github.io/?https://github.com/github/annotated-logger/blob/python-coverage-comment-action-data/htmlcov/index.html) | Name | Stmts | Miss | Cover | Missing | |---------------------------------- | -------: | -------: | -------: | --------: | @@ -24,11 +24,22 @@ Below are examples of the badges you can use in your main branch `README` file. ### Direct image -[![Coverage badge](https://github.com/github/annotated-logger/raw/python-coverage-comment-action-data/badge.svg)](https://github.com/github/annotated-logger/tree/python-coverage-comment-action-data) +[![Coverage badge](https://raw.githubusercontent.com/github/annotated-logger/python-coverage-comment-action-data/badge.svg)](https://htmlpreview.github.io/?https://github.com/github/annotated-logger/blob/python-coverage-comment-action-data/htmlcov/index.html) This is the one to use if your repository is private or if you don't want to customize anything. +### [Shields.io](https://shields.io) Json Endpoint + +[![Coverage badge](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/github/annotated-logger/python-coverage-comment-action-data/endpoint.json)](https://htmlpreview.github.io/?https://github.com/github/annotated-logger/blob/python-coverage-comment-action-data/htmlcov/index.html) + +Using this one will allow you to [customize](https://shields.io/endpoint) the look of your badge. +It won't work with private repositories. It won't be refreshed more than once per five minutes. + +### [Shields.io](https://shields.io) Dynamic Badge + +[![Coverage badge](https://img.shields.io/badge/dynamic/json?color=brightgreen&label=coverage&query=%24.message&url=https%3A%2F%2Fraw.githubusercontent.com%2Fgithub%2Fannotated-logger%2Fpython-coverage-comment-action-data%2Fendpoint.json)](https://htmlpreview.github.io/?https://github.com/github/annotated-logger/blob/python-coverage-comment-action-data/htmlcov/index.html) +This one will always be the same color. It won't work for private repos. I'm not even sure why we included it. ## What is that? diff --git a/data.json b/data.json index cba97d2..61fdc6c 100644 --- a/data.json +++ b/data.json @@ -1 +1 @@ -{"coverage": 100.0, "raw_data": {"meta": {"format": 3, "version": "7.6.4", "timestamp": "2024-12-05T20:15:35.623649", "branch_coverage": false, "show_contexts": false}, "files": {"annotated_logger/__init__.py": {"executed_lines": [1, 3, 4, 5, 6, 7, 8, 9, 10, 24, 26, 27, 29, 32, 34, 35, 36, 37, 38, 39, 40, 41, 44, 45, 47, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 61, 62, 63, 64, 67, 68, 70, 80, 88, 91, 122, 123, 125, 135, 136, 137, 138, 139, 146, 148, 150, 151, 153, 155, 156, 157, 158, 159, 160, 161, 163, 164, 167, 168, 170, 177, 178, 179, 180, 184, 186, 195, 197, 209, 211, 219, 220, 222, 223, 224, 226, 227, 228, 229, 230, 231, 232, 233, 234, 240, 241, 242, 244, 246, 247, 249, 252, 253, 269, 301, 302, 304, 305, 306, 307, 308, 309, 310, 312, 313, 314, 315, 316, 317, 318, 324, 325, 327, 329, 341, 342, 346, 348, 350, 353, 355, 362, 363, 364, 365, 366, 367, 368, 370, 371, 372, 374, 381, 382, 391, 392, 402, 403, 413, 414, 424, 425, 434, 435, 446, 447, 458, 459, 470, 471, 484, 485, 496, 497, 507, 508, 519, 520, 531, 532, 545, 546, 556, 557, 568, 569, 580, 581, 596, 597, 608, 609, 622, 623, 636, 637, 652, 695, 696, 700, 701, 705, 706, 710, 711, 715, 716, 718, 721, 723, 726, 729, 730, 731, 732, 734, 736, 740, 744, 745, 747, 749, 752, 753, 754, 755, 756, 758, 759, 760, 761, 762, 763, 764, 765, 766, 768, 769, 771, 775, 776, 777, 778, 779, 780, 783, 784, 785, 786, 788, 790, 792, 804, 805, 806, 807, 810, 811, 812, 813, 815, 816, 817, 819, 824, 825, 828, 830, 834, 835, 836, 838, 839, 840, 841, 850, 858, 860, 862, 871, 872, 873, 874, 876, 877, 880, 881, 883, 885, 895, 896, 897, 898, 900, 901, 904, 905, 906, 908, 911, 912, 913, 914, 915, 916, 917, 918, 920, 922, 929, 930, 931, 932, 933, 935, 936, 937, 938, 941, 943, 949, 955, 956, 957, 958, 959, 960, 961], "summary": {"covered_lines": 313, "num_statements": 313, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 30], "functions": {"AnnotatedIterator.__init__": {"executed_lines": [135, 136, 137, 138, 139, 146], "summary": {"covered_lines": 6, "num_statements": 6, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedIterator.__iter__": {"executed_lines": [150, 151], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedIterator.__next__": {"executed_lines": [155, 156, 157, 158, 159, 160, 161, 163, 164], "summary": {"covered_lines": 9, "num_statements": 9, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedAdapter.__init__": {"executed_lines": [177, 178, 179, 180, 184], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedAdapter.iterator": {"executed_lines": [195], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedAdapter.process": {"executed_lines": [209], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedAdapter.log": {"executed_lines": [219, 220, 222, 223, 224, 226, 227, 228, 229, 230, 231, 232, 233, 234, 240, 241, 242], "summary": {"covered_lines": 17, "num_statements": 17, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedAdapter.annotate": {"executed_lines": [246, 247, 249], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger.__init__": {"executed_lines": [301, 302, 304, 305, 306, 307, 308, 309, 310, 312, 313, 314, 315, 316, 317, 318, 324, 325, 327], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger._generate_logger": {"executed_lines": [341, 342, 346, 348], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger._action_annotation": {"executed_lines": [353], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger.generate_filter": {"executed_lines": [362, 363, 364, 365, 366, 367, 368, 370, 371, 372, 374], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger.annotate_logs": {"executed_lines": [695, 696, 700, 701, 705, 706, 710, 711, 715, 718, 790], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger.annotate_logs.decorator": {"executed_lines": [721, 723, 734, 736, 740, 744, 788], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger.annotate_logs.decorator.wrap_class": {"executed_lines": [726, 729, 730, 731, 732], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger.annotate_logs.decorator.wrap_function": {"executed_lines": [745, 747, 749, 752, 753, 754, 755, 756, 758, 759, 760, 761, 762, 763, 764, 765, 766, 768, 769, 771, 775, 776, 777, 778, 779, 780, 783, 784, 785, 786], "summary": {"covered_lines": 30, "num_statements": 30, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger._determine_signature_adjustments": {"executed_lines": [804, 805, 806, 807, 810, 811, 812, 813, 815, 816, 817, 819, 860], "summary": {"covered_lines": 13, "num_statements": 13, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger._determine_signature_adjustments.inject_logger": {"executed_lines": [824, 825, 828, 830, 834, 835, 836, 838, 839, 840, 841, 850, 858], "summary": {"covered_lines": 13, "num_statements": 13, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger._inject_by_kwarg": {"executed_lines": [871, 872, 873, 874, 876, 877, 880, 881, 883], "summary": {"covered_lines": 9, "num_statements": 9, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger._inject_by_index": {"executed_lines": [895, 896, 897, 898, 900, 901, 904, 905, 906], "summary": {"covered_lines": 9, "num_statements": 9, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger._check_parameters_for_self_and_cls": {"executed_lines": [911, 912, 913, 914, 915, 916, 917, 918, 920], "summary": {"covered_lines": 9, "num_statements": 9, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger._pick_correct_logger": {"executed_lines": [929, 930, 931, 932, 933, 935, 936, 937, 938, 941, 943], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "_attempt_post_call": {"executed_lines": [955, 956, 957, 958, 959, 960, 961], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 3, 4, 5, 6, 7, 8, 9, 10, 24, 26, 27, 29, 32, 34, 35, 36, 37, 38, 39, 40, 41, 44, 45, 47, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 61, 62, 63, 64, 67, 68, 70, 80, 88, 91, 122, 123, 125, 148, 153, 167, 168, 170, 186, 197, 211, 244, 252, 253, 269, 329, 350, 355, 381, 382, 391, 392, 402, 403, 413, 414, 424, 425, 434, 435, 446, 447, 458, 459, 470, 471, 484, 485, 496, 497, 507, 508, 519, 520, 531, 532, 545, 546, 556, 557, 568, 569, 580, 581, 596, 597, 608, 609, 622, 623, 636, 637, 652, 792, 862, 885, 908, 922, 949], "summary": {"covered_lines": 109, "num_statements": 109, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 30]}}, "classes": {"AnnotatedClass": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedIterator": {"executed_lines": [135, 136, 137, 138, 139, 146, 150, 151, 155, 156, 157, 158, 159, 160, 161, 163, 164], "summary": {"covered_lines": 17, "num_statements": 17, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedAdapter": {"executed_lines": [177, 178, 179, 180, 184, 195, 209, 219, 220, 222, 223, 224, 226, 227, 228, 229, 230, 231, 232, 233, 234, 240, 241, 242, 246, 247, 249], "summary": {"covered_lines": 27, "num_statements": 27, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger": {"executed_lines": [301, 302, 304, 305, 306, 307, 308, 309, 310, 312, 313, 314, 315, 316, 317, 318, 324, 325, 327, 341, 342, 346, 348, 353, 362, 363, 364, 365, 366, 367, 368, 370, 371, 372, 374, 695, 696, 700, 701, 705, 706, 710, 711, 715, 716, 718, 721, 723, 726, 729, 730, 731, 732, 734, 736, 740, 744, 745, 747, 749, 752, 753, 754, 755, 756, 758, 759, 760, 761, 762, 763, 764, 765, 766, 768, 769, 771, 775, 776, 777, 778, 779, 780, 783, 784, 785, 786, 788, 790, 804, 805, 806, 807, 810, 811, 812, 813, 815, 816, 817, 819, 824, 825, 828, 830, 834, 835, 836, 838, 839, 840, 841, 850, 858, 860, 871, 872, 873, 874, 876, 877, 880, 881, 883, 895, 896, 897, 898, 900, 901, 904, 905, 906, 911, 912, 913, 914, 915, 916, 917, 918, 920, 929, 930, 931, 932, 933, 935, 936, 937, 938, 941, 943], "summary": {"covered_lines": 153, "num_statements": 153, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 3, 4, 5, 6, 7, 8, 9, 10, 24, 26, 27, 29, 32, 34, 35, 36, 37, 38, 39, 40, 41, 44, 45, 47, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 61, 62, 63, 64, 67, 68, 70, 80, 88, 91, 122, 123, 125, 148, 153, 167, 168, 170, 186, 197, 211, 244, 252, 253, 269, 329, 350, 355, 381, 382, 391, 392, 402, 403, 413, 414, 424, 425, 434, 435, 446, 447, 458, 459, 470, 471, 484, 485, 496, 497, 507, 508, 519, 520, 531, 532, 545, 546, 556, 557, 568, 569, 580, 581, 596, 597, 608, 609, 622, 623, 636, 637, 652, 792, 862, 885, 908, 922, 949, 955, 956, 957, 958, 959, 960, 961], "summary": {"covered_lines": 116, "num_statements": 116, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 30]}}}, "annotated_logger/filter.py": {"executed_lines": [1, 3, 4, 5, 7, 9, 12, 13, 15, 22, 23, 24, 29, 31, 32, 33, 34, 35, 36, 38, 46, 47, 48, 49, 50, 51, 52, 53, 54, 56, 57, 58], "summary": {"covered_lines": 31, "num_statements": 31, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"AnnotatedFilter.__init__": {"executed_lines": [22, 23, 24, 29], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedFilter._all_annotations": {"executed_lines": [32, 33, 34, 35, 36], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedFilter.filter": {"executed_lines": [46, 47, 48, 49, 50, 51, 52, 53, 54, 56, 57, 58], "summary": {"covered_lines": 12, "num_statements": 12, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 3, 4, 5, 7, 9, 12, 13, 15, 31, 38], "summary": {"covered_lines": 10, "num_statements": 10, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"AnnotatedFilter": {"executed_lines": [22, 23, 24, 29, 32, 33, 34, 35, 36, 46, 47, 48, 49, 50, 51, 52, 53, 54, 56, 57, 58], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 3, 4, 5, 7, 9, 12, 13, 15, 31, 38], "summary": {"covered_lines": 10, "num_statements": 10, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "annotated_logger/mocks.py": {"executed_lines": [1, 3, 4, 6, 7, 10, 11, 13, 23, 24, 25, 26, 27, 28, 29, 31, 33, 34, 35, 36, 37, 38, 39, 41, 43, 44, 45, 47, 48, 49, 50, 51, 52, 53, 58, 61, 63, 65, 66, 67, 68, 72, 73, 74, 75, 76, 78, 79, 80, 82, 83, 84, 87, 90, 91, 92, 97, 98, 100, 101, 102, 104, 108, 111, 117, 125, 126, 130, 131, 135, 136, 138, 139, 140, 141, 142, 143, 144, 145, 147, 149, 156, 159, 160, 162, 163, 191, 193, 194, 195, 197, 199, 201, 203, 204, 205, 207, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 237, 238, 240, 243, 244, 246, 247, 248, 252, 253], "summary": {"covered_lines": 124, "num_statements": 124, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"AssertLogged.__init__": {"executed_lines": [23, 24, 25, 26, 27, 28, 29], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AssertLogged.check": {"executed_lines": [33, 34, 35, 36, 37, 38, 39, 41, 43, 44, 45], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AssertLogged._failed_sort_key": {"executed_lines": [48, 49, 50, 51, 52, 53, 58, 61], "summary": {"covered_lines": 8, "num_statements": 8, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AssertLogged.build_message": {"executed_lines": [65, 66, 67, 68, 72, 73, 74, 75, 76, 78, 79, 80, 82, 83, 84, 87, 90, 91, 92, 97, 98, 100, 101, 102], "summary": {"covered_lines": 24, "num_statements": 24, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AssertLogged._check_record_matches": {"executed_lines": [108, 111, 117, 125, 126, 130, 131, 135, 136, 138, 139, 140, 141, 142, 143, 144, 145, 147, 149, 156], "summary": {"covered_lines": 20, "num_statements": 20, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogMock.__init__": {"executed_lines": [193, 194, 195], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogMock.__getattr__": {"executed_lines": [199], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogMock.handle": {"executed_lines": [203, 204, 205], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogMock.assert_logged": {"executed_lines": [216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "annotated_logger_object": {"executed_lines": [240], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "annotated_logger_mock": {"executed_lines": [246, 247, 248, 252, 253], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 3, 4, 6, 7, 10, 11, 13, 31, 47, 63, 104, 159, 160, 162, 163, 191, 197, 201, 207, 237, 238, 243, 244], "summary": {"covered_lines": 22, "num_statements": 22, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"AssertLogged": {"executed_lines": [23, 24, 25, 26, 27, 28, 29, 33, 34, 35, 36, 37, 38, 39, 41, 43, 44, 45, 48, 49, 50, 51, 52, 53, 58, 61, 65, 66, 67, 68, 72, 73, 74, 75, 76, 78, 79, 80, 82, 83, 84, 87, 90, 91, 92, 97, 98, 100, 101, 102, 108, 111, 117, 125, 126, 130, 131, 135, 136, 138, 139, 140, 141, 142, 143, 144, 145, 147, 149, 156], "summary": {"covered_lines": 70, "num_statements": 70, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogMock": {"executed_lines": [193, 194, 195, 199, 203, 204, 205, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234], "summary": {"covered_lines": 26, "num_statements": 26, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 3, 4, 6, 7, 10, 11, 13, 31, 47, 63, 104, 159, 160, 162, 163, 191, 197, 201, 207, 237, 238, 240, 243, 244, 246, 247, 248, 252, 253], "summary": {"covered_lines": 28, "num_statements": 28, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "annotated_logger/plugins.py": {"executed_lines": [1, 3, 4, 5, 7, 9, 11, 15, 16, 18, 20, 22, 26, 27, 28, 29, 30, 33, 34, 36, 40, 42, 44, 45, 46, 49, 50, 52, 56, 57, 58, 59, 62, 63, 65, 66, 68, 70, 71, 73, 75, 76, 77, 78, 79, 80, 81, 84, 85, 87, 89, 90, 91, 93, 95, 96, 97, 98, 101, 102, 104, 106, 107, 108, 110, 112, 113, 114, 115, 116, 117, 120, 121, 123, 125, 127, 130, 134, 135, 136, 137, 138, 139, 140, 142, 143, 146, 147, 149, 151, 152, 153, 155, 157, 158, 160, 165, 166, 167, 168, 169, 171, 173, 175], "summary": {"covered_lines": 92, "num_statements": 92, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 4}, "missing_lines": [], "excluded_lines": [11, 12, 167, 168], "functions": {"BasePlugin.filter": {"executed_lines": [20], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "BasePlugin.uncaught_exception": {"executed_lines": [26, 27, 28, 29, 30], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "RuntimeAnnotationsPlugin.__init__": {"executed_lines": [40], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "RuntimeAnnotationsPlugin.filter": {"executed_lines": [44, 45, 46], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "RequestsPlugin.uncaught_exception": {"executed_lines": [56, 57, 58, 59], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "RenamerPlugin.__init__": {"executed_lines": [70, 71], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "RenamerPlugin.filter": {"executed_lines": [75, 76, 77, 78, 79, 80, 81], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "RemoverPlugin.__init__": {"executed_lines": [89, 90, 91], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "RemoverPlugin.filter": {"executed_lines": [95, 96, 97, 98], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "NameAdjusterPlugin.__init__": {"executed_lines": [106, 107, 108], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "NameAdjusterPlugin.filter": {"executed_lines": [112, 113, 114, 115, 116, 117], "summary": {"covered_lines": 6, "num_statements": 6, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "NestedRemoverPlugin.__init__": {"executed_lines": [125], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "NestedRemoverPlugin.filter": {"executed_lines": [130, 142, 143], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "NestedRemoverPlugin.filter.delete_keys_nested": {"executed_lines": [134, 135, 136, 137, 138, 139, 140], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "GitHubActionsPlugin.__init__": {"executed_lines": [151, 152, 153], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "GitHubActionsPlugin.filter": {"executed_lines": [157, 158, 160, 165, 166, 167, 168, 169, 171], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [167, 168]}, "GitHubActionsPlugin.logging_config": {"executed_lines": [175], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 3, 4, 5, 7, 9, 11, 15, 16, 18, 22, 33, 34, 36, 42, 49, 50, 52, 62, 63, 65, 66, 68, 73, 84, 85, 87, 93, 101, 102, 104, 110, 120, 121, 123, 127, 146, 147, 149, 155, 173], "summary": {"covered_lines": 31, "num_statements": 31, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [11, 12]}}, "classes": {"BasePlugin": {"executed_lines": [20, 26, 27, 28, 29, 30], "summary": {"covered_lines": 6, "num_statements": 6, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "RuntimeAnnotationsPlugin": {"executed_lines": [40, 44, 45, 46], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "RequestsPlugin": {"executed_lines": [56, 57, 58, 59], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "RenamerPlugin": {"executed_lines": [70, 71, 75, 76, 77, 78, 79, 80, 81], "summary": {"covered_lines": 9, "num_statements": 9, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "RenamerPlugin.FieldNotPresentError": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "RemoverPlugin": {"executed_lines": [89, 90, 91, 95, 96, 97, 98], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "NameAdjusterPlugin": {"executed_lines": [106, 107, 108, 112, 113, 114, 115, 116, 117], "summary": {"covered_lines": 9, "num_statements": 9, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "NestedRemoverPlugin": {"executed_lines": [125, 130, 134, 135, 136, 137, 138, 139, 140, 142, 143], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "GitHubActionsPlugin": {"executed_lines": [151, 152, 153, 157, 158, 160, 165, 166, 167, 168, 169, 171, 175], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [167, 168]}, "": {"executed_lines": [1, 3, 4, 5, 7, 9, 11, 15, 16, 18, 22, 33, 34, 36, 42, 49, 50, 52, 62, 63, 65, 66, 68, 73, 84, 85, 87, 93, 101, 102, 104, 110, 120, 121, 123, 127, 146, 147, 149, 155, 173], "summary": {"covered_lines": 31, "num_statements": 31, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [11, 12]}}}, "example/__init__.py": {"executed_lines": [0], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "example/actions.py": {"executed_lines": [1, 2, 4, 9, 11, 13, 21, 22, 23, 24, 26, 34, 37, 38, 40, 41, 43, 45, 46, 48], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"ActionsExample.first_step": {"executed_lines": [43], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "ActionsExample.second_step": {"executed_lines": [48], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 2, 4, 9, 11, 13, 21, 22, 23, 24, 26, 34, 37, 38, 40, 41, 45, 46], "summary": {"covered_lines": 17, "num_statements": 17, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"ActionsExample": {"executed_lines": [43, 48], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 2, 4, 9, 11, 13, 21, 22, 23, 24, 26, 34, 37, 38, 40, 41, 45, 46], "summary": {"covered_lines": 17, "num_statements": 17, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "example/api.py": {"executed_lines": [1, 3, 4, 6, 7, 9, 10, 13, 15, 18, 28, 31, 32, 33, 35, 37, 39, 40, 42, 43, 44, 45, 47, 48, 50, 51, 52, 53, 54, 56, 57, 59, 60, 61, 62, 64, 66, 68, 69, 70, 71], "summary": {"covered_lines": 40, "num_statements": 40, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"runtime": {"executed_lines": [15], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "ApiClient.pre_call": {"executed_lines": [37], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "ApiClient.check": {"executed_lines": [42, 43, 44, 45], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "ApiClient.check_again": {"executed_lines": [50, 51, 52, 53, 54], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "ApiClient.prepare": {"executed_lines": [59, 60, 61, 62], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "ApiClient.throw_http_exception": {"executed_lines": [68, 69, 70, 71], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 3, 4, 6, 7, 9, 10, 13, 18, 28, 31, 32, 33, 35, 39, 40, 47, 48, 56, 57, 64, 66], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"ApiClient": {"executed_lines": [37, 42, 43, 44, 45, 50, 51, 52, 53, 54, 59, 60, 61, 62, 68, 69, 70, 71], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 3, 4, 6, 7, 9, 10, 13, 15, 18, 28, 31, 32, 33, 35, 39, 40, 47, 48, 56, 57, 64, 66], "summary": {"covered_lines": 22, "num_statements": 22, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "example/calculator.py": {"executed_lines": [1, 3, 5, 6, 14, 15, 18, 20, 23, 39, 41, 44, 45, 51, 57, 58, 59, 61, 63, 64, 65, 66, 68, 75, 77, 84, 85, 86, 87, 88, 89, 90, 94, 100, 102, 106, 107, 108, 111, 112, 114, 120, 124, 126, 128, 129, 133, 134, 136, 138, 139, 143, 144, 145, 146, 147, 149, 150, 153, 155, 159, 162, 163, 164, 165, 167, 168, 170, 171, 173, 174, 176, 177, 178, 179, 180, 182, 183, 185, 187, 188, 190, 192, 193, 195, 196, 199, 200, 201, 202, 204, 205, 209, 212, 213, 214, 215, 217, 218, 219, 221, 222, 223, 225, 226, 227, 231, 232], "summary": {"covered_lines": 106, "num_statements": 106, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"runtime": {"executed_lines": [20], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.__init__": {"executed_lines": [57, 58, 59], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.check_zero_division": {"executed_lines": [63, 64, 65, 66], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.will_pass": {"executed_lines": [75], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.check_prediction_crashed_correctly": {"executed_lines": [84, 85, 86, 87, 88, 89, 90], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.divide": {"executed_lines": [102, 106, 107, 108, 111, 112], "summary": {"covered_lines": 6, "num_statements": 6, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.multiply": {"executed_lines": [124, 126], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.multiply2": {"executed_lines": [133, 134, 136], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.power": {"executed_lines": [143, 144, 145, 146, 147], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.add": {"executed_lines": [153, 155, 159, 162, 163, 164, 165], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.subtract": {"executed_lines": [170, 171], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.inverse": {"executed_lines": [176, 177, 178, 179, 180], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.pemdas_example": {"executed_lines": [185], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.is_odd": {"executed_lines": [190], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.factorial": {"executed_lines": [195, 196, 199, 200, 201, 202], "summary": {"covered_lines": 6, "num_statements": 6, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.sensitive_factorial": {"executed_lines": [209, 212, 213, 214, 215], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.is_math_cool": {"executed_lines": [221, 222, 223], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.sanity_check": {"executed_lines": [231, 232], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 3, 5, 6, 14, 15, 18, 23, 39, 41, 44, 45, 51, 61, 68, 77, 94, 100, 114, 120, 128, 129, 138, 139, 149, 150, 167, 168, 173, 174, 182, 183, 187, 188, 192, 193, 204, 205, 217, 218, 219, 225, 226, 227], "summary": {"covered_lines": 42, "num_statements": 42, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"BoomError": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator": {"executed_lines": [57, 58, 59, 63, 64, 65, 66, 75, 84, 85, 86, 87, 88, 89, 90, 102, 106, 107, 108, 111, 112, 124, 126, 133, 134, 136, 143, 144, 145, 146, 147, 153, 155, 159, 162, 163, 164, 165, 170, 171, 176, 177, 178, 179, 180, 185, 190, 195, 196, 199, 200, 201, 202, 209, 212, 213, 214, 215, 221, 222, 223, 231, 232], "summary": {"covered_lines": 63, "num_statements": 63, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 3, 5, 6, 14, 15, 18, 20, 23, 39, 41, 44, 45, 51, 61, 68, 77, 94, 100, 114, 120, 128, 129, 138, 139, 149, 150, 167, 168, 173, 174, 182, 183, 187, 188, 192, 193, 204, 205, 217, 218, 219, 225, 226, 227], "summary": {"covered_lines": 43, "num_statements": 43, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "example/default.py": {"executed_lines": [1, 2, 6, 8, 11, 12, 14, 15, 17, 19, 20, 27, 28, 30, 31, 33, 34, 38, 40, 41, 43, 44, 48, 50, 51, 52, 53, 55, 56, 60, 61, 65, 66, 70, 72, 73, 74, 75, 77, 78, 87, 88, 89, 92, 93, 97, 98, 101, 102, 106, 108, 109, 110, 111], "summary": {"covered_lines": 53, "num_statements": 53, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"DefaultExample.foo": {"executed_lines": [17], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "DefaultExample.var_args": {"executed_lines": [27, 28, 30, 31], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "DefaultExample.var_kwargs": {"executed_lines": [38, 40, 41], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "DefaultExample.var_args_and_kwargs": {"executed_lines": [48, 50, 51, 52, 53], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "DefaultExample.var_args_and_kwargs_provided_outer": {"executed_lines": [60, 61], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "DefaultExample.var_args_and_kwargs_provided": {"executed_lines": [70, 72, 73, 74, 75], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "DefaultExample.positional_only": {"executed_lines": [87, 88, 89], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "var_args_and_kwargs_provided_outer": {"executed_lines": [97, 98], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "var_args_and_kwargs_provided": {"executed_lines": [106, 108, 109, 110, 111], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 2, 6, 8, 11, 12, 14, 15, 19, 20, 33, 34, 43, 44, 55, 56, 65, 66, 77, 78, 92, 93, 101, 102], "summary": {"covered_lines": 23, "num_statements": 23, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"DefaultExample": {"executed_lines": [17, 27, 28, 30, 31, 38, 40, 41, 48, 50, 51, 52, 53, 60, 61, 70, 72, 73, 74, 75, 87, 88, 89], "summary": {"covered_lines": 23, "num_statements": 23, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 2, 6, 8, 11, 12, 14, 15, 19, 20, 33, 34, 43, 44, 55, 56, 65, 66, 77, 78, 92, 93, 97, 98, 101, 102, 106, 108, 109, 110, 111], "summary": {"covered_lines": 30, "num_statements": 30, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "example/invalid_order.py": {"executed_lines": [1, 5, 7, 10, 11], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1}, "missing_lines": [], "excluded_lines": [13], "functions": {"wrong_order": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1}, "missing_lines": [], "excluded_lines": [13]}, "": {"executed_lines": [1, 5, 7, 10, 11], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"": {"executed_lines": [1, 5, 7, 10, 11], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1}, "missing_lines": [], "excluded_lines": [13]}}}, "example/logging_config.py": {"executed_lines": [1, 2, 4, 5, 35, 151, 153, 156, 171, 173, 180, 182, 183, 186, 188, 189, 190, 191, 194, 195, 197, 198, 199, 200, 203, 207, 209, 210, 211, 212, 215, 221, 223, 224, 225, 226, 227], "summary": {"covered_lines": 37, "num_statements": 37, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"runtime": {"executed_lines": [153], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "make_some_logs": {"executed_lines": [188, 189, 190, 191], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "make_some_annotated_logs": {"executed_lines": [197, 198, 199, 200], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "make_some_weird_logs": {"executed_lines": [209, 210, 211, 212], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "log_really_long_message": {"executed_lines": [223, 224, 225, 226, 227], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 2, 4, 5, 35, 151, 156, 171, 173, 180, 182, 183, 186, 194, 195, 203, 207, 215, 221], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"": {"executed_lines": [1, 2, 4, 5, 35, 151, 153, 156, 171, 173, 180, 182, 183, 186, 188, 189, 190, 191, 194, 195, 197, 198, 199, 200, 203, 207, 209, 210, 211, 212, 215, 221, 223, 224, 225, 226, 227], "summary": {"covered_lines": 37, "num_statements": 37, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}}, "totals": {"covered_lines": 820, "num_statements": 820, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 7}}, "coverage_path": "."} \ No newline at end of file +{"coverage": 100.0, "raw_data": {"meta": {"format": 3, "version": "7.6.4", "timestamp": "2024-12-11T21:45:44.542119", "branch_coverage": false, "show_contexts": false}, "files": {"annotated_logger/__init__.py": {"executed_lines": [1, 3, 4, 5, 6, 7, 8, 9, 10, 24, 26, 27, 29, 32, 34, 35, 36, 37, 38, 39, 40, 41, 44, 45, 47, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 61, 62, 63, 64, 67, 68, 70, 80, 88, 91, 122, 123, 125, 135, 136, 137, 138, 139, 146, 148, 150, 151, 153, 155, 156, 157, 158, 159, 160, 161, 163, 164, 167, 168, 170, 177, 178, 179, 180, 184, 186, 195, 197, 209, 211, 219, 220, 222, 223, 224, 226, 227, 228, 229, 230, 231, 232, 233, 234, 240, 241, 242, 244, 246, 247, 249, 252, 253, 269, 301, 302, 304, 305, 306, 307, 308, 309, 310, 312, 313, 314, 315, 316, 317, 318, 324, 325, 327, 329, 341, 342, 346, 348, 350, 353, 355, 362, 363, 364, 365, 366, 367, 368, 370, 371, 372, 374, 381, 382, 391, 392, 402, 403, 413, 414, 424, 425, 434, 435, 446, 447, 458, 459, 470, 471, 484, 485, 496, 497, 507, 508, 519, 520, 531, 532, 545, 546, 556, 557, 568, 569, 580, 581, 596, 597, 608, 609, 622, 623, 636, 637, 652, 695, 696, 700, 701, 705, 706, 710, 711, 715, 716, 718, 721, 723, 726, 729, 730, 731, 732, 734, 736, 740, 744, 745, 747, 749, 752, 753, 754, 755, 756, 758, 759, 760, 761, 762, 763, 764, 765, 766, 768, 769, 771, 775, 776, 777, 778, 779, 780, 783, 784, 785, 786, 788, 790, 792, 804, 805, 806, 807, 810, 811, 812, 813, 815, 816, 817, 819, 824, 825, 828, 830, 834, 835, 836, 838, 839, 840, 841, 850, 858, 860, 862, 871, 872, 873, 874, 876, 877, 880, 881, 883, 885, 895, 896, 897, 898, 900, 901, 904, 905, 906, 908, 911, 912, 913, 914, 915, 916, 917, 918, 920, 922, 929, 930, 931, 932, 933, 935, 936, 937, 938, 941, 943, 949, 955, 956, 957, 958, 959, 960, 961], "summary": {"covered_lines": 313, "num_statements": 313, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 30], "functions": {"AnnotatedIterator.__init__": {"executed_lines": [135, 136, 137, 138, 139, 146], "summary": {"covered_lines": 6, "num_statements": 6, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedIterator.__iter__": {"executed_lines": [150, 151], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedIterator.__next__": {"executed_lines": [155, 156, 157, 158, 159, 160, 161, 163, 164], "summary": {"covered_lines": 9, "num_statements": 9, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedAdapter.__init__": {"executed_lines": [177, 178, 179, 180, 184], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedAdapter.iterator": {"executed_lines": [195], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedAdapter.process": {"executed_lines": [209], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedAdapter.log": {"executed_lines": [219, 220, 222, 223, 224, 226, 227, 228, 229, 230, 231, 232, 233, 234, 240, 241, 242], "summary": {"covered_lines": 17, "num_statements": 17, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedAdapter.annotate": {"executed_lines": [246, 247, 249], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger.__init__": {"executed_lines": [301, 302, 304, 305, 306, 307, 308, 309, 310, 312, 313, 314, 315, 316, 317, 318, 324, 325, 327], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger._generate_logger": {"executed_lines": [341, 342, 346, 348], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger._action_annotation": {"executed_lines": [353], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger.generate_filter": {"executed_lines": [362, 363, 364, 365, 366, 367, 368, 370, 371, 372, 374], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger.annotate_logs": {"executed_lines": [695, 696, 700, 701, 705, 706, 710, 711, 715, 718, 790], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger.annotate_logs.decorator": {"executed_lines": [721, 723, 734, 736, 740, 744, 788], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger.annotate_logs.decorator.wrap_class": {"executed_lines": [726, 729, 730, 731, 732], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger.annotate_logs.decorator.wrap_function": {"executed_lines": [745, 747, 749, 752, 753, 754, 755, 756, 758, 759, 760, 761, 762, 763, 764, 765, 766, 768, 769, 771, 775, 776, 777, 778, 779, 780, 783, 784, 785, 786], "summary": {"covered_lines": 30, "num_statements": 30, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger._determine_signature_adjustments": {"executed_lines": [804, 805, 806, 807, 810, 811, 812, 813, 815, 816, 817, 819, 860], "summary": {"covered_lines": 13, "num_statements": 13, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger._determine_signature_adjustments.inject_logger": {"executed_lines": [824, 825, 828, 830, 834, 835, 836, 838, 839, 840, 841, 850, 858], "summary": {"covered_lines": 13, "num_statements": 13, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger._inject_by_kwarg": {"executed_lines": [871, 872, 873, 874, 876, 877, 880, 881, 883], "summary": {"covered_lines": 9, "num_statements": 9, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger._inject_by_index": {"executed_lines": [895, 896, 897, 898, 900, 901, 904, 905, 906], "summary": {"covered_lines": 9, "num_statements": 9, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger._check_parameters_for_self_and_cls": {"executed_lines": [911, 912, 913, 914, 915, 916, 917, 918, 920], "summary": {"covered_lines": 9, "num_statements": 9, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger._pick_correct_logger": {"executed_lines": [929, 930, 931, 932, 933, 935, 936, 937, 938, 941, 943], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "_attempt_post_call": {"executed_lines": [955, 956, 957, 958, 959, 960, 961], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 3, 4, 5, 6, 7, 8, 9, 10, 24, 26, 27, 29, 32, 34, 35, 36, 37, 38, 39, 40, 41, 44, 45, 47, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 61, 62, 63, 64, 67, 68, 70, 80, 88, 91, 122, 123, 125, 148, 153, 167, 168, 170, 186, 197, 211, 244, 252, 253, 269, 329, 350, 355, 381, 382, 391, 392, 402, 403, 413, 414, 424, 425, 434, 435, 446, 447, 458, 459, 470, 471, 484, 485, 496, 497, 507, 508, 519, 520, 531, 532, 545, 546, 556, 557, 568, 569, 580, 581, 596, 597, 608, 609, 622, 623, 636, 637, 652, 792, 862, 885, 908, 922, 949], "summary": {"covered_lines": 109, "num_statements": 109, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 30]}}, "classes": {"AnnotatedClass": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedIterator": {"executed_lines": [135, 136, 137, 138, 139, 146, 150, 151, 155, 156, 157, 158, 159, 160, 161, 163, 164], "summary": {"covered_lines": 17, "num_statements": 17, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedAdapter": {"executed_lines": [177, 178, 179, 180, 184, 195, 209, 219, 220, 222, 223, 224, 226, 227, 228, 229, 230, 231, 232, 233, 234, 240, 241, 242, 246, 247, 249], "summary": {"covered_lines": 27, "num_statements": 27, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger": {"executed_lines": [301, 302, 304, 305, 306, 307, 308, 309, 310, 312, 313, 314, 315, 316, 317, 318, 324, 325, 327, 341, 342, 346, 348, 353, 362, 363, 364, 365, 366, 367, 368, 370, 371, 372, 374, 695, 696, 700, 701, 705, 706, 710, 711, 715, 716, 718, 721, 723, 726, 729, 730, 731, 732, 734, 736, 740, 744, 745, 747, 749, 752, 753, 754, 755, 756, 758, 759, 760, 761, 762, 763, 764, 765, 766, 768, 769, 771, 775, 776, 777, 778, 779, 780, 783, 784, 785, 786, 788, 790, 804, 805, 806, 807, 810, 811, 812, 813, 815, 816, 817, 819, 824, 825, 828, 830, 834, 835, 836, 838, 839, 840, 841, 850, 858, 860, 871, 872, 873, 874, 876, 877, 880, 881, 883, 895, 896, 897, 898, 900, 901, 904, 905, 906, 911, 912, 913, 914, 915, 916, 917, 918, 920, 929, 930, 931, 932, 933, 935, 936, 937, 938, 941, 943], "summary": {"covered_lines": 153, "num_statements": 153, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 3, 4, 5, 6, 7, 8, 9, 10, 24, 26, 27, 29, 32, 34, 35, 36, 37, 38, 39, 40, 41, 44, 45, 47, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 61, 62, 63, 64, 67, 68, 70, 80, 88, 91, 122, 123, 125, 148, 153, 167, 168, 170, 186, 197, 211, 244, 252, 253, 269, 329, 350, 355, 381, 382, 391, 392, 402, 403, 413, 414, 424, 425, 434, 435, 446, 447, 458, 459, 470, 471, 484, 485, 496, 497, 507, 508, 519, 520, 531, 532, 545, 546, 556, 557, 568, 569, 580, 581, 596, 597, 608, 609, 622, 623, 636, 637, 652, 792, 862, 885, 908, 922, 949, 955, 956, 957, 958, 959, 960, 961], "summary": {"covered_lines": 116, "num_statements": 116, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 30]}}}, "annotated_logger/filter.py": {"executed_lines": [1, 3, 4, 5, 7, 9, 12, 13, 15, 22, 23, 24, 29, 31, 32, 33, 34, 35, 36, 38, 46, 47, 48, 49, 50, 51, 52, 53, 54, 56, 57, 58], "summary": {"covered_lines": 31, "num_statements": 31, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"AnnotatedFilter.__init__": {"executed_lines": [22, 23, 24, 29], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedFilter._all_annotations": {"executed_lines": [32, 33, 34, 35, 36], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedFilter.filter": {"executed_lines": [46, 47, 48, 49, 50, 51, 52, 53, 54, 56, 57, 58], "summary": {"covered_lines": 12, "num_statements": 12, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 3, 4, 5, 7, 9, 12, 13, 15, 31, 38], "summary": {"covered_lines": 10, "num_statements": 10, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"AnnotatedFilter": {"executed_lines": [22, 23, 24, 29, 32, 33, 34, 35, 36, 46, 47, 48, 49, 50, 51, 52, 53, 54, 56, 57, 58], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 3, 4, 5, 7, 9, 12, 13, 15, 31, 38], "summary": {"covered_lines": 10, "num_statements": 10, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "annotated_logger/mocks.py": {"executed_lines": [1, 3, 4, 6, 7, 10, 11, 13, 23, 24, 25, 26, 27, 28, 29, 31, 33, 34, 35, 36, 37, 38, 39, 41, 43, 44, 45, 47, 48, 49, 50, 51, 52, 53, 58, 61, 63, 65, 66, 67, 68, 72, 73, 74, 75, 76, 78, 79, 80, 82, 83, 84, 87, 90, 91, 92, 97, 98, 100, 101, 102, 104, 108, 111, 117, 125, 126, 130, 131, 135, 136, 138, 139, 140, 141, 142, 143, 144, 145, 147, 149, 156, 159, 160, 162, 163, 191, 193, 194, 195, 197, 199, 201, 203, 204, 205, 207, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 237, 238, 240, 243, 244, 246, 247, 248, 252, 253], "summary": {"covered_lines": 124, "num_statements": 124, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"AssertLogged.__init__": {"executed_lines": [23, 24, 25, 26, 27, 28, 29], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AssertLogged.check": {"executed_lines": [33, 34, 35, 36, 37, 38, 39, 41, 43, 44, 45], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AssertLogged._failed_sort_key": {"executed_lines": [48, 49, 50, 51, 52, 53, 58, 61], "summary": {"covered_lines": 8, "num_statements": 8, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AssertLogged.build_message": {"executed_lines": [65, 66, 67, 68, 72, 73, 74, 75, 76, 78, 79, 80, 82, 83, 84, 87, 90, 91, 92, 97, 98, 100, 101, 102], "summary": {"covered_lines": 24, "num_statements": 24, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AssertLogged._check_record_matches": {"executed_lines": [108, 111, 117, 125, 126, 130, 131, 135, 136, 138, 139, 140, 141, 142, 143, 144, 145, 147, 149, 156], "summary": {"covered_lines": 20, "num_statements": 20, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogMock.__init__": {"executed_lines": [193, 194, 195], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogMock.__getattr__": {"executed_lines": [199], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogMock.handle": {"executed_lines": [203, 204, 205], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogMock.assert_logged": {"executed_lines": [216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "annotated_logger_object": {"executed_lines": [240], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "annotated_logger_mock": {"executed_lines": [246, 247, 248, 252, 253], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 3, 4, 6, 7, 10, 11, 13, 31, 47, 63, 104, 159, 160, 162, 163, 191, 197, 201, 207, 237, 238, 243, 244], "summary": {"covered_lines": 22, "num_statements": 22, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"AssertLogged": {"executed_lines": [23, 24, 25, 26, 27, 28, 29, 33, 34, 35, 36, 37, 38, 39, 41, 43, 44, 45, 48, 49, 50, 51, 52, 53, 58, 61, 65, 66, 67, 68, 72, 73, 74, 75, 76, 78, 79, 80, 82, 83, 84, 87, 90, 91, 92, 97, 98, 100, 101, 102, 108, 111, 117, 125, 126, 130, 131, 135, 136, 138, 139, 140, 141, 142, 143, 144, 145, 147, 149, 156], "summary": {"covered_lines": 70, "num_statements": 70, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogMock": {"executed_lines": [193, 194, 195, 199, 203, 204, 205, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234], "summary": {"covered_lines": 26, "num_statements": 26, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 3, 4, 6, 7, 10, 11, 13, 31, 47, 63, 104, 159, 160, 162, 163, 191, 197, 201, 207, 237, 238, 240, 243, 244, 246, 247, 248, 252, 253], "summary": {"covered_lines": 28, "num_statements": 28, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "annotated_logger/plugins.py": {"executed_lines": [1, 3, 4, 5, 7, 9, 11, 15, 16, 18, 20, 22, 26, 27, 28, 29, 30, 33, 34, 36, 40, 42, 44, 45, 46, 49, 50, 52, 56, 57, 58, 59, 62, 63, 65, 66, 68, 70, 71, 73, 75, 76, 77, 78, 79, 80, 81, 84, 85, 87, 89, 90, 91, 93, 95, 96, 97, 98, 101, 102, 104, 106, 107, 108, 110, 112, 113, 114, 115, 116, 117, 120, 121, 123, 125, 127, 130, 134, 135, 136, 137, 138, 139, 140, 142, 143, 146, 147, 149, 151, 152, 153, 155, 157, 158, 160, 165, 166, 167, 168, 169, 171, 173, 175], "summary": {"covered_lines": 92, "num_statements": 92, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 4}, "missing_lines": [], "excluded_lines": [11, 12, 167, 168], "functions": {"BasePlugin.filter": {"executed_lines": [20], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "BasePlugin.uncaught_exception": {"executed_lines": [26, 27, 28, 29, 30], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "RuntimeAnnotationsPlugin.__init__": {"executed_lines": [40], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "RuntimeAnnotationsPlugin.filter": {"executed_lines": [44, 45, 46], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "RequestsPlugin.uncaught_exception": {"executed_lines": [56, 57, 58, 59], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "RenamerPlugin.__init__": {"executed_lines": [70, 71], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "RenamerPlugin.filter": {"executed_lines": [75, 76, 77, 78, 79, 80, 81], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "RemoverPlugin.__init__": {"executed_lines": [89, 90, 91], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "RemoverPlugin.filter": {"executed_lines": [95, 96, 97, 98], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "NameAdjusterPlugin.__init__": {"executed_lines": [106, 107, 108], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "NameAdjusterPlugin.filter": {"executed_lines": [112, 113, 114, 115, 116, 117], "summary": {"covered_lines": 6, "num_statements": 6, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "NestedRemoverPlugin.__init__": {"executed_lines": [125], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "NestedRemoverPlugin.filter": {"executed_lines": [130, 142, 143], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "NestedRemoverPlugin.filter.delete_keys_nested": {"executed_lines": [134, 135, 136, 137, 138, 139, 140], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "GitHubActionsPlugin.__init__": {"executed_lines": [151, 152, 153], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "GitHubActionsPlugin.filter": {"executed_lines": [157, 158, 160, 165, 166, 167, 168, 169, 171], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [167, 168]}, "GitHubActionsPlugin.logging_config": {"executed_lines": [175], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 3, 4, 5, 7, 9, 11, 15, 16, 18, 22, 33, 34, 36, 42, 49, 50, 52, 62, 63, 65, 66, 68, 73, 84, 85, 87, 93, 101, 102, 104, 110, 120, 121, 123, 127, 146, 147, 149, 155, 173], "summary": {"covered_lines": 31, "num_statements": 31, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [11, 12]}}, "classes": {"BasePlugin": {"executed_lines": [20, 26, 27, 28, 29, 30], "summary": {"covered_lines": 6, "num_statements": 6, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "RuntimeAnnotationsPlugin": {"executed_lines": [40, 44, 45, 46], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "RequestsPlugin": {"executed_lines": [56, 57, 58, 59], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "RenamerPlugin": {"executed_lines": [70, 71, 75, 76, 77, 78, 79, 80, 81], "summary": {"covered_lines": 9, "num_statements": 9, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "RenamerPlugin.FieldNotPresentError": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "RemoverPlugin": {"executed_lines": [89, 90, 91, 95, 96, 97, 98], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "NameAdjusterPlugin": {"executed_lines": [106, 107, 108, 112, 113, 114, 115, 116, 117], "summary": {"covered_lines": 9, "num_statements": 9, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "NestedRemoverPlugin": {"executed_lines": [125, 130, 134, 135, 136, 137, 138, 139, 140, 142, 143], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "GitHubActionsPlugin": {"executed_lines": [151, 152, 153, 157, 158, 160, 165, 166, 167, 168, 169, 171, 175], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [167, 168]}, "": {"executed_lines": [1, 3, 4, 5, 7, 9, 11, 15, 16, 18, 22, 33, 34, 36, 42, 49, 50, 52, 62, 63, 65, 66, 68, 73, 84, 85, 87, 93, 101, 102, 104, 110, 120, 121, 123, 127, 146, 147, 149, 155, 173], "summary": {"covered_lines": 31, "num_statements": 31, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [11, 12]}}}, "example/__init__.py": {"executed_lines": [0], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "example/actions.py": {"executed_lines": [1, 2, 4, 9, 11, 13, 21, 22, 23, 24, 26, 34, 37, 38, 40, 41, 43, 45, 46, 48], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"ActionsExample.first_step": {"executed_lines": [43], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "ActionsExample.second_step": {"executed_lines": [48], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 2, 4, 9, 11, 13, 21, 22, 23, 24, 26, 34, 37, 38, 40, 41, 45, 46], "summary": {"covered_lines": 17, "num_statements": 17, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"ActionsExample": {"executed_lines": [43, 48], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 2, 4, 9, 11, 13, 21, 22, 23, 24, 26, 34, 37, 38, 40, 41, 45, 46], "summary": {"covered_lines": 17, "num_statements": 17, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "example/api.py": {"executed_lines": [1, 3, 4, 6, 7, 9, 10, 13, 15, 18, 28, 31, 32, 33, 35, 37, 39, 40, 42, 43, 44, 45, 47, 48, 50, 51, 52, 53, 54, 56, 57, 59, 60, 61, 62, 64, 66, 68, 69, 70, 71], "summary": {"covered_lines": 40, "num_statements": 40, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"runtime": {"executed_lines": [15], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "ApiClient.pre_call": {"executed_lines": [37], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "ApiClient.check": {"executed_lines": [42, 43, 44, 45], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "ApiClient.check_again": {"executed_lines": [50, 51, 52, 53, 54], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "ApiClient.prepare": {"executed_lines": [59, 60, 61, 62], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "ApiClient.throw_http_exception": {"executed_lines": [68, 69, 70, 71], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 3, 4, 6, 7, 9, 10, 13, 18, 28, 31, 32, 33, 35, 39, 40, 47, 48, 56, 57, 64, 66], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"ApiClient": {"executed_lines": [37, 42, 43, 44, 45, 50, 51, 52, 53, 54, 59, 60, 61, 62, 68, 69, 70, 71], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 3, 4, 6, 7, 9, 10, 13, 15, 18, 28, 31, 32, 33, 35, 39, 40, 47, 48, 56, 57, 64, 66], "summary": {"covered_lines": 22, "num_statements": 22, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "example/calculator.py": {"executed_lines": [1, 3, 5, 6, 14, 15, 18, 20, 23, 39, 41, 44, 45, 51, 57, 58, 59, 61, 63, 64, 65, 66, 68, 75, 77, 84, 85, 86, 87, 88, 89, 90, 94, 100, 102, 106, 107, 108, 111, 112, 114, 120, 124, 126, 128, 129, 133, 134, 136, 138, 139, 143, 144, 145, 146, 147, 149, 150, 153, 155, 159, 162, 163, 164, 165, 167, 168, 170, 171, 173, 174, 176, 177, 178, 179, 180, 182, 183, 185, 187, 188, 190, 192, 193, 195, 196, 199, 200, 201, 202, 204, 205, 209, 212, 213, 214, 215, 217, 218, 219, 221, 222, 223, 225, 226, 227, 231, 232], "summary": {"covered_lines": 106, "num_statements": 106, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"runtime": {"executed_lines": [20], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.__init__": {"executed_lines": [57, 58, 59], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.check_zero_division": {"executed_lines": [63, 64, 65, 66], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.will_pass": {"executed_lines": [75], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.check_prediction_crashed_correctly": {"executed_lines": [84, 85, 86, 87, 88, 89, 90], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.divide": {"executed_lines": [102, 106, 107, 108, 111, 112], "summary": {"covered_lines": 6, "num_statements": 6, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.multiply": {"executed_lines": [124, 126], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.multiply2": {"executed_lines": [133, 134, 136], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.power": {"executed_lines": [143, 144, 145, 146, 147], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.add": {"executed_lines": [153, 155, 159, 162, 163, 164, 165], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.subtract": {"executed_lines": [170, 171], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.inverse": {"executed_lines": [176, 177, 178, 179, 180], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.pemdas_example": {"executed_lines": [185], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.is_odd": {"executed_lines": [190], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.factorial": {"executed_lines": [195, 196, 199, 200, 201, 202], "summary": {"covered_lines": 6, "num_statements": 6, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.sensitive_factorial": {"executed_lines": [209, 212, 213, 214, 215], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.is_math_cool": {"executed_lines": [221, 222, 223], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.sanity_check": {"executed_lines": [231, 232], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 3, 5, 6, 14, 15, 18, 23, 39, 41, 44, 45, 51, 61, 68, 77, 94, 100, 114, 120, 128, 129, 138, 139, 149, 150, 167, 168, 173, 174, 182, 183, 187, 188, 192, 193, 204, 205, 217, 218, 219, 225, 226, 227], "summary": {"covered_lines": 42, "num_statements": 42, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"BoomError": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator": {"executed_lines": [57, 58, 59, 63, 64, 65, 66, 75, 84, 85, 86, 87, 88, 89, 90, 102, 106, 107, 108, 111, 112, 124, 126, 133, 134, 136, 143, 144, 145, 146, 147, 153, 155, 159, 162, 163, 164, 165, 170, 171, 176, 177, 178, 179, 180, 185, 190, 195, 196, 199, 200, 201, 202, 209, 212, 213, 214, 215, 221, 222, 223, 231, 232], "summary": {"covered_lines": 63, "num_statements": 63, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 3, 5, 6, 14, 15, 18, 20, 23, 39, 41, 44, 45, 51, 61, 68, 77, 94, 100, 114, 120, 128, 129, 138, 139, 149, 150, 167, 168, 173, 174, 182, 183, 187, 188, 192, 193, 204, 205, 217, 218, 219, 225, 226, 227], "summary": {"covered_lines": 43, "num_statements": 43, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "example/default.py": {"executed_lines": [1, 2, 6, 8, 11, 12, 14, 15, 17, 19, 20, 27, 28, 30, 31, 33, 34, 38, 40, 41, 43, 44, 48, 50, 51, 52, 53, 55, 56, 60, 61, 65, 66, 70, 72, 73, 74, 75, 77, 78, 87, 88, 89, 92, 93, 97, 98, 101, 102, 106, 108, 109, 110, 111], "summary": {"covered_lines": 53, "num_statements": 53, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"DefaultExample.foo": {"executed_lines": [17], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "DefaultExample.var_args": {"executed_lines": [27, 28, 30, 31], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "DefaultExample.var_kwargs": {"executed_lines": [38, 40, 41], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "DefaultExample.var_args_and_kwargs": {"executed_lines": [48, 50, 51, 52, 53], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "DefaultExample.var_args_and_kwargs_provided_outer": {"executed_lines": [60, 61], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "DefaultExample.var_args_and_kwargs_provided": {"executed_lines": [70, 72, 73, 74, 75], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "DefaultExample.positional_only": {"executed_lines": [87, 88, 89], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "var_args_and_kwargs_provided_outer": {"executed_lines": [97, 98], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "var_args_and_kwargs_provided": {"executed_lines": [106, 108, 109, 110, 111], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 2, 6, 8, 11, 12, 14, 15, 19, 20, 33, 34, 43, 44, 55, 56, 65, 66, 77, 78, 92, 93, 101, 102], "summary": {"covered_lines": 23, "num_statements": 23, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"DefaultExample": {"executed_lines": [17, 27, 28, 30, 31, 38, 40, 41, 48, 50, 51, 52, 53, 60, 61, 70, 72, 73, 74, 75, 87, 88, 89], "summary": {"covered_lines": 23, "num_statements": 23, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 2, 6, 8, 11, 12, 14, 15, 19, 20, 33, 34, 43, 44, 55, 56, 65, 66, 77, 78, 92, 93, 97, 98, 101, 102, 106, 108, 109, 110, 111], "summary": {"covered_lines": 30, "num_statements": 30, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "example/invalid_order.py": {"executed_lines": [1, 5, 7, 10, 11], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1}, "missing_lines": [], "excluded_lines": [13], "functions": {"wrong_order": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1}, "missing_lines": [], "excluded_lines": [13]}, "": {"executed_lines": [1, 5, 7, 10, 11], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"": {"executed_lines": [1, 5, 7, 10, 11], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1}, "missing_lines": [], "excluded_lines": [13]}}}, "example/logging_config.py": {"executed_lines": [1, 2, 4, 5, 35, 151, 153, 156, 171, 173, 180, 182, 183, 186, 188, 189, 190, 191, 194, 195, 197, 198, 199, 200, 203, 207, 209, 210, 211, 212, 215, 221, 223, 224, 225, 226, 227], "summary": {"covered_lines": 37, "num_statements": 37, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"runtime": {"executed_lines": [153], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "make_some_logs": {"executed_lines": [188, 189, 190, 191], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "make_some_annotated_logs": {"executed_lines": [197, 198, 199, 200], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "make_some_weird_logs": {"executed_lines": [209, 210, 211, 212], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "log_really_long_message": {"executed_lines": [223, 224, 225, 226, 227], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 2, 4, 5, 35, 151, 156, 171, 173, 180, 182, 183, 186, 194, 195, 203, 207, 215, 221], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"": {"executed_lines": [1, 2, 4, 5, 35, 151, 153, 156, 171, 173, 180, 182, 183, 186, 188, 189, 190, 191, 194, 195, 197, 198, 199, 200, 203, 207, 209, 210, 211, 212, 215, 221, 223, 224, 225, 226, 227], "summary": {"covered_lines": 37, "num_statements": 37, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}}, "totals": {"covered_lines": 820, "num_statements": 820, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 7}}, "coverage_path": "."} \ No newline at end of file diff --git a/htmlcov/class_index.html b/htmlcov/class_index.html new file mode 100644 index 0000000..b49b2f7 --- /dev/null +++ b/htmlcov/class_index.html @@ -0,0 +1,332 @@ + + + + + Coverage report + + + + + +
+
+

Coverage report: + 100% +

+ +
+ +
+ + +
+
+

+ Files + Functions + Classes +

+

+ coverage.py v7.6.4, + created at 2024-12-11 21:45 +0000 +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Fileclassstatementsmissingexcludedcoverage
annotated_logger/__init__.pyAnnotatedIterator1700100%
annotated_logger/__init__.pyAnnotatedAdapter2700100%
annotated_logger/__init__.pyAnnotatedLogger15300100%
annotated_logger/__init__.py(no class)11602100%
annotated_logger/filter.pyAnnotatedFilter2100100%
annotated_logger/filter.py(no class)1000100%
annotated_logger/mocks.pyAssertLogged7000100%
annotated_logger/mocks.pyAnnotatedLogMock2600100%
annotated_logger/mocks.py(no class)2800100%
annotated_logger/plugins.pyBasePlugin600100%
annotated_logger/plugins.pyRuntimeAnnotationsPlugin400100%
annotated_logger/plugins.pyRequestsPlugin400100%
annotated_logger/plugins.pyRenamerPlugin900100%
annotated_logger/plugins.pyRemoverPlugin700100%
annotated_logger/plugins.pyNameAdjusterPlugin900100%
annotated_logger/plugins.pyNestedRemoverPlugin1100100%
annotated_logger/plugins.pyGitHubActionsPlugin1102100%
annotated_logger/plugins.py(no class)3102100%
example/actions.pyActionsExample200100%
example/actions.py(no class)1700100%
example/api.pyApiClient1800100%
example/api.py(no class)2200100%
example/calculator.pyCalculator6300100%
example/calculator.py(no class)4300100%
example/default.pyDefaultExample2300100%
example/default.py(no class)3000100%
example/invalid_order.py(no class)501100%
example/logging_config.py(no class)3700100%
Total 82007100%
+

+ No items found using the specified filter. +

+

3 empty classes skipped.

+
+ + + diff --git a/htmlcov/coverage_html_cb_6fb7b396.js b/htmlcov/coverage_html_cb_6fb7b396.js new file mode 100644 index 0000000..1face13 --- /dev/null +++ b/htmlcov/coverage_html_cb_6fb7b396.js @@ -0,0 +1,733 @@ +// Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 +// For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt + +// Coverage.py HTML report browser code. +/*jslint browser: true, sloppy: true, vars: true, plusplus: true, maxerr: 50, indent: 4 */ +/*global coverage: true, document, window, $ */ + +coverage = {}; + +// General helpers +function debounce(callback, wait) { + let timeoutId = null; + return function(...args) { + clearTimeout(timeoutId); + timeoutId = setTimeout(() => { + callback.apply(this, args); + }, wait); + }; +}; + +function checkVisible(element) { + const rect = element.getBoundingClientRect(); + const viewBottom = Math.max(document.documentElement.clientHeight, window.innerHeight); + const viewTop = 30; + return !(rect.bottom < viewTop || rect.top >= viewBottom); +} + +function on_click(sel, fn) { + const elt = document.querySelector(sel); + if (elt) { + elt.addEventListener("click", fn); + } +} + +// Helpers for table sorting +function getCellValue(row, column = 0) { + const cell = row.cells[column] // nosemgrep: eslint.detect-object-injection + if (cell.childElementCount == 1) { + var child = cell.firstElementChild; + if (child.tagName === "A") { + child = child.firstElementChild; + } + if (child instanceof HTMLDataElement && child.value) { + return child.value; + } + } + return cell.innerText || cell.textContent; +} + +function rowComparator(rowA, rowB, column = 0) { + let valueA = getCellValue(rowA, column); + let valueB = getCellValue(rowB, column); + if (!isNaN(valueA) && !isNaN(valueB)) { + return valueA - valueB; + } + return valueA.localeCompare(valueB, undefined, {numeric: true}); +} + +function sortColumn(th) { + // Get the current sorting direction of the selected header, + // clear state on other headers and then set the new sorting direction. + const currentSortOrder = th.getAttribute("aria-sort"); + [...th.parentElement.cells].forEach(header => header.setAttribute("aria-sort", "none")); + var direction; + if (currentSortOrder === "none") { + direction = th.dataset.defaultSortOrder || "ascending"; + } + else if (currentSortOrder === "ascending") { + direction = "descending"; + } + else { + direction = "ascending"; + } + th.setAttribute("aria-sort", direction); + + const column = [...th.parentElement.cells].indexOf(th) + + // Sort all rows and afterwards append them in order to move them in the DOM. + Array.from(th.closest("table").querySelectorAll("tbody tr")) + .sort((rowA, rowB) => rowComparator(rowA, rowB, column) * (direction === "ascending" ? 1 : -1)) + .forEach(tr => tr.parentElement.appendChild(tr)); + + // Save the sort order for next time. + if (th.id !== "region") { + let th_id = "file"; // Sort by file if we don't have a column id + let current_direction = direction; + const stored_list = localStorage.getItem(coverage.INDEX_SORT_STORAGE); + if (stored_list) { + ({th_id, direction} = JSON.parse(stored_list)) + } + localStorage.setItem(coverage.INDEX_SORT_STORAGE, JSON.stringify({ + "th_id": th.id, + "direction": current_direction + })); + if (th.id !== th_id || document.getElementById("region")) { + // Sort column has changed, unset sorting by function or class. + localStorage.setItem(coverage.SORTED_BY_REGION, JSON.stringify({ + "by_region": false, + "region_direction": current_direction + })); + } + } + else { + // Sort column has changed to by function or class, remember that. + localStorage.setItem(coverage.SORTED_BY_REGION, JSON.stringify({ + "by_region": true, + "region_direction": direction + })); + } +} + +// Find all the elements with data-shortcut attribute, and use them to assign a shortcut key. +coverage.assign_shortkeys = function () { + document.querySelectorAll("[data-shortcut]").forEach(element => { + document.addEventListener("keypress", event => { + if (event.target.tagName.toLowerCase() === "input") { + return; // ignore keypress from search filter + } + if (event.key === element.dataset.shortcut) { + element.click(); + } + }); + }); +}; + +// Create the events for the filter box. +coverage.wire_up_filter = function () { + // Populate the filter and hide100 inputs if there are saved values for them. + const saved_filter_value = localStorage.getItem(coverage.FILTER_STORAGE); + if (saved_filter_value) { + document.getElementById("filter").value = saved_filter_value; + } + const saved_hide100_value = localStorage.getItem(coverage.HIDE100_STORAGE); + if (saved_hide100_value) { + document.getElementById("hide100").checked = JSON.parse(saved_hide100_value); + } + + // Cache elements. + const table = document.querySelector("table.index"); + const table_body_rows = table.querySelectorAll("tbody tr"); + const no_rows = document.getElementById("no_rows"); + + // Observe filter keyevents. + const filter_handler = (event => { + // Keep running total of each metric, first index contains number of shown rows + const totals = new Array(table.rows[0].cells.length).fill(0); + // Accumulate the percentage as fraction + totals[totals.length - 1] = { "numer": 0, "denom": 0 }; // nosemgrep: eslint.detect-object-injection + + var text = document.getElementById("filter").value; + // Store filter value + localStorage.setItem(coverage.FILTER_STORAGE, text); + const casefold = (text === text.toLowerCase()); + const hide100 = document.getElementById("hide100").checked; + // Store hide value. + localStorage.setItem(coverage.HIDE100_STORAGE, JSON.stringify(hide100)); + + // Hide / show elements. + table_body_rows.forEach(row => { + var show = false; + // Check the text filter. + for (let column = 0; column < totals.length; column++) { + cell = row.cells[column]; + if (cell.classList.contains("name")) { + var celltext = cell.textContent; + if (casefold) { + celltext = celltext.toLowerCase(); + } + if (celltext.includes(text)) { + show = true; + } + } + } + + // Check the "hide covered" filter. + if (show && hide100) { + const [numer, denom] = row.cells[row.cells.length - 1].dataset.ratio.split(" "); + show = (numer !== denom); + } + + if (!show) { + // hide + row.classList.add("hidden"); + return; + } + + // show + row.classList.remove("hidden"); + totals[0]++; + + for (let column = 0; column < totals.length; column++) { + // Accumulate dynamic totals + cell = row.cells[column] // nosemgrep: eslint.detect-object-injection + if (cell.classList.contains("name")) { + continue; + } + if (column === totals.length - 1) { + // Last column contains percentage + const [numer, denom] = cell.dataset.ratio.split(" "); + totals[column]["numer"] += parseInt(numer, 10); // nosemgrep: eslint.detect-object-injection + totals[column]["denom"] += parseInt(denom, 10); // nosemgrep: eslint.detect-object-injection + } + else { + totals[column] += parseInt(cell.textContent, 10); // nosemgrep: eslint.detect-object-injection + } + } + }); + + // Show placeholder if no rows will be displayed. + if (!totals[0]) { + // Show placeholder, hide table. + no_rows.style.display = "block"; + table.style.display = "none"; + return; + } + + // Hide placeholder, show table. + no_rows.style.display = null; + table.style.display = null; + + const footer = table.tFoot.rows[0]; + // Calculate new dynamic sum values based on visible rows. + for (let column = 0; column < totals.length; column++) { + // Get footer cell element. + const cell = footer.cells[column]; // nosemgrep: eslint.detect-object-injection + if (cell.classList.contains("name")) { + continue; + } + + // Set value into dynamic footer cell element. + if (column === totals.length - 1) { + // Percentage column uses the numerator and denominator, + // and adapts to the number of decimal places. + const match = /\.([0-9]+)/.exec(cell.textContent); + const places = match ? match[1].length : 0; + const { numer, denom } = totals[column]; // nosemgrep: eslint.detect-object-injection + cell.dataset.ratio = `${numer} ${denom}`; + // Check denom to prevent NaN if filtered files contain no statements + cell.textContent = denom + ? `${(numer * 100 / denom).toFixed(places)}%` + : `${(100).toFixed(places)}%`; + } + else { + cell.textContent = totals[column]; // nosemgrep: eslint.detect-object-injection + } + } + }); + + document.getElementById("filter").addEventListener("input", debounce(filter_handler)); + document.getElementById("hide100").addEventListener("input", debounce(filter_handler)); + + // Trigger change event on setup, to force filter on page refresh + // (filter value may still be present). + document.getElementById("filter").dispatchEvent(new Event("input")); + document.getElementById("hide100").dispatchEvent(new Event("input")); +}; +coverage.FILTER_STORAGE = "COVERAGE_FILTER_VALUE"; +coverage.HIDE100_STORAGE = "COVERAGE_HIDE100_VALUE"; + +// Set up the click-to-sort columns. +coverage.wire_up_sorting = function () { + document.querySelectorAll("[data-sortable] th[aria-sort]").forEach( + th => th.addEventListener("click", e => sortColumn(e.target)) + ); + + // Look for a localStorage item containing previous sort settings: + let th_id = "file", direction = "ascending"; + const stored_list = localStorage.getItem(coverage.INDEX_SORT_STORAGE); + if (stored_list) { + ({th_id, direction} = JSON.parse(stored_list)); + } + let by_region = false, region_direction = "ascending"; + const sorted_by_region = localStorage.getItem(coverage.SORTED_BY_REGION); + if (sorted_by_region) { + ({ + by_region, + region_direction + } = JSON.parse(sorted_by_region)); + } + + const region_id = "region"; + if (by_region && document.getElementById(region_id)) { + direction = region_direction; + } + // If we are in a page that has a column with id of "region", sort on + // it if the last sort was by function or class. + let th; + if (document.getElementById(region_id)) { + th = document.getElementById(by_region ? region_id : th_id); + } + else { + th = document.getElementById(th_id); + } + th.setAttribute("aria-sort", direction === "ascending" ? "descending" : "ascending"); + th.click() +}; + +coverage.INDEX_SORT_STORAGE = "COVERAGE_INDEX_SORT_2"; +coverage.SORTED_BY_REGION = "COVERAGE_SORT_REGION"; + +// Loaded on index.html +coverage.index_ready = function () { + coverage.assign_shortkeys(); + coverage.wire_up_filter(); + coverage.wire_up_sorting(); + + on_click(".button_prev_file", coverage.to_prev_file); + on_click(".button_next_file", coverage.to_next_file); + + on_click(".button_show_hide_help", coverage.show_hide_help); +}; + +// -- pyfile stuff -- + +coverage.LINE_FILTERS_STORAGE = "COVERAGE_LINE_FILTERS"; + +coverage.pyfile_ready = function () { + // If we're directed to a particular line number, highlight the line. + var frag = location.hash; + if (frag.length > 2 && frag[1] === "t") { + document.querySelector(frag).closest(".n").classList.add("highlight"); + coverage.set_sel(parseInt(frag.substr(2), 10)); + } + else { + coverage.set_sel(0); + } + + on_click(".button_toggle_run", coverage.toggle_lines); + on_click(".button_toggle_mis", coverage.toggle_lines); + on_click(".button_toggle_exc", coverage.toggle_lines); + on_click(".button_toggle_par", coverage.toggle_lines); + + on_click(".button_next_chunk", coverage.to_next_chunk_nicely); + on_click(".button_prev_chunk", coverage.to_prev_chunk_nicely); + on_click(".button_top_of_page", coverage.to_top); + on_click(".button_first_chunk", coverage.to_first_chunk); + + on_click(".button_prev_file", coverage.to_prev_file); + on_click(".button_next_file", coverage.to_next_file); + on_click(".button_to_index", coverage.to_index); + + on_click(".button_show_hide_help", coverage.show_hide_help); + + coverage.filters = undefined; + try { + coverage.filters = localStorage.getItem(coverage.LINE_FILTERS_STORAGE); + } catch(err) {} + + if (coverage.filters) { + coverage.filters = JSON.parse(coverage.filters); + } + else { + coverage.filters = {run: false, exc: true, mis: true, par: true}; + } + + for (cls in coverage.filters) { + coverage.set_line_visibilty(cls, coverage.filters[cls]); // nosemgrep: eslint.detect-object-injection + } + + coverage.assign_shortkeys(); + coverage.init_scroll_markers(); + coverage.wire_up_sticky_header(); + + document.querySelectorAll("[id^=ctxs]").forEach( + cbox => cbox.addEventListener("click", coverage.expand_contexts) + ); + + // Rebuild scroll markers when the window height changes. + window.addEventListener("resize", coverage.build_scroll_markers); +}; + +coverage.toggle_lines = function (event) { + const btn = event.target.closest("button"); + const category = btn.value + const show = !btn.classList.contains("show_" + category); + coverage.set_line_visibilty(category, show); + coverage.build_scroll_markers(); + coverage.filters[category] = show; + try { + localStorage.setItem(coverage.LINE_FILTERS_STORAGE, JSON.stringify(coverage.filters)); + } catch(err) {} +}; + +coverage.set_line_visibilty = function (category, should_show) { + const cls = "show_" + category; + const btn = document.querySelector(".button_toggle_" + category); + if (btn) { + if (should_show) { + document.querySelectorAll("#source ." + category).forEach(e => e.classList.add(cls)); + btn.classList.add(cls); + } + else { + document.querySelectorAll("#source ." + category).forEach(e => e.classList.remove(cls)); + btn.classList.remove(cls); + } + } +}; + +// Return the nth line div. +coverage.line_elt = function (n) { + return document.getElementById("t" + n)?.closest("p"); +}; + +// Set the selection. b and e are line numbers. +coverage.set_sel = function (b, e) { + // The first line selected. + coverage.sel_begin = b; + // The next line not selected. + coverage.sel_end = (e === undefined) ? b+1 : e; +}; + +coverage.to_top = function () { + coverage.set_sel(0, 1); + coverage.scroll_window(0); +}; + +coverage.to_first_chunk = function () { + coverage.set_sel(0, 1); + coverage.to_next_chunk(); +}; + +coverage.to_prev_file = function () { + window.location = document.getElementById("prevFileLink").href; +} + +coverage.to_next_file = function () { + window.location = document.getElementById("nextFileLink").href; +} + +coverage.to_index = function () { + location.href = document.getElementById("indexLink").href; +} + +coverage.show_hide_help = function () { + const helpCheck = document.getElementById("help_panel_state") + helpCheck.checked = !helpCheck.checked; +} + +// Return a string indicating what kind of chunk this line belongs to, +// or null if not a chunk. +coverage.chunk_indicator = function (line_elt) { + const classes = line_elt?.className; + if (!classes) { + return null; + } + const match = classes.match(/\bshow_\w+\b/); + if (!match) { + return null; + } + return match[0]; +}; + +coverage.to_next_chunk = function () { + const c = coverage; + + // Find the start of the next colored chunk. + var probe = c.sel_end; + var chunk_indicator, probe_line; + while (true) { + probe_line = c.line_elt(probe); + if (!probe_line) { + return; + } + chunk_indicator = c.chunk_indicator(probe_line); + if (chunk_indicator) { + break; + } + probe++; + } + + // There's a next chunk, `probe` points to it. + var begin = probe; + + // Find the end of this chunk. + var next_indicator = chunk_indicator; + while (next_indicator === chunk_indicator) { + probe++; + probe_line = c.line_elt(probe); + next_indicator = c.chunk_indicator(probe_line); + } + c.set_sel(begin, probe); + c.show_selection(); +}; + +coverage.to_prev_chunk = function () { + const c = coverage; + + // Find the end of the prev colored chunk. + var probe = c.sel_begin-1; + var probe_line = c.line_elt(probe); + if (!probe_line) { + return; + } + var chunk_indicator = c.chunk_indicator(probe_line); + while (probe > 1 && !chunk_indicator) { + probe--; + probe_line = c.line_elt(probe); + if (!probe_line) { + return; + } + chunk_indicator = c.chunk_indicator(probe_line); + } + + // There's a prev chunk, `probe` points to its last line. + var end = probe+1; + + // Find the beginning of this chunk. + var prev_indicator = chunk_indicator; + while (prev_indicator === chunk_indicator) { + probe--; + if (probe <= 0) { + return; + } + probe_line = c.line_elt(probe); + prev_indicator = c.chunk_indicator(probe_line); + } + c.set_sel(probe+1, end); + c.show_selection(); +}; + +// Returns 0, 1, or 2: how many of the two ends of the selection are on +// the screen right now? +coverage.selection_ends_on_screen = function () { + if (coverage.sel_begin === 0) { + return 0; + } + + const begin = coverage.line_elt(coverage.sel_begin); + const end = coverage.line_elt(coverage.sel_end-1); + + return ( + (checkVisible(begin) ? 1 : 0) + + (checkVisible(end) ? 1 : 0) + ); +}; + +coverage.to_next_chunk_nicely = function () { + if (coverage.selection_ends_on_screen() === 0) { + // The selection is entirely off the screen: + // Set the top line on the screen as selection. + + // This will select the top-left of the viewport + // As this is most likely the span with the line number we take the parent + const line = document.elementFromPoint(0, 0).parentElement; + if (line.parentElement !== document.getElementById("source")) { + // The element is not a source line but the header or similar + coverage.select_line_or_chunk(1); + } + else { + // We extract the line number from the id + coverage.select_line_or_chunk(parseInt(line.id.substring(1), 10)); + } + } + coverage.to_next_chunk(); +}; + +coverage.to_prev_chunk_nicely = function () { + if (coverage.selection_ends_on_screen() === 0) { + // The selection is entirely off the screen: + // Set the lowest line on the screen as selection. + + // This will select the bottom-left of the viewport + // As this is most likely the span with the line number we take the parent + const line = document.elementFromPoint(document.documentElement.clientHeight-1, 0).parentElement; + if (line.parentElement !== document.getElementById("source")) { + // The element is not a source line but the header or similar + coverage.select_line_or_chunk(coverage.lines_len); + } + else { + // We extract the line number from the id + coverage.select_line_or_chunk(parseInt(line.id.substring(1), 10)); + } + } + coverage.to_prev_chunk(); +}; + +// Select line number lineno, or if it is in a colored chunk, select the +// entire chunk +coverage.select_line_or_chunk = function (lineno) { + var c = coverage; + var probe_line = c.line_elt(lineno); + if (!probe_line) { + return; + } + var the_indicator = c.chunk_indicator(probe_line); + if (the_indicator) { + // The line is in a highlighted chunk. + // Search backward for the first line. + var probe = lineno; + var indicator = the_indicator; + while (probe > 0 && indicator === the_indicator) { + probe--; + probe_line = c.line_elt(probe); + if (!probe_line) { + break; + } + indicator = c.chunk_indicator(probe_line); + } + var begin = probe + 1; + + // Search forward for the last line. + probe = lineno; + indicator = the_indicator; + while (indicator === the_indicator) { + probe++; + probe_line = c.line_elt(probe); + indicator = c.chunk_indicator(probe_line); + } + + coverage.set_sel(begin, probe); + } + else { + coverage.set_sel(lineno); + } +}; + +coverage.show_selection = function () { + // Highlight the lines in the chunk + document.querySelectorAll("#source .highlight").forEach(e => e.classList.remove("highlight")); + for (let probe = coverage.sel_begin; probe < coverage.sel_end; probe++) { + coverage.line_elt(probe).querySelector(".n").classList.add("highlight"); + } + + coverage.scroll_to_selection(); +}; + +coverage.scroll_to_selection = function () { + // Scroll the page if the chunk isn't fully visible. + if (coverage.selection_ends_on_screen() < 2) { + const element = coverage.line_elt(coverage.sel_begin); + coverage.scroll_window(element.offsetTop - 60); + } +}; + +coverage.scroll_window = function (to_pos) { + window.scroll({top: to_pos, behavior: "smooth"}); +}; + +coverage.init_scroll_markers = function () { + // Init some variables + coverage.lines_len = document.querySelectorAll("#source > p").length; + + // Build html + coverage.build_scroll_markers(); +}; + +coverage.build_scroll_markers = function () { + const temp_scroll_marker = document.getElementById("scroll_marker") + if (temp_scroll_marker) temp_scroll_marker.remove(); + // Don't build markers if the window has no scroll bar. + if (document.body.scrollHeight <= window.innerHeight) { + return; + } + + const marker_scale = window.innerHeight / document.body.scrollHeight; + const line_height = Math.min(Math.max(3, window.innerHeight / coverage.lines_len), 10); + + let previous_line = -99, last_mark, last_top; + + const scroll_marker = document.createElement("div"); + scroll_marker.id = "scroll_marker"; + document.getElementById("source").querySelectorAll( + "p.show_run, p.show_mis, p.show_exc, p.show_exc, p.show_par" + ).forEach(element => { + const line_top = Math.floor(element.offsetTop * marker_scale); + const line_number = parseInt(element.querySelector(".n a").id.substr(1)); + + if (line_number === previous_line + 1) { + // If this solid missed block just make previous mark higher. + last_mark.style.height = `${line_top + line_height - last_top}px`; + } + else { + // Add colored line in scroll_marker block. + last_mark = document.createElement("div"); + last_mark.id = `m${line_number}`; + last_mark.classList.add("marker"); + last_mark.style.height = `${line_height}px`; + last_mark.style.top = `${line_top}px`; + scroll_marker.append(last_mark); + last_top = line_top; + } + + previous_line = line_number; + }); + + // Append last to prevent layout calculation + document.body.append(scroll_marker); +}; + +coverage.wire_up_sticky_header = function () { + const header = document.querySelector("header"); + const header_bottom = ( + header.querySelector(".content h2").getBoundingClientRect().top - + header.getBoundingClientRect().top + ); + + function updateHeader() { + if (window.scrollY > header_bottom) { + header.classList.add("sticky"); + } + else { + header.classList.remove("sticky"); + } + } + + window.addEventListener("scroll", updateHeader); + updateHeader(); +}; + +coverage.expand_contexts = function (e) { + var ctxs = e.target.parentNode.querySelector(".ctxs"); + + if (!ctxs.classList.contains("expanded")) { + var ctxs_text = ctxs.textContent; + var width = Number(ctxs_text[0]); + ctxs.textContent = ""; + for (var i = 1; i < ctxs_text.length; i += width) { + key = ctxs_text.substring(i, i + width).trim(); + ctxs.appendChild(document.createTextNode(contexts[key])); + ctxs.appendChild(document.createElement("br")); + } + ctxs.classList.add("expanded"); + } +}; + +document.addEventListener("DOMContentLoaded", () => { + if (document.body.classList.contains("indexfile")) { + coverage.index_ready(); + } + else { + coverage.pyfile_ready(); + } +}); diff --git a/htmlcov/favicon_32_cb_58284776.png b/htmlcov/favicon_32_cb_58284776.png new file mode 100644 index 0000000000000000000000000000000000000000..8649f0475d8d20793b2ec431fe25a186a414cf10 GIT binary patch literal 1732 zcmV;#20QtQP)K2KOkBOVxIZChq#W-v7@TU%U6P(wycKT1hUJUToW3ke1U1ONa4 z000000000000000bb)GRa9mqwR9|UWHy;^RUrt?IT__Y0JUcxmBP0(51q1>E00030 z|NrOz)aw7%8sJzM<5^g%z7^qE`}_Ot|JUUG(NUkWzR|7K?Zo%@_v-8G-1N%N=D$;; zw;keH4dGY$`1t4M=HK_s*zm^0#KgqfwWhe3qO_HtvXYvtjgX>;-~C$L`&k>^R)9)7 zdPh2TL^pCnHC#0+_4D)M`p?qp!pq{jO_{8;$fbaflbx`Tn52n|n}8VFRTA1&ugOP< zPd{uvFjz7t*Vot1&d$l-xWCk}s;sQL&#O(Bskh6gqNJv>#iB=ypG1e3K!K4yc7!~M zfj4S*g^zZ7eP$+_Sl07Z646l;%urinP#D8a6TwRtnLIRcI!r4f@bK~9-`~;E(N?Lv zSEst7s;rcxsi~}{Nsytfz@MtUoR*iFc8!#vvx}Umhm4blk(_~MdVD-@dW&>!Nn~ro z_E~-ESVQAj6Wmn;(olz(O&_{U2*pZBc1aYjMh>Dq3z|6`jW`RDHV=t3I6yRKJ~LOX zz_z!!vbVXPqob#=pj3^VMT?x6t(irRmSKsMo1~LLkB&=#j!=M%NP35mfqim$drWb9 zYIb>no_LUwc!r^NkDzs4YHu@=ZHRzrafWDZd1EhEVq=tGX?tK$pIa)DTh#bkvh!J- z?^%@YS!U*0E8$q$_*aOTQ&)Ra64g>ep;BdcQgvlg8qQHrP*E$;P{-m=A*@axn@$bO zO-Y4JzS&EAi%YG}N?cn?YFS7ivPY=EMV6~YH;+Xxu|tefLS|Aza)Cg6us#)=JW!uH zQa?H>d^j+YHCtyjL^LulF*05|F$RG!AX_OHVI&MtA~_@=5_lU|0000rbW%=J06GH4 z^5LD8b8apw8vNh1ua1mF{{Hy)_U`NA;Nacc+sCpuHXa-V{r&yz?c(9#+}oX+NmiRW z+W-IqK1oDDR5;6GfCDCOP5}iL5fK(cB~ET81`MFgF2kGa9AjhSIk~-E-4&*tPPKdiilQJ11k_J082ZS z>@TvivP!5ZFG?t@{t+GpR3XR&@*hA_VE1|Lo8@L@)l*h(Z@=?c-NS$Fk&&61IzUU9 z*nPqBM=OBZ-6ka1SJgGAS-Us5EN)r#dUX%>wQZLa2ytPCtMKp)Ob z*xcu38Z&d5<-NBS)@jRD+*!W*cf-m_wmxDEqBf?czI%3U0J$Xik;lA`jg}VH?(S(V zE!M3;X2B8w0TnnW&6(8;_Uc)WD;Ms6PKP+s(sFgO!}B!^ES~GDt4qLPxwYB)^7)XA zZwo9zDy-B0B+jT6V=!=bo(zs_8{eBA78gT9GH$(DVhz;4VAYwz+bOIdZ-PNb|I&rl z^XG=vFLF)1{&nT2*0vMz#}7^9hXzzf&ZdKlEj{LihP;|;Ywqn35ajP?H?7t|i-Un% z&&kxee@9B{nwgv1+S-~0)E1{ob1^Wn`F2isurqThKK=3%&;`@{0{!D- z&CSj80t;uPu&FaJFtSXKH#ajgGj}=sEad7US6jP0|Db@0j)?(5@sf<7`~a9>s;wCa zm^)spe{uxGFmrJYI9cOh7s$>8Npkt-5EWB1UKc`{W{y5Ce$1+nM9Cr;);=Ju#N^62OSlJMn7omiUgP&ErsYzT~iGxcW aE(`!K@+CXylaC4j0000 + + + + Coverage report + + + + + +
+
+

Coverage report: + 100% +

+ +
+ +
+ + +
+
+

+ Files + Functions + Classes +

+

+ coverage.py v7.6.4, + created at 2024-12-11 21:45 +0000 +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Filefunctionstatementsmissingexcludedcoverage
annotated_logger/__init__.pyAnnotatedIterator.__init__600100%
annotated_logger/__init__.pyAnnotatedIterator.__iter__200100%
annotated_logger/__init__.pyAnnotatedIterator.__next__900100%
annotated_logger/__init__.pyAnnotatedAdapter.__init__500100%
annotated_logger/__init__.pyAnnotatedAdapter.iterator100100%
annotated_logger/__init__.pyAnnotatedAdapter.process100100%
annotated_logger/__init__.pyAnnotatedAdapter.log1700100%
annotated_logger/__init__.pyAnnotatedAdapter.annotate300100%
annotated_logger/__init__.pyAnnotatedLogger.__init__1900100%
annotated_logger/__init__.pyAnnotatedLogger._generate_logger400100%
annotated_logger/__init__.pyAnnotatedLogger._action_annotation100100%
annotated_logger/__init__.pyAnnotatedLogger.generate_filter1100100%
annotated_logger/__init__.pyAnnotatedLogger.annotate_logs1100100%
annotated_logger/__init__.pyAnnotatedLogger.annotate_logs.decorator100100%
annotated_logger/__init__.pyAnnotatedLogger.annotate_logs.decorator700100%
annotated_logger/__init__.pyAnnotatedLogger.annotate_logs.decorator.wrap_class500100%
annotated_logger/__init__.pyAnnotatedLogger.annotate_logs.decorator.wrap_function3000100%
annotated_logger/__init__.pyAnnotatedLogger._determine_signature_adjustments1300100%
annotated_logger/__init__.pyAnnotatedLogger._determine_signature_adjustments.inject_logger1300100%
annotated_logger/__init__.pyAnnotatedLogger._inject_by_kwarg900100%
annotated_logger/__init__.pyAnnotatedLogger._inject_by_index900100%
annotated_logger/__init__.pyAnnotatedLogger._check_parameters_for_self_and_cls900100%
annotated_logger/__init__.pyAnnotatedLogger._pick_correct_logger1100100%
annotated_logger/__init__.py_attempt_post_call700100%
annotated_logger/__init__.py(no function)10902100%
annotated_logger/filter.pyAnnotatedFilter.__init__400100%
annotated_logger/filter.pyAnnotatedFilter._all_annotations500100%
annotated_logger/filter.pyAnnotatedFilter.filter1200100%
annotated_logger/filter.py(no function)1000100%
annotated_logger/mocks.pyAssertLogged.__init__700100%
annotated_logger/mocks.pyAssertLogged.check1100100%
annotated_logger/mocks.pyAssertLogged._failed_sort_key800100%
annotated_logger/mocks.pyAssertLogged.build_message2400100%
annotated_logger/mocks.pyAssertLogged._check_record_matches2000100%
annotated_logger/mocks.pyAnnotatedLogMock.__init__300100%
annotated_logger/mocks.pyAnnotatedLogMock.__getattr__100100%
annotated_logger/mocks.pyAnnotatedLogMock.handle300100%
annotated_logger/mocks.pyAnnotatedLogMock.assert_logged1900100%
annotated_logger/mocks.pyannotated_logger_object100100%
annotated_logger/mocks.pyannotated_logger_mock500100%
annotated_logger/mocks.py(no function)2200100%
annotated_logger/plugins.pyBasePlugin.filter100100%
annotated_logger/plugins.pyBasePlugin.uncaught_exception500100%
annotated_logger/plugins.pyRuntimeAnnotationsPlugin.__init__100100%
annotated_logger/plugins.pyRuntimeAnnotationsPlugin.filter300100%
annotated_logger/plugins.pyRequestsPlugin.uncaught_exception400100%
annotated_logger/plugins.pyRenamerPlugin.__init__200100%
annotated_logger/plugins.pyRenamerPlugin.filter700100%
annotated_logger/plugins.pyRemoverPlugin.__init__300100%
annotated_logger/plugins.pyRemoverPlugin.filter400100%
annotated_logger/plugins.pyNameAdjusterPlugin.__init__300100%
annotated_logger/plugins.pyNameAdjusterPlugin.filter600100%
annotated_logger/plugins.pyNestedRemoverPlugin.__init__100100%
annotated_logger/plugins.pyNestedRemoverPlugin.filter300100%
annotated_logger/plugins.pyNestedRemoverPlugin.filter.delete_keys_nested700100%
annotated_logger/plugins.pyGitHubActionsPlugin.__init__300100%
annotated_logger/plugins.pyGitHubActionsPlugin.filter702100%
annotated_logger/plugins.pyGitHubActionsPlugin.logging_config100100%
annotated_logger/plugins.py(no function)3102100%
example/actions.pyActionsExample.first_step100100%
example/actions.pyActionsExample.second_step100100%
example/actions.py(no function)1700100%
example/api.pyruntime100100%
example/api.pyApiClient.pre_call100100%
example/api.pyApiClient.check400100%
example/api.pyApiClient.check_again500100%
example/api.pyApiClient.prepare400100%
example/api.pyApiClient.throw_http_exception400100%
example/api.py(no function)2100100%
example/calculator.pyruntime100100%
example/calculator.pyCalculator.__init__300100%
example/calculator.pyCalculator.check_zero_division400100%
example/calculator.pyCalculator.will_pass100100%
example/calculator.pyCalculator.check_prediction_crashed_correctly700100%
example/calculator.pyCalculator.divide600100%
example/calculator.pyCalculator.multiply200100%
example/calculator.pyCalculator.multiply2300100%
example/calculator.pyCalculator.power500100%
example/calculator.pyCalculator.add700100%
example/calculator.pyCalculator.subtract200100%
example/calculator.pyCalculator.inverse500100%
example/calculator.pyCalculator.pemdas_example100100%
example/calculator.pyCalculator.is_odd100100%
example/calculator.pyCalculator.factorial600100%
example/calculator.pyCalculator.sensitive_factorial500100%
example/calculator.pyCalculator.is_math_cool300100%
example/calculator.pyCalculator.sanity_check200100%
example/calculator.py(no function)4200100%
example/default.pyDefaultExample.foo100100%
example/default.pyDefaultExample.var_args400100%
example/default.pyDefaultExample.var_kwargs300100%
example/default.pyDefaultExample.var_args_and_kwargs500100%
example/default.pyDefaultExample.var_args_and_kwargs_provided_outer200100%
example/default.pyDefaultExample.var_args_and_kwargs_provided500100%
example/default.pyDefaultExample.positional_only300100%
example/default.pyvar_args_and_kwargs_provided_outer200100%
example/default.pyvar_args_and_kwargs_provided500100%
example/default.py(no function)2300100%
example/invalid_order.py(no function)500100%
example/logging_config.pyruntime100100%
example/logging_config.pymake_some_logs400100%
example/logging_config.pymake_some_annotated_logs400100%
example/logging_config.pymake_some_weird_logs400100%
example/logging_config.pylog_really_long_message500100%
example/logging_config.py(no function)1900100%
Total 82007100%
+

+ No items found using the specified filter. +

+

27 empty functions skipped.

+
+ + + diff --git a/htmlcov/index.html b/htmlcov/index.html new file mode 100644 index 0000000..c5ecb48 --- /dev/null +++ b/htmlcov/index.html @@ -0,0 +1,175 @@ + + + + + Coverage report + + + + + +
+
+

Coverage report: + 100% +

+ +
+ +
+ + +
+
+

+ Files + Functions + Classes +

+

+ coverage.py v7.6.4, + created at 2024-12-11 21:45 +0000 +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Filestatementsmissingexcludedcoverage
annotated_logger/__init__.py31302100%
annotated_logger/filter.py3100100%
annotated_logger/mocks.py12400100%
annotated_logger/plugins.py9204100%
example/actions.py1900100%
example/api.py4000100%
example/calculator.py10600100%
example/default.py5300100%
example/invalid_order.py501100%
example/logging_config.py3700100%
Total82007100%
+

+ No items found using the specified filter. +

+

1 empty file skipped.

+
+ + + diff --git a/htmlcov/keybd_closed_cb_ce680311.png b/htmlcov/keybd_closed_cb_ce680311.png new file mode 100644 index 0000000000000000000000000000000000000000..ba119c47df81ed2bbd27a06988abf700139c4f99 GIT binary patch literal 9004 zcmeHLc{tSF+aIY=A^R4_poB4tZAN2XC;O7M(inrW3}(h&Q4}dl*&-65$i9^&vW6_# zcM4g`Qix=GhkBl;=lwnJ@Ap2}^}hc-b6vBXb3XUyzR%~}_c`-Dw+!?&>5p(90RRB> zXe~7($~PP3eT?=X<@3~Q1w84vX~IoSx~1#~02+TopXK(db;4v6!{+W`RHLkkHO zo;+s?)puc`+$yOwHv>I$5^8v^F3<|$44HA8AFnFB0cAP|C`p}aSMJK*-CUB{eQ!;K z-9Ju3OQ+xVPr3P#o4>_lNBT;M+1vgV&B~6!naOGHb-LFA9TkfHv1IFA1Y!Iz!Zl3) z%c#-^zNWPq7U_}6I7aHSmFWi125RZrNBKyvnV^?64)zviS;E!UD%LaGRl6@zn!3E{ zJ`B$5``cH_3a)t1#6I7d==JeB_IcSU%=I#DrRCBGm8GvCmA=+XHEvC2SIfsNa0(h9 z7P^C4U`W@@`9p>2f^zyb5B=lpc*RZMn-%%IqrxSWQF8{ec3i?-AB(_IVe z)XgT>Y^u41MwOMFvU=I4?!^#jaS-%bjnx@ zmL44yVEslR_ynm18F!u}Ru#moEn3EE?1=9@$B1Z5aLi5b8{&?V(IAYBzIar!SiY3< z`l0V)djHtrImy}(!7x-Pmq+njM)JFQ9mx*(C+9a3M)(_SW|lrN=gfxFhStu^zvynS zm@gl;>d8i8wpUkX42vS3BEzE3-yctH%t0#N%s+6-&_<*Fe7+h=`=FM?DOg1)eGL~~ zQvIFm$D*lqEh07XrXY=jb%hdyP4)`wyMCb$=-z9(lOme9=tirVkb)_GOl2MJn;=Ky z^0pV1owR7KP-BSxhI@@@+gG0roD-kXE1;!#R7KY1QiUbyDdTElm|ul7{mMdF1%UDJ z_vp=Vo!TCF?D*?u% zk~}4!xK2MSQd-QKC0${G=ZRv2x8%8ZqdfR!?Dv=5Mj^8WU)?iH;C?o6rSQy*^YwQb zf@5V)q=xah#a3UEIBC~N7on(p4jQd4K$|i7k`d8mw|M{Mxapl46Z^X^9U}JgqH#;T z`CTzafpMD+J-LjzF+3Xau>xM_sXisRj6m-287~i9g|%gHc}v77>n_+p7ZgmJszx!b zSmL4wV;&*5Z|zaCk`rOYFdOjZLLQr!WSV6AlaqYh_OE)>rYdtx`gk$yAMO=-E1b~J zIZY6gM*}1UWsJ)TW(pf1=h?lJy_0TFOr|nALGW>$IE1E7z+$`^2WJY+>$$nJo8Rs` z)xS>AH{N~X3+b=2+8Q_|n(1JoGv55r>TuwBV~MXE&9?3Zw>cIxnOPNs#gh~C4Zo=k z&!s;5)^6UG>!`?hh0Q|r|Qbm>}pgtOt23Vh!NSibozH$`#LSiYL)HR4bkfEJMa zBHwC3TaHx|BzD|MXAr>mm&FbZXeEX-=W}Ji&!pji4sO$#0Wk^Q7j%{8#bJPn$C=E% zPlB}0)@Ti^r_HMJrTMN?9~4LQbIiUiOKBVNm_QjABKY4;zC88yVjvB>ZETNzr%^(~ zI3U&Ont?P`r&4 z#Bp)jcVV_N_{c1_qW}_`dQm)D`NG?h{+S!YOaUgWna4i8SuoLcXAZ|#Jh&GNn7B}3 z?vZ8I{LpmCYT=@6)dLPd@|(;d<08ufov%+V?$mgUYQHYTrc%eA=CDUzK}v|G&9}yJ z)|g*=+RH1IQ>rvkY9UIam=fkxWDyGIKQ2RU{GqOQjD8nG#sl+$V=?wpzJdT=wlNWr z1%lw&+;kVs(z?e=YRWRA&jc75rQ~({*TS<( z8X!j>B}?Bxrrp%wEE7yBefQ?*nM20~+ZoQK(NO_wA`RNhsqVkXHy|sod@mqen=B#@ zmLi=x2*o9rWqTMWoB&qdZph$~qkJJTVNc*8^hU?gH_fY{GYPEBE8Q{j0Y$tvjMv%3 z)j#EyBf^7n)2d8IXDYX2O0S%ZTnGhg4Ss#sEIATKpE_E4TU=GimrD5F6K(%*+T-!o z?Se7^Vm`$ZKDwq+=~jf?w0qC$Kr&R-;IF#{iLF*8zKu8(=#chRO;>x zdM;h{i{RLpJgS!B-ueTFs8&4U4+D8|7nP~UZ@P`J;*0sj^#f_WqT#xpA?@qHonGB& zQ<^;OLtOG1w#)N~&@b0caUL7syAsAxV#R`n>-+eVL9aZwnlklzE>-6!1#!tVA`uNo z>Gv^P)sohc~g_1YMC;^f(N<{2y5C^;QCEXo;LQ^#$0 zr>jCrdoeXuff!dJ^`#=Wy2Gumo^Qt7BZrI~G+Pyl_kL>is3P0^JlE;Sjm-YfF~I>t z_KeNpK|5U&F4;v?WS&#l(jxUWDarfcIcl=-6!8>^S`57!M6;hZea5IFA@)2+*Rt85 zi-MBs_b^DU8LygXXQGkG+86N7<%M|baM(orG*ASffC`p!?@m{qd}IcYmZyi^d}#Q& zNjk-0@CajpUI-gPm20ERVDO!L8@p`tMJ69FD(ASIkdoLdiRV6h9TPKRz>2WK4upHd z6OZK33EP?`GoJkXh)S035}uLUO$;TlXwNdMg-WOhLB)7a`-%*a9lFmjf6n+4ZmIHN z-V@$ z8PXsoR4*`5RwXz=A8|5;aXKtSHFccj%dG7cO~UBJnt)61K>-uPX)`vu{7fcX6_>zZ zw_2V&Li+7mxbf!f7{Rk&VVyY!UtZywac%g!cH+xh#j$a`uf?XWl<``t`36W;p7=_* zO6uf~2{sAdkZn=Ts@p0>8N8rzw2ZLS@$ibV-c-QmG@%|3gUUrRxu=e*ekhTa+f?8q z3$JVGPr9w$VQG~QCq~Y=2ThLIH!T@(>{NihJ6nj*HA_C#Popv)CBa)+UI-bx8u8zfCT^*1|k z&N9oFYsZEijPn31Yx_yO5pFs>0tOAV=oRx~Wpy5ie&S_449m4R^{LWQMA~}vocV1O zIf#1ZV85E>tvZE4mz~zn{hs!pkIQM;EvZMimqiPAJu-9P@mId&nb$lsrICS=)zU3~ zn>a#9>}5*3N)9;PTMZ)$`5k} z?iG}Rwj$>Y*|(D3S3e&fxhaPHma8@vwu(cwdlaCjX+NIK6=$H4U`rfzcWQVOhp{fnzuZhgCCGpw|p zTi`>cv~xVzdx|^`C0vXdlMwPae3S?>3|7v$e*Bs6-5gS>>FMHk_r2M(ADOV{KV7+6 zA@5Q(mdx%7J}MY}K461iuQ}5GwDGI=Yc&g0MZHu)7gC3{5@QZj6SJl*o0MS2Cl_ia zyK?9QmC9tJ6yn{EA-erJ4wk$+!E#X(s~9h^HOmQ_|6V_s1)k;%9Q6Niw}SyT?jxl4 z;HYz2$Nj$8Q_*Xo`TWEUx^Q9b+ik@$o39`mlY&P}G8wnjdE+Dlj?uL;$aB$n;x zWoh-M_u>9}_Ok@d_uidMqz10zJc}RQijPW3Fs&~1am=j*+A$QWTvxf9)6n;n8zTQW z!Q_J1%apTsJzLF`#^P_#mRv2Ya_keUE7iMSP!ha-WQoo0vZZG?gyR;+4q8F6tL#u< zRj8Hu5f-p1$J;)4?WpGL{4@HmJ6&tF9A5Tc8Trp>;Y>{^s?Q1&bam}?OjsnKd?|Z82aix26wUOLxbEW~E)|CgJ#)MLf_me# zv4?F$o@A~Um)6>HlM0=3Bd-vc91EM}D+t6-@!}O%i*&Wl%@#C8X+?5+nv`oPu!!=5 znbL+Fk_#J_%8vOq^FIv~5N(nk03kyo1p@l|1c+rO^zCG3bk2?|%AF;*|4si1XM<`a z1NY0-8$wv?&129!(g_A1lXR!+pD*1*cF?T~e1d6*G1Fz)jcSaZoKpxtA%FNnKP2jo zLXn@OR#1z@6zuH%mMB98}-t zHJqClsZ!G5xMSgIs_=<8sBePXxfoXsuvy`|buON9BX%s-o>OVLA)k3W=wKnw1?so$ zEjm0aS=zu@Xu#;{A)QTjJ$a9_={++ACkRY*sk3jLk&Fu}RxR<-DXR<`5`$VNG*wJE zidM6VzaQ!M0gbQM98@x@;#0qUS8O)p6mrYwTk*;8J~!ovbY6jon^Ki}uggd3#J5G8 z>awvtF85Y<9yE{Iag}J7O7)1O=ylk^255@XmV5J06-{xaaSNASZoTKKp~$tSxdUI~ zU1RZ&UuW37Ro&_ryj^cSt$Jd&pt|+h!A&dwcr&`S=R5E`=6Tm`+(qGm@$YZ8(8@a$ zXfo@Rwtvm7N3RMmVCb7radAs-@QtCXx^CQ-<)V>QPLZy@jH{#dc4#(y zV)6Hp{ZMz!|NG8!>i01gZMy)G<8Hf2X7e&LH_gOaajW<<^Xi55@OnlY*|S|*TS8;u_nHbv7lgmmZ+Q<5 zi!*lLCJmdpyzl(L${$C?(pVo|oR%r~x_B_ocPePa_);27^=n4L=`toZ;xdBut9rSv z?wDQ7j2I3WQBdhz%X7`2YaG_y|wA!7|s?k;A&WNMLMTZEzCaE^d??E&u?f=ejQBR~|< z)=thyP2(p8r6mt?Ad}tXAP_GvF9|P630I;$1cpQ+Ay7C34hK^ZV3H4kjPV8&NP>G5 zKRDEIBrFl{M#j4mfP0)68&?mqJP1S?2mU0djAGTjDV;wZ?6vplNn~3Hn$nP>%!dMi zz@bnC7zzi&k&s{QDWkf&zgrVXKUJjY3Gv3bL0}S4h>OdgEJ$Q^&p-VAr3J}^a*+rz z!jW7(h*+GuCyqcC{MD(Ovj^!{pB^OKUe|uy&bD?CN>KZrf3?v>>l*xSvnQiH-o^ViN$%FRdm9url;%(*jf5H$*S)8;i0xWHdl>$p);nH9v0)YfW?Vz$! zNCeUbi9`NEg(i^57y=fzM@1o*z*Bf6?QCV>2p9}(BLlYsOCfMjFv1pw1mlo)Py{8v zppw{MDfEeWN+n>Ne~oI7%9cU}mz0r3!es2gNF0t5jkGipjIo2lz;-e)7}Ul_#!eDv zw;#>kI>;#-pyfeu3Fsd^2F@6=oh#8r9;A!G0`-mm7%{=S;Ec(bJ=I_`FodKGQVNEY zmXwr4{9*jpDl%4{ggQZ5Ac z%wYTdl*!1c5^)%^E78Q&)ma|27c6j(a=)g4sGrp$r{jv>>M2 z6y)E5|Aooe!PSfKzvKA>`a6pfK3=E8vL14ksP&f=>gOP?}rG6ye@9ZR3 zJF*vsh*P$w390i!FV~~_Hv6t2Zl<4VUi|rNja#boFt{%q~xGb z(2petq9A*_>~B*>?d?Olx^lmYg4)}sH2>G42RE; literal 0 HcmV?d00001 diff --git a/htmlcov/status.json b/htmlcov/status.json new file mode 100644 index 0000000..f26bcb1 --- /dev/null +++ b/htmlcov/status.json @@ -0,0 +1 @@ +{"note":"This file is an internal implementation detail to speed up HTML report generation. Its format can change at any time. You might be looking for the JSON report: https://coverage.rtfd.io/cmd.html#cmd-json","format":5,"version":"7.6.4","globals":"7b6dce8de02cf55ec901735aafdf2292","files":{"z_beb44c9891d1179a___init___py":{"hash":"aed0c62127a900a681a5da50c59ddbe2","index":{"url":"z_beb44c9891d1179a___init___py.html","file":"annotated_logger/__init__.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":313,"n_excluded":2,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_beb44c9891d1179a_filter_py":{"hash":"ae4581fe8fb9820d695a0a072e1bd7e7","index":{"url":"z_beb44c9891d1179a_filter_py.html","file":"annotated_logger/filter.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":31,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_beb44c9891d1179a_mocks_py":{"hash":"5bc132f4e51702302e6399a78f8dc03b","index":{"url":"z_beb44c9891d1179a_mocks_py.html","file":"annotated_logger/mocks.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":124,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_beb44c9891d1179a_plugins_py":{"hash":"68b4a191b73aa1750cd0efb07ca33a3b","index":{"url":"z_beb44c9891d1179a_plugins_py.html","file":"annotated_logger/plugins.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":92,"n_excluded":4,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_70983d692f648185_actions_py":{"hash":"ee78484470c2ab71a7d0c76ad7a4b32b","index":{"url":"z_70983d692f648185_actions_py.html","file":"example/actions.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":19,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_70983d692f648185_api_py":{"hash":"25c161f830b58193a5a297360225b232","index":{"url":"z_70983d692f648185_api_py.html","file":"example/api.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":40,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_70983d692f648185_calculator_py":{"hash":"057fbded3fbcb00f546b8cee98f25cdd","index":{"url":"z_70983d692f648185_calculator_py.html","file":"example/calculator.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":106,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_70983d692f648185_default_py":{"hash":"25a5154e668e5b49904630edae1e271d","index":{"url":"z_70983d692f648185_default_py.html","file":"example/default.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":53,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_70983d692f648185_invalid_order_py":{"hash":"d6782cd5f5a0d4a82739941542eab04a","index":{"url":"z_70983d692f648185_invalid_order_py.html","file":"example/invalid_order.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":5,"n_excluded":1,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_70983d692f648185_logging_config_py":{"hash":"4162095b34099063dedfa0eeb8af4288","index":{"url":"z_70983d692f648185_logging_config_py.html","file":"example/logging_config.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":37,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}}}} \ No newline at end of file diff --git a/htmlcov/style_cb_8e611ae1.css b/htmlcov/style_cb_8e611ae1.css new file mode 100644 index 0000000..3cdaf05 --- /dev/null +++ b/htmlcov/style_cb_8e611ae1.css @@ -0,0 +1,337 @@ +@charset "UTF-8"; +/* Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 */ +/* For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt */ +/* Don't edit this .css file. Edit the .scss file instead! */ +html, body, h1, h2, h3, p, table, td, th { margin: 0; padding: 0; border: 0; font-weight: inherit; font-style: inherit; font-size: 100%; font-family: inherit; vertical-align: baseline; } + +body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; font-size: 1em; background: #fff; color: #000; } + +@media (prefers-color-scheme: dark) { body { background: #1e1e1e; } } + +@media (prefers-color-scheme: dark) { body { color: #eee; } } + +html > body { font-size: 16px; } + +a:active, a:focus { outline: 2px dashed #007acc; } + +p { font-size: .875em; line-height: 1.4em; } + +table { border-collapse: collapse; } + +td { vertical-align: top; } + +table tr.hidden { display: none !important; } + +p#no_rows { display: none; font-size: 1.15em; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; } + +a.nav { text-decoration: none; color: inherit; } + +a.nav:hover { text-decoration: underline; color: inherit; } + +.hidden { display: none; } + +header { background: #f8f8f8; width: 100%; z-index: 2; border-bottom: 1px solid #ccc; } + +@media (prefers-color-scheme: dark) { header { background: black; } } + +@media (prefers-color-scheme: dark) { header { border-color: #333; } } + +header .content { padding: 1rem 3.5rem; } + +header h2 { margin-top: .5em; font-size: 1em; } + +header h2 a.button { font-family: inherit; font-size: inherit; border: 1px solid; border-radius: .2em; background: #eee; color: inherit; text-decoration: none; padding: .1em .5em; margin: 1px calc(.1em + 1px); cursor: pointer; border-color: #ccc; } + +@media (prefers-color-scheme: dark) { header h2 a.button { background: #333; } } + +@media (prefers-color-scheme: dark) { header h2 a.button { border-color: #444; } } + +header h2 a.button.current { border: 2px solid; background: #fff; border-color: #999; cursor: default; } + +@media (prefers-color-scheme: dark) { header h2 a.button.current { background: #1e1e1e; } } + +@media (prefers-color-scheme: dark) { header h2 a.button.current { border-color: #777; } } + +header p.text { margin: .5em 0 -.5em; color: #666; font-style: italic; } + +@media (prefers-color-scheme: dark) { header p.text { color: #aaa; } } + +header.sticky { position: fixed; left: 0; right: 0; height: 2.5em; } + +header.sticky .text { display: none; } + +header.sticky h1, header.sticky h2 { font-size: 1em; margin-top: 0; display: inline-block; } + +header.sticky .content { padding: 0.5rem 3.5rem; } + +header.sticky .content p { font-size: 1em; } + +header.sticky ~ #source { padding-top: 6.5em; } + +main { position: relative; z-index: 1; } + +footer { margin: 1rem 3.5rem; } + +footer .content { padding: 0; color: #666; font-style: italic; } + +@media (prefers-color-scheme: dark) { footer .content { color: #aaa; } } + +#index { margin: 1rem 0 0 3.5rem; } + +h1 { font-size: 1.25em; display: inline-block; } + +#filter_container { float: right; margin: 0 2em 0 0; line-height: 1.66em; } + +#filter_container #filter { width: 10em; padding: 0.2em 0.5em; border: 2px solid #ccc; background: #fff; color: #000; } + +@media (prefers-color-scheme: dark) { #filter_container #filter { border-color: #444; } } + +@media (prefers-color-scheme: dark) { #filter_container #filter { background: #1e1e1e; } } + +@media (prefers-color-scheme: dark) { #filter_container #filter { color: #eee; } } + +#filter_container #filter:focus { border-color: #007acc; } + +#filter_container :disabled ~ label { color: #ccc; } + +@media (prefers-color-scheme: dark) { #filter_container :disabled ~ label { color: #444; } } + +#filter_container label { font-size: .875em; color: #666; } + +@media (prefers-color-scheme: dark) { #filter_container label { color: #aaa; } } + +header button { font-family: inherit; font-size: inherit; border: 1px solid; border-radius: .2em; background: #eee; color: inherit; text-decoration: none; padding: .1em .5em; margin: 1px calc(.1em + 1px); cursor: pointer; border-color: #ccc; } + +@media (prefers-color-scheme: dark) { header button { background: #333; } } + +@media (prefers-color-scheme: dark) { header button { border-color: #444; } } + +header button:active, header button:focus { outline: 2px dashed #007acc; } + +header button.run { background: #eeffee; } + +@media (prefers-color-scheme: dark) { header button.run { background: #373d29; } } + +header button.run.show_run { background: #dfd; border: 2px solid #00dd00; margin: 0 .1em; } + +@media (prefers-color-scheme: dark) { header button.run.show_run { background: #373d29; } } + +header button.mis { background: #ffeeee; } + +@media (prefers-color-scheme: dark) { header button.mis { background: #4b1818; } } + +header button.mis.show_mis { background: #fdd; border: 2px solid #ff0000; margin: 0 .1em; } + +@media (prefers-color-scheme: dark) { header button.mis.show_mis { background: #4b1818; } } + +header button.exc { background: #f7f7f7; } + +@media (prefers-color-scheme: dark) { header button.exc { background: #333; } } + +header button.exc.show_exc { background: #eee; border: 2px solid #808080; margin: 0 .1em; } + +@media (prefers-color-scheme: dark) { header button.exc.show_exc { background: #333; } } + +header button.par { background: #ffffd5; } + +@media (prefers-color-scheme: dark) { header button.par { background: #650; } } + +header button.par.show_par { background: #ffa; border: 2px solid #bbbb00; margin: 0 .1em; } + +@media (prefers-color-scheme: dark) { header button.par.show_par { background: #650; } } + +#help_panel, #source p .annotate.long { display: none; position: absolute; z-index: 999; background: #ffffcc; border: 1px solid #888; border-radius: .2em; color: #333; padding: .25em .5em; } + +#source p .annotate.long { white-space: normal; float: right; top: 1.75em; right: 1em; height: auto; } + +#help_panel_wrapper { float: right; position: relative; } + +#keyboard_icon { margin: 5px; } + +#help_panel_state { display: none; } + +#help_panel { top: 25px; right: 0; padding: .75em; border: 1px solid #883; color: #333; } + +#help_panel .keyhelp p { margin-top: .75em; } + +#help_panel .legend { font-style: italic; margin-bottom: 1em; } + +.indexfile #help_panel { width: 25em; } + +.pyfile #help_panel { width: 18em; } + +#help_panel_state:checked ~ #help_panel { display: block; } + +kbd { border: 1px solid black; border-color: #888 #333 #333 #888; padding: .1em .35em; font-family: SFMono-Regular, Menlo, Monaco, Consolas, monospace; font-weight: bold; background: #eee; border-radius: 3px; } + +#source { padding: 1em 0 1em 3.5rem; font-family: SFMono-Regular, Menlo, Monaco, Consolas, monospace; } + +#source p { position: relative; white-space: pre; } + +#source p * { box-sizing: border-box; } + +#source p .n { float: left; text-align: right; width: 3.5rem; box-sizing: border-box; margin-left: -3.5rem; padding-right: 1em; color: #999; user-select: none; } + +@media (prefers-color-scheme: dark) { #source p .n { color: #777; } } + +#source p .n.highlight { background: #ffdd00; } + +#source p .n a { scroll-margin-top: 6em; text-decoration: none; color: #999; } + +@media (prefers-color-scheme: dark) { #source p .n a { color: #777; } } + +#source p .n a:hover { text-decoration: underline; color: #999; } + +@media (prefers-color-scheme: dark) { #source p .n a:hover { color: #777; } } + +#source p .t { display: inline-block; width: 100%; box-sizing: border-box; margin-left: -.5em; padding-left: 0.3em; border-left: 0.2em solid #fff; } + +@media (prefers-color-scheme: dark) { #source p .t { border-color: #1e1e1e; } } + +#source p .t:hover { background: #f2f2f2; } + +@media (prefers-color-scheme: dark) { #source p .t:hover { background: #282828; } } + +#source p .t:hover ~ .r .annotate.long { display: block; } + +#source p .t .com { color: #008000; font-style: italic; line-height: 1px; } + +@media (prefers-color-scheme: dark) { #source p .t .com { color: #6a9955; } } + +#source p .t .key { font-weight: bold; line-height: 1px; } + +#source p .t .str { color: #0451a5; } + +@media (prefers-color-scheme: dark) { #source p .t .str { color: #9cdcfe; } } + +#source p.mis .t { border-left: 0.2em solid #ff0000; } + +#source p.mis.show_mis .t { background: #fdd; } + +@media (prefers-color-scheme: dark) { #source p.mis.show_mis .t { background: #4b1818; } } + +#source p.mis.show_mis .t:hover { background: #f2d2d2; } + +@media (prefers-color-scheme: dark) { #source p.mis.show_mis .t:hover { background: #532323; } } + +#source p.run .t { border-left: 0.2em solid #00dd00; } + +#source p.run.show_run .t { background: #dfd; } + +@media (prefers-color-scheme: dark) { #source p.run.show_run .t { background: #373d29; } } + +#source p.run.show_run .t:hover { background: #d2f2d2; } + +@media (prefers-color-scheme: dark) { #source p.run.show_run .t:hover { background: #404633; } } + +#source p.exc .t { border-left: 0.2em solid #808080; } + +#source p.exc.show_exc .t { background: #eee; } + +@media (prefers-color-scheme: dark) { #source p.exc.show_exc .t { background: #333; } } + +#source p.exc.show_exc .t:hover { background: #e2e2e2; } + +@media (prefers-color-scheme: dark) { #source p.exc.show_exc .t:hover { background: #3c3c3c; } } + +#source p.par .t { border-left: 0.2em solid #bbbb00; } + +#source p.par.show_par .t { background: #ffa; } + +@media (prefers-color-scheme: dark) { #source p.par.show_par .t { background: #650; } } + +#source p.par.show_par .t:hover { background: #f2f2a2; } + +@media (prefers-color-scheme: dark) { #source p.par.show_par .t:hover { background: #6d5d0c; } } + +#source p .r { position: absolute; top: 0; right: 2.5em; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; } + +#source p .annotate { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; color: #666; padding-right: .5em; } + +@media (prefers-color-scheme: dark) { #source p .annotate { color: #ddd; } } + +#source p .annotate.short:hover ~ .long { display: block; } + +#source p .annotate.long { width: 30em; right: 2.5em; } + +#source p input { display: none; } + +#source p input ~ .r label.ctx { cursor: pointer; border-radius: .25em; } + +#source p input ~ .r label.ctx::before { content: "â–¶ "; } + +#source p input ~ .r label.ctx:hover { background: #e8f4ff; color: #666; } + +@media (prefers-color-scheme: dark) { #source p input ~ .r label.ctx:hover { background: #0f3a42; } } + +@media (prefers-color-scheme: dark) { #source p input ~ .r label.ctx:hover { color: #aaa; } } + +#source p input:checked ~ .r label.ctx { background: #d0e8ff; color: #666; border-radius: .75em .75em 0 0; padding: 0 .5em; margin: -.25em 0; } + +@media (prefers-color-scheme: dark) { #source p input:checked ~ .r label.ctx { background: #056; } } + +@media (prefers-color-scheme: dark) { #source p input:checked ~ .r label.ctx { color: #aaa; } } + +#source p input:checked ~ .r label.ctx::before { content: "â–¼ "; } + +#source p input:checked ~ .ctxs { padding: .25em .5em; overflow-y: scroll; max-height: 10.5em; } + +#source p label.ctx { color: #999; display: inline-block; padding: 0 .5em; font-size: .8333em; } + +@media (prefers-color-scheme: dark) { #source p label.ctx { color: #777; } } + +#source p .ctxs { display: block; max-height: 0; overflow-y: hidden; transition: all .2s; padding: 0 .5em; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; white-space: nowrap; background: #d0e8ff; border-radius: .25em; margin-right: 1.75em; text-align: right; } + +@media (prefers-color-scheme: dark) { #source p .ctxs { background: #056; } } + +#index { font-family: SFMono-Regular, Menlo, Monaco, Consolas, monospace; font-size: 0.875em; } + +#index table.index { margin-left: -.5em; } + +#index td, #index th { text-align: right; padding: .25em .5em; border-bottom: 1px solid #eee; } + +@media (prefers-color-scheme: dark) { #index td, #index th { border-color: #333; } } + +#index td.name, #index th.name { text-align: left; width: auto; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; min-width: 15em; } + +#index th { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; font-style: italic; color: #333; cursor: pointer; } + +@media (prefers-color-scheme: dark) { #index th { color: #ddd; } } + +#index th:hover { background: #eee; } + +@media (prefers-color-scheme: dark) { #index th:hover { background: #333; } } + +#index th .arrows { color: #666; font-size: 85%; font-family: sans-serif; font-style: normal; pointer-events: none; } + +#index th[aria-sort="ascending"], #index th[aria-sort="descending"] { white-space: nowrap; background: #eee; padding-left: .5em; } + +@media (prefers-color-scheme: dark) { #index th[aria-sort="ascending"], #index th[aria-sort="descending"] { background: #333; } } + +#index th[aria-sort="ascending"] .arrows::after { content: " â–²"; } + +#index th[aria-sort="descending"] .arrows::after { content: " â–¼"; } + +#index td.name { font-size: 1.15em; } + +#index td.name a { text-decoration: none; color: inherit; } + +#index td.name .no-noun { font-style: italic; } + +#index tr.total td, #index tr.total_dynamic td { font-weight: bold; border-top: 1px solid #ccc; border-bottom: none; } + +#index tr.region:hover { background: #eee; } + +@media (prefers-color-scheme: dark) { #index tr.region:hover { background: #333; } } + +#index tr.region:hover td.name { text-decoration: underline; color: inherit; } + +#scroll_marker { position: fixed; z-index: 3; right: 0; top: 0; width: 16px; height: 100%; background: #fff; border-left: 1px solid #eee; will-change: transform; } + +@media (prefers-color-scheme: dark) { #scroll_marker { background: #1e1e1e; } } + +@media (prefers-color-scheme: dark) { #scroll_marker { border-color: #333; } } + +#scroll_marker .marker { background: #ccc; position: absolute; min-height: 3px; width: 100%; } + +@media (prefers-color-scheme: dark) { #scroll_marker .marker { background: #444; } } diff --git a/htmlcov/z_70983d692f648185_actions_py.html b/htmlcov/z_70983d692f648185_actions_py.html new file mode 100644 index 0000000..efb9e27 --- /dev/null +++ b/htmlcov/z_70983d692f648185_actions_py.html @@ -0,0 +1,145 @@ + + + + + Coverage for example/actions.py: 100% + + + + + +
+
+

+ Coverage for example/actions.py: + 100% +

+ +

+ 19 statements   + + + +

+

+ « prev     + ^ index     + » next +       + coverage.py v7.6.4, + created at 2024-12-11 21:45 +0000 +

+ +
+
+
+

1import logging 

+

2from copy import deepcopy 

+

3 

+

4from annotated_logger import ( 

+

5 DEFAULT_LOGGING_CONFIG, 

+

6 AnnotatedAdapter, 

+

7 AnnotatedLogger, 

+

8) 

+

9from annotated_logger.plugins import GitHubActionsPlugin 

+

10 

+

11actions_plugin = GitHubActionsPlugin(annotation_level=logging.INFO) 

+

12 

+

13LOGGING = deepcopy(DEFAULT_LOGGING_CONFIG) 

+

14 

+

15# The GitHubActionsPlugin provides a `logging_config` method that returns some 

+

16# defaults that will annotate at the info (notice) and above. 

+

17# Making a copy of the default logging config and updating with this 

+

18# lets us keep the standard logger and also annotate in actions. 

+

19# But, we need to do it bit by bit so we are updating the loggers and so on 

+

20# instead of replacing the loggers. 

+

21LOGGING["loggers"].update(actions_plugin.logging_config()["loggers"]) 

+

22LOGGING["filters"].update(actions_plugin.logging_config()["filters"]) 

+

23LOGGING["handlers"].update(actions_plugin.logging_config()["handlers"]) 

+

24LOGGING["formatters"].update(actions_plugin.logging_config()["formatters"]) 

+

25 

+

26annotated_logger = AnnotatedLogger( 

+

27 plugins=[ 

+

28 actions_plugin, 

+

29 ], 

+

30 name="annotated_logger.actions", 

+

31 config=LOGGING, 

+

32) 

+

33 

+

34annotate_logs = annotated_logger.annotate_logs 

+

35 

+

36 

+

37class ActionsExample: 

+

38 """Example application that is designed to run in actions.""" 

+

39 

+

40 @annotate_logs(_typing_requested=True) 

+

41 def first_step(self, annotated_logger: AnnotatedAdapter) -> None: 

+

42 """First step of your action.""" 

+

43 annotated_logger.info("Step 1 running!") 

+

44 

+

45 @annotate_logs(_typing_requested=True) 

+

46 def second_step(self, annotated_logger: AnnotatedAdapter) -> None: 

+

47 """Second step of your action.""" 

+

48 annotated_logger.debug("Step 2 running!") 

+
+ + + diff --git a/htmlcov/z_70983d692f648185_api_py.html b/htmlcov/z_70983d692f648185_api_py.html new file mode 100644 index 0000000..8e67c6e --- /dev/null +++ b/htmlcov/z_70983d692f648185_api_py.html @@ -0,0 +1,168 @@ + + + + + Coverage for example/api.py: 100% + + + + + +
+
+

+ Coverage for example/api.py: + 100% +

+ +

+ 40 statements   + + + +

+

+ « prev     + ^ index     + » next +       + coverage.py v7.6.4, + created at 2024-12-11 21:45 +0000 +

+ +
+
+
+

1from __future__ import annotations 

+

2 

+

3import logging 

+

4from typing import Any 

+

5 

+

6from requests.exceptions import HTTPError 

+

7from requests.models import Response 

+

8 

+

9from annotated_logger import AnnotatedAdapter, AnnotatedLogger 

+

10from annotated_logger.plugins import RequestsPlugin, RuntimeAnnotationsPlugin 

+

11 

+

12 

+

13def runtime(_record: logging.LogRecord) -> str: 

+

14 """Return the string every time.""" 

+

15 return "this function is called every time" 

+

16 

+

17 

+

18annotated_logger = AnnotatedLogger( 

+

19 annotations={"extra": "new data"}, 

+

20 plugins=[ 

+

21 RequestsPlugin(), 

+

22 RuntimeAnnotationsPlugin({"runtime": runtime}), 

+

23 ], 

+

24 log_level=logging.DEBUG, 

+

25 name="annotated_logger.api", 

+

26) 

+

27 

+

28annotate_logs = annotated_logger.annotate_logs 

+

29 

+

30 

+

31@annotate_logs(_typing_class=True) 

+

32class ApiClient: 

+

33 """Example to test the RequestsPlugin.""" 

+

34 

+

35 def pre_call(self, annotated_logger: AnnotatedAdapter) -> None: 

+

36 """Add an annotation before the start message is logged.""" 

+

37 annotated_logger.annotate(begin=True) 

+

38 

+

39 @annotate_logs(_typing_requested=True, pre_call=pre_call) 

+

40 def check(self, annotated_logger: AnnotatedAdapter) -> bool: 

+

41 """Check if the request is good to send.""" 

+

42 annotated_logger.annotate(valid=True) 

+

43 annotated_logger.annotate(lasting="forever", persist=True) 

+

44 annotated_logger.info("Check passed") 

+

45 return True 

+

46 

+

47 @annotate_logs(_typing_requested=True, pre_call=pre_call) 

+

48 def check_again(self, annotated_logger: AnnotatedAdapter, *args: list[Any]) -> bool: 

+

49 """Double check if the request is good to send.""" 

+

50 annotated_logger.annotate(valid=True) 

+

51 annotated_logger.annotate(lasting="forever", persist=True) 

+

52 annotated_logger.annotate(args_length=len(args)) 

+

53 annotated_logger.info("Check passed") 

+

54 return True 

+

55 

+

56 @annotate_logs(_typing_requested=True) 

+

57 def prepare(self, annotated_logger: AnnotatedAdapter) -> bool: 

+

58 """Prepare the request to send.""" 

+

59 self.data = {} 

+

60 annotated_logger.annotate(prepared=True) 

+

61 annotated_logger.info("Preparation complete") 

+

62 return True 

+

63 

+

64 @annotate_logs() 

+

65 # def throw_http_exception(self) -> None: 

+

66 def throw_http_exception(self) -> None: 

+

67 """Explode and log the status code.""" 

+

68 response = Response() 

+

69 response.status_code = 418 

+

70 response.reason = "i_am_a_teapot" 

+

71 raise HTTPError(response=response, request=None) 

+
+ + + diff --git a/htmlcov/z_70983d692f648185_calculator_py.html b/htmlcov/z_70983d692f648185_calculator_py.html new file mode 100644 index 0000000..89ee5e9 --- /dev/null +++ b/htmlcov/z_70983d692f648185_calculator_py.html @@ -0,0 +1,329 @@ + + + + + Coverage for example/calculator.py: 100% + + + + + +
+
+

+ Coverage for example/calculator.py: + 100% +

+ +

+ 106 statements   + + + +

+

+ « prev     + ^ index     + » next +       + coverage.py v7.6.4, + created at 2024-12-11 21:45 +0000 +

+ +
+
+
+

1from __future__ import annotations 

+

2 

+

3import logging 

+

4 

+

5from annotated_logger import AnnotatedAdapter, AnnotatedLogger 

+

6from annotated_logger.plugins import ( 

+

7 NameAdjusterPlugin, 

+

8 NestedRemoverPlugin, 

+

9 RemoverPlugin, 

+

10 RuntimeAnnotationsPlugin, 

+

11) 

+

12 

+

13 

+

14class BoomError(Exception): 

+

15 """Boom.""" 

+

16 

+

17 

+

18def runtime(_record: logging.LogRecord) -> str: 

+

19 """Return the string every time.""" 

+

20 return "this function is called every time" 

+

21 

+

22 

+

23annotated_logger = AnnotatedLogger( 

+

24 annotations={ 

+

25 "extra": "new data", 

+

26 "nested_extra": {"nested_key": {"double_nested_key": "value"}}, 

+

27 }, 

+

28 log_level=logging.DEBUG, 

+

29 plugins=[ 

+

30 NameAdjusterPlugin(names=["joke"], prefix="cheezy_"), 

+

31 NameAdjusterPlugin(names=["power"], postfix="_overwhelming"), 

+

32 RemoverPlugin("taskName"), 

+

33 NestedRemoverPlugin(["double_nested_key"]), 

+

34 RuntimeAnnotationsPlugin({"runtime": runtime}), 

+

35 ], 

+

36 name="annotated_logger.calculator", 

+

37) 

+

38 

+

39annotate_logs = annotated_logger.annotate_logs 

+

40 

+

41Number = int | float 

+

42 

+

43 

+

44class Calculator: 

+

45 """Calculator application with very limited (and weird) functionality. 

+

46 

+

47 This application is meant to highlight how to use the annotated-logger 

+

48 package. It also serves as a way to test it. 

+

49 """ 

+

50 

+

51 def __init__(self, first: Number, second: Number) -> None: 

+

52 """Create instance of example Calculator application. 

+

53 

+

54 The Calculator is very simple and has only two attributes 

+

55 that serve as two operands in a calculation. 

+

56 """ 

+

57 self.first = first 

+

58 self.second = second 

+

59 self.boom: bool = False 

+

60 

+

61 def check_zero_division(self, annotated_logger: AnnotatedAdapter) -> None: 

+

62 """Annotate if divide will crash.""" 

+

63 will_crash = False 

+

64 if self.second == 0: 

+

65 will_crash = True 

+

66 annotated_logger.annotate(will_crash=will_crash) 

+

67 

+

68 def will_pass( 

+

69 self, 

+

70 annotated_logger: AnnotatedAdapter, 

+

71 *args: ..., # noqa: ARG002 

+

72 **kwargs: ..., # noqa: ARG002 

+

73 ) -> None: 

+

74 """Predict that the method will not crash.""" 

+

75 annotated_logger.annotate(will_crash=False) 

+

76 

+

77 def check_prediction_crashed_correctly( 

+

78 self, 

+

79 annotated_logger: AnnotatedAdapter, 

+

80 *args: ..., # noqa: ARG002 

+

81 **kwargs: ..., # noqa: ARG002 

+

82 ) -> None: 

+

83 """Check if the prediction was correct.""" 

+

84 if self.boom: 

+

85 annotated_logger.warning("boom") 

+

86 raise BoomError 

+

87 annotated_logger.annotate(first_again=self.first) 

+

88 prediction = annotated_logger.filter.annotations.get("will_crash") 

+

89 success = annotated_logger.filter.annotations["success"] 

+

90 annotated_logger.info( 

+

91 "Prediction result", extra={"result": success != prediction} 

+

92 ) 

+

93 

+

94 @annotated_logger.annotate_logs( 

+

95 success_info=False, 

+

96 pre_call=check_zero_division, 

+

97 _typing_requested=True, 

+

98 post_call=check_prediction_crashed_correctly, 

+

99 ) 

+

100 def divide(self, annotated_logger: AnnotatedAdapter) -> Number: 

+

101 """Divide self.first by self.second.""" 

+

102 annotated_logger.warning( 

+

103 "If you divide by zero you'll create a singularity in the fabric of space-time!", # noqa: E501 

+

104 extra={"joke": True}, 

+

105 ) 

+

106 try: 

+

107 return self.first / self.second 

+

108 except ZeroDivisionError: 

+

109 # This tests that calls to `logger.exception` work with sentry 

+

110 # Normally you would only use `logger` outside of a logged function 

+

111 annotated_logger.exception("This will get sent to sentry if enabled.") 

+

112 raise 

+

113 

+

114 @annotate_logs( 

+

115 success_info=False, 

+

116 _typing_requested=True, 

+

117 pre_call=will_pass, 

+

118 post_call=check_prediction_crashed_correctly, 

+

119 ) 

+

120 def multiply( 

+

121 self, annotated_logger: AnnotatedAdapter, first: Number, second: Number 

+

122 ) -> Number: 

+

123 """Multiple the first parameter by the second parameter.""" 

+

124 annotated_logger.annotate(first=first, second=second) 

+

125 

+

126 return first * second 

+

127 

+

128 @annotate_logs(success_info=False, provided=True, _typing_requested=True) 

+

129 def multiply2( 

+

130 self, annotated_logger: AnnotatedAdapter, first: Number, second: Number 

+

131 ) -> Number: 

+

132 """Multiple the first parameter by the second parameter.""" 

+

133 annotated_logger.annotate(first=first) 

+

134 annotated_logger.annotate(second=second) 

+

135 

+

136 return first * second 

+

137 

+

138 @annotate_logs(_typing_requested=True) 

+

139 def power( 

+

140 self, annotated_logger: AnnotatedAdapter, num: Number, power: int 

+

141 ) -> Number: 

+

142 """Raise num to the power power.""" 

+

143 annotated_logger.annotate(power=True) 

+

144 base: Number = num 

+

145 for _ in range(1, power): 

+

146 base = self.multiply2(annotated_logger, base, num) 

+

147 return base 

+

148 

+

149 @annotate_logs(success_info=False, _typing_requested=True) 

+

150 def add(self, annotated_logger: AnnotatedAdapter) -> Number: 

+

151 # def add(self, *args, annotated_logger: AnnotatedAdapter) -> Number: 

+

152 """Add self.first and self.second.""" 

+

153 annotated_logger.annotate(first=self.first, second=self.second, foo="bar") 

+

154 

+

155 annotated_logger.info( 

+

156 "This message will have 'other' as well as 'first' from the annotation above.", # noqa: E501 

+

157 extra={"other": "value"}, 

+

158 ) 

+

159 annotated_logger.info( 

+

160 "This message will have the 'first' annotation and the defaults, but not the 'other'" # noqa: E501 

+

161 ) 

+

162 if self.first is None: 

+

163 annotated_logger.error("Must have a first value!") 

+

164 self.first = 0 

+

165 return self.first + self.second 

+

166 

+

167 @annotate_logs(_typing_requested=True) 

+

168 def subtract(self, annotated_logger: AnnotatedAdapter) -> Number: 

+

169 """Subtract the saved first from the saved second.""" 

+

170 annotated_logger.debug("Order does matter when subtracting") 

+

171 return self.first - self.second 

+

172 

+

173 @annotate_logs(_typing_requested=True) 

+

174 def inverse(self, annotated_logger: AnnotatedAdapter, num: Number) -> Number | bool: 

+

175 """Divide 1 by num.""" 

+

176 try: 

+

177 return 1 / num 

+

178 except ZeroDivisionError: 

+

179 annotated_logger.exception("Cannot divide by zero!") 

+

180 return False 

+

181 

+

182 @annotate_logs() 

+

183 def pemdas_example(self) -> list[int]: 

+

184 """Check order of operations.""" 

+

185 return [2 * 3 + 4, 2 * (3 + 4)] 

+

186 

+

187 @annotate_logs(_typing_requested=False) 

+

188 def is_odd(self, number: Number) -> bool: 

+

189 """Check if number is odd.""" 

+

190 return number % 2 == 0 

+

191 

+

192 @annotate_logs(_typing_requested=True) 

+

193 def factorial(self, annotated_logger: AnnotatedAdapter, num: int) -> int: 

+

194 """Perform the factiorial function.""" 

+

195 annotated_logger.annotate(temp=True) 

+

196 numbers = annotated_logger.iterator( 

+

197 "factorial numbers", iter(range(1, num + 1)) 

+

198 ) 

+

199 total = 1 

+

200 for n in numbers: 

+

201 total = total * n 

+

202 return total 

+

203 

+

204 @annotate_logs(_typing_requested=True) 

+

205 def sensitive_factorial( 

+

206 self, annotated_logger: AnnotatedAdapter, num: int, level: str = "info" 

+

207 ) -> int: 

+

208 """Perform the factorial function, but don't log the value.""" 

+

209 numbers = annotated_logger.iterator( 

+

210 "factorial numbers", iter(range(1, num + 1)), value=False, level=level 

+

211 ) 

+

212 total = 1 

+

213 for n in numbers: 

+

214 total = total * n 

+

215 return total 

+

216 

+

217 @classmethod 

+

218 @annotate_logs(_typing_requested=True) 

+

219 def is_math_cool(cls: type[Calculator], annotated_logger: AnnotatedAdapter) -> bool: 

+

220 """Answer the obvious question.""" 

+

221 cls.sanity_check(annotated_logger, "is_math_cool") 

+

222 annotated_logger.info("What a silly question!") 

+

223 return True 

+

224 

+

225 @classmethod 

+

226 @annotate_logs(_typing_requested=True, provided=True) 

+

227 def sanity_check( 

+

228 cls: type[Calculator], annotated_logger: AnnotatedAdapter, source: str 

+

229 ) -> None: 

+

230 """Reassures the caller they are sane.""" 

+

231 annotated_logger.annotate(sane=True) 

+

232 annotated_logger.info("Checking sanity", extra={"source": source}) 

+
+ + + diff --git a/htmlcov/z_70983d692f648185_default_py.html b/htmlcov/z_70983d692f648185_default_py.html new file mode 100644 index 0000000..1e62cfe --- /dev/null +++ b/htmlcov/z_70983d692f648185_default_py.html @@ -0,0 +1,208 @@ + + + + + Coverage for example/default.py: 100% + + + + + +
+
+

+ Coverage for example/default.py: + 100% +

+ +

+ 53 statements   + + + +

+

+ « prev     + ^ index     + » next +       + coverage.py v7.6.4, + created at 2024-12-11 21:45 +0000 +

+ +
+
+
+

1from annotated_logger import AnnotatedAdapter, AnnotatedLogger 

+

2from annotated_logger.plugins import RemoverPlugin 

+

3 

+

4# Actions runs in async.io it appears and that inejcts `taskName` 

+

5# But, locally that's not there, so it messes up the absent all tests 

+

6annotated_logger = AnnotatedLogger(plugins=[RemoverPlugin(["taskName"])]) 

+

7 

+

8annotate_logs = annotated_logger.annotate_logs 

+

9 

+

10 

+

11class DefaultExample: 

+

12 """Simple example of the annotated logger with minimal config.""" 

+

13 

+

14 @annotate_logs(_typing_requested=True) 

+

15 def foo(self, annotated_logger: AnnotatedAdapter) -> None: 

+

16 """Emit an info log.""" 

+

17 annotated_logger.info("foo") 

+

18 

+

19 @annotate_logs(_typing_requested=True) 

+

20 def var_args( 

+

21 self, 

+

22 annotated_logger: AnnotatedAdapter, 

+

23 _first: str, 

+

24 *my_args: str, 

+

25 ) -> bool: 

+

26 """Take a splat of args.""" 

+

27 annotated_logger.annotate(first=_first) 

+

28 for i, arg in enumerate(my_args): 

+

29 # Need to add persist=False to make the type checker happy 

+

30 annotated_logger.annotate(persist=False, **{f"arg{i}": arg}) 

+

31 return True 

+

32 

+

33 @annotate_logs(_typing_requested=True) 

+

34 def var_kwargs( 

+

35 self, annotated_logger: AnnotatedAdapter, _first: str, **kwargs: str 

+

36 ) -> bool: 

+

37 """Take a splat of args.""" 

+

38 for name, arg in kwargs.items(): 

+

39 # Need to add persist=False to make the type checker happy 

+

40 annotated_logger.annotate(persist=False, **{name: arg}) 

+

41 return True 

+

42 

+

43 @annotate_logs(_typing_requested=True) 

+

44 def var_args_and_kwargs( 

+

45 self, annotated_logger: AnnotatedAdapter, _first: str, *args: str, **kwargs: str 

+

46 ) -> bool: 

+

47 """Take a splat of args.""" 

+

48 for i, arg in enumerate(args): 

+

49 # Need to add persist=False to make the type checker happy 

+

50 annotated_logger.annotate(persist=False, **{f"arg{i}": arg}) 

+

51 for name, arg in kwargs.items(): 

+

52 annotated_logger.annotate(persist=False, **{name: arg}) 

+

53 return True 

+

54 

+

55 @annotate_logs(_typing_requested=True) 

+

56 def var_args_and_kwargs_provided_outer( 

+

57 self, annotated_logger: AnnotatedAdapter, _first: str, *args: str, **kwargs: str 

+

58 ) -> bool: 

+

59 """Call the version that has the logger provided.""" 

+

60 annotated_logger.annotate(outer=True) 

+

61 return self.var_args_and_kwargs_provided( 

+

62 annotated_logger, _first, *args, **kwargs 

+

63 ) 

+

64 

+

65 @annotate_logs(provided=True, _typing_requested=True) 

+

66 def var_args_and_kwargs_provided( 

+

67 self, annotated_logger: AnnotatedAdapter, _first: str, *args: str, **kwargs: str 

+

68 ) -> bool: 

+

69 """Take a splat of args.""" 

+

70 for i, arg in enumerate(args): 

+

71 # Need to add persist=False to make the type checker happy 

+

72 annotated_logger.annotate(persist=False, **{f"arg{i}": arg}) 

+

73 for name, arg in kwargs.items(): 

+

74 annotated_logger.annotate(persist=False, **{name: arg}) 

+

75 return True 

+

76 

+

77 @annotate_logs(_typing_requested=True) 

+

78 def positional_only( 

+

79 self, 

+

80 annotated_logger: AnnotatedAdapter, 

+

81 _first: str, 

+

82 *, 

+

83 _second: str, 

+

84 # self, annotated_logger: AnnotatedAdapter, _first: str, *my_args: str 

+

85 ) -> bool: 

+

86 """Take a splat of args.""" 

+

87 annotated_logger.annotate(first=_first) 

+

88 annotated_logger.annotate(second=_second) 

+

89 return True 

+

90 

+

91 

+

92@annotate_logs(_typing_self=False, _typing_requested=True) 

+

93def var_args_and_kwargs_provided_outer( 

+

94 annotated_logger: AnnotatedAdapter, _first: str, *args: str, **kwargs: str 

+

95) -> bool: 

+

96 """Call the version that has the logger provided.""" 

+

97 annotated_logger.annotate(outer=True) 

+

98 return var_args_and_kwargs_provided(annotated_logger, _first, *args, **kwargs) 

+

99 

+

100 

+

101@annotate_logs(provided=True, _typing_self=False, _typing_requested=True) 

+

102def var_args_and_kwargs_provided( 

+

103 annotated_logger: AnnotatedAdapter, _first: str, *args: str, **kwargs: str 

+

104) -> bool: 

+

105 """Take a splat of args.""" 

+

106 for i, arg in enumerate(args): 

+

107 # Need to add persist=False to make the type checker happy 

+

108 annotated_logger.annotate(persist=False, **{f"arg{i}": arg}) 

+

109 for name, arg in kwargs.items(): 

+

110 annotated_logger.annotate(persist=False, **{name: arg}) 

+

111 return True 

+
+ + + diff --git a/htmlcov/z_70983d692f648185_invalid_order_py.html b/htmlcov/z_70983d692f648185_invalid_order_py.html new file mode 100644 index 0000000..52d8430 --- /dev/null +++ b/htmlcov/z_70983d692f648185_invalid_order_py.html @@ -0,0 +1,110 @@ + + + + + Coverage for example/invalid_order.py: 100% + + + + + +
+
+

+ Coverage for example/invalid_order.py: + 100% +

+ +

+ 5 statements   + + + +

+

+ « prev     + ^ index     + » next +       + coverage.py v7.6.4, + created at 2024-12-11 21:45 +0000 +

+ +
+
+
+

1from annotated_logger import AnnotatedAdapter, AnnotatedLogger 

+

2 

+

3# Actions runs in async.io it appears and that inejcts `taskName` 

+

4# But, locally that's not there, so it messes up the absent all tests 

+

5annotated_logger = AnnotatedLogger() 

+

6 

+

7annotate_logs = annotated_logger.annotate_logs 

+

8 

+

9 

+

10@annotate_logs(_typing_requested=True) 

+

11def wrong_order(_first: str, annotated_logger: AnnotatedAdapter) -> None: 

+

12 """Blow up because we require annotated_logger be first.""" 

+

13 annotated_logger.info("This should never be reachable.") # pragma: no cover 

+
+ + + diff --git a/htmlcov/z_70983d692f648185_logging_config_py.html b/htmlcov/z_70983d692f648185_logging_config_py.html new file mode 100644 index 0000000..abea927 --- /dev/null +++ b/htmlcov/z_70983d692f648185_logging_config_py.html @@ -0,0 +1,324 @@ + + + + + Coverage for example/logging_config.py: 100% + + + + + +
+
+

+ Coverage for example/logging_config.py: + 100% +

+ +

+ 37 statements   + + + +

+

+ « prev     + ^ index     + » next +       + coverage.py v7.6.4, + created at 2024-12-11 21:45 +0000 +

+ +
+
+
+

1import logging 

+

2import logging.config 

+

3 

+

4from annotated_logger import AnnotatedAdapter, AnnotatedFilter, AnnotatedLogger 

+

5from annotated_logger.plugins import BasePlugin, RenamerPlugin, RuntimeAnnotationsPlugin 

+

6 

+

7# This logging config creates 4 loggers: 

+

8# * A logger for "annotated_logger.logging_config", which logs all messages as json and 

+

9# also logs errors as plain text. This is an example of how to log to multiple places. 

+

10# * A logger for "annotated_logger.logging_config_weird", which logs all messages at 

+

11# info and up. It has a different namespace (_weird instead of .weird) and so has 

+

12# isolated annotations. 

+

13# * A logger for "annotated_logger.logging_config.long", which logs all messages at info 

+

14# as text with a note added. This logger allows it's logs to propagate up and so the 

+

15# "annotated_logger.logging_config" logger will also log these messages in it's json 

+

16# format without the note from this logger. 

+

17# * A logger for "annotated_logger.logging_config.logger", which logs all messages as 

+

18# json. This logger does not propagate so that the "annotated_logger.logging_config" 

+

19# logger doesn't also log these messages. This logger is used by a non annotated 

+

20# method, but defines a filter that is annotated with the base annotations defined 

+

21# in `AnnotatedLogger(...`. This is an example of how to add annotations to external 

+

22# logs such as django. Note, the annotations this logger receives are based on the 

+

23# annotations passed in to the `AnnotatedLogger` invocation with the config, 

+

24# The second invocation for "weird" has different annotations. You should be able 

+

25# to have multiple of these with different annotations by invoking `AnnotatedLogger` 

+

26# multiple times and including `disable_existing_loggers` in the later configs. 

+

27# You can also provide custom annotations here if you wish to override the 

+

28# annotations from the annotated logger. 

+

29# 

+

30# Note: When creating multiple loggers, especially when doing so in different 

+

31# files/configs keep in mind that names should be unique or they will override 

+

32# eachother leaving you with a very confusing mess. 

+

33# If you want to see how to more easily merge settings into the default logging 

+

34# dict this package uses see the `actions.py` example. 

+

35LOGGING = { 

+

36 "version": 1, 

+

37 "disable_existing_loggers": False, 

+

38 "filters": { 

+

39 "logging_config.logger_filter": { 

+

40 "annotated_filter": True, 

+

41 # You can override the annotations that would be provided like so 

+

42 # But, if you want to do that you are likely better off 

+

43 # using a filter not associated with an AnnotatedLogger 

+

44 # like the `logging_config.logger_filter_parens` below 

+

45 "annotations": {"config_based_filter": True}, 

+

46 }, 

+

47 "logging_config.logger_filter_parens": { 

+

48 "()": AnnotatedFilter, 

+

49 "annotations": {"decorated": False, "class_based_filter": True}, 

+

50 "class_annotations": {}, 

+

51 "plugins": [ 

+

52 BasePlugin(), 

+

53 RuntimeAnnotationsPlugin({"custom_runtime": lambda _record: True}), 

+

54 ], 

+

55 }, 

+

56 }, 

+

57 "handlers": { 

+

58 "logging_config.annotated_handler": { 

+

59 "class": "logging.StreamHandler", 

+

60 "formatter": "logging_config.annotated_formatter", 

+

61 }, 

+

62 "logging_config.logger_handler": { 

+

63 "class": "logging.StreamHandler", 

+

64 # Note that this handler is specifically attached to 

+

65 # `annotated_logger.logging_config.logger` which we intend to use only as a 

+

66 # logger not generated by a decorator. If you add filters to a handler that 

+

67 # will be invoked when logging from a logger generated by the decorator 

+

68 # AKA, logging via the `annotated_logger` parameter, these filters will 

+

69 # be applied *after* the filters that are dynamically generated/updated 

+

70 # and so can override any annotations that share a name. 

+

71 # In this case, if a function annotated `custom_runtime` or one of the 

+

72 # other fields set in the filters above, that value would be overridden 

+

73 # by the value in the filter set in the config. 

+

74 "filters": [ 

+

75 "logging_config.logger_filter", 

+

76 "logging_config.logger_filter_parens", 

+

77 ], 

+

78 "formatter": "logging_config.annotated_formatter", 

+

79 }, 

+

80 "logging_config.long_handler": { 

+

81 "class": "logging.StreamHandler", 

+

82 "formatter": "logging_config.long_formatter", 

+

83 }, 

+

84 "logging_config.error_handler": { 

+

85 "class": "logging.StreamHandler", 

+

86 "level": "ERROR", 

+

87 "formatter": "logging_config.error_formatter", 

+

88 }, 

+

89 "logging_config.weird_handler": { 

+

90 "class": "logging.StreamHandler", 

+

91 "formatter": "logging_config.weird_formatter", 

+

92 }, 

+

93 }, 

+

94 "formatters": { 

+

95 "logging_config.annotated_formatter": { 

+

96 "class": "pythonjsonlogger.jsonlogger.JsonFormatter", 

+

97 # Note that this format string uses `time` which is set by the renamer 

+

98 # plugin. It also has `lvl` which is there strictly to test our fallback 

+

99 # to using `levelno` in the mocks to determine level. 

+

100 "format": "{time} {lvl} {name} {runtime} {message}", 

+

101 "style": "{", 

+

102 }, 

+

103 "logging_config.error_formatter": { 

+

104 "format": "{level} {message}", 

+

105 "style": "{", 

+

106 }, 

+

107 "logging_config.long_formatter": { 

+

108 "format": "{lvl} Long message, may be split {message}", 

+

109 # 3.12 added support for defaults in dict configs 

+

110 # With that we can add the format and defaults below 

+

111 # for a more realistic example. Not all of the messages 

+

112 # in the method we set to use this are long enough to be split, 

+

113 # so, some of them don't have the message_part(s) fields. 

+

114 # "format": "{level} {message_part}/{message_parts} {message}", # noqa: ERA001 E501 

+

115 # "defaults": {"message_part": 1, "message_parts": 1}, # noqa: ERA001 

+

116 "style": "{", 

+

117 }, 

+

118 "logging_config.weird_formatter": { 

+

119 "class": "pythonjsonlogger.jsonlogger.JsonFormatter", 

+

120 "format": "{time} {lvl} {name} {message}", 

+

121 "style": "{", 

+

122 }, 

+

123 }, 

+

124 "loggers": { 

+

125 "annotated_logger.logging_config": { 

+

126 "level": "DEBUG", 

+

127 "handlers": [ 

+

128 "logging_config.annotated_handler", 

+

129 "logging_config.error_handler", 

+

130 ], 

+

131 "propagate": True, 

+

132 }, 

+

133 "annotated_logger.logging_config_weird": { 

+

134 "level": "INFO", 

+

135 "handlers": ["logging_config.weird_handler"], 

+

136 "propagate": True, 

+

137 }, 

+

138 "annotated_logger.logging_config.long": { 

+

139 "level": "INFO", 

+

140 "handlers": ["logging_config.long_handler"], 

+

141 "propagate": True, 

+

142 }, 

+

143 "annotated_logger.logging_config.logger": { 

+

144 "handlers": ["logging_config.logger_handler"], 

+

145 "propagate": False, 

+

146 }, 

+

147 }, 

+

148} 

+

149 

+

150 

+

151def runtime(_record: logging.LogRecord) -> str: 

+

152 """Return the string every time.""" 

+

153 return "this function is called every time" 

+

154 

+

155 

+

156annotated_logger = AnnotatedLogger( 

+

157 annotations={"hostname": "my-host"}, 

+

158 # This is deprecated, use the RuntimeAnnotationsPlugin instead. 

+

159 # This param is kept for backwards compatibility and creates a 

+

160 # RuntimeAnnotationsPlugin instead. 

+

161 # This is left as an example and to provide test coverage. 

+

162 plugins=[ 

+

163 RenamerPlugin(time="created", lvl="levelname"), 

+

164 RuntimeAnnotationsPlugin({"runtime": runtime}), 

+

165 ], 

+

166 log_level=logging.DEBUG, 

+

167 max_length=200, 

+

168 name="annotated_logger.logging_config", 

+

169 config=LOGGING, 

+

170) 

+

171annotate_logs = annotated_logger.annotate_logs 

+

172 

+

173weird_annotated_logger = AnnotatedLogger( 

+

174 annotations={"weird": True}, 

+

175 plugins=[RenamerPlugin(time="created", lvl="levelname")], 

+

176 log_level=logging.INFO, 

+

177 name="annotated_logger.logging_config_weird", 

+

178 config=False, 

+

179) 

+

180weird_annotate_logs = weird_annotated_logger.annotate_logs 

+

181 

+

182logger = logging.getLogger("annotated_logger.logging_config.logger") 

+

183logger.setLevel("DEBUG") 

+

184 

+

185 

+

186def make_some_logs() -> None: 

+

187 """Log messages using a native logging logger.""" 

+

188 logger.debug("this is debug") 

+

189 logger.info("this is info") 

+

190 logger.warning("this is warning") 

+

191 logger.error("this is error") 

+

192 

+

193 

+

194@annotate_logs(_typing_requested=True, _typing_self=False) 

+

195def make_some_annotated_logs(annotated_logger: AnnotatedAdapter) -> None: 

+

196 """Log messages using the provided annotated_logger.""" 

+

197 annotated_logger.debug("this is debug") 

+

198 annotated_logger.info("this is info") 

+

199 annotated_logger.warning("this is warning") 

+

200 annotated_logger.error("this is error") 

+

201 

+

202 

+

203@weird_annotate_logs( 

+

204 _typing_requested=True, 

+

205 _typing_self=False, 

+

206) 

+

207def make_some_weird_logs(annotated_logger: AnnotatedAdapter) -> None: 

+

208 """Log messages using the provided annotated_logger.""" 

+

209 annotated_logger.debug("this is debug") 

+

210 annotated_logger.info("this is info") 

+

211 annotated_logger.warning("this is warning") 

+

212 annotated_logger.error("this is error") 

+

213 

+

214 

+

215@annotate_logs( 

+

216 _typing_requested=True, 

+

217 _typing_self=False, 

+

218 logger_name="annotated_logger.logging_config.long", 

+

219 success_info=False, 

+

220) 

+

221def log_really_long_message(annotated_logger: AnnotatedAdapter) -> None: 

+

222 """Log a message that is so long it will get split.""" 

+

223 message = "1" * 200 + "2" * 200 + "3333" 

+

224 annotated_logger.info(message) 

+

225 annotated_logger.info("4" * 200) 

+

226 annotated_logger.info("5" * 201) 

+

227 annotated_logger.info("6" * 199) 

+
+ + + diff --git a/htmlcov/z_beb44c9891d1179a___init___py.html b/htmlcov/z_beb44c9891d1179a___init___py.html new file mode 100644 index 0000000..34d7937 --- /dev/null +++ b/htmlcov/z_beb44c9891d1179a___init___py.html @@ -0,0 +1,1058 @@ + + + + + Coverage for annotated_logger/__init__.py: 100% + + + + + +
+
+

+ Coverage for annotated_logger/__init__.py: + 100% +

+ +

+ 313 statements   + + + +

+

+ « prev     + ^ index     + » next +       + coverage.py v7.6.4, + created at 2024-12-11 21:45 +0000 +

+ +
+
+
+

1from __future__ import annotations 

+

2 

+

3import contextlib 

+

4import inspect 

+

5import logging 

+

6import logging.config 

+

7import time 

+

8import uuid 

+

9from copy import copy, deepcopy 

+

10from typing import ( 

+

11 TYPE_CHECKING, 

+

12 Any, 

+

13 Callable, 

+

14 Concatenate, 

+

15 Iterator, 

+

16 Literal, 

+

17 ParamSpec, 

+

18 Protocol, 

+

19 TypeVar, 

+

20 cast, 

+

21 overload, 

+

22) 

+

23 

+

24from makefun import wraps 

+

25 

+

26from annotated_logger.filter import AnnotatedFilter 

+

27from annotated_logger.plugins import BasePlugin 

+

28 

+

29if TYPE_CHECKING: # pragma: no cover 

+

30 from collections.abc import MutableMapping 

+

31 

+

32VERSION = "1.2.0" # pragma: no mutate 

+

33 

+

34T = TypeVar("T") 

+

35P = ParamSpec("P") 

+

36P2 = ParamSpec("P2") 

+

37P3 = ParamSpec("P3") 

+

38R = TypeVar("R") 

+

39S = TypeVar("S") 

+

40S2 = TypeVar("S2") 

+

41C_co = TypeVar("C_co", covariant=True) 

+

42 

+

43 

+

44class AnnotatedClass(Protocol[C_co]): 

+

45 """Protocol for typing classes that we annotate and add the logger to.""" 

+

46 

+

47 annotated_logger: AnnotatedAdapter 

+

48 

+

49 

+

50PreCall = Callable[Concatenate[S, "AnnotatedAdapter", P], None] | None 

+

51PostCall = Callable[Concatenate[S, "AnnotatedAdapter", P], None] | None 

+

52SelfLoggerAndParams = Callable[Concatenate[S, "AnnotatedAdapter", P], R] 

+

53LoggerAndParams = Callable[Concatenate["AnnotatedAdapter", P], R] 

+

54SelfAndParams = Callable[Concatenate[S, P], R] 

+

55ParamsOnly = Callable[P, R] 

+

56SelfAndLogger = Callable[[S, "AnnotatedAdapter"], R] 

+

57LoggerOnly = Callable[["AnnotatedAdapter"], R] 

+

58SelfOnly = Callable[[S], R] 

+

59Empty = Callable[[], R] 

+

60 

+

61NoInjectionSelf = Callable[[SelfAndParams[S, P, R]], SelfAndParams[S, P, R]] 

+

62NoInjectionBare = Callable[[ParamsOnly[P, R]], ParamsOnly[P, R]] 

+

63InjectionSelf = Callable[[SelfLoggerAndParams[S, P, R]], SelfAndParams[S, P, R]] 

+

64InjectionSelfProvide = Callable[ 

+

65 [SelfLoggerAndParams[S, P, R]], SelfLoggerAndParams[S, P, R] 

+

66] 

+

67InjectionBare = Callable[[LoggerAndParams[P, R]], ParamsOnly[P, R]] 

+

68InjectionBareProvide = Callable[[LoggerAndParams[P, R]], LoggerAndParams[P, R]] 

+

69 

+

70Function = ( 

+

71 SelfLoggerAndParams[S, P, R] 

+

72 | SelfAndParams[S, P, R] 

+

73 | SelfAndLogger[S, R] 

+

74 | SelfOnly[S, R] 

+

75 | LoggerAndParams[P, R] 

+

76 | ParamsOnly[P, R] 

+

77 | LoggerOnly[R] 

+

78 | Empty[R] 

+

79) 

+

80Decorator = ( 

+

81 NoInjectionSelf[S, P, R] 

+

82 | InjectionSelf[S, P, R] 

+

83 | InjectionSelfProvide[S, P, R] 

+

84 | NoInjectionBare[P, R] 

+

85 | InjectionBare[P, R] 

+

86 | InjectionBareProvide[P, R] 

+

87) 

+

88Annotations = dict[str, Any] 

+

89 

+

90 

+

91DEFAULT_LOGGING_CONFIG = { 

+

92 "version": 1, 

+

93 "disable_existing_loggers": False, # pragma: no mutate 

+

94 "filters": { 

+

95 "annotated_filter": { 

+

96 "annotated_filter": True, # pragma: no mutate 

+

97 } 

+

98 }, 

+

99 "handlers": { 

+

100 "annotated_handler": { 

+

101 "class": "logging.StreamHandler", 

+

102 "formatter": "annotated_formatter", 

+

103 }, 

+

104 }, 

+

105 "formatters": { 

+

106 "annotated_formatter": { 

+

107 "class": "pythonjsonlogger.jsonlogger.JsonFormatter", # pragma: no mutate 

+

108 "format": "{created} {levelname} {name} {message}", # pragma: no mutate 

+

109 "style": "{", 

+

110 }, 

+

111 }, 

+

112 "loggers": { 

+

113 "annotated_logger": { 

+

114 "level": "DEBUG", 

+

115 "handlers": ["annotated_handler"], 

+

116 "propagate": False, # pragma: no mutate 

+

117 }, 

+

118 }, 

+

119} 

+

120 

+

121 

+

122class AnnotatedIterator(Iterator[T]): 

+

123 """Iterator that logs as it iterates.""" 

+

124 

+

125 def __init__( 

+

126 self, 

+

127 logger: AnnotatedAdapter, 

+

128 name: str, 

+

129 wrapped: Iterator[T], 

+

130 *, 

+

131 value: bool, 

+

132 level: str, 

+

133 ) -> None: 

+

134 """Store the wrapped iterator, the logger and note if we log the value.""" 

+

135 self.wrapped = wrapped 

+

136 self.logger = logger 

+

137 self.extras: dict[str, T | str] = {"iterator": name} 

+

138 self.value = value 

+

139 log_methods = { 

+

140 "debug": self.logger.debug, 

+

141 "info": self.logger.info, 

+

142 "warning": self.logger.warning, 

+

143 "error": self.logger.error, 

+

144 "exception": self.logger.exception, 

+

145 } 

+

146 self.log_method = log_methods[level] 

+

147 

+

148 def __iter__(self) -> AnnotatedIterator[T]: 

+

149 """Log the start of the iteration.""" 

+

150 self.log_method("Starting iteration", extra=self.extras) 

+

151 return self 

+

152 

+

153 def __next__(self) -> T: 

+

154 """Log that we are at the next iteration.""" 

+

155 try: 

+

156 value = next(self.wrapped) 

+

157 if self.value: 

+

158 self.extras["value"] = value 

+

159 except StopIteration: 

+

160 self.log_method("Execution complete", extra=self.extras) 

+

161 raise 

+

162 

+

163 self.log_method("next", extra=self.extras) 

+

164 return value 

+

165 

+

166 

+

167class AnnotatedAdapter(logging.LoggerAdapter): # pyright: ignore[reportMissingTypeArgument] 

+

168 """Adapter that provides extra methods.""" 

+

169 

+

170 def __init__( 

+

171 self, 

+

172 logger: logging.Logger, 

+

173 annotated_filter: AnnotatedFilter, 

+

174 max_length: int | None = None, 

+

175 ) -> None: 

+

176 """Adapter that acts like a LogRecord, but allows for annotations.""" 

+

177 self.filter = annotated_filter 

+

178 self.logger = logger 

+

179 self.logger.addFilter(annotated_filter) 

+

180 self.max_length = max_length 

+

181 

+

182 # We don't need to send in contextual information here 

+

183 # as we do it in the filter for runtime stuff 

+

184 super().__init__(logger) 

+

185 

+

186 def iterator( 

+

187 self, 

+

188 name: str, 

+

189 wrapped: Iterator[T], 

+

190 *, 

+

191 value: bool = True, 

+

192 level: str = "info", 

+

193 ) -> AnnotatedIterator[T]: 

+

194 """Return an iterator that logs as it iterates.""" 

+

195 return AnnotatedIterator(self, name, wrapped, value=value, level=level) 

+

196 

+

197 def process( 

+

198 self, msg: str, kwargs: MutableMapping[str, Any] 

+

199 ) -> tuple[str, MutableMapping[str, Any]]: 

+

200 """Override default LoggerAdapter process behavior. 

+

201 

+

202 By default a LoggerAdapter replaces the extras passed in a logger call with 

+

203 the ones given at it's initialization. That's not the behavior we want. 

+

204 So, we just return the kwargs as provided instead. 

+

205 

+

206 3.13 adds a `merge_extra` argument which should make this method unneeded. 

+

207 But, it doesn't make sense to force everyone to use python 3.13. 

+

208 """ 

+

209 return msg, kwargs 

+

210 

+

211 def log( 

+

212 self, 

+

213 level: int, 

+

214 msg: object, 

+

215 *args: object, 

+

216 **kwargs: object, 

+

217 ) -> None: 

+

218 """Override log method to allow for message splitting.""" 

+

219 if not self.max_length or not isinstance(msg, str): 

+

220 return super().log(level, msg, *args, **kwargs) # pyright: ignore[reportArgumentType] 

+

221 

+

222 msg_len = len(msg) # pyright: ignore[reportArgumentType] 

+

223 if msg_len <= self.max_length: 

+

224 return super().log(level, msg, *args, **kwargs) # pyright: ignore[reportArgumentType] 

+

225 

+

226 msg_chunks = [] 

+

227 while len(msg) > self.max_length: # pyright: ignore[reportArgumentType] # pragma: no mutate 

+

228 msg_chunks.append(msg[: self.max_length]) # pyright: ignore[reportArgumentType] 

+

229 msg = msg[self.max_length :] # pyright: ignore[reportArgumentType] 

+

230 kwargs["extra"] = {"message_parts": len(msg_chunks) + 1, "split": True} 

+

231 kwargs["extra"]["split_complete"] = False 

+

232 for i, part in enumerate(msg_chunks): 

+

233 kwargs["extra"]["message_part"] = i + 1 

+

234 super().log( 

+

235 level, 

+

236 part, 

+

237 *args, 

+

238 **kwargs, # pyright: ignore[reportArgumentType] 

+

239 ) 

+

240 kwargs["extra"]["message_part"] = len(msg_chunks) + 1 

+

241 kwargs["extra"]["split_complete"] = True 

+

242 return super().log(level, msg, *args, **kwargs) # pyright: ignore[reportArgumentType] 

+

243 

+

244 def annotate(self, *, persist: bool = False, **kwargs: Any) -> None: 

+

245 """Add an annotation to the filter.""" 

+

246 if persist: 

+

247 self.filter.class_annotations.update(kwargs) 

+

248 else: 

+

249 self.filter.annotations.update(kwargs) 

+

250 

+

251 

+

252class AnnotatedLogger: 

+

253 """Class that contains settings and the decorator method. 

+

254 

+

255 Args: 

+

256 ---- 

+

257 annotations: Dictionary of annotations to be added to every log message 

+

258 plugins: list of plugins to use 

+

259 

+

260 Methods: 

+

261 ------- 

+

262 annotate_logs: Decorator that will insert the `annotated_logger` argument if 

+

263 asked for in the method signature or let a provided AnnotatedAdapter to be 

+

264 passed. Creates a new AnnotatedAdapter instance for each invocation of a 

+

265 annotated function to isolate any annotations that are set during execution. 

+

266 

+

267 """ 

+

268 

+

269 def __init__( # noqa: PLR0913 

+

270 self, 

+

271 annotations: dict[str, Any] | None = None, 

+

272 plugins: list[BasePlugin] | None = None, 

+

273 max_length: int | None = None, 

+

274 log_level: int = logging.INFO, 

+

275 name: str = "annotated_logger", 

+

276 config: dict[str, Any] | Literal[False] | None = None, 

+

277 ) -> None: 

+

278 """Store the settings. 

+

279 

+

280 Args: 

+

281 ---- 

+

282 annotations: Dictionary of static annotations - default None 

+

283 plugins: List of plugins to be applied - default [BasePlugin] 

+

284 is created and used - default None 

+

285 max_length: Integer, maximum length of a message before it's broken into 

+

286 multiple message and log calls. - default None 

+

287 log_level: Integer, log level set for the shared root logger of the package. 

+

288 - default logging.INFO (20) 

+

289 name: Name of the shared root logger of the package. If more than one 

+

290 `AnnotatedLogger` object is created in a project this should be set, 

+

291 otherwise settings like level will be overwritten by the second to execute 

+

292 - default 'annotated_logger' 

+

293 config: Optional - logging config dictionary to be passed to 

+

294 logging.config.dictConfig or False. If false dictConfig will not be called. 

+

295 If not passed the DEFAULT_LOGGING_CONFIG will be used. A special 

+

296 `annotated_filter` keyword is looked for, if present it will be 

+

297 replaced with a `()` filter config to generate a filter for this 

+

298 instance of `AnnotatedLogger`. 

+

299 

+

300 """ 

+

301 if plugins is None: 

+

302 plugins = [] 

+

303 

+

304 self.log_level = log_level 

+

305 self.logger_root_name = name 

+

306 self.logger_base = logging.getLogger(self.logger_root_name) 

+

307 self.logger_base.setLevel(self.log_level) 

+

308 self.annotations = annotations or {} 

+

309 self.plugins = [BasePlugin()] 

+

310 self.plugins.extend(plugins) 

+

311 

+

312 if config is None: 

+

313 config = deepcopy(DEFAULT_LOGGING_CONFIG) 

+

314 if config: 

+

315 for config_filter in config["filters"].values(): 

+

316 if config_filter.get("annotated_filter"): 

+

317 del config_filter["annotated_filter"] 

+

318 config_filter["()"] = self.generate_filter 

+

319 

+

320 # If we pass in config=False we don't want to configure. 

+

321 # This is typically because we have another AnnotatedLogger 

+

322 # object which did run the config and the dict config had config 

+

323 # for both. 

+

324 if config: 

+

325 logging.config.dictConfig(config) 

+

326 

+

327 self.max_length = max_length 

+

328 

+

329 def _generate_logger( 

+

330 self, 

+

331 function: Function[S, P, R] | None = None, 

+

332 cls: type | None = None, 

+

333 logger_base_name: str | None = None, 

+

334 ) -> AnnotatedAdapter: 

+

335 """Generate a unique adapter with a unique logger object. 

+

336 

+

337 This is required because the AnnotatedAdapter adds a filter to the logger. 

+

338 The filter stores the annotations inside it, so they will mix if a new filter 

+

339 and logger are not created each time. 

+

340 """ 

+

341 root_name = logger_base_name or self.logger_root_name 

+

342 logger = logging.getLogger( 

+

343 f"{root_name}.{uuid.uuid4()}" # pragma: no mutate 

+

344 ) 

+

345 

+

346 annotated_filter = self.generate_filter(function=function, cls=cls) 

+

347 

+

348 return AnnotatedAdapter(logger, annotated_filter, self.max_length) 

+

349 

+

350 def _action_annotation( 

+

351 self, function: Function[S, P, R], key: str = "action" 

+

352 ) -> dict[str, str]: 

+

353 return {key: f"{function.__module__}:{function.__qualname__}"} 

+

354 

+

355 def generate_filter( 

+

356 self, 

+

357 function: Function[S, P, R] | None = None, 

+

358 cls: type[C_co] | None = None, 

+

359 annotations: dict[str, Any] | None = None, 

+

360 ) -> AnnotatedFilter: 

+

361 """Create a AnnotatedFilter with the correct annotations and plugins.""" 

+

362 annotations_passed = annotations 

+

363 annotations = annotations or {} 

+

364 if function: 

+

365 annotations.update(self._action_annotation(function)) 

+

366 class_annotations = {} 

+

367 elif cls: 

+

368 class_annotations = {"class": f"{cls.__module__}:{cls.__qualname__}"} 

+

369 else: 

+

370 class_annotations = {} 

+

371 if not annotations_passed: 

+

372 annotations.update(self.annotations) 

+

373 

+

374 return AnnotatedFilter( 

+

375 annotations=annotations, 

+

376 class_annotations=class_annotations, 

+

377 plugins=self.plugins, 

+

378 ) 

+

379 

+

380 #### Defaults 

+

381 @overload 

+

382 def annotate_logs( 

+

383 self, 

+

384 logger_name: str | None = None, 

+

385 *, 

+

386 success_info: bool = True, # pragma: no mutate 

+

387 pre_call: PreCall[S2, P2] = None, 

+

388 post_call: PostCall[S2, P3] = None, 

+

389 ) -> NoInjectionSelf[S, P, R]: ... 

+

390 

+

391 @overload 

+

392 def annotate_logs( 

+

393 self, 

+

394 logger_name: str | None = None, 

+

395 *, 

+

396 success_info: bool = True, # pragma: no mutate 

+

397 pre_call: PreCall[S2, P2] = None, 

+

398 post_call: PostCall[S2, P3] = None, 

+

399 _typing_requested: Literal[False], 

+

400 ) -> NoInjectionSelf[S, P, R]: ... 

+

401 

+

402 @overload 

+

403 def annotate_logs( 

+

404 self, 

+

405 logger_name: str | None = None, 

+

406 *, 

+

407 success_info: bool = True, # pragma: no mutate 

+

408 pre_call: PreCall[S2, P2] = None, 

+

409 post_call: PostCall[S2, P3] = None, 

+

410 provided: Literal[False], 

+

411 ) -> NoInjectionSelf[S, P, R]: ... 

+

412 

+

413 @overload 

+

414 def annotate_logs( 

+

415 self, 

+

416 logger_name: str | None = None, 

+

417 *, 

+

418 success_info: bool = True, # pragma: no mutate 

+

419 pre_call: PreCall[S2, P2] = None, 

+

420 post_call: PostCall[S2, P3] = None, 

+

421 _typing_self: Literal[True], 

+

422 ) -> NoInjectionSelf[S, P, R]: ... 

+

423 

+

424 @overload 

+

425 def annotate_logs( 

+

426 self, 

+

427 logger_name: str | None = None, 

+

428 *, 

+

429 success_info: bool = True, # pragma: no mutate 

+

430 pre_call: PreCall[S2, P2] = None, 

+

431 post_call: PostCall[S2, P3] = None, 

+

432 ) -> NoInjectionSelf[S, P, R]: ... 

+

433 

+

434 @overload 

+

435 def annotate_logs( 

+

436 self, 

+

437 logger_name: str | None = None, 

+

438 *, 

+

439 success_info: bool = True, # pragma: no mutate 

+

440 pre_call: PreCall[S2, P2] = None, 

+

441 post_call: PostCall[S2, P3] = None, 

+

442 _typing_self: Literal[True], 

+

443 _typing_requested: Literal[False], 

+

444 ) -> NoInjectionSelf[S, P, R]: ... 

+

445 

+

446 @overload 

+

447 def annotate_logs( 

+

448 self, 

+

449 logger_name: str | None = None, 

+

450 *, 

+

451 success_info: bool = True, # pragma: no mutate 

+

452 pre_call: PreCall[S2, P2] = None, 

+

453 post_call: PostCall[S2, P3] = None, 

+

454 provided: Literal[False], 

+

455 _typing_requested: Literal[False], 

+

456 ) -> NoInjectionSelf[S, P, R]: ... 

+

457 

+

458 @overload 

+

459 def annotate_logs( 

+

460 self, 

+

461 logger_name: str | None = None, 

+

462 *, 

+

463 success_info: bool = True, # pragma: no mutate 

+

464 pre_call: PreCall[S2, P2] = None, 

+

465 post_call: PostCall[S2, P3] = None, 

+

466 _typing_self: Literal[True], 

+

467 provided: Literal[False], 

+

468 ) -> NoInjectionSelf[S, P, R]: ... 

+

469 

+

470 @overload 

+

471 def annotate_logs( 

+

472 self, 

+

473 logger_name: str | None = None, 

+

474 *, 

+

475 success_info: bool = True, # pragma: no mutate 

+

476 pre_call: PreCall[S2, P2] = None, 

+

477 post_call: PostCall[S2, P3] = None, 

+

478 _typing_self: Literal[True], 

+

479 _typing_requested: Literal[False], 

+

480 provided: Literal[False], 

+

481 ) -> NoInjectionSelf[S, P, R]: ... 

+

482 

+

483 #### Class True 

+

484 @overload 

+

485 def annotate_logs( 

+

486 self, 

+

487 logger_name: str | None = None, 

+

488 *, 

+

489 _typing_class: Literal[True], 

+

490 success_info: bool = True, # pragma: no mutate 

+

491 pre_call: PreCall[S, P2] = None, 

+

492 post_call: PostCall[S, P3] = None, 

+

493 ) -> Callable[[type[C_co]], type[C_co]]: ... 

+

494 

+

495 ### Instance False 

+

496 @overload 

+

497 def annotate_logs( 

+

498 self, 

+

499 logger_name: str | None = None, 

+

500 *, 

+

501 success_info: bool = True, # pragma: no mutate 

+

502 pre_call: PreCall[S2, P2] = None, 

+

503 post_call: PostCall[S2, P3] = None, 

+

504 _typing_self: Literal[False], 

+

505 ) -> NoInjectionBare[P, R]: ... 

+

506 

+

507 @overload 

+

508 def annotate_logs( 

+

509 self, 

+

510 logger_name: str | None = None, 

+

511 *, 

+

512 success_info: bool = True, # pragma: no mutate 

+

513 pre_call: PreCall[S2, P2] = None, 

+

514 post_call: PostCall[S2, P3] = None, 

+

515 _typing_self: Literal[False], 

+

516 _typing_requested: Literal[False], 

+

517 ) -> NoInjectionBare[P, R]: ... 

+

518 

+

519 @overload 

+

520 def annotate_logs( 

+

521 self, 

+

522 logger_name: str | None = None, 

+

523 *, 

+

524 success_info: bool = True, # pragma: no mutate 

+

525 pre_call: PreCall[S2, P2] = None, 

+

526 post_call: PostCall[S2, P3] = None, 

+

527 _typing_self: Literal[False], 

+

528 provided: Literal[False], 

+

529 ) -> NoInjectionBare[P, R]: ... 

+

530 

+

531 @overload 

+

532 def annotate_logs( 

+

533 self, 

+

534 logger_name: str | None = None, 

+

535 *, 

+

536 success_info: bool = True, # pragma: no mutate 

+

537 pre_call: PreCall[S2, P2] = None, 

+

538 post_call: PostCall[S2, P3] = None, 

+

539 _typing_self: Literal[False], 

+

540 _typing_requested: Literal[False], 

+

541 provided: Literal[False], 

+

542 ) -> NoInjectionBare[P, R]: ... 

+

543 

+

544 ### Requested True 

+

545 @overload 

+

546 def annotate_logs( 

+

547 self, 

+

548 logger_name: str | None = None, 

+

549 *, 

+

550 success_info: bool = True, # pragma: no mutate 

+

551 pre_call: PreCall[S2, P2] = None, 

+

552 post_call: PostCall[S2, P3] = None, 

+

553 _typing_requested: Literal[True], 

+

554 ) -> InjectionSelf[S, P, R]: ... 

+

555 

+

556 @overload 

+

557 def annotate_logs( 

+

558 self, 

+

559 logger_name: str | None = None, 

+

560 *, 

+

561 success_info: bool = True, # pragma: no mutate 

+

562 pre_call: PreCall[S2, P2] = None, 

+

563 post_call: PostCall[S2, P3] = None, 

+

564 _typing_self: Literal[True], 

+

565 _typing_requested: Literal[True], 

+

566 ) -> InjectionSelf[S, P, R]: ... 

+

567 

+

568 @overload 

+

569 def annotate_logs( 

+

570 self, 

+

571 logger_name: str | None = None, 

+

572 *, 

+

573 success_info: bool = True, # pragma: no mutate 

+

574 pre_call: PreCall[S2, P2] = None, 

+

575 post_call: PostCall[S2, P3] = None, 

+

576 provided: Literal[False], 

+

577 _typing_requested: Literal[True], 

+

578 ) -> InjectionSelf[S, P, R]: ... 

+

579 

+

580 @overload 

+

581 def annotate_logs( 

+

582 self, 

+

583 logger_name: str | None = None, 

+

584 *, 

+

585 success_info: bool = True, # pragma: no mutate 

+

586 pre_call: PreCall[S2, P2] = None, 

+

587 post_call: PostCall[S2, P3] = None, 

+

588 _typing_self: Literal[True], 

+

589 _typing_requested: Literal[True], 

+

590 provided: Literal[False], 

+

591 ) -> InjectionSelf[S, P, R]: ... 

+

592 

+

593 ### Provided True, Requested True 

+

594 # Can't provide it if it was not requested, 

+

595 # so no overloads for not requested, but provided 

+

596 @overload 

+

597 def annotate_logs( 

+

598 self, 

+

599 logger_name: str | None = None, 

+

600 *, 

+

601 success_info: bool = True, # pragma: no mutate 

+

602 pre_call: PreCall[S2, P2] = None, 

+

603 post_call: PostCall[S2, P3] = None, 

+

604 _typing_requested: Literal[True], 

+

605 provided: Literal[True], 

+

606 ) -> InjectionSelfProvide[S, P, R]: ... 

+

607 

+

608 @overload 

+

609 def annotate_logs( 

+

610 self, 

+

611 logger_name: str | None = None, 

+

612 *, 

+

613 success_info: bool = True, # pragma: no mutate 

+

614 pre_call: PreCall[S2, P2] = None, 

+

615 post_call: PostCall[S2, P3] = None, 

+

616 _typing_self: Literal[True], 

+

617 _typing_requested: Literal[True], 

+

618 provided: Literal[True], 

+

619 ) -> InjectionSelfProvide[S, P, R]: ... 

+

620 

+

621 ### Instance False, Requested True 

+

622 @overload 

+

623 def annotate_logs( 

+

624 self, 

+

625 logger_name: str | None = None, 

+

626 *, 

+

627 success_info: bool = True, # pragma: no mutate 

+

628 pre_call: PreCall[S2, P2] = None, 

+

629 post_call: PostCall[S2, P3] = None, 

+

630 _typing_self: Literal[False], 

+

631 _typing_requested: Literal[True], 

+

632 ) -> InjectionBare[P, R]: ... 

+

633 

+

634 ### Instance False, Requested True, Provided True 

+

635 # Same not as above that you can't provide if not requested 

+

636 @overload 

+

637 def annotate_logs( 

+

638 self, 

+

639 logger_name: str | None = None, 

+

640 *, 

+

641 success_info: bool = True, # pragma: no mutate 

+

642 pre_call: PreCall[S2, P2] = None, 

+

643 post_call: PostCall[S2, P2] = None, 

+

644 _typing_self: Literal[False], 

+

645 _typing_requested: Literal[True], 

+

646 provided: Literal[True], 

+

647 ) -> InjectionBareProvide[P, R]: ... 

+

648 

+

649 # Between the overloads and the two inner method definitions, 

+

650 # there's not much I can do to reduce the complexity more. 

+

651 # So, ignoring the complexity metric 

+

652 def annotate_logs( # noqa: C901 

+

653 self, 

+

654 logger_name: str | None = None, 

+

655 *, 

+

656 success_info: bool = True, 

+

657 pre_call: PreCall[S2, P2] = None, 

+

658 post_call: PostCall[S2, P3] = None, 

+

659 provided: bool = False, 

+

660 _typing_self: bool = True, # pragma: no mutate 

+

661 _typing_requested: bool = False, # pragma: no mutate 

+

662 _typing_class: bool = False, # pragma: no mutate 

+

663 ) -> Decorator[S, P, R] | Callable[[type[C_co]], type[C_co]]: 

+

664 """Log start and end of function and provide an annotated logger if requested. 

+

665 

+

666 Args: 

+

667 ---- 

+

668 logger_name: Optional - Specify the name of the logger attached to 

+

669 the decorated function. 

+

670 success_info: Log success at an info level, if falsey success will be 

+

671 logged at debug. Default: True 

+

672 provided: Boolean that indicates the caller will be providing it's 

+

673 own annotated_logger. Default: False 

+

674 pre_call: Method that takes the same arguments as the decorated function 

+

675 and does something. Called before the function and the `start` log message. 

+

676 post_call: Method that takes the same arguments as the decorated function 

+

677 and does something. Called after the function and before the `success` 

+

678 log message or in the exception handling. 

+

679 _typing_self: Used only for type hint overloads. Indicates that the 

+

680 decorated method is an instance method and has a self parameter. 

+

681 Default: True 

+

682 _typing_requested: Used only for type hint overloads. Indicates that the 

+

683 decorated method is expecting an annotated_logger to be provided. 

+

684 Default: False 

+

685 

+

686 Notes: 

+

687 ----- 

+

688 In order to fully support type hinting, the annotated_logger argument 

+

689 must be the first argument (after self/cls). Type hinting will only work 

+

690 correctly if the _typing arguments are set correctly, but the code will 

+

691 work fine at runtime without the _typing arguments. 

+

692 

+

693 """ 

+

694 

+

695 @overload 

+

696 def decorator( 

+

697 wrapped: SelfLoggerAndParams[S, P, R], 

+

698 ) -> SelfAndParams[S, P, R] | SelfLoggerAndParams[S, P, R]: ... 

+

699 

+

700 @overload 

+

701 def decorator( 

+

702 wrapped: LoggerAndParams[P, R], 

+

703 ) -> ParamsOnly[P, R] | LoggerAndParams[P, R]: ... 

+

704 

+

705 @overload 

+

706 def decorator( 

+

707 wrapped: SelfAndParams[S, P, R], 

+

708 ) -> SelfAndParams[S, P, R]: ... 

+

709 

+

710 @overload 

+

711 def decorator( 

+

712 wrapped: ParamsOnly[P, R], 

+

713 ) -> ParamsOnly[P, R] | Empty[R]: ... 

+

714 

+

715 @overload 

+

716 def decorator(wrapped: type[C_co]) -> Callable[P, AnnotatedClass[C_co]]: ... 

+

717 

+

718 def decorator( # noqa: C901 

+

719 wrapped: Function[S, P, R] | type[C_co], 

+

720 ) -> Function[S, P, R] | Callable[P, AnnotatedClass[C_co]]: 

+

721 if isinstance(wrapped, type): 

+

722 

+

723 def wrap_class( 

+

724 *args: P.args, **kwargs: P.kwargs 

+

725 ) -> AnnotatedClass[C_co]: 

+

726 logger = self._generate_logger( 

+

727 cls=wrapped, logger_base_name=logger_name 

+

728 ) 

+

729 logger.debug("init") 

+

730 new = cast(AnnotatedClass[C_co], wrapped(*args, **kwargs)) 

+

731 new.annotated_logger = logger 

+

732 return new 

+

733 

+

734 return wrap_class 

+

735 

+

736 (remove_args, inject_logger) = self._determine_signature_adjustments( 

+

737 wrapped, provided=provided 

+

738 ) 

+

739 

+

740 @wraps( 

+

741 wrapped, 

+

742 remove_args=remove_args, 

+

743 ) 

+

744 def wrap_function(*args: P.args, **kwargs: P.kwargs) -> R: 

+

745 __tracebackhide__ = True # pragma: no mutate 

+

746 

+

747 post_call_attempted = False # pragma: no mutate 

+

748 

+

749 new_args, new_kwargs, logger, pre_execution_annotations = inject_logger( 

+

750 list(args), kwargs, logger_base_name=logger_name 

+

751 ) 

+

752 try: 

+

753 start_time = time.perf_counter() 

+

754 if pre_call: 

+

755 pre_call(*new_args, **new_kwargs) # pyright: ignore[reportCallIssue] 

+

756 logger.debug("start") 

+

757 

+

758 result = wrapped(*new_args, **new_kwargs) # pyright: ignore[reportCallIssue] 

+

759 logger.annotate(success=True) 

+

760 if post_call: 

+

761 post_call_attempted = True 

+

762 _attempt_post_call(post_call, logger, *new_args, **new_kwargs) # pyright: ignore[reportCallIssue] 

+

763 end_time = time.perf_counter() 

+

764 logger.annotate(run_time=f"{end_time - start_time :.1f}") 

+

765 with contextlib.suppress(TypeError): 

+

766 logger.annotate(count=len(result)) # pyright: ignore[reportArgumentType] 

+

767 

+

768 if success_info: 

+

769 logger.info("success") 

+

770 else: 

+

771 logger.debug("success") 

+

772 

+

773 # If we were provided with a logger object, set the annotations 

+

774 # back to what they were before the wrapped method was called. 

+

775 if pre_execution_annotations: 

+

776 logger.filter.annotations = pre_execution_annotations 

+

777 except Exception as e: 

+

778 for plugin in logger.filter.plugins: 

+

779 logger = plugin.uncaught_exception(e, logger) 

+

780 logger.exception( 

+

781 "Uncaught Exception in logged function", 

+

782 ) 

+

783 if post_call and not post_call_attempted: 

+

784 _attempt_post_call(post_call, logger, *new_args, **new_kwargs) # pyright: ignore[reportCallIssue] 

+

785 raise 

+

786 return result 

+

787 

+

788 return wrap_function 

+

789 

+

790 return decorator 

+

791 

+

792 def _determine_signature_adjustments( 

+

793 self, 

+

794 function: Function[S, P, R], 

+

795 *, 

+

796 provided: bool, 

+

797 ) -> tuple[ 

+

798 list[str], 

+

799 Callable[ 

+

800 Concatenate[list[Any], dict[str, Any], ...], 

+

801 tuple[list[Any], dict[str, Any], AnnotatedAdapter, Annotations | None], 

+

802 ], 

+

803 ]: 

+

804 written_signature = inspect.signature(function) 

+

805 logger_requested = False # pragma: no mutate 

+

806 remove_args = [] 

+

807 index, instance_method = self._check_parameters_for_self_and_cls( 

+

808 written_signature 

+

809 ) 

+

810 if "annotated_logger" in written_signature.parameters: 

+

811 if list(written_signature.parameters.keys())[index] != "annotated_logger": 

+

812 error_message = "annotated_logger must be the first argument" 

+

813 raise TypeError(error_message) 

+

814 

+

815 logger_requested = True 

+

816 if not provided: 

+

817 remove_args = ["annotated_logger"] 

+

818 

+

819 def inject_logger( 

+

820 args: list[Any], 

+

821 kwargs: dict[str, Any], 

+

822 logger_base_name: str | None = None, 

+

823 ) -> tuple[list[Any], dict[str, Any], AnnotatedAdapter, Annotations | None]: 

+

824 if not logger_requested: 

+

825 logger = self._generate_logger( 

+

826 function, logger_base_name=logger_base_name 

+

827 ) 

+

828 return (args, kwargs, logger, None) 

+

829 

+

830 by_index = False # pragma: no mutate 

+

831 # Check for a var positional or positional only 

+

832 # If present that means we'll have values in args when invoking 

+

833 # but, if not everything will be in kwargs 

+

834 for v in written_signature.parameters.values(): 

+

835 if v.kind == inspect.Parameter.VAR_POSITIONAL: 

+

836 by_index = True 

+

837 

+

838 new_args = copy(args) 

+

839 new_kwargs = copy(kwargs) 

+

840 if by_index: 

+

841 logger, annotations, new_args = self._inject_by_index( 

+

842 provided=provided, 

+

843 instance_method=instance_method, 

+

844 args=new_args, 

+

845 index=index, 

+

846 function=function, 

+

847 logger_base_name=logger_base_name, 

+

848 ) 

+

849 else: 

+

850 logger, annotations, new_kwargs = self._inject_by_kwarg( 

+

851 provided=provided, 

+

852 instance_method=instance_method, 

+

853 kwargs=new_kwargs, 

+

854 function=function, 

+

855 logger_base_name=logger_base_name, 

+

856 ) 

+

857 

+

858 return new_args, new_kwargs, logger, annotations 

+

859 

+

860 return remove_args, inject_logger 

+

861 

+

862 def _inject_by_kwarg( 

+

863 self, 

+

864 *, 

+

865 provided: bool, 

+

866 instance_method: bool, 

+

867 function: Function[S, P, R], 

+

868 kwargs: dict[str, Any], 

+

869 logger_base_name: str | None = None, 

+

870 ) -> tuple[AnnotatedAdapter, Annotations | None, dict[str, Any]]: 

+

871 if provided: 

+

872 instance = kwargs["annotated_logger"] 

+

873 elif instance_method: 

+

874 instance = kwargs["self"] 

+

875 else: 

+

876 instance = False # pragma: no mutate 

+

877 logger, annotations = self._pick_correct_logger( 

+

878 function, instance, logger_base_name=logger_base_name 

+

879 ) 

+

880 if not provided: 

+

881 kwargs["annotated_logger"] = logger 

+

882 

+

883 return logger, annotations, kwargs 

+

884 

+

885 def _inject_by_index( # noqa: PLR0913 

+

886 self, 

+

887 *, 

+

888 provided: bool, 

+

889 instance_method: bool, 

+

890 function: Function[S, P, R], 

+

891 args: list[Any], 

+

892 index: int, 

+

893 logger_base_name: str | None = None, 

+

894 ) -> tuple[AnnotatedAdapter, Annotations | None, list[Any]]: 

+

895 if provided: 

+

896 instance = args[index] 

+

897 elif instance_method: 

+

898 instance = args[0] 

+

899 else: 

+

900 instance = False # pragma: no mutate 

+

901 logger, annotations = self._pick_correct_logger( 

+

902 function, instance, logger_base_name=logger_base_name 

+

903 ) 

+

904 if not provided: 

+

905 args.insert(index, logger) 

+

906 return logger, annotations, args 

+

907 

+

908 def _check_parameters_for_self_and_cls( 

+

909 self, sig: inspect.Signature 

+

910 ) -> tuple[int, bool]: 

+

911 parameters = sig.parameters 

+

912 index = 0 

+

913 instance_method = False 

+

914 if "self" in parameters: 

+

915 index = 1 

+

916 instance_method = True 

+

917 if "cls" in parameters: 

+

918 index = 1 

+

919 

+

920 return index, instance_method 

+

921 

+

922 def _pick_correct_logger( 

+

923 self, 

+

924 function: Function[S, P, R], 

+

925 instance: object | bool, 

+

926 logger_base_name: str | None = None, 

+

927 ) -> tuple[AnnotatedAdapter, Annotations | None]: 

+

928 """Use the instance's logger and annotations if present.""" 

+

929 if instance and hasattr(instance, "annotated_logger"): 

+

930 logger = instance.annotated_logger # pyright: ignore[reportAttributeAccessIssue] 

+

931 annotations = copy(logger.filter.annotations) 

+

932 logger.filter.annotations.update(self._action_annotation(function)) 

+

933 return (logger, annotations) 

+

934 

+

935 if isinstance(instance, AnnotatedAdapter): 

+

936 logger = instance 

+

937 annotations = copy(logger.filter.annotations) 

+

938 logger.filter.annotations.update( 

+

939 self._action_annotation(function, key="subaction") 

+

940 ) 

+

941 return (logger, annotations) 

+

942 

+

943 return ( 

+

944 self._generate_logger(function, logger_base_name=logger_base_name), 

+

945 None, 

+

946 ) 

+

947 

+

948 

+

949def _attempt_post_call( 

+

950 post_call: Callable[P, None], 

+

951 logger: AnnotatedAdapter, 

+

952 *args: P.args, 

+

953 **kwargs: P.kwargs, 

+

954) -> None: 

+

955 try: 

+

956 if post_call: 

+

957 post_call(*args, **kwargs) # pyright: ignore[reportCallIssue] 

+

958 except Exception: 

+

959 logger.annotate(success=False) 

+

960 logger.exception("Post call failed") 

+

961 raise 

+
+ + + diff --git a/htmlcov/z_beb44c9891d1179a_filter_py.html b/htmlcov/z_beb44c9891d1179a_filter_py.html new file mode 100644 index 0000000..6161184 --- /dev/null +++ b/htmlcov/z_beb44c9891d1179a_filter_py.html @@ -0,0 +1,155 @@ + + + + + Coverage for annotated_logger/filter.py: 100% + + + + + +
+
+

+ Coverage for annotated_logger/filter.py: + 100% +

+ +

+ 31 statements   + + + +

+

+ « prev     + ^ index     + » next +       + coverage.py v7.6.4, + created at 2024-12-11 21:45 +0000 +

+ +
+
+
+

1from __future__ import annotations 

+

2 

+

3import logging 

+

4from copy import copy 

+

5from typing import Any 

+

6 

+

7import annotated_logger 

+

8 

+

9Annotations = dict[str, Any] 

+

10 

+

11 

+

12class AnnotatedFilter(logging.Filter): 

+

13 """Filter class that stores the annotations and plugins.""" 

+

14 

+

15 def __init__( 

+

16 self, 

+

17 annotations: Annotations | None = None, 

+

18 class_annotations: Annotations | None = None, 

+

19 plugins: list[annotated_logger.BasePlugin] | None = None, 

+

20 ) -> None: 

+

21 """Store the annotations, attributes and plugins.""" 

+

22 self.annotations = annotations or {} 

+

23 self.class_annotations = class_annotations or {} 

+

24 self.plugins = plugins or [annotated_logger.BasePlugin()] 

+

25 

+

26 # This allows plugins to determine what fields were added by the user 

+

27 # vs the ones native to the log record 

+

28 # TODO(crimsonknave): Make a test for this # noqa: TD003, FIX002 

+

29 self.base_attributes = logging.makeLogRecord({}).__dict__ # pragma: no mutate 

+

30 

+

31 def _all_annotations(self) -> Annotations: 

+

32 annotations = {} 

+

33 annotations.update(copy(self.class_annotations)) 

+

34 annotations.update(copy(self.annotations)) 

+

35 annotations["annotated"] = True 

+

36 return annotations 

+

37 

+

38 def filter(self, record: logging.LogRecord) -> bool: 

+

39 """Add the annotations to the record and allow plugins to filter the record. 

+

40 

+

41 The `filter` method is called on each plugin in the order they are listed. 

+

42 The plugin is then able to maniuplate the record object before the next plugin 

+

43 sees it. Returning False from the filter method will stop the evaluation and 

+

44 the log record won't be emitted. 

+

45 """ 

+

46 record.__dict__.update(self._all_annotations()) 

+

47 for plugin in self.plugins: 

+

48 try: 

+

49 result = plugin.filter(record) 

+

50 except Exception: # noqa: BLE001 

+

51 failed_plugins = record.__dict__.get("failed_plugins", []) 

+

52 failed_plugins.append(str(plugin.__class__)) 

+

53 record.__dict__["failed_plugins"] = failed_plugins 

+

54 result = True 

+

55 

+

56 if not result: 

+

57 return False 

+

58 return True 

+
+ + + diff --git a/htmlcov/z_beb44c9891d1179a_mocks_py.html b/htmlcov/z_beb44c9891d1179a_mocks_py.html new file mode 100644 index 0000000..ec05559 --- /dev/null +++ b/htmlcov/z_beb44c9891d1179a_mocks_py.html @@ -0,0 +1,350 @@ + + + + + Coverage for annotated_logger/mocks.py: 100% + + + + + +
+
+

+ Coverage for annotated_logger/mocks.py: + 100% +

+ +

+ 124 statements   + + + +

+

+ « prev     + ^ index     + » next +       + coverage.py v7.6.4, + created at 2024-12-11 21:45 +0000 +

+ +
+
+
+

1from __future__ import annotations 

+

2 

+

3import logging 

+

4from typing import Any, Literal 

+

5 

+

6import pychoir 

+

7import pytest 

+

8 

+

9 

+

10class AssertLogged: 

+

11 """Stores the data from a call to `assert_logged` and checks if there is a match.""" 

+

12 

+

13 def __init__( 

+

14 self, 

+

15 level: str | pychoir.core.Matcher, 

+

16 message: str | pychoir.core.Matcher, 

+

17 present: dict[str, str], 

+

18 absent: set[str] | Literal["ALL"], 

+

19 *, 

+

20 count: int | pychoir.core.Matcher, 

+

21 ) -> None: 

+

22 """Store the arguments that were passed to `assert_logged` and set defaults.""" 

+

23 self.level = level 

+

24 self.message = message 

+

25 self.present = present 

+

26 self.absent = absent 

+

27 self.count = count 

+

28 self.found = 0 

+

29 self.failed_matches: dict[str, int] = {} 

+

30 

+

31 def check(self, mock: AnnotatedLogMock) -> None: 

+

32 """Loop through calls in passed mock and check for matches.""" 

+

33 for record in mock.records: 

+

34 differences = self._check_record_matches(record) 

+

35 if len(differences) == 0: 

+

36 self.found = self.found + 1 

+

37 diff_str = str(differences) 

+

38 if diff_str in self.failed_matches: 

+

39 self.failed_matches[diff_str] += 1 

+

40 else: 

+

41 self.failed_matches[diff_str] = 1 

+

42 

+

43 fail_message = self.build_message() 

+

44 if len(fail_message) > 0: 

+

45 pytest.fail("\n".join(fail_message)) 

+

46 

+

47 def _failed_sort_key(self, failed_tuple: tuple[str, int]) -> str: 

+

48 failed, count = failed_tuple 

+

49 message_match = failed.count("Desired message") 

+

50 count_diff = 0 # pragma: no mutate 

+

51 if isinstance(self.count, int): 

+

52 count_diff = abs(count - self.count) 

+

53 number = ( 

+

54 failed.count("Desired") 

+

55 + failed.count("Missing key") 

+

56 + failed.count("Unwanted key") 

+

57 ) 

+

58 length = len(failed) 

+

59 # This will order by if the message matched then how the count differs 

+

60 # then number of incorrect bits and finally the length 

+

61 return f"{message_match}-{count_diff:04d}-{number:04d}-{length:04d}" # pragma: no mutate # noqa: E501 

+

62 

+

63 def build_message(self) -> list[str]: 

+

64 """Create failure message.""" 

+

65 if self.count == 0 and self.found == 0: 

+

66 return [] 

+

67 if self.found == 0: 

+

68 fail_message = [ 

+

69 f"No matching log record found. There were {sum(self.failed_matches.values())} log messages.", # noqa: E501 

+

70 ] 

+

71 

+

72 fail_message.append("Desired:") 

+

73 if isinstance(self.count, int): 

+

74 fail_message.append(f"Count: {self.count}") 

+

75 fail_message.append(f"Message: '{self.message}'") 

+

76 fail_message.append(f"Level: '{self.level}'") 

+

77 # only put in these if they were specified 

+

78 fail_message.append(f"Present: '{self.present}'") 

+

79 fail_message.append(f"Absent: '{self.absent}'") 

+

80 fail_message.append("") 

+

81 

+

82 if len(self.failed_matches) == 0: 

+

83 return fail_message 

+

84 fail_message.append( 

+

85 "Below is a list of the values for the selected extras for those failed matches.", # noqa: E501 

+

86 ) 

+

87 for match, count in sorted( 

+

88 self.failed_matches.items(), key=self._failed_sort_key 

+

89 ): 

+

90 msg = match 

+

91 if self.count and self.count != count: 

+

92 msg = ( 

+

93 match[:-1] 

+

94 + f', "Desired {self.count} call{"" if self.count == 1 else "s"}, actual {count} call{"" if count == 1 else "s"}"' # noqa: E501 

+

95 + match[-1:] 

+

96 ) 

+

97 fail_message.append(msg) 

+

98 return fail_message 

+

99 

+

100 if self.count != self.found: 

+

101 return [f"Found {self.found} matching messages, {self.count} were desired"] 

+

102 return [] 

+

103 

+

104 def _check_record_matches( 

+

105 self, 

+

106 record: logging.LogRecord, 

+

107 ) -> list[str]: 

+

108 differences = [] 

+

109 # `levelname` is often renamed. But, `levelno` shouldn't be touched as often 

+

110 # So, don't try to guess what the level name is, just use the levelno. 

+

111 level = { 

+

112 logging.DEBUG: "DEBUG", 

+

113 logging.INFO: "INFO", 

+

114 logging.WARNING: "WARNING", 

+

115 logging.ERROR: "ERROR", 

+

116 }[record.levelno] 

+

117 actual = { 

+

118 "level": level, 

+

119 "msg": record.msg, 

+

120 # The extras are already added as attributes, so this is the easiest way 

+

121 # to get them. There are more things in here, but that should be fine 

+

122 "extra": record.__dict__, 

+

123 } 

+

124 

+

125 if self.level != actual["level"]: 

+

126 differences.append( 

+

127 f"Desired level: {self.level}, actual level: {actual['level']}", 

+

128 ) 

+

129 # TODO @<crimsonknave>: Do a better string diff here # noqa: FIX002, TD003 

+

130 if self.message != actual["msg"]: 

+

131 differences.append( 

+

132 f"Desired message: '{self.message}', actual message: '{actual['msg']}'", 

+

133 ) 

+

134 

+

135 actual_keys = set(actual["extra"].keys()) 

+

136 desired_keys = set(self.present.keys()) 

+

137 

+

138 missing = desired_keys - actual_keys 

+

139 unwanted = set() 

+

140 if self.absent == AnnotatedLogMock.ALL: 

+

141 unwanted = actual_keys - AnnotatedLogMock.DEFAULT_LOG_KEYS 

+

142 elif isinstance(self.absent, set): 

+

143 unwanted = actual_keys & self.absent 

+

144 shared = desired_keys & actual_keys 

+

145 differences.extend([f"Missing key: `{key}`" for key in sorted(missing)]) 

+

146 

+

147 differences.extend([f"Unwanted key: `{key}`" for key in sorted(unwanted)]) 

+

148 

+

149 differences.extend( 

+

150 [ 

+

151 f"Extra `{key}` value is incorrect. Desired `{self.present[key]}` ({self.present[key].__class__}) , actual `{actual['extra'][key]}` ({actual['extra'][key].__class__})" # noqa: E501 

+

152 for key in sorted(shared) 

+

153 if self.present[key] != actual["extra"][key] 

+

154 ] 

+

155 ) 

+

156 return differences 

+

157 

+

158 

+

159class AnnotatedLogMock(logging.Handler): 

+

160 """Mock that captures logs and provides extra assertion logic.""" 

+

161 

+

162 ALL = "ALL" 

+

163 DEFAULT_LOG_KEYS = frozenset( 

+

164 [ 

+

165 "action", 

+

166 "annotated", 

+

167 "args", 

+

168 "created", 

+

169 "exc_info", 

+

170 "exc_text", 

+

171 "filename", 

+

172 "funcName", 

+

173 "levelname", 

+

174 "levelno", 

+

175 "lineno", 

+

176 "message", 

+

177 "module", 

+

178 "msecs", 

+

179 "msg", 

+

180 "name", 

+

181 "pathname", 

+

182 "process", 

+

183 "processName", 

+

184 "relativeCreated", 

+

185 "stack_info", 

+

186 "thread", 

+

187 "threadName", 

+

188 ] 

+

189 ) 

+

190 

+

191 def __init__(self, handler: logging.Handler) -> None: 

+

192 """Store the handler and initialize the messages and records lists.""" 

+

193 self.messages = [] 

+

194 self.records = [] 

+

195 self.handler = handler 

+

196 

+

197 def __getattr__(self, name: str) -> Any: # noqa: ANN401 

+

198 """Fall back to the real handler object.""" 

+

199 return getattr(self.handler, name) 

+

200 

+

201 def handle(self, record: logging.LogRecord) -> bool: 

+

202 """Wrap the real handle method, store the formatted message and log record.""" 

+

203 self.messages.append(self.handler.format(record)) 

+

204 self.records.append(record) 

+

205 return self.handler.handle(record) 

+

206 

+

207 def assert_logged( 

+

208 self, 

+

209 level: str | pychoir.core.Matcher | None = None, 

+

210 message: str | pychoir.core.Matcher | None = None, 

+

211 present: dict[str, Any] | None = None, 

+

212 absent: str | set[str] | list[str] | None = None, 

+

213 count: int | pychoir.core.Matcher | None = None, 

+

214 ) -> None: 

+

215 """Check if the mock received a log call that matches the arguments.""" 

+

216 if level is None: 

+

217 level = pychoir.existential.Anything() 

+

218 elif isinstance(level, str): 

+

219 level = level.upper() 

+

220 if message is None: 

+

221 message = pychoir.existential.Anything() 

+

222 if present is None: 

+

223 present = {} 

+

224 if absent is None: 

+

225 absent = [] 

+

226 if isinstance(absent, list): 

+

227 absent = set(absent) 

+

228 if isinstance(absent, str) and absent != "ALL": 

+

229 absent = {absent} 

+

230 if count is None: 

+

231 count = pychoir.numeric.IsPositive() 

+

232 __tracebackhide__ = True # pragma: no mutate 

+

233 assert_logged = AssertLogged(level, message, present, absent, count=count) 

+

234 assert_logged.check(self) 

+

235 

+

236 

+

237@pytest.fixture() 

+

238def annotated_logger_object() -> logging.Logger: 

+

239 """Logger to wrap with the `annotated_logger_mock` fixture.""" 

+

240 return logging.getLogger("annotated_logger") 

+

241 

+

242 

+

243@pytest.fixture() 

+

244def annotated_logger_mock(annotated_logger_object: logging.Logger) -> AnnotatedLogMock: 

+

245 """Fixture for a mock of the annotated logger.""" 

+

246 handler = annotated_logger_object.handlers[0] 

+

247 annotated_logger_object.removeHandler(handler) 

+

248 mock_handler = AnnotatedLogMock( 

+

249 handler=handler, 

+

250 ) 

+

251 

+

252 annotated_logger_object.addHandler(mock_handler) 

+

253 return mock_handler 

+
+ + + diff --git a/htmlcov/z_beb44c9891d1179a_plugins_py.html b/htmlcov/z_beb44c9891d1179a_plugins_py.html new file mode 100644 index 0000000..5fd7691 --- /dev/null +++ b/htmlcov/z_beb44c9891d1179a_plugins_py.html @@ -0,0 +1,305 @@ + + + + + Coverage for annotated_logger/plugins.py: 100% + + + + + +
+
+

+ Coverage for annotated_logger/plugins.py: + 100% +

+ +

+ 92 statements   + + + +

+

+ « prev     + ^ index     + » next +       + coverage.py v7.6.4, + created at 2024-12-11 21:45 +0000 +

+ +
+
+
+

1from __future__ import annotations 

+

2 

+

3import contextlib 

+

4import logging 

+

5from typing import TYPE_CHECKING, Any, Callable 

+

6 

+

7from requests.exceptions import HTTPError 

+

8 

+

9from annotated_logger.filter import AnnotatedFilter 

+

10 

+

11if TYPE_CHECKING: # pragma: no cover 

+

12 from annotated_logger import AnnotatedAdapter 

+

13 

+

14 

+

15class BasePlugin: 

+

16 """Base class for plugins.""" 

+

17 

+

18 def filter(self, _record: logging.LogRecord) -> bool: 

+

19 """Determine if the record should be sent.""" 

+

20 return True 

+

21 

+

22 def uncaught_exception( 

+

23 self, exception: Exception, logger: AnnotatedAdapter 

+

24 ) -> AnnotatedAdapter: 

+

25 """Handle an uncaught excaption.""" 

+

26 if "success" not in logger.filter.annotations: 

+

27 logger.annotate(success=False) 

+

28 if "exception_title" not in logger.filter.annotations: 

+

29 logger.annotate(exception_title=str(exception)) 

+

30 return logger 

+

31 

+

32 

+

33class RuntimeAnnotationsPlugin(BasePlugin): 

+

34 """Plugin that sets annotations dynamically.""" 

+

35 

+

36 def __init__( 

+

37 self, runtime_annotations: dict[str, Callable[[logging.LogRecord], Any]] 

+

38 ) -> None: 

+

39 """Store the runtime annotations.""" 

+

40 self.runtime_annotations = runtime_annotations 

+

41 

+

42 def filter(self, record: logging.LogRecord) -> bool: 

+

43 """Add any configured runtime annotations.""" 

+

44 for key, function in self.runtime_annotations.items(): 

+

45 record.__dict__[key] = function(record) 

+

46 return True 

+

47 

+

48 

+

49class RequestsPlugin(BasePlugin): 

+

50 """Plugin for the requests library.""" 

+

51 

+

52 def uncaught_exception( 

+

53 self, exception: Exception, logger: AnnotatedAdapter 

+

54 ) -> AnnotatedAdapter: 

+

55 """Add the status code if possible.""" 

+

56 if isinstance(exception, HTTPError) and exception.response is not None: 

+

57 logger.annotate(status_code=exception.response.status_code) 

+

58 logger.annotate(exception_title=exception.response.reason) 

+

59 return logger 

+

60 

+

61 

+

62class RenamerPlugin(BasePlugin): 

+

63 """Plugin that prevents name collisions.""" 

+

64 

+

65 class FieldNotPresentError(Exception): 

+

66 """Exception for a field that is supposed to be renamed, but is not present.""" 

+

67 

+

68 def __init__(self, *, strict: bool = False, **kwargs: str) -> None: 

+

69 """Store the list of names to rename and pre/post fixs.""" 

+

70 self.targets = kwargs 

+

71 self.strict = strict 

+

72 

+

73 def filter(self, record: logging.LogRecord) -> bool: 

+

74 """Adjust the name of any fields that match a provided list if they exist.""" 

+

75 for new, old in self.targets.items(): 

+

76 if old in record.__dict__: 

+

77 record.__dict__[new] = record.__dict__[old] 

+

78 del record.__dict__[old] 

+

79 elif self.strict: 

+

80 raise RenamerPlugin.FieldNotPresentError(old) 

+

81 return True 

+

82 

+

83 

+

84class RemoverPlugin(BasePlugin): 

+

85 """Plugin that removed fields.""" 

+

86 

+

87 def __init__(self, targets: list[str] | str) -> None: 

+

88 """Store the list of names to remove.""" 

+

89 if isinstance(targets, str): 

+

90 targets = [targets] 

+

91 self.targets = targets 

+

92 

+

93 def filter(self, record: logging.LogRecord) -> bool: 

+

94 """Remove the specified fields.""" 

+

95 for target in self.targets: 

+

96 with contextlib.suppress(KeyError): 

+

97 del record.__dict__[target] 

+

98 return True 

+

99 

+

100 

+

101class NameAdjusterPlugin(BasePlugin): 

+

102 """Plugin that prevents name collisions with splunk field names.""" 

+

103 

+

104 def __init__(self, names: list[str], prefix: str = "", postfix: str = "") -> None: 

+

105 """Store the list of names to rename and pre/post fixs.""" 

+

106 self.names = names 

+

107 self.prefix = prefix 

+

108 self.postfix = postfix 

+

109 

+

110 def filter(self, record: logging.LogRecord) -> bool: 

+

111 """Adjust the name of any fields that match a provided list.""" 

+

112 for name in self.names: 

+

113 if name in record.__dict__: 

+

114 value = record.__dict__[name] 

+

115 del record.__dict__[name] 

+

116 record.__dict__[f"{self.prefix}{name}{self.postfix}"] = value 

+

117 return True 

+

118 

+

119 

+

120class NestedRemoverPlugin(BasePlugin): 

+

121 """Plugin that removes nested fields.""" 

+

122 

+

123 def __init__(self, keys_to_remove: list[str]) -> None: 

+

124 """Store the list of keys to remove.""" 

+

125 self.keys_to_remove = keys_to_remove 

+

126 

+

127 def filter(self, record: logging.LogRecord) -> bool: 

+

128 """Remove the specified fields.""" 

+

129 

+

130 def delete_keys_nested( 

+

131 target: dict, # pyright: ignore[reportMissingTypeArgument] 

+

132 keys_to_remove: list, # pyright: ignore[reportMissingTypeArgument] 

+

133 ) -> dict: # pyright: ignore[reportMissingTypeArgument] 

+

134 for key in keys_to_remove: 

+

135 with contextlib.suppress(KeyError): 

+

136 del target[key] 

+

137 for value in target.values(): 

+

138 if isinstance(value, dict): 

+

139 delete_keys_nested(value, keys_to_remove) 

+

140 return target 

+

141 

+

142 record.__dict__ = delete_keys_nested(record.__dict__, self.keys_to_remove) 

+

143 return True 

+

144 

+

145 

+

146class GitHubActionsPlugin(BasePlugin): 

+

147 """Plugin that will format log messages for actions annotations.""" 

+

148 

+

149 def __init__(self, annotation_level: int) -> None: 

+

150 """Save the annotation level.""" 

+

151 self.annotation_level = annotation_level 

+

152 self.base_attributes = logging.makeLogRecord({}).__dict__ # pragma: no mutate 

+

153 self.attributes_to_exclude = {"annotated"} 

+

154 

+

155 def filter(self, record: logging.LogRecord) -> bool: 

+

156 """Set the actions command to be an annotation if desired.""" 

+

157 if record.levelno < self.annotation_level: 

+

158 return False 

+

159 

+

160 added_attributes = { 

+

161 k: v 

+

162 for k, v in record.__dict__.items() 

+

163 if k not in self.base_attributes and k not in self.attributes_to_exclude 

+

164 } 

+

165 record.added_attributes = added_attributes 

+

166 name = record.levelname.lower() 

+

167 if name == "info": # pragma: no cover 

+

168 name = "notice" 

+

169 record.github_annotation = f"{name}::" 

+

170 

+

171 return True 

+

172 

+

173 def logging_config(self) -> dict[str, dict[str, object]]: 

+

174 """Generate the default logging config for the plugin.""" 

+

175 return { 

+

176 "handlers": { 

+

177 "actions_handler": { 

+

178 "class": "logging.StreamHandler", 

+

179 "filters": ["actions_filter"], 

+

180 "formatter": "actions_formatter", 

+

181 }, 

+

182 }, 

+

183 "filters": { 

+

184 "actions_filter": { 

+

185 "()": AnnotatedFilter, 

+

186 "plugins": [ 

+

187 BasePlugin(), 

+

188 self, 

+

189 ], 

+

190 }, 

+

191 }, 

+

192 "formatters": { 

+

193 "actions_formatter": { 

+

194 "format": "{github_annotation} {message} - {added_attributes}", 

+

195 "style": "{", 

+

196 }, 

+

197 }, 

+

198 "loggers": { 

+

199 "annotated_logger.actions": { 

+

200 "level": "DEBUG", 

+

201 "handlers": [ 

+

202 # This is from the default logging config 

+

203 # "annotated_handler", 

+

204 "actions_handler", 

+

205 ], 

+

206 }, 

+

207 }, 

+

208 } 

+
+ + + From f3977f916f769c760a44d1306fcf193c2cf7ca03 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 11 Dec 2024 21:46:16 +0000 Subject: [PATCH 03/11] Update coverage data --- data.json | 2 +- htmlcov/class_index.html | 4 ++-- htmlcov/function_index.html | 4 ++-- htmlcov/index.html | 4 ++-- htmlcov/status.json | 2 +- htmlcov/z_70983d692f648185_actions_py.html | 4 ++-- htmlcov/z_70983d692f648185_api_py.html | 4 ++-- htmlcov/z_70983d692f648185_calculator_py.html | 4 ++-- htmlcov/z_70983d692f648185_default_py.html | 4 ++-- htmlcov/z_70983d692f648185_invalid_order_py.html | 4 ++-- htmlcov/z_70983d692f648185_logging_config_py.html | 4 ++-- htmlcov/z_beb44c9891d1179a___init___py.html | 4 ++-- htmlcov/z_beb44c9891d1179a_filter_py.html | 4 ++-- htmlcov/z_beb44c9891d1179a_mocks_py.html | 4 ++-- htmlcov/z_beb44c9891d1179a_plugins_py.html | 4 ++-- 15 files changed, 28 insertions(+), 28 deletions(-) diff --git a/data.json b/data.json index 61fdc6c..a937e23 100644 --- a/data.json +++ b/data.json @@ -1 +1 @@ -{"coverage": 100.0, "raw_data": {"meta": {"format": 3, "version": "7.6.4", "timestamp": "2024-12-11T21:45:44.542119", "branch_coverage": false, "show_contexts": false}, "files": {"annotated_logger/__init__.py": {"executed_lines": [1, 3, 4, 5, 6, 7, 8, 9, 10, 24, 26, 27, 29, 32, 34, 35, 36, 37, 38, 39, 40, 41, 44, 45, 47, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 61, 62, 63, 64, 67, 68, 70, 80, 88, 91, 122, 123, 125, 135, 136, 137, 138, 139, 146, 148, 150, 151, 153, 155, 156, 157, 158, 159, 160, 161, 163, 164, 167, 168, 170, 177, 178, 179, 180, 184, 186, 195, 197, 209, 211, 219, 220, 222, 223, 224, 226, 227, 228, 229, 230, 231, 232, 233, 234, 240, 241, 242, 244, 246, 247, 249, 252, 253, 269, 301, 302, 304, 305, 306, 307, 308, 309, 310, 312, 313, 314, 315, 316, 317, 318, 324, 325, 327, 329, 341, 342, 346, 348, 350, 353, 355, 362, 363, 364, 365, 366, 367, 368, 370, 371, 372, 374, 381, 382, 391, 392, 402, 403, 413, 414, 424, 425, 434, 435, 446, 447, 458, 459, 470, 471, 484, 485, 496, 497, 507, 508, 519, 520, 531, 532, 545, 546, 556, 557, 568, 569, 580, 581, 596, 597, 608, 609, 622, 623, 636, 637, 652, 695, 696, 700, 701, 705, 706, 710, 711, 715, 716, 718, 721, 723, 726, 729, 730, 731, 732, 734, 736, 740, 744, 745, 747, 749, 752, 753, 754, 755, 756, 758, 759, 760, 761, 762, 763, 764, 765, 766, 768, 769, 771, 775, 776, 777, 778, 779, 780, 783, 784, 785, 786, 788, 790, 792, 804, 805, 806, 807, 810, 811, 812, 813, 815, 816, 817, 819, 824, 825, 828, 830, 834, 835, 836, 838, 839, 840, 841, 850, 858, 860, 862, 871, 872, 873, 874, 876, 877, 880, 881, 883, 885, 895, 896, 897, 898, 900, 901, 904, 905, 906, 908, 911, 912, 913, 914, 915, 916, 917, 918, 920, 922, 929, 930, 931, 932, 933, 935, 936, 937, 938, 941, 943, 949, 955, 956, 957, 958, 959, 960, 961], "summary": {"covered_lines": 313, "num_statements": 313, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 30], "functions": {"AnnotatedIterator.__init__": {"executed_lines": [135, 136, 137, 138, 139, 146], "summary": {"covered_lines": 6, "num_statements": 6, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedIterator.__iter__": {"executed_lines": [150, 151], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedIterator.__next__": {"executed_lines": [155, 156, 157, 158, 159, 160, 161, 163, 164], "summary": {"covered_lines": 9, "num_statements": 9, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedAdapter.__init__": {"executed_lines": [177, 178, 179, 180, 184], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedAdapter.iterator": {"executed_lines": [195], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedAdapter.process": {"executed_lines": [209], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedAdapter.log": {"executed_lines": [219, 220, 222, 223, 224, 226, 227, 228, 229, 230, 231, 232, 233, 234, 240, 241, 242], "summary": {"covered_lines": 17, "num_statements": 17, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedAdapter.annotate": {"executed_lines": [246, 247, 249], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger.__init__": {"executed_lines": [301, 302, 304, 305, 306, 307, 308, 309, 310, 312, 313, 314, 315, 316, 317, 318, 324, 325, 327], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger._generate_logger": {"executed_lines": [341, 342, 346, 348], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger._action_annotation": {"executed_lines": [353], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger.generate_filter": {"executed_lines": [362, 363, 364, 365, 366, 367, 368, 370, 371, 372, 374], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger.annotate_logs": {"executed_lines": [695, 696, 700, 701, 705, 706, 710, 711, 715, 718, 790], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger.annotate_logs.decorator": {"executed_lines": [721, 723, 734, 736, 740, 744, 788], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger.annotate_logs.decorator.wrap_class": {"executed_lines": [726, 729, 730, 731, 732], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger.annotate_logs.decorator.wrap_function": {"executed_lines": [745, 747, 749, 752, 753, 754, 755, 756, 758, 759, 760, 761, 762, 763, 764, 765, 766, 768, 769, 771, 775, 776, 777, 778, 779, 780, 783, 784, 785, 786], "summary": {"covered_lines": 30, "num_statements": 30, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger._determine_signature_adjustments": {"executed_lines": [804, 805, 806, 807, 810, 811, 812, 813, 815, 816, 817, 819, 860], "summary": {"covered_lines": 13, "num_statements": 13, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger._determine_signature_adjustments.inject_logger": {"executed_lines": [824, 825, 828, 830, 834, 835, 836, 838, 839, 840, 841, 850, 858], "summary": {"covered_lines": 13, "num_statements": 13, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger._inject_by_kwarg": {"executed_lines": [871, 872, 873, 874, 876, 877, 880, 881, 883], "summary": {"covered_lines": 9, "num_statements": 9, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger._inject_by_index": {"executed_lines": [895, 896, 897, 898, 900, 901, 904, 905, 906], "summary": {"covered_lines": 9, "num_statements": 9, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger._check_parameters_for_self_and_cls": {"executed_lines": [911, 912, 913, 914, 915, 916, 917, 918, 920], "summary": {"covered_lines": 9, "num_statements": 9, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger._pick_correct_logger": {"executed_lines": [929, 930, 931, 932, 933, 935, 936, 937, 938, 941, 943], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "_attempt_post_call": {"executed_lines": [955, 956, 957, 958, 959, 960, 961], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 3, 4, 5, 6, 7, 8, 9, 10, 24, 26, 27, 29, 32, 34, 35, 36, 37, 38, 39, 40, 41, 44, 45, 47, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 61, 62, 63, 64, 67, 68, 70, 80, 88, 91, 122, 123, 125, 148, 153, 167, 168, 170, 186, 197, 211, 244, 252, 253, 269, 329, 350, 355, 381, 382, 391, 392, 402, 403, 413, 414, 424, 425, 434, 435, 446, 447, 458, 459, 470, 471, 484, 485, 496, 497, 507, 508, 519, 520, 531, 532, 545, 546, 556, 557, 568, 569, 580, 581, 596, 597, 608, 609, 622, 623, 636, 637, 652, 792, 862, 885, 908, 922, 949], "summary": {"covered_lines": 109, "num_statements": 109, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 30]}}, "classes": {"AnnotatedClass": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedIterator": {"executed_lines": [135, 136, 137, 138, 139, 146, 150, 151, 155, 156, 157, 158, 159, 160, 161, 163, 164], "summary": {"covered_lines": 17, "num_statements": 17, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedAdapter": {"executed_lines": [177, 178, 179, 180, 184, 195, 209, 219, 220, 222, 223, 224, 226, 227, 228, 229, 230, 231, 232, 233, 234, 240, 241, 242, 246, 247, 249], "summary": {"covered_lines": 27, "num_statements": 27, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger": {"executed_lines": [301, 302, 304, 305, 306, 307, 308, 309, 310, 312, 313, 314, 315, 316, 317, 318, 324, 325, 327, 341, 342, 346, 348, 353, 362, 363, 364, 365, 366, 367, 368, 370, 371, 372, 374, 695, 696, 700, 701, 705, 706, 710, 711, 715, 716, 718, 721, 723, 726, 729, 730, 731, 732, 734, 736, 740, 744, 745, 747, 749, 752, 753, 754, 755, 756, 758, 759, 760, 761, 762, 763, 764, 765, 766, 768, 769, 771, 775, 776, 777, 778, 779, 780, 783, 784, 785, 786, 788, 790, 804, 805, 806, 807, 810, 811, 812, 813, 815, 816, 817, 819, 824, 825, 828, 830, 834, 835, 836, 838, 839, 840, 841, 850, 858, 860, 871, 872, 873, 874, 876, 877, 880, 881, 883, 895, 896, 897, 898, 900, 901, 904, 905, 906, 911, 912, 913, 914, 915, 916, 917, 918, 920, 929, 930, 931, 932, 933, 935, 936, 937, 938, 941, 943], "summary": {"covered_lines": 153, "num_statements": 153, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 3, 4, 5, 6, 7, 8, 9, 10, 24, 26, 27, 29, 32, 34, 35, 36, 37, 38, 39, 40, 41, 44, 45, 47, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 61, 62, 63, 64, 67, 68, 70, 80, 88, 91, 122, 123, 125, 148, 153, 167, 168, 170, 186, 197, 211, 244, 252, 253, 269, 329, 350, 355, 381, 382, 391, 392, 402, 403, 413, 414, 424, 425, 434, 435, 446, 447, 458, 459, 470, 471, 484, 485, 496, 497, 507, 508, 519, 520, 531, 532, 545, 546, 556, 557, 568, 569, 580, 581, 596, 597, 608, 609, 622, 623, 636, 637, 652, 792, 862, 885, 908, 922, 949, 955, 956, 957, 958, 959, 960, 961], "summary": {"covered_lines": 116, "num_statements": 116, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 30]}}}, "annotated_logger/filter.py": {"executed_lines": [1, 3, 4, 5, 7, 9, 12, 13, 15, 22, 23, 24, 29, 31, 32, 33, 34, 35, 36, 38, 46, 47, 48, 49, 50, 51, 52, 53, 54, 56, 57, 58], "summary": {"covered_lines": 31, "num_statements": 31, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"AnnotatedFilter.__init__": {"executed_lines": [22, 23, 24, 29], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedFilter._all_annotations": {"executed_lines": [32, 33, 34, 35, 36], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedFilter.filter": {"executed_lines": [46, 47, 48, 49, 50, 51, 52, 53, 54, 56, 57, 58], "summary": {"covered_lines": 12, "num_statements": 12, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 3, 4, 5, 7, 9, 12, 13, 15, 31, 38], "summary": {"covered_lines": 10, "num_statements": 10, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"AnnotatedFilter": {"executed_lines": [22, 23, 24, 29, 32, 33, 34, 35, 36, 46, 47, 48, 49, 50, 51, 52, 53, 54, 56, 57, 58], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 3, 4, 5, 7, 9, 12, 13, 15, 31, 38], "summary": {"covered_lines": 10, "num_statements": 10, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "annotated_logger/mocks.py": {"executed_lines": [1, 3, 4, 6, 7, 10, 11, 13, 23, 24, 25, 26, 27, 28, 29, 31, 33, 34, 35, 36, 37, 38, 39, 41, 43, 44, 45, 47, 48, 49, 50, 51, 52, 53, 58, 61, 63, 65, 66, 67, 68, 72, 73, 74, 75, 76, 78, 79, 80, 82, 83, 84, 87, 90, 91, 92, 97, 98, 100, 101, 102, 104, 108, 111, 117, 125, 126, 130, 131, 135, 136, 138, 139, 140, 141, 142, 143, 144, 145, 147, 149, 156, 159, 160, 162, 163, 191, 193, 194, 195, 197, 199, 201, 203, 204, 205, 207, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 237, 238, 240, 243, 244, 246, 247, 248, 252, 253], "summary": {"covered_lines": 124, "num_statements": 124, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"AssertLogged.__init__": {"executed_lines": [23, 24, 25, 26, 27, 28, 29], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AssertLogged.check": {"executed_lines": [33, 34, 35, 36, 37, 38, 39, 41, 43, 44, 45], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AssertLogged._failed_sort_key": {"executed_lines": [48, 49, 50, 51, 52, 53, 58, 61], "summary": {"covered_lines": 8, "num_statements": 8, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AssertLogged.build_message": {"executed_lines": [65, 66, 67, 68, 72, 73, 74, 75, 76, 78, 79, 80, 82, 83, 84, 87, 90, 91, 92, 97, 98, 100, 101, 102], "summary": {"covered_lines": 24, "num_statements": 24, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AssertLogged._check_record_matches": {"executed_lines": [108, 111, 117, 125, 126, 130, 131, 135, 136, 138, 139, 140, 141, 142, 143, 144, 145, 147, 149, 156], "summary": {"covered_lines": 20, "num_statements": 20, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogMock.__init__": {"executed_lines": [193, 194, 195], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogMock.__getattr__": {"executed_lines": [199], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogMock.handle": {"executed_lines": [203, 204, 205], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogMock.assert_logged": {"executed_lines": [216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "annotated_logger_object": {"executed_lines": [240], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "annotated_logger_mock": {"executed_lines": [246, 247, 248, 252, 253], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 3, 4, 6, 7, 10, 11, 13, 31, 47, 63, 104, 159, 160, 162, 163, 191, 197, 201, 207, 237, 238, 243, 244], "summary": {"covered_lines": 22, "num_statements": 22, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"AssertLogged": {"executed_lines": [23, 24, 25, 26, 27, 28, 29, 33, 34, 35, 36, 37, 38, 39, 41, 43, 44, 45, 48, 49, 50, 51, 52, 53, 58, 61, 65, 66, 67, 68, 72, 73, 74, 75, 76, 78, 79, 80, 82, 83, 84, 87, 90, 91, 92, 97, 98, 100, 101, 102, 108, 111, 117, 125, 126, 130, 131, 135, 136, 138, 139, 140, 141, 142, 143, 144, 145, 147, 149, 156], "summary": {"covered_lines": 70, "num_statements": 70, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogMock": {"executed_lines": [193, 194, 195, 199, 203, 204, 205, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234], "summary": {"covered_lines": 26, "num_statements": 26, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 3, 4, 6, 7, 10, 11, 13, 31, 47, 63, 104, 159, 160, 162, 163, 191, 197, 201, 207, 237, 238, 240, 243, 244, 246, 247, 248, 252, 253], "summary": {"covered_lines": 28, "num_statements": 28, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "annotated_logger/plugins.py": {"executed_lines": [1, 3, 4, 5, 7, 9, 11, 15, 16, 18, 20, 22, 26, 27, 28, 29, 30, 33, 34, 36, 40, 42, 44, 45, 46, 49, 50, 52, 56, 57, 58, 59, 62, 63, 65, 66, 68, 70, 71, 73, 75, 76, 77, 78, 79, 80, 81, 84, 85, 87, 89, 90, 91, 93, 95, 96, 97, 98, 101, 102, 104, 106, 107, 108, 110, 112, 113, 114, 115, 116, 117, 120, 121, 123, 125, 127, 130, 134, 135, 136, 137, 138, 139, 140, 142, 143, 146, 147, 149, 151, 152, 153, 155, 157, 158, 160, 165, 166, 167, 168, 169, 171, 173, 175], "summary": {"covered_lines": 92, "num_statements": 92, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 4}, "missing_lines": [], "excluded_lines": [11, 12, 167, 168], "functions": {"BasePlugin.filter": {"executed_lines": [20], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "BasePlugin.uncaught_exception": {"executed_lines": [26, 27, 28, 29, 30], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "RuntimeAnnotationsPlugin.__init__": {"executed_lines": [40], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "RuntimeAnnotationsPlugin.filter": {"executed_lines": [44, 45, 46], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "RequestsPlugin.uncaught_exception": {"executed_lines": [56, 57, 58, 59], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "RenamerPlugin.__init__": {"executed_lines": [70, 71], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "RenamerPlugin.filter": {"executed_lines": [75, 76, 77, 78, 79, 80, 81], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "RemoverPlugin.__init__": {"executed_lines": [89, 90, 91], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "RemoverPlugin.filter": {"executed_lines": [95, 96, 97, 98], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "NameAdjusterPlugin.__init__": {"executed_lines": [106, 107, 108], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "NameAdjusterPlugin.filter": {"executed_lines": [112, 113, 114, 115, 116, 117], "summary": {"covered_lines": 6, "num_statements": 6, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "NestedRemoverPlugin.__init__": {"executed_lines": [125], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "NestedRemoverPlugin.filter": {"executed_lines": [130, 142, 143], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "NestedRemoverPlugin.filter.delete_keys_nested": {"executed_lines": [134, 135, 136, 137, 138, 139, 140], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "GitHubActionsPlugin.__init__": {"executed_lines": [151, 152, 153], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "GitHubActionsPlugin.filter": {"executed_lines": [157, 158, 160, 165, 166, 167, 168, 169, 171], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [167, 168]}, "GitHubActionsPlugin.logging_config": {"executed_lines": [175], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 3, 4, 5, 7, 9, 11, 15, 16, 18, 22, 33, 34, 36, 42, 49, 50, 52, 62, 63, 65, 66, 68, 73, 84, 85, 87, 93, 101, 102, 104, 110, 120, 121, 123, 127, 146, 147, 149, 155, 173], "summary": {"covered_lines": 31, "num_statements": 31, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [11, 12]}}, "classes": {"BasePlugin": {"executed_lines": [20, 26, 27, 28, 29, 30], "summary": {"covered_lines": 6, "num_statements": 6, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "RuntimeAnnotationsPlugin": {"executed_lines": [40, 44, 45, 46], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "RequestsPlugin": {"executed_lines": [56, 57, 58, 59], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "RenamerPlugin": {"executed_lines": [70, 71, 75, 76, 77, 78, 79, 80, 81], "summary": {"covered_lines": 9, "num_statements": 9, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "RenamerPlugin.FieldNotPresentError": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "RemoverPlugin": {"executed_lines": [89, 90, 91, 95, 96, 97, 98], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "NameAdjusterPlugin": {"executed_lines": [106, 107, 108, 112, 113, 114, 115, 116, 117], "summary": {"covered_lines": 9, "num_statements": 9, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "NestedRemoverPlugin": {"executed_lines": [125, 130, 134, 135, 136, 137, 138, 139, 140, 142, 143], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "GitHubActionsPlugin": {"executed_lines": [151, 152, 153, 157, 158, 160, 165, 166, 167, 168, 169, 171, 175], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [167, 168]}, "": {"executed_lines": [1, 3, 4, 5, 7, 9, 11, 15, 16, 18, 22, 33, 34, 36, 42, 49, 50, 52, 62, 63, 65, 66, 68, 73, 84, 85, 87, 93, 101, 102, 104, 110, 120, 121, 123, 127, 146, 147, 149, 155, 173], "summary": {"covered_lines": 31, "num_statements": 31, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [11, 12]}}}, "example/__init__.py": {"executed_lines": [0], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "example/actions.py": {"executed_lines": [1, 2, 4, 9, 11, 13, 21, 22, 23, 24, 26, 34, 37, 38, 40, 41, 43, 45, 46, 48], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"ActionsExample.first_step": {"executed_lines": [43], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "ActionsExample.second_step": {"executed_lines": [48], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 2, 4, 9, 11, 13, 21, 22, 23, 24, 26, 34, 37, 38, 40, 41, 45, 46], "summary": {"covered_lines": 17, "num_statements": 17, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"ActionsExample": {"executed_lines": [43, 48], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 2, 4, 9, 11, 13, 21, 22, 23, 24, 26, 34, 37, 38, 40, 41, 45, 46], "summary": {"covered_lines": 17, "num_statements": 17, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "example/api.py": {"executed_lines": [1, 3, 4, 6, 7, 9, 10, 13, 15, 18, 28, 31, 32, 33, 35, 37, 39, 40, 42, 43, 44, 45, 47, 48, 50, 51, 52, 53, 54, 56, 57, 59, 60, 61, 62, 64, 66, 68, 69, 70, 71], "summary": {"covered_lines": 40, "num_statements": 40, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"runtime": {"executed_lines": [15], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "ApiClient.pre_call": {"executed_lines": [37], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "ApiClient.check": {"executed_lines": [42, 43, 44, 45], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "ApiClient.check_again": {"executed_lines": [50, 51, 52, 53, 54], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "ApiClient.prepare": {"executed_lines": [59, 60, 61, 62], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "ApiClient.throw_http_exception": {"executed_lines": [68, 69, 70, 71], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 3, 4, 6, 7, 9, 10, 13, 18, 28, 31, 32, 33, 35, 39, 40, 47, 48, 56, 57, 64, 66], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"ApiClient": {"executed_lines": [37, 42, 43, 44, 45, 50, 51, 52, 53, 54, 59, 60, 61, 62, 68, 69, 70, 71], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 3, 4, 6, 7, 9, 10, 13, 15, 18, 28, 31, 32, 33, 35, 39, 40, 47, 48, 56, 57, 64, 66], "summary": {"covered_lines": 22, "num_statements": 22, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "example/calculator.py": {"executed_lines": [1, 3, 5, 6, 14, 15, 18, 20, 23, 39, 41, 44, 45, 51, 57, 58, 59, 61, 63, 64, 65, 66, 68, 75, 77, 84, 85, 86, 87, 88, 89, 90, 94, 100, 102, 106, 107, 108, 111, 112, 114, 120, 124, 126, 128, 129, 133, 134, 136, 138, 139, 143, 144, 145, 146, 147, 149, 150, 153, 155, 159, 162, 163, 164, 165, 167, 168, 170, 171, 173, 174, 176, 177, 178, 179, 180, 182, 183, 185, 187, 188, 190, 192, 193, 195, 196, 199, 200, 201, 202, 204, 205, 209, 212, 213, 214, 215, 217, 218, 219, 221, 222, 223, 225, 226, 227, 231, 232], "summary": {"covered_lines": 106, "num_statements": 106, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"runtime": {"executed_lines": [20], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.__init__": {"executed_lines": [57, 58, 59], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.check_zero_division": {"executed_lines": [63, 64, 65, 66], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.will_pass": {"executed_lines": [75], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.check_prediction_crashed_correctly": {"executed_lines": [84, 85, 86, 87, 88, 89, 90], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.divide": {"executed_lines": [102, 106, 107, 108, 111, 112], "summary": {"covered_lines": 6, "num_statements": 6, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.multiply": {"executed_lines": [124, 126], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.multiply2": {"executed_lines": [133, 134, 136], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.power": {"executed_lines": [143, 144, 145, 146, 147], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.add": {"executed_lines": [153, 155, 159, 162, 163, 164, 165], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.subtract": {"executed_lines": [170, 171], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.inverse": {"executed_lines": [176, 177, 178, 179, 180], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.pemdas_example": {"executed_lines": [185], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.is_odd": {"executed_lines": [190], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.factorial": {"executed_lines": [195, 196, 199, 200, 201, 202], "summary": {"covered_lines": 6, "num_statements": 6, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.sensitive_factorial": {"executed_lines": [209, 212, 213, 214, 215], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.is_math_cool": {"executed_lines": [221, 222, 223], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.sanity_check": {"executed_lines": [231, 232], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 3, 5, 6, 14, 15, 18, 23, 39, 41, 44, 45, 51, 61, 68, 77, 94, 100, 114, 120, 128, 129, 138, 139, 149, 150, 167, 168, 173, 174, 182, 183, 187, 188, 192, 193, 204, 205, 217, 218, 219, 225, 226, 227], "summary": {"covered_lines": 42, "num_statements": 42, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"BoomError": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator": {"executed_lines": [57, 58, 59, 63, 64, 65, 66, 75, 84, 85, 86, 87, 88, 89, 90, 102, 106, 107, 108, 111, 112, 124, 126, 133, 134, 136, 143, 144, 145, 146, 147, 153, 155, 159, 162, 163, 164, 165, 170, 171, 176, 177, 178, 179, 180, 185, 190, 195, 196, 199, 200, 201, 202, 209, 212, 213, 214, 215, 221, 222, 223, 231, 232], "summary": {"covered_lines": 63, "num_statements": 63, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 3, 5, 6, 14, 15, 18, 20, 23, 39, 41, 44, 45, 51, 61, 68, 77, 94, 100, 114, 120, 128, 129, 138, 139, 149, 150, 167, 168, 173, 174, 182, 183, 187, 188, 192, 193, 204, 205, 217, 218, 219, 225, 226, 227], "summary": {"covered_lines": 43, "num_statements": 43, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "example/default.py": {"executed_lines": [1, 2, 6, 8, 11, 12, 14, 15, 17, 19, 20, 27, 28, 30, 31, 33, 34, 38, 40, 41, 43, 44, 48, 50, 51, 52, 53, 55, 56, 60, 61, 65, 66, 70, 72, 73, 74, 75, 77, 78, 87, 88, 89, 92, 93, 97, 98, 101, 102, 106, 108, 109, 110, 111], "summary": {"covered_lines": 53, "num_statements": 53, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"DefaultExample.foo": {"executed_lines": [17], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "DefaultExample.var_args": {"executed_lines": [27, 28, 30, 31], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "DefaultExample.var_kwargs": {"executed_lines": [38, 40, 41], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "DefaultExample.var_args_and_kwargs": {"executed_lines": [48, 50, 51, 52, 53], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "DefaultExample.var_args_and_kwargs_provided_outer": {"executed_lines": [60, 61], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "DefaultExample.var_args_and_kwargs_provided": {"executed_lines": [70, 72, 73, 74, 75], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "DefaultExample.positional_only": {"executed_lines": [87, 88, 89], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "var_args_and_kwargs_provided_outer": {"executed_lines": [97, 98], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "var_args_and_kwargs_provided": {"executed_lines": [106, 108, 109, 110, 111], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 2, 6, 8, 11, 12, 14, 15, 19, 20, 33, 34, 43, 44, 55, 56, 65, 66, 77, 78, 92, 93, 101, 102], "summary": {"covered_lines": 23, "num_statements": 23, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"DefaultExample": {"executed_lines": [17, 27, 28, 30, 31, 38, 40, 41, 48, 50, 51, 52, 53, 60, 61, 70, 72, 73, 74, 75, 87, 88, 89], "summary": {"covered_lines": 23, "num_statements": 23, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 2, 6, 8, 11, 12, 14, 15, 19, 20, 33, 34, 43, 44, 55, 56, 65, 66, 77, 78, 92, 93, 97, 98, 101, 102, 106, 108, 109, 110, 111], "summary": {"covered_lines": 30, "num_statements": 30, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "example/invalid_order.py": {"executed_lines": [1, 5, 7, 10, 11], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1}, "missing_lines": [], "excluded_lines": [13], "functions": {"wrong_order": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1}, "missing_lines": [], "excluded_lines": [13]}, "": {"executed_lines": [1, 5, 7, 10, 11], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"": {"executed_lines": [1, 5, 7, 10, 11], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1}, "missing_lines": [], "excluded_lines": [13]}}}, "example/logging_config.py": {"executed_lines": [1, 2, 4, 5, 35, 151, 153, 156, 171, 173, 180, 182, 183, 186, 188, 189, 190, 191, 194, 195, 197, 198, 199, 200, 203, 207, 209, 210, 211, 212, 215, 221, 223, 224, 225, 226, 227], "summary": {"covered_lines": 37, "num_statements": 37, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"runtime": {"executed_lines": [153], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "make_some_logs": {"executed_lines": [188, 189, 190, 191], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "make_some_annotated_logs": {"executed_lines": [197, 198, 199, 200], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "make_some_weird_logs": {"executed_lines": [209, 210, 211, 212], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "log_really_long_message": {"executed_lines": [223, 224, 225, 226, 227], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 2, 4, 5, 35, 151, 156, 171, 173, 180, 182, 183, 186, 194, 195, 203, 207, 215, 221], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"": {"executed_lines": [1, 2, 4, 5, 35, 151, 153, 156, 171, 173, 180, 182, 183, 186, 188, 189, 190, 191, 194, 195, 197, 198, 199, 200, 203, 207, 209, 210, 211, 212, 215, 221, 223, 224, 225, 226, 227], "summary": {"covered_lines": 37, "num_statements": 37, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}}, "totals": {"covered_lines": 820, "num_statements": 820, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 7}}, "coverage_path": "."} \ No newline at end of file +{"coverage": 100.0, "raw_data": {"meta": {"format": 3, "version": "7.6.4", "timestamp": "2024-12-11T21:46:14.785613", "branch_coverage": false, "show_contexts": false}, "files": {"annotated_logger/__init__.py": {"executed_lines": [1, 3, 4, 5, 6, 7, 8, 9, 10, 24, 26, 27, 29, 32, 34, 35, 36, 37, 38, 39, 40, 41, 44, 45, 47, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 61, 62, 63, 64, 67, 68, 70, 80, 88, 91, 122, 123, 125, 135, 136, 137, 138, 139, 146, 148, 150, 151, 153, 155, 156, 157, 158, 159, 160, 161, 163, 164, 167, 168, 170, 177, 178, 179, 180, 184, 186, 195, 197, 209, 211, 219, 220, 222, 223, 224, 226, 227, 228, 229, 230, 231, 232, 233, 234, 240, 241, 242, 244, 246, 247, 249, 252, 253, 269, 301, 302, 304, 305, 306, 307, 308, 309, 310, 312, 313, 314, 315, 316, 317, 318, 324, 325, 327, 329, 341, 342, 346, 348, 350, 353, 355, 362, 363, 364, 365, 366, 367, 368, 370, 371, 372, 374, 381, 382, 391, 392, 402, 403, 413, 414, 424, 425, 434, 435, 446, 447, 458, 459, 470, 471, 484, 485, 496, 497, 507, 508, 519, 520, 531, 532, 545, 546, 556, 557, 568, 569, 580, 581, 596, 597, 608, 609, 622, 623, 636, 637, 652, 695, 696, 700, 701, 705, 706, 710, 711, 715, 716, 718, 721, 723, 726, 729, 730, 731, 732, 734, 736, 740, 744, 745, 747, 749, 752, 753, 754, 755, 756, 758, 759, 760, 761, 762, 763, 764, 765, 766, 768, 769, 771, 775, 776, 777, 778, 779, 780, 783, 784, 785, 786, 788, 790, 792, 804, 805, 806, 807, 810, 811, 812, 813, 815, 816, 817, 819, 824, 825, 828, 830, 834, 835, 836, 838, 839, 840, 841, 850, 858, 860, 862, 871, 872, 873, 874, 876, 877, 880, 881, 883, 885, 895, 896, 897, 898, 900, 901, 904, 905, 906, 908, 911, 912, 913, 914, 915, 916, 917, 918, 920, 922, 929, 930, 931, 932, 933, 935, 936, 937, 938, 941, 943, 949, 955, 956, 957, 958, 959, 960, 961], "summary": {"covered_lines": 313, "num_statements": 313, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 30], "functions": {"AnnotatedIterator.__init__": {"executed_lines": [135, 136, 137, 138, 139, 146], "summary": {"covered_lines": 6, "num_statements": 6, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedIterator.__iter__": {"executed_lines": [150, 151], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedIterator.__next__": {"executed_lines": [155, 156, 157, 158, 159, 160, 161, 163, 164], "summary": {"covered_lines": 9, "num_statements": 9, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedAdapter.__init__": {"executed_lines": [177, 178, 179, 180, 184], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedAdapter.iterator": {"executed_lines": [195], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedAdapter.process": {"executed_lines": [209], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedAdapter.log": {"executed_lines": [219, 220, 222, 223, 224, 226, 227, 228, 229, 230, 231, 232, 233, 234, 240, 241, 242], "summary": {"covered_lines": 17, "num_statements": 17, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedAdapter.annotate": {"executed_lines": [246, 247, 249], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger.__init__": {"executed_lines": [301, 302, 304, 305, 306, 307, 308, 309, 310, 312, 313, 314, 315, 316, 317, 318, 324, 325, 327], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger._generate_logger": {"executed_lines": [341, 342, 346, 348], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger._action_annotation": {"executed_lines": [353], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger.generate_filter": {"executed_lines": [362, 363, 364, 365, 366, 367, 368, 370, 371, 372, 374], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger.annotate_logs": {"executed_lines": [695, 696, 700, 701, 705, 706, 710, 711, 715, 718, 790], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger.annotate_logs.decorator": {"executed_lines": [721, 723, 734, 736, 740, 744, 788], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger.annotate_logs.decorator.wrap_class": {"executed_lines": [726, 729, 730, 731, 732], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger.annotate_logs.decorator.wrap_function": {"executed_lines": [745, 747, 749, 752, 753, 754, 755, 756, 758, 759, 760, 761, 762, 763, 764, 765, 766, 768, 769, 771, 775, 776, 777, 778, 779, 780, 783, 784, 785, 786], "summary": {"covered_lines": 30, "num_statements": 30, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger._determine_signature_adjustments": {"executed_lines": [804, 805, 806, 807, 810, 811, 812, 813, 815, 816, 817, 819, 860], "summary": {"covered_lines": 13, "num_statements": 13, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger._determine_signature_adjustments.inject_logger": {"executed_lines": [824, 825, 828, 830, 834, 835, 836, 838, 839, 840, 841, 850, 858], "summary": {"covered_lines": 13, "num_statements": 13, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger._inject_by_kwarg": {"executed_lines": [871, 872, 873, 874, 876, 877, 880, 881, 883], "summary": {"covered_lines": 9, "num_statements": 9, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger._inject_by_index": {"executed_lines": [895, 896, 897, 898, 900, 901, 904, 905, 906], "summary": {"covered_lines": 9, "num_statements": 9, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger._check_parameters_for_self_and_cls": {"executed_lines": [911, 912, 913, 914, 915, 916, 917, 918, 920], "summary": {"covered_lines": 9, "num_statements": 9, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger._pick_correct_logger": {"executed_lines": [929, 930, 931, 932, 933, 935, 936, 937, 938, 941, 943], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "_attempt_post_call": {"executed_lines": [955, 956, 957, 958, 959, 960, 961], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 3, 4, 5, 6, 7, 8, 9, 10, 24, 26, 27, 29, 32, 34, 35, 36, 37, 38, 39, 40, 41, 44, 45, 47, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 61, 62, 63, 64, 67, 68, 70, 80, 88, 91, 122, 123, 125, 148, 153, 167, 168, 170, 186, 197, 211, 244, 252, 253, 269, 329, 350, 355, 381, 382, 391, 392, 402, 403, 413, 414, 424, 425, 434, 435, 446, 447, 458, 459, 470, 471, 484, 485, 496, 497, 507, 508, 519, 520, 531, 532, 545, 546, 556, 557, 568, 569, 580, 581, 596, 597, 608, 609, 622, 623, 636, 637, 652, 792, 862, 885, 908, 922, 949], "summary": {"covered_lines": 109, "num_statements": 109, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 30]}}, "classes": {"AnnotatedClass": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedIterator": {"executed_lines": [135, 136, 137, 138, 139, 146, 150, 151, 155, 156, 157, 158, 159, 160, 161, 163, 164], "summary": {"covered_lines": 17, "num_statements": 17, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedAdapter": {"executed_lines": [177, 178, 179, 180, 184, 195, 209, 219, 220, 222, 223, 224, 226, 227, 228, 229, 230, 231, 232, 233, 234, 240, 241, 242, 246, 247, 249], "summary": {"covered_lines": 27, "num_statements": 27, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogger": {"executed_lines": [301, 302, 304, 305, 306, 307, 308, 309, 310, 312, 313, 314, 315, 316, 317, 318, 324, 325, 327, 341, 342, 346, 348, 353, 362, 363, 364, 365, 366, 367, 368, 370, 371, 372, 374, 695, 696, 700, 701, 705, 706, 710, 711, 715, 716, 718, 721, 723, 726, 729, 730, 731, 732, 734, 736, 740, 744, 745, 747, 749, 752, 753, 754, 755, 756, 758, 759, 760, 761, 762, 763, 764, 765, 766, 768, 769, 771, 775, 776, 777, 778, 779, 780, 783, 784, 785, 786, 788, 790, 804, 805, 806, 807, 810, 811, 812, 813, 815, 816, 817, 819, 824, 825, 828, 830, 834, 835, 836, 838, 839, 840, 841, 850, 858, 860, 871, 872, 873, 874, 876, 877, 880, 881, 883, 895, 896, 897, 898, 900, 901, 904, 905, 906, 911, 912, 913, 914, 915, 916, 917, 918, 920, 929, 930, 931, 932, 933, 935, 936, 937, 938, 941, 943], "summary": {"covered_lines": 153, "num_statements": 153, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 3, 4, 5, 6, 7, 8, 9, 10, 24, 26, 27, 29, 32, 34, 35, 36, 37, 38, 39, 40, 41, 44, 45, 47, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 61, 62, 63, 64, 67, 68, 70, 80, 88, 91, 122, 123, 125, 148, 153, 167, 168, 170, 186, 197, 211, 244, 252, 253, 269, 329, 350, 355, 381, 382, 391, 392, 402, 403, 413, 414, 424, 425, 434, 435, 446, 447, 458, 459, 470, 471, 484, 485, 496, 497, 507, 508, 519, 520, 531, 532, 545, 546, 556, 557, 568, 569, 580, 581, 596, 597, 608, 609, 622, 623, 636, 637, 652, 792, 862, 885, 908, 922, 949, 955, 956, 957, 958, 959, 960, 961], "summary": {"covered_lines": 116, "num_statements": 116, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [29, 30]}}}, "annotated_logger/filter.py": {"executed_lines": [1, 3, 4, 5, 7, 9, 12, 13, 15, 22, 23, 24, 29, 31, 32, 33, 34, 35, 36, 38, 46, 47, 48, 49, 50, 51, 52, 53, 54, 56, 57, 58], "summary": {"covered_lines": 31, "num_statements": 31, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"AnnotatedFilter.__init__": {"executed_lines": [22, 23, 24, 29], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedFilter._all_annotations": {"executed_lines": [32, 33, 34, 35, 36], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedFilter.filter": {"executed_lines": [46, 47, 48, 49, 50, 51, 52, 53, 54, 56, 57, 58], "summary": {"covered_lines": 12, "num_statements": 12, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 3, 4, 5, 7, 9, 12, 13, 15, 31, 38], "summary": {"covered_lines": 10, "num_statements": 10, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"AnnotatedFilter": {"executed_lines": [22, 23, 24, 29, 32, 33, 34, 35, 36, 46, 47, 48, 49, 50, 51, 52, 53, 54, 56, 57, 58], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 3, 4, 5, 7, 9, 12, 13, 15, 31, 38], "summary": {"covered_lines": 10, "num_statements": 10, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "annotated_logger/mocks.py": {"executed_lines": [1, 3, 4, 6, 7, 10, 11, 13, 23, 24, 25, 26, 27, 28, 29, 31, 33, 34, 35, 36, 37, 38, 39, 41, 43, 44, 45, 47, 48, 49, 50, 51, 52, 53, 58, 61, 63, 65, 66, 67, 68, 72, 73, 74, 75, 76, 78, 79, 80, 82, 83, 84, 87, 90, 91, 92, 97, 98, 100, 101, 102, 104, 108, 111, 117, 125, 126, 130, 131, 135, 136, 138, 139, 140, 141, 142, 143, 144, 145, 147, 149, 156, 159, 160, 162, 163, 191, 193, 194, 195, 197, 199, 201, 203, 204, 205, 207, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 237, 238, 240, 243, 244, 246, 247, 248, 252, 253], "summary": {"covered_lines": 124, "num_statements": 124, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"AssertLogged.__init__": {"executed_lines": [23, 24, 25, 26, 27, 28, 29], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AssertLogged.check": {"executed_lines": [33, 34, 35, 36, 37, 38, 39, 41, 43, 44, 45], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AssertLogged._failed_sort_key": {"executed_lines": [48, 49, 50, 51, 52, 53, 58, 61], "summary": {"covered_lines": 8, "num_statements": 8, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AssertLogged.build_message": {"executed_lines": [65, 66, 67, 68, 72, 73, 74, 75, 76, 78, 79, 80, 82, 83, 84, 87, 90, 91, 92, 97, 98, 100, 101, 102], "summary": {"covered_lines": 24, "num_statements": 24, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AssertLogged._check_record_matches": {"executed_lines": [108, 111, 117, 125, 126, 130, 131, 135, 136, 138, 139, 140, 141, 142, 143, 144, 145, 147, 149, 156], "summary": {"covered_lines": 20, "num_statements": 20, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogMock.__init__": {"executed_lines": [193, 194, 195], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogMock.__getattr__": {"executed_lines": [199], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogMock.handle": {"executed_lines": [203, 204, 205], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogMock.assert_logged": {"executed_lines": [216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "annotated_logger_object": {"executed_lines": [240], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "annotated_logger_mock": {"executed_lines": [246, 247, 248, 252, 253], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 3, 4, 6, 7, 10, 11, 13, 31, 47, 63, 104, 159, 160, 162, 163, 191, 197, 201, 207, 237, 238, 243, 244], "summary": {"covered_lines": 22, "num_statements": 22, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"AssertLogged": {"executed_lines": [23, 24, 25, 26, 27, 28, 29, 33, 34, 35, 36, 37, 38, 39, 41, 43, 44, 45, 48, 49, 50, 51, 52, 53, 58, 61, 65, 66, 67, 68, 72, 73, 74, 75, 76, 78, 79, 80, 82, 83, 84, 87, 90, 91, 92, 97, 98, 100, 101, 102, 108, 111, 117, 125, 126, 130, 131, 135, 136, 138, 139, 140, 141, 142, 143, 144, 145, 147, 149, 156], "summary": {"covered_lines": 70, "num_statements": 70, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "AnnotatedLogMock": {"executed_lines": [193, 194, 195, 199, 203, 204, 205, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234], "summary": {"covered_lines": 26, "num_statements": 26, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 3, 4, 6, 7, 10, 11, 13, 31, 47, 63, 104, 159, 160, 162, 163, 191, 197, 201, 207, 237, 238, 240, 243, 244, 246, 247, 248, 252, 253], "summary": {"covered_lines": 28, "num_statements": 28, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "annotated_logger/plugins.py": {"executed_lines": [1, 3, 4, 5, 7, 9, 11, 15, 16, 18, 20, 22, 26, 27, 28, 29, 30, 33, 34, 36, 40, 42, 44, 45, 46, 49, 50, 52, 56, 57, 58, 59, 62, 63, 65, 66, 68, 70, 71, 73, 75, 76, 77, 78, 79, 80, 81, 84, 85, 87, 89, 90, 91, 93, 95, 96, 97, 98, 101, 102, 104, 106, 107, 108, 110, 112, 113, 114, 115, 116, 117, 120, 121, 123, 125, 127, 130, 134, 135, 136, 137, 138, 139, 140, 142, 143, 146, 147, 149, 151, 152, 153, 155, 157, 158, 160, 165, 166, 167, 168, 169, 171, 173, 175], "summary": {"covered_lines": 92, "num_statements": 92, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 4}, "missing_lines": [], "excluded_lines": [11, 12, 167, 168], "functions": {"BasePlugin.filter": {"executed_lines": [20], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "BasePlugin.uncaught_exception": {"executed_lines": [26, 27, 28, 29, 30], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "RuntimeAnnotationsPlugin.__init__": {"executed_lines": [40], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "RuntimeAnnotationsPlugin.filter": {"executed_lines": [44, 45, 46], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "RequestsPlugin.uncaught_exception": {"executed_lines": [56, 57, 58, 59], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "RenamerPlugin.__init__": {"executed_lines": [70, 71], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "RenamerPlugin.filter": {"executed_lines": [75, 76, 77, 78, 79, 80, 81], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "RemoverPlugin.__init__": {"executed_lines": [89, 90, 91], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "RemoverPlugin.filter": {"executed_lines": [95, 96, 97, 98], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "NameAdjusterPlugin.__init__": {"executed_lines": [106, 107, 108], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "NameAdjusterPlugin.filter": {"executed_lines": [112, 113, 114, 115, 116, 117], "summary": {"covered_lines": 6, "num_statements": 6, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "NestedRemoverPlugin.__init__": {"executed_lines": [125], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "NestedRemoverPlugin.filter": {"executed_lines": [130, 142, 143], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "NestedRemoverPlugin.filter.delete_keys_nested": {"executed_lines": [134, 135, 136, 137, 138, 139, 140], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "GitHubActionsPlugin.__init__": {"executed_lines": [151, 152, 153], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "GitHubActionsPlugin.filter": {"executed_lines": [157, 158, 160, 165, 166, 167, 168, 169, 171], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [167, 168]}, "GitHubActionsPlugin.logging_config": {"executed_lines": [175], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 3, 4, 5, 7, 9, 11, 15, 16, 18, 22, 33, 34, 36, 42, 49, 50, 52, 62, 63, 65, 66, 68, 73, 84, 85, 87, 93, 101, 102, 104, 110, 120, 121, 123, 127, 146, 147, 149, 155, 173], "summary": {"covered_lines": 31, "num_statements": 31, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [11, 12]}}, "classes": {"BasePlugin": {"executed_lines": [20, 26, 27, 28, 29, 30], "summary": {"covered_lines": 6, "num_statements": 6, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "RuntimeAnnotationsPlugin": {"executed_lines": [40, 44, 45, 46], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "RequestsPlugin": {"executed_lines": [56, 57, 58, 59], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "RenamerPlugin": {"executed_lines": [70, 71, 75, 76, 77, 78, 79, 80, 81], "summary": {"covered_lines": 9, "num_statements": 9, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "RenamerPlugin.FieldNotPresentError": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "RemoverPlugin": {"executed_lines": [89, 90, 91, 95, 96, 97, 98], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "NameAdjusterPlugin": {"executed_lines": [106, 107, 108, 112, 113, 114, 115, 116, 117], "summary": {"covered_lines": 9, "num_statements": 9, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "NestedRemoverPlugin": {"executed_lines": [125, 130, 134, 135, 136, 137, 138, 139, 140, 142, 143], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "GitHubActionsPlugin": {"executed_lines": [151, 152, 153, 157, 158, 160, 165, 166, 167, 168, 169, 171, 175], "summary": {"covered_lines": 11, "num_statements": 11, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [167, 168]}, "": {"executed_lines": [1, 3, 4, 5, 7, 9, 11, 15, 16, 18, 22, 33, 34, 36, 42, 49, 50, 52, 62, 63, 65, 66, 68, 73, 84, 85, 87, 93, 101, 102, 104, 110, 120, 121, 123, 127, 146, 147, 149, 155, 173], "summary": {"covered_lines": 31, "num_statements": 31, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 2}, "missing_lines": [], "excluded_lines": [11, 12]}}}, "example/__init__.py": {"executed_lines": [0], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "example/actions.py": {"executed_lines": [1, 2, 4, 9, 11, 13, 21, 22, 23, 24, 26, 34, 37, 38, 40, 41, 43, 45, 46, 48], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"ActionsExample.first_step": {"executed_lines": [43], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "ActionsExample.second_step": {"executed_lines": [48], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 2, 4, 9, 11, 13, 21, 22, 23, 24, 26, 34, 37, 38, 40, 41, 45, 46], "summary": {"covered_lines": 17, "num_statements": 17, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"ActionsExample": {"executed_lines": [43, 48], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 2, 4, 9, 11, 13, 21, 22, 23, 24, 26, 34, 37, 38, 40, 41, 45, 46], "summary": {"covered_lines": 17, "num_statements": 17, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "example/api.py": {"executed_lines": [1, 3, 4, 6, 7, 9, 10, 13, 15, 18, 28, 31, 32, 33, 35, 37, 39, 40, 42, 43, 44, 45, 47, 48, 50, 51, 52, 53, 54, 56, 57, 59, 60, 61, 62, 64, 66, 68, 69, 70, 71], "summary": {"covered_lines": 40, "num_statements": 40, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"runtime": {"executed_lines": [15], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "ApiClient.pre_call": {"executed_lines": [37], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "ApiClient.check": {"executed_lines": [42, 43, 44, 45], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "ApiClient.check_again": {"executed_lines": [50, 51, 52, 53, 54], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "ApiClient.prepare": {"executed_lines": [59, 60, 61, 62], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "ApiClient.throw_http_exception": {"executed_lines": [68, 69, 70, 71], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 3, 4, 6, 7, 9, 10, 13, 18, 28, 31, 32, 33, 35, 39, 40, 47, 48, 56, 57, 64, 66], "summary": {"covered_lines": 21, "num_statements": 21, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"ApiClient": {"executed_lines": [37, 42, 43, 44, 45, 50, 51, 52, 53, 54, 59, 60, 61, 62, 68, 69, 70, 71], "summary": {"covered_lines": 18, "num_statements": 18, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 3, 4, 6, 7, 9, 10, 13, 15, 18, 28, 31, 32, 33, 35, 39, 40, 47, 48, 56, 57, 64, 66], "summary": {"covered_lines": 22, "num_statements": 22, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "example/calculator.py": {"executed_lines": [1, 3, 5, 6, 14, 15, 18, 20, 23, 39, 41, 44, 45, 51, 57, 58, 59, 61, 63, 64, 65, 66, 68, 75, 77, 84, 85, 86, 87, 88, 89, 90, 94, 100, 102, 106, 107, 108, 111, 112, 114, 120, 124, 126, 128, 129, 133, 134, 136, 138, 139, 143, 144, 145, 146, 147, 149, 150, 153, 155, 159, 162, 163, 164, 165, 167, 168, 170, 171, 173, 174, 176, 177, 178, 179, 180, 182, 183, 185, 187, 188, 190, 192, 193, 195, 196, 199, 200, 201, 202, 204, 205, 209, 212, 213, 214, 215, 217, 218, 219, 221, 222, 223, 225, 226, 227, 231, 232], "summary": {"covered_lines": 106, "num_statements": 106, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"runtime": {"executed_lines": [20], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.__init__": {"executed_lines": [57, 58, 59], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.check_zero_division": {"executed_lines": [63, 64, 65, 66], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.will_pass": {"executed_lines": [75], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.check_prediction_crashed_correctly": {"executed_lines": [84, 85, 86, 87, 88, 89, 90], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.divide": {"executed_lines": [102, 106, 107, 108, 111, 112], "summary": {"covered_lines": 6, "num_statements": 6, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.multiply": {"executed_lines": [124, 126], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.multiply2": {"executed_lines": [133, 134, 136], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.power": {"executed_lines": [143, 144, 145, 146, 147], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.add": {"executed_lines": [153, 155, 159, 162, 163, 164, 165], "summary": {"covered_lines": 7, "num_statements": 7, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.subtract": {"executed_lines": [170, 171], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.inverse": {"executed_lines": [176, 177, 178, 179, 180], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.pemdas_example": {"executed_lines": [185], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.is_odd": {"executed_lines": [190], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.factorial": {"executed_lines": [195, 196, 199, 200, 201, 202], "summary": {"covered_lines": 6, "num_statements": 6, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.sensitive_factorial": {"executed_lines": [209, 212, 213, 214, 215], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.is_math_cool": {"executed_lines": [221, 222, 223], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator.sanity_check": {"executed_lines": [231, 232], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 3, 5, 6, 14, 15, 18, 23, 39, 41, 44, 45, 51, 61, 68, 77, 94, 100, 114, 120, 128, 129, 138, 139, 149, 150, 167, 168, 173, 174, 182, 183, 187, 188, 192, 193, 204, 205, 217, 218, 219, 225, 226, 227], "summary": {"covered_lines": 42, "num_statements": 42, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"BoomError": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "Calculator": {"executed_lines": [57, 58, 59, 63, 64, 65, 66, 75, 84, 85, 86, 87, 88, 89, 90, 102, 106, 107, 108, 111, 112, 124, 126, 133, 134, 136, 143, 144, 145, 146, 147, 153, 155, 159, 162, 163, 164, 165, 170, 171, 176, 177, 178, 179, 180, 185, 190, 195, 196, 199, 200, 201, 202, 209, 212, 213, 214, 215, 221, 222, 223, 231, 232], "summary": {"covered_lines": 63, "num_statements": 63, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 3, 5, 6, 14, 15, 18, 20, 23, 39, 41, 44, 45, 51, 61, 68, 77, 94, 100, 114, 120, 128, 129, 138, 139, 149, 150, 167, 168, 173, 174, 182, 183, 187, 188, 192, 193, 204, 205, 217, 218, 219, 225, 226, 227], "summary": {"covered_lines": 43, "num_statements": 43, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "example/default.py": {"executed_lines": [1, 2, 6, 8, 11, 12, 14, 15, 17, 19, 20, 27, 28, 30, 31, 33, 34, 38, 40, 41, 43, 44, 48, 50, 51, 52, 53, 55, 56, 60, 61, 65, 66, 70, 72, 73, 74, 75, 77, 78, 87, 88, 89, 92, 93, 97, 98, 101, 102, 106, 108, 109, 110, 111], "summary": {"covered_lines": 53, "num_statements": 53, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"DefaultExample.foo": {"executed_lines": [17], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "DefaultExample.var_args": {"executed_lines": [27, 28, 30, 31], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "DefaultExample.var_kwargs": {"executed_lines": [38, 40, 41], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "DefaultExample.var_args_and_kwargs": {"executed_lines": [48, 50, 51, 52, 53], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "DefaultExample.var_args_and_kwargs_provided_outer": {"executed_lines": [60, 61], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "DefaultExample.var_args_and_kwargs_provided": {"executed_lines": [70, 72, 73, 74, 75], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "DefaultExample.positional_only": {"executed_lines": [87, 88, 89], "summary": {"covered_lines": 3, "num_statements": 3, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "var_args_and_kwargs_provided_outer": {"executed_lines": [97, 98], "summary": {"covered_lines": 2, "num_statements": 2, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "var_args_and_kwargs_provided": {"executed_lines": [106, 108, 109, 110, 111], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 2, 6, 8, 11, 12, 14, 15, 19, 20, 33, 34, 43, 44, 55, 56, 65, 66, 77, 78, 92, 93, 101, 102], "summary": {"covered_lines": 23, "num_statements": 23, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"DefaultExample": {"executed_lines": [17, 27, 28, 30, 31, 38, 40, 41, 48, 50, 51, 52, 53, 60, 61, 70, 72, 73, 74, 75, 87, 88, 89], "summary": {"covered_lines": 23, "num_statements": 23, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 2, 6, 8, 11, 12, 14, 15, 19, 20, 33, 34, 43, 44, 55, 56, 65, 66, 77, 78, 92, 93, 97, 98, 101, 102, 106, 108, 109, 110, 111], "summary": {"covered_lines": 30, "num_statements": 30, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}, "example/invalid_order.py": {"executed_lines": [1, 5, 7, 10, 11], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1}, "missing_lines": [], "excluded_lines": [13], "functions": {"wrong_order": {"executed_lines": [], "summary": {"covered_lines": 0, "num_statements": 0, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1}, "missing_lines": [], "excluded_lines": [13]}, "": {"executed_lines": [1, 5, 7, 10, 11], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"": {"executed_lines": [1, 5, 7, 10, 11], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 1}, "missing_lines": [], "excluded_lines": [13]}}}, "example/logging_config.py": {"executed_lines": [1, 2, 4, 5, 35, 151, 153, 156, 171, 173, 180, 182, 183, 186, 188, 189, 190, 191, 194, 195, 197, 198, 199, 200, 203, 207, 209, 210, 211, 212, 215, 221, 223, 224, 225, 226, 227], "summary": {"covered_lines": 37, "num_statements": 37, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": [], "functions": {"runtime": {"executed_lines": [153], "summary": {"covered_lines": 1, "num_statements": 1, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "make_some_logs": {"executed_lines": [188, 189, 190, 191], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "make_some_annotated_logs": {"executed_lines": [197, 198, 199, 200], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "make_some_weird_logs": {"executed_lines": [209, 210, 211, 212], "summary": {"covered_lines": 4, "num_statements": 4, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "log_really_long_message": {"executed_lines": [223, 224, 225, 226, 227], "summary": {"covered_lines": 5, "num_statements": 5, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}, "": {"executed_lines": [1, 2, 4, 5, 35, 151, 156, 171, 173, 180, 182, 183, 186, 194, 195, 203, 207, 215, 221], "summary": {"covered_lines": 19, "num_statements": 19, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}, "classes": {"": {"executed_lines": [1, 2, 4, 5, 35, 151, 153, 156, 171, 173, 180, 182, 183, 186, 188, 189, 190, 191, 194, 195, 197, 198, 199, 200, 203, 207, 209, 210, 211, 212, 215, 221, 223, 224, 225, 226, 227], "summary": {"covered_lines": 37, "num_statements": 37, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 0}, "missing_lines": [], "excluded_lines": []}}}}, "totals": {"covered_lines": 820, "num_statements": 820, "percent_covered": 100.0, "percent_covered_display": "100", "missing_lines": 0, "excluded_lines": 7}}, "coverage_path": "."} \ No newline at end of file diff --git a/htmlcov/class_index.html b/htmlcov/class_index.html index b49b2f7..8d7d5bc 100644 --- a/htmlcov/class_index.html +++ b/htmlcov/class_index.html @@ -55,7 +55,7 @@

coverage.py v7.6.4, - created at 2024-12-11 21:45 +0000 + created at 2024-12-11 21:46 +0000

@@ -317,7 +317,7 @@

coverage.py v7.6.4, - created at 2024-12-11 21:45 +0000 + created at 2024-12-11 21:46 +0000