Skip to content

Commit 54a40f3

Browse files
committed
added create_app command to standalone module
1 parent 7b83f7b commit 54a40f3

File tree

17 files changed

+2047
-46
lines changed

17 files changed

+2047
-46
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ mx.graalpython/eclipse-launches
2424
asv
2525
*.json
2626
!**/resources/*.json
27+
!graalpython/lib-graalpython/modules/standalone/app/native-image-resources.json
2728
language
2829
*.bc
2930
*.iml

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/GraalPythonModuleBuiltins.java

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,14 +60,19 @@
6060
import static com.oracle.graal.python.util.PythonUtils.toTruffleStringUncached;
6161
import static com.oracle.graal.python.util.PythonUtils.tsLiteral;
6262

63+
import java.io.BufferedWriter;
6364
import java.io.File;
65+
import java.io.FileOutputStream;
6466
import java.io.IOException;
6567
import java.io.InputStreamReader;
68+
import java.io.OutputStream;
69+
import java.io.OutputStreamWriter;
6670
import java.io.PrintWriter;
6771
import java.nio.charset.StandardCharsets;
6872
import java.nio.file.Files;
6973
import java.nio.file.Path;
7074
import java.nio.file.Paths;
75+
import java.util.ArrayList;
7176
import java.util.Arrays;
7277
import java.util.List;
7378
import java.util.logging.Level;
@@ -943,4 +948,61 @@ static PythonClass createType(VirtualFrame frame, TruffleString name, PTuple bas
943948
return createType.execute(frame, namespaceOrig, name, bases, metaclass, PKeyword.EMPTY_KEYWORDS);
944949
}
945950
}
951+
952+
@Builtin(name = "list_files", minNumOfPositionalArgs = 2)
953+
@GenerateNodeFactory
954+
abstract static class ListFiles extends PythonBinaryBuiltinNode {
955+
@TruffleBoundary
956+
@Specialization
957+
Object list(TruffleString dirPath, TruffleString filesListPath) {
958+
print(getContext().getStandardOut(), String.format("listing files from '%s' to '%s'\n", dirPath, filesListPath));
959+
960+
File dir = new File(dirPath.toJavaStringUncached());
961+
if (!dir.exists() || !dir.isDirectory()) {
962+
print(getContext().getStandardErr(), String.format("'%s' has to exist and be a directory.\n", dirPath));
963+
}
964+
new File(filesListPath.toJavaStringUncached()).getParentFile().mkdirs();
965+
966+
try (BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filesListPath.toJavaStringUncached())))) {
967+
List<String> ret = list(dir);
968+
String parentPathString = dir.getParentFile().getAbsolutePath();
969+
for (String f : ret) {
970+
bw.write(f.substring(parentPathString.length()));
971+
bw.write("\n");
972+
}
973+
} catch (IOException e) {
974+
String msg = String.format("error while creating '%s': %s \n", filesListPath, e);
975+
print(getContext().getStandardErr(), msg);
976+
}
977+
return PNone.NONE;
978+
}
979+
980+
private static List<String> list(File dir) {
981+
List<String> ret = new ArrayList<>();
982+
File[] files = dir.listFiles();
983+
String dirPath = dir.getAbsolutePath();
984+
if (!dirPath.endsWith("/")) {
985+
dirPath = dirPath + "/";
986+
}
987+
ret.add(dirPath);
988+
if (files != null) {
989+
for (File f : files) {
990+
if (f.isFile()) {
991+
ret.add(f.getAbsolutePath());
992+
} else {
993+
ret.addAll(list(f));
994+
}
995+
}
996+
}
997+
return ret;
998+
}
999+
1000+
private void print(OutputStream out, String msg) {
1001+
try {
1002+
out.write(String.format("%s: %s", getContext().getOption(PythonOptions.Executable), msg).getBytes(StandardCharsets.UTF_8));
1003+
} catch (IOException ioException) {
1004+
// Ignore
1005+
}
1006+
}
1007+
}
9461008
}
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
# Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
2+
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
3+
#
4+
# The Universal Permissive License (UPL), Version 1.0
5+
#
6+
# Subject to the condition set forth below, permission is hereby granted to any
7+
# person obtaining a copy of this software, associated documentation and/or
8+
# data (collectively the "Software"), free of charge and under any and all
9+
# copyright rights in the Software, and any and all patent rights owned or
10+
# freely licensable by each licensor hereunder covering either (i) the
11+
# unmodified Software as contributed to or provided by such licensor, or (ii)
12+
# the Larger Works (as defined below), to deal in both
13+
#
14+
# (a) the Software, and
15+
#
16+
# (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if
17+
# one is included with the Software each a "Larger Work" to which the Software
18+
# is contributed by such licensors),
19+
#
20+
# without restriction, including without limitation the rights to copy, create
21+
# derivative works of, display, perform, and distribute the Software and make,
22+
# use, sell, offer for sale, import, export, have made, and have sold the
23+
# Software and the Larger Work(s), and to sublicense the foregoing rights on
24+
# either these or other terms.
25+
#
26+
# This license is subject to the following condition:
27+
#
28+
# The above copyright notice and either this complete permission notice or at a
29+
# minimum a reference to the UPL must be included in all copies or substantial
30+
# portions of the Software.
31+
#
32+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
33+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
34+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
35+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
36+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
37+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
38+
# SOFTWARE.
39+
40+
"""Create and build a skeleton maven java polyglot pythn project.
41+
42+
43+
"""
44+
45+
import argparse
46+
import itertools
47+
import os
48+
import shutil
49+
import sys
50+
import zipfile
51+
52+
assert sys.pycache_prefix is None
53+
54+
55+
def ensure_directories(zf, path):
56+
"""
57+
Recursively create directory entries in a zip file.
58+
"""
59+
for prefix in itertools.accumulate(path.split("/"), func=lambda a, b: f"{a}/{b}"):
60+
dirname = f"{prefix}/"
61+
try:
62+
zf.getinfo(dirname)
63+
except KeyError:
64+
zf.writestr(zipfile.ZipInfo(dirname), b"")
65+
66+
def main(args):
67+
parser = argparse.ArgumentParser(prog=f"{sys.executable} -m standalone")
68+
parser.add_argument(
69+
"--keep-temp", action="store_true", help="Keep temporary files for debugging."
70+
)
71+
parser.add_argument(
72+
"-o",
73+
"--output-directory",
74+
help="The directory to write the Java project to.",
75+
required=True,
76+
)
77+
78+
parsed_args = parser.parse_args(args)
79+
80+
target_dir = parsed_args.output_directory
81+
os.makedirs(target_dir, exist_ok=True)
82+
83+
shutil.copytree(os.path.join(os.path.dirname(__file__), "app/src"), os.path.join(target_dir, "src"))
84+
85+
vfs_home = os.path.join(target_dir, "src", "main", "resources", "vfs", "home")
86+
os.makedirs(vfs_home, exist_ok=True)
87+
shutil.copytree(__graalpython__.capi_home, os.path.join(vfs_home, "lib-graalpython"))
88+
shutil.copytree(__graalpython__.stdlib_home, os.path.join(vfs_home, "lib-python", "3"))
89+
90+
shutil.copy(os.path.join(os.path.dirname(__file__), "app/native-image-resources.json"), target_dir )
91+
shutil.copy(os.path.join(os.path.dirname(__file__), "app/pom.xml"), target_dir)
92+
93+
if __name__ == "__main__":
94+
main(sys.argv[1:])

0 commit comments

Comments
 (0)