closes #98
This commit is contained in:
parent
c1bac21198
commit
3ecac58c00
|
@ -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
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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) ->
|
||||
|
|
|
@ -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 ]
|
||||
|
||||
|
|
|
@ -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
|
Loading…
Reference in New Issue