module AbAdmin module Utils autoload :CSVBuilder, 'ab_admin/utils/csv_builder' autoload :EvalHelpers, 'ab_admin/utils/eval_helpers' autoload :Logger, 'ab_admin/utils/logger' autoload :Mysql, 'ab_admin/utils/mysql' def all_models Kernel.suppress_warnings do Dir.glob(Rails.root.to_s + '/app/models/**/*.rb').reject { |path| path =~ /concerns|shared/ }.each { |file| require file } end [ActiveRecord::Base, ApplicationRecord].flat_map{|sc| sc.subclasses.find_all { |model| model.connection.table_exists?(model.table_name) } } end def load_files!(base_path = 'lib/utils') Dir[Rails.root.join("#{base_path}/**/*.rb")].each do |path| require_dependency path end end def bm(message = 'Benchmarking', options = {}) result = nil ms = Benchmark.ms { result = yield } (options[:logger] || Rails.logger).info '%s (%.3fms)' % [message, ms] result end def pretty(raw_data) data = case raw_data when Hash raw_data when String MultiJson.decode(raw_data) end JSON.pretty_generate data end def val_to_array(val, zero=false) return [] unless val a = val.is_a?(Array) ? val : val.to_s.split(',').map(&:to_i) zero ? a : a.without(0) end def val_to_array_s(val) return [] unless val val.is_a?(Array) ? val : val.split(',').map(&:to_s).without(0) end def truncate_text(raw_text, size=200) text = raw_text.to_s.gsub(/"|«|»|'/, '\'').gsub(/ /, ' ').gsub(/—/, '-').no_html.squish text.truncate(size, separator: ' ') end def l_path(locale=nil) locale ||= I18n.locale locale == I18n.default_locale ? '' : "/#{locale}" end alias :locale_path :l_path def rss_text(raw_html) Rack::Utils.escape_html(raw_html.no_html.squish) end # html like: '
p content
' # normalized to: "div content
p content
" def normalize_html(raw_html, options = {}, &block) Sanitizer.new(options).normalize_html(raw_html, options[:sanitize] || {}, &block) end def url_helpers Rails.application.routes.url_helpers end def full_url(path, protocol='http://') return path if path =~ %r{^(http|//)} duo = Rails.application.config.action_mailer.default_url_options host = AbAdmin.base_url || [duo[:host], duo[:port]].compact.join(':') || 'www.example.com' "#{protocol}#{host}#{path}" end def js_date_data { formats: I18n.t('date.formats'), day_names: I18n.t('date.day_names'), abbr_day_names: I18n.t('date.common_abbr_day_names'), month_names: I18n.t('date.common_month_names'), standalone_month_names: I18n.t('date.standalone_month_names'), abbr_month_names: I18n.t('date.abbr_month_names') } end class Sanitizer include ActionView::Helpers::SanitizeHelper CLEAN_HTML_COMMENTS_REGEXP = /(<|<)\!--.*?--(>|>)/m CLEAN_LINE_BREAKS_REGEXP = /[^>]\r\n/ def initialize(options = {}) @options = options end def normalize_html(raw_html, options = {}) return '' if raw_html.blank? cleaned_html = raw_html.gsub(CLEAN_HTML_COMMENTS_REGEXP, '')#.gsub(CLEAN_LINE_BREAKS_REGEXP, '