Skip to content

Instantly share code, notes, and snippets.

View soulcutter's full-sized avatar

Bradley Schaefer soulcutter

View GitHub Profile
@soulcutter
soulcutter / fluent.rb
Last active March 4, 2016 17:27
Fluent builder interface
module Fluent
def fluent_accessor(*attr_names)
attr_names.each do |attr_name|
define_method attr_name do |*val|
return instance_variable_get("@#{attr_name}") if val.empty?
raise ArgumentError, "Expected 0..1 arguments, got #{val.size}" if val.size > 1
value = val.first
value = yield(value) if block_given?
@soulcutter
soulcutter / xor.txt
Created February 8, 2016 23:35
What am I xorring?
ternary = foo ? !bar : bar
xor = !!(foo ^ bar)
neq = foo != bar
foo | bar | xor | ternary | neq
-------------------------------------
true | true | false | false | false
false | false | false | false | false
true | false | true | true | true
false | true | true | true | true
@soulcutter
soulcutter / sns_publisher.js
Created December 11, 2015 17:38
Publishing to an SNS topic in AWS lambda (as a promise)
var _ = require('lodash');
var Q = require('q');
var AWS = require('aws-sdk-q');
function SnsPublisher(topic, options) {
var topicOptions = {
params: {
TopicArn: topic
}
};
@soulcutter
soulcutter / each_day.rb
Last active September 4, 2015 16:32
Each day
def days(range)
Enumerator.new do |yielder|
now = range.begin
begin
yielder << now if now <= range.end
end while (now = now + 1.day) <= range.end
end
end
days((Time.now - 3.days)..(Time.now)).each { |day| puts day }
@soulcutter
soulcutter / tracked_let.rb
Created June 10, 2015 17:56
RSpec helper for automatically cleaning up database models
# transaction/truncation strategies won't work when you have a
# capybara feature and you must preserve what's already in the
# database
#
# Usage:
# include TrackedLet
#
# track(:foo) { User.create }
# track!(:foo) { User.create }
# specify { expect(track(User.create)).to be_persisted }
@soulcutter
soulcutter / mail_chimp.rb
Last active August 29, 2015 14:20
Toggling interest groups in list subscriptions in MailChimp's v2.0 API
require "active_support/core_ext"
require "delegate"
require "mailchimp"
require "singleton"
class MailingList::MailChimp
attr_reader :user, :member_info
def initialize(user, member_fetcher = member_info_api)
@user = user
@soulcutter
soulcutter / mailing_list.rb
Last active October 21, 2022 12:08
Dealing with crazy nested hashes in MailChimp API responses
require "delegate"
require "singleton"
module MailingList
class SafeResponse < SimpleDelegator
def self.safe_delegate(*methods)
methods.each do |method|
define_method(method, ->(*args, &block) {
value = __getobj__.send(method, *args, &block)
value ? SafeResponse.new(value) : BlackHole.instance
@soulcutter
soulcutter / timecop_helper.rb
Created April 30, 2015 22:44
Timecop Helper
RSpec.configure do |config|
config.around(:each, :timecop_freeze) do |example|
time = example.metadata[:timecop_freeze]
time = Time.current.change(usec: 0) if TrueClass === time
Timecop.freeze(time) do
example.call
end
end
end
@soulcutter
soulcutter / keybase.md
Created March 26, 2015 18:56
keybase.md

Keybase proof

I hereby claim:

  • I am soulcutter on github.
  • I am soulcutter (https://keybase.io/soulcutter) on keybase.
  • I have a public key whose fingerprint is C0D8 559D 4B50 7EF5 EE76 E036 BDEB 33DF 2145 14AC

To claim this, I am signing this object:

@soulcutter
soulcutter / gist:4c55548bd742ff26a9a0
Created March 18, 2015 21:36
Jenkins hash digest
class Digest::Jenkins
MAX_32_BIT = 4294967295
def self.digest(string)
hash = 0
string.each_byte do |byte|
hash += byte
hash &= MAX_32_BIT