GD-Personal/flexi-json

View on GitHub
lib/flexi/json/loader.rb

Summary

Maintainability
A
0 mins
Test Coverage
require "net/http"
require "uri"

module Flexi
  module Json
    class Loader
      def initialize(data)
        @data = data
      end

      def load_data
        loaded_data = load_from_local_file || load_from_raw_json || load_from_url || []
        loaded_data.map { |result| Dataset.new(result.transform_keys(&:to_sym)) }
      end

      private

      def load_from_raw_json(raw_json = nil)
        data = JSON.parse(raw_json || @data)
        data.is_a?(Array) ? data : [data]
      rescue JSON::ParserError, TypeError
        nil
      end

      def load_from_local_file
        data = File.read(@data)
        load_from_raw_json(data)
      rescue Errno::ENOENT, TypeError
        nil
      end

      def load_from_url
        uri = URI.parse(@data)
        response = Net::HTTP.get_response(uri)
        response.is_a?(Net::HTTPSuccess) ? load_from_raw_json(response.body) : nil
      rescue URI::InvalidURIError, Errno::ECONNREFUSED
        nil
      end
    end
  end
end