Sync docs with github repo code snippets
Snipsync makes sure your documented code snippets are always in sync with your Github repo source files.
This tool requires Node v15.0.0 or above (recommended 15.2.1) and Yarn.
Yarn:
``bash`
yarn add snipsync
Create a file called "snipsync.config.yaml" in the project root.
This file specifies the following:
- origins: The Github repositories or local files where the tool will look for source code snippets.targets
- : The local directories that contain the files to be spliced with the code snippets.
The origins property is a list of objects that have one of the following 2 formats:
1. owner, repo, and optionally ref: Pull snippets from a GitHub repofiles
2. : a set of strings:pattern
- : Relative path to load snippets from. Supports glob syntax.owner
- : GitHub repo owner name, to be used in the source snippets linksrepo
- : Name of the repo snipsync is being used in, to link to the source snippetsref
- : (Optional, defaults to main) Used for writing source snippet links.
If the ref key is left blank or not specified, then the most recent commit from the main branch will be used.enable_source_link
If the key in features is not specified, then it will default to true.enable_code_block
If the key in features is not specified, then it will default to true.
The allowed_target_extensions key in features lets you set a list of extensions to scan. Specify extensions like [.md,.txt].allowed_target_extensions
If the key in features is not specified, then it defaults to an empty array ([]) and all files are scanned.
The enable_code_dedenting key in features lets you remove leading spaces from indented code snippets. This is handy when you're including a snippet of code within a class or function and don't want to include the leading indentation. This is false by default.
Example of a complete snipsync.config.yaml:
`yaml
origins:
- owner: temporalio
repo: go-samples
ref: 6880b0d09ddb6edf150e3095c90522602022578f
- owner: temporalio
repo: java-samples
- files:
pattern: ./sample-apps/typescript/*.ts
owner: temporalio
repo: documentation
ref: main
targets:
- docs
- blog
features:
enable_source_link: false
enable_code_block: false
allowed_target_extensions: [.md]
enable_code_dedenting: false
`
Example of a bare minimum snipsync.config.yaml:
`yaml`
origins:
- owner: temporalio
repo: go-samples
targets:
- docs
Use comments to identify code snippets and the locations where they should be merged.
In the source repo, wrap the code snippets in comments with a unique snippet identifier like this:
`go`
// @@@SNIPSTART hellouniverse
func HelloUniverse() {
fmt.Println("Hello Universe!")
}
// @@@SNIPEND
In the example above, "hellouniverse" is the unique identifier for the code snippet.
Unique identifiers can contain letters, numbers, hyphens, and underscores.
In the target files wrap the location with comments that reference the identifier of the code snippet that will be placed there:
`md`
In the example above, the "hellouniverse" code snippet will be spliced between the comments.
Any text inside of the placeholders will be replaced by the code snippet when the tool runs.
The tool will automatically specify the code type for markdown rendering.
For example, if the source file ends in ".go" then the code section will be written like this: ``go
#### Per-snip features
To customize how a single snip is rendered, add a JSON feature configuration in the snip start line.
``md`
Selected lines
A single source code snippet may be used in multiple places.
If so, you may wish to customize which lines are rendered.
Add a "selected" configuration to the snip start line.
``
The line numbers are relative to the snippet, not the source file.
The feature supports multiple selections as either a single line or a range.
Highlighed lines
Some frameworks support highlighting code lines in code blocks.
If so, you can add a "highlights" configuration to the snip start line.
``
The line numbers are relative to the published snippet.
That means that if selectedLines is used, the line numbers to highlight are relative to the pared down selection that is merged into the Markdown file.
If you use Docusuarus, you just need to add some additional CSS: https://docusaurus.io/docs/markdown-features/code-blocks#line-highlighting
Regex snipping
Instead of specifying a set of line numbers to snip, you can use regular expression patterns to mark the start and end of a snip.
Specify a startPattern and an endPattern:
``
Specifying a source file
If the named snippet you want to extract exists in multiple source repositories, provide the path to only that source file after the snippet name, followed by an @:
``
From the root directory of your project run the following command:
`bash`
yarn snipsync
In some cases, you may want to remove the snippets from your target files.
Use the --clear flag to do that:
``
yarn snipsync --clear
The snipsync tool is set up to run its own functionality during development.
Git ignores the snipsync.config.yaml file and the /docs directory within the package itself.
While developing, you can add files to /docs define the snipsync.config.yaml file, and yarn dev
run to run snipsync from the root of the repo.
To clear the snippets run yarn dev --clear
Run yarn test` from the root of the repo to run the testing suites.