#!/usr/bin/env python3 """Build README for GitHub and crates.io. This script uses Hurl doc to generate README suitable for GitHub and crates.io The README are displayed on GitHub and crates.io. It's generated by concatenating - home.md - samples.md - manual.md - installation.md Examples: $ python3 bin/docs/build_readme.py github > README.md $ python3 bin/docs/build_readme.py crates > packages/hurl/README.md """ import os import re import sys from pathlib import Path from markdown import MarkdownDoc, parse_markdown def build_home_md(text: str) -> MarkdownDoc: """Returns the MarkDown representation of the Home""" # We adapt the "Why Hurl" part to transform h2 tag back to markdown def showcase_rep(m): return f"
  • {m.group(1)}: {m.group(2).lower()}
  • " home = re.sub( r"""
  • (.+)

    (.+)
  • """, showcase_rep, text, ) return parse_markdown(text=home) def build_sample_md(text: str) -> MarkdownDoc: """Returns the MarkDown representation of the sample""" return parse_markdown(text=text) def build_manual_md(text: str) -> MarkdownDoc: return parse_markdown(text=text) def build_installation_md(text: str) -> MarkdownDoc: return parse_markdown(text=text) def replace(text: str, dest: str) -> str: # Do some replacements # Replace canonical links to hurl.dev links: text = re.sub( r"/docs/(.*)\.md", r"https://hurl.dev/docs/\1.html", text, ) # Change some text snippets for GitHub and crates.io # - first param: pattern to look for in Markdown file # - second param: pattern to replace in GitHub README # - third param: pattern to replace in crates.io README snippets = [ ("blog.md", "https://hurl.dev/blog/", "https://hurl.dev/blog/"), ( """\ """, """\ Hurl Logo [![deploy status](https://github.com/Orange-OpenSource/hurl/workflows/test/badge.svg)](https://github.com/Orange-OpenSource/hurl/actions) [![coverage](https://Orange-OpenSource.github.io/hurl/coverage/badges/flat.svg)](https://Orange-OpenSource.github.io/hurl/coverage) [![Crates.io](https://img.shields.io/crates/v/hurl.svg)](https://crates.io/crates/hurl) [![documentation](https://img.shields.io/badge/-documentation-ff0288)](https://hurl.dev) """, """\ Hurl Logo [![deploy status](https://github.com/Orange-OpenSource/hurl/workflows/test/badge.svg)](https://github.com/Orange-OpenSource/hurl/actions) [![coverage](https://Orange-OpenSource.github.io/hurl/coverage/badges/flat.svg)](https://Orange-OpenSource.github.io/hurl/coverage) [![Crates.io](https://img.shields.io/crates/v/hurl.svg)](https://crates.io/crates/hurl) [![documentation](https://img.shields.io/badge/-documentation-ff0288)](https://hurl.dev) """, ), ( """
    """, """Hurl Demo """, """Hurl Demo """, ), ( """\
    HTML report HTML report
    """, """\ HTML report """, """\ HTML report """, ), ( "[HTML]: /docs/standalone/hurl-5.0.1.html", "[HTML]: /docs/standalone/hurl-5.0.1.html", "[HTML]: https://hurl.dev/assets/docs/hurl-5.0.1.html.gz", ), ( "[PDF]: /docs/standalone/hurl-5.0.1.pdf", "[PDF]: /docs/standalone/hurl-5.0.1.pdf", "[PDF]: https://hurl.dev/assets/docs/hurl-5.0.1.pdf.gz", ), ( "[Markdown]: https://hurl.dev/docs/standalone/hurl-5.0.1.html", "[Markdown]: /docs/standalone/hurl-5.0.1.md", "[Markdown]: https://hurl.dev/assets/docs/hurl-5.0.1.md.gz", ), ] for old, new_for_github, new_for_crates in snippets: if dest == "github": new = new_for_github else: new = new_for_crates text = text.replace(old, new) return text def main(dest: str) -> int: if dest not in ["github", "crates"]: sys.stderr.write("build_readme.py [github, crates]\n") return os.EX_USAGE home = Path("docs/home.md").read_text() home_md = build_home_md(text=home) sample = Path("docs/samples.md").read_text() samples_md = build_sample_md(text=sample) manual = Path("docs/manual.md").read_text() manual_md = build_manual_md(text=manual) installation = Path("docs/installation.md").read_text() installation_md = parse_markdown(text=installation) # TOC construction body_md = MarkdownDoc() body_md.extend(samples_md) body_md.extend(manual_md) body_md.extend(installation_md) toc = body_md.toc() toc_md = parse_markdown(text=toc) # README construction readme_md = MarkdownDoc() readme_md.extend(home_md) readme_md.extend(toc_md) readme_md.extend(body_md) readme = readme_md.to_text() readme = replace(text=readme, dest=dest) print(readme) return os.EX_OK if __name__ == "__main__": main(dest=sys.argv[1])