Skip to content

Commit 14bbe09

Browse files
committed
add class generator
1 parent 5f29313 commit 14bbe09

6 files changed

Lines changed: 168 additions & 6 deletions

File tree

src/class_generator.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
from src.header_generator import set_package, set_imports, render_javadoc
2+
from src.java_method_generator import generate_fields_block, generate_getters_and_setters, generate_equals, \
3+
generate_hash_code
4+
from src.java_model import JavaClass
5+
6+
7+
def generate_java_class(java_class: JavaClass, package: str) -> str:
8+
if len(java_class.fields) == 0:
9+
return _empty_java_class(java_class, package)
10+
11+
body = [
12+
set_package(package),
13+
"",
14+
"",
15+
set_imports(java_class.fields),
16+
"",
17+
render_javadoc(java_class.description, indent_lvl=0),
18+
f"public class {java_class.name} {{",
19+
generate_fields_block(java_class.fields),
20+
"",
21+
generate_getters_and_setters(java_class.fields),
22+
"",
23+
generate_equals(java_class.name, java_class.fields),
24+
"",
25+
generate_hash_code(java_class.fields),
26+
"}",
27+
""
28+
]
29+
return "\n".join(body)
30+
31+
32+
def _empty_java_class(java_class: JavaClass, package: str) -> str:
33+
body = [
34+
set_package(package),
35+
"",
36+
render_javadoc(java_class.description, indent_lvl=0),
37+
f"public class {java_class.name} {{",
38+
"}",
39+
""
40+
]
41+
return "\n".join(body)

src/enum_generator.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import re
22
from typing import List
33

4-
from src.java_model import EnumClass, indent
54
from src.header_generator import set_package, render_javadoc
5+
from src.java_model import EnumClass, indent
66

77

88
def to_java_constant(value: str) -> str:

src/java_method_generator.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,8 @@ def _render_equals_return_statement(fields: List[Field]) -> str:
8383
getter_name = _build_getter_name(field.name)
8484
end_line = ";" if i == (len(fields) - 1) else ""
8585
if i == 0:
86-
return_statement.append(f"{indent(2)}return Objects.equals({getter_name}(), that.{getter_name}()){end_line}")
86+
return_statement.append(
87+
f"{indent(2)}return Objects.equals({getter_name}(), that.{getter_name}()){end_line}")
8788
else:
8889
return_statement.append(
8990
f"{indent(4)}&& Objects.equals({getter_name}(), that.{getter_name}()){end_line}")

src/java_model.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,3 @@ def indent(level: int, size: int = 4) -> str:
4646
raise ValueError("Indent size cannot be lower than 0")
4747

4848
return " " * size * level
49-
50-
51-
52-

tests/reference_data_java_class.py

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
from src.java_model import Field, JavaClass
2+
3+
package_example = "expected.DataTypes"
4+
field_name_string = Field(name="name", type="String", description="This contains name.")
5+
field_age_int = Field(name="age", type="int", description="This contains age.")
6+
field_birthdate_date = Field(name="birthDate", type="Date")
7+
field_additionalInfo_CustomObject = Field(name="additionalInfo", type="CustomData")
8+
9+
person_class_fields = [field_name_string, field_age_int, field_birthdate_date, field_additionalInfo_CustomObject]
10+
11+
class_person = JavaClass(name="Person", fields=person_class_fields, description="Contains information about a person.")
12+
class_heartbeat = JavaClass(name="Heartbeat", fields=[])
13+
14+
expected_java_class_person = """\
15+
package expected.DataTypes;
16+
17+
18+
import java.util.Date;
19+
import java.util.Objects;
20+
21+
22+
/**
23+
* Contains information about a person.
24+
*/
25+
public class Person {
26+
27+
/**
28+
* This contains name.
29+
*/
30+
private String name;
31+
32+
/**
33+
* This contains age.
34+
*/
35+
private int age;
36+
37+
private Date birthDate;
38+
39+
private CustomData additionalInfo;
40+
41+
42+
public String getName() {
43+
return name;
44+
}
45+
46+
47+
public void setName(String name) {
48+
this.name = name;
49+
}
50+
51+
52+
public int getAge() {
53+
return age;
54+
}
55+
56+
57+
public void setAge(int age) {
58+
this.age = age;
59+
}
60+
61+
62+
public Date getBirthDate() {
63+
return birthDate;
64+
}
65+
66+
67+
public void setBirthDate(Date birthDate) {
68+
this.birthDate = birthDate;
69+
}
70+
71+
72+
public CustomData getAdditionalInfo() {
73+
return additionalInfo;
74+
}
75+
76+
77+
public void setAdditionalInfo(CustomData additionalInfo) {
78+
this.additionalInfo = additionalInfo;
79+
}
80+
81+
82+
@Override
83+
public boolean equals(Object obj) {
84+
if (this == obj)
85+
return true;
86+
if (!(obj instanceof Person))
87+
return false;
88+
Person that = (Person) obj;
89+
return Objects.equals(getName(), that.getName())
90+
&& Objects.equals(getAge(), that.getAge())
91+
&& Objects.equals(getBirthDate(), that.getBirthDate())
92+
&& Objects.equals(getAdditionalInfo(), that.getAdditionalInfo());
93+
}
94+
95+
96+
@Override
97+
public int hashCode() {
98+
return Objects.hash(
99+
getName(),
100+
getAge(),
101+
getBirthDate(),
102+
getAdditionalInfo()
103+
);
104+
}
105+
}
106+
"""
107+
108+
expected_java_class_heartbeat = """\
109+
package expected.DataTypes;
110+
111+
112+
public class Heartbeat {
113+
}
114+
"""

tests/test_class_generator.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
from src.class_generator import generate_java_class
2+
from tests.reference_data_java_class import *
3+
4+
5+
def test_generate_java_class():
6+
assert generate_java_class(class_person, package_example) == expected_java_class_person
7+
8+
9+
def test_generate_java_class_no_fields():
10+
assert generate_java_class(class_heartbeat, package_example) == expected_java_class_heartbeat

0 commit comments

Comments
 (0)