|
| 1 | +""" |
| 2 | +This module contains tree initialization, larger branches creation |
| 3 | +and utility functions to run or inspect the tree. |
| 4 | +""" |
| 5 | + |
1 | 6 | import asyncio |
2 | 7 | import logging |
3 | 8 | import os |
|
50 | 55 | logger = logging.getLogger(__name__) |
51 | 56 |
|
52 | 57 |
|
53 | | -class TreeInspector: |
54 | | - """Inspector for creating and inspecting behavior tree branches and PPAs.""" |
55 | | - |
56 | | - # List of available branch/PPA names |
57 | | - AVAILABLE_NAMES = [ |
58 | | - "workflow_success", |
59 | | - "workflow_completion", |
60 | | - "find_workflow", |
61 | | - "trigger_workflow", |
62 | | - "identify_target_ref", |
63 | | - "download_artifacts", |
64 | | - "extract_artifact_result", |
65 | | - "workflow_complete_branch", |
66 | | - "workflow_with_result_branch", |
67 | | - "publish_workflow_branch", |
68 | | - "build_workflow_branch", |
69 | | - "demo_sequence", |
70 | | - "demo_selector", |
71 | | - ] |
72 | | - |
73 | | - def __init__(self, release_tag: str): |
74 | | - """Initialize TreeInspector. |
75 | | -
|
76 | | - Args: |
77 | | - release_tag: Release tag for creating mock ReleaseMeta |
78 | | - """ |
79 | | - self.release_tag = release_tag |
80 | | - |
81 | | - def get_names(self) -> List[str]: |
82 | | - """Get list of available branch/PPA names. |
83 | | -
|
84 | | - Returns: |
85 | | - List of available names that can be passed to create_by_name() |
86 | | - """ |
87 | | - return self.AVAILABLE_NAMES.copy() |
88 | | - |
89 | | - def create_by_name(self, name: str) -> Union[Selector, Sequence, Behaviour]: |
90 | | - """Create a branch or PPA by name. |
91 | | -
|
92 | | - Args: |
93 | | - name: Name of the branch or PPA to create |
94 | | -
|
95 | | - Returns: |
96 | | - The created behavior tree branch or PPA |
97 | | -
|
98 | | - Raises: |
99 | | - ValueError: If the name is not found in the available branches |
100 | | - """ |
101 | | - if name not in self.AVAILABLE_NAMES: |
102 | | - available = ", ".join(self.get_names()) |
103 | | - raise ValueError(f"Unknown name '{name}'. Available options: {available}") |
104 | | - |
105 | | - # Create mock objects for PPA/branch creation |
106 | | - workflow = Workflow(workflow_file="test.yml", inputs={}) |
107 | | - package_meta = PackageMeta(repo="redis/redis", ref="main") |
108 | | - release_meta = ReleaseMeta(tag=self.release_tag) |
109 | | - github_client = GitHubClientAsync(token="dummy") |
110 | | - package = Package( |
111 | | - meta=package_meta, |
112 | | - build=workflow, |
113 | | - publish=Workflow(workflow_file="publish.yml", inputs={}), |
114 | | - ) |
115 | | - log_prefix = "test" |
116 | | - |
117 | | - # Create and return the requested branch/PPA |
118 | | - if name == "workflow_success": |
119 | | - return create_workflow_success_ppa(workflow, log_prefix) |
120 | | - elif name == "workflow_completion": |
121 | | - return create_workflow_completion_ppa( |
122 | | - workflow, package_meta, github_client, log_prefix |
123 | | - ) |
124 | | - elif name == "find_workflow": |
125 | | - return create_find_workflow_by_uuid_ppa( |
126 | | - workflow, package_meta, github_client, log_prefix |
127 | | - ) |
128 | | - elif name == "trigger_workflow": |
129 | | - return create_trigger_workflow_ppa( |
130 | | - workflow, package_meta, release_meta, github_client, log_prefix |
131 | | - ) |
132 | | - elif name == "identify_target_ref": |
133 | | - return create_identify_target_ref_ppa( |
134 | | - package_meta, release_meta, github_client, log_prefix |
135 | | - ) |
136 | | - elif name == "download_artifacts": |
137 | | - return create_download_artifacts_ppa( |
138 | | - workflow, package_meta, github_client, log_prefix |
139 | | - ) |
140 | | - elif name == "extract_artifact_result": |
141 | | - return create_extract_artifact_result_ppa( |
142 | | - "test-artifact", workflow, package_meta, github_client, log_prefix |
143 | | - ) |
144 | | - elif name == "workflow_complete_branch": |
145 | | - return create_workflow_complete_tree_branch( |
146 | | - workflow, package_meta, release_meta, github_client, "" |
147 | | - ) |
148 | | - elif name == "workflow_with_result_branch": |
149 | | - return create_workflow_with_result_tree_branch( |
150 | | - "artifact", workflow, package_meta, release_meta, github_client, "" |
151 | | - ) |
152 | | - elif name == "publish_workflow_branch": |
153 | | - return create_publish_workflow_tree_branch( |
154 | | - workflow, |
155 | | - workflow, |
156 | | - package_meta, |
157 | | - release_meta, |
158 | | - workflow, |
159 | | - github_client, |
160 | | - "", |
161 | | - ) |
162 | | - elif name == "build_workflow_branch": |
163 | | - return create_build_workflow_tree_branch( |
164 | | - package, release_meta, package, github_client, "" |
165 | | - ) |
166 | | - elif name == "demo_sequence": |
167 | | - return create_sequence_branch() |
168 | | - else: # name == "demo_selector" |
169 | | - return create_selector_branch() |
170 | | - |
171 | | - |
172 | 58 | async def async_tick_tock(tree: BehaviourTree, cutoff: int = 100) -> None: |
173 | 59 | """Drive Behaviour tree using async event loop |
174 | 60 |
|
@@ -244,8 +130,10 @@ def initialize_tree_and_state( |
244 | 130 | tree.add_post_tick_handler(lambda _: state_syncer.sync()) |
245 | 131 | tree.add_post_tick_handler(log_tree_state_with_markup) |
246 | 132 |
|
247 | | - yield (tree, state_syncer) |
248 | | - print_state_table(state_syncer.state) |
| 133 | + try: |
| 134 | + yield (tree, state_syncer) |
| 135 | + finally: |
| 136 | + print_state_table(state_syncer.state) |
249 | 137 |
|
250 | 138 |
|
251 | 139 | def log_tree_state_with_markup(tree: BehaviourTree) -> None: |
@@ -536,6 +424,125 @@ def create_extract_result_tree_branch( |
536 | 424 | return extract_artifact_result |
537 | 425 |
|
538 | 426 |
|
| 427 | +class TreeInspector: |
| 428 | + """Inspector for creating and inspecting behavior tree branches and PPAs.""" |
| 429 | + |
| 430 | + # List of available branch/PPA names |
| 431 | + AVAILABLE_NAMES = [ |
| 432 | + "workflow_success", |
| 433 | + "workflow_completion", |
| 434 | + "find_workflow", |
| 435 | + "trigger_workflow", |
| 436 | + "identify_target_ref", |
| 437 | + "download_artifacts", |
| 438 | + "extract_artifact_result", |
| 439 | + "workflow_complete_branch", |
| 440 | + "workflow_with_result_branch", |
| 441 | + "publish_workflow_branch", |
| 442 | + "build_workflow_branch", |
| 443 | + "demo_sequence", |
| 444 | + "demo_selector", |
| 445 | + ] |
| 446 | + |
| 447 | + def __init__(self, release_tag: str): |
| 448 | + """Initialize TreeInspector. |
| 449 | +
|
| 450 | + Args: |
| 451 | + release_tag: Release tag for creating mock ReleaseMeta |
| 452 | + """ |
| 453 | + self.release_tag = release_tag |
| 454 | + |
| 455 | + def get_names(self) -> List[str]: |
| 456 | + """Get list of available branch/PPA names. |
| 457 | +
|
| 458 | + Returns: |
| 459 | + List of available names that can be passed to create_by_name() |
| 460 | + """ |
| 461 | + return self.AVAILABLE_NAMES.copy() |
| 462 | + |
| 463 | + def create_by_name(self, name: str) -> Union[Selector, Sequence, Behaviour]: |
| 464 | + """Create a branch or PPA by name. |
| 465 | +
|
| 466 | + Args: |
| 467 | + name: Name of the branch or PPA to create |
| 468 | +
|
| 469 | + Returns: |
| 470 | + The created behavior tree branch or PPA |
| 471 | +
|
| 472 | + Raises: |
| 473 | + ValueError: If the name is not found in the available branches |
| 474 | + """ |
| 475 | + if name not in self.AVAILABLE_NAMES: |
| 476 | + available = ", ".join(self.get_names()) |
| 477 | + raise ValueError(f"Unknown name '{name}'. Available options: {available}") |
| 478 | + |
| 479 | + # Create mock objects for PPA/branch creation |
| 480 | + workflow = Workflow(workflow_file="test.yml", inputs={}) |
| 481 | + package_meta = PackageMeta(repo="redis/redis", ref="main") |
| 482 | + release_meta = ReleaseMeta(tag=self.release_tag) |
| 483 | + github_client = GitHubClientAsync(token="dummy") |
| 484 | + package = Package( |
| 485 | + meta=package_meta, |
| 486 | + build=workflow, |
| 487 | + publish=Workflow(workflow_file="publish.yml", inputs={}), |
| 488 | + ) |
| 489 | + log_prefix = "test" |
| 490 | + |
| 491 | + # Create and return the requested branch/PPA |
| 492 | + if name == "workflow_success": |
| 493 | + return create_workflow_success_ppa(workflow, log_prefix) |
| 494 | + elif name == "workflow_completion": |
| 495 | + return create_workflow_completion_ppa( |
| 496 | + workflow, package_meta, github_client, log_prefix |
| 497 | + ) |
| 498 | + elif name == "find_workflow": |
| 499 | + return create_find_workflow_by_uuid_ppa( |
| 500 | + workflow, package_meta, github_client, log_prefix |
| 501 | + ) |
| 502 | + elif name == "trigger_workflow": |
| 503 | + return create_trigger_workflow_ppa( |
| 504 | + workflow, package_meta, release_meta, github_client, log_prefix |
| 505 | + ) |
| 506 | + elif name == "identify_target_ref": |
| 507 | + return create_identify_target_ref_ppa( |
| 508 | + package_meta, release_meta, github_client, log_prefix |
| 509 | + ) |
| 510 | + elif name == "download_artifacts": |
| 511 | + return create_download_artifacts_ppa( |
| 512 | + workflow, package_meta, github_client, log_prefix |
| 513 | + ) |
| 514 | + elif name == "extract_artifact_result": |
| 515 | + return create_extract_artifact_result_ppa( |
| 516 | + "test-artifact", workflow, package_meta, github_client, log_prefix |
| 517 | + ) |
| 518 | + elif name == "workflow_complete_branch": |
| 519 | + return create_workflow_complete_tree_branch( |
| 520 | + workflow, package_meta, release_meta, github_client, "" |
| 521 | + ) |
| 522 | + elif name == "workflow_with_result_branch": |
| 523 | + return create_workflow_with_result_tree_branch( |
| 524 | + "artifact", workflow, package_meta, release_meta, github_client, "" |
| 525 | + ) |
| 526 | + elif name == "publish_workflow_branch": |
| 527 | + return create_publish_workflow_tree_branch( |
| 528 | + workflow, |
| 529 | + workflow, |
| 530 | + package_meta, |
| 531 | + release_meta, |
| 532 | + workflow, |
| 533 | + github_client, |
| 534 | + "", |
| 535 | + ) |
| 536 | + elif name == "build_workflow_branch": |
| 537 | + return create_build_workflow_tree_branch( |
| 538 | + package, release_meta, package, github_client, "" |
| 539 | + ) |
| 540 | + elif name == "demo_sequence": |
| 541 | + return create_sequence_branch() |
| 542 | + else: # name == "demo_selector" |
| 543 | + return create_selector_branch() |
| 544 | + |
| 545 | + |
539 | 546 | ### Demo ### |
540 | 547 |
|
541 | 548 |
|
|
0 commit comments