From 8d5fd6adf422817dfc943c15deff28de9a303739 Mon Sep 17 00:00:00 2001 From: Tim Preston Date: Sat, 20 Aug 2011 14:37:16 +1000 Subject: [PATCH 1/6] Slight changes to wording regarding caching. --- README.rdoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.rdoc b/README.rdoc index f044ff5b..0e511a50 100644 --- a/README.rdoc +++ b/README.rdoc @@ -980,7 +980,7 @@ If you are using the +expires+ helper to set the corresponding header, expires 500, :public, :must_revalidate end -To properly use caches, you should consider using +etag+ and +last_modified+. +To properly use caches, you should consider using +etag+ or +last_modified+. It is recommended to call those helpers *before* doing heavy lifting, as they will immediately flush a response if the client already has the current version in its cache: @@ -998,7 +998,7 @@ It is also possible to use a etag @article.sha1, :weak These helpers will not do any caching for you, but rather feed the necessary -information to your cache. If you are looking for a quick caching solutions, +information to your cache. If you are looking for a quick reverse-proxy caching solution, try {rack-cache}[http://rtomayko.github.com/rack-cache/]: require "rack/cache" From b095000b53d1b39507a3626543914d927c572d84 Mon Sep 17 00:00:00 2001 From: Gabriel Andretta Date: Thu, 25 Aug 2011 20:29:12 -0300 Subject: [PATCH 2/6] doc time_for in Spanish readme --- README.es.rdoc | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/README.es.rdoc b/README.es.rdoc index e17eae48..3a33ba2a 100644 --- a/README.es.rdoc +++ b/README.es.rdoc @@ -1157,6 +1157,38 @@ También podés pasarle un nombre de archivo: "guardalo!" end +=== Fecha y Hora + +Sinatra pone a tu disposición el helper +time_for+, que genera un objeto +Time+ +a partir del valor que recibe como argumento. Este valor puede ser un ++String+, pero también es capaz de convertir objetos +DateTime+, +Date+ y de +otras clases similares. + + get '/' do + pass if Time.now > time_for('Dec 23, 2012') + "todavía hay tiempo" + end + +Este método es usado internamente por métodos como +expires+ y +last_modified+, +entre otros. Por lo tanto, es posible extender el comportamiento de estos +métodos sobreescribiendo +time_for+ en tu aplicación: + + helpers do + def time_for(value) + case value + when :ayer then Time.now - 24*60*60 + when :mañana then Time.now + 24*60*60 + else super + end + end + end + + get '/' do + last_modified :ayer + expires :mañana + "hola" + end + === Buscando los Archivos de las Plantillas El helper find_template se utiliza para encontrar los archivos de las From 9ca62c38e4feda99acdd34765161dc791fcac579 Mon Sep 17 00:00:00 2001 From: michelc Date: Thu, 1 Sep 2011 11:03:27 +0200 Subject: [PATCH 3/6] Added example for condition with array argument --- README.fr.rdoc | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/README.fr.rdoc b/README.fr.rdoc index b423a44f..bb84e51c 100644 --- a/README.fr.rdoc +++ b/README.fr.rdoc @@ -146,6 +146,25 @@ Vous pouvez facilement définir vos propres conditions : "Désolé, vous avez perdu." end +Utilisez un splat (caractère joker) dans le cas d'une condition qui prend +plusieurs valeurs : + + set(:auth) do |*roles| # <- ici on utilise un splat + condition do + unless logged_in? && roles.any? {|role| current_user.in_role? role } + redirect "/login/", 303 + end + end + end + + get "/mon/compte/", :auth => [:user, :admin] do + "Informations sur votre compte" + end + + get "/reserve/aux/admins/", :auth => :admin do + "Seuls les administrateurs sont acceptés ici !" + end + === Valeurs de retour La valeur renvoyée par le bloc correspondant à une route constitue le corps de From 733d54acb88c301887df6a4876881b049a76fa93 Mon Sep 17 00:00:00 2001 From: michelc Date: Thu, 1 Sep 2011 17:32:10 +0200 Subject: [PATCH 4/6] Add section about #stream helper --- README.fr.rdoc | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/README.fr.rdoc b/README.fr.rdoc index bb84e51c..8e4964b3 100644 --- a/README.fr.rdoc +++ b/README.fr.rdoc @@ -194,6 +194,10 @@ Avec cela, on peut facilement implémenter un streaming par exemple : get('/') { Stream.new } +Vous pouvez aussi utiliser le helper +stream+ (présenté un peu plus loin) pour +éviter la surcharge et intégrer le traitement relatif au streaming dans le bloc +de code de la route. + === Masques de route spécifiques Comme cela a été vu auparavant, Sinatra offre la possibilité d'utiliser des @@ -859,6 +863,56 @@ retour et les entêtes : Comme +body+, +headers+ et +status+ peuvent être utilisés sans arguments pour accéder à leurs valeurs. +=== Faire du streaming + +Il y a des cas où vous voulez commencer à renvoyer des données pendant que +vous êtes en train de générer le reste de la réponse. Dans les cas les plus +extrèmes, vous souhaitez continuer à envoyer des données tant que le client +n'abandonne pas la connection. Vous pouvez alors utiliser le helper +stream+ +pour éviter de créer votre propre système : + + get '/' do + stream do |out| + out << "Ca va être hallu -\n" + sleep 0.5 + out << " (attends la suite) \n" + sleep 1 + out << "- cinant !\n" + end + end + +Cela permet d'implémenter des API de streaming ou de +{Server Sent Events}[http://dev.w3.org/html5/eventsource/] et peut servir de +base pour des {WebSockets}[http://en.wikipedia.org/wiki/WebSocket]. Vous +pouvez aussi l'employer pour augmenter le débit quand une partie du contenu +provient d'une resource lente. + +Le fonctionnement du streaming, notamment le nombre de requêtes simultanées, +dépend énormément du serveur web utilisé. Certains ne prennent pas du tout en +charge le streaming (WEBRick par exemple). Lorsque le serveur ne gère pas le +streaming, la partie body de la réponse sera envoyée au client en une seule +fois, après que l'exécution du bloc passé au helper +stream+ sera terminée. + +En utilisant le helper +stream+ avec le paramètre +false+, il n'appelera pas +la méthode +close+ du flux, vous laissant la possibilité de le fermer à tout +moment au cours de l'exécution. Ceci ne fonctionne qu'avec les serveurs +evented (ie non threadés) tels que Thin et Rainbows. Les autres serveurs +fermeront malgré tout le flux. + + set :server, :thin + connections = [] + + get '/' do + # conserve le flux ouvert + stream(false) { |out| connections << out } + end + + post '/' do + # écrit dans tous les flux ouverts + connections.each { |out| out << params[:message] << "\n" } + "message sent" + end + === Journalisation (Logging) Dans le contexte de la requête, la méthode utilitaire +logger+ expose une @@ -1310,6 +1364,9 @@ Vous pouvez accéder à ces paramètres via settings : Activé par défaut pour le style classique, désactivé pour le style modulaire. +[threaded] à définir à +true+ pour indiquer à Thin d'utiliser + EventMachine.defer pour traiter la requête. + [views] dossier des vues. == Gérer les erreurs From 40c0003d069fd16e3eab713007c934f79c0f65e7 Mon Sep 17 00:00:00 2001 From: michelc Date: Thu, 1 Sep 2011 17:38:40 +0200 Subject: [PATCH 5/6] Slight changes to wording regarding caching. --- README.fr.rdoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.fr.rdoc b/README.fr.rdoc index 8e4964b3..6d5d5e8f 100644 --- a/README.fr.rdoc +++ b/README.fr.rdoc @@ -1035,7 +1035,7 @@ Si vous utilisez la méthode +expires+ pour définir l'entête correspondant, expires 500, :public, :must_revalidate end -Pour utiliser correctement les caches, vous devriez utiliser +etag+ et +Pour utiliser correctement les caches, vous devriez utiliser +etag+ ou +last_modified+. Il est recommandé d'utiliser ces méthodes *avant* de faire d'importantes modifications, car elles vont immédiatement déclencher la réponse si le client a déjà la version courante dans son cache : @@ -1054,7 +1054,7 @@ Il est également possible d'utiliser un Ces méthodes ne sont pas chargées de mettre des données en cache, mais elles fournissent les informations nécessaires pour votre cache. Si vous êtes à la -recherche de solutions rapides de cache, essayez +recherche de solutions rapides pour un reverse-proxy de cache, essayez {rack-cache}[http://rtomayko.github.com/rack-cache/] : require "rack/cache" From 5a23b3694a0fa2ab4c17be2cec093dec37b34d73 Mon Sep 17 00:00:00 2001 From: michelc Date: Thu, 1 Sep 2011 17:52:22 +0200 Subject: [PATCH 6/6] Make time_for part of the API. --- README.fr.rdoc | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/README.fr.rdoc b/README.fr.rdoc index 6d5d5e8f..0c8bec4c 100644 --- a/README.fr.rdoc +++ b/README.fr.rdoc @@ -1179,6 +1179,38 @@ Vous pouvez également lui passer un nom de fichier : "enregistre-le !" end +=== Gérer Date et Time + +Sinatra fourni un helper +time_for+ pour convertir une valeur donnée en +objet +Time+. Il peut aussi faire la conversion à partir d'objets +DateTime+, ++Date+ ou de classes similaires. + + get '/' do + pass if Time.now > time_for('Dec 23, 2012') + "encore temps" + end + +Cette méthode est utilisée en interne par +expires+, +last_modified+ et +consorts. Par conséquent, vous pouvez très facilement étendre le +fonctionnement de ces méthodes en surchargeant le helper +time_for+ dans +votre application : + + helpers do + def time_for(value) + case value + when :yesterday then Time.now - 24*60*60 + when :tomorrow then Time.now + 24*60*60 + else super + end + end + end + + get '/' do + last_modified :yesterday + expires :tomorrow + "salut" + end + === Chercher les fichiers de templates La méthode find_template est utilisée pour trouver les fichiers de