workarea-core 3.4.44 → 3.5.0.beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (427) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +52 -0
  3. data/app/assets/javascripts/workarea/core/modules/duplicate_id.js +1 -5
  4. data/app/assets/javascripts/workarea/core/modules/style_guide_autocomplete_fields.js +9 -42
  5. data/app/assets/javascripts/workarea/core/modules/url.js +14 -0
  6. data/app/controllers/workarea/application_controller.rb +5 -1
  7. data/app/controllers/workarea/authentication.rb +15 -26
  8. data/app/controllers/workarea/authorization.rb +3 -3
  9. data/app/controllers/workarea/current_referrer.rb +1 -2
  10. data/app/controllers/workarea/current_release.rb +1 -1
  11. data/app/controllers/workarea/current_segments.rb +52 -0
  12. data/app/controllers/workarea/current_tracking.rb +45 -0
  13. data/app/controllers/workarea/http_caching.rb +30 -0
  14. data/app/controllers/workarea/impersonation.rb +18 -44
  15. data/app/helpers/workarea/schema_org_helper.rb +21 -0
  16. data/app/mailers/workarea/application_mailer.rb +2 -4
  17. data/app/middleware/workarea/application_middleware.rb +44 -0
  18. data/app/middleware/workarea/query_cache_middleware.rb +55 -0
  19. data/app/middleware/workarea/release_server_middleware.rb +1 -1
  20. data/app/models/workarea/application_document.rb +1 -1
  21. data/app/models/workarea/bulk_action/product_edit.rb +6 -6
  22. data/app/models/workarea/calculate_percent_change.rb +1 -1
  23. data/app/models/workarea/catalog/category.rb +0 -2
  24. data/app/models/workarea/catalog/product.rb +19 -2
  25. data/app/models/workarea/checkout.rb +18 -6
  26. data/app/models/workarea/checkout/collect_payment.rb +10 -1
  27. data/app/models/workarea/checkout/fraud/analyzer.rb +44 -0
  28. data/app/models/workarea/checkout/fraud/no_decision_analyzer.rb +14 -0
  29. data/app/models/workarea/checkout/fraud/test_analyzer.rb +26 -0
  30. data/app/models/workarea/configuration/admin.rb +25 -0
  31. data/app/models/workarea/configuration/params.rb +45 -0
  32. data/app/models/workarea/content.rb +12 -82
  33. data/app/models/workarea/content/asset.rb +5 -18
  34. data/app/models/workarea/content/block.rb +8 -2
  35. data/app/models/workarea/content/block_draft.rb +7 -2
  36. data/app/models/workarea/content/block_type.rb +2 -2
  37. data/app/models/workarea/content/block_type_definition.rb +4 -0
  38. data/app/models/workarea/content/preset.rb +1 -1
  39. data/app/models/workarea/data_file/csv.rb +6 -8
  40. data/app/models/workarea/data_file/import.rb +9 -1
  41. data/app/models/workarea/data_file/json.rb +1 -20
  42. data/app/models/workarea/data_file/operation.rb +0 -4
  43. data/app/models/workarea/data_file/tax_rates.rb +3 -0
  44. data/app/models/workarea/featured_products.rb +8 -0
  45. data/app/models/workarea/fulfillment/policies/base.rb +21 -0
  46. data/app/models/workarea/fulfillment/policies/download.rb +21 -0
  47. data/app/models/workarea/fulfillment/policies/ignore.rb +11 -0
  48. data/app/models/workarea/fulfillment/policies/ship.rb +15 -0
  49. data/app/models/workarea/fulfillment/sku.rb +72 -0
  50. data/app/models/workarea/fulfillment/token.rb +36 -0
  51. data/app/models/workarea/inquiry.rb +1 -2
  52. data/app/models/workarea/insights/customer_acquisition.rb +5 -9
  53. data/app/models/workarea/insights/trending_products.rb +2 -2
  54. data/app/models/workarea/insights/trending_searches.rb +2 -2
  55. data/app/models/workarea/inventory/collection.rb +30 -0
  56. data/app/models/workarea/inventory/collection_status.rb +40 -0
  57. data/app/models/workarea/metrics/affinity.rb +33 -0
  58. data/app/models/workarea/metrics/country_by_day.rb +4 -0
  59. data/app/models/workarea/metrics/product_by_day.rb +3 -0
  60. data/app/models/workarea/metrics/product_by_week.rb +2 -0
  61. data/app/models/workarea/metrics/product_for_last_week.rb +8 -12
  62. data/app/models/workarea/metrics/sales_by_day.rb +5 -0
  63. data/app/models/workarea/metrics/search_by_day.rb +1 -3
  64. data/app/models/workarea/metrics/search_for_last_week.rb +5 -11
  65. data/app/models/workarea/metrics/segment_by_day.rb +31 -0
  66. data/app/models/workarea/metrics/sku_by_day.rb +3 -0
  67. data/app/models/workarea/metrics/tender_by_day.rb +11 -0
  68. data/app/models/workarea/metrics/update_user_aggregations.rb +77 -0
  69. data/app/models/workarea/metrics/user.rb +73 -87
  70. data/app/models/workarea/navigation/breadcrumbs.rb +10 -1
  71. data/app/models/workarea/order.rb +47 -4
  72. data/app/models/workarea/order/fraud_decision.rb +18 -0
  73. data/app/models/workarea/order/item.rb +5 -0
  74. data/app/models/workarea/order/queries.rb +1 -0
  75. data/app/models/workarea/order/status.rb +10 -1
  76. data/app/models/workarea/payment.rb +7 -2
  77. data/app/models/workarea/payment/credit_card.rb +12 -0
  78. data/app/models/workarea/pricing/cache_key.rb +9 -3
  79. data/app/models/workarea/pricing/calculator.rb +5 -1
  80. data/app/models/workarea/pricing/calculators/tax_calculator.rb +32 -5
  81. data/app/models/workarea/pricing/discount.rb +2 -3
  82. data/app/models/workarea/pricing/discount/application_group.rb +8 -3
  83. data/app/models/workarea/pricing/discount/free_gift.rb +2 -1
  84. data/app/models/workarea/pricing/discount/redemption.rb +1 -1
  85. data/app/models/workarea/pricing/item_tax_applier.rb +41 -0
  86. data/app/models/workarea/pricing/price.rb +1 -0
  87. data/app/models/workarea/pricing/request.rb +11 -0
  88. data/app/models/workarea/pricing/sku.rb +1 -0
  89. data/app/models/workarea/pricing/tax_application.rb +21 -0
  90. data/app/models/workarea/pricing/tax_applier.rb +12 -15
  91. data/app/models/workarea/pricing/unsupported_segmentation.rb +22 -0
  92. data/app/models/workarea/product_rule.rb +5 -0
  93. data/app/models/workarea/releasable.rb +83 -89
  94. data/app/models/workarea/release.rb +72 -99
  95. data/app/models/workarea/release/activation.rb +45 -0
  96. data/app/models/workarea/release/changes.rb +45 -0
  97. data/app/models/workarea/release/changeset.rb +42 -52
  98. data/app/models/workarea/release/preview.rb +28 -0
  99. data/app/models/workarea/release/status.rb +2 -24
  100. data/app/models/workarea/release_session.rb +11 -11
  101. data/app/models/workarea/search/admin.rb +17 -39
  102. data/app/models/workarea/search/admin/catalog_product.rb +1 -2
  103. data/app/models/workarea/search/admin/fulfillment_sku.rb +27 -0
  104. data/app/models/workarea/search/admin/order.rb +1 -1
  105. data/app/models/workarea/search/admin/pricing_discount.rb +1 -1
  106. data/app/models/workarea/search/admin/release.rb +1 -4
  107. data/app/models/workarea/search/admin/segment.rb +19 -0
  108. data/app/models/workarea/search/order_text.rb +23 -6
  109. data/app/models/workarea/search/storefront.rb +33 -29
  110. data/app/models/workarea/search/storefront/category_query.rb +152 -0
  111. data/app/models/workarea/search/storefront/product/categories.rb +11 -45
  112. data/app/models/workarea/segment.rb +54 -0
  113. data/app/models/workarea/segment/first_time_customer.rb +8 -0
  114. data/app/models/workarea/segment/first_time_visitor.rb +12 -0
  115. data/app/models/workarea/segment/life_cycle.rb +44 -0
  116. data/app/models/workarea/segment/loyal_customer.rb +12 -0
  117. data/app/models/workarea/segment/returning_customer.rb +14 -0
  118. data/app/models/workarea/segment/returning_visitor.rb +12 -0
  119. data/app/models/workarea/segment/rules/base.rb +16 -0
  120. data/app/models/workarea/segment/rules/browser_info.rb +29 -0
  121. data/app/models/workarea/segment/rules/geolocation.rb +29 -0
  122. data/app/models/workarea/segment/rules/geolocation_option.rb +53 -0
  123. data/app/models/workarea/segment/rules/last_order.rb +14 -0
  124. data/app/models/workarea/segment/rules/logged_in.rb +13 -0
  125. data/app/models/workarea/segment/rules/orders.rb +17 -0
  126. data/app/models/workarea/segment/rules/revenue.rb +17 -0
  127. data/app/models/workarea/segment/rules/sessions.rb +17 -0
  128. data/app/models/workarea/segment/rules/tags.rb +14 -0
  129. data/app/models/workarea/segment/rules/traffic_referrer.rb +18 -0
  130. data/app/models/workarea/segmentable.rb +66 -0
  131. data/app/models/workarea/sort.rb +14 -2
  132. data/app/models/workarea/tax/rate.rb +35 -1
  133. data/app/models/workarea/user/authorization.rb +19 -13
  134. data/app/models/workarea/user/login.rb +4 -0
  135. data/app/models/workarea/user/password_reset.rb +1 -3
  136. data/app/queries/workarea/categorization.rb +3 -3
  137. data/app/queries/workarea/featured_categorization.rb +53 -0
  138. data/app/queries/workarea/order_cancellation_metrics.rb +155 -0
  139. data/app/queries/workarea/order_item_details.rb +16 -3
  140. data/app/queries/workarea/order_metrics.rb +32 -3
  141. data/app/queries/workarea/product_primary_navigation.rb +13 -2
  142. data/app/queries/workarea/product_releases.rb +38 -0
  143. data/app/queries/workarea/recommendation/user_activity_based.rb +14 -6
  144. data/app/queries/workarea/reports/average_order_value.rb +1 -1
  145. data/app/queries/workarea/reports/customers.rb +14 -11
  146. data/app/queries/workarea/reports/first_time_vs_returning_sales.rb +1 -1
  147. data/app/queries/workarea/reports/group_by_time.rb +13 -17
  148. data/app/queries/workarea/reports/sales_by_category.rb +1 -1
  149. data/app/queries/workarea/reports/sales_by_country.rb +10 -3
  150. data/app/queries/workarea/reports/sales_by_discount.rb +1 -1
  151. data/app/queries/workarea/reports/sales_by_menu.rb +1 -1
  152. data/app/queries/workarea/reports/sales_by_product.rb +39 -4
  153. data/app/queries/workarea/reports/sales_by_sku.rb +39 -4
  154. data/app/queries/workarea/reports/sales_by_tender.rb +42 -0
  155. data/app/queries/workarea/reports/sales_by_traffic_referrer.rb +1 -1
  156. data/app/queries/workarea/reports/sales_over_time.rb +10 -3
  157. data/app/queries/workarea/reports/searches.rb +1 -1
  158. data/app/queries/workarea/reports/searches_over_time.rb +1 -1
  159. data/app/queries/workarea/reports/searches_without_results_over_time.rb +1 -1
  160. data/app/queries/workarea/search/admin_fulfillment_skus.rb +20 -0
  161. data/app/queries/workarea/search/admin_releases.rb +1 -4
  162. data/app/queries/workarea/search/admin_search.rb +0 -4
  163. data/app/queries/workarea/search/admin_segments.rb +16 -0
  164. data/app/queries/workarea/search/admin_sorting.rb +1 -1
  165. data/app/queries/workarea/search/pagination.rb +1 -4
  166. data/app/queries/workarea/search/product_display_rules.rb +40 -8
  167. data/app/queries/workarea/search/product_entries.rb +15 -1
  168. data/app/queries/workarea/search/product_search.rb +4 -1
  169. data/app/queries/workarea/search/storefront_search.rb +5 -4
  170. data/app/queries/workarea/search/storefront_search/exact_matches.rb +1 -1
  171. data/app/queries/workarea/search/storefront_search/response.rb +6 -4
  172. data/app/seeds/workarea/assets_seeds.rb +2 -1
  173. data/app/seeds/workarea/insights_seeds.rb +0 -23
  174. data/app/seeds/workarea/orders_seeds.rb +7 -6
  175. data/app/seeds/workarea/products_seeds.rb +2 -0
  176. data/app/seeds/workarea/segments_seeds.rb +8 -0
  177. data/app/seeds/workarea/tax_seeds.rb +3 -3
  178. data/app/services/workarea/cancel_order.rb +8 -3
  179. data/app/services/workarea/copy_order.rb +6 -0
  180. data/app/services/workarea/create_fulfillment.rb +5 -3
  181. data/app/services/workarea/direct_upload.rb +11 -19
  182. data/app/services/workarea/hash_update.rb +1 -18
  183. data/app/services/workarea/packaging.rb +1 -1
  184. data/app/services/workarea/save_publishing.rb +5 -1
  185. data/app/workers/sidekiq/callbacks.rb +4 -52
  186. data/app/workers/sidekiq/callbacks_worker.rb +4 -6
  187. data/app/workers/workarea/bulk_index_admin.rb +2 -2
  188. data/app/workers/workarea/bulk_index_products.rb +6 -5
  189. data/app/workers/workarea/bulk_index_searches.rb +5 -5
  190. data/app/workers/workarea/deactivate_stale_discounts.rb +3 -3
  191. data/app/workers/workarea/generate_insights.rb +1 -1
  192. data/app/workers/workarea/index_admin_search.rb +1 -0
  193. data/app/workers/workarea/index_categorization.rb +4 -7
  194. data/app/workers/workarea/index_category.rb +2 -1
  195. data/app/workers/workarea/index_category_changes.rb +11 -6
  196. data/app/workers/workarea/index_fulfillment_changes.rb +2 -1
  197. data/app/workers/workarea/index_help.rb +2 -1
  198. data/app/workers/workarea/index_page.rb +2 -1
  199. data/app/workers/workarea/index_payment_transactions.rb +2 -1
  200. data/app/workers/workarea/index_product.rb +4 -4
  201. data/app/workers/workarea/index_product_children.rb +4 -3
  202. data/app/workers/workarea/index_product_rule.rb +3 -2
  203. data/app/workers/workarea/index_search_customizations.rb +3 -2
  204. data/app/workers/workarea/index_skus.rb +5 -6
  205. data/app/workers/workarea/keep_product_index_fresh.rb +3 -5
  206. data/app/workers/workarea/process_import.rb +3 -3
  207. data/app/workers/workarea/process_search_recommendations.rb +5 -9
  208. data/app/workers/workarea/publish_release.rb +1 -0
  209. data/app/workers/workarea/save_metrics.rb +116 -0
  210. data/app/workers/workarea/save_order_cancellation_metrics.rb +35 -0
  211. data/app/workers/workarea/save_order_metrics.rb +10 -74
  212. data/app/workers/workarea/status_reporter.rb +2 -4
  213. data/app/workers/workarea/synchronize_user_metrics.rb +17 -0
  214. data/app/workers/workarea/update_payment_profile_email.rb +22 -0
  215. data/app/workers/workarea/verify_scheduled_releases.rb +4 -11
  216. data/config/initializers/00_configuration.rb +185 -0
  217. data/config/initializers/02_assets.rb +1 -0
  218. data/config/initializers/05_scheduled_jobs.rb +0 -7
  219. data/config/initializers/10_rack_middleware.rb +2 -5
  220. data/config/initializers/11_payment.rb +4 -0
  221. data/config/initializers/13_rack_attack.rb +2 -4
  222. data/config/initializers/14_content_block_types.rb +16 -16
  223. data/config/initializers/15_endpoint_monitoring.rb +3 -6
  224. data/config/initializers/{21_premailer.rb → 24_premailer.rb} +1 -0
  225. data/config/initializers/{20_i18n_js.rb → 25_i18n_js.rb} +0 -0
  226. data/config/locales/en.yml +13 -24
  227. data/lib/generators/workarea/content_block_type/templates/initializer.rb +1 -1
  228. data/lib/generators/workarea/install/USAGE +0 -1
  229. data/lib/generators/workarea/install/install_generator.rb +0 -21
  230. data/lib/generators/workarea/install/templates/initializer.rb.erb +1 -1
  231. data/lib/tasks/insights.rake +1 -0
  232. data/lib/tasks/migrate.rake +106 -0
  233. data/lib/tasks/search.rake +17 -19
  234. data/lib/tasks/tests.rake +1 -1
  235. data/lib/workarea.rb +102 -3
  236. data/lib/workarea/cache.rb +6 -35
  237. data/lib/workarea/changelog.rake +2 -2
  238. data/lib/workarea/configuration.rb +121 -148
  239. data/lib/workarea/configuration/administrable/definition.rb +42 -0
  240. data/lib/workarea/configuration/administrable/field.rb +79 -0
  241. data/lib/workarea/configuration/administrable/fieldset.rb +44 -0
  242. data/lib/workarea/configuration/administrable_options.rb +24 -0
  243. data/lib/workarea/configuration/cache_store.rb +3 -1
  244. data/lib/workarea/configuration/content_blocks.rb +17 -0
  245. data/lib/workarea/configuration/mongoid.rb +1 -4
  246. data/lib/workarea/configuration/session.rb +36 -0
  247. data/lib/workarea/configuration/sidekiq.rb +3 -1
  248. data/lib/workarea/core.rb +15 -11
  249. data/lib/workarea/core/engine.rb +3 -58
  250. data/lib/workarea/elasticsearch/document.rb +8 -15
  251. data/lib/workarea/ext/freedom_patches/action_view_cache_helper.rb +4 -6
  252. data/lib/workarea/ext/freedom_patches/active_support_duration.rb +14 -0
  253. data/lib/workarea/ext/freedom_patches/money.rb +11 -0
  254. data/lib/workarea/ext/freedom_patches/premailer.rb +6 -0
  255. data/lib/workarea/ext/freedom_patches/string.rb +19 -4
  256. data/lib/workarea/ext/mongoid/find_ordered.rb +2 -2
  257. data/lib/workarea/ext/mongoid/lookup_hash.rb +30 -0
  258. data/lib/workarea/geolocation.rb +24 -6
  259. data/lib/workarea/routes_constraints/super_admin.rb +1 -1
  260. data/lib/workarea/version.rb +3 -4
  261. data/lib/workarea/visit.rb +92 -0
  262. data/lib/workarea/warnings.rb +95 -0
  263. data/test/dummy/config/initializers/session_store.rb +1 -1
  264. data/test/fixtures/tax_rates.csv +3 -3
  265. data/test/generators/workarea/content_block_type_generator_test.rb +1 -1
  266. data/test/generators/workarea/install_generator_test.rb +0 -13
  267. data/test/integration/workarea/authentication_test.rb +27 -4
  268. data/test/integration/workarea/authorization_test.rb +5 -0
  269. data/test/integration/workarea/cache_varies_integration_test.rb +21 -23
  270. data/test/integration/workarea/monitoring_integration_test.rb +5 -10
  271. data/test/javascripts/duplicate_id_spec.js +1 -7
  272. data/test/javascripts/fixtures/{duplicate_id_fail.html.haml → duplicate_id.html.haml} +0 -1
  273. data/test/javascripts/form_submitting_controls_spec.js +0 -1
  274. data/test/lib/workarea/asset_endpoints/favicons_test.rb +11 -13
  275. data/test/lib/workarea/configuration/administrable/definition_test.rb +71 -0
  276. data/test/lib/workarea/configuration/administrable/field_test.rb +128 -0
  277. data/test/lib/workarea/configuration/administrable/fieldset_test.rb +78 -0
  278. data/test/lib/workarea/configuration/configuration_test.rb +20 -0
  279. data/test/lib/workarea/elasticsearch/document_test.rb +0 -20
  280. data/test/lib/workarea/elasticsearch/query_cache_test.rb +7 -7
  281. data/test/lib/workarea/ext/freedom_patches/money_test.rb +11 -0
  282. data/test/lib/workarea/ext/mongoid/lookup_hash_test.rb +86 -0
  283. data/test/lib/workarea/geolocation_test.rb +20 -0
  284. data/test/mailers/workarea/application_mailer_test.rb +1 -11
  285. data/test/middleware/workarea/query_cache_middleware_test.rb +55 -0
  286. data/test/models/workarea/checkout/collect_payment_test.rb +14 -6
  287. data/test/models/workarea/checkout_test.rb +31 -57
  288. data/test/models/workarea/configuration/params_test.rb +37 -0
  289. data/test/models/workarea/data_file/csv_test.rb +8 -73
  290. data/test/models/workarea/data_file/import_test.rb +31 -0
  291. data/test/models/workarea/data_file/json_test.rb +6 -48
  292. data/test/models/workarea/data_file/tax_test.rb +3 -0
  293. data/test/models/workarea/fulfillment/policies/download_test.rb +39 -0
  294. data/test/models/workarea/fulfillment/sku_test.rb +54 -0
  295. data/test/models/workarea/insights/best_customers_test.rb +5 -2
  296. data/test/models/workarea/insights/best_full_price_customers_test.rb +5 -2
  297. data/test/models/workarea/insights/customer_acquisition_test.rb +1 -1
  298. data/test/models/workarea/insights/customers_at_risk_test.rb +1 -1
  299. data/test/models/workarea/insights/low_aov_customers_test.rb +1 -1
  300. data/test/models/workarea/inventory/collection_test.rb +75 -0
  301. data/test/models/workarea/metrics/affinity_test.rb +85 -0
  302. data/test/models/workarea/metrics/product_by_week_test.rb +27 -31
  303. data/test/models/workarea/metrics/search_by_day_test.rb +3 -0
  304. data/test/models/workarea/metrics/search_by_week_test.rb +27 -31
  305. data/test/models/workarea/metrics/update_user_aggregations_test.rb +62 -0
  306. data/test/models/workarea/metrics/user_test.rb +146 -63
  307. data/test/models/workarea/navigation/breadcrumbs_test.rb +12 -2
  308. data/test/models/workarea/order/queries_test.rb +2 -0
  309. data/test/models/workarea/order_test.rb +44 -0
  310. data/test/models/workarea/payment/address_test.rb +109 -111
  311. data/test/models/workarea/payment/credit_card_integration_test.rb +0 -52
  312. data/test/models/workarea/payment/credit_card_test.rb +5 -0
  313. data/test/models/workarea/pricing/cache_key_test.rb +7 -1
  314. data/test/models/workarea/pricing/calculators/tax_calculator_test.rb +41 -1
  315. data/test/models/workarea/pricing/discount/collection_test.rb +27 -29
  316. data/test/models/workarea/pricing/discount_test.rb +22 -24
  317. data/test/models/workarea/pricing/item_tax_applier_test.rb +83 -0
  318. data/test/models/workarea/pricing/price_test.rb +9 -0
  319. data/test/models/workarea/pricing/request_test.rb +13 -0
  320. data/test/models/workarea/pricing/sku_test.rb +9 -0
  321. data/test/models/workarea/releasable_active_test.rb +113 -0
  322. data/test/models/workarea/releasable_test.rb +69 -120
  323. data/test/models/workarea/release/changeset_test.rb +41 -0
  324. data/test/models/workarea/release_jobs_test.rb +52 -0
  325. data/test/models/workarea/release_previewing_test.rb +43 -0
  326. data/test/models/workarea/release_test.rb +59 -153
  327. data/test/models/workarea/search/admin/content_asset_test.rb +26 -28
  328. data/test/models/workarea/search/order_text_test.rb +35 -0
  329. data/test/models/workarea/search/storefront/category_query_test.rb +81 -0
  330. data/test/models/workarea/search/storefront/product/categories_test.rb +10 -70
  331. data/test/models/workarea/search/storefront/product_test.rb +10 -11
  332. data/test/models/workarea/search/storefront_test.rb +1 -13
  333. data/test/models/workarea/segment/life_cycle_test.rb +24 -0
  334. data/test/models/workarea/segment/rules/browser_info_test.rb +33 -0
  335. data/test/models/workarea/segment/rules/geolocation_option_test.rb +16 -0
  336. data/test/models/workarea/segment/rules/geolocation_test.rb +49 -0
  337. data/test/models/workarea/segment/rules/last_order_test.rb +32 -0
  338. data/test/models/workarea/segment/rules/logged_in_test.rb +25 -0
  339. data/test/models/workarea/segment/rules/orders_test.rb +59 -0
  340. data/test/models/workarea/segment/rules/revenue_test.rb +59 -0
  341. data/test/models/workarea/segment/rules/sessions_test.rb +26 -0
  342. data/test/models/workarea/segment/rules/tags_test.rb +27 -0
  343. data/test/models/workarea/segment/rules/traffic_referrer_test.rb +31 -0
  344. data/test/models/workarea/segment_test.rb +80 -0
  345. data/test/models/workarea/segmentable_test.rb +74 -0
  346. data/test/models/workarea/shipping/address_test.rb +109 -111
  347. data/test/models/workarea/shipping/sku_test.rb +8 -12
  348. data/test/models/workarea/user/password_reset_test.rb +4 -12
  349. data/test/models/workarea/user_test.rb +13 -10
  350. data/test/queries/workarea/admin_search_query_wrapper_test.rb +21 -25
  351. data/test/queries/workarea/categorization_test.rb +49 -0
  352. data/test/queries/workarea/featured_categorization_test.rb +66 -0
  353. data/test/queries/workarea/order_cancellation_metrics_test.rb +203 -0
  354. data/test/queries/workarea/order_item_details_test.rb +17 -0
  355. data/test/queries/workarea/order_metrics_test.rb +12 -0
  356. data/test/queries/workarea/product_releases_test.rb +56 -0
  357. data/test/queries/workarea/recommendation/searches_test.rb +3 -3
  358. data/test/queries/workarea/recommendation/user_activity_based_test.rb +4 -4
  359. data/test/queries/workarea/reports/customers_test.rb +12 -8
  360. data/test/queries/workarea/reports/report_test.rb +4 -6
  361. data/test/queries/workarea/reports/sales_by_country_test.rb +18 -3
  362. data/test/queries/workarea/reports/sales_by_product_test.rb +28 -8
  363. data/test/queries/workarea/reports/sales_by_sku_test.rb +28 -8
  364. data/test/queries/workarea/reports/sales_by_tender_test.rb +100 -0
  365. data/test/queries/workarea/reports/sales_by_traffic_referrer_test.rb +6 -6
  366. data/test/queries/workarea/search/admin_releases_test.rb +1 -26
  367. data/test/queries/workarea/search/admin_search_test.rb +0 -10
  368. data/test/queries/workarea/search/admin_users_test.rb +2 -2
  369. data/test/queries/workarea/search/category_browse_test.rb +53 -0
  370. data/test/queries/workarea/search/facet_sorting/size_test.rb +11 -13
  371. data/test/queries/workarea/search/pagination_test.rb +9 -26
  372. data/test/queries/workarea/search/product_entries_test.rb +27 -0
  373. data/test/queries/workarea/search/product_search_test.rb +0 -16
  374. data/test/queries/workarea/search/storefront_search/response_test.rb +26 -0
  375. data/test/queries/workarea/search/storefront_search_test.rb +34 -36
  376. data/test/services/workarea/cancel_order_test.rb +27 -13
  377. data/test/services/workarea/copy_order_test.rb +17 -0
  378. data/test/services/workarea/direct_upload_test.rb +1 -46
  379. data/test/services/workarea/export_report_test.rb +41 -45
  380. data/test/services/workarea/hash_update_test.rb +12 -12
  381. data/test/services/workarea/packaging_test.rb +9 -11
  382. data/test/services/workarea/save_publishing_test.rb +23 -0
  383. data/test/workers/sidekiq/callbacks_test.rb +0 -22
  384. data/test/workers/workarea/deactivate_stale_discounts_test.rb +2 -2
  385. data/test/workers/workarea/index_category_changes_test.rb +5 -7
  386. data/test/workers/workarea/keep_product_index_fresh_test.rb +1 -1
  387. data/test/workers/workarea/process_import_test.rb +0 -6
  388. data/test/workers/workarea/process_search_recommendations_test.rb +4 -5
  389. data/test/workers/workarea/status_reporter_test.rb +2 -1
  390. data/test/workers/workarea/synchronize_user_metrics_test.rb +57 -0
  391. data/test/workers/workarea/update_payment_profile_email_test.rb +27 -0
  392. data/test/workers/workarea/verify_scheduled_releases_test.rb +0 -26
  393. data/workarea-core.gemspec +12 -10
  394. metadata +188 -78
  395. data/app/assets/javascripts/workarea/core/templates/ui_menu_item.jst.ejs +0 -10
  396. data/app/controllers/workarea/admin_guest_browsing.rb +0 -54
  397. data/app/middleware/workarea/rack_cache_config_middleware.rb +0 -19
  398. data/app/queries/workarea/search/search_suggestions.rb +0 -43
  399. data/app/workers/workarea/bust_discount_cache.rb +0 -16
  400. data/app/workers/workarea/clean_user_activity.rb +0 -11
  401. data/app/workers/workarea/undo_release.rb +0 -15
  402. data/app/workers/workarea/update_email.rb +0 -33
  403. data/lib/generators/workarea/docker/USAGE +0 -16
  404. data/lib/generators/workarea/docker/docker_generator.rb +0 -61
  405. data/lib/generators/workarea/docker/templates/.env.erb +0 -6
  406. data/lib/generators/workarea/docker/templates/Dockerfile.erb +0 -48
  407. data/lib/generators/workarea/docker/templates/docker-compose.yml.erb +0 -72
  408. data/lib/generators/workarea/docker/templates/docker-entrypoint.sh.erb +0 -6
  409. data/lib/generators/workarea/docker/templates/docker-sync.yml.erb +0 -8
  410. data/lib/generators/workarea/docker/templates/docker-wait.sh +0 -11
  411. data/lib/generators/workarea/docker/templates/docker.env +0 -16
  412. data/lib/generators/workarea/docker/templates/docker_init.rb.erb +0 -29
  413. data/lib/workarea/configuration/headless_chrome.rb +0 -42
  414. data/lib/workarea/configuration/puma.rb +0 -37
  415. data/lib/workarea/ext/freedom_patches/i18n_js.rb +0 -27
  416. data/lib/workarea/ext/freedom_patches/mongoid_localized_defaults.rb +0 -25
  417. data/lib/workarea/ext/jbuilder/jbuilder_cache.rb +0 -29
  418. data/lib/workarea/ext/referer_parser/parser.decorator +0 -43
  419. data/lib/workarea/queues_pauser.rb +0 -26
  420. data/lib/workarea/robots.rb +0 -9
  421. data/test/generators/workarea/docker_generator_test.rb +0 -156
  422. data/test/javascripts/fixtures/duplicate_id_pass.html.haml +0 -2
  423. data/test/lib/workarea/ext/freedom_patches/mongoid_localized_defaults_test.rb +0 -25
  424. data/test/lib/workarea/ext/referer_parser/parser_test.rb +0 -20
  425. data/test/queries/workarea/search/search_suggestions_test.rb +0 -29
  426. data/test/workers/workarea/undo_release_test.rb +0 -23
  427. data/test/workers/workarea/update_email_test.rb +0 -39
@@ -46,6 +46,8 @@ module Workarea
46
46
  { regular: sku_price, sale: sale_price < 0 ? 1.to_m : sale_price }
47
47
  ]
48
48
  )
49
+
50
+ Fulfillment::Sku.create!(id: sku)
49
51
  end
50
52
 
51
53
  sizes = product.variants.map { |v| v.details['Size'] }
@@ -0,0 +1,8 @@
1
+ module Workarea
2
+ class SegmentsSeeds
3
+ def perform
4
+ puts 'Adding segments...'
5
+ Workarea::Segment::LifeCycle.create!
6
+ end
7
+ end
8
+ end
@@ -9,13 +9,13 @@ module Workarea
9
9
  )
10
10
 
11
11
  category.rates.create!(
12
- percentage: 0.07,
12
+ region_percentage: 0.07,
13
13
  country: 'US',
14
14
  region: 'PA'
15
15
  )
16
16
 
17
17
  category.rates.create!(
18
- percentage: 0.08,
18
+ region_percentage: 0.08,
19
19
  country: 'US',
20
20
  region: 'NY',
21
21
  tier_min: 0,
@@ -23,7 +23,7 @@ module Workarea
23
23
  )
24
24
 
25
25
  category.rates.create!(
26
- percentage: 0.09,
26
+ region_percentage: 0.09,
27
27
  country: 'US',
28
28
  region: 'NY',
29
29
  tier_min: 200.01
@@ -1,5 +1,3 @@
1
- # TODO: Factor out remaining calls to this service and then remove
2
- # Plugins call Order#cancel directly and no longer go through this service
3
1
  module Workarea
4
2
  class CancelOrder
5
3
  attr_reader :order, :params
@@ -45,7 +43,7 @@ module Workarea
45
43
  refund if refund?
46
44
  update_fulfillment if update_fulfillment?
47
45
 
48
- order.cancel
46
+ order.cancel.tap { |canceled| update_metrics if canceled }
49
47
  end
50
48
 
51
49
  private
@@ -64,5 +62,12 @@ module Workarea
64
62
  def fulfillment
65
63
  @fulfillment ||= Fulfillment.find_or_initialize_by(id: order.id)
66
64
  end
65
+
66
+ def update_metrics
67
+ SaveOrderCancellationMetrics.perform_async(
68
+ order.id,
69
+ occured_at: order.canceled_at
70
+ )
71
+ end
67
72
  end
68
73
  end
@@ -34,6 +34,12 @@ module Workarea
34
34
  cancel_original if cancel_original?
35
35
  end
36
36
 
37
+ def anonymize!
38
+ new_order.update!(user_id: nil, email: nil)
39
+ new_payment.destroy!
40
+ new_shippings.each(&:destroy!)
41
+ end
42
+
37
43
  def save_new_order
38
44
  Workarea.config.copy_order_ignored_fields.each do |field|
39
45
  new_order.send("#{field}=", nil)
@@ -11,10 +11,12 @@ module Workarea
11
11
  def perform
12
12
  @order.items.each do |item|
13
13
  next if fulfillment.items.detect { |i| i.order_item_id == item.id.to_s }
14
+ fulfillment.items.build(order_item_id: item.id, quantity: item.quantity)
14
15
 
15
- fulfillment.items.build(
16
- order_item_id: item.id,
17
- quantity: item.quantity
16
+ Fulfillment::Sku.process!(
17
+ item.sku,
18
+ order_item: item,
19
+ fulfillment: fulfillment
18
20
  )
19
21
  end
20
22
 
@@ -6,26 +6,18 @@ module Workarea
6
6
  uri = URI.parse(request_url)
7
7
  url = "#{uri.scheme}://#{uri.host}"
8
8
  url += ":#{uri.port}" unless uri.port.in? [80, 443]
9
- id = "direct_upload_#{url}"
10
9
 
11
- response = begin
12
- Workarea.s3.get_bucket_cors(Configuration::S3.bucket)
13
- rescue Excon::Error::NotFound
14
- Excon::Response.new(body: { 'CORSConfiguration' => [] })
15
- end
16
-
17
- cors = response.data[:body]
18
-
19
- unless cors['CORSConfiguration'].pluck('ID').include?(id)
20
- cors['CORSConfiguration'] << {
21
- 'ID' => id,
22
- 'AllowedMethod' => 'PUT',
23
- 'AllowedOrigin' => url,
24
- 'AllowedHeader' => '*'
25
- }
26
-
27
- Workarea.s3.put_bucket_cors(Configuration::S3.bucket, cors)
28
- end
10
+ Workarea.s3.put_bucket_cors(
11
+ Configuration::S3.bucket,
12
+ 'CORSConfiguration' => [
13
+ {
14
+ 'ID' => "direct_upload_#{url}",
15
+ 'AllowedMethod' => 'PUT',
16
+ 'AllowedOrigin' => url,
17
+ 'AllowedHeader' => '*'
18
+ }
19
+ ]
20
+ )
29
21
  end
30
22
 
31
23
  attr_reader :type, :filename
@@ -5,30 +5,13 @@ module Workarea
5
5
  parsed.map(&:to_s).map(&:strip).reject(&:blank?) if parsed.present?
6
6
  end
7
7
 
8
- def initialize(original: {}, adds: [], updates: [], removes: [])
9
- @original = original
8
+ def initialize(adds: [], updates: [], removes: [])
10
9
  @adds = Array(adds).flatten.each_slice(2).to_a
11
10
  @updates = Array(updates).flatten.each_slice(2).to_a
12
11
  @removes = Array(removes).flatten
13
12
  end
14
13
 
15
- def result
16
- apply_to(@original.deep_dup)
17
- end
18
-
19
- # TODO v3.6 remove this method, doesn't work when the field is localized
20
- # @deprecated
21
14
  def apply(hash)
22
- warn <<~eos
23
- [DEPRECATION] `HashUpdate#apply` is deprecated and will be removed in
24
- version 3.6.0. Please use `HashUpdate#result` instead.
25
- eos
26
- apply_to(hash)
27
- end
28
-
29
- private
30
-
31
- def apply_to(hash)
32
15
  @adds.each do |tuple|
33
16
  key, value = *tuple
34
17
  hash[key] = self.class.parse_values(value)
@@ -89,7 +89,7 @@ module Workarea
89
89
  end
90
90
 
91
91
  def shippable_items
92
- @order.items.reject(&:digital?)
92
+ @order.items.select(&:requires_shipping?)
93
93
  end
94
94
 
95
95
  def stacked_dimensions
@@ -12,7 +12,7 @@ module Workarea
12
12
  return true if @releasable.blank?
13
13
 
14
14
  Release.with_current(release.try(:id)) do
15
- @releasable.update_attributes!(active: activate?)
15
+ @releasable.update!(active: activate?, active_segment_ids: active_segment_ids)
16
16
  end
17
17
  end
18
18
 
@@ -30,5 +30,9 @@ module Workarea
30
30
  def activate?
31
31
  @params[:activate] != 'never'
32
32
  end
33
+
34
+ def active_segment_ids
35
+ Array.wrap(@params[:active_segment_ids])
36
+ end
33
37
  end
34
38
  end
@@ -7,54 +7,6 @@ module Sidekiq
7
7
  class InvalidConfiguration < RuntimeError; end
8
8
 
9
9
  class << self
10
- # The list of workers that perform Sidekiq callbacks. Used for checking
11
- # whether one of them need to be fired off after a callback happens.
12
- #
13
- # @private
14
- # @return [Array<Class>]
15
- #
16
- def workers
17
- caching_classes? ? workers_list : workers_list.map(&:constantize)
18
- end
19
-
20
- # Add a {Class} to the list of workers to check when running callbacks.
21
- #
22
- # @private
23
- # @param [Class] worker
24
- #
25
- def add_worker(klass)
26
- if caching_classes?
27
- workers_list << klass
28
- elsif !workers_list.include?(klass.name)
29
- workers_list << klass.name
30
- end
31
- end
32
-
33
- # Whether Rails is caching classes, which matters when checking workers to
34
- # run by comparing the worker's configuration with the model running the
35
- # callback.
36
- #
37
- # When we aren't caching classes, we need to use the fully qualified
38
- # constant name to decide since the classes could have been reloaded due
39
- # to code changes.
40
- #
41
- # @return [Boolean]
42
- #
43
- def caching_classes?
44
- ::Rails.application.config.cache_classes
45
- end
46
-
47
- # Convenience reference to the tracked list of workers in the Rails config
48
- #
49
- # @private
50
- # @return [Array<String,Class>]
51
- #
52
- def workers_list
53
- config = ::Rails.application.config
54
- config.sidekiq_callbacks_workers = [] unless config.respond_to?(:sidekiq_callbacks_workers)
55
- config.sidekiq_callbacks_workers
56
- end
57
-
58
10
  # Permanently or temporarily enable callback workers. If
59
11
  # no workers are given, it will enable all callback
60
12
  # workers during the execution of the block or globally if no
@@ -196,7 +148,7 @@ module Sidekiq
196
148
  # finds a problem.
197
149
  #
198
150
  def assert_valid_config!
199
- Sidekiq::Callbacks.workers.each do |worker|
151
+ Sidekiq::CallbacksWorker.workers.each do |worker|
200
152
  if (worker.enqueue_on.values.flatten & [:find, 'find']).any?
201
153
  raise(
202
154
  InvalidConfiguration,
@@ -209,7 +161,7 @@ module Sidekiq
209
161
  private
210
162
 
211
163
  def set_workers(workers, action)
212
- workers = Sidekiq::Callbacks.workers if workers.blank?
164
+ workers = Sidekiq::CallbacksWorker.workers if workers.blank?
213
165
 
214
166
  if !block_given?
215
167
  workers.each(&action)
@@ -245,7 +197,7 @@ module Sidekiq
245
197
  private
246
198
 
247
199
  def _enqueue_callback_workers(kind)
248
- Sidekiq::Callbacks.workers.select(&:enabled?).each do |worker|
200
+ Sidekiq::CallbacksWorker.workers.select(&:enabled?).each do |worker|
249
201
  worker.callbacks.each do |klass, callbacks|
250
202
  if _perform_callback_worker?(klass, callbacks, kind, worker)
251
203
  args = worker.find_callback_args(self)
@@ -267,7 +219,7 @@ module Sidekiq
267
219
  end
268
220
 
269
221
  def _is_a_callback_type_match?(model_class)
270
- return is_a?(model_class) if Sidekiq::Callbacks.caching_classes?
222
+ return is_a?(model_class) if ::Rails.application.config.cache_classes
271
223
 
272
224
  # This is a funny way of doing the same check as `is_a?`.
273
225
  #
@@ -4,17 +4,15 @@ module Sidekiq
4
4
  module CallbacksWorker
5
5
  extend ActiveSupport::Concern
6
6
 
7
+ mattr_accessor :workers
8
+ self.workers = []
9
+
7
10
  included do
8
11
  thread_cattr_accessor :enabled, :inlined
9
- Sidekiq::Callbacks.add_worker(self)
12
+ CallbacksWorker.workers << self
10
13
  end
11
14
 
12
15
  class_methods do
13
- # @deprecated TODO remove this in v3.6
14
- def workers
15
- Sidekiq::Callbacks.workers
16
- end
17
-
18
16
  def enabled?
19
17
  enabled.nil? || !!enabled
20
18
  end
@@ -6,14 +6,14 @@ module Workarea
6
6
 
7
7
  class << self
8
8
  def perform(klass, ids)
9
- ids.each_slice(100) do |group|
9
+ ids.each_slice(Workarea.config.bulk_index_batch_size) do |group|
10
10
  perform_by_models(klass.constantize.in(id: group).to_a)
11
11
  end
12
12
  end
13
13
 
14
14
  def perform_by_models(models)
15
15
  return if models.empty?
16
- Workarea::Search::Admin.bulk { documents_for(models) }
16
+ Workarea::Search::Admin.bulk(documents_for(models))
17
17
  end
18
18
 
19
19
  private
@@ -6,20 +6,21 @@ module Workarea
6
6
 
7
7
  class << self
8
8
  def perform(ids = Catalog::Product.pluck(:id))
9
- ids.each_slice(100) do |group|
9
+ ids.each_slice(Workarea.config.bulk_index_batch_size) do |group|
10
10
  perform_by_models(Catalog::Product.in(id: group).to_a)
11
11
  end
12
12
  end
13
13
 
14
14
  def perform_by_models(products)
15
15
  return if products.blank?
16
+ products = Array.wrap(products)
16
17
 
17
- Search::Storefront.bulk do
18
- Search::ProductEntries.new(products).map(&:as_bulk_document)
19
- end
18
+ documents = Search::ProductEntries.new(products).map(&:as_bulk_document)
19
+ Search::Storefront.bulk(documents)
20
20
 
21
- products.each { |p| p.set(last_indexed_at: Time.current) }
21
+ Catalog::Product.in(id: products.map(&:id)).set(last_indexed_at: Time.current)
22
22
  end
23
+ alias_method :perform_by_model, :perform_by_models
23
24
  end
24
25
 
25
26
  def perform(ids)
@@ -4,7 +4,7 @@ module Workarea
4
4
 
5
5
  class << self
6
6
  def perform(ids = popular_searches.pluck(:id))
7
- ids.each_slice(100) do |group|
7
+ ids.each_slice(Workarea.config.bulk_index_batch_size) do |group|
8
8
  perform_by_models(Metrics::SearchByWeek.in(id: group).to_a)
9
9
  end
10
10
  end
@@ -18,11 +18,11 @@ module Workarea
18
18
  end
19
19
 
20
20
  def perform_by_models(searches)
21
- Search::Storefront.bulk do
22
- searches.map do |model|
23
- Search::Storefront::Search.new(model).as_bulk_document
24
- end
21
+ documents = searches.map do |model|
22
+ Search::Storefront::Search.new(model).as_bulk_document
25
23
  end
24
+
25
+ Search::Storefront.bulk(documents)
26
26
  end
27
27
  end
28
28
 
@@ -29,9 +29,9 @@ module Workarea
29
29
 
30
30
  def all_active_discount_ids
31
31
  Pricing::Discount
32
- .where(:updated_at.lt => Workarea.config.discount_staleness_ttl.ago)
33
- .active
34
- .pluck(:id)
32
+ .where(:created_at.lt => Workarea.config.discount_staleness_ttl.ago)
33
+ .select(&:active?)
34
+ .map(&:id)
35
35
  .map(&:to_s)
36
36
  end
37
37
  end
@@ -25,7 +25,7 @@ module Workarea
25
25
  Metrics::ProductByWeek.append_last_week!
26
26
  Metrics::SearchForLastWeek.aggregate!
27
27
  Metrics::SearchByWeek.append_last_week!
28
- Metrics::User.update_aggregations!
28
+ Metrics::UpdateUserAggregations.update!
29
29
  Insights::Base.subclasses.each(&:generate_weekly!)
30
30
  end
31
31
 
@@ -6,6 +6,7 @@ module Workarea
6
6
  sidekiq_options(
7
7
  queue: 'low',
8
8
  lock: :until_executing,
9
+ query_cache: true,
9
10
  enqueue_on: {
10
11
  ApplicationDocument => [:save, :touch, :destroy],
11
12
  with: -> { [self.class.name, id] },
@@ -4,16 +4,13 @@ module Workarea
4
4
  include Sidekiq::CallbacksWorker
5
5
 
6
6
  sidekiq_options(
7
- enqueue_on: { Catalog::Category => :save },
8
- lock: :until_executing
7
+ enqueue_on: { Catalog::Category => [:save, :save_release_changes] },
8
+ lock: :until_executing,
9
+ query_cache: true
9
10
  )
10
11
 
11
12
  def self.perform(category)
12
- Search::Storefront::Product.delete_category(category.id)
13
-
14
- return unless category.product_rules.present?
15
-
16
- Search::Storefront::Product.add_category(category)
13
+ Search::Storefront::CategoryQuery.new(category).update
17
14
  end
18
15
 
19
16
  def perform(id)
@@ -5,7 +5,8 @@ module Workarea
5
5
 
6
6
  sidekiq_options(
7
7
  enqueue_on: { Catalog::Category => [:save, :destroy] },
8
- lock: :until_executing
8
+ lock: :until_executing,
9
+ query_cache: true
9
10
  )
10
11
 
11
12
  def perform(id)