ci: merge workflow jobs and add makefile
This commit is contained in:
parent
7033d52db0
commit
ca2560cae8
12 changed files with 86 additions and 51 deletions
228
.github/generate.py
vendored
228
.github/generate.py
vendored
|
|
@ -1,228 +0,0 @@
|
|||
import os
|
||||
import os.path
|
||||
import re
|
||||
from dataclasses import dataclass, field
|
||||
from typing import List
|
||||
|
||||
from nvim_doc_tools import (
|
||||
LuaParam,
|
||||
Vimdoc,
|
||||
VimdocSection,
|
||||
generate_md_toc,
|
||||
indent,
|
||||
leftright,
|
||||
parse_functions,
|
||||
read_nvim_json,
|
||||
read_section,
|
||||
render_md_api,
|
||||
render_vimdoc_api,
|
||||
replace_section,
|
||||
wrap,
|
||||
)
|
||||
from nvim_doc_tools.vimdoc import format_vimdoc_params
|
||||
|
||||
HERE = os.path.dirname(__file__)
|
||||
ROOT = os.path.abspath(os.path.join(HERE, os.path.pardir))
|
||||
README = os.path.join(ROOT, "README.md")
|
||||
DOC = os.path.join(ROOT, "doc")
|
||||
VIMDOC = os.path.join(DOC, "oil.txt")
|
||||
|
||||
|
||||
def add_md_link_path(path: str, lines: List[str]) -> List[str]:
|
||||
ret = []
|
||||
for line in lines:
|
||||
ret.append(re.sub(r"(\(#)", "(" + path + "#", line))
|
||||
return ret
|
||||
|
||||
|
||||
def update_md_api():
|
||||
api_doc = os.path.join(DOC, "api.md")
|
||||
funcs = parse_functions(os.path.join(ROOT, "lua", "oil", "init.lua"))
|
||||
lines = ["\n"] + render_md_api(funcs, 2) + ["\n"]
|
||||
replace_section(
|
||||
api_doc,
|
||||
r"^<!-- API -->$",
|
||||
r"^<!-- /API -->$",
|
||||
lines,
|
||||
)
|
||||
toc = ["\n"] + generate_md_toc(api_doc, max_level=1) + ["\n"]
|
||||
replace_section(
|
||||
api_doc,
|
||||
r"^<!-- TOC -->$",
|
||||
r"^<!-- /TOC -->$",
|
||||
toc,
|
||||
)
|
||||
toc = add_md_link_path("doc/api.md", toc)
|
||||
replace_section(
|
||||
README,
|
||||
r"^<!-- API -->$",
|
||||
r"^<!-- /API -->$",
|
||||
toc,
|
||||
)
|
||||
|
||||
|
||||
def update_readme_toc():
|
||||
toc = ["\n"] + generate_md_toc(README, max_level=1) + ["\n"]
|
||||
replace_section(
|
||||
README,
|
||||
r"^<!-- TOC -->$",
|
||||
r"^<!-- /TOC -->$",
|
||||
toc,
|
||||
)
|
||||
|
||||
|
||||
def update_config_options():
|
||||
config_file = os.path.join(ROOT, "lua", "oil", "config.lua")
|
||||
opt_lines = ['\n```lua\nrequire("oil").setup({\n']
|
||||
opt_lines.extend(read_section(config_file, r"^\s*local default_config =", r"^}$"))
|
||||
replace_section(
|
||||
README,
|
||||
r"^## Options$",
|
||||
r"^}\)$",
|
||||
opt_lines,
|
||||
)
|
||||
|
||||
|
||||
@dataclass
|
||||
class ColumnDef:
|
||||
name: str
|
||||
adapters: str
|
||||
editable: bool
|
||||
summary: str
|
||||
params: List["LuaParam"] = field(default_factory=list)
|
||||
|
||||
|
||||
HL = [
|
||||
LuaParam(
|
||||
"highlight",
|
||||
"string|fun(value: string): string",
|
||||
"Highlight group, or function that returns a highlight group",
|
||||
)
|
||||
]
|
||||
TIME = [
|
||||
LuaParam("format", "string", "Format string (see :help strftime)"),
|
||||
]
|
||||
COL_DEFS = [
|
||||
ColumnDef(
|
||||
"type",
|
||||
"*",
|
||||
False,
|
||||
"The type of the entry (file, directory, link, etc)",
|
||||
HL
|
||||
+ [LuaParam("icons", "table<string, string>", "Mapping of entry type to icon")],
|
||||
),
|
||||
ColumnDef(
|
||||
"icon",
|
||||
"*",
|
||||
False,
|
||||
"An icon for the entry's type (requires nvim-web-devicons)",
|
||||
HL
|
||||
+ [
|
||||
LuaParam("default_file", "string", "Fallback icon for files when nvim-web-devicons returns nil"),
|
||||
LuaParam("directory", "string", "Icon for directories"),
|
||||
LuaParam("add_padding", "boolean", "Set to false to remove the extra whitespace after the icon"),
|
||||
],
|
||||
),
|
||||
ColumnDef("size", "files, ssh", False, "The size of the file", HL + []),
|
||||
ColumnDef(
|
||||
"permissions", "files, ssh", True, "Access permissions of the file", HL + []
|
||||
),
|
||||
ColumnDef("ctime", "files", False, "Change timestamp of the file", HL + TIME + []),
|
||||
ColumnDef(
|
||||
"mtime", "files", False, "Last modified time of the file", HL + TIME + []
|
||||
),
|
||||
ColumnDef("atime", "files", False, "Last access time of the file", HL + TIME + []),
|
||||
ColumnDef(
|
||||
"birthtime", "files", False, "The time the file was created", HL + TIME + []
|
||||
),
|
||||
]
|
||||
|
||||
|
||||
def get_options_vimdoc() -> "VimdocSection":
|
||||
section = VimdocSection("options", "oil-options")
|
||||
config_file = os.path.join(ROOT, "lua", "oil", "config.lua")
|
||||
opt_lines = read_section(config_file, r"^local default_config =", r"^}$")
|
||||
lines = ["\n", ">\n", ' require("oil").setup({\n']
|
||||
lines.extend(indent(opt_lines, 4))
|
||||
lines.extend([" })\n", "<\n"])
|
||||
section.body = lines
|
||||
return section
|
||||
|
||||
|
||||
def get_highlights_vimdoc() -> "VimdocSection":
|
||||
section = VimdocSection("Highlights", "oil-highlights", ["\n"])
|
||||
highlights = read_nvim_json('require("oil")._get_highlights()')
|
||||
for hl in highlights:
|
||||
name = hl["name"]
|
||||
desc = hl.get("desc")
|
||||
if desc is None:
|
||||
continue
|
||||
section.body.append(leftright(name, f"*hl-{name}*"))
|
||||
section.body.extend(wrap(desc, 4))
|
||||
section.body.append("\n")
|
||||
return section
|
||||
|
||||
|
||||
def get_actions_vimdoc() -> "VimdocSection":
|
||||
section = VimdocSection("Actions", "oil-actions", ["\n"])
|
||||
section.body.extend(
|
||||
wrap(
|
||||
"These are actions that can be used in the `keymaps` section of config options."
|
||||
)
|
||||
)
|
||||
section.body.append("\n")
|
||||
actions = read_nvim_json('require("oil.actions")._get_actions()')
|
||||
actions.sort(key=lambda a: a["name"])
|
||||
for action in actions:
|
||||
name = action["name"]
|
||||
desc = action["desc"]
|
||||
section.body.append(leftright(name, f"*actions.{name}*"))
|
||||
section.body.extend(wrap(desc, 4))
|
||||
section.body.append("\n")
|
||||
return section
|
||||
|
||||
|
||||
def get_columns_vimdoc() -> "VimdocSection":
|
||||
section = VimdocSection("Columns", "oil-columns", ["\n"])
|
||||
section.body.extend(
|
||||
wrap(
|
||||
'Columns can be specified as a string to use default arguments (e.g. `"icon"`), or as a table to pass parameters (e.g. `{"size", highlight = "Special"}`)'
|
||||
)
|
||||
)
|
||||
section.body.append("\n")
|
||||
for col in COL_DEFS:
|
||||
section.body.append(leftright(col.name, f"*column-{col.name}*"))
|
||||
section.body.extend(wrap(f"Adapters: {col.adapters}", 4))
|
||||
if col.editable:
|
||||
section.body.extend(wrap(f"Editable: this column is read/write", 4))
|
||||
section.body.extend(wrap(col.summary, 4))
|
||||
section.body.append("\n")
|
||||
section.body.append(" Parameters:\n")
|
||||
section.body.extend(format_vimdoc_params(col.params, 6))
|
||||
section.body.append("\n")
|
||||
return section
|
||||
|
||||
|
||||
def generate_vimdoc():
|
||||
doc = Vimdoc("oil.txt", "oil")
|
||||
funcs = parse_functions(os.path.join(ROOT, "lua", "oil", "init.lua"))
|
||||
doc.sections.extend(
|
||||
[
|
||||
get_options_vimdoc(),
|
||||
VimdocSection("API", "oil-api", render_vimdoc_api("oil", funcs)),
|
||||
get_columns_vimdoc(),
|
||||
get_actions_vimdoc(),
|
||||
get_highlights_vimdoc(),
|
||||
]
|
||||
)
|
||||
|
||||
with open(VIMDOC, "w", encoding="utf-8") as ofile:
|
||||
ofile.writelines(doc.render())
|
||||
|
||||
|
||||
def main() -> None:
|
||||
"""Update the README"""
|
||||
update_config_options()
|
||||
update_md_api()
|
||||
update_readme_toc()
|
||||
generate_vimdoc()
|
||||
31
.github/main.py
vendored
31
.github/main.py
vendored
|
|
@ -1,31 +0,0 @@
|
|||
#!/usr/bin/env python
|
||||
import argparse
|
||||
import os
|
||||
import sys
|
||||
|
||||
HERE = os.path.dirname(__file__)
|
||||
ROOT = os.path.abspath(os.path.join(HERE, os.path.pardir))
|
||||
DOC = os.path.join(ROOT, "doc")
|
||||
|
||||
|
||||
def main() -> None:
|
||||
"""Generate docs"""
|
||||
sys.path.append(HERE)
|
||||
parser = argparse.ArgumentParser(description=main.__doc__)
|
||||
parser.add_argument("command", choices=["generate", "lint"])
|
||||
args = parser.parse_args()
|
||||
if args.command == "generate":
|
||||
import generate
|
||||
|
||||
generate.main()
|
||||
elif args.command == "lint":
|
||||
from nvim_doc_tools import lint_md_links
|
||||
|
||||
files = [os.path.join(ROOT, "README.md")] + [
|
||||
os.path.join(DOC, file) for file in os.listdir(DOC) if file.endswith(".md")
|
||||
]
|
||||
lint_md_links.main(ROOT, files)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
1
.github/nvim_doc_tools
vendored
1
.github/nvim_doc_tools
vendored
|
|
@ -1 +0,0 @@
|
|||
Subproject commit d146f2b7e72892b748e21d40a175267ce2ac1b7b
|
||||
4
.github/pre-commit
vendored
4
.github/pre-commit
vendored
|
|
@ -1,5 +1,3 @@
|
|||
#!/bin/bash
|
||||
set -e
|
||||
luacheck lua tests
|
||||
|
||||
stylua --check .
|
||||
make fastlint
|
||||
|
|
|
|||
11
.github/pre-push
vendored
Executable file
11
.github/pre-push
vendored
Executable file
|
|
@ -0,0 +1,11 @@
|
|||
#!/bin/bash
|
||||
set -e
|
||||
IFS=' '
|
||||
while read local_ref _local_sha _remote_ref _remote_sha; do
|
||||
remote_main=$( (git symbolic-ref refs/remotes/origin/HEAD 2>/dev/null || echo "///master") | cut -f 4 -d / | tr -d "[:space:]")
|
||||
local_ref_short=$(echo "$local_ref" | cut -f 3 -d / | tr -d "[:space:]")
|
||||
if [ "$local_ref_short" = "$remote_main" ]; then
|
||||
make lint
|
||||
make test
|
||||
fi
|
||||
done
|
||||
2
.github/workflows/install_nvim.sh
vendored
2
.github/workflows/install_nvim.sh
vendored
|
|
@ -3,7 +3,7 @@ set -e
|
|||
PLUGINS="$HOME/.local/share/nvim/site/pack/plugins/start"
|
||||
mkdir -p "$PLUGINS"
|
||||
|
||||
wget "https://github.com/neovim/neovim/releases/download/${NVIM_TAG}/nvim.appimage"
|
||||
wget "https://github.com/neovim/neovim/releases/download/${NVIM_TAG-stable}/nvim.appimage"
|
||||
chmod +x nvim.appimage
|
||||
./nvim.appimage --appimage-extract >/dev/null
|
||||
rm -f nvim.appimage
|
||||
|
|
|
|||
42
.github/workflows/tests.yml
vendored
42
.github/workflows/tests.yml
vendored
|
|
@ -1,6 +1,12 @@
|
|||
name: Tests
|
||||
|
||||
on: [push, pull_request]
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
pull_request:
|
||||
branches:
|
||||
- master
|
||||
|
||||
jobs:
|
||||
luacheck:
|
||||
|
|
@ -17,7 +23,7 @@ jobs:
|
|||
sudo luarocks install luacheck
|
||||
|
||||
- name: Run Luacheck
|
||||
run: luacheck .
|
||||
run: luacheck lua tests
|
||||
|
||||
stylua:
|
||||
name: StyLua
|
||||
|
|
@ -29,7 +35,7 @@ jobs:
|
|||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
version: v0.15.2
|
||||
args: --check .
|
||||
args: --check lua tests
|
||||
|
||||
typecheck:
|
||||
name: typecheck
|
||||
|
|
@ -62,6 +68,35 @@ jobs:
|
|||
run: |
|
||||
bash ./run_tests.sh
|
||||
|
||||
update_docs:
|
||||
name: Update docs
|
||||
runs-on: ubuntu-22.04
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Install Neovim and dependencies
|
||||
run: |
|
||||
bash ./.github/workflows/install_nvim.sh
|
||||
|
||||
- name: Update docs
|
||||
run: |
|
||||
python -m pip install pyparsing==3.0.9
|
||||
make doc
|
||||
- name: Commit changes
|
||||
if: ${{ github.ref == 'refs/heads/master' }}
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
COMMIT_MSG: |
|
||||
[docgen] Update docs
|
||||
skip-checks: true
|
||||
run: |
|
||||
git config user.email "actions@github"
|
||||
git config user.name "Github Actions"
|
||||
git remote set-url origin https://x-access-token:${GITHUB_TOKEN}@github.com/${GITHUB_REPOSITORY}.git
|
||||
git add README.md doc
|
||||
# Only commit and push if we have changes
|
||||
git diff --quiet && git diff --staged --quiet || (git commit -m "${COMMIT_MSG}"; git push origin HEAD:${GITHUB_REF})
|
||||
|
||||
release:
|
||||
name: release
|
||||
|
||||
|
|
@ -71,6 +106,7 @@ jobs:
|
|||
- stylua
|
||||
- typecheck
|
||||
- run_tests
|
||||
- update_docs
|
||||
runs-on: ubuntu-22.04
|
||||
steps:
|
||||
- uses: google-github-actions/release-please-action@v3
|
||||
|
|
|
|||
35
.github/workflows/update-docs.yml
vendored
35
.github/workflows/update-docs.yml
vendored
|
|
@ -1,35 +0,0 @@
|
|||
name: Update docs
|
||||
|
||||
on: push
|
||||
|
||||
jobs:
|
||||
update-readme:
|
||||
name: Update docs
|
||||
runs-on: ubuntu-22.04
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
submodules: true
|
||||
|
||||
- name: Install Neovim and dependencies
|
||||
env:
|
||||
NVIM_TAG: v0.9.0
|
||||
run: |
|
||||
bash ./.github/workflows/install_nvim.sh
|
||||
|
||||
- name: Update docs
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
COMMIT_MSG: |
|
||||
[docgen] Update docs
|
||||
skip-checks: true
|
||||
run: |
|
||||
git config user.email "actions@github"
|
||||
git config user.name "Github Actions"
|
||||
git remote set-url origin https://x-access-token:${GITHUB_TOKEN}@github.com/${GITHUB_REPOSITORY}.git
|
||||
python -m pip install pyparsing==3.0.9
|
||||
python .github/main.py generate
|
||||
python .github/main.py lint
|
||||
git add README.md doc
|
||||
# Only commit and push if we have changes
|
||||
git diff --quiet && git diff --staged --quiet || (git commit -m "${COMMIT_MSG}"; git push origin HEAD:${GITHUB_REF})
|
||||
Loading…
Add table
Add a link
Reference in a new issue