crazy_ivan 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (133) hide show
  1. data/.gitignore +7 -0
  2. data/LICENSE +20 -0
  3. data/README.rdoc +94 -0
  4. data/Rakefile +92 -0
  5. data/TODO +33 -0
  6. data/VERSION +1 -0
  7. data/bin/crazy_ivan +114 -0
  8. data/crazy_ivan.gemspec +182 -0
  9. data/lib/crazy_ivan.rb +5 -0
  10. data/lib/html_asset_crush.rb +56 -0
  11. data/lib/report_assembler.rb +78 -0
  12. data/lib/test_runner.rb +71 -0
  13. data/templates/css/ci.css +11 -0
  14. data/templates/index.html +105 -0
  15. data/templates/javascript/json-template.js +544 -0
  16. data/templates/javascript/prototype.js +4917 -0
  17. data/test/crazy_ivan_test.rb +4 -0
  18. data/test/test_helper.rb +9 -0
  19. data/vendor/json-1.1.7/CHANGES +119 -0
  20. data/vendor/json-1.1.7/GPL +340 -0
  21. data/vendor/json-1.1.7/README +78 -0
  22. data/vendor/json-1.1.7/RUBY +58 -0
  23. data/vendor/json-1.1.7/Rakefile +270 -0
  24. data/vendor/json-1.1.7/TODO +1 -0
  25. data/vendor/json-1.1.7/VERSION +1 -0
  26. data/vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkComparison.log +52 -0
  27. data/vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_fast-autocorrelation.dat +1000 -0
  28. data/vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_fast.dat +1001 -0
  29. data/vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_pretty-autocorrelation.dat +900 -0
  30. data/vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_pretty.dat +901 -0
  31. data/vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_safe-autocorrelation.dat +1000 -0
  32. data/vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_safe.dat +1001 -0
  33. data/vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt.log +261 -0
  34. data/vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_fast-autocorrelation.dat +1000 -0
  35. data/vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_fast.dat +1001 -0
  36. data/vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_pretty-autocorrelation.dat +1000 -0
  37. data/vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_pretty.dat +1001 -0
  38. data/vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_safe-autocorrelation.dat +1000 -0
  39. data/vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_safe.dat +1001 -0
  40. data/vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure.log +262 -0
  41. data/vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkRails#generator-autocorrelation.dat +1000 -0
  42. data/vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkRails#generator.dat +1001 -0
  43. data/vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkRails.log +82 -0
  44. data/vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkComparison.log +34 -0
  45. data/vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkExt#parser-autocorrelation.dat +900 -0
  46. data/vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkExt#parser.dat +901 -0
  47. data/vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkExt.log +81 -0
  48. data/vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkPure#parser-autocorrelation.dat +1000 -0
  49. data/vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkPure#parser.dat +1001 -0
  50. data/vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkPure.log +82 -0
  51. data/vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkRails#parser-autocorrelation.dat +1000 -0
  52. data/vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkRails#parser.dat +1001 -0
  53. data/vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkRails.log +82 -0
  54. data/vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkYAML#parser-autocorrelation.dat +1000 -0
  55. data/vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkYAML#parser.dat +1001 -0
  56. data/vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkYAML.log +82 -0
  57. data/vendor/json-1.1.7/benchmarks/generator_benchmark.rb +165 -0
  58. data/vendor/json-1.1.7/benchmarks/parser_benchmark.rb +197 -0
  59. data/vendor/json-1.1.7/bin/edit_json.rb +9 -0
  60. data/vendor/json-1.1.7/bin/prettify_json.rb +75 -0
  61. data/vendor/json-1.1.7/data/example.json +1 -0
  62. data/vendor/json-1.1.7/data/index.html +38 -0
  63. data/vendor/json-1.1.7/data/prototype.js +4184 -0
  64. data/vendor/json-1.1.7/doc-templates/main.txt +283 -0
  65. data/vendor/json-1.1.7/ext/json/ext/generator/extconf.rb +11 -0
  66. data/vendor/json-1.1.7/ext/json/ext/generator/generator.c +919 -0
  67. data/vendor/json-1.1.7/ext/json/ext/generator/unicode.c +182 -0
  68. data/vendor/json-1.1.7/ext/json/ext/generator/unicode.h +53 -0
  69. data/vendor/json-1.1.7/ext/json/ext/parser/extconf.rb +11 -0
  70. data/vendor/json-1.1.7/ext/json/ext/parser/parser.c +1829 -0
  71. data/vendor/json-1.1.7/ext/json/ext/parser/parser.rl +686 -0
  72. data/vendor/json-1.1.7/ext/json/ext/parser/unicode.c +154 -0
  73. data/vendor/json-1.1.7/ext/json/ext/parser/unicode.h +58 -0
  74. data/vendor/json-1.1.7/install.rb +26 -0
  75. data/vendor/json-1.1.7/lib/json.rb +10 -0
  76. data/vendor/json-1.1.7/lib/json/Array.xpm +21 -0
  77. data/vendor/json-1.1.7/lib/json/FalseClass.xpm +21 -0
  78. data/vendor/json-1.1.7/lib/json/Hash.xpm +21 -0
  79. data/vendor/json-1.1.7/lib/json/Key.xpm +73 -0
  80. data/vendor/json-1.1.7/lib/json/NilClass.xpm +21 -0
  81. data/vendor/json-1.1.7/lib/json/Numeric.xpm +28 -0
  82. data/vendor/json-1.1.7/lib/json/String.xpm +96 -0
  83. data/vendor/json-1.1.7/lib/json/TrueClass.xpm +21 -0
  84. data/vendor/json-1.1.7/lib/json/add/core.rb +135 -0
  85. data/vendor/json-1.1.7/lib/json/add/rails.rb +58 -0
  86. data/vendor/json-1.1.7/lib/json/common.rb +354 -0
  87. data/vendor/json-1.1.7/lib/json/editor.rb +1371 -0
  88. data/vendor/json-1.1.7/lib/json/ext.rb +15 -0
  89. data/vendor/json-1.1.7/lib/json/json.xpm +1499 -0
  90. data/vendor/json-1.1.7/lib/json/pure.rb +77 -0
  91. data/vendor/json-1.1.7/lib/json/pure/generator.rb +430 -0
  92. data/vendor/json-1.1.7/lib/json/pure/parser.rb +269 -0
  93. data/vendor/json-1.1.7/lib/json/version.rb +8 -0
  94. data/vendor/json-1.1.7/tests/fixtures/fail1.json +1 -0
  95. data/vendor/json-1.1.7/tests/fixtures/fail10.json +1 -0
  96. data/vendor/json-1.1.7/tests/fixtures/fail11.json +1 -0
  97. data/vendor/json-1.1.7/tests/fixtures/fail12.json +1 -0
  98. data/vendor/json-1.1.7/tests/fixtures/fail13.json +1 -0
  99. data/vendor/json-1.1.7/tests/fixtures/fail14.json +1 -0
  100. data/vendor/json-1.1.7/tests/fixtures/fail18.json +1 -0
  101. data/vendor/json-1.1.7/tests/fixtures/fail19.json +1 -0
  102. data/vendor/json-1.1.7/tests/fixtures/fail2.json +1 -0
  103. data/vendor/json-1.1.7/tests/fixtures/fail20.json +1 -0
  104. data/vendor/json-1.1.7/tests/fixtures/fail21.json +1 -0
  105. data/vendor/json-1.1.7/tests/fixtures/fail22.json +1 -0
  106. data/vendor/json-1.1.7/tests/fixtures/fail23.json +1 -0
  107. data/vendor/json-1.1.7/tests/fixtures/fail24.json +1 -0
  108. data/vendor/json-1.1.7/tests/fixtures/fail25.json +1 -0
  109. data/vendor/json-1.1.7/tests/fixtures/fail27.json +2 -0
  110. data/vendor/json-1.1.7/tests/fixtures/fail28.json +2 -0
  111. data/vendor/json-1.1.7/tests/fixtures/fail3.json +1 -0
  112. data/vendor/json-1.1.7/tests/fixtures/fail4.json +1 -0
  113. data/vendor/json-1.1.7/tests/fixtures/fail5.json +1 -0
  114. data/vendor/json-1.1.7/tests/fixtures/fail6.json +1 -0
  115. data/vendor/json-1.1.7/tests/fixtures/fail7.json +1 -0
  116. data/vendor/json-1.1.7/tests/fixtures/fail8.json +1 -0
  117. data/vendor/json-1.1.7/tests/fixtures/fail9.json +1 -0
  118. data/vendor/json-1.1.7/tests/fixtures/pass1.json +56 -0
  119. data/vendor/json-1.1.7/tests/fixtures/pass15.json +1 -0
  120. data/vendor/json-1.1.7/tests/fixtures/pass16.json +1 -0
  121. data/vendor/json-1.1.7/tests/fixtures/pass17.json +1 -0
  122. data/vendor/json-1.1.7/tests/fixtures/pass2.json +1 -0
  123. data/vendor/json-1.1.7/tests/fixtures/pass26.json +1 -0
  124. data/vendor/json-1.1.7/tests/fixtures/pass3.json +6 -0
  125. data/vendor/json-1.1.7/tests/test_json.rb +312 -0
  126. data/vendor/json-1.1.7/tests/test_json_addition.rb +164 -0
  127. data/vendor/json-1.1.7/tests/test_json_fixtures.rb +34 -0
  128. data/vendor/json-1.1.7/tests/test_json_generate.rb +106 -0
  129. data/vendor/json-1.1.7/tests/test_json_rails.rb +146 -0
  130. data/vendor/json-1.1.7/tests/test_json_unicode.rb +62 -0
  131. data/vendor/json-1.1.7/tools/fuzz.rb +139 -0
  132. data/vendor/json-1.1.7/tools/server.rb +61 -0
  133. metadata +196 -0
data/.gitignore ADDED
@@ -0,0 +1,7 @@
1
+ *.sw?
2
+ .DS_Store
3
+ coverage
4
+ rdoc
5
+ pkg
6
+ *.gem
7
+ www
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 Edward Ocampo-Gooding
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,94 @@
1
+ = Crazy Ivan
2
+
3
+ Crazy Ivan (CI) is simplest possible continuous integration tool.
4
+
5
+ == Usage
6
+
7
+ Create a directory where your projects will live
8
+ $ mkdir /var/continuous-integration
9
+
10
+ Setup a project or two in that directory
11
+ $ cd /var/continuous-integration
12
+ $ git clone git://github.com/edward/active_merchant.git
13
+
14
+ Setup continuous-integration for each project
15
+ $ crazy_ivan setup # creates example ci scripts in
16
+ # each project (see How this works)
17
+
18
+
19
+
20
+ $ crazy_ivan setup # creates the ci directory, and
21
+ # creates a configuration file,
22
+ # sets a cron job to run crazy_ivan
23
+
24
+ Manually run it once to check everything is ok
25
+ $ cd /var/continuous-integration
26
+ $ crazy_ivan /var/www/ci # the test reports path should be
27
+ # accessible via your web server
28
+
29
+ $ open /var/www/ci/index.html # or check it through your browser
30
+
31
+ Set a cron job to run it every 15 minutes
32
+ $ echo "0,15,30,45 * * * * cd /var/continuous-integration; crazy_ivan /var/www/ci" > ci.cron
33
+ $ crontab ci.cron
34
+
35
+ Note that you don’t want this running too frequently; having overlapping
36
+ runs is possible and would be bad.
37
+
38
+ (Functionality to have this run as a web-hook is planned.)
39
+
40
+ == How this works
41
+
42
+ * crazy_ivan is executed periodically by cron
43
+ * crazy_ivan looks in directories one level deeper than where it’s been called
44
+
45
+ => asked to run in /projects
46
+ /shopify
47
+ looks in each /liquid
48
+ of these dirs /active_merchant
49
+ ========> /active_shipping
50
+
51
+ => within each directory, it expects three executable scripts
52
+ to execute at the /:
53
+
54
+ /shopify
55
+ /.ci
56
+ update
57
+ version
58
+ test
59
+
60
+ * crazy_ivan first executes `update` and captures the output:
61
+
62
+ #!/usr/bin/env bash
63
+
64
+ git pull # Whatever your application
65
+ # needs to do to update your
66
+ # source from a repository
67
+
68
+ * crazy_ivan then exectutes `version` and captures the output:
69
+
70
+ #!/usr/bin/env bash
71
+
72
+ #!/usr/bin/env ruby -wKU # Get a version hash/fingerprint/id
73
+ puts `git show`[/^commit (.+)$/, 1] # from your version control system
74
+ #
75
+ # (Note that this will be truncated
76
+ # to fit within a filename length.)
77
+
78
+ * crazy_ivan then executes `test` and captures the output:
79
+
80
+ #!/usr/bin/env bash
81
+
82
+ rake db:migrate # This task prepares the application
83
+ rake test # for running tests, then runs them
84
+
85
+ * At each of these three steps, the output is repackaged
86
+ into a .json file to be consumed in the directory holding
87
+ the static html.
88
+
89
+
90
+ == Copyright and Credits
91
+
92
+ Copyright (c) 2009 Edward Ocampo-Gooding. See LICENSE for details.
93
+
94
+ Heavily inspired/first code sketch written by Tobi Lütke.
data/Rakefile ADDED
@@ -0,0 +1,92 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |gem|
7
+ gem.name = "crazy_ivan"
8
+ gem.summary = 'Crazy Ivan (CI) is simplest possible continuous integration tool.'
9
+ gem.description = "Continuous integration should really just be a script that captures the output of running your project update & test commands and presents recent results in a static html page.
10
+
11
+ By keeping test reports in json, per-project CI configuration in 3 probably-one-line scripts, things are kept simple, quick, and super extensible.
12
+
13
+ Want to use git, svn, or hg? No problem.
14
+ Need to fire off results to Twitter or Campfire? It's one line away.
15
+
16
+ CI depends on cron."
17
+ gem.email = "edward@edwardog.net"
18
+ gem.homepage = "http://github.com/edward/crazy_ivan"
19
+ gem.authors = ["Edward Ocampo-Gooding"]
20
+ gem.rubyforge_project = "crazyivan"
21
+ # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
22
+ end
23
+ Jeweler::RubyforgeTasks.new do |rubyforge|
24
+ rubyforge.doc_task = "rdoc"
25
+ end
26
+ rescue LoadError
27
+ puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
28
+ end
29
+
30
+ begin
31
+ require 'rake/contrib/sshpublisher'
32
+ namespace :rubyforge do
33
+
34
+ desc "Release gem and RDoc documentation to RubyForge"
35
+ task :release => ["rubyforge:release:gem", "rubyforge:release:docs"]
36
+
37
+ namespace :release do
38
+ desc "Publish RDoc to RubyForge."
39
+ task :docs => [:rdoc] do
40
+ config = YAML.load(
41
+ File.read(File.expand_path('~/.rubyforge/user-config.yml'))
42
+ )
43
+
44
+ host = "#{config['username']}@rubyforge.org"
45
+ remote_dir = "/var/www/gforge-projects/the-perfect-gem/"
46
+ local_dir = 'rdoc'
47
+
48
+ Rake::SshDirPublisher.new(host, remote_dir, local_dir).upload
49
+ end
50
+ end
51
+ end
52
+ rescue LoadError
53
+ puts "Rake SshDirPublisher is unavailable or your rubyforge environment is not configured."
54
+ end
55
+
56
+ require 'rake/testtask'
57
+ Rake::TestTask.new(:test) do |test|
58
+ test.libs << 'lib' << 'test'
59
+ test.pattern = 'test/**/*_test.rb'
60
+ test.verbose = true
61
+ end
62
+
63
+ begin
64
+ require 'rcov/rcovtask'
65
+ Rcov::RcovTask.new do |test|
66
+ test.libs << 'test'
67
+ test.pattern = 'test/**/*_test.rb'
68
+ test.verbose = true
69
+ end
70
+ rescue LoadError
71
+ task :rcov do
72
+ abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
73
+ end
74
+ end
75
+
76
+ task :test => :check_dependencies
77
+
78
+ task :default => :test
79
+
80
+ require 'rake/rdoctask'
81
+ Rake::RDocTask.new do |rdoc|
82
+ if File.exist?('VERSION')
83
+ version = File.read('VERSION')
84
+ else
85
+ version = ""
86
+ end
87
+
88
+ rdoc.rdoc_dir = 'rdoc'
89
+ rdoc.title = "Crazy Ivan #{version}"
90
+ rdoc.rdoc_files.include('README*')
91
+ rdoc.rdoc_files.include('lib/**/*.rb')
92
+ end
data/TODO ADDED
@@ -0,0 +1,33 @@
1
+ * When the .ci directory scripts are missing, prompt with a
2
+
3
+ Create update script? [Y]/n?
4
+
5
+ then ask them about the git or svn repository. Do a friendly wizard thing with nice colours.
6
+ This should be as nice as Phusion’s thing.
7
+
8
+ * TestRunner#run_script should warn or complain on empty scripts or on scripts that do not return output
9
+
10
+ * Think about using popen4 instead (fixes exit status code issue with popen3)
11
+
12
+ * What about making all setup just be:
13
+
14
+ $ ci install [/var/continuous-integration]
15
+ # Defaults to creating ^^^ and prompting for each project somehow
16
+
17
+ * Needs more logging; should log to system when running each project
18
+
19
+ * Add a 'periscope' web-hook with rack to run tests.
20
+
21
+ * Come up with a better executable name ("ci" is taken by RCS)
22
+
23
+ * Come up with a better way of making the scripts executable other than just chmod-755-ing them.
24
+
25
+ * Come up with a better way of dealing with the filename length issue. (Having to truncate at 240 chars right now.)
26
+
27
+ * Create example script templates for popular version control systems
28
+
29
+ * Add functionality to detect new test runs and update index.html in-browser (have a poll every 30 seconds or something on projects.json and recents.json)
30
+
31
+ * Use datejs to parse the timestamp to easily produce deltas (i.e. "Last test ran 2 days ago")
32
+
33
+ * Do something like use a file-lock to prevent overlapping runs and notify in the index.html that it's happening
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.2.0
data/bin/crazy_ivan ADDED
@@ -0,0 +1,114 @@
1
+ #!/usr/bin/env ruby -wKU
2
+
3
+ require File.join(File.dirname(__FILE__), *%w[.. lib crazy_ivan])
4
+ require File.join(File.dirname(__FILE__), *%w[.. vendor json-1.1.7 lib json])
5
+ require "optparse"
6
+ require "logger"
7
+
8
+ CRAZY_IVAN_VERSION = File.read(File.join(File.dirname(__FILE__), *%w[.. VERSION]))
9
+
10
+ def setup
11
+ Dir['*'].each do |dir|
12
+ Dir.chdir(dir) do
13
+ FileUtils.mkdir_p('.ci')
14
+
15
+ Dir.chdir('.ci') do
16
+ File.open('update', 'w+') do |f|
17
+ f.puts "#!/usr/bin/env bash"
18
+ f.puts "git pull"
19
+ end
20
+
21
+ File.open('version', 'w+') do |f|
22
+ f.puts "#!/usr/bin/env ruby -wKU"
23
+ f.puts "puts `git show`[/^commit (.+)$/, 1]"
24
+ end
25
+
26
+ File.open('test', 'w+') do |f|
27
+ f.puts "#!/usr/bin/env bash"
28
+ f.puts "rake"
29
+ end
30
+
31
+ File.chmod 0755, 'update', 'version', 'test'
32
+ end
33
+
34
+ puts
35
+ puts "Created #{dir}/.ci/update"
36
+ puts " #{' ' * (dir + "/.ci").size}/version"
37
+ puts " #{' ' * (dir + "/.ci").size}/test"
38
+ puts
39
+ puts "Take a look at those 3 scripts to make sure "
40
+ puts "they do the right thing for each case."
41
+ puts
42
+ end
43
+ end
44
+ end
45
+
46
+ def generate_test_reports_in(output_directory)
47
+ Dir['*'].each do |dir|
48
+ if File.directory?(dir)
49
+ report = ReportAssembler.new(output_directory)
50
+ report.test_results << TestRunner.new(dir).invoke
51
+ report.generate
52
+ end
53
+ end
54
+ end
55
+
56
+ def show_howto
57
+ puts "Hankering for a continuous integration server, eh?"
58
+ puts
59
+ puts "1. Jump over to where you want to keep your projects"
60
+ puts " and git clone or svn checkout or whatever-them down:"
61
+ puts " $ mkdir -p /var/continuous-integration/projects/"
62
+ puts " $ cd /var/continuous-integration/projects"
63
+ puts " $ git clone git@github.com:edward/active_merchant.git"
64
+ puts
65
+ puts "2. Run:"
66
+ puts " $ crazy_ivan setup"
67
+ puts
68
+ puts "3. Run it manually to check that everything is ok:"
69
+ puts " $ crazy_ivan /var/www/ci"
70
+ puts
71
+ puts " (/var/www/ci should be accessible through your web server)"
72
+ puts " Check /var/www/ci/index.html through a web browser."
73
+ puts
74
+ puts "4. Set up cron to run it every 15 minutes:"
75
+ puts " $ echo \"0,15,30,45 * * * * cd /var/continuous-integration; crazy_ivan /var/www/ci\" > ci.cron"
76
+ puts " $ crontab ci.cron"
77
+ puts
78
+ puts "5. Profit."
79
+ puts
80
+ puts "Please see http://github.com/edward/crazy_ivan for more."
81
+ end
82
+
83
+ options = {}
84
+
85
+ ARGV.options do |opts|
86
+ opts.banner = "Usage: #{File.basename($PROGRAM_NAME)} test_reports_path"
87
+
88
+ opts.on_tail("-h", "--help", "Show this message") do
89
+ show_howto
90
+ puts opts
91
+ exit
92
+ end
93
+
94
+ opts.on_tail("--version", "Show version") do
95
+ puts CRAZY_IVAN_VERSION
96
+ exit
97
+ end
98
+
99
+ begin
100
+ opts.parse!
101
+
102
+ case ARGV[0]
103
+ when /setup/
104
+ setup
105
+ when /\w+/
106
+ output_directory = ARGV[0]
107
+ FileUtils.mkdir_p(output_directory)
108
+ generate_test_reports_in(output_directory)
109
+ else
110
+ show_howto
111
+ exit
112
+ end
113
+ end
114
+ end
@@ -0,0 +1,182 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run `rake gemspec`
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{crazy_ivan}
8
+ s.version = "0.2.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Edward Ocampo-Gooding"]
12
+ s.date = %q{2009-08-30}
13
+ s.default_executable = %q{crazy_ivan}
14
+ s.description = %q{Continuous integration should really just be a script that captures the output of running your project update & test commands and presents recent results in a static html page.
15
+
16
+ By keeping test reports in json, per-project CI configuration in 3 probably-one-line scripts, things are kept simple, quick, and super extensible.
17
+
18
+ Want to use git, svn, or hg? No problem.
19
+ Need to fire off results to Twitter or Campfire? It's one line away.
20
+
21
+ CI depends on cron.}
22
+ s.email = %q{edward@edwardog.net}
23
+ s.executables = ["crazy_ivan"]
24
+ s.extra_rdoc_files = [
25
+ "LICENSE",
26
+ "README.rdoc"
27
+ ]
28
+ s.files = [
29
+ ".gitignore",
30
+ "LICENSE",
31
+ "README.rdoc",
32
+ "Rakefile",
33
+ "TODO",
34
+ "VERSION",
35
+ "bin/crazy_ivan",
36
+ "crazy_ivan.gemspec",
37
+ "lib/crazy_ivan.rb",
38
+ "lib/html_asset_crush.rb",
39
+ "lib/report_assembler.rb",
40
+ "lib/test_runner.rb",
41
+ "templates/css/ci.css",
42
+ "templates/index.html",
43
+ "templates/javascript/json-template.js",
44
+ "templates/javascript/prototype.js",
45
+ "test/crazy_ivan_test.rb",
46
+ "test/test_helper.rb",
47
+ "vendor/json-1.1.7/CHANGES",
48
+ "vendor/json-1.1.7/GPL",
49
+ "vendor/json-1.1.7/README",
50
+ "vendor/json-1.1.7/RUBY",
51
+ "vendor/json-1.1.7/Rakefile",
52
+ "vendor/json-1.1.7/TODO",
53
+ "vendor/json-1.1.7/VERSION",
54
+ "vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkComparison.log",
55
+ "vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_fast-autocorrelation.dat",
56
+ "vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_fast.dat",
57
+ "vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_pretty-autocorrelation.dat",
58
+ "vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_pretty.dat",
59
+ "vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_safe-autocorrelation.dat",
60
+ "vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_safe.dat",
61
+ "vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt.log",
62
+ "vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_fast-autocorrelation.dat",
63
+ "vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_fast.dat",
64
+ "vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_pretty-autocorrelation.dat",
65
+ "vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_pretty.dat",
66
+ "vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_safe-autocorrelation.dat",
67
+ "vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_safe.dat",
68
+ "vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure.log",
69
+ "vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkRails#generator-autocorrelation.dat",
70
+ "vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkRails#generator.dat",
71
+ "vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkRails.log",
72
+ "vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkComparison.log",
73
+ "vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkExt#parser-autocorrelation.dat",
74
+ "vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkExt#parser.dat",
75
+ "vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkExt.log",
76
+ "vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkPure#parser-autocorrelation.dat",
77
+ "vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkPure#parser.dat",
78
+ "vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkPure.log",
79
+ "vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkRails#parser-autocorrelation.dat",
80
+ "vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkRails#parser.dat",
81
+ "vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkRails.log",
82
+ "vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkYAML#parser-autocorrelation.dat",
83
+ "vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkYAML#parser.dat",
84
+ "vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkYAML.log",
85
+ "vendor/json-1.1.7/benchmarks/generator_benchmark.rb",
86
+ "vendor/json-1.1.7/benchmarks/parser_benchmark.rb",
87
+ "vendor/json-1.1.7/bin/edit_json.rb",
88
+ "vendor/json-1.1.7/bin/prettify_json.rb",
89
+ "vendor/json-1.1.7/data/example.json",
90
+ "vendor/json-1.1.7/data/index.html",
91
+ "vendor/json-1.1.7/data/prototype.js",
92
+ "vendor/json-1.1.7/doc-templates/main.txt",
93
+ "vendor/json-1.1.7/ext/json/ext/generator/extconf.rb",
94
+ "vendor/json-1.1.7/ext/json/ext/generator/generator.c",
95
+ "vendor/json-1.1.7/ext/json/ext/generator/unicode.c",
96
+ "vendor/json-1.1.7/ext/json/ext/generator/unicode.h",
97
+ "vendor/json-1.1.7/ext/json/ext/parser/extconf.rb",
98
+ "vendor/json-1.1.7/ext/json/ext/parser/parser.c",
99
+ "vendor/json-1.1.7/ext/json/ext/parser/parser.rl",
100
+ "vendor/json-1.1.7/ext/json/ext/parser/unicode.c",
101
+ "vendor/json-1.1.7/ext/json/ext/parser/unicode.h",
102
+ "vendor/json-1.1.7/install.rb",
103
+ "vendor/json-1.1.7/lib/json.rb",
104
+ "vendor/json-1.1.7/lib/json/Array.xpm",
105
+ "vendor/json-1.1.7/lib/json/FalseClass.xpm",
106
+ "vendor/json-1.1.7/lib/json/Hash.xpm",
107
+ "vendor/json-1.1.7/lib/json/Key.xpm",
108
+ "vendor/json-1.1.7/lib/json/NilClass.xpm",
109
+ "vendor/json-1.1.7/lib/json/Numeric.xpm",
110
+ "vendor/json-1.1.7/lib/json/String.xpm",
111
+ "vendor/json-1.1.7/lib/json/TrueClass.xpm",
112
+ "vendor/json-1.1.7/lib/json/add/core.rb",
113
+ "vendor/json-1.1.7/lib/json/add/rails.rb",
114
+ "vendor/json-1.1.7/lib/json/common.rb",
115
+ "vendor/json-1.1.7/lib/json/editor.rb",
116
+ "vendor/json-1.1.7/lib/json/ext.rb",
117
+ "vendor/json-1.1.7/lib/json/json.xpm",
118
+ "vendor/json-1.1.7/lib/json/pure.rb",
119
+ "vendor/json-1.1.7/lib/json/pure/generator.rb",
120
+ "vendor/json-1.1.7/lib/json/pure/parser.rb",
121
+ "vendor/json-1.1.7/lib/json/version.rb",
122
+ "vendor/json-1.1.7/tests/fixtures/fail1.json",
123
+ "vendor/json-1.1.7/tests/fixtures/fail10.json",
124
+ "vendor/json-1.1.7/tests/fixtures/fail11.json",
125
+ "vendor/json-1.1.7/tests/fixtures/fail12.json",
126
+ "vendor/json-1.1.7/tests/fixtures/fail13.json",
127
+ "vendor/json-1.1.7/tests/fixtures/fail14.json",
128
+ "vendor/json-1.1.7/tests/fixtures/fail18.json",
129
+ "vendor/json-1.1.7/tests/fixtures/fail19.json",
130
+ "vendor/json-1.1.7/tests/fixtures/fail2.json",
131
+ "vendor/json-1.1.7/tests/fixtures/fail20.json",
132
+ "vendor/json-1.1.7/tests/fixtures/fail21.json",
133
+ "vendor/json-1.1.7/tests/fixtures/fail22.json",
134
+ "vendor/json-1.1.7/tests/fixtures/fail23.json",
135
+ "vendor/json-1.1.7/tests/fixtures/fail24.json",
136
+ "vendor/json-1.1.7/tests/fixtures/fail25.json",
137
+ "vendor/json-1.1.7/tests/fixtures/fail27.json",
138
+ "vendor/json-1.1.7/tests/fixtures/fail28.json",
139
+ "vendor/json-1.1.7/tests/fixtures/fail3.json",
140
+ "vendor/json-1.1.7/tests/fixtures/fail4.json",
141
+ "vendor/json-1.1.7/tests/fixtures/fail5.json",
142
+ "vendor/json-1.1.7/tests/fixtures/fail6.json",
143
+ "vendor/json-1.1.7/tests/fixtures/fail7.json",
144
+ "vendor/json-1.1.7/tests/fixtures/fail8.json",
145
+ "vendor/json-1.1.7/tests/fixtures/fail9.json",
146
+ "vendor/json-1.1.7/tests/fixtures/pass1.json",
147
+ "vendor/json-1.1.7/tests/fixtures/pass15.json",
148
+ "vendor/json-1.1.7/tests/fixtures/pass16.json",
149
+ "vendor/json-1.1.7/tests/fixtures/pass17.json",
150
+ "vendor/json-1.1.7/tests/fixtures/pass2.json",
151
+ "vendor/json-1.1.7/tests/fixtures/pass26.json",
152
+ "vendor/json-1.1.7/tests/fixtures/pass3.json",
153
+ "vendor/json-1.1.7/tests/test_json.rb",
154
+ "vendor/json-1.1.7/tests/test_json_addition.rb",
155
+ "vendor/json-1.1.7/tests/test_json_fixtures.rb",
156
+ "vendor/json-1.1.7/tests/test_json_generate.rb",
157
+ "vendor/json-1.1.7/tests/test_json_rails.rb",
158
+ "vendor/json-1.1.7/tests/test_json_unicode.rb",
159
+ "vendor/json-1.1.7/tools/fuzz.rb",
160
+ "vendor/json-1.1.7/tools/server.rb"
161
+ ]
162
+ s.homepage = %q{http://github.com/edward/crazy_ivan}
163
+ s.rdoc_options = ["--charset=UTF-8"]
164
+ s.require_paths = ["lib"]
165
+ s.rubyforge_project = %q{crazyivan}
166
+ s.rubygems_version = %q{1.3.5}
167
+ s.summary = %q{Crazy Ivan (CI) is simplest possible continuous integration tool.}
168
+ s.test_files = [
169
+ "test/crazy_ivan_test.rb",
170
+ "test/test_helper.rb"
171
+ ]
172
+
173
+ if s.respond_to? :specification_version then
174
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
175
+ s.specification_version = 3
176
+
177
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
178
+ else
179
+ end
180
+ else
181
+ end
182
+ end