ciquantum 0.0.1

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