Skip to content

Instantly share code, notes, and snippets.

@glenux
Created June 7, 2016 14:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save glenux/d4299567fadd9e6eafa6903022d8602e to your computer and use it in GitHub Desktop.
Save glenux/d4299567fadd9e6eafa6903022d8602e to your computer and use it in GitHub Desktop.
#!/usr/bin/env ruby
## Exercice 2 : Utiliser modules & classes
# On va organiser le code de l'exercice précédent.
# Pour cela on va regrouper l'ensemble sous un module
# Taskman .
#
# Ensuite on pourra définir:
# - une classe Cli (command-line interface) pour le programme
# principal
# - une classe TaskList pour gérer la liste de taches.
#
#
module Taskman
class TaskList
def initialize
@tasks = [
{id: 1, title: 'Acheter des chaussettes' ,date: 0,flags:[] } ,
{id: 25,title: 'Préparer cadeau de Cécile',date: 0,flags:['important']}
]
end
def list
@tasks.each do |item|
id = item[:id]
title = item[:title].to_s
date = item[:date] || '-'
flags = (item[:flags] || ['-']).join(',')
puts "%2d: %-35.35s %s %s" % [id, title, date, flags]
end
end
# Ajoute une nouvelle tache à la liste
def add title, date=nil, flags=nil # ...
# on calculer le nouvel ID en cherchant le max des id présents + 1
id = @tasks.map{|t| t[:id]}.max + 1
# on va fabriquer un hash avec les valeurs aux bons endroits
# et l'ajouter (d'un coup)
@tasks << {
id: id,
title: title,
date: date,
flags: flags
}
# that's all folks !
return id
end
# Modifie une tache, d'apres son identifiant
# - en prenant (presque) les memes parametres que add
# - on veut pouvoir modifier le titre, la date, ou les flags
def mod id, modifs={}
# il faut trouver la bonne tache d'abord
task = @tasks.select{|t| t[:id] == id }.first # équivalent à [0]
# on modifie la valeur dans task, seulement si la clef est bien légitime
modifs.each do |key,val|
task[key] = val if task.keys.include? key
end
end
# on a besoin d'un id
def del id
# on parcours la liste, jusqu'à tomber sur l'id donné
# à ce moment, on vire la case ;)
@tasks.reject! {|t| t[:id] == id }
end
end
class Cli
def self.main
# on teste ?
tl = TaskList.new
tl.list
puts "---- (avec add)"
tl.add "Inviter Rachel au resto"
id = tl.add "Prendre des nouvelles de Vicky", 0, ['important']
tl.list
puts "---- (avec mods)"
tl.mod id, {
title: "Appeler Christine pour prendre des nouvelles"
}
tl.mod 1, {flags: ['important']}
tl.list
end
end
end
Taskman::Cli.main
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment