diff --git a/features/build.feature b/features/build.feature
new file mode 100644
index 00000000..4725ea85
--- /dev/null
+++ b/features/build.feature
@@ -0,0 +1,8 @@
+Feature: Build process
+
+ @deployment_tests
+ 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
diff --git a/features/contains.feature b/features/contains.feature
deleted file mode 100644
index eac3a464..00000000
--- a/features/contains.feature
+++ /dev/null
@@ -1,29 +0,0 @@
-Feature: Contains
-
- Scenario: Searching for a string
- Given we use the config "basic.yaml"
- When we run "jrnl -contains life"
- Then we should get no error
- and the output should be
- """
- 2013-06-10 15:40 Life is good.
- | But I'm better.
- """
-
- Scenario: Searching for a string within tag results
- Given we use the config "tags.yaml"
- When we run "jrnl @idea -contains software"
- Then we should get no error
- And the output should contain "software"
-
- Scenario: Searching for a string within AND tag results
- Given we use the config "tags.yaml"
- When we run "jrnl -and @journal @idea -contains software"
- Then we should get no error
- and the output should contain "software"
-
- Scenario: Searching for a string within NOT tag results
- Given we use the config "tags.yaml"
- When we run "jrnl -not @dan -contains software"
- Then we should get no error
- and the output should contain "software"
diff --git a/features/core.feature b/features/core.feature
index b8a987ec..dc78a7a3 100644
--- a/features/core.feature
+++ b/features/core.feature
@@ -1,201 +1,21 @@
-Feature: Basic reading and writing to a journal
-
- Scenario: Loading a sample journal
- Given we use the config "basic.yaml"
- When we run "jrnl -n 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: Printing a journal that has multiline entries
- Given we use the config "multiline.yaml"
- When we run "jrnl -n 1"
- Then we should get no error
- and the output should be
- """
- 2013-06-09 15:39 Multiple line entry.
- | This is the first line.
- | This line doesn't have any ending punctuation
- |
- | There is a blank line above this.
- """
-
- Scenario: Multiline entry with punctuation
- Given we use the config "basic.yaml"
- 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"
-
- Scenario: Single line entry with punctuation
- Given we use the config "basic.yaml"
- When we run "jrnl This is. the title"
- and we run "jrnl -n 1"
- Then the output should contain "| the title"
-
- Scenario: Writing an entry from command line
- Given we use the config "basic.yaml"
- 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."
-
- Scenario: Writing an empty entry from the editor
- Given we use the config "editor.yaml"
- When we open the editor and enter nothing
- Then we should see the message "[Nothing saved to file]"
-
- Scenario: Sending an argument with spaces to the editor should work
- Given we use the config "editor-args.yaml"
- When we open the editor and enter "lorem ipsum"
- Then the editor should have been called with 5 arguments
- And one editor argument should be "vim"
- And one editor argument should be "-f"
- And one editor argument should be "-c"
- And one editor argument should match "'?setf markdown'?"
-
- Scenario: Writing an empty entry from the command line
- Given we use the config "basic.yaml"
- When we run "jrnl" and enter nothing
- Then the output should be
- """
-
- """
-
- Scenario: Filtering for dates
- Given we use the config "basic.yaml"
- When we run "jrnl -on 2013-06-10 --short"
- Then the output should be "2013-06-10 15:40 Life is good."
- When we run "jrnl -on 'june 6 2013' --short"
- Then the output should be "2013-06-10 15:40 Life is good."
-
- Scenario: Emoji support
- Given we use the config "basic.yaml"
- 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 "🐘"
-
- Scenario: Writing an entry at the prompt
- Given we use the config "basic.yaml"
- When we run "jrnl" and enter "25 jul 2013: I saw Elvis. He's alive."
- Then we should get no error
- and the journal should contain "[2013-07-25 09:00] I saw Elvis."
- and the journal should contain "He's alive."
+Feature: Functionality of jrnl outside of actually handling journals
Scenario: Displaying the version number
- Given we use the config "basic.yaml"
+ 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))?$"
+
+ Scenario: Displaying the version number
+ Given we use the config "simple.yaml"
When we run "jrnl -v"
Then we should get no error
- Then the output should contain "version"
+ Then the output should match "^jrnl version v\d+\.\d+\.\d+(-(alpha|beta))?$"
- Scenario: --short displays the short version of entries (only the title)
- Given we use the config "basic.yaml"
- When we run "jrnl -on 2013-06-10 --short"
- Then the output should be "2013-06-10 15:40 Life is good."
-
- Scenario: -s displays the short version of entries (only the title)
- Given we use the config "basic.yaml"
- When we run "jrnl -on 2013-06-10 -s"
- Then the output should be "2013-06-10 15:40 Life is good."
-
- Scenario: Invalid color configuration
- Given we use the config "invalid_color.yaml"
- When we run "jrnl -on 2013-06-10 -s"
- Then the output should be
- """
- 2013-06-10 15:40 Life is good.
- """
- And we should get no error
-
- Scenario: Journal directory does not exist
- Given we use the config "missing_directory.yaml"
- When we run "jrnl Life is good"
- and we run "jrnl -n 1"
- Then the output should contain "Life is good"
-
- Scenario: Installation with relative journal and referencing from another folder
- Given we use the config "missingconfig"
- When we run "jrnl hello world" and enter
- """
- test.txt
- n
- """
- and we change directory to "features"
- and we run "jrnl -n 1"
- Then the output should contain "hello world"
-
- Scenario: --diagnostic runs without exceptions
+ Scenario: Running the diagnostic command
When we run "jrnl --diagnostic"
Then the output should contain "jrnl"
And the output should contain "Python"
- Scenario: --import allows new entry from stdin
- Given we use the config "basic.yaml"
- When we run "jrnl --import" and pipe "[2020-07-05 15:00] Observe and import."
- And we run "jrnl -1"
- Then the journal should contain "[2020-07-05 15:00] Observe and import."
- And the output should contain "Observe and import"
-
- Scenario: --import allows new large entry from stdin
- Given we use the config "basic.yaml"
- 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.
- """
- And we run "jrnl -1"
- Then the journal should contain "[2020-07-05 15:00] Observe and import."
- And the output should contain "Observe and import"
- And the output should contain "Lorem ipsum"
- And the output should contain "end of entry."
-
- Scenario: --import allows multiple new entries from stdin
- Given we use the config "basic.yaml"
- 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.
- """
- Then the journal should contain "[2020-07-05 15:00] Observe and import."
- Then the journal should contain "[2020-07-05 15:01] Twice as nice."
-
- Scenario: --import allows import new entries from file
- Given we use the config "basic.yaml"
- Then the journal should contain "My first entry."
- And the journal should contain "Life is good."
- But the journal should not contain "I have an @idea"
- And the journal should not contain "I met with"
- When we run "jrnl --import --file features/journals/tags.journal"
- Then the journal should contain "My first entry."
- And the journal should contain "Life is good."
- And the journal should contain "PROFIT!"
-
- Scenario: --import doesn't get confused with piping and file
- Given we use the config "basic.yaml"
- Then the journal should contain "My first entry."
- And the journal should contain "Life is good."
- But the journal should not contain "I have an @idea"
- And the journal 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!
- """
- Then the journal should contain "My first entry."
- And the journal should contain "PROFIT!"
- But the journal should not contain "I should not exist!"
-
+ @todo
+ Scenario: Listing available journals
diff --git a/features/custom_dates.feature b/features/custom_dates.feature
deleted file mode 100644
index d3489648..00000000
--- a/features/custom_dates.feature
+++ /dev/null
@@ -1,35 +0,0 @@
-Feature: Reading and writing to journal with custom date formats
-
- Scenario: Loading a sample journal
- Given we use the config "little_endian_dates.yaml"
- When we run "jrnl -n 2"
- Then we should get no error
- And the output should be
- """
- 09.06.2013 15:39 My first entry.
- | Everything is alright
-
- 10.06.2013 15:40 Life is good.
- | But I'm better.
- """
-
- Scenario: Writing an entry from command line
- Given we use the config "little_endian_dates.yaml"
- When we run "jrnl 2013-07-12: 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 "12.07.2013 09:00 A cold and stormy day."
-
- Scenario: Filtering for dates
- Given we use the config "little_endian_dates.yaml"
- When we run "jrnl -on 2013-06-10 --short"
- Then the output should be "10.06.2013 15:40 Life is good."
- When we run "jrnl -on 'june 6 2013' --short"
- Then the output should be "10.06.2013 15:40 Life is good."
-
- Scenario: Writing an entry at the prompt
- 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
- And the journal should contain "[10.05.2013 09:00] I saw Elvis."
- And the journal should contain "He's alive."
\ No newline at end of file
diff --git a/features/data/configs/basic_dayone.yaml b/features/data/configs/basic_dayone.yaml
new file mode 100644
index 00000000..0209f2f7
--- /dev/null
+++ b/features/data/configs/basic_dayone.yaml
@@ -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: "|"
diff --git a/features/data/configs/basic_encrypted.yaml b/features/data/configs/basic_encrypted.yaml
new file mode 100644
index 00000000..77f4e48d
--- /dev/null
+++ b/features/data/configs/basic_encrypted.yaml
@@ -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: "|"
diff --git a/features/data/configs/basic_folder.yaml b/features/data/configs/basic_folder.yaml
new file mode 100644
index 00000000..ba0de638
--- /dev/null
+++ b/features/data/configs/basic_folder.yaml
@@ -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: "|"
diff --git a/features/data/configs/basic_onefile.yaml b/features/data/configs/basic_onefile.yaml
new file mode 100644
index 00000000..fb48c6f8
--- /dev/null
+++ b/features/data/configs/basic_onefile.yaml
@@ -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: "|"
diff --git a/features/data/configs/dayone_empty.yaml b/features/data/configs/dayone_empty.yaml
new file mode 100644
index 00000000..7750d389
--- /dev/null
+++ b/features/data/configs/dayone_empty.yaml
@@ -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
diff --git a/features/data/configs/editor_empty_folder.yaml b/features/data/configs/editor_empty_folder.yaml
new file mode 100644
index 00000000..1724bbfb
--- /dev/null
+++ b/features/data/configs/editor_empty_folder.yaml
@@ -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: "|"
diff --git a/features/data/configs/editor_encrypted.yaml b/features/data/configs/editor_encrypted.yaml
new file mode 100644
index 00000000..75273c96
--- /dev/null
+++ b/features/data/configs/editor_encrypted.yaml
@@ -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: "|"
diff --git a/features/data/configs/missing_directory.yaml b/features/data/configs/missing_directory.yaml
new file mode 100644
index 00000000..d600404c
--- /dev/null
+++ b/features/data/configs/missing_directory.yaml
@@ -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
diff --git a/features/data/configs/missing_journal.yaml b/features/data/configs/missing_journal.yaml
new file mode 100644
index 00000000..a1f6f8cf
--- /dev/null
+++ b/features/data/configs/missing_journal.yaml
@@ -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
diff --git a/features/data/configs/basic.yaml b/features/data/configs/simple.yaml
similarity index 100%
rename from features/data/configs/basic.yaml
rename to features/data/configs/simple.yaml
diff --git a/features/data/journals/basic_dayone.dayone/entries/D04D335AFED711EABA18FAFFC2100C3D.doentry b/features/data/journals/basic_dayone.dayone/entries/D04D335AFED711EABA18FAFFC2100C3D.doentry
new file mode 100644
index 00000000..9721dd55
--- /dev/null
+++ b/features/data/journals/basic_dayone.dayone/entries/D04D335AFED711EABA18FAFFC2100C3D.doentry
@@ -0,0 +1,53 @@
+
+
+
+
+ Creation Date
+ 2020-08-29T18:11:00Z
+ Starred
+
+ Entry Text
+ 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.
+ Time Zone
+ America/Los_Angeles
+ UUID
+ D04D335AFED711EABA18FAFFC2100C3D
+ Tags
+
+ ipsum
+ tagone
+ tagtwo
+
+ Creator
+
+ Device Agent
+
+ Generation Date
+ 2020-09-25T02:35:45Z
+ Host Name
+ iris.lan
+ OS Agent
+ Darwin/19.3.0
+ Software Agent
+ jrnl/v2.4.5
+
+
+
diff --git a/features/data/journals/basic_dayone.dayone/entries/FC8A86CAFED711EA8892FAFFC2100C3D.doentry b/features/data/journals/basic_dayone.dayone/entries/FC8A86CAFED711EA8892FAFFC2100C3D.doentry
new file mode 100644
index 00000000..8c2f3c52
--- /dev/null
+++ b/features/data/journals/basic_dayone.dayone/entries/FC8A86CAFED711EA8892FAFFC2100C3D.doentry
@@ -0,0 +1,55 @@
+
+
+
+
+ Creation Date
+ 2020-08-31T21:32:00Z
+ Starred
+
+ Entry Text
+ 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.
+ Time Zone
+ America/Los_Angeles
+ UUID
+ FC8A86CAFED711EA8892FAFFC2100C3D
+ Tags
+
+ tagtwo
+
+ Creator
+
+ Device Agent
+
+ Generation Date
+ 2020-09-25T02:36:59Z
+ Host Name
+ iris.lan
+ OS Agent
+ Darwin/19.3.0
+ Software Agent
+ jrnl/v2.4.5
+
+
+
diff --git a/features/data/journals/basic_dayone.dayone/entries/FD8ABC8EFED711EABC35FAFFC2100C3D.doentry b/features/data/journals/basic_dayone.dayone/entries/FD8ABC8EFED711EABC35FAFFC2100C3D.doentry
new file mode 100644
index 00000000..d998c36b
--- /dev/null
+++ b/features/data/journals/basic_dayone.dayone/entries/FD8ABC8EFED711EABC35FAFFC2100C3D.doentry
@@ -0,0 +1,44 @@
+
+
+
+
+ Creation Date
+ 2020-09-24T16:14:00Z
+ Starred
+
+ Entry Text
+ 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
+ Time Zone
+ America/Los_Angeles
+ UUID
+ FD8ABC8EFED711EABC35FAFFC2100C3D
+ Tags
+
+ tagthree
+ tagone
+
+ Creator
+
+ Device Agent
+
+ Generation Date
+ 2020-09-25T02:37:01Z
+ Host Name
+ iris.lan
+ OS Agent
+ Darwin/19.3.0
+ Software Agent
+ jrnl/v2.4.5
+
+
+
diff --git a/features/data/journals/basic_encrypted.journal b/features/data/journals/basic_encrypted.journal
new file mode 100644
index 00000000..ffc122df
--- /dev/null
+++ b/features/data/journals/basic_encrypted.journal
@@ -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
\ No newline at end of file
diff --git a/features/data/journals/basic_folder/2020/08/29.txt b/features/data/journals/basic_folder/2020/08/29.txt
new file mode 100644
index 00000000..c8af54ca
--- /dev/null
+++ b/features/data/journals/basic_folder/2020/08/29.txt
@@ -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.
diff --git a/features/data/journals/basic_folder/2020/08/31.txt b/features/data/journals/basic_folder/2020/08/31.txt
new file mode 100644
index 00000000..826e7cdb
--- /dev/null
+++ b/features/data/journals/basic_folder/2020/08/31.txt
@@ -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.
diff --git a/features/data/journals/basic_folder/2020/09/24.txt b/features/data/journals/basic_folder/2020/09/24.txt
new file mode 100644
index 00000000..2bd885ce
--- /dev/null
+++ b/features/data/journals/basic_folder/2020/09/24.txt
@@ -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
diff --git a/features/data/journals/basic_onefile.journal b/features/data/journals/basic_onefile.journal
new file mode 100644
index 00000000..0d988049
--- /dev/null
+++ b/features/data/journals/basic_onefile.journal
@@ -0,0 +1,58 @@
+[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
diff --git a/features/data/journals/dayone_empty.dayone/entries/empty.txt b/features/data/journals/dayone_empty.dayone/entries/empty.txt
new file mode 100644
index 00000000..c86b8f66
--- /dev/null
+++ b/features/data/journals/dayone_empty.dayone/entries/empty.txt
@@ -0,0 +1 @@
+This file exists to preserve the directory structure, but should be ignored by jrnl.
diff --git a/features/data/journals/little_endian_dates.journal b/features/data/journals/little_endian_dates.journal
index a3c5c301..d7492969 100644
--- a/features/data/journals/little_endian_dates.journal
+++ b/features/data/journals/little_endian_dates.journal
@@ -1,5 +1,5 @@
[09.06.2013 15:39] My first entry.
Everything is alright
-[10.06.2013 15:40] Life is good.
+[10.07.2013 15:40] Life is good.
But I'm better.
diff --git a/features/datetime.feature b/features/datetime.feature
new file mode 100644
index 00000000..8fe335c9
--- /dev/null
+++ b/features/datetime.feature
@@ -0,0 +1,155 @@
+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"
+ And the journal 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"
+ And the journal 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
+ And 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 ".yaml"
+ When we run "jrnl "
+ Then we should see the message "Entry added"
+ When we run "jrnl -n 1"
+ Then the output should contain "