11import logging
22from concurrent .futures import ThreadPoolExecutor , as_completed , wait
33from enum import Enum
4- from typing import Optional , Union
54
65import requests
76from pydantic import BaseModel , ValidationError
@@ -29,7 +28,7 @@ class Author(BaseModel):
2928
3029 id : str
3130 display_name : str
32- orcid : Optional [ str ] = None
31+ orcid : str | None = None
3332
3433
3534class WorkAuthorship (BaseModel ):
@@ -51,10 +50,10 @@ class WorkKeyword(BaseModel):
5150class WorkBiblio (BaseModel ):
5251 """Work bibliographic information from the openalex API."""
5352
54- volume : Optional [ str ] = None
55- issue : Optional [ str ] = None
56- first_page : Optional [ str ] = None
57- last_page : Optional [ str ] = None
53+ volume : str | None = None
54+ issue : str | None = None
55+ first_page : str | None = None
56+ last_page : str | None = None
5857
5958
6059class WorkLocationSource (BaseModel ):
@@ -69,25 +68,25 @@ class WorkLoacation(BaseModel):
6968 """Location of the work from the openalex API."""
7069
7170 is_oa : bool
72- landing_page_url : Optional [ str ] = None
73- pdf_url : Optional [ str ] = None
74- source : Optional [ WorkLocationSource ]
71+ landing_page_url : str | None = None
72+ pdf_url : str | None = None
73+ source : WorkLocationSource | None
7574
7675
7776class Work (BaseModel ):
7877 """A work from the openalex API."""
7978
8079 id : str
8180 ids : dict [str , str ]
82- doi : Optional [ str ] = None
83- title : Optional [ str ] = None
81+ doi : str | None = None
82+ title : str | None = None
8483 publication_year : int
8584 authorships : list [WorkAuthorship ]
8685 cited_by_count : int
8786 keywords : list [WorkKeyword ]
8887 referenced_works : list [str ]
8988 biblio : WorkBiblio
90- primary_location : Optional [ WorkLoacation ] = None
89+ primary_location : WorkLoacation | None = None
9190
9291
9392class ResponseMeta (BaseModel ):
@@ -110,8 +109,8 @@ class OpenAlexClient:
110109
111110 def __init__ (
112111 self ,
113- base_url : Optional [ str ] = None ,
114- email : Optional [ str ] = None ,
112+ base_url : str | None = None ,
113+ email : str | None = None ,
115114 ) -> None :
116115 self .base_url = base_url or "https://api.openalex.org"
117116 self .session = requests .Session ()
@@ -124,7 +123,7 @@ def __init__(
124123 }
125124 )
126125
127- def _fetch_works (self , params : dict [str , Union [ str , int ] ]) -> WorkResponse :
126+ def _fetch_works (self , params : dict [str , str | int ]) -> WorkResponse :
128127 response = self .session .get (
129128 f"{ self .base_url } /works" ,
130129 params = params ,
0 commit comments