~ubuntuone-hackers/+junk/ttd-server-side

6 by Jonathan Lange
Add R script
1
library(ggplot2)
2
library(reshape)
3
27 by Jonathan Lange
Parametrize the R script, mostly. Still not proven with multiple projects.
4
get.project.name <- function(filename) {
5
  # Expect 'filename' to be of the form 'projectname-YYYYMMDD.csv'.
6
  return(unlist(strsplit(basename(filename), "-", fixed=TRUE))[1])
7
}
8
9
10
load.project <- function(project.name, filename) {
11
  data <- read.csv(filename)
12
  data$project <- project.name
13
  return(data)
14
}
15
28 by Jonathan Lange
Rescaled to days. Should handle multiple plots.
16
17
get.png.filename <- function(project.name) {
18
  TODAY <- format(Sys.Date(), format="%Y%m%d")
19
  paste(project.name, "-", TODAY, ".png", sep="")
20
}
21
27 by Jonathan Lange
Parametrize the R script, mostly. Still not proven with multiple projects.
22
from.unix <- function(timestamp) {
23
  EPOCH <- "1970-01-01"
24
  UTC <- "GMT"
25
  return(as.POSIXct(timestamp, origin=EPOCH, tz=UTC))
26
}
27
28
load.data <- function(filenames) {
29
  projects <- NULL
30
  for (filename in filenames) {
31
    project.name <- get.project.name(filename)
32
    print(project.name)
33
    data <- load.project(project.name, filename)
34
    projects <- rbind(projects, data)
35
  }
36
  return(projects)
37
}
38
39
clean.data <- function(projects) {
40
  projects <- within(projects, {
41
    started <- from.unix(started)
42
    posted <- from.unix(posted)
43
    approved <- from.unix(approved)
44
    landed <- from.unix(landed)
45
    deployed <- from.unix(deployed)
46
  })
47
  
28 by Jonathan Lange
Rescaled to days. Should handle multiple plots.
48
  units <- "days"
49
  
27 by Jonathan Lange
Parametrize the R script, mostly. Still not proven with multiple projects.
50
  projects <- within(projects, {
28 by Jonathan Lange
Rescaled to days. Should handle multiple plots.
51
    to.mp <- as.numeric(posted - started, units=units)
52
    to.approve <- as.numeric(approved - posted, units=units)
53
    to.land <- as.numeric(landed - approved, units=units)
54
    to.deploy <- as.numeric(deployed - landed, units=units)
55
    start.to.finish <- as.numeric(deployed - started, units=units)
27 by Jonathan Lange
Parametrize the R script, mostly. Still not proven with multiple projects.
56
  })
57
  
58
  return(projects)
59
}
60
61
plot.projects <- function(projects) {
28 by Jonathan Lange
Rescaled to days. Should handle multiple plots.
62
  PLOT.WIDTH <- 1000
63
  PLOT.HEIGHT <- 450
27 by Jonathan Lange
Parametrize the R script, mostly. Still not proven with multiple projects.
64
  breakdown <- melt(
65
    projects, id=c("revno", "started", "project"), 
66
    measure.vars=c("to.mp", "to.approve", "to.land", "to.deploy"))
28 by Jonathan Lange
Rescaled to days. Should handle multiple plots.
67
  names <- unique(breakdown$project)
68
  for (name in names) {
29 by Jonathan Lange
Only one project per picture.
69
    this.project <- subset(breakdown, project == name)
28 by Jonathan Lange
Rescaled to days. Should handle multiple plots.
70
    filename <- get.png.filename(name)
71
    png(filename, width=PLOT.WIDTH, height=PLOT.HEIGHT)
29 by Jonathan Lange
Only one project per picture.
72
    print(qplot(data=this.project, fill=variable, x=revno,
28 by Jonathan Lange
Rescaled to days. Should handle multiple plots.
73
                weight=value, ylab="Days from start to deploy", binwidth=1))
74
    dev.off()
75
  }
27 by Jonathan Lange
Parametrize the R script, mostly. Still not proven with multiple projects.
76
}
77
78
main <- function(args) {
79
  projects <- load.data(args)
80
  projects <- clean.data(projects)
81
  plot.projects(projects)
82
}
83
84
main(commandArgs(trailingOnly = TRUE))