-
Notifications
You must be signed in to change notification settings - Fork 33
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
Generate Roborazzi images via its IntelliJ Plugin #429
Generate Roborazzi images via its IntelliJ Plugin #429
Conversation
Looks good! Thank you for asking for feedback first. I have some suggestions. Regarding the UI: Regarding the code: |
Oh you want to discard the drop-down approach? I'm not sure how the reload button would work. Like you want me to put a reload in-place of the drop-down menu then when pressed, it shows the drop-down menu to select a roborazzi task to run? What will the reload button do? Is that to refresh the images found and also to refresh the task drop-down list?
Yes. I was going to move it to the viewmodel. I wasn't sure where exactly to be calling it to refresh. Thanks for suggesting where to call it. |
Sorry the comment was confusing. I mean I wanted to add a refresh button along with selection menu. Like this:
You can select Gradle task with selection menu and you can run Gradle task by refresh button. |
Oh I see and no worries. So you still want the drop-down menu but with icon support. Upon clicking on the icon, you execute the selected task. Right? If you don't mind sharing why you only want to run the task when hitting the refresh button from the selected task and not when selecting it, that would be great because I think with this approach we are introducing another level of expectation on the user to cause a selected task to run. Thanks for clarifying my earlier response. |
You can run the Gradle tasks when you select them, but I was thinking of following Android Studio's default configuration menu and run buttons behavior, which don't run tasks immediately upon selection. This approach might be more familiar to users. |
However, I feel there's still a technical issue with obtaining the task that should be selected by default, and in that case, users would need to choose a task every time they start Android Studio. Therefore, executing upon selection might make sense. |
I see what you mean. The AS example made it so clear to me. Thank you. I guess we could persist the selected task with |
3a23227
to
d272d8e
Compare
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.
I have a few minor points, but overall it looks great and very useful!
...ea-plugin/src/main/kotlin/com/github/takahirom/roborazzi/idea/preview/RoborazziGradleTask.kt
Outdated
Show resolved
Hide resolved
...a-plugin/src/main/kotlin/com/github/takahirom/roborazzi/idea/preview/RoborazziPreviewTool.kt
Outdated
Show resolved
Hide resolved
...-idea-plugin/src/main/kotlin/com/github/takahirom/roborazzi/idea/preview/PreviewViewModel.kt
Show resolved
Hide resolved
Essentially we want to have a drop down that allows the user to select a gradle task then hit an refresh button on the toolbar to execute the selected action similar to how AS works with device run configuration
panel window is small
d272d8e
to
3629669
Compare
Let me know if you need any documentation add or update. I believe the screenshot page on the IntelliJ plugin page needs updating. |
Looks great! Thanks for your awesome contribution! I've made a few minor adjustments. Could you please take a look at the new PR? |
[![Mend Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com) This PR contains the following updates: | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | [io.github.takahirom.roborazzi](https://togithub.com/takahirom/roborazzi) | `1.21.0` -> `1.22.1` | [![age](https://developer.mend.io/api/mc/badges/age/maven/io.github.takahirom.roborazzi/1.22.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/maven/io.github.takahirom.roborazzi/1.22.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/maven/io.github.takahirom.roborazzi/1.21.0/1.22.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/maven/io.github.takahirom.roborazzi/1.21.0/1.22.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | | [io.github.takahirom.roborazzi:roborazzi-junit-rule](https://togithub.com/takahirom/roborazzi) | `1.21.0` -> `1.22.1` | [![age](https://developer.mend.io/api/mc/badges/age/maven/io.github.takahirom.roborazzi:roborazzi-junit-rule/1.22.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/maven/io.github.takahirom.roborazzi:roborazzi-junit-rule/1.22.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/maven/io.github.takahirom.roborazzi:roborazzi-junit-rule/1.21.0/1.22.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/maven/io.github.takahirom.roborazzi:roborazzi-junit-rule/1.21.0/1.22.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | | [io.github.takahirom.roborazzi:roborazzi-compose-desktop](https://togithub.com/takahirom/roborazzi) | `1.21.0` -> `1.22.1` | [![age](https://developer.mend.io/api/mc/badges/age/maven/io.github.takahirom.roborazzi:roborazzi-compose-desktop/1.22.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/maven/io.github.takahirom.roborazzi:roborazzi-compose-desktop/1.22.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/maven/io.github.takahirom.roborazzi:roborazzi-compose-desktop/1.21.0/1.22.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/maven/io.github.takahirom.roborazzi:roborazzi-compose-desktop/1.21.0/1.22.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | | [io.github.takahirom.roborazzi:roborazzi-compose](https://togithub.com/takahirom/roborazzi) | `1.21.0` -> `1.22.1` | [![age](https://developer.mend.io/api/mc/badges/age/maven/io.github.takahirom.roborazzi:roborazzi-compose/1.22.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/maven/io.github.takahirom.roborazzi:roborazzi-compose/1.22.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/maven/io.github.takahirom.roborazzi:roborazzi-compose/1.21.0/1.22.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/maven/io.github.takahirom.roborazzi:roborazzi-compose/1.21.0/1.22.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | | [io.github.takahirom.roborazzi:roborazzi](https://togithub.com/takahirom/roborazzi) | `1.21.0` -> `1.22.1` | [![age](https://developer.mend.io/api/mc/badges/age/maven/io.github.takahirom.roborazzi:roborazzi/1.22.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/maven/io.github.takahirom.roborazzi:roborazzi/1.22.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/maven/io.github.takahirom.roborazzi:roborazzi/1.21.0/1.22.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/maven/io.github.takahirom.roborazzi:roborazzi/1.21.0/1.22.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes <details> <summary>takahirom/roborazzi (io.github.takahirom.roborazzi)</summary> ### [`v1.22.1`](https://togithub.com/takahirom/roborazzi/releases/tag/1.22.1) [Compare Source](https://togithub.com/takahirom/roborazzi/compare/1.22.0...1.22.1) ### Bug fixes We've released Experimental Compose Preview Support in [1.22.0](https://togithub.com/takahirom/roborazzi/releases/tag/1.22.0). In this release, we are going to include a bug fix for it. The strategy of `generateComposePreviewRobolectricTests{}` is not to modify settings automatically, but to verify that the user settings are correct. This allows our settings to be the single source of truth. However, the assertion had some bugs, so I fixed them. #### What's Changed - \[Roborazzi Idea Plugin] Generate Roborazzi images via its IntelliJ Plugin by [@​eyedol](https://togithub.com/eyedol) in [https://github.com/takahirom/roborazzi/pull/429](https://togithub.com/takahirom/roborazzi/pull/429) (We will address this topic in a future release) - \[Bug fixes] Fix assertions in Automated Test Generation for Experimental Compose Preview Support by [@​takahirom](https://togithub.com/takahirom) in [https://github.com/takahirom/roborazzi/pull/432](https://togithub.com/takahirom/roborazzi/pull/432) **Full Changelog**: takahirom/roborazzi@1.22.0...1.22.1 ### [`v1.22.0`](https://togithub.com/takahirom/roborazzi/releases/tag/1.22.0) [Compare Source](https://togithub.com/takahirom/roborazzi/compare/1.21.0...1.22.0) ### Experimental Compose Preview Support 🚀 We're excited to announce the experimental release of [Compose Preview Support for Roborazzi](https://takahirom.github.io/roborazzi/preview-support.html), a powerful new feature that streamlines the process of generating screenshot tests for Jetpack Compose Previews. #### Key Features - **Automated Test Generation**: Automatically generate screenshot tests for Composable Previews using the [ComposablePreviewScanner](https://togithub.com/sergio-sastre/ComposablePreviewScanner) library - **Manual Integration Support**: For those who prefer more control, we've added helper functions to manually integrate Compose Preview screenshot tests. #### How to Use To enable Compose Preview screenshot test generation, add the following to your `build.gradle.kts`: ```kotlin roborazzi { generateComposePreviewRobolectricTests { enable = true } } ``` After configuration, run the `recordRoborazziDebug` task to generate screenshots using the newly created tests. #### Customization Options Customize your setup with options like: - Specifying package names to scan - Defining a custom test class - Configuring Robolectric settings #### Manual Integration For manual integration, add the following dependency: ```kotlin testImplementation("io.github.takahirom.roborazzi:roborazzi-compose-preview-scanner-support:[version]") ``` Then use the `ComposablePreview<AndroidPreviewInfo>.captureRoboImage()` function in your tests. Note that `ComposablePreview` is a class provided by the [ComposablePreviewScanner](https://togithub.com/sergio-sastre/ComposablePreviewScanner) library, which Roborazzi utilizes for this feature. This approach allows for more fine-grained control over the screenshot capture process for Compose Previews. #### Acknowledgements Special thanks to [@​yschimke](https://togithub.com/yschimke) for the initial proposal, and to [@​sergio-sastre](https://togithub.com/sergio-sastre) and [@​yschimke](https://togithub.com/yschimke) for their valuable design and code reviews. For more detailed information on setup and usage, please visit our [documentation](https://takahirom.github.io/roborazzi/preview-support.html). ### Enhanced Accessibility Text Capture Thanks to [@​lukas-mercari](https://togithub.com/lukas-mercari) 's contribution, we've improved accessibility text dumping for merged Compose elements. Both content descriptions and text are now captured, providing more comprehensive accessibility information in tests. ![image](https://togithub.com/user-attachments/assets/9b01a6b7-616b-46f8-bed8-cb2424eb9d17) #### What's Changed - \[roborazzi-idea-plugin] Fix: Icons are not shown in the new UI by [@​takahirom](https://togithub.com/takahirom) in [https://github.com/takahirom/roborazzi/pull/421](https://togithub.com/takahirom/roborazzi/pull/421) - \[CI]Wait for main to succeed for compare ci by [@​takahirom](https://togithub.com/takahirom) in [https://github.com/takahirom/roborazzi/pull/422](https://togithub.com/takahirom/roborazzi/pull/422) - \[CI] Remove main push trigger from compare ci by [@​takahirom](https://togithub.com/takahirom) in [https://github.com/takahirom/roborazzi/pull/423](https://togithub.com/takahirom/roborazzi/pull/423) - \[CI] Add unit test for WebAssets class by [@​eyedol](https://togithub.com/eyedol) in [https://github.com/takahirom/roborazzi/pull/412](https://togithub.com/takahirom/roborazzi/pull/412) - \[Sample]Update dependency androidx.compose.foundation:foundation to v1.6.8 by [@​renovate](https://togithub.com/renovate) in [https://github.com/takahirom/roborazzi/pull/340](https://togithub.com/takahirom/roborazzi/pull/340) - \[Bug fixes] Dump both content description as well as text for the case when two elements are merged by [@​lukas-mercari](https://togithub.com/lukas-mercari) in [https://github.com/takahirom/roborazzi/pull/430](https://togithub.com/takahirom/roborazzi/pull/430) - \[Improvement] Add roborazzi-compose-preview-scanner-support module to handle preview settings by [@​takahirom](https://togithub.com/takahirom) in [https://github.com/takahirom/roborazzi/pull/427](https://togithub.com/takahirom/roborazzi/pull/427) - \[Feature] Implement generateRobolectricPreviewTests prototype by [@​takahirom](https://togithub.com/takahirom) in [https://github.com/takahirom/roborazzi/pull/416](https://togithub.com/takahirom/roborazzi/pull/416) **Full Changelog**: takahirom/roborazzi@1.21.0...1.22.0 </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), 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 these updates 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/chrisbanes/haze). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy40MjUuMSIsInVwZGF0ZWRJblZlciI6IjM3LjQzMS40IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119--> Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [io.github.takahirom.roborazzi](https://togithub.com/takahirom/roborazzi) | plugin | minor | `1.21.0` -> `1.22.2` | | [io.github.takahirom.roborazzi:roborazzi-junit-rule](https://togithub.com/takahirom/roborazzi) | dependencies | minor | `1.21.0` -> `1.22.2` | | [io.github.takahirom.roborazzi:roborazzi-compose](https://togithub.com/takahirom/roborazzi) | dependencies | minor | `1.21.0` -> `1.22.2` | | [io.github.takahirom.roborazzi:roborazzi](https://togithub.com/takahirom/roborazzi) | dependencies | minor | `1.21.0` -> `1.22.2` | --- > [!WARNING] > Some dependencies could not be looked up. Check the Dependency Dashboard for more information. --- ### Release Notes <details> <summary>takahirom/roborazzi (io.github.takahirom.roborazzi)</summary> ### [`v1.22.2`](https://togithub.com/takahirom/roborazzi/releases/tag/1.22.2) [Compare Source](https://togithub.com/takahirom/roborazzi/compare/1.22.1...1.22.2) ##### Notice [RobolectricPreviewTest and roborazzi.generateComposePreviewRobolectricTests.customTestQualifiedClassName](https://takahirom.github.io/roborazzi/preview-support.html#customizing-the-preview-screenshot-test) are used for customizing [Experimental Compose Preview Support](https://takahirom.github.io/roborazzi/preview-support.html). However, the name and class signature of RobolectricPreviewTest will be changed in a future release(not in 1.22.2) to support the Compose Multiplatform Preview Annotation. ##### Bug fixes We didn't have integration tests for [Experimental Compose Preview Support](https://takahirom.github.io/roborazzi/preview-support.html), so we added them. In KMP projects, we used to check only `testImplementation` (androidUnitTest.dependencies.implementation is used for KMP Android Unit tests), and the verification for generateComposePreviewRobolectricTests{} was failing. Therefore, we have added integration tests and fixed the behavior for KMP projects. ##### What's Changed - Refactor Roborazzi integration tests to support multiple modules by [@​takahirom](https://togithub.com/takahirom) in [https://github.com/takahirom/roborazzi/pull/434](https://togithub.com/takahirom/roborazzi/pull/434) - Fix warning of RoborazziPreviewParameterizedTests by [@​takahirom](https://togithub.com/takahirom) in [https://github.com/takahirom/roborazzi/pull/436](https://togithub.com/takahirom/roborazzi/pull/436) - Fix GenerateRobolectricComposePreviewTests to support KMP by [@​takahirom](https://togithub.com/takahirom) in [https://github.com/takahirom/roborazzi/pull/435](https://togithub.com/takahirom/roborazzi/pull/435) **Full Changelog**: takahirom/roborazzi@1.22.1...1.22.2 ### [`v1.22.1`](https://togithub.com/takahirom/roborazzi/releases/tag/1.22.1) [Compare Source](https://togithub.com/takahirom/roborazzi/compare/1.22.0...1.22.1) ##### Bug fixes We've released Experimental Compose Preview Support in [1.22.0](https://togithub.com/takahirom/roborazzi/releases/tag/1.22.0). In this release, we are going to include a bug fix for it. The strategy of `generateComposePreviewRobolectricTests{}` is not to modify settings automatically, but to verify that the user settings are correct. This allows our settings to be the single source of truth. However, the assertion had some bugs, so I fixed them. ##### What's Changed - \[Roborazzi Idea Plugin] Generate Roborazzi images via its IntelliJ Plugin by [@​eyedol](https://togithub.com/eyedol) in [https://github.com/takahirom/roborazzi/pull/429](https://togithub.com/takahirom/roborazzi/pull/429) (We will address this topic in a future release) - \[Bug fixes] Fix assertions in Automated Test Generation for Experimental Compose Preview Support by [@​takahirom](https://togithub.com/takahirom) in [https://github.com/takahirom/roborazzi/pull/432](https://togithub.com/takahirom/roborazzi/pull/432) **Full Changelog**: takahirom/roborazzi@1.22.0...1.22.1 ### [`v1.22.0`](https://togithub.com/takahirom/roborazzi/releases/tag/1.22.0) [Compare Source](https://togithub.com/takahirom/roborazzi/compare/1.21.0...1.22.0) ##### Experimental Compose Preview Support 🚀 We're excited to announce the experimental release of [Compose Preview Support for Roborazzi](https://takahirom.github.io/roborazzi/preview-support.html), a powerful new feature that streamlines the process of generating screenshot tests for Jetpack Compose Previews. ##### Key Features - **Automated Test Generation**: Automatically generate screenshot tests for Composable Previews using the [ComposablePreviewScanner](https://togithub.com/sergio-sastre/ComposablePreviewScanner) library - **Manual Integration Support**: For those who prefer more control, we've added helper functions to manually integrate Compose Preview screenshot tests. ##### How to Use To enable Compose Preview screenshot test generation, add the following to your `build.gradle.kts`: ```kotlin roborazzi { generateComposePreviewRobolectricTests { enable = true } } ``` After configuration, run the `recordRoborazziDebug` task to generate screenshots using the newly created tests. ##### Customization Options Customize your setup with options like: - Specifying package names to scan - Defining a custom test class - Configuring Robolectric settings ##### Manual Integration For manual integration, add the following dependency: ```kotlin testImplementation("io.github.takahirom.roborazzi:roborazzi-compose-preview-scanner-support:[version]") ``` Then use the `ComposablePreview<AndroidPreviewInfo>.captureRoboImage()` function in your tests. Note that `ComposablePreview` is a class provided by the [ComposablePreviewScanner](https://togithub.com/sergio-sastre/ComposablePreviewScanner) library, which Roborazzi utilizes for this feature. This approach allows for more fine-grained control over the screenshot capture process for Compose Previews. ##### Acknowledgements Special thanks to [@​yschimke](https://togithub.com/yschimke) for the initial proposal, and to [@​sergio-sastre](https://togithub.com/sergio-sastre) and [@​yschimke](https://togithub.com/yschimke) for their valuable design and code reviews. For more detailed information on setup and usage, please visit our [documentation](https://takahirom.github.io/roborazzi/preview-support.html). ##### Enhanced Accessibility Text Capture Thanks to [@​lukas-mercari](https://togithub.com/lukas-mercari) 's contribution, we've improved accessibility text dumping for merged Compose elements. Both content descriptions and text are now captured, providing more comprehensive accessibility information in tests. ![image](https://togithub.com/user-attachments/assets/9b01a6b7-616b-46f8-bed8-cb2424eb9d17) ##### What's Changed - \[roborazzi-idea-plugin] Fix: Icons are not shown in the new UI by [@​takahirom](https://togithub.com/takahirom) in [https://github.com/takahirom/roborazzi/pull/421](https://togithub.com/takahirom/roborazzi/pull/421) - \[CI]Wait for main to succeed for compare ci by [@​takahirom](https://togithub.com/takahirom) in [https://github.com/takahirom/roborazzi/pull/422](https://togithub.com/takahirom/roborazzi/pull/422) - \[CI] Remove main push trigger from compare ci by [@​takahirom](https://togithub.com/takahirom) in [https://github.com/takahirom/roborazzi/pull/423](https://togithub.com/takahirom/roborazzi/pull/423) - \[CI] Add unit test for WebAssets class by [@​eyedol](https://togithub.com/eyedol) in [https://github.com/takahirom/roborazzi/pull/412](https://togithub.com/takahirom/roborazzi/pull/412) - \[Sample]Update dependency androidx.compose.foundation:foundation to v1.6.8 by [@​renovate](https://togithub.com/renovate) in [https://github.com/takahirom/roborazzi/pull/340](https://togithub.com/takahirom/roborazzi/pull/340) - \[Bug fixes] Dump both content description as well as text for the case when two elements are merged by [@​lukas-mercari](https://togithub.com/lukas-mercari) in [https://github.com/takahirom/roborazzi/pull/430](https://togithub.com/takahirom/roborazzi/pull/430) - \[Improvement] Add roborazzi-compose-preview-scanner-support module to handle preview settings by [@​takahirom](https://togithub.com/takahirom) in [https://github.com/takahirom/roborazzi/pull/427](https://togithub.com/takahirom/roborazzi/pull/427) - \[Feature] Implement generateRobolectricPreviewTests prototype by [@​takahirom](https://togithub.com/takahirom) in [https://github.com/takahirom/roborazzi/pull/416](https://togithub.com/takahirom/roborazzi/pull/416) **Full Changelog**: takahirom/roborazzi@1.21.0...1.22.0 </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about these updates again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://togithub.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy40MzEuNCIsInVwZGF0ZWRJblZlciI6IjM3LjQzMi4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->
Fixes #424
Initial implementation to solicit early feedback...