shopify_app 0.1.0
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/.gitignore +7 -0
- data/CHANGELOG +2 -0
- data/Gemfile +4 -0
- data/README.rdoc +58 -0
- data/Rakefile +2 -0
- data/install.rb +25 -0
- data/lib/generators/shopify_app/README +23 -0
- data/lib/generators/shopify_app/USAGE +22 -0
- data/lib/generators/shopify_app/shopify_app_generator.rb +50 -0
- data/lib/generators/shopify_app/templates/app/controllers/home_controller.rb +18 -0
- data/lib/generators/shopify_app/templates/app/controllers/login_controller.rb +50 -0
- data/lib/generators/shopify_app/templates/app/helpers/home_helper.rb +3 -0
- data/lib/generators/shopify_app/templates/app/helpers/login_helper.rb +3 -0
- data/lib/generators/shopify_app/templates/app/helpers/tabs_helper.rb +10 -0
- data/lib/generators/shopify_app/templates/app/views/home/design.html.erb +164 -0
- data/lib/generators/shopify_app/templates/app/views/home/index.html.erb +103 -0
- data/lib/generators/shopify_app/templates/app/views/home/welcome.html.erb +110 -0
- data/lib/generators/shopify_app/templates/app/views/layouts/application.html.erb +39 -0
- data/lib/generators/shopify_app/templates/app/views/login/index.html.erb +15 -0
- data/lib/generators/shopify_app/templates/public/images/box-bg2.gif +0 -0
- data/lib/generators/shopify_app/templates/public/images/info-bg.gif +0 -0
- data/lib/generators/shopify_app/templates/public/images/info.gif +0 -0
- data/lib/generators/shopify_app/templates/public/images/shopify-logo.png +0 -0
- data/lib/generators/shopify_app/templates/public/stylesheets/application.css +285 -0
- data/lib/shopify_app.rb +17 -0
- data/lib/shopify_app/configuration.rb +6 -0
- data/lib/shopify_app/login_protection.rb +21 -0
- data/lib/shopify_app/railtie.rb +17 -0
- data/lib/shopify_app/version.rb +3 -0
- data/shopify_app.gemspec +26 -0
- metadata +134 -0
data/.gitignore
ADDED
data/CHANGELOG
ADDED
data/Gemfile
ADDED
data/README.rdoc
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
= Shopify application generator for Rails 3
|
2
|
+
|
3
|
+
== Description
|
4
|
+
|
5
|
+
This plugin makes it easy to get a Rails 3 app up and running with the
|
6
|
+
Shopify API.
|
7
|
+
|
8
|
+
The generator creates a basic login controller for authenticating with your
|
9
|
+
shop and a controller called "home" which displays basic information about
|
10
|
+
your products, orders and articles.
|
11
|
+
|
12
|
+
<i>Note: It's recommended to use this on a new Rails project, so that the
|
13
|
+
generator won't overwrite/delete some of your files.</i>
|
14
|
+
|
15
|
+
== Installation
|
16
|
+
|
17
|
+
# Add the gem shopify_app to your Gemfile
|
18
|
+
$ echo "gem 'shopify_app'" >> Gemfile
|
19
|
+
$ bundle install
|
20
|
+
|
21
|
+
== Usage
|
22
|
+
|
23
|
+
$ rails generate shopify_app your_app_api_key your_app_secret
|
24
|
+
|
25
|
+
If you don't have an API key yet, create a Shopify Partner account at
|
26
|
+
http://shopify.com/partners and create an app. You can also create test shops
|
27
|
+
once you're logged in as a partner.
|
28
|
+
|
29
|
+
When you create your app in the Shopify Partner Account, set the return URL to
|
30
|
+
<tt>http://localhost:3000/login/finalize</tt>
|
31
|
+
|
32
|
+
You can also create a private application that only works for your shop by
|
33
|
+
visiting https://YOUR-SHOP.myshopify.com/admin/api
|
34
|
+
|
35
|
+
=== Example
|
36
|
+
|
37
|
+
$ rails generate shopify_app edffbb1bb793e2750686e6f4647a384a fed5bb18hde3e2750686e6f4647a781a
|
38
|
+
|
39
|
+
This will create a LoginController and a HomeController with their own views.
|
40
|
+
|
41
|
+
== After running the generator
|
42
|
+
|
43
|
+
First, start your application:
|
44
|
+
|
45
|
+
$ rails server
|
46
|
+
|
47
|
+
Now visit http://localhost:3000 and install your application in a Shopify store.
|
48
|
+
|
49
|
+
After your application has been given read or read/write API permission by the
|
50
|
+
shop, you're ready to start experimenting with the Shopify API.
|
51
|
+
|
52
|
+
== Questions or problems?
|
53
|
+
|
54
|
+
http://api.shopify.com <= Read up on the possible API calls!
|
55
|
+
|
56
|
+
http://forums.shopify.com/categories/9 <= Talk to new friends!
|
57
|
+
|
58
|
+
http://wiki.shopify.com/Shopify_App_Development <= Edit the docs!
|
data/Rakefile
ADDED
data/install.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
puts
|
2
|
+
puts "Shopify App Generator"
|
3
|
+
puts "---------------------"
|
4
|
+
puts
|
5
|
+
puts "To get started, first register your app as a Shopify Partner:"
|
6
|
+
puts
|
7
|
+
puts " * Go to http://www.shopify.com/partners and create or login to your Partner account."
|
8
|
+
puts
|
9
|
+
puts " * Jump over to the Apps tab and hit the 'Create a new app' button"
|
10
|
+
puts " (Make sure to set the Return URL to http://localhost:3000/login/finalize during development)"
|
11
|
+
puts
|
12
|
+
puts " * Install the Shopify API gem:
|
13
|
+
|
14
|
+
$ gem install shopify_api"
|
15
|
+
puts
|
16
|
+
puts " * Run
|
17
|
+
|
18
|
+
$ rails generate shopify_app your_app_api_key your_app_secret"
|
19
|
+
puts
|
20
|
+
puts " * Set up a test shop to install your app in (do this on the Partner site)"
|
21
|
+
puts
|
22
|
+
puts " * Run $ rails server"
|
23
|
+
puts
|
24
|
+
puts " * Visit http://localhost:3000 and use the test shop's URL to install this app"
|
25
|
+
puts
|
@@ -0,0 +1,23 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
What's next?
|
4
|
+
------------
|
5
|
+
|
6
|
+
Make sure to set the return URL of the application your Shopify partner account
|
7
|
+
to <tt>http://localhost:3000/login/finalize</tt>.
|
8
|
+
|
9
|
+
Then, start your application with:
|
10
|
+
|
11
|
+
$ rails server
|
12
|
+
|
13
|
+
Now visit http://localhost:3000 and install your application in a Shopify store.
|
14
|
+
|
15
|
+
After your application has been given read or read/write API permission by the
|
16
|
+
shop, you're ready to start experimenting with the Shopify API.
|
17
|
+
|
18
|
+
Questions or problems?
|
19
|
+
----------------------
|
20
|
+
|
21
|
+
API Reference http://api.shopify.com
|
22
|
+
Developer Forums http://forums.shopify.com/categories/9
|
23
|
+
Developer Wiki http://wiki.shopify.com/Shopify_App_Development
|
@@ -0,0 +1,22 @@
|
|
1
|
+
Description:
|
2
|
+
This is a generator for creating a basic Shopify application to quickly get
|
3
|
+
you started. You can see some examples on how to use the Shopify API.
|
4
|
+
|
5
|
+
The generator creates a basic login controller for authenticating with your
|
6
|
+
Shop and a controller called "home" which displays basic information
|
7
|
+
about your products, orders and articles.
|
8
|
+
|
9
|
+
Note: It's recommended to use this on a new Rails project, so that the
|
10
|
+
generator won't overwrite/delete some of your files.
|
11
|
+
|
12
|
+
Usage:
|
13
|
+
Pass your API key and then your Secret, which the login controller
|
14
|
+
will need to authenticate with your shop.
|
15
|
+
If you don't have an API key yet, register your application in our
|
16
|
+
partner system at http://www.shopify.com/partners
|
17
|
+
|
18
|
+
|
19
|
+
Examples:
|
20
|
+
script/generate shopify_app edffbb1bb793e2750686e6f4647a384a abbcee050...
|
21
|
+
|
22
|
+
This will create a login controller and a home controller and views.
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'rails/generators'
|
2
|
+
|
3
|
+
class ShopifyAppGenerator < Rails::Generators::Base
|
4
|
+
argument :api_key, :type => :string, :required => false
|
5
|
+
argument :secret, :type => :string, :required => false
|
6
|
+
|
7
|
+
class_option :skip_routes, :type => :boolean, :default => false, :desc => 'pass true to skip route generation'
|
8
|
+
|
9
|
+
def self.source_root
|
10
|
+
File.join(File.dirname(__FILE__), 'templates')
|
11
|
+
end
|
12
|
+
|
13
|
+
def copy_files
|
14
|
+
directory 'app'
|
15
|
+
directory 'public'
|
16
|
+
end
|
17
|
+
|
18
|
+
def remove_static_index
|
19
|
+
remove_file 'public/index.html'
|
20
|
+
end
|
21
|
+
|
22
|
+
def add_config_variables
|
23
|
+
|
24
|
+
api_key_str = api_key.nil? ? "ENV['SHOPIFY_API_KEY']" : api_key.inspect
|
25
|
+
api_secret_str = secret.nil? ? "ENV['SHOPIFY_API_SECRET']" : secret.inspect
|
26
|
+
|
27
|
+
inject_into_file 'config/application.rb', <<-DATA, :after => "class Application < Rails::Application\n"
|
28
|
+
|
29
|
+
# Shopify API connection credentials:
|
30
|
+
config.shopify.api_key = #{api_key_str}
|
31
|
+
config.shopify.secret = #{api_secret_str}
|
32
|
+
DATA
|
33
|
+
end
|
34
|
+
|
35
|
+
def add_routes
|
36
|
+
unless options[:skip_routes]
|
37
|
+
route "match 'login/logout' => 'login#logout'"
|
38
|
+
route "match 'login/finalize' => 'login#finalize'"
|
39
|
+
route "match 'login/authenticate' => 'login#authenticate'"
|
40
|
+
route "match 'login' => 'login#index'"
|
41
|
+
route "match 'design' => 'home#design'"
|
42
|
+
route "match 'welcome' => 'home#welcome'"
|
43
|
+
route "root :to => 'home#index'"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def display_readme
|
48
|
+
readme '../README'
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
class HomeController < ApplicationController
|
2
|
+
|
3
|
+
around_filter :shopify_session, :except => 'welcome'
|
4
|
+
|
5
|
+
def welcome
|
6
|
+
current_host = "#{request.host}#{':' + request.port.to_s if request.port != 80}"
|
7
|
+
@callback_url = "http://#{current_host}/login/finalize"
|
8
|
+
end
|
9
|
+
|
10
|
+
def index
|
11
|
+
# get 3 products
|
12
|
+
@products = ShopifyAPI::Product.find(:all, :params => {:limit => 3})
|
13
|
+
|
14
|
+
# get latest 3 orders
|
15
|
+
@orders = ShopifyAPI::Order.find(:all, :params => {:limit => 3, :order => "created_at DESC" })
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
class LoginController < ApplicationController
|
2
|
+
def index
|
3
|
+
# Ask user for their #{shop}.myshopify.com address
|
4
|
+
|
5
|
+
# If the #{shop}.myshopify.com address is already provided in the URL, just skip to #authenticate
|
6
|
+
if params[:shop].present?
|
7
|
+
redirect_to :controller => 'login', :action => "authenticate", :shop => params[:shop]
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def authenticate
|
12
|
+
if params[:shop].present?
|
13
|
+
redirect_to ShopifyAPI::Session.new(params[:shop].to_s).create_permission_url
|
14
|
+
else
|
15
|
+
redirect_to return_address
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
# Shopify redirects the logged-in user back to this action along with
|
20
|
+
# the authorization token t.
|
21
|
+
#
|
22
|
+
# This token is later combined with the developer's shared secret to form
|
23
|
+
# the password used to call API methods.
|
24
|
+
def finalize
|
25
|
+
shopify_session = ShopifyAPI::Session.new(params[:shop], params[:t], params)
|
26
|
+
if shopify_session.valid?
|
27
|
+
session[:shopify] = shopify_session
|
28
|
+
flash[:notice] = "Logged in to shopify store."
|
29
|
+
|
30
|
+
redirect_to return_address
|
31
|
+
session[:return_to] = nil
|
32
|
+
else
|
33
|
+
flash[:error] = "Could not log in to Shopify store."
|
34
|
+
redirect_to :action => 'index'
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def logout
|
39
|
+
session[:shopify] = nil
|
40
|
+
flash[:notice] = "Successfully logged out."
|
41
|
+
|
42
|
+
redirect_to :action => 'index'
|
43
|
+
end
|
44
|
+
|
45
|
+
protected
|
46
|
+
|
47
|
+
def return_address
|
48
|
+
session[:return_to] || root_url
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
module TabsHelper
|
2
|
+
# Create a tab as <li> and give it the id "current" if the current action matches that tab
|
3
|
+
def tab(name, url, options = {})
|
4
|
+
if controller.action_name =~ (options[:highlight] = /#{name}/i)
|
5
|
+
content_tag :li, link_to(options[:label] || name.to_s.capitalize, url, {:id => "current"})
|
6
|
+
else
|
7
|
+
content_tag :li, link_to(options[:label] || name.to_s.capitalize, url)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,164 @@
|
|
1
|
+
<h1 class="blue">Overview of the styles used</h1>
|
2
|
+
|
3
|
+
<div class="info">
|
4
|
+
<%= image_tag '/images/info.gif', :style => "float:left" %>
|
5
|
+
<p>You are free to use this demo application as a base to create new applications that use the Shopify API.</p>
|
6
|
+
</div>
|
7
|
+
|
8
|
+
<table id="style-table">
|
9
|
+
<tr>
|
10
|
+
<td style="width: 33%">
|
11
|
+
<pre><code><h1>Lorem ipsum</h1></code></pre>
|
12
|
+
</td>
|
13
|
+
|
14
|
+
<td style="width: 66%">
|
15
|
+
<h1>Lorem ipsum</h1>
|
16
|
+
</td>
|
17
|
+
</tr>
|
18
|
+
<tr>
|
19
|
+
<td>
|
20
|
+
<pre><code><h2>Lorem ipsum</h2></code></pre>
|
21
|
+
</td>
|
22
|
+
|
23
|
+
<td>
|
24
|
+
<h2>Lorem ipsum</h2>
|
25
|
+
</td>
|
26
|
+
</tr>
|
27
|
+
<tr>
|
28
|
+
<td>
|
29
|
+
<pre><code><h3>Lorem ipsum</h3></code></pre>
|
30
|
+
</td>
|
31
|
+
|
32
|
+
<td>
|
33
|
+
<h3>Lorem ipsum</h3>
|
34
|
+
</td>
|
35
|
+
</tr>
|
36
|
+
<tr>
|
37
|
+
<td>
|
38
|
+
<pre><code><h4>Lorem ipsum</h4></code></pre>
|
39
|
+
</td>
|
40
|
+
|
41
|
+
<td>
|
42
|
+
<h4>Lorem ipsum</h4>
|
43
|
+
</td>
|
44
|
+
</tr>
|
45
|
+
|
46
|
+
<tr>
|
47
|
+
<td>
|
48
|
+
<pre><code><p>…</p></code></pre>
|
49
|
+
</td>
|
50
|
+
|
51
|
+
<td>
|
52
|
+
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
|
53
|
+
</td>
|
54
|
+
</tr>
|
55
|
+
|
56
|
+
<tr>
|
57
|
+
<td>
|
58
|
+
<pre><code><p class="note">…</p></code></pre>
|
59
|
+
</td>
|
60
|
+
|
61
|
+
<td>
|
62
|
+
<p class="note">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
|
63
|
+
</td>
|
64
|
+
</tr>
|
65
|
+
|
66
|
+
<tr>
|
67
|
+
<td>
|
68
|
+
<pre><code><span class="highlight">…</span></code></pre>
|
69
|
+
</td>
|
70
|
+
|
71
|
+
<td>
|
72
|
+
<span class="highlight">Lorem ipsum dolor sit amet</p>
|
73
|
+
</td>
|
74
|
+
</tr>
|
75
|
+
|
76
|
+
<tr>
|
77
|
+
<td>
|
78
|
+
<pre><code><h3 class="blue">…</h3></code></pre>
|
79
|
+
</td>
|
80
|
+
|
81
|
+
<td>
|
82
|
+
<h3 class="blue">Lorem ipsum</h3>
|
83
|
+
</td>
|
84
|
+
</tr>
|
85
|
+
<tr>
|
86
|
+
<td>
|
87
|
+
<pre><code><h3 class="green">…</h3></code></pre>
|
88
|
+
</td>
|
89
|
+
|
90
|
+
<td>
|
91
|
+
<h3 class="green">Lorem ipsum</h3>
|
92
|
+
</td>
|
93
|
+
</tr>
|
94
|
+
<tr>
|
95
|
+
<td>
|
96
|
+
<pre><code><h3 class="orange">…</h3></code></pre>
|
97
|
+
</td>
|
98
|
+
|
99
|
+
<td>
|
100
|
+
<h3 class="orange">Lorem ipsum</h3>
|
101
|
+
</td>
|
102
|
+
</tr>
|
103
|
+
|
104
|
+
<tr>
|
105
|
+
<td>
|
106
|
+
<pre><code><p class="blue">…</p></code></pre>
|
107
|
+
</td>
|
108
|
+
|
109
|
+
<td>
|
110
|
+
<p class="blue">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
|
111
|
+
</td>
|
112
|
+
</tr>
|
113
|
+
<tr>
|
114
|
+
<td>
|
115
|
+
<pre><code><p class="green">…</p></code></pre>
|
116
|
+
</td>
|
117
|
+
|
118
|
+
<td>
|
119
|
+
<p class="green">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
|
120
|
+
</td>
|
121
|
+
</tr>
|
122
|
+
<tr>
|
123
|
+
<td>
|
124
|
+
<pre><code><p class="orange">…</p></code></pre>
|
125
|
+
</td>
|
126
|
+
|
127
|
+
<td>
|
128
|
+
<p class="orange">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
|
129
|
+
</td>
|
130
|
+
</tr>
|
131
|
+
|
132
|
+
<tr>
|
133
|
+
<td>
|
134
|
+
<pre><code><div class="box"><br /> <div class="wrapper">…</div><br /></div></code></pre>
|
135
|
+
</td>
|
136
|
+
|
137
|
+
<td>
|
138
|
+
<div class="box"><div class="wrapper">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</div></div>
|
139
|
+
</td>
|
140
|
+
</tr>
|
141
|
+
|
142
|
+
<tr>
|
143
|
+
<td>
|
144
|
+
<pre><code><p class="dark">…</p></code></pre>
|
145
|
+
</td>
|
146
|
+
|
147
|
+
<td>
|
148
|
+
<p class="dark">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
|
149
|
+
</td>
|
150
|
+
</tr>
|
151
|
+
|
152
|
+
<tr>
|
153
|
+
<td>
|
154
|
+
<pre><code><p class="light">…</p></code></pre>
|
155
|
+
</td>
|
156
|
+
|
157
|
+
<td>
|
158
|
+
<p class="light">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
|
159
|
+
</td>
|
160
|
+
</tr>
|
161
|
+
|
162
|
+
|
163
|
+
|
164
|
+
</table>
|
@@ -0,0 +1,103 @@
|
|
1
|
+
<div id="sidebar">
|
2
|
+
<h3>Where to start</h3>
|
3
|
+
<h4>Check out the <code style="font-size: 140%">home_controller</code></h4>
|
4
|
+
|
5
|
+
<p class="description">
|
6
|
+
The controller in this demo application fetches the latest 3 orders and products and makes them available as instance variables <code style="color: #218BCE">@orders</code> and <code style="color: #218BCE">@products</code>.
|
7
|
+
</p>
|
8
|
+
|
9
|
+
<h4>Check out the <code>index</code> template</h4>
|
10
|
+
|
11
|
+
<p class="description">
|
12
|
+
This is the Ruby template you are currently looking at. It is located at:<br />
|
13
|
+
</p>
|
14
|
+
|
15
|
+
<p style="background: #fff; margin-left: 4px"><code>views/home/index.html.erb</code></p>
|
16
|
+
|
17
|
+
<p class="description">
|
18
|
+
Have a look at the markup and Ruby code to see how the Shopify API is being used.
|
19
|
+
</p>
|
20
|
+
|
21
|
+
<h3>Additional documentation</h3>
|
22
|
+
|
23
|
+
<p class="description">
|
24
|
+
Become an expert:
|
25
|
+
</p>
|
26
|
+
|
27
|
+
<ul>
|
28
|
+
<li>
|
29
|
+
<%= link_to 'API documentation', 'http://www.shopify.com/developers/api/' %>
|
30
|
+
<span class="note">The reference: what you can do with the Shopify API.</span>
|
31
|
+
</li>
|
32
|
+
<li>
|
33
|
+
<%= link_to 'Wiki', 'http://wiki.shopify.com/' %>
|
34
|
+
<span class="note">Get more information and share your knowledge.</span>
|
35
|
+
</li>
|
36
|
+
<li>
|
37
|
+
<%= link_to 'Forum', 'http://forums.shopify.com/community' %>
|
38
|
+
<span class="note">Ask questions and see what others already wanted to know.</span>
|
39
|
+
</li>
|
40
|
+
</ul>
|
41
|
+
|
42
|
+
<h3>Once you're ready</h3>
|
43
|
+
|
44
|
+
<p class="description">
|
45
|
+
We'd love to see what you create using the Shopify API.
|
46
|
+
Find out how to share your application with the world and read the latest information on the <%= link_to 'API Publishing Page', 'http://www.shopify.com/developers/publishing/' %>.
|
47
|
+
</p>
|
48
|
+
</div>
|
49
|
+
|
50
|
+
|
51
|
+
<div id="orders">
|
52
|
+
<h2>Your recent orders</h2>
|
53
|
+
|
54
|
+
<% if @orders.blank? %>
|
55
|
+
|
56
|
+
<em class="note">There are no orders in your store.</em>
|
57
|
+
|
58
|
+
<% else %>
|
59
|
+
|
60
|
+
<ul>
|
61
|
+
<% @orders.each do |order| %>
|
62
|
+
<li>
|
63
|
+
<div class="order box">
|
64
|
+
<div class="wrapper">
|
65
|
+
<strong><%= link_to order.name, "http://#{current_shop.url}/admin/orders/#{order.id}" %></strong>
|
66
|
+
<span class="price"><%= order.total_price %> <%= order.currency %></span>
|
67
|
+
<span class="highlight"><%= order.financial_status %></span>
|
68
|
+
by <span class="note"><%= order.billing_address.name %></span>
|
69
|
+
</div>
|
70
|
+
</div>
|
71
|
+
</li>
|
72
|
+
<% end %>
|
73
|
+
</ul>
|
74
|
+
|
75
|
+
<% end %>
|
76
|
+
</div>
|
77
|
+
|
78
|
+
|
79
|
+
<h2>Some of your products</h2>
|
80
|
+
|
81
|
+
<% if @products.blank? %>
|
82
|
+
|
83
|
+
<em class="note">There are no products in your store.</em>
|
84
|
+
|
85
|
+
<% else %>
|
86
|
+
|
87
|
+
<% @products.each do |product| %>
|
88
|
+
<div class="product box">
|
89
|
+
<div class="wrapper">
|
90
|
+
<%= image_tag product.images.first.small rescue '' %>
|
91
|
+
|
92
|
+
<h4><%= link_to product.title, "http://#{current_shop.url}/admin/products/#{product.id}" %></h4>
|
93
|
+
|
94
|
+
<p class="price"><%= product.price_range %> <%= current_shop.shop.currency %></p>
|
95
|
+
<p style="margin-bottom: 0"><%= product.product_type %> <span class="note">type</span></p>
|
96
|
+
<p style="margin: 0"><%= product.vendor %> <span class="note">vendor</span></p>
|
97
|
+
|
98
|
+
<div style="clear:left"></div>
|
99
|
+
</div>
|
100
|
+
</div>
|
101
|
+
<% end %>
|
102
|
+
|
103
|
+
<% end %>
|
@@ -0,0 +1,110 @@
|
|
1
|
+
<h1 class="green">Welcome</h1>
|
2
|
+
|
3
|
+
<p>
|
4
|
+
This is an example Shopify application that shows what you can do with the Shopify API.
|
5
|
+
</p>
|
6
|
+
|
7
|
+
<div class="info" style="clear: both">
|
8
|
+
This will send the <strong>API-Key</strong> and <strong>Secret</strong> to a shop, and make sure that you have the rights to
|
9
|
+
access its private admin data.<br/>
|
10
|
+
After authenticating, you will be redirected to the <code>finalize</code> action of your <code>LoginController</code>, which stores the session, and then redirects you to your example dashboard.<br/>
|
11
|
+
Your <code>HomeController</code> will get your recent <code>Orders</code> and <code>Articles</code> through the
|
12
|
+
Shopify <%= link_to 'REST', 'http://www.xfront.com/REST-Web-Services.html', :title => "Get more information about REST web services in general" %> API and list them with all of your <code>Products</code>.
|
13
|
+
You can click on a link of one of your objects and will then be taken to the corresponding admin area of your shop.<br/>
|
14
|
+
|
15
|
+
<p><strong>Note:</strong> There are no examples for <em>creating or editing</em> objects, but you are also able to do that with the Shopify API!</p>
|
16
|
+
</div>
|
17
|
+
|
18
|
+
<h3>1. Make sure you've entered a valid <em>API-Key</em> and <em>Secret</em></h3>
|
19
|
+
|
20
|
+
<ul style="list-style-type: lower-alpha;">
|
21
|
+
<li>
|
22
|
+
<p>
|
23
|
+
If you haven't registered your application yet, then enter your shop's <strong>URL</strong> or <strong>subdomain</strong> here:<br/>
|
24
|
+
</p>
|
25
|
+
|
26
|
+
<div class="box grey" style="width: 500px;text-align: center">
|
27
|
+
<script type="text/javascript" charset="utf-8">
|
28
|
+
function getApiUrl() {
|
29
|
+
var name = $('shop').value;
|
30
|
+
if (name.indexOf('.') == -1) {
|
31
|
+
var api_url = name + '.myshopify.com';
|
32
|
+
} else {
|
33
|
+
var api_url = name.replace(/^https?:\/\//, ''); // Remove the "http://"
|
34
|
+
}
|
35
|
+
api_url = api_url.replace(/\/$/, ''); // Trim trailing slashes
|
36
|
+
$('api-form').action = 'http://' + api_url + '/admin/api_clients/new';
|
37
|
+
}
|
38
|
+
</script>
|
39
|
+
|
40
|
+
<% form_tag '', :method => 'get', :id => 'api-form', :onsubmit => "getApiUrl(); return true;", :style => 'margin-left: 16px;' do %>
|
41
|
+
<%= text_field_tag 'shop', '', :size => 40 %>
|
42
|
+
<%= hidden_field_tag 'api_client[return_url]', @callback_url %>
|
43
|
+
<%= submit_tag 'Get API key' %>
|
44
|
+
<% end %>
|
45
|
+
</div>
|
46
|
+
|
47
|
+
<p>
|
48
|
+
After registering your application with Shopify, you need to edit the <code>config/shopify.yml</code> file,
|
49
|
+
and insert your <em>API-Key</em> and <em>Secret</em> there. Then restart this application.
|
50
|
+
</p>
|
51
|
+
</li>
|
52
|
+
<li>
|
53
|
+
<p><strong>If you've already supplied those to the generator</strong>, then move on to <%= link_to 'Step #2', '#callback-step' %>.</p>
|
54
|
+
</li>
|
55
|
+
</ul>
|
56
|
+
|
57
|
+
<h3 id="callback-step">2. Make sure your <em>callback URL</em> is correct</h3>
|
58
|
+
|
59
|
+
The URL should be <code><%= @callback_url %></code>,
|
60
|
+
with the host portion of the URL pointing to whichever domain is currently hosting this application. <br/>
|
61
|
+
The callback URL of your app can be changed in the API screen of your Shopify admin interface.
|
62
|
+
|
63
|
+
<h3>3. <%= link_to 'Login', '/login' %> to your shop</h3>
|
64
|
+
|
65
|
+
<div class="border-wrap">
|
66
|
+
<div class="info">
|
67
|
+
This will send the <strong>API-Key</strong> and <strong>Secret</strong> to a shop, and make sure that you have the rights to
|
68
|
+
access its private admin data.<br/>
|
69
|
+
After authenticating, you will be redirected to the <code>finalize</code> action of your <code>LoginController</code>, which stores the session, and then redirects you to your example dashboard.<br/>
|
70
|
+
Your <code>HomeController</code> will get your recent <code>Orders</code> and <code>Articles</code> through the
|
71
|
+
Shopify <%= link_to 'REST', 'http://www.xfront.com/REST-Web-Services.html', :title => "Get more information about REST web services in general" %> API and list them with all of your <code>Products</code>.
|
72
|
+
You can click on a link of one of your objects and will then be taken to the corresponding admin area of your shop.<br/>
|
73
|
+
|
74
|
+
<p><strong>Note:</strong> There are no examples for <em>creating or editing</em> objects, but you are also able to do that with the Shopify API!</p>
|
75
|
+
</div>
|
76
|
+
</div>
|
77
|
+
|
78
|
+
<h3>4. Check out the source code of the <code>home_controller</code> and its <code>index</code> template</h3>
|
79
|
+
|
80
|
+
<p class="description">
|
81
|
+
You can analyze those files to see how the ShopifyAPI is used and get a glimpse of what's possible.
|
82
|
+
</p>
|
83
|
+
|
84
|
+
<h3>5. Read additional documentation</h3>
|
85
|
+
|
86
|
+
<p class="description">
|
87
|
+
Become an expert.
|
88
|
+
</p>
|
89
|
+
|
90
|
+
<ul>
|
91
|
+
<li>
|
92
|
+
<%= link_to 'API documentation', 'http://www.shopify.com/developers/api' %>
|
93
|
+
<span class="hint">(An overview of what you can do with the Shopify API.)
|
94
|
+
</li>
|
95
|
+
<li>
|
96
|
+
<%= link_to 'Wiki (needs its own API section)', 'http://wiki.shopify.com/' %>
|
97
|
+
<span class="hint">(Get more information and share your knowledge.)
|
98
|
+
</li>
|
99
|
+
<li>
|
100
|
+
<%= link_to 'Forum (needs its own API section)', 'http://forums.shopify.com/community' %>
|
101
|
+
<span class="hint">(Ask questions and see what others already wanted to know.)
|
102
|
+
</li>
|
103
|
+
</ul>
|
104
|
+
|
105
|
+
<h3>6. Publish your application</h3>
|
106
|
+
|
107
|
+
<p class="description">
|
108
|
+
This feature is not implemented yet, but it in the future it will allow you to register your application,
|
109
|
+
so that will be shown in a public directory with a description, so that more users will take notice of it.
|
110
|
+
</p>
|
@@ -0,0 +1,39 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>Shopify Application</title>
|
5
|
+
<%= stylesheet_link_tag :all %>
|
6
|
+
<%= javascript_include_tag :defaults %>
|
7
|
+
<%= csrf_meta_tag %>
|
8
|
+
</head>
|
9
|
+
|
10
|
+
<body>
|
11
|
+
<div id="header">
|
12
|
+
<h1><%= link_to 'Shopify Demo Application', '/' %></h1>
|
13
|
+
|
14
|
+
<p id="login-link">
|
15
|
+
<% if current_shop %>
|
16
|
+
<span class="note">current shop</span> <%= link_to current_shop.url, "http://#{current_shop.url}", :class => 'shop_name' %> <span class="note">|</span>
|
17
|
+
<%= link_to 'logout', :controller => "login", :action => 'logout' %>
|
18
|
+
<% end %>
|
19
|
+
</p>
|
20
|
+
</div>
|
21
|
+
|
22
|
+
<div id="container" class="clearfix">
|
23
|
+
<ul id="tabs">
|
24
|
+
<%= tab :index, {:controller => 'home'}, :label => 'Home' %>
|
25
|
+
<%= tab :design, {:controller => 'home', :action => 'design'}, :label => 'Design Help' %>
|
26
|
+
</ul>
|
27
|
+
|
28
|
+
<!-- Flash error & notice-->
|
29
|
+
<% if flash[:error] %> <div id="flasherrors"><%= flash[:error] %></div><% end %>
|
30
|
+
<% if flash[:notice] %><div id="flashnotices"><%= flash[:notice] %></div><% end %>
|
31
|
+
|
32
|
+
<!-- begin div.main-->
|
33
|
+
<div id="main">
|
34
|
+
<%= yield %>
|
35
|
+
</div>
|
36
|
+
<!-- end div.main -->
|
37
|
+
</div>
|
38
|
+
</body>
|
39
|
+
</html>
|
@@ -0,0 +1,15 @@
|
|
1
|
+
<h1>Install</h1>
|
2
|
+
|
3
|
+
<p>Install this app in a shop to get access to its private admin data.</p>
|
4
|
+
|
5
|
+
<p style="padding-bottom: 1em"><span class="hint">Don’t have a shop to install your app in handy? <a href="https://app.shopify.com/services/partners/api_clients/test_shops">Create a test shop.</a></span></p>
|
6
|
+
|
7
|
+
<%= form_tag '/login/authenticate' do %>
|
8
|
+
<label for='shop'><strong>The URL of the Shop</strong>
|
9
|
+
<span class="hint">(or just the subdomain if it’s at myshopify.com)</span>
|
10
|
+
</label>
|
11
|
+
<p>
|
12
|
+
<%= text_field_tag 'shop', nil, {:size => 45} %>
|
13
|
+
<%= submit_tag 'Install' %>
|
14
|
+
</p>
|
15
|
+
<% end %>
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1,285 @@
|
|
1
|
+
body {
|
2
|
+
margin: 0;
|
3
|
+
font: 0.8em/1.3em "Lucida Grande", Arial, Arial, sans-serif;
|
4
|
+
background: #ededed;
|
5
|
+
}
|
6
|
+
|
7
|
+
h1 { font-weight: normal; font-size: 24px; }
|
8
|
+
h1 a { color: #FFFAD5; text-decoration: none; }
|
9
|
+
h2 { font-weight: normal; margin-top: 24px; }
|
10
|
+
h3 { margin-top: 24px; }
|
11
|
+
|
12
|
+
#header {
|
13
|
+
background: #2d3337 url('../images/shopify-logo.png') 20px 50% no-repeat;
|
14
|
+
padding: 25px 25px 25px 70px;
|
15
|
+
border-top: 5px solid #1f2326;
|
16
|
+
border-bottom: 1px solid #252a2e;
|
17
|
+
}
|
18
|
+
|
19
|
+
#header h1 { color: #fffad5; }
|
20
|
+
|
21
|
+
#login-link {
|
22
|
+
float: right;
|
23
|
+
position: relative;
|
24
|
+
bottom: 43px;
|
25
|
+
right: 15px;
|
26
|
+
color: #ededed;
|
27
|
+
}
|
28
|
+
|
29
|
+
#login-link a { color: #ebff7c; }
|
30
|
+
#login-link a:hover { text-decoration: underline; }
|
31
|
+
#login-link a.shop_name { color: inherit; text-decoration: none; }
|
32
|
+
#login-link a.shop_name:hover { text-decoration: underline; }
|
33
|
+
|
34
|
+
#container {
|
35
|
+
width: 90%;
|
36
|
+
min-width: 800px;
|
37
|
+
margin: 40px auto;
|
38
|
+
background: #fff;
|
39
|
+
border-right: 1px solid #e5e5e5;
|
40
|
+
border-bottom: 1px solid #e5e5e5;
|
41
|
+
}
|
42
|
+
|
43
|
+
#container h1 { margin: 18px 0 27px 0; }
|
44
|
+
|
45
|
+
#main { padding: 18px; }
|
46
|
+
|
47
|
+
#tabs {
|
48
|
+
margin: 0;
|
49
|
+
padding: 0;
|
50
|
+
height: 20px;
|
51
|
+
position: absolute;
|
52
|
+
top: 123px;
|
53
|
+
}
|
54
|
+
|
55
|
+
#tabs li {
|
56
|
+
margin: 0;
|
57
|
+
padding: 0;
|
58
|
+
display: inline;
|
59
|
+
list-style-type: none;
|
60
|
+
}
|
61
|
+
|
62
|
+
#tabs a:link, #tabs a:visited {
|
63
|
+
float: left;
|
64
|
+
padding: 3px 8px ;
|
65
|
+
margin: 0 10px 4px 0px;
|
66
|
+
text-decoration: none;
|
67
|
+
color: #888;
|
68
|
+
background: #ddd;
|
69
|
+
}
|
70
|
+
|
71
|
+
#tabs a:link#current, #tabs a:visited#current, #tabs a:hover { color: #000 !important; }
|
72
|
+
#tabs a:link#current, #tabs a:visited#current { font-weight: bold; background: #fff; }
|
73
|
+
|
74
|
+
a { color: #22658b; }
|
75
|
+
a:hover { color: #359cd7; }
|
76
|
+
|
77
|
+
dl { margin: 10px 15px; }
|
78
|
+
dt { margin: 10px 0; }
|
79
|
+
dd { margin: 5px 0 15px 0; }
|
80
|
+
dl input { margin: 0 !important; }
|
81
|
+
|
82
|
+
code { font-size: 140%; }
|
83
|
+
|
84
|
+
/* UTILITY CLASSES */
|
85
|
+
|
86
|
+
.clearfix:after {
|
87
|
+
content: ".";
|
88
|
+
display: block;
|
89
|
+
height: 0;
|
90
|
+
clear: both;
|
91
|
+
visibility: hidden;
|
92
|
+
}
|
93
|
+
|
94
|
+
.clearfix {display: inline-table;}
|
95
|
+
|
96
|
+
/* Hides from IE-mac \*/
|
97
|
+
* html .clearfix {height: 1%;}
|
98
|
+
.clearfix {display: block;}
|
99
|
+
/* End hide from IE-mac */
|
100
|
+
|
101
|
+
.ta-left { text-align: left; }
|
102
|
+
.ta-right { text-align: right; }
|
103
|
+
.ta-center { text-align: center; }
|
104
|
+
.pl { padding-left: 10px !important; }
|
105
|
+
.note { color: #777; font-size: 85%; }
|
106
|
+
.highlight { background: #ffc; }
|
107
|
+
|
108
|
+
/*
|
109
|
+
* LOGIN / WELCOME
|
110
|
+
*/
|
111
|
+
|
112
|
+
#left, #right {
|
113
|
+
width: 40%;
|
114
|
+
float: left;
|
115
|
+
margin: 0 2% 30px 2%;
|
116
|
+
}
|
117
|
+
|
118
|
+
#left { min-width: 390px; }
|
119
|
+
|
120
|
+
#logout { float: right; margin: 10px; }
|
121
|
+
#logout a { color: #330; }
|
122
|
+
|
123
|
+
/*
|
124
|
+
* DASHBOARD
|
125
|
+
*/
|
126
|
+
|
127
|
+
.order, .product { width: 55%; }
|
128
|
+
.product { margin: 10px; }
|
129
|
+
|
130
|
+
.product img {
|
131
|
+
margin: 0 10px 0 0;
|
132
|
+
float: left;
|
133
|
+
}
|
134
|
+
|
135
|
+
.product h4 {
|
136
|
+
margin: 0 0 12px 0;
|
137
|
+
font-size: 14px;
|
138
|
+
}
|
139
|
+
|
140
|
+
.price {
|
141
|
+
color: #666;
|
142
|
+
font-size: 15px;
|
143
|
+
font-family: Times, "Times New Roman";
|
144
|
+
font-style: italic;
|
145
|
+
}
|
146
|
+
|
147
|
+
#orders ul {
|
148
|
+
list-style-type: none;
|
149
|
+
padding: 0 0 0 7px;
|
150
|
+
}
|
151
|
+
|
152
|
+
#orders li { padding: 3px; }
|
153
|
+
|
154
|
+
#sidebar {
|
155
|
+
float: right;
|
156
|
+
width: 280px;
|
157
|
+
background: #f5fbfe;
|
158
|
+
border-left: 1px solid #D7E4EA;
|
159
|
+
color: #003366;
|
160
|
+
padding: 0 20px 20px 20px;
|
161
|
+
margin-bottom: 18px;
|
162
|
+
}
|
163
|
+
|
164
|
+
#sidebar ul {
|
165
|
+
padding-left: 20px;
|
166
|
+
list-style-type: square;
|
167
|
+
}
|
168
|
+
|
169
|
+
#sidebar li { margin: 8px 0; }
|
170
|
+
|
171
|
+
/* STYLE OVERVIEW */
|
172
|
+
|
173
|
+
#style-table { margin: 20px 0; }
|
174
|
+
#style-table td * { margin: 0; }
|
175
|
+
#style-table td { padding: 10px; border-bottom: 1px dotted #e5e5e5; }
|
176
|
+
#style-table td:first-child {
|
177
|
+
background:#Fefefe url('../images/box-bg2.gif') repeat-x scroll left bottom;
|
178
|
+
}
|
179
|
+
/* Flash */
|
180
|
+
|
181
|
+
#flasherrors, #flashnotices {
|
182
|
+
background: #faf7ea;
|
183
|
+
border-bottom: 1px solid #e8e6d9;
|
184
|
+
padding: 10px;
|
185
|
+
font-weight: bold;
|
186
|
+
text-align:center;
|
187
|
+
}
|
188
|
+
|
189
|
+
#flasherrors { color: #6e290b; }
|
190
|
+
#flashnotices { color: #549d19; }
|
191
|
+
|
192
|
+
/* CLASSES */
|
193
|
+
|
194
|
+
.description {
|
195
|
+
margin: 0px 0px 0px 4px;
|
196
|
+
font-weight: normal;
|
197
|
+
}
|
198
|
+
|
199
|
+
.box {
|
200
|
+
padding: 0;
|
201
|
+
background:#FAFAFA url('../images/box-bg2.gif') repeat-x scroll left top;
|
202
|
+
border:1px solid #CCCCCC;
|
203
|
+
}
|
204
|
+
|
205
|
+
.wrapper {
|
206
|
+
border:1px solid #FFFFFF;
|
207
|
+
padding: 10px;
|
208
|
+
}
|
209
|
+
|
210
|
+
.info {
|
211
|
+
padding: 0;
|
212
|
+
margin: 8px auto;
|
213
|
+
background: #009ad6 url('../images/info-bg.gif') top left repeat-x;
|
214
|
+
border: 1px solid #61abda;
|
215
|
+
font: 1.2em/1.7em "Comic Sans MS";
|
216
|
+
color: #fff;
|
217
|
+
height: 85px;
|
218
|
+
}
|
219
|
+
|
220
|
+
.info code {
|
221
|
+
font-size: 14px;
|
222
|
+
background: none;
|
223
|
+
}
|
224
|
+
|
225
|
+
.info a { color: #fff; }
|
226
|
+
.info a:hover { color: #dcfaff; }
|
227
|
+
|
228
|
+
.grey {
|
229
|
+
background: #eee;
|
230
|
+
border: 1px solid #ccc;
|
231
|
+
}
|
232
|
+
|
233
|
+
.green, .orange, .blue { padding: 10px; }
|
234
|
+
h1.green, h2.green, h3.green, h1.orange, h2.orange, h3.orange, h1.blue, h2.blue, h3.blue { padding: 0; }
|
235
|
+
|
236
|
+
.green {
|
237
|
+
background: #61b41e;
|
238
|
+
border: 1px solid #60b31d;
|
239
|
+
color: #ddecd0;
|
240
|
+
}
|
241
|
+
|
242
|
+
h1.green, h2.green, h3.green {
|
243
|
+
color: #6ece21;
|
244
|
+
background: none;
|
245
|
+
border: none;
|
246
|
+
}
|
247
|
+
|
248
|
+
.orange {
|
249
|
+
background: #ce6e21;
|
250
|
+
border: 1px solid #bc641e;
|
251
|
+
color: #fce0ca;
|
252
|
+
padding: 10px;
|
253
|
+
}
|
254
|
+
|
255
|
+
h1.orange, h2.orange, h3.orange {
|
256
|
+
color: #ce6e21;
|
257
|
+
background: none;
|
258
|
+
border: none;
|
259
|
+
}
|
260
|
+
|
261
|
+
.blue {
|
262
|
+
background: #218bce;
|
263
|
+
border: 1px solid #1e80be;
|
264
|
+
color: #d9ecf8;
|
265
|
+
padding: 10px;
|
266
|
+
}
|
267
|
+
|
268
|
+
h1.blue, h2.blue, h3.blue {
|
269
|
+
color: #218bce;
|
270
|
+
background: none;
|
271
|
+
border: none;
|
272
|
+
}
|
273
|
+
|
274
|
+
.light {
|
275
|
+
background: #faf7ea;
|
276
|
+
border: 1px solid #e8e6d9;
|
277
|
+
padding: 18px;
|
278
|
+
}
|
279
|
+
|
280
|
+
.dark {
|
281
|
+
background: #333;
|
282
|
+
border: 1px solid #000;
|
283
|
+
color: #fff;
|
284
|
+
padding: 10px;
|
285
|
+
}
|
data/lib/shopify_app.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'shopify_api'
|
2
|
+
|
3
|
+
module ShopifyApp
|
4
|
+
|
5
|
+
def self.configuration
|
6
|
+
@configuration ||= ShopifyApp::Configuration.new
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.setup_session
|
10
|
+
ShopifyAPI::Session.setup(:api_key => ShopifyApp.configuration.api_key, :secret => ShopifyApp.configuration.secret)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
require 'shopify_app/login_protection'
|
15
|
+
require 'shopify_app/configuration'
|
16
|
+
require 'shopify_app/railtie'
|
17
|
+
require 'shopify_app/version'
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module ShopifyApp::LoginProtection
|
2
|
+
|
3
|
+
def shopify_session
|
4
|
+
if session[:shopify]
|
5
|
+
begin
|
6
|
+
# session[:shopify] set in LoginController#finalize
|
7
|
+
ShopifyAPI::Base.site = session[:shopify].site
|
8
|
+
yield
|
9
|
+
ensure
|
10
|
+
ShopifyAPI::Base.site = nil
|
11
|
+
end
|
12
|
+
else
|
13
|
+
session[:return_to] = request.fullpath
|
14
|
+
redirect_to :controller => 'login'
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def current_shop
|
19
|
+
session[:shopify]
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'rails'
|
2
|
+
|
3
|
+
class ShopifyApp::Railtie < ::Rails::Railtie
|
4
|
+
|
5
|
+
config.before_configuration do
|
6
|
+
config.shopify = ShopifyApp.configuration
|
7
|
+
end
|
8
|
+
|
9
|
+
initializer "shopify_app.action_controller_integration" do
|
10
|
+
ActionController::Base.send :include, ShopifyApp::LoginProtection
|
11
|
+
ActionController::Base.send :helper_method, :current_shop
|
12
|
+
end
|
13
|
+
|
14
|
+
initializer "shopify_app.setup_session" do
|
15
|
+
ShopifyApp.setup_session
|
16
|
+
end
|
17
|
+
end
|
data/shopify_app.gemspec
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "shopify_app/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "shopify_app"
|
7
|
+
s.version = ShopifyApp::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.author = "Shopify"
|
10
|
+
s.email = ["edward@shopify.com", "jonathan@shopify.com", "willem@shopify.com"]
|
11
|
+
s.homepage = "http://www.shopify.com/developers"
|
12
|
+
s.summary = %q{This gem is used to get quickly started with the Shopify API}
|
13
|
+
s.description = %q{Creates a basic login controller for authenticating with your Shop and also a product controller which lets your edit your products easily.}
|
14
|
+
|
15
|
+
s.rubyforge_project = "shopify-api"
|
16
|
+
|
17
|
+
s.add_runtime_dependency('rails', '~> 3')
|
18
|
+
s.add_runtime_dependency('shopify_api')
|
19
|
+
|
20
|
+
s.add_development_dependency('rake')
|
21
|
+
|
22
|
+
s.files = `git ls-files`.split("\n")
|
23
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
24
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
25
|
+
s.require_paths = ["lib"]
|
26
|
+
end
|
metadata
ADDED
@@ -0,0 +1,134 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: shopify_app
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 1
|
8
|
+
- 0
|
9
|
+
version: 0.1.0
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Shopify
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2011-02-26 00:00:00 -05:00
|
18
|
+
default_executable:
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: rails
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
25
|
+
requirements:
|
26
|
+
- - ~>
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
segments:
|
29
|
+
- 3
|
30
|
+
version: "3"
|
31
|
+
type: :runtime
|
32
|
+
version_requirements: *id001
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: shopify_api
|
35
|
+
prerelease: false
|
36
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
37
|
+
none: false
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
segments:
|
42
|
+
- 0
|
43
|
+
version: "0"
|
44
|
+
type: :runtime
|
45
|
+
version_requirements: *id002
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: rake
|
48
|
+
prerelease: false
|
49
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
segments:
|
55
|
+
- 0
|
56
|
+
version: "0"
|
57
|
+
type: :development
|
58
|
+
version_requirements: *id003
|
59
|
+
description: Creates a basic login controller for authenticating with your Shop and also a product controller which lets your edit your products easily.
|
60
|
+
email:
|
61
|
+
- edward@shopify.com
|
62
|
+
- jonathan@shopify.com
|
63
|
+
- willem@shopify.com
|
64
|
+
executables: []
|
65
|
+
|
66
|
+
extensions: []
|
67
|
+
|
68
|
+
extra_rdoc_files: []
|
69
|
+
|
70
|
+
files:
|
71
|
+
- .gitignore
|
72
|
+
- CHANGELOG
|
73
|
+
- Gemfile
|
74
|
+
- README.rdoc
|
75
|
+
- Rakefile
|
76
|
+
- install.rb
|
77
|
+
- lib/generators/shopify_app/README
|
78
|
+
- lib/generators/shopify_app/USAGE
|
79
|
+
- lib/generators/shopify_app/shopify_app_generator.rb
|
80
|
+
- lib/generators/shopify_app/templates/app/controllers/home_controller.rb
|
81
|
+
- lib/generators/shopify_app/templates/app/controllers/login_controller.rb
|
82
|
+
- lib/generators/shopify_app/templates/app/helpers/home_helper.rb
|
83
|
+
- lib/generators/shopify_app/templates/app/helpers/login_helper.rb
|
84
|
+
- lib/generators/shopify_app/templates/app/helpers/tabs_helper.rb
|
85
|
+
- lib/generators/shopify_app/templates/app/views/home/design.html.erb
|
86
|
+
- lib/generators/shopify_app/templates/app/views/home/index.html.erb
|
87
|
+
- lib/generators/shopify_app/templates/app/views/home/welcome.html.erb
|
88
|
+
- lib/generators/shopify_app/templates/app/views/layouts/application.html.erb
|
89
|
+
- lib/generators/shopify_app/templates/app/views/login/index.html.erb
|
90
|
+
- lib/generators/shopify_app/templates/public/images/box-bg2.gif
|
91
|
+
- lib/generators/shopify_app/templates/public/images/info-bg.gif
|
92
|
+
- lib/generators/shopify_app/templates/public/images/info.gif
|
93
|
+
- lib/generators/shopify_app/templates/public/images/shopify-logo.png
|
94
|
+
- lib/generators/shopify_app/templates/public/stylesheets/application.css
|
95
|
+
- lib/shopify_app.rb
|
96
|
+
- lib/shopify_app/configuration.rb
|
97
|
+
- lib/shopify_app/login_protection.rb
|
98
|
+
- lib/shopify_app/railtie.rb
|
99
|
+
- lib/shopify_app/version.rb
|
100
|
+
- shopify_app.gemspec
|
101
|
+
has_rdoc: true
|
102
|
+
homepage: http://www.shopify.com/developers
|
103
|
+
licenses: []
|
104
|
+
|
105
|
+
post_install_message:
|
106
|
+
rdoc_options: []
|
107
|
+
|
108
|
+
require_paths:
|
109
|
+
- lib
|
110
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
111
|
+
none: false
|
112
|
+
requirements:
|
113
|
+
- - ">="
|
114
|
+
- !ruby/object:Gem::Version
|
115
|
+
segments:
|
116
|
+
- 0
|
117
|
+
version: "0"
|
118
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
119
|
+
none: false
|
120
|
+
requirements:
|
121
|
+
- - ">="
|
122
|
+
- !ruby/object:Gem::Version
|
123
|
+
segments:
|
124
|
+
- 0
|
125
|
+
version: "0"
|
126
|
+
requirements: []
|
127
|
+
|
128
|
+
rubyforge_project: shopify-api
|
129
|
+
rubygems_version: 1.3.7
|
130
|
+
signing_key:
|
131
|
+
specification_version: 3
|
132
|
+
summary: This gem is used to get quickly started with the Shopify API
|
133
|
+
test_files: []
|
134
|
+
|