11from datetime import datetime
22from typing import (
33 Any ,
4- Optional ,
5- Union ,
64)
75from urllib .parse import urlparse
86
2119
2220
2321class CKANFileSystem (AbstractFileSystem ):
24- def __init__ (self , base_url : str , token : Optional [ str ] = None , ** kwargs : Any ):
22+ def __init__ (self , base_url : str , token : str | None = None , ** kwargs : Any ):
2523 super ().__init__ (** kwargs )
2624 self .base_url = base_url .rstrip ("/" ) # prevents double slashes in URLs
2725 self .token = token
@@ -44,7 +42,7 @@ def _raise_for_ckan_error(self, response: requests.Response) -> None:
4442 def _get_response (
4543 self ,
4644 action : str ,
47- params : Optional [ dict [str , Any ]] = None ,
45+ params : dict [str , Any ] | None = None ,
4846 ) -> Any :
4947 url = f"{ self .base_url } /api/3/action/{ action } "
5048 headers = self ._get_request_headers ()
@@ -121,11 +119,11 @@ def _is_root(self, path: str) -> bool:
121119 return path in ("" , "/" )
122120
123121 # in case resource name is missing, use id
124- def _resource_name (self , resource : dict [str , Any ]) -> Optional [ str ] :
122+ def _resource_name (self , resource : dict [str , Any ]) -> str | None :
125123 return resource .get ("name" ) or resource .get ("id" )
126124
127125 # returns last modified as a date object, or None if missing/invalid
128- def _parse_modified (self , value : Optional [ str ] ) -> Optional [ datetime ] :
126+ def _parse_modified (self , value : str | None ) -> datetime | None :
129127 if not value :
130128 return None
131129 try :
@@ -148,7 +146,7 @@ def _resource_entry(self, dataset_id: str, resource: dict[str, Any]) -> dict[str
148146 return entry
149147
150148 # returns dataset entry with optional metadata
151- def _dataset_entry (self , name : str , dataset : Optional [ dict [str , Any ]] = None ) -> dict [str , Any ]:
149+ def _dataset_entry (self , name : str , dataset : dict [str , Any ] | None = None ) -> dict [str , Any ]:
152150 entry : dict [str , Any ] = {"name" : f"/{ name } " , "type" : "directory" , "size" : None }
153151 if dataset :
154152 # adds these parameter in case detail=True
@@ -157,7 +155,7 @@ def _dataset_entry(self, name: str, dataset: Optional[dict[str, Any]] = None) ->
157155 return entry
158156
159157 # splits path into dataset_id and optional resource_name
160- def _split_path (self , path : str ) -> tuple [str , Optional [ str ] ]:
158+ def _split_path (self , path : str ) -> tuple [str , str | None ]:
161159 parts = path .strip ("/" ).split ("/" , 1 )
162160 dataset_id = parts [0 ]
163161 resource_name = None # path is /dataset
@@ -225,13 +223,13 @@ def _open(self, path: str, mode: str = "rb", **kwargs: Any):
225223
226224
227225class CKANFileSourceTemplateConfiguration (FsspecBaseFileSourceTemplateConfiguration ):
228- endpoint : Union [ str , TemplateExpansion ]
229- token : Union [ str , TemplateExpansion , None ] = None
226+ endpoint : str | TemplateExpansion
227+ token : str | TemplateExpansion | None = None
230228
231229
232230class CKANFileSourceConfiguration (FsspecBaseFileSourceConfiguration ):
233231 endpoint : str
234- token : Optional [ str ] = None
232+ token : str | None = None
235233
236234
237235class CKANFilesSource (FsspecFilesSource [CKANFileSourceTemplateConfiguration , CKANFileSourceConfiguration ]):
0 commit comments