class Inventory
Attributes
products_list[R]
source_type[R]
source_uri[R]
Public Class Methods
new()
click to toggle source
# File lib/coding_challenge/commands/util/Inventory.rb, line 14 def initialize @source_type = nil @source_uri = nil @products_list = nil @products_schema = nil end
Public Instance Methods
handle_query(query)
click to toggle source
# File lib/coding_challenge/commands/util/Inventory.rb, line 21 def handle_query(query) product_options_schema = @products_schema[query.product_type.downcase] is_invalid_product_type = product_options_schema.nil? raise InvalidProductTypeError, query.product_type if is_invalid_product_type results = [] product_options_schema.each_with_index do |(option_type, option_values_map), arg_position| option_argument = query.options[arg_position] is_argument_provided = !option_argument.nil? if is_argument_provided is_invalid_argument = !option_values_map.key?(option_argument) raise InvalidOptionError.new(query.product_type, option_type, option_argument) if is_invalid_argument else possible_option_values = option_values_map.keys results << "#{option_type.capitalize}: #{possible_option_values.join(', ')}" end end query.results = results query end
load_products_list_from_default()
click to toggle source
# File lib/coding_challenge/commands/util/Inventory.rb, line 55 def load_products_list_from_default begin products_list = load_from_file_url(@@DEFAULT_PRODUCTS_LIST_URL) raise StandardError if products_list.nil? rescue StandardError raise FileReadError, source_uri end set_as_data_source('DEFAULT', @@DEFAULT_PRODUCTS_LIST_URL, products_list) end
load_products_list_from_source(source_type, source_uri)
click to toggle source
# File lib/coding_challenge/commands/util/Inventory.rb, line 44 def load_products_list_from_source(source_type, source_uri) begin products_list = load_from_file_path(source_uri) if source_type == 'FILE PATH' products_list = load_from_file_url(source_uri) if source_type == 'URL' raise StandardError if products_list.nil? rescue StandardError raise FileReadError, source_uri end set_as_data_source(source_type, source_uri, products_list) end
Private Instance Methods
index_product_schema(products_list)
click to toggle source
# File lib/coding_challenge/commands/util/Inventory.rb, line 67 def index_product_schema(products_list) products_schema = {} products_list.each do |p| if !products_schema.key?(p['product_type']) products_schema[p['product_type']] = p['options'].transform_values { |o| Hash[o, true] } else products_schema[p['product_type']].merge!(p['options']) { |_, o, n| o.merge(Hash[n, true]) } end end products_schema end
load_from_file_path(file_path)
click to toggle source
# File lib/coding_challenge/commands/util/Inventory.rb, line 86 def load_from_file_path(file_path) products_list_file = File.open(file_path) products_list_file_content = products_list_file.read products_list_hash = JSON.parse(products_list_file_content) products_list_hash end
load_from_file_url(url)
click to toggle source
# File lib/coding_challenge/commands/util/Inventory.rb, line 93 def load_from_file_url(url) request_uri = URI(url) request_response = Net::HTTP.get_response(request_uri) request_response_content = request_response.body products_list_hash = JSON.parse(request_response_content) products_list_hash end
set_as_data_source(source_type, source_uri, products_list)
click to toggle source
# File lib/coding_challenge/commands/util/Inventory.rb, line 79 def set_as_data_source(source_type, source_uri, products_list) @products_list = products_list @products_schema = index_product_schema(products_list) @source_type = source_type @source_uri = source_uri end