solidus_related_products 1.0.0

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 (78) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +12 -0
  3. data/.hound.yml +25 -0
  4. data/.rspec +3 -0
  5. data/.rubocop.yml +8 -0
  6. data/.travis.yml +15 -0
  7. data/CONTRIBUTING.md +81 -0
  8. data/Gemfile +6 -0
  9. data/Guardfile +10 -0
  10. data/LICENSE.md +26 -0
  11. data/README.md +80 -0
  12. data/Rakefile +15 -0
  13. data/app/assets/javascripts/spree/backend/solidus_related_products.js +1 -0
  14. data/app/assets/javascripts/spree/frontend/solidus_related_products.js +1 -0
  15. data/app/assets/stylesheets/spree/backend/solidus_related_products.css +3 -0
  16. data/app/assets/stylesheets/spree/frontend/solidus_related_products.css +3 -0
  17. data/app/controllers/spree/admin/products_controller_decorator.rb +10 -0
  18. data/app/controllers/spree/admin/relation_types_controller.rb +6 -0
  19. data/app/controllers/spree/admin/relations_controller.rb +80 -0
  20. data/app/controllers/spree/api/relations_controller.rb +78 -0
  21. data/app/models/spree/calculator/related_product_discount.rb +50 -0
  22. data/app/models/spree/product_decorator.rb +106 -0
  23. data/app/models/spree/relation.rb +7 -0
  24. data/app/models/spree/relation_type.rb +6 -0
  25. data/app/overrides/add_product_relation_admin_sub_menu_tab.rb +6 -0
  26. data/app/overrides/add_related_product_admin_tabs.rb +6 -0
  27. data/app/views/spree/admin/products/_related_products.html.erb +3 -0
  28. data/app/views/spree/admin/products/_related_products_table.html.erb +42 -0
  29. data/app/views/spree/admin/products/related.html.erb +70 -0
  30. data/app/views/spree/admin/relation_types/_form.html.erb +19 -0
  31. data/app/views/spree/admin/relation_types/edit.html.erb +14 -0
  32. data/app/views/spree/admin/relation_types/index.html.erb +44 -0
  33. data/app/views/spree/admin/relation_types/new.html.erb +14 -0
  34. data/app/views/spree/admin/relations/create.js.erb +5 -0
  35. data/app/views/spree/admin/relations/destroy.js.erb +1 -0
  36. data/app/views/spree/api/relations/show.v1.rabl +2 -0
  37. data/bin/rails +7 -0
  38. data/config/locales/cs.yml +18 -0
  39. data/config/locales/de.yml +18 -0
  40. data/config/locales/en.yml +18 -0
  41. data/config/locales/es.yml +18 -0
  42. data/config/locales/fr.yml +18 -0
  43. data/config/locales/it.yml +18 -0
  44. data/config/locales/nl.yml +18 -0
  45. data/config/locales/pl.yml +18 -0
  46. data/config/locales/pt-BR.yml +18 -0
  47. data/config/locales/ru.yml +18 -0
  48. data/config/locales/sv.yml +18 -0
  49. data/config/routes.rb +24 -0
  50. data/db/migrate/20100308090631_create_relation_types.rb +14 -0
  51. data/db/migrate/20100308092101_create_relations.rb +14 -0
  52. data/db/migrate/20100324123835_add_discount_to_relation.rb +9 -0
  53. data/db/migrate/20111129044813_prefixing_tables_with_spree.rb +6 -0
  54. data/db/migrate/20120208144454_update_relation_types.rb +9 -0
  55. data/db/migrate/20120623014337_update_relations.rb +11 -0
  56. data/db/migrate/20130727004612_add_position_to_spree_relations.rb +5 -0
  57. data/lib/generators/solidus_related_products/install/install_generator.rb +20 -0
  58. data/lib/solidus_related_products.rb +7 -0
  59. data/lib/solidus_related_products/engine.rb +24 -0
  60. data/lib/solidus_related_products/version.rb +18 -0
  61. data/solidus_related_products.gemspec +45 -0
  62. data/spec/controllers/spree/admin/products_controller_decorator_spec.rb +20 -0
  63. data/spec/controllers/spree/admin/relations_controller_spec.rb +96 -0
  64. data/spec/controllers/spree/api/relations_controller_spec.rb +98 -0
  65. data/spec/factories/relation_factory.rb +7 -0
  66. data/spec/factories/relation_type_factory.rb +6 -0
  67. data/spec/features/spree/admin/product_relation_spec.rb +86 -0
  68. data/spec/features/spree/admin/relation_types_spec.rb +97 -0
  69. data/spec/models/spree/calculator/related_product_discount_spec.rb +48 -0
  70. data/spec/models/spree/product_spec.rb +129 -0
  71. data/spec/models/spree/relation_spec.rb +13 -0
  72. data/spec/models/spree/relation_type_spec.rb +18 -0
  73. data/spec/spec_helper.rb +48 -0
  74. data/spec/support/capybara.rb +20 -0
  75. data/spec/support/database_cleaner.rb +23 -0
  76. data/spec/support/factory_girl.rb +7 -0
  77. data/spec/support/spree.rb +18 -0
  78. metadata +388 -0
@@ -0,0 +1,18 @@
1
+ ---
2
+ de:
3
+ activerecord:
4
+ models:
5
+ spree/relation:
6
+ one: Verwandte
7
+ other: Verhältnis
8
+ spree/relation_type:
9
+ one: Verwandschaftstyp
10
+ other: Verwandschaftstypen
11
+ spree:
12
+ new_relation_type: Neuer Verwandschaftstyp
13
+ related_product_discount: Skonto für verwandte Produkte
14
+ applies_to: Anwenden auf
15
+ related_products: Verwandte Produkte
16
+ add_related_product: Verwandtes Produkt hinzufügen
17
+ name_or_sku_short: Name oder Artikelnummer
18
+ no_relation_types: "Sie müssen Verwandschaftstypen konfigurieren, bevor Sie diese Funktion nutzen können."
@@ -0,0 +1,18 @@
1
+ ---
2
+ en:
3
+ activerecord:
4
+ models:
5
+ spree/relation:
6
+ one: Relation
7
+ other: Relations
8
+ spree/relation_type:
9
+ one: Relation Type
10
+ other: Relation Types
11
+ spree:
12
+ new_relation_type: New Relation Type
13
+ related_product_discount: Related Product Discount
14
+ applies_to: Applies To
15
+ related_products: Related Products
16
+ add_related_product: Add Related Product
17
+ name_or_sku_short: Name or SKU
18
+ no_relation_types: You need to configure Relation Types before you can use this feature.
@@ -0,0 +1,18 @@
1
+ ---
2
+ es:
3
+ activerecord:
4
+ models:
5
+ spree/relation:
6
+ one: Relación
7
+ other: Relaciónes
8
+ spree/relation_type:
9
+ one: Tipo de relación
10
+ other: Tipos de relación
11
+ spree:
12
+ new_relation_type: Nuevo tipo de relación
13
+ related_product_discount: Descuento al producto relacionado
14
+ applies_to: Se aplica a
15
+ related_products: Productos relacionados
16
+ add_related_product: Añadir producto relacionado
17
+ name_or_sku_short: Nombre o SKU
18
+ no_relation_types: Debes configurar tipos de relación antes de poder usar esto.
@@ -0,0 +1,18 @@
1
+ ---
2
+ fr:
3
+ activerecord:
4
+ models:
5
+ spree/relation:
6
+ one: Relation
7
+ other: Relations
8
+ spree/relation_type:
9
+ one: Type de relation
10
+ other: Types de relation
11
+ spree:
12
+ new_relation_type: Nouveau type de relation
13
+ related_product_discount: Rabais de produit connexe
14
+ applies_to: Appliquer à
15
+ related_products: Produits connexes
16
+ add_related_product: Ajouter un produit connexe
17
+ name_or_sku_short: Nom ou code barre
18
+ no_relation_types: Vous devez configurer des types de relation avant de pouvoir utiliser cette fonctionnalité.
@@ -0,0 +1,18 @@
1
+ ---
2
+ it:
3
+ activerecord:
4
+ models:
5
+ spree/relation:
6
+ one: Relazione
7
+ other: Relazioni
8
+ spree/relation_type:
9
+ one: Tipo di Relazione
10
+ other: Tipi di Relazione
11
+ spree:
12
+ new_relation_type: Nuovo Tipo di Relazione
13
+ related_product_discount: Sconto prodotti correlati
14
+ applies_to: Si applica a
15
+ related_products: Prodotti Correlati
16
+ add_related_product: Aggiungi un Prodotto Correlato
17
+ name_or_sku_short: Nome o SKU
18
+ no_relation_types: Devi configurare i Tipi di Relazione prima di poter usare questa funzione.
@@ -0,0 +1,18 @@
1
+ ---
2
+ nl:
3
+ activerecord:
4
+ models:
5
+ spree/relation:
6
+ one: Relatie
7
+ other: Relatie
8
+ spree/relation_type:
9
+ one: Relatie type
10
+ other: Relatie types
11
+ spree:
12
+ new_relation_type: Nieuw relatie type
13
+ related_product_discount: Korting gerelateerd product
14
+ applies_to: Toegepast op
15
+ related_products: Gerelateerde producten
16
+ add_related_product: Gerelateerd product toevoegen
17
+ name_or_sku_short: Naam of SKU
18
+ no_relation_types: Je moet relatie types instellen voordat je deze functie kan gebruiken.
@@ -0,0 +1,18 @@
1
+ ---
2
+ pl:
3
+ activerecord:
4
+ models:
5
+ spree/relation:
6
+ one: Relacja
7
+ other: Relacje
8
+ spree/relation_type:
9
+ one: Typ relacja
10
+ other: Typy relacji
11
+ spree:
12
+ new_relation_type: Nowy typ relacji
13
+ related_product_discount: Zniżka na powiązany produkt
14
+ applies_to: Ma zastosowanie do
15
+ related_products: Produkty powiązane
16
+ add_related_product: Dodaj powiązany produkt
17
+ name_or_sku_short: Nazwa lub SKU
18
+ no_relation_types: Musisz najpierw skonfigurować typy relacji
@@ -0,0 +1,18 @@
1
+ ---
2
+ pt-BR:
3
+ activerecord:
4
+ models:
5
+ spree/relation:
6
+ one: Relação
7
+ other: Relaçãos
8
+ spree/relation_type:
9
+ one: Tipo de relação
10
+ other: Tipos de relação
11
+ spree:
12
+ new_relation_type: Novo tipo de relacionamento
13
+ related_product_discount: Desconto de produto relacionado
14
+ applies_to: Aplicado à
15
+ related_products: Produtos relacionados
16
+ add_related_product: Adicionar produto relacionado
17
+ name_or_sku_short: Nome ou SKU
18
+ no_relation_types: Você precisa configurar os tipos de relacionamento antes de utilizar esta funcionalidade.
@@ -0,0 +1,18 @@
1
+ ---
2
+ ru:
3
+ activerecord:
4
+ models:
5
+ spree/relation:
6
+ one: Oтношение
7
+ other: Oтношения
8
+ spree/relation_type:
9
+ one: Тип Oтношений
10
+ other: Типы Отношений
11
+ spree:
12
+ new_relation_type: Новый Тип Отношений
13
+ related_product_discount: Скидка На Относящийся Товар
14
+ applies_to: Применяется К
15
+ related_products: Относящиеся Товары
16
+ add_related_product: Добавить Относящийся Товар
17
+ name_or_sku_short: Название или Артикул
18
+ no_relation_types: Перед тем как поспользоваться этим функционалом настройте Типы Отношений.
@@ -0,0 +1,18 @@
1
+ ---
2
+ sv:
3
+ activerecord:
4
+ models:
5
+ spree/relation:
6
+ one: Relation
7
+ other: Relationer
8
+ spree/relation_type:
9
+ one: Relationstyp
10
+ other: Relationstyper
11
+ spree:
12
+ new_relation_type: Ny typ av relation
13
+ related_product_discount: Relaterad produkt rabatt
14
+ applies_to: Gäller
15
+ related_products: Relaterade produkter
16
+ add_related_product: Lägg till relaterad produkt
17
+ name_or_sku_short: Namn eller SKU
18
+ no_relation_types: Du måste konfigurera relationstyper innan du kan använda den här funktionen.
@@ -0,0 +1,24 @@
1
+ Spree::Core::Engine.add_routes do
2
+ namespace :admin do
3
+ resources :relation_types
4
+ resources :products, only: [] do
5
+ get :related, on: :member
6
+ resources :relations do
7
+ collection do
8
+ post :update_positions
9
+ end
10
+ end
11
+ end
12
+ end
13
+
14
+ namespace :api, defaults: { format: 'json' } do
15
+ resources :products, only: [] do
16
+ get :related, on: :member
17
+ resources :relations do
18
+ collection do
19
+ post :update_positions
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,14 @@
1
+ class CreateRelationTypes < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :relation_types do |t|
4
+ t.string :name
5
+ t.text :description
6
+ t.string :applies_to
7
+ t.timestamps
8
+ end
9
+ end
10
+
11
+ def self.down
12
+ drop_table :relation_types
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ class CreateRelations < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :relations, force: true do |t|
4
+ t.references :relation_type
5
+ t.references :relatable, polymorphic: true
6
+ t.references :related_to, polymorphic: true
7
+ t.timestamps
8
+ end
9
+ end
10
+
11
+ def self.down
12
+ drop_table :relations
13
+ end
14
+ end
@@ -0,0 +1,9 @@
1
+ class AddDiscountToRelation < ActiveRecord::Migration
2
+ def self.up
3
+ add_column :relations, :discount_amount, :decimal, precision: 8, scale: 2, default: 0.0
4
+ end
5
+
6
+ def self.down
7
+ remove_column :relations, :discount_amount
8
+ end
9
+ end
@@ -0,0 +1,6 @@
1
+ class PrefixingTablesWithSpree < ActiveRecord::Migration
2
+ def change
3
+ rename_table :relation_types, :spree_relation_types
4
+ rename_table :relations, :spree_relations
5
+ end
6
+ end
@@ -0,0 +1,9 @@
1
+ class UpdateRelationTypes < ActiveRecord::Migration
2
+ def up
3
+ Spree::RelationType.where(applies_to: 'Product').update_all(applies_to: 'Spree::Product')
4
+ end
5
+
6
+ def down
7
+ Spree::RelationType.where(applies_to: 'Spree::Product').update_all(applies_to: 'Product')
8
+ end
9
+ end
@@ -0,0 +1,11 @@
1
+ class UpdateRelations < ActiveRecord::Migration
2
+ def up
3
+ Spree::Relation.where(relatable_type: 'Product').update_all(relatable_type: 'Spree::Product')
4
+ Spree::Relation.where(related_to_type: 'Product').update_all(related_to_type: 'Spree::Product')
5
+ end
6
+
7
+ def down
8
+ Spree::Relation.where(relatable_type: 'Spree::Product').update_all(relatable_type: 'Product')
9
+ Spree::Relation.where(related_to_type: 'Spree::Product').update_all(related_to_type: 'Product')
10
+ end
11
+ end
@@ -0,0 +1,5 @@
1
+ class AddPositionToSpreeRelations < ActiveRecord::Migration
2
+ def change
3
+ add_column :spree_relations, :position, :integer
4
+ end
5
+ end
@@ -0,0 +1,20 @@
1
+ module SolidusRelatedProducts
2
+ module Generators
3
+ class InstallGenerator < Rails::Generators::Base
4
+ class_option :auto_run_migrations, type: :boolean, default: false
5
+
6
+ def add_migrations
7
+ run 'bundle exec rake railties:install:migrations FROM=solidus_related_products'
8
+ end
9
+
10
+ def run_migrations
11
+ run_migrations = options[:auto_run_migrations] || ['', 'y', 'Y'].include?(ask 'Would you like to run the migrations now? [Y/n]')
12
+ if run_migrations
13
+ run 'bundle exec rake db:migrate'
14
+ else
15
+ puts 'Skipping rake db:migrate, don\'t forget to run it!'
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,7 @@
1
+ require 'solidus_backend'
2
+ require 'solidus_core'
3
+ require 'solidus_related_products/engine'
4
+ require 'solidus_related_products/version'
5
+ require 'coffee_script'
6
+ require 'sass/rails'
7
+ require 'deface'
@@ -0,0 +1,24 @@
1
+ module SolidusRelatedProducts
2
+ class Engine < Rails::Engine
3
+ require 'spree/core'
4
+ isolate_namespace Spree
5
+ engine_name 'solidus_related_products'
6
+
7
+ config.autoload_paths += %W(#{config.root}/lib #{config.root}/app/models/spree/calculator)
8
+
9
+ initializer 'spree.promo.register.promotion.calculators' do |app|
10
+ app.config.spree.calculators.promotion_actions_create_adjustments << Spree::Calculator::RelatedProductDiscount
11
+ end
12
+
13
+ class << self
14
+ def activate
15
+ cache_klasses = %W(#{config.root}/app/**/*_decorator*.rb)
16
+ Dir.glob(cache_klasses) do |klass|
17
+ Rails.configuration.cache_classes ? require(klass) : load(klass)
18
+ end
19
+ end
20
+ end
21
+
22
+ config.to_prepare(&method(:activate).to_proc)
23
+ end
24
+ end
@@ -0,0 +1,18 @@
1
+ module SolidusRelatedProducts
2
+ module_function
3
+
4
+ # Returns the version of the currently loaded SpreeRelatedProducts as a
5
+ # <tt>Gem::Version</tt>.
6
+ def version
7
+ Gem::Version.new VERSION::STRING
8
+ end
9
+
10
+ module VERSION
11
+ MAJOR = 1
12
+ MINOR = 0
13
+ TINY = 0
14
+ PRE = nil
15
+
16
+ STRING = [MAJOR, MINOR, TINY, PRE].compact.join('.')
17
+ end
18
+ end
@@ -0,0 +1,45 @@
1
+ lib = File.expand_path('../lib/', __FILE__)
2
+ $LOAD_PATH.unshift lib unless $LOAD_PATH.include?(lib)
3
+
4
+ require 'solidus_related_products/version'
5
+
6
+ Gem::Specification.new do |s|
7
+ s.platform = Gem::Platform::RUBY
8
+ s.name = 'solidus_related_products'
9
+ s.version = SolidusRelatedProducts.version
10
+ s.summary = 'Allows multiple types of relationships between products to be defined'
11
+ s.description = s.summary
12
+ s.required_ruby_version = '>= 2.1.0'
13
+
14
+ s.author = 'Brian Quinn'
15
+ s.email = 'brian@railsdog.com'
16
+ s.homepage = 'https://github.com/solidusio-contrib/solidus_related_products'
17
+ s.license = 'BSD-3'
18
+
19
+ s.files = `git ls-files`.split("\n")
20
+ s.test_files = `git ls-files -- spec/*`.split("\n")
21
+ s.require_path = 'lib'
22
+ s.requirements << 'none'
23
+
24
+ s.has_rdoc = false
25
+
26
+ s.add_runtime_dependency 'solidus_backend', '~> 1.0'
27
+ s.add_runtime_dependency 'deface'
28
+
29
+ s.add_development_dependency 'factory_girl', '~> 4.5'
30
+ s.add_development_dependency 'ffaker'
31
+ s.add_development_dependency 'rspec-rails', '~> 3.4'
32
+ s.add_development_dependency 'sqlite3'
33
+ s.add_development_dependency 'capybara', '~> 2.5'
34
+ s.add_development_dependency 'capybara-screenshot', '~> 1.0'
35
+ s.add_development_dependency 'poltergeist', '~> 1.9'
36
+ s.add_development_dependency 'shoulda-matchers', '~> 2.5'
37
+ s.add_development_dependency 'simplecov', '~> 0.9'
38
+ s.add_development_dependency 'database_cleaner', '~> 1.3'
39
+ s.add_development_dependency 'coffee-rails'
40
+ s.add_development_dependency 'sass-rails'
41
+ s.add_development_dependency 'guard-rspec'
42
+ s.add_development_dependency 'pry-rails'
43
+ s.add_development_dependency 'rubocop', '>= 0.24.1'
44
+ s.add_development_dependency 'rspec-activemodel-mocks'
45
+ end
@@ -0,0 +1,20 @@
1
+ RSpec.describe Spree::Admin::ProductsController, type: :controller do
2
+ stub_authorization!
3
+
4
+ let(:user) { create(:user) }
5
+ let!(:product) { create(:product) }
6
+
7
+ before { stub_authentication! }
8
+ after { Spree::Admin::ProductsController.clear_overrides! }
9
+
10
+ context 'related' do
11
+ it 'is not routable' do
12
+ spree_get :related, id: product.id
13
+ expect(response.status).to be(200)
14
+ end
15
+
16
+ it 'responds to model_class as Spree::Relation' do
17
+ expect(controller.send(:model_class)).to eq Spree::Product
18
+ end
19
+ end
20
+ end