jammit-core 0.1.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 (59) hide show
  1. data/LICENSE +22 -0
  2. data/README +24 -0
  3. data/README.rdoc +17 -0
  4. data/Rakefile +59 -0
  5. data/VERSION +1 -0
  6. data/bin/jammit +13 -0
  7. data/lib/assets.example.yml +14 -0
  8. data/lib/jammit-core.rb +219 -0
  9. data/lib/jammit-core/cli.rb +87 -0
  10. data/lib/jammit-core/command_line.rb +79 -0
  11. data/lib/jammit-core/compressor.rb +214 -0
  12. data/lib/jammit-core/config.rb +82 -0
  13. data/lib/jammit-core/dependencies.rb +23 -0
  14. data/lib/jammit-core/helper.rb +77 -0
  15. data/lib/jammit-core/jst.js +1 -0
  16. data/lib/jammit-core/packager.rb +163 -0
  17. data/lib/jammit-core/routes.rb +16 -0
  18. data/lib/jammit-core/ui.rb +55 -0
  19. data/test/config/assets-broken.yml +16 -0
  20. data/test/config/assets-closure.yml +16 -0
  21. data/test/config/assets-compression-disabled.yml +16 -0
  22. data/test/config/assets-css.yml +6 -0
  23. data/test/config/assets-erb.yml +13 -0
  24. data/test/config/assets-no-java.yml +16 -0
  25. data/test/config/assets.yml +13 -0
  26. data/test/fixtures/jammed/test-closure.js +1 -0
  27. data/test/fixtures/jammed/test-datauri.css +1 -0
  28. data/test/fixtures/jammed/test-line-break.css +8 -0
  29. data/test/fixtures/jammed/test-mhtml.css +17 -0
  30. data/test/fixtures/jammed/test-uncompressed.css +36 -0
  31. data/test/fixtures/jammed/test-uncompressed.js +13 -0
  32. data/test/fixtures/jammed/test.css +1 -0
  33. data/test/fixtures/jammed/test.js +1 -0
  34. data/test/fixtures/jammed/test.jst +6 -0
  35. data/test/fixtures/jammed/test2.jst +6 -0
  36. data/test/fixtures/src/test1.css +11 -0
  37. data/test/fixtures/src/test1.js +8 -0
  38. data/test/fixtures/src/test1.jst +1 -0
  39. data/test/fixtures/src/test2.css +20 -0
  40. data/test/fixtures/src/test2.js +5 -0
  41. data/test/fixtures/src/test2.jst +5 -0
  42. data/test/fixtures/src/test_fonts.css +5 -0
  43. data/test/fixtures/tags/css_includes.html +6 -0
  44. data/test/fixtures/tags/css_individual_includes.html +3 -0
  45. data/test/fixtures/tags/css_plain_includes.html +1 -0
  46. data/test/fixtures/tags/css_print.html +6 -0
  47. data/test/public/embed/DroidSansMono.eot +0 -0
  48. data/test/public/embed/DroidSansMono.ttf +0 -0
  49. data/test/public/embed/asterisk_orange.png +0 -0
  50. data/test/public/embed/asterisk_yellow.png +0 -0
  51. data/test/test_helper.rb +44 -0
  52. data/test/unit/command_line_test.rb +28 -0
  53. data/test/unit/test_closure_compressor.rb +24 -0
  54. data/test/unit/test_compressor.rb +24 -0
  55. data/test/unit/test_configuration.rb +71 -0
  56. data/test/unit/test_in_the_wrong_directory.rb +40 -0
  57. data/test/unit/test_jammit_helpers.rb +44 -0
  58. data/test/unit/test_packager.rb +77 -0
  59. metadata +187 -0
@@ -0,0 +1,6 @@
1
+ (function(){
2
+ window.JST = window.JST || {};
3
+ var template = function(str){var fn = new Function('obj', 'var p=[],print=function(){p.push.apply(p,arguments);};with(obj){p.push(\''+str.replace(/[\r\t\n]/g, " ").replace(/'(?=[^%]*%>)/g,"\t").split("'").join("\\'").split("\t").join("'").replace(/<%=(.+?)%>/g,"',$1,'").split("<%").join("');").split("%>").join("p.push('")+"');}return p.join('');"); return fn;};
4
+ window.JST.test1 = template('<a href="<%= to_somewhere %>"><%= saying_something %></a>');
5
+ window.JST.test2 = template('<% _([1,2,3]).each(function(num) { %> <li class="number"> <%= num %> </li><% }) %>');
6
+ })();
@@ -0,0 +1,6 @@
1
+ (function(){
2
+ custom_namespace = custom_namespace || {};
3
+ var template = function(str){var fn = new Function('obj', 'var p=[],print=function(){p.push.apply(p,arguments);};with(obj){p.push(\''+str.replace(/[\r\t\n]/g, " ").replace(/'(?=[^%]*%>)/g,"\t").split("'").join("\\'").split("\t").join("'").replace(/<%=(.+?)%>/g,"',$1,'").split("<%").join("');").split("%>").join("p.push('")+"');}return p.join('');"); return fn;};
4
+ custom_namespace.test1 = template('<a href="<%= to_somewhere %>"><%= saying_something %></a>');
5
+ custom_namespace.test2 = template('<% _([1,2,3]).each(function(num) { %> <li class="number"> <%= num %> </li><% }) %>');
6
+ })();
@@ -0,0 +1,11 @@
1
+ #hello {
2
+ color: white;
3
+ background: blue;
4
+ }
5
+ #hello .world {
6
+ border: 1px solid red;
7
+ margin-left: 10px;
8
+ margin-right: 10px;
9
+ margin-bottom: 45px;
10
+ margin-top: 45px;
11
+ }
@@ -0,0 +1,8 @@
1
+ var myself = {
2
+
3
+ // An Introduction:
4
+ sayHi : function(name) {
5
+ console.log("hello, " + name);
6
+ }
7
+
8
+ };
@@ -0,0 +1 @@
1
+ <a href="<%= to_somewhere %>"><%= saying_something %></a>
@@ -0,0 +1,20 @@
1
+ #another {
2
+ color: white;
3
+ background: blue;
4
+ }
5
+ #css .file {
6
+ border: 1px solid red;
7
+ margin-left: 10px;
8
+ margin-right: 10px;
9
+ margin-bottom: 45px;
10
+ margin-top: 45px;
11
+ }
12
+ #with_images {
13
+ background: url(../../public/embed/asterisk_yellow.png);
14
+ }
15
+ #and_relative_paths {
16
+ background: url(../../public/embed/asterisk_orange.png?1010101);
17
+ }
18
+ #and_real_urls {
19
+ background: url(http://example.com/image.png);
20
+ }
@@ -0,0 +1,5 @@
1
+ var mandelay = {
2
+ name : function() { return this.constructor.prototype; }
3
+ };
4
+
5
+ myself.sayHi(mandelay.name());
@@ -0,0 +1,5 @@
1
+ <% _([1,2,3]).each(function(num) { %>
2
+ <li class="number">
3
+ <%= num %>
4
+ </li>
5
+ <% }) %>
@@ -0,0 +1,5 @@
1
+ @font-face {
2
+ font-family: 'DroidSansMonoRegular';
3
+ src: url('../../public/embed/DroidSansMono.eot');
4
+ src: local('Droid Sans Mono Regular'), local('DroidSansMono'), url('../../public/embed/DroidSansMono.ttf') format('truetype');
5
+ }
@@ -0,0 +1,6 @@
1
+ <!--[if (!IE)|(gte IE 8)]><!-->
2
+ <link href="/assets/test-datauri.css?101" media="screen" rel="stylesheet" type="text/css" />
3
+ <!--<![endif]-->
4
+ <!--[if lte IE 7]>
5
+ <link href="/assets/test-mhtml.css?101" media="screen" rel="stylesheet" type="text/css" />
6
+ <![endif]-->
@@ -0,0 +1,3 @@
1
+ <link href="/fixtures/src/test1.css?101" media="screen" rel="stylesheet" type="text/css" />
2
+ <link href="/fixtures/src/test2.css?101" media="screen" rel="stylesheet" type="text/css" />
3
+ <link href="/fixtures/src/test_fonts.css?101" media="screen" rel="stylesheet" type="text/css" />
@@ -0,0 +1 @@
1
+ <link href="/assets/test.css?101" media="screen" rel="stylesheet" type="text/css" />
@@ -0,0 +1,6 @@
1
+ <!--[if (!IE)|(gte IE 8)]><!-->
2
+ <link href="/assets/test-datauri.css?101" media="print" rel="stylesheet" type="text/css" />
3
+ <!--<![endif]-->
4
+ <!--[if lte IE 7]>
5
+ <link href="/assets/test-mhtml.css?101" media="print" rel="stylesheet" type="text/css" />
6
+ <![endif]-->
Binary file
Binary file
@@ -0,0 +1,44 @@
1
+ require 'logger'
2
+
3
+ ASSET_ROOT = File.expand_path('test')
4
+ devnull = RUBY_PLATFORM =~ /mswin|mingw|bccwin|wince|emx/ ? 'nul' : '/dev/null'
5
+ RAILS_DEFAULT_LOGGER = Logger.new(devnull)
6
+ RAILS_ENV = "test"
7
+ RAILS_ROOT = File.expand_path('test')
8
+ ENV["RAILS_ASSET_ID"] = "101"
9
+
10
+ require 'lib/jammit'
11
+ gem 'rails'
12
+ require 'initializer'
13
+ Jammit.load_configuration(Jammit::DEFAULT_CONFIG_PATH)
14
+
15
+ def glob(g)
16
+ Dir.glob(g).sort
17
+ end
18
+
19
+ class Test::Unit::TestCase
20
+
21
+ PRECACHED_FILES = %w(
22
+ test/precache/test-datauri.css
23
+ test/precache/test-datauri.css.gz
24
+ test/precache/test-mhtml.css
25
+ test/precache/test-mhtml.css.gz
26
+ test/precache/test.css
27
+ test/precache/test.css.gz
28
+ test/precache/test.js
29
+ test/precache/test.js.gz
30
+ test/precache/test.jst
31
+ test/precache/test.jst.gz
32
+ )
33
+
34
+ PRECACHED_SOURCES = %w(
35
+ test/precache/test-datauri.css
36
+ test/precache/test-mhtml.css
37
+ test/precache/test.css
38
+ test/precache/test.js
39
+ test/precache/test.jst
40
+ )
41
+
42
+ include Jammit
43
+
44
+ end
@@ -0,0 +1,28 @@
1
+ require 'test_helper'
2
+ require 'zlib'
3
+
4
+ class CommandLineTest < Test::Unit::TestCase
5
+
6
+ def test_version_and_help_can_run
7
+ assert system('bin/jammit -v') && system('bin/jammit -h')
8
+ end
9
+
10
+ def test_jammit_precaching
11
+ system('bin/jammit -c test/config/assets.yml -o test/precache -u http://www.example.com')
12
+ assert PRECACHED_FILES == glob('test/precache/*')
13
+ assert Zlib::GzipReader.open('test/precache/test-datauri.css.gz') {|f| f.read } == File.read('test/fixtures/jammed/test-datauri.css')
14
+ assert Zlib::GzipReader.open('test/precache/test.jst.gz') {|f| f.read } == File.read('test/fixtures/jammed/test.jst')
15
+ FileUtils.rm_r('test/precache')
16
+ end
17
+
18
+ def test_lazy_precaching
19
+ system('bin/jammit -c test/config/assets.yml -o test/precache -u http://www.example.com')
20
+ assert PRECACHED_FILES == glob('test/precache/*')
21
+ mtime = File.mtime(PRECACHED_FILES.first)
22
+ system('bin/jammit -c test/config/assets.yml -o test/precache -u http://www.example.com')
23
+ assert File.mtime(PRECACHED_FILES.first) == mtime
24
+ system('bin/jammit -c test/config/assets.yml -o test/precache -u http://www.example.com --force')
25
+ assert File.mtime(PRECACHED_FILES.first) > mtime
26
+ end
27
+
28
+ end
@@ -0,0 +1,24 @@
1
+ require 'test_helper'
2
+
3
+ class ClosureCompressorTest < Test::Unit::TestCase
4
+
5
+ def setup
6
+ Jammit.load_configuration('test/config/assets-closure.yml').reload!
7
+ @compressor = Compressor.new
8
+ end
9
+
10
+ def teardown
11
+ Jammit.load_configuration('test/config/assets.yml').reload!
12
+ end
13
+
14
+ def test_javascript_compression
15
+ packed = @compressor.compress_js(glob('test/fixtures/src/test*.js'))
16
+ assert packed == File.read('test/fixtures/jammed/test-closure.js')
17
+ end
18
+
19
+ def test_jst_compilation
20
+ packed = @compressor.compile_jst(glob('test/fixtures/src/test*.jst'))
21
+ assert packed == File.read('test/fixtures/jammed/test.jst')
22
+ end
23
+
24
+ end
@@ -0,0 +1,24 @@
1
+ require 'test_helper'
2
+
3
+ class CompressorTest < Test::Unit::TestCase
4
+
5
+ def setup
6
+ @compressor = Compressor.new
7
+ end
8
+
9
+ def test_javascript_compression
10
+ packed = @compressor.compress_js(glob('test/fixtures/src/test*.js'))
11
+ assert packed == File.read('test/fixtures/jammed/test.js')
12
+ end
13
+
14
+ def test_css_compression
15
+ packed = @compressor.compress_css(glob('test/fixtures/src/*.css'))
16
+ assert packed == File.read('test/fixtures/jammed/test.css')
17
+ end
18
+
19
+ def test_jst_compilation
20
+ packed = @compressor.compile_jst(glob('test/fixtures/src/test*.jst'))
21
+ assert packed == File.read('test/fixtures/jammed/test.jst')
22
+ end
23
+
24
+ end
@@ -0,0 +1,71 @@
1
+ require 'test_helper'
2
+
3
+ class BrokenConfigurationTest < Test::Unit::TestCase
4
+
5
+ def setup
6
+ Jammit.load_configuration('test/config/assets-broken.yml').reload!
7
+ @compressor = Compressor.new
8
+ end
9
+
10
+ def teardown
11
+ Jammit.load_configuration('test/config/assets.yml').reload!
12
+ end
13
+
14
+ def test_loading_a_nonexistent_file
15
+ assert_raises(ConfigurationNotFound) do
16
+ Jammit.load_configuration('nonexistent/assets.yml')
17
+ end
18
+ end
19
+
20
+ def test_loading_a_nonexistent_java
21
+ Jammit.load_configuration('test/config/assets-no-java.yml')
22
+ assert !Jammit.compress_assets
23
+ @compressor = Compressor.new
24
+ packed = @compressor.compress_js(glob('test/fixtures/src/test*.js'))
25
+ assert packed == File.read('test/fixtures/jammed/test-uncompressed.js')
26
+ packed = @compressor.compress_css(glob('test/fixtures/src/*.css'))
27
+ assert packed == File.read('test/fixtures/jammed/test-uncompressed.css')
28
+ end
29
+
30
+ def test_disabled_compression
31
+ Jammit.load_configuration('test/config/assets-compression-disabled.yml')
32
+ assert !Jammit.compress_assets
33
+ assert !Jammit.gzip_assets
34
+ @compressor = Compressor.new
35
+ packed = @compressor.compress_js(glob('test/fixtures/src/test*.js'))
36
+ assert packed == File.read('test/fixtures/jammed/test-uncompressed.js')
37
+ packed = @compressor.compress_css(glob('test/fixtures/src/*.css'))
38
+ assert packed == File.read('test/fixtures/jammed/test-uncompressed.css')
39
+ end
40
+
41
+ def test_css_compression
42
+ assert Jammit.compress_assets
43
+ assert Jammit.gzip_assets
44
+ packed = @compressor.compress_css(glob('test/fixtures/src/*.css'))
45
+ assert packed == File.read('test/fixtures/jammed/test.css')
46
+ end
47
+
48
+ def test_erb_configuration
49
+ Jammit.load_configuration('test/config/assets-erb.yml')
50
+ assert Jammit.compress_assets
51
+ packed = @compressor.compress_css(glob('test/fixtures/src/*.css'))
52
+ assert packed == File.read('test/fixtures/jammed/test.css')
53
+ end
54
+
55
+ def test_css_configuration
56
+ Jammit.load_configuration('test/config/assets-css.yml')
57
+ packed = Compressor.new.compress_css(glob('test/fixtures/src/*.css'))
58
+ assert packed == File.read('test/fixtures/jammed/test-line-break.css')
59
+ end
60
+
61
+ def test_javascript_compression
62
+ packed = @compressor.compress_js(glob('test/fixtures/src/test*.js'))
63
+ assert packed == File.read('test/fixtures/jammed/test.js')
64
+ end
65
+
66
+ def test_jst_compilation
67
+ packed = @compressor.compile_jst(glob('test/fixtures/src/test*.jst'))
68
+ assert packed == File.read('test/fixtures/jammed/test.jst')
69
+ end
70
+
71
+ end
@@ -0,0 +1,40 @@
1
+ require 'test_helper'
2
+
3
+ class WrongDirectoryTest < Test::Unit::TestCase
4
+
5
+ def setup
6
+ @original_dir ||= File.expand_path(Dir.pwd)
7
+ Dir.chdir('/')
8
+ end
9
+
10
+ def teardown
11
+ Dir.chdir(@original_dir)
12
+ end
13
+
14
+ def test_fetching_lists_of_individual_urls
15
+ urls = Jammit.packager.individual_urls(:test, :css)
16
+ assert urls == ['/fixtures/src/test1.css', '/fixtures/src/test2.css', '/fixtures/src/test_fonts.css']
17
+ urls = Jammit.packager.individual_urls(:test, :js)
18
+ assert urls == ['/fixtures/src/test1.js', '/fixtures/src/test2.js']
19
+ end
20
+
21
+ def test_packaging_stylesheets
22
+ css = Jammit.packager.pack_stylesheets(:test)
23
+ assert css == File.read("#{ASSET_ROOT}/fixtures/jammed/test.css")
24
+ css = Jammit.packager.pack_stylesheets(:test, :datauri)
25
+ assert css == File.read("#{ASSET_ROOT}/fixtures/jammed/test-datauri.css")
26
+ css = Jammit.packager.pack_stylesheets(:test, :mhtml, 'http://www.example.com')
27
+ assert css == File.open("#{ASSET_ROOT}/fixtures/jammed/test-mhtml.css", 'rb') {|f| f.read }
28
+ end
29
+
30
+ def test_packaging_javascripts
31
+ js = Jammit.packager.pack_javascripts(:test)
32
+ assert js == File.read("#{ASSET_ROOT}/fixtures/jammed/test.js")
33
+ end
34
+
35
+ def test_packaging_templates
36
+ jst = Jammit.packager.pack_templates(:test)
37
+ assert jst == File.read("#{ASSET_ROOT}/fixtures/jammed/test.jst")
38
+ end
39
+
40
+ end
@@ -0,0 +1,44 @@
1
+ require 'test_helper'
2
+ require 'action_pack'
3
+ require 'action_view'
4
+ require 'action_view/base'
5
+ require 'action_controller'
6
+ require 'action_controller/base'
7
+ require 'action_view/test_case'
8
+ require 'jammit/helper'
9
+
10
+ class ActionController::Base
11
+ cattr_accessor :asset_host
12
+ end
13
+
14
+ class JammitHelpersTest < ActionView::TestCase
15
+ include ActionView::Helpers::AssetTagHelper
16
+ include Jammit::Helper
17
+
18
+ def test_include_stylesheets
19
+ assert include_stylesheets(:test) == File.read('test/fixtures/tags/css_includes.html')
20
+ end
21
+
22
+ def test_include_stylesheets_with_options
23
+ assert include_stylesheets(:test, :media => 'print') == File.read('test/fixtures/tags/css_print.html')
24
+ end
25
+
26
+ def test_include_stylesheets_forcing_embed_assets_off
27
+ assert include_stylesheets(:test, :embed_assets => false) == File.read('test/fixtures/tags/css_plain_includes.html')
28
+ end
29
+
30
+ def test_include_javascripts
31
+ assert include_javascripts(:test) == '<script src="/assets/test.js?101" type="text/javascript"></script>'
32
+ end
33
+
34
+ def test_include_templates
35
+ assert include_templates(:test) == '<script src="/assets/test.jst?101" type="text/javascript"></script>'
36
+ end
37
+
38
+ def test_individual_assets_in_development_do
39
+ Jammit.instance_variable_set(:@package_assets, false)
40
+ assert include_stylesheets(:test) == File.read('test/fixtures/tags/css_individual_includes.html')
41
+ Jammit.reload!
42
+ end
43
+
44
+ end
@@ -0,0 +1,77 @@
1
+ require 'test_helper'
2
+ require 'zlib'
3
+
4
+ class PackagerTest < Test::Unit::TestCase
5
+
6
+ def test_fetching_lists_of_individual_urls
7
+ urls = Jammit.packager.individual_urls(:test, :css)
8
+ assert urls == ['/fixtures/src/test1.css', '/fixtures/src/test2.css', '/fixtures/src/test_fonts.css']
9
+ urls = Jammit.packager.individual_urls(:test, :js)
10
+ assert urls == ['/fixtures/src/test1.js', '/fixtures/src/test2.js']
11
+ end
12
+
13
+ def test_packaging_stylesheets
14
+ css = Jammit.packager.pack_stylesheets(:test)
15
+ assert css == File.read('test/fixtures/jammed/test.css')
16
+ css = Jammit.packager.pack_stylesheets(:test, :datauri)
17
+ assert css == File.read('test/fixtures/jammed/test-datauri.css')
18
+ css = Jammit.packager.pack_stylesheets(:test, :mhtml, 'http://www.example.com')
19
+ assert css == File.open('test/fixtures/jammed/test-mhtml.css', 'rb') {|f| f.read }
20
+ end
21
+
22
+ def test_packaging_javascripts
23
+ js = Jammit.packager.pack_javascripts(:test)
24
+ assert js == File.read('test/fixtures/jammed/test.js')
25
+ end
26
+
27
+ def test_packaging_templates
28
+ jst = Jammit.packager.pack_templates(:test)
29
+ assert jst == File.read('test/fixtures/jammed/test.jst')
30
+ Jammit.set_template_namespace('custom_namespace')
31
+ jst = Jammit.packager.pack_templates(:test)
32
+ Jammit.set_template_namespace('window.JST')
33
+ assert jst == File.read('test/fixtures/jammed/test2.jst')
34
+ end
35
+
36
+ def test_package_caching
37
+ css = Jammit.packager.pack_stylesheets(:test, :mhtml, 'http://www.example.com')
38
+ mtime = Time.now
39
+ Jammit.packager.cache(:test, :css, css, 'test/public', :mhtml, mtime)
40
+ canonical = File.open('test/fixtures/jammed/test-mhtml.css', 'rb') {|f| f.read }
41
+ assert File.open('test/public/test-mhtml.css', 'rb') {|f| f.read } == canonical
42
+ assert Zlib::GzipReader.open('test/public/test-mhtml.css.gz') {|f| f.read } == canonical
43
+ FileUtils.rm(['test/public/test-mhtml.css', 'test/public/test-mhtml.css.gz'])
44
+ end
45
+
46
+ def test_precache_all
47
+ Jammit.packager.precache_all('test/precache', 'http://www.example.com')
48
+ assert PRECACHED_FILES == glob('test/precache/*')
49
+ assert Zlib::GzipReader.open('test/precache/test-datauri.css.gz') {|f| f.read } == File.read('test/fixtures/jammed/test-datauri.css')
50
+ assert Zlib::GzipReader.open('test/precache/test.jst.gz') {|f| f.read } == File.read('test/fixtures/jammed/test.jst')
51
+ ensure
52
+ begin
53
+ FileUtils.rm_r('test/precache')
54
+ rescue Errno::ENOENT => e
55
+ end
56
+ end
57
+
58
+ def test_precache_no_gzip
59
+ Jammit.load_configuration('test/config/assets-compression-disabled.yml').reload!
60
+ Jammit.packager.precache_all('test/precache', 'http://www.example.com')
61
+ assert PRECACHED_SOURCES == glob('test/precache/*')
62
+ Jammit.load_configuration('test/config/assets.yml').reload!
63
+ ensure
64
+ begin
65
+ FileUtils.rm_r('test/precache')
66
+ rescue Errno::ENOENT => e
67
+ end
68
+ end
69
+
70
+ def test_exceptions_for_unwritable_directories
71
+ return unless File.exists?('text/fixtures/unwritable')
72
+ assert_raises(OutputNotWritable) do
73
+ Jammit.packager.precache_all('test/fixtures/unwritable')
74
+ end
75
+ end
76
+
77
+ end