Compare commits

..

No commits in common. "a3a2c45832d710b569fc088a2924b1f22ac353c9" and "0aa38726f0f793d6d3dcbaf47fc7a4a7da9e3cb9" have entirely different histories.

18 changed files with 242 additions and 85 deletions

View File

14
Pipfile Normal file
View File

@ -0,0 +1,14 @@
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"
[packages]
requests-futures = "*"
pyside2 = "*"
[dev-packages]
ipython = "*"
[requires]
python_version = "3"

201
Pipfile.lock generated Normal file
View File

@ -0,0 +1,201 @@
{
"_meta": {
"hash": {
"sha256": "3b71908cf3ecbacde9e592c855ee3b65686e920c23df69d66dd2dff2cd4afe8b"
},
"pipfile-spec": 6,
"requires": {
"python_version": "3"
},
"sources": [
{
"name": "pypi",
"url": "https://pypi.org/simple",
"verify_ssl": true
}
]
},
"default": {
"certifi": {
"hashes": [
"sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872",
"sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"
],
"version": "==2021.10.8"
},
"charset-normalizer": {
"hashes": [
"sha256:e019de665e2bcf9c2b64e2e5aa025fa991da8720daa3c1138cadd2fd1856aed0",
"sha256:f7af805c321bfa1ce6714c51f254e0d5bb5e5834039bc17db7ebe3a4cec9492b"
],
"markers": "python_version >= '3'",
"version": "==2.0.7"
},
"idna": {
"hashes": [
"sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff",
"sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"
],
"markers": "python_version >= '3'",
"version": "==3.3"
},
"pyside2": {
"hashes": [
"sha256:0558ced3bcd7f9da638fa8b7709dba5dae82a38728e481aac8b9058ea22fcdd9",
"sha256:081d8c8a6c65fb1392856a547814c0c014e25ac04b38b987d9a3483e879e9634",
"sha256:087a0b719bb967405ea85fd202757c761f1fc73d0e2397bc3a6a15376782ee75",
"sha256:1316aa22dd330df096daf7b0defe9c00297a66e0b4907f057aaa3e88c53d1aff",
"sha256:4f17a0161995678110447711d685fcd7b15b762810e8f00f6dc239bffb70a32e",
"sha256:976cacf01ef3b397a680f9228af7d3d6273b9254457ad4204731507c1f9e6c3c"
],
"index": "pypi",
"version": "==5.15.2"
},
"requests": {
"hashes": [
"sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24",
"sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7"
],
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'",
"version": "==2.26.0"
},
"requests-futures": {
"hashes": [
"sha256:35547502bf1958044716a03a2f47092a89efe8f9789ab0c4c528d9c9c30bc148",
"sha256:633804c773b960cef009efe2a5585483443c6eac3c39cc64beba2884013bcdd9"
],
"index": "pypi",
"version": "==1.0.0"
},
"shiboken2": {
"hashes": [
"sha256:03f41b0693b91c7f89627f1085a4ecbe8591c03f904118a034854d935e0e766c",
"sha256:14a33169cf1bd919e4c4c4408fffbcd424c919a3f702df412b8d72b694e4c1d5",
"sha256:4aee1b91e339578f9831e824ce2a1ec3ba3a463f41fda8946b4547c7eb3cba86",
"sha256:89c157a0e2271909330e1655892e7039249f7b79a64a443d52c512337065cde0",
"sha256:ae8ca41274cfa057106268b6249674ca669c5b21009ec49b16d77665ab9619ed",
"sha256:edc12a4df2b5be7ca1e762ab94e331ba9e2fbfe3932c20378d8aa3f73f90e0af"
],
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '3.10'",
"version": "==5.15.2"
},
"urllib3": {
"hashes": [
"sha256:4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece",
"sha256:c4fdf4019605b6e5423637e01bc9fe4daef873709a7973e195ceba0a62bbc844"
],
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'",
"version": "==1.26.7"
}
},
"develop": {
"backcall": {
"hashes": [
"sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e",
"sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"
],
"version": "==0.2.0"
},
"decorator": {
"hashes": [
"sha256:7b12e7c3c6ab203a29e157335e9122cb03de9ab7264b137594103fd4a683b374",
"sha256:e59913af105b9860aa2c8d3272d9de5a56a4e608db9a2f167a8480b323d529a7"
],
"markers": "python_version >= '3.5'",
"version": "==5.1.0"
},
"ipython": {
"hashes": [
"sha256:4f69d7423a5a1972f6347ff233e38bbf4df6a150ef20fbb00c635442ac3060aa",
"sha256:a658beaf856ce46bc453366d5dc6b2ddc6c481efd3540cb28aa3943819caac9f"
],
"index": "pypi",
"version": "==7.29.0"
},
"jedi": {
"hashes": [
"sha256:18456d83f65f400ab0c2d3319e48520420ef43b23a086fdc05dff34132f0fb93",
"sha256:92550a404bad8afed881a137ec9a461fed49eca661414be45059329614ed0707"
],
"markers": "python_version >= '3.6'",
"version": "==0.18.0"
},
"matplotlib-inline": {
"hashes": [
"sha256:a04bfba22e0d1395479f866853ec1ee28eea1485c1d69a6faf00dc3e24ff34ee",
"sha256:aed605ba3b72462d64d475a21a9296f400a19c4f74a31b59103d2a99ffd5aa5c"
],
"markers": "python_version >= '3.5'",
"version": "==0.1.3"
},
"parso": {
"hashes": [
"sha256:12b83492c6239ce32ff5eed6d3639d6a536170723c6f3f1506869f1ace413398",
"sha256:a8c4922db71e4fdb90e0d0bc6e50f9b273d3397925e5e60a717e719201778d22"
],
"markers": "python_version >= '3.6'",
"version": "==0.8.2"
},
"pexpect": {
"hashes": [
"sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937",
"sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"
],
"markers": "sys_platform != 'win32'",
"version": "==4.8.0"
},
"pickleshare": {
"hashes": [
"sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca",
"sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"
],
"version": "==0.7.5"
},
"prompt-toolkit": {
"hashes": [
"sha256:449f333dd120bd01f5d296a8ce1452114ba3a71fae7288d2f0ae2c918764fa72",
"sha256:48d85cdca8b6c4f16480c7ce03fd193666b62b0a21667ca56b4bb5ad679d1170"
],
"markers": "python_full_version >= '3.6.2'",
"version": "==3.0.22"
},
"ptyprocess": {
"hashes": [
"sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35",
"sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"
],
"version": "==0.7.0"
},
"pygments": {
"hashes": [
"sha256:b8e67fe6af78f492b3c4b3e2970c0624cbf08beb1e493b2c99b9fa1b67a20380",
"sha256:f398865f7eb6874156579fdf36bc840a03cab64d1cde9e93d68f46a425ec52c6"
],
"markers": "python_version >= '3.5'",
"version": "==2.10.0"
},
"setuptools": {
"hashes": [
"sha256:94ee891f4759150cded601a6beb6b08400413aefd0267b692f3f8c6e0bb238e7",
"sha256:fb537610c2dfe77b5896e3ee53dd53fbdd9adc48076c8f28cee3a30fb59a5038"
],
"markers": "python_version >= '3.6'",
"version": "==59.1.1"
},
"traitlets": {
"hashes": [
"sha256:059f456c5a7c1c82b98c2e8c799f39c9b8128f6d0d46941ee118daace9eb70c7",
"sha256:2d313cc50a42cd6c277e7d7dc8d4d7fedd06a2c215f78766ae7b1a66277e0033"
],
"markers": "python_version >= '3.7'",
"version": "==5.1.1"
},
"wcwidth": {
"hashes": [
"sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784",
"sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83"
],
"version": "==0.2.5"
}
}
}

View File

@ -1,22 +0,0 @@
# fime
Simple time tracking app written with Python and Qt5
Some JIRA integration is available.
## Config file
The file path is OS dependant. There is an error message on the first start, which will tell you the correct path for
your OS.
Format:
```
jira_url = https://jira.company.com
jira_token = aBc1D34
```
The `jira_token` is a Personal Access Token. See [here](https://confluence.atlassian.com/enterprise/using-personal-access-tokens-1026032365.htmlh) on how to get one.
## License
Licensed under MIT license. See License.md for more details.

7
Readme.md Normal file
View File

@ -0,0 +1,7 @@
# fimefracking
Simple time tracking app written with Python and Qt5
## License
Licensed under MIT license. See License.md for more details.

View File

@ -1,9 +1,10 @@
import os
from configparser import ConfigParser
from pathlib import Path
from PySide2 import QtCore
from fime.exceptions import FimeException
from exceptions import FimeFrackingException
def dequotify(string):
@ -17,7 +18,7 @@ class Config:
def __init__(self):
self._configparser = ConfigParser()
config_dir_path = Path(QtCore.QStandardPaths.writableLocation(QtCore.QStandardPaths.ConfigLocation))
config_path = config_dir_path / "fime" / "fime.conf"
config_path = config_dir_path / "fimefracking" / "fimefracking.conf"
if config_path.exists():
with open(config_path) as f:
config_text = f.read()
@ -25,7 +26,7 @@ class Config:
self._configparser.read_string(config_text)
if (not self._configparser.has_option("DEFAULT", "jira_url") or
not self._configparser.has_option("DEFAULT", "jira_token")):
raise FimeException(f'Please add config file {config_path} '
raise FimeFrackingException(f'Please add config file {config_path} '
f'with config keys "jira_url" and "jira_token" in INI style')
@property

View File

@ -10,7 +10,7 @@ from typing import List
from PySide2 import QtCore
data_dir_path = os.path.join(QtCore.QStandardPaths.writableLocation(QtCore.QStandardPaths.AppDataLocation),
"fime")
"fimefracking")
tasks_path = os.path.join(data_dir_path, "tasks.json")

2
exceptions.py Normal file
View File

@ -0,0 +1,2 @@
class FimeFrackingException(Exception):
pass

View File

@ -1,6 +1,6 @@
from PySide2 import QtGui, QtWidgets
from fime.task_completer import TaskCompleter
from task_completer import TaskCompleter
class ImportTask(QtWidgets.QDialog):

View File

@ -7,12 +7,12 @@ from functools import partial
from PySide2 import QtCore, QtGui, QtWidgets
from PySide2.QtWidgets import QMessageBox
from fime.data import Tasks, Log, Data
from fime.exceptions import FimeException
from fime.import_task import ImportTask
from fime.task_edit import TaskEdit
from fime.report import Report
from fime.util import get_screen_height
from data import Tasks, Log, Data
from exceptions import FimeFrackingException
from import_task import ImportTask
from task_edit import TaskEdit
from report import Report
from util import get_screen_height
class App:
@ -41,7 +41,7 @@ class App:
self.tray.setIcon(icon)
self.tray.setContextMenu(self.menu)
self.tray.show()
self.tray.setToolTip("fime")
self.tray.setToolTip("fimefracking")
self.update_tray_menu()
@QtCore.Slot()
@ -143,13 +143,9 @@ class App:
self.taskEdit.show()
def main():
if __name__ == "__main__":
try:
app = App()
app.run()
except FimeException as e:
except FimeFrackingException as e:
QMessageBox.critical(None, "Error", str(e), QMessageBox.Ok)
if __name__ == "__main__":
main()

View File

@ -1,10 +0,0 @@
[build-system]
requires = [
"setuptools>=45",
"wheel",
"setuptools_scm>=6.2",
]
build-backend = "setuptools.build_meta"
[tool.setuptools_scm]
version_scheme = "python-simplified-semver"

View File

@ -4,8 +4,8 @@ from datetime import datetime
from PySide2.QtWidgets import QHeaderView
from fime.data import Tasks
from fime.util import get_screen_height
from data import Tasks
from util import get_screen_height
class Report(QtWidgets.QDialog):

View File

@ -1,30 +0,0 @@
[metadata]
name = fime
author = Faerbit
author_email = faerbit@posteo.net
description = Simple time tracking app written with Python and Qt5
long_description = file: README.md
long_description_content_type = text/markdown
url = https://git.faerb.it/faerbit/fime
classifiers =
Programming Language :: Python :: 3
License :: OSI Approved :: MIT License
Operating System :: OS Independent
[options]
package_dir =
= src
packages = find:
python_requires = >=3.6
install_requires =
requests
requests-futures
PySide2
[options.packages.find]
where = src
[options.entry_points]
console_scripts =
fime = fime.main:main

View File

View File

@ -1,2 +0,0 @@
class FimeException(Exception):
pass

View File

@ -10,7 +10,7 @@ from PySide2.QtCore import QTimer
from PySide2.QtWidgets import QCompleter
from requests_futures.sessions import FuturesSession
from fime.config import Config
from config import Config
class TaskCompleter(QCompleter):