Skip to content

Commit 641a2fa

Browse files
Calon, RobCalon, Rob
authored andcommitted
Merge branch 'develop' into main
2 parents 2077a14 + a90400c commit 641a2fa

File tree

5 files changed

+106
-93
lines changed

5 files changed

+106
-93
lines changed

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
44

55
[project]
66
name = "pyetm"
7-
version = "1.1.1"
7+
version = "1.2.0"
88
description = "Python-ETM Connector"
99
authors = [{name = "Rob Calon", email = "[email protected]"}]
1010
readme = "README.md"

src/pyetm/client/client.py

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -191,8 +191,8 @@ def from_saved_scenario_id(
191191
def __init__(
192192
self,
193193
scenario_id: str | None = None,
194-
beta_engine: bool = False,
195-
reset: bool = False,
194+
engine_url: str | None = None,
195+
etm_url: str | None = None,
196196
token: str | None = None,
197197
session: RequestsSession | AIOHTTPSession | None = None,
198198
**kwargs
@@ -204,16 +204,15 @@ def __init__(
204204
scenario_id : str, default None
205205
The api_session_id to which the client connects. Can only access
206206
a limited number of methods when scenario_id is set to None.
207-
beta_engine : bool, default False
208-
Connect to the beta-engine instead of the production-engine.
209-
reset : bool, default False
210-
Reset scenario on initalization.
211207
token : str, default None
212208
Personal access token to authenticate requests to your
213209
personal account and scenarios. Detects token automatically
214-
from environment when assigned to ETM_ACCESS_TOKEN when
215-
connected to production or ETM_BETA_ACCESS_TOKEN when
216-
connected to beta.
210+
from environment when assigned to ETM_ACCESS_TOKEN.
211+
engine_url : str, default None
212+
Specify URL that points to ETM engine, default to public engine.
213+
etm_url : str, default None
214+
Specify URL that points to ETM model (pro), default to public
215+
energy transition model.
217216
session: object instance, default None
218217
session instance that handles requests to ETM's public API.
219218
Default to use a RequestsSession.
@@ -238,7 +237,8 @@ def __init__(
238237
self._session = session
239238

240239
# set engine and token
241-
self.beta_engine = beta_engine
240+
self.engine_url = engine_url
241+
self.etm_url = etm_url
242242
self.token = token
243243

244244
# set scenario id
@@ -247,10 +247,6 @@ def __init__(
247247
# set default gqueries
248248
self.gqueries = []
249249

250-
# reset scenario on intialization
251-
if reset and (scenario_id is not None):
252-
self.reset_scenario()
253-
254250
# make message
255251
msg = (
256252
"Initialised new Client: "
@@ -282,7 +278,7 @@ def __repr__(self):
282278
params = {
283279
**{
284280
"scenario_id": self.scenario_id,
285-
"beta_engine": self.beta_engine,
281+
"engine_url": self.engine_url,
286282
"session": self.session
287283
},
288284
**self.__kwargs

src/pyetm/client/scenario.py

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
"""Authentication methods"""
22

33
from __future__ import annotations
4-
# from pathlib import Path
54

65
import copy
6+
from urllib.parse import urljoin
77

88
import pandas as pd
99
from .session import SessionMethods
@@ -87,15 +87,7 @@ def private(self, boolean: bool):
8787
@property
8888
def pro_url(self) -> str:
8989
"""get pro url for session id"""
90-
91-
# specify base url
92-
base = 'https://energytransitionmodel.com'
93-
94-
# update to beta server
95-
if self.beta_engine:
96-
base = base.replace('https://', 'https://beta.')
97-
98-
return f'{base}/scenarios/{self.scenario_id}/load'
90+
return urljoin(self.etm_url, f'scenarios/{self.scenario_id}/load/')
9991

10092
@property
10193
def scaling(self):

src/pyetm/client/session.py

Lines changed: 47 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
import copy
88
import functools
99

10+
from urllib.parse import urljoin
11+
1012
import pandas as pd
1113

1214
from pyetm.logger import get_modulelogger
@@ -21,39 +23,62 @@
2123
class SessionMethods:
2224
"""Core methods for API interaction"""
2325

26+
@property
27+
def _default_engine_url(self) -> str:
28+
"""default engine url"""
29+
return "https://engine.energytransitionmodel.com/api/v3/"
30+
31+
@property
32+
def connected_to_default_engine(self) -> bool:
33+
"""connected to default engine url?"""
34+
return self.engine_url == self._default_engine_url
35+
2436
@property
2537
def _scenario_header(self) -> dict:
2638
"""get full scenario header"""
2739
return self._get_scenario_header()
2840

2941
@property
30-
def base_url(self) -> str:
31-
""""base url for carbon transition model"""
42+
def engine_url(self) -> str:
43+
"""engine URL"""
44+
return self._engine_url
3245

33-
# return beta engine url
34-
if self.beta_engine:
35-
return "https://beta-engine.energytransitionmodel.com/api/v3/"
46+
@engine_url.setter
47+
def engine_url(self, url: str | None):
3648

37-
return "https://engine.energytransitionmodel.com/api/v3/"
49+
# default url
50+
if url is None:
51+
url = self._default_engine_url
52+
53+
# set engine
54+
self._engine_url = str(url)
55+
56+
# reset token and change base url
57+
self.token = None
58+
self.session.base_url = self._engine_url
59+
60+
# reset cache
61+
self._reset_cache()
3862

3963
@property
40-
def beta_engine(self) -> bool:
41-
"""connects to beta-engine when True and to production-engine
42-
when False."""
43-
return self._beta_engine
64+
def etm_url(self) -> str:
65+
"""model URL"""
4466

45-
@beta_engine.setter
46-
def beta_engine(self, boolean: bool) -> None:
47-
"""set beta engine attribute"""
67+
# raise error
68+
if self.etm_url is None:
69+
raise ValueError("ETModel URL not set on initialisation.")
4870

49-
# set boolean and reset session
50-
self._beta_engine = bool(boolean)
71+
return self._etm_url
5172

52-
# set related settings
53-
self.token = None
54-
self.session.base_url = self.base_url
73+
@etm_url.setter
74+
def etm_url(self, url: str | None):
5575

56-
self._reset_cache()
76+
# use default pro location
77+
if (url is None) & (self.connected_to_default_engine):
78+
url = "https://energytransitionmodel.com/"
79+
80+
# set etmodel
81+
self._etm_url = str(url)
5782

5883
@property
5984
def scenario_id(self) -> int | None:
@@ -113,14 +138,10 @@ def token(self) -> pd.Series | None:
113138
@token.setter
114139
def token(self, token: str | None = None):
115140

116-
# check environment variables for production token
117-
if (token is None) & (not self.beta_engine):
141+
# check environment variables for token
142+
if token is None:
118143
token = os.getenv('ETM_ACCESS_TOKEN')
119144

120-
# check environment variables for beta token
121-
if (token is None) & self.beta_engine:
122-
token = os.getenv('ETM_BETA_ACCESS_TOKEN')
123-
124145
# store token
125146
self._token = token
126147

@@ -179,11 +200,8 @@ def _get_scenario_header(self):
179200
def _get_session_id(self, scenario_id: int) -> int:
180201
"""get a session_id for a pro-environment scenario"""
181202

182-
# make pro url
183-
host = "https://energytransitionmodel.com"
184-
url = f"{host}/saved_scenarios/{scenario_id}/load"
185-
186203
# extract content from url
204+
url = urljoin(self.etm_url, f'saved_scenarios/{scenario_id}/load/')
187205
content = self.session.request("get", url, decoder='text')
188206

189207
# get session id from content

0 commit comments

Comments
 (0)