From 93a9562503a2b4ed8c37a01f11a28b04f93aad2d Mon Sep 17 00:00:00 2001 From: Robert James Hernandez Date: Thu, 20 Jun 2024 21:23:50 +0700 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 | 7 + 2 files changed, 135 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..ee3fc3b9b6bd061 --- /dev/null +++ b/pkgs/development/python-modules/tree-sitter-grammars/default.nix @@ -0,0 +1,128 @@ +{ lib +, buildPythonPackage +, pytestCheckHook +, tree-sitter +, symlinkJoin +, writeTextDir + # `name`: grammar derivation pname in the format of `tree-sitter-` +, name +, grammarDrv +}: +let + inherit (grammarDrv) version; + + snakeCaseName = lib.replaceStrings [ "-" ] [ "_" ] name; + drvPrefix = "python-${name}"; + langIdentOverrides = { + tree_sitter_org_nvim = "tree_sitter_org"; + }; + langIdent = langIdentOverrides.${snakeCaseName} or snakeCaseName; +in +assert (lib.assertMsg (!(grammarDrv.meta ? license)) '' + As of this writing, ${grammarDrv.pname} surprisingly doesn't have a license. + This trap is set here to guarantee that if it ever does have a license, this package will inherit the license. +''); +buildPythonPackage { + inherit version; + pname = drvPrefix; + + src = symlinkJoin { + name = "${drvPrefix}-source"; + paths = [ + (writeTextDir "${snakeCaseName}/__init__.py" + '' + from ._binding import language + + __all__ = ["language"] + '' + ) + (writeTextDir "${snakeCaseName}/binding.c" + '' + #include + + typedef struct TSLanguage TSLanguage; + + TSLanguage *${langIdent}(void); + + static PyObject* _binding_language(PyObject *self, PyObject *args) { + return PyLong_FromVoidPtr(${langIdent}()); + } + + 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); + } + '' + ) + (writeTextDir "setup.py" + '' + 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, + ) + ], + ) + '' + ) + (writeTextDir "tests/test_language.py" + '' + 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 + '' + ) + ]; + }; + + 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 ]; + }; +} diff --git a/pkgs/top-level/python-packages.nix b/pkgs/top-level/python-packages.nix index 8389ef11a8dd894..4eb63d755ad35ba 100644 --- a/pkgs/top-level/python-packages.nix +++ b/pkgs/top-level/python-packages.nix @@ -15486,6 +15486,13 @@ 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" + ])); + tree-sitter-html = callPackage ../development/python-modules/tree-sitter-html { }; tree-sitter-python = callPackage ../development/python-modules/tree-sitter-python { };