lf-releng-project-reporting 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (334) hide show
  1. lf_releng_project_reporting-0.1.0/.gitignore +103 -0
  2. lf_releng_project_reporting-0.1.0/LICENSE +1 -0
  3. lf_releng_project_reporting-0.1.0/PKG-INFO +351 -0
  4. lf_releng_project_reporting-0.1.0/README.md +302 -0
  5. lf_releng_project_reporting-0.1.0/SETUP.md +411 -0
  6. lf_releng_project_reporting-0.1.0/config/README.md +92 -0
  7. lf_releng_project_reporting-0.1.0/config/default.yaml +335 -0
  8. lf_releng_project_reporting-0.1.0/config/organizational_domains.yaml +36 -0
  9. lf_releng_project_reporting-0.1.0/config/test-project.yaml +14 -0
  10. lf_releng_project_reporting-0.1.0/docs/ARTIFACT_ARCHIVAL_SETUP.md +454 -0
  11. lf_releng_project_reporting-0.1.0/docs/CHANGELOG_GITHUB_TOKEN_ENV.md +239 -0
  12. lf_releng_project_reporting-0.1.0/docs/CICD_TABLE_FIX.md +238 -0
  13. lf_releng_project_reporting-0.1.0/docs/CI_CD_INTEGRATION.md +915 -0
  14. lf_releng_project_reporting-0.1.0/docs/CODE_CLEANUP_REPORT.md +326 -0
  15. lf_releng_project_reporting-0.1.0/docs/COMMANDS.md +1005 -0
  16. lf_releng_project_reporting-0.1.0/docs/CONFIGURATION.md +1741 -0
  17. lf_releng_project_reporting-0.1.0/docs/CONFIGURATION_MERGING.md +460 -0
  18. lf_releng_project_reporting-0.1.0/docs/DATATABLES_COMPLETE.md +171 -0
  19. lf_releng_project_reporting-0.1.0/docs/DATATABLES_IMPLEMENTATION.md +327 -0
  20. lf_releng_project_reporting-0.1.0/docs/DATATABLES_PHASE1_COMPLETE.md +156 -0
  21. lf_releng_project_reporting-0.1.0/docs/DATATABLES_USAGE.md +279 -0
  22. lf_releng_project_reporting-0.1.0/docs/DATA_EXTRACTION_FIX_REPORT.md +551 -0
  23. lf_releng_project_reporting-0.1.0/docs/DEPLOYMENT.md +2951 -0
  24. lf_releng_project_reporting-0.1.0/docs/DEVELOPER_GUIDE.md +971 -0
  25. lf_releng_project_reporting-0.1.0/docs/FAQ.md +961 -0
  26. lf_releng_project_reporting-0.1.0/docs/FEATURE_DISCOVERY_GUIDE.md +555 -0
  27. lf_releng_project_reporting-0.1.0/docs/GETTING_STARTED.md +487 -0
  28. lf_releng_project_reporting-0.1.0/docs/GITHUB_LANGUAGE_COMPARISON.md +516 -0
  29. lf_releng_project_reporting-0.1.0/docs/GITHUB_NATIVE_IMPLEMENTATION_PLAN.md +820 -0
  30. lf_releng_project_reporting-0.1.0/docs/GITHUB_NATIVE_IMPLEMENTATION_SUMMARY.md +443 -0
  31. lf_releng_project_reporting-0.1.0/docs/GITHUB_NATIVE_QUICK_START.md +544 -0
  32. lf_releng_project_reporting-0.1.0/docs/GITHUB_ONLY_PROJECTS.md +360 -0
  33. lf_releng_project_reporting-0.1.0/docs/GITHUB_PAGES_SETUP.md +602 -0
  34. lf_releng_project_reporting-0.1.0/docs/GITHUB_TOKEN_ENV.md +253 -0
  35. lf_releng_project_reporting-0.1.0/docs/HTTP_FALLBACK_GUIDE.md +188 -0
  36. lf_releng_project_reporting-0.1.0/docs/IMPLEMENTATION_TOC_FEATURE.md +645 -0
  37. lf_releng_project_reporting-0.1.0/docs/INDEX.md +321 -0
  38. lf_releng_project_reporting-0.1.0/docs/INFO_YAML_QUICK_REF.md +246 -0
  39. lf_releng_project_reporting-0.1.0/docs/INFO_YAML_REPORTING.md +797 -0
  40. lf_releng_project_reporting-0.1.0/docs/INFO_YAML_SERVER_FILTERING.md +393 -0
  41. lf_releng_project_reporting-0.1.0/docs/MIGRATION_GUIDE.md +865 -0
  42. lf_releng_project_reporting-0.1.0/docs/PERFORMANCE.md +1574 -0
  43. lf_releng_project_reporting-0.1.0/docs/PHASE8_MIGRATION_COMPLETE.md +498 -0
  44. lf_releng_project_reporting-0.1.0/docs/QUICK_REFERENCE.md +272 -0
  45. lf_releng_project_reporting-0.1.0/docs/REGEX_PATTERN_MATCHING_SUMMARY.md +427 -0
  46. lf_releng_project_reporting-0.1.0/docs/RENDERING_ARCHITECTURE_ANALYSIS.md +513 -0
  47. lf_releng_project_reporting-0.1.0/docs/SCHEMA_VERSION_1.5.0.md +325 -0
  48. lf_releng_project_reporting-0.1.0/docs/TABLE_COMPARISON.md +492 -0
  49. lf_releng_project_reporting-0.1.0/docs/TABLE_FIXES_SUMMARY.md +418 -0
  50. lf_releng_project_reporting-0.1.0/docs/TABLE_OF_CONTENTS.md +496 -0
  51. lf_releng_project_reporting-0.1.0/docs/TEMPLATE_AND_AUDIT_FIXES_COMPLETE.md +552 -0
  52. lf_releng_project_reporting-0.1.0/docs/TEMPLATE_AUDIT.md +482 -0
  53. lf_releng_project_reporting-0.1.0/docs/TEMPLATE_DEVELOPMENT.md +908 -0
  54. lf_releng_project_reporting-0.1.0/docs/TEMPLATE_FIX_FINAL.md +416 -0
  55. lf_releng_project_reporting-0.1.0/docs/TEMPLATE_HARDENING_REPORT.md +586 -0
  56. lf_releng_project_reporting-0.1.0/docs/TESTING.md +1046 -0
  57. lf_releng_project_reporting-0.1.0/docs/TESTING_GITHUB_NATIVE.md +498 -0
  58. lf_releng_project_reporting-0.1.0/docs/TOC_BUG_FIX_REPORT.md +362 -0
  59. lf_releng_project_reporting-0.1.0/docs/TROUBLESHOOTING.md +1772 -0
  60. lf_releng_project_reporting-0.1.0/docs/USAGE_EXAMPLES.md +1677 -0
  61. lf_releng_project_reporting-0.1.0/docs/concurrency/model.md +843 -0
  62. lf_releng_project_reporting-0.1.0/docs/concurrency/performance_tuning.md +755 -0
  63. lf_releng_project_reporting-0.1.0/docs/concurrency/thread_safety_audit.md +533 -0
  64. lf_releng_project_reporting-0.1.0/docs/concurrency/troubleshooting.md +827 -0
  65. lf_releng_project_reporting-0.1.0/docs/features/G2G_PATTERN_FLOW.md +516 -0
  66. lf_releng_project_reporting-0.1.0/docs/features/G2G_REGEX_PATTERNS.md +491 -0
  67. lf_releng_project_reporting-0.1.0/docs/features/GITHUB_TOKEN_ENV_VAR.md +118 -0
  68. lf_releng_project_reporting-0.1.0/docs/guides/CONCURRENCY_CONFIG.md +568 -0
  69. lf_releng_project_reporting-0.1.0/docs/guides/PERFORMANCE_OPTIMIZATION.md +460 -0
  70. lf_releng_project_reporting-0.1.0/docs/guides/TEMPLATE_DEVELOPMENT.md +899 -0
  71. lf_releng_project_reporting-0.1.0/docs/guides/THEME_CREATION.md +922 -0
  72. lf_releng_project_reporting-0.1.0/docs/testing/ENHANCED_ERRORS_GUIDE.md +547 -0
  73. lf_releng_project_reporting-0.1.0/docs/testing/PARALLEL_EXECUTION.md +665 -0
  74. lf_releng_project_reporting-0.1.0/docs/testing/PARALLEL_EXECUTION_QUICK_REF.md +335 -0
  75. lf_releng_project_reporting-0.1.0/docs/testing/PROPERTY_TESTING_OVERVIEW.md +648 -0
  76. lf_releng_project_reporting-0.1.0/docs/testing/TEST_PREREQUISITES.md +731 -0
  77. lf_releng_project_reporting-0.1.0/docs/testing/TEST_WRITING_GUIDE.md +1181 -0
  78. lf_releng_project_reporting-0.1.0/examples/README.md +130 -0
  79. lf_releng_project_reporting-0.1.0/examples/dry_run_demo.py +254 -0
  80. lf_releng_project_reporting-0.1.0/pyproject.toml +325 -0
  81. lf_releng_project_reporting-0.1.0/src/api/__init__.py +54 -0
  82. lf_releng_project_reporting-0.1.0/src/api/base_client.py +274 -0
  83. lf_releng_project_reporting-0.1.0/src/api/gerrit_client.py +502 -0
  84. lf_releng_project_reporting-0.1.0/src/api/github_client.py +480 -0
  85. lf_releng_project_reporting-0.1.0/src/api/jenkins_client.py +1000 -0
  86. lf_releng_project_reporting-0.1.0/src/cli/__init__.py +200 -0
  87. lf_releng_project_reporting-0.1.0/src/cli/arguments.py +560 -0
  88. lf_releng_project_reporting-0.1.0/src/cli/error_context.py +622 -0
  89. lf_releng_project_reporting-0.1.0/src/cli/error_helpers.py +449 -0
  90. lf_releng_project_reporting-0.1.0/src/cli/errors.py +490 -0
  91. lf_releng_project_reporting-0.1.0/src/cli/exit_codes.py +190 -0
  92. lf_releng_project_reporting-0.1.0/src/cli/features.py +752 -0
  93. lf_releng_project_reporting-0.1.0/src/cli/metrics.py +682 -0
  94. lf_releng_project_reporting-0.1.0/src/cli/progress.py +435 -0
  95. lf_releng_project_reporting-0.1.0/src/cli/validation.py +563 -0
  96. lf_releng_project_reporting-0.1.0/src/cli/wizard.py +691 -0
  97. lf_releng_project_reporting-0.1.0/src/concurrency/__init__.py +46 -0
  98. lf_releng_project_reporting-0.1.0/src/concurrency/adaptive_pool.py +295 -0
  99. lf_releng_project_reporting-0.1.0/src/concurrency/error_handler.py +441 -0
  100. lf_releng_project_reporting-0.1.0/src/concurrency/hybrid_executor.py +292 -0
  101. lf_releng_project_reporting-0.1.0/src/concurrency/jenkins_allocation.py +230 -0
  102. lf_releng_project_reporting-0.1.0/src/config/README.md +524 -0
  103. lf_releng_project_reporting-0.1.0/src/config/__init__.py +44 -0
  104. lf_releng_project_reporting-0.1.0/src/config/schema.json +483 -0
  105. lf_releng_project_reporting-0.1.0/src/config/validator.py +516 -0
  106. lf_releng_project_reporting-0.1.0/src/domain/README.md +361 -0
  107. lf_releng_project_reporting-0.1.0/src/domain/__init__.py +54 -0
  108. lf_releng_project_reporting-0.1.0/src/domain/author_metrics.py +235 -0
  109. lf_releng_project_reporting-0.1.0/src/domain/info_yaml.py +447 -0
  110. lf_releng_project_reporting-0.1.0/src/domain/organization_metrics.py +220 -0
  111. lf_releng_project_reporting-0.1.0/src/domain/repository_metrics.py +243 -0
  112. lf_releng_project_reporting-0.1.0/src/domain/time_window.py +218 -0
  113. lf_releng_project_reporting-0.1.0/src/domain/workflow_status.py +178 -0
  114. lf_releng_project_reporting-0.1.0/src/jjb_attribution/README.md +234 -0
  115. lf_releng_project_reporting-0.1.0/src/jjb_attribution/__init__.py +20 -0
  116. lf_releng_project_reporting-0.1.0/src/jjb_attribution/jjb_parser.py +701 -0
  117. lf_releng_project_reporting-0.1.0/src/jjb_attribution/repo_manager.py +376 -0
  118. lf_releng_project_reporting-0.1.0/src/lf_releng_project_reporting/__init__.py +40 -0
  119. lf_releng_project_reporting-0.1.0/src/lf_releng_project_reporting/__main__.py +17 -0
  120. lf_releng_project_reporting-0.1.0/src/lf_releng_project_reporting/_version.py +34 -0
  121. lf_releng_project_reporting-0.1.0/src/lf_releng_project_reporting/aggregators/__init__.py +18 -0
  122. lf_releng_project_reporting-0.1.0/src/lf_releng_project_reporting/aggregators/data.py +490 -0
  123. lf_releng_project_reporting-0.1.0/src/lf_releng_project_reporting/analysis/__init__.py +17 -0
  124. lf_releng_project_reporting-0.1.0/src/lf_releng_project_reporting/cli.py +358 -0
  125. lf_releng_project_reporting-0.1.0/src/lf_releng_project_reporting/clients/__init__.py +24 -0
  126. lf_releng_project_reporting-0.1.0/src/lf_releng_project_reporting/collectors/__init__.py +18 -0
  127. lf_releng_project_reporting-0.1.0/src/lf_releng_project_reporting/collectors/base.py +107 -0
  128. lf_releng_project_reporting-0.1.0/src/lf_releng_project_reporting/collectors/git.py +1436 -0
  129. lf_releng_project_reporting-0.1.0/src/lf_releng_project_reporting/collectors/info_yaml/__init__.py +32 -0
  130. lf_releng_project_reporting-0.1.0/src/lf_releng_project_reporting/collectors/info_yaml/cache.py +621 -0
  131. lf_releng_project_reporting-0.1.0/src/lf_releng_project_reporting/collectors/info_yaml/collector.py +414 -0
  132. lf_releng_project_reporting-0.1.0/src/lf_releng_project_reporting/collectors/info_yaml/enricher.py +560 -0
  133. lf_releng_project_reporting-0.1.0/src/lf_releng_project_reporting/collectors/info_yaml/matcher.py +384 -0
  134. lf_releng_project_reporting-0.1.0/src/lf_releng_project_reporting/collectors/info_yaml/metrics.py +445 -0
  135. lf_releng_project_reporting-0.1.0/src/lf_releng_project_reporting/collectors/info_yaml/parser.py +351 -0
  136. lf_releng_project_reporting-0.1.0/src/lf_releng_project_reporting/collectors/info_yaml/validator.py +538 -0
  137. lf_releng_project_reporting-0.1.0/src/lf_releng_project_reporting/config.py +408 -0
  138. lf_releng_project_reporting-0.1.0/src/lf_releng_project_reporting/exceptions.py +74 -0
  139. lf_releng_project_reporting-0.1.0/src/lf_releng_project_reporting/features/__init__.py +17 -0
  140. lf_releng_project_reporting-0.1.0/src/lf_releng_project_reporting/features/registry.py +1255 -0
  141. lf_releng_project_reporting-0.1.0/src/lf_releng_project_reporting/main.py +481 -0
  142. lf_releng_project_reporting-0.1.0/src/lf_releng_project_reporting/rendering/__init__.py +19 -0
  143. lf_releng_project_reporting-0.1.0/src/lf_releng_project_reporting/reporter.py +639 -0
  144. lf_releng_project_reporting-0.1.0/src/lf_releng_project_reporting/statistics.py +286 -0
  145. lf_releng_project_reporting-0.1.0/src/observability/README.md +566 -0
  146. lf_releng_project_reporting-0.1.0/src/observability/__init__.py +59 -0
  147. lf_releng_project_reporting-0.1.0/src/observability/errors.py +512 -0
  148. lf_releng_project_reporting-0.1.0/src/observability/structured_logging.py +456 -0
  149. lf_releng_project_reporting-0.1.0/src/performance/__init__.py +261 -0
  150. lf_releng_project_reporting-0.1.0/src/performance/batch.py +718 -0
  151. lf_releng_project_reporting-0.1.0/src/performance/cache.py +833 -0
  152. lf_releng_project_reporting-0.1.0/src/performance/git_optimizer.py +734 -0
  153. lf_releng_project_reporting-0.1.0/src/performance/memory.py +774 -0
  154. lf_releng_project_reporting-0.1.0/src/performance/parallel.py +598 -0
  155. lf_releng_project_reporting-0.1.0/src/performance/profiler.py +652 -0
  156. lf_releng_project_reporting-0.1.0/src/performance/reporter.py +840 -0
  157. lf_releng_project_reporting-0.1.0/src/rendering/__init__.py +45 -0
  158. lf_releng_project_reporting-0.1.0/src/rendering/context.py +1200 -0
  159. lf_releng_project_reporting-0.1.0/src/rendering/formatters.py +508 -0
  160. lf_releng_project_reporting-0.1.0/src/rendering/info_yaml_renderer.py +414 -0
  161. lf_releng_project_reporting-0.1.0/src/rendering/renderer.py +325 -0
  162. lf_releng_project_reporting-0.1.0/src/templates/html/base.html.j2 +383 -0
  163. lf_releng_project_reporting-0.1.0/src/templates/html/components/data_table.html.j2 +120 -0
  164. lf_releng_project_reporting-0.1.0/src/templates/html/components/datatables_support.html.j2 +165 -0
  165. lf_releng_project_reporting-0.1.0/src/templates/html/components/section_header.html.j2 +71 -0
  166. lf_releng_project_reporting-0.1.0/src/templates/html/components/stats_table.html.j2 +48 -0
  167. lf_releng_project_reporting-0.1.0/src/templates/html/components/table_of_contents.html.j2 +30 -0
  168. lf_releng_project_reporting-0.1.0/src/templates/html/sections/contributors.html.j2 +61 -0
  169. lf_releng_project_reporting-0.1.0/src/templates/html/sections/features.html.j2 +54 -0
  170. lf_releng_project_reporting-0.1.0/src/templates/html/sections/organizations.html.j2 +61 -0
  171. lf_releng_project_reporting-0.1.0/src/templates/html/sections/orphaned_jobs.html.j2 +61 -0
  172. lf_releng_project_reporting-0.1.0/src/templates/html/sections/repositories.html.j2 +60 -0
  173. lf_releng_project_reporting-0.1.0/src/templates/html/sections/summary.html.j2 +75 -0
  174. lf_releng_project_reporting-0.1.0/src/templates/html/sections/unattributed_jobs.html.j2 +88 -0
  175. lf_releng_project_reporting-0.1.0/src/templates/html/sections/workflows.html.j2 +148 -0
  176. lf_releng_project_reporting-0.1.0/src/templates/markdown/base.md.j2 +123 -0
  177. lf_releng_project_reporting-0.1.0/src/templates/markdown/components/header.md.j2 +39 -0
  178. lf_releng_project_reporting-0.1.0/src/templates/markdown/components/stats_table.md.j2 +36 -0
  179. lf_releng_project_reporting-0.1.0/src/templates/markdown/components/table_of_contents.md.j2 +29 -0
  180. lf_releng_project_reporting-0.1.0/src/templates/markdown/sections/contributors.md.j2 +32 -0
  181. lf_releng_project_reporting-0.1.0/src/templates/markdown/sections/features.md.j2 +28 -0
  182. lf_releng_project_reporting-0.1.0/src/templates/markdown/sections/info_yaml_committers.md.j2 +149 -0
  183. lf_releng_project_reporting-0.1.0/src/templates/markdown/sections/info_yaml_lifecycle.md.j2 +14 -0
  184. lf_releng_project_reporting-0.1.0/src/templates/markdown/sections/organizations.md.j2 +32 -0
  185. lf_releng_project_reporting-0.1.0/src/templates/markdown/sections/orphaned_jobs.md.j2 +41 -0
  186. lf_releng_project_reporting-0.1.0/src/templates/markdown/sections/repositories.md.j2 +30 -0
  187. lf_releng_project_reporting-0.1.0/src/templates/markdown/sections/summary.md.j2 +39 -0
  188. lf_releng_project_reporting-0.1.0/src/templates/markdown/sections/unattributed_jobs.md.j2 +45 -0
  189. lf_releng_project_reporting-0.1.0/src/templates/markdown/sections/workflows.md.j2 +46 -0
  190. lf_releng_project_reporting-0.1.0/src/themes/dark/config.json +37 -0
  191. lf_releng_project_reporting-0.1.0/src/themes/dark/theme.css +989 -0
  192. lf_releng_project_reporting-0.1.0/src/themes/default/config.json +35 -0
  193. lf_releng_project_reporting-0.1.0/src/themes/default/theme.css +1021 -0
  194. lf_releng_project_reporting-0.1.0/src/themes/default.css +648 -0
  195. lf_releng_project_reporting-0.1.0/src/themes/minimal/config.json +39 -0
  196. lf_releng_project_reporting-0.1.0/src/themes/minimal/theme.css +724 -0
  197. lf_releng_project_reporting-0.1.0/src/util/__init__.py +34 -0
  198. lf_releng_project_reporting-0.1.0/src/util/formatting.py +159 -0
  199. lf_releng_project_reporting-0.1.0/src/util/git.py +58 -0
  200. lf_releng_project_reporting-0.1.0/src/util/github_org.py +199 -0
  201. lf_releng_project_reporting-0.1.0/src/util/zip_bundle.py +120 -0
  202. lf_releng_project_reporting-0.1.0/tests/README.md +860 -0
  203. lf_releng_project_reporting-0.1.0/tests/collectors/test_info_yaml_matcher.py +257 -0
  204. lf_releng_project_reporting-0.1.0/tests/collectors/test_info_yaml_parser.py +491 -0
  205. lf_releng_project_reporting-0.1.0/tests/collectors/test_info_yaml_validator_async.py +497 -0
  206. lf_releng_project_reporting-0.1.0/tests/config/test-project.yaml +15 -0
  207. lf_releng_project_reporting-0.1.0/tests/conftest.py +156 -0
  208. lf_releng_project_reporting-0.1.0/tests/domain/test_info_yaml.py +631 -0
  209. lf_releng_project_reporting-0.1.0/tests/fixtures/README.md +272 -0
  210. lf_releng_project_reporting-0.1.0/tests/fixtures/__init__.py +45 -0
  211. lf_releng_project_reporting-0.1.0/tests/fixtures/info_yaml/minimal_project.yaml +8 -0
  212. lf_releng_project_reporting-0.1.0/tests/fixtures/info_yaml/valid_project.yaml +79 -0
  213. lf_releng_project_reporting-0.1.0/tests/fixtures/job_attribution/README.md +110 -0
  214. lf_releng_project_reporting-0.1.0/tests/fixtures/job_attribution/__init__.py +12 -0
  215. lf_releng_project_reporting-0.1.0/tests/fixtures/job_attribution/production_data.json +409 -0
  216. lf_releng_project_reporting-0.1.0/tests/fixtures/minimal_production_data.json +25146 -0
  217. lf_releng_project_reporting-0.1.0/tests/fixtures/repositories.py +642 -0
  218. lf_releng_project_reporting-0.1.0/tests/integration/README.md +494 -0
  219. lf_releng_project_reporting-0.1.0/tests/integration/__init__.py +12 -0
  220. lf_releng_project_reporting-0.1.0/tests/integration/conftest.py +64 -0
  221. lf_releng_project_reporting-0.1.0/tests/integration/fixtures.py +486 -0
  222. lf_releng_project_reporting-0.1.0/tests/integration/test_api_integration.py +478 -0
  223. lf_releng_project_reporting-0.1.0/tests/integration/test_cli_integration.py +519 -0
  224. lf_releng_project_reporting-0.1.0/tests/integration/test_data_pipeline.py +558 -0
  225. lf_releng_project_reporting-0.1.0/tests/integration/test_g2g_opendaylight.py +304 -0
  226. lf_releng_project_reporting-0.1.0/tests/integration/test_gerrit_url_validation.py +228 -0
  227. lf_releng_project_reporting-0.1.0/tests/integration/test_html_rendering.py +327 -0
  228. lf_releng_project_reporting-0.1.0/tests/integration/test_info_yaml_end_to_end.py +703 -0
  229. lf_releng_project_reporting-0.1.0/tests/integration/test_info_yaml_reporting_integration.py +728 -0
  230. lf_releng_project_reporting-0.1.0/tests/integration/test_info_yaml_template_integration.py +499 -0
  231. lf_releng_project_reporting-0.1.0/tests/integration/test_phase13_integration.py +820 -0
  232. lf_releng_project_reporting-0.1.0/tests/integration/test_render_context_integration.py +507 -0
  233. lf_releng_project_reporting-0.1.0/tests/integration/test_report_generation.py +545 -0
  234. lf_releng_project_reporting-0.1.0/tests/integration/test_theme_integration.py +408 -0
  235. lf_releng_project_reporting-0.1.0/tests/integration/test_workflows.py +402 -0
  236. lf_releng_project_reporting-0.1.0/tests/mocks/api_mocks.py +518 -0
  237. lf_releng_project_reporting-0.1.0/tests/performance_tests/README.md +442 -0
  238. lf_releng_project_reporting-0.1.0/tests/performance_tests/__init__.py +31 -0
  239. lf_releng_project_reporting-0.1.0/tests/performance_tests/benchmark_phase7_8.py +373 -0
  240. lf_releng_project_reporting-0.1.0/tests/performance_tests/conftest.py +267 -0
  241. lf_releng_project_reporting-0.1.0/tests/performance_tests/test_benchmarks.py +542 -0
  242. lf_releng_project_reporting-0.1.0/tests/performance_tests/test_info_yaml_performance.py +678 -0
  243. lf_releng_project_reporting-0.1.0/tests/performance_tests/test_thresholds.py +400 -0
  244. lf_releng_project_reporting-0.1.0/tests/property/README.md +553 -0
  245. lf_releng_project_reporting-0.1.0/tests/property/__init__.py +20 -0
  246. lf_releng_project_reporting-0.1.0/tests/property/test_aggregations.py +440 -0
  247. lf_releng_project_reporting-0.1.0/tests/property/test_time_windows.py +443 -0
  248. lf_releng_project_reporting-0.1.0/tests/property/test_transformations.py +555 -0
  249. lf_releng_project_reporting-0.1.0/tests/regression/README.md +518 -0
  250. lf_releng_project_reporting-0.1.0/tests/regression/__snapshots__/test_json_snapshots.ambr +470 -0
  251. lf_releng_project_reporting-0.1.0/tests/regression/snapshots/test_json_snapshots/test_author_list_snapshot/author_list +40 -0
  252. lf_releng_project_reporting-0.1.0/tests/regression/snapshots/test_json_snapshots/test_author_metrics_basic_snapshot/author_basic +31 -0
  253. lf_releng_project_reporting-0.1.0/tests/regression/snapshots/test_json_snapshots/test_author_metrics_empty_name_snapshot/author_empty_name +11 -0
  254. lf_releng_project_reporting-0.1.0/tests/regression/snapshots/test_json_snapshots/test_author_metrics_minimal_snapshot/author_minimal +11 -0
  255. lf_releng_project_reporting-0.1.0/tests/regression/snapshots/test_json_snapshots/test_author_metrics_unicode_snapshot/author_unicode +13 -0
  256. lf_releng_project_reporting-0.1.0/tests/regression/snapshots/test_json_snapshots/test_empty_collections_snapshot/empty_collections +11 -0
  257. lf_releng_project_reporting-0.1.0/tests/regression/snapshots/test_json_snapshots/test_field_order_stability_snapshot/field_order_stable +17 -0
  258. lf_releng_project_reporting-0.1.0/tests/regression/snapshots/test_json_snapshots/test_long_repository_path_snapshot/long_path +17 -0
  259. lf_releng_project_reporting-0.1.0/tests/regression/snapshots/test_json_snapshots/test_multiple_time_windows_snapshot/multiple_windows +17 -0
  260. lf_releng_project_reporting-0.1.0/tests/regression/snapshots/test_json_snapshots/test_negative_net_lines_snapshot/negative_net_lines +7 -0
  261. lf_releng_project_reporting-0.1.0/tests/regression/snapshots/test_json_snapshots/test_repository_list_snapshot/repo_list +36 -0
  262. lf_releng_project_reporting-0.1.0/tests/regression/snapshots/test_json_snapshots/test_repository_metrics_active_snapshot/repo_active +44 -0
  263. lf_releng_project_reporting-0.1.0/tests/regression/snapshots/test_json_snapshots/test_repository_metrics_empty_snapshot/repo_empty +17 -0
  264. lf_releng_project_reporting-0.1.0/tests/regression/snapshots/test_json_snapshots/test_repository_metrics_inactive_snapshot/repo_inactive +41 -0
  265. lf_releng_project_reporting-0.1.0/tests/regression/snapshots/test_json_snapshots/test_repository_metrics_with_errors_snapshot/repo_with_errors +21 -0
  266. lf_releng_project_reporting-0.1.0/tests/regression/snapshots/test_json_snapshots/test_special_characters_in_names_snapshot/special_characters +11 -0
  267. lf_releng_project_reporting-0.1.0/tests/regression/snapshots/test_json_snapshots/test_time_window_name_not_in_dict_snapshot/window_name_not_in_dict +5 -0
  268. lf_releng_project_reporting-0.1.0/tests/regression/snapshots/test_json_snapshots/test_time_window_stats_to_dict_snapshot/time_window_stats +7 -0
  269. lf_releng_project_reporting-0.1.0/tests/regression/snapshots/test_json_snapshots/test_time_window_stats_zero_contributors_snapshot/stats_zero_contributors +6 -0
  270. lf_releng_project_reporting-0.1.0/tests/regression/snapshots/test_json_snapshots/test_time_window_to_dict_snapshot/time_window +5 -0
  271. lf_releng_project_reporting-0.1.0/tests/regression/snapshots/test_json_snapshots/test_very_large_numbers_snapshot/very_large_numbers +7 -0
  272. lf_releng_project_reporting-0.1.0/tests/regression/snapshots/test_json_snapshots/test_zero_everything_snapshot/zero_everything +6 -0
  273. lf_releng_project_reporting-0.1.0/tests/regression/test_baseline_json_schema.py +437 -0
  274. lf_releng_project_reporting-0.1.0/tests/regression/test_json_snapshots.py +514 -0
  275. lf_releng_project_reporting-0.1.0/tests/regression/test_known_issues.py +687 -0
  276. lf_releng_project_reporting-0.1.0/tests/regression/update_baseline_digest.py +238 -0
  277. lf_releng_project_reporting-0.1.0/tests/test_api_statistics_integration.py +543 -0
  278. lf_releng_project_reporting-0.1.0/tests/test_cli/test_error_context.py +720 -0
  279. lf_releng_project_reporting-0.1.0/tests/test_cli/test_features.py +663 -0
  280. lf_releng_project_reporting-0.1.0/tests/test_cli/test_metrics.py +586 -0
  281. lf_releng_project_reporting-0.1.0/tests/test_cli/test_wizard.py +567 -0
  282. lf_releng_project_reporting-0.1.0/tests/test_cli.py +654 -0
  283. lf_releng_project_reporting-0.1.0/tests/test_cli_progress.py +470 -0
  284. lf_releng_project_reporting-0.1.0/tests/test_cli_validation.py +488 -0
  285. lf_releng_project_reporting-0.1.0/tests/test_config_validation.py +649 -0
  286. lf_releng_project_reporting-0.1.0/tests/test_datatables_integration.py +91 -0
  287. lf_releng_project_reporting-0.1.0/tests/test_domain_models.py +823 -0
  288. lf_releng_project_reporting-0.1.0/tests/test_enhanced_errors.py +676 -0
  289. lf_releng_project_reporting-0.1.0/tests/test_error_handling.py +562 -0
  290. lf_releng_project_reporting-0.1.0/tests/test_errors.py +555 -0
  291. lf_releng_project_reporting-0.1.0/tests/test_git_optimizer.py +588 -0
  292. lf_releng_project_reporting-0.1.0/tests/test_github_token_env.py +220 -0
  293. lf_releng_project_reporting-0.1.0/tests/test_isolation.py +408 -0
  294. lf_releng_project_reporting-0.1.0/tests/test_jenkins_allocation_context.py +519 -0
  295. lf_releng_project_reporting-0.1.0/tests/test_parallel.py +591 -0
  296. lf_releng_project_reporting-0.1.0/tests/test_performance.py +660 -0
  297. lf_releng_project_reporting-0.1.0/tests/test_performance_batch.py +806 -0
  298. lf_releng_project_reporting-0.1.0/tests/test_performance_cache.py +768 -0
  299. lf_releng_project_reporting-0.1.0/tests/test_performance_memory.py +759 -0
  300. lf_releng_project_reporting-0.1.0/tests/test_performance_reporter.py +673 -0
  301. lf_releng_project_reporting-0.1.0/tests/test_rendering.py +486 -0
  302. lf_releng_project_reporting-0.1.0/tests/test_retry_decorator.py +362 -0
  303. lf_releng_project_reporting-0.1.0/tests/test_structured_logging.py +536 -0
  304. lf_releng_project_reporting-0.1.0/tests/test_utils.py +753 -0
  305. lf_releng_project_reporting-0.1.0/tests/test_utils.py.bak2 +761 -0
  306. lf_releng_project_reporting-0.1.0/tests/unit/test_api_envelope.py +481 -0
  307. lf_releng_project_reporting-0.1.0/tests/unit/test_base_client.py +510 -0
  308. lf_releng_project_reporting-0.1.0/tests/unit/test_concurrency_adaptive_pool.py +491 -0
  309. lf_releng_project_reporting-0.1.0/tests/unit/test_concurrency_error_handler.py +611 -0
  310. lf_releng_project_reporting-0.1.0/tests/unit/test_concurrency_hybrid_executor.py +514 -0
  311. lf_releng_project_reporting-0.1.0/tests/unit/test_concurrency_jenkins_allocation.py +829 -0
  312. lf_releng_project_reporting-0.1.0/tests/unit/test_config_merging.py +423 -0
  313. lf_releng_project_reporting-0.1.0/tests/unit/test_domain_author_metrics.py +421 -0
  314. lf_releng_project_reporting-0.1.0/tests/unit/test_domain_organization_metrics.py +416 -0
  315. lf_releng_project_reporting-0.1.0/tests/unit/test_domain_repository_metrics.py +649 -0
  316. lf_releng_project_reporting-0.1.0/tests/unit/test_domain_time_window.py +487 -0
  317. lf_releng_project_reporting-0.1.0/tests/unit/test_domain_workflow_status.py +433 -0
  318. lf_releng_project_reporting-0.1.0/tests/unit/test_formatting.py +220 -0
  319. lf_releng_project_reporting-0.1.0/tests/unit/test_g2g_feature.py +829 -0
  320. lf_releng_project_reporting-0.1.0/tests/unit/test_gerrit_api.py +782 -0
  321. lf_releng_project_reporting-0.1.0/tests/unit/test_gerrit_api_extended.py +709 -0
  322. lf_releng_project_reporting-0.1.0/tests/unit/test_github_api.py +518 -0
  323. lf_releng_project_reporting-0.1.0/tests/unit/test_github_api_extended.py +707 -0
  324. lf_releng_project_reporting-0.1.0/tests/unit/test_github_org.py +384 -0
  325. lf_releng_project_reporting-0.1.0/tests/unit/test_jenkins_api.py +829 -0
  326. lf_releng_project_reporting-0.1.0/tests/unit/test_job_attribution.py +595 -0
  327. lf_releng_project_reporting-0.1.0/tests/unit/test_project_type_detection.py +482 -0
  328. lf_releng_project_reporting-0.1.0/tests/unit/test_rendering_context.py +1066 -0
  329. lf_releng_project_reporting-0.1.0/tests/unit/test_rendering_formatters.py +650 -0
  330. lf_releng_project_reporting-0.1.0/tests/unit/test_rendering_info_yaml_renderer.py +588 -0
  331. lf_releng_project_reporting-0.1.0/tests/unit/test_rendering_modern_renderer.py +298 -0
  332. lf_releng_project_reporting-0.1.0/tests/unit/test_rendering_renderer.py +795 -0
  333. lf_releng_project_reporting-0.1.0/tests/unit/test_zip_bundle.py +479 -0
  334. lf_releng_project_reporting-0.1.0/tests/utils/assertions.py +547 -0
@@ -0,0 +1,103 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ # SPDX-FileCopyrightText: 2025 The Linux Foundation
3
+
4
+ testing/projects.json
5
+
6
+ # Auto-generated version file
7
+ src/lf_releng_project_reporting/_version.py
8
+
9
+ testing/ONAP
10
+ testing/reports
11
+ testing/*.log
12
+ testing/*.tmp
13
+ testing/*-production-report.html
14
+ testing/*-testing-report.html
15
+ testing/onap-report.html
16
+ testing/odl-report.html
17
+
18
+ # Gerrit server directories (server-specific naming)
19
+ gerrit.*/
20
+ gerrit-repos*/
21
+ reports/
22
+ test-repos/sample-repo
23
+
24
+ # Temporary and binary files
25
+ *~
26
+ *.py[cod]
27
+ *.so
28
+ *.cfg
29
+ !.isort.cfg
30
+ !setup.cfg
31
+ *.orig
32
+ *.log
33
+ *.pot
34
+ __pycache__/*
35
+ .cache/*
36
+ .*.swp
37
+ */.ipynb_checkpoints/*
38
+ .DS_Store
39
+
40
+ # Project files
41
+ .ropeproject
42
+ .project
43
+ .pydevproject
44
+ .settings
45
+ .idea
46
+ .vscode
47
+ tags
48
+
49
+ # Package files
50
+ *.egg
51
+ *.eggs/
52
+ .installed.cfg
53
+ *.egg-info
54
+
55
+ # Unittest and coverage
56
+ htmlcov/*
57
+ .coverage
58
+ .coverage.*
59
+ .tox
60
+ junit*.xml
61
+ coverage.xml
62
+ .pytest_cache/
63
+
64
+ # Build and docs folder/files
65
+ build/*
66
+ dist/*
67
+ sdist/*
68
+ docs/api/*
69
+ docs/_rst/*
70
+ docs/_build/*
71
+ cover/*
72
+ MANIFEST
73
+
74
+ # Per-project virtualenvs
75
+ .venv*/
76
+ .conda*/
77
+
78
+ # Node
79
+ node_modules/*
80
+
81
+ # Development artifacts (Phase 7 & 8 cleanup)
82
+ .mypy_cache/
83
+ .hypothesis/
84
+ .benchmarks/
85
+ test_artifacts/
86
+ *.pyc
87
+ *.pyo
88
+
89
+ # Test outputs
90
+ baseline_test_output.txt
91
+ parallel_test_output.txt
92
+ test_*.html
93
+
94
+ # Temporary cleanup scripts
95
+ cleanup_*.sh
96
+ organize_*.sh
97
+
98
+ # UV package manager
99
+ .uv/
100
+ uv.lock
101
+ *.egg-info/
102
+ dist/
103
+ build/
@@ -0,0 +1 @@
1
+ LICENSES/Apache-2.0.txt
@@ -0,0 +1,351 @@
1
+ Metadata-Version: 2.4
2
+ Name: lf-releng-project-reporting
3
+ Version: 0.1.0
4
+ Summary: Comprehensive multi-repository analysis tool for Linux Foundation projects
5
+ Project-URL: Homepage, https://github.com/lfreleng-actions/project-reporting-tool
6
+ Project-URL: Repository, https://github.com/lfreleng-actions/project-reporting-tool
7
+ Project-URL: Issues, https://github.com/lfreleng-actions/project-reporting-tool/issues
8
+ Project-URL: Changelog, https://github.com/lfreleng-actions/project-reporting-tool/blob/main/CHANGELOG.md
9
+ Author-email: The Linux Foundation <mwatkins@linuxfoundation.org>
10
+ Maintainer-email: The Linux Foundation <mwatkins@linuxfoundation.org>
11
+ License: Apache-2.0
12
+ License-File: LICENSE
13
+ Keywords: analysis,ci-cd,committers,gerrit,git,github,github-actions,jenkins,linux-foundation,metrics,projects,reporting,repository
14
+ Classifier: Development Status :: 4 - Beta
15
+ Classifier: Intended Audience :: Developers
16
+ Classifier: License :: OSI Approved :: Apache Software License
17
+ Classifier: Operating System :: OS Independent
18
+ Classifier: Programming Language :: Python :: 3
19
+ Classifier: Programming Language :: Python :: 3.10
20
+ Classifier: Programming Language :: Python :: 3.11
21
+ Classifier: Programming Language :: Python :: 3.12
22
+ Classifier: Programming Language :: Python :: 3.13
23
+ Classifier: Programming Language :: Python :: 3.14
24
+ Classifier: Topic :: Software Development :: Quality Assurance
25
+ Classifier: Topic :: Software Development :: Version Control :: Git
26
+ Classifier: Typing :: Typed
27
+ Requires-Python: >=3.10.2
28
+ Requires-Dist: httpx>=0.28.1
29
+ Requires-Dist: jinja2>=3.1.6
30
+ Requires-Dist: jsonschema>=4.25.1
31
+ Requires-Dist: psutil>=7.1.3
32
+ Requires-Dist: pyyaml>=6.0.3
33
+ Requires-Dist: rich>=14.2.0
34
+ Requires-Dist: typer>=0.20.0
35
+ Provides-Extra: dev
36
+ Requires-Dist: hypothesis>=6.148.2; extra == 'dev'
37
+ Requires-Dist: mypy>=1.18.2; extra == 'dev'
38
+ Requires-Dist: pre-commit>=4.4.0; extra == 'dev'
39
+ Requires-Dist: pytest-asyncio>=1.3.0; extra == 'dev'
40
+ Requires-Dist: pytest-benchmark>=5.2.3; extra == 'dev'
41
+ Requires-Dist: pytest-cov>=7.0.0; extra == 'dev'
42
+ Requires-Dist: pytest-rerunfailures>=16.1; extra == 'dev'
43
+ Requires-Dist: pytest-timeout>=2.4.0; extra == 'dev'
44
+ Requires-Dist: pytest-xdist>=3.8.0; extra == 'dev'
45
+ Requires-Dist: pytest>=9.0.1; extra == 'dev'
46
+ Requires-Dist: syrupy>=5.0.0; extra == 'dev'
47
+ Requires-Dist: types-pyyaml>=6.0.12.20250915; extra == 'dev'
48
+ Description-Content-Type: text/markdown
49
+
50
+ <!--
51
+ # SPDX-License-Identifier: Apache-2.0
52
+ # SPDX-FileCopyrightText: 2025 The Linux Foundation
53
+ -->
54
+
55
+ # 📊 Linux Foundation Project Reporting System
56
+
57
+ > Comprehensive multi-repository analysis tool for Linux Foundation projects
58
+
59
+ Generate detailed reports on Gerrit projects, contributor activity, Jenkins
60
+ jobs, GitHub CI/CD workflows, and development practices across repositories.
61
+
62
+ ---
63
+
64
+ ## 🗒️ Published Reports
65
+
66
+ <https://lfreleng-actions.github.io/project-reporting-tool/>
67
+
68
+ ## ⚡ Quick Start
69
+
70
+ ```bash
71
+ # Install
72
+ pip install .
73
+
74
+ # Generate your first report
75
+ lf-releng-project-reporting generate \
76
+ --project my-project \
77
+ --repos-path ./repos
78
+ ```text
79
+
80
+ ---
81
+
82
+ ## 🚀 Key Features
83
+
84
+ - **📈 Git Analytics** - Commit activity, lines of code, contributor metrics across configurable time windows
85
+ - **📋 INFO.yaml Reporting** - Project metadata, committer activity, and lifecycle state tracking from info-master
86
+ - **🔍 Feature Detection** - Automatic detection of CI/CD, documentation, dependency management, security tools
87
+ - **👥 Contributor Intelligence** - Author and organization analysis with domain mapping
88
+ - **🌐 API Integration** - GitHub, Gerrit, and Jenkins API support
89
+ - **🎯 CI-Management Integration** - Authoritative Jenkins job allocation using JJB definitions (99%+ accuracy)
90
+ - **📊 Interactive Reports** - JSON (data), Markdown (readable), HTML (interactive), ZIP (bundled)
91
+ - **⚡ High Performance** - Parallel processing with caching support
92
+
93
+ ---
94
+
95
+ ## 📚 Documentation
96
+
97
+ ### 🎯 Getting Started
98
+
99
+ - **[Getting Started Guide](docs/GETTING_STARTED.md)** - Complete installation and setup walkthrough
100
+ - **[Commands Reference](docs/COMMANDS.md)** - Full command-line reference with quick reference
101
+ - **[FAQ](docs/FAQ.md)** - Frequently asked questions
102
+ - **[Usage Examples](docs/USAGE_EXAMPLES.md)** - Real-world scenarios and patterns
103
+
104
+ ### ⚙️ Setup & Configuration
105
+
106
+ - **[Configuration Guide](docs/CONFIGURATION.md)** - All configuration options (GitHub API, INFO.yaml, performance)
107
+ - **[Configuration Merging](docs/CONFIGURATION_MERGING.md)** - How project configs inherit and override defaults
108
+ - **[Deployment Guide](docs/DEPLOYMENT.md)** - Production deployment and operations
109
+ - **[CI/CD Integration](docs/CI_CD_INTEGRATION.md)** - GitHub Actions, GitLab CI, and automation
110
+
111
+ ### 🔧 Advanced Usage
112
+
113
+ - **[Performance Guide](docs/PERFORMANCE.md)** - Optimization, caching, and scaling
114
+ - **[Feature Discovery](docs/FEATURE_DISCOVERY_GUIDE.md)** - Understanding automatic feature detection
115
+ - **[INFO.yaml Reporting](docs/INFO_YAML_REPORTING.md)** - Project metadata and committer activity tracking
116
+ - **[Troubleshooting](docs/TROUBLESHOOTING.md)** - Problem solving and debugging
117
+
118
+ ### 👨‍💻 Development
119
+
120
+ - **[Developer Guide](docs/DEVELOPER_GUIDE.md)** - Architecture, API reference, and contributing
121
+ - **[Template Development](docs/TEMPLATE_DEVELOPMENT.md)** - Customizing Jinja2 templates and creating new output formats
122
+ - **[Testing Guide](docs/TESTING.md)** - Test suite documentation
123
+ - **[Migration Guide](docs/MIGRATION_GUIDE.md)** - Production migration from legacy system
124
+
125
+ ### 🔍 Development Tools
126
+
127
+ - **Template Audit Script** - `python scripts/audit_templates.py` - Comprehensive audit of all Jinja2 templates to verify field accesses match context builders, preventing runtime errors
128
+
129
+ ---
130
+
131
+ ## 💻 Installation
132
+
133
+ ### Using UV (Recommended)
134
+
135
+ ```bash
136
+ # Install UV
137
+ curl -LsSf https://astral.sh/uv/install.sh | sh
138
+
139
+ # Install dependencies
140
+ uv sync
141
+
142
+ # Run the tool
143
+ uv run lf-releng-project-reporting generate --project my-project --repos-path ./repos
144
+ ```text
145
+
146
+ ### Using pip
147
+
148
+ ```bash
149
+ # Install from source
150
+ pip install .
151
+
152
+ # Run the tool
153
+ # Note: repos-path should match the directory created by gerrit-clone-action
154
+ # which defaults to the Gerrit server hostname (e.g., ./gerrit.o-ran-sc.org)
155
+ lf-releng-project-reporting generate --project O-RAN-SC --repos-path ./gerrit.o-ran-sc.org
156
+ ```text
157
+
158
+ **→ [Detailed Setup Instructions](SETUP.md)**
159
+
160
+ ---
161
+
162
+ ## 🎯 Common Use Cases
163
+
164
+ | Use Case | Command |
165
+ | --------------------------- | ----------------------------------------------------------------------------------------------------------- |
166
+ | **Basic report (O-RAN-SC)** | `lf-releng-project-reporting generate --project O-RAN-SC --repos-path ./gerrit.o-ran-sc.org` |
167
+ | **Basic report (ONAP)** | `lf-releng-project-reporting generate --project ONAP --repos-path ./gerrit.onap.org` |
168
+ | **With caching** | `lf-releng-project-reporting generate --project O-RAN-SC --repos-path ./gerrit.o-ran-sc.org --cache --workers 8` |
169
+ | **Check config** | `lf-releng-project-reporting generate --project O-RAN-SC --repos-path ./gerrit.o-ran-sc.org --dry-run` |
170
+ | **Get help** | `lf-releng-project-reporting --help` |
171
+
172
+ > **Note:** The `--repos-path` should point to the directory created by `gerrit-clone-action`, which uses the Gerrit server hostname as the directory name (e.g., `./gerrit.o-ran-sc.org` for O-RAN-SC, `./gerrit.onap.org` for ONAP).
173
+
174
+ ---
175
+
176
+ ## 📊 Output Formats
177
+
178
+ ```text
179
+ reports/
180
+ <PROJECT>/
181
+ ├── report_raw.json # Complete dataset (canonical)
182
+ ├── report.md # Markdown report (readable)
183
+ ├── report.html # Interactive HTML (sortable tables)
184
+ ├── config_resolved.json # Applied configuration
185
+ └── <PROJECT>_report_bundle.zip # Complete bundle
186
+ ```text
187
+
188
+ ---
189
+
190
+ ## 🔌 CI/CD Integration
191
+
192
+ ### GitHub Actions
193
+
194
+ ```yaml
195
+ - name: Generate Report
196
+ run: |
197
+ uv run lf-releng-project-reporting generate \
198
+ --project "${{ matrix.project }}" \
199
+ --repos-path "./${{ matrix.server }}" \
200
+ --cache \
201
+ --quiet
202
+ env:
203
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
204
+ ```text
205
+
206
+ ---
207
+
208
+ ## 🔧 Requirements
209
+
210
+ - **Python**: 3.10+ (supports 3.10, 3.11, 3.12, 3.13)
211
+ - **Dependencies**: PyYAML, httpx, Jinja2, typer, rich
212
+ - **Optional**: GitHub token for API features (required for workflow status colors)
213
+
214
+ ### GitHub Token Requirements
215
+
216
+ For full workflow status reporting (colored status indicators), you need a GitHub Personal Access Token (Classic) with these permissions:
217
+
218
+ **Required Scopes:**
219
+
220
+ - ☑ `repo` - Full repository access (or `public_repo` for public repositories)
221
+ - ☑ `actions:read` - Read GitHub Actions workflow runs and status
222
+
223
+ **Note:** Fine-grained tokens are not supported as they cannot span organizations.
224
+
225
+ **Setup:**
226
+
227
+ ```bash
228
+ # Set environment variable
229
+ export GITHUB_TOKEN=ghp_your_token_here
230
+ # OR for CI/production:
231
+ export CLASSIC_READ_ONLY_PAT_TOKEN=ghp_your_token_here
232
+
233
+ # Then run the tool
234
+ lf-releng-project-reporting generate --project my-project --repos-path ./repos
235
+ ```text
236
+
237
+ **Create token:** <https://github.com/settings/tokens>
238
+
239
+ **Without a token:** The tool detects workflows but shows them as grey (unknown status) instead of colored status indicators.
240
+
241
+ **See also:** [Configuration Guide](docs/CONFIGURATION.md#github-api-integration) for detailed token setup
242
+
243
+
244
+ ### Jenkins Authentication (Optional)
245
+
246
+ Some Jenkins servers require authentication to view job information. If you encounter a "returned 0 jobs" error, you need to provide Jenkins credentials.
247
+
248
+ **Setup:**
249
+
250
+ ```bash
251
+ # Generate API token in Jenkins: User → Configure → API Token → Add new Token
252
+ export JENKINS_USER="your-username"
253
+ export JENKINS_API_TOKEN="your-api-token"
254
+
255
+ # Then run the tool
256
+ lf-releng-project-reporting generate --project my-project --repos-path ./repos
257
+ ```
258
+
259
+ **Create token:** Log into your Jenkins instance → Your Username → Configure → API Token
260
+
261
+ **Without credentials:** The tool will fail with an error if Jenkins requires authentication.
262
+
263
+ **See also:** [Troubleshooting Guide](docs/TROUBLESHOOTING.md#jenkins-authentication) for detailed setup
264
+
265
+ ---
266
+
267
+ ## 📖 Key Documentation Files
268
+
269
+ | Topic | Document |
270
+ | ------------------- | ------------------------------------------------------ |
271
+ | **Getting Started** | [docs/GETTING_STARTED.md](docs/GETTING_STARTED.md) |
272
+ | **Commands** | [docs/COMMANDS.md](docs/COMMANDS.md) |
273
+ | **FAQ** | [docs/FAQ.md](docs/FAQ.md) |
274
+ | **Configuration** | [docs/CONFIGURATION.md](docs/CONFIGURATION.md) |
275
+ | **Usage Examples** | [docs/USAGE_EXAMPLES.md](docs/USAGE_EXAMPLES.md) |
276
+ | **Performance** | [docs/PERFORMANCE.md](docs/PERFORMANCE.md) |
277
+ | **Troubleshooting** | [docs/TROUBLESHOOTING.md](docs/TROUBLESHOOTING.md) |
278
+ | **CI/CD Setup** | [docs/CI_CD_INTEGRATION.md](docs/CI_CD_INTEGRATION.md) |
279
+ | **Developer Guide** | [docs/DEVELOPER_GUIDE.md](docs/DEVELOPER_GUIDE.md) |
280
+
281
+ ---
282
+
283
+ ## 💡 Quick Tips
284
+
285
+ - 🎯 **First time?** Start with [Getting Started Guide](docs/GETTING_STARTED.md)
286
+ - ⚡ **Slow?** Add `--cache --workers 8` for parallel processing
287
+ - 🐛 **Issues?** Check [Troubleshooting Guide](docs/TROUBLESHOOTING.md)
288
+ - ❓ **Questions?** See [FAQ](docs/FAQ.md)
289
+ - 📖 **Need help?** Run `lf-releng-project-reporting --help`
290
+ - 🔍 **Developing templates?** Run `python scripts/audit_templates.py` to verify all field accesses
291
+
292
+ ---
293
+
294
+ ## 🛠️ Development Scripts
295
+
296
+ ### Template Audit Script
297
+
298
+ ```bash
299
+ python scripts/audit_templates.py
300
+ ```text
301
+
302
+ This script performs a comprehensive audit of all Jinja2 templates to:
303
+
304
+ - Extract all field accesses from templates (e.g., `repo.field`, `org.field`)
305
+ - Analyze context builders to see what fields they provide
306
+ - Identify mismatches that could cause "Undefined variable" errors at runtime
307
+
308
+ **When to use:**
309
+
310
+ - Before committing template changes
311
+ - After modifying context builders
312
+ - When debugging template rendering errors
313
+ - During code review to verify template correctness
314
+
315
+ **Output:**
316
+
317
+ - ✅ **Green checkmarks** - All required fields present
318
+ - ⚠️ **Warnings** - Extra fields exist (safe, unused)
319
+ - ❌ **Red errors** - Missing fields that will cause runtime failures
320
+
321
+ **Example output:**
322
+
323
+ ```text
324
+ ================================================================================
325
+ TEMPLATE FIELD ACCESS AUDIT
326
+ ================================================================================
327
+
328
+ 📄 html/sections/summary.html.j2
329
+ summary:
330
+ - active_count
331
+ - current_count
332
+ - repositories_analyzed
333
+
334
+ ✅ No critical issues found!
335
+ Extra fields are safe - they're unused.
336
+ ```text
337
+
338
+ ---
339
+
340
+ ## 🤝 Support
341
+
342
+ - **Documentation**: [Complete Index](docs/INDEX.md)
343
+ - **Issues**: [GitHub Issues](https://github.com/lfreleng-actions/project-reporting-tool/issues)
344
+
345
+ ---
346
+
347
+ ## 📜 License
348
+
349
+ Apache-2.0 License - Copyright 2025 The Linux Foundation
350
+
351
+ ---