Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Conversation

Ssunoo2
Copy link
Collaborator

@Ssunoo2 Ssunoo2 commented Apr 28, 2024

Script to call github refresh from the command line

@RavenMarQ RavenMarQ mentioned this pull request Dec 3, 2024
12 tasks
Copy link
Member

@carlosparadis carlosparadis left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

pointing out here the get and other files ahead of time, same issue as @daomcgill

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Make sure you revert this or sync to master

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same on revert to master

exec/github.R Outdated
save_path_issue_or_pr_comments <- paste0(save_path,"/issue_or_pr_comment/")
# Path you wish to save all raw data. A folder with the repo name and sub-folders will be created.
owner <- conf[["issue_tracker"]][["github"]][["owner"]] # Has to match github organization (e.g. github.com/sailuh)
repo <- conf[["issue_tracker"]][["github"]][["repo"]] # Has to match github repository (e.g. github.com/sailuh/perceive)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hardcoded get

To standardize github.R to match mailinglist.R executable. Also updated implementation to utilize the configuration get functions.
Includes steps to:
- download and parse data
- generate start and end activities and process tree

Signed-off-by: Connor Narowetz <[email protected]>
@connorn-dev
Copy link
Collaborator

@carlosparadis just added the code from Mbox. I kept github.R separate from my changes and added the vignette.

@carlosparadis
Copy link
Member

@connorn-dev sounds good i will go ahead and add a few quick notes as review to your code here

Copy link
Member

@carlosparadis carlosparadis left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here's some revision notes. Let me know if you have questions. I suggest you reply to the comment in question you want to iterate rather than an entirely separate comment so things are in context to the line of code.


# Introduction

Kaiaulu interface to Process Mining for Github events relies on [pm4py](https://github.com/process-intelligence-solutions/pm4py). This vignette demonstrates how to use Kaiaulu to interact with GitHub event data visually using pm4py for further analysis.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I suggest adding a bit of motivation on why someone should care about process mining and a summary of what you learned from the video I shared with you. OK to reference the video URL too.

exec/ghevents.R Outdated
if (arguments[["download"]] & arguments[["help"]]) {
cli::cli_alert_info("Downloads Github Events using R/github.R")
} else if (arguments[["download"]]) {
owner <- arguments[["<owner>"]]
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should use get() functions instead of direct access. See the cheat sheet associated to it for rationale on why.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So for example, to get the owner of the desired Github I should use "get_github_owner()" and rely on the configuration file for the users input?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The path to the configuration file should be passed to your /exec. However, to load the config from the path, and the subsequent accesses to get field information should use get() functions. The functions exist on R/config.R. if it doesn't exist, you should define new ones. See "accessing configs from Notebooks". That also applies to configs: https://github.com/sailuh/kaiaulu_cheatsheet/blob/main/cheatsheets/project-analysis-cheatsheet.pdf

mailing_list <- get_pipermail_domain(conf, project_key)
save_folder_path <- get_pipermail_path(conf, project_key)

Not all the code on PR is fully reviewed (I see Dao missed the config get to load the file), but it exists:

kaiaulu/R/config.R

Lines 21 to 30 in ac522b6

parse_config <- function(config_path) {
conf <- yaml::read_yaml(config_path)
if (is.null(conf)) {
warning("Path does not exist.")
}
return(conf)
}

See the cheatsheet linked above why we enforce the get() this was a major milestone for the Fall'24 group : )

### Install Reticulate

```{r}
install.packages("reticulate")
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You should not use reticulate. This is a strong dependency on Kaiaulu side. Rather, it is the Python script that should call this exec script.

- Provides more info on process mining
- Switched CLI to config file
- Switched to get functions from config file
- Added R/config.R to branch
- Added get csv path to R/config.R
- Added usage of CLI to github_api_showcase
- Changed to using Kaiaulu config for python notebook
- Cleaned up vignettes content
- Deleted process_mining.yml config file
- Deleted get_pm_csv_path function from R/config
- Updated NEWS.md with one sentence update for ghevents.R
- Contributor added to DESCRIPTION
Copy link
Member

@carlosparadis carlosparadis left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks fine on this side. Commits are blended to older PR so I can only do a cursory overview. Please disregard the request change, this is a note to self when I work on the merge over the Summer.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm. Up to this point notebooks document the API, not the execs. I will need to give more thought on this in the future.

Signed-off-by: Connor Narowetz <[email protected]>
cli::cli_alert_info("Parsing Github issue events from {input_dir}")

all_issue_event <- lapply(list.files(input_dir, full.names = TRUE), read_json)
all_issue_event <- lapply(all_issue_event, github_parse_project_issue_events)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@carlosparadis The function github_parse_project_issue_events is a R/github.R function but R/github.R is not sourced at the top

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice catch! Could you check if source is required for /exec to work? For R/ functions within an R package we do not need to use source, so it would be nice to check we are using the appropriate method for R packages specifically.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looking at the requirement list, I see:

https://github.com/sailuh/kaiaulu/blob/8b0582539bbb18b8d4d2f2e410abe554b4c5acba/exec/github.R#L12C17-L12C24

As Kaiaulu is an R package, all files in Kaiaulu and its API should be loaded using this command. Did the code not rn for you?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see my mistake; I haven't properly installed the packages and therefore I had to source both scripts. After installing the packages, it works as intended and sourcing those two scripts are no longer necessary.

github_events.R parse help
github_events.R parse <config_path> <output_file>
github_events.R (-h | --help)
github_events.R --version
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CLI docs still refer to github_events.R. To stay consistent with the actual script name, this should be updated to ghevents.R

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you check the other exec to see which should we stick with for consistency? E.g. if the others are all github_* then it may be best we move ghevents to github_events.R throughout the code.

require(knitr,quietly=TRUE)
require(magrittr,quietly=TRUE)
require(gt,quietly=TRUE)

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

source("R/config.R")
source("R/github.R")
should be added here since functions are called from those files.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see require above as opposed to source, is there a reason you are suggesting source instead of require? In Noteboks we also use require. I suspect this PR predates when we created the config module. It may be a good idea for you to also see the cheat sheet about configs as you will be relying n it when coding on the /exec folder. I.e. the cheat sheet should explain you why we decided to create a bunch of get_ functions to read the config instead of just parsing directly!

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looking at the requirement list, I see:

https://github.com/sailuh/kaiaulu/blob/8b0582539bbb18b8d4d2f2e410abe554b4c5acba/exec/github.R#L12C17-L12C24

As Kaiaulu is an R package, all files in Kaiaulu and its API should be loaded using this command. Did the code not rn for you?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see my mistake; I haven't properly installed the packages and therefore I had to source both scripts. After installing the packages, it works as intended and sourcing those two scripts are no longer necessary.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No worries, it is a common mistake!

github_api_iterate_pages(token,gh_response,
save_path_issue,
prefix="issue",
verbose = TRUE)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The call to github_api_iterate_pages() includes verbose = TRUE, but the function doesn’t accept a verbose argument. Consider removing verbose = TRUE here to fix the error. This also occurs in lines 80 and 90.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What about

if(verbose){
?

save_path_issue_or_pr_comments <- path.expand(get_github_issue_or_pr_comment_path(conf, project_key))

dir.create(save_path_issue_or_pr_comments)
github_api_iterate_pages(token,gh_response,
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

gh_response is used here but it isn't defined. Adding gh_response <- github_api_project_issue_or_pr_comments(owner, repo, token) before it is used within this else if block fixes it.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Isn't it defined on line 64? This is the entirety of the code block after it is defined:

kaiaulu/exec/github.R

Lines 64 to 90 in 8b05825

gh_response <- github_api_project_issue(owner,repo,token)
dir.create(save_path_issue)
github_api_iterate_pages(token,gh_response,
save_path_issue,
prefix="issue",
verbose = TRUE)
cli_alert_success(paste0("Downloaded new Github issues saved at: ", save_path_issue))
} else if(arguments [["--pr"]]){
save_path_pull_request <- get_github_pull_request_path(conf, project_key)
gh_response <- github_api_project_pull_request(owner,repo,token)
dir.create(save_path_pull_request)
github_api_iterate_pages(token,gh_response,
save_path_pull_request,
prefix="pull_request",
verbose = TRUE)
cli_alert_success(paste0("Downloaded new Github Pull Requests saved at: ", save_path_pull_request))
} else if(arguments [["--comments"]]){
save_path_issue_or_pr_comments <- path.expand(get_github_issue_or_pr_comment_path(conf, project_key))
dir.create(save_path_issue_or_pr_comments)
github_api_iterate_pages(token,gh_response,
save_path_issue_or_pr_comments,
prefix="issue_or_pr_comment",
verbose= TRUE)

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

gh_response in line 64 was defined within the scope of the 1st if block. Since gh_response was called in line 87 in the 3rd if block, it doesn't see gh_response.

I tested both scenarios where I'd add gh_response <- github_api_project_issue_or_pr_comments(owner, repo, token) in line 85 and one without it. The one without it gave me this error: Error: object 'gh_response' not found
Execution halted

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry, I replied without looking at the notebook. You are correct, this was likely an oversight: Every IF code block has more or less the same look and feel:

kaiaulu/exec/github.R

Lines 61 to 71 in 8b05825

if (arguments[["--issues"]]) {
save_path_issue <- get_github_issue_path(conf, project_key)
gh_response <- github_api_project_issue(owner,repo,token)
dir.create(save_path_issue)
github_api_iterate_pages(token,gh_response,
save_path_issue,
prefix="issue",
verbose = TRUE)
cli_alert_success(paste0("Downloaded new Github issues saved at: ", save_path_issue))

and

kaiaulu/exec/github.R

Lines 72 to 82 in 8b05825

} else if(arguments [["--pr"]]){
save_path_pull_request <- get_github_pull_request_path(conf, project_key)
gh_response <- github_api_project_pull_request(owner,repo,token)
dir.create(save_path_pull_request)
github_api_iterate_pages(token,gh_response,
save_path_pull_request,
prefix="pull_request",
verbose = TRUE)
cli_alert_success(paste0("Downloaded new Github Pull Requests saved at: ", save_path_pull_request))

both have ghresponse.

However the one you pointed out is missing:

kaiaulu/exec/github.R

Lines 83 to 92 in 8b05825

} else if(arguments [["--comments"]]){
save_path_issue_or_pr_comments <- path.expand(get_github_issue_or_pr_comment_path(conf, project_key))
dir.create(save_path_issue_or_pr_comments)
github_api_iterate_pages(token,gh_response,
save_path_issue_or_pr_comments,
prefix="issue_or_pr_comment",
verbose= TRUE)
cli_alert_success(paste0("Downloaded new Github issue or PR comments saved at: ", save_path_issue_or_pr_comments))

Meaning no data is being downloaded here. So this is a mistake. Please add the line here. Also thank you for trying to run the code while reviewing it (sometimes people don't! )

I also recommend you give some thought about all these GitHub endpoints we use:

We have a few for issues and a few for PR. The issue endpoints are for issue body and issue comment. However, the PR is far more complicated than what appears on the surface. We spent a lot of time making a cheatsheet about it. I encourage you take a look: https://github.com/sailuh/kaiaulu_cheatsheet/blob/eda5e0017419a2746fe823156c19798ae862fe76/cheatsheets/github-comments-cheatsheet.pdf

As you can see, there is a fair amount of cheatsheets around Kaiaulu. As you learn from them, use it as an exercise to consider what is the best visual representation to convey an idea without using too many words. Just imagine how many meetings we would need or walls of text absent all the cheatsheets I shared over the past 10 minutes across the comments!

@carlosparadis
Copy link
Member

This is good progress, thank you for doing the code review. Have you downloaded this branch, and tried to run this exec yet?

Copy link
Collaborator

@geraldmjhuff geraldmjhuff left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@carlosparadis Made comments on the event_process_mining.Rmd and github_api_showcase.Rmd notebooks

command <- 'Rscript exec/ghevents.R download conf/process_mining.yml --token_path=~/.ssh/github_token'
system(command)
command <- 'Rscript exec/ghevents.R parse ../output ../output.csv'
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Assuming this notebook runs in the vignettes directory, lines 50 and 53 contains exec/ghevents.R which should be changed to ../exec/ghevents.R since to run that the ghevents.R script it has to move one directory up before it can access exec/ghevents.R. If these commands are supposed to be ran in the root directory, this can be ignored.

Same should be applied to conf/process_mining.yml, instead it should be ../conf/process_mining.yml to access the conf folder if this notebook were to be ran in vignettes directory.

Note: process_mining.yml does not currently exist within this branch nor the master branch. I had to temporarily change process_mining.yml to kaiaulu.yml to test this notebook. Pushing this PR to master branch when process_mining.yml does not exist on either branch could be misleading.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for catching this. Unfortunately, this notebook implementation is incorrect. So I am glad you found it and asked me about it to avoid also doing the same. You see, the R notebook in Kaiaulu purpose is to explain to the user how to use Kaiaulu API (functions in R/) to write their own analysis. So, although the code here is functional, it is not complying to Kaiaulu architecture. There is also no reason to use the script when the user can just use the R function, it is an R notebook afterall.

The place which the exec should be used is outside Kaiaulu. This generally makes more sense if you are using another language, in which case you will not have the ability to call an R function directly or it is less desirable. For example, @austindang67 would want to issue a command line call to Kaiaulu to get the data he needs. This also keeps his side of the code clean on the frontend (the only responsability of the frontend is to request data from Kaiaulu, not preprocess it, etc).

Does that make sense? So the fix here would be to go to the script exec/ghevents.R and bring in the code block that is calling functions there into the notebook. In the notebook you may have a few code blocks and english around the code blocks explaining it.

Or is this code just cited here to acknowledge it exists and the rest of the notebook goes API function-wise?

Copy link
Collaborator

@geraldmjhuff geraldmjhuff Oct 2, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In that case, we can leave the ghevents.R CLI commands as it is so people can see how to run the steps outside of R but exclude those commands from being ran in a code chunk since we do not want it to run in the notebook. Right after, we show the same steps using R functions that is implemented in a runnable code chunk. This way, people can learn both how the CLI works and how to do it in R.

Directly under the CLI commands, we can implement the R API functions equivalent of the CLI commands with the proper text:

In this notebook, the following code chunk shows the equivalent workflow using Kaiaulu R API functions, which can be run interactively and reproduces the same results as the CLI commands.

# Equivalent workflow using Kaiaulu R API functions.
# This can be run interactively and reproduces the same results as the CLI commands.
library(kaiaulu)
library(data.table)
library(jsonlite)

conf <- parse_config("../conf/process_mining.yml")
owner <- get_github_owner(conf, "project_key_1")
repo <- get_github_repo(conf, "project_key_1")
save_path <- get_github_issue_event_path(conf, "project_key_1")
token_path <- "~/.ssh/github_token"
output_file <- "../output.csv"

token <- scan(token_path, what="character", quiet=TRUE)
if(!dir.exists(save_path)) dir.create(save_path, recursive=TRUE)

# Download GitHub issue events 
gh_response <- github_api_project_issue_events(owner, repo, token)
github_api_iterate_pages(token, gh_response, save_path, prefix="issue_event")

#  Parse downloaded JSON files 
json_files <- list.files(save_path, full.names=TRUE)
all_issue_event <- lapply(json_files, read_json)
all_issue_event <- lapply(all_issue_event, github_parse_project_issue_events)
all_issue_event <- rbindlist(all_issue_event, fill=TRUE)
all_issue_event[, issue_body := NULL]

write.csv(all_issue_event, output_file, row.names=FALSE)

I've tested this implementation (with ../conf/kaiaulu.yml since process_mining.yml does not exist) in my code space in place of the two commands and it yielded the same results. I've also included comments to show what parts of the code downloads and parses. Also the config process_mining.yml is being parsed here, considering that .yml currently does not exist in this branch, should it be changed to kaiaulu.yml?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@carlosparadis I'm pinging now in the case you were not notified of my above comment ^

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I missed this.

I suggest you still remove the CLI mention altogether. The main concern here is that, should the CLI be changed in the future (as you are doing now), we will need to keep tabs on which Notebook may be trying to explain it. If we forget it, then it becomes outdated. This type of implicit dependency is hard to manage, hence the requirement to keep the Notebooks as API only.

The project configuration file, however, I do feel we should explain at the start, as it clarifies what information is needed to run the notebook and the API specifically.

Also the config process_mining.yml is being parsed here, considering that .yml currently does not exist in this branch, should it be changed to kaiaulu.yml?

Presuming you will need to merge master into this branch (note who is being merged to who) in order to eventually merge this PR to master, wouldn't kaiaulu.yml be added here at that point?

# your file github_token contains the GitHub token API obtained in the steps above
token <- scan("~/.ssh/github_token",what="character",quiet=TRUE)
```

Copy link
Collaborator

@geraldmjhuff geraldmjhuff Sep 30, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@carlosparadis
In save_path <- path.expand(conf[["issue_tracker"]][["github"]][["replies"]]) , tries to access "replies" in kaiaulu.yml but that key does not exist.

Edit 1: Additionally, if the replies key were to be implemented in kaiaulu.yml, we also have to access "project_key_1" before reaching "replies". Therefore, if the "replies" key is implemented, the code should be save_path <- path.expand(conf[["issue_tracker"]][["github"]][["project_key_1"]][["replies"]]) instead.

Edit 2: The lines:
owner <- conf[["issue_tracker"]][["github"]][["owner"]]
repo <- conf[["issue_tracker"]][["github"]][["repo"]]
has to be changed to:
owner <- conf[["issue_tracker"]][["project_key_1"]][["github"]][["owner"]]
repo <- conf[["issue_tracker"]][["project_key_1"]][["github"]][["repo"]]

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is also outdated code, so thank you for catching this. The notebook should not be accessing directly the attributes of the conf folder. Rather, it should be using the get() functions defined in R/conf.R. The reason for that is simple: The conf architecture (the layout of how information is formatted) changes from time to time. You can imagine that every time that file changes, well, everything on Kaiaulu has to change which is a massive undertake.

A few sessions back, one group worked on an interface to access the fields using get() functions. Please have a look on this cheatsheet: https://github.com/sailuh/kaiaulu_cheatsheet/blob/main/cheatsheets/project-analysis-cheatsheet.pdf on the middle top, "Accessing Configs from Notebooks". It goes over that.

So the fix here is to replace the functions with get() from R/config.R.

I also hope you see here why the data cheatsheets exist for when you get around working on yours: They simplify conceptual design decisions we made in Kaiaulu that prevent the code to devolve into chaos. Once you understand the underlying idea there, you can apply the principle when writing your own code.

Good work on finding these issues!

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The lines 47 to 49 can be replaced with:

owner <- get_github_owner(conf, "project_key_1") # Has to match github organization (e.g. github.com/sailuh)
repo <- get_github_repo(conf,"project_key_1") # Has to match github repository (e.g. github.com/sailuh/perceive)
save_path <- path.expand(get_github_issue_or_pr_comment_path(conf, "project_key_1")) # Path you wish to save all raw data. A folder with the repo name and sub-folders will be created. 

This uses the get() functions from R/config.R which is functionally equivalent.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@carlosparadis I'm pinging now in the case you were not notified of my above comment ^

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If the get() functions already exist, I agree you can proceed with this!

github parse help
github parse <project_conf.yml> <save_file_name_path> [--issues | --comments | --pr]
github refresh help
github refresh <project_conf.yml> <project_key> [--issues | --comments | --pr]
Copy link
Collaborator

@geraldmjhuff geraldmjhuff Sep 30, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Parse commands require running refresh first to download the GitHub JSON files; otherwise, CSV outputs will be empty. For documentation purposes, it would be better if the refresh commands are above the parse commands in this documentation in the case that the user wants to run these in a linear order.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This makes a lot of sense, please implement this change. I am also glad you encountered the refresh feature here. This also has a cheatsheet: https://github.com/sailuh/kaiaulu_cheatsheet/blob/main/cheatsheets/refresher-cheatsheet.pdf

Please take a look so you understand the core idea of why we named it "refresh". It is just an idea to simplify how users can get data without having to re-download everything and keeping on .csv files rather than add a whole database requirement to setup Kaiaulu. This was also a prior student group contribution!

Nice catch!

Refresh commands now above parse commands in the case user wants to run these in a linear order.
Added gh_response <- github_api_project_issue_or_pr_comments(owner, repo, token) which was originally missing.
…e.Rmd

Replaced multiple hardcoded config access lines with get_* functions that functionally yield same results.
Removed CLI related documentation and code chunks to follow Kaiaulu notebooks API only architecture.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants