Skip to content

Commit

Permalink
primer commit
Browse files Browse the repository at this point in the history
  • Loading branch information
sampayo committed Sep 13, 2013
0 parents commit 35b630d
Show file tree
Hide file tree
Showing 6 changed files with 297 additions and 0 deletions.
Empty file added README.md
Empty file.
3 changes: 3 additions & 0 deletions estudiantes.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Ricardo Sampayo 123456 1988/05/09
Pedro perez 987654 1960/12/03
salir as das
22 changes: 22 additions & 0 deletions init.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
#### CodeHero.co ####
#
# Desarrollado por: Ricardo Sampayo
# Empecemos de una vez
#
#### CodeHero.co ####


## Declaramos la ruta del proyecto
APP_ROOT = File.dirname(__FILE__)

# agregamos la ruta del directorio lob a nuestro proyecto para despreocuparnos
# al agregarla en todo momento
# File.join(APP_ROOT, 'lib') => APP_ROOT/lib
$:.unshift( File.join(APP_ROOT, 'lib') )

# le décimos a Ruby q vamos a utilizar el controlador
require 'controlador'


controlador = Controlador.new('estudiantes.txt')
controlador.launch!
165 changes: 165 additions & 0 deletions lib/controlador.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,165 @@
require 'estudiante'
require 'support/string_extend'
class Controlador

# Clase con la configuracion del proyecto
# lista las acciones que vamos a tener
class Config
@@actions = ['listar', 'buscar', 'agregar', 'salir']
def self.actions; @@actions; end
end

# constructor de la clase En esta verificaremos
# si existe el archivo plano con los estudiantes
# y si no creamos uno nuevo
def initialize(path=nil)
# localizamos el archivo de estudiantes
Estudiante.filepath = path
if Estudiante.existe_archivo?
puts "se encontro la base de datos de estudiantes."
# o creamos un archivo nuevo
elsif Estudiante.crear_archivo
puts "Se creo la base de datos de estudiantes."

else
puts "salir.\n\n"
exit!
end
end

# launch! este metodo tiene un loop que va a recibir las acciones
# que tendrá la aplicación para procesarlas
# llama al encabezado y pie de aplicacion al principio y al final
def launch!
introduction

result = nil
until result == :quit
action, args = acciones
result = hacer_accion(action, args)
end
conclusion
end

# nos da las acciones que que vamos a utilizar en nustro proyecto
# y nos prepara el sistema para recibir las acciones por el usuario
def acciones
action = nil

until Controlador::Config.actions.include?(action)
puts "Acciones: " + Controlador::Config.actions.join(", ")
print "> "
user_response = gets.chomp
args = user_response.downcase.strip.split(' ')
action = args.shift
end
return action, args
end

# Recive la accion que se solicitaron por pantalla y
# se llaman las funciones que cumplan los requisitos del usuario
def hacer_accion(action, args=[])
case action
when 'listar'
listar(args)
when 'buscar'
palabra_clave = args.shift
buscar(palabra_clave)
when 'agregar'
agregar
when 'salir'
return :quit
else
puts "\nel comando no es valido\n"
end
end

# metodo busca a todos los estudiantes y los lista
# tambien ordena principalmente por nombre o por la accion de su preferencia
def listar(args=[])
sort_order = args.shift
sort_order = args.shift if sort_order == 'por'
sort_order = "nombre" unless ['nombre', 'identificador', 'fecha'].include?(sort_order)

titulo("Listando usuarios")

estudiantes = Estudiante.restaurantes_guardados
estudiantes.sort! do |r1, r2|
case sort_order
when 'nombre'
r1.nombre.downcase <=> r2.nombre.downcase
when 'identificador'
r1.identificador.downcase <=> r2.identificador.downcase
when 'fecha'
r1.fecha_nacimiento.to_i <=> r2.fecha_nacimiento.to_i
end
end
prepara_tabla(estudiantes)
puts "Ordena escribiendo: 'listar nombre' o 'listar por identificador'\n\n"
end

# primero consulta todos los estudiantes del archivo de texto
# luego busca que en alguno de sus atributos tenga la palabra clave
# que se esta buscando.
def buscar(keyword="")
titulo("Buscar usaurio")
if keyword
estudiantes = Estudiante.restaurantes_guardados
found = estudiantes.select do |estd|
estd.nombre.downcase.include?(keyword.downcase) ||
estd.identificador.downcase.include?(keyword.downcase) ||
estd.fecha_nacimiento.include?(keyword.downcase)
end
prepara_tabla(found)
else
puts "Examples: 'buscar Ricardo', 'buscar 12345', 'buscar sampayo'\n\n"
end
end

# Crea la estructura para recibir los datos en una especie de formulario
# los recibe crea un objeto Estudiante y lo guarda en el archivo
def agregar
titulo("Agregar estudiante")
estudiante = Estudiante.build_using_questions
if estudiante.guardar
puts "\nBien! Se agrego el usuario\n\n"
else
puts "\nError: No se agrego el usuario\n\n"
end
end

# encabezado de la aplicacion
def introduction
puts "#" * 60
puts "\n\n--- Bienvenido a al tutorial de CODEHERO ---\n"
puts "Este ejemplo pertenece a la serie Ruby desde Cero.\n\n"
end

# pie de la aplicacion
def conclusion
puts "\n--- Hasta luego y recuerda visitarnos en www.CodeHero.co! ---\n\n\n"
puts "#" * 60
end

private

def titulo(texto)
puts "\n#{texto.upcase.center(60)}\n\n"
end

def prepara_tabla(estudiantes=[])
print " " + "Identificador".ljust(30)
print " " + "Nombre".ljust(20)
print " " + "Fecha".rjust(6) + "\n"
puts "-" * 60
estudiantes.each do |rest|
line = " " << rest.identificador.ljust(30)
line << " " + rest.nombre.titleize.ljust(20)
line << " " + rest.fecha_nacimiento.rjust(6)
puts line
end
puts "No hay estudiantes" if estudiantes.empty?
puts "-" * 60
end

end
94 changes: 94 additions & 0 deletions lib/estudiante.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@

class Estudiante

# Variable de clases con la dirección del archivo plano
@@filepath = nil
def self.filepath=(path=nil)
@@filepath = File.join(APP_ROOT, path)
end

# Variables del estudiante
attr_accessor :nombre, :identificador, :fecha_nacimiento

# Verificamos que el archivo exista.
def self.existe_archivo?
if @@filepath && File.exists?(@@filepath)
return true
else
return false
end
end

# Validamos que el archivo existe, sea legible y modificable
def self.validar_archivo?
return false unless @@filepath
return false unless File.exists?(@@filepath)
return false unless File.readable?(@@filepath)
return false unless File.writable?(@@filepath)
return true
end

# Crea un archivo con permisos de Escritura
def self.crear_archivo
File.open(@@filepath, 'w') unless existe_archivo?
return validar_archivo?
end

# recorremos el archivo plano y retornamos un arreglo con los
# objetos estudiantes que esten en el
def self.restaurantes_guardados
estudiantes = []
if validar_archivo?
file = File.new(@@filepath, 'r')
file.each_line do |line|
estudiantes << Estudiante.new.importar_linea(line.chomp)
end
file.close
end
return estudiantes
end

# Establece la estructura para solicitar los archivos
# en la aplicacion (el formulario en pocas palabras)
def self.build_using_questions
args = {}
print "Nombre del estudiante: "
args[:nombre] = gets.chomp.strip

print "identificador: "
args[:identificador] = gets.chomp.strip

print "fecha de nacimiento: "
args[:fecha_nacimiento] = gets.chomp.strip

return self.new(args)
end

# constructor de la aplicación, recibe los datos introducidos
# desde la aplicacion
def initialize(args={})
@nombre = args[:nombre] || ""
@identificador = args[:identificador] || ""
@fecha_nacimiento = args[:fecha_nacimiento] || ""
end

#convierte luna linea del archivo plano a los
# atrubutos del estudiante nombre, identificador y fecha
def importar_linea(line)
line_array = line.split("\t")
@nombre, @identificador, @fecha_nacimiento = line_array
return self
end

# guarda el archivo el estudiante en el archivo plano
def guardar
return false unless Estudiante.validar_archivo?
File.open(@@filepath, 'a') do |file|
file.puts "#{[@nombre, @identificador, @fecha_nacimiento].join("\t")}\n"
end
return true
end

end


13 changes: 13 additions & 0 deletions lib/support/string_extend.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# This helper is opening up core Ruby String class
# in order to add a new method to all strings
class String

# Ruby has a capitalize method (used below) which
# capitalizes the first letter of a string. But in
# order to capitalize the first letter of EVERY
# word we have to write our own.
def titleize
self.split(' ').collect {|word| word.capitalize}.join(" ")
end

end

0 comments on commit 35b630d

Please sign in to comment.