Configuration et paramétrage avec Sinatra

2011-05-03 #ruby#sinatra

Ceci est la traduction du tutoriel "Sinatra Settings and Configuration" de Darren Jones.

Définir des paramètres

Pour définir des variables session d'application qui seront accessible partout dans une application, on peut utiliser la commande set en respectant la syntaxe suivante :

set :name, 'MonSite'
set :author, 'Michel'

Ces variables sont ensuite utilisables dans notre code Ruby sous la forme settings.name et settings.author :

get '/hello' do
  "Cette page a été rédigée par " + settings.author
end

Puis en se connectant à l'URL "/hello" on obtient alors :

Cette page a été rédigée par Michel.

On peut également utiliser la commande set pour modifier les paramètres de certains gems, comme par exemple :

set :haml, { :format => :html5 }

Grâce à quoi Haml génèrera du code HTML5 avec le doctype correct, pas de barre fermante pour la balise image, etc...

Il est même possible de modifier les paramètres par défaut de Sinatra. C'est ce qui permet par exemple de redéfinir le répertoire "public" :

set :public, Proc.new { root }

De cette façon, le répertoire "public" sera identique au répertoire racine du site.

Et pour modifier le répertoire où sont enregistrées les vues :

set :views, Proc.new { File.join(root, "templates") }

Après cela, Sinatra recherchera dans le dossier "templates" pour tous les fichiers de vues de notre application (en lieu et place du répertoire "views" utilisé par défaut).

Quand le paramètre correspond à un booléen, il est possible d'utiliser les commandes enable et disable plutôt que la commande set :

enable :sessions
disable :twitter

Ce qui est exactement identique à :

set :sessions, true
set :twitter, false

La documentation officielle de Sinatra fourni d'autres explications et des exemple, entre autre la liste des paramètres internes de Sinatra.

Les blocs de configuration

Sinatra permet de regrouper un ensemble de paramètres dans un bloc de configuration :

configure do
  set :name, 'michel'
  set :haml, { :format => :html5 }
end

Cela va initialiser tous les paramètres ainsi que tout ce qui est nécessaire au démarrage.

Et cerise sur le gâteau, on peut définir un bloc de configuration pour chaque environnement :

configure :development do
  set :db, File.join("sqlite3://",settings.root, "development.db"
end

configure :test do
  set :db, File.join("sqlite3://",settings.root, "test.db"
end

configure :production do
  File.join("sqlite3://",settings.root, "production.db"
  set :sass, { :style => :compressed }
end

Comme vous pouvez le voir, j'ai configuré Sass pour que sa sortie soit compressée en production et que le fichier généré soit le plus petit possible. Il existe tout un tas d'autres options pour Sass et Haml qui peuvent être initialisées de cette façon.

Gérer des paramètres d'environnement sur Heroku

Pour finir, on a la possibilité de définir des variables d'environnement directement sur Heroku, ce qui nous évite d'avoir à rendre la valeur de certains paramètres publics. Supposons que nous ayons le code ci-dessous :

set :password, 't0psecret'

Le hic c'est que si on compte partager notre code, les autres personnes auront accès à notre mot de passe top secret ! La solution dans ce cas là c'est de définir une variable d'environnement appelée "PASSWORD", chose de très simple à faire depuis une console bash. Il suffit de se placer dans le répertoire de l'application et d'entrer le code ci-dessous :

$ heroku config:add PASSWORD=t0psecret

Ce qui doit renvoyer le message suivant :

Adding config vars:
  PASSWORD    => t0psecret
Restarting app...done.

Il faut utiliser la commande config seule pour lister toutes les variables d'environnement existantes sur Heroku :

$ heroku config

Comme on peut le voir suite à cette commande, Heroku défini déjà par lui-même un certain nombre de variables d'environnement de façon automatique dans le but de nous faciliter la vie :

PASSWORD => t0psecret
DATABASE_URL => postgres://ibzju...s.com/ibzjubamts
RACK_ENV     => production
URL          => http://bloggl.heroku.com

Si on a besoin de se débarrasser de toutes les variables de configuration, on peut employer la commande suivante :

$ heroku config:clear

Ce que Heroku confirmera avant de redémarrer l'application :

Clearing all config vars and restarting app...done.

Après avoir créé nos variables d'environnement sur Heroku, il ne nous reste plus qu'à modifier notre code source pour en tirer parti :

set :password, ENV['PASSWORD'] || 'secret'

Ce code va utiliser la variable d'environnement enregistrée dans ENV['PASSWORD'] si elle est définie ou sinon se contenter du simple mot de passe "secret" défini en dur dans le code. Grâce à cette méthode vous ne risquez pas de divulguer quoique ce soit d'important ou de personnel dans votre code source Ruby.

Pour être complet, le Dev Center d'Heroku présente d'autres informations concernant l'utilisation des variables de configuration sur Heroku.