This commit is contained in:
Radek Stepan 2014-12-22 14:03:27 -07:00
parent c1bac21198
commit 3ecac58c00
7 changed files with 66 additions and 48 deletions

View File

@ -1,6 +1,6 @@
{
"name": "burnchart",
"version": "2.0.2",
"version": "2.0.3",
"description": "GitHub Burndown Chart as a Service",
"author": "Radek Stepan <dev@radekstepan.com> (http://radekstepan.com)",
"license": "AGPL-3.0",

File diff suppressed because one or more lines are too long

View File

@ -12,7 +12,7 @@ module.exports =
# `total`: total number of points (open & closed issues)
actual: (issues, created_at, total) ->
head = [ {
'date': do moment(created_at).toJSON
'date': moment(created_at, moment.ISO_8601).toJSON()
'points': total
} ]
@ -26,7 +26,7 @@ module.exports =
max = size if size > max
# Dropping points remaining.
issue.date = do moment(closed_at).toJSON
issue.date = moment(closed_at, moment.ISO_8601).toJSON()
issue.points = total -= size
issue
@ -47,9 +47,9 @@ module.exports =
# Swap if end is before the start...
[ b, a ] = [ a, b ] if b < a
a = moment a
a = moment a, moment.ISO_8601
# Do we have a due date?
b = if b? then moment b else do moment.utc
b = if b? then moment(b, moment.ISO_8601) else do moment.utc
# Go through the beginning to the end skipping off days.
days = [] ; length = 0
@ -87,11 +87,11 @@ module.exports =
[ first, ..., last ] = actual
start = moment first.date
start = moment first.date, moment.ISO_8601
# Values is a list of time from the start and points remaining.
values = _.map actual, ({ date, points }) ->
[ moment(date).diff(start), points ]
[ moment(date, moment.ISO_8601).diff(start), points ]
# Now is an actual point too.
now = do moment.utc
@ -111,11 +111,11 @@ module.exports =
fn = (x) -> slope * x + intercept
# Milestone always has a creation date.
created_at = moment created_at
created_at = moment created_at, moment.ISO_8601
# Due date specified.
if due_on
due_on = moment due_on
due_on = moment due_on, moment.ISO_8601
# In the past?
due_on = now if now > due_on
# No due date

View File

@ -23,13 +23,13 @@ module.exports = (milestone) ->
# Milestones with no due date are always on track.
return { isOverdue, isOnTime, isDone, isEmpty, 'progress': { points } } unless milestone.due_on?
a = moment milestone.created_at
a = moment milestone.created_at, moment.ISO_8601
b = do moment.utc
c = moment milestone.due_on
c = moment milestone.due_on, moment.ISO_8601
# Overdue? Regardless of the date, if we have closed all
# issues, we are no longer overdue.
isOverdue = yes if b.isAfter c and not isDone
isOverdue = yes if b.isAfter(c) and not isDone
# Progress in time.
time = progress b.diff(a), c.diff(b)

View File

@ -6,7 +6,7 @@ module.exports =
# Time from now.
fromNow: _.memoize (jsonDate) ->
do moment(jsonDate).fromNow
moment(jsonDate, moment.ISO_8601).fromNow()
# When is a milestone due?
due: (jsonDate) ->
@ -14,8 +14,7 @@ module.exports =
[ 'due', @fromNow jsonDate ].join(' ')
# Markdown formatting.
markdown: (markup) ->
marked markup
'markdown': marked
# Format milestone title.
title: (text) ->

View File

@ -1,4 +1,5 @@
{ assert } = require 'chai'
moment = require 'moment'
lines = require '../src/modules/chart/lines.coffee'
@ -35,12 +36,14 @@ module.exports =
'lines - trend': (done) ->
issues = [
{ 'date': 1, 'points': 4 }
{ 'date': 2, 'points': 1 }
{ 'date': 3, 'points': 1 }
{ 'date': '2011-04-02T00:00:00.000Z', 'points': 4 }
{ 'date': '2011-04-03T00:00:00.000Z', 'points': 1 }
{ 'date': '2011-04-04T00:00:00.000Z', 'points': 1 }
]
line = (Math.round(points) for { points } in lines.trend(issues, 1, new Date))
opts = [ issues, '2011-04-02T00:00:00.000Z', do moment.utc ]
line = (Math.round(points) for { points } in lines.trend.apply null, opts)
assert.deepEqual line, [ 2, 1 ]

View File

@ -1,6 +1,7 @@
proxy = do require('proxyquire').noCallThru
{ assert } = require 'chai'
path = require 'path'
moment = require 'moment'
stats = require '../src/modules/stats.coffee'
@ -28,9 +29,10 @@ module.exports =
assert.isTrue isDone
do done
'stats - is milestone overdue? has due date': (done) ->
'stats - is milestone overdue? has due date, yes': (done) ->
milestone =
'due_on': 0
'created_at': '2011-04-02T00:00:00.000Z'
'due_on': '2011-04-03T00:00:00.000Z'
'issues':
'open': { 'size': 0 }
'closed': { 'size': 0 }
@ -40,11 +42,11 @@ module.exports =
do done
'stats - is milestone on time? has due date, yes': (done) ->
now = +new Date
now = do moment.utc
milestone =
'created_at': now - 1e3
'due_on': 1e4 + now
'created_at': now.subtract(1, 'week').toISOString()
'due_on': now.add(1, 'month').toISOString()
'issues':
'open': { 'size': 1 }
'closed': { 'size': 1 }
@ -54,15 +56,29 @@ module.exports =
do done
'stats - is milestone on time? has due date, no': (done) ->
now = +new Date
now = do moment.utc
milestone =
'created_at': now - 1e4
'due_on': 1e3 + now
'created_at': now.subtract(2, 'week').toISOString()
'due_on': now.add(1, 'day').toISOString()
'issues':
'open': { 'size': 1 }
'closed': { 'size': 1 }
'open': { 'size': 2 }
'closed': { 'size': 2 }
{ isOnTime } = stats milestone
assert.isFalse isOnTime
do done
'stats - is milestone on time? has due date, all issues closed': (done) ->
now = do moment.utc
milestone =
'created_at': now.subtract(2, 'week').toISOString()
'due_on': now.subtract(1, 'week').toISOString()
'issues':
'open': { 'size': 0 }
'closed': { 'size': 5 }
{ isOnTime } = stats milestone
assert.isTrue isOnTime
do done