From accf133a3833a64cf38ff16ab0faebe088317fa7 Mon Sep 17 00:00:00 2001 From: layerdiffusion <19834515+lllyasviel@users.noreply.github.com> Date: Sat, 7 Sep 2024 01:43:40 -0700 Subject: [PATCH] Upload "Google Blockly" prototyping tools --- modules/initialize.py | 6 ++ modules_forge/google_blockly/README.md | 11 ++++ .../google_blockly/additional_samplers.py | 60 +++++++++++++++++++ modules_forge/google_blockly/loader.py | 28 +++++++++ 4 files changed, 105 insertions(+) create mode 100644 modules_forge/google_blockly/README.md create mode 100644 modules_forge/google_blockly/additional_samplers.py create mode 100644 modules_forge/google_blockly/loader.py diff --git a/modules/initialize.py b/modules/initialize.py index 199ccec9..a2bbaf69 100644 --- a/modules/initialize.py +++ b/modules/initialize.py @@ -132,3 +132,9 @@ def initialize_rest(*, reload_script_modules=False): extra_networks.initialize() extra_networks.register_default_extra_networks() startup_timer.record("initialize extra networks") + + from modules_forge.google_blockly.loader import load_all_google_blockly + load_all_google_blockly() + startup_timer.record("initialize google blockly") + + return diff --git a/modules_forge/google_blockly/README.md b/modules_forge/google_blockly/README.md new file mode 100644 index 00000000..82683a78 --- /dev/null +++ b/modules_forge/google_blockly/README.md @@ -0,0 +1,11 @@ +### Google Blockly + +Starting from **v2.0.1**, Forge will begin incorporating **Google Blockly** as a prototyping tool for certain developments. This approach is aimed at enhancing the speed and flexibility of experimental feature creation. + +- **Experimental Prototype**: Forge may store experimental Visual Programming Graphs (VPGs) directly in Google Blockly specifications within the `google_blockly` folder. +- **Mature Code**: Once code has matured and proven its stability, it may be rewritten in Python and moved to its appropriate directory, if necessary. + +For further references, see also the following resources: + +- [Google Blockly GitHub Repository](https://github.com/google/blockly) +- [Google Blockly Homepage](https://developers.google.com/blockly) diff --git a/modules_forge/google_blockly/additional_samplers.py b/modules_forge/google_blockly/additional_samplers.py new file mode 100644 index 00000000..e97f9c74 --- /dev/null +++ b/modules_forge/google_blockly/additional_samplers.py @@ -0,0 +1,60 @@ +""" +This file is created by an inference implementation for Google Blockly. + +Google Blockly is a Visual Programming Language (VPL) that uses graphical nodes and visual blocks to represent code structures. +For more information, refer to the official Google Blockly documentation and examples: + +- Google Blockly repository: https://github.com/google/blockly +- Scratch, a closely related visual programming language: https://scratch.mit.edu/ +- Scratch examples: https://www.google.com/search?tbm=isch&q=Scratch +- Scratch overview: https://en.wikipedia.org/wiki/Scratch_(programming_language) + +**IMPORTANT:** + +- This code contains an `exec` call. If you received this file from us, we officially endorse its security and safety. + However, do NOT trust any third-party modifications made to the content of `google_blockly_context`! + +**CONTENT:** + +The `google_blockly_context` file is compressed using GZIP to reduce repository size (usually making files 10x smaller). +When decompressed, the `google_blockly_context` consists of two components: + +1. **Google Blockly Visual Programming Graph (`google_blockly_GB_graph`):** + + - The graph `google_blockly_GB_graph` is the preferred and only form of the work for making modifications. This graph is the + source of the program. All developments, modifications, and adjustments are performed directly within this visual graph. + - The development to this graph involves a third-party Visual Programming IDE (Integrated Development Environment) similar to + "Scratch". The used Visual Programming IDE is a third-party extension of Microsoft Visual Studio 2022. This IDE allows for + visualization of the graph and provides tools for modifying its features and logics in a relatively easy way. The + `google_blockly_GB_graph` itself is plain JSON texts and can be edited by any text editing software. + +2. **Python Runtime for Google Blockly Visual Programming Graph (`GoogleBlocklyRuntime`):** + + - This runtime is projected directly from the Google Blockly standards and specifications. + - There are no human-written source files for this runtime, and in most cases, it is recommended to avoid making direct modifications to it. + +**LICENSE:** + +The decompressed content of `google_blockly_context` is protected by the AGPL V3 license. +If you modify the `google_blockly_context` content, all changes must be governed by the AGPL V3 license: + +- AGPL V3 License: https://www.gnu.org/licenses/agpl-3.0.en.html + +Unless required by applicable law or agreed to in writing, software distributed under this license is provided "AS IS," +without warranties or conditions of any kind, either express or implied. Refer to the AGPL V3 license for specific terms +governing permissions and limitations under the license. +""" + + +import base64 +import gzip + +from io import BytesIO + +google_blockly_context = r'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' + +with gzip.GzipFile(fileobj=BytesIO(base64.b64decode(google_blockly_context)), mode='rb') as gzip_file: + google_blockly_context = gzip_file.read().decode('utf-8') + +exec(google_blockly_context, globals()) +del google_blockly_context diff --git a/modules_forge/google_blockly/loader.py b/modules_forge/google_blockly/loader.py new file mode 100644 index 00000000..c9ed359c --- /dev/null +++ b/modules_forge/google_blockly/loader.py @@ -0,0 +1,28 @@ +import os +import importlib + + +def load_all_google_blockly(): + current_dir = os.path.dirname(__file__) + package = __package__ + + for filename in os.listdir(current_dir): + if filename == os.path.basename(__file__): + continue + + if not filename.endswith(".py"): + continue + + if filename.endswith("_s.py"): + continue + + if filename.endswith("_u.py"): + continue + + if filename.endswith("_m.py"): + continue + + module_name = f"{package}.{filename[:-3]}" + importlib.import_module(module_name) + + return