sinatra-static-assets 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. data/LICENSE +22 -0
  2. data/README.markdown +202 -0
  3. data/VERSION.yml +4 -0
  4. data/examples/rconfig.ru +13 -0
  5. data/examples/rsummer/config.ru +8 -0
  6. data/examples/rsummer/public/images/tatry1.jpg +0 -0
  7. data/examples/rsummer/public/javascripts/mapp.js +1 -0
  8. data/examples/rsummer/public/stylesheets/mapp.css +14 -0
  9. data/examples/rsummer/public/stylesheets/src/background.png +0 -0
  10. data/examples/rsummer/summer.rb +21 -0
  11. data/examples/rsummer/tmp/always_restart.txt +0 -0
  12. data/examples/rsummer/views/index.erb +3 -0
  13. data/examples/rsummer/views/layout.erb +17 -0
  14. data/examples/rwinter/config.ru +8 -0
  15. data/examples/rwinter/public/images/tatry2.jpg +0 -0
  16. data/examples/rwinter/public/javascripts/mapp.js +1 -0
  17. data/examples/rwinter/public/stylesheets/mapp.css +14 -0
  18. data/examples/rwinter/public/stylesheets/src/background.png +0 -0
  19. data/examples/rwinter/tmp/always_restart.txt +0 -0
  20. data/examples/rwinter/views/index.erb +3 -0
  21. data/examples/rwinter/views/layout.erb +17 -0
  22. data/examples/rwinter/winter.rb +21 -0
  23. data/examples/summer/config.ru +4 -0
  24. data/examples/summer/public/images/tatry1.jpg +0 -0
  25. data/examples/summer/public/javascripts/app.js +1 -0
  26. data/examples/summer/public/stylesheets/app.css +14 -0
  27. data/examples/summer/public/stylesheets/src/bronzed_olive.png +0 -0
  28. data/examples/summer/summer.rb +16 -0
  29. data/examples/summer/tmp/always_restart.txt +0 -0
  30. data/examples/summer/views/index.erb +6 -0
  31. data/examples/summer/views/layout.erb +16 -0
  32. data/examples/summer/views/topr.erb +5 -0
  33. data/examples/winter/config.ru +4 -0
  34. data/examples/winter/public/images/tatry2.jpg +0 -0
  35. data/examples/winter/public/javascripts/app.js +1 -0
  36. data/examples/winter/public/stylesheets/app.css +18 -0
  37. data/examples/winter/public/stylesheets/src/skating.png +0 -0
  38. data/examples/winter/tmp/always_restart.txt +0 -0
  39. data/examples/winter/views/index.erb +5 -0
  40. data/examples/winter/views/layout.erb +16 -0
  41. data/examples/winter/winter.rb +12 -0
  42. data/lib/sinatra/static_assets.rb +69 -0
  43. data/test/sinatra_app.rb +45 -0
  44. data/test/sinatra_static_assets_test.rb +57 -0
  45. metadata +148 -0
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ (The MIT License)
2
+
3
+ Copyright (c) 2009 Wlodek Bzyl
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ 'Software'), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
19
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
20
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
21
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
22
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.markdown ADDED
@@ -0,0 +1,202 @@
1
+ # Sinatra Extension: StaticAssets
2
+
3
+ Gem *sinatra-static-assets* implements the following helpers methods:
4
+
5
+ * `image_tag`
6
+ * `stylesheet_link_tag`
7
+ * `javascript_script_tag`
8
+ * `link_to`
9
+
10
+ To install it, run:
11
+
12
+ sudo gem install sinatra-static-assets -s http://gemcutter.com
13
+
14
+ All these methods are simple wrappers around the `url_for` method
15
+ from the [sinatra-url-for](http://github.com/emk/sinatra-url-for/) gem.
16
+
17
+ ## When will you need it?
18
+
19
+ Whenever you use the
20
+ [Passenger module for Apache2](http://www.modrails.com/documentation/Users%20guide%20Apache.html#deploying_rack_to_sub_uri)
21
+ or use `Rack::URLMap` to dispatch an application to
22
+ sub URI.
23
+
24
+ Example: Suppose that we already have a virtual host `hitch.local`
25
+ and two Sinatra applications that live in
26
+ `/home/me/www/summer` and `/home/me/www/winter`
27
+ directories, respectively.
28
+ We want our Sinatra applications to be accessible from
29
+ the following sub URI:
30
+
31
+ http://hitch.local/summer
32
+
33
+ and
34
+
35
+ http://hitch.local/winter
36
+
37
+ To configure Apache2 and Passenger to serve our applications
38
+ we need to create a new configuration file with the following content:
39
+
40
+ <VirtualHost *:80>
41
+ ServerName hitch.local
42
+ DocumentRoot /srv/www/hitch.local
43
+
44
+ RackBaseURI /summer
45
+ RackBaseURI /winter
46
+ </VirtualHost>
47
+
48
+ and a link to the applications directories in `/srv/www/hitch.local`:
49
+
50
+ ln -s /home/me/www/summer/public /srv/www/hitch.local/summer
51
+ ln -s /home/me/www/winter/public /srv/www/hitch.local/winter
52
+
53
+ After restarting an Apache2 server and visiting, for example, the first
54
+ application at `http://hitch.local/summer` we see that links to
55
+ images, stylesheets and javascripts are broken.
56
+
57
+ The hitch here is that in Sinatra applications we usually refer to
58
+ images/stylesheets/javascripts with absolute URI:
59
+
60
+ /images/tatry1.jpg /stylesheets/app.css /javascripts/app.js
61
+
62
+ That setup **works** whenever we are running applications locally.
63
+ The absolute URI above tells a browser to request images
64
+ (stylesheets and javascripts) from:
65
+
66
+ http://localhost:4567/images/tatry1.jpg
67
+
68
+ which in turn, tells a server to send a file:
69
+
70
+ /home/me/www/summer/public/images/tatry1.jpg
71
+
72
+ The `public` directory is the default directory where static files
73
+ should be served from.
74
+ So, the `/images/tatry1.jpg` picture will be there and will be served
75
+ unless we had changed that default directory.
76
+
77
+ But these absolute URIs do not work when, for example,
78
+ the *summer* application is dispatched to `/summer` sub URI.
79
+ As a result the images are at:
80
+
81
+ http://hitch.local/summer/images/tatry1.jpg
82
+
83
+ but we request them from:
84
+
85
+ http://hitch.local/images/tatry1.jpg
86
+
87
+ And this **does not work** because there is no application
88
+ dispatched to *images* sub URI.
89
+
90
+ The recommended way to deal with an absolute URI
91
+ is to use a helper method that automatically converts
92
+ `/images/tatry1.jpg` to `/summer/images/tatry1.jpg`
93
+ for application dispatched to `/summer` sub URI.
94
+
95
+ In the above example you can simply remove the `<img>`
96
+ HTML tag and replace it with a Ruby inline code like this:
97
+
98
+ <%= image_tag("/images/tatry1.jpg", :alt => "Błyszcz, 2159 m") %>
99
+
100
+ See also, [How to fix broken images/CSS/JavaScript URIs in sub-URI
101
+ deployments](http://www.modrails.com/documentation/Users%20guide%20Apache.html#sub_uri_deployment_uri_fix)
102
+
103
+ ## Usage examples
104
+
105
+ In HTML `<link>` and `<img>` tags have no end tag.
106
+ In XHTML, on the contrary, these tags must be properly closed.
107
+
108
+ We can choose the appropriate behaviour with *closed* option:
109
+
110
+ image_tag "/images/tatry1.jpg", :alt => "Błyszcz, 2159 m", :closed => true
111
+
112
+ The default value of *closed* option is `false`.
113
+
114
+ stylesheet_link_tag "/stylesheets/screen.css", "/stylesheets/summer.css", :media => "projection"
115
+ javascript_script_tag "/javascripts/jquery.js", "/javascripts/summer.js", :charset => "iso-8859-2"
116
+ link_to "Tatry Mountains Rescue Team", "/topr"
117
+
118
+ In order to use include the following in a Sinatra application:
119
+
120
+ gem 'sinatra-static-assets'
121
+ require 'sinatra/static_assets'
122
+
123
+ Or, if subclassing `Sinatra::Base`, include helpers manually:
124
+
125
+ gem 'emk-sinatra-url-for'
126
+ require 'sinatra/url_for'
127
+
128
+ gem 'sinatra-static-assets'
129
+ require 'sinatra/static_assets'
130
+
131
+ class Summer < Sinatra::Base
132
+ helpers Sinatra::UrlForHelper
133
+ helpers Sinatra::StaticAssets
134
+ # ...
135
+ end
136
+
137
+ ## Dispatching reusable Sinatra applications
138
+
139
+ With the latest version of Sinatra it is possible to build
140
+ reusable Sinatra applications. This means that multiple Sinatra applications
141
+ can be run in isolation and co-exist peacefully with other Rack
142
+ based applications. Subclassing `Sinatra::Base` creates such a
143
+ reusable application.
144
+
145
+ The `example` directory contains two reusable Sinatra applications:
146
+ *rsummer*, *rwinter* and a rackup file `rconfig.ru` which
147
+ dispatches these applications to `/summer` and `/winter` sub URI:
148
+
149
+ $LOAD_PATH.unshift('rsummer')
150
+ require 'summer'
151
+
152
+ $LOAD_PATH.unshift('rwinter')
153
+ require 'winter'
154
+
155
+ map '/summer' do
156
+ run Sinatra::Summer.new
157
+ end
158
+
159
+ map '/winter' do
160
+ run Sinatra::Winter.new
161
+ end
162
+
163
+ Run `rconfig.ru` file with:
164
+
165
+ rackup -p 3000 rconfig.ru
166
+
167
+ This file could **also** be used to deploy to virtual host's root with
168
+ Passenger.
169
+
170
+ To this end, create an Apache2 configuration file with the following
171
+ content:
172
+
173
+ <VirtualHost *:80>
174
+ ServerName hitch.local
175
+ DocumentRoot /srv/www/hitch.local
176
+ </VirtualHost>
177
+
178
+ Next, create directories required by Passenger:
179
+
180
+ mkdir /srv/www/hitch.local/{public,tmp}
181
+
182
+ and, finally, copy `config.ru` into `/srv/www/hitch.local` and
183
+ update `LOAD_PATH` in the copied file.
184
+
185
+ With everything in place, after restarting Apache2,
186
+ the applications are accessible from the
187
+
188
+ http://hitch.local/summer
189
+
190
+ and
191
+
192
+ http://hitch.local/winter
193
+
194
+ respectively.
195
+
196
+ ## Miscellaneous stuff
197
+
198
+ 1\. The `examples` directory contains *summer* and *winter* applications.
199
+
200
+ 2\. In order to create a virual host add the following to */etc/hosts/*:
201
+
202
+ 127.0.0.1 localhost.localdomain localhost hitch.local
data/VERSION.yml ADDED
@@ -0,0 +1,4 @@
1
+ ---
2
+ :major: 0
3
+ :minor: 4
4
+ :patch: 0
@@ -0,0 +1,13 @@
1
+ $LOAD_PATH.unshift('rsummer')
2
+ require 'summer'
3
+
4
+ $LOAD_PATH.unshift('rwinter')
5
+ require 'winter'
6
+
7
+ map '/summer' do
8
+ run Sinatra::Summer.new
9
+ end
10
+
11
+ map '/winter' do
12
+ run Sinatra::Winter.new
13
+ end
@@ -0,0 +1,8 @@
1
+ require 'summer'
2
+
3
+ use Rack::ShowExceptions
4
+ use Rack::Lint
5
+
6
+ map '/' do
7
+ run Sinatra::Summer.new
8
+ end
@@ -0,0 +1 @@
1
+ /* mapp1 */
@@ -0,0 +1,14 @@
1
+ html {
2
+ margin: 0;
3
+ padding: 0;
4
+ background: #ABA418 url(src/background.png);
5
+ }
6
+
7
+ body {
8
+ width: 600px;
9
+ margin: 1em auto;
10
+ padding: 1em 2em;
11
+ border: black solid 1px;
12
+ background-color: #D1C704;
13
+ font: normal 14px/1.6 Arial, Helvetica, sans-serif;
14
+ }
@@ -0,0 +1,21 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require 'sinatra/base'
4
+
5
+ gem 'sinatra-static-assets'
6
+ require 'sinatra/static_assets'
7
+
8
+ module Sinatra
9
+ class Summer < Sinatra::Base
10
+ helpers Sinatra::UrlForHelper
11
+ helpers Sinatra::StaticAssets
12
+
13
+ set :app_file, __FILE__
14
+ set :static, true
15
+
16
+ get '/?' do
17
+ @title = "Tatra Mountains, Błyszcz (2159 m)"
18
+ erb :index
19
+ end
20
+ end
21
+ end
File without changes
@@ -0,0 +1,3 @@
1
+ <h2><%= @title %></h2>
2
+
3
+ <p><%= image_tag "/images/tatry1.jpg", :alt => @title, :title => @title %></p>
@@ -0,0 +1,17 @@
1
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" http://www.w3.org/TR/html4/strict.dtd">
2
+ <html>
3
+ <head>
4
+ <meta http-equiv="content-type" content="text/html; charset=utf-8">
5
+
6
+ <%= stylesheet_link_tag "/stylesheets/mapp.css" %>
7
+ <%= javascript_script_tag "/javascripts/mapp.js" %>
8
+
9
+ <title><%= @title %></title>
10
+ </head>
11
+
12
+ <body>
13
+
14
+ <%= yield %>
15
+
16
+ </body>
17
+ </html>
@@ -0,0 +1,8 @@
1
+ require 'winter'
2
+
3
+ use Rack::ShowExceptions
4
+ use Rack::Lint
5
+
6
+ map '/' do
7
+ run Sinatra::Winter.new
8
+ end
@@ -0,0 +1 @@
1
+ /* mapp.js */
@@ -0,0 +1,14 @@
1
+ html {
2
+ margin: 0;
3
+ padding: 0;
4
+ background: #ABA418 url(src/background.png);
5
+ }
6
+
7
+ body {
8
+ width: 600px;
9
+ margin: 1em auto;
10
+ padding: 1em 2em;
11
+ border: black solid 1px;
12
+ background-color: #D8E8FF;
13
+ font: normal 14px/1.6 Arial, Helvetica, sans-serif;
14
+ }
File without changes
@@ -0,0 +1,3 @@
1
+ <h2><%= @title %></h2>
2
+
3
+ <p><%= image_tag "/images/tatry2.jpg", :alt => @title, :title => @title %></p>
@@ -0,0 +1,17 @@
1
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" http://www.w3.org/TR/html4/strict.dtd">
2
+ <html>
3
+ <head>
4
+ <meta http-equiv="content-type" content="text/html; charset=utf-8">
5
+
6
+ <%= stylesheet_link_tag "/stylesheets/mapp.css" %>
7
+ <%= javascript_script_tag "/javascripts/mapp.js" %>
8
+
9
+ <title><%= @title %></title>
10
+ </head>
11
+
12
+ <body>
13
+
14
+ <%= yield %>
15
+
16
+ </body>
17
+ </html>
@@ -0,0 +1,21 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require 'sinatra/base'
4
+
5
+ gem 'sinatra-static-assets'
6
+ require 'sinatra/static_assets'
7
+
8
+ module Sinatra
9
+ class Winter < Sinatra::Base
10
+ helpers Sinatra::UrlForHelper
11
+ helpers Sinatra::StaticAssets
12
+
13
+ set :app_file, __FILE__
14
+ set :static, true
15
+
16
+ get '/?' do
17
+ @title = "Tatra Mountains, Dolina Gąsienicowa (1500 m)"
18
+ erb :index
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,4 @@
1
+ require 'summer'
2
+
3
+ use Rack::ShowExceptions
4
+ run Sinatra::Application
@@ -0,0 +1 @@
1
+ /* summer: app.js */
@@ -0,0 +1,14 @@
1
+ html {
2
+ margin: 0;
3
+ padding: 0;
4
+ background: #ABA418 url(src/bronzed_olive.png);
5
+ }
6
+
7
+ body {
8
+ width: 600px;
9
+ margin: 1em auto;
10
+ padding: 1em 2em;
11
+ border: black solid 1px;
12
+ background-color: #D1C704;
13
+ font: normal 14px/1.6 Arial, Helvetica, sans-serif;
14
+ }
@@ -0,0 +1,16 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require 'sinatra'
4
+
5
+ gem 'sinatra-static-assets'
6
+ require 'sinatra/static_assets'
7
+
8
+ get "/?" do
9
+ @title = "Tatra Mountains, Błyszcz (2159 m)"
10
+ erb :index
11
+ end
12
+
13
+ get "/:page" do
14
+ @title = "#{params[:page]}"
15
+ erb :"#{params[:page]}"
16
+ end
File without changes
@@ -0,0 +1,6 @@
1
+ <h2><%= @title %></h2>
2
+
3
+ <p><%= image_tag "/images/tatry1.jpg", :closed => true, :alt => @title, :title => @title %></p>
4
+
5
+ <p><a href="/winter">Tatra Mountains in Winter</a></p>
6
+ <p><%= link_to "Tatry Mountains Rescue Team", "/topr" %></p>
@@ -0,0 +1,16 @@
1
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" http://www.w3.org/TR/html4/strict.dtd">
2
+ <html>
3
+ <head>
4
+ <meta http-equiv="content-type" content="text/html; charset=utf-8">
5
+ <%= stylesheet_link_tag "/stylesheets/app.css" %>
6
+ <%= javascript_script_tag "/javascripts/app.js" %>
7
+
8
+ <title><%= @title %></title>
9
+ </head>
10
+
11
+ <body>
12
+
13
+ <%= yield %>
14
+
15
+ </body>
16
+ </html>
@@ -0,0 +1,5 @@
1
+ <h3>Tatry Mountains Rescue Team</h3>
2
+
3
+ <p>The home page: <a href="http://www.topr.pl/">TOPR</a></a>
4
+
5
+ <p>The emergency telephone: +48 601 100 300</p>
@@ -0,0 +1,4 @@
1
+ require 'winter'
2
+
3
+ use Rack::ShowExceptions
4
+ run Sinatra::Application
@@ -0,0 +1 @@
1
+ /* app1.js */
@@ -0,0 +1,18 @@
1
+ /*
2
+ Theme for app2: http://www.colourlovers.com/palette/81363/rainy
3
+ */
4
+
5
+ html {
6
+ margin: 0;
7
+ padding: 0;
8
+ background: #659DF1 url(src/skating.png);
9
+ }
10
+
11
+ body {
12
+ width: 600px;
13
+ margin: 1em auto;
14
+ padding: 1em 2em;
15
+ border: black solid 1px;
16
+ background-color: #D8E8FF;
17
+ font: normal 14px/1.6 Arial, Helvetica, sans-serif;
18
+ }
File without changes
@@ -0,0 +1,5 @@
1
+ <h2><%= @title %></h2>
2
+
3
+ <p><%= image_tag "/images/tatry2.jpg", :alt => @title, :title => @title %></p>
4
+
5
+ <p><a href="/summer">Tatra Mountains in Summer</a></p>
@@ -0,0 +1,16 @@
1
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" http://www.w3.org/TR/html4/strict.dtd">
2
+ <html>
3
+ <head>
4
+ <meta http-equiv="content-type" content="text/html; charset=utf-8">
5
+ <%= stylesheet_link_tag "/stylesheets/app.css" %>
6
+ <%= javascript_script_tag "/javascripts/app.js" %>
7
+
8
+ <title><%= @title %></title>
9
+ </head>
10
+
11
+ <body>
12
+
13
+ <%= yield %>
14
+
15
+ </body>
16
+ </html>
@@ -0,0 +1,12 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require 'rubygems'
4
+ require 'sinatra'
5
+
6
+ gem 'sinatra-static-assets'
7
+ require 'sinatra/static_assets'
8
+
9
+ get "/?" do
10
+ @title = "Tatra Mountains, Dolina Gąsienicowa (1500 m)"
11
+ erb :index
12
+ end
@@ -0,0 +1,69 @@
1
+ require 'sinatra/base'
2
+ require 'sinatra/url_for'
3
+
4
+ module Sinatra
5
+ module StaticAssets
6
+ # In HTML <link> and <img> tags have no end tag.
7
+ # In XHTML, on the contrary, these tags must be properly closed.
8
+ #
9
+ # We can choose the appropriate behaviour with +closed+ option:
10
+ #
11
+ # image_tag "/images/foo.png", :alt => "Foo itself", :closed => true
12
+ #
13
+ # The default value of +closed+ option is +false+.
14
+ #
15
+ def image_tag(source, options = {})
16
+ closed = options.delete(:closed)
17
+ options[:src] = url_for(source)
18
+ tag("img", options, closed)
19
+ end
20
+
21
+ def stylesheet_link_tag(*sources)
22
+ list, options = extract_options(sources)
23
+ closed = options.delete(:closed)
24
+ list.collect { |source| stylesheet_tag(source, options, closed) }.join("\n")
25
+ end
26
+
27
+ def javascript_script_tag(*sources)
28
+ list, options = extract_options(sources)
29
+ list.collect { |source| javascript_tag(source, options) }.join("\n")
30
+ end
31
+
32
+ def link_to(desc, url)
33
+ "<a href='#{url_for(url)}'>#{desc}</a>"
34
+ end
35
+
36
+ private
37
+
38
+ def tag(name, options = {}, closed = false)
39
+ "<#{name}#{tag_options(options) if options}#{closed ? " />" : ">"}"
40
+ end
41
+
42
+ def tag_options(options)
43
+ unless options.empty?
44
+ attrs = []
45
+ attrs = options.map { |key, value| %(#{key}="#{value}") }
46
+ " #{attrs.sort * ' '}" unless attrs.empty?
47
+ end
48
+ end
49
+
50
+ def stylesheet_tag(source, options, closed = false)
51
+ tag("link", { :type => "text/css",
52
+ :charset => "utf-8", :media => "screen", :rel => "stylesheet",
53
+ :href => url_for(source) }.merge(options), closed)
54
+ end
55
+
56
+ def javascript_tag(source, options)
57
+ tag("script", { :type => "text/javascript", :charset => "utf-8",
58
+ :src => url_for(source) }.merge(options), false) + "</script>"
59
+ end
60
+
61
+ def extract_options(a)
62
+ opts = a.last.is_a?(::Hash) ? a.pop : {}
63
+ [a, opts]
64
+ end
65
+
66
+ end
67
+
68
+ helpers StaticAssets
69
+ end
@@ -0,0 +1,45 @@
1
+ path = File.expand_path("../lib" + File.dirname(__FILE__))
2
+ $:.unshift(path) unless $:.include?(path)
3
+
4
+ require 'rubygems'
5
+
6
+ require 'sinatra'
7
+ require 'sinatra/url_for'
8
+ require 'sinatra/static_assets'
9
+
10
+ get "/url_for" do
11
+ content_type "text/plain"
12
+ <<"EOD"
13
+ #{url_for("/")}
14
+ #{url_for("/foo")}
15
+ #{url_for("/foo", :full)}
16
+ EOD
17
+ end
18
+
19
+ get "/image_tag" do
20
+ content_type "text/plain"
21
+ <<"EOD"
22
+ #{image_tag("/images/foo.jpg", :alt => "[foo image]")}
23
+ EOD
24
+ end
25
+
26
+ get "/stylesheet_link_tag" do
27
+ content_type "text/plain"
28
+ <<"EOD"
29
+ #{stylesheet_link_tag("/stylesheets/winter.css", "/stylesheets/summer.css", :media => "projection")}
30
+ EOD
31
+ end
32
+
33
+ get "/javascript_script_tag" do
34
+ content_type "text/plain"
35
+ <<"EOD"
36
+ #{javascript_script_tag "/javascripts/summer.js", :charset => "iso-8859-2"}
37
+ EOD
38
+ end
39
+
40
+ get "/link_to_tag" do
41
+ content_type "text/plain"
42
+ <<"EOD"
43
+ #{link_to "Tatry Mountains Rescue Team", "/topr"}
44
+ EOD
45
+ end
@@ -0,0 +1,57 @@
1
+ require 'sinatra_app'
2
+ require 'test/unit'
3
+ require 'rack/test'
4
+
5
+ set :environment, :test
6
+
7
+ class SintraStaticAssetsTest < Test::Unit::TestCase
8
+ include Rack::Test::Methods
9
+
10
+ def app
11
+ Sinatra::Application
12
+ end
13
+
14
+ def test_url_for_returns_absolute_paths_and_full_urls
15
+ get '/url_for', {}, 'SCRIPT_NAME' => '/bar'
16
+ assert last_response.ok?
17
+ assert_equal last_response.body, <<EOD
18
+ /bar/
19
+ /bar/foo
20
+ http://example.org/bar/foo
21
+ EOD
22
+ end
23
+
24
+ def test_image_tag_returns_sub_uri
25
+ get '/image_tag', {}, 'SCRIPT_NAME' => '/bar'
26
+ assert last_response.ok?
27
+ assert_equal last_response.body, <<EOD
28
+ <img alt="[foo image]" src="/bar/images/foo.jpg">
29
+ EOD
30
+ end
31
+
32
+ def test_stylesheet_link_tag_returns_sub_uri
33
+ get '/stylesheet_link_tag', {}, 'SCRIPT_NAME' => '/bar'
34
+ assert last_response.ok?
35
+ assert_equal last_response.body, <<EOD
36
+ <link charset="utf-8" href="/bar/stylesheets/winter.css" media="projection" rel="stylesheet" type="text/css">
37
+ <link charset="utf-8" href="/bar/stylesheets/summer.css" media="projection" rel="stylesheet" type="text/css">
38
+ EOD
39
+ end
40
+
41
+ def test_javascript_script_tag_returns_sub_uri
42
+ get '/javascript_script_tag', {}, 'SCRIPT_NAME' => '/bar'
43
+ assert last_response.ok?
44
+ assert_equal last_response.body, <<EOD
45
+ <script charset="iso-8859-2" src="/bar/javascripts/summer.js" type="text/javascript"></script>
46
+ EOD
47
+ end
48
+
49
+ def test_link_to_tag_returns_sub_uri
50
+ get '/link_to_tag', {}, 'SCRIPT_NAME' => '/bar'
51
+ assert last_response.ok?
52
+ assert_equal last_response.body, <<EOD
53
+ <a href='/bar/topr'>Tatry Mountains Rescue Team</a>
54
+ EOD
55
+ end
56
+
57
+ end
metadata ADDED
@@ -0,0 +1,148 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sinatra-static-assets
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.4.0
5
+ platform: ruby
6
+ authors:
7
+ - Wlodek Bzyl
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-10-19 00:00:00 +02:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: rack
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 1.0.0
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: sinatra
27
+ type: :runtime
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 0.9.1
34
+ version:
35
+ - !ruby/object:Gem::Dependency
36
+ name: emk-sinatra-url-for
37
+ type: :runtime
38
+ version_requirement:
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: 0.2.1
44
+ version:
45
+ - !ruby/object:Gem::Dependency
46
+ name: rack-test
47
+ type: :development
48
+ version_requirement:
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: 0.3.0
54
+ version:
55
+ description: |
56
+ This Sinatra extensions provides following helper methods:
57
+ - image_tag
58
+ - stylesheet_link_tag
59
+ - javascript_script_tag
60
+
61
+ email: matwb@univ.gda.pl
62
+ executables: []
63
+
64
+ extensions: []
65
+
66
+ extra_rdoc_files:
67
+ - LICENSE
68
+ - README.markdown
69
+ files:
70
+ - VERSION.yml
71
+ - examples/rconfig.ru
72
+ - examples/rsummer/config.ru
73
+ - examples/rsummer/public/images/tatry1.jpg
74
+ - examples/rsummer/public/javascripts/mapp.js
75
+ - examples/rsummer/public/stylesheets/mapp.css
76
+ - examples/rsummer/public/stylesheets/src/background.png
77
+ - examples/rsummer/summer.rb
78
+ - examples/rsummer/tmp/always_restart.txt
79
+ - examples/rsummer/views/index.erb
80
+ - examples/rsummer/views/layout.erb
81
+ - examples/rwinter/config.ru
82
+ - examples/rwinter/public/images/tatry2.jpg
83
+ - examples/rwinter/public/javascripts/mapp.js
84
+ - examples/rwinter/public/stylesheets/mapp.css
85
+ - examples/rwinter/public/stylesheets/src/background.png
86
+ - examples/rwinter/tmp/always_restart.txt
87
+ - examples/rwinter/views/index.erb
88
+ - examples/rwinter/views/layout.erb
89
+ - examples/rwinter/winter.rb
90
+ - examples/summer/config.ru
91
+ - examples/summer/public/images/tatry1.jpg
92
+ - examples/summer/public/javascripts/app.js
93
+ - examples/summer/public/stylesheets/app.css
94
+ - examples/summer/public/stylesheets/src/bronzed_olive.png
95
+ - examples/summer/summer.rb
96
+ - examples/summer/tmp/always_restart.txt
97
+ - examples/summer/views/index.erb
98
+ - examples/summer/views/layout.erb
99
+ - examples/summer/views/topr.erb
100
+ - examples/winter/config.ru
101
+ - examples/winter/public/images/tatry2.jpg
102
+ - examples/winter/public/javascripts/app.js
103
+ - examples/winter/public/stylesheets/app.css
104
+ - examples/winter/public/stylesheets/src/skating.png
105
+ - examples/winter/tmp/always_restart.txt
106
+ - examples/winter/views/index.erb
107
+ - examples/winter/views/layout.erb
108
+ - examples/winter/winter.rb
109
+ - lib/sinatra/static_assets.rb
110
+ - test/sinatra_app.rb
111
+ - test/sinatra_static_assets_test.rb
112
+ - LICENSE
113
+ - README.markdown
114
+ has_rdoc: true
115
+ homepage: http://github.com/wbzyl/sinatra-static-assets
116
+ licenses: []
117
+
118
+ post_install_message:
119
+ rdoc_options:
120
+ - --charset=UTF-8
121
+ require_paths:
122
+ - lib
123
+ required_ruby_version: !ruby/object:Gem::Requirement
124
+ requirements:
125
+ - - ">="
126
+ - !ruby/object:Gem::Version
127
+ version: "0"
128
+ version:
129
+ required_rubygems_version: !ruby/object:Gem::Requirement
130
+ requirements:
131
+ - - ">="
132
+ - !ruby/object:Gem::Version
133
+ version: "0"
134
+ version:
135
+ requirements: []
136
+
137
+ rubyforge_project: sinatra-static-assets
138
+ rubygems_version: 1.3.5
139
+ signing_key:
140
+ specification_version: 3
141
+ summary: Sinatra extension providing helper methods to output tags for static assetgemspec.
142
+ test_files:
143
+ - test/sinatra_static_assets_test.rb
144
+ - test/sinatra_app.rb
145
+ - examples/summer/summer.rb
146
+ - examples/rsummer/summer.rb
147
+ - examples/rwinter/winter.rb
148
+ - examples/winter/winter.rb