sinatra-assetpack 0.0.8 → 0.0.9
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.
- data/.gitignore +1 -0
- data/HISTORY.md +15 -0
- data/README.md +203 -112
- data/Rakefile +17 -0
- data/docsrc/style.css +32 -0
- data/{example → examples/basic}/.gitignore +0 -0
- data/{example → examples/basic}/Rakefile +0 -0
- data/{example → examples/basic}/app.rb +0 -0
- data/{example → examples/basic}/app/css/test.sass +0 -0
- data/{example → examples/basic}/app/images/icon.png +0 -0
- data/{example → examples/basic}/app/js/app.js +0 -0
- data/{example → examples/basic}/app/js/vendor/jquery.js +0 -0
- data/{example → examples/basic}/app/js/vendor/jquery.plugin.js +0 -0
- data/{example → examples/basic}/app/js/vendor/underscore.js +0 -0
- data/{example → examples/basic}/views/index.erb +0 -0
- data/examples/compass/.gitignore +1 -0
- data/examples/compass/Rakefile +7 -0
- data/examples/compass/app.rb +45 -0
- data/examples/compass/app/css/main.scss +64 -0
- data/examples/compass/app/images/icon-scfd8d7d404.png +0 -0
- data/examples/compass/app/images/icon/mail.png +0 -0
- data/examples/compass/app/images/icon/refresh.png +0 -0
- data/examples/compass/app/images/junk/mail.png +0 -0
- data/examples/compass/app/images/junk/refresh.png +0 -0
- data/examples/compass/app/js/app.js +3 -0
- data/examples/compass/app/js/vendor/jquery.js +2 -0
- data/examples/compass/app/js/vendor/jquery.plugin.js +2 -0
- data/examples/compass/app/js/vendor/underscore.js +2 -0
- data/examples/compass/config.ru +3 -0
- data/examples/compass/views/index.erb +15 -0
- data/lib/sinatra/assetpack.rb +1 -1
- data/lib/sinatra/assetpack/class_methods.rb +13 -7
- data/lib/sinatra/assetpack/options.rb +0 -8
- data/lib/sinatra/assetpack/package.rb +1 -1
- data/lib/sinatra/assetpack/rake.rb +7 -1
- data/lib/sinatra/assetpack/version.rb +1 -1
- data/test/app/app.rb +4 -0
- data/test/app/app/css/behavior.htc +1 -0
- data/test/app/app/js_glob/a/b/c1/hello.js +1 -0
- data/test/app/app/js_glob/a/b/c2/hi.js +1 -0
- data/test/app/app/js_glob/a/b/c2/hola.js +1 -0
- data/test/cache_test.rb +3 -4
- data/test/compressed_test.rb +30 -0
- data/test/glob_test.rb +42 -0
- data/test/local_file_test.rb +1 -2
- data/test/mime_type_test.rb +33 -0
- data/test/non_existent_test.rb +1 -2
- data/test/options_test.rb +1 -2
- data/test/order_test.rb +1 -2
- data/test/stylus_test.rb +1 -2
- data/test/template_cache_test.rb +29 -0
- data/test/test_helper.rb +6 -7
- data/test/yui_test.rb +1 -1
- metadata +59 -37
data/Rakefile
CHANGED
@@ -12,3 +12,20 @@ task :test do
|
|
12
12
|
end
|
13
13
|
|
14
14
|
task :default => :test
|
15
|
+
|
16
|
+
gh = "rstacruz/sinatra-assetpack"
|
17
|
+
namespace :doc do
|
18
|
+
# http://github.com/rstacruz/reacco
|
19
|
+
desc "Builds the documentation into doc/"
|
20
|
+
task :build do
|
21
|
+
system "reacco -a --github #{gh} --css docsrc/style.css"
|
22
|
+
end
|
23
|
+
|
24
|
+
# http://github.com/rstacruz/git-update-ghpages
|
25
|
+
desc "Posts documentation to GitHub pages"
|
26
|
+
task :deploy => :build do
|
27
|
+
system "git update-ghpages #{gh} -i doc/"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
task :doc => :'doc:build'
|
data/docsrc/style.css
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
section.features {
|
2
|
+
background: #f6f6ff;
|
3
|
+
overflow: hidden; }
|
4
|
+
|
5
|
+
h2 {
|
6
|
+
font-size: 26pt; }
|
7
|
+
|
8
|
+
section.features h2 {
|
9
|
+
font-size: 32pt; }
|
10
|
+
|
11
|
+
section.features ul {
|
12
|
+
max-width: none;
|
13
|
+
margin-left: 0;
|
14
|
+
padding-left: 0;
|
15
|
+
width: 100%; }
|
16
|
+
|
17
|
+
section.features li {
|
18
|
+
list-style-type: none;
|
19
|
+
width: 420px;
|
20
|
+
float: left; margin-right: 40px; }
|
21
|
+
|
22
|
+
section.features li:nth-child(odd) {
|
23
|
+
clear: both; }
|
24
|
+
|
25
|
+
section.features li>p>strong {
|
26
|
+
font-family: shanti, sans-serif;
|
27
|
+
font-weight: normal;
|
28
|
+
font-size: 1.2em;
|
29
|
+
text-shadow: 2px 2px 0 rgba(255, 255, 255, 0.1);
|
30
|
+
display: block;
|
31
|
+
margin-bottom: 5px;
|
32
|
+
color: #88a; }
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1 @@
|
|
1
|
+
public
|
@@ -0,0 +1,45 @@
|
|
1
|
+
$:.unshift File.expand_path('../../lib', __FILE__)
|
2
|
+
|
3
|
+
require 'sinatra/base'
|
4
|
+
require 'sinatra/assetpack'
|
5
|
+
require 'compass'
|
6
|
+
require 'sinatra/support'
|
7
|
+
|
8
|
+
Encoding.default_external = 'utf-8' if defined?(::Encoding)
|
9
|
+
|
10
|
+
class App < Sinatra::Base
|
11
|
+
disable :show_exceptions
|
12
|
+
enable :raise_exceptions
|
13
|
+
|
14
|
+
set :root, File.dirname(__FILE__)
|
15
|
+
|
16
|
+
# This is a convenient way of setting up Compass in a Sinatra
|
17
|
+
# project without mucking around with load paths and such.
|
18
|
+
register Sinatra::CompassSupport
|
19
|
+
|
20
|
+
# ### Compass sprite configuration
|
21
|
+
# Skip this section if you don't need sprite images.
|
22
|
+
#
|
23
|
+
# Configure Compass so it knows where to look for sprites. This tells
|
24
|
+
# Compass to look for images in `app/images`, dump sprite images in the same
|
25
|
+
# folder, and link to it with HTTP images path.
|
26
|
+
#
|
27
|
+
c = Compass.configuration
|
28
|
+
c.project_path = root
|
29
|
+
c.images_dir = "app/images"
|
30
|
+
c.http_images_path = "/images"
|
31
|
+
|
32
|
+
# Asset Pack.
|
33
|
+
register Sinatra::AssetPack
|
34
|
+
assets do
|
35
|
+
css :main, ['/css/*.css']
|
36
|
+
end
|
37
|
+
|
38
|
+
get '/' do
|
39
|
+
erb :index
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
if __FILE__ == $0
|
44
|
+
App.run!
|
45
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
@import 'compass/css3';
|
2
|
+
@import 'compass/reset';
|
3
|
+
|
4
|
+
html, body {
|
5
|
+
font-family: sans-serif;
|
6
|
+
font-size: 11pt;
|
7
|
+
line-height: 1.5; }
|
8
|
+
|
9
|
+
body {
|
10
|
+
background: #c2c2cf; }
|
11
|
+
|
12
|
+
#all {
|
13
|
+
background: white;
|
14
|
+
color: #333;
|
15
|
+
padding: 10px;
|
16
|
+
width: 500px;
|
17
|
+
margin: 50px auto; }
|
18
|
+
|
19
|
+
// ### Optional sprite config
|
20
|
+
// You may put any of these before the `all-icon-sprites` line.
|
21
|
+
// These are completely optional.
|
22
|
+
|
23
|
+
// #### Sprite sets: (/icon/*.png)
|
24
|
+
$icon-spacing: 0; // How much blank space (in pixels) to put
|
25
|
+
$icon-dimensions: false; // Sets width/height in the classes
|
26
|
+
$icon-repeat: no-repeat;
|
27
|
+
$icon-position: 0;
|
28
|
+
|
29
|
+
// #### Individual images: (/icon/mail.png)
|
30
|
+
$icon-mail-spacing: 0;
|
31
|
+
$icon-mail-repeat: no-repeat;
|
32
|
+
$icon-mail-position: 0px;
|
33
|
+
|
34
|
+
// ### Sprite setup
|
35
|
+
// For "mail.png" and "refresh.png", this creates classes for .icon-mail and
|
36
|
+
// .icon-refresh that you can @extend from.
|
37
|
+
//
|
38
|
+
// See: http://compass-style.org/help/tutorials/configuration-reference/
|
39
|
+
//
|
40
|
+
@import "icon/*.png";
|
41
|
+
@include all-icon-sprites;
|
42
|
+
|
43
|
+
.image1, .image2 {
|
44
|
+
width: 16px; height: 16px;
|
45
|
+
display: inline-block; }
|
46
|
+
|
47
|
+
.image1 {
|
48
|
+
@extend .icon-mail; }
|
49
|
+
|
50
|
+
.image2 {
|
51
|
+
@extend .icon-refresh; }
|
52
|
+
|
53
|
+
// ### Advanced control
|
54
|
+
// The sprite map is available as $icon-sprites. You can then use
|
55
|
+
// `sprite()` on it.
|
56
|
+
|
57
|
+
.image3 {
|
58
|
+
background: sprite($icon-sprites, refresh); }
|
59
|
+
//background: url(...) 0 -16px;
|
60
|
+
|
61
|
+
.image3-with-offset {
|
62
|
+
background: sprite($icon-sprites, refresh, -2px, -9px); }
|
63
|
+
//background: url(...) -2px -19px;
|
64
|
+
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1,15 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html lang="en">
|
3
|
+
<head>
|
4
|
+
<meta charset="UTF-8" />
|
5
|
+
<title></title>
|
6
|
+
<%= css :main %>
|
7
|
+
</head>
|
8
|
+
<body>
|
9
|
+
<div id="all">
|
10
|
+
<h1>Here are some sprites:</h1>
|
11
|
+
<span class='image1'></span>
|
12
|
+
<span class='image2'></span>
|
13
|
+
</div>
|
14
|
+
</body>
|
15
|
+
</html>
|
data/lib/sinatra/assetpack.rb
CHANGED
@@ -14,7 +14,7 @@ module Sinatra
|
|
14
14
|
# Returns a list of formats that can be served.
|
15
15
|
# Anything not in this list will be rejected.
|
16
16
|
def self.supported_formats
|
17
|
-
@supported_formats ||= %w(css js png jpg gif otf eot ttf woff)
|
17
|
+
@supported_formats ||= %w(css js png jpg gif otf eot ttf woff htc)
|
18
18
|
end
|
19
19
|
|
20
20
|
# Returns a map of what MIME format each Tilt type returns.
|
@@ -19,10 +19,13 @@ module Sinatra
|
|
19
19
|
def add_compressed_routes!
|
20
20
|
assets.packages.each do |name, package|
|
21
21
|
get package.route_regex do
|
22
|
-
|
23
|
-
|
22
|
+
mtime, contents = @template_cache.fetch(package.path) {
|
23
|
+
[ package.mtime, package.minify ]
|
24
|
+
}
|
24
25
|
|
25
|
-
|
26
|
+
content_type package.type
|
27
|
+
last_modified mtime
|
28
|
+
contents
|
26
29
|
end
|
27
30
|
end
|
28
31
|
end
|
@@ -49,16 +52,19 @@ module Sinatra
|
|
49
52
|
not_found unless format == fmt
|
50
53
|
|
51
54
|
if fmt == 'css'
|
52
|
-
asset_filter_css File.read(fn)
|
55
|
+
@template_cache.fetch(fn) { asset_filter_css File.read(fn) }
|
53
56
|
else
|
54
57
|
send_file fn
|
55
58
|
end
|
56
59
|
else
|
57
60
|
# Dynamic file
|
58
61
|
not_found unless AssetPack.tilt_formats[format] == fmt
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
+
|
63
|
+
@template_cache.fetch(fn) {
|
64
|
+
out = render format.to_sym, File.read(fn)
|
65
|
+
out = asset_filter_css(out) if fmt == 'css'
|
66
|
+
out
|
67
|
+
}
|
62
68
|
end
|
63
69
|
end
|
64
70
|
end
|
@@ -242,14 +242,6 @@ module Sinatra
|
|
242
242
|
HashArray[*tuples.flatten]
|
243
243
|
end
|
244
244
|
|
245
|
-
def cache
|
246
|
-
@cache ||= Hash.new
|
247
|
-
end
|
248
|
-
|
249
|
-
def reset_cache
|
250
|
-
@cache = nil && cache
|
251
|
-
end
|
252
|
-
|
253
245
|
private
|
254
246
|
# Returns a URI for a given file
|
255
247
|
# path = '/projects/x/app/css'
|
@@ -8,9 +8,15 @@ unless defined?(APP_FILE) && defined?(APP_CLASS)
|
|
8
8
|
exit
|
9
9
|
end
|
10
10
|
|
11
|
+
def class_from_string(str)
|
12
|
+
str.split('::').inject(Object) do |mod, class_name|
|
13
|
+
mod.const_get(class_name)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
11
17
|
def app
|
12
18
|
require File.expand_path(APP_FILE, Dir.pwd)
|
13
|
-
|
19
|
+
class_from_string(APP_CLASS)
|
14
20
|
end
|
15
21
|
|
16
22
|
namespace :assetpack do
|
data/test/app/app.rb
CHANGED
@@ -0,0 +1 @@
|
|
1
|
+
..
|
@@ -0,0 +1 @@
|
|
1
|
+
alert("Hello");
|
@@ -0,0 +1 @@
|
|
1
|
+
alert("Hi");
|
@@ -0,0 +1 @@
|
|
1
|
+
alert("Hola");
|
data/test/cache_test.rb
CHANGED
@@ -2,9 +2,8 @@ require File.expand_path('../test_helper', __FILE__)
|
|
2
2
|
|
3
3
|
class CacheTest < UnitTest
|
4
4
|
test "Compressed js caching" do
|
5
|
-
app.
|
6
|
-
|
7
|
-
get '/js/app.js'
|
8
|
-
get '/js/app.js'
|
5
|
+
app.set :reload_templates, false
|
6
|
+
JSMin.expects(:minify).times(1)
|
7
|
+
3.times { get '/js/app.js' }
|
9
8
|
end
|
10
9
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require File.expand_path('../test_helper', __FILE__)
|
2
|
+
|
3
|
+
class CompressedTest < UnitTest
|
4
|
+
class App < UnitTest::App
|
5
|
+
register Sinatra::AssetPack
|
6
|
+
|
7
|
+
assets {
|
8
|
+
js :app, '/app.js', [ '/js/*.js' ]
|
9
|
+
}
|
10
|
+
end
|
11
|
+
|
12
|
+
def app
|
13
|
+
App
|
14
|
+
end
|
15
|
+
|
16
|
+
test "ha" do
|
17
|
+
get '/x/y/z/app.js'
|
18
|
+
assert last_response.status == 404
|
19
|
+
end
|
20
|
+
|
21
|
+
test "right" do
|
22
|
+
get '/app.js'
|
23
|
+
assert last_response.status == 200
|
24
|
+
end
|
25
|
+
|
26
|
+
test "lol" do
|
27
|
+
get '/app.4872837.js'
|
28
|
+
assert last_response.status == 200
|
29
|
+
end
|
30
|
+
end
|
data/test/glob_test.rb
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
require File.expand_path('../test_helper', __FILE__)
|
2
|
+
|
3
|
+
class GlobTest < UnitTest
|
4
|
+
class App < UnitTest::App
|
5
|
+
register Sinatra::AssetPack
|
6
|
+
|
7
|
+
assets {
|
8
|
+
serve '/js', :from => 'app/js_glob'
|
9
|
+
js :a, '/a.js', [ '/js/**/*.js' ]
|
10
|
+
js :b, '/b.js', [ '/js/a/b/c2/*.js' ]
|
11
|
+
js :c, '/c.js', [ '/js/a/b/*/*.js' ]
|
12
|
+
}
|
13
|
+
|
14
|
+
get('/a') { js :a }
|
15
|
+
get('/b') { js :b }
|
16
|
+
get('/c') { js :c }
|
17
|
+
end
|
18
|
+
|
19
|
+
def app
|
20
|
+
App
|
21
|
+
end
|
22
|
+
|
23
|
+
should "match double-star globs recursively" do
|
24
|
+
get '/a'
|
25
|
+
assert body.include?("a/b/c1/hello.")
|
26
|
+
assert body.include?("a/b/c2/hi.")
|
27
|
+
assert body.include?("a/b/c2/hola.")
|
28
|
+
end
|
29
|
+
|
30
|
+
should "match single-star globs in filenames" do
|
31
|
+
get '/b'
|
32
|
+
assert body.include?("a/b/c2/hi.")
|
33
|
+
assert body.include?("a/b/c2/hola.")
|
34
|
+
end
|
35
|
+
|
36
|
+
should "match single-star globs in paths" do
|
37
|
+
get '/c'
|
38
|
+
assert body.include?("a/b/c1/hello.")
|
39
|
+
assert body.include?("a/b/c2/hi.")
|
40
|
+
assert body.include?("a/b/c2/hola.")
|
41
|
+
end
|
42
|
+
end
|