-
Notifications
You must be signed in to change notification settings - Fork 39
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
Prefer Flux#take(long, boolean)
over Flux#take(long)
to limit upstream generation
#314
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,6 +1,7 @@ | ||
package tech.picnic.errorprone.refasterrules; | ||
|
||
import static com.google.common.collect.MoreCollectors.toOptional; | ||
import static com.google.errorprone.BugPattern.SeverityLevel.WARNING; | ||
import static com.google.errorprone.refaster.ImportPolicy.STATIC_IMPORT_ALWAYS; | ||
import static java.util.function.Function.identity; | ||
import static org.assertj.core.api.Assertions.assertThat; | ||
|
@@ -28,7 +29,9 @@ | |
import reactor.test.StepVerifier; | ||
import reactor.test.publisher.PublisherProbe; | ||
import reactor.util.context.Context; | ||
import tech.picnic.errorprone.refaster.annotation.Description; | ||
import tech.picnic.errorprone.refaster.annotation.OnlineDocumentation; | ||
import tech.picnic.errorprone.refaster.annotation.Severity; | ||
import tech.picnic.errorprone.refaster.matchers.ThrowsCheckedException; | ||
|
||
/** Refaster rules related to Reactor expressions and statements. */ | ||
|
@@ -144,6 +147,34 @@ Mono<S> after(Mono<T> mono, S object) { | |
} | ||
} | ||
|
||
/** | ||
* Prefer {@link Flux#take(long, boolean)} over {@link Flux#take(long)}. | ||
* | ||
* <p>In Reactor versions prior to 3.5.0, {@code Flux#take(long)} makes an unbounded request | ||
* upstream, and is equivalent to {@code Flux#take(long, false)}. In 3.5.0, the behavior of {@code | ||
* Flux#take(long)} will change to that of {@code Flux#take(long, true)}. | ||
* | ||
* <p>The intent with this Refaster rule is to get the new behavior before upgrading to Reactor | ||
* 3.5.0. | ||
*/ | ||
// XXX: Drop this rule some time after upgrading to Reactor 3.6.0, or introduce a way to apply | ||
// this rule only when an older version of Reactor is on the classpath. | ||
// XXX: Once Reactor 3.6.0 is out, introduce a rule that rewrites code in the opposite direction. | ||
@Description( | ||
"Prior to Reactor 3.5.0, `take(n)` requests and unbounded number of elements upstream.") | ||
@Severity(WARNING) | ||
static final class FluxTake<T> { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is one of the few (perhaps the first?) Refaster rules that is intentionally not behavior preserving. A good opportunity to use the |
||
@BeforeTemplate | ||
Flux<T> before(Flux<T> flux, long n) { | ||
return flux.take(n); | ||
} | ||
|
||
@AfterTemplate | ||
Flux<T> after(Flux<T> flux, long n) { | ||
return flux.take(n, /* limitRequest= */ true); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Gotta love the Fun fact; if we really want to add this comment in the actual output of applying a Refaster rule, we can use There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yep! We don't have BooleanParameter enabled internally, so I think it's fine as-is 👍
werli marked this conversation as resolved.
Show resolved
Hide resolved
|
||
} | ||
} | ||
|
||
/** Don't unnecessarily pass an empty publisher to {@link Mono#switchIfEmpty(Mono)}. */ | ||
static final class MonoSwitchIfEmptyOfEmptyPublisher<T> { | ||
@BeforeTemplate | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Once on 3.6.0 we'll want to simplify the code in the opposite direction 😄. I'll add a comment.