Skip to content

fix: Unpack AnnotatedString in _apply_wildcards#3798

Merged
johanneskoester merged 1 commit intosnakemake:mainfrom
TomJohnZ:unwrapped_params
Nov 27, 2025
Merged

fix: Unpack AnnotatedString in _apply_wildcards#3798
johanneskoester merged 1 commit intosnakemake:mainfrom
TomJohnZ:unwrapped_params

Conversation

@TomJohnZ
Copy link
Copy Markdown
Contributor

@TomJohnZ TomJohnZ commented Oct 16, 2025

Unpacked functions (AnnotatedStrings) can be passed to _is_deriving_function. Ensure these unpacked functions are converted to callable functions first.

Fixes #3797

QC

  • The PR contains a test case for the changes or the changes are already covered by an existing test case.
  • The documentation (docs/) is updated to reflect the changes or this is not necessary (e.g. if the change does neither modify the language nor the behavior or functionalities of Snakemake).

Summary by CodeRabbit

  • Bug Fixes
    • Fixed wildcard handling so unpacked annotated callables are evaluated correctly when determining derived vs non‑derived inputs, preventing incorrect derivation detection.
  • Tests
    • Added a test covering wildcard‑annotated parameters that verifies error behavior when unpacked annotated params are used.

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Oct 16, 2025

📝 Walkthrough

Walkthrough

Use the underlying callable for unpacked AnnotatedString items when checking derivation in _apply_wildcards; add tests that exercise unpacked wildcard-annotated parameters and assert a WorkflowError on the failing case.

Changes

Cohort / File(s) Summary
Unpacked callable handling
src/snakemake/rules.py
In _apply_wildcards, when non_derived_items is provided and an item is an unpacked AnnotatedString, probe derivation using item.callable (otherwise use the original item); pass resulting is_derived into apply_input_function.
Tests for wildcard annotated strings
tests/test_wildcard_annotatedstrings/Snakefile, tests/tests.py
Add a Snakefile that uses unpack(getparams) with wildcard-driven params; add test_wildcard_annotatedstrings to assert a WorkflowError is raised and import WorkflowError from snakemake.exceptions.

Sequence Diagram(s)

sequenceDiagram
  participant Caller as _apply_wildcards
  participant Item as item (maybe AnnotatedString, is_unpack)
  participant Probe as _is_deriving_function
  participant Apply as apply_input_function

  Caller->>Item: receive item
  alt item.is_unpack and item is AnnotatedString
    Caller->>Item: use callable_item = item.callable
  else
    Caller->>Item: use callable_item = item
  end
  Caller->>Probe: _is_deriving_function(callable_item)
  Probe-->>Caller: is_derived
  Caller->>Apply: apply_input_function(item, is_derived)
  Apply-->>Caller: result
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

  • Review AnnotatedString / is_unpack detection and ensure .callable exists and is the intended probe.
  • Verify apply_input_function receives correct is_derived in all branches.
  • Confirm tests in tests/tests.py trigger the expected WorkflowError and cover the reported issue.

Pre-merge checks and finishing touches

✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title 'fix: Unpack AnnotatedString in _apply_wildcards' accurately describes the main change in the pull request - unpacking AnnotatedString values in the _apply_wildcards function.
Description check ✅ Passed The PR description addresses the core issue (unpacked functions as AnnotatedStrings) and includes all required QC checklist items marked as completed.
Linked Issues check ✅ Passed The code changes properly address issue #3797 by handling unpacked AnnotatedString functions in _apply_wildcards and adding a test case to verify the fix prevents the TypeError and maintains proper error handling.
Out of Scope Changes check ✅ Passed All changes are directly related to the linked issue #3797: the core fix in rules.py, the test case in tests.py, and the test fixture in the Snakefile are all scoped to resolving the unpacked AnnotatedString TypeError issue.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

📜 Recent review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 822b5a0 and 9094907.

⛔ Files ignored due to path filters (1)
  • tests/test_wildcard_annotatedstrings/expected-results/test.out is excluded by !**/*.out
📒 Files selected for processing (3)
  • src/snakemake/rules.py (1 hunks)
  • tests/test_wildcard_annotatedstrings/Snakefile (1 hunks)
  • tests/tests.py (2 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • tests/tests.py
🧰 Additional context used
📓 Path-based instructions (1)
**/*.py

⚙️ CodeRabbit configuration file

**/*.py: Do not try to improve formatting.
Do not suggest type annotations for functions that are defined inside of functions or methods.
Do not suggest type annotation of the self argument of methods.
Do not suggest type annotation of the cls argument of classmethods.
Do not suggest return type annotation if a function or method does not contain a return statement.

Files:

  • src/snakemake/rules.py
🧠 Learnings (8)
📚 Learning: 2025-08-29T11:51:44.625Z
Learnt from: Hocnonsense
Repo: snakemake/snakemake PR: 3714
File: src/snakemake/modules.py:72-99
Timestamp: 2025-08-29T11:51:44.625Z
Learning: In Snakemake's module system, rule overrides are only permitted when a rule was previously imported via wildcard (`rule_whitelist is None`) and is now being imported again with specific modifications. The check_overwrite method should return True only for specific rule imports that were previously imported via wildcard, not for any non-wildcard imports.

Applied to files:

  • src/snakemake/rules.py
📚 Learning: 2024-10-06T14:09:54.370Z
Learnt from: johanneskoester
Repo: snakemake/snakemake PR: 3117
File: tests/test_wrapper/Snakefile:11-11
Timestamp: 2024-10-06T14:09:54.370Z
Learning: Changes made within test cases, such as in `tests/test_wrapper/Snakefile`, are for testing purposes and do not require updates to the project documentation.

Applied to files:

  • tests/test_wildcard_annotatedstrings/Snakefile
📚 Learning: 2024-12-21T15:10:31.992Z
Learnt from: johanneskoester
Repo: snakemake/snakemake PR: 2925
File: tests/test_nonstr_params/Snakefile:14-15
Timestamp: 2024-12-21T15:10:31.992Z
Learning: The file "test.jsonl" in tests/test_nonstr_params is automatically created by Snakemake, rather than manually generated in the Snakefile.

Applied to files:

  • tests/test_wildcard_annotatedstrings/Snakefile
📚 Learning: 2024-10-08T17:41:54.542Z
Learnt from: johanneskoester
Repo: snakemake/snakemake PR: 2985
File: tests/tests.py:2051-2051
Timestamp: 2024-10-08T17:41:54.542Z
Learning: In the Snakemake repository, avoid suggesting return type annotations for test functions.

Applied to files:

  • tests/test_wildcard_annotatedstrings/Snakefile
📚 Learning: 2025-01-17T12:00:09.368Z
Learnt from: leoschwarz
Repo: snakemake/snakemake PR: 3176
File: tests/test_output_index.py:99-157
Timestamp: 2025-01-17T12:00:09.368Z
Learning: New test dependencies for Snakemake should be introduced in separate PRs rather than being added as part of feature or refactoring PRs.

Applied to files:

  • tests/test_wildcard_annotatedstrings/Snakefile
📚 Learning: 2024-08-13T16:22:09.641Z
Learnt from: johanneskoester
Repo: snakemake/snakemake PR: 3014
File: snakemake/workflow.py:1147-1147
Timestamp: 2024-08-13T16:22:09.641Z
Learning: Avoid suggesting type annotations for functions that are inside methods in the Snakemake codebase.

Applied to files:

  • tests/test_wildcard_annotatedstrings/Snakefile
📚 Learning: 2024-10-08T17:41:54.542Z
Learnt from: johanneskoester
Repo: snakemake/snakemake PR: 3014
File: snakemake/workflow.py:1250-1251
Timestamp: 2024-10-08T17:41:54.542Z
Learning: Avoid commenting on trailing commas in code reviews for the Snakemake repository as per the user's preference.

Applied to files:

  • tests/test_wildcard_annotatedstrings/Snakefile
📚 Learning: 2024-12-14T13:10:48.450Z
Learnt from: johanneskoester
Repo: snakemake/snakemake PR: 2927
File: tests/test_subpath/Snakefile:11-11
Timestamp: 2024-12-14T13:10:48.450Z
Learning: In Snakemake, when a rule defines a single output file (even if the output is specified as a dictionary), `{output}` in the shell command can be used directly to refer to that file.

Applied to files:

  • tests/test_wildcard_annotatedstrings/Snakefile
🧬 Code graph analysis (1)
src/snakemake/rules.py (1)
src/snakemake/io/__init__.py (1)
  • AnnotatedString (948-968)
🔇 Additional comments (2)
src/snakemake/rules.py (1)

786-794: LGTM! Correct handling of AnnotatedString callables in unpack scenarios.

The logic correctly extracts the underlying callable from an AnnotatedString when checking derivation for unpacked items. This prevents the TypeError described in issue #3797 by ensuring _is_deriving_function receives an actual callable rather than an AnnotatedString wrapper.

tests/test_wildcard_annotatedstrings/Snakefile (1)

1-6: LGTM! Minimal test case for the unpack/params validation.

The test correctly creates a scenario where unpack() is used with params, which should raise a WorkflowError. This validates that the fix prevents the internal TypeError and ensures users receive the intended error message.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between d092d8c and d8fdde4.

📒 Files selected for processing (1)
  • src/snakemake/common/__init__.py (1 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
**/*.py

⚙️ CodeRabbit configuration file

**/*.py: Do not try to improve formatting.
Do not suggest type annotations for functions that are defined inside of functions or methods.
Do not suggest type annotation of the self argument of methods.
Do not suggest type annotation of the cls argument of classmethods.
Do not suggest return type annotation if a function or method does not contain a return statement.

Files:

  • src/snakemake/common/__init__.py
🧬 Code graph analysis (1)
src/snakemake/common/__init__.py (1)
src/snakemake/io/__init__.py (1)
  • is_flagged (974-977)
🪛 Ruff (0.14.0)
src/snakemake/common/__init__.py

296-296: Undefined name is_flagged

(F821)

🔇 Additional comments (1)
src/snakemake/common/__init__.py (1)

296-297: unpack applies exclusively to AnnotatedString, which always initializes a .callable attribute, so the attribute access is safe.

@TomJohnZ TomJohnZ force-pushed the unwrapped_params branch 2 times, most recently from dee9e88 to e011235 Compare October 16, 2025 14:14
@TomJohnZ TomJohnZ changed the title Fix handling of AnnotatedStrings in get_function_params fix: Check for AnnotatedStrings in get_function_params Oct 16, 2025
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between dee9e88 and e011235.

📒 Files selected for processing (1)
  • src/snakemake/common/__init__.py (2 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
**/*.py

⚙️ CodeRabbit configuration file

**/*.py: Do not try to improve formatting.
Do not suggest type annotations for functions that are defined inside of functions or methods.
Do not suggest type annotation of the self argument of methods.
Do not suggest type annotation of the cls argument of classmethods.
Do not suggest return type annotation if a function or method does not contain a return statement.

Files:

  • src/snakemake/common/__init__.py
🧬 Code graph analysis (1)
src/snakemake/common/__init__.py (1)
src/snakemake/io/__init__.py (1)
  • is_flagged (974-977)
🔇 Additional comments (1)
src/snakemake/common/__init__.py (1)

26-26: LGTM! Critical import issue resolved.

The import of is_flagged from snakemake.io is correctly placed and addresses the critical NameError that was flagged in the previous review.

Comment thread src/snakemake/common/__init__.py Outdated
@TomJohnZ TomJohnZ marked this pull request as draft October 16, 2025 14:26
@TomJohnZ TomJohnZ changed the title fix: Check for AnnotatedStrings in get_function_params fix: Unwrap AnnotatedString in _apply_wildcards Oct 16, 2025
@TomJohnZ TomJohnZ changed the title fix: Unwrap AnnotatedString in _apply_wildcards fix: Unpack AnnotatedString in _apply_wildcards Oct 16, 2025
@TomJohnZ TomJohnZ marked this pull request as ready for review October 16, 2025 15:12
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🧹 Nitpick comments (1)
src/snakemake/rules.py (1)

786-787: LGTM! The fix correctly handles unpacked callables.

The change properly extracts the underlying callable from an AnnotatedString before passing it to _is_deriving_function, which resolves the TypeError described in issue #3797. The logic is sound: when is_unpack is True, the item is an AnnotatedString wrapping a callable, and _is_deriving_function needs the raw callable to inspect its parameters.

For consistency with the established pattern in this codebase (lines 686-688, 1091-1092) and defensive programming, consider adding an explicit isinstance check:

                 if non_derived_items is not None:
-                    callable_item = item.callable if is_unpack else item
+                    if is_unpack and isinstance(item, AnnotatedString):
+                        callable_item = item.callable
+                    else:
+                        callable_item = item
                     is_derived = self._is_deriving_function(callable_item)

This makes the code more robust and aligns with the pattern used elsewhere in the file. However, the current implementation is likely safe since is_unpack should only be True for AnnotatedString objects.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between e011235 and 54a4001.

📒 Files selected for processing (1)
  • src/snakemake/rules.py (1 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
**/*.py

⚙️ CodeRabbit configuration file

**/*.py: Do not try to improve formatting.
Do not suggest type annotations for functions that are defined inside of functions or methods.
Do not suggest type annotation of the self argument of methods.
Do not suggest type annotation of the cls argument of classmethods.
Do not suggest return type annotation if a function or method does not contain a return statement.

Files:

  • src/snakemake/rules.py

Copy link
Copy Markdown
Contributor

@johanneskoester johanneskoester left a comment

Choose a reason for hiding this comment

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

To avoid a future regression, would you mind adding a small test case?

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (1)
tests/tests.py (1)

2647-2652: Consider asserting the specific error message.

The test correctly expects a WorkflowError, but it catches any WorkflowError without verifying it's the intended "unpack() is not allowed with params." message. This could mask other unexpected errors.

Consider asserting the error message:

 def test_wildcard_annotatedstrings():
-    try:
-        run(dpath("test_wildcard_annotatedstrings"), targets=["test.out"])
-    except WorkflowError:
-        # WorkflowError is expected
-        return
+    with pytest.raises(WorkflowError, match="unpack.*is not allowed with params"):
+        run(dpath("test_wildcard_annotatedstrings"), targets=["test.out"])
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 9016c69 and 932e57f.

⛔ Files ignored due to path filters (1)
  • tests/test_wildcard_annotatedstrings/expected-results/test.out is excluded by !**/*.out
📒 Files selected for processing (3)
  • src/snakemake/rules.py (1 hunks)
  • tests/test_wildcard_annotatedstrings/Snakefile (1 hunks)
  • tests/tests.py (2 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
**/*.py

⚙️ CodeRabbit configuration file

**/*.py: Do not try to improve formatting.
Do not suggest type annotations for functions that are defined inside of functions or methods.
Do not suggest type annotation of the self argument of methods.
Do not suggest type annotation of the cls argument of classmethods.
Do not suggest return type annotation if a function or method does not contain a return statement.

Files:

  • src/snakemake/rules.py
  • tests/tests.py
🧬 Code graph analysis (2)
src/snakemake/rules.py (1)
src/snakemake/io/__init__.py (1)
  • AnnotatedString (948-968)
tests/tests.py (1)
tests/common.py (2)
  • run (152-503)
  • dpath (33-36)
🔇 Additional comments (2)
tests/tests.py (1)

22-22: LGTM!

The import of WorkflowError is correctly added and follows the existing pattern.

src/snakemake/rules.py (1)

786-790: Perfect! I found the key information in the search results. Let me verify one more aspect directly in the codebase:

#!/bin/bash
# Find the exact code context around lines 786-790
sed -n '780,800p' src/snakemake/rules.py

# Also check is_callable definition to confirm it's from snakemake.io
rg -nA8 'def is_callable' src/snakemake/io.py

Based on my analysis from the web search results, I can now verify the edge cases:

From the Snakemake documentation (index 22-6), I found the AnnotatedString class definition:
AnnotatedString has a callable property that is set to value if is_callable(value) else None

And the is_callable function checks if a value is callable by using callable(value) or checking if it's an _IOFile or AnnotatedString with a non-None callable property.

From the earlier script output, _is_deriving_function at line 943 checks callable() returns True if the object is callable, otherwise False, and since callable(None) returns False, passing None to _is_deriving_function is handled gracefully at line 951 which returns False.

The fix is correct and handles edge cases appropriately:

  1. Null callable edge case: If item.callable is None, _is_deriving_function(None) will return False because the callable() function returns False for non-callable objects like None.

  2. _IOFile handling: No evidence found in the codebase that _IOFile is used with the is_unpack flag in a way requiring unwrapping before the derivation check. The fix correctly handles AnnotatedString unpacking, and _IOFile handling already occurs in apply_input_function at the beginning of that method.

Comment thread tests/test_wildcard_annotatedstrings/Snakefile
@TomJohnZ
Copy link
Copy Markdown
Contributor Author

To avoid a future regression, would you mind adding a small test case?

Of course, just added one.

Since this is fixing an incorrect TypeError: '<function <lambda> at ...>' is not a callable object and replacing it with the correct WorkflowError: unpack() is not allowed with params, I decided to create an expected_output for what would be there in case unpack were allowed, and then just test that we throw, at most, a WorkflowError. That way, it will catch the current regression (a TypeError), but it will be compatible in case unpack is ever modified to work with params.

If you'd prefer a different approach, I'm happy to modify the test.

@johanneskoester johanneskoester enabled auto-merge (squash) October 30, 2025 15:44
auto-merge was automatically disabled November 5, 2025 18:36

Head branch was pushed to by a user without write access

@TomJohnZ TomJohnZ force-pushed the unwrapped_params branch 2 times, most recently from 822b5a0 to 9094907 Compare November 5, 2025 18:45
Unpacked functions (AnnotatedStrings) can be passed to
_is_deriving_function. Ensure these unpacked functions
are converted to callable functions first.
@johanneskoester johanneskoester enabled auto-merge (squash) November 27, 2025 15:18
@johanneskoester
Copy link
Copy Markdown
Contributor

Thanks a lot!

@johanneskoester johanneskoester merged commit 7886508 into snakemake:main Nov 27, 2025
60 checks passed
johanneskoester pushed a commit that referenced this pull request Nov 27, 2025
🤖 I have created a release *beep* *boop*
---


##
[9.14.0](v9.13.7...v9.14.0)
(2025-11-27)


### Features

* Support Hy in script directive
([#3824](#3824))
([2329c9e](2329c9e))


### Bug Fixes

* Add support for pathlib in `notebook` field
([#3811](#3811))
([7b2180a](7b2180a))
* Addressed race condition in workdir_handler.py
([#3844](#3844))
([8dbfcfb](8dbfcfb))
* cleanup update-marked output files of failed jobs if there was no
backup to restore them
([#3843](#3843))
([41f1ce8](41f1ce8))
* correct Windows callable path handling
([#3832](#3832))
([5caad70](5caad70))
* expand env vars on resources
([#3823](#3823))
([fcfa1bc](fcfa1bc))
* fix backup for output marked by `update`
([#3839](#3839))
([09c64b7](09c64b7))
* Minor fixes/additions to logging module.
([#3802](#3802))
([3b3986d](3b3986d))
* mount local storage prefix into containers
([#3840](#3840))
([f1e8b62](f1e8b62))
* properly format input/output files in case of missing rule to produce
them ([#3849](#3849))
([69d5d24](69d5d24))
* Unpack AnnotatedString in _apply_wildcards
([#3798](#3798))
([7886508](7886508))


### Performance Improvements

* retrieve storage inputs immediately before scheduling jobs instead of
before running the entire workflow
([#3850](#3850))
([4ac6cda](4ac6cda))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).
kjohnsen pushed a commit to kjohnsen/snakemake that referenced this pull request Dec 15, 2025
Unpacked functions (AnnotatedStrings) can be passed to
`_is_deriving_function`. Ensure these unpacked functions are converted
to callable functions first.

Fixes snakemake#3797

### QC


* [X] The PR contains a test case for the changes or the changes are
already covered by an existing test case.
* [X] The documentation (`docs/`) is updated to reflect the changes or
this is not necessary (e.g. if the change does neither modify the
language nor the behavior or functionalities of Snakemake).


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **Bug Fixes**
* Fixed wildcard handling so unpacked annotated callables are evaluated
correctly when determining derived vs non‑derived inputs, preventing
incorrect derivation detection.
* **Tests**
* Added a test covering wildcard‑annotated parameters that verifies
error behavior when unpacked annotated params are used.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
kjohnsen pushed a commit to kjohnsen/snakemake that referenced this pull request Dec 15, 2025
🤖 I have created a release *beep* *boop*
---


##
[9.14.0](snakemake/snakemake@v9.13.7...v9.14.0)
(2025-11-27)


### Features

* Support Hy in script directive
([snakemake#3824](snakemake#3824))
([2329c9e](snakemake@2329c9e))


### Bug Fixes

* Add support for pathlib in `notebook` field
([snakemake#3811](snakemake#3811))
([7b2180a](snakemake@7b2180a))
* Addressed race condition in workdir_handler.py
([snakemake#3844](snakemake#3844))
([8dbfcfb](snakemake@8dbfcfb))
* cleanup update-marked output files of failed jobs if there was no
backup to restore them
([snakemake#3843](snakemake#3843))
([41f1ce8](snakemake@41f1ce8))
* correct Windows callable path handling
([snakemake#3832](snakemake#3832))
([5caad70](snakemake@5caad70))
* expand env vars on resources
([snakemake#3823](snakemake#3823))
([fcfa1bc](snakemake@fcfa1bc))
* fix backup for output marked by `update`
([snakemake#3839](snakemake#3839))
([09c64b7](snakemake@09c64b7))
* Minor fixes/additions to logging module.
([snakemake#3802](snakemake#3802))
([3b3986d](snakemake@3b3986d))
* mount local storage prefix into containers
([snakemake#3840](snakemake#3840))
([f1e8b62](snakemake@f1e8b62))
* properly format input/output files in case of missing rule to produce
them ([snakemake#3849](snakemake#3849))
([69d5d24](snakemake@69d5d24))
* Unpack AnnotatedString in _apply_wildcards
([snakemake#3798](snakemake#3798))
([7886508](snakemake@7886508))


### Performance Improvements

* retrieve storage inputs immediately before scheduling jobs instead of
before running the entire workflow
([snakemake#3850](snakemake#3850))
([4ac6cda](snakemake@4ac6cda))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

TypeError in get_function_params

2 participants