Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 21dd1fc9c8 | |||
| 5243352867 | |||
| 387981aa47 | |||
| 13b2c9c416 | |||
| 4c04bfb92e | |||
| 2fe45e65eb | |||
| 036b4d1215 | |||
| ce986db27b |
+1
-1
@@ -47,7 +47,7 @@ htmlcov/
|
||||
.pylint.d/
|
||||
|
||||
# IDEs and editors
|
||||
.vscode/
|
||||
#.vscode/
|
||||
!.vscode/tasks.json
|
||||
!.vscode/launch.json
|
||||
.idea/
|
||||
|
||||
Vendored
+7
-1
@@ -4,7 +4,13 @@
|
||||
{
|
||||
"label": "Run TheChart App",
|
||||
"type": "shell",
|
||||
"command": "cd /home/will/Code/thechart && python -m src.main",
|
||||
"command": "/home/will/Code/thechart/.venv/bin/python",
|
||||
"args": [
|
||||
"src/main.py"
|
||||
],
|
||||
"options": {
|
||||
"cwd": "/home/will/Code/thechart"
|
||||
},
|
||||
"group": "build",
|
||||
"isBackground": false,
|
||||
"problemMatcher": []
|
||||
|
||||
@@ -88,7 +88,7 @@ build: ## Build the Docker image
|
||||
docker buildx build --platform linux/amd64,linux/arm64 -t ${IMAGE} --push .
|
||||
deploy: ## Deploy the application as a standalone executable
|
||||
@echo "Deploying the application..."
|
||||
pyinstaller --name ${TARGET} --optimize 2 --onefile --windowed --hidden-import='PIL._tkinter_finder' --icon='${ICON}' --add-data="./.env:." --add-data='./chart-671.png:.' --add-data='./thechart_data.csv:.' src/main.py
|
||||
pyinstaller --name ${TARGET} --optimize 2 --onefile --windowed --hidden-import='PIL._tkinter_finder' --icon='${ICON}' --add-data="./.env:." --add-data='./chart-671.png:.' --add-data='./thechart_data.csv:.' --log-level=DEBUG src/main.py
|
||||
cp -f ./thechart_data.csv ${ROOT}/Documents/
|
||||
cp -f ./dist/${TARGET} ${ROOT}/Applications/
|
||||
cp -f ./deploy/${TARGET}.desktop ${ROOT}/.local/share/applications/
|
||||
|
||||
-756
@@ -1,756 +0,0 @@
|
||||
<?xml version="1.0" ?>
|
||||
<coverage version="7.10.1" timestamp="1753820440721" lines-valid="702" lines-covered="511" line-rate="0.7279" branches-covered="0" branches-valid="0" branch-rate="0" complexity="0">
|
||||
<!-- Generated by coverage.py: https://coverage.readthedocs.io/en/7.10.1 -->
|
||||
<!-- Based on https://raw.githubusercontent.com/cobertura/web/master/htdocs/xml/coverage-04.dtd -->
|
||||
<sources>
|
||||
<source>/home/will/Code/thechart/src</source>
|
||||
</sources>
|
||||
<packages>
|
||||
<package name="." line-rate="0.7279" branch-rate="0" complexity="0">
|
||||
<classes>
|
||||
<class name="__init__.py" filename="__init__.py" complexity="0" line-rate="0" branch-rate="0">
|
||||
<methods/>
|
||||
<lines>
|
||||
<line number="3" hits="0"/>
|
||||
<line number="4" hits="0"/>
|
||||
<line number="5" hits="0"/>
|
||||
</lines>
|
||||
</class>
|
||||
<class name="constants.py" filename="constants.py" complexity="0" line-rate="1" branch-rate="0">
|
||||
<methods/>
|
||||
<lines>
|
||||
<line number="1" hits="1"/>
|
||||
<line number="3" hits="1"/>
|
||||
<line number="5" hits="1"/>
|
||||
<line number="7" hits="1"/>
|
||||
<line number="8" hits="1"/>
|
||||
<line number="9" hits="1"/>
|
||||
</lines>
|
||||
</class>
|
||||
<class name="data_manager.py" filename="data_manager.py" complexity="0" line-rate="0.5673" branch-rate="0">
|
||||
<methods/>
|
||||
<lines>
|
||||
<line number="1" hits="1"/>
|
||||
<line number="2" hits="1"/>
|
||||
<line number="3" hits="1"/>
|
||||
<line number="5" hits="1"/>
|
||||
<line number="8" hits="1"/>
|
||||
<line number="11" hits="1"/>
|
||||
<line number="12" hits="1"/>
|
||||
<line number="13" hits="1"/>
|
||||
<line number="14" hits="1"/>
|
||||
<line number="16" hits="1"/>
|
||||
<line number="18" hits="1"/>
|
||||
<line number="19" hits="1"/>
|
||||
<line number="20" hits="1"/>
|
||||
<line number="21" hits="1"/>
|
||||
<line number="42" hits="1"/>
|
||||
<line number="44" hits="1"/>
|
||||
<line number="45" hits="1"/>
|
||||
<line number="46" hits="1"/>
|
||||
<line number="48" hits="1"/>
|
||||
<line number="49" hits="1"/>
|
||||
<line number="70" hits="1"/>
|
||||
<line number="71" hits="1"/>
|
||||
<line number="72" hits="0"/>
|
||||
<line number="73" hits="0"/>
|
||||
<line number="74" hits="1"/>
|
||||
<line number="75" hits="1"/>
|
||||
<line number="76" hits="1"/>
|
||||
<line number="78" hits="1"/>
|
||||
<line number="80" hits="1"/>
|
||||
<line number="82" hits="1"/>
|
||||
<line number="83" hits="1"/>
|
||||
<line number="85" hits="1"/>
|
||||
<line number="86" hits="1"/>
|
||||
<line number="87" hits="1"/>
|
||||
<line number="89" hits="1"/>
|
||||
<line number="90" hits="1"/>
|
||||
<line number="91" hits="1"/>
|
||||
<line number="92" hits="1"/>
|
||||
<line number="93" hits="1"/>
|
||||
<line number="94" hits="1"/>
|
||||
<line number="95" hits="1"/>
|
||||
<line number="97" hits="1"/>
|
||||
<line number="99" hits="1"/>
|
||||
<line number="100" hits="1"/>
|
||||
<line number="101" hits="1"/>
|
||||
<line number="104" hits="1"/>
|
||||
<line number="105" hits="1"/>
|
||||
<line number="108" hits="1"/>
|
||||
<line number="112" hits="1"/>
|
||||
<line number="114" hits="0"/>
|
||||
<line number="135" hits="1"/>
|
||||
<line number="150" hits="0"/>
|
||||
<line number="151" hits="0"/>
|
||||
<line number="152" hits="1"/>
|
||||
<line number="153" hits="1"/>
|
||||
<line number="154" hits="1"/>
|
||||
<line number="156" hits="1"/>
|
||||
<line number="158" hits="1"/>
|
||||
<line number="159" hits="1"/>
|
||||
<line number="161" hits="1"/>
|
||||
<line number="163" hits="1"/>
|
||||
<line number="164" hits="1"/>
|
||||
<line number="165" hits="0"/>
|
||||
<line number="166" hits="0"/>
|
||||
<line number="167" hits="0"/>
|
||||
<line number="169" hits="1"/>
|
||||
<line number="171" hits="0"/>
|
||||
<line number="173" hits="0"/>
|
||||
<line number="174" hits="0"/>
|
||||
<line number="175" hits="0"/>
|
||||
<line number="176" hits="0"/>
|
||||
<line number="179" hits="0"/>
|
||||
<line number="181" hits="0"/>
|
||||
<line number="197" hits="0"/>
|
||||
<line number="200" hits="0"/>
|
||||
<line number="201" hits="0"/>
|
||||
<line number="202" hits="0"/>
|
||||
<line number="204" hits="0"/>
|
||||
<line number="205" hits="0"/>
|
||||
<line number="207" hits="0"/>
|
||||
<line number="210" hits="0"/>
|
||||
<line number="212" hits="0"/>
|
||||
<line number="213" hits="0"/>
|
||||
<line number="214" hits="0"/>
|
||||
<line number="215" hits="0"/>
|
||||
<line number="216" hits="0"/>
|
||||
<line number="218" hits="1"/>
|
||||
<line number="222" hits="0"/>
|
||||
<line number="223" hits="0"/>
|
||||
<line number="224" hits="0"/>
|
||||
<line number="225" hits="0"/>
|
||||
<line number="227" hits="0"/>
|
||||
<line number="228" hits="0"/>
|
||||
<line number="230" hits="0"/>
|
||||
<line number="231" hits="0"/>
|
||||
<line number="233" hits="0"/>
|
||||
<line number="234" hits="0"/>
|
||||
<line number="235" hits="0"/>
|
||||
<line number="236" hits="0"/>
|
||||
<line number="237" hits="0"/>
|
||||
<line number="239" hits="0"/>
|
||||
<line number="240" hits="0"/>
|
||||
<line number="241" hits="0"/>
|
||||
<line number="242" hits="0"/>
|
||||
</lines>
|
||||
</class>
|
||||
<class name="graph_manager.py" filename="graph_manager.py" complexity="0" line-rate="0.971" branch-rate="0">
|
||||
<methods/>
|
||||
<lines>
|
||||
<line number="1" hits="1"/>
|
||||
<line number="2" hits="1"/>
|
||||
<line number="4" hits="1"/>
|
||||
<line number="5" hits="1"/>
|
||||
<line number="6" hits="1"/>
|
||||
<line number="7" hits="1"/>
|
||||
<line number="8" hits="1"/>
|
||||
<line number="11" hits="1"/>
|
||||
<line number="14" hits="1"/>
|
||||
<line number="15" hits="1"/>
|
||||
<line number="18" hits="1"/>
|
||||
<line number="19" hits="1"/>
|
||||
<line number="22" hits="1"/>
|
||||
<line number="30" hits="1"/>
|
||||
<line number="31" hits="1"/>
|
||||
<line number="34" hits="1"/>
|
||||
<line number="37" hits="1"/>
|
||||
<line number="38" hits="1"/>
|
||||
<line number="41" hits="1"/>
|
||||
<line number="42" hits="1"/>
|
||||
<line number="45" hits="1"/>
|
||||
<line number="46" hits="1"/>
|
||||
<line number="47" hits="1"/>
|
||||
<line number="48" hits="1"/>
|
||||
<line number="51" hits="1"/>
|
||||
<line number="54" hits="1"/>
|
||||
<line number="56" hits="1"/>
|
||||
<line number="58" hits="1"/>
|
||||
<line number="62" hits="1"/>
|
||||
<line number="69" hits="1"/>
|
||||
<line number="70" hits="1"/>
|
||||
<line number="76" hits="1"/>
|
||||
<line number="78" hits="1"/>
|
||||
<line number="80" hits="0"/>
|
||||
<line number="81" hits="0"/>
|
||||
<line number="83" hits="1"/>
|
||||
<line number="85" hits="1"/>
|
||||
<line number="86" hits="1"/>
|
||||
<line number="88" hits="1"/>
|
||||
<line number="90" hits="1"/>
|
||||
<line number="91" hits="1"/>
|
||||
<line number="93" hits="1"/>
|
||||
<line number="94" hits="1"/>
|
||||
<line number="95" hits="1"/>
|
||||
<line number="96" hits="1"/>
|
||||
<line number="99" hits="1"/>
|
||||
<line number="102" hits="1"/>
|
||||
<line number="103" hits="1"/>
|
||||
<line number="106" hits="1"/>
|
||||
<line number="107" hits="1"/>
|
||||
<line number="108" hits="1"/>
|
||||
<line number="109" hits="1"/>
|
||||
<line number="110" hits="1"/>
|
||||
<line number="111" hits="1"/>
|
||||
<line number="112" hits="1"/>
|
||||
<line number="113" hits="1"/>
|
||||
<line number="114" hits="1"/>
|
||||
<line number="117" hits="1"/>
|
||||
<line number="120" hits="1"/>
|
||||
<line number="121" hits="1"/>
|
||||
<line number="122" hits="1"/>
|
||||
<line number="123" hits="1"/>
|
||||
<line number="124" hits="1"/>
|
||||
<line number="125" hits="1"/>
|
||||
<line number="128" hits="1"/>
|
||||
<line number="130" hits="1"/>
|
||||
<line number="139" hits="1"/>
|
||||
<line number="147" hits="1"/>
|
||||
<line number="149" hits="1"/>
|
||||
</lines>
|
||||
</class>
|
||||
<class name="init.py" filename="init.py" complexity="0" line-rate="0.9524" branch-rate="0">
|
||||
<methods/>
|
||||
<lines>
|
||||
<line number="1" hits="1"/>
|
||||
<line number="3" hits="1"/>
|
||||
<line number="4" hits="1"/>
|
||||
<line number="6" hits="1"/>
|
||||
<line number="7" hits="1"/>
|
||||
<line number="8" hits="1"/>
|
||||
<line number="9" hits="1"/>
|
||||
<line number="10" hits="1"/>
|
||||
<line number="11" hits="1"/>
|
||||
<line number="13" hits="1"/>
|
||||
<line number="19" hits="1"/>
|
||||
<line number="21" hits="1"/>
|
||||
<line number="23" hits="1"/>
|
||||
<line number="24" hits="1"/>
|
||||
<line number="25" hits="1"/>
|
||||
<line number="26" hits="1"/>
|
||||
<line number="27" hits="1"/>
|
||||
<line number="28" hits="0"/>
|
||||
<line number="29" hits="1"/>
|
||||
<line number="30" hits="1"/>
|
||||
<line number="31" hits="1"/>
|
||||
</lines>
|
||||
</class>
|
||||
<class name="logger.py" filename="logger.py" complexity="0" line-rate="1" branch-rate="0">
|
||||
<methods/>
|
||||
<lines>
|
||||
<line number="1" hits="1"/>
|
||||
<line number="3" hits="1"/>
|
||||
<line number="5" hits="1"/>
|
||||
<line number="8" hits="1"/>
|
||||
<line number="9" hits="1"/>
|
||||
<line number="10" hits="1"/>
|
||||
<line number="12" hits="1"/>
|
||||
<line number="13" hits="1"/>
|
||||
<line number="14" hits="1"/>
|
||||
<line number="15" hits="1"/>
|
||||
<line number="17" hits="1"/>
|
||||
<line number="18" hits="1"/>
|
||||
<line number="20" hits="1"/>
|
||||
<line number="22" hits="1"/>
|
||||
<line number="23" hits="1"/>
|
||||
<line number="24" hits="1"/>
|
||||
<line number="25" hits="1"/>
|
||||
<line number="26" hits="1"/>
|
||||
<line number="28" hits="1"/>
|
||||
<line number="29" hits="1"/>
|
||||
<line number="30" hits="1"/>
|
||||
<line number="31" hits="1"/>
|
||||
<line number="32" hits="1"/>
|
||||
<line number="34" hits="1"/>
|
||||
<line number="35" hits="1"/>
|
||||
<line number="36" hits="1"/>
|
||||
<line number="37" hits="1"/>
|
||||
<line number="38" hits="1"/>
|
||||
<line number="40" hits="1"/>
|
||||
</lines>
|
||||
</class>
|
||||
<class name="main.py" filename="main.py" complexity="0" line-rate="0.7857" branch-rate="0">
|
||||
<methods/>
|
||||
<lines>
|
||||
<line number="1" hits="1"/>
|
||||
<line number="2" hits="1"/>
|
||||
<line number="3" hits="1"/>
|
||||
<line number="4" hits="1"/>
|
||||
<line number="5" hits="1"/>
|
||||
<line number="6" hits="1"/>
|
||||
<line number="8" hits="1"/>
|
||||
<line number="10" hits="1"/>
|
||||
<line number="11" hits="1"/>
|
||||
<line number="12" hits="1"/>
|
||||
<line number="13" hits="1"/>
|
||||
<line number="14" hits="1"/>
|
||||
<line number="17" hits="1"/>
|
||||
<line number="18" hits="1"/>
|
||||
<line number="19" hits="1"/>
|
||||
<line number="20" hits="1"/>
|
||||
<line number="21" hits="1"/>
|
||||
<line number="22" hits="1"/>
|
||||
<line number="25" hits="1"/>
|
||||
<line number="26" hits="1"/>
|
||||
<line number="28" hits="1"/>
|
||||
<line number="29" hits="1"/>
|
||||
<line number="30" hits="1"/>
|
||||
<line number="31" hits="1"/>
|
||||
<line number="32" hits="1"/>
|
||||
<line number="34" hits="1"/>
|
||||
<line number="39" hits="1"/>
|
||||
<line number="40" hits="1"/>
|
||||
<line number="41" hits="1"/>
|
||||
<line number="42" hits="1"/>
|
||||
<line number="45" hits="1"/>
|
||||
<line number="46" hits="1"/>
|
||||
<line number="49" hits="1"/>
|
||||
<line number="50" hits="1"/>
|
||||
<line number="51" hits="1"/>
|
||||
<line number="52" hits="1"/>
|
||||
<line number="55" hits="1"/>
|
||||
<line number="57" hits="1"/>
|
||||
<line number="59" hits="1"/>
|
||||
<line number="62" hits="1"/>
|
||||
<line number="63" hits="1"/>
|
||||
<line number="66" hits="1"/>
|
||||
<line number="67" hits="1"/>
|
||||
<line number="70" hits="1"/>
|
||||
<line number="71" hits="1"/>
|
||||
<line number="72" hits="1"/>
|
||||
<line number="73" hits="1"/>
|
||||
<line number="76" hits="1"/>
|
||||
<line number="77" hits="1"/>
|
||||
<line number="80" hits="1"/>
|
||||
<line number="81" hits="1"/>
|
||||
<line number="82" hits="1"/>
|
||||
<line number="83" hits="1"/>
|
||||
<line number="84" hits="1"/>
|
||||
<line number="85" hits="1"/>
|
||||
<line number="88" hits="1"/>
|
||||
<line number="102" hits="1"/>
|
||||
<line number="103" hits="1"/>
|
||||
<line number="104" hits="1"/>
|
||||
<line number="107" hits="1"/>
|
||||
<line number="109" hits="1"/>
|
||||
<line number="111" hits="1"/>
|
||||
<line number="112" hits="1"/>
|
||||
<line number="113" hits="1"/>
|
||||
<line number="114" hits="1"/>
|
||||
<line number="115" hits="1"/>
|
||||
<line number="116" hits="1"/>
|
||||
<line number="118" hits="1"/>
|
||||
<line number="120" hits="0"/>
|
||||
<line number="123" hits="0"/>
|
||||
<line number="124" hits="0"/>
|
||||
<line number="125" hits="0"/>
|
||||
<line number="127" hits="0"/>
|
||||
<line number="147" hits="0"/>
|
||||
<line number="150" hits="0"/>
|
||||
<line number="156" hits="0"/>
|
||||
<line number="158" hits="1"/>
|
||||
<line number="176" hits="0"/>
|
||||
<line number="195" hits="0"/>
|
||||
<line number="196" hits="0"/>
|
||||
<line number="197" hits="0"/>
|
||||
<line number="200" hits="0"/>
|
||||
<line number="201" hits="0"/>
|
||||
<line number="204" hits="0"/>
|
||||
<line number="205" hits="0"/>
|
||||
<line number="206" hits="0"/>
|
||||
<line number="213" hits="0"/>
|
||||
<line number="215" hits="1"/>
|
||||
<line number="216" hits="1"/>
|
||||
<line number="219" hits="1"/>
|
||||
<line number="220" hits="1"/>
|
||||
<line number="222" hits="1"/>
|
||||
<line number="225" hits="1"/>
|
||||
<line number="226" hits="1"/>
|
||||
<line number="227" hits="1"/>
|
||||
<line number="228" hits="1"/>
|
||||
<line number="229" hits="1"/>
|
||||
<line number="230" hits="1"/>
|
||||
<line number="232" hits="1"/>
|
||||
<line number="233" hits="1"/>
|
||||
<line number="234" hits="1"/>
|
||||
<line number="237" hits="1"/>
|
||||
<line number="238" hits="1"/>
|
||||
<line number="241" hits="1"/>
|
||||
<line number="243" hits="1"/>
|
||||
<line number="244" hits="1"/>
|
||||
<line number="247" hits="1"/>
|
||||
<line number="248" hits="1"/>
|
||||
<line number="249" hits="1"/>
|
||||
<line number="251" hits="1"/>
|
||||
<line number="269" hits="1"/>
|
||||
<line number="272" hits="1"/>
|
||||
<line number="273" hits="1"/>
|
||||
<line number="274" hits="1"/>
|
||||
<line number="276" hits="0"/>
|
||||
<line number="277" hits="0"/>
|
||||
<line number="280" hits="0"/>
|
||||
<line number="281" hits="0"/>
|
||||
<line number="284" hits="0"/>
|
||||
<line number="285" hits="0"/>
|
||||
<line number="286" hits="0"/>
|
||||
<line number="293" hits="0"/>
|
||||
<line number="295" hits="1"/>
|
||||
<line number="297" hits="1"/>
|
||||
<line number="298" hits="1"/>
|
||||
<line number="304" hits="1"/>
|
||||
<line number="305" hits="0"/>
|
||||
<line number="307" hits="0"/>
|
||||
<line number="308" hits="0"/>
|
||||
<line number="309" hits="0"/>
|
||||
<line number="312" hits="0"/>
|
||||
<line number="314" hits="0"/>
|
||||
<line number="316" hits="1"/>
|
||||
<line number="318" hits="1"/>
|
||||
<line number="319" hits="1"/>
|
||||
<line number="320" hits="1"/>
|
||||
<line number="321" hits="1"/>
|
||||
<line number="322" hits="1"/>
|
||||
<line number="323" hits="1"/>
|
||||
<line number="324" hits="1"/>
|
||||
<line number="326" hits="1"/>
|
||||
<line number="328" hits="1"/>
|
||||
<line number="331" hits="1"/>
|
||||
<line number="332" hits="1"/>
|
||||
<line number="335" hits="1"/>
|
||||
<line number="338" hits="1"/>
|
||||
<line number="340" hits="1"/>
|
||||
<line number="355" hits="1"/>
|
||||
<line number="356" hits="0"/>
|
||||
<line number="359" hits="1"/>
|
||||
<line number="361" hits="1"/>
|
||||
<line number="362" hits="1"/>
|
||||
<line number="363" hits="1"/>
|
||||
<line number="366" hits="1"/>
|
||||
</lines>
|
||||
</class>
|
||||
<class name="ui_manager.py" filename="ui_manager.py" complexity="0" line-rate="0.6614" branch-rate="0">
|
||||
<methods/>
|
||||
<lines>
|
||||
<line number="1" hits="1"/>
|
||||
<line number="2" hits="1"/>
|
||||
<line number="3" hits="1"/>
|
||||
<line number="4" hits="1"/>
|
||||
<line number="5" hits="1"/>
|
||||
<line number="6" hits="1"/>
|
||||
<line number="7" hits="1"/>
|
||||
<line number="8" hits="1"/>
|
||||
<line number="10" hits="1"/>
|
||||
<line number="13" hits="1"/>
|
||||
<line number="16" hits="1"/>
|
||||
<line number="17" hits="1"/>
|
||||
<line number="18" hits="1"/>
|
||||
<line number="20" hits="1"/>
|
||||
<line number="22" hits="1"/>
|
||||
<line number="23" hits="1"/>
|
||||
<line number="26" hits="1"/>
|
||||
<line number="28" hits="1"/>
|
||||
<line number="29" hits="1"/>
|
||||
<line number="33" hits="1"/>
|
||||
<line number="34" hits="1"/>
|
||||
<line number="35" hits="1"/>
|
||||
<line number="36" hits="1"/>
|
||||
<line number="37" hits="1"/>
|
||||
<line number="39" hits="1"/>
|
||||
<line number="40" hits="1"/>
|
||||
<line number="43" hits="1"/>
|
||||
<line number="44" hits="1"/>
|
||||
<line number="45" hits="0"/>
|
||||
<line number="46" hits="0"/>
|
||||
<line number="47" hits="1"/>
|
||||
<line number="48" hits="1"/>
|
||||
<line number="49" hits="1"/>
|
||||
<line number="50" hits="1"/>
|
||||
<line number="51" hits="1"/>
|
||||
<line number="52" hits="1"/>
|
||||
<line number="54" hits="1"/>
|
||||
<line number="57" hits="1"/>
|
||||
<line number="58" hits="1"/>
|
||||
<line number="59" hits="1"/>
|
||||
<line number="60" hits="1"/>
|
||||
<line number="63" hits="1"/>
|
||||
<line number="64" hits="1"/>
|
||||
<line number="67" hits="1"/>
|
||||
<line number="70" hits="1"/>
|
||||
<line number="71" hits="1"/>
|
||||
<line number="74" hits="1"/>
|
||||
<line number="75" hits="0"/>
|
||||
<line number="77" hits="1"/>
|
||||
<line number="78" hits="0"/>
|
||||
<line number="80" hits="1"/>
|
||||
<line number="81" hits="1"/>
|
||||
<line number="82" hits="1"/>
|
||||
<line number="83" hits="1"/>
|
||||
<line number="86" hits="1"/>
|
||||
<line number="87" hits="1"/>
|
||||
<line number="90" hits="1"/>
|
||||
<line number="93" hits="1"/>
|
||||
<line number="94" hits="0"/>
|
||||
<line number="95" hits="0"/>
|
||||
<line number="97" hits="1"/>
|
||||
<line number="100" hits="1"/>
|
||||
<line number="108" hits="1"/>
|
||||
<line number="115" hits="1"/>
|
||||
<line number="116" hits="1"/>
|
||||
<line number="119" hits="1"/>
|
||||
<line number="128" hits="1"/>
|
||||
<line number="131" hits="1"/>
|
||||
<line number="132" hits="1"/>
|
||||
<line number="133" hits="1"/>
|
||||
<line number="136" hits="1"/>
|
||||
<line number="144" hits="1"/>
|
||||
<line number="146" hits="1"/>
|
||||
<line number="151" hits="1"/>
|
||||
<line number="152" hits="1"/>
|
||||
<line number="154" hits="1"/>
|
||||
<line number="157" hits="1"/>
|
||||
<line number="161" hits="1"/>
|
||||
<line number="164" hits="1"/>
|
||||
<line number="169" hits="1"/>
|
||||
<line number="172" hits="1"/>
|
||||
<line number="180" hits="1"/>
|
||||
<line number="182" hits="1"/>
|
||||
<line number="185" hits="1"/>
|
||||
<line number="188" hits="1"/>
|
||||
<line number="189" hits="1"/>
|
||||
<line number="191" hits="1"/>
|
||||
<line number="205" hits="1"/>
|
||||
<line number="207" hits="1"/>
|
||||
<line number="221" hits="1"/>
|
||||
<line number="222" hits="1"/>
|
||||
<line number="224" hits="1"/>
|
||||
<line number="238" hits="1"/>
|
||||
<line number="239" hits="1"/>
|
||||
<line number="241" hits="1"/>
|
||||
<line number="244" hits="1"/>
|
||||
<line number="245" hits="1"/>
|
||||
<line number="246" hits="1"/>
|
||||
<line number="248" hits="1"/>
|
||||
<line number="250" hits="1"/>
|
||||
<line number="252" hits="1"/>
|
||||
<line number="253" hits="1"/>
|
||||
<line number="254" hits="1"/>
|
||||
<line number="256" hits="1"/>
|
||||
<line number="260" hits="1"/>
|
||||
<line number="261" hits="1"/>
|
||||
<line number="263" hits="1"/>
|
||||
<line number="264" hits="1"/>
|
||||
<line number="275" hits="1"/>
|
||||
<line number="277" hits="1"/>
|
||||
<line number="281" hits="1"/>
|
||||
<line number="282" hits="1"/>
|
||||
<line number="283" hits="1"/>
|
||||
<line number="284" hits="1"/>
|
||||
<line number="287" hits="1"/>
|
||||
<line number="290" hits="1"/>
|
||||
<line number="292" hits="1"/>
|
||||
<line number="293" hits="1"/>
|
||||
<line number="300" hits="1"/>
|
||||
<line number="301" hits="0"/>
|
||||
<line number="303" hits="0"/>
|
||||
<line number="319" hits="0"/>
|
||||
<line number="320" hits="0"/>
|
||||
<line number="322" hits="0"/>
|
||||
<line number="342" hits="0"/>
|
||||
<line number="344" hits="0"/>
|
||||
<line number="345" hits="0"/>
|
||||
<line number="365" hits="1"/>
|
||||
<line number="368" hits="1"/>
|
||||
<line number="369" hits="1"/>
|
||||
<line number="372" hits="1"/>
|
||||
<line number="375" hits="1"/>
|
||||
<line number="376" hits="1"/>
|
||||
<line number="387" hits="1"/>
|
||||
<line number="390" hits="1"/>
|
||||
<line number="391" hits="1"/>
|
||||
<line number="392" hits="1"/>
|
||||
<line number="395" hits="1"/>
|
||||
<line number="400" hits="1"/>
|
||||
<line number="401" hits="1"/>
|
||||
<line number="404" hits="1"/>
|
||||
<line number="405" hits="1"/>
|
||||
<line number="406" hits="1"/>
|
||||
<line number="408" hits="1"/>
|
||||
<line number="410" hits="1"/>
|
||||
<line number="420" hits="1"/>
|
||||
<line number="423" hits="1"/>
|
||||
<line number="424" hits="1"/>
|
||||
<line number="425" hits="0"/>
|
||||
<line number="426" hits="0"/>
|
||||
<line number="427" hits="0"/>
|
||||
<line number="429" hits="1"/>
|
||||
<line number="437" hits="1"/>
|
||||
<line number="445" hits="1"/>
|
||||
<line number="446" hits="1"/>
|
||||
<line number="447" hits="1"/>
|
||||
<line number="448" hits="1"/>
|
||||
<line number="449" hits="1"/>
|
||||
<line number="450" hits="1"/>
|
||||
<line number="451" hits="0"/>
|
||||
<line number="452" hits="0"/>
|
||||
<line number="453" hits="0"/>
|
||||
<line number="457" hits="1"/>
|
||||
<line number="458" hits="0"/>
|
||||
<line number="459" hits="0"/>
|
||||
<line number="460" hits="0"/>
|
||||
<line number="464" hits="1"/>
|
||||
<line number="465" hits="1"/>
|
||||
<line number="469" hits="1"/>
|
||||
<line number="470" hits="1"/>
|
||||
<line number="472" hits="1"/>
|
||||
<line number="476" hits="1"/>
|
||||
<line number="478" hits="1"/>
|
||||
<line number="482" hits="1"/>
|
||||
<line number="483" hits="1"/>
|
||||
<line number="484" hits="1"/>
|
||||
<line number="486" hits="1"/>
|
||||
<line number="489" hits="1"/>
|
||||
<line number="492" hits="1"/>
|
||||
<line number="493" hits="1"/>
|
||||
<line number="496" hits="1"/>
|
||||
<line number="497" hits="1"/>
|
||||
<line number="499" hits="1"/>
|
||||
<line number="500" hits="1"/>
|
||||
<line number="501" hits="1"/>
|
||||
<line number="502" hits="1"/>
|
||||
<line number="504" hits="1"/>
|
||||
<line number="515" hits="1"/>
|
||||
<line number="518" hits="1"/>
|
||||
<line number="519" hits="1"/>
|
||||
<line number="521" hits="1"/>
|
||||
<line number="529" hits="1"/>
|
||||
<line number="530" hits="1"/>
|
||||
<line number="531" hits="1"/>
|
||||
<line number="532" hits="1"/>
|
||||
<line number="536" hits="1"/>
|
||||
<line number="538" hits="1"/>
|
||||
<line number="546" hits="1"/>
|
||||
<line number="547" hits="1"/>
|
||||
<line number="550" hits="1"/>
|
||||
<line number="552" hits="0"/>
|
||||
<line number="554" hits="0"/>
|
||||
<line number="561" hits="0"/>
|
||||
<line number="563" hits="0"/>
|
||||
<line number="566" hits="0"/>
|
||||
<line number="567" hits="0"/>
|
||||
<line number="571" hits="0"/>
|
||||
<line number="573" hits="0"/>
|
||||
<line number="589" hits="1"/>
|
||||
<line number="596" hits="1"/>
|
||||
<line number="601" hits="1"/>
|
||||
<line number="607" hits="1"/>
|
||||
<line number="611" hits="1"/>
|
||||
<line number="615" hits="1"/>
|
||||
<line number="616" hits="1"/>
|
||||
<line number="617" hits="1"/>
|
||||
<line number="619" hits="1"/>
|
||||
<line number="621" hits="1"/>
|
||||
<line number="623" hits="1"/>
|
||||
<line number="624" hits="1"/>
|
||||
<line number="627" hits="1"/>
|
||||
<line number="628" hits="1"/>
|
||||
<line number="629" hits="1"/>
|
||||
<line number="632" hits="1"/>
|
||||
<line number="635" hits="1"/>
|
||||
<line number="636" hits="1"/>
|
||||
<line number="639" hits="1"/>
|
||||
<line number="642" hits="1"/>
|
||||
<line number="645" hits="1"/>
|
||||
<line number="646" hits="0"/>
|
||||
<line number="648" hits="1"/>
|
||||
<line number="650" hits="1"/>
|
||||
<line number="656" hits="1"/>
|
||||
<line number="659" hits="1"/>
|
||||
<line number="660" hits="0"/>
|
||||
<line number="661" hits="0"/>
|
||||
<line number="662" hits="0"/>
|
||||
<line number="663" hits="0"/>
|
||||
<line number="664" hits="0"/>
|
||||
<line number="666" hits="0"/>
|
||||
<line number="667" hits="0"/>
|
||||
<line number="668" hits="0"/>
|
||||
<line number="669" hits="0"/>
|
||||
<line number="670" hits="0"/>
|
||||
<line number="671" hits="0"/>
|
||||
<line number="673" hits="0"/>
|
||||
<line number="674" hits="0"/>
|
||||
<line number="676" hits="0"/>
|
||||
<line number="678" hits="1"/>
|
||||
<line number="681" hits="1"/>
|
||||
<line number="687" hits="1"/>
|
||||
<line number="689" hits="1"/>
|
||||
<line number="691" hits="1"/>
|
||||
<line number="698" hits="0"/>
|
||||
<line number="701" hits="0"/>
|
||||
<line number="703" hits="0"/>
|
||||
<line number="704" hits="0"/>
|
||||
<line number="709" hits="0"/>
|
||||
<line number="712" hits="0"/>
|
||||
<line number="713" hits="0"/>
|
||||
<line number="716" hits="0"/>
|
||||
<line number="719" hits="0"/>
|
||||
<line number="721" hits="0"/>
|
||||
<line number="722" hits="0"/>
|
||||
<line number="723" hits="0"/>
|
||||
<line number="725" hits="0"/>
|
||||
<line number="728" hits="0"/>
|
||||
<line number="731" hits="0"/>
|
||||
<line number="737" hits="1"/>
|
||||
<line number="739" hits="0"/>
|
||||
<line number="740" hits="0"/>
|
||||
<line number="742" hits="0"/>
|
||||
<line number="743" hits="0"/>
|
||||
<line number="745" hits="0"/>
|
||||
<line number="748" hits="0"/>
|
||||
<line number="750" hits="0"/>
|
||||
<line number="751" hits="0"/>
|
||||
<line number="756" hits="0"/>
|
||||
<line number="759" hits="0"/>
|
||||
<line number="760" hits="0"/>
|
||||
<line number="763" hits="0"/>
|
||||
<line number="766" hits="0"/>
|
||||
<line number="768" hits="0"/>
|
||||
<line number="769" hits="0"/>
|
||||
<line number="770" hits="0"/>
|
||||
<line number="772" hits="0"/>
|
||||
<line number="775" hits="0"/>
|
||||
<line number="778" hits="0"/>
|
||||
<line number="784" hits="1"/>
|
||||
<line number="786" hits="0"/>
|
||||
<line number="787" hits="0"/>
|
||||
<line number="789" hits="0"/>
|
||||
<line number="790" hits="0"/>
|
||||
<line number="792" hits="0"/>
|
||||
<line number="793" hits="0"/>
|
||||
<line number="794" hits="0"/>
|
||||
<line number="795" hits="0"/>
|
||||
<line number="798" hits="0"/>
|
||||
<line number="799" hits="0"/>
|
||||
<line number="802" hits="0"/>
|
||||
<line number="805" hits="0"/>
|
||||
<line number="807" hits="0"/>
|
||||
<line number="808" hits="0"/>
|
||||
<line number="809" hits="0"/>
|
||||
<line number="811" hits="0"/>
|
||||
<line number="813" hits="0"/>
|
||||
<line number="816" hits="0"/>
|
||||
<line number="818" hits="0"/>
|
||||
<line number="820" hits="0"/>
|
||||
<line number="823" hits="0"/>
|
||||
<line number="824" hits="0"/>
|
||||
<line number="828" hits="0"/>
|
||||
<line number="829" hits="0"/>
|
||||
<line number="830" hits="0"/>
|
||||
<line number="832" hits="0"/>
|
||||
<line number="834" hits="0"/>
|
||||
</lines>
|
||||
</class>
|
||||
</classes>
|
||||
</package>
|
||||
</packages>
|
||||
</coverage>
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
[project]
|
||||
name = "thechart"
|
||||
version = "1.0.1"
|
||||
version = "1.2.1"
|
||||
description = "Chart to monitor your medication intake over time."
|
||||
readme = "README.md"
|
||||
requires-python = ">=3.13"
|
||||
|
||||
@@ -12,7 +12,7 @@ sys.path.insert(0, os.path.join(os.path.dirname(__file__), "src"))
|
||||
|
||||
import logging
|
||||
|
||||
from ui_manager import UIManager
|
||||
from src.ui_manager import UIManager
|
||||
|
||||
|
||||
def test_automated_multiple_punches():
|
||||
|
||||
@@ -10,7 +10,7 @@ import sys
|
||||
# Add the src directory to the Python path
|
||||
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "src"))
|
||||
|
||||
from data_manager import DataManager
|
||||
from src.data_manager import DataManager
|
||||
|
||||
# Set up simple logging
|
||||
logging.basicConfig(level=logging.DEBUG)
|
||||
|
||||
@@ -10,7 +10,7 @@ import sys
|
||||
# Add the src directory to the path so we can import our modules
|
||||
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "src"))
|
||||
|
||||
from data_manager import DataManager
|
||||
from src.data_manager import DataManager
|
||||
|
||||
|
||||
def test_delete_functionality():
|
||||
|
||||
@@ -14,7 +14,7 @@ sys.path.insert(0, os.path.join(os.path.dirname(__file__), "src"))
|
||||
|
||||
import logging
|
||||
|
||||
from ui_manager import UIManager
|
||||
from src.ui_manager import UIManager
|
||||
|
||||
|
||||
def demonstrate_multiple_doses():
|
||||
|
||||
@@ -11,7 +11,7 @@ import sys
|
||||
# Add the src directory to the path so we can import our modules
|
||||
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "src"))
|
||||
|
||||
from data_manager import DataManager
|
||||
from src.data_manager import DataManager
|
||||
|
||||
|
||||
def test_dose_editing_functionality():
|
||||
@@ -100,7 +100,7 @@ def test_dose_editing_functionality():
|
||||
try:
|
||||
import tkinter as tk
|
||||
|
||||
from ui_manager import UIManager
|
||||
from src.ui_manager import UIManager
|
||||
|
||||
# Create a temporary UI manager to test the parsing
|
||||
root = tk.Tk()
|
||||
|
||||
@@ -9,8 +9,8 @@ from datetime import datetime
|
||||
|
||||
sys.path.append(os.path.join(os.path.dirname(__file__), "src"))
|
||||
|
||||
from data_manager import DataManager
|
||||
from init import logger
|
||||
from src.data_manager import DataManager
|
||||
from src.init import logger
|
||||
|
||||
|
||||
def test_dose_tracking():
|
||||
|
||||
@@ -9,8 +9,8 @@ import sys
|
||||
# Add src to path
|
||||
sys.path.append(os.path.join(os.path.dirname(__file__), "src"))
|
||||
|
||||
from data_manager import DataManager
|
||||
from init import logger
|
||||
from src.data_manager import DataManager
|
||||
from src.init import logger
|
||||
|
||||
|
||||
def test_edit_functionality():
|
||||
|
||||
@@ -11,7 +11,7 @@ import sys
|
||||
# Add the src directory to the path so we can import our modules
|
||||
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "src"))
|
||||
|
||||
from data_manager import DataManager
|
||||
from src.data_manager import DataManager
|
||||
|
||||
|
||||
def test_edit_window_functionality():
|
||||
|
||||
@@ -12,7 +12,7 @@ sys.path.insert(0, os.path.join(os.path.dirname(__file__), "src"))
|
||||
|
||||
import logging
|
||||
|
||||
from ui_manager import UIManager
|
||||
from src.ui_manager import UIManager
|
||||
|
||||
|
||||
def test_edit_window_punch_buttons():
|
||||
|
||||
@@ -11,7 +11,7 @@ sys.path.insert(0, os.path.join(os.path.dirname(__file__), "src"))
|
||||
|
||||
import logging
|
||||
|
||||
from ui_manager import UIManager
|
||||
from src.ui_manager import UIManager
|
||||
|
||||
|
||||
def final_verification_test():
|
||||
|
||||
@@ -12,7 +12,7 @@ sys.path.insert(0, os.path.join(os.path.dirname(__file__), "src"))
|
||||
|
||||
import logging
|
||||
|
||||
from ui_manager import UIManager
|
||||
from src.ui_manager import UIManager
|
||||
|
||||
|
||||
def test_parse_dose_text():
|
||||
|
||||
@@ -12,7 +12,7 @@ sys.path.insert(0, os.path.join(os.path.dirname(__file__), "src"))
|
||||
|
||||
import logging
|
||||
|
||||
from ui_manager import UIManager
|
||||
from src.ui_manager import UIManager
|
||||
|
||||
|
||||
def test_multiple_punch_and_save():
|
||||
|
||||
@@ -12,7 +12,7 @@ sys.path.insert(0, os.path.join(os.path.dirname(__file__), "src"))
|
||||
|
||||
import logging
|
||||
|
||||
from ui_manager import UIManager
|
||||
from src.ui_manager import UIManager
|
||||
|
||||
|
||||
def test_programmatic_punch():
|
||||
|
||||
@@ -11,7 +11,7 @@ sys.path.insert(0, os.path.join(os.path.dirname(__file__), "src"))
|
||||
|
||||
import logging
|
||||
|
||||
from ui_manager import UIManager
|
||||
from src.ui_manager import UIManager
|
||||
|
||||
|
||||
def test_punch_button_step_by_step():
|
||||
|
||||
@@ -11,7 +11,7 @@ sys.path.insert(0, os.path.join(os.path.dirname(__file__), "src"))
|
||||
|
||||
import logging
|
||||
|
||||
from ui_manager import UIManager
|
||||
from src.ui_manager import UIManager
|
||||
|
||||
|
||||
def test_punch_button_only():
|
||||
|
||||
@@ -12,7 +12,7 @@ sys.path.insert(0, os.path.join(os.path.dirname(__file__), "src"))
|
||||
|
||||
import logging
|
||||
|
||||
from ui_manager import UIManager
|
||||
from src.ui_manager import UIManager
|
||||
|
||||
|
||||
def test_save_functionality():
|
||||
|
||||
@@ -14,8 +14,8 @@ sys.path.append(os.path.join(os.path.dirname(__file__), "src"))
|
||||
|
||||
def test_scrollable_input():
|
||||
"""Test the scrollable input frame."""
|
||||
from init import logger
|
||||
from ui_manager import UIManager
|
||||
from src.init import logger
|
||||
from src.ui_manager import UIManager
|
||||
|
||||
# Create a test window
|
||||
root = tk.Tk()
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
"""The Chart - Medication tracking application."""
|
||||
|
||||
__version__ = "1.1.0"
|
||||
__author__ = "Will"
|
||||
__description__ = "Chart to monitor your medication intake over time."
|
||||
+5
-1
@@ -1,8 +1,12 @@
|
||||
import os
|
||||
import sys
|
||||
|
||||
from dotenv import load_dotenv
|
||||
|
||||
load_dotenv(override=True)
|
||||
extDataDir = os.getcwd()
|
||||
if getattr(sys, "frozen", False):
|
||||
extDataDir = sys._MEIPASS
|
||||
load_dotenv(dotenv_path=os.path.join(extDataDir, ".env"))
|
||||
|
||||
LOG_LEVEL = os.getenv("LOG_LEVEL", "INFO").upper()
|
||||
LOG_PATH = os.getenv("LOG_PATH", "/tmp/logs/thechart")
|
||||
|
||||
+28
-3
@@ -108,9 +108,32 @@ class DataManager:
|
||||
return False
|
||||
|
||||
# Find the row to update using original_date as a unique identifier
|
||||
# Handle both old format (10 columns) and new format (14 columns)
|
||||
if len(values) == 14:
|
||||
# New format with dose columns
|
||||
# Handle both old format (10 columns) and new format (16 columns)
|
||||
if len(values) == 16:
|
||||
# New format with all dose columns including quetiapine
|
||||
df.loc[
|
||||
df["date"] == original_date,
|
||||
[
|
||||
"date",
|
||||
"depression",
|
||||
"anxiety",
|
||||
"sleep",
|
||||
"appetite",
|
||||
"bupropion",
|
||||
"bupropion_doses",
|
||||
"hydroxyzine",
|
||||
"hydroxyzine_doses",
|
||||
"gabapentin",
|
||||
"gabapentin_doses",
|
||||
"propranolol",
|
||||
"propranolol_doses",
|
||||
"quetiapine",
|
||||
"quetiapine_doses",
|
||||
"note",
|
||||
],
|
||||
] = values
|
||||
elif len(values) == 14:
|
||||
# Format without quetiapine
|
||||
df.loc[
|
||||
df["date"] == original_date,
|
||||
[
|
||||
@@ -192,6 +215,8 @@ class DataManager:
|
||||
"gabapentin_doses": "",
|
||||
"propranolol": 0,
|
||||
"propranolol_doses": "",
|
||||
"quetiapine": 0,
|
||||
"quetiapine_doses": "",
|
||||
"note": "",
|
||||
}
|
||||
df = pd.concat([df, pd.DataFrame([new_entry])], ignore_index=True)
|
||||
|
||||
+2
-2
@@ -138,8 +138,8 @@ class MedTrackerApp:
|
||||
full_row["gabapentin_doses"],
|
||||
full_row["propranolol"],
|
||||
full_row["propranolol_doses"],
|
||||
full_row.get("quetiapine", 0),
|
||||
full_row.get("quetiapine_doses", ""),
|
||||
full_row["quetiapine"],
|
||||
full_row["quetiapine_doses"],
|
||||
full_row["note"],
|
||||
)
|
||||
else:
|
||||
|
||||
+25
-25
@@ -20,9 +20,9 @@ class TestConstants:
|
||||
if 'constants' in sys.modules:
|
||||
importlib.reload(sys.modules['constants'])
|
||||
else:
|
||||
import constants
|
||||
import src.constants
|
||||
|
||||
assert constants.LOG_LEVEL == "INFO"
|
||||
assert src.constants.LOG_LEVEL == "INFO"
|
||||
|
||||
def test_custom_log_level(self):
|
||||
"""Test custom LOG_LEVEL from environment."""
|
||||
@@ -31,9 +31,9 @@ class TestConstants:
|
||||
if 'constants' in sys.modules:
|
||||
importlib.reload(sys.modules['constants'])
|
||||
else:
|
||||
import constants
|
||||
import src.constants
|
||||
|
||||
assert constants.LOG_LEVEL == "DEBUG"
|
||||
assert src.constants.LOG_LEVEL == "DEBUG"
|
||||
|
||||
def test_default_log_path(self):
|
||||
"""Test default LOG_PATH when not set in environment."""
|
||||
@@ -42,9 +42,9 @@ class TestConstants:
|
||||
if 'constants' in sys.modules:
|
||||
importlib.reload(sys.modules['constants'])
|
||||
else:
|
||||
import constants
|
||||
import src.constants
|
||||
|
||||
assert constants.LOG_PATH == "/tmp/logs/thechart"
|
||||
assert src.constants.LOG_PATH == "/tmp/logs/thechart"
|
||||
|
||||
def test_custom_log_path(self):
|
||||
"""Test custom LOG_PATH from environment."""
|
||||
@@ -53,9 +53,9 @@ class TestConstants:
|
||||
if 'constants' in sys.modules:
|
||||
importlib.reload(sys.modules['constants'])
|
||||
else:
|
||||
import constants
|
||||
import src.constants
|
||||
|
||||
assert constants.LOG_PATH == "/custom/log/path"
|
||||
assert src.constants.LOG_PATH == "/custom/log/path"
|
||||
|
||||
def test_default_log_clear(self):
|
||||
"""Test default LOG_CLEAR when not set in environment."""
|
||||
@@ -64,9 +64,9 @@ class TestConstants:
|
||||
if 'constants' in sys.modules:
|
||||
importlib.reload(sys.modules['constants'])
|
||||
else:
|
||||
import constants
|
||||
import src.constants
|
||||
|
||||
assert constants.LOG_CLEAR == "False"
|
||||
assert src.constants.LOG_CLEAR == "False"
|
||||
|
||||
def test_custom_log_clear_true(self):
|
||||
"""Test LOG_CLEAR when set to true in environment."""
|
||||
@@ -75,9 +75,9 @@ class TestConstants:
|
||||
if 'constants' in sys.modules:
|
||||
importlib.reload(sys.modules['constants'])
|
||||
else:
|
||||
import constants
|
||||
import src.constants
|
||||
|
||||
assert constants.LOG_CLEAR == "True"
|
||||
assert src.constants.LOG_CLEAR == "True"
|
||||
|
||||
def test_custom_log_clear_false(self):
|
||||
"""Test LOG_CLEAR when set to false in environment."""
|
||||
@@ -86,9 +86,9 @@ class TestConstants:
|
||||
if 'constants' in sys.modules:
|
||||
importlib.reload(sys.modules['constants'])
|
||||
else:
|
||||
import constants
|
||||
import src.constants
|
||||
|
||||
assert constants.LOG_CLEAR == "False"
|
||||
assert src.constants.LOG_CLEAR == "False"
|
||||
|
||||
def test_log_level_case_insensitive(self):
|
||||
"""Test that LOG_LEVEL is converted to uppercase."""
|
||||
@@ -97,9 +97,9 @@ class TestConstants:
|
||||
if 'constants' in sys.modules:
|
||||
importlib.reload(sys.modules['constants'])
|
||||
else:
|
||||
import constants
|
||||
import src.constants
|
||||
|
||||
assert constants.LOG_LEVEL == "WARNING"
|
||||
assert src.constants.LOG_LEVEL == "WARNING"
|
||||
|
||||
def test_dotenv_override(self):
|
||||
"""Test that dotenv override parameter is set to True."""
|
||||
@@ -109,22 +109,22 @@ class TestConstants:
|
||||
if 'constants' in sys.modules:
|
||||
importlib.reload(sys.modules['constants'])
|
||||
else:
|
||||
import constants
|
||||
import src.constants
|
||||
|
||||
mock_load_dotenv.assert_called_once_with(override=True)
|
||||
|
||||
def test_all_constants_are_strings(self):
|
||||
"""Test that all constants are string type."""
|
||||
import constants
|
||||
import src.constants
|
||||
|
||||
assert isinstance(constants.LOG_LEVEL, str)
|
||||
assert isinstance(constants.LOG_PATH, str)
|
||||
assert isinstance(constants.LOG_CLEAR, str)
|
||||
assert isinstance(src.constants.LOG_LEVEL, str)
|
||||
assert isinstance(src.constants.LOG_PATH, str)
|
||||
assert isinstance(src.constants.LOG_CLEAR, str)
|
||||
|
||||
def test_constants_not_empty(self):
|
||||
"""Test that constants are not empty strings."""
|
||||
import constants
|
||||
import src.constants
|
||||
|
||||
assert constants.LOG_LEVEL != ""
|
||||
assert constants.LOG_PATH != ""
|
||||
assert constants.LOG_CLEAR != ""
|
||||
assert src.constants.LOG_LEVEL != ""
|
||||
assert src.constants.LOG_PATH != ""
|
||||
assert src.constants.LOG_CLEAR != ""
|
||||
|
||||
@@ -12,7 +12,7 @@ import matplotlib.pyplot as plt
|
||||
import sys
|
||||
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', 'src'))
|
||||
|
||||
from graph_manager import GraphManager
|
||||
from src.graph_manager import GraphManager
|
||||
|
||||
|
||||
class TestGraphManager:
|
||||
|
||||
+19
-19
@@ -24,7 +24,7 @@ class TestInit:
|
||||
if 'init' in sys.modules:
|
||||
importlib.reload(sys.modules['init'])
|
||||
else:
|
||||
import init
|
||||
import src.init
|
||||
|
||||
mock_mkdir.assert_called_once()
|
||||
|
||||
@@ -38,7 +38,7 @@ class TestInit:
|
||||
if 'init' in sys.modules:
|
||||
importlib.reload(sys.modules['init'])
|
||||
else:
|
||||
import init
|
||||
import src.init
|
||||
|
||||
mock_mkdir.assert_not_called()
|
||||
|
||||
@@ -53,7 +53,7 @@ class TestInit:
|
||||
if 'init' in sys.modules:
|
||||
importlib.reload(sys.modules['init'])
|
||||
else:
|
||||
import init
|
||||
import src.init
|
||||
|
||||
mock_print.assert_called()
|
||||
|
||||
@@ -70,7 +70,7 @@ class TestInit:
|
||||
if 'init' in sys.modules:
|
||||
importlib.reload(sys.modules['init'])
|
||||
else:
|
||||
import init
|
||||
import src.init
|
||||
|
||||
mock_init_logger.assert_called_once_with('init', testing_mode=False)
|
||||
|
||||
@@ -87,7 +87,7 @@ class TestInit:
|
||||
if 'init' in sys.modules:
|
||||
importlib.reload(sys.modules['init'])
|
||||
else:
|
||||
import init
|
||||
import src.init
|
||||
|
||||
mock_init_logger.assert_called_once_with('init', testing_mode=True)
|
||||
|
||||
@@ -98,7 +98,7 @@ class TestInit:
|
||||
if 'init' in sys.modules:
|
||||
importlib.reload(sys.modules['init'])
|
||||
else:
|
||||
import init
|
||||
import src.init
|
||||
|
||||
expected_files = (
|
||||
f"{temp_log_dir}/thechart.log",
|
||||
@@ -106,7 +106,7 @@ class TestInit:
|
||||
f"{temp_log_dir}/thechart.error.log",
|
||||
)
|
||||
|
||||
assert init.log_files == expected_files
|
||||
assert src.init.log_files == expected_files
|
||||
|
||||
def test_testing_mode_detection(self, temp_log_dir):
|
||||
"""Test that testing mode is detected correctly."""
|
||||
@@ -117,14 +117,14 @@ class TestInit:
|
||||
if 'init' in sys.modules:
|
||||
importlib.reload(sys.modules['init'])
|
||||
else:
|
||||
import init
|
||||
import src.init
|
||||
|
||||
assert init.testing_mode is True
|
||||
assert src.init.testing_mode is True
|
||||
|
||||
# Test with non-DEBUG level
|
||||
with patch('init.LOG_LEVEL', 'INFO'):
|
||||
importlib.reload(sys.modules['init'])
|
||||
assert init.testing_mode is False
|
||||
assert src.init.testing_mode is False
|
||||
|
||||
def test_log_clear_true(self, temp_log_dir):
|
||||
"""Test log file clearing when LOG_CLEAR is True."""
|
||||
@@ -147,7 +147,7 @@ class TestInit:
|
||||
if 'init' in sys.modules:
|
||||
importlib.reload(sys.modules['init'])
|
||||
else:
|
||||
import init
|
||||
import src.init
|
||||
|
||||
# Check that files were truncated
|
||||
for log_file in log_files:
|
||||
@@ -176,7 +176,7 @@ class TestInit:
|
||||
if 'init' in sys.modules:
|
||||
importlib.reload(sys.modules['init'])
|
||||
else:
|
||||
import init
|
||||
import src.init
|
||||
|
||||
# Check that files were not truncated
|
||||
for log_file in log_files:
|
||||
@@ -203,7 +203,7 @@ class TestInit:
|
||||
if 'init' in sys.modules:
|
||||
importlib.reload(sys.modules['init'])
|
||||
else:
|
||||
import init
|
||||
import src.init
|
||||
|
||||
def test_log_clear_permission_error(self, temp_log_dir):
|
||||
"""Test handling of permission errors during log clearing."""
|
||||
@@ -226,7 +226,7 @@ class TestInit:
|
||||
if 'init' in sys.modules:
|
||||
importlib.reload(sys.modules['init'])
|
||||
else:
|
||||
import init
|
||||
import src.init
|
||||
|
||||
def test_module_exports(self, temp_log_dir):
|
||||
"""Test that module exports expected objects."""
|
||||
@@ -235,12 +235,12 @@ class TestInit:
|
||||
if 'init' in sys.modules:
|
||||
importlib.reload(sys.modules['init'])
|
||||
else:
|
||||
import init
|
||||
import src.init
|
||||
|
||||
# Check that expected objects are available
|
||||
assert hasattr(init, 'logger')
|
||||
assert hasattr(init, 'log_files')
|
||||
assert hasattr(init, 'testing_mode')
|
||||
assert hasattr(src.init, 'logger')
|
||||
assert hasattr(src.init, 'log_files')
|
||||
assert hasattr(src.init, 'testing_mode')
|
||||
|
||||
def test_log_path_printing(self, temp_log_dir):
|
||||
"""Test that LOG_PATH is printed when directory is created."""
|
||||
@@ -253,6 +253,6 @@ class TestInit:
|
||||
if 'init' in sys.modules:
|
||||
importlib.reload(sys.modules['init'])
|
||||
else:
|
||||
import init
|
||||
import src.init
|
||||
|
||||
mock_print.assert_called_with(temp_log_dir + '/new_dir')
|
||||
|
||||
@@ -10,7 +10,7 @@ from unittest.mock import patch, Mock
|
||||
import sys
|
||||
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', 'src'))
|
||||
|
||||
from logger import init_logger
|
||||
from src.logger import init_logger
|
||||
|
||||
|
||||
class TestLogger:
|
||||
|
||||
+1
-1
@@ -10,7 +10,7 @@ import pandas as pd
|
||||
import sys
|
||||
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', 'src'))
|
||||
|
||||
from main import MedTrackerApp
|
||||
from src.main import MedTrackerApp
|
||||
|
||||
|
||||
class TestMedTrackerApp:
|
||||
|
||||
Reference in New Issue
Block a user