1
1
import logging
2
- from typing import Optional , List
2
+ from typing import Optional , List , Literal
3
3
from datetime import datetime , timedelta
4
4
import json
5
5
import re
6
6
7
7
import requests
8
8
9
9
from .configure_logging import setup_logger
10
- from .resources import resource_ids
10
+ from .resources import api_resource_ids , file_resource_ids
11
11
from .exceptions import UnsuccessfulRequest
12
12
13
13
logger = setup_logger (logging .getLogger ("PyNgEso" ))
14
14
15
15
16
16
class NgEso :
17
+ """
18
+ A class for fetching data from the National Grid ESO data portal.
19
+
20
+ Args:
21
+ resource_id (str): id for the resource when using the ESO API functionality
22
+ resource (str): name of the resource when using the ESO API functionality
23
+ Returns:
24
+
25
+ """
17
26
def __init__ (
18
27
self ,
19
28
resource : str ,
20
- dataset : Optional [ str ] = None
29
+ backend : Literal [ 'api' , 'file' ] = "api"
21
30
):
22
31
self .resource = resource
23
- self .dataset = dataset
24
- self .resource_id = resource_ids .get (resource ).get ("id" )
32
+ self .backend = backend
33
+
34
+ self .resource_id , self .dataset_id , self .filename = self .set_resource_info ()
35
+
36
+ def set_resource_info (self ) -> (str , str , str ):
37
+ dataset_id = None
38
+ filename = None
39
+ if self .backend == "api" :
40
+ resource_id = api_resource_ids .get (self .resource ).get ("id" )
41
+ else :
42
+ dataset_id = file_resource_ids .get (self .resource ).get ("dataset_id" )
43
+ resource_id = file_resource_ids .get (self .resource ).get ("resource_id" )
44
+ filename = file_resource_ids .get (self .resource ).get ("filename" )
45
+ return resource_id , dataset_id , filename
25
46
26
47
def query (
27
48
self ,
@@ -120,19 +141,22 @@ def validate_date_range(start_date: str, end_date: str) -> None:
120
141
end_date >= start_date
121
142
), "end_date should be the same of greater than start_date"
122
143
123
- @staticmethod
124
- def _check_for_errors (r : requests .Response ) -> None :
144
+ def _check_for_errors (self , r : requests .Response ) -> None :
125
145
"""Inspect the request response and the metadata in xml"""
126
146
# http response errors
127
- status_code = r .status_code
128
- if status_code != 200 or r .content is None :
129
- raise UnsuccessfulRequest (f"status_code={ status_code } :{ r .content } " )
147
+ self ._check_request_errors (r )
130
148
131
149
# inspect response body
132
150
rb : dict = json .loads (r .content )
133
151
if not rb .get ("success" ):
134
152
logger .error (f"Request failed: { rb .get ('error' )} " )
135
153
154
+ @staticmethod
155
+ def _check_request_errors (r : requests .Response ) -> None :
156
+ status_code = r .status_code
157
+ if status_code != 200 or r .content is None :
158
+ raise UnsuccessfulRequest (f"status_code={ status_code } :{ r .content } " )
159
+
136
160
@staticmethod
137
161
def _missing_data (r : requests .Response ) -> None :
138
162
"""
@@ -144,3 +168,13 @@ def _missing_data(r: requests.Response) -> None:
144
168
query = rb .get ("query" )
145
169
if not records :
146
170
logger .warning (f"{ query } : No data found" )
171
+
172
+ def download_file (self ) -> bytes :
173
+ url = (
174
+ f"https://data.nationalgrideso.com/backend/dataset/{ self .dataset_id } /"
175
+ f"resource/{ self .resource_id } /download/{ self .filename } "
176
+ )
177
+ r = requests .get (url )
178
+ self ._check_request_errors (r )
179
+
180
+ return r .content
0 commit comments