Skip to content

Commit 42aa8a2

Browse files
committed
Add r_repos* functions. Add github_depend* functions
1 parent 260d5c8 commit 42aa8a2

23 files changed

+616
-114
lines changed

DESCRIPTION

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@ Imports:
3434
data.table,
3535
stringr,
3636
testthat (>= 3.0.0),
37-
RCurl
37+
RCurl,
38+
rvest
3839
Suggests:
3940
markdown,
4041
rmarkdown,
@@ -45,12 +46,12 @@ Suggests:
4546
covr,
4647
badger,
4748
hexSticker,
48-
httr,
49-
rvest,
49+
httr,
5050
BiocManager,
5151
githubinstall,
5252
UpSetR,
53-
grDevices
53+
grDevices,
54+
dlstats (>= 0.1.6)
5455
RoxygenNote: 7.2.3
5556
VignetteBuilder: knitr
5657
License: GPL-3

NAMESPACE

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ export(description_extract)
44
export(description_find)
55
export(github_branches)
66
export(github_commits)
7+
export(github_dependencies)
78
export(github_dependents)
89
export(github_files)
910
export(github_files_download)
@@ -15,14 +16,20 @@ export(github_pages_vignettes)
1516
export(github_permissions)
1617
export(github_traffic)
1718
export(r_repos)
19+
export(r_repos_data)
20+
export(r_repos_downloads)
21+
export(r_repos_opts)
1822
export(readme_header)
1923
importFrom(data.table,":=")
2024
importFrom(data.table,.SD)
2125
importFrom(data.table,as.data.table)
2226
importFrom(data.table,data.table)
27+
importFrom(data.table,dcast)
2328
importFrom(data.table,fwrite)
29+
importFrom(data.table,merge.data.table)
2430
importFrom(data.table,rbindlist)
2531
importFrom(data.table,setnafill)
32+
importFrom(data.table,setnames)
2633
importFrom(gh,gh)
2734
importFrom(gh,gh_token)
2835
importFrom(methods,is)
@@ -31,6 +38,7 @@ importFrom(parallel,mclapply)
3138
importFrom(stats,setNames)
3239
importFrom(stringr,str_split)
3340
importFrom(testthat,is_testing)
41+
importFrom(utils,available.packages)
3442
importFrom(utils,download.file)
3543
importFrom(utils,installed.packages)
3644
importFrom(utils,packageDescription)

NEWS.md

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,22 @@
22

33
## New features
44

5-
* New functions:
5+
* New GitHub functions:
66
- `github_permissions`
77
- `github_metadata`
88
- `github_commits`
99
- `github_traffic`
10+
- `github_dependents`
11+
- `github_dependencies`
12+
* New functions for finding which repos R packages are in:
1013
- `r_repos`
14+
- `r_repos_data`
15+
- `r_repos_downloads`
16+
- `r_repos_opts`
17+
18+
## Bug fixes
19+
20+
* Elevate `rvest` to *Imports*.
1121

1222
# echogithub 0.99.0
1323

R/github_dependencies.R

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
#' GitHub dependents
2+
#'
3+
#' Get all GitHub repositories that are dependent on the target
4+
#' GitHub repository.
5+
#' @inheritParams github_files
6+
#' @return A \link[data.table]{data.table}.
7+
#'
8+
#' @export
9+
#' @importFrom data.table data.table
10+
#' @importFrom stringr str_split
11+
#' @examples
12+
#' dt <- github_dependencies(owner = "neurogenomics",
13+
#' repo = "rworkflows")
14+
github_dependencies <- function(owner,
15+
repo,
16+
token = gh::gh_token(),
17+
verbose = TRUE) {
18+
# echoverseTemplate:::source_all()
19+
# echoverseTemplate:::args2vars(github_insights)
20+
21+
requireNamespace("rvest")
22+
type <- NULL;
23+
## NOTE: GitHub API does not currently support getting deps from repo,
24+
## so need to use webscraping instead.
25+
messager("Searching for dependents of:",paste(owner,repo,sep="/"),
26+
v=verbose)
27+
#### Get latest commit ####
28+
URL <- paste("https://github.com",owner,repo,"network/dependencies",
29+
sep = "/")
30+
html <- rvest::read_html(URL)
31+
boxes <- rvest::html_elements(html,".Box")
32+
boxes <- boxes[rvest::html_attr(boxes,"class")=="Box mb-3"]
33+
dt <- lapply(boxes, function(box){
34+
#### Get workflow name ####
35+
workflow_url <- paste0("https://github.com",
36+
(rvest::html_elements(box,".Box-header") |>
37+
rvest::html_elements(".Link--primary") |>
38+
rvest::html_attr("href")))
39+
#### Get workflow dependencies ####
40+
box_rows <- rvest::html_children(box) |>
41+
rvest::html_elements(".Box-row")
42+
d <- lapply(box_rows, function(r){
43+
data.table::data.table(
44+
action = r |>
45+
rvest::html_elements("a") |>
46+
rvest::html_attr("href") |>
47+
trimws(whitespace = "/"),
48+
action_url = paste0("https://github.com",
49+
r |>
50+
rvest::html_elements("a") |>
51+
rvest::html_attr("href")
52+
),
53+
subaction = r |>
54+
rvest::html_elements("small") |>
55+
rvest::html_text(),
56+
type = r |>
57+
rvest::html_elements("a") |>
58+
rvest::html_attr("data-hovercard-type"),
59+
count = r |>
60+
rvest::html_elements(".d-flex") |>
61+
rvest::html_elements("code") |>
62+
rvest::html_text()
63+
)[type=="repository",][,-c("type")]
64+
}) |>
65+
data.table::rbindlist(fill=TRUE)
66+
cbind(
67+
target=paste(owner,repo,sep="/"),
68+
workflow=basename(workflow_url),
69+
workflow_url=workflow_url,
70+
d)
71+
}) |> data.table::rbindlist(fill = TRUE)
72+
## Unsure why some rows have the branch name instead of a number.
73+
#### Report ####
74+
messager("Found",formatC(nrow(dt),big.mark = ","),
75+
"dependencies across",
76+
formatC(dt$workflow,big.mark = ","),"workflows.",v=verbose)
77+
#### Return ####
78+
return(dt)
79+
}

R/github_dependents.R

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,5 +38,9 @@ github_dependents <- function(owner,
3838
data.table::data.table() |>
3939
`colnames<-`(c("owner","repo","stargazers_count","forks_count"))
4040
dt <- cbind(target=paste(owner,repo,sep="/"),dt)
41+
#### Report ####
42+
messager("Found",formatC(nrow(dt),big.mark = ","),
43+
"dependents.",v=verbose)
44+
#### Return ####
4145
return(dt)
4246
}

R/github_metadata.R

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@
1313
#' dt <- github_metadata(owner="RajLabMSSM",
1414
#' repo="echolocatoR")
1515
github_metadata <- function(owner,
16-
repo,
17-
add_traffic = FALSE,
18-
token = gh::gh_token(),
19-
verbose = TRUE) {
16+
repo,
17+
add_traffic = FALSE,
18+
token = gh::gh_token(),
19+
verbose = TRUE) {
2020
# echoverseTemplate:::source_all()
2121
# echoverseTemplate:::args2vars(github_metadata)
2222

R/r_repos.R

Lines changed: 46 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,65 @@
11
#' R repositories
22
#'
33
#' Report on which repositories R packages are distributed through
4-
#' (e.g. CRAN, Bioc, rOpenSci, and/or GitHub).
4+
#' (i.e. base R, CRAN, Bioc, rOpenSci, R-Forge, and/or GitHub).
5+
#' @param which Which R repositories to extract data from.
6+
#' @param upset_plot Whether to create an upset plot
7+
#' showing R package overlap between repositories.
8+
#' @param show_plot Print the plot.
59
#' @param save_path Path to save upset plot to.
610
#' @param verbose Print messages.
11+
#' @inheritParams BiocManager::repositories
712
#' @returns Named list.
813
#'
914
#' @export
1015
#' @importFrom data.table data.table
1116
#' @examples
1217
#' report <- r_repos()
13-
r_repos <- function(save_path=tempfile(pattern = "upsetr.pdf"),
18+
r_repos <- function(which=r_repos_opts(),
19+
version=NULL,
20+
upset_plot=TRUE,
21+
show_plot=TRUE,
22+
save_path=tempfile(fileext = "upsetr.pdf"),
1423
verbose=TRUE){
1524

16-
requireNamespace("UpSetR")
25+
if(isTRUE(upset_plot)) requireNamespace("UpSetR")
1726
total <- percent_all <- percent_exclusive <-
1827
count_exclusive <- count_all <- count_exclusive <- NULL;
1928

2029
#### Gather data ####
21-
pkgs <- r_repos_data(verbose = verbose)
30+
pkgs <- r_repos_data(which = which,
31+
version = version,
32+
verbose = verbose)
2233
#### Upset plot ####
23-
upset <- r_repos_upset(pkgs = pkgs,
24-
save_path = save_path,
25-
verbose = verbose,
26-
sets.bar.color = "slategrey",
27-
main.bar.color = "slategrey",
28-
text.scale = 1.5,
29-
queries = list(list(query = UpSetR::intersects,
30-
params = list("GitHub"),
31-
color = "darkred",
32-
active = TRUE))
33-
)
34-
upset_data <- upset$data
35-
#### Compute percentages ####
36-
stats_1repo <- colSums(upset_data[rowSums(upset_data)==1,])
37-
repo_stats <- data.table::data.table(
38-
repo=names(stats_1repo),
39-
total=length(unique(pkgs$package)),
40-
count_all=colSums(upset_data),
41-
count_exclusive=stats_1repo
42-
)[,percent_all:=(
43-
count_all/total*100)][,percent_exclusive:=(
44-
count_exclusive/total*100)]
45-
#### Return ####
46-
return(list(pkgs=pkgs,
47-
repo_stats=repo_stats,
48-
upset=upset))
34+
if(isTRUE(upset_plot)){
35+
upset <- r_repos_upset(pkgs = pkgs,
36+
save_path = save_path,
37+
show_plot = show_plot,
38+
verbose = verbose,
39+
sets.bar.color = "slategrey",
40+
main.bar.color = "slategrey",
41+
text.scale = 1.5,
42+
queries = list(list(query = UpSetR::intersects,
43+
params = list("GitHub"),
44+
color = "darkred",
45+
active = TRUE))
46+
)
47+
upset_data <- upset$data
48+
#### Compute percentages ####
49+
stats_1repo <- colSums(upset_data[rowSums(upset_data)==1,])
50+
repo_stats <- data.table::data.table(
51+
r_repo=names(stats_1repo),
52+
total=length(unique(pkgs$package)),
53+
count_all=colSums(upset_data),
54+
count_exclusive=stats_1repo
55+
)[,percent_all:=(
56+
count_all/total*100)][,percent_exclusive:=(
57+
count_exclusive/total*100)]
58+
#### Return ####
59+
return(list(pkgs=pkgs,
60+
repo_stats=repo_stats,
61+
upset=upset))
62+
} else {
63+
return(pkgs)
64+
}
4965
}

0 commit comments

Comments
 (0)