spree-wrap 0.0.1 → 0.0.2
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.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/Rakefile +1 -1
- data/lib/spree/wrap.rb +29 -1
- data/lib/spree/wrap/version.rb +1 -1
- data/motion/spree.rb +23 -1
- data/motion/spree/api/country.rb +46 -0
- data/motion/spree/api/product.rb +60 -20
- data/motion/spree/api/product_property.rb +55 -0
- data/motion/spree/api/query.rb +33 -0
- data/motion/spree/api/resource_name.rb +13 -0
- data/motion/spree/api/taxonomy.rb +47 -0
- data/motion/spree/api/uri.rb +19 -0
- data/motion/spree/api/variant.rb +52 -0
- data/motion/spree/api/zone.rb +55 -0
- data/motion/spree/country.rb +7 -0
- data/motion/spree/inflector.rb +36 -0
- data/motion/spree/model.rb +10 -3
- data/motion/spree/product_property.rb +7 -0
- data/motion/spree/taxonomy.rb +7 -0
- data/motion/spree/variant.rb +9 -0
- data/motion/spree/zone.rb +7 -0
- data/spec/spree/api/product_spec.rb +7 -22
- data/spec/spree/api/query_spec.rb +69 -0
- data/spec/spree/api/resource_name_spec.rb +15 -0
- data/spec/spree/api/uri_spec.rb +30 -0
- data/spec/spree/inflector_spec.rb +28 -0
- data/spec/spree_spec.rb +8 -0
- data/spree-wrap.gemspec +1 -0
- metadata +40 -5
- data/.repl_history +0 -27
- data/spec/support/webstub/products.json +0 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9ecc1cac976cdb50b45d7ca8adea82c3e76180e6
|
4
|
+
data.tar.gz: 1f0bf376c66bc455f756ae0df70c7b0ad7857bd8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8a4e481c4e1d45a0707ae988c7dd7be1fbb022d70ad512011c8f058c9a562f20f85ed5d02d32e321e48967c8bdc707b1cde543c03aed40bc09b89f0383879109
|
7
|
+
data.tar.gz: aa2ecad53407e6974d9167bd22776b4d04d5851a8ae7fd3586053bd4cfa6915ed8da5517aedd0386907a4af4f1543a0d4df2580bd7477f8c18f1152fe62a942b
|
data/.gitignore
CHANGED
data/Rakefile
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
$:.unshift("/Library/RubyMotion/lib")
|
2
2
|
require 'motion/project/template/ios'
|
3
|
+
require "bundler/gem_tasks"
|
3
4
|
|
4
5
|
# Bubblewrap
|
5
6
|
require 'bubble-wrap/core'
|
@@ -9,4 +10,3 @@ Bundler.setup
|
|
9
10
|
Bundler.require
|
10
11
|
require 'bubble-wrap/test'
|
11
12
|
require 'webstub'
|
12
|
-
require "bundler/gem_tasks"
|
data/lib/spree/wrap.rb
CHANGED
@@ -1,5 +1,33 @@
|
|
1
1
|
require "spree/wrap/version"
|
2
|
-
|
2
|
+
require "motion-support/concern"
|
3
|
+
|
4
|
+
BubbleWrap.require 'motion/spree/inflector.rb'
|
5
|
+
|
6
|
+
#
|
7
|
+
# Models
|
8
|
+
#
|
3
9
|
BubbleWrap.require 'motion/spree/model.rb'
|
10
|
+
BubbleWrap.require 'motion/spree/country.rb'
|
4
11
|
BubbleWrap.require 'motion/spree/product.rb'
|
12
|
+
BubbleWrap.require 'motion/spree/product_property.rb'
|
13
|
+
BubbleWrap.require 'motion/spree/taxonomy.rb'
|
14
|
+
BubbleWrap.require 'motion/spree/variant.rb'
|
15
|
+
BubbleWrap.require 'motion/spree/zone.rb'
|
16
|
+
|
17
|
+
#
|
18
|
+
# API Queries
|
19
|
+
#
|
20
|
+
BubbleWrap.require 'motion/spree/api/resource_name.rb'
|
21
|
+
BubbleWrap.require 'motion/spree/api/query.rb'
|
22
|
+
BubbleWrap.require 'motion/spree/api/uri.rb'
|
23
|
+
BubbleWrap.require 'motion/spree/api/country.rb'
|
5
24
|
BubbleWrap.require 'motion/spree/api/product.rb'
|
25
|
+
BubbleWrap.require 'motion/spree/api/product_property.rb'
|
26
|
+
BubbleWrap.require 'motion/spree/api/taxonomy.rb'
|
27
|
+
BubbleWrap.require 'motion/spree/api/variant.rb'
|
28
|
+
BubbleWrap.require 'motion/spree/api/zone.rb'
|
29
|
+
|
30
|
+
#
|
31
|
+
# Main Module
|
32
|
+
#
|
33
|
+
BubbleWrap.require 'motion/spree.rb'
|
data/lib/spree/wrap/version.rb
CHANGED
data/motion/spree.rb
CHANGED
@@ -1,11 +1,33 @@
|
|
1
|
+
#
|
2
|
+
# This module contains all the methods required to consume the Spree API.
|
3
|
+
#
|
4
|
+
# Refer to the modules on the Spree::API namespace for more information.
|
5
|
+
#
|
6
|
+
# Spree::API::Country
|
7
|
+
# Spree::API::Product
|
8
|
+
# Spree::API::Taxonomy
|
9
|
+
# Spree::API::Variant
|
10
|
+
# Spree::API::Zone
|
11
|
+
#
|
1
12
|
module Spree
|
13
|
+
#
|
14
|
+
# Getter for the endpoint URL
|
15
|
+
#
|
2
16
|
def self.endpoint
|
3
17
|
@endpoint
|
4
18
|
end
|
5
19
|
|
20
|
+
#
|
21
|
+
# Setter for the endpoint URL
|
22
|
+
#
|
6
23
|
def self.endpoint=(uri)
|
7
24
|
@endpoint = uri
|
8
25
|
end
|
9
26
|
|
10
|
-
|
27
|
+
extend Spree::API::Country
|
28
|
+
extend Spree::API::Product
|
29
|
+
extend Spree::API::ProductProperty
|
30
|
+
extend Spree::API::Taxonomy
|
31
|
+
extend Spree::API::Variant
|
32
|
+
extend Spree::API::Zone
|
11
33
|
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module Spree
|
2
|
+
module API
|
3
|
+
#
|
4
|
+
# This module defines all the API calls related to Countries.
|
5
|
+
# All results return Spree::Country objects.
|
6
|
+
#
|
7
|
+
# API Reference
|
8
|
+
#
|
9
|
+
# http://api.spreecommerce.com/v1/countries
|
10
|
+
#
|
11
|
+
# This Module is included in the Spree Module so you should call its
|
12
|
+
# methods directly from Spree.
|
13
|
+
#
|
14
|
+
# Spree.countries do |countries|
|
15
|
+
# # ...
|
16
|
+
# end
|
17
|
+
#
|
18
|
+
module Country
|
19
|
+
extend Spree::API::ResourceName
|
20
|
+
include Spree::API::Query
|
21
|
+
include Spree::API::URI
|
22
|
+
|
23
|
+
#
|
24
|
+
# Retrieve a list of all countries by making this request:
|
25
|
+
#
|
26
|
+
# Spree.countries do |countries|
|
27
|
+
# # ..
|
28
|
+
# end
|
29
|
+
#
|
30
|
+
def countries(&block)
|
31
|
+
collection_query("countries", Spree::Country, Spree.countries_uri, &block)
|
32
|
+
end
|
33
|
+
|
34
|
+
#
|
35
|
+
# Retrieve details about a particular country:
|
36
|
+
#
|
37
|
+
# Spree.country(1) do |country|
|
38
|
+
# # ...
|
39
|
+
# end
|
40
|
+
#
|
41
|
+
def country(id, &block)
|
42
|
+
object_query(Spree::Country, country_uri(id), &block)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
data/motion/spree/api/product.rb
CHANGED
@@ -1,29 +1,69 @@
|
|
1
1
|
module Spree
|
2
2
|
module API
|
3
|
+
#
|
4
|
+
# This module defines all the API calls related to Products.
|
5
|
+
# All results return Spree::Product objects.
|
6
|
+
#
|
7
|
+
# API Reference
|
8
|
+
#
|
9
|
+
# http://api.spreecommerce.com/v1/products
|
10
|
+
#
|
11
|
+
# This Module is included in the Spree Module so you should call its
|
12
|
+
# methods directly from Spree.
|
13
|
+
#
|
14
|
+
# Spree.products do |products|
|
15
|
+
# # ...
|
16
|
+
# end
|
17
|
+
#
|
3
18
|
module Product
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
module ClassMethods
|
9
|
-
def products(&block)
|
10
|
-
json = []
|
11
|
-
|
12
|
-
BW::HTTP.get(Spree.products_uri) do |response|
|
13
|
-
json = BW::JSON.parse(response.body.to_str)
|
14
|
-
products = json["products"].map do |product_json|
|
15
|
-
Spree::Product.new(product_json)
|
16
|
-
end
|
19
|
+
extend Spree::API::ResourceName
|
20
|
+
include Spree::API::Query
|
21
|
+
include Spree::API::URI
|
17
22
|
|
18
|
-
|
19
|
-
|
23
|
+
#
|
24
|
+
# List products visible to the authenticated user.
|
25
|
+
#
|
26
|
+
# Spree.products do |products|
|
27
|
+
# # ..
|
28
|
+
# end
|
29
|
+
#
|
30
|
+
def products(&block)
|
31
|
+
collection_query("products", Spree::Product, Spree.products_uri, &block)
|
32
|
+
end
|
20
33
|
|
21
|
-
|
22
|
-
|
34
|
+
#
|
35
|
+
# To view the details for a single product, make a request using that product's permalink:
|
36
|
+
#
|
37
|
+
# Spree.product("a-product") do |product|
|
38
|
+
# # ...
|
39
|
+
# end
|
40
|
+
#
|
41
|
+
# You may also query by the product's id attribute:
|
42
|
+
#
|
43
|
+
# Spree.product("id") do |product|
|
44
|
+
# # ...
|
45
|
+
# end
|
46
|
+
#
|
47
|
+
# Note that the API will attempt a permalink lookup before an ID lookup.
|
48
|
+
#
|
49
|
+
def product(id, &block)
|
50
|
+
object_query(Spree::Product, product_uri(id), &block)
|
51
|
+
end
|
23
52
|
|
24
|
-
|
25
|
-
|
26
|
-
|
53
|
+
#
|
54
|
+
# To search for a particular product, make a request like this:
|
55
|
+
#
|
56
|
+
# Spree.product_search("q[name_cont]=Spree") do |p|
|
57
|
+
# # ...
|
58
|
+
# end
|
59
|
+
#
|
60
|
+
# The searching API is provided through the Ransack gem which Spree
|
61
|
+
# depends on. The name_cont here is called a predicate, and you can
|
62
|
+
# learn more about them by reading about
|
63
|
+
# {Predicates on the Ransack wiki}[https://github.com/ernie/ransack/wiki/Basic-Searching].
|
64
|
+
#
|
65
|
+
def product_search(query, &block)
|
66
|
+
collection_query("products", Spree::Product, Spree.product_search_uri(query), &block)
|
27
67
|
end
|
28
68
|
end
|
29
69
|
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module Spree
|
2
|
+
module API
|
3
|
+
# == Product Properties
|
4
|
+
#
|
5
|
+
# === API Reference
|
6
|
+
#
|
7
|
+
# http://api.spreecommerce.com/v1/product/properties/
|
8
|
+
#
|
9
|
+
module ProductProperty
|
10
|
+
extend Spree::API::ResourceName
|
11
|
+
include Spree::API::Query
|
12
|
+
include Spree::API::URI
|
13
|
+
|
14
|
+
#
|
15
|
+
# Retrieve a list of all product properties for a product by making this request:
|
16
|
+
#
|
17
|
+
# product_id = 1
|
18
|
+
# Spree.product_properties(1) do |property|
|
19
|
+
# # ...
|
20
|
+
# end
|
21
|
+
#
|
22
|
+
def product_properties(id, &block)
|
23
|
+
collection_query("product_properties", Spree::ProductProperty,
|
24
|
+
product_properties_uri(id), &block)
|
25
|
+
end
|
26
|
+
|
27
|
+
#
|
28
|
+
# To search for a particular product property, make a request like this:
|
29
|
+
#
|
30
|
+
# product_id = 1
|
31
|
+
# query = "q[property_name_cont]=Type"
|
32
|
+
#
|
33
|
+
# Spree.product_property_search(product_id, query) do |p|
|
34
|
+
# # ...
|
35
|
+
# end
|
36
|
+
# The searching API is provided through the Ransack gem which
|
37
|
+
# Spree depends on. The property_name_cont here is called a predicate,
|
38
|
+
# and you can learn more about them by reading
|
39
|
+
# about {Predicates on the Ransack wiki}[https://github.com/ernie/ransack/wiki/Basic-Searching].
|
40
|
+
#
|
41
|
+
def product_property_search(product_id, query, &block)
|
42
|
+
collection_query("product_properties", Spree::ProductProperty,
|
43
|
+
Spree.product_property_search_uri(product_id, query), &block)
|
44
|
+
end
|
45
|
+
|
46
|
+
def product_properties_uri(product_id)
|
47
|
+
Spree.product_uri(product_id) + "/product_properties"
|
48
|
+
end
|
49
|
+
|
50
|
+
def product_property_search_uri(product_id, query)
|
51
|
+
Spree.product_uri(product_id) + "/product_properties?#{query}"
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Spree
|
2
|
+
module API
|
3
|
+
module Query
|
4
|
+
def collection_query(collection_name, object_class, uri, &block)
|
5
|
+
if block_given?
|
6
|
+
BW::HTTP.get(uri) do |response|
|
7
|
+
json = BW::JSON.parse(response.body.to_str)
|
8
|
+
collection = (json[collection_name] || []).map do |object_json|
|
9
|
+
object_class.new(object_json)
|
10
|
+
end
|
11
|
+
|
12
|
+
block.call collection
|
13
|
+
end
|
14
|
+
else
|
15
|
+
BW::HTTP.get(uri)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def object_query(object_class, uri, &block)
|
20
|
+
if block_given?
|
21
|
+
BW::HTTP.get(uri) do |response|
|
22
|
+
json = BW::JSON.parse(response.body.to_str)
|
23
|
+
object = object_class.new(json)
|
24
|
+
|
25
|
+
block.call object
|
26
|
+
end
|
27
|
+
else
|
28
|
+
BW::HTTP.get(uri)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Spree
|
2
|
+
module API
|
3
|
+
module ResourceName
|
4
|
+
def resource_name
|
5
|
+
@resource_name ||= self.to_s.underscore.split('/').last
|
6
|
+
end
|
7
|
+
|
8
|
+
def resource_name_plural
|
9
|
+
@resource_name_plural ||= Spree::Inflector.pluralize resource_name
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Spree
|
2
|
+
module API
|
3
|
+
#
|
4
|
+
# This module defines all the API calls related to Taxonomies.
|
5
|
+
# All results return Spree::Taxonomy objects.
|
6
|
+
#
|
7
|
+
# API Reference
|
8
|
+
#
|
9
|
+
# http://api.spreecommerce.com/v1/taxonomies
|
10
|
+
#
|
11
|
+
# This Module is included in the Spree Module so you should call its
|
12
|
+
# methods directly from Spree.
|
13
|
+
#
|
14
|
+
# Spree.taxonomies do |taxonomies|
|
15
|
+
# # ...
|
16
|
+
# end
|
17
|
+
#
|
18
|
+
module Taxonomy
|
19
|
+
extend Spree::API::ResourceName
|
20
|
+
include Spree::API::Query
|
21
|
+
include Spree::API::URI
|
22
|
+
|
23
|
+
#
|
24
|
+
# To get a list of all the taxonomies, including their root nodes and
|
25
|
+
# the immediate children for the root node, make a request like this:
|
26
|
+
#
|
27
|
+
# Spree.taxonomies do |taxonomies|
|
28
|
+
# # ..
|
29
|
+
# end
|
30
|
+
#
|
31
|
+
def taxonomies(&block)
|
32
|
+
collection_query("taxonomies", Spree::Taxonomy, Spree.taxonomies_uri, &block)
|
33
|
+
end
|
34
|
+
|
35
|
+
# To get information for a single taxonomy, including its root node and
|
36
|
+
# the immediate children of the root node, make a request like this:
|
37
|
+
#
|
38
|
+
# Spree.taxonomy(1) do |taxonomy|
|
39
|
+
# # ...
|
40
|
+
# end
|
41
|
+
#
|
42
|
+
def taxonomy(id, &block)
|
43
|
+
object_query(Spree::Taxonomy, taxonomy_uri(id), &block)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Spree
|
2
|
+
module API
|
3
|
+
module URI
|
4
|
+
def self.included(base)
|
5
|
+
base.send :define_method, "#{base.resource_name_plural}_uri" do
|
6
|
+
"#{Spree.endpoint}/#{base.resource_name_plural}"
|
7
|
+
end
|
8
|
+
|
9
|
+
base.send :define_method, "#{base.resource_name}_uri" do |id|
|
10
|
+
"#{Spree.endpoint}/#{base.resource_name_plural}/#{id}"
|
11
|
+
end
|
12
|
+
|
13
|
+
base.send :define_method, "#{base.resource_name}_search_uri" do |query|
|
14
|
+
"#{Spree.endpoint}/#{base.resource_name_plural}?#{query}"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module Spree
|
2
|
+
module API
|
3
|
+
#
|
4
|
+
# This module defines all the API calls related to Variants.
|
5
|
+
# All results return Spree::Variant objects.
|
6
|
+
#
|
7
|
+
# API Reference
|
8
|
+
#
|
9
|
+
# http://api.spreecommerce.com/v1/variants
|
10
|
+
#
|
11
|
+
# This Module is included in the Spree Module so you should call its
|
12
|
+
# methods directly from Spree.
|
13
|
+
#
|
14
|
+
# Spree.variants do |variants|
|
15
|
+
# # ...
|
16
|
+
# end
|
17
|
+
#
|
18
|
+
module Variant
|
19
|
+
extend Spree::API::ResourceName
|
20
|
+
include Spree::API::Query
|
21
|
+
include Spree::API::URI
|
22
|
+
|
23
|
+
# To return a paginated list of all variants within the store, make this request:
|
24
|
+
#
|
25
|
+
# Spree.variants do |variants|
|
26
|
+
# # ..
|
27
|
+
# end
|
28
|
+
#
|
29
|
+
def variants(&block)
|
30
|
+
collection_query("variants", Spree::Variant, Spree.variants_uri, &block)
|
31
|
+
end
|
32
|
+
|
33
|
+
#
|
34
|
+
# To view the details for a single variant, make a request using that
|
35
|
+
# variant's id, along with its product_id:
|
36
|
+
#
|
37
|
+
# product_id = 1
|
38
|
+
#
|
39
|
+
# Spree.product_variants(product_id) |v|
|
40
|
+
# # ...
|
41
|
+
# end
|
42
|
+
#
|
43
|
+
def product_variants(product_id, &block)
|
44
|
+
collection_query("variants", Spree::Variant, Spree.product_variants_uri(product_id), &block)
|
45
|
+
end
|
46
|
+
|
47
|
+
def product_variants_uri(product_id)
|
48
|
+
Spree.product_uri(product_id) + "/variants"
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module Spree
|
2
|
+
module API
|
3
|
+
#
|
4
|
+
# This module defines all the API calls related to Zones.
|
5
|
+
# All results return Spree::Zone objects.
|
6
|
+
#
|
7
|
+
# API Reference
|
8
|
+
#
|
9
|
+
# http://api.spreecommerce.com/v1/zones
|
10
|
+
#
|
11
|
+
# This Module is included in the Spree Module so you should call its
|
12
|
+
# methods directly from Spree.
|
13
|
+
#
|
14
|
+
# Spree.zones do |zones|
|
15
|
+
# # ...
|
16
|
+
# end
|
17
|
+
#
|
18
|
+
module Zone
|
19
|
+
extend Spree::API::ResourceName
|
20
|
+
include Spree::API::Query
|
21
|
+
include Spree::API::URI
|
22
|
+
|
23
|
+
#
|
24
|
+
# List zones visible to the authenticated user.
|
25
|
+
#
|
26
|
+
# Spree.zones do |zones|
|
27
|
+
# # ..
|
28
|
+
# end
|
29
|
+
#
|
30
|
+
def zones(&block)
|
31
|
+
collection_query("zones", Spree::Zone, Spree.zones_uri, &block)
|
32
|
+
end
|
33
|
+
|
34
|
+
#
|
35
|
+
# To view the details for a single zone, make a request using that zone's permalink:
|
36
|
+
#
|
37
|
+
# Spree.zone("a-zone") do |zone|
|
38
|
+
# # ...
|
39
|
+
# end
|
40
|
+
#
|
41
|
+
# You may also query by the zone's id attribute:
|
42
|
+
#
|
43
|
+
# Spree.zone("id") do |zone|
|
44
|
+
# # ...
|
45
|
+
# end
|
46
|
+
#
|
47
|
+
# Note that the API will attempt a permalink lookup before an ID lookup.
|
48
|
+
#
|
49
|
+
def zone(id, &block)
|
50
|
+
object_query(Spree::Zone, zone_uri(id), &block)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Spree
|
2
|
+
#
|
3
|
+
# Handles the pluralization of resource names for the API classes
|
4
|
+
#
|
5
|
+
class Inflector
|
6
|
+
def self.inflections
|
7
|
+
@inflections ||= []
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.inflections=(value)
|
11
|
+
@inflections = value
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.pluralize(singular)
|
15
|
+
inflection = self.inflections.detect { |i| i[:singular] == singular }
|
16
|
+
raise UndefinedInflection unless inflection
|
17
|
+
inflection[:plural]
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.inflection(singular, plural)
|
21
|
+
inflections << Inflection.new(singular, plural)
|
22
|
+
end
|
23
|
+
|
24
|
+
Inflection = Struct.new(:singular, :plural)
|
25
|
+
|
26
|
+
class UndefinedInflection < Exception ; end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
Spree::Inflector.inflection 'cat', 'cats'
|
31
|
+
Spree::Inflector.inflection 'country', 'countries'
|
32
|
+
Spree::Inflector.inflection 'product', 'products'
|
33
|
+
Spree::Inflector.inflection 'product_property', 'product_properties'
|
34
|
+
Spree::Inflector.inflection 'taxonomy', 'taxonomies'
|
35
|
+
Spree::Inflector.inflection 'variant', 'variants'
|
36
|
+
Spree::Inflector.inflection 'zone', 'zones'
|
data/motion/spree/model.rb
CHANGED
@@ -1,10 +1,14 @@
|
|
1
1
|
module Spree
|
2
|
+
#
|
3
|
+
# This module defines common behavior for all the Models
|
4
|
+
#
|
2
5
|
module Model
|
3
|
-
|
4
|
-
base.send(:extend, ClassMethods)
|
5
|
-
end
|
6
|
+
extend MotionSupport::Concern
|
6
7
|
|
7
8
|
module ClassMethods
|
9
|
+
#
|
10
|
+
# Define the properties or attributes of the model.
|
11
|
+
#
|
8
12
|
def define_model_attributes(*attrs)
|
9
13
|
define_method :attributes do
|
10
14
|
attrs
|
@@ -16,6 +20,9 @@ module Spree
|
|
16
20
|
end
|
17
21
|
end
|
18
22
|
|
23
|
+
#
|
24
|
+
# The initializer receives a hash with the attributes
|
25
|
+
#
|
19
26
|
def initialize(attributes = {})
|
20
27
|
self.attributes.each do |attr|
|
21
28
|
send("#{attr}=", attributes[attr.to_s])
|
@@ -1,31 +1,16 @@
|
|
1
1
|
describe Spree::API::Product do
|
2
|
-
|
3
|
-
|
2
|
+
#
|
3
|
+
# Legacy tests, now work as semi-integration tests
|
4
|
+
#
|
4
5
|
describe ".products_uri" do
|
5
|
-
it "returns the
|
6
|
+
it "returns the complete URI for the list of products" do
|
6
7
|
Spree.products_uri.should == Spree.endpoint + "/products"
|
7
8
|
end
|
8
9
|
end
|
9
10
|
|
10
|
-
describe ".
|
11
|
-
|
12
|
-
|
13
|
-
stub_request(:get, Spree.products_uri).
|
14
|
-
to_return(json: load_webstub_response("products.json"))
|
15
|
-
|
16
|
-
@products = nil
|
17
|
-
Spree.products do |p|
|
18
|
-
@products = p
|
19
|
-
resume
|
20
|
-
end
|
21
|
-
|
22
|
-
wait_max 1 do
|
23
|
-
@products
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
it "returns an array of Spree::Product objects" do
|
28
|
-
@products.all? { |p| p.is_a?(Spree::Product) }.should == true
|
11
|
+
describe ".product_uri" do
|
12
|
+
it "returns the complete URI for a product" do
|
13
|
+
Spree.product_uri(1).should == Spree.products_uri + "/1"
|
29
14
|
end
|
30
15
|
end
|
31
16
|
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
module Spree
|
2
|
+
class Foo
|
3
|
+
include Spree::Model
|
4
|
+
|
5
|
+
define_model_attributes :id, :name
|
6
|
+
end
|
7
|
+
|
8
|
+
module API
|
9
|
+
class Foo
|
10
|
+
extend Spree::API::Query
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
describe Spree::API::Query do
|
16
|
+
extend WebStub::SpecHelpers
|
17
|
+
|
18
|
+
before do
|
19
|
+
disable_network_access!
|
20
|
+
end
|
21
|
+
|
22
|
+
describe "#collection_query" do
|
23
|
+
before do
|
24
|
+
@uri = "http://example.com/api/foos"
|
25
|
+
@data = { foos: [{ id: "1", name: "Foo 1" }, { id: "2", name: "Foo 2" }] }
|
26
|
+
stub_request(:get, @uri).
|
27
|
+
to_return(json: @data)
|
28
|
+
|
29
|
+
Spree::API::Foo.collection_query("foos", Spree::Foo, @uri) do |f|
|
30
|
+
@foos = f
|
31
|
+
resume
|
32
|
+
end
|
33
|
+
|
34
|
+
# Wait for the BW::HTTP Thread
|
35
|
+
wait_max 1 { @foos }
|
36
|
+
end
|
37
|
+
|
38
|
+
it "maps received data to objects of the specified class" do
|
39
|
+
@foos.each_with_index do |f, i|
|
40
|
+
f.is_a?(Spree::Foo).should.be.true
|
41
|
+
f.id.should.equal @data[:foos][i][:id]
|
42
|
+
f.name.should.equal @data[:foos][i][:name]
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
describe "#object_query" do
|
48
|
+
before do
|
49
|
+
@uri = "http://example.com/api/foos/1"
|
50
|
+
@data = { id: "1", name: "Foo 1" }
|
51
|
+
stub_request(:get, @uri).
|
52
|
+
to_return(json: @data)
|
53
|
+
|
54
|
+
Spree::API::Foo.object_query(Spree::Foo, @uri) do |f|
|
55
|
+
@foo = f
|
56
|
+
resume
|
57
|
+
end
|
58
|
+
|
59
|
+
# Wait for the BW::HTTP Thread
|
60
|
+
wait_max 1 { @foo }
|
61
|
+
end
|
62
|
+
|
63
|
+
it "maps received data to an object of the specified class" do
|
64
|
+
@foo.is_a?(Spree::Foo).should.be.true
|
65
|
+
@foo.id.should.equal @data[:id]
|
66
|
+
@foo.name.should.equal @data[:name]
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Foo
|
2
|
+
class Cat
|
3
|
+
extend Spree::API::ResourceName
|
4
|
+
end
|
5
|
+
end
|
6
|
+
|
7
|
+
describe Spree::API::ResourceName do
|
8
|
+
it "defines the resource_name method" do
|
9
|
+
Foo::Cat.resource_name.should == "cat"
|
10
|
+
end
|
11
|
+
|
12
|
+
it "defines the resource_name_plural method" do
|
13
|
+
Foo::Cat.resource_name_plural.should == "cats"
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
Spree::Inflector.inflection 'animal', 'animals'
|
2
|
+
|
3
|
+
module Animal
|
4
|
+
extend Spree::API::ResourceName
|
5
|
+
include Spree::API::URI
|
6
|
+
end
|
7
|
+
|
8
|
+
class Dog
|
9
|
+
extend Animal
|
10
|
+
end
|
11
|
+
|
12
|
+
describe Spree::API::URI do
|
13
|
+
describe ".resources_uri" do
|
14
|
+
it "builds a resource collection URI" do
|
15
|
+
Dog.animals_uri.should == "http://example.com/api/animals"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe ".resource_uri" do
|
20
|
+
it "builds a single resource URI" do
|
21
|
+
Dog.animal_uri(1).should == "http://example.com/api/animals/1"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe ".search_uri" do
|
26
|
+
it "builds a search URI" do
|
27
|
+
Dog.animal_search_uri("q").should == "http://example.com/api/animals?q"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
describe Spree::Inflector do
|
2
|
+
describe ".pluralize" do
|
3
|
+
describe "defined Inflection" do
|
4
|
+
it "adds an s to the end of the specified singular" do
|
5
|
+
Spree::Inflector.pluralize("cat").should == "cats"
|
6
|
+
end
|
7
|
+
|
8
|
+
it "pluralizes country" do
|
9
|
+
Spree::Inflector.pluralize("country").should == "countries"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "undefined Inflection" do
|
14
|
+
it "raises Spree::Inflector::UndefinedInflection" do
|
15
|
+
lambda {
|
16
|
+
Spree::Inflector.pluralize("42")
|
17
|
+
}.should.raise(Spree::Inflector::UndefinedInflection)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe ".inflections" do
|
23
|
+
it "defines a new inflection" do
|
24
|
+
Spree::Inflector.inflection 'foo', 'bar'
|
25
|
+
Spree::Inflector.pluralize('foo').should == 'bar'
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/spec/spree_spec.rb
ADDED
data/spree-wrap.gemspec
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: spree-wrap
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Padilla
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-06-
|
11
|
+
date: 2013-06-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bubble-wrap
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - '>='
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: motion-support
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: bundler
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -74,7 +88,6 @@ extensions: []
|
|
74
88
|
extra_rdoc_files: []
|
75
89
|
files:
|
76
90
|
- .gitignore
|
77
|
-
- .repl_history
|
78
91
|
- Gemfile
|
79
92
|
- LICENSE.txt
|
80
93
|
- README.md
|
@@ -82,14 +95,32 @@ files:
|
|
82
95
|
- lib/spree/wrap.rb
|
83
96
|
- lib/spree/wrap/version.rb
|
84
97
|
- motion/spree.rb
|
98
|
+
- motion/spree/api/country.rb
|
85
99
|
- motion/spree/api/product.rb
|
100
|
+
- motion/spree/api/product_property.rb
|
101
|
+
- motion/spree/api/query.rb
|
102
|
+
- motion/spree/api/resource_name.rb
|
103
|
+
- motion/spree/api/taxonomy.rb
|
104
|
+
- motion/spree/api/uri.rb
|
105
|
+
- motion/spree/api/variant.rb
|
106
|
+
- motion/spree/api/zone.rb
|
107
|
+
- motion/spree/country.rb
|
108
|
+
- motion/spree/inflector.rb
|
86
109
|
- motion/spree/model.rb
|
87
110
|
- motion/spree/product.rb
|
111
|
+
- motion/spree/product_property.rb
|
112
|
+
- motion/spree/taxonomy.rb
|
113
|
+
- motion/spree/variant.rb
|
114
|
+
- motion/spree/zone.rb
|
88
115
|
- spec/spec_helper.rb
|
89
116
|
- spec/spree/api/product_spec.rb
|
117
|
+
- spec/spree/api/query_spec.rb
|
118
|
+
- spec/spree/api/resource_name_spec.rb
|
119
|
+
- spec/spree/api/uri_spec.rb
|
120
|
+
- spec/spree/inflector_spec.rb
|
90
121
|
- spec/spree/model_spec.rb
|
91
122
|
- spec/spree/product_spec.rb
|
92
|
-
- spec/
|
123
|
+
- spec/spree_spec.rb
|
93
124
|
- spree-wrap.gemspec
|
94
125
|
homepage: ''
|
95
126
|
licenses:
|
@@ -118,6 +149,10 @@ summary: Consumer for Spree API on Rubymotion
|
|
118
149
|
test_files:
|
119
150
|
- spec/spec_helper.rb
|
120
151
|
- spec/spree/api/product_spec.rb
|
152
|
+
- spec/spree/api/query_spec.rb
|
153
|
+
- spec/spree/api/resource_name_spec.rb
|
154
|
+
- spec/spree/api/uri_spec.rb
|
155
|
+
- spec/spree/inflector_spec.rb
|
121
156
|
- spec/spree/model_spec.rb
|
122
157
|
- spec/spree/product_spec.rb
|
123
|
-
- spec/
|
158
|
+
- spec/spree_spec.rb
|
data/.repl_history
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
File
|
2
|
-
File.open("spec/support/webstub/products.json")
|
3
|
-
File.open("./spec/support/webstub/products.json")
|
4
|
-
__FILE__
|
5
|
-
exit
|
6
|
-
File.expand_path("/Users/dab/spree/spree-wrap/spec/spree/api/product_spec.rb")
|
7
|
-
File.expand_path("/Users/dab/spree/spree-wrap/spec/spree/api/product_spec.rb", "..")
|
8
|
-
File.expand_path("/Users/dab/spree/spree-wrap/spec/spree/api/product_spec.rb", "..", "..")
|
9
|
-
File.expand_path("/Users/dab/spree/spree-wrap/spec/spree/api/product_spec.rb")
|
10
|
-
File.dir_name("/Users/dab/spree/spree-wrap/spec/spree/api/product_spec.rb")
|
11
|
-
File.dirname("/Users/dab/spree/spree-wrap/spec/spree/api/product_spec.rb")
|
12
|
-
APP_ROOT
|
13
|
-
APPLICATION_ROOT
|
14
|
-
APP_ROOT
|
15
|
-
ROOT
|
16
|
-
ROOT_PATH
|
17
|
-
Application
|
18
|
-
Motion
|
19
|
-
Motion::Project
|
20
|
-
BW
|
21
|
-
App
|
22
|
-
App.resources_path
|
23
|
-
App.document_path
|
24
|
-
exit
|
25
|
-
exit
|
26
|
-
exit
|
27
|
-
exit
|
@@ -1 +0,0 @@
|
|
1
|
-
{"count":16,"total_count":16,"current_page":1,"per_page":25,"pages":1,"products":[{"id":1,"name":"Ruby on Rails Tote","description":"Molestias alias sed debitis labore optio. Veniam in exercitationem eaque aut. Quas deleniti omnis et vel cupiditate.","price":"15.99","available_on":"2013-06-12T04:09:25Z","permalink":"ruby-on-rails-tote","meta_description":null,"meta_keywords":null,"taxon_ids":[4],"variants":[{"id":1,"name":"Ruby on Rails Tote","sku":"ROR-00011","price":"15.99","weight":null,"height":null,"width":null,"depth":null,"is_master":true,"cost_price":"17.0","permalink":"ruby-on-rails-tote","count_on_hand":10,"option_values":[],"images":[{"id":21,"position":1,"attachment_content_type":"image/jpeg","attachment_file_name":"ror_tote.jpeg","type":"Spree::Image","attachment_updated_at":"2013-06-12T04:09:44Z","attachment_width":360,"attachment_height":360,"alt":null,"viewable_type":"Spree::Variant","viewable_id":1,"attachment_url":"/spree/products/21/product/ror_tote.jpeg?1371010184"},{"id":22,"position":2,"attachment_content_type":"image/jpeg","attachment_file_name":"ror_tote_back.jpeg","type":"Spree::Image","attachment_updated_at":"2013-06-12T04:09:45Z","attachment_width":360,"attachment_height":360,"alt":null,"viewable_type":"Spree::Variant","viewable_id":1,"attachment_url":"/spree/products/22/product/ror_tote_back.jpeg?1371010185"}]}],"option_types":[],"product_properties":[{"id":25,"product_id":1,"property_id":9,"value":"Tote","property_name":"Type"},{"id":26,"product_id":1,"property_id":10,"value":"15\" x 18\" x 6\"","property_name":"Size"},{"id":27,"product_id":1,"property_id":11,"value":"Canvas","property_name":"Material"}],"reviews":[],"related_products":[]},{"id":2,"name":"Ruby on Rails Bag","description":"Molestias alias sed debitis labore optio. Veniam in exercitationem eaque aut. Quas deleniti omnis et vel cupiditate.","price":"22.99","available_on":"2013-06-12T04:09:25Z","permalink":"ruby-on-rails-bag","meta_description":null,"meta_keywords":null,"taxon_ids":[4],"variants":[{"id":2,"name":"Ruby on Rails Bag","sku":"ROR-00012","price":"22.99","weight":null,"height":null,"width":null,"depth":null,"is_master":true,"cost_price":"21.0","permalink":"ruby-on-rails-bag","count_on_hand":10,"option_values":[],"images":[{"id":23,"position":1,"attachment_content_type":"image/jpeg","attachment_file_name":"ror_bag.jpeg","type":"Spree::Image","attachment_updated_at":"2013-06-12T04:09:46Z","attachment_width":360,"attachment_height":360,"alt":null,"viewable_type":"Spree::Variant","viewable_id":2,"attachment_url":"/spree/products/23/product/ror_bag.jpeg?1371010186"}]}],"option_types":[],"product_properties":[{"id":28,"product_id":2,"property_id":9,"value":"Messenger","property_name":"Type"},{"id":29,"product_id":2,"property_id":10,"value":"14 1/2\" x 12\" x 5\"","property_name":"Size"},{"id":30,"product_id":2,"property_id":11,"value":"600 Denier Polyester","property_name":"Material"}],"reviews":[],"related_products":[]},{"id":3,"name":"Ruby on Rails Baseball Jersey","description":"Molestias alias sed debitis labore optio. Veniam in exercitationem eaque aut. Quas deleniti omnis et vel cupiditate.","price":"19.99","available_on":"2013-06-12T04:09:25Z","permalink":"ruby-on-rails-baseball-jersey","meta_description":null,"meta_keywords":null,"taxon_ids":[8],"variants":[{"id":17,"name":"Ruby on Rails Baseball Jersey","sku":"ROR-00001","price":"19.99","weight":null,"height":null,"width":null,"depth":null,"is_master":false,"cost_price":"17.0","permalink":"ruby-on-rails-baseball-jersey","count_on_hand":10,"option_values":[{"id":15,"name":"Small","presentation":"S","option_type_name":"tshirt-size","option_type_id":1},{"id":40,"name":"Red","presentation":"Red","option_type_name":"tshirt-color","option_type_id":2}],"images":[{"id":1,"position":1,"attachment_content_type":"image/png","attachment_file_name":"ror_baseball_jersey_red.png","type":"Spree::Image","attachment_updated_at":"2013-06-12T04:09:29Z","attachment_width":240,"attachment_height":240,"alt":null,"viewable_type":"Spree::Variant","viewable_id":17,"attachment_url":"/spree/products/1/product/ror_baseball_jersey_red.png?1371010169"},{"id":2,"position":2,"attachment_content_type":"image/png","attachment_file_name":"ror_baseball_jersey_back_red.png","type":"Spree::Image","attachment_updated_at":"2013-06-12T04:09:30Z","attachment_width":240,"attachment_height":240,"alt":null,"viewable_type":"Spree::Variant","viewable_id":17,"attachment_url":"/spree/products/2/product/ror_baseball_jersey_back_red.png?1371010170"}]},{"id":18,"name":"Ruby on Rails Baseball Jersey","sku":"ROR-00002","price":"19.99","weight":null,"height":null,"width":null,"depth":null,"is_master":false,"cost_price":"17.0","permalink":"ruby-on-rails-baseball-jersey","count_on_hand":10,"option_values":[{"id":15,"name":"Small","presentation":"S","option_type_name":"tshirt-size","option_type_id":1},{"id":7,"name":"Blue","presentation":"Blue","option_type_name":"tshirt-color","option_type_id":2}],"images":[{"id":3,"position":1,"attachment_content_type":"image/png","attachment_file_name":"ror_baseball_jersey_blue.png","type":"Spree::Image","attachment_updated_at":"2013-06-12T04:09:31Z","attachment_width":240,"attachment_height":240,"alt":null,"viewable_type":"Spree::Variant","viewable_id":18,"attachment_url":"/spree/products/3/product/ror_baseball_jersey_blue.png?1371010171"},{"id":4,"position":2,"attachment_content_type":"image/png","attachment_file_name":"ror_baseball_jersey_back_blue.png","type":"Spree::Image","attachment_updated_at":"2013-06-12T04:09:31Z","attachment_width":240,"attachment_height":240,"alt":null,"viewable_type":"Spree::Variant","viewable_id":18,"attachment_url":"/spree/products/4/product/ror_baseball_jersey_back_blue.png?1371010171"}]},{"id":19,"name":"Ruby on Rails Baseball Jersey","sku":"ROR-00003","price":"19.99","weight":null,"height":null,"width":null,"depth":null,"is_master":false,"cost_price":"17.0","permalink":"ruby-on-rails-baseball-jersey","count_on_hand":10,"option_values":[{"id":15,"name":"Small","presentation":"S","option_type_name":"tshirt-size","option_type_id":1},{"id":41,"name":"Green","presentation":"Green","option_type_name":"tshirt-color","option_type_id":2}],"images":[{"id":5,"position":1,"attachment_content_type":"image/png","attachment_file_name":"ror_baseball_jersey_green.png","type":"Spree::Image","attachment_updated_at":"2013-06-12T04:09:32Z","attachment_width":240,"attachment_height":240,"alt":null,"viewable_type":"Spree::Variant","viewable_id":19,"attachment_url":"/spree/products/5/product/ror_baseball_jersey_green.png?1371010172"},{"id":6,"position":2,"attachment_content_type":"image/png","attachment_file_name":"ror_baseball_jersey_back_green.png","type":"Spree::Image","attachment_updated_at":"2013-06-12T04:09:33Z","attachment_width":240,"attachment_height":240,"alt":null,"viewable_type":"Spree::Variant","viewable_id":19,"attachment_url":"/spree/products/6/product/ror_baseball_jersey_back_green.png?1371010173"}]},{"id":20,"name":"Ruby on Rails Baseball Jersey","sku":"ROR-00004","price":"19.99","weight":null,"height":null,"width":null,"depth":null,"is_master":false,"cost_price":"17.0","permalink":"ruby-on-rails-baseball-jersey","count_on_hand":10,"option_values":[{"id":30,"name":"Medium","presentation":"M","option_type_name":"tshirt-size","option_type_id":1},{"id":40,"name":"Red","presentation":"Red","option_type_name":"tshirt-color","option_type_id":2}],"images":[{"id":7,"position":1,"attachment_content_type":"image/png","attachment_file_name":"ror_baseball_jersey_red.png","type":"Spree::Image","attachment_updated_at":"2013-06-12T04:09:34Z","attachment_width":240,"attachment_height":240,"alt":null,"viewable_type":"Spree::Variant","viewable_id":20,"attachment_url":"/spree/products/7/product/ror_baseball_jersey_red.png?1371010174"},{"id":8,"position":2,"attachment_content_type":"image/png","attachment_file_name":"ror_baseball_jersey_back_red.png","type":"Spree::Image","attachment_updated_at":"2013-06-12T04:09:34Z","attachment_width":240,"attachment_height":240,"alt":null,"viewable_type":"Spree::Variant","viewable_id":20,"attachment_url":"/spree/products/8/product/ror_baseball_jersey_back_red.png?1371010174"}]},{"id":21,"name":"Ruby on Rails Baseball Jersey","sku":"ROR-00005","price":"19.99","weight":null,"height":null,"width":null,"depth":null,"is_master":false,"cost_price":"17.0","permalink":"ruby-on-rails-baseball-jersey","count_on_hand":10,"option_values":[{"id":30,"name":"Medium","presentation":"M","option_type_name":"tshirt-size","option_type_id":1},{"id":7,"name":"Blue","presentation":"Blue","option_type_name":"tshirt-color","option_type_id":2}],"images":[{"id":9,"position":1,"attachment_content_type":"image/png","attachment_file_name":"ror_baseball_jersey_blue.png","type":"Spree::Image","attachment_updated_at":"2013-06-12T04:09:35Z","attachment_width":240,"attachment_height":240,"alt":null,"viewable_type":"Spree::Variant","viewable_id":21,"attachment_url":"/spree/products/9/product/ror_baseball_jersey_blue.png?1371010175"},{"id":10,"position":2,"attachment_content_type":"image/png","attachment_file_name":"ror_baseball_jersey_back_blue.png","type":"Spree::Image","attachment_updated_at":"2013-06-12T04:09:36Z","attachment_width":240,"attachment_height":240,"alt":null,"viewable_type":"Spree::Variant","viewable_id":21,"attachment_url":"/spree/products/10/product/ror_baseball_jersey_back_blue.png?1371010176"}]},{"id":22,"name":"Ruby on Rails Baseball Jersey","sku":"ROR-00006","price":"19.99","weight":null,"height":null,"width":null,"depth":null,"is_master":false,"cost_price":"17.0","permalink":"ruby-on-rails-baseball-jersey","count_on_hand":10,"option_values":[{"id":30,"name":"Medium","presentation":"M","option_type_name":"tshirt-size","option_type_id":1},{"id":41,"name":"Green","presentation":"Green","option_type_name":"tshirt-color","option_type_id":2}],"images":[{"id":11,"position":1,"attachment_content_type":"image/png","attachment_file_name":"ror_baseball_jersey_green.png","type":"Spree::Image","attachment_updated_at":"2013-06-12T04:09:37Z","attachment_width":240,"attachment_height":240,"alt":null,"viewable_type":"Spree::Variant","viewable_id":22,"attachment_url":"/spree/products/11/product/ror_baseball_jersey_green.png?1371010177"},{"id":12,"position":2,"attachment_content_type":"image/png","attachment_file_name":"ror_baseball_jersey_back_green.png","type":"Spree::Image","attachment_updated_at":"2013-06-12T04:09:37Z","attachment_width":240,"attachment_height":240,"alt":null,"viewable_type":"Spree::Variant","viewable_id":22,"attachment_url":"/spree/products/12/product/ror_baseball_jersey_back_green.png?1371010177"}]},{"id":23,"name":"Ruby on Rails Baseball Jersey","sku":"ROR-00007","price":"19.99","weight":null,"height":null,"width":null,"depth":null,"is_master":false,"cost_price":"17.0","permalink":"ruby-on-rails-baseball-jersey","count_on_hand":10,"option_values":[{"id":31,"name":"Large","presentation":"L","option_type_name":"tshirt-size","option_type_id":1},{"id":40,"name":"Red","presentation":"Red","option_type_name":"tshirt-color","option_type_id":2}],"images":[{"id":13,"position":1,"attachment_content_type":"image/png","attachment_file_name":"ror_baseball_jersey_red.png","type":"Spree::Image","attachment_updated_at":"2013-06-12T04:09:38Z","attachment_width":240,"attachment_height":240,"alt":null,"viewable_type":"Spree::Variant","viewable_id":23,"attachment_url":"/spree/products/13/product/ror_baseball_jersey_red.png?1371010178"},{"id":14,"position":2,"attachment_content_type":"image/png","attachment_file_name":"ror_baseball_jersey_back_red.png","type":"Spree::Image","attachment_updated_at":"2013-06-12T04:09:39Z","attachment_width":240,"attachment_height":240,"alt":null,"viewable_type":"Spree::Variant","viewable_id":23,"attachment_url":"/spree/products/14/product/ror_baseball_jersey_back_red.png?1371010179"}]},{"id":24,"name":"Ruby on Rails Baseball Jersey","sku":"ROR-00008","price":"19.99","weight":null,"height":null,"width":null,"depth":null,"is_master":false,"cost_price":"17.0","permalink":"ruby-on-rails-baseball-jersey","count_on_hand":10,"option_values":[{"id":31,"name":"Large","presentation":"L","option_type_name":"tshirt-size","option_type_id":1},{"id":7,"name":"Blue","presentation":"Blue","option_type_name":"tshirt-color","option_type_id":2}],"images":[{"id":15,"position":1,"attachment_content_type":"image/png","attachment_file_name":"ror_baseball_jersey_blue.png","type":"Spree::Image","attachment_updated_at":"2013-06-12T04:09:40Z","attachment_width":240,"attachment_height":240,"alt":null,"viewable_type":"Spree::Variant","viewable_id":24,"attachment_url":"/spree/products/15/product/ror_baseball_jersey_blue.png?1371010180"},{"id":16,"position":2,"attachment_content_type":"image/png","attachment_file_name":"ror_baseball_jersey_back_blue.png","type":"Spree::Image","attachment_updated_at":"2013-06-12T04:09:40Z","attachment_width":240,"attachment_height":240,"alt":null,"viewable_type":"Spree::Variant","viewable_id":24,"attachment_url":"/spree/products/16/product/ror_baseball_jersey_back_blue.png?1371010180"}]},{"id":25,"name":"Ruby on Rails Baseball Jersey","sku":"ROR-00009","price":"19.99","weight":null,"height":null,"width":null,"depth":null,"is_master":false,"cost_price":"17.0","permalink":"ruby-on-rails-baseball-jersey","count_on_hand":10,"option_values":[{"id":31,"name":"Large","presentation":"L","option_type_name":"tshirt-size","option_type_id":1},{"id":41,"name":"Green","presentation":"Green","option_type_name":"tshirt-color","option_type_id":2}],"images":[{"id":17,"position":1,"attachment_content_type":"image/png","attachment_file_name":"ror_baseball_jersey_green.png","type":"Spree::Image","attachment_updated_at":"2013-06-12T04:09:41Z","attachment_width":240,"attachment_height":240,"alt":null,"viewable_type":"Spree::Variant","viewable_id":25,"attachment_url":"/spree/products/17/product/ror_baseball_jersey_green.png?1371010181"},{"id":18,"position":2,"attachment_content_type":"image/png","attachment_file_name":"ror_baseball_jersey_back_green.png","type":"Spree::Image","attachment_updated_at":"2013-06-12T04:09:42Z","attachment_width":240,"attachment_height":240,"alt":null,"viewable_type":"Spree::Variant","viewable_id":25,"attachment_url":"/spree/products/18/product/ror_baseball_jersey_back_green.png?1371010182"}]},{"id":26,"name":"Ruby on Rails Baseball Jersey","sku":"ROR-00012","price":"19.99","weight":null,"height":null,"width":null,"depth":null,"is_master":false,"cost_price":"17.0","permalink":"ruby-on-rails-baseball-jersey","count_on_hand":10,"option_values":[{"id":4,"name":"Extra Large","presentation":"XL","option_type_name":"tshirt-size","option_type_id":1},{"id":41,"name":"Green","presentation":"Green","option_type_name":"tshirt-color","option_type_id":2}],"images":[{"id":19,"position":1,"attachment_content_type":"image/png","attachment_file_name":"ror_baseball_jersey_green.png","type":"Spree::Image","attachment_updated_at":"2013-06-12T04:09:43Z","attachment_width":240,"attachment_height":240,"alt":null,"viewable_type":"Spree::Variant","viewable_id":26,"attachment_url":"/spree/products/19/product/ror_baseball_jersey_green.png?1371010183"},{"id":20,"position":2,"attachment_content_type":"image/png","attachment_file_name":"ror_baseball_jersey_back_green.png","type":"Spree::Image","attachment_updated_at":"2013-06-12T04:09:43Z","attachment_width":240,"attachment_height":240,"alt":null,"viewable_type":"Spree::Variant","viewable_id":26,"attachment_url":"/spree/products/20/product/ror_baseball_jersey_back_green.png?1371010183"}]},{"id":3,"name":"Ruby on Rails Baseball Jersey","sku":"ROR-001","price":"19.99","weight":null,"height":null,"width":null,"depth":null,"is_master":true,"cost_price":"17.0","permalink":"ruby-on-rails-baseball-jersey","count_on_hand":10,"option_values":[],"images":[{"id":24,"position":1,"attachment_content_type":"image/jpeg","attachment_file_name":"ror_baseball.jpeg","type":"Spree::Image","attachment_updated_at":"2013-06-12T04:09:47Z","attachment_width":360,"attachment_height":360,"alt":null,"viewable_type":"Spree::Variant","viewable_id":3,"attachment_url":"/spree/products/24/product/ror_baseball.jpeg?1371010187"},{"id":25,"position":2,"attachment_content_type":"image/jpeg","attachment_file_name":"ror_baseball_back.jpeg","type":"Spree::Image","attachment_updated_at":"2013-06-12T04:09:48Z","attachment_width":360,"attachment_height":360,"alt":null,"viewable_type":"Spree::Variant","viewable_id":3,"attachment_url":"/spree/products/25/product/ror_baseball_back.jpeg?1371010188"}]}],"option_types":[{"id":1,"name":"tshirt-size","presentation":"Size","position":1,"option_values":[{"id":43,"name":"Small","presentation":"S","option_type_name":"tshirt-size","option_type_id":1},{"id":44,"name":"Medium","presentation":"M","option_type_name":"tshirt-size","option_type_id":1},{"id":45,"name":"Large","presentation":"L","option_type_name":"tshirt-size","option_type_id":1},{"id":46,"name":"Extra Large","presentation":"XL","option_type_name":"tshirt-size","option_type_id":1},{"id":36,"name":"Small","presentation":"S","option_type_name":"tshirt-size","option_type_id":1},{"id":37,"name":"Medium","presentation":"M","option_type_name":"tshirt-size","option_type_id":1},{"id":38,"name":"Large","presentation":"L","option_type_name":"tshirt-size","option_type_id":1},{"id":39,"name":"Extra Large","presentation":"XL","option_type_name":"tshirt-size","option_type_id":1},{"id":29,"name":"Small","presentation":"S","option_type_name":"tshirt-size","option_type_id":1},{"id":30,"name":"Medium","presentation":"M","option_type_name":"tshirt-size","option_type_id":1},{"id":31,"name":"Large","presentation":"L","option_type_name":"tshirt-size","option_type_id":1},{"id":32,"name":"Extra Large","presentation":"XL","option_type_name":"tshirt-size","option_type_id":1},{"id":22,"name":"Small","presentation":"S","option_type_name":"tshirt-size","option_type_id":1},{"id":23,"name":"Medium","presentation":"M","option_type_name":"tshirt-size","option_type_id":1},{"id":24,"name":"Large","presentation":"L","option_type_name":"tshirt-size","option_type_id":1},{"id":25,"name":"Extra Large","presentation":"XL","option_type_name":"tshirt-size","option_type_id":1},{"id":15,"name":"Small","presentation":"S","option_type_name":"tshirt-size","option_type_id":1},{"id":16,"name":"Medium","presentation":"M","option_type_name":"tshirt-size","option_type_id":1},{"id":17,"name":"Large","presentation":"L","option_type_name":"tshirt-size","option_type_id":1},{"id":18,"name":"Extra Large","presentation":"XL","option_type_name":"tshirt-size","option_type_id":1},{"id":8,"name":"Small","presentation":"S","option_type_name":"tshirt-size","option_type_id":1},{"id":9,"name":"Medium","presentation":"M","option_type_name":"tshirt-size","option_type_id":1},{"id":10,"name":"Large","presentation":"L","option_type_name":"tshirt-size","option_type_id":1},{"id":11,"name":"Extra Large","presentation":"XL","option_type_name":"tshirt-size","option_type_id":1},{"id":1,"name":"Small","presentation":"S","option_type_name":"tshirt-size","option_type_id":1},{"id":2,"name":"Medium","presentation":"M","option_type_name":"tshirt-size","option_type_id":1},{"id":3,"name":"Large","presentation":"L","option_type_name":"tshirt-size","option_type_id":1},{"id":4,"name":"Extra Large","presentation":"XL","option_type_name":"tshirt-size","option_type_id":1}]},{"id":2,"name":"tshirt-color","presentation":"Color","position":2,"option_values":[{"id":47,"name":"Red","presentation":"Red","option_type_name":"tshirt-color","option_type_id":2},{"id":48,"name":"Green","presentation":"Green","option_type_name":"tshirt-color","option_type_id":2},{"id":49,"name":"Blue","presentation":"Blue","option_type_name":"tshirt-color","option_type_id":2},{"id":40,"name":"Red","presentation":"Red","option_type_name":"tshirt-color","option_type_id":2},{"id":41,"name":"Green","presentation":"Green","option_type_name":"tshirt-color","option_type_id":2},{"id":42,"name":"Blue","presentation":"Blue","option_type_name":"tshirt-color","option_type_id":2},{"id":33,"name":"Red","presentation":"Red","option_type_name":"tshirt-color","option_type_id":2},{"id":34,"name":"Green","presentation":"Green","option_type_name":"tshirt-color","option_type_id":2},{"id":35,"name":"Blue","presentation":"Blue","option_type_name":"tshirt-color","option_type_id":2},{"id":26,"name":"Red","presentation":"Red","option_type_name":"tshirt-color","option_type_id":2},{"id":27,"name":"Green","presentation":"Green","option_type_name":"tshirt-color","option_type_id":2},{"id":28,"name":"Blue","presentation":"Blue","option_type_name":"tshirt-color","option_type_id":2},{"id":19,"name":"Red","presentation":"Red","option_type_name":"tshirt-color","option_type_id":2},{"id":20,"name":"Green","presentation":"Green","option_type_name":"tshirt-color","option_type_id":2},{"id":21,"name":"Blue","presentation":"Blue","option_type_name":"tshirt-color","option_type_id":2},{"id":12,"name":"Red","presentation":"Red","option_type_name":"tshirt-color","option_type_id":2},{"id":13,"name":"Green","presentation":"Green","option_type_name":"tshirt-color","option_type_id":2},{"id":14,"name":"Blue","presentation":"Blue","option_type_name":"tshirt-color","option_type_id":2},{"id":5,"name":"Red","presentation":"Red","option_type_name":"tshirt-color","option_type_id":2},{"id":6,"name":"Green","presentation":"Green","option_type_name":"tshirt-color","option_type_id":2},{"id":7,"name":"Blue","presentation":"Blue","option_type_name":"tshirt-color","option_type_id":2}]}],"product_properties":[{"id":1,"product_id":3,"property_id":1,"value":"Wilson","property_name":"Manufacturer"},{"id":2,"product_id":3,"property_id":2,"value":"Wannabe Sports","property_name":"Brand"},{"id":3,"product_id":3,"property_id":3,"value":"JK1002","property_name":"Model"},{"id":4,"product_id":3,"property_id":4,"value":"Baseball Jersey","property_name":"Shirt Type"},{"id":5,"product_id":3,"property_id":5,"value":"Long","property_name":"Sleeve Type"},{"id":6,"product_id":3,"property_id":6,"value":"100% cotton","property_name":"Made from"},{"id":7,"product_id":3,"property_id":7,"value":"Loose","property_name":"Fit"},{"id":8,"product_id":3,"property_id":8,"value":"Men's","property_name":"Gender"}],"reviews":[],"related_products":[]},{"id":4,"name":"Ruby on Rails Jr. Spaghetti","description":"Molestias alias sed debitis labore optio. Veniam in exercitationem eaque aut. Quas deleniti omnis et vel cupiditate.","price":"19.99","available_on":"2013-06-12T04:09:25Z","permalink":"ruby-on-rails-jr-spaghetti","meta_description":null,"meta_keywords":null,"taxon_ids":[7],"variants":[{"id":4,"name":"Ruby on Rails Jr. Spaghetti","sku":"ROR-00013","price":"19.99","weight":null,"height":null,"width":null,"depth":null,"is_master":true,"cost_price":"17.0","permalink":"ruby-on-rails-jr-spaghetti","count_on_hand":10,"option_values":[],"images":[{"id":26,"position":1,"attachment_content_type":"image/jpeg","attachment_file_name":"ror_jr_spaghetti.jpeg","type":"Spree::Image","attachment_updated_at":"2013-06-12T04:09:49Z","attachment_width":360,"attachment_height":360,"alt":null,"viewable_type":"Spree::Variant","viewable_id":4,"attachment_url":"/spree/products/26/product/ror_jr_spaghetti.jpeg?1371010189"}]}],"option_types":[],"product_properties":[{"id":9,"product_id":4,"property_id":1,"value":"Jerseys","property_name":"Manufacturer"},{"id":10,"product_id":4,"property_id":2,"value":"Resiliance","property_name":"Brand"},{"id":11,"product_id":4,"property_id":3,"value":"TL174","property_name":"Model"},{"id":12,"product_id":4,"property_id":4,"value":"Jr. Spaghetti T","property_name":"Shirt Type"},{"id":13,"product_id":4,"property_id":5,"value":"None","property_name":"Sleeve Type"},{"id":14,"product_id":4,"property_id":6,"value":"90% Cotton, 10% Nylon","property_name":"Made from"},{"id":15,"product_id":4,"property_id":7,"value":"Form","property_name":"Fit"},{"id":16,"product_id":4,"property_id":8,"value":"Women's","property_name":"Gender"}],"reviews":[],"related_products":[]},{"id":5,"name":"Ruby on Rails Ringer T-Shirt","description":"Molestias alias sed debitis labore optio. Veniam in exercitationem eaque aut. Quas deleniti omnis et vel cupiditate.","price":"19.99","available_on":"2013-06-12T04:09:25Z","permalink":"ruby-on-rails-ringer-t-shirt","meta_description":null,"meta_keywords":null,"taxon_ids":[8],"variants":[{"id":5,"name":"Ruby on Rails Ringer T-Shirt","sku":"ROR-00015","price":"19.99","weight":null,"height":null,"width":null,"depth":null,"is_master":true,"cost_price":"17.0","permalink":"ruby-on-rails-ringer-t-shirt","count_on_hand":10,"option_values":[],"images":[{"id":29,"position":1,"attachment_content_type":"image/jpeg","attachment_file_name":"ror_ringer.jpeg","type":"Spree::Image","attachment_updated_at":"2013-06-12T04:09:51Z","attachment_width":360,"attachment_height":360,"alt":null,"viewable_type":"Spree::Variant","viewable_id":5,"attachment_url":"/spree/products/29/product/ror_ringer.jpeg?1371010191"},{"id":30,"position":2,"attachment_content_type":"image/jpeg","attachment_file_name":"ror_ringer_back.jpeg","type":"Spree::Image","attachment_updated_at":"2013-06-12T04:09:52Z","attachment_width":360,"attachment_height":360,"alt":null,"viewable_type":"Spree::Variant","viewable_id":5,"attachment_url":"/spree/products/30/product/ror_ringer_back.jpeg?1371010192"}]}],"option_types":[],"product_properties":[{"id":17,"product_id":5,"property_id":1,"value":"Jerseys","property_name":"Manufacturer"},{"id":18,"product_id":5,"property_id":2,"value":"Conditioned","property_name":"Brand"},{"id":19,"product_id":5,"property_id":3,"value":"TL9002","property_name":"Model"},{"id":20,"product_id":5,"property_id":4,"value":"Ringer T","property_name":"Shirt Type"},{"id":21,"product_id":5,"property_id":5,"value":"Short","property_name":"Sleeve Type"},{"id":22,"product_id":5,"property_id":6,"value":"100% Vellum","property_name":"Made from"},{"id":23,"product_id":5,"property_id":7,"value":"Loose","property_name":"Fit"},{"id":24,"product_id":5,"property_id":8,"value":"Men's","property_name":"Gender"}],"reviews":[],"related_products":[]},{"id":6,"name":"Ruby Baseball Jersey","description":"Molestias alias sed debitis labore optio. Veniam in exercitationem eaque aut. Quas deleniti omnis et vel cupiditate.","price":"19.99","available_on":"2013-06-12T04:09:25Z","permalink":"ruby-baseball-jersey","meta_description":null,"meta_keywords":null,"taxon_ids":[8],"variants":[{"id":6,"name":"Ruby Baseball Jersey","sku":"RUB-00001","price":"19.99","weight":null,"height":null,"width":null,"depth":null,"is_master":true,"cost_price":"17.0","permalink":"ruby-baseball-jersey","count_on_hand":10,"option_values":[],"images":[{"id":34,"position":1,"attachment_content_type":"image/png","attachment_file_name":"ruby_baseball.png","type":"Spree::Image","attachment_updated_at":"2013-06-12T04:09:55Z","attachment_width":495,"attachment_height":477,"alt":null,"viewable_type":"Spree::Variant","viewable_id":6,"attachment_url":"/spree/products/34/product/ruby_baseball.png?1371010195"}]}],"option_types":[],"product_properties":[],"reviews":[],"related_products":[]},{"id":7,"name":"Apache Baseball Jersey","description":"Molestias alias sed debitis labore optio. Veniam in exercitationem eaque aut. Quas deleniti omnis et vel cupiditate.","price":"19.99","available_on":"2013-06-12T04:09:25Z","permalink":"apache-baseball-jersey","meta_description":null,"meta_keywords":null,"taxon_ids":[8],"variants":[{"id":7,"name":"Apache Baseball Jersey","sku":"APC-00001","price":"19.99","weight":null,"height":null,"width":null,"depth":null,"is_master":true,"cost_price":"17.0","permalink":"apache-baseball-jersey","count_on_hand":10,"option_values":[],"images":[{"id":33,"position":1,"attachment_content_type":"image/png","attachment_file_name":"apache_baseball.png","type":"Spree::Image","attachment_updated_at":"2013-06-12T04:09:54Z","attachment_width":504,"attachment_height":484,"alt":null,"viewable_type":"Spree::Variant","viewable_id":7,"attachment_url":"/spree/products/33/product/apache_baseball.png?1371010194"}]}],"option_types":[],"product_properties":[],"reviews":[],"related_products":[]},{"id":8,"name":"Spree Baseball Jersey","description":"Molestias alias sed debitis labore optio. Veniam in exercitationem eaque aut. Quas deleniti omnis et vel cupiditate.","price":"19.99","available_on":"2013-06-12T04:09:25Z","permalink":"spree-baseball-jersey","meta_description":null,"meta_keywords":null,"taxon_ids":[8],"variants":[{"id":8,"name":"Spree Baseball Jersey","sku":"SPR-00001","price":"19.99","weight":null,"height":null,"width":null,"depth":null,"is_master":true,"cost_price":"17.0","permalink":"spree-baseball-jersey","count_on_hand":10,"option_values":[],"images":[{"id":41,"position":1,"attachment_content_type":"image/jpeg","attachment_file_name":"spree_jersey.jpeg","type":"Spree::Image","attachment_updated_at":"2013-06-12T04:10:01Z","attachment_width":480,"attachment_height":480,"alt":null,"viewable_type":"Spree::Variant","viewable_id":8,"attachment_url":"/spree/products/41/product/spree_jersey.jpeg?1371010201"},{"id":42,"position":2,"attachment_content_type":"image/jpeg","attachment_file_name":"spree_jersey_back.jpeg","type":"Spree::Image","attachment_updated_at":"2013-06-12T04:10:01Z","attachment_width":480,"attachment_height":480,"alt":null,"viewable_type":"Spree::Variant","viewable_id":8,"attachment_url":"/spree/products/42/product/spree_jersey_back.jpeg?1371010201"}]}],"option_types":[{"id":1,"name":"tshirt-size","presentation":"Size","position":1,"option_values":[{"id":43,"name":"Small","presentation":"S","option_type_name":"tshirt-size","option_type_id":1},{"id":44,"name":"Medium","presentation":"M","option_type_name":"tshirt-size","option_type_id":1},{"id":45,"name":"Large","presentation":"L","option_type_name":"tshirt-size","option_type_id":1},{"id":46,"name":"Extra Large","presentation":"XL","option_type_name":"tshirt-size","option_type_id":1},{"id":36,"name":"Small","presentation":"S","option_type_name":"tshirt-size","option_type_id":1},{"id":37,"name":"Medium","presentation":"M","option_type_name":"tshirt-size","option_type_id":1},{"id":38,"name":"Large","presentation":"L","option_type_name":"tshirt-size","option_type_id":1},{"id":39,"name":"Extra Large","presentation":"XL","option_type_name":"tshirt-size","option_type_id":1},{"id":29,"name":"Small","presentation":"S","option_type_name":"tshirt-size","option_type_id":1},{"id":30,"name":"Medium","presentation":"M","option_type_name":"tshirt-size","option_type_id":1},{"id":31,"name":"Large","presentation":"L","option_type_name":"tshirt-size","option_type_id":1},{"id":32,"name":"Extra Large","presentation":"XL","option_type_name":"tshirt-size","option_type_id":1},{"id":22,"name":"Small","presentation":"S","option_type_name":"tshirt-size","option_type_id":1},{"id":23,"name":"Medium","presentation":"M","option_type_name":"tshirt-size","option_type_id":1},{"id":24,"name":"Large","presentation":"L","option_type_name":"tshirt-size","option_type_id":1},{"id":25,"name":"Extra Large","presentation":"XL","option_type_name":"tshirt-size","option_type_id":1},{"id":15,"name":"Small","presentation":"S","option_type_name":"tshirt-size","option_type_id":1},{"id":16,"name":"Medium","presentation":"M","option_type_name":"tshirt-size","option_type_id":1},{"id":17,"name":"Large","presentation":"L","option_type_name":"tshirt-size","option_type_id":1},{"id":18,"name":"Extra Large","presentation":"XL","option_type_name":"tshirt-size","option_type_id":1},{"id":8,"name":"Small","presentation":"S","option_type_name":"tshirt-size","option_type_id":1},{"id":9,"name":"Medium","presentation":"M","option_type_name":"tshirt-size","option_type_id":1},{"id":10,"name":"Large","presentation":"L","option_type_name":"tshirt-size","option_type_id":1},{"id":11,"name":"Extra Large","presentation":"XL","option_type_name":"tshirt-size","option_type_id":1},{"id":1,"name":"Small","presentation":"S","option_type_name":"tshirt-size","option_type_id":1},{"id":2,"name":"Medium","presentation":"M","option_type_name":"tshirt-size","option_type_id":1},{"id":3,"name":"Large","presentation":"L","option_type_name":"tshirt-size","option_type_id":1},{"id":4,"name":"Extra Large","presentation":"XL","option_type_name":"tshirt-size","option_type_id":1}]},{"id":2,"name":"tshirt-color","presentation":"Color","position":2,"option_values":[{"id":47,"name":"Red","presentation":"Red","option_type_name":"tshirt-color","option_type_id":2},{"id":48,"name":"Green","presentation":"Green","option_type_name":"tshirt-color","option_type_id":2},{"id":49,"name":"Blue","presentation":"Blue","option_type_name":"tshirt-color","option_type_id":2},{"id":40,"name":"Red","presentation":"Red","option_type_name":"tshirt-color","option_type_id":2},{"id":41,"name":"Green","presentation":"Green","option_type_name":"tshirt-color","option_type_id":2},{"id":42,"name":"Blue","presentation":"Blue","option_type_name":"tshirt-color","option_type_id":2},{"id":33,"name":"Red","presentation":"Red","option_type_name":"tshirt-color","option_type_id":2},{"id":34,"name":"Green","presentation":"Green","option_type_name":"tshirt-color","option_type_id":2},{"id":35,"name":"Blue","presentation":"Blue","option_type_name":"tshirt-color","option_type_id":2},{"id":26,"name":"Red","presentation":"Red","option_type_name":"tshirt-color","option_type_id":2},{"id":27,"name":"Green","presentation":"Green","option_type_name":"tshirt-color","option_type_id":2},{"id":28,"name":"Blue","presentation":"Blue","option_type_name":"tshirt-color","option_type_id":2},{"id":19,"name":"Red","presentation":"Red","option_type_name":"tshirt-color","option_type_id":2},{"id":20,"name":"Green","presentation":"Green","option_type_name":"tshirt-color","option_type_id":2},{"id":21,"name":"Blue","presentation":"Blue","option_type_name":"tshirt-color","option_type_id":2},{"id":12,"name":"Red","presentation":"Red","option_type_name":"tshirt-color","option_type_id":2},{"id":13,"name":"Green","presentation":"Green","option_type_name":"tshirt-color","option_type_id":2},{"id":14,"name":"Blue","presentation":"Blue","option_type_name":"tshirt-color","option_type_id":2},{"id":5,"name":"Red","presentation":"Red","option_type_name":"tshirt-color","option_type_id":2},{"id":6,"name":"Green","presentation":"Green","option_type_name":"tshirt-color","option_type_id":2},{"id":7,"name":"Blue","presentation":"Blue","option_type_name":"tshirt-color","option_type_id":2}]}],"product_properties":[{"id":43,"product_id":8,"property_id":1,"value":"Wilson","property_name":"Manufacturer"},{"id":44,"product_id":8,"property_id":2,"value":"Wannabe Sports","property_name":"Brand"},{"id":45,"product_id":8,"property_id":3,"value":"JK1002","property_name":"Model"},{"id":46,"product_id":8,"property_id":4,"value":"Baseball Jersey","property_name":"Shirt Type"},{"id":47,"product_id":8,"property_id":5,"value":"Long","property_name":"Sleeve Type"},{"id":48,"product_id":8,"property_id":6,"value":"100% cotton","property_name":"Made from"},{"id":49,"product_id":8,"property_id":7,"value":"Loose","property_name":"Fit"},{"id":50,"product_id":8,"property_id":8,"value":"Men's","property_name":"Gender"}],"reviews":[],"related_products":[]},{"id":9,"name":"Spree Jr. Spaghetti","description":"Molestias alias sed debitis labore optio. Veniam in exercitationem eaque aut. Quas deleniti omnis et vel cupiditate.","price":"19.99","available_on":"2013-06-12T04:09:25Z","permalink":"spree-jr-spaghetti","meta_description":null,"meta_keywords":null,"taxon_ids":[7],"variants":[{"id":9,"name":"Spree Jr. Spaghetti","sku":"SPR-00013","price":"19.99","weight":null,"height":null,"width":null,"depth":null,"is_master":true,"cost_price":"17.0","permalink":"spree-jr-spaghetti","count_on_hand":10,"option_values":[],"images":[{"id":40,"position":1,"attachment_content_type":"image/jpeg","attachment_file_name":"spree_spaghetti.jpeg","type":"Spree::Image","attachment_updated_at":"2013-06-12T04:10:00Z","attachment_width":480,"attachment_height":480,"alt":null,"viewable_type":"Spree::Variant","viewable_id":9,"attachment_url":"/spree/products/40/product/spree_spaghetti.jpeg?1371010200"}]}],"option_types":[],"product_properties":[{"id":51,"product_id":9,"property_id":1,"value":"Jerseys","property_name":"Manufacturer"},{"id":52,"product_id":9,"property_id":2,"value":"Resiliance","property_name":"Brand"},{"id":53,"product_id":9,"property_id":3,"value":"TL174","property_name":"Model"},{"id":54,"product_id":9,"property_id":4,"value":"Jr. Spaghetti T","property_name":"Shirt Type"},{"id":55,"product_id":9,"property_id":5,"value":"None","property_name":"Sleeve Type"},{"id":56,"product_id":9,"property_id":6,"value":"90% Cotton, 10% Nylon","property_name":"Made from"},{"id":57,"product_id":9,"property_id":7,"value":"Form","property_name":"Fit"},{"id":58,"product_id":9,"property_id":8,"value":"Women's","property_name":"Gender"}],"reviews":[],"related_products":[]},{"id":10,"name":"Spree Ringer T-Shirt","description":"Molestias alias sed debitis labore optio. Veniam in exercitationem eaque aut. Quas deleniti omnis et vel cupiditate.","price":"19.99","available_on":"2013-06-12T04:09:25Z","permalink":"spree-ringer-t-shirt","meta_description":null,"meta_keywords":null,"taxon_ids":[8],"variants":[{"id":10,"name":"Spree Ringer T-Shirt","sku":"SPR-00015","price":"19.99","weight":null,"height":null,"width":null,"depth":null,"is_master":true,"cost_price":"17.0","permalink":"spree-ringer-t-shirt","count_on_hand":10,"option_values":[],"images":[{"id":38,"position":1,"attachment_content_type":"image/jpeg","attachment_file_name":"spree_ringer_t.jpeg","type":"Spree::Image","attachment_updated_at":"2013-06-12T04:09:58Z","attachment_width":480,"attachment_height":480,"alt":null,"viewable_type":"Spree::Variant","viewable_id":10,"attachment_url":"/spree/products/38/product/spree_ringer_t.jpeg?1371010198"},{"id":39,"position":2,"attachment_content_type":"image/jpeg","attachment_file_name":"spree_ringer_t_back.jpeg","type":"Spree::Image","attachment_updated_at":"2013-06-12T04:09:59Z","attachment_width":480,"attachment_height":480,"alt":null,"viewable_type":"Spree::Variant","viewable_id":10,"attachment_url":"/spree/products/39/product/spree_ringer_t_back.jpeg?1371010199"}]}],"option_types":[],"product_properties":[{"id":59,"product_id":10,"property_id":1,"value":"Jerseys","property_name":"Manufacturer"},{"id":60,"product_id":10,"property_id":2,"value":"Conditioned","property_name":"Brand"},{"id":61,"product_id":10,"property_id":3,"value":"TL9002","property_name":"Model"},{"id":62,"product_id":10,"property_id":4,"value":"Ringer T","property_name":"Shirt Type"},{"id":63,"product_id":10,"property_id":5,"value":"Short","property_name":"Sleeve Type"},{"id":64,"product_id":10,"property_id":6,"value":"100% Vellum","property_name":"Made from"},{"id":65,"product_id":10,"property_id":7,"value":"Loose","property_name":"Fit"},{"id":66,"product_id":10,"property_id":8,"value":"Men's","property_name":"Gender"}],"reviews":[],"related_products":[]},{"id":11,"name":"Spree Tote","description":"Molestias alias sed debitis labore optio. Veniam in exercitationem eaque aut. Quas deleniti omnis et vel cupiditate.","price":"15.99","available_on":"2013-06-12T04:09:25Z","permalink":"spree-tote","meta_description":null,"meta_keywords":null,"taxon_ids":[4],"variants":[{"id":11,"name":"Spree Tote","sku":"SPR-00011","price":"15.99","weight":null,"height":null,"width":null,"depth":null,"is_master":true,"cost_price":"13.0","permalink":"spree-tote","count_on_hand":10,"option_values":[],"images":[{"id":36,"position":1,"attachment_content_type":"image/jpeg","attachment_file_name":"spree_tote_front.jpeg","type":"Spree::Image","attachment_updated_at":"2013-06-12T04:09:57Z","attachment_width":480,"attachment_height":480,"alt":null,"viewable_type":"Spree::Variant","viewable_id":11,"attachment_url":"/spree/products/36/product/spree_tote_front.jpeg?1371010197"},{"id":37,"position":2,"attachment_content_type":"image/jpeg","attachment_file_name":"spree_tote_back.jpeg","type":"Spree::Image","attachment_updated_at":"2013-06-12T04:09:57Z","attachment_width":480,"attachment_height":480,"alt":null,"viewable_type":"Spree::Variant","viewable_id":11,"attachment_url":"/spree/products/37/product/spree_tote_back.jpeg?1371010197"}]}],"option_types":[],"product_properties":[{"id":39,"product_id":11,"property_id":9,"value":"Tote","property_name":"Type"},{"id":40,"product_id":11,"property_id":10,"value":"15\" x 18\" x 6\"","property_name":"Size"}],"reviews":[],"related_products":[]},{"id":12,"name":"Spree Bag","description":"Molestias alias sed debitis labore optio. Veniam in exercitationem eaque aut. Quas deleniti omnis et vel cupiditate.","price":"22.99","available_on":"2013-06-12T04:09:25Z","permalink":"spree-bag","meta_description":null,"meta_keywords":null,"taxon_ids":[4],"variants":[{"id":12,"name":"Spree Bag","sku":"SPR-00012","price":"22.99","weight":null,"height":null,"width":null,"depth":null,"is_master":true,"cost_price":"21.0","permalink":"spree-bag","count_on_hand":10,"option_values":[],"images":[{"id":35,"position":1,"attachment_content_type":"image/jpeg","attachment_file_name":"spree_bag.jpeg","type":"Spree::Image","attachment_updated_at":"2013-06-12T04:09:56Z","attachment_width":480,"attachment_height":480,"alt":null,"viewable_type":"Spree::Variant","viewable_id":12,"attachment_url":"/spree/products/35/product/spree_bag.jpeg?1371010196"}]}],"option_types":[],"product_properties":[{"id":41,"product_id":12,"property_id":9,"value":"Messenger","property_name":"Type"},{"id":42,"product_id":12,"property_id":10,"value":"14 1/2\" x 12\" x 5\"","property_name":"Size"}],"reviews":[],"related_products":[]},{"id":13,"name":"Ruby on Rails Mug","description":"Molestias alias sed debitis labore optio. Veniam in exercitationem eaque aut. Quas deleniti omnis et vel cupiditate.","price":"13.99","available_on":"2013-06-12T04:09:25Z","permalink":"ruby-on-rails-mug","meta_description":null,"meta_keywords":null,"taxon_ids":[5],"variants":[{"id":13,"name":"Ruby on Rails Mug","sku":"ROR-00014","price":"13.99","weight":null,"height":null,"width":null,"depth":null,"is_master":true,"cost_price":"11.0","permalink":"ruby-on-rails-mug","count_on_hand":10,"option_values":[],"images":[{"id":27,"position":1,"attachment_content_type":"image/jpeg","attachment_file_name":"ror_mug.jpeg","type":"Spree::Image","attachment_updated_at":"2013-06-12T04:09:49Z","attachment_width":360,"attachment_height":360,"alt":null,"viewable_type":"Spree::Variant","viewable_id":13,"attachment_url":"/spree/products/27/product/ror_mug.jpeg?1371010189"},{"id":28,"position":2,"attachment_content_type":"image/jpeg","attachment_file_name":"ror_mug_back.jpeg","type":"Spree::Image","attachment_updated_at":"2013-06-12T04:09:50Z","attachment_width":360,"attachment_height":360,"alt":null,"viewable_type":"Spree::Variant","viewable_id":13,"attachment_url":"/spree/products/28/product/ror_mug_back.jpeg?1371010190"}]}],"option_types":[],"product_properties":[{"id":31,"product_id":13,"property_id":9,"value":"Mug","property_name":"Type"},{"id":32,"product_id":13,"property_id":10,"value":"4.5\" tall, 3.25\" dia.","property_name":"Size"}],"reviews":[],"related_products":[]},{"id":14,"name":"Ruby on Rails Stein","description":"Molestias alias sed debitis labore optio. Veniam in exercitationem eaque aut. Quas deleniti omnis et vel cupiditate.","price":"16.99","available_on":"2013-06-12T04:09:25Z","permalink":"ruby-on-rails-stein","meta_description":null,"meta_keywords":null,"taxon_ids":[5],"variants":[{"id":14,"name":"Ruby on Rails Stein","sku":"ROR-00016","price":"16.99","weight":null,"height":null,"width":null,"depth":null,"is_master":true,"cost_price":"15.0","permalink":"ruby-on-rails-stein","count_on_hand":10,"option_values":[],"images":[{"id":31,"position":1,"attachment_content_type":"image/jpeg","attachment_file_name":"ror_stein.jpeg","type":"Spree::Image","attachment_updated_at":"2013-06-12T04:09:52Z","attachment_width":360,"attachment_height":360,"alt":null,"viewable_type":"Spree::Variant","viewable_id":14,"attachment_url":"/spree/products/31/product/ror_stein.jpeg?1371010192"},{"id":32,"position":2,"attachment_content_type":"image/jpeg","attachment_file_name":"ror_stein_back.jpeg","type":"Spree::Image","attachment_updated_at":"2013-06-12T04:09:53Z","attachment_width":360,"attachment_height":360,"alt":null,"viewable_type":"Spree::Variant","viewable_id":14,"attachment_url":"/spree/products/32/product/ror_stein_back.jpeg?1371010193"}]}],"option_types":[],"product_properties":[{"id":33,"product_id":14,"property_id":9,"value":"Stein","property_name":"Type"},{"id":34,"product_id":14,"property_id":10,"value":"6.75\" tall, 3.75\" dia. base, 3\" dia. rim","property_name":"Size"}],"reviews":[],"related_products":[]},{"id":15,"name":"Spree Stein","description":"Molestias alias sed debitis labore optio. Veniam in exercitationem eaque aut. Quas deleniti omnis et vel cupiditate.","price":"16.99","available_on":"2013-06-12T04:09:25Z","permalink":"spree-stein","meta_description":null,"meta_keywords":null,"taxon_ids":[5],"variants":[{"id":15,"name":"Spree Stein","sku":"SPR-00016","price":"16.99","weight":null,"height":null,"width":null,"depth":null,"is_master":true,"cost_price":"15.0","permalink":"spree-stein","count_on_hand":10,"option_values":[],"images":[{"id":43,"position":1,"attachment_content_type":"image/jpeg","attachment_file_name":"spree_stein.jpeg","type":"Spree::Image","attachment_updated_at":"2013-06-12T04:10:02Z","attachment_width":480,"attachment_height":480,"alt":null,"viewable_type":"Spree::Variant","viewable_id":15,"attachment_url":"/spree/products/43/product/spree_stein.jpeg?1371010202"},{"id":44,"position":2,"attachment_content_type":"image/jpeg","attachment_file_name":"spree_stein_back.jpeg","type":"Spree::Image","attachment_updated_at":"2013-06-12T04:10:03Z","attachment_width":480,"attachment_height":480,"alt":null,"viewable_type":"Spree::Variant","viewable_id":15,"attachment_url":"/spree/products/44/product/spree_stein_back.jpeg?1371010203"}]}],"option_types":[],"product_properties":[{"id":35,"product_id":15,"property_id":9,"value":"Stein","property_name":"Type"},{"id":36,"product_id":15,"property_id":10,"value":"6.75\" tall, 3.75\" dia. base, 3\" dia. rim","property_name":"Size"}],"reviews":[],"related_products":[]},{"id":16,"name":"Spree Mug","description":"Molestias alias sed debitis labore optio. Veniam in exercitationem eaque aut. Quas deleniti omnis et vel cupiditate.","price":"13.99","available_on":"2013-06-12T04:09:25Z","permalink":"spree-mug","meta_description":null,"meta_keywords":null,"taxon_ids":[5],"variants":[{"id":16,"name":"Spree Mug","sku":"SPR-00014","price":"13.99","weight":null,"height":null,"width":null,"depth":null,"is_master":true,"cost_price":"11.0","permalink":"spree-mug","count_on_hand":10,"option_values":[],"images":[{"id":45,"position":1,"attachment_content_type":"image/jpeg","attachment_file_name":"spree_mug.jpeg","type":"Spree::Image","attachment_updated_at":"2013-06-12T04:10:04Z","attachment_width":240,"attachment_height":240,"alt":null,"viewable_type":"Spree::Variant","viewable_id":16,"attachment_url":"/spree/products/45/product/spree_mug.jpeg?1371010204"},{"id":46,"position":2,"attachment_content_type":"image/jpeg","attachment_file_name":"spree_mug_back.jpeg","type":"Spree::Image","attachment_updated_at":"2013-06-12T04:10:05Z","attachment_width":240,"attachment_height":240,"alt":null,"viewable_type":"Spree::Variant","viewable_id":16,"attachment_url":"/spree/products/46/product/spree_mug_back.jpeg?1371010205"}]}],"option_types":[],"product_properties":[{"id":37,"product_id":16,"property_id":9,"value":"Mug","property_name":"Type"},{"id":38,"product_id":16,"property_id":10,"value":"4.5\" tall, 3.25\" dia.","property_name":"Size"}],"reviews":[],"related_products":[{"id":15,"permalink":"spree-stein","name":"Spree Stein","image_url":"/spree/products/43/small/spree_stein.jpeg?1371010202"}]}]}
|