rakeoff 0.0.1 → 0.0.2
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/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
|