Skip to content

Instantly share code, notes, and snippets.

View jgaskins's full-sized avatar

Jamie Gaskins jgaskins

View GitHub Profile
@jgaskins
jgaskins / gist:5861556
Created June 25, 2013 19:27
PORO controllers in a Rails-like framework
# A PORO controller can be just an object that takes the request, response,
# and streaming-socket objects into the constructor. It can do the typical
# ActionController things, like get the objects it needs and tell the response
# to render the view with those objects.
class WidgetsController
attr_accessor :request, :response, :stream
def initialize(request, response, stream_socket)
@request = request
@jgaskins
jgaskins / misspelling_initialize.rb
Created June 26, 2013 22:43
Fix initialize method-name typos once and for all.
class Class
# Important: keep 'initialize' at the end of this array
COMMON_INIT_MISSPELLINGS = %w(intitialize intialize initialise initialize) # etc...
def new(*args)
obj = allocate
obj.send COMMON_INIT_MISSPELLINGS.find { |m| obj.respond_to? m }, *args
obj
end
end
@jgaskins
jgaskins / rails3
Created July 26, 2013 16:46
Comparing runtime of `rake assets:precompile` on Rails 3.2.14 vs Rails 4.0.0 Both use Twitter Bootstrap CSS and JS, both have empty tmp directories.
➜ rails_three time RAILS_ENV=production rake assets:precompile
/Users/jamie/.rvm/rubies/ruby-2.0.0-p247/bin/ruby /Users/jamie/.rvm/gems/ruby-2.0.0-p247@global/bin/rake assets:precompile:all RAILS_ENV=production RAILS_GROUPS=assets
RAILS_ENV=production rake assets:precompile 20.75s user 1.82s system 93% cpu 24.089 total
@jgaskins
jgaskins / benchmark_attribute_set.rb
Created October 19, 2013 19:17
Benchmarking hash vs set in Perpetuity::AttributeSet
require_relative '../lib/perpetuity/attribute_set.rb'
require_relative '../lib/perpetuity/attribute.rb'
require 'benchmark/ips'
include Perpetuity
attributes = AttributeSet.new
names = %w(foo bar baz quux abc def ghi)
names.each do |name|
attributes << Attribute.new(name)
end
@jgaskins
jgaskins / immutable_queue.rb
Last active December 27, 2015 12:49
Immutable queue
class ImmutableQueue
attr_reader :first, :last, :count
def initialize
@count = 0
end
def << object
object = object.dup rescue object
node = Node.new(object)
duplicate do
@jgaskins
jgaskins / kevin_bacon.rb
Last active December 28, 2015 14:49
The enemy of my enemy of my enemy of my enemy of my enemy of my enemy is Kevin Bacon
class Person
attr_reader :name, :enemies
def initialize name
@name = name
@enemies = []
end
def add_enemies enemies
@enemies.concat enemies
@jgaskins
jgaskins / output.txt
Last active December 29, 2015 01:29
Benchmarking retrieving/sorting results from MongoDB
With 115k results:
Rehearsal ----------------------------------------------------------------------
sorting Mongo query in Mongo 0.990000 0.100000 1.090000 ( 2.193201)
sorting Mongo query in Ruby 0.980000 0.030000 1.010000 ( 1.171781)
sorting Postgres query in Postgres 0.100000 0.020000 0.120000 ( 2.143469)
sorting Postgres query in Ruby 0.340000 0.030000 0.370000 ( 0.485265)
------------------------------------------------------------- total: 2.590000sec
user system total real
@jgaskins
jgaskins / no_nil_set.rb
Created November 26, 2013 00:59
A Set class that rejects nil
require 'set'
class NoNilSet
include Enumerable
def initialize(values=[])
@set = Set.new
@set += Array(values).compact
end
@jgaskins
jgaskins / remove_one.rb
Created November 26, 2013 01:09
Remove one and only one occurrence of each specified value from an array
class Array
def remove_one values
values = values.dup
new_array = []
each do |value|
if values.include? value
values.delete value
else
new_array << value
end
@jgaskins
jgaskins / nested_parent.rb
Last active December 30, 2015 21:09
Ruby nested modules/classes figuring out their namespace (edited to work with Ruby < 2.0)
class Module
def namespace
path = name.split('::')[0...-1]
path.reduce(Object) { |namespace, const| namespace.const_get(const) }
end
end