1- import sys
2-
3- sys .path .append ('./lib/' )
4-
5- import pybase64
6- import json
1+ import datetime
72import hashlib
83import hmac
4+ import json
5+ import logging
96import re
10- import requests
7+ import sys
118import time
12- import boto3
13- from dotenv import load_dotenv
149from os import getenv
15- import datetime
16- import logging
10+
11+
12+ # needs to be above imports for the additional dependencies
13+ # flake8 E402 would complain about this so is ignored
14+ sys .path .append ("./lib/" )
15+
16+ import boto3 # noqa: E402
17+ import pybase64 # noqa: E402
18+ import requests # noqa: E402
19+ from dotenv import load_dotenv # noqa: E402
20+
1721
1822logger = logging .getLogger ()
1923logger .setLevel (logging .INFO )
2024
2125
2226def remove_illegal_characters (string ):
2327 """Removes illegal characters from string"""
24- regex_list = [['=' , "" ], ['\/' , "_" ], ['+' , "-" ]]
28+ regex_list = [["=" , "" ], ["\/" , "_" ], ["+" , "-" ]] # noqa: W605
2529 for r in regex_list :
26- string = re .sub (string = string ,
27- pattern = "[{}]" .format (r [0 ]),
28- repl = r [1 ])
30+ string = re .sub (string = string , pattern = "[{}]" .format (r [0 ]), repl = r [1 ])
2931 return string
3032
3133
@@ -44,37 +46,39 @@ def dictionary_to_string(dictionary):
4446def create_signature (header , payload , secret ):
4547 """Encode JSON string"""
4648 # hashed header, hashed payload, string secret
47- unsigned_token = header + '.' + payload
48- key_bytes = bytes (secret , 'utf-8' )
49- string_to_sign_bytes = bytes (unsigned_token , 'utf-8' )
50- signature_hash = hmac .new (key_bytes , string_to_sign_bytes , digestmod = hashlib .sha256 ).digest ()
49+ unsigned_token = header + "." + payload
50+ key_bytes = bytes (secret , "utf-8" )
51+ string_to_sign_bytes = bytes (unsigned_token , "utf-8" )
52+ signature_hash = hmac .new (
53+ key_bytes , string_to_sign_bytes , digestmod = hashlib .sha256
54+ ).digest ()
5155 encoded_signature = pybase64 .b64encode (signature_hash )
52- encoded_signature = encoded_signature .decode (' utf-8' )
56+ encoded_signature = encoded_signature .decode (" utf-8" )
5357 encoded_signature = remove_illegal_characters (encoded_signature )
5458 return encoded_signature
5559
5660
5761def get_token (url , encoded_header , encoded_payload , signature , headers ):
5862 """Get token"""
5963 assertion = encoded_header + "." + encoded_payload + "." + signature
60- data = f' assertion={ assertion } &grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer'
64+ data = f" assertion={ assertion } &grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer"
6165 response = requests .post (url , headers = headers , data = data )
6266 response_json = response .json ()
63- auth_token = response_json .get (' access_token' )
67+ auth_token = response_json .get (" access_token" )
6468 return auth_token
6569
6670
6771def get_icaseworks_report_from (report_id , from_date , auth_headers , auth_payload ):
6872 report_url = "https://hackneyreports.icasework.com/getreport?"
69- request_url = f' { report_url } ReportId={ report_id } &Format=json&From={ from_date } '
70- logger .info (f' Request url: { request_url } ' )
73+ request_url = f" { report_url } ReportId={ report_id } &Format=json&From={ from_date } "
74+ logger .info (f" Request url: { request_url } " )
7175 response = requests .get (request_url , headers = auth_headers , data = auth_payload )
72- logger .info (f' Status Code: { response .status_code } ' )
76+ logger .info (f" Status Code: { response .status_code } " )
7377 return response .content
7478
7579
7680def write_dataframe_to_s3 (s3_client , data , s3_bucket , output_folder , filename ):
77- filename = re .sub (' [^a-zA-Z0-9]+' , '-' , filename ).lower ()
81+ filename = re .sub (" [^a-zA-Z0-9]+" , "-" , filename ).lower ()
7882 current_date = datetime .datetime .now ()
7983 day = single_digit_to_zero_prefixed_string (current_date .day )
8084 month = single_digit_to_zero_prefixed_string (current_date .month )
@@ -83,7 +87,7 @@ def write_dataframe_to_s3(s3_client, data, s3_bucket, output_folder, filename):
8387 return s3_client .put_object (
8488 Bucket = s3_bucket ,
8589 Body = data ,
86- Key = f"{ output_folder } /import_year={ year } /import_month={ month } /import_day={ day } /import_date={ date } /{ filename } .json"
90+ Key = f"{ output_folder } /import_year={ year } /import_month={ month } /import_day={ day } /import_date={ date } /{ filename } .json" ,
8791 )
8892
8993
@@ -102,14 +106,16 @@ def lambda_handler(event, lambda_context):
102106 url = "https://hackney.icasework.com/token"
103107
104108 headers = {
105- ' Content-Type' : ' application/x-www-form-urlencoded' ,
109+ " Content-Type" : " application/x-www-form-urlencoded" ,
106110 }
107111
108112 # Get api api credentials from secrets manager
109113 secret_name = getenv ("SECRET_NAME" )
110- secrets_manager_client = boto3 .client ('secretsmanager' )
111- api_credentials_response = retrieve_credentials_from_secrets_manager (secrets_manager_client , secret_name )
112- api_credentials = json .loads (api_credentials_response ['SecretString' ])
114+ secrets_manager_client = boto3 .client ("secretsmanager" )
115+ api_credentials_response = retrieve_credentials_from_secrets_manager (
116+ secrets_manager_client , secret_name
117+ )
118+ api_credentials = json .loads (api_credentials_response ["SecretString" ])
113119 api_key = api_credentials .get ("api_key" )
114120 secret = api_credentials .get ("secret" )
115121
@@ -122,11 +128,7 @@ def lambda_handler(event, lambda_context):
122128 # Create payload
123129 current_unix_time = int (time .time ())
124130 str_time = str (current_unix_time )
125- payload_object = {
126- "iss" : api_key ,
127- "aud" : url ,
128- "iat" : str_time
129- }
131+ payload_object = {"iss" : api_key , "aud" : url , "iat" : str_time }
130132
131133 payload_object = dictionary_to_string (payload_object )
132134
@@ -136,16 +138,21 @@ def lambda_handler(event, lambda_context):
136138 signature = create_signature (header , payload , secret )
137139
138140 # Get token from response
139- auth_token = get_token (url = url , encoded_header = header , encoded_payload = payload , signature = signature ,
140- headers = headers )
141+ auth_token = get_token (
142+ url = url ,
143+ encoded_header = header ,
144+ encoded_payload = payload ,
145+ signature = signature ,
146+ headers = headers ,
147+ )
141148
142149 # Create auth header for API Calls and auth payload
143- authorization = f' Bearer { auth_token } '
150+ authorization = f" Bearer { auth_token } "
144151
145152 auth_payload = {}
146153
147154 auth_headers = {
148- ' Authorization' : authorization ,
155+ " Authorization" : authorization ,
149156 }
150157
151158 report_tables = [
@@ -164,22 +171,32 @@ def lambda_handler(event, lambda_context):
164171 date_to_track_from = today - datetime .timedelta (days = 1 )
165172 logger .info (f"Date to track from: { date_to_track_from } " )
166173
167- s3_client = boto3 .client ('s3' )
174+ s3_client = boto3 .client ("s3" )
168175
169176 for report_details in report_tables :
170- logger .info (f' Pulling report for { report_details [" name" ] } ' )
177+ logger .info (f" Pulling report for { report_details [' name' ] } " )
171178 case_id_report_id = report_details ["id" ]
172- case_id_list = get_icaseworks_report_from (case_id_report_id , date_to_track_from , auth_headers , auth_payload )
179+ case_id_list = get_icaseworks_report_from (
180+ case_id_report_id , date_to_track_from , auth_headers , auth_payload
181+ )
173182 report_details ["data" ] = case_id_list
174- write_dataframe_to_s3 (s3_client , report_details ["data" ], s3_bucket , output_folder_name , report_details ["name" ])
175- logger .info (f'Finished writing report for { report_details ["name" ]} to S3' )
183+ write_dataframe_to_s3 (
184+ s3_client ,
185+ report_details ["data" ],
186+ s3_bucket ,
187+ output_folder_name ,
188+ report_details ["name" ],
189+ )
190+ logger .info (f"Finished writing report for { report_details ['name' ]} to S3" )
176191
177192 # Trigger glue job to copy from landing to raw and convert to parquet
178- glue_client = boto3 .client (' glue' )
193+ glue_client = boto3 .client (" glue" )
179194 start_glue_trigger (glue_client , glue_trigger_name )
180195
196+
181197def single_digit_to_zero_prefixed_string (value ):
182- return str (value ) if value > 9 else '0' + str (value )
198+ return str (value ) if value > 9 else "0" + str (value )
199+
183200
184201def start_glue_trigger (glue_client , trigger_name ):
185202 trigger_details = glue_client .start_trigger (Name = trigger_name )
0 commit comments