Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

support method option and add UT #1881

Merged
merged 9 commits into from
Nov 1, 2023

Conversation

TaoJing96
Copy link
Contributor

@TaoJing96 TaoJing96 commented Dec 15, 2022

Background:

  • I want to add request timeout for each feign api, but none of them has param Options.

Change:

  • Support method option and add UT
  • Format code style

Usage:

  1. You can see socketTimeoutWithMethodOptionsTest in OptionsTest.java
  2. In spring Cloud
interface MyClient {
   @RequestMapping(path = "/data")
   public MyResponse getMyData();
}
@FeignClient(name = "my-service", url = "xxxx", configuration = MyConfig.class)
public interface MyFeignService extends MyClient {
}
@Configuration
public class MyConfig {

    @Bean
    @ConditionalOnMissingBean(name = "options")
    Request.Options options() {
        return new Request.Options(5000, 10000);
    }
}
@Component
public class MyServiceClient {
    @Resource
    private MyFeignService myFeignService;

    @Resource
    private Request.Options options;

    public MyResponse getMyData(Request.Options options) {
        options.setMethodOptions("getMyData", options); //you can also use aop.
        //write your code below
    }
}

Summary by CodeRabbit

New Features:

  • Added the ability to set and retrieve method-specific options in the Options class, providing more flexibility in handling different methods.
  • Introduced a new utility function getThreadIdentifier() for retrieving the current thread's identifier.

Tests:

  • Implemented two new tests to verify the correct behavior of method-specific options in both normal and timeout scenarios.

Refactor:

  • Enhanced the findOptions method in the RequestTemplate class to handle method-specific options, improving the overall request handling process.

@velo
Copy link
Member

velo commented Dec 15, 2022

You spoke a lot of spring up there, I'm not sure if I got it all.

Lemme see if I got it correctly, what you want is to be able to change timeouts for individual methods dynamically.

So, you want to call getMyData sometimes with 500ms timeout and other times getMyData with 5s timeout. Is that it? Why?

@TaoJing96
Copy link
Contributor Author

TaoJing96 commented Dec 15, 2022

You spoke a lot of spring up there, I'm not sure if I got it all.

Lemme see if I got it correctly, what you want is to be able to change timeouts for individual methods dynamically.

Yes, i want to change timeouts for individual methods dynamically and i don't need add param Options for each method.
Btw, supporting method timeouts should be forward compatible and adding param Options for each method is too heavy.

So, you want to call getMyData sometimes with 500ms timeout and other times getMyData with 5s timeout. Is that it? Why?

In case 1, i want to call getMyData with 500ms, in case 2, i i want to call getMyData with 5000ms, it makes sense.

@velo
Copy link
Member

velo commented Dec 18, 2022

In case 1, i want to call getMyData with 500ms, in case 2, i i want to call getMyData with 5000ms, it makes sense.

If you have any concurrence, you might end up with case 1 executing the call with 5s timeout and case 2 with 500ms, the exact opposite of what you are after. nvm, just noticed the thread name... still, looks so fragile and a memory leakage

Could you describe me a bit more of what you are trying to accomplish?

@TaoJing96
Copy link
Contributor Author

TaoJing96 commented Dec 19, 2022

In case 1, i want to call getMyData with 500ms, in case 2, i i want to call getMyData with 5000ms, it makes sense.

If you have any concurrence, you might end up with case 1 executing the call with 5s timeout and case 2 with 500ms, the exact opposite of what you are after. nvm, just noticed the thread name... still, looks so fragile and a memory leakage

Could you describe me a bit more of what you are trying to accomplish?

OK, let me show you the code.
I wrote the code last year.

interface MyClient {
   @RequestMapping(path = "/data")
   public MyResponse getMyData();
}

However, i want to add request timeout while calling getMyData() now, how can i accomplish it on the condition that i don't add param Options in getMyData()?

@TaoJing96
Copy link
Contributor Author

In case 1, i want to call getMyData with 500ms, in case 2, i i want to call getMyData with 5000ms, it makes sense.

If you have any concurrence, you might end up with case 1 executing the call with 5s timeout and case 2 with 500ms, the exact opposite of what you are after. nvm, just noticed the thread name... still, looks so fragile and a memory leakage

Why it looks so fragile and a memory leakage? Could you give more infos?

Could you describe me a bit more of what you are trying to accomplish?

@kdavisk6 kdavisk6 added the feedback provided Feedback has been provided to the author label Dec 31, 2022
@coderabbitai
Copy link

coderabbitai bot commented Oct 31, 2023

Walkthrough

The changes introduced enhance the feign library by adding the ability to specify method-specific options. This is achieved by adding new methods and fields to the Options class, modifying the findOptions method in the RequestTemplate class, and adding a utility method to get the current thread identifier. New tests have been added to ensure the functionality works as expected.

Changes

File Path Summary
core/src/main/java/feign/Request.java Added import statement, two new methods, and a new field to the Options class. The constructor of the Options class has been updated to initialize the new field.
core/src/main/java/feign/SynchronousMethodHandler.java Updated the findOptions method in the RequestTemplate class to handle method-specific options.
core/src/main/java/feign/Util.java Added a new static method getThreadIdentifier() to retrieve the identifier of the current thread.
core/src/test/java/feign/OptionsTest.java Added import statements and two new test methods to validate the new functionality.

Poem

🍂 As the leaves fall and the air grows colder, 🎃

Our code evolves, becoming bolder. 🐇

With method-specific options in sight, 🌙

Feign library shines in the autumn night. 🍁

Tests ensure we're on the right track, 🚂

Celebrating changes, there's no looking back! 🎉

So here's to progress, steady and slow, 🐢

In the spirit of Halloween, let's enjoy the show! 👻


Tips

Chat with CodeRabbit Bot (@coderabbitai)

  • If you reply to a review comment from CodeRabbit, the bot will automatically respond.
  • To engage with CodeRabbit bot directly around the specific lines of code in the PR, mention @coderabbitai in your review comment
  • Note: Review comments are made on code diffs or files, not on the PR overview.
  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.

CodeRabbit Commands (invoked as PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger a review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai help to get help.
  • @coderabbitai resolve to resolve all the CodeRabbit review comments.

Note: For conversation with the bot, please use the review comments on code diffs or files.

CodeRabbit Configration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • The JSON schema for the configuration file is available here.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/coderabbit-overrides.json

Copy link

@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.

Review Status

Actionable comments generated: 1

Configuration used: CodeRabbit UI

Commits Files that changed from the base of the PR and between 757de66 and 067e247.
Files selected for processing (4)
  • core/src/main/java/feign/Request.java (4 hunks)
  • core/src/main/java/feign/SynchronousMethodHandler.java (1 hunks)
  • core/src/main/java/feign/Util.java (1 hunks)
  • core/src/test/java/feign/OptionsTest.java (2 hunks)
Files skipped from review due to trivial changes (2)
  • core/src/main/java/feign/SynchronousMethodHandler.java
  • core/src/main/java/feign/Util.java
Additional comments: 5
core/src/test/java/feign/OptionsTest.java (3)
  • 18-23: The newly added import statements are necessary for the new test methods. They are correctly placed and used.

  • 94-116: The socketTimeoutWithMethodOptionsTest() method is correctly implemented. It tests the scenario where a SocketTimeoutException is expected due to the method-specific options. The use of AtomicReference for exception handling in a separate thread is a good practice.

  • 118-135: The normalResponseWithMethodOptionsTest() method is correctly implemented. It tests the scenario where no exceptions are expected due to the method-specific options. The use of CountDownLatch to ensure the API call is completed before the test ends is a good practice.

core/src/main/java/feign/Request.java (2)
  • 16-17: The import of getThreadIdentifier is fine as it is used in the new methods.

  • 368-372: The threadToMethodOptions field is correctly initialized in the constructor of the Options class.

Comment on lines 306 to 335
private final long readTimeout;
private final TimeUnit readTimeoutUnit;
private final boolean followRedirects;
private final Map<String, Map<String, Options>> threadToMethodOptions;

/**
* Get an Options by methodName
*
* @param methodName it's your FeignInterface method name.
* @return method Options
*/
public Options getMethodOptions(String methodName) {
Map<String, Options> methodOptions =
threadToMethodOptions.getOrDefault(getThreadIdentifier(), new HashMap<>());
return methodOptions.getOrDefault(methodName, this);
}

/**
* Set methodOptions by methodKey and options
*
* @param methodName it's your FeignInterface method name.
* @param options it's the Options for this method.
*/
public void setMethodOptions(String methodName, Options options) {
String threadIdentifier = getThreadIdentifier();
Map<String, Request.Options> methodOptions =
threadToMethodOptions.getOrDefault(threadIdentifier, new HashMap<>());
threadToMethodOptions.put(threadIdentifier, methodOptions);
methodOptions.put(methodName, options);
}
Copy link

Choose a reason for hiding this comment

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

The new methods getMethodOptions and setMethodOptions are correctly implemented. However, there is a potential issue with thread safety. The getMethodOptions method retrieves a Map from threadToMethodOptions and then directly returns an Options object from it. If another thread modifies this Map in the meantime (via setMethodOptions), it could lead to inconsistent states. Consider returning a deep copy of the Options object instead of the object itself to avoid this issue.

public Options getMethodOptions(String methodName) {
  Map<String, Options> methodOptions =
      threadToMethodOptions.getOrDefault(getThreadIdentifier(), new HashMap<>());
  Options originalOptions = methodOptions.getOrDefault(methodName, this);
  // Return a deep copy of the originalOptions
  return originalOptions.copy();
}

You would need to implement a copy method in the Options class that creates a deep copy of the Options object.

Copy link

@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.

Review Status

Actionable comments generated: 1

Configuration used: CodeRabbit UI

Commits Files that changed from the base of the PR and between 067e247 and a7c884c.
Files selected for processing (1)
  • core/src/main/java/feign/Request.java (4 hunks)
Additional comments: 2
core/src/main/java/feign/Request.java (2)
  • 16-17: The import of getThreadIdentifier is fine as it's used in the new methods.

  • 369-373: The threadToMethodOptions field is correctly initialized in the constructor.

Comment on lines 306 to 336
private final long readTimeout;
private final TimeUnit readTimeoutUnit;
private final boolean followRedirects;
private final Map<String, Map<String, Options>> threadToMethodOptions;

/**
* Get an Options by methodName
*
* @param methodName it's your FeignInterface method name.
* @return method Options
*/
public Options getMethodOptions(String methodName) {
Map<String, Options> methodOptions =
threadToMethodOptions.getOrDefault(getThreadIdentifier(), new HashMap<>());
return methodOptions.getOrDefault(methodName, this);
}

/**
* Set methodOptions by methodKey and options
*
* @param methodName it's your FeignInterface method name.
* @param options it's the Options for this method.
*/
@Experimental
public void setMethodOptions(String methodName, Options options) {
String threadIdentifier = getThreadIdentifier();
Map<String, Request.Options> methodOptions =
threadToMethodOptions.getOrDefault(threadIdentifier, new HashMap<>());
threadToMethodOptions.put(threadIdentifier, methodOptions);
methodOptions.put(methodName, options);
}
Copy link

Choose a reason for hiding this comment

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

The new field threadToMethodOptions and the methods getMethodOptions and setMethodOptions are introduced correctly. However, there's a potential issue with thread safety. The setMethodOptions method retrieves a Map from the ConcurrentHashMap and then modifies it. This operation is not atomic and can lead to data races if multiple threads call setMethodOptions concurrently. Consider synchronizing the method or using a thread-safe Map implementation.

-  public void setMethodOptions(String methodName, Options options) {
-    String threadIdentifier = getThreadIdentifier();
-    Map<String, Request.Options> methodOptions =
-        threadToMethodOptions.getOrDefault(threadIdentifier, new HashMap<>());
-    threadToMethodOptions.put(threadIdentifier, methodOptions);
-    methodOptions.put(methodName, options);
-  }
+  public synchronized void setMethodOptions(String methodName, Options options) {
+    String threadIdentifier = getThreadIdentifier();
+    Map<String, Request.Options> methodOptions =
+        threadToMethodOptions.computeIfAbsent(threadIdentifier, k -> new ConcurrentHashMap<>());
+    methodOptions.put(methodName, options);
+  }

Commitable suggestion (Beta)
Suggested change
private final long readTimeout;
private final TimeUnit readTimeoutUnit;
private final boolean followRedirects;
private final Map<String, Map<String, Options>> threadToMethodOptions;
/**
* Get an Options by methodName
*
* @param methodName it's your FeignInterface method name.
* @return method Options
*/
public Options getMethodOptions(String methodName) {
Map<String, Options> methodOptions =
threadToMethodOptions.getOrDefault(getThreadIdentifier(), new HashMap<>());
return methodOptions.getOrDefault(methodName, this);
}
/**
* Set methodOptions by methodKey and options
*
* @param methodName it's your FeignInterface method name.
* @param options it's the Options for this method.
*/
@Experimental
public void setMethodOptions(String methodName, Options options) {
String threadIdentifier = getThreadIdentifier();
Map<String, Request.Options> methodOptions =
threadToMethodOptions.getOrDefault(threadIdentifier, new HashMap<>());
threadToMethodOptions.put(threadIdentifier, methodOptions);
methodOptions.put(methodName, options);
}
private final long readTimeout;
private final TimeUnit readTimeoutUnit;
private final boolean followRedirects;
private final Map<String, Map<String, Options>> threadToMethodOptions;
/**
* Get an Options by methodName
*
* @param methodName it's your FeignInterface method name.
* @return method Options
*/
public Options getMethodOptions(String methodName) {
Map<String, Options> methodOptions =
threadToMethodOptions.getOrDefault(getThreadIdentifier(), new HashMap<>());
return methodOptions.getOrDefault(methodName, this);
}
/**
* Set methodOptions by methodKey and options
*
* @param methodName it's your FeignInterface method name.
* @param options it's the Options for this method.
*/
@Experimental
public synchronized void setMethodOptions(String methodName, Options options) {
String threadIdentifier = getThreadIdentifier();
Map<String, Request.Options> methodOptions =
threadToMethodOptions.computeIfAbsent(threadIdentifier, k -> new ConcurrentHashMap<>());
methodOptions.put(methodName, options);
}

core/src/main/java/feign/Request.java Show resolved Hide resolved
Copy link

@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.

Review Status

Actionable comments generated: 1

Configuration used: CodeRabbit UI

Commits Files that changed from the base of the PR and between a7c884c and a5486f5.
Files selected for processing (1)
  • core/src/main/java/feign/Request.java (4 hunks)
Additional comments: 2
core/src/main/java/feign/Request.java (2)
  • 16-17: The import of getThreadIdentifier is fine as it is used in the new methods.

  • 370-374: The threadToMethodOptions field is correctly initialized in the constructor.

Comment on lines 306 to +337
private final long readTimeout;
private final TimeUnit readTimeoutUnit;
private final boolean followRedirects;
private final Map<String, Map<String, Options>> threadToMethodOptions;

/**
* Get an Options by methodName
*
* @param methodName it's your FeignInterface method name.
* @return method Options
*/
@Experimental
public Options getMethodOptions(String methodName) {
Map<String, Options> methodOptions =
threadToMethodOptions.getOrDefault(getThreadIdentifier(), new HashMap<>());
return methodOptions.getOrDefault(methodName, this);
}

/**
* Set methodOptions by methodKey and options
*
* @param methodName it's your FeignInterface method name.
* @param options it's the Options for this method.
*/
@Experimental
public void setMethodOptions(String methodName, Options options) {
String threadIdentifier = getThreadIdentifier();
Map<String, Request.Options> methodOptions =
threadToMethodOptions.getOrDefault(threadIdentifier, new HashMap<>());
threadToMethodOptions.put(threadIdentifier, methodOptions);
methodOptions.put(methodName, options);
}
Copy link

Choose a reason for hiding this comment

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

The new methods getMethodOptions and setMethodOptions are correctly implemented. However, there is a potential issue with thread safety. The getMethodOptions method retrieves a Map from threadToMethodOptions and then directly returns an Options object from it. If another thread modifies this Map in the meantime (via setMethodOptions), it could lead to inconsistent states. Consider returning a deep copy of the Options object instead of the object itself to avoid this issue.

public Options getMethodOptions(String methodName) {
  Map<String, Options> methodOptions =
      threadToMethodOptions.getOrDefault(getThreadIdentifier(), new HashMap<>());
  Options originalOptions = methodOptions.getOrDefault(methodName, this);
  // Return a deep copy of the originalOptions
  return new Options(originalOptions.connectTimeout, originalOptions.connectTimeoutUnit,
                     originalOptions.readTimeout, originalOptions.readTimeoutUnit,
                     originalOptions.followRedirects);
}

@velo velo merged commit 468c44c into OpenFeign:master Nov 1, 2023
3 checks passed
ghost referenced this pull request in camunda/camunda Nov 15, 2023
15205: deps(maven): Update dependency io.github.openfeign:feign-bom to v13.1 (main) r=github-actions[bot] a=renovate[bot]

[![Mend Renovate logo banner](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [io.github.openfeign:feign-bom](https://togithub.com/openfeign/feign) | `13.0` -> `13.1` | [![age](https://developer.mend.io/api/mc/badges/age/maven/io.github.openfeign:feign-bom/13.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/maven/io.github.openfeign:feign-bom/13.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/maven/io.github.openfeign:feign-bom/13.0/13.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/maven/io.github.openfeign:feign-bom/13.0/13.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) |

---

> [!WARNING]
> Some dependencies could not be looked up. Check the Dependency Dashboard for more information.

---

### Release Notes

<details>
<summary>openfeign/feign (io.github.openfeign:feign-bom)</summary>

### [`v13.1`](https://togithub.com/OpenFeign/feign/releases/tag/13.1): OpenFeign 13.1

[Compare Source](https://togithub.com/openfeign/feign/compare/13.0...13.1)

##### What's Changed

-   Support Conditional Parameter Expansion by [`@&#8203;gromspys](https://togithub.com/gromspys)` in [https://github.com/OpenFeign/feign/pull/2216](https://togithub.com/OpenFeign/feign/pull/2216)
-   Add typed response by [`@&#8203;gromspys](https://togithub.com/gromspys)` in [https://github.com/OpenFeign/feign/pull/2206](https://togithub.com/OpenFeign/feign/pull/2206)
-   Allow to ignore methods on provided interface by [`@&#8203;gromspys](https://togithub.com/gromspys)` in [https://github.com/OpenFeign/feign/pull/2218](https://togithub.com/OpenFeign/feign/pull/2218)
-   support method option and add UT by [`@&#8203;TaoJing96](https://togithub.com/TaoJing96)` in [https://github.com/OpenFeign/feign/pull/1881](https://togithub.com/OpenFeign/feign/pull/1881)
-   Do not decode URL encoding while setting up RequestTemplate by [`@&#8203;Breina](https://togithub.com/Breina)` in [https://github.com/OpenFeign/feign/pull/2228](https://togithub.com/OpenFeign/feign/pull/2228)

***

<details>
<summary>List of PRs that updated libraries versions</summary>
<br />
* build(deps): bump jakarta.xml.ws:jakarta.xml.ws-api from 4.0.0 to 4.0.1 by `@&#8203;dependabot` in OpenFeign/feign#2211
* build(deps-dev): bump org.glassfish.jersey.core:jersey-client from 2.40 to 2.41 by `@&#8203;dependabot` in OpenFeign/feign#2210
* build(deps-dev): bump org.glassfish.jersey.inject:jersey-hk2 from 2.40 to 2.41 by `@&#8203;dependabot` in OpenFeign/feign#2209
* build(deps): bump jakarta.xml.soap:jakarta.xml.soap-api from 3.0.0 to 3.0.1 by `@&#8203;dependabot` in OpenFeign/feign#2208
* build(deps): bump com.sun.xml.bind:jaxb-impl from 2.3.8 to 2.3.9 by `@&#8203;dependabot` in OpenFeign/feign#2207
* build(deps): bump io.sundr:sundr-maven-plugin from 0.101.0 to 0.101.1 by `@&#8203;dependabot` in OpenFeign/feign#2213
* build(deps): bump maven-surefire-plugin.version from 3.1.2 to 3.2.1 by `@&#8203;dependabot` in OpenFeign/feign#2212
* build(deps): bump io.sundr:sundr-maven-plugin from 0.101.1 to 0.101.2 by `@&#8203;dependabot` in OpenFeign/feign#2215
* build(deps): bump kotlin.version from 1.9.10 to 1.9.20 by `@&#8203;dependabot` in OpenFeign/feign#2219
* build(deps): bump io.sundr:sundr-maven-plugin from 0.101.2 to 0.101.3 by `@&#8203;dependabot` in OpenFeign/feign#2220
* build(deps): bump org.mockito:mockito-core from 5.6.0 to 5.7.0 by `@&#8203;dependabot` in OpenFeign/feign#2221
* build(deps): bump org.moditect:moditect-maven-plugin from 1.0.0.Final to 1.1.0 by `@&#8203;dependabot` in OpenFeign/feign#2224
* build(deps): bump io.dropwizard.metrics:metrics-core from 4.2.21 to 4.2.22 by `@&#8203;dependabot` in OpenFeign/feign#2222
* build(deps): bump org.junit:junit-bom from 5.10.0 to 5.10.1 by `@&#8203;dependabot` in OpenFeign/feign#2223
* build(deps): bump org.apache.maven.plugins:maven-javadoc-plugin from 3.6.0 to 3.6.2 by `@&#8203;dependabot` in OpenFeign/feign#2226
* build(deps): bump maven-surefire-plugin.version from 3.2.1 to 3.2.2 by `@&#8203;dependabot` in OpenFeign/feign#2225
</details>

##### New Contributors
* `@&#8203;TaoJing96` made their first contributi[https://github.com/OpenFeign/feign/pull/1881](https://togithub.com/OpenFeign/feign/pull/1881)l/1881
* `@&#8203;Breina` made their first contributi[https://github.com/OpenFeign/feign/pull/2228](https://togithub.com/OpenFeign/feign/pull/2228)l/2228

**Full Changelog**: OpenFeign/feign@13.0...13.1

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "every weekday" (UTC), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Mend Renovate](https://www.mend.io/free-developer-tools/renovate/). View repository job log [here](https://developer.mend.io/github/camunda/zeebe).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy40Ni4wIiwidXBkYXRlZEluVmVyIjoiMzcuNDYuMCIsInRhcmdldEJyYW5jaCI6Im1haW4ifQ==-->


Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
velo added a commit that referenced this pull request Oct 7, 2024
* support method option and add UT

* format code style

* add Experimental annotation

* Added     @experimental to new method

---------

Co-authored-by: Marvin Froeder <[email protected]>
velo added a commit that referenced this pull request Oct 8, 2024
* support method option and add UT

* format code style

* add Experimental annotation

* Added     @experimental to new method

---------

Co-authored-by: Marvin Froeder <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
feedback provided Feedback has been provided to the author
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants