Skip to content

Commit

Permalink
lots of fixes from migrating to namespace package
Browse files Browse the repository at this point in the history
remove overlapping tests that I dont maintain code
for anymore (test against the my HPI-to-master repo)

do mypy -p my instead of mypy ./my so changes are
picked up, remove MYPY_PATH so it checks this repo
instead of my configuration

fix lots of mypy errors, including pushing
tons of new versions for all my packages, because
I didn't include py.typed in the package data

for files I don't maintain, dont import items
from core using relative imports
(see karlicoss/HPI#102)
for discussion
  • Loading branch information
seanbreckenridge committed Mar 15, 2021
1 parent 12dd614 commit a60da92
Show file tree
Hide file tree
Showing 44 changed files with 298 additions and 1,262 deletions.
2 changes: 1 addition & 1 deletion lint
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ main() {
pytest "$@" || prompt ''
cleanup_firefox
echo "Running mypy..."
mypy --color-output --ignore-missing-imports ./my || prompt ''
mypy --color-output --ignore-missing-imports -p my || prompt ''
echo "Running shellcheck..."
shellcheck_scripts
# format everything in the repo
Expand Down
28 changes: 10 additions & 18 deletions my/apple.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,40 +3,32 @@
"""

# see https://github.com/seanbreckenridge/dotfiles/blob/master/.config/my/my/config/__init__.py for an example
from my.config import apple as user_config

from dataclasses import dataclass
from .core import PathIsh
from my.config import apple as user_config # type: ignore[attr-defined]
from my.core import PathIsh, dataclass


@dataclass
class apple(user_config):
gdpr_dir: PathIsh # path to unpacked GDPR archive

class config(user_config):
# path to unpacked GDPR archive
gdpr_dir: PathIsh

from .core.cfg import make_config

config = make_config(apple)

import os
import json
from datetime import datetime, timezone
from pathlib import Path
from typing import Iterator, Dict, Any, NamedTuple, Union, Optional

from lxml import etree
from lxml import etree # type: ignore[import]
from more_itertools import sliced, first

from .core.error import Res
from .core import Stats
from my.core import Stats, Res, LazyLogger
from my.core.common import mcachew
from my.core.cachew import cache_dir

from .core.common import LazyLogger, mcachew
from .core.cachew import cache_dir

logger = LazyLogger(__name__, level="warning")

Json = Dict[str, Any]


class Game(NamedTuple):
name: str
Expand Down Expand Up @@ -122,7 +114,7 @@ def events() -> Results:


def stats() -> Stats:
from .core import stat
from my.core import stat

return {
**stat(events),
Expand Down
21 changes: 6 additions & 15 deletions my/battery.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,31 +5,22 @@
"""

# see https://github.com/seanbreckenridge/dotfiles/blob/master/.config/my/my/config/__init__.py for an example
from my.config import battery as user_config

from dataclasses import dataclass

from .core import Paths
from my.config import battery as user_config # type: ignore[attr-defined]
from my.core import Paths, dataclass


@dataclass
class battery(user_config):
class config(user_config):
# path/glob to the battery logfile
export_path: Paths


from .core.cfg import make_config

config = make_config(battery)

#######

import csv
from typing import Sequence
from pathlib import Path

from .core import get_files, warn_if_empty, Stats
from .core.common import listify
from my.core import get_files, warn_if_empty, Stats
from my.core.common import listify
from .utils.time import parse_datetime_sec


Expand Down Expand Up @@ -85,6 +76,6 @@ def _parse_file(histfile: Path) -> Results:


def stats() -> Stats:
from .core import stat
from my.core import stat

return {**stat(history)}
25 changes: 9 additions & 16 deletions my/body_log.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,33 +4,26 @@
Interactive prompts to log random things, like my current weight
"""

import os
import sys
from pathlib import Path
from itertools import chain
from dataclasses import dataclass

from .core import PathIsh

# https://github.com/seanbreckenridge/dotfiles/blob/master/.config/my/my/config/__init__.py
from my.config import body as user_config
from my.config import body as user_config # type: ignore[attr-defined]
from my.core import PathIsh, dataclass


@dataclass
class upkeep(user_config):
class config(user_config):
datadir: PathIsh


from .core.cfg import make_config

config = make_config(upkeep)

import os
import sys
from pathlib import Path
from itertools import chain
from datetime import datetime
from typing import NamedTuple, Iterator, Sequence

from autotui.shortcuts import load_prompt_and_writeback, load_from

from .core import Stats, get_files
from my.core import Stats, get_files


# creates unique datafiles for each platform
Expand Down Expand Up @@ -77,7 +70,7 @@ def prompt(nt: NamedTuple):


def stats() -> Stats:
from .core import stat
from my.core import stat

return {
**stat(shower),
Expand Down
24 changes: 8 additions & 16 deletions my/browsing.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,38 +3,30 @@
"""

# see https://github.com/seanbreckenridge/dotfiles/blob/master/.config/my/my/config/__init__.py for an example
from my.config import firefox as user_config
from my.config import firefox as user_config # type: ignore[attr-defined]

from dataclasses import dataclass

from .core import Paths
from my.core import Paths, dataclass


@dataclass
class firefox(user_config):
class config(user_config):
# path[s]/glob to the exported firefox history sqlite files
export_path: Paths


from .core.cfg import make_config

config = make_config(firefox)

#######

import os
import tempfile
from pathlib import Path
from typing import Iterator, Sequence, Optional

from .core import Stats
from .core.common import listify, get_files
from my.core import Stats, get_files
from my.core.common import listify


# monkey patch ffexport logs
if "HPI_LOGS" in os.environ:
from logzero import setup_logger
from .core.logging import mklevel
from logzero import setup_logger # type: ignore[import]
from my.core.logging import mklevel
import ffexport.log

ffexport.log.logger = setup_logger(
Expand Down Expand Up @@ -79,6 +71,6 @@ def history(from_paths=inputs, tmp_dir: Optional[str] = None) -> Results:


def stats() -> Stats:
from .core import stat
from my.core import stat

return {**stat(history)}
33 changes: 14 additions & 19 deletions my/discord.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,37 +5,32 @@
"git+https://github.com/seanbreckenridge/discord_data",
]

from .core.common import PathIsh

from my.config import discord as uconfig
from dataclasses import dataclass
from pathlib import Path

from my.config import discord as user_config # type: ignore[attr-defined]
from my.core import PathIsh, dataclass


@dataclass
class discord(uconfig):
class config(user_config):

# path[s]/glob to the exported JSON data
export_path: PathIsh

@property
def latest(self) -> Path:
# TODO: replace with inputs()?
@classmethod
def latest(cls) -> Path:
non_hidden = [
p for p in get_files(self.export_path) if not p.name.startswith(".")
p for p in get_files(cls.export_path) if not p.name.startswith(".")
]
return sorted(non_hidden, key=lambda p: p.stat().st_ctime)[-1]


from .core.cfg import make_config


config = make_config(discord)


from typing import Iterator
from datetime import datetime, timezone
from .core.common import get_files, LazyLogger, Stats, mcachew
from .core.cachew import cache_dir
from my.core.common import get_files, LazyLogger, Stats, mcachew
from my.core.cachew import cache_dir

from discord_data import parse_activity, parse_messages
from discord_data.model import Message, Json
Expand All @@ -45,14 +40,14 @@ def latest(self) -> Path:


# reduces time by half, after cache is created
@mcachew(depends_on=lambda: config.latest, cache_path=cache_dir(), logger=logger)
@mcachew(depends_on=lambda: config.latest(), cache_path=cache_dir(), logger=logger)
def messages() -> Iterator[Message]:
yield from parse_messages(config.latest / "messages")
yield from parse_messages(config.latest() / "messages")


# not worth putting behind cachew, just loading Json
def activity() -> Iterator[Json]:
yield from parse_activity(config.latest / "activity", logger=logger)
yield from parse_activity(config.latest() / "activity", logger=logger)


def parse_activity_date(s: str) -> datetime:
Expand All @@ -63,7 +58,7 @@ def parse_activity_date(s: str) -> datetime:


def stats() -> Stats:
from .core import stat
from my.core import stat

return {
**stat(messages),
Expand Down
56 changes: 24 additions & 32 deletions my/facebook.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,21 +3,15 @@
"""

# see https://github.com/seanbreckenridge/dotfiles/blob/master/.config/my/my/config/__init__.py for an example
from my.config import facebook as user_config

from dataclasses import dataclass
from .core import PathIsh
from my.config import facebook as user_config # type: ignore[attr-defined]
from my.core import PathIsh, dataclass


@dataclass
class facebook(user_config):
class config(user_config):
gdpr_dir: PathIsh # path to unpacked GDPR archive


from .core.cfg import make_config

config = make_config(facebook)

import os
import json
from datetime import datetime
Expand All @@ -26,16 +20,12 @@ class facebook(user_config):
from typing import Iterator, Dict, Any, NamedTuple, Union, Optional, List


from .core import get_files, Stats
from .core.error import Res
from my.core import get_files, Stats, Res, Json, LazyLogger
from .utils.time import parse_datetime_sec
from .core.common import LazyLogger


logger = LazyLogger(__name__, level="warning")

Json = Dict[str, Any]


class Contact(NamedTuple):
name: str
Expand Down Expand Up @@ -207,14 +197,6 @@ def events() -> Results:
yield from handler(j)


def stats() -> Stats:
from .core import stat

return {
**stat(events),
}


def _parse_address_book(d: Dict) -> Iterator[Contact]:
# remove top-level address book name
for addr_book_top in d.values():
Expand Down Expand Up @@ -344,16 +326,18 @@ def _parse_conversation(
d: Dict,
) -> Iterator[Res[Conversation]]: # will only return 1 convo
participants: List[str] = [p["name"] for p in d["participants"]]
messages = list(_parse_messages_in_conversation(d["messages"]))
# propagate up exception if one exists
try:
yield next(filter(lambda m: isinstance(m, Exception), messages))
except StopIteration: # there was no error found out
yield Conversation(
participants=participants,
title=d["title"],
messages=messages,
)
good_messages: List[Message] = []
for m in _parse_messages_in_conversation(d["messages"]):
# propagate up exception if one exists
if isinstance(m, Exception):
yield m
else:
good_messages.append(m)
yield Conversation(
participants=participants,
title=d["title"],
messages=good_messages,
)


def _parse_messages_in_conversation(messages: List[Dict]) -> Iterator[Res[Message]]:
Expand Down Expand Up @@ -557,3 +541,11 @@ def _parse_admin_records(d: Dict) -> Iterator[AdminAction]:
ip=s["ip_address"],
user_agent=s["user_agent"],
)


def stats() -> Stats:
from my.core import stat

return {
**stat(events),
}
Loading

0 comments on commit a60da92

Please sign in to comment.