Skip to content

Add types for actionmailbox v8.1 - #1095

Open
amatsuda wants to merge 21 commits into
ruby:mainfrom
amatsuda:actionmailbox-8.1
Open

amatsuda wants to merge 21 commits into
ruby:mainfrom
amatsuda:actionmailbox-8.1

Conversation

@amatsuda

Copy link
Copy Markdown
Member

Adds signatures for actionmailbox 8.1, based on 8.1.4. This is a new gem in this repository.

This PR is stacked on #1093 (activestorage 8.1), which is stacked on #1090 (activejob 8.1), because actionmailbox 8.1 needs their signatures. Until they are merged, their commits show up here too. The commits for this PR are the ones starting with actionmailbox:.

The reviewers are the same as activerecord's, and actionmailbox is added to the target gems listed in the README of the Rails gems. The RuboCop config enables the strict cops.

How it is made

actionmailbox-generated.rbs comes from rbs prototype rb run on lib and app, then post-processed the same way as the other Rails 8.1 gems:

  • Drop members that core, dependencies, or the hand-written RBS already define
  • Fill missing type arguments of generic classes with untyped
  • Add accessors defined with class_attribute, mattr_accessor, and cattr_accessor, and methods defined with delegate
  • Generate the methods defined inside class_methods do ... end as the concern's ClassMethods, which rbs prototype skips, so mailboxes have routing and before_processing
  • Make the classes extend the ClassMethods of the concerns they include, directly or through other concerns, as ActiveSupport::Concern does
  • Declare the namespaces that Zeitwerk defines for the controllers in app (ActionMailbox::Ingresses::Mailgun, Rails::Conductor, ...)

The generators in lib/generators and lib/rails are left out, since their superclasses come from railties, which actionmailbox doesn't depend on.

Methods the generator doesn't see

The columns of ActionMailbox::InboundEmail (status, message_id, ...), the methods of its status enum (delivered?, bounced!, ...), and its raw_email attachment. The model is in the gem, so apps' generated model signatures don't have them.

Return types

A mailbox's inbound_email and mail, and InboundEmail#mail, source, and processed?.

Optional blocks

All required blocks were checked against the source, and 5 were made optional: before_processing, after_processing, and around_processing with method names, and create_inbound_email_from_mail and receive_inbound_email_from_mail, which build the mail from keyword arguments without one.

Tests

Each commit that changes types adds tests that fail without it. bin/test gems/actionmailbox/8.1 and RuboCop's strict cops pass on every commit from the generation commit onward.

🤖 Generated with Claude Code

amatsuda and others added 20 commits October 13, 2026 18:59
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Generated with `rbs prototype rb` from the activejob 8.1.4 source and
post-processed the same way as the other Rails 8.1 gems: drop members
already defined elsewhere, fill missing type arguments, add accessors
defined with class_attribute, mattr_accessor, and cattr_accessor, add
methods defined with delegate, and carry over typed signatures from 6.0
where the method still has the same parameters.

The job generator in lib/rails is left out, as its superclass comes from
railties, which activejob doesn't depend on.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Rails no longer has QueAdapter or SuckerPunchAdapter, so nothing refers
to Que::Job or SuckerPunch::Job.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Logging defines them on the job class with cattr_accessor and
class_attribute in its included block, which rbs prototype doesn't see.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
job_id, arguments, executions, queue_name, priority, and the other job
attributes, enqueue, and perform_later, which returns the job or false
when it couldn't be enqueued.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
rbs prototype marks a block as required unless the method checks it.
These forward the block or don't use it: the callbacks with method names
(before_perform :foo), assert_no_enqueued_jobs and
assert_no_performed_jobs without a block, and a few internal methods.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…:Base

ActiveJob::Callbacks and ActiveJob::Exceptions include
ActiveSupport::Callbacks and ActiveSupport::Rescuable, so job classes
have rescue_from and set_callback.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
7.0 had only hand-written signatures. 8.1 adds signatures generated with
`rbs prototype rb` from the activestorage 8.1.4 lib and app sources and
post-processed the same way as the other Rails 8.1 gems: drop members
already defined elsewhere, fill missing type arguments, and add
accessors defined with class_attribute, mattr_accessor, and
cattr_accessor and methods defined with delegate. Methods defined
inside `class_methods do ... end` are generated as the concern's
ClassMethods.

ActiveStorage::Blobs and ActiveStorage::Representations, which Zeitwerk
defines for the controllers in app, are declared as modules.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
They were deprecated in 6.1 and removed in 7.0.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- has_one_attached and has_many_attached take a block to declare named
  variants, which yields the attachment reflection
- The reflections inherit HasAttachedReflection, which has variant and
  named_variants
- Blob#signed_id takes purpose:, expires_in:, and expires_at:, and
  returns a String

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
They're defined by the active_storage_blobs and
active_storage_attachments tables and belongs_to/has_many, which rbs
prototype doesn't see, and the models are in the gem, so apps' generated
model signatures don't have them.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
key, filename, url, the content type predicates, and the direct upload
URL and headers of Blob, and the parts of Filename.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
rbs prototype marks a block as required unless the method checks it.
Variant#download and Preview#download pass the block to the service,
and return the content when called without one, like Blob#download. The
instrument methods pass it to ActiveSupport::Notifications.instrument.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
… classes include

The generated classes now extend the ClassMethods of the concerns they
include, directly or through other concerns, as ActiveSupport::Concern
does. FixtureSet gets generate_unique_secure_token, for example.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The reviewers are the same as activerecord's, and actionmailbox is added
to the target gems listed in the README of the Rails gems.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Generated with `rbs prototype rb` from the actionmailbox 8.1.4 lib and
app sources and post-processed the same way as the other Rails 8.1 gems:
drop members already defined elsewhere, fill missing type arguments, add
accessors defined with class_attribute, mattr_accessor, and
cattr_accessor and methods defined with delegate, generate the methods
defined inside `class_methods do ... end` as the concern's ClassMethods,
and make the classes extend the ClassMethods of the concerns they
include. The namespaces that Zeitwerk defines for the controllers in app
(ActionMailbox::Ingresses::Mailgun, Rails::Conductor, ...) are declared
as modules.

The generators in lib/generators and lib/rails are left out, as their
superclasses come from railties, which actionmailbox doesn't depend on.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…Email

They're defined by the action_mailbox_inbound_emails table, enum, and
has_one_attached, which rbs prototype doesn't see, and the model is in
the gem, so apps' generated model signatures don't have them.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
A mailbox's inbound_email and mail, and InboundEmail's mail, source, and
processed?.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
rbs prototype marks a block as required unless the method checks it.
before_processing, after_processing, and around_processing take method
names, and create_inbound_email_from_mail and
receive_inbound_email_from_mail pass the block to Mail.new, which builds
the mail from the keyword arguments without one.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown

@amatsuda Thanks for your contribution!

Please follow the instructions below for each change.
See also: https://github.com/ruby/gem_rbs_collection/blob/main/docs/CONTRIBUTING.md

Available commands

You can use the following commands by commenting on this PR.

  • /merge: Merge this PR if CI passes

actioncable

You changed RBS files for an existing gem.
You need to get approval from the reviewers of this gem.

@ksss, @tk0miya, please review this pull request.
If this change is acceptable, please make a review comment including APPROVE from here.
Screen Shot 2024-03-19 at 14 13 36

After that, the PR author or the reviewers can merge this PR.
Just comment /merge to merge this PR.


actionmailbox

This RBS files are newly added.

You can merge this PR immediately if the CI passes.
Just comment /merge to merge this PR.


actionmailer

You changed RBS files for an existing gem.
You need to get approval from the reviewers of this gem.

@ksss, @ydah, @tk0miya, please review this pull request.
If this change is acceptable, please make a review comment including APPROVE from here.
Screen Shot 2024-03-19 at 14 13 36

After that, the PR author or the reviewers can merge this PR.
Just comment /merge to merge this PR.


actionpack

You changed RBS files for an existing gem.
You need to get approval from the reviewers of this gem.

@ksss, @tk0miya, please review this pull request.
If this change is acceptable, please make a review comment including APPROVE from here.
Screen Shot 2024-03-19 at 14 13 36

After that, the PR author or the reviewers can merge this PR.
Just comment /merge to merge this PR.


actiontext

You changed RBS files for an existing gem.
You need to get approval from the reviewers of this gem.

@tk0miya, @ksss, please review this pull request.
If this change is acceptable, please make a review comment including APPROVE from here.
Screen Shot 2024-03-19 at 14 13 36

After that, the PR author or the reviewers can merge this PR.
Just comment /merge to merge this PR.


actionview

You changed RBS files for an existing gem.
You need to get approval from the reviewers of this gem.

@ksss, @ydah, @tk0miya, please review this pull request.
If this change is acceptable, please make a review comment including APPROVE from here.
Screen Shot 2024-03-19 at 14 13 36

After that, the PR author or the reviewers can merge this PR.
Just comment /merge to merge this PR.


activejob

You changed RBS files for an existing gem.
You need to get approval from the reviewers of this gem.

@ksss, @tk0miya, please review this pull request.
If this change is acceptable, please make a review comment including APPROVE from here.
Screen Shot 2024-03-19 at 14 13 36

After that, the PR author or the reviewers can merge this PR.
Just comment /merge to merge this PR.


activemodel

You changed RBS files for an existing gem.
You need to get approval from the reviewers of this gem.

@hibariya, @ksss, @tk0miya, please review this pull request.
If this change is acceptable, please make a review comment including APPROVE from here.
Screen Shot 2024-03-19 at 14 13 36

After that, the PR author or the reviewers can merge this PR.
Just comment /merge to merge this PR.


activerecord

You changed RBS files for an existing gem.
You need to get approval from the reviewers of this gem.

@hibariya, @ksss, @Little-Rubyist, @tk0miya, please review this pull request.
If this change is acceptable, please make a review comment including APPROVE from here.
Screen Shot 2024-03-19 at 14 13 36

After that, the PR author or the reviewers can merge this PR.
Just comment /merge to merge this PR.


activestorage

You changed RBS files for an existing gem.
You need to get approval from the reviewers of this gem.

@ksss, @tk0miya, please review this pull request.
If this change is acceptable, please make a review comment including APPROVE from here.
Screen Shot 2024-03-19 at 14 13 36

After that, the PR author or the reviewers can merge this PR.
Just comment /merge to merge this PR.


activesupport

You changed RBS files for an existing gem.
You need to get approval from the reviewers of this gem.

@hibariya, @ksss, @ydah, @tk0miya, please review this pull request.
If this change is acceptable, please make a review comment including APPROVE from here.
Screen Shot 2024-03-19 at 14 13 36

After that, the PR author or the reviewers can merge this PR.
Just comment /merge to merge this PR.


railties

You changed RBS files for an existing gem.
You need to get approval from the reviewers of this gem.

@ksss, @tk0miya, please review this pull request.
If this change is acceptable, please make a review comment including APPROVE from here.
Screen Shot 2024-03-19 at 14 13 36

After that, the PR author or the reviewers can merge this PR.
Just comment /merge to merge this PR.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

This file contains the names mechanically assigned to reviewers, as well as an indication of the intention to conduct a review, the declaration of which is left up to the individual.
I have the intention to review, but I do not know about others.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants