crazy_ivan 1.1.0 → 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
data/bin/crazy_ivan CHANGED
@@ -13,7 +13,15 @@ end
13
13
  require "optparse"
14
14
  require "logger"
15
15
 
16
- Signal.trap("INT") { puts; exit }
16
+ Syslog.open('crazy_ivan', Syslog::LOG_PID | Syslog::LOG_CONS)
17
+
18
+ Signal.trap("INT") do
19
+ Syslog.debug("Interrupted - Now dropping a note in the test output and exiting.")
20
+ CrazyIvan.interrupt_test
21
+ CrazyIvan::ProcessManager.unlock
22
+ puts
23
+ exit
24
+ end
17
25
 
18
26
  def show_howto
19
27
  puts "Hankering for a continuous integration server, eh?"
@@ -44,6 +52,35 @@ end
44
52
 
45
53
  options = {}
46
54
 
55
+
56
+ class CrazyIvan::ProcessManager
57
+ PidFile = '/tmp/crazy_ivan.pid'
58
+
59
+ def self.acquire_lock
60
+ lock_exclusively!
61
+ yield
62
+ end
63
+
64
+ def self.unlock
65
+ File.new(PidFile).flock(File::LOCK_UN)
66
+ end
67
+
68
+ def self.ci_already_running?
69
+ File.exists?(PidFile) && !File.new(PidFile).flock(File::LOCK_EX | File::LOCK_NB)
70
+ end
71
+
72
+ def self.lock_exclusively!
73
+ pid = Integer(File.read(PidFile)) if File.exists?(PidFile)
74
+ File.open('/tmp/crazy_ivan.pid', "w+") { |fp| fp << Process.pid }
75
+
76
+ if ci_already_running?
77
+ Process.kill("INT", pid)
78
+ Syslog.debug("Detected another running CI process #{pid}; interrupting it and starting myself")
79
+ File.new(PidFile).flock(File::LOCK_EX)
80
+ end
81
+ end
82
+ end
83
+
47
84
  ARGV.options do |opts|
48
85
  opts.banner = "Usage: #{File.basename($PROGRAM_NAME)} test_reports_path"
49
86
 
@@ -60,15 +97,18 @@ ARGV.options do |opts|
60
97
 
61
98
  begin
62
99
  opts.parse!
63
-
100
+
64
101
  case ARGV[0]
65
102
  when /setup/
66
103
  CrazyIvan::setup
67
104
  when /\w+/ # a directory for test results
68
- CrazyIvan::generate_test_reports_in(ARGV[0])
105
+ CrazyIvan::ProcessManager.acquire_lock do
106
+ CrazyIvan::generate_test_reports_in(ARGV[0])
107
+ end
69
108
  else
70
109
  show_howto
71
110
  exit
72
111
  end
73
112
  end
74
113
  end
114
+
@@ -20,11 +20,11 @@ pre { margin: 0;}
20
20
  .tests .test { font-size: 80%; margin-right: 8px;}
21
21
  .tests .latest { font-size: 100%;}
22
22
 
23
- .results .result { margin: 12px 18px 8px 18px;}
24
23
  .results .result .timestamp { margin-right: 12px;}
25
24
  .results .result .version { margin: 6px 0 6px 12px }
26
- .results .result .update { margin: 6px 0 6px 12px }
27
- .results .result .test { margin: 6px 0 6px 12px }
25
+ .results .result .output { padding: 5px; color: silver; background:black; margin: 12px 18px 8px 18px;}
26
+ .results .result .output .update { margin: 6px 0 6px 12px }
27
+ .results .result .output .test { margin: 6px 0 6px 12px }
28
28
 
29
29
  .footer {
30
30
  margin: 24px 0 0 0;
@@ -110,30 +110,32 @@
110
110
  <span class='version'>{version.output}</span> \
111
111
  </div> \
112
112
  \
113
- {.section version} \
114
- {.section exit_status} \
115
- <div class='version'> \
116
- <pre class='error'>{error}</pre> \
117
- </div> \
118
- {.end} \
119
- {.end} \
120
- \
121
- <div class='update'> \
122
- <pre>{update.output}</pre> \
123
- {.section update} \
113
+ <div class='output'> \
114
+ {.section version} \
124
115
  {.section exit_status} \
125
- <pre class='error'>{update.error}</pre> \
116
+ <div class='version'> \
117
+ <pre class='error'>{error}</pre> \
118
+ </div> \
126
119
  {.end} \
127
120
  {.end} \
128
- </div> \
129
121
  \
130
- <div class='test'> \
131
- <pre>{test.output}</pre> \
132
- {.section test} \
133
- {.section exit_status} \
134
- <pre class='error'>{test.error}</pre> \
122
+ <div class='update'> \
123
+ <pre>{update.output}</pre> \
124
+ {.section update} \
125
+ {.section exit_status} \
126
+ <pre class='error'>{update.error}</pre> \
127
+ {.end} \
135
128
  {.end} \
136
- {.end} \
129
+ </div> \
130
+ \
131
+ <div class='test'> \
132
+ <pre>{test.output}</pre> \
133
+ {.section test} \
134
+ {.section exit_status} \
135
+ <pre class='error'>{test.error}</pre> \
136
+ {.end} \
137
+ {.end} \
138
+ </div> \
137
139
  </div> \
138
140
  </div> \
139
141
  {.end} \
@@ -1,5 +1,3 @@
1
- require 'open3'
2
-
3
1
  class TestRunner
4
2
  def initialize(project_path)
5
3
  @project_path = project_path
@@ -1,3 +1,3 @@
1
1
  module CrazyIvan
2
- VERSION = '1.1.0'
2
+ VERSION = '1.1.1'
3
3
  end
data/lib/crazy_ivan.rb CHANGED
@@ -113,7 +113,7 @@ module CrazyIvan
113
113
  end
114
114
 
115
115
  def self.generate_test_reports_in(output_directory)
116
- Syslog.open('crazy_ivan', Syslog::LOG_PID | Syslog::LOG_CONS)
116
+ Syslog.open('crazy_ivan', Syslog::LOG_PID | Syslog::LOG_CONS) unless Syslog.opened?
117
117
  FileUtils.mkdir_p(output_directory)
118
118
 
119
119
  report = ReportAssembler.new(Dir.pwd, output_directory)
@@ -126,4 +126,8 @@ module CrazyIvan
126
126
  ensure
127
127
  Syslog.close
128
128
  end
129
+
130
+ def self.interrupt_test
131
+ # TODO add a message to the running report generator about the test being interrupted and clear the building json
132
+ end
129
133
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: crazy_ivan
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Edward Ocampo-Gooding
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-01-11 00:00:00 -05:00
12
+ date: 2010-01-12 00:00:00 -05:00
13
13
  default_executable: crazy_ivan
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -50,8 +50,8 @@ extensions: []
50
50
  extra_rdoc_files: []
51
51
 
52
52
  files:
53
- - .gitignore
54
- - crazy_ivan.gemspec
53
+ - bin/crazy_ivan
54
+ - bin/test_report2campfire
55
55
  - lib/crazy_ivan/html_asset_crush.rb
56
56
  - lib/crazy_ivan/report_assembler.rb
57
57
  - lib/crazy_ivan/templates/css/ci.css
@@ -208,14 +208,8 @@ files:
208
208
  - lib/crazy_ivan/vendor/tmpdir.rb
209
209
  - lib/crazy_ivan/version.rb
210
210
  - lib/crazy_ivan.rb
211
- - bin/crazy_ivan
212
- - bin/test_report2campfire
213
211
  - LICENSE
214
- - Rakefile
215
212
  - README.rdoc
216
- - TODO
217
- - test/crazy_ivan_test.rb
218
- - test/test_helper.rb
219
213
  has_rdoc: false
220
214
  homepage: http://github.com/edward/crazy_ivan
221
215
  licenses: []
data/.gitignore DELETED
@@ -1,7 +0,0 @@
1
- *.sw?
2
- .DS_Store
3
- coverage
4
- rdoc
5
- pkg
6
- *.gem
7
- www
data/Rakefile DELETED
@@ -1,76 +0,0 @@
1
- require 'rake'
2
- require 'rake/clean'
3
- require 'rake/gempackagetask'
4
- require 'rake/testtask'
5
- require 'fileutils'
6
-
7
- $LOAD_PATH << 'lib'
8
- require 'crazy_ivan'
9
-
10
- include FileUtils
11
-
12
- version = CrazyIvan::VERSION
13
- name = "crazy_ivan"
14
-
15
- spec = Gem::Specification.new do |s|
16
- s.name = name
17
- s.version = version
18
- s.summary = 'Crazy Ivan (CI) is simplest possible continuous integration tool.'
19
- s.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.
20
-
21
- By keeping test reports in json, per-project CI configuration in 3 probably-one-line scripts, things are kept simple, quick, and super extensible.
22
-
23
- Want to use git, svn, or hg? No problem.
24
- Need to fire off results to Campfire? It's built-in.
25
-
26
- CI depends on cron."
27
- s.authors = "Edward Ocampo-Gooding"
28
-
29
- s.email = 'edward@edwardog.net'
30
- s.homepage = "http://github.com/edward/crazy_ivan"
31
- s.executables = ["crazy_ivan", "test_report2campfire"]
32
- s.default_executable = "crazy_ivan"
33
- s.rubyforge_project = "crazy_ivan"
34
-
35
- s.platform = Gem::Platform::RUBY
36
- s.has_rdoc = false
37
-
38
- # s.files = Dir.glob("{bin,lib}/**/*")
39
- s.files = FileList['.gitignore', '*.gemspec', 'lib/**/*', 'bin/*', 'templates/**/*', '[A-Z]*', 'test/**/*'].to_a
40
-
41
- s.require_path = "lib"
42
- s.bindir = "bin"
43
-
44
- s.add_development_dependency('gemcutter', '>= 0.2.1')
45
- s.add_development_dependency('mocha')
46
-
47
- readme = File.read('README.rdoc')
48
- s.post_install_message = '\n' + readme[0...readme.index('== How this works')]
49
- end
50
-
51
- Rake::GemPackageTask.new(spec) do |p|
52
- p.need_tar = true if RUBY_PLATFORM !~ /mswin/
53
- end
54
-
55
- desc "Install #{name} gem (#{version})"
56
- task :install => [ :test, :package ] do
57
- sh %{gem install pkg/#{name}-#{version}.gem --no-rdoc --no-ri}
58
- end
59
-
60
- desc "Uninstall #{name} gem"
61
- task :uninstall => [ :clean ] do
62
- sh %{gem uninstall #{name}}
63
- end
64
-
65
- desc "Release #{name} gem (#{version})"
66
- task :release => [ :test, :package ] do
67
- sh %{gem push pkg/#{name}-#{version}.gem}
68
- end
69
-
70
- task :default => :test
71
-
72
- Rake::TestTask.new(:test) do |test|
73
- test.libs << 'lib' << 'test'
74
- test.pattern = 'test/**/*_test.rb'
75
- test.verbose = true
76
- end
data/TODO DELETED
@@ -1,39 +0,0 @@
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
34
-
35
- * Write a man page with Ron: http://github.com/rtomayko/ron
36
-
37
- * Refactor and document Syslog to have method names that actually match the syslog levels (like #error instead of #err )
38
-
39
- * Don't overwrite existing config files and warn when skipping
data/crazy_ivan.gemspec DELETED
@@ -1,247 +0,0 @@
1
- # Generated by jeweler
2
- # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
- # -*- encoding: utf-8 -*-
5
-
6
- Gem::Specification.new do |s|
7
- s.name = %q{crazy_ivan}
8
- s.version = "1.0.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{2010-01-11}
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 Campfire? It's built-in.
20
-
21
- CI depends on cron.}
22
- s.email = %q{edward@edwardog.net}
23
- s.executables = ["crazy_ivan", "test_report2campfire"]
24
- s.extra_rdoc_files = [
25
- "LICENSE",
26
- "README.rdoc",
27
- "TODO"
28
- ]
29
- s.files = [
30
- ".gitignore",
31
- "LICENSE",
32
- "README.rdoc",
33
- "Rakefile",
34
- "TODO",
35
- "VERSION",
36
- "bin/crazy_ivan",
37
- "bin/test_report2campfire",
38
- "crazy_ivan.gemspec",
39
- "lib/crazy_ivan.rb",
40
- "lib/crazy_ivan/html_asset_crush.rb",
41
- "lib/crazy_ivan/report_assembler.rb",
42
- "lib/crazy_ivan/test_runner.rb",
43
- "lib/crazy_ivan/vendor/json-1.1.7/CHANGES",
44
- "lib/crazy_ivan/vendor/json-1.1.7/GPL",
45
- "lib/crazy_ivan/vendor/json-1.1.7/README",
46
- "lib/crazy_ivan/vendor/json-1.1.7/RUBY",
47
- "lib/crazy_ivan/vendor/json-1.1.7/Rakefile",
48
- "lib/crazy_ivan/vendor/json-1.1.7/TODO",
49
- "lib/crazy_ivan/vendor/json-1.1.7/VERSION",
50
- "lib/crazy_ivan/vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkComparison.log",
51
- "lib/crazy_ivan/vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_fast-autocorrelation.dat",
52
- "lib/crazy_ivan/vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_fast.dat",
53
- "lib/crazy_ivan/vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_pretty-autocorrelation.dat",
54
- "lib/crazy_ivan/vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_pretty.dat",
55
- "lib/crazy_ivan/vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_safe-autocorrelation.dat",
56
- "lib/crazy_ivan/vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt#generator_safe.dat",
57
- "lib/crazy_ivan/vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkExt.log",
58
- "lib/crazy_ivan/vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_fast-autocorrelation.dat",
59
- "lib/crazy_ivan/vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_fast.dat",
60
- "lib/crazy_ivan/vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_pretty-autocorrelation.dat",
61
- "lib/crazy_ivan/vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_pretty.dat",
62
- "lib/crazy_ivan/vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_safe-autocorrelation.dat",
63
- "lib/crazy_ivan/vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure#generator_safe.dat",
64
- "lib/crazy_ivan/vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkPure.log",
65
- "lib/crazy_ivan/vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkRails#generator-autocorrelation.dat",
66
- "lib/crazy_ivan/vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkRails#generator.dat",
67
- "lib/crazy_ivan/vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/GeneratorBenchmarkRails.log",
68
- "lib/crazy_ivan/vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkComparison.log",
69
- "lib/crazy_ivan/vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkExt#parser-autocorrelation.dat",
70
- "lib/crazy_ivan/vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkExt#parser.dat",
71
- "lib/crazy_ivan/vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkExt.log",
72
- "lib/crazy_ivan/vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkPure#parser-autocorrelation.dat",
73
- "lib/crazy_ivan/vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkPure#parser.dat",
74
- "lib/crazy_ivan/vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkPure.log",
75
- "lib/crazy_ivan/vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkRails#parser-autocorrelation.dat",
76
- "lib/crazy_ivan/vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkRails#parser.dat",
77
- "lib/crazy_ivan/vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkRails.log",
78
- "lib/crazy_ivan/vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkYAML#parser-autocorrelation.dat",
79
- "lib/crazy_ivan/vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkYAML#parser.dat",
80
- "lib/crazy_ivan/vendor/json-1.1.7/benchmarks/data-p4-3GHz-ruby18/ParserBenchmarkYAML.log",
81
- "lib/crazy_ivan/vendor/json-1.1.7/benchmarks/generator_benchmark.rb",
82
- "lib/crazy_ivan/vendor/json-1.1.7/benchmarks/parser_benchmark.rb",
83
- "lib/crazy_ivan/vendor/json-1.1.7/bin/edit_json.rb",
84
- "lib/crazy_ivan/vendor/json-1.1.7/bin/prettify_json.rb",
85
- "lib/crazy_ivan/vendor/json-1.1.7/data/example.json",
86
- "lib/crazy_ivan/vendor/json-1.1.7/data/index.html",
87
- "lib/crazy_ivan/vendor/json-1.1.7/data/prototype.js",
88
- "lib/crazy_ivan/vendor/json-1.1.7/doc-templates/main.txt",
89
- "lib/crazy_ivan/vendor/json-1.1.7/ext/json/ext/generator/extconf.rb",
90
- "lib/crazy_ivan/vendor/json-1.1.7/ext/json/ext/generator/generator.c",
91
- "lib/crazy_ivan/vendor/json-1.1.7/ext/json/ext/generator/unicode.c",
92
- "lib/crazy_ivan/vendor/json-1.1.7/ext/json/ext/generator/unicode.h",
93
- "lib/crazy_ivan/vendor/json-1.1.7/ext/json/ext/parser/extconf.rb",
94
- "lib/crazy_ivan/vendor/json-1.1.7/ext/json/ext/parser/parser.c",
95
- "lib/crazy_ivan/vendor/json-1.1.7/ext/json/ext/parser/parser.rl",
96
- "lib/crazy_ivan/vendor/json-1.1.7/ext/json/ext/parser/unicode.c",
97
- "lib/crazy_ivan/vendor/json-1.1.7/ext/json/ext/parser/unicode.h",
98
- "lib/crazy_ivan/vendor/json-1.1.7/install.rb",
99
- "lib/crazy_ivan/vendor/json-1.1.7/lib/json.rb",
100
- "lib/crazy_ivan/vendor/json-1.1.7/lib/json/Array.xpm",
101
- "lib/crazy_ivan/vendor/json-1.1.7/lib/json/FalseClass.xpm",
102
- "lib/crazy_ivan/vendor/json-1.1.7/lib/json/Hash.xpm",
103
- "lib/crazy_ivan/vendor/json-1.1.7/lib/json/Key.xpm",
104
- "lib/crazy_ivan/vendor/json-1.1.7/lib/json/NilClass.xpm",
105
- "lib/crazy_ivan/vendor/json-1.1.7/lib/json/Numeric.xpm",
106
- "lib/crazy_ivan/vendor/json-1.1.7/lib/json/String.xpm",
107
- "lib/crazy_ivan/vendor/json-1.1.7/lib/json/TrueClass.xpm",
108
- "lib/crazy_ivan/vendor/json-1.1.7/lib/json/add/core.rb",
109
- "lib/crazy_ivan/vendor/json-1.1.7/lib/json/add/rails.rb",
110
- "lib/crazy_ivan/vendor/json-1.1.7/lib/json/common.rb",
111
- "lib/crazy_ivan/vendor/json-1.1.7/lib/json/editor.rb",
112
- "lib/crazy_ivan/vendor/json-1.1.7/lib/json/ext.rb",
113
- "lib/crazy_ivan/vendor/json-1.1.7/lib/json/json.xpm",
114
- "lib/crazy_ivan/vendor/json-1.1.7/lib/json/pure.rb",
115
- "lib/crazy_ivan/vendor/json-1.1.7/lib/json/pure/generator.rb",
116
- "lib/crazy_ivan/vendor/json-1.1.7/lib/json/pure/parser.rb",
117
- "lib/crazy_ivan/vendor/json-1.1.7/lib/json/version.rb",
118
- "lib/crazy_ivan/vendor/json-1.1.7/tests/fixtures/fail1.json",
119
- "lib/crazy_ivan/vendor/json-1.1.7/tests/fixtures/fail10.json",
120
- "lib/crazy_ivan/vendor/json-1.1.7/tests/fixtures/fail11.json",
121
- "lib/crazy_ivan/vendor/json-1.1.7/tests/fixtures/fail12.json",
122
- "lib/crazy_ivan/vendor/json-1.1.7/tests/fixtures/fail13.json",
123
- "lib/crazy_ivan/vendor/json-1.1.7/tests/fixtures/fail14.json",
124
- "lib/crazy_ivan/vendor/json-1.1.7/tests/fixtures/fail18.json",
125
- "lib/crazy_ivan/vendor/json-1.1.7/tests/fixtures/fail19.json",
126
- "lib/crazy_ivan/vendor/json-1.1.7/tests/fixtures/fail2.json",
127
- "lib/crazy_ivan/vendor/json-1.1.7/tests/fixtures/fail20.json",
128
- "lib/crazy_ivan/vendor/json-1.1.7/tests/fixtures/fail21.json",
129
- "lib/crazy_ivan/vendor/json-1.1.7/tests/fixtures/fail22.json",
130
- "lib/crazy_ivan/vendor/json-1.1.7/tests/fixtures/fail23.json",
131
- "lib/crazy_ivan/vendor/json-1.1.7/tests/fixtures/fail24.json",
132
- "lib/crazy_ivan/vendor/json-1.1.7/tests/fixtures/fail25.json",
133
- "lib/crazy_ivan/vendor/json-1.1.7/tests/fixtures/fail27.json",
134
- "lib/crazy_ivan/vendor/json-1.1.7/tests/fixtures/fail28.json",
135
- "lib/crazy_ivan/vendor/json-1.1.7/tests/fixtures/fail3.json",
136
- "lib/crazy_ivan/vendor/json-1.1.7/tests/fixtures/fail4.json",
137
- "lib/crazy_ivan/vendor/json-1.1.7/tests/fixtures/fail5.json",
138
- "lib/crazy_ivan/vendor/json-1.1.7/tests/fixtures/fail6.json",
139
- "lib/crazy_ivan/vendor/json-1.1.7/tests/fixtures/fail7.json",
140
- "lib/crazy_ivan/vendor/json-1.1.7/tests/fixtures/fail8.json",
141
- "lib/crazy_ivan/vendor/json-1.1.7/tests/fixtures/fail9.json",
142
- "lib/crazy_ivan/vendor/json-1.1.7/tests/fixtures/pass1.json",
143
- "lib/crazy_ivan/vendor/json-1.1.7/tests/fixtures/pass15.json",
144
- "lib/crazy_ivan/vendor/json-1.1.7/tests/fixtures/pass16.json",
145
- "lib/crazy_ivan/vendor/json-1.1.7/tests/fixtures/pass17.json",
146
- "lib/crazy_ivan/vendor/json-1.1.7/tests/fixtures/pass2.json",
147
- "lib/crazy_ivan/vendor/json-1.1.7/tests/fixtures/pass26.json",
148
- "lib/crazy_ivan/vendor/json-1.1.7/tests/fixtures/pass3.json",
149
- "lib/crazy_ivan/vendor/json-1.1.7/tests/test_json.rb",
150
- "lib/crazy_ivan/vendor/json-1.1.7/tests/test_json_addition.rb",
151
- "lib/crazy_ivan/vendor/json-1.1.7/tests/test_json_fixtures.rb",
152
- "lib/crazy_ivan/vendor/json-1.1.7/tests/test_json_generate.rb",
153
- "lib/crazy_ivan/vendor/json-1.1.7/tests/test_json_rails.rb",
154
- "lib/crazy_ivan/vendor/json-1.1.7/tests/test_json_unicode.rb",
155
- "lib/crazy_ivan/vendor/json-1.1.7/tools/fuzz.rb",
156
- "lib/crazy_ivan/vendor/json-1.1.7/tools/server.rb",
157
- "lib/crazy_ivan/vendor/json.rb",
158
- "lib/crazy_ivan/vendor/open4-1.0.1/README",
159
- "lib/crazy_ivan/vendor/open4-1.0.1/README.erb",
160
- "lib/crazy_ivan/vendor/open4-1.0.1/Rakefile",
161
- "lib/crazy_ivan/vendor/open4-1.0.1/lib/open4.rb",
162
- "lib/crazy_ivan/vendor/open4-1.0.1/open4.gemspec",
163
- "lib/crazy_ivan/vendor/open4-1.0.1/samples/bg.rb",
164
- "lib/crazy_ivan/vendor/open4-1.0.1/samples/block.rb",
165
- "lib/crazy_ivan/vendor/open4-1.0.1/samples/exception.rb",
166
- "lib/crazy_ivan/vendor/open4-1.0.1/samples/simple.rb",
167
- "lib/crazy_ivan/vendor/open4-1.0.1/samples/spawn.rb",
168
- "lib/crazy_ivan/vendor/open4-1.0.1/samples/stdin_timeout.rb",
169
- "lib/crazy_ivan/vendor/open4-1.0.1/samples/timeout.rb",
170
- "lib/crazy_ivan/vendor/open4-1.0.1/white_box/leak.rb",
171
- "lib/crazy_ivan/vendor/open4.rb",
172
- "lib/crazy_ivan/version.rb",
173
- "templates/css/ci.css",
174
- "templates/index.html",
175
- "templates/javascript/builder.js",
176
- "templates/javascript/controls.js",
177
- "templates/javascript/date.js",
178
- "templates/javascript/dragdrop.js",
179
- "templates/javascript/effects.js",
180
- "templates/javascript/json-template.js",
181
- "templates/javascript/prototype.js",
182
- "templates/javascript/scriptaculous.js",
183
- "templates/javascript/slider.js",
184
- "test/crazy_ivan_test.rb",
185
- "test/test_helper.rb"
186
- ]
187
- s.homepage = %q{http://github.com/edward/crazy_ivan}
188
- s.post_install_message = %q{= Crazy Ivan
189
-
190
- Crazy Ivan (CI) is simplest possible continuous integration tool.
191
-
192
- == Usage
193
-
194
- Create a directory where your projects will live
195
- $ mkdir /var/continuous-integration
196
-
197
- Place some project(s) in that directory
198
- $ cd /var/continuous-integration
199
- $ git clone git://github.com/edward/active_merchant.git
200
-
201
- Set up continuous integration for each project
202
- $ crazy_ivan setup # creates example ci scripts in
203
- # each project (see How this works)
204
-
205
-
206
-
207
- $ crazy_ivan setup # creates the ci directory, and
208
- # creates a configuration file,
209
- # sets a cron job to run crazy_ivan
210
-
211
- Manually run it once to check everything is ok
212
- $ cd /var/continuous-integration
213
- $ crazy_ivan /var/www/ci # the test reports path should be
214
- # accessible via your web server
215
-
216
- $ open /var/www/ci/index.html # or check it through your browser
217
-
218
- Set a cron job to run it every 15 minutes
219
- $ echo "0,15,30,45 * * * * cd /var/continuous-integration; crazy_ivan /var/www/ci" > ci.cron
220
- $ crontab ci.cron
221
-
222
- Note that you don’t want this running too frequently; having overlapping
223
- runs is possible and would be bad.
224
-
225
- (Functionality to have this run as a web-hook is planned.)
226
-
227
- }
228
- s.rdoc_options = ["--charset=UTF-8"]
229
- s.require_paths = ["lib"]
230
- s.rubygems_version = %q{1.3.5}
231
- s.summary = %q{Crazy Ivan (CI) is simplest possible continuous integration tool.}
232
- s.test_files = [
233
- "test/crazy_ivan_test.rb",
234
- "test/test_helper.rb"
235
- ]
236
-
237
- if s.respond_to? :specification_version then
238
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
239
- s.specification_version = 3
240
-
241
- if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
242
- else
243
- end
244
- else
245
- end
246
- end
247
-
@@ -1,159 +0,0 @@
1
- require 'test_helper'
2
- require 'tmpdir'
3
-
4
- class CrazyIvanTest < Test::Unit::TestCase
5
- def setup
6
- @results = {:project_name => 'some-project',
7
- :version => {:output => 'a-valid-version', :error => '', :exit_status => '0'},
8
- :update => {:output => 'Updated successfully', :error => '', :exit_status => '0'},
9
- :test => {:output => 'Some valid test results. No fails.', :error => '', :exit_status => '0'},
10
- :timestamp => {:start => Time.now, :finish => nil}}
11
- end
12
-
13
- def test_setup
14
- setup_crazy_ivan do
15
- assert File.exists?('projects/some-project/.ci/update')
16
- assert File.exists?('projects/some-project/.ci/version')
17
- assert File.exists?('projects/some-project/.ci/test')
18
- end
19
- end
20
-
21
- def test_runner
22
- setup_external_scripts_to_all_be_successful
23
-
24
- setup_crazy_ivan do
25
- run_crazy_ivan
26
-
27
- assert File.exists?('test-results/index.html')
28
- assert File.exists?('test-results/projects.json')
29
- assert File.exists?('test-results/some-project/recent.json')
30
- assert File.exists?('test-results/some-project/currently_building.json')
31
-
32
- projects = JSON.parse(File.open('test-results/projects.json').read)["projects"]
33
- recent_versions = JSON.parse(File.open('test-results/some-project/recent.json').read)["recent_versions"]
34
-
35
- assert_equal 2, projects.size
36
- assert projects.include?('some-project')
37
- assert_equal 'a-valid-version', recent_versions.first
38
- end
39
- end
40
-
41
- # FIX Does this test really work? Doesn't look like it
42
- def test_external_scripts_not_overwritten
43
- setup_external_scripts_to_all_be_successful
44
-
45
- setup_crazy_ivan do
46
- File.open('projects/some-project/.ci/version', 'a') do |file|
47
- file << "a change to the script"
48
- end
49
-
50
- FileUtils.copy('projects/some-project/.ci/version', 'projects/some-project/.ci/version_original')
51
-
52
- do_silently { CrazyIvan.setup }
53
- assert FileUtils.compare_file('projects/some-project/.ci/version_original', 'projects/some-project/.ci/version')
54
- end
55
- end
56
-
57
- def test_nil_reports_not_created
58
- Open4.stubs(:popen4).with('.ci/update').yields(stub(),
59
- stub(:close),
60
- stub(:read => @results[:update][:output]),
61
- stub(:read => @results[:update][:error])).returns(stub(:exitstatus => '0'))
62
- Open4.stubs(:popen4).with('.ci/version').yields(stub(),
63
- stub(:close),
64
- stub(:read => ''),
65
- stub(:read => 'could not find the command you were looking for')).returns(stub(:exitstatus => '1'))
66
- Open4.stubs(:popen4).with('.ci/conclusion').yields(stub(),
67
- stub(:puts => true, :close => true),
68
- stub(),
69
- stub(:read => '')).returns(stub(:exitstatus => '0'))
70
-
71
- setup_crazy_ivan do
72
- Dir.chdir('projects') do
73
- do_silently { CrazyIvan.generate_test_reports_in('../test-results') }
74
- end
75
-
76
- assert !File.exists?('test-results/some-project/nil.json')
77
- end
78
- end
79
-
80
- def test_conclusion_executed
81
- Open4.stubs(:popen4).with('.ci/update').yields(stub(),
82
- stub(:close),
83
- stub(:read => @results[:update][:output]),
84
- stub(:read => @results[:update][:error])).returns(stub(:exitstatus => '0'))
85
- Open4.stubs(:popen4).with('.ci/version').yields(stub(),
86
- stub(:close),
87
- stub(:read => @results[:version][:output]),
88
- stub(:read => @results[:version][:error])).returns(stub(:exitstatus => '0'))
89
- Open4.stubs(:popen4).with('.ci/test').yields(stub(),
90
- stub(:close),
91
- stub(:read => @results[:test][:output]),
92
- stub(:read => @results[:test][:error])).returns(stub(:exitstatus => '0'))
93
-
94
- @results[:timestamp][:start] = Time.now
95
- @results[:timestamp][:finish] = @results[:timestamp][:start]
96
- Time.stubs(:now => @results[:timestamp][:start])
97
-
98
- fake_stdin = mock()
99
-
100
- fake_stdin.expects(:puts).with(@results.to_json).at_least_once
101
- fake_stdin.expects(:close)
102
-
103
- Open4.stubs(:popen4).with('.ci/conclusion').yields(stub(), fake_stdin, stub(), stub(:read => '')).returns(stub(:exitstatus => '0'))
104
-
105
- setup_crazy_ivan(false) do
106
- run_crazy_ivan
107
- end
108
- end
109
-
110
- # def test_report_in_progress_json_created
111
- # setup_crazy_ivan do
112
- # run_crazy_ivan
113
- # end
114
- # end
115
-
116
- private
117
-
118
- def setup_crazy_ivan(with_multiple_projects = true)
119
- Dir.mktmpdir('continuous-integration') do |tmpdir|
120
- Dir.chdir(tmpdir)
121
-
122
- Dir.mkdir('projects')
123
- Dir.chdir('projects') do |projects_dir|
124
- Dir.mkdir('some-project')
125
- Dir.mkdir('some-other-project') if with_multiple_projects
126
- do_silently { CrazyIvan.setup }
127
- end
128
-
129
- yield
130
- end
131
- end
132
-
133
- def run_crazy_ivan
134
- # crazy_ivan runs from the projects directory
135
- Dir.chdir('projects') do
136
- do_silently { CrazyIvan.generate_test_reports_in('../test-results') }
137
- end
138
- end
139
-
140
- def setup_external_scripts_to_all_be_successful
141
- Open4.stubs(:popen4).with('.ci/update').yields(stub(),
142
- stub(:close),
143
- stub(:read => @results[:update][:output]),
144
- stub(:read => @results[:update][:error])).returns(stub(:exitstatus => '0'))
145
- Open4.stubs(:popen4).with('.ci/version').yields(stub(),
146
- stub(:close),
147
- stub(:read => @results[:version][:output]),
148
- stub(:read => @results[:version][:error])).returns(stub(:exitstatus => '0'))
149
- Open4.stubs(:popen4).with('.ci/test').yields(stub(),
150
- stub(:close),
151
- stub(:read => @results[:test][:output]),
152
- stub(:read => @results[:test][:error])).returns(stub(:exitstatus => '0'))
153
-
154
- Open4.stubs(:popen4).with('.ci/conclusion').yields(stub(),
155
- stub(:puts => true, :close => true),
156
- stub(),
157
- stub(:read => '')).returns(stub(:exitstatus => '0'))
158
- end
159
- end
data/test/test_helper.rb DELETED
@@ -1,16 +0,0 @@
1
- require 'rubygems'
2
- require 'test/unit'
3
- require 'mocha'
4
-
5
- $LOAD_PATH.unshift(File.dirname(__FILE__))
6
- $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
7
- require 'crazy_ivan'
8
-
9
- class Test::Unit::TestCase
10
- def do_silently
11
- orig_stdout = $stdout
12
- $stdout = File.new('/dev/null', 'w')
13
- yield
14
- $stdout = orig_stdout
15
- end
16
- end