crazy_ivan 0.2.0

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.
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