Abraham Rodriguez

Rubocop and handle exceptions correctly

require "bundler/gem_tasks"
require 'bundler/gem_tasks'
......
#!/usr/bin/env ruby
require "bundler/setup"
require "var"
require 'bundler/setup'
require 'var'
# You can add fixtures and/or initialization code here to make experimenting
# with your gem easier. You can also use a different console, if you like.
......@@ -10,5 +10,5 @@ require "var"
# require "pry"
# Pry.start
require "irb"
require 'irb'
IRB.start
......
class AddVarStatusTo<%=@model_name.pluralize.camelize%> < ActiveRecord::Migration
def change
add_column :<%=@model_name.pluralize.underscore%>, :var_status, :string, default: 'pending'
add_column :<%=@model_name.pluralize.underscore%>, :barcode_url, :string
add_column :<%=@model_name.pluralize.underscore%>, :var_barcode_url, :string
add_column :<%=@model_name.pluralize.underscore%>, :var_barcode, :string
add_column :<%=@model_name.pluralize.underscore%>, :var_payment_expires_at, :datetime
add_column :<%=@model_name.pluralize.underscore%>, :var_id, :string
add_column :<%=@model_name.pluralize.underscore%>, :var_service, :string
end
end
......
require 'rails/generators'
# Generator for models
class VarModelGenerator < Rails::Generators::NamedBase
source_root File.expand_path('../templates', __FILE__)
desc "This generator generates layout file with navigation."
desc 'This generator generates layout file with navigation.'
def generate_model
d = Time.now.strftime('%Y%m%d%H%M%S')
@model_name = name
template "var_model.rb",
"db/migrate/#{d}_add_var_status_to_#{name.pluralize.underscore}.rb"
template 'var_model.rb',
"db/migrate/#{d}_add_var_status_to_#{name.pluralize.underscore}.rb"
end
end
......
require "var/version"
require 'var/version'
require 'conekta'
require 'paypal-sdk-rest'
# Main Module
module Var
# TODO: add paypal
# @@valid_services = [:conekta, :paypal]
......@@ -13,15 +14,15 @@ module Var
def self.create_charge(service, object, options = {})
return { error_message: 'Service is not supported' } unless VALID_SERVICES.include? service
return { error_message: "#{object.class.to_s} doesn't support charges"} unless object.respond_to?(:charge_with)
return { error_message: "#{object.class} doesn't support charges" } unless object.respond_to?(:charge_with)
charge = object.charge_with(service, options)
return charge
charge
end
end
# Module for models
module ActsAsChargeable
extend ActiveSupport::Concern
# Class Methods
module ClassMethods
def acts_as_chargeable(keys = {})
include ChargeableInstanceMethods
......@@ -29,55 +30,62 @@ module ActsAsChargeable
self.sync_attributes = keys
end
end
# Instance Methods
module ChargeableInstanceMethods
def charge_with(service, options)
if !instance_support?(service)
error_message = "#{self.class.to_s} doesn't support" \
" charges with #{service.to_s}"
return { error_message: error_message}
unless instance_support?(service)
error_message = "#{self.class} doesn't support" \
" charges with #{service}"
return { error_message: error_message }
end
self.send("charge_with_#{service.to_s}", options)
rescue Exception => exception
send("charge_with_#{service}", options)
rescue Exception => exception
{ error_message: exception.message }
end
def charge_with_conekta(options)
charge = conekta_charge(options)
object.update_columns(var_status: charge.status)
update_columns(var_status: charge.status, var_id: charge.id,
var_service: 'conekta')
update_conekta_barcode(charge) if options[:conekta_type] == 'oxxo'
charge
rescue Conekta::ParameterValidationError, Conekta::ProcessingError, Conekta::Error => e
self.update_columns(var_status: 'failed')
rescue Conekta::ParameterValidationError, Conekta::ProcessingError,
Conekta::Error => e
update_columns(var_status: 'failed')
{ error_message: e.message }
end
def conekta_charge(conekta_type)
def conekta_charge(options)
@charge ||= Conekta::Charge.create({
description: self.sync(:conekta, 'description'),
amount: self.sync(:conekta, 'amount'), currency: "MXN",
reference_id: self.sync(:conekta, 'reference_id'),
description: sync(:conekta, 'description'),
amount: sync(:conekta, 'amount'), currency: 'MXN',
reference_id: sync(:conekta, 'reference_id'),
details: {
name: self.sync(:conekta, 'name'),
email: self.sync(:conekta, 'email'),
name: sync(:conekta, 'name'), email: sync(:conekta, 'email'),
line_items: [{
name: self.sync(:conekta, 'name'),
description: self.sync(:conekta, 'description'),
unit_price: self.sync(:conekta, 'amount'), quantity: 1,
}]
}
description: sync(:conekta, 'description'), quantity: 1,
unit_price: sync(:conekta, 'amount'), name: sync(:conekta, 'name')
}] }
}.merge(conekta_type_of_charge(options)))
end
def conekta_type_of_charge(conekta_type)
def conekta_type_of_charge(options)
if options[:conekta_type] == 'card'
{ card: options[:card_token] }
elsif options[:conekta_type] == 'oxxo'
{ cash: { type: "oxxo",
expires_at: (Time.zone.today + 3.days).strftime('%Y-%m-%d')}
{ cash: { type: 'oxxo',
expires_at: (Time.zone.today + 3.days).strftime('%Y-%m-%d') }
}
end
end
def update_conekta_barcode(charge)
method = charge.payment_method
update_columns(var_barcode: method.barcode,
var_barcode_url: method.barcode_url,
var_payment_expires_at: Time.at(method.expires_at))
end
# def charge_with_paypal(options)
# if(!options.include? :card)
# error_message = "Paypal needs a card sent as a third paramater"
......@@ -110,14 +118,10 @@ module ActsAsChargeable
# description: self.sync(:paypal, 'description') }]})
# end
def find_charge(service)
if !instance_support?(service)
error_message = "#{self.class.to_s} doesn't support" \
" charges with #{service.to_s}"
return { error_message: error_message}
end
self.send("find_#{service.to_s}_charge")
rescue Exception => exception
def find_charge
return { error_message: 'Not charged yet' } unless var_service
send("find_#{var_service}_charge")
rescue Exception => exception
{ error_message: exception.message }
end
......@@ -127,18 +131,17 @@ module ActsAsChargeable
end
def find_conekta_charge
ref_id = self.sync(:conekta, 'reference_id')
Conekta::Charge.where({'status.ne'=>'paid', 'reference_id'=> ref_id})
Conekta::Charge.find(var_id)
end
def instance_support?(service)
return self.sync_attributes.include?(service)
sync_attributes.include?(service)
end
def sync(service, key)
service_attributes = self.send("#{service.to_s}_attributes")
return self.send(key) if !service_attributes.include? key.to_sym
self.send(service_attributes[key.to_sym])
service_attributes = send("#{service}_attributes")
return send(key) unless service_attributes.include? key.to_sym
send(service_attributes[key.to_sym])
end
# def sync_attribute(key)
......@@ -147,13 +150,15 @@ module ActsAsChargeable
# end
def conekta_attributes
self.sync_attributes[:conekta] || {}
sync_attributes[:conekta] || {}
end
def paypal_attributes
self.sync_attributes[:paypal] || {}
sync_attributes[:paypal] || {}
end
end
end
ActiveRecord::Base.send(:include, ActsAsChargeable) if defined? ActiveRecord::Base
\ No newline at end of file
if defined? ActiveRecord::Base
ActiveRecord::Base.send(:include, ActsAsChargeable)
end
......
# Var Version
module Var
VERSION = "0.2.5"
VERSION = '0.2.8'
end
......
......@@ -4,30 +4,30 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
require 'var/version'
Gem::Specification.new do |spec|
spec.name = "var"
spec.name = 'var'
spec.version = Var::VERSION
spec.authors = ["abrahamrq"]
spec.email = ["abraham.rq03@gmail.com"]
spec.authors = ['abrahamrq']
spec.email = ['abraham.rq03@gmail.com']
spec.summary = %q{summary of var}
spec.description = %q{description of var}
spec.homepage = "https://github.com/abrahamrq"
spec.summary = 'summary of var'
spec.description = 'description of var'
spec.homepage = 'https://github.com/abrahamrq'
# Prevent pushing this gem to RubyGems.org by setting 'allowed_push_host', or
# delete this section to allow pushing this gem to any host.
if spec.respond_to?(:metadata)
spec.metadata['allowed_push_host'] = "TODO: Set to 'http://mygemserver.com'"
else
raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
fail 'RubyGems 2.0+ is required to protect against public gem pushes.'
end
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
spec.bindir = "exe"
spec.bindir = 'exe'
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
spec.require_paths = ["lib"]
spec.require_paths = ['lib']
spec.add_dependency 'conekta', "~> 0.5"
spec.add_dependency 'conekta', '~> 0.5'
spec.add_dependency 'paypal-sdk-rest'
spec.add_development_dependency "bundler", "~> 1.10.a"
spec.add_development_dependency "rake", "~> 10.0"
spec.add_development_dependency 'bundler', '~> 1.10.a'
spec.add_development_dependency 'rake', '~> 10.0'
end
......