pseudomuto/routesjs-rails

View on GitHub
lib/routesjs/routes.rb

Summary

Maintainability
A
0 mins
Test Coverage
module RoutesJS
  class Routes
    class << self
      attr_accessor :default_format, :named_routes, :filter_type

      def init(options = {})
        reset

        set_format_from_options(options)
        make_filter(options, :except) if options.has_key?(:except)
        make_filter(options, :only) if options.has_key?(:only)
      end

      def as_json(routes = nil)
        routes ||= ::Rails.application.routes.named_routes.routes
        js_routes = build_routes(routes)

        results = { routes: js_routes }
        results[:format] = default_format unless default_format.blank?
        results.as_json
      end

      private

      def reset
        self.default_format = nil
        self.named_routes = nil
        self.filter_type = nil
      end

      def set_format_from_options(options)
        self.default_format = options[:default_format]
      end

      def make_filter(options, type)
        self.filter_type = type
        self.named_routes = Array(options[type]).map(&:to_s)
      end

      def build_routes(routes)
        route_map = routes.values.inject({}) do |result, route|
          if include_route?(route)
            derived_route = RoutesJS::Routing::Route.new(route)
            result[derived_route.name] = derived_route.url
          end

          result
        end
      end

      def include_route?(route)
        return true unless named_routes.present? && named_routes.any?

        found = named_routes.include?(route.name)
        filter_type == :only ? found : !found
      end
    end
  end
end