From b77e687f9d5f3e5a860e2b5eaba2e4de1fe55765 Mon Sep 17 00:00:00 2001 From: Kamforka Date: Tue, 1 Oct 2024 19:28:06 +0200 Subject: [PATCH] Debug --- .github/workflows/_build-docs.yml | 17 +++++++ .github/workflows/_deploy-docs.yml | 25 ++++++++++ .github/workflows/main-cicd.yml | 7 ++- README.md | 5 +- docs/img/strangebee.png | Bin 0 -> 8066 bytes docs/index.md | 33 +++++++++++++ docs/styles/extra.css | 64 +++++++++++++++++++++++++ mkdocs.yml | 49 +++++++++++++++++++ scripts/cd.py | 74 ++++++++++++++++++----------- 9 files changed, 245 insertions(+), 29 deletions(-) create mode 100644 .github/workflows/_build-docs.yml create mode 100644 .github/workflows/_deploy-docs.yml create mode 100644 docs/img/strangebee.png create mode 100644 docs/index.md create mode 100644 docs/styles/extra.css create mode 100644 mkdocs.yml diff --git a/.github/workflows/_build-docs.yml b/.github/workflows/_build-docs.yml new file mode 100644 index 00000000..d0d75134 --- /dev/null +++ b/.github/workflows/_build-docs.yml @@ -0,0 +1,17 @@ +name: build-docs +on: + workflow_call: +jobs: + build: + name: Build docs + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: 3.12 + - name: Install build dependencies + run: pip install --no-cache-dir -U pip .['build'] + - name: Build docs + run: ./scripts/cd.py --build-docs \ No newline at end of file diff --git a/.github/workflows/_deploy-docs.yml b/.github/workflows/_deploy-docs.yml new file mode 100644 index 00000000..ca6bd736 --- /dev/null +++ b/.github/workflows/_deploy-docs.yml @@ -0,0 +1,25 @@ +name: deploy-docs +on: + workflow_call: +jobs: + upload: + name: Deploy docs to github pages + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + # - name: Compare tag and package version + # run: | + # TAG=${GITHUB_REF#refs/*/} + # VERSION=$(grep -Po '(?<=version = ")[^"]*' pyproject.toml) + # if [ "$TAG" != "$VERSION" ]; then + # echo "Tag value and package version are different: ${TAG} != ${VERSION}" + # exit 1 + # fi + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: 3.12 + - name: Install build dependencies + run: pip install --no-cache-dir -U pip .['build'] + - name: Deploy to github pages + run: ./scripts/cd.py --deploy-docs diff --git a/.github/workflows/main-cicd.yml b/.github/workflows/main-cicd.yml index 9bc6dc22..d02ca61c 100644 --- a/.github/workflows/main-cicd.yml +++ b/.github/workflows/main-cicd.yml @@ -16,9 +16,14 @@ jobs: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} build-package: uses: ./.github/workflows/_build-package.yml + build-docs: + uses: ./.github/workflows/_build-docs.yml upload-package: uses: ./.github/workflows/_upload-package.yml if: startsWith(github.ref, 'refs/tags/') - needs: [static-checks, integration-tests, build-package] + needs: [static-checks, integration-tests, build-package, build-docs] secrets: PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }} + deploy-docs: + uses: ./.github/workflows/_deploy-docs.yml + needs: [build-docs] diff --git a/README.md b/README.md index d5503182..19f19803 100644 --- a/README.md +++ b/README.md @@ -5,8 +5,11 @@ thehive4py - the de facto Python API client of TheHive

+ + release + - cicd + build codecov diff --git a/docs/img/strangebee.png b/docs/img/strangebee.png new file mode 100644 index 0000000000000000000000000000000000000000..9b11d2e9969fa41265d5590a19e8ff20cb3c0e67 GIT binary patch literal 8066 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 +

+ TheHive4py + + TheHive Logo + +

+

+ :material-bee:{ .strangebee .bluebee .upleftbee } + :material-bee:{ .strangebee .yellowbee .upbee } + :material-bee:{ .strangebee .bluebee .uprightbee } +

+ Coming Soon! +

+ :material-bee:{ .strangebee .yellowbee .downleftbee } + :material-bee:{ .strangebee .bluebee .downbee } + :material-bee:{ .strangebee .yellowbee .downrightbee } +

+ + + +

Our bees are out buzzing to gather all the docs you need!

+

Check out our Quickstart in the meantime!

+ + + diff --git a/docs/styles/extra.css b/docs/styles/extra.css new file mode 100644 index 00000000..7a77407c --- /dev/null +++ b/docs/styles/extra.css @@ -0,0 +1,64 @@ +:root { + --md-primary-fg-color: #0049d4; + --md-accent-fg-color: #ffc72c; +} + +@keyframes pulse { + 0%, 100% { + transform: scale(1); + } + 50% { + transform: scale(1.25); + } + } + + +.coming-soon { + color: var(--md-primary-fg-color); + font-size: 1.5rem; + font-weight: bold; + transition: 0.75s; +} + +.coming-soon:hover{ + color: var(--md-accent-fg-color); + transition: 0.75s; +} + +.upleftbee { + rotate: -90deg; +} + +.upbee { + rotate: -45deg; +} + +.uprightbee{ + rotate: 0deg; +} + +.downleftbee { + rotate: 180deg; +} + +.downbee { + rotate: 135deg; +} + +.downrightbee{ + rotate: 90deg; +} + +.yellowbee { + color: var(--md-accent-fg-color) +} + +.bluebee { + color: var(--md-primary-fg-color) +} + +.strangebee { + animation: pulse 2s infinite; + font-size: 1.5rem; + vertical-align: top !important; +} diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100644 index 00000000..9c0d51e4 --- /dev/null +++ b/mkdocs.yml @@ -0,0 +1,49 @@ +site_name: TheHive4py +theme: + name: material + favicon: img/strangebee.png + logo: img/strangebee.png + features: + - navigation.footer + palette: + - media: "(prefers-color-scheme)" + toggle: + icon: material/lightbulb-auto + name: Switch to light mode + - media: '(prefers-color-scheme: light)' + scheme: default + primary: custom + accent: custom + toggle: + icon: material/lightbulb + name: Switch to dark mode + - media: '(prefers-color-scheme: dark)' + scheme: slate + primary: custom + accent: custom + toggle: + icon: material/lightbulb-outline + name: Switch to system preference +extra_css: + - styles/extra.css +repo_name: TheHive-Project/TheHive4py +repo_url: https://github.com/TheHive-Project/TheHive4py +markdown_extensions: + - attr_list + - md_in_html + - pymdownx.emoji: + emoji_index: !!python/name:material.extensions.emoji.twemoji + emoji_generator: !!python/name:material.extensions.emoji.to_svg +extra: + social: + - icon: simple/discord + link: https://discord.com/invite/XhxG3vzM44 + name: Discord + - icon: simple/github + link: https://github.com/TheHive-Project/TheHive4py + name: GitHub + - icon: simple/python + link: https://pypi.org/project/thehive4py/ + name: PyPI + + diff --git a/scripts/cd.py b/scripts/cd.py index 039313a7..b5bb91e8 100755 --- a/scripts/cd.py +++ b/scripts/cd.py @@ -1,7 +1,7 @@ #!/usr/bin/env python import argparse import subprocess -from typing import List +from typing import Dict, List def _run_subprocess( @@ -23,13 +23,6 @@ def _run_subprocess( exit(err.returncode) -def run_all(quiet=False): - print("Run all deployment tasks...") - run_build(quiet=quiet) - run_upload(quiet=quiet) - print("All tasks succeeded!") - - def run_build(quiet: bool): print("Building thehive4py with the build module...") _run_subprocess( @@ -52,14 +45,34 @@ def run_upload(quiet: bool): print("Successfully published thehive4py!") -def build_run_options() -> List[dict]: - return [ - {"name": "build", "help": "run build step", "func": run_build}, - {"name": "upload", "help": "run upload step", "func": run_upload}, - ] +def run_build_docs(quiet: bool): + print("Building thehive4py docs...") + _run_subprocess( + command="mkdocs build --clean --strict", + quiet=quiet, + ) + print("Successfully built thehive4py docs!") -def parse_arguments(run_options: List[dict]): +def run_deploy_docs(quiet: bool): + print("Deploying thehive4py docs to gh-pages...") + _run_subprocess( + command="mkdocs gh-pages", + quiet=quiet, + ) + print("Successfully deployed thehive4py docs to gh-pages!") + + +def build_run_options() -> Dict[str, dict]: + return { + "build": {"help": "build the package locally", "func": run_build}, + "upload": {"help": "upload the package to pypi", "func": run_upload}, + "build-docs": {"help": "build the docs locally", "func": run_build_docs}, + "deploy-docs": {"help": "deploy the docs to gh-pages", "func": run_deploy_docs}, + } + + +def parse_arguments(run_options: Dict[str, dict]): parser = argparse.ArgumentParser( prog="thehive4py-cd", description="run all cd steps or use options to run cd steps selectively", @@ -72,14 +85,21 @@ def parse_arguments(run_options: List[dict]): help="silence verbose output", ) - for run_option in run_options: + for run_option_name, run_option_attributes in run_options.items(): parser.add_argument( - f"--{run_option['name']}", - help=run_option["help"], + f"--{run_option_name.replace('_', '-')}", + help=run_option_attributes["help"], action="store_true", ) - return parser.parse_args() + args = parser.parse_args() + + if not any( + getattr(args, run_option.replace("-", "_")) for run_option in run_options + ): + parser.error(f"provide at least one option from: {list(run_options)}") + + return args def main(): @@ -88,17 +108,17 @@ def main(): quiet = args.quiet - selective_runs = [ - run_option["func"] - for run_option in run_options - if getattr(args, run_option["name"]) + selected_run_funcs = [ + run_option_attributes["func"] + for run_option_name, run_option_attributes in run_options.items() + if getattr(args, run_option_name.replace("-", "_")) ] - if selective_runs: - for run in selective_runs: - run(quiet=quiet) - else: - run_all(quiet=quiet) + for run_func in selected_run_funcs: + run_func(quiet=quiet) + print() + + print("Done!") if __name__ == "__main__":