mirror of
https://github.com/jrnl-org/jrnl.git
synced 2025-05-18 03:58:32 +02:00
* Update and modularize exception handling cc #1024 #1141 - Stack traces are no longer shown to users unless the --debug flag is being used - Errors, warnings, and other messages contain color as needed - Converted error messages to Enum - Adds print_msg function to centralize output (this should replace all other output in other modules) Co-authored-by: Micah Jerome Ellison <micah.jerome.ellison@gmail.com> * format with black * add message to catch-all exception block * Unskip some tests (#1399) * remove skip_editor test and tag * remove useless test * unskip blank input test * formatting * rename test so it doesn't overwrite other test * unskip some dayone tests that now work * Bump ipython from 7.28.0 to 7.31.1 (#1401) Bumps [ipython](https://github.com/ipython/ipython) from 7.28.0 to 7.31.1. - [Release notes](https://github.com/ipython/ipython/releases) - [Commits](https://github.com/ipython/ipython/compare/7.28.0...7.31.1) --- updated-dependencies: - dependency-name: ipython dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Update changelog [ci skip] * Bump asteval from 0.9.25 to 0.9.26 (#1400) Bumps [asteval](https://github.com/newville/asteval) from 0.9.25 to 0.9.26. - [Release notes](https://github.com/newville/asteval/releases) - [Commits](https://github.com/newville/asteval/compare/0.9.25...0.9.26) --- updated-dependencies: - dependency-name: asteval dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Update changelog [ci skip] * Bump black from 21.12b0 to 22.1.0 (#1404) * Bump black from 21.12b0 to 22.1.0 Bumps [black](https://github.com/psf/black) from 21.12b0 to 22.1.0. - [Release notes](https://github.com/psf/black/releases) - [Changelog](https://github.com/psf/black/blob/main/CHANGES.md) - [Commits](https://github.com/psf/black/commits/22.1.0) --- updated-dependencies: - dependency-name: black dependency-type: direct:development ... Signed-off-by: dependabot[bot] <support@github.com> * Run make format Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Micah Jerome Ellison <micah.jerome.ellison@gmail.com> * Update changelog [ci skip] * Add reference documentation to docs site and separate out "Tips and Tricks" and "External Editors" from "Recipes" (#1332) * First draft of command line reference, mostly pulled from help screen * Add first draft of config file reference, mostly pulled from advanced.md * Clean up config file doc for readability * Add --config-file and remove examples from CLI reference * Add warning about time zone in timeformat * More small changes, and adding template config keyword * Cleaning up and re-ordering config file reference * Clean up reference and anything else from advanced documentation that can live elsewhere and linking to config file reference wherever config file is mentioned * Fix syntax highlighting in command line reference, clean up content a bit, include --diagnostic * Mention version config key * Apply minor changes suggested in PR review * Rename "recipes" to "Tips and Tricks", pull "External Editors" out of it into its own page, and redirect old recipes link to tips-and-tricks * Revert broken mkdocs-redirects usage from last commit * Update changelog [ci skip] * Add --co alias for --config-override (#1397) * Add hash as a default tag symbol (#1398) * Update changelog [ci skip] * Increment version to v2.8.4-beta2 * Update changelog [ci skip] * Increment version to v2.8.4 * Update changelog [ci skip] * Bump pytest from 6.2.5 to 7.0.0 (#1407) Bumps [pytest](https://github.com/pytest-dev/pytest) from 6.2.5 to 7.0.0. - [Release notes](https://github.com/pytest-dev/pytest/releases) - [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst) - [Commits](https://github.com/pytest-dev/pytest/compare/6.2.5...7.0.0) --- updated-dependencies: - dependency-name: pytest dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Update changelog [ci skip] * Drop support for Python 3.7 and 3.8 (#1412) * Remove Python 3.7 and 3.8 from github actions workflows * Update lockfile after running poetry update a couple times * Update poetry lock * Remove Python 3.7 and 3.8 from pyproject.toml and run poetry lock * Update changelog [ci skip] * Tidy up git ignore (#1414) * cleaned gitignore and add comments * removed colon for readbility * alphabetize files in sections Co-authored-by: nelnog <nel.nogales@gmail.com> * fix behavior that was confusing pytest * update test to match new message * whitespace change * clean up error for manually stopping the inline editor * udpate error to use new exception handling * move some exceptions and errors to the new exception handling * add line breaks to keyboard interrupt so it looks more like other exceptions * add handling for exceptions that happen earlier in the flow * add new 'NothingToDelete' error to replace old behavior * get rid of old exception * add new exception handling to 'nothing saved to file' errors * move exception for no editor configured into new handling * move exception for no alt config to new handling * get rid of old exception handling for encrypted journal * Move error for too many wrong passwords into new handling * fix merge errors * replace sys.exit call with new exception handling * replace sys.exit call with new exception handling * replace sys.exit call with new exception handling * reformat with black * clean up old code * clean up old code * clean up linting issue * update uncaught exception for new handling * update test * fix mangled lock file Co-authored-by: Micah Jerome Ellison <micah.jerome.ellison@gmail.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Jrnl Bot <jrnl.bot@gmail.com> Co-authored-by: Nelson <35701520+nelnog@users.noreply.github.com> Co-authored-by: nelnog <nel.nogales@gmail.com>
140 lines
4.3 KiB
Python
140 lines
4.3 KiB
Python
# Copyright (C) 2012-2021 jrnl contributors
|
|
# License: https://www.gnu.org/licenses/gpl-3.0.html
|
|
|
|
|
|
import glob
|
|
import logging
|
|
import os
|
|
import sys
|
|
|
|
from .config import DEFAULT_JOURNAL_KEY
|
|
from .config import get_config_path
|
|
from .config import get_default_config
|
|
from .config import get_default_journal_path
|
|
from .config import load_config
|
|
from .config import save_config
|
|
from .config import verify_config_colors
|
|
from .prompt import yesno
|
|
from .upgrade import is_old_version
|
|
|
|
from jrnl.exception import JrnlException
|
|
from jrnl.messages import Message
|
|
from jrnl.messages import MsgText
|
|
from jrnl.messages import MsgType
|
|
|
|
|
|
def upgrade_config(config_data, alt_config_path=None):
|
|
"""Checks if there are keys missing in a given config dict, and if so, updates the config file accordingly.
|
|
This essentially automatically ports jrnl installations if new config parameters are introduced in later
|
|
versions.
|
|
Supply alt_config_path if using an alternate config through --config-file."""
|
|
default_config = get_default_config()
|
|
missing_keys = set(default_config).difference(config_data)
|
|
if missing_keys:
|
|
for key in missing_keys:
|
|
config_data[key] = default_config[key]
|
|
save_config(config_data, alt_config_path)
|
|
config_path = alt_config_path if alt_config_path else get_config_path()
|
|
print(
|
|
f"[Configuration updated to newest version at {config_path}]",
|
|
file=sys.stderr,
|
|
)
|
|
|
|
|
|
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")
|
|
)
|
|
return config_path
|
|
|
|
|
|
def find_alt_config(alt_config):
|
|
if not os.path.exists(alt_config):
|
|
raise JrnlException(
|
|
Message(
|
|
MsgText.AltConfigNotFound, MsgType.ERROR, {"config_file": alt_config}
|
|
)
|
|
)
|
|
|
|
return alt_config
|
|
|
|
|
|
def load_or_install_jrnl(alt_config_path):
|
|
"""
|
|
If jrnl is already installed, loads and returns a default config object.
|
|
If alternate config is specified via --config-file flag, it will be used.
|
|
Else, perform various prompts to install jrnl.
|
|
"""
|
|
config_path = (
|
|
find_alt_config(alt_config_path) if alt_config_path else find_default_config()
|
|
)
|
|
|
|
if os.path.exists(config_path):
|
|
logging.debug("Reading configuration from file %s", config_path)
|
|
config = load_config(config_path)
|
|
|
|
if is_old_version(config_path):
|
|
from jrnl import upgrade
|
|
|
|
upgrade.upgrade_jrnl(config_path)
|
|
|
|
upgrade_config(config, alt_config_path)
|
|
verify_config_colors(config)
|
|
|
|
else:
|
|
logging.debug("Configuration file not found, installing jrnl...")
|
|
config = install()
|
|
|
|
logging.debug('Using configuration "%s"', config)
|
|
return config
|
|
|
|
|
|
def install():
|
|
_initialize_autocomplete()
|
|
|
|
# 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)
|
|
default_config = get_default_config()
|
|
default_config["journals"][DEFAULT_JOURNAL_KEY] = os.path.expanduser(
|
|
os.path.expandvars(journal_path)
|
|
)
|
|
|
|
# If the folder doesn't exist, create it
|
|
path = os.path.split(default_config["journals"][DEFAULT_JOURNAL_KEY])[0]
|
|
try:
|
|
os.makedirs(path)
|
|
except OSError:
|
|
pass
|
|
|
|
# Encrypt it?
|
|
encrypt = yesno(
|
|
"Do you want to encrypt your journal? You can always change this later",
|
|
default=False,
|
|
)
|
|
if encrypt:
|
|
default_config["encrypt"] = True
|
|
print("Journal will be encrypted.", file=sys.stderr)
|
|
|
|
save_config(default_config)
|
|
return default_config
|
|
|
|
|
|
def _initialize_autocomplete():
|
|
# readline is not included in Windows Active Python and perhaps some other distributions
|
|
if sys.modules.get("readline"):
|
|
import readline
|
|
|
|
readline.set_completer_delims(" \t\n;")
|
|
readline.parse_and_bind("tab: complete")
|
|
readline.set_completer(_autocomplete_path)
|
|
|
|
|
|
def _autocomplete_path(text, state):
|
|
expansions = glob.glob(os.path.expanduser(os.path.expandvars(text)) + "*")
|
|
expansions = [e + "/" if os.path.isdir(e) else e for e in expansions]
|
|
expansions.append(None)
|
|
return expansions[state]
|