Skip to content

Commit efe7151

Browse files
committed
Auto format code generated clients
1 parent 93d8358 commit efe7151

File tree

3 files changed

+50
-24
lines changed

3 files changed

+50
-24
lines changed
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
#!/usr/bin/env python3
2+
3+
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
4+
# SPDX-License-Identifier: Apache-2.0.
5+
6+
"""
7+
Utility for formatting generated C++ code using clang-format
8+
"""
9+
import os
10+
import pathlib
11+
import re
12+
from subprocess import list2cmdline, run
13+
from tempfile import NamedTemporaryFile
14+
15+
CLANG_FORMAT_VERSION = '18.1.6'
16+
CLANG_FORMAT_INCLUDE_REGEX = re.compile(r'^.*\.(cpp|h)$')
17+
18+
19+
def format_directories(directory_list):
20+
"""Format C++ files in the given directories using clang-format"""
21+
filepaths_file = NamedTemporaryFile(delete=False)
22+
23+
for root_dir in directory_list:
24+
if os.path.exists(root_dir):
25+
for dirpath, dirnames, filenames in os.walk(root_dir):
26+
for filename in filenames:
27+
filepath = pathlib.Path(dirpath, filename).as_posix()
28+
if CLANG_FORMAT_INCLUDE_REGEX.match(filename):
29+
filepaths_file.write(f"{filepath}\n".encode())
30+
31+
filepaths_file.close()
32+
33+
cmd = ['pipx', 'run', f'clang-format=={CLANG_FORMAT_VERSION}',
34+
f'--files={filepaths_file.name}', '-i', '-style=file:.clang-format']
35+
36+
print(f"Formatting generated files: {list2cmdline(cmd)}")
37+
run(cmd)
38+
39+
# Clean up temp file
40+
os.unlink(filepaths_file.name)

tools/scripts/codegen/legacy_c2j_cpp_gen.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
from concurrent.futures import ProcessPoolExecutor, wait, FIRST_COMPLETED, ALL_COMPLETED
1717
from pathlib import Path
1818

19+
from codegen.format_util import format_directories
1920
from codegen.include_tests_util import IncludeTestsUtil
2021
from codegen.model_utils import ServiceModel
2122

@@ -141,6 +142,13 @@ def generate(self, executor: ProcessPoolExecutor, max_workers: int, args: dict)
141142
return -1
142143

143144
print(f"Code generation done, (re)generated {len(done)} packages.") # Including defaults and partitions
145+
146+
# Format generated client code
147+
generated_clients = [service for service in self.c2j_models.keys()]
148+
if generated_clients:
149+
client_dirs = [f"{self.output_location}/src/aws-cpp-sdk-{client}" for client in generated_clients]
150+
format_directories(client_dirs)
151+
144152
return 0
145153

146154
def _init_common_java_cli(self,

tools/scripts/codegen/protocol_tests_gen.py

Lines changed: 2 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@
1313
import sys
1414
from concurrent.futures import ProcessPoolExecutor, wait, FIRST_COMPLETED, ALL_COMPLETED
1515
from subprocess import list2cmdline, run
16-
from tempfile import NamedTemporaryFile
1716

17+
from codegen.format_util import format_directories
1818
from codegen.legacy_c2j_cpp_gen import LegacyC2jCppGen
1919
from codegen.model_utils import SERVICE_MODEL_FILENAME_PATTERN, ServiceModel, ModelUtils
2020

@@ -31,9 +31,6 @@
3131
UNSUPPORTED_CLIENTS = {}
3232
UNSUPPORTED_TESTS = {}
3333

34-
CLANG_FORMAT_VERSION = '18.1.6'
35-
CLANG_FORMAT_INCLUDE_REGEX = re.compile(r'^.*\.(cpp|h)$')
36-
3734
# Regexp to parse C2J model filename to extract service name and date version
3835
TEST_DEFINITION_FILENAME_PATTERN = re.compile(
3936
"^"
@@ -93,7 +90,7 @@ def generate(self, executor: ProcessPoolExecutor, max_workers: int):
9390
if self._generate_test_clients(executor, max_workers) == 0:
9491
result = self._generate_tests(executor, max_workers)
9592
if result == 0:
96-
self._format_generated_files()
93+
format_directories([self.generated_test_clients_dir, self.generated_tests_dir])
9794
return result
9895
return -1
9996

@@ -316,22 +313,3 @@ def _generate_single_protocol_test(self, models: ProtocolTestModel):
316313
dir_to_extract, dir_to_delete)
317314

318315
return name_for_logging, status
319-
320-
def _format_generated_files(self):
321-
"""Format generated C++ files using clang-format"""
322-
filepaths_file = NamedTemporaryFile(delete=False)
323-
324-
for root_dir in [self.generated_test_clients_dir, self.generated_tests_dir]:
325-
for dirpath, dirnames, filenames in os.walk(root_dir):
326-
for filename in filenames:
327-
filepath = pathlib.Path(dirpath, filename).as_posix()
328-
if CLANG_FORMAT_INCLUDE_REGEX.match(filename):
329-
filepaths_file.write(f"{filepath}\n".encode())
330-
331-
filepaths_file.close()
332-
333-
cmd = ['pipx', 'run', f'clang-format=={CLANG_FORMAT_VERSION}',
334-
f'--files={filepaths_file.name}', '-i', '-style=file:.clang-format']
335-
336-
print(f"Formatting generated files: {list2cmdline(cmd)}")
337-
run(cmd)

0 commit comments

Comments
 (0)