Skip to content

Instantly share code, notes, and snippets.

View soulcutter's full-sized avatar

Bradley Schaefer soulcutter

View GitHub Profile
@soulcutter
soulcutter / bounded_hash.rb
Created October 3, 2016 21:47
A bounded hash that expires keys using LRU (roughly)
# frozen_string_literal: true
require "delegate"
require "set"
# Hash that can only hold a certain number of keys, keys expire on a LRU basis
class BoundedHash < DelegateClass(Hash)
NO_OP = proc {}
@soulcutter
soulcutter / be_uniq.rb
Created September 6, 2016 18:24
RSpec basic flat array uniqueness matcher
RSpec::Matchers.define :be_uniq do
match do |actual|
values_match? actual.uniq, actual
end
failure_message do |actual|
diff = actual.dup
actual.uniq.each { |value| diff.delete_at diff.index(value) }
diff = diff.uniq
"expected that #{actual.inspect} to be uniq, but found the following repeated elements: #{diff.inspect}"
@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