rapper 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/README.markdown +7 -4
- data/VERSION +1 -1
- data/lib/rapper.rb +9 -10
- data/lib/rapper/config.rb +4 -7
- data/lib/rapper/definition.rb +114 -0
- data/lib/rapper/errors.rb +0 -5
- data/lib/rapper/utils.rb +1 -70
- data/lib/rapper/versioning.rb +29 -10
- data/rapper.gemspec +4 -5
- data/spec/fixtures/config/assets/base/javascripts.yml +8 -6
- data/spec/fixtures/config/assets/base/stylesheets.yml +11 -7
- data/spec/fixtures/test_cases/compression/definitions/css.yml +1 -1
- data/spec/fixtures/test_cases/compression/definitions/js.yml +1 -1
- data/spec/fixtures/test_cases/concatenation/definitions/css.yml +1 -1
- data/spec/fixtures/test_cases/concatenation/definitions/js.yml +1 -1
- data/spec/rapper_spec.rb +40 -6
- metadata +19 -19
- data/spec/fixtures/config/assets/base/validators.yml +0 -9
data/README.markdown
CHANGED
@@ -63,7 +63,7 @@ The following defaults are applied if not defined in your configuration:
|
|
63
63
|
|
64
64
|
The `definition_root` setting in the rapper config is a path to a folder containing more YAML files that define the various types of bundles you want to build (eg. `stylesheets.yml`, `javascripts.yml`) Example definition file:
|
65
65
|
|
66
|
-
---
|
66
|
+
---
|
67
67
|
- source_root: public/javascripts
|
68
68
|
- destination_root: public/assets/javascripts
|
69
69
|
- suffix: js
|
@@ -82,9 +82,9 @@ The above definition will create two asset files: `public/assets/javascripts/bas
|
|
82
82
|
|
83
83
|
## Versioning
|
84
84
|
|
85
|
-
If versioning is turned on in your config, version strings will be used to enforce better browser caching of assets.
|
85
|
+
If versioning is turned on in your config, version strings will be used to enforce better browser caching of assets. (Version numbers are always used in definition files.)
|
86
86
|
|
87
|
-
---
|
87
|
+
---
|
88
88
|
- source_root: public/javascripts
|
89
89
|
- destination_root: public/assets/javascripts
|
90
90
|
- suffix: js
|
@@ -99,7 +99,9 @@ If versioning is turned on in your config, version strings will be used to enfor
|
|
99
99
|
- ext_js_full
|
100
100
|
- version: db62
|
101
101
|
|
102
|
-
|
102
|
+
Version strings are short hashes of the pre-compression asset file. This means that they will only change when the contents of the component files for an asset change and time-consuming compression will only happen when a bundle needs to be re-packaged.
|
103
|
+
|
104
|
+
Version strings are also used to enforce good browser caching habits, especially when you have a far-future expires header configured on your web server. For example, suppose you had the following asset:
|
103
105
|
|
104
106
|
<script type="text/javascript" src="/assets/milkshake.js?v=d3va"></script>
|
105
107
|
|
@@ -123,6 +125,7 @@ Browsers will automatically re-download and cache the new asset.
|
|
123
125
|
|
124
126
|
## Version history
|
125
127
|
|
128
|
+
* **0.0.3** - New `Definition` object to make working with definitions significantly easier, don't re-package assets that don't need re-packaging.
|
126
129
|
* **0.0.2** - Compression now works and is specced.
|
127
130
|
* **0.0.1** - Initial release. Functioning bundler, minus the view helpers.
|
128
131
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.3
|
data/lib/rapper.rb
CHANGED
@@ -33,7 +33,7 @@ module Rapper
|
|
33
33
|
end
|
34
34
|
|
35
35
|
# Package assets according to the loaded config and definitions. Defaults
|
36
|
-
# to packaging all asset types.
|
36
|
+
# to packaging all asset types. Skips files that don't need re-packaging.
|
37
37
|
#
|
38
38
|
# @param [<String>] types Asset types to refresh versions for.
|
39
39
|
def package( *types )
|
@@ -42,18 +42,17 @@ module Rapper
|
|
42
42
|
|
43
43
|
types.each do |type|
|
44
44
|
definition = @definitions[type]
|
45
|
-
source = File.expand_path( definition
|
46
|
-
destination = definition
|
47
|
-
suffix = definition
|
45
|
+
source = File.expand_path( definition.source_root )
|
46
|
+
destination = definition.destination_root
|
47
|
+
suffix = definition.suffix
|
48
48
|
|
49
|
-
definition
|
50
|
-
name
|
51
|
-
spec = asset.values.first.first
|
49
|
+
definition.assets.each do |name, spec|
|
50
|
+
next unless needs_packaging?( type, name )
|
52
51
|
|
53
|
-
source_files = asset_component_paths(
|
54
|
-
destination_file = asset_path(
|
52
|
+
source_files = definition.asset_component_paths( name )
|
53
|
+
destination_file = definition.asset_path( name )
|
55
54
|
|
56
|
-
log :verbose, "Joining #{
|
55
|
+
log :verbose, "Joining #{source_files.size} files to #{name}"
|
57
56
|
join_files( source_files, destination_file )
|
58
57
|
|
59
58
|
if get_config( "compress" )
|
data/lib/rapper/config.rb
CHANGED
@@ -24,10 +24,10 @@ module Rapper
|
|
24
24
|
raise Rapper::Errors::NoDefinitionRoot,
|
25
25
|
"No 'definition_root' has been defined for #{@environment}"
|
26
26
|
end
|
27
|
-
|
28
|
-
Dir[
|
27
|
+
definition_paths = File.join( env_config["definition_root"], "*.yml" )
|
28
|
+
Dir[definition_paths].each do |definition|
|
29
29
|
type = File.basename( definition, ".yml" )
|
30
|
-
@definitions[type] =
|
30
|
+
@definitions[type] = Definition.new( definition )
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
@@ -59,10 +59,7 @@ module Rapper
|
|
59
59
|
log :info, "Updating definitions for #{types.join( ', ' )}"
|
60
60
|
|
61
61
|
types.each do |type|
|
62
|
-
|
63
|
-
File.open( definition_path( type ), "w" ) do |file|
|
64
|
-
file.puts @definitions[type].to_yaml
|
65
|
-
end
|
62
|
+
@definitions[type].update
|
66
63
|
end
|
67
64
|
end
|
68
65
|
|
@@ -0,0 +1,114 @@
|
|
1
|
+
module Rapper
|
2
|
+
# Basic definition abstraction to make working with the wacky YAML structure
|
3
|
+
# easier.
|
4
|
+
class Definition
|
5
|
+
|
6
|
+
def initialize( path )
|
7
|
+
@path = path
|
8
|
+
@type = File.basename( path, ".yml" )
|
9
|
+
@definition = YAML.load_file( @path )
|
10
|
+
end
|
11
|
+
|
12
|
+
# =======================
|
13
|
+
# = Definition settings =
|
14
|
+
# =======================
|
15
|
+
|
16
|
+
def source_root
|
17
|
+
first_key_value( "source_root", @definition ) || ""
|
18
|
+
end
|
19
|
+
|
20
|
+
def destination_root
|
21
|
+
first_key_value( "destination_root", @definition ) || ""
|
22
|
+
end
|
23
|
+
|
24
|
+
def suffix
|
25
|
+
first_key_value( "suffix", @definition )
|
26
|
+
end
|
27
|
+
|
28
|
+
# ==========
|
29
|
+
# = Assets =
|
30
|
+
# ==========
|
31
|
+
|
32
|
+
# @return [Hash] Simplified structure representing all asset definitions.
|
33
|
+
def assets
|
34
|
+
assets = {}
|
35
|
+
|
36
|
+
first_key_value( "assets", @definition ).each do |spec|
|
37
|
+
assets[spec.keys.first] = spec.values.first.inject({}) do |memo, item|
|
38
|
+
memo.merge( item )
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
assets
|
43
|
+
end
|
44
|
+
|
45
|
+
# Update the version string for a specific asset.
|
46
|
+
#
|
47
|
+
# @param [String] name Asset name.
|
48
|
+
#
|
49
|
+
# @param [String] version New version string for the asset.
|
50
|
+
def set_version( name, version )
|
51
|
+
first_key_value( "assets", @definition ).each do |spec|
|
52
|
+
next unless spec[name]
|
53
|
+
spec[name].each do |setting|
|
54
|
+
next unless setting["version"]
|
55
|
+
setting["version"] = version
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
# ==========
|
61
|
+
# = Saving =
|
62
|
+
# ==========
|
63
|
+
|
64
|
+
# Writes the in-memory definition out to disk.
|
65
|
+
def update
|
66
|
+
File.open( @path, "w" ) do |file|
|
67
|
+
file.puts @definition.to_yaml
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
# =========
|
72
|
+
# = Paths =
|
73
|
+
# =========
|
74
|
+
|
75
|
+
# @param [String] name The asset's name.
|
76
|
+
#
|
77
|
+
# @return [String] Path to the packaged asset file.
|
78
|
+
def asset_path( name )
|
79
|
+
file_name = "#{name}.#{self.suffix}"
|
80
|
+
File.join( self.destination_root, file_name )
|
81
|
+
end
|
82
|
+
|
83
|
+
# @param [String] name Name of the asset.
|
84
|
+
#
|
85
|
+
# @return [Array<String>] Ordered list of the files that comprise the given
|
86
|
+
# asset.
|
87
|
+
def asset_component_paths( name )
|
88
|
+
spec = self.assets[name]
|
89
|
+
|
90
|
+
if spec.nil?
|
91
|
+
raise Rapper::Errors::InvalidAssetName,
|
92
|
+
"'#{name}' is not a valid #{@type} asset. Make sure it is defined in the definition file."
|
93
|
+
end
|
94
|
+
|
95
|
+
( spec["files"] || [] ).map do |file|
|
96
|
+
file_name = "#{file}.#{self.suffix}"
|
97
|
+
File.join( self.source_root, file_name )
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
private
|
102
|
+
|
103
|
+
# @param [Object] key Key to search for.
|
104
|
+
#
|
105
|
+
# @param [Array<Hash>] array Array of Hash object to search in.
|
106
|
+
#
|
107
|
+
# @return [Object,nil] The first value found for the key or nil of nothing
|
108
|
+
# was found.
|
109
|
+
def first_key_value( key, array )
|
110
|
+
hash = array.find { |h| h.keys.include? key }
|
111
|
+
hash ? hash[key] : nil
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
data/lib/rapper/errors.rb
CHANGED
@@ -10,11 +10,6 @@ module Rapper
|
|
10
10
|
# environment.
|
11
11
|
class NoDefinitionRoot < StandardError; end
|
12
12
|
|
13
|
-
# Raised when an invalid definition type param is used. An invalid
|
14
|
-
# definition type is one that doesn't have a definition YAML file in the
|
15
|
-
# "definition_root" folder (set in the config).
|
16
|
-
class InvalidDefinitionType < StandardError; end
|
17
|
-
|
18
13
|
# Raised when an invalid asset name param is used. An invalid asset name
|
19
14
|
# is one not defined in a given definition file.
|
20
15
|
class InvalidAssetName < StandardError; end
|
data/lib/rapper/utils.rb
CHANGED
@@ -4,67 +4,11 @@ module Rapper
|
|
4
4
|
|
5
5
|
protected
|
6
6
|
|
7
|
-
# =========
|
8
|
-
# = Paths =
|
9
|
-
# =========
|
10
|
-
|
11
|
-
# @param [String] type Asset type.
|
12
|
-
#
|
13
|
-
# @return [String] Path to the definition file for the given asset type.
|
14
|
-
def definition_path( type )
|
15
|
-
File.join( get_config( "definition_root" ), "#{type}.yml")
|
16
|
-
end
|
17
|
-
|
18
|
-
# @param [String] type Asset type.
|
19
|
-
#
|
20
|
-
# @param [String] name Name of the asset.
|
21
|
-
#
|
22
|
-
# @return [String] Path to the packaged asset file for the given type and
|
23
|
-
# name.
|
24
|
-
def asset_path( type, name )
|
25
|
-
if @definitions[type].nil?
|
26
|
-
raise Rapper::Errors::InvalidDefinitionType,
|
27
|
-
"'#{type}' is not a defined asset type."
|
28
|
-
end
|
29
|
-
|
30
|
-
file_name = "#{name}.#{@definitions[type]["suffix"]}"
|
31
|
-
|
32
|
-
File.join( @definitions[type]["destination_root"], file_name )
|
33
|
-
end
|
34
|
-
|
35
|
-
# @param [String] type Asset type.
|
36
|
-
#
|
37
|
-
# @param [String] name Name of the asset.
|
38
|
-
#
|
39
|
-
# @return [Array<String>] Ordered list of asset component file paths.
|
40
|
-
def asset_component_paths( type, name )
|
41
|
-
if @definitions[type].nil?
|
42
|
-
raise Rapper::Errors::InvalidDefinitionType,
|
43
|
-
"'#{type}' is not a defined asset type."
|
44
|
-
end
|
45
|
-
|
46
|
-
spec = first_hash_with_key( name, @definitions[type]["assets"] )
|
47
|
-
|
48
|
-
if spec.nil?
|
49
|
-
raise Rapper::Errors::InvalidAssetName,
|
50
|
-
"'#{name}' is not a valid #{type} asset. Make sure it is defined in the definition file."
|
51
|
-
end
|
52
|
-
|
53
|
-
source_root = @definitions[type]["source_root"]
|
54
|
-
suffix = @definitions[type]["suffix"]
|
55
|
-
files = first_hash_with_key( "files", spec.values.first )["files"] || []
|
56
|
-
|
57
|
-
files.map do |file|
|
58
|
-
file_name = "#{file}.#{suffix}"
|
59
|
-
File.join( source_root, file_name )
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
7
|
# =========
|
64
8
|
# = Files =
|
65
9
|
# =========
|
66
10
|
|
67
|
-
#
|
11
|
+
# Concatenate one or more files. Uses <code>cat</code>.
|
68
12
|
#
|
69
13
|
# @param [Array<String>,String] source_files A path or array of paths to
|
70
14
|
# files to concatenate.
|
@@ -75,18 +19,5 @@ module Rapper
|
|
75
19
|
system "cat #{source_files} > #{destination_file}"
|
76
20
|
end
|
77
21
|
|
78
|
-
# =========
|
79
|
-
# = Misc. =
|
80
|
-
# =========
|
81
|
-
|
82
|
-
# @param [Object] key Key to search for.
|
83
|
-
#
|
84
|
-
# @param [Array<Hash>] array Array of Hash object to search in.
|
85
|
-
#
|
86
|
-
# @return [Hash] First hash with the given key.
|
87
|
-
def first_hash_with_key( key, array )
|
88
|
-
array.find { |h| h.keys.include? key }
|
89
|
-
end
|
90
|
-
|
91
22
|
end
|
92
23
|
end
|
data/lib/rapper/versioning.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'digest/md5'
|
2
|
+
require 'tempfile'
|
2
3
|
|
3
4
|
module Rapper
|
4
5
|
# Asset versioning methods.
|
@@ -6,6 +7,20 @@ module Rapper
|
|
6
7
|
|
7
8
|
protected
|
8
9
|
|
10
|
+
# @param [String] type The asset type.
|
11
|
+
#
|
12
|
+
# @param [String] name The name of the asset.
|
13
|
+
#
|
14
|
+
# @return [Boolean] True if the asset needs re-packaging, false otherwise.
|
15
|
+
def needs_packaging?( type, name )
|
16
|
+
definition = @definitions[type]
|
17
|
+
destination_file = definition.asset_path( name )
|
18
|
+
return true unless File.exists?( destination_file )
|
19
|
+
current_version = definition.assets[name]["version"]
|
20
|
+
new_version = version( type, name )
|
21
|
+
new_version != current_version
|
22
|
+
end
|
23
|
+
|
9
24
|
# Refresh the version hashes for the given asset types. If no arguments are
|
10
25
|
# passed, version hashes for all asset types will be updated.
|
11
26
|
#
|
@@ -16,21 +31,25 @@ module Rapper
|
|
16
31
|
log :info, "Refreshing versions for #{types.join( ', ' )}"
|
17
32
|
|
18
33
|
types.each do |type|
|
19
|
-
@definitions[type]
|
20
|
-
|
21
|
-
|
22
|
-
path = asset_path( type, name )
|
23
|
-
version = version( path )
|
24
|
-
first_hash_with_key( "version", spec )["version"] = version
|
34
|
+
@definitions[type].assets.each do |name, spec|
|
35
|
+
version = version( type, name )
|
36
|
+
@definitions[type].set_version( name, version )
|
25
37
|
end
|
26
38
|
end
|
27
39
|
end
|
28
40
|
|
29
|
-
# @param [String]
|
41
|
+
# @param [String] type The asset type.
|
42
|
+
#
|
43
|
+
# @param [String] name The name of the asset.
|
30
44
|
#
|
31
|
-
# @return [String] A four-character
|
32
|
-
def version(
|
33
|
-
|
45
|
+
# @return [String] A four-character version hash for the given asset.
|
46
|
+
def version( type, name )
|
47
|
+
source_files = @definitions[type].asset_component_paths( name )
|
48
|
+
destination_file = Tempfile.new( 'rapper' )
|
49
|
+
join_files( source_files, destination_file.path )
|
50
|
+
version = Digest::MD5.file( destination_file.path ).to_s[0,4]
|
51
|
+
destination_file.unlink
|
52
|
+
version
|
34
53
|
end
|
35
54
|
|
36
55
|
end
|
data/rapper.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{rapper}
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.3"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Tyson Tate"]
|
12
|
-
s.date = %q{2011-02-
|
12
|
+
s.date = %q{2011-02-19}
|
13
13
|
s.description = %q{Static asset packager and compressor with versioning and built-in view helpers. Easy to configure, easy to use, and easy to ignore when you want to. No crazy JavaScript comment DSLs, either.}
|
14
14
|
s.email = %q{tyson@tysontate.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -28,6 +28,7 @@ Gem::Specification.new do |s|
|
|
28
28
|
"lib/rapper.rb",
|
29
29
|
"lib/rapper/compressors.rb",
|
30
30
|
"lib/rapper/config.rb",
|
31
|
+
"lib/rapper/definition.rb",
|
31
32
|
"lib/rapper/errors.rb",
|
32
33
|
"lib/rapper/logging.rb",
|
33
34
|
"lib/rapper/utils.rb",
|
@@ -37,7 +38,6 @@ Gem::Specification.new do |s|
|
|
37
38
|
"spec/fixtures/config/assets.yml",
|
38
39
|
"spec/fixtures/config/assets/base/javascripts.yml",
|
39
40
|
"spec/fixtures/config/assets/base/stylesheets.yml",
|
40
|
-
"spec/fixtures/config/assets/base/validators.yml",
|
41
41
|
"spec/fixtures/javascripts/simple_1.js",
|
42
42
|
"spec/fixtures/javascripts/simple_2.js",
|
43
43
|
"spec/fixtures/stylesheets/simple_1.css",
|
@@ -117,7 +117,7 @@ Gem::Specification.new do |s|
|
|
117
117
|
s.homepage = %q{http://tysontate.github.com/rapper/}
|
118
118
|
s.licenses = ["MIT"]
|
119
119
|
s.require_paths = ["lib"]
|
120
|
-
s.rubygems_version = %q{1.
|
120
|
+
s.rubygems_version = %q{1.4.2}
|
121
121
|
s.summary = %q{Static asset packager and compressor with versioning and built-in view helpers.}
|
122
122
|
s.test_files = [
|
123
123
|
"spec/rapper_spec.rb",
|
@@ -126,7 +126,6 @@ Gem::Specification.new do |s|
|
|
126
126
|
]
|
127
127
|
|
128
128
|
if s.respond_to? :specification_version then
|
129
|
-
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
130
129
|
s.specification_version = 3
|
131
130
|
|
132
131
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
@@ -1,12 +1,14 @@
|
|
1
|
-
---
|
1
|
+
---
|
2
2
|
- source_root: spec/fixtures/javascripts
|
3
|
-
- destination_root:
|
3
|
+
- destination_root: tmp
|
4
4
|
- suffix: js
|
5
|
-
- assets:
|
5
|
+
- assets:
|
6
6
|
- single_file:
|
7
7
|
- files:
|
8
|
-
-
|
8
|
+
- simple_1
|
9
|
+
- version: 0
|
9
10
|
- multiple_files:
|
10
11
|
- files:
|
11
|
-
-
|
12
|
-
-
|
12
|
+
- simple_1
|
13
|
+
- simple_2
|
14
|
+
- version: 0
|
@@ -1,10 +1,14 @@
|
|
1
|
-
---
|
1
|
+
---
|
2
2
|
- source_root: spec/fixtures/stylesheets
|
3
|
-
- destination_root:
|
3
|
+
- destination_root: tmp
|
4
4
|
- suffix: css
|
5
|
-
- assets:
|
6
|
-
-
|
5
|
+
- assets:
|
6
|
+
- single_file:
|
7
7
|
- files:
|
8
|
-
-
|
9
|
-
|
10
|
-
|
8
|
+
- simple_1
|
9
|
+
- version: 0
|
10
|
+
- multiple_files:
|
11
|
+
- files:
|
12
|
+
- simple_1
|
13
|
+
- simple_2
|
14
|
+
- version: 0
|
data/spec/rapper_spec.rb
CHANGED
@@ -48,12 +48,22 @@ describe Rapper do
|
|
48
48
|
|
49
49
|
it "loads asset definitions" do
|
50
50
|
rapper = Rapper::Engine.new( "spec/fixtures/config/assets.yml", "test" )
|
51
|
-
rapper.send( :asset_types ).sort.should == ["javascripts", "stylesheets"
|
52
|
-
rapper.definitions["
|
53
|
-
rapper.definitions["stylesheets"]
|
54
|
-
|
55
|
-
rapper.definitions["
|
56
|
-
rapper.definitions["
|
51
|
+
rapper.send( :asset_types ).sort.should == ["javascripts", "stylesheets"]
|
52
|
+
rapper.definitions["javascripts"].should be_a( Rapper::Definition )
|
53
|
+
rapper.definitions["stylesheets"].should be_a( Rapper::Definition )
|
54
|
+
rapper.definitions["javascripts"].source_root.should == "spec/fixtures/javascripts"
|
55
|
+
rapper.definitions["javascripts"].destination_root.should == "tmp"
|
56
|
+
rapper.definitions["javascripts"].suffix.should == "js"
|
57
|
+
rapper.definitions["javascripts"].assets.should == {
|
58
|
+
"single_file"=>{
|
59
|
+
"files"=>["simple_1"],
|
60
|
+
"version"=>0
|
61
|
+
},
|
62
|
+
"multiple_files"=>{
|
63
|
+
"files"=>["simple_1", "simple_2"],
|
64
|
+
"version"=>0
|
65
|
+
}
|
66
|
+
}
|
57
67
|
end
|
58
68
|
end
|
59
69
|
|
@@ -92,6 +102,30 @@ describe Rapper do
|
|
92
102
|
end
|
93
103
|
end
|
94
104
|
|
105
|
+
describe "versioning" do
|
106
|
+
it "uses the concatenated file to calculate versions" do
|
107
|
+
rapper = Rapper::Engine.new( "spec/fixtures/config/assets.yml", "test" )
|
108
|
+
rapper.send( :refresh_versions )
|
109
|
+
rapper.definitions["javascripts"].assets["single_file"].should == {
|
110
|
+
"files"=>["simple_1"],
|
111
|
+
"version"=>"98bc"
|
112
|
+
}
|
113
|
+
rapper.definitions["javascripts"].assets["multiple_files"].should == {
|
114
|
+
"files"=>["simple_1", "simple_2"],
|
115
|
+
"version"=>"f3d9"
|
116
|
+
}
|
117
|
+
end
|
118
|
+
|
119
|
+
it "doesn't re-package assets that don't need re-packaging" do
|
120
|
+
rapper = Rapper::Engine.new( "spec/fixtures/config/assets.yml", "test" )
|
121
|
+
rapper.stub!( :update_definitions ).and_return( nil ) # Block definition updating
|
122
|
+
rapper.package
|
123
|
+
|
124
|
+
rapper.should_not_receive( :compress )
|
125
|
+
rapper.package
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
95
129
|
describe "packaging test cases" do
|
96
130
|
Dir["spec/fixtures/test_cases/*"].each do |folder|
|
97
131
|
next unless File.directory?( folder )
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rapper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 25
|
5
|
+
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 3
|
10
|
+
version: 0.0.3
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Tyson Tate
|
@@ -15,13 +15,13 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-02-
|
18
|
+
date: 2011-02-19 00:00:00 -08:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
22
|
-
type: :runtime
|
23
22
|
prerelease: false
|
24
23
|
name: closure-compiler
|
24
|
+
type: :runtime
|
25
25
|
version_requirements: &id001 !ruby/object:Gem::Requirement
|
26
26
|
none: false
|
27
27
|
requirements:
|
@@ -35,9 +35,9 @@ dependencies:
|
|
35
35
|
version: 1.0.0
|
36
36
|
requirement: *id001
|
37
37
|
- !ruby/object:Gem::Dependency
|
38
|
-
type: :development
|
39
38
|
prerelease: false
|
40
39
|
name: rspec
|
40
|
+
type: :development
|
41
41
|
version_requirements: &id002 !ruby/object:Gem::Requirement
|
42
42
|
none: false
|
43
43
|
requirements:
|
@@ -51,9 +51,9 @@ dependencies:
|
|
51
51
|
version: 1.3.1
|
52
52
|
requirement: *id002
|
53
53
|
- !ruby/object:Gem::Dependency
|
54
|
-
type: :development
|
55
54
|
prerelease: false
|
56
55
|
name: yard
|
56
|
+
type: :development
|
57
57
|
version_requirements: &id003 !ruby/object:Gem::Requirement
|
58
58
|
none: false
|
59
59
|
requirements:
|
@@ -67,9 +67,9 @@ dependencies:
|
|
67
67
|
version: 0.6.4
|
68
68
|
requirement: *id003
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
|
-
type: :development
|
71
70
|
prerelease: false
|
72
71
|
name: bluecloth
|
72
|
+
type: :development
|
73
73
|
version_requirements: &id004 !ruby/object:Gem::Requirement
|
74
74
|
none: false
|
75
75
|
requirements:
|
@@ -83,9 +83,9 @@ dependencies:
|
|
83
83
|
version: 2.0.10
|
84
84
|
requirement: *id004
|
85
85
|
- !ruby/object:Gem::Dependency
|
86
|
-
type: :development
|
87
86
|
prerelease: false
|
88
87
|
name: bundler
|
88
|
+
type: :development
|
89
89
|
version_requirements: &id005 !ruby/object:Gem::Requirement
|
90
90
|
none: false
|
91
91
|
requirements:
|
@@ -99,9 +99,9 @@ dependencies:
|
|
99
99
|
version: 1.0.0
|
100
100
|
requirement: *id005
|
101
101
|
- !ruby/object:Gem::Dependency
|
102
|
-
type: :development
|
103
102
|
prerelease: false
|
104
103
|
name: jeweler
|
104
|
+
type: :development
|
105
105
|
version_requirements: &id006 !ruby/object:Gem::Requirement
|
106
106
|
none: false
|
107
107
|
requirements:
|
@@ -115,9 +115,9 @@ dependencies:
|
|
115
115
|
version: 1.5.2
|
116
116
|
requirement: *id006
|
117
117
|
- !ruby/object:Gem::Dependency
|
118
|
-
type: :runtime
|
119
118
|
prerelease: false
|
120
119
|
name: closure-compiler
|
120
|
+
type: :runtime
|
121
121
|
version_requirements: &id007 !ruby/object:Gem::Requirement
|
122
122
|
none: false
|
123
123
|
requirements:
|
@@ -131,9 +131,9 @@ dependencies:
|
|
131
131
|
version: 1.0.0
|
132
132
|
requirement: *id007
|
133
133
|
- !ruby/object:Gem::Dependency
|
134
|
-
type: :development
|
135
134
|
prerelease: false
|
136
135
|
name: rspec
|
136
|
+
type: :development
|
137
137
|
version_requirements: &id008 !ruby/object:Gem::Requirement
|
138
138
|
none: false
|
139
139
|
requirements:
|
@@ -147,9 +147,9 @@ dependencies:
|
|
147
147
|
version: 1.3.1
|
148
148
|
requirement: *id008
|
149
149
|
- !ruby/object:Gem::Dependency
|
150
|
-
type: :development
|
151
150
|
prerelease: false
|
152
151
|
name: yard
|
152
|
+
type: :development
|
153
153
|
version_requirements: &id009 !ruby/object:Gem::Requirement
|
154
154
|
none: false
|
155
155
|
requirements:
|
@@ -163,9 +163,9 @@ dependencies:
|
|
163
163
|
version: 0.6.4
|
164
164
|
requirement: *id009
|
165
165
|
- !ruby/object:Gem::Dependency
|
166
|
-
type: :development
|
167
166
|
prerelease: false
|
168
167
|
name: bluecloth
|
168
|
+
type: :development
|
169
169
|
version_requirements: &id010 !ruby/object:Gem::Requirement
|
170
170
|
none: false
|
171
171
|
requirements:
|
@@ -179,9 +179,9 @@ dependencies:
|
|
179
179
|
version: 2.0.10
|
180
180
|
requirement: *id010
|
181
181
|
- !ruby/object:Gem::Dependency
|
182
|
-
type: :development
|
183
182
|
prerelease: false
|
184
183
|
name: bundler
|
184
|
+
type: :development
|
185
185
|
version_requirements: &id011 !ruby/object:Gem::Requirement
|
186
186
|
none: false
|
187
187
|
requirements:
|
@@ -195,9 +195,9 @@ dependencies:
|
|
195
195
|
version: 1.0.0
|
196
196
|
requirement: *id011
|
197
197
|
- !ruby/object:Gem::Dependency
|
198
|
-
type: :development
|
199
198
|
prerelease: false
|
200
199
|
name: jeweler
|
200
|
+
type: :development
|
201
201
|
version_requirements: &id012 !ruby/object:Gem::Requirement
|
202
202
|
none: false
|
203
203
|
requirements:
|
@@ -231,6 +231,7 @@ files:
|
|
231
231
|
- lib/rapper.rb
|
232
232
|
- lib/rapper/compressors.rb
|
233
233
|
- lib/rapper/config.rb
|
234
|
+
- lib/rapper/definition.rb
|
234
235
|
- lib/rapper/errors.rb
|
235
236
|
- lib/rapper/logging.rb
|
236
237
|
- lib/rapper/utils.rb
|
@@ -240,7 +241,6 @@ files:
|
|
240
241
|
- spec/fixtures/config/assets.yml
|
241
242
|
- spec/fixtures/config/assets/base/javascripts.yml
|
242
243
|
- spec/fixtures/config/assets/base/stylesheets.yml
|
243
|
-
- spec/fixtures/config/assets/base/validators.yml
|
244
244
|
- spec/fixtures/javascripts/simple_1.js
|
245
245
|
- spec/fixtures/javascripts/simple_2.js
|
246
246
|
- spec/fixtures/stylesheets/simple_1.css
|
@@ -346,7 +346,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
346
346
|
requirements: []
|
347
347
|
|
348
348
|
rubyforge_project:
|
349
|
-
rubygems_version: 1.
|
349
|
+
rubygems_version: 1.4.2
|
350
350
|
signing_key:
|
351
351
|
specification_version: 3
|
352
352
|
summary: Static asset packager and compressor with versioning and built-in view helpers.
|