diff --git a/src/gbstoolkit/gbstoolkit.py b/gbstoolkit/__init__.py similarity index 96% rename from src/gbstoolkit/gbstoolkit.py rename to gbstoolkit/__init__.py index 762215b..7aecee6 100644 --- a/src/gbstoolkit/gbstoolkit.py +++ b/gbstoolkit/__init__.py @@ -10,9 +10,8 @@ from kdl import parse -from dsl.project import Project -from dsl.util import serialize, ProgressTracker, PrintProgressTracker, QueueProgressTracker - +from .dsl.project import Project +from .dsl.util import serialize, ProgressTracker, PrintProgressTracker, QueueProgressTracker def format_project(project_file: str, project_root: str, progress: ProgressTracker): try: @@ -78,7 +77,8 @@ def format_project(project_file: str, project_root: str, progress: ProgressTrack def parse_project(project_file: str, project_root: str, progress: ProgressTracker): try: progress.set_status("Parsing project metadata and assets") - docs = {i.name[:-4]: parse(open(project_root + "/" + i.name, encoding="utf-8").read()) for i in os.scandir(project_root) + docs = {i.name[:-4]: parse(open(project_root + "/" + i.name, encoding="utf-8").read()) for i in + os.scandir(project_root) if i.is_file() and i.name.endswith(".kdl")} project = Project.parse(docs, project_root, progress) progress.set_status("Exporting into JSON") @@ -220,6 +220,12 @@ def run_cli(): parse_project(args.file, args.dir, PrintProgressTracker()) +def run_app(): + root = tkinter.Tk() + app = Application(root) + app.master.title("GBS Toolkit") + app.mainloop() + + if __name__ == "__main__": run_cli() - \ No newline at end of file diff --git a/gbstoolkit/__main__.py b/gbstoolkit/__main__.py new file mode 100644 index 0000000..4fdc206 --- /dev/null +++ b/gbstoolkit/__main__.py @@ -0,0 +1,4 @@ +from . import run_cli + +if __name__ == "__main__": + run_cli() \ No newline at end of file diff --git a/src/gbstoolkit/__init__.py b/gbstoolkit/dsl/__init__.py similarity index 100% rename from src/gbstoolkit/__init__.py rename to gbstoolkit/dsl/__init__.py diff --git a/src/gbstoolkit/dsl/actor.py b/gbstoolkit/dsl/actor.py similarity index 100% rename from src/gbstoolkit/dsl/actor.py rename to gbstoolkit/dsl/actor.py diff --git a/src/gbstoolkit/dsl/assets.py b/gbstoolkit/dsl/assets.py similarity index 100% rename from src/gbstoolkit/dsl/assets.py rename to gbstoolkit/dsl/assets.py diff --git a/src/gbstoolkit/dsl/command/__init__.py b/gbstoolkit/dsl/command/__init__.py similarity index 100% rename from src/gbstoolkit/dsl/command/__init__.py rename to gbstoolkit/dsl/command/__init__.py diff --git a/src/gbstoolkit/dsl/command/cmd_actor.py b/gbstoolkit/dsl/command/cmd_actor.py similarity index 100% rename from src/gbstoolkit/dsl/command/cmd_actor.py rename to gbstoolkit/dsl/command/cmd_actor.py diff --git a/src/gbstoolkit/dsl/command/cmd_base.py b/gbstoolkit/dsl/command/cmd_base.py similarity index 100% rename from src/gbstoolkit/dsl/command/cmd_base.py rename to gbstoolkit/dsl/command/cmd_base.py diff --git a/src/gbstoolkit/dsl/command/cmd_camera.py b/gbstoolkit/dsl/command/cmd_camera.py similarity index 100% rename from src/gbstoolkit/dsl/command/cmd_camera.py rename to gbstoolkit/dsl/command/cmd_camera.py diff --git a/src/gbstoolkit/dsl/command/cmd_engine.py b/gbstoolkit/dsl/command/cmd_engine.py similarity index 100% rename from src/gbstoolkit/dsl/command/cmd_engine.py rename to gbstoolkit/dsl/command/cmd_engine.py diff --git a/src/gbstoolkit/dsl/command/cmd_flowcontrol.py b/gbstoolkit/dsl/command/cmd_flowcontrol.py similarity index 100% rename from src/gbstoolkit/dsl/command/cmd_flowcontrol.py rename to gbstoolkit/dsl/command/cmd_flowcontrol.py diff --git a/src/gbstoolkit/dsl/command/cmd_misc.py b/gbstoolkit/dsl/command/cmd_misc.py similarity index 100% rename from src/gbstoolkit/dsl/command/cmd_misc.py rename to gbstoolkit/dsl/command/cmd_misc.py diff --git a/src/gbstoolkit/dsl/command/cmd_scene.py b/gbstoolkit/dsl/command/cmd_scene.py similarity index 100% rename from src/gbstoolkit/dsl/command/cmd_scene.py rename to gbstoolkit/dsl/command/cmd_scene.py diff --git a/src/gbstoolkit/dsl/command/cmd_text.py b/gbstoolkit/dsl/command/cmd_text.py similarity index 100% rename from src/gbstoolkit/dsl/command/cmd_text.py rename to gbstoolkit/dsl/command/cmd_text.py diff --git a/src/gbstoolkit/dsl/command/cmd_timing.py b/gbstoolkit/dsl/command/cmd_timing.py similarity index 100% rename from src/gbstoolkit/dsl/command/cmd_timing.py rename to gbstoolkit/dsl/command/cmd_timing.py diff --git a/src/gbstoolkit/dsl/command/cmd_variable.py b/gbstoolkit/dsl/command/cmd_variable.py similarity index 100% rename from src/gbstoolkit/dsl/command/cmd_variable.py rename to gbstoolkit/dsl/command/cmd_variable.py diff --git a/src/gbstoolkit/dsl/datatypes.py b/gbstoolkit/dsl/datatypes.py similarity index 100% rename from src/gbstoolkit/dsl/datatypes.py rename to gbstoolkit/dsl/datatypes.py diff --git a/src/gbstoolkit/dsl/enums.py b/gbstoolkit/dsl/enums.py similarity index 100% rename from src/gbstoolkit/dsl/enums.py rename to gbstoolkit/dsl/enums.py diff --git a/src/gbstoolkit/dsl/event.py b/gbstoolkit/dsl/event.py similarity index 100% rename from src/gbstoolkit/dsl/event.py rename to gbstoolkit/dsl/event.py diff --git a/src/gbstoolkit/dsl/marshalling.py b/gbstoolkit/dsl/marshalling.py similarity index 100% rename from src/gbstoolkit/dsl/marshalling.py rename to gbstoolkit/dsl/marshalling.py diff --git a/src/gbstoolkit/dsl/palette.py b/gbstoolkit/dsl/palette.py similarity index 100% rename from src/gbstoolkit/dsl/palette.py rename to gbstoolkit/dsl/palette.py diff --git a/src/gbstoolkit/dsl/project.py b/gbstoolkit/dsl/project.py similarity index 100% rename from src/gbstoolkit/dsl/project.py rename to gbstoolkit/dsl/project.py diff --git a/src/gbstoolkit/dsl/scene.py b/gbstoolkit/dsl/scene.py similarity index 100% rename from src/gbstoolkit/dsl/scene.py rename to gbstoolkit/dsl/scene.py diff --git a/src/gbstoolkit/dsl/settings.py b/gbstoolkit/dsl/settings.py similarity index 100% rename from src/gbstoolkit/dsl/settings.py rename to gbstoolkit/dsl/settings.py diff --git a/src/gbstoolkit/dsl/trigger.py b/gbstoolkit/dsl/trigger.py similarity index 100% rename from src/gbstoolkit/dsl/trigger.py rename to gbstoolkit/dsl/trigger.py diff --git a/src/gbstoolkit/dsl/util.py b/gbstoolkit/dsl/util.py similarity index 100% rename from src/gbstoolkit/dsl/util.py rename to gbstoolkit/dsl/util.py diff --git a/pyoxidizer.bzl b/pyoxidizer.bzl new file mode 100644 index 0000000..1141fa2 --- /dev/null +++ b/pyoxidizer.bzl @@ -0,0 +1,351 @@ +# This file defines how PyOxidizer application building and packaging is +# performed. See PyOxidizer's documentation at +# https://pyoxidizer.readthedocs.io/en/stable/ for details of this +# configuration file format. + +PROJECT_VERSION = "1.0.0" # has to be in here because Starlark can't open files, wheee + +# Configuration files consist of functions which define build "targets." +# This function creates a Python executable and installs it in a destination +# directory. +def make_exe(): + # Obtain the default PythonDistribution for our build target. We link + # this distribution into our produced executable and extract the Python + # standard library from it. + dist = default_python_distribution() + + # This function creates a `PythonPackagingPolicy` instance, which + # influences how executables are built and how resources are added to + # the executable. You can customize the default behavior by assigning + # to attributes and calling functions. + policy = dist.make_python_packaging_policy() + + # Enable support for non-classified "file" resources to be added to + # resource collections. + # policy.allow_files = True + + # Control support for loading Python extensions and other shared libraries + # from memory. This is only supported on Windows and is ignored on other + # platforms. + # policy.allow_in_memory_shared_library_loading = True + + # Control whether to generate Python bytecode at various optimization + # levels. The default optimization level used by Python is 0. + # policy.bytecode_optimize_level_zero = True + # policy.bytecode_optimize_level_one = True + # policy.bytecode_optimize_level_two = True + + # Package all available Python extensions in the distribution. + # policy.extension_module_filter = "all" + + # Package the minimum set of Python extensions in the distribution needed + # to run a Python interpreter. Various functionality from the Python + # standard library won't work with this setting! But it can be used to + # reduce the size of generated executables by omitting unused extensions. + # policy.extension_module_filter = "minimal" + + # Package Python extensions in the distribution not having additional + # library dependencies. This will exclude working support for SSL, + # compression formats, and other functionality. + # policy.extension_module_filter = "no-libraries" + + # Package Python extensions in the distribution not having a dependency on + # copyleft licensed software like GPL. + # policy.extension_module_filter = "no-copyleft" + + # Controls whether the file scanner attempts to classify files and emit + # resource-specific values. + # policy.file_scanner_classify_files = True + + # Controls whether `File` instances are emitted by the file scanner. + # policy.file_scanner_emit_files = False + + # Controls the `add_include` attribute of "classified" resources + # (`PythonModuleSource`, `PythonPackageResource`, etc). + # policy.include_classified_resources = True + + # Toggle whether Python module source code for modules in the Python + # distribution's standard library are included. + # policy.include_distribution_sources = False + + # Toggle whether Python package resource files for the Python standard + # library are included. + # policy.include_distribution_resources = False + + # Controls the `add_include` attribute of `File` resources. + # policy.include_file_resources = False + + # Controls the `add_include` attribute of `PythonModuleSource` not in + # the standard library. + # policy.include_non_distribution_sources = True + + # Toggle whether files associated with tests are included. + # policy.include_test = False + + # Resources are loaded from "in-memory" or "filesystem-relative" paths. + # The locations to attempt to add resources to are defined by the + # `resources_location` and `resources_location_fallback` attributes. + # The former is the first/primary location to try and the latter is + # an optional fallback. + + # Use in-memory location for adding resources by default. + # policy.resources_location = "in-memory" + + # Use filesystem-relative location for adding resources by default. + # policy.resources_location = "filesystem-relative:prefix" + + # Attempt to add resources relative to the built binary when + # `resources_location` fails. + # policy.resources_location_fallback = "filesystem-relative:prefix" + + # Clear out a fallback resource location. + # policy.resources_location_fallback = None + + # Define a preferred Python extension module variant in the Python distribution + # to use. + # policy.set_preferred_extension_module_variant("foo", "bar") + + # Configure policy values to classify files as typed resources. + # (This is the default.) + # policy.set_resource_handling_mode("classify") + + # Configure policy values to handle files as files and not attempt + # to classify files as specific types. + # policy.set_resource_handling_mode("files") + + # This variable defines the configuration of the embedded Python + # interpreter. By default, the interpreter will run a Python REPL + # using settings that are appropriate for an "isolated" run-time + # environment. + # + # The configuration of the embedded Python interpreter can be modified + # by setting attributes on the instance. Some of these are + # documented below. + python_config = dist.make_python_interpreter_config() + + # Make the embedded interpreter behave like a `python` process. + # python_config.config_profile = "python" + + # Set initial value for `sys.path`. If the string `$ORIGIN` exists in + # a value, it will be expanded to the directory of the built executable. + # python_config.module_search_paths = ["$ORIGIN/lib"] + + # Use jemalloc as Python's memory allocator. + # python_config.allocator_backend = "jemalloc" + + # Use mimalloc as Python's memory allocator. + # python_config.allocator_backend = "mimalloc" + + # Use snmalloc as Python's memory allocator. + # python_config.allocator_backend = "snmalloc" + + # Let Python choose which memory allocator to use. (This will likely + # use the malloc()/free() linked into the program. + # python_config.allocator_backend = "default" + + # Enable the use of a custom allocator backend with the "raw" memory domain. + # python_config.allocator_raw = True + + # Enable the use of a custom allocator backend with the "mem" memory domain. + # python_config.allocator_mem = True + + # Enable the use of a custom allocator backend with the "obj" memory domain. + # python_config.allocator_obj = True + + # Enable the use of a custom allocator backend with pymalloc's arena + # allocator. + # python_config.allocator_pymalloc_arena = True + + # Enable Python memory allocator debug hooks. + # python_config.allocator_debug = True + + # Automatically calls `multiprocessing.set_start_method()` with an + # appropriate value when OxidizedFinder imports the `multiprocessing` + # module. + # python_config.multiprocessing_start_method = 'auto' + + # Do not call `multiprocessing.set_start_method()` automatically. (This + # is the default behavior of Python applications.) + # python_config.multiprocessing_start_method = 'none' + + # Call `multiprocessing.set_start_method()` with explicit values. + # python_config.multiprocessing_start_method = 'fork' + # python_config.multiprocessing_start_method = 'forkserver' + # python_config.multiprocessing_start_method = 'spawn' + + # Control whether `oxidized_importer` is the first importer on + # `sys.meta_path`. + # python_config.oxidized_importer = False + + # Enable the standard path-based importer which attempts to load + # modules from the filesystem. + # python_config.filesystem_importer = True + + # Set `sys.frozen = False` + # python_config.sys_frozen = False + + # Set `sys.meipass` + # python_config.sys_meipass = True + + # Write files containing loaded modules to the directory specified + # by the given environment variable. + # python_config.write_modules_directory_env = "/tmp/oxidized/loaded_modules" + + # Evaluate a string as Python code when the interpreter starts. + python_config.run_command = "import gbstoolkit; gbstoolkit.run_app()" + + # Run a Python module as __main__ when the interpreter starts. + # python_config.run_module = "" + + # Run a Python file when the interpreter starts. + # python_config.run_filename = "/path/to/file" + + # Produce a PythonExecutable from a Python distribution, embedded + # resources, and other options. The returned object represents the + # standalone executable that will be built. + exe = dist.to_python_executable( + name="gbstoolkit", + + # If no argument passed, the default `PythonPackagingPolicy` for the + # distribution is used. + packaging_policy=policy, + + # If no argument passed, the default `PythonInterpreterConfig` is used. + config=python_config, + ) + + for resource in exe.pip_install(["kdl-py==1.0.5", "gbstoolkit==" + PROJECT_VERSION]): + resource.add_location = "in-memory" + exe.add_python_resource(resource) + + # Install tcl/tk support files to a specified directory so the `tkinter` Python + # module works. + exe.tcl_files_path = "lib" + + # Never attempt to copy Windows runtime DLLs next to the built executable. + # exe.windows_runtime_dlls_mode = "never" + + # Copy Windows runtime DLLs next to the built executable when they can be + # located. + # exe.windows_runtime_dlls_mode = "when-present" + + # Copy Windows runtime DLLs next to the build executable and error if this + # cannot be done. + # exe.windows_runtime_dlls_mode = "always" + + # Make the executable a console application on Windows. + # exe.windows_subsystem = "console" + + # Make the executable a non-console application on Windows. + # exe.windows_subsystem = "windows" + + # Invoke `pip download` to install a single package using wheel archives + # obtained via `pip download`. `pip_download()` returns objects representing + # collected files inside Python wheels. `add_python_resources()` adds these + # objects to the binary, with a load location as defined by the packaging + # policy's resource location attributes. + #exe.add_python_resources(exe.pip_download(["pyflakes==2.2.0"])) + + # Invoke `pip install` with our Python distribution to install a single package. + # `pip_install()` returns objects representing installed files. + # `add_python_resources()` adds these objects to the binary, with a load + # location as defined by the packaging policy's resource location + # attributes. + #exe.add_python_resources(exe.pip_install(["appdirs"])) + + # Invoke `pip install` using a requirements file and add the collected resources + # to our binary. + #exe.add_python_resources(exe.pip_install(["-r", "requirements.txt"])) + + # Read Python files from a local directory and add them to our embedded + # context, taking just the resources belonging to the `foo` and `bar` + # Python packages. + #exe.add_python_resources(exe.read_package_root( + # path="/src/mypackage", + # packages=["foo", "bar"], + #)) + + # Discover Python files from a virtualenv and add them to our embedded + # context. + #exe.add_python_resources(exe.read_virtualenv(path="/path/to/venv")) + + # Filter all resources collected so far through a filter of names + # in a file. + #exe.filter_from_files(files=["/path/to/filter-file"])) + + # Return our `PythonExecutable` instance so it can be built and + # referenced by other consumers of this target. + return exe + +def make_embedded_resources(exe): + return exe.to_embedded_resources() + +def make_install(exe): + # Create an object that represents our installed application file layout. + files = FileManifest() + + # Add the generated executable to our install layout in the root directory. + files.add_python_resource(".", exe) + + return files + +def make_msi(exe): + # See the full docs for more. But this will convert your Python executable + # into a `WiXMSIBuilder` Starlark type, which will be converted to a Windows + # .msi installer when it is built. + return exe.to_wix_msi_builder( + # Simple identifier of your app. + "myapp", + # The name of your application. + "My Application", + # The version of your application. + "1.0", + # The author/manufacturer of your application. + "Alice Jones" + ) + + +# Dynamically enable automatic code signing. +def register_code_signers(): + # You will need to run with `pyoxidizer build --var ENABLE_CODE_SIGNING 1` for + # this if block to be evaluated. + if not VARS.get("ENABLE_CODE_SIGNING"): + return + + # Use a code signing certificate in a .pfx/.p12 file, prompting the + # user for its path and password to open. + # pfx_path = prompt_input("path to code signing certificate file") + # pfx_password = prompt_password( + # "password for code signing certificate file", + # confirm = True + # ) + # signer = code_signer_from_pfx_file(pfx_path, pfx_password) + + # Use a code signing certificate in the Windows certificate store, specified + # by its SHA-1 thumbprint. (This allows you to use YubiKeys and other + # hardware tokens if they speak to the Windows certificate APIs.) + # sha1_thumbprint = prompt_input( + # "SHA-1 thumbprint of code signing certificate in Windows store" + # ) + # signer = code_signer_from_windows_store_sha1_thumbprint(sha1_thumbprint) + + # Choose a code signing certificate automatically from the Windows + # certificate store. + # signer = code_signer_from_windows_store_auto() + + # Activate your signer so it gets called automatically. + # signer.activate() + + +# Call our function to set up automatic code signers. +register_code_signers() + +# Tell PyOxidizer about the build targets defined above. +register_target("exe", make_exe) +register_target("resources", make_embedded_resources, depends=["exe"], default_build_script=True) +register_target("install", make_install, depends=["exe"], default=True) +register_target("msi_installer", make_msi, depends=["exe"]) + +# Resolve whatever targets the invoker of this configuration file is requesting +# be resolved. +resolve_targets() diff --git a/src/resources/gbstoolkit.icns b/resources/gbstoolkit.icns similarity index 100% rename from src/resources/gbstoolkit.icns rename to resources/gbstoolkit.icns diff --git a/src/resources/gbstoolkit.ico b/resources/gbstoolkit.ico similarity index 100% rename from src/resources/gbstoolkit.ico rename to resources/gbstoolkit.ico diff --git a/resources/gbstoolkit.png b/resources/gbstoolkit.png new file mode 100644 index 0000000..0d4cc0e Binary files /dev/null and b/resources/gbstoolkit.png differ diff --git a/semver.txt b/semver.txt new file mode 100644 index 0000000..afaf360 --- /dev/null +++ b/semver.txt @@ -0,0 +1 @@ +1.0.0 \ No newline at end of file diff --git a/setup.py b/setup.py index 233f700..16846cb 100644 --- a/setup.py +++ b/setup.py @@ -3,13 +3,17 @@ with open("README.md", "r", encoding="utf-8") as file: long_description = file.read() +with open("semver.txt", "r", encoding="utf-8") as semver: + version = semver.read() + setuptools.setup( - name="GBSToolkit", - version="1.0.0", + name="gbstoolkit", + version=version, author="LemmaEOF", # author_email= TODO: set up lemmaeof.gay email probs description="Various Python tools for messing around with GB Studio projects.", long_description=long_description, + long_description_content_type="text/markdown", license="Fuck Around and Find Out License, version 0.2", url="https://github.com/LemmaEOF/GBSToolkit", project_urls={ @@ -19,17 +23,16 @@ "console_scripts": ["gbstoolkit = gbstoolkit:run_cli"] }, classifiers=[ - "Development Status :: 3 - Alpha", + "Development Status :: 4 - Beta", "Intended Audience :: Developers", - "License :: Fuck Around and Find Out License (FAFOL)", - "License :: Other/Proprietary License (FAFOL)", + # "License :: Fuck Around and Find Out License (FAFOL)", + "License :: Other/Proprietary License", "Operating System :: OS Independent", "Programming Language :: Python :: 3 :: Only", "Topic :: Software Development :: Build Tools", "Typing :: Typed" ], - package_dir={"": "src"}, - packages=setuptools.find_packages(where="src"), + packages=setuptools.find_packages(), python_requires=">3.6", install_requires=[ "kdl-py" diff --git a/src/gbstoolkit/dsl/__init__.py b/src/gbstoolkit/dsl/__init__.py deleted file mode 100644 index e69de29..0000000