sunrise-cms 1.1.1 → 2.0.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.
Files changed (77) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/tests.yml +49 -0
  3. data/.rubocop.yml +3 -1
  4. data/.ruby-version +1 -1
  5. data/CHANGELOG.rdoc +5 -0
  6. data/Gemfile +9 -17
  7. data/Gemfile.lock +332 -207
  8. data/README.md +42 -34
  9. data/app/assets/config/manifest.js +1 -0
  10. data/app/assets/javascripts/sunrise/application.js +2 -4
  11. data/app/controllers/sunrise/manager_controller.rb +4 -6
  12. data/app/controllers/sunrise/settings_controller.rb +2 -3
  13. data/app/helpers/sunrise/structure_helper.rb +2 -2
  14. data/app/views/layouts/sunrise/application.html.erb +2 -0
  15. data/app/views/sunrise/manager/_field.html.erb +5 -5
  16. data/app/views/sunrise/manager/_form.html.erb +15 -15
  17. data/app/views/sunrise/manager/_header_edit.html.erb +3 -4
  18. data/app/views/sunrise/manager/_header_new.html.erb +3 -3
  19. data/app/views/sunrise/manager/_header_show.html.erb +9 -13
  20. data/app/views/sunrise/manager/_nested_field.html.erb +6 -6
  21. data/app/views/sunrise/manager/edit.html.erb +1 -1
  22. data/app/views/sunrise/manager/new.html.erb +1 -1
  23. data/app/views/sunrise/manager/structures/thumbs/_record.html.erb +19 -16
  24. data/app/views/sunrise/manager/thumbs/_record.html.erb +26 -22
  25. data/app/views/sunrise/settings/_form.html.erb +5 -5
  26. data/app/views/sunrise/settings/_header_edit.html.erb +3 -4
  27. data/config/locales/sunrise/en.yml +35 -35
  28. data/config/locales/sunrise/ru.yml +35 -35
  29. data/config/locales/sunrise/uk.yml +35 -35
  30. data/db/migrate/20111216144515_create_assets.rb +1 -1
  31. data/db/migrate/20111216144915_create_structures.rb +1 -1
  32. data/db/migrate/20111216145015_create_users.rb +1 -1
  33. data/db/migrate/20120611095315_create_settings.rb +1 -1
  34. data/lib/generators/sunrise/templates/config/active_record/sunrise.rb +0 -4
  35. data/lib/generators/sunrise/templates/config/mongoid/sunrise.rb +0 -4
  36. data/lib/generators/sunrise/templates/models/active_record/attachment_file.rb +0 -2
  37. data/lib/generators/sunrise/templates/models/active_record/avatar.rb +0 -2
  38. data/lib/generators/sunrise/templates/models/active_record/picture.rb +0 -2
  39. data/lib/generators/sunrise/templates/models/active_record/position_type.rb +4 -4
  40. data/lib/generators/sunrise/templates/models/active_record/role_type.rb +5 -5
  41. data/lib/generators/sunrise/templates/models/active_record/settings.rb +14 -2
  42. data/lib/generators/sunrise/templates/models/active_record/structure_type.rb +6 -6
  43. data/lib/generators/sunrise/templates/models/mongoid/attachment_file.rb +0 -2
  44. data/lib/generators/sunrise/templates/models/mongoid/avatar.rb +0 -2
  45. data/lib/generators/sunrise/templates/models/mongoid/picture.rb +0 -2
  46. data/lib/generators/sunrise/templates/models/mongoid/position_type.rb +4 -4
  47. data/lib/generators/sunrise/templates/models/mongoid/role_type.rb +5 -5
  48. data/lib/generators/sunrise/templates/models/mongoid/structure_type.rb +6 -6
  49. data/lib/generators/sunrise/templates/models/sunrise/sunrise_structure.rb +2 -2
  50. data/lib/generators/sunrise/templates/spec/controllers/pages_controller_spec.rb +2 -2
  51. data/lib/generators/sunrise/templates/spec/controllers/welcome_controller_spec.rb +1 -1
  52. data/lib/generators/sunrise/templates/spec/factories/structure_factory.rb +2 -2
  53. data/lib/generators/sunrise/templates/spec/factories/user_factory.rb +6 -6
  54. data/lib/generators/sunrise/templates/spec/spec_helper.rb +1 -1
  55. data/lib/generators/sunrise/templates/spec/support/helpers/controller_macros.rb +4 -4
  56. data/lib/generators/sunrise/templates/uploaders/attachment_file_uploader.rb +4 -0
  57. data/lib/generators/sunrise/templates/uploaders/avatar_uploader.rb +4 -0
  58. data/lib/generators/sunrise/templates/uploaders/picture_uploader.rb +4 -0
  59. data/lib/sunrise/abstract_model.rb +10 -0
  60. data/lib/sunrise/carrierwave/glue.rb +1 -7
  61. data/lib/sunrise/config.rb +0 -5
  62. data/lib/sunrise/core_ext/string.rb +0 -5
  63. data/lib/sunrise/engine.rb +5 -5
  64. data/lib/sunrise/models/ability.rb +1 -1
  65. data/lib/sunrise/models/position_type.rb +1 -7
  66. data/lib/sunrise/models/role_type.rb +4 -6
  67. data/lib/sunrise/models/structure.rb +3 -3
  68. data/lib/sunrise/models/structure_type.rb +1 -7
  69. data/lib/sunrise/models/user.rb +4 -4
  70. data/lib/sunrise/utils.rb +1 -2
  71. data/lib/sunrise/version.rb +1 -1
  72. data/lib/sunrise/views/search_wrapper.rb +1 -1
  73. data/sunrise-cms.gemspec +8 -11
  74. metadata +22 -38
  75. data/.rspec +0 -2
  76. data/lib/sunrise/carrierwave/file_size_validator.rb +0 -75
  77. data/lib/sunrise/utils/transliteration.rb +0 -73
@@ -65,6 +65,16 @@ module Sunrise
65
65
  @request_params[param_key.to_sym] || {}
66
66
  end
67
67
 
68
+ def permit_model_params(*filters)
69
+ params = @request_params[param_key.to_sym]
70
+
71
+ if params
72
+ filters.empty? ? params.permit! : params.permit(*filters)
73
+ else
74
+ {}
75
+ end
76
+ end
77
+
68
78
  # Save current list view
69
79
  def current_list=(value)
70
80
  @current_list = value.to_sym if value && @available_index_views.include?(value.to_sym)
@@ -10,15 +10,9 @@ module Sunrise
10
10
 
11
11
  module ClassMethods
12
12
  def sunrise_uploader(uploader = nil, options = {}, &block)
13
- options = { mount_on: :data_file_name }.merge(options)
13
+ options = { mount_on: :data_file_name }.merge!(options)
14
14
 
15
15
  mount_uploader(:data, uploader, options, &block)
16
-
17
- validates_processing_of :data
18
- end
19
-
20
- def validates_filesize_of(*attr_names)
21
- validates_with FileSizeValidator, _merge_attributes(attr_names)
22
16
  end
23
17
  end
24
18
 
@@ -40,11 +40,6 @@ module Sunrise
40
40
  mattr_accessor :available_locales
41
41
  @@available_locales = []
42
42
 
43
- # Set transliteration for babosa gem
44
- # more info here: https://github.com/norman/babosa
45
- mattr_accessor :transliteration
46
- @@transliteration = :russian
47
-
48
43
  # Set index toolbar buttons
49
44
  mattr_accessor :default_toolbar_buttons
50
45
  @@default_toolbar_buttons = [:delete, :edit, :new, :sort, :export]
@@ -3,11 +3,6 @@
3
3
  require 'active_support/inflector/inflections'
4
4
 
5
5
  class String
6
- def parameterize(sep = '-')
7
- value = Sunrise::Utils::Transliteration.transliterate(self)
8
- ActiveSupport::Inflector.parameterize(value, sep)
9
- end
10
-
11
6
  def self.randomize(length = 8)
12
7
  Array.new(length) { (rand(122 - 97) + 97).chr }.join
13
8
  end
@@ -2,7 +2,6 @@
2
2
 
3
3
  require 'rails'
4
4
  require 'sunrise'
5
- require 'select2-rails'
6
5
  require 'jquery-ui-rails'
7
6
 
8
7
  module Sunrise
@@ -12,9 +11,10 @@ module Sunrise
12
11
 
13
12
  config.i18n.load_path += Dir[Sunrise.root_path.join('config/locales/**', '*.{rb,yml}')]
14
13
 
15
- config.assets.precompile += %w[
16
- sunrise/*
17
- ]
14
+ config.assets.precompile += %w[sunrise/application.css sunrise/application.js]
15
+ config.assets.precompile += Dir[Sunrise.root_path.join('app/assets/images/sunrise/**/*')].map do |file|
16
+ Pathname.new(file).relative_path_from(Sunrise.root_path.join('app/assets/images')).to_s
17
+ end
18
18
 
19
19
  initializer 'sunrise.setup' do
20
20
  I18n::Backend::Simple.include I18n::Backend::Pluralization
@@ -34,7 +34,7 @@ module Sunrise
34
34
  initializer 'sunrise.csv_renderer' do
35
35
  ::ActionController::Renderers.add :csv do |collection, options|
36
36
  doc = Sunrise::Utils::CsvDocument.new(collection, options)
37
- send_data(doc.render, filename: doc.filename, type: Mime::CSV, disposition: 'attachment')
37
+ send_data(doc.render, filename: doc.filename, disposition: 'attachment')
38
38
  end
39
39
  end
40
40
  end
@@ -14,7 +14,7 @@ module Sunrise
14
14
  @context = context
15
15
 
16
16
  if @user.persisted? && @user.role_type
17
- send @user.role_type.code
17
+ send @user.role_type.name
18
18
  else
19
19
  guest
20
20
  end
@@ -5,14 +5,8 @@ module Sunrise
5
5
  class PositionType
6
6
  include EnumField::DefineEnum
7
7
 
8
- attr_reader :code
9
-
10
- def initialize(code)
11
- @code = code.to_sym
12
- end
13
-
14
8
  def title
15
- I18n.t(@code, scope: [:manage, :structure, :position])
9
+ I18n.t(name, scope: 'manage.structure.position')
16
10
  end
17
11
  end
18
12
  end
@@ -5,14 +5,12 @@ module Sunrise
5
5
  class RoleType
6
6
  include EnumField::DefineEnum
7
7
 
8
- attr_reader :code
9
-
10
- def initialize(code)
11
- @code = code.to_sym
8
+ def title
9
+ I18n.t(name, scope: 'manage.role.name')
12
10
  end
13
11
 
14
- def title
15
- I18n.t(@code, scope: [:manage, :role, :kind])
12
+ def code
13
+ name
16
14
  end
17
15
 
18
16
  def self.legal?(value)
@@ -13,9 +13,9 @@ module Sunrise
13
13
  enumerated_attribute :structure_type
14
14
  enumerated_attribute :position_type
15
15
 
16
- validates_presence_of :title
17
- validates_numericality_of :position_type_id, only_integer: true
18
- validates_numericality_of :structure_type_id, only_integer: true
16
+ validates :title, presence: true
17
+ validates :position_type_id, numericality: { only_integer: true }
18
+ validates :structure_type_id, numericality: { only_integer: true }
19
19
 
20
20
  acts_as_nested_set
21
21
 
@@ -5,14 +5,8 @@ module Sunrise
5
5
  class StructureType
6
6
  include EnumField::DefineEnum
7
7
 
8
- attr_reader :kind
9
-
10
- def initialize(value)
11
- @kind = value.to_sym
12
- end
13
-
14
8
  def title
15
- I18n.t(@kind, scope: [:manage, :structure, :kind])
9
+ I18n.t(name, scope: 'manage.structure.name')
16
10
  end
17
11
  end
18
12
  end
@@ -15,10 +15,10 @@ module Sunrise
15
15
 
16
16
  has_one :avatar, as: :assetable, dependent: :destroy, autosave: true
17
17
 
18
- after_initialize :set_default_role
18
+ before_create :set_default_role
19
19
 
20
20
  validates :name, presence: true
21
- validate :check_role
21
+ validate :ensure_role_is_allowed
22
22
 
23
23
  scope :with_email, ->(email) { where(email: email) }
24
24
  scope :with_name, ->(name) { where(name: name) }
@@ -84,10 +84,10 @@ module Sunrise
84
84
  protected
85
85
 
86
86
  def set_default_role
87
- self.role_type ||= ::RoleType.default
87
+ self.role_type_id ||= ::RoleType.default.id
88
88
  end
89
89
 
90
- def check_role
90
+ def ensure_role_is_allowed
91
91
  errors.add(:role_type_id, :invalid) unless ::RoleType.legal?(role_type_id)
92
92
  end
93
93
  end
data/lib/sunrise/utils.rb CHANGED
@@ -2,7 +2,6 @@
2
2
 
3
3
  module Sunrise
4
4
  module Utils
5
- autoload :Transliteration, 'sunrise/utils/transliteration'
6
5
  autoload :EvalHelpers, 'sunrise/utils/eval_helpers'
7
6
  autoload :CsvDocument, 'sunrise/utils/csv_document'
8
7
  autoload :SearchWrapper, 'sunrise/utils/search_wrapper'
@@ -48,7 +47,7 @@ module Sunrise
48
47
  # Convert input to friendly slug using babosa gem
49
48
  #
50
49
  def self.normalize_friendly_id(input)
51
- input.to_s.to_slug.normalize(transliterations: Sunrise::Config.transliteration).to_s
50
+ input.to_s.parameterize
52
51
  end
53
52
  end
54
53
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Sunrise
4
- VERSION = '1.1.1'.freeze
4
+ VERSION = '2.0.0'.freeze
5
5
  end
@@ -9,7 +9,7 @@ module Sunrise
9
9
 
10
10
  def self.model_name
11
11
  @_model_name ||= begin
12
- namespace = parents.detect { |n| n.respond_to?(:_railtie) }
12
+ namespace = module_parents.detect { |n| n.respond_to?(:_railtie) }
13
13
  ActiveModel::Name.new(self, namespace, 'search')
14
14
  end
15
15
  end
data/sunrise-cms.gemspec CHANGED
@@ -25,26 +25,23 @@ Gem::Specification.new do |s|
25
25
  s.executables = s.files.grep(%r{^exe/}) { |f| File.basename(f) }
26
26
  s.require_paths = ['lib']
27
27
 
28
- s.add_dependency('kaminari')
29
28
  s.add_dependency('rails', '>= 4.0.0')
29
+ s.add_dependency('kaminari')
30
30
  s.add_dependency('simple_form')
31
-
32
- s.add_dependency('babosa')
33
- s.add_dependency('cancan')
34
-
31
+ s.add_dependency('cancancan')
35
32
  s.add_dependency('carrierwave')
36
33
  s.add_dependency('galetahub-enum_field')
37
- s.add_dependency('jquery-ui-rails', '>= 5.0.0')
38
- s.add_dependency('meta_manager', '>= 0.2.0')
34
+ s.add_dependency('jquery-ui-rails')
35
+ s.add_dependency('meta_manager')
39
36
  s.add_dependency('mime-types')
40
37
  s.add_dependency('mini_magick')
41
- s.add_dependency('page_parts', '>= 0.1.3')
42
- s.add_dependency('public_activity', '>= 1.0.0')
43
- s.add_dependency('rails-settings-cached', '>= 0.4.0')
38
+ s.add_dependency('page_parts')
39
+ s.add_dependency('public_activity')
40
+ s.add_dependency('rails-settings-cached')
44
41
  s.add_dependency('rails-uploader')
45
42
 
46
43
  s.add_development_dependency('capybara')
47
44
  s.add_development_dependency('database_cleaner')
48
- s.add_development_dependency('factory_girl_rails')
45
+ s.add_development_dependency('factory_bot_rails')
49
46
  s.add_development_dependency('rspec-rails')
50
47
  end
metadata CHANGED
@@ -1,30 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sunrise-cms
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.1
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Igor Galeta
8
8
  - Pavlo Galeta
9
- autorequire:
9
+ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2021-04-13 00:00:00.000000000 Z
12
+ date: 2025-06-03 00:00:00.000000000 Z
13
13
  dependencies:
14
- - !ruby/object:Gem::Dependency
15
- name: kaminari
16
- requirement: !ruby/object:Gem::Requirement
17
- requirements:
18
- - - ">="
19
- - !ruby/object:Gem::Version
20
- version: '0'
21
- type: :runtime
22
- prerelease: false
23
- version_requirements: !ruby/object:Gem::Requirement
24
- requirements:
25
- - - ">="
26
- - !ruby/object:Gem::Version
27
- version: '0'
28
14
  - !ruby/object:Gem::Dependency
29
15
  name: rails
30
16
  requirement: !ruby/object:Gem::Requirement
@@ -40,7 +26,7 @@ dependencies:
40
26
  - !ruby/object:Gem::Version
41
27
  version: 4.0.0
42
28
  - !ruby/object:Gem::Dependency
43
- name: simple_form
29
+ name: kaminari
44
30
  requirement: !ruby/object:Gem::Requirement
45
31
  requirements:
46
32
  - - ">="
@@ -54,7 +40,7 @@ dependencies:
54
40
  - !ruby/object:Gem::Version
55
41
  version: '0'
56
42
  - !ruby/object:Gem::Dependency
57
- name: babosa
43
+ name: simple_form
58
44
  requirement: !ruby/object:Gem::Requirement
59
45
  requirements:
60
46
  - - ">="
@@ -68,7 +54,7 @@ dependencies:
68
54
  - !ruby/object:Gem::Version
69
55
  version: '0'
70
56
  - !ruby/object:Gem::Dependency
71
- name: cancan
57
+ name: cancancan
72
58
  requirement: !ruby/object:Gem::Requirement
73
59
  requirements:
74
60
  - - ">="
@@ -115,28 +101,28 @@ dependencies:
115
101
  requirements:
116
102
  - - ">="
117
103
  - !ruby/object:Gem::Version
118
- version: 5.0.0
104
+ version: '0'
119
105
  type: :runtime
120
106
  prerelease: false
121
107
  version_requirements: !ruby/object:Gem::Requirement
122
108
  requirements:
123
109
  - - ">="
124
110
  - !ruby/object:Gem::Version
125
- version: 5.0.0
111
+ version: '0'
126
112
  - !ruby/object:Gem::Dependency
127
113
  name: meta_manager
128
114
  requirement: !ruby/object:Gem::Requirement
129
115
  requirements:
130
116
  - - ">="
131
117
  - !ruby/object:Gem::Version
132
- version: 0.2.0
118
+ version: '0'
133
119
  type: :runtime
134
120
  prerelease: false
135
121
  version_requirements: !ruby/object:Gem::Requirement
136
122
  requirements:
137
123
  - - ">="
138
124
  - !ruby/object:Gem::Version
139
- version: 0.2.0
125
+ version: '0'
140
126
  - !ruby/object:Gem::Dependency
141
127
  name: mime-types
142
128
  requirement: !ruby/object:Gem::Requirement
@@ -171,42 +157,42 @@ dependencies:
171
157
  requirements:
172
158
  - - ">="
173
159
  - !ruby/object:Gem::Version
174
- version: 0.1.3
160
+ version: '0'
175
161
  type: :runtime
176
162
  prerelease: false
177
163
  version_requirements: !ruby/object:Gem::Requirement
178
164
  requirements:
179
165
  - - ">="
180
166
  - !ruby/object:Gem::Version
181
- version: 0.1.3
167
+ version: '0'
182
168
  - !ruby/object:Gem::Dependency
183
169
  name: public_activity
184
170
  requirement: !ruby/object:Gem::Requirement
185
171
  requirements:
186
172
  - - ">="
187
173
  - !ruby/object:Gem::Version
188
- version: 1.0.0
174
+ version: '0'
189
175
  type: :runtime
190
176
  prerelease: false
191
177
  version_requirements: !ruby/object:Gem::Requirement
192
178
  requirements:
193
179
  - - ">="
194
180
  - !ruby/object:Gem::Version
195
- version: 1.0.0
181
+ version: '0'
196
182
  - !ruby/object:Gem::Dependency
197
183
  name: rails-settings-cached
198
184
  requirement: !ruby/object:Gem::Requirement
199
185
  requirements:
200
186
  - - ">="
201
187
  - !ruby/object:Gem::Version
202
- version: 0.4.0
188
+ version: '0'
203
189
  type: :runtime
204
190
  prerelease: false
205
191
  version_requirements: !ruby/object:Gem::Requirement
206
192
  requirements:
207
193
  - - ">="
208
194
  - !ruby/object:Gem::Version
209
- version: 0.4.0
195
+ version: '0'
210
196
  - !ruby/object:Gem::Dependency
211
197
  name: rails-uploader
212
198
  requirement: !ruby/object:Gem::Requirement
@@ -250,7 +236,7 @@ dependencies:
250
236
  - !ruby/object:Gem::Version
251
237
  version: '0'
252
238
  - !ruby/object:Gem::Dependency
253
- name: factory_girl_rails
239
+ name: factory_bot_rails
254
240
  requirement: !ruby/object:Gem::Requirement
255
241
  requirements:
256
242
  - - ">="
@@ -283,8 +269,8 @@ executables: []
283
269
  extensions: []
284
270
  extra_rdoc_files: []
285
271
  files:
272
+ - ".github/workflows/tests.yml"
286
273
  - ".gitignore"
287
- - ".rspec"
288
274
  - ".rubocop.yml"
289
275
  - ".ruby-version"
290
276
  - CHANGELOG.rdoc
@@ -293,6 +279,7 @@ files:
293
279
  - MIT-LICENSE
294
280
  - README.md
295
281
  - Rakefile
282
+ - app/assets/config/manifest.js
296
283
  - app/assets/images/alert.png
297
284
  - app/assets/images/cross_ico.png
298
285
  - app/assets/images/gravatar-140.png
@@ -518,7 +505,6 @@ files:
518
505
  - lib/sunrise.rb
519
506
  - lib/sunrise/abstract_model.rb
520
507
  - lib/sunrise/carrierwave/base_uploader.rb
521
- - lib/sunrise/carrierwave/file_size_validator.rb
522
508
  - lib/sunrise/carrierwave/glue.rb
523
509
  - lib/sunrise/config.rb
524
510
  - lib/sunrise/config/association.rb
@@ -553,7 +539,6 @@ files:
553
539
  - lib/sunrise/utils/csv_document.rb
554
540
  - lib/sunrise/utils/eval_helpers.rb
555
541
  - lib/sunrise/utils/search_wrapper.rb
556
- - lib/sunrise/utils/transliteration.rb
557
542
  - lib/sunrise/version.rb
558
543
  - lib/sunrise/views/date_time_input.rb
559
544
  - lib/sunrise/views/form_builder.rb
@@ -568,7 +553,7 @@ homepage: https://github.com/galetahub/sunrise
568
553
  licenses:
569
554
  - MIT
570
555
  metadata: {}
571
- post_install_message:
556
+ post_install_message:
572
557
  rdoc_options: []
573
558
  require_paths:
574
559
  - lib
@@ -583,9 +568,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
583
568
  - !ruby/object:Gem::Version
584
569
  version: '0'
585
570
  requirements: []
586
- rubyforge_project:
587
- rubygems_version: 2.7.6.2
588
- signing_key:
571
+ rubygems_version: 3.5.23
572
+ signing_key:
589
573
  specification_version: 4
590
574
  summary: Rails CMS
591
575
  test_files: []
data/.rspec DELETED
@@ -1,2 +0,0 @@
1
- --format Fuubar
2
- --color
@@ -1,75 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Sunrise
4
- module CarrierWave
5
- class FileSizeValidator < ActiveModel::EachValidator
6
- MESSAGES = { is: :wrong_size, minimum: :size_too_small, maximum: :size_too_big }.freeze
7
- CHECKS = { is: :==, minimum: :>=, maximum: :<= }.freeze
8
-
9
- DEFAULT_TOKENIZER = ->(value) { value.split(//) }
10
- RESERVED_OPTIONS = [:minimum, :maximum, :within, :is, :tokenizer, :too_short, :too_long].freeze
11
-
12
- def initialize(options)
13
- if range = (options.delete(:in) || options.delete(:within))
14
- raise ArgumentError, ':in and :within must be a Range' unless range.is_a?(Range)
15
-
16
- options[:minimum] = range.begin
17
- options[:maximum] = range.end
18
- options[:maximum] -= 1 if range.exclude_end?
19
- end
20
-
21
- super
22
- end
23
-
24
- def check_validity!
25
- keys = CHECKS.keys & options.keys
26
-
27
- if keys.empty?
28
- raise ArgumentError, 'Range unspecified. Specify the :within, :maximum, :minimum, or :is option.'
29
- end
30
-
31
- keys.each do |key|
32
- value = options[key]
33
-
34
- unless value.is_a?(Integer) && value >= 0
35
- raise ArgumentError, ":#{key} must be a nonnegative Integer"
36
- end
37
- end
38
- end
39
-
40
- def validate_each(record, attribute, value)
41
- unless value.is_a? ::CarrierWave::Uploader::Base
42
- raise(ArgumentError, 'A CarrierWave::Uploader::Base object was expected')
43
- end
44
-
45
- value = (options[:tokenizer] || DEFAULT_TOKENIZER).call(value) if value.is_a?(String)
46
-
47
- CHECKS.each do |key, validity_check|
48
- next unless check_value = options[key]
49
-
50
- value ||= [] if key == :maximum
51
-
52
- value_size = value.size
53
- next if value_size.send(validity_check, check_value)
54
-
55
- errors_options = options.except(*RESERVED_OPTIONS)
56
- errors_options[:file_size] = help.number_to_human_size check_value
57
-
58
- default_message = options[MESSAGES[key]]
59
- errors_options[:message] ||= default_message if default_message
60
-
61
- record.errors.add(attribute, MESSAGES[key], errors_options)
62
- end
63
- end
64
-
65
- def help
66
- Helper.instance
67
- end
68
-
69
- class Helper
70
- include Singleton
71
- include ActionView::Helpers::NumberHelper
72
- end
73
- end
74
- end
75
- end
@@ -1,73 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Sunrise
4
- module Utils
5
- # Russian transliteration
6
- #
7
- module Transliteration
8
- extend self
9
-
10
- # Transliteration heavily based on rutils gem by Julian "julik" Tarkhanov and Co.
11
- # <http://rutils.rubyforge.org/>
12
- # Cleaned up and optimized.
13
-
14
- LOWER_SINGLE = {
15
- 'і' => 'i', 'ґ' => 'g', 'ё' => 'yo', '№' => '#', 'є' => 'e',
16
- 'ї' => 'yi', 'а' => 'a', 'б' => 'b',
17
- 'в' => 'v', 'г' => 'g', 'д' => 'd', 'е' => 'e', 'ж' => 'zh',
18
- 'з' => 'z', 'и' => 'i', 'й' => 'y', 'к' => 'k', 'л' => 'l',
19
- 'м' => 'm', 'н' => 'n', 'о' => 'o', 'п' => 'p', 'р' => 'r',
20
- 'с' => 's', 'т' => 't', 'у' => 'u', 'ф' => 'f', 'х' => 'h',
21
- 'ц' => 'ts', 'ч' => 'ch', 'ш' => 'sh', 'щ' => 'sch', 'ъ' => "'",
22
- 'ы' => 'y', 'ь' => '', 'э' => 'e', 'ю' => 'yu', 'я' => 'ya'
23
- }.freeze
24
- LOWER_MULTI = {
25
- 'ье' => 'ie',
26
- 'ьё' => 'ie'
27
- }.freeze
28
-
29
- UPPER_SINGLE = {
30
- 'Ґ' => 'G', 'Ё' => 'YO', 'Є' => 'E', 'Ї' => 'YI', 'І' => 'I',
31
- 'А' => 'A', 'Б' => 'B', 'В' => 'V', 'Г' => 'G',
32
- 'Д' => 'D', 'Е' => 'E', 'Ж' => 'ZH', 'З' => 'Z', 'И' => 'I',
33
- 'Й' => 'Y', 'К' => 'K', 'Л' => 'L', 'М' => 'M', 'Н' => 'N',
34
- 'О' => 'O', 'П' => 'P', 'Р' => 'R', 'С' => 'S', 'Т' => 'T',
35
- 'У' => 'U', 'Ф' => 'F', 'Х' => 'H', 'Ц' => 'TS', 'Ч' => 'CH',
36
- 'Ш' => 'SH', 'Щ' => 'SCH', 'Ъ' => "'", 'Ы' => 'Y', 'Ь' => '',
37
- 'Э' => 'E', 'Ю' => 'YU', 'Я' => 'YA'
38
- }.freeze
39
- UPPER_MULTI = {
40
- 'ЬЕ' => 'IE',
41
- 'ЬЁ' => 'IE'
42
- }.freeze
43
-
44
- LOWER = LOWER_SINGLE.merge(LOWER_MULTI).freeze
45
- UPPER = UPPER_SINGLE.merge(UPPER_MULTI).freeze
46
- MULTI_KEYS = LOWER_MULTI.merge(UPPER_MULTI).keys.sort_by { |s| s.length }.reverse.freeze
47
-
48
- # Transliterate a string with russian characters
49
- #
50
- # Возвращает строку, в которой все буквы русского алфавита заменены на похожую по звучанию латиницу
51
- def transliterate(str)
52
- chars = str.scan(/#{MULTI_KEYS.join '|'}|\w|./)
53
-
54
- result = ''
55
-
56
- chars.each_with_index do |char, index|
57
- result << if UPPER.key?(char) && LOWER.key?(chars[index + 1])
58
- # combined case
59
- UPPER[char].downcase.capitalize
60
- elsif UPPER.key?(char)
61
- UPPER[char]
62
- elsif LOWER.key?(char)
63
- LOWER[char]
64
- else
65
- char
66
- end
67
- end
68
-
69
- result
70
- end
71
- end
72
- end
73
- end