Skip to content

Commit 3088ac4

Browse files
lnagelclaude
andauthored
Add SWIG %rename for automatic camelCase → snake_case API (#6)
Use SWIG %(undercase)s rename directives to automatically convert all C++ camelCase method names to Python snake_case. Excludes constructors, destructors, enum items, constants, and enum type declarations to avoid naming collisions (e.g. Recipient::Type vs Recipient::type). Update all call sites in tests, examples, and __init__.py to use the new snake_case names. Remove manual `as` renames from __init__.py since SWIG now handles the conversion. Fix Logger director declaration (ILogger → Logger). Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
1 parent d829d53 commit 3088ac4

6 files changed

Lines changed: 76 additions & 71 deletions

File tree

examples/create_cdoc.py

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -46,23 +46,23 @@ def main():
4646

4747
# Create the CDOC writer
4848
print(f"\nCreating CDOC file: {output_file}")
49-
writer = pycdoc.CDocWriter.createWriter(2, output_file, None, None, None)
49+
writer = pycdoc.CDocWriter.create_writer(2, output_file, None, None, None)
5050
if writer is None:
5151
print("ERROR: Failed to create writer")
5252
return 1
5353

5454
# Add recipient (the certificate holder can decrypt)
55-
recipient = pycdoc.Recipient.makeCertificate("Test User", cert_der)
56-
result = writer.addRecipient(recipient)
55+
recipient = pycdoc.Recipient.make_certificate("Test User", cert_der)
56+
result = writer.add_recipient(recipient)
5757
if result != pycdoc.OK:
58-
print(f"ERROR: addRecipient failed: {result}")
58+
print(f"ERROR: add_recipient failed: {result}")
5959
return 1
6060
print(" Added recipient: Test User")
6161

6262
# Begin encryption
63-
result = writer.beginEncryption()
63+
result = writer.begin_encryption()
6464
if result != pycdoc.OK:
65-
print(f"ERROR: beginEncryption failed: {result}")
65+
print(f"ERROR: begin_encryption failed: {result}")
6666
return 1
6767

6868
# Add files to the container
@@ -72,22 +72,22 @@ def main():
7272
]
7373

7474
for filename, content in files:
75-
result = writer.addFile(filename, len(content))
75+
result = writer.add_file(filename, len(content))
7676
if result != pycdoc.OK:
77-
print(f"ERROR: addFile failed for {filename}: {result}")
77+
print(f"ERROR: add_file failed for {filename}: {result}")
7878
return 1
7979

80-
result = writer.writeData(content)
80+
result = writer.write_data(content)
8181
if result != pycdoc.OK:
82-
print(f"ERROR: writeData failed for {filename}: {result}")
82+
print(f"ERROR: write_data failed for {filename}: {result}")
8383
return 1
8484

8585
print(f" Added file: {filename} ({len(content)} bytes)")
8686

8787
# Finish encryption
88-
result = writer.finishEncryption()
88+
result = writer.finish_encryption()
8989
if result != pycdoc.OK:
90-
print(f"ERROR: finishEncryption failed: {result}")
90+
print(f"ERROR: finish_encryption failed: {result}")
9191
return 1
9292

9393
# Clean up writer
@@ -99,14 +99,14 @@ def main():
9999

100100
# Read back the CDOC to verify
101101
print("\nReading CDOC file...")
102-
reader = pycdoc.CDocReader.createReader(output_file, None, None, None)
102+
reader = pycdoc.CDocReader.create_reader(output_file, None, None, None)
103103
if reader is None:
104104
print("ERROR: Failed to create reader")
105105
return 1
106106

107107
print(f" CDOC version: {reader.version}")
108108

109-
locks = reader.getLocks()
109+
locks = reader.get_locks()
110110
print(f" Recipients: {len(locks)}")
111111
for i, lock in enumerate(locks):
112112
print(f" [{i}] {lock.label}")

examples/create_cdoc_for_id.py

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -96,32 +96,32 @@ def fetch_certificate_from_ldap(personal_id: str) -> tuple[bytes, str]:
9696
def create_cdoc(cert_der: bytes, cn: str, output_file: str, files: list[tuple[str, bytes]]):
9797
"""Create a CDOC 2.0 file."""
9898
print(f"\nCreating CDOC file: {output_file}")
99-
writer = pycdoc.CDocWriter.createWriter(2, output_file, None, None, None)
99+
writer = pycdoc.CDocWriter.create_writer(2, output_file, None, None, None)
100100
if writer is None:
101101
raise RuntimeError("Failed to create writer")
102102

103-
recipient = pycdoc.Recipient.makeCertificate(cn, cert_der)
104-
result = writer.addRecipient(recipient)
103+
recipient = pycdoc.Recipient.make_certificate(cn, cert_der)
104+
result = writer.add_recipient(recipient)
105105
if result != pycdoc.OK:
106-
raise RuntimeError(f"addRecipient failed: {result}")
106+
raise RuntimeError(f"add_recipient failed: {result}")
107107
print(f" Recipient: {cn}")
108108

109-
result = writer.beginEncryption()
109+
result = writer.begin_encryption()
110110
if result != pycdoc.OK:
111-
raise RuntimeError(f"beginEncryption failed: {result}")
111+
raise RuntimeError(f"begin_encryption failed: {result}")
112112

113113
for filename, content in files:
114-
result = writer.addFile(filename, len(content))
114+
result = writer.add_file(filename, len(content))
115115
if result != pycdoc.OK:
116-
raise RuntimeError(f"addFile failed for {filename}: {result}")
117-
result = writer.writeData(content)
116+
raise RuntimeError(f"add_file failed for {filename}: {result}")
117+
result = writer.write_data(content)
118118
if result != pycdoc.OK:
119-
raise RuntimeError(f"writeData failed for {filename}: {result}")
119+
raise RuntimeError(f"write_data failed for {filename}: {result}")
120120
print(f" Added: {filename} ({len(content)} bytes)")
121121

122-
result = writer.finishEncryption()
122+
result = writer.finish_encryption()
123123
if result != pycdoc.OK:
124-
raise RuntimeError(f"finishEncryption failed: {result}")
124+
raise RuntimeError(f"finish_encryption failed: {result}")
125125

126126
del writer
127127
return os.path.getsize(output_file)
@@ -164,9 +164,9 @@ def main():
164164
print(f"\nCreated: {args.output} ({size} bytes)")
165165

166166
# Verify
167-
reader = pycdoc.CDocReader.createReader(args.output, None, None, None)
167+
reader = pycdoc.CDocReader.create_reader(args.output, None, None, None)
168168
if reader:
169-
print(f"\nVerified: CDOC {reader.version} with {len(reader.getLocks())} recipient(s)")
169+
print(f"\nVerified: CDOC {reader.version} with {len(reader.get_locks())} recipient(s)")
170170
del reader
171171

172172
print("\nDecrypt with: DigiDoc4 Client or cdoc-tool decrypt")

src/pycdoc/__init__.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@
1414

1515
from pycdoc.libcdoc import (
1616
# Version and utilities
17-
getVersion as get_version,
18-
getErrorStr as get_error_str,
17+
get_version,
18+
get_error_str,
1919

2020
# Result codes
2121
OK,
@@ -182,18 +182,18 @@ def encrypt(
182182

183183
try:
184184
# Create CDOC 2.0 writer
185-
writer = CDocWriter.createWriter(2, output_path, None, None, None)
185+
writer = CDocWriter.create_writer(2, output_path, None, None, None)
186186
if writer is None:
187187
raise RuntimeError("Failed to create CDOC writer")
188188

189189
# Add recipient
190-
recipient = Recipient.makeCertificate(cn, cert_der)
191-
result = writer.addRecipient(recipient)
190+
recipient = Recipient.make_certificate(cn, cert_der)
191+
result = writer.add_recipient(recipient)
192192
if result != OK:
193193
raise RuntimeError(f"Failed to add recipient: {get_error_str(result)}")
194194

195195
# Begin encryption
196-
result = writer.beginEncryption()
196+
result = writer.begin_encryption()
197197
if result != OK:
198198
raise RuntimeError(f"Failed to begin encryption: {get_error_str(result)}")
199199

@@ -222,15 +222,15 @@ def encrypt(
222222

223223
# Write files
224224
for name, content in files_to_write:
225-
result = writer.addFile(name, len(content))
225+
result = writer.add_file(name, len(content))
226226
if result != OK:
227227
raise RuntimeError(f"Failed to add file {name}: {get_error_str(result)}")
228-
result = writer.writeData(content)
228+
result = writer.write_data(content)
229229
if result != OK:
230230
raise RuntimeError(f"Failed to write data for {name}: {get_error_str(result)}")
231231

232232
# Finish encryption
233-
result = writer.finishEncryption()
233+
result = writer.finish_encryption()
234234
if result != OK:
235235
raise RuntimeError(f"Failed to finish encryption: {get_error_str(result)}")
236236

swig/pycdoc.i

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,18 @@
55
* template instantiations and director support.
66
*/
77

8+
/* Global camelCase → snake_case renaming for all functions and methods.
9+
Must appear BEFORE %include of upstream interface. */
10+
%rename("%(undercase)s", %$isfunction, %$not %$isconstructor, %$not %$isdestructor) "";
11+
%rename("%(undercase)s", %$ismember, %$not %$isenumitem, %$not %$isconstant, %$not %$isconstructor, %$not %$isdestructor, %$not %$isenum) "";
12+
813
/* Enable directors for Python subclassing of C++ classes */
914
%feature("director") libcdoc::DataSource;
1015
%feature("director") libcdoc::CryptoBackend;
1116
%feature("director") libcdoc::PKCS11Backend;
1217
%feature("director") libcdoc::NetworkBackend;
1318
%feature("director") libcdoc::Configuration;
14-
%feature("director") libcdoc::ILogger;
19+
%feature("director") libcdoc::Logger;
1520

1621
/* Include the upstream libcdoc SWIG interface */
1722
%include "libcdoc.i"

tests/test_basic.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ def test_recipient_type_default(self):
164164
def test_recipient_is_empty(self):
165165
from pycdoc import Recipient
166166
r = Recipient()
167-
assert r.isEmpty()
167+
assert r.is_empty()
168168

169169
def test_recipient_label(self):
170170
from pycdoc import Recipient

tests/test_integration.py

Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -55,29 +55,29 @@ def test_create_cdoc2_with_certificate(self):
5555

5656
try:
5757
# Create writer
58-
writer = pycdoc.CDocWriter.createWriter(2, cdoc_path, None, None, None)
58+
writer = pycdoc.CDocWriter.create_writer(2, cdoc_path, None, None, None)
5959
assert writer is not None
6060

6161
# Add recipient
62-
recipient = pycdoc.Recipient.makeCertificate("Test User", cert_der)
63-
assert recipient.isCertificate()
64-
result = writer.addRecipient(recipient)
62+
recipient = pycdoc.Recipient.make_certificate("Test User", cert_der)
63+
assert recipient.is_certificate()
64+
result = writer.add_recipient(recipient)
6565
assert result == pycdoc.OK
6666

6767
# Begin encryption
68-
result = writer.beginEncryption()
68+
result = writer.begin_encryption()
6969
assert result == pycdoc.OK
7070

7171
# Add a file
7272
content = b"Hello, World! This is a secret message."
73-
result = writer.addFile("test.txt", len(content))
73+
result = writer.add_file("test.txt", len(content))
7474
assert result == pycdoc.OK
7575

76-
result = writer.writeData(content)
76+
result = writer.write_data(content)
7777
assert result == pycdoc.OK
7878

7979
# Finish
80-
result = writer.finishEncryption()
80+
result = writer.finish_encryption()
8181
assert result == pycdoc.OK
8282
del writer
8383

@@ -99,10 +99,10 @@ def test_create_cdoc2_with_multiple_files(self):
9999
cdoc_path = f.name
100100

101101
try:
102-
writer = pycdoc.CDocWriter.createWriter(2, cdoc_path, None, None, None)
103-
recipient = pycdoc.Recipient.makeCertificate("Test User", cert_der)
104-
writer.addRecipient(recipient)
105-
writer.beginEncryption()
102+
writer = pycdoc.CDocWriter.create_writer(2, cdoc_path, None, None, None)
103+
recipient = pycdoc.Recipient.make_certificate("Test User", cert_der)
104+
writer.add_recipient(recipient)
105+
writer.begin_encryption()
106106

107107
# Add multiple files
108108
files = [
@@ -112,12 +112,12 @@ def test_create_cdoc2_with_multiple_files(self):
112112
]
113113

114114
for name, content in files:
115-
result = writer.addFile(name, len(content))
115+
result = writer.add_file(name, len(content))
116116
assert result == pycdoc.OK
117-
result = writer.writeData(content)
117+
result = writer.write_data(content)
118118
assert result == pycdoc.OK
119119

120-
writer.finishEncryption()
120+
writer.finish_encryption()
121121
del writer
122122

123123
assert os.path.getsize(cdoc_path) > 0
@@ -141,22 +141,22 @@ def test_read_cdoc_locks(self):
141141

142142
try:
143143
# Create a CDOC file first
144-
writer = pycdoc.CDocWriter.createWriter(2, cdoc_path, None, None, None)
145-
recipient = pycdoc.Recipient.makeCertificate("Test Recipient", cert_der)
146-
writer.addRecipient(recipient)
147-
writer.beginEncryption()
148-
writer.addFile("test.txt", 5)
149-
writer.writeData(b"hello")
150-
writer.finishEncryption()
144+
writer = pycdoc.CDocWriter.create_writer(2, cdoc_path, None, None, None)
145+
recipient = pycdoc.Recipient.make_certificate("Test Recipient", cert_der)
146+
writer.add_recipient(recipient)
147+
writer.begin_encryption()
148+
writer.add_file("test.txt", 5)
149+
writer.write_data(b"hello")
150+
writer.finish_encryption()
151151
del writer
152152

153153
# Read it back
154-
reader = pycdoc.CDocReader.createReader(cdoc_path, None, None, None)
154+
reader = pycdoc.CDocReader.create_reader(cdoc_path, None, None, None)
155155
assert reader is not None
156156
assert reader.version == 2
157157

158158
# Get locks
159-
locks = reader.getLocks()
159+
locks = reader.get_locks()
160160
assert len(locks) == 1
161161

162162
del reader
@@ -176,17 +176,17 @@ def test_get_cdoc_version(self):
176176

177177
try:
178178
# Create a CDOC 2 file
179-
writer = pycdoc.CDocWriter.createWriter(2, cdoc_path, None, None, None)
180-
recipient = pycdoc.Recipient.makeCertificate("Test", cert_der)
181-
writer.addRecipient(recipient)
182-
writer.beginEncryption()
183-
writer.addFile("test.txt", 4)
184-
writer.writeData(b"test")
185-
writer.finishEncryption()
179+
writer = pycdoc.CDocWriter.create_writer(2, cdoc_path, None, None, None)
180+
recipient = pycdoc.Recipient.make_certificate("Test", cert_der)
181+
writer.add_recipient(recipient)
182+
writer.begin_encryption()
183+
writer.add_file("test.txt", 4)
184+
writer.write_data(b"test")
185+
writer.finish_encryption()
186186
del writer
187187

188188
# Check version detection
189-
version = pycdoc.CDocReader.getCDocFileVersion(cdoc_path)
189+
version = pycdoc.CDocReader.get_cdoc_file_version(cdoc_path)
190190
assert version == 2
191191

192192
finally:

0 commit comments

Comments
 (0)