rack-fontserve 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. data/.gitignore +7 -0
  2. data/Gemfile +4 -0
  3. data/LICENSE +20 -0
  4. data/README.rdoc +53 -0
  5. data/Rakefile +11 -0
  6. data/lib/rack-fontserve.rb +66 -0
  7. data/lib/rack-fontserve/font.rb +69 -0
  8. data/lib/rack-fontserve/version.rb +5 -0
  9. data/lib/rack-fontserve/views/demo.erb +35 -0
  10. data/lib/rack-fontserve/views/stylesheet.erb +14 -0
  11. data/rack-fontserve.gemspec +27 -0
  12. data/test/fixtures/CustomCSS.css +3 -0
  13. data/test/fixtures/LicenseFont.css +14 -0
  14. data/test/fixtures/SampleFont.css +14 -0
  15. data/test/fixtures/fonts/AnotherFont/AnotherFont.otf +0 -0
  16. data/test/fixtures/fonts/AnotherFont/AnotherFont.svg +0 -0
  17. data/test/fixtures/fonts/AnotherFont/AnotherFont.ttf +0 -0
  18. data/test/fixtures/fonts/AnotherFont/AnotherFont.woff +0 -0
  19. data/test/fixtures/fonts/CustomCSS/CustomCSS.css +3 -0
  20. data/test/fixtures/fonts/CustomCSS/CustomCSS.ttf +0 -0
  21. data/test/fixtures/fonts/FileFont +0 -0
  22. data/test/fixtures/fonts/InvalidFont/WeirdNaming.otf +0 -0
  23. data/test/fixtures/fonts/LicenseFont/LICENSE +1 -0
  24. data/test/fixtures/fonts/LicenseFont/LicenseFont.eot +0 -0
  25. data/test/fixtures/fonts/LicenseFont/LicenseFont.ttf +0 -0
  26. data/test/fixtures/fonts/SampleFont/SampleFont.eot +0 -0
  27. data/test/fixtures/fonts/SampleFont/SampleFont.otf +0 -0
  28. data/test/fixtures/fonts/SampleFont/SampleFont.svg +0 -0
  29. data/test/fixtures/fonts/SampleFont/SampleFont.ttf +0 -0
  30. data/test/fixtures/fonts/SampleFont/SampleFont.woff +0 -0
  31. data/test/fixtures/fonts/SimpleFont/SimpleFont.ttf +0 -0
  32. data/test/helper.rb +102 -0
  33. data/test/test_font.rb +95 -0
  34. data/test/test_web.rb +63 -0
  35. metadata +155 -0
@@ -0,0 +1,7 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
+ coverage
6
+ tmp
7
+ doc
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in rack-fontserve.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2011 Christoph Olszowka
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,53 @@
1
+ = Rack::Fontserve
2
+
3
+ A simple Sinatra-based font hosting rack application that utilizes HTTP caching and Allow-Access-Control-Origin properly
4
+ and generates the corresponding @font-face-CSS file on the fly.
5
+
6
+ == Running standalone
7
+
8
+ Create a Gemfile:
9
+
10
+ source :rubygems
11
+ gem 'rack-fontserve'
12
+
13
+ Create a config.ru:
14
+
15
+ require 'bundler/setup'
16
+ require 'rack-fontserve'
17
+ Rack::Fontserve.set :fonts_path, './fonts'
18
+ run Rack::Fontserve
19
+
20
+ Create a directory 'fonts', place your fonts inside there in subfolders, where each font format file has the same name
21
+ as the directory:
22
+
23
+ fonts/iconic_stroke/
24
+ + iconic_stroke.eot
25
+ + iconic_stroke.ttf
26
+ + iconic_stroke.svg
27
+
28
+ That's it! Run with `rackup`, push to heroku, or mount it in an existing Rails 3 app by adding rack-fontserve to your gemfile,
29
+ setting the fonts path and mounting the app in your routes.rb file:
30
+
31
+ mount Rack::Fontserve, :at => "/fonts"
32
+
33
+ You can see a demo of all fonts in the fonts_path at /demo
34
+
35
+ == TODO
36
+
37
+ * Improve the CSS syntax (kill unneccessary blank lines)
38
+ * Make the scope selector for svg fonts configurable
39
+ * Add an "all.css" action that aggregates all fonts into one file
40
+
41
+ == Note on Patches/Pull Requests
42
+
43
+ * Fork the project.
44
+ * Make your feature addition or bug fix.
45
+ * Add tests for it. This is important so I don't break it in a
46
+ future version unintentionally.
47
+ * Commit, do not mess with rakefile, version, or history.
48
+ (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
49
+ * Send me a pull request. Bonus points for topic branches.
50
+
51
+ == Copyright
52
+
53
+ Copyright (c) 2011 Christoph Olszowka. See LICENSE for details.
@@ -0,0 +1,11 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
3
+
4
+ require 'rake/testtask'
5
+ Rake::TestTask.new(:test) do |test|
6
+ test.libs << 'lib' << 'test'
7
+ test.pattern = 'test/**/test_*.rb'
8
+ test.verbose = true
9
+ end
10
+
11
+ task :default => :test
@@ -0,0 +1,66 @@
1
+ require 'sinatra/base'
2
+
3
+ module Rack
4
+ class Fontserve < Sinatra::Base
5
+ class InvalidFontError < StandardError; end;
6
+ class InvalidFormatError < StandardError; end;
7
+ autoload :Font, 'rack-fontserve/font'
8
+
9
+ CONTENT_TYPES = {'ttf' => 'font/truetype',
10
+ 'otf' => 'font/opentype',
11
+ 'woff' => 'font/woff',
12
+ 'eot' => 'application/vnd.ms-fontobject',
13
+ 'svg' => 'image/svg+xml',
14
+ 'css' => 'text/css;charset=utf-8'}
15
+
16
+ set :max_age, 365 * 24 * 60 * 60
17
+ set :views, ::File.join(::File.dirname(__FILE__), 'rack-fontserve/views')
18
+
19
+ not_found do
20
+ [404, '']
21
+ end
22
+
23
+ error(InvalidFontError) { not_found }
24
+ error(InvalidFormatError) { not_found }
25
+
26
+ helpers do
27
+ def prepare_headers(format)
28
+ set_content_type(format)
29
+ set_cache
30
+ end
31
+
32
+ def set_content_type(format)
33
+ headers['Content-Type'] = CONTENT_TYPES[format.to_s]
34
+ end
35
+
36
+ def set_cache
37
+ headers 'Cache-Control' => "public, max-age=#{Rack::Fontserve.max_age}",
38
+ 'Expires' => (Time.now + Rack::Fontserve.max_age).httpdate,
39
+ 'Access-Control-Allow-Origin' => '*'
40
+ end
41
+
42
+ def format?(f)
43
+ @font.formats.include?(f.to_s)
44
+ end
45
+ end
46
+
47
+ get '/demo' do
48
+ erb :demo
49
+ end
50
+
51
+ # Render the generated or custom css for given font with caching
52
+ get '/:font_name.css' do
53
+ @font = Font.new(params[:font_name])
54
+ prepare_headers :css
55
+ @font.custom_css? ? @font.custom_css : erb(:stylesheet)
56
+ end
57
+
58
+ # Render the font file for given font and format with caching
59
+ get '/:font_name.:format' do
60
+ @font = Font.new(params[:font_name])
61
+ @data = open(@font.format_path(params[:format]))
62
+ prepare_headers params[:format]
63
+ @data.read
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,69 @@
1
+ # Representation of fonts in the Rack::Fontserve.fonts_path, including various
2
+ # helpers to check and retrieve formats, license and custom css
3
+ class Rack::Fontserve::Font
4
+ attr_reader :name
5
+
6
+ # Returns an array of all present and valid fonts
7
+ def self.all
8
+ Dir[File.join(Rack::Fontserve.fonts_path.to_s, '*')].map do |path|
9
+ begin
10
+ new(File.basename(path))
11
+ rescue Rack::Fontserve::InvalidFontError
12
+ nil
13
+ end
14
+ end.compact
15
+ end
16
+
17
+ def initialize(name)
18
+ @name = File.basename(name) # Ensure we remove any path sections that might get burned into here
19
+ raise Rack::Fontserve::InvalidFontError unless valid?
20
+ end
21
+
22
+ # Returns the base path of this font
23
+ def path
24
+ @path ||= File.join(Rack::Fontserve.fonts_path, name)
25
+ end
26
+
27
+ # Retruns a list of available formats
28
+ def formats
29
+ @formats ||= Dir[File.join(path, "#{name}.{otf,svg,ttf,woff,eot}")].map {|file| File.extname(file)[1..-1] }.sort
30
+ end
31
+
32
+ # Returns the path to the font file in given format. Raises InvalidFormatError if the font is not available in this format
33
+ def format_path(format)
34
+ raise Rack::Fontserve::InvalidFormatError unless formats.include?(format)
35
+ file_path "#{name}.#{format}"
36
+ end
37
+
38
+ # custom css file exists?
39
+ def custom_css?
40
+ File.exist? file_path("#{name}.css")
41
+ end
42
+
43
+ # Returns the content of the custom CSS file if present, nil otherwise
44
+ def custom_css
45
+ File.read file_path("#{name}.css") if custom_css?
46
+ end
47
+
48
+ # LICENSE file exists?
49
+ def license?
50
+ File.exist? file_path('LICENSE')
51
+ end
52
+
53
+ # Returns the content of the LICENSE file if present, nil otherwise
54
+ def license
55
+ File.read file_path('LICENSE') if license?
56
+ end
57
+
58
+ private
59
+
60
+ # Checks whether this font is valid - which is the case when the font has any formats present
61
+ def valid?
62
+ formats.count > 0
63
+ end
64
+
65
+ # Helper for paths to files in the font's home dir
66
+ def file_path(filename)
67
+ File.join(path, filename)
68
+ end
69
+ end
@@ -0,0 +1,5 @@
1
+ # Define it as a plain constant instead of Bundler best-practice of
2
+ # Rack::Fontserve::VERSION since Fontserve is a class that inherits from Sinatra::Base
3
+ # and we'd be getting Superclass mismatch errors here since Sinatra is
4
+ # unavailable when evaluating this file standalone, i.e. in Rakefile
5
+ FONTSERVE_VERSION = '0.1.0'
@@ -0,0 +1,35 @@
1
+ <html>
2
+ <head>
3
+ <title>rack-fontserve demo</title>
4
+ <% Font.all.each do |font| %>
5
+ <link rel="stylesheet" href="/<%= font.name %>.css?nocache=<%= rand(500000000) * rand(5000)/(rand(2000)+3)+5 %>"/>
6
+ <% end %>
7
+ <style type="text/css">
8
+ body {
9
+ text-align: center;
10
+ font-size: 180%;
11
+ background: #ddd;
12
+ padding-top: 35px;
13
+ font-family: Helvetica, "Helvetica Neue", Arial, sans-serif;
14
+ }
15
+ h1,h2,h3 {
16
+ text-shadow: white 1px 1px 1px;
17
+ }
18
+
19
+ <% Font.all.each do |font| %>
20
+ .<%= font.name %> { font-family: '<%= font.name %>', Helvetica, Arial, sans-serif; }
21
+ <% end %>
22
+ </style>
23
+ </head>
24
+
25
+ <body>
26
+ <h1>rack-fontserve</h1>
27
+ <% Font.all.each do |font| %>
28
+ <div class="<%= font.name %>">
29
+ <h2><%= font.name %></h2>
30
+ <p>The quick brown fox jumps over the lazy dog (possibly)</p>
31
+ </div>
32
+ <% end %>
33
+ </body>
34
+ </html>
35
+
@@ -0,0 +1,14 @@
1
+ <% if @font.license? %>/* LICENSE: <%= @font.license %> */<% end %>
2
+ @font-face {
3
+ font-family: '<%= @font.name %>';
4
+ <% if format?('eot') %>src: url('<%= "./#{@font.name}.eot" %>');<% end %>
5
+ src: local('☺'),
6
+ <% if format?('eot') %>url('<%= "./#{@font.name}.eot?iefix" %>') format('eot'), <% end %>
7
+ <% if format?('woff') %>url('<%= "./#{@font.name}.woff" %>') format('woff'), <% end %>
8
+ <% if format?('ttf') %>url('<%= "./#{@font.name}.ttf" %>') format('truetype'), <% end %>
9
+ <% if format?('otf') %>url('<%= "./#{@font.name}.otf" %>') format('opentype'), <% end %>
10
+ <% if format?('svg') %>url('<%= "./#{@font.name}.svg#webfont" %>') format('svg'), <% end %>
11
+ local('☺');
12
+ font-weight: normal;
13
+ font-style: normal;
14
+ }
@@ -0,0 +1,27 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "rack-fontserve/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "rack-fontserve"
7
+ s.version = FONTSERVE_VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Christoph Olszowka"]
10
+ s.email = ["christoph (at) olszowka de"]
11
+ s.homepage = "https://github.com/colszowka/rack-fontserve"
12
+ s.summary = %q{Sinatra app for serving web fonts easily with proper caching and access-control headers}
13
+ s.description = %q{Sinatra app for serving web fonts easily with proper caching and access-control headers}
14
+
15
+ s.rubyforge_project = "rack-fontserve"
16
+
17
+ s.add_dependency 'sinatra', "~> 1.2.1"
18
+
19
+ s.add_development_dependency 'rack-test', "~> 0.5.7"
20
+ s.add_development_dependency 'shoulda', "~> 2.11.3"
21
+ s.add_development_dependency 'simplecov', '>= 0.4.0'
22
+
23
+ s.files = `git ls-files`.split("\n")
24
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
25
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
26
+ s.require_paths = ["lib"]
27
+ end
@@ -0,0 +1,3 @@
1
+ .font {
2
+ font-weight: bold;
3
+ }
@@ -0,0 +1,14 @@
1
+ /* LICENSE: A super secret license */
2
+ @font-face {
3
+ font-family: 'LicenseFont';
4
+ src: url('./LicenseFont.eot');
5
+ src: local('☺'),
6
+ url('./LicenseFont.eot?iefix') format('eot'),
7
+
8
+ url('./LicenseFont.ttf') format('truetype'),
9
+
10
+
11
+ local('☺');
12
+ font-weight: normal;
13
+ font-style: normal;
14
+ }
@@ -0,0 +1,14 @@
1
+
2
+ @font-face {
3
+ font-family: 'SampleFont';
4
+ src: url('./SampleFont.eot');
5
+ src: local('☺'),
6
+ url('./SampleFont.eot?iefix') format('eot'),
7
+ url('./SampleFont.woff') format('woff'),
8
+ url('./SampleFont.ttf') format('truetype'),
9
+ url('./SampleFont.otf') format('opentype'),
10
+ url('./SampleFont.svg#webfont') format('svg'),
11
+ local('☺');
12
+ font-weight: normal;
13
+ font-style: normal;
14
+ }
@@ -0,0 +1,3 @@
1
+ .font {
2
+ font-weight: bold;
3
+ }
File without changes
@@ -0,0 +1 @@
1
+ A super secret license
@@ -0,0 +1,102 @@
1
+ ENV['RACK_ENV'] = 'test'
2
+ require 'rubygems'
3
+ require 'simplecov'
4
+ SimpleCov.start
5
+ require 'bundler/setup'
6
+ require 'rack-fontserve'
7
+
8
+ require 'test/unit'
9
+ require 'shoulda'
10
+ require 'rack/test'
11
+
12
+ Rack::Fontserve.set :fonts_path, File.join(File.dirname(__FILE__), 'fixtures/fonts')
13
+
14
+ class Test::Unit::TestCase
15
+ include Rack::Test::Methods
16
+
17
+ def app
18
+ Rack::Fontserve
19
+ end
20
+
21
+ # Shortcut for making requests
22
+ def self.request(http_method, path)
23
+ raise ArgumentError, "Must be get, post, put or delete" unless %w(get post put delete).include?(http_method)
24
+
25
+ context "#{http_method} '#{path}'" do
26
+ setup { self.send(http_method, path) }
27
+ yield
28
+ end
29
+ end
30
+
31
+ def self.get(path, &blk)
32
+ request('get', path, &blk)
33
+ end
34
+
35
+ def self.post(path, &blk)
36
+ request('post', path, &blk)
37
+ end
38
+
39
+ def self.should_respond_with(status)
40
+ should("respond with #{status}") { assert_equal status, last_response.status }
41
+ end
42
+
43
+ def self.should_set_content_type_for(format)
44
+ formats = {'ttf' => 'font/truetype',
45
+ 'otf' => 'font/opentype',
46
+ 'woff' => 'font/woff',
47
+ 'eot' => 'application/vnd.ms-fontobject',
48
+ 'svg' => 'image/svg+xml',
49
+ 'css' => 'text/css'
50
+ }
51
+ should_set_header 'Content-Type', formats[format.to_s]
52
+ end
53
+
54
+ def self.should_set_header(name, value)
55
+ should "set header '#{name}' to '#{value}'" do
56
+ assert_equal value, last_response.headers[name]
57
+ end
58
+ end
59
+
60
+ def self.should_set_caching
61
+ should_set_header 'Cache-Control', 'public, max-age=31536000'
62
+
63
+ should "have set 'Expires' to '#{(Time.now + Rack::Fontserve.max_age).httpdate}'" do
64
+ assert_equal((Time.now + Rack::Fontserve.max_age).httpdate, last_response.headers['Expires'])
65
+ end
66
+
67
+ should "have set 'Access-Control-Allow-Origin' to '*'" do
68
+ assert_equal '*', last_response.headers['Access-Control-Allow-Origin']
69
+ end
70
+ end
71
+
72
+ def self.should_not_set_caching
73
+ should "not have set 'Cache-Control' header" do
74
+ assert_nil last_response.headers['Cache-Control']
75
+ end
76
+
77
+ should "not have set 'Expires' header" do
78
+ assert_nil last_response.headers['Expires']
79
+ end
80
+
81
+ should "not have set 'Access-Control-Allow-Originl' header" do
82
+ assert_nil last_response.headers['Access-Control-Allow-Origin']
83
+ end
84
+ end
85
+
86
+ def self.should_have_rendered_css(filename)
87
+ should "have rendered the body as expected in fixtures/#{filename}.css" do
88
+ expected_css = File.read(File.join(File.dirname(__FILE__), 'fixtures', "#{filename}.css"))
89
+
90
+ unless expected_css == last_response.body
91
+ puts last_response.body
92
+ begin
93
+ File.open("tmp.css", "w+") { |f| f.print last_response.body }
94
+ diff = `diff #{File.join(File.dirname(__FILE__), 'fixtures', "#{filename}.css")} tmp.css`
95
+ assert false, "Diff: #{diff}"
96
+ ensure
97
+ File.unlink('tmp.css')
98
+ end
99
+ end
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,95 @@
1
+ require 'helper'
2
+
3
+ class FontTest < Test::Unit::TestCase
4
+ should "have a fonts path set" do
5
+ assert Rack::Fontserve.fonts_path =~ /fixtures\/fonts$/
6
+ end
7
+
8
+ context "Rack::Fontserve::Font.all" do
9
+ setup { @all = Rack::Fontserve::Font.all }
10
+ should("return 3 fonts") { assert_equal 5, @all.count }
11
+ should("have font 'SampleFont'") { assert @all.map(&:name).include?('SampleFont') }
12
+ should("have font 'AnotherFont'") { assert @all.map(&:name).include?('AnotherFont') }
13
+ should("have font 'SimpleFont'") { assert @all.map(&:name).include?('SimpleFont') }
14
+ should("have font 'CustomCSS'") { assert @all.map(&:name).include?('CustomCSS') }
15
+ should("have font 'LicenseFont'") { assert @all.map(&:name).include?('LicenseFont') }
16
+ end
17
+
18
+ context "the font 'AnotherFont'" do
19
+ setup { @font = Rack::Fontserve::Font.new('AnotherFont') }
20
+ should("have 4 formats") { assert_equal 4, @font.formats.count }
21
+ should("have formats otf, svg, ttf, woff") { assert_equal %w(otf svg ttf woff), @font.formats }
22
+
23
+ should "return fonts_path/AnotherFont/AnotherFont.otf for format_path('otf')" do
24
+ assert_equal File.join(Rack::Fontserve.fonts_path, 'AnotherFont/AnotherFont.otf'), @font.format_path('otf')
25
+ end
26
+
27
+ should "Rack::Fontserve::InvalidFontError for format_path('eot')" do
28
+ assert_raise Rack::Fontserve::InvalidFormatError do
29
+ @font.format_path('eot')
30
+ end
31
+ end
32
+
33
+ should "not have custom_css?" do
34
+ assert !@font.custom_css?
35
+ end
36
+ should "have nil for custom_css" do
37
+ assert_nil @font.custom_css
38
+ end
39
+
40
+ should "not have license?" do
41
+ assert !@font.license?
42
+ end
43
+ should "have nil for license" do
44
+ assert_nil @font.license
45
+ end
46
+ end
47
+
48
+ context "the font 'CustomCSS'" do
49
+ setup { @font = Rack::Fontserve::Font.new('CustomCSS') }
50
+ should("have 1 format") { assert_equal 1, @font.formats.count }
51
+ should("have format ttf") { assert_equal 'ttf', @font.formats.first }
52
+
53
+ should "have custom css" do
54
+ assert @font.custom_css?
55
+ end
56
+ should "return custom_css" do
57
+ assert_equal @font.custom_css, File.read(File.join(File.dirname(__FILE__), 'fixtures', "CustomCSS.css"))
58
+ end
59
+
60
+ should "not have license?" do
61
+ assert !@font.license?
62
+ end
63
+ should "have nil for license" do
64
+ assert_nil @font.license
65
+ end
66
+
67
+ should "return fonts_path/CustomCSS/CustomCSS.ttf for format_path('ttf')" do
68
+ assert_equal File.join(Rack::Fontserve.fonts_path, 'CustomCSS/CustomCSS.ttf'), @font.format_path('ttf')
69
+ end
70
+ end
71
+
72
+ should "raise Rack::Fontserve::InvalidFontError when trying to load 'InvalidFont'" do
73
+ assert_raise Rack::Fontserve::InvalidFontError do
74
+ Rack::Fontserve::Font.new('InvalidFont')
75
+ end
76
+ end
77
+
78
+ should "raise Rack::Fontserve::InvalidFontError when trying to load 'MissingFont'" do
79
+ assert_raise Rack::Fontserve::InvalidFontError do
80
+ Rack::Fontserve::Font.new('MissingFont')
81
+ end
82
+ end
83
+
84
+ should "raise Rack::Fontserve::InvalidFontError when trying to load 'UnexistingFont'" do
85
+ assert_raise Rack::Fontserve::InvalidFontError do
86
+ Rack::Fontserve::Font.new('UnexistingFont')
87
+ end
88
+ end
89
+
90
+ should "raise Rack::Fontserve::InvalidFontError when trying to load 'FileFont'" do
91
+ assert_raise Rack::Fontserve::InvalidFontError do
92
+ Rack::Fontserve::Font.new('FileFont')
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,63 @@
1
+ require 'helper'
2
+
3
+ class WebTest < Test::Unit::TestCase
4
+
5
+ get '/' do
6
+ should_respond_with 404
7
+ should("render an empty string") { assert_equal '', last_response.body }
8
+ end
9
+
10
+ get '/SampleFont.css' do
11
+ should_respond_with 200
12
+ should_set_header 'Content-Type', 'text/css;charset=utf-8'
13
+ should_set_caching
14
+ should_have_rendered_css 'SampleFont'
15
+ end
16
+
17
+ get '/CustomCSS.css' do
18
+ should_respond_with 200
19
+ should_set_header 'Content-Type', 'text/css;charset=utf-8'
20
+ should_set_caching
21
+ should_have_rendered_css 'CustomCSS'
22
+ end
23
+
24
+ get '/LicenseFont.css' do
25
+ should_respond_with 200
26
+ should_set_header 'Content-Type', 'text/css;charset=utf-8'
27
+ should_set_caching
28
+ should_have_rendered_css 'LicenseFont'
29
+ end
30
+
31
+ %w(eot otf svg ttf woff).each do |format|
32
+ get "/SampleFont.#{format}" do
33
+ should_respond_with 200
34
+ should_set_content_type_for format
35
+ should_set_caching
36
+ end
37
+ end
38
+
39
+ %w(otf svg ttf woff).each do |format|
40
+ get "/AnotherFont.#{format}" do
41
+ should_respond_with 200
42
+ should_set_content_type_for format
43
+ should_set_caching
44
+ end
45
+ end
46
+
47
+ get '/AnotherFont.eot' do
48
+ should_respond_with 404
49
+ should_not_set_caching
50
+ end
51
+
52
+ %w(eot otf svg woff).each do |format|
53
+ get "/SimpleFont.#{format}" do
54
+ should_respond_with 404
55
+ should_not_set_caching
56
+ end
57
+ end
58
+
59
+ get '/demo' do
60
+ should_respond_with 200
61
+ should_set_header 'Content-Type', 'text/html;charset=utf-8'
62
+ end
63
+ end
metadata ADDED
@@ -0,0 +1,155 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rack-fontserve
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 0.1.0
6
+ platform: ruby
7
+ authors:
8
+ - Christoph Olszowka
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2011-03-28 00:00:00 +02:00
14
+ default_executable:
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: sinatra
18
+ prerelease: false
19
+ requirement: &id001 !ruby/object:Gem::Requirement
20
+ none: false
21
+ requirements:
22
+ - - ~>
23
+ - !ruby/object:Gem::Version
24
+ version: 1.2.1
25
+ type: :runtime
26
+ version_requirements: *id001
27
+ - !ruby/object:Gem::Dependency
28
+ name: rack-test
29
+ prerelease: false
30
+ requirement: &id002 !ruby/object:Gem::Requirement
31
+ none: false
32
+ requirements:
33
+ - - ~>
34
+ - !ruby/object:Gem::Version
35
+ version: 0.5.7
36
+ type: :development
37
+ version_requirements: *id002
38
+ - !ruby/object:Gem::Dependency
39
+ name: shoulda
40
+ prerelease: false
41
+ requirement: &id003 !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ~>
45
+ - !ruby/object:Gem::Version
46
+ version: 2.11.3
47
+ type: :development
48
+ version_requirements: *id003
49
+ - !ruby/object:Gem::Dependency
50
+ name: simplecov
51
+ prerelease: false
52
+ requirement: &id004 !ruby/object:Gem::Requirement
53
+ none: false
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ version: 0.4.0
58
+ type: :development
59
+ version_requirements: *id004
60
+ description: Sinatra app for serving web fonts easily with proper caching and access-control headers
61
+ email:
62
+ - christoph (at) olszowka de
63
+ executables: []
64
+
65
+ extensions: []
66
+
67
+ extra_rdoc_files: []
68
+
69
+ files:
70
+ - .gitignore
71
+ - Gemfile
72
+ - LICENSE
73
+ - README.rdoc
74
+ - Rakefile
75
+ - lib/rack-fontserve.rb
76
+ - lib/rack-fontserve/font.rb
77
+ - lib/rack-fontserve/version.rb
78
+ - lib/rack-fontserve/views/demo.erb
79
+ - lib/rack-fontserve/views/stylesheet.erb
80
+ - rack-fontserve.gemspec
81
+ - test/fixtures/CustomCSS.css
82
+ - test/fixtures/LicenseFont.css
83
+ - test/fixtures/SampleFont.css
84
+ - test/fixtures/fonts/AnotherFont/AnotherFont.otf
85
+ - test/fixtures/fonts/AnotherFont/AnotherFont.svg
86
+ - test/fixtures/fonts/AnotherFont/AnotherFont.ttf
87
+ - test/fixtures/fonts/AnotherFont/AnotherFont.woff
88
+ - test/fixtures/fonts/CustomCSS/CustomCSS.css
89
+ - test/fixtures/fonts/CustomCSS/CustomCSS.ttf
90
+ - test/fixtures/fonts/FileFont
91
+ - test/fixtures/fonts/InvalidFont/WeirdNaming.otf
92
+ - test/fixtures/fonts/LicenseFont/LICENSE
93
+ - test/fixtures/fonts/LicenseFont/LicenseFont.eot
94
+ - test/fixtures/fonts/LicenseFont/LicenseFont.ttf
95
+ - test/fixtures/fonts/SampleFont/SampleFont.eot
96
+ - test/fixtures/fonts/SampleFont/SampleFont.otf
97
+ - test/fixtures/fonts/SampleFont/SampleFont.svg
98
+ - test/fixtures/fonts/SampleFont/SampleFont.ttf
99
+ - test/fixtures/fonts/SampleFont/SampleFont.woff
100
+ - test/fixtures/fonts/SimpleFont/SimpleFont.ttf
101
+ - test/helper.rb
102
+ - test/test_font.rb
103
+ - test/test_web.rb
104
+ has_rdoc: true
105
+ homepage: https://github.com/colszowka/rack-fontserve
106
+ licenses: []
107
+
108
+ post_install_message:
109
+ rdoc_options: []
110
+
111
+ require_paths:
112
+ - lib
113
+ required_ruby_version: !ruby/object:Gem::Requirement
114
+ none: false
115
+ requirements:
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: "0"
119
+ required_rubygems_version: !ruby/object:Gem::Requirement
120
+ none: false
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: "0"
125
+ requirements: []
126
+
127
+ rubyforge_project: rack-fontserve
128
+ rubygems_version: 1.5.3
129
+ signing_key:
130
+ specification_version: 3
131
+ summary: Sinatra app for serving web fonts easily with proper caching and access-control headers
132
+ test_files:
133
+ - test/fixtures/CustomCSS.css
134
+ - test/fixtures/LicenseFont.css
135
+ - test/fixtures/SampleFont.css
136
+ - test/fixtures/fonts/AnotherFont/AnotherFont.otf
137
+ - test/fixtures/fonts/AnotherFont/AnotherFont.svg
138
+ - test/fixtures/fonts/AnotherFont/AnotherFont.ttf
139
+ - test/fixtures/fonts/AnotherFont/AnotherFont.woff
140
+ - test/fixtures/fonts/CustomCSS/CustomCSS.css
141
+ - test/fixtures/fonts/CustomCSS/CustomCSS.ttf
142
+ - test/fixtures/fonts/FileFont
143
+ - test/fixtures/fonts/InvalidFont/WeirdNaming.otf
144
+ - test/fixtures/fonts/LicenseFont/LICENSE
145
+ - test/fixtures/fonts/LicenseFont/LicenseFont.eot
146
+ - test/fixtures/fonts/LicenseFont/LicenseFont.ttf
147
+ - test/fixtures/fonts/SampleFont/SampleFont.eot
148
+ - test/fixtures/fonts/SampleFont/SampleFont.otf
149
+ - test/fixtures/fonts/SampleFont/SampleFont.svg
150
+ - test/fixtures/fonts/SampleFont/SampleFont.ttf
151
+ - test/fixtures/fonts/SampleFont/SampleFont.woff
152
+ - test/fixtures/fonts/SimpleFont/SimpleFont.ttf
153
+ - test/helper.rb
154
+ - test/test_font.rb
155
+ - test/test_web.rb