<commit_before>module Rails
  module API
    class PublicExceptions
      attr_accessor :public_path

      def initialize(public_path)
        @public_path = public_path
      end

      def call(env)
        exception    = env["action_dispatch.exception"]
        status       = env["PATH_INFO"][1..-1]
        request      = ActionDispatch::Request.new(env)
        content_type = request.formats.first
        format       = content_type && "to_#{content_type.to_sym}"
        body         = { :status => status, :error => exception.message }

        render(status, body, :format => format, :content_type => content_type)
      end

      private

      def render(status, body, options)
        format = options[:format]

        if format && body.respond_to?(format)
          render_format(status, body.public_send(format), options)
        else
          render_html(status)
        end
      end

      def render_format(status, body, options)
        [status, {'Content-Type' => "#{options[:content_type]}; charset=#{ActionDispatch::Response.default_charset}",
                  'Content-Length' => body.bytesize.to_s}, [body]]
      end

      def render_html(status)
        found = false
        path = "#{public_path}/#{status}.#{I18n.locale}.html" if I18n.locale
        path = "#{public_path}/#{status}.html" unless path && (found = File.exist?(path))

        if found || File.exist?(path)
          body = File.read(path)
          [status, {'Content-Type' => "text/html; charset=#{ActionDispatch::Response.default_charset}", 'Content-Length' => body.bytesize.to_s}, [body]]
        else
          [404, { "X-Cascade" => "pass" }, []]
        end
      end
    end
  end
end<commit_msg>Refactor public exceptions to reuse render format method<commit_after>module Rails
  module API
    class PublicExceptions
      attr_accessor :public_path

      def initialize(public_path)
        @public_path = public_path
      end

      def call(env)
        exception    = env["action_dispatch.exception"]
        status       = env["PATH_INFO"][1..-1]
        request      = ActionDispatch::Request.new(env)
        content_type = request.formats.first
        format       = content_type && "to_#{content_type.to_sym}"
        body         = { :status => status, :error => exception.message }

        render(status, body, format, content_type)
      end

      private

      def render(status, body, format, content_type)
        if format && body.respond_to?(format)
          render_format(status, content_type, body.public_send(format))
        else
          render_html(status)
        end
      end

      def render_format(status, content_type, body)
        [status, {'Content-Type' => "#{content_type}; charset=#{ActionDispatch::Response.default_charset}",
                  'Content-Length' => body.bytesize.to_s}, [body]]
      end

      def render_html(status)
        found = false
        path = "#{public_path}/#{status}.#{I18n.locale}.html" if I18n.locale
        path = "#{public_path}/#{status}.html" unless path && (found = File.exist?(path))

        if found || File.exist?(path)
          render_format(status, 'text/html', File.read(path))
        else
          [404, { "X-Cascade" => "pass" }, []]
        end
      end
    end
  end
end
{'fraction_non_alphanumeric': 0.12686794754498323, 'fraction_numerical': 0.0054894784995425435, 'mean_word_length': 2.343527013251784, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 17, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '2472026', 'n_tokens_mistral': 975, 'n_tokens_neox': 952, 'n_words': 201}