ciquantum 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,19 @@
1
+ class CIQuantum
2
+ class UnfuddleAdapter
3
+
4
+ def self.commit_url commit
5
+ "http://#{commit.user}.unfuddle.com/a#/repositories/#{commit.project}/commit?commit=#{commit.sha}"
6
+ end
7
+
8
+ def self.git_user_and_project
9
+ ["linkfeed", "17607"]
10
+ end
11
+
12
+ def self.project_url
13
+ user, project = git_user_and_project
14
+ "https://#{user}.unfuddle.com/a#/repositories/#{project}/browse"
15
+ end
16
+
17
+
18
+ end
19
+ end
@@ -0,0 +1,3 @@
1
+ class CIQuantum
2
+ Version = VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,16 @@
1
+ { "jobs": [
2
+ <% if quantum.last_build %>
3
+ {"name":"<%= quantum.projectname || quantum.project %>",
4
+ "url":"<%= quantum.url %>",
5
+ "color":"<%= quantum.last_build.status.to_s == "failed" ? 'red' : 'blue' %>",
6
+ "status":"<%= quantum.last_build.status %>",
7
+ "started_at":"<%= pretty_time(quantum.last_build.started_at) %>",
8
+ "finished_at":"<%= pretty_time(quantum.last_build.finished_at) %>",
9
+ "duration":"<%= quantum.last_build.duration if quantum.last_build.duration %>",
10
+ "sha":"<%= quantum.last_build.sha %>",
11
+ "short_sha":"<%= quantum.last_build.short_sha %>",
12
+ "commit_url":"<%= quantum.last_build.commit.url if quantum.last_build.commit %>",
13
+ "branch":"<%= quantum.last_build.branch %>"
14
+ }
15
+ <% end %>
16
+ ]}
@@ -0,0 +1,89 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <link href="<%= ciquantum_root %>/screen.css" media="screen" rel="stylesheet" type="text/css" />
5
+ <link rel="shortcut icon" href="<%= ciquantum_root %>/favicon.ico" type="image/x-icon" />
6
+ <title><%= h(quantum.projectname) %>: CI Quantum</title>
7
+ </head>
8
+ <body>
9
+ <div class="site">
10
+ <div class="title">
11
+ <a href="<%= ciquantum_root %>/">CI Quantum</a>
12
+ <span class="extra">because knowing is half the battle</span>
13
+ </div>
14
+
15
+ <div id="home">
16
+ <h1><a href="<%= quantum.url %>"><%= quantum.projectname %></a></h1>
17
+ <ul class="posts">
18
+ <% if quantum.current_build %>
19
+ <li>
20
+ <span class="date"><%= pretty_time(quantum.current_build.started_at) if quantum.current_build %></span> &raquo;
21
+ <% if quantum.current_build.sha %>
22
+ Building <%= quantum.current_build.branch %> at <a href="<%= quantum.current_build.commit.url %>"><%= quantum.current_build.short_sha %></a> <small>(pid: <%= quantum.pid %>)</small>
23
+ <% else %>
24
+ Build starting...
25
+ <% end %>
26
+ </li>
27
+ <% else %>
28
+ <li>
29
+ <form method="POST">
30
+ <input type="hidden", name="rebuild" value="true">
31
+ <select name="branch">
32
+ <% for @branch in quantum.git_branches %>
33
+ <option value="<%= @branch %>" <%= "selected=\"selected\"" if (@branch == quantum.git_branch) %> >"<%= @branch %>"</option>
34
+ <% end %>
35
+ </select>
36
+ <input type="submit" value="Build"/>
37
+ </form>
38
+ </li>
39
+ <% end %>
40
+
41
+ <% if quantum.last_build %>
42
+ <li>
43
+ <span class="date"><%= pretty_time(quantum.last_build.finished_at) %></span> &raquo;
44
+ <% if quantum.last_build.sha %>
45
+ Built <%= quantum.last_build.branch %> at <a href="<%= quantum.last_build.commit.url %>"><%= quantum.last_build.short_sha %></a>
46
+ <% end %>
47
+ <span class="<%= quantum.last_build.status %>">(<%= quantum.last_build.status %>)</span>
48
+
49
+ <% if quantum.last_build.duration %>
50
+ in <span class="duration"><%= quantum.last_build.duration %></span> seconds.
51
+ <% end %>
52
+
53
+ <% if !quantum.coverage_path.empty? || true %>
54
+ <span class="coverage"><a href="coverage">Code coverage</a>
55
+ <% end %>
56
+ </li>
57
+ <% if quantum.last_build.failed? %>
58
+ <li><pre class="terminal"><code><%=ansi_color_codes h(quantum.last_build.output) %></code></pre></li>
59
+ <% end %>
60
+ <% end %>
61
+ </ul>
62
+ </div>
63
+
64
+ <div class="footer">
65
+ <div class="contact">
66
+ <p>
67
+ <a href="https://github.com/meredian/ciquantum#readme">Documentation</a><br/>
68
+ <a href="https://github.com/meredian/ciquantum">Source</a><br/>
69
+ <a href="https://github.com/meredian/ciquantum/issues">Issues</a><br/>
70
+ <a href="https://github.com/meredian/ciquantum/tree/v<%= CIQuantum::VERSION %>">v<%= CIQuantum::VERSION %></a>
71
+ </p>
72
+ </div>
73
+ <div class="contact">
74
+ <p>
75
+ Designed by <a href="http://tom.preston-werner.com/">Tom Preston-Werner</a><br/>
76
+ Influenced by <a href="http://integrityapp.com/">Integrity</a><br/>
77
+ Built with <a href="http://sinatrarb.com/">Sinatra</a><br/>
78
+ Keep it simple, Sam.
79
+ </p>
80
+ </div>
81
+ <div class="rss">
82
+ <a href="http://github.com/meredian/ciquantum">
83
+ <img src="<%= ciquantum_root %>/octocat.png" alt="Octocat!" />
84
+ </a>
85
+ </div>
86
+ </div>
87
+ </div>
88
+ </body>
89
+ </html>
@@ -0,0 +1,52 @@
1
+ {
2
+ "after": "416cb2f7105e7f989bc223d1a975b93a6491b276",
3
+ "before": "0ae4da1eea2d191b33ebfbd5db48e3c1f91953ad",
4
+ "commits": [
5
+ {
6
+ "added": [
7
+
8
+ ],
9
+ "author": {
10
+ "email": "joshua.owens@gmail.com",
11
+ "name": "Josh Owens",
12
+ "username": "queso"
13
+ },
14
+ "id": "09293a1703b3bdb36aba70d38abd5e44396c50a5",
15
+ "message": "Update README",
16
+ "modified": [
17
+ "README.textile"
18
+ ],
19
+ "removed": [
20
+
21
+ ],
22
+ "timestamp": "2011-02-07T15:27:35-08:00",
23
+ "url": "https:\/\/github.com\/fourbeansoup\/broth\/commit\/09293a1703b3bdb36aba70d38abd5e44396c50a5"
24
+ }
25
+ ],
26
+ "compare": "https:\/\/github.com\/fourbeansoup\/broth\/compare\/0ae4da1...416cb2f",
27
+ "forced": false,
28
+ "ref": "refs\/heads\/master",
29
+ "repository": {
30
+ "created_at": "2009\/12\/05 10:44:57 -0800",
31
+ "description": "FourBeanSoup's Broth Application, a tasty starting point for every app",
32
+ "fork": true,
33
+ "forks": 4,
34
+ "has_downloads": true,
35
+ "has_issues": true,
36
+ "has_wiki": true,
37
+ "homepage": "",
38
+ "language": "JavaScript",
39
+ "name": "broth",
40
+ "open_issues": 2,
41
+ "organization": "fourbeansoup",
42
+ "owner": {
43
+ "email": "josh+scm@fourbeansoup.com",
44
+ "name": "fourbeansoup"
45
+ },
46
+ "private": false,
47
+ "pushed_at": "2011\/02\/07 17:17:00 -0800",
48
+ "size": 604,
49
+ "url": "https:\/\/github.com\/fourbeansoup\/broth",
50
+ "watchers": 10
51
+ }
52
+ }
data/test/helper.rb ADDED
@@ -0,0 +1,48 @@
1
+ require 'rubygems'
2
+ require 'test/unit'
3
+ require 'mocha'
4
+
5
+ ENV['RACK_ENV'] = 'test'
6
+
7
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
8
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
9
+
10
+ require 'ciquantum'
11
+
12
+ CIQuantum::Server.set :project_path, "."
13
+ CIQuantum::Server.set :environment, "test"
14
+
15
+ TMP_DIR = '/tmp/ciquantum_test'
16
+
17
+ def tmp_dir
18
+ TMP_DIR
19
+ end
20
+
21
+ def setup_git_info(options = {})
22
+ @tmp_dirs ||= []
23
+ @tmp_dirs += [options[:tmp_dir]]
24
+ create_tmpdir!(options[:tmp_dir])
25
+ dir = options[:tmp_dir] || tmp_dir
26
+ `cd #{dir} && git init`
27
+ options[:config].each do |key, value|
28
+ `cd #{dir} && git config --add #{key} "#{value}"`
29
+ end
30
+ end
31
+
32
+ def teardown_git_info
33
+ remove_tmpdir!
34
+ @tmp_dirs.each do |dir|
35
+ remove_tmpdir!(dir)
36
+ end
37
+ end
38
+
39
+ def remove_tmpdir!(passed_dir = nil)
40
+ FileUtils.rm_rf(passed_dir || tmp_dir)
41
+ end
42
+
43
+ def create_tmpdir!(passed_dir = nil)
44
+ FileUtils.mkdir_p(passed_dir || tmp_dir)
45
+ end
46
+
47
+ class Test::Unit::TestCase
48
+ end
@@ -0,0 +1,28 @@
1
+ require 'helper'
2
+
3
+ class TestCIQuantumQueue < Test::Unit::TestCase
4
+ def test_a_disabled_queue
5
+ subject = CIQuantum::Queue.new(false)
6
+ subject.append_unless_already_exists("test")
7
+ assert_equal false, subject.waiting?
8
+ end
9
+
10
+ def test_adding_two_items_to_a_queue
11
+ subject = CIQuantum::Queue.new(true)
12
+ subject.append_unless_already_exists("test")
13
+ subject.append_unless_already_exists(nil)
14
+ assert_equal true, subject.waiting?
15
+ assert_equal "test", subject.next_branch_to_build
16
+ assert_equal nil, subject.next_branch_to_build
17
+ assert_equal false, subject.waiting?
18
+ end
19
+
20
+ def test_adding_two_duplicate_items_to_a_queue
21
+ subject = CIQuantum::Queue.new(true)
22
+ subject.append_unless_already_exists("test")
23
+ subject.append_unless_already_exists("test")
24
+ assert_equal true, subject.waiting?
25
+ assert_equal "test", subject.next_branch_to_build
26
+ assert_equal false, subject.waiting?
27
+ end
28
+ end
@@ -0,0 +1,81 @@
1
+ require 'helper'
2
+
3
+ # mock files to true
4
+ class File
5
+ class << self
6
+ alias orig_exists? exists?
7
+ alias orig_executable? executable?
8
+
9
+ def exists?(f)
10
+ return true if $hook_override
11
+ orig_exists? f
12
+ end
13
+ def executable?(f)
14
+ return true if $hook_override
15
+ orig_executable? f
16
+ end
17
+ end
18
+ end
19
+
20
+ # #mock file to be the file I want
21
+ class CIQuantum
22
+ attr_writer :last_build
23
+ alias orig_path_in_project path_in_project
24
+ alias orig_git_user_and_project git_user_and_project
25
+
26
+ def path_in_project(f)
27
+ return '/tmp/test' if $hook_override
28
+ orig_path_in_project
29
+ end
30
+
31
+ def git_user_and_project
32
+ return ['mine','yours'] if $hook_override
33
+ orig_git_user_and_project
34
+ end
35
+ end
36
+
37
+ class CIQuantum::Commit
38
+ attr_writer :raw_commit
39
+ end
40
+
41
+
42
+
43
+ class TestHooks < Test::Unit::TestCase
44
+ def teardown
45
+ $hook_override = nil
46
+ end
47
+
48
+ def setup
49
+ $hook_override = true
50
+ open("/tmp/test",'w') do |file|
51
+ file.write "echo $test\n"
52
+ file.write "echo $AUTHOR\n"
53
+ file.write "export test=foo\n"
54
+ end
55
+ File.chmod(0777,'/tmp/test')
56
+
57
+ @ciquantum = CIQuantum.new('/tmp')
58
+ @ciquantum.last_build = CIQuantum::Build.new "path", "user", "project", Time.now, Time.now,
59
+ "deadbeef", :failed, "output", nil
60
+ @ciquantum.last_build.commit.raw_commit = "Author: commit author\nDate: now"
61
+ end
62
+
63
+ def test_leave_env_intact
64
+ ENV['AUTHOR'] = 'foo'
65
+ @ciquantum.run_hook("/tmp/test")
66
+ assert ENV.size != 0, 'ENV is empty but should not be'
67
+ assert ENV['AUTHOR'] == 'foo', 'ENV munged a value'
68
+ end
69
+
70
+ def test_empty_hook_env
71
+ ENV["test"] = 'should not be shown'
72
+ output = @ciquantum.run_hook("/tmp/test")
73
+ assert_equal "\ncommit author\n", output
74
+ end
75
+
76
+ def test_hook_munge_env
77
+ ENV['test'] = 'bar'
78
+ output = @ciquantum.run_hook("/tmp/test")
79
+ assert ENV['test'] == 'bar'
80
+ end
81
+ end
metadata ADDED
@@ -0,0 +1,209 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ciquantum
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Anton Sidelnikov
9
+ - Chris Wanstrath
10
+ - Josh Owens
11
+ autorequire:
12
+ bindir: bin
13
+ cert_chain: []
14
+ date: 2012-04-23 00:00:00.000000000 Z
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: bundler
18
+ requirement: !ruby/object:Gem::Requirement
19
+ none: false
20
+ requirements:
21
+ - - ! '>='
22
+ - !ruby/object:Gem::Version
23
+ version: '0'
24
+ type: :runtime
25
+ prerelease: false
26
+ version_requirements: !ruby/object:Gem::Requirement
27
+ none: false
28
+ requirements:
29
+ - - ! '>='
30
+ - !ruby/object:Gem::Version
31
+ version: '0'
32
+ - !ruby/object:Gem::Dependency
33
+ name: rake
34
+ requirement: !ruby/object:Gem::Requirement
35
+ none: false
36
+ requirements:
37
+ - - ! '>='
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ type: :runtime
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ none: false
44
+ requirements:
45
+ - - ! '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ - !ruby/object:Gem::Dependency
49
+ name: json
50
+ requirement: !ruby/object:Gem::Requirement
51
+ none: false
52
+ requirements:
53
+ - - ! '>='
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ type: :runtime
57
+ prerelease: false
58
+ version_requirements: !ruby/object:Gem::Requirement
59
+ none: false
60
+ requirements:
61
+ - - ! '>='
62
+ - !ruby/object:Gem::Version
63
+ version: '0'
64
+ - !ruby/object:Gem::Dependency
65
+ name: tinder
66
+ requirement: !ruby/object:Gem::Requirement
67
+ none: false
68
+ requirements:
69
+ - - ! '>='
70
+ - !ruby/object:Gem::Version
71
+ version: 1.4.0
72
+ type: :runtime
73
+ prerelease: false
74
+ version_requirements: !ruby/object:Gem::Requirement
75
+ none: false
76
+ requirements:
77
+ - - ! '>='
78
+ - !ruby/object:Gem::Version
79
+ version: 1.4.0
80
+ - !ruby/object:Gem::Dependency
81
+ name: sinatra
82
+ requirement: !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ! '>='
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ type: :runtime
89
+ prerelease: false
90
+ version_requirements: !ruby/object:Gem::Requirement
91
+ none: false
92
+ requirements:
93
+ - - ! '>='
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ - !ruby/object:Gem::Dependency
97
+ name: choice
98
+ requirement: !ruby/object:Gem::Requirement
99
+ none: false
100
+ requirements:
101
+ - - ! '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ none: false
108
+ requirements:
109
+ - - ! '>='
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ - !ruby/object:Gem::Dependency
113
+ name: rack-test
114
+ requirement: !ruby/object:Gem::Requirement
115
+ none: false
116
+ requirements:
117
+ - - ! '>='
118
+ - !ruby/object:Gem::Version
119
+ version: '0'
120
+ type: :development
121
+ prerelease: false
122
+ version_requirements: !ruby/object:Gem::Requirement
123
+ none: false
124
+ requirements:
125
+ - - ! '>='
126
+ - !ruby/object:Gem::Version
127
+ version: '0'
128
+ - !ruby/object:Gem::Dependency
129
+ name: mocha
130
+ requirement: !ruby/object:Gem::Requirement
131
+ none: false
132
+ requirements:
133
+ - - ! '>='
134
+ - !ruby/object:Gem::Version
135
+ version: '0'
136
+ type: :development
137
+ prerelease: false
138
+ version_requirements: !ruby/object:Gem::Requirement
139
+ none: false
140
+ requirements:
141
+ - - ! '>='
142
+ - !ruby/object:Gem::Version
143
+ version: '0'
144
+ description: Ciquantum is a sinatra-based continuous integration server, based on
145
+ cijoe gem
146
+ email: ndmeredian@gmail.com
147
+ executables:
148
+ - ciquantum
149
+ extensions: []
150
+ extra_rdoc_files: []
151
+ files:
152
+ - .gitignore
153
+ - Gemfile
154
+ - LICENSE
155
+ - README.md
156
+ - Rakefile
157
+ - bin/ciquantum
158
+ - ciquantum.gemspec
159
+ - examples/build-failed
160
+ - examples/build-worked
161
+ - examples/cijoe.ru
162
+ - examples/cijoed
163
+ - lib/ciquantum.rb
164
+ - lib/ciquantum/adapter.rb
165
+ - lib/ciquantum/build.rb
166
+ - lib/ciquantum/commit.rb
167
+ - lib/ciquantum/config.rb
168
+ - lib/ciquantum/public/favicon.ico
169
+ - lib/ciquantum/public/octocat.png
170
+ - lib/ciquantum/public/screen.css
171
+ - lib/ciquantum/queue.rb
172
+ - lib/ciquantum/server.rb
173
+ - lib/ciquantum/unfuddle_adapter.rb
174
+ - lib/ciquantum/version.rb
175
+ - lib/ciquantum/views/json.erb
176
+ - lib/ciquantum/views/template.erb
177
+ - test/fixtures/payload.json
178
+ - test/helper.rb
179
+ - test/test_ciquantum_queue.rb
180
+ - test/test_hooks.rb
181
+ homepage: https://github.com/meredian/ciquantum
182
+ licenses: []
183
+ post_install_message:
184
+ rdoc_options: []
185
+ require_paths:
186
+ - lib
187
+ required_ruby_version: !ruby/object:Gem::Requirement
188
+ none: false
189
+ requirements:
190
+ - - ! '>='
191
+ - !ruby/object:Gem::Version
192
+ version: '0'
193
+ required_rubygems_version: !ruby/object:Gem::Requirement
194
+ none: false
195
+ requirements:
196
+ - - ! '>='
197
+ - !ruby/object:Gem::Version
198
+ version: '0'
199
+ requirements: []
200
+ rubyforge_project:
201
+ rubygems_version: 1.8.21
202
+ signing_key:
203
+ specification_version: 3
204
+ summary: Continius Integration server for internal usage at Social Quantum
205
+ test_files:
206
+ - test/fixtures/payload.json
207
+ - test/helper.rb
208
+ - test/test_ciquantum_queue.rb
209
+ - test/test_hooks.rb