Skip to content

Commit ee6bc85

Browse files
committed
add generate_getter() function
1 parent 50c56dc commit ee6bc85

4 files changed

Lines changed: 113 additions & 0 deletions

File tree

src/__init__.py

Whitespace-only changes.

src/method_generator.py

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import re
2+
from dataclasses import dataclass
3+
4+
5+
JAVA_KEYWORDS = {
6+
"abstract", "assert", "boolean", "break", "byte", "case", "catch",
7+
"char", "class", "const", "continue", "default", "do", "double",
8+
"else", "enum", "extends", "final", "finally", "float", "for",
9+
"goto", "if", "implements", "import", "instanceof", "int",
10+
"interface", "long", "native", "new", "package", "private",
11+
"protected", "public", "return", "short", "static", "strictfp",
12+
"super", "switch", "synchronized", "this", "throw", "throws",
13+
"transient", "try", "void", "volatile", "while"
14+
}
15+
16+
JAVA_BUILTIN_TYPES = {
17+
"Boolean", "Byte", "Character", "Double", "Float", "Integer", "List", "Long", "Short",
18+
"Class", "Object", "String", "Void"
19+
}
20+
21+
JAVA_LITERALS = {
22+
"null", "true", "false"
23+
}
24+
25+
26+
@dataclass
27+
class Field:
28+
name: str
29+
type: str
30+
31+
32+
def generate_getter(attr: Field) -> str:
33+
attr_name = attr.name
34+
attr_type = attr.type
35+
36+
_validate_java_identifier(attr_name)
37+
38+
getter_name = "get" + attr_name[0].upper() + attr_name[1:]
39+
40+
getter = f"""
41+
public {attr_type} {getter_name}() {{
42+
return {attr_name};
43+
}}
44+
"""
45+
return getter
46+
47+
48+
def _validate_java_identifier(name: str) -> None:
49+
if not name:
50+
raise ValueError("Field name cannot be empty")
51+
52+
if name in JAVA_KEYWORDS | JAVA_BUILTIN_TYPES | JAVA_LITERALS:
53+
raise ValueError(f"'{name}' is a Java reserved keyword")
54+
55+
if not re.match(r"^[A-Za-z_][A-Za-z0-9_]*$", name):
56+
raise ValueError(f"Invalid Java identifier: '{name}'")
57+

tests/__init__.py

Whitespace-only changes.

tests/test_method_generator.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import pytest
2+
3+
from src.method_generator import generate_getter, Field
4+
5+
JAVA_KEYWORDS = {
6+
"abstract", "assert", "boolean", "break", "byte", "case", "catch",
7+
"char", "class", "const", "continue", "default", "do", "double",
8+
"else", "enum", "extends", "final", "finally", "float", "for",
9+
"goto", "if", "implements", "import", "instanceof", "int",
10+
"interface", "long", "native", "new", "package", "private",
11+
"protected", "public", "return", "short", "static", "strictfp",
12+
"super", "switch", "synchronized", "this", "throw", "throws",
13+
"transient", "try", "void", "volatile", "while"
14+
}
15+
16+
JAVA_BUILTIN_TYPES = {
17+
"Boolean", "Byte", "Character", "Double", "Float", "Integer", "List", "Long", "Short",
18+
"Class", "Object", "String", "Void"
19+
}
20+
21+
JAVA_LITERALS = {
22+
"null", "true", "false"
23+
}
24+
25+
26+
def test_generate_getter_integer():
27+
attr = Field(
28+
name="exampleAttribute",
29+
type="Integer"
30+
)
31+
expected = """
32+
public Integer getExampleAttribute() {
33+
return exampleAttribute;
34+
}
35+
"""
36+
assert (generate_getter(attr) == expected)
37+
38+
39+
def test_generate_getter_string():
40+
attr = Field(name="someName", type="String")
41+
expected = """
42+
public String getSomeName() {
43+
return someName;
44+
}
45+
"""
46+
assert (generate_getter(attr) == expected)
47+
48+
49+
def test_generate_getter_invalid_name():
50+
EMPTY_NAMES = {None, ""}
51+
invalid_names = JAVA_KEYWORDS | JAVA_BUILTIN_TYPES | JAVA_LITERALS | EMPTY_NAMES
52+
for name in invalid_names:
53+
attr = Field(name=name, type="String")
54+
with pytest.raises(ValueError):
55+
generate_getter(attr)
56+

0 commit comments

Comments
 (0)