Commit 69d8597
Changed files (6)
.gitignore
@@ -1,6 +1,5 @@
obj
bin
-*.chm
_ReSharper.*
*.csproj.user
*.resharper.user
@@ -8,12 +7,7 @@ _ReSharper.*
*.suo
*.cache
*~
-*.sql
*.swp
*.swo
-/product/docs/Help/*.*
-/artifacts
-/product/config/app.config.vista
-/product/config/app.config.xp
-/product/config/log4net.config.xml
-
+*.sql
+artifacts
build.bat
@@ -0,0 +1,3 @@
+@echo off
+cls
+rake rakefile.rb %*
build_utilities.rb
@@ -0,0 +1,187 @@
+include FileTest
+
+class SqlRunner
+ def initialize(settings = Hash.new("Not found"))
+ @sql_tool = settings.fetch(:sql_tool,File.join(ENV['SystemDrive'],'program files','microsoft sql server','100','tools','binn','osql.exe'))
+ @command_line_args = settings.fetch(:command_line_args, '-b -i')
+ @connection_string = settings.fetch(:connection_string,"-E")
+ end
+
+ def process_sql_files(files)
+ files.each do|file|
+ begin
+ sh "#{@sql_tool} #{@connection_string} #{@command_line_args} #{file}"
+ rescue
+ puts("Error processing sql file:#{file}")
+ raise
+ end
+ end
+ end
+end
+
+class LocalSettings
+ attr_reader :settings
+
+ def [](setting)
+ @settings[setting]
+ end
+
+ def each_pair
+ @settings.each_key do|key,value|
+ yield key,@settings[key]
+ end
+ end
+end
+
+class TemplateFile
+ attr_reader :template_file_name
+ attr_reader :output_file_name
+
+ def initialize(template_file_name)
+ @template_file_name = template_file_name
+ @output_file_name = template_file_name.gsub('.template','')
+ end
+
+ def generate(settings_dictionary)
+ generate_to(@output_file_name,settings_dictionary)
+ end
+
+ def generate_to_directory(output_directory,settings_dictionary)
+ generate_to(File.join(output_directory,File.basename(@output_file_name)),settings_dictionary)
+ end
+
+ def generate_to_directories(output_directories,settings_dictionary)
+ output_directories.each do |directory|
+ generate_to_directory(directory,settings_dictionary)
+ end
+ end
+
+ def generate_to(output_file,settings_dictionary)
+ File.delete?(output_file)
+
+ File.open_for_write(output_file) do|generated_file|
+ File.open_for_read(@template_file_name) do|template_line|
+ settings_dictionary.each_key do|key|
+ template_line = template_line.gsub("@#{key}@","#{settings_dictionary[key]}")
+ end
+ generated_file.puts(template_line)
+ end
+ end
+ end
+
+ def to_s()
+ "Template File- Template:#{@template_file_name} : Output:#{@output_file_name}"
+ end
+
+end
+
+class TemplateFileList
+ @template_files
+ def initialize(files_pattern)
+ @template_files = []
+ FileList.new(files_pattern).each do|file|
+ @template_files.push(TemplateFile.new(file))
+ end
+ end
+
+ def each()
+ @template_files.each do |file|
+ yield file
+ end
+ end
+
+ def generate_all_output_files(settings)
+ @template_files.each do |file|
+ file.generate(settings)
+ end
+ end
+end
+
+class MbUnitRunner
+ def initialize(items)
+ @source_dir = items.fetch(:source_dir, 'product')
+ @mbunit_dir = items.fetch(:mbunit_dir, 'thirdparty/mbunit')
+ @test_results_dir = items.fetch(:test_results_dir, 'artifacts')
+ @compile_target = items.fetch(:compile_target, 'debug')
+ @category_to_exclude = items.fetch(:category_to_exclude, 'missing')
+ @show_report = items.fetch(:show_report, false)
+ @report_type = items.fetch(:report_type,'XML')
+ end
+
+ def execute_tests(assemblies)
+ Dir.mkdir @test_results_dir unless exists?(@test_results_dir)
+
+ assemblies.each do |assem|
+ sh build_command_line_for(assem)
+ end
+ end
+
+ def build_command_line_for(assembly)
+ file = File.expand_path("#{@source_dir}/#{assembly}/bin/#{@compile_target}/#{assembly}.dll")
+ "#{@mbunit_dir}/mbunit.cons.exe #{file} /rt:#{@report_type} /rnf:#{assembly}.dll-results /rf:#{@test_results_dir} #{'/sr' if @show_report} /ec:#{@category_to_exclude}"
+ end
+end
+
+class MSBuildRunner
+ def self.compile(attributes)
+ version = attributes.fetch(:clrversion, 'v3.5')
+ compile_target = attributes.fetch(:compile_target, 'debug')
+ solution_file = attributes[:solution_file]
+
+ framework_dir = File.join(ENV['windir'].dup, 'Microsoft.NET', 'Framework', 'v3.5')
+ msbuild_file = File.join(framework_dir, 'msbuild.exe')
+
+ sh "#{msbuild_file} #{solution_file} /property:Configuration=#{compile_target} /t:Rebuild"
+ end
+end
+
+class File
+ def self.open_for_read(file)
+ File.open(file,'r').each do|line|
+ yield line
+ end
+ end
+
+ def self.read_all_text(file)
+ contents = ''
+ File.open_for_read(file) do |line|
+ contents += line
+ end
+ end
+
+ def self.delete?(file)
+ File.delete(file) if File.exists?(file)
+ end
+
+ def self.open_for_write(file)
+ File.open(file,'w') do|new_file|
+ yield new_file
+ end
+ end
+
+ def self.base_name_without_extensions(file)
+ File.basename(file,'.*')
+ end
+
+ end
+
+class BDDDocRunner
+ def initialize(settings = Hash.new('missing'))
+ @output_folder = settings.fetch(:output_folder,'artifacts')
+ @observation_attribute = settings.fetch(:observation_attribute,'ObservationAttribute')
+ @bdddoc_folder = settings.fetch(:bdddoc_folder,'thirdparty\developwithpassion.bdddoc')
+ @mbunit_test_output_folder = settings.fetch(:mbunit_test_output_folder,'artifacts')
+ @developwithpassion_bdddoc_exe = settings.fetch(:bdddoc_exe,'developwithpassion.bdddoc.exe')
+ @logo_jpg = settings.fetch(:logo_jpg,File.join(@bdddoc_folder,'developwithpassion.bdddoc-logo.jpg'))
+ @css = settings.fetch(:css,File.join(@bdddoc_folder,'developwithpassion.bdddoc.css'))
+ end
+
+ def run(test_library)
+ test_file = File.basename(test_library)
+ output_file = "#{File.join(@output_folder,test_file)}.developwithpassion.bdddoc.html"
+ mbunit_test_output_file = "#{File.join(@mbunit_test_output_folder,test_file)}-results.xml"
+ sh "#{File.join(@bdddoc_folder,@developwithpassion_bdddoc_exe)} #{test_library} #{@observation_attribute} #{output_file} #{mbunit_test_output_file}"
+ FileUtils.cp @logo_jpg,@output_folder
+ FileUtils.cp @css,@output_folder
+ end
+end
local_properties.rb.customize
@@ -0,0 +1,30 @@
+require "project.rb"
+
+class LocalSettings
+ attr_reader :settings
+ def initialize
+ @settings = {
+ :app_config_template => "app.config.vista.template",
+ :osql_connectionstring => "-E",
+ :path_to_runtime_log4net_config => "artifacts\log4net.config.xml",
+ :initial_catalog => "#{Project.name}",
+ :database_provider => "System.Data.SqlClient" ,
+ :database_path => "C:\\databases" ,
+ :log_file_name => "#{Project.name}_log.txt",
+ :log_level => "DEBUG",
+ :xunit_report_file_dir => "artifacts" ,
+ :xunit_report_file_name => "test_report",
+ :xunit_report_type => "text",
+ :xunit_show_test_report => true,
+ :debug => "TRUE"
+
+ }
+@settings[:xunit_report_file_name_with_extension] = "#{@settings[:xunit_report_file_name]}.#{@settings[:xunit_report_type]}"
+@settings[:sql_tools_path] = File.join(ENV['SystemDrive'],'program files','microsoft sql server','100','tools','binn')
+@settings[:osql_exe] = File.join("#{@settings[:sql_tools_path]}",'osql.exe')
+@settings[:config_connectionstring] = "data source=(local);Integrated Security=SSPI;Initial Catalog=#{@settings[:initial_catalog]}"
+#@settings[:db_account_sql]= "#{@settings[:asp_net_account]} WITH PASSWORD=N'#{@settings[:asp_net_account]}', DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF")
+@settings[:asp_net_account] = "#{ENV["computername"]}\\ASPNet";
+@settings[:db_account_sql] = "#{@settings[:asp_net_account]}', N'#{@settings[:asp_net_account]}'"
+ end
+end
project.rb
@@ -0,0 +1,28 @@
+class Project
+ attr_reader :name
+ attr_reader :startup_dir
+ attr_reader :tests_dir
+ attr_reader :startup_config
+ attr_reader :startup_extension
+
+ def self.name
+ @name = "simple.migrations"
+ end
+
+ def self.startup_dir
+ @startup_dir = "#{self.name}"
+ end
+
+ def self.tests_dir
+ @tests_dir = "test.#{self.name}"
+ end
+
+ def self.startup_config
+ @startup_config = "app.config"
+ end
+
+ def self.startup_extension
+ @startup_extension = ".dll"
+ end
+
+end
rakefile.rb
@@ -0,0 +1,94 @@
+require 'build_utilities.rb'
+require 'local_properties.rb'
+require 'project.rb'
+require 'rake/clean'
+require 'fileutils'
+
+#load settings that differ by machine
+local_settings = LocalSettings.new
+
+COMPILE_TARGET = 'debug'
+
+CLEAN.include('artifacts','**/bin','**/obj','**/*.sql')
+
+def create_sql_fileset(folder)
+ FileList.new(File.join('product','sql',folder,'**/*.sql'))
+end
+
+template_files = TemplateFileList.new('**/*.template')
+template_code_dir = File.join('product','templated_code')
+
+sql_runner = SqlRunner.new :sql_tool => local_settings[:osql_exe] , :connection_string => local_settings[:osql_connectionstring]
+
+
+#configuration files
+config_files = FileList.new(File.join('product','config','*.template')).select{|fn| ! fn.include?('app.config')}
+app_config = TemplateFile.new(File.join('product','config',local_settings[:app_config_template]))
+
+#target folders that can be run from VS
+project_startup_dir = File.join('product',"#{Project.startup_dir}")
+project_test_dir = File.join('product',"#{Project.tests_dir}",'bin','debug')
+
+output_folders = [project_startup_dir,project_test_dir]
+
+task :default => [:build_db,:full_test]
+
+task :init => :clean do
+ mkdir 'artifacts'
+ mkdir 'artifacts/coverage'
+ mkdir 'artifacts/deploy'
+ mkdir "artifacts/deploy/#{Project.name}"
+end
+
+task :expand_all_template_files do
+ template_files.generate_all_output_files(local_settings.settings)
+end
+
+task :build_db => :expand_all_template_files do
+ sql_runner.process_sql_files(create_sql_fileset('ddl'))
+end
+
+task :load_data => :build_db do
+ sql_runner.process_sql_files(create_sql_fileset('data'))
+end
+
+task :compile => :expand_all_template_files do
+ MSBuildRunner.compile :compile_target => COMPILE_TARGET, :solution_file => 'solution.sln'
+end
+
+task :test, :category_to_exclude, :needs => [:compile] do |t,args|
+ puts Project.startup_dir
+ args.with_defaults(:category_to_exclude => 'SLOW')
+ runner = MbUnitRunner.new :compile_target => COMPILE_TARGET, :category_to_exclude => args.category_to_exclude, :show_report => false
+ runner.execute_tests ["#{Project.tests_dir}"]
+end
+
+task :run_test_report => [:test] do
+ runner = BDDDocRunner.new
+ runner.run(File.join('product',"#{Project.tests_dir}",'bin','debug',"#{Project.tests_dir}.dll"))
+end
+
+task :deploy => [:init,:compile] do
+ deploy_folder = File.join('artifacts','deploy')
+ copy_project_outputs(File.join(deploy_folder,Project.name),['*.dll','*.exe','*.pdb'])
+ FileUtils.cp_r(File.join('thirdparty','mbunit'),deploy_folder)
+ FileUtils.cp_r(File.join('thirdparty','rhino.mocks'),deploy_folder)
+ FileUtils.cp_r(File.join('thirdparty','developwithpassion.commons'),deploy_folder)
+end
+
+task :from_ide do
+ app_config.generate_to(File.join(project_startup_dir,"#{Project.startup_config}"),local_settings.settings)
+ app_config.generate_to(File.join(project_test_dir,"#{Project.tests_dir}.dll.config"),local_settings.settings)
+
+ config_files.each do |file|
+ TemplateFile.new(file).generate_to_directories([project_startup_dir,project_test_dir],local_settings.settings)
+ end
+end
+
+def copy_project_outputs(folder,extensions)
+ extensions.each do |extension|
+ Dir.glob(File.join('product','**',"#{Project.name}#{extension}")).each do |file|
+ FileUtils.cp file,folder
+ end
+ end
+end