Compare commits
No commits in common. "b9c89155e346932cf338f9d146bd46bb1408d1b1" and "0b8bddb5888ccd77ca9fe85eaf2bbd7eb4a6f599" have entirely different histories.
b9c89155e3
...
0b8bddb588
16 changed files with 36 additions and 432 deletions
4
habitmove/__init__.py
Normal file
4
habitmove/__init__.py
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
import habitmove.schema as schema
|
||||||
|
import habitmove.habits as habits
|
||||||
|
import habitmove.repetitions as rep
|
||||||
|
import habitmove.nomie as nomie
|
|
@ -1,10 +1,7 @@
|
||||||
import sqlite3
|
|
||||||
|
|
||||||
from habitmove.nomiedata import Tracker
|
|
||||||
from habitmove.loopdata import Habit
|
from habitmove.loopdata import Habit
|
||||||
|
|
||||||
|
|
||||||
def migrate(db: sqlite3.Connection, trackers: list[Tracker]):
|
def migrate(db, trackers):
|
||||||
c = db.cursor()
|
c = db.cursor()
|
||||||
habits = trackers_to_habits(trackers)
|
habits = trackers_to_habits(trackers)
|
||||||
for habit in habits:
|
for habit in habits:
|
||||||
|
@ -26,7 +23,7 @@ def trackers_to_habits(trackers):
|
||||||
habits.append(
|
habits.append(
|
||||||
Habit(
|
Habit(
|
||||||
archived=t.hidden,
|
archived=t.hidden,
|
||||||
color=0 if t.score == -1 else 11,
|
color=11 if t.score != "-1" else 0,
|
||||||
description=t.tag,
|
description=t.tag,
|
||||||
name=f"{t.emoji} {t.label}",
|
name=f"{t.emoji} {t.label}",
|
||||||
unit="" if t.uom == "num" else t.uom,
|
unit="" if t.uom == "num" else t.uom,
|
||||||
|
@ -37,9 +34,7 @@ def trackers_to_habits(trackers):
|
||||||
habits[-1].type = 1
|
habits[-1].type = 1
|
||||||
# nomie only has concept of max value,
|
# nomie only has concept of max value,
|
||||||
# use a percentage of it for Loop range target
|
# use a percentage of it for Loop range target
|
||||||
habits[-1].target_value = (
|
habits[-1].target_value = int(t.max) // NOMIE_MAX_TO_TARGET_VALUE_RATIO
|
||||||
t.goal or int(t.max) // NOMIE_MAX_TO_TARGET_VALUE_RATIO
|
|
||||||
)
|
|
||||||
return habits
|
return habits
|
||||||
|
|
||||||
|
|
|
@ -20,6 +20,7 @@ class Habit:
|
||||||
position: int = 0
|
position: int = 0
|
||||||
uuid: str = ""
|
uuid: str = ""
|
||||||
|
|
||||||
|
# TODO test post init uuid setting
|
||||||
def __post_init__(self):
|
def __post_init__(self):
|
||||||
if not self.uuid or self.uuid == "":
|
if not self.uuid or self.uuid == "":
|
||||||
self.uuid = uuid4().hex
|
self.uuid = uuid4().hex
|
|
@ -2,7 +2,6 @@
|
||||||
|
|
||||||
import json
|
import json
|
||||||
import re
|
import re
|
||||||
from click import secho, echo
|
|
||||||
from habitmove.nomiedata import Tracker, Event, Activity, NomieImport
|
from habitmove.nomiedata import Tracker, Event, Activity, NomieImport
|
||||||
|
|
||||||
|
|
||||||
|
@ -36,13 +35,13 @@ def verify_continue(data: NomieImport):
|
||||||
for e in data.events:
|
for e in data.events:
|
||||||
activity_count += len(e.activities) if e.activities else 0
|
activity_count += len(e.activities) if e.activities else 0
|
||||||
|
|
||||||
secho(f"Exporting from nomie {data.version}:", fg="green")
|
print(f"Exporting from nomie {data.version}:")
|
||||||
echo(f"Found trackers: {trackers}")
|
print(f"Found trackers: {trackers}")
|
||||||
echo(
|
print(
|
||||||
f"Found events: {len(data.events)} entries, containing {activity_count} individual activities."
|
f"Found events: {len(data.events)} entries, containing {activity_count} individual activities."
|
||||||
)
|
)
|
||||||
if not confirmation_question("Do you want to continue?", default_no=False):
|
if not confirmation_question("Do you want to continue?", default_no=False):
|
||||||
echo("Aborted.")
|
print("Aborted.")
|
||||||
exit(0)
|
exit(0)
|
||||||
|
|
||||||
|
|
|
@ -1,35 +1,30 @@
|
||||||
from typing import Any, Union
|
from typing import Optional, Any
|
||||||
from dataclasses import dataclass, field
|
from dataclasses import dataclass, field
|
||||||
import re
|
|
||||||
|
|
||||||
# A nomie habit tracker. Tracks anything whose value can be encapsulated in a numerical value.
|
# A nomie habit tracker. Tracks anything whose value can be encapsulated in a numerical value.
|
||||||
@dataclass(frozen=True)
|
@dataclass(frozen=True)
|
||||||
class Tracker:
|
class Tracker:
|
||||||
tag: str
|
color: str
|
||||||
label: str
|
emoji: str
|
||||||
|
hidden: bool
|
||||||
id: str
|
id: str
|
||||||
one_tap: bool = True
|
ignore_zeros: bool
|
||||||
color: str = "#000080"
|
label: str
|
||||||
emoji: str = ""
|
math: str
|
||||||
hidden: bool = False
|
one_tap: bool
|
||||||
ignore_zeros: bool = False
|
tag: str
|
||||||
math: str = "mean"
|
type: str
|
||||||
type: str = "tick" # tick or range mostly
|
uom: str
|
||||||
uom: str = ""
|
|
||||||
# TODO no idea what include does
|
# TODO no idea what include does
|
||||||
include: str = ""
|
include: str
|
||||||
min: int = 0
|
min: int = 0
|
||||||
max: int = 0
|
max: int = 0
|
||||||
goal: int = 0
|
goal: int = 0
|
||||||
default: int = 0
|
default: int = 0
|
||||||
score: Union[int, str] = 1 # score can be string ('custom') or int
|
# TODO score can be string (if custom) or int (if simple good/bad)
|
||||||
|
score: str = ""
|
||||||
score_calc: list[dict[str, Any]] = field(default_factory=lambda: [])
|
score_calc: list[dict[str, Any]] = field(default_factory=lambda: [])
|
||||||
|
|
||||||
def __post_init__(self):
|
|
||||||
# ensure save as int if not 'custom' scoring
|
|
||||||
if re.match(r"^-?[0-9]+$", str(self.score)):
|
|
||||||
object.__setattr__(self, "score", int(self.score))
|
|
||||||
|
|
||||||
|
|
||||||
@dataclass(frozen=True)
|
@dataclass(frozen=True)
|
||||||
class Activity:
|
class Activity:
|
260
poetry.lock
generated
260
poetry.lock
generated
|
@ -1,264 +1,8 @@
|
||||||
[[package]]
|
package = []
|
||||||
name = "atomicwrites"
|
|
||||||
version = "1.4.0"
|
|
||||||
description = "Atomic file writes."
|
|
||||||
category = "dev"
|
|
||||||
optional = false
|
|
||||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "attrs"
|
|
||||||
version = "21.2.0"
|
|
||||||
description = "Classes Without Boilerplate"
|
|
||||||
category = "dev"
|
|
||||||
optional = false
|
|
||||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
|
|
||||||
|
|
||||||
[package.extras]
|
|
||||||
dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit"]
|
|
||||||
docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"]
|
|
||||||
tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface"]
|
|
||||||
tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins"]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "click"
|
|
||||||
version = "8.0.3"
|
|
||||||
description = "Composable command line interface toolkit"
|
|
||||||
category = "main"
|
|
||||||
optional = false
|
|
||||||
python-versions = ">=3.6"
|
|
||||||
|
|
||||||
[package.dependencies]
|
|
||||||
colorama = {version = "*", markers = "platform_system == \"Windows\""}
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "colorama"
|
|
||||||
version = "0.4.4"
|
|
||||||
description = "Cross-platform colored terminal text."
|
|
||||||
category = "main"
|
|
||||||
optional = false
|
|
||||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "coverage"
|
|
||||||
version = "6.2"
|
|
||||||
description = "Code coverage measurement for Python"
|
|
||||||
category = "dev"
|
|
||||||
optional = false
|
|
||||||
python-versions = ">=3.6"
|
|
||||||
|
|
||||||
[package.dependencies]
|
|
||||||
tomli = {version = "*", optional = true, markers = "extra == \"toml\""}
|
|
||||||
|
|
||||||
[package.extras]
|
|
||||||
toml = ["tomli"]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "iniconfig"
|
|
||||||
version = "1.1.1"
|
|
||||||
description = "iniconfig: brain-dead simple config-ini parsing"
|
|
||||||
category = "dev"
|
|
||||||
optional = false
|
|
||||||
python-versions = "*"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "packaging"
|
|
||||||
version = "21.3"
|
|
||||||
description = "Core utilities for Python packages"
|
|
||||||
category = "dev"
|
|
||||||
optional = false
|
|
||||||
python-versions = ">=3.6"
|
|
||||||
|
|
||||||
[package.dependencies]
|
|
||||||
pyparsing = ">=2.0.2,<3.0.5 || >3.0.5"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "pluggy"
|
|
||||||
version = "1.0.0"
|
|
||||||
description = "plugin and hook calling mechanisms for python"
|
|
||||||
category = "dev"
|
|
||||||
optional = false
|
|
||||||
python-versions = ">=3.6"
|
|
||||||
|
|
||||||
[package.extras]
|
|
||||||
dev = ["pre-commit", "tox"]
|
|
||||||
testing = ["pytest", "pytest-benchmark"]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "py"
|
|
||||||
version = "1.11.0"
|
|
||||||
description = "library with cross-python path, ini-parsing, io, code, log facilities"
|
|
||||||
category = "dev"
|
|
||||||
optional = false
|
|
||||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "pyparsing"
|
|
||||||
version = "3.0.6"
|
|
||||||
description = "Python parsing module"
|
|
||||||
category = "dev"
|
|
||||||
optional = false
|
|
||||||
python-versions = ">=3.6"
|
|
||||||
|
|
||||||
[package.extras]
|
|
||||||
diagrams = ["jinja2", "railroad-diagrams"]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "pytest"
|
|
||||||
version = "6.2.5"
|
|
||||||
description = "pytest: simple powerful testing with Python"
|
|
||||||
category = "dev"
|
|
||||||
optional = false
|
|
||||||
python-versions = ">=3.6"
|
|
||||||
|
|
||||||
[package.dependencies]
|
|
||||||
atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""}
|
|
||||||
attrs = ">=19.2.0"
|
|
||||||
colorama = {version = "*", markers = "sys_platform == \"win32\""}
|
|
||||||
iniconfig = "*"
|
|
||||||
packaging = "*"
|
|
||||||
pluggy = ">=0.12,<2.0"
|
|
||||||
py = ">=1.8.2"
|
|
||||||
toml = "*"
|
|
||||||
|
|
||||||
[package.extras]
|
|
||||||
testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "pytest-cov"
|
|
||||||
version = "3.0.0"
|
|
||||||
description = "Pytest plugin for measuring coverage."
|
|
||||||
category = "dev"
|
|
||||||
optional = false
|
|
||||||
python-versions = ">=3.6"
|
|
||||||
|
|
||||||
[package.dependencies]
|
|
||||||
coverage = {version = ">=5.2.1", extras = ["toml"]}
|
|
||||||
pytest = ">=4.6"
|
|
||||||
|
|
||||||
[package.extras]
|
|
||||||
testing = ["fields", "hunter", "process-tests", "six", "pytest-xdist", "virtualenv"]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "toml"
|
|
||||||
version = "0.10.2"
|
|
||||||
description = "Python Library for Tom's Obvious, Minimal Language"
|
|
||||||
category = "dev"
|
|
||||||
optional = false
|
|
||||||
python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "tomli"
|
|
||||||
version = "1.2.2"
|
|
||||||
description = "A lil' TOML parser"
|
|
||||||
category = "dev"
|
|
||||||
optional = false
|
|
||||||
python-versions = ">=3.6"
|
|
||||||
|
|
||||||
[metadata]
|
[metadata]
|
||||||
lock-version = "1.1"
|
lock-version = "1.1"
|
||||||
python-versions = "^3.9"
|
python-versions = "^3.9"
|
||||||
content-hash = "47104052627c5737e341ecfb58eb57c259f5baf5c99d7251dc860b331e18bee0"
|
content-hash = "ce2aa767160f871dd3652615ba0a0dceb7733d62eb8cb4665b87f30a562e3adf"
|
||||||
|
|
||||||
[metadata.files]
|
[metadata.files]
|
||||||
atomicwrites = [
|
|
||||||
{file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"},
|
|
||||||
{file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"},
|
|
||||||
]
|
|
||||||
attrs = [
|
|
||||||
{file = "attrs-21.2.0-py2.py3-none-any.whl", hash = "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1"},
|
|
||||||
{file = "attrs-21.2.0.tar.gz", hash = "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb"},
|
|
||||||
]
|
|
||||||
click = [
|
|
||||||
{file = "click-8.0.3-py3-none-any.whl", hash = "sha256:353f466495adaeb40b6b5f592f9f91cb22372351c84caeb068132442a4518ef3"},
|
|
||||||
{file = "click-8.0.3.tar.gz", hash = "sha256:410e932b050f5eed773c4cda94de75971c89cdb3155a72a0831139a79e5ecb5b"},
|
|
||||||
]
|
|
||||||
colorama = [
|
|
||||||
{file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"},
|
|
||||||
{file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"},
|
|
||||||
]
|
|
||||||
coverage = [
|
|
||||||
{file = "coverage-6.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6dbc1536e105adda7a6312c778f15aaabe583b0e9a0b0a324990334fd458c94b"},
|
|
||||||
{file = "coverage-6.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:174cf9b4bef0db2e8244f82059a5a72bd47e1d40e71c68ab055425172b16b7d0"},
|
|
||||||
{file = "coverage-6.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:92b8c845527eae547a2a6617d336adc56394050c3ed8a6918683646328fbb6da"},
|
|
||||||
{file = "coverage-6.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c7912d1526299cb04c88288e148c6c87c0df600eca76efd99d84396cfe00ef1d"},
|
|
||||||
{file = "coverage-6.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d5d2033d5db1d58ae2d62f095e1aefb6988af65b4b12cb8987af409587cc0739"},
|
|
||||||
{file = "coverage-6.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3feac4084291642165c3a0d9eaebedf19ffa505016c4d3db15bfe235718d4971"},
|
|
||||||
{file = "coverage-6.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:276651978c94a8c5672ea60a2656e95a3cce2a3f31e9fb2d5ebd4c215d095840"},
|
|
||||||
{file = "coverage-6.2-cp310-cp310-win32.whl", hash = "sha256:f506af4f27def639ba45789fa6fde45f9a217da0be05f8910458e4557eed020c"},
|
|
||||||
{file = "coverage-6.2-cp310-cp310-win_amd64.whl", hash = "sha256:3f7c17209eef285c86f819ff04a6d4cbee9b33ef05cbcaae4c0b4e8e06b3ec8f"},
|
|
||||||
{file = "coverage-6.2-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:13362889b2d46e8d9f97c421539c97c963e34031ab0cb89e8ca83a10cc71ac76"},
|
|
||||||
{file = "coverage-6.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:22e60a3ca5acba37d1d4a2ee66e051f5b0e1b9ac950b5b0cf4aa5366eda41d47"},
|
|
||||||
{file = "coverage-6.2-cp311-cp311-win_amd64.whl", hash = "sha256:b637c57fdb8be84e91fac60d9325a66a5981f8086c954ea2772efe28425eaf64"},
|
|
||||||
{file = "coverage-6.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f467bbb837691ab5a8ca359199d3429a11a01e6dfb3d9dcc676dc035ca93c0a9"},
|
|
||||||
{file = "coverage-6.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2641f803ee9f95b1f387f3e8f3bf28d83d9b69a39e9911e5bfee832bea75240d"},
|
|
||||||
{file = "coverage-6.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1219d760ccfafc03c0822ae2e06e3b1248a8e6d1a70928966bafc6838d3c9e48"},
|
|
||||||
{file = "coverage-6.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9a2b5b52be0a8626fcbffd7e689781bf8c2ac01613e77feda93d96184949a98e"},
|
|
||||||
{file = "coverage-6.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:8e2c35a4c1f269704e90888e56f794e2d9c0262fb0c1b1c8c4ee44d9b9e77b5d"},
|
|
||||||
{file = "coverage-6.2-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:5d6b09c972ce9200264c35a1d53d43ca55ef61836d9ec60f0d44273a31aa9f17"},
|
|
||||||
{file = "coverage-6.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:e3db840a4dee542e37e09f30859f1612da90e1c5239a6a2498c473183a50e781"},
|
|
||||||
{file = "coverage-6.2-cp36-cp36m-win32.whl", hash = "sha256:4e547122ca2d244f7c090fe3f4b5a5861255ff66b7ab6d98f44a0222aaf8671a"},
|
|
||||||
{file = "coverage-6.2-cp36-cp36m-win_amd64.whl", hash = "sha256:01774a2c2c729619760320270e42cd9e797427ecfddd32c2a7b639cdc481f3c0"},
|
|
||||||
{file = "coverage-6.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:fb8b8ee99b3fffe4fd86f4c81b35a6bf7e4462cba019997af2fe679365db0c49"},
|
|
||||||
{file = "coverage-6.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:619346d57c7126ae49ac95b11b0dc8e36c1dd49d148477461bb66c8cf13bb521"},
|
|
||||||
{file = "coverage-6.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0a7726f74ff63f41e95ed3a89fef002916c828bb5fcae83b505b49d81a066884"},
|
|
||||||
{file = "coverage-6.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cfd9386c1d6f13b37e05a91a8583e802f8059bebfccde61a418c5808dea6bbfa"},
|
|
||||||
{file = "coverage-6.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:17e6c11038d4ed6e8af1407d9e89a2904d573be29d51515f14262d7f10ef0a64"},
|
|
||||||
{file = "coverage-6.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c254b03032d5a06de049ce8bca8338a5185f07fb76600afff3c161e053d88617"},
|
|
||||||
{file = "coverage-6.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:dca38a21e4423f3edb821292e97cec7ad38086f84313462098568baedf4331f8"},
|
|
||||||
{file = "coverage-6.2-cp37-cp37m-win32.whl", hash = "sha256:600617008aa82032ddeace2535626d1bc212dfff32b43989539deda63b3f36e4"},
|
|
||||||
{file = "coverage-6.2-cp37-cp37m-win_amd64.whl", hash = "sha256:bf154ba7ee2fd613eb541c2bc03d3d9ac667080a737449d1a3fb342740eb1a74"},
|
|
||||||
{file = "coverage-6.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f9afb5b746781fc2abce26193d1c817b7eb0e11459510fba65d2bd77fe161d9e"},
|
|
||||||
{file = "coverage-6.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edcada2e24ed68f019175c2b2af2a8b481d3d084798b8c20d15d34f5c733fa58"},
|
|
||||||
{file = "coverage-6.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a9c8c4283e17690ff1a7427123ffb428ad6a52ed720d550e299e8291e33184dc"},
|
|
||||||
{file = "coverage-6.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f614fc9956d76d8a88a88bb41ddc12709caa755666f580af3a688899721efecd"},
|
|
||||||
{file = "coverage-6.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9365ed5cce5d0cf2c10afc6add145c5037d3148585b8ae0e77cc1efdd6aa2953"},
|
|
||||||
{file = "coverage-6.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8bdfe9ff3a4ea37d17f172ac0dff1e1c383aec17a636b9b35906babc9f0f5475"},
|
|
||||||
{file = "coverage-6.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:63c424e6f5b4ab1cf1e23a43b12f542b0ec2e54f99ec9f11b75382152981df57"},
|
|
||||||
{file = "coverage-6.2-cp38-cp38-win32.whl", hash = "sha256:49dbff64961bc9bdd2289a2bda6a3a5a331964ba5497f694e2cbd540d656dc1c"},
|
|
||||||
{file = "coverage-6.2-cp38-cp38-win_amd64.whl", hash = "sha256:9a29311bd6429be317c1f3fe4bc06c4c5ee45e2fa61b2a19d4d1d6111cb94af2"},
|
|
||||||
{file = "coverage-6.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:03b20e52b7d31be571c9c06b74746746d4eb82fc260e594dc662ed48145e9efd"},
|
|
||||||
{file = "coverage-6.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:215f8afcc02a24c2d9a10d3790b21054b58d71f4b3c6f055d4bb1b15cecce685"},
|
|
||||||
{file = "coverage-6.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a4bdeb0a52d1d04123b41d90a4390b096f3ef38eee35e11f0b22c2d031222c6c"},
|
|
||||||
{file = "coverage-6.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c332d8f8d448ded473b97fefe4a0983265af21917d8b0cdcb8bb06b2afe632c3"},
|
|
||||||
{file = "coverage-6.2-cp39-cp39-win32.whl", hash = "sha256:6e1394d24d5938e561fbeaa0cd3d356207579c28bd1792f25a068743f2d5b282"},
|
|
||||||
{file = "coverage-6.2-cp39-cp39-win_amd64.whl", hash = "sha256:86f2e78b1eff847609b1ca8050c9e1fa3bd44ce755b2ec30e70f2d3ba3844644"},
|
|
||||||
{file = "coverage-6.2-pp36.pp37.pp38-none-any.whl", hash = "sha256:5829192582c0ec8ca4a2532407bc14c2f338d9878a10442f5d03804a95fac9de"},
|
|
||||||
{file = "coverage-6.2.tar.gz", hash = "sha256:e2cad8093172b7d1595b4ad66f24270808658e11acf43a8f95b41276162eb5b8"},
|
|
||||||
]
|
|
||||||
iniconfig = [
|
|
||||||
{file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"},
|
|
||||||
{file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"},
|
|
||||||
]
|
|
||||||
packaging = [
|
|
||||||
{file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"},
|
|
||||||
{file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"},
|
|
||||||
]
|
|
||||||
pluggy = [
|
|
||||||
{file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"},
|
|
||||||
{file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"},
|
|
||||||
]
|
|
||||||
py = [
|
|
||||||
{file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"},
|
|
||||||
{file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"},
|
|
||||||
]
|
|
||||||
pyparsing = [
|
|
||||||
{file = "pyparsing-3.0.6-py3-none-any.whl", hash = "sha256:04ff808a5b90911829c55c4e26f75fa5ca8a2f5f36aa3a51f68e27033341d3e4"},
|
|
||||||
{file = "pyparsing-3.0.6.tar.gz", hash = "sha256:d9bdec0013ef1eb5a84ab39a3b3868911598afa494f5faa038647101504e2b81"},
|
|
||||||
]
|
|
||||||
pytest = [
|
|
||||||
{file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"},
|
|
||||||
{file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"},
|
|
||||||
]
|
|
||||||
pytest-cov = [
|
|
||||||
{file = "pytest-cov-3.0.0.tar.gz", hash = "sha256:e7f0f5b1617d2210a2cabc266dfe2f4c75a8d32fb89eafb7ad9d06f6d076d470"},
|
|
||||||
{file = "pytest_cov-3.0.0-py3-none-any.whl", hash = "sha256:578d5d15ac4a25e5f961c938b85a05b09fdaae9deef3bb6de9a6e766622ca7a6"},
|
|
||||||
]
|
|
||||||
toml = [
|
|
||||||
{file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"},
|
|
||||||
{file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"},
|
|
||||||
]
|
|
||||||
tomli = [
|
|
||||||
{file = "tomli-1.2.2-py3-none-any.whl", hash = "sha256:f04066f68f5554911363063a30b108d2b5a5b1a010aa8b6132af78489fe3aade"},
|
|
||||||
{file = "tomli-1.2.2.tar.gz", hash = "sha256:c6ce0015eb38820eaf32b5db832dbc26deb3dd427bd5f6556cf0acac2c214fee"},
|
|
||||||
]
|
|
||||||
|
|
|
@ -1,36 +1,18 @@
|
||||||
[tool.poetry]
|
[tool.poetry]
|
||||||
name = "habitmove"
|
name = "habitmove"
|
||||||
version = "0.4.0"
|
version = "0.4"
|
||||||
description = "migrate nomie data to loop habits tracker"
|
description = "migrate nomie data to loop habits tracker"
|
||||||
authors = ["Marty Oehme <marty.oehme@gmail.com>"]
|
authors = ["Marty Oehme <marty.oehme@gmail.com>"]
|
||||||
packages = [
|
|
||||||
{ include = "habitmove", from = "src"},
|
|
||||||
]
|
|
||||||
|
|
||||||
[tool.poetry.dependencies]
|
[tool.poetry.dependencies]
|
||||||
importlib-metadata = {version = "^1.0", python = "<3.8"}
|
|
||||||
python = "^3.9"
|
python = "^3.9"
|
||||||
click = "^8.0"
|
|
||||||
|
|
||||||
[tool.poetry.dev-dependencies]
|
[tool.poetry.dev-dependencies]
|
||||||
pytest = "^6.2"
|
|
||||||
coverage = {extras = ["toml"], version = "^6.2"}
|
|
||||||
pytest-cov = "^3.0.0"
|
|
||||||
|
|
||||||
[tool.poetry.scripts]
|
[tool.poetry.scripts]
|
||||||
habitmove = "habitmove.cli:main"
|
habitmove = "run:main"
|
||||||
|
|
||||||
[tool.coverage.paths]
|
|
||||||
source = ["src", "*/site-packages"]
|
|
||||||
|
|
||||||
[tool.coverage.run]
|
|
||||||
branch = true
|
|
||||||
source = ["habitmove"]
|
|
||||||
|
|
||||||
[tool.coverage.report]
|
|
||||||
show_missing = true
|
|
||||||
# fail_under = 80 # if we want pytest to automatically fail if not enough tests supplied
|
|
||||||
|
|
||||||
[build-system]
|
[build-system]
|
||||||
requires = ["poetry-core>=1.0.0"]
|
requires = ["poetry-core>=1.0.0"]
|
||||||
build-backend = "poetry.core.masonry.api"
|
build-backend = "poetry.core.masonry.api"
|
||||||
|
|
||||||
|
|
|
@ -5,8 +5,8 @@ import habitmove.repetitions as rep
|
||||||
import habitmove.nomie as nomie
|
import habitmove.nomie as nomie
|
||||||
from habitmove.nomiedata import NomieImport
|
from habitmove.nomiedata import NomieImport
|
||||||
|
|
||||||
import click
|
|
||||||
from . import __version__
|
import sys
|
||||||
|
|
||||||
|
|
||||||
def migrate(data: NomieImport):
|
def migrate(data: NomieImport):
|
||||||
|
@ -25,11 +25,9 @@ def migrate(data: NomieImport):
|
||||||
db.close()
|
db.close()
|
||||||
|
|
||||||
|
|
||||||
@click.command()
|
def main():
|
||||||
@click.version_option(version=__version__)
|
file = sys.argv[1]
|
||||||
@click.argument("inputfile")
|
data = nomie.get_data(file)
|
||||||
def main(inputfile):
|
|
||||||
data = nomie.get_data(inputfile)
|
|
||||||
migrate(data)
|
migrate(data)
|
||||||
|
|
||||||
|
|
|
@ -1,9 +0,0 @@
|
||||||
# init.py
|
|
||||||
import sys
|
|
||||||
|
|
||||||
if sys.version_info >= (3, 8):
|
|
||||||
from importlib.metadata import version as metadata_version
|
|
||||||
else:
|
|
||||||
from importlib_metadata import version as metadata_version
|
|
||||||
|
|
||||||
__version__ = str(metadata_version(__name__))
|
|
|
@ -1,15 +0,0 @@
|
||||||
import click.testing
|
|
||||||
import pytest
|
|
||||||
|
|
||||||
from habitmove import cli
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
|
||||||
def runner():
|
|
||||||
return click.testing.CliRunner()
|
|
||||||
|
|
||||||
|
|
||||||
def test_cli_fails_without_file(runner):
|
|
||||||
result = runner.invoke(cli.main)
|
|
||||||
assert result.exit_code == 2
|
|
||||||
assert "Missing argument" in result.output
|
|
|
@ -1,66 +0,0 @@
|
||||||
import pytest
|
|
||||||
from habitmove import loopdata, nomiedata
|
|
||||||
from habitmove import habits
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
|
||||||
def trackerlist():
|
|
||||||
return [
|
|
||||||
nomiedata.Tracker(
|
|
||||||
hidden=False,
|
|
||||||
score=-1,
|
|
||||||
tag="testtrack",
|
|
||||||
emoji="🧪",
|
|
||||||
label="Testing",
|
|
||||||
uom="kilotest",
|
|
||||||
id="12345",
|
|
||||||
),
|
|
||||||
nomiedata.Tracker(
|
|
||||||
hidden=False,
|
|
||||||
tag="testtrack",
|
|
||||||
emoji="🧪",
|
|
||||||
label="Testing",
|
|
||||||
id="54321",
|
|
||||||
one_tap=False,
|
|
||||||
color="#FF0000",
|
|
||||||
ignore_zeros=False,
|
|
||||||
math="mean",
|
|
||||||
type="range",
|
|
||||||
uom="megatest",
|
|
||||||
min=0,
|
|
||||||
max=10,
|
|
||||||
goal=6,
|
|
||||||
default=2,
|
|
||||||
score=1,
|
|
||||||
),
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
def test_simple_habit_transform_from_tracker(trackerlist):
|
|
||||||
sut = trackerlist[0]
|
|
||||||
assert habits.trackers_to_habits([sut]) == [
|
|
||||||
loopdata.Habit(
|
|
||||||
name="🧪 Testing",
|
|
||||||
description="testtrack",
|
|
||||||
unit="kilotest",
|
|
||||||
uuid="12345",
|
|
||||||
archived=False,
|
|
||||||
color=0,
|
|
||||||
)
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
def test_range_habit_transform_from_tracker(trackerlist):
|
|
||||||
sut = trackerlist[1]
|
|
||||||
assert habits.trackers_to_habits([sut]) == [
|
|
||||||
loopdata.Habit(
|
|
||||||
name="🧪 Testing",
|
|
||||||
description="testtrack",
|
|
||||||
unit="megatest",
|
|
||||||
uuid="54321",
|
|
||||||
archived=False,
|
|
||||||
color=11,
|
|
||||||
type=1,
|
|
||||||
target_value=6,
|
|
||||||
)
|
|
||||||
]
|
|
|
@ -1,6 +0,0 @@
|
||||||
from habitmove.loopdata import Habit
|
|
||||||
|
|
||||||
|
|
||||||
def test_uuid_sets_automatically():
|
|
||||||
sut = Habit(name="testhabit")
|
|
||||||
assert sut.uuid
|
|
|
@ -1,18 +0,0 @@
|
||||||
from habitmove import nomiedata
|
|
||||||
|
|
||||||
|
|
||||||
def test_score_numerical_becomes_int():
|
|
||||||
sut = nomiedata.Tracker(label="Int checking", tag="isint", id="1337", score="-1")
|
|
||||||
assert type(sut.score) == int
|
|
||||||
|
|
||||||
|
|
||||||
def test_score_invalid_int_stays_string():
|
|
||||||
sut = nomiedata.Tracker(label="Int checking", tag="isint", id="1337", score="-1.3")
|
|
||||||
assert type(sut.score) == str
|
|
||||||
|
|
||||||
|
|
||||||
def test_score_string_stays_string():
|
|
||||||
sut = nomiedata.Tracker(
|
|
||||||
label="Int checking", tag="isint", id="1337", score="custom"
|
|
||||||
)
|
|
||||||
assert type(sut.score) == str
|
|
Loading…
Reference in a new issue