rack-bundle 0.2.1 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.1
1
+ 0.2.2
data/lib/rack/bundle.rb CHANGED
@@ -1,6 +1,14 @@
1
1
  require 'rack'
2
2
  require 'nokogiri'
3
3
 
4
+ class File
5
+ def contents
6
+ _contents = read
7
+ rewind
8
+ _contents
9
+ end
10
+ end
11
+
4
12
  module Rack
5
13
  class Bundle
6
14
  SELECTORS = Struct.new('Selector', :js, :css).new(
@@ -10,8 +18,8 @@ module Rack
10
18
  attr_accessor :storage, :document, :public_dir
11
19
  autoload :FileSystemStore, 'rack/bundle/file_system_store'
12
20
  autoload :DatabaseStore, 'rack/bundle/database_store'
13
- autoload :JSBundle, 'rack/bundle/js_bundle'
14
- autoload :CSSBundle, 'rack/bundle/css_bundle'
21
+ autoload :JSBundle, 'rack/bundle/bundles/js'
22
+ autoload :CSSBundle, 'rack/bundle/bundles/css'
15
23
 
16
24
  def initialize app, options = {}
17
25
  @app, @public_dir = app, options[:public_dir]
@@ -37,7 +45,6 @@ module Rack
37
45
  end
38
46
 
39
47
  def parse!
40
- # http://github.com/logicaltext/rack-bundle/commit/8e7d0282b05b01a0cbfa59b519242046437605f6
41
48
  body = ""
42
49
  @response.each do |part| body << part end
43
50
  @document = Nokogiri::HTML(body)
@@ -49,7 +56,7 @@ module Rack
49
56
  @storage.add bundle unless @storage.has_bundle? bundle
50
57
  bundle_node = @document.create_element 'script',
51
58
  :type => 'text/javascript',
52
- :src => bundle_path(bundle),
59
+ :src => bundle.path,
53
60
  :charset => 'utf-8'
54
61
  @document.css(SELECTORS.js).first.before(bundle_node)
55
62
  @document.css(SELECTORS.js).slice(1..-1).remove
@@ -61,13 +68,13 @@ module Rack
61
68
  styles = local_css_nodes.group_by { |node| node.attribute('media').value rescue nil }
62
69
  styles.each do |media, nodes|
63
70
  next unless nodes.count > 1
64
- stylesheets = stylesheet_contents_for nodes
71
+ stylesheets = stylesheets_for nodes
65
72
  bundle = CSSBundle.new *stylesheets
66
73
  @storage.add bundle unless @storage.has_bundle? bundle
67
74
  node = @document.create_element 'link',
68
75
  :rel => 'stylesheet',
69
76
  :type => 'text/css',
70
- :href => bundle_path(bundle),
77
+ :href => bundle.path,
71
78
  :media => media
72
79
  nodes.first.before(node)
73
80
  nodes.map { |node| node.remove }
@@ -85,32 +92,27 @@ module Rack
85
92
  end
86
93
 
87
94
  def scripts
88
- local_javascript_nodes.inject([]) do |contents, node|
95
+ local_javascript_nodes.inject([]) do |files, node|
89
96
  path = ::File.join(@public_dir, node.attribute('src').value)
90
- contents << ::File.read(path) if ::File.exists?(path)
91
- contents
97
+ files << ::File.open(path) if ::File.exists?(path)
98
+ files
92
99
  end
93
100
  end
94
101
 
95
- def stylesheet_contents_for nodes
96
- nodes.inject([]) do |contents, node|
102
+ def stylesheets_for nodes
103
+ nodes.inject([]) do |files, node|
97
104
  path = ::File.join(@public_dir, node.attribute('href').value)
98
- contents << ::File.read(path) if ::File.exists?(path)
99
- contents
105
+ files << ::File.open(path) if ::File.exists?(path)
106
+ files
100
107
  end
101
108
  end
102
109
 
103
- def bundle_path bundle
104
- "/rack-bundle-#{bundle.hash}.#{bundle.extension}"
105
- end
106
-
107
110
  def not_found
108
111
  [404, {'Content-Type' => 'text/plain'}, ['Not Found']]
109
112
  end
110
113
 
111
114
  def respond_with bundle
112
- content_type = bundle.is_a?(JSBundle) ? 'text/javascript' : 'text/css'
113
- [200, {'Content-Type' => content_type}, [bundle.contents]]
115
+ [200, {'Content-Type' => bundle.mime_type}, [bundle.contents]]
114
116
  end
115
117
  end
116
118
  end
@@ -0,0 +1,44 @@
1
+ require 'md5'
2
+
3
+ class Rack::Bundle::Base
4
+ class << self; attr_accessor :extension, :joiner, :mime_type; end
5
+ attr_accessor :contents, :files
6
+
7
+ def self.new_from_contents contents
8
+ instance = new
9
+ instance.contents = contents
10
+ instance
11
+ end
12
+
13
+ def initialize *files
14
+ @files = files
15
+ end
16
+
17
+ def contents
18
+ @contents ||= @files.map { |file| file.contents }.join(joiner)
19
+ end
20
+
21
+ def hash
22
+ @hash ||= MD5.new(@files.map { |file| File.basename(file.path) }.join).to_s
23
+ end
24
+
25
+ def path
26
+ "/rack-bundle-#{hash}.#{extension}"
27
+ end
28
+
29
+ def extension
30
+ self.class.extension
31
+ end
32
+
33
+ def joiner
34
+ self.class.joiner
35
+ end
36
+
37
+ def mime_type
38
+ self.class.mime_type
39
+ end
40
+
41
+ def == bundle
42
+ self.class == bundle.class && hash == bundle.hash
43
+ end
44
+ end
@@ -0,0 +1,5 @@
1
+ require File.dirname(__FILE__) + '/base'
2
+
3
+ class Rack::Bundle::CSSBundle < Rack::Bundle::Base
4
+ @extension, @joiner, @mime_type = "css", "\n", "text/css"
5
+ end
@@ -0,0 +1,5 @@
1
+ require File.dirname(__FILE__) + '/base'
2
+
3
+ class Rack::Bundle::JSBundle < Rack::Bundle::Base
4
+ @extension, @joiner, @mime_type = "js", ";", "text/javascript"
5
+ end
@@ -11,8 +11,8 @@ class Rack::Bundle::DatabaseStore
11
11
  def find_bundle_by_hash hash
12
12
  return nil unless result = @db[:rack_bundle].where(:hash => hash).first
13
13
  result[:type] == 'js' ?
14
- Rack::Bundle::JSBundle.new(result[:contents]) :
15
- Rack::Bundle::CSSBundle.new(result[:contents])
14
+ Rack::Bundle::JSBundle.new_from_contents(result[:contents]) :
15
+ Rack::Bundle::CSSBundle.new_from_contents(result[:contents])
16
16
  end
17
17
 
18
18
  def add bundle
@@ -26,7 +26,7 @@ class Rack::Bundle::DatabaseStore
26
26
  not find_bundle_by_hash(bundle.hash).nil?
27
27
  end
28
28
 
29
- private
29
+ private
30
30
  def create_table!
31
31
  @db.create_table! 'rack_bundle' do
32
32
  String :hash
@@ -5,13 +5,14 @@ class Rack::Bundle::FileSystemStore
5
5
 
6
6
  def initialize dir = Dir.tmpdir
7
7
  @dir = dir
8
+ clear_existing_bundles
8
9
  end
9
10
 
10
11
  def find_bundle_by_hash hash
11
12
  found = Dir["#{dir}/rack-bundle-#{hash}.*"]
12
13
  return nil unless found.any?
13
14
  type, contents = File.extname(found.first).sub(/^./, ''), File.read(File.join(dir, File.basename(found.first)))
14
- type == 'js' ? Rack::Bundle::JSBundle.new(contents) : Rack::Bundle::CSSBundle.new(contents)
15
+ type == 'js' ? Rack::Bundle::JSBundle.new_from_contents(contents) : Rack::Bundle::CSSBundle.new_from_contents(contents)
15
16
  end
16
17
 
17
18
  def has_bundle? bundle
@@ -22,5 +23,10 @@ class Rack::Bundle::FileSystemStore
22
23
  File.open("#{dir}/rack-bundle-#{bundle.hash}.#{bundle.extension}", 'w') do |file|
23
24
  file << bundle.contents
24
25
  end
25
- end
26
+ end
27
+
28
+ private
29
+ def clear_existing_bundles
30
+ Dir["#{dir}/rack-bundle-*"].each do |file| FileUtils.rm_f(file) end
31
+ end
26
32
  end
data/rack-bundle.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{rack-bundle}
8
- s.version = "0.2.1"
8
+ s.version = "0.2.2"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Julio Cesar Ody"]
12
- s.date = %q{2010-07-12}
12
+ s.date = %q{2010-07-14}
13
13
  s.description = %q{Javascript and CSS bundling at the Rack level}
14
14
  s.email = %q{julio.ody@gmail.com}
15
15
  s.extra_rdoc_files = [
@@ -23,13 +23,15 @@ Gem::Specification.new do |s|
23
23
  "VERSION",
24
24
  "lib/rack-bundle.rb",
25
25
  "lib/rack/bundle.rb",
26
- "lib/rack/bundle/css_bundle.rb",
26
+ "lib/rack/bundle/bundles/base.rb",
27
+ "lib/rack/bundle/bundles/css.rb",
28
+ "lib/rack/bundle/bundles/js.rb",
27
29
  "lib/rack/bundle/database_store.rb",
28
30
  "lib/rack/bundle/file_system_store.rb",
29
- "lib/rack/bundle/js_bundle.rb",
30
31
  "rack-bundle.gemspec",
31
- "spec/bundles/css_bundle_spec.rb",
32
- "spec/bundles/js_bundle_spec.rb",
32
+ "spec/bundles/base_spec.rb",
33
+ "spec/bundles/css_spec.rb",
34
+ "spec/bundles/js_spec.rb",
33
35
  "spec/fixtures/hh-reset.css",
34
36
  "spec/fixtures/index.html",
35
37
  "spec/fixtures/iphone.css",
@@ -52,8 +54,9 @@ Gem::Specification.new do |s|
52
54
  s.rubygems_version = %q{1.3.7}
53
55
  s.summary = %q{Javascript and CSS bundling at the Rack level}
54
56
  s.test_files = [
55
- "spec/bundles/css_bundle_spec.rb",
56
- "spec/bundles/js_bundle_spec.rb",
57
+ "spec/bundles/base_spec.rb",
58
+ "spec/bundles/css_spec.rb",
59
+ "spec/bundles/js_spec.rb",
57
60
  "spec/rack-bundle_spec.rb",
58
61
  "spec/spec_helper.rb",
59
62
  "spec/store/database_store_spec.rb",
@@ -0,0 +1,55 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'spec_helper')
2
+
3
+ describe Rack::Bundle::Base do
4
+ before do
5
+ @bundle = Rack::Bundle::Base.new $jquery, $mylib
6
+ Rack::Bundle::Base.stub(:joiner).and_return(";")
7
+ Rack::Bundle::Base.stub(:extension).and_return("js")
8
+ end
9
+
10
+ it { should respond_to :files }
11
+ it { should respond_to :contents }
12
+ it { should respond_to :hash }
13
+ it { should respond_to :extension }
14
+
15
+ it 'makes the contents of one or more file(s) accessible via #contents' do
16
+ @bundle.contents.should == [$jquery.contents, $mylib.contents].join(';')
17
+ end
18
+
19
+ it 'creates a MD5 hash out of the file names in the bundle' do
20
+ @bundle.hash.should == MD5.new([filename($jquery), filename($mylib)].join).to_s
21
+ end
22
+
23
+ it 'returns the path through which the bundle can be retrieved on #path' do
24
+ @bundle.path.should == "/rack-bundle-#{@bundle.hash}.#{@bundle.extension}"
25
+ end
26
+
27
+ context "bundled instances" do
28
+ before do
29
+ @bundled = Rack::Bundle::Base.new_from_contents "moo foo"
30
+ end
31
+
32
+ it "are instances created from an existing bundle in storage" do
33
+ end
34
+
35
+ it "are initialized through #new_from_contents, with the contents as argument" do
36
+ @bundled.is_a? Rack::Bundle::Base
37
+ end
38
+
39
+ it "have #contents" do
40
+ @bundled.contents.should == "moo foo"
41
+ end
42
+
43
+ it "doesn't have #files" do
44
+ @bundled.files.should be_empty
45
+ end
46
+ end
47
+
48
+
49
+ it "should be equal to another bundle of the same hash and class" do
50
+ another = Rack::Bundle::Base.new
51
+ subject.should_receive(:hash).and_return('moo')
52
+ another.should_receive(:hash).and_return('moo')
53
+ subject.should == another
54
+ end
55
+ end
@@ -0,0 +1,15 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'spec_helper')
2
+
3
+ describe Rack::Bundle::CSSBundle do
4
+ before do
5
+ @bundle = make_css_bundle
6
+ end
7
+
8
+ it "should return 'css' as #extension" do
9
+ subject.extension.should == "css"
10
+ end
11
+
12
+ it "should return 'text/css' as #mime_type" do
13
+ subject.mime_type.should == "text/css"
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'spec_helper')
2
+
3
+ describe Rack::Bundle::JSBundle do
4
+ before do
5
+ @bundle = make_js_bundle
6
+ end
7
+
8
+ it "should return 'js' as #extension" do
9
+ subject.extension.should == "js"
10
+ end
11
+
12
+ it "should return 'text/javascript' as #mime_type" do
13
+ subject.mime_type.should == "text/javascript"
14
+ end
15
+ end
@@ -11,16 +11,16 @@ describe Rack::Bundle do
11
11
  end
12
12
 
13
13
  it 'defaults to FileSystemStore for storage' do
14
- Rack::Bundle.new(index_page, :public_dir => '.').storage.is_a? Rack::Bundle::FileSystemStore
14
+ Rack::Bundle.new(index_page, :public_dir => FIXTURES_PATH).storage.is_a? Rack::Bundle::FileSystemStore
15
15
  end
16
16
 
17
17
  context 'serving bundles' do
18
18
  before do
19
19
  @jsbundle, @cssbundle = make_js_bundle, make_css_bundle
20
- @bundle.storage.add @jsbundle
20
+ @bundle.storage.add @jsbundle
21
21
  @bundle.storage.add @cssbundle
22
- @js_request = Rack::MockRequest.env_for @bundle.send(:bundle_path, @jsbundle)
23
- @css_request = Rack::MockRequest.env_for @bundle.send(:bundle_path, @cssbundle)
22
+ @js_request = Rack::MockRequest.env_for @jsbundle.path
23
+ @css_request = Rack::MockRequest.env_for @cssbundle.path
24
24
  end
25
25
 
26
26
  it "fetches a bundle from storage and serves if the request URL matches" do
@@ -59,6 +59,7 @@ describe Rack::Bundle do
59
59
  before do
60
60
  status, headers, @response = @bundle.call(@env)
61
61
  end
62
+
62
63
  it "doesn't happen unless the response is HTML" do
63
64
  bundle = Rack::Bundle.new plain_text, :public_dir => FIXTURES_PATH
64
65
  bundle.should_not_receive :parse!
@@ -75,7 +76,7 @@ describe Rack::Bundle do
75
76
  @simple = Rack::Bundle.new simple_page, :public_dir => FIXTURES_PATH
76
77
  end
77
78
 
78
- it "leaves externally hosted Javascripts alone" do
79
+ it "leaves Javascripts that are not locally hosted alone" do
79
80
  @bundle.call @env
80
81
  @bundle.document.css
81
82
  end
@@ -103,11 +104,4 @@ describe Rack::Bundle do
103
104
  end
104
105
  end
105
106
  end
106
-
107
- context 'private methods' do
108
- it 'returns a URL to a bundle on #bundle_path' do
109
- @jsbundle = Rack::Bundle::JSBundle.new 'omg'
110
- @bundle.send(:bundle_path, @jsbundle).should == "/rack-bundle-#{@jsbundle.hash}.js"
111
- end
112
- end
113
107
  end
data/spec/spec_helper.rb CHANGED
@@ -2,45 +2,48 @@ $:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
2
2
  require 'spec'
3
3
  require 'fileutils'
4
4
  require 'rack/bundle'
5
+ require 'rack/bundle/bundles/base'
5
6
  require 'tmpdir'
7
+
6
8
  include Rack::Utils
7
9
  alias :h :escape_html
8
10
 
9
11
  FIXTURES_PATH = File.join(File.dirname(__FILE__), 'fixtures')
10
12
 
11
13
  def fixture name
12
- File.read(File.join(FIXTURES_PATH, name))
14
+ File.open(File.join(FIXTURES_PATH, name))
13
15
  end
14
16
 
15
17
  def make_js_bundle
16
- Rack::Bundle::JSBundle.new 'La laaaa'
18
+ Rack::Bundle::JSBundle.new $jquery, $mylib
17
19
  end
18
20
 
19
21
  def make_css_bundle
20
- Rack::Bundle::CSSBundle.new 'La la laaaaaaa'
22
+ Rack::Bundle::CSSBundle.new $reset, $screen
23
+ end
24
+
25
+ def filename file
26
+ File.basename file.path
21
27
  end
22
28
 
23
29
  def index_page
24
- lambda { |env| [200, { 'Content-Type' => 'text/html' }, [fixture('index.html')]] }
30
+ lambda { |env| [200, { 'Content-Type' => 'text/html' }, [fixture('index.html').contents]] }
25
31
  end
26
32
 
27
33
  def simple_page
28
- lambda { |env| [200, { 'Content-Type' => 'text/html' }, [fixture('simple.html')]] }
34
+ lambda { |env| [200, { 'Content-Type' => 'text/html' }, [fixture('simple.html').contents]] }
29
35
  end
30
36
 
31
37
  def plain_text
32
38
  lambda { |env| [200, { 'Content-Type' => 'text/plain' }, ['plain texto']] }
33
39
  end
34
40
 
35
-
36
41
  Spec::Runner.configure do |config|
37
42
  $jquery, $mylib = fixture('jquery-1.4.1.min.js'), fixture('mylib.js')
38
43
  $reset, $screen = fixture('reset.css'), fixture('screen.css')
39
44
  $index = fixture('index.html')
40
45
  $doc = Nokogiri::HTML($index)
41
-
42
46
  config.after(:all) do
43
47
  `rm -f #{FIXTURES_PATH}/rack-bundle*`
44
48
  end
45
-
46
49
  end
@@ -23,7 +23,7 @@ describe Rack::Bundle::DatabaseStore do
23
23
  it 'takes a bundle hash as argument and returns a matching bundle' do
24
24
  jsbundle = Rack::Bundle::JSBundle.new fixture('jquery-1.4.1.min.js'), fixture('mylib.js')
25
25
  @db_store.db[:rack_bundle].insert(:hash => jsbundle.hash, :contents => jsbundle.contents, :type => 'js')
26
- @db_store.find_bundle_by_hash(jsbundle.hash).should == jsbundle
26
+ @db_store.find_bundle_by_hash(jsbundle.hash).should be_an_instance_of Rack::Bundle::JSBundle
27
27
  end
28
28
  it "returns nil when a bundle can't be found with a matching hash" do
29
29
  @db_store.find_bundle_by_hash('non existant').should be_nil
@@ -17,7 +17,13 @@ describe Rack::Bundle::FileSystemStore do
17
17
  end
18
18
 
19
19
  it "finds a bundle by it's hash on #find_bundle_by_hash" do
20
- @storage.find_bundle_by_hash(@jsbundle.hash).should == @jsbundle
20
+ @storage.find_bundle_by_hash(@jsbundle.hash).should be_an_instance_of Rack::Bundle::JSBundle
21
+ end
22
+
23
+ it "clears existing bundles when initializing" do
24
+ FileUtils.touch FIXTURES_PATH + '/rack-bundle-1234567890.js'
25
+ Rack::Bundle::FileSystemStore.new FIXTURES_PATH
26
+ File.exists?(FIXTURES_PATH + '/rack-bundle-1234567890.js').should be_false
21
27
  end
22
28
 
23
29
  context 'storing bundles in the file system' do
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rack-bundle
3
3
  version: !ruby/object:Gem::Version
4
- hash: 21
4
+ hash: 19
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 2
9
- - 1
10
- version: 0.2.1
9
+ - 2
10
+ version: 0.2.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - Julio Cesar Ody
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-07-12 00:00:00 +10:00
18
+ date: 2010-07-14 00:00:00 +10:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -98,13 +98,15 @@ files:
98
98
  - VERSION
99
99
  - lib/rack-bundle.rb
100
100
  - lib/rack/bundle.rb
101
- - lib/rack/bundle/css_bundle.rb
101
+ - lib/rack/bundle/bundles/base.rb
102
+ - lib/rack/bundle/bundles/css.rb
103
+ - lib/rack/bundle/bundles/js.rb
102
104
  - lib/rack/bundle/database_store.rb
103
105
  - lib/rack/bundle/file_system_store.rb
104
- - lib/rack/bundle/js_bundle.rb
105
106
  - rack-bundle.gemspec
106
- - spec/bundles/css_bundle_spec.rb
107
- - spec/bundles/js_bundle_spec.rb
107
+ - spec/bundles/base_spec.rb
108
+ - spec/bundles/css_spec.rb
109
+ - spec/bundles/js_spec.rb
108
110
  - spec/fixtures/hh-reset.css
109
111
  - spec/fixtures/index.html
110
112
  - spec/fixtures/iphone.css
@@ -155,8 +157,9 @@ signing_key:
155
157
  specification_version: 3
156
158
  summary: Javascript and CSS bundling at the Rack level
157
159
  test_files:
158
- - spec/bundles/css_bundle_spec.rb
159
- - spec/bundles/js_bundle_spec.rb
160
+ - spec/bundles/base_spec.rb
161
+ - spec/bundles/css_spec.rb
162
+ - spec/bundles/js_spec.rb
160
163
  - spec/rack-bundle_spec.rb
161
164
  - spec/spec_helper.rb
162
165
  - spec/store/database_store_spec.rb
@@ -1,17 +0,0 @@
1
- require 'md5'
2
-
3
- class Rack::Bundle::CSSBundle
4
- attr_accessor :contents, :hash
5
- def initialize *files
6
- @contents = files.join "\n"
7
- @hash = MD5.new(@contents).to_s
8
- end
9
-
10
- def extension
11
- 'css'
12
- end
13
-
14
- def == bundle
15
- self.class == bundle.class && hash == bundle.hash
16
- end
17
- end
@@ -1,17 +0,0 @@
1
- require 'md5'
2
-
3
- class Rack::Bundle::JSBundle
4
- attr_accessor :contents, :hash
5
- def initialize *files
6
- @contents = files.join ';'
7
- @hash = MD5.new(@contents).to_s
8
- end
9
-
10
- def extension
11
- 'js'
12
- end
13
-
14
- def == bundle
15
- self.class == bundle.class && hash == bundle.hash
16
- end
17
- end
@@ -1,15 +0,0 @@
1
- require File.join(File.dirname(__FILE__), '..', 'spec_helper')
2
-
3
- describe Rack::Bundle::CSSBundle do
4
- before do
5
- @bundle = Rack::Bundle::CSSBundle.new $reset, $screen
6
- end
7
-
8
- it 'makes the contents of one or more stylesheets accessible via #contents' do
9
- @bundle.contents.should == [$reset, $screen].join("\n")
10
- end
11
-
12
- it 'creates a MD5 hash out of the contents of the bundle' do
13
- @bundle.hash.should == MD5.new(@bundle.contents).to_s
14
- end
15
- end
@@ -1,15 +0,0 @@
1
- require File.join(File.dirname(__FILE__), '..', 'spec_helper')
2
-
3
- describe Rack::Bundle::JSBundle do
4
- before do
5
- @bundle = Rack::Bundle::JSBundle.new $jquery, $mylib
6
- end
7
-
8
- it 'makes the contents of one or more Javascript file(s) accessible via #contents' do
9
- @bundle.contents.should == [$jquery, $mylib].join(';')
10
- end
11
-
12
- it 'creates a MD5 hash out of the contents of the bundle' do
13
- @bundle.hash.should == MD5.new(@bundle.contents).to_s
14
- end
15
- end