module AbAdmin module Utils 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: '
div content

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, '
') html = sanitize(cleaned_html, options || {}) doc = Nokogiri::HTML.fragment(html) #doc.xpath('comment()').each { |c| c.remove } yield doc if block_given? doc.search('div').each { |el| el.name = 'p' } doc.to_html end end @@display_name_methods_cache = {} def display_name_method_for(resource) @@display_name_methods_cache[resource.class.name] ||= AbAdmin.display_name_methods.find { |method| resource.respond_to? method } end def display_name(resource) return unless resource resource.send(display_name_method_for(resource)).to_s.no_html end def safe_display_name(resource) return unless display_name_method_for(resource) display_name(resource) end def pretty_data(object) case object when String, Integer, BigDecimal, Float object when TrueClass '+' when FalseClass '-' when Date, DateTime, Time, ActiveSupport::TimeWithZone I18n.l(object, format: :long) when NilClass '' else AbAdmin.safe_display_name(object) || object end end def test_env? Rails.env.test? || Rails.env.cucumber? end def friendly_token(n=10) SecureRandom.base64(n * 2).tr('+/=', 'xyz').first(n).downcase end end end