Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 29 additions & 0 deletions .githooks/no-nexus.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
#! /usr/bin/env bash

# This script ensures that the poetry.lock file does not contain references to the internal Indeed Nexus PyPI repository.
# It is used as a git hook to automatically remove the [package.source] section for Nexus from poetry.lock.
# This is necessary to ensure the lock file is portable and open-source friendly.
# The script uses gsed to remove the Nexus source block and any resulting empty lines, then checks if any changes were made.
# If Nexus references are found and removed, the script exits with 1 to prevent the commit, so we can stage the changes made by the script before committing again.

gsed -i'' \
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@N-give I did have to use gsed in the end here. The output of the script locally was different than the one in the CI, gsed fixes that: https://github.com/indeedeng/iwf-python-sdk/actions/runs/15640692181/job/44067031610

I'll create a quick PR to update it in the samples repo too

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I can't follow the functions so I used LLM to explain them

could you add a comment at the top of the file to explain why we need it and what it is doing?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added now:

# This script ensures that the poetry.lock file does not contain references to the internal Indeed Nexus PyPI repository.
# It is used as a git hook to automatically remove the [package.source] section for Nexus from poetry.lock.
# This is necessary to ensure the lock file is portable and open-source friendly.
# The script uses gsed to remove the Nexus source block and any resulting empty lines, then checks if any changes were made.
# If Nexus references are found and removed, the script exits with 1 to prevent the commit, so we can stage the changes made by the script before committing again.

-e '/./{H;$!d}' \
-e 'x' \
-e 's|\[package.source\]\ntype\s*=\s*\"legacy\"\nurl\s*=\s*\"https://nexus.corp.indeed.com/repository/pypi/simple\"\nreference\s*=\s*\"nexus\"||' \
poetry.lock

gsed -i'' \
-e '1{/^\s*$/d}' \
poetry.lock

gsed -i'' \
-e '/^\s*$/N;/^\s*\n$/D' \
poetry.lock

CHANGES=$(git diff --exit-code poetry.lock | grep -Pzo '\-\[package.source\]\n\-type = "legacy"\n\-url = "https://nexus.corp.indeed.com/repository/pypi/simple"\n\-reference = "nexus"\n' | wc -c)

if [[ $CHANGES -eq 0 ]]; then
exit 0
fi

exit 1
6 changes: 6 additions & 0 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -48,3 +48,9 @@ repos:
pass_filenames: false
args:
- "iwf"

- id: no-nexus
name: Remove nexus references
entry: .githooks/no-nexus.sh
language: script
types: [file] # Example: run on all files, adjust as needed
2 changes: 1 addition & 1 deletion iwf-idl
Submodule iwf-idl updated 2 files
+3 −1 iwf-sdk.yaml
+2 −0 iwf.yaml
12 changes: 10 additions & 2 deletions iwf/command_results.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import typing
from dataclasses import dataclass
from typing import Any, Union
from typing import Any, Union, Optional

from iwf.errors import WorkflowDefinitionError, NotRegisteredError
from iwf.iwf_api.models import (
Expand Down Expand Up @@ -40,6 +40,7 @@ class CommandResults:
timer_commands: list[TimerCommandResult]
internal_channel_commands: list[InternalChannelCommandResult]
signal_channel_commands: list[SignalChannelCommandResult]
wait_until_api_succeeded: Optional[bool] = None
Copy link
Member Author

@samuel27m samuel27m Jun 13, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I added this to match the properties in the CommandResults class in Java SDK: https://github.com/indeedeng/iwf-java-sdk/blob/main/src/main/java/io/iworkflow/core/command/CommandResults.java#L17-L23

And to be able to also implement the same exact logic using wait_until_api_succeeded



def from_idl_command_results(
Expand All @@ -48,9 +49,10 @@ def from_idl_command_results(
signal_channel_types: dict[str, typing.Optional[type]],
object_encoder: ObjectEncoder,
) -> CommandResults:
results = CommandResults(list(), list(), list())
results = CommandResults(list(), list(), list(), None)
if isinstance(idl_results, Unset):
return results

if not isinstance(idl_results.timer_results, Unset):
for timer in idl_results.timer_results:
results.timer_commands.append(
Expand Down Expand Up @@ -91,4 +93,10 @@ def from_idl_command_results(
sig.command_id,
)
)

if not isinstance(idl_results.state_wait_until_failed, Unset):
# The server will set state_wait_until_failed to true if the waitUntil API failed.
# Hence, flag inversion is needed here to indicate that the waitUntil API succeeded.
results.wait_until_api_succeeded = not idl_results.state_wait_until_failed

return results
9 changes: 9 additions & 0 deletions iwf/iwf_api/models/command_results.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,14 @@ class CommandResults:
inter_state_channel_results (Union[Unset, list['InterStateChannelResult']]):
timer_results (Union[Unset, list['TimerResult']]):
state_start_api_succeeded (Union[Unset, bool]):
state_wait_until_failed (Union[Unset, bool]):
"""

signal_results: Union[Unset, list["SignalResult"]] = UNSET
inter_state_channel_results: Union[Unset, list["InterStateChannelResult"]] = UNSET
timer_results: Union[Unset, list["TimerResult"]] = UNSET
state_start_api_succeeded: Union[Unset, bool] = UNSET
state_wait_until_failed: Union[Unset, bool] = UNSET
additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)

def to_dict(self) -> dict[str, Any]:
Expand All @@ -55,6 +57,8 @@ def to_dict(self) -> dict[str, Any]:

state_start_api_succeeded = self.state_start_api_succeeded

state_wait_until_failed = self.state_wait_until_failed

field_dict: dict[str, Any] = {}
field_dict.update(self.additional_properties)
field_dict.update({})
Expand All @@ -66,6 +70,8 @@ def to_dict(self) -> dict[str, Any]:
field_dict["timerResults"] = timer_results
if state_start_api_succeeded is not UNSET:
field_dict["stateStartApiSucceeded"] = state_start_api_succeeded
if state_wait_until_failed is not UNSET:
field_dict["stateWaitUntilFailed"] = state_wait_until_failed

return field_dict

Expand Down Expand Up @@ -99,11 +105,14 @@ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:

state_start_api_succeeded = d.pop("stateStartApiSucceeded", UNSET)

state_wait_until_failed = d.pop("stateWaitUntilFailed", UNSET)

command_results = cls(
signal_results=signal_results,
inter_state_channel_results=inter_state_channel_results,
timer_results=timer_results,
state_start_api_succeeded=state_start_api_succeeded,
state_wait_until_failed=state_wait_until_failed,
)

command_results.additional_properties = d
Expand Down