Skip to content

Commit 03e6cb9

Browse files
ctruedenclaude
andcommitted
Dump api for test sources, too
Co-authored-by: Claude <[email protected]>
1 parent 49fdff3 commit 03e6cb9

File tree

1 file changed

+81
-46
lines changed

1 file changed

+81
-46
lines changed

src/test/java/org/apposed/appose/DumpApi.java

Lines changed: 81 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -71,55 +71,69 @@ public class DumpApi {
7171
private static final Map<String, String> PACKAGE_TO_MODULE = new HashMap<>();
7272
static {
7373
// Core API classes.
74-
PACKAGE_TO_MODULE.put("org.apposed.appose.Appose", "__init__.api");
75-
PACKAGE_TO_MODULE.put("org.apposed.appose.Environment", "environment.api");
76-
PACKAGE_TO_MODULE.put("org.apposed.appose.Service", "service.api");
77-
PACKAGE_TO_MODULE.put("org.apposed.appose.Service.Task", "service.api");
78-
PACKAGE_TO_MODULE.put("org.apposed.appose.Service.TaskStatus", "service.api");
79-
PACKAGE_TO_MODULE.put("org.apposed.appose.Service.RequestType", "service.api");
80-
PACKAGE_TO_MODULE.put("org.apposed.appose.Service.ResponseType", "service.api");
81-
PACKAGE_TO_MODULE.put("org.apposed.appose.TaskEvent", "service.api");
82-
PACKAGE_TO_MODULE.put("org.apposed.appose.NDArray", "shm.api");
83-
PACKAGE_TO_MODULE.put("org.apposed.appose.NDArray.DType", "shm.api");
84-
PACKAGE_TO_MODULE.put("org.apposed.appose.NDArray.Shape", "shm.api");
85-
PACKAGE_TO_MODULE.put("org.apposed.appose.NDArray.Order", "shm.api");
86-
PACKAGE_TO_MODULE.put("org.apposed.appose.SharedMemory", "shm.api");
74+
PACKAGE_TO_MODULE.put("org.apposed.appose.Appose", "appose/__init__.api");
75+
PACKAGE_TO_MODULE.put("org.apposed.appose.Environment", "appose/environment.api");
76+
PACKAGE_TO_MODULE.put("org.apposed.appose.Service", "appose/service.api");
77+
PACKAGE_TO_MODULE.put("org.apposed.appose.Service.Task", "appose/service.api");
78+
PACKAGE_TO_MODULE.put("org.apposed.appose.Service.TaskStatus", "appose/service.api");
79+
PACKAGE_TO_MODULE.put("org.apposed.appose.Service.RequestType", "appose/service.api");
80+
PACKAGE_TO_MODULE.put("org.apposed.appose.Service.ResponseType", "appose/service.api");
81+
PACKAGE_TO_MODULE.put("org.apposed.appose.TaskEvent", "appose/service.api");
82+
PACKAGE_TO_MODULE.put("org.apposed.appose.NDArray", "appose/shm.api");
83+
PACKAGE_TO_MODULE.put("org.apposed.appose.NDArray.DType", "appose/shm.api");
84+
PACKAGE_TO_MODULE.put("org.apposed.appose.NDArray.Shape", "appose/shm.api");
85+
PACKAGE_TO_MODULE.put("org.apposed.appose.NDArray.Order", "appose/shm.api");
86+
PACKAGE_TO_MODULE.put("org.apposed.appose.SharedMemory", "appose/shm.api");
8787

8888
// Subsystem packages - all classes in package go to same file.
89-
PACKAGE_TO_MODULE.put("org.apposed.appose.scheme", "scheme.api");
90-
PACKAGE_TO_MODULE.put("org.apposed.appose.syntax", "syntax.api");
89+
PACKAGE_TO_MODULE.put("org.apposed.appose.scheme", "appose/scheme.api");
90+
PACKAGE_TO_MODULE.put("org.apposed.appose.syntax", "appose/syntax.api");
9191

9292
// Builder subsystem - core in builder/__init__.api, implementations in separate files.
93-
PACKAGE_TO_MODULE.put("org.apposed.appose.Builder", "builder/__init__.api");
94-
PACKAGE_TO_MODULE.put("org.apposed.appose.BuilderFactory", "builder/__init__.api");
95-
PACKAGE_TO_MODULE.put("org.apposed.appose.builder.Builders", "builder/__init__.api");
96-
PACKAGE_TO_MODULE.put("org.apposed.appose.builder.BaseBuilder", "builder/__init__.api");
97-
PACKAGE_TO_MODULE.put("org.apposed.appose.builder.DynamicBuilder", "builder/__init__.api");
98-
PACKAGE_TO_MODULE.put("org.apposed.appose.builder.SimpleBuilder", "builder/__init__.api");
99-
PACKAGE_TO_MODULE.put("org.apposed.appose.builder.MambaBuilder", "builder/mamba.api");
100-
PACKAGE_TO_MODULE.put("org.apposed.appose.builder.MambaBuilderFactory", "builder/mamba.api");
101-
PACKAGE_TO_MODULE.put("org.apposed.appose.builder.PixiBuilder", "builder/pixi.api");
102-
PACKAGE_TO_MODULE.put("org.apposed.appose.builder.PixiBuilderFactory", "builder/pixi.api");
103-
PACKAGE_TO_MODULE.put("org.apposed.appose.builder.UvBuilder", "builder/uv.api");
104-
PACKAGE_TO_MODULE.put("org.apposed.appose.builder.UvBuilderFactory", "builder/uv.api");
93+
PACKAGE_TO_MODULE.put("org.apposed.appose.Builder", "appose/builder/__init__.api");
94+
PACKAGE_TO_MODULE.put("org.apposed.appose.BuilderFactory", "appose/builder/__init__.api");
95+
PACKAGE_TO_MODULE.put("org.apposed.appose.builder.Builders", "appose/builder/__init__.api");
96+
PACKAGE_TO_MODULE.put("org.apposed.appose.builder.BaseBuilder", "appose/builder/__init__.api");
97+
PACKAGE_TO_MODULE.put("org.apposed.appose.builder.DynamicBuilder", "appose/builder/__init__.api");
98+
PACKAGE_TO_MODULE.put("org.apposed.appose.builder.SimpleBuilder", "appose/builder/__init__.api");
99+
PACKAGE_TO_MODULE.put("org.apposed.appose.builder.MambaBuilder", "appose/builder/mamba.api");
100+
PACKAGE_TO_MODULE.put("org.apposed.appose.builder.MambaBuilderFactory", "appose/builder/mamba.api");
101+
PACKAGE_TO_MODULE.put("org.apposed.appose.builder.PixiBuilder", "appose/builder/pixi.api");
102+
PACKAGE_TO_MODULE.put("org.apposed.appose.builder.PixiBuilderFactory", "appose/builder/pixi.api");
103+
PACKAGE_TO_MODULE.put("org.apposed.appose.builder.UvBuilder", "appose/builder/uv.api");
104+
PACKAGE_TO_MODULE.put("org.apposed.appose.builder.UvBuilderFactory", "appose/builder/uv.api");
105105

106106
// Tool subsystem - core in tool/__init__.api, implementations in separate files.
107-
PACKAGE_TO_MODULE.put("org.apposed.appose.tool.Tool", "tool/__init__.api");
108-
PACKAGE_TO_MODULE.put("org.apposed.appose.tool.Pixi", "tool/pixi.api");
109-
PACKAGE_TO_MODULE.put("org.apposed.appose.tool.Mamba", "tool/mamba.api");
110-
PACKAGE_TO_MODULE.put("org.apposed.appose.tool.Uv", "tool/uv.api");
107+
PACKAGE_TO_MODULE.put("org.apposed.appose.tool.Tool", "appose/tool/__init__.api");
108+
PACKAGE_TO_MODULE.put("org.apposed.appose.tool.Pixi", "appose/tool/pixi.api");
109+
PACKAGE_TO_MODULE.put("org.apposed.appose.tool.Mamba", "appose/tool/mamba.api");
110+
PACKAGE_TO_MODULE.put("org.apposed.appose.tool.Uv", "appose/tool/uv.api");
111111

112112
// Utility packages - singular naming.
113-
PACKAGE_TO_MODULE.put("org.apposed.appose.util.Downloads", "util/download.api");
114-
PACKAGE_TO_MODULE.put("org.apposed.appose.util.Environments", "util/environment.api");
115-
PACKAGE_TO_MODULE.put("org.apposed.appose.util.FilePaths", "util/filepath.api");
116-
PACKAGE_TO_MODULE.put("org.apposed.appose.util.Platforms", "util/platform.api");
117-
PACKAGE_TO_MODULE.put("org.apposed.appose.util.Processes", "util/process.api");
118-
PACKAGE_TO_MODULE.put("org.apposed.appose.util.Proxies", "util/proxy.api");
119-
PACKAGE_TO_MODULE.put("org.apposed.appose.util.Types", "util/types.api");
113+
PACKAGE_TO_MODULE.put("org.apposed.appose.util.Downloads", "appose/util/download.api");
114+
PACKAGE_TO_MODULE.put("org.apposed.appose.util.Environments", "appose/util/environment.api");
115+
PACKAGE_TO_MODULE.put("org.apposed.appose.util.FilePaths", "appose/util/filepath.api");
116+
PACKAGE_TO_MODULE.put("org.apposed.appose.util.Platforms", "appose/util/platform.api");
117+
PACKAGE_TO_MODULE.put("org.apposed.appose.util.Processes", "appose/util/process.api");
118+
PACKAGE_TO_MODULE.put("org.apposed.appose.util.Proxies", "appose/util/proxy.api");
119+
PACKAGE_TO_MODULE.put("org.apposed.appose.util.Types", "appose/util/types.api");
120120

121121
// Workers.
122-
PACKAGE_TO_MODULE.put("org.apposed.appose.GroovyWorker", "groovy_worker.api");
122+
PACKAGE_TO_MODULE.put("org.apposed.appose.GroovyWorker", "appose/groovy_worker.api");
123+
124+
// Test classes - map to tests/*.api files (aligned with Python structure).
125+
PACKAGE_TO_MODULE.put("org.apposed.appose.ServiceTest", "tests/test_service.api");
126+
PACKAGE_TO_MODULE.put("org.apposed.appose.SharedMemoryTest", "tests/test_shm.api");
127+
PACKAGE_TO_MODULE.put("org.apposed.appose.SyntaxTest", "tests/test_syntax.api");
128+
PACKAGE_TO_MODULE.put("org.apposed.appose.TaskExceptionTest", "tests/test_task_exception.api");
129+
PACKAGE_TO_MODULE.put("org.apposed.appose.builder.MambaBuilderTest", "tests/builder/test_mamba.api");
130+
PACKAGE_TO_MODULE.put("org.apposed.appose.builder.PixiBuilderTest", "tests/builder/test_pixi.api");
131+
PACKAGE_TO_MODULE.put("org.apposed.appose.builder.SimpleBuilderTest", "tests/builder/test_simple.api");
132+
PACKAGE_TO_MODULE.put("org.apposed.appose.builder.UvBuilderTest", "tests/builder/test_uv.api");
133+
PACKAGE_TO_MODULE.put("org.apposed.appose.builder.WrapTest", "tests/builder/test_wrap.api");
134+
PACKAGE_TO_MODULE.put("org.apposed.appose.util.FilePathsTest", "tests/util/test_filepath.api");
135+
PACKAGE_TO_MODULE.put("org.apposed.appose.util.TypesTest", "tests/util/test_types.api");
136+
PACKAGE_TO_MODULE.put("org.apposed.appose.util.VersionsTest", "tests/util/test_versions.api");
123137
}
124138

125139
// Static utility classes to dump as module-level functions (not as classes).
@@ -132,7 +146,20 @@ public class DumpApi {
132146
"org.apposed.appose.util.Platforms",
133147
"org.apposed.appose.util.Processes",
134148
"org.apposed.appose.util.Proxies",
135-
"org.apposed.appose.util.Types"
149+
"org.apposed.appose.util.Types",
150+
// Test classes - dump as module-level test functions.
151+
"org.apposed.appose.ServiceTest",
152+
"org.apposed.appose.SharedMemoryTest",
153+
"org.apposed.appose.SyntaxTest",
154+
"org.apposed.appose.TaskExceptionTest",
155+
"org.apposed.appose.builder.MambaBuilderTest",
156+
"org.apposed.appose.builder.PixiBuilderTest",
157+
"org.apposed.appose.builder.SimpleBuilderTest",
158+
"org.apposed.appose.builder.UvBuilderTest",
159+
"org.apposed.appose.builder.WrapTest",
160+
"org.apposed.appose.util.FilePathsTest",
161+
"org.apposed.appose.util.TypesTest",
162+
"org.apposed.appose.util.VersionsTest"
136163
));
137164

138165
// Classes to exclude from API dump (internal implementation details).
@@ -159,12 +186,12 @@ public static void main(String[] args) throws Exception {
159186
System.err.println("Usage: java DumpApi <output-dir> <source-dir> [source-dir2 ...]");
160187
System.err.println();
161188
System.err.println("Dumps Java API in Python stub format for comparison with appose-python.");
162-
System.err.println("Output will be written to <output-dir>/appose/*.api files.");
189+
System.err.println("Output will be written to <output-dir>/*.api files.");
163190
System.exit(1);
164191
}
165192

166193
String outputDirArg = args[0];
167-
Path outputDir = Paths.get(outputDirArg, "appose");
194+
Path outputDir = Paths.get(outputDirArg);
168195

169196
// Create output directory if needed.
170197
Files.createDirectories(outputDir);
@@ -333,11 +360,17 @@ static void dumpStaticUtilityAsModuleFunctions(TypeDeclaration<?> type) {
333360
}
334361
}
335362

336-
// Output static fields as module-level constants (public and private if INCLUDE_PRIVATE).
363+
// Check if this is a test class (affects how we handle fields and methods).
364+
// Test classes have instance fields/methods that should be dumped as module-level constants/functions.
365+
boolean isTestClass = isTestClass(type);
366+
367+
// Output fields as module-level constants (static fields for utilities, instance fields for test classes).
337368
for (BodyDeclaration<?> member : type.getMembers()) {
338369
if (member instanceof FieldDeclaration) {
339370
FieldDeclaration field = (FieldDeclaration) member;
340-
if (field.isStatic() && (field.isPublic() || INCLUDE_PRIVATE)) {
371+
// Include static fields for utilities, or instance/static fields for test classes.
372+
boolean includeField = (field.isStatic() || isTestClass) && (field.isPublic() || INCLUDE_PRIVATE);
373+
if (includeField) {
341374
for (VariableDeclarator var : field.getVariables()) {
342375
String fieldName = nonClassName(field, var).toUpperCase();
343376
String fieldType = pythonType(var.getType());
@@ -347,12 +380,14 @@ static void dumpStaticUtilityAsModuleFunctions(TypeDeclaration<?> type) {
347380
}
348381
}
349382

350-
// Collect all static methods (public and private if INCLUDE_PRIVATE).
383+
// Collect methods (static methods for utilities, instance methods for test classes).
351384
Map<String, List<MethodDeclaration>> methodsByName = new LinkedHashMap<>();
352385
for (BodyDeclaration<?> member : type.getMembers()) {
353386
if (member instanceof MethodDeclaration) {
354387
MethodDeclaration method = (MethodDeclaration) member;
355-
if (method.isStatic() && (method.isPublic() || INCLUDE_PRIVATE)) {
388+
// Include static methods for utilities, or instance methods for test classes.
389+
boolean includeMethod = (method.isStatic() || isTestClass) && (method.isPublic() || INCLUDE_PRIVATE);
390+
if (includeMethod) {
356391
String methodName = nonClassName(method);
357392
methodsByName.computeIfAbsent(methodName, k -> new ArrayList<>()).add(method);
358393
}

0 commit comments

Comments
 (0)