houston-core 0.5.4 → 0.5.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +20 -22
  3. data/README.md +1 -1
  4. data/app/adapters/houston/adapters/version_control/git_adapter/repo.rb +6 -3
  5. data/app/assets/javascripts/app/boot.coffee +9 -0
  6. data/app/assets/javascripts/app/infinite_scroll.coffee +6 -3
  7. data/app/assets/javascripts/app/models/ticket.coffee +1 -1
  8. data/app/assets/javascripts/core/app.coffee +4 -1
  9. data/app/assets/javascripts/core/core_ext/array.coffee +11 -0
  10. data/app/assets/javascripts/core/core_ext/date.coffee +8 -0
  11. data/app/assets/javascripts/core/handlebars_helpers.coffee +12 -8
  12. data/app/assets/javascripts/vendor.js +2 -2
  13. data/app/assets/stylesheets/application/mobile.scss +96 -0
  14. data/app/assets/stylesheets/application/test.scss +58 -0
  15. data/app/assets/stylesheets/application/test_run.scss +14 -5
  16. data/app/assets/stylesheets/application/timeline.scss +2 -4
  17. data/app/concerns/commit_synchronizer.rb +38 -2
  18. data/app/controllers/application_controller.rb +3 -0
  19. data/app/controllers/hooks_controller.rb +18 -0
  20. data/app/controllers/project_tests_controller.rb +46 -0
  21. data/app/helpers/commit_helper.rb +7 -0
  22. data/app/helpers/test_run_helper.rb +16 -0
  23. data/app/models/commit.rb +4 -0
  24. data/app/models/github/pull_request.rb +7 -7
  25. data/app/models/milestone.rb +1 -1
  26. data/app/models/run_tests_on_post_receive.rb +2 -0
  27. data/app/models/test.rb +4 -0
  28. data/app/models/test_result.rb +1 -1
  29. data/app/models/test_run.rb +25 -2
  30. data/app/views/layouts/_mobile_navigation.html.erb +100 -0
  31. data/app/views/layouts/application.html.erb +20 -10
  32. data/app/views/layouts/dashboard.html.erb +1 -1
  33. data/app/views/layouts/minimal.html.erb +1 -1
  34. data/app/views/layouts/naked_dashboard.html.erb +1 -1
  35. data/app/views/project_notification/test_run.html.erb +97 -120
  36. data/app/views/project_tests/_commits.html.erb +14 -0
  37. data/app/views/project_tests/index.html.erb +39 -0
  38. data/app/views/projects/_form.html.erb +6 -2
  39. data/config/application.rb +1 -2
  40. data/config/routes.rb +2 -0
  41. data/db/migrate/20151108221505_convert_pull_request_labels_to_array.rb +22 -0
  42. data/db/migrate/20151108223154_sync_body_also_for_pull_requests.rb +5 -0
  43. data/db/migrate/20151108233510_add_props_to_pull_requests.rb +5 -0
  44. data/db/structure.sql +10 -1
  45. data/houston.gemspec +4 -5
  46. data/lib/houston/version.rb +1 -1
  47. data/test/integration/web_hook_test.rb +7 -1
  48. data/test/unit/concerns/commit_synchronizer_test.rb +13 -0
  49. data/test/unit/models/pull_request_test.rb +17 -0
  50. data/vendor/assets/javascripts/showdown.js +2489 -0
  51. data/vendor/assets/javascripts/slideout.js +493 -0
  52. metadata +25 -29
  53. data/lib/tasks/config.rake +0 -255
  54. data/vendor/assets/javascripts/Markdown.Converter.js +0 -1412
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 33c6315112e8db47be58ad8b075102db34b3bf90
4
- data.tar.gz: 9385e52314a08c28b2b1527b92cb2ca834884fb8
3
+ metadata.gz: 6aef236606e7963c5b5c25f937547b1e018785ef
4
+ data.tar.gz: 90fe22a11402775168fdecf5371238b2622987dd
5
5
  SHA512:
6
- metadata.gz: bdea5b2b024d33ed90b4080693d2feabac52d3a1bfcff6b2f9a5e03a7fb908e49ef155da89caf02a5f8c35a1de1cf57ea5a08a875bf52eb47ceb60bb41cea4f1
7
- data.tar.gz: 7f20d774bd1df81ae7ac137b3e74b6487e0d1da94fb3322c2a91f273316129f7246482f942faf62eca8012cdfe434cfe93664309933298ca9444768cb336af28
6
+ metadata.gz: a71ad9e5148b88bf6fe5b23d69f05c1bf28b04ab50c442368e9b24bc133a2a6f1c5aa63aebd9182de8477b503ac1f1f776df3b0b1a37ad83986be63f1975bc1a
7
+ data.tar.gz: 0a8029b5aa27cb157ee31cad0843b5a613b3103816ead338d6b43e48689c746f9564c68ab241802342385b108de6ec541d821d9e7f72dc6e2480d844f8212d79
data/Gemfile.lock CHANGED
@@ -1,12 +1,12 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- houston-core (0.5.4)
4
+ houston-core (0.5.5)
5
5
  activerecord-import
6
6
  activerecord-pluck_in_batches
7
7
  addressable
8
- backbone-rails (~> 1.0.0)
9
8
  boblail-unfuddle
9
+ browser
10
10
  bundler
11
11
  cancan (~> 1.6.10)
12
12
  codeclimate-test-reporter (= 0.4.1)
@@ -20,7 +20,7 @@ PATH
20
20
  faraday-raise-errors (~> 0.2.0)
21
21
  gemoji (~> 2.1.0)
22
22
  googlecharts (~> 1.6.12)
23
- handlebars_assets (~> 0.18.0)
23
+ handlebars_assets (~> 0.21.0)
24
24
  houston-devise_ldap_authenticatable
25
25
  houston-oauth-plugin
26
26
  houston-vestal_versions
@@ -29,7 +29,7 @@ PATH
29
29
  nested_editor_for
30
30
  nokogiri (~> 1.6.6.2)
31
31
  octokit (~> 4.1.0)
32
- oj (~> 2.12.14)
32
+ oj (~> 2.13)
33
33
  openxml-xlsx
34
34
  pg (~> 0.18.3)
35
35
  pg_search (~> 1.0.5)
@@ -39,12 +39,11 @@ PATH
39
39
  rails (~> 4.1.13)
40
40
  redcarpet (~> 3.3.2)
41
41
  rufus-scheduler (~> 3.1.7)
42
- rugged (~> 0.23.2)
42
+ rugged (~> 0.23.3)
43
43
  sass-rails (~> 4.0.0)
44
44
  simplecov (~> 0.9.1)
45
45
  sprockets (~> 2.8)
46
46
  strongbox (~> 0.7.2)
47
- sugar-rails
48
47
  thor
49
48
  thread_safe (~> 0.3.5)
50
49
  uglifier (>= 1.3.0)
@@ -86,8 +85,6 @@ GEM
86
85
  addressable (2.3.8)
87
86
  ansi (1.5.0)
88
87
  arel (5.0.1.20140414130214)
89
- backbone-rails (1.0.0.1)
90
- rails (>= 3.0.0)
91
88
  bcrypt (3.1.10)
92
89
  bcrypt-ruby (3.1.5)
93
90
  bcrypt (>= 3.1.3)
@@ -95,6 +92,7 @@ GEM
95
92
  activesupport
96
93
  builder
97
94
  faraday (~> 0.8.8)
95
+ browser (1.0.1)
98
96
  builder (3.2.2)
99
97
  cancan (1.6.10)
100
98
  capybara (2.5.0)
@@ -160,11 +158,11 @@ GEM
160
158
  faraday
161
159
  gemoji (2.1.0)
162
160
  googlecharts (1.6.12)
163
- handlebars_assets (0.18)
164
- execjs (>= 1.2.9)
165
- multi_json
166
- sprockets (>= 2.0.3)
167
- tilt
161
+ handlebars_assets (0.21.0)
162
+ execjs (~> 2.0)
163
+ multi_json (~> 1.0)
164
+ sprockets (>= 2.0.0, < 4.0)
165
+ tilt (~> 1.2)
168
166
  hashdiff (0.2.2)
169
167
  highline (1.6.21)
170
168
  hike (1.2.3)
@@ -185,7 +183,7 @@ GEM
185
183
  domain_name (~> 0.5)
186
184
  i18n (0.7.0)
187
185
  json (1.8.3)
188
- jwt (1.5.1)
186
+ jwt (1.5.2)
189
187
  launchy (2.4.3)
190
188
  addressable (~> 2.3)
191
189
  libv8 (3.16.14.13)
@@ -207,9 +205,9 @@ GEM
207
205
  multipart-post (1.2.0)
208
206
  neat-rails (0.1.0)
209
207
  nested_editor_for (0.1.0)
210
- net-ldap (0.11)
208
+ net-ldap (0.12.0)
211
209
  net-ssh (2.9.2)
212
- netrc (0.10.3)
210
+ netrc (0.11.0)
213
211
  nokogiri (1.6.6.2)
214
212
  mini_portile (~> 0.6.0)
215
213
  oauth (0.4.7)
@@ -221,14 +219,16 @@ GEM
221
219
  rack (~> 1.2)
222
220
  octokit (4.1.1)
223
221
  sawyer (~> 0.6.0, >= 0.5.3)
224
- oj (2.12.14)
225
- open_xml_package (0.1.0)
222
+ oj (2.13.0)
223
+ open_xml_package (0.2.0.beta1)
226
224
  nokogiri
225
+ ox
227
226
  rubyzip (~> 1.1.0)
228
- openxml-xlsx (0.1.1)
227
+ openxml-xlsx (0.1.2)
229
228
  nokogiri
230
- open_xml_package (= 0.1.0)
229
+ open_xml_package (= 0.2.0.beta1)
231
230
  orm_adapter (0.5.0)
231
+ ox (2.2.2)
232
232
  pg (0.18.3)
233
233
  pg_search (1.0.5)
234
234
  activerecord (>= 3.1)
@@ -305,8 +305,6 @@ GEM
305
305
  sprockets (>= 2.8, < 4.0)
306
306
  strongbox (0.7.2)
307
307
  activerecord
308
- sugar-rails (1.4.1)
309
- railties (>= 3.0.0)
310
308
  test_after_commit (0.4.1)
311
309
  activerecord (>= 3.2)
312
310
  therubyracer (0.12.2)
data/README.md CHANGED
@@ -23,7 +23,7 @@ Houston is also extensible through **[Modules](https://github.com/houston/housto
23
23
  To use Houston, you must have
24
24
 
25
25
  - [Ruby 2.0+](https://www.ruby-lang.org/en/downloads)
26
- - [Postgres 9.3+](http://www.postgresql.org/download)
26
+ - [Postgres 9.4+](http://www.postgresql.org/download)
27
27
 
28
28
  ##### Hello World
29
29
 
@@ -236,10 +236,13 @@ module Houston
236
236
  push_shas.each { |sha| walker.push(sha) }
237
237
  hide_shas.each { |sha| walker.hide(sha) }
238
238
 
239
- walker.each_with_index.map do |commit, i|
240
- release if i % 200 == 0
241
- yield commit
239
+ results = []
240
+ walker.each_with_index do |commit, i|
241
+ release if i > 0 && i % 200 == 0
242
+ results.push yield commit
243
+ break if options[:limit] && (i + 1) >= options[:limit]
242
244
  end
245
+ results
243
246
 
244
247
  ensure
245
248
  release
@@ -20,3 +20,12 @@ $ ->
20
20
  project = $link.attr('data-project')
21
21
  $context = $link.closest('#tickets')
22
22
  e.preventDefault() if App.showTicket(number, project, $context: $context)
23
+
24
+ isMobile = $('html').hasClass('mobile')
25
+
26
+ if isMobile
27
+ slideout = new Slideout
28
+ panel: document.getElementById('body')
29
+ menu: document.getElementById('slideout_menu')
30
+ padding: 172
31
+ tolerance: 70
@@ -12,7 +12,7 @@ class @InfiniteScroll
12
12
  @$window.scroll _.bind(@onScroll, @)
13
13
 
14
14
  onScroll: ->
15
- return if @$el.hasClass('loading')
15
+ return if @$el.hasClass('loading') or @$el.hasClass('done')
16
16
  return unless @$el.is(':visible')
17
17
  return unless @$window.scrollTop() >= (@$document.height() - @$window.height() - @offset)
18
18
 
@@ -23,9 +23,12 @@ class @InfiniteScroll
23
23
  return unless xhr
24
24
 
25
25
  @$el.addClass('loading')
26
- xhr.done (html)=>
26
+ xhr.done (html, status, e)=>
27
27
  @$el.removeClass('loading')
28
- @$el.append(html)
28
+ if e.status is 204
29
+ @$el.addClass('done')
30
+ else
31
+ @$el.append(html)
29
32
  @success() if @success
30
33
  xhr.fail =>
31
34
  @$el.removeClass('loading')
@@ -31,7 +31,7 @@ class window.Ticket extends Backbone.Model
31
31
  @commitsCollection ||= new Commits(@get('commits'), ticket: @)
32
32
 
33
33
  activityStream: ->
34
- @testingNotes().models.concat(@commits().models).sortBy (item)-> item.get('createdAt')
34
+ _.sortBy @testingNotes().models.concat(@commits().models), (item)-> item.get('createdAt')
35
35
 
36
36
 
37
37
  parse: (ticket)->
@@ -26,7 +26,10 @@ window.App =
26
26
 
27
27
  mdown: (markdown)->
28
28
  return '' unless markdown
29
- converter = new Markdown.Converter()
29
+ converter = new showdown.Converter
30
+ literalMidWordUnderscores: true
31
+ strikethrough: true
32
+ ghCodeBlocks: true
30
33
  html = converter.makeHtml(markdown)
31
34
  App.emojify(html)
32
35
 
@@ -0,0 +1,11 @@
1
+ unless Array::each
2
+ if Array::forEach
3
+ Array::each = Array::forEach
4
+ else
5
+ Array::each = (block)->
6
+ _.each(@, block)
7
+
8
+ Array::first = -> @[0]
9
+ Array::last = -> @[@length - 1]
10
+ Array::min = -> Math.min(@...)
11
+ Array::max = -> Math.max(@...)
@@ -0,0 +1,8 @@
1
+ Date::endOfDay = ->
2
+ new Date(
3
+ @getFullYear(),
4
+ @getMonth(),
5
+ @getDate(),
6
+ 23,
7
+ 59,
8
+ 59)
@@ -1,3 +1,7 @@
1
+ toDate = (timestamp)->
2
+ return timestamp if _.isDate(timestamp)
3
+ new Date(timestamp)
4
+
1
5
  Handlebars.registerHelper 'formatDuration', (seconds)->
2
6
  if seconds < Duration.HOUR
3
7
  minutes = Math.floor(seconds / Duration.MINUTE)
@@ -14,25 +18,25 @@ Handlebars.registerHelper 'formatDuration', (seconds)->
14
18
 
15
19
  Handlebars.registerHelper 'formatDate', (timestamp)->
16
20
  format = d3.time.format('%a %b %-d')
17
- format Date.create(timestamp)
21
+ format toDate(timestamp)
18
22
 
19
23
  Handlebars.registerHelper 'formatDateWithYear', (timestamp)->
20
24
  return "" unless timestamp
21
25
  format = d3.time.format('%b %-d <span class="year">%Y</span>')
22
- format Date.create(timestamp)
26
+ format toDate(timestamp)
23
27
 
24
28
  Handlebars.registerHelper 'formatDateWithYear2', (timestamp)->
25
29
  return "" unless timestamp
26
30
  format = d3.time.format('%b %-d, %Y')
27
- format Date.create(timestamp)
31
+ format toDate(timestamp)
28
32
 
29
33
  Handlebars.registerHelper 'formatTime', (timestamp)->
30
34
  format = d3.time.format('%a %b %-d, %Y %-I:%M%p')
31
- format Date.create(timestamp)
35
+ format toDate(timestamp)
32
36
  .replace(/[AP]M/, (str)-> str.toLowerCase()[0])
33
37
 
34
38
  Handlebars.registerHelper 'formatTimeAgo', (timestamp)->
35
- $.timeago Date.create(timestamp)
39
+ $.timeago toDate(timestamp)
36
40
 
37
41
  Handlebars.registerHelper 'markdown', (markdown)-> App.mdown(markdown)
38
42
 
@@ -121,11 +125,11 @@ Handlebars.registerHelper 'timelineDate', (date)->
121
125
  <span class="year">%Y</span>
122
126
  </div>
123
127
  """
124
- format Date.create(date)
128
+ format toDate(date)
125
129
 
126
130
  Handlebars.registerHelper 'timelineTime', (time)->
127
131
  format = d3.time.format('<span class="timeline-event-time">%-I:%M%p</span>')
128
- format Date.create(time)
132
+ format toDate(time)
129
133
  .replace(/[AP]M/, (str)-> str.toLowerCase()[0])
130
134
 
131
135
  Handlebars.registerHelper 'timelineDateAfterGap', (date)->
@@ -137,7 +141,7 @@ Handlebars.registerHelper 'timeline', (events, options)->
137
141
  if events.length > 0
138
142
  html = '<div class="timeline">'
139
143
  for event in events
140
- date = App.truncateDate(Date.create(event.date || event.time))
144
+ date = App.truncateDate(toDate(event.date || event.time))
141
145
  html += Handlebars.helpers.timelineDateRange(lastDate, date)
142
146
  html += options.fn(event)
143
147
  lastDate = date
@@ -18,9 +18,9 @@
18
18
  //= require jquery.timeago.js
19
19
  //= require mousetrap
20
20
  //= require nested_editor_for
21
- //= require sugar
22
- //= require Markdown.Converter
21
+ //= require showdown
23
22
  //= require md5
24
23
  //= require neat
25
24
  //= require alertify
26
25
  //= require dropzone
26
+ //= require slideout
@@ -1,3 +1,99 @@
1
1
  @media only screen and (max-width: 600px) {
2
2
  #keyboard_shortcuts_button { display: none; }
3
3
  }
4
+
5
+ html.mobile {
6
+ min-height: 100%;
7
+
8
+ body {
9
+ width: 100%;
10
+ height: 100%;
11
+ padding-top: 36px;
12
+ }
13
+
14
+ .project-banner {
15
+ top: 0;
16
+ }
17
+
18
+ .project-banner small {
19
+ display: block;
20
+ }
21
+
22
+ .project-navbar {
23
+ height: auto;
24
+ position: static;
25
+ padding: 0;
26
+ overflow: visible;
27
+ }
28
+
29
+ .project-navbar .nav > li {
30
+ float: none;
31
+ }
32
+
33
+ .nav .nav-label {
34
+ display: inline;
35
+ vertical-align: text-bottom;
36
+ }
37
+
38
+ #body {
39
+ background: white;
40
+ }
41
+
42
+ .navbar .nav {
43
+ margin: 0;
44
+ }
45
+
46
+ .slideout-menu {
47
+ position: fixed;
48
+ left: 0;
49
+ top: 36px;
50
+ bottom: 0;
51
+ right: 0;
52
+ z-index: 0;
53
+ width: 172px;
54
+ overflow-y: auto;
55
+ -webkit-overflow-scrolling: touch;
56
+ display: none;
57
+ background: #333;
58
+ padding: 20px 0 0 0;
59
+
60
+ .nav {
61
+ background: #333;
62
+ padding: 0;
63
+ margin: 0 0 0 6px;
64
+ }
65
+
66
+ .nav > li.current-project > a {
67
+ color: white;
68
+ }
69
+
70
+ .nav > li > a,
71
+ .nav > li.current {
72
+ padding: 5px 15px;
73
+ color: #999;
74
+ .nav-icon svg * { fill: #999; }
75
+ }
76
+
77
+ .nav > li.current {
78
+ background: #666;
79
+ color: white;
80
+ .nav-icon svg * { fill: white; }
81
+ }
82
+ }
83
+
84
+ .slideout-panel {
85
+ position: relative;
86
+ z-index: 1;
87
+ }
88
+
89
+ &.slideout-open,
90
+ &.slideout-open body,
91
+ &.slideout-open .slideout-panel {
92
+ overflow: hidden;
93
+ height: 100%;
94
+ }
95
+
96
+ &.slideout-open .slideout-menu {
97
+ display: block;
98
+ }
99
+ }
@@ -0,0 +1,58 @@
1
+ .project-test-history {
2
+ h3 {
3
+ font-weight: 200;
4
+ line-height: 1em;
5
+ margin: 0.66em 0 0;
6
+ }
7
+ h3 b { color: #777; }
8
+
9
+ max-width: 860px;
10
+ padding-right: 60px;
11
+ margin: 0 auto;
12
+
13
+ .project-test-totals {
14
+ margin: 1em 0 2em;
15
+ dd, dt { display: inline-block; }
16
+ dd { font-weight: 600; margin: 0 0.33em 0 0; }
17
+ dt { font-weight: 400; margin: 0 0.66em 0 0; }
18
+ }
19
+ }
20
+
21
+ .timeline .timeline-event.project-test-commit {
22
+ padding-left: 45px;
23
+ text-indent: -25px;
24
+ padding-right: 100px;
25
+ }
26
+
27
+ .project-test-commit {
28
+ .project-test-commit-author {
29
+ display: inline-block;
30
+ text-indent: 0;
31
+ padding: 0;
32
+ margin: 0;
33
+ vertical-align: top;
34
+ }
35
+
36
+ .project-test-commit-message {
37
+ position: relative;
38
+ top: 2px;
39
+ }
40
+
41
+ .project-test-status {
42
+ position: absolute;
43
+ display: inline-block;
44
+ right: 0;
45
+ padding: 2px 4px;
46
+ text-indent: 0;
47
+ text-align: right;
48
+ text-transform: uppercase;
49
+ font-weight: 500 !important;
50
+
51
+ &.project-test-status-untested { color: #ddd; }
52
+ &.project-test-status-pending { color: #888; }
53
+ &.project-test-status-aborted { color: #ddd; }
54
+ &.project-test-status-unknown { color: #888; }
55
+ &.project-test-status-pass { color: #5db64c; }
56
+ &.project-test-status-fail { color: #e24e32; }
57
+ }
58
+ }