openhound-github 0.7.3__tar.gz → 0.8.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.
- {openhound_github-0.7.3 → openhound_github-0.8.0}/PKG-INFO +1 -1
- openhound_github-0.8.0/descriptions/edges/GH_RunsOn.md +24 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_EnterpriseRunner.md +5 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_OrgRunner.md +5 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_RepoRunner.md +5 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_WorkflowJob.md +10 -2
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/schema.json +5 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/kinds/edges.py +1 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/lookup.py +199 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/main.py +6 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/runner.py +5 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/workflow.py +52 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/workflow_job.py +61 -29
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/transforms.py +87 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_runner_models.py +144 -0
- openhound_github-0.8.0/tests/test_workflow_model.py +282 -0
- openhound_github-0.7.3/tests/test_workflow_model.py +0 -147
- {openhound_github-0.7.3 → openhound_github-0.8.0}/.github/CODE_OF_CONDUCT.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/.github/CONTRIBUTING.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/.github/GOVERNANCE.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/.github/GitHub-COC-Header.png +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/.github/GitHub-CONTRIB-Header.png +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/.github/GitHub-GOV-Header.png +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/.github/GitHub-Header.png +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/.github/GitHub-LIC-Header.png +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/.github/GitHub-SEC-Header.png +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/.github/SECURITY.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/.github/SO-Dark.svg +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/.github/SO-FOSS-Dark.svg +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/.github/SO-FOSS-Light.svg +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/.github/SO-Light.svg +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/.github/workflows/publish.yml +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/.github/workflows/release-on-merge.yml +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/.github/workflows/validate-branch.yml +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/.gitignore +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/.gitmodules +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/.pre-commit-config.yaml +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/LICENSE.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/README.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_AddAssignee.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_AddCollaborator.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_AddLabel.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_AddMember.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_AdminTo.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ApprovesDeploymentTo.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_AssignedTo.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_BypassBranchProtection.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_BypassPullRequestAllowances.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_CallsWorkflow.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_CanAccess.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_CanAssumeIdentity.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_CanCreateBranch.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_CanCreateEnvironment.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_CanCreateInternalRepositories.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_CanCreatePrivateRepositories.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_CanCreatePublicRepositories.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_CanCreateRepositories.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_CanCreateRepositoryWithRunnerAccess.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_CanDeployToEnvironment.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_CanEditEnvironment.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_CanEditProtection.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_CanPwnRequest.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_CanReadSecret.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_CanReadSecretScanningAlert.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_CanUseRunner.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_CanWriteBranch.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_CloseDiscussion.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_CloseIssue.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ClosePullRequest.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_Contains.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ConvertIssuesToDiscussions.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_CreateDiscussionCategory.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_CreateEnterpriseOrganizations.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_CreateRepository.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_CreateSoloMergeQueueEntry.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_CreateTag.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_CreateTeam.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_DeleteAlertsCodeScanning.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_DeleteDiscussion.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_DeleteDiscussionComment.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_DeleteIssue.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_DeleteTag.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_DependsOn.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_DeploysTo.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_EditCategoryOnDiscussion.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_EditDiscussionCategory.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_EditDiscussionComment.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_EditEnterpriseCustomPropertiesForOrganizations.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_EditRepoAnnouncementBanners.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_EditRepoCustomPropertiesValues.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_EditRepoMetadata.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_EditRepoProtections.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_HasBaseRole.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_HasExternalIdentity.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_HasMember.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_HasPersonalAccessToken.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_HasPersonalAccessTokenRequest.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_HasRole.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_HasRunner.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_HasSamlIdentityProvider.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_HasSecret.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_HasVariable.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_InheritedFrom.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_InstalledAs.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_InviteMember.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_IsEligibleFor.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_JumpMergeQueue.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ManageDeployKeys.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ManageDiscussionBadges.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ManageEnterpriseAdmins.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ManageEnterpriseIdentityProvider.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ManageEnterpriseMembers.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ManageEnterpriseOrganizationAdmins.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ManageEnterpriseOrganizations.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ManageEnterpriseReferrals.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ManageEnterpriseTeams.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ManageOrganizationWebhooks.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ManageRepoSecurityProducts.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ManageSecurityProducts.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ManageSettingsMergeTypes.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ManageSettingsPages.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ManageSettingsProjects.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ManageSettingsWiki.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ManageTopics.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ManageWebhooks.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_MapsToUser.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_MarkAsDuplicate.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_MatchesEnvironmentPolicy.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_MemberOf.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_OrgBypassCodeScanningDismissalRequests.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_OrgBypassSecretScanningClosureRequests.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_OrgReviewAndManageSecretScanningBypassRequests.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_OrgReviewAndManageSecretScanningClosureRequests.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_Owns.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ProtectedBy.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_PushProtectedBranch.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ReadCodeScanning.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ReadEnterpriseAuditLog.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ReadEnterpriseDomainVerification.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ReadEnterpriseMembers.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ReadEnterpriseOrgProjects.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ReadEnterpriseOrganizationAdmin.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ReadOrganizationActionsUsageMetrics.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ReadOrganizationCustomOrgRole.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ReadOrganizationCustomRepoRole.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ReadRepoContents.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_RemoveAssignee.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_RemoveLabel.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ReopenDiscussion.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ReopenIssue.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ReopenPullRequest.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_RequestPrReview.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ResolveDependabotAlerts.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ResolveSecretScanningAlerts.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_RestrictionsCanPush.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_RunOrgMigration.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_SetEnterpriseInteractionLimits.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_SetInteractionLimits.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_SetIssueType.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_SetMilestone.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_SetSocialPreview.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_SyncedTo.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ToggleDiscussionAnswer.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ToggleDiscussionCommentMinimize.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_TransferRepository.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_UsesSecret.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_UsesVariable.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ValidToken.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ViewDependabotAlerts.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ViewEnterpriseActionsUsageMetrics.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ViewEnterpriseBilling.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ViewEnterpriseSecretScanningAlerts.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ViewSecretScanningAlerts.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_WriteCodeScanning.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_WriteEnterpriseActionsPolicies.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_WriteEnterpriseBilling.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_WriteEnterprisePersonalAccessTokenPolicies.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_WriteEnterpriseSso.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_WriteEnterpriseTeamMembers.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_WriteOrganizationActionsSecrets.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_WriteOrganizationActionsSettings.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_WriteOrganizationActionsVariables.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_WriteOrganizationCustomOrgRole.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_WriteOrganizationCustomRepoRole.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_WriteOrganizationNetworkConfigurations.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_WriteRepoContents.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_WriteRepoPullRequests.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_App.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_AppInstallation.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_Branch.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_BranchProtectionRule.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_Enterprise.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_EnterpriseManagedUser.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_EnterpriseRole.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_EnterpriseRunnerGroup.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_EnterpriseTeam.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_Environment.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_EnvironmentBranchPolicy.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_EnvironmentSecret.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_EnvironmentVariable.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_ExternalIdentity.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_OrgRole.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_OrgRunnerGroup.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_OrgSecret.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_OrgVariable.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_Organization.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_PersonalAccessToken.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_PersonalAccessTokenRequest.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_RepoRole.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_RepoSecret.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_RepoVariable.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_Repository.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_Runner.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_RunnerGroup.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_SamlIdentityProvider.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_Secret.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_SecretScanningAlert.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_Team.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_TeamRole.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_User.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_Variable.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_Workflow.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_WorkflowStep.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/docs/og-docs.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/privilege_zone_rules/t0-all-repo-admin-role.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/privilege_zone_rules/t0-app-installations-all-repos.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/privilege_zone_rules/t0-apps-all-repos.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/privilege_zone_rules/t0-enterprise-owners-role.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/privilege_zone_rules/t0-external-identities-owners.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/privilege_zone_rules/t0-organizations.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/privilege_zone_rules/t0-owner-users.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/privilege_zone_rules/t0-owners-role.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/privilege_zone_rules/t0-pats-all-repos.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/privilege_zone_rules/t0-privilege-escalation-roles.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/privilege_zone_rules/t0-privilege-escalation-users.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/privilege_zone_rules/t0-saml-identity-providers.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/README.md +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/actions-sha-pinning-not-required.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/active-leaked-secrets.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/advanced-security-disabled-new-repos.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/all-actions-allowed.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/app-installations-all-repos.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/branch-protection-admins-not-enforced.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/branch-protection-deletions-allowed.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/branch-protection-force-pushes.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/branch-protection-no-code-owner-reviews.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/branch-protection-no-pr-reviews.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/branch-protection-no-status-checks.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/branch-protection-self-approval.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/branch-protection-stale-reviews.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/bypass-pr-requirements.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/dangerous-branch-perms.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/default-repository-permissions.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/demo-sso-to-cloud-round-trip.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/dependabot-alerts-disabled-new-repos.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/dependabot-updates-disabled-new-repos.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/dependency-graph-disabled-new-repos.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/environments-admin-bypass.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/expired-pats.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/external-identities-without-scim.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/github-to-azure-identity.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/global-repo-perms.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/hybrid-identities.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/members-can-change-repo-visibility.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/members-can-create-pages.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/members-can-create-public-repos.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/members-can-delete-repos.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/members-can-fork-private-repos.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/members-can-invite-outside-collaborators.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/org-owners.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/orgs-without-2fa.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/pats-all-repo-access.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/pending-pat-requests.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/private-repos-forking-allowed.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/privileged-custom-org-roles.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/privileged-hybrid-identities.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/public-repos.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/push-protection-disabled-new-repos.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/push-to-protected-branches.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/repos-secret-scanning-disabled.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/repos-vulnerable-to-workflow-secret-exfil.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/repository-workflows.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/saml-configuration.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/secret-scanning-alerts.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/secret-scanning-disabled-new-repos.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/secrets-reachable-by-user.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/team-membership-admin.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/team-structure.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/unprotected-branches.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/unprotected-default-branch-with-workflow.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/unprotected-default-branches.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/web-commit-signoff-not-required.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/justfile +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/pyproject.toml +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/scripts/generate_gh_description_docs.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/main.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/__init__.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/auth.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/extension.yaml +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/github_rest_client.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/github_retry.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/graph.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/graphql.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/helpers.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/kinds/nodes.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/__init__.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/actions_permission.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/app_installation.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/branch.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/branch_pr_bypass_allowance.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/branch_protection_rule.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/branch_push_allowance.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/enterprise.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/enterprise_admin.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/enterprise_helpers.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/enterprise_managed_user.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/enterprise_member.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/enterprise_organization.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/enterprise_role.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/enterprise_role_team.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/enterprise_role_user.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/enterprise_team.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/enterprise_team_member.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/enterprise_team_organization.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/enterprise_team_role.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/enterprise_user.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/env_secret.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/env_variable.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/environment.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/environment_branch_policy.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/external_identity.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/org.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/org_role.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/org_role_member.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/org_role_team.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/org_secret.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/org_variable.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/personal_access_token.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/personal_access_token_access.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/personal_access_token_request.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/projected_enterprise_team.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/repo_role_assignment.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/repository.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/repository_role.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/repository_secret.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/repository_variable.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/saml_assertion_consumer_service.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/saml_helpers.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/saml_issuer.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/saml_provider.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/saml_service_provider.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/scim_user.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/secret_scanning_alert.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/team.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/team_member.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/team_role.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/user.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/workflow_step.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/resources/__init__.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/resources/enterprise.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/resources/organization.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/runner_ids.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/source.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_app_auth.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_branch_collection_gate.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_branch_protection_traversability.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_data/api/actions-permissions.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_data/api/actionsecrets.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_data/api/app.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_data/api/appinstalls.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_data/api/branch-policies.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_data/api/branch-prot-rules.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_data/api/branches.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_data/api/custom-roles.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_data/api/environments.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_data/api/org-pat-request.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_data/api/org-pat.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_data/api/org-role-teams.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_data/api/org-role-users.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_data/api/org-roles.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_data/api/org.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_data/api/pat-repositories.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_data/api/repo-collaborators.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_data/api/repo-teams.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_data/api/repositories.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_data/api/scimusers.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_data/api/secrets.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_data/api/secretscanningalert.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_data/api/selected-org-secrets.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_data/api/variables.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_data/api/workflows.json +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_description_docs.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_enterprise_capabilities.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_enterprise_organization.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_enterprise_resources.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_environment_model.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_environment_resources.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_environment_reviewer_lookup.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_error_resilience.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_github_app_retry.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_github_rest_client.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_github_retry.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_helpers.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_lookup.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_org_scim_resources.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_org_secret_models.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_repository_rulesets.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_runner_ids.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_runner_resources.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_saml_helpers.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_saml_models.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_scim_models.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_source_endpoints.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_source_org_canonicalization.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_team_external_groups.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_variable_models.py +0 -0
- {openhound_github-0.7.3 → openhound_github-0.8.0}/uv.lock +0 -0
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# GH_RunsOn
|
|
2
|
+
|
|
3
|
+
## General Information
|
|
4
|
+
|
|
5
|
+
The non-traversable GH_RunsOn edge represents that a GitHub Actions workflow job can be scheduled on a self-hosted runner based on the job's statically declared `runs-on` selector and the runner topology visible to the containing repository.
|
|
6
|
+
|
|
7
|
+
This edge is schedulability evidence, not historical execution evidence. It does not mean that the job has previously executed on the runner. It means that the runner satisfies the job's static label and runner-group requirements and is reachable through the repository's current runner access policy.
|
|
8
|
+
|
|
9
|
+
The collector emits GH_RunsOn only for static selectors. Dynamic selectors that contain GitHub Actions expressions such as `${{ matrix.runner }}` or `${{ inputs.runner }}` are intentionally left unresolved in this first implementation.
|
|
10
|
+
|
|
11
|
+
## Edge Schema
|
|
12
|
+
|
|
13
|
+
| Source | Destination | Traversable |
|
|
14
|
+
| --- | --- | --- |
|
|
15
|
+
| `GH_WorkflowJob` | `GH_Runner` | `false` |
|
|
16
|
+
|
|
17
|
+
## Diagram
|
|
18
|
+
|
|
19
|
+
```mermaid
|
|
20
|
+
graph LR
|
|
21
|
+
n0["GH_WorkflowJob"]
|
|
22
|
+
n1["GH_Runner"]
|
|
23
|
+
n0 -.->|GH_RunsOn| n1
|
|
24
|
+
```
|
|
@@ -6,6 +6,8 @@ Represents a self-hosted runner owned at the GitHub Enterprise level. Enterprise
|
|
|
6
6
|
|
|
7
7
|
The node captures runner metadata such as operating system, status, busy state, labels, and whether the runner is ephemeral when GitHub returns that property.
|
|
8
8
|
|
|
9
|
+
GH_RunsOn edges from GH_WorkflowJob nodes identify statically resolvable jobs that GitHub could schedule on this runner through the inherited enterprise runner-group topology. These edges do not indicate that the job has actually executed on the runner.
|
|
10
|
+
|
|
9
11
|
## Properties
|
|
10
12
|
|
|
11
13
|
| Property | Type | Description |
|
|
@@ -31,6 +33,7 @@ The node captures runner metadata such as operating system, status, busy state,
|
|
|
31
33
|
| `environment_name` | `string` | The name of the environment (GitHub organization). |
|
|
32
34
|
| `query_group` | `string` | Query for group. |
|
|
33
35
|
| `query_repositories` | `string` | Query for repositories. |
|
|
36
|
+
| `query_jobs` | `string` | Query for workflow jobs that can be scheduled on the runner. |
|
|
34
37
|
|
|
35
38
|
## Diagram
|
|
36
39
|
|
|
@@ -38,6 +41,8 @@ The node captures runner metadata such as operating system, status, busy state,
|
|
|
38
41
|
graph LR
|
|
39
42
|
n0["GH_EnterpriseRunnerGroup"]
|
|
40
43
|
n1["GH_EnterpriseRunner"]
|
|
44
|
+
n2["GH_WorkflowJob"]
|
|
41
45
|
n0 -.->|GH_Contains| n1
|
|
42
46
|
n0 -->|GH_HasRunner| n1
|
|
47
|
+
n2 -.->|GH_RunsOn| n1
|
|
43
48
|
```
|
|
@@ -6,6 +6,8 @@ Represents a self-hosted runner owned by a GitHub organization. Organization run
|
|
|
6
6
|
|
|
7
7
|
The node captures runner metadata such as operating system, status, busy state, labels, and whether the runner is ephemeral when GitHub returns that property.
|
|
8
8
|
|
|
9
|
+
GH_RunsOn edges from GH_WorkflowJob nodes identify statically resolvable jobs that GitHub could schedule on this runner under the current runner-group access policy. These edges do not indicate that the job has actually executed on the runner.
|
|
10
|
+
|
|
9
11
|
## Properties
|
|
10
12
|
|
|
11
13
|
| Property | Type | Description |
|
|
@@ -31,6 +33,7 @@ The node captures runner metadata such as operating system, status, busy state,
|
|
|
31
33
|
| `environment_name` | `string` | The name of the environment (GitHub organization). |
|
|
32
34
|
| `query_group` | `string` | Query for group. |
|
|
33
35
|
| `query_repositories` | `string` | Query for repositories. |
|
|
36
|
+
| `query_jobs` | `string` | Query for workflow jobs that can be scheduled on the runner. |
|
|
34
37
|
|
|
35
38
|
## Diagram
|
|
36
39
|
|
|
@@ -38,6 +41,8 @@ The node captures runner metadata such as operating system, status, busy state,
|
|
|
38
41
|
graph LR
|
|
39
42
|
n0["GH_OrgRunnerGroup"]
|
|
40
43
|
n1["GH_OrgRunner"]
|
|
44
|
+
n2["GH_WorkflowJob"]
|
|
41
45
|
n0 -.->|GH_Contains| n1
|
|
42
46
|
n0 -->|GH_HasRunner| n1
|
|
47
|
+
n2 -.->|GH_RunsOn| n1
|
|
43
48
|
```
|
|
@@ -6,6 +6,8 @@ Represents a self-hosted runner registered directly to a single GitHub repositor
|
|
|
6
6
|
|
|
7
7
|
The node captures runner metadata such as operating system, status, busy state, labels, and whether the runner is ephemeral when GitHub returns that property.
|
|
8
8
|
|
|
9
|
+
GH_RunsOn edges from GH_WorkflowJob nodes identify statically resolvable jobs in the containing repository that GitHub could schedule on this runner. These edges do not indicate that the job has actually executed on the runner.
|
|
10
|
+
|
|
9
11
|
## Properties
|
|
10
12
|
|
|
11
13
|
| Property | Type | Description |
|
|
@@ -31,6 +33,7 @@ The node captures runner metadata such as operating system, status, busy state,
|
|
|
31
33
|
| `environment_name` | `string` | The name of the environment (GitHub organization). |
|
|
32
34
|
| `query_group` | `string` | Query for group. |
|
|
33
35
|
| `query_repositories` | `string` | Query for repositories. |
|
|
36
|
+
| `query_jobs` | `string` | Query for workflow jobs that can be scheduled on the runner. |
|
|
34
37
|
|
|
35
38
|
## Diagram
|
|
36
39
|
|
|
@@ -38,6 +41,8 @@ The node captures runner metadata such as operating system, status, busy state,
|
|
|
38
41
|
graph LR
|
|
39
42
|
n0["GH_Repository"]
|
|
40
43
|
n1["GH_RepoRunner"]
|
|
44
|
+
n2["GH_WorkflowJob"]
|
|
41
45
|
n0 -.->|GH_CanUseRunner| n1
|
|
42
46
|
n0 -.->|GH_Contains| n1
|
|
47
|
+
n2 -.->|GH_RunsOn| n1
|
|
43
48
|
```
|
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
|
|
5
5
|
Represents a single job within a GitHub Actions workflow. Jobs are the top-level execution units of a workflow — they run on a runner, hold a set of steps, and can declare permissions, environments, and dependencies on other jobs.
|
|
6
6
|
|
|
7
|
+
When the job has a statically resolvable self-hosted `runs-on` selector, GH_RunsOn edges identify each GH_Runner that currently satisfies the declared label and runner-group constraints under the repository's runner access policy. These edges represent schedulability, not historical execution.
|
|
8
|
+
|
|
7
9
|
## Properties
|
|
8
10
|
|
|
9
11
|
| Property | Type | Description |
|
|
@@ -15,6 +17,9 @@ Represents a single job within a GitHub Actions workflow. Jobs are the top-level
|
|
|
15
17
|
| `node_id` | `string` | The stable identifier used as the OpenGraph node ID; this is the native GitHub node ID where available. |
|
|
16
18
|
| `job_key` | `string` | The YAML key for the job. |
|
|
17
19
|
| `runs_on` | `list[string]` | The runner label expression for the job. |
|
|
20
|
+
| `runs_on_group` | `string` | The statically declared runner group, if any. |
|
|
21
|
+
| `runs_on_labels` | `list[string]` | The normalized runner labels from runs-on. |
|
|
22
|
+
| `runs_on_is_dynamic` | `boolean` | Whether runs-on contains a GitHub Actions expression. |
|
|
18
23
|
| `is_self_hosted` | `boolean` | Whether the job targets self-hosted runners. |
|
|
19
24
|
| `container` | `string` | The optional container configuration. |
|
|
20
25
|
| `environment` | `string` | The deployment environment name. |
|
|
@@ -27,6 +32,7 @@ Represents a single job within a GitHub Actions workflow. Jobs are the top-level
|
|
|
27
32
|
| `query_repository` | `string` | Query for repository. |
|
|
28
33
|
| `query_steps` | `string` | Query for workflow steps. |
|
|
29
34
|
| `query_references` | `string` | Query for workflow references (secrets and variables). |
|
|
35
|
+
| `query_runners` | `string` | Query for eligible self-hosted runners. |
|
|
30
36
|
|
|
31
37
|
## Diagram
|
|
32
38
|
|
|
@@ -41,7 +47,8 @@ graph LR
|
|
|
41
47
|
n6["GH_OrgVariable"]
|
|
42
48
|
n7["GH_RepoSecret"]
|
|
43
49
|
n8["GH_RepoVariable"]
|
|
44
|
-
n9["
|
|
50
|
+
n9["GH_Runner"]
|
|
51
|
+
n10["GH_WorkflowStep"]
|
|
45
52
|
n0 -.->|GH_Contains| n1
|
|
46
53
|
n1 -.->|GH_DeploysTo| n2
|
|
47
54
|
n1 -.->|GH_UsesSecret| n3
|
|
@@ -50,7 +57,8 @@ graph LR
|
|
|
50
57
|
n1 -.->|GH_UsesVariable| n6
|
|
51
58
|
n1 -.->|GH_UsesSecret| n7
|
|
52
59
|
n1 -.->|GH_UsesVariable| n8
|
|
60
|
+
n1 -.->|GH_RunsOn| n9
|
|
53
61
|
n1 -.->|GH_CallsWorkflow| n0
|
|
54
62
|
n1 -.->|GH_DependsOn| n1
|
|
55
|
-
n1 -.->|GH_Contains|
|
|
63
|
+
n1 -.->|GH_Contains| n10
|
|
56
64
|
```
|
|
@@ -1030,6 +1030,11 @@
|
|
|
1030
1030
|
"description": "[Workflow] Job deploys to a GitHub Environment — GH_WorkflowJob → GH_Environment",
|
|
1031
1031
|
"is_traversable": false
|
|
1032
1032
|
},
|
|
1033
|
+
{
|
|
1034
|
+
"name": "GH_RunsOn",
|
|
1035
|
+
"description": "[Workflow] Job can be scheduled on this self-hosted runner based on its static runs-on selector — GH_WorkflowJob → GH_Runner",
|
|
1036
|
+
"is_traversable": false
|
|
1037
|
+
},
|
|
1033
1038
|
{
|
|
1034
1039
|
"name": "GH_HasMember",
|
|
1035
1040
|
"description": "Enterprise or organization has this user as a member",
|
|
@@ -18,6 +18,7 @@ MEMBER_OF = "GH_MemberOf"
|
|
|
18
18
|
# Access and capability edges
|
|
19
19
|
CAN_ACCESS = "GH_CanAccess"
|
|
20
20
|
CAN_USE_RUNNER = "GH_CanUseRunner"
|
|
21
|
+
RUNS_ON = "GH_RunsOn"
|
|
21
22
|
IS_ELIGIBLE_FOR = "GH_IsEligibleFor"
|
|
22
23
|
CAN_CREATE_REPOSITORY_WITH_RUNNER_ACCESS = "GH_CanCreateRepositoryWithRunnerAccess"
|
|
23
24
|
CAN_CREATE_BRANCH = "GH_CanCreateBranch"
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import json
|
|
2
2
|
import re
|
|
3
3
|
from functools import lru_cache
|
|
4
|
+
from typing import Any
|
|
4
5
|
|
|
5
6
|
import duckdb
|
|
6
7
|
from duckdb import DuckDBPyConnection
|
|
@@ -167,6 +168,204 @@ class GithubLookup(LookupManager):
|
|
|
167
168
|
)
|
|
168
169
|
return [(runner_node_id(enterprise_node_id, int(runner_id)),) for (runner_id,) in rows]
|
|
169
170
|
|
|
171
|
+
@staticmethod
|
|
172
|
+
def _json_list(raw_value: Any) -> list[Any]:
|
|
173
|
+
if raw_value is None:
|
|
174
|
+
return []
|
|
175
|
+
if isinstance(raw_value, str):
|
|
176
|
+
try:
|
|
177
|
+
raw_value = json.loads(raw_value)
|
|
178
|
+
except json.JSONDecodeError:
|
|
179
|
+
return []
|
|
180
|
+
if isinstance(raw_value, list):
|
|
181
|
+
return raw_value
|
|
182
|
+
return []
|
|
183
|
+
|
|
184
|
+
@classmethod
|
|
185
|
+
def _runner_label_names(cls, raw_labels: Any) -> set[str]:
|
|
186
|
+
names: set[str] = set()
|
|
187
|
+
for label in cls._json_list(raw_labels):
|
|
188
|
+
if isinstance(label, dict):
|
|
189
|
+
name = label.get("name")
|
|
190
|
+
else:
|
|
191
|
+
name = label
|
|
192
|
+
if name is not None:
|
|
193
|
+
names.add(str(name).casefold())
|
|
194
|
+
return names
|
|
195
|
+
|
|
196
|
+
@staticmethod
|
|
197
|
+
def _runner_group_allows_repository(
|
|
198
|
+
*,
|
|
199
|
+
repository_node_id: str,
|
|
200
|
+
repository_visibility: str | None,
|
|
201
|
+
runner_group_visibility: str | None,
|
|
202
|
+
allows_public_repositories: bool | None,
|
|
203
|
+
accessible_repo_node_ids: set[str],
|
|
204
|
+
) -> bool:
|
|
205
|
+
if runner_group_visibility == "all":
|
|
206
|
+
in_scope = True
|
|
207
|
+
elif runner_group_visibility == "private":
|
|
208
|
+
in_scope = repository_visibility in {"private", "internal"}
|
|
209
|
+
else:
|
|
210
|
+
in_scope = repository_node_id in accessible_repo_node_ids
|
|
211
|
+
|
|
212
|
+
if not in_scope:
|
|
213
|
+
return False
|
|
214
|
+
|
|
215
|
+
if allows_public_repositories is False:
|
|
216
|
+
return repository_visibility in {"private", "internal"}
|
|
217
|
+
|
|
218
|
+
return True
|
|
219
|
+
|
|
220
|
+
@lru_cache
|
|
221
|
+
def workflow_job_runner_node_ids(
|
|
222
|
+
self,
|
|
223
|
+
repository_node_id: str,
|
|
224
|
+
org_login: str,
|
|
225
|
+
group_name: str | None,
|
|
226
|
+
labels: tuple[str, ...],
|
|
227
|
+
) -> list[str]:
|
|
228
|
+
"""Return accessible self-hosted runners matching a static runs-on selector."""
|
|
229
|
+
if not group_name and not labels:
|
|
230
|
+
return []
|
|
231
|
+
|
|
232
|
+
repository = self._find_single_row(
|
|
233
|
+
f"""
|
|
234
|
+
SELECT visibility, actions_enabled
|
|
235
|
+
FROM {self.schema}.repositories
|
|
236
|
+
WHERE node_id = ?
|
|
237
|
+
AND org_login = ?
|
|
238
|
+
""",
|
|
239
|
+
[repository_node_id, org_login],
|
|
240
|
+
)
|
|
241
|
+
if not repository:
|
|
242
|
+
return []
|
|
243
|
+
|
|
244
|
+
repository_visibility, actions_enabled = repository
|
|
245
|
+
required_labels = {str(label).casefold() for label in labels}
|
|
246
|
+
matching_runner_node_ids: list[str] = []
|
|
247
|
+
seen_runner_node_ids: set[str] = set()
|
|
248
|
+
|
|
249
|
+
def add_matching_runner(node_id: str, raw_labels: Any) -> None:
|
|
250
|
+
if node_id in seen_runner_node_ids:
|
|
251
|
+
return
|
|
252
|
+
if not required_labels.issubset(self._runner_label_names(raw_labels)):
|
|
253
|
+
return
|
|
254
|
+
seen_runner_node_ids.add(node_id)
|
|
255
|
+
matching_runner_node_ids.append(node_id)
|
|
256
|
+
|
|
257
|
+
if group_name is None:
|
|
258
|
+
for runner_id, raw_labels in self._find_all_objects(
|
|
259
|
+
f"""
|
|
260
|
+
SELECT id, labels
|
|
261
|
+
FROM {self.schema}.repo_runners
|
|
262
|
+
WHERE repository_node_id = ?
|
|
263
|
+
""",
|
|
264
|
+
[repository_node_id],
|
|
265
|
+
):
|
|
266
|
+
add_matching_runner(
|
|
267
|
+
runner_node_id(repository_node_id, int(runner_id)),
|
|
268
|
+
raw_labels,
|
|
269
|
+
)
|
|
270
|
+
|
|
271
|
+
if actions_enabled is not True:
|
|
272
|
+
return []
|
|
273
|
+
|
|
274
|
+
for (
|
|
275
|
+
runner_group_id,
|
|
276
|
+
runner_group_name,
|
|
277
|
+
runner_group_visibility,
|
|
278
|
+
allows_public_repositories,
|
|
279
|
+
restricted_to_workflows,
|
|
280
|
+
inherited,
|
|
281
|
+
raw_accessible_repo_node_ids,
|
|
282
|
+
) in self._find_all_objects(
|
|
283
|
+
f"""
|
|
284
|
+
SELECT
|
|
285
|
+
runner_group_id,
|
|
286
|
+
runner_group_name,
|
|
287
|
+
runner_group_visibility,
|
|
288
|
+
allows_public_repositories,
|
|
289
|
+
restricted_to_workflows,
|
|
290
|
+
inherited,
|
|
291
|
+
accessible_repo_node_ids
|
|
292
|
+
FROM {self.schema}.org_runner_group_access
|
|
293
|
+
WHERE org_login = ?
|
|
294
|
+
""",
|
|
295
|
+
[org_login],
|
|
296
|
+
):
|
|
297
|
+
if group_name is not None and runner_group_name != group_name:
|
|
298
|
+
continue
|
|
299
|
+
if restricted_to_workflows is not False:
|
|
300
|
+
continue
|
|
301
|
+
|
|
302
|
+
accessible_repo_node_ids = {
|
|
303
|
+
str(node_id)
|
|
304
|
+
for node_id in self._json_list(raw_accessible_repo_node_ids)
|
|
305
|
+
}
|
|
306
|
+
if not self._runner_group_allows_repository(
|
|
307
|
+
repository_node_id=repository_node_id,
|
|
308
|
+
repository_visibility=repository_visibility,
|
|
309
|
+
runner_group_visibility=runner_group_visibility,
|
|
310
|
+
allows_public_repositories=allows_public_repositories,
|
|
311
|
+
accessible_repo_node_ids=accessible_repo_node_ids,
|
|
312
|
+
):
|
|
313
|
+
continue
|
|
314
|
+
|
|
315
|
+
if inherited:
|
|
316
|
+
org_node_id = self.org_id_for_login(org_login)
|
|
317
|
+
if not org_node_id:
|
|
318
|
+
continue
|
|
319
|
+
if (
|
|
320
|
+
self.enterprise_runner_group_restricted_to_workflows_for_inherited_org_group(
|
|
321
|
+
org_node_id, runner_group_name
|
|
322
|
+
)
|
|
323
|
+
is not False
|
|
324
|
+
):
|
|
325
|
+
continue
|
|
326
|
+
identity = self._enterprise_runner_group_identity_for_inherited_org_group(
|
|
327
|
+
org_node_id, runner_group_name
|
|
328
|
+
)
|
|
329
|
+
if not identity:
|
|
330
|
+
continue
|
|
331
|
+
enterprise_node_id, enterprise_runner_group_id = identity
|
|
332
|
+
for runner_id, raw_labels in self._find_all_objects(
|
|
333
|
+
f"""
|
|
334
|
+
SELECT r.id, r.labels
|
|
335
|
+
FROM {self.schema}.enterprise_runner_group_memberships m
|
|
336
|
+
JOIN {self.schema}.enterprise_runners r
|
|
337
|
+
ON r.enterprise_node_id = m.enterprise_node_id
|
|
338
|
+
AND r.id = m.runner_id
|
|
339
|
+
WHERE m.enterprise_node_id = ?
|
|
340
|
+
AND m.runner_group_id = ?
|
|
341
|
+
""",
|
|
342
|
+
[enterprise_node_id, enterprise_runner_group_id],
|
|
343
|
+
):
|
|
344
|
+
add_matching_runner(
|
|
345
|
+
runner_node_id(enterprise_node_id, int(runner_id)),
|
|
346
|
+
raw_labels,
|
|
347
|
+
)
|
|
348
|
+
continue
|
|
349
|
+
|
|
350
|
+
for runner_id, raw_labels in self._find_all_objects(
|
|
351
|
+
f"""
|
|
352
|
+
SELECT r.id, r.labels
|
|
353
|
+
FROM {self.schema}.org_runner_group_memberships m
|
|
354
|
+
JOIN {self.schema}.org_runners r
|
|
355
|
+
ON r.org_login = m.org_login
|
|
356
|
+
AND r.id = m.runner_id
|
|
357
|
+
WHERE m.org_login = ?
|
|
358
|
+
AND m.runner_group_id = ?
|
|
359
|
+
""",
|
|
360
|
+
[org_login, runner_group_id],
|
|
361
|
+
):
|
|
362
|
+
add_matching_runner(
|
|
363
|
+
runner_node_id(self.org_id_for_login(org_login), int(runner_id)),
|
|
364
|
+
raw_labels,
|
|
365
|
+
)
|
|
366
|
+
|
|
367
|
+
return matching_runner_node_ids
|
|
368
|
+
|
|
170
369
|
@lru_cache
|
|
171
370
|
def enterprise_idp_for_scope(
|
|
172
371
|
self, enterprise_node_id: str
|
|
@@ -72,6 +72,12 @@ def preproc(ctx: PreProcContext):
|
|
|
72
72
|
"enterprise_runner_groups": "enterprise_runner_groups",
|
|
73
73
|
"enterprise_runner_group_organizations": "enterprise_runner_group_organizations",
|
|
74
74
|
"enterprise_runner_group_memberships": "enterprise_runner_group_memberships",
|
|
75
|
+
"enterprise_runners": "enterprise_runners",
|
|
76
|
+
"runner_groups": "runner_groups",
|
|
77
|
+
"org_runners": "org_runners",
|
|
78
|
+
"org_runner_group_access": "org_runner_group_access",
|
|
79
|
+
"org_runner_group_memberships": "org_runner_group_memberships",
|
|
80
|
+
"repo_runners": "repo_runners",
|
|
75
81
|
"org_roles": "org_roles",
|
|
76
82
|
"org_role_members": "org_role_members",
|
|
77
83
|
"org_role_teams": "org_role_teams",
|
|
@@ -316,6 +316,7 @@ class GHRunnerProperties(GHNodeProperties):
|
|
|
316
316
|
environment_name: The name of the environment (GitHub organization).
|
|
317
317
|
query_group: Query for group.
|
|
318
318
|
query_repositories: Query for repositories.
|
|
319
|
+
query_jobs: Query for workflow jobs that can be scheduled on the runner.
|
|
319
320
|
"""
|
|
320
321
|
|
|
321
322
|
scope: str | None = None
|
|
@@ -334,6 +335,7 @@ class GHRunnerProperties(GHNodeProperties):
|
|
|
334
335
|
environment_name: str | None = None
|
|
335
336
|
query_group: str | None = None
|
|
336
337
|
query_repositories: str | None = None
|
|
338
|
+
query_jobs: str | None = None
|
|
337
339
|
|
|
338
340
|
|
|
339
341
|
@app.asset(
|
|
@@ -384,6 +386,7 @@ class OrgRunner(BaseAsset):
|
|
|
384
386
|
environmentid=self.org_node_id,
|
|
385
387
|
query_group=f"MATCH p=(:GH_OrgRunnerGroup)-[:GH_HasRunner]->(:GH_OrgRunner {{node_id:'{rid}'}}) RETURN p",
|
|
386
388
|
query_repositories=f"MATCH p=(:GH_Repository)-[:GH_CanUseRunner]->(:GH_OrgRunnerGroup)-[:GH_HasRunner]->(:GH_OrgRunner {{node_id:'{rid}'}}) RETURN p",
|
|
389
|
+
query_jobs=f"MATCH p=(:GH_WorkflowJob)-[:GH_RunsOn]->(:GH_Runner {{node_id:'{rid}'}}) RETURN p",
|
|
387
390
|
),
|
|
388
391
|
)
|
|
389
392
|
|
|
@@ -437,6 +440,7 @@ class EnterpriseRunner(BaseAsset):
|
|
|
437
440
|
environmentid=self.enterprise_node_id,
|
|
438
441
|
query_group=f"MATCH p=(:GH_EnterpriseRunnerGroup)-[:GH_HasRunner]->(:GH_EnterpriseRunner {{node_id:'{rid}'}}) RETURN p",
|
|
439
442
|
query_repositories=f"MATCH p=(:GH_Repository)-[:GH_CanUseRunner]->(:GH_OrgRunnerGroup)-[:GH_InheritedFrom]->(:GH_EnterpriseRunnerGroup)-[:GH_HasRunner]->(:GH_EnterpriseRunner {{node_id:'{rid}'}}) RETURN p",
|
|
443
|
+
query_jobs=f"MATCH p=(:GH_WorkflowJob)-[:GH_RunsOn]->(:GH_Runner {{node_id:'{rid}'}}) RETURN p",
|
|
440
444
|
),
|
|
441
445
|
)
|
|
442
446
|
|
|
@@ -873,6 +877,7 @@ class RepoRunner(BaseAsset):
|
|
|
873
877
|
environment_name=self.org_login,
|
|
874
878
|
environmentid=self.org_node_id,
|
|
875
879
|
query_repositories=f"MATCH p=(:GH_Repository {{node_id:'{self.repository_node_id}'}})-[:GH_CanUseRunner]->(:GH_RepoRunner {{node_id:'{rid}'}}) RETURN p",
|
|
880
|
+
query_jobs=f"MATCH p=(:GH_WorkflowJob)-[:GH_RunsOn]->(:GH_Runner {{node_id:'{rid}'}}) RETURN p",
|
|
876
881
|
),
|
|
877
882
|
)
|
|
878
883
|
|
|
@@ -43,6 +43,7 @@ SECRET_REFERENCE_RE = re.compile(r"\$\{\{\s*secrets\.(\w+)\s*\}\}")
|
|
|
43
43
|
VARIABLE_REFERENCE_RE = re.compile(r"\$\{\{\s*vars\.(\w+)\s*\}\}")
|
|
44
44
|
ACTION_RE = re.compile(r"^(?P<owner>[^/]+)/(?P<name>[^@]+)@(?P<ref>.+)$")
|
|
45
45
|
PINNED_REF_RE = re.compile(r"^[0-9a-f]{40}$")
|
|
46
|
+
TEMPLATE_RE = re.compile(r"\$\{\{\s*[^}]+?\s*\}\}")
|
|
46
47
|
|
|
47
48
|
|
|
48
49
|
class WorkflowStepDefinition(BaseModel):
|
|
@@ -94,6 +95,49 @@ class RunsOn(BaseModel):
|
|
|
94
95
|
labels: list[str] | str | None = None
|
|
95
96
|
|
|
96
97
|
|
|
98
|
+
class RunsOnSelector(BaseModel):
|
|
99
|
+
group: str | None = None
|
|
100
|
+
labels: list[str] = Field(default_factory=list)
|
|
101
|
+
is_dynamic: bool = False
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def parse_runs_on_selector(value: Any) -> RunsOnSelector:
|
|
105
|
+
"""Normalize a workflow job's runs-on declaration without losing group data."""
|
|
106
|
+
if value is None:
|
|
107
|
+
return RunsOnSelector()
|
|
108
|
+
|
|
109
|
+
if isinstance(value, RunsOn):
|
|
110
|
+
value = value.model_dump()
|
|
111
|
+
|
|
112
|
+
group: str | None = None
|
|
113
|
+
labels: list[str] = []
|
|
114
|
+
|
|
115
|
+
if isinstance(value, str):
|
|
116
|
+
labels = [value]
|
|
117
|
+
elif isinstance(value, list):
|
|
118
|
+
labels = [str(item) for item in value]
|
|
119
|
+
elif isinstance(value, dict):
|
|
120
|
+
raw_group = value.get("group")
|
|
121
|
+
if raw_group is not None:
|
|
122
|
+
group = str(raw_group)
|
|
123
|
+
|
|
124
|
+
raw_labels = value.get("labels")
|
|
125
|
+
if isinstance(raw_labels, str):
|
|
126
|
+
labels = [raw_labels]
|
|
127
|
+
elif isinstance(raw_labels, list):
|
|
128
|
+
labels = [str(item) for item in raw_labels]
|
|
129
|
+
elif raw_labels is not None:
|
|
130
|
+
labels = [str(raw_labels)]
|
|
131
|
+
else:
|
|
132
|
+
labels = [str(value)]
|
|
133
|
+
|
|
134
|
+
is_dynamic = any(TEMPLATE_RE.search(item) for item in labels)
|
|
135
|
+
if group:
|
|
136
|
+
is_dynamic = is_dynamic or bool(TEMPLATE_RE.search(group))
|
|
137
|
+
|
|
138
|
+
return RunsOnSelector(group=group, labels=labels, is_dynamic=is_dynamic)
|
|
139
|
+
|
|
140
|
+
|
|
97
141
|
class WorkflowJobDefinition(BaseModel):
|
|
98
142
|
model_config = ConfigDict(extra="allow", populate_by_name=True)
|
|
99
143
|
|
|
@@ -149,6 +193,10 @@ class WorkflowJobDefinition(BaseModel):
|
|
|
149
193
|
def container_value(self) -> str | None:
|
|
150
194
|
return str(self.container) if self.container else None
|
|
151
195
|
|
|
196
|
+
@property
|
|
197
|
+
def runs_on_selector(self) -> RunsOnSelector:
|
|
198
|
+
return parse_runs_on_selector(self.runs_on)
|
|
199
|
+
|
|
152
200
|
|
|
153
201
|
class WorkflowDocument(BaseModel):
|
|
154
202
|
model_config = ConfigDict(extra="allow")
|
|
@@ -498,6 +546,7 @@ class Workflow(BaseAsset):
|
|
|
498
546
|
}
|
|
499
547
|
rows = []
|
|
500
548
|
for job_key, job in document.jobs.items():
|
|
549
|
+
runs_on_selector = job.runs_on_selector
|
|
501
550
|
secret_refs = []
|
|
502
551
|
variable_refs = []
|
|
503
552
|
secret_refs.extend(
|
|
@@ -514,6 +563,9 @@ class Workflow(BaseAsset):
|
|
|
514
563
|
"name": f"{self.repository_name}\\{job_key}",
|
|
515
564
|
"job_key": job_key,
|
|
516
565
|
"runs_on": job.runs_on,
|
|
566
|
+
"runs_on_group": runs_on_selector.group,
|
|
567
|
+
"runs_on_labels": runs_on_selector.labels or None,
|
|
568
|
+
"runs_on_is_dynamic": runs_on_selector.is_dynamic,
|
|
517
569
|
"container": job.container_value,
|
|
518
570
|
"environment": job.environment_name,
|
|
519
571
|
"permissions": job.permissions
|