From 07e8f50c16371ee10a009c9f001e1a327e065546 Mon Sep 17 00:00:00 2001 From: Nok Lam Chan Date: Sun, 2 Feb 2025 14:32:47 +0000 Subject: [PATCH] add something about parser --- Makefile | 10 ++- README.md | 24 +++++ images/cli.png | Bin 0 -> 76531 bytes images/note.md | 1 + src/ruff_in_python/cache.py | 0 src/ruff_in_python/lib.py | 0 src/ruff_in_python/linter.py | 0 src/ruff_in_python/main.py | 36 +++++++- src/ruff_in_python/message.py | 0 src/ruff_in_python/parser.py | 15 ++++ src/ruff_in_python/scratch.ipynb | 150 +++++++++++++++++++++++++++++++ tests/test_parse.py | 8 ++ 12 files changed, 240 insertions(+), 4 deletions(-) create mode 100644 images/cli.png create mode 100644 images/note.md create mode 100644 src/ruff_in_python/cache.py create mode 100644 src/ruff_in_python/lib.py create mode 100644 src/ruff_in_python/linter.py create mode 100644 src/ruff_in_python/message.py create mode 100644 src/ruff_in_python/parser.py create mode 100644 src/ruff_in_python/scratch.ipynb create mode 100644 tests/test_parse.py diff --git a/Makefile b/Makefile index 4877dc4..89c2933 100644 --- a/Makefile +++ b/Makefile @@ -1,2 +1,10 @@ run: - python src/ruff_in_python/main.py \ No newline at end of file + python src/ruff_in_python/main.py + +lint: + ruff check . --fix & ruff format . +install: + pip install -e . + +test: + pytest -vv \ No newline at end of file diff --git a/README.md b/README.md index 8a6ecc5..c9b6bbb 100644 --- a/README.md +++ b/README.md @@ -13,8 +13,32 @@ linter.rs message.rs parser.rs +## Libraries used for 1st version of ruff +The first-ever version of Ruff used the following Rust packages + +fern: for logging +rayon: for parallelizing computation +clap: for cli argument parsing +serde: for serializing and deserializing data +rustpython: for parsing, uses the provided AST +colored: for adding colors to the terminal +walkdir: for walking a directory recursively +anyhow: Flexible concrete Error type built on std::error::Error + +## Libraries I used for the Python verrsion +logging: std logging library +?: parallel computation +typer: cli argument parsing +?: serialising +ast: Python native ast library +rich: color terminal +os/pathlib: walking directory +?: error +pytest: write simple tests + ## Rebuild with Rust Reference: Blog: https://compileralchemy.substack.com/p/ruff-internals-of-a-rust-backed-python Commit: + diff --git a/images/cli.png b/images/cli.png new file mode 100644 index 0000000000000000000000000000000000000000..3e6bf3f2346f5eaeef1f78203170c33ad49ed0d1 GIT binary patch literal 76531 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 literal 0 HcmV?d00001 diff --git a/images/note.md b/images/note.md new file mode 100644 index 0000000..171d3dd --- /dev/null +++ b/images/note.md @@ -0,0 +1 @@ +![alt text](cli.png) \ No newline at end of file diff --git a/src/ruff_in_python/cache.py b/src/ruff_in_python/cache.py new file mode 100644 index 0000000..e69de29 diff --git a/src/ruff_in_python/lib.py b/src/ruff_in_python/lib.py new file mode 100644 index 0000000..e69de29 diff --git a/src/ruff_in_python/linter.py b/src/ruff_in_python/linter.py new file mode 100644 index 0000000..e69de29 diff --git a/src/ruff_in_python/main.py b/src/ruff_in_python/main.py index c55a5ce..c200b46 100644 --- a/src/ruff_in_python/main.py +++ b/src/ruff_in_python/main.py @@ -1,7 +1,37 @@ -def main(name: str): - print(f"Hello {name}") +import logging +from rich.logging import RichHandler +logger = logging.getLogger() + +logging.basicConfig( + level="NOTSET", + format="%(message)s", + datefmt="[%X]", + handlers=[RichHandler(rich_tracebacks=True)], +) + + +def main(filepath: str = None): + if not filepath: + filepath = "tests/bar.py" + logger.info(f"flie path: {filepath}") + set_up_logging() + run_once(filepath) + + +def set_up_logging(): + logger.info("dummy: set up logging") + + +def run_once(filepath: str = None): + logger.info("run once") + logger.info("Identified files to lint in") + logger.info("Checked files in ") + logger.info("Found TODO errors") + errors = [] + for error in errors: + logger.warning(error) if __name__ == "__main__": - main("dummy") \ No newline at end of file + main("dummy") diff --git a/src/ruff_in_python/message.py b/src/ruff_in_python/message.py new file mode 100644 index 0000000..e69de29 diff --git a/src/ruff_in_python/parser.py b/src/ruff_in_python/parser.py new file mode 100644 index 0000000..b517d65 --- /dev/null +++ b/src/ruff_in_python/parser.py @@ -0,0 +1,15 @@ +import ast +from pathlib import Path + + +def pretty_print_ast(self): + # Monkeypatch so it's easier to visualise the ast module + return ast.dump(self, indent=2) + + +ast.Module.__repr__ = pretty_print_ast + + +def parse(path: Path): + with open(path) as f: + return ast.parse(f.read()) diff --git a/src/ruff_in_python/scratch.ipynb b/src/ruff_in_python/scratch.ipynb new file mode 100644 index 0000000..0da6041 --- /dev/null +++ b/src/ruff_in_python/scratch.ipynb @@ -0,0 +1,150 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "import ast" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "stmt = \"print(123)\"" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "parsed = ast.parse(stmt)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Module(\n", + " body=[\n", + " Expr(\n", + " value=Call(\n", + " func=Name(id='print', ctx=Load()),\n", + " args=[\n", + " Constant(value=123)],\n", + " keywords=[]))],\n", + " type_ignores=[])\n" + ] + } + ], + "source": [ + "print(ast.dump(parsed, indent=2))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This works fine, but it's easier to make a pretty print function to avoid doing this everytime. Actually, in Python I can just monkeypatch the class to do this." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "ast.Module" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "type(parsed)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "def pretty_print_ast(self):\n", + " return ast.dump(self, indent=2)\n", + "ast.Module.__repr__ = pretty_print_ast" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Module(\n", + " body=[\n", + " Expr(\n", + " value=Call(\n", + " func=Name(id='print', ctx=Load()),\n", + " args=[\n", + " Constant(value=123)],\n", + " keywords=[]))],\n", + " type_ignores=[])" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "parsed" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "kedro", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.14" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/tests/test_parse.py b/tests/test_parse.py new file mode 100644 index 0000000..90e3488 --- /dev/null +++ b/tests/test_parse.py @@ -0,0 +1,8 @@ +import ast +from ruff_in_python.parser import parse + + +def test_parser(): + stmt = "print(123)" + res = parse(stmt) + assert isinstance(res, ast.Module)