spree-wrap 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- 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"}]}]}
|