bagger 0.4.0 → 0.5.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.
@@ -1,5 +1,11 @@
1
1
  # CHANGELOG
2
2
 
3
+ # v 0.5.0
4
+
5
+ * gzip support for stylesheets and javascripts (Christian Lundgren)
6
+ * Extended manifest with info file size (Christian Lundgren)
7
+ * verbose option
8
+
3
9
  # v 0.4.0
4
10
 
5
11
  * Support for css_path_prefix allows rewritten urls in stylesheets to
data/README.md CHANGED
@@ -56,14 +56,16 @@ on the client side by using the following techniques:
56
56
 
57
57
  # define the options hash
58
58
  options = {
59
- :source_dir => target_dir,
60
- :target_dir => source_dir,
59
+ :source_dir => source_dir,
60
+ :target_dir => target_dir,
61
61
  :manifest_path => manifest_path,
62
+ :gzip => false,
63
+ :verbose => false,
62
64
  :cache_manifest_path => cache_manifest_path,
63
- :path_prefix => '',
64
- :css_path_prefix => '',
65
- :exclude_pattern => /.*\.less/,
66
- :exclude_files => [ 'css/main.sass', 'css/style.sass' ]
65
+ :path_prefix => '',
66
+ :css_path_prefix => '',
67
+ :exclude_pattern => /.*\.less/,
68
+ :exclude_files => [ 'css/main.sass', 'css/style.sass' ]
67
69
  :combine => {
68
70
  :stylesheets => [
69
71
  {
data/ROADMAP.md CHANGED
@@ -1,46 +1,7 @@
1
1
  # ROADMAP
2
2
 
3
- ## v 0.0.1
4
-
5
- * Combines javascript
6
- * Minfies javascript with [UglifyJS](https://github.com/mishoo/UglifyJS)
7
- * Combines stylesheets
8
- * Rewrites urls in stylesheets
9
- * Minfies stylesheets with [rainpress](https://rubygems.org/gems/rainpress)
10
- * Generates versioned file names e.g /images/logo.19db9a16e2b73017c575570de577d103.png
11
- * Generates a manifest file in JSON
12
- * Generates an HTML 5 cache manifest
13
-
14
- ## v 0.0.2
15
-
16
- * allow to specify the the paths for cache.manifest and manifest.json
17
- * better validation
18
-
19
- ## v 0.1.0
20
-
21
- * support for packages. e.g
22
-
23
- :stylesheets => {
24
- :common => ['main.css', 'fonts.css'],
25
- :dialogs => ['modal.css', 'info_box.css']
26
- }
27
-
28
- ## v 0.2.0
29
-
30
- * Support for multiple cache manifests (useful if you have different
31
- resources for different devices)
32
-
33
3
  ## v 1.0.0
34
4
 
35
- * generate custom manifest files e.g with support for file size.
36
- This can be useful for preloaders
37
-
38
- {
39
- '/myfile.txt' => {
40
- :path => '/myfile.19db9a16e2b73017c575570de577d103.txt'
41
- :size => '391'
42
- }
43
- }
44
5
  * Support for lesscss as a preprocessor
45
6
  * Support for sass as a preprocessor
46
7
  * Support for gzipping files
@@ -4,6 +4,7 @@ require 'digest/md5'
4
4
  require 'addressable/uri'
5
5
  require 'uglifier'
6
6
  require 'rainpress'
7
+ require 'zlib'
7
8
 
8
9
  module Bagger
9
10
  class Packager
@@ -12,8 +13,6 @@ module Bagger
12
13
  @options = options
13
14
  @source_dir = @options[:source_dir]
14
15
  @target_dir = @options[:target_dir]
15
- @source_dir = @options[:source_dir]
16
- @target_dir = @options[:target_dir]
17
16
  @manifest_path = @options[:manifest_path] || File.join(@source_dir, 'manifest.json')
18
17
  @cache_manifest_path = @options[:cache_manifest_path] || 'cache.manifest'
19
18
  @path_prefix = @options[:path_prefix] || ''
@@ -24,10 +23,18 @@ module Bagger
24
23
  end
25
24
 
26
25
  def add_to_manifest(key, path)
27
- @manifest[key] = File.expand_path(@path_prefix + "/" + path)
26
+ if @options[:extended_manifest]
27
+ @manifest[key] = {
28
+ :path => File.expand_path(@path_prefix + "/" + path),
29
+ :size => File.size(File.join(@target_dir, path))
30
+ }
31
+ else
32
+ @manifest[key] = File.expand_path(@path_prefix + "/" + path)
33
+ end
28
34
  end
29
35
 
30
36
  def to_manifest(path, keep_original = true)
37
+ debug "adding: #{path}"
31
38
  content = File.open(File.join(@target_dir, path)) { |f| f.read }
32
39
  extension = File.extname(path)
33
40
  basename = File.basename(path, extension)
@@ -51,12 +58,14 @@ module Bagger
51
58
  end
52
59
 
53
60
  def run
61
+ debug "reading files from #{@source_dir}"
54
62
  validate
55
63
  version_files
56
64
  combine_css
57
65
  combine_js
58
66
  generate_cache_manifests
59
67
  write_manifest
68
+ debug "files written to #{@target_dir}"
60
69
  end
61
70
 
62
71
  def write_manifest
@@ -85,6 +94,7 @@ module Bagger
85
94
  rewrite_urls_in_css(config[:target_path])
86
95
  compress_css(config[:target_path])
87
96
  to_manifest(config[:target_path], false)
97
+ gzip_target(config[:target_path]) if @options[:gzip]
88
98
  end
89
99
  end
90
100
 
@@ -125,6 +135,7 @@ module Bagger
125
135
  combine_files(config[:files], config[:target_path])
126
136
  compress_js(config[:target_path])
127
137
  to_manifest(config[:target_path], false)
138
+ gzip_target(config[:target_path]) if @options[:gzip]
128
139
  end
129
140
  end
130
141
 
@@ -181,6 +192,15 @@ module Bagger
181
192
  File.open(target_path, "w") { |f| f.write(output) }
182
193
  end
183
194
 
195
+ def gzip_target(target_path)
196
+ versioned_path = @manifest[File.join('/', target_path)]
197
+ versioned_path.sub!(@path_prefix, '')
198
+ gz_path = File.join(@target_dir, "#{versioned_path}.gz")
199
+ Zlib::GzipWriter.open(gz_path) do |gz|
200
+ gz << File.open(File.join(@target_dir, versioned_path)) { |f| f.read }
201
+ end
202
+ end
203
+
184
204
  def calculate_stylesheets
185
205
  if @options[:combine] && @options[:combine][:stylesheets]
186
206
  @options[:combine][:stylesheets]
@@ -208,5 +228,9 @@ module Bagger
208
228
  def exclude_file?(path)
209
229
  path =~ /\.(css|js)$/ || @exclude_files.include?(path) || (@exclude_pattern && path =~ @exclude_pattern)
210
230
  end
231
+
232
+ def debug(message)
233
+ STDOUT.puts message if @options[:verbose]
234
+ end
211
235
  end
212
236
  end
@@ -1,3 +1,3 @@
1
1
  module Bagger
2
- VERSION = "0.4.0"
2
+ VERSION = "0.5.0"
3
3
  end
@@ -91,6 +91,15 @@ class BaggerTest < Test::Unit::TestCase
91
91
  Bagger.bagit!(default_options.merge(:exclude_pattern => /.*\.txt/))
92
92
  assert_nil manifest['/test.txt']
93
93
  end
94
+
95
+ should 'support file sizes in an extended manifest' do
96
+ path = File.join(@source_dir, 'test.txt')
97
+ write_file(path, 'foo')
98
+ file_size = File.size(path)
99
+ Bagger.bagit!(default_options.merge(:extended_manifest => true))
100
+ assert_match /\/test\..*\.txt/, manifest['/test.txt']['path']
101
+ assert_equal file_size, manifest['/test.txt']['size']
102
+ end
94
103
  end
95
104
 
96
105
  context 'html 5 cache manifest' do
@@ -219,6 +228,24 @@ class BaggerTest < Test::Unit::TestCase
219
228
  assert_equal '//super minified css', compressed_content , 'combined css not found'
220
229
  end
221
230
 
231
+ should 'support gzipping css targets' do
232
+ Rainpress.stubs(:compress).returns('//minified css');
233
+ Bagger.bagit!(
234
+ :source_dir => @source_dir,
235
+ :target_dir => @target_dir,
236
+ :gzip => true,
237
+ :combine => @config
238
+ )
239
+
240
+ expected_file_path = File.join(@target_dir, manifest['/css/combined.css'])
241
+ assert File.exists?(expected_file_path), 'original target does not exist'
242
+ assert_nil manifest['/css/combined.css.gz'], 'gzipped copy should not be in manifest'
243
+ expected_file_path << '.gz'
244
+ assert File.exists?(expected_file_path), 'gzipped copy does not exist'
245
+ gz_content = Zlib::GzipReader.open(expected_file_path){|gz| gz.read}
246
+ assert_equal '//minified css', gz_content, 'gzipped copy does not match original'
247
+ end
248
+
222
249
  context 'url rewriting' do
223
250
  setup do
224
251
  css = <<-EOF
@@ -389,6 +416,24 @@ class BaggerTest < Test::Unit::TestCase
389
416
  expected_file_path = File.join(@target_dir, manifest['/js/combined.js'])
390
417
  assert_equal '//minified javascript', File.open(expected_file_path){|f| f.read}
391
418
  end
419
+
420
+ should 'support gzipping js targets' do
421
+ Uglifier.expects(:compile).returns('//minified js')
422
+ Bagger.bagit!(
423
+ :source_dir => @source_dir,
424
+ :target_dir => @target_dir,
425
+ :gzip => true,
426
+ :combine => @config
427
+ )
428
+
429
+ expected_file_path = File.join(@target_dir, manifest['/js/combined.js'])
430
+ assert File.exists?(expected_file_path), 'original target does not exist'
431
+ assert_nil manifest['/js/combined.js.gz'], 'gzipped copy should not be in manifest'
432
+ expected_file_path << '.gz'
433
+ assert File.exists?(expected_file_path), 'gzipped copy does not exist'
434
+ gz_content = Zlib::GzipReader.open(expected_file_path){|gz| gz.read}
435
+ assert_equal '//minified js', gz_content, 'gzipped copy does not match original'
436
+ end
392
437
  end
393
438
 
394
439
  context 'packages' do
@@ -25,7 +25,7 @@ def ruby(*paths)
25
25
  end
26
26
 
27
27
  def tests
28
- Dir['test/**/test_*.rb'] - ['test/test_helper.rb']
28
+ Dir['test/**/*_test.rb'] - ['test/test_helper.rb']
29
29
  end
30
30
 
31
31
  def run( cmd )
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bagger
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-12-07 00:00:00.000000000 Z
12
+ date: 2012-01-25 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: json
16
- requirement: &70146760709180 !ruby/object:Gem::Requirement
16
+ requirement: &70159436784000 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70146760709180
24
+ version_requirements: *70159436784000
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: addressable
27
- requirement: &70146760708560 !ruby/object:Gem::Requirement
27
+ requirement: &70159436783540 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70146760708560
35
+ version_requirements: *70159436783540
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: uglifier
38
- requirement: &70146760708000 !ruby/object:Gem::Requirement
38
+ requirement: &70159436783080 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *70146760708000
46
+ version_requirements: *70159436783080
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rainpress
49
- requirement: &70146760707480 !ruby/object:Gem::Requirement
49
+ requirement: &70159436782300 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0'
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *70146760707480
57
+ version_requirements: *70159436782300
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: rake
60
- requirement: &70146760706920 !ruby/object:Gem::Requirement
60
+ requirement: &70159436781580 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: '0'
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *70146760706920
68
+ version_requirements: *70159436781580
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: shoulda-context
71
- requirement: &70146760706460 !ruby/object:Gem::Requirement
71
+ requirement: &70159436781140 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: '0'
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *70146760706460
79
+ version_requirements: *70159436781140
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: mocha
82
- requirement: &70146760706000 !ruby/object:Gem::Requirement
82
+ requirement: &70159436780460 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ! '>='
@@ -87,7 +87,7 @@ dependencies:
87
87
  version: '0'
88
88
  type: :development
89
89
  prerelease: false
90
- version_requirements: *70146760706000
90
+ version_requirements: *70159436780460
91
91
  description: ! 'A framework agnostic packaging solution for your assets: version files,
92
92
  combine them, minify them and create a manifest'
93
93
  email: