Skip to content

Commit

Permalink
Refactored path expansion calls into a new path.py file
Browse files Browse the repository at this point in the history
This also fixed bugs with relative journal and template paths.
  • Loading branch information
apainintheneck committed May 14, 2022
1 parent e6ed64a commit 7a86bbc
Show file tree
Hide file tree
Showing 7 changed files with 91 additions and 21 deletions.
3 changes: 2 additions & 1 deletion jrnl/Journal.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
from . import Entry
from . import time
from .prompt import yesno
from .path import expand_path


class Tag:
Expand Down Expand Up @@ -404,7 +405,7 @@ def open_journal(journal_name, config, legacy=False):
backwards compatibility with jrnl 1.x
"""
config = config.copy()
config["journal"] = os.path.expanduser(os.path.expandvars(config["journal"]))
config["journal"] = expand_path(config["journal"])

if os.path.isdir(config["journal"]):
if config["encrypt"]:
Expand Down
9 changes: 3 additions & 6 deletions jrnl/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
from .color import ERROR_COLOR
from .color import RESET_COLOR
from .output import list_journals
from .path import home_dir

# Constants
DEFAULT_CONFIG_NAME = "jrnl.yaml"
Expand Down Expand Up @@ -83,9 +84,7 @@ def get_config_path():
),
)

return os.path.join(
config_directory_path or os.path.expanduser("~"), DEFAULT_CONFIG_NAME
)
return os.path.join(config_directory_path or home_dir(), DEFAULT_CONFIG_NAME)


def get_default_config():
Expand All @@ -112,9 +111,7 @@ def get_default_config():


def get_default_journal_path():
journal_data_path = xdg.BaseDirectory.save_data_path(
XDG_RESOURCE
) or os.path.expanduser("~")
journal_data_path = xdg.BaseDirectory.save_data_path(XDG_RESOURCE) or home_dir()
return os.path.join(journal_data_path, DEFAULT_JOURNAL_NAME)


Expand Down
13 changes: 7 additions & 6 deletions jrnl/install.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@
import os
import sys

from .path import home_dir
from .path import absolute_path
from .path import expand_path
from .config import DEFAULT_JOURNAL_KEY
from .config import get_config_path
from .config import get_default_config
Expand Down Expand Up @@ -45,7 +48,7 @@ def find_default_config():
config_path = (
get_config_path()
if os.path.exists(get_config_path())
else os.path.join(os.path.expanduser("~"), ".jrnl_config")
else os.path.join(home_dir(), ".jrnl_config")
)
return config_path

Expand Down Expand Up @@ -101,11 +104,9 @@ def install():
# Where to create the journal?
default_journal_path = get_default_journal_path()
path_query = f"Path to your journal file (leave blank for {default_journal_path}): "
journal_path = os.path.abspath(input(path_query).strip() or default_journal_path)
journal_path = absolute_path(input(path_query).strip() or default_journal_path)
default_config = get_default_config()
default_config["journals"][DEFAULT_JOURNAL_KEY] = os.path.expanduser(
os.path.expandvars(journal_path)
)
default_config["journals"][DEFAULT_JOURNAL_KEY] = journal_path

# If the folder doesn't exist, create it
path = os.path.split(default_config["journals"][DEFAULT_JOURNAL_KEY])[0]
Expand Down Expand Up @@ -138,7 +139,7 @@ def _initialize_autocomplete():


def _autocomplete_path(text, state):
expansions = glob.glob(os.path.expanduser(os.path.expandvars(text)) + "*")
expansions = glob.glob(expand_path(text) + "*")
expansions = [e + "/" if os.path.isdir(e) else e for e in expansions]
expansions.append(None)
return expansions[state]
7 changes: 5 additions & 2 deletions jrnl/jrnl.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
from .editor import get_text_from_stdin
from . import time
from .override import apply_overrides
from .path import expand_path

from jrnl.exception import JrnlException
from jrnl.messages import Message
Expand Down Expand Up @@ -195,16 +196,18 @@ def _get_editor_template(config, **kwargs):
logging.debug("Write mode: no template configured")
return ""

template_path = expand_path(config["template"])

try:
template = open(config["template"]).read()
template = open(template_path).read()
logging.debug("Write mode: template loaded: %s", template)
except OSError:
logging.error("Write mode: template not loaded")
raise JrnlException(
Message(
MsgText.CantReadTemplate,
MsgType.ERROR,
{"template": config["template"]},
{"template": template_path},
)
)

Expand Down
13 changes: 13 additions & 0 deletions jrnl/path.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import os.path


def home_dir():
return os.path.expanduser("~")


def expand_path(path):
return os.path.expanduser(os.path.expandvars(path))


def absolute_path(path):
return os.path.abspath(expand_path(path))
11 changes: 5 additions & 6 deletions jrnl/upgrade.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
from .config import load_config
from .config import scope_config
from .prompt import yesno
from .path import expand_path

from jrnl.output import print_msg

Expand All @@ -22,7 +23,7 @@

def backup(filename, binary=False):
print(f" Created a backup at {filename}.backup", file=sys.stderr)
filename = os.path.expanduser(os.path.expandvars(filename))
filename = expand_path(filename)

try:
with open(filename, "rb" if binary else "r") as original:
Expand Down Expand Up @@ -72,15 +73,13 @@ def upgrade_jrnl(config_path):

for journal_name, journal_conf in config["journals"].items():
if isinstance(journal_conf, dict):
path = journal_conf.get("journal")
path = expand_path(journal_conf.get("journal"))
encrypt = journal_conf.get("encrypt")
else:
encrypt = config.get("encrypt")
path = journal_conf
path = expand_path(journal_conf)

if os.path.exists(os.path.expanduser(path)):
path = os.path.expanduser(path)
else:
if not os.path.exists(path):
print(f"\nError: {path} does not exist.")
continue

Expand Down
56 changes: 56 additions & 0 deletions tests/unit/test_path.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
import pytest
from unittest import mock
from os import path

from jrnl.path import home_dir
from jrnl.path import expand_path
from jrnl.path import absolute_path


@pytest.fixture
def home_dir_str(monkeypatch):
username = "username"
monkeypatch.setenv("USERPROFILE", username) # for windows
monkeypatch.setenv("HOME", username) # for *nix
return username


@pytest.fixture
def expand_path_test_data(monkeypatch, home_dir_str):
monkeypatch.setenv("VAR", "var")
return [
["~", home_dir_str],
[path.join("~", "${VAR}", "$VAR"), path.join(home_dir_str, "var", "var")],
]


def cwd():
"""Used to mock os.getcwd"""
return "currentdir"


@pytest.fixture
def absolute_path_test_data(expand_path_test_data):
test_data = [
[".", cwd()],
[path.join(".", "dir"), path.join(cwd(), "dir")],
[".dot_file", path.join(cwd(), ".dot_file")],
]
for inpath, outpath in expand_path_test_data:
test_data.append([inpath, path.join(cwd(), outpath)])
return test_data


def test_home_dir(home_dir_str):
assert home_dir() == home_dir_str


def test_expand_path(expand_path_test_data):
for inpath, outpath in expand_path_test_data:
assert expand_path(inpath) == outpath


def test_absolute_path(absolute_path_test_data):
with mock.patch("os.getcwd", cwd):
for inpath, outpath in absolute_path_test_data:
assert absolute_path(inpath) == outpath

0 comments on commit 7a86bbc

Please sign in to comment.