rakeoff 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,4 +1,4 @@
1
- Copyright (c) 2012 Rob Beal
1
+ Copyright (c) 2012 Robert Beal
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
@@ -14,6 +14,6 @@ Description goes here.
14
14
 
15
15
  == Copyright
16
16
 
17
- Copyright (c) 2012 Rob Beal. See LICENSE.txt for
17
+ Copyright (c) 2012 Robert Beal. See LICENSE.txt for
18
18
  further details.
19
19
 
@@ -0,0 +1,7 @@
1
+ root_dir = File.expand_path(File.dirname(__FILE__))
2
+ $: << root_dir
3
+ $: << File.join(root_dir, 'rakeoff')
4
+ $: << File.join(root_dir, 'rakeoff', 'support')
5
+
6
+ Dir.glob(File.join(root_dir, 'rakeoff/*.rb')).each {|file| require file }
7
+
@@ -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,13 @@
1
+ require 'support/task_helper'
2
+ require 'aspnetcompile'
3
+
4
+ class AspnetCompileTask
5
+ def initialize(name, *args)
6
+ body = proc {
7
+ task = AspnetCompile.new
8
+ task.execute(SESSION)
9
+ }
10
+
11
+ create_task(name, *args, &body)
12
+ end
13
+ 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
+ require 'support/task_helper'
2
+ require 'clean'
3
+
4
+ class CleanTask
5
+ def initialize(name, options='', *args)
6
+ body = proc {
7
+ task = Clean.new(SESSION)
8
+ task.execute
9
+ }
10
+
11
+ create_task(name, *args, &body)
12
+ end
13
+ 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,13 @@
1
+ require 'support/task_helper'
2
+ require 'tests'
3
+
4
+ class TestsTask
5
+ def initialize(name, pattern, *args)
6
+ body = proc {
7
+ task = NUnit.new(SESSION)
8
+ task.execute(pattern)
9
+ }
10
+
11
+ create_task(name, *args, &body)
12
+ end
13
+ 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.1
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.000000000Z
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: &29137660 !ruby/object:Gem::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: *29137660
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: &29134220 !ruby/object:Gem::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: *29134220
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: &29133640 !ruby/object:Gem::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: *29133640
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.13
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: &29132520 !ruby/object:Gem::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: *29132520
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: &29131960 !ruby/object:Gem::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.8.0
85
+ version: 2.9.0
77
86
  type: :development
78
87
  prerelease: false
79
- version_requirements: *29131960
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: &29131420 !ruby/object:Gem::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: *29131420
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: &29130880 !ruby/object:Gem::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: *29130880
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: &29130260 !ruby/object:Gem::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.0.0
133
+ version: 1.1.3
110
134
  type: :development
111
135
  prerelease: false
112
- version_requirements: *29130260
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: &29129660 !ruby/object:Gem::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: *29129660
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: &29129100 !ruby/object:Gem::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: *29129100
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://github.com/robertbeal/rakeoff
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: -1379076687771494216
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.17
230
+ rubygems_version: 1.8.21
171
231
  signing_key:
172
232
  specification_version: 3
173
233
  summary: Build tasks for .Net projects