rails_admin_settings 1.4.0 → 1.6.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,14 @@
1
+ module RailsAdminSettings
2
+ module Uploads
3
+ class ShrineUploader < Shrine
4
+ plugin :determine_mime_type
5
+ plugin :validation_helpers
6
+ plugin :mongoid if RailsAdminSettings.mongoid?
7
+ Attacher.validate do
8
+ validate_mime_type_inclusion %w[image/jpeg image/gif image/png]
9
+ validate_max_size 2.megabytes
10
+ end
11
+ end
12
+
13
+ end
14
+ end
@@ -1,6 +1,7 @@
1
1
  module RailsAdminSettings
2
2
  module Uploads
3
3
  autoload :CarrierWaveUploader, "rails_admin_settings/storage/carrier_wave_uploader"
4
+ autoload :ShrineUploader, "rails_admin_settings/storage/shrine_uploader"
4
5
 
5
6
  def self.paperclip_options
6
7
  if defined?(Rails)
@@ -31,12 +32,22 @@ module RailsAdminSettings
31
32
  Settings.file_uploads_supported = true
32
33
  Settings.file_uploads_engine = :paperclip
33
34
  elsif RailsAdminSettings.active_record? && defined?(Paperclip)
34
- base.has_mongoid_attached_file(:file, self.paperclip_options)
35
+ base.has_attached_file(:file, self.paperclip_options)
35
36
  if base.respond_to?(:do_not_validate_attachment_file_type)
36
37
  base.do_not_validate_attachment_file_type :file
37
38
  end
38
39
  Settings.file_uploads_supported = true
39
40
  Settings.file_uploads_engine = :paperclip
41
+ elsif RailsAdminSettings.active_record? && defined?(Shrine)
42
+ Settings.file_uploads_supported = true
43
+ Settings.file_uploads_engine = :shrine
44
+ base.send(:include, ShrineUploader::Attachment(:file))
45
+ elsif RailsAdminSettings.mongoid? && ::Mongoid.const_defined?('Shrine')
46
+ base.send(:include, ::Mongoid::Document)
47
+ base.send(:include, ShrineUploader::Attachment(:file))
48
+ base.field(:file_data, type: String)
49
+ Settings.file_uploads_supported = true
50
+ Settings.file_uploads_engine = :shrine
40
51
  else
41
52
  # puts "[rails_admin_settings] Uploads disabled"
42
53
  end
@@ -1,91 +1,123 @@
1
1
  module RailsAdminSettings
2
2
  module Validation
3
- def self.included(base)
4
- base.before_validation do
5
- self.raw = default_serializable_value if raw.blank?
3
+ class << self
4
+ def included(base)
5
+ base.before_validation do
6
+ self.raw = default_serializable_value if raw.blank?
7
+ end
8
+ base.before_validation :preprocess_value, if: :preprocessed_kind?
9
+ base.validates_uniqueness_of :key, scope: :ns
10
+ base.validates_inclusion_of :kind, in: RailsAdminSettings.kinds
11
+ base.validates_numericality_of :raw, if: :integer_kind?
12
+ base.validates_numericality_of :raw, if: :float_kind?
13
+
14
+ add_validators(base)
6
15
  end
7
- base.before_validation :preprocess_value, if: :preprocessed_kind?
8
- base.validates_uniqueness_of :key, scope: :ns
9
- base.validates_inclusion_of :kind, in: RailsAdminSettings.kinds
10
- base.validates_numericality_of :raw, if: :integer_kind?
11
16
 
12
- base.validate if: :phone_kind? do
13
- require_russian_phone do
14
- errors.add(:raw, I18n.t('admin.settings.phone_invalid')) unless raw.blank? || RussianPhone::Number.new(raw).valid?
15
- end
17
+ def add_validators(base)
18
+ add_color_validator(base)
19
+ add_file_validator(base)
20
+ add_email_validator(base)
21
+ add_url_validator(base)
22
+ add_phone_validator(base)
23
+ add_geo_validator(base)
24
+ add_yaml_validator(base)
25
+ add_json_validator(base)
16
26
  end
17
27
 
18
- base.validate if: :phones_kind? do
19
- require_russian_phone do
20
- unless raw.blank?
21
- invalid_phones = raw.gsub("\r", '').split("\n").inject([]) do |memo, value|
22
- memo << value unless RussianPhone::Number.new(value).valid?
23
- memo
24
- end
25
- errors.add(:raw, I18n.t('admin.settings.phones_invalid', phones: invalid_phones * ', ')) unless invalid_phones.empty?
28
+ def add_color_validator(base)
29
+ base.validates_with(RailsAdminSettings::HexColorValidator, attributes: :raw, if: :color_kind?)
30
+ end
31
+
32
+ def add_file_validator(base)
33
+ base.validate if: :file_kind? do
34
+ unless Settings.file_uploads_supported
35
+ raise '[rails_admin_settings] File kind requires either CarrierWave or Paperclip or Shrine. Check that rails_admin_settings is below them in Gemfile'
26
36
  end
27
37
  end
28
38
  end
29
39
 
30
- base.validate if: :email_kind? do
31
- require_validates_email_format_of do
32
- errors.add(:raw, I18n.t('admin.settings.email_invalid')) unless raw.blank? || ValidatesEmailFormatOf.validate_email_format(raw).nil?
40
+ def add_email_validator(base)
41
+ base.validate if: :email_kind? do
42
+ require_validates_email_format_of do
43
+ errors.add(:raw, I18n.t('admin.settings.email_invalid')) unless raw.blank? || ValidatesEmailFormatOf.validate_email_format(raw).nil?
44
+ end
33
45
  end
34
46
  end
35
47
 
36
- base.validate if: :address_kind? do
37
- require_geocoder do
38
- # just raise error if we are trying to use address kind without geocoder
48
+ def add_url_validator(base)
49
+ base.before_validation if: :url_kind? do
50
+ require_addressable do
51
+ self.raw = Addressable::URI.heuristic_parse(self.raw) unless self.raw.blank?
52
+ end
39
53
  end
40
- end
41
54
 
42
- base.validate if: :file_kind? do
43
- unless Settings.file_uploads_supported
44
- raise '[rails_admin_settings] File kind requires either CarrierWave or Paperclip. Check that rails_admin_settings is below them in Gemfile'
55
+ base.before_validation if: :domain_kind? do
56
+ require_addressable do
57
+ self.raw = Addressable::URI.heuristic_parse(self.raw).host unless self.raw.blank?
58
+ end
45
59
  end
46
60
  end
47
61
 
48
- base.before_validation if: :url_kind? do
49
- require_addressable do
50
- self.raw = Addressable::URI.heuristic_parse(self.raw) unless self.raw.blank?
62
+ def add_phone_validator(base)
63
+ base.validate if: :phone_kind? do
64
+ require_russian_phone do
65
+ errors.add(:raw, I18n.t('admin.settings.phone_invalid')) unless raw.blank? || RussianPhone::Number.new(raw).valid?
66
+ end
51
67
  end
52
- end
53
68
 
54
- base.before_validation if: :domain_kind? do
55
- require_addressable do
56
- self.raw = Addressable::URI.heuristic_parse(self.raw).host unless self.raw.blank?
69
+ base.validate if: :phones_kind? do
70
+ require_russian_phone do
71
+ unless raw.blank?
72
+ invalid_phones = raw.gsub("\r", '').split("\n").inject([]) do |memo, value|
73
+ memo << value unless RussianPhone::Number.new(value).valid?
74
+ memo
75
+ end
76
+ errors.add(:raw, I18n.t('admin.settings.phones_invalid', phones: invalid_phones * ', ')) unless invalid_phones.empty?
77
+ end
78
+ end
57
79
  end
80
+
58
81
  end
59
82
 
60
- if Object.const_defined?('Geocoder')
61
- if RailsAdminSettings.mongoid?
62
- base.field(:coordinates, type: Array)
63
- base.send(:include, Geocoder::Model::Mongoid)
83
+ def add_geo_validator(base)
84
+ base.validate if: :address_kind? do
85
+ require_geocoder do
86
+ # just raise error if we are trying to use address kind without geocoder
87
+ end
88
+ end
89
+ if Object.const_defined?('Geocoder')
90
+ if RailsAdminSettings.mongoid?
91
+ base.field(:coordinates, type: Array)
92
+ base.send(:include, Geocoder::Model::Mongoid)
93
+ end
94
+ base.geocoded_by(:raw)
95
+ base.after_validation(:geocode, if: :address_kind?)
64
96
  end
65
- base.geocoded_by(:raw)
66
- base.after_validation(:geocode, if: :address_kind?)
67
97
  end
68
98
 
69
- base.validates_with(RailsAdminSettings::HexColorValidator, attributes: :raw, if: :color_kind?)
70
-
71
- base.validate if: :yaml_kind? do
72
- require_safe_yaml do
73
- unless raw.blank?
74
- begin
75
- YAML.safe_load(raw)
76
- rescue Psych::SyntaxError => e
77
- errors.add(:raw, I18n.t('admin.settings.yaml_invalid'))
99
+ def add_yaml_validator(base)
100
+ base.validate if: :yaml_kind? do
101
+ require_safe_yaml do
102
+ unless raw.blank?
103
+ begin
104
+ YAML.safe_load(raw)
105
+ rescue Psych::SyntaxError => e
106
+ errors.add(:raw, I18n.t('admin.settings.yaml_invalid'))
107
+ end
78
108
  end
79
109
  end
80
110
  end
81
111
  end
82
112
 
83
- base.validate if: :json_kind? do
84
- unless raw.blank?
85
- begin
86
- JSON.load(raw)
87
- rescue JSON::ParserError => e
88
- errors.add(:raw, I18n.t('admin.settings.json_invalid'))
113
+ def add_json_validator(base)
114
+ base.validate if: :json_kind? do
115
+ unless raw.blank?
116
+ begin
117
+ JSON.load(raw)
118
+ rescue JSON::ParserError => e
119
+ errors.add(:raw, I18n.t('admin.settings.json_invalid'))
120
+ end
89
121
  end
90
122
  end
91
123
  end
@@ -1,3 +1,3 @@
1
1
  module RailsAdminSettings
2
- VERSION = "1.4.0"
2
+ VERSION = "1.6.0"
3
3
  end
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
10
10
  spec.email = ["glebtv@gmail.com"]
11
11
  spec.description = %q{Mongoid / ActiveRecord + RailsAdmin App Settings management}
12
12
  spec.summary = %q{}
13
- spec.homepage = "https://github.com/rs-pro/rails_admin_settings"
13
+ spec.homepage = "https://gitlab.com/rocket-science/rails_admin_settings"
14
14
  spec.license = "MIT"
15
15
 
16
16
  spec.files = `git ls-files`.split($/)
@@ -36,5 +36,9 @@ Gem::Specification.new do |spec|
36
36
  spec.add_development_dependency "addressable"
37
37
  spec.add_development_dependency "carrierwave-mongoid"
38
38
  spec.add_development_dependency "mongoid-paperclip"
39
- spec.add_development_dependency "pry"
39
+ spec.add_development_dependency "rubocop-rspec"
40
+ spec.add_development_dependency 'image_processing'
41
+ spec.add_development_dependency "mini_magick"
42
+ spec.add_development_dependency "shrine", "~> 3.0"
43
+ spec.add_development_dependency "shrine-mongoid", "~> 1.0"
40
44
  end
@@ -3,6 +3,6 @@
3
3
  FactoryBot.define do
4
4
  factory :setting, class: RailsAdminSettings::Setting do
5
5
  sequence(:key){|n| "setting_#{n}" }
6
- raw "Контент 1"
6
+ raw { "Контент 1" }
7
7
  end
8
8
  end
@@ -0,0 +1,34 @@
1
+ require 'spec_helper'
2
+
3
+
4
+ describe "Uploads" do
5
+ if Settings.file_uploads_engine != :shrine
6
+ pending "shrine not detected, skipped. To run use UPLOADS=shrine rspec"
7
+ else
8
+ before :each do
9
+ f = "#{File.dirname(__FILE__)}/../uploads/1024x768.gif"
10
+ if File.file?(f)
11
+ File.unlink(f)
12
+ end
13
+ end
14
+ it 'supports file kind' do
15
+ Settings.set('file', File.open("#{File.dirname(__FILE__)}/support/1024x768.gif"), kind: 'file')
16
+ expect(Settings.get(:file).file.metadata["filename"]).to eq '1024x768.gif'
17
+ expect(Settings.get(:file).file.metadata["size"]).to eq 4357
18
+ expect(Settings.get(:file).file.metadata["mime_type"]).to eq "image/gif"
19
+ expect(Settings.get(:file).file.id.split(".").last).to eq "gif"
20
+ expect(Settings.file.split("/").second + "/" + Settings.file.split("/").last.split(".").last).to eq "uploads/gif"
21
+ expect(File.exists?("public/uploads/#{Settings.get(:file).file.id}")).to be_truthy
22
+ end
23
+ it 'supports image kind' do
24
+ Settings.set('file', File.open("#{File.dirname(__FILE__)}/support/1024x768.gif"), kind: 'image')
25
+ expect(Settings.get(:file).file.metadata["filename"]).to eq '1024x768.gif'
26
+ expect(Settings.get(:file).file.metadata["size"]).to eq 4357
27
+ expect(Settings.get(:file).file.metadata["mime_type"]).to eq "image/gif"
28
+ expect(Settings.get(:file).file.id.split(".").last).to eq "gif"
29
+ expect(Settings.file.split("/").second + "/" + Settings.file.split("/").last.split(".").last).to eq "uploads/gif"
30
+ expect(File.exists?("public/uploads/#{Settings.get(:file).file.id}")).to be_truthy
31
+ end
32
+ end
33
+ end
34
+
@@ -5,7 +5,6 @@ require 'rubygems'
5
5
  require 'simplecov'
6
6
  SimpleCov.start
7
7
 
8
- require 'pry'
9
8
  require 'bundler/setup'
10
9
  require 'active_support'
11
10
  require 'active_support/core_ext'
@@ -18,7 +17,6 @@ require 'database_cleaner'
18
17
  require 'factory_bot'
19
18
  require 'mongoid-rspec'
20
19
 
21
- p ENV["UPLOADS"]
22
20
  if ENV['UPLOADS'] == 'paperclip'
23
21
  require "mongoid-paperclip"
24
22
  end
@@ -30,6 +28,22 @@ if ENV['UPLOADS'] == 'carrierwave'
30
28
  end
31
29
  end
32
30
  end
31
+ if ENV['UPLOADS'] == 'shrine'
32
+ require "shrine"
33
+ require "shrine/storage/file_system"
34
+ Shrine.storages = {
35
+ cache: Shrine::Storage::FileSystem.new("public", prefix: "uploads/cache"), # temporary
36
+ store: Shrine::Storage::FileSystem.new("public", prefix: "uploads"), # permanent
37
+ }
38
+
39
+ if ENV['ACTIVERECORD']
40
+ Shrine.plugin :activerecord
41
+ end
42
+ Shrine.plugin :cached_attachment_data # for retaining the cached file across form redisplays
43
+ Shrine.plugin :restore_cached_data # re-extract metadata when attaching a cached file
44
+ end
45
+
46
+
33
47
 
34
48
  I18n.enforce_available_locales = true
35
49
  I18n.load_path << File.join(File.dirname(__FILE__), "..", "config", "locales", "en.yml")
File without changes
@@ -23,6 +23,13 @@ describe 'Settings kind' do
23
23
  expect(Settings.testint2).to eq 5
24
24
  end
25
25
 
26
+ it 'float' do
27
+ expect(Settings.get(:testfloat, kind: 'float').value).to eq 0
28
+ expect(Settings.get(:testfloat, default: 5.2, kind: 'float').value).to eq 0
29
+ expect(Settings.get(:testfloat2, default: 5.5, kind: 'float').value).to eq 5.5
30
+ expect(Settings.testfloat2).to eq 5.5
31
+ end
32
+
26
33
  it 'does yaml' do
27
34
  Settings.set(:data, '[one, two, three]', kind: 'yaml')
28
35
  expect(Settings.get(:data).raw).to eq '[one, two, three]'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails_admin_settings
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.0
4
+ version: 1.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gleb Tv
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-03-07 00:00:00.000000000 Z
11
+ date: 2020-06-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mongoid
@@ -249,7 +249,7 @@ dependencies:
249
249
  - !ruby/object:Gem::Version
250
250
  version: '0'
251
251
  - !ruby/object:Gem::Dependency
252
- name: pry
252
+ name: rubocop-rspec
253
253
  requirement: !ruby/object:Gem::Requirement
254
254
  requirements:
255
255
  - - ">="
@@ -262,6 +262,62 @@ dependencies:
262
262
  - - ">="
263
263
  - !ruby/object:Gem::Version
264
264
  version: '0'
265
+ - !ruby/object:Gem::Dependency
266
+ name: image_processing
267
+ requirement: !ruby/object:Gem::Requirement
268
+ requirements:
269
+ - - ">="
270
+ - !ruby/object:Gem::Version
271
+ version: '0'
272
+ type: :development
273
+ prerelease: false
274
+ version_requirements: !ruby/object:Gem::Requirement
275
+ requirements:
276
+ - - ">="
277
+ - !ruby/object:Gem::Version
278
+ version: '0'
279
+ - !ruby/object:Gem::Dependency
280
+ name: mini_magick
281
+ requirement: !ruby/object:Gem::Requirement
282
+ requirements:
283
+ - - ">="
284
+ - !ruby/object:Gem::Version
285
+ version: '0'
286
+ type: :development
287
+ prerelease: false
288
+ version_requirements: !ruby/object:Gem::Requirement
289
+ requirements:
290
+ - - ">="
291
+ - !ruby/object:Gem::Version
292
+ version: '0'
293
+ - !ruby/object:Gem::Dependency
294
+ name: shrine
295
+ requirement: !ruby/object:Gem::Requirement
296
+ requirements:
297
+ - - "~>"
298
+ - !ruby/object:Gem::Version
299
+ version: '3.0'
300
+ type: :development
301
+ prerelease: false
302
+ version_requirements: !ruby/object:Gem::Requirement
303
+ requirements:
304
+ - - "~>"
305
+ - !ruby/object:Gem::Version
306
+ version: '3.0'
307
+ - !ruby/object:Gem::Dependency
308
+ name: shrine-mongoid
309
+ requirement: !ruby/object:Gem::Requirement
310
+ requirements:
311
+ - - "~>"
312
+ - !ruby/object:Gem::Version
313
+ version: '1.0'
314
+ type: :development
315
+ prerelease: false
316
+ version_requirements: !ruby/object:Gem::Requirement
317
+ requirements:
318
+ - - "~>"
319
+ - !ruby/object:Gem::Version
320
+ version: '1.0'
265
321
  description: Mongoid / ActiveRecord + RailsAdmin App Settings management
266
322
  email:
267
323
  - glebtv@gmail.com
@@ -270,9 +326,8 @@ extensions: []
270
326
  extra_rdoc_files: []
271
327
  files:
272
328
  - ".gitignore"
329
+ - ".rakeTasks"
273
330
  - ".rspec"
274
- - ".ruby-gemset"
275
- - ".ruby-version"
276
331
  - ".travis.yml"
277
332
  - CHANGELOG.md
278
333
  - Gemfile
@@ -290,6 +345,7 @@ files:
290
345
  - lib/generators/rails_admin_settings/migration_generator.rb
291
346
  - lib/generators/rails_admin_settings/templates/migration.rb
292
347
  - lib/rails_admin_settings.rb
348
+ - lib/rails_admin_settings/determine_mime_type.rb
293
349
  - lib/rails_admin_settings/dumper.rb
294
350
  - lib/rails_admin_settings/engine.rb
295
351
  - lib/rails_admin_settings/fallback.rb
@@ -302,6 +358,7 @@ files:
302
358
  - lib/rails_admin_settings/require_helpers.rb
303
359
  - lib/rails_admin_settings/settings.rb
304
360
  - lib/rails_admin_settings/storage/carrier_wave_uploader.rb
361
+ - lib/rails_admin_settings/storage/shrine_uploader.rb
305
362
  - lib/rails_admin_settings/tasks.rb
306
363
  - lib/rails_admin_settings/uploads.rb
307
364
  - lib/rails_admin_settings/validation.rb
@@ -320,6 +377,7 @@ files:
320
377
  - spec/namespaced_spec.rb
321
378
  - spec/paperclip_spec.rb
322
379
  - spec/settings_spec.rb
380
+ - spec/shrine_spec.rb
323
381
  - spec/spec_helper.rb
324
382
  - spec/support/1024x768.gif
325
383
  - spec/support/database_cleaner.rb
@@ -328,7 +386,7 @@ files:
328
386
  - spec/support/mongoid.rb
329
387
  - spec/support/mongoid.yml
330
388
  - spec/types_spec.rb
331
- homepage: https://github.com/rs-pro/rails_admin_settings
389
+ homepage: https://gitlab.com/rocket-science/rails_admin_settings
332
390
  licenses:
333
391
  - MIT
334
392
  metadata: {}
@@ -347,8 +405,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
347
405
  - !ruby/object:Gem::Version
348
406
  version: '0'
349
407
  requirements: []
350
- rubyforge_project:
351
- rubygems_version: 2.7.6
408
+ rubygems_version: 3.1.2
352
409
  signing_key:
353
410
  specification_version: 4
354
411
  summary: ''
@@ -365,6 +422,7 @@ test_files:
365
422
  - spec/namespaced_spec.rb
366
423
  - spec/paperclip_spec.rb
367
424
  - spec/settings_spec.rb
425
+ - spec/shrine_spec.rb
368
426
  - spec/spec_helper.rb
369
427
  - spec/support/1024x768.gif
370
428
  - spec/support/database_cleaner.rb