rapper 0.0.2 → 0.0.3
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.
- 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.
|