shopifydev 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. data/.gitignore +17 -0
  2. data/.pryrc +3 -0
  3. data/.root.shopifydev.yaml.sample +21 -0
  4. data/.ruby-version +1 -0
  5. data/.shopifydev.yaml.sample +7 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE.txt +22 -0
  8. data/NEXTSTEPS.md +33 -0
  9. data/README.md +78 -0
  10. data/Rakefile +1 -0
  11. data/bin/shopify_console +15 -0
  12. data/bin/shopifydev +100 -0
  13. data/lib/rails/generators/shopifydev/shops_generator.rb +11 -0
  14. data/lib/rails/generators/shopifydev/templates/shops.rake +5 -0
  15. data/lib/rails/tasks/shops.rake +7 -0
  16. data/lib/shopifydev/asset.rb +58 -0
  17. data/lib/shopifydev/commands.rb +83 -0
  18. data/lib/shopifydev/config.rb +9 -0
  19. data/lib/shopifydev/generators/shop.rb +29 -0
  20. data/lib/shopifydev/generators/templates/Gemfile +10 -0
  21. data/lib/shopifydev/generators/templates/gitignore +1 -0
  22. data/lib/shopifydev/generators/templates/rvmrc +1 -0
  23. data/lib/shopifydev/generators/templates/shopify-tmbundle +21 -0
  24. data/lib/shopifydev/pry/commands.rb +194 -0
  25. data/lib/shopifydev/railtie.rb +11 -0
  26. data/lib/shopifydev/shop.rb +38 -0
  27. data/lib/shopifydev/template.rb +73 -0
  28. data/lib/shopifydev/version.rb +3 -0
  29. data/lib/shopifydev.rb +10 -0
  30. data/shopifydev.gemspec +35 -0
  31. data/spec/shopifydev/config_spec.rb +5 -0
  32. data/spec/shopifydev/generators/shopifydev/shopifydev_generator_spec.rb +5 -0
  33. data/spec/shopifydev/pry/commands_spec.rb +5 -0
  34. data/spec/shopifydev/railtie_spec.rb +5 -0
  35. data/templates/customers/order.liquid +109 -0
  36. data/templates/customers/register.liquid +42 -0
  37. data/templates/page.support.liquid +78 -0
  38. data/templates/page.verbose.liquid +18 -0
  39. data/templates/product.liquid +284 -0
  40. data/templates/search.liquid +63 -0
  41. data/test_driver.rb +31 -0
  42. metadata +275 -0
@@ -0,0 +1,284 @@
1
+ {% include 'breadcrumbs' %}
2
+
3
+ <div id="product" class="content {{ product.handle }}{% if product.images.size == 1 %} one_image{% endif %} clearfix">
4
+
5
+ <div class="wrapper">
6
+ <div id="product-image">
7
+ {% if product.images.size > 1 %}
8
+ <div id="product-image-icons">
9
+ {% for image in product.images %}
10
+ <!-- CC attribution
11
+ magnifying-glass.ico
12
+ http://www.wpzoom.com
13
+ Designed by David Ferreira.
14
+ -->
15
+ <div class="image">
16
+ <a href="{{ image.src | product_img_url: 'original' }}" class="cloud-zoom-gallery" rel="useZoom: 'placeholder', smallImage: '{{ image.src | product_img_url: 'grande' }}', tint: '#ffffff'">
17
+ <img src="{{ image.src | product_img_url: 'small' }}" alt="{{ image.alt | escape }}" />
18
+ </a>
19
+ </div>
20
+ {% endfor %}
21
+ </div><!-- /.thumbs -->
22
+ {% endif %}
23
+ <div id="product-image-large">
24
+ <div class="image">
25
+ <a href="{{ product.featured_image.src | product_img_url: 'original' }}" class="cloud-zoom" rel="position: 'inside', showTitle: 'false'" id="placeholder">
26
+ <img src="{{ product.featured_image.src | product_img_url: 'grande' }}" alt="{{ product.featured_image.alt | escape }}" />
27
+ </a>
28
+ </div>
29
+
30
+ </div> <!-- /.featured -->
31
+ <div id="product-image-zoom">Hover over image to zoom</div>
32
+ </div> <!-- /.images -->
33
+
34
+ <div id="product-content">
35
+ {% if collection %}
36
+ <div class="more-info clearfix">
37
+ {% if collection.previous_product %}
38
+ <div class="fl">
39
+ <a href="{{ collection.previous_product }}" class="previous_product"><span class="upper">Previous</span> <span class="lower">Product</span></a>
40
+ </div>
41
+ {% endif %}
42
+ {% if collection.next_product %}
43
+ <div class="fr">
44
+ <a href="{{ collection.next_product }}" class="next_product"><span class="upper">Next</span> <span class="lower">Product</span></a>
45
+ </div>
46
+ {% endif %}
47
+ </div>
48
+ {% endif %}
49
+
50
+ <div id="product-full-description">
51
+ <div id="product-category">{{ collection.title | split: ' -- ' | last }}</div>
52
+ <h2 class="title">{{ product.title }}</h2>
53
+ {% if product.price_min < product.compare_at_price_min %}
54
+ <div id="product-price">{{ product.price_min | money }}</div>
55
+ <div id="product-price-old"><strike>{{ product.compare_at_price_min | money }}</strike></div>
56
+ {% else %}
57
+ <div id="product-price">{{ product.price_min | money }}</div>
58
+ {% endif %}
59
+
60
+ {% if settings.product_description_position == "top" %}
61
+
62
+ {% include 'shipping-and-return-tabs' %}
63
+
64
+ {% endif %}
65
+
66
+ <form id="add-item-form" action="/cart/add" method="post" class="variants clearfix">
67
+ {% if product.options.size > 1 %}
68
+ <div class="select clearfix">
69
+
70
+ <div id="product-color">
71
+ <div id="variant_details"></div>
72
+ <h4 style="color:#333">Please choose a color:</h4>
73
+ {% include 'swatches' %}
74
+ </div>
75
+
76
+ <div id="product-size" class="product-info">
77
+ <select id="product-select" name='id'>
78
+ {% for variant in product.variants %}
79
+ <option value="{{ variant.id }}">{{ variant.title }} - {{ variant.price | money }}</option>
80
+ {% endfor %}
81
+ </select>
82
+ </div>
83
+ </div>
84
+ {% elsif product.options.size == 1 and product.variants.size > 1 %}
85
+ <div class="select clearfix">
86
+ <label>{{ product.options[0] }}</label>
87
+ <select id="product-select" name='id'>
88
+ {% for variant in product.variants %}
89
+ <option value="{{ variant.id }}">{{ variant.title }} - {{ variant.price | money }}</option>
90
+ {% endfor %}
91
+ </select>
92
+ </div>
93
+ {% else %}
94
+ <input type="hidden" name="id" value="{{ product.variants.first.id }}" />
95
+ {% endif %}
96
+
97
+ <div id="product-quantity">
98
+ <label for="quantity"><h5 style="float:left">Quantity:</h5></label>
99
+ <input min="1" type="number" id="quantity" name="quantity" value="1" />
100
+ </div>
101
+
102
+
103
+ {% if product.available %}
104
+ <div class="purchase clearfix">
105
+ <span><input type="image" src="{{ 'cart.png' | asset_url }}" name="add" id="add-to-cart" value="Add to Cart" class="cart cufon" /></span>
106
+ </div>
107
+ {% else %}
108
+ <div class="purchase clearfix">
109
+ <span><input type="submit" name="add" id="add-to-cart" value="Sold Out" class="cart cufon disabled" disabled="disabled" /></span>
110
+ </div>
111
+ {% endif %}
112
+
113
+ </form>
114
+
115
+ <hr />
116
+
117
+ {% if settings.product_description_position == "bottom" %}
118
+
119
+ {% include 'shipping-and-return-tabs' %}
120
+
121
+ <div id="social-media">
122
+ {% include 'pinterest' %}
123
+ {% include 'like' %}
124
+ {% include 'amazon-wish-list' %}
125
+ </div>
126
+ {% endif %}
127
+
128
+ </div>
129
+ </div>
130
+
131
+ {% comment %} Related Products {% endcomment %}
132
+ {% include 'related-products' %}
133
+
134
+ </div>
135
+
136
+ </div> <!-- /#product -->
137
+
138
+ <script type="text/javascript">
139
+
140
+ // <![CDATA[
141
+ var selectCallback = function(variant, selector) {
142
+
143
+ // #variant_details is in snippets/shipping-and-return-tabs
144
+ var description = jQuery('#variant_details')
145
+
146
+ // if we have product variants with details
147
+ {% if product.metafields.variants.variant_details %}
148
+
149
+ // make an array of the details
150
+ var metafields = {{ product.metafields.variants.variant_details | json }}.split(':')
151
+
152
+ // match the details against the selected variant
153
+ var match = true
154
+ for (i = 0; i < variant.options.length; i++) {
155
+
156
+ if (variant.options[i].toLowerCase().trim() === metafields[i].trim()) {
157
+ // NOP
158
+ } else {
159
+ match = false;
160
+ }
161
+ } // post: if a metafield matched the current variant exactly, match is true
162
+
163
+ // if it was a complete match, then post the last detail
164
+ if (match === true) {
165
+ description.text(metafields.pop().trim())
166
+ description.addClass('active')
167
+ } else {
168
+ description.text('')
169
+ description.removeClass('active')
170
+ }
171
+ {% endif %}
172
+
173
+ if (variant && variant.available == true) {
174
+ // selected a valid variant
175
+ jQuery('#add-to-cart').removeClass('disabled').removeAttr('disabled').val('Add to Cart'); // remove unavailable class from add-to-cart button, and re-enable button
176
+ if(variant.price < variant.compare_at_price){
177
+ jQuery('#price-preview').html('<span class="money">'
178
+ + Shopify.formatMoney(variant.price, "{{ shop.money_format }}")
179
+ + '</span>'
180
+ + ' was <span class="money">'
181
+ + Shopify.formatMoney(variant.compare_at_price, "{{ shop.money_format }}")
182
+ + "</span>");
183
+ } else {
184
+ jQuery('#price-preview').html('<span class="money">' + Shopify.formatMoney(variant.price, "{{ shop.money_format }}") + '</span>');
185
+ }
186
+
187
+ } else {
188
+ // variant doesn't exist
189
+ var message = variant ? "Sold Out" : "Unavailable";
190
+ jQuery('#add-to-cart').addClass('disabled').attr('disabled', 'disabled').val('Sold Out'); // set add-to-cart button to unavailable class and disable button
191
+ jQuery('#product .variants .price').text(message); // update price-field message
192
+ }
193
+ };
194
+
195
+ function remove(s, t) {
196
+ /*
197
+ ** Remove all occurrences of a token in a string
198
+ ** s string to be processed
199
+ ** t token to be removed
200
+ ** returns new string
201
+ */
202
+ i = s.indexOf(t);
203
+ r = "";
204
+ if (i == -1) return s;
205
+ r += s.substring(0,i) + remove(s.substring(i + t.length), t);
206
+ return r;
207
+ }
208
+
209
+ // initialize multi selector for product
210
+ jQuery(function() {
211
+ /* NOTE we are not using recently-viewed, so I am removing the related code
212
+ if(jQuery.cookie("viewed-products") != null){ // if cookie exists...
213
+ var products = jQuery.cookie("viewed-products");
214
+ var productHandles = products.split(" ");
215
+ var matches = 0;
216
+ var limit = 4;
217
+ for(var i = (productHandles.length - 1); i >= 0; i--) {
218
+ if(productHandles[i] != "{{ product.handle }}" && productHandles[i] != "" && (matches < limit)){
219
+ Shopify.getProduct(productHandles[i]);
220
+ matches++;
221
+ }
222
+ }
223
+
224
+ if(products.indexOf("{{ product.handle }}") == -1){ // add current product to list if it isn't already there
225
+ products += " {{ product.handle }}";
226
+ jQuery.cookie("viewed-products", products, {path: "/"});
227
+ } else { // if it is already there, push it to the end of the string
228
+ var newstring = remove(products, '{{ product.handle }}');
229
+ newstring += " {{ product.handle }}";
230
+ jQuery.cookie("viewed-products", newstring.replace(/ /g,' '), {path: "/"});
231
+ }
232
+ } else { // create cookie if it doesn't already exist
233
+ jQuery.cookie("viewed-products", "{{ product.handle }}", {path: "/"});
234
+ } */
235
+
236
+ // create the multi-selector
237
+ {% if product.variants.size > 1 or product.options.size > 1 %}
238
+ new Shopify.OptionSelectors("product-select", { product: {{ product | json }}, onVariantSelected: selectCallback });
239
+
240
+ // wrap the labels for Cufon styling
241
+ var labels = jQuery('#product-size .selector-wrapper label')
242
+ labels.wrapInner('<h4 class="selector-label" />')
243
+
244
+ // add classes to each option for chaining
245
+ {% for variant in product.variants %}
246
+
247
+ var colour = '{{ variant.option1 }}'
248
+ var size = '{{ variant.option2 }}'
249
+
250
+ jQuery('#product-select-option-1'
251
+ + ' option[value="' + size + '"]').addClass(colour)
252
+
253
+ {% endfor %}
254
+
255
+ // choose a default value for each selector in the cluster
256
+ {% assign found_one_in_stock = false %}
257
+ {% for variant in product.variants %}
258
+ {% if variant.available and found_one_in_stock == false %}
259
+
260
+ // for the first variant that is in stock
261
+ {% assign found_one_in_stock = true %}
262
+ {% for option in product.options %}
263
+ jQuery('#product-select-option-' + {{ forloop.index0 }}).val({{ variant.options[forloop.index0] | json }}).trigger('change');
264
+
265
+ {% endfor %}
266
+ {% endif %}
267
+ {% endfor %}
268
+
269
+ {% endif %}
270
+
271
+ $("#product-select-option-1").chained("#product-select-option-0"); /* or $("#series").chainedTo("#mark"); */
272
+
273
+ });
274
+
275
+ /* NOTE we are not using recently-viewed so I am removing the related code
276
+ Shopify.onProduct = function(product) {
277
+ jQuery("#recently-viewed").css('display', 'block');
278
+ jQuery("#recently-viewed .products").append('<div class="product"><div class="image"><a href="' + product.url + '"><img src="' + Shopify.resizeImage(product.featured_image, 'large') + '" alt="' + product.title + '" /></a></div><div class="details clearfix"><a href="' + product.url + '"><span class="title">' + product.title + '</span></a></div></div>');
279
+ jQuery("#recently-viewed .products .product:nth-child(4)").addClass("last");
280
+ jQuery("#content-slide .product .details, #content-table .product .details").css({opacity:0.0});
281
+ }; */
282
+ // ]]>
283
+ </script>
284
+
@@ -0,0 +1,63 @@
1
+ <div id="search" class="clearfix">
2
+ {% if search.performed %}
3
+ <div class="main">
4
+ {% paginate search.results by settings.pagination_limit %}
5
+ <div class="more-info clearfix">
6
+ <div class="fl">
7
+ <span class="upper">Search Results</span>
8
+ <span class="lower">{{ search.results_count }} {{ search.results_count | pluralize: 'Match', 'Matches' }} </span>
9
+ </div>
10
+ <div class="fr">
11
+ <span class="upper">&nbsp;</span>
12
+ <span class="lower">{% include 'pagination' %}</span>
13
+ </div>
14
+ </div>
15
+ {% if search.terms == "" %}
16
+ <p>Your search query was empty.</p>
17
+ {% else %}
18
+ {% if search.results == empty %}
19
+ <div class="empty">
20
+ Your search for "{{search.terms | escape}}" did not yield any results
21
+ </div>
22
+ {% else %}
23
+
24
+ <div class="results">
25
+ {% for item in search.results %}
26
+ <div class="item clearfix">
27
+ <div class="thumbnail">
28
+ <a href="{{ item.url }}">{{ item.featured_image.src | product_img_url: 'thumb' | img_tag: item.featured_image.alt }}</a>
29
+ </div>
30
+ <div class="content">
31
+ <h4>{{ item.title | link_to: item.url }}</h4>
32
+ {{ item.content | strip_html | truncatewords: 40 | highlight: search.terms }}
33
+ </div>
34
+ </div> <!-- /.item -->
35
+ {% endfor %}
36
+ </div> <!-- /.results -->
37
+
38
+ {% endif %}
39
+ {% endif %}
40
+
41
+ <div class="more-info clearfix">
42
+ <div class="fr">
43
+ <span class="upper">&nbsp;</span>
44
+ <span class="lower">{% include 'pagination' %}</span>
45
+ </div>
46
+ </div>
47
+
48
+ {% endpaginate %}
49
+ </div> <!-- /.main -->
50
+ {% include "sidebar" %}
51
+
52
+ {% else %}
53
+
54
+ <div id="not_found">
55
+ <h2>Search our shop</h2>
56
+ <form id="search_form" class="searchform" name="search" action="/search">
57
+ <input type="text" class="replace" name="q" value="Search..." />
58
+ </form>
59
+ </div> <!-- /#not_found -->
60
+
61
+ {% endif %}
62
+ </div> <!-- /#search -->
63
+ {% include 'featured-products' %}
data/test_driver.rb ADDED
@@ -0,0 +1,31 @@
1
+ require_relative "lib/shopifydev.rb"
2
+ require "shopify_api"
3
+
4
+ class TestDriver
5
+ attr_accessor :devshop
6
+
7
+ def initialize
8
+ @devshop = Shopifydev::Shop.new(credentials)
9
+ end
10
+
11
+ def credentials
12
+ unless @credentials
13
+ @credentials = YAML::load(
14
+ File.open(
15
+ File.join(File.dirname(__FILE__), '.shopifydev.yaml')))
16
+ end
17
+
18
+ @credentials
19
+ end
20
+
21
+ end
22
+
23
+ if __FILE__ == $PROGRAM_NAME
24
+ test_shop = TestDriver.new
25
+ test_shop.devshop.template.download
26
+
27
+ # upload a new asset by file name
28
+ test_shop.devshop.asset('assets/example.css').upload
29
+ test_shop.devshop.asset('assets/example.png').upload
30
+ end
31
+
metadata ADDED
@@ -0,0 +1,275 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: shopifydev
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Michael Johnston
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-06-06 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: shopify_api
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: 3.0.0
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: 3.0.0
30
+ - !ruby/object:Gem::Dependency
31
+ name: ruby-filemagic
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: 0.4.2
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: 0.4.2
46
+ - !ruby/object:Gem::Dependency
47
+ name: gli
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: 2.5.2
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: 2.5.2
62
+ - !ruby/object:Gem::Dependency
63
+ name: oj
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: dalli
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :runtime
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: shydra
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :runtime
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ - !ruby/object:Gem::Dependency
111
+ name: pry
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ! '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ - !ruby/object:Gem::Dependency
127
+ name: activesupport
128
+ requirement: !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ! '>='
132
+ - !ruby/object:Gem::Version
133
+ version: '0'
134
+ type: :runtime
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ! '>='
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
142
+ - !ruby/object:Gem::Dependency
143
+ name: term-ansicolor
144
+ requirement: !ruby/object:Gem::Requirement
145
+ none: false
146
+ requirements:
147
+ - - ! '>='
148
+ - !ruby/object:Gem::Version
149
+ version: '0'
150
+ type: :runtime
151
+ prerelease: false
152
+ version_requirements: !ruby/object:Gem::Requirement
153
+ none: false
154
+ requirements:
155
+ - - ! '>='
156
+ - !ruby/object:Gem::Version
157
+ version: '0'
158
+ - !ruby/object:Gem::Dependency
159
+ name: railties
160
+ requirement: !ruby/object:Gem::Requirement
161
+ none: false
162
+ requirements:
163
+ - - ! '>='
164
+ - !ruby/object:Gem::Version
165
+ version: '0'
166
+ type: :runtime
167
+ prerelease: false
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ none: false
170
+ requirements:
171
+ - - ! '>='
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ - !ruby/object:Gem::Dependency
175
+ name: rake
176
+ requirement: !ruby/object:Gem::Requirement
177
+ none: false
178
+ requirements:
179
+ - - ! '>='
180
+ - !ruby/object:Gem::Version
181
+ version: '0'
182
+ type: :development
183
+ prerelease: false
184
+ version_requirements: !ruby/object:Gem::Requirement
185
+ none: false
186
+ requirements:
187
+ - - ! '>='
188
+ - !ruby/object:Gem::Version
189
+ version: '0'
190
+ description: Tools for using SCM with shopify.
191
+ email:
192
+ - lastobelus@mac.com
193
+ executables:
194
+ - shopify_console
195
+ - shopifydev
196
+ extensions: []
197
+ extra_rdoc_files: []
198
+ files:
199
+ - .gitignore
200
+ - .pryrc
201
+ - .root.shopifydev.yaml.sample
202
+ - .ruby-version
203
+ - .shopifydev.yaml.sample
204
+ - Gemfile
205
+ - LICENSE.txt
206
+ - NEXTSTEPS.md
207
+ - README.md
208
+ - Rakefile
209
+ - bin/shopify_console
210
+ - bin/shopifydev
211
+ - lib/rails/generators/shopifydev/shops_generator.rb
212
+ - lib/rails/generators/shopifydev/templates/shops.rake
213
+ - lib/rails/tasks/shops.rake
214
+ - lib/shopifydev.rb
215
+ - lib/shopifydev/asset.rb
216
+ - lib/shopifydev/commands.rb
217
+ - lib/shopifydev/config.rb
218
+ - lib/shopifydev/generators/shop.rb
219
+ - lib/shopifydev/generators/templates/Gemfile
220
+ - lib/shopifydev/generators/templates/gitignore
221
+ - lib/shopifydev/generators/templates/rvmrc
222
+ - lib/shopifydev/generators/templates/shopify-tmbundle
223
+ - lib/shopifydev/pry/commands.rb
224
+ - lib/shopifydev/railtie.rb
225
+ - lib/shopifydev/shop.rb
226
+ - lib/shopifydev/template.rb
227
+ - lib/shopifydev/version.rb
228
+ - shopifydev.gemspec
229
+ - spec/shopifydev/config_spec.rb
230
+ - spec/shopifydev/generators/shopifydev/shopifydev_generator_spec.rb
231
+ - spec/shopifydev/pry/commands_spec.rb
232
+ - spec/shopifydev/railtie_spec.rb
233
+ - templates/customers/order.liquid
234
+ - templates/customers/register.liquid
235
+ - templates/page.support.liquid
236
+ - templates/page.verbose.liquid
237
+ - templates/product.liquid
238
+ - templates/search.liquid
239
+ - test_driver.rb
240
+ homepage: ''
241
+ licenses: []
242
+ post_install_message:
243
+ rdoc_options: []
244
+ require_paths:
245
+ - lib
246
+ required_ruby_version: !ruby/object:Gem::Requirement
247
+ none: false
248
+ requirements:
249
+ - - ! '>='
250
+ - !ruby/object:Gem::Version
251
+ version: '0'
252
+ segments:
253
+ - 0
254
+ hash: -1632061386653175643
255
+ required_rubygems_version: !ruby/object:Gem::Requirement
256
+ none: false
257
+ requirements:
258
+ - - ! '>='
259
+ - !ruby/object:Gem::Version
260
+ version: '0'
261
+ segments:
262
+ - 0
263
+ hash: -1632061386653175643
264
+ requirements: []
265
+ rubyforge_project:
266
+ rubygems_version: 1.8.25
267
+ signing_key:
268
+ specification_version: 3
269
+ summary: Abstract out and port to ruby the functionality of the shopify textmate bundle
270
+ for use in other editors.
271
+ test_files:
272
+ - spec/shopifydev/config_spec.rb
273
+ - spec/shopifydev/generators/shopifydev/shopifydev_generator_spec.rb
274
+ - spec/shopifydev/pry/commands_spec.rb
275
+ - spec/shopifydev/railtie_spec.rb