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)) |