aboutyou-sdk 0.0.24 → 0.0.25

Sign up to get free protection for your applications and to get access to all the features.
Files changed (91) hide show
  1. checksums.yaml +8 -8
  2. data/lib/{aboutyou-sdk/CacheProvider/Dalli.rb → AboutYou/CacheProvider/dalli.rb} +18 -19
  3. data/lib/{aboutyou-sdk/CacheProvider/Redis.rb → AboutYou/CacheProvider/redis.rb} +19 -20
  4. data/lib/{aboutyou-sdk/Criteria/ProductFields.rb → AboutYou/Criteria/product_fields.rb} +25 -27
  5. data/lib/{aboutyou-sdk/Criteria/ProductSearchCriteria.rb → AboutYou/Criteria/product_search_criteria.rb} +128 -123
  6. data/lib/{aboutyou-sdk/Factory/DefaultModelFactory.rb → AboutYou/Factory/default_model_factory.rb} +267 -224
  7. data/lib/AboutYou/Model/Basket/abstract_basket_item.rb +57 -0
  8. data/lib/AboutYou/Model/Basket/basket_item.rb +95 -0
  9. data/lib/AboutYou/Model/Basket/basket_set.rb +199 -0
  10. data/lib/AboutYou/Model/Basket/basket_set_item.rb +54 -0
  11. data/lib/AboutYou/Model/Basket/basket_variant_item.rb +123 -0
  12. data/lib/{aboutyou-sdk/Model/CategoryManager/DefaultCategoryManager.rb → AboutYou/Model/CategoryManager/default_category_manager.rb} +80 -65
  13. data/lib/{aboutyou-sdk/Model/FacetManager/DefaultFacetManager.rb → AboutYou/Model/FacetManager/default_facet_manager.rb} +58 -50
  14. data/lib/{aboutyou-sdk/Model/ProductSearchResult/FacetCount.rb → AboutYou/Model/ProductSearchResult/facet_count.rb} +2 -3
  15. data/lib/AboutYou/Model/ProductSearchResult/facet_counts.rb +67 -0
  16. data/lib/{aboutyou-sdk/Model/ProductSearchResult/PriceRange.rb → AboutYou/Model/ProductSearchResult/price_range.rb} +17 -18
  17. data/lib/AboutYou/Model/ProductSearchResult/sale_counts.rb +79 -0
  18. data/lib/AboutYou/Model/ProductSearchResult/terms_count.rb +40 -0
  19. data/lib/{aboutyou-sdk/Model/AbstractModel.rb → AboutYou/Model/abstract_model.rb} +2 -3
  20. data/lib/{aboutyou-sdk/Model/App.rb → AboutYou/Model/app.rb} +15 -15
  21. data/lib/{aboutyou-sdk/Model/Autocomplete.rb → AboutYou/Model/autocomplete.rb} +25 -32
  22. data/lib/AboutYou/Model/basket.rb +235 -0
  23. data/lib/AboutYou/Model/categories_result.rb +24 -0
  24. data/lib/AboutYou/Model/category.rb +102 -0
  25. data/lib/AboutYou/Model/category_tree.rb +37 -0
  26. data/lib/AboutYou/Model/facet.rb +86 -0
  27. data/lib/AboutYou/Model/facet_group.rb +96 -0
  28. data/lib/AboutYou/Model/facet_group_set.rb +209 -0
  29. data/lib/AboutYou/Model/image.rb +102 -0
  30. data/lib/{aboutyou-sdk/Model/ImageSize.rb → AboutYou/Model/image_size.rb} +9 -5
  31. data/lib/AboutYou/Model/initiate_order.rb +53 -0
  32. data/lib/AboutYou/Model/order.rb +22 -0
  33. data/lib/AboutYou/Model/product.rb +353 -0
  34. data/lib/AboutYou/Model/product_search_result.rb +114 -0
  35. data/lib/AboutYou/Model/products_ean_result.rb +43 -0
  36. data/lib/AboutYou/Model/products_result.rb +56 -0
  37. data/lib/AboutYou/Model/result_error.rb +28 -0
  38. data/lib/AboutYou/Model/variant.rb +214 -0
  39. data/lib/AboutYou/Model/variants_result.rb +91 -0
  40. data/lib/AboutYou/client.rb +128 -0
  41. data/lib/{aboutyou-sdk/Constants.rb → AboutYou/constants.rb} +3 -5
  42. data/lib/AboutYou/query.rb +343 -0
  43. data/lib/AboutYou/query_builder.rb +530 -0
  44. data/lib/ay.rb +566 -0
  45. data/tests/Sinatra-test/Main.rb +3 -0
  46. data/tests/testAutocomplete.rb +5 -6
  47. data/tests/testCatFilter.rb +8 -9
  48. data/tests/testCatTree.rb +3 -3
  49. data/tests/testCategoryCaching.rb +4 -5
  50. data/tests/{testFacetCaching.rb → testDalliCache.rb} +4 -5
  51. data/tests/testFacetTypes.rb +5 -6
  52. data/tests/testFacets.rb +7 -8
  53. data/tests/testFetchFacet.rb +5 -6
  54. data/tests/testJavaScript.rb +3 -4
  55. data/tests/testProdCatLongestPath.rb +7 -8
  56. data/tests/testProductSearchResult.rb +6 -7
  57. data/tests/testProductsByEans.rb +6 -7
  58. data/tests/testProductsByIds.rb +6 -7
  59. data/tests/testRedisCache.rb +4 -5
  60. data/tests/testSuggest.rb +5 -6
  61. data/tests/testVariantsByIds.rb +7 -8
  62. metadata +46 -46
  63. data/lib/aboutyou-sdk.rb +0 -596
  64. data/lib/aboutyou-sdk/Client.rb +0 -134
  65. data/lib/aboutyou-sdk/Model/Basket.rb +0 -268
  66. data/lib/aboutyou-sdk/Model/Basket/AbstractBasketItem.rb +0 -76
  67. data/lib/aboutyou-sdk/Model/Basket/BasketItem.rb +0 -100
  68. data/lib/aboutyou-sdk/Model/Basket/BasketSet.rb +0 -192
  69. data/lib/aboutyou-sdk/Model/Basket/BasketSetItem.rb +0 -46
  70. data/lib/aboutyou-sdk/Model/Basket/BasketVariantItem.rb +0 -137
  71. data/lib/aboutyou-sdk/Model/CategoriesResult.rb +0 -15
  72. data/lib/aboutyou-sdk/Model/Category.rb +0 -126
  73. data/lib/aboutyou-sdk/Model/CategoryTree.rb +0 -35
  74. data/lib/aboutyou-sdk/Model/Facet.rb +0 -105
  75. data/lib/aboutyou-sdk/Model/FacetGroup.rb +0 -110
  76. data/lib/aboutyou-sdk/Model/FacetGroupSet.rb +0 -242
  77. data/lib/aboutyou-sdk/Model/Image.rb +0 -134
  78. data/lib/aboutyou-sdk/Model/InitiateOrder.rb +0 -50
  79. data/lib/aboutyou-sdk/Model/Order.rb +0 -17
  80. data/lib/aboutyou-sdk/Model/Product.rb +0 -335
  81. data/lib/aboutyou-sdk/Model/ProductSearchResult.rb +0 -125
  82. data/lib/aboutyou-sdk/Model/ProductSearchResult/FacetCounts.rb +0 -59
  83. data/lib/aboutyou-sdk/Model/ProductSearchResult/SaleCounts.rb +0 -71
  84. data/lib/aboutyou-sdk/Model/ProductSearchResult/TermsCount.rb +0 -36
  85. data/lib/aboutyou-sdk/Model/ProductsEansResult.rb +0 -47
  86. data/lib/aboutyou-sdk/Model/ProductsResult.rb +0 -52
  87. data/lib/aboutyou-sdk/Model/ResultError.rb +0 -24
  88. data/lib/aboutyou-sdk/Model/Variant.rb +0 -255
  89. data/lib/aboutyou-sdk/Model/VariantsResult.rb +0 -102
  90. data/lib/aboutyou-sdk/Query.rb +0 -350
  91. data/lib/aboutyou-sdk/QueryBuilder.rb +0 -499
@@ -0,0 +1,114 @@
1
+ module AboutYou
2
+ module SDK
3
+ module Model
4
+ ###
5
+ #
6
+ # This class represents a product search result model
7
+ #
8
+ ###
9
+ class ProductSearchResult
10
+ attr_accessor :products
11
+ attr_accessor :page_hash
12
+ attr_accessor :product_count
13
+ attr_accessor :sale_counts
14
+ attr_accessor :price_ranges
15
+ attr_accessor :facets
16
+ attr_accessor :categories
17
+ attr_accessor :raw_facets
18
+
19
+ def initialize
20
+ self.products = {}
21
+ end
22
+
23
+ ###
24
+ # @param \stdClass $json_object
25
+ # @param ModelFactoryInterface $factory
26
+ #
27
+ # @return static
28
+ ###
29
+ def self.create_from_json(json_object, factory)
30
+ product_search_result = new
31
+
32
+ product_search_result.page_hash = json_object['page_hash']
33
+ product_search_result.product_count = json_object['product_count']
34
+ product_search_result.raw_facets = json_object['facets']
35
+
36
+ json_object['products'].each do |json_product|
37
+ product = factory.create_product(json_product)
38
+ product_search_result.products[product.id] = product
39
+ end
40
+
41
+ product_search_result.parse_facets(json_object['facets'], factory)
42
+ # free memory
43
+ json_object['categories'] = nil
44
+ json_object['prices'] = nil
45
+ json_object['sale'] = nil
46
+
47
+ product_search_result.facets = factory.create_facets_counts(
48
+ json_object
49
+ )
50
+
51
+ product_search_result
52
+ end
53
+
54
+ def parse_facets(json_object, factory)
55
+ self.categories = factory.create_categories_facets(
56
+ json_object['categories']
57
+ ) if json_object['categories']
58
+
59
+ self.price_ranges = factory.create_price_ranges(
60
+ json_object['prices']
61
+ ) if json_object['prices']
62
+
63
+ self.sale_counts = factory.create_sale_facet(
64
+ json_object['sale']
65
+ ) if json_object['sale']
66
+ end
67
+
68
+ ###
69
+ # Returns the min price in euro cent or null, if the price range was not requested/selected
70
+ #
71
+ # * @return integer|null
72
+ ###
73
+ def min_price
74
+ return nil if price_ranges.empty?
75
+
76
+ price_ranges.each do |price_range|
77
+ next if price_range.product_count == 0
78
+ return price_range.min
79
+ end
80
+
81
+ price_ranges[0].min
82
+ end
83
+
84
+ ###
85
+ # Returns the max price in euro cent, if the price range was not requested/selected
86
+ #
87
+ # @return integer|null
88
+ ###
89
+ def max_price
90
+ return nil if price_ranges.empty?
91
+
92
+ price_ranges.reverse_each do |price_range|
93
+ next if price_range.product_count == 0
94
+ return price_range.max
95
+ end
96
+
97
+ price_ranges[-1].max
98
+ end
99
+
100
+ ###
101
+ # @return Category[]
102
+ ###
103
+ def category_tree
104
+ top_level_categories = []
105
+ categories.each do |category|
106
+ top_level_categories.push(category) if category.parent.nil?
107
+ end
108
+
109
+ top_level_categories
110
+ end
111
+ end
112
+ end
113
+ end
114
+ end
@@ -0,0 +1,43 @@
1
+ module AboutYou
2
+ module SDK
3
+ module Model
4
+ ###
5
+ #
6
+ # this class represents a products ean result model
7
+ #
8
+ ###
9
+ class ProductsEansResult
10
+ attr_accessor :eans_not_found
11
+ attr_accessor :page_hash
12
+ attr_accessor :errors
13
+ attr_accessor :products
14
+
15
+ ###
16
+ # @param \stdClass $json_object
17
+ # @param ModelFactoryInterface $factory
18
+ #
19
+ # @return static
20
+ ###
21
+ def self.create_from_json(json_object, factory)
22
+ products_ean_result = new
23
+ products_ean_result.products = []
24
+ products_ean_result.eans_not_found = []
25
+ products_ean_result.errors = []
26
+
27
+ products_ean_result.page_hash = json_object['page_hash'] ? json_object['page_hash'] : nil
28
+
29
+ json_object['eans'].each do |json_product|
30
+ if json_product['error_code']
31
+ products_ean_result.errors.push(json_product)
32
+ products_ean_result.eans_not_found.push(json_product['ean'])
33
+ next
34
+ end
35
+ products_ean_result.products.push(factory.create_product(json_product))
36
+ end if json_object['eans']
37
+
38
+ products_ean_result
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,56 @@
1
+ module AboutYou
2
+ module SDK
3
+ module Model
4
+ ###
5
+ #
6
+ # This class represents a products result model
7
+ #
8
+ ###
9
+ class ProductsResult
10
+ include AbstractModel
11
+
12
+ attr_accessor :ids_not_found
13
+ attr_accessor :page_hash
14
+ attr_accessor :errors
15
+ attr_accessor :products
16
+
17
+ ###
18
+ # @param \stdClass $json_object
19
+ # @param ModelFactoryInterface $factory
20
+ #
21
+ # @return static
22
+ ###
23
+ def self.create_from_json(json_object, factory)
24
+ products_result = new
25
+
26
+ products_result.page_hash = json_object['page_hash'] ? json_object['page_hash'] : nil
27
+ products_result.errors = []
28
+ products_result.ids_not_found = []
29
+ products_result.products = {}
30
+
31
+ if json_object['ids']
32
+ json_object['ids'].each do |key, json_product|
33
+ if json_product['error_code']
34
+ products_result.ids_not_found.push(key)
35
+ products_result.errors.push(json_product)
36
+ next
37
+ end
38
+ products_result.products[Integer(key)] = factory.create_product(
39
+ json_product
40
+ )
41
+ end
42
+ end
43
+
44
+ products_result
45
+ end
46
+
47
+ ###
48
+ # @return integer[] array of product ids
49
+ ###
50
+ def products_not_found
51
+ ids_not_found
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,28 @@
1
+ module AboutYou
2
+ module SDK
3
+ module Model
4
+ ###
5
+ #
6
+ # This class represents an result error model
7
+ #
8
+ ###
9
+ module ResultError
10
+ attr_accessor :error_ident
11
+ attr_accessor :error_code
12
+ attr_accessor :error_message
13
+
14
+ def initialize(json_object)
15
+ parse_error_result(json_object)
16
+
17
+ self
18
+ end
19
+
20
+ def parse_error_result(json_object)
21
+ self.error_ident = json_object.key?('error_ident') ? String(json_object['error_ident']) : nil
22
+ self.error_code = json_object.key?('error_code') ? Integer(json_object['error_code']) : 0
23
+ self.error_message = json_object.key?('error_message') ? json_object['error_message'] : nil
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,214 @@
1
+ module AboutYou
2
+ module SDK
3
+ module Model
4
+ ###
5
+ #
6
+ # This class represents a variant model
7
+ #
8
+ ###
9
+ class Variant
10
+ include AbstractModel
11
+
12
+ attr_accessor :factory
13
+ attr_accessor :product
14
+ attr_accessor :id
15
+ attr_accessor :images
16
+ attr_accessor :selected_image
17
+ attr_accessor :about_number
18
+ attr_accessor :facet_groups
19
+ attr_accessor :ean
20
+ attr_accessor :is_default
21
+ attr_accessor :price
22
+ attr_accessor :old_price
23
+ attr_accessor :retail_price
24
+ attr_accessor :additional_info
25
+ attr_accessor :quantity
26
+ attr_accessor :facet_ids
27
+ attr_accessor :first_active_date
28
+ attr_accessor :first_sale_date
29
+ attr_accessor :created_date
30
+ attr_accessor :updated_date
31
+ attr_accessor :color
32
+ attr_accessor :length
33
+ attr_accessor :season_code
34
+
35
+ ###
36
+ # @param \stdClass $json_object
37
+ # @param ModelFactoryInterface $factory
38
+ # @param Product $product
39
+ #
40
+ # @return static
41
+ ###
42
+ def self.create_from_json(json_object, factory, product)
43
+ fail 'MalformedJsonException' unless json_object['id']
44
+
45
+ variant = new
46
+ variant.factory = factory
47
+ variant.product = product
48
+
49
+ variant.images = variant.parse_images(json_object['images'])
50
+ # free memory
51
+ json_object['images'] = nil
52
+
53
+ variant.id = json_object['id']
54
+ variant.about_number = (json_object['about_number']) ? json_object['about_number'] : nil
55
+ variant.ean = (json_object['ean']) ? json_object['ean'] : nil
56
+ variant.is_default = (json_object['default']) ? json_object['default'] : nil
57
+ variant.price = (json_object['price']) ? json_object['price'] : nil
58
+ variant.old_price = (json_object['old_price']) ? json_object['old_price'] : nil
59
+ variant.retail_price = (json_object['retail_price']) ? json_object['retail_price'] : nil
60
+ variant.additional_info = (json_object['additional_info']) ? json_object['additional_info'] : nil
61
+ variant.quantity = (json_object['quantity']) ? json_object['quantity'] : 0
62
+ variant.first_active_date = (json_object['first_active_date']) ? json_object['first_active_date'] : nil
63
+ variant.first_sale_date = (json_object['first_sale_date']) ? json_object['first_sale_date'] : nil
64
+ variant.created_date = (json_object['created_date']) ? json_object['created_date'] : nil
65
+ variant.updated_date = (json_object['updated_date']) ? json_object['updated_date'] : nil
66
+
67
+ variant.facet_ids = variant.parse_facet_ids(json_object)
68
+ variant.facet_groups = variant.generate_facet_group_set(json_object)
69
+ variant.color = variant.facet_group(AboutYou::SDK::Constants::FACET_COLOR)
70
+ variant.length = variant.facet_group(AboutYou::SDK::Constants::FACET_LENGTH)
71
+ variant.season_code = variant.facet_group(AboutYou::SDK::Constants::FACET_SEASON_CODE)
72
+
73
+ variant
74
+ end
75
+
76
+ def parse_images(image_json)
77
+ image_array = []
78
+ image_json.each do |image|
79
+ image_array.push(factory.create_image(image))
80
+ end if image_json
81
+
82
+ image_array
83
+ end
84
+
85
+ ###
86
+ # Get image by given hash.
87
+ #
88
+ # @param string $hash The image hash.
89
+ #
90
+ # @return Image
91
+ ###
92
+ def image_by_hash(hash)
93
+ images.each do |image|
94
+ return image if image.hash == hash
95
+ end
96
+
97
+ nil
98
+ end
99
+
100
+ ###
101
+ # Select a specific image.
102
+ #
103
+ # @param string $hash The image hash or null for default image.
104
+ #
105
+ # @return void
106
+ #
107
+ # @depracted
108
+ ###
109
+ def select_image(hash = nil)
110
+ if hash
111
+ self.selected_image = image_by_hash(hash)
112
+ true
113
+ else
114
+ self.selected_image = nil
115
+ false
116
+ end
117
+ end
118
+
119
+ ###
120
+ # Get selected or default image.
121
+ #
122
+ # @return Image
123
+ ###
124
+ def image
125
+ if selected_image
126
+ return selected_image
127
+ elsif images[0]
128
+ return images[0]
129
+ end
130
+
131
+ nil
132
+ end
133
+
134
+ def parse_facet_ids(json_object)
135
+ ids = {}
136
+
137
+ json_object['attributes'].each do |group, attribute_ids|
138
+ group_id = group[11..group.length] # rm prefix 'attributs_'
139
+ ids[Integer(group_id)] = attribute_ids
140
+ end unless json_object['attributes'].empty?
141
+
142
+ ids
143
+ end
144
+
145
+ def generate_facet_group_set(json_object)
146
+ ids = parse_facet_ids(json_object)
147
+ self.facet_groups = AboutYou::SDK::Model::FacetGroupSet.new(ids)
148
+ end
149
+
150
+ ###
151
+ # @param integer $group_id
152
+ #
153
+ # @return FacetGroup|null
154
+ ###
155
+ def facet_group(group_id)
156
+ facet_groups.group(group_id)
157
+ end
158
+
159
+ ###
160
+ # @return FacetGroup|null
161
+ ###
162
+ def size
163
+ ###
164
+ # @todo: Instance level caching
165
+ ###
166
+ group_id = size_group_id
167
+ facet_group(group_id) unless group_id.empty?
168
+ end
169
+
170
+ ###
171
+ # @return integer|null
172
+ ###
173
+ def size_group_id
174
+ keys = {}
175
+ groups = facet_groups.groups
176
+ size_run = facet_group(AboutYou::SDK::Constants::FACET_SIZE_RUN)
177
+
178
+ groups.each do |group|
179
+ keys[group.name] = group.group_id
180
+ end if groups.is_a?(Array)
181
+
182
+ size_run.facets.each do |facet|
183
+ group_name = facet.value
184
+ return keys[group_name] if keys.key?(group_name)
185
+ end unless size_run.empty?
186
+
187
+ return keys['size'] if keys.key?('size')
188
+
189
+ return keys['size_run'] if keys.key?('size_run')
190
+
191
+ nil
192
+ end
193
+
194
+ ###
195
+ # Returns the quantity per pack for this variant.
196
+ # By default, this returns 1. But some items can have a bigger number.
197
+ #
198
+ # @return int quantity per pack
199
+ ###
200
+ def quantity_per_pack
201
+ facet_group = facet_group(
202
+ AboutYou::SDK::Constants::FACET_QUANTITY_PER_PACK
203
+ )
204
+ return 1 unless facet_group
205
+
206
+ facets = facet_group.facets
207
+ return 1 unless facets
208
+
209
+ facets[0].value
210
+ end
211
+ end
212
+ end
213
+ end
214
+ end