houston-core 0.6.0 → 0.6.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.
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
+ }