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.
Files changed (65) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +69 -68
  3. data/app/adapters/houston/adapters/deployment/engineyard.rb +1 -1
  4. data/app/adapters/houston/adapters/version_control/git_adapter/github_repo.rb +19 -0
  5. data/app/adapters/houston/adapters/version_control/git_adapter/remote_repo.rb +27 -0
  6. data/app/assets/images/drag-grip.png +0 -0
  7. data/app/assets/javascripts/app/infinite_scroll.coffee +1 -1
  8. data/app/assets/javascripts/app/views/_show_sprint_view.coffee +9 -9
  9. data/app/assets/javascripts/application.js +1 -0
  10. data/app/assets/javascripts/core/app.coffee +5 -0
  11. data/app/assets/javascripts/{app → core}/stacked_area_graph.coffee +0 -0
  12. data/app/assets/javascripts/{app → core}/stacked_bar_graph.coffee +0 -0
  13. data/app/assets/javascripts/dashboard.js +1 -0
  14. data/app/assets/javascripts/vendor.js +0 -1
  15. data/app/assets/stylesheets/application/exceptions.scss +3 -1
  16. data/app/assets/stylesheets/application/navigation.scss +84 -21
  17. data/app/assets/stylesheets/application/releases.scss +32 -2
  18. data/app/assets/stylesheets/application/test.scss +34 -0
  19. data/app/assets/stylesheets/core/colors.scss.erb +33 -3
  20. data/app/assets/stylesheets/dashboard/dashboard.scss +11 -7
  21. data/app/assets/stylesheets/variables.scss +3 -0
  22. data/app/concerns/belongs_to_commit.rb +14 -0
  23. data/app/concerns/project_adapter.rb +24 -6
  24. data/app/controllers/api/v1/projects_controller.rb +18 -0
  25. data/app/controllers/api/v1/sprint_tasks_controller.rb +1 -1
  26. data/app/controllers/deploys_controller.rb +1 -0
  27. data/app/controllers/project_tests_controller.rb +49 -19
  28. data/app/controllers/releases_controller.rb +5 -0
  29. data/app/controllers/test_runs_controller.rb +16 -1
  30. data/app/helpers/test_run_helper.rb +24 -0
  31. data/app/models/deploy.rb +13 -0
  32. data/app/models/github/pull_request.rb +39 -4
  33. data/app/models/release.rb +42 -0
  34. data/app/models/task.rb +3 -2
  35. data/app/models/test_run.rb +4 -0
  36. data/app/presenters/project_presenter.rb +28 -0
  37. data/app/views/deploys/show.html.erb +4 -0
  38. data/app/views/github/pulls/index.html.erb +4 -1
  39. data/app/views/layouts/_mobile_navigation.html.erb +14 -17
  40. data/app/views/layouts/_navigation.html.erb +87 -87
  41. data/app/views/layouts/dashboard.html.erb +2 -2
  42. data/app/views/project_tests/index.html.erb +22 -7
  43. data/app/views/releases/_index.html.erb +65 -0
  44. data/app/views/releases/_results.html.erb +47 -0
  45. data/app/views/releases/index.html.erb +29 -65
  46. data/app/views/sprints/dashboard.html.erb +4 -2
  47. data/config/environments/production.rb +1 -1
  48. data/config/environments/test.rb +4 -1
  49. data/config/initializers/add_navigation_renderers.rb +6 -0
  50. data/config/initializers/requirements.rb +1 -0
  51. data/config/routes.rb +3 -0
  52. data/db/migrate/20151226154901_add_search_vector_to_releases.rb +6 -0
  53. data/db/migrate/20151226155305_generate_index_on_releases.rb +5 -0
  54. data/db/migrate/20151228183704_drop_unused_tables.rb +35 -0
  55. data/db/migrate/20160120145757_add_successful_to_deploys.rb +10 -0
  56. data/db/structure.sql +19 -67
  57. data/houston.gemspec +3 -3
  58. data/lib/configuration.rb +4 -2
  59. data/lib/core_ext/array.rb +37 -0
  60. data/lib/houston/version.rb +1 -1
  61. data/test/integration/ci_integration_test.rb +14 -13
  62. data/test/unit/models/project_test.rb +33 -0
  63. data/test/unit/models/pull_request_test.rb +71 -1
  64. metadata +24 -14
  65. data/app/models/historical_head.rb +0 -5
@@ -11,6 +11,7 @@
11
11
  // about supported directives.
12
12
  //
13
13
  //= require_tree ./core
14
+ //= require md5
14
15
  //= require_tree ../templates
15
16
  //= require_tree ./app
16
17
 
@@ -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')
@@ -12,6 +12,7 @@
12
12
  //
13
13
  //= require_tree ./core
14
14
  //= require_tree ./dashboard
15
+ //= require md5
15
16
  //
16
17
  // for Houston::Roadmap's dashboard
17
18
  //
@@ -19,7 +19,6 @@
19
19
  //= require mousetrap
20
20
  //= require nested_editor_for
21
21
  //= require showdown
22
- //= require md5
23
22
  //= require neat
24
23
  //= require alertify
25
24
  //= require dropzone
@@ -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
- font-family: consolas, fixed;
52
+ @include code;
51
53
  font-size: 0.75em;
52
54
  line-height: 14px;
53
55
  }
@@ -1,9 +1,19 @@
1
- $navbar-height: 36px;
1
+ $navbar-height: 34px;
2
2
  $avatar-size: $navbar-height - 6px;
3
- $project-navbar-height: 30px;
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 20px 10px;
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 66px 0 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: 20px;
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: #111111;
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: 5px;
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: 20px;
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.5ems;
85
- font-size: 0.88em;
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: 3px 3em 0;
155
+ padding: 0;
95
156
  height: $project-navbar-height;
96
- overflow: hidden;
97
157
 
98
- .nav-icon svg * { fill: white; }
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: 5px 15px;
169
+ padding: 6px 15px;
170
+ height: $project-navbar-height - 12px;
110
171
  }
111
172
  .project-navbar .nav > li > a {
112
- color: white;
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: 820px;
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
- font-family: consolas, fixed;
6
+ @include code;
5
7
  .ellipsis { letter-spacing: -2px; margin: 0 1px 0 -1px; }
6
8
  }
7
9
 
8
10
  .commit-sha {
9
- font-family: consolas, fixed;
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
- position: fixed;
21
- top: 40px;
22
- left: 0;
23
- right: 0;
24
- bottom: 0;
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.5em 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
  }
@@ -0,0 +1,3 @@
1
+ @mixin code {
2
+ font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace;
3
+ }