Skip to content

Commit 38efbe3

Browse files
authored
Merge pull request #44 from OpenDataAlex/process_tracker_python-23
Process tracker python 23
2 parents ac40871 + eade30a commit 38efbe3

File tree

10 files changed

+252
-121
lines changed

10 files changed

+252
-121
lines changed

.travis.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ before_script:
2121
- if [[ "$DB" == "mysql" ]]; then mysql -u root < dbscripts/mysql_process_tracker.sql; fi
2222
- if [[ "$DB" == "mysql" ]]; then mysql -u root < dbscripts/mysql_process_tracker_defaults.sql; fi
2323
env:
24-
- DB=postgres
25-
- DB=mysql
24+
- DB=postgres TRAVIS="true"
25+
- DB=mysql TRAVIS="true"
2626
deploy:
2727
- provider: releases
2828
api_key:

process_tracker/cli.py

Lines changed: 25 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -20,25 +20,31 @@ def main():
2020
"""
2121

2222

23-
# @main.command()
24-
# @click.option('-o', '--overwrite', default=False, help='Wipe out the current data store and rebuild'
25-
# ', starting from fresh.')
26-
# def setup(overwrite):
27-
# """
28-
# Initialize ProcessTracker's data store with user provided input. If already in place, do nothing unless overwrite
29-
# set to True.
30-
# :return:
31-
# """
32-
# click.echo('Attempting to initialize data store...')
33-
# data_store.initialize_data_store(overwrite=overwrite)
34-
35-
36-
# @main.command()
37-
# def upgrade():
38-
# """
39-
# Upgrade ProcessTracker if data store on previous version.
40-
# :return:
41-
# """
23+
@main.command()
24+
@click.option(
25+
"-o",
26+
"--overwrite",
27+
default=False,
28+
help="Wipe out the current data store and rebuild" ", starting from fresh.",
29+
)
30+
def setup(overwrite=False):
31+
"""
32+
Initialize ProcessTracker's data store with user provided input. If already in place, do nothing unless overwrite
33+
set to True.
34+
:return:
35+
"""
36+
click.echo("Attempting to initialize data store...")
37+
data_store.initialize_data_store(overwrite=overwrite)
38+
39+
40+
@main.command()
41+
def upgrade():
42+
"""
43+
Upgrade ProcessTracker if data store on previous version.
44+
:return:
45+
"""
46+
click.echo("Verifying version installed on data store vs package...")
47+
data_store.determine_versions()
4248

4349

4450
@main.command()

process_tracker/data_store.py

Lines changed: 63 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
]
3535
preload_process_status_types = ["running", "completed", "failed"]
3636
preload_process_types = ["extract", "load"]
37-
preload_system_keys = [{"key": "version", "value": "0.2.0"}]
37+
preload_system_keys = [{"version", "0.2.0"}]
3838

3939
supported_data_stores = ["postgresql", "mysql", "oracle", "mssql", "snowflake"]
4040

@@ -61,6 +61,31 @@ def __init__(self, config_location=None):
6161
self.data_store_port = data_store["data_store_port"]
6262
self.data_store_name = data_store["data_store_name"]
6363

64+
def delete_data_store(self):
65+
"""
66+
Initializes data store deletion, including wiping of all data within.
67+
:return:
68+
"""
69+
70+
self.logger.warn("ALERT - DATA STORE TO BE OVERWRITTEN - ALL DATA WILL BE LOST")
71+
72+
for table in reversed(Base.metadata.sorted_tables):
73+
try:
74+
self.logger.info("Table will be deleted: %s" % table)
75+
table.drop(self.engine)
76+
except Exception:
77+
self.logger.error(
78+
"Table %s unable to be deleted. Does it exist?" % table
79+
)
80+
81+
def determine_versions(self):
82+
"""
83+
Find the data store version and the package version and return them.
84+
:return:
85+
"""
86+
87+
self.session.query(System.system_value).filter(System.system_key == "version")
88+
6489
def get_or_create_item(self, model, create=True, **kwargs):
6590
"""
6691
Testing if an entity instance exists or not. If does, return entity key. If not, create entity instance
@@ -110,63 +135,50 @@ def initialize_data_store(self, overwrite=False):
110135
:type overwrite: bool
111136
"""
112137
self.logger.info("Attempting to initialize Process Tracker data store.")
113-
if overwrite:
114-
self.logger.warn(
115-
"ALERT - DATA STORE TO BE OVERWRITTEN - ALL DATA WILL BE LOST"
116-
)
117-
118-
for table in Base.metadata.table_names():
119-
self.logger.info("Table will be deleted: %s" % table)
120-
table.drop(self.engine)
121138

122-
version = None
123-
else:
124-
125-
self.logger.debug("Obtaining system version, if exists.")
126-
version = (
127-
self.session.query(System)
128-
.filter(System.system_key == "version")
129-
.first()
139+
if overwrite:
140+
self.delete_data_store()
141+
142+
self.logger.info("Data store initialization beginning. Creating data store.")
143+
for table in Base.metadata.sorted_tables:
144+
try:
145+
self.logger.info("Table will be created: %s" % table)
146+
table.create(self.engine)
147+
except Exception:
148+
self.logger.error("Object %s already exists?" % table)
149+
150+
self.logger.info("Setting up application defaults.")
151+
152+
self.logger.info("Adding error types...")
153+
for error_type in preload_error_types:
154+
self.logger.info("Adding %s" % error_type)
155+
self.get_or_create_item(model=ErrorType, error_type_name=error_type)
156+
157+
self.logger.info("Adding extract status types...")
158+
for extract_status_type in preload_extract_status_types:
159+
self.logger.info("Adding %s" % extract_status_type)
160+
self.get_or_create_item(
161+
ExtractStatus, extract_status_name=extract_status_type
130162
)
131163

132-
if version is None:
133-
134-
self.logger.info(
135-
"Data store initialization beginning. Creating data store."
164+
self.logger.info("Adding process status types...")
165+
for process_status_type in preload_process_status_types:
166+
self.logger.info("Adding %s" % process_status_type)
167+
self.get_or_create_item(
168+
model=ProcessStatus, process_status_name=process_status_type
136169
)
137-
Base.metadata.create_all(self.engine)
138-
139-
self.logger.info("Setting up application defaults.")
140-
141-
self.logger.info("Adding error types...")
142-
for error_type in preload_error_types:
143-
self.logger.info("Adding %s" % error_type)
144-
self.session.add(ErrorType(error_type_name=error_type))
145-
146-
self.logger.info("Adding extract status types...")
147-
for extract_status_type in preload_extract_status_types:
148-
self.logger.info("Adding %s" % extract_status_type)
149-
self.session.add(ExtractStatus(extract_status_name=extract_status_type))
150170

151-
self.logger.info("Adding process status types...")
152-
for process_status_type in preload_process_status_types:
153-
self.logger.info("Adding %s" % process_status_type)
154-
self.session.add(ProcessStatus(process_status_name=process_status_type))
171+
self.logger.info("Adding process types...")
172+
for process_type in preload_process_types:
173+
self.logger.info("Adding %s" % process_type)
174+
self.get_or_create_item(model=ProcessType, process_type_name=process_type)
155175

156-
self.logger.info("Adding process types...")
157-
for process_type in preload_process_types:
158-
self.logger.info("Adding %s" % process_type)
159-
self.session.add(ProcessType(process_type_name=process_type))
176+
self.logger.info("Adding system keys...")
177+
for key, value in preload_system_keys:
178+
self.logger.info("Adding %s" % key)
179+
self.get_or_create_item(model=System, system_key=key, system_value=value)
160180

161-
self.logger.info("Adding system keys...")
162-
for system_key, value in preload_system_keys:
163-
self.logger.info("Adding %s" % system_key)
164-
self.session.add(System(system_key=system_key, system_value=value))
165-
166-
self.session.commit()
167-
else:
168-
self.logger.error("It appears the system has already been setup.")
169-
ClickException("It appears the system has already been setup.").show()
181+
self.session.commit()
170182

171183
self.logger.debug("Finished the initialization check.")
172184

process_tracker/models/actor.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,13 @@
88
class Actor(Base):
99

1010
__tablename__ = "actor_lkup"
11+
__table_args__ = {"schema": "process_tracker"}
1112

12-
actor_id = Column(Integer, Sequence("actor_lkup_actor_id_seq"), primary_key=True)
13+
actor_id = Column(
14+
Integer,
15+
Sequence("actor_lkup_actor_id_seq", schema="process_tracker"),
16+
primary_key=True,
17+
)
1318
actor_name = Column(String(250), nullable=False, unique=True)
1419

1520
def __repr__(self):

process_tracker/models/extract.py

Lines changed: 38 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,12 @@
1313
class ExtractStatus(Base):
1414

1515
__tablename__ = "extract_status_lkup"
16+
__table_args__ = {"schema": "process_tracker"}
1617

1718
extract_status_id = Column(
18-
Integer, Sequence("extract_status_lkup_extract_status_id_seq"), primary_key=True
19+
Integer,
20+
Sequence("extract_status_lkup_extract_status_id_seq", schema="process_tracker"),
21+
primary_key=True,
1922
)
2023
extract_status_name = Column(String(75), nullable=False, unique=True)
2124

@@ -32,14 +35,19 @@ def __repr__(self):
3235
class Extract(Base):
3336

3437
__tablename__ = "extract_tracking"
38+
__table_args__ = {"schema": "process_tracker"}
3539

3640
extract_id = Column(
37-
Integer, Sequence("extract_tracking_extract_id_seq"), primary_key=True
41+
Integer,
42+
Sequence("extract_tracking_extract_id_seq", schema="process_tracker"),
43+
primary_key=True,
3844
)
3945
extract_filename = Column(String(750), nullable=False, unique=True)
40-
extract_location_id = Column(Integer, ForeignKey("location_lkup.location_id"))
46+
extract_location_id = Column(
47+
Integer, ForeignKey("process_tracker.location_lkup.location_id")
48+
)
4149
extract_status_id = Column(
42-
Integer, ForeignKey("extract_status_lkup.extract_status_id")
50+
Integer, ForeignKey("process_tracker.extract_status_lkup.extract_status_id")
4351
)
4452
extract_registration_date_time = Column(
4553
DateTime, nullable=False, default=datetime.now()
@@ -71,12 +79,17 @@ def full_filepath(self):
7179
class ExtractDependency(Base):
7280

7381
__tablename__ = "extract_dependency"
82+
__table_args__ = {"schema": "process_tracker"}
7483

7584
parent_extract_id = Column(
76-
Integer, ForeignKey("extract_tracking.extract_id"), primary_key=True
85+
Integer,
86+
ForeignKey("process_tracker.extract_tracking.extract_id"),
87+
primary_key=True,
7788
)
7889
child_extract_id = Column(
79-
Integer, ForeignKey("extract_tracking.extract_id"), primary_key=True
90+
Integer,
91+
ForeignKey("process_tracker.extract_tracking.extract_id"),
92+
primary_key=True,
8093
)
8194

8295
child_extract = relationship("Extract", foreign_keys=[child_extract_id])
@@ -93,15 +106,20 @@ def __repr__(self):
93106
class ExtractProcess(Base):
94107

95108
__tablename__ = "extract_process_tracking"
109+
__table_args__ = {"schema": "process_tracker"}
96110

97111
extract_tracking_id = Column(
98-
Integer, ForeignKey("extract_tracking.extract_id"), primary_key=True
112+
Integer,
113+
ForeignKey("process_tracker.extract_tracking.extract_id"),
114+
primary_key=True,
99115
)
100116
process_tracking_id = Column(
101-
Integer, ForeignKey("process_tracking.process_tracking_id"), primary_key=True
117+
Integer,
118+
ForeignKey("process_tracker.process_tracking.process_tracking_id"),
119+
primary_key=True,
102120
)
103121
extract_process_status_id = Column(
104-
Integer, ForeignKey("extract_status_lkup.extract_status_id")
122+
Integer, ForeignKey("process_tracker.extract_status_lkup.extract_status_id")
105123
)
106124
extract_process_event_date_time = Column(
107125
DateTime, nullable=False, default=datetime.now()
@@ -124,9 +142,12 @@ def __repr__(self):
124142
class LocationType(Base):
125143

126144
__tablename__ = "location_type_lkup"
145+
__table_args__ = {"schema": "process_tracker"}
127146

128147
location_type_id = Column(
129-
Integer, Sequence("location_type_lkup_location_type_id_seq"), primary_key=True
148+
Integer,
149+
Sequence("location_type_lkup_location_type_id_seq", schema="process_tracker"),
150+
primary_key=True,
130151
)
131152
location_type_name = Column(String(25), unique=True, nullable=False)
132153

@@ -143,13 +164,18 @@ def __repr__(self):
143164
class Location(Base):
144165

145166
__tablename__ = "location_lkup"
167+
__table_args__ = {"schema": "process_tracker"}
146168

147169
location_id = Column(
148-
Integer, Sequence("location_lkup_location_id_seq"), primary_key=True
170+
Integer,
171+
Sequence("location_lkup_location_id_seq", schema="process_tracker"),
172+
primary_key=True,
149173
)
150174
location_name = Column(String(750), nullable=False, unique=True)
151175
location_path = Column(String(750), nullable=False, unique=True)
152-
location_type = Column(Integer, ForeignKey("location_type_lkup.location_type_id"))
176+
location_type = Column(
177+
Integer, ForeignKey("process_tracker.location_type_lkup.location_type_id")
178+
)
153179

154180
extracts = relationship("Extract")
155181

0 commit comments

Comments
 (0)