Skip to content

Commit a72ac2d

Browse files
authored
Merge pull request #5 from kinto-b/dev
0.0.2
2 parents c00ed43 + ecc9313 commit a72ac2d

4 files changed

Lines changed: 65 additions & 7 deletions

File tree

DESCRIPTION

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
Package: piper
22
Title: Pipeline Tools Inspired by GNU Make
3-
Version: 0.0.1
3+
Version: 0.0.2
44
Authors@R:
55
person(given = "Kinto",
66
family = "Behr",
77
role = c("aut", "cre"),
88
email = "[email protected]")
99
Description: Tools for constructing simple make-like pipelines.
1010
License: GPL (>= 3)
11+
URL: https://kinto-b.github.io/piper/,
12+
https://github.com/kinto-b/piper
13+
BugReports: https://github.com/kinto-b/piper/issues
1114
Encoding: UTF-8
1215
LazyData: true
1316
Roxygen: list(markdown = TRUE)

NEWS.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# piper 0.0.2
2+
3+
* Pipeline visualisations are now sorted hierarchically, from left to right across the screen.
4+
* Fixed bug in pipeline invalidation (#4).
5+
* Added a `NEWS.md` file to track changes to the package.
6+
7+
# piper 0.0.1
8+
9+
* Initial release.

R/Pipeline.R

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -113,14 +113,34 @@ Pipeline <- R6::R6Class(classname = "Pipeline", list(
113113
# Out of date?
114114
edges$from_mtime <- file.mtime(as.character(edges$from))
115115
edges$to_mtime <- file.mtime(as.character(edges$to))
116-
edges$out_of_date <- edges$from_mtime > edges$to_mtime
117-
edges$out_of_date <- ifelse(is.na(edges$out_of_date), FALSE, edges$out_of_date)
118-
for (i in seq_along(edges$from)) {
119-
x <- edges$out_of_date
120-
edges$out_of_date <- (edges$from %in% edges[edges$out_of_date, "to"]) | (edges$out_of_date)
121-
if (identical(edges$out_of_date, x)) break
116+
edges$out_of_date <- ifelse(edges$.source, FALSE, edges$from_mtime > edges$to_mtime)
117+
118+
# Propagate out-of-dateness
119+
edges_i <- edges
120+
for (i in 1:nrow(edges)) {
121+
edges_i <- merge(
122+
edges_i,
123+
edges_i[, c("from", "to", "to_mtime")],
124+
by.x = "to",
125+
by.y = "from",
126+
suffixes = c("", "2")
127+
)
128+
129+
edges_i$to <- edges_i$to2
130+
edges_i$to_mtime <- edges_i$to_mtime2
131+
edges_i$out_of_date <-
132+
ifelse(
133+
is.na(edges_i$from_mtime > edges_i$to_mtime),
134+
edges_i$out_of_date,
135+
edges_i$out_of_date | edges_i$from_mtime > edges_i$to_mtime
136+
)
137+
outdated <- edges_i[edges_i$out_of_date, "to"]
138+
edges$out_of_date <- (edges$to %in% outdated) | (edges$out_of_date)
139+
140+
edges_i <- edges_i[, names(edges)]
122141
}
123142

143+
124144
# Group
125145
nodes$group <- ifelse(nodes$id %in% edges[edges$out_of_date, "to"], "Out-of-date", "Up-to-date")
126146
nodes$group <- ifelse(nodes$id %in% edges[edges$.source, "to"], "Source", nodes$group)
@@ -143,6 +163,7 @@ Pipeline <- R6::R6Class(classname = "Pipeline", list(
143163
out <- visNetwork::visGroups(out, groupname = "Out-of-date", color = "#ffcaef")
144164
out <- visNetwork::visGroups(out, groupname = "Up-to-date", color = "#caffda")
145165
out <- visNetwork::visLegend(out)
166+
out <- visNetwork::visHierarchicalLayout(out, sortMethod = "directed", direction = "LR")
146167
print(out)
147168
invisible(self)
148169
},
@@ -156,6 +177,7 @@ Pipeline <- R6::R6Class(classname = "Pipeline", list(
156177
out <- visNetwork::visGroups(out, groupname = "Out-of-date", color = "#ffcaef")
157178
out <- visNetwork::visGroups(out, groupname = "Up-to-date", color = "#caffda")
158179
out <- visNetwork::visLegend(out)
180+
out <- visNetwork::visHierarchicalLayout(out, sortMethod = "directed", direction = "LR")
159181
visNetwork::visSave(out, file, ...)
160182
invisible(self)
161183
}

tests/testthat/test-Pipeline.R

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ test_that("Nodes correctly categorised as out-of-date", {
55
# Simple pipeline:
66
# dependency -> source -> target (out-of-date)
77
withr::with_tempfile(c("dependency", "target"), code = {
8+
set_pipeline(Pipeline$new())
89
saveRDS(iris, target)
910
Sys.sleep(0.1)
1011
saveRDS(iris, dependency)
@@ -21,6 +22,7 @@ test_that("Nodes correctly categorised as out-of-date", {
2122
# multi-stage pipeline:
2223
# dependency1 -> source -> target1 (out-of-date) --> source + dependency2 --> target2
2324
withr::with_tempfile(c("dependency1", "dependency2", "target1", "target2"), code = {
25+
set_pipeline(Pipeline$new())
2426
saveRDS(iris, dependency2)
2527
saveRDS(iris, target1)
2628
saveRDS(iris, target2)
@@ -40,6 +42,7 @@ test_that("Nodes correctly categorised as out-of-date", {
4042
# multi-stage pipeline:
4143
# dependency1 -> source -> target1 (out-of-date) --> recipe + dependency2 --> target2
4244
withr::with_tempfile(c("dependency1", "dependency2", "target1", "target2"), code = {
45+
set_pipeline(Pipeline$new())
4346
saveRDS(iris, dependency2)
4447
saveRDS(iris, target1)
4548
saveRDS(iris, target2)
@@ -57,3 +60,24 @@ test_that("Nodes correctly categorised as out-of-date", {
5760
})
5861
})
5962

63+
test_that("source files not invalidated", {
64+
# Source older than dependencies
65+
withr::with_tempfile(c("dependency", "target"), code = {
66+
set_pipeline(Pipeline$new())
67+
saveRDS(iris, dependency)
68+
Sys.sleep(0.1)
69+
source <- withr::local_tempfile(fileext = ".R")
70+
writeLines("2+2", source)
71+
Sys.sleep(0.1)
72+
saveRDS(iris, target)
73+
74+
make_with_source(source, target, dependency, quiet = TRUE)
75+
76+
nodes <- get_pipeline()$nodes
77+
78+
expect(
79+
all(nodes[nodes$id %in% target, "group"] %in% "Up-to-date"),
80+
"`target` should be up to date but isn't"
81+
)
82+
})
83+
})

0 commit comments

Comments
 (0)