jake 0.9.3 → 1.0.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.
- data/History.txt +41 -3
- data/Manifest.txt +22 -0
- data/README.txt +231 -61
- data/Rakefile +2 -2
- data/bin/jake +15 -1
- data/lib/jake.rb +44 -20
- data/lib/jake/build.rb +44 -12
- data/lib/jake/buildable.rb +30 -10
- data/lib/jake/bundle.rb +7 -0
- data/lib/jake/helper.rb +15 -0
- data/lib/jake/package.rb +8 -6
- data/test/Jakefile +22 -0
- data/test/expected/LISTING +10 -0
- data/test/expected/README +1 -0
- data/test/expected/basic-min.js +7 -0
- data/test/expected/basic.js +14 -0
- data/test/expected/combo/box-min.js +8 -0
- data/test/expected/combo/box.js +28 -0
- data/test/expected/ext-min.js +7 -0
- data/test/expected/ext.js +17 -0
- data/test/expected/sub/dir/foo-min.js +7 -0
- data/test/expected/sub/dir/foo.js +15 -0
- data/test/expected/sub/path/bar-min.js +3 -0
- data/test/expected/sub/path/bar.js +5 -0
- data/test/jake.yml +38 -0
- data/test/packages.erb +8 -0
- data/test/src/basic-ext.js +2 -0
- data/test/src/basic.js +9 -0
- data/test/src/foo/bar.js +4 -0
- data/test/src/foo/foo.js +10 -0
- data/test/src/head.js +6 -0
- data/test/src/head2.js +7 -0
- data/test/test_jake.rb +29 -0
- metadata +42 -8
data/History.txt
CHANGED
@@ -1,6 +1,44 @@
|
|
1
|
-
=== 1.0.0 /
|
1
|
+
=== 1.0.0 / 2009-07-06
|
2
2
|
|
3
|
-
*
|
3
|
+
* A proper test suite is now in place.
|
4
4
|
|
5
|
-
|
5
|
+
* Helper methods and event hooks and are now separated. Use `jake_helper`
|
6
|
+
and `jake_hook` instead of just `jake`.
|
7
|
+
|
8
|
+
* :after_build event is now called :build_complete, and we added
|
9
|
+
a :file_created event that is called whenever a new package file is
|
10
|
+
written to disk.
|
11
|
+
|
12
|
+
* Metadata can be added to packages using the :meta option. This
|
13
|
+
data is available as Package#meta inside event hooks.
|
14
|
+
|
15
|
+
* Erubis is now used instead of ERB if available.
|
16
|
+
|
17
|
+
|
18
|
+
=== 0.9.3 / 2009-05-10
|
19
|
+
|
20
|
+
* Adds an 'extends' option to packages to allow one package to
|
21
|
+
inherit config from another. Useful for making packages that include
|
22
|
+
all the files from another, plus a few extras.
|
23
|
+
|
24
|
+
* Helper methods have access to commandline input via `options`.
|
25
|
+
|
26
|
+
|
27
|
+
=== 0.9.2 / 2008-11-14
|
28
|
+
|
29
|
+
* Allows '-min' suffixes to be omitted.
|
30
|
+
|
31
|
+
* Supports use of ERB in the jake.yml file to generate configs.
|
32
|
+
|
33
|
+
|
34
|
+
=== 0.9.1 / 2008-09-11
|
35
|
+
|
36
|
+
* Adds ERB support to header files.
|
37
|
+
|
38
|
+
|
39
|
+
=== 0.9.0 / 2008-09-11
|
40
|
+
|
41
|
+
* First release, supports packages, bundles, ERB code generation.
|
42
|
+
|
43
|
+
* Supports :after_build event hook for post-build tasks.
|
6
44
|
|
data/Manifest.txt
CHANGED
@@ -4,8 +4,30 @@ README.txt
|
|
4
4
|
Rakefile
|
5
5
|
bin/jake
|
6
6
|
lib/jake.rb
|
7
|
+
lib/jake/helper.rb
|
7
8
|
lib/jake/build.rb
|
8
9
|
lib/jake/buildable.rb
|
9
10
|
lib/jake/package.rb
|
10
11
|
lib/jake/bundle.rb
|
11
12
|
test/test_jake.rb
|
13
|
+
test/jake.yml
|
14
|
+
test/Jakefile
|
15
|
+
test/packages.erb
|
16
|
+
test/expected/combo/box.js
|
17
|
+
test/expected/combo/box-min.js
|
18
|
+
test/expected/sub/dir/foo.js
|
19
|
+
test/expected/sub/dir/foo-min.js
|
20
|
+
test/expected/sub/path/bar.js
|
21
|
+
test/expected/sub/path/bar-min.js
|
22
|
+
test/expected/basic.js
|
23
|
+
test/expected/basic-min.js
|
24
|
+
test/expected/ext.js
|
25
|
+
test/expected/ext-min.js
|
26
|
+
test/expected/LISTING
|
27
|
+
test/expected/README
|
28
|
+
test/src/foo/bar.js
|
29
|
+
test/src/foo/foo.js
|
30
|
+
test/src/basic.js
|
31
|
+
test/src/basic-ext.js
|
32
|
+
test/src/head.js
|
33
|
+
test/src/head2.js
|
data/README.txt
CHANGED
@@ -2,97 +2,267 @@
|
|
2
2
|
|
3
3
|
* http://github.com/jcoglan/jake
|
4
4
|
|
5
|
-
|
5
|
+
Jake is a command line tool for building JavaScript packages from source
|
6
|
+
code. Using simple YAML config files, you can specify any number of build
|
7
|
+
files to be generated by concatenating and minifying groups of source files.
|
8
|
+
It allows ERB to be used inside source files to generate code, and provides
|
9
|
+
event hooks into the build process so you can extend it for your own needs.
|
6
10
|
|
7
|
-
Jake is a tool for building JavaScript library packages from source code. It allows
|
8
|
-
builds to be specified using simple YAML files, and provides a command-line tool for
|
9
|
-
generating package files. It also allows ERB to be embedded in JavaScript source code
|
10
|
-
so that build data or new code can be generated during the build process.
|
11
11
|
|
12
12
|
== Features
|
13
13
|
|
14
|
-
*
|
15
|
-
*
|
16
|
-
*
|
17
|
-
*
|
18
|
-
*
|
19
|
-
*
|
14
|
+
* Concatenate and minify groups of source files for distribution
|
15
|
+
* Configured using simple YAML files
|
16
|
+
* Easily generate multiple distros with different compression settings
|
17
|
+
* Use ERB templating to generate source code
|
18
|
+
* Extensible using Ruby/ERB and event hooks during the build process
|
19
|
+
* Tested on Ruby 1.8.6, 1.8.7, 1.9.1
|
20
20
|
|
21
|
-
== Usage
|
22
21
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
directory). If you use a Jakefile, place this in the same directory.
|
22
|
+
== Installation
|
23
|
+
|
24
|
+
sudo gem install jake
|
27
25
|
|
28
|
-
This example <tt>jake.yml</tt> demonstrates the layout of the file:
|
29
26
|
|
30
|
-
|
31
|
-
|
32
|
-
|
27
|
+
== Usage
|
28
|
+
|
29
|
+
To begin with, create a file called <tt>jake.yml</tt> in the root directory
|
30
|
+
of your project; you will run the +jake+ command from here. A basic config
|
31
|
+
looks like this:
|
32
|
+
|
33
|
+
---
|
34
|
+
source_directory: source
|
35
|
+
build_directory: build
|
36
|
+
|
37
|
+
layout: together
|
38
|
+
|
33
39
|
header: COPYRIGHT
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
40
|
+
|
41
|
+
builds:
|
42
|
+
src:
|
43
|
+
packer: false
|
44
|
+
min:
|
45
|
+
shrink_vars: true
|
46
|
+
private: true
|
38
47
|
|
39
48
|
packages:
|
40
|
-
|
49
|
+
[ DESCRIBED BELOW ]
|
50
|
+
|
51
|
+
* +source_directory+ is the directory relative to <tt>jake.yml</tt> where
|
52
|
+
your source files are, and +build_directory+ is where all the generated
|
53
|
+
build files will be placed.
|
54
|
+
* +layout+ describes whether files from separate builds should go in
|
55
|
+
separate directories. For example if you have a package called +foo+,
|
56
|
+
with the above config the +together+ layout will generate
|
57
|
+
<tt>build/foo-src.js</tt> and <tt>build/foo-min.js</tt>, whereas a
|
58
|
+
+layout+ value of +apart+ will generate <tt>build/src/foo.js</tt> and
|
59
|
+
<tt>build/min/foo.js</tt>.
|
60
|
+
* +header+ specifies a file whose content should appear at the top of
|
61
|
+
all generated build files. The content of this file will typically be
|
62
|
+
JavaScript comments containing copyright and license information. This
|
63
|
+
content is never minified. The +header+ option may be omitted.
|
64
|
+
|
65
|
+
|
66
|
+
=== Build listing
|
67
|
+
|
68
|
+
The build listing, given by the +builds+ option in the config file, lists
|
69
|
+
all the builds you want to produce for distribution, and what minification
|
70
|
+
settings each build should use. JavaScript projects typically distribute
|
71
|
+
both compressed and uncompressed copies of their code to suit both production
|
72
|
+
and development environments.
|
73
|
+
|
74
|
+
You can have as many builds as you like and the names are up to you. I'm
|
75
|
+
using +src+ and +min+ as readily understood examples. Each build may specify
|
76
|
+
some combination of the following options:
|
77
|
+
|
78
|
+
* <tt>packer: false</tt> - disables minification for this build. This
|
79
|
+
precludes use of further minification options.
|
80
|
+
* <tt>shrink_vars: true</tt> - tells the minifier to compress local
|
81
|
+
variable names inside functions.
|
82
|
+
* <tt>private: true</tt> - tells the minifier to obfuscate 'private'
|
83
|
+
variables with numeric replacements. JavaScript convention is that any
|
84
|
+
name beginning with an underscore, e.g. <tt>_foo</tt> or <tt>obj._bar</tt>
|
85
|
+
should be considered private. They are replaced with <tt>_0</tt>,
|
86
|
+
<tt>_1</tt>, etc.
|
87
|
+
* <tt>base62: true</tt> - produces base-62 encoded minification.
|
88
|
+
* <tt>suffix: false</tt> - files from this build should not have a
|
89
|
+
suffix if using the +together+ layout, so you get <tt>build/foo.js</tt>
|
90
|
+
rather than <tt>build/foo-src.js</tt>, for example. Only one build
|
91
|
+
may use this option, otherwise file name clashes will occur.
|
92
|
+
|
93
|
+
|
94
|
+
=== Package listing
|
95
|
+
|
96
|
+
The package listing, given under the +packages+ config option, describes
|
97
|
+
the packages you want to produce and which source files are used to generate
|
98
|
+
them. A package is named using the path under +build_directory+ where it
|
99
|
+
should be generated, e.g. <tt>foo</tt> or <tt>ext/awesome</tt> (you may
|
100
|
+
omit the <tt>.js</tt> extension). Each package lists one or more source
|
101
|
+
files used to build it, and may optionally list some extra options as described
|
102
|
+
below.
|
103
|
+
|
104
|
+
For the examples, assume the source directory is +src+ and the build
|
105
|
+
directory is +dist+. This package uses a single source file <tt>src/foo.js</tt>
|
106
|
+
and generates <tt>dist/foo_dist.js</tt>:
|
107
|
+
|
108
|
+
foo_dist: foo
|
109
|
+
|
110
|
+
This package generates <tt>dist/bar.js</tt> from <tt>src/bar1.js</tt> and
|
111
|
+
<tt>src/bar2.js</tt>
|
112
|
+
|
113
|
+
bar:
|
114
|
+
- bar1
|
115
|
+
- bar2
|
116
|
+
|
117
|
+
This generates a package at <tt>dist/sub/dir.js</tt> from <tt>src/path/file.js</tt>
|
118
|
+
and <tt>src/path/baz.js</tt>:
|
119
|
+
|
120
|
+
sub/dir:
|
121
|
+
- path/file
|
122
|
+
- path/baz
|
123
|
+
|
124
|
+
If all the source files for a package live in the same subdirectory, you
|
125
|
+
can tidy things up using the +directory+ option. If you use any package-level
|
126
|
+
options, you must list the files under the +files+ option (the above examples
|
127
|
+
are just syntactic shorthands for this):
|
128
|
+
|
129
|
+
sub/dir:
|
130
|
+
directory: path
|
131
|
+
files:
|
132
|
+
- file
|
133
|
+
- baz
|
134
|
+
|
135
|
+
The full list of package options is as follows:
|
136
|
+
|
137
|
+
* +files+ - lists the source files used to build the package. Shorthand may
|
138
|
+
be used as above if no further options are used.
|
139
|
+
* +extends+ - name of another package from which to inherit configuration.
|
140
|
+
Useful for making a package that includes all the files from another,]
|
141
|
+
plus a few extras.
|
142
|
+
* +directory+ - the directory under +source_directory+ in which to find
|
143
|
+
source files. May be omitted.
|
144
|
+
* +header+ - a custom header file to use on this package. Overrides the
|
145
|
+
root +header+ option. May be omitted.
|
146
|
+
* +packer+ - lists minification settings that override settings being used
|
147
|
+
for the current build. If a build listed above uses <tt>packer: false</tt>,
|
148
|
+
this takes precedence over package-specific instructions. Typically used
|
149
|
+
to override options for the minified build.
|
150
|
+
* +meta+ - should be a YAML dictionary containing arbitrary data useful to
|
151
|
+
user-defined build events. May be omitted. See 'Event hooks' below.
|
152
|
+
|
153
|
+
For example, here's a package listing that uses all the options:
|
154
|
+
|
155
|
+
packages:
|
156
|
+
foo_dist: foo
|
41
157
|
|
42
158
|
bar:
|
43
|
-
-
|
44
|
-
-
|
159
|
+
- bar1
|
160
|
+
- bar2
|
161
|
+
|
162
|
+
sub/whizz:
|
163
|
+
extends: foo_dist
|
164
|
+
directory: path
|
165
|
+
header: CUSTOM_HEADER
|
166
|
+
files:
|
167
|
+
- file1
|
168
|
+
- file2
|
45
169
|
|
46
|
-
|
47
|
-
directory: baz
|
48
|
-
header: COPYRIGHT
|
170
|
+
last:
|
49
171
|
packer:
|
50
|
-
|
172
|
+
private: false
|
173
|
+
meta:
|
174
|
+
requires:
|
175
|
+
- jQuery
|
176
|
+
- GMap2
|
51
177
|
files:
|
52
|
-
-
|
53
|
-
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
my_lib:
|
58
|
-
- foo
|
59
|
-
- bar
|
60
|
-
- baz
|
61
|
-
|
62
|
-
This configuration would match a project layed out as follows:
|
178
|
+
- one_file
|
179
|
+
- another_file
|
180
|
+
|
181
|
+
In conjunction with the build options listed above, this matches the
|
182
|
+
following project layout (omitting build name suffixes for brevity):
|
63
183
|
|
64
|
-
-
|
184
|
+
- build/
|
185
|
+
- sub/
|
186
|
+
- whizz.js
|
65
187
|
- bar.js
|
66
|
-
-
|
67
|
-
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
-
|
72
|
-
-
|
73
|
-
|
74
|
-
|
75
|
-
-
|
76
|
-
- bar_file2.js
|
188
|
+
- foo_dist.js
|
189
|
+
- last.js
|
190
|
+
- source/
|
191
|
+
- path/
|
192
|
+
- CUSTOM_HEADER
|
193
|
+
- file1.js
|
194
|
+
- file2.js
|
195
|
+
- another_file.js
|
196
|
+
- bar1.js
|
197
|
+
- bar2.js
|
77
198
|
- foo.js
|
199
|
+
- one_file.js
|
78
200
|
- COPYRIGHT
|
79
201
|
- jake.yml
|
80
202
|
|
81
|
-
== Requirements
|
82
203
|
|
83
|
-
|
84
|
-
* Oyster
|
85
|
-
* PackR
|
204
|
+
=== Using ERB in source files
|
86
205
|
|
87
|
-
|
206
|
+
Jake lets you use Ruby's ERB templating system within your source code so
|
207
|
+
you can insert values generated from Ruby functions. To use this feature,
|
208
|
+
you need to create a file called <tt>Jakefile</tt> in the root of your project.
|
209
|
+
This contains helper functions that are called in your source code to inject data.
|
210
|
+
|
211
|
+
For example, say you want to extract a version number from your version control
|
212
|
+
system and inject it into your code along with the build name. Your source code
|
213
|
+
should contain something like this:
|
214
|
+
|
215
|
+
MyJavaScriptLib.VERSION = "<%= version %>-<%= build %>";
|
216
|
+
|
217
|
+
And your <tt>Jakefile</tt> should contain a helper called +version+:
|
218
|
+
|
219
|
+
jake_helper :version do
|
220
|
+
# extract version number from svn, git, whatever
|
221
|
+
# e.g. return '1.0'
|
222
|
+
end
|
223
|
+
|
224
|
+
Jake has a built-in helper called +build+ that returns the current build
|
225
|
+
name. When built, the output would contain the following:
|
226
|
+
|
227
|
+
MyJavaScriptLib.VERSION = "1.0-src"; // or "1.0-min" for the 'min' build
|
228
|
+
|
229
|
+
|
230
|
+
=== Event hooks
|
231
|
+
|
232
|
+
The +Jakefile+ may also define event hooks that are fired during a build when
|
233
|
+
interesting things happen. This allows you to extend your build process using
|
234
|
+
configuration data from Jake. All event callbacks are passed a +Build+ object
|
235
|
+
as the first argument, and may receive additional arguments depending on the
|
236
|
+
event type. We currently have two events:
|
237
|
+
|
238
|
+
+file_created+ is fired whenever a new build file is created. The callback is
|
239
|
+
passed the +Buildable+ package object, the current build type (+src+ or +min+
|
240
|
+
using the above examples), and the full path to the newly created file.
|
241
|
+
The package object may contain metadata (set using the +meta+ option, see
|
242
|
+
above) which you can use for further code generation.
|
243
|
+
|
244
|
+
+build_complete+ is fired after a build has finished running, that is after
|
245
|
+
all sets of minification options have been run. At this point you can use any
|
246
|
+
metadata you've gathered to generate more code, copy files to your distribution
|
247
|
+
directory, etc.
|
248
|
+
|
249
|
+
$register = {}
|
250
|
+
|
251
|
+
jake_hook :file_created do |build, pkg, build_type, path|
|
252
|
+
$register[path] = pkg.meta
|
253
|
+
end
|
254
|
+
|
255
|
+
jake_hook :build_complete do |build|
|
256
|
+
FileUtils.cp 'README', build.build_directory + '/README'
|
257
|
+
# generate code from $register
|
258
|
+
end
|
88
259
|
|
89
|
-
* sudo gem install jake -y
|
90
260
|
|
91
261
|
== License
|
92
262
|
|
93
263
|
(The MIT License)
|
94
264
|
|
95
|
-
Copyright (c) 2008 James Coglan
|
265
|
+
Copyright (c) 2008-2009 James Coglan
|
96
266
|
|
97
267
|
Permission is hereby granted, free of charge, to any person obtaining
|
98
268
|
a copy of this software and associated documentation files (the
|
data/Rakefile
CHANGED
@@ -4,10 +4,10 @@ require 'rubygems'
|
|
4
4
|
require 'hoe'
|
5
5
|
require './lib/jake.rb'
|
6
6
|
|
7
|
-
Hoe.
|
7
|
+
Hoe.spec('jake') do |p|
|
8
8
|
# p.rubyforge_name = 'jakex' # if different than lowercase project name
|
9
9
|
p.developer('James Coglan', 'jcoglan@googlemail.com')
|
10
|
-
p.extra_deps = %w(
|
10
|
+
p.extra_deps = %w(eventful packr oyster)
|
11
11
|
end
|
12
12
|
|
13
13
|
# vim: syntax=Ruby
|
data/bin/jake
CHANGED
@@ -27,5 +27,19 @@ begin; opts = spec.parse
|
|
27
27
|
rescue Oyster::HelpRendered; exit
|
28
28
|
end
|
29
29
|
|
30
|
-
|
30
|
+
LOG_FORMAT = "%-020s %-10s %-040s %-07s"
|
31
|
+
|
32
|
+
dir = File.expand_path(opts[:unclaimed].first || '.')
|
33
|
+
build = Jake::Build.new(dir, opts)
|
34
|
+
|
35
|
+
build.on(:file_created) do |build, pkg, build_type, path|
|
36
|
+
size = (File.size(path) / 1024.0).ceil
|
37
|
+
puts LOG_FORMAT % [pkg.name, build_type, path.gsub(dir, ''), "#{ size } kB"]
|
38
|
+
end
|
39
|
+
|
40
|
+
build.on(:file_not_changed) do |build, pkg, build_type, path|
|
41
|
+
puts LOG_FORMAT % [pkg.name, build_type, path.gsub(dir, ''), 'UP-TO-DATE']
|
42
|
+
end
|
43
|
+
|
44
|
+
build.run!
|
31
45
|
|
data/lib/jake.rb
CHANGED
@@ -1,21 +1,45 @@
|
|
1
|
+
require 'erb'
|
2
|
+
require 'fileutils'
|
3
|
+
require 'observer'
|
4
|
+
require 'yaml'
|
5
|
+
require 'rubygems'
|
6
|
+
require 'packr'
|
7
|
+
require 'eventful'
|
8
|
+
|
9
|
+
begin
|
10
|
+
require 'erubis'
|
11
|
+
rescue LoadError
|
12
|
+
end
|
13
|
+
|
1
14
|
module Jake
|
2
|
-
VERSION = '0.
|
15
|
+
VERSION = '1.0.0'
|
3
16
|
|
4
17
|
CONFIG_FILE = 'jake.yml'
|
5
18
|
HELPER_FILE = 'Jakefile'
|
19
|
+
EXTENSION = '.js'
|
6
20
|
|
7
|
-
|
8
|
-
|
9
|
-
|
21
|
+
# Runs a build in the given directory. The directory must contain a jake.yml
|
22
|
+
# file, and may contain a Jakefile. See README for example YAML configurations.
|
23
|
+
def self.build!(path, options = {})
|
24
|
+
build = Build.new(path, options)
|
10
25
|
build.run!
|
11
26
|
end
|
12
27
|
|
28
|
+
# Removes all registered build event hooks.
|
29
|
+
def self.clear_hooks!
|
30
|
+
Build.delete_observers
|
31
|
+
end
|
32
|
+
|
33
|
+
# Returns the contents of the given path, which may be missing a .js extension.
|
13
34
|
def self.read(path)
|
14
35
|
path = File.expand_path(path)
|
15
|
-
path
|
16
|
-
|
36
|
+
[path, "#{path}#{EXTENSION}"].each do |p|
|
37
|
+
return File.read(p).strip if File.file?(p)
|
38
|
+
end
|
39
|
+
return nil
|
17
40
|
end
|
18
41
|
|
42
|
+
# Returns a copy of the given hash with the keys cast to symbols.
|
19
43
|
def self.symbolize_hash(hash, deep = true)
|
20
44
|
hash.inject({}) do |output, (key, value)|
|
21
45
|
value = Jake.symbolize_hash(value) if deep and value.is_a?(Hash)
|
@@ -24,27 +48,27 @@ module Jake
|
|
24
48
|
end
|
25
49
|
end
|
26
50
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
def initialize(options = {})
|
32
|
-
@options = options
|
33
|
-
end
|
34
|
-
|
35
|
-
def scope; binding; end
|
51
|
+
# Returns either an Erubis or ERB instance, depending on what's available.
|
52
|
+
def self.erb(template)
|
53
|
+
defined?(Erubis) ? Erubis::Eruby.new(template) : ERB.new(template)
|
36
54
|
end
|
55
|
+
|
37
56
|
end
|
38
57
|
|
39
|
-
|
40
|
-
|
41
|
-
%w(build buildable package bundle).each do |file|
|
58
|
+
%w(helper build buildable package bundle).each do |file|
|
42
59
|
require File.dirname(__FILE__) + '/jake/' + file
|
43
60
|
end
|
44
61
|
|
45
|
-
|
62
|
+
# Adds a helper method that can be called from ERB.
|
63
|
+
def jake_helper(name, &block)
|
46
64
|
Jake::Helper.class_eval do
|
47
65
|
define_method(name, &block)
|
48
66
|
end
|
49
67
|
end
|
50
|
-
|
68
|
+
alias :jake :jake_helper
|
69
|
+
|
70
|
+
# Registers an event listener that will fire whenever a build is run.
|
71
|
+
def jake_hook(type, &block)
|
72
|
+
Jake::Build.on(type, &block)
|
73
|
+
end
|
74
|
+
|
data/lib/jake/build.rb
CHANGED
@@ -1,22 +1,27 @@
|
|
1
|
-
require 'yaml'
|
2
|
-
require 'fileutils'
|
3
|
-
|
4
1
|
module Jake
|
2
|
+
# A +Build+ encapsulates a single instance of running <tt>Jake.build!</tt>. It
|
3
|
+
# is responsible for running the build and provides access to any configuration
|
4
|
+
# data used to set up the build.
|
5
5
|
class Build
|
6
|
+
include Eventful
|
6
7
|
|
7
8
|
DEFAULT_LAYOUT = 'together'
|
8
9
|
|
9
10
|
include Enumerable
|
10
11
|
attr_reader :helper
|
11
12
|
|
12
|
-
|
13
|
-
|
13
|
+
# Builds are initialized using a directory in which to run the build, and an
|
14
|
+
# options hash. Options are passed through to helper methods in the +options+
|
15
|
+
# object.
|
16
|
+
def initialize(dir, options = {})
|
17
|
+
@dir = File.expand_path(dir)
|
14
18
|
@helper = Helper.new(options)
|
19
|
+
force! if options[:force]
|
15
20
|
|
16
|
-
path
|
17
|
-
yaml
|
21
|
+
path = "#{dir}/#{CONFIG_FILE}"
|
22
|
+
yaml = File.read(path)
|
18
23
|
|
19
|
-
@config = Jake.symbolize_hash(
|
24
|
+
@config = Jake.symbolize_hash( YAML.load(Jake.erb(yaml).result(@helper.scope)) )
|
20
25
|
|
21
26
|
helpers = "#{dir}/#{HELPER_FILE}"
|
22
27
|
load helpers if File.file?(helpers)
|
@@ -34,54 +39,81 @@ module Jake
|
|
34
39
|
end
|
35
40
|
end
|
36
41
|
|
42
|
+
# Yields to the block for each build in the group.
|
37
43
|
def each(&block)
|
38
44
|
@builds.each(&block)
|
39
45
|
end
|
40
46
|
|
47
|
+
# Forces the build to generate new files even if target files appear up-to-date.
|
41
48
|
def force!
|
42
49
|
@forced = true
|
43
50
|
end
|
44
51
|
|
52
|
+
# Returns +true+ iff this is a forced build.
|
45
53
|
def forced?
|
46
|
-
|
54
|
+
defined?(@forced)
|
55
|
+
end
|
56
|
+
|
57
|
+
# Returns a list of names for all packages in the build.
|
58
|
+
def packages
|
59
|
+
list = []
|
60
|
+
@packages.each { |name, pkg| list << name }
|
61
|
+
@bundles.each { |name, pkg| list << name }
|
62
|
+
list
|
47
63
|
end
|
48
64
|
|
65
|
+
# Returns the +Buildable+ with the given name.
|
49
66
|
def package(name)
|
50
67
|
@packages[name.to_sym] || @bundles[name.to_sym]
|
51
68
|
end
|
52
69
|
|
70
|
+
# Runs the build, generating new files in +build_directory+.
|
53
71
|
def run!
|
54
|
-
@
|
55
|
-
|
56
|
-
|
72
|
+
FileUtils.cd(@dir) do
|
73
|
+
@packages.each { |name, pkg| pkg.write! }
|
74
|
+
@bundles.each { |name, pkg| pkg.write! }
|
75
|
+
fire(:build_complete)
|
76
|
+
end
|
57
77
|
end
|
58
78
|
|
79
|
+
# Returns the path to the build directory, where generated files appear.
|
59
80
|
def build_directory
|
60
81
|
"#{ @dir }/#{ @config[:build_directory] || '.' }"
|
61
82
|
end
|
83
|
+
alias :build_dir :build_directory
|
62
84
|
|
85
|
+
# Returns the path to the source directory, where source code is read from.
|
63
86
|
def source_directory
|
64
87
|
"#{ @dir }/#{ @config[:source_directory] || '.' }"
|
65
88
|
end
|
89
|
+
alias :source_dir :source_directory
|
66
90
|
|
91
|
+
# Returns the header string used for the build, or an empty string if no
|
92
|
+
# header file has been set.
|
67
93
|
def header
|
68
94
|
@config[:header] ?
|
69
95
|
Jake.read("#{ source_directory }/#{ @config[:header] }") :
|
70
96
|
""
|
71
97
|
end
|
72
98
|
|
99
|
+
# Returns the minification settings for PackR for the given build name. Each
|
100
|
+
# +Build+ object can build all its packages multiple times with different
|
101
|
+
# minification settings in each run.
|
73
102
|
def packer_settings(build_name)
|
74
103
|
build = @builds[build_name.to_sym]
|
75
104
|
return false unless build
|
76
105
|
build[:packer].nil? ? build : build[:packer]
|
77
106
|
end
|
78
107
|
|
108
|
+
# Returns +true+ iff filename suffixes based on build name should be added
|
109
|
+
# to generated files for the given build name.
|
79
110
|
def use_suffix?(build_name)
|
80
111
|
build = @builds[build_name.to_sym]
|
81
112
|
return true unless build
|
82
113
|
build[:suffix] != false
|
83
114
|
end
|
84
115
|
|
116
|
+
# Returns the name of the layout being used, either +together+ or +apart+.
|
85
117
|
def layout
|
86
118
|
@config[:layout] || DEFAULT_LAYOUT
|
87
119
|
end
|
data/lib/jake/buildable.rb
CHANGED
@@ -1,11 +1,15 @@
|
|
1
|
-
require 'fileutils'
|
2
|
-
require 'packr'
|
3
|
-
|
4
1
|
module Jake
|
2
|
+
# A +Buildable+ represents a group of files that may be merged to form a single
|
3
|
+
# build file. There are two subtypes of +Buildable+; a +Package+ takes several
|
4
|
+
# source files and produces a build file, and a +Bundle+ takes several +Package+
|
5
|
+
# build files to produce another build file. This class should be considered
|
6
|
+
# abstract as some of its methods must be filled in by subtypes.
|
5
7
|
class Buildable
|
6
8
|
|
7
9
|
attr_reader :name
|
8
10
|
|
11
|
+
# Create a new +Buildable+ using a +Build+ container, a name and a configuration
|
12
|
+
# hash, typically a subsection of jake.yml.
|
9
13
|
def initialize(build, name, config)
|
10
14
|
@build, @name = build, name
|
11
15
|
@config = case config
|
@@ -16,17 +20,21 @@ module Jake
|
|
16
20
|
@code = {}
|
17
21
|
end
|
18
22
|
|
23
|
+
# Returns the parent +Buildable+ set using the +extends+ option, or +nil+ if
|
24
|
+
# there is no parent.
|
19
25
|
def parent
|
20
26
|
return nil unless @config[:extends]
|
21
27
|
@parent ||= @build.package(@config[:extends])
|
22
28
|
end
|
23
29
|
|
30
|
+
# Returns the source directory for this package.
|
24
31
|
def directory
|
25
32
|
dir = @config[:directory]
|
26
33
|
return parent.directory if parent && !dir
|
27
34
|
"#{ @build.source_directory }/#{ @config[:directory] }"
|
28
35
|
end
|
29
36
|
|
37
|
+
# Returns the path to the output file from this package for the given build name.
|
30
38
|
def build_path(build_name)
|
31
39
|
suffix = @build.use_suffix?(build_name) ? "-#{ build_name }" : ""
|
32
40
|
@build.layout == 'together' ?
|
@@ -34,6 +42,8 @@ module Jake
|
|
34
42
|
"#{ @build.build_directory }/#{ build_name }/#{ @name }.js"
|
35
43
|
end
|
36
44
|
|
45
|
+
# Returns +true+ if the build file for the given build name is out of date and
|
46
|
+
# should be regenerated.
|
37
47
|
def build_needed?(name)
|
38
48
|
return true if @build.forced?
|
39
49
|
path = build_path(name)
|
@@ -42,13 +52,15 @@ module Jake
|
|
42
52
|
files.any? { |path| File.mtime(path) > build_time }
|
43
53
|
end
|
44
54
|
|
55
|
+
# Returns the header string being used for this package.
|
45
56
|
def header
|
46
57
|
content = @config[:header] ?
|
47
58
|
Jake.read("#{ directory }/#{ @config[:header] }") :
|
48
59
|
(parent ? parent.header : @build.header)
|
49
|
-
|
60
|
+
Jake.erb(content).result(@build.helper.scope).strip
|
50
61
|
end
|
51
62
|
|
63
|
+
# Returns the PackR settings to use for this package during the given build.
|
52
64
|
def packer_settings(build_name)
|
53
65
|
global = @build.packer_settings(build_name)
|
54
66
|
local = @config[:packer]
|
@@ -57,20 +69,28 @@ module Jake
|
|
57
69
|
{}.merge(global || {}).merge(local || {})
|
58
70
|
end
|
59
71
|
|
72
|
+
# Returns a hash containing any metadata attached to the package in the config.
|
73
|
+
def meta
|
74
|
+
@config[:meta] || {}
|
75
|
+
end
|
76
|
+
|
77
|
+
# Generates all the build files for this package by looping over all the
|
78
|
+
# required builds and compressing the source code using each set of minification
|
79
|
+
# options. Files are only generated if they are out of date or the build has
|
80
|
+
# been forced.
|
60
81
|
def write!
|
61
|
-
puts "Package #{@name}..."
|
62
|
-
|
63
82
|
@build.each do |name, settings|
|
64
|
-
next unless build_needed?(name)
|
65
|
-
|
66
|
-
@build.helper.build = name
|
67
83
|
path = build_path(name)
|
84
|
+
@build.fire(:file_not_changed, self, name, path) and next unless build_needed?(name)
|
85
|
+
|
86
|
+
@build.helper.build = name.to_s
|
68
87
|
FileUtils.mkdir_p(File.dirname(path))
|
69
88
|
File.open(path, 'wb') { |f| f.write( (header + "\n\n" + code(name)).strip ) }
|
70
89
|
|
90
|
+
@build.fire(:file_created, self, name, path)
|
91
|
+
|
71
92
|
size = (File.size(path)/1024.0).ceil
|
72
93
|
path = path.sub(@build.build_directory, '')
|
73
|
-
puts " -- build '#{ name }' created #{ path }, #{ size } kb"
|
74
94
|
end
|
75
95
|
end
|
76
96
|
|
data/lib/jake/bundle.rb
CHANGED
@@ -1,15 +1,22 @@
|
|
1
1
|
module Jake
|
2
2
|
class Bundle < Buildable
|
3
3
|
|
4
|
+
# Returns a list of paths to all the files used to build this package.
|
4
5
|
def files
|
5
6
|
base = parent ? parent.files : []
|
6
7
|
base + @config[:files].map { |pkg| @build.package(pkg).files }.flatten
|
7
8
|
end
|
8
9
|
|
10
|
+
# Returns the full uncompressed source code of this package, before
|
11
|
+
# ERB processing. ERB output will be build-dependent; this method
|
12
|
+
# simply builds the raw template for further processing by other
|
13
|
+
# methods.
|
9
14
|
def source
|
10
15
|
@source ||= @config[:files].map { |pkg| @build.package(pkg).source }.join("\n\n\n")
|
11
16
|
end
|
12
17
|
|
18
|
+
# Returns the result of building the source template and minifying
|
19
|
+
# the output using the given named set of PackR settings.
|
13
20
|
def code(name)
|
14
21
|
joiner = (packer_settings(name) == false) ? "\n\n\n" : "\n"
|
15
22
|
@code[name] ||= @config[:files].map { |pkg| @build.package(pkg).code(name) }.join(joiner)
|
data/lib/jake/helper.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
module Jake
|
2
|
+
# The +Helper+ class stores helper methods that can be called from ERB
|
3
|
+
# when generating source code. Use +jake_helper+ to define new helpers.
|
4
|
+
class Helper
|
5
|
+
attr_accessor :build
|
6
|
+
attr_reader :options
|
7
|
+
|
8
|
+
def initialize(options = {})
|
9
|
+
@options = options
|
10
|
+
end
|
11
|
+
|
12
|
+
def scope; binding; end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
data/lib/jake/package.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
module Jake
|
2
2
|
class Package < Buildable
|
3
3
|
|
4
|
+
# Returns a list of paths to all the files used to build this package.
|
4
5
|
def files
|
5
6
|
base = parent ? parent.files : []
|
6
7
|
base + @config[:files].map do |path|
|
@@ -9,22 +10,23 @@ module Jake
|
|
9
10
|
end
|
10
11
|
end
|
11
12
|
|
13
|
+
# Returns the full uncompressed source code of this package, before
|
14
|
+
# ERB processing. ERB output will be build-dependent; this method
|
15
|
+
# simply builds the raw template for further processing by other
|
16
|
+
# methods.
|
12
17
|
def source
|
13
18
|
@source ||= files.map { |path| Jake.read(path) }.join("\n\n\n")
|
14
19
|
end
|
15
20
|
|
21
|
+
# Returns the result of building the source template and minifying
|
22
|
+
# the output using the given named set of PackR settings.
|
16
23
|
def code(name)
|
17
24
|
return @code[name] if @code[name]
|
18
25
|
settings = packer_settings(name)
|
19
|
-
output =
|
26
|
+
output = Jake.erb(source).result(@build.helper.scope)
|
20
27
|
@code[name] = settings ? Packr.pack(output, settings) : output
|
21
28
|
end
|
22
29
|
|
23
|
-
def header
|
24
|
-
reqs = @config[:requires] || []
|
25
|
-
[super, *reqs.map { |r| "// @require #{r}" }].join("\n")
|
26
|
-
end
|
27
|
-
|
28
30
|
end
|
29
31
|
end
|
30
32
|
|
data/test/Jakefile
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
jake_helper :version do
|
2
|
+
"0.5.0"
|
3
|
+
end
|
4
|
+
|
5
|
+
FILES = []
|
6
|
+
DEPS = {}
|
7
|
+
|
8
|
+
jake_hook :file_created do |build, package, build_type, path|
|
9
|
+
FILES << File.basename(path)
|
10
|
+
DEPS[path] = package.meta if build_type == :min
|
11
|
+
end
|
12
|
+
|
13
|
+
jake_hook :build_complete do |build|
|
14
|
+
write = lambda do |file, content|
|
15
|
+
File.open(File.join(build.build_dir, file), 'w') { |f| f.write(content) }
|
16
|
+
end
|
17
|
+
write['README', 'Should be generated after build']
|
18
|
+
write['LISTING', FILES.sort * "\n"]
|
19
|
+
|
20
|
+
write['packages.js', ERB.new(File.read('packages.erb')).result(binding)]
|
21
|
+
end
|
22
|
+
|
@@ -0,0 +1 @@
|
|
1
|
+
Should be generated after build
|
@@ -0,0 +1,8 @@
|
|
1
|
+
/**
|
2
|
+
* Jake test files should all include this
|
3
|
+
* even if they have been minified.
|
4
|
+
* 0.5.0-min
|
5
|
+
**/
|
6
|
+
|
7
|
+
Foo=(function(b,c){var a=true;return{_0:null,field:a,global:foo}})(window,something);
|
8
|
+
Basic={VERSION:"0.5.0-min",function(a){var b=4;return b+this._foo+a}};Basic.Ext="MIN";
|
@@ -0,0 +1,28 @@
|
|
1
|
+
/**
|
2
|
+
* Jake test files should all include this
|
3
|
+
* even if they have been minified.
|
4
|
+
* 0.5.0-src
|
5
|
+
**/
|
6
|
+
|
7
|
+
Foo = (function(my, vars) {
|
8
|
+
var another = true;
|
9
|
+
|
10
|
+
return {
|
11
|
+
_priv: null,
|
12
|
+
field: another,
|
13
|
+
global: foo
|
14
|
+
};
|
15
|
+
})(window, something);
|
16
|
+
|
17
|
+
|
18
|
+
Basic = {
|
19
|
+
VERSION: "0.5.0-src",
|
20
|
+
|
21
|
+
function(something) {
|
22
|
+
var myVar = 4;
|
23
|
+
return myVar + this._foo + something;
|
24
|
+
}
|
25
|
+
};
|
26
|
+
|
27
|
+
|
28
|
+
Basic.Ext = "SRC";
|
@@ -0,0 +1,17 @@
|
|
1
|
+
/**
|
2
|
+
* Jake test files should all include this
|
3
|
+
* even if they have been minified.
|
4
|
+
* 0.5.0-src
|
5
|
+
**/
|
6
|
+
|
7
|
+
Basic = {
|
8
|
+
VERSION: "0.5.0-src",
|
9
|
+
|
10
|
+
function(something) {
|
11
|
+
var myVar = 4;
|
12
|
+
return myVar + this._foo + something;
|
13
|
+
}
|
14
|
+
};
|
15
|
+
|
16
|
+
|
17
|
+
Basic.Ext = "SRC";
|
@@ -0,0 +1,15 @@
|
|
1
|
+
/**
|
2
|
+
* Jake test files should all include this
|
3
|
+
* even if they have been minified.
|
4
|
+
* 0.5.0-src
|
5
|
+
**/
|
6
|
+
|
7
|
+
Foo = (function(my, vars) {
|
8
|
+
var another = true;
|
9
|
+
|
10
|
+
return {
|
11
|
+
_priv: null,
|
12
|
+
field: another,
|
13
|
+
global: foo
|
14
|
+
};
|
15
|
+
})(window, something);
|
data/test/jake.yml
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
---
|
2
|
+
source_directory: src
|
3
|
+
build_directory: output
|
4
|
+
builds:
|
5
|
+
min:
|
6
|
+
shrink_vars: true
|
7
|
+
private: true
|
8
|
+
src:
|
9
|
+
packer: false
|
10
|
+
suffix: false
|
11
|
+
header: head
|
12
|
+
packages:
|
13
|
+
basic: basic
|
14
|
+
ext:
|
15
|
+
extends: basic
|
16
|
+
packer:
|
17
|
+
private: false
|
18
|
+
files:
|
19
|
+
- basic-ext
|
20
|
+
meta:
|
21
|
+
provides:
|
22
|
+
- Basic
|
23
|
+
requires:
|
24
|
+
- Foo
|
25
|
+
sub/dir/foo:
|
26
|
+
- foo/foo
|
27
|
+
sub/path/bar:
|
28
|
+
directory: foo
|
29
|
+
header: ../head2
|
30
|
+
packer:
|
31
|
+
shrink_vars: false
|
32
|
+
files:
|
33
|
+
- bar
|
34
|
+
bundles:
|
35
|
+
combo/box:
|
36
|
+
- sub/dir/foo
|
37
|
+
- ext
|
38
|
+
|
data/test/packages.erb
ADDED
data/test/src/basic.js
ADDED
data/test/src/foo/bar.js
ADDED
data/test/src/foo/foo.js
ADDED
data/test/src/head.js
ADDED
data/test/src/head2.js
ADDED
data/test/test_jake.rb
CHANGED
@@ -0,0 +1,29 @@
|
|
1
|
+
require "test/unit"
|
2
|
+
require "jake"
|
3
|
+
require "fileutils"
|
4
|
+
require "find"
|
5
|
+
|
6
|
+
class TestJake < Test::Unit::TestCase
|
7
|
+
DIR = File.dirname(__FILE__)
|
8
|
+
|
9
|
+
def setup
|
10
|
+
FileUtils.rm_rf(File.join(DIR, 'output'))
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_build
|
14
|
+
Jake.clear_hooks!
|
15
|
+
Jake.build!(DIR)
|
16
|
+
expected = File.join(DIR, 'expected')
|
17
|
+
actual = File.join(DIR, 'output')
|
18
|
+
Find.find(expected) do |path|
|
19
|
+
next unless File.file?(path)
|
20
|
+
actual_path = actual + path.gsub(expected, '')
|
21
|
+
|
22
|
+
flunk "File #{actual_path} is missing" unless File.file?(actual_path)
|
23
|
+
|
24
|
+
assert_equal File.read(path).strip, File.read(actual_path),
|
25
|
+
"File #{actual_path} does not match #{path}"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jake
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- James Coglan
|
@@ -9,11 +9,11 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-07-06 00:00:00 +01:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
|
-
name:
|
16
|
+
name: eventful
|
17
17
|
type: :runtime
|
18
18
|
version_requirement:
|
19
19
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -32,6 +32,16 @@ dependencies:
|
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: "0"
|
34
34
|
version:
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: oyster
|
37
|
+
type: :runtime
|
38
|
+
version_requirement:
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: "0"
|
44
|
+
version:
|
35
45
|
- !ruby/object:Gem::Dependency
|
36
46
|
name: hoe
|
37
47
|
type: :development
|
@@ -40,9 +50,9 @@ dependencies:
|
|
40
50
|
requirements:
|
41
51
|
- - ">="
|
42
52
|
- !ruby/object:Gem::Version
|
43
|
-
version:
|
53
|
+
version: 2.0.0
|
44
54
|
version:
|
45
|
-
description:
|
55
|
+
description: ""
|
46
56
|
email:
|
47
57
|
- jcoglan@googlemail.com
|
48
58
|
executables:
|
@@ -60,13 +70,37 @@ files:
|
|
60
70
|
- Rakefile
|
61
71
|
- bin/jake
|
62
72
|
- lib/jake.rb
|
73
|
+
- lib/jake/helper.rb
|
63
74
|
- lib/jake/build.rb
|
64
75
|
- lib/jake/buildable.rb
|
65
76
|
- lib/jake/package.rb
|
66
77
|
- lib/jake/bundle.rb
|
67
78
|
- test/test_jake.rb
|
79
|
+
- test/jake.yml
|
80
|
+
- test/Jakefile
|
81
|
+
- test/packages.erb
|
82
|
+
- test/expected/combo/box.js
|
83
|
+
- test/expected/combo/box-min.js
|
84
|
+
- test/expected/sub/dir/foo.js
|
85
|
+
- test/expected/sub/dir/foo-min.js
|
86
|
+
- test/expected/sub/path/bar.js
|
87
|
+
- test/expected/sub/path/bar-min.js
|
88
|
+
- test/expected/basic.js
|
89
|
+
- test/expected/basic-min.js
|
90
|
+
- test/expected/ext.js
|
91
|
+
- test/expected/ext-min.js
|
92
|
+
- test/expected/LISTING
|
93
|
+
- test/expected/README
|
94
|
+
- test/src/foo/bar.js
|
95
|
+
- test/src/foo/foo.js
|
96
|
+
- test/src/basic.js
|
97
|
+
- test/src/basic-ext.js
|
98
|
+
- test/src/head.js
|
99
|
+
- test/src/head2.js
|
68
100
|
has_rdoc: true
|
69
101
|
homepage: http://github.com/jcoglan/jake
|
102
|
+
licenses: []
|
103
|
+
|
70
104
|
post_install_message:
|
71
105
|
rdoc_options:
|
72
106
|
- --main
|
@@ -88,9 +122,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
88
122
|
requirements: []
|
89
123
|
|
90
124
|
rubyforge_project: jake
|
91
|
-
rubygems_version: 1.3.
|
125
|
+
rubygems_version: 1.3.3
|
92
126
|
signing_key:
|
93
|
-
specification_version:
|
94
|
-
summary:
|
127
|
+
specification_version: 3
|
128
|
+
summary: ""
|
95
129
|
test_files:
|
96
130
|
- test/test_jake.rb
|