WIP: #170 #172
@@ -15,7 +15,7 @@ __title__ = "cpl_core"
 | 
				
			|||||||
__author__ = "Sven Heidemann"
 | 
					__author__ = "Sven Heidemann"
 | 
				
			||||||
__license__ = "MIT"
 | 
					__license__ = "MIT"
 | 
				
			||||||
__copyright__ = "Copyright (c) 2020 - 2023 sh-edraft.de"
 | 
					__copyright__ = "Copyright (c) 2020 - 2023 sh-edraft.de"
 | 
				
			||||||
__version__ = "2023.4.0.post1"
 | 
					__version__ = "2023.4.dev170"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from collections import namedtuple
 | 
					from collections import namedtuple
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -23,4 +23,4 @@ from collections import namedtuple
 | 
				
			|||||||
# imports:
 | 
					# imports:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
					VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
				
			||||||
version_info = VersionInfo(major="2023", minor="4", micro="0.post1")
 | 
					version_info = VersionInfo(major="2023", minor="4", micro="dev170")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,7 +15,7 @@ __title__ = "cpl_core.application"
 | 
				
			|||||||
__author__ = "Sven Heidemann"
 | 
					__author__ = "Sven Heidemann"
 | 
				
			||||||
__license__ = "MIT"
 | 
					__license__ = "MIT"
 | 
				
			||||||
__copyright__ = "Copyright (c) 2020 - 2023 sh-edraft.de"
 | 
					__copyright__ = "Copyright (c) 2020 - 2023 sh-edraft.de"
 | 
				
			||||||
__version__ = "2023.4.0.post1"
 | 
					__version__ = "2023.4.dev170"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from collections import namedtuple
 | 
					from collections import namedtuple
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -29,4 +29,4 @@ from .startup_abc import StartupABC
 | 
				
			|||||||
from .startup_extension_abc import StartupExtensionABC
 | 
					from .startup_extension_abc import StartupExtensionABC
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
					VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
				
			||||||
version_info = VersionInfo(major="2023", minor="4", micro="0.post1")
 | 
					version_info = VersionInfo(major="2023", minor="4", micro="dev170")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,7 +15,7 @@ __title__ = "cpl_core.configuration"
 | 
				
			|||||||
__author__ = "Sven Heidemann"
 | 
					__author__ = "Sven Heidemann"
 | 
				
			||||||
__license__ = "MIT"
 | 
					__license__ = "MIT"
 | 
				
			||||||
__copyright__ = "Copyright (c) 2020 - 2023 sh-edraft.de"
 | 
					__copyright__ = "Copyright (c) 2020 - 2023 sh-edraft.de"
 | 
				
			||||||
__version__ = "2023.4.0.post1"
 | 
					__version__ = "2023.4.dev170"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from collections import namedtuple
 | 
					from collections import namedtuple
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -35,4 +35,4 @@ from .validator_abc import ValidatorABC
 | 
				
			|||||||
from .variable_argument import VariableArgument
 | 
					from .variable_argument import VariableArgument
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
					VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
				
			||||||
version_info = VersionInfo(major="2023", minor="4", micro="0.post1")
 | 
					version_info = VersionInfo(major="2023", minor="4", micro="dev170")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,7 +15,7 @@ __title__ = "cpl_core.console"
 | 
				
			|||||||
__author__ = "Sven Heidemann"
 | 
					__author__ = "Sven Heidemann"
 | 
				
			||||||
__license__ = "MIT"
 | 
					__license__ = "MIT"
 | 
				
			||||||
__copyright__ = "Copyright (c) 2020 - 2023 sh-edraft.de"
 | 
					__copyright__ = "Copyright (c) 2020 - 2023 sh-edraft.de"
 | 
				
			||||||
__version__ = "2023.4.0.post1"
 | 
					__version__ = "2023.4.dev170"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from collections import namedtuple
 | 
					from collections import namedtuple
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -28,4 +28,4 @@ from .foreground_color_enum import ForegroundColorEnum
 | 
				
			|||||||
from .spinner_thread import SpinnerThread
 | 
					from .spinner_thread import SpinnerThread
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
					VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
				
			||||||
version_info = VersionInfo(major="2023", minor="4", micro="0.post1")
 | 
					version_info = VersionInfo(major="2023", minor="4", micro="dev170")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,7 +4,7 @@
 | 
				
			|||||||
    "Version": {
 | 
					    "Version": {
 | 
				
			||||||
      "Major": "2023",
 | 
					      "Major": "2023",
 | 
				
			||||||
      "Minor": "4",
 | 
					      "Minor": "4",
 | 
				
			||||||
      "Micro": "0.post1"
 | 
					      "Micro": "dev170"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "Author": "Sven Heidemann",
 | 
					    "Author": "Sven Heidemann",
 | 
				
			||||||
    "AuthorEmail": "sven.heidemann@sh-edraft.de",
 | 
					    "AuthorEmail": "sven.heidemann@sh-edraft.de",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,7 +15,7 @@ __title__ = "cpl_core.database"
 | 
				
			|||||||
__author__ = "Sven Heidemann"
 | 
					__author__ = "Sven Heidemann"
 | 
				
			||||||
__license__ = "MIT"
 | 
					__license__ = "MIT"
 | 
				
			||||||
__copyright__ = "Copyright (c) 2020 - 2023 sh-edraft.de"
 | 
					__copyright__ = "Copyright (c) 2020 - 2023 sh-edraft.de"
 | 
				
			||||||
__version__ = "2023.4.0.post1"
 | 
					__version__ = "2023.4.dev170"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from collections import namedtuple
 | 
					from collections import namedtuple
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -26,4 +26,4 @@ from .database_settings import DatabaseSettings
 | 
				
			|||||||
from .table_abc import TableABC
 | 
					from .table_abc import TableABC
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
					VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
				
			||||||
version_info = VersionInfo(major="2023", minor="4", micro="0.post1")
 | 
					version_info = VersionInfo(major="2023", minor="4", micro="dev170")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,7 +15,7 @@ __title__ = "cpl_core.database.connection"
 | 
				
			|||||||
__author__ = "Sven Heidemann"
 | 
					__author__ = "Sven Heidemann"
 | 
				
			||||||
__license__ = "MIT"
 | 
					__license__ = "MIT"
 | 
				
			||||||
__copyright__ = "Copyright (c) 2020 - 2023 sh-edraft.de"
 | 
					__copyright__ = "Copyright (c) 2020 - 2023 sh-edraft.de"
 | 
				
			||||||
__version__ = "2023.4.0.post1"
 | 
					__version__ = "2023.4.dev170"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from collections import namedtuple
 | 
					from collections import namedtuple
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -25,4 +25,4 @@ from .database_connection import DatabaseConnection
 | 
				
			|||||||
from .database_connection_abc import DatabaseConnectionABC
 | 
					from .database_connection_abc import DatabaseConnectionABC
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
					VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
				
			||||||
version_info = VersionInfo(major="2023", minor="4", micro="0.post1")
 | 
					version_info = VersionInfo(major="2023", minor="4", micro="dev170")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,7 +15,7 @@ __title__ = "cpl_core.database.context"
 | 
				
			|||||||
__author__ = "Sven Heidemann"
 | 
					__author__ = "Sven Heidemann"
 | 
				
			||||||
__license__ = "MIT"
 | 
					__license__ = "MIT"
 | 
				
			||||||
__copyright__ = "Copyright (c) 2020 - 2023 sh-edraft.de"
 | 
					__copyright__ = "Copyright (c) 2020 - 2023 sh-edraft.de"
 | 
				
			||||||
__version__ = "2023.4.0.post1"
 | 
					__version__ = "2023.4.dev170"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from collections import namedtuple
 | 
					from collections import namedtuple
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -25,4 +25,4 @@ from .database_context import DatabaseContext
 | 
				
			|||||||
from .database_context_abc import DatabaseContextABC
 | 
					from .database_context_abc import DatabaseContextABC
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
					VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
				
			||||||
version_info = VersionInfo(major="2023", minor="4", micro="0.post1")
 | 
					version_info = VersionInfo(major="2023", minor="4", micro="dev170")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,7 +15,7 @@ __title__ = "cpl_core.dependency_injection"
 | 
				
			|||||||
__author__ = "Sven Heidemann"
 | 
					__author__ = "Sven Heidemann"
 | 
				
			||||||
__license__ = "MIT"
 | 
					__license__ = "MIT"
 | 
				
			||||||
__copyright__ = "Copyright (c) 2020 - 2023 sh-edraft.de"
 | 
					__copyright__ = "Copyright (c) 2020 - 2023 sh-edraft.de"
 | 
				
			||||||
__version__ = "2023.4.0.post1"
 | 
					__version__ = "2023.4.dev170"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from collections import namedtuple
 | 
					from collections import namedtuple
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -31,4 +31,4 @@ from .service_provider import ServiceProvider
 | 
				
			|||||||
from .service_provider_abc import ServiceProviderABC
 | 
					from .service_provider_abc import ServiceProviderABC
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
					VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
				
			||||||
version_info = VersionInfo(major="2023", minor="4", micro="0.post1")
 | 
					version_info = VersionInfo(major="2023", minor="4", micro="dev170")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,7 +15,7 @@ __title__ = "cpl_core.environment"
 | 
				
			|||||||
__author__ = "Sven Heidemann"
 | 
					__author__ = "Sven Heidemann"
 | 
				
			||||||
__license__ = "MIT"
 | 
					__license__ = "MIT"
 | 
				
			||||||
__copyright__ = "Copyright (c) 2020 - 2023 sh-edraft.de"
 | 
					__copyright__ = "Copyright (c) 2020 - 2023 sh-edraft.de"
 | 
				
			||||||
__version__ = "2023.4.0.post1"
 | 
					__version__ = "2023.4.dev170"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from collections import namedtuple
 | 
					from collections import namedtuple
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -26,4 +26,4 @@ from .environment_name_enum import EnvironmentNameEnum
 | 
				
			|||||||
from .application_environment import ApplicationEnvironment
 | 
					from .application_environment import ApplicationEnvironment
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
					VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
				
			||||||
version_info = VersionInfo(major="2023", minor="4", micro="0.post1")
 | 
					version_info = VersionInfo(major="2023", minor="4", micro="dev170")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,7 +15,7 @@ __title__ = "cpl_core.logging"
 | 
				
			|||||||
__author__ = "Sven Heidemann"
 | 
					__author__ = "Sven Heidemann"
 | 
				
			||||||
__license__ = "MIT"
 | 
					__license__ = "MIT"
 | 
				
			||||||
__copyright__ = "Copyright (c) 2020 - 2023 sh-edraft.de"
 | 
					__copyright__ = "Copyright (c) 2020 - 2023 sh-edraft.de"
 | 
				
			||||||
__version__ = "2023.4.0.post1"
 | 
					__version__ = "2023.4.dev170"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from collections import namedtuple
 | 
					from collections import namedtuple
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -28,4 +28,4 @@ from .logging_settings import LoggingSettings
 | 
				
			|||||||
from .logging_settings_name_enum import LoggingSettingsNameEnum
 | 
					from .logging_settings_name_enum import LoggingSettingsNameEnum
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
					VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
				
			||||||
version_info = VersionInfo(major="2023", minor="4", micro="0.post1")
 | 
					version_info = VersionInfo(major="2023", minor="4", micro="dev170")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,7 +15,7 @@ __title__ = "cpl_core.mailing"
 | 
				
			|||||||
__author__ = "Sven Heidemann"
 | 
					__author__ = "Sven Heidemann"
 | 
				
			||||||
__license__ = "MIT"
 | 
					__license__ = "MIT"
 | 
				
			||||||
__copyright__ = "Copyright (c) 2020 - 2023 sh-edraft.de"
 | 
					__copyright__ = "Copyright (c) 2020 - 2023 sh-edraft.de"
 | 
				
			||||||
__version__ = "2023.4.0.post1"
 | 
					__version__ = "2023.4.dev170"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from collections import namedtuple
 | 
					from collections import namedtuple
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -28,4 +28,4 @@ from .email_client_settings import EMailClientSettings
 | 
				
			|||||||
from .email_client_settings_name_enum import EMailClientSettingsNameEnum
 | 
					from .email_client_settings_name_enum import EMailClientSettingsNameEnum
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
					VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
				
			||||||
version_info = VersionInfo(major="2023", minor="4", micro="0.post1")
 | 
					version_info = VersionInfo(major="2023", minor="4", micro="dev170")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,7 +15,7 @@ __title__ = "cpl_core.pipes"
 | 
				
			|||||||
__author__ = "Sven Heidemann"
 | 
					__author__ = "Sven Heidemann"
 | 
				
			||||||
__license__ = "MIT"
 | 
					__license__ = "MIT"
 | 
				
			||||||
__copyright__ = "Copyright (c) 2020 - 2023 sh-edraft.de"
 | 
					__copyright__ = "Copyright (c) 2020 - 2023 sh-edraft.de"
 | 
				
			||||||
__version__ = "2023.4.0.post1"
 | 
					__version__ = "2023.4.dev170"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from collections import namedtuple
 | 
					from collections import namedtuple
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -26,4 +26,4 @@ from .ip_address_pipe import IPAddressPipe
 | 
				
			|||||||
from .pipe_abc import PipeABC
 | 
					from .pipe_abc import PipeABC
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
					VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
				
			||||||
version_info = VersionInfo(major="2023", minor="4", micro="0.post1")
 | 
					version_info = VersionInfo(major="2023", minor="4", micro="dev170")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,7 +15,7 @@ __title__ = "cpl_core.time"
 | 
				
			|||||||
__author__ = "Sven Heidemann"
 | 
					__author__ = "Sven Heidemann"
 | 
				
			||||||
__license__ = "MIT"
 | 
					__license__ = "MIT"
 | 
				
			||||||
__copyright__ = "Copyright (c) 2020 - 2023 sh-edraft.de"
 | 
					__copyright__ = "Copyright (c) 2020 - 2023 sh-edraft.de"
 | 
				
			||||||
__version__ = "2023.4.0.post1"
 | 
					__version__ = "2023.4.dev170"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from collections import namedtuple
 | 
					from collections import namedtuple
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -25,4 +25,4 @@ from .time_format_settings import TimeFormatSettings
 | 
				
			|||||||
from .time_format_settings_names_enum import TimeFormatSettingsNamesEnum
 | 
					from .time_format_settings_names_enum import TimeFormatSettingsNamesEnum
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
					VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
				
			||||||
version_info = VersionInfo(major="2023", minor="4", micro="0.post1")
 | 
					version_info = VersionInfo(major="2023", minor="4", micro="dev170")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,3 +1,4 @@
 | 
				
			|||||||
from typing import TypeVar
 | 
					from typing import TypeVar, Union
 | 
				
			||||||
 | 
					
 | 
				
			||||||
T = TypeVar("T")
 | 
					T = TypeVar("T")
 | 
				
			||||||
 | 
					Number = Union[int, float]
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,7 +15,7 @@ __title__ = "cpl_core.utils"
 | 
				
			|||||||
__author__ = "Sven Heidemann"
 | 
					__author__ = "Sven Heidemann"
 | 
				
			||||||
__license__ = "MIT"
 | 
					__license__ = "MIT"
 | 
				
			||||||
__copyright__ = "Copyright (c) 2020 - 2023 sh-edraft.de"
 | 
					__copyright__ = "Copyright (c) 2020 - 2023 sh-edraft.de"
 | 
				
			||||||
__version__ = "2023.4.0.post1"
 | 
					__version__ = "2023.4.dev170"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from collections import namedtuple
 | 
					from collections import namedtuple
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -26,4 +26,4 @@ from .string import String
 | 
				
			|||||||
from .pip import Pip
 | 
					from .pip import Pip
 | 
				
			||||||
 | 
					
 | 
				
			||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
					VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
				
			||||||
version_info = VersionInfo(major="2023", minor="4", micro="0.post1")
 | 
					version_info = VersionInfo(major="2023", minor="4", micro="dev170")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -19,14 +19,8 @@ __version__ = "2023.4.dev170"
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
from collections import namedtuple
 | 
					from collections import namedtuple
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# imports
 | 
					# imports
 | 
				
			||||||
from .behavior_subject import BehaviorSubject
 | 
					 | 
				
			||||||
from .interval import Interval
 | 
					 | 
				
			||||||
from .observable import Observable
 | 
					 | 
				
			||||||
from .subject import Subject
 | 
					 | 
				
			||||||
from .subscriber import Subscriber
 | 
					 | 
				
			||||||
from .subscription import Subscription
 | 
					 | 
				
			||||||
from .type import ObserverOrCallable
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
					VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
				
			||||||
version_info = VersionInfo(major="2023", minor="4", micro="dev170")
 | 
					version_info = VersionInfo(major="2023", minor="4", micro="dev170")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -21,11 +21,6 @@ from collections import namedtuple
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# imports
 | 
					# imports
 | 
				
			||||||
from .observer import Observer
 | 
					 | 
				
			||||||
from .operator import Operator
 | 
					 | 
				
			||||||
from .subscribable import Subscribable
 | 
					 | 
				
			||||||
from .unsubscribable import Unsubscribable
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
					VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
				
			||||||
version_info = VersionInfo(major="2023", minor="4", micro="dev170")
 | 
					version_info = VersionInfo(major="2023", minor="4", micro="dev170")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
from typing import Any
 | 
					from typing import Any
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from cpl_reactive_extensions.subscriber import Subscriber
 | 
					from cpl_reactive_extensions.internal.subscriber import Subscriber
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Operator:
 | 
					class Operator:
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										10
									
								
								src/cpl_reactive_extensions/abc/scheduler_action.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								src/cpl_reactive_extensions/abc/scheduler_action.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
				
			|||||||
 | 
					from abc import ABC, abstractmethod
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from cpl_core.type import T, Number
 | 
				
			||||||
 | 
					from cpl_reactive_extensions.internal.subscription import Subscription
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class SchedulerAction(ABC):
 | 
				
			||||||
 | 
					    @abstractmethod
 | 
				
			||||||
 | 
					    def schedule(self, state: T = None, delay: Number = None) -> Subscription:
 | 
				
			||||||
 | 
					        pass
 | 
				
			||||||
							
								
								
									
										12
									
								
								src/cpl_reactive_extensions/abc/scheduler_like.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								src/cpl_reactive_extensions/abc/scheduler_like.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,12 @@
 | 
				
			|||||||
 | 
					from abc import ABC, abstractmethod
 | 
				
			||||||
 | 
					from typing import Callable, Optional
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from cpl_core.type import Number, T
 | 
				
			||||||
 | 
					from cpl_reactive_extensions.internal.subscription import Subscription
 | 
				
			||||||
 | 
					from cpl_reactive_extensions.abc.scheduler_action import SchedulerAction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class SchedulerLike(ABC):
 | 
				
			||||||
 | 
					    @abstractmethod
 | 
				
			||||||
 | 
					    def schedule(self, work: Callable[[SchedulerAction, Optional[T]], None], delay: Number, state: T) -> Subscription:
 | 
				
			||||||
 | 
					        pass
 | 
				
			||||||
@@ -16,7 +16,7 @@
 | 
				
			|||||||
    "LicenseName": "MIT",
 | 
					    "LicenseName": "MIT",
 | 
				
			||||||
    "LicenseDescription": "MIT, see LICENSE for more details.",
 | 
					    "LicenseDescription": "MIT, see LICENSE for more details.",
 | 
				
			||||||
    "Dependencies": [
 | 
					    "Dependencies": [
 | 
				
			||||||
      "cpl-core>=2023.4.0"
 | 
					      "cpl-core>=2023.4.dev170"
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    "DevDependencies": [
 | 
					    "DevDependencies": [
 | 
				
			||||||
      "cpl-cli>=2023.4.0"
 | 
					      "cpl-cli>=2023.4.0"
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										26
									
								
								src/cpl_reactive_extensions/helper/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								src/cpl_reactive_extensions/helper/__init__.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,26 @@
 | 
				
			|||||||
 | 
					# -*- coding: utf-8 -*-
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"""
 | 
				
			||||||
 | 
					cpl-reactive-extensions CPL Simple ReactiveX implementation
 | 
				
			||||||
 | 
					~~~~~~~~~~~~~~~~~~~
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CPL Simple ReactiveX implementation, see RxJS and RxPy for detailed implementation.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:copyright: (c) 2023 sh-edraft.de
 | 
				
			||||||
 | 
					:license: MIT, see LICENSE for more details.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					__title__ = "cpl_reactive_extensions.helper"
 | 
				
			||||||
 | 
					__author__ = "Sven Heidemann"
 | 
				
			||||||
 | 
					__license__ = "MIT"
 | 
				
			||||||
 | 
					__copyright__ = "Copyright (c) 2023 sh-edraft.de"
 | 
				
			||||||
 | 
					__version__ = "2023.4.dev170"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from collections import namedtuple
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# imports:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
				
			||||||
 | 
					version_info = VersionInfo(major="2023", minor="4", micro="dev170")
 | 
				
			||||||
							
								
								
									
										11
									
								
								src/cpl_reactive_extensions/helper/bind.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								src/cpl_reactive_extensions/helper/bind.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
				
			|||||||
 | 
					def bind(instance, func, *args, as_name=None):
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    Bind the function *func* to *instance*, with either provided name *as_name*
 | 
				
			||||||
 | 
					    or the existing name of *func*. The provided *func* should accept the
 | 
				
			||||||
 | 
					    instance as the first argument, i.e. "self".
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    if as_name is None:
 | 
				
			||||||
 | 
					        as_name = func.__name__
 | 
				
			||||||
 | 
					    bound_method = func.__get__(instance, instance.__class__)
 | 
				
			||||||
 | 
					    setattr(instance, as_name, bound_method)
 | 
				
			||||||
 | 
					    return bound_method
 | 
				
			||||||
							
								
								
									
										26
									
								
								src/cpl_reactive_extensions/internal/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								src/cpl_reactive_extensions/internal/__init__.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,26 @@
 | 
				
			|||||||
 | 
					# -*- coding: utf-8 -*-
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"""
 | 
				
			||||||
 | 
					cpl-reactive-extensions CPL Simple ReactiveX implementation
 | 
				
			||||||
 | 
					~~~~~~~~~~~~~~~~~~~
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CPL Simple ReactiveX implementation, see RxJS and RxPy for detailed implementation.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:copyright: (c) 2023 sh-edraft.de
 | 
				
			||||||
 | 
					:license: MIT, see LICENSE for more details.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					__title__ = "cpl_reactive_extensions.internal"
 | 
				
			||||||
 | 
					__author__ = "Sven Heidemann"
 | 
				
			||||||
 | 
					__license__ = "MIT"
 | 
				
			||||||
 | 
					__copyright__ = "Copyright (c) 2023 sh-edraft.de"
 | 
				
			||||||
 | 
					__version__ = "2023.4.dev170"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from collections import namedtuple
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# imports:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
				
			||||||
 | 
					version_info = VersionInfo(major="2023", minor="4", micro="dev170")
 | 
				
			||||||
							
								
								
									
										10
									
								
								src/cpl_reactive_extensions/internal/action.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								src/cpl_reactive_extensions/internal/action.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
				
			|||||||
 | 
					from cpl_core.type import T, Number
 | 
				
			||||||
 | 
					from cpl_reactive_extensions.internal.subscription import Subscription
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Action(Subscription):
 | 
				
			||||||
 | 
					    def __init__(self, scheduler, work):
 | 
				
			||||||
 | 
					        Subscription.__init__(self)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def schedule(self, state: T = None, delay: Number = 0) -> Subscription:
 | 
				
			||||||
 | 
					        return self
 | 
				
			||||||
							
								
								
									
										97
									
								
								src/cpl_reactive_extensions/internal/async_action.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										97
									
								
								src/cpl_reactive_extensions/internal/async_action.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,97 @@
 | 
				
			|||||||
 | 
					from typing import Optional
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from cpl_core.type import T, Number
 | 
				
			||||||
 | 
					from cpl_reactive_extensions.internal.action import Action
 | 
				
			||||||
 | 
					from cpl_reactive_extensions.internal.subscription import Subscription
 | 
				
			||||||
 | 
					from cpl_reactive_extensions.timer import Timer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class AsyncAction(Action):
 | 
				
			||||||
 | 
					    def __init__(self, scheduler, work):
 | 
				
			||||||
 | 
					        from cpl_reactive_extensions.scheduler.async_scheduler import AsyncScheduler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Action.__init__(self, scheduler, work)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self._scheduler: AsyncScheduler = scheduler
 | 
				
			||||||
 | 
					        self._work = work
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.timer = None
 | 
				
			||||||
 | 
					        self.state: Optional[T] = None
 | 
				
			||||||
 | 
					        self.delay: Number = 0
 | 
				
			||||||
 | 
					        self._pending = False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def schedule(self, state: T = None, delay: Number = 0) -> Subscription:
 | 
				
			||||||
 | 
					        if self.closed:
 | 
				
			||||||
 | 
					            return self
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.state = state
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        timer = self.timer
 | 
				
			||||||
 | 
					        scheduler = self._scheduler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if timer is not None:
 | 
				
			||||||
 | 
					            self.timer = self.recycle_async_timer(scheduler, timer, delay)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self._pending = True
 | 
				
			||||||
 | 
					        self.delay = delay
 | 
				
			||||||
 | 
					        self.timer = self.timer if self.timer is not None else self.request_async_timer(scheduler, delay)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return self
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def request_async_timer(self, scheduler, delay: Number = 0):
 | 
				
			||||||
 | 
					        from cpl_reactive_extensions.scheduler.async_scheduler import AsyncScheduler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        scheduler: AsyncScheduler = scheduler
 | 
				
			||||||
 | 
					        return Timer(delay, lambda: scheduler.flush(self))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def recycle_async_timer(self, scheduler, timer=None, delay: Number = None):
 | 
				
			||||||
 | 
					        from cpl_reactive_extensions.scheduler.async_scheduler import AsyncScheduler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        scheduler: AsyncScheduler = scheduler
 | 
				
			||||||
 | 
					        if delay is None and self.delay == delay and not self._pending:
 | 
				
			||||||
 | 
					            return timer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if timer is not None:
 | 
				
			||||||
 | 
					            timer.clear()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def execute(self, state: T, delay: Number):
 | 
				
			||||||
 | 
					        if self.closed:
 | 
				
			||||||
 | 
					            return Exception("Executing cancelled action")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self._pending = False
 | 
				
			||||||
 | 
					        error = self._execute(state, delay)
 | 
				
			||||||
 | 
					        if error is not None:
 | 
				
			||||||
 | 
					            return error
 | 
				
			||||||
 | 
					        elif not self._pending and self.timer is not None:
 | 
				
			||||||
 | 
					            self._timer = self.recycle_async_timer(self._scheduler, self.timer, None)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def _execute(self, state: T, delay: Number):
 | 
				
			||||||
 | 
					        errored = False
 | 
				
			||||||
 | 
					        ex = None
 | 
				
			||||||
 | 
					        try:
 | 
				
			||||||
 | 
					            self._work(state)
 | 
				
			||||||
 | 
					        except Exception as e:
 | 
				
			||||||
 | 
					            errored = True
 | 
				
			||||||
 | 
					            ex = e
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if errored:
 | 
				
			||||||
 | 
					            self.unsubscribe()
 | 
				
			||||||
 | 
					            return ex
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def unsubscribe(self):
 | 
				
			||||||
 | 
					        if self.closed:
 | 
				
			||||||
 | 
					            return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self._scheduler.actions.remove(self)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if self._timer is not None:
 | 
				
			||||||
 | 
					            self._timer = self.recycle_async_timer(self._scheduler, self.timer, None)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self._work = None
 | 
				
			||||||
 | 
					        self.state = None
 | 
				
			||||||
 | 
					        self._scheduler = None
 | 
				
			||||||
 | 
					        self._pending = False
 | 
				
			||||||
 | 
					        self.delay = None
 | 
				
			||||||
 | 
					        Action.unsubscribe(self)
 | 
				
			||||||
@@ -1,8 +1,8 @@
 | 
				
			|||||||
from typing import Callable
 | 
					from typing import Callable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from cpl_core.type import T
 | 
					from cpl_core.type import T
 | 
				
			||||||
from cpl_reactive_extensions import Subscriber
 | 
					 | 
				
			||||||
from cpl_reactive_extensions.abc import Observer
 | 
					from cpl_reactive_extensions.abc import Observer
 | 
				
			||||||
 | 
					from cpl_reactive_extensions.internal.subscriber import Subscriber
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class OperatorSubscriber(Subscriber, Observer):
 | 
					class OperatorSubscriber(Subscriber, Observer):
 | 
				
			||||||
@@ -2,7 +2,7 @@ from typing import Callable
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
from cpl_core.type import T
 | 
					from cpl_core.type import T
 | 
				
			||||||
from cpl_reactive_extensions.abc.observer import Observer
 | 
					from cpl_reactive_extensions.abc.observer import Observer
 | 
				
			||||||
from cpl_reactive_extensions.subscription import Subscription
 | 
					from cpl_reactive_extensions.internal.subscription import Subscription
 | 
				
			||||||
from cpl_reactive_extensions.type import ObserverOrCallable
 | 
					from cpl_reactive_extensions.type import ObserverOrCallable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										10
									
								
								src/cpl_reactive_extensions/internal/timer_provider.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								src/cpl_reactive_extensions/internal/timer_provider.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
				
			|||||||
 | 
					from typing import Callable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from cpl_core.type import Number
 | 
				
			||||||
 | 
					from cpl_reactive_extensions.timer import Timer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class TimerProvider:
 | 
				
			||||||
 | 
					    @staticmethod
 | 
				
			||||||
 | 
					    def set_timer(handler: Callable, timeout: Number = None, *args):
 | 
				
			||||||
 | 
					        return Timer(timeout, handler, *args)
 | 
				
			||||||
@@ -1,6 +1,7 @@
 | 
				
			|||||||
from typing import Callable
 | 
					from typing import Callable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from cpl_reactive_extensions import Observable, Subscriber
 | 
					from cpl_reactive_extensions.observable import Observable
 | 
				
			||||||
 | 
					from cpl_reactive_extensions.internal.subscriber import Subscriber
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def operate(init: Callable[[Observable, Subscriber], None]):
 | 
					def operate(init: Callable[[Observable, Subscriber], None]):
 | 
				
			||||||
@@ -3,8 +3,8 @@ import threading
 | 
				
			|||||||
import time
 | 
					import time
 | 
				
			||||||
from typing import Callable
 | 
					from typing import Callable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from cpl_reactive_extensions.internal.subscriber import Subscriber
 | 
				
			||||||
from cpl_reactive_extensions.observable import Observable
 | 
					from cpl_reactive_extensions.observable import Observable
 | 
				
			||||||
from cpl_reactive_extensions.subscriber import Subscriber
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Interval(Observable):
 | 
					class Interval(Observable):
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,11 +1,12 @@
 | 
				
			|||||||
from __future__ import annotations
 | 
					from __future__ import annotations
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from typing import Callable, Any, Optional, Type
 | 
					from typing import Callable, Any, Optional
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from cpl_core.type import T
 | 
					from cpl_core.type import T
 | 
				
			||||||
 | 
					from cpl_reactive_extensions.abc.observer import Observer
 | 
				
			||||||
from cpl_reactive_extensions.abc.subscribable import Subscribable
 | 
					from cpl_reactive_extensions.abc.subscribable import Subscribable
 | 
				
			||||||
from cpl_reactive_extensions.subscriber import Observer, Subscriber
 | 
					from cpl_reactive_extensions.internal.subscriber import Subscriber
 | 
				
			||||||
from cpl_reactive_extensions.subscription import Subscription
 | 
					from cpl_reactive_extensions.internal.subscription import Subscription
 | 
				
			||||||
from cpl_reactive_extensions.type import ObserverOrCallable
 | 
					from cpl_reactive_extensions.type import ObserverOrCallable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -0,0 +1,26 @@
 | 
				
			|||||||
 | 
					# -*- coding: utf-8 -*-
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"""
 | 
				
			||||||
 | 
					cpl-reactive-extensions CPL Simple ReactiveX implementation
 | 
				
			||||||
 | 
					~~~~~~~~~~~~~~~~~~~
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CPL Simple ReactiveX implementation, see RxJS and RxPy for detailed implementation.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:copyright: (c) 2023 sh-edraft.de
 | 
				
			||||||
 | 
					:license: MIT, see LICENSE for more details.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					__title__ = "cpl_reactive_extensions.operators"
 | 
				
			||||||
 | 
					__author__ = "Sven Heidemann"
 | 
				
			||||||
 | 
					__license__ = "MIT"
 | 
				
			||||||
 | 
					__copyright__ = "Copyright (c) 2023 sh-edraft.de"
 | 
				
			||||||
 | 
					__version__ = "2023.4.dev170"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from collections import namedtuple
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# imports:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
				
			||||||
 | 
					version_info = VersionInfo(major="2023", minor="4", micro="dev170")
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										62
									
								
								src/cpl_reactive_extensions/operators/debounce_time.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								src/cpl_reactive_extensions/operators/debounce_time.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,62 @@
 | 
				
			|||||||
 | 
					from typing import Optional
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from cpl_core.type import T, Number
 | 
				
			||||||
 | 
					from cpl_reactive_extensions.abc import SchedulerAction
 | 
				
			||||||
 | 
					from cpl_reactive_extensions.internal.operator_subscriber import OperatorSubscriber
 | 
				
			||||||
 | 
					from cpl_reactive_extensions.internal.subscriber import Subscriber
 | 
				
			||||||
 | 
					from cpl_reactive_extensions.internal.subscription import Subscription
 | 
				
			||||||
 | 
					from cpl_reactive_extensions.internal.utils import operate
 | 
				
			||||||
 | 
					from cpl_reactive_extensions.observable import Observable
 | 
				
			||||||
 | 
					from cpl_reactive_extensions.scheduler.async_scheduler import async_scheduler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def debounce_time(time: Number, scheduler=async_scheduler):
 | 
				
			||||||
 | 
					    def init(source: Observable, subscriber: Subscriber):
 | 
				
			||||||
 | 
					        active_task: Optional[Subscription] = None
 | 
				
			||||||
 | 
					        last_value: Optional[T] = None
 | 
				
			||||||
 | 
					        last_time: Optional[Number] = None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        def emit():
 | 
				
			||||||
 | 
					            nonlocal active_task, last_value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if active_task is None:
 | 
				
			||||||
 | 
					                return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            active_task.unsubscribe()
 | 
				
			||||||
 | 
					            active_task = None
 | 
				
			||||||
 | 
					            value = last_value
 | 
				
			||||||
 | 
					            last_value = None
 | 
				
			||||||
 | 
					            subscriber.next(value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        def emit_when_idle(action: SchedulerAction):
 | 
				
			||||||
 | 
					            nonlocal active_task, last_time
 | 
				
			||||||
 | 
					            target_time = last_time + time
 | 
				
			||||||
 | 
					            now = scheduler.now
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if now < target_time:
 | 
				
			||||||
 | 
					                active_task = action.schedule(None, target_time - now)
 | 
				
			||||||
 | 
					                subscriber.add(active_task)
 | 
				
			||||||
 | 
					                return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            emit()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        def on_next(value: T):
 | 
				
			||||||
 | 
					            nonlocal active_task, last_value
 | 
				
			||||||
 | 
					            last_value = value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if active_task is None:
 | 
				
			||||||
 | 
					                active_task = scheduler.schedule(emit_when_idle, time)
 | 
				
			||||||
 | 
					                subscriber.add(active_task)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        def on_complete():
 | 
				
			||||||
 | 
					            emit()
 | 
				
			||||||
 | 
					            subscriber.complete()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        def on_finalize():
 | 
				
			||||||
 | 
					            nonlocal active_task, last_value
 | 
				
			||||||
 | 
					            last_value = None
 | 
				
			||||||
 | 
					            active_task = None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        sub = source.subscribe(OperatorSubscriber(subscriber, on_next, None, on_complete, on_finalize))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return operate(init)
 | 
				
			||||||
@@ -1,7 +1,8 @@
 | 
				
			|||||||
from cpl_core.type import T
 | 
					from cpl_core.type import T
 | 
				
			||||||
from cpl_reactive_extensions import Subscriber, Observable
 | 
					from cpl_reactive_extensions.internal.subscriber import Subscriber
 | 
				
			||||||
from cpl_reactive_extensions.operator_subscriber import OperatorSubscriber
 | 
					from cpl_reactive_extensions.observable import Observable
 | 
				
			||||||
from cpl_reactive_extensions.utils import operate
 | 
					from cpl_reactive_extensions.internal.operator_subscriber import OperatorSubscriber
 | 
				
			||||||
 | 
					from cpl_reactive_extensions.internal.utils import operate
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def take(count: int):
 | 
					def take(count: int):
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
from cpl_core.type import T
 | 
					from cpl_reactive_extensions.observable import Observable
 | 
				
			||||||
from cpl_reactive_extensions import Subscriber, Observable
 | 
					from cpl_reactive_extensions.internal.operator_subscriber import OperatorSubscriber
 | 
				
			||||||
from cpl_reactive_extensions.operator_subscriber import OperatorSubscriber
 | 
					from cpl_reactive_extensions.internal.subscriber import Subscriber
 | 
				
			||||||
from cpl_reactive_extensions.utils import operate
 | 
					from cpl_reactive_extensions.internal.utils import operate
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def take_until(notifier: Observable):
 | 
					def take_until(notifier: Observable):
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										26
									
								
								src/cpl_reactive_extensions/scheduler/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								src/cpl_reactive_extensions/scheduler/__init__.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,26 @@
 | 
				
			|||||||
 | 
					# -*- coding: utf-8 -*-
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"""
 | 
				
			||||||
 | 
					cpl-reactive-extensions CPL Simple ReactiveX implementation
 | 
				
			||||||
 | 
					~~~~~~~~~~~~~~~~~~~
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CPL Simple ReactiveX implementation, see RxJS and RxPy for detailed implementation.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:copyright: (c) 2023 sh-edraft.de
 | 
				
			||||||
 | 
					:license: MIT, see LICENSE for more details.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					__title__ = "cpl_reactive_extensions.scheduler"
 | 
				
			||||||
 | 
					__author__ = "Sven Heidemann"
 | 
				
			||||||
 | 
					__license__ = "MIT"
 | 
				
			||||||
 | 
					__copyright__ = "Copyright (c) 2023 sh-edraft.de"
 | 
				
			||||||
 | 
					__version__ = "2023.4.dev170"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from collections import namedtuple
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# imports:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
				
			||||||
 | 
					version_info = VersionInfo(major="2023", minor="4", micro="dev170")
 | 
				
			||||||
							
								
								
									
										36
									
								
								src/cpl_reactive_extensions/scheduler/async_scheduler.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								src/cpl_reactive_extensions/scheduler/async_scheduler.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,36 @@
 | 
				
			|||||||
 | 
					from typing import Type
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from cpl_reactive_extensions.internal.action import Action
 | 
				
			||||||
 | 
					from cpl_reactive_extensions.internal.async_action import AsyncAction
 | 
				
			||||||
 | 
					from cpl_reactive_extensions.scheduler.scheduler import Scheduler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class AsyncScheduler(Scheduler):
 | 
				
			||||||
 | 
					    def __init__(self, scheduler_action_ctor: Type[Action], now=None):
 | 
				
			||||||
 | 
					        Scheduler.__init__(self, scheduler_action_ctor, now)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.actions: list[AsyncAction] = []
 | 
				
			||||||
 | 
					        self._active = False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def flush(self, action: AsyncAction):
 | 
				
			||||||
 | 
					        if self._active:
 | 
				
			||||||
 | 
					            self.actions.append(action)
 | 
				
			||||||
 | 
					            return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        error = None
 | 
				
			||||||
 | 
					        self._active = True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for action in self.actions:
 | 
				
			||||||
 | 
					            error = action.execute(action.state, action.delay)
 | 
				
			||||||
 | 
					            if error:
 | 
				
			||||||
 | 
					                break
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self._active = False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if error is not None:
 | 
				
			||||||
 | 
					            for action in self.actions:
 | 
				
			||||||
 | 
					                action.unsubscribe()
 | 
				
			||||||
 | 
					            raise error
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					async_scheduler = AsyncScheduler(AsyncAction)
 | 
				
			||||||
							
								
								
									
										29
									
								
								src/cpl_reactive_extensions/scheduler/scheduler.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								src/cpl_reactive_extensions/scheduler/scheduler.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,29 @@
 | 
				
			|||||||
 | 
					from datetime import datetime
 | 
				
			||||||
 | 
					from typing import Callable, Optional, Type
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from cpl_core.type import T, Number
 | 
				
			||||||
 | 
					from cpl_reactive_extensions.abc.scheduler_action import SchedulerAction
 | 
				
			||||||
 | 
					from cpl_reactive_extensions.abc.scheduler_like import SchedulerLike
 | 
				
			||||||
 | 
					from cpl_reactive_extensions.internal.action import Action
 | 
				
			||||||
 | 
					from cpl_reactive_extensions.internal.subscription import Subscription
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Scheduler(SchedulerLike):
 | 
				
			||||||
 | 
					    @staticmethod
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def _get_now(self=None) -> Number:
 | 
				
			||||||
 | 
					        return int(datetime.now().strftime("%s"))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    now = _get_now
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def __init__(self, scheduler_action_ctor: Type[Action], now=None):
 | 
				
			||||||
 | 
					        self.now = self._get_now if now is None else now
 | 
				
			||||||
 | 
					        self._scheduler_action_ctor = scheduler_action_ctor
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def schedule(
 | 
				
			||||||
 | 
					        self, work: Callable[[SchedulerAction, Optional[T]], None], delay: Number, state: T = None
 | 
				
			||||||
 | 
					    ) -> Subscription:
 | 
				
			||||||
 | 
					        action = self._scheduler_action_ctor(self, work)
 | 
				
			||||||
 | 
					        x = action.schedule(state, delay)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return x
 | 
				
			||||||
							
								
								
									
										26
									
								
								src/cpl_reactive_extensions/subject/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								src/cpl_reactive_extensions/subject/__init__.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,26 @@
 | 
				
			|||||||
 | 
					# -*- coding: utf-8 -*-
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"""
 | 
				
			||||||
 | 
					cpl-reactive-extensions CPL Simple ReactiveX implementation
 | 
				
			||||||
 | 
					~~~~~~~~~~~~~~~~~~~
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CPL Simple ReactiveX implementation, see RxJS and RxPy for detailed implementation.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:copyright: (c) 2023 sh-edraft.de
 | 
				
			||||||
 | 
					:license: MIT, see LICENSE for more details.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					__title__ = "cpl_reactive_extensions.subject"
 | 
				
			||||||
 | 
					__author__ = "Sven Heidemann"
 | 
				
			||||||
 | 
					__license__ = "MIT"
 | 
				
			||||||
 | 
					__copyright__ = "Copyright (c) 2023 sh-edraft.de"
 | 
				
			||||||
 | 
					__version__ = "2023.4.dev170"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from collections import namedtuple
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# imports:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					VersionInfo = namedtuple("VersionInfo", "major minor micro")
 | 
				
			||||||
 | 
					version_info = VersionInfo(major="2023", minor="4", micro="dev170")
 | 
				
			||||||
@@ -1,9 +1,11 @@
 | 
				
			|||||||
 | 
					from typing import Type
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from cpl_core.type import T
 | 
					from cpl_core.type import T
 | 
				
			||||||
from cpl_reactive_extensions.subject import Subject
 | 
					from cpl_reactive_extensions.subject.subject import Subject
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class BehaviorSubject(Subject):
 | 
					class BehaviorSubject(Subject):
 | 
				
			||||||
    def __init__(self, _t: type, value: T):
 | 
					    def __init__(self, _t: Type[T], value: T):
 | 
				
			||||||
        Subject.__init__(self, _t)
 | 
					        Subject.__init__(self, _t)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if not isinstance(value, _t):
 | 
					        if not isinstance(value, _t):
 | 
				
			||||||
@@ -4,8 +4,8 @@ from typing import Any, Optional, Type
 | 
				
			|||||||
from cpl_core.type import T
 | 
					from cpl_core.type import T
 | 
				
			||||||
from cpl_reactive_extensions.abc.observer import Observer
 | 
					from cpl_reactive_extensions.abc.observer import Observer
 | 
				
			||||||
from cpl_reactive_extensions.observable import Observable
 | 
					from cpl_reactive_extensions.observable import Observable
 | 
				
			||||||
from cpl_reactive_extensions.subscriber import Subscriber
 | 
					from cpl_reactive_extensions.internal.subscriber import Subscriber
 | 
				
			||||||
from cpl_reactive_extensions.subscription import Subscription
 | 
					from cpl_reactive_extensions.internal.subscription import Subscription
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Subject(Observable, Observer):
 | 
					class Subject(Observable, Observer):
 | 
				
			||||||
							
								
								
									
										24
									
								
								src/cpl_reactive_extensions/timer.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								src/cpl_reactive_extensions/timer.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,24 @@
 | 
				
			|||||||
 | 
					import threading
 | 
				
			||||||
 | 
					import time
 | 
				
			||||||
 | 
					from typing import Callable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from cpl_core.type import Number
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Timer:
 | 
				
			||||||
 | 
					    def __init__(self, interval: Number, action: Callable, *args):
 | 
				
			||||||
 | 
					        self._interval = interval / 1000
 | 
				
			||||||
 | 
					        self._action = action
 | 
				
			||||||
 | 
					        self._args = args
 | 
				
			||||||
 | 
					        self.stop_event = threading.Event()
 | 
				
			||||||
 | 
					        thread = threading.Thread(target=self.__set_interval)
 | 
				
			||||||
 | 
					        thread.start()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def __set_interval(self):
 | 
				
			||||||
 | 
					        next_time = time.time() + self._interval
 | 
				
			||||||
 | 
					        while not self.stop_event.wait(next_time - time.time()):
 | 
				
			||||||
 | 
					            next_time += self._interval
 | 
				
			||||||
 | 
					            self._action(*self._args)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def clear(self):
 | 
				
			||||||
 | 
					        self.stop_event.set()
 | 
				
			||||||
@@ -3,7 +3,9 @@ import traceback
 | 
				
			|||||||
import unittest
 | 
					import unittest
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from cpl_core.console import Console
 | 
					from cpl_core.console import Console
 | 
				
			||||||
from cpl_reactive_extensions import Subject
 | 
					from cpl_reactive_extensions.observable import Observable
 | 
				
			||||||
 | 
					from cpl_reactive_extensions.operators import debounce_time
 | 
				
			||||||
 | 
					from cpl_reactive_extensions.subject.subject import Subject
 | 
				
			||||||
from cpl_reactive_extensions.interval import Interval
 | 
					from cpl_reactive_extensions.interval import Interval
 | 
				
			||||||
from cpl_reactive_extensions.operators.take import take
 | 
					from cpl_reactive_extensions.operators.take import take
 | 
				
			||||||
from cpl_reactive_extensions.operators.take_until import take_until
 | 
					from cpl_reactive_extensions.operators.take_until import take_until
 | 
				
			||||||
@@ -65,3 +67,17 @@ class ObservableOperatorTestCase(unittest.TestCase):
 | 
				
			|||||||
        unsubscriber.next(None)
 | 
					        unsubscriber.next(None)
 | 
				
			||||||
        unsubscriber.complete()
 | 
					        unsubscriber.complete()
 | 
				
			||||||
        self.assertEqual(count, timer * 10 - 1)
 | 
					        self.assertEqual(count, timer * 10 - 1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_debounce_time(self):
 | 
				
			||||||
 | 
					        def call(x):
 | 
				
			||||||
 | 
					            x.next(1)
 | 
				
			||||||
 | 
					            x.next(2)
 | 
				
			||||||
 | 
					            x.next(3)
 | 
				
			||||||
 | 
					            x.next(4)
 | 
				
			||||||
 | 
					            x.next(5)
 | 
				
			||||||
 | 
					            x.next(6)
 | 
				
			||||||
 | 
					            x.complete()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        observable = Observable(call)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        observable.pipe(debounce_time(600)).subscribe(lambda x: Console.write_line("Hey", x))
 | 
				
			||||||
@@ -5,11 +5,11 @@ from datetime import datetime
 | 
				
			|||||||
from threading import Timer
 | 
					from threading import Timer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from cpl_core.console import Console
 | 
					from cpl_core.console import Console
 | 
				
			||||||
from cpl_reactive_extensions.behavior_subject import BehaviorSubject
 | 
					from cpl_reactive_extensions.subject.behavior_subject import BehaviorSubject
 | 
				
			||||||
from cpl_reactive_extensions.interval import Interval
 | 
					from cpl_reactive_extensions.interval import Interval
 | 
				
			||||||
from cpl_reactive_extensions.observable import Observable
 | 
					from cpl_reactive_extensions.observable import Observable
 | 
				
			||||||
from cpl_reactive_extensions.subject import Subject
 | 
					from cpl_reactive_extensions.subject.subject import Subject
 | 
				
			||||||
from cpl_reactive_extensions.subscriber import Observer
 | 
					from cpl_reactive_extensions.internal.subscriber import Observer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class ReactiveTestCase(unittest.TestCase):
 | 
					class ReactiveTestCase(unittest.TestCase):
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +1,8 @@
 | 
				
			|||||||
import unittest
 | 
					import unittest
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from unittests_reactive_extenstions.observable_operator import ObservableOperatorTestCase
 | 
					from unittests_reactive_extenstions.observable_operator_test_case import ObservableOperatorTestCase
 | 
				
			||||||
from unittests_reactive_extenstions.reactive_test_case import ReactiveTestCase
 | 
					from unittests_reactive_extenstions.reactive_test_case import ReactiveTestCase
 | 
				
			||||||
 | 
					from unittests_reactive_extenstions.scheduler_test_case import SchedulerTestCase
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class ReactiveTestSuite(unittest.TestSuite):
 | 
					class ReactiveTestSuite(unittest.TestSuite):
 | 
				
			||||||
@@ -11,6 +12,7 @@ class ReactiveTestSuite(unittest.TestSuite):
 | 
				
			|||||||
        loader = unittest.TestLoader()
 | 
					        loader = unittest.TestLoader()
 | 
				
			||||||
        self.addTests(loader.loadTestsFromTestCase(ReactiveTestCase))
 | 
					        self.addTests(loader.loadTestsFromTestCase(ReactiveTestCase))
 | 
				
			||||||
        self.addTests(loader.loadTestsFromTestCase(ObservableOperatorTestCase))
 | 
					        self.addTests(loader.loadTestsFromTestCase(ObservableOperatorTestCase))
 | 
				
			||||||
 | 
					        self.addTests(loader.loadTestsFromTestCase(SchedulerTestCase))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def run(self, *args):
 | 
					    def run(self, *args):
 | 
				
			||||||
        super().run(*args)
 | 
					        super().run(*args)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -0,0 +1,36 @@
 | 
				
			|||||||
 | 
					import time
 | 
				
			||||||
 | 
					import unittest
 | 
				
			||||||
 | 
					from datetime import datetime
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from cpl_core.console import Console
 | 
				
			||||||
 | 
					from cpl_reactive_extensions.scheduler.async_scheduler import async_scheduler
 | 
				
			||||||
 | 
					from cpl_reactive_extensions.timer import Timer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class SchedulerTestCase(unittest.TestCase):
 | 
				
			||||||
 | 
					    def setUp(self):
 | 
				
			||||||
 | 
					        pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_timer(self):
 | 
				
			||||||
 | 
					        count = 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        def task():
 | 
				
			||||||
 | 
					            nonlocal count
 | 
				
			||||||
 | 
					            Console.write_line(datetime.now(), "Hello world")
 | 
				
			||||||
 | 
					            count += 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        timer = Timer(100, task)
 | 
				
			||||||
 | 
					        time.sleep(0.25)
 | 
				
			||||||
 | 
					        self.assertEqual(count, 2)
 | 
				
			||||||
 | 
					        timer.clear()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_schedule(self):
 | 
				
			||||||
 | 
					        count = 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        def task():
 | 
				
			||||||
 | 
					            nonlocal count
 | 
				
			||||||
 | 
					            Console.write_line(datetime.now(), "Hello world")
 | 
				
			||||||
 | 
					            count += 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        async_scheduler.schedule(task, 100)
 | 
				
			||||||
 | 
					        time.sleep(2)
 | 
				
			||||||
							
								
								
									
										21
									
								
								unittests/unittests_reactive_extenstions/test.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								unittests/unittests_reactive_extenstions/test.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,21 @@
 | 
				
			|||||||
 | 
					import time
 | 
				
			||||||
 | 
					from datetime import datetime
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from cpl_core.console import Console
 | 
				
			||||||
 | 
					from cpl_reactive_extensions.timer import Timer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def test_timer():
 | 
				
			||||||
 | 
					    is_working = False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def task():
 | 
				
			||||||
 | 
					        nonlocal is_working
 | 
				
			||||||
 | 
					        Console.write_line(datetime.now(), "Hello world")
 | 
				
			||||||
 | 
					        is_working = True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    timer = Timer(100, task)
 | 
				
			||||||
 | 
					    time.sleep(0.2)
 | 
				
			||||||
 | 
					    timer.clear()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					test_timer()
 | 
				
			||||||
@@ -2,9 +2,9 @@
 | 
				
			|||||||
  "ProjectSettings": {
 | 
					  "ProjectSettings": {
 | 
				
			||||||
    "Name": "unittests_reactive_extenstions",
 | 
					    "Name": "unittests_reactive_extenstions",
 | 
				
			||||||
    "Version": {
 | 
					    "Version": {
 | 
				
			||||||
      "Major": "0",
 | 
					      "Major": "2023",
 | 
				
			||||||
      "Minor": "0",
 | 
					      "Minor": "4",
 | 
				
			||||||
      "Micro": "0"
 | 
					      "Micro": "dev170"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "Author": "",
 | 
					    "Author": "",
 | 
				
			||||||
    "AuthorEmail": "",
 | 
					    "AuthorEmail": "",
 | 
				
			||||||
@@ -16,7 +16,7 @@
 | 
				
			|||||||
    "LicenseName": "",
 | 
					    "LicenseName": "",
 | 
				
			||||||
    "LicenseDescription": "",
 | 
					    "LicenseDescription": "",
 | 
				
			||||||
    "Dependencies": [
 | 
					    "Dependencies": [
 | 
				
			||||||
      "cpl-core>=2023.4.0"
 | 
					      "cpl-core>=2023.4.dev170"
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    "DevDependencies": [
 | 
					    "DevDependencies": [
 | 
				
			||||||
      "cpl-cli>=2023.4.0"
 | 
					      "cpl-cli>=2023.4.0"
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user