dcparker-shopify 0.1.0 → 0.1.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +1 -0
- data/Manifest +1 -7
- data/lib/shopify.rb +132 -76
- data/lib/shopify/support.rb +104 -0
- data/shopify.gemspec +4 -7
- metadata +5 -28
- data/lib/shopify/address.rb +0 -17
- data/lib/shopify/order.rb +0 -36
- data/lib/shopify/product.rb +0 -45
- data/lib/shopify/sale.rb +0 -11
- data/lib/shopify/session.rb +0 -83
- data/lib/shopify/shop.rb +0 -8
- data/lib/shopify/site.rb +0 -14
data/CHANGELOG
CHANGED
data/Manifest
CHANGED
data/lib/shopify.rb
CHANGED
@@ -1,93 +1,149 @@
|
|
1
|
+
include_path = File.expand_path(File.dirname(__FILE__))
|
2
|
+
$:.unshift(include_path) unless $:.include?(include_path)
|
3
|
+
require 'shopify/support'
|
4
|
+
|
1
5
|
module Shopify
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
autoload :Payment, 'shopify/sale'
|
18
|
-
autoload :Page, 'shopify/site'
|
19
|
-
autoload :Blog, 'shopify/site'
|
20
|
-
autoload :Article, 'shopify/site'
|
21
|
-
|
22
|
-
class << self
|
23
|
-
attr_reader :key, :secret
|
24
|
-
|
25
|
-
# Lists the session stack.
|
26
|
-
def sessions
|
27
|
-
@sessions ||= []
|
6
|
+
include HTTParty
|
7
|
+
|
8
|
+
def self.setup(host, key=nil, secret=nil, token=nil)
|
9
|
+
host.gsub!(/https?:\/\//, '') # remove http(s)://
|
10
|
+
@host = host.include?('.') ? host : "#{host}.myshopify.com" # extend url to myshopify.com if no host is given
|
11
|
+
@key = key
|
12
|
+
@secret = secret
|
13
|
+
@token = token
|
14
|
+
if [host, key, secret, token].all?
|
15
|
+
base_uri "http://#{@host}/admin"
|
16
|
+
basic_auth @key, Digest::MD5.hexdigest("#{@secret.chomp}#{@token.chomp}")
|
17
|
+
format :xml
|
18
|
+
return false
|
19
|
+
else
|
20
|
+
"http://#{@host}/admin/api/auth?api_key=#{@key}&mode=#{mode}"
|
28
21
|
end
|
22
|
+
end
|
29
23
|
|
30
|
-
|
31
|
-
|
32
|
-
|
24
|
+
# /admin/blogs.xml
|
25
|
+
class Blog < ShopifyModel
|
26
|
+
top_level
|
27
|
+
attr_accessor :commentable, :feedburner, :feedburner_locations, :handle, :id, :shop_id, :title, :updated_at
|
28
|
+
|
29
|
+
# Get all articles in this blog.
|
30
|
+
def articles
|
33
31
|
end
|
32
|
+
end
|
34
33
|
|
35
|
-
|
36
|
-
|
37
|
-
|
34
|
+
# /admin/blogs/[blog_id]/articles.xml
|
35
|
+
class Article < ShopifyModel
|
36
|
+
child_of Blog
|
37
|
+
attr_accessor :author, :blog_id, :body, :body_html, :created_at, :id, :published_at, :title, :updated_at
|
38
|
+
def comments(query_params={})
|
39
|
+
Shopify.comments(query_params.merge(:article_id => id, :blog_id => blog_id))
|
38
40
|
end
|
41
|
+
end
|
42
|
+
|
43
|
+
# /admin/comments.xml?article_id=*&blog_id=*
|
44
|
+
class Comment < ShopifyModel
|
45
|
+
top_level
|
46
|
+
attr_accessor :article_id, :author, :blog_id, :body, :body_html, :created_at, :email, :id, :ip, :published_at, :shop_id, :status, :updated_at, :user_agent
|
47
|
+
end
|
48
|
+
|
49
|
+
# /admin/collects.xml
|
50
|
+
class Collect < ShopifyModel
|
51
|
+
top_level
|
52
|
+
attr_accessor :collection_id, :featured, :id, :position, :product_id
|
53
|
+
end
|
39
54
|
|
40
|
-
|
41
|
-
|
42
|
-
|
55
|
+
# /admin/countries.xml
|
56
|
+
class Country < ShopifyModel
|
57
|
+
top_level
|
58
|
+
attr_accessor :code, :id, :name, :tax
|
59
|
+
|
60
|
+
# Get all province divisions within this country.
|
61
|
+
def provinces
|
43
62
|
end
|
63
|
+
end
|
44
64
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
apply_current_session!
|
52
|
-
return result
|
65
|
+
# /admin/custom_collections.xml
|
66
|
+
class CustomCollection < ShopifyModel
|
67
|
+
top_level
|
68
|
+
attr_accessor :body, :body_html, :handle, :id, :published_at, :sort_order, :title, :updated_at
|
69
|
+
def products(query_params={})
|
70
|
+
Shopify.products(query_params.merge(:collection_id => id))
|
53
71
|
end
|
54
72
|
end
|
55
|
-
end
|
56
73
|
|
57
|
-
#
|
58
|
-
|
59
|
-
|
74
|
+
# /admin/orders.xml
|
75
|
+
class Order < ShopifyModel
|
76
|
+
top_level
|
77
|
+
attr_accessor :buyer_accepts_marketing, :closed_at, :created_at, :currency, :email, :financial_status, :fulfillment_status, :gateway, :id, :name, :note, :number, :subtotal_price, :taxes_included, :token, :total_discounts, :total_line_items_price, :total_price, :total_tax, :total_weight, :updated_at, :browser_ip, :billing_address, :shipping_address, :line_items, :shipping_line
|
78
|
+
|
79
|
+
# Get all fulfillments related to this order.
|
80
|
+
def fulfillments
|
81
|
+
end
|
82
|
+
|
83
|
+
# Get all transactions related to this order.
|
84
|
+
def transactions
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
# /admin/orders/[order_id]/fulfillments.xml
|
89
|
+
class Fulfillment < ShopifyModel
|
90
|
+
child_of Order
|
91
|
+
attr_accessor :id, :order_id, :status, :tracking_number, :line_items, :receipt
|
92
|
+
end
|
93
|
+
|
94
|
+
# /admin/pages.xml
|
95
|
+
class Page < ShopifyModel
|
96
|
+
top_level
|
97
|
+
attr_accessor :author, :body, :body_html, :created_at, :handle, :ip, :published_at, :shop_id, :title, :updated_at
|
60
98
|
end
|
61
|
-
end
|
62
99
|
|
63
|
-
#
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
# Not using superclass_delegating_reader because don't want subclasses to modify superclass instance
|
71
|
-
#
|
72
|
-
# With superclass_delegating_reader
|
73
|
-
#
|
74
|
-
# Parent.site = 'http://anonymous@test.com'
|
75
|
-
# Subclass.site # => 'http://anonymous@test.com'
|
76
|
-
# Subclass.site.user = 'david'
|
77
|
-
# Parent.site # => 'http://david@test.com'
|
78
|
-
#
|
79
|
-
# Without superclass_delegating_reader (expected behaviour)
|
80
|
-
#
|
81
|
-
# Parent.site = 'http://anonymous@test.com'
|
82
|
-
# Subclass.site # => 'http://anonymous@test.com'
|
83
|
-
# Subclass.site.user = 'david' # => TypeError: can't modify frozen object
|
84
|
-
#
|
85
|
-
if defined?(@site)
|
86
|
-
@site
|
87
|
-
elsif superclass != Object && superclass.site
|
88
|
-
superclass.site.dup.freeze
|
89
|
-
end
|
90
|
-
end
|
100
|
+
# /admin/products.xml?collection_id=*
|
101
|
+
class Product < ShopifyModel
|
102
|
+
top_level
|
103
|
+
attr_accessor :body, :body_html, :created_at, :handle, :id, :product_type, :published_at, :title, :updated_at, :vendor, :tags, :variants, :images
|
104
|
+
|
105
|
+
# Get all images for this product.
|
106
|
+
def images
|
91
107
|
end
|
108
|
+
|
109
|
+
# Get all variants of this product.
|
110
|
+
def variant
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
# /admin/products/[product_id]/images.xml
|
115
|
+
class Image < ShopifyModel
|
116
|
+
child_of Product
|
117
|
+
attr_accessor :id, :position, :product_id, :src
|
118
|
+
end
|
119
|
+
|
120
|
+
# /admin/products/[product_id]/variants.xml
|
121
|
+
class Variant < ShopifyModel
|
122
|
+
child_of Product
|
123
|
+
attr_accessor :compare_at_price, :fulfillment_service, :grams, :id, :inventory_management, :inventory_policy, :inventory_quantity, :position, :price, :product_id, :sku, :title
|
124
|
+
end
|
125
|
+
|
126
|
+
# /admin/countries/[country_id]/provinces.xml
|
127
|
+
class Province < ShopifyModel
|
128
|
+
child_of Country
|
129
|
+
attr_accessor :code, :id, :name, :tax
|
130
|
+
end
|
131
|
+
|
132
|
+
# /admin/redirects.xml
|
133
|
+
class Redirect < ShopifyModel
|
134
|
+
top_level
|
135
|
+
attr_accessor :id, :path, :shop_id, :target
|
136
|
+
end
|
137
|
+
|
138
|
+
# /admin/shop.xml
|
139
|
+
class Shop < ShopifyModel
|
140
|
+
top_level :singular
|
141
|
+
attr_accessor :active_subscription_id, :address1, :city, :country, :created_at, :domain, :email, :id, :name, :phone, :province, :public, :source, :zip, :taxes_included, :currency, :timezone, :shop_owner
|
142
|
+
end
|
143
|
+
|
144
|
+
# /admin/orders/[order_id]/transactions.xml
|
145
|
+
class Transaction < ShopifyModel
|
146
|
+
child_of Order
|
147
|
+
attr_accessor :amount, :authorization, :created_at, :kind, :order_id, :status, :receipt
|
92
148
|
end
|
93
149
|
end
|
@@ -0,0 +1,104 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'extlib'
|
3
|
+
gem 'jnunemaker-httparty', '>=0.3.1'
|
4
|
+
require 'httparty'
|
5
|
+
require 'bigdecimal'
|
6
|
+
require 'digest/md5'
|
7
|
+
|
8
|
+
module Shopify
|
9
|
+
def self.get(*args)
|
10
|
+
puts "getting #{args.map {|i| i.inspect}.join(', ')}"
|
11
|
+
super
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.def_collections(*klasses)
|
15
|
+
klasses.each do |klass|
|
16
|
+
kn = klass.name.gsub(/.*::/,'')
|
17
|
+
class_eval "
|
18
|
+
def self.#{kn.snake_case.pluralize}(query_params={})
|
19
|
+
json = get(\"#{klass.site_prefix}/#{kn.snake_case.pluralize}.xml\", :query => query_params)
|
20
|
+
if json['#{kn.snake_case.pluralize}']
|
21
|
+
json['#{kn.snake_case.pluralize}'].collect {|i| #{kn}.instantiate(i)}
|
22
|
+
else
|
23
|
+
json
|
24
|
+
end
|
25
|
+
end
|
26
|
+
def self.#{kn.snake_case}(id)
|
27
|
+
get(\"/#{kn.snake_case.pluralize}/\#{id}.xml\")
|
28
|
+
end
|
29
|
+
"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
class ShopifyModel
|
34
|
+
class << self
|
35
|
+
def top_level(*options)
|
36
|
+
klass_name = self.name.gsub(/.*::/,'')
|
37
|
+
if options.include?(:singular)
|
38
|
+
# Define singular accessor in Shopify
|
39
|
+
eval "
|
40
|
+
def Shopify.#{klass_name.snake_case}(query_params={})
|
41
|
+
json = Shopify.get(\"/#{klass_name.snake_case}.xml\", :query => query_params)
|
42
|
+
begin
|
43
|
+
#{klass_name}.instantiate json['#{klass_name.snake_case}']
|
44
|
+
rescue => e
|
45
|
+
warn \"Error: \#{e.inspect}\"
|
46
|
+
json
|
47
|
+
end
|
48
|
+
end
|
49
|
+
"
|
50
|
+
else
|
51
|
+
# Define plural accessor in Shopify
|
52
|
+
eval "
|
53
|
+
def Shopify.#{klass_name.snake_case.pluralize}(query_params={})
|
54
|
+
json = Shopify.get(\"/#{klass_name.snake_case.pluralize}.xml\", :query => query_params)
|
55
|
+
if json['#{klass_name.snake_case.pluralize}']
|
56
|
+
json['#{klass_name.snake_case.pluralize}'].collect {|i| #{klass_name}.instantiate(i)}
|
57
|
+
else
|
58
|
+
json
|
59
|
+
end
|
60
|
+
end
|
61
|
+
def Shopify.#{klass_name.snake_case}(id)
|
62
|
+
json = Shopify.get(\"/#{klass_name.snake_case.pluralize}/\#{id}.xml\")
|
63
|
+
if json['#{klass_name.snake_case}']
|
64
|
+
#{klass_name}.instantiate json['#{klass_name.snake_case}']
|
65
|
+
else
|
66
|
+
json
|
67
|
+
end
|
68
|
+
end
|
69
|
+
"
|
70
|
+
end
|
71
|
+
end
|
72
|
+
def child_of(parent_klass)
|
73
|
+
@parent = parent_klass
|
74
|
+
parent_klass_name = parent_klass.name.gsub(/.*::/,'')
|
75
|
+
klass_name = self.name.gsub(/.*::/,'')
|
76
|
+
parent_klass.class_eval "
|
77
|
+
def #{klass_name.snake_case.pluralize}(query_params={})
|
78
|
+
@#{klass_name.snake_case.pluralize} ||= begin
|
79
|
+
json = Shopify.get(\"/#{parent_klass_name.snake_case.pluralize}/\#{id}/#{klass_name.snake_case.pluralize}.xml\", :query => query_params)
|
80
|
+
if json['#{parent_klass_name.snake_case}_#{klass_name.snake_case.pluralize}']
|
81
|
+
json['#{parent_klass_name.snake_case}_#{klass_name.snake_case.pluralize}'].collect {|i| #{klass_name}.instantiate(i)}
|
82
|
+
else
|
83
|
+
json
|
84
|
+
end
|
85
|
+
end
|
86
|
+
@#{klass_name.snake_case.pluralize} = unless @#{klass_name.snake_case.pluralize}.is_a?(#{klass_name})
|
87
|
+
@#{klass_name.snake_case.pluralize}
|
88
|
+
end
|
89
|
+
"
|
90
|
+
end
|
91
|
+
def is_child?
|
92
|
+
(@parent ||= nil)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def self.instantiate(attrs={})
|
97
|
+
new(attrs.merge('new_record' => false))
|
98
|
+
end
|
99
|
+
def initialize(attrs={})
|
100
|
+
@new_record = true
|
101
|
+
attrs.each { |k,v| instance_variable_set("@#{k}", v) }
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
data/shopify.gemspec
CHANGED
@@ -2,15 +2,15 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{shopify}
|
5
|
-
s.version = "0.1.
|
5
|
+
s.version = "0.1.9"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["Daniel Parker"]
|
9
|
-
s.date = %q{
|
9
|
+
s.date = %q{2009-03-10}
|
10
10
|
s.description = %q{Easily communicate with Shopify.com's restful API.}
|
11
11
|
s.email = %q{gems@behindlogic.com}
|
12
|
-
s.extra_rdoc_files = ["CHANGELOG", "lib/shopify/
|
13
|
-
s.files = ["CHANGELOG", "lib/shopify/
|
12
|
+
s.extra_rdoc_files = ["CHANGELOG", "lib/shopify/support.rb", "lib/shopify.rb", "LICENSE", "README"]
|
13
|
+
s.files = ["CHANGELOG", "lib/shopify/support.rb", "lib/shopify.rb", "LICENSE", "Manifest", "README", "shopify.gemspec"]
|
14
14
|
s.has_rdoc = true
|
15
15
|
s.homepage = %q{http://github.com/dcparker/shopify/tree}
|
16
16
|
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Shopify", "--main", "README"]
|
@@ -24,14 +24,11 @@ Gem::Specification.new do |s|
|
|
24
24
|
s.specification_version = 2
|
25
25
|
|
26
26
|
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
27
|
-
s.add_runtime_dependency(%q<activeresource>, [">= 0", "= 2.1.0"])
|
28
27
|
s.add_development_dependency(%q<echoe>, [">= 0"])
|
29
28
|
else
|
30
|
-
s.add_dependency(%q<activeresource>, [">= 0", "= 2.1.0"])
|
31
29
|
s.add_dependency(%q<echoe>, [">= 0"])
|
32
30
|
end
|
33
31
|
else
|
34
|
-
s.add_dependency(%q<activeresource>, [">= 0", "= 2.1.0"])
|
35
32
|
s.add_dependency(%q<echoe>, [">= 0"])
|
36
33
|
end
|
37
34
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dcparker-shopify
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Parker
|
@@ -9,23 +9,12 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date:
|
12
|
+
date: 2009-03-10 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
|
-
- !ruby/object:Gem::Dependency
|
16
|
-
name: activeresource
|
17
|
-
version_requirement:
|
18
|
-
version_requirements: !ruby/object:Gem::Requirement
|
19
|
-
requirements:
|
20
|
-
- - ">="
|
21
|
-
- !ruby/object:Gem::Version
|
22
|
-
version: "0"
|
23
|
-
- - "="
|
24
|
-
- !ruby/object:Gem::Version
|
25
|
-
version: 2.1.0
|
26
|
-
version:
|
27
15
|
- !ruby/object:Gem::Dependency
|
28
16
|
name: echoe
|
17
|
+
type: :development
|
29
18
|
version_requirement:
|
30
19
|
version_requirements: !ruby/object:Gem::Requirement
|
31
20
|
requirements:
|
@@ -41,25 +30,13 @@ extensions: []
|
|
41
30
|
|
42
31
|
extra_rdoc_files:
|
43
32
|
- CHANGELOG
|
44
|
-
- lib/shopify/
|
45
|
-
- lib/shopify/order.rb
|
46
|
-
- lib/shopify/product.rb
|
47
|
-
- lib/shopify/sale.rb
|
48
|
-
- lib/shopify/session.rb
|
49
|
-
- lib/shopify/shop.rb
|
50
|
-
- lib/shopify/site.rb
|
33
|
+
- lib/shopify/support.rb
|
51
34
|
- lib/shopify.rb
|
52
35
|
- LICENSE
|
53
36
|
- README
|
54
37
|
files:
|
55
38
|
- CHANGELOG
|
56
|
-
- lib/shopify/
|
57
|
-
- lib/shopify/order.rb
|
58
|
-
- lib/shopify/product.rb
|
59
|
-
- lib/shopify/sale.rb
|
60
|
-
- lib/shopify/session.rb
|
61
|
-
- lib/shopify/shop.rb
|
62
|
-
- lib/shopify/site.rb
|
39
|
+
- lib/shopify/support.rb
|
63
40
|
- lib/shopify.rb
|
64
41
|
- LICENSE
|
65
42
|
- Manifest
|
data/lib/shopify/address.rb
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
module Shopify
|
2
|
-
class ShippingAddress < ActiveResource::Base
|
3
|
-
end
|
4
|
-
|
5
|
-
class BillingAddress < ActiveResource::Base
|
6
|
-
def name
|
7
|
-
"#{first_name} #{last_name}"
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
class Country < ActiveResource::Base
|
12
|
-
end
|
13
|
-
|
14
|
-
class Province < ActiveResource::Base
|
15
|
-
self.prefix = "/admin/countries/:country_id/"
|
16
|
-
end
|
17
|
-
end
|
data/lib/shopify/order.rb
DELETED
@@ -1,36 +0,0 @@
|
|
1
|
-
module Shopify
|
2
|
-
class Order < ActiveResource::Base
|
3
|
-
def fulfilled?
|
4
|
-
!!fulfillment_status
|
5
|
-
end
|
6
|
-
|
7
|
-
def closed?
|
8
|
-
closed_at < Time.now
|
9
|
-
end
|
10
|
-
|
11
|
-
def close
|
12
|
-
load_attributes_from_response(post(:close))
|
13
|
-
end
|
14
|
-
|
15
|
-
def open
|
16
|
-
load_attributes_from_response(post(:open))
|
17
|
-
end
|
18
|
-
|
19
|
-
def payments
|
20
|
-
Payment.get
|
21
|
-
end
|
22
|
-
|
23
|
-
def capture(amount=nil)
|
24
|
-
load_attributes_from_response(post(:capture, :amount => amount))
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
class LineItem < ActiveResource::Base
|
29
|
-
end
|
30
|
-
|
31
|
-
class ShippingLine < ActiveResource::Base
|
32
|
-
end
|
33
|
-
|
34
|
-
class CustomCollection < ActiveResource::Base
|
35
|
-
end
|
36
|
-
end
|
data/lib/shopify/product.rb
DELETED
@@ -1,45 +0,0 @@
|
|
1
|
-
module Shopify
|
2
|
-
class Product < ActiveResource::Base
|
3
|
-
class << self
|
4
|
-
# Share all items of this store with the shopify marketplace
|
5
|
-
def share_all
|
6
|
-
post :share
|
7
|
-
end
|
8
|
-
# Stop sharing all items of this store with the shopify marketplace
|
9
|
-
def unshare_all
|
10
|
-
delete :share
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
# Auto-compute the price range
|
15
|
-
def price_range
|
16
|
-
prices = variants.collect(&:price)
|
17
|
-
format = "%0.2f"
|
18
|
-
if prices.min != prices.max
|
19
|
-
"#{format % prices.min} - #{format % prices.max}"
|
20
|
-
else
|
21
|
-
format % prices.min
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
class Variant < ActiveResource::Base
|
27
|
-
self.prefix = "/admin/products/:product_id/"
|
28
|
-
end
|
29
|
-
|
30
|
-
class Image < ActiveResource::Base
|
31
|
-
self.prefix = "/admin/products/:product_id/"
|
32
|
-
|
33
|
-
# generate a method for each possible image variant
|
34
|
-
[:pico, :icon, :thumb, :small, :medium, :large, :original].each do |m|
|
35
|
-
reg_exp_match = "/\\1_#{m}.\\2"
|
36
|
-
define_method(m) { src.gsub(/\/(.*)\.(\w{2,4})/, reg_exp_match) }
|
37
|
-
end
|
38
|
-
|
39
|
-
# Attach an image to a product.
|
40
|
-
def attach_image(data, filename = nil)
|
41
|
-
attributes[:attachment] = Base64.encode64(data)
|
42
|
-
attributes[:filename] = filename unless filename.nil?
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
data/lib/shopify/sale.rb
DELETED
data/lib/shopify/session.rb
DELETED
@@ -1,83 +0,0 @@
|
|
1
|
-
require 'digest/md5'
|
2
|
-
|
3
|
-
module Shopify
|
4
|
-
# Shopify Session
|
5
|
-
#
|
6
|
-
# Example:
|
7
|
-
# class LoginController < ApplicationController
|
8
|
-
# layout 'empty'
|
9
|
-
#
|
10
|
-
# before { Shopify.sessions << Shopify::Session.new(session[:store_name] || params[:store_name], session[:shopify_token], SHOPIFY_APP_SECRET) if Shopify.sessions.empty? && (session[:store_name] || params[:store_name]) }
|
11
|
-
#
|
12
|
-
# def signin
|
13
|
-
# # ask user for his myshopify.com address.
|
14
|
-
# end
|
15
|
-
#
|
16
|
-
# # POST to this with the store name
|
17
|
-
# def login
|
18
|
-
# # Set the store_name into the session for future requests.
|
19
|
-
# session[:store_name] = params[:store_name]
|
20
|
-
# # This will redirect the user to their Shopify store to authorize your application.
|
21
|
-
# # Shopify will redirect the user back to your :finalize action when finished.
|
22
|
-
# redirect Shopify.current_session.permission_url
|
23
|
-
# end
|
24
|
-
#
|
25
|
-
# def finalize
|
26
|
-
# Shopify.current_session.token = params[:t]
|
27
|
-
# Shopify.apply_current_session!
|
28
|
-
# if Shopify.current_session.signed_in?
|
29
|
-
# redirect # logged in area
|
30
|
-
# else
|
31
|
-
# flash[:notice] = "Couldn't sign in to your shopify store."
|
32
|
-
# redirect url(:signin)
|
33
|
-
# end
|
34
|
-
# end
|
35
|
-
# end
|
36
|
-
#
|
37
|
-
class Session
|
38
|
-
cattr_accessor :protocol
|
39
|
-
self.protocol = 'http'
|
40
|
-
|
41
|
-
attr_accessor :host, :key, :secret, :token
|
42
|
-
|
43
|
-
def initialize(host, key=nil, secret=nil, token=nil)
|
44
|
-
host.gsub!(/https?:\/\//, '') # remove http://
|
45
|
-
host = "#{host}.myshopify.com" unless host.include?('.') # extend url to myshopify.com if no host is given
|
46
|
-
|
47
|
-
self.host = host
|
48
|
-
self.key = key
|
49
|
-
self.secret = secret
|
50
|
-
self.token = token
|
51
|
-
end
|
52
|
-
|
53
|
-
# mode can be either r to request read rights or w to request read/write rights.
|
54
|
-
def permission_url(mode='w')
|
55
|
-
"http://#{host}/admin/api/auth?api_key=#{key}&mode=#{mode}"
|
56
|
-
end
|
57
|
-
|
58
|
-
def apply!
|
59
|
-
ActiveResource::Base.site = site if signed_in?
|
60
|
-
end
|
61
|
-
|
62
|
-
# use this to initialize ActiveResource:
|
63
|
-
#
|
64
|
-
# ActiveResource::Base.site = Shopify.current_session.site
|
65
|
-
#
|
66
|
-
def site
|
67
|
-
"#{protocol}://#{key}:#{password}@#{host}/admin"
|
68
|
-
end
|
69
|
-
|
70
|
-
def signed_in?
|
71
|
-
[host, key, secret, token].all?
|
72
|
-
end
|
73
|
-
|
74
|
-
private
|
75
|
-
|
76
|
-
# The secret is computed by taking the shared_secret which we got when
|
77
|
-
# registring this third party application and concating the request_to it,
|
78
|
-
# and then calculating a MD5 hexdigest.
|
79
|
-
def password
|
80
|
-
Digest::MD5.hexdigest("#{secret.chomp}#{token.chomp}")
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|
data/lib/shopify/shop.rb
DELETED
data/lib/shopify/site.rb
DELETED