ab_admin 0.8.3 → 0.9.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 (114) hide show
  1. checksums.yaml +4 -4
  2. data/MIT-LICENSE +1 -1
  3. data/README.md +11 -5
  4. data/app/assets/javascripts/ab_admin/components/admin_assets.js.coffee +0 -25
  5. data/app/assets/javascripts/ab_admin/components/google_translate.js.coffee +3 -5
  6. data/app/assets/javascripts/ab_admin/components/in_place_edit.js.coffee +5 -1
  7. data/app/assets/javascripts/ab_admin/core/columns_hider.js.coffee +24 -23
  8. data/app/assets/javascripts/ab_admin/core/init.js.coffee +6 -2
  9. data/app/assets/javascripts/ab_admin/core/search_form.js.coffee +1 -7
  10. data/app/assets/javascripts/ab_admin/core/ui_utils.js.coffee +2 -6
  11. data/app/assets/javascripts/ab_admin/core/utils.js.coffee +8 -2
  12. data/app/assets/javascripts/ab_admin/main.js +2 -2
  13. data/app/assets/stylesheets/ab_admin/bootstrap_and_overrides.scss +35 -10
  14. data/app/assets/stylesheets/ab_admin/components/_base.scss +21 -1
  15. data/app/assets/stylesheets/ab_admin/components/_form.scss +13 -17
  16. data/app/assets/stylesheets/ab_admin/components/_grid_view.scss +2 -2
  17. data/app/assets/stylesheets/ab_admin/components/_locale_tabs.scss +11 -23
  18. data/app/assets/stylesheets/ab_admin/components/_navigation.scss +0 -9
  19. data/app/assets/stylesheets/ab_admin/components/_table_view.scss +10 -2
  20. data/app/assets/stylesheets/ab_admin/components/_tooltip.scss +80 -0
  21. data/app/assets/stylesheets/ab_admin/components/_tree_view.scss +1 -1
  22. data/app/assets/stylesheets/ab_admin/devise.scss +2 -2
  23. data/app/assets/stylesheets/ab_admin/fileupload.scss +2 -9
  24. data/app/assets/stylesheets/ab_admin/main.scss +0 -1
  25. data/app/controllers/admin/base_controller.rb +67 -63
  26. data/app/controllers/admin/dashboards_controller.rb +2 -2
  27. data/app/controllers/admin/locators_controller.rb +8 -6
  28. data/app/controllers/admin/manager_controller.rb +2 -2
  29. data/app/controllers/admin/static_pages_controller.rb +0 -4
  30. data/app/controllers/admin/structures_controller.rb +2 -2
  31. data/app/views/admin/assets/batch_edit.html.slim +1 -1
  32. data/app/views/admin/base/_search_layout.html.slim +6 -5
  33. data/app/views/admin/base/create.js.erb +5 -2
  34. data/app/views/admin/base/index.html.slim +4 -4
  35. data/app/views/admin/base/update.js.erb +5 -0
  36. data/app/views/admin/fileupload/_asset_templates.html.slim +1 -2
  37. data/app/views/admin/fileupload/_image.html.slim +1 -2
  38. data/app/views/admin/locators/edit.html.slim +7 -6
  39. data/app/views/admin/manager/_map.html.slim +4 -0
  40. data/app/views/admin/manager/_table.html.slim +1 -1
  41. data/app/views/admin/shared/_content_actions.html.slim +19 -21
  42. data/app/views/admin/shared/_flash.html.slim +5 -4
  43. data/app/views/admin/shared/_locale_tabs.html.slim +2 -2
  44. data/app/views/admin/shared/_main_menu.html.slim +1 -1
  45. data/app/views/admin/structures/_form.html.slim +1 -1
  46. data/app/views/admin/users/_form.html.slim +1 -1
  47. data/app/views/admin/users/_search_form.html.slim +1 -1
  48. data/app/views/layouts/admin/_footer.html.slim +0 -1
  49. data/app/views/layouts/admin/_navigation.html.slim +1 -1
  50. data/app/views/layouts/admin/application.html.slim +2 -2
  51. data/config/locales/de.yml +1 -2
  52. data/config/locales/en.yml +1 -2
  53. data/config/locales/ru.yml +0 -1
  54. data/config/locales/uk.yml +0 -1
  55. data/lib/ab_admin.rb +34 -33
  56. data/lib/ab_admin/abstract_resource.rb +1 -1
  57. data/lib/ab_admin/carrierwave/base_uploader.rb +1 -2
  58. data/lib/ab_admin/concerns/admin_addition.rb +0 -30
  59. data/lib/ab_admin/concerns/translations_macro.rb +97 -0
  60. data/lib/ab_admin/concerns/utilities.rb +1 -1
  61. data/lib/ab_admin/config/base.rb +7 -0
  62. data/lib/ab_admin/controllers/callbacks.rb +3 -26
  63. data/lib/ab_admin/core_ext/array.rb +4 -48
  64. data/lib/ab_admin/core_ext/hash.rb +2 -31
  65. data/lib/ab_admin/core_ext/other.rb +0 -6
  66. data/lib/ab_admin/core_ext/string.rb +0 -80
  67. data/lib/ab_admin/engine.rb +1 -0
  68. data/lib/ab_admin/hooks/will_paginate_id_prefetch.rb +8 -6
  69. data/lib/ab_admin/hooks/will_paginate_no_uri.rb +1 -1
  70. data/lib/ab_admin/i18n_tools/google_translate.rb +3 -1
  71. data/lib/ab_admin/i18n_tools/model_translator.rb +1 -1
  72. data/lib/ab_admin/models/header.rb +2 -2
  73. data/lib/ab_admin/models/locator.rb +28 -2
  74. data/lib/ab_admin/models/user.rb +12 -48
  75. data/lib/ab_admin/utils/csv_document.rb +5 -3
  76. data/lib/ab_admin/utils/eval_helpers.rb +6 -3
  77. data/lib/ab_admin/utils/xls_document.rb +18 -16
  78. data/lib/ab_admin/version.rb +1 -1
  79. data/lib/ab_admin/views/admin_helpers.rb +10 -12
  80. data/lib/ab_admin/views/admin_navigation_helpers.rb +7 -8
  81. data/lib/ab_admin/views/form_builder.rb +7 -5
  82. data/lib/ab_admin/views/helpers.rb +0 -9
  83. data/lib/ab_admin/views/inputs/ckeditor_input.rb +4 -4
  84. data/lib/ab_admin/views/manager_helpers.rb +8 -5
  85. data/lib/ab_admin/views/search_form_builder.rb +2 -2
  86. data/lib/ab_admin/views/will_paginate_bootstrap_renderer.rb +60 -0
  87. data/lib/generators/ab_admin/glob/glob_generator.rb +4 -5
  88. data/lib/generators/ab_admin/glob/templates/migration.erb +10 -7
  89. data/lib/generators/ab_admin/install/templates/config/ab_admin.rb.erb +1 -1
  90. data/lib/generators/ab_admin/install/templates/models/user.rb +0 -11
  91. data/lib/generators/ab_admin/install/templates/spec/spec_helper.rb +0 -1
  92. data/lib/generators/ab_admin/install/templates/spec/support/database_cleaner.rb +8 -11
  93. data/lib/generators/ab_admin/model/model_generator.rb +3 -4
  94. data/lib/generators/ab_admin/model/templates/resource.erb +5 -2
  95. data/lib/generators/ab_admin/resource/templates/controller.erb +2 -2
  96. metadata +37 -79
  97. data/app/assets/images/admin/Jcrop.gif +0 -0
  98. data/app/assets/images/admin/flags/de.png +0 -0
  99. data/app/assets/images/admin/flags/en.png +0 -0
  100. data/app/assets/images/admin/flags/es.png +0 -0
  101. data/app/assets/images/admin/flags/fr.png +0 -0
  102. data/app/assets/images/admin/flags/it.png +0 -0
  103. data/app/assets/images/admin/flags/ja.png +0 -0
  104. data/app/assets/images/admin/flags/pl.png +0 -0
  105. data/app/assets/images/admin/flags/ru.png +0 -0
  106. data/app/assets/images/admin/flags/uk.png +0 -0
  107. data/app/assets/javascripts/ab_admin/components/croppable_image.js.coffee +0 -33
  108. data/app/assets/stylesheets/ab_admin/components/_columns_hider.scss +0 -5
  109. data/app/assets/stylesheets/ab_admin/components/_perms.scss +0 -39
  110. data/app/views/admin/shared/_columns_hider.html.slim +0 -9
  111. data/lib/ab_admin/hooks/globalize_locale_suffix_accessors.rb +0 -25
  112. data/lib/ab_admin/hooks/globalize_valid_locale.rb +0 -9
  113. data/lib/generators/ab_admin/ckeditor_assets/ckeditor_assets_generator.rb +0 -19
  114. data/lib/generators/template.rb +0 -96
@@ -105,7 +105,6 @@ uk:
105
105
  drop_here: "или бросьте файл(ы) сюда"
106
106
  main_image: "Сделать главным"
107
107
  max_size: "Макс разм."
108
- crop: "Обрезать"
109
108
  rotate: "Повернуть"
110
109
  form:
111
110
  cancel: "Отмена"
@@ -9,7 +9,7 @@ require 'ab_admin/engine'
9
9
 
10
10
  module AbAdmin
11
11
  DOMAINNAME_REGEXP = /\A(?:[0-9a-z]\.|[0-9a-z][0-9a-z\-]*[0-9a-z]+\.)+[a-z]{2,6}\z/
12
- EMAIL_REGEXP = /\A[_A-Za-z0-9\-\+]+(?:\.[_A-Za-z0-9\-\+]+)*@(?:[0-9a-z]\.|[0-9a-z][0-9a-z\-]*[0-9a-z]+\.)+[a-z]{2,6}\z/
12
+ EMAIL_REGEXP = /\A(?#Local part)[_A-Za-z0-9\-]+(?:\.[_A-Za-z0-9\-]+)*@(?#Subdomains)(?:[0-9a-z]\.|[0-9a-z][0-9a-z\-]*[0-9a-z]+\.)+(?#TopLevel Domains)[a-z]{2,18}\z/
13
13
 
14
14
  autoload :Utils, 'ab_admin/utils'
15
15
  autoload :Devise, 'ab_admin/devise'
@@ -63,6 +63,7 @@ module AbAdmin
63
63
  autoload :HasTracking, 'ab_admin/concerns/has_tracking'
64
64
  autoload :AssetHumanNames, 'ab_admin/concerns/asset_human_names'
65
65
  autoload :Fileuploads, 'ab_admin/concerns/fileuploads'
66
+ autoload :TranslationsMacro, 'ab_admin/concerns/translations_macro'
66
67
  end
67
68
 
68
69
  module Controllers
@@ -100,6 +101,7 @@ module AbAdmin
100
101
  autoload :SearchFormBuilder, 'ab_admin/views/search_form_builder'
101
102
  autoload :UrlForRoutes, 'ab_admin/views/url_for_routes'
102
103
  autoload :ContentOnlyWrapper, 'ab_admin/views/content_only_wrapper'
104
+ autoload :WillPaginateBootstrapRenderer, 'ab_admin/views/will_paginate_bootstrap_renderer'
103
105
 
104
106
  module Inputs
105
107
  autoload :CkeditorInput, 'ab_admin/views/inputs/ckeditor_input'
@@ -125,6 +127,13 @@ module AbAdmin
125
127
  end
126
128
 
127
129
  mattr_accessor :menu
130
+ mattr_accessor :body_css_class
131
+ mattr_accessor :favicon_path
132
+ mattr_accessor :footer_notes
133
+ mattr_accessor :default_url_options
134
+ mattr_accessor :locale
135
+ mattr_accessor :root_path
136
+ mattr_accessor :base_url
128
137
 
129
138
  mattr_accessor :flash_keys
130
139
  @@flash_keys = [:notice, :error]
@@ -135,11 +144,8 @@ module AbAdmin
135
144
  mattr_accessor :site_name
136
145
  @@site_name = 'AbAdmin'
137
146
 
138
- mattr_accessor :root_path
139
-
140
- mattr_accessor :body_css_class
141
-
142
- mattr_accessor :favicon_path
147
+ mattr_accessor :footer
148
+ @@footer = true
143
149
 
144
150
  mattr_accessor :devise_layout
145
151
  @@devise_layout = 'admin/devise'
@@ -154,46 +160,41 @@ module AbAdmin
154
160
  @@translate_models = %w(User Asset Structure StaticPage Header AdminComment)
155
161
 
156
162
  mattr_accessor :assets
157
- @@assets = %w(ab_admin/devise.css bootstrap.js ab_admin/loading.gif ab_admin/clear.png ab_admin/clear.png admin/flags/*.png)
163
+ @@assets = %w(ab_admin/devise.css bootstrap.js ab_admin/loading.gif ab_admin/clear.png ab_admin/clear.png)
158
164
 
159
165
  mattr_accessor :test_settings
160
166
  @@test_settings = {}
161
167
 
162
- mattr_accessor :footer
163
- @@footer = true
164
-
165
- mattr_accessor :footer_notes
166
-
167
- mattr_accessor :default_url_options
168
-
169
- mattr_accessor :locale
170
-
171
168
  mattr_accessor :fileupload_url
172
169
  @@fileupload_url = '/admin/assets'
173
170
 
174
171
  mattr_accessor :uploads_dir
175
172
  @@uploads_dir = 'uploads'
176
173
 
177
- mattr_accessor :base_url
178
-
179
- mattr_accessor :default_resource_settings
180
- @@default_resource_settings = {index_view: 'table', search: true, batch: true, hotkeys: true, list_dblclick: true}
181
-
182
- mattr_accessor :default_per_page
183
- @@default_per_page = 50
184
-
185
- mattr_accessor :view_default_per_page
186
- @@view_default_per_page = Hash.new { AbAdmin.default_per_page }
187
- @@view_default_per_page[:tree] = 1000
174
+ mattr_accessor :default_permitted_params
175
+ @@default_permitted_params = [:fileupload_guid]
188
176
 
189
- mattr_accessor :max_per_page
190
- @@max_per_page = Float::INFINITY
177
+ mattr_accessor :translated_locales
178
+ @@translated_locales = []
191
179
 
192
- mattr_accessor :per_page_variants
193
- @@per_page_variants = [50, 100, 500, 1000]
180
+ mattr_accessor :locale_to_country_code
181
+ @@locale_to_country_code = {ja: :jp, en: :gb, uk: :ua}
194
182
 
195
- mattr_accessor :default_permitted_params
196
- @@default_permitted_params = [:fileupload_guid]
183
+ mattr_accessor :default_resource_settings
184
+ @@default_resource_settings = {
185
+ index_views: [:table],
186
+ search: true,
187
+ batch: true,
188
+ hotkeys: true,
189
+ button_scopes: true,
190
+ list_dblclick: true,
191
+ max_per_page: 10_000,
192
+ per_page_variants: [50, 100, 500, 1000],
193
+ default_per_page: 50,
194
+ view_default_per_page: Hash.new { 50 }.update(table: 50, tree: 1000, map: 1000),
195
+ pagination_index_views: [:table, :grid],
196
+ collection_actions: %w(index search batch rebuild),
197
+ }
197
198
 
198
199
  extend Utils
199
200
 
@@ -6,7 +6,7 @@ module AbAdmin
6
6
  ACTIONS = [:index, :show, :new, :edit, :create, :update, :destroy, :preview, :batch, :rebuild, :custom_action, :history]
7
7
  end
8
8
 
9
- attr_accessor :model, :table, :search, :export, :form, :chart, :modal_form, :show, :preview_path, :actions, :custom_settings,
9
+ attr_accessor :model, :table, :search, :export, :form, :chart, :map, :modal_form, :show, :preview_path, :actions, :custom_settings,
10
10
  :batch_action_list, :action_items, :disabled_action_items, :resource_action_items, :tree_node_renderer,
11
11
  :parent_resources, :custom_actions, :permitted_params, :scopes
12
12
 
@@ -1,4 +1,3 @@
1
- require 'mime/types'
2
1
  require 'mini_magick'
3
2
  require 'carrierwave/processing/mini_magick'
4
3
 
@@ -89,7 +88,7 @@ module AbAdmin
89
88
 
90
89
  def normalize_filename(raw_filename)
91
90
  parameterize_args = ActiveSupport::VERSION::MAJOR > 4 ? {separator: '_'} : '_'
92
- I18n.transliterate(raw_filename).parameterize(parameterize_args).gsub(/[\-_]+/, '_').downcase
91
+ I18n.transliterate(raw_filename).parameterize(**parameterize_args).gsub(/[\-_]+/, '_').downcase
93
92
  end
94
93
 
95
94
  # rename files via move
@@ -12,13 +12,6 @@ module AbAdmin
12
12
  self.batch_actions = [:destroy]
13
13
  end
14
14
 
15
- module ClassMethods
16
- def for_input_token(r, attr=nil)
17
- text = attr ? r[attr] : (r['name_ru'] || r['name'])
18
- {id: r.id, text: text}
19
- end
20
- end
21
-
22
15
  def for_input_token
23
16
  {id: id, text: AbAdmin.safe_display_name(self).to_s}
24
17
  end
@@ -27,28 +20,6 @@ module AbAdmin
27
20
  "#{self.class.model_name.human(count: 1)} ##{self.id} #{AbAdmin.safe_display_name(self)}"
28
21
  end
29
22
 
30
- def translated_any(attr)
31
- send(attr).presence || translations.detect { |r| r.send(attr).present? }.try!(attr)
32
- end
33
-
34
- def new_changes
35
- excluded_attrs = [:updated_at]
36
- excluded_attrs += translated_attribute_names if self.class.translates?
37
- all_changes = changes.except(*excluded_attrs).map { |k, v| [k, v[1]] }.to_h
38
- if self.class.translates?
39
- globalize.dirty.each do |attr, changes|
40
- changes.each do |change|
41
- all_changes["#{attr}_#{change[0]}"] = send("#{attr}_#{change[0]}")
42
- end
43
- end
44
- end
45
- all_changes
46
- end
47
-
48
- def admin_comments_count_non_zero
49
- self[:admin_comments_count].to_i.zero? ? nil : self[:admin_comments_count]
50
- end
51
-
52
23
  def token_data(method, options={})
53
24
  assoc = self.class.reflect_on_association(method)
54
25
  scope = send(method)
@@ -92,7 +63,6 @@ module AbAdmin
92
63
  sql = "(#{quoted_order_col} #{predicate} :val OR (#{quoted_order_col} = :val AND #{self.class.quote_column('id')} #{id_predicate} #{id}))"
93
64
  scope.where(sql, val: send(order_col)).ransack(query[:q]).result(distinct: true).first
94
65
  end
95
-
96
66
  end
97
67
  end
98
68
  end
@@ -0,0 +1,97 @@
1
+ module AbAdmin
2
+ module Concerns
3
+ module TranslationsMacro
4
+ def translates(*attr_names)
5
+ options = attr_names.extract_options!
6
+ setup_translations(options) unless translates?
7
+ add_translated_attributes(attr_names.map(&:to_sym) - translated_attribute_names)
8
+ end
9
+
10
+ def setup_translations(options)
11
+ include InstanceMethods
12
+ extend ClassMethods
13
+
14
+ class_attribute :translated_attribute_names, :translation_options
15
+ self.translated_attribute_names = []
16
+ self.translation_options = options
17
+
18
+ has_many :translations, class_name: translation_class.name, foreign_key: class_name.foreign_key, dependent: :destroy, autosave: true, inverse_of: :translated_model
19
+ end
20
+
21
+ def add_translated_attributes(attr_names)
22
+ attr_names.each do |attr_name|
23
+ define_translation_accessors(attr_name)
24
+ self.translated_attribute_names << attr_name
25
+ end
26
+ end
27
+
28
+ def define_translation_accessors(attr_name)
29
+ define_method("#{attr_name}_translation") { translation_for_locale(I18n.locale).try!(:send, attr_name) }
30
+ define_method("#{attr_name}_translation=") {|v| translation_for_locale(I18n.locale).try!(:send, "#{attr_name}=", v) }
31
+ alias_method attr_name, "#{attr_name}_translation"
32
+ alias_method "#{attr_name}=", "#{attr_name}_translation="
33
+ define_method("#{attr_name}_default"){ translation_for_locale(I18n.default_locale).try!(:send, attr_name) }
34
+ AbAdmin.translated_locales.each do |l|
35
+ define_method("#{attr_name}_#{l}") {translation_for_locale(l).try!(:send, attr_name)}
36
+ define_method("#{attr_name}_#{l}=") {|v| translation_for_locale(l).try!(:send, "#{attr_name}=", v)}
37
+ end
38
+ end
39
+
40
+ def class_name
41
+ name.split('::').last
42
+ end
43
+
44
+ def translates?
45
+ included_modules.include?(InstanceMethods)
46
+ end
47
+
48
+ module InstanceMethods
49
+ def translation_for_locale(l)
50
+ return unless AbAdmin.translated_locales.include?(l)
51
+ translations.detect{|r| r.locale == l.to_s} || translations.new(locale: l.to_s)
52
+ end
53
+
54
+ def translated_attributes
55
+ translated_attribute_names.map{|attr| [attr, send(attr)] }.to_h.stringify_keys
56
+ end
57
+
58
+ def attributes
59
+ super.merge!(translated_attributes)
60
+ end
61
+ end
62
+
63
+ module ClassMethods
64
+ def translation_class
65
+ @translation_class ||= begin
66
+ klass = self.const_defined?(:Translation, false) ? self.const_get(:Translation, false) : self.const_set(:Translation, Class.new(BaseTranslation))
67
+ klass.belongs_to :translated_model, class_name: self.name, foreign_key: class_name.foreign_key, inverse_of: :translations, touch: translation_options.fetch(:touch, false)
68
+ klass
69
+ end
70
+ end
71
+
72
+ def translations_table_name
73
+ translation_class.table_name
74
+ end
75
+
76
+ def translated?(name)
77
+ translated_attribute_names.include?(name.to_sym)
78
+ end
79
+ end
80
+ end
81
+
82
+ class BaseTranslation < ::ActiveRecord::Base
83
+ self.abstract_class = true
84
+
85
+ validates :locale, presence: true
86
+ after_initialize :init
87
+
88
+ def init
89
+ self.locale ||= I18n.locale.to_s
90
+ end
91
+
92
+ def self.table_exists?
93
+ table_name.present? && super
94
+ end
95
+ end
96
+ end
97
+ end
@@ -85,7 +85,7 @@ module AbAdmin
85
85
 
86
86
  def all_translated_attribute_names
87
87
  if translates?
88
- ::Globalize.available_locales.map do |loc|
88
+ AbAdmin.translated_locales.map do |loc|
89
89
  translated_attribute_names.map { |attr| "#{attr}_#{loc}" }
90
90
  end.flatten
91
91
  else
@@ -23,6 +23,9 @@ module AbAdmin
23
23
  next if column_name == :id || options[:skip].try(:include?, column_name)
24
24
  builder.field(column_name)
25
25
  end
26
+ model.translated_attribute_names.each do |column_name|
27
+ builder.field(column_name, sortable: false)
28
+ end if model.translates?
26
29
  end
27
30
  end
28
31
  end
@@ -39,6 +42,10 @@ module AbAdmin
39
42
  self.partial_name = 'chart'
40
43
  end
41
44
 
45
+ class Map < BaseBuilder
46
+ self.partial_name = 'map'
47
+ end
48
+
42
49
  class Export < BaseBuilder
43
50
  def render_options
44
51
  {column_names: fields.map(&:name), column_data: fields.map(&:data),
@@ -3,44 +3,21 @@ module AbAdmin
3
3
  module Callbacks
4
4
  extend ActiveSupport::Concern
5
5
 
6
- #included do
7
- # define_admin_callbacks :build, :create, :update, :save, :destroy
8
- #end
9
-
10
6
  protected
11
7
 
12
- def build_resource
13
- object = get_resource_ivar || set_resource_ivar(end_of_association_chain.send(method_for_build, resource_params))
14
- # run_build_callbacks object
15
- object
16
- end
17
-
18
8
  def create_resource(object)
19
- run_create_callbacks object do
20
- save_resource(object)
21
- end
9
+ run_create_callbacks(object) {save_resource(object)}
22
10
  end
23
11
 
24
12
  def save_resource(object)
25
- run_save_callbacks object do
26
- object.save
27
- end
13
+ run_save_callbacks(object) {object.save}
28
14
  end
29
15
 
30
16
  def update_resource(object, attributes)
31
17
  object.assign_attributes(attributes)
32
-
33
- #run_update_callbacks object do
34
- save_resource(object)
35
- #end
18
+ save_resource(object)
36
19
  end
37
20
 
38
- #def destroy_resource(object)
39
- # run_destroy_callbacks object do
40
- # object.destroy
41
- # end
42
- #end
43
-
44
21
  # Simple callback system. Implements before and after callbacks for
45
22
  # use within the controllers.
46
23
  #
@@ -1,13 +1,7 @@
1
1
  class Array
2
- def add_or_delete(el)
3
- include?(el) ? delete(el) : push(el)
4
- end
5
-
6
- def word_count
7
- each_with_object({}) do |word, h|
8
- h[word] ||= 0
9
- h[word] += 1
10
- end
2
+ # TOREMOVE after ruby 2.7.0
3
+ def tally
4
+ each_with_object(Hash.new(0)) { |v, h| h[v] += 1 }
11
5
  end
12
6
 
13
7
  def deep_merge_hashes
@@ -22,30 +16,12 @@ class Array
22
16
  inject(:+) / size
23
17
  end
24
18
 
25
- #def zip_all
26
- # self[0].zip *self[1..-1]
27
- #end
28
- #
29
- #def pluck!(method, *args)
30
- # each_index { |x| self[x] = self[x].send method, *args }
31
- #end
32
- #
33
- #alias invoke! pluck!
34
-
35
- def without(*values)
36
- copy = self.dup
37
- copy.without!(*values)
38
- end
39
-
40
19
  def without!(*values)
20
+ ActiveSupport::Deprecation.warn('Array#without! is deprecated without replacement')
41
21
  values.flatten.each { |value| self.delete(value) }
42
22
  self
43
23
  end
44
24
 
45
- def map_val(attr='id')
46
- map{|el| el[attr] }
47
- end
48
-
49
25
  def contain?(other)
50
26
  (other - self).empty?
51
27
  end
@@ -53,24 +29,4 @@ class Array
53
29
  def intersect?(other)
54
30
  !(self & other).empty?
55
31
  end
56
-
57
- # def to_hash
58
- # ActiveSupport::Deprecation.warn('Array#to_hash is deprecated, use Array#to_h or Hash[] instead')
59
- # h = {}
60
- # each { |k, v| h[k] = v }
61
- # h
62
- # end
63
-
64
- def val_detect(attr, val)
65
- detect{|v| v[attr] == val }
66
- end
67
32
  end
68
-
69
- #module Enumerable
70
- # def pluck(method, *args)
71
- # map { |x| x.send method, *args }
72
- # end
73
- #
74
- # alias invoke pluck
75
- #end
76
-