DuckDB has a community extension that converts PascalCase to kebab-case in SQL
I had 18,115 AWS API operation names in PascalCase (DescribeInstances, PutBucketAcl, CreateVpcEndpoint) that needed to become kebab-case (describe-instances, put-bucket-acl, create-vpc-endpoint) for a CLI completer. A simple regex won’t handle it — AWS’s acronym casing is inconsistent across services, and I did not want to reimplement their conversion logic in Python.
DuckDB has a community extension called inflector that does it in SQL:
INSTALL inflector FROM community;
LOAD inflector;
SELECT inflector_to_kebab_case('DescribeInstances');
-- describe-instances
SELECT inflector_to_kebab_case('PutBucketAcl');
-- put-bucket-acl
SELECT inflector_to_kebab_case('CreateVpcEndpoint');
-- create-vpc-endpoint
All 18,115 operations in one query:
SELECT service_name, inflector_to_kebab_case(operation_name) as cli_command
FROM read_parquet('datalake/aws_api_catalog/dam_effective_date=*/operations.parquet',
hive_partitioning=true);
The full surface
The extension does more than kebab-case:
SELECT inflector_to_snake_case('DescribeInstances'); -- describe_instances
SELECT inflector_to_camel_case('describe_instances'); -- describeInstances
SELECT inflector_to_train_case('describe_instances'); -- Describe-Instances
SELECT inflector_to_title_case('describe_instances'); -- Describe Instances
SELECT inflector_to_plural('instance'); -- instances
SELECT inflector_to_singular('instances'); -- instance
It also works on struct column names — transform every key in a result set at once:
SELECT * FROM inflect('snake', (SELECT * FROM read_csv('CamelCaseHeaders.csv')));
I used it to keep the raw PascalCase botocore contract in parquet and transform at query time. The catalog preserves what AWS published. The consumer gets what the CLI expects. One extension, 18,115 operations, no slow Python string manipulation.