diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index 0d2a6c2..7780bd8 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -2,8 +2,14 @@
+
+
+
+
-
+
+
+
@@ -24,13 +30,13 @@
-
+
-
+
@@ -38,8 +44,8 @@
-
-
+
+
@@ -49,7 +55,7 @@
-
+
@@ -57,56 +63,14 @@
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
-
-
@@ -178,7 +143,7 @@
-
+
@@ -235,7 +200,7 @@
-
+
@@ -247,9 +212,6 @@
-
-
-
@@ -265,13 +227,6 @@
-
-
-
-
-
-
-
@@ -338,43 +293,72 @@
-
-
-
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/HtmlReader.py b/HtmlReader.py
index 52b98c9..e687599 100644
--- a/HtmlReader.py
+++ b/HtmlReader.py
@@ -62,8 +62,8 @@ class HtmlReader:
tbody = workout_summary_table.contents[0]
- v1_id = tbody.contents[0].contents[0].text
+ v1_id = tbody.contents[0].contents[0].text
# the OT_REPORT template has changed slightly over the past few months
# the summary is in different places for each type of template
@@ -100,6 +100,13 @@ class HtmlReader:
+ # reads all html files in a given directory and scrapes them
+ # we return the aggregated data as a dictionary called 'event'
+ # an event has the following keys: calories,splat_pts,steps,date,time,coach,template_version,avg_heart_rate,peak_heart_rate
+ # these keys are currently found in 3 different sections
+ # 1. this_class: the THIS CLASS row in the summary table
+ # 2. summary: data about date, time and coach
+ # 3. cardio: max and average heart rate data found in the tiles of the email template
def read_all(self, directory):
files = glob.glob(directory)
diff --git a/Untitled.ipynb b/Untitled.ipynb
index 5878ac9..04a5a35 100644
--- a/Untitled.ipynb
+++ b/Untitled.ipynb
@@ -2,7 +2,7 @@
"cells": [
{
"cell_type": "code",
- "execution_count": 89,
+ "execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
@@ -16,7 +16,7 @@
},
{
"cell_type": "code",
- "execution_count": 257,
+ "execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
@@ -37,7 +37,7 @@
},
{
"cell_type": "code",
- "execution_count": 258,
+ "execution_count": 4,
"metadata": {},
"outputs": [
{
@@ -153,7 +153,7 @@
"4 159 191 "
]
},
- "execution_count": 258,
+ "execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
@@ -204,7 +204,7 @@
},
{
"cell_type": "code",
- "execution_count": 259,
+ "execution_count": 5,
"metadata": {},
"outputs": [
{
@@ -213,7 +213,7 @@
"array(['Shelby', 'Kevin', 'Stephen', 'Kate'], dtype=object)"
]
},
- "execution_count": 259,
+ "execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
@@ -224,7 +224,7 @@
},
{
"cell_type": "code",
- "execution_count": 260,
+ "execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
@@ -284,64 +284,19 @@
},
{
"cell_type": "code",
- "execution_count": 262,
+ "execution_count": 7,
"metadata": {},
"outputs": [
{
- "data": {
- "text/html": [
- "
\n",
- "\n",
- "
\n",
- " \n",
- "
\n",
- "
\n",
- "
calories
\n",
- "
coach
\n",
- "
\n",
- " \n",
- " \n",
- "
\n",
- "
Kevin
\n",
- "
777.400000
\n",
- "
Kevin
\n",
- "
\n",
- "
\n",
- "
Shelby
\n",
- "
804.900000
\n",
- "
Shelby
\n",
- "
\n",
- "
\n",
- "
Stephen
\n",
- "
810.666667
\n",
- "
Stephen
\n",
- "
\n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- " calories coach\n",
- "Kevin 777.400000 Kevin\n",
- "Shelby 804.900000 Shelby\n",
- "Stephen 810.666667 Stephen"
- ]
- },
- "execution_count": 262,
- "metadata": {},
- "output_type": "execute_result"
+ "ename": "NameError",
+ "evalue": "name 'cal_df' is not defined",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+ "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
+ "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mcal_df\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msort_values\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mascending\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mby\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'calories'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
+ "\u001b[0;31mNameError\u001b[0m: name 'cal_df' is not defined"
+ ]
}
],
"source": [
@@ -387,20 +342,19 @@
},
{
"cell_type": "code",
- "execution_count": 264,
+ "execution_count": 1,
"metadata": {},
"outputs": [
{
- "data": {
- "image/png": "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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {
- "needs_background": "light"
- },
- "output_type": "display_data"
+ "ename": "NameError",
+ "evalue": "name 'ot_df_cpy' is not defined",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+ "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
+ "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mline\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mot_df_cpy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mplot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'date'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'avg_heart_rate'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkind\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'line'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfigsize\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m20\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
+ "\u001b[0;31mNameError\u001b[0m: name 'ot_df_cpy' is not defined"
+ ]
}
],
"source": [
diff --git a/config.json b/config.json
index 14ced0d..0affc76 100644
--- a/config.json
+++ b/config.json
@@ -1 +1 @@
-{"last_run": "2018-11-26"}
\ No newline at end of file
+{"last_run": "2018-11-27"}
\ No newline at end of file
diff --git a/google/__pycache__/gmailWorker.cpython-37.pyc b/google/__pycache__/gmailWorker.cpython-37.pyc
new file mode 100644
index 0000000..0e17220
Binary files /dev/null and b/google/__pycache__/gmailWorker.cpython-37.pyc differ
diff --git a/google/gmailApi.py b/google/gmailApi.py
index 8053afb..a3fdaa4 100644
--- a/google/gmailApi.py
+++ b/google/gmailApi.py
@@ -38,44 +38,46 @@ class GmailApi:
self.service = build('gmail', 'v1', http=creds.authorize(Http()))
+ # get all labels associated with the authenticated user
def get_labels(self):
results = self.service.users().labels().list(userId="me").execute()
return results.get('labels', [])
+
+ # query gmail for emails.
+ # query format is standard gmail search queries
+ # e.g: 'after: 11/27/2018' -> returns emails that were received after the date given
def get_ot_messages(self, query=''):
no_new_messages = True
- #gets the ids of all messages that match the OT LabelId and provided query
+ # gets the ids of all messages that match the OT LabelId and provided query
results = self.service.users().messages().list(userId="me", labelIds=[OT_LABEL_ID], q=query).execute()
saved_templates = load_already_parsed_message_ids()
- #if no query is provided we default to pull all data
- if(query == ''):
+ # if no query is provided we default to pull all data
+ if query == '':
no_new_messages = False
-
- #find out the ids of messages that are saved locally
+ # find out the ids of messages that are saved locally
for result in results['messages']:
- if(result['id'] not in saved_templates):
+ if result['id'] not in saved_templates:
no_new_messages = False
-
- #if no new messages are found in any case raise error to catch accordingly
- if(results['resultSizeEstimate'] == 0 or no_new_messages):
+ # if no new messages are found in any case raise error to catch accordingly
+ if results['resultSizeEstimate'] == 0 or no_new_messages:
raise Errors.NoMessagesFoundException(userId='me', labelIds=[OT_LABEL_ID], q=query)
-
log_msg = "Found {} new OT Email(s).".format(len(results["messages"]))
print(log_msg)
-
return results["messages"]
+ # get a single message by message_id
def get_message(self, message_id):
m_res = self.service.users().messages().get(id=message_id, userId='me').execute()
diff --git a/google/gmailWorker.py b/google/gmailWorker.py
new file mode 100644
index 0000000..32dfdaf
--- /dev/null
+++ b/google/gmailWorker.py
@@ -0,0 +1,20 @@
+from threading import Thread
+from google.gmailApi import GmailApi
+
+
+
+class GmailWorker(Thread):
+ def __init__(self, queue):
+ Thread.__init__(self)
+ self.queue = queue
+ self.gmail = GmailApi()
+
+ def run(self):
+ while True:
+ message_id,parse = self.queue.get()
+
+ content = self.gmail.get_message(message_id)
+
+ parse(content,message_id)
+
+ self.queue.task_done()
diff --git a/htmlParser.py b/htmlParser.py
deleted file mode 100644
index 696035e..0000000
--- a/htmlParser.py
+++ /dev/null
@@ -1,20 +0,0 @@
-from html.parser import HTMLParser
-from bs4 import BeautifulSoup
-
-# class MyHTMLParser(HTMLParser):
-# def handle_starttag(self, tag, attrs):
-# print("Encountered a start tag:", tag)
-
-# def handle_endtag(self, tag):
-# print("Encountered an end tag :", tag)
-
-# def handle_data(self, data):
-# print("Encountered some data :", data)
-
-with open('test.html') as file:
- soup = BeautifulSoup(file)
- print(soup.prettify())
-
-
-
-
diff --git a/main.py b/main.py
index b4fcf62..0149753 100644
--- a/main.py
+++ b/main.py
@@ -2,7 +2,9 @@
from google.gmailApi import GmailApi
from google.Errors import NoMessagesFoundException
+from google.gmailWorker import GmailWorker
from pytime import pytime
+from queue import Queue
import HtmlReader
import base64
import json
@@ -10,6 +12,9 @@ import sys
import csv
+#get the config
+#currently only returns a json object with a single key
+#the key will tell us when we last ran the program
def get_config():
config_file = open('config.json')
config = json.load(config_file)
@@ -24,7 +29,8 @@ def save_config(config):
config_file.close()
-
+#write the file to disk.
+#name is generally of the format 'OTReport_.html'
def write_to_html_file(html, name):
path = "./htmlFilesv2/{}".format(name)
file = open(path, "w")
@@ -33,6 +39,7 @@ def write_to_html_file(html, name):
file.close()
+#parses the raw byte content of an OT Email and writes it to ./htmlFilesv2 as an html file
def parse_message(msg_json, msg_id):
message_parts = msg_json["payload"]["parts"]
@@ -44,24 +51,40 @@ def parse_message(msg_json, msg_id):
file_name = 'OTReport_{}.html'.format(msg_id)
write_to_html_file(result, file_name)
+
def get_last_run_time(timestamp):
yesterday = str(pytime.before(timestamp, '1d')).split(' ')[0]
return yesterday
+
+#pulls the gmail data
+#creates 4 worker threads to speed up the download and parsing of emails
def pull_gmail_data(query=''):
gmail = GmailApi()
+ queue = Queue()
messages = gmail.get_ot_messages(query)
+ #start 4 worker threads to speed up the download and parsing of emails
+ for x in range(4):
+ print('starting worker')
+ worker = GmailWorker(queue)
+ worker.daemon = True
+ worker.start()
+
+
+ #push task into the queue as a tuple
+ #second item in the task tuple is always the parse_message function defined above
for message in messages:
id = message['id']
- m_res = gmail.get_message(id)
+ queue.put((id,parse_message))
- parse_message(m_res, id)
+
+ queue.join() #wait
def do_latest(config):
last_run = get_last_run_time(config['last_run'])
@@ -69,6 +92,8 @@ def do_latest(config):
pull_gmail_data(query)
+
+
def write_to_csv(events):
with open('events.csv', 'w', newline='') as csvFile:
field_names = ['calories', 'splat_pts', 'steps', 'date', 'time', 'coach', 'template_version', 'avg_heart_rate', 'peak_heart_rate']
@@ -110,6 +135,7 @@ def main():
last_run = get_last_run_time(config['last_run'])
query = 'after:{}'.format(last_run)
+
#try to find data
try:
pull_gmail_data(query)