sinatra-assetpack-flexible-compression 0.0.1

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 (100) hide show
  1. data/.gitignore +4 -0
  2. data/Gemfile +2 -0
  3. data/HISTORY.md +131 -0
  4. data/README.md +664 -0
  5. data/Rakefile +31 -0
  6. data/docsrc/style.css +32 -0
  7. data/examples/basic/.gitignore +1 -0
  8. data/examples/basic/Rakefile +7 -0
  9. data/examples/basic/app.rb +39 -0
  10. data/examples/basic/app/css/test.sass +11 -0
  11. data/examples/basic/app/images/icon.png +0 -0
  12. data/examples/basic/app/js/app.js +4 -0
  13. data/examples/basic/app/js/vendor/jquery.js +2 -0
  14. data/examples/basic/app/js/vendor/jquery.plugin.js +2 -0
  15. data/examples/basic/app/js/vendor/underscore.js +2 -0
  16. data/examples/basic/views/index.erb +26 -0
  17. data/examples/classic/app.rb +24 -0
  18. data/examples/classic/css/screen.scss +1 -0
  19. data/examples/compass/.gitignore +1 -0
  20. data/examples/compass/Rakefile +7 -0
  21. data/examples/compass/app.rb +45 -0
  22. data/examples/compass/app/css/main.scss +64 -0
  23. data/examples/compass/app/images/icon-scfd8d7d404.png +0 -0
  24. data/examples/compass/app/images/icon/mail.png +0 -0
  25. data/examples/compass/app/images/icon/refresh.png +0 -0
  26. data/examples/compass/app/images/junk/mail.png +0 -0
  27. data/examples/compass/app/images/junk/refresh.png +0 -0
  28. data/examples/compass/app/js/app.js +3 -0
  29. data/examples/compass/app/js/vendor/jquery.js +2 -0
  30. data/examples/compass/app/js/vendor/jquery.plugin.js +2 -0
  31. data/examples/compass/app/js/vendor/underscore.js +2 -0
  32. data/examples/compass/config.ru +3 -0
  33. data/examples/compass/views/index.erb +15 -0
  34. data/lib/sinatra/assetpack.rb +61 -0
  35. data/lib/sinatra/assetpack/buster_helpers.rb +36 -0
  36. data/lib/sinatra/assetpack/class_methods.rb +82 -0
  37. data/lib/sinatra/assetpack/compressor.rb +54 -0
  38. data/lib/sinatra/assetpack/configurator.rb +21 -0
  39. data/lib/sinatra/assetpack/css.rb +36 -0
  40. data/lib/sinatra/assetpack/engine.rb +20 -0
  41. data/lib/sinatra/assetpack/engines/closure.rb +19 -0
  42. data/lib/sinatra/assetpack/engines/jsmin.rb +10 -0
  43. data/lib/sinatra/assetpack/engines/sass.rb +11 -0
  44. data/lib/sinatra/assetpack/engines/simple.rb +11 -0
  45. data/lib/sinatra/assetpack/engines/sqwish.rb +21 -0
  46. data/lib/sinatra/assetpack/engines/uglify.rb +12 -0
  47. data/lib/sinatra/assetpack/engines/yui.rb +22 -0
  48. data/lib/sinatra/assetpack/hasharray.rb +66 -0
  49. data/lib/sinatra/assetpack/helpers.rb +61 -0
  50. data/lib/sinatra/assetpack/html_helpers.rb +17 -0
  51. data/lib/sinatra/assetpack/image.rb +59 -0
  52. data/lib/sinatra/assetpack/options.rb +326 -0
  53. data/lib/sinatra/assetpack/package.rb +116 -0
  54. data/lib/sinatra/assetpack/rake.rb +29 -0
  55. data/lib/sinatra/assetpack/version.rb +7 -0
  56. data/test/app/.gitignore +1 -0
  57. data/test/app/Rakefile +7 -0
  58. data/test/app/app.rb +62 -0
  59. data/test/app/app/css/behavior.htc +1 -0
  60. data/test/app/app/css/js2c.css +494 -0
  61. data/test/app/app/css/screen.sass +9 -0
  62. data/test/app/app/css/sqwishable.css +7 -0
  63. data/test/app/app/css/style.css +3 -0
  64. data/test/app/app/css/stylus.styl +3 -0
  65. data/test/app/app/css_stylus/stylus.styl +3 -0
  66. data/test/app/app/images/background.jpg +1 -0
  67. data/test/app/app/images/email.png +0 -0
  68. data/test/app/app/js/_ignoreme.js +1 -0
  69. data/test/app/app/js/hello.js +1 -0
  70. data/test/app/app/js/hi.coffee +2 -0
  71. data/test/app/app/js/ugly.js +7 -0
  72. data/test/app/app/js_glob/a/b/c1/hello.js +1 -0
  73. data/test/app/app/js_glob/a/b/c2/hi.js +1 -0
  74. data/test/app/app/js_glob/a/b/c2/hola.js +1 -0
  75. data/test/app/app/views/index.haml +1 -0
  76. data/test/arity_test.rb +26 -0
  77. data/test/build_test.rb +31 -0
  78. data/test/cache_test.rb +9 -0
  79. data/test/compressed_test.rb +30 -0
  80. data/test/glob_test.rb +42 -0
  81. data/test/helpers_test.rb +30 -0
  82. data/test/ignore_test.rb +30 -0
  83. data/test/img_test.rb +31 -0
  84. data/test/local_file_test.rb +21 -0
  85. data/test/mime_type_test.rb +33 -0
  86. data/test/non_existent_test.rb +45 -0
  87. data/test/options_test.rb +21 -0
  88. data/test/order_test.rb +20 -0
  89. data/test/preproc_test.rb +28 -0
  90. data/test/redundant_test.rb +11 -0
  91. data/test/simplecss_test.rb +16 -0
  92. data/test/sqwish_test.rb +31 -0
  93. data/test/stylus_test.rb +23 -0
  94. data/test/template_cache_test.rb +29 -0
  95. data/test/test_helper.rb +46 -0
  96. data/test/tilt_test.rb +11 -0
  97. data/test/uglifier_test.rb +23 -0
  98. data/test/unit_test.rb +109 -0
  99. data/test/yui_test.rb +22 -0
  100. metadata +276 -0
@@ -0,0 +1,9 @@
1
+ #background
2
+ color: rgba(blue, 0.3)
3
+
4
+ #email
5
+ background: url(/images/email.png)
6
+ background-repeat: no-repeat
7
+
8
+ #sidebar
9
+ background: url(/images/email.png?embed)
@@ -0,0 +1,7 @@
1
+ #bg {
2
+ color: red;
3
+ }
4
+
5
+ #bg {
6
+ background: green;
7
+ }
@@ -0,0 +1,3 @@
1
+ div { color: red; }
2
+ body { background: url(/images/background.jpg); }
3
+ #nonexistent { background: url(/images/404.png); }
@@ -0,0 +1,3 @@
1
+ body
2
+ background red
3
+ color blue
@@ -0,0 +1,3 @@
1
+ body
2
+ background red
3
+ color blue
@@ -0,0 +1 @@
1
+ hello
@@ -0,0 +1 @@
1
+ alert("HELLO I SHOULD BE IGNORED. BUMBLEBEE.");
@@ -0,0 +1 @@
1
+ $(function() { alert("Hello"); });
@@ -0,0 +1,2 @@
1
+ x = ->
2
+ alert 'yo'
@@ -0,0 +1,7 @@
1
+ (function() {
2
+ var kitsch = 1;
3
+ var noodle = 2;
4
+ var banana = 3;
5
+ console.log(noodle, banana);
6
+ })();
7
+
@@ -0,0 +1 @@
1
+ alert("Hello");
@@ -0,0 +1 @@
1
+ alert("Hi");
@@ -0,0 +1 @@
1
+ alert("Hola");
@@ -0,0 +1 @@
1
+ != js :app
@@ -0,0 +1,26 @@
1
+ require File.expand_path('../test_helper', __FILE__)
2
+
3
+ class ArityTest < UnitTest
4
+ class App < UnitTest::App
5
+ register Sinatra::AssetPack
6
+
7
+ assets do |a|
8
+ a.css :a, '/css/a.css', [
9
+ '/css/s*.css',
10
+ '/css/j*.css'
11
+ ]
12
+
13
+ a.js_compression :closure
14
+ a.css_compression = :yui
15
+ end
16
+ end
17
+
18
+ test "arity in #assets" do
19
+ paths = App.assets.packages['a.css'].paths
20
+ assert_equal paths,
21
+ [ "/css/screen.css", "/css/sqwishable.css", "/css/style.css", "/css/stylus.css", "/css/js2c.css" ]
22
+
23
+ assert App.assets.js_compression == :closure
24
+ assert App.assets.css_compression == :yui
25
+ end
26
+ end
@@ -0,0 +1,31 @@
1
+ require File.expand_path('../test_helper', __FILE__)
2
+
3
+ class BuildTest < UnitTest
4
+ teardown do
5
+ FileUtils.rm_rf File.join(app.root, 'public')
6
+ end
7
+
8
+ test "build" do
9
+ Stylus.expects(:compile).returns("body{background:#f00;color:#00f;}")
10
+ app.assets.css_compression = :simple
11
+ app.assets.build!
12
+
13
+ assert File.file? File.join(app.root, 'public/js/app.js')
14
+ assert File.mtime(File.join(app.root, 'public/js/app.js')).to_i == app.assets.packages['app.js'].mtime.to_i
15
+
16
+ assert Dir[File.join(app.root, 'public/js/app.*.js')].first
17
+
18
+ assert File.read(File.join(app.root, 'public/js/app.js')).include?('function(){alert("Hello");')
19
+
20
+ assert Dir["#{app.root}/public/images/background.*.jpg"].first
21
+ assert Dir["#{app.root}/public/images/email.*.png"].first
22
+
23
+ assert \
24
+ File.mtime(Dir["#{app.root}/public/images/background.*.jpg"].first).to_i ==
25
+ File.mtime(Dir["#{app.root}/public/images/background.jpg"].first).to_i
26
+
27
+ assert \
28
+ File.mtime(Dir["#{app.root}/public/images/background.*.jpg"].first).to_i ==
29
+ File.mtime(Dir["#{app.root}/app/images/background.jpg"].first).to_i
30
+ end
31
+ end
@@ -0,0 +1,9 @@
1
+ require File.expand_path('../test_helper', __FILE__)
2
+
3
+ class CacheTest < UnitTest
4
+ test "Compressed js caching" do
5
+ app.set :reload_templates, false
6
+ JSMin.expects(:minify).times(1).returns ""
7
+ 3.times { get '/js/app.js' }
8
+ end
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
@@ -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
@@ -0,0 +1,30 @@
1
+ require File.expand_path('../test_helper', __FILE__)
2
+
3
+ class HelpersTest < UnitTest
4
+ Main.get('/helper/foo') { img '/images/foo.jpg' }
5
+ Main.get('/helper/email') { img '/images/email.png' }
6
+ Main.get('/helper/css/all') { css :application, :sq }
7
+ Main.get('/helper/css/app') { css :application }
8
+ Main.get('/helper/css/sq') { css :sq }
9
+
10
+ test "img non-existing" do
11
+ get '/helper/foo'
12
+ assert body == "<img src='/images/foo.jpg' />"
13
+ end
14
+
15
+ test "img existing" do
16
+ get '/helper/email'
17
+ assert body =~ %r{src='/images/email.[0-9]+.png'}
18
+ assert body =~ %r{width='16'}
19
+ assert body =~ %r{height='16'}
20
+ end
21
+
22
+ test "css" do
23
+ re = Array.new
24
+ get '/helper/css/app'; re << body
25
+ get '/helper/css/sq'; re << body
26
+
27
+ get '/helper/css/all'
28
+ assert body.gsub(/[\r\n]*/m, '') == re.join('')
29
+ end
30
+ end
@@ -0,0 +1,30 @@
1
+ require File.expand_path('../test_helper', __FILE__)
2
+
3
+ class IgnoreTest < UnitTest
4
+ class App < UnitTest::App
5
+ register Sinatra::AssetPack
6
+
7
+ assets do
8
+ js :main, '/main.js', %w[/js/*.js]
9
+ end
10
+ end
11
+
12
+ def app
13
+ App
14
+ end
15
+
16
+ test "ignore as individual file" do
17
+ get '/js/_ignoreme.js'
18
+ assert last_response.status == 404
19
+ end
20
+
21
+ test "ignore in package" do
22
+ get '/main.js'
23
+ assert body.size > 0
24
+ assert !body.include?("BUMBLEBEE")
25
+ end
26
+
27
+ test "package files" do
28
+ assert !app.assets.packages['main.js'].files.any? { |s| s.include? '_ignoreme.js' }
29
+ end
30
+ end
@@ -0,0 +1,31 @@
1
+ require File.expand_path('../test_helper', __FILE__)
2
+
3
+ class ImgTest < UnitTest
4
+ Image = Sinatra::AssetPack::Image
5
+
6
+ test "get img" do
7
+ get '/images/email.png'
8
+ assert_equal last_response.headers['Content-Length'], File.size(r("/app/images/email.png")).to_s
9
+ end
10
+
11
+ test "get img with cache buster" do
12
+ get '/images/email.893748.png'
13
+ assert_equal last_response.headers['Content-Length'], File.size(r("/app/images/email.png")).to_s
14
+ end
15
+
16
+ test "Image[]" do
17
+ i = Image['/app/images/email.png']
18
+ j = Image['/app/images/email.png']
19
+
20
+ assert j === i
21
+ end
22
+
23
+ test "Image[]" do
24
+ i = Image['/app/images/email.png']
25
+ j = Image['/app/images/email.png']
26
+
27
+ Image.any_instance.expects(:`).times(1)
28
+ j.dimensions
29
+ i.dimensions
30
+ end
31
+ end
@@ -0,0 +1,21 @@
1
+ require File.expand_path('../test_helper', __FILE__)
2
+
3
+ class LocalFileTest < UnitTest
4
+ class App < UnitTest::App
5
+ register Sinatra::AssetPack
6
+
7
+ assets {
8
+ css :application, [ '/css/*.css' ]
9
+ }
10
+ end
11
+
12
+ test "local file for (in existing files)" do
13
+ fn = App.assets.local_file_for '/images/background.jpg'
14
+ assert_equal r('app/images/background.jpg'), fn
15
+ end
16
+
17
+ test "local file for (in nonexisting files)" do
18
+ fn = App.assets.local_file_for '/images/404.jpg'
19
+ assert fn.nil?
20
+ end
21
+ end
@@ -0,0 +1,33 @@
1
+ require File.expand_path('../test_helper', __FILE__)
2
+
3
+ class AppTest < UnitTest
4
+ test 'htc' do
5
+ get '/css/behavior.htc'
6
+ assert last_response.content_type =~ %r[^text/x-component]
7
+ end
8
+
9
+ test 'css - sass' do
10
+ get '/css/screen.css'
11
+ assert last_response.content_type =~ %r[^text/css]
12
+ end
13
+
14
+ test 'js' do
15
+ get '/js/hello.js'
16
+ assert last_response.content_type =~ %r[^.*?/javascript]
17
+ end
18
+
19
+ test 'js - coffee' do
20
+ get '/js/hi.js'
21
+ assert last_response.content_type =~ %r[^.*?/javascript]
22
+ end
23
+
24
+ test 'css - compressed' do
25
+ get '/css/application.css'
26
+ assert last_response.content_type =~ %r[^text/css]
27
+ end
28
+
29
+ test 'js - compressed' do
30
+ get '/skitch.js'
31
+ assert last_response.content_type =~ %r[^.*?/javascript]
32
+ end
33
+ end
@@ -0,0 +1,45 @@
1
+ require File.expand_path('../test_helper', __FILE__)
2
+
3
+ class NonExistentTest < UnitTest
4
+ class App < UnitTest::App
5
+ register Sinatra::AssetPack
6
+
7
+ assets do |a|
8
+ a.js :script, '/script.min.js', [
9
+ '/js/h*.js',
10
+ '/js/combine.js'
11
+ ]
12
+
13
+ a.js_compression :closure
14
+ a.css_compression = :yui
15
+ end
16
+
17
+ get '/js/combine.js' do
18
+ "alert('Spin spin sugar');"
19
+ end
20
+
21
+ get '/' do
22
+ js :script
23
+ end
24
+ end
25
+
26
+ def app
27
+ App
28
+ end
29
+
30
+ test "non-existent files in js helper" do
31
+ get '/'
32
+ assert body.include?('combine.js')
33
+ end
34
+
35
+ test "dev non-existent files in js helper" do
36
+ App.expects(:environment).returns(:development).times(1..100)
37
+ get '/'
38
+ assert body.include?('combine.js')
39
+ end
40
+
41
+ test "non-existent files in js minifier" do
42
+ get '/script.min.js'
43
+ assert body.include?('Spin spin sugar')
44
+ end
45
+ end
@@ -0,0 +1,21 @@
1
+ require File.expand_path('../test_helper', __FILE__)
2
+
3
+ class OptionsTest < UnitTest
4
+ class App < UnitTest::App
5
+ register Sinatra::AssetPack
6
+
7
+ assets {
8
+ css :application, [ '/css/*.css' ]
9
+ js_compression :closure
10
+ }
11
+ end
12
+
13
+ def app
14
+ App
15
+ end
16
+
17
+ test "options" do
18
+ assert App.assets.js_compression == :closure
19
+ assert App.assets.packages['application.css'].path == "/assets/application.css"
20
+ end
21
+ end
@@ -0,0 +1,20 @@
1
+ require File.expand_path('../test_helper', __FILE__)
2
+
3
+ class OrderTest < UnitTest
4
+ class App < UnitTest::App
5
+ register Sinatra::AssetPack
6
+
7
+ assets {
8
+ css :a, '/css/a.css', [
9
+ '/css/s*.css',
10
+ '/css/j*.css'
11
+ ]
12
+ }
13
+ end
14
+
15
+ test "order" do
16
+ paths = App.assets.packages['a.css'].paths
17
+ assert_equal paths.sort,
18
+ [ "/css/screen.css", "/css/sqwishable.css", "/css/style.css", "/css/stylus.css", "/css/js2c.css" ].sort
19
+ end
20
+ end