11from functools import lru_cache
22
3+ import duckdb
34from duckdb import DuckDBPyConnection
4- from openhound .core .lookup import LookupManager
5+ from openhound .core .lookup import LookupManager , logger
56
67
78class GithubLookup (LookupManager ):
@@ -10,6 +11,20 @@ def __init__(self, client: DuckDBPyConnection, schema: str = "github"):
1011 self .schema = schema
1112 self .client = client
1213
14+ def _find_single_row (self , * args ):
15+ try :
16+ self .client .execute (* args )
17+ result = self .client .fetchone ()
18+ return result if result else None
19+
20+ except duckdb .CatalogException as err :
21+ logger .error ("DuckDB lookup failed, missing table: %s" , err )
22+ return None
23+
24+ except duckdb .Error as err :
25+ logger .error ("DuckDB lookup query failed: %s" , err )
26+ return None
27+
1328 @lru_cache
1429 def org_id (self ) -> str | None :
1530 res = self ._find_single_object (
@@ -124,6 +139,18 @@ def role_can_create_branch(self, role_id: str, repository_node_id: str):
124139 [role_id , repository_node_id ],
125140 )
126141
142+ @lru_cache
143+ def members_can_create_repository (self , org_login : str ):
144+ return self ._find_single_row (
145+ f"""SELECT
146+ members_can_create_repositories,
147+ members_can_create_public_repositories,
148+ members_can_create_internal_repositories,
149+ members_can_create_private_repositories
150+ FROM { self .schema } .organizations WHERE login = ?""" ,
151+ [org_login ],
152+ )
153+
127154 @lru_cache
128155 def bypass_pull_request_allowances (self , actor_id : str ):
129156 """Returns the node_ids of users/teams that bypass PR review requirements on branches in a repository (GH_BypassPullRequestAllowances)"""
0 commit comments