Skip to content

Commit bea235d

Browse files
MintsIncclaude
andauthored
Add path parameter support for undo operations (#3105)
Support extracting path parameters from request URLs for use in undo operations. This enables cleanup of resources identified by path parameters (e.g., /api/v2/resource/{id}). Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
1 parent eb83963 commit bea235d

1 file changed

Lines changed: 34 additions & 8 deletions

File tree

tests/conftest.py

Lines changed: 34 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -443,16 +443,25 @@ def request_body_from_file(context, path, package_name):
443443

444444

445445
@given(parsers.parse('request contains "{name}" parameter from "{path}"'))
446-
def request_parameter(context, name, path):
446+
def request_parameter(context, name, path, path_parameters):
447447
"""Set request parameter."""
448-
context["api_request"]["kwargs"][escape_reserved_keyword(snake_case(name))] = json.dumps(glom(context, path))
448+
value = json.dumps(glom(context, path))
449+
param_name = escape_reserved_keyword(snake_case(name))
450+
context["api_request"]["kwargs"][param_name] = value
451+
# Store in path_parameters for undo operations
452+
path_parameters[name] = value
453+
path_parameters[param_name] = value
449454

450455

451456
@given(parsers.parse('request contains "{name}" parameter with value {value}'))
452-
def request_parameter_with_value(context, name, value):
457+
def request_parameter_with_value(context, name, value, path_parameters):
453458
"""Set request parameter."""
454459
tpl = Template(value).render(**context)
455-
context["api_request"]["kwargs"][escape_reserved_keyword(snake_case(name))] = tpl
460+
param_name = escape_reserved_keyword(snake_case(name))
461+
context["api_request"]["kwargs"][param_name] = tpl
462+
# Store in path_parameters for undo operations
463+
path_parameters[name] = tpl
464+
path_parameters[param_name] = tpl
456465

457466

458467
def assert_no_unparsed(data):
@@ -554,7 +563,13 @@ def extract_parameters(kwargs, data, parameter):
554563

555564

556565
@pytest.fixture
557-
def undo(package_name, undo_operations, client):
566+
def path_parameters():
567+
"""Store path parameters for undo operations."""
568+
return {}
569+
570+
571+
@pytest.fixture
572+
def undo(package_name, undo_operations, client, path_parameters):
558573
"""Clean after operation."""
559574

560575
def cleanup(api, version, operation_id, response, request, client=client):
@@ -582,10 +597,21 @@ def cleanup(api, version, operation_id, response, request, client=client):
582597
kwargs = {}
583598
parameters = operation.get("parameters", [])
584599
for parameter in parameters:
585-
if "origin" not in parameter or parameter["origin"] == "response":
586-
extract_parameters(kwargs, response, parameter)
587-
elif parameter["origin"] == "request":
600+
origin = parameter.get("origin", "response")
601+
if origin == "path":
602+
# Extract from path parameters
603+
if "source" in parameter:
604+
param_name = parameter["source"]
605+
if param_name in path_parameters:
606+
kwargs[parameter["name"]] = path_parameters[param_name]
607+
else:
608+
warnings.warn(f"Path parameter '{param_name}' not found")
609+
else:
610+
warnings.warn(f"Path origin requires 'source' field")
611+
elif origin == "request":
588612
extract_parameters(kwargs, request, parameter)
613+
else: # response or default
614+
extract_parameters(kwargs, response, parameter)
589615
if operation_name in client.configuration.unstable_operations:
590616
client.configuration.unstable_operations[operation_name] = True
591617

0 commit comments

Comments
 (0)