-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
0 parents
commit 35b630d
Showing
6 changed files
with
297 additions
and
0 deletions.
There are no files selected for viewing
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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! |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |