fuzzyworld

template / ci-testing / files / README.md

Branch ci-testing · default branch · all branches

README.md

8.3 KB · history · blame

README

Name

template

Description

This CLI creates files and folders with generated templated names, for example 2022-09-26-fhl-2023.md (generator on September 26, 2023, with the project name "fhl-2023"). It's also possible to control the contents of the files: you can specify a template file or an inline template to set the file contents.

This started as a hackathon project that I used to learn Go (golang) and to automate a repetitive task: creation of time-stamped files and folders.

This project is mainly a CLI app written in Go, but it's also a Go module, so it can be used as a dependency. I'm not entirely sure why anyone would want to use this module instead of the CLI, but it's there. Please keep in mind that since my focus is on the CLI, CLI bugs and features will always be prioritized higher than module bugs and features.

Sample tool config

This is one of the profiles that comes with the tool.

    - name: daily
      description: Creates a MD file in ~/DailyNotes folder in the format YYYY-MM-DD[-vX].md
      isdefault: false
      isdisabled: false
      type: file
      path: ~/DailyNotes
      namepatterns:
        - '{{$version := getVersion}}{{.Year}}-{{.Month}}-{{.Day}}{{if .ProjectName}}-{{.ProjectName | snakecase }}{{end}}{{if (gt $version 1)}}v{{$version}}{{end}}.md'
      runpostscriptonfailure: true
      postscripts:
        - code . {{ if .FullPath }}"{{.FullPath}}"{{else}}(ls -t | head -n1){{ end }}
      file:
        template: |-
            # {{.FileNameWithoutExtension}}

            Today's notes for {{.Year}}-{{.Month}}-{{.Day}}.

            ## Todo

            1. Check email
            2. Check chat
            3. Check calendar
            4. Check yesterday's notes
            5. Have fun!
            6. ADD MORE ITEMS HERE

Using the above configuration:

> $ template daily "Cool Thought"
Profile: daily
Project name: Cool Thought
Loaded config from /Users/fuzzy/.template.yaml
Loaded user config from /Users/fuzzy/.template.user.yaml, combining with global config
Creating file: /Users/fuzzy/DailyNotes/2022-11-20-cool_thought.md
Executing post script: sh -c code . "/Users/fuzzy/DailyNotes/2022-11-20-cool_thought.md"
Post script had no output

This will cause VSCode to open the ~\DailyNotes folder as a workspace, and the newly-created file 2022-11-20-cool_thought.md will be opened as well.

The above example also uses the snakecase template function. This is one of the sprig template functions that are exposed by template.

Requirements

The application requires go. You can download the installer here.

The build is managed by make.

The default profiles use Visual Studio Code.

Package and installation

This repo is available as package gitlab.com/fuzzy-rp/template.

To install, clone the repo and run this command from the repo directory: go install gitlab.com/fuzzy-rp/template@latest

To uninstall, run this command from the repo directory: go clean -i gitlab.com/fuzzy-rp/template...

Running after installation

Creating symbolic links

template currently refers to paths under ~. This is to ensure that it works on all systems.

But I personally keep files in Dropbox, so I usually create symbolic links from (for example) ~/Blog -> ~/Dropbox/Blog. Here are the shell commands that I use, maybe they will be helpful for you. :)

New-Item -ItemType Junction -Path "~\Blog\" -Target (Resolve-Path "~\Dropbox\Blog")
New-Item -ItemType Junction -Path "~\DailyNotes\" -Target (Resolve-Path "~\Dropbox\DailyNotes")
New-Item -ItemType Junction -Path "~\Notes\" -Target (Resolve-Path "~\Dropbox\Notes")
New-Item -ItemType Junction -Path "~\Therapy\" -Target (Resolve-Path "~\Dropbox\Therapy")
New-Item -ItemType Junction -Path "~\Work\" -Target (Resolve-Path "~\Dropbox\Work")
ln -s ~/Dropbox/Blog ~/Blog
ln -s ~/Dropbox/DailyNotes ~/DailyNotes
ln -s ~/Dropbox/Notes ~/Notes
ln -s ~/Dropbox/Therapy ~/Therapy
ln -s ~/Dropbox/Work ~/Work

Dev loop

A simple way to get started is to load this directory in VSCode and debug the project using one of the prepared launch tasks. Use command View: Show Run and Debug to display the launch configs, then pick one and press "Start Debugging" button.

The following command will build the package, test it, and then install it. I use this approach, but that's because I use template xyz multiple times a day, and find it helpful to be using the latest version.

Support

For anything, open an issue in this repo.

Roadmap

I'm going to use this tool daily to figure out how it can be improved.

While I am the only user, this app will stay at version 0.x.y. At this point, breaking changes may happen.

I'll try to use feature branches, but main will sometimes be in a broken state. Stable versions are tagged after I've had time to test it, so picking up those should be safe.

Once there are enough other users and enough new feature requirements are added, we'll transition to version 1.x.y.

Basic features

Here are the basic features of the CLI that I want to keep:

  1. Cross-platform
  2. CLI is implemented in Go
  3. Fast (under 1s) basic operation of templating file and folder names
  4. Postscripts can take longer, as long as the "basic operations" finish quickly enough.

KISS

"Keep It Simple, Stupid"

I want to keep this CLI simple. To that extent, I'm not interested in adding too many features. My main requirement right now is: template blog topic should do the same thing as template --profile blog --name topic.

VSCode and make

Good guidance is invaluable, IMO, so to this extent I am very bullish about adding and using descriptive Makefile and VS Code launch tasks.

Makefile should be used for any build/test/release task. If there is a reason to run a task more than once in the lifetime of a project, add the task to the Makefile with a descriptive name. I don't want to see complicated steps embedded in READMEs or (worse) in code. If the task is important, one that a maintainer/developer/user may want to do, add it to Makefile.

Similarly, if there is a good VSCode debug scenario, add a task to launch.json.

Future Features

Here is the future feature list:

  1. Publish Homebrew version of app, possibly using this GoReleaser Homebrew documentation
  2. Publish Chocolatey version of app, possibly using this GoReleaser Chocolatey documentation
  3. Support for passing in a list of template values for custom values in the template. Use might look like this: template work form123 --id=456 --corpOffice=SEA. The passed-in extra values will be placed somewhere inside the template. Some value keys will not be allowed, like "time".

Contributing

Contributions are welcome, but unsolicited PRs are not. If you want to add a particular feature, open an issue first and suggest it. We'll discuss the feature and if I agree that it should be added, you can open a PR.

I don't want to waste my time or your time.

Authors and acknowledgment

Your name will be listed here if you contribute.

License

MIT license.

Project status

This was a hackathon project to learn Go. I'm going to be using this tool and upgrading it as I see fit.

Source
1# README
2
3## Name
4
5template
6
7## Description
8
9This CLI creates files and folders with generated templated names, for example `2022-09-26-fhl-2023.md` (generator on September 26, 2023, with the project name "fhl-2023").
10It's also possible to control the contents of the files: you can specify a template file or an inline template to set the file contents.
11
12This started as a hackathon project that I used to learn Go (golang) and to automate a repetitive task: creation of time-stamped files and folders.
13
14This project is mainly a CLI app written in Go, but it's also a Go module, so it can be used as a dependency.
15I'm not entirely sure why anyone would want to use this module instead of the CLI, but it's there.
16Please keep in mind that since my focus is on the CLI, CLI bugs and features will always be prioritized higher than module bugs and features.
17
18### Sample tool config
19
20This is one of the profiles that comes with the tool.
21
22```yaml
23 - name: daily
24 description: Creates a MD file in ~/DailyNotes folder in the format YYYY-MM-DD[-vX].md
25 isdefault: false
26 isdisabled: false
27 type: file
28 path: ~/DailyNotes
29 namepatterns:
30 - '{{$version := getVersion}}{{.Year}}-{{.Month}}-{{.Day}}{{if .ProjectName}}-{{.ProjectName | snakecase }}{{end}}{{if (gt $version 1)}}v{{$version}}{{end}}.md'
31 runpostscriptonfailure: true
32 postscripts:
33 - code . {{ if .FullPath }}"{{.FullPath}}"{{else}}(ls -t | head -n1){{ end }}
34 file:
35 template: |-
36 # {{.FileNameWithoutExtension}}
37
38 Today's notes for {{.Year}}-{{.Month}}-{{.Day}}.
39
40 ## Todo
41
42 1. Check email
43 2. Check chat
44 3. Check calendar
45 4. Check yesterday's notes
46 5. Have fun!
47 6. ADD MORE ITEMS HERE
48```
49
50Using the above configuration:
51```sh
52> $ template daily "Cool Thought"
53Profile: daily
54Project name: Cool Thought
55Loaded config from /Users/fuzzy/.template.yaml
56Loaded user config from /Users/fuzzy/.template.user.yaml, combining with global config
57Creating file: /Users/fuzzy/DailyNotes/2022-11-20-cool_thought.md
58Executing post script: sh -c code . "/Users/fuzzy/DailyNotes/2022-11-20-cool_thought.md"
59Post script had no output
60```
61
62This will cause VSCode to open the `~\DailyNotes` folder as a workspace, and the newly-created file `2022-11-20-cool_thought.md` will be opened as well.
63
64The above example also uses the [`snakecase`](https://github.com/Masterminds/sprig/blob/master/docs/strings.md#user-content-snakecase) template function.
65This is one of the [sprig template functions](https://github.com/Masterminds/sprig/blob/master/docs/index.md) that are exposed by template.
66
67## Requirements
68
69The application requires [go](https://en.wikipedia.org/wiki/Go_(programming_language)). You can download the installer [here](https://go.dev/doc/install).
70
71The build is managed by [make](https://www.gnu.org/software/make/).
72
73The default profiles use [Visual Studio Code](https://code.visualstudio.com/).
74
75## Package and installation
76
77This repo is available as package [`gitlab.com/fuzzy-rp/template`](https://pkg.go.dev/gitlab.com/fuzzy-rp/template).
78
79To install, clone the repo and run this command from the repo directory:
80`go install gitlab.com/fuzzy-rp/template@latest`
81
82To uninstall, run this command from the repo directory:
83`go clean -i gitlab.com/fuzzy-rp/template...`
84
85### Running after installation
86
87- `template` - uses default profile "note" to create a date-stamped MD file in current folder
88- `template blog` OR `template --profile blog` OR `template -p blog` - creates a date-stamped MD file in ~/Blog, opens in VSCode
89- `template daily topic` OR `template --profile daily --name topic` OR `template -p daily -n topic` - creates a templated date-stamped MD file with `topic` in its name in ~/DailyNotes, opens in VSCode
90- `template list` - lists all the found profiles
91- `template get profile2` - lists detailed information about profile `profile2`
92- `template reset` - resets the configuration to the default config
93 - *Note*: this will overwrite whatever config changes you may have made
94 - *Note*: the defaults may change from version to version
95
96### Creating symbolic links
97
98template currently refers to paths under `~`. This is to ensure that it works on all systems.
99
100But I personally keep files in Dropbox, so I usually create symbolic links from (for example) `~/Blog` -> `~/Dropbox/Blog`. Here are the shell commands that I use, maybe they will be helpful for you. :)
101
102```powershell
103New-Item -ItemType Junction -Path "~\Blog\" -Target (Resolve-Path "~\Dropbox\Blog")
104New-Item -ItemType Junction -Path "~\DailyNotes\" -Target (Resolve-Path "~\Dropbox\DailyNotes")
105New-Item -ItemType Junction -Path "~\Notes\" -Target (Resolve-Path "~\Dropbox\Notes")
106New-Item -ItemType Junction -Path "~\Therapy\" -Target (Resolve-Path "~\Dropbox\Therapy")
107New-Item -ItemType Junction -Path "~\Work\" -Target (Resolve-Path "~\Dropbox\Work")
108```
109
110```bash
111ln -s ~/Dropbox/Blog ~/Blog
112ln -s ~/Dropbox/DailyNotes ~/DailyNotes
113ln -s ~/Dropbox/Notes ~/Notes
114ln -s ~/Dropbox/Therapy ~/Therapy
115ln -s ~/Dropbox/Work ~/Work
116```
117
118## Dev loop
119
120A simple way to get started is to load this directory in VSCode and debug the project using one of the prepared launch tasks. Use command `View: Show Run and Debug` to display the launch configs, then pick one and press "Start Debugging" button.
121
122The following command will build the package, test it, and then install it. I use this approach, but that's because I use `template xyz` multiple times a day, and find it helpful to be using the latest version.
123
124## Support
125
126For anything, open an issue in this repo.
127
128## Roadmap
129
130I'm going to use this tool daily to figure out how it can be improved.
131
132While I am the only user, this app will stay at version `0.x.y`.
133At this point, breaking changes may happen.
134
135I'll try to use feature branches, but main will sometimes be in a broken state.
136Stable versions are tagged after I've had time to test it, so picking up those should be safe.
137
138Once there are enough other users and enough new feature requirements are added, we'll transition to version `1.x.y`.
139
140### Basic features
141
142Here are the basic features of the CLI that I want to keep:
143
1441. Cross-platform
1452. CLI is implemented in Go
1463. Fast (under 1s) basic operation of templating file and folder names
147 1. Postscripts can take longer, as long as the "basic operations" finish quickly enough.
148
149### KISS
150
151"Keep It Simple, Stupid"
152
153I want to keep this CLI simple. To that extent, I'm not interested in adding too many features. My main requirement right now is: `template blog topic` should do the same thing as `template --profile blog --name topic`.
154
155### VSCode and make
156
157Good guidance is invaluable, IMO, so to this extent I am very bullish about adding and using descriptive Makefile and VS Code launch tasks.
158
159Makefile should be used for any build/test/release task. If there is a reason to run a task more than once *in the lifetime of a project*, add the task to the Makefile with a descriptive name.
160I don't want to see complicated steps embedded in READMEs or (worse) in code. If the task is important, one that a maintainer/developer/user *may* want to do, add it to Makefile.
161
162Similarly, if there is a good VSCode debug scenario, add a task to launch.json.
163
164### Future Features
165
166Here is the future feature list:
167
1681. Publish Homebrew version of app, possibly using [this GoReleaser Homebrew documentation](https://goreleaser.com/customization/homebrew/)
1692. Publish Chocolatey version of app, possibly using [this GoReleaser Chocolatey documentation](https://goreleaser.com/customization/chocolatey/)
1703. Support for passing in a list of template values for custom values in the template. Use might look like this: `template work form123 --id=456 --corpOffice=SEA`. The passed-in extra values will be placed somewhere inside the template. Some value keys will not be allowed, like "time".
171
172## Contributing
173
174Contributions are welcome, but unsolicited PRs are not.
175If you want to add a particular feature, open an issue first and suggest it.
176We'll discuss the feature and if I agree that it should be added, you can open a PR.
177
178I don't want to waste my time or your time.
179
180## Authors and acknowledgment
181
182Your name will be listed here if you contribute.
183
184## License
185
186MIT license.
187
188## Project status
189
190This was a hackathon project to learn Go.
191I'm going to be using this tool and upgrading it as I see fit.