properly i18n'ize Coquelicot::Rack::Upload
authorLunar <lunar@anargeek.net>
Wed, 4 Apr 2012 17:02:52 +0000 (19:02 +0200)
committerLunar <lunar@anargeek.net>
Thu, 14 Mar 2013 09:12:10 +0000 (10:12 +0100)
lib/coquelicot.rb
lib/coquelicot/app.rb
lib/coquelicot/base_app.rb [new file with mode: 0644]
lib/coquelicot/rack/upload.rb
spec/coquelicot/app_spec.rb
views/layout.haml

index 9b03863..843cf6d 100644 (file)
@@ -23,5 +23,6 @@ require 'coquelicot/depot'
 require 'coquelicot/rack/multipart_parser'
 require 'coquelicot/num'
 require 'coquelicot/helpers'
+require 'coquelicot/base_app'
 require 'coquelicot/rack/upload'
 require 'coquelicot/app'
index 9eeb577..62e260e 100644 (file)
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 require 'lockfile'
-require 'sinatra/base'
 require 'sinatra/config_file'
-require 'haml'
-require 'haml/magic_translations'
 require 'sass'
 require 'digest/sha1'
 require 'fast_gettext'
@@ -64,10 +61,9 @@ module Coquelicot
     end
   end
 
-  class Application < Sinatra::Base
+  class Application < Coquelicot::BaseApp
     register Sinatra::ConfigFile
     register Coquelicot::Auth::Extension
-    helpers Coquelicot::Helpers
 
     enable :sessions
     # When sessions are enabled, Rack::Protection (added by Sinatra)
@@ -98,23 +94,6 @@ module Coquelicot
     # limit requests other than upload to an input body of 5 kiB max
     use Rainbows::MaxBody, 5 * 1024
 
-    AVAILABLE_LOCALES = %w(en fr de)
-
-    FastGettext.add_text_domain 'coquelicot', :path => 'po', :type => 'po'
-    FastGettext.available_locales = AVAILABLE_LOCALES
-    Haml::MagicTranslations.enable(:fast_gettext)
-    before do
-      FastGettext.text_domain = 'coquelicot'
-      if params[:lang]
-        locale = session[:lang] = params[:lang]
-      elsif session[:lang]
-        locale = session[:lang]
-      else
-        locale = request.env['HTTP_ACCEPT_LANGUAGE'] || 'en'
-      end
-      FastGettext.locale = locale
-    end
-
     not_found do
       'Not found'
     end
diff --git a/lib/coquelicot/base_app.rb b/lib/coquelicot/base_app.rb
new file mode 100644 (file)
index 0000000..1a2dc71
--- /dev/null
@@ -0,0 +1,46 @@
+# -*- coding: UTF-8 -*-
+# Coquelicot: "one-click" file sharing with a focus on users' privacy.
+# Copyright © 2012 potager.org <jardiniers@potager.org>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+require 'sinatra/base'
+require 'haml'
+require 'haml/magic_translations'
+
+module Coquelicot
+  AVAILABLE_LOCALES = %w(en fr de)
+
+  class BaseApp < Sinatra::Base
+    include FastGettext::Translation
+
+    helpers Coquelicot::Helpers
+
+    FastGettext.add_text_domain 'coquelicot', :path => 'po', :type => 'po'
+    FastGettext.available_locales = AVAILABLE_LOCALES
+    Haml::MagicTranslations.enable(:fast_gettext)
+
+    before do
+      FastGettext.text_domain = 'coquelicot'
+      if params && params[:lang]
+        locale = session[:lang] = params[:lang]
+      elsif session[:lang]
+        locale = session[:lang]
+      else
+        locale = request.env['HTTP_ACCEPT_LANGUAGE'] || 'en'
+      end
+      FastGettext.locale = locale
+    end
+  end
+end
index 47ea775..61798f1 100644 (file)
@@ -28,13 +28,10 @@ module Coquelicot::Rack
     end
   end
 
-  class Upload < Sinatra::Base
-    include FastGettext::Translation
-
+  class Upload < Coquelicot::BaseApp
     set :logging, true
     set :views, Proc.new { Coquelicot.settings.views }
     set :additional_css, Proc.new { Coquelicot.settings.additional_css }
-    helpers Coquelicot::Helpers
 
     def call(env)
       if handle_request?(env)
@@ -90,6 +87,7 @@ module Coquelicot::Rack
     end
 
     def dispatch!
+      filter! :before
       catch(:pass) do
         return process!
       end
@@ -99,12 +97,6 @@ module Coquelicot::Rack
     def error_block!(status)
       return unless (400..599).include? status
 
-      # XXX: NOT NICE! FIX FIX FIX!
-      FastGettext.add_text_domain 'coquelicot', :path => 'po', :type => 'po'
-      FastGettext.available_locales = [ 'en', 'fr', 'de' ]
-      FastGettext.text_domain = 'coquelicot'
-      FastGettext.locale = request.env['HTTP_ACCEPT_LANGUAGE'] || 'en'
-
       haml <<-HAML.gsub(/^ */, '')
         %h1 Oops…
         %p= response.body.join
index 937941a..191d92e 100644 (file)
@@ -38,20 +38,37 @@ describe Coquelicot::Application do
 
   describe 'get /' do
     context 'using the default language' do
-      before do
-        visit '/'
-      end
       it 'should display the maximum file size' do
+        visit '/'
         find(:xpath, '//label[@for="file"]/following::*[@class="note"]').
             should have_content("Max. size: #{Coquelicot.settings.max_file_size.as_size}")
       end
       context 'when I explicitly request french' do
-        before do
-          click_link 'fr'
-        end
         it 'should display a page in french' do
+          visit '/'
+          click_link 'fr'
           page.should have_content('Partager')
         end
+        # will fail without ordered Hash, see:
+        # <https://github.com/jnicklas/capybara/issues/670>
+        context 'when I upload an empty file', :if => RUBY_VERSION >= '1.9' do
+          around do |example|
+            file = Tempfile.new('coquelicot')
+            begin
+              visit '/'
+              click_link 'fr'
+              fill_in 'upload_password', :with => upload_password
+              attach_file 'file', file.path
+              click_button 'submit'
+              example.run
+            ensure
+              file.close!
+            end
+          end
+          it 'should display an error in french' do
+            page.should have_content('Le fichier est vide')
+          end
+        end
       end
     end
     context 'when my browser prefers french' do
index 42cb60c..5c2e48f 100644 (file)
@@ -43,7 +43,7 @@
   %body
     #header
       - unless uri.end_with? '/README'
-        - Coquelicot::Application::AVAILABLE_LOCALES.each do |locale|
+        - Coquelicot::AVAILABLE_LOCALES.each do |locale|
           %a{ :href => uri + "?lang=#{locale}" }= locale
     #container
       = yield