ci_in_a_can 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 01a156efea17fc2fc3ea80032a133372068c96b4
4
- data.tar.gz: f1a685129c6f48b798c93eec378c353701460140
3
+ metadata.gz: 93278421181c40f169823bd2a26073c13eb60c25
4
+ data.tar.gz: 1ccc1722210490cda0626af954f54333f6d9d873
5
5
  SHA512:
6
- metadata.gz: 7aa2a8ecf9eda070a3bb35efaf73c183199aaa95f6e85bdbdb2601f76f09056d2523f1733afcf4dc51cfc36dfa59c50276e9314a93039f0a954f04dba4557c7b
7
- data.tar.gz: 5ddaab0fe750ed016db64bbf995a215f1824db6bb183e189a6a75a11473abdc31ab9e11c57415559e9c5905894c741b9999aef02f49bc1c1a2b4fec28a648791
6
+ metadata.gz: 6a7a9f5ad472316abc975be0da76a20c0915c1b840363d57d62ede0372beb48adc35677a0a9b8a0b46090b3523127f5c01cd869865e1b3bbd2ca9040c84d9a5b
7
+ data.tar.gz: 7393e824459eaba30c67b46137586d980cb028df7ac8bd2f508ce8819f3f826e441dc653a65bc553036091b70d1abb34473b7a824d880c6b5cc147c39eeb8a76
@@ -4,44 +4,75 @@ module CiInACan
4
4
 
5
5
  class App < Sinatra::Base
6
6
 
7
+ enable :sessions
8
+
9
+ before do
10
+ session[:authenticated] = session[:passphrase] == ENV['PASSPHRASE'].to_s
11
+ end
12
+
7
13
  class << self
8
14
  attr_accessor :jobs_location
9
15
  end
10
16
 
17
+ get '/login' do
18
+ CiInACan::WebContent.full_page_of(
19
+ <<EOF
20
+ <form action="/login" method="post">
21
+ Passphrase
22
+ <input type="password" name="passphrase">
23
+ <button type="submit">Submit</button>
24
+ </form>
25
+ EOF
26
+ )
27
+ end
28
+
29
+ post '/login' do
30
+ session[:passphrase] = params[:passphrase]
31
+ redirect '/'
32
+ end
33
+
11
34
  get '/test_result/:id.json' do
12
35
  CiInACan::TestResult.find(params[:id]).to_json
13
36
  end
14
37
 
15
38
  post %r{/repo/(.+)} do
16
39
 
17
- if ENV['PASSPHRASE'] != params[:passphrase].to_s
18
- redirect '/'
40
+ unless session[:authenticated]
41
+ redirect '/login'
19
42
  return
20
43
  end
21
44
 
22
45
  params[:id] = params[:captures].first
23
46
  commands = params[:commands].gsub("\r\n", "\n").split("\n")
24
47
  commands = commands.map { |x| x.strip }.select { |x| x != '' }
25
- data = CiInACan::Persistence.find('build_commands', params[:id]) || {}
26
- data[:commands] = commands
27
- CiInACan::Persistence.save('build_commands', params[:id], data)
48
+ repo = CiInACan::Repo.find params[:id]
49
+ repo = CiInACan::Repo.create(id: params[:id]) unless repo
50
+ repo.build_commands = commands
51
+ repo.save
28
52
  redirect "/repo/#{params[:id]}"
29
53
  end
30
54
 
31
55
  get %r{/repo/(.+)} do
56
+
57
+ unless session[:authenticated]
58
+ redirect '/login'
59
+ return
60
+ end
61
+
32
62
  params[:id] = params[:captures].first
33
- data = CiInACan::Persistence.find('build_commands', params[:id]) || {}
34
- commands = data[:commands] || []
35
- commands = commands.join("\n")
63
+ repo = CiInACan::Repo.find(params[:id])
64
+ url = repo ? repo.url : nil
65
+ commands = repo ? repo.build_commands.join("\n") : ''
36
66
  CiInACan::WebContent.full_page_of(
37
67
  <<EOF
38
68
  <form action="/repo/#{params[:id]}" method="post">
69
+ <div>#{url}</div>
39
70
  <label>Passphrase</label>
40
71
  <input type="text" name="passphrase">
41
72
  <textarea name="commands">
42
73
  #{commands}
43
74
  </textarea>
44
- <input type="submit">Submit</inputk
75
+ <input type="submit">Submit</input>
45
76
  </form>
46
77
  EOF
47
78
  )
@@ -66,7 +97,15 @@ EOF
66
97
  )
67
98
  end
68
99
 
69
- post '/' do
100
+ post %r{/push/(.+)} do
101
+ capture = params[:captures].first.split('/')
102
+ api_key = capture.shift
103
+ id = capture.join('/')
104
+
105
+ repo = CiInACan::Repo.find id
106
+ raise 'Could not find this repo' unless repo
107
+ raise 'Invalid API Key' unless repo.api_key == api_key
108
+
70
109
  write_a_file_with params
71
110
  end
72
111
 
@@ -15,7 +15,7 @@ module CiInACan
15
15
  end
16
16
 
17
17
  def commands
18
- commands = CiInACan::BuildSetting.commands_for self
18
+ commands = CiInACan::Repo.find(repo).build_commands
19
19
  commands.count > 0 ? commands : ['bundle install', 'bundle exec rake']
20
20
  end
21
21
 
@@ -0,0 +1,57 @@
1
+ module CiInACan
2
+
3
+ class Repo
4
+
5
+ params_constructor do
6
+ @api_key = UUID.new.generate unless @api_key
7
+ @build_commands = [] unless @build_commands
8
+ end
9
+
10
+ attr_accessor :id
11
+ attr_accessor :name
12
+ attr_accessor :api_key
13
+ attr_accessor :build_commands
14
+
15
+ def self.create data
16
+ data[:api_key] ||= UUID.new.generate
17
+ repo_data = { id: data[:id],
18
+ name: data[:name],
19
+ api_key: data[:api_key],
20
+ build_commands: data[:build_commands] }
21
+ CiInACan::Persistence.save('repos', data[:id], repo_data)
22
+ find data[:id]
23
+ end
24
+
25
+ def self.find id
26
+ data = CiInACan::Persistence.find('repos', id)
27
+ return nil unless data
28
+ CiInACan::Repo.new(data)
29
+ end
30
+
31
+ def self.find_by_api_key api_key
32
+ all.select { |x| x.api_key == api_key }.first
33
+ end
34
+
35
+ def save
36
+ data = { id: id, name: name, api_key: api_key, build_commands: build_commands }
37
+ CiInACan::Persistence.save('repos', id, data)
38
+ end
39
+
40
+ def self.all
41
+ blah = CiInACan::Persistence.hash_for("repos")
42
+ blah.sort_by { |x| x[0] }.reverse.map { |x| new x[1] }
43
+ end
44
+
45
+ def reset_api_key
46
+ data = CiInACan::Persistence.find('repos', id)
47
+ data[:api_key] = UUID.new.generate
48
+ CiInACan::Persistence.save('repos', data[:id], data)
49
+ end
50
+
51
+ def url
52
+ "/push/#{id}/#{api_key}"
53
+ end
54
+
55
+ end
56
+
57
+ end
@@ -1,3 +1,3 @@
1
1
  module CiInACan
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -20,12 +20,23 @@ describe CiInACan::Build do
20
20
 
21
21
  describe "commands" do
22
22
 
23
- describe "when no build settings exist for the build" do
23
+ let(:repo_name) { Object.new }
24
+ let(:repo) { CiInACan::Repo.new }
25
+
26
+ let(:build) do
27
+ b = CiInACan::Build.new
28
+ b.repo = repo_name
29
+ b
30
+ end
24
31
 
25
- let(:build) { CiInACan::Build.new }
32
+ before do
33
+ CiInACan::Repo.stubs(:find).with(repo_name).returns repo
34
+ end
35
+
36
+ describe "when no build settings exist for the build" do
26
37
 
27
38
  before do
28
- CiInACan::BuildSetting.stubs(:commands_for).with(build).returns []
39
+ repo.stubs(:build_commands).returns []
29
40
  end
30
41
 
31
42
  it "should default commands to the basic ruby conventions" do
@@ -39,13 +50,10 @@ describe CiInACan::Build do
39
50
 
40
51
  describe "when a build setting exists" do
41
52
 
42
- let(:build) { CiInACan::Build.new }
43
53
  let(:commands_for_build) { [Object.new] }
44
54
 
45
55
  before do
46
- CiInACan::BuildSetting.stubs(:commands_for)
47
- .with(build)
48
- .returns commands_for_build
56
+ repo.stubs(:build_commands).returns commands_for_build
49
57
  end
50
58
 
51
59
  it "should return those commands" do
@@ -0,0 +1,183 @@
1
+ require_relative '../spec_helper'
2
+
3
+ describe CiInACan::Repo do
4
+
5
+ before do
6
+ clear_all_persisted_data
7
+ end
8
+
9
+ describe "create and find" do
10
+
11
+ before do
12
+ uuid = Object.new
13
+ uuid.stubs(:generate).returns api_key
14
+ UUID.stubs(:new).returns uuid
15
+ end
16
+
17
+ [:id, :name, :api_key].to_objects {[
18
+ ['abc', 'apple', 'test1'],
19
+ ['123', 'orang', 'test2']
20
+ ]}.each do |data|
21
+
22
+ describe "create" do
23
+
24
+ let(:api_key) { data.api_key }
25
+
26
+ it "should return the repo" do
27
+ repo = CiInACan::Repo.create(id: data.id)
28
+ repo.is_a?(CiInACan::Repo).must_equal true
29
+ repo.id.must_equal data.id
30
+ end
31
+ end
32
+
33
+ describe "finding a record by id" do
34
+
35
+ let(:api_key) { data.api_key }
36
+
37
+ it "should return a repo with that id" do
38
+
39
+ CiInACan::Repo.create( { id: data.id } )
40
+
41
+ repo = CiInACan::Repo.find data.id
42
+ repo.is_a?(CiInACan::Repo).must_equal true
43
+ repo.id.must_equal data.id
44
+ end
45
+
46
+ it "should return the right record if many exist" do
47
+
48
+ CiInACan::Repo.create(id: UUID.new.generate)
49
+ CiInACan::Repo.create(id: data.id)
50
+ CiInACan::Repo.create(id: UUID.new.generate)
51
+
52
+ repo = CiInACan::Repo.find data.id
53
+ repo.is_a?(CiInACan::Repo).must_equal true
54
+ repo.id.must_equal data.id
55
+
56
+ end
57
+
58
+ end
59
+
60
+ describe "finding a record that does not exist" do
61
+ let(:api_key) { data.api_key }
62
+ it "should return nil" do
63
+ CiInACan::Repo.find(data.id).nil?.must_equal true
64
+ end
65
+ end
66
+
67
+ describe "attributes" do
68
+
69
+ let(:api_key) { data.api_key }
70
+
71
+ it "should allow the stamping by name" do
72
+ CiInACan::Repo.create(id: data.id, name: data.name)
73
+
74
+ repo = CiInACan::Repo.find data.id
75
+ repo.name.must_equal data.name
76
+ end
77
+
78
+ it "should create a unique api key" do
79
+ CiInACan::Repo.create(id: data.id)
80
+
81
+ repo = CiInACan::Repo.find data.id
82
+ repo.api_key.must_equal data.api_key
83
+ end
84
+
85
+ it "should not override the existing api key" do
86
+ CiInACan::Repo.create(id: data.id,
87
+ api_key: 'previously set value')
88
+
89
+ repo = CiInACan::Repo.find data.id
90
+ repo.api_key.must_equal 'previously set value'
91
+ end
92
+
93
+ [['one'], ['one', 'two', 'three']].each do |build_commands|
94
+ describe "different build commands" do
95
+ it "should store an array of build commands" do
96
+ repo = CiInACan::Repo.create(id: data.id, build_commands: build_commands)
97
+ repo.build_commands.must_equal build_commands
98
+ end
99
+ end
100
+ end
101
+
102
+ describe "build commands" do
103
+ it "should default to an empty array" do
104
+ CiInACan::Repo.new.build_commands.must_equal []
105
+ end
106
+ end
107
+
108
+ end
109
+
110
+ end
111
+
112
+ end
113
+
114
+ describe "save" do
115
+ it "should update all of the fields" do
116
+ repo = CiInACan::Repo.create(id: 'test')
117
+ repo.name = UUID.new.generate
118
+ repo.api_key = UUID.new.generate
119
+ repo.build_commands = [UUID.new.generate]
120
+ repo.save
121
+
122
+ new_repo = CiInACan::Repo.find('test')
123
+
124
+ [:name, :api_key, :build_commands].each do |field|
125
+ new_repo.send(field).must_equal repo.send(field)
126
+ end
127
+ end
128
+ end
129
+
130
+ describe "resetting an api key" do
131
+ it "should reset the api key" do
132
+ r = CiInACan::Repo.create(id: 'test')
133
+ original_api_key = r.api_key
134
+
135
+ r.reset_api_key
136
+
137
+ r = CiInACan::Repo.find('test')
138
+ new_api_key = r.api_key
139
+
140
+ new_api_key.wont_equal original_api_key
141
+ end
142
+ end
143
+
144
+ ['test', 'test2'].each do |id|
145
+ describe "url" do
146
+ it "should return push/id/api_key" do
147
+ repo = CiInACan::Repo.create(id: id)
148
+ repo.url.must_equal "/push/#{repo.id}/#{repo.api_key}"
149
+ end
150
+ end
151
+ end
152
+
153
+ describe "all" do
154
+ it "should return all of the repos" do
155
+ repo_ids = [CiInACan::Repo.create(id: UUID.new.generate),
156
+ CiInACan::Repo.create(id: UUID.new.generate),
157
+ CiInACan::Repo.create(id: UUID.new.generate)].map { |x| x.id }
158
+
159
+ actual_ids = CiInACan::Repo.all.map { |x| x.id }.sort_by { |x| x }
160
+
161
+ repo_ids.sort_by! { |x| x }
162
+ actual_ids.sort_by! { |x| x }
163
+
164
+ repo_ids.must_equal actual_ids
165
+ end
166
+ end
167
+
168
+ describe "find by api key" do
169
+ it "should return the repo with the matching api key" do
170
+ repos = (1..3).to_a.map do |_|
171
+ CiInACan::Repo.create(id: UUID.new.generate,
172
+ api_key: UUID.new.generate)
173
+ end
174
+
175
+ repos.each do |repo|
176
+ found = CiInACan::Repo.find_by_api_key repo.api_key
177
+ repo.id.must_equal found.id
178
+ end
179
+
180
+ end
181
+ end
182
+
183
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ci_in_a_can
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Darren Cauthon
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-17 00:00:00.000000000 Z
11
+ date: 2014-02-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -226,12 +226,12 @@ files:
226
226
  - lib/ci_in_a_can/bash.rb
227
227
  - lib/ci_in_a_can/bash_result.rb
228
228
  - lib/ci_in_a_can/build.rb
229
- - lib/ci_in_a_can/build_setting.rb
230
229
  - lib/ci_in_a_can/cloner.rb
231
230
  - lib/ci_in_a_can/daemon.rb
232
231
  - lib/ci_in_a_can/github.rb
233
232
  - lib/ci_in_a_can/github_build_parser.rb
234
233
  - lib/ci_in_a_can/persistence.rb
234
+ - lib/ci_in_a_can/repo.rb
235
235
  - lib/ci_in_a_can/run.rb
236
236
  - lib/ci_in_a_can/runner.rb
237
237
  - lib/ci_in_a_can/test_result.rb
@@ -246,11 +246,11 @@ files:
246
246
  - sample.json
247
247
  - spec/ci_in_a_can/bash_result_spec.rb
248
248
  - spec/ci_in_a_can/bash_spec.rb
249
- - spec/ci_in_a_can/build_setting_spec.rb
250
249
  - spec/ci_in_a_can/build_spec.rb
251
250
  - spec/ci_in_a_can/cloner_spec.rb
252
251
  - spec/ci_in_a_can/github_build_parser_spec.rb
253
252
  - spec/ci_in_a_can/github_spec.rb
253
+ - spec/ci_in_a_can/repo_spec.rb
254
254
  - spec/ci_in_a_can/run_spec.rb
255
255
  - spec/ci_in_a_can/runner_spec.rb
256
256
  - spec/ci_in_a_can/test_result_notifier_spec.rb
@@ -287,11 +287,11 @@ summary: Fast CI. Still a WIP.
287
287
  test_files:
288
288
  - spec/ci_in_a_can/bash_result_spec.rb
289
289
  - spec/ci_in_a_can/bash_spec.rb
290
- - spec/ci_in_a_can/build_setting_spec.rb
291
290
  - spec/ci_in_a_can/build_spec.rb
292
291
  - spec/ci_in_a_can/cloner_spec.rb
293
292
  - spec/ci_in_a_can/github_build_parser_spec.rb
294
293
  - spec/ci_in_a_can/github_spec.rb
294
+ - spec/ci_in_a_can/repo_spec.rb
295
295
  - spec/ci_in_a_can/run_spec.rb
296
296
  - spec/ci_in_a_can/runner_spec.rb
297
297
  - spec/ci_in_a_can/test_result_notifier_spec.rb
@@ -1,13 +0,0 @@
1
- module CiInACan
2
-
3
- module BuildSetting
4
-
5
- def self.commands_for build
6
- CiInACan::Persistence.find('build_commands', build.repo)[:commands]
7
- rescue
8
- []
9
- end
10
-
11
- end
12
-
13
- end
@@ -1,44 +0,0 @@
1
- require_relative '../spec_helper'
2
-
3
- describe CiInACan::BuildSetting do
4
-
5
- let(:persistence_type) { 'build_commands' }
6
-
7
- before do
8
- clear_all_persisted_data
9
- end
10
-
11
- describe "commands for a build" do
12
-
13
- describe "bad build" do
14
- it "should default to nothing" do
15
- CiInACan::BuildSetting.commands_for(nil).must_equal []
16
- end
17
- end
18
-
19
- [:repo, :commands].to_objects {[
20
- ['abc', ['1', '2', '3']],
21
- ['def', ['4', '5', '6']]
22
- ]}.each do |test|
23
-
24
- describe "settings for the build repo exist" do
25
-
26
- it "should return the settings" do
27
-
28
- CiInACan::Persistence.save(persistence_type, test.repo, { commands: test.commands } )
29
-
30
- build = CiInACan::Build.new(repo: test.repo)
31
-
32
- commands = CiInACan::BuildSetting.commands_for build
33
-
34
- commands.must_equal test.commands
35
-
36
- end
37
-
38
- end
39
-
40
- end
41
-
42
- end
43
-
44
- end