orionis 0.460.0__py3-none-any.whl → 0.463.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -18,7 +18,7 @@ class HelpCommand(BaseCommand):
18
18
  # Command description
19
19
  description: str = "Displays usage information, examples, and a list of available commands in the Orionis CLI."
20
20
 
21
- def handle(self, reactor: IReactor) -> None:
21
+ def handle(self, reactor: IReactor) -> dict:
22
22
  """
23
23
  Displays usage information and a list of available commands for the Orionis CLI.
24
24
 
@@ -29,8 +29,8 @@ class HelpCommand(BaseCommand):
29
29
 
30
30
  Returns
31
31
  -------
32
- None
33
- This method does not return any value. It prints help information to the console.
32
+ dict
33
+ A dictionary containing the list of available commands, each with its signature and description.
34
34
 
35
35
  Raises
36
36
  ------
@@ -77,6 +77,9 @@ class HelpCommand(BaseCommand):
77
77
  console.print(panel)
78
78
  console.print()
79
79
 
80
+ # Return the list of commands for potential further use
81
+ return commands
82
+
80
83
  except Exception as e:
81
84
 
82
85
  # Raise a custom runtime error if any exception occurs
@@ -0,0 +1,577 @@
1
+ import inspect
2
+ import os
3
+ import re
4
+ import shutil
5
+ import subprocess
6
+ import sys
7
+ import time
8
+ from pathlib import Path
9
+ from rich.console import Console
10
+ from rich.panel import Panel
11
+ from orionis.console.base.command import BaseCommand
12
+ from orionis.console.contracts.reactor import IReactor
13
+ from orionis.console.exceptions import CLIOrionisRuntimeError
14
+ from orionis.metadata.framework import VERSION
15
+
16
+ class PublisherCommand(BaseCommand):
17
+ """
18
+ PublisherCommand is a console command for automating the process of publishing a Python package to the Orionis repository (PyPI).
19
+
20
+ This command performs the following steps:
21
+ 1. Runs the project's test suite and aborts if there are any test failures or errors.
22
+ 2. Bumps the minor version number in the file where the VERSION constant is defined.
23
+ 3. Commits and pushes changes to the Git repository if there are modifications.
24
+ 4. Builds the package distributions (source and wheel) using `setup.py`.
25
+ 5. Publishes the built distributions to PyPI using Twine and a token from environment variables.
26
+ 6. Cleans up temporary build artifacts and metadata directories after publishing.
27
+
28
+ Attributes
29
+ ----------
30
+ timestamps : bool
31
+ Indicates whether timestamps will be shown in the command output.
32
+ signature : str
33
+ Command signature ("publisher").
34
+ description : str
35
+ Command description.
36
+
37
+ Methods
38
+ -------
39
+ __init__(console: Console)
40
+ Initializes the PublisherCommand instance, setting up the console, project root, console width, and PyPI token.
41
+ __bumpMinorVersion()
42
+ Increments the minor version number in the file where the VERSION constant is defined.
43
+ __gitPush()
44
+ Commits and pushes changes to the Git repository if there are modifications.
45
+ __build()
46
+ Builds the package distributions using `setup.py`.
47
+ __publish()
48
+ Publishes the built distributions to PyPI using Twine and a token from environment variables.
49
+ __clearRepository()
50
+ Cleans up temporary build artifacts and metadata directories after publishing.
51
+ handle(reactor: IReactor) -> None
52
+ Orchestrates the publishing process, running tests, bumping version, pushing to Git, building, and publishing the package.
53
+
54
+ Returns
55
+ -------
56
+ None
57
+ This class does not return a value directly. The main workflow is executed via the `handle` method, which returns None.
58
+ """
59
+
60
+ # Indicates whether timestamps will be shown in the command output
61
+ timestamps: bool = False
62
+
63
+ # Command signature and description
64
+ signature: str = "__publisher__"
65
+
66
+ # Command description
67
+ description: str = "Publishes Package to the Orionis repository."
68
+
69
+ def __init__(self, console: Console):
70
+ """
71
+ Initializes the PublisherCommand instance with the provided console and sets up
72
+ essential attributes for publishing operations.
73
+
74
+ This constructor sets up the console for output, determines the project root
75
+ directory, calculates the console width for display panels, and retrieves the
76
+ PyPI authentication token from environment variables.
77
+
78
+ Parameters
79
+ ----------
80
+ console : Console
81
+ The Rich Console instance used for formatted output throughout the command execution.
82
+
83
+ Returns
84
+ -------
85
+ None
86
+ This method does not return any value. It initializes instance attributes for use in other methods.
87
+ """
88
+
89
+ # Store the console instance for output
90
+ self.__console = console
91
+
92
+ # Set the project root to the current working directory
93
+ self.__project_root = Path.cwd()
94
+
95
+ # Calculate the width for console panels (3/4 of the console width)
96
+ self.__with_console = (self.__console.width // 4) * 3
97
+
98
+ # Retrieve the PyPI token from environment variables and remove leading/trailing whitespace
99
+ self.__token = os.getenv("PYPI_TOKEN").strip()
100
+
101
+ def __bumpMinorVersion(self):
102
+ """
103
+ Increment the minor version number in the file where the VERSION constant is defined.
104
+
105
+ This method locates the file containing the VERSION constant, reads its contents,
106
+ searches for the version assignment line, increments the minor version component,
107
+ and writes the updated version string back to the file. The patch and major
108
+ components remain unchanged.
109
+
110
+ Parameters
111
+ ----------
112
+ None
113
+
114
+ Returns
115
+ -------
116
+ None
117
+ This method does not return any value. The version is updated in-place in the file.
118
+
119
+ Raises
120
+ ------
121
+ FileNotFoundError
122
+ If the file containing the VERSION constant cannot be found.
123
+ IOError
124
+ If there is an error reading from or writing to the file.
125
+ """
126
+
127
+ # Get the file path where the VERSION constant is defined
128
+ # VERSION is imported from orionis.metadata.framework
129
+ import orionis.metadata.framework
130
+ filepath = Path(inspect.getfile(orionis.metadata.framework))
131
+ if not filepath.exists():
132
+ raise FileNotFoundError(f"VERSION file not found at {filepath}")
133
+
134
+ # Read all lines from the file
135
+ with open(filepath, 'r') as f:
136
+ lines = f.readlines()
137
+
138
+ # Prepare a list to hold the new lines
139
+ new_lines = []
140
+
141
+ # Regular expression to match the VERSION assignment line
142
+ pattern = re.compile(r'^(VERSION\s*=\s*["\'])(\d+)\.(\d+)\.(\d+)(["\'])')
143
+
144
+ # Iterate through each line in the file
145
+ for line in lines:
146
+ match = pattern.match(line)
147
+ if match:
148
+
149
+ # Extract major, minor, and patch numbers
150
+ major, minor, patch = int(match.group(2)), int(match.group(3)), int(match.group(4))
151
+
152
+ # Increment the minor version
153
+ minor += 1
154
+
155
+ # Construct the new version string
156
+ new_version = f'{match.group(1)}{major}.{minor}.{patch}{match.group(5)}'
157
+ new_lines.append(new_version + '\n')
158
+
159
+ else:
160
+
161
+ # Keep all other lines unchanged
162
+ new_lines.append(line)
163
+
164
+ # Write the updated lines back to the file
165
+ with open(filepath, 'w') as f:
166
+ f.writelines(new_lines)
167
+
168
+ # Print a message indicating the version has been bumped
169
+ self.__console.print(
170
+ Panel(
171
+ f"[green]📦 Bumped minor version to {VERSION}[/]",
172
+ border_style="green",
173
+ width=self.__with_console
174
+ )
175
+ )
176
+
177
+ def __gitPush(self):
178
+ """
179
+ Commits and pushes changes to the Git repository if there are modifications.
180
+
181
+ This method checks for uncommitted changes in the current project directory.
182
+ If changes are detected, it stages all modifications, commits them with a
183
+ message containing the current version, and pushes the commit to the remote
184
+ repository. If there are no changes, it logs a message indicating that no
185
+ commit or push is necessary.
186
+
187
+ Parameters
188
+ ----------
189
+ None
190
+
191
+ Returns
192
+ -------
193
+ None
194
+ This method does not return any value. All output is printed to the console.
195
+
196
+ Raises
197
+ ------
198
+ subprocess.CalledProcessError
199
+ If any of the subprocess calls to Git fail.
200
+ """
201
+
202
+ # Check the current Git status to see if there are modified files
203
+ git_status = subprocess.run(
204
+ ["git", "status", "--short"], capture_output=True, text=True, cwd=self.__project_root
205
+ )
206
+
207
+ # Check if the command was successful and if there are modified files
208
+ modified_files = git_status.stdout.strip()
209
+
210
+ # If there are modified files, proceed with staging and committing
211
+ if modified_files:
212
+
213
+ # Print the status of modified files
214
+ self.__console.print(
215
+ Panel(
216
+ "[cyan]📌 Staging files for commit...[/]",
217
+ border_style="cyan",
218
+ width=self.__with_console
219
+ )
220
+ )
221
+
222
+ # Stage all modified files
223
+ subprocess.run(
224
+ ["git", "add", "."], check=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, cwd=self.__project_root
225
+ )
226
+
227
+ # Commit the changes with a message
228
+ self.__console.print(
229
+ Panel(
230
+ f"[cyan]✅ Committing changes: [📦 Release version {VERSION}][/]",
231
+ border_style="cyan",
232
+ width=self.__with_console
233
+ )
234
+ )
235
+
236
+ # Wait for a short period to ensure the commit is registered
237
+ time.sleep(5)
238
+
239
+ subprocess.run(
240
+ ["git", "commit", "-m", f"📦 Release version {VERSION}"], check=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, cwd=self.__project_root
241
+ )
242
+ self.__console.print(
243
+ Panel(
244
+ "[cyan]🚀 Pushing changes to the remote repository...[/]",
245
+ border_style="cyan",
246
+ width=self.__with_console
247
+ )
248
+ )
249
+
250
+ # Push the changes to the remote repository
251
+ subprocess.run(
252
+ ["git", "push", "-f"], check=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, cwd=self.__project_root
253
+ )
254
+ self.__console.print(
255
+ Panel(
256
+ "[green]🌟 Git push completed![/]",
257
+ border_style="green",
258
+ width=self.__with_console
259
+ )
260
+ )
261
+
262
+ else:
263
+
264
+ self.__console.print(
265
+ Panel(
266
+ "[green]✅ No changes to commit.[/]",
267
+ border_style="green",
268
+ width=self.__with_console
269
+ )
270
+ )
271
+
272
+ def __build(self):
273
+ """
274
+ Builds the package distributions using `setup.py`.
275
+
276
+ This method compiles the package by invoking the `setup.py` script located
277
+ at the project root. It generates both source (`sdist`) and wheel (`bdist_wheel`)
278
+ distribution files, which are required for publishing the package to a repository.
279
+ If the `setup.py` file is not found, an error message is displayed and the build
280
+ process is aborted.
281
+
282
+ Parameters
283
+ ----------
284
+ None
285
+
286
+ Returns
287
+ -------
288
+ None
289
+ This method does not return any value. All output is printed to the console.
290
+
291
+ Raises
292
+ ------
293
+ subprocess.CalledProcessError
294
+ If the `setup.py` build command fails.
295
+ """
296
+
297
+ try:
298
+
299
+ # Notify the user that the build process is starting
300
+ self.__console.print(
301
+ Panel(
302
+ "[cyan]🛠️ Building the package...[/]",
303
+ border_style="cyan",
304
+ width=self.__with_console
305
+ )
306
+ )
307
+
308
+ # Define the path to the setup.py file in the project root
309
+ setup_path = self.__project_root / "setup.py"
310
+
311
+ # Check if setup.py exists in the project root
312
+ if not os.path.exists(setup_path):
313
+ self.__console.print(
314
+ Panel(
315
+ "[bold red]❌ Error: setup.py not found in the current execution directory.[/]",
316
+ border_style="red",
317
+ width=self.__with_console
318
+ )
319
+ )
320
+ return
321
+
322
+ # Run the setup.py script to build both sdist and wheel distributions
323
+ subprocess.run(
324
+ [sys.executable, "setup.py", "sdist", "bdist_wheel"],
325
+ check=True,
326
+ stdout=subprocess.DEVNULL,
327
+ stderr=subprocess.DEVNULL,
328
+ cwd=self.__project_root
329
+ )
330
+
331
+ # Notify the user that the build was successful
332
+ self.__console.print(
333
+ Panel(
334
+ "[green]✅ Build process completed successfully![/]",
335
+ border_style="green",
336
+ width=self.__with_console
337
+ )
338
+ )
339
+
340
+ except subprocess.CalledProcessError as e:
341
+
342
+ # Notify the user if the build process fails
343
+ self.__console.print(
344
+ Panel(
345
+ f"[bold red]❌ Build failed: {e}[/]",
346
+ border_style="red",
347
+ width=self.__with_console
348
+ )
349
+ )
350
+
351
+ def __publish(self):
352
+ """
353
+ Uploads the built package distributions to the PyPI repository using Twine.
354
+
355
+ This method locates the Twine executable (preferring the local virtual environment if available),
356
+ and uploads all distribution files from the `dist/` directory to PyPI using the authentication
357
+ token provided via the `PYPI_TOKEN` environment variable. If the token is missing, the process
358
+ is aborted and an error message is displayed. After a successful upload, the method cleans up
359
+ temporary Python bytecode files and `__pycache__` directories.
360
+
361
+ Parameters
362
+ ----------
363
+ None
364
+
365
+ Returns
366
+ -------
367
+ None
368
+ This method does not return any value. All output is printed to the console.
369
+
370
+ Raises
371
+ ------
372
+ subprocess.CalledProcessError
373
+ If the Twine upload or cleanup commands fail.
374
+ ValueError
375
+ If the PyPI token is not found in the environment variables.
376
+ """
377
+
378
+ # Get the PyPI token from environment variables
379
+ token = self.__token
380
+
381
+ # Check if the PyPI token is available
382
+ if not token:
383
+ self.__console.print(
384
+ Panel(
385
+ "[bold red]❌ Error: PyPI token not found in environment variables.[/]",
386
+ border_style="red",
387
+ width=self.__with_console
388
+ )
389
+ )
390
+ return
391
+
392
+ # Try to find 'twine' in the local virtual environment, otherwise use system PATH
393
+ venv_twine = self.__project_root / 'venv' / 'Scripts' / 'twine'
394
+ if venv_twine.exists():
395
+ twine_path = str(venv_twine.resolve())
396
+ else:
397
+ twine_path = 'twine'
398
+
399
+ # Notify user that the upload process is starting
400
+ self.__console.print(
401
+ Panel(
402
+ "[cyan]📤 Uploading package to PyPI...[/]",
403
+ border_style="cyan",
404
+ width=self.__with_console
405
+ )
406
+ )
407
+
408
+ # Upload the package distributions to PyPI using Twine
409
+ try:
410
+ subprocess.run(
411
+ [twine_path, "upload", "dist/*", "-u", "__token__", "-p", token],
412
+ check=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, cwd=self.__project_root
413
+ )
414
+ self.__console.print(
415
+ Panel(
416
+ "[green]✅ Package published successfully![/]",
417
+ border_style="green",
418
+ width=self.__with_console
419
+ )
420
+ )
421
+
422
+ # Print error message and exit if upload fails
423
+ except Exception as e:
424
+ self.__console.print(
425
+ Panel(
426
+ f"[bold red]🔴 Error uploading the package. Try changing the version and retry. Error: {e}[/]",
427
+ border_style="red",
428
+ width=self.__with_console
429
+ )
430
+ )
431
+ exit(1)
432
+
433
+ # Notify user that cleanup is starting
434
+ self.__console.print(
435
+ Panel(
436
+ "[cyan]🧹 Cleaning up temporary files...[/]",
437
+ border_style="cyan",
438
+ width=self.__with_console
439
+ )
440
+ )
441
+
442
+ # Remove all .pyc files and __pycache__ directories recursively
443
+ subprocess.run(
444
+ ["powershell", "-Command", "Get-ChildItem -Recurse -Filter *.pyc | Remove-Item; Get-ChildItem -Recurse -Filter __pycache__ | Remove-Item -Recurse"],
445
+ check=True, shell=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, cwd=self.__project_root
446
+ )
447
+
448
+ # Optionally, clear build artifacts (currently commented out)
449
+ self.__clearRepository()
450
+
451
+ # Notify user that the publishing process is complete
452
+ self.__console.print(
453
+ Panel(
454
+ f"[bold green]✅ Publishing process completed successfully![/]",
455
+ border_style="green",
456
+ width=self.__with_console
457
+ )
458
+ )
459
+ self.__console.print()
460
+
461
+ def __clearRepository(self):
462
+ """
463
+ Removes temporary build artifacts and metadata directories from the project root.
464
+
465
+ This method deletes the following directories if they exist:
466
+ - `build/`: Contains temporary build files generated during packaging.
467
+ - `dist/`: Contains distribution archives (e.g., .tar.gz, .whl) created by the build process.
468
+ - `orionis.egg-info/`: Contains package metadata generated by setuptools.
469
+
470
+ Parameters
471
+ ----------
472
+ None
473
+
474
+ Returns
475
+ -------
476
+ None
477
+ This method does not return any value. All output is printed to the console.
478
+
479
+ Raises
480
+ ------
481
+ PermissionError
482
+ If the method fails to delete any of the directories due to insufficient permissions.
483
+ Exception
484
+ If any other error occurs during the deletion process.
485
+ """
486
+
487
+ # List of directories to remove after publishing
488
+ folders = ["build", "dist", "orionis.egg-info"]
489
+
490
+ for folder in folders:
491
+ folder_path = self.__project_root / folder
492
+
493
+ # Check if the directory exists before attempting to remove it
494
+ if os.path.exists(folder_path):
495
+
496
+ # Recursively remove the directory and its contents
497
+ try:
498
+ shutil.rmtree(folder_path)
499
+
500
+ # Handle insufficient permissions error
501
+ except PermissionError:
502
+ self.__console.print(
503
+ Panel(
504
+ f"[bold red]❌ Error: Could not remove {folder_path} due to insufficient permissions.[/]",
505
+ border_style="red",
506
+ width=self.__with_console
507
+ )
508
+ )
509
+
510
+ # Handle any other exceptions that may occur
511
+ except Exception as e:
512
+ self.__console.print(
513
+ Panel(
514
+ f"[bold red]❌ Error removing {folder_path}: {str(e)}[/]",
515
+ border_style="red",
516
+ width=self.__with_console
517
+ )
518
+ )
519
+
520
+ def handle(self, reactor: IReactor) -> None:
521
+ """
522
+ Displays usage information and a list of available commands for the Orionis CLI.
523
+
524
+ Parameters
525
+ ----------
526
+ reactor : IReactor
527
+ The reactor instance providing command metadata via the `info()` method.
528
+
529
+ Returns
530
+ -------
531
+ None
532
+ This method does not return any value. It prints help information to the console.
533
+
534
+ Raises
535
+ ------
536
+ CLIOrionisRuntimeError
537
+ If an unexpected error occurs during help information generation or display.
538
+ """
539
+ try:
540
+
541
+ # Execute test suite
542
+ response: dict = reactor.call("test")
543
+
544
+ # Determinar si existieron errores en el test suite
545
+ failed = response.get("failed", 0)
546
+ errors = response.get("errors", 0)
547
+
548
+ # If there are any failed tests, print a warning message
549
+ if failed > 0 or errors > 0:
550
+ console = Console()
551
+ console.print(
552
+ Panel(
553
+ f"Tests failed: {failed}, Errors: {errors}",
554
+ title="Test Suite Results",
555
+ style="bold red"
556
+ )
557
+ )
558
+
559
+ # If there are failed tests, we do not proceed with the publishing
560
+ return
561
+
562
+ # Bump the minor version number
563
+ self.__bumpMinorVersion()
564
+
565
+ # Push changes to Git
566
+ self.__gitPush()
567
+
568
+ # Build the package
569
+ self.__build()
570
+
571
+ # Publish the package to PyPI
572
+ self.__publish()
573
+
574
+ except Exception as e:
575
+
576
+ # Raise a custom runtime error if any exception occurs
577
+ raise CLIOrionisRuntimeError(f"An unexpected error occurred: {e}") from e
@@ -26,7 +26,7 @@ class TestCommand(BaseCommand):
26
26
  # Command description
27
27
  description: str = "Executes all automated tests using the configured test kernel for the Orionis application."
28
28
 
29
- def handle(self) -> None:
29
+ def handle(self) -> dict:
30
30
  """
31
31
  Executes the test command for the Orionis CLI.
32
32
 
@@ -36,9 +36,8 @@ class TestCommand(BaseCommand):
36
36
 
37
37
  Returns
38
38
  -------
39
- None
40
- This method does not return any value. It performs actions as a side effect,
41
- such as running the test suite and handling exceptions.
39
+ dict
40
+ The result of the test execution, typically containing test results or status.
42
41
 
43
42
  Raises
44
43
  ------
@@ -54,7 +53,7 @@ class TestCommand(BaseCommand):
54
53
  kernel: ITestKernel = app.make(ITestKernel)
55
54
 
56
55
  # Run the test suite using the kernel's handle method
57
- kernel.handle()
56
+ return kernel.handle()
58
57
 
59
58
  except Exception as e:
60
59
 
@@ -27,7 +27,7 @@ class VersionCommand(BaseCommand):
27
27
  # Command description
28
28
  description: str = "Displays the current Orionis framework version and metadata, including author, Python requirements, documentation, and repository links."
29
29
 
30
- def handle(self) -> None:
30
+ def handle(self) -> str:
31
31
  """
32
32
  Executes the version command to display the current Orionis framework version and metadata.
33
33
 
@@ -41,9 +41,8 @@ class VersionCommand(BaseCommand):
41
41
 
42
42
  Returns
43
43
  -------
44
- None
45
- This method does not return any value. It outputs the version and metadata information
46
- to the console using rich formatting.
44
+ str
45
+ The current version of the Orionis framework.
47
46
 
48
47
  Raises
49
48
  ------
@@ -82,6 +81,10 @@ class VersionCommand(BaseCommand):
82
81
  console.print(panel)
83
82
  console.line()
84
83
 
84
+ # Return the framework version for potential further use
85
+ return framework.VERSION
86
+
85
87
  except Exception as e:
88
+
86
89
  # Raise a custom runtime error if any exception occurs
87
90
  raise CLIOrionisRuntimeError(f"An unexpected error occurred: {e}") from e
@@ -0,0 +1,4 @@
1
+ from abc import ABC, abstractmethod
2
+
3
+ class ISchedule(ABC):
4
+ pass
@@ -103,12 +103,14 @@ class Reactor(IReactor):
103
103
  from orionis.console.commands.version import VersionCommand
104
104
  from orionis.console.commands.help import HelpCommand
105
105
  from orionis.console.commands.test import TestCommand
106
+ from orionis.console.commands.publisher import PublisherCommand
106
107
 
107
108
  # List of core command classes to load (extend this list as more core commands are added)
108
109
  core_commands = [
109
110
  VersionCommand,
110
111
  HelpCommand,
111
- TestCommand
112
+ TestCommand,
113
+ PublisherCommand
112
114
  ]
113
115
 
114
116
  # Iterate through the core command classes and register them
@@ -116,7 +118,7 @@ class Reactor(IReactor):
116
118
 
117
119
  # Validate and extract required command attributes
118
120
  timestamp = self.__ensureTimestamps(obj)
119
- signature = self.__ensureSignature(obj)
121
+ signature = getattr(obj, 'signature', None)
120
122
  description = self.__ensureDescription(obj)
121
123
  args = self.__ensureArguments(obj)
122
124
 
@@ -415,14 +417,26 @@ class Reactor(IReactor):
415
417
 
416
418
  # Prepare a list to hold command information
417
419
  commands_info = []
420
+
421
+ # Iterate through all registered commands in the internal registry
418
422
  for command in self.__commands.values():
423
+
424
+ # Extract command metadata
425
+ signature:str = command.get("signature")
426
+ description:str = command.get("description", "")
427
+
428
+ # Skip internal commands (those with double underscores)
429
+ if signature.startswith('__') and signature.endswith('__'):
430
+ continue
431
+
432
+ # Append command information to the list
419
433
  commands_info.append({
420
- "signature": command.get("signature"),
421
- "description": command.get("description"),
434
+ "signature": signature,
435
+ "description": description
422
436
  })
423
437
 
424
438
  # Return the sorted list of command information by signature
425
- return sorted(commands_info, key=lambda x: x["signature"].lower())
439
+ return sorted(commands_info, key=lambda x: x['signature'])
426
440
 
427
441
  def call(
428
442
  self,
File without changes
@@ -0,0 +1,4 @@
1
+ class Schedule:
2
+
3
+ def __init__(self):
4
+ self.tasks = []
@@ -5,7 +5,7 @@
5
5
  NAME = "orionis"
6
6
 
7
7
  # Current version of the framework
8
- VERSION = "0.460.0"
8
+ VERSION = "0.463.0"
9
9
 
10
10
  # Full name of the author or maintainer of the project
11
11
  AUTHOR = "Raul Mauricio Uñate Castro"
@@ -0,0 +1,22 @@
1
+ from orionis.container.facades.facade import Facade
2
+
3
+ class Reactor(Facade):
4
+
5
+ @classmethod
6
+ def getFacadeAccessor(cls) -> str:
7
+ """
8
+ Get the registered name of the component.
9
+
10
+ This method returns the service container binding key that identifies
11
+ the testing component implementation. The facade uses this key to
12
+ resolve the appropriate testing service from the container when
13
+ static methods are called on the facade.
14
+
15
+ Returns
16
+ -------
17
+ str
18
+ The service container binding key "x-orionis.console.core.reactor"
19
+ used to resolve the testing component implementation.
20
+ """
21
+
22
+ return "x-orionis.console.core.reactor"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: orionis
3
- Version: 0.460.0
3
+ Version: 0.463.0
4
4
  Summary: Orionis Framework – Elegant, Fast, and Powerful.
5
5
  Home-page: https://github.com/orionis-framework/framework
6
6
  Author: Raul Mauricio Uñate Castro
@@ -11,14 +11,16 @@ orionis/console/base/command.py,sha256=nasVPyKEvuv8sDFEWXhHyBCWAmSLfPPm2XlKaYYt_
11
11
  orionis/console/base/contracts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
12
  orionis/console/base/contracts/command.py,sha256=vmAJD0yMQ5-AD_s9_xCFEAl64sKk65z7U2E196dALQM,5760
13
13
  orionis/console/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
- orionis/console/commands/help.py,sha256=q8UlSm1kKspl391oRWmt0DZFJHE1mp358Fv8wyWFcsE,3072
15
- orionis/console/commands/test.py,sha256=yw5Cvi5YQdnUM3o33HYnphT_rKLIvP3W8ow1xhUY1-4,2188
16
- orionis/console/commands/version.py,sha256=RhON-KZt8bJfMcFTk3MB9aQgRnG7ZghD4f5gX9z81Ps,3640
14
+ orionis/console/commands/help.py,sha256=ooPoenP08ArMAWiL89_oUGD9l1Faen2QjLTG90i4zCQ,3187
15
+ orionis/console/commands/publisher.py,sha256=FUg-EUzK7LLXsla10ZUZro8V0Z5S-KjmsaSdRHSSGbA,21381
16
+ orionis/console/commands/test.py,sha256=mWPB_m_nUrsakCT1N6fcCBYU9mYj1IC39n3ICbQp8SQ,2128
17
+ orionis/console/commands/version.py,sha256=SUuNDJ40f2uq69OQUmPQXJKaa9Bm_iVRDPmBd7zc1Yc,3658
17
18
  orionis/console/contracts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
19
  orionis/console/contracts/kernel.py,sha256=mh4LlhEYHh3FuGZZQ0GBhD6ZLa5YQvaNj2r01IIHI5Y,826
19
20
  orionis/console/contracts/reactor.py,sha256=GGhWSNYBE6E_W3HNEi4kjiDwqohsa-nnwJfoC1nJPM8,1998
21
+ orionis/console/contracts/schedule.py,sha256=A7yYPjPmRizDHOR9k4qvY3NuRPrWBmNuQs6ENGXWtBs,70
20
22
  orionis/console/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
- orionis/console/core/reactor.py,sha256=XTgQZyi9Z2epYPOlFc05wXaX_69-fL8GEobIN2UkZsE,22825
23
+ orionis/console/core/reactor.py,sha256=WDp6sfMR5tpjDoXxPNHn8CpX_IFmqY4hOxofWGOVREg,23357
22
24
  orionis/console/dumper/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
25
  orionis/console/dumper/dump.py,sha256=CATERiQ6XuIrKQsDaWcVxzTtlAJI9qLJX44fQxEX8ws,22443
24
26
  orionis/console/dumper/contracts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -40,6 +42,8 @@ orionis/console/output/contracts/console.py,sha256=phaQhCLWa81MLzB5ydOSaUfEIdDq7
40
42
  orionis/console/output/contracts/executor.py,sha256=7l3kwnvv6GlH9EYk0v94YE1olex_-mvgyRDAqZvvYrQ,4254
41
43
  orionis/console/output/enums/__init__.py,sha256=LAaAxg-DpArCjf_jqZ0_9s3p8899gntDYkSU_ppTdC8,66
42
44
  orionis/console/output/enums/styles.py,sha256=6a4oQCOBOKMh2ARdeq5GlIskJ3wjiylYmh66tUKKmpQ,4053
45
+ orionis/console/tasks/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
46
+ orionis/console/tasks/schedule.py,sha256=egNIfL-sNUIXPtYGM2qdHK10WxZIwrPdNNy4kr4fkwo,67
43
47
  orionis/container/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
44
48
  orionis/container/container.py,sha256=MmvFm0Y-x667mIYPunmBnHzQHBsWJObT5_zuWrgqaWU,80528
45
49
  orionis/container/context/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -184,7 +188,7 @@ orionis/foundation/providers/reactor_provider.py,sha256=P0KQcp4AFKTrD6BStGfCTqhG
184
188
  orionis/foundation/providers/testing_provider.py,sha256=SrJRpdvcblx9WvX7x9Y3zc7OQfiTf7la0HAJrm2ESlE,3725
185
189
  orionis/foundation/providers/workers_provider.py,sha256=oa_2NIDH6UxZrtuGkkoo_zEoNIMGgJ46vg5CCgAm7wI,3926
186
190
  orionis/metadata/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
187
- orionis/metadata/framework.py,sha256=0PF-xadVQmg1GOQI54wxR7uPM9jc_FB2x0bKKHxOR-w,4088
191
+ orionis/metadata/framework.py,sha256=WO2w62AAh3yxysXPQDWI-aoUuRqpJhDdEm02Mcyosrc,4088
188
192
  orionis/metadata/package.py,sha256=k7Yriyp5aUcR-iR8SK2ec_lf0_Cyc-C7JczgXa-I67w,16039
189
193
  orionis/services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
190
194
  orionis/services/asynchrony/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -282,6 +286,7 @@ orionis/support/facades/executor.py,sha256=fRBQ447WpL2T42Ys02k_DJNqukFFk8-bbNFz4
282
286
  orionis/support/facades/inspire.py,sha256=n7TFhxneqUtEJYQSrOdmNq9XQzhFMMsIAfdwnBWR1hA,841
283
287
  orionis/support/facades/logger.py,sha256=Ncrd_bcggEOnWfLmvGjYTnFgO_Hop2iO9di1oWqH0Ow,824
284
288
  orionis/support/facades/progress_bar.py,sha256=eTxfGIAfdkrXkycvdQBddn9E4MIlbCLOU7TDO2-7cgU,717
289
+ orionis/support/facades/reactor.py,sha256=CJwyUU-MC1LqwiHji7f7gSm2XAs8_DdhbOXmTylNt70,742
285
290
  orionis/support/facades/testing.py,sha256=5tzFIMSe1gxLcs7dcueUnAdTJ977czd2sNK1RtUjSUM,737
286
291
  orionis/support/facades/workers.py,sha256=3kRK7TogGTHpdeHEW13Q1tQIlpXwXAmS93JIsAvYRcw,717
287
292
  orionis/support/formatter/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -349,7 +354,7 @@ orionis/test/validators/web_report.py,sha256=n9BfzOZz6aEiNTypXcwuWbFRG0OdHNSmCNu
349
354
  orionis/test/validators/workers.py,sha256=rWcdRexINNEmGaO7mnc1MKUxkHKxrTsVuHgbnIfJYgc,1206
350
355
  orionis/test/view/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
351
356
  orionis/test/view/render.py,sha256=f-zNhtKSg9R5Njqujbg2l2amAs2-mRVESneLIkWOZjU,4082
352
- orionis-0.460.0.dist-info/licenses/LICENCE,sha256=JhC-z_9mbpUrCfPjcl3DhDA8trNDMzb57cvRSam1avc,1463
357
+ orionis-0.463.0.dist-info/licenses/LICENCE,sha256=JhC-z_9mbpUrCfPjcl3DhDA8trNDMzb57cvRSam1avc,1463
353
358
  tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
354
359
  tests/container/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
355
360
  tests/container/context/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -492,8 +497,8 @@ tests/testing/validators/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZ
492
497
  tests/testing/validators/test_testing_validators.py,sha256=WPo5GxTP6xE-Dw3X1vZoqOMpb6HhokjNSbgDsDRDvy4,16588
493
498
  tests/testing/view/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
494
499
  tests/testing/view/test_render.py,sha256=tnnMBwS0iKUIbogLvu-7Rii50G6Koddp3XT4wgdFEYM,1050
495
- orionis-0.460.0.dist-info/METADATA,sha256=kMihwp0zpZKD5J9NVo-O4_TBkIozgsQ9R4ksn9-5WnE,4772
496
- orionis-0.460.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
497
- orionis-0.460.0.dist-info/top_level.txt,sha256=2bdoHgyGZhOtLAXS6Om8OCTmL24dUMC_L1quMe_ETbk,14
498
- orionis-0.460.0.dist-info/zip-safe,sha256=frcCV1k9oG9oKj3dpUqdJg1PxRT2RSN_XKdLCPjaYaY,2
499
- orionis-0.460.0.dist-info/RECORD,,
500
+ orionis-0.463.0.dist-info/METADATA,sha256=aPxvy48KCjFLfuzFKrU4jKuQdSbIfoq7RqbaOyMN4Wc,4772
501
+ orionis-0.463.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
502
+ orionis-0.463.0.dist-info/top_level.txt,sha256=2bdoHgyGZhOtLAXS6Om8OCTmL24dUMC_L1quMe_ETbk,14
503
+ orionis-0.463.0.dist-info/zip-safe,sha256=frcCV1k9oG9oKj3dpUqdJg1PxRT2RSN_XKdLCPjaYaY,2
504
+ orionis-0.463.0.dist-info/RECORD,,