RepoAuditor 0.2.38__tar.gz → 0.2.40__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 (168) hide show
  1. {repoauditor-0.2.38 → repoauditor-0.2.40}/DEVELOPMENT.md +19 -0
  2. {repoauditor-0.2.38 → repoauditor-0.2.40}/PKG-INFO +1 -1
  3. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/ExecuteModules.py +11 -6
  4. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Impl/ParallelSequentialProcessor.py +1 -1
  5. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Module.py +20 -4
  6. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Query.py +5 -4
  7. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Requirement.py +10 -1
  8. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/__init__.py +1 -1
  9. {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/CommandLineProcessor_UnitTest.py +1 -3
  10. {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/ExecuteModules_UnitTest.py +4 -3
  11. {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Module_UnitTest.py +64 -3
  12. {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/GitHubCustomization/GitHubCustomization_UnitTest.py +2 -1
  13. {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/GitHubCustomization_EndToEndTest.py +2 -3
  14. repoauditor-0.2.40/tests/Plugins/GitHubModule/GitHubSession_UnitTest.py +89 -0
  15. {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/GitHubRuleset_EndToEndTest.py +2 -3
  16. repoauditor-0.2.40/tests/Plugins/GitHubRulesets/EnableRulesetRequirementImpl_UnitTest.py +104 -0
  17. {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/GitHub_EndToEndTest.py +1 -4
  18. {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/__snapshots__/GitHub_EndToEndTest.ambr +1583 -1583
  19. {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/utilities.py +0 -1
  20. repoauditor-0.2.38/tests/Plugins/GitHubModule/GitHubSession_UnitTest.py +0 -48
  21. {repoauditor-0.2.38 → repoauditor-0.2.40}/.copier-answers.yml +0 -0
  22. {repoauditor-0.2.38 → repoauditor-0.2.40}/.github/CODEOWNERS +0 -0
  23. {repoauditor-0.2.38 → repoauditor-0.2.40}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  24. {repoauditor-0.2.38 → repoauditor-0.2.40}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  25. {repoauditor-0.2.38 → repoauditor-0.2.40}/.github/ISSUE_TEMPLATE/custom.md +0 -0
  26. {repoauditor-0.2.38 → repoauditor-0.2.40}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  27. {repoauditor-0.2.38 → repoauditor-0.2.40}/.github/actions/release_impl/action.yml +0 -0
  28. {repoauditor-0.2.38 → repoauditor-0.2.40}/.github/pull_request_template.md +0 -0
  29. {repoauditor-0.2.38 → repoauditor-0.2.40}/.github/release_sources.yaml +0 -0
  30. {repoauditor-0.2.38 → repoauditor-0.2.40}/.github/workflows/CICD.yml +0 -0
  31. {repoauditor-0.2.38 → repoauditor-0.2.40}/.github/workflows/CICD_impl.yml +0 -0
  32. {repoauditor-0.2.38 → repoauditor-0.2.40}/.github/workflows/EndToEnd.yml +0 -0
  33. {repoauditor-0.2.38 → repoauditor-0.2.40}/.github/workflows/codeql.yml +0 -0
  34. {repoauditor-0.2.38 → repoauditor-0.2.40}/.gitignore +0 -0
  35. {repoauditor-0.2.38 → repoauditor-0.2.40}/.pre-commit-config.yaml +0 -0
  36. {repoauditor-0.2.38 → repoauditor-0.2.40}/.python-version +0 -0
  37. {repoauditor-0.2.38 → repoauditor-0.2.40}/CODE_OF_CONDUCT.md +0 -0
  38. {repoauditor-0.2.38 → repoauditor-0.2.40}/CONTRIBUTING.md +0 -0
  39. {repoauditor-0.2.38 → repoauditor-0.2.40}/GOVERNANCE.md +0 -0
  40. {repoauditor-0.2.38 → repoauditor-0.2.40}/LICENSE +0 -0
  41. {repoauditor-0.2.38 → repoauditor-0.2.40}/MAINTAINERS.md +0 -0
  42. {repoauditor-0.2.38 → repoauditor-0.2.40}/README.md +0 -0
  43. {repoauditor-0.2.38 → repoauditor-0.2.40}/SECURITY.md +0 -0
  44. {repoauditor-0.2.38 → repoauditor-0.2.40}/minisign_key.pub +0 -0
  45. {repoauditor-0.2.38 → repoauditor-0.2.40}/pyproject.toml +0 -0
  46. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/AutoGitSemVer.yaml +0 -0
  47. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/CommandLineProcessor.py +0 -0
  48. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Display.py +0 -0
  49. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/EntryPoint.py +0 -0
  50. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Impl/__init__.py +0 -0
  51. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugin.py +0 -0
  52. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/ClassicBranchProtectionQuery.py +0 -0
  53. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/ClassicBranchProtectionRequirements/AllowDeletions.py +0 -0
  54. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/ClassicBranchProtectionRequirements/AllowForcePushes.py +0 -0
  55. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/ClassicBranchProtectionRequirements/DismissStalePullRequestApprovals.py +0 -0
  56. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/ClassicBranchProtectionRequirements/DoNotAllowBypassSettings.py +0 -0
  57. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/ClassicBranchProtectionRequirements/EnsureStatusChecks.py +0 -0
  58. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/ClassicBranchProtectionRequirements/Impl/ClassicEnableRequirementImpl.py +0 -0
  59. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/ClassicBranchProtectionRequirements/Impl/ClassicValueRequirementImpl.py +0 -0
  60. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/ClassicBranchProtectionRequirements/Impl/__init__.py +0 -0
  61. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/ClassicBranchProtectionRequirements/RequireApprovalMostRecentPush.py +0 -0
  62. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/ClassicBranchProtectionRequirements/RequireApprovals.py +0 -0
  63. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/ClassicBranchProtectionRequirements/RequireCodeOwnerReview.py +0 -0
  64. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/ClassicBranchProtectionRequirements/RequireConversationResolution.py +0 -0
  65. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/ClassicBranchProtectionRequirements/RequireLinearHistory.py +0 -0
  66. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/ClassicBranchProtectionRequirements/RequirePullRequests.py +0 -0
  67. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/ClassicBranchProtectionRequirements/RequireSignedCommits.py +0 -0
  68. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/ClassicBranchProtectionRequirements/RequireStatusChecksToPass.py +0 -0
  69. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/ClassicBranchProtectionRequirements/RequireUpToDateBranches.py +0 -0
  70. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/ClassicBranchProtectionRequirements/__init__.py +0 -0
  71. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/DefaultBranchQuery.py +0 -0
  72. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/DefaultBranchQueryRequirements/Protected.py +0 -0
  73. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/DefaultBranchQueryRequirements/__init__.py +0 -0
  74. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/Impl/Common.py +0 -0
  75. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/Impl/EnableRequirementImpl.py +0 -0
  76. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/Impl/ValueRequirementImpl.py +0 -0
  77. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/Impl/__init__.py +0 -0
  78. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/Module.py +0 -0
  79. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/StandardQuery.py +0 -0
  80. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/StandardQueryRequirements/AutoMerge.py +0 -0
  81. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/StandardQueryRequirements/DefaultBranch.py +0 -0
  82. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/StandardQueryRequirements/DeleteHeadBranches.py +0 -0
  83. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/StandardQueryRequirements/DependabotSecurityUpdates.py +0 -0
  84. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/StandardQueryRequirements/Description.py +0 -0
  85. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/StandardQueryRequirements/Impl/StandardEnableRequirementImpl.py +0 -0
  86. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/StandardQueryRequirements/Impl/StandardValueRequirementImpl.py +0 -0
  87. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/StandardQueryRequirements/Impl/__init__.py +0 -0
  88. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/StandardQueryRequirements/License.py +0 -0
  89. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/StandardQueryRequirements/MergeCommit.py +0 -0
  90. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/StandardQueryRequirements/MergeCommitMessage.py +0 -0
  91. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/StandardQueryRequirements/Private.py +0 -0
  92. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/StandardQueryRequirements/RebaseMergeCommit.py +0 -0
  93. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/StandardQueryRequirements/SecretScanning.py +0 -0
  94. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/StandardQueryRequirements/SecretScanningPushProtection.py +0 -0
  95. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/StandardQueryRequirements/SquashCommitMerge.py +0 -0
  96. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/StandardQueryRequirements/SquashMergeCommitMessage.py +0 -0
  97. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/StandardQueryRequirements/SuggestUpdatingPullRequestBranches.py +0 -0
  98. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/StandardQueryRequirements/SupportDiscussions.py +0 -0
  99. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/StandardQueryRequirements/SupportIssues.py +0 -0
  100. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/StandardQueryRequirements/SupportProjects.py +0 -0
  101. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/StandardQueryRequirements/SupportWikis.py +0 -0
  102. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/StandardQueryRequirements/TemplateRepository.py +0 -0
  103. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/StandardQueryRequirements/WebCommitSignoff.py +0 -0
  104. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/StandardQueryRequirements/__init__.py +0 -0
  105. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/__init__.py +0 -0
  106. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHubBase/Module.py +0 -0
  107. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHubBase/__init__.py +0 -0
  108. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHubCustomization/CustomizationQuery.py +0 -0
  109. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHubCustomization/Impl/ExistsRequirementImpl.py +0 -0
  110. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHubCustomization/Impl/__init__.py +0 -0
  111. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHubCustomization/Module.py +0 -0
  112. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHubCustomization/Requirements/CodeOwners.py +0 -0
  113. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHubCustomization/Requirements/Contributing.py +0 -0
  114. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHubCustomization/Requirements/IssueTemplates.py +0 -0
  115. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHubCustomization/Requirements/PullRequestTemplates.py +0 -0
  116. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHubCustomization/Requirements/SecurityPolicy.py +0 -0
  117. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHubCustomization/Requirements/__init__.py +0 -0
  118. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHubCustomization/__init__.py +0 -0
  119. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHubCustomizationPlugin.py +0 -0
  120. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHubPlugin.py +0 -0
  121. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHubRulesets/Impl/EnableRulesetRequirementImpl.py +0 -0
  122. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHubRulesets/Impl/__init__.py +0 -0
  123. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHubRulesets/Module.py +0 -0
  124. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHubRulesets/Requirements/RequirePullRequests.py +0 -0
  125. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHubRulesets/Requirements/RequireSignedCommits.py +0 -0
  126. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHubRulesets/Requirements/RequireStatusChecks.py +0 -0
  127. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHubRulesets/Requirements/__init__.py +0 -0
  128. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHubRulesets/RulesetQuery.py +0 -0
  129. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHubRulesets/__init__.py +0 -0
  130. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHubRulesetsPlugin.py +0 -0
  131. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/__init__.py +0 -0
  132. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/py.typed +0 -0
  133. {repoauditor-0.2.38 → repoauditor-0.2.40}/src/github_auditor/__init__.py +0 -0
  134. {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/EntryPoint_UnitTest.py +0 -0
  135. {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugin_UnitTest.py +0 -0
  136. {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/GitHubCustomization/CutomizationQuery_UnitTest.py +0 -0
  137. {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/GitHubCustomization/ExistsRequirementImpl_UnitTest.py +0 -0
  138. {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/GitHubModule/ClassicBranchProtectionQuery_UnitTest.py +0 -0
  139. {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/GitHubModule/ClassicBranchProtectionRequirements/DismissStalePullRequestApprovals_UnitTest.py +0 -0
  140. {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/GitHubModule/ClassicBranchProtectionRequirements/EnsureStatusChecks_UnitTest.py +0 -0
  141. {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/GitHubModule/ClassicBranchProtectionRequirements/RequireApprovalMostRecentPush_UnitTest.py +0 -0
  142. {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/GitHubModule/ClassicBranchProtectionRequirements/RequireApprovals_UnitTest.py +0 -0
  143. {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/GitHubModule/ClassicBranchProtectionRequirements/RequireCodeOwnerReview_UnitTest.py +0 -0
  144. {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/GitHubModule/ClassicBranchProtectionRequirements/RequireUpToDateBranches_UnitTest.py +0 -0
  145. {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/GitHubModule/ClassicValueRequirementImpl_UnitTest.py +0 -0
  146. {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/GitHubModule/DefaultBranchQueryRequirements/Protected_UnitTest.py +0 -0
  147. {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/GitHubModule/DefaultBranchQuery_UnitTest.py +0 -0
  148. {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/GitHubModule/GitHubModule_UnitTest.py +0 -0
  149. {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/GitHubModule/StandardQueryRequirements/DependabotSecurityUpdates_UnitTest.py +0 -0
  150. {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/GitHubModule/StandardQueryRequirements/Description_UnitTest.py +0 -0
  151. {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/GitHubModule/StandardQueryRequirements/License_UnitTest.py +0 -0
  152. {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/GitHubModule/StandardQueryRequirements/MergeCommitMessage_UnitTest.py +0 -0
  153. {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/GitHubModule/StandardQueryRequirements/Private_UnitTest.py +0 -0
  154. {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/GitHubModule/StandardQueryRequirements/SecretScanningPushProtection_UnitTest.py +0 -0
  155. {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/GitHubModule/StandardQueryRequirements/SecretScanning_UnitTest.py +0 -0
  156. {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/GitHubModule/StandardQueryRequirements/SquashMergeCommitMessage_UnitTest.py +0 -0
  157. {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/GitHubModule/StandardQuery_UnitTest.py +0 -0
  158. {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/GitHubModule/ValueRequrementImpl_UnitTest.py +0 -0
  159. {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/GitHubModule/fixtures.py +0 -0
  160. {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/GitHubRulesets/GitHubRuleset_UnitTest.py +2 -2
  161. {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/GitHubRulesets/RulsesetQuery_UnitTest.py +0 -0
  162. {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/__snapshots__/GitHubCustomization_EndToEndTest.ambr +0 -0
  163. {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/__snapshots__/GitHubRuleset_EndToEndTest.ambr +0 -0
  164. {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/conftest.py +0 -0
  165. {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Query_UnitTest.py +0 -0
  166. {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Requirement_UnitTest.py +0 -0
  167. {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/__snapshots__/ExecuteModules_UnitTest.ambr +0 -0
  168. {repoauditor-0.2.38 → repoauditor-0.2.40}/uv.lock +0 -0
@@ -1,3 +1,22 @@
1
+ # Fork setup
2
+
3
+ | Step | Command Line | Additional Information |
4
+ | --- | --- | --- |
5
+ | 1. Fork the repository | -- | https://github.com/gt-sse-center/RepoAuditor/fork |
6
+ | 2. Create a PAT for your forked repository | -- | See [PAT setup instructions](README.md#personal-access-token-pat) |
7
+ | 3. Sync the `test-GitHubCustomization` branch | see instructions below | In the web interface, select "New Branch", then choose `gt-sse-center/RepoAuditor` and `test-GitHubCustomization` as source, and enter `test-GitHubCustomization` as branch name. |
8
+ | 4. Update your forked repository settings to match RepoAuditor's defaults | -- |
9
+
10
+
11
+ To sync the `test-GitHubCustomization` branch using the command line:
12
+ ```bash
13
+ git clone <REPOAUDITOR_FORK_URL>
14
+ git remote add upstream https://github.com/gt-sse-center/RepoAuditor
15
+ git fetch upstream
16
+ git checkout -b test-GitHubCustomization upstream/test-GitHubCustomization
17
+ git push origin test-GitHubCustomization
18
+ ```
19
+
1
20
  # Local Development
2
21
 
3
22
  ## Enlistment
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: RepoAuditor
3
- Version: 0.2.38
3
+ Version: 0.2.40
4
4
  Summary: Add your description here
5
5
  Project-URL: Homepage, https://github.com/gt-sse-center/RepoAuditor
6
6
  Project-URL: Documentation, https://github.com/gt-sse-center/RepoAuditor
@@ -19,6 +19,7 @@ from dbrownell_Common.Streams.DoneManager import DoneManager # type: ignore[imp
19
19
  from rich.progress import Progress, TimeElapsedColumn
20
20
 
21
21
  from RepoAuditor.Module import EvaluateResult, ExecutionStyle, Module, OnStatusFunc
22
+ from RepoAuditor.Requirement import ReturnCode
22
23
 
23
24
 
24
25
  # ----------------------------------------------------------------------
@@ -75,11 +76,14 @@ def CalcResultInfo(
75
76
 
76
77
  Returns a code value indicating success, warning, or error,
77
78
  as well as a string description of the result.
79
+ If the result is a warning or error, return immediately.
80
+ "Does Not Apply" is considered as a success.
78
81
  """
79
- return_code = 0
82
+ return_code = ReturnCode.SUCCESS
83
+ return_msg = ""
80
84
 
81
85
  if not all_eval_infos:
82
- return 0, "module does not apply"
86
+ return ReturnCode.DOESNOTAPPLY, "module does not apply"
83
87
 
84
88
  for eval_infos in all_eval_infos:
85
89
  for eval_info in eval_infos:
@@ -87,17 +91,18 @@ def CalcResultInfo(
87
91
 
88
92
  if result == EvaluateResult.Warning:
89
93
  if eval_info.module.name in warnings_as_errors_module_names:
94
+ # Treat warnings as errors enabled so recast the result type
90
95
  result = EvaluateResult.Error
91
96
  elif eval_info.module.name in ignore_warnings_module_names:
92
97
  continue
93
98
 
94
99
  if result == EvaluateResult.Error:
95
- return -1, "errors were encountered"
100
+ return ReturnCode.ERROR, "errors were encountered"
96
101
 
97
102
  if result == EvaluateResult.Warning:
98
- return_code = 1
103
+ return_code, return_msg = ReturnCode.WARNING, "warnings were encountered"
99
104
 
100
- return return_code, "" if return_code == 0 else "warnings were encountered"
105
+ return return_code, return_msg
101
106
 
102
107
 
103
108
  def Execute(
@@ -267,7 +272,7 @@ def Execute(
267
272
 
268
273
  for results in all_results:
269
274
  if results is None:
270
- continue
275
+ continue # pragma: no cover
271
276
 
272
277
  final_results.append(list(itertools.chain(*results)))
273
278
 
@@ -112,7 +112,7 @@ def _Impl(
112
112
 
113
113
  for transform_result in transform_results:
114
114
  if transform_result is not None and isinstance(transform_result, Exception):
115
- raise transform_result
115
+ raise transform_result # pragma: no cover
116
116
 
117
117
  for sequential_index, (results_index, item) in enumerate(sequential):
118
118
  with dm.Nested(
@@ -15,6 +15,7 @@ from dbrownell_Common.TyperEx import TypeDefinitionItemType # type: ignore[impo
15
15
 
16
16
  from RepoAuditor.Impl.ParallelSequentialProcessor import ParallelSequentialProcessor
17
17
  from RepoAuditor.Query import EvaluateResult, ExecutionStyle, OnStatusFunc, Query, StatusInfo
18
+ from RepoAuditor.Requirement import ReturnCode
18
19
 
19
20
 
20
21
  # ----------------------------------------------------------------------
@@ -133,7 +134,19 @@ class Module(ABC):
133
134
  status_info.num_does_not_apply += len(query.requirements)
134
135
 
135
136
  status_func(*status_info.__dict__.values())
136
- return 0, []
137
+ # Since query returned None, it means it was not valid.
138
+ return 2, [
139
+ Module.EvaluateInfo(
140
+ result=EvaluateResult.DoesNotApply,
141
+ context=f"{query.name} did not return valid data.",
142
+ resolution="",
143
+ rationale="",
144
+ requirement=requirement,
145
+ query=query,
146
+ module=self,
147
+ )
148
+ for requirement in query.requirements
149
+ ]
137
150
 
138
151
  prev_query_status_info = StatusInfo()
139
152
 
@@ -171,15 +184,18 @@ class Module(ABC):
171
184
  max_num_threads=max_num_threads,
172
185
  )
173
186
 
174
- return_code = 0
187
+ return_code = ReturnCode.SUCCESS
175
188
 
176
189
  for evaluate_info in evaluate_infos:
177
190
  if evaluate_info.result == EvaluateResult.Error:
178
- return_code = -1
191
+ return_code = ReturnCode.ERROR
179
192
  break
180
193
 
181
194
  if evaluate_info.result == EvaluateResult.Warning:
182
- return_code = 1
195
+ return_code = ReturnCode.WARNING
196
+
197
+ if evaluate_info.result == EvaluateResult.DoesNotApply:
198
+ return_code = ReturnCode.DOESNOTAPPLY
183
199
 
184
200
  # Cleanup any resources created during the query
185
201
  query.Cleanup(query_data)
@@ -12,7 +12,7 @@ from dataclasses import dataclass
12
12
  from typing import Any, Optional, Protocol
13
13
 
14
14
  from RepoAuditor.Impl.ParallelSequentialProcessor import ParallelSequentialProcessor
15
- from RepoAuditor.Requirement import EvaluateResult, ExecutionStyle, Requirement
15
+ from RepoAuditor.Requirement import EvaluateResult, ExecutionStyle, Requirement, ReturnCode
16
16
 
17
17
 
18
18
  # ----------------------------------------------------------------------
@@ -90,21 +90,22 @@ class Query(ABC):
90
90
  query_data,
91
91
  requirement_args.get(requirement.name, {}),
92
92
  )
93
- return_code = 0
93
+ return_code = ReturnCode.SUCCESS
94
94
 
95
95
  with status_info_lock:
96
96
  status_info.num_completed += 1
97
97
 
98
98
  if result_info.result == EvaluateResult.DoesNotApply:
99
99
  status_info.num_does_not_apply += 1
100
+ return_code = ReturnCode.DOESNOTAPPLY
100
101
  elif result_info.result == EvaluateResult.Success:
101
102
  status_info.num_success += 1
102
103
  elif result_info.result == EvaluateResult.Error:
103
104
  status_info.num_error += 1
104
- return_code = -1
105
+ return_code = ReturnCode.ERROR
105
106
  elif result_info.result == EvaluateResult.Warning:
106
107
  status_info.num_warning += 1
107
- return_code = 1
108
+ return_code = ReturnCode.WARNING
108
109
  else:
109
110
  raise RuntimeError(result_info.result) # pragma: no cover
110
111
 
@@ -8,7 +8,7 @@
8
8
 
9
9
  from abc import ABC, abstractmethod
10
10
  from dataclasses import dataclass, field
11
- from enum import Enum, auto
11
+ from enum import Enum, IntEnum, auto
12
12
  from typing import Any, Optional
13
13
 
14
14
  from dbrownell_Common.TyperEx import TypeDefinitionItemType # type: ignore[import-untyped]
@@ -27,6 +27,15 @@ class EvaluateResult(Enum):
27
27
  Error = auto()
28
28
 
29
29
 
30
+ class ReturnCode(IntEnum):
31
+ """Various return codes for operations, indicating success, failure, warning, etc."""
32
+
33
+ SUCCESS = 0
34
+ ERROR = -1
35
+ WARNING = 1
36
+ DOESNOTAPPLY = 2
37
+
38
+
30
39
  # ----------------------------------------------------------------------
31
40
  class Requirement(ABC):
32
41
  """A single requirement that can be evaluated against a set of data."""
@@ -2,4 +2,4 @@ APP_NAME = "RepoAuditor"
2
2
 
3
3
  # Note that the default value below will be used until the value
4
4
  # here is explicitly updated by the Continuous Integration system.
5
- __version__ = "0.2.38"
5
+ __version__ = "0.2.40"
@@ -8,12 +8,10 @@
8
8
 
9
9
  import re
10
10
  import textwrap
11
-
12
- from typing import cast, Optional
11
+ from typing import Optional, cast
13
12
  from unittest.mock import patch
14
13
 
15
14
  import pytest
16
-
17
15
  from dbrownell_Common.TestHelpers.StreamTestHelpers import GenerateDoneManagerAndContent
18
16
  from dbrownell_Common.Types import override
19
17
 
@@ -178,6 +178,7 @@ class TestExecute:
178
178
  (EvaluateResult.Warning, 1, False, False),
179
179
  (EvaluateResult.Warning, -1, True, False),
180
180
  (EvaluateResult.Warning, 0, False, True),
181
+ (EvaluateResult.DoesNotApply, 0, False, False),
181
182
  ],
182
183
  )
183
184
  def test_NotSuccess(self, data):
@@ -328,9 +329,9 @@ class TestExecute:
328
329
  Processing 'MyModule' (1 of 1)...
329
330
 
330
331
 
331
- DONE! (0, <scrubbed duration>)
332
- DONE! (0, <scrubbed duration>)
333
- DONE! (0, <scrubbed duration>)
332
+ DONE! (2, <scrubbed duration>)
333
+ DONE! (2, <scrubbed duration>)
334
+ DONE! (2, <scrubbed duration>)
334
335
  """,
335
336
  )
336
337
 
@@ -7,11 +7,12 @@
7
7
  """Unit test for Module.py"""
8
8
 
9
9
  import copy
10
-
10
+ from typing import Optional, cast
11
11
  from unittest.mock import Mock
12
12
 
13
13
  import pytest
14
-
14
+ from dbrownell_Common.Streams.DoneManager import DoneManager
15
+ from dbrownell_Common.TestHelpers.StreamTestHelpers import GenerateDoneManagerAndContent
15
16
  from dbrownell_Common.Types import override
16
17
 
17
18
  from RepoAuditor.Module import *
@@ -356,7 +357,20 @@ def test_Module(single_threaded):
356
357
  assert results[1][3].module is module
357
358
 
358
359
  # QueryC
359
- assert results[2] == []
360
+ query_c_expected_results = [
361
+ Module.EvaluateInfo(
362
+ result=EvaluateResult.DoesNotApply,
363
+ context="QueryC did not return valid data.",
364
+ rationale="",
365
+ resolution="",
366
+ requirement=requirement,
367
+ query=queryC,
368
+ module=module,
369
+ )
370
+ for requirement in queryC.requirements
371
+ ]
372
+ for idx, result in enumerate(results[2]):
373
+ assert result == query_c_expected_results[idx]
360
374
 
361
375
  # Validate the notifications
362
376
  if single_threaded:
@@ -389,6 +403,53 @@ def test_ModuleNoData():
389
403
  assert initial_data is None
390
404
 
391
405
 
406
+ # ----------------------------------------------------------------------
407
+ def test_Module_SingleParallel():
408
+ """Test parallel execution of the module when only 1 query is present."""
409
+ # Since we have only one query with parallel execution style,
410
+ # it should default to sequential processing.
411
+ module = MyModule(
412
+ "MyModule",
413
+ "The only module",
414
+ ExecutionStyle.Sequential,
415
+ [queryA],
416
+ produce_data=True,
417
+ )
418
+
419
+ status_func = Mock()
420
+
421
+ initial_data = module.GenerateInitialData({})
422
+ results = module.Evaluate(
423
+ initial_data,
424
+ {},
425
+ status_func,
426
+ max_num_threads=1,
427
+ )
428
+ assert results[0][0].result == EvaluateResult.Success
429
+ assert results[0][0].context is None
430
+ assert results[0][0].resolution is None
431
+ assert results[0][0].rationale is None
432
+ assert results[0][0].requirement is requirementA1
433
+ assert results[0][0].query is queryA
434
+ assert results[0][0].module is module
435
+
436
+
437
+ # ----------------------------------------------------------------------
438
+ def test_ProvidedDoneManager():
439
+ """Test for when a DoneManager is provided to the ParallelSequentialProcessor."""
440
+ module = MyModule(
441
+ "MyModule",
442
+ "The only module",
443
+ ExecutionStyle.Sequential,
444
+ [queryA],
445
+ produce_data=True,
446
+ )
447
+ dm_and_sink = GenerateDoneManagerAndContent()
448
+ dm = cast(DoneManager, next(dm_and_sink))
449
+ result = ParallelSequentialProcessor(module.queries, lambda query: (0, []), dm)
450
+ assert isinstance(result, list)
451
+
452
+
392
453
  # ----------------------------------------------------------------------
393
454
  class TestProcessRequriements:
394
455
  # ----------------------------------------------------------------------
@@ -7,9 +7,10 @@
7
7
  """Unit tests for the GitHub Customization Plugin"""
8
8
 
9
9
  import sys
10
- import pluggy
11
10
  from pathlib import Path
12
11
 
12
+ import pluggy
13
+
13
14
  from RepoAuditor import APP_NAME
14
15
  from RepoAuditor.Plugins.GitHubCustomizationPlugin import GetModule
15
16
 
@@ -6,18 +6,17 @@
6
6
  # -------------------------------------------------------------------------------
7
7
  """End-to-end tests for the GitHubCustomization plugin."""
8
8
 
9
- import pytest
10
9
  from pathlib import Path
11
10
 
11
+ import pytest
12
12
  from dbrownell_Common.TestHelpers.StreamTestHelpers import (
13
13
  InitializeStreamCapabilities,
14
14
  )
15
15
  from typer.testing import CliRunner
16
+ from utilities import CheckPATFileExists, GetGithubUrl, ScrubDurationGithuburlAndSpaces
16
17
 
17
18
  from RepoAuditor.EntryPoint import app
18
19
 
19
- from utilities import ScrubDurationGithuburlAndSpaces, GetGithubUrl, CheckPATFileExists
20
-
21
20
  # ----------------------------------------------------------------------
22
21
  pytest.fixture(InitializeStreamCapabilities(), scope="session", autouse=True)
23
22
 
@@ -0,0 +1,89 @@
1
+ # -------------------------------------------------------------------------------
2
+ # |
3
+ # | Copyright (c) 2024 Scientific Software Engineering Center at Georgia Tech
4
+ # | Distributed under the MIT License.
5
+ # |
6
+ # -------------------------------------------------------------------------------
7
+ """Unit tests for GitHubSession"""
8
+
9
+ from pathlib import Path
10
+
11
+ import pytest
12
+ import requests
13
+
14
+ from RepoAuditor.Plugins.GitHubBase.Module import _GitHubSession
15
+
16
+
17
+ @pytest.fixture
18
+ def github_pat(fs):
19
+ """Fixture for GitHub PAT file, which creates a fake PAT file and returns the path."""
20
+ pat_path = Path(__file__).parent / "dummy_github_pat.txt"
21
+ fs.create_file(pat_path, contents="github_path_abcdefghijklmnop")
22
+ return pat_path
23
+
24
+
25
+ def mock_request(
26
+ self,
27
+ method,
28
+ url,
29
+ *args,
30
+ **kwargs,
31
+ ):
32
+ """Mocked request function."""
33
+ r = requests.Response()
34
+ r.status_code = 200
35
+ r.method = method
36
+ r.url = url
37
+ return r
38
+
39
+
40
+ class TestGitHubSession:
41
+ """Unit tests for the _GitHubSession class."""
42
+
43
+ @classmethod
44
+ def setup_class(cls):
45
+ """Setup values for each test."""
46
+ cls.github_url = "https://github.com/gt-sse-center/RepoAuditor"
47
+
48
+ def test_Construct(self, github_pat):
49
+ """Test constructor."""
50
+ session = _GitHubSession(github_url=self.github_url, github_pat=github_pat)
51
+
52
+ assert session.github_url == self.github_url
53
+
54
+ def test_ConstructTrailingSlash(self, github_pat):
55
+ """Test with trailing slash for URL."""
56
+ session = _GitHubSession(github_url=self.github_url + "/", github_pat=github_pat)
57
+
58
+ assert session.github_url == self.github_url
59
+
60
+ def test_InvalidRepository(self, github_pat):
61
+ """Test with invalid repository URL."""
62
+ with pytest.raises(ValueError):
63
+ _GitHubSession(
64
+ github_url="https://github.com/gt-sse-center/RepoAuditor/123", github_pat=github_pat
65
+ )
66
+
67
+ def test_EnterpriseUrl(self, github_pat):
68
+ """Test with enterprise URL."""
69
+ github_enterprise_url = "https://github.gatech.edu/gt-sse-center/RepoAuditor"
70
+ session = _GitHubSession(github_url=github_enterprise_url, github_pat=github_pat)
71
+ assert session.github_url == github_enterprise_url
72
+
73
+ def test_Request(self, github_pat, monkeypatch):
74
+ """Test the _GitHubSession.request method."""
75
+ session = _GitHubSession(github_url=self.github_url, github_pat=github_pat)
76
+
77
+ monkeypatch.setattr(requests.Session, "request", mock_request)
78
+ r = session.request("GET", "test")
79
+
80
+ assert r.url == "https://api.github.com/repos/gt-sse-center/RepoAuditor/test"
81
+
82
+ def test_RequestLeadingSlash(self, github_pat, monkeypatch):
83
+ """Test the _GitHubSession.request method."""
84
+ session = _GitHubSession(github_url=self.github_url, github_pat=github_pat)
85
+
86
+ monkeypatch.setattr(requests.Session, "request", mock_request)
87
+ r = session.request("GET", "/test")
88
+
89
+ assert r.url == "https://api.github.com/repos/gt-sse-center/RepoAuditor/test"
@@ -7,17 +7,16 @@
7
7
  """End-to-end tests for the GitHubRulesets plugin."""
8
8
 
9
9
  from pathlib import Path
10
- import pytest
11
10
 
11
+ import pytest
12
12
  from dbrownell_Common.TestHelpers.StreamTestHelpers import (
13
13
  InitializeStreamCapabilities,
14
14
  )
15
15
  from typer.testing import CliRunner
16
+ from utilities import CheckPATFileExists, GetGithubUrl, ScrubDurationGithuburlAndSpaces
16
17
 
17
18
  from RepoAuditor.EntryPoint import app
18
19
 
19
- from utilities import ScrubDurationGithuburlAndSpaces, GetGithubUrl, CheckPATFileExists
20
-
21
20
  # ----------------------------------------------------------------------
22
21
  pytest.fixture(InitializeStreamCapabilities(), scope="session", autouse=True)
23
22
 
@@ -0,0 +1,104 @@
1
+ # -------------------------------------------------------------------------------
2
+ # |
3
+ # | Copyright (c) 2024 Scientific Software Engineering Center at Georgia Tech
4
+ # | Distributed under the MIT License.
5
+ # |
6
+ # -------------------------------------------------------------------------------
7
+ """Unit tests for the EnableRulesetRequirementImpl requirement implementation."""
8
+
9
+ from RepoAuditor.Plugins.GitHubRulesets.Impl.EnableRulesetRequirementImpl import EnableRulesetRequirementImpl
10
+ from RepoAuditor.Requirement import EvaluateResult
11
+
12
+
13
+ class TestEnableRulesetRequirementImpl:
14
+ """Unit tests for the EnableRulesetRequirementImpl class."""
15
+
16
+ def test_Constructor(self):
17
+ """Test the EnableRulesetRequirementImpl constructor."""
18
+ requirement = EnableRulesetRequirementImpl(
19
+ name="Test Name",
20
+ default_value=False,
21
+ dynamic_arg_name="true",
22
+ github_ruleset_type="Test Ruleset",
23
+ github_ruleset_value="test_ruleset",
24
+ get_configuration_value_func=lambda _: True,
25
+ resolution="Test Resolution",
26
+ rationale="Test rationale",
27
+ )
28
+
29
+ assert requirement.name == "Test Name"
30
+ assert requirement.default_value is False
31
+ assert requirement.dynamic_arg_name == "true"
32
+ assert requirement.github_ruleset_type == "Test Ruleset"
33
+
34
+ def test_Evaluate_DoesNotApply(self):
35
+ """Test the _EvaluateImpl method when dynamic_arg_name is False."""
36
+ requirement = EnableRulesetRequirementImpl(
37
+ name="Test Name",
38
+ default_value=False,
39
+ dynamic_arg_name="true",
40
+ github_ruleset_type="Test Ruleset",
41
+ github_ruleset_value="test_ruleset",
42
+ get_configuration_value_func=lambda _: True,
43
+ resolution="Test Resolution",
44
+ rationale="Test rationale",
45
+ )
46
+ query_data = {}
47
+ requirement_args = {"true": False}
48
+ result = requirement.Evaluate(query_data, requirement_args)
49
+ assert result.result == EvaluateResult.DoesNotApply
50
+
51
+ def test_Evaluate_InvalidRule(self):
52
+ """Test the _EvaluateImpl method when dynamic_arg_name is False."""
53
+ requirement = EnableRulesetRequirementImpl(
54
+ name="Test Name",
55
+ default_value=False,
56
+ dynamic_arg_name="true",
57
+ github_ruleset_type="Test Ruleset",
58
+ github_ruleset_value="test_ruleset",
59
+ get_configuration_value_func=lambda rule: rule.get("type", "") == "valid rule",
60
+ resolution="Test Resolution",
61
+ rationale="Test rationale",
62
+ )
63
+ query_data = {
64
+ "rules": [
65
+ {
66
+ "type": "invalid_rule",
67
+ "ruleset": {
68
+ "name": "Invalid",
69
+ "id": "00",
70
+ },
71
+ },
72
+ ]
73
+ }
74
+ requirement_args = {"true": True}
75
+ result = requirement.Evaluate(query_data, requirement_args)
76
+ assert result.result == EvaluateResult.Error
77
+
78
+ def test_Evaluate_ValidRule(self):
79
+ """Test the _EvaluateImpl method when dynamic_arg_name is False."""
80
+ requirement = EnableRulesetRequirementImpl(
81
+ name="Test Name",
82
+ default_value=False,
83
+ dynamic_arg_name="true",
84
+ github_ruleset_type="Test Ruleset",
85
+ github_ruleset_value="test_ruleset",
86
+ get_configuration_value_func=lambda rule: rule.get("type", "") == "valid_rule",
87
+ resolution="Test Resolution",
88
+ rationale="Test rationale",
89
+ )
90
+ query_data = {
91
+ "rules": [
92
+ {
93
+ "type": "valid_rule",
94
+ "ruleset": {
95
+ "name": "Valid",
96
+ "id": "00",
97
+ },
98
+ }
99
+ ]
100
+ }
101
+ requirement_args = {"true": True}
102
+ result = requirement.Evaluate(query_data, requirement_args)
103
+
104
+ assert result.result == EvaluateResult.Success
@@ -10,17 +10,14 @@ import os
10
10
  from pathlib import Path
11
11
 
12
12
  import pytest
13
-
14
13
  from dbrownell_Common.TestHelpers.StreamTestHelpers import (
15
14
  InitializeStreamCapabilities,
16
15
  )
17
16
  from typer.testing import CliRunner
17
+ from utilities import CheckPATFileExists, GetGithubUrl, ScrubDurationGithuburlAndSpaces
18
18
 
19
19
  from RepoAuditor.EntryPoint import app
20
20
 
21
-
22
- from utilities import ScrubDurationGithuburlAndSpaces, GetGithubUrl, CheckPATFileExists
23
-
24
21
  # ----------------------------------------------------------------------
25
22
  pytest.fixture(InitializeStreamCapabilities(), scope="session", autouse=True)
26
23