import across.sdk.v1 as sdk
from across.sdk.v1.abstract_credential_storage import CredentialStorage
from across.sdk.v1.api_client_wrapper import ApiClientWrapper
from .apis import Filter, Instrument, Observation, Observatory, Schedule, Telescope, VisibilityCalculator
from .core.config import config
[docs]
class Client:
"""
Client wrapper for interacting with the Across API.
This class initializes an API client using either direct credentials
(`client_id`, `client_secret`) or a stored credentials object
(`CredentialStorage`). It exposes higher-level service objects,
such as the SSA objects for the across-server
"""
def __init__(
self,
client_id: str | None = None,
client_secret: str | None = None,
creds_store: CredentialStorage | None = None,
):
"""
Initialize a Client instance for the Across API.
Credentials can be provided through the following resolution order:
1. Direct arguments to the Client constructor.
2. Credential Storage interface.
3. Environment variables: `ACROSS_SERVER_ID` and `ACROSS_SERVER_SECRET`
Args:
client_id (str | None, optional):
The client ID used for authentication.
client_secret (str | None, optional):
The client secret used for authentication.
credentials (CredentialStorage | None, optional):
A credentials storage object that can provide authentication
tokens. If provided, it takes precedence over `client_id`
and `client_secret`.
"""
configuration = sdk.Configuration(host=config.HOST, username=client_id, password=client_secret)
[docs]
self.across_client = ApiClientWrapper.get_client(configuration=configuration, creds=creds_store)
# configuration.access_token needs to be populated
self.across_client.refresh()
@property
[docs]
def observatory(self) -> Observatory:
"""
Get an `Observatory` instance for interacting with the API.
The `Observatory` provides methods to query observatory-related resources in the Across API.
Returns:
Observatory: An initialized `Observatory` client bound to
this Client’s API session.
"""
return Observatory(self.across_client)
@property
[docs]
def telescope(self) -> Telescope:
"""
Get an `Telescope` instance for interacting with the API.
The `Telescope` provides methods to query telescope-related resources in the Across API.
Returns:
Telescope: An initialized `Telescope` client bound to
this Client’s API session.
"""
return Telescope(self.across_client)
@property
[docs]
def instrument(self) -> Instrument:
"""
Get an `Instrument` instance for interacting with the API.
The `Instrument` provides methods to query instrument-related resources in the Across API.
Returns:
Instrument: An initialized `Instrument` client bound to
this Client’s API session.
"""
return Instrument(self.across_client)
@property
[docs]
def filter(self) -> Filter:
"""
Get an `Filter` instance for interacting with the API.
The `Filter` provides methods to query filter-related resources in the Across API.
Returns:
Filter: An initialized `Filter` client bound to
this Client’s API session.
"""
return Filter(self.across_client)
@property
[docs]
def schedule(self) -> Schedule:
"""
Get an `Schedule` instance for interacting with the API.
The `Schedule` provides methods to query schedule-related resources in the Across API.
Returns:
Schedule: An initialized `Schedule` client bound to
this Client’s API session.
"""
return Schedule(self.across_client)
@property
[docs]
def observation(self) -> Observation:
"""
Get an `Observation` instance for interacting with the API.
The `Observation` provides methods to query observation-related resources in the Across API.
Returns:
Observation: An initialized `Observation` client bound to
this Client’s API session.
"""
return Observation(self.across_client)
@property
[docs]
def visibility_calculator(self) -> VisibilityCalculator:
"""
Get a `VisibilityCalculator` instance for interacting with the API.
The `VisibilityCalculator` provides methods to calculate visibility windows
for instruments in the Across API.
Returns:
VisibilityCalculator: An initialized `VisibilityCalculator` client bound to
this Client’s API session.
"""
return VisibilityCalculator(self.across_client)