1
0
mirror of https://github.com/jbranchaud/til synced 2026-01-20 07:28:02 +00:00

Compare commits

..

2 Commits

Author SHA1 Message Date
jbranchaud
ddf1c51fd9 Add Filter ActiveStorage Blobs To Only Images as a Rails TIL 2025-03-08 16:18:44 -06:00
jbranchaud
60020d6e0e Add Preserve Color Output For Task Command as a Mise TIL 2025-03-08 16:07:39 -06:00
3 changed files with 78 additions and 1 deletions

View File

@@ -10,7 +10,7 @@ pairing with smart people at Hashrocket.
For a steady stream of TILs, [sign up for my newsletter](https://crafty-builder-6996.ck.page/e169c61186).
_1610 TILs and counting..._
_1612 TILs and counting..._
See some of the other learning resources I work on:
- [Ruby Operator Lookup](https://www.visualmode.dev/ruby-operators)
@@ -692,6 +692,7 @@ If you've learned something here, support my efforts writing daily TILs by
### Mise
- [List The Files Being Loaded By Mise](mise/list-the-files-being-loaded-by-mise.md)
- [Preserve Color Output For Task Command](mise/preserve-color-output-for-task-command.md)
- [Read Existing Dot Env File Into Env Vars](mise/read-existing-dot-env-file-into-env-vars.md)
### MongoDB
@@ -1021,6 +1022,7 @@ If you've learned something here, support my efforts writing daily TILs by
- [Ensure A Rake Task Cannot Write Data](rails/ensure-a-rake-task-cannot-write-data.md)
- [Ensure Migrations Use The Latest Schema](rails/ensure-migrations-use-the-latest-schema.md)
- [Ensure Record Saved With after_commit Callback](rails/ensure-record-saved-with-after-commit-callback.md)
- [Filter ActiveStorage Blobs To Only Images](rails/filter-active-storage-blobs-to-only-images.md)
- [Find Or Create A Record With FactoryBot](rails/find-or-create-a-record-with-factory-bot.md)
- [Find Records With Multiple Associated Records](rails/find-records-with-multiple-associated-records.md)
- [Force All Users To Sign Out](rails/force-all-users-to-sign-out.md)

View File

@@ -0,0 +1,45 @@
# Preserve Color Output For Task Command
I decided to wrap a couple test running commands for a project into a single
`test:all` mise task. It looked something like this:
```toml
[tasks."test:all"]
run = """
bundle exec rspec
yarn test run
"""
description = "Run all tests (RSpec and Vitest)"
depends = ["bundle-install", "node-install"]
```
I can run this with `mise run test:all` and it works. However, there is a
glaring issue that immediately juts out. All of the test runner output is
uncolored text. I'm used to and strongly prefer greens (passes), reds (fails),
and yellows (skips) of test runner output.
The test runners lose the text coloring when run through `mise` because they
believe they are not running in _interactive_ mode.
The [`expect`](https://linux.die.net/man/1/expect) tools (`brew install
expect`) install with another binary called
[`unbuffer`](https://linux.die.net/man/1/unbuffer). `unbuffer` can coerce a
command to run in interactive mode. Prepending these test runner commands with
`unbuffer` will preserve the colors as the results are output to the terminal.
Here is the update `test:all` task:
```toml
[tasks."test:all"]
run = """
unbuffer bundle exec rspec
unbuffer yarn test run
"""
description = "Run all tests (RSpec and Vitest)"
depends = ["bundle-install", "node-install"]
```
For some commands, it seems able to stream out (rather than _buffer_) the
results (e.g. with `vitest`). Whereas with `rspec`, the test suite runs to
completion and is then output to the terminal. I'm still investigating
streaming the `rspec` results.

View File

@@ -0,0 +1,30 @@
# Filter ActiveStorage Blobs To Only Images
If your Rails app is using `ActiveStorage` for both images and ActionMailbox
emails, then you're going to have a mix of both in the `active_storage_blobs`
table.
```sql
> select id, filename, content_type from active_storage_blobs limit 2;
| id | filename | content_type |
|----|--------------------|----------------|
| 1 | shirt-brothers.jpg | image/jpeg |
| 2 | message.eml | message/rfc822 |
```
In that case, you are going to want to make sure that any part of your system
that only cares to deal with images filters down to only blobs where the
`content_type` is one that you care about.
I expect that there might be a couple different image `content_type` values
that my system handles, so I filter my `active_storage_blobs` like so:
```ruby
@images =
ActiveStorage::Blob
.where(content_type: %w[image/jpeg image/png image/gif image/webp])
.order(created_at: :desc)
.first(10)
```