threads / patch / 52233

patchuserdiff: support Python async functions

Subject: [PATCH] userdiff: support Python async functions

## tl;dr

4 messages between Nov 11, 2019 and Nov 12, 2019. Diffs are folded; open one to read it.

replies: 3people: 3as markdown or json

Josh Holland· Nov 11, 2019, 01:01 UTC · lore

Python's async functions (declared with "async def" rather than "def") were not being displayed in hunk headers. This commit teaches git about the async function syntax, and adds tests for the Python userdiff regex.

Signed-off-by: Josh Holland <anowlcalledjosh@gmail.com>
---
 t/t4018/python-async-def | 4 ++++
 t/t4018/python-class     | 4 ++++
 t/t4018/python-def       | 4 ++++
 userdiff.c               | 2 +-
 4 files changed, 13 insertions(+), 1 deletion(-)
 create mode 100644 t/t4018/python-async-def
 create mode 100644 t/t4018/python-class
 create mode 100644 t/t4018/python-def
Show changes to 4 files +13 −1

t/t4018/python-async-def, t/t4018/python-class, t/t4018/python-def, userdiff.c

diff --git a/t/t4018/python-async-def b/t/t4018/python-async-def
new file mode 100644
index 000000000..87640e03d
--- /dev/null
+++ b/t/t4018/python-async-def
@@ -0,0 +1,4 @@
+async def RIGHT(pi: int = 3.14):
+    while True:
+        break
+    return ChangeMe()
diff --git a/t/t4018/python-class b/t/t4018/python-class
new file mode 100644
index 000000000..ba9e74143
--- /dev/null
+++ b/t/t4018/python-class
@@ -0,0 +1,4 @@
+class RIGHT(int, str):
+    # comment
+    # another comment
+    # ChangeMe
diff --git a/t/t4018/python-def b/t/t4018/python-def
new file mode 100644
index 000000000..e50b31b0a
--- /dev/null
+++ b/t/t4018/python-def
@@ -0,0 +1,4 @@
+def RIGHT(pi: int = 3.14):
+    while True:
+        break
+    return ChangeMe()
diff --git a/userdiff.c b/userdiff.c
index e74a6d402..057fdcc55 100644
--- a/userdiff.c
+++ b/userdiff.c
@@ -124,7 +124,7 @@ PATTERNS("php",
 	 "[a-zA-Z_][a-zA-Z0-9_]*"
 	 "|[-+0-9.e]+|0[xXbB]?[0-9a-fA-F]+"
 	 "|[-+*/<>%&^|=!.]=|--|\\+\\+|<<=?|>>=?|===|&&|\\|\\||::|->"),
-PATTERNS("python", "^[ \t]*((class|def)[ \t].*)$",
+PATTERNS("python", "^[ \t]*((class|(async[ \t]+)?def)[ \t].*)$",
 	 /* -- */
 	 "[a-zA-Z_][a-zA-Z0-9_]*"
 	 "|[-+0-9.e]+[jJlL]?|0[xX]?[0-9a-fA-F]+[lL]?"
-- 
2.24.0
Junio C Hamano· Nov 11, 2019, 02:28 UTC · re: Josh Holland · lore

Re: [PATCH] userdiff: support Python async functions

Josh Holland <anowlcalledjosh@gmail.com> writes:
Show 14 quoted lines
> Python's async functions (declared with "async def" rather than "def")
> were not being displayed in hunk headers. This commit teaches git about
> the async function syntax, and adds tests for the Python userdiff regex.
>
> Signed-off-by: Josh Holland <anowlcalledjosh@gmail.com>
> ---
>  t/t4018/python-async-def | 4 ++++
>  t/t4018/python-class     | 4 ++++
>  t/t4018/python-def       | 4 ++++
>  userdiff.c               | 2 +-
>  4 files changed, 13 insertions(+), 1 deletion(-)
>  create mode 100644 t/t4018/python-async-def
>  create mode 100644 t/t4018/python-class
>  create mode 100644 t/t4018/python-def

It seems that there were no test patterns for Python ;-) The change to userdiff.c part (i.e. "where we used to expect 'def', we now allow it to be prefixed with an optional 'async' plus whitespace") makes sense.

Thanks, will queue.
Johannes Sixt· Nov 11, 2019, 17:27 UTC · re: Josh Holland · lore

Re: [PATCH] userdiff: support Python async functions

Am 11.11.19 um 02:01 schrieb Josh Holland:
Show 45 quoted lines
> Python's async functions (declared with "async def" rather than "def")
> were not being displayed in hunk headers. This commit teaches git about
> the async function syntax, and adds tests for the Python userdiff regex.
> 
> Signed-off-by: Josh Holland <anowlcalledjosh@gmail.com>
> ---
>  t/t4018/python-async-def | 4 ++++
>  t/t4018/python-class     | 4 ++++
>  t/t4018/python-def       | 4 ++++
>  userdiff.c               | 2 +-
>  4 files changed, 13 insertions(+), 1 deletion(-)
>  create mode 100644 t/t4018/python-async-def
>  create mode 100644 t/t4018/python-class
>  create mode 100644 t/t4018/python-def
> 
> diff --git a/t/t4018/python-async-def b/t/t4018/python-async-def
> new file mode 100644
> index 000000000..87640e03d
> --- /dev/null
> +++ b/t/t4018/python-async-def
> @@ -0,0 +1,4 @@
> +async def RIGHT(pi: int = 3.14):
> +    while True:
> +        break
> +    return ChangeMe()
> diff --git a/t/t4018/python-class b/t/t4018/python-class
> new file mode 100644
> index 000000000..ba9e74143
> --- /dev/null
> +++ b/t/t4018/python-class
> @@ -0,0 +1,4 @@
> +class RIGHT(int, str):
> +    # comment
> +    # another comment
> +    # ChangeMe
> diff --git a/t/t4018/python-def b/t/t4018/python-def
> new file mode 100644
> index 000000000..e50b31b0a
> --- /dev/null
> +++ b/t/t4018/python-def
> @@ -0,0 +1,4 @@
> +def RIGHT(pi: int = 3.14):
> +    while True:
> +        break
> +    return ChangeMe()
Thank you for providing test cases for Python.

I have one gripe with this set of test, though: They do not demonstrate that the Python-specific pattern is better than the default pattern. In fact, if you remove the Python patterns from userdiff.c, you will observe that these tests still pass.

The one thing that the language specific pattern would do better than the default is that it picks up indented text. Could we have a test case or two that show that it indeed does?

Show 14 quoted lines
> diff --git a/userdiff.c b/userdiff.c
> index e74a6d402..057fdcc55 100644
> --- a/userdiff.c
> +++ b/userdiff.c
> @@ -124,7 +124,7 @@ PATTERNS("php",
>  	 "[a-zA-Z_][a-zA-Z0-9_]*"
>  	 "|[-+0-9.e]+|0[xXbB]?[0-9a-fA-F]+"
>  	 "|[-+*/<>%&^|=!.]=|--|\\+\\+|<<=?|>>=?|===|&&|\\|\\||::|->"),
> -PATTERNS("python", "^[ \t]*((class|def)[ \t].*)$",
> +PATTERNS("python", "^[ \t]*((class|(async[ \t]+)?def)[ \t].*)$",
>  	 /* -- */
>  	 "[a-zA-Z_][a-zA-Z0-9_]*"
>  	 "|[-+0-9.e]+[jJlL]?|0[xX]?[0-9a-fA-F]+[lL]?"
> 
-- Hannes
Junio C Hamano· Nov 12, 2019, 04:43 UTC · re: Johannes Sixt · lore

Re: [PATCH] userdiff: support Python async functions

Johannes Sixt <j6t@kdbg.org> writes:
Show 17 quoted lines
>> ...
>> @@ -0,0 +1,4 @@
>> +def RIGHT(pi: int = 3.14):
>> +    while True:
>> +        break
>> +    return ChangeMe()
>
> Thank you for providing test cases for Python.
>
> I have one gripe with this set of test, though: They do not demonstrate
> that the Python-specific pattern is better than the default pattern. In
> fact, if you remove the Python patterns from userdiff.c, you will
> observe that these tests still pass.
>
> The one thing that the language specific pattern would do better than
> the default is that it picks up indented text. Could we have a test case
> or two that show that it indeed does?

Good point. A method "def" inside a "class" would be one level indented; I am not sure if it is a kosher style to have "if" at the unindented top-level, whose body conditionally defines a "class", but such a class definition would also be indented, I guess.

Thanks.

← back to recent threads