Skip to content

Commit 54b41ad

Browse files
committed
Add indent contextmanager
1 parent 396e75f commit 54b41ad

File tree

3 files changed

+56
-8
lines changed

3 files changed

+56
-8
lines changed

protogen/__init__.py

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,11 @@ def generate(gen: protogen.Plugin):
4949
5050
"""
5151

52+
import contextlib
5253
import enum
5354
import keyword
5455
import sys
55-
from typing import BinaryIO, Callable, Dict, List, Optional, Set, Tuple
56+
from typing import BinaryIO, Callable, Dict, List, Iterator, Optional, Set, Tuple
5657
from operator import ior
5758
from functools import reduce
5859

@@ -1483,6 +1484,34 @@ def set_indent(self, level: int) -> int:
14831484
self._indent = level
14841485
return old
14851486

1487+
@contextlib.contextmanager
1488+
def indent(self, level: int = 4) -> Iterator[None]:
1489+
"""Increments the indentation within a contextmanager block.
1490+
1491+
Increases the indentation level for all calls to :func:`P` within a
1492+
contextmanager block. When the enclosed block exits, the indentation
1493+
level will be restored to its prior level.
1494+
1495+
Arguments
1496+
---------
1497+
level : int
1498+
The amount to increment the indentation level by.
1499+
1500+
Example
1501+
-------
1502+
>>> g.P("class Myclass:")
1503+
>>> with g.indent():
1504+
... g.P("def __init__():")
1505+
... with g.indent():
1506+
... g.P("pass")
1507+
"""
1508+
old = self._indent
1509+
self._indent += level
1510+
try:
1511+
yield
1512+
finally:
1513+
self._indent = old
1514+
14861515
def P(self, *args):
14871516
"""Add a new line to the output buffer.
14881517

test/plugin/main.py

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -65,13 +65,11 @@ def generate_message(g: protogen.GeneratedFile, message: protogen.Message, lvl:
6565

6666

6767
def generate_enum(g: protogen.GeneratedFile, e: protogen.Enum, lvl: int):
68-
reset = g.set_indent(lvl)
69-
g.P("- name: ", e.full_name)
70-
g.P(" values:")
71-
for v in e.values:
72-
g.P(" - name: ", v.full_name)
73-
74-
g.set_indent(reset)
68+
with g.indent(lvl):
69+
g.P("- name: ", e.full_name)
70+
g.P(" values:")
71+
for v in e.values:
72+
g.P(" - name: ", v.full_name)
7573

7674

7775
def generate_service(g: protogen.Service, s: protogen.Service):

test/test_protogen.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import protogen
12
from protogen.test import run_plugin
23

34

@@ -43,3 +44,23 @@ def test_parameter():
4344
golden = f.read()
4445

4546
assert golden == generated
47+
48+
49+
def test_with_indent():
50+
g = protogen.GeneratedFile("test_with_indent", "")
51+
g.P("top-level")
52+
with g.indent(2):
53+
g.P("indented-by-two")
54+
with g.indent(4):
55+
g.P("indented-by-six")
56+
g.P("return-by-two")
57+
g.P("return-top-level")
58+
59+
expected = [
60+
"top-level",
61+
" indented-by-two",
62+
" indented-by-six",
63+
" return-by-two",
64+
"return-top-level",
65+
]
66+
assert g._buf == expected

0 commit comments

Comments
 (0)