Skip to content

Commit f025acd

Browse files
authored
Merge pull request #69 from nforro/tools
Add `set_zstream_release` tool
2 parents 671f209 + f52250f commit f025acd

File tree

2 files changed

+74
-0
lines changed

2 files changed

+74
-0
lines changed

beeai/agents/tests/unit/test_tools.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
AddChangelogEntryToolInput,
1414
BumpReleaseTool,
1515
BumpReleaseToolInput,
16+
SetZStreamReleaseTool,
17+
SetZStreamReleaseToolInput,
1618
)
1719

1820

@@ -111,3 +113,39 @@ async def test_bump_release(minimal_spec):
111113
result = output.result
112114
assert not result
113115
assert minimal_spec.read_text().splitlines()[3] == "Release: 3%{?dist}"
116+
117+
118+
@pytest.fixture
119+
def autorelease_spec(tmp_path):
120+
spec = tmp_path / "test.spec"
121+
spec.write_text(
122+
dedent(
123+
"""
124+
Name: test
125+
Version: 0.1
126+
Release: %autorelease
127+
Summary: Test package
128+
129+
License: MIT
130+
131+
%description
132+
Test package
133+
134+
%changelog
135+
%autochangelog
136+
"""
137+
)
138+
)
139+
return spec
140+
141+
142+
@pytest.mark.asyncio
143+
async def test_set_zstream_release(autorelease_spec):
144+
latest_ystream_evr = "0.1-4.el10"
145+
tool = SetZStreamReleaseTool()
146+
output = await tool.run(
147+
input=SetZStreamReleaseToolInput(spec=autorelease_spec, latest_ystream_evr=latest_ystream_evr)
148+
).middleware(GlobalTrajectoryMiddleware(pretty=True))
149+
result = output.result
150+
assert not result
151+
assert autorelease_spec.read_text().splitlines()[3] == "Release: 4%{?dist}.%{autorelease -n}"

beeai/agents/tools/specfile.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
from pydantic import BaseModel, Field
66
from specfile import Specfile
7+
from specfile.utils import EVR
78

89
from beeai_framework.context import RunContext
910
from beeai_framework.emitter import Emitter
@@ -77,3 +78,38 @@ async def _run(
7778
except Exception as e:
7879
return StringToolOutput(result=f"Failed to bump release: {e}")
7980
return StringToolOutput()
81+
82+
83+
class SetZStreamReleaseToolInput(BaseModel):
84+
spec: Path = Field(description="Absolute path to a spec file")
85+
latest_ystream_evr: str = Field(description="EVR (Epoch-Version-Release) of the latest Y-Stream build")
86+
87+
88+
class SetZStreamReleaseTool(Tool[SetZStreamReleaseToolInput, ToolRunOptions, StringToolOutput]):
89+
name = "set_zstream_release"
90+
description = """
91+
Sets the value of the `Release` field in the specified spec file to a Z-Stream release
92+
based on the release of the latest Y-Stream build.
93+
Returns error message on failure.
94+
"""
95+
input_schema = SetZStreamReleaseToolInput
96+
97+
def _create_emitter(self) -> Emitter:
98+
return Emitter.root().child(
99+
namespace=["tool", "specfile", self.name],
100+
creator=self,
101+
)
102+
103+
async def _run(
104+
self, tool_input: SetZStreamReleaseToolInput, options: ToolRunOptions | None, context: RunContext
105+
) -> StringToolOutput:
106+
try:
107+
with Specfile(tool_input.spec) as spec:
108+
if not spec.has_autorelease:
109+
return StringToolOutput(result="The specified spec file doesn't use %autorelease")
110+
base_release = EVR.from_string(tool_input.latest_ystream_evr).release
111+
base_raw_release = base_release.rsplit(".el", maxsplit=1)[0]
112+
spec.raw_release = base_raw_release + "%{?dist}.%{autorelease -n}"
113+
except Exception as e:
114+
return StringToolOutput(result=f"Failed to set Z-Stream release: {e}")
115+
return StringToolOutput()

0 commit comments

Comments
 (0)