Skip to content

Commit

Permalink
Initial commit
Browse files Browse the repository at this point in the history
  • Loading branch information
tute committed Jan 18, 2014
0 parents commit 878c3f3
Show file tree
Hide file tree
Showing 14 changed files with 1,102 additions and 0 deletions.
20 changes: 20 additions & 0 deletions 1-intention-revealing-method/app.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
require './setup'

class ProjectsController
def index
# When user is admitted at least a week ago we show it's active projects
if current_user && current_user.created_at < (Time.now - 7*24*3600)
@projects = current_user.active_projects

# If not admitted we show some featured projects, and set a marketing flash
# message when user is new
else
if current_user && current_user.created_at > (Time.now - 7*24*3600)
@flash_msg = 'Sign up for having your own projects, and see promo ones!'
end
@projects = Project.featured
end
end
end

require './tests' if __FILE__ == $0
15 changes: 15 additions & 0 deletions 1-intention-revealing-method/setup.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
class User < Struct.new(:created_at)
def active_projects
[:user_active_projects]
end
end

class Project
def self.featured
[:public_featured_projects]
end
end

class ProjectsController
attr_accessor :current_user, :flash_msg, :projects
end
24 changes: 24 additions & 0 deletions 1-intention-revealing-method/tests.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#!/usr/bin/env ruby -w
require 'minitest/autorun'

class TestProjectsController < Minitest::Test
def setup
@controller = ProjectsController.new
@admitted_user = User.new(Time.new(2013, 11, 10))
@new_user = User.new(Time.new)
end

def test_for_admitted_user
@controller.current_user = @admitted_user
@controller.index
assert_equal [:user_active_projects], @controller.projects
assert_nil @controller.flash_msg
end

def test_for_new_user
@controller.current_user = @new_user
@controller.index
assert_equal [:public_featured_projects], @controller.projects
assert_equal 'Sign up for having your own projects, and see promo ones!', @controller.flash_msg
end
end
27 changes: 27 additions & 0 deletions 2-special-case-objects/app.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
require './setup'

class User
def last_subscription
subscriptions.last
end

def cancel_subscription
last_subscription && last_subscription.cancel
end
end

class StatusReportJob
def self.perform
users = {}
User.all.map do |user|
users[user.name] = {
name: (user.last_subscription && user.last_subscription.name) || 'none',
status: (user.last_subscription && user.last_subscription.status) || '-',
trial_days: user.last_subscription && user.last_subscription.trial_days || '-'
}
end
users
end
end

require './tests' if __FILE__ == $0
30 changes: 30 additions & 0 deletions 2-special-case-objects/setup.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
class Subscription
def name
'Monthly Subscription'
end
def status
'active'
end
def trial_days
14
end
def cancel
# telling payment gateway...
true
end
end

class User
attr_accessor :name, :subscriptions

def initialize(name, subscriptions)
@name = name
@subscriptions = subscriptions
end

def self.all
suscripto = User.new('Bob', [Subscription.new])
no_suscripto = User.new('Patricio', [])
[suscripto, no_suscripto]
end
end
20 changes: 20 additions & 0 deletions 2-special-case-objects/tests.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
#!/usr/bin/env ruby -w
require 'minitest/autorun'

class TestApp < Minitest::Test
def test_status_report_job
response = {
"Bob" => { name: "Monthly Subscription", status: "active", trial_days: 14},
"Patricio" => { name: "none", status: "-", trial_days: "-"}
}
assert_equal response, StatusReportJob.perform
end

def test_subscription_cancel
user = User.all.first
assert user.cancel_subscription

user = User.all.last
assert !user.cancel_subscription
end
end
54 changes: 54 additions & 0 deletions 3-replace-method-with-method-object/app.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
#!/usr/bin/env ruby -w
require 'csv'

# 1. Crear una clase que se inicializa con los mismos argumentos que el método
# 2. Copiar y pegar el método en la nueva clase, quitando sus argumentos
# 3. Reemplazar el método original por una llamada a la clase nueva
# 4. Extraer cada pedazo de código que se puede identificar como un subpaso,
# y darle un nombre apropiado. Intention Revealing Method For The Win.
class Formatter
def row_per_day_format(file_name)
file = File.open file_name, 'r:ISO-8859-1'
# hash[NivelConsistencia][date] = [[value, status]]
hash = { '1' => {}, '2' => {} }
dates = []
str = ''
CSV.parse(file, col_sep: ';').each do |row|
next if row.empty?
next if row[0] =~ /^\/\//
date = Date.parse(row[2])
(13..43).each do |i|
measurement_date = date + (i-13)

# Si NumDiasDeChuva es vacío significa sin datos
value = row[7].nil? ? -99.9 : row[i]
status = row[i + 31]
hash_value = [value, status]

dates << measurement_date
hash[row[1]][measurement_date] = hash_value
end
end

dates.uniq.each do |date|
if !hash['1'][date].nil? && hash['2'][date].nil?
# Only 'bruto' (good)
value = hash['1'][date]
str << "#{date}\t#{value[0]}\t#{value[1]}\n"
elsif hash['1'][date].nil? && !hash['2'][date].nil?
# Only 'consistido' (kind of good)
value = hash['2'][date]
str << "#{date}\t#{value[0]}\t#{value[1]}\n"
else
# 'bruto' y 'consistido' (has new and old data)
old_value = hash['1'][date]
new_value = hash['2'][date]
str << "#{date}\t#{new_value[0]}\t#{old_value[1]}\t#{old_value[0]}\n"
end
end

str
end
end

require './tests' if __FILE__ == $0
33 changes: 33 additions & 0 deletions 3-replace-method-with-method-object/fixtures/input.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
//------------------------------------------------------------------------------
//
// NivelConsistencia: 1 = Bruto, 2 = Consistido
// TipoMedicaoChuvas: 1 = Pluvi�metro, 2 = Pluvi�grafo, 3 = Data logger
// Status: 0 = Branco, 1 = Real, 2 = Estimado, 3 = Duvidoso, 4 = Acumulado
//
//------------------------------------------------------------------------------

//EstacaoCodigo;NivelConsistencia;Data;TipoMedicaoChuvas;Maxima;Total;DiaMaxima;NumDiasDeChuva;MaximaStatus;TotalStatus;NumDiasDeChuvaStatus;TotalAnual;TotalAnualStatus;Chuva01;Chuva02;Chuva03;Chuva04;Chuva05;Chuva06;Chuva07;Chuva08;Chuva09;Chuva10;Chuva11;Chuva12;Chuva13;Chuva14;Chuva15;Chuva16;Chuva17;Chuva18;Chuva19;Chuva20;Chuva21;Chuva22;Chuva23;Chuva24;Chuva25;Chuva26;Chuva27;Chuva28;Chuva29;Chuva30;Chuva31;Chuva01Status;Chuva02Status;Chuva03Status;Chuva04Status;Chuva05Status;Chuva06Status;Chuva07Status;Chuva08Status;Chuva09Status;Chuva10Status;Chuva11Status;Chuva12Status;Chuva13Status;Chuva14Status;Chuva15Status;Chuva16Status;Chuva17Status;Chuva18Status;Chuva19Status;Chuva20Status;Chuva21Status;Chuva22Status;Chuva23Status;Chuva24Status;Chuva25Status;Chuva26Status;Chuva27Status;Chuva28Status;Chuva29Status;Chuva30Status;Chuva31Status;
02553005;1;01/01/2009;1;47,9;161,3;14;7;1;1;1;0;;0;0;12,4;0;0;0;0;0;0;0;0;0;41,1;47,9;33,9;0;0;2,4;14,4;0;0;0;0;0;0;0;0;0;9,2;0;0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
02553005;1;01/02/2009;1;83,4;243,5;7;10;1;1;1;0;;0;0;6,6;12,4;0;0;83,4;0;0;4,2;12,4;24,4;0;0;0;0;0;0;0;43,4;9,9;9,7;0;0;37,1;0;0;0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
02553005;1;01/03/2009;1;8,9;20,8;24;5;1;1;1;0;;2,4;0;4,2;0;0;0;0;0;2,1;0;0;0;0;0;0;0;0;0;0;0;0;3,2;0;8,9;0;0;0;0;0;0;0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
02553005;1;01/04/2009;1;33,4;113,4;22;5;1;1;1;0;;0;0;0;0;23,4;26,8;0;0;13,4;0;0;0;0;0;0;0;0;0;0;0;0;33,4;16,4;0;0;0;0;0;0;0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
02553005;1;01/05/2009;1;124;377,6;25;12;1;1;1;0;;0;0;32,2;0;0;0;0;13,4;23,6;0;0;0;4,2;45,6;33,6;0;0;0;0;0;0;0;0;0;124;13,7;0;4,4;18;40,4;24,5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
02553005;1;01/06/2009;1;46,5;119,8;24;8;1;1;1;0;;0;3,4;0;0;0;6,3;0;0;0;0;8,9;3,4;0;0;0;31,7;0;0;0;0;0;0;3,2;46,5;0;0;0;0;0;16,4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
02553005;1;01/07/2009;1;72,4;225;17;11;1;1;1;0;;0;17;0;0;6,3;1,1;0;0;12,4;19,9;36,6;0;0;0;0;15,3;72,4;0;0;0;11,4;29,2;0;0;0;0;0;0;3,4;0;0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
02553005;1;01/08/2009;1;48,8;184,5;2;7;1;1;1;0;;25,5;48,8;0;0;0;0;0;0;0;0;0;0;0;0;0;0;35,5;41,1;0;0;0;0;17,6;2,4;13,6;0;0;0;0;0;0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
02553005;1;01/09/2009;1;53,7;285,1;3;12;1;1;1;0;;0;0;53,7;39,5;0;0;0;15,4;19,3;17,8;4,4;13;0;0;0;0;3,4;0;46,3;0;0;0;48,5;0;0;0;0;11,4;12,4;0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
02553005;1;01/10/2009;1;87,5;436,9;25;13;1;1;1;;;1,5;7,4;17,4;13,4;0;0;16;0;0;0;0;86,9;0;0;78,6;4,2;51;0;12,2;10,4;0;0;50,4;0;87,5;0;0;0;0;0;0;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
02553005;1;01/11/2009;1;52,4;273,4;11;11;1;1;1;;;0;0;0;0;0;13,4;16,9;35,5;0;0;52,4;22,4;0;0;12,4;29,2;0;0;0;0;42,7;0;38,3;0;0,4;0;9,8;0;0;0;;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;
02553005;1;01/12/2009;1;63,5;241,2;12;7;1;1;1;;;21,1;0;41,2;0;0;0;0;24;0;0;0;63,5;0;0;0;0;0;9,3;0;0;0;0;33;0;49,1;0;0;0;0;0;0;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
02553005;1;01/01/2010;1;45,4;174,5;13;9;1;1;1;;;0;0;10;0;0;0;6,7;0;0;0;7,8;0;45,4;0;0;0;18,2;13,8;0;38;10;0;0;0;0;0;0;24,6;0;0;0;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
02553005;1;01/02/2010;1;45,6;122,5;16;6;1;1;1;;;0;0;0;0;0;0;0;0;24,2;0;0;0;0;0;11;45,6;23,4;0;0;0;0;0;0;0;16,9;0;0;1,4;;;;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;;;
02553005;1;01/03/2010;1;76,7;218,1;15;9;1;1;1;;;0;0;0;0;0;0;0;0;0;0;0;0;0;30,3;76,7;0;0;0;0;11,6;10,3;1;55,2;26,6;0;0;3,2;3,2;0;0;0;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
02553005;1;01/04/2010;1;60,9;243,6;22;8;1;1;1;;;0;0;0;11,3;0;0;4,8;0;0;0;0;0;0;0;0;0;0;0;0;0;0;60,9;40,5;0;29;60,1;31,6;0;5,4;0;;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;
02553005;1;01/05/2010;1;58,8;181,1;8;9;1;1;1;;;0;0;0;3,4;0;0;0;58,8;0;0;0;7,8;0;0;0;0;23,2;46,5;10;10,4;0;0;0;0;6,4;0;0;0;0;0;14,6;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
02553005;1;01/06/2010;1;16,2;43,9;4;5;1;1;1;;;0;0;0;16,2;8,2;0;0;0;0;0;0;0;0;0;0;0;0;0;0;5,2;0;7,4;6,9;0;0;0;0;0;0;0;;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;
02553005;1;01/07/2010;1;44,3;124,1;22;8;1;1;1;;;0;0;0;0;0;0;0;0;0;13;0;0;22,2;0;0;0;16;7;7,9;6,3;0;44,3;7,4;0;0;0;0;0;0;0;0;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
02553005;1;01/08/2010;1;15,3;39,4;1;4;1;1;1;;;15,3;0;0;5,7;0;0;0;0;0;0;0;0;7,1;0;0;0;0;0;0;11,3;0;0;0;0;0;0;0;0;0;0;0;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
02553005;1;01/09/2010;1;28,6;71,4;24;5;1;1;1;;;0;0;0;0;0;0;0;0;0;0;0;0;0;16,2;0;0;0;0;0;0;0;0;11,4;28,6;3,4;0;11,8;0;0;0;;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;
02553005;1;01/10/2010;1;68,7;259,9;30;10;1;1;1;;;0;16,6;0;14,4;16,5;0;67,9;0;0;0;0;0;0;0;12;41,2;0;0;0;0;0;4,7;0;13,6;0;0;0;0;0;68,7;4,3;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
02553005;1;01/11/2010;1;44,8;76;10;4;1;1;1;;;0;0;0;0;0;13,4;0;0;0;44,8;0;0;0;0;0;0;0;0;0;0;0;13,4;0;0;0;0;0;0;0;4,4;;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;
02553005;1;01/12/2010;1;74,9;443,1;3;15;1;1;1;;;0;0;74,9;38,8;48,5;66,3;0;29,7;0;0;18,4;36,6;27,4;0;0;0;0;0;3,4;0;18,5;23,5;13,7;0;12,8;0;0;0;7,4;0;23,2;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;
Loading

0 comments on commit 878c3f3

Please sign in to comment.