2929from dipdup .config import HTTPConfig
3030from dipdup .config import PostgresDatabaseConfig
3131from dipdup .exceptions import ConfigurationError
32+ from dipdup .exceptions import HasuraError
3233from dipdup .http import HTTPGateway
3334from dipdup .models import Schema
3435from dipdup .utils import iter_files
@@ -77,10 +78,6 @@ def root(self) -> str:
7778 return humps .decamelize (self .name )
7879
7980
80- class HasuraError (RuntimeError ):
81- ...
82-
83-
8481class HasuraGateway (HTTPGateway ):
8582 _default_http_config = HTTPConfig (
8683 cache = False ,
@@ -120,21 +117,21 @@ async def configure(self, force: bool = False) -> None:
120117 self ._logger .info ('Metadata is up to date, no action required' )
121118 return
122119
123- await self . _reset_metadata ()
124- metadata = await self ._fetch_metadata ()
125-
126- # NOTE: Hasura metadata updated in three steps.
127- # NOTE: Order matters because queries must be generated after applying table customization to be valid.
128- # NOTE: 1. Generate and apply tables metadata.
129- source_tables_metadata = await self . _generate_source_tables_metadata ()
130- metadata [ 'sources' ][ 0 ][ 'tables' ] = source_tables_metadata
120+ # NOTE: Find chosen source and overwrite its tables
121+ source_name = self ._hasura_config . source
122+ for source in metadata [ 'sources' ]:
123+ if source [ 'name' ] == source_name :
124+ source [ 'tables' ] = await self . _generate_source_tables_metadata ()
125+ break
126+ else :
127+ raise HasuraError ( f'Source ` { source_name } ` not found in metadata' )
131128 await self ._replace_metadata (metadata )
132129
133- # NOTE: 2. Apply table customization and refresh metadata
130+ # NOTE: Apply table customizations before generating queries
134131 await self ._apply_table_customization ()
135132 metadata = await self ._fetch_metadata ()
136133
137- # NOTE: 3. Generate and apply queries and rest endpoints
134+ # NOTE: Generate and apply queries and REST endpoints
138135 query_collections_metadata = await self ._generate_query_collections_metadata ()
139136 self ._logger .info ('Adding %s generated and user-defined queries' , len (query_collections_metadata ))
140137 metadata ['query_collections' ] = [
@@ -152,6 +149,7 @@ async def configure(self, force: bool = False) -> None:
152149
153150 await self ._replace_metadata (metadata )
154151
152+ # NOTE: Fetch metadata once again (to do: find out why is it necessary) and save its hash for future comparisons
155153 metadata = await self ._fetch_metadata ()
156154 metadata_hash = self ._hash_metadata (metadata )
157155 hasura_schema .hash = metadata_hash # type: ignore
@@ -170,7 +168,7 @@ async def _hasura_request(self, endpoint: str, json: Dict[str, Any]) -> Dict[str
170168 )
171169 self ._logger .debug ('Response: %s' , result )
172170 if 'error' in result or 'errors' in result :
173- raise HasuraError ('Can \' t configure Hasura instance' , result )
171+ raise HasuraError (result )
174172 return result
175173
176174 async def _healthcheck (self ) -> None :
@@ -183,7 +181,7 @@ async def _healthcheck(self) -> None:
183181 break
184182 await asyncio .sleep (1 )
185183 else :
186- raise HasuraError (f'Hasura instance not responding for { timeout } seconds' )
184+ raise HasuraError (f'Not responding for { timeout } seconds' )
187185
188186 version_json = await (
189187 await self ._http ._session .get (
@@ -192,7 +190,7 @@ async def _healthcheck(self) -> None:
192190 ).json ()
193191 version = version_json ['version' ]
194192 if version .startswith ('v1' ):
195- raise HasuraError ('Hasura v1 is not supported.' )
193+ raise HasuraError ('v1 is not supported, upgrade to the latest stable version .' )
196194
197195 self ._logger .info ('Connected to Hasura %s' , version )
198196
@@ -273,7 +271,7 @@ async def _generate_source_tables_metadata(self) -> List[Dict[str, Any]]:
273271 for field in model ._meta .fields_map .values ():
274272 if isinstance (field , fields .relational .ForeignKeyFieldInstance ):
275273 if not isinstance (field .related_name , str ):
276- raise HasuraError (f'`related_name` of `{ field } ` must be set' )
274+ raise HasuraError (f'`related_name` of `{ field } ` field must be set' )
277275
278276 related_table_name = model_tables [field .model_name ]
279277 field_name = field .model_field_name
@@ -293,7 +291,7 @@ async def _generate_source_tables_metadata(self) -> List[Dict[str, Any]]:
293291
294292 elif isinstance (field , fields .relational .ManyToManyFieldInstance ):
295293 if not isinstance (field .related_name , str ):
296- raise HasuraError (f'`related_name` of `{ field } ` must be set' )
294+ raise HasuraError (f'`related_name` of `{ field } ` field must be set' )
297295
298296 related_table_name = model_tables [field .model_name ]
299297 junction_table_name = field .through
0 commit comments