houston-core 0.6.0 → 0.6.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +69 -68
- data/app/adapters/houston/adapters/deployment/engineyard.rb +1 -1
- data/app/adapters/houston/adapters/version_control/git_adapter/github_repo.rb +19 -0
- data/app/adapters/houston/adapters/version_control/git_adapter/remote_repo.rb +27 -0
- data/app/assets/images/drag-grip.png +0 -0
- data/app/assets/javascripts/app/infinite_scroll.coffee +1 -1
- data/app/assets/javascripts/app/views/_show_sprint_view.coffee +9 -9
- data/app/assets/javascripts/application.js +1 -0
- data/app/assets/javascripts/core/app.coffee +5 -0
- data/app/assets/javascripts/{app → core}/stacked_area_graph.coffee +0 -0
- data/app/assets/javascripts/{app → core}/stacked_bar_graph.coffee +0 -0
- data/app/assets/javascripts/dashboard.js +1 -0
- data/app/assets/javascripts/vendor.js +0 -1
- data/app/assets/stylesheets/application/exceptions.scss +3 -1
- data/app/assets/stylesheets/application/navigation.scss +84 -21
- data/app/assets/stylesheets/application/releases.scss +32 -2
- data/app/assets/stylesheets/application/test.scss +34 -0
- data/app/assets/stylesheets/core/colors.scss.erb +33 -3
- data/app/assets/stylesheets/dashboard/dashboard.scss +11 -7
- data/app/assets/stylesheets/variables.scss +3 -0
- data/app/concerns/belongs_to_commit.rb +14 -0
- data/app/concerns/project_adapter.rb +24 -6
- data/app/controllers/api/v1/projects_controller.rb +18 -0
- data/app/controllers/api/v1/sprint_tasks_controller.rb +1 -1
- data/app/controllers/deploys_controller.rb +1 -0
- data/app/controllers/project_tests_controller.rb +49 -19
- data/app/controllers/releases_controller.rb +5 -0
- data/app/controllers/test_runs_controller.rb +16 -1
- data/app/helpers/test_run_helper.rb +24 -0
- data/app/models/deploy.rb +13 -0
- data/app/models/github/pull_request.rb +39 -4
- data/app/models/release.rb +42 -0
- data/app/models/task.rb +3 -2
- data/app/models/test_run.rb +4 -0
- data/app/presenters/project_presenter.rb +28 -0
- data/app/views/deploys/show.html.erb +4 -0
- data/app/views/github/pulls/index.html.erb +4 -1
- data/app/views/layouts/_mobile_navigation.html.erb +14 -17
- data/app/views/layouts/_navigation.html.erb +87 -87
- data/app/views/layouts/dashboard.html.erb +2 -2
- data/app/views/project_tests/index.html.erb +22 -7
- data/app/views/releases/_index.html.erb +65 -0
- data/app/views/releases/_results.html.erb +47 -0
- data/app/views/releases/index.html.erb +29 -65
- data/app/views/sprints/dashboard.html.erb +4 -2
- data/config/environments/production.rb +1 -1
- data/config/environments/test.rb +4 -1
- data/config/initializers/add_navigation_renderers.rb +6 -0
- data/config/initializers/requirements.rb +1 -0
- data/config/routes.rb +3 -0
- data/db/migrate/20151226154901_add_search_vector_to_releases.rb +6 -0
- data/db/migrate/20151226155305_generate_index_on_releases.rb +5 -0
- data/db/migrate/20151228183704_drop_unused_tables.rb +35 -0
- data/db/migrate/20160120145757_add_successful_to_deploys.rb +10 -0
- data/db/structure.sql +19 -67
- data/houston.gemspec +3 -3
- data/lib/configuration.rb +4 -2
- data/lib/core_ext/array.rb +37 -0
- data/lib/houston/version.rb +1 -1
- data/test/integration/ci_integration_test.rb +14 -13
- data/test/unit/models/project_test.rb +33 -0
- data/test/unit/models/pull_request_test.rb +71 -1
- metadata +24 -14
- data/app/models/historical_head.rb +0 -5
@@ -4,11 +4,16 @@ window.App =
|
|
4
4
|
$("meta[name=\"#{name}\"]").attr('content')
|
5
5
|
|
6
6
|
serverDateFormat: d3.time.format('%Y-%m-%d')
|
7
|
+
serverTimeFormat: d3.time.format.iso
|
7
8
|
|
8
9
|
parseDate: (date)->
|
9
10
|
return date unless _.isString(date)
|
10
11
|
@serverDateFormat.parse date.slice(0, 10)
|
11
12
|
|
13
|
+
parseTime: (time)->
|
14
|
+
return time unless _.isString(time)
|
15
|
+
@serverTimeFormat.parse time
|
16
|
+
|
12
17
|
checkRevision: (jqXHR)->
|
13
18
|
@clientRevision ||= App.meta('revision')
|
14
19
|
serverRevision = jqXHR.getResponseHeader('X-Revision')
|
File without changes
|
File without changes
|
@@ -1,3 +1,5 @@
|
|
1
|
+
@import "variables.scss";
|
2
|
+
|
1
3
|
$completed-background: #E6F3E2;
|
2
4
|
$completed-foreground: rgb(42, 133, 19);
|
3
5
|
|
@@ -47,7 +49,7 @@ $completed-foreground: rgb(42, 133, 19);
|
|
47
49
|
}
|
48
50
|
.exception-commit {
|
49
51
|
display: block;
|
50
|
-
|
52
|
+
@include code;
|
51
53
|
font-size: 0.75em;
|
52
54
|
line-height: 14px;
|
53
55
|
}
|
@@ -1,9 +1,19 @@
|
|
1
|
-
$navbar-height:
|
1
|
+
$navbar-height: 34px;
|
2
2
|
$avatar-size: $navbar-height - 6px;
|
3
|
-
$project-navbar-height:
|
3
|
+
$project-navbar-height: 34px;
|
4
4
|
|
5
5
|
.navbar .dropdown-menu .bubble { margin: 0 0.25em 0 0; }
|
6
6
|
|
7
|
+
.navbar-inverse .brand, .navbar-inverse .nav > li > a { text-shadow: none; }
|
8
|
+
.navbar-inverse .navbar-inner {
|
9
|
+
background: #222 !important;
|
10
|
+
}
|
11
|
+
|
12
|
+
.navbar-inverse .divider-vertical {
|
13
|
+
border-left-color: #080808;
|
14
|
+
border-right-color: #303030;
|
15
|
+
}
|
16
|
+
|
7
17
|
.nav-icon {
|
8
18
|
display: inline-block;
|
9
19
|
height: 18px;
|
@@ -21,16 +31,34 @@ $project-navbar-height: 30px;
|
|
21
31
|
}
|
22
32
|
|
23
33
|
.navbar .brand {
|
24
|
-
padding: 6px
|
34
|
+
padding: 6px 12px 10px 20px;
|
35
|
+
margin: 0 15px 0 0;
|
36
|
+
height: $navbar-height - 16px;
|
25
37
|
position: relative;
|
26
38
|
z-index: 1;
|
39
|
+
background: black;
|
40
|
+
color: #ddd;
|
41
|
+
|
42
|
+
&::before {
|
43
|
+
content: '.';
|
44
|
+
color: transparent;
|
45
|
+
display: block;
|
46
|
+
position: absolute;
|
47
|
+
top: 0;
|
48
|
+
right: -10px;
|
49
|
+
width: 0px;
|
50
|
+
height: 0px;
|
51
|
+
border-top: ($navbar-height / 2) solid transparent;
|
52
|
+
border-bottom: ($navbar-height / 2) solid transparent;
|
53
|
+
border-left: 10px solid black;
|
54
|
+
}
|
27
55
|
}
|
28
56
|
|
29
57
|
// Don't let the navbar wrap onto multiple lines
|
30
58
|
.navbar .nav {
|
31
59
|
height: $navbar-height;
|
32
60
|
float: none;
|
33
|
-
margin: 0
|
61
|
+
margin: 0;
|
34
62
|
}
|
35
63
|
|
36
64
|
.navbar-inverse .navbar-inner {
|
@@ -48,13 +76,13 @@ $project-navbar-height: 30px;
|
|
48
76
|
.navbar .nav > li > a,
|
49
77
|
.navbar-inverse .nav > li.current {
|
50
78
|
padding: 6px 15px 10px;
|
51
|
-
height:
|
79
|
+
height: $navbar-height - 16px;
|
52
80
|
}
|
53
81
|
|
54
82
|
// same as .dropdown.open
|
55
83
|
.navbar-inverse .nav > li.current {
|
56
84
|
color: #ffffff;
|
57
|
-
background-color: #
|
85
|
+
background-color: #333;
|
58
86
|
}
|
59
87
|
|
60
88
|
.navbar-inner {
|
@@ -68,22 +96,55 @@ $project-navbar-height: 30px;
|
|
68
96
|
|
69
97
|
|
70
98
|
.navbar .nav .current-project {
|
71
|
-
margin-right:
|
99
|
+
margin-right: 15px;
|
72
100
|
white-space: nowrap;
|
101
|
+
position: relative;
|
102
|
+
|
103
|
+
.dropdown-menu { left: 8px; }
|
73
104
|
}
|
74
105
|
|
106
|
+
$current-project-active-bg: #222;
|
75
107
|
.navbar .nav .current-project > a {
|
76
108
|
color: white;
|
77
109
|
text-shadow: none;
|
78
|
-
height:
|
110
|
+
height: $project-navbar-height - 12px;
|
111
|
+
padding-left: 20px;
|
112
|
+
font-size: 16px;
|
113
|
+
font-weight: 200;
|
79
114
|
|
80
115
|
&::after {
|
81
116
|
font-family: 'FontAwesome';
|
82
117
|
content: '\f0dc';
|
83
118
|
display: inline-block;
|
84
|
-
margin-left: 0.
|
85
|
-
font-size:
|
119
|
+
margin-left: 0.25em;
|
120
|
+
font-size: 11px;
|
121
|
+
}
|
122
|
+
|
123
|
+
&::before {
|
124
|
+
content: '.';
|
125
|
+
color: transparent;
|
126
|
+
display: block;
|
127
|
+
position: absolute;
|
128
|
+
top: 0;
|
129
|
+
right: -10px;
|
130
|
+
width: 0px;
|
131
|
+
height: 0px;
|
132
|
+
border-top: ($project-navbar-height / 2) solid transparent;
|
133
|
+
border-bottom: ($project-navbar-height / 2) solid transparent;
|
134
|
+
border-left-width: 10px;
|
135
|
+
border-left-style: solid;
|
86
136
|
}
|
137
|
+
|
138
|
+
&:hover { color: white; }
|
139
|
+
}
|
140
|
+
|
141
|
+
.navbar .nav li.current-project.dropdown.open > .dropdown-toggle,
|
142
|
+
.navbar .nav li.current-project.dropdown.active > .dropdown-toggle,
|
143
|
+
.navbar .nav li.current-project.dropdown.open.active > .dropdown-toggle {
|
144
|
+
background: $current-project-active-bg;
|
145
|
+
color: white;
|
146
|
+
|
147
|
+
&::before { border-left-color: $current-project-active-bg; }
|
87
148
|
}
|
88
149
|
|
89
150
|
.project-navbar {
|
@@ -91,11 +152,10 @@ $project-navbar-height: 30px;
|
|
91
152
|
top: $navbar-height;
|
92
153
|
width: 100%;
|
93
154
|
z-index: 1029;
|
94
|
-
padding:
|
155
|
+
padding: 0;
|
95
156
|
height: $project-navbar-height;
|
96
|
-
overflow: hidden;
|
97
157
|
|
98
|
-
.nav-icon svg * { fill:
|
158
|
+
.nav-icon svg * { fill: #333; }
|
99
159
|
|
100
160
|
.project-no-features {
|
101
161
|
color: white;
|
@@ -106,15 +166,12 @@ $project-navbar-height: 30px;
|
|
106
166
|
.project-navbar .nav > li { float: left; }
|
107
167
|
.project-navbar .nav > li > a,
|
108
168
|
.project-navbar .nav > li.current {
|
109
|
-
padding:
|
169
|
+
padding: 6px 15px;
|
170
|
+
height: $project-navbar-height - 12px;
|
110
171
|
}
|
111
172
|
.project-navbar .nav > li > a {
|
112
|
-
color:
|
113
|
-
|
114
|
-
&:hover, &:focus {
|
115
|
-
text-decoration: none;
|
116
|
-
background-color: rgba(255,255,255,0.25);
|
117
|
-
}
|
173
|
+
color: #333;
|
174
|
+
text-shadow: none;
|
118
175
|
}
|
119
176
|
|
120
177
|
.project-navbar .nav > li.current {
|
@@ -125,8 +182,13 @@ $project-navbar-height: 30px;
|
|
125
182
|
}
|
126
183
|
|
127
184
|
|
185
|
+
.navbar .nav > li.current-user {
|
186
|
+
z-index: 5;
|
187
|
+
}
|
188
|
+
|
128
189
|
.navbar .nav > li.current-user > a {
|
129
190
|
padding: 3px 15px;
|
191
|
+
height: $navbar-height - 6px;
|
130
192
|
}
|
131
193
|
|
132
194
|
.navbar .nav > li > a.settings-link {
|
@@ -146,7 +208,7 @@ $project-navbar-height: 30px;
|
|
146
208
|
|
147
209
|
|
148
210
|
|
149
|
-
$threshhold:
|
211
|
+
$threshhold: 768px;
|
150
212
|
|
151
213
|
@media (max-width: $threshhold) {
|
152
214
|
.nav .nav-label { display: none; }
|
@@ -162,6 +224,7 @@ $threshhold: 820px;
|
|
162
224
|
|
163
225
|
.project-banner {
|
164
226
|
top: $navbar-height + $project-navbar-height;
|
227
|
+
border-bottom: 1px solid #e0e0e0;
|
165
228
|
}
|
166
229
|
|
167
230
|
.project-banner .dropdown .caret {
|
@@ -1,12 +1,14 @@
|
|
1
|
+
@import "variables.scss";
|
2
|
+
|
1
3
|
.no-items { font-style: italic; }
|
2
4
|
|
3
5
|
.commit-range {
|
4
|
-
|
6
|
+
@include code;
|
5
7
|
.ellipsis { letter-spacing: -2px; margin: 0 1px 0 -1px; }
|
6
8
|
}
|
7
9
|
|
8
10
|
.commit-sha {
|
9
|
-
|
11
|
+
@include code;
|
10
12
|
font-size: 0.88em;
|
11
13
|
}
|
12
14
|
|
@@ -155,3 +157,31 @@
|
|
155
157
|
font-weight: normal;
|
156
158
|
}
|
157
159
|
}
|
160
|
+
|
161
|
+
|
162
|
+
|
163
|
+
.input-group {
|
164
|
+
input[type="text"],
|
165
|
+
input[type="search"],
|
166
|
+
input[type="submit"],
|
167
|
+
.btn {
|
168
|
+
margin-bottom: 0;
|
169
|
+
|
170
|
+
&:not(:last-child) {
|
171
|
+
border-top-right-radius: 0;
|
172
|
+
border-bottom-right-radius: 0;
|
173
|
+
border-right-width: 0;
|
174
|
+
}
|
175
|
+
&:not(:first-child) {
|
176
|
+
border-top-left-radius: 0;
|
177
|
+
border-bottom-left-radius: 0;
|
178
|
+
}
|
179
|
+
}
|
180
|
+
}
|
181
|
+
|
182
|
+
.release-search-result em {
|
183
|
+
font-style: normal;
|
184
|
+
display: inline-block;
|
185
|
+
background: rgba(255, 255, 0, 0.12);
|
186
|
+
font-weight: 500;
|
187
|
+
}
|
@@ -82,3 +82,37 @@
|
|
82
82
|
&.zero { color: #ddd; }
|
83
83
|
}
|
84
84
|
}
|
85
|
+
|
86
|
+
$dot-graph-width: 144px;
|
87
|
+
|
88
|
+
.dot-graph {
|
89
|
+
width: $dot-graph-width;
|
90
|
+
height: 14px;
|
91
|
+
vertical-align: top;
|
92
|
+
}
|
93
|
+
|
94
|
+
.test-graph {
|
95
|
+
width: $dot-graph-width;
|
96
|
+
min-width: $dot-graph-width;
|
97
|
+
max-width: $dot-graph-width;
|
98
|
+
}
|
99
|
+
|
100
|
+
td.test-duration {
|
101
|
+
text-align: right;
|
102
|
+
line-height: normal;
|
103
|
+
padding-bottom: 2px;
|
104
|
+
|
105
|
+
.test-duration-average { display: block; }
|
106
|
+
.test-duration-range {
|
107
|
+
display: block;
|
108
|
+
font-size: 0.75em;
|
109
|
+
white-space: nowrap;
|
110
|
+
color: #aaa;
|
111
|
+
}
|
112
|
+
}
|
113
|
+
|
114
|
+
.dot-graph-rect {
|
115
|
+
&.pass { fill: #5DB64C; } // grass
|
116
|
+
&.fail { fill: #E24E32; } // tomato
|
117
|
+
&.skip { fill: #239ce7; } // sky
|
118
|
+
}
|
@@ -50,20 +50,50 @@ $default: rgb(80,80,80);
|
|
50
50
|
<% end %>
|
51
51
|
}
|
52
52
|
|
53
|
-
#email_body h1.project-banner
|
54
|
-
.current-project,
|
55
|
-
.project-navbar {
|
53
|
+
#email_body h1.project-banner {
|
56
54
|
<% project_colors.each do |name| %>
|
57
55
|
&.<%= name %> { background-color: $<%= name %>; }
|
58
56
|
<% end %>
|
59
57
|
}
|
60
58
|
|
59
|
+
.project-navbar {
|
60
|
+
<% project_colors.each do |name| %>
|
61
|
+
&.<%= name %> {
|
62
|
+
background-color: lighten($<%= name %>, 20%);
|
63
|
+
|
64
|
+
.nav > li.current-project > a {
|
65
|
+
background-color: $<%= name %>;
|
66
|
+
&:focus { background-color: $<%= name %>; }
|
67
|
+
&::before { border-left-color: $<%= name %>; }
|
68
|
+
|
69
|
+
&:hover {
|
70
|
+
background: saturate(darken($<%= name %>, 10%), 6%);
|
71
|
+
&::before { border-left-color: saturate(darken($<%= name %>, 10%), 6%); }
|
72
|
+
}
|
73
|
+
}
|
74
|
+
|
75
|
+
.divider-vertical {
|
76
|
+
border-left-color: lighten($<%= name %>, 15%);
|
77
|
+
border-right-color: lighten($<%= name %>, 28%);
|
78
|
+
}
|
79
|
+
}
|
80
|
+
<% end %>
|
81
|
+
}
|
82
|
+
|
83
|
+
|
61
84
|
<% project_colors.each do |name| %>
|
62
85
|
.project-navbar.<%= name %> .nav > li.current,
|
86
|
+
.project-navbar.<%= name %> .nav > li > a:hover,
|
63
87
|
.project-banner.<%= name %> {
|
64
88
|
background-color: lighten($<%= name %>, 32%);
|
65
89
|
background-color: hsl(hue($<%= name %>), saturation($<%= name %>), 93);
|
66
90
|
}
|
91
|
+
.project-banner.<%= name %> {
|
92
|
+
border-bottom: 1px solid hsl(hue($<%= name %>), saturation($<%= name %>) / 3, 88);
|
93
|
+
}
|
94
|
+
.slideout-menu .project-navbar.<%= name %> {
|
95
|
+
background-color: $<%= name %>;
|
96
|
+
}
|
67
97
|
.navbar-inverse .nav li.current-project.dropdown.open > .dropdown-toggle,
|
68
98
|
.navbar-inverse .nav li.current-project.dropdown.active > .dropdown-toggle,
|
69
99
|
.navbar-inverse .nav li.current-project.dropdown.open.active > .dropdown-toggle {
|
@@ -14,15 +14,16 @@ $subtle-vivid-green: #2d8041;
|
|
14
14
|
// a yellow green
|
15
15
|
$vivid-green: #7ab84a;
|
16
16
|
|
17
|
+
html { height: 100%; }
|
18
|
+
|
17
19
|
.dashboard {
|
18
20
|
background: $background;
|
19
21
|
color: $foreground;
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
padding: 12px;
|
22
|
+
overflow: hidden;
|
23
|
+
position: relative;
|
24
|
+
height: 100%;
|
25
|
+
padding: 40px 12px;
|
26
|
+
box-sizing: border-box;
|
26
27
|
|
27
28
|
&.red {
|
28
29
|
background: #5C1608;
|
@@ -60,13 +61,14 @@ $vivid-green: #7ab84a;
|
|
60
61
|
max-width: 960px;
|
61
62
|
margin: 0 auto;
|
62
63
|
position: relative;
|
64
|
+
height: 100%;
|
63
65
|
}
|
64
66
|
|
65
67
|
h1 {
|
66
68
|
color: inherit;
|
67
69
|
font-size: 4em;
|
68
70
|
font-weight: 100;
|
69
|
-
margin: 0 0 0.
|
71
|
+
margin: 0 0 0.25em 0;
|
70
72
|
padding: 0;
|
71
73
|
background: none;
|
72
74
|
box-shadow: none;
|
@@ -107,4 +109,6 @@ $vivid-green: #7ab84a;
|
|
107
109
|
background: $subtle;
|
108
110
|
color: $foreground;
|
109
111
|
}
|
112
|
+
|
113
|
+
.avatar-empty { display: none; }
|
110
114
|
}
|