juicer 0.2.6 → 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 +28 -0
- data/Rakefile +84 -36
- data/Readme.rdoc +192 -23
- data/VERSION +1 -0
- data/bin/juicer +2 -4
- data/lib/juicer.rb +9 -10
- data/lib/juicer/asset/path.rb +275 -0
- data/lib/juicer/asset/path_resolver.rb +79 -0
- data/lib/juicer/binary.rb +3 -5
- data/lib/juicer/cache_buster.rb +112 -27
- data/lib/juicer/command/install.rb +4 -2
- data/lib/juicer/command/list.rb +16 -9
- data/lib/juicer/command/merge.rb +30 -14
- data/lib/juicer/command/verify.rb +1 -1
- data/lib/juicer/css_cache_buster.rb +31 -47
- data/lib/juicer/datafy/datafy.rb +20 -0
- data/lib/juicer/dependency_resolver/css_dependency_resolver.rb +29 -0
- data/lib/juicer/dependency_resolver/dependency_resolver.rb +101 -0
- data/lib/juicer/dependency_resolver/javascript_dependency_resolver.rb +23 -0
- data/lib/juicer/ext/logger.rb +5 -0
- data/lib/juicer/ext/string.rb +47 -0
- data/lib/juicer/ext/symbol.rb +15 -0
- data/lib/juicer/image_embed.rb +129 -0
- data/lib/juicer/install/base.rb +2 -2
- data/lib/juicer/install/closure_compiler_installer.rb +69 -0
- data/lib/juicer/install/jslint_installer.rb +3 -3
- data/lib/juicer/install/rhino_installer.rb +3 -2
- data/lib/juicer/install/yui_compressor_installer.rb +3 -2
- data/lib/juicer/jslint.rb +1 -1
- data/lib/juicer/merger/base.rb +1 -1
- data/lib/juicer/merger/javascript_merger.rb +3 -4
- data/lib/juicer/merger/stylesheet_merger.rb +13 -15
- data/lib/juicer/minifyer/closure_compiler.rb +90 -0
- data/lib/juicer/minifyer/java_base.rb +77 -0
- data/lib/juicer/minifyer/yui_compressor.rb +15 -48
- data/test/bin/jslint-1.0.js +523 -0
- data/test/bin/jslint.js +523 -0
- data/test/bin/rhino1_7R1.zip +0 -0
- data/test/bin/rhino1_7R2-RC1.jar +0 -0
- data/test/bin/rhino1_7R2-RC1.zip +0 -0
- data/test/bin/yuicompressor +0 -0
- data/test/bin/yuicompressor-2.3.5.zip +0 -0
- data/test/bin/yuicompressor-2.4.2.jar +0 -0
- data/test/bin/yuicompressor-2.4.2.zip +0 -0
- data/test/data/Changelog.txt +10 -0
- data/test/data/a.css +3 -0
- data/test/data/a.js +5 -0
- data/test/data/a1.css +5 -0
- data/test/data/b.css +1 -0
- data/test/data/b.js +5 -0
- data/test/data/b1.css +5 -0
- data/test/data/c1.css +3 -0
- data/test/data/css/2.gif +1 -0
- data/test/data/css/test.css +11 -0
- data/test/data/css/test2.css +1 -0
- data/test/data/d1.css +3 -0
- data/test/data/images/1.png +1 -0
- data/test/data/my_app.js +2 -0
- data/test/data/not-ok.js +2 -0
- data/test/data/ok.js +3 -0
- data/test/data/path_test.css +5 -0
- data/test/data/path_test2.css +14 -0
- data/test/data/pkg/module/moda.js +2 -0
- data/test/data/pkg/module/modb.js +3 -0
- data/test/data/pkg/pkg.js +1 -0
- data/test/fixtures/yui-download.html +425 -0
- data/test/test_helper.rb +36 -7
- data/test/unit/juicer/asset/path_resolver_test.rb +76 -0
- data/test/unit/juicer/asset/path_test.rb +370 -0
- data/test/unit/juicer/cache_buster_test.rb +104 -0
- data/test/{juicer/test_chainable.rb → unit/juicer/chainable_test.rb} +1 -1
- data/test/unit/juicer/command/install_test.rb +58 -0
- data/test/{juicer/command/test_list.rb → unit/juicer/command/list_test.rb} +26 -14
- data/test/unit/juicer/command/merge_test.rb +162 -0
- data/test/{juicer/command/test_util.rb → unit/juicer/command/util_test.rb} +10 -6
- data/test/unit/juicer/command/verify_test.rb +48 -0
- data/test/{juicer/test_css_cache_buster.rb → unit/juicer/css_cache_buster_test.rb} +10 -30
- data/test/unit/juicer/datafy_test.rb +37 -0
- data/test/{juicer/merger/test_css_dependency_resolver.rb → unit/juicer/dependency_resolver/css_dependency_resolver_test.rb} +2 -2
- data/test/{juicer/merger/test_javascript_dependency_resolver.rb → unit/juicer/dependency_resolver/javascript_dependency_resolver_test.rb} +13 -2
- data/test/unit/juicer/ext/{#string_test.rb# → string_test.rb} +0 -7
- data/test/unit/juicer/ext/symbol_test.rb +27 -0
- data/test/unit/juicer/image_embed_test.rb +271 -0
- data/test/unit/juicer/install/installer_base_test.rb +214 -0
- data/test/{juicer/install/test_jslint_installer.rb → unit/juicer/install/jslint_installer_test.rb} +1 -1
- data/test/{juicer/install/test_rhino_installer.rb → unit/juicer/install/rhino_installer_test.rb} +1 -1
- data/test/{juicer/install/test_yui_compressor_installer.rb → unit/juicer/install/yui_compressor_test.rb} +16 -16
- data/test/unit/juicer/jslint_test.rb +60 -0
- data/test/{juicer/merger/test_base.rb → unit/juicer/merger/base_test.rb} +1 -1
- data/test/{juicer/merger/test_javascript_merger.rb → unit/juicer/merger/javascript_merger_test.rb} +2 -2
- data/test/{juicer/merger/test_stylesheet_merger.rb → unit/juicer/merger/stylesheet_merger_test.rb} +15 -13
- data/test/unit/juicer/minifyer/closure_compressor_test.rb +107 -0
- data/test/{integration → unit}/juicer/minifyer/yui_compressor_test.rb +30 -47
- data/test/unit/juicer_test.rb +1 -0
- metadata +207 -113
- data/lib/juicer/core.rb +0 -61
- data/lib/juicer/merger/css_dependency_resolver.rb +0 -25
- data/lib/juicer/merger/dependency_resolver.rb +0 -82
- data/lib/juicer/merger/javascript_dependency_resolver.rb +0 -21
- data/tasks/ann.rake +0 -80
- data/tasks/bones.rake +0 -20
- data/tasks/gem.rake +0 -201
- data/tasks/git.rake +0 -40
- data/tasks/notes.rake +0 -27
- data/tasks/post_load.rake +0 -34
- data/tasks/rdoc.rake +0 -51
- data/tasks/rubyforge.rake +0 -55
- data/tasks/setup.rb +0 -292
- data/tasks/spec.rake +0 -54
- data/tasks/svn.rake +0 -47
- data/tasks/test.rake +0 -40
- data/tasks/test/setup.rake +0 -35
- data/tasks/zentest.rake +0 -36
- data/test/juicer/command/test_install.rb +0 -53
- data/test/juicer/command/test_merge.rb +0 -160
- data/test/juicer/command/test_verify.rb +0 -33
- data/test/juicer/install/test_installer_base.rb +0 -195
- data/test/juicer/minifyer/test_yui_compressor.rb +0 -159
- data/test/juicer/test_cache_buster.rb +0 -58
- data/test/juicer/test_core.rb +0 -47
- data/test/juicer/test_jslint.rb +0 -33
- data/test/test_juicer.rb +0 -4
data/lib/juicer/core.rb
DELETED
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
#
|
|
2
|
-
# Additions to core Ruby objects
|
|
3
|
-
#
|
|
4
|
-
|
|
5
|
-
class String
|
|
6
|
-
#
|
|
7
|
-
# Turn an underscored string into camel case, ie this_becomes -> ThisBecomes
|
|
8
|
-
#
|
|
9
|
-
def camel_case
|
|
10
|
-
self.split("_").inject("") { |str, piece| str + piece.capitalize }
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
#
|
|
14
|
-
# Treat a string as a class name and return the class. Optionally provide a
|
|
15
|
-
# module to look up the class in.
|
|
16
|
-
#
|
|
17
|
-
def to_class(mod = nil)
|
|
18
|
-
res = "#{mod}::#{self}".sub(/^::/, "").split("::").inject(Object) do |mod, obj|
|
|
19
|
-
raise "No such class/module" unless mod.const_defined?(obj)
|
|
20
|
-
mod = mod.const_get(obj)
|
|
21
|
-
end
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
#
|
|
25
|
-
# Turn a string in either underscore or camel case form into a class directly
|
|
26
|
-
#
|
|
27
|
-
def classify(mod = nil)
|
|
28
|
-
self.camel_case.to_class(mod)
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
#
|
|
32
|
-
# Turn a camelcase string into underscore string
|
|
33
|
-
#
|
|
34
|
-
unless String.method_defined?(:underscore)
|
|
35
|
-
def underscore
|
|
36
|
-
self.split(/([A-Z][^A-Z]*)/).find_all { |str| str != "" }.join("_").downcase
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
class Symbol
|
|
42
|
-
#
|
|
43
|
-
# Converts symbol to string and calls String#camel_case
|
|
44
|
-
#
|
|
45
|
-
def camel_case
|
|
46
|
-
self.to_s.camel_case
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
#
|
|
50
|
-
# Converts symbol to string and calls String#classify
|
|
51
|
-
#
|
|
52
|
-
def classify(mod = nil)
|
|
53
|
-
self.to_s.classify(mod)
|
|
54
|
-
end
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
class Logger
|
|
58
|
-
def format_message(severity, datetime, progname, msg)
|
|
59
|
-
"#{msg}\n"
|
|
60
|
-
end
|
|
61
|
-
end
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
require File.expand_path(File.join(File.dirname(__FILE__), "dependency_resolver"))
|
|
2
|
-
|
|
3
|
-
module Juicer
|
|
4
|
-
module Merger
|
|
5
|
-
# Resolves @import statements in CSS files and builds a list of all
|
|
6
|
-
# files, in order.
|
|
7
|
-
#
|
|
8
|
-
class CssDependencyResolver < DependencyResolver
|
|
9
|
-
# Regexp borrowed from similar project:
|
|
10
|
-
# http://github.com/cgriego/front-end-blender/tree/master/lib/front_end_architect/blender.rb
|
|
11
|
-
@@import_pattern = /^\s*@import(?: url\(| )(['"]?)([^\?'"\)\s]+)(\?(?:[^'"\)]+)?)?\1\)?(?:[^?;]+)?;?/im
|
|
12
|
-
|
|
13
|
-
private
|
|
14
|
-
def parse(line, imported_file = nil)
|
|
15
|
-
return $2 if line =~ @@import_pattern
|
|
16
|
-
|
|
17
|
-
# At first sight of actual CSS rules we abort (TODO: This does not take
|
|
18
|
-
# into account the fact that rules may be commented out and that more
|
|
19
|
-
# imports may follow)
|
|
20
|
-
throw :done if imported_file && line =~ %r{/*}
|
|
21
|
-
throw :done if line =~ /^[\.\#a-zA-Z\:]/
|
|
22
|
-
end
|
|
23
|
-
end
|
|
24
|
-
end
|
|
25
|
-
end
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
module Juicer
|
|
2
|
-
module Merger
|
|
3
|
-
class DependencyResolver
|
|
4
|
-
attr_reader :files
|
|
5
|
-
|
|
6
|
-
# Constructor
|
|
7
|
-
def initialize(options = {})
|
|
8
|
-
@files = []
|
|
9
|
-
@options = options
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
#
|
|
13
|
-
# Resolve dependencies.
|
|
14
|
-
# This method accepts an optional block. The block will receive each
|
|
15
|
-
# file in succession. The file is included in the returned collection
|
|
16
|
-
# if the block is true for the given file. Without a block every found
|
|
17
|
-
# file is returned.
|
|
18
|
-
#
|
|
19
|
-
def resolve(file, &block)
|
|
20
|
-
@files = []
|
|
21
|
-
_resolve(file, &block)
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
#
|
|
25
|
-
# Resolves a path relative to another. If the path is absolute (ie it
|
|
26
|
-
# starts with a protocol or /) the <tt>:web_root</tt> options has to be
|
|
27
|
-
# set as well.
|
|
28
|
-
#
|
|
29
|
-
def resolve_path(path, reference)
|
|
30
|
-
# Absolute URL
|
|
31
|
-
if path =~ %r{^(/|[a-z]+:)}
|
|
32
|
-
if @options[:web_root].nil?
|
|
33
|
-
msg = "Cannot resolve absolute path '#{path}' without web root option"
|
|
34
|
-
raise ArgumentError.new(msg)
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
path.sub!(%r{^[a-z]+://[^/]+/}, '')
|
|
38
|
-
return File.expand_path(File.join(@options[:web_root], path))
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
File.expand_path(File.join(File.dirname(reference), path))
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
private
|
|
45
|
-
def parse(line)
|
|
46
|
-
raise NotImplementedError.new
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
#
|
|
50
|
-
# Carries out the actual work of resolve. resolve resets the internal
|
|
51
|
-
# file list and yields control to _resolve for rebuilding the file list.
|
|
52
|
-
#
|
|
53
|
-
def _resolve(file)
|
|
54
|
-
imported_file = nil
|
|
55
|
-
|
|
56
|
-
IO.foreach(file) do |line|
|
|
57
|
-
# Implementing subclasses may throw :done from the parse method when
|
|
58
|
-
# the file is exhausted for dependency declaration possibilities.
|
|
59
|
-
catch(:done) do
|
|
60
|
-
imported_file = parse(line, imported_file)
|
|
61
|
-
|
|
62
|
-
# If a dependency declaration was found
|
|
63
|
-
if imported_file
|
|
64
|
-
# Resolves a path relative to the file that imported it
|
|
65
|
-
imported_file = resolve_path(imported_file, file)
|
|
66
|
-
|
|
67
|
-
# Only keep processing file if it's not already included.
|
|
68
|
-
# Yield to block to allow caller to ignore file
|
|
69
|
-
if !@files.include?(imported_file) && (!block_given? || yield(imported_file))
|
|
70
|
-
# Check this file for imports before adding it to get order right
|
|
71
|
-
_resolve(imported_file) { |f| f != File.expand_path(file) }
|
|
72
|
-
end
|
|
73
|
-
end
|
|
74
|
-
end
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
file = File.expand_path(file)
|
|
78
|
-
@files << file if !@files.include?(file) && (!block_given? || yield(file))
|
|
79
|
-
end
|
|
80
|
-
end
|
|
81
|
-
end
|
|
82
|
-
end
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
require File.expand_path(File.join(File.dirname(__FILE__), "dependency_resolver"))
|
|
2
|
-
|
|
3
|
-
module Juicer
|
|
4
|
-
module Merger
|
|
5
|
-
# Resolves @depends and @depend statements in comments in JavaScript files.
|
|
6
|
-
# Only the first comment in a JavaScript file is parsed
|
|
7
|
-
#
|
|
8
|
-
class JavaScriptDependencyResolver < DependencyResolver
|
|
9
|
-
@@depends_pattern = /\@depends?\s+([^\s\'\"\;]+)/
|
|
10
|
-
|
|
11
|
-
private
|
|
12
|
-
def parse(line, imported_file = nil)
|
|
13
|
-
return $1 if line =~ @@depends_pattern
|
|
14
|
-
|
|
15
|
-
# If we have already skimmed through some @depend/@depends or a
|
|
16
|
-
# closing comment we're done.
|
|
17
|
-
throw :done unless imported_file.nil? || !(line =~ /\*\//)
|
|
18
|
-
end
|
|
19
|
-
end
|
|
20
|
-
end
|
|
21
|
-
end
|
data/tasks/ann.rake
DELETED
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
begin
|
|
3
|
-
require 'bones/smtp_tls'
|
|
4
|
-
rescue LoadError
|
|
5
|
-
require 'net/smtp'
|
|
6
|
-
end
|
|
7
|
-
require 'time'
|
|
8
|
-
|
|
9
|
-
namespace :ann do
|
|
10
|
-
|
|
11
|
-
# A prerequisites task that all other tasks depend upon
|
|
12
|
-
task :prereqs
|
|
13
|
-
|
|
14
|
-
file PROJ.ann.file do
|
|
15
|
-
ann = PROJ.ann
|
|
16
|
-
puts "Generating #{ann.file}"
|
|
17
|
-
File.open(ann.file,'w') do |fd|
|
|
18
|
-
fd.puts("#{PROJ.name} version #{PROJ.version}")
|
|
19
|
-
fd.puts(" by #{Array(PROJ.authors).first}") if PROJ.authors
|
|
20
|
-
fd.puts(" #{PROJ.url}") if PROJ.url.valid?
|
|
21
|
-
fd.puts(" (the \"#{PROJ.release_name}\" release)") if PROJ.release_name
|
|
22
|
-
fd.puts
|
|
23
|
-
fd.puts("== DESCRIPTION")
|
|
24
|
-
fd.puts
|
|
25
|
-
fd.puts(PROJ.description)
|
|
26
|
-
fd.puts
|
|
27
|
-
fd.puts(PROJ.changes.sub(%r/^.*$/, '== CHANGES'))
|
|
28
|
-
fd.puts
|
|
29
|
-
ann.paragraphs.each do |p|
|
|
30
|
-
fd.puts "== #{p.upcase}"
|
|
31
|
-
fd.puts
|
|
32
|
-
fd.puts paragraphs_of(PROJ.readme_file, p).join("\n\n")
|
|
33
|
-
fd.puts
|
|
34
|
-
end
|
|
35
|
-
fd.puts ann.text if ann.text
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
desc "Create an announcement file"
|
|
40
|
-
task :announcement => ['ann:prereqs', PROJ.ann.file]
|
|
41
|
-
|
|
42
|
-
desc "Send an email announcement"
|
|
43
|
-
task :email => ['ann:prereqs', PROJ.ann.file] do
|
|
44
|
-
ann = PROJ.ann
|
|
45
|
-
from = ann.email[:from] || Array(PROJ.authors).first || PROJ.email
|
|
46
|
-
to = Array(ann.email[:to])
|
|
47
|
-
|
|
48
|
-
### build a mail header for RFC 822
|
|
49
|
-
rfc822msg = "From: #{from}\n"
|
|
50
|
-
rfc822msg << "To: #{to.join(',')}\n"
|
|
51
|
-
rfc822msg << "Subject: [ANN] #{PROJ.name} #{PROJ.version}"
|
|
52
|
-
rfc822msg << " (#{PROJ.release_name})" if PROJ.release_name
|
|
53
|
-
rfc822msg << "\n"
|
|
54
|
-
rfc822msg << "Date: #{Time.new.rfc822}\n"
|
|
55
|
-
rfc822msg << "Message-Id: "
|
|
56
|
-
rfc822msg << "<#{"%.8f" % Time.now.to_f}@#{ann.email[:domain]}>\n\n"
|
|
57
|
-
rfc822msg << File.read(ann.file)
|
|
58
|
-
|
|
59
|
-
params = [:server, :port, :domain, :acct, :passwd, :authtype].map do |key|
|
|
60
|
-
ann.email[key]
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
params[3] = PROJ.email if params[3].nil?
|
|
64
|
-
|
|
65
|
-
if params[4].nil?
|
|
66
|
-
STDOUT.write "Please enter your e-mail password (#{params[3]}): "
|
|
67
|
-
params[4] = STDIN.gets.chomp
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
### send email
|
|
71
|
-
Net::SMTP.start(*params) {|smtp| smtp.sendmail(rfc822msg, from, to)}
|
|
72
|
-
end
|
|
73
|
-
end # namespace :ann
|
|
74
|
-
|
|
75
|
-
desc 'Alias to ann:announcement'
|
|
76
|
-
task :ann => 'ann:announcement'
|
|
77
|
-
|
|
78
|
-
CLOBBER << PROJ.ann.file
|
|
79
|
-
|
|
80
|
-
# EOF
|
data/tasks/bones.rake
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
if HAVE_BONES
|
|
3
|
-
|
|
4
|
-
namespace :bones do
|
|
5
|
-
|
|
6
|
-
desc 'Show the PROJ open struct'
|
|
7
|
-
task :debug do |t|
|
|
8
|
-
atr = if t.application.top_level_tasks.length == 2
|
|
9
|
-
t.application.top_level_tasks.pop
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
if atr then Bones::Debug.show_attr(PROJ, atr)
|
|
13
|
-
else Bones::Debug.show PROJ end
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
end # namespace :bones
|
|
17
|
-
|
|
18
|
-
end # HAVE_BONES
|
|
19
|
-
|
|
20
|
-
# EOF
|
data/tasks/gem.rake
DELETED
|
@@ -1,201 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
require 'find'
|
|
3
|
-
require 'rake/packagetask'
|
|
4
|
-
require 'rubygems/user_interaction'
|
|
5
|
-
require 'rubygems/builder'
|
|
6
|
-
|
|
7
|
-
module Bones
|
|
8
|
-
class GemPackageTask < Rake::PackageTask
|
|
9
|
-
# Ruby GEM spec containing the metadata for this package. The
|
|
10
|
-
# name, version and package_files are automatically determined
|
|
11
|
-
# from the GEM spec and don't need to be explicitly provided.
|
|
12
|
-
#
|
|
13
|
-
attr_accessor :gem_spec
|
|
14
|
-
|
|
15
|
-
# Tasks from the Bones gem directory
|
|
16
|
-
attr_reader :bones_files
|
|
17
|
-
|
|
18
|
-
# Create a GEM Package task library. Automatically define the gem
|
|
19
|
-
# if a block is given. If no block is supplied, then +define+
|
|
20
|
-
# needs to be called to define the task.
|
|
21
|
-
#
|
|
22
|
-
def initialize(gem_spec)
|
|
23
|
-
init(gem_spec)
|
|
24
|
-
yield self if block_given?
|
|
25
|
-
define if block_given?
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
# Initialization tasks without the "yield self" or define
|
|
29
|
-
# operations.
|
|
30
|
-
#
|
|
31
|
-
def init(gem)
|
|
32
|
-
super(gem.name, gem.version)
|
|
33
|
-
@gem_spec = gem
|
|
34
|
-
@package_files += gem_spec.files if gem_spec.files
|
|
35
|
-
@bones_files = []
|
|
36
|
-
|
|
37
|
-
local_setup = File.join(Dir.pwd, %w[tasks setup.rb])
|
|
38
|
-
if !test(?e, local_setup)
|
|
39
|
-
Dir.glob(::Bones.path(%w[lib bones tasks *])).each {|fn| bones_files << fn}
|
|
40
|
-
end
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
# Create the Rake tasks and actions specified by this
|
|
44
|
-
# GemPackageTask. (+define+ is automatically called if a block is
|
|
45
|
-
# given to +new+).
|
|
46
|
-
#
|
|
47
|
-
def define
|
|
48
|
-
super
|
|
49
|
-
task :prereqs
|
|
50
|
-
task :package => ['gem:prereqs', "#{package_dir_path}/#{gem_file}"]
|
|
51
|
-
file "#{package_dir_path}/#{gem_file}" => [package_dir_path] + package_files + bones_files do
|
|
52
|
-
when_writing("Creating GEM") {
|
|
53
|
-
chdir(package_dir_path) do
|
|
54
|
-
Gem::Builder.new(gem_spec).build
|
|
55
|
-
verbose(true) {
|
|
56
|
-
mv gem_file, "../#{gem_file}"
|
|
57
|
-
}
|
|
58
|
-
end
|
|
59
|
-
}
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
file package_dir_path => bones_files do
|
|
63
|
-
mkdir_p package_dir rescue nil
|
|
64
|
-
|
|
65
|
-
gem_spec.files = (gem_spec.files +
|
|
66
|
-
bones_files.map {|fn| File.join('tasks', File.basename(fn))}).sort
|
|
67
|
-
|
|
68
|
-
bones_files.each do |fn|
|
|
69
|
-
base_fn = File.join('tasks', File.basename(fn))
|
|
70
|
-
f = File.join(package_dir_path, base_fn)
|
|
71
|
-
fdir = File.dirname(f)
|
|
72
|
-
mkdir_p(fdir) if !File.exist?(fdir)
|
|
73
|
-
if File.directory?(fn)
|
|
74
|
-
mkdir_p(f)
|
|
75
|
-
else
|
|
76
|
-
raise "file name conflict for '#{base_fn}' (conflicts with '#{fn}')" if test(?e, f)
|
|
77
|
-
safe_ln(fn, f)
|
|
78
|
-
end
|
|
79
|
-
end
|
|
80
|
-
end
|
|
81
|
-
end
|
|
82
|
-
|
|
83
|
-
def gem_file
|
|
84
|
-
if @gem_spec.platform == Gem::Platform::RUBY
|
|
85
|
-
"#{package_name}.gem"
|
|
86
|
-
else
|
|
87
|
-
"#{package_name}-#{@gem_spec.platform}.gem"
|
|
88
|
-
end
|
|
89
|
-
end
|
|
90
|
-
end # class GemPackageTask
|
|
91
|
-
end # module Bones
|
|
92
|
-
|
|
93
|
-
namespace :gem do
|
|
94
|
-
|
|
95
|
-
PROJ.gem._spec = Gem::Specification.new do |s|
|
|
96
|
-
s.name = PROJ.name
|
|
97
|
-
s.version = PROJ.version
|
|
98
|
-
s.summary = PROJ.summary
|
|
99
|
-
s.authors = Array(PROJ.authors)
|
|
100
|
-
s.email = PROJ.email
|
|
101
|
-
s.homepage = Array(PROJ.url).first
|
|
102
|
-
s.rubyforge_project = PROJ.rubyforge.name
|
|
103
|
-
|
|
104
|
-
s.description = PROJ.description
|
|
105
|
-
|
|
106
|
-
PROJ.gem.dependencies.each do |dep|
|
|
107
|
-
s.add_dependency(*dep)
|
|
108
|
-
end
|
|
109
|
-
|
|
110
|
-
PROJ.gem.development_dependencies.each do |dep|
|
|
111
|
-
s.add_development_dependency(*dep)
|
|
112
|
-
end
|
|
113
|
-
|
|
114
|
-
s.files = PROJ.gem.files
|
|
115
|
-
s.executables = PROJ.gem.executables.map {|fn| File.basename(fn)}
|
|
116
|
-
s.extensions = PROJ.gem.files.grep %r/extconf\.rb$/
|
|
117
|
-
|
|
118
|
-
s.bindir = 'bin'
|
|
119
|
-
dirs = Dir["{#{PROJ.libs.join(',')}}"]
|
|
120
|
-
s.require_paths = dirs unless dirs.empty?
|
|
121
|
-
|
|
122
|
-
incl = Regexp.new(PROJ.rdoc.include.join('|'))
|
|
123
|
-
excl = PROJ.rdoc.exclude.dup.concat %w[\.rb$ ^(\.\/|\/)?ext]
|
|
124
|
-
excl = Regexp.new(excl.join('|'))
|
|
125
|
-
rdoc_files = PROJ.gem.files.find_all do |fn|
|
|
126
|
-
case fn
|
|
127
|
-
when excl; false
|
|
128
|
-
when incl; true
|
|
129
|
-
else false end
|
|
130
|
-
end
|
|
131
|
-
s.rdoc_options = PROJ.rdoc.opts + ['--main', PROJ.rdoc.main]
|
|
132
|
-
s.extra_rdoc_files = rdoc_files
|
|
133
|
-
s.has_rdoc = true
|
|
134
|
-
|
|
135
|
-
if test ?f, PROJ.test.file
|
|
136
|
-
s.test_file = PROJ.test.file
|
|
137
|
-
else
|
|
138
|
-
s.test_files = PROJ.test.files.to_a
|
|
139
|
-
end
|
|
140
|
-
|
|
141
|
-
# Do any extra stuff the user wants
|
|
142
|
-
PROJ.gem.extras.each do |msg, val|
|
|
143
|
-
case val
|
|
144
|
-
when Proc
|
|
145
|
-
val.call(s.send(msg))
|
|
146
|
-
else
|
|
147
|
-
s.send "#{msg}=", val
|
|
148
|
-
end
|
|
149
|
-
end
|
|
150
|
-
end # Gem::Specification.new
|
|
151
|
-
|
|
152
|
-
Bones::GemPackageTask.new(PROJ.gem._spec) do |pkg|
|
|
153
|
-
pkg.need_tar = PROJ.gem.need_tar
|
|
154
|
-
pkg.need_zip = PROJ.gem.need_zip
|
|
155
|
-
end
|
|
156
|
-
|
|
157
|
-
desc 'Show information about the gem'
|
|
158
|
-
task :debug => 'gem:prereqs' do
|
|
159
|
-
puts PROJ.gem._spec.to_ruby
|
|
160
|
-
end
|
|
161
|
-
|
|
162
|
-
desc 'Write the gemspec '
|
|
163
|
-
task :spec => 'gem:prereqs' do
|
|
164
|
-
File.open("#{PROJ.name}.gemspec", 'w') do |f|
|
|
165
|
-
f.write PROJ.gem._spec.to_ruby
|
|
166
|
-
end
|
|
167
|
-
end
|
|
168
|
-
|
|
169
|
-
desc 'Install the gem'
|
|
170
|
-
task :install => [:clobber, 'gem:package'] do
|
|
171
|
-
sh "#{SUDO} #{GEM} install --local pkg/#{PROJ.gem._spec.full_name}"
|
|
172
|
-
|
|
173
|
-
# use this version of the command for rubygems > 1.0.0
|
|
174
|
-
#sh "#{SUDO} #{GEM} install --no-update-sources pkg/#{PROJ.gem._spec.full_name}"
|
|
175
|
-
end
|
|
176
|
-
|
|
177
|
-
desc 'Uninstall the gem'
|
|
178
|
-
task :uninstall do
|
|
179
|
-
installed_list = Gem.source_index.find_name(PROJ.name)
|
|
180
|
-
if installed_list and installed_list.collect { |s| s.version.to_s}.include?(PROJ.version) then
|
|
181
|
-
sh "#{SUDO} #{GEM} uninstall --version '#{PROJ.version}' --ignore-dependencies --executables #{PROJ.name}"
|
|
182
|
-
end
|
|
183
|
-
end
|
|
184
|
-
|
|
185
|
-
desc 'Reinstall the gem'
|
|
186
|
-
task :reinstall => [:uninstall, :install]
|
|
187
|
-
|
|
188
|
-
desc 'Cleanup the gem'
|
|
189
|
-
task :cleanup do
|
|
190
|
-
sh "#{SUDO} #{GEM} cleanup #{PROJ.gem._spec.name}"
|
|
191
|
-
end
|
|
192
|
-
end # namespace :gem
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
desc 'Alias to gem:package'
|
|
196
|
-
task :gem => 'gem:package'
|
|
197
|
-
|
|
198
|
-
task :clobber => 'gem:clobber_package'
|
|
199
|
-
remove_desc_for_task 'gem:clobber_package'
|
|
200
|
-
|
|
201
|
-
# EOF
|