ab_admin 0.8.3 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
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
-