solidus_core 3.0.0 → 4.5.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.
- checksums.yaml +4 -4
- data/README.md +1 -2
- data/Rakefile +7 -2
- data/app/assets/images/logo/solidus.svg +18 -1
- data/app/assets/images/logo/solidus_logo.png +0 -0
- data/app/controllers/spree/base_controller.rb +1 -3
- data/app/helpers/spree/base_helper.rb +3 -3
- data/app/helpers/spree/core/controller_helpers/auth.rb +66 -0
- data/app/helpers/spree/core/controller_helpers/common.rb +82 -0
- data/app/helpers/spree/core/controller_helpers/order.rb +86 -0
- data/app/helpers/spree/core/controller_helpers/payment_parameters.rb +165 -0
- data/{lib/spree/core/controller_helpers/current_host.rb → app/helpers/spree/core/controller_helpers/pricing.rb} +6 -4
- data/app/helpers/spree/core/controller_helpers/search.rb +16 -0
- data/app/helpers/spree/core/controller_helpers/store.rb +19 -0
- data/app/helpers/spree/core/controller_helpers/strong_parameters.rb +74 -0
- data/app/helpers/spree/products_helper.rb +2 -2
- data/app/mailers/spree/base_mailer.rb +1 -1
- data/app/mailers/spree/carton_mailer.rb +1 -1
- data/app/mailers/spree/order_mailer.rb +3 -3
- data/app/mailers/spree/reimbursement_mailer.rb +1 -1
- data/app/models/concerns/spree/active_storage_adapter/attachment.rb +30 -11
- data/app/models/concerns/spree/active_storage_adapter/normalization.rb +1 -1
- data/app/models/concerns/spree/active_storage_adapter.rb +1 -18
- data/app/models/concerns/spree/default_price.rb +30 -10
- data/app/models/concerns/spree/display_money.rb +1 -1
- data/app/models/concerns/spree/metadata.rb +64 -0
- data/app/models/concerns/spree/named_type.rb +2 -0
- data/app/models/concerns/spree/ordered_property_value_list.rb +2 -2
- data/app/models/concerns/spree/ransackable_attributes.rb +9 -5
- data/app/models/concerns/spree/user_address_book.rb +19 -10
- data/app/models/concerns/spree/user_methods.rb +40 -6
- data/app/models/spree/address.rb +11 -9
- data/app/models/spree/adjustment.rb +15 -76
- data/app/models/spree/adjustment_reason.rb +2 -0
- data/app/models/spree/calculator/flat_fee.rb +21 -0
- data/app/models/spree/calculator/returns/default_refund_amount.rb +1 -1
- data/app/models/spree/carton.rb +3 -3
- data/app/models/spree/core/state_machines/inventory_unit.rb +42 -0
- data/app/models/spree/core/state_machines/order/class_methods.rb +217 -0
- data/app/models/spree/core/state_machines/order.rb +42 -0
- data/app/models/spree/core/state_machines/payment.rb +61 -0
- data/app/models/spree/core/state_machines/reimbursement.rb +33 -0
- data/app/models/spree/core/state_machines/return_authorization.rb +32 -0
- data/app/models/spree/core/state_machines/return_item/acceptance_status.rb +51 -0
- data/app/models/spree/core/state_machines/return_item/reception_status.rb +42 -0
- data/app/models/spree/core/state_machines/shipment.rb +58 -0
- data/app/models/spree/country.rb +1 -1
- data/app/models/spree/credit_card.rb +13 -10
- data/app/models/spree/customer_return.rb +6 -3
- data/app/models/spree/deprecated_configurable_class.rb +40 -0
- data/app/models/spree/fulfilment_changer.rb +56 -29
- data/app/models/spree/image/active_storage_attachment.rb +2 -7
- data/app/models/spree/image/paperclip_attachment.rb +2 -2
- data/app/models/spree/inventory_unit.rb +2 -2
- data/app/models/spree/item_total.rb +28 -0
- data/app/models/spree/legacy_user.rb +1 -0
- data/app/models/spree/line_item.rb +26 -8
- data/app/models/spree/log_entry.rb +98 -1
- data/app/models/spree/money.rb +120 -0
- data/app/models/spree/null_promotion_adjuster.rb +13 -0
- data/app/models/spree/null_promotion_advertiser.rb +9 -0
- data/app/models/spree/null_promotion_finder.rb +9 -0
- data/app/models/spree/null_promotion_handler.rb +44 -0
- data/app/models/spree/option_type.rb +1 -1
- data/app/models/spree/option_value.rb +4 -3
- data/app/models/spree/order/number_generator.rb +7 -1
- data/app/models/spree/order.rb +143 -96
- data/app/models/spree/order_cancellations.rb +8 -8
- data/app/models/spree/order_inventory.rb +7 -5
- data/app/models/spree/order_merger.rb +5 -7
- data/app/models/spree/order_mutex.rb +2 -2
- data/app/models/spree/order_shipping.rb +15 -19
- data/app/models/spree/order_taxation.rb +7 -4
- data/app/models/spree/order_update_attributes.rb +3 -1
- data/app/models/spree/order_updater.rb +25 -63
- data/app/models/spree/payment/processing.rb +60 -57
- data/app/models/spree/payment.rb +14 -27
- data/app/models/spree/payment_create.rb +1 -1
- data/app/models/spree/payment_method/bogus_credit_card.rb +18 -14
- data/app/models/spree/payment_method/credit_card.rb +0 -4
- data/app/models/spree/payment_method/simple_bogus_credit_card.rb +18 -4
- data/app/models/spree/payment_method/store_credit.rb +1 -1
- data/app/models/spree/payment_method.rb +29 -10
- data/app/models/spree/payment_source.rb +5 -1
- data/app/models/spree/permission_set.rb +11 -0
- data/app/models/spree/permission_sets/base.rb +45 -0
- data/app/models/spree/permission_sets/configuration_display.rb +53 -0
- data/app/models/spree/permission_sets/configuration_management.rb +52 -0
- data/app/models/spree/permission_sets/dashboard_display.rb +28 -0
- data/app/models/spree/permission_sets/default_customer.rb +83 -0
- data/app/models/spree/permission_sets/order_display.rb +50 -0
- data/app/models/spree/permission_sets/order_management.rb +50 -0
- data/app/models/spree/permission_sets/product_display.rb +43 -0
- data/app/models/spree/permission_sets/product_management.rb +47 -0
- data/app/models/spree/permission_sets/restricted_stock_display.rb +33 -0
- data/app/models/spree/permission_sets/restricted_stock_management.rb +33 -0
- data/app/models/spree/permission_sets/stock_display.rb +26 -0
- data/app/models/spree/permission_sets/stock_management.rb +26 -0
- data/app/models/spree/permission_sets/super_user.rb +26 -0
- data/app/models/spree/permission_sets/user_display.rb +27 -0
- data/app/models/spree/permission_sets/user_management.rb +44 -0
- data/app/models/spree/preference.rb +1 -1
- data/app/models/spree/price.rb +3 -3
- data/app/models/spree/product/scopes.rb +23 -10
- data/app/models/spree/product.rb +30 -23
- data/app/models/spree/product_property.rb +1 -1
- data/app/models/spree/property.rb +1 -1
- data/app/models/spree/refund.rb +13 -3
- data/app/models/spree/refund_reason.rb +6 -1
- data/app/models/spree/reimbursement.rb +6 -6
- data/app/models/spree/reimbursement_performer.rb +3 -3
- data/app/models/spree/reimbursement_tax_calculator.rb +3 -3
- data/app/models/spree/reimbursement_type/credit.rb +1 -1
- data/app/models/spree/reimbursement_type/reimbursement_helpers.rb +6 -6
- data/app/models/spree/reimbursement_type/store_credit.rb +1 -1
- data/app/models/spree/reimbursement_type.rb +6 -1
- data/app/models/spree/return_authorization.rb +3 -1
- data/app/models/spree/return_item.rb +13 -15
- data/app/models/spree/return_reason.rb +6 -1
- data/app/models/spree/role.rb +3 -1
- data/app/models/spree/role_permission.rb +8 -0
- data/app/models/spree/shipment.rb +12 -10
- data/app/models/spree/shipping_category.rb +2 -0
- data/app/models/spree/shipping_rate.rb +2 -3
- data/app/models/spree/shipping_rate_tax.rb +1 -1
- data/app/models/spree/{order_contents.rb → simple_order_contents.rb} +10 -13
- data/app/models/spree/state.rb +1 -1
- data/app/models/spree/stock/allocator/on_hand_first.rb +2 -2
- data/app/models/spree/stock/availability.rb +11 -3
- data/app/models/spree/stock/estimator.rb +1 -1
- data/app/models/spree/stock/inventory_unit_builder.rb +1 -1
- data/app/models/spree/stock/package.rb +2 -2
- data/app/models/spree/stock/quantifier.rb +12 -8
- data/app/models/spree/stock/simple_coordinator.rb +38 -28
- data/app/models/spree/stock/splitter/shipping_category.rb +1 -1
- data/app/models/spree/stock_item.rb +2 -1
- data/app/models/spree/stock_location.rb +7 -7
- data/app/models/spree/stock_movement.rb +2 -2
- data/app/models/spree/store.rb +3 -1
- data/app/models/spree/store_credit.rb +31 -16
- data/app/models/spree/store_credit_event.rb +4 -3
- data/app/models/spree/store_credit_prioritizer.rb +17 -0
- data/app/models/spree/store_credit_reason.rb +6 -1
- data/app/models/spree/store_selector/by_server_name.rb +1 -1
- data/app/models/spree/tax/item_tax.rb +3 -2
- data/app/models/spree/tax/order_tax.rb +3 -1
- data/app/models/spree/tax/tax_helpers.rb +14 -3
- data/app/models/spree/tax/tax_location.rb +4 -7
- data/app/models/spree/tax_calculator/default.rb +32 -1
- data/app/models/spree/tax_calculator/shipping_rate.rb +2 -2
- data/app/models/spree/tax_category.rb +3 -1
- data/app/models/spree/tax_rate.rb +14 -1
- data/app/models/spree/taxon/active_storage_attachment.rb +2 -2
- data/app/models/spree/taxon/paperclip_attachment.rb +4 -4
- data/app/models/spree/taxon.rb +25 -3
- data/app/models/spree/taxon_brand_selector.rb +22 -0
- data/app/models/spree/taxonomy.rb +4 -3
- data/app/models/spree/unauthorized_redirect_handler.rb +24 -0
- data/app/models/spree/unit_cancel.rb +1 -2
- data/app/models/spree/user_address.rb +9 -3
- data/app/models/spree/user_last_url_storer/rules/authentication_rule.rb +1 -1
- data/app/models/spree/variant/price_selector.rb +25 -8
- data/app/models/spree/variant/scopes.rb +4 -0
- data/app/models/spree/variant/vat_price_generator.rb +1 -1
- data/app/models/spree/variant.rb +64 -37
- data/app/models/spree/wallet/add_payment_sources_to_wallet.rb +4 -4
- data/app/models/spree/wallet.rb +2 -2
- data/app/models/spree/zone.rb +1 -1
- data/app/subscribers/spree/order_mailer_subscriber.rb +35 -0
- data/app/views/layouts/spree/base_mailer.html.erb +2 -2
- data/app/views/spree/order_mailer/cancel_email.html.erb +1 -1
- data/app/views/spree/order_mailer/cancel_email.text.erb +1 -1
- data/app/views/spree/order_mailer/confirm_email.html.erb +5 -5
- data/app/views/spree/order_mailer/confirm_email.text.erb +5 -5
- data/app/views/spree/order_mailer/inventory_cancellation_email.html.erb +0 -1
- data/config/i18n-tasks.yml +134 -0
- data/config/locales/en.yml +439 -338
- data/db/default/spree/permission_sets.rb +10 -0
- data/db/default/spree/return_reasons.rb +3 -1
- data/db/default/spree/states.rb +2 -2
- data/db/migrate/20160101010000_solidus_one_four.rb +0 -127
- data/db/migrate/20180710170104_create_spree_store_credit_reasons_table.rb +2 -2
- data/db/migrate/20201127212108_add_type_before_removal_to_spree_payment_methods.rb +7 -0
- data/db/migrate/20210312061050_change_column_null_on_prices.rb +7 -0
- data/db/migrate/20210815004823_add_unique_index_to_option_values_variants.rb +16 -0
- data/db/migrate/20220419170826_remove_archived_user_addresses.rb +12 -0
- data/db/migrate/20220805202442_add_level_to_spree_tax_rates.rb +5 -0
- data/db/migrate/20221123152807_add_shipping_category_to_spree_variants.rb +5 -0
- data/db/migrate/20230321161854_change_column_null_option_values_option_type_id.rb +5 -0
- data/db/migrate/20230425103509_remove_taxon_position.rb +5 -0
- data/db/migrate/20230427095534_drop_deprecated_address_id_from_shipments.rb +11 -0
- data/db/migrate/20240821173254_create_spree_permission_sets_in_core.rb +9 -0
- data/db/migrate/20240821173341_create_spree_roles_permissions_in_core.rb +9 -0
- data/db/migrate/20240821173641_add_description_to_spree_roles.rb +5 -0
- data/db/migrate/20240904152041_add_privilege_and_category_to_spree_permission_sets.rb +6 -0
- data/db/migrate/20250129061658_add_metadata_to_spree_resources.rb +28 -0
- data/db/migrate/20250201172950_add_gtin_and_condition_to_spree_variant.rb +6 -0
- data/db/migrate/20250207104016_add_primary_taxon_to_products.rb +7 -0
- data/db/migrate/20250221152004_add_metadata_to_users.rb +13 -0
- data/db/seeds.rb +5 -1
- data/lib/generators/solidus/install/app_templates/authentication/custom.rb +16 -0
- data/lib/generators/solidus/install/app_templates/authentication/devise.rb +16 -0
- data/lib/generators/solidus/install/app_templates/authentication/existing.rb +10 -0
- data/lib/generators/solidus/install/app_templates/authentication/none.rb +1 -0
- data/lib/generators/solidus/install/app_templates/frontend/none.rb +1 -0
- data/lib/generators/solidus/install/app_templates/frontend/starter.rb +1 -0
- data/lib/generators/solidus/install/app_templates/payment_method/braintree.rb +5 -0
- data/lib/generators/solidus/install/app_templates/payment_method/none.rb +1 -0
- data/lib/generators/solidus/install/app_templates/payment_method/paypal.rb +5 -0
- data/lib/generators/solidus/install/app_templates/payment_method/stripe.rb +5 -0
- data/lib/generators/solidus/install/install_generator.rb +210 -156
- data/lib/generators/solidus/install/templates/config/initializers/spree.rb.tt +27 -33
- data/lib/generators/solidus/install/templates/vendor/assets/javascripts/spree/backend/all.js +2 -2
- data/lib/generators/solidus/update/templates/config/initializers/new_solidus_defaults.rb.tt +30 -0
- data/lib/generators/solidus/update/update_generator.rb +124 -0
- data/lib/generators/spree/custom_user/custom_user_generator.rb +6 -4
- data/lib/generators/spree/custom_user/templates/authentication_helpers.rb.tt +2 -6
- data/lib/generators/spree/custom_user/templates/migration.rb.tt +7 -3
- data/lib/generators/spree/dummy/dummy_generator.rb +12 -9
- data/lib/generators/spree/dummy/templates/rails/application.rb.tt +1 -2
- data/lib/generators/spree/dummy/templates/rails/database.yml +48 -63
- data/lib/generators/spree/dummy/templates/rails/manifest.js +3 -0
- data/lib/generators/spree/dummy/templates/rails/test.rb +7 -2
- data/lib/spree/app_configuration.rb +220 -71
- data/lib/spree/bus.rb +11 -0
- data/lib/spree/core/class_constantizer.rb +2 -2
- data/lib/spree/core/controller_helpers/auth.rb +5 -69
- data/lib/spree/core/controller_helpers/common.rb +5 -80
- data/lib/spree/core/controller_helpers/order.rb +5 -86
- data/lib/spree/core/controller_helpers/payment_parameters.rb +5 -165
- data/lib/spree/core/controller_helpers/pricing.rb +5 -17
- data/lib/spree/core/controller_helpers/search.rb +5 -14
- data/lib/spree/core/controller_helpers/store.rb +5 -17
- data/lib/spree/core/controller_helpers/strong_parameters.rb +5 -71
- data/lib/spree/core/engine.rb +49 -16
- data/lib/spree/core/environment/calculators.rb +35 -3
- data/lib/spree/core/environment/promotions.rb +25 -4
- data/lib/spree/core/environment_extension.rb +16 -2
- data/lib/spree/core/importer/order.rb +6 -6
- data/lib/spree/core/importer/product.rb +3 -3
- data/lib/spree/core/nested_class_set.rb +28 -0
- data/lib/spree/core/null_promotion_configuration.rb +84 -0
- data/lib/spree/core/product_duplicator.rb +1 -1
- data/lib/spree/core/product_filters.rb +2 -2
- data/lib/spree/core/search/base.rb +18 -9
- data/lib/spree/core/search/variant.rb +2 -2
- data/lib/spree/core/state_machines/inventory_unit.rb +5 -40
- data/lib/spree/core/state_machines/order.rb +5 -247
- data/lib/spree/core/state_machines/payment.rb +5 -59
- data/lib/spree/core/state_machines/reimbursement.rb +5 -31
- data/lib/spree/core/state_machines/return_authorization.rb +5 -30
- data/lib/spree/core/state_machines/return_item/acceptance_status.rb +5 -49
- data/lib/spree/core/state_machines/return_item/reception_status.rb +5 -40
- data/lib/spree/core/state_machines/shipment.rb +5 -56
- data/lib/spree/core/state_machines.rb +48 -81
- data/lib/spree/core/stock_configuration.rb +18 -0
- data/lib/spree/core/validators/email.rb +2 -4
- data/lib/spree/core/version.rb +5 -1
- data/lib/spree/core/versioned_value.rb +75 -0
- data/lib/spree/core.rb +40 -16
- data/lib/spree/deprecated_instance_variable_proxy.rb +57 -0
- data/lib/spree/deprecation.rb +3 -51
- data/lib/spree/deprecator.rb +9 -0
- data/lib/spree/i18n.rb +1 -1
- data/lib/spree/mailer_previews/carton_preview.rb +1 -1
- data/lib/spree/migration_helpers.rb +3 -3
- data/lib/spree/migrations.rb +13 -11
- data/lib/spree/money.rb +5 -118
- data/lib/spree/permission_sets/base.rb +5 -30
- data/lib/spree/permission_sets/configuration_display.rb +5 -23
- data/lib/spree/permission_sets/configuration_management.rb +5 -23
- data/lib/spree/permission_sets/dashboard_display.rb +5 -9
- data/lib/spree/permission_sets/default_customer.rb +5 -35
- data/lib/spree/permission_sets/order_display.rb +5 -19
- data/lib/spree/permission_sets/order_management.rb +5 -20
- data/lib/spree/permission_sets/product_display.rb +5 -17
- data/lib/spree/permission_sets/product_management.rb +5 -19
- data/lib/spree/permission_sets/restricted_stock_display.rb +5 -16
- data/lib/spree/permission_sets/restricted_stock_management.rb +5 -16
- data/lib/spree/permission_sets/stock_display.rb +5 -10
- data/lib/spree/permission_sets/stock_management.rb +5 -10
- data/lib/spree/permission_sets/super_user.rb +5 -9
- data/lib/spree/permission_sets/user_display.rb +5 -11
- data/lib/spree/permission_sets/user_management.rb +5 -23
- data/lib/spree/permission_sets.rb +5 -18
- data/lib/spree/permitted_attributes.rb +35 -14
- data/lib/spree/preferences/configuration.rb +88 -0
- data/lib/spree/preferences/persistable.rb +7 -1
- data/lib/spree/preferences/preferable.rb +13 -0
- data/lib/spree/preferences/preferable_class_methods.rb +12 -4
- data/lib/spree/preferences/preference_differentiator.rb +29 -0
- data/lib/spree/preferences/static_model_preferences.rb +25 -10
- data/lib/spree/preferences/store.rb +2 -2
- data/lib/spree/testing_support/blacklist_urls.rb +1 -1
- data/lib/spree/testing_support/bus_helpers.rb +101 -0
- data/lib/spree/testing_support/capybara_ext.rb +11 -1
- data/lib/spree/testing_support/common_rake.rb +76 -23
- data/lib/spree/testing_support/dummy_ability.rb +7 -0
- data/lib/spree/testing_support/dummy_app/assets/javascripts/spree/backend/all.js +1 -1
- data/lib/spree/testing_support/dummy_app/assets/stylesheets/solidus_admin/tailwind.css +1 -0
- data/lib/spree/testing_support/dummy_app/database.yml +39 -28
- data/lib/spree/testing_support/dummy_app/migrations.rb +8 -15
- data/lib/spree/testing_support/dummy_app/rake_tasks.rb +3 -10
- data/lib/spree/testing_support/dummy_app.rb +71 -42
- data/lib/spree/testing_support/extension_rake.rb +2 -2
- data/lib/spree/testing_support/factories/address_factory.rb +9 -13
- data/lib/spree/testing_support/factories/adjustment_factory.rb +1 -13
- data/lib/spree/testing_support/factories/adjustment_reason_factory.rb +0 -5
- data/lib/spree/testing_support/factories/calculator_factory.rb +4 -10
- data/lib/spree/testing_support/factories/carton_factory.rb +2 -10
- data/lib/spree/testing_support/factories/country_factory.rb +1 -7
- data/lib/spree/testing_support/factories/credit_card_factory.rb +0 -5
- data/lib/spree/testing_support/factories/customer_return_factory.rb +2 -11
- data/lib/spree/testing_support/factories/image_factory.rb +0 -5
- data/lib/spree/testing_support/factories/inventory_unit_factory.rb +4 -14
- data/lib/spree/testing_support/factories/line_item_factory.rb +0 -8
- data/lib/spree/testing_support/factories/option_type_factory.rb +0 -8
- data/lib/spree/testing_support/factories/option_value_factory.rb +0 -5
- data/lib/spree/testing_support/factories/order_factory.rb +19 -38
- data/lib/spree/testing_support/factories/payment_factory.rb +0 -10
- data/lib/spree/testing_support/factories/payment_method_factory.rb +0 -5
- data/lib/spree/testing_support/factories/price_factory.rb +0 -7
- data/lib/spree/testing_support/factories/product_factory.rb +5 -13
- data/lib/spree/testing_support/factories/product_option_type_factory.rb +0 -8
- data/lib/spree/testing_support/factories/product_property_factory.rb +0 -8
- data/lib/spree/testing_support/factories/property_factory.rb +0 -5
- data/lib/spree/testing_support/factories/refund_factory.rb +0 -8
- data/lib/spree/testing_support/factories/refund_reason_factory.rb +0 -5
- data/lib/spree/testing_support/factories/reimbursement_factory.rb +0 -7
- data/lib/spree/testing_support/factories/reimbursement_type_factory.rb +0 -5
- data/lib/spree/testing_support/factories/return_authorization_factory.rb +0 -9
- data/lib/spree/testing_support/factories/return_item_factory.rb +0 -9
- data/lib/spree/testing_support/factories/return_reason_factory.rb +0 -5
- data/lib/spree/testing_support/factories/role_factory.rb +0 -5
- data/lib/spree/testing_support/factories/shipment_factory.rb +1 -11
- data/lib/spree/testing_support/factories/shipping_category_factory.rb +0 -5
- data/lib/spree/testing_support/factories/shipping_method_factory.rb +0 -9
- data/lib/spree/testing_support/factories/shipping_rate_factory.rb +0 -8
- data/lib/spree/testing_support/factories/state_factory.rb +8 -10
- data/lib/spree/testing_support/factories/stock_item_factory.rb +5 -9
- data/lib/spree/testing_support/factories/stock_location_factory.rb +0 -9
- data/lib/spree/testing_support/factories/stock_movement_factory.rb +0 -7
- data/lib/spree/testing_support/factories/stock_package_factory.rb +1 -9
- data/lib/spree/testing_support/factories/store_credit_category_factory.rb +0 -5
- data/lib/spree/testing_support/factories/store_credit_event_factory.rb +0 -8
- data/lib/spree/testing_support/factories/store_credit_factory.rb +4 -13
- data/lib/spree/testing_support/factories/store_credit_reason_factory.rb +0 -5
- data/lib/spree/testing_support/factories/store_credit_type_factory.rb +0 -5
- data/lib/spree/testing_support/factories/store_factory.rb +0 -5
- data/lib/spree/testing_support/factories/tax_category_factory.rb +0 -8
- data/lib/spree/testing_support/factories/tax_rate_factory.rb +0 -9
- data/lib/spree/testing_support/factories/taxon_factory.rb +5 -10
- data/lib/spree/testing_support/factories/taxonomy_factory.rb +3 -6
- data/lib/spree/testing_support/factories/user_factory.rb +6 -9
- data/lib/spree/testing_support/factories/variant_factory.rb +0 -10
- data/lib/spree/testing_support/factories/variant_property_rule_condition_factory.rb +0 -8
- data/lib/spree/testing_support/factories/variant_property_rule_factory.rb +0 -9
- data/lib/spree/testing_support/factories/variant_property_rule_value_factory.rb +0 -8
- data/lib/spree/testing_support/factories/zone_factory.rb +1 -9
- data/lib/spree/testing_support/factory_bot.rb +6 -29
- data/lib/spree/testing_support/flaky.rb +22 -0
- data/lib/spree/testing_support/order_walkthrough.rb +7 -6
- data/lib/spree/testing_support/sequences.rb +0 -5
- data/lib/spree/testing_support/shared_examples/calculator.rb +10 -0
- data/lib/spree/testing_support/shared_examples/order_factory.rb +141 -0
- data/lib/spree/testing_support/shared_examples/working_factory.rb +15 -0
- data/lib/spree/testing_support/silence_deprecations.rb +9 -0
- data/lib/spree/user_class_handle.rb +2 -2
- data/lib/tasks/colorado_delivery_fee.rake +28 -0
- data/lib/tasks/payment_method.rake +29 -0
- data/lib/tasks/solidus/delete_prices_with_nil_amount.rake +8 -0
- data/solidus_core.gemspec +18 -8
- metadata +233 -117
- data/app/jobs/spree/promotion_code_batch_job.rb +0 -26
- data/app/mailers/spree/promotion_code_batch_mailer.rb +0 -15
- data/app/models/spree/calculator/distributed_amount.rb +0 -33
- data/app/models/spree/calculator/flat_percent_item_total.rb +0 -23
- data/app/models/spree/calculator/flexi_rate.rb +0 -22
- data/app/models/spree/calculator/percent_on_line_item.rb +0 -13
- data/app/models/spree/calculator/tiered_flat_rate.rb +0 -52
- data/app/models/spree/calculator/tiered_percent.rb +0 -62
- data/app/models/spree/line_item_action.rb +0 -8
- data/app/models/spree/order_promotion.rb +0 -27
- data/app/models/spree/promotion/actions/create_adjustment.rb +0 -77
- data/app/models/spree/promotion/actions/create_item_adjustments.rb +0 -99
- data/app/models/spree/promotion/actions/create_quantity_adjustments.rb +0 -139
- data/app/models/spree/promotion/actions/free_shipping.rb +0 -58
- data/app/models/spree/promotion/rules/first_order.rb +0 -38
- data/app/models/spree/promotion/rules/first_repeat_purchase_since.rb +0 -36
- data/app/models/spree/promotion/rules/item_total.rb +0 -53
- data/app/models/spree/promotion/rules/nth_order.rb +0 -45
- data/app/models/spree/promotion/rules/one_use_per_user.rb +0 -25
- data/app/models/spree/promotion/rules/option_value.rb +0 -50
- data/app/models/spree/promotion/rules/product.rb +0 -74
- data/app/models/spree/promotion/rules/store.rb +0 -22
- data/app/models/spree/promotion/rules/taxon.rb +0 -87
- data/app/models/spree/promotion/rules/user.rb +0 -30
- data/app/models/spree/promotion/rules/user_logged_in.rb +0 -20
- data/app/models/spree/promotion/rules/user_role.rb +0 -45
- data/app/models/spree/promotion.rb +0 -284
- data/app/models/spree/promotion_action.rb +0 -43
- data/app/models/spree/promotion_category.rb +0 -8
- data/app/models/spree/promotion_chooser.rb +0 -34
- data/app/models/spree/promotion_code/batch_builder.rb +0 -64
- data/app/models/spree/promotion_code.rb +0 -50
- data/app/models/spree/promotion_code_batch.rb +0 -27
- data/app/models/spree/promotion_handler/cart.rb +0 -55
- data/app/models/spree/promotion_handler/coupon.rb +0 -123
- data/app/models/spree/promotion_handler/page.rb +0 -26
- data/app/models/spree/promotion_handler/shipping.rb +0 -61
- data/app/models/spree/promotion_rule.rb +0 -55
- data/app/models/spree/promotion_rule_role.rb +0 -8
- data/app/models/spree/promotion_rule_store.rb +0 -10
- data/app/models/spree/promotion_rule_taxon.rb +0 -8
- data/app/models/spree/promotion_rule_user.rb +0 -10
- data/app/models/spree/tax/shipping_rate_taxer.rb +0 -24
- data/app/subscribers/spree/mailer_subscriber.rb +0 -25
- data/app/views/spree/promotion_code_batch_mailer/promotion_code_batch_errored.text.erb +0 -2
- data/app/views/spree/promotion_code_batch_mailer/promotion_code_batch_finished.text.erb +0 -2
- data/db/migrate/20161017102621_create_spree_promotion_code_batch.rb +0 -38
- data/db/migrate/20180202190713_create_promotion_rule_stores.rb +0 -12
- data/db/migrate/20180328172631_add_join_characters_to_promotion_code_batch.rb +0 -11
- data/db/migrate/20190106184413_remove_code_from_spree_promotions.rb +0 -42
- data/lib/generators/solidus/install/templates/vendor/assets/javascripts/spree/frontend/all.js +0 -10
- data/lib/generators/solidus/install/templates/vendor/assets/stylesheets/spree/frontend/all.css +0 -9
- data/lib/generators/spree/dummy/templates/rails/script/rails +0 -6
- data/lib/solidus/migrations/promotions_with_code_handlers.rb +0 -66
- data/lib/spree/event/adapters/active_support_notifications.rb +0 -67
- data/lib/spree/event/configuration.rb +0 -25
- data/lib/spree/event/subscriber.rb +0 -86
- data/lib/spree/event/subscriber_registry.rb +0 -94
- data/lib/spree/event.rb +0 -119
- data/lib/spree/permission_sets/promotion_display.rb +0 -15
- data/lib/spree/permission_sets/promotion_management.rb +0 -15
- data/lib/spree/testing_support/dummy_app/assets/javascripts/spree/frontend/all.js +0 -10
- data/lib/spree/testing_support/dummy_app/assets/stylesheets/spree/frontend/all.css +0 -9
- data/lib/spree/testing_support/dummy_app/views/layouts/application.html.erb +0 -1
- data/lib/spree/testing_support/factories/order_promotion_factory.rb +0 -16
- data/lib/spree/testing_support/factories/promotion_category_factory.rb +0 -12
- data/lib/spree/testing_support/factories/promotion_code_factory.rb +0 -16
- data/lib/spree/testing_support/factories/promotion_factory.rb +0 -92
- data/lib/spree/testing_support/factories.rb +0 -11
- data/lib/spree/testing_support.rb +0 -31
- data/lib/tasks/upgrade.rake +0 -15
@@ -14,6 +14,7 @@ module Spree
|
|
14
14
|
:checkout_confirm_attributes,
|
15
15
|
:credit_card_update_attributes,
|
16
16
|
:customer_return_attributes,
|
17
|
+
:customer_metadata_attributes,
|
17
18
|
:image_attributes,
|
18
19
|
:inventory_unit_attributes,
|
19
20
|
:line_item_attributes,
|
@@ -51,37 +52,53 @@ module Spree
|
|
51
52
|
:month, :year, :expiry, :first_name, :last_name, :name
|
52
53
|
]
|
53
54
|
|
54
|
-
@@customer_return_attributes = [
|
55
|
+
@@customer_return_attributes = [
|
56
|
+
:stock_location_id, return_items_attributes: [
|
57
|
+
:id, :inventory_unit_id, :return_authorization_id, :returned, :amount,
|
58
|
+
:reception_status_event, :acceptance_status, :exchange_variant_id,
|
59
|
+
:resellable, :return_reason_id, customer_metadata: {}
|
60
|
+
]
|
61
|
+
]
|
62
|
+
|
63
|
+
@@customer_metadata_attributes = [customer_metadata: {}]
|
55
64
|
|
56
65
|
@@image_attributes = [:alt, :attachment, :position, :viewable_type, :viewable_id]
|
57
66
|
|
58
67
|
@@inventory_unit_attributes = [:shipment, :variant_id]
|
59
68
|
|
60
|
-
@@line_item_attributes = [:id, :variant_id, :quantity]
|
61
|
-
|
62
|
-
@@option_type_attributes = [:name, :presentation, :option_values_attributes]
|
69
|
+
@@line_item_attributes = [:id, :variant_id, :quantity, customer_metadata: {}]
|
63
70
|
|
64
71
|
@@option_value_attributes = [:name, :presentation]
|
65
72
|
|
66
|
-
@@
|
73
|
+
@@option_type_attributes = [:name, :presentation, option_values_attributes: option_value_attributes]
|
74
|
+
|
75
|
+
@@payment_attributes = [:amount, :payment_method_id, :payment_method, customer_metadata: {}]
|
67
76
|
|
68
77
|
@@product_properties_attributes = [:property_name, :value, :position]
|
69
78
|
|
70
79
|
@@product_attributes = [
|
71
|
-
:name, :description, :available_on, :discontinue_on, :
|
80
|
+
:name, :description, :available_on, :discontinue_on, :meta_description,
|
72
81
|
:meta_keywords, :price, :sku, :deleted_at,
|
73
82
|
:option_values_hash, :weight, :height, :width, :depth,
|
74
83
|
:shipping_category_id, :tax_category_id,
|
75
|
-
:taxon_ids, :option_type_ids, :cost_currency, :cost_price
|
84
|
+
:taxon_ids, :option_type_ids, :cost_currency, :cost_price, :primary_taxon_id,
|
85
|
+
:gtin, :condition
|
76
86
|
]
|
77
87
|
|
78
88
|
@@property_attributes = [:name, :presentation]
|
79
89
|
|
80
|
-
@@return_authorization_attributes = [:memo, :stock_location_id, :return_reason_id,
|
90
|
+
@@return_authorization_attributes = [:memo, :stock_location_id, :return_reason_id,
|
91
|
+
customer_metadata: {},
|
92
|
+
return_items_attributes: [
|
93
|
+
:inventory_unit_id,
|
94
|
+
:exchange_variant_id,
|
95
|
+
:return_reason_id,
|
96
|
+
:preferred_reimbursement_type_id
|
97
|
+
]]
|
81
98
|
|
82
99
|
@@shipment_attributes = [
|
83
100
|
:special_instructions, :stock_location_id, :id, :tracking,
|
84
|
-
:selected_shipping_rate_id
|
101
|
+
:selected_shipping_rate_id, customer_metadata: {}
|
85
102
|
]
|
86
103
|
|
87
104
|
# month / year may be provided by some sources, or others may elect to use one field
|
@@ -89,7 +106,7 @@ module Spree
|
|
89
106
|
:number, :month, :year, :expiry, :verification_value,
|
90
107
|
:first_name, :last_name, :cc_type, :gateway_customer_profile_id,
|
91
108
|
:gateway_payment_profile_id, :last_digits, :name, :encrypted_data,
|
92
|
-
:wallet_payment_source_id, address_attributes:
|
109
|
+
:wallet_payment_source_id, address_attributes:
|
93
110
|
]
|
94
111
|
|
95
112
|
@@stock_item_attributes = [:variant, :stock_location, :backorderable, :variant_id]
|
@@ -120,17 +137,21 @@ module Spree
|
|
120
137
|
# by changing a user with higher priveleges' email to one a lower-priveleged
|
121
138
|
# admin owns. Creating a user with an email is handled separate at the
|
122
139
|
# controller level.
|
123
|
-
@@user_attributes = [:password, :password_confirmation]
|
140
|
+
@@user_attributes = [:password, :password_confirmation, customer_metadata: {}]
|
124
141
|
|
125
142
|
@@variant_attributes = [
|
126
143
|
:name, :presentation, :cost_price, :lock_version,
|
127
144
|
:position, :track_inventory,
|
128
|
-
:product_id, :product, :
|
129
|
-
:weight, :height, :width, :depth, :sku, :cost_currency,
|
145
|
+
:product_id, :product, :price,
|
146
|
+
:weight, :height, :width, :depth, :sku, :cost_currency,
|
147
|
+
:tax_category_id, :shipping_category_id,
|
148
|
+
option_value_ids: [],
|
149
|
+
options: [:name, :value]
|
130
150
|
]
|
131
151
|
|
132
152
|
@@checkout_address_attributes = [
|
133
153
|
:use_billing,
|
154
|
+
:use_shipping,
|
134
155
|
:email,
|
135
156
|
bill_address_attributes: address_attributes,
|
136
157
|
ship_address_attributes: address_attributes
|
@@ -143,7 +164,7 @@ module Spree
|
|
143
164
|
|
144
165
|
@@checkout_payment_attributes = [
|
145
166
|
payments_attributes: payment_attributes + [
|
146
|
-
source_attributes:
|
167
|
+
source_attributes:
|
147
168
|
]
|
148
169
|
]
|
149
170
|
|
@@ -1,5 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'spree/core/versioned_value'
|
3
4
|
require 'spree/preferences/preferable'
|
4
5
|
|
5
6
|
module Spree::Preferences
|
@@ -29,6 +30,45 @@ module Spree::Preferences
|
|
29
30
|
class Configuration
|
30
31
|
include Spree::Preferences::Preferable
|
31
32
|
|
33
|
+
# @!attribute [r] loaded_defaults
|
34
|
+
# @return [String]
|
35
|
+
# Some configuration defaults can be added or changed when a new Solidus
|
36
|
+
# version is released. Setting this to an older Solidus version allows keeping
|
37
|
+
# backward compatibility until the application code is updated to the new
|
38
|
+
# defaults. Set via {#load_defaults}
|
39
|
+
attr_reader :loaded_defaults
|
40
|
+
|
41
|
+
# @api private
|
42
|
+
attr_reader :load_defaults_called
|
43
|
+
|
44
|
+
def initialize
|
45
|
+
@loaded_defaults = Spree.solidus_version
|
46
|
+
@load_defaults_called = false
|
47
|
+
end
|
48
|
+
|
49
|
+
# @param [String] Solidus version from which take defaults when preferences
|
50
|
+
# are not overriden by the user.
|
51
|
+
# @see #loaded_defaults
|
52
|
+
def load_defaults(version)
|
53
|
+
@loaded_defaults = version
|
54
|
+
@load_defaults_called = true
|
55
|
+
reset
|
56
|
+
end
|
57
|
+
|
58
|
+
def check_load_defaults_called(instance_constant_name = nil)
|
59
|
+
return if load_defaults_called || !Spree::Core.has_install_generator_been_run?
|
60
|
+
|
61
|
+
target_name = instance_constant_name || "#{self.class.name}.new"
|
62
|
+
Spree.deprecator.warn <<~MSG
|
63
|
+
It's recommended that you explicitly load the default configuration for
|
64
|
+
your current Solidus version. You can do it by adding the following call
|
65
|
+
to your Solidus initializer within the #{target_name} block:
|
66
|
+
|
67
|
+
config.load_defaults('#{Spree.solidus_version}')
|
68
|
+
|
69
|
+
MSG
|
70
|
+
end
|
71
|
+
|
32
72
|
# @yield [config] Yields this configuration object to a block
|
33
73
|
def configure
|
34
74
|
yield(self)
|
@@ -79,6 +119,37 @@ module Spree::Preferences
|
|
79
119
|
end
|
80
120
|
end
|
81
121
|
|
122
|
+
def self.inherited(klass)
|
123
|
+
klass.instance_variable_set(:@versioned_preferences, [])
|
124
|
+
class << klass
|
125
|
+
attr_reader :versioned_preferences
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
# Adds a preference with different default depending on {#loaded_defaults}
|
130
|
+
#
|
131
|
+
# This method is a specialized version of {.preference} that generates a
|
132
|
+
# different default value for different Solidus versions. For instance, in
|
133
|
+
# the example, `foo`'s default was `true` until version 3.0.0.alpha, when it
|
134
|
+
# became `false`:
|
135
|
+
#
|
136
|
+
# @example
|
137
|
+
# versioned_preference :foo, :boolean, initial_value: true, boundaries: { "3.0.0.alpha" => false }
|
138
|
+
#
|
139
|
+
# @see .preference
|
140
|
+
# @see #loaded_defaults
|
141
|
+
# @see Spree::Core::VersionedValue
|
142
|
+
def self.versioned_preference(name, type, initial_value:, boundaries:, **options)
|
143
|
+
@versioned_preferences << name
|
144
|
+
preference(
|
145
|
+
name,
|
146
|
+
type,
|
147
|
+
options.merge(
|
148
|
+
default: by_version(initial_value, boundaries)
|
149
|
+
)
|
150
|
+
)
|
151
|
+
end
|
152
|
+
|
82
153
|
def self.preference(name, type, options = {})
|
83
154
|
super
|
84
155
|
alias_method name.to_s, "preferred_#{name}"
|
@@ -102,6 +173,23 @@ module Spree::Preferences
|
|
102
173
|
class_name = class_name.constantize if class_name.is_a?(String)
|
103
174
|
class_name
|
104
175
|
end
|
176
|
+
|
177
|
+
define_method("#{name}_name") do
|
178
|
+
instance_variable_get(ivar) || default
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
def self.by_version(*args)
|
183
|
+
proc do |loaded_defaults|
|
184
|
+
Spree::Core::VersionedValue.new(*args).call(loaded_defaults)
|
185
|
+
end
|
186
|
+
end
|
187
|
+
private_class_method :by_version
|
188
|
+
|
189
|
+
private
|
190
|
+
|
191
|
+
def context_for_default
|
192
|
+
[loaded_defaults]
|
105
193
|
end
|
106
194
|
end
|
107
195
|
end
|
@@ -7,7 +7,13 @@ module Spree
|
|
7
7
|
|
8
8
|
included do
|
9
9
|
include Spree::Preferences::Preferable
|
10
|
-
|
10
|
+
|
11
|
+
if Rails.gem_version >= Gem::Version.new('7.1')
|
12
|
+
serialize :preferences, type: Hash, coder: YAML
|
13
|
+
else
|
14
|
+
serialize :preferences, Hash, coder: YAML
|
15
|
+
end
|
16
|
+
|
11
17
|
after_initialize :initialize_preference_defaults
|
12
18
|
end
|
13
19
|
|
@@ -10,6 +10,13 @@ module Spree
|
|
10
10
|
#
|
11
11
|
# A class including Preferable must implement #preferences which should return
|
12
12
|
# an object responding to .fetch(key), []=(key, val), and .delete(key).
|
13
|
+
# If #preferences is initialized with `default_preferences` and one of the
|
14
|
+
# preferences is another preference, it will cause a stack level too deep error.
|
15
|
+
# To avoid it do not memoize #preferences.
|
16
|
+
#
|
17
|
+
# It may also define a `#context_for_default` method. It should return an
|
18
|
+
# array with the arguments to be provided to a proc used as the `default:`
|
19
|
+
# keyword for a preference.
|
13
20
|
#
|
14
21
|
# The generated writer method performs typecasting before assignment into the
|
15
22
|
# preferences object.
|
@@ -107,6 +114,8 @@ module Spree
|
|
107
114
|
end
|
108
115
|
|
109
116
|
# @return [Hash{Symbol => Object}] Default for all preferences defined on this class
|
117
|
+
# This may raise an infinite loop error if any of the defaults are
|
118
|
+
# dependent on other preferences defaults.
|
110
119
|
def default_preferences
|
111
120
|
Hash[
|
112
121
|
defined_preferences.map do |preference|
|
@@ -176,6 +185,10 @@ module Spree
|
|
176
185
|
value
|
177
186
|
end
|
178
187
|
end
|
188
|
+
|
189
|
+
def context_for_default
|
190
|
+
[].freeze
|
191
|
+
end
|
179
192
|
end
|
180
193
|
end
|
181
194
|
end
|
@@ -26,8 +26,14 @@ module Spree::Preferences
|
|
26
26
|
options[:default] = preference_encryptor.encrypt(options[:default])
|
27
27
|
end
|
28
28
|
|
29
|
-
default =
|
30
|
-
|
29
|
+
default = begin
|
30
|
+
given = options[:default]
|
31
|
+
if given.is_a?(Proc)
|
32
|
+
given
|
33
|
+
else
|
34
|
+
proc { given }
|
35
|
+
end
|
36
|
+
end
|
31
37
|
|
32
38
|
# The defined preferences on a class are all those defined directly on
|
33
39
|
# that class as well as those defined on ancestors.
|
@@ -44,7 +50,7 @@ module Spree::Preferences
|
|
44
50
|
# is a pending preference before going to default
|
45
51
|
define_method preference_getter_method(name) do
|
46
52
|
value = preferences.fetch(name) do
|
47
|
-
default
|
53
|
+
instance_exec(*context_for_default, &default)
|
48
54
|
end
|
49
55
|
value = preference_encryptor.decrypt(value) if preference_encryptor.present?
|
50
56
|
value
|
@@ -60,7 +66,9 @@ module Spree::Preferences
|
|
60
66
|
preferences_will_change! if respond_to?(:preferences_will_change!)
|
61
67
|
end
|
62
68
|
|
63
|
-
define_method preference_default_getter_method(name)
|
69
|
+
define_method preference_default_getter_method(name) do
|
70
|
+
instance_exec(*context_for_default, &default)
|
71
|
+
end
|
64
72
|
|
65
73
|
define_method preference_type_getter_method(name) do
|
66
74
|
type
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Spree
|
4
|
+
module Preferences
|
5
|
+
class PreferenceDifferentiator
|
6
|
+
attr_reader :config_class
|
7
|
+
|
8
|
+
def initialize(config_class)
|
9
|
+
@config_class = config_class
|
10
|
+
end
|
11
|
+
|
12
|
+
def call(from:, to:)
|
13
|
+
preferences_from = config_class.new.load_defaults(from)
|
14
|
+
preferences_to = config_class.new.load_defaults(to)
|
15
|
+
config_class.versioned_preferences.reduce({}) do |changes, pref_key|
|
16
|
+
value_from = preferences_from[pref_key]
|
17
|
+
value_to = preferences_to[pref_key]
|
18
|
+
if value_from == value_to
|
19
|
+
changes
|
20
|
+
else
|
21
|
+
changes.merge(
|
22
|
+
pref_key => { from: value_from, to: value_to }
|
23
|
+
)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -7,13 +7,8 @@ module Spree
|
|
7
7
|
attr_reader :preferences
|
8
8
|
|
9
9
|
def initialize(klass, hash)
|
10
|
-
|
11
|
-
hash.
|
12
|
-
if !klass.defined_preferences.include?(key)
|
13
|
-
raise "Preference #{key.inspect} is not defined on #{klass}"
|
14
|
-
end
|
15
|
-
end
|
16
|
-
@preferences = hash
|
10
|
+
@klass = klass
|
11
|
+
@preferences = hash.symbolize_keys
|
17
12
|
end
|
18
13
|
|
19
14
|
def fetch(key, &block)
|
@@ -27,6 +22,8 @@ module Spree
|
|
27
22
|
def to_hash
|
28
23
|
@preferences.deep_dup
|
29
24
|
end
|
25
|
+
|
26
|
+
delegate :keys, to: :@preferences
|
30
27
|
end
|
31
28
|
|
32
29
|
def initialize
|
@@ -36,14 +33,32 @@ module Spree
|
|
36
33
|
end
|
37
34
|
|
38
35
|
def add(klass, name, preferences)
|
39
|
-
|
40
|
-
raise "Static model preference '#{name}' on #{klass} is already defined" if @store[klass.to_s][name]
|
41
|
-
@store[klass.to_s][name] = Definition.new(klass, preferences)
|
36
|
+
@store[klass.to_s][name] = Definition.new(klass.to_s, preferences)
|
42
37
|
end
|
43
38
|
|
44
39
|
def for_class(klass)
|
45
40
|
@store[klass.to_s]
|
46
41
|
end
|
42
|
+
|
43
|
+
def validate!
|
44
|
+
@store.keys.map(&:constantize).each do |klass|
|
45
|
+
validate_for_class!(klass)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
def validate_for_class!(klass)
|
52
|
+
for_class(klass).each do |name, preferences|
|
53
|
+
klass_keys = klass.defined_preferences.map(&:to_s)
|
54
|
+
extra_keys = preferences.keys.map(&:to_s) - klass_keys
|
55
|
+
next if extra_keys.empty?
|
56
|
+
|
57
|
+
raise \
|
58
|
+
"Unexpected keys found for #{klass} under #{name}: #{extra_keys.sort.join(', ')} " \
|
59
|
+
"(expected keys: #{klass_keys.sort.join(', ')})"
|
60
|
+
end
|
61
|
+
end
|
47
62
|
end
|
48
63
|
end
|
49
64
|
end
|
@@ -19,7 +19,7 @@ module Spree::Preferences
|
|
19
19
|
|
20
20
|
def exist?(key)
|
21
21
|
@cache.exist?(key) ||
|
22
|
-
should_persist? && Spree::Preference.where(key:
|
22
|
+
should_persist? && Spree::Preference.where(key:).exists?
|
23
23
|
end
|
24
24
|
|
25
25
|
def get(key)
|
@@ -35,7 +35,7 @@ module Spree::Preferences
|
|
35
35
|
# has been cleared from the cache
|
36
36
|
|
37
37
|
# does it exist in the database?
|
38
|
-
if preference = Spree::Preference.find_by(key:
|
38
|
+
if preference = Spree::Preference.find_by(key:)
|
39
39
|
# it does exist
|
40
40
|
val = preference.value
|
41
41
|
else
|
@@ -0,0 +1,101 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spree/bus'
|
4
|
+
|
5
|
+
module Spree
|
6
|
+
module TestingSupport
|
7
|
+
# RSpec test helpers for the event bus
|
8
|
+
#
|
9
|
+
# If you want to use the methods defined in this module, include it in your
|
10
|
+
# specs:
|
11
|
+
#
|
12
|
+
# @example
|
13
|
+
# require 'rails_helper'
|
14
|
+
# require 'spree/testing_support/bus_helpers'
|
15
|
+
#
|
16
|
+
# RSpec.describe MyClass do
|
17
|
+
# include Spree::TestingSupport::BusHelpers
|
18
|
+
# end
|
19
|
+
#
|
20
|
+
# or, globally, in your `spec_helper.rb`:
|
21
|
+
#
|
22
|
+
# @example
|
23
|
+
# require 'spree/testing_support/bus_helpers'
|
24
|
+
#
|
25
|
+
# RSpec.configure do |config|
|
26
|
+
# config.include Spree::TestingSupport::BusHelpers
|
27
|
+
# end
|
28
|
+
module BusHelpers
|
29
|
+
extend RSpec::Matchers::DSL
|
30
|
+
|
31
|
+
# Stubs {Spree::Bus}
|
32
|
+
#
|
33
|
+
# After you have called this method in an example, {Spree::Bus} will no
|
34
|
+
# longer publish any event for the duration of that example. All the
|
35
|
+
# method invocations on it will be stubbed.
|
36
|
+
#
|
37
|
+
# Internally, it stubs {Spree::Bus#publish}.
|
38
|
+
#
|
39
|
+
# After you call this method, probably you'll want to call some of the
|
40
|
+
# matchers defined in this module.
|
41
|
+
def stub_spree_bus
|
42
|
+
allow(Spree::Bus).to receive(:publish)
|
43
|
+
end
|
44
|
+
|
45
|
+
# @!method have_been_published(event_name)
|
46
|
+
# Matcher to test that an event has been published via {Spree::Bus#publish}
|
47
|
+
#
|
48
|
+
# Before using this matcher, you need to call {#stub_spree_bus}.
|
49
|
+
#
|
50
|
+
# Remember that the event listeners won't be performed.
|
51
|
+
#
|
52
|
+
# @example
|
53
|
+
# it 'publishes foo event' do
|
54
|
+
# stub_spree_bus
|
55
|
+
#
|
56
|
+
# Spree::Bus.publish 'foo'
|
57
|
+
#
|
58
|
+
# expect('foo').to have_been_published
|
59
|
+
# end
|
60
|
+
#
|
61
|
+
# It can be chain through `with` to match with the published payload:
|
62
|
+
#
|
63
|
+
# @example
|
64
|
+
# it 'publishes foo event with the expected payload' do
|
65
|
+
# stub_spree_bus
|
66
|
+
#
|
67
|
+
# Spree::Bus.publish 'foo', bar: :baz, qux: :quux
|
68
|
+
#
|
69
|
+
# expect('foo').to have_been_published.with(a_hash_including(bar: :baz))
|
70
|
+
# end
|
71
|
+
#
|
72
|
+
# @param [Symbol] event_name
|
73
|
+
matcher :have_been_published do
|
74
|
+
chain :with, :payload
|
75
|
+
|
76
|
+
match do |expected_event|
|
77
|
+
expected_event = normalize_name(expected_event)
|
78
|
+
arguments = payload ? [expected_event, payload] : [expected_event, any_args]
|
79
|
+
expect(Spree::Bus).to have_received(:publish).with(*arguments)
|
80
|
+
end
|
81
|
+
|
82
|
+
failure_message do |expected_event|
|
83
|
+
<<~MSG
|
84
|
+
expected #{expected_event.inspect} to have been published.
|
85
|
+
Make sure that provided payload, if any, also matches.
|
86
|
+
MSG
|
87
|
+
end
|
88
|
+
|
89
|
+
def normalize_name(event_name)
|
90
|
+
if event_name.is_a?(Symbol)
|
91
|
+
eq(event_name)
|
92
|
+
else
|
93
|
+
raise ArgumentError, <<~MSG
|
94
|
+
"#{event_name.inspect} is not a valid event name. It must be a Symbol."
|
95
|
+
MSG
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
@@ -23,7 +23,7 @@ module Spree
|
|
23
23
|
field.dispatchEvent(event);
|
24
24
|
JS
|
25
25
|
else
|
26
|
-
fill_in locator, with:
|
26
|
+
fill_in locator, with:
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
@@ -110,6 +110,16 @@ module Spree
|
|
110
110
|
# find the original.
|
111
111
|
find('label:not(.select2-offscreen)', text: /#{Regexp.escape(text)}/i, match: :one)
|
112
112
|
end
|
113
|
+
|
114
|
+
def dialog(parent: 'body', **options)
|
115
|
+
within(parent) do
|
116
|
+
find('dialog', visible: :all, **options)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
def turbo_frame_modal
|
121
|
+
dialog(parent: find('turbo-frame', visible: :all))
|
122
|
+
end
|
113
123
|
end
|
114
124
|
end
|
115
125
|
end
|
@@ -1,38 +1,91 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
unless defined?(Solidus::InstallGenerator)
|
4
|
-
require 'generators/solidus/install/install_generator'
|
5
|
-
end
|
6
|
-
|
7
3
|
require 'generators/spree/dummy/dummy_generator'
|
8
4
|
|
9
|
-
|
10
|
-
|
11
|
-
args.with_defaults(user_class: "Spree::LegacyUser")
|
12
|
-
require ENV['LIB_NAME']
|
5
|
+
class CommonRakeTasks
|
6
|
+
include Rake::DSL
|
13
7
|
|
14
|
-
|
8
|
+
def initialize
|
9
|
+
namespace :common do
|
10
|
+
task :test_app, :user_class do |_t, args|
|
11
|
+
args.with_defaults(user_class: "Spree::LegacyUser")
|
12
|
+
lib_name = ENV['LIB_NAME'] or
|
13
|
+
raise "Please provide a library name via the LIB_NAME environment variable."
|
14
|
+
|
15
|
+
require lib_name
|
16
|
+
|
17
|
+
force_rails_environment_to_test
|
18
|
+
|
19
|
+
Spree::DummyGenerator.start [
|
20
|
+
"--lib-name=#{lib_name}",
|
21
|
+
"--quiet",
|
22
|
+
]
|
23
|
+
|
24
|
+
# While the dummy app is generated the current directory
|
25
|
+
# within ruby is changed to that of the dummy app.
|
26
|
+
sh({
|
27
|
+
'FRONTEND' => ENV['FRONTEND'] || 'none',
|
28
|
+
}, [
|
29
|
+
'bin/rails',
|
30
|
+
'generate',
|
31
|
+
'solidus:install',
|
32
|
+
Dir.pwd, # use the current dir as Rails.root
|
33
|
+
"--auto-accept",
|
34
|
+
"--admin-preview=#{ENV.fetch('ADMIN_PREVIEW', 'false')}",
|
35
|
+
"--authentication=none",
|
36
|
+
"--payment-method=none",
|
37
|
+
"--migrate=false",
|
38
|
+
"--seed=false",
|
39
|
+
"--sample=false",
|
40
|
+
"--user-class=#{args[:user_class]}",
|
41
|
+
"--quiet",
|
42
|
+
].shelljoin)
|
43
|
+
|
44
|
+
if Bundler.locked_gems.dependencies['solidus_frontend']
|
45
|
+
sh "bin/rails g solidus_frontend:install --auto-accept"
|
46
|
+
end
|
47
|
+
|
48
|
+
puts "Setting up dummy database..."
|
15
49
|
|
16
|
-
|
17
|
-
|
50
|
+
sh "bin/rails db:environment:set RAILS_ENV=test"
|
51
|
+
sh "bin/rails db:drop db:create db:migrate VERBOSE=false RAILS_ENV=test"
|
18
52
|
|
19
|
-
|
53
|
+
if extension_installation_generator_exists?
|
54
|
+
puts 'Running extension installation generator...'
|
55
|
+
sh "bin/rails generate #{rake_generator_namespace}:install --auto-run-migrations"
|
56
|
+
end
|
57
|
+
end
|
20
58
|
|
21
|
-
|
22
|
-
|
59
|
+
task :seed do |_t, _args|
|
60
|
+
puts "Seeding ..."
|
23
61
|
|
24
|
-
|
25
|
-
|
26
|
-
puts 'Running extension installation generator...'
|
27
|
-
"#{ENV['LIB_NAMESPACE'] || ENV['LIB_NAME'].camelize}::Generators::InstallGenerator".constantize.start(["--auto-run-migrations"])
|
28
|
-
rescue LoadError
|
29
|
-
# No extension generator to run
|
62
|
+
sh "bundle exec rake db:seed RAILS_ENV=test"
|
63
|
+
end
|
30
64
|
end
|
31
65
|
end
|
32
66
|
|
33
|
-
|
34
|
-
puts "Seeding ..."
|
67
|
+
private
|
35
68
|
|
36
|
-
|
69
|
+
def force_rails_environment_to_test
|
70
|
+
ENV["RAILS_ENV"] = 'test'
|
71
|
+
Rails.env = 'test'
|
72
|
+
end
|
73
|
+
|
74
|
+
def extension_installation_generator_exists?
|
75
|
+
require "generators/#{generator_namespace}/install/install_generator"
|
76
|
+
|
77
|
+
true
|
78
|
+
rescue LoadError
|
79
|
+
false
|
80
|
+
end
|
81
|
+
|
82
|
+
def generator_namespace
|
83
|
+
"#{ENV['LIB_NAMESPACE']&.underscore || ENV['LIB_NAME']}"
|
84
|
+
end
|
85
|
+
|
86
|
+
def rake_generator_namespace
|
87
|
+
generator_namespace.gsub("/", ":")
|
37
88
|
end
|
38
89
|
end
|
90
|
+
|
91
|
+
CommonRakeTasks.new
|