diff --git a/.github/workflows/README.md b/.github/workflows/README.md index 101967e4..7076ddd9 100644 --- a/.github/workflows/README.md +++ b/.github/workflows/README.md @@ -2,7 +2,7 @@ This directory contains workflows to be used for Lessons using the {sandpaper} lesson infrastructure. Two of these workflows require R (`sandpaper-main.yaml` -and `pr-recieve.yaml`) and the rest are bots to handle pull request management. +and `pr-receive.yaml`) and the rest are bots to handle pull request management. These workflows will likely change as {sandpaper} evolves, so it is important to keep them up-to-date. To do this in your lesson you can do the following in your @@ -94,9 +94,9 @@ branch called `update/workflows` and a pull request is created. Maintainers are encouraged to review the changes and accept the pull request if the outputs are okay. -This update is run ~~weekly or~~ on demand. +This update is run weekly or on demand. -### 03 Maintain: Update Pacakge Cache (update-cache.yaml) +### 03 Maintain: Update Package Cache (update-cache.yaml) For lessons that have generated content, we use {renv} to ensure that the output is stable. This is controlled by a single lockfile which documents the packages @@ -140,7 +140,7 @@ Once the checks are finished, a comment is issued to the pull request, which will allow maintainers to determine if it is safe to run the "Receive Pull Request" workflow from new contributors. -### Recieve Pull Request (pr-recieve.yaml) +### Receive Pull Request (pr-receive.yaml) **Note of caution:** This workflow runs arbitrary code by anyone who creates a pull request. GitHub has safeguarded the token used in this workflow to have no @@ -171,7 +171,7 @@ The artifacts produced are used by the next workflow. ### Comment on Pull Request (pr-comment.yaml) -This workflow is triggered if the `pr-recieve.yaml` workflow is successful. +This workflow is triggered if the `pr-receive.yaml` workflow is successful. The steps in this workflow are: 1. Test if the workflow is valid and comment the validity of the workflow to the diff --git a/.github/workflows/pr-close-signal.yaml b/.github/workflows/pr-close-signal.yaml index 9b129d5d..b1303c26 100644 --- a/.github/workflows/pr-close-signal.yaml +++ b/.github/workflows/pr-close-signal.yaml @@ -8,7 +8,7 @@ on: jobs: send-close-signal: name: "Send closing signal" - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 if: ${{ github.event.action == 'closed' }} steps: - name: "Create PRtifact" @@ -16,8 +16,7 @@ jobs: mkdir -p ./pr printf ${{ github.event.number }} > ./pr/NUM - name: Upload Diff - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: pr path: ./pr - diff --git a/.github/workflows/pr-comment.yaml b/.github/workflows/pr-comment.yaml index bb2eb03c..f80d9d0c 100644 --- a/.github/workflows/pr-comment.yaml +++ b/.github/workflows/pr-comment.yaml @@ -20,7 +20,7 @@ jobs: # - no .github files were committed test-pr: name: "Test if pull request is valid" - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 if: > github.event.workflow_run.event == 'pull_request' && github.event.workflow_run.conclusion == 'success' @@ -74,7 +74,7 @@ jobs: create-branch: name: "Create Git Branch" needs: test-pr - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 if: ${{ needs.test-pr.outputs.is_valid == 'true' }} env: NR: ${{ needs.test-pr.outputs.number }} @@ -82,7 +82,7 @@ jobs: contents: write steps: - name: 'Checkout md outputs' - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: ref: md-outputs path: built @@ -120,7 +120,7 @@ jobs: comment-pr: name: "Comment on Pull Request" needs: [test-pr, create-branch] - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 if: ${{ needs.test-pr.outputs.is_valid == 'true' }} env: NR: ${{ needs.test-pr.outputs.number }} @@ -150,7 +150,7 @@ jobs: comment-changed-workflow: name: "Comment if workflow files have changed" needs: test-pr - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 if: ${{ always() && needs.test-pr.outputs.is_valid == 'false' }} env: NR: ${{ github.event.workflow_run.pull_requests[0].number }} @@ -182,4 +182,3 @@ jobs: with: pr: ${{ env.NR }} body: ${{ env.body }} - diff --git a/.github/workflows/pr-post-remove-branch.yaml b/.github/workflows/pr-post-remove-branch.yaml index 62c2e98d..9419e2be 100644 --- a/.github/workflows/pr-post-remove-branch.yaml +++ b/.github/workflows/pr-post-remove-branch.yaml @@ -9,7 +9,7 @@ on: jobs: delete: name: "Delete branch from Pull Request" - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 if: > github.event.workflow_run.event == 'pull_request' && github.event.workflow_run.conclusion == 'success' diff --git a/.github/workflows/pr-preflight.yaml b/.github/workflows/pr-preflight.yaml index d0d7420d..34ad7aed 100644 --- a/.github/workflows/pr-preflight.yaml +++ b/.github/workflows/pr-preflight.yaml @@ -11,7 +11,7 @@ jobs: test-pr: name: "Test if pull request is valid" if: ${{ github.event.action != 'closed' }} - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 outputs: is_valid: ${{ steps.check-pr.outputs.VALID }} permissions: diff --git a/.github/workflows/pr-receive.yaml b/.github/workflows/pr-receive.yaml index 371ef542..7fbff6cd 100644 --- a/.github/workflows/pr-receive.yaml +++ b/.github/workflows/pr-receive.yaml @@ -13,7 +13,7 @@ jobs: test-pr: name: "Record PR number" if: ${{ github.event.action != 'closed' }} - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 outputs: is_valid: ${{ steps.check-pr.outputs.VALID }} steps: @@ -25,7 +25,7 @@ jobs: - name: "Upload PR number" id: upload if: ${{ always() }} - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: pr path: ${{ github.workspace }}/NR @@ -48,7 +48,7 @@ jobs: build-md-source: name: "Build markdown source files if valid" needs: test-pr - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 if: ${{ needs.test-pr.outputs.is_valid == 'true' }} env: GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} @@ -58,10 +58,10 @@ jobs: MD: ${{ github.workspace }}/site/built steps: - name: "Check Out Main Branch" - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: "Check Out Staging Branch" - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: ref: md-outputs path: ${{ env.MD }} @@ -107,20 +107,21 @@ jobs: shell: Rscript {0} - name: "Upload PR" - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: pr path: ${{ env.PR }} + overwrite: true - name: "Upload Diff" - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: diff path: ${{ env.CHIVE }} retention-days: 1 - name: "Upload Build" - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: built path: ${{ env.MD }} diff --git a/.github/workflows/sandpaper-main.yaml b/.github/workflows/sandpaper-main.yaml index e17707ac..b3d1de8c 100644 --- a/.github/workflows/sandpaper-main.yaml +++ b/.github/workflows/sandpaper-main.yaml @@ -21,7 +21,10 @@ on: jobs: full-build: name: "Build Full Site" - runs-on: ubuntu-latest + + # 2024-10-01: ubuntu-latest is now 24.04 and R is not installed by default in the runner image + # pin to 22.04 for now + runs-on: ubuntu-22.04 permissions: checks: write contents: write @@ -32,7 +35,7 @@ jobs: steps: - name: "Checkout Lesson" - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: "Set up R" uses: r-lib/actions/setup-r@v2 diff --git a/.github/workflows/sandpaper-version.txt b/.github/workflows/sandpaper-version.txt index ce62dc55..084c7bd0 100644 --- a/.github/workflows/sandpaper-version.txt +++ b/.github/workflows/sandpaper-version.txt @@ -1 +1 @@ -0.16.9 +0.16.10 diff --git a/.github/workflows/update-cache.yaml b/.github/workflows/update-cache.yaml index 676d7424..a011c0c0 100644 --- a/.github/workflows/update-cache.yaml +++ b/.github/workflows/update-cache.yaml @@ -14,7 +14,7 @@ on: jobs: preflight: name: "Preflight Check" - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 outputs: ok: ${{ steps.check.outputs.ok }} steps: @@ -36,14 +36,14 @@ jobs: check_renv: name: "Check if We Need {renv}" - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 needs: preflight if: ${{ needs.preflight.outputs.ok == 'true'}} outputs: needed: ${{ steps.renv.outputs.exists }} steps: - name: "Checkout Lesson" - uses: actions/checkout@v3 + uses: actions/checkout@v4 - id: renv run: | if [[ -d renv ]]; then @@ -52,7 +52,7 @@ jobs: check_token: name: "Check SANDPAPER_WORKFLOW token" - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 needs: check_renv if: ${{ needs.check_renv.outputs.needed == 'true' }} outputs: @@ -69,14 +69,14 @@ jobs: name: "Update Package Cache" needs: check_token if: ${{ needs.check_token.outputs.repo== 'true' }} - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 env: GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} RENV_PATHS_ROOT: ~/.local/share/renv/ steps: - name: "Checkout Lesson" - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: "Set up R" uses: r-lib/actions/setup-r@v2 diff --git a/.github/workflows/update-workflows.yaml b/.github/workflows/update-workflows.yaml index 288bcd13..6414cf28 100644 --- a/.github/workflows/update-workflows.yaml +++ b/.github/workflows/update-workflows.yaml @@ -18,7 +18,7 @@ on: jobs: check_token: name: "Check SANDPAPER_WORKFLOW token" - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 outputs: workflow: ${{ steps.validate.outputs.wf }} repo: ${{ steps.validate.outputs.repo }} @@ -31,12 +31,12 @@ jobs: update_workflow: name: "Update Workflow" - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 needs: check_token if: ${{ needs.check_token.outputs.workflow == 'true' }} steps: - name: "Checkout Repository" - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Update Workflows id: update diff --git a/README.md b/README.md index 2db2b3b2..2bacdee1 100644 --- a/README.md +++ b/README.md @@ -5,8 +5,13 @@ A lesson on creating and publishing packages in Python, implemented using the The website can be built locally using: -```bash -$ Rscript build_script.R +```R +rmarkdown::pandoc_version() +tmp <- tempfile() +sandpaper::no_package_cache() +sandpaper::create_lesson(tmp, open = FALSE) +sandpaper::build_lesson(tmp, preview = FALSE) +sandpaper::serve() ``` Please consult the Carpentries Workbench docs for info on setting up your R environment. diff --git a/build_script.R b/build_script.R deleted file mode 100644 index 3a645463..00000000 --- a/build_script.R +++ /dev/null @@ -1,11 +0,0 @@ -# Run with Rscript build_script.R -# Prints the location of the site to terminal. -# Use Ctrl+C to stop. -# See https://carpentries.github.io/sandpaper-docs/ - -rmarkdown::pandoc_version() -tmp <- tempfile() -sandpaper::no_package_cache() -sandpaper::create_lesson(tmp, open = FALSE) -sandpaper::build_lesson(tmp, preview = FALSE) -sandpaper::serve() diff --git a/config.yaml b/config.yaml index fd85d2da..cd7b6e90 100644 --- a/config.yaml +++ b/config.yaml @@ -2,13 +2,12 @@ # Values for this lesson. #------------------------------------------------------------ -# Which carpentry is this (swc, dc, lc, or cp)? -# swc: Software Carpentry -# dc: Data Carpentry -# lc: Library Carpentry -# cp: Carpentries (to use for instructor traning for instance) -# incubator: The Carpentries Incubator -carpentry: incubator +# Which carpentry is this (swc, dc, lc, or cp)? < REPLACED with UNIMELB institutes > +# uom: University of Melbourne +# mb: Melbourne Bioinformatics +# mig: Melbourne Integrative Genomics +# wehi: Walter and Eliza Hall Institute +carpentry: 'wehi' # Overall title for pages. title: Python Packaging @@ -33,7 +32,7 @@ source: https://github.com/carpentries-incubator/python_packaging/ branch: main # Who to contact if there are any issues -contact: liam.pattinson@york.ac.uk +contact: adam.taranto@unimelb.edu.au # Navigation ------------------------------------------------ # @@ -69,3 +68,14 @@ instructors: # Learner Profiles profiles: +# Customisation --------------------------------------------- +# +# This space below is where custom yaml items (e.g. pinning +# sandpaper and varnish versions) should live + +analytics: carpentries +lang: en + +# This is the MB varnish, which is a custom version of the Carpentries varnish +varnish: 'melbournebioinformatics/uom-varnish@main' + diff --git a/episodes/01-scripts-and-modules.Rmd b/episodes/01-scripts-and-modules.Rmd index c283a7ed..fe77de25 100644 --- a/episodes/01-scripts-and-modules.Rmd +++ b/episodes/01-scripts-and-modules.Rmd @@ -518,6 +518,8 @@ the module is stored on our file system, which can make it difficult to reuse th functions in a separate project. A simple solution is to set the `PYTHONPATH` environment variable on our system. On Linux machines, this can be achieved using: +TODO: Add an example here where we change dir and then try to import a module. This will fail without setting python path. + ```bash $ export PYTHONPATH="${PYTHONPATH}:/path/to/my/module/directory" ``` @@ -626,6 +628,8 @@ for now. ## Extra: Better scripting with `argparse` +TODO: split arg parsing off into a separate episode + We showed earlier how to maintain script-like functionality in our modules. We'll update that code to include our updated plotting function, so we'll automatically save to a file if the user runs our script: diff --git a/episodes/02-packages.Rmd b/episodes/02-packages.Rmd index ec51ab11..57e80c2d 100644 --- a/episodes/02-packages.Rmd +++ b/episodes/02-packages.Rmd @@ -114,6 +114,8 @@ Recovered individuals do not gain immunity to the pathogen, and instead return t Susceptible population (this can apply to the common cold and some types of flu). These new modules should be added to the package directory: +TODO: Scrub unimplemented models to reduce complexity + 📁 epi\_models
|
@@ -274,6 +276,9 @@ plain scripts. Python package, but if we wish, we can use them to control what is or isn't visible at package-level scope, or to perform any additional setup. + +TODO: This needs an interactive exercise. What happens without importing anything in __init__? + Consider the `__init__.py` file in the `models` directory. Let's add the following lines: @@ -369,6 +374,7 @@ Traceback (most recent call last): NameError: name 'SIS_model' is not defined ``` +TODO: remove discussion of private variables :::::::::::::::::::::: discussion ### 'Private' variables in Python @@ -537,6 +543,8 @@ you to build much more sophisticated command line interfaces. ## Extra: Advanced `argparse` in `__main__.py` +TODO: Remove advanced argparse section + Let's return to `plot_SIR.py`, and apply the enhancements discussed in the 'extra' sections last lesson: @@ -607,6 +615,12 @@ def main(): # the types of each argument. Optional arguments # should have single character names with a hypen, # or longer names with a double dash. + parser.add_argument( + "--version", + action="version", + version="%(prog)s {version}".format(version=__version__), + help="Show program's version number and exit.", + ) parser.add_argument( "-p", "--pop_size", type=int, default=10000000, help="Total population size", @@ -649,223 +663,18 @@ if __name__ == "__main__": main() ``` -This will work if we run `python3 -m epi_models.plotting.plot_SIR`, but it won't work -if we try to run it using `python3 -m epi_models SIR`, as we need to read from the -command line in `__main__.py` in order to decide which model to run, but `plot_SIR.py` -will also try to read from the command line to determine its own setup. Inevitably, -each scripting interface will expect a different set of arguments. The solution comes in -the form of `subparsers`. We'll show how these work using the following simple example: +Finally, we will need to add `__version__` variable to __init__.py ```python -# file: subparsers.py - -from argparse import ArgumentParser - -parser = ArgumentParser(description="A test program") - -# set up subparsers, make them required -subparsers = parser.add_subparsers(required=True) - -# add two subcommands: cmd1 and cmd2 -parser1 = subparsers.add_parser("cmd1") -parser2 = subparsers.add_parser("cmd2") - -# add some args to each -parser1.add_argument("foo") -parser1.add_argument("bar") -parser2.add_argument("baz") - -# parse args and print what we get -args = parser.parse_args() -print(args) -``` - -If we try running this with no arguments, it breaks! If we check how it should work -using `--help`: - -```bash -$ python3 subparsers.py --help -``` -```result -usage: subparsers.py [-h] {cmd1,cmd2} ... - -A test program - -positional arguments: - {cmd1,cmd2} - -optional arguments: - -h, --help show this help message and exit -``` - -We therefore need to supply either `cmd1` or `cmd2` as the first argument. We can then -get further info on each subcommand: - -```bash -$ python3 subparsers.py cmd1 --help -``` -```result -usage: subparsers.py cmd1 [-h] foo bar +# File: __init__.py -positional arguments: - foo - bar - -optional arguments: - -h, --help show this help message and exit +__version__ = 0.0.1 ``` -So what if we provide these arguments? - -```bash -$ python3 subparsers.py cmd1 1 2 -``` -```result -Namespace(bar='2', foo='1') -``` - -We see that `foo` and `bar` are defined within `args`, but not `baz`. Similarly: - -```bash -$ python3 subparsers.py cmd2 3 -``` -```result -Namespace(baz='3') -``` - -We can therefore use subparsers to set up multiple independent command line interfaces -using the same root command. If we wished, we could even create further subparsers from -our subparsers, leading to a nested command line interface! Something to note is that -information about which command was chosen is _not_ contained within args; we'll show a -workaround for this later using `set_defaults()`. - -Let's apply subparsers to our `epi_models` package. First, our `main()` function -should be split into a function that assigns arguments to an `ArgumentParser`, -and a function that runs the code using `args`: - -```python -# file: plot_SIR.py - -def _add_arguments(parser): - - parser.add_argument( - "-p", "--pop_size", type=int, default=10000000, - help="Total population size", - ) - parser.add_argument( - "-b", "--beta", type=float, default=0.5, - help="Average no. of new infections per infected person per day", - ) - parser.add_argument( - "-g", "--gamma", type=float, default=0.1, - help="Inverse of average number of days taken to recover", - ) - parser.add_argument( - "-d", "--days", type=int, default=150, - help="Number of days to run the simulation", - ) - parser.add_argument( - "-i", "--i0", type=int, default=10, - help="Number of infected people at the start of the simulation", - ) - parser.add_argument( - "-o", "--output", default="SIR_model.png", - help="Output file to save plot to", - ) - - -def main(args): - # Run our code - S, I, R = SIR_model( - pop_size=args.pop_size, - beta=args.beta, - gamma=args.gamma, - days=args.days, - I_0=args.i0, - ) - plot_SIR_model(S, I, R, save_to=args.output) -``` - -The `if __name__ == "__main__"` section should be tasked with creating an -`ArgumentParser` and coordinating everything: - -```python -# file: plot_SIR.py - -if __name__ == "__main__": - parser = ArgumentParser( - prog="SIR_model", - description="Solves SIR model and creates a plot", - ) - _add_arguments(parser) - args = parser.parse_args() - main(args) -``` - -As the `_add_arguments(parser)` function doesn't care whether it's supplied with a -parser or a subparser, this will work just fine if we run this file directly -using `python3 -m epi_models.plotting.plot_SIR`. - -A similar refactor should be applied for every other model. There is no need for -each model to require the same command line arguments, but they should each have a -function equivalent to `_add_arguments(parser)` and `main(args)`. - -We can then switch between each model in `__main__.py` using subparsers. -The file below shows how to achieve a rich command line interface for `epi_models`: - -```python -# file: __main__.py - -from argparse import ArgumentParser - -# Import each _add_arguments and main, giving each an alias -from .plotting.plot_SIR import main as SIR_main -from .plotting.plot_SEIR import main as SEIR_main -from .plotting.plot_SIS import main as SIS_main -from .plotting.plot_SIR import _add_arguments as add_SIR_arguments -from .plotting.plot_SIR import _add_arguments as add_SEIR_arguments -from .plotting.plot_SIR import _add_arguments as add_SIS_arguments - -# Create top-level ArgumentParser -parser = ArgumentParser( - prog="epi_models", - description="Tool for solving epidemiology models", -) - -# Set up subparsers, adding a new one for each model -subparsers = parser.add_subparsers(required=True) -SIR_parser = subparsers.add_parser("SIR") -SEIR_parser = subparsers.add_parser("SEIR") -SIS_parser = subparsers.add_parser("SIS") - -# Setup each subparser using each model's _add_arguments -add_SIR_arguments(SIR_parser) -add_SEIR_arguments(SEIR_parser) -add_SIS_arguments(SIS_parser) - -# Ensure each parser knows which function to call. -# set_defaults can be used to set a new arg which -# isn't set on the command line. -SIR_parser.set_defaults(main=SIR_main) -SEIR_parser.set_defaults(main=SEIR_main) -SIS_parser.set_defaults(main=SIS_main) - -# Extract command line arguments and run -args = parser.parse_args() -args.main(args) -``` - -Here, we used `set_defaults()` to assign each model's `main()` function to the variable -`main` within `args`. This will be set depending on which subcommand the user provides. -Each model's `_add_arguments` can be used as a 'black box', and each can be developed -independently of the others. - -Following this, we can use `epi_models` to run several different models, each with -their own command line interface! +We can now check the version using the `--version` argument. ```bash -$ python3 -m epi_models SIR --pop_size=300 --output="SIR.png" -$ python3 -m epi_models SEIR --alpha=1 +$ python3 -m epi_models.plotting.plot_SIR --version ``` ::::::::::::::::::::::::::::: keypoints diff --git a/episodes/03-building-and-installing.Rmd b/episodes/03-building-and-installing.Rmd index 3651261b..a42d7d4a 100644 --- a/episodes/03-building-and-installing.Rmd +++ b/episodes/03-building-and-installing.Rmd @@ -1,9 +1,10 @@ --- -title: "Building and Installing Packages using setuptools" +title: "Building and Installing Packages using hatch" teaching: 20 exercises: 0 --- + :::::::::::::::::::::::::::::::::::::: questions - How can we manage our Python environment? @@ -13,9 +14,9 @@ exercises: 0 ::::::::::::::::::::::::::::::::::::: objectives -- Use `venv` to manage Python environments +- Use `conda` to manage Python environments - Understand what happens when we install a package -- Use `setuptools` to install packages to our local environment +- Use `pip` and `hatch` to install packages to our local environment :::::::::::::::::::::::::::::::::::::::::::::::: @@ -40,7 +41,7 @@ directory of our project and try the following: ```bash $ cd /path/to/my/workspace/epi_models -$ python3 -m pip install . +$ python -m pip install . ``` We get the following error: @@ -56,19 +57,10 @@ recommended to write only `pyproject.toml`. This was introduced by define a Python project, and all tools that build, install, and publish Python packages are expected to use it. -::::::::::::: discussion - -### What is `setup.py`? - -`setup.py` serves a similar role to `pyproject.toml`, but it is no longer recommended -for use. The lesson on the [history of build tools](04-history-of-packaging.Rmd) -explains how it works and why the community has moved away from it. - -:::::::::::::::::::::::: By making our project `pip`-installable, we'll also make it very easy to publish our packages on public repositories -- this will be covered in our -[lesson on package publishing](./05-publishing.Rmd). After publishing our work, our +[lesson on package publishing](./04-publishing.Rmd). After publishing our work, our users will be able to download and install our package using `pip` from any machine of their chocie! @@ -90,83 +82,80 @@ manage competing dependencies: A good way to handle these sorts of conflicts is to instead use _virtual environments_ for each project. A number of tools have been developed to manage virtual environments, such as `venv`, which is a standard built-in Python tool, and `conda`, which is a -powerful third-party tool. We'll focus on `venv` here, but both tools work similarly. +powerful third-party tool. :::::::::::::::::::::: callout -You can `pip install` packages into a `conda` virtual environment, so much of the advice -in this lesson will still apply if you prefer to use `conda`. +You can `pip install` packages into a `conda` virtual environment. :::::::::::::::::::::::::::::: If we're using Linux, we can find which Python environment we're using by calling: ```bash -$ which python3 +$ which python ``` If we're using the default system environment, the result is something like the following: ```output -/usr/bin/python3 +/usr/bin/python ``` -To create a new virtual environment using `venv`, we can call: +To create a new `conda` environment called "packaging" with Python v3.12 installed, we can call: ```bash -$ python3 -m venv /path/to/my/env +# Create a new environment +$ conda create -n packaging python=3.12 matplotlib hatch -c conda-forge + +# It is a good idea to clean up cached and unused files +$ conda clean --all + +# You can always check available envs with +$ conda env list ``` -This will create a new directory at the location `/path/to/my/env`. Note that this can -be a relative path, so just calling `python3 -m venv myenv` will create the virtual -environment in the directory `./myenv`. We can then 'activate' the virtual environment -using: +Now we can activate our new conda environment: ```bash -$ source /path/to/my/env/bin/activate +# Start the env +$ conda activate packaging + +# To check which packages are installed in the env run: +$ conda list ``` Checking which Python we're running should now give a different result: ```bash -$ which python3 +$ which python ``` ```output -/path/to/my/env/bin/python3 +/Users/username/miniforge3/envs/packaging/bin/python ``` If we now install a new package, it will be installed within our new virtual environment instead of being installed to the system libraries. For example: ```bash -$ python3 -m pip install numpy +$ pip install numpy ``` -We should now find NumPy installed at the following location (note that the Python -version may not match yours): +We can check the location of `numpy` using `pip show`: ```bash -$ ls /path/to/my/env/lib/python3.8/site-packages/numpy +pip show numpy ``` -`site-packages` is a standard location to store installed Python packages. We can see -this by analysing Python's import path: - -```python ->>> import sys ->>> print(sys.path) -``` +`site-packages` is a standard location to store installed Python packages. -```result -['', '/usr/lib/python38.zip', '/usr/lib/python3.8', '/usr/lib/python3.8/lib-dynload', '/path/to/my/env/lib/python3.8/site-packages'] -``` -If we no longer wish to use this virtual environment, we can return to the system +If we no longer wish to use this virtual environment, we can return to the base environment by calling: ```bash -$ deactivate +$ conda deactivate ``` Virtual environments are very useful when we're testing our code, as they allow us to @@ -216,13 +205,11 @@ dob = 2002-03-05 foo = "bar" ``` -We can read this using the `toml` library in Python: +We can read this using the `tomllib` library in Python: + -```bash -$ python3 -m pip install toml -``` ```python ->>> import toml +>>> import tomllib >>> with open("mytoml.toml", "r") as f: ... data = toml.load(f) >>> print(data) @@ -250,12 +237,6 @@ Python types: } ``` -:::::::::::::::::::: callout - -Since Python 3.11, `tomllib` is part of Python's standard library. It works the same -as above, but you'll need to import `tomllib` instead of `toml`. - -:::::::::::::::::::::::::::: ## Installing our package with `pyproject.toml` @@ -270,58 +251,55 @@ can be achieved with this file: - Configure our development tools. To make our package `pip`-installable, we should add the file `pyproject.toml` to the -top-level `epi_models` directory: +top-level `learn-hatch` directory: -📁 epi\_models
+📁 learn-hatch
|
|\_\_\_\_📜 pyproject.toml
-|\_\_\_\_📦 epi\_models
-\ \ \ \ \ |
-\ \ \ \ \ |\_\_\_\_📜 \_\_init\_\_.py
-\ \ \ \ \ |\_\_\_\_📜 \_\_main\_\_.py
-\ \ \ \ \ |
-\ \ \ \ \ |\_\_\_\_📁 models
-\ \ \ \ \ |\ \ \ \ |
-\ \ \ \ \ |\ \ \ \ |\_\_\_\_📜 \_\_init\_\_.py
-\ \ \ \ \ |\ \ \ \ |\_\_\_\_📜 SIR.py
-\ \ \ \ \ |\ \ \ \ |\_\_\_\_📜 SEIR.py
-\ \ \ \ \ |\ \ \ \ |\_\_\_\_📜 SIS.py
-\ \ \ \ \ |\ \ \ \ |\_\_\_\_📜 utils.py
+|
+|\_\_\_\_📁 src
\ \ \ \ \ |
-\ \ \ \ \ |\_\_\_\_📁 plotting
+\ \ \ \ \ |\_\_\_\_📦 epi\_models
\ \ \ \ \ \ \ \ \ \ |
\ \ \ \ \ \ \ \ \ \ |\_\_\_\_📜 \_\_init\_\_.py
-\ \ \ \ \ \ \ \ \ \ |\_\_\_\_📜 plot\_SIR.py
-\ \ \ \ \ \ \ \ \ \ |\_\_\_\_📜 plot\_SEIR.py
-\ \ \ \ \ \ \ \ \ \ |\_\_\_\_📜 plot\_SIS.py
+\ \ \ \ \ \ \ \ \ \ |\_\_\_\_📜 \_\_main\_\_.py
+\ \ \ \ \ \ \ \ \ \ |
+\ \ \ \ \ \ \ \ \ \ |\_\_\_\_📁 models
+\ \ \ \ \ \ \ \ \ \ |\ \ \ \ |
+\ \ \ \ \ \ \ \ \ \ |\ \ \ \ |\_\_\_\_📜 \_\_init\_\_.py
+\ \ \ \ \ \ \ \ \ \ |\ \ \ \ |\_\_\_\_📜 SIR.py
+\ \ \ \ \ \ \ \ \ \ |\ \ \ \ |\_\_\_\_📜 SEIR.py
+\ \ \ \ \ \ \ \ \ \ |\ \ \ \ |\_\_\_\_📜 SIS.py
+\ \ \ \ \ \ \ \ \ \ |\ \ \ \ |\_\_\_\_📜 utils.py
+\ \ \ \ \ \ \ \ \ \ |
+\ \ \ \ \ \ \ \ \ \ |\_\_\_\_📁 plotting
+\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ |
+\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ |\_\_\_\_📜 \_\_init\_\_.py
+\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ |\_\_\_\_📜 plot\_SIR.py
+\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ |\_\_\_\_📜 plot\_SEIR.py
+\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ |\_\_\_\_📜 plot\_SIS.py
The first section in our `pyproject.toml` file should specify which build system we wish to use, and additionally specify any version requirements for packages used to -build our code. This is necessary to avoid a circular dependecy problem that occurred -with earlier Python build systems, in which the user had to run an install program to -determine the project's dependencies, but needed to already have the correct build -tool installed to run the install program -- see the -[lesson on historical build tools](04-history-of-packaging.Rmd) for more detail. -We will choose to use `setuptools`, which requires the following: +build our code. + +We will choose to use `hatchling`, which requires the following: ```toml # file: pyproject.toml [build-system] -requires = [ - "setuptools >= 65", - "wheel >= 0.38, -] -build-backend = "setuptools.build_meta" +requires = ["hatchling"] +build-backend = "hatchling.build" ``` - `requires` is set to a list of strings, each of which names a dependency of the build system and (optionally) its minimum version. This uses the same version syntax as `pip`. -- `build-backend` is set to a sub-module of `setuptools` which implements the +- `build-backend` is set to a sub-module of `hatchling` which implements the [PEP 517][PEP 517] build interface. With our build system determined, we can add some metadata that defines our project. @@ -332,40 +310,44 @@ dependencies: ```toml # file: pyproject.toml +# Build system configuration [build-system] -requires = [ - "setuptools >= 65", - "wheel >= 0.38, -] -build-backend = "setuptools.build_meta" +requires = ["hatchling"] +build-backend = "hatchling.build" +# Project metadata [project] name = "epi_models" version = "0.1.0" dependencies = [ "matplotlib", ] + +# Hatch build configuration +[tool.hatch.build] +source = "src" + ``` That's all we need! We'll discuss versioning in our -[lesson on publishing](05-publishing.Rmd). With this done, we can install our package +[lesson on publishing](04-publishing.Rmd). With this done, we can install our package using: ```bash -$ python3 -m pip install . +$ pip install . ``` This will automatically download and install our dependencies, and our package will be importable regardless of which directory we're in. The installed package can be found in the directory -`/path/to/my/env/lib/python3.8/site-packages/epi_models` along with a new directory, -`epi_models-0.1.0.dist-info`, which simply contains metadata describing our project. If -we look inside our installed package, we'll see that our files have been copied, and +`/Users/username/miniforge3/envs/packaging/lib/python3.12/site-packages/epi_models`. + +If we look inside our installed package, we'll see that our files have been copied, and there is also a `__pycache__` directory: ```bash -$ ls /path/to/my/env/lib/python3.8/site-packages/epi_models +$ ls /path/to/my/env/lib/python3.12/site-packages/epi_models ``` ```results @@ -381,7 +363,7 @@ we'll see those have been compiled to bytecode too. If we wish to uninstall, we may call: ```bash -$ python3 -m pip uninstall epi_models +$ pip uninstall epi_models ``` We can also create an 'editable install', in which any changes we make to our code are @@ -389,9 +371,7 @@ instantly recognised by any codes importing it -- this mode can be very useful w developing our code, especially when working on documentation or tests. ```bash -$ python3 -m pip install -e . -$ # Or... -$ python3 -m pip install --editable . +$ pip install -e . ``` :::::::::::::::::::::::::::::::: callout @@ -401,7 +381,7 @@ standardised in [PEP 660][PEP 660], and only recently implemented in `pip`. You need to upgrade to use this feature: ```bash -$ python3 -m pip install --upgrade pip +$ python -m pip install --upgrade pip ``` :::::::::::::::::::::::::::::::::::::::: @@ -415,30 +395,31 @@ the recommended core metadata keys are described below: ```toml # file: pyproject.toml -[project] -# name: String, REQUIRED -name = "my_project" +# Build system configuration +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" -# version: String, REQUIRED -# Should follow PEP 440 rules -# Can be provided dynamically, see the lesson on publishing -version = "1.2.3" +# Project metadata +[project] +name = "epi_models" +version = "0.1.0" +dependencies = [ + "matplotlib", +] -# description: String # A simple summary of the project description = "My wonderful Python package" -# readme: String + # Full description of the project. # Should be the path to your README file, relative to pyproject.toml readme = "README.md" -# requires-python: String # The Python version required by the project requires-python = ">=3.8" -# license: Table # The license of your project. # Can be provided as a file or a text description. # Discussed in the lesson on publishing @@ -446,112 +427,36 @@ license = {file = "LICENSE.md"} # or... license = {text = "BDS 3-Clause License"} -# authors: Array of Tables -# Can also be called 'maintainers'. + + +# Authors / maintainers # Each entry can have a name and/or an email authors = [ {name = "My Name", email = "my.email@email.net"}, {name = "My Friend", email = "their.email@email.net"}, ] -# urls: Table -# Should describe where to find useful info for your project -urls = {source = "github.com/MyProfile/my_project", documentation = "my_project.readthedocs.io/en/latest"} - # dependencies: Array of Strings # A list of requirements for our package dependencies = [ - "numpy >= 1.20", - "pyyaml", + "matplotlib", ] -``` - -Note that some of the longer tables in our TOML file can be written using non-inline -tables if it improved readability: -```toml +# Project URLs [project.urls] -Source = "github.com/MyProfile/my_project", -Documentation = "my_project.readthedocs.io/en/latest", -``` - -## Alternative Directory Structures - -`setuptools` provides some additional tools to help us install our package if they use a -different layout to the 'flat' layout we covered so far. A popular alternative layout is -the `src`-layout: - - -📁 epi_models
-|
-|\_\_\_\_📜 pyproject.toml
-|\_\_\_\_📁 src
-\ \ \ \ \ |
-\ \ \ \ \ |\_\_\_\_📦 epi_models
-\ \ \ \ \ \ \ \ \ \ |
-\ \ \ \ \ \ \ \ \ \ |\_\_\_\_📜 \_\_init\_\_.py
-\ \ \ \ \ \ \ \ \ \ |\_\_\_\_📜 \_\_main\_\_.py
-\ \ \ \ \ \ \ \ \ \ |\_\_\_\_📁 models
-\ \ \ \ \ \ \ \ \ \ |\_\_\_\_📁 plotting
-
- -The main benefit of this choice is that `setuptools` won't accidentally bundle any -utility modules stored in the top-level directory with our package. It can also be -neater when one project contains multiple packages. Note that directories and files with -special names are excluded by default regardless of which layout we choose, such as -`test/`, `docs/`, and `setup.py`. - -We can also disable automatic package discovery and explicitly list the packages we -wish to install: - -```toml -# file: pyproject.toml - -[tool.setuptools] -packages = ["my_package", "my_other_package"] -``` - -Note that this is not part of the [PEP 621][PEP 621] standard, and therefore instead -of being listed under the `[project]` header, it is a method specific to `setuptools`. -Finally, we may set up custom package discovery: - -```toml -# file: pyproject.toml - -[tool.setuptools.packages.find] -where = ["my_directory"] -include = ["my_package", "my_other_package"] -exclude = ["my_package.tests*"] -``` - -However, for ease of use, it is recommended to stick to either the flat layout or -the `src` layout. - -## Package Data +homepage = "https://github.com/username/learn-hatch" +documentation = "https://github.com/username/learn-hatch" +repository = "https://github.com/username/learn-hatch" -Sometimes our code requires some non-`.py` files in order to function properly, but -these would not be picked up by automatic package discovery. For example, the project -may store default input data in `.json` files. These could be included with your -package by adding the following to `pyproject.toml`: +# Hatch build configuration +[tool.hatch.build] +source = "src" -```toml -# file: pyproject.toml -[tool.setuptools.package-data] -epi_models = ["*.json"] ``` -Note that this would grab only `.json` files in the top-level directory of our -project. To include data files from all packages and sub-packages, we should instead -write: - -```toml -# file: pyproject.toml - -[tool.setuptools.package-data] -"*" = ["*.json"] -``` +TODO: Discuss including package data file with hatch. ## Installing Scripts @@ -559,16 +464,16 @@ If our package contains any scripts and/or a `__main__.py` file, we can run thos anywhere on our system after installation: ```bash -$ python3 -m epi_models -$ python3 -m epi_models.plotting.plot_SIR +$ python -m epi_models +$ python -m epi_models.plotting.plot_SIR ``` With a little extra work, we can also install a simplified interface that doesn't -require `python3 -m` in front. This is how tools like `pip` can be invoked using two +require `python -m` in front. This is how tools like `pip` can be invoked using two possible methods: ```bash -$ python3 -m pip # Invoke with python +$ python -m pip # Invoke with python $ pip # Invoke via console-scripts entrypoint ``` @@ -577,10 +482,7 @@ This can be achieved by adding a table `scripts` under the `[project]` header: ```toml # file: pyproject.toml -[project] -scripts = {epi_models = "epi_models.__main__:main"} - -# Alternative form: +# Add entry points [project.scripts] epi_models = "epi_models.__main__:main" ``` @@ -603,14 +505,14 @@ main() This will allow us to run our package as a script directly from the command line ```bash -$ python3 -m pip install . +$ python -m pip install . $ epi_models --help ``` Note that we'll still be able to run our code using the longer form: ```bash -$ python3 -m epi_models --help +$ python -m src/epi_models --help ``` If we have multiple scripts in our package, these can all be given invidual console @@ -624,6 +526,8 @@ epi_models = "epi_models.__main__:main" epi_models_sir = "epi_models.plotting.plot_SIR:main" ``` +TODO: remove this? + So how do these scripts work? When we activate a virtual environment, a new entry is added to our `PATH` environment variable linking to `/path/to/my/env/bin/`: @@ -635,7 +539,7 @@ After installing our console scripts, we can find a new file in this directory w the name we assigned to it. For example, `/path/to/my/env/bin/epi_models`: ```python -#!/path/to/my/env/bin/python3 +#!/path/to/my/env/bin/python # -*- coding: utf-8 -*- import re import sys @@ -653,6 +557,8 @@ but as soon as we call `deactivate`, it is removed from our `PATH`. ## Setting Dependency Versions +TODO: make this an info box. + Earlier, when setting `dependencies` in our `pyproject.toml`, we chose to specify a minimum requirement for `numpy`, but not for `pyyaml`: @@ -727,25 +633,12 @@ These dependencies can be installed by adding the name of each optional dependen group in square brackets after telling `pip` what we want to install: ```bash -$ pip install .[test] # Include testing dependencies -$ pip install .[doc] # Include documentation dependencies -$ pip install .[test,doc] # Include all dependencies +$ pip install ".[test]" # Include testing dependencies +$ pip install ".[doc]" # Include documentation dependencies +$ pip install ".[test,doc]" # Include all dependencies ``` -## Additional Tools - -Some additional tools unrelated to package building also make use of `pyproject.toml`. -Their settings are typically set using `[tool.*]` headings. For example, the tool -[`black`][black] which is used to auto-format Python code can be configured here: - -```toml -[tool.black] -line-length = 120 -``` -Not all popular Python tools have adopted `pyproject.toml` yet. Notably, the linter -[`flake8`][flake8] cannot be configured this way, and users will instead need to use -a `.flake8` file (or one of a few alternative config files). ::::::::::::::::::::::::::::: keypoints diff --git a/episodes/04-history-of-packaging.Rmd b/episodes/04-history-of-packaging.Rmd deleted file mode 100644 index 0c111b86..00000000 --- a/episodes/04-history-of-packaging.Rmd +++ /dev/null @@ -1,576 +0,0 @@ ---- -title: "Extra: A History of Python Build Tools" -teaching: 30 -exercises: 0 ---- - -:::::::::::::::::::::::::::::::::::::::::::::::::::::::::: questions - -- Why have the 'best practices' for building and installing Python - packages changed so much of the years? -- What problems has each new iteration solved? - -:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: - -::::::::::::::::::::::::::::::::::::: objectives - -- Understand the history of Python packaging -- Understand what each method does when we install a package - -:::::::::::::::::::::::::::::::::::::::::::::::: - -:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: instructor - -This lesson can be skipped entirely if you're aiming for a purely practical -lesson. - -:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: - -## Introduction - -In the previous lesson, we showed how to install Python packages using the file -`pyproject.toml`. However, if you ever find yourself looking for online help on a Python -packaging topic, you'll likely find a large number of alternative methods being -recommended. Some say you should use a file `setup.py`, while others recommend a -combination of `setup.cfg` and `setup.py` -- some even say to use both these and -`pyproject.toml`! - -The reason for this conflicting information is that the Python packaging 'best -practices', as decided by the Python community, have changed a number of times over -the years. This lesson is optional, but it will explain why some older tutorials -recommend some methods over the ones we've covered here. The intention here is not to -present alternative methods so that you can use them in new projects, but rather to -provide some context to the often confusing information out there, and to help if -you ever find yourself working on a project that hasn't yet updated to the latest -standards. - -## In the beginning, there was `distutils` - -First introduced with Python 2.2, `distutils` was a module of Python's standard library -that allowed users to install and distribute their own packages. However, it was -deprecated in [PEP 632][PEP 632], having been superceded by `setuptools`. The primary -issue with `distutils` is that it is strongly coupled to the user's Python version, -and the developers found they could not implement some features or fixes without -breaking inter-version compatibility. Nowadays, it is recommended to use a combination -of `pip` and `setuptools` instead, but it will be useful to briefly cover basic -`distutils` usage so that we can understand some of the design choices that would -follow. - -To use `distutils` to install a package, the user would create a file `setup.py` and -(optionally) `requirements.txt` in the same directory as the top-level package: - - - -📁 epi\_models
-|
-|\_\_\_\_📜 setup.py
-|\_\_\_\_📜 requirements.txt
-|\_\_\_\_📦 epi\_models
-\ \ \ \ \ |
-\ \ \ \ \ |\_\_\_\_📜 \_\_init\_\_.py
-\ \ \ \ \ |\_\_\_\_📜 \_\_main\_\_.py
-\ \ \ \ \ |\_\_\_\_📁 models
-\ \ \ \ \ |\_\_\_\_📁 plotting
-
- -The file `setup.py` should contain a script that contains metadata about the package and -its author(s). A very simple one might look like this: - -```python -# file: setup.py -from distutils.core import setup - -setup( - name="epi_models", - version="1.0", - description="Epidemiology modelling tools in Python", - author="Jordan Smith", - author_email="jsmith@email.net", - url="https://github.com/jsmith1234/epi_models", - packages=["epi_models", "epi_models.models", "epi_models.plotting"], -) -``` - -Note that each subpackage is explicitly listed, unlike modern systems that make -assumptions about your directory structure and perform automatic package discovery. - -To install, `setup.py` could be run as a script with the argument `install`: - -```bash -$ python3 setup.py install -``` - -:::::::::::::::::::::::::: callout - -Installing by running `setup.py` as a script is highly discouraged. If you're using a -package that still uses `setup.py`, use `pip install .` as usual. - -:::::::::::::::::::::::::::::::::: - -This creates a 'source distribution' in a new directory `./build`, and adds it to the -current environment. We can see how the package is added to our environmentby reading -the output written to the terminal: - -```result -creating /path/to/my/env/lib/python3.8/site-packages/epi_models -copying build/lib/epi_models/__init__.py -> /path/to/my/env/lib/python3.8/site-packages/epi_models -creating /path/to/my/env/lib/python3.8/site-packages/epi_models/models -copying build/lib/epi_models/models/utils.py -> /path/to/my/env/lib/python3.8/site-packages/epi_models/models -copying build/lib/epi_models/models/__init__.py -> /path/to/my/env/lib/python3.8/site-packages/epi_models/models -copying build/lib/epi_models/models/SEIR.py -> /path/to/my/env/lib/python3.8/site-packages/epi_models/models -copying build/lib/epi_models/models/SIR.py -> /path/to/my/env/lib/python3.8/site-packages/epi_models/models -copying build/lib/epi_models/models/SIS.py -> /path/to/my/env/lib/python3.8/site-packages/epi_models/models -creating /path/to/my/env/lib/python3.8/site-packages/epi_models/plotting -copying build/lib/epi_models/plotting/__init__.py -> /path/to/my/env/lib/python3.8/site-packages/epi_models/plotting -copying build/lib/epi_models/plotting/plot_SIS.py -> /path/to/my/env/lib/python3.8/site-packages/epi_models/plotting -copying build/lib/epi_models/plotting/plot_SEIR.py -> /path/to/my/env/lib/python3.8/site-packages/epi_models/plotting -copying build/lib/epi_models/plotting/plot_SIR.py -> /path/to/my/env/lib/python3.8/site-packages/epi_models/plotting -copying build/lib/epi_models/__main__.py -> /path/to/my/env/lib/python3.8/site-packages/epi_models -byte-compiling /path/to/my/env/lib/python3.8/site-packages/epi_models/__init__.py to __init__.cpython-38.pyc -byte-compiling /path/to/my/env/lib/python3.8/site-packages/epi_models/models/utils.py to utils.cpython-38.pyc -byte-compiling /path/to/my/env/lib/python3.8/site-packages/epi_models/models/__init__.py to __init__.cpython-38.pyc -byte-compiling /path/to/my/env/lib/python3.8/site-packages/epi_models/models/SEIR.py to SEIR.cpython-38.pyc -byte-compiling /path/to/my/env/lib/python3.8/site-packages/epi_models/models/SIR.py to SIR.cpython-38.pyc -byte-compiling /path/to/my/env/lib/python3.8/site-packages/epi_models/models/SIS.py to SIS.cpython-38.pyc -byte-compiling /path/to/my/env/lib/python3.8/site-packages/epi_models/plotting/__init__.py to __init__.cpython-38.pyc -byte-compiling /path/to/my/env/lib/python3.8/site-packages/epi_models/plotting/plot_SIS.py to plot_SIS.cpython-38.pyc -byte-compiling /path/to/my/env/lib/python3.8/site-packages/epi_models/plotting/plot_SEIR.py to plot_SEIR.cpython-38.pyc -byte-compiling /path/to/my/env/lib/python3.8/site-packages/epi_models/plotting/plot_SIR.py to plot_SIR.cpython-38.pyc -byte-compiling /path/to/my/env/lib/python3.8/site-packages/epi_models/__main__.py to __main__.cpython-38.pyc -``` - -There are three stages: - -- First, create `./build` and make a source distribution there. -- Create a new directory within `/path/to/my/env/lib/python3.8/site-packages/`, and - copy the contents of `./build/lib`. -- Compile each file to Python bytecode so it can be run more quickly later. - -The end result is therefore very similar to what happens when we install using -`pyproject.toml`. However, a significant downside of using `distutils` and `setup.py` -is that there is no way to safely uninstall a project once it has been installed, and -instead the user must manually remove the package from their `site-packages` folder. -The creation of a `./build` directory also tends to clutter up our workspace. - -`distutils` contains many other utilities, such as adding language extensions written in -C. However, it does not allow users to specify dependencies, and these are instead -expected to be listed in the file `requirements.txt`: - -``` -matplotlib>=3.6 -``` - -The user can install the requirements by calling: - -```bash -$ python3 -m pip -r requirements.txt -``` - -It is not recommended to use `distutils` for new projects, and it will be removed from -standard Python distributions in version 3.12. Listing dependencies in -`requirements.txt` is also no longer required. - -## `setuptools` and `egg` files - -`setuptools` is not part of the core Python library, but it has become the _de facto_ -standard build tool. Originally, it added extra functionality on top of `distutils` -using a complicated collection of subclasses and monkeypatching, and it offered better -support across multiple Python versions. It has since superceded `distutils` entirely. - -Using `setuptools`, it is possible to use `setup.py` to define a package in much the -same way as `distutils`: - -```python -# file: setup.py -from setuptools import setup - -setup( - name="epi_models", - version="1.0", - description="Epidemiology modelling tools in Python", - author="Jordan Smith", - author_email="jsmith@email.net", - url="https://github.com/jsmith1234/epi_models", - packages=["epi_models", "epi_models.models", "epi_models.plotting"], - install_requires=["matplotlib>=3.6"], -) -``` - -Note the addition of an extra field, `install_requires`. This allows us to specify -the dependencies without the extra file `requirements.txt`, and these libraries will -be installed alongside our package when we install it. - -We can run this file just as we did with `distutils`: - -```bash -$ python3 setup.py install -``` - -Again, this will create a new directory `./build`, but it will also create a directory -`./dist`. Much as before, `./build` contains a 'source distribution' of our code, while -`./dist` contains a file with a name such as `epi_models-1.0-py3.8.egg` and a directory -`epi_models.egg-info` containing metadata files describing our project. The 'egg' file -is a distributable package format used by `setuptools`, and is essentially just a `.zip` -file containing our package with a name specifying both the package version and the -version of Python it runs on. We can show this on Linux systems using the `unzip` -command line utility: - -```bash -$ unzip dist/epi_models-1.0-py3.8.egg -d test -$ ls test -``` - -```output -EGG-INFO epi_models -``` - -Inside the `.egg` file, we find a copy of the `.egg-info` directory created earlier, -and a copy of our package. If we look inside this version of our package, we can also -see that each directory contains a `__pycache__`, with Python bytecode `.pyc` files -inside, meaning each file has been pre-compiled. This is done to optimise the egg file, -as they are intended to be directly importable. However, it also means the egg file -is only compatible with some Python versions, so projects written to be compatible with -both Python 2 and Python 3 must have separate `.egg` files for each Python version. -Egg files have been superseded by 'wheel' files, which we'll discuss in the next lesson. - -So what happens when we install with `setuptools` as opposed to `distutils`? A clue can -be found in some of the text outputted when we installed: - -```result -Adding epi-models 1.0 to easy-install.pth file -``` - -If we look in our `site-packages` directory, we'll see a file `easy-install.pth`. This -is a path configuration file, denoted by the extension `.pth`, and if any are found -within `site-packages` (or a number of other Python configuration directories), any -additional items listed in it will be added to `sys.path` whenever Python is loaded -up. If we look into this file, we find: - -```bash -$ cat /path/to/my/env/lib/python3.8/site-packages/easy-install.pth -``` - -```result -./epi_models-1.0-py3.8.egg -``` - -Therefore, rather than copying our source distribution into `site-packages`, -`setuptools` has instead copied the egg file and added its location to `sys.path`. -This last step is necessary, as while Python is capable of running/importing zipped -directories, it doesn't automatically search zip files on the import path for any -modules contained within. - -Although there is still no way to uninstall using `setup.py`, it is possible to remove -a package installed this way using pip: - -```bash -$ python3 -m pip uninstall epi_models -``` - -## Using `pip` instead of running `setup.py` - -The direct usage of `setup.py` is now discouraged. After installing a package using -`python3 setup.py install`, there is no equivalent command to uninstall. It also tends -to clutter the user's workspace by creating local `./build` and `./dist` directories. -Both of these problems can be solved using `pip`, which also provides a number of -further benefits: - -```bash -$ python3 -m pip install . -``` - -This will install the library to the current Python environment. It can then be -uninstalled using: - -```bash -$ python3 -m pip uninstall epi_models -``` - -When installing with `pip` instead of running `setup.py`, no `./build` or `./dist` -directories are created, nor are any `.egg` files. Two lines which are printed to screen -during the install process explain what is happening instead: - -```result -Created wheel for epi-models: filename=epi_models-1.0-py3-none-any.whl size=4968 sha256=f876a8ce10a3b6a6d0261f4d739b1d78904153b4feaf2b37f83de60e4b9c2d36 -Stored in directory: /tmp/pip-ephem-wheel-cache-_og4ywxd/wheels/d9/4d/ac/bbc1437fd83635787dd0fb8c3df8da61fc7b57f6eaa2b0d17b -``` - -Instead of creating an egg file, a 'wheel' is created instead. We'll cover wheel files -in more detail in the next lesson, but to summarise, a wheel is very similar to an egg -file except for two major differences: - -- The code within is not compiled to Python bytecode. -- The name of the file contains more information regarding its compatibility. - -The wheel is created in a temporary directory (`/tmp` on most Linux systems) so that it -doesn't clutter up our workspace, and when installing from a wheel, the file is unzipped -within `site-packages` and the code within is compiled to bytecode. This is in contrast -to egg files, which remain zipped at all times and come with their code pre-compiled. - -To aid code development, we can also create _editable installs_, in which the user's -changes to the code are automatically picked up and there is no need to reinstall: - -```bash -$ python3 -m pip install -e . -``` - -This works simply by adding the path of our working directory into `easy-install.pth` -within the `site-packages` directory. It will also install any dependencies of the -project as normal. - -The usage of `setup.py` gained further criticism, even when used alonside `pip`. As -library writers were able to add arbitrary code to this file, setup scripts often became -very long and difficult for users to understand. They could also contain potentially -dangerous (or even malicious) code that may not be apparent at first glance. -`distutils` had also supported an alternative method of specifying package metadata -using an additional file `setup.cfg`, and in time this became the preferred method. - -## `setup.cfg` as a 'Declarative Config' - -Instead of using `setup.py` to define our package metadata, it is preferable to instead -use the file `setup.cfg`. Instead of being a runnable Python module, this file is -simply a config file that can be read using Python's built-in `configparser` tool. Its -format is very similar to INI files commonly used on Windows systems. It should be -included at the very top of a project, just like `setup.py`: - - -📁 epi\_models
-|
-|\_\_\_\_📜 setup.cfg
-|\_\_\_\_📜 setup.py
-|\_\_\_\_📦 epi\_models
-\ \ \ \ \ |
-\ \ \ \ \ |\_\_\_\_📜 \_\_init\_\_.py
-\ \ \ \ \ |\_\_\_\_📜 \_\_main\_\_.py
-\ \ \ \ \ |\_\_\_\_📁 models
-\ \ \ \ \ |\_\_\_\_📁 plotting
-
- -`setup.py` is still present, but it can be reduced to a very simple form: - -```python -# file: setup.py -from setuptools import setup - -setup() -``` -The `setup.py` files we used earlier can be easily adapted to a corresponding -`setup.cfg`: - -```ini -; file: setup.cfg - -[metadata] -name = epi_models -version = 1.0 -description = Epidemiology modelling tools in Python -author = Jordan Smith -author_email = jsmith@email.net -url = "https://github.com/jsmith1234/epi_models" - -[options] -packages = find: -install_requires = - matplotlib >= 3.6 -``` - -Note that the values on the right hand side of each equals sign are all intepretted as -strings by default, and double quotes are only needed to escape certain special -characters. Values can stretch over a line break by indenting the next line down. -Comment lines start with either `;` or `#`, and inline comments are not allowed. - -The benefit of using this file over `setup.py` is that the number of possible operations -is restricted. This prevents users from writing overly complex `setup.py` files that -include arbitrary and potentially dangerous computations. This is also beneficial from -an automation standpoint, as it is easy for tools besides `setuptools` to read -`setup.cfg` and deduce useful information about a package. - -Note that in converting our `setup.py` to a `setup.cfg`, we are no longer listing each -package and subpackage, and instead we are using the line: - -```ini -packages = find: -``` - -This instructs `setuptools` to detect packages itself. We could instead specify this -manually using: - -```ini -packages = - epi_models - epi_models.models - epi_models.plotting -``` - -A common alternative project layout is to place the top-level package in a directory -`src`: - - -📁 epi_models
-|
-|\_\_\_\_📜 setup.py
-|\_\_\_\_📜 setup.cfg
-|\_\_\_\_📁 src
-\ \ \ \ \ |
-\ \ \ \ \ |\_\_\_\_📦 epi_models
-\ \ \ \ \ \ \ \ \ \ |
-\ \ \ \ \ \ \ \ \ \ |\_\_\_\_📜 \_\_init\_\_.py
-\ \ \ \ \ \ \ \ \ \ |\_\_\_\_📜 \_\_main\_\_.py
-\ \ \ \ \ \ \ \ \ \ |\_\_\_\_📁 models
-\ \ \ \ \ \ \ \ \ \ |\_\_\_\_📁 plotting
-
- -Our `setup.cfg` file should be rewritten as follows: - -```ini -[options] -package_dir = - =src -packages = - epi_models - epi_models.models - epi_models.plotting -``` - -We can also continue using `packages = find:` by adding an extra heading to our config -file: - -```ini -[options] -package_dir = - =src -packages = find: - -[options.packages.find] -where = src -``` - -::::::::::::::::::::::::: callout - -Recent versions of `setuptools` can handle either the 'flat' layout or the `src`-layout -using just `packages = find:`. - -::::::::::::::::::::::::::::::::: - -There are many additional ways to organise a project, and it is possible to set package -names to something other than the corresponding directory name, but it is recommended to -keep the directory structure of your projects as close as possible to that of the Python -package. See the [documentation for `setuptools` keywords][setuptools-keywords] for more -information. - -## `pyproject.toml` and Circular Build Requirements - -We saw in the previous sections that `setuptools` allows library writers to specify the -requirements of their packages and allow users to automatically download and install -dependencies. However, there is always one requirement missing from this list: -`setuptools` itself! It would be useful if we could add `setuptools` to our -`install_requires`, but the user already needs to have `setuptools` installed in order -to parse this field! In the era of `distutils`, this was not a problem for Python -developers, as `distutils` was shipped as part of Python's standard library. - -The resolution to this problem came in [PEP 517][PEP 517] and [PEP 518][PEP 518], which -specifies how to set build system requires within a new config file, `pyproject.toml`. -`setup.cfg` is understood by `setuptools` (and possibly `distutils`), but -`pyproject.toml` is intended to be understood by _any_ Python build tool, current or -future. This includes `pip` and alternatives such as `flit` or `poetry`. - -To specify our build system following [PEP 517][PEP 517]/[518][PEP 518], -`pyproject.toml` should be added to our project at the same level as `setup.py` and -`setup.cfg`: - - -📁 epi_models
-|
-|\_\_\_\_📜 pyproject.toml
-|\_\_\_\_📜 setup.py
-|\_\_\_\_📜 setup.cfg
-|\_\_\_\_📦 epi_models
-\ \ \ \ \ |
-\ \ \ \ \ |\_\_\_\_📜 \_\_init\_\_.py
-\ \ \ \ \ |\_\_\_\_📜 \_\_main\_\_.py
-\ \ \ \ \ |\_\_\_\_📁 models
-\ \ \ \ \ |\_\_\_\_📁 plotting
-
- -At a minimum, it should contain the following: - -```toml -# file: pyproject.toml - -[build-system] -requires = ["setuptools >= 61"] -``` - -Following this, we may install our package using `pip` without first having `setuptools` -installed. If we have an older version of `setuptools` installed, `pip` will now fetch -the latest version in an isolated virtual environment prior to building our project. - -If we try installing however, we may find the following warnings: - -```bash -$ python3 -m pip install . -``` - -```result -WARNING: Missing build requirements in pyproject.toml for file:///my/file/path. -WARNING: The project does not specify a build backend, and pip cannot fall back to setuptools without 'wheel'. -``` - -This means that `pip` is falling back on default behaviour, as we have not fully -specified our build system. By default, `pip` will use `setuptools` (more specifically, -the build backend `setuptools.build_meta:__legacy__`), and it requires the additional -package `wheel` (which we'll discuss further in the next lesson). To explicitly set our -build system, we must also provide a `build-backend`: - -```toml -# file: pyproject.toml - -[build-system] -requires = [ - "setuptools >= 65", - "wheel >= 0.38, -] -build-backend = "setuptools.build_meta" -``` - -## Moving to `pyproject.toml`-only builds - -Following [PEP 517][PEP 517]/[518][PEP 518], it was realised that `pyproject.toml` and -`setup.cfg` were both solving similar problems, although `pyproject.toml` was to be -a standardised config file, while `setup.cfg` was `setuptools` specific (although -many other tools in the Python ecosystem had also adopted the usage of `setup.cfg`). -Altenative build tools such as `poetry` and `flit` opted to use `pyproject.toml` alone -to define Python packages, and this was eventually codified as a requirement for all -build tools in [PEP 621][PEP 621]. - -The aim of [PEP 621][PEP 621] is to standardise a set of 'core' metadata that any -build tool should recognise, such as `name`, `version`, `description`, `authors`, etc. -Tools may choose to use their own synonyms for this metadata, and they may provide many -more options than the core set, but to be standards compliant they must recognise the -metadata of [PEP 621][PEP 621] at a minimum. - - - -## The end of `setup.py` - -With [PEP 621][PEP 621] removing the need for `setup.cfg`, one might expect that the -older `setup.py` could be removed too. However, `setuptools` still required this file -for some features to work, including editable installs. With [PEP 660][PEP 660], the -Python community standardised a way to use wheel files to create editable installs, -and therefore the use of `setup.py` is no longer required. However, this feature -was only recently implemented in `pip`, so users may need to upgrade if they wish -to use this feature: - -```bash -$ pip install --upgrade pip -``` - - -::::::::::::::::::::::::::::: keypoints - -- The 'best practices' for Python packaging has changed a number of times, and there - are now many competing tools for accomplishing the same task. -- Be wary of information on this topic in online tutorials -- not all guides have been - updated to use the most recent methods, and some advice may no longer be relevant. - -::::::::::::::::::::::::::::::::::::::: diff --git a/episodes/05-publishing.Rmd b/episodes/04-publishing.Rmd similarity index 76% rename from episodes/05-publishing.Rmd rename to episodes/04-publishing.Rmd index 3d4cefe8..c775e415 100644 --- a/episodes/05-publishing.Rmd +++ b/episodes/04-publishing.Rmd @@ -4,6 +4,13 @@ teaching: 30 exercises: 0 --- +TODO: replace build and twine with hatch. local build with hatch. demo push to test-pypi. +TODO: pip install from github +TODO: vcs based versioning with git tags and hatch (like setuptools-vcs) +TODO: Update github action to use hatch and push to test-pypi +TODO: Change demo package name to _, check that this does not exist in test-pypi +TODO: Create a test-pypi API token + :::::::::::::::::::::::::::::::::::::::::::::::::::::::::: questions - What services can we use to publish our software? @@ -61,137 +68,7 @@ right-to-left. The meaning of each number is: behaviour in a significant way. Whenever we increment the major version, both the minor version and patch version should be reset to zero. -:::::::::::::::::: challenge - -Our contains the following function which gives the nth value of the Fibonacci -sequence: - -```python -def fibonacci(n): - if n in [0, 1]: - return n - else: - return fibonacci(n-1) + fibonacci(n-2) -``` - -A user points out that this function causes an infinite loop if provided with a negative -number, so we change it to: - -```python -def fibonacci(n): - if n < 0: - raise ValueError("n must be greater than or equal to 0") - elif n in [0, 1]: - return n - else: - return fibonacci(n-1) + fibonacci(n-2) -``` - -If our software was version 2.3.4, and after this change we make a new release, what -should the new version number be? - -:::::::::::::::::::::::::::: - -::::::::::::::::::: solution - -2.3.5. This change is backwards compatible, and doesn't add any new features. Instead, -it simply fixes a bug. - -:::::::::::::::::::::::::::: - -:::::::::::::::::: challenge - -Our algorithm isn't very efficient, so we convert it to an iterative algorithm: - -```python -def fibonacci(n): - if n < 0: - raise ValueError("n must be greater than or equal to 0") - elif n in [0, 1]: - return n - else: - last_two = [0, 1] - while n > 1: - val = sum(last_two) - last_two[0] = last_two[1] - last_two[1] = val - n -= 1 - return val -``` - -If the previous version was 2.4.7, what should the new version be? - -:::::::::::::::::::::::::::: - -::::::::::::::::::: solution - -2.4.8. This change is backwards compatible, and doesn't add any new features. Instead, -it just improves the performance of an existing function. - -:::::::::::::::::::::::::::: - -:::::::::::::::::: challenge - -We decide to add a new function to our code that gives the user the full list of -Fibonnaci numbers up to n: - -```python -def fibonacci_list(n): - if n < 0: - raise ValueError("n must be greater than or equal to 0") - elif n == 0: - return [0] - else: - result = [0, 1] - while n > 1: - result.append(result[-1] + result[-2]) - n -= 1 - return result -``` - -If the previous version was 3.2.1, what should the new version be? - -:::::::::::::::::::::::::::: - -::::::::::::::::::: solution - -3.3.0. We've added new features to our software, but we haven't changed the existing -API. Therefore the minor version should be incremented, and the patch number should be -reset to zero. - -:::::::::::::::::::::::::::: - -:::::::::::::::::: challenge - -Our users seem to prefer the `fibonacci_list` function, so we decide to streamline our -software by removing the original function and renaming the new one `fibonacci`. - -```python -def fibonacci(n): - if n < 0: - raise ValueError("n must be greater than or equal to 0") - elif n == 0: - return [0] - else: - result = [0, 1] - while n > 1: - result.append(result[-1] + result[-2]) - n -= 1 - return result -``` - -If the previous version was 3.4.5, what should the new version be? - -:::::::::::::::::::::::::::: - -::::::::::::::::::: solution -4.0.0. By removing a function and changing the behaviour of another, we have changed -the public API in a manner which is not backwards-compatible, and thus this might break -our user's code. We therefore must increment the major number, and set both the minor -and patch numbers to zero. - -:::::::::::::::::::::::::::: We can add a version to our code by adding a `__version__` to our top-most `__init__.py` file: @@ -219,45 +96,7 @@ be updated if we change the _public API_ of our software. Therefore, if we chang behaviour of any functions or classes intended for internal use, and the public API is unchanged, we only need to update the patch number. -As discussed in our [lesson on packages](02-packages.Rmd), -e can indicate that a function, class, or variable is only intended for internal use -by prepending their name with an underscore (`_myvar`, `_myfunc`, `_MyClass`), -excluding it from `__all__`, and excluding it from the user API in any published -documentation (although it may be a good idea to document private objects in a separate -developer API). - -When we update the version of our software and release it publically, we must not -go back and change it, no matter how tempting the prospect may be! Any fixes to our -software may be perfomed by further releases, usually via the patch number. If a -vulnerability is found in an old version of our software, it is permissible to return -to it and release a new patch. For example, the last version of Python 2 was version -2.7.18, released in April 2020 -- over a decade after the release of Python 3.0. If we -choose to stop supporting an old version of our software, and therefore leave any -vulnerabilities intact, this should be clearly stated to our users, and they should be -strongly advised to upgrade. - -With this understanding of semantic versioning, we can now better understand the -behaviour of the 'compatible release' comparator `~=` that we can use when setting -dependencies in `pyproject.toml`: - -```toml -dependencies = [ - "numpy ~= 1.22.1", -] -``` - -This means that we require a version of NumPy which has at least all of the features of -version 1.22.1, but maintains backwards compatibility with it. `pip` will aim to -get the highest possible version that matches, so if a patch is released, it will -get version 1.22.2. If a new minor version is released, it will install 1.23.0. This -continues until the release of 2.0.0, which `pip` will not install. This is -equivalent to: -```toml -dependencies = [ - "numpy >= 1.22.1, == 1.*", -] -``` ### Unstable Versions @@ -387,7 +226,7 @@ can install it, and how to use it. For example, we may use the following file To install from this repo: ``` - $ git clone github.com/username/epi_models + $ git clone github.com/username/learn-hatch $ cd epi_models $ pip install . ``` @@ -408,16 +247,18 @@ can install it, and how to use it. For example, we may use the following file This should be included at the top level of our project: -📁 epi\_models
+📁 learn-hatch
|
|\_\_\_\_📜 pyproject.toml
|\_\_\_\_📜 README.md
-|\_\_\_\_📦 epi\_models
+\ \ \ \ \ 📁 src
\ \ \ \ \ |
-\ \ \ \ \ |\_\_\_\_📜 \_\_init\_\_.py
-\ \ \ \ \ |\_\_\_\_📜 \_\_main\_\_.py
-\ \ \ \ \ |\_\_\_\_📁 models
-\ \ \ \ \ |\_\_\_\_📁 plotting
+\ \ \ \ \ |\_\_\_\_📦 epi\_models
+\ \ \ \ \ \ \ \ \ \ |
+\ \ \ \ \ \ \ \ \ \ |\_\_\_\_📜 \_\_init\_\_.py
+\ \ \ \ \ \ \ \ \ \ |\_\_\_\_📜 \_\_main\_\_.py
+\ \ \ \ \ \ \ \ \ \ |\_\_\_\_📁 models
+\ \ \ \ \ \ \ \ \ \ |\_\_\_\_📁 plotting
It should be included in our package metadata by adding the following line in our @@ -441,19 +282,23 @@ project simply by adding a `LICENSE`, `LICENSE.txt`, or `LICENSE.md` file to the level of our project: -📁 epi\_models
+📁 learn-hatch
|
|\_\_\_\_📜 pyproject.toml
|\_\_\_\_📜 README.md
|\_\_\_\_📜 LICENSE.md
-|\_\_\_\_📦 epi\_models
+\ \ \ \ \ 📁 src
\ \ \ \ \ |
-\ \ \ \ \ |\_\_\_\_📜 \_\_init\_\_.py
-\ \ \ \ \ |\_\_\_\_📜 \_\_main\_\_.py
-\ \ \ \ \ |\_\_\_\_📁 models
-\ \ \ \ \ |\_\_\_\_📁 plotting
+\ \ \ \ \ |\_\_\_\_📦 epi\_models
+\ \ \ \ \ \ \ \ \ \ |
+\ \ \ \ \ \ \ \ \ \ |\_\_\_\_📜 \_\_init\_\_.py
+\ \ \ \ \ \ \ \ \ \ |\_\_\_\_📜 \_\_main\_\_.py
+\ \ \ \ \ \ \ \ \ \ |\_\_\_\_📁 models
+\ \ \ \ \ \ \ \ \ \ |\_\_\_\_📁 plotting
+ + One of the simplest and most widely used licenses is the MIT License, which is very permissive. It requires users of your software to retain its copyright notice if they redistribute or modify it (or 'substantial portions' of it), but otherwise allows @@ -516,12 +361,6 @@ highly recommended that you use it for managing your Python projects. GitHub is an online service for hosting `git`-based software projects, and it is a great way to share our code and collaborate with others. -:::::::::::::::::::: callout - -GitHub is not the only service you can use for hosting your source code. GitLab and -BitBucket are popular alternatives. - -:::::::::::::::::::::::::::: Once our code is hosted on GitHub, we can create releases and assign them a tag. This tag should be the version number of the release. We will see later how to use GitHub @@ -585,7 +424,7 @@ code and to manage its development, and to use a service like PyPI to host packa our users can install. -## Extra: Consistent Versioning with `setuptools-scm` +## Extra: Consistent Versioning with `hatch-vcs` An issue with using GitHub to create new releases is that the project version can easily become desynced. The version needs to be specified in three places: @@ -594,19 +433,17 @@ easily become desynced. The version needs to be specified in three places: - The `version` field in `pyproject.toml` - `__version__` in our `__init__.py` -It is possible to have all three determined by `git` tags using `setuptools-scm`. This +It is possible to have all three determined by `git` tags using `hatch-vcs`. This can be set as a requirement of the build system: ```toml # file: pyproject.toml +# Build system configuration [build-system] -requires = [ - "setuptools >= 65", - "setuptools_scm[toml]", - "wheel", -] -build-backend = "setuptools.build_meta" +requires = ["hatchling", "hatch-vcs"] + +build-backend = "hatchling.build" ``` With this, we no longer need to provide an entry for `project.version`, and instead @@ -626,11 +463,21 @@ Following this, we should add the following section elsewhere in `pyproject.toml ```toml # file: pyproject.toml -[tool.setuptools_scm] -write_to = "epi_models/_version.py" +# Hatch versioning configuration +[tool.hatch.version] +source = "vcs" + +# Version control system (VCS) versioning +[tool.hatch.version.vcs] +tag-pattern = "v*" # Git tags starting with 'v' will be used for versioning +fallback-version = "0.0.0" + +# Version file location for VCS +[tool.hatch.build.hooks.vcs] +version-file = "src/epi_models/_version.py" ``` -Now, when we install or build the project, `setuptools-scm` will create a new file +Now, when we install or build the project, `hatch-vcs` will create a new file `_version.py` inside of our built package. If our git tag is `1.2.3`, this will contain: ```python @@ -645,40 +492,52 @@ This can be retrieved at runtime by adding the following to `__init__.py`: ```python # file: __init__.py -from importlib.metadata import version, PackageNotFoundError +from epi_models._version import __version__ -try: - __version__ = version("epi_models") -except PackageNotFoundError: - # If the package is not installed, don't add __version__ - pass ``` -Note that `importlib.metadata` was added to the Python standard library in version 3.8. -Earlier versions will need to instead load an external package `importlib_metadata`, -which works in the same way. We can account for both using: +Now, our Git tags, `__version__`, and `pyproject.toml` `version` will automatically be +kept in sync. + -```python -# file: __init__.py +We will need to add the dynamically generated `_version.py` to our `.gitignore` -try: - from importlib.metadata import version, PackageNotFoundError -except ImportError: - from importlib_metadata import version, PackageNotFoundError +```bash +# file: .gitignore + +src/epi_models/_version.py ``` -We'll also need to account for `importlib_metadata` in our `pyproject.toml` as follows: +### Adding git tags -```toml -# file: pyproject.toml -[project] -dependencies = [ - 'importlib_metadata; python_version < "3.8"', -] +Before adding a new tag we should commit all our current changes and push them to our remote repo. + +Then we can add a new tag like so: + +```bash +# list tags +git tag + +# Add new tag +git tag -a 0.1.0 -m "Initial minor release" + +# Push the tag to github +git push origin 0.1.0 + +# list tags +git tag ``` -Now, our Git tags, `__version__`, and `pyproject.toml` `version` will automatically be -kept in sync. +Now that we have a new tag let's re-install the package and check the version: + +```bash +pip install -e . + +epi_models --version +``` + + + ## PyPI, the Python Packaging Index @@ -720,13 +579,12 @@ keywords = [ # license we're using, etc. classifiers = [ "Development Status :: 3 - Alpha", + "Programming Language :: Python :: 3", "Intended Audience :: Science/Research", + "Topic :: Scientific/Engineering :: Bio-Informatics", "License :: OSI Approved :: MIT License", - "Natural Language :: English", - "Operating System :: OS Independent", - "Programming Language :: Python :: 3.8", - "Topic :: Scientific/Engineering", ] + ``` Before discussing how to get our project hosted on PyPI, we'll quickly discuss 'wheel' @@ -802,20 +660,19 @@ whenever we try to install something. In order to meet the needs of as many user possible, it's also possible for us to upload multiple wheels for each release -- one for each targeted Python version and operating system. -## `build` and `twine` +## `hatch build` -So how do we create a wheel file to upload? The standard tool used to create wheel files -is `build`: +So how do we create a wheel file to upload? The Hatch library can be used to build and publish wheels. ```bash -$ pip install build +$ pip install hatch ``` As we already have a `pyproject.toml`, `build` has everything it needs to create a wheel file. It can be called simply using: ```bash -$ python3 -m build +$ hatch build ``` This will create a new directory `./dist` containing the following: @@ -839,46 +696,85 @@ We'll see that it contains our package along with a second directory and README file. Note that we should remove the unzipped directories from `./dist` before the upload stage. -The second file `build` created is a `.tar.gz` file -- a gzip-compressed tarball. This +The second file `hatch build` created is a `.tar.gz` file -- a gzip-compressed tarball. This is a 'source distribution', which is used as a backup by `pip` if it can't find a suitable wheel file to install. -The tool for uploading our package to PyPI is `twine`: +### Publish Wheels to test-pypi + +The tool for uploading our package to PyPI is `hatch publish`. + +Note: before we upload our package we will need to make sure we are using unique package names. + +Change you package name from to `githubusername-epi_modules`. + +You will need to change the package name in the following locations: +- pyproject.toml + - project.name + - project.scripts entrypoint +- The `src/epi_models` dir +- Any relative imports in the modules + +Test that the package can still be installed. ```bash -$ pip install twine +pip uninstall epi_modules + +pip install -e . + +epi_modules --version ``` -We can check that our package is well-formed by running `twine check`: + +Lets commit those changes and add a new tag. ```bash -$ twine check dist/* +# list tags +git tag + +# Add new tag +git tag -a 0.1.1 -m "Edit package name" + +# Push the tag to github +git push origin 0.1.1 + +# list tags +git tag +``` + +We can test the distribution of our package by uploading to TestPyPI. + +First we will need to create a "token" on test-pypi to use as a temporary password. + +```bash +$ hatch publish --repo testpypi --user __token__ --auth ``` -If this returns that the package is okay, we can test the distribution of our package -by uploading to TestPyPI: +To avoid entering you token on the cmd line you can provide details as env variables ```bash -$ twine upload --repository testpypi dist/* +export HATCH_INDEX_USER=__token__ +export HATCH_INDEX_AUTH= ``` +For more authentication options see the [Hatch documentation](https://hatch.pypa.io/latest/how-to/publish/auth/). + + Note that there is a registration process for TestPyPI, and a separate one for PyPI. + Once uploaded to TestPyPI we can check that everything looks correct using the web interface. + If you choose to `pip` download from TestPyPI you may need to specify that the dependencies are gotten from PyPI proper by using the `--extra-indec-url` flag. This is because the dependencies may not be available through TestPyPI. ```bash -$. pip install -i https://test.pypi.org/pypi/ --extra-index-url https://pypi.org/simple epi_models==0.1.0 +$. pip install -i https://test.pypi.org/pypi/ --extra-index-url https://pypi.org/simple githubusername-epi_models==0.1.0 ``` -Once we are happy that all looks correct on TestPyPI we may proceed with installing -our package to PyPI: -```bash -$ twine upload dist/* -``` +The process is the same for publishing to PyPi (but please don't publish this test project!). -That's all we need! Users will then be able to install our package to any machine +Users will then be able to install our package to any machine by calling the following: ```bash @@ -948,17 +844,17 @@ jobs: with: python-version: '3.x' # Here we update pip to the latest version and - # install 'build'. We won't need 'twine' here. + # install 'hatch' - name: Install dependencies run: | python -m pip install --upgrade pip - pip install build + pip install hatch # Here we run build to create a wheel and a # .tar.gz source distribution. - name: Build package - run: python -m build --sdist --wheel + run: hatch build # Finally, we use a pre-defined action to publish - # our package in place of twine. + # our package - name: Publish package uses: pypa/gh-action-pypi-publish@release/v1 with: @@ -986,6 +882,6 @@ make a new release. - Versioning our projects is important so that our users know what's compatible. - GitHub is a powerful service for hosting our projects and managing their development. -- Each new release of our packages should be uploaded to PyPI using `build` and `twine`. +- Each new release of our packages should be uploaded to PyPI using `hatch build` and `hatch publish`. :::::::::::::::::::::::::::::::::::::::::::::::: diff --git a/learners/setup.md b/learners/setup.md index af6a1139..0f85db1b 100644 --- a/learners/setup.md +++ b/learners/setup.md @@ -12,3 +12,111 @@ A lesson on Git is available with the [Software Carpentires][sc-git]. Some sections are marked 'extra', and these contain non-essential information that may be of interest to some learners. These sections do not need to be covered in order to understand the core content of the course. + + +## Python environments + +In this workshop we will use `conda` to manage Python environments and install packages. + +Our preferred flavour of `conda` is provided by Miniforge3, but you could also use Miniconda. + +### Windows + +Windows users will need to install `GitBash` which is a linux-like terminal that comes pre-installed with Git. +You will use `conda` from within the `GitBash` shell. + +Install: +- [GitBash](https://gitforwindows.org/) +- [Miniforge3](https://conda-forge.org/miniforge/) + +Windows checks: + +- Open the `GitBash` terminal app. +- Check for `(base)` prefix in your prompt. +- If `(base)` is not present, open the "miniforge prompt" app and run `conda init bash` +- Run `conda --version` + + +### Mac + +Install: +- [Miniforge3](https://conda-forge.org/miniforge/) + +Mac checks: + +- Open a terminal and run `git --version`. You may be prompted to install git. +- Run `conda --version` + +## Configure Git + +If you are setting up Git for the first time, you will need to set your user name and email. + +```bash +$ git config --global user.name "Alfredo Linguini" +$ git config --global user.email "a.linguini@ratatouille.fr" +``` + +Please use your own name and email address instead of Alfredo's. And make sure you use the same email associated with your GitHub account. + +We will also set the default editor as `nano`. + +```bash +$ git config --global core.editor "nano -w" +``` + +## Setup Github + +### Create a GitHub account + +Create a new account at [GitHub.com](github.com}) if you do not have one. + +Use an email address that you will always have access to (not a work or university address) + +### Configure SSH access + +If you do not have ssh set up for git [create a new ssh key](https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent) and [add the key](https://docs.github.com/en/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account) to your github account. + +On windows you should do this from the GitBash shell. + +To test that your key is correctly configured run: + +```bash +ssh -T git@github.com +``` + + +## VS Code setup + +VS Code is a popular Interactive Development Environment (IDE) that we will use to edit our project. + +Install: +- [VS Code](https://code.visualstudio.com/Download) + +Windows users: +- Open VS Code and set GitBash as default terminal + +VS Code has a marketplace of community developed extensions. Here are a few that you may find useful when working on Python projects. + +Optional extensions: +- python language support +- git lens +- remote ssh +- github pull requests +- ruff + +## Create Test-Pypi account + +PyPi is the Python Package Index, it hosts publically available python packages. + +We will practice uploading packages on a clone of PyPi called `test-pypi`. + +Setup your test-pypi account: +- Set up a new account on [test.pypi.org](https://test.pypi.org/) +- Confirm your email address. +- Set up 2-factor authentication. + +## Create project repo + +Create a new repo in your github account called `learn-hatch` and clone it to your local machine. + +Tutor to discuss `.gitignore` and licences. \ No newline at end of file diff --git a/renv/activate.R b/renv/activate.R index 0eb51088..2fe247d2 100644 --- a/renv/activate.R +++ b/renv/activate.R @@ -2,7 +2,7 @@ local({ # the requested version of renv - version <- "1.0.11" + version <- "1.1.1" attr(version, "sha") <- NULL # the project directory @@ -42,7 +42,7 @@ local({ return(FALSE) # next, check environment variables - # TODO: prefer using the configuration one in the future + # prefer using the configuration one in the future envvars <- c( "RENV_CONFIG_AUTOLOADER_ENABLED", "RENV_AUTOLOADER_ENABLED", @@ -135,12 +135,12 @@ local({ # R help links pattern <- "`\\?(renv::(?:[^`])+)`" - replacement <- "`\033]8;;ide:help:\\1\a?\\1\033]8;;\a`" + replacement <- "`\033]8;;x-r-help:\\1\a?\\1\033]8;;\a`" text <- gsub(pattern, replacement, text, perl = TRUE) # runnable code pattern <- "`(renv::(?:[^`])+)`" - replacement <- "`\033]8;;ide:run:\\1\a\\1\033]8;;\a`" + replacement <- "`\033]8;;x-r-run:\\1\a\\1\033]8;;\a`" text <- gsub(pattern, replacement, text, perl = TRUE) # return ansified text @@ -209,10 +209,6 @@ local({ } - startswith <- function(string, prefix) { - substring(string, 1, nchar(prefix)) == prefix - } - bootstrap <- function(version, library) { friendly <- renv_bootstrap_version_friendly(version) @@ -563,6 +559,9 @@ local({ # prepare download options token <- renv_bootstrap_github_token() + if (is.null(token)) + token <- "" + if (nzchar(Sys.which("curl")) && nzchar(token)) { fmt <- "--location --fail --header \"Authorization: token %s\"" extra <- sprintf(fmt, token) @@ -951,8 +950,14 @@ local({ } renv_bootstrap_validate_version_dev <- function(version, description) { + expected <- description[["RemoteSha"]] - is.character(expected) && startswith(expected, version) + if (!is.character(expected)) + return(FALSE) + + pattern <- sprintf("^\\Q%s\\E", version) + grepl(pattern, expected, perl = TRUE) + } renv_bootstrap_validate_version_release <- function(version, description) { @@ -1132,10 +1137,10 @@ local({ renv_bootstrap_exec <- function(project, libpath, version) { if (!renv_bootstrap_load(project, libpath, version)) - renv_bootstrap_run(version, libpath) + renv_bootstrap_run(project, libpath, version) } - renv_bootstrap_run <- function(version, libpath) { + renv_bootstrap_run <- function(project, libpath, version) { # perform bootstrap bootstrap(version, libpath) @@ -1146,7 +1151,7 @@ local({ # try again to load if (requireNamespace("renv", lib.loc = libpath, quietly = TRUE)) { - return(renv::load(project = getwd())) + return(renv::load(project = project)) } # failed to download or load renv; warn the user @@ -1192,98 +1197,101 @@ local({ jsonlite::fromJSON(txt = text, simplifyVector = FALSE) } - renv_json_read_default <- function(file = NULL, text = NULL) { - - # find strings in the JSON - text <- paste(text %||% readLines(file, warn = FALSE), collapse = "\n") - pattern <- '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' - locs <- gregexpr(pattern, text, perl = TRUE)[[1]] - - # if any are found, replace them with placeholders - replaced <- text - strings <- character() - replacements <- character() - - if (!identical(c(locs), -1L)) { - - # get the string values - starts <- locs - ends <- locs + attr(locs, "match.length") - 1L - strings <- substring(text, starts, ends) - - # only keep those requiring escaping - strings <- grep("[[\\]{}:]", strings, perl = TRUE, value = TRUE) - - # compute replacements - replacements <- sprintf('"\032%i\032"', seq_along(strings)) - - # replace the strings - mapply(function(string, replacement) { - replaced <<- sub(string, replacement, replaced, fixed = TRUE) - }, strings, replacements) + renv_json_read_patterns <- function() { + + list( + + # objects + list("{", "\t\n\tobject(\t\n\t"), + list("}", "\t\n\t)\t\n\t"), + + # arrays + list("[", "\t\n\tarray(\t\n\t"), + list("]", "\n\t\n)\n\t\n"), + + # maps + list(":", "\t\n\t=\t\n\t") + + ) + + } + renv_json_read_envir <- function() { + + envir <- new.env(parent = emptyenv()) + + envir[["+"]] <- `+` + envir[["-"]] <- `-` + + envir[["object"]] <- function(...) { + result <- list(...) + names(result) <- as.character(names(result)) + result } - - # transform the JSON into something the R parser understands - transformed <- replaced - transformed <- gsub("{}", "`names<-`(list(), character())", transformed, fixed = TRUE) - transformed <- gsub("[[{]", "list(", transformed, perl = TRUE) - transformed <- gsub("[]}]", ")", transformed, perl = TRUE) - transformed <- gsub(":", "=", transformed, fixed = TRUE) - text <- paste(transformed, collapse = "\n") - - # parse it - json <- parse(text = text, keep.source = FALSE, srcfile = NULL)[[1L]] - - # construct map between source strings, replaced strings - map <- as.character(parse(text = strings)) - names(map) <- as.character(parse(text = replacements)) - - # convert to list - map <- as.list(map) - - # remap strings in object - remapped <- renv_json_read_remap(json, map) - - # evaluate - eval(remapped, envir = baseenv()) - + + envir[["array"]] <- list + + envir[["true"]] <- TRUE + envir[["false"]] <- FALSE + envir[["null"]] <- NULL + + envir + } - renv_json_read_remap <- function(json, map) { - - # fix names - if (!is.null(names(json))) { - lhs <- match(names(json), names(map), nomatch = 0L) - rhs <- match(names(map), names(json), nomatch = 0L) - names(json)[rhs] <- map[lhs] + renv_json_read_remap <- function(object, patterns) { + + # repair names if necessary + if (!is.null(names(object))) { + + nms <- names(object) + for (pattern in patterns) + nms <- gsub(pattern[[2L]], pattern[[1L]], nms, fixed = TRUE) + names(object) <- nms + } - - # fix values - if (is.character(json)) - return(map[[json]] %||% json) - - # handle true, false, null - if (is.name(json)) { - text <- as.character(json) - if (text == "true") - return(TRUE) - else if (text == "false") - return(FALSE) - else if (text == "null") - return(NULL) + + # repair strings if necessary + if (is.character(object)) { + for (pattern in patterns) + object <- gsub(pattern[[2L]], pattern[[1L]], object, fixed = TRUE) } + + # recurse for other objects + if (is.recursive(object)) + for (i in seq_along(object)) + object[i] <- list(renv_json_read_remap(object[[i]], patterns)) + + # return remapped object + object + + } - # recurse - if (is.recursive(json)) { - for (i in seq_along(json)) { - json[i] <- list(renv_json_read_remap(json[[i]], map)) - } - } + renv_json_read_default <- function(file = NULL, text = NULL) { - json + # read json text + text <- paste(text %||% readLines(file, warn = FALSE), collapse = "\n") + + # convert into something the R parser will understand + patterns <- renv_json_read_patterns() + transformed <- text + for (pattern in patterns) + transformed <- gsub(pattern[[1L]], pattern[[2L]], transformed, fixed = TRUE) + + # parse it + rfile <- tempfile("renv-json-", fileext = ".R") + on.exit(unlink(rfile), add = TRUE) + writeLines(transformed, con = rfile) + json <- parse(rfile, keep.source = FALSE, srcfile = NULL)[[1L]] + # evaluate in safe environment + result <- eval(json, envir = renv_json_read_envir()) + + # fix up strings if necessary + renv_json_read_remap(result, patterns) + } + # load the renv profile, if any renv_bootstrap_profile_load(project) diff --git a/renv/profiles/lesson-requirements/renv.lock b/renv/profiles/lesson-requirements/renv.lock index e029aac3..a562f3dc 100644 --- a/renv/profiles/lesson-requirements/renv.lock +++ b/renv/profiles/lesson-requirements/renv.lock @@ -1,6 +1,6 @@ { "R": { - "Version": "4.4.1", + "Version": "4.4.2", "Repositories": [ { "Name": "carpentries", @@ -21,214 +21,604 @@ "Package": "R6", "Version": "2.5.1", "Source": "Repository", + "Title": "Encapsulated Classes with Reference Semantics", + "Authors@R": "person(\"Winston\", \"Chang\", role = c(\"aut\", \"cre\"), email = \"winston@stdout.org\")", + "Description": "Creates classes with reference semantics, similar to R's built-in reference classes. Compared to reference classes, R6 classes are simpler and lighter-weight, and they are not built on S4 classes so they do not require the methods package. These classes allow public and private members, and they support inheritance, even when the classes are defined in different packages.", + "Depends": [ + "R (>= 3.0)" + ], + "Suggests": [ + "testthat", + "pryr" + ], + "License": "MIT + file LICENSE", + "URL": "https://r6.r-lib.org, https://github.com/r-lib/R6/", + "BugReports": "https://github.com/r-lib/R6/issues", + "RoxygenNote": "7.1.1", + "NeedsCompilation": "no", + "Author": "Winston Chang [aut, cre]", + "Maintainer": "Winston Chang ", "Repository": "RSPM", - "Requirements": [ - "R" - ], - "Hash": "470851b6d5d0ac559e9d01bb352b4021" + "Encoding": "UTF-8" }, "Rcpp": { "Package": "Rcpp", - "Version": "1.0.13", + "Version": "1.0.14", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Title": "Seamless R and C++ Integration", + "Date": "2025-01-11", + "Authors@R": "c(person(\"Dirk\", \"Eddelbuettel\", role = c(\"aut\", \"cre\"), email = \"edd@debian.org\", comment = c(ORCID = \"0000-0001-6419-907X\")), person(\"Romain\", \"Francois\", role = \"aut\", comment = c(ORCID = \"0000-0002-2444-4226\")), person(\"JJ\", \"Allaire\", role = \"aut\", comment = c(ORCID = \"0000-0003-0174-9868\")), person(\"Kevin\", \"Ushey\", role = \"aut\", comment = c(ORCID = \"0000-0003-2880-7407\")), person(\"Qiang\", \"Kou\", role = \"aut\", comment = c(ORCID = \"0000-0001-6786-5453\")), person(\"Nathan\", \"Russell\", role = \"aut\"), person(\"Iñaki\", \"Ucar\", role = \"aut\", comment = c(ORCID = \"0000-0001-6403-5550\")), person(\"Doug\", \"Bates\", role = \"aut\", comment = c(ORCID = \"0000-0001-8316-9503\")), person(\"John\", \"Chambers\", role = \"aut\"))", + "Description": "The 'Rcpp' package provides R functions as well as C++ classes which offer a seamless integration of R and C++. Many R data types and objects can be mapped back and forth to C++ equivalents which facilitates both writing of new code as well as easier integration of third-party libraries. Documentation about 'Rcpp' is provided by several vignettes included in this package, via the 'Rcpp Gallery' site at , the paper by Eddelbuettel and Francois (2011, ), the book by Eddelbuettel (2013, ) and the paper by Eddelbuettel and Balamuta (2018, ); see 'citation(\"Rcpp\")' for details.", + "Imports": [ "methods", "utils" ], - "Hash": "f27411eb6d9c3dada5edd444b8416675" + "Suggests": [ + "tinytest", + "inline", + "rbenchmark", + "pkgKitten (>= 0.1.2)" + ], + "URL": "https://www.rcpp.org, https://dirk.eddelbuettel.com/code/rcpp.html, https://github.com/RcppCore/Rcpp", + "License": "GPL (>= 2)", + "BugReports": "https://github.com/RcppCore/Rcpp/issues", + "MailingList": "rcpp-devel@lists.r-forge.r-project.org", + "RoxygenNote": "6.1.1", + "Encoding": "UTF-8", + "NeedsCompilation": "yes", + "Author": "Dirk Eddelbuettel [aut, cre] (), Romain Francois [aut] (), JJ Allaire [aut] (), Kevin Ushey [aut] (), Qiang Kou [aut] (), Nathan Russell [aut], Iñaki Ucar [aut] (), Doug Bates [aut] (), John Chambers [aut]", + "Maintainer": "Dirk Eddelbuettel ", + "Repository": "CRAN" }, "askpass": { "Package": "askpass", "Version": "1.2.1", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "sys" - ], - "Hash": "c39f4155b3ceb1a9a2799d700fbd4b6a" + "Type": "Package", + "Title": "Password Entry Utilities for R, Git, and SSH", + "Authors@R": "person(\"Jeroen\", \"Ooms\", role = c(\"aut\", \"cre\"), email = \"jeroenooms@gmail.com\", comment = c(ORCID = \"0000-0002-4035-0289\"))", + "Description": "Cross-platform utilities for prompting the user for credentials or a passphrase, for example to authenticate with a server or read a protected key. Includes native programs for MacOS and Windows, hence no 'tcltk' is required. Password entry can be invoked in two different ways: directly from R via the askpass() function, or indirectly as password-entry back-end for 'ssh-agent' or 'git-credential' via the SSH_ASKPASS and GIT_ASKPASS environment variables. Thereby the user can be prompted for credentials or a passphrase if needed when R calls out to git or ssh.", + "License": "MIT + file LICENSE", + "URL": "https://r-lib.r-universe.dev/askpass", + "BugReports": "https://github.com/r-lib/askpass/issues", + "Encoding": "UTF-8", + "Imports": [ + "sys (>= 2.1)" + ], + "RoxygenNote": "7.2.3", + "Suggests": [ + "testthat" + ], + "Language": "en-US", + "NeedsCompilation": "yes", + "Author": "Jeroen Ooms [aut, cre] ()", + "Maintainer": "Jeroen Ooms ", + "Repository": "RSPM" }, "assertthat": { "Package": "assertthat", "Version": "0.2.1", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Title": "Easy Pre and Post Assertions", + "Authors@R": "person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", c(\"aut\", \"cre\"))", + "Description": "An extension to stopifnot() that makes it easy to declare the pre and post conditions that you code should satisfy, while also producing friendly error messages so that your users know what's gone wrong.", + "License": "GPL-3", + "Imports": [ "tools" ], - "Hash": "50c838a310445e954bc13f26f26a6ecf" + "Suggests": [ + "testthat", + "covr" + ], + "RoxygenNote": "6.0.1", + "Collate": "'assert-that.r' 'on-failure.r' 'assertions-file.r' 'assertions-scalar.R' 'assertions.r' 'base.r' 'base-comparison.r' 'base-is.r' 'base-logical.r' 'base-misc.r' 'utils.r' 'validate-that.R'", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut, cre]", + "Maintainer": "Hadley Wickham ", + "Repository": "RSPM", + "Encoding": "UTF-8" }, "base64enc": { "Package": "base64enc", "Version": "0.1-3", "Source": "Repository", - "Repository": "RSPM", - "Requirements": [ - "R" + "Title": "Tools for base64 encoding", + "Author": "Simon Urbanek ", + "Maintainer": "Simon Urbanek ", + "Depends": [ + "R (>= 2.9.0)" + ], + "Enhances": [ + "png" ], - "Hash": "543776ae6848fde2f48ff3816d0628bc" + "Description": "This package provides tools for handling base64 encoding. It is more flexible than the orphaned base64 package.", + "License": "GPL-2 | GPL-3", + "URL": "http://www.rforge.net/base64enc", + "NeedsCompilation": "yes", + "Repository": "RSPM", + "Encoding": "UTF-8" }, "brio": { "Package": "brio", "Version": "1.1.5", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" - ], - "Hash": "c1ee497a6d999947c2c224ae46799b1a" + "Title": "Basic R Input Output", + "Authors@R": "c( person(\"Jim\", \"Hester\", role = \"aut\", comment = c(ORCID = \"0000-0002-2739-7082\")), person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\")), person(given = \"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Functions to handle basic input output, these functions always read and write UTF-8 (8-bit Unicode Transformation Format) files and provide more explicit control over line endings.", + "License": "MIT + file LICENSE", + "URL": "https://brio.r-lib.org, https://github.com/r-lib/brio", + "BugReports": "https://github.com/r-lib/brio/issues", + "Depends": [ + "R (>= 3.6)" + ], + "Suggests": [ + "covr", + "testthat (>= 3.0.0)" + ], + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.2.3", + "NeedsCompilation": "yes", + "Author": "Jim Hester [aut] (), Gábor Csárdi [aut, cre], Posit Software, PBC [cph, fnd]", + "Maintainer": "Gábor Csárdi ", + "Repository": "RSPM" }, "bslib": { "Package": "bslib", - "Version": "0.8.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Version": "0.9.0", + "Source": "Repository", + "Title": "Custom 'Bootstrap' 'Sass' Themes for 'shiny' and 'rmarkdown'", + "Authors@R": "c( person(\"Carson\", \"Sievert\", , \"carson@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-4958-2844\")), person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"Garrick\", \"Aden-Buie\", , \"garrick@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0002-7111-0077\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(, \"Bootstrap contributors\", role = \"ctb\", comment = \"Bootstrap library\"), person(, \"Twitter, Inc\", role = \"cph\", comment = \"Bootstrap library\"), person(\"Javi\", \"Aguilar\", role = c(\"ctb\", \"cph\"), comment = \"Bootstrap colorpicker library\"), person(\"Thomas\", \"Park\", role = c(\"ctb\", \"cph\"), comment = \"Bootswatch library\"), person(, \"PayPal\", role = c(\"ctb\", \"cph\"), comment = \"Bootstrap accessibility plugin\") )", + "Description": "Simplifies custom 'CSS' styling of both 'shiny' and 'rmarkdown' via 'Bootstrap' 'Sass'. Supports 'Bootstrap' 3, 4 and 5 as well as their various 'Bootswatch' themes. An interactive widget is also provided for previewing themes in real time.", + "License": "MIT + file LICENSE", + "URL": "https://rstudio.github.io/bslib/, https://github.com/rstudio/bslib", + "BugReports": "https://github.com/rstudio/bslib/issues", + "Depends": [ + "R (>= 2.10)" + ], + "Imports": [ "base64enc", "cachem", - "fastmap", + "fastmap (>= 1.1.1)", "grDevices", - "htmltools", - "jquerylib", + "htmltools (>= 0.5.8)", + "jquerylib (>= 0.1.3)", "jsonlite", "lifecycle", - "memoise", + "memoise (>= 2.0.1)", "mime", "rlang", - "sass" + "sass (>= 0.4.9)" + ], + "Suggests": [ + "bsicons", + "curl", + "fontawesome", + "future", + "ggplot2", + "knitr", + "magrittr", + "rappdirs", + "rmarkdown (>= 2.7)", + "shiny (> 1.8.1)", + "testthat", + "thematic", + "tools", + "utils", + "withr", + "yaml" ], - "Hash": "b299c6741ca9746fb227debcb0f9fb6c" + "Config/Needs/deploy": "BH, chiflights22, colourpicker, commonmark, cpp11, cpsievert/chiflights22, cpsievert/histoslider, dplyr, DT, ggplot2, ggridges, gt, hexbin, histoslider, htmlwidgets, lattice, leaflet, lubridate, markdown, modelr, plotly, reactable, reshape2, rprojroot, rsconnect, rstudio/shiny, scales, styler, tibble", + "Config/Needs/routine": "chromote, desc, renv", + "Config/Needs/website": "brio, crosstalk, dplyr, DT, ggplot2, glue, htmlwidgets, leaflet, lorem, palmerpenguins, plotly, purrr, rprojroot, rstudio/htmltools, scales, stringr, tidyr, webshot2", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "true", + "Config/testthat/start-first": "zzzz-bs-sass, fonts, zzz-precompile, theme-*, rmd-*", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "Collate": "'accordion.R' 'breakpoints.R' 'bs-current-theme.R' 'bs-dependencies.R' 'bs-global.R' 'bs-remove.R' 'bs-theme-layers.R' 'bs-theme-preset-bootswatch.R' 'bs-theme-preset-brand.R' 'bs-theme-preset-builtin.R' 'bs-theme-preset.R' 'utils.R' 'bs-theme-preview.R' 'bs-theme-update.R' 'bs-theme.R' 'bslib-package.R' 'buttons.R' 'card.R' 'deprecated.R' 'files.R' 'fill.R' 'imports.R' 'input-dark-mode.R' 'input-switch.R' 'layout.R' 'nav-items.R' 'nav-update.R' 'navbar_options.R' 'navs-legacy.R' 'navs.R' 'onLoad.R' 'page.R' 'popover.R' 'precompiled.R' 'print.R' 'shiny-devmode.R' 'sidebar.R' 'staticimports.R' 'tooltip.R' 'utils-deps.R' 'utils-shiny.R' 'utils-tags.R' 'value-box.R' 'version-default.R' 'versions.R'", + "NeedsCompilation": "no", + "Author": "Carson Sievert [aut, cre] (), Joe Cheng [aut], Garrick Aden-Buie [aut] (), Posit Software, PBC [cph, fnd], Bootstrap contributors [ctb] (Bootstrap library), Twitter, Inc [cph] (Bootstrap library), Javi Aguilar [ctb, cph] (Bootstrap colorpicker library), Thomas Park [ctb, cph] (Bootswatch library), PayPal [ctb, cph] (Bootstrap accessibility plugin)", + "Maintainer": "Carson Sievert ", + "Repository": "CRAN" }, "cachem": { "Package": "cachem", "Version": "1.1.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "fastmap", - "rlang" + "Title": "Cache R Objects with Automatic Pruning", + "Description": "Key-value stores with automatic pruning. Caches can limit either their total size or the age of the oldest object (or both), automatically pruning objects to maintain the constraints.", + "Authors@R": "c( person(\"Winston\", \"Chang\", , \"winston@posit.co\", c(\"aut\", \"cre\")), person(family = \"Posit Software, PBC\", role = c(\"cph\", \"fnd\")))", + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "ByteCompile": "true", + "URL": "https://cachem.r-lib.org/, https://github.com/r-lib/cachem", + "Imports": [ + "rlang", + "fastmap (>= 1.2.0)" + ], + "Suggests": [ + "testthat" ], - "Hash": "cd9a672193789068eb5a2aad65a0dedf" + "RoxygenNote": "7.2.3", + "Config/Needs/routine": "lobstr", + "Config/Needs/website": "pkgdown", + "NeedsCompilation": "yes", + "Author": "Winston Chang [aut, cre], Posit Software, PBC [cph, fnd]", + "Maintainer": "Winston Chang ", + "Repository": "RSPM" }, "callr": { "Package": "callr", "Version": "3.7.6", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Title": "Call R from R", + "Authors@R": "c( person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\", \"cph\"), comment = c(ORCID = \"0000-0001-7098-9676\")), person(\"Winston\", \"Chang\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(\"Ascent Digital Services\", role = c(\"cph\", \"fnd\")) )", + "Description": "It is sometimes useful to perform a computation in a separate R process, without affecting the current R process at all. This packages does exactly that.", + "License": "MIT + file LICENSE", + "URL": "https://callr.r-lib.org, https://github.com/r-lib/callr", + "BugReports": "https://github.com/r-lib/callr/issues", + "Depends": [ + "R (>= 3.4)" + ], + "Imports": [ + "processx (>= 3.6.1)", "R6", - "processx", "utils" ], - "Hash": "d7e13f49c19103ece9e58ad2d83a7354" + "Suggests": [ + "asciicast (>= 2.3.1)", + "cli (>= 1.1.0)", + "mockery", + "ps", + "rprojroot", + "spelling", + "testthat (>= 3.2.0)", + "withr (>= 2.3.0)" + ], + "Config/Needs/website": "r-lib/asciicast, glue, htmlwidgets, igraph, tibble, tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "Language": "en-US", + "RoxygenNote": "7.3.1.9000", + "NeedsCompilation": "no", + "Author": "Gábor Csárdi [aut, cre, cph] (), Winston Chang [aut], Posit Software, PBC [cph, fnd], Ascent Digital Services [cph, fnd]", + "Maintainer": "Gábor Csárdi ", + "Repository": "RSPM" }, "cli": { "Package": "cli", "Version": "3.6.3", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Title": "Helpers for Developing Command Line Interfaces", + "Authors@R": "c( person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Hadley\", \"Wickham\", role = \"ctb\"), person(\"Kirill\", \"Müller\", role = \"ctb\"), person(\"Salim\", \"Brüggemann\", , \"salim-b@pm.me\", role = \"ctb\", comment = c(ORCID = \"0000-0002-5329-5987\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "A suite of tools to build attractive command line interfaces ('CLIs'), from semantic elements: headings, lists, alerts, paragraphs, etc. Supports custom themes via a 'CSS'-like language. It also contains a number of lower level 'CLI' elements: rules, boxes, trees, and 'Unicode' symbols with 'ASCII' alternatives. It support ANSI colors and text styles as well.", + "License": "MIT + file LICENSE", + "URL": "https://cli.r-lib.org, https://github.com/r-lib/cli", + "BugReports": "https://github.com/r-lib/cli/issues", + "Depends": [ + "R (>= 3.4)" + ], + "Imports": [ "utils" ], - "Hash": "b21916dd77a27642b447374a5d30ecf3" + "Suggests": [ + "callr", + "covr", + "crayon", + "digest", + "glue (>= 1.6.0)", + "grDevices", + "htmltools", + "htmlwidgets", + "knitr", + "methods", + "mockery", + "processx", + "ps (>= 1.3.4.9000)", + "rlang (>= 1.0.2.9003)", + "rmarkdown", + "rprojroot", + "rstudioapi", + "testthat", + "tibble", + "whoami", + "withr" + ], + "Config/Needs/website": "r-lib/asciicast, bench, brio, cpp11, decor, desc, fansi, prettyunits, sessioninfo, tidyverse/tidytemplate, usethis, vctrs", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.2.3", + "NeedsCompilation": "yes", + "Author": "Gábor Csárdi [aut, cre], Hadley Wickham [ctb], Kirill Müller [ctb], Salim Brüggemann [ctb] (), Posit Software, PBC [cph, fnd]", + "Maintainer": "Gábor Csárdi ", + "Repository": "RSPM" }, "clipr": { "Package": "clipr", "Version": "0.8.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Type": "Package", + "Title": "Read and Write from the System Clipboard", + "Authors@R": "c( person(\"Matthew\", \"Lincoln\", , \"matthew.d.lincoln@gmail.com\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-4387-3384\")), person(\"Louis\", \"Maddox\", role = \"ctb\"), person(\"Steve\", \"Simpson\", role = \"ctb\"), person(\"Jennifer\", \"Bryan\", role = \"ctb\") )", + "Description": "Simple utility functions to read from and write to the Windows, OS X, and X11 clipboards.", + "License": "GPL-3", + "URL": "https://github.com/mdlincoln/clipr, http://matthewlincoln.net/clipr/", + "BugReports": "https://github.com/mdlincoln/clipr/issues", + "Imports": [ "utils" ], - "Hash": "3f038e5ac7f41d4ac41ce658c85e3042" + "Suggests": [ + "covr", + "knitr", + "rmarkdown", + "rstudioapi (>= 0.5)", + "testthat (>= 2.0.0)" + ], + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "Language": "en-US", + "RoxygenNote": "7.1.2", + "SystemRequirements": "xclip (https://github.com/astrand/xclip) or xsel (http://www.vergenet.net/~conrad/software/xsel/) for accessing the X11 clipboard, or wl-clipboard (https://github.com/bugaevc/wl-clipboard) for systems using Wayland.", + "NeedsCompilation": "no", + "Author": "Matthew Lincoln [aut, cre] (), Louis Maddox [ctb], Steve Simpson [ctb], Jennifer Bryan [ctb]", + "Maintainer": "Matthew Lincoln ", + "Repository": "RSPM" }, "commonmark": { "Package": "commonmark", "Version": "1.9.2", "Source": "Repository", - "Repository": "CRAN", - "Hash": "14eb0596f987c71535d07c3aff814742" + "Type": "Package", + "Title": "High Performance CommonMark and Github Markdown Rendering in R", + "Authors@R": "c( person(\"Jeroen\", \"Ooms\", ,\"jeroenooms@gmail.com\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-4035-0289\")), person(\"John MacFarlane\", role = \"cph\", comment = \"Author of cmark\"))", + "Description": "The CommonMark specification defines a rationalized version of markdown syntax. This package uses the 'cmark' reference implementation for converting markdown text into various formats including html, latex and groff man. In addition it exposes the markdown parse tree in xml format. Also includes opt-in support for GFM extensions including tables, autolinks, and strikethrough text.", + "License": "BSD_2_clause + file LICENSE", + "URL": "https://docs.ropensci.org/commonmark/ https://ropensci.r-universe.dev/commonmark", + "BugReports": "https://github.com/r-lib/commonmark/issues", + "Suggests": [ + "curl", + "testthat", + "xml2" + ], + "RoxygenNote": "7.2.3", + "Language": "en-US", + "Encoding": "UTF-8", + "NeedsCompilation": "yes", + "Author": "Jeroen Ooms [aut, cre] (), John MacFarlane [cph] (Author of cmark)", + "Maintainer": "Jeroen Ooms ", + "Repository": "RSPM" }, "cpp11": { "Package": "cpp11", - "Version": "0.5.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" + "Version": "0.5.1", + "Source": "Repository", + "Title": "A C++11 Interface for R's C Interface", + "Authors@R": "c( person(\"Davis\", \"Vaughan\", email = \"davis@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0003-4777-038X\")), person(\"Jim\",\"Hester\", role = \"aut\", comment = c(ORCID = \"0000-0002-2739-7082\")), person(\"Romain\", \"François\", role = \"aut\", comment = c(ORCID = \"0000-0002-2444-4226\")), person(\"Benjamin\", \"Kietzman\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Provides a header only, C++11 interface to R's C interface. Compared to other approaches 'cpp11' strives to be safe against long jumps from the C API as well as C++ exceptions, conform to normal R function semantics and supports interaction with 'ALTREP' vectors.", + "License": "MIT + file LICENSE", + "URL": "https://cpp11.r-lib.org, https://github.com/r-lib/cpp11", + "BugReports": "https://github.com/r-lib/cpp11/issues", + "Depends": [ + "R (>= 4.0.0)" + ], + "Suggests": [ + "bench", + "brio", + "callr", + "cli", + "covr", + "decor", + "desc", + "ggplot2", + "glue", + "knitr", + "lobstr", + "mockery", + "progress", + "rmarkdown", + "scales", + "Rcpp", + "testthat (>= 3.2.0)", + "tibble", + "utils", + "vctrs", + "withr" ], - "Hash": "91570bba75d0c9d3f1040c835cee8fba" + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/Needs/cpp11/cpp_register": "brio, cli, decor, desc, glue, tibble, vctrs", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "no", + "Author": "Davis Vaughan [aut, cre] (), Jim Hester [aut] (), Romain François [aut] (), Benjamin Kietzman [ctb], Posit Software, PBC [cph, fnd]", + "Maintainer": "Davis Vaughan ", + "Repository": "RSPM" }, "crayon": { "Package": "crayon", "Version": "1.5.3", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Title": "Colored Terminal Output", + "Authors@R": "c( person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Brodie\", \"Gaslam\", , \"brodie.gaslam@yahoo.com\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "The crayon package is now superseded. Please use the 'cli' package for new projects. Colored terminal output on terminals that support 'ANSI' color and highlight codes. It also works in 'Emacs' 'ESS'. 'ANSI' color support is automatically detected. Colors and highlighting can be combined and nested. New styles can also be created easily. This package was inspired by the 'chalk' 'JavaScript' project.", + "License": "MIT + file LICENSE", + "URL": "https://r-lib.github.io/crayon/, https://github.com/r-lib/crayon", + "BugReports": "https://github.com/r-lib/crayon/issues", + "Imports": [ "grDevices", "methods", "utils" ], - "Hash": "859d96e65ef198fd43e82b9628d593ef" + "Suggests": [ + "mockery", + "rstudioapi", + "testthat", + "withr" + ], + "Config/Needs/website": "tidyverse/tidytemplate", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.1", + "Collate": "'aaa-rstudio-detect.R' 'aaaa-rematch2.R' 'aab-num-ansi-colors.R' 'aac-num-ansi-colors.R' 'ansi-256.R' 'ansi-palette.R' 'combine.R' 'string.R' 'utils.R' 'crayon-package.R' 'disposable.R' 'enc-utils.R' 'has_ansi.R' 'has_color.R' 'link.R' 'styles.R' 'machinery.R' 'parts.R' 'print.R' 'style-var.R' 'show.R' 'string_operations.R'", + "NeedsCompilation": "no", + "Author": "Gábor Csárdi [aut, cre], Brodie Gaslam [ctb], Posit Software, PBC [cph, fnd]", + "Maintainer": "Gábor Csárdi ", + "Repository": "RSPM" }, "credentials": { "Package": "credentials", "Version": "2.0.2", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "askpass", + "Type": "Package", + "Title": "Tools for Managing SSH and Git Credentials", + "Authors@R": "person(\"Jeroen\", \"Ooms\", role = c(\"aut\", \"cre\"), email = \"jeroenooms@gmail.com\", comment = c(ORCID = \"0000-0002-4035-0289\"))", + "Description": "Setup and retrieve HTTPS and SSH credentials for use with 'git' and other services. For HTTPS remotes the package interfaces the 'git-credential' utility which 'git' uses to store HTTP usernames and passwords. For SSH remotes we provide convenient functions to find or generate appropriate SSH keys. The package both helps the user to setup a local git installation, and also provides a back-end for git/ssh client libraries to authenticate with existing user credentials.", + "License": "MIT + file LICENSE", + "SystemRequirements": "git (optional)", + "Encoding": "UTF-8", + "Imports": [ + "openssl (>= 1.3)", + "sys (>= 2.1)", "curl", "jsonlite", - "openssl", - "sys" + "askpass" ], - "Hash": "09fd631e607a236f8cc7f9604db32cb8" + "Suggests": [ + "testthat", + "knitr", + "rmarkdown" + ], + "RoxygenNote": "7.2.1", + "VignetteBuilder": "knitr", + "Language": "en-US", + "URL": "https://docs.ropensci.org/credentials/ https://r-lib.r-universe.dev/credentials", + "BugReports": "https://github.com/r-lib/credentials/issues", + "NeedsCompilation": "no", + "Author": "Jeroen Ooms [aut, cre] ()", + "Maintainer": "Jeroen Ooms ", + "Repository": "RSPM" }, "curl": { "Package": "curl", - "Version": "5.2.3", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" - ], - "Hash": "d91263322a58af798f6cf3b13fd56dde" + "Version": "6.2.0", + "Source": "Repository", + "Type": "Package", + "Title": "A Modern and Flexible Web Client for R", + "Authors@R": "c( person(\"Jeroen\", \"Ooms\", role = c(\"aut\", \"cre\"), email = \"jeroenooms@gmail.com\", comment = c(ORCID = \"0000-0002-4035-0289\")), person(\"Hadley\", \"Wickham\", role = \"ctb\"), person(\"Posit Software, PBC\", role = \"cph\"))", + "Description": "Bindings to 'libcurl' for performing fully configurable HTTP/FTP requests where responses can be processed in memory, on disk, or streaming via the callback or connection interfaces. Some knowledge of 'libcurl' is recommended; for a more-user-friendly web client see the 'httr2' package which builds on this package with http specific tools and logic.", + "License": "MIT + file LICENSE", + "SystemRequirements": "libcurl (>= 7.62): libcurl-devel (rpm) or libcurl4-openssl-dev (deb)", + "URL": "https://jeroen.r-universe.dev/curl", + "BugReports": "https://github.com/jeroen/curl/issues", + "Suggests": [ + "spelling", + "testthat (>= 1.0.0)", + "knitr", + "jsonlite", + "later", + "rmarkdown", + "httpuv (>= 1.4.4)", + "webutils" + ], + "VignetteBuilder": "knitr", + "Depends": [ + "R (>= 3.0.0)" + ], + "RoxygenNote": "7.3.2.9000", + "Encoding": "UTF-8", + "Language": "en-US", + "Roxygen": "list(markdown = TRUE)", + "Config/pak/sysreqs": "libssl-dev", + "Repository": "https://carpentries.r-universe.dev", + "RemoteUrl": "https://github.com/jeroen/curl", + "RemoteRef": "v6.2.0", + "RemoteSha": "2f49074628943943288fe8848a6d0b86b8eee140", + "NeedsCompilation": "yes", + "Author": "Jeroen Ooms [aut, cre] (), Hadley Wickham [ctb], Posit Software, PBC [cph]", + "Maintainer": "Jeroen Ooms " }, "desc": { "Package": "desc", "Version": "1.4.3", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "R6", + "Title": "Manipulate DESCRIPTION Files", + "Authors@R": "c( person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Kirill\", \"Müller\", role = \"aut\"), person(\"Jim\", \"Hester\", , \"james.f.hester@gmail.com\", role = \"aut\"), person(\"Maëlle\", \"Salmon\", role = \"ctb\", comment = c(ORCID = \"0000-0002-2815-0399\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Maintainer": "Gábor Csárdi ", + "Description": "Tools to read, write, create, and manipulate DESCRIPTION files. It is intended for packages that create or manipulate other packages.", + "License": "MIT + file LICENSE", + "URL": "https://desc.r-lib.org/, https://github.com/r-lib/desc", + "BugReports": "https://github.com/r-lib/desc/issues", + "Depends": [ + "R (>= 3.4)" + ], + "Imports": [ "cli", + "R6", "utils" ], - "Hash": "99b79fcbd6c4d1ce087f5c5c758b384f" + "Suggests": [ + "callr", + "covr", + "gh", + "spelling", + "testthat", + "whoami", + "withr" + ], + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "Language": "en-US", + "RoxygenNote": "7.2.3", + "Collate": "'assertions.R' 'authors-at-r.R' 'built.R' 'classes.R' 'collate.R' 'constants.R' 'deps.R' 'desc-package.R' 'description.R' 'encoding.R' 'find-package-root.R' 'latex.R' 'non-oo-api.R' 'package-archives.R' 'read.R' 'remotes.R' 'str.R' 'syntax_checks.R' 'urls.R' 'utils.R' 'validate.R' 'version.R'", + "NeedsCompilation": "no", + "Author": "Gábor Csárdi [aut, cre], Kirill Müller [aut], Jim Hester [aut], Maëlle Salmon [ctb] (), Posit Software, PBC [cph, fnd]", + "Repository": "RSPM" }, "digest": { "Package": "digest", "Version": "0.6.37", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Authors@R": "c(person(\"Dirk\", \"Eddelbuettel\", role = c(\"aut\", \"cre\"), email = \"edd@debian.org\", comment = c(ORCID = \"0000-0001-6419-907X\")), person(\"Antoine\", \"Lucas\", role=\"ctb\"), person(\"Jarek\", \"Tuszynski\", role=\"ctb\"), person(\"Henrik\", \"Bengtsson\", role=\"ctb\", comment = c(ORCID = \"0000-0002-7579-5165\")), person(\"Simon\", \"Urbanek\", role=\"ctb\", comment = c(ORCID = \"0000-0003-2297-1732\")), person(\"Mario\", \"Frasca\", role=\"ctb\"), person(\"Bryan\", \"Lewis\", role=\"ctb\"), person(\"Murray\", \"Stokely\", role=\"ctb\"), person(\"Hannes\", \"Muehleisen\", role=\"ctb\"), person(\"Duncan\", \"Murdoch\", role=\"ctb\"), person(\"Jim\", \"Hester\", role=\"ctb\"), person(\"Wush\", \"Wu\", role=\"ctb\", comment = c(ORCID = \"0000-0001-5180-0567\")), person(\"Qiang\", \"Kou\", role=\"ctb\", comment = c(ORCID = \"0000-0001-6786-5453\")), person(\"Thierry\", \"Onkelinx\", role=\"ctb\", comment = c(ORCID = \"0000-0001-8804-4216\")), person(\"Michel\", \"Lang\", role=\"ctb\", comment = c(ORCID = \"0000-0001-9754-0393\")), person(\"Viliam\", \"Simko\", role=\"ctb\"), person(\"Kurt\", \"Hornik\", role=\"ctb\", comment = c(ORCID = \"0000-0003-4198-9911\")), person(\"Radford\", \"Neal\", role=\"ctb\", comment = c(ORCID = \"0000-0002-2473-3407\")), person(\"Kendon\", \"Bell\", role=\"ctb\", comment = c(ORCID = \"0000-0002-9093-8312\")), person(\"Matthew\", \"de Queljoe\", role=\"ctb\"), person(\"Dmitry\", \"Selivanov\", role=\"ctb\"), person(\"Ion\", \"Suruceanu\", role=\"ctb\"), person(\"Bill\", \"Denney\", role=\"ctb\"), person(\"Dirk\", \"Schumacher\", role=\"ctb\"), person(\"András\", \"Svraka\", role=\"ctb\"), person(\"Sergey\", \"Fedorov\", role=\"ctb\"), person(\"Will\", \"Landau\", role=\"ctb\", comment = c(ORCID = \"0000-0003-1878-3253\")), person(\"Floris\", \"Vanderhaeghe\", role=\"ctb\", comment = c(ORCID = \"0000-0002-6378-6229\")), person(\"Kevin\", \"Tappe\", role=\"ctb\"), person(\"Harris\", \"McGehee\", role=\"ctb\"), person(\"Tim\", \"Mastny\", role=\"ctb\"), person(\"Aaron\", \"Peikert\", role=\"ctb\", comment = c(ORCID = \"0000-0001-7813-818X\")), person(\"Mark\", \"van der Loo\", role=\"ctb\", comment = c(ORCID = \"0000-0002-9807-4686\")), person(\"Chris\", \"Muir\", role=\"ctb\", comment = c(ORCID = \"0000-0003-2555-3878\")), person(\"Moritz\", \"Beller\", role=\"ctb\", comment = c(ORCID = \"0000-0003-4852-0526\")), person(\"Sebastian\", \"Campbell\", role=\"ctb\"), person(\"Winston\", \"Chang\", role=\"ctb\", comment = c(ORCID = \"0000-0002-1576-2126\")), person(\"Dean\", \"Attali\", role=\"ctb\", comment = c(ORCID = \"0000-0002-5645-3493\")), person(\"Michael\", \"Chirico\", role=\"ctb\", comment = c(ORCID = \"0000-0003-0787-087X\")), person(\"Kevin\", \"Ushey\", role=\"ctb\"))", + "Date": "2024-08-19", + "Title": "Create Compact Hash Digests of R Objects", + "Description": "Implementation of a function 'digest()' for the creation of hash digests of arbitrary R objects (using the 'md5', 'sha-1', 'sha-256', 'crc32', 'xxhash', 'murmurhash', 'spookyhash', 'blake3', 'crc32c', 'xxh3_64', and 'xxh3_128' algorithms) permitting easy comparison of R language objects, as well as functions such as'hmac()' to create hash-based message authentication code. Please note that this package is not meant to be deployed for cryptographic purposes for which more comprehensive (and widely tested) libraries such as 'OpenSSL' should be used.", + "URL": "https://github.com/eddelbuettel/digest, https://dirk.eddelbuettel.com/code/digest.html", + "BugReports": "https://github.com/eddelbuettel/digest/issues", + "Depends": [ + "R (>= 3.3.0)" + ], + "Imports": [ "utils" ], - "Hash": "33698c4b3127fc9f506654607fb73676" + "License": "GPL (>= 2)", + "Suggests": [ + "tinytest", + "simplermarkdown" + ], + "VignetteBuilder": "simplermarkdown", + "Encoding": "UTF-8", + "NeedsCompilation": "yes", + "Author": "Dirk Eddelbuettel [aut, cre] (), Antoine Lucas [ctb], Jarek Tuszynski [ctb], Henrik Bengtsson [ctb] (), Simon Urbanek [ctb] (), Mario Frasca [ctb], Bryan Lewis [ctb], Murray Stokely [ctb], Hannes Muehleisen [ctb], Duncan Murdoch [ctb], Jim Hester [ctb], Wush Wu [ctb] (), Qiang Kou [ctb] (), Thierry Onkelinx [ctb] (), Michel Lang [ctb] (), Viliam Simko [ctb], Kurt Hornik [ctb] (), Radford Neal [ctb] (), Kendon Bell [ctb] (), Matthew de Queljoe [ctb], Dmitry Selivanov [ctb], Ion Suruceanu [ctb], Bill Denney [ctb], Dirk Schumacher [ctb], András Svraka [ctb], Sergey Fedorov [ctb], Will Landau [ctb] (), Floris Vanderhaeghe [ctb] (), Kevin Tappe [ctb], Harris McGehee [ctb], Tim Mastny [ctb], Aaron Peikert [ctb] (), Mark van der Loo [ctb] (), Chris Muir [ctb] (), Moritz Beller [ctb] (), Sebastian Campbell [ctb], Winston Chang [ctb] (), Dean Attali [ctb] (), Michael Chirico [ctb] (), Kevin Ushey [ctb]", + "Maintainer": "Dirk Eddelbuettel ", + "Repository": "RSPM" }, "downlit": { "Package": "downlit", "Version": "0.4.4", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Title": "Syntax Highlighting and Automatic Linking", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Syntax highlighting of R code, specifically designed for the needs of 'RMarkdown' packages like 'pkgdown', 'hugodown', and 'bookdown'. It includes linking of function calls to their documentation on the web, and automatic translation of ANSI escapes in output to the equivalent HTML.", + "License": "MIT + file LICENSE", + "URL": "https://downlit.r-lib.org/, https://github.com/r-lib/downlit", + "BugReports": "https://github.com/r-lib/downlit/issues", + "Depends": [ + "R (>= 4.0.0)" + ], + "Imports": [ "brio", "desc", "digest", @@ -240,786 +630,2218 @@ "withr", "yaml" ], - "Hash": "45a6a596bf0108ee1ff16a040a2df897" + "Suggests": [ + "covr", + "htmltools", + "jsonlite", + "MASS", + "MassSpecWavelet", + "pkgload", + "rmarkdown", + "testthat (>= 3.0.0)", + "xml2" + ], + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.1", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut, cre], Posit Software, PBC [cph, fnd]", + "Maintainer": "Hadley Wickham ", + "Repository": "RSPM" }, "evaluate": { "Package": "evaluate", - "Version": "1.0.1", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" + "Version": "1.0.3", + "Source": "Repository", + "Type": "Package", + "Title": "Parsing and Evaluation Tools that Provide More Details than the Default", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\")), person(\"Yihui\", \"Xie\", role = \"aut\", comment = c(ORCID = \"0000-0003-0645-5666\")), person(\"Michael\", \"Lawrence\", role = \"ctb\"), person(\"Thomas\", \"Kluyver\", role = \"ctb\"), person(\"Jeroen\", \"Ooms\", role = \"ctb\"), person(\"Barret\", \"Schloerke\", role = \"ctb\"), person(\"Adam\", \"Ryczkowski\", role = \"ctb\"), person(\"Hiroaki\", \"Yutani\", role = \"ctb\"), person(\"Michel\", \"Lang\", role = \"ctb\"), person(\"Karolis\", \"Koncevičius\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Parsing and evaluation tools that make it easy to recreate the command line behaviour of R.", + "License": "MIT + file LICENSE", + "URL": "https://evaluate.r-lib.org/, https://github.com/r-lib/evaluate", + "BugReports": "https://github.com/r-lib/evaluate/issues", + "Depends": [ + "R (>= 3.6.0)" + ], + "Suggests": [ + "callr", + "covr", + "ggplot2 (>= 3.3.6)", + "lattice", + "methods", + "pkgload", + "rlang", + "knitr", + "testthat (>= 3.0.0)", + "withr" ], - "Hash": "3fd29944b231036ad67c3edb32e02201" + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut, cre], Yihui Xie [aut] (), Michael Lawrence [ctb], Thomas Kluyver [ctb], Jeroen Ooms [ctb], Barret Schloerke [ctb], Adam Ryczkowski [ctb], Hiroaki Yutani [ctb], Michel Lang [ctb], Karolis Koncevičius [ctb], Posit Software, PBC [cph, fnd]", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" }, "fansi": { "Package": "fansi", "Version": "1.0.6", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Title": "ANSI Control Sequence Aware String Functions", + "Description": "Counterparts to R string manipulation functions that account for the effects of ANSI text formatting control sequences.", + "Authors@R": "c( person(\"Brodie\", \"Gaslam\", email=\"brodie.gaslam@yahoo.com\", role=c(\"aut\", \"cre\")), person(\"Elliott\", \"Sales De Andrade\", role=\"ctb\"), person(family=\"R Core Team\", email=\"R-core@r-project.org\", role=\"cph\", comment=\"UTF8 byte length calcs from src/util.c\" ))", + "Depends": [ + "R (>= 3.1.0)" + ], + "License": "GPL-2 | GPL-3", + "URL": "https://github.com/brodieG/fansi", + "BugReports": "https://github.com/brodieG/fansi/issues", + "VignetteBuilder": "knitr", + "Suggests": [ + "unitizer", + "knitr", + "rmarkdown" + ], + "Imports": [ "grDevices", "utils" ], - "Hash": "962174cf2aeb5b9eea581522286a911f" + "RoxygenNote": "7.2.3", + "Encoding": "UTF-8", + "Collate": "'constants.R' 'fansi-package.R' 'internal.R' 'load.R' 'misc.R' 'nchar.R' 'strwrap.R' 'strtrim.R' 'strsplit.R' 'substr2.R' 'trimws.R' 'tohtml.R' 'unhandled.R' 'normalize.R' 'sgr.R'", + "NeedsCompilation": "yes", + "Author": "Brodie Gaslam [aut, cre], Elliott Sales De Andrade [ctb], R Core Team [cph] (UTF8 byte length calcs from src/util.c)", + "Maintainer": "Brodie Gaslam ", + "Repository": "RSPM" }, "fastmap": { "Package": "fastmap", "Version": "1.2.0", "Source": "Repository", - "Repository": "CRAN", - "Hash": "aa5e1cd11c2d15497494c5292d7ffcc8" + "Title": "Fast Data Structures", + "Authors@R": "c( person(\"Winston\", \"Chang\", email = \"winston@posit.co\", role = c(\"aut\", \"cre\")), person(given = \"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(given = \"Tessil\", role = \"cph\", comment = \"hopscotch_map library\") )", + "Description": "Fast implementation of data structures, including a key-value store, stack, and queue. Environments are commonly used as key-value stores in R, but every time a new key is used, it is added to R's global symbol table, causing a small amount of memory leakage. This can be problematic in cases where many different keys are used. Fastmap avoids this memory leak issue by implementing the map using data structures in C++.", + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "RoxygenNote": "7.2.3", + "Suggests": [ + "testthat (>= 2.1.1)" + ], + "URL": "https://r-lib.github.io/fastmap/, https://github.com/r-lib/fastmap", + "BugReports": "https://github.com/r-lib/fastmap/issues", + "NeedsCompilation": "yes", + "Author": "Winston Chang [aut, cre], Posit Software, PBC [cph, fnd], Tessil [cph] (hopscotch_map library)", + "Maintainer": "Winston Chang ", + "Repository": "RSPM" }, "fontawesome": { "Package": "fontawesome", - "Version": "0.5.2", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "htmltools", - "rlang" - ], - "Hash": "c2efdd5f0bcd1ea861c2d4e2a883a67d" + "Version": "0.5.3", + "Source": "Repository", + "Type": "Package", + "Title": "Easily Work with 'Font Awesome' Icons", + "Description": "Easily and flexibly insert 'Font Awesome' icons into 'R Markdown' documents and 'Shiny' apps. These icons can be inserted into HTML content through inline 'SVG' tags or 'i' tags. There is also a utility function for exporting 'Font Awesome' icons as 'PNG' images for those situations where raster graphics are needed.", + "Authors@R": "c( person(\"Richard\", \"Iannone\", , \"rich@posit.co\", c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0003-3925-190X\")), person(\"Christophe\", \"Dervieux\", , \"cderv@posit.co\", role = \"ctb\", comment = c(ORCID = \"0000-0003-4474-2498\")), person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = \"ctb\"), person(\"Dave\", \"Gandy\", role = c(\"ctb\", \"cph\"), comment = \"Font-Awesome font\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "License": "MIT + file LICENSE", + "URL": "https://github.com/rstudio/fontawesome, https://rstudio.github.io/fontawesome/", + "BugReports": "https://github.com/rstudio/fontawesome/issues", + "Encoding": "UTF-8", + "ByteCompile": "true", + "RoxygenNote": "7.3.2", + "Depends": [ + "R (>= 3.3.0)" + ], + "Imports": [ + "rlang (>= 1.0.6)", + "htmltools (>= 0.5.1.1)" + ], + "Suggests": [ + "covr", + "dplyr (>= 1.0.8)", + "gt (>= 0.9.0)", + "knitr (>= 1.31)", + "testthat (>= 3.0.0)", + "rsvg" + ], + "Config/testthat/edition": "3", + "NeedsCompilation": "no", + "Author": "Richard Iannone [aut, cre] (), Christophe Dervieux [ctb] (), Winston Chang [ctb], Dave Gandy [ctb, cph] (Font-Awesome font), Posit Software, PBC [cph, fnd]", + "Maintainer": "Richard Iannone ", + "Repository": "RSPM" }, "fs": { "Package": "fs", - "Version": "1.6.4", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Version": "1.6.5", + "Source": "Repository", + "Title": "Cross-Platform File System Operations Based on 'libuv'", + "Authors@R": "c( person(\"Jim\", \"Hester\", role = \"aut\"), person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\"), person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\")), person(\"libuv project contributors\", role = \"cph\", comment = \"libuv library\"), person(\"Joyent, Inc. and other Node contributors\", role = \"cph\", comment = \"libuv library\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "A cross-platform interface to file system operations, built on top of the 'libuv' C library.", + "License": "MIT + file LICENSE", + "URL": "https://fs.r-lib.org, https://github.com/r-lib/fs", + "BugReports": "https://github.com/r-lib/fs/issues", + "Depends": [ + "R (>= 3.6)" + ], + "Imports": [ "methods" ], - "Hash": "15aeb8c27f5ea5161f9f6a641fafd93a" + "Suggests": [ + "covr", + "crayon", + "knitr", + "pillar (>= 1.0.0)", + "rmarkdown", + "spelling", + "testthat (>= 3.0.0)", + "tibble (>= 1.1.0)", + "vctrs (>= 0.3.0)", + "withr" + ], + "VignetteBuilder": "knitr", + "ByteCompile": "true", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Copyright": "file COPYRIGHTS", + "Encoding": "UTF-8", + "Language": "en-US", + "RoxygenNote": "7.2.3", + "SystemRequirements": "GNU make", + "NeedsCompilation": "yes", + "Author": "Jim Hester [aut], Hadley Wickham [aut], Gábor Csárdi [aut, cre], libuv project contributors [cph] (libuv library), Joyent, Inc. and other Node contributors [cph] (libuv library), Posit Software, PBC [cph, fnd]", + "Maintainer": "Gábor Csárdi ", + "Repository": "RSPM" }, "gert": { "Package": "gert", "Version": "2.1.4", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Type": "Package", + "Title": "Simple Git Client for R", + "Authors@R": "c( person(\"Jeroen\", \"Ooms\", role = c(\"aut\", \"cre\"), email = \"jeroenooms@gmail.com\", comment = c(ORCID = \"0000-0002-4035-0289\")), person(\"Jennifer\", \"Bryan\", role = \"ctb\", email = \"jenny@posit.co\", comment = c(ORCID = \"0000-0002-6983-2759\")))", + "Description": "Simple git client for R based on 'libgit2' with support for SSH and HTTPS remotes. All functions in 'gert' use basic R data types (such as vectors and data-frames) for their arguments and return values. User credentials are shared with command line 'git' through the git-credential store and ssh keys stored on disk or ssh-agent.", + "License": "MIT + file LICENSE", + "URL": "https://docs.ropensci.org/gert/, https://ropensci.r-universe.dev/gert", + "BugReports": "https://github.com/r-lib/gert/issues", + "Imports": [ "askpass", - "credentials", - "openssl", - "rstudioapi", + "credentials (>= 1.2.1)", + "openssl (>= 2.0.3)", + "rstudioapi (>= 0.11)", "sys", - "zip" + "zip (>= 2.1.0)" ], - "Hash": "ae855ad6d7be20dd7b05d43d25700398" + "Suggests": [ + "spelling", + "knitr", + "rmarkdown", + "testthat" + ], + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2.9000", + "SystemRequirements": "libgit2 (>= 1.0): libgit2-devel (rpm) or libgit2-dev (deb)", + "Language": "en-US", + "NeedsCompilation": "yes", + "Author": "Jeroen Ooms [aut, cre] (), Jennifer Bryan [ctb] ()", + "Maintainer": "Jeroen Ooms ", + "Repository": "RSPM" }, "gh": { "Package": "gh", "Version": "1.4.1", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cli", + "Title": "'GitHub' 'API'", + "Authors@R": "c( person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"cre\", \"ctb\")), person(\"Jennifer\", \"Bryan\", role = \"aut\"), person(\"Hadley\", \"Wickham\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Minimal client to access the 'GitHub' 'API'.", + "License": "MIT + file LICENSE", + "URL": "https://gh.r-lib.org/, https://github.com/r-lib/gh#readme", + "BugReports": "https://github.com/r-lib/gh/issues", + "Depends": [ + "R (>= 3.6)" + ], + "Imports": [ + "cli (>= 3.0.1)", "gitcreds", "glue", "httr2", "ini", "jsonlite", "lifecycle", - "rlang" + "rlang (>= 1.0.0)" + ], + "Suggests": [ + "covr", + "knitr", + "mockery", + "rmarkdown", + "rprojroot", + "spelling", + "testthat (>= 3.0.0)", + "withr" ], - "Hash": "fbbbc48eba7a6626a08bb365e44b563b" + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "Language": "en-US", + "RoxygenNote": "7.3.1.9000", + "NeedsCompilation": "no", + "Author": "Gábor Csárdi [cre, ctb], Jennifer Bryan [aut], Hadley Wickham [aut], Posit Software, PBC [cph, fnd]", + "Maintainer": "Gábor Csárdi ", + "Repository": "RSPM" }, "gitcreds": { "Package": "gitcreds", "Version": "0.1.2", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" + "Title": "Query 'git' Credentials from 'R'", + "Authors@R": "c( person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\")), person(\"RStudio\", role = c(\"cph\", \"fnd\")) )", + "Description": "Query, set, delete credentials from the 'git' credential store. Manage 'GitHub' tokens and other 'git' credentials. This package is to be used by other packages that need to authenticate to 'GitHub' and/or other 'git' repositories.", + "License": "MIT + file LICENSE", + "URL": "https://gitcreds.r-lib.org/, https://github.com/r-lib/gitcreds", + "BugReports": "https://github.com/r-lib/gitcreds/issues", + "Depends": [ + "R (>= 3.4)" + ], + "Suggests": [ + "codetools", + "covr", + "knitr", + "mockery", + "oskeyring", + "rmarkdown", + "testthat (>= 3.0.0)", + "withr" ], - "Hash": "ab08ac61f3e1be454ae21911eb8bc2fe" + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Encoding": "UTF-8", + "RoxygenNote": "7.2.1.9000", + "SystemRequirements": "git", + "Config/testthat/edition": "3", + "NeedsCompilation": "no", + "Author": "Gábor Csárdi [aut, cre], RStudio [cph, fnd]", + "Maintainer": "Gábor Csárdi ", + "Repository": "RSPM" }, "glue": { "Package": "glue", "Version": "1.8.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Title": "Interpreted String Literals", + "Authors@R": "c( person(\"Jim\", \"Hester\", role = \"aut\", comment = c(ORCID = \"0000-0002-2739-7082\")), person(\"Jennifer\", \"Bryan\", , \"jenny@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-6983-2759\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "An implementation of interpreted string literals, inspired by Python's Literal String Interpolation and Docstrings and Julia's Triple-Quoted String Literals .", + "License": "MIT + file LICENSE", + "URL": "https://glue.tidyverse.org/, https://github.com/tidyverse/glue", + "BugReports": "https://github.com/tidyverse/glue/issues", + "Depends": [ + "R (>= 3.6)" + ], + "Imports": [ "methods" ], - "Hash": "5899f1eaa825580172bb56c08266f37c" + "Suggests": [ + "crayon", + "DBI (>= 1.2.0)", + "dplyr", + "knitr", + "magrittr", + "rlang", + "rmarkdown", + "RSQLite", + "testthat (>= 3.2.0)", + "vctrs (>= 0.3.0)", + "waldo (>= 0.5.3)", + "withr" + ], + "VignetteBuilder": "knitr", + "ByteCompile": "true", + "Config/Needs/website": "bench, forcats, ggbeeswarm, ggplot2, R.utils, rprintf, tidyr, tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "yes", + "Author": "Jim Hester [aut] (), Jennifer Bryan [aut, cre] (), Posit Software, PBC [cph, fnd]", + "Maintainer": "Jennifer Bryan ", + "Repository": "RSPM" }, "highr": { "Package": "highr", "Version": "0.11", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "xfun" + "Type": "Package", + "Title": "Syntax Highlighting for R Source Code", + "Authors@R": "c( person(\"Yihui\", \"Xie\", role = c(\"aut\", \"cre\"), email = \"xie@yihui.name\", comment = c(ORCID = \"0000-0003-0645-5666\")), person(\"Yixuan\", \"Qiu\", role = \"aut\"), person(\"Christopher\", \"Gandrud\", role = \"ctb\"), person(\"Qiang\", \"Li\", role = \"ctb\") )", + "Description": "Provides syntax highlighting for R source code. Currently it supports LaTeX and HTML output. Source code of other languages is supported via Andre Simon's highlight package ().", + "Depends": [ + "R (>= 3.3.0)" ], - "Hash": "d65ba49117ca223614f71b60d85b8ab7" + "Imports": [ + "xfun (>= 0.18)" + ], + "Suggests": [ + "knitr", + "markdown", + "testit" + ], + "License": "GPL", + "URL": "https://github.com/yihui/highr", + "BugReports": "https://github.com/yihui/highr/issues", + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.1", + "NeedsCompilation": "no", + "Author": "Yihui Xie [aut, cre] (), Yixuan Qiu [aut], Christopher Gandrud [ctb], Qiang Li [ctb]", + "Maintainer": "Yihui Xie ", + "Repository": "RSPM" }, "htmltools": { "Package": "htmltools", "Version": "0.5.8.1", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Type": "Package", + "Title": "Tools for HTML", + "Authors@R": "c( person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"Carson\", \"Sievert\", , \"carson@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-4958-2844\")), person(\"Barret\", \"Schloerke\", , \"barret@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0001-9986-114X\")), person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0002-1576-2126\")), person(\"Yihui\", \"Xie\", , \"yihui@posit.co\", role = \"aut\"), person(\"Jeff\", \"Allen\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Tools for HTML generation and output.", + "License": "GPL (>= 2)", + "URL": "https://github.com/rstudio/htmltools, https://rstudio.github.io/htmltools/", + "BugReports": "https://github.com/rstudio/htmltools/issues", + "Depends": [ + "R (>= 2.14.1)" + ], + "Imports": [ "base64enc", "digest", - "fastmap", + "fastmap (>= 1.1.0)", "grDevices", - "rlang", + "rlang (>= 1.0.0)", "utils" ], - "Hash": "81d371a9cc60640e74e4ab6ac46dcedc" + "Suggests": [ + "Cairo", + "markdown", + "ragg", + "shiny", + "testthat", + "withr" + ], + "Enhances": [ + "knitr" + ], + "Config/Needs/check": "knitr", + "Config/Needs/website": "rstudio/quillt, bench", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.1", + "Collate": "'colors.R' 'fill.R' 'html_dependency.R' 'html_escape.R' 'html_print.R' 'htmltools-package.R' 'images.R' 'known_tags.R' 'selector.R' 'staticimports.R' 'tag_query.R' 'utils.R' 'tags.R' 'template.R'", + "NeedsCompilation": "yes", + "Author": "Joe Cheng [aut], Carson Sievert [aut, cre] (), Barret Schloerke [aut] (), Winston Chang [aut] (), Yihui Xie [aut], Jeff Allen [aut], Posit Software, PBC [cph, fnd]", + "Maintainer": "Carson Sievert ", + "Repository": "RSPM" }, "httpuv": { "Package": "httpuv", "Version": "1.6.15", "Source": "Repository", - "Repository": "https://carpentries.r-universe.dev", - "RemoteUrl": "https://github.com/rstudio/httpuv", - "RemoteRef": "v1.6.15", - "RemoteSha": "19631930c178ee7ffb5e712eefc9b08d94db23f4", - "Requirements": [ - "R", - "R6", - "Rcpp", - "later", + "Type": "Package", + "Title": "HTTP and WebSocket Server Library", + "Authors@R": "c( person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = c(\"aut\", \"cre\")), person(\"Posit, PBC\", \"fnd\", role = \"cph\"), person(\"Hector\", \"Corrada Bravo\", role = \"ctb\"), person(\"Jeroen\", \"Ooms\", role = \"ctb\"), person(\"Andrzej\", \"Krzemienski\", role = \"cph\", comment = \"optional.hpp\"), person(\"libuv project contributors\", role = \"cph\", comment = \"libuv library, see src/libuv/AUTHORS file\"), person(\"Joyent, Inc. and other Node contributors\", role = \"cph\", comment = \"libuv library, see src/libuv/AUTHORS file; and http-parser library, see src/http-parser/AUTHORS file\"), person(\"Niels\", \"Provos\", role = \"cph\", comment = \"libuv subcomponent: tree.h\"), person(\"Internet Systems Consortium, Inc.\", role = \"cph\", comment = \"libuv subcomponent: inet_pton and inet_ntop, contained in src/libuv/src/inet.c\"), person(\"Alexander\", \"Chemeris\", role = \"cph\", comment = \"libuv subcomponent: stdint-msvc2008.h (from msinttypes)\"), person(\"Google, Inc.\", role = \"cph\", comment = \"libuv subcomponent: pthread-fixes.c\"), person(\"Sony Mobile Communcations AB\", role = \"cph\", comment = \"libuv subcomponent: pthread-fixes.c\"), person(\"Berkeley Software Design Inc.\", role = \"cph\", comment = \"libuv subcomponent: android-ifaddrs.h, android-ifaddrs.c\"), person(\"Kenneth\", \"MacKay\", role = \"cph\", comment = \"libuv subcomponent: android-ifaddrs.h, android-ifaddrs.c\"), person(\"Emergya (Cloud4all, FP7/2007-2013, grant agreement no 289016)\", role = \"cph\", comment = \"libuv subcomponent: android-ifaddrs.h, android-ifaddrs.c\"), person(\"Steve\", \"Reid\", role = \"aut\", comment = \"SHA-1 implementation\"), person(\"James\", \"Brown\", role = \"aut\", comment = \"SHA-1 implementation\"), person(\"Bob\", \"Trower\", role = \"aut\", comment = \"base64 implementation\"), person(\"Alexander\", \"Peslyak\", role = \"aut\", comment = \"MD5 implementation\"), person(\"Trantor Standard Systems\", role = \"cph\", comment = \"base64 implementation\"), person(\"Igor\", \"Sysoev\", role = \"cph\", comment = \"http-parser\") )", + "Description": "Provides low-level socket and protocol support for handling HTTP and WebSocket requests directly from within R. It is primarily intended as a building block for other packages, rather than making it particularly easy to create complete web applications using httpuv alone. httpuv is built on top of the libuv and http-parser C libraries, both of which were developed by Joyent, Inc. (See LICENSE file for libuv and http-parser license information.)", + "License": "GPL (>= 2) | file LICENSE", + "URL": "https://github.com/rstudio/httpuv", + "BugReports": "https://github.com/rstudio/httpuv/issues", + "Depends": [ + "R (>= 2.15.1)" + ], + "Imports": [ + "later (>= 0.8.0)", "promises", + "R6", + "Rcpp (>= 1.0.7)", "utils" ], - "Hash": "d55aa087c47a63ead0f6fc10f8fa1ee0" + "Suggests": [ + "callr", + "curl", + "testthat", + "websocket" + ], + "LinkingTo": [ + "later", + "Rcpp" + ], + "Encoding": "UTF-8", + "RoxygenNote": "7.3.1", + "SystemRequirements": "GNU make, zlib", + "Collate": "'RcppExports.R' 'httpuv.R' 'random_port.R' 'server.R' 'staticServer.R' 'static_paths.R' 'utils.R'", + "NeedsCompilation": "yes", + "Author": "Joe Cheng [aut], Winston Chang [aut, cre], Posit, PBC fnd [cph], Hector Corrada Bravo [ctb], Jeroen Ooms [ctb], Andrzej Krzemienski [cph] (optional.hpp), libuv project contributors [cph] (libuv library, see src/libuv/AUTHORS file), Joyent, Inc. and other Node contributors [cph] (libuv library, see src/libuv/AUTHORS file; and http-parser library, see src/http-parser/AUTHORS file), Niels Provos [cph] (libuv subcomponent: tree.h), Internet Systems Consortium, Inc. [cph] (libuv subcomponent: inet_pton and inet_ntop, contained in src/libuv/src/inet.c), Alexander Chemeris [cph] (libuv subcomponent: stdint-msvc2008.h (from msinttypes)), Google, Inc. [cph] (libuv subcomponent: pthread-fixes.c), Sony Mobile Communcations AB [cph] (libuv subcomponent: pthread-fixes.c), Berkeley Software Design Inc. [cph] (libuv subcomponent: android-ifaddrs.h, android-ifaddrs.c), Kenneth MacKay [cph] (libuv subcomponent: android-ifaddrs.h, android-ifaddrs.c), Emergya (Cloud4all, FP7/2007-2013, grant agreement no 289016) [cph] (libuv subcomponent: android-ifaddrs.h, android-ifaddrs.c), Steve Reid [aut] (SHA-1 implementation), James Brown [aut] (SHA-1 implementation), Bob Trower [aut] (base64 implementation), Alexander Peslyak [aut] (MD5 implementation), Trantor Standard Systems [cph] (base64 implementation), Igor Sysoev [cph] (http-parser)", + "Maintainer": "Winston Chang ", + "Repository": "RSPM" }, "httr2": { "Package": "httr2", - "Version": "1.0.5", + "Version": "1.1.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "R6", - "cli", - "curl", + "Title": "Perform HTTP Requests and Process the Responses", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(\"Maximilian\", \"Girlich\", role = \"ctb\") )", + "Description": "Tools for creating and modifying HTTP requests, then performing them and processing the results. 'httr2' is a modern re-imagining of 'httr' that uses a pipe-based interface and solves more of the problems that API wrapping packages face.", + "License": "MIT + file LICENSE", + "URL": "https://httr2.r-lib.org, https://github.com/r-lib/httr2", + "BugReports": "https://github.com/r-lib/httr2/issues", + "Depends": [ + "R (>= 4.0)" + ], + "Imports": [ + "cli (>= 3.0.0)", + "curl (>= 6.1.0)", "glue", "lifecycle", "magrittr", "openssl", + "R6", "rappdirs", - "rlang", - "vctrs", + "rlang (>= 1.1.0)", + "vctrs (>= 0.6.3)", "withr" ], - "Hash": "d84e4c33206aaace37714901ac2b00c3" + "Suggests": [ + "askpass", + "bench", + "clipr", + "covr", + "docopt", + "httpuv", + "jose", + "jsonlite", + "knitr", + "later (>= 1.4.0)", + "paws.common", + "promises", + "rmarkdown", + "testthat (>= 3.1.8)", + "tibble", + "webfakes", + "xml2" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "true", + "Config/testthat/start-first": "multi-req, resp-stream, req-perform", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut, cre], Posit Software, PBC [cph, fnd], Maximilian Girlich [ctb]", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" }, "ini": { "Package": "ini", "Version": "0.3.1", "Source": "Repository", - "Repository": "CRAN", - "Hash": "6154ec2223172bce8162d4153cda21f7" + "Type": "Package", + "Title": "Read and Write '.ini' Files", + "Date": "2018-05-19", + "Author": "David Valentim Dias", + "Maintainer": "David Valentim Dias ", + "Description": "Parse simple '.ini' configuration files to an structured list. Users can manipulate this resulting list with lapply() functions. This same structured list can be used to write back to file after modifications.", + "License": "GPL-3", + "URL": "https://github.com/dvdscripter/ini", + "BugReports": "https://github.com/dvdscripter/ini/issues", + "LazyData": "FALSE", + "RoxygenNote": "6.0.1", + "Suggests": [ + "testthat" + ], + "NeedsCompilation": "no", + "Repository": "RSPM", + "Encoding": "UTF-8" }, "jquerylib": { "Package": "jquerylib", "Version": "0.1.4", "Source": "Repository", - "Repository": "RSPM", - "Requirements": [ + "Title": "Obtain 'jQuery' as an HTML Dependency Object", + "Authors@R": "c( person(\"Carson\", \"Sievert\", role = c(\"aut\", \"cre\"), email = \"carson@rstudio.com\", comment = c(ORCID = \"0000-0002-4958-2844\")), person(\"Joe\", \"Cheng\", role = \"aut\", email = \"joe@rstudio.com\"), person(family = \"RStudio\", role = \"cph\"), person(family = \"jQuery Foundation\", role = \"cph\", comment = \"jQuery library and jQuery UI library\"), person(family = \"jQuery contributors\", role = c(\"ctb\", \"cph\"), comment = \"jQuery library; authors listed in inst/lib/jquery-AUTHORS.txt\") )", + "Description": "Obtain any major version of 'jQuery' () and use it in any webpage generated by 'htmltools' (e.g. 'shiny', 'htmlwidgets', and 'rmarkdown'). Most R users don't need to use this package directly, but other R packages (e.g. 'shiny', 'rmarkdown', etc.) depend on this package to avoid bundling redundant copies of 'jQuery'.", + "License": "MIT + file LICENSE", + "Encoding": "UTF-8", + "Config/testthat/edition": "3", + "RoxygenNote": "7.0.2", + "Imports": [ "htmltools" ], - "Hash": "5aab57a3bd297eee1c1d862735972182" + "Suggests": [ + "testthat" + ], + "NeedsCompilation": "no", + "Author": "Carson Sievert [aut, cre] (), Joe Cheng [aut], RStudio [cph], jQuery Foundation [cph] (jQuery library and jQuery UI library), jQuery contributors [ctb, cph] (jQuery library; authors listed in inst/lib/jquery-AUTHORS.txt)", + "Maintainer": "Carson Sievert ", + "Repository": "RSPM" }, "jsonlite": { "Package": "jsonlite", "Version": "1.8.9", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Title": "A Simple and Robust JSON Parser and Generator for R", + "License": "MIT + file LICENSE", + "Depends": [ "methods" ], - "Hash": "4e993b65c2c3ffbffce7bb3e2c6f832b" + "Authors@R": "c( person(\"Jeroen\", \"Ooms\", role = c(\"aut\", \"cre\"), email = \"jeroenooms@gmail.com\", comment = c(ORCID = \"0000-0002-4035-0289\")), person(\"Duncan\", \"Temple Lang\", role = \"ctb\"), person(\"Lloyd\", \"Hilaiel\", role = \"cph\", comment=\"author of bundled libyajl\"))", + "URL": "https://jeroen.r-universe.dev/jsonlite https://arxiv.org/abs/1403.2805", + "BugReports": "https://github.com/jeroen/jsonlite/issues", + "Maintainer": "Jeroen Ooms ", + "VignetteBuilder": "knitr, R.rsp", + "Description": "A reasonably fast JSON parser and generator, optimized for statistical data and the web. Offers simple, flexible tools for working with JSON in R, and is particularly powerful for building pipelines and interacting with a web API. The implementation is based on the mapping described in the vignette (Ooms, 2014). In addition to converting JSON data from/to R objects, 'jsonlite' contains functions to stream, validate, and prettify JSON data. The unit tests included with the package verify that all edge cases are encoded and decoded consistently for use with dynamic data in systems and applications.", + "Suggests": [ + "httr", + "vctrs", + "testthat", + "knitr", + "rmarkdown", + "R.rsp", + "sf" + ], + "RoxygenNote": "7.2.3", + "Encoding": "UTF-8", + "NeedsCompilation": "yes", + "Author": "Jeroen Ooms [aut, cre] (), Duncan Temple Lang [ctb], Lloyd Hilaiel [cph] (author of bundled libyajl)", + "Repository": "RSPM" }, "knitr": { "Package": "knitr", - "Version": "1.48", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "evaluate", - "highr", + "Version": "1.49", + "Source": "Repository", + "Type": "Package", + "Title": "A General-Purpose Package for Dynamic Report Generation in R", + "Authors@R": "c( person(\"Yihui\", \"Xie\", role = c(\"aut\", \"cre\"), email = \"xie@yihui.name\", comment = c(ORCID = \"0000-0003-0645-5666\")), person(\"Abhraneel\", \"Sarma\", role = \"ctb\"), person(\"Adam\", \"Vogt\", role = \"ctb\"), person(\"Alastair\", \"Andrew\", role = \"ctb\"), person(\"Alex\", \"Zvoleff\", role = \"ctb\"), person(\"Amar\", \"Al-Zubaidi\", role = \"ctb\"), person(\"Andre\", \"Simon\", role = \"ctb\", comment = \"the CSS files under inst/themes/ were derived from the Highlight package http://www.andre-simon.de\"), person(\"Aron\", \"Atkins\", role = \"ctb\"), person(\"Aaron\", \"Wolen\", role = \"ctb\"), person(\"Ashley\", \"Manton\", role = \"ctb\"), person(\"Atsushi\", \"Yasumoto\", role = \"ctb\", comment = c(ORCID = \"0000-0002-8335-495X\")), person(\"Ben\", \"Baumer\", role = \"ctb\"), person(\"Brian\", \"Diggs\", role = \"ctb\"), person(\"Brian\", \"Zhang\", role = \"ctb\"), person(\"Bulat\", \"Yapparov\", role = \"ctb\"), person(\"Cassio\", \"Pereira\", role = \"ctb\"), person(\"Christophe\", \"Dervieux\", role = \"ctb\"), person(\"David\", \"Hall\", role = \"ctb\"), person(\"David\", \"Hugh-Jones\", role = \"ctb\"), person(\"David\", \"Robinson\", role = \"ctb\"), person(\"Doug\", \"Hemken\", role = \"ctb\"), person(\"Duncan\", \"Murdoch\", role = \"ctb\"), person(\"Elio\", \"Campitelli\", role = \"ctb\"), person(\"Ellis\", \"Hughes\", role = \"ctb\"), person(\"Emily\", \"Riederer\", role = \"ctb\"), person(\"Fabian\", \"Hirschmann\", role = \"ctb\"), person(\"Fitch\", \"Simeon\", role = \"ctb\"), person(\"Forest\", \"Fang\", role = \"ctb\"), person(c(\"Frank\", \"E\", \"Harrell\", \"Jr\"), role = \"ctb\", comment = \"the Sweavel package at inst/misc/Sweavel.sty\"), person(\"Garrick\", \"Aden-Buie\", role = \"ctb\"), person(\"Gregoire\", \"Detrez\", role = \"ctb\"), person(\"Hadley\", \"Wickham\", role = \"ctb\"), person(\"Hao\", \"Zhu\", role = \"ctb\"), person(\"Heewon\", \"Jeon\", role = \"ctb\"), person(\"Henrik\", \"Bengtsson\", role = \"ctb\"), person(\"Hiroaki\", \"Yutani\", role = \"ctb\"), person(\"Ian\", \"Lyttle\", role = \"ctb\"), person(\"Hodges\", \"Daniel\", role = \"ctb\"), person(\"Jacob\", \"Bien\", role = \"ctb\"), person(\"Jake\", \"Burkhead\", role = \"ctb\"), person(\"James\", \"Manton\", role = \"ctb\"), person(\"Jared\", \"Lander\", role = \"ctb\"), person(\"Jason\", \"Punyon\", role = \"ctb\"), person(\"Javier\", \"Luraschi\", role = \"ctb\"), person(\"Jeff\", \"Arnold\", role = \"ctb\"), person(\"Jenny\", \"Bryan\", role = \"ctb\"), person(\"Jeremy\", \"Ashkenas\", role = c(\"ctb\", \"cph\"), comment = \"the CSS file at inst/misc/docco-classic.css\"), person(\"Jeremy\", \"Stephens\", role = \"ctb\"), person(\"Jim\", \"Hester\", role = \"ctb\"), person(\"Joe\", \"Cheng\", role = \"ctb\"), person(\"Johannes\", \"Ranke\", role = \"ctb\"), person(\"John\", \"Honaker\", role = \"ctb\"), person(\"John\", \"Muschelli\", role = \"ctb\"), person(\"Jonathan\", \"Keane\", role = \"ctb\"), person(\"JJ\", \"Allaire\", role = \"ctb\"), person(\"Johan\", \"Toloe\", role = \"ctb\"), person(\"Jonathan\", \"Sidi\", role = \"ctb\"), person(\"Joseph\", \"Larmarange\", role = \"ctb\"), person(\"Julien\", \"Barnier\", role = \"ctb\"), person(\"Kaiyin\", \"Zhong\", role = \"ctb\"), person(\"Kamil\", \"Slowikowski\", role = \"ctb\"), person(\"Karl\", \"Forner\", role = \"ctb\"), person(c(\"Kevin\", \"K.\"), \"Smith\", role = \"ctb\"), person(\"Kirill\", \"Mueller\", role = \"ctb\"), person(\"Kohske\", \"Takahashi\", role = \"ctb\"), person(\"Lorenz\", \"Walthert\", role = \"ctb\"), person(\"Lucas\", \"Gallindo\", role = \"ctb\"), person(\"Marius\", \"Hofert\", role = \"ctb\"), person(\"Martin\", \"Modrák\", role = \"ctb\"), person(\"Michael\", \"Chirico\", role = \"ctb\"), person(\"Michael\", \"Friendly\", role = \"ctb\"), person(\"Michal\", \"Bojanowski\", role = \"ctb\"), person(\"Michel\", \"Kuhlmann\", role = \"ctb\"), person(\"Miller\", \"Patrick\", role = \"ctb\"), person(\"Nacho\", \"Caballero\", role = \"ctb\"), person(\"Nick\", \"Salkowski\", role = \"ctb\"), person(\"Niels Richard\", \"Hansen\", role = \"ctb\"), person(\"Noam\", \"Ross\", role = \"ctb\"), person(\"Obada\", \"Mahdi\", role = \"ctb\"), person(\"Pavel N.\", \"Krivitsky\", role = \"ctb\", comment=c(ORCID = \"0000-0002-9101-3362\")), person(\"Pedro\", \"Faria\", role = \"ctb\"), person(\"Qiang\", \"Li\", role = \"ctb\"), person(\"Ramnath\", \"Vaidyanathan\", role = \"ctb\"), person(\"Richard\", \"Cotton\", role = \"ctb\"), person(\"Robert\", \"Krzyzanowski\", role = \"ctb\"), person(\"Rodrigo\", \"Copetti\", role = \"ctb\"), person(\"Romain\", \"Francois\", role = \"ctb\"), person(\"Ruaridh\", \"Williamson\", role = \"ctb\"), person(\"Sagiru\", \"Mati\", role = \"ctb\", comment = c(ORCID = \"0000-0003-1413-3974\")), person(\"Scott\", \"Kostyshak\", role = \"ctb\"), person(\"Sebastian\", \"Meyer\", role = \"ctb\"), person(\"Sietse\", \"Brouwer\", role = \"ctb\"), person(c(\"Simon\", \"de\"), \"Bernard\", role = \"ctb\"), person(\"Sylvain\", \"Rousseau\", role = \"ctb\"), person(\"Taiyun\", \"Wei\", role = \"ctb\"), person(\"Thibaut\", \"Assus\", role = \"ctb\"), person(\"Thibaut\", \"Lamadon\", role = \"ctb\"), person(\"Thomas\", \"Leeper\", role = \"ctb\"), person(\"Tim\", \"Mastny\", role = \"ctb\"), person(\"Tom\", \"Torsney-Weir\", role = \"ctb\"), person(\"Trevor\", \"Davis\", role = \"ctb\"), person(\"Viktoras\", \"Veitas\", role = \"ctb\"), person(\"Weicheng\", \"Zhu\", role = \"ctb\"), person(\"Wush\", \"Wu\", role = \"ctb\"), person(\"Zachary\", \"Foster\", role = \"ctb\"), person(\"Zhian N.\", \"Kamvar\", role = \"ctb\", comment = c(ORCID = \"0000-0003-1458-7108\")), person(given = \"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Provides a general-purpose tool for dynamic report generation in R using Literate Programming techniques.", + "Depends": [ + "R (>= 3.6.0)" + ], + "Imports": [ + "evaluate (>= 0.15)", + "highr (>= 0.11)", "methods", "tools", - "xfun", - "yaml" + "xfun (>= 0.48)", + "yaml (>= 2.1.19)" ], - "Hash": "acf380f300c721da9fde7df115a5f86f" + "Suggests": [ + "bslib", + "codetools", + "DBI (>= 0.4-1)", + "digest", + "formatR", + "gifski", + "gridSVG", + "htmlwidgets (>= 0.7)", + "jpeg", + "JuliaCall (>= 0.11.1)", + "magick", + "litedown", + "markdown (>= 1.3)", + "png", + "ragg", + "reticulate (>= 1.4)", + "rgl (>= 0.95.1201)", + "rlang", + "rmarkdown", + "sass", + "showtext", + "styler (>= 1.2.0)", + "targets (>= 0.6.0)", + "testit", + "tibble", + "tikzDevice (>= 0.10)", + "tinytex (>= 0.46)", + "webshot", + "rstudioapi", + "svglite" + ], + "License": "GPL", + "URL": "https://yihui.org/knitr/", + "BugReports": "https://github.com/yihui/knitr/issues", + "Encoding": "UTF-8", + "VignetteBuilder": "litedown, knitr", + "SystemRequirements": "Package vignettes based on R Markdown v2 or reStructuredText require Pandoc (http://pandoc.org). The function rst2pdf() requires rst2pdf (https://github.com/rst2pdf/rst2pdf).", + "Collate": "'block.R' 'cache.R' 'utils.R' 'citation.R' 'hooks-html.R' 'plot.R' 'defaults.R' 'concordance.R' 'engine.R' 'highlight.R' 'themes.R' 'header.R' 'hooks-asciidoc.R' 'hooks-chunk.R' 'hooks-extra.R' 'hooks-latex.R' 'hooks-md.R' 'hooks-rst.R' 'hooks-textile.R' 'hooks.R' 'output.R' 'package.R' 'pandoc.R' 'params.R' 'parser.R' 'pattern.R' 'rocco.R' 'spin.R' 'table.R' 'template.R' 'utils-conversion.R' 'utils-rd2html.R' 'utils-string.R' 'utils-sweave.R' 'utils-upload.R' 'utils-vignettes.R' 'zzz.R'", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "no", + "Author": "Yihui Xie [aut, cre] (), Abhraneel Sarma [ctb], Adam Vogt [ctb], Alastair Andrew [ctb], Alex Zvoleff [ctb], Amar Al-Zubaidi [ctb], Andre Simon [ctb] (the CSS files under inst/themes/ were derived from the Highlight package http://www.andre-simon.de), Aron Atkins [ctb], Aaron Wolen [ctb], Ashley Manton [ctb], Atsushi Yasumoto [ctb] (), Ben Baumer [ctb], Brian Diggs [ctb], Brian Zhang [ctb], Bulat Yapparov [ctb], Cassio Pereira [ctb], Christophe Dervieux [ctb], David Hall [ctb], David Hugh-Jones [ctb], David Robinson [ctb], Doug Hemken [ctb], Duncan Murdoch [ctb], Elio Campitelli [ctb], Ellis Hughes [ctb], Emily Riederer [ctb], Fabian Hirschmann [ctb], Fitch Simeon [ctb], Forest Fang [ctb], Frank E Harrell Jr [ctb] (the Sweavel package at inst/misc/Sweavel.sty), Garrick Aden-Buie [ctb], Gregoire Detrez [ctb], Hadley Wickham [ctb], Hao Zhu [ctb], Heewon Jeon [ctb], Henrik Bengtsson [ctb], Hiroaki Yutani [ctb], Ian Lyttle [ctb], Hodges Daniel [ctb], Jacob Bien [ctb], Jake Burkhead [ctb], James Manton [ctb], Jared Lander [ctb], Jason Punyon [ctb], Javier Luraschi [ctb], Jeff Arnold [ctb], Jenny Bryan [ctb], Jeremy Ashkenas [ctb, cph] (the CSS file at inst/misc/docco-classic.css), Jeremy Stephens [ctb], Jim Hester [ctb], Joe Cheng [ctb], Johannes Ranke [ctb], John Honaker [ctb], John Muschelli [ctb], Jonathan Keane [ctb], JJ Allaire [ctb], Johan Toloe [ctb], Jonathan Sidi [ctb], Joseph Larmarange [ctb], Julien Barnier [ctb], Kaiyin Zhong [ctb], Kamil Slowikowski [ctb], Karl Forner [ctb], Kevin K. Smith [ctb], Kirill Mueller [ctb], Kohske Takahashi [ctb], Lorenz Walthert [ctb], Lucas Gallindo [ctb], Marius Hofert [ctb], Martin Modrák [ctb], Michael Chirico [ctb], Michael Friendly [ctb], Michal Bojanowski [ctb], Michel Kuhlmann [ctb], Miller Patrick [ctb], Nacho Caballero [ctb], Nick Salkowski [ctb], Niels Richard Hansen [ctb], Noam Ross [ctb], Obada Mahdi [ctb], Pavel N. Krivitsky [ctb] (), Pedro Faria [ctb], Qiang Li [ctb], Ramnath Vaidyanathan [ctb], Richard Cotton [ctb], Robert Krzyzanowski [ctb], Rodrigo Copetti [ctb], Romain Francois [ctb], Ruaridh Williamson [ctb], Sagiru Mati [ctb] (), Scott Kostyshak [ctb], Sebastian Meyer [ctb], Sietse Brouwer [ctb], Simon de Bernard [ctb], Sylvain Rousseau [ctb], Taiyun Wei [ctb], Thibaut Assus [ctb], Thibaut Lamadon [ctb], Thomas Leeper [ctb], Tim Mastny [ctb], Tom Torsney-Weir [ctb], Trevor Davis [ctb], Viktoras Veitas [ctb], Weicheng Zhu [ctb], Wush Wu [ctb], Zachary Foster [ctb], Zhian N. Kamvar [ctb] (), Posit Software, PBC [cph, fnd]", + "Maintainer": "Yihui Xie ", + "Repository": "RSPM" }, "later": { "Package": "later", - "Version": "1.3.2", + "Version": "1.4.1", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "Rcpp", + "Type": "Package", + "Title": "Utilities for Scheduling Functions to Execute Later with Event Loops", + "Authors@R": "c( person(\"Winston\", \"Chang\", role = c(\"aut\", \"cre\"), email = \"winston@posit.co\"), person(\"Joe\", \"Cheng\", role = c(\"aut\"), email = \"joe@posit.co\"), person(\"Charlie\", \"Gao\", role = c(\"aut\"), email = \"charlie.gao@shikokuchuo.net\", comment = c(ORCID = \"0000-0002-0750-061X\")), person(family = \"Posit Software, PBC\", role = \"cph\"), person(\"Marcus\", \"Geelnard\", role = c(\"ctb\", \"cph\"), comment = \"TinyCThread library, https://tinycthread.github.io/\"), person(\"Evan\", \"Nemerson\", role = c(\"ctb\", \"cph\"), comment = \"TinyCThread library, https://tinycthread.github.io/\") )", + "Description": "Executes arbitrary R or C functions some time after the current time, after the R execution stack has emptied. The functions are scheduled in an event loop.", + "URL": "https://r-lib.github.io/later/, https://github.com/r-lib/later", + "BugReports": "https://github.com/r-lib/later/issues", + "License": "MIT + file LICENSE", + "Imports": [ + "Rcpp (>= 0.12.9)", "rlang" ], - "Hash": "a3e051d405326b8b0012377434c62b37" + "LinkingTo": [ + "Rcpp" + ], + "RoxygenNote": "7.3.2", + "Suggests": [ + "knitr", + "nanonext", + "R6", + "rmarkdown", + "testthat (>= 2.1.0)" + ], + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "NeedsCompilation": "yes", + "Author": "Winston Chang [aut, cre], Joe Cheng [aut], Charlie Gao [aut] (), Posit Software, PBC [cph], Marcus Geelnard [ctb, cph] (TinyCThread library, https://tinycthread.github.io/), Evan Nemerson [ctb, cph] (TinyCThread library, https://tinycthread.github.io/)", + "Maintainer": "Winston Chang ", + "Repository": "RSPM" }, "lifecycle": { "Package": "lifecycle", "Version": "1.0.4", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cli", + "Title": "Manage the Life Cycle of your Package Functions", + "Authors@R": "c( person(\"Lionel\", \"Henry\", , \"lionel@posit.co\", role = c(\"aut\", \"cre\")), person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Manage the life cycle of your exported functions with shared conventions, documentation badges, and user-friendly deprecation warnings.", + "License": "MIT + file LICENSE", + "URL": "https://lifecycle.r-lib.org/, https://github.com/r-lib/lifecycle", + "BugReports": "https://github.com/r-lib/lifecycle/issues", + "Depends": [ + "R (>= 3.6)" + ], + "Imports": [ + "cli (>= 3.4.0)", "glue", - "rlang" + "rlang (>= 1.1.0)" + ], + "Suggests": [ + "covr", + "crayon", + "knitr", + "lintr", + "rmarkdown", + "testthat (>= 3.0.1)", + "tibble", + "tidyverse", + "tools", + "vctrs", + "withr" ], - "Hash": "b8552d117e1b808b09a832f589b79035" + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate, usethis", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.2.1", + "NeedsCompilation": "no", + "Author": "Lionel Henry [aut, cre], Hadley Wickham [aut] (), Posit Software, PBC [cph, fnd]", + "Maintainer": "Lionel Henry ", + "Repository": "RSPM" }, "magrittr": { "Package": "magrittr", "Version": "2.0.3", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" - ], - "Hash": "7ce2733a9826b3aeb1775d56fd305472" + "Type": "Package", + "Title": "A Forward-Pipe Operator for R", + "Authors@R": "c( person(\"Stefan Milton\", \"Bache\", , \"stefan@stefanbache.dk\", role = c(\"aut\", \"cph\"), comment = \"Original author and creator of magrittr\"), person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", role = \"aut\"), person(\"Lionel\", \"Henry\", , \"lionel@rstudio.com\", role = \"cre\"), person(\"RStudio\", role = c(\"cph\", \"fnd\")) )", + "Description": "Provides a mechanism for chaining commands with a new forward-pipe operator, %>%. This operator will forward a value, or the result of an expression, into the next function call/expression. There is flexible support for the type of right-hand side expressions. For more information, see package vignette. To quote Rene Magritte, \"Ceci n'est pas un pipe.\"", + "License": "MIT + file LICENSE", + "URL": "https://magrittr.tidyverse.org, https://github.com/tidyverse/magrittr", + "BugReports": "https://github.com/tidyverse/magrittr/issues", + "Depends": [ + "R (>= 3.4.0)" + ], + "Suggests": [ + "covr", + "knitr", + "rlang", + "rmarkdown", + "testthat" + ], + "VignetteBuilder": "knitr", + "ByteCompile": "Yes", + "Config/Needs/website": "tidyverse/tidytemplate", + "Encoding": "UTF-8", + "RoxygenNote": "7.1.2", + "NeedsCompilation": "yes", + "Author": "Stefan Milton Bache [aut, cph] (Original author and creator of magrittr), Hadley Wickham [aut], Lionel Henry [cre], RStudio [cph, fnd]", + "Maintainer": "Lionel Henry ", + "Repository": "RSPM" }, "memoise": { "Package": "memoise", "Version": "2.0.1", "Source": "Repository", - "Repository": "RSPM", - "Requirements": [ - "cachem", - "rlang" - ], - "Hash": "e2817ccf4a065c5d9d7f2cfbe7c1d78c" + "Title": "'Memoisation' of Functions", + "Authors@R": "c(person(given = \"Hadley\", family = \"Wickham\", role = \"aut\", email = \"hadley@rstudio.com\"), person(given = \"Jim\", family = \"Hester\", role = \"aut\"), person(given = \"Winston\", family = \"Chang\", role = c(\"aut\", \"cre\"), email = \"winston@rstudio.com\"), person(given = \"Kirill\", family = \"Müller\", role = \"aut\", email = \"krlmlr+r@mailbox.org\"), person(given = \"Daniel\", family = \"Cook\", role = \"aut\", email = \"danielecook@gmail.com\"), person(given = \"Mark\", family = \"Edmondson\", role = \"ctb\", email = \"r@sunholo.com\"))", + "Description": "Cache the results of a function so that when you call it again with the same arguments it returns the previously computed value.", + "License": "MIT + file LICENSE", + "URL": "https://memoise.r-lib.org, https://github.com/r-lib/memoise", + "BugReports": "https://github.com/r-lib/memoise/issues", + "Imports": [ + "rlang (>= 0.4.10)", + "cachem" + ], + "Suggests": [ + "digest", + "aws.s3", + "covr", + "googleAuthR", + "googleCloudStorageR", + "httr", + "testthat" + ], + "Encoding": "UTF-8", + "RoxygenNote": "7.1.2", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut], Jim Hester [aut], Winston Chang [aut, cre], Kirill Müller [aut], Daniel Cook [aut], Mark Edmondson [ctb]", + "Maintainer": "Winston Chang ", + "Repository": "RSPM" }, "mime": { "Package": "mime", "Version": "0.12", "Source": "Repository", - "Repository": "RSPM", - "Requirements": [ + "Type": "Package", + "Title": "Map Filenames to MIME Types", + "Authors@R": "c( person(\"Yihui\", \"Xie\", role = c(\"aut\", \"cre\"), email = \"xie@yihui.name\", comment = c(ORCID = \"0000-0003-0645-5666\")), person(\"Jeffrey\", \"Horner\", role = \"ctb\"), person(\"Beilei\", \"Bian\", role = \"ctb\") )", + "Description": "Guesses the MIME type from a filename extension using the data derived from /etc/mime.types in UNIX-type systems.", + "Imports": [ "tools" ], - "Hash": "18e9c28c1d3ca1560ce30658b22ce104" + "License": "GPL", + "URL": "https://github.com/yihui/mime", + "BugReports": "https://github.com/yihui/mime/issues", + "RoxygenNote": "7.1.1", + "Encoding": "UTF-8", + "NeedsCompilation": "yes", + "Author": "Yihui Xie [aut, cre] (), Jeffrey Horner [ctb], Beilei Bian [ctb]", + "Maintainer": "Yihui Xie ", + "Repository": "RSPM" }, "openssl": { "Package": "openssl", - "Version": "2.2.2", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Version": "2.3.2", + "Source": "Repository", + "Type": "Package", + "Title": "Toolkit for Encryption, Signatures and Certificates Based on OpenSSL", + "Authors@R": "c(person(\"Jeroen\", \"Ooms\", role = c(\"aut\", \"cre\"), email = \"jeroenooms@gmail.com\", comment = c(ORCID = \"0000-0002-4035-0289\")), person(\"Oliver\", \"Keyes\", role = \"ctb\"))", + "Description": "Bindings to OpenSSL libssl and libcrypto, plus custom SSH key parsers. Supports RSA, DSA and EC curves P-256, P-384, P-521, and curve25519. Cryptographic signatures can either be created and verified manually or via x509 certificates. AES can be used in cbc, ctr or gcm mode for symmetric encryption; RSA for asymmetric (public key) encryption or EC for Diffie Hellman. High-level envelope functions combine RSA and AES for encrypting arbitrary sized data. Other utilities include key generators, hash functions (md5, sha1, sha256, etc), base64 encoder, a secure random number generator, and 'bignum' math methods for manually performing crypto calculations on large multibyte integers.", + "License": "MIT + file LICENSE", + "URL": "https://jeroen.r-universe.dev/openssl", + "BugReports": "https://github.com/jeroen/openssl/issues", + "SystemRequirements": "OpenSSL >= 1.0.2", + "VignetteBuilder": "knitr", + "Imports": [ "askpass" ], - "Hash": "d413e0fef796c9401a4419485f709ca1" + "Suggests": [ + "curl", + "testthat (>= 2.1.0)", + "digest", + "knitr", + "rmarkdown", + "jsonlite", + "jose", + "sodium" + ], + "RoxygenNote": "7.3.2", + "Encoding": "UTF-8", + "NeedsCompilation": "yes", + "Author": "Jeroen Ooms [aut, cre] (), Oliver Keyes [ctb]", + "Maintainer": "Jeroen Ooms ", + "Repository": "CRAN" }, "pegboard": { "Package": "pegboard", - "Version": "0.7.6", + "Version": "0.7.7", "Source": "GitHub", - "RemoteType": "github", - "RemoteHost": "api.github.com", - "RemoteUsername": "carpentries", - "RemoteRepo": "pegboard", - "RemoteRef": "main", - "RemoteSha": "ad2542f7f7b9c3f90cc871b355ff81ec14a09ca9", - "Requirements": [ - "R6", + "Title": "Explore and Manipulate Markdown Curricula from the Carpentries", + "Authors@R": "c( person(given = \"Robert\", family = \"Davey\", role = c(\"aut\", \"cre\"), email = \"robertdavey@carpentries.org\", comment = c(ORCID = \"0000-0002-5589-7754\")), person(given = \"Erin\", family = \"Becker\", role = c(\"aut\"), email = \"erinbecker@carpentries.org\", comment = c(ORCID = \"0000-0002-6832-0233\")), person(given = \"Zhian N.\", family = \"Kamvar\", role = c(\"aut\"), email = \"zkamvar@carpentries.org\", comment = c(ORCID = \"0000-0003-1458-7108\")), person(given = \"Toby\", family = \"Hodges\", role = c(\"ctb\"), email = \"tobyhodges@carpentries.org\"), person(given = \"Erin\", family = \"Becker\", role = c(\"ctb\"), email = \"ebecker@carpentries.org\"), person(given = \"Kelly\", family = \"Barnes\", role = c(\"ctb\"), email = \"kbarnes@carpentries.org\"), person())", + "Description": "The Carpentries () curricula is made of of lessons that are hosted as websites. Each lesson represents between a half day to two days of instruction and contains several episodes, which are written as 'kramdown'-flavored 'markdown' documents and converted to HTML using the 'Jekyll' static website generator. This package builds on top of the 'tinkr' package; reads in these markdown documents to 'XML' and stores them in R6 classes for convenient exploration and manipulation of sections within episodes.", + "License": "MIT + file LICENSE", + "URL": "https://carpentries.github.io/pegboard", + "BugReports": "https://github.com/carpentries/pegboard/issues", + "Imports": [ "commonmark", - "fs", + "fs (>= 1.5.0)", "glue", "purrr", - "tinkr", + "R6", + "tinkr (>= 0.2.0)", "xml2", "xslt", "yaml" ], - "Hash": "896ea59e2b5ee99645de126b99be5f6e" + "Suggests": [ + "cli (>= 0.3.4)", + "covr", + "crayon", + "dplyr", + "gert (>= 1.0.0)", + "here", + "knitr", + "magrittr", + "rlang", + "rmarkdown", + "testthat", + "withr" + ], + "VignetteBuilder": "knitr", + "Additional_repositories": "https://carpentries.r-universe.dev/", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "LazyData": "true", + "Roxygen": "list(markdown = TRUE)", + "RoxygenNote": "7.3.2", + "Author": "Robert Davey [aut, cre] (), Erin Becker [aut] (), Zhian N. Kamvar [aut] (), Toby Hodges [ctb], Erin Becker [ctb], Kelly Barnes [ctb]", + "Maintainer": "Robert Davey ", + "RemoteType": "github", + "RemoteUsername": "carpentries", + "RemoteRepo": "pegboard", + "RemoteRef": "main", + "RemoteSha": "bad0be19a12f0c6545801b276ddf26c945f8bfd1", + "RemoteHost": "api.github.com", + "Remotes": "ropensci/tinkr" }, "pillar": { "Package": "pillar", - "Version": "1.9.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "cli", - "fansi", + "Version": "1.10.1", + "Source": "Repository", + "Title": "Coloured Formatting for Columns", + "Authors@R": "c(person(given = \"Kirill\", family = \"M\\u00fcller\", role = c(\"aut\", \"cre\"), email = \"kirill@cynkra.com\", comment = c(ORCID = \"0000-0002-1416-3412\")), person(given = \"Hadley\", family = \"Wickham\", role = \"aut\"), person(given = \"RStudio\", role = \"cph\"))", + "Description": "Provides 'pillar' and 'colonnade' generics designed for formatting columns of data using the full range of colours provided by modern terminals.", + "License": "MIT + file LICENSE", + "URL": "https://pillar.r-lib.org/, https://github.com/r-lib/pillar", + "BugReports": "https://github.com/r-lib/pillar/issues", + "Imports": [ + "cli (>= 2.3.0)", "glue", "lifecycle", - "rlang", - "utf8", + "rlang (>= 1.0.2)", + "utf8 (>= 1.1.0)", "utils", - "vctrs" + "vctrs (>= 0.5.0)" + ], + "Suggests": [ + "bit64", + "DBI", + "debugme", + "DiagrammeR", + "dplyr", + "formattable", + "ggplot2", + "knitr", + "lubridate", + "nanotime", + "nycflights13", + "palmerpenguins", + "rmarkdown", + "scales", + "stringi", + "survival", + "testthat (>= 3.1.1)", + "tibble", + "units (>= 0.7.2)", + "vdiffr", + "withr" ], - "Hash": "15da5a8412f317beeee6175fbc76f4bb" + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2.9000", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "true", + "Config/testthat/start-first": "format_multi_fuzz, format_multi_fuzz_2, format_multi, ctl_colonnade, ctl_colonnade_1, ctl_colonnade_2", + "Config/autostyle/scope": "line_breaks", + "Config/autostyle/strict": "true", + "Config/gha/extra-packages": "DiagrammeR=?ignore-before-r=3.5.0", + "Config/Needs/website": "tidyverse/tidytemplate", + "NeedsCompilation": "no", + "Author": "Kirill Müller [aut, cre] (), Hadley Wickham [aut], RStudio [cph]", + "Maintainer": "Kirill Müller ", + "Repository": "CRAN" }, "pkgconfig": { "Package": "pkgconfig", "Version": "2.0.3", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Title": "Private Configuration for 'R' Packages", + "Author": "Gábor Csárdi", + "Maintainer": "Gábor Csárdi ", + "Description": "Set configuration options on a per-package basis. Options set by a given package only apply to that package, other packages are unaffected.", + "License": "MIT + file LICENSE", + "LazyData": "true", + "Imports": [ "utils" ], - "Hash": "01f28d4278f15c76cddbea05899c5d6f" + "Suggests": [ + "covr", + "testthat", + "disposables (>= 1.0.3)" + ], + "URL": "https://github.com/r-lib/pkgconfig#readme", + "BugReports": "https://github.com/r-lib/pkgconfig/issues", + "Encoding": "UTF-8", + "NeedsCompilation": "no", + "Repository": "RSPM" }, "pkgdown": { "Package": "pkgdown", "Version": "2.1.1", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "bslib", - "callr", - "cli", - "desc", + "Title": "Make Static HTML Documentation for a Package", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Jay\", \"Hesselberth\", role = \"aut\", comment = c(ORCID = \"0000-0002-6299-179X\")), person(\"Maëlle\", \"Salmon\", role = \"aut\", comment = c(ORCID = \"0000-0002-2815-0399\")), person(\"Olivier\", \"Roy\", role = \"aut\"), person(\"Salim\", \"Brüggemann\", role = \"aut\", comment = c(ORCID = \"0000-0002-5329-5987\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Generate an attractive and useful website from a source package. 'pkgdown' converts your documentation, vignettes, 'README', and more to 'HTML' making it easy to share information about your package online.", + "License": "MIT + file LICENSE", + "URL": "https://pkgdown.r-lib.org/, https://github.com/r-lib/pkgdown", + "BugReports": "https://github.com/r-lib/pkgdown/issues", + "Depends": [ + "R (>= 4.0.0)" + ], + "Imports": [ + "bslib (>= 0.5.1)", + "callr (>= 3.7.3)", + "cli (>= 3.6.1)", + "desc (>= 1.4.0)", "digest", - "downlit", + "downlit (>= 0.4.4)", "fontawesome", - "fs", - "httr2", + "fs (>= 1.4.0)", + "httr2 (>= 1.0.2)", "jsonlite", "openssl", - "purrr", + "purrr (>= 1.0.0)", "ragg", - "rlang", - "rmarkdown", + "rlang (>= 1.1.0)", + "rmarkdown (>= 2.27)", "tibble", "whisker", - "withr", - "xml2", + "withr (>= 2.4.3)", + "xml2 (>= 1.3.1)", "yaml" ], - "Hash": "df2912d5873422b55a13002510f02c9f" + "Suggests": [ + "covr", + "diffviewer", + "evaluate (>= 0.24.0)", + "gert", + "gt", + "htmltools", + "htmlwidgets", + "knitr", + "lifecycle", + "magick", + "methods", + "pkgload (>= 1.0.2)", + "quarto", + "rsconnect", + "rstudioapi", + "rticles", + "sass", + "testthat (>= 3.1.3)", + "tools" + ], + "VignetteBuilder": "knitr, quarto", + "Config/Needs/website": "usethis, servr", + "Config/potools/style": "explicit", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "true", + "Config/testthat/start-first": "build-article, build-quarto-article, build-reference", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "SystemRequirements": "pandoc", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut, cre] (), Jay Hesselberth [aut] (), Maëlle Salmon [aut] (), Olivier Roy [aut], Salim Brüggemann [aut] (), Posit Software, PBC [cph, fnd]", + "Maintainer": "Hadley Wickham ", + "Repository": "RSPM" }, "processx": { "Package": "processx", - "Version": "3.8.4", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Version": "3.8.5", + "Source": "Repository", + "Title": "Execute and Control System Processes", + "Authors@R": "c( person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\", \"cph\"), comment = c(ORCID = \"0000-0001-7098-9676\")), person(\"Winston\", \"Chang\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(\"Ascent Digital Services\", role = c(\"cph\", \"fnd\")) )", + "Description": "Tools to run system processes in the background. It can check if a background process is running; wait on a background process to finish; get the exit status of finished processes; kill background processes. It can read the standard output and error of the processes, using non-blocking connections. 'processx' can poll a process for standard output or error, with a timeout. It can also poll several processes at once.", + "License": "MIT + file LICENSE", + "URL": "https://processx.r-lib.org, https://github.com/r-lib/processx", + "BugReports": "https://github.com/r-lib/processx/issues", + "Depends": [ + "R (>= 3.4.0)" + ], + "Imports": [ + "ps (>= 1.2.0)", "R6", - "ps", "utils" ], - "Hash": "0c90a7d71988856bad2a2a45dd871bb9" + "Suggests": [ + "callr (>= 3.7.3)", + "cli (>= 3.3.0)", + "codetools", + "covr", + "curl", + "debugme", + "parallel", + "rlang (>= 1.0.2)", + "testthat (>= 3.0.0)", + "webfakes", + "withr" + ], + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.1.9000", + "NeedsCompilation": "yes", + "Author": "Gábor Csárdi [aut, cre, cph] (), Winston Chang [aut], Posit Software, PBC [cph, fnd], Ascent Digital Services [cph, fnd]", + "Maintainer": "Gábor Csárdi ", + "Repository": "CRAN" }, "promises": { "Package": "promises", - "Version": "1.3.0", + "Version": "1.3.2", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Type": "Package", + "Title": "Abstractions for Promise-Based Asynchronous Programming", + "Authors@R": "c( person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Provides fundamental abstractions for doing asynchronous programming in R using promises. Asynchronous programming is useful for allowing a single R process to orchestrate multiple tasks in the background while also attending to something else. Semantics are similar to 'JavaScript' promises, but with a syntax that is idiomatic R.", + "License": "MIT + file LICENSE", + "URL": "https://rstudio.github.io/promises/, https://github.com/rstudio/promises", + "BugReports": "https://github.com/rstudio/promises/issues", + "Imports": [ + "fastmap (>= 1.1.0)", + "later", + "magrittr (>= 1.5)", "R6", "Rcpp", - "fastmap", - "later", - "magrittr", "rlang", "stats" ], - "Hash": "434cd5388a3979e74be5c219bcd6e77d" + "Suggests": [ + "future (>= 1.21.0)", + "knitr", + "purrr", + "rmarkdown", + "spelling", + "testthat", + "vembedr" + ], + "LinkingTo": [ + "later", + "Rcpp" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "rsconnect", + "Encoding": "UTF-8", + "Language": "en-US", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "yes", + "Author": "Joe Cheng [aut, cre], Posit Software, PBC [cph, fnd]", + "Maintainer": "Joe Cheng ", + "Repository": "RSPM" }, "ps": { "Package": "ps", - "Version": "1.8.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Version": "1.8.1", + "Source": "Repository", + "Title": "List, Query, Manipulate System Processes", + "Authors@R": "c( person(\"Jay\", \"Loden\", role = \"aut\"), person(\"Dave\", \"Daeschler\", role = \"aut\"), person(\"Giampaolo\", \"Rodola'\", role = \"aut\"), person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "List, query and manipulate all system processes, on 'Windows', 'Linux' and 'macOS'.", + "License": "MIT + file LICENSE", + "URL": "https://github.com/r-lib/ps, https://ps.r-lib.org/", + "BugReports": "https://github.com/r-lib/ps/issues", + "Depends": [ + "R (>= 3.4)" + ], + "Imports": [ "utils" ], - "Hash": "4b9c8485b0c7eecdf0a9ba5132a45576" + "Suggests": [ + "callr", + "covr", + "curl", + "pillar", + "pingr", + "processx (>= 3.1.0)", + "R6", + "rlang", + "testthat (>= 3.0.0)", + "webfakes", + "withr" + ], + "Biarch": "true", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "yes", + "Author": "Jay Loden [aut], Dave Daeschler [aut], Giampaolo Rodola' [aut], Gábor Csárdi [aut, cre], Posit Software, PBC [cph, fnd]", + "Maintainer": "Gábor Csárdi ", + "Repository": "RSPM" }, "purrr": { "Package": "purrr", - "Version": "1.0.2", + "Version": "1.0.4", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cli", - "lifecycle", - "magrittr", - "rlang", - "vctrs" - ], - "Hash": "1cba04a4e9414bdefc9dcaa99649a8dc" + "Title": "Functional Programming Tools", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Lionel\", \"Henry\", , \"lionel@posit.co\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"), comment = c(ROR = \"03wc8by49\")) )", + "Description": "A complete and consistent functional programming toolkit for R.", + "License": "MIT + file LICENSE", + "URL": "https://purrr.tidyverse.org/, https://github.com/tidyverse/purrr", + "BugReports": "https://github.com/tidyverse/purrr/issues", + "Depends": [ + "R (>= 4.0)" + ], + "Imports": [ + "cli (>= 3.6.1)", + "lifecycle (>= 1.0.3)", + "magrittr (>= 1.5.0)", + "rlang (>= 1.1.1)", + "vctrs (>= 0.6.3)" + ], + "Suggests": [ + "covr", + "dplyr (>= 0.7.8)", + "httr", + "knitr", + "lubridate", + "rmarkdown", + "testthat (>= 3.0.0)", + "tibble", + "tidyselect" + ], + "LinkingTo": [ + "cli" + ], + "VignetteBuilder": "knitr", + "Biarch": "true", + "Config/build/compilation-database": "true", + "Config/Needs/website": "tidyverse/tidytemplate, tidyr", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "TRUE", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "yes", + "Author": "Hadley Wickham [aut, cre] (), Lionel Henry [aut], Posit Software, PBC [cph, fnd] (03wc8by49)", + "Maintainer": "Hadley Wickham ", + "Repository": "CRAN" }, "ragg": { "Package": "ragg", "Version": "1.3.3", "Source": "Repository", + "Type": "Package", + "Title": "Graphic Devices Based on AGG", + "Authors@R": "c( person(\"Thomas Lin\", \"Pedersen\", , \"thomas.pedersen@posit.co\", role = c(\"cre\", \"aut\"), comment = c(ORCID = \"0000-0002-5147-4711\")), person(\"Maxim\", \"Shemanarev\", role = c(\"aut\", \"cph\"), comment = \"Author of AGG\"), person(\"Tony\", \"Juricic\", , \"tonygeek@yahoo.com\", role = c(\"ctb\", \"cph\"), comment = \"Contributor to AGG\"), person(\"Milan\", \"Marusinec\", , \"milan@marusinec.sk\", role = c(\"ctb\", \"cph\"), comment = \"Contributor to AGG\"), person(\"Spencer\", \"Garrett\", role = \"ctb\", comment = \"Contributor to AGG\"), person(\"Posit, PBC\", role = c(\"cph\", \"fnd\")) )", + "Maintainer": "Thomas Lin Pedersen ", + "Description": "Anti-Grain Geometry (AGG) is a high-quality and high-performance 2D drawing library. The 'ragg' package provides a set of graphic devices based on AGG to use as alternative to the raster devices provided through the 'grDevices' package.", + "License": "MIT + file LICENSE", + "URL": "https://ragg.r-lib.org, https://github.com/r-lib/ragg", + "BugReports": "https://github.com/r-lib/ragg/issues", + "Imports": [ + "systemfonts (>= 1.0.3)", + "textshaping (>= 0.3.0)" + ], + "Suggests": [ + "covr", + "graphics", + "grid", + "testthat (>= 3.0.0)" + ], + "LinkingTo": [ + "systemfonts", + "textshaping" + ], + "Config/Needs/website": "ggplot2, devoid, magick, bench, tidyr, ggridges, hexbin, sessioninfo, pkgdown, tidyverse/tidytemplate", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.1", + "SystemRequirements": "freetype2, libpng, libtiff, libjpeg", + "Config/testthat/edition": "3", + "Roxygen": "list(markdown = TRUE)", + "Config/pak/sysreqs": "libfreetype6-dev libjpeg-dev libpng-dev libtiff-dev", "Repository": "https://carpentries.r-universe.dev", "RemoteUrl": "https://github.com/r-lib/ragg", "RemoteRef": "v1.3.3", "RemoteSha": "6f2279ae8cd0e0d7e9d0e1ede2b742666f9f1d49", - "Requirements": [ - "systemfonts", - "textshaping" - ], - "Hash": "0595fe5e47357111f29ad19101c7d271" + "NeedsCompilation": "yes", + "Author": "Thomas Lin Pedersen [cre, aut] (), Maxim Shemanarev [aut, cph] (Author of AGG), Tony Juricic [ctb, cph] (Contributor to AGG), Milan Marusinec [ctb, cph] (Contributor to AGG), Spencer Garrett [ctb] (Contributor to AGG), Posit, PBC [cph, fnd]" }, "rappdirs": { "Package": "rappdirs", "Version": "0.3.3", "Source": "Repository", - "Repository": "RSPM", - "Requirements": [ - "R" + "Type": "Package", + "Title": "Application Directories: Determine Where to Save Data, Caches, and Logs", + "Authors@R": "c(person(given = \"Hadley\", family = \"Wickham\", role = c(\"trl\", \"cre\", \"cph\"), email = \"hadley@rstudio.com\"), person(given = \"RStudio\", role = \"cph\"), person(given = \"Sridhar\", family = \"Ratnakumar\", role = \"aut\"), person(given = \"Trent\", family = \"Mick\", role = \"aut\"), person(given = \"ActiveState\", role = \"cph\", comment = \"R/appdir.r, R/cache.r, R/data.r, R/log.r translated from appdirs\"), person(given = \"Eddy\", family = \"Petrisor\", role = \"ctb\"), person(given = \"Trevor\", family = \"Davis\", role = c(\"trl\", \"aut\")), person(given = \"Gabor\", family = \"Csardi\", role = \"ctb\"), person(given = \"Gregory\", family = \"Jefferis\", role = \"ctb\"))", + "Description": "An easy way to determine which directories on the users computer you should use to save data, caches and logs. A port of Python's 'Appdirs' () to R.", + "License": "MIT + file LICENSE", + "URL": "https://rappdirs.r-lib.org, https://github.com/r-lib/rappdirs", + "BugReports": "https://github.com/r-lib/rappdirs/issues", + "Depends": [ + "R (>= 3.2)" + ], + "Suggests": [ + "roxygen2", + "testthat (>= 3.0.0)", + "covr", + "withr" ], - "Hash": "5e3c5dc0b071b21fa128676560dbe94d" + "Copyright": "Original python appdirs module copyright (c) 2010 ActiveState Software Inc. R port copyright Hadley Wickham, RStudio. See file LICENSE for details.", + "Encoding": "UTF-8", + "RoxygenNote": "7.1.1", + "Config/testthat/edition": "3", + "NeedsCompilation": "yes", + "Author": "Hadley Wickham [trl, cre, cph], RStudio [cph], Sridhar Ratnakumar [aut], Trent Mick [aut], ActiveState [cph] (R/appdir.r, R/cache.r, R/data.r, R/log.r translated from appdirs), Eddy Petrisor [ctb], Trevor Davis [trl, aut], Gabor Csardi [ctb], Gregory Jefferis [ctb]", + "Maintainer": "Hadley Wickham ", + "Repository": "RSPM" }, "renv": { "Package": "renv", - "Version": "1.0.11", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Version": "1.1.1", + "Source": "Repository", + "Type": "Package", + "Title": "Project Environments", + "Authors@R": "c( person(\"Kevin\", \"Ushey\", role = c(\"aut\", \"cre\"), email = \"kevin@rstudio.com\", comment = c(ORCID = \"0000-0003-2880-7407\")), person(\"Hadley\", \"Wickham\", role = c(\"aut\"), email = \"hadley@rstudio.com\", comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "A dependency management toolkit for R. Using 'renv', you can create and manage project-local R libraries, save the state of these libraries to a 'lockfile', and later restore your library as required. Together, these tools can help make your projects more isolated, portable, and reproducible.", + "License": "MIT + file LICENSE", + "URL": "https://rstudio.github.io/renv/, https://github.com/rstudio/renv", + "BugReports": "https://github.com/rstudio/renv/issues", + "Imports": [ "utils" ], - "Hash": "47623f66b4e80b3b0587bc5d7b309888" + "Suggests": [ + "BiocManager", + "cli", + "compiler", + "covr", + "cpp11", + "devtools", + "gitcreds", + "jsonlite", + "jsonvalidate", + "knitr", + "miniUI", + "modules", + "packrat", + "pak", + "R6", + "remotes", + "reticulate", + "rmarkdown", + "rstudioapi", + "shiny", + "testthat", + "uuid", + "waldo", + "yaml", + "webfakes" + ], + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "true", + "Config/testthat/start-first": "bioconductor,python,install,restore,snapshot,retrieve,remotes", + "NeedsCompilation": "no", + "Author": "Kevin Ushey [aut, cre] (), Hadley Wickham [aut] (), Posit Software, PBC [cph, fnd]", + "Maintainer": "Kevin Ushey ", + "Repository": "CRAN" }, "rlang": { "Package": "rlang", - "Version": "1.1.4", + "Version": "1.1.5", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Title": "Functions for Base Types and Core R and 'Tidyverse' Features", + "Description": "A toolbox for working with base types, core R features like the condition system, and core 'Tidyverse' features like tidy evaluation.", + "Authors@R": "c( person(\"Lionel\", \"Henry\", ,\"lionel@posit.co\", c(\"aut\", \"cre\")), person(\"Hadley\", \"Wickham\", ,\"hadley@posit.co\", \"aut\"), person(given = \"mikefc\", email = \"mikefc@coolbutuseless.com\", role = \"cph\", comment = \"Hash implementation based on Mike's xxhashlite\"), person(given = \"Yann\", family = \"Collet\", role = \"cph\", comment = \"Author of the embedded xxHash library\"), person(given = \"Posit, PBC\", role = c(\"cph\", \"fnd\")) )", + "License": "MIT + file LICENSE", + "ByteCompile": "true", + "Biarch": "true", + "Depends": [ + "R (>= 3.5.0)" + ], + "Imports": [ "utils" ], - "Hash": "3eec01f8b1dee337674b2e34ab1f9bc1" + "Suggests": [ + "cli (>= 3.1.0)", + "covr", + "crayon", + "fs", + "glue", + "knitr", + "magrittr", + "methods", + "pillar", + "rmarkdown", + "stats", + "testthat (>= 3.0.0)", + "tibble", + "usethis", + "vctrs (>= 0.2.3)", + "withr" + ], + "Enhances": [ + "winch" + ], + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "URL": "https://rlang.r-lib.org, https://github.com/r-lib/rlang", + "BugReports": "https://github.com/r-lib/rlang/issues", + "Config/testthat/edition": "3", + "Config/Needs/website": "dplyr, tidyverse/tidytemplate", + "NeedsCompilation": "yes", + "Author": "Lionel Henry [aut, cre], Hadley Wickham [aut], mikefc [cph] (Hash implementation based on Mike's xxhashlite), Yann Collet [cph] (Author of the embedded xxHash library), Posit, PBC [cph, fnd]", + "Maintainer": "Lionel Henry ", + "Repository": "CRAN" }, "rmarkdown": { "Package": "rmarkdown", - "Version": "2.28", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "bslib", - "evaluate", - "fontawesome", - "htmltools", + "Version": "2.29", + "Source": "Repository", + "Type": "Package", + "Title": "Dynamic Documents for R", + "Authors@R": "c( person(\"JJ\", \"Allaire\", , \"jj@posit.co\", role = \"aut\"), person(\"Yihui\", \"Xie\", , \"xie@yihui.name\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0003-0645-5666\")), person(\"Christophe\", \"Dervieux\", , \"cderv@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-4474-2498\")), person(\"Jonathan\", \"McPherson\", , \"jonathan@posit.co\", role = \"aut\"), person(\"Javier\", \"Luraschi\", role = \"aut\"), person(\"Kevin\", \"Ushey\", , \"kevin@posit.co\", role = \"aut\"), person(\"Aron\", \"Atkins\", , \"aron@posit.co\", role = \"aut\"), person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\"), person(\"Joe\", \"Cheng\", , \"joe@posit.co\", role = \"aut\"), person(\"Winston\", \"Chang\", , \"winston@posit.co\", role = \"aut\"), person(\"Richard\", \"Iannone\", , \"rich@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-3925-190X\")), person(\"Andrew\", \"Dunning\", role = \"ctb\", comment = c(ORCID = \"0000-0003-0464-5036\")), person(\"Atsushi\", \"Yasumoto\", role = c(\"ctb\", \"cph\"), comment = c(ORCID = \"0000-0002-8335-495X\", cph = \"Number sections Lua filter\")), person(\"Barret\", \"Schloerke\", role = \"ctb\"), person(\"Carson\", \"Sievert\", role = \"ctb\", comment = c(ORCID = \"0000-0002-4958-2844\")), person(\"Devon\", \"Ryan\", , \"dpryan79@gmail.com\", role = \"ctb\", comment = c(ORCID = \"0000-0002-8549-0971\")), person(\"Frederik\", \"Aust\", , \"frederik.aust@uni-koeln.de\", role = \"ctb\", comment = c(ORCID = \"0000-0003-4900-788X\")), person(\"Jeff\", \"Allen\", , \"jeff@posit.co\", role = \"ctb\"), person(\"JooYoung\", \"Seo\", role = \"ctb\", comment = c(ORCID = \"0000-0002-4064-6012\")), person(\"Malcolm\", \"Barrett\", role = \"ctb\"), person(\"Rob\", \"Hyndman\", , \"Rob.Hyndman@monash.edu\", role = \"ctb\"), person(\"Romain\", \"Lesur\", role = \"ctb\"), person(\"Roy\", \"Storey\", role = \"ctb\"), person(\"Ruben\", \"Arslan\", , \"ruben.arslan@uni-goettingen.de\", role = \"ctb\"), person(\"Sergio\", \"Oller\", role = \"ctb\"), person(given = \"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(, \"jQuery UI contributors\", role = c(\"ctb\", \"cph\"), comment = \"jQuery UI library; authors listed in inst/rmd/h/jqueryui/AUTHORS.txt\"), person(\"Mark\", \"Otto\", role = \"ctb\", comment = \"Bootstrap library\"), person(\"Jacob\", \"Thornton\", role = \"ctb\", comment = \"Bootstrap library\"), person(, \"Bootstrap contributors\", role = \"ctb\", comment = \"Bootstrap library\"), person(, \"Twitter, Inc\", role = \"cph\", comment = \"Bootstrap library\"), person(\"Alexander\", \"Farkas\", role = c(\"ctb\", \"cph\"), comment = \"html5shiv library\"), person(\"Scott\", \"Jehl\", role = c(\"ctb\", \"cph\"), comment = \"Respond.js library\"), person(\"Ivan\", \"Sagalaev\", role = c(\"ctb\", \"cph\"), comment = \"highlight.js library\"), person(\"Greg\", \"Franko\", role = c(\"ctb\", \"cph\"), comment = \"tocify library\"), person(\"John\", \"MacFarlane\", role = c(\"ctb\", \"cph\"), comment = \"Pandoc templates\"), person(, \"Google, Inc.\", role = c(\"ctb\", \"cph\"), comment = \"ioslides library\"), person(\"Dave\", \"Raggett\", role = \"ctb\", comment = \"slidy library\"), person(, \"W3C\", role = \"cph\", comment = \"slidy library\"), person(\"Dave\", \"Gandy\", role = c(\"ctb\", \"cph\"), comment = \"Font-Awesome\"), person(\"Ben\", \"Sperry\", role = \"ctb\", comment = \"Ionicons\"), person(, \"Drifty\", role = \"cph\", comment = \"Ionicons\"), person(\"Aidan\", \"Lister\", role = c(\"ctb\", \"cph\"), comment = \"jQuery StickyTabs\"), person(\"Benct Philip\", \"Jonsson\", role = c(\"ctb\", \"cph\"), comment = \"pagebreak Lua filter\"), person(\"Albert\", \"Krewinkel\", role = c(\"ctb\", \"cph\"), comment = \"pagebreak Lua filter\") )", + "Description": "Convert R Markdown documents into a variety of formats.", + "License": "GPL-3", + "URL": "https://github.com/rstudio/rmarkdown, https://pkgs.rstudio.com/rmarkdown/", + "BugReports": "https://github.com/rstudio/rmarkdown/issues", + "Depends": [ + "R (>= 3.0)" + ], + "Imports": [ + "bslib (>= 0.2.5.1)", + "evaluate (>= 0.13)", + "fontawesome (>= 0.5.0)", + "htmltools (>= 0.5.1)", "jquerylib", "jsonlite", - "knitr", + "knitr (>= 1.43)", "methods", - "tinytex", + "tinytex (>= 0.31)", "tools", "utils", - "xfun", - "yaml" + "xfun (>= 0.36)", + "yaml (>= 2.1.19)" + ], + "Suggests": [ + "digest", + "dygraphs", + "fs", + "rsconnect", + "downlit (>= 0.4.0)", + "katex (>= 1.4.0)", + "sass (>= 0.4.0)", + "shiny (>= 1.6.0)", + "testthat (>= 3.0.3)", + "tibble", + "vctrs", + "cleanrmd", + "withr (>= 2.4.2)", + "xml2" ], - "Hash": "062470668513dcda416927085ee9bdc7" + "VignetteBuilder": "knitr", + "Config/Needs/website": "rstudio/quillt, pkgdown", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "SystemRequirements": "pandoc (>= 1.14) - http://pandoc.org", + "NeedsCompilation": "no", + "Author": "JJ Allaire [aut], Yihui Xie [aut, cre] (), Christophe Dervieux [aut] (), Jonathan McPherson [aut], Javier Luraschi [aut], Kevin Ushey [aut], Aron Atkins [aut], Hadley Wickham [aut], Joe Cheng [aut], Winston Chang [aut], Richard Iannone [aut] (), Andrew Dunning [ctb] (), Atsushi Yasumoto [ctb, cph] (, Number sections Lua filter), Barret Schloerke [ctb], Carson Sievert [ctb] (), Devon Ryan [ctb] (), Frederik Aust [ctb] (), Jeff Allen [ctb], JooYoung Seo [ctb] (), Malcolm Barrett [ctb], Rob Hyndman [ctb], Romain Lesur [ctb], Roy Storey [ctb], Ruben Arslan [ctb], Sergio Oller [ctb], Posit Software, PBC [cph, fnd], jQuery UI contributors [ctb, cph] (jQuery UI library; authors listed in inst/rmd/h/jqueryui/AUTHORS.txt), Mark Otto [ctb] (Bootstrap library), Jacob Thornton [ctb] (Bootstrap library), Bootstrap contributors [ctb] (Bootstrap library), Twitter, Inc [cph] (Bootstrap library), Alexander Farkas [ctb, cph] (html5shiv library), Scott Jehl [ctb, cph] (Respond.js library), Ivan Sagalaev [ctb, cph] (highlight.js library), Greg Franko [ctb, cph] (tocify library), John MacFarlane [ctb, cph] (Pandoc templates), Google, Inc. [ctb, cph] (ioslides library), Dave Raggett [ctb] (slidy library), W3C [cph] (slidy library), Dave Gandy [ctb, cph] (Font-Awesome), Ben Sperry [ctb] (Ionicons), Drifty [cph] (Ionicons), Aidan Lister [ctb, cph] (jQuery StickyTabs), Benct Philip Jonsson [ctb, cph] (pagebreak Lua filter), Albert Krewinkel [ctb, cph] (pagebreak Lua filter)", + "Maintainer": "Yihui Xie ", + "Repository": "RSPM" }, "rprojroot": { "Package": "rprojroot", "Version": "2.0.4", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" + "Title": "Finding Files in Project Subdirectories", + "Authors@R": "person(given = \"Kirill\", family = \"M\\u00fcller\", role = c(\"aut\", \"cre\"), email = \"kirill@cynkra.com\", comment = c(ORCID = \"0000-0002-1416-3412\"))", + "Description": "Robust, reliable and flexible paths to files below a project root. The 'root' of a project is defined as a directory that matches a certain criterion, e.g., it contains a certain regular file.", + "License": "MIT + file LICENSE", + "URL": "https://rprojroot.r-lib.org/, https://github.com/r-lib/rprojroot", + "BugReports": "https://github.com/r-lib/rprojroot/issues", + "Depends": [ + "R (>= 3.0.0)" + ], + "Suggests": [ + "covr", + "knitr", + "lifecycle", + "mockr", + "rlang", + "rmarkdown", + "testthat (>= 3.0.0)", + "withr" ], - "Hash": "4c8415e0ec1e29f3f4f6fc108bef0144" + "VignetteBuilder": "knitr", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.2.3", + "NeedsCompilation": "no", + "Author": "Kirill Müller [aut, cre] ()", + "Maintainer": "Kirill Müller ", + "Repository": "RSPM" }, "rstudioapi": { "Package": "rstudioapi", - "Version": "0.17.0", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "fb9f5fce8f609e9b66f0bea5c783f88a" - }, - "sandpaper": { - "Package": "sandpaper", - "Version": "0.16.9.9000", - "Source": "Repository", - "Repository": "carpentries_archive", - "Requirements": [ - "assertthat", - "callr", - "cli", - "commonmark", - "desc", - "fs", - "gert", - "gh", - "glue", + "Version": "0.17.1", + "Source": "Repository", + "Title": "Safely Access the RStudio API", + "Description": "Access the RStudio API (if available) and provide informative error messages when it's not.", + "Authors@R": "c( person(\"Kevin\", \"Ushey\", role = c(\"aut\", \"cre\"), email = \"kevin@rstudio.com\"), person(\"JJ\", \"Allaire\", role = c(\"aut\"), email = \"jj@posit.co\"), person(\"Hadley\", \"Wickham\", role = c(\"aut\"), email = \"hadley@posit.co\"), person(\"Gary\", \"Ritchie\", role = c(\"aut\"), email = \"gary@posit.co\"), person(family = \"RStudio\", role = \"cph\") )", + "Maintainer": "Kevin Ushey ", + "License": "MIT + file LICENSE", + "URL": "https://rstudio.github.io/rstudioapi/, https://github.com/rstudio/rstudioapi", + "BugReports": "https://github.com/rstudio/rstudioapi/issues", + "RoxygenNote": "7.3.2", + "Suggests": [ + "testthat", "knitr", - "pegboard", - "pkgdown", - "renv", - "rlang", "rmarkdown", - "rprojroot", - "rstudioapi", - "servr", - "tools", - "usethis", - "utils", - "whisker", - "withr", - "yaml" + "clipr", + "covr" ], - "Hash": "fc1d0ff84302e167f3d9f52d817ae6a2" + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "NeedsCompilation": "no", + "Author": "Kevin Ushey [aut, cre], JJ Allaire [aut], Hadley Wickham [aut], Gary Ritchie [aut], RStudio [cph]", + "Repository": "RSPM" }, "sass": { "Package": "sass", "Version": "0.4.9", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Type": "Package", + "Title": "Syntactically Awesome Style Sheets ('Sass')", + "Description": "An 'SCSS' compiler, powered by the 'LibSass' library. With this, R developers can use variables, inheritance, and functions to generate dynamic style sheets. The package uses the 'Sass CSS' extension language, which is stable, powerful, and CSS compatible.", + "Authors@R": "c( person(\"Joe\", \"Cheng\", , \"joe@rstudio.com\", \"aut\"), person(\"Timothy\", \"Mastny\", , \"tim.mastny@gmail.com\", \"aut\"), person(\"Richard\", \"Iannone\", , \"rich@rstudio.com\", \"aut\", comment = c(ORCID = \"0000-0003-3925-190X\")), person(\"Barret\", \"Schloerke\", , \"barret@rstudio.com\", \"aut\", comment = c(ORCID = \"0000-0001-9986-114X\")), person(\"Carson\", \"Sievert\", , \"carson@rstudio.com\", c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-4958-2844\")), person(\"Christophe\", \"Dervieux\", , \"cderv@rstudio.com\", c(\"ctb\"), comment = c(ORCID = \"0000-0003-4474-2498\")), person(family = \"RStudio\", role = c(\"cph\", \"fnd\")), person(family = \"Sass Open Source Foundation\", role = c(\"ctb\", \"cph\"), comment = \"LibSass library\"), person(\"Greter\", \"Marcel\", role = c(\"ctb\", \"cph\"), comment = \"LibSass library\"), person(\"Mifsud\", \"Michael\", role = c(\"ctb\", \"cph\"), comment = \"LibSass library\"), person(\"Hampton\", \"Catlin\", role = c(\"ctb\", \"cph\"), comment = \"LibSass library\"), person(\"Natalie\", \"Weizenbaum\", role = c(\"ctb\", \"cph\"), comment = \"LibSass library\"), person(\"Chris\", \"Eppstein\", role = c(\"ctb\", \"cph\"), comment = \"LibSass library\"), person(\"Adams\", \"Joseph\", role = c(\"ctb\", \"cph\"), comment = \"json.cpp\"), person(\"Trifunovic\", \"Nemanja\", role = c(\"ctb\", \"cph\"), comment = \"utf8.h\") )", + "License": "MIT + file LICENSE", + "URL": "https://rstudio.github.io/sass/, https://github.com/rstudio/sass", + "BugReports": "https://github.com/rstudio/sass/issues", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.1", + "SystemRequirements": "GNU make", + "Imports": [ + "fs (>= 1.2.4)", + "rlang (>= 0.4.10)", + "htmltools (>= 0.5.1)", "R6", - "fs", - "htmltools", - "rappdirs", - "rlang" + "rappdirs" + ], + "Suggests": [ + "testthat", + "knitr", + "rmarkdown", + "withr", + "shiny", + "curl" ], - "Hash": "d53dbfddf695303ea4ad66f86e99b95d" + "VignetteBuilder": "knitr", + "Config/testthat/edition": "3", + "NeedsCompilation": "yes", + "Author": "Joe Cheng [aut], Timothy Mastny [aut], Richard Iannone [aut] (), Barret Schloerke [aut] (), Carson Sievert [aut, cre] (), Christophe Dervieux [ctb] (), RStudio [cph, fnd], Sass Open Source Foundation [ctb, cph] (LibSass library), Greter Marcel [ctb, cph] (LibSass library), Mifsud Michael [ctb, cph] (LibSass library), Hampton Catlin [ctb, cph] (LibSass library), Natalie Weizenbaum [ctb, cph] (LibSass library), Chris Eppstein [ctb, cph] (LibSass library), Adams Joseph [ctb, cph] (json.cpp), Trifunovic Nemanja [ctb, cph] (utf8.h)", + "Maintainer": "Carson Sievert ", + "Repository": "RSPM" }, "servr": { "Package": "servr", "Version": "0.32", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "httpuv", - "jsonlite", - "mime", - "xfun" + "Type": "Package", + "Title": "A Simple HTTP Server to Serve Static Files or Dynamic Documents", + "Authors@R": "c( person(\"Yihui\", \"Xie\", role = c(\"aut\", \"cre\"), email = \"xie@yihui.name\", comment = c(ORCID = \"0000-0003-0645-5666\")), person(\"Carson\", \"Sievert\", role = \"ctb\"), person(\"Jesse\", \"Anderson\", role = \"ctb\"), person(\"Ramnath\", \"Vaidyanathan\", role = \"ctb\"), person(\"Romain\", \"Lesur\", role = \"ctb\"), person(given = \"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person() )", + "Description": "Start an HTTP server in R to serve static files, or dynamic documents that can be converted to HTML files (e.g., R Markdown) under a given directory.", + "Depends": [ + "R (>= 3.0.0)" + ], + "Imports": [ + "mime (>= 0.2)", + "httpuv (>= 1.5.2)", + "xfun (>= 0.48)", + "jsonlite" ], - "Hash": "63e4ea2379e79cf18813dd0d8146d27c" + "Suggests": [ + "tools", + "later", + "rstudioapi", + "knitr (>= 1.9)", + "rmarkdown" + ], + "License": "GPL", + "URL": "https://github.com/yihui/servr", + "BugReports": "https://github.com/yihui/servr/issues", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "no", + "Author": "Yihui Xie [aut, cre] (), Carson Sievert [ctb], Jesse Anderson [ctb], Ramnath Vaidyanathan [ctb], Romain Lesur [ctb], Posit Software, PBC [cph, fnd]", + "Maintainer": "Yihui Xie ", + "Repository": "RSPM" + }, + "stringi": { + "Package": "stringi", + "Version": "1.8.4", + "Source": "Repository", + "Date": "2024-05-06", + "Title": "Fast and Portable Character String Processing Facilities", + "Description": "A collection of character string/text/natural language processing tools for pattern searching (e.g., with 'Java'-like regular expressions or the 'Unicode' collation algorithm), random string generation, case mapping, string transliteration, concatenation, sorting, padding, wrapping, Unicode normalisation, date-time formatting and parsing, and many more. They are fast, consistent, convenient, and - thanks to 'ICU' (International Components for Unicode) - portable across all locales and platforms. Documentation about 'stringi' is provided via its website at and the paper by Gagolewski (2022, ).", + "URL": "https://stringi.gagolewski.com/, https://github.com/gagolews/stringi, https://icu.unicode.org/", + "BugReports": "https://github.com/gagolews/stringi/issues", + "SystemRequirements": "ICU4C (>= 61, optional)", + "Type": "Package", + "Depends": [ + "R (>= 3.4)" + ], + "Imports": [ + "tools", + "utils", + "stats" + ], + "Biarch": "TRUE", + "License": "file LICENSE", + "Author": "Marek Gagolewski [aut, cre, cph] (), Bartek Tartanus [ctb], and others (stringi source code); Unicode, Inc. and others (ICU4C source code, Unicode Character Database)", + "Maintainer": "Marek Gagolewski ", + "RoxygenNote": "7.2.3", + "Encoding": "UTF-8", + "NeedsCompilation": "yes", + "License_is_FOSS": "yes", + "Repository": "CRAN" }, "sys": { "Package": "sys", "Version": "3.4.3", "Source": "Repository", - "Repository": "CRAN", - "Hash": "de342ebfebdbf40477d0758d05426646" + "Type": "Package", + "Title": "Powerful and Reliable Tools for Running System Commands in R", + "Authors@R": "c(person(\"Jeroen\", \"Ooms\", role = c(\"aut\", \"cre\"), email = \"jeroenooms@gmail.com\", comment = c(ORCID = \"0000-0002-4035-0289\")), person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = \"ctb\"))", + "Description": "Drop-in replacements for the base system2() function with fine control and consistent behavior across platforms. Supports clean interruption, timeout, background tasks, and streaming STDIN / STDOUT / STDERR over binary or text connections. Arguments on Windows automatically get encoded and quoted to work on different locales.", + "License": "MIT + file LICENSE", + "URL": "https://jeroen.r-universe.dev/sys", + "BugReports": "https://github.com/jeroen/sys/issues", + "Encoding": "UTF-8", + "RoxygenNote": "7.1.1", + "Suggests": [ + "unix (>= 1.4)", + "spelling", + "testthat" + ], + "Language": "en-US", + "NeedsCompilation": "yes", + "Author": "Jeroen Ooms [aut, cre] (), Gábor Csárdi [ctb]", + "Maintainer": "Jeroen Ooms ", + "Repository": "RSPM" }, "systemfonts": { "Package": "systemfonts", - "Version": "1.1.0", + "Version": "1.2.1", "Source": "Repository", + "Type": "Package", + "Title": "System Native Font Finding", + "Authors@R": "c( person(\"Thomas Lin\", \"Pedersen\", , \"thomas.pedersen@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-5147-4711\")), person(\"Jeroen\", \"Ooms\", , \"jeroen@berkeley.edu\", role = \"aut\", comment = c(ORCID = \"0000-0002-4035-0289\")), person(\"Devon\", \"Govett\", role = \"aut\", comment = \"Author of font-manager\"), person(\"Posit, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Provides system native access to the font catalogue. As font handling varies between systems it is difficult to correctly locate installed fonts across different operating systems. The 'systemfonts' package provides bindings to the native libraries on Windows, macOS and Linux for finding font files that can then be used further by e.g. graphic devices. The main use is intended to be from compiled code but 'systemfonts' also provides access from R.", + "License": "MIT + file LICENSE", + "URL": "https://github.com/r-lib/systemfonts, https://systemfonts.r-lib.org", + "BugReports": "https://github.com/r-lib/systemfonts/issues", + "Depends": [ + "R (>= 3.2.0)" + ], + "Suggests": [ + "covr", + "farver", + "graphics", + "knitr", + "rmarkdown", + "testthat (>= 2.1.0)" + ], + "LinkingTo": [ + "cpp11 (>= 0.2.1)" + ], + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "Roxygen": "list(markdown = TRUE)", + "RoxygenNote": "7.3.2", + "SystemRequirements": "fontconfig, freetype2", + "Config/Needs/website": "tidyverse/tidytemplate", + "Imports": [ + "grid", + "jsonlite", + "lifecycle", + "tools", + "utils" + ], + "Config/build/compilation-database": "true", + "Config/pak/sysreqs": "libfontconfig1-dev libfreetype6-dev", "Repository": "https://carpentries.r-universe.dev", "RemoteUrl": "https://github.com/r-lib/systemfonts", - "RemoteRef": "v1.1.0", - "RemoteSha": "78df90ca6d869feeb6a40c88f72269093505aa22", - "Requirements": [ - "R", - "cpp11", - "lifecycle" - ], - "Hash": "213b6b8ed5afbf934843e6c3b090d418" + "RemoteRef": "v1.2.1", + "RemoteSha": "e18b87ce43568e5db727c514e7281df96a06c1aa", + "NeedsCompilation": "yes", + "Author": "Thomas Lin Pedersen [aut, cre] (), Jeroen Ooms [aut] (), Devon Govett [aut] (Author of font-manager), Posit, PBC [cph, fnd]", + "Maintainer": "Thomas Lin Pedersen " }, "textshaping": { "Package": "textshaping", - "Version": "0.4.0", - "Source": "Repository", - "Repository": "https://carpentries.r-universe.dev", - "RemoteUrl": "https://github.com/r-lib/textshaping", - "RemoteRef": "v0.4.0", - "RemoteSha": "76682df21dce8ef29e905a90dd05732a58b1249f", - "Requirements": [ - "R", - "cpp11", + "Version": "1.0.0", + "Source": "Repository", + "Title": "Bindings to the 'HarfBuzz' and 'Fribidi' Libraries for Text Shaping", + "Authors@R": "c( person(\"Thomas Lin\", \"Pedersen\", , \"thomas.pedersen@posit.co\", role = c(\"cre\", \"aut\"), comment = c(ORCID = \"0000-0002-5147-4711\")), person(\"Posit, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Provides access to the text shaping functionality in the 'HarfBuzz' library and the bidirectional algorithm in the 'Fribidi' library. 'textshaping' is a low-level utility package mainly for graphic devices that expands upon the font tool-set provided by the 'systemfonts' package.", + "License": "MIT + file LICENSE", + "URL": "https://github.com/r-lib/textshaping", + "BugReports": "https://github.com/r-lib/textshaping/issues", + "Depends": [ + "R (>= 3.2.0)" + ], + "Imports": [ "lifecycle", - "systemfonts" + "stats", + "stringi", + "systemfonts (>= 1.1.0)", + "utils" ], - "Hash": "5142f8bc78ed3d819d26461b641627ce" + "Suggests": [ + "covr", + "grDevices", + "grid", + "knitr", + "rmarkdown", + "testthat (>= 3.0.0)" + ], + "LinkingTo": [ + "cpp11 (>= 0.2.1)", + "systemfonts (>= 1.0.0)" + ], + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "Roxygen": "list(markdown = TRUE)", + "RoxygenNote": "7.3.2", + "SystemRequirements": "freetype2, harfbuzz, fribidi", + "Config/build/compilation-database": "true", + "Config/testthat/edition": "3", + "Config/pak/sysreqs": "libfreetype6-dev libfribidi-dev libharfbuzz-dev", + "Repository": "https://carpentries.r-universe.dev", + "RemoteUrl": "https://github.com/r-lib/textshaping", + "RemoteRef": "v1.0.0", + "RemoteSha": "81c126511eeaee26cea65d2654486ec56a1c879e", + "NeedsCompilation": "yes", + "Author": "Thomas Lin Pedersen [cre, aut] (), Posit, PBC [cph, fnd]", + "Maintainer": "Thomas Lin Pedersen " }, "tibble": { "Package": "tibble", "Version": "3.2.1", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "fansi", - "lifecycle", + "Title": "Simple Data Frames", + "Authors@R": "c(person(given = \"Kirill\", family = \"M\\u00fcller\", role = c(\"aut\", \"cre\"), email = \"kirill@cynkra.com\", comment = c(ORCID = \"0000-0002-1416-3412\")), person(given = \"Hadley\", family = \"Wickham\", role = \"aut\", email = \"hadley@rstudio.com\"), person(given = \"Romain\", family = \"Francois\", role = \"ctb\", email = \"romain@r-enthusiasts.com\"), person(given = \"Jennifer\", family = \"Bryan\", role = \"ctb\", email = \"jenny@rstudio.com\"), person(given = \"RStudio\", role = c(\"cph\", \"fnd\")))", + "Description": "Provides a 'tbl_df' class (the 'tibble') with stricter checking and better formatting than the traditional data frame.", + "License": "MIT + file LICENSE", + "URL": "https://tibble.tidyverse.org/, https://github.com/tidyverse/tibble", + "BugReports": "https://github.com/tidyverse/tibble/issues", + "Depends": [ + "R (>= 3.4.0)" + ], + "Imports": [ + "fansi (>= 0.4.0)", + "lifecycle (>= 1.0.0)", "magrittr", "methods", - "pillar", + "pillar (>= 1.8.1)", "pkgconfig", - "rlang", + "rlang (>= 1.0.2)", "utils", - "vctrs" + "vctrs (>= 0.4.2)" + ], + "Suggests": [ + "bench", + "bit64", + "blob", + "brio", + "callr", + "cli", + "covr", + "crayon (>= 1.3.4)", + "DiagrammeR", + "dplyr", + "evaluate", + "formattable", + "ggplot2", + "here", + "hms", + "htmltools", + "knitr", + "lubridate", + "mockr", + "nycflights13", + "pkgbuild", + "pkgload", + "purrr", + "rmarkdown", + "stringi", + "testthat (>= 3.0.2)", + "tidyr", + "withr" ], - "Hash": "a84e2cc86d07289b3b6f5069df7a004c" + "VignetteBuilder": "knitr", + "Encoding": "UTF-8", + "RoxygenNote": "7.2.3", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "true", + "Config/testthat/start-first": "vignette-formats, as_tibble, add, invariants", + "Config/autostyle/scope": "line_breaks", + "Config/autostyle/strict": "true", + "Config/autostyle/rmd": "false", + "Config/Needs/website": "tidyverse/tidytemplate", + "NeedsCompilation": "yes", + "Author": "Kirill Müller [aut, cre] (), Hadley Wickham [aut], Romain Francois [ctb], Jennifer Bryan [ctb], RStudio [cph, fnd]", + "Maintainer": "Kirill Müller ", + "Repository": "RSPM" }, "tinkr": { "Package": "tinkr", "Version": "0.2.0.9001", "Source": "GitHub", - "RemoteType": "github", - "RemoteHost": "api.github.com", - "RemoteUsername": "ropensci", - "RemoteRepo": "tinkr", - "RemoteRef": "main", - "RemoteSha": "2798e8676234851283af01c9029a46e7b9432176", - "Requirements": [ - "R6", - "commonmark", + "Title": "Cast '(R)Markdown' Files to 'XML' and Back Again", + "Authors@R": "c(person(given = \"Maëlle\", family = \"Salmon\", role = c(\"aut\"), email = \"msmaellesalmon@gmail.com\", comment = c(ORCID = \"0000-0002-2815-0399\")), person(given = \"Zhian N.\", family = \"Kamvar\", role = c(\"aut\", \"cre\"), email = \"zkamvar@gmail.com\", comment = c(ORCID = \"0000-0003-1458-7108\")), person(given = \"Jeroen\", family = \"Ooms\", role = \"aut\"), person(given = \"Nick\", family = \"Wellnhofer\", role = \"cph\", comment = \"Nick Wellnhofer wrote the XSLT stylesheet.\"), person(given = \"rOpenSci\", role = \"fnd\", comment = c(ROR = \"019jywm96\")), person(given = \"Peter\", family = \"Daengeli\", role = \"ctb\"))", + "Description": "Parsing '(R)Markdown' files with numerous regular expressions can be fraught with peril, but it does not have to be this way. Converting '(R)Markdown' files to 'XML' using the 'commonmark' package allows in-memory editing via of 'markdown' elements via 'XPath' through the extensible 'R6' class called 'yarn'. These modified 'XML' representations can be written to '(R)Markdown' documents via an 'xslt' stylesheet which implements an extended version of 'GitHub'-flavoured 'markdown' so that you can tinker to your hearts content.", + "License": "GPL-3", + "URL": "https://docs.ropensci.org/tinkr/, https://github.com/ropensci/tinkr", + "BugReports": "https://github.com/ropensci/tinkr/issues", + "Imports": [ + "commonmark (>= 1.6)", "glue", "magrittr", "purrr", - "rlang", + "R6", + "rlang (>= 0.4.5)", "xml2", "xslt", "yaml" ], - "Hash": "0da84cf8fbab875ac4363f5b355babe3" + "Suggests": [ + "knitr", + "rmarkdown", + "covr", + "testthat (>= 3.0.0)", + "withr" + ], + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "LazyData": "true", + "Roxygen": "list(markdown = TRUE)", + "RoxygenNote": "7.3.2.9000", + "VignetteBuilder": "knitr", + "Author": "Maëlle Salmon [aut] (), Zhian N. Kamvar [aut, cre] (), Jeroen Ooms [aut], Nick Wellnhofer [cph] (Nick Wellnhofer wrote the XSLT stylesheet.), rOpenSci [fnd] (019jywm96), Peter Daengeli [ctb]", + "Maintainer": "Zhian N. Kamvar ", + "RemoteType": "github", + "RemoteHost": "api.github.com", + "RemoteUsername": "ropensci", + "RemoteRepo": "tinkr", + "RemoteRef": "main", + "RemoteSha": "f8692052915ee5fd0e485c13c646f9ad43cae85e" }, "tinytex": { "Package": "tinytex", - "Version": "0.53", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "xfun" - ], - "Hash": "9db859e8aabbb474293dde3097839420" + "Version": "0.54", + "Source": "Repository", + "Type": "Package", + "Title": "Helper Functions to Install and Maintain TeX Live, and Compile LaTeX Documents", + "Authors@R": "c( person(\"Yihui\", \"Xie\", role = c(\"aut\", \"cre\", \"cph\"), email = \"xie@yihui.name\", comment = c(ORCID = \"0000-0003-0645-5666\")), person(given = \"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(\"Christophe\", \"Dervieux\", role = \"ctb\", comment = c(ORCID = \"0000-0003-4474-2498\")), person(\"Devon\", \"Ryan\", role = \"ctb\", email = \"dpryan79@gmail.com\", comment = c(ORCID = \"0000-0002-8549-0971\")), person(\"Ethan\", \"Heinzen\", role = \"ctb\"), person(\"Fernando\", \"Cagua\", role = \"ctb\"), person() )", + "Description": "Helper functions to install and maintain the 'LaTeX' distribution named 'TinyTeX' (), a lightweight, cross-platform, portable, and easy-to-maintain version of 'TeX Live'. This package also contains helper functions to compile 'LaTeX' documents, and install missing 'LaTeX' packages automatically.", + "Imports": [ + "xfun (>= 0.48)" + ], + "Suggests": [ + "testit", + "rstudioapi" + ], + "License": "MIT + file LICENSE", + "URL": "https://github.com/rstudio/tinytex", + "BugReports": "https://github.com/rstudio/tinytex/issues", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "no", + "Author": "Yihui Xie [aut, cre, cph] (), Posit Software, PBC [cph, fnd], Christophe Dervieux [ctb] (), Devon Ryan [ctb] (), Ethan Heinzen [ctb], Fernando Cagua [ctb]", + "Maintainer": "Yihui Xie ", + "Repository": "RSPM" }, "usethis": { "Package": "usethis", - "Version": "3.0.0", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cli", - "clipr", + "Version": "3.1.0", + "Source": "Repository", + "Title": "Automate Package and Project Setup", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0003-4757-117X\")), person(\"Jennifer\", \"Bryan\", , \"jenny@posit.co\", role = c(\"aut\", \"cre\"), comment = c(ORCID = \"0000-0002-6983-2759\")), person(\"Malcolm\", \"Barrett\", , \"malcolmbarrett@gmail.com\", role = \"aut\", comment = c(ORCID = \"0000-0003-0299-5825\")), person(\"Andy\", \"Teucher\", , \"andy.teucher@posit.co\", role = \"aut\", comment = c(ORCID = \"0000-0002-7840-692X\")), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Automate package and project setup tasks that are otherwise performed manually. This includes setting up unit testing, test coverage, continuous integration, Git, 'GitHub', licenses, 'Rcpp', 'RStudio' projects, and more.", + "License": "MIT + file LICENSE", + "URL": "https://usethis.r-lib.org, https://github.com/r-lib/usethis", + "BugReports": "https://github.com/r-lib/usethis/issues", + "Depends": [ + "R (>= 3.6)" + ], + "Imports": [ + "cli (>= 3.0.1)", + "clipr (>= 0.3.0)", "crayon", - "curl", - "desc", - "fs", - "gert", - "gh", - "glue", + "curl (>= 2.7)", + "desc (>= 1.4.2)", + "fs (>= 1.3.0)", + "gert (>= 1.4.1)", + "gh (>= 1.2.1)", + "glue (>= 1.3.0)", "jsonlite", - "lifecycle", + "lifecycle (>= 1.0.0)", "purrr", "rappdirs", - "rlang", - "rprojroot", + "rlang (>= 1.1.0)", + "rprojroot (>= 1.2)", "rstudioapi", "stats", + "tools", "utils", "whisker", - "withr", + "withr (>= 2.3.0)", "yaml" ], - "Hash": "b2fbf93c2127bedd2cbe9b799530d5d2" + "Suggests": [ + "covr", + "knitr", + "magick", + "pkgload (>= 1.3.2.1)", + "rmarkdown", + "roxygen2 (>= 7.1.2)", + "spelling (>= 1.2)", + "styler (>= 1.2.0)", + "testthat (>= 3.1.8)" + ], + "Config/Needs/website": "r-lib/asciicast, tidyverse/tidytemplate, xml2", + "Config/testthat/edition": "3", + "Config/testthat/parallel": "TRUE", + "Config/testthat/start-first": "github-actions, release", + "Encoding": "UTF-8", + "Language": "en-US", + "RoxygenNote": "7.3.2", + "NeedsCompilation": "no", + "Author": "Hadley Wickham [aut] (), Jennifer Bryan [aut, cre] (), Malcolm Barrett [aut] (), Andy Teucher [aut] (), Posit Software, PBC [cph, fnd]", + "Maintainer": "Jennifer Bryan ", + "Repository": "RSPM" }, "utf8": { "Package": "utf8", "Version": "1.2.4", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R" + "Title": "Unicode Text Processing", + "Authors@R": "c(person(given = c(\"Patrick\", \"O.\"), family = \"Perry\", role = c(\"aut\", \"cph\")), person(given = \"Kirill\", family = \"M\\u00fcller\", role = \"cre\", email = \"kirill@cynkra.com\"), person(given = \"Unicode, Inc.\", role = c(\"cph\", \"dtc\"), comment = \"Unicode Character Database\"))", + "Description": "Process and print 'UTF-8' encoded international text (Unicode). Input, validate, normalize, encode, format, and display.", + "License": "Apache License (== 2.0) | file LICENSE", + "URL": "https://ptrckprry.com/r-utf8/, https://github.com/patperry/r-utf8", + "BugReports": "https://github.com/patperry/r-utf8/issues", + "Depends": [ + "R (>= 2.10)" + ], + "Suggests": [ + "cli", + "covr", + "knitr", + "rlang", + "rmarkdown", + "testthat (>= 3.0.0)", + "withr" ], - "Hash": "62b65c52671e6665f803ff02954446e9" + "VignetteBuilder": "knitr, rmarkdown", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.2.3", + "NeedsCompilation": "yes", + "Author": "Patrick O. Perry [aut, cph], Kirill Müller [cre], Unicode, Inc. [cph, dtc] (Unicode Character Database)", + "Maintainer": "Kirill Müller ", + "Repository": "RSPM" }, "vctrs": { "Package": "vctrs", "Version": "0.6.5", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "cli", + "Title": "Vector Helpers", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\"), person(\"Lionel\", \"Henry\", , \"lionel@posit.co\", role = \"aut\"), person(\"Davis\", \"Vaughan\", , \"davis@posit.co\", role = c(\"aut\", \"cre\")), person(\"data.table team\", role = \"cph\", comment = \"Radix sort based on data.table's forder() and their contribution to R's order()\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Defines new notions of prototype and size that are used to provide tools for consistent and well-founded type-coercion and size-recycling, and are in turn connected to ideas of type- and size-stability useful for analysing function interfaces.", + "License": "MIT + file LICENSE", + "URL": "https://vctrs.r-lib.org/, https://github.com/r-lib/vctrs", + "BugReports": "https://github.com/r-lib/vctrs/issues", + "Depends": [ + "R (>= 3.5.0)" + ], + "Imports": [ + "cli (>= 3.4.0)", "glue", - "lifecycle", - "rlang" + "lifecycle (>= 1.0.3)", + "rlang (>= 1.1.0)" ], - "Hash": "c03fa420630029418f7e6da3667aac4a" + "Suggests": [ + "bit64", + "covr", + "crayon", + "dplyr (>= 0.8.5)", + "generics", + "knitr", + "pillar (>= 1.4.4)", + "pkgdown (>= 2.0.1)", + "rmarkdown", + "testthat (>= 3.0.0)", + "tibble (>= 3.1.3)", + "waldo (>= 0.2.0)", + "withr", + "xml2", + "zeallot" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "Language": "en-GB", + "RoxygenNote": "7.2.3", + "NeedsCompilation": "yes", + "Author": "Hadley Wickham [aut], Lionel Henry [aut], Davis Vaughan [aut, cre], data.table team [cph] (Radix sort based on data.table's forder() and their contribution to R's order()), Posit Software, PBC [cph, fnd]", + "Maintainer": "Davis Vaughan ", + "Repository": "RSPM" }, "whisker": { "Package": "whisker", "Version": "0.4.1", "Source": "Repository", - "Repository": "CRAN", - "Hash": "c6abfa47a46d281a7d5159d0a8891e88" + "Maintainer": "Edwin de Jonge ", + "License": "GPL-3", + "Title": "{{mustache}} for R, Logicless Templating", + "Type": "Package", + "LazyLoad": "yes", + "Author": "Edwin de Jonge", + "Description": "Implements 'Mustache' logicless templating.", + "URL": "https://github.com/edwindj/whisker", + "Suggests": [ + "markdown" + ], + "RoxygenNote": "6.1.1", + "NeedsCompilation": "no", + "Repository": "RSPM", + "Encoding": "UTF-8" }, "withr": { "Package": "withr", - "Version": "3.0.1", - "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", - "grDevices", - "graphics" - ], - "Hash": "07909200e8bbe90426fbfeb73e1e27aa" + "Version": "3.0.2", + "Source": "Repository", + "Title": "Run Code 'With' Temporarily Modified Global State", + "Authors@R": "c( person(\"Jim\", \"Hester\", role = \"aut\"), person(\"Lionel\", \"Henry\", , \"lionel@posit.co\", role = c(\"aut\", \"cre\")), person(\"Kirill\", \"Müller\", , \"krlmlr+r@mailbox.org\", role = \"aut\"), person(\"Kevin\", \"Ushey\", , \"kevinushey@gmail.com\", role = \"aut\"), person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = \"aut\"), person(\"Winston\", \"Chang\", role = \"aut\"), person(\"Jennifer\", \"Bryan\", role = \"ctb\"), person(\"Richard\", \"Cotton\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "A set of functions to run code 'with' safely and temporarily modified global state. Many of these functions were originally a part of the 'devtools' package, this provides a simple package with limited dependencies to provide access to these functions.", + "License": "MIT + file LICENSE", + "URL": "https://withr.r-lib.org, https://github.com/r-lib/withr#readme", + "BugReports": "https://github.com/r-lib/withr/issues", + "Depends": [ + "R (>= 3.6.0)" + ], + "Imports": [ + "graphics", + "grDevices" + ], + "Suggests": [ + "callr", + "DBI", + "knitr", + "methods", + "rlang", + "rmarkdown (>= 2.12)", + "RSQLite", + "testthat (>= 3.0.0)" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "Collate": "'aaa.R' 'collate.R' 'connection.R' 'db.R' 'defer-exit.R' 'standalone-defer.R' 'defer.R' 'devices.R' 'local_.R' 'with_.R' 'dir.R' 'env.R' 'file.R' 'language.R' 'libpaths.R' 'locale.R' 'makevars.R' 'namespace.R' 'options.R' 'par.R' 'path.R' 'rng.R' 'seed.R' 'wrap.R' 'sink.R' 'tempfile.R' 'timezone.R' 'torture.R' 'utils.R' 'with.R'", + "NeedsCompilation": "no", + "Author": "Jim Hester [aut], Lionel Henry [aut, cre], Kirill Müller [aut], Kevin Ushey [aut], Hadley Wickham [aut], Winston Chang [aut], Jennifer Bryan [ctb], Richard Cotton [ctb], Posit Software, PBC [cph, fnd]", + "Maintainer": "Lionel Henry ", + "Repository": "RSPM" }, "xfun": { "Package": "xfun", - "Version": "0.48", + "Version": "0.50", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ - "R", + "Type": "Package", + "Title": "Supporting Functions for Packages Maintained by 'Yihui Xie'", + "Authors@R": "c( person(\"Yihui\", \"Xie\", role = c(\"aut\", \"cre\", \"cph\"), email = \"xie@yihui.name\", comment = c(ORCID = \"0000-0003-0645-5666\")), person(\"Wush\", \"Wu\", role = \"ctb\"), person(\"Daijiang\", \"Li\", role = \"ctb\"), person(\"Xianying\", \"Tan\", role = \"ctb\"), person(\"Salim\", \"Brüggemann\", role = \"ctb\", email = \"salim-b@pm.me\", comment = c(ORCID = \"0000-0002-5329-5987\")), person(\"Christophe\", \"Dervieux\", role = \"ctb\"), person() )", + "Description": "Miscellaneous functions commonly used in other packages maintained by 'Yihui Xie'.", + "Depends": [ + "R (>= 3.2.0)" + ], + "Imports": [ "grDevices", "stats", "tools" ], - "Hash": "89e455b87c84e227eb7f60a1b4e5fe1f" + "Suggests": [ + "testit", + "parallel", + "codetools", + "methods", + "rstudioapi", + "tinytex (>= 0.30)", + "mime", + "litedown (>= 0.4)", + "commonmark", + "knitr (>= 1.47)", + "remotes", + "pak", + "rhub", + "renv", + "curl", + "xml2", + "jsonlite", + "magick", + "yaml", + "qs", + "rmarkdown" + ], + "License": "MIT + file LICENSE", + "URL": "https://github.com/yihui/xfun", + "BugReports": "https://github.com/yihui/xfun/issues", + "Encoding": "UTF-8", + "RoxygenNote": "7.3.2", + "VignetteBuilder": "litedown", + "NeedsCompilation": "yes", + "Author": "Yihui Xie [aut, cre, cph] (), Wush Wu [ctb], Daijiang Li [ctb], Xianying Tan [ctb], Salim Brüggemann [ctb] (), Christophe Dervieux [ctb]", + "Maintainer": "Yihui Xie ", + "Repository": "CRAN" }, "xml2": { "Package": "xml2", "Version": "1.3.6", "Source": "Repository", + "Title": "Parse XML", + "Authors@R": "c( person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\")), person(\"Jim\", \"Hester\", role = \"aut\"), person(\"Jeroen\", \"Ooms\", role = \"aut\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")), person(\"R Foundation\", role = \"ctb\", comment = \"Copy of R-project homepage cached as example\") )", + "Description": "Work with XML files using a simple, consistent interface. Built on top of the 'libxml2' C library.", + "License": "MIT + file LICENSE", + "URL": "https://xml2.r-lib.org/, https://github.com/r-lib/xml2", + "BugReports": "https://github.com/r-lib/xml2/issues", + "Depends": [ + "R (>= 3.6.0)" + ], + "Imports": [ + "cli", + "methods", + "rlang (>= 1.1.0)" + ], + "Suggests": [ + "covr", + "curl", + "httr", + "knitr", + "magrittr", + "mockery", + "rmarkdown", + "testthat (>= 3.0.0)" + ], + "VignetteBuilder": "knitr", + "Config/Needs/website": "tidyverse/tidytemplate", + "Encoding": "UTF-8", + "Roxygen": "list(markdown = TRUE)", + "RoxygenNote": "7.2.3", + "SystemRequirements": "libxml2: libxml2-dev (deb), libxml2-devel (rpm)", + "Collate": "'S4.R' 'as_list.R' 'xml_parse.R' 'as_xml_document.R' 'classes.R' 'format.R' 'import-standalone-obj-type.R' 'import-standalone-purrr.R' 'import-standalone-types-check.R' 'init.R' 'nodeset_apply.R' 'paths.R' 'utils.R' 'xml2-package.R' 'xml_attr.R' 'xml_children.R' 'xml_document.R' 'xml_find.R' 'xml_missing.R' 'xml_modify.R' 'xml_name.R' 'xml_namespaces.R' 'xml_node.R' 'xml_nodeset.R' 'xml_path.R' 'xml_schema.R' 'xml_serialize.R' 'xml_structure.R' 'xml_text.R' 'xml_type.R' 'xml_url.R' 'xml_write.R' 'zzz.R'", + "Config/testthat/edition": "3", + "Config/pak/sysreqs": "libxml2-dev", "Repository": "https://carpentries.r-universe.dev", "RemoteUrl": "https://github.com/r-lib/xml2", "RemoteRef": "v1.3.6", "RemoteSha": "6a1b5e8fd44601faffcd5c56b6837bbf6ee41322", - "Requirements": [ - "R", - "cli", - "methods", - "rlang" - ], - "Hash": "1d0336142f4cd25d8d23cd3ba7a8fb61" + "NeedsCompilation": "yes", + "Author": "Hadley Wickham [aut, cre], Jim Hester [aut], Jeroen Ooms [aut], Posit Software, PBC [cph, fnd], R Foundation [ctb] (Copy of R-project homepage cached as example)", + "Maintainer": "Hadley Wickham " }, "xslt": { "Package": "xslt", - "Version": "1.4.6", + "Version": "1.5.0", "Source": "Repository", - "Repository": "CRAN", - "Requirements": [ + "Title": "Extensible Style-Sheet Language Transformations", + "Description": "An extension for the 'xml2' package to transform XML documents by applying an 'xslt' style-sheet.", + "Authors@R": "person(\"Jeroen\", \"Ooms\", role = c(\"aut\", \"cre\"), email = \"jeroenooms@gmail.com\", comment = c(ORCID = \"0000-0002-4035-0289\"))", + "Maintainer": "Jeroen Ooms ", + "URL": "https://ropensci.r-universe.dev/xslt https://docs.ropensci.org/xslt/", + "BugReports": "https://github.com/ropensci/xslt/issues", + "Depends": [ + "xml2 (>= 1.3.0)" + ], + "Imports": [ + "Rcpp" + ], + "LinkingTo": [ "Rcpp", "xml2" ], - "Hash": "fddf5280c2bf4d63fb2c9c8d6b040c90" + "SystemRequirements": "libxslt: libxslt1-dev (deb), libxslt-devel (rpm)", + "License": "GPL (>= 2)", + "RoxygenNote": "6.0.1", + "Suggests": [ + "testthat" + ], + "NeedsCompilation": "yes", + "Author": "Jeroen Ooms [aut, cre] ()", + "Repository": "CRAN" }, "yaml": { "Package": "yaml", "Version": "2.3.10", "Source": "Repository", - "Repository": "CRAN", - "Hash": "51dab85c6c98e50a18d7551e9d49f76c" + "Type": "Package", + "Title": "Methods to Convert R Data to YAML and Back", + "Date": "2024-07-22", + "Suggests": [ + "RUnit" + ], + "Author": "Shawn P Garbett [aut], Jeremy Stephens [aut, cre], Kirill Simonov [aut], Yihui Xie [ctb], Zhuoer Dong [ctb], Hadley Wickham [ctb], Jeffrey Horner [ctb], reikoch [ctb], Will Beasley [ctb], Brendan O'Connor [ctb], Gregory R. Warnes [ctb], Michael Quinn [ctb], Zhian N. Kamvar [ctb], Charlie Gao [ctb]", + "Maintainer": "Shawn Garbett ", + "License": "BSD_3_clause + file LICENSE", + "Description": "Implements the 'libyaml' 'YAML' 1.1 parser and emitter () for R.", + "URL": "https://github.com/vubiostat/r-yaml/", + "BugReports": "https://github.com/vubiostat/r-yaml/issues", + "NeedsCompilation": "yes", + "Repository": "RSPM", + "Encoding": "UTF-8" }, "zip": { "Package": "zip", - "Version": "2.3.1", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "fcc4bd8e6da2d2011eb64a5e5cc685ab" + "Version": "2.3.2", + "Source": "Repository", + "Title": "Cross-Platform 'zip' Compression", + "Authors@R": "c( person(\"Gábor\", \"Csárdi\", , \"csardi.gabor@gmail.com\", role = c(\"aut\", \"cre\")), person(\"Kuba\", \"Podgórski\", role = \"ctb\"), person(\"Rich\", \"Geldreich\", role = \"ctb\"), person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\")) )", + "Description": "Cross-Platform 'zip' Compression Library. A replacement for the 'zip' function, that does not require any additional external tools on any platform.", + "License": "MIT + file LICENSE", + "URL": "https://github.com/r-lib/zip, https://r-lib.github.io/zip/", + "BugReports": "https://github.com/r-lib/zip/issues", + "Suggests": [ + "covr", + "pillar", + "processx", + "R6", + "testthat", + "withr" + ], + "Config/Needs/website": "tidyverse/tidytemplate", + "Config/testthat/edition": "3", + "Encoding": "UTF-8", + "RoxygenNote": "7.2.3", + "NeedsCompilation": "yes", + "Author": "Gábor Csárdi [aut, cre], Kuba Podgórski [ctb], Rich Geldreich [ctb], Posit Software, PBC [cph, fnd]", + "Maintainer": "Gábor Csárdi ", + "Repository": "CRAN" } } }