Skip to content

Commit 20e82d3

Browse files
committed
Testing Setup Initialization
🐛 Data store setup still not working 100% Moving forward with 0.1.0 beta release without the setup capability fully working. Worked on logging, which is now properly displaying. Closes: #3
1 parent 46e6f9e commit 20e82d3

File tree

8 files changed

+114
-51
lines changed

8 files changed

+114
-51
lines changed

.gitignore

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
.idea/**/tasks.xml
99
.idea/**/dictionaries
1010
.idea/**/shelf
11+
log/
12+
1113

1214
# Sensitive or high-churn files
1315
.idea/**/dataSources/
@@ -168,3 +170,6 @@ venv.bak/
168170
[Ss]cripts
169171
pyvenv.cfg
170172
pip-selfcheck.json
173+
.idea/misc.xml
174+
.idea/modules.xml
175+
.idea/process_tracker_python.iml

process_tracker/cli.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,11 @@
66
import logging
77

88
from process_tracker.data_store import DataStore
9+
from process_tracker.logging import console
910

1011
data_store = DataStore()
1112
logger = logging.getLogger('Process Tracker')
12-
logger.setLevel(os.environ.get('log_level', 'DEBUG'))
13+
logger.addHandler(console)
1314

1415

1516
@click.group()
@@ -21,11 +22,15 @@ def main():
2122

2223

2324
@main.command()
25+
# @click.option('-o', '--overwrite', default=False, help='Wipe out the current data store and rebuild'
26+
# ', starting from fresh.')
2427
def setup():
2528
"""
26-
Initialize ProcessTracker's data store with user provided input. If already in place, do nothing.
29+
Initialize ProcessTracker's data store with user provided input. If already in place, do nothing unless overwrite
30+
set to True.
2731
:return:
2832
"""
33+
click.echo('Attempting to initialize data store...')
2934
data_store.initialize_data_store()
3035

3136

process_tracker/data_store.py

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@
44
from click import ClickException
55

66
from sqlalchemy import create_engine, MetaData
7-
from sqlalchemy.orm import sessionmaker, Session
7+
from sqlalchemy.orm import sessionmaker
88
from sqlalchemy_utils import database_exists
99

10+
from process_tracker.logging import console
11+
1012
from process_tracker.models.actor import Actor
1113
from process_tracker.models.extract import ExtractStatus
1214
from process_tracker.models.process import ErrorType, ProcessType, ProcessStatus
@@ -28,9 +30,9 @@ def __init__(self):
2830
Need to initialize the data store connection when starting to access the data store.
2931
"""
3032
self.logger = logging.getLogger(__name__)
31-
self.logger.setLevel(os.environ.get('log_level', 'DEBUG'))
3233

3334
data_store = self.verify_and_connect_to_data_store()
35+
self.engine = data_store['engine']
3436
self.session = data_store['session']
3537
self.meta = data_store['meta']
3638
self.data_store_type = data_store['data_store_type']
@@ -51,10 +53,10 @@ def get_or_create_item(self, model, create=True, **kwargs):
5153
"""
5254

5355
instance = self.session.query(model).filter_by(**kwargs).first()
56+
5457
if instance is None:
55-
self.logger.info('instance not found create = '+ str(create)+'\n')
5658
if create:
57-
self.logger.info('creating instance\n')
59+
self.logger.info('creating instance')
5860
instance = model(**kwargs)
5961
try:
6062
self.session.add(instance)
@@ -77,13 +79,18 @@ def initialize_data_store(self, overwrite=False):
7779
:param overwrite: Only use if data store needs to be wiped and recreated. Default is False.
7880
:type overwrite: bool
7981
"""
80-
82+
self.logger.info('Attempting to initialize Process Tracker data store.')
8183
if overwrite:
82-
self.logger.info('ALERT - DATA STORE TO BE OVERWRITTEN - ALL DATA WILL BE LOST')
84+
self.logger.warn('ALERT - DATA STORE TO BE OVERWRITTEN - ALL DATA WILL BE LOST')
8385
self.meta.reflect()
84-
self.meta.drop_all()
86+
self.meta.drop_all(bind=self.engine)
87+
self.session.commit()
8588

86-
version = self.session.query(System).filter(System.session_key == 'version').first()
89+
version = None
90+
else:
91+
92+
self.logger.debug('Obtaining system version, if exists.')
93+
version = self.session.query(System).filter(System.system_key == 'version').first()
8794

8895
if version is None:
8996

@@ -94,30 +101,38 @@ def initialize_data_store(self, overwrite=False):
94101

95102
self.logger.info('Adding error types...')
96103
for error_type in preload_error_types:
104+
self.logger.info('Adding %s' % error_type)
97105
self.session.add(ErrorType(error_type_name=error_type))
98106
self.session.commit()
99107

100108
self.logger.info('Adding extract status types...')
101109
for extract_status_type in preload_extract_status_types:
110+
self.logger.info('Adding %s' % extract_status_type)
102111
self.session.add(ExtractStatus(extract_status_name=extract_status_type))
103112
self.session.commit()
104113

105114
self.logger.info('Adding process status types...')
106115
for process_status_type in preload_process_status_types:
116+
self.logger.info('Adding %s' % process_status_type)
107117
self.session.add(ProcessStatus(process_status_name=process_status_type))
108118
self.session.commit()
109119

110120
self.logger.info('Adding process types...')
111121
for process_type in preload_process_types:
122+
self.logger.info('Adding %s' % process_type)
112123
self.session.add(ProcessType(process_type_name=process_type))
113124
self.session.commit()
114125

115126
self.logger.info('Adding system keys...')
116127
for system_key, value in preload_system_keys:
128+
self.logger.info('Adding %s' % system_key)
117129
self.session.add(System(system_key=system_key, system_value=value))
118130
self.session.commit()
119131
else:
120-
self.logger.info('It appears the system has already been initialized.')
132+
self.logger.error('It appears the system has already been setup.')
133+
ClickException('It appears the system has already been setup.').show()
134+
135+
self.logger.debug('Finished the initialization check.')
121136

122137
def topic_creator(self, topic, name):
123138
"""
@@ -176,6 +191,7 @@ def topic_deleter(self, topic, name):
176191
self.logger.info('Attempting to delete %s item %s' % (topic, name))
177192

178193
if self.topic_validator(topic=topic):
194+
179195
if topic == 'actor':
180196
item_delete = True
181197
self.session.query(Actor).filter(Actor.actor_name == name).delete()
@@ -300,7 +316,6 @@ def topic_validator(self, topic):
300316
self.logger.error('topic type is invalid. Please use one of the following: %s' % valid_topics.keys())
301317
return False
302318

303-
304319
def verify_and_connect_to_data_store(self):
305320
"""
306321
Based on environment variables, create the data store connection engine.
@@ -372,6 +387,7 @@ def verify_and_connect_to_data_store(self):
372387
meta = ''
373388

374389
data_store = dict()
390+
data_store['engine'] = engine
375391
data_store['session'] = session
376392
data_store['meta'] = meta
377393
data_store['data_store_type'] = data_store_type

process_tracker/extract_tracker.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ def __init__(self, process_run, filename, location=None, location_name=None, loc
3232
:type status: string
3333
"""
3434
self.logger = logging.getLogger(__name__)
35-
self.logger.setLevel(os.environ.get('log_level', 'ERROR'))
35+
self.logger.setLevel(os.environ.get('log_level', 'DEBUG'))
3636

3737
self.data_store = DataStore()
3838
self.session = self.data_store.session

process_tracker/location_tracker.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,16 @@
55
from os.path import basename, normpath
66

77
from process_tracker.data_store import DataStore
8+
from process_tracker.logging import console
9+
810
from process_tracker.models.extract import Location, LocationType
911

1012

1113
class LocationTracker:
1214

1315
def __init__(self, location_path, location_name=None):
1416
self.logger = logging.getLogger(__name__)
15-
self.logger.setLevel(os.environ.get('log_level', 'ERROR'))
17+
self.logger.addHandler(console)
1618

1719
self.data_store = DataStore()
1820

process_tracker/logging.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import logging
2+
import os
3+
4+
logging.basicConfig(level=logging.DEBUG
5+
, format="%(asctime)s - %(name)s - %(funcName)s - %(levelname)s - %(message)s")
6+
7+
console = logging.StreamHandler()
8+
console.setLevel(os.environ.get('log_level', 'DEBUG'))
9+
10+
# create formatter
11+
formatter = logging.Formatter("%(asctime)s - %(name)s - %(funcName)s - %(levelname)s - %(message)s")
12+
13+
# set formatter
14+
console.setFormatter(formatter)

process_tracker/process_tracker.py

Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from process_tracker.data_store import DataStore
1313
from process_tracker.extract_tracker import ExtractTracker
1414
from process_tracker.location_tracker import LocationTracker
15+
from process_tracker.logging import console
1516

1617
from process_tracker.models.actor import Actor
1718
from process_tracker.models.extract import Extract, ExtractProcess, ExtractStatus, Location
@@ -33,7 +34,7 @@ def __init__(self, process_name, process_type, actor_name, tool_name, sources, t
3334
"""
3435

3536
self.logger = logging.getLogger(__name__)
36-
self.logger.setLevel(os.environ.get('log_level', 'ERROR'))
37+
self.logger.addHandler(console)
3738

3839
self.data_store = DataStore()
3940
self.session = self.data_store.session
@@ -232,27 +233,27 @@ def register_extracts_by_location(self, location_path, location_name=None):
232233
"""
233234
location = LocationTracker(location_path=location_path, location_name=location_name)
234235

235-
if location.location_type.location_type_name == "s3":
236-
s3 = boto3.resource("s3")
237-
238-
path = location.location_path
239-
240-
if path.startswith("s3://"):
241-
path = path[len("s3://")]
242-
243-
bucket = s3.Bucket(path)
244-
245-
for file in bucket.objects.all():
246-
ExtractTracker(process_run=self
247-
, filename=file
248-
, location=location
249-
, status='ready')
250-
else:
251-
for file in os.listdir(location_path):
252-
ExtractTracker(process_run=self
253-
, filename=file
254-
, location=location
255-
, status='ready')
236+
# if location.location_type.location_type_name == "s3":
237+
# s3 = boto3.resource("s3")
238+
#
239+
# path = location.location_path
240+
#
241+
# if path.startswith("s3://"):
242+
# path = path[len("s3://")]
243+
#
244+
# bucket = s3.Bucket(path)
245+
#
246+
# for file in bucket.objects.all():
247+
# ExtractTracker(process_run=self
248+
# , filename=file
249+
# , location=location
250+
# , status='ready')
251+
# else:
252+
for file in os.listdir(location_path):
253+
ExtractTracker(process_run=self
254+
, filename=file
255+
, location=location
256+
, status='ready')
256257

257258
def register_new_process_run(self):
258259
"""

tests/test_cli.py

Lines changed: 35 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
1-
from click.testing import CliRunner
1+
import logging
2+
import os
23
import unittest
3-
import time
4+
5+
from click.testing import CliRunner
46

57
from process_tracker.cli import main
68
from process_tracker.data_store import DataStore
9+
from process_tracker.logging import console
710

811
from process_tracker.models.actor import Actor
912
from process_tracker.models.extract import ExtractStatus
@@ -14,16 +17,38 @@
1417

1518
class TestCli(unittest.TestCase):
1619

20+
@classmethod
21+
def setUpClass(cls):
22+
cls.logger = logging.getLogger(__name__)
23+
cls.logger.addHandler(console)
24+
1725
def setUp(self):
1826
self.data_store = DataStore()
1927
self.session = self.data_store.session
2028
self.runner = CliRunner()
2129

22-
# def test_setup(self):
23-
#
2430
# def test_setup_overwrite(self):
31+
# """
32+
# Testing that if data store is already set up and overwrite is set to True, wipe and recreate the data store.
33+
# :return:
34+
# """
35+
# self.runner.invoke(main, 'setup -o True')
2536
#
26-
# def test_setup_already_exists(self):
37+
# instance = self.session.query(Actor).count()
38+
#
39+
# self.assertEqual(0, instance)
40+
41+
def test_setup_already_exists(self):
42+
"""
43+
Testing that if data store is already set up, do not attempt to initialize.
44+
:return:
45+
"""
46+
47+
result = self.runner.invoke(main, ['setup'])
48+
49+
expected_result = 'It appears the system has already been setup.'
50+
51+
self.assertIn(expected_result, result.output)
2752

2853
def test_create_actor(self):
2954
"""
@@ -59,21 +84,16 @@ def test_create_error_type(self):
5984
Testing that when creating an error type record it is added.
6085
:return:
6186
"""
62-
print('starting the bloody test')
6387
result = self.runner.invoke(main, 'create -t "error type" -n "New Error Type"')
64-
print(str(result.output))
65-
print('got the result')
6688
instance = self.session.query(ErrorType).filter(ErrorType.error_type_name == 'New Error Type').first()
6789
try:
68-
print(str(instance.error_type_name))
90+
self.logger.debug(str(instance.error_type_name))
6991
except Exception as e:
70-
print(e)
71-
print('got the instance')
92+
self.logger.debug(e)
7293
given_name = instance.error_type_name
73-
print('invoking delete')
94+
7495
self.runner.invoke(main, 'delete -t "error type" -n "New Error Type"')
75-
print('delete invoked')
76-
print('starting asserts')
96+
7797
self.assertEqual('New Error Type', given_name)
7898

7999
self.assertEqual(0, result.exit_code)
@@ -156,7 +176,7 @@ def test_delete_actor(self):
156176
result = self.runner.invoke(main, 'delete -t actor -n "Test Test"')
157177

158178
instance = self.session.query(Actor).filter(Actor.actor_name == 'Test Test').first()
159-
print(result.output)
179+
self.logger.debug(result.output)
160180
self.assertEqual(None, instance)
161181
self.assertEqual(0, result.exit_code)
162182

0 commit comments

Comments
 (0)