Commit 69d8597

unknown <mkhan@.arcresources.ca>
2009-10-05 17:57:58
includings jps build files as a template to learn rake.
1 parent 82d842f
.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