jim 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +21 -3
- data/Rakefile +3 -0
- data/jim.gemspec +11 -2
- data/lib/jim/bundler.rb +49 -14
- data/lib/jim/cli.rb +23 -6
- data/lib/jim/index.rb +1 -0
- data/lib/jim/rack.rb +8 -0
- data/lib/jim.rb +2 -1
- metadata +32 -2
data/README.rdoc
CHANGED
@@ -22,6 +22,18 @@ The goals are simple:
|
|
22
22
|
|
23
23
|
So far I've accomplished the goals, but this is all very very very beta and the API is sure to change and thing straight-up might not work.
|
24
24
|
|
25
|
+
== Install
|
26
|
+
|
27
|
+
jim is a rubygem:
|
28
|
+
|
29
|
+
$ gem install jim
|
30
|
+
|
31
|
+
You can also clone the source from github and use jeweler to install locally (requires jeweler):
|
32
|
+
|
33
|
+
$ git clone git://github.com/quirkey/jim.git
|
34
|
+
$ cd jim
|
35
|
+
$ rake install
|
36
|
+
|
25
37
|
== Usage
|
26
38
|
|
27
39
|
From anywhere, install a project:
|
@@ -43,8 +55,8 @@ Which create an empty "Jimfile". Open it up and add your requirements:
|
|
43
55
|
|
44
56
|
jquery 1.4.2
|
45
57
|
jquery-metadata 2.0
|
46
|
-
// a local file (comments are fine)
|
47
|
-
app
|
58
|
+
// a local file, js/app.js (comments are fine)
|
59
|
+
js/app
|
48
60
|
|
49
61
|
If its a rack project, mount the Jim::Rack middleware which gives you live updates of your bundled and compressed js files:
|
50
62
|
|
@@ -58,6 +70,8 @@ Otherwise and also before deploys, etc, use the command line tool from your proj
|
|
58
70
|
// or
|
59
71
|
$ jim compress
|
60
72
|
|
73
|
+
In order for compress to work, you need either the yui-compressor gem or the closure-compiler gem. Closure is the default, add
|
74
|
+
|
61
75
|
Run `jim commands` for a full list of commands.
|
62
76
|
|
63
77
|
== You're probably wondering
|
@@ -72,6 +86,10 @@ With that said, I would gladly welcome anyone cloning the API in CommonJS (I'm j
|
|
72
86
|
|
73
87
|
Probably?? Its all very new at this point so please test it out and let me know.
|
74
88
|
|
89
|
+
== Thanks
|
90
|
+
|
91
|
+
Thanks to Yehuda Katz for talking through some of the ideas with me.
|
92
|
+
|
75
93
|
== Note on Patches/Pull Requests
|
76
94
|
|
77
95
|
* Fork the project.
|
@@ -80,7 +98,7 @@ Probably?? Its all very new at this point so please test it out and let me know.
|
|
80
98
|
future version unintentionally.
|
81
99
|
* Commit, do not mess with rakefile, version, or history.
|
82
100
|
(if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
|
83
|
-
* Send me a pull request. Bonus points for topic branches
|
101
|
+
* Send me a pull request. Bonus points for topic branches
|
84
102
|
|
85
103
|
== Copyright
|
86
104
|
|
data/Rakefile
CHANGED
@@ -16,7 +16,10 @@ begin
|
|
16
16
|
gem.homepage = "http://github.com/quirkey/jim"
|
17
17
|
gem.authors = ["Aaron Quint"]
|
18
18
|
gem.add_dependency "downlow", ">= 0.1.1"
|
19
|
+
gem.add_dependency "yajl-ruby"
|
19
20
|
gem.add_development_dependency "shoulda", ">= 0"
|
21
|
+
gem.add_development_dependency "fakeweb", ">= 1.2.8"
|
22
|
+
gem.add_development_dependency "mocha"
|
20
23
|
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
21
24
|
end
|
22
25
|
Jeweler::GemcutterTasks.new
|
data/jim.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{jim}
|
8
|
-
s.version = "0.1.
|
8
|
+
s.version = "0.1.1"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Aaron Quint"]
|
12
|
-
s.date = %q{2010-02-
|
12
|
+
s.date = %q{2010-02-20}
|
13
13
|
s.default_executable = %q{jim}
|
14
14
|
s.description = %q{jim is your friendly javascript library manager. He downloads, stores, bundles, vendors and compresses.}
|
15
15
|
s.email = %q{aaron@quirkey.com}
|
@@ -70,14 +70,23 @@ Gem::Specification.new do |s|
|
|
70
70
|
|
71
71
|
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
72
72
|
s.add_runtime_dependency(%q<downlow>, [">= 0.1.1"])
|
73
|
+
s.add_runtime_dependency(%q<yajl-ruby>, [">= 0"])
|
73
74
|
s.add_development_dependency(%q<shoulda>, [">= 0"])
|
75
|
+
s.add_development_dependency(%q<fakeweb>, [">= 1.2.8"])
|
76
|
+
s.add_development_dependency(%q<mocha>, [">= 0"])
|
74
77
|
else
|
75
78
|
s.add_dependency(%q<downlow>, [">= 0.1.1"])
|
79
|
+
s.add_dependency(%q<yajl-ruby>, [">= 0"])
|
76
80
|
s.add_dependency(%q<shoulda>, [">= 0"])
|
81
|
+
s.add_dependency(%q<fakeweb>, [">= 1.2.8"])
|
82
|
+
s.add_dependency(%q<mocha>, [">= 0"])
|
77
83
|
end
|
78
84
|
else
|
79
85
|
s.add_dependency(%q<downlow>, [">= 0.1.1"])
|
86
|
+
s.add_dependency(%q<yajl-ruby>, [">= 0"])
|
80
87
|
s.add_dependency(%q<shoulda>, [">= 0"])
|
88
|
+
s.add_dependency(%q<fakeweb>, [">= 1.2.8"])
|
89
|
+
s.add_dependency(%q<mocha>, [">= 0"])
|
81
90
|
end
|
82
91
|
end
|
83
92
|
|
data/lib/jim/bundler.rb
CHANGED
@@ -1,10 +1,29 @@
|
|
1
1
|
module Jim
|
2
|
+
# Bundler takes parses a Jimfile that specifies requirements as names and
|
3
|
+
# versions and then can bundle, compress, or copy those files into specific dirs
|
4
|
+
# or files.
|
5
|
+
#
|
6
|
+
# A Jimfile has a really simple format:
|
7
|
+
#
|
8
|
+
# // comments look like JS comments
|
9
|
+
# // you can set options by adding comments that look like JSON pairs
|
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
|
17
|
+
#
|
18
|
+
#
|
2
19
|
class Bundler
|
3
20
|
class MissingFile < Jim::Error; end
|
4
|
-
|
21
|
+
|
5
22
|
attr_accessor :jimfile, :index, :requirements, :paths, :options
|
6
|
-
|
7
|
-
|
23
|
+
|
24
|
+
# create a new bundler instance passing in the Jimfile as a `Pathname` or a
|
25
|
+
# string. `index` is a Jim::Index
|
26
|
+
def initialize(jimfile, index = nil, options = {})
|
8
27
|
self.jimfile = jimfile.is_a?(Pathname) ? jimfile.read : jimfile
|
9
28
|
self.index = index || Jim::Index.new
|
10
29
|
self.options = {}
|
@@ -14,7 +33,8 @@ module Jim
|
|
14
33
|
self.add(options[:vendor_dir]) if options[:vendor_dir]
|
15
34
|
self.paths = []
|
16
35
|
end
|
17
|
-
|
36
|
+
|
37
|
+
# resove the requirements specified into Jimfile or raise a MissingFile error
|
18
38
|
def resolve!
|
19
39
|
self.requirements.each do |search|
|
20
40
|
name, version = search.strip.split(/\s+/)
|
@@ -27,7 +47,9 @@ module Jim
|
|
27
47
|
end
|
28
48
|
paths
|
29
49
|
end
|
30
|
-
|
50
|
+
|
51
|
+
# concatenate all the requirements into a single file and write to `to` or to the
|
52
|
+
# path specified in the :bundled_path option
|
31
53
|
def bundle!(to = nil)
|
32
54
|
resolve! if paths.empty?
|
33
55
|
to = options[:bundled_path] if to.nil? && options[:bundled_path]
|
@@ -38,7 +60,10 @@ module Jim
|
|
38
60
|
end
|
39
61
|
io
|
40
62
|
end
|
41
|
-
|
63
|
+
|
64
|
+
# concatenate all the requirements into a single file then run through a JS
|
65
|
+
# then write to `to` or to the path specified in the :bundled_path option.
|
66
|
+
# You can also use the YUI compressor by setting the option :compressor to 'yui'
|
42
67
|
def compress!(to = nil)
|
43
68
|
to = options[:compressed_path] if to.nil? && options[:compressed_path]
|
44
69
|
io = io_for_path(to)
|
@@ -46,7 +71,9 @@ module Jim
|
|
46
71
|
io << js_compress(bundle!(false))
|
47
72
|
io
|
48
73
|
end
|
49
|
-
|
74
|
+
|
75
|
+
# copy each of the requirements into the dir specified with `dir` or the path
|
76
|
+
# specified with the :vendor_dir option
|
50
77
|
def vendor!(dir = nil)
|
51
78
|
resolve! if paths.empty?
|
52
79
|
dir ||= options[:vendor_dir]
|
@@ -56,7 +83,7 @@ module Jim
|
|
56
83
|
Jim::Installer.new(path, dir, :shallow => true).install
|
57
84
|
end
|
58
85
|
end
|
59
|
-
|
86
|
+
|
60
87
|
private
|
61
88
|
def io_for_path(to)
|
62
89
|
case to
|
@@ -72,7 +99,7 @@ module Jim
|
|
72
99
|
""
|
73
100
|
end
|
74
101
|
end
|
75
|
-
|
102
|
+
|
76
103
|
def parse_jimfile
|
77
104
|
jimfile.each_line do |line|
|
78
105
|
if /^\/\/\s?([^\:]+)\:\s(.*)$/.match line
|
@@ -82,21 +109,29 @@ module Jim
|
|
82
109
|
end
|
83
110
|
end
|
84
111
|
end
|
85
|
-
|
112
|
+
|
86
113
|
def js_compress(uncompressed)
|
87
114
|
if options[:compressor] == 'yui'
|
88
|
-
|
115
|
+
begin
|
116
|
+
require "yui/compressor"
|
117
|
+
rescue LoadError
|
118
|
+
raise "You must install the yui compressor gem to use the compressor\ngem install yui-compressor"
|
119
|
+
end
|
89
120
|
compressor = ::YUI::JavaScriptCompressor.new
|
90
121
|
else
|
91
|
-
|
122
|
+
begin
|
123
|
+
require 'closure-compiler'
|
124
|
+
rescue LoadError
|
125
|
+
raise "You must install the closure compiler gem to use the compressor\ngem install closure-compiler"
|
126
|
+
end
|
92
127
|
compressor = ::Closure::Compiler.new
|
93
128
|
end
|
94
129
|
compressor.compress(uncompressed)
|
95
130
|
end
|
96
|
-
|
131
|
+
|
97
132
|
def logger
|
98
133
|
Jim.logger
|
99
134
|
end
|
100
|
-
|
135
|
+
|
101
136
|
end
|
102
137
|
end
|
data/lib/jim/cli.rb
CHANGED
@@ -1,8 +1,15 @@
|
|
1
|
+
require 'optparse'
|
2
|
+
|
1
3
|
module Jim
|
4
|
+
|
5
|
+
# CLI handles the command line interface for the `jim` binary.
|
6
|
+
# The layout is farily simple. Options are parsed using optparse.rb and
|
7
|
+
# the different public methods represent 1-1 the commands provided by the bin.
|
2
8
|
class CLI
|
3
9
|
|
4
10
|
attr_accessor :jimfile, :jimhome, :force
|
5
11
|
|
12
|
+
# create a new instance with the args passed from the command line i.e. ARGV
|
6
13
|
def initialize(args)
|
7
14
|
@output = ""
|
8
15
|
# set the default jimhome
|
@@ -13,6 +20,7 @@ module Jim
|
|
13
20
|
## try to run based on args
|
14
21
|
end
|
15
22
|
|
23
|
+
# method called by the bin directly after initialization.
|
16
24
|
def run
|
17
25
|
command = @args.shift
|
18
26
|
if command && respond_to?(command)
|
@@ -29,12 +37,14 @@ module Jim
|
|
29
37
|
@output << e.message + " (#{e.class})"
|
30
38
|
end
|
31
39
|
|
40
|
+
# list the possible commands to the logger
|
32
41
|
def commands
|
33
42
|
logger.info "Usage: jim [options] [command] [args]\n"
|
34
43
|
logger.info "Commands:"
|
35
44
|
logger.info template('commands')
|
36
45
|
end
|
37
46
|
|
47
|
+
# list the possible commands without detailed descriptions
|
38
48
|
def cheat
|
39
49
|
logger.info "Usage: jim [options] [command] [args]\n"
|
40
50
|
logger.info "Commands:"
|
@@ -42,6 +52,7 @@ module Jim
|
|
42
52
|
logger.info "run commands for details"
|
43
53
|
end
|
44
54
|
|
55
|
+
# initialize the current dir with a new Jimfile
|
45
56
|
def init(dir = nil)
|
46
57
|
dir = Pathname.new(dir || '')
|
47
58
|
jimfile_path = dir + 'Jimfile'
|
@@ -55,34 +66,40 @@ module Jim
|
|
55
66
|
end
|
56
67
|
end
|
57
68
|
|
69
|
+
# install the file/project `url` into `jimhome`
|
58
70
|
def install(url, name = false, version = false)
|
59
71
|
Jim::Installer.new(url, jimhome, :force => force, :name => name, :version => version).install
|
60
72
|
end
|
61
73
|
|
74
|
+
# bundle the files specified in Jimfile into `to`
|
62
75
|
def bundle(to = nil)
|
63
76
|
path = bundler.bundle!(to)
|
64
77
|
end
|
65
78
|
|
79
|
+
# compress the files specified in Jimfile into `to`
|
66
80
|
def compress(to = nil)
|
67
81
|
path = bundler.compress!(to)
|
68
82
|
end
|
69
83
|
|
84
|
+
# copy/vendor all the files specified in Jimfile to `dir`
|
85
|
+
def vendor(dir = nil)
|
86
|
+
bundler.vendor!(dir)
|
87
|
+
end
|
88
|
+
|
89
|
+
# list the installed projects and versions
|
70
90
|
def list
|
71
91
|
logger.info "Getting list of installed files in #{index.directories.join(':')}"
|
72
92
|
list = index.list
|
73
93
|
logger.info "Installed:\n#{list.collect {|i| "#{i[0]} (#{i[1].join(', ')})"}.join("\n")}"
|
74
94
|
end
|
75
95
|
|
96
|
+
# list the files and their resolved paths specified in the Jimfile
|
76
97
|
def resolve
|
77
98
|
resolved = bundler.resolve!
|
78
99
|
logger.info "Files:\n#{resolved.join("\n")}"
|
79
100
|
resolved
|
80
101
|
end
|
81
|
-
|
82
|
-
def vendor(dir = nil)
|
83
|
-
bundler.vendor!(dir)
|
84
|
-
end
|
85
|
-
|
102
|
+
|
86
103
|
private
|
87
104
|
def parse_options(runtime_args)
|
88
105
|
OptionParser.new("", 24, ' ') do |opts|
|
@@ -124,7 +141,7 @@ module Jim
|
|
124
141
|
end
|
125
142
|
|
126
143
|
def index
|
127
|
-
@index ||= Jim::Index.new(jimhome + 'lib')
|
144
|
+
@index ||= Jim::Index.new(jimhome + 'lib', Dir.pwd)
|
128
145
|
end
|
129
146
|
|
130
147
|
def bundler
|
data/lib/jim/index.rb
CHANGED
data/lib/jim/rack.rb
CHANGED
@@ -1,6 +1,14 @@
|
|
1
1
|
require 'jim'
|
2
2
|
|
3
3
|
module Jim
|
4
|
+
# Jim::Rack is a Rack middleware for allowing live bundling and compression
|
5
|
+
# of the requirements in your Jimfile without having to rebundle using the command
|
6
|
+
# line. You can specify a number of options:
|
7
|
+
#
|
8
|
+
# :jimfile: Path to your Jimfile (default ./Jimfile)
|
9
|
+
# :jimhome: Path to your JIMHOME directory (default ENV['JIMHOME'] or ~/.jim)
|
10
|
+
# :bundled_uri: URI to serve the bundled requirements
|
11
|
+
# :compressed_uri: URI to serve the compressed requirements
|
4
12
|
class Rack
|
5
13
|
|
6
14
|
def initialize(app, options = {})
|
data/lib/jim.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jim
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Aaron Quint
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-02-
|
12
|
+
date: 2010-02-20 00:00:00 -05:00
|
13
13
|
default_executable: jim
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -22,6 +22,16 @@ dependencies:
|
|
22
22
|
- !ruby/object:Gem::Version
|
23
23
|
version: 0.1.1
|
24
24
|
version:
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: yajl-ruby
|
27
|
+
type: :runtime
|
28
|
+
version_requirement:
|
29
|
+
version_requirements: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: "0"
|
34
|
+
version:
|
25
35
|
- !ruby/object:Gem::Dependency
|
26
36
|
name: shoulda
|
27
37
|
type: :development
|
@@ -32,6 +42,26 @@ dependencies:
|
|
32
42
|
- !ruby/object:Gem::Version
|
33
43
|
version: "0"
|
34
44
|
version:
|
45
|
+
- !ruby/object:Gem::Dependency
|
46
|
+
name: fakeweb
|
47
|
+
type: :development
|
48
|
+
version_requirement:
|
49
|
+
version_requirements: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ">="
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 1.2.8
|
54
|
+
version:
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: mocha
|
57
|
+
type: :development
|
58
|
+
version_requirement:
|
59
|
+
version_requirements: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - ">="
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: "0"
|
64
|
+
version:
|
35
65
|
description: jim is your friendly javascript library manager. He downloads, stores, bundles, vendors and compresses.
|
36
66
|
email: aaron@quirkey.com
|
37
67
|
executables:
|