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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d5258ae2ad69e41e73b1ac65c4486b50c18ed613
4
- data.tar.gz: f1353a6f9750ccecffc2fb8b5e648ca9d8a8fa7d
3
+ metadata.gz: f14854ae0081a9b642032ba7eaa40ae85a5b22e0
4
+ data.tar.gz: c8157d64a372e0b1ad339898a920312beee32b4a
5
5
  SHA512:
6
- metadata.gz: 0b04db231a6a155764b025ce9abccf65b9940bc1f770794b11f3dfe5bb28d0bd6ea65746e3419187c2b762fd79bf8a42f454d494342b5fd6c54e58c6f3c18358
7
- data.tar.gz: 702b19de25f03abedb4224ef3ee9fc043dee11a86e4c2b3790fcc2d755092a205c715cc0d1da4a0dd604c819ddf6d48b0aa8a06036095d8135b7831626ec36a0
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 simply takes a block of code and makes the shop_name available to you after activating an api session. Here is an example endpoint that displays products:
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 |shop_name|
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 shop and webhook data as a hash available (note only works for json webhooks, don't use xml). Here is an example that listens to a order creation webhook:
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 |shop, params|
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, params)
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", 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 ".env"
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
 
@@ -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
- # your app's Home page
8
- shopify_session do |shop_name|
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
- # setup any webhooks or services you need when your app is installed
19
- shopify_session do |shop_name|
35
+ shopify_session do
20
36
  params = YAML.load(File.read("config/app.yml"))
21
37
 
22
- # create the uninstall webhook
23
- uninstall_webhook = ShopifyAPI::Webhook.new(params["uninstall_webhook"])
24
- unless ShopifyAPI::Webhook.find(:all).include?(uninstall_webhook)
25
- uninstall_webhook.save
26
- end
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
- def uninstall
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
@@ -2,7 +2,7 @@
2
2
 
3
3
  ShopifyApp.ready(function(){
4
4
  ShopifyApp.Bar.initialize({
5
- icon: 'icon.png'
5
+ icon: '<%= "#{base_url}/icon.png" %>'
6
6
  });
7
7
 
8
8
  <% if flash[:notice] %>
@@ -9,7 +9,7 @@
9
9
  <% @products.each do |product| %>
10
10
  <tr>
11
11
  <td>
12
- <a href=<%="https://#{@shop_name}/admin/products/#{product.id}"%> target="_blank"> <%= product.id %> </a>
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 shop_name
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 shop, params
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, shop_name, params)
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.set :scope, YAML.load(File.read(File.expand_path("config/app.yml")))["scope"]
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
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'shopify-sinatra-app'
3
- s.version = '0.0.3'
3
+ s.version = '0.0.4'
4
4
 
5
5
  s.summary = "A classy shopify app"
6
6
  s.description = "A Sinatra extension for building Shopify Apps. Akin to the shopify_app gem but for Sinatra"
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.3
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
- - ".gitignore"
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: []
@@ -1,6 +0,0 @@
1
- scope: 'read_products, read_orders'
2
-
3
- uninstall_webhook:
4
- topic: "app/uninstalled"
5
- address: "your apps url"
6
- format: "json"