From 0550b06d264fbb6f596f294ace9dd840f5d9fe18 Mon Sep 17 00:00:00 2001 From: Robert James Hernandez Date: Thu, 20 Jun 2024 16:21:50 +0900 Subject: [PATCH] python3Packages.tree-sitter-*: init at 0.22.5 Co-authored-by: Robert James Hernandez Co-authored-by: Yifei Sun Co-authored-by: Ali Jamadi Co-authored-by: yakampe Co-authored-by: GetPsyched Co-authored-by: Adrien Faure Co-authored-by: Shahar "Dawn" Or --- .../tree-sitter-grammars/default.nix | 128 ++++++++++++++++++ pkgs/top-level/python-packages.nix | 11 ++ 2 files changed, 139 insertions(+) create mode 100644 pkgs/development/python-modules/tree-sitter-grammars/default.nix diff --git a/pkgs/development/python-modules/tree-sitter-grammars/default.nix b/pkgs/development/python-modules/tree-sitter-grammars/default.nix new file mode 100644 index 000000000000000..63be74bcb199842 --- /dev/null +++ b/pkgs/development/python-modules/tree-sitter-grammars/default.nix @@ -0,0 +1,128 @@ +{ pkgs +, lib +, buildPythonPackage +, pytestCheckHook +, tree-sitter + # `name`: grammar derivation pname in the format of `tree-sitter-` +, name +, grammarDrv +}: +let + inherit (grammarDrv) version; + + snakeCaseName = lib.replaceStrings [ "-" ] [ "_" ] name; + drvPrefix = "python-${name}"; +in +buildPythonPackage { + inherit version; + pname = drvPrefix; + + src = pkgs.symlinkJoin { + name = "${drvPrefix}-source"; + paths = [ + (pkgs.writeTextFile { + name = "${drvPrefix}-init"; + text = '' + from ._binding import language + + __all__ = ["language"] + ''; + destination = "/${snakeCaseName}/__init__.py"; + }) + (pkgs.writeTextFile { + name = "${drvPrefix}-binding"; + text = '' + #include + + typedef struct TSLanguage TSLanguage; + + TSLanguage *${snakeCaseName}(void); + + static PyObject* _binding_language(PyObject *self, PyObject *args) { + return PyLong_FromVoidPtr(${snakeCaseName}()); + } + + static PyMethodDef methods[] = { + {"language", _binding_language, METH_NOARGS, + "Get the tree-sitter language for this grammar."}, + {NULL, NULL, 0, NULL} + }; + + static struct PyModuleDef module = { + .m_base = PyModuleDef_HEAD_INIT, + .m_name = "_binding", + .m_doc = NULL, + .m_size = -1, + .m_methods = methods + }; + + PyMODINIT_FUNC PyInit__binding(void) { + return PyModule_Create(&module); + } + ''; + destination = "/${snakeCaseName}/binding.c"; + }) + (pkgs.writeTextFile { + name = "${drvPrefix}-setup.py"; + text = '' + from platform import system + from setuptools import Extension, setup + + + setup( + name="${snakeCaseName}", + version="${version}", + packages=["${snakeCaseName}"], + ext_package="${snakeCaseName}", + ext_modules=[ + Extension( + name="_binding", + sources=["${snakeCaseName}/binding.c"], + extra_objects = ["${grammarDrv}/parser"], + extra_compile_args=( + ["-std=c11"] if system() != 'Windows' else [] + ), + define_macros=[ + ("Py_LIMITED_API", "0x03080000"), + ("PY_SSIZE_T_CLEAN", None) + ], + py_limited_api=True, + ) + ], + ) + ''; + destination = "/setup.py"; + }) + (pkgs.writeTextFile { + name = "${drvPrefix}-test"; + text = '' + from ${snakeCaseName} import language + from tree_sitter import Language, Parser + + + def test_language(): + lang = Language(language()) + assert lang is not None + parser = Parser() + parser.language = lang + tree = parser.parse(bytes("", "utf-8")) + assert tree is not None + ''; + destination = "/tests/test_language.py"; + }) + ]; + }; + + preCheck = '' + rm -r ${snakeCaseName} + ''; + + nativeCheckInputs = [ tree-sitter pytestCheckHook ]; + pythonImportsCheck = [ snakeCaseName ]; + + meta = { + description = "Python bindings for ${name}"; + maintainers = with lib.maintainers; [ a-jay98 adfaure mightyiam stepbrobd ]; + license = lib.licenses.mit; + }; +} diff --git a/pkgs/top-level/python-packages.nix b/pkgs/top-level/python-packages.nix index 9c5ea1a8510079e..d001595068cacd7 100644 --- a/pkgs/top-level/python-packages.nix +++ b/pkgs/top-level/python-packages.nix @@ -15483,6 +15483,17 @@ self: super: with self; { tree-sitter0_21 = callPackage ../development/python-modules/tree-sitter0_21 { }; + tree-sitter-grammars = lib.recurseIntoAttrs (lib.mapAttrs + (name: grammarDrv: callPackage ../development/python-modules/tree-sitter-grammars { inherit name grammarDrv; }) + (lib.attrsets.removeAttrs pkgs.tree-sitter.builtGrammars [ + # ImportError: /nix/store/7w7piy6hpdj1swdg5r0bz47gk2g3q855-tree-sitter-perl-grammar-0.22.5/parser: undefined symbol: isnumber + "tree-sitter-perl" + # ImportError: /nix/store/6rkhjf2mhwnfqwq2962fvv9bnd4xmpk7-python3.11-python-tree-sitter-ql-dbscheme-0.22.5/lib/python3.11/site-packages/tree_sitter_ql_dbscheme/_binding.abi3.so: undefined symbol: tree_sitter_ql_dbscheme + "tree-sitter-ql-dbscheme" + # ImportError: /nix/store/ybmnykhrgj6sghw4r7ypf897c4wrncr5-python3.11-python-tree-sitter-org-nvim-0.22.5/lib/python3.11/site-packages/tree_sitter_org_nvim/_binding.abi3.so: undefined symbol: tree_sitter_org_nvim + "tree-sitter-org-nvim" + ])); + tree-sitter-html = callPackage ../development/python-modules/tree-sitter-html { }; tree-sitter-python = callPackage ../development/python-modules/tree-sitter-python { };