rails_admin_settings 1.4.0 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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