From 63c095c2971cc3e9bfd859df05bafbde15ce92c3 Mon Sep 17 00:00:00 2001 From: JeremyStarTM Date: Wed, 10 Apr 2024 21:34:12 +0200 Subject: [PATCH 01/14] Fix "invalid call" --- src/core.gd | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core.gd b/src/core.gd index 36df126..f072490 100644 --- a/src/core.gd +++ b/src/core.gd @@ -166,8 +166,8 @@ func reload_configuration(new_config: CoreConfiguration = CoreConfiguration.new( ## [b]Danger: [i]Don't call this.[/i][/b] func apply_configuration() -> void: if loggeri != null: loggeri.verb("Applying configuration") - if is_devmode(): if loggeri != null: loggeri.warn("The CORE Framework is in development mode. Here be dragons!") - if config.headless: loggeri.warn("CORE is in headless mode. Certain modules will not work as expected.") + if is_devmode() and loggeri != null: loggeri.warn("The CORE Framework is in development mode. Here be dragons!") + if config.headless and loggeri != null: loggeri.warn("CORE is in headless mode. Certain modules will not work as expected.") if !config.custom_modules: if loggeri != null: loggeri.verb("Removing all custom modules (custom modules support is disabled)") for module in custom_modules: unregister_custom_module(module) From d4b0fc84df7025cf20cf15fc24b46d451e8e8f24 Mon Sep 17 00:00:00 2001 From: JeremyStarTM Date: Fri, 12 Apr 2024 15:48:17 +0200 Subject: [PATCH 02/14] Update apply_configuration() function --- src/core.gd | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/core.gd b/src/core.gd index f072490..be6de24 100644 --- a/src/core.gd +++ b/src/core.gd @@ -167,15 +167,13 @@ func reload_configuration(new_config: CoreConfiguration = CoreConfiguration.new( func apply_configuration() -> void: if loggeri != null: loggeri.verb("Applying configuration") if is_devmode() and loggeri != null: loggeri.warn("The CORE Framework is in development mode. Here be dragons!") - if config.headless and loggeri != null: loggeri.warn("CORE is in headless mode. Certain modules will not work as expected.") if !config.custom_modules: - if loggeri != null: loggeri.verb("Removing all custom modules (custom modules support is disabled)") + if loggeri != null: loggeri.diag("Removing all custom modules (custom modules support is disabled)") for module in custom_modules: unregister_custom_module(module) for module in modules: get(module)._pull_config() if config.custom_modules: for module in custom_modules: - if loggeri != null: loggeri.diag("Updating configuration for custom module \"" + module.name + "\"") - module._pull_config() + custom_modules[module]._pull_config() # +++ custom module support +++ ## Registers a new custom module. From b835e11fa5e061891d9641da3662bbb17f705f02 Mon Sep 17 00:00:00 2001 From: JeremyStarTM Date: Fri, 12 Apr 2024 15:49:00 +0200 Subject: [PATCH 03/14] Fix documentation error --- docs/docs/reference/logger.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/docs/reference/logger.md b/docs/docs/reference/logger.md index 7b4849a..03eefa5 100644 --- a/docs/docs/reference/logger.md +++ b/docs/docs/reference/logger.md @@ -9,10 +9,9 @@ Allows for colored output, better newlines, multiple logger levels and a large v ## Signals ### log_event -- Signature: *bool* allowed, *CoreTypes.LoggerLevel* level, *Dictionary* origin, *String* message, *String* format \ +- Signature: *bool* allowed, *CoreTypes.LoggerLevel* level, *String* origin, *String* message, *String* format \ Emitted on any log call, permitted or not. \ -**origin** contains the keys `source`, `source_clean`, `function` and `line`. \ **format** is set to `""` when **allowed** is set `false`. ## Variables From 5058c2421c1149118051c587fe053aac452da73f Mon Sep 17 00:00:00 2001 From: JeremyStarTM Date: Fri, 12 Apr 2024 16:59:29 +0200 Subject: [PATCH 04/14] Enforce config duplication I did this to avoid crashes when reusing the same config object. --- src/core.gd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core.gd b/src/core.gd index be6de24..e9016fa 100644 --- a/src/core.gd +++ b/src/core.gd @@ -156,7 +156,7 @@ func reload_configuration(new_config: CoreConfiguration = CoreConfiguration.new( var initialized = config != null if initialized: loggeri.verb("Reloading CORE's configuration") if config != null: config.queue_free() - config = new_config + config = new_config.duplicate() if is_devmode(): # Override configuration in development mode config.logger_level = CoreTypes.LoggerLevel.DIAG if initialized: loggeri.verb("Overrode configuration (development mode)") From 780c553f798f6480e5bb6f5e570bdac01cf5354d Mon Sep 17 00:00:00 2001 From: JeremyStarTM Date: Fri, 12 Apr 2024 17:02:20 +0200 Subject: [PATCH 05/14] Clean logger instances in _cleanup() --- src/logger.gd | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/logger.gd b/src/logger.gd index f8035e0..895318a 100644 --- a/src/logger.gd +++ b/src/logger.gd @@ -41,6 +41,8 @@ var config_newlines_override: bool var config_newlines_sizelimit: int # +++ module +++ +func _cleanup() -> void: _schedule() + func _schedule() -> void: for instance in instances: if !is_instance_valid(instance): continue From 82b436285973127fa8cf33f9b88271dd56d937ed Mon Sep 17 00:00:00 2001 From: JeremyStarTM Date: Fri, 12 Apr 2024 17:03:37 +0200 Subject: [PATCH 06/14] Update cleanup call order --- src/core.gd | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/core.gd b/src/core.gd index e9016fa..dbab725 100644 --- a/src/core.gd +++ b/src/core.gd @@ -227,16 +227,16 @@ func get_custom_module(module_name: String) -> CoreBaseModule: ## Unloads all custom modules, built-in modules, frees any of CORE's classes and lastly itself. func cleanup() -> void: loggeri.info("Cleaning up") - config.queue_free() + for module in custom_modules_node.get_children(): unregister_custom_module(module.name) + remove_child(custom_modules_node) + custom_modules_node.queue_free() var modules_reverse: Array[String] = modules.duplicate() modules_reverse.reverse() for module in modules_reverse: await get(module)._cleanup() get(module).loggeri.queue_free() get(module).queue_free() - for module in custom_modules_node.get_children(): unregister_custom_module(module.name) - remove_child(custom_modules_node) - custom_modules_node.queue_free() + config.queue_free() queue_free() ## Returns if the framework is in development mode. From 9ef4c9243a8c6ea5d9aef2541aaf84c2a7a2f29f Mon Sep 17 00:00:00 2001 From: JeremyStarTM Date: Fri, 12 Apr 2024 17:06:09 +0200 Subject: [PATCH 07/14] Wait a frame for instance cleanup --- src/logger.gd | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/logger.gd b/src/logger.gd index 895318a..0f2fb5f 100644 --- a/src/logger.gd +++ b/src/logger.gd @@ -41,7 +41,9 @@ var config_newlines_override: bool var config_newlines_sizelimit: int # +++ module +++ -func _cleanup() -> void: _schedule() +func _cleanup() -> void: + _schedule() + await get_tree().process_frame() func _schedule() -> void: for instance in instances: From a722ea5235c349b3d83fff32905f5b57e829c9a9 Mon Sep 17 00:00:00 2001 From: JeremyStarTM Date: Fri, 12 Apr 2024 17:08:14 +0200 Subject: [PATCH 08/14] Remove () (is a signal not a method) --- src/logger.gd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/logger.gd b/src/logger.gd index 0f2fb5f..614fbcc 100644 --- a/src/logger.gd +++ b/src/logger.gd @@ -43,7 +43,7 @@ var config_newlines_sizelimit: int # +++ module +++ func _cleanup() -> void: _schedule() - await get_tree().process_frame() + await get_tree().process_frame func _schedule() -> void: for instance in instances: From a94b77d573ca0cca05c9bab8ff85286344e67615 Mon Sep 17 00:00:00 2001 From: JeremyStarTM Date: Sun, 14 Apr 2024 14:20:34 +0200 Subject: [PATCH 09/14] Update Test.gd --- Test.gd | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Test.gd b/Test.gd index dfbe9ba..93816c6 100644 --- a/Test.gd +++ b/Test.gd @@ -30,6 +30,7 @@ func _init() -> void: # Update config keys config.headless = false config.development = true + config.logger_level = CoreTypes.LoggerLevel.DIAG # Initialize CORE with custom config core = Core.new(config) @@ -40,7 +41,7 @@ func _ready() -> void: await core.complete_init() # Print information about CORE - logger.info(await core.get_formatted_string("""Version information: + logger.diag(await core.get_formatted_string("""Version information: Release (semantic) = %version_semantic% Release = %version% Typerelease = %version_typerelease% @@ -50,4 +51,4 @@ Development mode = %devmode% Headless mode = %headless% Custom module support = %custommodules%""")) # Print hi - logger.info("Hi there!") + logger.verb("Hi there!") From 12aebc5dd94513507c38263a246845ca40f1cbe3 Mon Sep 17 00:00:00 2001 From: JeremyStarTM Date: Sun, 14 Apr 2024 14:21:46 +0200 Subject: [PATCH 10/14] Rename documentation pages --- docs/docs/reference/{corebasemodule.md => basemodule.md} | 0 docs/docs/reference/{coreconfiguration.md => config.md} | 0 docs/docs/reference/core.md | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) rename docs/docs/reference/{corebasemodule.md => basemodule.md} (100%) rename docs/docs/reference/{coreconfiguration.md => config.md} (100%) diff --git a/docs/docs/reference/corebasemodule.md b/docs/docs/reference/basemodule.md similarity index 100% rename from docs/docs/reference/corebasemodule.md rename to docs/docs/reference/basemodule.md diff --git a/docs/docs/reference/coreconfiguration.md b/docs/docs/reference/config.md similarity index 100% rename from docs/docs/reference/coreconfiguration.md rename to docs/docs/reference/config.md diff --git a/docs/docs/reference/core.md b/docs/docs/reference/core.md index 77ffb4e..26ed5db 100644 --- a/docs/docs/reference/core.md +++ b/docs/docs/reference/core.md @@ -18,7 +18,7 @@ CORE's version type number. Resets on every new version and version type. ## Modules Use these to access CORE's modules. -- [`config`](/reference/coreconfiguration) (**NEVER access this yourself. To change the configuration, use `reload_configuration()` instead**) +- [`config`](/reference/config) (**NEVER access this yourself. To change the configuration, use `reload_configuration()` instead**) - `scheduler` (runs clean up tasks periodically) - [`logger`](/reference/logger) - [`misc`](/reference/misc) From b05d1428a5559b4cf4a6f6523e93d096382a350e Mon Sep 17 00:00:00 2001 From: JeremyStarTM Date: Sun, 14 Apr 2024 14:23:05 +0200 Subject: [PATCH 11/14] Add automatic cleanup (fixes #25) --- docs/docs/reference/config.md | 2 ++ src/classes/config.gd | 3 +++ src/core.gd | 7 +++++++ 3 files changed, 12 insertions(+) diff --git a/docs/docs/reference/config.md b/docs/docs/reference/config.md index 349f08e..b5a6f26 100644 --- a/docs/docs/reference/config.md +++ b/docs/docs/reference/config.md @@ -17,6 +17,8 @@ Puts the framework into development mode. \ Unlocks experimental features. ### *bool* custom_modules = *false* Allows or disallows custom modules. +### *bool* automatic_shutdown = *true* +If `quit_safely` (and by extension `Core.cleanup`) should be called when pressing the X. ## Logger ### *CoreTypes.LoggerLevel* logger_level = *CoreTypes.LoggerLevel.INFO* diff --git a/src/classes/config.gd b/src/classes/config.gd index 132b8ae..fa428d6 100644 --- a/src/classes/config.gd +++ b/src/classes/config.gd @@ -17,6 +17,8 @@ class_name CoreConfiguration @export var development: bool ## Allows or disallows custom modules. @export var custom_modules: bool +## If [method Core.quit_safely] (and by extension [method Core.cleanup]) should be called when pressing the X. +@export var automatic_shutdown: bool @export_category("Logger") ## The minimum log level you want to be displayed. @export var logger_level: CoreTypes.LoggerLevel @@ -46,6 +48,7 @@ func _init() -> void: headless = false development = false custom_modules = false + automatic_shutdown = true # Logger logger_level = CoreTypes.LoggerLevel.INFO diff --git a/src/core.gd b/src/core.gd index dbab725..50cfa20 100644 --- a/src/core.gd +++ b/src/core.gd @@ -87,6 +87,7 @@ func _ready() -> void: add_child(custom_modules_node) loggeri = logger.get_instance(basepath.replace("res://", "") + "src/core.gd", self) add_child(scheduler) + get_tree().auto_accept_quit = false ## Initializes all built-in modules during the preinitialization phase.[br] ## [b]Danger: [i]Don't call this.[/i][/b] @@ -338,3 +339,9 @@ func quit_safely(exitcode: int = 0) -> void: await get_tree().create_timer(0.25).timeout await cleanup() get_tree().quit(exitcode) + +func _notification(what) -> void: + match(what): + NOTIFICATION_WM_CLOSE_REQUEST: + if config.automatic_shutdown: + await quit_safely(0) From 56c96ee1026f84eb44461b0b66583f6ca6f5fee8 Mon Sep 17 00:00:00 2001 From: JeremyStarTM Date: Sun, 14 Apr 2024 14:24:25 +0200 Subject: [PATCH 12/14] Revert "Update Test.gd" (didn't mean to do that) This reverts commit a94b77d573ca0cca05c9bab8ff85286344e67615. --- Test.gd | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Test.gd b/Test.gd index 93816c6..dfbe9ba 100644 --- a/Test.gd +++ b/Test.gd @@ -30,7 +30,6 @@ func _init() -> void: # Update config keys config.headless = false config.development = true - config.logger_level = CoreTypes.LoggerLevel.DIAG # Initialize CORE with custom config core = Core.new(config) @@ -41,7 +40,7 @@ func _ready() -> void: await core.complete_init() # Print information about CORE - logger.diag(await core.get_formatted_string("""Version information: + logger.info(await core.get_formatted_string("""Version information: Release (semantic) = %version_semantic% Release = %version% Typerelease = %version_typerelease% @@ -51,4 +50,4 @@ Development mode = %devmode% Headless mode = %headless% Custom module support = %custommodules%""")) # Print hi - logger.verb("Hi there!") + logger.info("Hi there!") From 0479635f95e7c595a5b48b02a60baa3c422f85e8 Mon Sep 17 00:00:00 2001 From: JeremyStarTM Date: Sun, 14 Apr 2024 14:42:46 +0200 Subject: [PATCH 13/14] Fix logger output when using verbose stdout mode (fix #23) --- docs/docs/reference/config.md | 7 +++++++ docs/docs/reference/logger.md | 3 +++ src/classes/config.gd | 8 ++++++++ src/core.gd | 2 +- src/logger.gd | 11 ++++++++++- 5 files changed, 29 insertions(+), 2 deletions(-) diff --git a/docs/docs/reference/config.md b/docs/docs/reference/config.md index b5a6f26..f18d615 100644 --- a/docs/docs/reference/config.md +++ b/docs/docs/reference/config.md @@ -25,6 +25,13 @@ If `quit_safely` (and by extension `Core.cleanup`) should be called when pressin The minimum log level you want to be displayed. ### *bool* logger_colored = *true* Determines if the logger's output should be colored. +### *bool* logger_detect_verbose_mode = *false* +:::warning +Updating this during runtime does nothing. +::: +Determines if the logger should check if running in verbose mode (see [`OS.is_stdout_verbose`](https://docs.godotengine.org/en/4.2/classes/class_os.html#class-os-method-is-stdout-verbose)). \ +Comes with a huge performance penalty on startup, delaying startup by about one to two seconds. \ +Update `verbose_mode` accordingly yourself if you've disabled this, or diagnostic log messages might appear messed up. \ ### *String* logger_format = *"%color%[%time%] [%level% %source%:%line%] %message%"* The template for all log messages Available placeholders are: `%time%`, `%time_ms%`, `%level%`, `%color%`, `%message%`, `%source%`, `%source_raw%`, `%function%` and `%line%` diff --git a/docs/docs/reference/logger.md b/docs/docs/reference/logger.md index 03eefa5..d296683 100644 --- a/docs/docs/reference/logger.md +++ b/docs/docs/reference/logger.md @@ -21,6 +21,9 @@ Do not call this. ::: Keeps track of all logger instances. Unused instances will be cleaned periodically. +### *bool* verbose_mode = *false* +Used to determine if running in verbose/command line mode. +Makes diagnostic log messages display correctly (workaround for Godot's ANSI true color limitation). ## Functions ### *void* _log(*CoreTypes.LoggerLevel* level, *String* origin, *String* message) diff --git a/src/classes/config.gd b/src/classes/config.gd index fa428d6..259550c 100644 --- a/src/classes/config.gd +++ b/src/classes/config.gd @@ -19,11 +19,17 @@ class_name CoreConfiguration @export var custom_modules: bool ## If [method Core.quit_safely] (and by extension [method Core.cleanup]) should be called when pressing the X. @export var automatic_shutdown: bool + @export_category("Logger") ## The minimum log level you want to be displayed. @export var logger_level: CoreTypes.LoggerLevel ## Determines if the logger's output should be colored. @export var logger_colored: bool +## Determines if the logger should check if running in verbose mode (see [method OS.is_stdout_verbose]).[br] +## Comes with a huge performance penalty on startup, delaying startup by about one to two seconds.[br] +## Update [code]verbose_mode[/code] accordingly yourself if you've disabled this, or diagnostic log messages might appear messed up.[br] +## [b]Warning: [i]Updating this during runtime does nothing.[/i][/b] +@export var logger_detect_verbose_mode: bool ## The template for all log messages.[br] ## Available placeholders are: [code]%time%[/code], [code]%time_ms%[/code], [code]%level%[/code], [code]%color%[/code], [code]%message%[/code], [code]%source%[/code], [code]%source_raw%[/code], [code]%function%[/code] and [code]%line%[/code] @export var logger_format: String @@ -31,6 +37,7 @@ class_name CoreConfiguration @export var logger_newlines_override: bool ## The maximum amount of characters excluding the message before newlines are no longer idented. Set to [code]-1[/code] to disable this behaviour. @export var logger_newlines_sizelimit: int + @export_category("Log UI") ## Enables or disables Log UI. @export var logui_enabled: bool @@ -53,6 +60,7 @@ func _init() -> void: # Logger logger_level = CoreTypes.LoggerLevel.INFO logger_colored = true + logger_detect_verbose_mode = false logger_format = "%color%[%time%] [%level% %origin%] %message%" logger_newlines_override = true logger_newlines_sizelimit = 40 diff --git a/src/core.gd b/src/core.gd index 50cfa20..67668c9 100644 --- a/src/core.gd +++ b/src/core.gd @@ -143,7 +143,7 @@ func complete_init(no_success_message: bool = false) -> void: # Print and sleep if modsinit_builtin.size() != 0 or modsinit_custom.size() != 0: print("Waiting for modules to finish initialization:") - if modsinit_builtin.size() != 0: print(" Builtin: " + str(modsinit_builtin)) + if modsinit_builtin.size() != 0: print(" Built-in: " + str(modsinit_builtin)) if modsinit_custom.size() != 0: print(" Custom: " + str(modsinit_custom)) await get_tree().create_timer(1).timeout diff --git a/src/logger.gd b/src/logger.gd index 614fbcc..11f9244 100644 --- a/src/logger.gd +++ b/src/logger.gd @@ -28,6 +28,10 @@ signal log_event ## [b]Danger: [i]Don't modify this.[/i][/b] var instances: Array[CoreLoggerInstance] = [] +## Used to determine if running in verbose/command line mode.[br] +## Makes diagnostic log messages display correctly (workaround for Godot's ANSI true color limitation). +var verbose_mode: bool = false + ## The minimum log level you want to be displayed. var config_level: CoreTypes.LoggerLevel ## Determines if the logger's output should be colored. @@ -41,6 +45,10 @@ var config_newlines_override: bool var config_newlines_sizelimit: int # +++ module +++ +func _initialize() -> void: + if core.config.logger_detect_verbose_mode and OS.is_stdout_verbose(): + verbose_mode = true + func _cleanup() -> void: _schedule() await get_tree().process_frame @@ -77,7 +85,8 @@ func _log(level: CoreTypes.LoggerLevel, origin: String, message: String) -> void CoreTypes.LoggerLevel.DIAG: format = format.replace("%level%", "DIAG") format_newline = format_newline.replace("%level%", "DIAG") - format = format.replace("%color%", "[color=dark_gray]") + if verbose_mode: format = format.replace("%color%", "[color=gray]") + else: format = format.replace("%color%", "[color=dark_gray]") CoreTypes.LoggerLevel.VERB: format = format.replace("%level%", "VERB") format_newline = format_newline.replace("%level%", "VERB") From 2e9cce8f27651b3a334a58c7ca8122257dcb335c Mon Sep 17 00:00:00 2001 From: JeremyStarTM Date: Sun, 14 Apr 2024 14:52:19 +0200 Subject: [PATCH 14/14] =?UTF-8?q?Bump=20version=20information=20(first=20r?= =?UTF-8?q?elease=20yay=20=F0=9F=A5=B3)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core.gd | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core.gd b/src/core.gd index 67668c9..efcda1b 100644 --- a/src/core.gd +++ b/src/core.gd @@ -26,9 +26,9 @@ class_name Core ## The version number const version_version: int = 1 ## The version type. See [enum CoreTypes.VersionType] for more information. -const version_type: CoreTypes.VersionType = CoreTypes.VersionType.RELEASECANDIDATE +const version_type: CoreTypes.VersionType = CoreTypes.VersionType.RELEASE ## The version type number. Resets on every new version and version type. -const version_typerelease: int = 1 +const version_typerelease: int = 0 # Modules ## Used internally for loading, managing and unloading modules.