########################################
# Ruby snippets - for Rails, see below #
########################################

# encoding for Ruby 1.9
snippet enc
	# encoding: utf-8

# #!/usr/bin/env ruby
snippet #!
	#!/usr/bin/env ruby
	# encoding: utf-8

# New Block
snippet =b
	=begin rdoc
		${1}
	=end
snippet y
	:yields: ${1:arguments}
snippet rb
	#!/usr/bin/env ruby -wKU
snippet beg
	begin
		${3}
	rescue ${1:Exception} => ${2:e}
	end

snippet req require
	require "${1}"${2}
snippet #
	# =>
snippet end
	__END__
snippet case
	case ${1:object}
	when ${2:condition}
		${3}
	end
snippet when
	when ${1:condition}
		${2}
snippet def
	def ${1:method_name}
		${2}
	end
snippet deft
	def test_${1:case_name}
		${2}
	end
snippet if
	if ${1:condition}
		${2}
	end
snippet ife
	if ${1:condition}
		${2}
	else
		${3}
	end
snippet elsif
	elsif ${1:condition}
		${2}
snippet unless
	unless ${1:condition}
		${2}
	end
snippet while
	while ${1:condition}
		${2}
	end
snippet for
	for ${1:e} in ${2:c}
		${3}
	end
snippet until
	until ${1:condition}
		${2}
	end
snippet cla class .. end
	class ${1:`substitute(Filename(), '\(_\|^\)\(.\)', '\u\2', 'g')`}
		${2}
	end
snippet cla class .. initialize .. end
	class ${1:`substitute(Filename(), '\(_\|^\)\(.\)', '\u\2', 'g')`}
		def initialize(${2:args})
			${3}
		end
	end
snippet cla class .. < ParentClass .. initialize .. end
	class ${1:`substitute(Filename(), '\(_\|^\)\(.\)', '\u\2', 'g')`} < ${2:ParentClass}
		def initialize(${3:args})
			${4}
		end
	end
snippet cla ClassName = Struct .. do .. end
	${1:`substitute(Filename(), '\(_\|^\)\(.\)', '\u\2', 'g')`} = Struct.new(:${2:attr_names}) do
		def ${3:method_name}
			${4}
		end
	end
snippet cla class BlankSlate .. initialize .. end
	class ${1:BlankSlate}
		instance_methods.each { |meth| undef_method(meth) unless meth =~ /\A__/ }
	end
snippet cla class << self .. end
	class << ${1:self}
		${2}
	end
# class .. < DelegateClass .. initialize .. end
snippet cla-
	class ${1:`substitute(Filename(), '\(_\|^\)\(.\)', '\u\2', 'g')`} < DelegateClass(${2:ParentClass})
		def initialize(${3:args})
			super(${4:del_obj})

			${5}
		end
	end
snippet mod module .. end
	module ${1:`substitute(Filename(), '\(_\|^\)\(.\)', '\u\2', 'g')`}
		${2}
	end
snippet mod module .. module_function .. end
	module ${1:`substitute(Filename(), '\(_\|^\)\(.\)', '\u\2', 'g')`}
		module_function

		${2}
	end
snippet mod module .. ClassMethods .. end
	module ${1:`substitute(Filename(), '\(_\|^\)\(.\)', '\u\2', 'g')`}
		module ClassMethods
			${2}
		end

		module InstanceMethods

		end

		def self.included(receiver)
			receiver.extend         ClassMethods
			receiver.send :include, InstanceMethods
		end
	end
# attr_reader
snippet r
	attr_reader :${1:attr_names}
# attr_writer
snippet w
	attr_writer :${1:attr_names}
# attr_accessor
snippet rw
	attr_accessor :${1:attr_names}
snippet atp
	attr_protected :${1:attr_names}
snippet ata
	attr_accessible :${1:attr_names}
# include Enumerable
snippet Enum
	include Enumerable

	def each(&block)
		${1}
	end
# include Comparable
snippet Comp
	include Comparable

	def <=>(other)
		${1}
	end
# extend Forwardable
snippet Forw-
	extend Forwardable
# def self
snippet defs
	def self.${1:class_method_name}
		${2}
	end
# def method_missing
snippet defmm
	def method_missing(meth, *args, &blk)
		${1}
	end
snippet defd
	def_delegator :${1:@del_obj}, :${2:del_meth}, :${3:new_name}
snippet defds
	def_delegators :${1:@del_obj}, :${2:del_methods}
snippet am
	alias_method :${1:new_name}, :${2:old_name}
snippet app
	if __FILE__ == $PROGRAM_NAME
		${1}
	end
# usage_if()
snippet usai
	if ARGV.${1}
		abort "Usage: #{$PROGRAM_NAME} ${2:ARGS_GO_HERE}"${3}
	end
# usage_unless()
snippet usau
	unless ARGV.${1}
		abort "Usage: #{$PROGRAM_NAME} ${2:ARGS_GO_HERE}"${3}
	end
snippet array
	Array.new(${1:10}) { |${2:i}| ${3} }
snippet hash
	Hash.new { |${1:hash}, ${2:key}| $1[$2] = ${3} }
snippet file File.foreach() { |line| .. }
	File.foreach(${1:"path/to/file"}) { |${2:line}| ${3} }
snippet file File.read()
	File.read(${1:"path/to/file"})${2}
snippet Dir Dir.global() { |file| .. }
	Dir.glob(${1:"dir/glob/*"}) { |${2:file}| ${3} }
snippet Dir Dir[".."]
	Dir[${1:"glob/**/*.rb"}]${2}
snippet dir
	Filename.dirname(__FILE__)
snippet deli
	delete_if { |${1:e}| ${2} }
snippet fil
	fill(${1:range}) { |${2:i}| ${3} }
# flatten_once()
snippet flao
	inject(Array.new) { |${1:arr}, ${2:a}| $1.push(*$2)}${3}
snippet zip
	zip(${1:enums}) { |${2:row}| ${3} }
# downto(0) { |n| .. }
snippet dow
	downto(${1:0}) { |${2:n}| ${3} }
snippet ste
	step(${1:2}) { |${2:n}| ${3} }
snippet tim
	times { |${1:n}| ${2} }
snippet upt
	upto(${1:1.0/0.0}) { |${2:n}| ${3} }
snippet loo
	loop { ${1} }
snippet ea
	each { |${1:e}| ${2} }
snippet ead
	each do |${1:e}|
		${2}
	end
snippet eab
	each_byte { |${1:byte}| ${2} }
snippet eac- each_char { |chr| .. }
	each_char { |${1:chr}| ${2} }
snippet eac- each_cons(..) { |group| .. }
	each_cons(${1:2}) { |${2:group}| ${3} }
snippet eai
	each_index { |${1:i}| ${2} }
snippet eaid
	each_index do |${1:i}|
		${2}
	end
snippet eak
	each_key { |${1:key}| ${2} }
snippet eakd
	each_key do |${1:key}|
		${2}
	end
snippet eal
	each_line { |${1:line}| ${2} }
snippet eald
	each_line do |${1:line}|
		${2}
	end
snippet eap
	each_pair { |${1:name}, ${2:val}| ${3} }
snippet eapd
	each_pair do |${1:name}, ${2:val}|
		${3}
	end
snippet eas-
	each_slice(${1:2}) { |${2:group}| ${3} }
snippet easd-
	each_slice(${1:2}) do |${2:group}|
		${3}
	end
snippet eav
	each_value { |${1:val}| ${2} }
snippet eavd
	each_value do |${1:val}|
		${2}
	end
snippet eawi
	each_with_index { |${1:e}, ${2:i}| ${3} }
snippet eawid
	each_with_index do |${1:e},${2:i}|
		${3}
	end
snippet reve
	reverse_each { |${1:e}| ${2} }
snippet reved
	reverse_each do |${1:e}|
		${2}
	end
snippet inj
	inject(${1:init}) { |${2:mem}, ${3:var}| ${4} }
snippet injd
	inject(${1:init}) do |${2:mem}, ${3:var}|
		${4}
	end
snippet map
	map { |${1:e}| ${2} }
snippet mapd
	map do |${1:e}|
		${2}
	end
snippet mapwi-
	enum_with_index.map { |${1:e}, ${2:i}| ${3} }
snippet sor
	sort { |a, b| ${1} }
snippet sorb
	sort_by { |${1:e}| ${2} }
snippet ran
	sort_by { rand }
snippet all
	all? { |${1:e}| ${2} }
snippet any
	any? { |${1:e}| ${2} }
snippet cl
	classify { |${1:e}| ${2} }
snippet col
	collect { |${1:e}| ${2} }
snippet cold
	collect do |${1:e}|
		${2}
	end
snippet det
	detect { |${1:e}| ${2} }
snippet detd
	detect do |${1:e}|
		${2}
	end
snippet fet
	fetch(${1:name}) { |${2:key}| ${3} }
snippet fin
	find { |${1:e}| ${2} }
snippet find
	find do |${1:e}|
		${2}
	end
snippet fina
	find_all { |${1:e}| ${2} }
snippet finad
	find_all do |${1:e}|
		${2}
	end
snippet gre
	grep(${1:/pattern/}) { |${2:match}| ${3} }
snippet sub
	${1:g}sub(${2:/pattern/}) { |${3:match}| ${4} }
snippet sca
	scan(${1:/pattern/}) { |${2:match}| ${3} }
snippet scad
	scan(${1:/pattern/}) do |${2:match}|
		${3}
	end
snippet max
	max { |a, b| ${1} }
snippet min
	min { |a, b| ${1} }
snippet par
	partition { |${1:e}| ${2} }
snippet pard
	partition do |${1:e}|
		${2}
	end
snippet rej
	reject { |${1:e}| ${2} }
snippet rejd
	reject do |${1:e}|
		${2}
	end
snippet sel
	select { |${1:e}| ${2} }
snippet seld
	select do |${1:e}|
		${2}
	end
snippet lam
	lambda { |${1:args}| ${2} }
snippet doo
	do
		${1}
	end
snippet dov
	do |${1:variable}|
		${2}
	end
snippet :
	:${1:key} => ${2:"value"}${3}
snippet ope
	open(${1:"path/or/url/or/pipe"}, "${2:w}") { |${3:io}| ${4} }
# path_from_here()
snippet fpath
	File.join(File.dirname(__FILE__), *%2[${1:rel path here}])${2}
# unix_filter {}
snippet unif
	ARGF.each_line${1} do |${2:line}|
		${3}
	end
# option_parse {}
snippet optp
	require "optparse"

	options = {${1:default => "args"}}

	ARGV.options do |opts|
		opts.banner = "Usage: #{File.basename($PROGRAM_NAME)}
snippet opt
	opts.on( "-${1:o}", "--${2:long-option-name}", ${3:String},
	         "${4:Option description.}") do |${5:opt}|
		${6}
	end
snippet tc
	require "test/unit"

	require "${1:library_file_name}"

	class Test${2:$1} < Test::Unit::TestCase
		def test_${3:case_name}
			${4}
		end
	end
snippet ts
	require "test/unit"

	require "tc_${1:test_case_file}"
	require "tc_${2:test_case_file}"${3}
snippet as
	assert ${1:test}, "${2:Failure message.}"${3}
snippet ase
	assert_equal ${1:expected}, ${2:actual}${3}
snippet asne
	assert_not_equal ${1:unexpected}, ${2:actual}${3}
snippet asid
	assert_in_delta ${1:expected_float}, ${2:actual_float}, ${3:2 ** -20}${4}
snippet asio
	assert_instance_of ${1:ExpectedClass}, ${2:actual_instance}${3}
snippet asko
	assert_kind_of ${1:ExpectedKind}, ${2:actual_instance}${3}
snippet asn
	assert_nil ${1:instance}${2}
snippet asnn
	assert_not_nil ${1:instance}${2}
snippet asm
	assert_match /${1:expected_pattern}/, ${2:actual_string}${3}
snippet asnm
	assert_no_match /${1:unexpected_pattern}/, ${2:actual_string}${3}
snippet aso
	assert_operator ${1:left}, :${2:operator}, ${3:right}${4}
snippet asr
	assert_raise ${1:Exception} { ${2} }
snippet asrd
	assert_raise ${1:Exception} do
		${2}
	end
snippet asnr
	assert_nothing_raised ${1:Exception} { ${2} }
snippet asnrd
	assert_nothing_raised ${1:Exception} do
		${2}
	end
snippet asrt
	assert_respond_to ${1:object}, :${2:method}${3}
snippet ass assert_same(..)
	assert_same ${1:expected}, ${2:actual}${3}
snippet ass assert_send(..)
	assert_send [${1:object}, :${2:message}, ${3:args}]${4}
snippet asns
	assert_not_same ${1:unexpected}, ${2:actual}${3}
snippet ast
	assert_throws :${1:expected} { ${2} }
snippet astd
	assert_throws :${1:expected} do
		${2}
	end
snippet asnt
	assert_nothing_thrown { ${1} }
snippet asntd
	assert_nothing_thrown do
		${1}
	end
snippet fl
	flunk "${1:Failure message.}"${2}
# Benchmark.bmbm do .. end
snippet bm-
	TESTS = ${1:10_000}
	Benchmark.bmbm do |results|
		${2}
	end
snippet rep
	results.report("${1:name}:") { TESTS.times { ${2} }}
# Marshal.dump(.., file)
snippet Md
	File.open(${1:"path/to/file.dump"}, "wb") { |${2:file}| Marshal.dump(${3:obj}, $2) }${4}
# Mashal.load(obj)
snippet Ml
	File.open(${1:"path/to/file.dump"}, "rb") { |${2:file}| Marshal.load($2) }${3}
# deep_copy(..)
snippet deec
	Marshal.load(Marshal.dump(${1:obj_to_copy}))${2}
snippet Pn-
	PStore.new(${1:"file_name.pstore"})${2}
snippet tra
	transaction(${1:true}) { ${2} }
# xmlread(..)
snippet xml-
	REXML::Document.new(File.read(${1:"path/to/file"}))${2}
# xpath(..) { .. }
snippet xpa
	elements.each(${1:"//Xpath"}) do |${2:node}|
		${3}
	end
# class_from_name()
snippet clafn
	split("::").inject(Object) { |par, const| par.const_get(const) }
# singleton_class()
snippet sinc
	class << self; self end
snippet nam
	namespace :${1:`Filename()`} do
		${2}
	end
snippet tas
	desc "${1:Task description}"
	task :${2:task_name => [:dependent, :tasks]} do
		${3}
	end
# block
snippet b
	{ |${1:var}| ${2} }
snippet begin
	begin
		raise 'A test exception.'
	rescue Exception => e
		puts e.message
		puts e.backtrace.inspect
	else
		# other exception
	ensure
		# always executed
	end

#debugging
snippet debug
	require 'ruby-debug'; debugger; true;
snippet pry
	require 'pry'; binding.pry

#############################################
# Rails snippets - for pure Ruby, see above #
#############################################
snippet art
	assert_redirected_to ${1::action => "${2:index}"}
snippet artnp
	assert_redirected_to ${1:parent}_${2:child}_path(${3:@$1}, ${4:@$2})
snippet artnpp
	assert_redirected_to ${1:parent}_${2:child}_path(${3:@$1})
snippet artp
	assert_redirected_to ${1:model}_path(${2:@$1})
snippet artpp
	assert_redirected_to ${1:model}s_path
snippet asd
	assert_difference "${1:Model}.${2:count}", $1 do
		${3}
	end
snippet asnd
	assert_no_difference "${1:Model}.${2:count}" do
		${3}
	end
snippet asre
	assert_response :${1:success}, @response.body${2}
snippet asrj
	assert_rjs :${1:replace}, "${2:dom id}"
snippet ass assert_select(..)
	assert_select '${1:path}', :${2:text} => '${3:inner_html' ${4:do}
snippet bf
	before_filter :${1:method}
snippet bt
	belongs_to :${1:association}
snippet crw
	cattr_accessor :${1:attr_names}
snippet defcreate
	def create
		@${1:model_class_name} = ${2:ModelClassName}.new(params[:$1])

		respond_to do |wants|
			if @$1.save
				flash[:notice] = '$2 was successfully created.'
				wants.html { redirect_to(@$1) }
				wants.xml  { render :xml => @$1, :status => :created, :location => @$1 }
			else
				wants.html { render :action => "new" }
				wants.xml  { render :xml => @$1.errors, :status => :unprocessable_entity }
			end
		end
	end${3}
snippet defdestroy
	def destroy
		@${1:model_class_name} = ${2:ModelClassName}.find(params[:id])
		@$1.destroy

		respond_to do |wants|
			wants.html { redirect_to($1s_url) }
			wants.xml  { head :ok }
		end
	end${3}
snippet defedit
	def edit
		@${1:model_class_name} = ${2:ModelClassName}.find(params[:id])
	end
snippet defindex
	def index
		@${1:model_class_name} = ${2:ModelClassName}.all

		respond_to do |wants|
			wants.html # index.html.erb
			wants.xml  { render :xml => @$1s }
		end
	end${3}
snippet defnew
	def new
		@${1:model_class_name} = ${2:ModelClassName}.new

		respond_to do |wants|
			wants.html # new.html.erb
			wants.xml  { render :xml => @$1 }
		end
	end${3}
snippet defshow
	def show
		@${1:model_class_name} = ${2:ModelClassName}.find(params[:id])

		respond_to do |wants|
			wants.html # show.html.erb
			wants.xml  { render :xml => @$1 }
		end
	end${3}
snippet defupdate
	def update
		@${1:model_class_name} = ${2:ModelClassName}.find(params[:id])

		respond_to do |wants|
			if @$1.update_attributes(params[:$1])
				flash[:notice] = '$2 was successfully updated.'
				wants.html { redirect_to(@$1) }
				wants.xml  { head :ok }
			else
				wants.html { render :action => "edit" }
				wants.xml  { render :xml => @$1.errors, :status => :unprocessable_entity }
			end
		end
	end${3}
snippet flash
	flash[:${1:notice}] = "${2}"
snippet habtm
	has_and_belongs_to_many :${1:object}, :join_table => "${2:table_name}", :foreign_key => "${3}_id"${4}
snippet hm
	has_many :${1:object}
snippet hmd
	has_many :${1:other}s, :class_name => "${2:$1}", :foreign_key => "${3:$1}_id", :dependent => :destroy${4}
snippet hmt
	has_many :${1:object}, :through => :${2:object}
snippet ho
	has_one :${1:object}
snippet i18
	I18n.t('${1:type.key}')${2}
snippet ist
	<%= image_submit_tag("${1:agree.png}", :id => "${2:id}"${3} %>
snippet log
	Rails.logger.${1:debug} ${2}
snippet log2
	RAILS_DEFAULT_LOGGER.${1:debug} ${2}
snippet logd
	logger.debug { "${1:message}" }${2}
snippet loge
	logger.error { "${1:message}" }${2}
snippet logf
	logger.fatal { "${1:message}" }${2}
snippet logi
	logger.info { "${1:message}" }${2}
snippet logw
	logger.warn { "${1:message}" }${2}
snippet mapc
	${1:map}.${2:connect} '${3:controller/:action/:id}'
snippet mapca
	${1:map}.catch_all "*${2:anything}", :controller => "${3:default}", :action => "${4:error}"${5}
snippet mapr
	${1:map}.resource :${2:resource}
snippet maprs
	${1:map}.resources :${2:resource}
snippet mapwo
	${1:map}.with_options :${2:controller} => '${3:thing}' do |$3|
		${4}
	end
snippet mbs
	before_save :${1:method}
snippet mcht
	change_table :${1:table_name} do |t|
		${2}
	end
snippet mp
	map(&:${1:id})
snippet mrw
	mattr_accessor :${1:attr_names}
snippet oa
	order("${1:field}")
snippet od
	order("${1:field} DESC")
snippet pa
	params[:${1:id}]${2}
snippet ra
	render :action => "${1:action}"
snippet ral
	render :action => "${1:action}", :layout => "${2:layoutname}"
snippet rest
	respond_to do |wants|
		wants.${1:html} { ${2} }
	end
snippet rf
	render :file => "${1:filepath}"
snippet rfu
	render :file => "${1:filepath}", :use_full_path => ${2:false}
snippet ri
	render :inline => "${1:<%= 'hello' %>}"
snippet ril
	render :inline => "${1:<%= 'hello' %>}", :locals => { ${2::name} => "${3:value}"${4} }
snippet rit
	render :inline => "${1:<%= 'hello' %>}", :type => ${2::rxml}
snippet rjson
	render :json => ${1:text to render}
snippet rl
	render :layout => "${1:layoutname}"
snippet rn
	render :nothing => ${1:true}
snippet rns
	render :nothing => ${1:true}, :status => ${2:401}
snippet rp
	render :partial => "${1:item}"
snippet rpc
	render :partial => "${1:item}", :collection => ${2:@$1s}
snippet rpl
	render :partial => "${1:item}", :locals => { :${2:$1} => ${3:@$1}
snippet rpo
	render :partial => "${1:item}", :object => ${2:@$1}
snippet rps
	render :partial => "${1:item}", :status => ${2:500}
snippet rt
	render :text => "${1:text to render}"
snippet rtl
	render :text => "${1:text to render}", :layout => "${2:layoutname}"
snippet rtlt
	render :text => "${1:text to render}", :layout => ${2:true}
snippet rts
	render :text => "${1:text to render}", :status => ${2:401}
snippet ru
	render :update do |${1:page}|
		$1.${2}
	end
snippet rxml
	render :xml => ${1:text to render}
snippet sc
	scope :${1:name}, :where(:@${2:field} => ${3:value})
snippet sl
	scope :${1:name}, lambda do |${2:value}|
		where("${3:field = ?}", ${4:bind var})
	end
snippet sha1
	Digest::SHA1.hexdigest(${1:string})
snippet sweeper
	class ${1:ModelClassName}Sweeper < ActionController::Caching::Sweeper
		observe $1

		def after_save(${2:model_class_name})
			expire_cache($2)
		end

		def after_destroy($2)
			expire_cache($2)
		end

		def expire_cache($2)
			expire_page
		end
	end
snippet tcb
	t.boolean :${1:title}
	${2}
snippet tcbi
	t.binary :${1:title}, :limit => ${2:2}.megabytes
	${3}
snippet tcd
	t.decimal :${1:title}, :precision => ${2:10}, :scale => ${3:2}
	${4}
snippet tcda
	t.date :${1:title}
	${2}
snippet tcdt
	t.datetime :${1:title}
	${2}
snippet tcf
	t.float :${1:title}
	${2}
snippet tch
	t.change :${1:name}, :${2:string}, :${3:limit} => ${4:80}
	${5}
snippet tci
	t.integer :${1:title}
	${2}
snippet tcl
	t.integer :lock_version, :null => false, :default => 0
	${1}
snippet tcr
	t.references :${1:taggable}, :polymorphic => { :default => '${2:Photo}' }
	${3}
snippet tcs
	t.string :${1:title}
	${2}
snippet tct
	t.text :${1:title}
	${2}
snippet tcti
	t.time :${1:title}
	${2}
snippet tcts
	t.timestamp :${1:title}
	${2}
snippet tctss
	t.timestamps
	${1}
snippet va
	validates_associated :${1:attribute}
snippet vao
	validates_acceptance_of :${1:terms}
snippet vc
	validates_confirmation_of :${1:attribute}
snippet ve
	validates_exclusion_of :${1:attribute}, :in => ${2:%w( mov avi )}
snippet vf
	validates_format_of :${1:attribute}, :with => /${2:regex}/
snippet vi
	validates_inclusion_of :${1:attribute}, :in => %w(${2: mov avi })
snippet vl
	validates_length_of :${1:attribute}, :within => ${2:3}..${3:20}
snippet vn
	validates_numericality_of :${1:attribute}
snippet vpo
	validates_presence_of :${1:attribute}
snippet vu
	validates_uniqueness_of :${1:attribute}
snippet wants
	wants.${1:js|xml|html} { ${2} }
snippet wc
	where(${1:"conditions"}${2:, bind_var})
snippet wh
	where(${1:field} => ${2:value})
snippet xdelete
	xhr :delete, :${1:destroy}, :id => ${2:1}${3}
snippet xget
	xhr :get, :${1:show}, :id => ${2:1}${3}
snippet xpost
	xhr :post, :${1:create}, :${2:object} => { ${3} }
snippet xput
	xhr :put, :${1:update}, :id => ${2:1}, :${3:object} => { ${4} }${5}
snippet test
	test "should ${1:do something}" do
		${2}
	end
#migrations
snippet mac
	add_column :${1:table_name}, :${2:column_name}, :${3:data_type}
snippet mrc
	remove_column :${1:table_name}, :${2:column_name}
snippet mrnc
	rename_column :${1:table_name}, :${2:old_column_name}, :${3:new_column_name}
snippet mcc
	change_column :${1:table}, :${2:column}, :${3:type}
snippet mccc
	t.column :${1:title}, :${2:string}
snippet mct
	create_table :${1:table_name} do |t|
		t.column :${2:name}, :${3:type}
	end
snippet migration
	class ${1:class_name} < ActiveRecord::Migration
		def self.up
			${2}
		end

		def self.down
		end
	end

snippet trc
	t.remove :${1:column}
snippet tre
	t.rename :${1:old_column_name}, :${2:new_column_name}
	${3}
snippet tref
	t.references :${1:model}

#rspec
snippet it
	it "${1:spec_name}" do
		${2}
	end
snippet itp
	it "${1:spec_name}"
	${2}
snippet desc
	describe ${1:class_name} do
		${2}
	end
snippet cont
	context "${1:message}" do
		${2}
	end
snippet bef
	before :${1:each} do
		${2}
	end
snippet aft
	after :${1:each} do
		${2}
	end
