sprout 0.7.219-i686-darwin10
Sign up to get free protection for your applications and to get access to all the features.
- data/MIT-LICENSE +20 -0
- data/TODO +12 -0
- data/bin/sprout +128 -0
- data/doc/Bundle +14 -0
- data/doc/Generator +35 -0
- data/doc/Library +63 -0
- data/doc/Task +21 -0
- data/doc/Tool +20 -0
- data/lib/platform.rb +109 -0
- data/lib/progress_bar.rb +354 -0
- data/lib/sprout.rb +496 -0
- data/lib/sprout/archive_unpacker.rb +225 -0
- data/lib/sprout/builder.rb +44 -0
- data/lib/sprout/commands/generate.rb +9 -0
- data/lib/sprout/dynamic_accessors.rb +34 -0
- data/lib/sprout/general_tasks.rb +6 -0
- data/lib/sprout/generator.rb +7 -0
- data/lib/sprout/generator/base_mixins.rb +186 -0
- data/lib/sprout/generator/named_base.rb +227 -0
- data/lib/sprout/log.rb +46 -0
- data/lib/sprout/process_runner.rb +111 -0
- data/lib/sprout/project_model.rb +278 -0
- data/lib/sprout/remote_file_loader.rb +71 -0
- data/lib/sprout/remote_file_target.rb +151 -0
- data/lib/sprout/simple_resolver.rb +88 -0
- data/lib/sprout/tasks/erb_resolver.rb +118 -0
- data/lib/sprout/tasks/gem_wrap_task.rb +200 -0
- data/lib/sprout/tasks/git_task.rb +134 -0
- data/lib/sprout/tasks/library_task.rb +118 -0
- data/lib/sprout/tasks/sftp_task.rb +248 -0
- data/lib/sprout/tasks/ssh_task.rb +153 -0
- data/lib/sprout/tasks/tool_task.rb +793 -0
- data/lib/sprout/tasks/zip_task.rb +158 -0
- data/lib/sprout/template_resolver.rb +207 -0
- data/lib/sprout/user.rb +383 -0
- data/lib/sprout/version.rb +12 -0
- data/lib/sprout/version_file.rb +89 -0
- data/lib/sprout/zip_util.rb +61 -0
- data/rakefile.rb +150 -0
- data/samples/gem_wrap/rakefile.rb +17 -0
- metadata +174 -0
@@ -0,0 +1,71 @@
|
|
1
|
+
|
2
|
+
module Sprout
|
3
|
+
class RemoteFileLoaderError < StandardError #:nodoc:
|
4
|
+
end
|
5
|
+
|
6
|
+
class RemoteFileLoader #:nodoc:
|
7
|
+
|
8
|
+
def get_remote_file(uri, force=false, md5=nil)
|
9
|
+
response = fetch(uri.to_s)
|
10
|
+
if(force || response_is_valid?(response, md5))
|
11
|
+
return response
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def response_is_valid?(response, expected_md5sum=nil)
|
16
|
+
if(expected_md5sum)
|
17
|
+
md5 = Digest::MD5.new
|
18
|
+
md5 << response
|
19
|
+
|
20
|
+
if(expected_md5sum != md5.hexdigest)
|
21
|
+
puts "The MD5 Sum of the downloaded file (#{md5.hexdigest}) does not match what was expected (#{expected_md5sum})."
|
22
|
+
puts "Would you like to install anyway? [Yn]"
|
23
|
+
response = $stdin.gets.chomp!
|
24
|
+
if(response.downcase == 'y')
|
25
|
+
return true
|
26
|
+
else
|
27
|
+
raise RemoteFileLoaderError.new('MD5 Checksum failed')
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
return true
|
32
|
+
end
|
33
|
+
|
34
|
+
def fetch(uri)
|
35
|
+
uri = URI.parse(uri)
|
36
|
+
progress = nil
|
37
|
+
response = nil
|
38
|
+
name = uri.path.split("/").pop
|
39
|
+
|
40
|
+
raise RemoteFileLoaderError.new("The RemoteFileTask failed for #{name}. We can only handle HTTP requests at this time, it seems you were trying: '#{uri.scheme}'") if uri.scheme != 'http'
|
41
|
+
begin
|
42
|
+
open(uri.to_s, :content_length_proc => lambda {|t|
|
43
|
+
if t && t > 0
|
44
|
+
progress = ProgressBar.new(name, t)
|
45
|
+
progress.file_transfer_mode
|
46
|
+
progress.set(0)
|
47
|
+
else
|
48
|
+
progress = ProgressBar.new(name, 0)
|
49
|
+
progress.file_transfer_mode
|
50
|
+
progress.set(0)
|
51
|
+
end
|
52
|
+
},
|
53
|
+
:progress_proc => lambda {|s|
|
54
|
+
progress.set s if progress
|
55
|
+
}) do |f|
|
56
|
+
response = f.read
|
57
|
+
progress.finish
|
58
|
+
end
|
59
|
+
rescue SocketError => sock_err
|
60
|
+
raise RemoteFileLoaderError.new("[ERROR] #{sock_err.to_s}")
|
61
|
+
rescue OpenURI::HTTPError => http_err
|
62
|
+
raise RemoteFileLoaderError.new("[ERROR] Failed to load file from: '#{uri.to_s}'\n[REMOTE ERROR] #{http_err.io.read.strip}")
|
63
|
+
rescue Errno::ECONNREFUSED => econ_err
|
64
|
+
raise Errno::ECONNREFUSED.new("[ERROR] Connection refused at: '#{uri.to_s}'")
|
65
|
+
end
|
66
|
+
|
67
|
+
return response
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,151 @@
|
|
1
|
+
|
2
|
+
module Sprout
|
3
|
+
class RemoteFileTargetError < StandardError #:nodoc:
|
4
|
+
end
|
5
|
+
|
6
|
+
class RemoteFileTarget # :nodoc:
|
7
|
+
|
8
|
+
attr_writer :archive_path
|
9
|
+
|
10
|
+
# The string environment variable name to check before downloading anything.
|
11
|
+
attr_accessor :environment
|
12
|
+
|
13
|
+
# The user path where this gem will download and install files
|
14
|
+
# This value is set by the Sprout::Builder that creates this RemoteFileTarget
|
15
|
+
attr_accessor :install_path
|
16
|
+
|
17
|
+
# Optional md5 hash, usually set in the sprout.spec for each RemoteFileTarget
|
18
|
+
# If this value is set, the downloaded archive will be hashed, the hashes will
|
19
|
+
# be compared and if they differ, the installation process will break.
|
20
|
+
attr_accessor :md5
|
21
|
+
|
22
|
+
# Used for dmg archives. Absolute path to the mounted dmg (essentially its name)
|
23
|
+
attr_accessor :mount_path
|
24
|
+
|
25
|
+
# Which platform will this RemoteFileTarget support.
|
26
|
+
# Supported options are:
|
27
|
+
# * universal
|
28
|
+
# * macosx
|
29
|
+
# * win32
|
30
|
+
# * linux
|
31
|
+
attr_accessor :platform
|
32
|
+
|
33
|
+
# URL where Sprouts can go to download the RemoteFileTarget archive
|
34
|
+
attr_accessor :url
|
35
|
+
|
36
|
+
# If the archive type cannot be assumed from the returned file name,
|
37
|
+
# it must be provided as one of the following:
|
38
|
+
# :exe
|
39
|
+
# :zip
|
40
|
+
# :targz
|
41
|
+
# :gzip
|
42
|
+
# :swc
|
43
|
+
# :rb
|
44
|
+
# :dmg
|
45
|
+
# @see ArchiveUnpacker
|
46
|
+
attr_accessor :archive_type
|
47
|
+
|
48
|
+
# Filename for the downloaded file. Introduced to fix railsy URL issues.
|
49
|
+
attr_accessor :filename
|
50
|
+
|
51
|
+
# Relative path within the archive to the executable or binary of interest
|
52
|
+
def archive_path
|
53
|
+
@archive_path ||= ''
|
54
|
+
end
|
55
|
+
|
56
|
+
# Resolve this RemoteFileTarget now. This method is called by the Sprout::Builder
|
57
|
+
# and will download, install and unpack the described archive, unless it is
|
58
|
+
# already installed
|
59
|
+
def resolve(update=false)
|
60
|
+
# Wanted to raise, but it seems we support RemoteFileTargets that are actually self-installed binaries...
|
61
|
+
# like SWFMill on Linux. @see the BuilderTest.test_build_no_install for more info.
|
62
|
+
# raise RemoteFileTargetError.new('Cannot retrieve a RemoteFileTarget without a url') if url.nil?
|
63
|
+
return if url.nil?
|
64
|
+
|
65
|
+
if(filename)
|
66
|
+
self.downloaded_path = File.join(File.dirname(downloaded_path), filename)
|
67
|
+
end
|
68
|
+
|
69
|
+
if(url && (update || !File.exists?(downloaded_path)))
|
70
|
+
content = download(url, update)
|
71
|
+
FileUtils.makedirs(File.dirname(downloaded_path))
|
72
|
+
FileUtils.touch(downloaded_path)
|
73
|
+
File.open(downloaded_path, 'rb+') do |file|
|
74
|
+
file.write(content)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
if(!File.exists?(installed_path) || !File.exists?(File.join(installed_path, archive_path) ))
|
79
|
+
archive_root = File.join(install_path, 'archive')
|
80
|
+
install(downloaded_path, archive_root, update, archive_type)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
# Return the basename of the executable that this RemoteFileTarget refers to
|
85
|
+
def executable
|
86
|
+
return File.basename(archive_path)
|
87
|
+
end
|
88
|
+
|
89
|
+
# The root path to the unpacked archive files. This is the base path that will be added to any
|
90
|
+
# +archive_path+ relative paths
|
91
|
+
def installed_path
|
92
|
+
@installed_path ||= inferred_installed_path
|
93
|
+
return @installed_path
|
94
|
+
end
|
95
|
+
|
96
|
+
def downloaded_path=(path)
|
97
|
+
@downloaded_path = path
|
98
|
+
end
|
99
|
+
|
100
|
+
# Parent directory where archives are downloaded
|
101
|
+
# can be something like: ~/Library/Sprouts/cache/0.7/sprout-somesprout-tool.x.x.x/
|
102
|
+
def downloaded_path
|
103
|
+
@downloaded_path ||= File.join(install_path, file_name(url))
|
104
|
+
return @downloaded_path
|
105
|
+
end
|
106
|
+
|
107
|
+
# Base file name represented by the provided +url+
|
108
|
+
# Will strip off any ? arguments and trailing slashes. May not play nice with Rails URLS,
|
109
|
+
# We expect archive file name suffixes like, zip, gzip, tar.gz, dmg, etc.
|
110
|
+
def file_name(url=nil)
|
111
|
+
return @filename if(@filename)
|
112
|
+
|
113
|
+
url ||= self.url
|
114
|
+
url = url.split('?').shift
|
115
|
+
|
116
|
+
parts = url.split('/')
|
117
|
+
if(parts.last == '/')
|
118
|
+
parts.pop
|
119
|
+
end
|
120
|
+
|
121
|
+
file = parts.pop
|
122
|
+
|
123
|
+
if(!archive_type.nil? && file.match(/\.#{archive_type.to_s}$/).nil?)
|
124
|
+
file << ".#{archive_type.to_s}"
|
125
|
+
end
|
126
|
+
|
127
|
+
return file
|
128
|
+
end
|
129
|
+
|
130
|
+
private
|
131
|
+
|
132
|
+
def inferred_installed_path
|
133
|
+
if(!environment.nil? && !ENV[environment].nil? && File.exists?(ENV[environment]))
|
134
|
+
return ENV[environment]
|
135
|
+
end
|
136
|
+
|
137
|
+
return File.join(install_path, 'archive')
|
138
|
+
end
|
139
|
+
|
140
|
+
def download(url, update=false)
|
141
|
+
loader = RemoteFileLoader.new
|
142
|
+
loader.get_remote_file(url, update, md5)
|
143
|
+
end
|
144
|
+
|
145
|
+
def install(from, to, force, archive_type=nil)
|
146
|
+
unpacker = ArchiveUnpacker.new
|
147
|
+
unpacker.unpack_archive(from, to, force, archive_type)
|
148
|
+
end
|
149
|
+
|
150
|
+
end
|
151
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
=begin
|
2
|
+
Copyright (c) 2007 Pattern Park
|
3
|
+
|
4
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
5
|
+
a copy of this software and associated documentation files (the
|
6
|
+
"Software"), to deal in the Software without restriction, including
|
7
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
8
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
9
|
+
permit persons to whom the Software is furnished to do so, subject to
|
10
|
+
the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be
|
13
|
+
included in all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
17
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
19
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
20
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
21
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
+
=end
|
23
|
+
require 'erb'
|
24
|
+
|
25
|
+
module Sprout
|
26
|
+
|
27
|
+
class SimpleResolver #:nodoc:
|
28
|
+
|
29
|
+
def initialize(template, output, files, base_dir=nil)
|
30
|
+
@template = template
|
31
|
+
@output = output
|
32
|
+
@files = files
|
33
|
+
@base_dir = base_dir
|
34
|
+
@ignored_files = []
|
35
|
+
execute
|
36
|
+
finish
|
37
|
+
end
|
38
|
+
|
39
|
+
def execute
|
40
|
+
template_file = File.open(@template, 'r')
|
41
|
+
content = template_file.read
|
42
|
+
result = ERB.new(content, nil, '>').result(binding)
|
43
|
+
|
44
|
+
output_file = File.open(@output, 'w')
|
45
|
+
output_file.write(result)
|
46
|
+
|
47
|
+
template_file.close
|
48
|
+
output_file.close
|
49
|
+
end
|
50
|
+
|
51
|
+
def files
|
52
|
+
return @files
|
53
|
+
end
|
54
|
+
|
55
|
+
def finish
|
56
|
+
if(@ignored_files.size > 0)
|
57
|
+
Logger.puts '>> SimpleResolver ignored the following files because their names were invalid:'
|
58
|
+
@ignored_files.each do |file|
|
59
|
+
puts file
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def xml_edit_warning
|
65
|
+
return <<EOF
|
66
|
+
<!--
|
67
|
+
DO NOT EDIT THIS FILE!
|
68
|
+
This file was auto-generated from
|
69
|
+
an ERB template which can be
|
70
|
+
found at:
|
71
|
+
#{@template}
|
72
|
+
-->
|
73
|
+
EOF
|
74
|
+
end
|
75
|
+
|
76
|
+
def edit_warning
|
77
|
+
return <<EOF
|
78
|
+
/*************************************
|
79
|
+
* DO NOT EDIT THIS FILE!
|
80
|
+
* This file was auto-generated from
|
81
|
+
* an ERB template which can be
|
82
|
+
* found at:
|
83
|
+
* #{@template}
|
84
|
+
*************************************/
|
85
|
+
EOF
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,118 @@
|
|
1
|
+
require 'erb'
|
2
|
+
|
3
|
+
# Rake task that makes it stupid-easy to render ERB templates
|
4
|
+
# to disk. Just add parameters to the yielded object, and
|
5
|
+
# they will be available to your Template.
|
6
|
+
#
|
7
|
+
# erb_resolver 'config/SomeFile.xml' do |t|
|
8
|
+
# t.param1 = 'value'
|
9
|
+
# t.other_param = 'other value'
|
10
|
+
# t.another_param = ['a', 'b', 'c']
|
11
|
+
# end
|
12
|
+
#
|
13
|
+
# Your erb template must be found at:
|
14
|
+
#
|
15
|
+
# [task_name].erb
|
16
|
+
#
|
17
|
+
# For the above example, this file would be:
|
18
|
+
#
|
19
|
+
# config/SomeFile.xml.erb
|
20
|
+
#
|
21
|
+
module Sprout
|
22
|
+
|
23
|
+
class ERBResolver < Rake::FileTask
|
24
|
+
|
25
|
+
# Path to the input ERB template. This
|
26
|
+
# value will default to the value of
|
27
|
+
# "#{ERBResolver.output}.erb"
|
28
|
+
attr_accessor :template
|
29
|
+
|
30
|
+
def initialize(name, app) # :nodoc:
|
31
|
+
super
|
32
|
+
@context = ERBContext.new
|
33
|
+
end
|
34
|
+
|
35
|
+
def define(args)
|
36
|
+
end
|
37
|
+
|
38
|
+
def prepare
|
39
|
+
prepare_prerequisites
|
40
|
+
end
|
41
|
+
|
42
|
+
# Modified from Rake::Task.execute
|
43
|
+
def execute(args=nil)
|
44
|
+
args ||= EMPTY_TASK_ARGS
|
45
|
+
if application.options.dryrun
|
46
|
+
puts "** Execute (dry run) #{name}"
|
47
|
+
return
|
48
|
+
end
|
49
|
+
if application.options.trace
|
50
|
+
puts "** Execute #{name}"
|
51
|
+
end
|
52
|
+
application.enhance_with_matching_rule(name) if @actions.empty?
|
53
|
+
@actions.each do |action|
|
54
|
+
execute_erb_task(action, args)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def execute_erb_task(action, args=nil)
|
59
|
+
case action.arity
|
60
|
+
when 1
|
61
|
+
action.call(@context)
|
62
|
+
else
|
63
|
+
action.call(@context, args)
|
64
|
+
end
|
65
|
+
|
66
|
+
@context.execute(template, output, args)
|
67
|
+
end
|
68
|
+
|
69
|
+
def self.define_task(*args, &block)
|
70
|
+
t = super
|
71
|
+
if(t.is_a?(ERBResolver))
|
72
|
+
t.define(args)
|
73
|
+
t.prepare
|
74
|
+
end
|
75
|
+
return t
|
76
|
+
end
|
77
|
+
|
78
|
+
def template
|
79
|
+
@template ||= "#{output}.erb"
|
80
|
+
end
|
81
|
+
|
82
|
+
def output
|
83
|
+
self.name
|
84
|
+
end
|
85
|
+
|
86
|
+
protected
|
87
|
+
|
88
|
+
def prepare_prerequisites
|
89
|
+
prerequisites << file(template)
|
90
|
+
CLEAN.add(output)
|
91
|
+
end
|
92
|
+
|
93
|
+
end
|
94
|
+
|
95
|
+
# An empty, dynamic object that will be yielded
|
96
|
+
# to the provided block and later supplied to the
|
97
|
+
# ERB template.
|
98
|
+
#
|
99
|
+
# Returning this empty object gives us the ability
|
100
|
+
# to use parameter names in our templates even if
|
101
|
+
# they are already used by Rake tasks (i.e. name).
|
102
|
+
class ERBContext
|
103
|
+
include DynamicAccessors
|
104
|
+
|
105
|
+
def execute(template, output, args=nil)
|
106
|
+
content = nil
|
107
|
+
File.open(template, 'r') { |f| content = f.read }
|
108
|
+
result = ERB.new(content, nil, '>').result(binding)
|
109
|
+
File.open(output, 'w') { |f| f.write(result) }
|
110
|
+
Log.puts ">> Created ERB output at: #{output} from: #{template}"
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
end
|
115
|
+
|
116
|
+
def erb_resolver(*args, &block)
|
117
|
+
Sprout::ERBResolver.define_task(args, &block)
|
118
|
+
end
|
@@ -0,0 +1,200 @@
|
|
1
|
+
=begin
|
2
|
+
Copyright (c) 2007 Pattern Park
|
3
|
+
|
4
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
5
|
+
a copy of this software and associated documentation files (the
|
6
|
+
"Software"), to deal in the Software without restriction, including
|
7
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
8
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
9
|
+
permit persons to whom the Software is furnished to do so, subject to
|
10
|
+
the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be
|
13
|
+
included in all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
17
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
19
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
20
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
21
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
+
|
23
|
+
TODO: Update mxmlc task
|
24
|
+
* Update mxmlc to include all advanced options
|
25
|
+
* Clean up default values
|
26
|
+
* Investigate jruby support, especially:
|
27
|
+
http://livedocs.adobe.com/flex/201/html/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Book_Parts&file=compilers_123_09.html
|
28
|
+
=end
|
29
|
+
|
30
|
+
module Sprout
|
31
|
+
class GemWrapError < StandardError #:nodoc:
|
32
|
+
end
|
33
|
+
|
34
|
+
# Creates a ruby gem from a slightly simpler rake task than what gems provides.
|
35
|
+
# Adds support for adding a sprout.spec file to your new gem which is usually useful
|
36
|
+
# for tool or library sprout gems.
|
37
|
+
class GemWrapTask < Rake::Task
|
38
|
+
# The full name of the gem to create like:
|
39
|
+
# t.gem_name = 'sprout-as3-bundle'
|
40
|
+
attr_writer :gem_name
|
41
|
+
# The type of sprout to create, defaults to 'library'
|
42
|
+
# Other possible values are, 'bundle' and 'tool'
|
43
|
+
attr_writer :sprout_type
|
44
|
+
# Full string rubygem version for this sprout, usually in three parts like:
|
45
|
+
# t.version = '0.0.1'
|
46
|
+
attr_writer :version
|
47
|
+
# Folder that the newly-created gem should be placed in
|
48
|
+
attr_writer :package
|
49
|
+
# Summary or short description for the gem
|
50
|
+
attr_writer :summary
|
51
|
+
# The author that created the gem
|
52
|
+
attr_writer :author
|
53
|
+
# Email address for interested users to send questions to
|
54
|
+
attr_writer :email
|
55
|
+
# Homepage where users can learn more about this gem
|
56
|
+
attr_writer :homepage
|
57
|
+
# A string remote file specification usually something like:
|
58
|
+
#
|
59
|
+
# t.sprout_spec =<<EOF
|
60
|
+
# - !ruby/object:Sprout::RemoteFileTarget
|
61
|
+
# platform: universal
|
62
|
+
# url: http://as3flickrlib.googlecode.com/files/flickr-.87.zip
|
63
|
+
# archive_path: flickr-.87/src
|
64
|
+
# EOF
|
65
|
+
attr_writer :sprout_spec
|
66
|
+
|
67
|
+
def self.define_task(args, &block)
|
68
|
+
t = super
|
69
|
+
yield t if block_given?
|
70
|
+
t.define
|
71
|
+
end
|
72
|
+
|
73
|
+
def define # :nodoc:
|
74
|
+
define_gem_name
|
75
|
+
define_extensions(extensions)
|
76
|
+
end
|
77
|
+
|
78
|
+
def initialize(task_name, app) # :nodoc:
|
79
|
+
super
|
80
|
+
@sprout_type = "library"
|
81
|
+
@package = "pkg"
|
82
|
+
@summary = "#{task_name}"
|
83
|
+
@email = "projectsprouts@googlegroups.com"
|
84
|
+
@homepage = "http://www.projectsprouts.org"
|
85
|
+
end
|
86
|
+
|
87
|
+
def execute(*args) # :nodoc:
|
88
|
+
super
|
89
|
+
raise GemWrapError.new("A version must be provided to produce a Gem!") unless @version
|
90
|
+
@summary = "#{name} #{@sprout_type} generated by Sprout::GemWrapTask" unless @summary
|
91
|
+
|
92
|
+
FileUtils.mkdir_p(gem_package)
|
93
|
+
render_sprout_spec(gem_package, @sprout_spec) if @sprout_spec
|
94
|
+
# render_extensions(gem_package, extensions) if extensions.size
|
95
|
+
|
96
|
+
Dir.chdir(gem_package) do
|
97
|
+
|
98
|
+
spec = Gem::Specification.new do |s|
|
99
|
+
files = []
|
100
|
+
s.platform = Gem::Platform::RUBY
|
101
|
+
s.version = @version
|
102
|
+
s.author = @author if @author
|
103
|
+
s.summary = @summary
|
104
|
+
s.name = @gem_name
|
105
|
+
s.email = @email
|
106
|
+
s.homepage = @homepage
|
107
|
+
s.rubyforge_project = 'sprout'
|
108
|
+
gem_dependencies.each do |dep|
|
109
|
+
s.requirements << dep
|
110
|
+
end
|
111
|
+
|
112
|
+
sprout_requirement = s.requirements.collect do |req|
|
113
|
+
(req[0] == 'sprout')
|
114
|
+
end
|
115
|
+
|
116
|
+
if(!sprout_requirement)
|
117
|
+
s.add_dependency('sprout', '>= 0.7.209')
|
118
|
+
end
|
119
|
+
|
120
|
+
if(File.exists?('sprout.spec'))
|
121
|
+
files << 'sprout.spec'
|
122
|
+
end
|
123
|
+
if(extensions.size > 0)
|
124
|
+
files << 'ext'
|
125
|
+
end
|
126
|
+
zipped_extensions.each do |ext|
|
127
|
+
files << File.join('ext', File.basename(ext))
|
128
|
+
end
|
129
|
+
s.files = files
|
130
|
+
end
|
131
|
+
Gem::Builder.new(spec).build
|
132
|
+
end
|
133
|
+
|
134
|
+
FileUtils.mv("#{gem_package}/#{@gem_name}-#{@version}.gem", @package)
|
135
|
+
FileUtils.rm_rf(gem_package)
|
136
|
+
end
|
137
|
+
|
138
|
+
# Add a gem dependency either with only the gem name
|
139
|
+
# or with a full name and version hash like:
|
140
|
+
#
|
141
|
+
# t.add_dependency('sprout-flashplayer-tool')
|
142
|
+
# or
|
143
|
+
# t.add_dependency('sprout-flashplayer-tool' => '9.115.0')
|
144
|
+
#
|
145
|
+
def add_dependency(args)
|
146
|
+
gem_dependencies << args
|
147
|
+
end
|
148
|
+
|
149
|
+
def gem_dependencies
|
150
|
+
return @gem_dependencies ||= []
|
151
|
+
end
|
152
|
+
|
153
|
+
# Add files to include in the gem/ext folder
|
154
|
+
def extensions
|
155
|
+
return @extensions ||= []
|
156
|
+
end
|
157
|
+
|
158
|
+
private
|
159
|
+
|
160
|
+
def gem_package
|
161
|
+
@gem_package ||= File.join(@package, @gem_name)
|
162
|
+
end
|
163
|
+
|
164
|
+
def zipped_extensions
|
165
|
+
return @zipped_extensions ||= []
|
166
|
+
end
|
167
|
+
|
168
|
+
def define_gem_name
|
169
|
+
@gem_name = "sprout-#{name}-#{@sprout_type}" if !@gem_name
|
170
|
+
end
|
171
|
+
|
172
|
+
def define_extensions(exts)
|
173
|
+
exts.each do |ext|
|
174
|
+
if(File.directory?(ext))
|
175
|
+
full = File.expand_path(ext)
|
176
|
+
t = nil
|
177
|
+
|
178
|
+
zip full do |z|
|
179
|
+
z.input = full
|
180
|
+
z.output = File.join(gem_name, 'ext', File.basename(full) + '.zip')
|
181
|
+
end
|
182
|
+
puts "pwd: #{Dir.pwd} out #{t.output}"
|
183
|
+
zipped_extensions << File.expand_path(t.output)
|
184
|
+
prerequisites << t.output
|
185
|
+
end
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
def render_sprout_spec(target, spec)
|
190
|
+
File.open(File.join(target, 'sprout.spec'), 'w') do |f|
|
191
|
+
f.write(spec)
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
def gem_wrap(args, &block)
|
199
|
+
Sprout::GemWrapTask.define_task(args, &block)
|
200
|
+
end
|