spree_pluggto 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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: []