Instantly share code, notes, and snippets.

View 1_Gemfile
# frozen_string_literal: true
source "https://rubygems.org"
git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
gem 'twilio-ruby'
gem 'dotenv'
gem 'waterfall'
View example.md
range1 = ::Scheduling::DateRange.new(1.day.ago..Time.now)
range2 = ::Scheduling::DateRange.new(2.days.ago..Time.now)

range1.exclusion(range2) => []
range2.exclusion(range1) => [::Scheduling::DateRange.new(2.days.ago..1.day.ago)]
View params_slicer.rb
class ParamsSlicer
def initialize(params, *whitelist)
@params = params
@nested_whitelist = whitelist.extract_options!
@whitelist = whitelist
end
def call
params.slice(*whitelist).tap do |result|
nested_whitelist.each do |k, v|
View custom_flatten.rb
# test utility for the script
def assert(actual, expected)
if actual == expected
puts "ok #{expected}"
else
puts "ko, you expected: #{expected} but got #{actual}"
end
end
# first implementation, more functional programming friendly, pure method
View credit_user.rb
class CreditUser
include Waterfall
def initialize(user:, cents:)
@user, @cents = user, cents
end
def call
# credit logic goes here and dams on error
end
View create_user_from_invitation.rb
class CreateUserFromInvitation
include Waterfall
def initialize(invitation)
@invitation = invitation
end
def call
chain { build_user }
when_falsy { user.save }
View accept_invitation.rb
class AcceptInvitation
include Waterfall
include ActiveModel::Validations
CENTS_PAID_FOR_AFFILIATION = 100
validate :ensure_invitation_not_accepted
def initialize(invitation)
@invitation = invitation
View updated_models.rb
# User model
class User < ActiveRecord::Base
has_many :invitations
end
# Invitation Model
class Invitation < ActiveRecord::Base
belongs_to :inviter, class_name: 'User'
def accept
self.accepted = true
end
View accept_invitation.rb
def accept_invitation
Wf.new
.chain(user: :user) { AcceptInvitation.new(invitation).call }
.chain {|outflow| render json: { user: outflow.user } }
.on_dam do |error_pool|
render json: { errors: error_pool.full_messages }, status: 422
end
end
View problem_illustration.rb
# controller
def accept_invitation
if invitation.accepted?
render json: { errors: ['Invitation already accepted'] }, status: 422
else
user = User.build_from_invitation(invitation)
user.save!
invitation.accept
invitation.save!
UserMailer.notify_affiliate_payment(invitation).deliver_later