@@ -103,6 +103,31 @@ def validate_query_params(event):
103103 }
104104
105105
106+ def parse_manifest_line (line : str ):
107+ """Parse a release manifest line into parts.
108+
109+ Parameters
110+ ----------
111+ line : str
112+ A single non-empty manifest line.
113+
114+ Returns
115+ -------
116+ tuple[str, str, str, bool] | None
117+ Parsed ``(instrument, data_type, descriptor, release_flag)`` or
118+ ``None`` if the line does not contain exactly four comma-separated
119+ fields.
120+ """
121+ parts = [item .strip () for item in line .split ("," )]
122+ if len (parts ) != 4 :
123+ raise ValueError (
124+ f"Manifest line must contain exactly four comma-separated fields: { line } "
125+ )
126+
127+ instrument , data_type , descriptor , release_flag = parts
128+ return instrument , data_type , descriptor , release_flag .lower () == "true"
129+
130+
106131def latest_ancillary_release (
107132 session ,
108133 start_date : datetime .datetime ,
@@ -125,8 +150,6 @@ def latest_ancillary_release(
125150 ----------
126151 session : orm session
127152 Database session.
128- instrument : str
129- Instrument name.
130153 start_date : datetime.datetime
131154 Start of query date range.
132155 end_date : datetime.datetime
@@ -136,12 +159,11 @@ def latest_ancillary_release(
136159
137160 Returns
138161 -------
139- Query
140- A query of a single file_path column, for use as an `.in_()`
141- subquery so a large release stays a single UPDATE statement.
162+ list
163+ A list of the latest version ancillary files released.
142164 """
143165 ancillary_table = models .AncillaryFiles
144- instrument , data_type , descriptor , _ = ( item . strip () for item in line . split ( "," ) )
166+ instrument , data_type , descriptor , _ = parse_manifest_line ( line )
145167 # Scenarios:
146168 # hit, *, *, true, -- release all ancillary files
147169 # hit, ancillary, *, true -- release all ancillary descriptors
@@ -229,9 +251,26 @@ def latest_ancillary_release(
229251
230252
231253def latest_science_release (session , start_date , end_date , line ):
232- """Set the released flag to True for latest-version science files."""
254+ """Set the released flag to True for latest-version science files.
255+
256+ Parameters
257+ ----------
258+ session : orm session
259+ Database session.
260+ start_date : datetime.datetime
261+ Start of query date range.
262+ end_date : datetime.datetime
263+ End of query date range.
264+ line : str
265+ Manifest line describing the science release selection.
266+
267+ Returns
268+ -------
269+ list
270+ A list of the latest version science files released.
271+ """
233272 sci = models .ScienceFiles .__table__ .c
234- instrument , data_type , descriptor , _ = ( item . strip () for item in line . split ( "," ) )
273+ instrument , data_type , descriptor , _ = parse_manifest_line ( line )
235274
236275 # Construct query logic based on different scenarios:
237276 # 1. hit, *, *, true -- release all data levels
@@ -319,7 +358,7 @@ def release_type_handler(query_params):
319358 with db .Session () as session :
320359 manifest_path = download_file (manifest_file )
321360
322- manifest_file_obj = generate_imap_file_path (manifest_path . name )
361+ manifest_file_obj = generate_imap_file_path (manifest_file )
323362 start_date = datetime .datetime .strptime (manifest_file_obj .start_date , "%Y%m%d" )
324363 end_date = datetime .datetime .strptime (manifest_file_obj .end_date , "%Y%m%d" )
325364
@@ -334,8 +373,7 @@ def release_type_handler(query_params):
334373 if line .startswith ("instrument," ):
335374 continue
336375
337- _ , data_type , _ , release_flag = (item .strip () for item in line .split ("," ))
338- release_flag = release_flag == "true"
376+ _ , data_type , _ , release_flag = parse_manifest_line (line )
339377 # If row is to exclude, skip release process.
340378 if not release_flag :
341379 continue
@@ -360,18 +398,20 @@ def release_type_handler(query_params):
360398
361399 return {
362400 "statusCode" : 200 ,
363- "body" : json .dumps ("Successfully released " ),
401+ "body" : json .dumps (
402+ f"Successfully released data per specification in { manifest_file } "
403+ ),
364404 }
365405
366406
367407def early_release_type_handler (query_params ):
368408 """Handle early-release requests using manifest file."""
369- return {"statusCode" : 200 , "body" : "Early release operation not supported yet." }
409+ return {"statusCode" : 501 , "body" : "Early release operation not supported yet." }
370410
371411
372412def unrelease_type_handler (query_params ):
373413 """Handle unrelease requests using manifest file."""
374- return {"statusCode" : 200 , "body" : "Unrelease operation not supported yet." }
414+ return {"statusCode" : 501 , "body" : "Unrelease operation not supported yet." }
375415
376416
377417def reprocess_type_handler (query_params ):
@@ -380,7 +420,7 @@ def reprocess_type_handler(query_params):
380420 NOTE: This may not be needed. If not needed, remove support
381421 at imap-data-access before removing this.
382422 """
383- return {"statusCode" : 200 , "body" : "Reprocess for data release not supported yet." }
423+ return {"statusCode" : 501 , "body" : "Reprocess for data release not supported yet." }
384424
385425
386426def lambda_handler (event , context ):
0 commit comments