Prepare 5.0.0 release#159
Conversation
… support - Align uploadcare-rails with uploadcare-ruby v5 APIs and signatures\n- Add migration guide and update README/changelog for v5 release\n- Introduce ActiveStorage::Service::UploadcareService and specs\n- Add optional per-call config support plus mount/job wiring for multi-config use\n- Update CI matrix and Gemfiles for modern Rails/Ruby targets\n- Point uploadcare-ruby git dependency to branch v2-rewrite-2 for CI resolution
- Remove old gemfiles for Rails 7.0, 7.1, and main\n- Add gemfiles/Gemfile-rails-8-1\n- Set CI matrix to run only 7.2, 8.0, 8.1 across Ruby 3.3/3.4/4.0\n- Relax batch file API expectations to support v2-rewrite-2 response shape in matrix runs
Integrate Uploadcare-backed ActiveStorage behavior into the gem so apps can use standard Rails APIs (preview and variant) without custom helpers. - auto-register Uploadcare PDF previewer in engine initialization - prepend remote variant processing for Uploadcare service blobs - map Rails-style resize_to_limit/resize_to_fill to Uploadcare transformations - add integration, previewer, and variant processing specs - document ActiveStorage integration usage in README
Center the gem on explicit Uploadcare::Client instances instead of the old wrapper API layer (FileApi, GroupApi, UploadApi, etc.). This is the architectural change needed to align with uploadcare-ruby gem-rewrite-3. Key changes: - Add Uploadcare::Rails.client as the central client resolver with support for default global client and per-call overrides - Remove all 10 wrapper API files (FileApi, GroupApi, ProjectApi, WebhookApi, ConversionApi, FileMetadataApi, AddonsApi, UploadApi, and their base classes) - Rewrite File and Group as standalone decorators instead of SDK resource subclasses, each carrying client context - Rename mount macros to has_uploadcare_file / has_uploadcare_files with uploadcare_client: option (old names kept as aliases) - Fix multi-account bugs: mounts, jobs, Active Storage previewer, and variant processing all resolve and carry client context - Active Storage service now owns @client, previewer and variant processing access it via blob.service.client - Jobs reconstruct client from serialized config.to_h - Replace do_not_store with store_files_after_save - Point all Gemfiles to gem-rewrite-3 branch, remove local path fallback - Strip configuration to Rails-only concerns - Add f.uploadcare_file_field with uploadcare_file as alias
1. Group store now actually persists files: fetches the group to get file UUIDs, then calls client.files.batch_store. Previously it only called client.groups.find which is read-only. Fixed in the Group wrapper, both mount callbacks (AR + Mongoid), and StoreGroupJob. 2. Group delete restored: delegates to the SDK resource's delete method via client.groups.find(group_id:).delete. 3. File and Group initialization now uses attributes.key? instead of truthiness check, so false-valued booleans (is_image: false, is_ready: false) are preserved instead of silently dropped as nil. Specs updated to assert actual batch_store calls and boolean preservation.
WalkthroughMajor v5 refactor: CI/docs and gemspec updates; YAML/credentials-backed configuration and client factory; new ActionView uploader helpers and internal tag builders; Uploadcare ActiveStorage service with preview/variant support; new attachment wrappers, model macros, hooks, and jobs; legacy REST wrapper removal; extensive tests updated/added. ChangesRails v5 client-first refactor and integrations
sequenceDiagram
participant Variant as ActiveStorage::Variant
participant Service as ActiveStorage::Service::UploadcareService
participant CDN as Uploadcare CDN
Variant->>Service: process -> build source URL (uuid)
Service->>CDN: GET transformed image URL
CDN-->>Service: HTTP response (image bytes)
Service->>Variant: upload(bytes) -> store variant in ActiveStorage
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Possibly related PRs
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
|
There was a problem hiding this comment.
Actionable comments posted: 7
🧹 Nitpick comments (6)
spec/uploadcare/rails/action_view/uploadcare_include_tags_spec.rb (1)
106-110: ⚡ Quick winAdd a negative test for invalid
versioninuploadcare_stylesheet_tag.You already assert invalid
solution; mirroring invalidversioncoverage will lock down the new version validator path too.Suggested spec addition
it 'rejects unsupported stylesheet solutions' do expect do uploadcare_stylesheet_tag(solution: 'evil') end.to raise_error(ArgumentError, /solution/) end + + it 'rejects unsupported stylesheet versions' do + expect do + uploadcare_stylesheet_tag(version: '../evil') + end.to raise_error(ArgumentError, /version/) + end🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@spec/uploadcare/rails/action_view/uploadcare_include_tags_spec.rb` around lines 106 - 110, Add a negative test mirroring the existing invalid-solution spec to assert uploadcare_stylesheet_tag rejects invalid versions: create an example in the same spec that calls uploadcare_stylesheet_tag(version: 'bad') (or other clearly invalid value) inside an expect { ... }.to raise_error(ArgumentError, /version/), referencing the uploadcare_stylesheet_tag helper to exercise the version validation path.spec/uploadcare/rails/jobs/store_file_job_spec.rb (1)
26-33: ⚡ Quick winRemove duplicate test.
This test is identical to lines 17-24. The only difference is "default client" vs "the default client" in the description. Duplicate tests add maintenance burden without improving coverage.
♻️ Proposed fix to remove the duplicate
- it 'stores a file using the default client' do - files_accessor = double - client = double(files: files_accessor) - allow(Uploadcare::Rails).to receive(:client).and_return(client) - expect(files_accessor).to receive(:batch_store).with(uuids: [ 'file-uuid' ]) - - described_class.new.perform('file-uuid') - end -🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@spec/uploadcare/rails/jobs/store_file_job_spec.rb` around lines 26 - 33, The spec contains a duplicate example of the same behavior: remove the redundant "stores a file using the default client" test (the second identical example testing described_class.new.perform('file-uuid') and expecting files_accessor.batch_store with uuids: ['file-uuid']) so only one test remains; locate the example that stubs Uploadcare::Rails.client and uses files_accessor and delete that duplicate block to avoid redundant specs.spec/uploadcare/rails/jobs/store_group_job_spec.rb (1)
29-39: ⚡ Quick winRemove duplicate test.
This test is redundant with lines 17-27. Both verify that the job fetches a group and batch-stores its files using the default client. The variation in file count (1 vs 2 files) doesn't add meaningful coverage since the file extraction logic is already tested separately in lines 41-52.
♻️ Proposed fix to remove the duplicate
- it 'fetches group and batch-stores using the default client' do - group_resource = double(files: [ { 'uuid' => 'f1' } ]) - groups_accessor = double - files_accessor = double - client = double(groups: groups_accessor, files: files_accessor) - allow(Uploadcare::Rails).to receive(:client).and_return(client) - allow(groups_accessor).to receive(:find).with(group_id: 'group-id').and_return(group_resource) - expect(files_accessor).to receive(:batch_store).with(uuids: %w[f1]) - - described_class.new.perform('group-id') - end -🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@spec/uploadcare/rails/jobs/store_group_job_spec.rb` around lines 29 - 39, Remove the redundant example block that duplicates the earlier test: delete the "it 'fetches group and batch-stores using the default client'" example (the one that sets group_resource = double(files: [ { 'uuid' => 'f1' } ]) and stubs Uploadcare::Rails.client, groups_accessor.find, and expects files_accessor.batch_store) since the earlier example already verifies described_class.new.perform('group-id') calls files_accessor.batch_store; keep the original test and ensure groups_accessor, files_accessor, and the perform invocation remain covered by the existing spec.spec/uploadcare/rails/jobs/delete_file_job_spec.rb (1)
26-33: ⚡ Quick winRemove duplicate test.
This test is identical to lines 17-24. The only difference is "default client" vs "the default client" in the description. Duplicate tests add maintenance burden without improving coverage.
♻️ Proposed fix to remove the duplicate
- it 'deletes a file using the default client' do - files_accessor = double - client = double(files: files_accessor) - allow(Uploadcare::Rails).to receive(:client).and_return(client) - expect(files_accessor).to receive(:batch_delete).with(uuids: [ 'file-uuid' ]) - - described_class.new.perform('file-uuid') - end -🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@spec/uploadcare/rails/jobs/delete_file_job_spec.rb` around lines 26 - 33, Remove the duplicate RSpec example that tests deletion via the default client: delete the "it 'deletes a file using the default client' do" block that sets up files_accessor and client doubles, stubs Uploadcare::Rails.client, expects files_accessor to receive(:batch_delete).with(uuids: ['file-uuid']), and calls described_class.new.perform('file-uuid'); the earlier identical example (the one testing deletion with the default client, using the same doubles, expectation, and described_class.new.perform invocation) should remain and this redundant block should be removed.lib/uploadcare/rails/internal/id_extractor.rb (2)
10-14: ⚡ Quick winInconsistent nil vs empty string return behavior.
The method returns
nilwhen input is not present (line 11), but returns an empty string""when input is present but no UUID is matched (line 13, sincenil.to_sreturns""). This inconsistency may confuse callers who expect uniform nil-checking or truthiness checks.🔄 Suggested fix for consistent nil returns
def call(input_str, regex = UUID_REGEX) return unless input_str.present? - input_str.match(regex).to_s + input_str.match(regex)&.to_s endThis returns
nilwhen no match is found, making the behavior consistent with the early return.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@lib/uploadcare/rails/internal/id_extractor.rb` around lines 10 - 14, The method call currently returns nil when input_str is blank but returns an empty string when a regex match is absent (because match.to_s yields ""), causing inconsistent nil/empty behavior; update the implementation in the call method (which uses UUID_REGEX) to explicitly return nil when no match is found (e.g., capture the result of input_str.match(regex) and return nil if it's nil, otherwise return the matched string) so callers get consistent nil for "no UUID".
7-7: 💤 Low valueSimplify UUID regex by removing redundant word boundaries.
The regex includes
\bafter the first group ([0-9a-f]{8}\b-) and before the last group (-\b[0-9a-f]{12}). Since hyphens are non-word characters and hex digits are word characters, these boundaries are always present and the explicit\bchecks are redundant.♻️ Simplified regex
- UUID_REGEX = /\b[0-9a-f]{8}\b-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-\b[0-9a-f]{12}\b/ + UUID_REGEX = /\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b/iThe simplified pattern is more standard and easier to understand while maintaining the same matching behavior. (This also incorporates the case-insensitive flag from the previous comment.)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@lib/uploadcare/rails/internal/id_extractor.rb` at line 7, The UUID_REGEX contains redundant \b word-boundary anchors around hyphens; remove the \b occurrences and make the pattern case-insensitive so it remains correct and simpler. Update the UUID_REGEX constant (UUID_REGEX) to use a standard UUID pattern without the internal \b anchors and add the /i flag to match uppercase hex as well.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In @.github/workflows/gem-push.yml:
- Around line 45-51: The Configure RubyGems credentials step currently writes
~/.gem/credentials even if RUBYGEMS_API_KEY is empty; add an explicit non-empty
check for the RUBYGEMS_API_KEY environment variable at the start of that step
(e.g., test -n "$RUBYGEMS_API_KEY") and fail fast with an error message and
non-zero exit if it is missing, before creating the ~/.gem directory or writing
the credentials file so the workflow aborts with a clear message instead of
producing an opaque push failure.
In `@CHANGELOG.md`:
- Around line 17-18: Update the two markdown links that currently point to the
5-0-stable branch so they use a stable release tag or main; replace the
repository URLs referencing MIGRATING_V5.md and docs/release-notes-5.0.0.md that
include "blob/5-0-stable/..." with a permalink such as "blob/v5.0.0/..." (or
"blob/main/...") so the migration guide and release-notes links remain stable
after branch cleanup.
In `@lib/uploadcare/rails/attached_file.rb`:
- Around line 36-46: Add explicit precondition checks that raise a clear error
when uuid is blank before making any API calls: in the instance methods store
and delete, and in any code paths that construct an Uploadcare::Resources::File
or call resolve_client.files (the API load paths around the other file-loading
code at ~79-82), validate that uuid.present? (or !uuid.to_s.empty?) and raise a
descriptive ArgumentError (eg. "uuid must be present") so failures are fast and
clear; update the methods store, delete, and the file-loading helper to perform
this check at the top before constructing resources or calling resolve_client.
In `@lib/uploadcare/rails/attached_files.rb`:
- Around line 44-47: The group URL base may be blank or missing a trailing slash
which leads to malformed per-file URLs; update the URL normalization used by
file_urls (and the similar block around lines 98-100) so that map_file_urls /
group_file_url always operate on a normalized base: ensure cdn_url (or the
derived group base) is set to a non-empty string and ends with a single "/"
before concatenating per-file paths (or use a URL-joining helper) so generated
per-file URLs never collapse segments when cdn_url is blank or lacks a trailing
slash.
In `@lib/uploadcare/rails/internal/active_storage_service_helpers.rb`:
- Around line 58-61: The Range header generation in build_request incorrectly
uses range.end directly for exclusive ranges; update build_request
(Net::HTTP::Get creation) to detect exclusive ranges (range.exclude_end?) and
subtract 1 from range.end when exclusive so the HTTP Range uses inclusive
endpoints (e.g., end_pos = range.end - 1 if range.exclude_end? else range.end),
then set request["Range"] = "bytes=#{range.begin}-#{end_pos]" only when range is
present, ensuring end_pos stays >= range.begin.
In `@lib/uploadcare/rails/internal/client_resolver.rb`:
- Around line 8-15: The branch that handles client_or_options currently falls
through to the default client for unsupported types; instead, change the else
branch to raise a clear ArgumentError (or TypeError) when client_or_options is
not an Uploadcare::Client or Hash so callers can't silently operate against the
wrong account — update the case in client_resolver (the code handling
client_or_options, Uploadcare::Client, and the
client(**client_or_options.symbolize_keys) call) to raise an error with a
descriptive message including the actual class of client_or_options rather than
returning client.
In `@lib/uploadcare/rails/internal/uploader_field_helpers.rb`:
- Around line 163-165: The method uploadcare_file_group_attribute? should prefer
the actual bound object's class over constantizing object_name to avoid picking
the wrong model; change the model resolution to use object&.class first and fall
back to object_name.to_s.camelize.safe_constantize if object is nil, then
proceed with the existing has_uploadcare_files_for_*? detection logic using
method_name.
---
Nitpick comments:
In `@lib/uploadcare/rails/internal/id_extractor.rb`:
- Around line 10-14: The method call currently returns nil when input_str is
blank but returns an empty string when a regex match is absent (because
match.to_s yields ""), causing inconsistent nil/empty behavior; update the
implementation in the call method (which uses UUID_REGEX) to explicitly return
nil when no match is found (e.g., capture the result of input_str.match(regex)
and return nil if it's nil, otherwise return the matched string) so callers get
consistent nil for "no UUID".
- Line 7: The UUID_REGEX contains redundant \b word-boundary anchors around
hyphens; remove the \b occurrences and make the pattern case-insensitive so it
remains correct and simpler. Update the UUID_REGEX constant (UUID_REGEX) to use
a standard UUID pattern without the internal \b anchors and add the /i flag to
match uppercase hex as well.
In `@spec/uploadcare/rails/action_view/uploadcare_include_tags_spec.rb`:
- Around line 106-110: Add a negative test mirroring the existing
invalid-solution spec to assert uploadcare_stylesheet_tag rejects invalid
versions: create an example in the same spec that calls
uploadcare_stylesheet_tag(version: 'bad') (or other clearly invalid value)
inside an expect { ... }.to raise_error(ArgumentError, /version/), referencing
the uploadcare_stylesheet_tag helper to exercise the version validation path.
In `@spec/uploadcare/rails/jobs/delete_file_job_spec.rb`:
- Around line 26-33: Remove the duplicate RSpec example that tests deletion via
the default client: delete the "it 'deletes a file using the default client' do"
block that sets up files_accessor and client doubles, stubs
Uploadcare::Rails.client, expects files_accessor to
receive(:batch_delete).with(uuids: ['file-uuid']), and calls
described_class.new.perform('file-uuid'); the earlier identical example (the one
testing deletion with the default client, using the same doubles, expectation,
and described_class.new.perform invocation) should remain and this redundant
block should be removed.
In `@spec/uploadcare/rails/jobs/store_file_job_spec.rb`:
- Around line 26-33: The spec contains a duplicate example of the same behavior:
remove the redundant "stores a file using the default client" test (the second
identical example testing described_class.new.perform('file-uuid') and expecting
files_accessor.batch_store with uuids: ['file-uuid']) so only one test remains;
locate the example that stubs Uploadcare::Rails.client and uses files_accessor
and delete that duplicate block to avoid redundant specs.
In `@spec/uploadcare/rails/jobs/store_group_job_spec.rb`:
- Around line 29-39: Remove the redundant example block that duplicates the
earlier test: delete the "it 'fetches group and batch-stores using the default
client'" example (the one that sets group_resource = double(files: [ { 'uuid' =>
'f1' } ]) and stubs Uploadcare::Rails.client, groups_accessor.find, and expects
files_accessor.batch_store) since the earlier example already verifies
described_class.new.perform('group-id') calls files_accessor.batch_store; keep
the original test and ensure groups_accessor, files_accessor, and the perform
invocation remain covered by the existing spec.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: 74100b6f-9c4a-4fe3-8983-f83d8d95dfa8
📒 Files selected for processing (107)
.github/workflows/gem-push.yml.github/workflows/test.yml.gitignore.rubocop.ymlCHANGELOG.mdGemfileMIGRATING_V5.mdREADME.mddocs/release-notes-5.0.0.mdgemfiles/Gemfile-rails-7-2gemfiles/Gemfile-rails-8-0gemfiles/Gemfile-rails-8-1lib/active_storage/service/uploadcare_service.rblib/generators/templates/uploadcare_config.yml.erblib/generators/templates/uploadcare_config_template.erblib/generators/uploadcare_config_generator.rblib/generators/uploadcare_importmap_generator.rblib/uploadcare-rails.rblib/uploadcare/errors/type_error.rblib/uploadcare/rails.rblib/uploadcare/rails/action_view/form_builder.rblib/uploadcare/rails/action_view/uploadcare_form_builder.rblib/uploadcare/rails/action_view/uploadcare_include_tags.rblib/uploadcare/rails/action_view/uploadcare_uploader_tags.rblib/uploadcare/rails/active_record/mount_uploadcare_file.rblib/uploadcare/rails/active_record/mount_uploadcare_file_group.rblib/uploadcare/rails/active_storage/integration.rblib/uploadcare/rails/active_storage/uploadcare_previewer.rblib/uploadcare/rails/active_storage/variant_remote_processing.rblib/uploadcare/rails/api/rest/addons_api.rblib/uploadcare/rails/api/rest/base.rblib/uploadcare/rails/api/rest/conversion_api.rblib/uploadcare/rails/api/rest/file_api.rblib/uploadcare/rails/api/rest/file_metadata_api.rblib/uploadcare/rails/api/rest/group_api.rblib/uploadcare/rails/api/rest/project_api.rblib/uploadcare/rails/api/rest/webhook_api.rblib/uploadcare/rails/api/upload/base.rblib/uploadcare/rails/api/upload/upload_api.rblib/uploadcare/rails/attached_file.rblib/uploadcare/rails/attached_files.rblib/uploadcare/rails/configuration.rblib/uploadcare/rails/engine.rblib/uploadcare/rails/internal/active_record_hooks.rblib/uploadcare/rails/internal/active_storage_service_helpers.rblib/uploadcare/rails/internal/active_storage_uuid_mapping.rblib/uploadcare/rails/internal/attachment_loading.rblib/uploadcare/rails/internal/client_resolver.rblib/uploadcare/rails/internal/file_uuid_extraction.rblib/uploadcare/rails/internal/files_count_extractor.rblib/uploadcare/rails/internal/id_extractor.rblib/uploadcare/rails/internal/image_transformations.rblib/uploadcare/rails/internal/model_macros.rblib/uploadcare/rails/internal/mongoid_hooks.rblib/uploadcare/rails/internal/remote_http_fetching.rblib/uploadcare/rails/internal/trusted_uploadcare_hosts.rblib/uploadcare/rails/internal/uploader_field_helpers.rblib/uploadcare/rails/jobs/delete_file_job.rblib/uploadcare/rails/jobs/store_file_job.rblib/uploadcare/rails/jobs/store_group_job.rblib/uploadcare/rails/mongoid/mount_uploadcare_file.rblib/uploadcare/rails/mongoid/mount_uploadcare_file_group.rblib/uploadcare/rails/objects/concerns/loadable.rblib/uploadcare/rails/objects/file.rblib/uploadcare/rails/objects/group.rblib/uploadcare/rails/services/files_count_extractor.rblib/uploadcare/rails/services/id_extractor.rblib/uploadcare/rails/version.rbspec/generators/uploadcare_config_generator_spec.rbspec/spec_helper.rbspec/support/stub_config_keys.rbspec/uploadcare/rails/action_view/uploadcare_form_builder_spec.rbspec/uploadcare/rails/action_view/uploadcare_include_tags_spec.rbspec/uploadcare/rails/action_view/uploadcare_uploader_tags_spec.rbspec/uploadcare/rails/active_record/mount_uploadcare_file_spec.rbspec/uploadcare/rails/active_storage/integration_spec.rbspec/uploadcare/rails/active_storage/uploadcare_previewer_spec.rbspec/uploadcare/rails/active_storage/uploadcare_service_spec.rbspec/uploadcare/rails/active_storage/variant_remote_processing_spec.rbspec/uploadcare/rails/api/rest/addons_api_spec.rbspec/uploadcare/rails/api/rest/conversion_api_spec.rbspec/uploadcare/rails/api/rest/file_api_spec.rbspec/uploadcare/rails/api/rest/group_api_spec.rbspec/uploadcare/rails/api/rest/project_api_spec.rbspec/uploadcare/rails/api/rest/webhook_api_spec.rbspec/uploadcare/rails/api/upload/upload_api_spec.rbspec/uploadcare/rails/attached_file_spec.rbspec/uploadcare/rails/attached_files_spec.rbspec/uploadcare/rails/configuration_spec.rbspec/uploadcare/rails/internal/active_record_group_macros_spec.rbspec/uploadcare/rails/internal/active_record_hooks_spec.rbspec/uploadcare/rails/internal/attachment_loading_spec.rbspec/uploadcare/rails/internal/mongoid_hooks_spec.rbspec/uploadcare/rails/internal/uploader_field_helpers_spec.rbspec/uploadcare/rails/jobs/delete_file_job_spec.rbspec/uploadcare/rails/jobs/store_file_job_spec.rbspec/uploadcare/rails/jobs/store_group_job_spec.rbspec/uploadcare/rails/mongoid/mount_uploadcare_file_group_spec.rbspec/uploadcare/rails/mongoid/mount_uploadcare_file_spec.rbspec/uploadcare/rails/objects/file_spec.rbspec/uploadcare/rails/objects/group_spec.rbspec/uploadcare/rails/services/id_extractor_spec.rbspec/uploadcare/rails/transformations/image_transformations_spec.rbspec/uploadcare/rails_spec.rbuploadcare-rails.gemspecv2.x-migrations-guide.mdv4.x-migrations-guide.md
💤 Files with no reviewable changes (39)
- spec/uploadcare/rails/api/rest/addons_api_spec.rb
- spec/uploadcare/rails/api/rest/project_api_spec.rb
- spec/uploadcare/rails/api/rest/file_api_spec.rb
- v2.x-migrations-guide.md
- lib/generators/templates/uploadcare_config_template.erb
- spec/uploadcare/rails/objects/file_spec.rb
- spec/uploadcare/rails/mongoid/mount_uploadcare_file_spec.rb
- spec/uploadcare/rails/api/rest/webhook_api_spec.rb
- lib/uploadcare/rails/api/rest/conversion_api.rb
- lib/uploadcare/rails/api/rest/group_api.rb
- lib/uploadcare/rails/objects/concerns/loadable.rb
- lib/uploadcare/errors/type_error.rb
- spec/uploadcare/rails/api/upload/upload_api_spec.rb
- lib/uploadcare/rails/objects/group.rb
- lib/uploadcare/rails/api/rest/webhook_api.rb
- lib/uploadcare/rails/services/id_extractor.rb
- lib/uploadcare/rails/api/upload/base.rb
- lib/uploadcare/rails/mongoid/mount_uploadcare_file.rb
- spec/uploadcare/rails/api/rest/group_api_spec.rb
- lib/uploadcare/rails/api/rest/project_api.rb
- spec/spec_helper.rb
- lib/uploadcare/rails/api/rest/file_metadata_api.rb
- lib/uploadcare/rails/services/files_count_extractor.rb
- lib/uploadcare/rails/api/rest/addons_api.rb
- spec/uploadcare/rails/action_view/uploadcare_uploader_tags_spec.rb
- lib/uploadcare/rails/action_view/uploadcare_form_builder.rb
- spec/uploadcare/rails/objects/group_spec.rb
- lib/uploadcare/rails/api/upload/upload_api.rb
- lib/uploadcare/rails/api/rest/base.rb
- lib/uploadcare/rails/mongoid/mount_uploadcare_file_group.rb
- lib/uploadcare/rails/active_record/mount_uploadcare_file.rb
- spec/uploadcare/rails/api/rest/conversion_api_spec.rb
- spec/uploadcare/rails/mongoid/mount_uploadcare_file_group_spec.rb
- lib/uploadcare/rails/action_view/uploadcare_uploader_tags.rb
- spec/uploadcare/rails/active_record/mount_uploadcare_file_spec.rb
- v4.x-migrations-guide.md
- lib/uploadcare/rails/api/rest/file_api.rb
- lib/uploadcare/rails/active_record/mount_uploadcare_file_group.rb
- lib/uploadcare/rails/objects/file.rb
Summary
5.0.0.rc1to5.0.0uploadcare-ruby5.0.0public_keytopubkey, RubyGems secret guard, range headers, client resolution, UUID preconditions, and group URL normalizationValidation
uploadcare-ruby 5.0.0uploadcare-rails 5.0.0yetv5.0.0git tag exists yet; onlyv5.0.0.rc1bundle check- dependencies satisfiedbundle exec rake- 190 examples, 0 failuresbundle exec rubocop- no offenses.github/workflows/*.ymlgit diff --checkbundle exec rake buildproducedpkg/uploadcare-rails-5.0.0.gemrails >= 7.2,uploadcare-ruby >= 5.0.0, MFA required, 42 filesa3351f6170989f90c5dc7c7788fd5e528745e588101af42140439e81ecb4b0d4origin/main- PASS 8/10, no important issues remainingRelease gate
uploadcare-ruby 5.0.0is published and the PR is green. Ruby 4 remains advisory until ecosystem support is stable.Before tagging
uploadcare-rails v5.0.0, smoke-test one 4.x to 5.0 migration usingMIGRATING_V5.md, then merge tomain, tagv5.0.0frommain, and let thePublish Gemworkflow publish the gem.