EditFrontMatter: Example 3 Readme¶
Example 3 is a multi threaded program that recursively walks a directory structure and edits the front matter in each valid file found (based on file extension).
While it might seem a bit silly for a file I/O program to use multiple threads, this example demonstrates the thread worthiness of the module. In addition, this example provides a basic skeleton for situations where one might use a database to provide data for the front matter or make remote calls to a server for file content -in which case threading makes sense.
Admittedly, this example is a bit long and non modularized. It was a conscious decision to provide a top down, non modularized, code base to make it easier to follow the code logic.
The documentation for the program can be found here.
Program flow:¶
Walk directory trees from an inclusion list and gatherers paths of files to edit
Ignore directories from an exclusion list
Creates one thread per file being edited (up to
max_threads
)Edits the contents of each file
Throws exceptions or prints error messages as needed
reports back to the user
Constraints:¶
Will edit files that:
contain valid yaml but no content
contain valid yaml with content
Won’t edit files that:
are empty
contain invalid yaml
that does not start on first line
that is missing a begenning or ending section delimiter
that is missing yaml
(Constraints can be overridden as needed)
Running the program:¶
install dependencies
run from anywhere with the environment variable:
TEST_DATA_DIR="./data/" example3/example3.py
Note: The example program does not alter files by default
Example Input / Output¶
The example input can be found in the example data structure directory. The input files represent the various success and failure conditions of the EditFrontMatter module.
File definitions:
example3.md
Success: Standard file similar to example1.md
example3a.md
Error: empty file
example3b.md
Error: file with content but no yaml
example3c.md
Success: with yaml but no content
example3d.md
Error: with no yaml end delimiter
example3e.md
Error: yaml section not at top of file
Directory structure:
example_dir_structure/
├── a
│ ├── b
│ │ ├── b1
│ │ │ ├── example3d.md
│ │ │ └── example3.md
│ │ ├── b2
│ │ │ ├── example3e.md
│ │ │ └── example3.md
│ │ └── example3.md
│ ├── c
│ │ ├── b
│ │ │ ├── b1
│ │ │ │ └── example3.md
│ │ │ ├── b2
│ │ │ │ ├── example3d.md
│ │ │ │ └── example3.md
│ │ │ └── example3.md
│ │ ├── c1
│ │ │ ├── example3c.md
│ │ │ └── example3.md
│ │ ├── c2
│ │ │ ├── example3b.md
│ │ │ └── example3.md
│ │ └── example3.md
│ ├── example3a.md
│ └── example3.md
├── example3a.md
├── example3b.md
├── example3c.md
├── example3d.md
├── example3e.md
└── example3.md
Output Example:
$ TEST_DATA_DIR="../data/" ./example3.py
Error (exception): @Derived_EditFrontMatter.__init__(): /home/karl/Scratch/EditFrontMatter/examples/data/example_dir_structure/example3d.md
Error: No source yaml: /home/karl/Scratch/EditFrontMatter/examples/data/example_dir_structure/example3e.md
Error: No source data: /home/karl/Scratch/EditFrontMatter/examples/data/example_dir_structure/example3a.md
Error: No source yaml: /home/karl/Scratch/EditFrontMatter/examples/data/example_dir_structure/example3b.md
Error: No source data: /home/karl/Scratch/EditFrontMatter/examples/data/example_dir_structure/a/example3a.md
Error (exception): @Derived_EditFrontMatter.__init__(): /home/karl/Scratch/EditFrontMatter/examples/data/example_dir_structure/a/b/b1/example3d.md
Error: No source yaml: /home/karl/Scratch/EditFrontMatter/examples/data/example_dir_structure/a/b/b2/example3e.md
processed: /home/karl/Scratch/EditFrontMatter/examples/data/example_dir_structure/a/b/example3.md
Error: No source yaml: /home/karl/Scratch/EditFrontMatter/examples/data/example_dir_structure/a/c/c2/example3b.md
processed: /home/karl/Scratch/EditFrontMatter/examples/data/example_dir_structure/a/b/b2/example3e.md
processed: /home/karl/Scratch/EditFrontMatter/examples/data/example_dir_structure/example3d.md
processed: /home/karl/Scratch/EditFrontMatter/examples/data/example_dir_structure/a/example3.md
processed: /home/karl/Scratch/EditFrontMatter/examples/data/example_dir_structure/example3a.md
processed: /home/karl/Scratch/EditFrontMatter/examples/data/example_dir_structure/a/b/b1/example3.md
processed: /home/karl/Scratch/EditFrontMatter/examples/data/example_dir_structure/example3b.md
processed: /home/karl/Scratch/EditFrontMatter/examples/data/example_dir_structure/example3.md
processed: /home/karl/Scratch/EditFrontMatter/examples/data/example_dir_structure/a/c/c1/example3c.md
processed: /home/karl/Scratch/EditFrontMatter/examples/data/example_dir_structure/a/example3a.md
processed: /home/karl/Scratch/EditFrontMatter/examples/data/example_dir_structure/a/b/b1/example3d.md
processed: /home/karl/Scratch/EditFrontMatter/examples/data/example_dir_structure/example3c.md
processed: /home/karl/Scratch/EditFrontMatter/examples/data/example_dir_structure/a/c/c1/example3.md
processed: /home/karl/Scratch/EditFrontMatter/examples/data/example_dir_structure/a/c/example3.md
processed: /home/karl/Scratch/EditFrontMatter/examples/data/example_dir_structure/a/b/b2/example3.md
processed: /home/karl/Scratch/EditFrontMatter/examples/data/example_dir_structure/a/c/c2/example3.md
processed: /home/karl/Scratch/EditFrontMatter/examples/data/example_dir_structure/example3e.md
processed: /home/karl/Scratch/EditFrontMatter/examples/data/example_dir_structure/a/c/c2/example3b.md
number of files: 18
number processed: 10
done.