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.
- {repoauditor-0.2.38 → repoauditor-0.2.40}/DEVELOPMENT.md +19 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/PKG-INFO +1 -1
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/ExecuteModules.py +11 -6
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Impl/ParallelSequentialProcessor.py +1 -1
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Module.py +20 -4
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Query.py +5 -4
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Requirement.py +10 -1
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/__init__.py +1 -1
- {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/CommandLineProcessor_UnitTest.py +1 -3
- {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/ExecuteModules_UnitTest.py +4 -3
- {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Module_UnitTest.py +64 -3
- {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/GitHubCustomization/GitHubCustomization_UnitTest.py +2 -1
- {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/GitHubCustomization_EndToEndTest.py +2 -3
- repoauditor-0.2.40/tests/Plugins/GitHubModule/GitHubSession_UnitTest.py +89 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/GitHubRuleset_EndToEndTest.py +2 -3
- repoauditor-0.2.40/tests/Plugins/GitHubRulesets/EnableRulesetRequirementImpl_UnitTest.py +104 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/GitHub_EndToEndTest.py +1 -4
- {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/__snapshots__/GitHub_EndToEndTest.ambr +1583 -1583
- {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/utilities.py +0 -1
- repoauditor-0.2.38/tests/Plugins/GitHubModule/GitHubSession_UnitTest.py +0 -48
- {repoauditor-0.2.38 → repoauditor-0.2.40}/.copier-answers.yml +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/.github/CODEOWNERS +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/.github/ISSUE_TEMPLATE/custom.md +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/.github/actions/release_impl/action.yml +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/.github/pull_request_template.md +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/.github/release_sources.yaml +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/.github/workflows/CICD.yml +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/.github/workflows/CICD_impl.yml +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/.github/workflows/EndToEnd.yml +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/.github/workflows/codeql.yml +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/.gitignore +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/.pre-commit-config.yaml +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/.python-version +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/CODE_OF_CONDUCT.md +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/CONTRIBUTING.md +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/GOVERNANCE.md +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/LICENSE +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/MAINTAINERS.md +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/README.md +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/SECURITY.md +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/minisign_key.pub +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/pyproject.toml +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/AutoGitSemVer.yaml +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/CommandLineProcessor.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Display.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/EntryPoint.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Impl/__init__.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugin.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/ClassicBranchProtectionQuery.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/ClassicBranchProtectionRequirements/AllowDeletions.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/ClassicBranchProtectionRequirements/AllowForcePushes.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/ClassicBranchProtectionRequirements/DismissStalePullRequestApprovals.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/ClassicBranchProtectionRequirements/DoNotAllowBypassSettings.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/ClassicBranchProtectionRequirements/EnsureStatusChecks.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/ClassicBranchProtectionRequirements/Impl/ClassicEnableRequirementImpl.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/ClassicBranchProtectionRequirements/Impl/ClassicValueRequirementImpl.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/ClassicBranchProtectionRequirements/Impl/__init__.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/ClassicBranchProtectionRequirements/RequireApprovalMostRecentPush.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/ClassicBranchProtectionRequirements/RequireApprovals.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/ClassicBranchProtectionRequirements/RequireCodeOwnerReview.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/ClassicBranchProtectionRequirements/RequireConversationResolution.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/ClassicBranchProtectionRequirements/RequireLinearHistory.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/ClassicBranchProtectionRequirements/RequirePullRequests.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/ClassicBranchProtectionRequirements/RequireSignedCommits.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/ClassicBranchProtectionRequirements/RequireStatusChecksToPass.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/ClassicBranchProtectionRequirements/RequireUpToDateBranches.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/ClassicBranchProtectionRequirements/__init__.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/DefaultBranchQuery.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/DefaultBranchQueryRequirements/Protected.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/DefaultBranchQueryRequirements/__init__.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/Impl/Common.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/Impl/EnableRequirementImpl.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/Impl/ValueRequirementImpl.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/Impl/__init__.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/Module.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/StandardQuery.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/StandardQueryRequirements/AutoMerge.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/StandardQueryRequirements/DefaultBranch.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/StandardQueryRequirements/DeleteHeadBranches.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/StandardQueryRequirements/DependabotSecurityUpdates.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/StandardQueryRequirements/Description.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/StandardQueryRequirements/Impl/StandardEnableRequirementImpl.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/StandardQueryRequirements/Impl/StandardValueRequirementImpl.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/StandardQueryRequirements/Impl/__init__.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/StandardQueryRequirements/License.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/StandardQueryRequirements/MergeCommit.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/StandardQueryRequirements/MergeCommitMessage.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/StandardQueryRequirements/Private.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/StandardQueryRequirements/RebaseMergeCommit.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/StandardQueryRequirements/SecretScanning.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/StandardQueryRequirements/SecretScanningPushProtection.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/StandardQueryRequirements/SquashCommitMerge.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/StandardQueryRequirements/SquashMergeCommitMessage.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/StandardQueryRequirements/SuggestUpdatingPullRequestBranches.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/StandardQueryRequirements/SupportDiscussions.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/StandardQueryRequirements/SupportIssues.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/StandardQueryRequirements/SupportProjects.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/StandardQueryRequirements/SupportWikis.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/StandardQueryRequirements/TemplateRepository.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/StandardQueryRequirements/WebCommitSignoff.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/StandardQueryRequirements/__init__.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHub/__init__.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHubBase/Module.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHubBase/__init__.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHubCustomization/CustomizationQuery.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHubCustomization/Impl/ExistsRequirementImpl.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHubCustomization/Impl/__init__.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHubCustomization/Module.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHubCustomization/Requirements/CodeOwners.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHubCustomization/Requirements/Contributing.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHubCustomization/Requirements/IssueTemplates.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHubCustomization/Requirements/PullRequestTemplates.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHubCustomization/Requirements/SecurityPolicy.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHubCustomization/Requirements/__init__.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHubCustomization/__init__.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHubCustomizationPlugin.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHubPlugin.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHubRulesets/Impl/EnableRulesetRequirementImpl.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHubRulesets/Impl/__init__.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHubRulesets/Module.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHubRulesets/Requirements/RequirePullRequests.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHubRulesets/Requirements/RequireSignedCommits.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHubRulesets/Requirements/RequireStatusChecks.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHubRulesets/Requirements/__init__.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHubRulesets/RulesetQuery.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHubRulesets/__init__.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/GitHubRulesetsPlugin.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Plugins/__init__.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/py.typed +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/src/github_auditor/__init__.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/EntryPoint_UnitTest.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugin_UnitTest.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/GitHubCustomization/CutomizationQuery_UnitTest.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/GitHubCustomization/ExistsRequirementImpl_UnitTest.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/GitHubModule/ClassicBranchProtectionQuery_UnitTest.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/GitHubModule/ClassicBranchProtectionRequirements/DismissStalePullRequestApprovals_UnitTest.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/GitHubModule/ClassicBranchProtectionRequirements/EnsureStatusChecks_UnitTest.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/GitHubModule/ClassicBranchProtectionRequirements/RequireApprovalMostRecentPush_UnitTest.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/GitHubModule/ClassicBranchProtectionRequirements/RequireApprovals_UnitTest.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/GitHubModule/ClassicBranchProtectionRequirements/RequireCodeOwnerReview_UnitTest.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/GitHubModule/ClassicBranchProtectionRequirements/RequireUpToDateBranches_UnitTest.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/GitHubModule/ClassicValueRequirementImpl_UnitTest.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/GitHubModule/DefaultBranchQueryRequirements/Protected_UnitTest.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/GitHubModule/DefaultBranchQuery_UnitTest.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/GitHubModule/GitHubModule_UnitTest.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/GitHubModule/StandardQueryRequirements/DependabotSecurityUpdates_UnitTest.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/GitHubModule/StandardQueryRequirements/Description_UnitTest.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/GitHubModule/StandardQueryRequirements/License_UnitTest.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/GitHubModule/StandardQueryRequirements/MergeCommitMessage_UnitTest.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/GitHubModule/StandardQueryRequirements/Private_UnitTest.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/GitHubModule/StandardQueryRequirements/SecretScanningPushProtection_UnitTest.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/GitHubModule/StandardQueryRequirements/SecretScanning_UnitTest.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/GitHubModule/StandardQueryRequirements/SquashMergeCommitMessage_UnitTest.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/GitHubModule/StandardQuery_UnitTest.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/GitHubModule/ValueRequrementImpl_UnitTest.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/GitHubModule/fixtures.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/GitHubRulesets/GitHubRuleset_UnitTest.py +2 -2
- {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/GitHubRulesets/RulsesetQuery_UnitTest.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/__snapshots__/GitHubCustomization_EndToEndTest.ambr +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/__snapshots__/GitHubRuleset_EndToEndTest.ambr +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Plugins/conftest.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Query_UnitTest.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/Requirement_UnitTest.py +0 -0
- {repoauditor-0.2.38 → repoauditor-0.2.40}/tests/__snapshots__/ExecuteModules_UnitTest.ambr +0 -0
- {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
|
|
@@ -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 =
|
|
82
|
+
return_code = ReturnCode.SUCCESS
|
|
83
|
+
return_msg = ""
|
|
80
84
|
|
|
81
85
|
if not all_eval_infos:
|
|
82
|
-
return
|
|
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
|
|
100
|
+
return ReturnCode.ERROR, "errors were encountered"
|
|
96
101
|
|
|
97
102
|
if result == EvaluateResult.Warning:
|
|
98
|
-
return_code =
|
|
103
|
+
return_code, return_msg = ReturnCode.WARNING, "warnings were encountered"
|
|
99
104
|
|
|
100
|
-
return return_code,
|
|
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
|
|
{repoauditor-0.2.38 → repoauditor-0.2.40}/src/RepoAuditor/Impl/ParallelSequentialProcessor.py
RENAMED
|
@@ -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
|
-
|
|
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 =
|
|
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 =
|
|
191
|
+
return_code = ReturnCode.ERROR
|
|
179
192
|
break
|
|
180
193
|
|
|
181
194
|
if evaluate_info.result == EvaluateResult.Warning:
|
|
182
|
-
return_code =
|
|
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 =
|
|
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 =
|
|
105
|
+
return_code = ReturnCode.ERROR
|
|
105
106
|
elif result_info.result == EvaluateResult.Warning:
|
|
106
107
|
status_info.num_warning += 1
|
|
107
|
-
return_code =
|
|
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."""
|
|
@@ -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! (
|
|
332
|
-
DONE! (
|
|
333
|
-
DONE! (
|
|
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
|
-
|
|
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
|
# ----------------------------------------------------------------------
|
|
@@ -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
|
|