Skip to content

Commit a45d903

Browse files
committed
Merge pull request #3081 from LinkUpStudioUA/shrine_field
Add Shrine support
2 parents 49add74 + 9e90f42 commit a45d903

26 files changed

+351
-2
lines changed

Appraisals

+3
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ appraise "rails-5.0" do
2727
gem 'mongoid-paperclip', '>= 0.0.8', require: 'mongoid_paperclip'
2828
gem 'carrierwave-mongoid', '>= 0.6.3', require: 'carrierwave/mongoid'
2929
gem 'cancancan-mongoid'
30+
gem 'shrine-mongoid'
3031
end
3132
end
3233

@@ -56,6 +57,7 @@ appraise "rails-5.1" do
5657
gem 'mongoid-paperclip', '>= 0.0.8', require: 'mongoid_paperclip'
5758
gem 'carrierwave-mongoid', '>= 0.6.3', require: 'carrierwave/mongoid'
5859
gem 'cancancan-mongoid'
60+
gem 'shrine-mongoid'
5961
end
6062
end
6163

@@ -85,6 +87,7 @@ appraise "rails-5.2" do
8587
gem 'mongoid-paperclip', '>= 0.0.8', require: 'mongoid_paperclip'
8688
gem 'carrierwave-mongoid', '>= 0.6.3', require: 'carrierwave/mongoid'
8789
gem 'cancancan-mongoid'
90+
gem 'shrine-mongoid'
8891
end
8992
end
9093

Gemfile

+2
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ group :test do
3535
gem 'rspec-expectations', '!= 3.8.3'
3636
gem 'rubocop', '~> 0.41.2'
3737
gem 'simplecov', '>= 0.9', require: false
38+
gem 'shrine', '~> 2.0'
39+
gem 'shrine-memory'
3840
gem 'timecop', '>= 0.5'
3941

4042
platforms :ruby_19 do

gemfiles/cancan.gemfile

+2
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ group :test do
3838
gem "rspec-expectations", "!= 3.8.3"
3939
gem "rubocop", "~> 0.41.2"
4040
gem "simplecov", ">= 0.9", require: false
41+
gem "shrine", "~> 2.0"
42+
gem "shrine-memory"
4143
gem "timecop", ">= 0.5"
4244
gem "cancan", ">= 1.6"
4345

gemfiles/rails_5.0.gemfile

+3
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ group :test do
4444
gem "rspec-expectations", "!= 3.8.3"
4545
gem "rubocop", "~> 0.41.2"
4646
gem "simplecov", ">= 0.9", require: false
47+
gem "shrine", "~> 2.0"
48+
gem "shrine-memory"
4749
gem "timecop", ">= 0.5"
4850
gem "cancancan", "~> 2.0"
4951

@@ -58,6 +60,7 @@ group :mongoid do
5860
gem "mongoid-paperclip", ">= 0.0.8", require: "mongoid_paperclip"
5961
gem "carrierwave-mongoid", ">= 0.6.3", require: "carrierwave/mongoid"
6062
gem "cancancan-mongoid"
63+
gem "shrine-mongoid"
6164
end
6265

6366
gemspec path: "../"

gemfiles/rails_5.1.gemfile

+3
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ group :test do
4545
gem "rspec-expectations", "!= 3.8.3"
4646
gem "rubocop", "~> 0.41.2"
4747
gem "simplecov", ">= 0.9", require: false
48+
gem "shrine", "~> 2.0"
49+
gem "shrine-memory"
4850
gem "timecop", ">= 0.5"
4951
gem "cancancan", "~> 2.0"
5052

@@ -59,6 +61,7 @@ group :mongoid do
5961
gem "mongoid-paperclip", ">= 0.0.8", require: "mongoid_paperclip"
6062
gem "carrierwave-mongoid", ">= 0.6.3", require: "carrierwave/mongoid"
6163
gem "cancancan-mongoid"
64+
gem "shrine-mongoid"
6265
end
6366

6467
gemspec path: "../"

gemfiles/rails_5.2.gemfile

+3
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ group :test do
4545
gem "rspec-expectations", "!= 3.8.3"
4646
gem "rubocop", "~> 0.41.2"
4747
gem "simplecov", ">= 0.9", require: false
48+
gem "shrine", "~> 2.0"
49+
gem "shrine-memory"
4850
gem "timecop", ">= 0.5"
4951
gem "cancancan", "~> 2.0"
5052

@@ -59,6 +61,7 @@ group :mongoid do
5961
gem "mongoid-paperclip", ">= 0.0.8", require: "mongoid_paperclip"
6062
gem "carrierwave-mongoid", ">= 0.6.3", require: "carrierwave/mongoid"
6163
gem "cancancan-mongoid"
64+
gem "shrine-mongoid"
6265
end
6366

6467
gemspec path: "../"

gemfiles/rails_6.0.gemfile

+2
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ group :test do
3939
gem "rspec-expectations", "!= 3.8.3"
4040
gem "rubocop", "~> 0.41.2"
4141
gem "simplecov", ">= 0.9", require: false
42+
gem "shrine", "~> 2.0"
43+
gem "shrine-memory"
4244
gem "timecop", ">= 0.5"
4345
gem "cancancan", "~> 3.0"
4446

lib/rails_admin/config/fields.rb

+1
Original file line numberDiff line numberDiff line change
@@ -84,4 +84,5 @@ def self.register_factory(&block)
8484
require 'rails_admin/config/fields/factories/carrierwave'
8585
require 'rails_admin/config/fields/factories/refile'
8686
require 'rails_admin/config/fields/factories/active_storage'
87+
require 'rails_admin/config/fields/factories/shrine'
8788
require 'rails_admin/config/fields/factories/association'
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
require 'rails_admin/config/fields'
2+
require 'rails_admin/config/fields/types'
3+
require 'rails_admin/config/fields/types/file_upload'
4+
5+
RailsAdmin::Config::Fields.register_factory do |parent, properties, fields|
6+
next false unless defined?(::Shrine)
7+
8+
attachment_names = parent.abstract_model.model.ancestors.select { |m| m.is_a?(Shrine::Attachment) }.map { |a| a.instance_variable_get("@name") }
9+
next false if attachment_names.blank?
10+
11+
attachment_name = attachment_names.detect { |a| a == properties.name.to_s.chomp('_data').to_sym }
12+
next false unless attachment_name
13+
14+
field = RailsAdmin::Config::Fields::Types.load(:shrine).new(parent, attachment_name, properties)
15+
fields << field
16+
17+
data_field_name = "#{attachment_name}_data".to_sym
18+
child_properties = parent.abstract_model.properties.detect { |p| p.name == data_field_name }
19+
next true unless child_properties
20+
21+
children_field = fields.detect { |f| f.name == data_field_name } || RailsAdmin::Config::Fields.default_factory.call(parent, child_properties, fields)
22+
children_field.hide unless field == children_field
23+
children_field.filterable(false) unless field == children_field
24+
25+
field.children_fields([data_field_name])
26+
true
27+
end

lib/rails_admin/config/fields/types/all.rb

+1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
require 'rails_admin/config/fields/types/hidden'
2727
require 'rails_admin/config/fields/types/text'
2828
require 'rails_admin/config/fields/types/serialized'
29+
require 'rails_admin/config/fields/types/shrine'
2930
require 'rails_admin/config/fields/types/time'
3031
require 'rails_admin/config/fields/types/timestamp'
3132
require 'rails_admin/config/fields/types/color'
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
require 'rails_admin/config/fields/types/file_upload'
2+
3+
module RailsAdmin
4+
module Config
5+
module Fields
6+
module Types
7+
class Shrine < RailsAdmin::Config::Fields::Types::FileUpload
8+
RailsAdmin::Config::Fields::Types.register(self)
9+
10+
register_instance_option :thumb_method do
11+
unless defined? @thumb_method
12+
@thumb_method = begin
13+
next nil unless value.is_a?(Hash)
14+
15+
if value.key?(:thumb)
16+
:thumb
17+
elsif value.key?(:thumbnail)
18+
:thumbnail
19+
else
20+
value.keys.first
21+
end
22+
end
23+
end
24+
@thumb_method
25+
end
26+
27+
register_instance_option :delete_method do
28+
"remove_#{name}" if bindings[:object].respond_to?("remove_#{name}")
29+
end
30+
31+
register_instance_option :cache_method do
32+
"cached_#{name}_data" if bindings[:object].respond_to?("cached_#{name}_data")
33+
end
34+
35+
def resource_url(thumb = nil)
36+
return nil unless value
37+
38+
if value.is_a?(Hash)
39+
value[thumb || value.keys.first].url
40+
else
41+
value.url
42+
end
43+
end
44+
end
45+
end
46+
end
47+
end
48+
end

spec/controllers/rails_admin/main_controller_spec.rb

+7-2
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,9 @@ class TeamWithNumberedPlayers < Team
341341
field :active_storage_assets do
342342
delete_method :remove_active_storage_assets
343343
end if defined?(ActiveStorage)
344+
field :shrine_asset do
345+
delete_method :remove_shrine_asset
346+
end if defined?(Shrine)
344347
end
345348
controller.params = HashWithIndifferentAccess.new(
346349
'field_test' => {
@@ -357,7 +360,8 @@ class TeamWithNumberedPlayers < Team
357360
'delete_paperclip_asset' => 'test',
358361
'should_not_be_here' => 'test',
359362
}.merge(defined?(Refile) ? {'refile_asset' => 'test', 'remove_refile_asset' => 'test'} : {}).
360-
merge(defined?(ActiveStorage) ? {'active_storage_asset' => 'test', 'remove_active_storage_asset' => 'test', 'active_storage_assets' => 'test', 'remove_active_storage_assets' => 'test'} : {}),
363+
merge(defined?(ActiveStorage) ? {'active_storage_asset' => 'test', 'remove_active_storage_asset' => 'test', 'active_storage_assets' => 'test', 'remove_active_storage_assets' => 'test'} : {}).
364+
merge(defined?(Shrine) ? {'shrine_asset' => 'test', 'remove_shrine_asset' => 'test'} : {}),
361365
)
362366

363367
controller.send(:sanitize_params_for!, :create, RailsAdmin.config(FieldTest), controller.params['field_test'])
@@ -374,7 +378,8 @@ class TeamWithNumberedPlayers < Team
374378
'paperclip_asset' => 'test',
375379
'delete_paperclip_asset' => 'test',
376380
}.merge(defined?(Refile) ? {'refile_asset' => 'test', 'remove_refile_asset' => 'test'} : {}).
377-
merge(defined?(ActiveStorage) ? {'active_storage_asset' => 'test', 'remove_active_storage_asset' => 'test', 'active_storage_assets' => 'test', 'remove_active_storage_assets' => 'test'} : {}))
381+
merge(defined?(ActiveStorage) ? {'active_storage_asset' => 'test', 'remove_active_storage_asset' => 'test', 'active_storage_assets' => 'test', 'remove_active_storage_assets' => 'test'} : {}).
382+
merge(defined?(Shrine) ? {'shrine_asset' => 'test', 'remove_shrine_asset' => 'test'} : {}))
378383
end
379384

380385
it 'allows for polymorphic associations parameters' do

spec/dummy_app/Gemfile

+3
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ group :mongoid do
2727
gem 'mongoid-paperclip', '>= 0.0.8', require: 'mongoid_paperclip'
2828
gem 'carrierwave-mongoid', '>= 0.6.3', require: 'carrierwave/mongoid'
2929
# gem 'refile-mongoid', '>= 0.0.1', platforms: [:ruby_21, :ruby_22]
30+
gem 'shrine-mongoid'
3031
end
3132

3233
gem 'carrierwave', '>= 0.8'
@@ -36,6 +37,8 @@ gem 'mini_magick', '>= 3.4'
3637
gem 'mlb', '>= 0.7'
3738
gem 'paperclip', '>= 3.4'
3839
gem 'rails_admin', path: '../../'
40+
gem 'shrine', '~> 2.0'
41+
gem 'shrine-memory'
3942

4043
platforms :mri do
4144
# gem 'refile', '>= 0.5', require: 'refile/rails'

spec/dummy_app/app/active_record/field_test.rb

+3
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,9 @@ def carrierwave_assets=(files)
4949
end
5050
end
5151

52+
include ShrineUploader.attachment(:shrine_asset)
53+
include ShrineVersioningUploader.attachment(:shrine_versioning_asset)
54+
5255
enum string_enum_field: {S: 's', M: 'm', L: 'l'}
5356
enum integer_enum_field: [:small, :medium, :large]
5457
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
class ShrineUploader < Shrine
2+
plugin :activerecord
3+
4+
plugin :cached_attachment_data
5+
plugin :determine_mime_type
6+
plugin :pretty_location
7+
plugin :remove_attachment
8+
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
class ShrineVersioningUploader < Shrine
2+
plugin :activerecord
3+
4+
plugin :cached_attachment_data
5+
plugin :delete_raw
6+
plugin :determine_mime_type
7+
plugin :pretty_location
8+
plugin :processing
9+
plugin :remove_attachment
10+
plugin :versions
11+
12+
process(:store) do |io|
13+
{
14+
original: io,
15+
thumb: FakeIO.another_version(io, :thumb),
16+
}
17+
end
18+
end

spec/dummy_app/app/mongoid/field_test.rb

+5
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@ class FieldTest
3333
field :protected_field, type: String
3434
has_mongoid_attached_file :paperclip_asset, styles: {thumb: '100x100>'}
3535

36+
field :shrine_asset_data, type: String
37+
include ShrineUploader::Attachment.new(:shrine_asset)
38+
field :shrine_versioning_asset_data, type: String
39+
include ShrineVersioningUploader::Attachment.new(:shrine_versioning_asset)
40+
3641
has_many :nested_field_tests, dependent: :destroy, inverse_of: :field_test, autosave: true
3742
accepts_nested_attributes_for :nested_field_tests, allow_destroy: true
3843

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
class ShrineUploader < Shrine
2+
plugin :mongoid
3+
4+
plugin :cached_attachment_data
5+
plugin :determine_mime_type
6+
plugin :pretty_location
7+
plugin :remove_attachment
8+
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
class ShrineVersioningUploader < Shrine
2+
plugin :mongoid
3+
4+
plugin :cached_attachment_data
5+
plugin :delete_raw
6+
plugin :determine_mime_type
7+
plugin :pretty_location
8+
plugin :processing
9+
plugin :remove_attachment
10+
plugin :versions
11+
12+
process(:store) do |io|
13+
{
14+
original: io,
15+
thumb: FakeIO.another_version(io, :thumb),
16+
}
17+
end
18+
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
require 'shrine'
2+
require 'shrine/storage/memory'
3+
4+
Shrine.storages = {
5+
cache: Shrine::Storage::Memory.new,
6+
store: Shrine::Storage::Memory.new,
7+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
class AddShrineDataToFieldTests < ActiveRecord::Migration[5.0]
2+
def change
3+
add_column :field_tests, :shrine_asset_data, :text
4+
add_column :field_tests, :shrine_versioning_asset_data, :text
5+
end
6+
end

spec/rails_admin/config/fields/base_spec.rb

+15
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,21 @@ class CommentReversed < Tableless
132132
end
133133
end
134134
end
135+
136+
if defined?(Shrine)
137+
context 'of a Shrine installation' do
138+
it 'is the parent field itself' do
139+
expect(RailsAdmin.config(FieldTest).fields.detect { |f| f.name == :shrine_asset }.children_fields).to eq([:shrine_asset_data])
140+
expect(RailsAdmin.config(FieldTest).fields.detect { |f| f.name == :shrine_asset }.hidden?).to be_falsey
141+
end
142+
143+
it 'is not filterable' do
144+
fields = RailsAdmin.config(FieldTest).fields.select { |f| [:shrine_asset_data].include?(f.name) }
145+
expect(fields).to all(be_hidden)
146+
expect(fields).not_to include(be_filterable)
147+
end
148+
end
149+
end
135150
end
136151

137152
describe '#form_default_value' do

spec/rails_admin/config/fields/types/file_upload_spec.rb

+5
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,18 @@
1616
field :active_storage_asset do
1717
delete_method :remove_active_storage_asset
1818
end if defined?(ActiveStorage)
19+
field :shrine_asset do
20+
delete_method :remove_shrine_asset
21+
cache_method :cached_shrine_asset_data
22+
end if defined?(Shrine)
1923
end
2024
end
2125
expect(RailsAdmin.config(FieldTest).field(:carrierwave_asset).allowed_methods.collect(&:to_s)).to eq %w(carrierwave_asset remove_carrierwave_asset carrierwave_asset_cache)
2226
expect(RailsAdmin.config(FieldTest).field(:dragonfly_asset).allowed_methods.collect(&:to_s)).to eq %w(dragonfly_asset remove_dragonfly_asset retained_dragonfly_asset)
2327
expect(RailsAdmin.config(FieldTest).field(:paperclip_asset).allowed_methods.collect(&:to_s)).to eq %w(paperclip_asset delete_paperclip_asset)
2428
expect(RailsAdmin.config(FieldTest).field(:refile_asset).allowed_methods.collect(&:to_s)).to eq %w(refile_asset remove_refile_asset) if defined?(Refile)
2529
expect(RailsAdmin.config(FieldTest).field(:active_storage_asset).allowed_methods.collect(&:to_s)).to eq %w(active_storage_asset remove_active_storage_asset) if defined?(ActiveStorage)
30+
expect(RailsAdmin.config(FieldTest).field(:shrine_asset).allowed_methods.collect(&:to_s)).to eq %w(shrine_asset remove_shrine_asset cached_shrine_asset_data) if defined?(Shrine)
2631
end
2732
end
2833

0 commit comments

Comments
 (0)