Skip to content

Commit

Permalink
Split shopify_api.rb into separate files
Browse files Browse the repository at this point in the history
  • Loading branch information
travishaynes authored and Denis Odorcic committed Sep 1, 2011
1 parent 4ffdb62 commit fa8f791
Show file tree
Hide file tree
Showing 35 changed files with 558 additions and 520 deletions.
524 changes: 4 additions & 520 deletions lib/shopify_api.rb

Large diffs are not rendered by default.

9 changes: 9 additions & 0 deletions lib/shopify_api/application_charge.rb
@@ -0,0 +1,9 @@
module ShopifyAPI
class ApplicationCharge < Base
undef_method :test

def activate
load_attributes_from_response(post(:activate))
end
end
end
9 changes: 9 additions & 0 deletions lib/shopify_api/article.rb
@@ -0,0 +1,9 @@
module ShopifyAPI
class Article < Base
self.prefix = "/admin/blogs/:blog_id/"

def comments
Comment.find(:all, :params => { :article_id => id })
end
end
end
95 changes: 95 additions & 0 deletions lib/shopify_api/asset.rb
@@ -0,0 +1,95 @@
module ShopifyAPI
# Assets represent the files that comprise your theme.
# There are different buckets which hold different kinds
# of assets, each corresponding to one of the folders
# within a theme's zip file: "layout", "templates",
# "snippets", "assets", and "config". The full key of an
# asset always starts with the bucket name, and the path
# separator is a forward slash, like layout/theme.liquid
# or assets/bg-body.gif.
#
# Initialize with a key:
# asset = ShopifyAPI::Asset.new(:key => 'assets/special.css', :theme_id => 12345)
#
# Find by key:
# asset = ShopifyAPI::Asset.find('assets/image.png', :params => {:theme_id => 12345})
#
# Get the text or binary value:
# asset.value # decodes from attachment attribute if necessary
#
# You can provide new data for assets in a few different ways:
#
# * assign text data for the value directly:
# asset.value = "div.special {color:red;}"
#
# * provide binary data for the value:
# asset.attach(File.read('image.png'))
#
# * set a URL from which Shopify will fetch the value:
# asset.src = "http://mysite.com/image.png"
#
# * set a source key of another of your assets from which
# the value will be copied:
# asset.source_key = "assets/another_image.png"
class Asset < Base
self.primary_key = 'key'
self.prefix = "/admin/themes/:theme_id/"

def self.prefix(options={})
options[:theme_id].nil? ? "/admin/" : "/admin/themes/#{options[:theme_id]}/"
end

def self.element_path(id, prefix_options = {}, query_options = nil) #:nodoc:
prefix_options, query_options = split_options(prefix_options) if query_options.nil?
"#{prefix(prefix_options)}#{collection_name}.#{format.extension}#{query_string(query_options)}"
end

# find an asset by key:
# ShopifyAPI::Asset.find('layout/theme.liquid', :params => {:theme_id => 99})
def self.find(*args)
if args[0].is_a?(Symbol)
super
else
params = {:asset => {:key => args[0]}}
params = params.merge(args[1][:params]) if args[1] && args[1][:params]
path_prefix = params[:theme_id] ? "/admin/themes/#{params[:theme_id]}" : "/admin"
find(:one, :from => "#{path_prefix}/assets.#{format.extension}", :params => params)
end
end

# For text assets, Shopify returns the data in the 'value' attribute.
# For binary assets, the data is base-64-encoded and returned in the
# 'attachment' attribute. This accessor returns the data in both cases.
def value
attributes['value'] ||
(attributes['attachment'] ? Base64.decode64(attributes['attachment']) : nil)
end

def attach(data)
self.attachment = Base64.encode64(data)
end

def destroy
connection.delete(element_path(prefix_options.merge(:asset => {:key => key})), self.class.headers)
end

def new?
false
end

def method_missing(method_symbol, *arguments) #:nodoc:
if %w{value= attachment= src= source_key=}.include?(method_symbol)
wipe_value_attributes
end
super
end

private

def wipe_value_attributes
%w{value attachment src source_key}.each do |attr|
attributes.delete(attr)
end
end
end
end
4 changes: 4 additions & 0 deletions lib/shopify_api/billing_address.rb
@@ -0,0 +1,4 @@
module ShopifyAPI
class BillingAddress < Base
end
end
7 changes: 7 additions & 0 deletions lib/shopify_api/blog.rb
@@ -0,0 +1,7 @@
module ShopifyAPI
class Blog < Base
def articles
Article.find(:all, :params => { :blog_id => id })
end
end
end
5 changes: 5 additions & 0 deletions lib/shopify_api/collect.rb
@@ -0,0 +1,5 @@
module ShopifyAPI
# For adding/removing products from custom collections
class Collect < Base
end
end
14 changes: 14 additions & 0 deletions lib/shopify_api/comment.rb
@@ -0,0 +1,14 @@
module ShopifyAPI
class Comment < Base
def remove; load_attributes_from_response(post(:remove, {}, only_id)); end
def ham; load_attributes_from_response(post(:ham, {}, only_id)); end
def spam; load_attributes_from_response(post(:spam, {}, only_id)); end
def approve; load_attributes_from_response(post(:approve, {}, only_id)); end
def restore; load_attributes_from_response(post(:restore, {}, only_id)); end
def not_spam; load_attributes_from_response(post(:not_spam, {}, only_id)); end

def only_id
encode(:only => :id)
end
end
end
4 changes: 4 additions & 0 deletions lib/shopify_api/country.rb
@@ -0,0 +1,4 @@
module ShopifyAPI
class Country < Base
end
end
18 changes: 18 additions & 0 deletions lib/shopify_api/custom_collection.rb
@@ -0,0 +1,18 @@
module ShopifyAPI
# Custom collection
#
class CustomCollection < Base
def products
Product.find(:all, :params => {:collection_id => self.id})
end

def add_product(product)
Collect.create(:collection_id => self.id, :product_id => product.id)
end

def remove_product(product)
collect = Collect.find(:first, :params => {:collection_id => self.id, :product_id => product.id})
collect.destroy if collect
end
end
end
4 changes: 4 additions & 0 deletions lib/shopify_api/customer.rb
@@ -0,0 +1,4 @@
module ShopifyAPI
class Customer < Base
end
end
4 changes: 4 additions & 0 deletions lib/shopify_api/customer_group.rb
@@ -0,0 +1,4 @@
module ShopifyAPI
class CustomerGroup < Base
end
end
16 changes: 16 additions & 0 deletions lib/shopify_api/event.rb
@@ -0,0 +1,16 @@
module ShopifyAPI
class Event < Base
self.prefix = "/admin/:resource/:resource_id/"

# Hack to allow both Shop and other Events in through the same AR class
def self.prefix(options={})
options[:resource].nil? ? "/admin/" : "/admin/#{options[:resource]}/#{options[:resource_id]}/"
end
end

module Events
def events
Event.find(:all, :params => {:resource => self.class.collection_name, :resource_id => id})
end
end
end
5 changes: 5 additions & 0 deletions lib/shopify_api/fulfillment.rb
@@ -0,0 +1,5 @@
module ShopifyAPI
class Fulfillment < Base
self.prefix = "/admin/orders/:order_id/"
end
end
16 changes: 16 additions & 0 deletions lib/shopify_api/image.rb
@@ -0,0 +1,16 @@
module ShopifyAPI
class Image < Base
self.prefix = "/admin/products/:product_id/"

# generate a method for each possible image variant
[:pico, :icon, :thumb, :small, :compact, :medium, :large, :grande, :original].each do |m|
reg_exp_match = "/\\1_#{m}.\\2"
define_method(m) { src.gsub(/\/(.*)\.(\w{2,4})/, reg_exp_match) }
end

def attach_image(data, filename = nil)
attributes['attachment'] = Base64.encode64(data)
attributes['filename'] = filename unless filename.nil?
end
end
end
4 changes: 4 additions & 0 deletions lib/shopify_api/line_item.rb
@@ -0,0 +1,4 @@
module ShopifyAPI
class LineItem < Base
end
end
32 changes: 32 additions & 0 deletions lib/shopify_api/metafield.rb
@@ -0,0 +1,32 @@
module ShopifyAPI
module Metafields
def metafields
Metafield.find(:all, :params => {:resource => self.class.collection_name, :resource_id => id})
end

def add_metafield(metafield)
raise ArgumentError, "You can only add metafields to resource that has been saved" if new?

metafield.prefix_options = {
:resource => self.class.collection_name,
:resource_id => id
}
metafield.save
metafield
end
end

class Metafield < Base
self.prefix = "/admin/:resource/:resource_id/"

# Hack to allow both Shop and other Metafields in through the same AR class
def self.prefix(options={})
options[:resource].nil? ? "/admin/" : "/admin/#{options[:resource]}/#{options[:resource_id]}/"
end

def value
return if attributes["value"].nil?
attributes["value_type"] == "integer" ? attributes["value"].to_i : attributes["value"]
end
end
end
4 changes: 4 additions & 0 deletions lib/shopify_api/note_attribute.rb
@@ -0,0 +1,4 @@
module ShopifyAPI
class NoteAttribute < Base
end
end
22 changes: 22 additions & 0 deletions lib/shopify_api/order.rb
@@ -0,0 +1,22 @@
module ShopifyAPI
class Order < Base
def close; load_attributes_from_response(post(:close, {}, only_id)); end
def open; load_attributes_from_response(post(:open, {}, only_id)); end

def cancel(options = {})
load_attributes_from_response(post(:cancel, options, only_id))
end

def transactions
Transaction.find(:all, :params => { :order_id => id })
end

def capture(amount = "")
Transaction.create(:amount => amount, :kind => "capture", :order_id => id)
end

def only_id
encode(:only => :id, :include => [], :methods => [], :fields => [])
end
end
end
4 changes: 4 additions & 0 deletions lib/shopify_api/page.rb
@@ -0,0 +1,4 @@
module ShopifyAPI
class Page < Base
end
end
36 changes: 36 additions & 0 deletions lib/shopify_api/product.rb
@@ -0,0 +1,36 @@
module ShopifyAPI
class Product < Base

# Share all items of this store with the
# shopify marketplace
def self.share; post :share; end
def self.unshare; delete :share; end

# compute the price range
def price_range
prices = variants.collect(&:price)
format = "%0.2f"
if prices.min != prices.max
"#{format % prices.min} - #{format % prices.max}"
else
format % prices.min
end
end

def collections
CustomCollection.find(:all, :params => {:product_id => self.id})
end

def smart_collections
SmartCollection.find(:all, :params => {:product_id => self.id})
end

def add_to_collection(collection)
collection.add_product(self)
end

def remove_from_collection(collection)
collection.remove_product(self)
end
end
end
4 changes: 4 additions & 0 deletions lib/shopify_api/product_search_engine.rb
@@ -0,0 +1,4 @@
module ShopifyAPI
class ProductSearchEngine < Base
end
end
5 changes: 5 additions & 0 deletions lib/shopify_api/province.rb
@@ -0,0 +1,5 @@
module ShopifyAPI
class Province < Base
self.prefix = "/admin/countries/:country_id/"
end
end
17 changes: 17 additions & 0 deletions lib/shopify_api/recurring_application_charge.rb
@@ -0,0 +1,17 @@
module ShopifyAPI
class RecurringApplicationCharge < Base
undef_method :test

def self.current
find(:all).find{|charge| charge.status == 'active'}
end

def cancel
load_attributes_from_response(self.destroy)
end

def activate
load_attributes_from_response(post(:activate))
end
end
end
4 changes: 4 additions & 0 deletions lib/shopify_api/redirect.rb
@@ -0,0 +1,4 @@
module ShopifyAPI
class Redirect < Base
end
end
4 changes: 4 additions & 0 deletions lib/shopify_api/script_tag.rb
@@ -0,0 +1,4 @@
module ShopifyAPI
class ScriptTag < Base
end
end

0 comments on commit fa8f791

Please sign in to comment.