Add BlockListener support...#1575
Conversation
|
Hi @leonard84. I cannot perform a formal code review, because I am not a committer, but I hope that during the weekend I can find a small time slice to build and play around with it. I simply wanted to say thanks in advance for taking care of this feature request. It has not gone unnoticed. Quick question: Are you planning to add more commits to this PR? Code changes? User manual? I am just asking, not demanding anything. I simply do not want to start testing too early. As for the user manual, I can of course take a look at the unit tests and take it from there. But that might not be true for all future extension developers, I am just speaking for myself. |
e49b0e3 to
f1d1840
Compare
| try { | ||
| org.spockframework.runtime.SpockRuntime.callEnterBlock(this.getSpecificationContext(), new org.spockframework.runtime.model.BlockInfo(org.spockframework.runtime.model.BlockKind.WHEN, [])) | ||
| foobar = this.foobar() | ||
| org.spockframework.runtime.SpockRuntime.callExitBlock(this.getSpecificationContext(), new org.spockframework.runtime.model.BlockInfo(org.spockframework.runtime.model.BlockKind.WHEN, [])) |
There was a problem hiding this comment.
💬 this won't be called, fixing this makes for some awkward interactions between the individual AST transformations,
There was a problem hiding this comment.
I tried moving the blockListener logic where the blocks are written back in SpecRewriter#L388, however this didn't work for some cases, e.g. cleanup as it already replaced all Blocks with an anonymous block.
c3f30eb to
0f3197e
Compare
|
As this PR seems a little bit stalled, I pushed the code I initially created ~6 months ago as a PoC for the BlockListener support. It a very raw version (with a lot of diagnostic stuff to be amended in the future), but functional in some basic scenarios. The JPA session, where requested, is flushed after the https://github.com/szpak/spock-jpa-flush-enforcer/tree/preview1 I would like to awake discussion about future shape of this PR. @leonard84 @kriegaex WDYT? |
|
It mostly hangs on the problems that adding the exit listener introduces #1575 (comment) |
0f3197e to
ae38bda
Compare
ae38bda to
353cbf9
Compare
|
I think I've fixed the issues, but I need another fresh set of eyes to verify that everything looks good, I've stared at too many snapshots already. |
|
@AndreasTu, as I mentioned earlier, I'll write some documentation and polish it later. Thanks for your comments in any case. However, I'm looking for a review of the correctness of the implementation and generated code and general usability. |
There was a problem hiding this comment.
I've switched my experimental (and heavily work-in-progress) extension to the latest version and it still works as expected without any modification. Nice.
I will think about the possible corner cases, I might encounter there.
Btw, I wonder, if it is still a recommended way to decide if the block listener was intended for the current iteration?
Vampire
left a comment
There was a problem hiding this comment.
Some things missing in multiple places:
- license headers
- JavaDoc
- documentation
@Beta@since
|
Btw. could we also support |
I don't think it would be intuitive or really helpful.
However, you are most familiar with that part of the code. |
No idea. :-D But we can also start without and see where and how need arises. |
|
Forgot to publish my responses 😅 |
@szpak, can you motivate this use case more? At first glance, I'd try to register a block listener that can handle all iterations instead of one per iteration. |
Hmm, I think the main problem was to get the |
5a2f3f2 to
c9ee05f
Compare
We could easily pass in the current instance. The question is whether we should. I've also been debating whether I should give access to the current |
Definitely that's the good question. What are the design difference between interceptors (which have access to
Do you see any good cases where it would be necessary for listeners in practice? To read the values set by the other extensions/interceptors? |
f455c91 to
19e2dc2
Compare
This feature allows extension authors to register a IBlockListener for
a feature to observe the execution of a feature in more detail.
This surfaces some of Spock's idiosyncrasies, for example interaction
assertions are actually setup right before entering the preceding
when-block as well as being evaluated on leaving thewhen-blockbefore actually entering the
then-block.The only valid block description is a constant String, although some
users mistakenly try to use a dynamic GString. Using anything other
than a String, will be treated as a separate statement and thus ignored.
fixes #538
fixes #111