jim 0.2.3 → 0.3.0.pre
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +2 -1
- data/Gemfile.lock +2 -0
- data/HISTORY +13 -0
- data/README.md +148 -0
- data/Rakefile +6 -3
- data/bin/jim +1 -2
- data/default +0 -0
- data/jim.gemspec +142 -105
- data/lib/jim.rb +1 -1
- data/lib/jim/bundler.rb +168 -73
- data/lib/jim/cli.rb +200 -151
- data/lib/jim/index.rb +20 -9
- data/lib/jim/installer.rb +46 -46
- data/lib/jim/rack.rb +57 -20
- data/lib/jim/templates/jimfile +11 -5
- data/lib/jim/version_parser.rb +3 -3
- data/test/fixtures/infoincomments.js +1 -1
- data/test/fixtures/jimfile +14 -7
- data/test/fixtures/jquery-1.4.1.js +3 -6057
- data/test/fixtures/jquery.color.js +1 -1
- data/test/fixtures/localfile.js +1 -1
- data/test/fixtures/mustache.js/package.json +1 -1
- data/test/fixtures/noversion.js +1 -1
- data/test/fixtures/old_jimfile +7 -0
- data/test/fixtures/sammy-0.5.0/examples/backend/app.rb +4 -4
- data/test/fixtures/sammy-0.5.0/examples/backend/public/javascripts/app.js +18 -18
- data/test/fixtures/sammy-0.5.0/examples/backend/public/javascripts/jquery.cloudkit.js +1 -1
- data/test/fixtures/sammy-0.5.0/examples/backend/public/javascripts/jquery.js +1 -1
- data/test/fixtures/sammy-0.5.0/examples/backend/public/javascripts/sammy.js +161 -161
- data/test/fixtures/sammy-0.5.0/examples/backend/public/templates/task.html.erb +1 -1
- data/test/fixtures/sammy-0.5.0/examples/backend/public/templates/task_details.html.erb +1 -1
- data/test/fixtures/sammy-0.5.0/examples/backend/views/app.sass +6 -6
- data/test/fixtures/sammy-0.5.0/examples/backend/views/index.haml +5 -5
- data/test/fixtures/sammy-0.5.0/examples/form_handling/index.html +16 -16
- data/test/fixtures/sammy-0.5.0/examples/hello_world/index.html +13 -13
- data/test/fixtures/sammy-0.5.0/examples/location_override/data.html +28 -28
- data/test/fixtures/sammy-0.5.0/examples/location_override/index.html +18 -18
- data/test/fixtures/sammy-0.5.0/examples/location_override/test.html +36 -36
- data/test/fixtures/sammy-0.5.0/lib/min/sammy-0.5.0.min.js +1 -1
- data/test/fixtures/sammy-0.5.0/lib/min/sammy-lastest.min.js +1 -1
- data/test/fixtures/sammy-0.5.0/lib/plugins/sammy.cache.js +13 -13
- data/test/fixtures/sammy-0.5.0/lib/plugins/sammy.haml.js +2 -2
- data/test/fixtures/sammy-0.5.0/lib/plugins/sammy.json.js +15 -15
- data/test/fixtures/sammy-0.5.0/lib/plugins/sammy.mustache.js +46 -46
- data/test/fixtures/sammy-0.5.0/lib/plugins/sammy.nested_params.js +29 -29
- data/test/fixtures/sammy-0.5.0/lib/plugins/sammy.storage.js +54 -54
- data/test/fixtures/sammy-0.5.0/lib/plugins/sammy.template.js +17 -17
- data/test/fixtures/sammy-0.5.0/lib/sammy.js +220 -220
- data/test/fixtures/sammy-0.5.0/test/fixtures/partial.html +1 -1
- data/test/fixtures/sammy-0.5.0/test/index.html +26 -26
- data/test/fixtures/sammy-0.5.0/test/test_sammy_application.js +60 -60
- data/test/fixtures/sammy-0.5.0/test/test_sammy_event_context.js +21 -21
- data/test/fixtures/sammy-0.5.0/test/test_sammy_location_proxy.js +3 -3
- data/test/fixtures/sammy-0.5.0/test/test_sammy_plugins.js +17 -17
- data/test/fixtures/sammy-0.5.0/test/test_sammy_storage.js +4 -4
- data/test/helper.rb +15 -0
- data/test/test_jim_bundler.rb +114 -74
- data/test/test_jim_cli.rb +34 -18
- data/test/test_jim_index.rb +19 -19
- data/test/test_jim_installer.rb +13 -13
- data/test/test_jim_rack.rb +41 -0
- data/test/test_jim_version_parser.rb +4 -4
- metadata +204 -41
- data/.gitignore +0 -24
- data/README.rdoc +0 -105
- data/lib/jim/templates/commands +0 -58
data/lib/jim.rb
CHANGED
data/lib/jim/bundler.rb
CHANGED
@@ -3,99 +3,170 @@ module Jim
|
|
3
3
|
# versions and then can bundle, compress, or copy those files into specific dirs
|
4
4
|
# or files.
|
5
5
|
#
|
6
|
-
# A Jimfile has a really simple format
|
7
|
-
#
|
8
|
-
#
|
9
|
-
#
|
10
|
-
# // bundle_path: /path/to/bundle.js
|
11
|
-
#
|
12
|
-
# // A requirement is just a name and an optional version
|
13
|
-
# // requirements are resolved and bundled in order of specification
|
14
|
-
# jquery 1.4.2
|
15
|
-
# jquery.color
|
16
|
-
# sammy 0.5.0
|
6
|
+
# A Jimfile has a really simple format that's encoded as JSON. Options are
|
7
|
+
# specified as key value pairs and 'bundles' are specified under the "bundles"
|
8
|
+
# attribute. Each item in a bundle can be a simple string, or an array of
|
9
|
+
# [name, version].
|
17
10
|
#
|
11
|
+
# {
|
12
|
+
# "bundle_dir": "test/tmp/",
|
13
|
+
# "vendor_dir": "test/tmp/public/javascripts/vendor",
|
14
|
+
# "bundles": {
|
15
|
+
# "default": [
|
16
|
+
# ["jquery", "1.4.1"],
|
17
|
+
# "myproject",
|
18
|
+
# "localfile"
|
19
|
+
# ],
|
20
|
+
# "base": [
|
21
|
+
# "jquery"
|
22
|
+
# ]
|
23
|
+
# }
|
24
|
+
# }
|
18
25
|
#
|
26
|
+
# Pre jim version 0.3 had a different simpler but proprietary and (possibly confusing)
|
27
|
+
# Jimfile format. Bundler can still read that format and can actually convert
|
28
|
+
# it into the new JSON format for you. Future versions may remove this support.
|
19
29
|
class Bundler
|
20
30
|
class MissingFile < Jim::Error; end
|
31
|
+
class InvalidBundle < Jim::Error; end
|
21
32
|
|
22
|
-
attr_accessor :jimfile, :index, :
|
33
|
+
attr_accessor :jimfile, :index, :bundles, :paths, :options
|
34
|
+
attr_reader :jimfile, :bundle_dir
|
23
35
|
|
24
36
|
# create a new bundler instance passing in the Jimfile as a `Pathname` or a
|
25
37
|
# string. `index` is a Jim::Index
|
26
38
|
def initialize(jimfile, index = nil, extra_options = {})
|
27
|
-
self.jimfile = jimfile.is_a?(Pathname) ? jimfile.read : jimfile
|
28
39
|
self.index = index || Jim::Index.new
|
29
|
-
self.options = {
|
30
|
-
|
31
|
-
|
40
|
+
self.options = {
|
41
|
+
:compressed_suffix => '.min'
|
42
|
+
}
|
43
|
+
self.bundles = {}
|
44
|
+
self.jimfile = jimfile
|
32
45
|
self.options = options.merge(extra_options)
|
33
|
-
self.paths =
|
46
|
+
self.paths = {}
|
34
47
|
if options[:vendor_dir]
|
35
48
|
logger.debug "adding vendor dir to index #{options[:vendor_dir]}"
|
36
49
|
self.index.add(options[:vendor_dir])
|
37
50
|
end
|
38
51
|
end
|
39
52
|
|
40
|
-
#
|
53
|
+
# Set the Jimfile and parse it. If `file` is a `Pathname` read it as a string.
|
54
|
+
# If it's a string assume that its in the Jimfile format.
|
55
|
+
def jimfile=(file)
|
56
|
+
@jimfile = file.is_a?(Pathname) ? file.read : file
|
57
|
+
# look for old jimfile
|
58
|
+
if @jimfile =~ /^\/\//
|
59
|
+
logger.warn "You're Jimfile is in a deprecated format. Run `jim update_jimfile` to convert it."
|
60
|
+
parse_old_jimfile
|
61
|
+
else
|
62
|
+
parse_jimfile
|
63
|
+
end
|
64
|
+
@jimfile
|
65
|
+
end
|
66
|
+
|
67
|
+
# Set the `bundle_dir` where bundles will be written. If `bundle_dir` is set
|
68
|
+
# to nil, all bundles will be written to STDOUT
|
69
|
+
def bundle_dir=(new_dir)
|
70
|
+
if new_dir
|
71
|
+
new_dir = Pathname.new(new_dir)
|
72
|
+
new_dir.mkpath
|
73
|
+
end
|
74
|
+
@bundle_dir = new_dir
|
75
|
+
end
|
76
|
+
|
77
|
+
# Output the parse Jimfile requirements and options as a Jimfile-ready
|
78
|
+
# JSON-encoded string
|
79
|
+
def jimfile_to_json
|
80
|
+
h = {
|
81
|
+
"bundle_dir" => bundle_dir
|
82
|
+
}.merge(options)
|
83
|
+
h['bundles'] = {}
|
84
|
+
self.bundles.each do |bundle_name, requirements|
|
85
|
+
h['bundles']['bundle_name'] = []
|
86
|
+
requirements.each do |name, version|
|
87
|
+
h['bundles']['bundle_name'] << if version.nil? || version.strip == ''
|
88
|
+
name
|
89
|
+
else
|
90
|
+
[name, version]
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
Yajl::Encoder.encode(h, :pretty => true)
|
95
|
+
end
|
96
|
+
|
97
|
+
# Resolve the requirements specified in the Jimfile for each bundle to `paths`
|
98
|
+
# Raises MissingFile error
|
41
99
|
def resolve!
|
42
|
-
self.
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
100
|
+
self.bundles.each do |bundle_name, requirements|
|
101
|
+
self.paths[bundle_name] = []
|
102
|
+
requirements.each do |name, version|
|
103
|
+
path = self.index.find(name, version)
|
104
|
+
if !path
|
105
|
+
raise(MissingFile,
|
106
|
+
"Could not find #{name} #{version} in any of these paths #{index.directories.join(':')}")
|
107
|
+
end
|
108
|
+
self.paths[bundle_name] << [path, name, version]
|
48
109
|
end
|
49
|
-
self.paths << [path, name, version]
|
50
110
|
end
|
51
111
|
paths
|
52
112
|
end
|
53
113
|
|
54
|
-
#
|
55
|
-
#
|
56
|
-
|
114
|
+
# Concatenate all of the bundles to the dir set in `bundle_dir`
|
115
|
+
# or a specific bundle specified by bundle name. Setting `compress` to
|
116
|
+
# true will run the output of each bundle to the Google Closure Compiler.
|
117
|
+
# You can also use the YUI compressor by setting the option :compressor to 'yui'
|
118
|
+
# Raises an error if there is no bundled dir or specific bundle set
|
119
|
+
def bundle!(bundle_name = false, compress = false)
|
57
120
|
resolve! if paths.empty?
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
121
|
+
if bundle_name
|
122
|
+
files = self.paths[bundle_name]
|
123
|
+
if bundle_dir
|
124
|
+
path = path_for_bundle(bundle_name, compress)
|
125
|
+
concatenate(files, path, compress)
|
126
|
+
[path]
|
127
|
+
else
|
128
|
+
concatenate(files, "", compress)
|
63
129
|
end
|
130
|
+
elsif bundle_dir
|
131
|
+
self.paths.collect do |bundle_name, files|
|
132
|
+
path = path_for_bundle(bundle_name, compress)
|
133
|
+
concatenate(files, path, compress)
|
134
|
+
path
|
135
|
+
end
|
136
|
+
else
|
137
|
+
raise(InvalidBundle,
|
138
|
+
"Must set either a :bundle_dir to write files to or a specific bundle to write to STDOUT")
|
64
139
|
end
|
65
140
|
end
|
66
141
|
|
67
|
-
#
|
68
|
-
|
69
|
-
|
70
|
-
def compress!(to = nil)
|
71
|
-
to = options[:compressed_path] if to.nil? && options[:compressed_path]
|
72
|
-
io_for_path(to) do |io|
|
73
|
-
logger.info "Compressing to #{to}"
|
74
|
-
io << compress_js(bundle!(false))
|
75
|
-
end
|
142
|
+
# Alias to running `bundle!` with `compress` = `true`
|
143
|
+
def compress!(bundle_name = false)
|
144
|
+
bundle!(bundle_name, true)
|
76
145
|
end
|
77
146
|
|
78
|
-
#
|
79
|
-
# specified with the :vendor_dir option
|
147
|
+
# Copy each of the requirements into the dir specified with `dir` or the path
|
148
|
+
# specified with the :vendor_dir option. Returns the dir it was vendored to.
|
80
149
|
def vendor!(dir = nil, force = false)
|
81
150
|
resolve! if paths.empty?
|
82
151
|
dir ||= options[:vendor_dir]
|
83
152
|
dir ||= 'vendor' # default
|
84
|
-
logger.
|
85
|
-
paths.each do |path, name, version|
|
153
|
+
logger.debug "Vendoring #{paths.length} files to #{dir}"
|
154
|
+
paths.collect {|n, p| p }.flatten.each do |path, name, version|
|
86
155
|
if index.in_jimhome?(path)
|
87
156
|
Jim::Installer.new(path, dir, :shallow => true, :force => force).install
|
88
157
|
end
|
89
158
|
end
|
159
|
+
dir
|
160
|
+
end
|
161
|
+
|
162
|
+
# Returns an array of `Pathname`s where each of the bundles will be written
|
163
|
+
def bundle_paths
|
164
|
+
self.bundles.collect {|name, reqs| path_for_bundle(name) }
|
90
165
|
end
|
91
166
|
|
92
|
-
# Run the uncompressed
|
167
|
+
# Run the uncompressed js through a JS compressor (closure-compiler) by
|
93
168
|
# default. Setting options[:compressor] == 'yui' will force the YUI JS Compressor
|
94
169
|
def compress_js(uncompressed)
|
95
|
-
# if uncompressed.is_a?(File) && uncompressed.closed?
|
96
|
-
# puts "uncompressed is a file"
|
97
|
-
# uncompressed = File.read(uncompressed.path)
|
98
|
-
# end
|
99
170
|
if options[:compressor] == 'yui'
|
100
171
|
begin
|
101
172
|
require "yui/compressor"
|
@@ -111,40 +182,64 @@ module Jim
|
|
111
182
|
end
|
112
183
|
compressor = ::Closure::Compiler.new
|
113
184
|
end
|
114
|
-
|
185
|
+
begin
|
186
|
+
compressor.compress(uncompressed)
|
187
|
+
rescue Exception => e
|
188
|
+
logger.error e.message
|
189
|
+
end
|
115
190
|
end
|
116
191
|
|
117
192
|
private
|
118
|
-
def
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
to.close
|
123
|
-
to
|
124
|
-
when Pathname
|
125
|
-
to.dirname.mkpath
|
126
|
-
io = to.open('w')
|
127
|
-
yield io
|
128
|
-
io.close
|
129
|
-
io
|
130
|
-
when String
|
131
|
-
to = Pathname.new(to)
|
132
|
-
io_for_path(to, &block)
|
133
|
-
else
|
134
|
-
io = ""
|
135
|
-
yield io
|
136
|
-
io
|
193
|
+
def concatenate(paths, io, compress)
|
194
|
+
if io.is_a?(Pathname)
|
195
|
+
io = io.open('w')
|
196
|
+
logger.debug "#{compress ? 'Compressing' : 'Bundling'} to #{io}"
|
137
197
|
end
|
198
|
+
final_io, io = io, "" if compress
|
199
|
+
paths.each do |path, name, version|
|
200
|
+
io << path.read << "\n"
|
201
|
+
end
|
202
|
+
if compress
|
203
|
+
final_io << compress_js(io)
|
204
|
+
io = final_io
|
205
|
+
end
|
206
|
+
io.close if io.respond_to?(:close)
|
207
|
+
io
|
208
|
+
end
|
209
|
+
|
210
|
+
def path_for_bundle(bundle_name, compressed = false)
|
211
|
+
bundle_dir + "#{bundle_name}#{compressed ? options[:compressed_suffix] : ''}.js"
|
138
212
|
end
|
139
213
|
|
140
214
|
def parse_jimfile
|
215
|
+
json = Yajl::Parser.parse(jimfile)
|
216
|
+
json.each do |k, v|
|
217
|
+
set_option(k, v)
|
218
|
+
end
|
219
|
+
end
|
220
|
+
|
221
|
+
def parse_old_jimfile
|
222
|
+
bundle = []
|
141
223
|
jimfile.each_line do |line|
|
142
224
|
if /^\/\/\s?([^\:]+)\:\s(.*)$/.match line
|
143
|
-
|
225
|
+
k, v = $1, $2.strip
|
226
|
+
if k == 'bundled_path'
|
227
|
+
k, v = 'bundle_dir', File.dirname(v)
|
228
|
+
end
|
229
|
+
set_option(k, v)
|
144
230
|
elsif line !~ /^\// && line.strip != ''
|
145
|
-
|
231
|
+
bundle << line.split(/\s+/, 2).compact.collect {|s| s.strip }.reject {|s| s == '' }
|
146
232
|
end
|
147
233
|
end
|
234
|
+
self.bundles['default'] = bundle
|
235
|
+
end
|
236
|
+
|
237
|
+
def set_option(k, v)
|
238
|
+
if respond_to?("#{k}=")
|
239
|
+
self.send("#{k}=", v)
|
240
|
+
else
|
241
|
+
self.options[k.to_sym] = v
|
242
|
+
end
|
148
243
|
end
|
149
244
|
|
150
245
|
def logger
|
data/lib/jim/cli.rb
CHANGED
@@ -1,212 +1,250 @@
|
|
1
|
-
require '
|
2
|
-
require 'readline'
|
1
|
+
require 'thor'
|
3
2
|
|
4
3
|
module Jim
|
4
|
+
# CLI handles the command line interface for the `jim` binary. It is a `Thor`
|
5
|
+
# application.
|
6
|
+
class CLI < ::Thor
|
7
|
+
include Thor::Actions
|
5
8
|
|
6
|
-
|
7
|
-
# The layout is farily simple. Options are parsed using optparse.rb and
|
8
|
-
# the different public methods represent 1-1 the commands provided by the bin.
|
9
|
-
class CLI
|
9
|
+
attr_accessor :jimfile, :jimhome, :debug, :force
|
10
10
|
|
11
|
-
|
11
|
+
source_root File.dirname(__FILE__) + '/templates'
|
12
|
+
|
13
|
+
class_option "jimhome",
|
14
|
+
:type => :string,
|
15
|
+
:banner => "set the install path/JIMHOME dir (default ~/.jim)"
|
16
|
+
|
17
|
+
class_option "jimfile",
|
18
|
+
:type => :string,
|
19
|
+
:aliases => '-j',
|
20
|
+
:banner => "load specific Jimfile at path (default ./Jimfile)"
|
21
|
+
|
22
|
+
class_option "force",
|
23
|
+
:default => false,
|
24
|
+
:aliases => '-f',
|
25
|
+
:banner => "force file creation/overwrite"
|
26
|
+
|
27
|
+
class_option "debug",
|
28
|
+
:default => false,
|
29
|
+
:aliases => '-d',
|
30
|
+
:banner => "set log level to debug"
|
31
|
+
|
32
|
+
class_option "version",
|
33
|
+
:type => :boolean,
|
34
|
+
:aliases => '-v',
|
35
|
+
:banner => "print version and exit"
|
12
36
|
|
13
37
|
# create a new instance with the args passed from the command line i.e. ARGV
|
14
|
-
def initialize(
|
15
|
-
|
38
|
+
def initialize(*)
|
39
|
+
super
|
40
|
+
if options[:version]
|
41
|
+
say "jim #{Jim::VERSION}", :red
|
42
|
+
exit
|
43
|
+
end
|
16
44
|
# set the default jimhome
|
17
|
-
self.jimhome = Pathname.new(ENV['JIMHOME'] || '~/.jim').expand_path
|
45
|
+
self.jimhome = Pathname.new(options[:jimhome] || ENV['JIMHOME'] || '~/.jim').expand_path
|
18
46
|
# parse the options
|
19
|
-
self.jimfile = Pathname.new('Jimfile')
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
if command && respond_to?(command)
|
28
|
-
self.send(command, *@args)
|
29
|
-
elsif command.nil? || command.strip == ''
|
30
|
-
cheat
|
31
|
-
else
|
32
|
-
@output << "No action found for #{command}. Run -h for help."
|
33
|
-
end
|
34
|
-
@output
|
35
|
-
rescue ArgumentError => e
|
36
|
-
@output << "#{e.message} for #{command}"
|
37
|
-
raise e if reraise
|
38
|
-
rescue Jim::FileExists => e
|
39
|
-
@output << "#{e.message} already exists, bailing. Use --force if you're sure"
|
40
|
-
raise e if reraise
|
41
|
-
rescue => e
|
42
|
-
@output << e.message + " (#{e.class})"
|
43
|
-
raise e if reraise
|
44
|
-
end
|
45
|
-
|
46
|
-
# list the possible commands to the logger
|
47
|
-
def commands
|
48
|
-
logger.info "Usage: jim [options] [command] [args]\n"
|
49
|
-
logger.info "Commands:"
|
50
|
-
logger.info template('commands')
|
51
|
-
end
|
52
|
-
|
53
|
-
# list the possible commands without detailed descriptions
|
54
|
-
def cheat
|
55
|
-
logger.info "Usage: jim [options] [command] [args]\n"
|
56
|
-
logger.info "Commands:"
|
57
|
-
logger.info [*template('commands')].grep(/^\w/).join
|
58
|
-
logger.info "run commands for details"
|
59
|
-
end
|
60
|
-
alias :help :cheat
|
61
|
-
|
62
|
-
# initialize the current dir with a new Jimfile
|
47
|
+
self.jimfile = Pathname.new(options[:jimfile] || 'Jimfile').expand_path
|
48
|
+
self.force = options[:force]
|
49
|
+
self.debug = options[:debug]
|
50
|
+
logger.level = Logger::DEBUG if debug
|
51
|
+
end
|
52
|
+
|
53
|
+
desc 'init [APPDIR]',
|
54
|
+
'Create an example Jimfile at path or the current directory if path is omitted'
|
63
55
|
def init(dir = nil)
|
64
56
|
dir = Pathname.new(dir || '')
|
65
57
|
jimfile_path = dir + 'Jimfile'
|
66
|
-
|
67
|
-
raise Jim::FileExists.new(jimfile_path)
|
68
|
-
else
|
69
|
-
File.open(jimfile_path, 'w') do |f|
|
70
|
-
f << template('jimfile')
|
71
|
-
end
|
72
|
-
logger.info "wrote Jimfile to #{jimfile_path}"
|
73
|
-
end
|
58
|
+
template('jimfile', jimfile_path)
|
74
59
|
end
|
75
60
|
|
76
|
-
|
61
|
+
desc 'install <URL> [NAME] [VERSION]',
|
62
|
+
"Install the file(s) at url into the JIMHOME directory."
|
63
|
+
|
64
|
+
long_desc <<-EOT
|
65
|
+
Install the file(s) at url into the JIMHOME directory. URL can be any path
|
66
|
+
or url that Downlow understands. This means:
|
67
|
+
|
68
|
+
jim install http://code.jquery.com/jquery-1.4.1.js\n
|
69
|
+
jim install ../sammy/\n
|
70
|
+
jim install gh://quirkey/sammy\n
|
71
|
+
jim install git://github.com/jquery/jquery.git\n
|
72
|
+
EOT
|
77
73
|
def install(url, name = false, version = false)
|
78
74
|
Jim::Installer.new(url, jimhome, :force => force, :name => name, :version => version).install
|
79
75
|
end
|
80
76
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
77
|
+
desc 'bundle [BUNDLE_NAME]',
|
78
|
+
"Bundle the files specified in Jimfile"
|
79
|
+
long_desc <<-EOT
|
80
|
+
Concatenate all the bundles listed in a Jimfile and save them to the bundle dir
|
81
|
+
specified in the options or in the Jimfile.
|
82
|
+
|
83
|
+
If [BUNDLE_NAME] is specified, only bundles that specific bundle.
|
84
|
+
|
85
|
+
If no Jimfile is set in the options, assumes ./Jimfile.
|
86
|
+
EOT
|
87
|
+
method_option "bundle_dir",
|
88
|
+
:type => :string,
|
89
|
+
:banner => "override the bundle_dir set in the Jimfile"
|
90
|
+
method_option "stdout",
|
91
|
+
:default => false,
|
92
|
+
:aliases => '-o',
|
93
|
+
:type => :boolean,
|
94
|
+
:banner => "write the bundle to STDOUT"
|
95
|
+
def bundle(bundle_name = nil)
|
96
|
+
make_bundle(bundle_name, false)
|
86
97
|
end
|
87
98
|
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
99
|
+
desc "compress [BUNDLE_NAME]",
|
100
|
+
"Bundle all the files listed in a Jimfile, run through the google closure " +
|
101
|
+
"compiler and save them to [COMPRESSED_PATH]."
|
102
|
+
long_desc <<-EOT
|
103
|
+
Concatenate all the bundles listed in a Jimfile, run them through the google
|
104
|
+
closure compiler and save them to the bundle dirspecified in the options or
|
105
|
+
in the Jimfile.
|
106
|
+
|
107
|
+
If a [BUNDLE_NAME] is specified, only bundle and compress that bundle.
|
108
|
+
|
109
|
+
If no Jimfile is set in the options, assumes ./Jimfile.
|
110
|
+
EOT
|
111
|
+
method_option "bundle_dir",
|
112
|
+
:type => :string,
|
113
|
+
:banner => "override the bundle_dir set in the Jimfile"
|
114
|
+
method_option "stdout",
|
115
|
+
:default => false,
|
116
|
+
:aliases => '-o',
|
117
|
+
:type => :boolean,
|
118
|
+
:banner => "write the bundle to STDOUT"
|
119
|
+
def compress(bundle_name = nil)
|
120
|
+
make_bundle(bundle_name, true)
|
93
121
|
end
|
94
122
|
|
95
|
-
|
123
|
+
desc "vendor [VENDOR_DIR]",
|
124
|
+
"Copy all the files listed in Jimfile to the vendor_dir"
|
96
125
|
def vendor(dir = nil)
|
97
|
-
bundler.vendor!(dir, force)
|
126
|
+
dir = bundler.vendor!(dir, force)
|
127
|
+
say("Vendored files to #{dir}", :green)
|
128
|
+
rescue Jim::Error => e
|
129
|
+
say e.message, :red
|
98
130
|
end
|
99
131
|
|
100
|
-
|
101
|
-
|
132
|
+
desc "list [SEARCH]",
|
133
|
+
"List all the installed packages and their versions, optionally limiting by [SEARCH]"
|
102
134
|
def list(search = nil)
|
103
|
-
|
104
|
-
|
135
|
+
say "Getting list of installed files in"
|
136
|
+
say("#{installed_index.directories.join(':')}", :yellow)
|
137
|
+
say("Searching for '#{search}'", :yellow) if search
|
105
138
|
list = installed_index.list(search)
|
106
|
-
|
139
|
+
say "Installed:"
|
107
140
|
print_version_list(list)
|
108
141
|
end
|
109
|
-
|
142
|
+
map "installed" => "list"
|
110
143
|
|
111
|
-
|
112
|
-
|
113
|
-
|
144
|
+
desc "available [SEARCH]",
|
145
|
+
"List all available projects and versions " +
|
146
|
+
"including those in the local path, or paths specified in a Jimfile"
|
114
147
|
def available(search = nil)
|
115
|
-
|
116
|
-
|
148
|
+
say "Getting list of all available files in\n#{index.directories.join("\n")}"
|
149
|
+
say "Searching for '#{search}'" if search
|
117
150
|
list = index.list(search)
|
118
|
-
|
151
|
+
say "Available:"
|
119
152
|
print_version_list(list)
|
120
153
|
end
|
121
154
|
|
122
|
-
|
155
|
+
desc "remove <NAME> [VERSION]",
|
156
|
+
"Iterate through the install files and prompt for the removal of those " +
|
157
|
+
"matching the supplied NAME and VERSION"
|
123
158
|
def remove(name, version = nil)
|
124
|
-
|
159
|
+
say "Looking for files matching #{name} #{version}"
|
125
160
|
files = installed_index.find_all(name, version)
|
126
161
|
if files.length > 0
|
127
|
-
|
162
|
+
say "Found #{files.length} matching files"
|
128
163
|
removed = 0
|
129
164
|
files.each do |filename|
|
130
|
-
|
131
|
-
if
|
132
|
-
|
165
|
+
do_remove = yes?("Remove #{filename}?", :red)
|
166
|
+
if do_remove
|
167
|
+
say "Removing #{filename}"
|
133
168
|
filename.delete
|
134
169
|
removed += 1
|
135
170
|
else
|
136
|
-
|
171
|
+
say "Skipping #{filename}", :yellow
|
137
172
|
end
|
138
173
|
end
|
139
|
-
|
174
|
+
say "Removed #{removed} files."
|
140
175
|
else
|
141
|
-
|
176
|
+
say "No installed files matched."
|
142
177
|
end
|
143
178
|
end
|
144
|
-
|
179
|
+
map "uninstall" => "remove"
|
145
180
|
|
146
|
-
|
181
|
+
desc "resolve",
|
182
|
+
"Resolve all the paths listed in a Jimfile and print them to STDOUT. " +
|
183
|
+
"If no Jimfile is set in the options, assumes ./Jimfile."
|
147
184
|
def resolve
|
148
185
|
resolved = bundler.resolve!
|
149
|
-
|
150
|
-
resolved.each do |
|
151
|
-
|
186
|
+
say "Files:"
|
187
|
+
resolved.each do |bundle_name, requirements|
|
188
|
+
say bundle_name, :green
|
189
|
+
say "-----------------------", :green
|
190
|
+
requirements.each do |path, name, version|
|
191
|
+
say [name, version, path].join(" | ") + "\n"
|
192
|
+
end
|
152
193
|
end
|
153
194
|
resolved
|
195
|
+
rescue Jim::Error => e
|
196
|
+
say e.message, :red
|
154
197
|
end
|
155
198
|
|
156
|
-
|
199
|
+
desc "pack [DIR]",
|
200
|
+
"Runs in order, vendor, bundle, compress. This command " +
|
201
|
+
"simplifies the common workflow of vendoring and re-bundling " +
|
202
|
+
"before committing or deploying changes to a project"
|
157
203
|
def pack(dir = nil)
|
158
|
-
|
159
|
-
vendor
|
160
|
-
bundle
|
161
|
-
compress
|
204
|
+
say "Packing the Jimfile for this project"
|
205
|
+
invoke :vendor, [dir]
|
206
|
+
invoke :bundle
|
207
|
+
invoke :compress
|
162
208
|
end
|
163
209
|
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
self.force = true
|
182
|
-
}
|
183
|
-
|
184
|
-
opts.on("-d", "--debug", "set log level to debug") {|d|
|
185
|
-
logger.level = Logger::DEBUG
|
186
|
-
}
|
187
|
-
|
188
|
-
opts.on("-o", "--stdout", "write output of commands (like bundle and compress to STDOUT)") {|o|
|
189
|
-
logger.level = Logger::ERROR
|
190
|
-
self.stdout = true
|
191
|
-
}
|
192
|
-
|
193
|
-
opts.on("-v", "--version", "print version") {|d|
|
194
|
-
puts "jim #{Jim::VERSION}"
|
195
|
-
exit
|
196
|
-
}
|
210
|
+
desc "watch [DIR]",
|
211
|
+
"Watches your Jimfile and JS files and triggers `bundle` if something " +
|
212
|
+
"changes. Handy for development."
|
213
|
+
def watch(dir = nil)
|
214
|
+
require 'fssm'
|
215
|
+
run_update = lambda {|type, path|
|
216
|
+
unless bundler.bundle_paths.any? {|p| path.include?(p) }
|
217
|
+
say("--> #{path} #{type}")
|
218
|
+
system "jim bundle"
|
219
|
+
end
|
220
|
+
}
|
221
|
+
say "Now watching JS files..."
|
222
|
+
run_update["started", 'Jimfile']
|
223
|
+
FSSM.monitor(Dir.pwd, [File.join('**','*.js'), 'Jimfile']) do
|
224
|
+
update do |base, relative|
|
225
|
+
run_update["changed", relative]
|
226
|
+
end
|
197
227
|
|
228
|
+
create do |base, relative|
|
229
|
+
run_update["created", relative]
|
230
|
+
end
|
198
231
|
|
199
|
-
|
200
|
-
|
201
|
-
exit
|
232
|
+
delete do |base, relative|
|
233
|
+
run_update["deleted", relative]
|
202
234
|
end
|
235
|
+
end
|
236
|
+
end
|
203
237
|
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
238
|
+
desc "update_jimfile [APP_DIR]",
|
239
|
+
"Converts a Jimfile from the old pre 0.3 format to the JSON format."
|
240
|
+
def update_jimfile(dir = nil)
|
241
|
+
dir = Pathname.new(dir || '')
|
242
|
+
bundler
|
243
|
+
copy_file(dir + 'Jimfile', dir + 'Jimfile.old')
|
244
|
+
create_file(dir + 'Jimfile', bundler.jimfile_to_json)
|
208
245
|
end
|
209
246
|
|
247
|
+
private
|
210
248
|
def index
|
211
249
|
@index ||= Jim::Index.new(install_dir, Dir.pwd)
|
212
250
|
end
|
@@ -223,18 +261,29 @@ module Jim
|
|
223
261
|
jimhome + 'lib'
|
224
262
|
end
|
225
263
|
|
226
|
-
def template(path)
|
227
|
-
(Pathname.new(__FILE__).dirname + 'templates' + path).read
|
228
|
-
end
|
229
|
-
|
230
264
|
def logger
|
231
265
|
Jim.logger
|
232
266
|
end
|
233
267
|
|
234
268
|
def print_version_list(list)
|
235
269
|
list.each do |file, versions|
|
236
|
-
|
270
|
+
say "#{file} (#{VersionSorter.rsort(versions.collect {|v| v[0] }).join(', ')}\n"
|
271
|
+
end
|
272
|
+
end
|
273
|
+
|
274
|
+
def make_bundle(bundle_name, compress = false)
|
275
|
+
bundler.bundle_dir = options[:bundle_dir] if options[:bundle_dir]
|
276
|
+
bundler.bundle_dir = nil if options[:stdout]
|
277
|
+
result = bundler.bundle!(bundle_name, compress)
|
278
|
+
if options[:stdout]
|
279
|
+
puts result
|
280
|
+
else
|
281
|
+
result.each do |path|
|
282
|
+
say("Wrote #{path} #{File.size(path.to_s) / 1024}kb", :green)
|
283
|
+
end
|
237
284
|
end
|
285
|
+
rescue Jim::Error => e
|
286
|
+
say e.message, :red
|
238
287
|
end
|
239
288
|
|
240
289
|
end
|