spree_pluggto 0.0.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 (37) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +21 -0
  3. data/.rspec +3 -0
  4. data/.rubocop.yml +24 -0
  5. data/.travis.yml +31 -0
  6. data/Appraisals +29 -0
  7. data/Gemfile +16 -0
  8. data/LICENSE +26 -0
  9. data/README.md +49 -0
  10. data/Rakefile +21 -0
  11. data/app/assets/javascripts/spree/backend/spree_pluggto.js +2 -0
  12. data/app/assets/javascripts/spree/frontend/spree_pluggto.js +2 -0
  13. data/app/assets/stylesheets/spree/backend/spree_pluggto.css +4 -0
  14. data/app/assets/stylesheets/spree/frontend/spree_pluggto.css +4 -0
  15. data/app/controllers/spree/admin/pluggto_settings_controller.rb +35 -0
  16. data/app/jobs/spree_pluggto/upsert_all_products_job.rb +9 -0
  17. data/app/jobs/spree_pluggto/upsert_product_job.rb +9 -0
  18. data/app/models/pluggto_settings.rb +2 -0
  19. data/app/models/spree_pluggto/spree/product_decorator.rb +19 -0
  20. data/app/overrides/add_settings_to_admin_configurations.rb +6 -0
  21. data/app/services/spree_pluggto/api.rb +15 -0
  22. data/app/services/spree_pluggto/oauth.rb +48 -0
  23. data/app/services/spree_pluggto/product.rb +75 -0
  24. data/app/services/spree_pluggto/request.rb +44 -0
  25. data/app/views/spree/admin/pluggto_settings/edit.html.erb +53 -0
  26. data/bin/rails +8 -0
  27. data/config/locales/en.yml +7 -0
  28. data/config/locales/pt-BR.yml +8 -0
  29. data/config/routes.rb +7 -0
  30. data/db/migrate/20210706173803_create_pluggto_settings.rb +15 -0
  31. data/lib/generators/spree_pluggto/install/install_generator.rb +30 -0
  32. data/lib/spree_pluggto.rb +4 -0
  33. data/lib/spree_pluggto/engine.rb +20 -0
  34. data/lib/spree_pluggto/factories.rb +6 -0
  35. data/lib/spree_pluggto/version.rb +18 -0
  36. data/spree_pluggto.gemspec +43 -0
  37. metadata +330 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 5ae3878fc284dd546b09e3727584623e83e05c22c2fac94dcfe93bda9f4c05e8
4
+ data.tar.gz: 6b854eab6ca059e4da37b88736071e1ed487be9bb2cf41d5605ab9061b6ada09
5
+ SHA512:
6
+ metadata.gz: 30a7cb6ff330b2afed6c6d5fbd12edd6f28a9f0b428711a1232b1e3ad37018750b88d5ec93ac8ab24b74d8c70ebd3b799a2148d442789969120633f234098c12
7
+ data.tar.gz: 74e53fbb3d536b328b2366cf8d3ec7f02cb5e6a6dc3a603141f41893f12e9a732cf50b016be06450fc90f66daf1c92c1063cc5165ebabba295b1f4a047bd745f
data/.gitignore ADDED
@@ -0,0 +1,21 @@
1
+ \#*
2
+ *~
3
+ .#*
4
+ .DS_Store
5
+ .idea
6
+ .localeapp/locales
7
+ .project
8
+ coverage
9
+ default
10
+ Gemfile.lock
11
+ tmp
12
+ nbproject
13
+ pkg
14
+ *.sw?
15
+ spec/dummy
16
+ .rvmrc
17
+ .sass-cache
18
+ public/spree
19
+ .ruby-version
20
+ .ruby-gemset
21
+ gemfiles/*.gemfile.lock
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --color
2
+ -r spec_helper
3
+ -f documentation
data/.rubocop.yml ADDED
@@ -0,0 +1,24 @@
1
+ AllCops:
2
+ DisplayCopNames: true
3
+ TargetRubyVersion: 2.4
4
+ Include:
5
+ - '**/Gemfile'
6
+ - '**/Rakefile'
7
+ - '**/Appraisals'
8
+ Exclude:
9
+ - 'spec/dummy/**/*'
10
+ - 'lib/generators/**/*'
11
+
12
+ Rails:
13
+ Enabled: true
14
+
15
+ Metrics/LineLength:
16
+ Max: 150
17
+
18
+ # DISABLED
19
+
20
+ Style/Documentation:
21
+ Enabled: false
22
+
23
+ Style/FrozenStringLiteralComment:
24
+ Enabled: false
data/.travis.yml ADDED
@@ -0,0 +1,31 @@
1
+ sudo: required
2
+ dist: trusty
3
+
4
+ language: ruby
5
+
6
+ env:
7
+ - DB=postgres
8
+ - DB=mysql
9
+
10
+ gemfile:
11
+ - gemfiles/spree_3_1.gemfile
12
+ - gemfiles/spree_3_2.gemfile
13
+ - gemfiles/spree_3_3.gemfile
14
+ - gemfiles/spree_3_4.gemfile
15
+ - gemfiles/spree_master.gemfile
16
+
17
+ script:
18
+ - bundle exec rake test_app
19
+ - bundle exec rake spec
20
+
21
+ rvm:
22
+ - 2.4.2
23
+ - 2.3.1
24
+ - 2.2.7
25
+
26
+ matrix:
27
+ allow_failures:
28
+ - gemfile: gemfiles/spree_master.gemfile
29
+
30
+ before_install:
31
+ - mysql -u root -e "GRANT ALL ON *.* TO 'travis'@'%';"
data/Appraisals ADDED
@@ -0,0 +1,29 @@
1
+ appraise 'spree-3-1' do
2
+ gem 'spree', '~> 3.1.0'
3
+ gem 'spree_auth_devise', '~> 3.1.0'
4
+ gem 'rails_test_params_backport', group: :test
5
+ end
6
+
7
+ appraise 'spree-3-2' do
8
+ gem 'spree', '~> 3.2.0'
9
+ gem 'spree_auth_devise', '~> 3.2.0'
10
+ gem 'rails-controller-testing'
11
+ end
12
+
13
+ appraise 'spree-3-3' do
14
+ gem 'spree', '~> 3.3.0'
15
+ gem 'spree_auth_devise', '~> 3.3.0'
16
+ gem 'rails-controller-testing'
17
+ end
18
+
19
+ appraise 'spree-3-4' do
20
+ gem 'spree', '~> 3.4.0'
21
+ gem 'spree_auth_devise', '~> 3.3.0'
22
+ gem 'rails-controller-testing'
23
+ end
24
+
25
+ appraise 'spree-master' do
26
+ gem 'spree', github: 'spree/spree', branch: 'master'
27
+ gem 'spree_auth_devise', github: 'spree/spree_auth_devise', branch: 'master'
28
+ gem 'rails-controller-testing'
29
+ end
data/Gemfile ADDED
@@ -0,0 +1,16 @@
1
+ source 'https://rubygems.org'
2
+
3
+ git_source(:github) do |repo_name|
4
+ repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?('/')
5
+ "https://github.com/#{repo_name}.git"
6
+ end
7
+
8
+ gem 'spree', github: 'spree/spree', branch: 'master'
9
+ # Provides basic authentication functionality for testing parts of your engine
10
+ gem 'spree_auth_devise', github: 'spree/spree_auth_devise', branch: 'master'
11
+ gem 'rails-controller-testing'
12
+
13
+ gem 'rubocop', require: false
14
+ gem 'rubocop-rspec', require: false
15
+
16
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,26 @@
1
+ Copyright (c) 2021 [name of plugin creator]
2
+ All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without modification,
5
+ are permitted provided that the following conditions are met:
6
+
7
+ * Redistributions of source code must retain the above copyright notice,
8
+ this list of conditions and the following disclaimer.
9
+ * Redistributions in binary form must reproduce the above copyright notice,
10
+ this list of conditions and the following disclaimer in the documentation
11
+ and/or other materials provided with the distribution.
12
+ * Neither the name Spree nor the names of its contributors may be used to
13
+ endorse or promote products derived from this software without specific
14
+ prior written permission.
15
+
16
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
20
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
23
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
24
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
25
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
data/README.md ADDED
@@ -0,0 +1,49 @@
1
+ # SpreePluggto
2
+
3
+ Introduction goes here.
4
+
5
+ ## Installation
6
+
7
+ 1. Add this extension to your Gemfile with this line:
8
+ ```ruby
9
+ gem 'spree_pluggto', github: '[your-github-handle]/spree_pluggto'
10
+ ```
11
+
12
+ 2. Install the gem using Bundler:
13
+ ```ruby
14
+ bundle install
15
+ ```
16
+
17
+ 3. Copy & run migrations
18
+ ```ruby
19
+ bundle exec rails g spree_pluggto:install
20
+ ```
21
+
22
+ 4. Restart your server
23
+
24
+ If your server was running, restart it so that it can find the assets properly.
25
+
26
+ ## Testing
27
+
28
+ First bundle your dependencies, then run `rake`. `rake` will default to building the dummy app if it does not exist, then it will run specs. The dummy app can be regenerated by using `rake test_app`.
29
+
30
+ ```shell
31
+ bundle
32
+ bundle exec rake
33
+ ```
34
+
35
+ When testing your applications integration with this extension you may use it's factories.
36
+ Simply add this require statement to your spec_helper:
37
+
38
+ ```ruby
39
+ require 'spree_pluggto/factories'
40
+ ```
41
+
42
+
43
+ ## Contributing
44
+
45
+ If you'd like to contribute, please take a look at the
46
+ [instructions](CONTRIBUTING.md) for installing dependencies and crafting a good
47
+ pull request.
48
+
49
+ Copyright (c) 2021 [name of extension creator], released under the New BSD License
data/Rakefile ADDED
@@ -0,0 +1,21 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
3
+
4
+ require 'rspec/core/rake_task'
5
+ require 'spree/testing_support/extension_rake'
6
+
7
+ RSpec::Core::RakeTask.new
8
+
9
+ task :default do
10
+ if Dir['spec/dummy'].empty?
11
+ Rake::Task[:test_app].invoke
12
+ Dir.chdir('../../')
13
+ end
14
+ Rake::Task[:spec].invoke
15
+ end
16
+
17
+ desc 'Generates a dummy app for testing'
18
+ task :test_app do
19
+ ENV['LIB_NAME'] = 'spree_pluggto'
20
+ Rake::Task['extension:test_app'].invoke
21
+ end
@@ -0,0 +1,2 @@
1
+ // Placeholder manifest file.
2
+ // the installer will append this file to the app vendored assets here: vendor/assets/javascripts/spree/backend/all.js'
@@ -0,0 +1,2 @@
1
+ // Placeholder manifest file.
2
+ // the installer will append this file to the app vendored assets here: vendor/assets/javascripts/spree/frontend/all.js'
@@ -0,0 +1,4 @@
1
+ /*
2
+ Placeholder manifest file.
3
+ the installer will append this file to the app vendored assets here: 'vendor/assets/stylesheets/spree/backend/all.css'
4
+ */
@@ -0,0 +1,4 @@
1
+ /*
2
+ Placeholder manifest file.
3
+ the installer will append this file to the app vendored assets here: 'vendor/assets/stylesheets/spree/frontend/all.css'
4
+ */
@@ -0,0 +1,35 @@
1
+ module Spree
2
+ module Admin
3
+ class PluggtoSettingsController < Spree::Admin::BaseController
4
+ before_action :set_pluggto_settings
5
+
6
+ # Heavily inspired by SpreeMailchimpEcommerce
7
+ # https://github.com/spree-contrib/spree_mailchimp_ecommerce
8
+ # https://github.com/spree/spree/blob/master/backend/app/controllers/spree/admin/orders/customer_details_controller.rb
9
+
10
+ def edit
11
+ end
12
+
13
+ def update
14
+ @pluggto_settings.update(pluggto_settings_params)
15
+ redirect_to edit_admin_pluggto_settings_path
16
+ end
17
+
18
+ def upload_all_products
19
+ flash[:success] = Spree.t(:pluggto_products_being_uploaded)
20
+ ::SpreePluggto::UpsertAllProductsJob.perform_later
21
+ redirect_to edit_admin_pluggto_settings_path
22
+ end
23
+
24
+ private
25
+
26
+ def set_pluggto_settings
27
+ @pluggto_settings = PluggtoSettings.first_or_create
28
+ end
29
+
30
+ def pluggto_settings_params
31
+ params.require(:pluggto_settings).permit(:client_id,:client_secret,:username,:password)
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,9 @@
1
+ module SpreePluggto
2
+ class UpsertAllProductsJob < ActiveJob::Base
3
+ def perform
4
+ ::Spree::Product.each do |product|
5
+ ::SpreePluggto::UpsertProductJob.perform_now(product.id)
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module SpreePluggto
2
+ class UpsertProductJob < ApplicationJob
3
+ # UPSERT => Updates the record if it exists, inserts if it is new
4
+ def perform(product_id)
5
+ product = Spree::Product.find!(product_id)
6
+ SpreePluggto::Product.upsert(product)
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,2 @@
1
+ class PluggtoSettings < ActiveRecord::Base
2
+ end
@@ -0,0 +1,19 @@
1
+ module SpreePluggto
2
+ module Spree
3
+ module ProductDecorator
4
+ def self.prepended(base)
5
+ base.after_create :upsert_pluggto_product
6
+ base.after_update :upsert_pluggto_product
7
+ end
8
+
9
+ private
10
+
11
+ def upsert_pluggto_product
12
+ ::SpreePluggto::UpsertProductJob.perform_later(pluggto_product)
13
+ end
14
+
15
+ end
16
+ end
17
+ end
18
+
19
+ Spree::Product.prepend(SpreePluggto::Spree::ProductDecorator)
@@ -0,0 +1,6 @@
1
+ Deface::Override.new(
2
+ virtual_path: "spree/admin/shared/sub_menu/_configuration",
3
+ name: "add_pluggto_settings_configuration_menu",
4
+ insert_bottom: '[data-hook="admin_configurations_sidebar_menu"]',
5
+ text: '<%= configurations_sidebar_menu_item "Plugg.to settings", spree.edit_admin_pluggto_settings_path %>'
6
+ )
@@ -0,0 +1,15 @@
1
+ module SpreePluggto
2
+ class Api
3
+ def find_product(spree_product)
4
+ SpreePluggto::Request.new.get("/products/{pluggto_product_id}")
5
+ end
6
+
7
+ def upset_product(spree_product)
8
+ SpreePluggto::Request.new.put("/skus/#{product.sku}", product.pluggto_product.to_json)
9
+ end
10
+
11
+ def upsert_variant(spree_variant)
12
+ SpreePluggto::Request.new.put("/skus/#{spree_variant.sku}", body)
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,48 @@
1
+ module SpreePluggto
2
+ class Oauth
3
+ attr_accessor :settings
4
+
5
+ def initialize
6
+ @settings = PluggtoSettings.first_or_create
7
+ refresh_token! unless valid_token?
8
+ end
9
+
10
+ def get_token
11
+ settings.access_token
12
+ end
13
+
14
+ def valid_token?
15
+ settings.token_expires_at.present? && settings.token_expires_at > (DateTime.now + 5.minutes)
16
+ end
17
+
18
+ def refresh_token!
19
+ grant_type = settings.refresh_token.present? ? "refresh_token" : "password"
20
+ body = {
21
+ client_id: settings.client_id,
22
+ client_secret: settings.client_secret,
23
+ username: settings.username,
24
+ password: settings.password,
25
+ refresh_token: settings.refresh_token,
26
+ grant_type: grant_type
27
+ }
28
+ response = oauth_request.post("/oauth/token", body)
29
+ settings.update(
30
+ access_token: response.body['access_token'],
31
+ refresh_token: response.body['refresh_token'],
32
+ token_expires_at: response.body['expires_in'].to_i.seconds.from_now
33
+ ) if response.success?
34
+ @settings = settings
35
+ end
36
+
37
+ private
38
+
39
+ # Different request for OAuth since it expects form-encoded data instead of a json
40
+ def oauth_request
41
+ @oauth_request ||= Faraday.new(url:"https://api.plugg.to") do |builder|
42
+ builder.request :url_encoded # form-encode params
43
+ builder.response :json
44
+ builder.adapter Faraday.default_adapter
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,75 @@
1
+ module SpreePluggto
2
+ class Product
3
+ class << self
4
+
5
+ # UPSERT => Updates the record if it exists, inserts if it is new
6
+ def upsert(product)
7
+ SpreePluggto::Request.new.put("/skus/#{product.sku}", params(product).to_json)
8
+ end
9
+
10
+ def find(product)
11
+ SpreePluggto::Request.new.get("/skus/#{product.sku}")
12
+ end
13
+
14
+ private
15
+
16
+ def params(product)
17
+ {
18
+ "sku": product.sku,
19
+ "name": product.name,
20
+ "special_price": product.on_sale? ? product.sale_price : nil,
21
+ "price": product.price,
22
+ "description": product.description,
23
+ "brand": product.brand,
24
+ "warranty_time": product.try(:months_of_warranty),
25
+ "warranty_message": product.lifetime_warranty? ? "Garantia vitalícia" : "",
26
+ "link": "#{::Rails.application.routes.url_helpers.spree_url}products/#{product.slug}",
27
+ "categories": product.taxons.map { |taxon| {"name": taxon.name } },
28
+ "handling_time": Spree::Config.try(:handling_time),
29
+ "ean_not_mandatory": true,
30
+ "dimension": {
31
+ "length": product.depth,
32
+ "width": product.width,
33
+ "height": product.height,
34
+ "weight": product.weight
35
+ },
36
+ "photos": product.images.map { |image|
37
+ {
38
+ "url": image.attachment.url(:big),
39
+ "name": name,
40
+ "title": name,
41
+ "order": image.position,
42
+ "external": image.attachment.url(:big)
43
+ }
44
+ },
45
+ "variations": product.variants.map { |variant|
46
+ {
47
+ "sku": variant.sku,
48
+ "name": variant.name,
49
+ "quantity": variant.total_on_hand.finite? ? variant.total_on_hand : 99,
50
+ "special_price": variant.product.on_sale? ? variant.product.sale_price : nil,
51
+ "price": variant.price,
52
+ "attributes": variant.option_values.map { |option_value|
53
+ {
54
+ "code": option_value.option_type.name,
55
+ "label": option_value.option_type.name,
56
+ "value": { "code": option_value.name, "label": option_value.name }
57
+ }
58
+ },
59
+ "photos": product.images.map { |image|
60
+ {
61
+ "url": image.attachment.url(:big),
62
+ "name": variant.name,
63
+ "title": variant.name,
64
+ "order": image.position,
65
+ "external": image.attachment.url(:big)
66
+ }
67
+ }
68
+ }
69
+ }
70
+ }
71
+ end
72
+
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,44 @@
1
+ module SpreePluggto
2
+ class Request
3
+ attr_reader :access_token
4
+
5
+ def initialize
6
+ @access_token = SpreePluggto::Oauth.new.get_token
7
+ end
8
+
9
+ def get(path, body = {})
10
+ response = request.get(path, body)
11
+ response.success? ? response.body : raise_error(response)
12
+ end
13
+
14
+ def put(path, body = {})
15
+ response = request.put(path, body)
16
+ response.success? ? response.body : raise_error(response)
17
+ end
18
+
19
+ def post(path, body = {})
20
+ response = request.post(path, body)
21
+ response.success? ? response.body : raise_error(response)
22
+ end
23
+
24
+ private
25
+
26
+ def request
27
+ @request ||= Faraday.new(url:"https://api.plugg.to") do |conn|
28
+ conn.request :oauth2, access_token, token_type: 'bearer'
29
+ conn.request :json
30
+ conn.response :json
31
+ conn.adapter Faraday.default_adapter
32
+ end
33
+ end
34
+
35
+ def raise_error(response)
36
+ message = {
37
+ status: response.status,
38
+ reason: response.reason_phrase,
39
+ body: response.body,
40
+ }
41
+ fail Exception.new(message)
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,53 @@
1
+ <% content_for :page_title do %>
2
+ <%= Spree.t(:pluggto_settings) %>
3
+ <% end %>
4
+
5
+ <%= form_for @pluggto_settings, url: admin_pluggto_settings_path do |f| %>
6
+ <div class="row">
7
+ <div class="col-xs-12 col-md-4">
8
+ <div class="form-group" data-hook="admin_general_setting_input_name">
9
+ <%= f.label :client_id, "client_id" %>
10
+ <%= f.text_field :client_id, class: 'form-control' %>
11
+ </div>
12
+ </div>
13
+ <div class="col-xs-12 col-md-4">
14
+ <div class="form-group" data-hook="admin_general_setting_input_seo_title">
15
+ <%= f.label :client_secret, 'client_secret' %>
16
+ <%= f.text_field :client_secret, class: 'form-control' %>
17
+ </div>
18
+ </div>
19
+ </div>
20
+
21
+ <div class="row">
22
+ <div class="col-xs-12 col-md-4">
23
+ <div class="form-group" data-hook="admin_general_setting_input_name">
24
+ <%= f.label :username %>
25
+ <%= f.text_field :username, class: 'form-control' %>
26
+ </div>
27
+ </div>
28
+ <div class="col-xs-12 col-md-4">
29
+ <div class="form-group" data-hook="admin_general_setting_input_seo_title">
30
+ <%= f.label :password %>
31
+ <%= f.text_field :password, class: 'form-control' %>
32
+ </div>
33
+ </div>
34
+ </div>
35
+
36
+ <div class="form-actions" data-hook="buttons">
37
+ <%= render partial: 'spree/admin/shared/edit_resource_links', locals: {collection_url: edit_admin_pluggto_settings_path} %>
38
+ </div>
39
+ <% end %>
40
+
41
+
42
+ <div class="row" style="margin-top: 40px">
43
+ <div class="col-md-6">
44
+ <div class="panel panel-default">
45
+ <div class="panel-heading">
46
+ <h1 class="panel-title"><%= Spree.t(:products) %></h1>
47
+ </div>
48
+ <div class="panel-body">
49
+ <%= link_to Spree.t(:upload_all_products_to_pluggto), upload_all_products_admin_pluggto_settings_path, class: 'btn btn-primary' %>
50
+ </div>
51
+ </div>
52
+ </div>
53
+ </div>
data/bin/rails ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+ # This command will automatically be run when you run "rails" from the root of your extension
3
+
4
+ ENGINE_ROOT = File.expand_path('../..', __FILE__)
5
+ ENGINE_PATH = File.expand_path('../../lib/spree_pluggto/engine', __FILE__)
6
+
7
+ require 'rails/all'
8
+ require 'rails/engine/commands'
@@ -0,0 +1,7 @@
1
+ # Sample localization file for English. Add more files in this directory for other locales.
2
+ # See https://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points.
3
+
4
+ en:
5
+ hello: "Hello world"
6
+ spree:
7
+ upload_all_products_to_pluggto:
@@ -0,0 +1,8 @@
1
+ # Sample localization file for English. Add more files in this directory for other locales.
2
+ # See https://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points.
3
+
4
+ pt-BR:
5
+ hello: "Hello world"
6
+ spree:
7
+ upload_all_products_to_pluggto: Enviar todos produtos para o Plugg.to
8
+ pluggto_products_being_uploaded: Os produtos estão sendo enviados para o Plugg.to
data/config/routes.rb ADDED
@@ -0,0 +1,7 @@
1
+ Spree::Core::Engine.routes.draw do
2
+ namespace :admin do
3
+ resource :pluggto_settings do
4
+ get :upload_all_products
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,15 @@
1
+ class CreatePluggtoSettings < ActiveRecord::Migration[5.1]
2
+ def change
3
+ create_table :pluggto_settings do |t|
4
+ t.column :client_id, :string
5
+ t.column :client_secret, :string
6
+ t.column :username, :string
7
+ t.column :password, :string
8
+ t.column :access_token, :string
9
+ t.column :refresh_token, :string
10
+ t.column :token_expires_at, :datetime
11
+
12
+ t.timestamps
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,30 @@
1
+ module SpreePluggto
2
+ module Generators
3
+ class InstallGenerator < Rails::Generators::Base
4
+ class_option :auto_run_migrations, type: :boolean, default: false
5
+
6
+ def add_javascripts
7
+ append_file 'vendor/assets/javascripts/spree/frontend/all.js', "//= require spree/frontend/spree_pluggto\n"
8
+ append_file 'vendor/assets/javascripts/spree/backend/all.js', "//= require spree/backend/spree_pluggto\n"
9
+ end
10
+
11
+ def add_stylesheets
12
+ inject_into_file 'vendor/assets/stylesheets/spree/frontend/all.css', " *= require spree/frontend/spree_pluggto\n", before: %r{\*\/}, verbose: true
13
+ inject_into_file 'vendor/assets/stylesheets/spree/backend/all.css', " *= require spree/backend/spree_pluggto\n", before: %r{\*\/}, verbose: true
14
+ end
15
+
16
+ def add_migrations
17
+ run 'bundle exec rake railties:install:migrations FROM=spree_pluggto'
18
+ end
19
+
20
+ def run_migrations
21
+ run_migrations = options[:auto_run_migrations] || ['', 'y', 'Y'].include?(ask('Would you like to run the migrations now? [Y/n]'))
22
+ if run_migrations
23
+ run 'bundle exec rake db:migrate'
24
+ else
25
+ puts 'Skipping rake db:migrate, don\'t forget to run it!'
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,4 @@
1
+ require 'spree_core'
2
+ require 'spree_extension'
3
+ require 'spree_pluggto/engine'
4
+ require 'spree_pluggto/version'
@@ -0,0 +1,20 @@
1
+ module SpreePluggto
2
+ class Engine < Rails::Engine
3
+ require 'spree/core'
4
+ isolate_namespace Spree
5
+ engine_name 'spree_pluggto'
6
+
7
+ # use rspec for tests
8
+ config.generators do |g|
9
+ g.test_framework :rspec
10
+ end
11
+
12
+ def self.activate
13
+ Dir.glob(File.join(File.dirname(__FILE__), '../../app/**/*_decorator*.rb')) do |c|
14
+ Rails.configuration.cache_classes ? require(c) : load(c)
15
+ end
16
+ end
17
+
18
+ config.to_prepare(&method(:activate).to_proc)
19
+ end
20
+ end
@@ -0,0 +1,6 @@
1
+ FactoryBot.define do
2
+ # Define your Spree extensions Factories within this file to enable applications, and other extensions to use and override them.
3
+ #
4
+ # Example adding this to your spec_helper will load these Factories for use:
5
+ # require 'spree_pluggto/factories'
6
+ end
@@ -0,0 +1,18 @@
1
+ module SpreePluggto
2
+ module_function
3
+
4
+ # Returns the version of the currently loaded SpreePluggto as a
5
+ # <tt>Gem::Version</tt>.
6
+ def version
7
+ Gem::Version.new VERSION::STRING
8
+ end
9
+
10
+ module VERSION
11
+ MAJOR = 0
12
+ MINOR = 0
13
+ TINY = 1
14
+ # PRE = 'alpha'.freeze
15
+
16
+ STRING = [MAJOR, MINOR, TINY].compact.join('.')
17
+ end
18
+ end
@@ -0,0 +1,43 @@
1
+ # encoding: UTF-8
2
+ lib = File.expand_path('../lib/', __FILE__)
3
+ $LOAD_PATH.unshift lib unless $LOAD_PATH.include?(lib)
4
+
5
+ require 'spree_pluggto/version'
6
+
7
+ Gem::Specification.new do |s|
8
+ s.platform = Gem::Platform::RUBY
9
+ s.name = 'spree_pluggto'
10
+ s.version = SpreePluggto.version
11
+ s.summary = 'Connect Spree to Plugg.to'
12
+ s.description = 'Spree extensions that connect your Spree application with the Plugg.to system via Plugg.to Plugin system'
13
+ s.required_ruby_version = '>= 2.2.7'
14
+
15
+ s.author = 'Lucas Kuhn'
16
+ s.email = 'lucas@nordweg.com'
17
+ s.homepage = 'https://github.com/nordweg/spree_pluggto'
18
+ s.license = 'BSD-3-Clause'
19
+
20
+ s.files = `git ls-files`.split("\n").reject { |f| f.match(/^spec/) && !f.match(/^spec\/fixtures/) }
21
+ s.require_path = 'lib'
22
+ s.requirements << 'none'
23
+
24
+ spree_version = '>= 3.1.0', '< 4.0'
25
+ s.add_dependency 'spree_core', spree_version
26
+ s.add_dependency 'spree_backend', spree_version
27
+ s.add_dependency 'spree_extension'
28
+
29
+ s.add_development_dependency 'appraisal'
30
+ s.add_development_dependency 'capybara'
31
+ s.add_development_dependency 'capybara-screenshot'
32
+ s.add_development_dependency 'coffee-rails'
33
+ s.add_development_dependency 'database_cleaner'
34
+ s.add_development_dependency 'factory_bot'
35
+ s.add_development_dependency 'ffaker'
36
+ s.add_development_dependency 'mysql2'
37
+ s.add_development_dependency 'rspec-rails'
38
+ s.add_development_dependency 'sass-rails'
39
+ s.add_development_dependency 'selenium-webdriver'
40
+ s.add_development_dependency 'sqlite3'
41
+ s.add_development_dependency 'pg', '~> 0.18'
42
+ s.add_development_dependency 'simplecov'
43
+ end
metadata ADDED
@@ -0,0 +1,330 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: spree_pluggto
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Lucas Kuhn
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2021-07-13 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: spree_core
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 3.1.0
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '4.0'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: 3.1.0
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '4.0'
33
+ - !ruby/object:Gem::Dependency
34
+ name: spree_backend
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: 3.1.0
40
+ - - "<"
41
+ - !ruby/object:Gem::Version
42
+ version: '4.0'
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: 3.1.0
50
+ - - "<"
51
+ - !ruby/object:Gem::Version
52
+ version: '4.0'
53
+ - !ruby/object:Gem::Dependency
54
+ name: spree_extension
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: '0'
60
+ type: :runtime
61
+ prerelease: false
62
+ version_requirements: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: '0'
67
+ - !ruby/object:Gem::Dependency
68
+ name: appraisal
69
+ requirement: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ version: '0'
74
+ type: :development
75
+ prerelease: false
76
+ version_requirements: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ version: '0'
81
+ - !ruby/object:Gem::Dependency
82
+ name: capybara
83
+ requirement: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - ">="
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ type: :development
89
+ prerelease: false
90
+ version_requirements: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
95
+ - !ruby/object:Gem::Dependency
96
+ name: capybara-screenshot
97
+ requirement: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - ">="
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - ">="
107
+ - !ruby/object:Gem::Version
108
+ version: '0'
109
+ - !ruby/object:Gem::Dependency
110
+ name: coffee-rails
111
+ requirement: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - ">="
114
+ - !ruby/object:Gem::Version
115
+ version: '0'
116
+ type: :development
117
+ prerelease: false
118
+ version_requirements: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - ">="
121
+ - !ruby/object:Gem::Version
122
+ version: '0'
123
+ - !ruby/object:Gem::Dependency
124
+ name: database_cleaner
125
+ requirement: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - ">="
128
+ - !ruby/object:Gem::Version
129
+ version: '0'
130
+ type: :development
131
+ prerelease: false
132
+ version_requirements: !ruby/object:Gem::Requirement
133
+ requirements:
134
+ - - ">="
135
+ - !ruby/object:Gem::Version
136
+ version: '0'
137
+ - !ruby/object:Gem::Dependency
138
+ name: factory_bot
139
+ requirement: !ruby/object:Gem::Requirement
140
+ requirements:
141
+ - - ">="
142
+ - !ruby/object:Gem::Version
143
+ version: '0'
144
+ type: :development
145
+ prerelease: false
146
+ version_requirements: !ruby/object:Gem::Requirement
147
+ requirements:
148
+ - - ">="
149
+ - !ruby/object:Gem::Version
150
+ version: '0'
151
+ - !ruby/object:Gem::Dependency
152
+ name: ffaker
153
+ requirement: !ruby/object:Gem::Requirement
154
+ requirements:
155
+ - - ">="
156
+ - !ruby/object:Gem::Version
157
+ version: '0'
158
+ type: :development
159
+ prerelease: false
160
+ version_requirements: !ruby/object:Gem::Requirement
161
+ requirements:
162
+ - - ">="
163
+ - !ruby/object:Gem::Version
164
+ version: '0'
165
+ - !ruby/object:Gem::Dependency
166
+ name: mysql2
167
+ requirement: !ruby/object:Gem::Requirement
168
+ requirements:
169
+ - - ">="
170
+ - !ruby/object:Gem::Version
171
+ version: '0'
172
+ type: :development
173
+ prerelease: false
174
+ version_requirements: !ruby/object:Gem::Requirement
175
+ requirements:
176
+ - - ">="
177
+ - !ruby/object:Gem::Version
178
+ version: '0'
179
+ - !ruby/object:Gem::Dependency
180
+ name: rspec-rails
181
+ requirement: !ruby/object:Gem::Requirement
182
+ requirements:
183
+ - - ">="
184
+ - !ruby/object:Gem::Version
185
+ version: '0'
186
+ type: :development
187
+ prerelease: false
188
+ version_requirements: !ruby/object:Gem::Requirement
189
+ requirements:
190
+ - - ">="
191
+ - !ruby/object:Gem::Version
192
+ version: '0'
193
+ - !ruby/object:Gem::Dependency
194
+ name: sass-rails
195
+ requirement: !ruby/object:Gem::Requirement
196
+ requirements:
197
+ - - ">="
198
+ - !ruby/object:Gem::Version
199
+ version: '0'
200
+ type: :development
201
+ prerelease: false
202
+ version_requirements: !ruby/object:Gem::Requirement
203
+ requirements:
204
+ - - ">="
205
+ - !ruby/object:Gem::Version
206
+ version: '0'
207
+ - !ruby/object:Gem::Dependency
208
+ name: selenium-webdriver
209
+ requirement: !ruby/object:Gem::Requirement
210
+ requirements:
211
+ - - ">="
212
+ - !ruby/object:Gem::Version
213
+ version: '0'
214
+ type: :development
215
+ prerelease: false
216
+ version_requirements: !ruby/object:Gem::Requirement
217
+ requirements:
218
+ - - ">="
219
+ - !ruby/object:Gem::Version
220
+ version: '0'
221
+ - !ruby/object:Gem::Dependency
222
+ name: sqlite3
223
+ requirement: !ruby/object:Gem::Requirement
224
+ requirements:
225
+ - - ">="
226
+ - !ruby/object:Gem::Version
227
+ version: '0'
228
+ type: :development
229
+ prerelease: false
230
+ version_requirements: !ruby/object:Gem::Requirement
231
+ requirements:
232
+ - - ">="
233
+ - !ruby/object:Gem::Version
234
+ version: '0'
235
+ - !ruby/object:Gem::Dependency
236
+ name: pg
237
+ requirement: !ruby/object:Gem::Requirement
238
+ requirements:
239
+ - - "~>"
240
+ - !ruby/object:Gem::Version
241
+ version: '0.18'
242
+ type: :development
243
+ prerelease: false
244
+ version_requirements: !ruby/object:Gem::Requirement
245
+ requirements:
246
+ - - "~>"
247
+ - !ruby/object:Gem::Version
248
+ version: '0.18'
249
+ - !ruby/object:Gem::Dependency
250
+ name: simplecov
251
+ requirement: !ruby/object:Gem::Requirement
252
+ requirements:
253
+ - - ">="
254
+ - !ruby/object:Gem::Version
255
+ version: '0'
256
+ type: :development
257
+ prerelease: false
258
+ version_requirements: !ruby/object:Gem::Requirement
259
+ requirements:
260
+ - - ">="
261
+ - !ruby/object:Gem::Version
262
+ version: '0'
263
+ description: Spree extensions that connect your Spree application with the Plugg.to
264
+ system via Plugg.to Plugin system
265
+ email: lucas@nordweg.com
266
+ executables: []
267
+ extensions: []
268
+ extra_rdoc_files: []
269
+ files:
270
+ - ".gitignore"
271
+ - ".rspec"
272
+ - ".rubocop.yml"
273
+ - ".travis.yml"
274
+ - Appraisals
275
+ - Gemfile
276
+ - LICENSE
277
+ - README.md
278
+ - Rakefile
279
+ - app/assets/javascripts/spree/backend/spree_pluggto.js
280
+ - app/assets/javascripts/spree/frontend/spree_pluggto.js
281
+ - app/assets/stylesheets/spree/backend/spree_pluggto.css
282
+ - app/assets/stylesheets/spree/frontend/spree_pluggto.css
283
+ - app/controllers/spree/admin/pluggto_settings_controller.rb
284
+ - app/jobs/spree_pluggto/upsert_all_products_job.rb
285
+ - app/jobs/spree_pluggto/upsert_product_job.rb
286
+ - app/models/pluggto_settings.rb
287
+ - app/models/spree_pluggto/spree/product_decorator.rb
288
+ - app/overrides/add_settings_to_admin_configurations.rb
289
+ - app/services/spree_pluggto/api.rb
290
+ - app/services/spree_pluggto/oauth.rb
291
+ - app/services/spree_pluggto/product.rb
292
+ - app/services/spree_pluggto/request.rb
293
+ - app/views/spree/admin/pluggto_settings/edit.html.erb
294
+ - bin/rails
295
+ - config/locales/en.yml
296
+ - config/locales/pt-BR.yml
297
+ - config/routes.rb
298
+ - db/migrate/20210706173803_create_pluggto_settings.rb
299
+ - lib/generators/spree_pluggto/install/install_generator.rb
300
+ - lib/spree_pluggto.rb
301
+ - lib/spree_pluggto/engine.rb
302
+ - lib/spree_pluggto/factories.rb
303
+ - lib/spree_pluggto/version.rb
304
+ - spree_pluggto.gemspec
305
+ homepage: https://github.com/nordweg/spree_pluggto
306
+ licenses:
307
+ - BSD-3-Clause
308
+ metadata: {}
309
+ post_install_message:
310
+ rdoc_options: []
311
+ require_paths:
312
+ - lib
313
+ required_ruby_version: !ruby/object:Gem::Requirement
314
+ requirements:
315
+ - - ">="
316
+ - !ruby/object:Gem::Version
317
+ version: 2.2.7
318
+ required_rubygems_version: !ruby/object:Gem::Requirement
319
+ requirements:
320
+ - - ">="
321
+ - !ruby/object:Gem::Version
322
+ version: '0'
323
+ requirements:
324
+ - none
325
+ rubyforge_project:
326
+ rubygems_version: 2.7.6.2
327
+ signing_key:
328
+ specification_version: 4
329
+ summary: Connect Spree to Plugg.to
330
+ test_files: []