shopify-sinatra-app 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +41 -17
- data/bin/shopify-sinatra-app-generator +14 -14
- data/lib/generator/lib/app.rb +33 -18
- data/lib/generator/views/_top_bar.erb +1 -1
- data/lib/generator/views/home.erb +1 -1
- data/lib/sinatra/shopify-sinatra-app.rb +7 -13
- data/shopify-sinatra-app.gemspec +1 -1
- metadata +34 -35
- data/lib/generator/config/app.yml +0 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f14854ae0081a9b642032ba7eaa40ae85a5b22e0
|
4
|
+
data.tar.gz: c8157d64a372e0b1ad339898a920312beee32b4a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 50a4cd567b685d6a09eba34a43f014b535ab7f6b6ffb9c26eebc34dd7989f7b74494a894253b445426452711c031dc21a9b045a26a832fddba24b34578a5b0a9
|
7
|
+
data.tar.gz: 789e5772cdb0dc839c5b9d53da1fe912fba53e78e9dee35bde4719490a1aaca8da44c4c7083d739d9f2d28df34e2410019739e2c8a3d60a7ea70c5f121a87cfa
|
data/README.md
CHANGED
@@ -28,11 +28,6 @@ shopify-sinatra-app-generator new <your new app name>
|
|
28
28
|
|
29
29
|
This will create a new skeleton shopify-sinatra-app. The generator will create several default files for you rather than having them bundled in the sinatra extension - its worthwhile to read this section to understand what each of these files is for.
|
30
30
|
|
31
|
-
`config/app.yml` --> Some important config information is contained in this file.
|
32
|
-
* scope: The scope of your app (what your app can access from the Shopify store once installed, e.g. read_products), this will be read by your app and used when your app is installed.
|
33
|
-
|
34
|
-
* uninstall_webhook: Initially an uninstall webhook is also defined in this file, although without a proper url, this file is a good place to define objects that need to be created on Shopify when your app is installed like webhooks, fulfillment and carrier services.
|
35
|
-
|
36
31
|
`config/database.yml` --> The database config for active record. Initially this is setup to use sqlite3 for development and testing which you may want to change to mimic your production database.
|
37
32
|
|
38
33
|
`.env` --> a hidden file not tracked by source control for storing credentials etc. to be set as environment variables
|
@@ -62,8 +57,6 @@ You'll need to create a Shopify Partner Account and a new application. You can m
|
|
62
57
|
|
63
58
|
Note - The shopify-sinatra-app creates an embedded app! You need change the embedded setting to enabled in the [Shopify Partner area](https://app.shopify.com/services/partners/api_clients) for your app. If you don't want your app to be embedded then remove the related code in `layout/application.erb` and delete the `layout/_top_bar.erb` file and the references to it in the other views.
|
64
59
|
|
65
|
-
Also note that when developing locally you'll need to enable unsafe javascripts in your browser for the embedded sdk to function. Read more [here](http://docs.shopify.com/embedded-app-sdk/getting-started)
|
66
|
-
|
67
60
|
After creating your new application you need to edit the `.env` file and add the following lines:
|
68
61
|
|
69
62
|
```
|
@@ -76,28 +69,28 @@ SECRET=<generate a random string to encrypt credentials with>
|
|
76
69
|
Shopify::Methods
|
77
70
|
----------------
|
78
71
|
|
79
|
-
`shopify_session` - The main method of the framework, most of your routes will use this method to acquire a valid shopify session and then perform api calls to Shopfiy. The method
|
72
|
+
`shopify_session` - The main method of the framework, most of your routes will use this method to acquire a valid shopify session and then perform api calls to Shopfiy. The method activates a Shopify API session for you and accepts a block inside of which you can use the ShopifyAPI. Here is an example endpoint that displays products:
|
80
73
|
|
81
74
|
```ruby
|
82
75
|
get '/products.json' do
|
83
|
-
shopify_session do
|
76
|
+
shopify_session do
|
84
77
|
products = ShopifyAPI::Product.all(limit: 5)
|
85
78
|
products.to_json
|
86
79
|
end
|
87
80
|
end
|
88
81
|
```
|
89
82
|
|
90
|
-
`webhook_session` - This method is for an endpoint that recieves a webhook from Shopify. Webhooks are a great way to keep your app in sync with a shop's data without polling. You can read more about webhooks [here](http://docs.shopify.com/api/tutorials/using-webhooks). This method also takes a block of code and makes the
|
83
|
+
`webhook_session` - This method is for an endpoint that recieves a webhook from Shopify. Webhooks are a great way to keep your app in sync with a shop's data without polling. You can read more about webhooks [here](http://docs.shopify.com/api/tutorials/using-webhooks). This method also takes a block of code and makes the webhook data available as a hash (note only works for json webhooks, don't use xml). Here is an example that listens to a order creation webhook:
|
91
84
|
|
92
85
|
```ruby
|
93
86
|
post '/order.json' do
|
94
|
-
webhook_session do |
|
87
|
+
webhook_session do |webhook_data|
|
95
88
|
# do something with the data
|
96
89
|
end
|
97
90
|
end
|
98
91
|
```
|
99
92
|
|
100
|
-
`webhook_job` - Its impossible to control the flow of webhooks to your app from Shopify especially if a larger store installs your app or if a shop has a flash sale. To prevent your app from getting overloaded with webhook requests it is usually a good idea to process webhooks in a background queue and return a 200 to Shopify immediately. This method provides this functionality using redis and resque. This method takes the name of a job class whose perform method expects a `shop_name` and the webhook data as a hash. The session method is useful for prototpying and experimenting but production apps should use `webhook_job`. Here is an example:
|
93
|
+
`webhook_job` - Its impossible to control the flow of webhooks to your app from Shopify especially if a larger store installs your app or if a shop has a flash sale. To prevent your app from getting overloaded with webhook requests it is usually a good idea to process webhooks in a background queue and return a 200 to Shopify immediately. This method provides this functionality using redis and resque. This method takes the name of a job class whose perform method expects a `shop_name`, `shop_token` and the webhook data as a hash. The session method is useful for prototpying and experimenting but production apps should use `webhook_job`. Here is an example:
|
101
94
|
|
102
95
|
```ruby
|
103
96
|
post '/order.json' do
|
@@ -107,7 +100,7 @@ end
|
|
107
100
|
class OrderWebhookJob
|
108
101
|
@queue = :default
|
109
102
|
|
110
|
-
def self.perform(shop_name,
|
103
|
+
def self.perform(shop_name, shop_token, webhook_data)
|
111
104
|
# do something with the data
|
112
105
|
end
|
113
106
|
end
|
@@ -115,14 +108,45 @@ end
|
|
115
108
|
|
116
109
|
`install` - This is a private method provided with the framework that gets called when the app is authorized for the first time. You should fill this method in with anything you need to initialize on install, for example webhooks and services on shopify or any other database models you have created specific to a shop.
|
117
110
|
|
118
|
-
`uninstall` - This method gets called when your app recieves an uninstall webhook from shopify. You should override this method in your class and do any appropriate clean up when the app is removed from a shop.
|
119
|
-
|
120
111
|
`logout` - This method clears the current session data in the app
|
121
112
|
|
122
|
-
`current_shop` - Returns the name of the current shop
|
113
|
+
`current_shop` - Returns the name of the current shop (format: example.myshopify.com)
|
123
114
|
|
124
115
|
`base_url` - This returns the url of the app
|
125
116
|
|
117
|
+
shopify-sinatra-app also includes `rack-flash3` and the flash messages are forwarded to the Shopify Embedded App SDK. Flash messages are useful for signalling to your users that a request was successful without changing the page. The following is an example of how to use a flash message in a route:
|
118
|
+
|
119
|
+
```
|
120
|
+
post '/flash_message' do
|
121
|
+
flash[:notice] = "Flash Message!"
|
122
|
+
redirect '/'
|
123
|
+
end
|
124
|
+
```
|
125
|
+
|
126
|
+
note - a flash must be followed by a redirect or it won't work!
|
127
|
+
|
128
|
+
Developing
|
129
|
+
----------
|
130
|
+
To run the app locally we use `foreman` which comes with the [Heroku Toolbelt](https://devcenter.heroku.com/articles/quickstart). Foreman handles running our application and setting our credentials as environment variables. To run the application type:
|
131
|
+
|
132
|
+
```
|
133
|
+
foreman start -p 4567
|
134
|
+
```
|
135
|
+
|
136
|
+
Debugging ...
|
137
|
+
|
138
|
+
You can set the application url in the [Shopify Partner area](https://app.shopify.com/services/partners/api_clients) to be `http://localhost:4567/` which will allow you to install your app on a live shop while running it locally.
|
139
|
+
|
140
|
+
While running the app locally you'll be able to test the install and other routes because your browser is aware of your local application but if you want to test a route that listens to a webhook this will not work because Shopify cannot talk to your local web application. You could expose your local application to the web but an easier solution is to use a tool called [Ngrok](https://ngrok.com/). Download Ngrok and run it on port 4567 (or whichever port you are using):
|
141
|
+
|
142
|
+
```
|
143
|
+
./ngrok 4567
|
144
|
+
```
|
145
|
+
|
146
|
+
Ngrok will report what address your app is available at, leave Ngrok running and then create your webhook to point to the ngrok url plus your route e.g. `<ngrok url>/webhook_test.json`. Now trigger the webhook you are testing and it will get forwarded through ngrok to your local web application allowing you to use debuggers and repls to complete your code.
|
147
|
+
|
148
|
+
When developing locally you'll need to enable unsafe javascripts in your browser for the Embedded App SDK to function. Read more [here](http://docs.shopify.com/embedded-app-sdk/getting-started).
|
149
|
+
|
126
150
|
|
127
151
|
Deploying
|
128
152
|
---------
|
@@ -178,7 +202,7 @@ heroku scale web=1 resque=1
|
|
178
202
|
|
179
203
|
Note - if you are not using any background queue for processing webhooks then you do not need the redis add-on or the resque dyno so you can set it to 0.
|
180
204
|
|
181
|
-
Make sure you set your shopify apps url to your Heroku app url in the Shopify Partner area https://app.shopify.com/services/partners/api_clients.
|
205
|
+
Make sure you set your shopify apps url to your Heroku app url (and make sure to use the `https` version or else the Embedded App SDK won't work) in the Shopify Partner area https://app.shopify.com/services/partners/api_clients.
|
182
206
|
|
183
207
|
Contributing
|
184
208
|
------------
|
@@ -18,20 +18,20 @@ else
|
|
18
18
|
begin
|
19
19
|
Dir.mkdir(app_dir)
|
20
20
|
|
21
|
-
FileUtils.cp_r(generator_dir + "/config",
|
22
|
-
FileUtils.cp_r(generator_dir + "/db",
|
23
|
-
FileUtils.cp_r(generator_dir + "/lib",
|
24
|
-
FileUtils.cp_r(generator_dir + "/public",
|
25
|
-
FileUtils.cp_r(generator_dir + "/views",
|
26
|
-
|
27
|
-
FileUtils.cp(generator_dir + "/.gitignore",
|
28
|
-
FileUtils.cp(generator_dir + "/config.ru",
|
29
|
-
FileUtils.cp(generator_dir + "/Procfile",
|
30
|
-
FileUtils.cp(generator_dir + "/Rakefile",
|
31
|
-
FileUtils.cp(generator_dir + "/Gemfile",
|
32
|
-
FileUtils.cp(generator_dir + "/README.md",
|
33
|
-
|
34
|
-
FileUtils.touch "
|
21
|
+
FileUtils.cp_r(generator_dir + "/config", app_dir + "/config")
|
22
|
+
FileUtils.cp_r(generator_dir + "/db", app_dir + "/db")
|
23
|
+
FileUtils.cp_r(generator_dir + "/lib", app_dir + "/lib")
|
24
|
+
FileUtils.cp_r(generator_dir + "/public", app_dir + "/public")
|
25
|
+
FileUtils.cp_r(generator_dir + "/views", app_dir + "/views")
|
26
|
+
|
27
|
+
FileUtils.cp(generator_dir + "/.gitignore", app_dir + "/.gitignore")
|
28
|
+
FileUtils.cp(generator_dir + "/config.ru", app_dir + "/config.ru")
|
29
|
+
FileUtils.cp(generator_dir + "/Procfile", app_dir + "/Procfile")
|
30
|
+
FileUtils.cp(generator_dir + "/Rakefile", app_dir + "/Rakefile")
|
31
|
+
FileUtils.cp(generator_dir + "/Gemfile", app_dir + "/Gemfile")
|
32
|
+
FileUtils.cp(generator_dir + "/README.md", app_dir + "/README.md")
|
33
|
+
|
34
|
+
FileUtils.touch(app_dir + "/.env")
|
35
35
|
|
36
36
|
Dir.chdir(app_dir)
|
37
37
|
|
data/lib/generator/lib/app.rb
CHANGED
@@ -3,36 +3,51 @@ require 'sinatra/shopify-sinatra-app'
|
|
3
3
|
class SinatraApp < Sinatra::Base
|
4
4
|
register Sinatra::Shopify
|
5
5
|
|
6
|
+
# set the scope that your app needs, read more here:
|
7
|
+
# http://docs.shopify.com/api/tutorials/oauth
|
8
|
+
set :scope, 'read_products, read_orders'
|
9
|
+
|
10
|
+
# Your App's Home page
|
11
|
+
# this is a simple example that fetches some products
|
12
|
+
# from Shopify and displays them inside your app
|
6
13
|
get '/' do
|
7
|
-
|
8
|
-
|
9
|
-
@shop_name = shop_name
|
10
|
-
@products = ShopifyAPI::Product.all(limit: 5)
|
14
|
+
shopify_session do
|
15
|
+
@products = ShopifyAPI::Product.all
|
11
16
|
erb :home
|
12
17
|
end
|
13
18
|
end
|
14
19
|
|
20
|
+
# this endpoint recieves the uninstall webhook
|
21
|
+
# and cleans up data, add to this endpoint as your app
|
22
|
+
# stores more data.
|
23
|
+
post '/uninstall' do
|
24
|
+
webhook_session do |params|
|
25
|
+
shop.destroy
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
15
29
|
private
|
16
30
|
|
31
|
+
# This method gets called when your app is installed.
|
32
|
+
# setup any webhooks or services you need on Shopify
|
33
|
+
# inside here.
|
17
34
|
def install
|
18
|
-
|
19
|
-
shopify_session do |shop_name|
|
35
|
+
shopify_session do
|
20
36
|
params = YAML.load(File.read("config/app.yml"))
|
21
37
|
|
22
|
-
# create
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
38
|
+
# create an uninstall webhook, this webhook gets sent
|
39
|
+
# when your app is uninstalled from a shop. It is good
|
40
|
+
# practice to clean up any data from a shop when they
|
41
|
+
# uninstall your app.
|
42
|
+
uninstall_webhook = ShopifyAPI::Webhook.new({
|
43
|
+
topic: "app/uninstalled",
|
44
|
+
address: "#{base_url}/uninstall",
|
45
|
+
format: "json"
|
46
|
+
})
|
47
|
+
uninstall_webhook.save
|
27
48
|
end
|
28
|
-
redirect '/'
|
29
|
-
end
|
30
49
|
|
31
|
-
|
32
|
-
# remove data for a shop when they uninstall your app
|
33
|
-
webhook_session do |shop, params|
|
34
|
-
shop.destroy
|
35
|
-
end
|
50
|
+
redirect '/'
|
36
51
|
end
|
37
52
|
|
38
53
|
end
|
@@ -9,7 +9,7 @@
|
|
9
9
|
<% @products.each do |product| %>
|
10
10
|
<tr>
|
11
11
|
<td>
|
12
|
-
<a href=<%="https://#{
|
12
|
+
<a href=<%="https://#{current_shop}/admin/products/#{product.id}"%> target="_blank"> <%= product.id %> </a>
|
13
13
|
</td>
|
14
14
|
</tr>
|
15
15
|
<% end %>
|
@@ -19,10 +19,6 @@ module Sinatra
|
|
19
19
|
raise NotImplementedError
|
20
20
|
end
|
21
21
|
|
22
|
-
def uninstall
|
23
|
-
raise NotImplementedError
|
24
|
-
end
|
25
|
-
|
26
22
|
def logout
|
27
23
|
session[:shopify] = nil
|
28
24
|
end
|
@@ -52,7 +48,7 @@ module Sinatra
|
|
52
48
|
api_session = ShopifyAPI::Session.new(shop_name, token)
|
53
49
|
ShopifyAPI::Base.activate_session(api_session)
|
54
50
|
|
55
|
-
yield
|
51
|
+
yield
|
56
52
|
end
|
57
53
|
end
|
58
54
|
|
@@ -67,7 +63,7 @@ module Sinatra
|
|
67
63
|
api_session = ShopifyAPI::Session.new(shop_name, shop.token)
|
68
64
|
ShopifyAPI::Base.activate_session(api_session)
|
69
65
|
|
70
|
-
yield
|
66
|
+
yield params
|
71
67
|
|
72
68
|
status 200
|
73
69
|
end
|
@@ -77,9 +73,11 @@ module Sinatra
|
|
77
73
|
return unless verify_shopify_webhook
|
78
74
|
|
79
75
|
shop_name = request.env['HTTP_X_SHOPIFY_SHOP_DOMAIN']
|
76
|
+
shop = Shop.find_by(:name => shop_name)
|
77
|
+
|
80
78
|
params = ActiveSupport::JSON.decode(request.body.read.to_s)
|
81
79
|
|
82
|
-
Resque.enqueue(jobKlass,
|
80
|
+
Resque.enqueue(jobKlass, shop.name, shop.token, params)
|
83
81
|
|
84
82
|
status 200
|
85
83
|
end
|
@@ -154,7 +152,8 @@ module Sinatra
|
|
154
152
|
app.enable :sessions
|
155
153
|
app.enable :inline_templates
|
156
154
|
|
157
|
-
app
|
155
|
+
#override in app when required
|
156
|
+
app.set :scope, 'read_products, read_orders'
|
158
157
|
|
159
158
|
app.set :api_key, ENV['SHOPIFY_API_KEY']
|
160
159
|
app.set :shared_secret, ENV['SHOPIFY_SHARED_SECRET']
|
@@ -196,11 +195,6 @@ module Sinatra
|
|
196
195
|
erb :install, :layout => false
|
197
196
|
end
|
198
197
|
|
199
|
-
# endpoint for the app/uninstall webhook
|
200
|
-
app.post '/uninstall.json' do
|
201
|
-
uninstall
|
202
|
-
end
|
203
|
-
|
204
198
|
app.post '/login' do
|
205
199
|
authenticate
|
206
200
|
end
|
data/shopify-sinatra-app.gemspec
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: shopify-sinatra-app
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kevin Hughes
|
@@ -14,210 +14,210 @@ dependencies:
|
|
14
14
|
name: sinatra
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - '>='
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - '>='
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: sinatra-redis
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - '>='
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - '>='
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: sinatra-activerecord
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - '>='
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - '>='
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: sinatra-twitter-bootstrap
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - '>='
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '0'
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- -
|
66
|
+
- - '>='
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rack-flash3
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- -
|
73
|
+
- - '>='
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: '0'
|
76
76
|
type: :runtime
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- -
|
80
|
+
- - '>='
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: activesupport
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- -
|
87
|
+
- - '>='
|
88
88
|
- !ruby/object:Gem::Version
|
89
89
|
version: '0'
|
90
90
|
type: :runtime
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- -
|
94
|
+
- - '>='
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: attr_encrypted
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
|
-
- -
|
101
|
+
- - '>='
|
102
102
|
- !ruby/object:Gem::Version
|
103
103
|
version: '0'
|
104
104
|
type: :runtime
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
|
-
- -
|
108
|
+
- - '>='
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '0'
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
112
|
name: resque
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
114
114
|
requirements:
|
115
|
-
- -
|
115
|
+
- - ~>
|
116
116
|
- !ruby/object:Gem::Version
|
117
117
|
version: 1.22.0
|
118
118
|
type: :runtime
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
|
-
- -
|
122
|
+
- - ~>
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: 1.22.0
|
125
125
|
- !ruby/object:Gem::Dependency
|
126
126
|
name: shopify_api
|
127
127
|
requirement: !ruby/object:Gem::Requirement
|
128
128
|
requirements:
|
129
|
-
- -
|
129
|
+
- - '>='
|
130
130
|
- !ruby/object:Gem::Version
|
131
131
|
version: '0'
|
132
132
|
type: :runtime
|
133
133
|
prerelease: false
|
134
134
|
version_requirements: !ruby/object:Gem::Requirement
|
135
135
|
requirements:
|
136
|
-
- -
|
136
|
+
- - '>='
|
137
137
|
- !ruby/object:Gem::Version
|
138
138
|
version: '0'
|
139
139
|
- !ruby/object:Gem::Dependency
|
140
140
|
name: omniauth-shopify-oauth2
|
141
141
|
requirement: !ruby/object:Gem::Requirement
|
142
142
|
requirements:
|
143
|
-
- -
|
143
|
+
- - '>='
|
144
144
|
- !ruby/object:Gem::Version
|
145
145
|
version: '0'
|
146
146
|
type: :runtime
|
147
147
|
prerelease: false
|
148
148
|
version_requirements: !ruby/object:Gem::Requirement
|
149
149
|
requirements:
|
150
|
-
- -
|
150
|
+
- - '>='
|
151
151
|
- !ruby/object:Gem::Version
|
152
152
|
version: '0'
|
153
153
|
- !ruby/object:Gem::Dependency
|
154
154
|
name: rake
|
155
155
|
requirement: !ruby/object:Gem::Requirement
|
156
156
|
requirements:
|
157
|
-
- -
|
157
|
+
- - '>='
|
158
158
|
- !ruby/object:Gem::Version
|
159
159
|
version: '0'
|
160
160
|
type: :development
|
161
161
|
prerelease: false
|
162
162
|
version_requirements: !ruby/object:Gem::Requirement
|
163
163
|
requirements:
|
164
|
-
- -
|
164
|
+
- - '>='
|
165
165
|
- !ruby/object:Gem::Version
|
166
166
|
version: '0'
|
167
167
|
- !ruby/object:Gem::Dependency
|
168
168
|
name: sqlite3
|
169
169
|
requirement: !ruby/object:Gem::Requirement
|
170
170
|
requirements:
|
171
|
-
- -
|
171
|
+
- - '>='
|
172
172
|
- !ruby/object:Gem::Version
|
173
173
|
version: '0'
|
174
174
|
type: :development
|
175
175
|
prerelease: false
|
176
176
|
version_requirements: !ruby/object:Gem::Requirement
|
177
177
|
requirements:
|
178
|
-
- -
|
178
|
+
- - '>='
|
179
179
|
- !ruby/object:Gem::Version
|
180
180
|
version: '0'
|
181
181
|
- !ruby/object:Gem::Dependency
|
182
182
|
name: rack-test
|
183
183
|
requirement: !ruby/object:Gem::Requirement
|
184
184
|
requirements:
|
185
|
-
- -
|
185
|
+
- - '>='
|
186
186
|
- !ruby/object:Gem::Version
|
187
187
|
version: '0'
|
188
188
|
type: :development
|
189
189
|
prerelease: false
|
190
190
|
version_requirements: !ruby/object:Gem::Requirement
|
191
191
|
requirements:
|
192
|
-
- -
|
192
|
+
- - '>='
|
193
193
|
- !ruby/object:Gem::Version
|
194
194
|
version: '0'
|
195
195
|
- !ruby/object:Gem::Dependency
|
196
196
|
name: fakeweb
|
197
197
|
requirement: !ruby/object:Gem::Requirement
|
198
198
|
requirements:
|
199
|
-
- -
|
199
|
+
- - '>='
|
200
200
|
- !ruby/object:Gem::Version
|
201
201
|
version: '0'
|
202
202
|
type: :development
|
203
203
|
prerelease: false
|
204
204
|
version_requirements: !ruby/object:Gem::Requirement
|
205
205
|
requirements:
|
206
|
-
- -
|
206
|
+
- - '>='
|
207
207
|
- !ruby/object:Gem::Version
|
208
208
|
version: '0'
|
209
209
|
- !ruby/object:Gem::Dependency
|
210
210
|
name: mocha
|
211
211
|
requirement: !ruby/object:Gem::Requirement
|
212
212
|
requirements:
|
213
|
-
- -
|
213
|
+
- - '>='
|
214
214
|
- !ruby/object:Gem::Version
|
215
215
|
version: '0'
|
216
216
|
type: :development
|
217
217
|
prerelease: false
|
218
218
|
version_requirements: !ruby/object:Gem::Requirement
|
219
219
|
requirements:
|
220
|
-
- -
|
220
|
+
- - '>='
|
221
221
|
- !ruby/object:Gem::Version
|
222
222
|
version: '0'
|
223
223
|
description: A Sinatra extension for building Shopify Apps. Akin to the shopify_app
|
@@ -228,7 +228,7 @@ executables:
|
|
228
228
|
extensions: []
|
229
229
|
extra_rdoc_files: []
|
230
230
|
files:
|
231
|
-
-
|
231
|
+
- .gitignore
|
232
232
|
- Gemfile
|
233
233
|
- Gemfile.lock
|
234
234
|
- LICENSE
|
@@ -240,7 +240,6 @@ files:
|
|
240
240
|
- lib/generator/README.md
|
241
241
|
- lib/generator/Rakefile
|
242
242
|
- lib/generator/config.ru
|
243
|
-
- lib/generator/config/app.yml
|
244
243
|
- lib/generator/config/database.yml
|
245
244
|
- lib/generator/db/.keep
|
246
245
|
- lib/generator/db/migrate/20140413221328_create_shops.rb
|
@@ -263,12 +262,12 @@ require_paths:
|
|
263
262
|
- lib
|
264
263
|
required_ruby_version: !ruby/object:Gem::Requirement
|
265
264
|
requirements:
|
266
|
-
- -
|
265
|
+
- - '>='
|
267
266
|
- !ruby/object:Gem::Version
|
268
267
|
version: '0'
|
269
268
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
270
269
|
requirements:
|
271
|
-
- -
|
270
|
+
- - '>='
|
272
271
|
- !ruby/object:Gem::Version
|
273
272
|
version: '0'
|
274
273
|
requirements: []
|