bait 0.4.1 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.bait/test.sh +1 -1
- data/Gemfile.lock +31 -2
- data/README.md +18 -24
- data/Rakefile +4 -0
- data/VERSION +1 -1
- data/assets/js/bait.coffee +11 -0
- data/assets/js/build.coffee +67 -0
- data/assets/js/main.coffee +22 -0
- data/assets/js/manual_clone.coffee +24 -0
- data/assets/stylesheets/build.scss +30 -0
- data/assets/stylesheets/main.scss +28 -0
- data/bait.gemspec +3 -0
- data/lib/bait/api.rb +24 -10
- data/lib/bait/build.rb +82 -16
- data/lib/bait/cli.rb +4 -1
- data/lib/bait/public/{js → javascript}/ansi2html.js +0 -0
- data/lib/bait/public/{js → javascript}/zepto.min.js +0 -0
- data/lib/bait/public/stylesheets/reset.css +8 -0
- data/lib/bait/pubsub.rb +18 -0
- data/lib/bait/tester.rb +6 -54
- data/lib/bait/views/builds.haml +5 -22
- data/lib/bait/views/layout.haml +5 -4
- data/spec/lib/bait/api_spec.rb +26 -17
- data/spec/lib/bait/build_spec.rb +37 -47
- data/spec/lib/bait/pubsub_spec.rb +17 -0
- data/spec/lib/bait/tester_spec.rb +29 -62
- metadata +57 -8
- data/.rspec +0 -1
- data/lib/bait/public/css/styles.css +0 -77
- data/lib/bait/public/js/main.js +0 -26
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f731d3eadd100d677db8a67aea6e93cfb2fb7e71
|
4
|
+
data.tar.gz: c46a0e68d7812ea7107eeb91c50e8066733574f1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f262d95d082542abb556dd864e610614057f50f63400b6a7878ffffb9a50ee244436551b7e0a01be4ddfd41df3987bc178329177028112c57e7599cdaa376912
|
7
|
+
data.tar.gz: 60ccfa1b81f4b92dabe717b75d88e64c5c6c14771d3c75147452e63f8bc830270f1f1511db0fc6ff7374259aa2609600d06b9bf6a1483a9e22c1b0e0b6ec0146
|
data/.bait/test.sh
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,11 +1,14 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
bait (0.
|
4
|
+
bait (0.5.0)
|
5
5
|
git
|
6
6
|
haml
|
7
7
|
moneta
|
8
8
|
sinatra
|
9
|
+
sinatra-asset-snack
|
10
|
+
sinatra-contrib
|
11
|
+
sucker_punch
|
9
12
|
thin
|
10
13
|
toystore
|
11
14
|
|
@@ -19,11 +22,20 @@ GEM
|
|
19
22
|
i18n (~> 0.6, >= 0.6.4)
|
20
23
|
multi_json (~> 1.0)
|
21
24
|
adapter (0.7.0)
|
25
|
+
backports (3.3.3)
|
22
26
|
builder (3.0.4)
|
27
|
+
celluloid (0.14.1)
|
28
|
+
timers (>= 1.0.0)
|
23
29
|
coderay (1.0.9)
|
30
|
+
coffee-script (2.2.0)
|
31
|
+
coffee-script-source
|
32
|
+
execjs
|
33
|
+
coffee-script-source (1.6.3)
|
24
34
|
daemons (1.1.9)
|
25
35
|
diff-lcs (1.2.4)
|
26
36
|
eventmachine (1.0.3)
|
37
|
+
execjs (1.4.0)
|
38
|
+
multi_json (~> 1.0)
|
27
39
|
ffi (1.9.0)
|
28
40
|
formatador (0.2.4)
|
29
41
|
git (1.2.5)
|
@@ -36,7 +48,7 @@ GEM
|
|
36
48
|
guard-rspec (3.0.2)
|
37
49
|
guard (>= 1.8)
|
38
50
|
rspec (~> 2.13)
|
39
|
-
haml (4.0.
|
51
|
+
haml (4.0.3)
|
40
52
|
tilt
|
41
53
|
i18n (0.6.4)
|
42
54
|
listen (1.2.2)
|
@@ -45,6 +57,7 @@ GEM
|
|
45
57
|
rb-kqueue (>= 0.2)
|
46
58
|
lumberjack (1.0.4)
|
47
59
|
method_source (0.8.1)
|
60
|
+
mime-types (1.23)
|
48
61
|
moneta (0.7.19)
|
49
62
|
multi_json (1.7.7)
|
50
63
|
pry (0.9.12.2)
|
@@ -70,6 +83,7 @@ GEM
|
|
70
83
|
rspec-expectations (2.14.0)
|
71
84
|
diff-lcs (>= 1.1.3, < 2.0)
|
72
85
|
rspec-mocks (2.14.1)
|
86
|
+
sass (3.2.10)
|
73
87
|
simple_uuid (0.3.0)
|
74
88
|
simplecov (0.7.1)
|
75
89
|
multi_json (~> 1.0)
|
@@ -79,13 +93,28 @@ GEM
|
|
79
93
|
rack (~> 1.4)
|
80
94
|
rack-protection (~> 1.4)
|
81
95
|
tilt (~> 1.3, >= 1.3.4)
|
96
|
+
sinatra-asset-snack (0.1.5)
|
97
|
+
coffee-script
|
98
|
+
mime-types
|
99
|
+
sass
|
100
|
+
sinatra
|
101
|
+
sinatra-contrib (1.4.0)
|
102
|
+
backports (>= 2.0)
|
103
|
+
eventmachine
|
104
|
+
rack-protection
|
105
|
+
rack-test
|
106
|
+
sinatra (~> 1.4.2)
|
107
|
+
tilt (~> 1.3)
|
82
108
|
slop (3.4.6)
|
109
|
+
sucker_punch (1.0.1)
|
110
|
+
celluloid (~> 0.14.1)
|
83
111
|
thin (1.5.1)
|
84
112
|
daemons (>= 1.0.9)
|
85
113
|
eventmachine (>= 0.12.6)
|
86
114
|
rack (>= 1.0.0)
|
87
115
|
thor (0.18.1)
|
88
116
|
tilt (1.4.1)
|
117
|
+
timers (1.1.0)
|
89
118
|
toystore (0.13.2)
|
90
119
|
activemodel (~> 3.0)
|
91
120
|
activesupport (~> 3.0)
|
data/README.md
CHANGED
@@ -20,32 +20,26 @@ You may also test manually by inputting a clone URL within the UI
|
|
20
20
|
# Architectural Overview
|
21
21
|
|
22
22
|
```
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
| [.bait/test.sh]------|Bait::Tester| |
|
42
|
-
| [status/output] +------------+ |
|
23
|
+
Github POST bait:8417/--------+
|
24
|
+
|
|
25
|
+
+----------------------------------------|------+
|
26
|
+
| +------------+ +--\|/--+ | +-------------+
|
27
|
+
| | new Build <------------------| API <----| Browser |
|
28
|
+
| +-----+------+ | | | | |
|
29
|
+
| | | | | | |
|
30
|
+
| | +-------------+ | | | | |
|
31
|
+
| | | EventStream | | | | | |
|
32
|
+
| +---\|/----+ | Connection <------+ | | | |
|
33
|
+
| |Queue Job | | | | | | | | |
|
34
|
+
| +----+-----+ |Build Events | | | | | | |
|
35
|
+
| | |Subscription | | | | | | |
|
36
|
+
| | +--+------+---+ |/events----->[EventSource]|
|
37
|
+
| +----\|/-----+ | | +---+---+ | +-------------+
|
38
|
+
| | Test Build | | | | |
|
39
|
+
| |[subprocess]+----+ +----------+ |
|
40
|
+
| +------------+ |
|
43
41
|
| |
|
44
42
|
+-----------------------------------------------+
|
45
|
-
|
46
|
-
Bait::Build -- Persistent ToyStore
|
47
|
-
|
48
|
-
Bait::Tester -- Runs your tests and persists results in Bait::Build
|
49
43
|
```
|
50
44
|
|
51
45
|
*Created with [JavE](http://www.jave.de/)*
|
data/Rakefile
CHANGED
data/VERSION
CHANGED
@@ -0,0 +1,11 @@
|
|
1
|
+
window.Bait =
|
2
|
+
# Wrap our usage of event source:
|
3
|
+
# Incoming data is always an Array, the
|
4
|
+
# first value indicates the scope
|
5
|
+
# the second value is the callback
|
6
|
+
subscribe: (handlers) ->
|
7
|
+
source = new EventSource('/events')
|
8
|
+
source.addEventListener "message", (e) ->
|
9
|
+
data = JSON.parse(e.data)
|
10
|
+
handler = handlers[data[0]][data[1]]
|
11
|
+
handler.apply(@, data.slice(2))
|
@@ -0,0 +1,67 @@
|
|
1
|
+
window.Build =
|
2
|
+
find: (id) -> $("##{id}")
|
3
|
+
|
4
|
+
all: (cb) -> $.getJSON '/build', (data) -> cb(data)
|
5
|
+
|
6
|
+
DOM:
|
7
|
+
UIHelper:
|
8
|
+
# Click log to expand/collapse
|
9
|
+
expand_toggle: (el) ->
|
10
|
+
el.on "click", (e) ->
|
11
|
+
if el.css("max-height") is "100px"
|
12
|
+
el.css "max-height", "100%"
|
13
|
+
else
|
14
|
+
el.css "max-height", "100px"
|
15
|
+
|
16
|
+
enable_links: (element) ->
|
17
|
+
element.find('a.remove').click ->
|
18
|
+
$.ajax
|
19
|
+
type: "DELETE"
|
20
|
+
url: $(@).data('url')
|
21
|
+
return false
|
22
|
+
|
23
|
+
element.find('a.retest').click ->
|
24
|
+
$(@).parents('.build').find('pre').html("")
|
25
|
+
$.post $(@).data('url')
|
26
|
+
return false
|
27
|
+
|
28
|
+
init: (build_id) ->
|
29
|
+
build = Build.find(build_id)
|
30
|
+
|
31
|
+
# Color the output logs
|
32
|
+
pre = build.find(".output pre")
|
33
|
+
output = pre.html()
|
34
|
+
if output? && output.size > 0
|
35
|
+
pre.html ansi2html(output)
|
36
|
+
|
37
|
+
# Enable expansion toggle
|
38
|
+
Build.DOM.UIHelper.expand_toggle pre
|
39
|
+
Build.DOM.UIHelper.enable_links build
|
40
|
+
|
41
|
+
List:
|
42
|
+
add: (build) ->
|
43
|
+
html = Build.to_html(build)
|
44
|
+
if $('.build').length > 0
|
45
|
+
$('.build').first().before html
|
46
|
+
else
|
47
|
+
$('ul#builds').append html
|
48
|
+
Build.DOM.init build.id
|
49
|
+
|
50
|
+
to_html: (build) ->
|
51
|
+
"""
|
52
|
+
<li id="#{build.id}" class="build">
|
53
|
+
<div class="header #{build.status}">
|
54
|
+
<div class="status">#{build.status}</div>
|
55
|
+
<a href="#{build.clone_url}">#{build.name}</a>
|
56
|
+
<div class="ref">#{build.ref?=''}</div>
|
57
|
+
</div>
|
58
|
+
<div class="output">
|
59
|
+
<pre>#{build.output}</pre>
|
60
|
+
</div>
|
61
|
+
<div class="actions">
|
62
|
+
<a href="#" class="remove" data-url="/build/#{build.id}">Remove</a>
|
63
|
+
|
|
64
|
+
<a href="#" class="retest" data-url="/build/#{build.id}/retest">Retest</a>
|
65
|
+
</div>
|
66
|
+
</li>
|
67
|
+
"""
|
@@ -0,0 +1,22 @@
|
|
1
|
+
Zepto ($) ->
|
2
|
+
ManualClone.init()
|
3
|
+
|
4
|
+
Build.all (builds) ->
|
5
|
+
$.each builds, (i,d) ->
|
6
|
+
Build.List.add d.build
|
7
|
+
$("#loading").remove()
|
8
|
+
|
9
|
+
Bait.subscribe
|
10
|
+
global:
|
11
|
+
new_build: (data) ->
|
12
|
+
Build.List.add data.build
|
13
|
+
build:
|
14
|
+
output: (id, text) ->
|
15
|
+
pre = Build.find(id).find('pre')
|
16
|
+
pre.append ansi2html(text)
|
17
|
+
status: (id, text) ->
|
18
|
+
header = Build.find(id).find(".header")
|
19
|
+
header.find(".status").html text
|
20
|
+
header.attr "class", "header #{text}"
|
21
|
+
remove: (id) ->
|
22
|
+
Build.find(id).remove()
|
@@ -0,0 +1,24 @@
|
|
1
|
+
window.ManualClone =
|
2
|
+
init: ->
|
3
|
+
form = $('.manual_clone')
|
4
|
+
field = form.find('input')
|
5
|
+
button = form.find('button')
|
6
|
+
manual_clone = ->
|
7
|
+
input = field.val()
|
8
|
+
if input.length > 0
|
9
|
+
if not button.attr('disabled')
|
10
|
+
button.attr('disabled', 'disabled')
|
11
|
+
$.post '/build/create', {clone_url: input}, (response) ->
|
12
|
+
console.log response
|
13
|
+
button.removeAttr('disabled')
|
14
|
+
else
|
15
|
+
alert "Enter a local path or remote url to a git repo, e.g.:\n
|
16
|
+
Local: /Users/your/project\n
|
17
|
+
Remote: https://github.com/your/project"
|
18
|
+
|
19
|
+
field.keypress (e) ->
|
20
|
+
if e.keyCode is 13
|
21
|
+
manual_clone()
|
22
|
+
|
23
|
+
button.on 'click', ->
|
24
|
+
manual_clone()
|
@@ -0,0 +1,30 @@
|
|
1
|
+
.build {
|
2
|
+
border-radius:12px;
|
3
|
+
border:2px solid RGB(201,49,20);
|
4
|
+
margin:20px;
|
5
|
+
.header {
|
6
|
+
border-top-left-radius: 10px;
|
7
|
+
border-top-right-radius: 10px;
|
8
|
+
padding: 5px;
|
9
|
+
position:relative;
|
10
|
+
.status {
|
11
|
+
top:4px;
|
12
|
+
right:4px;
|
13
|
+
position:absolute;
|
14
|
+
}
|
15
|
+
}
|
16
|
+
.header.passed {
|
17
|
+
background-color:RGB(71,213,86);
|
18
|
+
}
|
19
|
+
.header.failed {
|
20
|
+
background-color: RGB(247,65,67);
|
21
|
+
}
|
22
|
+
.output pre {
|
23
|
+
cursor:pointer;
|
24
|
+
color: white;
|
25
|
+
background-color:black;
|
26
|
+
max-height:100px;
|
27
|
+
overflow-y:hidden;
|
28
|
+
overflow-x:scroll;
|
29
|
+
}
|
30
|
+
}
|
@@ -0,0 +1,28 @@
|
|
1
|
+
@font-face {
|
2
|
+
font-family: 'Ubuntu';
|
3
|
+
font-style: normal;
|
4
|
+
font-weight: 400;
|
5
|
+
src: local('Ubuntu'), url(/fonts/ubuntu.woff) format('woff');
|
6
|
+
}
|
7
|
+
|
8
|
+
body {
|
9
|
+
font-family: 'Ubuntu';
|
10
|
+
background-color:RGB(255,254,254);
|
11
|
+
}
|
12
|
+
|
13
|
+
.actions {
|
14
|
+
background-color:RGB(254,238,195);
|
15
|
+
text-align:center;
|
16
|
+
border-bottom-left-radius: 10px;
|
17
|
+
border-bottom-right-radius: 10px;
|
18
|
+
a {
|
19
|
+
color: RGB(20,77,105);
|
20
|
+
text-decoration:none;
|
21
|
+
}
|
22
|
+
a:hover {
|
23
|
+
color: RGB(201,49,20);
|
24
|
+
}
|
25
|
+
}
|
26
|
+
|
27
|
+
|
28
|
+
|
data/bait.gemspec
CHANGED
@@ -27,9 +27,12 @@ Gem::Specification.new do |spec|
|
|
27
27
|
spec.add_development_dependency 'simplecov'
|
28
28
|
|
29
29
|
spec.add_runtime_dependency "sinatra"
|
30
|
+
spec.add_runtime_dependency "sinatra-contrib"
|
31
|
+
spec.add_runtime_dependency 'sinatra-asset-snack'
|
30
32
|
spec.add_runtime_dependency "moneta"
|
31
33
|
spec.add_runtime_dependency "toystore"
|
32
34
|
spec.add_runtime_dependency "git"
|
33
35
|
spec.add_runtime_dependency "haml"
|
34
36
|
spec.add_runtime_dependency "thin"
|
37
|
+
spec.add_runtime_dependency "sucker_punch"
|
35
38
|
end
|
data/lib/bait/api.rb
CHANGED
@@ -1,14 +1,22 @@
|
|
1
1
|
require 'sinatra'
|
2
|
+
require 'sinatra/streaming'
|
3
|
+
require 'sinatra/asset_snack'
|
2
4
|
require 'haml'
|
3
5
|
require 'json'
|
6
|
+
require 'bait/pubsub'
|
4
7
|
require 'bait/build'
|
5
8
|
|
6
9
|
module Bait
|
7
10
|
class Api < Sinatra::Base
|
11
|
+
register Sinatra::AssetSnack
|
8
12
|
set :port, 8417
|
13
|
+
set server: 'thin'
|
14
|
+
|
15
|
+
asset_map '/javascript/application.js', ['assets/js/**/*.js', 'assets/js/**/*.coffee']
|
16
|
+
asset_map '/stylesheets/application.css', ['assets/stylesheets/**/*.css', 'assets/stylesheets/**/*.scss']
|
9
17
|
|
10
18
|
get '/' do
|
11
|
-
|
19
|
+
haml :builds
|
12
20
|
end
|
13
21
|
|
14
22
|
post '/' do
|
@@ -25,8 +33,9 @@ module Bait
|
|
25
33
|
end
|
26
34
|
|
27
35
|
get '/build' do
|
36
|
+
content_type :json
|
28
37
|
@builds = Bait::Build.all
|
29
|
-
|
38
|
+
@builds.to_json
|
30
39
|
end
|
31
40
|
|
32
41
|
post '/build/create' do
|
@@ -35,21 +44,26 @@ module Bait
|
|
35
44
|
name:params["clone_url"].split('/').last
|
36
45
|
})
|
37
46
|
build.test_later
|
38
|
-
redirect '/build'
|
39
47
|
end
|
40
48
|
|
41
|
-
|
49
|
+
delete '/build/:id' do
|
42
50
|
Build.destroy params["id"]
|
43
|
-
redirect '/build'
|
44
51
|
end
|
45
52
|
|
46
|
-
|
53
|
+
post '/build/:id/retest' do
|
47
54
|
build = Build.find params['id']
|
48
|
-
build.tested = false
|
49
|
-
build.output = ""
|
50
|
-
build.save
|
51
55
|
build.test_later
|
52
|
-
|
56
|
+
end
|
57
|
+
|
58
|
+
helpers Sinatra::Streaming
|
59
|
+
|
60
|
+
get '/events', provides: 'text/event-stream' do
|
61
|
+
stream(:keep_open) do |out|
|
62
|
+
Bait.add_subscriber out
|
63
|
+
out.callback do
|
64
|
+
Bait.remove_subscriber out
|
65
|
+
end
|
66
|
+
end
|
53
67
|
end
|
54
68
|
end
|
55
69
|
end
|