A storage cache for pegboard::Lesson objects and other pre-computed items
for use by other internal functions while {sandpaper}
is working.
Usage
this_lesson(path)
clear_this_lesson()
set_this_lesson(path)
set_resource_list(path)
clear_resource_list(path)
Lesson Object Storage
this_lesson()
will return a pegboard::Lesson object if it has
previously been stored. There are three values that are cached:
.this_lesson
a pegboard::Lesson object.this_diff
a charcter vector fromgert::git_diff_patch()
.this_status
a data frame fromgert::git_status()
.this_commit
the hash of the most recent commit
The function this_lesson()
first checks if .this_diff
is different than
the output of gert::git_diff_patch()
, then checks if there are any
changes to gert::git_status()
, and then finally checks if the commits are
identical. If there are differences or the values are not previously
cached, the lesson is loaded into memory, otherwise, it is fetched from the
previously stored lesson.
The storage cache is in a global package object called .store
, which is
initialised when {sandpaper}
is loaded via .lesson_store()
If there have been no changes git is aware of, the lesson remains the same.
Pre-Computed Object Storage
A side-effect of this_lesson()
is that it will also initialise
pre-computed objects that pertain to the lesson itself. These are
initialised via set_globals()
. These storage objects are:
.resources
: a list of markdown resources for the lesson derived fromget_resource_list()
viaset_resource_list()
this_metadata
: metadata with template for including in the pages. initialised ininitialise_metadata()
viaset_globals()
learner_globals
: variables for the learner version of the pages initialised inset_globals()
instructor_globals
: variables for the instructor version of the pages initialised inset_globals()
Examples
tmp <- tempfile()
create_lesson(tmp, open = FALSE, rmd = FALSE)
#> → Creating Lesson in /tmp/RtmpeI6Keh/file16e5c7cb250...
#> ℹ No schedule set, using Rmd files in episodes/ directory.
#> → Creating Lesson in /tmp/RtmpeI6Keh/file16e5c7cb250...
#> → To remove this message, define your schedule in config.yaml or use `set_episodes()` to generate it.
#> → Creating Lesson in /tmp/RtmpeI6Keh/file16e5c7cb250...
#> ────────────────────────────────────────────────────────────────────────
#> → Creating Lesson in /tmp/RtmpeI6Keh/file16e5c7cb250...
#> ℹ To save this configuration, use
#>
#> set_episodes(path = path, order = ep, write = TRUE)
#> → Creating Lesson in /tmp/RtmpeI6Keh/file16e5c7cb250...
#> ☐ Edit /tmp/RtmpeI6Keh/file16e5c7cb250/episodes/introduction.md.
#> → Creating Lesson in /tmp/RtmpeI6Keh/file16e5c7cb250...
#> ✔ First episode created in /tmp/RtmpeI6Keh/file16e5c7cb250/episodes/introduction.md
#> → Creating Lesson in /tmp/RtmpeI6Keh/file16e5c7cb250...
#> ℹ Workflows up-to-date!
#> → Creating Lesson in /tmp/RtmpeI6Keh/file16e5c7cb250...
#> ✔ Lesson successfully created in /tmp/RtmpeI6Keh/file16e5c7cb250
#> → Creating Lesson in /tmp/RtmpeI6Keh/file16e5c7cb250...
#> /tmp/RtmpeI6Keh/file16e5c7cb250
# Read the lesson into cache
system.time(sandpaper:::this_lesson(tmp))
#> user system elapsed
#> 0.116 0.011 0.129
system.time(sandpaper:::this_lesson(tmp)) # less time to read in once cached
#> user system elapsed
#> 0.003 0.000 0.004
l <- sandpaper:::this_lesson(tmp)
l
#> <Lesson>
#> Public:
#> blocks: function (type = NULL, level = 0, path = FALSE)
#> built: NULL
#> challenges: function (path = FALSE, graph = FALSE, recurse = TRUE)
#> children: NULL
#> clone: function (deep = FALSE)
#> episodes: list
#> extra: list
#> files: active binding
#> get: function (element = NULL, collection = "episodes")
#> handout: function (path = NULL, solution = FALSE)
#> has_children: active binding
#> initialize: function (path = ".", rmd = FALSE, jekyll = TRUE, ...)
#> isolate_blocks: function ()
#> load_built: function ()
#> n_problems: active binding
#> overview: FALSE
#> path: /tmp/RtmpeI6Keh/file16e5c7cb250
#> reset: function ()
#> rmd: FALSE
#> sandpaper: TRUE
#> show_problems: active binding
#> solutions: function (path = FALSE)
#> summary: function (collection = "episodes")
#> thin: function (verbose = TRUE)
#> trace_lineage: function (episode_path)
#> validate_divs: function ()
#> validate_headings: function (verbose = TRUE)
#> validate_links: function ()
#> Private:
#> deep_clone: function (name, value)
# clear the cache
sandpaper:::clear_this_lesson()
system.time(sandpaper:::this_lesson(tmp)) # have to re-read the lesson
#> user system elapsed
#> 0.116 0.012 0.128
system.time(sandpaper:::this_lesson(tmp))
#> user system elapsed
#> 0.005 0.000 0.005
unlink(tmp)