rakeoff 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE.txt +1 -1
- data/README.rdoc +1 -1
- data/lib/rakeoff.rb +7 -0
- data/lib/rakeoff/aspnetcompile.rb +12 -0
- data/lib/rakeoff/aspnetcompile_task.rb +13 -0
- data/lib/rakeoff/clean.rb +15 -0
- data/lib/rakeoff/clean_task.rb +13 -0
- data/lib/rakeoff/compile.rb +13 -0
- data/lib/rakeoff/compile_task.rb +13 -0
- data/lib/rakeoff/logging.rb +23 -0
- data/lib/rakeoff/project.rb +30 -0
- data/lib/rakeoff/robocopy.rb +43 -0
- data/lib/rakeoff/robocopy_task.rb +13 -0
- data/lib/rakeoff/session.rb +81 -0
- data/lib/rakeoff/setup.rb +25 -0
- data/lib/rakeoff/solution.rb +67 -0
- data/lib/rakeoff/support/task_helper.rb +34 -0
- data/lib/rakeoff/terminal.rb +17 -0
- data/lib/rakeoff/tests.rb +41 -0
- data/lib/rakeoff/tests_task.rb +13 -0
- data/lib/rakeoff/tokens.rb +63 -0
- data/lib/rakeoff/tokens_task.rb +13 -0
- data/lib/rakeoff/tokens_writer.rb +50 -0
- metadata +104 -44
data/LICENSE.txt
CHANGED
data/README.rdoc
CHANGED
data/lib/rakeoff.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'terminal'
|
3
|
+
|
4
|
+
class AspnetCompile
|
5
|
+
def execute(session)
|
6
|
+
session.solution.projects.select { |project| project.is_webapp }.each do |project|
|
7
|
+
print_heading 'Aspnet Compile'
|
8
|
+
puts "Compiling #{project.name} at #{project.directory}".yellow
|
9
|
+
sh "%windir%/microsoft.net/framework/#{session.framework_version}/aspnet_compiler.exe -p #{project.directory} -v / -nologo"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
|
2
|
+
class Clean
|
3
|
+
|
4
|
+
def initialize(session)
|
5
|
+
@session = session
|
6
|
+
end
|
7
|
+
|
8
|
+
def execute()
|
9
|
+
print_heading 'Clean'
|
10
|
+
|
11
|
+
puts "Removing and recreating #{@session.output_dir}"
|
12
|
+
FileUtils.rm_rf @session.output_dir
|
13
|
+
FileUtils.mkdir_p @session.output_dir + '/release'
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
|
2
|
+
class Compile
|
3
|
+
|
4
|
+
def execute(name, session, options)
|
5
|
+
print_heading name
|
6
|
+
|
7
|
+
multi_core = session.framework_version[1,1].to_i > 2 ? '/m' : ''
|
8
|
+
msbuild_path = "%windir%/microsoft.net/framework/#{session.framework_version}/msbuild.exe"
|
9
|
+
|
10
|
+
sh "#{msbuild_path} /t:Clean;Build /p:Configuration=#{session.configuration} #{options} /p:TrackFileAccess=false #{multi_core} /consoleloggerparameters:ErrorsOnly #{session.solution.path}"
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'support/task_helper'
|
2
|
+
require 'compile'
|
3
|
+
|
4
|
+
class CompileTask
|
5
|
+
def initialize(name, options, *args)
|
6
|
+
body = proc {
|
7
|
+
task = Compile.new
|
8
|
+
task.execute(name.to_s.capitalize, SESSION, options)
|
9
|
+
}
|
10
|
+
|
11
|
+
create_task(name, *args, &body)
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'logger'
|
2
|
+
|
3
|
+
module Logging
|
4
|
+
def logger
|
5
|
+
@logger ||= Logging.logger_for(self.class.name)
|
6
|
+
end
|
7
|
+
|
8
|
+
# Use a hash class-ivar to cache a unique Logger per class:
|
9
|
+
@loggers = {}
|
10
|
+
|
11
|
+
class << self
|
12
|
+
def logger_for(classname)
|
13
|
+
@loggers[classname] ||= configure_logger_for(classname)
|
14
|
+
end
|
15
|
+
|
16
|
+
def configure_logger_for(classname)
|
17
|
+
logger = Logger.new(STDOUT)
|
18
|
+
logger.level = LOGGING_LEVEL
|
19
|
+
logger.progname = classname
|
20
|
+
logger
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
|
2
|
+
class Project
|
3
|
+
|
4
|
+
attr_accessor :name, :path, :directory, :assembly_name, :dll_path, :is_webapp
|
5
|
+
|
6
|
+
def initialize(path)
|
7
|
+
if !File.exists?(path)
|
8
|
+
raise ProjectDoesNotExist, "Project does not exist at #{path}".red
|
9
|
+
end
|
10
|
+
|
11
|
+
@path = path
|
12
|
+
@name = File.basename(path).gsub('.csproj', '')
|
13
|
+
@directory = File.dirname(@path)
|
14
|
+
|
15
|
+
match = File.read(path).match('<AssemblyName>(.*)</AssemblyName>')
|
16
|
+
@assembly_name = match.nil? ? nil : match[1]
|
17
|
+
@is_webapp = File.exist?(@directory + '/Web.config')
|
18
|
+
end
|
19
|
+
|
20
|
+
def include(expression)
|
21
|
+
return File.read(path).include?(expression)
|
22
|
+
end
|
23
|
+
|
24
|
+
def dll_path(configuration)
|
25
|
+
return @path.gsub(@name + '.csproj', "bin/#{configuration}/#{@assembly_name}.dll")
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
class ProjectDoesNotExist < StandardError
|
30
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'terminal'
|
2
|
+
|
3
|
+
class Robocopy
|
4
|
+
|
5
|
+
def initialize(session)
|
6
|
+
@session = session
|
7
|
+
end
|
8
|
+
|
9
|
+
def execute(source, destination, parameters='/MIR /R:5 /W:5 /NP /NFL /NDL')
|
10
|
+
print_heading 'Copying'
|
11
|
+
|
12
|
+
status = run_command("#{@session.tools_dir}/robocopy.exe #{source} #{destination} /XD .svn #{parameters}")
|
13
|
+
failed = check_status(status)
|
14
|
+
|
15
|
+
if failed
|
16
|
+
raise RobocopyException, "Robocopy failed with status code #{status}. Please see http://bit.ly/dzegQL for what it means.".red
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def check_status(status)
|
23
|
+
fail = true
|
24
|
+
|
25
|
+
[0, 1, 2, 3, 11].each do |code|
|
26
|
+
if status == code
|
27
|
+
fail = false
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
fail
|
32
|
+
end
|
33
|
+
|
34
|
+
def run_command(text)
|
35
|
+
sh(text) do |ok, result|
|
36
|
+
return result.exitstatus
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
class RobocopyException < StandardError
|
43
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'support/task_helper'
|
2
|
+
require 'robocopy'
|
3
|
+
|
4
|
+
class RobocopyTask
|
5
|
+
def initialize(name, source, destination, parameters='', *args)
|
6
|
+
body = proc {
|
7
|
+
task = Robocopy.new(SESSION)
|
8
|
+
task.execute(source, destination, parameters)
|
9
|
+
}
|
10
|
+
|
11
|
+
create_task(name, *args, &body)
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
require 'logging'
|
2
|
+
require 'solution'
|
3
|
+
require 'terminal'
|
4
|
+
require 'yaml'
|
5
|
+
|
6
|
+
class Session
|
7
|
+
include Logging
|
8
|
+
|
9
|
+
# .net build options
|
10
|
+
attr_accessor :agent_name, :is_build_agent, :framework_version, :configuration
|
11
|
+
|
12
|
+
# directories
|
13
|
+
attr_accessor :working_dir, :tools_dir, :output_dir
|
14
|
+
|
15
|
+
attr_accessor :solution, :globals, :tokens_pattern
|
16
|
+
|
17
|
+
def set_values
|
18
|
+
print_heading 'Build Info'
|
19
|
+
|
20
|
+
set_defaults
|
21
|
+
override_defaults_from_yaml
|
22
|
+
print_session_info
|
23
|
+
end
|
24
|
+
|
25
|
+
def load_solution
|
26
|
+
@solution = Solution.new(@working_dir)
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def set_defaults
|
32
|
+
@agent_name = ENV['COMPUTERNAME']
|
33
|
+
@framework_version = 'v4.0.30319'
|
34
|
+
@configuration = 'Release'
|
35
|
+
|
36
|
+
@working_dir = Dir.getwd
|
37
|
+
@tools_dir = File.join(@working_dir, '../tools')
|
38
|
+
@output_dir = File.join(@working_dir + '/_output')
|
39
|
+
|
40
|
+
@globals = './Globals.config'
|
41
|
+
@tokens_pattern = '*.master.config'
|
42
|
+
end
|
43
|
+
|
44
|
+
def override_defaults_from_yaml
|
45
|
+
file = File.join(@working_dir, '/rakefile.yml')
|
46
|
+
|
47
|
+
if(!File.exists?(file))
|
48
|
+
puts "No rakefile.yml found at #{@working_dir}, using defaults...".yellow
|
49
|
+
return
|
50
|
+
end
|
51
|
+
|
52
|
+
yaml = YAML.load_file(file)
|
53
|
+
|
54
|
+
if yaml.nil?
|
55
|
+
puts "Unable to read 'rakefile.yml', it may be invalid".yellow
|
56
|
+
return
|
57
|
+
end
|
58
|
+
|
59
|
+
yaml.each_key do |variable|
|
60
|
+
if (self.instance_variable_defined?('@' + variable))
|
61
|
+
self.instance_variable_set('@' + variable, yaml[variable])
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def print_session_info
|
67
|
+
puts "Current Environemnt = #{@environment}"
|
68
|
+
puts "Agent = #{@agent_name}"
|
69
|
+
puts ''
|
70
|
+
|
71
|
+
puts "Build Framework = #{@framework_version}"
|
72
|
+
puts "Build Configuration = #{@configuration}"
|
73
|
+
puts "Token File Pattern = #{@tokens_pattern}"
|
74
|
+
puts "Global Tokens File = #{@globals}"
|
75
|
+
puts ''
|
76
|
+
|
77
|
+
puts "Output Directory = #{@output_dir}"
|
78
|
+
puts "Tools Directory = #{@tools_dir}"
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
Dir.glob(File.join(File.expand_path(File.dirname(__FILE__)), '*.rb')).each {|file| require file }
|
2
|
+
|
3
|
+
desc 'Setup this must be run!'
|
4
|
+
task :off do
|
5
|
+
LOGGING_LEVEL = Logger::ERROR
|
6
|
+
|
7
|
+
SESSION = Session.new
|
8
|
+
SESSION.set_values
|
9
|
+
SESSION.load_solution
|
10
|
+
|
11
|
+
create_tasks
|
12
|
+
end
|
13
|
+
|
14
|
+
def create_tasks
|
15
|
+
#AspnetCompileTask.new(:aspnetcompile)
|
16
|
+
CleanTask.new(:clean)
|
17
|
+
TokensTask.new(:tokens)
|
18
|
+
|
19
|
+
CompileTask.new(:compile, '')
|
20
|
+
CompileTask.new(:publish, "/property:OutDir=#{SESSION.output_dir}/publish/")
|
21
|
+
|
22
|
+
TestsTask.new(:unit_tests, '.Unit.Tests')
|
23
|
+
TestsTask.new(:integration_tests, '.Integration.Tests')
|
24
|
+
TestsTask.new(:acceptance_tests, '.Acceptance.Tests')
|
25
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'logging'
|
2
|
+
require 'project'
|
3
|
+
|
4
|
+
class Solution
|
5
|
+
include Logging
|
6
|
+
|
7
|
+
attr_accessor :name, :path, :directory, :projects
|
8
|
+
|
9
|
+
def initialize(path)
|
10
|
+
find_solution(path)
|
11
|
+
find_projects
|
12
|
+
end
|
13
|
+
|
14
|
+
def get_projects(pattern)
|
15
|
+
return @projects.select {|project| project.path.include?(pattern) }
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def find_solution(path)
|
21
|
+
logger.info "Searching for solution files at: #{path}/*.sln"
|
22
|
+
matches = Dir.glob("#{path}/**/*.sln")
|
23
|
+
|
24
|
+
if matches.empty?
|
25
|
+
raise NoSolutionFile, "No *.sln file found in #{path}".red
|
26
|
+
end
|
27
|
+
|
28
|
+
if matches.length > 1
|
29
|
+
raise MultipleSolutionFiles, "Multiple solution files found. Don't know which one to build!".red
|
30
|
+
end
|
31
|
+
|
32
|
+
match = matches.first
|
33
|
+
|
34
|
+
@name = match.to_s.match(/.*\/(.*).sln/)[1]
|
35
|
+
@path = match
|
36
|
+
@directory = File.dirname(match)
|
37
|
+
end
|
38
|
+
|
39
|
+
def find_projects
|
40
|
+
@projects = []
|
41
|
+
logger.info "Reading projects in solution #{@path}"
|
42
|
+
|
43
|
+
readlines(@path).each do |line|
|
44
|
+
match = line.match(/,\s\"(.*\.csproj)\"/)
|
45
|
+
path = match.nil? ? nil : match[1]
|
46
|
+
|
47
|
+
if(!path.nil?)
|
48
|
+
path = File.join(File.expand_path(@directory), path).gsub('\\', '/')
|
49
|
+
|
50
|
+
logger.info "Creating project instance for path #{path}"
|
51
|
+
projects.push(Project.new(path))
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def readlines(file)
|
57
|
+
lines = []
|
58
|
+
File.open(file, 'r').each { |line| lines << line }
|
59
|
+
return lines
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
class NoSolutionFile < StandardError
|
64
|
+
end
|
65
|
+
|
66
|
+
class MultipleSolutionFiles < StandardError
|
67
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'rake'
|
2
|
+
include Rake::DSL
|
3
|
+
|
4
|
+
def create_task(name, *args, &body)
|
5
|
+
args || args = []
|
6
|
+
args.insert 0, name
|
7
|
+
|
8
|
+
# allows you to define your own overriden tasks
|
9
|
+
# hardcoded tasks are added first, then user dynamic ones, then finally rakeoff dyanmic ones
|
10
|
+
if(task_exists(name))
|
11
|
+
return
|
12
|
+
end
|
13
|
+
|
14
|
+
# make sure the off task is our own and not overriden
|
15
|
+
if(task_exists(name) && name == 'off')
|
16
|
+
remove_task(name)
|
17
|
+
end
|
18
|
+
|
19
|
+
Rake::Task.define_task(*args, &body)
|
20
|
+
end
|
21
|
+
|
22
|
+
def task_exists(name)
|
23
|
+
return Rake::Task.task_defined?(name)
|
24
|
+
end
|
25
|
+
|
26
|
+
def remove_task(task_name)
|
27
|
+
Rake.application.remove_task(task_name)
|
28
|
+
end
|
29
|
+
|
30
|
+
Rake::TaskManager.class_eval do
|
31
|
+
def remove_task(task_name)
|
32
|
+
@tasks.delete(task_name.to_s)
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'term/ansicolor'
|
3
|
+
require 'win32console' unless !(RUBY_PLATFORM =~ /mswin32/)
|
4
|
+
|
5
|
+
class String
|
6
|
+
include Term::ANSIColor
|
7
|
+
end
|
8
|
+
|
9
|
+
def print_heading(message)
|
10
|
+
if(SESSION.is_build_agent)
|
11
|
+
puts "##teamcity[progressMessage '#{message}']"
|
12
|
+
else
|
13
|
+
puts ''
|
14
|
+
puts message.cyan
|
15
|
+
puts "####################################".cyan
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'terminal'
|
3
|
+
|
4
|
+
class NUnit
|
5
|
+
|
6
|
+
attr_accessor :assemblies
|
7
|
+
|
8
|
+
def initialize(session)
|
9
|
+
@session = session
|
10
|
+
end
|
11
|
+
|
12
|
+
def execute(pattern)
|
13
|
+
print_heading("Tests - #{pattern}")
|
14
|
+
|
15
|
+
if(there_are_test_projects(pattern))
|
16
|
+
sh "#{@session.tools_dir}/nunit/nunit-console.exe #{assemblies} /xml=#{@session.output_dir}/test-reports/nunit.xml"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def there_are_test_projects(pattern)
|
23
|
+
projects = @session.solution.get_projects(pattern)
|
24
|
+
|
25
|
+
if(projects.length == 0)
|
26
|
+
puts "No test projects found matching pattern #{pattern}".yellow
|
27
|
+
return false
|
28
|
+
end
|
29
|
+
|
30
|
+
mkdir_p "#{@session.output_dir}/test-reports"
|
31
|
+
get_assemblies(projects)
|
32
|
+
|
33
|
+
return true
|
34
|
+
end
|
35
|
+
|
36
|
+
def get_assemblies(projects)
|
37
|
+
files = []
|
38
|
+
projects.each { |project| files << project.dll_path(@session.configuration) + ' ' }
|
39
|
+
@assemblies = files.join
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'terminal'
|
2
|
+
|
3
|
+
class Tokens
|
4
|
+
|
5
|
+
def initialize(session, writer)
|
6
|
+
@session = session
|
7
|
+
@writer = writer
|
8
|
+
@globals = {}
|
9
|
+
end
|
10
|
+
|
11
|
+
def find_and_replace(path)
|
12
|
+
print_heading 'Tokenising'
|
13
|
+
|
14
|
+
read_tokens_file(@session.globals)
|
15
|
+
|
16
|
+
@files = Dir.glob("#{path}/**/#{@session.tokens_pattern}")
|
17
|
+
puts "#{@files.length} config(s) found for tokenising"
|
18
|
+
puts ''
|
19
|
+
|
20
|
+
@files.each do |file|
|
21
|
+
@environments = {}
|
22
|
+
read_tokens_file(file.gsub('.master.', '.tokens.'))
|
23
|
+
puts "Tokensing - #{file}"
|
24
|
+
puts "Environments - #{@environments.keys.join(', ')}"
|
25
|
+
|
26
|
+
@environments.each_pair do |environment, values|
|
27
|
+
@writer.write_for(environment, file, values, @globals, true)
|
28
|
+
end
|
29
|
+
|
30
|
+
@writer.write_for('', file, @environments.values[0], @globals, false)
|
31
|
+
puts ''
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def read_tokens_file(path)
|
38
|
+
if(File.exist?(path))
|
39
|
+
begin
|
40
|
+
eval(File.read(path))
|
41
|
+
rescue SyntaxError => exception
|
42
|
+
raise exception, "Syntax error in the tokens file #{path} - #{exception.message}".red
|
43
|
+
end
|
44
|
+
else
|
45
|
+
puts "No tokens file found at #{path}".yellow
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
def keys_for(environment, values)
|
52
|
+
environment = environment.to_s.downcase
|
53
|
+
|
54
|
+
if @environments.has_key?(environment)
|
55
|
+
@environments[environment].merge!(values)
|
56
|
+
else
|
57
|
+
@environments[environment] = values
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def share_with(envs, values)
|
62
|
+
envs.each { |env| keys_for(env, values) }
|
63
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'support/task_helper'
|
2
|
+
require 'tokens'
|
3
|
+
|
4
|
+
class TokensTask
|
5
|
+
def initialize(name, *args)
|
6
|
+
body = proc {
|
7
|
+
task = Tokens.new(SESSION, TokensWriter.new)
|
8
|
+
task.find_and_replace(SESSION.working_dir)
|
9
|
+
}
|
10
|
+
|
11
|
+
create_task(name, *args, &body)
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
|
2
|
+
class TokensWriter
|
3
|
+
|
4
|
+
def write_for(environment, master_file, tokens, globals, check_usage)
|
5
|
+
@master_file = master_file
|
6
|
+
@environment = environment
|
7
|
+
|
8
|
+
output_file = @master_file.gsub('.master', environment.empty? ? '' : "._#{environment}")
|
9
|
+
text = File.read(@master_file)
|
10
|
+
|
11
|
+
check_if_tokens_are_used(text, tokens) if check_usage
|
12
|
+
text = replace_tokens(text, tokens)
|
13
|
+
text = replace_tokens(text, globals)
|
14
|
+
|
15
|
+
write_to_file(output_file, text)
|
16
|
+
|
17
|
+
matches = text.scan(/(\$[\w\d\-_\.]+\$)/)
|
18
|
+
|
19
|
+
if (matches.any?)
|
20
|
+
raise UnReplacedTokenException, "There are untokenised value(s): #{matches.join(', ').strip} still in #{@output_file}!".red
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def replace_tokens(text, tokens)
|
27
|
+
tokens.each_pair do |key, value|
|
28
|
+
text.gsub!(/\$#{key}\$/, value.to_s)
|
29
|
+
end
|
30
|
+
|
31
|
+
text
|
32
|
+
end
|
33
|
+
|
34
|
+
def check_if_tokens_are_used(text, tokens)
|
35
|
+
tokens.each { |key, value| print_unused_token_warning(key) if !text.include?("$#{key}$") }
|
36
|
+
end
|
37
|
+
|
38
|
+
def print_unused_token_warning(key)
|
39
|
+
puts "$#{key}$ token is not used for '#{@environment}'".yellow
|
40
|
+
end
|
41
|
+
|
42
|
+
def write_to_file(file, text)
|
43
|
+
File.open(file, 'w') { |f| f.write(text) }
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
class UnReplacedTokenException < StandardError
|
49
|
+
end
|
50
|
+
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rakeoff
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,121 +9,155 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-04-17 00:00:00.
|
12
|
+
date: 2012-04-17 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
16
|
-
requirement:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
|
-
- - =
|
19
|
+
- - '='
|
20
20
|
- !ruby/object:Gem::Version
|
21
21
|
version: 0.9.2.2
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - '='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 0.9.2.2
|
25
30
|
- !ruby/object:Gem::Dependency
|
26
31
|
name: rubyzip
|
27
|
-
requirement:
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
28
33
|
none: false
|
29
34
|
requirements:
|
30
|
-
- - =
|
35
|
+
- - '='
|
31
36
|
- !ruby/object:Gem::Version
|
32
37
|
version: 0.9.6.1
|
33
38
|
type: :runtime
|
34
39
|
prerelease: false
|
35
|
-
version_requirements:
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - '='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 0.9.6.1
|
36
46
|
- !ruby/object:Gem::Dependency
|
37
47
|
name: term-ansicolor
|
38
|
-
requirement:
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
39
49
|
none: false
|
40
50
|
requirements:
|
41
|
-
- - =
|
51
|
+
- - '='
|
42
52
|
- !ruby/object:Gem::Version
|
43
53
|
version: 1.0.7
|
44
54
|
type: :runtime
|
45
55
|
prerelease: false
|
46
|
-
version_requirements:
|
47
|
-
- !ruby/object:Gem::Dependency
|
48
|
-
name: juicer
|
49
|
-
requirement: &29133100 !ruby/object:Gem::Requirement
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
50
57
|
none: false
|
51
58
|
requirements:
|
52
|
-
- - =
|
59
|
+
- - '='
|
53
60
|
- !ruby/object:Gem::Version
|
54
|
-
version: 1.0.
|
55
|
-
type: :runtime
|
56
|
-
prerelease: false
|
57
|
-
version_requirements: *29133100
|
61
|
+
version: 1.0.7
|
58
62
|
- !ruby/object:Gem::Dependency
|
59
63
|
name: logger
|
60
|
-
requirement:
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
61
65
|
none: false
|
62
66
|
requirements:
|
63
|
-
- - =
|
67
|
+
- - '='
|
64
68
|
- !ruby/object:Gem::Version
|
65
69
|
version: 1.2.8
|
66
70
|
type: :runtime
|
67
71
|
prerelease: false
|
68
|
-
version_requirements:
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - '='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: 1.2.8
|
69
78
|
- !ruby/object:Gem::Dependency
|
70
79
|
name: rspec
|
71
|
-
requirement:
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
72
81
|
none: false
|
73
82
|
requirements:
|
74
|
-
- - =
|
83
|
+
- - '='
|
75
84
|
- !ruby/object:Gem::Version
|
76
|
-
version: 2.
|
85
|
+
version: 2.9.0
|
77
86
|
type: :development
|
78
87
|
prerelease: false
|
79
|
-
version_requirements:
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - '='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: 2.9.0
|
80
94
|
- !ruby/object:Gem::Dependency
|
81
95
|
name: mocha
|
82
|
-
requirement:
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
83
97
|
none: false
|
84
98
|
requirements:
|
85
|
-
- - =
|
99
|
+
- - '='
|
86
100
|
- !ruby/object:Gem::Version
|
87
101
|
version: 0.10.5
|
88
102
|
type: :development
|
89
103
|
prerelease: false
|
90
|
-
version_requirements:
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - '='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: 0.10.5
|
91
110
|
- !ruby/object:Gem::Dependency
|
92
111
|
name: rdoc
|
93
|
-
requirement:
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
94
113
|
none: false
|
95
114
|
requirements:
|
96
|
-
- -
|
115
|
+
- - '='
|
97
116
|
- !ruby/object:Gem::Version
|
98
117
|
version: '3.12'
|
99
118
|
type: :development
|
100
119
|
prerelease: false
|
101
|
-
version_requirements:
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - '='
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '3.12'
|
102
126
|
- !ruby/object:Gem::Dependency
|
103
127
|
name: bundler
|
104
|
-
requirement:
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
105
129
|
none: false
|
106
130
|
requirements:
|
107
|
-
- -
|
131
|
+
- - '='
|
108
132
|
- !ruby/object:Gem::Version
|
109
|
-
version: 1.
|
133
|
+
version: 1.1.3
|
110
134
|
type: :development
|
111
135
|
prerelease: false
|
112
|
-
version_requirements:
|
136
|
+
version_requirements: !ruby/object:Gem::Requirement
|
137
|
+
none: false
|
138
|
+
requirements:
|
139
|
+
- - '='
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: 1.1.3
|
113
142
|
- !ruby/object:Gem::Dependency
|
114
143
|
name: jeweler
|
115
|
-
requirement:
|
144
|
+
requirement: !ruby/object:Gem::Requirement
|
116
145
|
none: false
|
117
146
|
requirements:
|
118
|
-
- -
|
147
|
+
- - '='
|
119
148
|
- !ruby/object:Gem::Version
|
120
149
|
version: 1.8.3
|
121
150
|
type: :development
|
122
151
|
prerelease: false
|
123
|
-
version_requirements:
|
152
|
+
version_requirements: !ruby/object:Gem::Requirement
|
153
|
+
none: false
|
154
|
+
requirements:
|
155
|
+
- - '='
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
version: 1.8.3
|
124
158
|
- !ruby/object:Gem::Dependency
|
125
159
|
name: simplecov
|
126
|
-
requirement:
|
160
|
+
requirement: !ruby/object:Gem::Requirement
|
127
161
|
none: false
|
128
162
|
requirements:
|
129
163
|
- - ! '>='
|
@@ -131,7 +165,12 @@ dependencies:
|
|
131
165
|
version: '0'
|
132
166
|
type: :development
|
133
167
|
prerelease: false
|
134
|
-
version_requirements:
|
168
|
+
version_requirements: !ruby/object:Gem::Requirement
|
169
|
+
none: false
|
170
|
+
requirements:
|
171
|
+
- - ! '>='
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '0'
|
135
174
|
description: A common set of build tasks typically used when creating projects in
|
136
175
|
.Net
|
137
176
|
email: robertbeal@gmail.com
|
@@ -141,9 +180,30 @@ extra_rdoc_files:
|
|
141
180
|
- LICENSE.txt
|
142
181
|
- README.rdoc
|
143
182
|
files:
|
183
|
+
- lib/rakeoff.rb
|
184
|
+
- lib/rakeoff/aspnetcompile.rb
|
185
|
+
- lib/rakeoff/aspnetcompile_task.rb
|
186
|
+
- lib/rakeoff/clean.rb
|
187
|
+
- lib/rakeoff/clean_task.rb
|
188
|
+
- lib/rakeoff/compile.rb
|
189
|
+
- lib/rakeoff/compile_task.rb
|
190
|
+
- lib/rakeoff/logging.rb
|
191
|
+
- lib/rakeoff/project.rb
|
192
|
+
- lib/rakeoff/robocopy.rb
|
193
|
+
- lib/rakeoff/robocopy_task.rb
|
194
|
+
- lib/rakeoff/session.rb
|
195
|
+
- lib/rakeoff/setup.rb
|
196
|
+
- lib/rakeoff/solution.rb
|
197
|
+
- lib/rakeoff/support/task_helper.rb
|
198
|
+
- lib/rakeoff/terminal.rb
|
199
|
+
- lib/rakeoff/tests.rb
|
200
|
+
- lib/rakeoff/tests_task.rb
|
201
|
+
- lib/rakeoff/tokens.rb
|
202
|
+
- lib/rakeoff/tokens_task.rb
|
203
|
+
- lib/rakeoff/tokens_writer.rb
|
144
204
|
- LICENSE.txt
|
145
205
|
- README.rdoc
|
146
|
-
homepage: http://
|
206
|
+
homepage: http://bitbucket.org/robertbeal/rakeoff
|
147
207
|
licenses:
|
148
208
|
- MIT
|
149
209
|
post_install_message:
|
@@ -158,7 +218,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
158
218
|
version: '0'
|
159
219
|
segments:
|
160
220
|
- 0
|
161
|
-
hash:
|
221
|
+
hash: 424452616281254389
|
162
222
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
163
223
|
none: false
|
164
224
|
requirements:
|
@@ -167,7 +227,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
167
227
|
version: '0'
|
168
228
|
requirements: []
|
169
229
|
rubyforge_project:
|
170
|
-
rubygems_version: 1.8.
|
230
|
+
rubygems_version: 1.8.21
|
171
231
|
signing_key:
|
172
232
|
specification_version: 3
|
173
233
|
summary: Build tasks for .Net projects
|