require 'shopify_api/version' module ShopifyAPI class Base < ActiveResource::Base class InvalidSessionError < StandardError; end extend Countable self.timeout = 90 self.include_root_in_json = false self.headers['User-Agent'] = ["ShopifyAPI/#{ShopifyAPI::VERSION}", "ActiveResource/#{ActiveResource::VERSION::STRING}", "Ruby/#{RUBY_VERSION}"].join(' ') self.collection_parser = ShopifyAPI::PaginatedCollection def encode(options = {}) same = dup same.attributes = {self.class.element_name => same.attributes} if self.class.format.extension == 'json' same.send("to_#{self.class.format.extension}", options) end def as_json(options = nil) root = options[:root] if options.try(:key?, :root) if include_root_in_json root = self.class.model_name.element if root == true { root => serializable_hash(options) } else serializable_hash(options) end end class << self threadsafe_attribute(:_api_version) def headers if _headers_defined? _headers elsif superclass != Object && superclass.headers superclass.headers else _headers ||= {} end end def activate_session(session) raise InvalidSessionError.new("Session cannot be nil") if session.nil? self.site = session.site self.headers.merge!('X-Shopify-Access-Token' => session.token) self.api_version = session.api_version end def clear_session self.site = nil self.password = nil self.user = nil self.api_version = nil self.headers.delete('X-Shopify-Access-Token') end def api_version if _api_version_defined? _api_version elsif superclass != Object && superclass.site superclass.api_version.dup.freeze else ApiVersion::NullVersion end end def api_version=(version) self._api_version = ApiVersion::NullVersion.matches?(version) ? ApiVersion::NullVersion : ApiVersion.find_version(version) end def prefix(options = {}) api_version.construct_api_path(resource_prefix(options)) end def prefix_source '' end def resource_prefix(_options = {}) '' end # Sets the \prefix for a resource's nested URL (e.g., prefix/collectionname/1.json). # Default value is site.path. def resource_prefix=(value) @prefix_parameters = nil resource_prefix_call = value.gsub(/:\w+/) { |key| "\#{URI.parser.escape options[#{key}].to_s}" } silence_warnings do # Redefine the new methods. instance_eval <<-RUBY_EVAL, __FILE__, __LINE__ + 1 def prefix_source() "#{value}" end def resource_prefix(options={}) "#{resource_prefix_call}" end RUBY_EVAL end rescue => e logger&.error("Couldn't set prefix: #{e}\n #{code}") raise end def prefix=(value) if value.start_with?('/admin') raise ArgumentError, "'#{value}' can no longer start /admin/. Change to using resource_prefix=" end warn( '[DEPRECATED] ShopifyAPI::Base#prefix= is deprecated and will be removed in a future version. ' \ 'Use `self.resource_prefix=` instead.' ) self.resource_prefix = value end alias_method :set_prefix, :prefix= def init_prefix(resource) init_prefix_explicit(resource.to_s.pluralize, "#{resource}_id") end def init_prefix_explicit(resource_type, resource_id) self.resource_prefix = "#{resource_type}/:#{resource_id}/" define_method resource_id.to_sym do @prefix_options[resource_id] end end def early_july_pagination? !!early_july_pagination end def version_validation!(minimum_version) available_in_version = ShopifyAPI::ApiVersion.find_version(minimum_version) unless ShopifyAPI::Base.api_version >= available_in_version raise NotImplementedError, "The minimum supported version is #{minimum_version}." end end private attr_accessor :early_july_pagination def early_july_pagination_release! self.early_july_pagination = true end end def persisted? !id.nil? end private def only_id encode(:only => :id, :include => [], :methods => []) end end end