
Projet : créer un outil en ligne de commande
Mettez en pratique toutes vos compétences Ruby en créant un outil en ligne de commande de A à Z. Ce projet intégrateur vous guide pour utiliser les gems, appeler une API, gérer les erreurs et structurer votre code de manière professionnelle.
L'objectif : construire une application météo en ligne de commande
Le moment est venu de synthétiser tout ce que vous avez appris. Nous n'allons pas apprendre de nouveaux concepts, mais plutôt assembler ceux que nous maîtrisons pour construire une application complète et fonctionnelle : un outil en ligne de commande (CLI - Command-Line Interface) qui donne la météo pour une ville donnée.
L'objectif est simple. L'utilisateur devra pouvoir lancer notre script depuis son terminal en lui passant un nom de ville, comme ceci :
ruby meteo.rb "Paris"En retour, le programme devra se connecter à une API météo, récupérer les informations, et afficher un résumé clair dans la console. Ce projet va nous forcer à utiliser : la gestion des gems (Bundler), la programmation orientée objet (classes), les appels API (HTTParty), la manipulation de données (JSON, Hash), la gestion des erreurs (begin/rescue) et la lecture des arguments de la ligne de commande.
Etape 1 : Mettre en place la structure du projet
Un projet bien structuré est plus facile à maintenir. Commençons par créer un dossier pour notre projet et initialiser Bundler pour gérer nos dépendances.
Dans votre terminal :
mkdir meteo_ruby
cd meteo_ruby
bundle initCela crée un fichier Gemfile. Ouvrez-le et ajoutez la gem httparty, dont nous aurons besoin pour faire nos appels API :
# frozen_string_literal: true
source "https://rubygems.org"
gem "httparty"Installez la gem avec bundle install. Ensuite, créons les fichiers de notre application. Nous allons séparer la logique de l'API de notre script principal pour une meilleure organisation.
# Fichier principal qui sera exécuté
touch meteo.rb
# Dossier pour notre logique métier
mkdir lib
# Fichier pour la classe qui gérera l'API
touch lib/weather_api.rbVotre structure de projet est maintenant prête et professionnelle.
Etape 2 : Créer la classe pour interagir avec l'API météo
Nous allons utiliser l'API gratuite d'OpenWeatherMap. Vous devrez créer un compte sur leur site pour obtenir une clé API personnelle. C'est une étape très courante dans le développement.
Dans le fichier lib/weather_api.rb, nous allons créer une classe WeatherAPI. Sa responsabilité sera de communiquer avec le service externe.
require 'httparty'
class WeatherAPI
BASE_URL = 'https://api.openweathermap.org/data/2.5/weather'.freeze
API_KEY = 'VOTRE_CLE_API_PERSONNELLE_ICI'.freeze # Remplacez par votre clé !
def fetch_weather(city)
begin
query = { q: city, appid: API_KEY, units: 'metric', lang: 'fr' }
response = HTTParty.get(BASE_URL, query: query)
# On vérifie si la requête a réussi (code 200)
if response.success?
response.parsed_response
else
# Gère les cas où la ville n'est pas trouvée, etc.
nil
end
rescue SocketError, Net::OpenTimeout
# Gère les erreurs de connexion réseau
nil
end
end
endConseil de pro : Notez comment nous avons intégré la gestion d'erreurs directement dans cette classe. Elle retournera nil en cas de problème réseau ou si l'API renvoie un code d'erreur. C'est une conception robuste.
Etape 3 : Ecrire le script principal exécutable
Maintenant, occupons-nous du fichier meteo.rb. C'est le point d'entrée de notre application. Il va lire les arguments, utiliser notre classe WeatherAPI et afficher les résultats.
Ruby met à disposition les arguments passés en ligne de commande dans une constante spéciale : un tableau de chaînes de caractères nommé ARGV.
# On charge notre classe WeatherAPI
require_relative 'lib/weather_api'
# 1. Vérifier les arguments
if ARGV.empty?
puts "Usage: ruby meteo.rb \"Nom de la ville\""
exit # Quitte le programme si aucun argument n'est donné
end
city = ARGV.first
# 2. Appeler l'API
puts "Recherche de la météo pour #{city}..."
api = WeatherAPI.new
weather_data = api.fetch_weather(city)
# 3. Afficher les résultats
if weather_data
temp = weather_data['main']['temp']
description = weather_data['weather'].first['description']
puts "-" * 30
puts "Météo actuelle pour #{city.capitalize}:"
puts "Température: #{temp}°C"
puts "Description: #{description.capitalize}"
puts "-" * 30
else
puts "Impossible de récupérer les données météo. Vérifiez le nom de la ville ou votre connexion."
endEtape 4 : Tester et utiliser votre outil
Tout est en place ! Assurez-vous d'avoir bien remplacé 'VOTRE_CLE_API_PERSONNELLE_ICI' dans lib/weather_api.rb.
Retournez dans votre terminal, à la racine du projet meteo_ruby, et lancez la commande :
ruby meteo.rb "Marseille"Si tout se passe bien, vous devriez voir un résultat formaté :
Recherche de la météo pour Marseille...
------------------------------
Météo actuelle pour Marseille:
Température: 25.1°C
Description: Ciel clair
------------------------------Testez également les cas d'erreur : lancez la commande sans argument, avec un nom de ville invalide, ou en coupant votre connexion internet. Grâce à notre code défensif, le programme devrait se comporter de manière prévisible et afficher des messages d'erreur clairs sans jamais crasher.
Félicitations ! Vous venez de construire une application Ruby complète, de la structure du projet à l'interaction avec un service web, en appliquant les meilleures pratiques vues tout au long de ce cours.