Repository navigation
Add types for activestorage v8.1 - #1093
Conversation
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>
|
@amatsuda Thanks for your contribution! Please follow the instructions below for each change. Available commandsYou can use the following commands by commenting on this PR.
|
|
/merge |

Adds signatures for activestorage 8.1, based on 8.1.4.
This PR is stacked on #1090 (activejob 8.1), because activestorage 8.1 needs activejob 8.1's signatures. Until that is merged, its commits show up here too. The commits for this PR are the ones starting with
activestorage:.The latest version in this repository was activestorage 7.0, which had hand-written signatures for the attachment API and some models. This PR adds signatures generated from the 8.1.4 source and carries over the hand-written ones.
How it is made
activestorage-generated.rbscomes fromrbs prototype rbrun onlibandapp(models, jobs, controllers), then post-processed the same way as the other Rails 8.1 gems:untypedclass_attribute,mattr_accessor, andcattr_accessor, and methods defined withdelegateclass_methods do ... endas the concern'sClassMethods, whichrbs prototypeskipsActiveStorage::BlobsandActiveStorage::Representations, which Zeitwerk defines for the controllers inappClassMethodsof the concerns they include, directly or through other concerns, asActiveSupport::ConcerndoesChanges to the hand-written RBS
The first commit copies 7.0's hand-written files unchanged, so the following commits show only the 8.1-specific changes:
Blob.build_after_uploadandBlob#service_url, which were deprecated in 6.1 and removed in 7.0has_one_attachedandhas_many_attachedtake a block to declare named variants (attachable.variant :thumb, ...)HasAttachedReflection, which hasvariantandnamed_variantsBlob#signed_idtakespurpose:,expires_in:, andexpires_at:Methods the generator doesn't see
The columns and associations of
Blob(content_type,byte_size,checksum,metadata, ...) andAttachment(name,blob,record, ...). They come from the tables andbelongs_to/has_many, and these models are in the gem, so apps' generated model signatures (e.g. rbs_rails) don't have them.Return types
Blob#key,filename,url,image?/audio?/video?/text?, the direct upload URL and headers, and the parts ofActiveStorage::Filename.Optional blocks
All required blocks were checked against the source, and 5 were made optional:
Variant#downloadandPreview#download, which return the content without a block likeBlob#download, and theinstrumentmethods.Tests
Each commit that changes types adds tests that fail without it.
bin/test gems/activestorage/8.1passes on every commit from the generation commit onward.🤖 Generated with Claude Code