Merge branch 'jrnl-org-develop' into #1170-alternate-config-file

This commit is contained in:
samuelgregorovic 2021-07-14 10:04:44 +02:00
commit 0a29fb26f0
143 changed files with 4998 additions and 488 deletions

2
.gitattributes vendored
View file

@ -1,2 +1,4 @@
*.journal text eol=lf *.journal text eol=lf
*.feature text eol=lf *.feature text eol=lf
poetry.lock text eol=lf
pyrpoject.toml text eol=lf

View file

@ -23,15 +23,15 @@ jobs:
if: > if: >
! contains(github.event.head_commit.message, '[ci skip]') ! contains(github.event.head_commit.message, '[ci skip]')
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
continue-on-error: ${{ matrix.python-version == '3.10-dev' }}
strategy: strategy:
fail-fast: false
matrix: matrix:
python-version: [ 3.7, 3.8, 3.9 ] python-version: [ 3.7, 3.8, 3.9, 3.10-dev ]
os: [ ubuntu-latest, macos-latest, windows-latest ] os: [ ubuntu-latest, macos-latest, windows-latest ]
exclude: # Added for GitHub Actions PR problem 2020-12-19 -- remove later!
- os: windows-latest
python-version: 3.9
steps: steps:
- run: git config --global core.autocrlf false
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- name: Set up Python ${{ matrix.python-version }} - name: Set up Python ${{ matrix.python-version }}
@ -46,27 +46,50 @@ jobs:
key: ${{ runner.os }}-${{ hashFiles('poetry.lock') }}-${{ matrix.python-version }}-v2 key: ${{ runner.os }}-${{ hashFiles('poetry.lock') }}-${{ matrix.python-version }}-v2
- name: Install dependencies - name: Install dependencies
if: ${{ matrix.python-version != '3.10-dev' }}
run: | run: |
echo '::group::poetry'
pip install poetry pip install poetry
poetry config --local virtualenvs.in-project true poetry config --local virtualenvs.in-project true
echo '::endgroup::'
echo '::group::Other dependencies'
poetry install --remove-untracked poetry install --remove-untracked
echo '::endgroup::'
echo 'DEPS_INSTALLED=true' >> $GITHUB_ENV
- name: Install dependencies (Prerelease)
if: ${{ matrix.python-version == '3.10-dev' }}
run: |
echo '::group::poetry'
pip install poetry==1.2.0a1
poetry config --local virtualenvs.in-project true
echo '::endgroup::'
echo '::group::Other dependencies'
poetry install --remove-untracked --no-dev --extras testing
echo '::endgroup::'
echo 'DEPS_INSTALLED=true' >> $GITHUB_ENV
- name: Code formatting (Black) - name: Code formatting (Black)
if: success() || failure() if: ${{ matrix.python-version != '3.10-dev' && env.DEPS_INSTALLED == 'true' }}
run: | run: |
poetry run black --version poetry run black --version
poetry run black --check --diff . poetry run black --check --diff .
- name: Code Style (PyFlakes) - name: Code Style (flake8)
if: success() || failure() if: ${{ matrix.python-version != '3.10-dev' && env.DEPS_INSTALLED == 'true' }}
run: | run: |
poetry run pyflakes --version poetry run pflake8 --version
poetry run pyflakes jrnl features tests poetry run pflake8 jrnl features tests
- name: Test with pytest - name: Test with pytest
if: success() || failure() if: ${{ env.DEPS_INSTALLED == 'true' }}
run: poetry run pytest --junitxml=reports/pytest/results.xml run: poetry run pytest --junitxml=reports/pytest/results.xml
- name: Test with behave - name: Test with behave
if: success() || failure() if: ${{ env.DEPS_INSTALLED == 'true' }}
run: poetry run behave --no-skipped --format progress2 --junit --junit-directory reports/behave run: poetry run behave --no-skipped --format progress2 --junit --junit-directory reports/behave

View file

@ -6,17 +6,22 @@
**Implemented enhancements:** **Implemented enhancements:**
- Multiple entries with same timestamp should be grouped together [\#1247](https://github.com/jrnl-org/jrnl/issues/1247) - Python 3.10 support [\#1270](https://github.com/jrnl-org/jrnl/issues/1270)
**Build:** **Build:**
- Move test suite entirely to Pytest \(replace Behave\) [\#1192](https://github.com/jrnl-org/jrnl/issues/1192)
- Remove useless shebangs and executable permissions [\#1283](https://github.com/jrnl-org/jrnl/pull/1283) ([musicinmybrain](https://github.com/musicinmybrain))
- Add Python 3.10 support [\#1271](https://github.com/jrnl-org/jrnl/pull/1271) ([micahellison](https://github.com/micahellison))
- Remove `--version` from brew release workflow [\#1233](https://github.com/jrnl-org/jrnl/pull/1233) ([wren](https://github.com/wren)) - Remove `--version` from brew release workflow [\#1233](https://github.com/jrnl-org/jrnl/pull/1233) ([wren](https://github.com/wren))
- Move test suite to Pytest \(replace Behave\) [\#1193](https://github.com/jrnl-org/jrnl/pull/1193) ([wren](https://github.com/wren))
**Packaging:** **Packaging:**
- Bump black from 21.5b1 to 21.5b2 [\#1254](https://github.com/jrnl-org/jrnl/pull/1254) ([dependabot[bot]](https://github.com/apps/dependabot)) - Bump black from 21.5b1 to 21.5b2 [\#1254](https://github.com/jrnl-org/jrnl/pull/1254) ([dependabot[bot]](https://github.com/apps/dependabot))
- Bump black from 21.5b0 to 21.5b1 [\#1244](https://github.com/jrnl-org/jrnl/pull/1244) ([dependabot[bot]](https://github.com/apps/dependabot)) - Bump black from 21.5b0 to 21.5b1 [\#1244](https://github.com/jrnl-org/jrnl/pull/1244) ([dependabot[bot]](https://github.com/apps/dependabot))
- Bump black from 20.8b1 to 21.5b0 [\#1241](https://github.com/jrnl-org/jrnl/pull/1241) ([dependabot[bot]](https://github.com/apps/dependabot)) - Bump black from 20.8b1 to 21.5b0 [\#1241](https://github.com/jrnl-org/jrnl/pull/1241) ([dependabot[bot]](https://github.com/apps/dependabot))
- Bump pytest from 6.2.3 to 6.2.4 [\#1240](https://github.com/jrnl-org/jrnl/pull/1240) ([dependabot[bot]](https://github.com/apps/dependabot))
## [v2.8.1](https://pypi.org/project/jrnl/v2.8.1/) (2021-04-24) ## [v2.8.1](https://pypi.org/project/jrnl/v2.8.1/) (2021-04-24)

View file

@ -18,12 +18,19 @@ format: ## Format files to match style
lint: ## Check style with various tools lint: ## Check style with various tools
poetry check poetry check
poetry run pyflakes . poetry run pflake8 jrnl tests
poetry run black --check --diff . poetry run black --check --diff .
test: lint ## Run unit tests and behave tests unit: # unit tests
poetry run pytest poetry run pytest tests/unit
poetry run behave --no-skipped --format progress2
bdd: # bdd tests
poetry run pytest tests/bdd --gherkin-terminal-reporter --tb=native --diff-type=unified
bdd-debug: # bdd tests
poetry run pytest tests/bdd --gherkin-terminal-reporter --tb=native --diff-type=unified -x -vv
test: lint unit bdd ## Run unit tests and behave tests
build: build:
poetry build poetry build

0
docs_theme/index.html Executable file → Normal file
View file

View file

@ -17,7 +17,7 @@ import keyring
import toml import toml
import yaml import yaml
from yaml.loader import FullLoader from yaml.loader import SafeLoader
import jrnl.time import jrnl.time
@ -409,7 +409,7 @@ def run(context, command, text=""):
if "config_path" in context and context.config_path is not None: if "config_path" in context and context.config_path is not None:
with open(context.config_path) as f: with open(context.config_path) as f:
context.jrnl_config = yaml.load(f, Loader=yaml.FullLoader) context.jrnl_config = yaml.load(f, Loader=yaml.SafeLoader)
else: else:
context.jrnl_config = None context.jrnl_config = None
@ -418,7 +418,7 @@ def run(context, command, text=""):
command = command.format(cache_dir=cache_dir) command = command.format(cache_dir=cache_dir)
if "config_path" in context and context.config_path is not None: if "config_path" in context and context.config_path is not None:
with open(context.config_path, "r") as f: with open(context.config_path, "r") as f:
cfg = yaml.load(f, Loader=FullLoader) cfg = yaml.load(f, Loader=SafeLoader)
context.jrnl_config = cfg context.jrnl_config = cfg
args = split_args(command) args = split_args(command)
@ -675,7 +675,7 @@ def check_journal_entries(context, number, journal_name="default"):
@when("the journal directory is listed") @when("the journal directory is listed")
def list_journal_directory(context, journal="default"): def list_journal_directory(context, journal="default"):
with open(context.config_path) as config_file: with open(context.config_path) as config_file:
configuration = yaml.load(config_file, Loader=yaml.FullLoader) configuration = yaml.load(config_file, Loader=yaml.SafeLoader)
journal_path = configuration["journals"][journal] journal_path = configuration["journals"][journal]
for root, dirnames, f in os.walk(journal_path): for root, dirnames, f in os.walk(journal_path):
for file in f: for file in f:

View file

@ -1,6 +1,4 @@
#!/usr/bin/env python import datetime
from datetime import datetime
import fnmatch import fnmatch
import os import os
from pathlib import Path from pathlib import Path
@ -80,35 +78,35 @@ class DayOne(Journal.Journal):
entry.creator_device_agent = dict_entry["Creator"][ entry.creator_device_agent = dict_entry["Creator"][
"Device Agent" "Device Agent"
] ]
except: except: # noqa: E722
pass pass
try: try:
entry.creator_generation_date = dict_entry["Creator"][ entry.creator_generation_date = dict_entry["Creator"][
"Generation Date" "Generation Date"
] ]
except: except: # noqa: E722
entry.creator_generation_date = date entry.creator_generation_date = date
try: try:
entry.creator_host_name = dict_entry["Creator"]["Host Name"] entry.creator_host_name = dict_entry["Creator"]["Host Name"]
except: except: # noqa: E722
pass pass
try: try:
entry.creator_os_agent = dict_entry["Creator"]["OS Agent"] entry.creator_os_agent = dict_entry["Creator"]["OS Agent"]
except: except: # noqa: E722
pass pass
try: try:
entry.creator_software_agent = dict_entry["Creator"][ entry.creator_software_agent = dict_entry["Creator"][
"Software Agent" "Software Agent"
] ]
except: except: # noqa: E722
pass pass
try: try:
entry.location = dict_entry["Location"] entry.location = dict_entry["Location"]
except: except: # noqa: E722
pass pass
try: try:
entry.weather = dict_entry["Weather"] entry.weather = dict_entry["Weather"]
except: except: # noqa: E722
pass pass
self.entries.append(entry) self.entries.append(entry)
self.sort() self.sort()
@ -118,7 +116,7 @@ class DayOne(Journal.Journal):
"""Writes only the entries that have been modified into plist files.""" """Writes only the entries that have been modified into plist files."""
for entry in self.entries: for entry in self.entries:
if entry.modified: if entry.modified:
utc_time = datetime.utcfromtimestamp( utc_time = datetime.datetime.utcfromtimestamp(
time.mktime(entry.date.timetuple()) time.mktime(entry.date.timetuple())
) )

5
jrnl/Entry.py Executable file → Normal file
View file

@ -1,9 +1,8 @@
#!/usr/bin/env python
# Copyright (C) 2012-2021 jrnl contributors # Copyright (C) 2012-2021 jrnl contributors
# License: https://www.gnu.org/licenses/gpl-3.0.html # License: https://www.gnu.org/licenses/gpl-3.0.html
from datetime import datetime import datetime
import re import re
import ansiwrap import ansiwrap
@ -15,7 +14,7 @@ from .color import highlight_tags_with_background_color
class Entry: class Entry:
def __init__(self, journal, date=None, text="", starred=False): def __init__(self, journal, date=None, text="", starred=False):
self.journal = journal # Reference to journal mainly to access its config self.journal = journal # Reference to journal mainly to access its config
self.date = date or datetime.now() self.date = date or datetime.datetime.now()
self.text = text self.text = text
self._title = None self._title = None
self._body = None self._body = None

View file

@ -1,4 +1,3 @@
#!/usr/bin/env python
# encoding: utf-8 # encoding: utf-8
# Copyright (C) 2012-2021 jrnl contributors # Copyright (C) 2012-2021 jrnl contributors
# License: https://www.gnu.org/licenses/gpl-3.0.html # License: https://www.gnu.org/licenses/gpl-3.0.html

View file

@ -1,9 +1,8 @@
#!/usr/bin/env python
# Copyright (C) 2012-2021 jrnl contributors # Copyright (C) 2012-2021 jrnl contributors
# License: https://www.gnu.org/licenses/gpl-3.0.html # License: https://www.gnu.org/licenses/gpl-3.0.html
from datetime import datetime import datetime
import logging import logging
import os import os
import re import re
@ -135,7 +134,9 @@ class Journal:
for match in date_blob_re.finditer(journal_txt): for match in date_blob_re.finditer(journal_txt):
date_blob = match.groups()[0] date_blob = match.groups()[0]
try: try:
new_date = datetime.strptime(date_blob, self.config["timeformat"]) new_date = datetime.datetime.strptime(
date_blob, self.config["timeformat"]
)
except ValueError: except ValueError:
# Passing in a date that had brackets around it # Passing in a date that had brackets around it
new_date = time.parse(date_blob, bracketed=True) new_date = time.parse(date_blob, bracketed=True)
@ -219,7 +220,10 @@ class Journal:
# If strict mode is on, all tags have to be present in entry # If strict mode is on, all tags have to be present in entry
tagged = self.search_tags.issubset if strict else self.search_tags.intersection tagged = self.search_tags.issubset if strict else self.search_tags.intersection
excluded = lambda tags: len([tag for tag in tags if tag in excluded_tags]) > 0
def excluded(tags):
return 0 < len([tag for tag in tags if tag in excluded_tags])
if contains: if contains:
contains_lower = contains.casefold() contains_lower = contains.casefold()
@ -348,7 +352,7 @@ class LegacyJournal(Journal):
"""Parses a journal that's stored in a string and returns a list of entries""" """Parses a journal that's stored in a string and returns a list of entries"""
# Entries start with a line that looks like 'date title' - let's figure out how # Entries start with a line that looks like 'date title' - let's figure out how
# long the date will be by constructing one # long the date will be by constructing one
date_length = len(datetime.today().strftime(self.config["timeformat"])) date_length = len(datetime.datetime.today().strftime(self.config["timeformat"]))
# Initialise our current entry # Initialise our current entry
entries = [] entries = []
@ -358,7 +362,7 @@ class LegacyJournal(Journal):
line = line.rstrip() line = line.rstrip()
try: try:
# try to parse line as date => new entry begins # try to parse line as date => new entry begins
new_date = datetime.strptime( new_date = datetime.datetime.strptime(
line[:date_length], self.config["timeformat"] line[:date_length], self.config["timeformat"]
) )

View file

@ -1,4 +1,3 @@
#!/usr/bin/env python
# Copyright (C) 2012-2021 jrnl contributors # Copyright (C) 2012-2021 jrnl contributors
# License: https://www.gnu.org/licenses/gpl-3.0.html # License: https://www.gnu.org/licenses/gpl-3.0.html

View file

@ -1,4 +1,3 @@
#!/usr/bin/env python
# Copyright (C) 2012-2021 jrnl contributors # Copyright (C) 2012-2021 jrnl contributors
# License: https://www.gnu.org/licenses/gpl-3.0.html # License: https://www.gnu.org/licenses/gpl-3.0.html

View file

@ -1,4 +1,3 @@
#!/usr/bin/env python
# Copyright (C) 2012-2021 jrnl contributors # Copyright (C) 2012-2021 jrnl contributors
# License: https://www.gnu.org/licenses/gpl-3.0.html # License: https://www.gnu.org/licenses/gpl-3.0.html

View file

@ -1,4 +1,3 @@
#!/usr/bin/env python
import re import re
from string import punctuation from string import punctuation
from string import whitespace from string import whitespace

View file

@ -41,7 +41,7 @@ def make_yaml_valid_dict(input: list) -> dict:
# yaml compatible strings are of the form Key:Value # yaml compatible strings are of the form Key:Value
yamlstr = YAML_SEPARATOR.join(input) yamlstr = YAML_SEPARATOR.join(input)
runtime_modifications = yaml.load(yamlstr, Loader=yaml.FullLoader) runtime_modifications = yaml.load(yamlstr, Loader=yaml.SafeLoader)
return runtime_modifications return runtime_modifications
@ -140,7 +140,7 @@ def verify_config_colors(config):
def load_config(config_path): def load_config(config_path):
"""Tries to load a config file from YAML.""" """Tries to load a config file from YAML."""
with open(config_path) as f: with open(config_path) as f:
return yaml.load(f, Loader=yaml.FullLoader) return yaml.load(f, Loader=yaml.SafeLoader)
def is_config_json(config_path): def is_config_json(config_path):

View file

@ -26,7 +26,7 @@ def get_text_from_editor(config, template=""):
try: try:
subprocess.call(split_args(config["editor"]) + [tmpfile]) subprocess.call(split_args(config["editor"]) + [tmpfile])
except Exception as e: except FileNotFoundError as e:
error_msg = f""" error_msg = f"""
{ERROR_COLOR}{str(e)}{RESET_COLOR} {ERROR_COLOR}{str(e)}{RESET_COLOR}

View file

@ -22,25 +22,24 @@ class JrnlError(Exception):
def _get_error_message(self, **kwargs): def _get_error_message(self, **kwargs):
error_messages = { error_messages = {
"ConfigDirectoryIsFile": textwrap.dedent( "ConfigDirectoryIsFile": """
"""
The path to your jrnl configuration directory is a file, not a directory: The path to your jrnl configuration directory is a file, not a directory:
{config_directory_path} {config_directory_path}
Removing this file will allow jrnl to save its configuration. Removing this file will allow jrnl to save its configuration.
""" """,
), "LineWrapTooSmallForDateFormat": """
"LineWrapTooSmallForDateFormat": textwrap.dedent( The provided linewrap value of {config_linewrap} is too small by
""" {columns} columns to display the timestamps in the configured time
The provided linewrap value of {config_linewrap} is too small by {columns} columns format for journal {journal}.
to display the timestamps in the configured time format for journal {journal}.
You can avoid this error by specifying a linewrap value that is larger by at least {columns} in the configuration file or by using --config-override at the command line You can avoid this error by specifying a linewrap value that is larger
""" by at least {columns} in the configuration file or by using
), --config-override at the command line
""",
} }
return error_messages[self.error_type].format(**kwargs) msg = error_messages[self.error_type].format(**kwargs)
msg = textwrap.dedent(msg)
pass return msg

View file

@ -1,4 +1,3 @@
#!/usr/bin/env python
# Copyright (C) 2012-2021 jrnl contributors # Copyright (C) 2012-2021 jrnl contributors
# License: https://www.gnu.org/licenses/gpl-3.0.html # License: https://www.gnu.org/licenses/gpl-3.0.html

View file

@ -1,4 +1,3 @@
#!/usr/bin/env python
# encoding: utf-8 # encoding: utf-8
# Copyright (C) 2012-2021 jrnl contributors # Copyright (C) 2012-2021 jrnl contributors
# License: https://www.gnu.org/licenses/gpl-3.0.html # License: https://www.gnu.org/licenses/gpl-3.0.html

View file

@ -1,4 +1,3 @@
#!/usr/bin/env python
# encoding: utf-8 # encoding: utf-8
# Copyright (C) 2012-2021 jrnl contributors # Copyright (C) 2012-2021 jrnl contributors
# License: https://www.gnu.org/licenses/gpl-3.0.html # License: https://www.gnu.org/licenses/gpl-3.0.html

View file

@ -1,4 +1,3 @@
#!/usr/bin/env python
# encoding: utf-8 # encoding: utf-8
# Copyright (C) 2012-2021 jrnl contributors # Copyright (C) 2012-2021 jrnl contributors
# License: https://www.gnu.org/licenses/gpl-3.0.html # License: https://www.gnu.org/licenses/gpl-3.0.html

View file

@ -1,4 +1,3 @@
#!/usr/bin/env python
# encoding: utf-8 # encoding: utf-8
# Copyright (C) 2012-2021 jrnl contributors # Copyright (C) 2012-2021 jrnl contributors
# License: https://www.gnu.org/licenses/gpl-3.0.html # License: https://www.gnu.org/licenses/gpl-3.0.html

View file

@ -1,4 +1,3 @@
#!/usr/bin/env python
# encoding: utf-8 # encoding: utf-8
# Copyright (C) 2012-2021 jrnl contributors # Copyright (C) 2012-2021 jrnl contributors
# License: https://www.gnu.org/licenses/gpl-3.0.html # License: https://www.gnu.org/licenses/gpl-3.0.html

View file

@ -1,4 +1,3 @@
#!/usr/bin/env python
# encoding: utf-8 # encoding: utf-8
# Copyright (C) 2012-2021 jrnl contributors # Copyright (C) 2012-2021 jrnl contributors
# License: https://www.gnu.org/licenses/gpl-3.0.html # License: https://www.gnu.org/licenses/gpl-3.0.html

View file

@ -1,4 +1,3 @@
#!/usr/bin/env python
# encoding: utf-8 # encoding: utf-8
# Copyright (C) 2012-2021 jrnl contributors # Copyright (C) 2012-2021 jrnl contributors
# License: https://www.gnu.org/licenses/gpl-3.0.html # License: https://www.gnu.org/licenses/gpl-3.0.html

View file

@ -26,7 +26,7 @@ class Template:
def from_file(cls, filename): def from_file(cls, filename):
with open(filename) as f: with open(filename) as f:
front_matter, body = f.read().strip("-\n").split("---", 2) front_matter, body = f.read().strip("-\n").split("---", 2)
front_matter = yaml.load(front_matter, Loader=yaml.FullLoader) front_matter = yaml.load(front_matter, Loader=yaml.SafeLoader)
template = cls(body) template = cls(body)
template.__dict__.update(front_matter) template.__dict__.update(front_matter)
return template return template

View file

@ -1,4 +1,3 @@
#!/usr/bin/env python
# encoding: utf-8 # encoding: utf-8
# Copyright (C) 2012-2021 jrnl contributors # Copyright (C) 2012-2021 jrnl contributors
# License: https://www.gnu.org/licenses/gpl-3.0.html # License: https://www.gnu.org/licenses/gpl-3.0.html

View file

@ -1,4 +1,3 @@
#!/usr/bin/env python
# encoding: utf-8 # encoding: utf-8
# Copyright (C) 2012-2021 jrnl contributors # Copyright (C) 2012-2021 jrnl contributors
# License: https://www.gnu.org/licenses/gpl-3.0.html # License: https://www.gnu.org/licenses/gpl-3.0.html

View file

@ -1,4 +1,3 @@
#!/usr/bin/env python
# encoding: utf-8 # encoding: utf-8
# Copyright (C) 2012-2021 jrnl contributors # Copyright (C) 2012-2021 jrnl contributors
# License: https://www.gnu.org/licenses/gpl-3.0.html # License: https://www.gnu.org/licenses/gpl-3.0.html

View file

@ -1,4 +1,3 @@
#!/usr/bin/env python
# encoding: utf-8 # encoding: utf-8
# Copyright (C) 2012-2021 jrnl contributors # Copyright (C) 2012-2021 jrnl contributors
# License: https://www.gnu.org/licenses/gpl-3.0.html # License: https://www.gnu.org/licenses/gpl-3.0.html

View file

@ -1,4 +1,3 @@
#!/usr/bin/env python
# encoding: utf-8 # encoding: utf-8
# Copyright (C) 2012-2021 jrnl contributors # Copyright (C) 2012-2021 jrnl contributors
# License: https://www.gnu.org/licenses/gpl-3.0.html # License: https://www.gnu.org/licenses/gpl-3.0.html

View file

@ -1,11 +1,11 @@
# Copyright (C) 2012-2021 jrnl contributors # Copyright (C) 2012-2021 jrnl contributors
# License: https://www.gnu.org/licenses/gpl-3.0.html # License: https://www.gnu.org/licenses/gpl-3.0.html
from datetime import datetime import datetime
FAKE_YEAR = 9999 FAKE_YEAR = 9999
DEFAULT_FUTURE = datetime(FAKE_YEAR, 12, 31, 23, 59, 59) DEFAULT_FUTURE = datetime.datetime(FAKE_YEAR, 12, 31, 23, 59, 59)
DEFAULT_PAST = datetime(FAKE_YEAR, 1, 1, 0, 0) DEFAULT_PAST = datetime.datetime(FAKE_YEAR, 1, 1, 0, 0)
def __get_pdt_calendar(): def __get_pdt_calendar():
@ -27,7 +27,7 @@ def parse(
"""Parses a string containing a fuzzy date and returns a datetime.datetime object""" """Parses a string containing a fuzzy date and returns a datetime.datetime object"""
if not date_str: if not date_str:
return None return None
elif isinstance(date_str, datetime): elif isinstance(date_str, datetime.datetime):
return date_str return date_str
# Don't try to parse anything with 6 or less characters and was parsed from the existing journal. # Don't try to parse anything with 6 or less characters and was parsed from the existing journal.
@ -44,7 +44,9 @@ def parse(
date = dateparse(date_str, default=default_date) date = dateparse(date_str, default=default_date)
if date.year == FAKE_YEAR: if date.year == FAKE_YEAR:
date = datetime(datetime.now().year, date.timetuple()[1:6]) date = datetime.datetime(
datetime.datetime.now().year, date.timetuple()[1:6]
)
else: else:
year_present = True year_present = True
flag = 1 if date.hour == date.minute == 0 else 2 flag = 1 if date.hour == date.minute == 0 else 2
@ -52,7 +54,7 @@ def parse(
except Exception as e: except Exception as e:
if e.args[0] == "day is out of range for month": if e.args[0] == "day is out of range for month":
y, m, d, H, M, S = default_date.timetuple()[:6] y, m, d, H, M, S = default_date.timetuple()[:6]
default_date = datetime(y, m, d - 1, H, M, S) default_date = datetime.datetime(y, m, d - 1, H, M, S)
else: else:
calendar = __get_pdt_calendar() calendar = __get_pdt_calendar()
date, flag = calendar.parse(date_str) date, flag = calendar.parse(date_str)
@ -60,26 +62,26 @@ def parse(
if not flag: # Oops, unparsable. if not flag: # Oops, unparsable.
try: # Try and parse this as a single year try: # Try and parse this as a single year
year = int(date_str) year = int(date_str)
return datetime(year, 1, 1) return datetime.datetime(year, 1, 1)
except ValueError: except ValueError:
return None return None
except TypeError: except TypeError:
return None return None
if flag == 1: # Date found, but no time. Use the default time. if flag == 1: # Date found, but no time. Use the default time.
date = datetime( date = datetime.datetime(
*date[:3], *date[:3],
hour=23 if inclusive else default_hour or 0, hour=23 if inclusive else default_hour or 0,
minute=59 if inclusive else default_minute or 0, minute=59 if inclusive else default_minute or 0,
second=59 if inclusive else 0 second=59 if inclusive else 0
) )
else: else:
date = datetime(*date[:6]) date = datetime.datetime(*date[:6])
# Ugly heuristic: if the date is more than 4 weeks in the future, we got the year wrong. # Ugly heuristic: if the date is more than 4 weeks in the future, we got the year wrong.
# Rather then this, we would like to see parsedatetime patched so we can tell it to prefer # Rather then this, we would like to see parsedatetime patched so we can tell it to prefer
# past dates # past dates
dt = datetime.now() - date dt = datetime.datetime.now() - date
if dt.days < -28 and not year_present: if dt.days < -28 and not year_present:
date = date.replace(date.year - 1) date = date.replace(date.year - 1)
return date return date

1045
poetry.lock generated

File diff suppressed because it is too large Load diff

View file

@ -27,7 +27,7 @@ classifiers = [
"Funding" = "https://opencollective.com/jrnl" "Funding" = "https://opencollective.com/jrnl"
[tool.poetry.dependencies] [tool.poetry.dependencies]
python = ">=3.7.0, <3.10" python = ">=3.7.0, <3.11"
ansiwrap = "^0.8.4" ansiwrap = "^0.8.4"
asteval = "^0.9" asteval = "^0.9"
@ -43,14 +43,28 @@ pyyaml = ">=5.1"
pytz = ">=2020" # https://pythonhosted.org/pytz/#issues-limitations pytz = ">=2020" # https://pythonhosted.org/pytz/#issues-limitations
tzlocal = ">2.0, <3.0" # https://github.com/regebro/tzlocal/blob/master/CHANGES.txt tzlocal = ">2.0, <3.0" # https://github.com/regebro/tzlocal/blob/master/CHANGES.txt
# Minimal deps required for testing
# I don't like repeating deps here, but
# there's no other way to do this yet until poetry v1.2 releases
# see: https://github.com/python-poetry/poetry/issues/1644
behave = { version = "^1.2" , optional = true }
pytest = { version = ">=6.2" , optional = true }
pytest-bdd = { version = ">=4.0.1" , optional = true }
toml = { version = ">=0.10" , optional = true }
[tool.poetry.dev-dependencies] [tool.poetry.dev-dependencies]
behave = "^1.2" behave = "^1.2"
mkdocs = "^1.0" mkdocs = ">=1.0"
black = {version = "^21.5b2",allow-prereleases = true} black = { version = ">=21.5b2", allow-prereleases = true }
toml = ">=0.10" toml = ">=0.10"
pyflakes = ">=2.2.0"
pytest = ">=6.2" pytest = ">=6.2"
yq = ">=2.11" pytest-bdd = ">=4.0.1"
ipdb = "*"
pytest-clarity = "*"
pyproject-flake8 = "*"
[tool.poetry.extras]
testing = [ "behave", "pytest", "pytest-bdd", "toml" ]
[tool.poetry.scripts] [tool.poetry.scripts]
jrnl = 'jrnl.cli:cli' jrnl = 'jrnl.cli:cli'
@ -62,6 +76,29 @@ line_length = 88
known_first_party = ["jrnl"] known_first_party = ["jrnl"]
force_sort_within_sections = true force_sort_within_sections = true
[tool.pytest.ini_options]
minversion = "6.0"
required_plugins = [
"pytest-bdd"
]
markers = [
"todo",
]
addopts = [
"--pdbcls=IPython.terminal.debugger:Pdb"
]
filterwarnings = [
"ignore::DeprecationWarning",
"ignore:Flag style will be deprecated in.*",
"ignore:[WinError 32].*",
"ignore:[WinError 5].*"
]
[tool.flake8]
# ignore formatting warnings and errors because we use Black to autoformat
extend-ignore = "E101,E111,E114,E115,E116,E117,E12,E13,E2,E3,E401,E5,E70,W1,W2,W3,W5"
[build-system] [build-system]
requires = ["poetry>=1.1"] requires = ["poetry>=1.1"]
build-backend = "poetry.masonry.api" build-backend = "poetry.masonry.api"

View file

@ -0,0 +1,7 @@
Feature: Build process
Scenario: Version numbers should stay in sync
Given we use the config "simple.yaml"
When we run "jrnl --version"
Then we should get no error
And the output should contain pyproject.toml version

View file

@ -0,0 +1,18 @@
Feature: Functionality of jrnl outside of actually handling journals
Scenario: Displaying the version number
Given we use the config "simple.yaml"
When we run "jrnl --version"
Then we should get no error
Then the output should match "^jrnl version v\d+\.\d+(\.\d+)?(-(alpha|beta)\d*)?"
Scenario: Running the diagnostic command
Given we use the config "simple.yaml"
When we run "jrnl --diagnostic"
Then the output should contain "jrnl"
And the output should contain "Python"
And the output should contain "OS"
@todo
Scenario: Listing available journals

View file

@ -0,0 +1,174 @@
Feature: Reading and writing to journal with custom date formats
Scenario: Dates can include a time
# https://github.com/jrnl-org/jrnl/issues/117
Given we use the config "simple.yaml"
When we run "jrnl 2013-11-30 15:42: Project Started."
Then we should see the message "Entry added"
When we run "jrnl -999"
Then the output should contain "2013-11-30 15:42 Project Started."
Scenario: Dates can be in the future
# https://github.com/jrnl-org/jrnl/issues/185
Given we use the config "simple.yaml"
When we run "jrnl 26/06/2099: Planet? Earth. Year? 2099."
Then we should see the message "Entry added"
When we run "jrnl -999"
Then the output should contain "2099-06-26 09:00 Planet?"
Scenario: Loading a sample journal with custom date
Given we use the config "little_endian_dates.yaml"
When we run "jrnl -n 2"
Then we should get no error
When we run "jrnl -n 999"
Then the output should be
09.06.2013 15:39 My first entry.
| Everything is alright
10.07.2013 15:40 Life is good.
| But I'm better.
Scenario Outline: Writing an entry from command line with custom date
Given we use the config "<config_file>"
When we run "jrnl <command>"
Then we should see the message "Entry added"
When we run "jrnl -n 1"
Then the output should contain "<expected_output>"
Examples: Day-first Dates
| config_file | command | expected_output |
| little_endian_dates.yaml | 2020-09-19: My first entry. | 19.09.2020 09:00 My first entry. |
| little_endian_dates.yaml | 2020-08-09: My second entry. | 09.08.2020 09:00 My second entry. |
| little_endian_dates.yaml | 2020-02-29: Test. | 29.02.2020 09:00 Test. |
| little_endian_dates.yaml | 2019-02-29: Test. | 2019-02-29: Test. |
| little_endian_dates.yaml | 2020-08-32: Test. | 2020-08-32: Test. |
| little_endian_dates.yaml | 2032-02-01: Test. | 01.02.2032 09:00 Test. |
| little_endian_dates.yaml | 2020-01-01: Test. | 01.01.2020 09:00 Test. |
| little_endian_dates.yaml | 2020-12-31: Test. | 31.12.2020 09:00 Test. |
Scenario Outline: Searching for dates with custom date
Given we use the config "<config_file>"
When we run "jrnl <command>"
Then the output should be "<expected_output>"
Examples: Day-first Dates
| config_file | command | expected_output |
| little_endian_dates.yaml | -on '2013-07-10' --short | 10.07.2013 15:40 Life is good. |
| little_endian_dates.yaml | -on 'june 9 2013' --short | 09.06.2013 15:39 My first entry. |
| little_endian_dates.yaml | -on 'july 10 2013' --short | 10.07.2013 15:40 Life is good. |
| little_endian_dates.yaml | -on 'june 2013' --short | 09.06.2013 15:39 My first entry. |
| little_endian_dates.yaml | -on 'july 2013' --short | 10.07.2013 15:40 Life is good. |
# @todo month alone with no year should work
# | little_endian_dates.yaml | -on 'june' --short | 09.06.2013 15:39 My first entry. |
# | little_endian_dates.yaml | -on 'july' --short | 10.07.2013 15:40 Life is good. |
Scenario: Writing an entry at the prompt with custom date
Given we use the config "little_endian_dates.yaml"
When we run "jrnl" and enter "2013-05-10: I saw Elvis. He's alive."
Then we should get no error
When we run "jrnl -999"
Then the output should contain "10.05.2013 09:00 I saw Elvis."
And the output should contain "He's alive."
Scenario: Viewing today's entries does not print the entire journal
# see: https://github.com/jrnl-org/jrnl/issues/741
Given we use the config "simple.yaml"
When we run "jrnl -on today"
Then the output should not contain "Life is good"
And the output should not contain "But I'm better."
Scenario Outline: Create entry using day of the week as entry date one.
Given we use the config "simple.yaml"
And now is "2019-03-12 01:30:32 PM"
When we run "jrnl <command>"
Then we should see the message "Entry added"
When we run "jrnl -1"
Then the output should contain "<expected_output>"
Then the output should contain the date "<date>"
Examples: Days of the week
| command | expected_output | date |
| Monday: entry on a monday | entry on a monday | 2019-03-11 09:00 |
| Tuesday: entry on a tuesday | entry on a tuesday | 2019-03-05 09:00 |
| Wednesday: entry on a wednesday | entry on a wednesday | 2019-03-06 09:00 |
| Thursday: entry on a thursday | entry on a thursday | 2019-03-07 09:00 |
| Friday: entry on a friday | entry on a friday | 2019-03-08 09:00 |
| Saturday: entry on a saturday | entry on a saturday | 2019-03-09 09:00 |
| Sunday: entry on a sunday | entry on a sunday | 2019-03-10 09:00 |
| sunday: entry on a sunday | entry on a sunday | 2019-03-10 09:00 |
| sUndAy: entry on a sunday | entry on a sunday | 2019-03-10 09:00 |
Scenario Outline: Create entry using day of the week as entry date two.
Given we use the config "simple.yaml"
And now is "2019-03-12 01:30:32 PM"
When we run "jrnl <command>"
Then we should see the message "Entry added"
When we run "jrnl -1"
Then the output should contain "<expected_output>"
Then the output should contain the date "<date>"
Examples: Days of the week
| command | expected_output | date |
| Mon: entry on a monday | entry on a monday | 2019-03-11 09:00 |
| Tue: entry on a tuesday | entry on a tuesday | 2019-03-05 09:00 |
| Wed: entry on a wednesday | entry on a wednesday | 2019-03-06 09:00 |
| Thu: entry on a thursday | entry on a thursday | 2019-03-07 09:00 |
| Fri: entry on a friday | entry on a friday | 2019-03-08 09:00 |
| Sat: entry on a saturday | entry on a saturday | 2019-03-09 09:00 |
| Sun: entry on a sunday | entry on a sunday | 2019-03-10 09:00 |
| sun: entry on a sunday | entry on a sunday | 2019-03-10 09:00 |
| sUn: entry on a sunday | entry on a sunday | 2019-03-10 09:00 |
Scenario: Journals with unreadable dates should still be loaded
Given we use the config "unreadabledates.yaml"
When we run "jrnl -2"
Then the output should contain "I've lost track of time."
And the output should contain "Time has no meaning."
Scenario: Journals with readable dates AND unreadable dates should still contain all data.
Given we use the config "mostlyreadabledates.yaml"
When we run "jrnl --short"
Then the output should be
2019-07-01 14:23 The third entry
2019-07-18 14:23 The first entry
2019-07-19 14:23 The second entry
Scenario: Update near-valid dates after journal is edited
Given we use the config "mostlyreadabledates.yaml"
When we run "jrnl 2222-08-19: I have made it exactly one month into the future."
When we run "jrnl -2"
Then the output should contain "2019-07-19 14:23 The second entry"
Scenario: Integers in square brackets should not be read as dates
Given we use the config "brackets.yaml"
When we run "jrnl -1"
Then the output should contain "[1] line starting with 1"
# broken still
@skip
Scenario: Dayone entries without timezone information are interpreted in current timezone
Given we use the config "dayone.yaml"
When we run "jrnl -until 'feb 2013'"
Then we should get no error
And the output should contain "2013-01-17T18:37Z" in the local time
Scenario: Loading entry with ambiguous time stamp in timezone-aware journal (like Dayone)
#https://github.com/jrnl-org/jrnl/issues/153
Given we use the config "bug153.yaml"
When we run "jrnl -1"
Then we should get no error
And the output should be
2013-10-27 03:27 Some text.

View file

@ -0,0 +1,182 @@
Feature: Delete entries from journal
Scenario Outline: Delete flag allows deletion of single entry
Given we use the config "<config_file>"
And we use the password "test" if prompted
When we run "jrnl -1"
Then the output should contain "2020-09-24 09:14 The third entry finally"
When we run "jrnl --delete" and enter
N
N
Y
When we run "jrnl -99 --short"
Then the output should be
2020-08-29 11:11 Entry the first.
2020-08-31 14:32 A second entry in what I hope to be a long series.
Examples: Configs
| config_file |
| basic_onefile.yaml |
| basic_encrypted.yaml |
# | basic_folder.yaml | @todo
# | basic_dayone.yaml | @todo
Scenario Outline: Backing out of interactive delete does not change journal
Given we use the config "<config_file>"
When we run "jrnl --delete -n 1" and enter
N
When we run "jrnl -99 --short"
Then the output should be
2020-08-29 11:11 Entry the first.
2020-08-31 14:32 A second entry in what I hope to be a long series.
2020-09-24 09:14 The third entry finally after weeks without writing.
Examples: Configs
| config_file |
| basic_onefile.yaml |
| basic_folder.yaml |
| basic_dayone.yaml |
Scenario Outline: Delete flag with nonsense input deletes nothing (issue #932)
Given we use the config "<config_file>"
When we run "jrnl --delete asdfasdf"
When we run "jrnl -99 --short"
Then the output should be
2020-08-29 11:11 Entry the first.
2020-08-31 14:32 A second entry in what I hope to be a long series.
2020-09-24 09:14 The third entry finally after weeks without writing.
Examples: Configs
| config_file |
| basic_onefile.yaml |
| basic_folder.yaml |
| basic_dayone.yaml |
Scenario Outline: Delete flag with tag only deletes tagged entries
Given we use the config "<config_file>"
When we run "jrnl --delete @ipsum" and enter
Y
When we run "jrnl -99 --short"
Then the output should be
2020-08-31 14:32 A second entry in what I hope to be a long series.
2020-09-24 09:14 The third entry finally after weeks without writing.
Examples: Configs
| config_file |
| basic_onefile.yaml |
# | basic_folder.yaml | @todo
# | basic_dayone.yaml | @todo
Scenario Outline: Delete flag with multiple tags deletes all entries matching any of the tags
Given we use the config "<config_file>"
When we run "jrnl --delete @ipsum @tagthree" and enter
Y
Y
When we run "jrnl -99 --short"
Then the output should be
2020-08-31 14:32 A second entry in what I hope to be a long series.
Examples: Configs
| config_file |
| basic_onefile.yaml |
# | basic_folder.yaml | @todo
# | basic_dayone.yaml | @todo
Scenario Outline: Delete flag with -and deletes boolean AND of tagged entries
Given we use the config "<config_file>"
When we run "jrnl --delete -and @tagone @tagtwo" and enter
Y
When we run "jrnl -99 --short"
Then the output should be
2020-08-31 14:32 A second entry in what I hope to be a long series.
2020-09-24 09:14 The third entry finally after weeks without writing.
Examples: Configs
| config_file |
| basic_onefile.yaml |
# | basic_folder.yaml | @todo
# | basic_dayone.yaml | @todo
Scenario Outline: Delete flag with -not does not delete entries from given tag
Given we use the config "<config_file>"
When we run "jrnl --delete @tagone -not @ipsum" and enter
Y
When we run "jrnl -99 --short"
Then the output should be
2020-08-29 11:11 Entry the first.
2020-08-31 14:32 A second entry in what I hope to be a long series.
Examples: Configs
| config_file |
| basic_onefile.yaml |
# | basic_folder.yaml | @todo
# | basic_dayone.yaml | @todo
Scenario Outline: Delete flag with -from search operator only deletes entries since that date
Given we use the config "<config_file>"
When we run "jrnl --delete -from 2020-09-01" and enter
Y
When we run "jrnl -99 --short"
Then the output should be
2020-08-29 11:11 Entry the first.
2020-08-31 14:32 A second entry in what I hope to be a long series.
Examples: Configs
| config_file |
| basic_onefile.yaml |
# | basic_folder.yaml | @todo
# | basic_dayone.yaml | @todo
Scenario Outline: Delete flag with -to only deletes entries up to specified date
Given we use the config "<config_file>"
When we run "jrnl --delete -to 2020-08-31" and enter
Y
Y
When we run "jrnl -99 --short"
Then the output should be
2020-09-24 09:14 The third entry finally after weeks without writing.
Examples: Configs
| config_file |
| basic_onefile.yaml |
# | basic_folder.yaml | @todo
# | basic_dayone.yaml | @todo
Scenario Outline: Delete flag with -starred only deletes starred entries
Given we use the config "<config_file>"
When we run "jrnl --delete -starred" and enter
Y
When we run "jrnl -99 --short"
Then the output should be
2020-08-29 11:11 Entry the first.
2020-09-24 09:14 The third entry finally after weeks without writing.
Examples: Configs
| config_file |
| basic_onefile.yaml |
# | basic_folder.yaml | @todo
# | basic_dayone.yaml | @todo
Scenario Outline: Delete flag with -contains only entries containing expression
Given we use the config "<config_file>"
When we run "jrnl --delete -contains dignissim" and enter
Y
When we run "jrnl -99 --short"
Then the output should be
2020-08-31 14:32 A second entry in what I hope to be a long series.
2020-09-24 09:14 The third entry finally after weeks without writing.
Examples: Configs
| config_file |
| basic_onefile.yaml |
# | basic_folder.yaml | @todo
# | basic_dayone.yaml | @todo

View file

@ -0,0 +1,42 @@
Feature: Encrypting and decrypting journals
Scenario: Decrypting a journal
Given we use the config "encrypted.yaml"
When we run "jrnl --decrypt" and enter "bad doggie no biscuit"
Then we should see the message "Journal decrypted"
And the config for journal "default" should contain "encrypt: false"
When we run "jrnl -99 --short"
Then the output should be
2013-06-09 15:39 My first entry.
2013-06-10 15:40 Life is good.
@todo
Scenario: Trying to decrypt an already unencrypted journal
# This should warn the user that the journal is already encrypted
Given we use the config "simple.yaml"
When we run "jrnl --decrypt"
Then the config for journal "default" should contain "encrypt: false"
When we run "jrnl -99 --short"
Then the output should be
2013-06-09 15:39 My first entry.
2013-06-10 15:40 Life is good.
@todo
Scenario: Trying to encrypt an already encrypted journal
# This should warn the user that the journal is already encrypted
Scenario: Encrypting a journal
Given we use the config "simple.yaml"
When we run "jrnl --encrypt" and enter
swordfish
swordfish
n
Then we should see the message "Journal encrypted"
And the config for journal "default" should contain "encrypt: true"
When we run "jrnl -n 1" and enter "swordfish"
Then we should be prompted for a password
And the output should contain "2013-06-10 15:40 Life is good"

View file

@ -0,0 +1,52 @@
Feature: Journals iteracting with the file system in a way that users can see
Scenario: Adding entries to a Folder journal should generate date files
Given we use the config "empty_folder.yaml"
When we run "jrnl 23 July 2013: Testing folder journal."
Then we should see the message "Entry added"
And the journal directory should contain
2013/07/23.txt
Scenario: Adding multiple entries to a Folder journal should generate multiple date files
Given we use the config "empty_folder.yaml"
When we run "jrnl 23 July 2013: Testing folder journal."
And we run "jrnl 3/7/2014: Second entry of journal."
Then we should see the message "Entry added"
And the journal directory should contain
2013/07/23.txt
Scenario: If the journal and its parent directory don't exist, they should be created
Given we use the config "missing_directory.yaml"
Then the journal should not exist
When we run "jrnl This is a new entry in my journal"
Then the journal should exist
When we run "jrnl -99 --short"
Then the output should contain "This is a new entry in my journal"
Scenario: If the journal file doesn't exist, then it should be created
Given we use the config "missing_journal.yaml"
Then the journal should not exist
When we run "jrnl This is a new entry in my journal"
Then the journal should exist
When we run "jrnl -99 --short"
Then the output should contain "This is a new entry in my journal"
Scenario: Creating journal with relative path should update to absolute path
When we run "jrnl hello world" and enter
test.txt
n
Then the output should contain "Journal 'default' created"
When we change directory to "subfolder"
And we run "jrnl -n 1"
Then the output should contain "hello world"
Scenario: the temporary filename suffix should default to ".jrnl"
Given we use the config "editor.yaml"
When we run "jrnl --edit"
Then the editor should have been called
Then the editor filename should end with ".jrnl"
Scenario: the temporary filename suffix should be "-{template_filename}"
Given we use the config "editor_markdown_extension.yaml"
When we run "jrnl --edit"
Then the editor filename should end with "-extension.md"

View file

@ -0,0 +1,561 @@
Feature: Custom formats
Scenario Outline: JSON format
Given we use the config "<config_file>"
And we use the password "test" if prompted
When we run "jrnl --format json"
Then we should get no error
And the output should be valid JSON
Given we parse the output as JSON
Then "entries" in the parsed output should have 3 elements
And "tags" in the parsed output should be
@ipsum
@tagone
@tagtwo
@tagthree
And "entries.0.tags" in the parsed output should have 3 elements
And "entries.1.tags" in the parsed output should have 1 elements
And "entries.2.tags" in the parsed output should have 2 elements
Examples: configs
| config_file |
| basic_onefile.yaml |
| basic_encrypted.yaml |
| basic_folder.yaml |
| basic_dayone.yaml |
Scenario: Exporting dayone to json should include UUID
Given we use the config "dayone.yaml"
When we run "jrnl --export json"
Then we should get no error
And the output should be valid JSON
Given we parse the output as JSON
Then "entries.0.uuid" in the parsed output should be
4BB1F46946AD439996C9B59DE7C4DDC1
Scenario Outline: Printing a journal that has multiline entries with tags
Given we use the config "<config_file>"
And we use the password "test" if prompted
When we run "jrnl -n 1 @ipsum"
Then we should get no error
And the output should be
2020-08-29 11:11 Entry the first.
| Lorem @ipsum dolor sit amet, consectetur adipiscing elit. Praesent malesuada
| quis est ac dignissim. Aliquam dignissim rutrum pretium. Phasellus
| pellentesque
| augue et venenatis facilisis. Suspendisse potenti. Sed dignissim sed nisl eu
| consequat. Aenean ante ex, elementum ut interdum et, mattis eget lacus. In
| commodo nulla nec tellus placerat, sed ultricies metus bibendum. Duis eget
| venenatis erat. In at dolor dui. @tagone and maybe also @tagtwo.
|
| Curabitur accumsan nunc ac neque tristique, eleifend faucibus justo
| ullamcorper. Suspendisse at mattis nunc. Nullam eget lacinia urna. Suspendisse
| potenti. Ut urna est, venenatis sed ante in, ultrices congue mi. Maecenas eget
| molestie metus. Mauris porttitor dui ornare gravida porta. Quisque sed lectus
| hendrerit, lacinia ante eget, vulputate ante. Aliquam vitae erat non felis
| feugiat sagittis. Phasellus quis arcu fringilla, mattis ligula id, vestibulum
| urna. Vivamus facilisis leo a mi tincidunt condimentum. Donec eu euismod enim.
| Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam eu ligula eget
| velit scelerisque fringilla. Phasellus pharetra justo et nulla fringilla, ac
| porta sapien accumsan. Class aptent taciti sociosqu ad litora torquent per
| conubia nostra, per inceptos himenaeos.
Examples: configs
| config_file |
| basic_onefile.yaml |
| basic_encrypted.yaml |
| basic_folder.yaml |
| basic_dayone.yaml |
Scenario Outline: Exporting using filters should only export parts of the journal
Given we use the config "<config_file>"
And we use the password "test" if prompted
When we run "jrnl -until 'August 2020' --format json"
Then the output should be valid JSON
Then we should get no error
And the output should be valid JSON
Given we parse the output as JSON
Then "entries" in the parsed output should have 2 elements
And "tags" in the parsed output should be
@ipsum
@tagone
@tagtwo
And "entries.0.tags" in the parsed output should have 3 elements
And "entries.1.tags" in the parsed output should have 1 elements
Examples: configs
| config_file |
| basic_onefile.yaml |
| basic_encrypted.yaml |
| basic_folder.yaml |
| basic_dayone.yaml |
Scenario Outline: Exporting using custom templates
Given we use the config "<config_file>"
And we use the password "test" if prompted
When we run "jrnl -1 --format sample"
Then the output should be
The third entry finally after weeks without writing.
----------------------------------------------------
I'm so excited about emojis. 💯 🎶 💩
Donec semper pellentesque iaculis. Nullam cursus et justo sit amet venenatis.
Vivamus tempus ex dictum metus vehicula gravida. Aliquam sed sem dolor. Nulla
eget ultrices purus. Quisque at nunc at quam pharetra consectetur vitae quis
dolor. Fusce ultricies purus eu est feugiat, quis scelerisque nibh malesuada.
Quisque egestas semper nibh in hendrerit. Nam finibus ex in mi mattis
vulputate. Sed mauris urna, consectetur in justo eu, volutpat accumsan justo.
Phasellus aliquam lacus placerat convallis vestibulum. Curabitur maximus at
ante eget fringilla. @tagthree and also @tagone
Examples: configs
| config_file |
| basic_onefile.yaml |
| basic_encrypted.yaml |
| basic_folder.yaml |
| basic_dayone.yaml |
@skip_editor # .TODO return after editor steps implemented
Scenario Outline: Increasing Headings on Markdown export
Given we use the config "<config_file>"
And we use the password "test" if prompted
When we open the editor and append
[2020-10-14 13:23] Heading Test
H1-1
=
H1-2
===
H1-3
============================
H2-1
-
H2-2
---
H2-3
----------------------------------
Horizontal Rules (ignore)
---
===
# ATX H1
## ATX H2
### ATX H3
#### ATX H4
##### ATX H5
###### ATX H6
Stuff
More stuff
more stuff again
When we run "jrnl -1 --export markdown"
Then the output should be
# 2020
## October
### 2020-10-14 13:23 Heading Test
#### H1-1
#### H1-2
#### H1-3
##### H2-1
##### H2-2
##### H2-3
Horizontal Rules (ignore)
---
===
#### ATX H1
##### ATX H2
###### ATX H3
####### ATX H4
######## ATX H5
######### ATX H6
Stuff
More stuff
more stuff again
Examples: configs
| config_file |
| basic_onefile.yaml |
| basic_encrypted.yaml |
| basic_folder.yaml |
# | basic_dayone.yaml | @todo
@skip_editor # .TODO return after editor steps implemented
Scenario Outline: Add a blank line to Markdown export if there isn't one already
# https://github.com/jrnl-org/jrnl/issues/768
# https://github.com/jrnl-org/jrnl/issues/881
Given we use the config "<config_file>"
And we use the password "test" if prompted
When we open the editor and append
[2020-10-29 11:11] First entry.
[2020-10-29 11:11] Second entry.
[2020-10-29 11:13] Third entry.
When we run "jrnl -3 --format markdown"
Then the output should be
# 2020
## October
### 2020-10-29 11:11 First entry.
### 2020-10-29 11:11 Second entry.
### 2020-10-29 11:13 Third entry.
Examples: configs
| config_file |
| basic_onefile.yaml |
| basic_encrypted.yaml |
| basic_folder.yaml |
# | basic_dayone.yaml | @todo
@skip
Scenario Outline: Exporting to XML
Given we use the config "<config_file>"
And we use the password "test" if prompted
When we run "jrnl --export xml"
Then the output should be a valid XML string
And "entries" in the xml output should have 3 elements
And "tags" in the xml output should contain
@ipsum
@tagone
@tagtwo
@tagthree
And there should be 10 "tag" elements
Examples: configs
| config_file |
# | basic_onefile.yaml | @todo
# | basic_encrypted.yaml | @todo
# | basic_folder.yaml | @todo
# | basic_dayone.yaml | @todo
Scenario: Exporting to XML
Given we use the config "tags.yaml"
And we use the password "test" if prompted
When we run "jrnl --export xml"
Then the output should be valid XML
Given we parse the output as XML
Then "entries" in the parsed output should have 2 elements
And "tags" in the parsed output should be
@idea
@journal
@dan
And there should be 7 "tag" elements
Scenario Outline: Exporting tags
Given we use the config "<config_file>"
And we use the password "test" if prompted
When we run "jrnl --export tags"
Then the output should be
@tagtwo : 2
@tagone : 2
@tagthree : 1
@ipsum : 1
Examples: configs
| config_file |
| basic_onefile.yaml |
| basic_encrypted.yaml |
| basic_folder.yaml |
| basic_dayone.yaml |
@todo
Scenario Outline: Exporting fancy
# Needs better emoji support
Given we use the config "<config_file>"
And we use the password "test" if prompted
When we run "jrnl --export fancy"
Then the output should be
2020-08-29 11:11
Entry the first.
Lorem @ipsum dolor sit amet, consectetur adipiscing elit. Praesent malesuada
quis est ac dignissim. Aliquam dignissim rutrum pretium. Phasellus
pellentesque
augue et venenatis facilisis. Suspendisse potenti. Sed dignissim sed nisl eu
consequat. Aenean ante ex, elementum ut interdum et, mattis eget lacus. In
commodo nulla nec tellus placerat, sed ultricies metus bibendum. Duis eget
venenatis erat. In at dolor dui. @tagone and maybe also @tagtwo.
Curabitur accumsan nunc ac neque tristique, eleifend faucibus justo
ullamcorper. Suspendisse at mattis nunc. Nullam eget lacinia urna.
Suspendisse
potenti. Ut urna est, venenatis sed ante in, ultrices congue mi. Maecenas
eget
molestie metus. Mauris porttitor dui ornare gravida porta. Quisque sed
lectus
hendrerit, lacinia ante eget, vulputate ante. Aliquam vitae erat non felis
feugiat sagittis. Phasellus quis arcu fringilla, mattis ligula id,
vestibulum
urna. Vivamus facilisis leo a mi tincidunt condimentum. Donec eu euismod
enim.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam eu ligula eget
velit scelerisque fringilla. Phasellus pharetra justo et nulla fringilla, ac
porta sapien accumsan. Class aptent taciti sociosqu ad litora torquent per
conubia nostra, per inceptos himenaeos.
2020-08-31 14:32
A second entry in what I hope to be a long series.
Sed sit amet metus et sapien feugiat elementum. Aliquam bibendum lobortis
leo
vitae tempus. Donec eleifend nec mi non volutpat. Lorem ipsum dolor sit
amet,
consectetur adipiscing elit. Praesent ut sodales libero. Maecenas nisl
lorem,
vestibulum in tempus sit amet, fermentum ut arcu. Donec vel vestibulum
lectus,
eget pretium enim. Maecenas diam nunc, imperdiet vitae pharetra sed, pretium
id
lectus. Donec eu metus et turpis tempor tristique ac non ex. In tellus arcu,
egestas at efficitur et, ultrices vel est. Sed commodo et nibh non
elementum.
Mauris tempus vitae neque vel viverra. @tagtwo all by its lonesome.
Nulla mattis elementum magna, viverra pretium dui fermentum et. Cras vel
vestibulum odio. Quisque sit amet turpis et urna finibus maximus. Interdum
et
malesuada fames ac ante ipsum primis in faucibus. Fusce porttitor iaculis
sem,
non dictum ipsum varius nec. Nulla eu erat at risus gravida blandit non vel
ante. Nam egestas ipsum leo, eu ultricies ipsum tincidunt vel. Morbi a
commodo
eros.
Nullam dictum, nisl ac varius tempus, ex tortor fermentum nisl, non
tempus dolor neque a lorem. Suspendisse a faucibus ex, vel ornare tortor.
Maecenas tincidunt id felis quis semper. Pellentesque enim libero, fermentum
quis metus id, rhoncus euismod magna. Nulla finibus velit eu purus bibendum
interdum. Integer id justo dui. Integer eu tellus in turpis bibendum
blandit.
Quisque auctor lacinia consectetur.
2020-09-24 09:14
The third entry finally after weeks without writing.
I'm so excited about emojis. 💯 🎶 💩
Donec semper pellentesque iaculis. Nullam cursus et justo sit amet
venenatis.
Vivamus tempus ex dictum metus vehicula gravida. Aliquam sed sem dolor.
Nulla
eget ultrices purus. Quisque at nunc at quam pharetra consectetur vitae quis
dolor. Fusce ultricies purus eu est feugiat, quis scelerisque nibh
malesuada.
Quisque egestas semper nibh in hendrerit. Nam finibus ex in mi mattis
vulputate. Sed mauris urna, consectetur in justo eu, volutpat accumsan
justo.
Phasellus aliquam lacus placerat convallis vestibulum. Curabitur maximus at
ante eget fringilla. @tagthree and also @tagone
Examples: configs
| config_file |
| basic_onefile.yaml |
| basic_encrypted.yaml |
| basic_folder.yaml |
| basic_dayone.yaml |
@skip_win
Scenario Outline: Export to yaml
Given we use the config "<config_file>"
And we use the password "test" if prompted
And we create a cache directory
When we run "jrnl --format yaml --file {cache_dir}"
Then the cache directory should contain the files
2020-08-29_entry-the-first.md
2020-08-31_a-second-entry-in-what-i-hope-to-be-a-long-series.md
2020-09-24_the-third-entry-finally-after-weeks-without-writing.md
And the content of file "2020-08-29_entry-the-first.md" in the cache should be
---
title: Entry the first.
date: 2020-08-29 11:11
starred: False
tags: tagone, ipsum, tagtwo
body: |
Lorem @ipsum dolor sit amet, consectetur adipiscing elit. Praesent malesuada
quis est ac dignissim. Aliquam dignissim rutrum pretium. Phasellus pellentesque
augue et venenatis facilisis. Suspendisse potenti. Sed dignissim sed nisl eu
consequat. Aenean ante ex, elementum ut interdum et, mattis eget lacus. In
commodo nulla nec tellus placerat, sed ultricies metus bibendum. Duis eget
venenatis erat. In at dolor dui. @tagone and maybe also @tagtwo.
Curabitur accumsan nunc ac neque tristique, eleifend faucibus justo
ullamcorper. Suspendisse at mattis nunc. Nullam eget lacinia urna. Suspendisse
potenti. Ut urna est, venenatis sed ante in, ultrices congue mi. Maecenas eget
molestie metus. Mauris porttitor dui ornare gravida porta. Quisque sed lectus
hendrerit, lacinia ante eget, vulputate ante. Aliquam vitae erat non felis
feugiat sagittis. Phasellus quis arcu fringilla, mattis ligula id, vestibulum
urna. Vivamus facilisis leo a mi tincidunt condimentum. Donec eu euismod enim.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam eu ligula eget
velit scelerisque fringilla. Phasellus pharetra justo et nulla fringilla, ac
porta sapien accumsan. Class aptent taciti sociosqu ad litora torquent per
conubia nostra, per inceptos himenaeos.
...
Examples: configs
| config_file |
| basic_onefile.yaml |
| basic_encrypted.yaml |
| basic_folder.yaml |
# | basic_dayone.yaml |
@skip_win # @todo YAML exporter does not correctly export emoji on Windows
Scenario Outline: Add a blank line to YAML export if there isn't one already
# https://github.com/jrnl-org/jrnl/issues/768
# https://github.com/jrnl-org/jrnl/issues/881
Given we use the config "<config_file>"
And we use the password "test" if prompted
And we create a cache directory
When we run "jrnl --export yaml -o {cache_dir}"
Then the cache should contain the files
2020-08-29_entry-the-first.md
2020-08-31_a-second-entry-in-what-i-hope-to-be-a-long-series.md
2020-09-24_the-third-entry-finally-after-weeks-without-writing.md
And the content of file "2020-09-24_the-third-entry-finally-after-weeks-without-writing.md" in the cache should be
---
title: The third entry finally after weeks without writing.
date: 2020-09-24 09:14
starred: False
tags: tagone, tagthree
body: |
I'm so excited about emojis. 💯 🎶 💩
Donec semper pellentesque iaculis. Nullam cursus et justo sit amet venenatis.
Vivamus tempus ex dictum metus vehicula gravida. Aliquam sed sem dolor. Nulla
eget ultrices purus. Quisque at nunc at quam pharetra consectetur vitae quis
dolor. Fusce ultricies purus eu est feugiat, quis scelerisque nibh malesuada.
Quisque egestas semper nibh in hendrerit. Nam finibus ex in mi mattis
vulputate. Sed mauris urna, consectetur in justo eu, volutpat accumsan justo.
Phasellus aliquam lacus placerat convallis vestibulum. Curabitur maximus at
ante eget fringilla. @tagthree and also @tagone
...
Examples: configs
| config_file |
| basic_onefile.yaml |
| basic_encrypted.yaml |
| basic_folder.yaml |
# | basic_dayone.yaml | @todo
Scenario: Empty DayOne entry bodies should not error
# https://github.com/jrnl-org/jrnl/issues/780
Given we use the config "bug780.yaml"
When we run "jrnl --short"
Then we should get no error
Scenario Outline: --short displays the short version of entries (only the title)
Given we use the config "<config_file>"
And we use the password "test" if prompted
When we run "jrnl -on 2020-08-31 --short"
Then the output should be "2020-08-31 14:32 A second entry in what I hope to be a long series."
Examples: configs
| config_file |
| basic_onefile.yaml |
| basic_encrypted.yaml |
| basic_folder.yaml |
| basic_dayone.yaml |
Scenario Outline: -s displays the short version of entries (only the title)
Given we use the config "<config_file>"
And we use the password "test" if prompted
When we run "jrnl -on 2020-08-31 -s"
Then the output should be "2020-08-31 14:32 A second entry in what I hope to be a long series."
Examples: configs
| config_file |
| basic_onefile.yaml |
| basic_encrypted.yaml |
| basic_folder.yaml |
| basic_dayone.yaml |
Scenario: Markdown Support from config file
Given we use the config "format_md.yaml"
When we run "jrnl -n 1"
Then the output should be
# 2013
## June
### 2013-06-10 15:40 Life is good.
But I'm better.
Scenario: Text Formatter from config file
Given we use the config "format_text.yaml"
When we run "jrnl -n 1"
Then the output should be
[2013-06-10 15:40] Life is good.
But I'm better.
Scenario Outline: Exporting entries with Cyrillic characters to directory should not fail
Given we use the config "<config_file>"
And we use the password "test" if prompted
And we create a cache directory
When we run "jrnl 2020-11-21: Первая"
When we run "jrnl --format md --file {cache_dir} -on 2020-11-21"
Then the cache should contain the files
2020-11-21_первая.md
Examples: configs
| config_file |
| basic_onefile.yaml |
| basic_encrypted.yaml |
| basic_folder.yaml |
| basic_dayone.yaml |
Scenario Outline: Export date counts
Given we use the config "<config_file>"
And we use the password "test" if prompted
When we run "jrnl 2020-08-31 01:01: Hi."
And we run "jrnl --format dates"
Then the output should be
2020-08-29, 1
2020-08-31, 2
2020-09-24, 1
Examples: configs
| config_file |
| basic_onefile.yaml |
| basic_encrypted.yaml |
| basic_folder.yaml |
| basic_dayone.yaml |

View file

@ -0,0 +1,88 @@
Feature: Importing data
Scenario Outline: --import allows new entry from stdin
Given we use the config "<config_file>"
And we use the password "test" if prompted
When we run "jrnl --import" and pipe "[2020-07-05 15:00] Observe and import."
When we run "jrnl -9 --short"
Then the output should contain "Observe and import"
Examples: Configs
| config_file |
| basic_onefile.yaml |
| basic_encrypted.yaml |
# | basic_folder.yaml | @todo
# | basic_dayone.yaml | @todo
Scenario Outline: --import allows new large entry from stdin
Given we use the config "<config_file>"
And we use the password "test" if prompted
When we run "jrnl --import" and pipe
[2020-07-05 15:00] Observe and import.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent malesuada quis
est ac dignissim. Aliquam dignissim rutrum pretium. Phasellus pellentesque augue
et venenatis facilisis. Suspendisse potenti. Sed dignissim sed nisl eu consequat.
Aenean ante ex, elementum ut interdum et, mattis eget lacus. In commodo nulla nec
tellus placerat, sed ultricies metus bibendum. Duis eget venenatis erat. In at
dolor dui end of entry.
When we run "jrnl -on 2020-07-05"
Then the output should contain "2020-07-05 15:00 Observe and import."
And the output should contain "Lorem ipsum"
And the output should contain "end of entry."
Examples: Configs
| config_file |
| basic_onefile.yaml |
| basic_encrypted.yaml |
# | basic_folder.yaml | @todo
# | basic_dayone.yaml | @todo
Scenario Outline: --import allows multiple new entries from stdin
Given we use the config "<config_file>"
And we use the password "test" if prompted
When we run "jrnl --import" and pipe
[2020-07-05 15:00] Observe and import.
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
[2020-07-05 15:01] Twice as nice.
Sed dignissim sed nisl eu consequat.
When we run "jrnl -on 2020-07-05"
Then the output should contain "2020-07-05 15:00 Observe and import."
And the output should contain "Lorem ipsum"
And the output should contain "2020-07-05 15:01 Twice as nice."
And the output should contain "Sed dignissim"
Examples: Configs
| config_file |
| basic_onefile.yaml |
| basic_encrypted.yaml |
# | basic_folder.yaml | @todo
# | basic_dayone.yaml | @todo
Scenario: --import allows import new entries from file
Given we use the config "simple.yaml"
When we run "jrnl -99"
Then the output should contain "My first entry."
And the output should contain "Life is good."
But the output should not contain "I have an @idea"
And the output should not contain "I met with"
When we run "jrnl --import --file features/journals/tags.journal"
And we run "jrnl -99"
Then the output should contain "My first entry."
And the output should contain "Life is good."
And the output should contain "PROFIT!"
Scenario: --import prioritizes --file over pipe data if both are given
Given we use the config "simple.yaml"
When we run "jrnl -99"
Then the output should contain "My first entry."
And the output should contain "Life is good."
But the output should not contain "I have an @idea"
And the output should not contain "I met with"
When we run "jrnl --import --file features/journals/tags.journal" and pipe
[2020-07-05 15:00] I should not exist!
And we run "jrnl -99"
Then the output should contain "My first entry."
And the output should contain "PROFIT!"
But the output should not contain "I should not exist!"

View file

@ -0,0 +1,90 @@
Feature: Multiple journals
Scenario: Loading a config with two journals
Given we use the config "multiple.yaml"
When we run "jrnl -99 --short"
Then the output should be
2013-06-09 15:39 My first entry.
2013-06-10 15:40 Life is good.
When we run "jrnl work -99 --short"
Then the output should be empty
Scenario: Write to default config by default
Given we use the config "multiple.yaml"
When we run "jrnl this goes to default"
When we run "jrnl -99 --short"
Then the output should contain
2013-06-09 15:39 My first entry.
2013-06-10 15:40 Life is good.
Then the output should contain
this goes to default
When we run "jrnl work -99 --short"
Then the output should be empty
Scenario: Write to specified journal
Given we use the config "multiple.yaml"
When we run "jrnl work a long day in the office"
When we run "jrnl -99 --short"
Then the output should be
2013-06-09 15:39 My first entry.
2013-06-10 15:40 Life is good.
When we run "jrnl work -99 --short"
Then the output should contain "a long day in the office"
Scenario: Tell user which journal was used
Given we use the config "multiple.yaml"
When we run "jrnl work a long day in the office"
Then we should see the message "Entry added to work journal"
Scenario: Write to specified journal with a timestamp
Given we use the config "multiple.yaml"
When we run "jrnl work 23 july 2012: a long day in the office"
When we run "jrnl -99 --short"
Then the output should be
2013-06-09 15:39 My first entry.
2013-06-10 15:40 Life is good.
When we run "jrnl work -99 --short"
Then the output should be
2012-07-23 09:00 a long day in the office
Scenario: Write to specified journal without a timestamp but with colon
Given we use the config "multiple.yaml"
When we run "jrnl work : a long day in the office"
Then the output should be
2013-06-09 15:39 My first entry.
2013-06-10 15:40 Life is good.
When we run "jrnl work -99 --short"
Then the output should be contain
a long day in the office
Scenario: Write to specified journal without a timestamp but with colon
Given we use the config "multiple.yaml"
When we run "jrnl work: a long day in the office"
When we run "jrnl -99 --short"
Then the output should be
2013-06-09 15:39 My first entry.
2013-06-10 15:40 Life is good.
When we run "jrnl work -99 --short"
Then the output should contain
a long day in the office
Scenario: Create new journals as required
Given we use the config "multiple.yaml"
Then journal "ideas" should not exist
When we run "jrnl ideas 23 july 2012: sell my junk on ebay and make lots of money"
When we run "jrnl ideas -99 --short"
Then the output should be
2012-07-23 09:00 sell my junk on ebay and make lots of money
Scenario: Don't crash if no default journal is specified
Given we use the config "bug343.yaml"
When we run "jrnl a long day in the office"
Then the output should contain "No default journal configured"
Scenario: Don't crash if no file exists for a configured encrypted journal
Given we use the config "multiple.yaml"
When we run "jrnl new_encrypted Adding first entry" and enter
these three eyes
these three eyes
n
Then the output should contain "Encrypted journal 'new_encrypted' created"

View file

@ -0,0 +1,122 @@
Feature: Using the installed keyring
Scenario: Storing a password in keyring
Given we use the config "multiple.yaml"
And we have a keyring
When we run "jrnl simple --encrypt" and enter
sabertooth
sabertooth
Y
Then the config for journal "simple" should contain "encrypt: true"
When we run "jrnl simple -n 1"
Then the output should contain "2013-06-10 15:40 Life is good"
Scenario: Encrypt journal with no keyring backend and do not store in keyring
Given we use the config "simple.yaml"
When we run "jrnl test entry"
And we run "jrnl --encrypt" and enter
password
password
n
Then we should get no error
And the output should not contain "Failed to retrieve keyring"
Scenario: Encrypt journal with no keyring backend and do store in keyring
Given we use the config "simple.yaml"
When we run "jrnl test entry"
And we run "jrnl --encrypt" and enter
password
password
y
Then we should get no error
And the output should not contain "Failed to retrieve keyring"
# @todo add step to check contents of keyring
@todo
Scenario: Open an encrypted journal with wrong password in keyring
# This should ask the user for the password after the keyring fails
@todo
Scenario: Decrypt journal with password in keyring
@todo
Scenario: Decrypt journal without a keyring
Scenario: Encrypt journal when keyring exists but fails
Given we use the config "simple.yaml"
And we have a failed keyring
When we run "jrnl --encrypt" and enter
this password will not be saved in keyring
this password will not be saved in keyring
y
Then we should see the message "Failed to retrieve keyring"
And we should get no error
And we should be prompted for a password
And the config for journal "default" should contain "encrypt: true"
Scenario: Decrypt journal when keyring exists but fails
Given we use the config "encrypted.yaml"
And we have a failed keyring
And we use the password "bad doggie no biscuit" if prompted
When we run "jrnl --decrypt"
Then the error output should contain "Failed to retrieve keyring"
And we should get no error
And we should be prompted for a password
And we should see the message "Journal decrypted"
And the config for journal "default" should contain "encrypt: false"
When we run "jrnl --short"
Then we should not be prompted for a password
And the output should be
2013-06-09 15:39 My first entry.
2013-06-10 15:40 Life is good.
Scenario: Open encrypted journal when keyring exists but fails
# This should ask the user for the password after the keyring fails
Given we use the config "encrypted.yaml"
And we have a failed keyring
And we use the password "bad doggie no biscuit" if prompted
When we run "jrnl -n 1"
Then we should get no error
And we should be prompted for a password
And the output should contain "Failed to retrieve keyring"
And the output should contain "2013-06-10 15:40 Life is good"
Scenario: Mistyping your password
Given we use the config "simple.yaml"
When we run "jrnl --encrypt" and enter
swordfish
sordfish
Then we should be prompted for a password
And we should see the message "Passwords did not match"
And the config for journal "default" should not contain "encrypt: true"
When we run "jrnl --short"
Then the output should be
2013-06-09 15:39 My first entry.
2013-06-10 15:40 Life is good.
Scenario: Mistyping your password, then getting it right
Given we use the config "simple.yaml"
When we run "jrnl --encrypt" and enter
swordfish
sordfish
swordfish
swordfish
n
Then we should be prompted for a password
And we should see the message "Passwords did not match"
And we should see the message "Journal encrypted"
And the config for journal "default" should contain "encrypt: true"
When we run "jrnl -1" and enter "swordfish"
Then we should be prompted for a password
And the output should contain "2013-06-10 15:40 Life is good"

View file

@ -0,0 +1,293 @@
Feature: Searching in a journal
Scenario Outline: Displaying entries using -on today should display entries created today
Given we use the config "<config_file>"
When we run "jrnl today: Adding an entry right now."
Then we should see the message "Entry added"
When we run "jrnl -on today"
Then the output should contain "Adding an entry right now."
But the output should not contain "Everything is alright"
And the output should not contain "Life is good"
Examples: configs
| config_file |
| simple.yaml |
| empty_folder.yaml |
| dayone.yaml |
Scenario Outline: Displaying entries using -from day should display correct entries
Given we use the config "<config_file>"
When we run "jrnl yesterday: This thing happened yesterday"
Then we should see the message "Entry added"
When we run "jrnl today at 11:59pm: Adding an entry right now."
Then we should see the message "Entry added"
When we run "jrnl tomorrow: A future entry."
Then we should see the message "Entry added"
When we run "jrnl -from today"
Then the output should contain "Adding an entry right now."
And the output should contain "A future entry."
And the output should not contain "This thing happened yesterday"
Examples: configs
| config_file |
| simple.yaml |
| empty_folder.yaml |
| dayone.yaml |
Scenario Outline: Displaying entries using -from and -to day should display correct entries
Given we use the config "<config_file>"
When we run "jrnl yesterday: This thing happened yesterday"
Then we should see the message "Entry added"
When we run "jrnl today at 11:59pm: Adding an entry right now."
Then we should see the message "Entry added"
When we run "jrnl tomorrow: A future entry."
Then we should see the message "Entry added"
When we run "jrnl -from yesterday -to today"
Then the output should contain "This thing happened yesterday"
And the output should contain "Adding an entry right now."
And the output should not contain "A future entry."
Examples: configs
| config_file |
| simple.yaml |
| empty_folder.yaml |
| dayone.yaml |
Scenario Outline: Searching for a string
Given we use the config "<config_file>"
When we run "jrnl -contains first --short"
Then we should get no error
And the output should be
2020-08-29 11:11 Entry the first.
Examples: configs
| config_file |
| basic_onefile.yaml |
| basic_folder.yaml |
| basic_dayone.yaml |
Scenario Outline: Searching for a string within tag results
Given we use the config "<config_file>"
When we run "jrnl @tagone -contains maybe"
Then we should get no error
And the output should contain "maybe"
Examples: configs
| config_file |
| basic_onefile.yaml |
| basic_folder.yaml |
| basic_dayone.yaml |
Scenario Outline: Searching for a string within AND tag results
Given we use the config "<config_file>"
When we run "jrnl -and @tagone @tagtwo -contains maybe"
Then we should get no error
And the output should contain "maybe"
Examples: configs
| config_file |
| basic_onefile.yaml |
| basic_folder.yaml |
| basic_dayone.yaml |
Scenario Outline: Searching for a string within NOT tag results
Given we use the config "<config_file>"
When we run "jrnl -not @tagone -contains lonesome"
Then we should get no error
And the output should contain "lonesome"
Examples: configs
| config_file |
| basic_onefile.yaml |
| basic_folder.yaml |
| basic_dayone.yaml |
Scenario Outline: Searching for dates
Given we use the config "<config_file>"
When we run "jrnl -on 2020-08-31 --short"
Then the output should be "2020-08-31 14:32 A second entry in what I hope to be a long series."
When we run "jrnl -on 'august 31 2020' --short"
Then the output should be "2020-08-31 14:32 A second entry in what I hope to be a long series."
Examples: configs
| config_file |
| basic_onefile.yaml |
| basic_folder.yaml |
| basic_dayone.yaml |
Scenario: Out of order entries to a Folder journal should be listed in date order
Given we use the config "empty_folder.yaml"
When we run "jrnl 3/7/2014 4:37pm: Second entry of journal."
Then we should see the message "Entry added"
When we run "jrnl 23 July 2013: Testing folder journal."
Then we should see the message "Entry added"
When we run "jrnl -2"
Then the output should be
2013-07-23 09:00 Testing folder journal.
2014-03-07 16:37 Second entry of journal.
Scenario Outline: Searching for all tags should show counts of each tag
Given we use the config "<config_file>"
When we run "jrnl --tags"
Then we should get no error
And the output should be
@tagtwo : 2
@tagone : 2
@tagthree : 1
@ipsum : 1
Examples: configs
| config_file |
| basic_onefile.yaml |
| basic_folder.yaml |
| basic_dayone.yaml |
Scenario Outline: Filtering journals should also filter tags
Given we use the config "<config_file>"
When we run "jrnl -from 'september 2020' --tags"
Then we should get no error
And the output should be
@tagthree : 1
@tagone : 1
Examples: configs
| config_file |
| basic_onefile.yaml |
| basic_folder.yaml |
| basic_dayone.yaml |
Scenario Outline: Excluding a tag should filter out all entries with that tag
Given we use the config "<config_file>"
When we run "jrnl --tags -not @tagtwo"
Then the output should be
@tagthree : 1
@tagone : 1
Examples: configs
| config_file |
| basic_onefile.yaml |
| basic_folder.yaml |
| basic_dayone.yaml |
Scenario Outline: Excluding multiple tags should filter out all entries with those tags
Given we use the config "<config_file>"
When we run "jrnl --tags -not @tagone -not @tagthree"
Then the output should be
@tagtwo : 1
Examples: configs
| config_file |
| basic_onefile.yaml |
| basic_folder.yaml |
| basic_dayone.yaml |
Scenario: DayOne tag searching should work with tags containing a mixture of upper and lower case.
# https://github.com/jrnl-org/jrnl/issues/354
Given we use the config "dayone.yaml"
When we run "jrnl @plAy"
Then the output should contain "2013-05-17 11:39 This entry has tags!"
Scenario: Loading a sample journal
Given we use the config "simple.yaml"
When we run "jrnl -2"
Then we should get no error
And the output should be
2013-06-09 15:39 My first entry.
| Everything is alright
2013-06-10 15:40 Life is good.
| But I'm better.
Scenario Outline: Searching by month
Given we use the config "<config_file>"
And we use the password "test" if prompted
When we run "jrnl -month 9 --short"
Then the output should be "2020-09-24 09:14 The third entry finally after weeks without writing."
When we run "jrnl -month Sept --short"
Then the output should be "2020-09-24 09:14 The third entry finally after weeks without writing."
When we run "jrnl -month September --short"
Then the output should be "2020-09-24 09:14 The third entry finally after weeks without writing."
Examples: configs
| config_file |
| basic_onefile.yaml |
| basic_encrypted.yaml |
| basic_folder.yaml |
| basic_dayone.yaml |
Scenario Outline: Searching by day
Given we use the config "<config_file>"
And we use the password "test" if prompted
When we run "jrnl -day 31 --short"
Then the output should be "2020-08-31 14:32 A second entry in what I hope to be a long series."
Examples: configs
| config_file |
| basic_onefile.yaml |
| basic_encrypted.yaml |
| basic_folder.yaml |
| basic_dayone.yaml |
Scenario Outline: Searching by year
Given we use the config "<config_file>"
And we use the password "test" if prompted
When we run "jrnl 2019-01-01 01:01: I like this year."
And we run "jrnl -year 2019 --short"
Then the output should be "2019-01-01 01:01 I like this year."
When we run "jrnl -year 19 --short"
Then the output should be "2019-01-01 01:01 I like this year."
Examples: configs
| config_file |
| basic_onefile.yaml |
| basic_encrypted.yaml |
| basic_folder.yaml |
| basic_dayone.yaml |
Scenario Outline: Combining month, day, and year search terms
Given we use the config "<config_file>"
And we use the password "test" if prompted
When we run "jrnl -month 08 -day 29 --short"
Then the output should be "2020-08-29 11:11 Entry the first."
When we run "jrnl -day 29 -year 2020 --short"
Then the output should be "2020-08-29 11:11 Entry the first."
When we run "jrnl -month 09 -year 2020 --short"
Then the output should be "2020-09-24 09:14 The third entry finally after weeks without writing."
When we run "jrnl -month 08 -day 29 -year 2020 --short"
Then the output should be "2020-08-29 11:11 Entry the first."
Examples: configs
| config_file |
| basic_onefile.yaml |
| basic_encrypted.yaml |
| basic_folder.yaml |
| basic_dayone.yaml |
Scenario Outline: Searching today in history
Given we use the config "<config_file>"
And we use the password "test" if prompted
And now is "2020-08-31 02:32:00 PM"
When we run "jrnl 2019-08-31 01:01: Hi, from last year."
And we run "jrnl -today-in-history --short"
Then the output should be
2019-08-31 01:01 Hi, from last year.
2020-08-31 14:32 A second entry in what I hope to be a long series.
Examples: configs
| config_file |
| basic_onefile.yaml |
| basic_encrypted.yaml |
| basic_folder.yaml |
| basic_dayone.yaml |
Scenario: Loading a DayOne Journal
Given we use the config "dayone.yaml"
When we run "jrnl -from 'feb 2013'"
Then we should get no error
And the output should be
2013-05-17 11:39 This entry has tags!
2013-06-17 20:38 This entry has a location.
2013-07-17 11:38 This entry is starred!

View file

@ -0,0 +1,35 @@
Feature: Starring entries
Scenario Outline: Starring an entry will mark it in the journal file
Given we use the config "<config_file>"
When we run "jrnl 20 july 2013 *: Best day of my life!"
Then we should see the message "Entry added"
When we run "jrnl -on 2013-07-20 -starred"
Then the output should contain "2013-07-20 09:00 Best day of my life!"
Examples: configs
| config_file |
| simple.yaml |
| empty_folder.yaml |
| dayone.yaml |
Scenario Outline: Filtering by starred entries will show only starred entries
Given we use the config "<config_file>"
When we run "jrnl -starred"
Then the output should be empty
When we run "jrnl 20 july 2013 *: Best day of my life!"
When we run "jrnl -starred"
Then the output should be "2013-07-20 09:00 Best day of my life!"
Examples: configs
| config_file |
| simple.yaml |
| empty_folder.yaml |
| dayone_empty.yaml |
Scenario: Starring an entry will mark it in an encrypted journal
Given we use the config "encrypted.yaml"
When we run "jrnl 20 july 2013 *: Best day of my life!" and enter "bad doggie no biscuit"
Then we should see the message "Entry added"
When we run "jrnl -on 2013-07-20 -starred" and enter "bad doggie no biscuit"
Then the output should contain "2013-07-20 09:00 Best day of my life!"

View file

@ -0,0 +1,48 @@
Feature: Tagging
# See search.feature for tag-related searches
# And format.feature for tag-related output
Scenario Outline: Tags should allow certain special characters such as /, +, #
Given we use the config "<config_file>"
When we run "jrnl 2020-09-26: This is an entry about @os/2 and @c++ and @c#"
When we run "jrnl --tags -on 2020-09-26"
Then we should get no error
And the output should be
@os/2 : 1
@c++ : 1
@c# : 1
Examples: configs
| config_file |
| basic_onefile.yaml |
| basic_folder.yaml |
| basic_dayone.yaml |
Scenario Outline: Emails addresses should not be parsed as tags
Given we use the config "<config_file>"
When we run "jrnl 2020-09-26: The email address test@example.com does not seem to work for me"
When we run "jrnl 2020-09-26: The email address test@example.org also does not work for me"
When we run "jrnl 2020-09-26: I tried test@example.org and test@example.edu too"
When we run "jrnl --tags -on 2020-09-26"
Then we should get no error
And the output should be "[No tags found in journal.]"
Examples: configs
| config_file |
| basic_onefile.yaml |
| basic_folder.yaml |
| basic_dayone.yaml |
Scenario Outline: Entry can start and end with tags
Given we use the config "<config_file>"
When we run "jrnl 2020-09-26: @foo came over, we went to a @bar"
When we run "jrnl --tags -on 2020-09-26"
Then the output should be
@foo : 1
@bar : 1
Examples: configs
| config_file |
| basic_onefile.yaml |
| basic_folder.yaml |
| basic_dayone.yaml |

View file

@ -0,0 +1,54 @@
Feature: Upgrading Journals from 1.x.x to 2.x.x
Scenario: Upgrade and parse journals with square brackets
Given we use the config "upgrade_from_195.json"
When we run "jrnl -9" and enter "Y"
When we run "jrnl -99 --short"
Then the output should be
2010-06-10 15:00 A life without chocolate is like a bad analogy.
2013-06-10 15:40 He said "[this] is the best time to be alive".Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent malesuada
And the output should contain
2010-06-10 15:00 A life without chocolate is like a bad analogy.
And the output should contain
2013-06-10 15:40 He said "[this] is the best time to be alive".
Scenario: Upgrading a journal encrypted with jrnl 1.x
Given we use the config "encrypted_old.json"
When we run "jrnl -n 1" and enter
Y
bad doggie no biscuit
bad doggie no biscuit
Then we should be prompted for a password
And the output should contain "2013-06-10 15:40 Life is good"
Scenario: Upgrading a config without colors to colors
Given we use the config "no_colors.yaml"
When we run "jrnl -n 1"
Then the config should contain
colors:
date: none
title: none
body: none
tags: none
Scenario: Upgrade and parse journals with little endian date format
Given we use the config "upgrade_from_195_little_endian_dates.json"
When we run "jrnl -9 --short" and enter "Y"
Then the output should contain
10.06.2010 15:00 A life without chocolate is like a bad analogy.
10.06.2013 15:40 He said "[this] is the best time to be alive".
Scenario: Upgrade with missing journal
Given we use the config "upgrade_from_195_with_missing_journal.json"
When we run "jrnl --list" and enter "Y"
Then the output should contain "Error: features/journals/missing.journal does not exist."
And we should get no error
Scenario: Upgrade with missing encrypted journal
Given we use the config "upgrade_from_195_with_missing_encrypted_journal.json"
When we run "jrnl --list" and enter
Y
bad doggie no biscuit
Then the output should contain "Error: features/journals/missing.journal does not exist."
And the output should contain "We're all done"
And we should get no error

View file

@ -0,0 +1,213 @@
Feature: Writing new entries.
Scenario Outline: Multiline entry with punctuation should keep title punctuation
Given we use the config "<config_file>"
And we use the password "bad doggie no biscuit" if prompted
When we run "jrnl This is. the title\\n This is the second line"
And we run "jrnl -n 1"
Then the output should contain "This is. the title"
Examples: configs
| config_file |
| simple.yaml |
| empty_folder.yaml |
| dayone.yaml |
| encrypted.yaml |
Scenario Outline: Single line entry with period should be split at period
Given we use the config "<config_file>"
And we use the password "test" if prompted
When we run "jrnl This is. the title"
And we run "jrnl -1"
Then the output should contain "| the title"
Examples: configs
| config_file |
| basic_onefile.yaml |
| basic_encrypted.yaml |
| basic_folder.yaml |
| basic_dayone.yaml |
Scenario Outline: CJK entry should be split at fullwidth period without following space.
Given we use the config "<config_file>"
And we use the password "test" if prompted
When we run "jrnl "
And we run "jrnl -1"
Then the output should contain "| "
Examples: configs
| config_file |
| basic_onefile.yaml |
| basic_encrypted.yaml |
| basic_folder.yaml |
| basic_dayone.yaml |
Scenario Outline: Writing an entry from command line should store the entry
Given we use the config "<config_file>"
And we use the password "bad doggie no biscuit" if prompted
When we run "jrnl 23 july 2013: A cold and stormy day. I ate crisps on the sofa."
Then we should see the message "Entry added"
When we run "jrnl -n 1"
Then the output should contain "2013-07-23 09:00 A cold and stormy day."
Examples: configs
| config_file |
| simple.yaml |
| empty_folder.yaml |
| dayone.yaml |
| encrypted.yaml |
Scenario Outline: Writing a partial entry from command line with edit flag should go to the editor
Given we use the config "<config_file>"
And we use the password "test" if prompted
When we run "jrnl this is a partial --edit"
Then we should see the message "Entry added"
Then the editor should have been called
And the editor file content should be
this is a partial
Examples: configs
| config_file |
| basic_onefile.yaml |
| basic_encrypted.yaml |
| basic_dayone.yaml |
| basic_folder.yaml |
Scenario Outline: Writing an empty entry from the editor should yield "Nothing saved to file" message
Given we use the config "<config_file>"
And we write nothing to the editor if opened
And we use the password "test" if prompted
When we run "jrnl --edit"
Then the error output should contain "[Nothing saved to file]"
And the editor should have been called
Examples: configs
| config_file |
| editor.yaml |
| editor_empty_folder.yaml |
| dayone.yaml |
| basic_encrypted.yaml |
| basic_onefile.yaml |
@skip
Scenario Outline: Writing an empty entry from the command line with no editor should yield nothing
Given we use the config "<config_file>"
And we use the password "bad doggie no biscuit" if prompted
When we run "jrnl" and enter nothing
Then the output should be empty
And the error output should contain "Writing Entry; on a blank line"
And the editor should not have been called
Examples: configs
| config_file |
| config_simple.yaml |
| empty_folder.yaml |
| encrypted.yaml |
# | dayone | @todo
Scenario Outline: Writing an entry does not print the entire journal
# https://github.com/jrnl-org/jrnl/issues/87
Given we use the config "<config_file>"
And we use the password "bad doggie no biscuit" if prompted
When we run "jrnl 23 july 2013: A cold and stormy day. I ate crisps on the sofa."
Then we should see the message "Entry added"
When we run "jrnl -n 1"
Then the output should not contain "Life is good"
Examples: configs
| config_file |
| editor.yaml |
| editor_empty_folder.yaml |
| dayone.yaml |
| encrypted.yaml |
Scenario Outline: Embedded period stays in title
Given we use the config "<config_file>"
And we use the password "bad doggie no biscuit" if prompted
When we run "jrnl 04-24-2014: Created a new website - empty.com. Hope to get a lot of traffic."
Then we should see the message "Entry added"
When we run "jrnl -1"
Then the output should be
2014-04-24 09:00 Created a new website - empty.com.
| Hope to get a lot of traffic.
Examples: configs
| config_file |
| simple.yaml |
| empty_folder.yaml |
| dayone.yaml |
| encrypted.yaml |
Scenario Outline: Write and read emoji support
Given we use the config "<config_file>"
And we use the password "bad doggie no biscuit" if prompted
When we run "jrnl 23 july 2013: 🌞 sunny day. Saw an 🐘"
Then we should see the message "Entry added"
When we run "jrnl -n 1"
Then the output should contain "🌞"
And the output should contain "🐘"
Examples: configs
| config_file |
| simple.yaml |
| empty_folder.yaml |
| dayone.yaml |
| encrypted.yaml |
Scenario Outline: Writing an entry at the prompt (no editor) should store the entry
Given we use the config "<config_file>"
And we use the password "bad doggie no biscuit" if prompted
When we run "jrnl" and enter "25 jul 2013: I saw Elvis. He's alive."
Then we should get no error
When we run "jrnl -on '2013-07-25'"
Then the output should contain "2013-07-25 09:00 I saw Elvis."
And the output should contain "| He's alive."
Examples: configs
| config_file |
| simple.yaml |
| empty_folder.yaml |
| encrypted.yaml |
@todo
Scenario: Writing an entry at the prompt (no editor) in DayOne journal
# Need to test DayOne w/out an editor
Scenario: Writing into Dayone
Given we use the config "dayone.yaml"
When we run "jrnl 01 may 1979: Being born hurts."
And we run "jrnl -until 1980"
Then the output should be "1979-05-01 09:00 Being born hurts."
Scenario: Writing into Dayone adds extended metadata
Given we use the config "dayone.yaml"
When we run "jrnl 01 may 1979: Being born hurts."
And we run "jrnl --export json"
Then we should get no error
And the output should be valid JSON
Given we parse the output as JSON
Then "entries" in the parsed output should have 5 elements
And "entries.0.creator" in the parsed output should be
software_agent
os_agent
host_name
generation_date
device_agent
And "entries.0.creator.software_agent" in the parsed output should contain
jrnl
Scenario: Title with an embedded period on DayOne journal
Given we use the config "dayone.yaml"
When we run "jrnl 04-24-2014: Ran 6.2 miles today in 1:02:03. I am feeling sore because I forgot to stretch."
Then we should see the message "Entry added"
When we run "jrnl -1"
Then the output should be
2014-04-24 09:00 Ran 6.2 miles today in 1:02:03.
| I am feeling sore because I forgot to stretch.
Scenario: Opening an folder that's not a DayOne folder should treat as folder journal
Given we use the config "empty_folder.yaml"
When we run "jrnl 23 july 2013: Testing folder journal."
Then we should see the message "Entry added"
When we run "jrnl -1"
Then the output should be "2013-07-23 09:00 Testing folder journal."

View file

@ -0,0 +1,17 @@
from pytest_bdd import scenarios
scenarios("features/build.feature")
scenarios("features/core.feature")
scenarios("features/datetime.feature")
scenarios("features/delete.feature")
scenarios("features/encrypt.feature")
scenarios("features/file_storage.feature")
scenarios("features/format.feature")
scenarios("features/import.feature")
scenarios("features/multiple_journals.feature")
scenarios("features/password.feature")
scenarios("features/search.feature")
scenarios("features/star.feature")
scenarios("features/tag.feature")
scenarios("features/upgrade.feature")
scenarios("features/write.feature")

29
tests/conftest.py Normal file
View file

@ -0,0 +1,29 @@
# Copyright (C) 2012-2021 jrnl contributors
# License: https://www.gnu.org/licenses/gpl-3.0.html
from pytest import mark
from jrnl.os_compat import on_windows
pytest_plugins = [
"tests.lib.fixtures",
"tests.lib.given_steps",
"tests.lib.when_steps",
"tests.lib.then_steps",
]
def pytest_bdd_apply_tag(tag, function):
if tag == "skip_win":
marker = mark.skipif(on_windows(), reason="Skip test on Windows")
elif tag == "skip_editor":
marker = mark.skip(
reason="Skipping editor-related test. We should come back to this!"
)
else:
# Fall back to pytest-bdd's default behavior
return None
marker(function)
return True

View file

@ -0,0 +1,17 @@
colors:
date: none
title: none
body: none
tags: none
default_hour: 9
default_minute: 0
editor: noop
encrypt: false
highlight: true
journals:
default: features/journals/basic_dayone.dayone
linewrap: 80
tagsymbols: "@"
template: false
timeformat: "%Y-%m-%d %H:%M"
indent_character: "|"

View file

@ -0,0 +1,17 @@
colors:
date: none
title: none
body: none
tags: none
default_hour: 9
default_minute: 0
editor: noop
encrypt: true
highlight: true
journals:
default: features/journals/basic_encrypted.journal
linewrap: 80
tagsymbols: "@"
template: false
timeformat: "%Y-%m-%d %H:%M"
indent_character: "|"

View file

@ -0,0 +1,17 @@
colors:
date: none
title: none
body: none
tags: none
default_hour: 9
default_minute: 0
editor: noop
encrypt: false
highlight: true
journals:
default: features/journals/basic_folder
linewrap: 80
tagsymbols: "@"
template: false
timeformat: "%Y-%m-%d %H:%M"
indent_character: "|"

View file

@ -0,0 +1,17 @@
colors:
date: none
title: none
body: none
tags: none
default_hour: 9
default_minute: 0
editor: noop
encrypt: false
highlight: true
journals:
default: features/journals/basic_onefile.journal
linewrap: 80
tagsymbols: "@"
template: false
timeformat: "%Y-%m-%d %H:%M"
indent_character: "|"

View file

@ -0,0 +1,12 @@
default_hour: 9
default_minute: 0
editor: ""
encrypt: false
highlight: true
journals:
default: features/journals/brackets.journal
linewrap: 80
tagsymbols: "@"
template: false
timeformat: "%Y-%m-%d %H:%M"
indent_character: "|"

View file

@ -0,0 +1,17 @@
default_hour: 9
default_minute: 0
editor: ''
encrypt: false
highlight: true
journals:
default: features/journals/bug153.dayone
linewrap: 80
tagsymbols: '@'
template: false
timeformat: '%Y-%m-%d %H:%M'
indent_character: "|"
colors:
date: none
title: none
body: none
tags: none

View file

@ -0,0 +1,13 @@
default_hour: 9
default_minute: 0
editor: ''
template: false
encrypt: false
highlight: true
journals:
simple: features/journals/simple.journal
work: features/journals/work.journal
linewrap: 80
tagsymbols: '@'
timeformat: '%Y-%m-%d %H:%M'
indent_character: "|"

View file

@ -0,0 +1,12 @@
default_hour: 9
default_minute: 0
editor: ''
encrypt: false
highlight: true
journals:
default: features/journals/bug780.dayone
linewrap: 80
tagsymbols: '@'
template: false
timeformat: '%Y-%m-%d %H:%M'
indent_character: "|"

View file

@ -0,0 +1,12 @@
default_hour: 9
default_minute: 0
editor: noop
template: false
encrypt: false
highlight: true
journals:
default: features/journals/dayone.dayone
linewrap: 80
tagsymbols: '@'
timeformat: '%Y-%m-%d %H:%M'
indent_character: "|"

View file

@ -0,0 +1,17 @@
default_hour: 9
default_minute: 0
editor: noop
template: false
encrypt: false
highlight: true
journals:
default: features/journals/dayone_empty.dayone
linewrap: 80
tagsymbols: '@'
timeformat: '%Y-%m-%d %H:%M'
indent_character: "|"
colors:
date: none
title: none
body: none
tags: none

View file

@ -0,0 +1,12 @@
default_hour: 9
default_minute: 0
editor: ""
encrypt: false
highlight: true
journals:
default: features/journals/deletion.journal
linewrap: 80
tagsymbols: "@"
template: false
timeformat: "%Y-%m-%d %H:%M"
indent_character: "|"

View file

@ -0,0 +1,12 @@
default_hour: 9
default_minute: 0
editor: ""
encrypt: false
highlight: true
journals:
default: features/journals/deletion_filters.journal
linewrap: 80
tagsymbols: "@"
template: false
timeformat: "%Y-%m-%d %H:%M"
indent_character: "|"

View file

@ -0,0 +1,12 @@
default_hour: 9
default_minute: 0
editor: vim -f -c 'setf markdown'
encrypt: false
highlight: true
journals:
default: features/journals/simple.journal
linewrap: 80
tagsymbols: "@"
template: false
timeformat: "%Y-%m-%d %H:%M"
indent_character: "|"

View file

@ -0,0 +1,12 @@
default_hour: 9
default_minute: 0
editor: "vim"
encrypt: false
highlight: true
journals:
default: features/journals/simple.journal
linewrap: 80
tagsymbols: "@"
template: false
timeformat: "%Y-%m-%d %H:%M"
indent_character: "|"

View file

@ -0,0 +1,12 @@
default_hour: 9
default_minute: 0
editor: 'vim'
template: false
encrypt: false
highlight: true
journals:
default: features/journals/empty_folder
linewrap: 80
tagsymbols: '@'
timeformat: '%Y-%m-%d %H:%M'
indent_character: "|"

View file

@ -0,0 +1,17 @@
colors:
body: green
date: blue
tags: none
title: yellow
default_hour: 9
default_minute: 0
editor: "vim"
encrypt: true
template: false
highlight: true
journals:
default: features/journals/encrypted.journal
linewrap: 80
tagsymbols: '@'
timeformat: '%Y-%m-%d %H:%M'
indent_character: "|"

View file

@ -0,0 +1,18 @@
default_hour: 9
default_minute: 0
editor: ""
encrypt: false
highlight: true
editor: "vim"
journals:
default: features/journals/editor_markdown_extension.journal
linewrap: 80
tagsymbols: "@"
template: features/templates/extension.md
timeformat: "%Y-%m-%d %H:%M"
indent_character: "|"
colors:
date: none
title: none
body: none
tags: none

View file

@ -0,0 +1,12 @@
default_hour: 9
default_minute: 0
editor: ''
template: false
encrypt: false
highlight: true
journals:
default: features/journals/empty_folder
linewrap: 80
tagsymbols: '@'
timeformat: '%Y-%m-%d %H:%M'
indent_character: "|"

View file

@ -0,0 +1,12 @@
default_hour: 9
default_minute: 0
editor: ''
encrypt: true
template: false
highlight: true
journals:
default: features/journals/encrypted.journal
linewrap: 80
tagsymbols: '@'
timeformat: '%Y-%m-%d %H:%M'
indent_character: "|"

View file

@ -0,0 +1,13 @@
{
"default_hour": 9,
"default_minute": 0,
"editor": "",
"encrypt": true,
"highlight": true,
"journals": {
"default": "features/journals/encrypted_jrnl-1-9-5.journal"
},
"linewrap": 80,
"tagsymbols": "@",
"timeformat": "%Y-%m-%d %H:%M"
}

View file

@ -0,0 +1,11 @@
default_hour: 9
default_minute: 0
editor: ''
encrypt: true
highlight: true
journals:
default: features/journals/encrypted_jrnl1-9-5.journal
linewrap: 80
tagsymbols: '@'
timeformat: '%Y-%m-%d %H:%M'
indent_character: "|"

View file

@ -0,0 +1,19 @@
colors:
body: none
date: none
tags: none
title: none
default_hour: 9
default_minute: 0
display_format: markdown
editor: ''
encrypt: false
highlight: true
indent_character: '|'
journals:
default: features/journals/simple.journal
linewrap: 80
tagsymbols: '@'
template: false
timeformat: '%Y-%m-%d %H:%M'
version: v2.4.5

View file

@ -0,0 +1,19 @@
colors:
body: none
date: none
tags: none
title: none
default_hour: 9
default_minute: 0
display_format: text
editor: ''
encrypt: false
highlight: true
indent_character: '|'
journals:
default: features/journals/simple.journal
linewrap: 80
tagsymbols: '@'
template: false
timeformat: '%Y-%m-%d %H:%M'
version: v2.4.5

View file

@ -0,0 +1,17 @@
default_hour: 9
default_minute: 0
editor: ""
encrypt: false
highlight: true
journals:
default: features/journals/simple.journal
linewrap: 80
tagsymbols: "@"
template: false
timeformat: "%Y-%m-%d %H:%M"
indent_character: "|"
colors:
date: not-a-color
title: also-not-a-color
body: still-no-color
tags: me-too

View file

@ -0,0 +1,12 @@
default_hour: 9
default_minute: 0
editor: ""
encrypt: false
highlight: true
journals:
default: features/journals/little_endian_dates.journal
linewrap: 80
tagsymbols: "@"
template: false
timeformat: "%d.%m.%Y %H:%M"
indent_character: "|"

View file

@ -0,0 +1,17 @@
default_hour: 9
default_minute: 0
editor: ''
encrypt: false
highlight: true
template: false
journals:
default: features/journals/markdown-headings-335.journal
linewrap: 80
tagsymbols: '@'
timeformat: '%Y-%m-%d %H:%M'
indent_character: "|"
colors:
date: none
title: none
body: none
tags: none

View file

@ -0,0 +1,17 @@
default_hour: 9
default_minute: 0
editor: ""
encrypt: false
highlight: true
journals:
default: features/journals/missing_directory/simple.journal
linewrap: 80
tagsymbols: "@"
template: false
timeformat: "%Y-%m-%d %H:%M"
indent_character: "|"
colors:
date: none
title: none
body: none
tags: none

View file

@ -0,0 +1,17 @@
default_hour: 9
default_minute: 0
editor: ""
encrypt: false
highlight: true
journals:
default: features/journals/missing.journal
linewrap: 80
tagsymbols: "@"
template: false
timeformat: "%Y-%m-%d %H:%M"
indent_character: "|"
colors:
date: none
title: none
body: none
tags: none

View file

@ -0,0 +1,12 @@
default_hour: 9
default_minute: 0
editor: ""
encrypt: false
highlight: true
journals:
default: features/journals/mostlyreadabledates.journal
linewrap: 80
tagsymbols: "@"
template: false
timeformat: "%Y-%m-%d %H:%M"
indent_character: "|"

View file

@ -0,0 +1,17 @@
default_hour: 9
default_minute: 0
editor: ""
encrypt: false
highlight: true
journals:
default: features/journals/multiline-tags.journal
linewrap: 80
tagsymbols: "@"
template: false
timeformat: "%Y-%m-%d %H:%M"
indent_character: "|"
colors:
date: none
title: none
body: none
tags: none

View file

@ -0,0 +1,17 @@
default_hour: 9
default_minute: 0
editor: ""
encrypt: false
highlight: true
journals:
default: features/journals/multiline.journal
linewrap: 80
tagsymbols: "@"
template: false
timeformat: "%Y-%m-%d %H:%M"
indent_character: "|"
colors:
date: none
title: none
body: none
tags: none

View file

@ -0,0 +1,18 @@
default_hour: 9
default_minute: 0
editor: ''
encrypt: false
highlight: true
template: false
journals:
default: features/journals/simple.journal
ideas: features/journals/does-not-exist.journal
simple: features/journals/simple.journal
work: features/journals/work.journal
new_encrypted:
encrypt: true
journal: features/journals/new_encrypted.journal
linewrap: 80
tagsymbols: '@'
timeformat: '%Y-%m-%d %H:%M'
indent_character: "|"

View file

@ -0,0 +1,12 @@
default_hour: 9
default_minute: 0
editor: ""
encrypt: false
highlight: true
journals:
default: features/journals/simple.journal
linewrap: 80
tagsymbols: "@"
template: false
timeformat: "%Y-%m-%d %H:%M"
indent_character: "|"

View file

@ -0,0 +1,17 @@
default_hour: 9
default_minute: 0
editor: ""
encrypt: false
highlight: true
journals:
default: features/journals/simple.journal
linewrap: 80
tagsymbols: "@"
template: false
timeformat: "%Y-%m-%d %H:%M"
indent_character: "|"
colors:
date: none
title: none
body: none
tags: none

View file

@ -0,0 +1,17 @@
default_hour: 9
default_minute: 0
editor: ''
encrypt: false
highlight: true
template: false
journals:
default: features/journals/tags-216.journal
linewrap: 80
tagsymbols: '@'
timeformat: '%Y-%m-%d %H:%M'
indent_character: "|"
colors:
date: none
title: none
body: none
tags: none

View file

@ -0,0 +1,17 @@
default_hour: 9
default_minute: 0
editor: ''
encrypt: false
highlight: true
template: false
journals:
default: features/journals/tags-237.journal
linewrap: 80
tagsymbols: '@'
timeformat: '%Y-%m-%d %H:%M'
indent_character: "|"
colors:
date: none
title: none
body: none
tags: none

View file

@ -0,0 +1,17 @@
default_hour: 9
default_minute: 0
editor: ''
encrypt: false
highlight: true
template: false
journals:
default: features/journals/tags.journal
linewrap: 80
tagsymbols: '@'
timeformat: '%Y-%m-%d %H:%M'
indent_character: "|"
colors:
date: none
title: none
body: none
tags: none

View file

@ -0,0 +1,17 @@
default_hour: 9
default_minute: 0
editor: ""
encrypt: false
highlight: true
journals:
default: features/journals/unreadabledates.journal
linewrap: 80
tagsymbols: "@"
template: false
timeformat: "%Y-%m-%d %H:%M"
indent_character: "|"
colors:
date: none
title: none
body: none
tags: none

View file

@ -0,0 +1,11 @@
{
"default_hour": 9,
"timeformat": "%Y-%m-%d %H:%M",
"linewrap": 80,
"encrypt": false,
"editor": "",
"default_minute": 0,
"highlight": true,
"journals": {"default": "features/journals/simple_jrnl-1-9-5.journal"},
"tagsymbols": "@"
}

View file

@ -0,0 +1,11 @@
{
"default_hour": 9,
"timeformat": "%d.%m.%Y %H:%M",
"linewrap": 80,
"encrypt": false,
"editor": "",
"default_minute": 0,
"highlight": true,
"journals": {"default": "features/journals/simple_jrnl-1-9-5_little_endian_dates.journal"},
"tagsymbols": "@"
}

View file

@ -0,0 +1,11 @@
{
"default_hour": 9,
"timeformat": "%Y-%m-%d %H:%M",
"linewrap": 80,
"encrypt": true,
"editor": "",
"default_minute": 0,
"highlight": true,
"journals": {"default": "features/journals/encrypted_jrnl-1-9-5.journal", "missing": "features/journals/missing.journal"},
"tagsymbols": "@"
}

View file

@ -0,0 +1,11 @@
{
"default_hour": 9,
"timeformat": "%Y-%m-%d %H:%M",
"linewrap": 80,
"encrypt": false,
"editor": "",
"default_minute": 0,
"highlight": true,
"journals": {"default": "features/journals/simple_jrnl-1-9-5.journal", "missing": "features/journals/missing.journal"},
"tagsymbols": "@"
}

View file

@ -0,0 +1,53 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Creation Date</key>
<date>2020-08-29T18:11:00Z</date>
<key>Starred</key>
<false/>
<key>Entry Text</key>
<string>Entry the first.
Lorem @ipsum dolor sit amet, consectetur adipiscing elit. Praesent malesuada
quis est ac dignissim. Aliquam dignissim rutrum pretium. Phasellus pellentesque
augue et venenatis facilisis. Suspendisse potenti. Sed dignissim sed nisl eu
consequat. Aenean ante ex, elementum ut interdum et, mattis eget lacus. In
commodo nulla nec tellus placerat, sed ultricies metus bibendum. Duis eget
venenatis erat. In at dolor dui. @tagone and maybe also @tagtwo.
Curabitur accumsan nunc ac neque tristique, eleifend faucibus justo
ullamcorper. Suspendisse at mattis nunc. Nullam eget lacinia urna. Suspendisse
potenti. Ut urna est, venenatis sed ante in, ultrices congue mi. Maecenas eget
molestie metus. Mauris porttitor dui ornare gravida porta. Quisque sed lectus
hendrerit, lacinia ante eget, vulputate ante. Aliquam vitae erat non felis
feugiat sagittis. Phasellus quis arcu fringilla, mattis ligula id, vestibulum
urna. Vivamus facilisis leo a mi tincidunt condimentum. Donec eu euismod enim.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam eu ligula eget
velit scelerisque fringilla. Phasellus pharetra justo et nulla fringilla, ac
porta sapien accumsan. Class aptent taciti sociosqu ad litora torquent per
conubia nostra, per inceptos himenaeos.</string>
<key>Time Zone</key>
<string>America/Los_Angeles</string>
<key>UUID</key>
<string>D04D335AFED711EABA18FAFFC2100C3D</string>
<key>Tags</key>
<array>
<string>ipsum</string>
<string>tagone</string>
<string>tagtwo</string>
</array>
<key>Creator</key>
<dict>
<key>Device Agent</key>
<string></string>
<key>Generation Date</key>
<date>2020-09-25T02:35:45Z</date>
<key>Host Name</key>
<string>iris.lan</string>
<key>OS Agent</key>
<string>Darwin/19.3.0</string>
<key>Software Agent</key>
<string>jrnl/v2.4.5</string>
</dict>
</dict>
</plist>

View file

@ -0,0 +1,55 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Creation Date</key>
<date>2020-08-31T21:32:00Z</date>
<key>Starred</key>
<false/>
<key>Entry Text</key>
<string>A second entry in what I hope to be a long series.
Sed sit amet metus et sapien feugiat elementum. Aliquam bibendum lobortis leo
vitae tempus. Donec eleifend nec mi non volutpat. Lorem ipsum dolor sit amet,
consectetur adipiscing elit. Praesent ut sodales libero. Maecenas nisl lorem,
vestibulum in tempus sit amet, fermentum ut arcu. Donec vel vestibulum lectus,
eget pretium enim. Maecenas diam nunc, imperdiet vitae pharetra sed, pretium id
lectus. Donec eu metus et turpis tempor tristique ac non ex. In tellus arcu,
egestas at efficitur et, ultrices vel est. Sed commodo et nibh non elementum.
Mauris tempus vitae neque vel viverra. @tagtwo all by its lonesome.
Nulla mattis elementum magna, viverra pretium dui fermentum et. Cras vel
vestibulum odio. Quisque sit amet turpis et urna finibus maximus. Interdum et
malesuada fames ac ante ipsum primis in faucibus. Fusce porttitor iaculis sem,
non dictum ipsum varius nec. Nulla eu erat at risus gravida blandit non vel
ante. Nam egestas ipsum leo, eu ultricies ipsum tincidunt vel. Morbi a commodo
eros.
Nullam dictum, nisl ac varius tempus, ex tortor fermentum nisl, non
tempus dolor neque a lorem. Suspendisse a faucibus ex, vel ornare tortor.
Maecenas tincidunt id felis quis semper. Pellentesque enim libero, fermentum
quis metus id, rhoncus euismod magna. Nulla finibus velit eu purus bibendum
interdum. Integer id justo dui. Integer eu tellus in turpis bibendum blandit.
Quisque auctor lacinia consectetur.</string>
<key>Time Zone</key>
<string>America/Los_Angeles</string>
<key>UUID</key>
<string>FC8A86CAFED711EA8892FAFFC2100C3D</string>
<key>Tags</key>
<array>
<string>tagtwo</string>
</array>
<key>Creator</key>
<dict>
<key>Device Agent</key>
<string></string>
<key>Generation Date</key>
<date>2020-09-25T02:36:59Z</date>
<key>Host Name</key>
<string>iris.lan</string>
<key>OS Agent</key>
<string>Darwin/19.3.0</string>
<key>Software Agent</key>
<string>jrnl/v2.4.5</string>
</dict>
</dict>
</plist>

View file

@ -0,0 +1,44 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Creation Date</key>
<date>2020-09-24T16:14:00Z</date>
<key>Starred</key>
<true/>
<key>Entry Text</key>
<string>The third entry finally after weeks without writing.
I'm so excited about emojis. 💯 🎶 💩
Donec semper pellentesque iaculis. Nullam cursus et justo sit amet venenatis.
Vivamus tempus ex dictum metus vehicula gravida. Aliquam sed sem dolor. Nulla
eget ultrices purus. Quisque at nunc at quam pharetra consectetur vitae quis
dolor. Fusce ultricies purus eu est feugiat, quis scelerisque nibh malesuada.
Quisque egestas semper nibh in hendrerit. Nam finibus ex in mi mattis
vulputate. Sed mauris urna, consectetur in justo eu, volutpat accumsan justo.
Phasellus aliquam lacus placerat convallis vestibulum. Curabitur maximus at
ante eget fringilla. @tagthree and also @tagone</string>
<key>Time Zone</key>
<string>America/Los_Angeles</string>
<key>UUID</key>
<string>FD8ABC8EFED711EABC35FAFFC2100C3D</string>
<key>Tags</key>
<array>
<string>tagthree</string>
<string>tagone</string>
</array>
<key>Creator</key>
<dict>
<key>Device Agent</key>
<string></string>
<key>Generation Date</key>
<date>2020-09-25T02:37:01Z</date>
<key>Host Name</key>
<string>iris.lan</string>
<key>OS Agent</key>
<string>Darwin/19.3.0</string>
<key>Software Agent</key>
<string>jrnl/v2.4.5</string>
</dict>
</dict>
</plist>

View file

@ -0,0 +1 @@
gAAAAABfb4gQBMqqGn_W8v_s7qCi14bX7inuCOKbsBqIUf7_ch14vTUp7lrysPFvhBp5vGijTwDIbk4LKoIISj8NwM31I8L0zEbMx9y6iyF_zseGGNxBvNN0wzAXa67bs-ohiQhhebcdIc_52sltxL2ELh8JAKUaXRwyapgnMgJ7z6deJppLK-B7RE7BiT0eKjWTDMd2x6cZDswvHs9opDp5yjuKWV5m7x6ggCKYgHT3savT9Tg7V0Fq6K3LGWaE59lCrqlAB0u6dnrDX3qcF4SKyckaniXzRShZGebdkUKDcLFun2V2syZwYQN772xjznIsJ16iXicox2uYKg8CnTefsyCwaOZyBvySGEy3CrlBiuIRIcxCtjKbYJ2B-Aq7LZitnBR7Ny_6_Wm8HsBf3N-cFCp4GShiCKrxuXKcOZ7vszG5EKb78JS85bb0mswU5CSdgp6UAHjIZqfJq00qQsViBCbXq3oklCPZXdQkOf5U0KpG2MVUiD-Zcn5Qj3gnUhSEr-5wKU9tWrE63MGPyE6KjZlArZX2W2LeGnW2CEYw9eREGon06AzLJ4mj3BgtjVWLIdGcCwORXvHRjUqazWgbEmXNVTbtp_cKnkW-rFzRBrUoVme9v-1Y3sH0VvHBq7QIj915VzBklzWs1qzIyTPZG5Db9LvdQ7SiV8slf1Jo7l-ayUUdVj6igvKZcgfB4RUHolJoMps5p4lZ5sPqv59KtSa8DCpuoRczIj71OCpuRVARZgy1m5sUD9xSMxOBdy46u1Jnry6iMtzXWI3mEZe5m7UhmW_L4Zcv4bbk8XjkBeHjPdgm2B69jkLmCBFecD5ztoGesCGt_pNo_sWSKqLHV1-coKFB2Nn__a4utU9NJNdeNRkr8_ahU6tn3jmaFjfQ7cKfrXG_NCcYBRX9fja8EQIeBEp_3TCoXQqhuV_bGsNPA2qL63Pt6YiRaUf1g9FNBqJRlKCSOYNixSXQZN_rTePzx0SQ0aIQhADWls62WX-LG5-byJcB6W2P_cH21hDOXkoNEIyLnCz9HQ6Yd6Fbv7298ps3F6jiUDdWES23zv8sDgBuKUN94qSN34j6MDYGFnGI9zsJ-Y-I2frdlLfWPx3pUL7afcKh1nRgXdjctsTSxU2BDrsu03eBz2IoZjoOR0U51IrNMOD1NNT3kctXxHLuOHSEkwAzS3doncQbdRLi5Gc1dQuOUa4sC-p8gVjUKXO-oi_49kp9Km2Ay9wFg0epBbXx2QMzyMsN2dXeSbHF-BDXD6sULaq5syC0fOHqaMLycTCMk2wLfNyXgEt05WvAiDn-LDsRdylMRW2hXp5HWq3Poaul-7VNg6UEMlwVfgJ-7hNreuO6IRtwmx6YdqMscw0ms6mU_MQZU_dTIPg3JU4KL0YyMqPBPSGNCx3gMp41O05Ubir45FoJSnT5Dkj4v3N0S87Ys3HuFLverASsGt9bkcSzd2uMKCJjkspemPPi9VhrY4IOO03DWSWbHmxYzFc1SJ-24WM8Ch404QKpe1qy5LNzFgLvDwQhSIHjluezHXqrD-DVh1lWNNY3WmHI2ubOZfaorvLKqzBPZ6AhpIa60rKjm0OZIQOmJwWXwkdnzut6m8PtoiLzRN897YMgeztf1nmDwp0xE-EhknVZ3WV3TeqgZJ5ykfHQ5BU8x0Db57-UtKSuesKbqPPdBe91OdsPpkGlyl6psHj1_gPm4nLvzXQePwiPaEemR_gYCWGPvl9l1ANJufgCV9qQTmZGof3fb9mjv-9lS-9l_m8KirPPRpSBToNeDtk50ceYUsOlDGzIyusppG9pOcIGyiln1IO5aZ8d4_1E83qjcHTSaKGizICZU7a-pt5STBPMesy3JgBm23A2jO4m68ayBRMcLnw_RirHvvBaj0C6UR2tac45F0Ob3PpXcvFuK0g54ziIAhzGqwF9I-LZ6asXQWMW4y4EBOak8JJBorkfztzfkMaIgGu-4ZoRKOkVfdr4uzcghk3r6KUxD4-nv1ioX69-G5RwhMHppYk7z8RXS1cq5FkvzXbfEQ-Uv6M-sx32DcUy9dH-ZYhc7UWm75JJfiNXLaXT_bsc6VqQ7KPkg2-RA7CywUFCW9S0S-XdO03VdwqlUVo7fp1SKywEfhZv_9bhDCdMJBwZmigv2KP9Iz7fF6LrpLwZkzHuQGFPcyTHFpsVIFrFyJjNYCXpET9y0Q5Vt4fnea5fy-9ZiCt3S8aS0YOFJ35_kM5i3ss8eFPL0v7fIQS3ZilzdGB3bWL0J7kppHN_ekHu-wVk3UZxauoFh7hXLjPcipua-FYUIklLjcK6DG1bYP7_q6OnkC8Jl650FNezeWPomHEv7l_DO3y0tjI6SGdWvL3ZJns7Xp3ew8KsCREAUO7ffqumD03uF9N-9uWbDDjM7rk0vcg0ggfOs9Ni725mxqYpu4R285XCOVWHDvw7iU6eAvE6ry8TDXQBbNgGjTuTYFYYli7GuOqMxFIe1op2s7sRnoJE8O0J76S6APhjhjcnZRSuONWkVG_5o83uFMPSF8DtqLwuRA5E8AGfIwAUcj324sw-DA0ixBGUqomb-osUIisv3x0b044xn-FvD-8R3PZDnPbPsao8XYNxfQWStrNcZSrX2Ua-WAcv9qbQ73_57RKW4pao4ajOu7K5800D231WGiIa6aJzDnFUlzXEzYxFQyx7qegkm_9rrEp_v8TC9mfAcjWX5DMrCkxUskx9YKDfpFYq4NuxO_414gReKzd-lmorfigvttgS10N1XD74SwFluXJv-bqTbI5-SuYAhDGMv1dqrn38i3rOMQqqnQomvaUJRprqxUsKz14sSE1Y-cNqq1FXzZ6vIJq-K3YTfFWPRLeqi6gHzqS_R2YBXXUduKuYgmakiVdP3bWc-Ca8WKh5sVi6P51MO-cS7i9AZWOaOz7F8PsB4JZxAJjSOr3NBmv3EEve9auTFCudRjfC6668I_NMHaTP5CCV4cuhuAxUuKUGgd6WFjDcvoYPyn_lu3bQiqD9MEag4CaJYI9PlraRv5mbqptwxv3pca7usd0GmXN_2No_nwxB4gVb48LsBBkH35njCa5iv2EKXUSOf0k3swaTSEahqbyI4EDzPXtU5uBO39iQzNpgfV_sUpnGdysjqueUVcdWGI_s5CnrNJ-_yDAY06AoXfLrjP8_3NXB2058xZ2rfmTNJNCULz9634dICJReXNnmplxIg3i6GbzFvjfNtqjrWr_iqBShyIwuOUJRbXzdJNggx2BDNG-PEWDXl89SaudFICkDvyZKEcATIss6ZXfULIMfCrqmWmFwgXfNEd9TuvjqoxFlLSaY4UfDMiYa_arUMblFfoo5nV07GANhUoQd-6HRe7LjYeX5VRodOx6ZmZjIAUq-DYr-hatJJFR2tjT_qZht2MJeYT3GZ3o54m8zBBt0JTN7HVpKaOaM3A2hEM_Ah0QZ-DkLDxtCzMuv987GDiLT2-Riya97a47yHIJhZFzFpflW2FcuC8RFWXlfUKTQfZkFmxh3MUekUuS4yu4Z121xojVswk_4P7-FqLaSnGT2epI69I_cvalRx3wjds9-5TFYqf4GridlFBRx6Fv2fpNB9Zvp9k7NQ9oYcPuXGLoXH5kmWBagPhEGKHA_pjFUZmCuwUIoeP4nP8lhFrX8OGezsbSBG773CRJzEdfcgAc5G-p6M_24WZLZHDrsVBAvgrNt6R9eQbEviWU28t_417QCp-or9qqt4OTKv1dp_4MlZh8YBg2-dtpvzSc1l5e4kQFJu7oWlpbgsjB6pl1oRRKp1maedX-gOAf559zC4l85gfEpPln9Cnl6xvERQzfO0Ey4q91SdsgK7i7FBrKKmi2wGiemFvnaQsrjZ_IFujLo8-2c8g9zTiyH1knyoVOAAnQxqGpsz6z6PNfSxr3_G8tOlNFTV-yqN_LdVHMgXtXjn3U9koGsfMulyUcBDdR3d_0Yn6iEjBt77tbxKi2ry-0gQrB1fdGsgKjyE_tMrW8D_lQz0IXsVOzd2ixsFVXMFzD6OOD8JldV0FbA-VDAS-Tp_ezIZVp6lRq54XBgvsjzDyOmOgDbSOQN6SQmvxPnIsml1wgmtm80z-9gHBqmimHBtLKB6L7CtLmmPICMS2pX3eWOmakxscxqs8AVjijJdz_NYNfcdBeDj_fhm6dqD6iwk3EBZZfsrmMGdXtAMqf1r9ng9tsz-FriXwQiJ3IM3loBsk5DKr9CcaJtKSPuwDDlRynD2vwcD-XyF6YTQdSJa9fEcq-qXya2Scj4mqQ4RDemJgErdradRfwJfII3fWHh18XxmYVqi9Bwn3YRgwEadyo0-HjbNq6vJXi12igmP99ciRAfMVQLjfUfTwoOHj44Y2Ru_hPjJcvB6FIn6KLrrCSrZnrshFdFn4L36z1CrS8fbtdvrG3kdZQxsUJnMqttuwKRpLnDWTWkIwj_GRBFrzCFgbwGp1XYhemxggyKVuhZPfyyTIM9rhlPth6eGyrpYfap24Av_mGPRBLnzcjtpGbACGdKQL034kVmI7yENGvmY40KSrWsVG_BE9bSJhx0EptFsT2IxnxbuFD4hGb4fFag9V0BDiKpUoOZqIVqVO8cAp-5w4twvWZKkrhu16JNlLoXWMoFANrw-tp5LKSin1CUeRa4LWVI1GR8tRkIad_GnCHRv9JEMswlNy9wi2sDNsSxWT7WNasUW5-glgK9pR7d2pXGGOWfHj1U6CKIqmAiO3iw8igzhvyx_dAxMxPo

View file

@ -0,0 +1,19 @@
[2020-08-29 11:11:00 AM] Entry the first.
Lorem @ipsum dolor sit amet, consectetur adipiscing elit. Praesent malesuada
quis est ac dignissim. Aliquam dignissim rutrum pretium. Phasellus pellentesque
augue et venenatis facilisis. Suspendisse potenti. Sed dignissim sed nisl eu
consequat. Aenean ante ex, elementum ut interdum et, mattis eget lacus. In
commodo nulla nec tellus placerat, sed ultricies metus bibendum. Duis eget
venenatis erat. In at dolor dui. @tagone and maybe also @tagtwo.
Curabitur accumsan nunc ac neque tristique, eleifend faucibus justo
ullamcorper. Suspendisse at mattis nunc. Nullam eget lacinia urna. Suspendisse
potenti. Ut urna est, venenatis sed ante in, ultrices congue mi. Maecenas eget
molestie metus. Mauris porttitor dui ornare gravida porta. Quisque sed lectus
hendrerit, lacinia ante eget, vulputate ante. Aliquam vitae erat non felis
feugiat sagittis. Phasellus quis arcu fringilla, mattis ligula id, vestibulum
urna. Vivamus facilisis leo a mi tincidunt condimentum. Donec eu euismod enim.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam eu ligula eget
velit scelerisque fringilla. Phasellus pharetra justo et nulla fringilla, ac
porta sapien accumsan. Class aptent taciti sociosqu ad litora torquent per
conubia nostra, per inceptos himenaeos.

View file

@ -0,0 +1,23 @@
[2020-08-31 02:32:00 PM] A second entry in what I hope to be a long series. *
Sed sit amet metus et sapien feugiat elementum. Aliquam bibendum lobortis leo
vitae tempus. Donec eleifend nec mi non volutpat. Lorem ipsum dolor sit amet,
consectetur adipiscing elit. Praesent ut sodales libero. Maecenas nisl lorem,
vestibulum in tempus sit amet, fermentum ut arcu. Donec vel vestibulum lectus,
eget pretium enim. Maecenas diam nunc, imperdiet vitae pharetra sed, pretium id
lectus. Donec eu metus et turpis tempor tristique ac non ex. In tellus arcu,
egestas at efficitur et, ultrices vel est. Sed commodo et nibh non elementum.
Mauris tempus vitae neque vel viverra. @tagtwo all by its lonesome.
Nulla mattis elementum magna, viverra pretium dui fermentum et. Cras vel
vestibulum odio. Quisque sit amet turpis et urna finibus maximus. Interdum et
malesuada fames ac ante ipsum primis in faucibus. Fusce porttitor iaculis sem,
non dictum ipsum varius nec. Nulla eu erat at risus gravida blandit non vel
ante. Nam egestas ipsum leo, eu ultricies ipsum tincidunt vel. Morbi a commodo
eros.
Nullam dictum, nisl ac varius tempus, ex tortor fermentum nisl, non
tempus dolor neque a lorem. Suspendisse a faucibus ex, vel ornare tortor.
Maecenas tincidunt id felis quis semper. Pellentesque enim libero, fermentum
quis metus id, rhoncus euismod magna. Nulla finibus velit eu purus bibendum
interdum. Integer id justo dui. Integer eu tellus in turpis bibendum blandit.
Quisque auctor lacinia consectetur.

View file

@ -0,0 +1,11 @@
[2020-09-24 09:14:00 AM] The third entry finally after weeks without writing.
I'm so excited about emojis. 💯 🎶 💩
Donec semper pellentesque iaculis. Nullam cursus et justo sit amet venenatis.
Vivamus tempus ex dictum metus vehicula gravida. Aliquam sed sem dolor. Nulla
eget ultrices purus. Quisque at nunc at quam pharetra consectetur vitae quis
dolor. Fusce ultricies purus eu est feugiat, quis scelerisque nibh malesuada.
Quisque egestas semper nibh in hendrerit. Nam finibus ex in mi mattis
vulputate. Sed mauris urna, consectetur in justo eu, volutpat accumsan justo.
Phasellus aliquam lacus placerat convallis vestibulum. Curabitur maximus at
ante eget fringilla. @tagthree and also @tagone

Some files were not shown because too many files have changed in this diff Show more