devtools/0000755000175000017500000000000014151364022012241 5ustar nileshnileshdevtools/MD50000644000175000017500000002566314151364022012565 0ustar nileshnilesh333e725e95c9cd3eb816a6d1618522c4 *DESCRIPTION 19545c77acbd277a383c948b34f77d84 *LICENSE 68d4853bb9afe8be0cec9cdc0f6558c8 *NAMESPACE 60d491457519db3f95cd5ab1606764b6 *NEWS.md f72c92122cbbe5562dd8614be2dd36f7 *R/R.R 1dc901522c8f32163705224b90d90c66 *R/active.R ce3be42a5b85d95cbee8d7fd7fb4a62d *R/bash.R 4985629ee07301fb35489c3e58d41451 *R/build-manual.R a5e5897f15ac1b0c2e32720caa260c3e *R/build-readme.R 315d0bd94b97dab4c0cc225365ce044e *R/build-site.R f036d6adb618b4a32d1782bb58a0dc83 *R/check-devtools.R d2644f58a085cb3c566dc5daffcd2e7e *R/check-doc.R 0fce8f9aff8a8e0534000ff21a21c8cc *R/check-git.R fe4477b098ceac830189a1ec9312c681 *R/check-mac.R 5501b2540cd25405eea2a81c10b804fd *R/check-win.R 7661d79613d2351036b08ead649684b4 *R/check.R a209c238f5e01cbbfb3ee08ff301b0a1 *R/create.R 8040fdad7643645ccb225fdc71f1c3b3 *R/dev-mode.R 6679135e2575f02ed06a8fbde40dd796 *R/document.R 339bac72afc3d66473f6edd6fef81ded *R/git.R 339bd3bab4d457ae402cced8c2921866 *R/has-tests.R 805f9f5eefd6d4344e3ede9a12ef3b0b *R/install.R ca62027f0f25ad6510596d96f8f11990 *R/lint.R a69f07ad387d18405dd29786bcfae2fa *R/missing-s3.R eae46eb28401fb52029c3145d17eda78 *R/package-deps.R 943a94a1491f9d4f920158910f4265d6 *R/package.R e937ed0766104a4ec11d74f2956a2613 *R/pkgbuild.R 53e9c0f4192713622fc594e4cbf241f9 *R/pkgload.R 536adc6450680af438d08b34dc0468c0 *R/r-hub.R c9854d6f23fad36548d182fe0b262323 *R/release.R 4cfb279ac28c840e1577d09e2f9c9d98 *R/reload.R 444462f510c29e07011a73f7329b5328 *R/remotes.R 0665dd70f316c5bfe5b0598aaa75f387 *R/revdep.R 88a9ec49425951e7328f3b7b2cb7d7bf *R/run-examples.R bc57a67c63d4c2bea863300de4912d62 *R/run-source.R 4ca1404a53a594d47c22051d25791f4c *R/save-all.R b020b61137ff394f382fff2fa47c601d *R/session-info.R bb5fc1637678c28cd57706bb8597337e *R/show-news.R 8b020d9ddc699b3385c16fbd7aba9c10 *R/sitrep.R dbc6bc73afa1dcd41e156e2709d2ee22 *R/spell-check.R 2509d1b6c298c7166321bc82d0fec931 *R/test.R d426627c5f6d0239e1d41f5f9adea175 *R/uninstall.R 531724e1dbab75e613c22ed8487c3587 *R/usethis.R 3a00e5f748ba55d30aeae4b34ca84674 *R/utils.R 8c0b4a5218c7b64523222043032ddbc5 *R/vignette-r.R f2c9e24a7b1296c359d72c552f5b1efd *R/vignettes.R d39eb2082fe1a88237a2971077379faa *R/wd.R 07c1b603a6e26b28a765a3e647cd5341 *R/zzz.R 22731ccfe97b0f1a7967ab2289ac8b50 *README.md e5d208e8455fe8a0e464b12eb8120697 *build/vignette.rds b9e77fcab0b263d2dae5bbd888fd4438 *inst/WORDLIST e537d648a6ceb5fd6cc5e5f5450e7ad5 *inst/doc/dependencies.Rmd 5aa571fdba2163e9daf224e64d7a8510 *inst/doc/dependencies.html 48df05798555d5765a367c469daf7375 *inst/rstudio/addins.dcf 649b07c70f310d03b99284860c349e1a *man/as.package.Rd 4b1d5143f8dcd64533fefd1c9a371620 *man/bash.Rd 614d29a2936fb630df562f3f8d21bb79 *man/build.Rd 456a622adb3a84eb539fee55e62ba475 *man/build_manual.Rd 4893b5c00f80602199a220cf05aa270b *man/build_rmd.Rd 0b4f1dfb339eeeb86148a3952159e87b *man/build_site.Rd e64ee3d4c4318716300e10fdd6ba9541 *man/build_vignettes.Rd 3f12100bbca5b654914366de5cb0cda2 *man/check.Rd 428496be6363e8c56330cdfcd0c1ec6e *man/check_mac_release.Rd 8a2e6bffa9ad2e527f4f5135aa7fe0ca *man/check_man.Rd 9a9a5ecd9d8a37ee4a6ef5f6c255c5f4 *man/check_rhub.Rd 7a329c4b021df625bb44e4978df8e475 *man/check_win.Rd 934c609d831b3ef5b81c0029fefb3247 *man/clean_vignettes.Rd 79d1ff3f2af8cff6ed8b783496925f0f *man/create.Rd 7b5f5edee31ddd580530552bd740081f *man/dev_mode.Rd 3de2d969524b420f4846036bd90b6abf *man/dev_packages.Rd 65a9afb06bd352704517ea75990c98c5 *man/dev_sitrep.Rd 7a9a1549052f1d733ea16b5e478d7b3e *man/devtools-deprecated.Rd 4309157846bf0408da5250af48990c0d *man/devtools.Rd 770446c533bfd7015d7ef44c21f7e701 *man/document.Rd 90be1a8cfa73872e693212364f81f846 *man/figures/logo.svg 3279a0aab1fc7cb5a0f381b2b3014fd0 *man/git_checks.Rd 2caa4f66807eec87e14bdb2e6b83aded *man/has_tests.Rd 4069de5a36ecf9443482987372d403e9 *man/install.Rd 3c0dedc1ac31448f4b6e368be9b7710e *man/install_deps.Rd 77ed6f21da974951f90d961e63cf1189 *man/is.package.Rd 0fa30e6869230eaad9ce04a0d2c0c1ee *man/lint.Rd f5d2e65acb2887218bf4c89b2be2be04 *man/load_all.Rd 5a6a87c3b374eac586e3f8e761e62636 *man/loaded_packages.Rd 53b7e2ae3592b3baff18e95247552837 *man/missing_s3.Rd 82bca1e79883be645d76ff79d4b87058 *man/package_file.Rd 241029e6ba9792bef15c93b07047e2d1 *man/r_env_vars.Rd 2ec25d810a91632fd89e2108f072dd38 *man/reexports.Rd 6ed38ff585eca4a4df3b613875144df7 *man/release.Rd 5a90c0ee7ea56bcaa256b1b636f3098b *man/release_checks.Rd 01b7863fbab1074a1c3b89238216de80 *man/reload.Rd 2678c5bdcd7637f7c4d42ddc8240b292 *man/remote-reexports.Rd 256bc49353613d3c047f65917209dc09 *man/revdep.Rd 46b2b31314788ca001096dd4c74bc038 *man/run_examples.Rd bc6a6a15402c314987ed6ee78c1070c6 *man/save_all.Rd 96867eca8c23c11ae02e0d86d5612677 *man/show_news.Rd 0a5c5ce0941ff8dd9ce9ddde8e88c223 *man/source_gist.Rd 20da442ec24e1d07f5216bc0fa495177 *man/source_url.Rd bfafd8b9099bbf12e80ba7ba9856442b *man/spell_check.Rd 8f48992c6a420105e57372562014d948 *man/submit_cran.Rd 737b303fd492ee73d09aa612daa0ad68 *man/test.Rd a03bc39672052f7cb8ff967d45085c13 *man/uninstall.Rd d6845d7354e4f23d4bdd25ad68ea9ffc *man/uses_testthat.Rd 200f407374e5153431a19b7d6abb37c0 *man/wd.Rd 0622a97a2aaa3c342f09636052c2d7f5 *tests/spelling.R 9bc76059e15e27f1fe80fbce9db84eb7 *tests/testthat.R 604e31b0e928d069d21ea4a8be3919cb *tests/testthat/archive.rds 2913f95b2e0f8b0c189759c4a228f46c *tests/testthat/check-results-note.log 15a21091b5fd5906ba9a32653538f8c0 *tests/testthat/helper.R 4cf2d64e44205fe628ddd534e1151b58 *tests/testthat/shallowRepo/HEAD f64c2e160407ee686211bd819bb1ff68 *tests/testthat/shallowRepo/config a0a7c3fff21f2aea3cfa1d0316dd816c *tests/testthat/shallowRepo/description 036208b4a1ab4a235d75c181e685e5a3 *tests/testthat/shallowRepo/info/exclude 593fdfcbcc04d475782bc046132edcef *tests/testthat/shallowRepo/objects/pack/pack-c4e0f1d1d68408f260cbbf0a533ad5f6bfd5524e.idx 2554b1bae0dbb84947faff32cf409287 *tests/testthat/shallowRepo/objects/pack/pack-c4e0f1d1d68408f260cbbf0a533ad5f6bfd5524e.pack 2d1cf6b7f2fa49adb6f307e98766c975 *tests/testthat/shallowRepo/packed-refs e09030d939f08dcad3985f33db51c18f *tests/testthat/shallowRepo/refs/tags/v1.10.0 4ef4145c4fc7a472499a55cb0b25e3d3 *tests/testthat/shallowRepo/shallow 379ab92fd2bddf0afed791ea3fc80179 *tests/testthat/test-active.R c47c38553fb9fb09eb97dd9085a9213b *tests/testthat/test-build-readme.R 4cf0237102a4d170e3460b774511aa65 *tests/testthat/test-build-site.R ac9773c1bfb7d5ec64e24a93e6f1f366 *tests/testthat/test-check-doc.R ed50d9a8ce205a999775592371a19a02 *tests/testthat/test-check.R 7ad2a8d4cd2077f3842fdf5967523ecd *tests/testthat/test-install.R d2bb65ee44bfc32546b9171d888359f5 *tests/testthat/test-reload.R 2c5c8c2ecd3ff94e2d4b21798a5a57f6 *tests/testthat/test-run-examples.R 11a65dca1fce53dd9c43ad1d8d7dac69 *tests/testthat/test-run-source.R 6aec09fa4dc114948266b38b62b09002 *tests/testthat/test-sitrep.R 1af4c5e8ae88c4604c7b44489c6ad3ff *tests/testthat/test-test.R e97fc73f9d8f1d095a5c966935911b5d *tests/testthat/test-uninstall.R d38c15bdf1db1f8f7f032eef857986b0 *tests/testthat/test-utils.R 818bb22a6bfff3dad020a52f515a4fb1 *tests/testthat/test-vignettes.R 872b6d963de006fd1d5f630014d44fd6 *tests/testthat/testCheckExtrafile/DESCRIPTION 85601cb90b291bb14a88bc9e7349b653 *tests/testthat/testCheckExtrafile/NAMESPACE abd2e85f330c6edb718f21b70c4025fd *tests/testthat/testCheckExtrafile/R/a.R 7dd2e80bb9bc9a2e5b5242cfa0773594 *tests/testthat/testCheckExtrafile/an_extra_file f2156963e20e8b103d1c56ff19952e05 *tests/testthat/testCheckExtrafile/man/a.Rd 3ef2ad4e721c38bf6b4dbd213ca8e474 *tests/testthat/testError/DESCRIPTION 482ad90a326645dfd29cb4009d87fc77 *tests/testthat/testError/R/error.R 1ff80625254babe3f685c65f120f9311 *tests/testthat/testHelp/DESCRIPTION 07493dea1b5bdd08b83fc86e7207e4a6 *tests/testthat/testHelp/NAMESPACE ed61308da230ce41b4a2ec373a434237 *tests/testthat/testHelp/R/foofoo.R 9ea3ed4f53478f3643e1cad9018b8995 *tests/testthat/testHelp/man/foofoo.Rd 94cd54a1ac1228f566e3353a266fda0f *tests/testthat/testMarkdownVignettes/DESCRIPTION 79b420e1c7ec95ab732d36ed0fc00e5b *tests/testthat/testMarkdownVignettes/vignettes/test.Rmd 1494bf61f7e5b6e5a36a6df0faf2c486 *tests/testthat/testMissingNsObject/DESCRIPTION 9fb09fba835e687b843b78452bbeb820 *tests/testthat/testMissingNsObject/NAMESPACE 26813d0f7f8e272af05102662163c53b *tests/testthat/testMissingNsObject/R/a.R b7c9f68e639e02977dfc9e029b09b764 *tests/testthat/testPkgdown/DESCRIPTION ec57db2c3a62d8292430ed1cb473acc2 *tests/testthat/testPkgdown/NAMESPACE 837c8d1b6475820e4063bacaa9688a0c *tests/testthat/testPkgdown/R/pkgdown-test-test.R 8f3c82762bc460cbab37b7db5b00bfa2 *tests/testthat/testPkgdown/_pkgdown.yml c1bd9be45b7b4fdbe562160c97ed6d3c *tests/testthat/testPkgdown/man/pkgdown_test_test.Rd ba416f9c93325996a32015459de57df7 *tests/testthat/testPkgdown/vignettes/test.Rmd 0863c87096fde593c6a111953714d32e *tests/testthat/testTest/DESCRIPTION dc21c19f0d6968ee25d441b2cf46017d *tests/testthat/testTest/NAMESPACE 68b329da9893e34099c7d8ad5cb9c940 *tests/testthat/testTest/R/dummy.R 9d0478fe975946f3ce9fbd3c4e003c67 *tests/testthat/testTest/tests/testthat.R 225e3812b897786befc574f805c96dc2 *tests/testthat/testTest/tests/testthat/test-dummy.R ce91db0c743f0490510846f28971aa79 *tests/testthat/testTest/tests/testthat/test-envvar.R de918500a6a50ddacc42bdbe04ca6a11 *tests/testthat/testTestWithDepends/DESCRIPTION 012592abf4b40a8d741b299df2ded05a *tests/testthat/testTestWithDepends/NAMESPACE d8f7b32e5a6ab4d463e3c33080c80537 *tests/testthat/testTestWithDepends/tests/testthat.R 225e3812b897786befc574f805c96dc2 *tests/testthat/testTestWithDepends/tests/testthat/test-dummy.R 506ba2c08494863af3e5d5bf73ad2b21 *tests/testthat/testTestWithFailure/DESCRIPTION dc21c19f0d6968ee25d441b2cf46017d *tests/testthat/testTestWithFailure/NAMESPACE 68b329da9893e34099c7d8ad5cb9c940 *tests/testthat/testTestWithFailure/R/dummy.R 9d0478fe975946f3ce9fbd3c4e003c67 *tests/testthat/testTestWithFailure/tests/testthat.R 3c813eaf9f13945b51ea5ffc7975e607 *tests/testthat/testTestWithFailure/tests/testthat/test-fail.R 858d20e34a072df15088cd855c2fc580 *tests/testthat/testTestWithFailure/tests/testthat/test-warn.R 755c328df07127fa8a38f18b61dae04d *tests/testthat/testUseData/DESCRIPTION f9ea5333e6efd9c51fc46fe34164c341 *tests/testthat/testUseData/NAMESPACE 68b329da9893e34099c7d8ad5cb9c940 *tests/testthat/testUseData/R/a.R 06242e2cea47b189439bf8477f8aab09 *tests/testthat/testVignetteExtras/DESCRIPTION d41d8cd98f00b204e9800998ecf8427e *tests/testthat/testVignetteExtras/NAMESPACE 26813d0f7f8e272af05102662163c53b *tests/testthat/testVignetteExtras/vignettes/a.R 2106801e8a4dfc0552ff0fcf3ae2fe7a *tests/testthat/testVignetteExtras/vignettes/new.Rnw 06242e2cea47b189439bf8477f8aab09 *tests/testthat/testVignettes/DESCRIPTION d41d8cd98f00b204e9800998ecf8427e *tests/testthat/testVignettes/NAMESPACE 2106801e8a4dfc0552ff0fcf3ae2fe7a *tests/testthat/testVignettes/vignettes/new.Rnw f56fba6bb35d06307179111a2375e2b2 *tests/testthat/testVignettesBuilt/DESCRIPTION 343f94d4d7972a1af6cb10fd64bae431 *tests/testthat/testVignettesBuilt/NAMESPACE ea67dc1edf62b5901bb4eee40db481a6 *tests/testthat/testVignettesBuilt/R/code.R 4a91678fed5c1ef66c63b3d4ee51520e *tests/testthat/testVignettesBuilt/vignettes/new.Rnw e537d648a6ceb5fd6cc5e5f5450e7ad5 *vignettes/dependencies.Rmd devtools/NEWS.md0000644000175000017500000026336314151174524013362 0ustar nileshnilesh# devtools 2.4.3 * New `check_mac_release()` function to check a package using the macOS builder at https://mac.r-project.org/macbuilder/submit.html (#2375) * Jenny Bryan is now the official maintainer. * `release()` and `submit_cran()` now record submission details using the Debian Control File format, for better machine-readability. This file has a new name, CRAN-SUBMISSION (instead of CRAN-RELEASE) and now includes package version, in addition to the full SHA and a timestamp. # devtools 2.4.2 * `check_man()` now works with R versions 4.1+ (#2354) * `test_active_file()` now again works on windows projects stored under the user's home directory (`~`) (#2355) * `document(quiet = TRUE)` now works without failure on windows (#2351) * Minor test failure on R 4.2 has been fixed. * New Rstudio addin for `run_examples()` (#2358) # devtools 2.4.1 * `build_readme()` now uses the `path` argument, as designed (#2344) * `create()` no longer opens projects by default to avoid duplicate projects opened by the RStudio IDE project template (#2347, @malcolmbarrett) * The RStudio addins now use `test_active_file()` and `test_coverage_active_file()` instead of the deprecated `test_file()` and `test_coverage_file()` (#2339) * RStudio addins now run in interactive mode, rather than background mode (@jennybc, #2350) * `install(upgrade)` now defaults to 'default' rather than 'ask'. This allows you to control the default asking behavior with the `R_REMOTES_UPGRADE` environment variable (#2345) # devtools 2.4.0 ## Breaking changes and deprecated functions * The `check_results()` function has been removed. It was not used by any CRAN package, and much better alternatives are available in the [rcmdcheck](https://github.com/r-lib/rcmdcheck) package. * `pkgload::inst()` is no longer re-exported (#2218). * `test_file()` has been renamed to `test_active_file()` and `test_coverage_file()` has been renamed to `test_coverage_active_file()` to avoid a name collision with `testthat::test_file()`. The previous names have been soft deprecated in this release, they will be hard deprecated in the next release and eventually removed. (#2125) ## Re-licensing * devtools is now released under a MIT license (#2326) ## Minor improvements and fixes * `build_readme()` now supports readme files located in `inst/README.Rmd`, as intended (#2333) * `build_vignettes()` now creates more specific `.gitignore` entries (@klmr, #2317) * `check()` now only re-documents if you have a matching version of roxygen2 (#2263). * `change_maintainer_email()` now has a check to assess whether the email is actually changed. If the email is not changed, the code now stops such that an email is not accidentally sent to the wrong recipient. (@emilsjoerup, #2073) * `run_examples(fresh = TRUE)` again works without error (#2264) * The covr and DT packages have been moved from Imports to Suggests. They are only needed when running `test_coverage()` and `test_coverage_active_file()` so now you'll be prompted to install them when needed. * Switched to fs for all file system functions (#2331, @malcolmbarrett) * Now uses testthat 3.0.0 to power `test()`, `test_active_file()`, `test_coverage()`, and `test_coverage_active_file()`. The major difference is that `test_active_file()` now generates a compact summary that takes up less space on the console. # devtools 2.3.2 * Fix for compatibility with withr 2.3.0 # devtools 2.3.1 * `check_win_*()` function now resets the email to the original email after execution, this bug was fixed and crept back in (@muschellij2, #2152). * `run_examples()` arguments `run` and `test` are deprecated in favor of the (hopefully) more clear `run_dontrun` and `run_donttest` (pkgload/#107). * Previously deprecated functions `dr_devtools()` and `dr_github()` have been removed. * Documentation has been synced with remotes 2.2.0 # devtools 2.3.0 * `build()` now errors with a more informative error message when passed an invalid `pkg`. (#2177) * New `build_rmd()` can build any `.Rmd` file in a clean session. * `dev_sitrep()` now works correctly when R is out of date (#2204) # devtools 2.2.2 * `install_dev_deps()` now passes formal args onto `remotes::install_deps()` (@t-gibson, #2166) * `spell_check()` now checks if `spelling` is installed and prompts users to install it if not (@mikemahoney218, #2172) * `submit_cran()` now returns a more informative error when the CRAN submission portal is down (#1958) * `check()` gains a `vignettes` argument, to more easily disable checks for vignettes (#2165). * `check_win_*()` function now resets the email to the original email after execution (@muschellij2, #2152). * `check()` now sets `NOT_CRAN=true` by default, as was originally intended (#2135). * `install_deps()` now supports `options("devtools.ellipsis_action")` as well (#2169) * `test()` now takes `stop_on_failure` as a formal argument (FALSE by default) instead of in `...`. Its value is still passed to `testthat::test_dir` as before (@infotroph, #2129). * `test()` and `test_coverage_file()` gain a `export_all` argument, which controls if all functions in a package are automatically exported (#1201). * `dev_sitrep()` now works if run outside a package directory (#2127). * `release()` now works if the package root is not in the working directory. # devtools 2.2.1 * `test()` now sets the collation order to `C` before running, which matches the behavior of tests when run with `R CMD check` (#2121) * New `options("devtools.ellipsis_action")` option added to control the action of ellipsis in devtools. This should be one of - `rlang::abort` - to emit an error if arguments are unused - `rlang::warn` - to emit a warning if arguments are unused - `rlang::inform` - to emit a message if arguments are unused - `rlang::signal` - to emit a message if arguments are unused Using `rlang::signal` will produce no output unless the custom condition is caught, so it is the best way to retain backwards compatibility with devtools behavior prior to 2.2.0. The default behavior was also changed to issue a warning rather than an error if any arguments are unused, as there are some cases where devtools does not need to install the package, so unused arguments are false positives (#2109). * `install()` now throws an error when it fails, as intended (#2120) * `install()` now again reloads and re-attaches packages if they were previously loaded (#2111). * `release()` no longer calls the deprecated `dr_devtools()` (#2105) * `test()` now explicitly passes `stop_on_failure = FALSE` to `testthat::test_dir()` (@jameslamb, #2099) # devtools 2.2.0 ## New Features * `create()` added back, the RStudio IDE uses `create()` in the create packages dialog, so removing it in version 2.1.0 broke old versions of the IDE. * New `dev_sitrep()` function to return information about your development environment and diagnose common problems. The former functions `dr_devtools()` and `dr_github()` have been deprecated. (#1970) * All functions taking `...` now use the ellipsis package. This catches errors when arguments are misspelled or incorrectly specified (#2016) ## Minor improvements and fixes * `build_vignettes()` now correctly installs the vignette builder if it is not already installed (#2089). * `dev_sitrep()` now uses the same endpoint to detect the current RStudio version as the IDE (#2050). * `document()` gains a `quiet` parameter, to silence output and `check()` now passes its quiet argument to it (#1986). * Add the DT package as a dependency, so that `test_coverage()` and `test_coverage_file()` work without having to install additional packages (#2085). * `check_man()` now succeeds when `tools::undoc()` returns empty results (#1944). * `check_win_*()` functions gain a `email` argument, so temporarily change the email the check results will be sent to (#1723). * `install()` now explicitly unloads packages before trying to install a new version (#2094). * All `install_*()` functions now attach build tools to the PATH, which makes them work on Windows when RTools is not on the default PATH (#2093). * `test_coverage_file()` now works when there is not a 1 to 1 correspondence between test and source files (#2011). * `release()` now works again when `pkg` is not the current working directory (#1974). * `release()` now works without error when `options("repos")` is unnamed (#1956). * `create()` added, the RStudio IDE uses `create()`, so removing it in version 2.1.0 broke old versions of the IDE. * In several places `http:` URLs were used instead of `https:`, the most critical being in the `cran_mirror`, `cran_pacakges`, and `cran_submission_url` values which could have enabled discrete activity disclosure and person-in-the-middle attacks (i.e. changing the contents while uploading/downloading). All `http:` URLS have been changed to `https:` URLs. (@hrbrmstr, #2091) # devtools 2.1.0 ## New Features * `testthat` and `roxygen2` are now added to `Imports` rather than `Suggests`, so they are automatically installed when you install devtools. ## Deprecated functions now removed * `create()`, `create_description()`, `setup()` `use_appveyor()`, `use_build_ignore()`, `use_code_of_conduct()`, `use_coverage()`, `use_cran_badge()`, `use_cran_comments()`, `use_data()`, `use_data_raw()`, `use_dev_version()`, `use_git()`, `use_git_hook()`, `use_github()`, `use_github_links()`, `use_gpl3_license()`, `use_mit_license()`, `use_news_md()`, `use_package()`, `use_package_doc()`, `use_rcpp()`, `use_readme_md()`, `use_readme_rmd()`, `use_revdep()`, `use_rstudio()`, `use_test()`, `use_testthat()`, `use_travis()`, `use_vignette()`, have been removed after being deprecated in previous releases. Use the versions in the [usethis](https://usethis.r-lib.org/) package directly. * `check_cran()`, `revdep_check()`, `revdep_check_print_problems()`, `revdep_check_reset()`, `revdep_check_resume()`, `revdep_check_save_summary()`, `revdep_email()` have been removed after being deprecated in previous releases. It is recommended to use the [revdepcheck](https://github.com/r-lib/revdepcheck) package instead. * `system_check()`, `system_output()` have been removed after being deprecated in previous releases. It is recommend to use the [processx](https://processx.r-lib.org/) package instead. * `build_win()` has been removed, after being deprecated in previous releases. * `yesno()` as used in `release()` now has clearer synonyms for "yes" (@mattmalin, #1993) ## Minor improvements and fixes * `check_rhub` gains a new argument `build_args` for arguments passed to `R CMD build`. `...` is now passed to `rhub::check_for_cran()` (@gaborcsardi, @maelle, #2041) * `build_manual()` now fails if the manual fails to build. (#2056) * `test_file()` and `test_coverage_file()` now work with C and C++ files in the src/ directory as well. # devtools 2.0.2 * Two tests are now skipped when run on CRAN, as they fail due to an outdated pandoc and restrictions on writing to the package library respectively. * `load_all()` now accepts 'package' objects, regaining previous behavior in devtools prior to 2.0.0 (#1923) * `test()`, `test_coverage()` and `test_coverage_file()` now set the `TESTTHAT_PKG` environment variable, so it is more consistent with running the tests during `R CMD check` (testthat#787). * `check()` now replaces existing environment variables rather than appending them (#1914). # devtools 2.0.1 This is a minor release mainly fixing bugs which snuck through in the devtools 2.0.0 release. * `install()` now correctly passes the `upgrade` parameter to `remotes::install_deps()` (@Paxanator, #1898). * `install_deps()` now again works from any directory within a package (#1905) * Add a RStudio addin for `test_coverage()`. * All tests which use remote resources are now skipped on CRAN, to avoid spurious failures # devtools 2.0.0 Devtools 2.0.0 is a _major_ release that contains work from the past year and a half, since the major devtools release (1.13.0). This release splits the functionality in **devtools** into a number of smaller packages which are simpler to develop and also easier for other packages to depend on. In particular the following packages have been spun off in what we are calling the 'conscious uncoupling' of **devtools**. * remotes: Installing packages (i.e. `install_github()`). * pkgbuild: Building binary packages (including checking if build tools are available) (i.e. `build()`). * pkgload: Simulating package loading (i.e. `load_all()`). * rcmdcheck: Running R CMD check and reporting the results (i.e. `check()`). * revdepcheck: Running R CMD check on all reverse dependencies, and figuring out what's changed since the last CRAN release (i.e. `revdep_check()`). * sessioninfo: R session info (i.e. `session_info()`). * usethis: Automating package setup (i.e. `use_test()`). devtools will remain the main package developers will interact with when writing R packages; it will just rely on these other packages internally for most of the functionality. ## Breaking changes There have been a number of breaking changes in this release, while this will cause some short term pain for users it will result in a easier to understand API in the future, so we feel the tradeoff is worthwhile. * `devtools::install()` arguments have been changed as follows. - `local` -> `build` - `force_deps` -> `force` - `upgrade_dependencies` -> `upgrade` - `threads` -> Removed, but you can use `Ncpus`, which is passed by `...` to `install.packages()` - `metadata` -> Removed - `out_dir` -> Removed - `skip_if_log_exists` -> Removed * `check()` argument `check_version` has been renamed to `remote` to better describe what tests are disabled (#1811) * `get_path()`, `set_path()`, `add_path()` and `on_path()` have been removed, this functionality is available with `withr::with_path()` (#1796). * The `lang` argument to `spell_check()` was removed, for compatibility with [spelling](https://CRAN.R-project.org/package=spelling) v1.1. (#1715) * The previously deprecated `with_` functions have now been removed. The functionality has been moved to the **withr** package. * `RCMD()`, `clean_source()`, `eval_clean()` and `evalq_clean()` have been removed. These functions never worked terribly well, and have been replaced by the much better functions in **callr**. * `build_win()` has been renamed to `check_win_release()`, `check_win_devel()`, and `check_win_oldrelease()` (#1598). ## Deprecated functions * Infrastructure functions (`use_*`) now use the implementations in **usethis** and the versions in **devtools** are deprecated. If you use these from a package you should switch your package to depend on **usethis** directly instead. * The `revdep_check_*` functions have been deprecated in favor of the **revdepcheck** package. * `system_check()` and `system_output()` have been deprecated in factor of the **processx** package. ## Major changes * All `install_*()` functions are now re-exported from **remotes** rather than being defined in **devtools** * **devtools** now depends on **roxygen2** 6.1.0: this considerably simplifies `devtools::document()` and makes it more consistent with `roxygen2::roxygenise()`. * `test_file()` function added to test one or more files from a package (#1755). * `test_coverage()` function added to provide a helper to compute test coverage using **covr** (#1628). * `test_file()` and `test_coverage_file()` now have RStudio addins (#1650) * `test_file_coverage()` function added to show the test coverage of one or more files from a package. (#1755). * `session_info()` now uses the implementation in the **sessioninfo** package. Packages using `devtools::session_info()` are encouraged to switch to using `sessioninfo::session_info()` instead. * `package_info()` function now re-exported from the **sessioninfo** package. * `check()` now uses **rcmdcheck** to run and parse R CMD check output (#1153). * Code related to simulating package loading has been pulled out into a separate package, **pkgload**. The following functions have been moved to pkgload without a shim: `clean_dll()`, `compile_dll()`, `dev_example()`, `dev_help()`, `dev_meta()`, `find_topic()`, `imports_env()`, `inst()`, `load_code()`, `load_dll()`, `ns_env()`, `parse_ns_file()`, `pkg_env()`. These functions are primarily for internal use. `load_all()` and `unload()` have been moved to pkgload, but **devtools** provides shims since these are commonly used. * `find_rtools()`, `setup_rtools()`, `has_devel()`, `compiler_flags()`, `build()` and `with_debug()` have moved to the new **pkgbuild** package. `build()` and `with_debug()` are re-exported by **devtools** * The `spell_check()` code has been moved into the new **spelling** package and has thereby gained support for vignettes and package wordlists. The **devtools** function now wraps `spelling::spell_check_package()`. ## Minor improvements and fixes * `check_win_*()` now build the package with `manual = TRUE` by default (#1890). * `check()` output now works more nicely with recent changes to **rcmdcheck** (#1874). * `reload()` now reloads loaded but not attached packages as well as attached ones. * Executed `styler::style_pkg()` to update code style (#1851, @amundsenjunior). * `save_all()` helper function wraps `rstudioapi::documentSaveAll()` calls (#1850, @amundsenjunior). * `check()` now allows users to run without `--timings` (#1655) * `update_packages()` better documented to advertise it can be used to update packages installed by any of the `install_*` functions. * `check()` gains a `incoming` option to toggle the CRAN incoming checks. * `build_vignette()` gains a `keep_md` option to allow keeping the intermediate markdown output (#1726) * `remote_sha.github()` now correctly looks up SHA in private repositories (#1827, @renozao). * **devtools** `use_*()` functions now temporarily set the active **usethis** project if given a pkg argument that is not the current directory. This provides backwards compatibility with previous behavior (#1823). * Vignettes are now built in a separate process, and the package is installed before building the vignettes (#1822) * `build_readme()` added to build the README.md from a README.Rmd (#1762) * `build_vignettes()` now has a `clean` and `upgrade` arguments, to control cleaning of intermediate files and upgrading vignette dependencies respectively. (#1770). * `release()` gains an additional question ensuring you updated codemeta.json if one exists (#1774, #1754) * `test()` now sets `useFancyQuotes = FALSE` to better mimic the environment tests are run under with `R CMD check` (#1735). * `test()` no longer passes encoding argument to `testthat::test_dir()` (#1776) * `install_url()` can now install package binaries on windows (#1765) * Fix skipping when installing from a full SHA (#1624) * add `pkgdown::build_site()` wrapper (@kiwiroy, #1777) * add pkgdown site (https://devtools.r-lib.org) (#1779, @jayhesselberth) * `install_version()` can now install current version of CRAN package on Windows and macOS (@jdblischak, #1730) * The CRAN-RELEASE file is now added to .Rbuildignore (#1711) * `check()` and `check_built()` now have an `error_on` argument to specify if they should throw an error on check failures. When run non-interactively this is set to "warnings" unless specified. * `check()` now sets `_R_CHECK_CRAN_INCOMING_REMOTE_` instead of `_R_CHECK_CRAN_INCOMING_`on R versions which support the former option (#1271, #1276, #1702). * Now use cli package to draw rules - they are more aesthetically pleasing and the correct width in the RStudio build pane (#1627). * `release()` has been tweaked to reflect modern submission workflow and to ask questions rather than running code for you (#1632). * `document()`, `load_all()`, `check()`, `build()` and `test()` now automatically save open files when they are run inside the RStudio IDE. (#1576) * New `check_rhub()` function to check packages using . * `run_examples` was mistakenly passing `show` to `pkgload::run_example`, causing it to fail (@amcdavid, #1449) * New `build_manual()` function that produces pdf manual for the package (@twolodzko, #1238). * If you use git `release()` now generates a file called `CRAN-RELEASE` that reminds you to tag the commit that you submitted to CRAN (#1198). * `release()` once again looks for additional release questions in the correct environment (#1434). * `submit_cran()` now checks that you're ready to submit, since this is a potentially expensive operation (#1228) * `check()` defaults to running `document()` only if you have used roxygen previously (#1437). * Signal an error if commas are missing in between remote entries (#1511, @ianmcook). * `build_vignettes()` gains a quiet argument (#1543). * `source_gist()` works once more when there is only a single file in the gist (#1266). * In order to not run test helpers in `document()`, the `helpers` argument of  `load_all()` is set to `FALSE` (@nbenn, #1669) * The `my_unzip()` function is now able to use the `utils::unzip` fallback when R is compiled from source with no *unzip* package present (@theGreatWhiteShark, #1678) * If the **foghorn** package is installed, `release()` displays the results of the CRAN checks (#1672, @fmichonneau). # devtools 1.13.5 * Fix two test errors related to GitHub rate limiting and mocking base functions. # devtools 1.13.4 * Fix test errors for upcoming testthat release. # devtools 1.13.3 * Workaround a change in how Rcpp::compileAttributes stores the symbol names that broke tests. # devtools 1.13.2 * Workaround a regression in Rcpp::compileAttributes. Add trimws implementation for R 3.1 support. # devtools 1.13.1 * Bugfix for installing from git remote and not passing git2r credentials (@james-atkins, #1498) * Bugfix for installation of dependencies of dependencies (@jimhester, #1409). * Bugfix for installation of dependencies in CRAN-like repositories such as those created by drat (@jimhester, #1243, #1339). * `load_all()` no longer automatically creates a description for you. * `use_test()` template no longer includes useless comments (#1349) * Fix `test()` compatibility with testthat versions 1.0.2 (#1503). * Fix `install_version()`, `install_bitbucket()`, `install_local()`, `install_url()`, `install_svn()`, `install_bioc()` gain `quiet` arguments and properly pass them to internal functions. (#1502) # devtools 1.13.0 ## New Features * `spell_check` gains a `dict` argument to set a custom language or dictionary * `release()` now checks documentation for spelling errors by default. * New `use_gpl3_license()` sets the license field in `DESCRIPTION` and includes a copy of the license in `LICENSE`. ## Revdep check improvements * Various minor improvements around checking of reverse dependencies (#1284, @krlmlr). All packages involved are listed at the start, the whole process is now more resilient against package installation failures. * `revdep_check()` and `revdep_check_resume()` gain a skip argument which takes a character vector of packages to skip. * `revdep_check()` and `check_cran()` gain a `quiet_check` argument. You can use `quiet_check = FALSE` to see the actual text of R CMD check as it runs (not recommending with multiple threads). * `revdep_check_resume()` now takes `...` which can be used to override settings from `revdep_check()`. For debugging a problem with package checks, try `revdep_check(threads = 1, quiet_check = FALSE)` * `revdep_check()` collects timing information in `timing.md` (#1319, @krlmlr). * Package names and examples are sorted in case-insensitive C collation (#1322, @krlmlr). * `use_revdep()` adds `.gitignore` entry for check database (#1321, @krlmlr). * Own package is installed in temporary library for revdep checking (#1338, @krlmlr). * Automated revdep check e-mails now can use the new `my_version` and `you_cant_install` variables. The e-mail template has been updated to use these variables (#1285, @krlmlr). * Installation failures are logged during revdep checking, by default in `revdep/install`. Once an installation has failed, it is not attempted a second time (#1300, @krlmlr). * Print summary table in README.md and problems.md (#1284, @krlmlr). * Revdep check improvements (#1284) ## Bug fixes and minor improvements * Handle case of un-installed package being passed to session_info (#1281). * Using authentication to access Github package name. (#1262, @eriknil). * `spell_check()` checks for hunspell before running (#1475, @jimvine). * `add_desc_package()` checks for package dependencies correctly (#1463, @thomasp85). * Remove deprecated `args` argument from `install_git()` to allow passthrough to `install` (#1373, @ReportMort). * added a `quiet` argument to `install_bitbucket()`, with a default value of `FALSE` (fixes issue #1345, @plantarum). * `update_packages()` allows for override of interactive prompt (#1260, @pkq). * `use_test()` template no longer includes useless comments (#1349) * Add encoding support in `test_dir()` call by adding reference to pkg$encoding (#1306, @hansharhoff) * Parse valid Git remote URLs that lack trailing `.git`, e.g. GitHub browser URLs (#1253, @jennybc). * Add a `check_bioconductor()` internal function to automatically install BiocInstaller() if it is not installed and the user wants to do so. * Improve Git integration. `use_git_ignore()` and `use_git_config()` gain `quiet` argument, tests work without setting `user.name` and `user.email` Git configuration settings (#1320, @krlmlr). * Improve Git status checks used in `release()` (#1205, @krlmlr). * Improved handling of local `file://` repositories in `install()` (#1284, @krlmlr). * `setup()` and `create()` gain new `quiet` argument (#1284, @krlmlr). * Avoid unnecessary query of `available_packages()` (#1269, @krlmlr). * Add cache setting to AppVeyor template (#1290, @krlmlr). * Fix AppVeyor test by manually installing `curl` (#1301). * `install(dependencies = FALSE)` doesn't query the available packages anymore (@krlmlr, #1269). * `use_travis()` now opens a webpage in your browser to more easily activate a repo. * `use_readme_rmd()` and `use_readme()` share a common template with sections for package overview, GitHub installation (if applicable), and an example (@jennybc, #1287). * `test()` doesn't load helpers twice anymore (@krlmlr, #1256). * Fix auto download method selection for `install_github()` on R 3.1 which lacks "libcurl" in `capabilities()`. (@kiwiroy, #1244) * Fix removal of vignette files by not trying to remove files twice anymore (#1291) * add timestamp to messages in `build_win()` (@achubaty, #1367). # devtools 1.12.0 ## New features * New `install_bioc()` function and bioc remote to install Bioconductor packages from their SVN repository. * `install_dev_deps()` gets everything you need to start development on source package - it installs all dependencies, and roxygen2 (#1193). * `use_dev_version()` automates the process of switching from a release version number by tweaking the `DESCRIPTION`, adding a heading to `NEWS.md` (if present), and checking into git (if you use it) (#1076.) * `use_github()` accepts a host argument, similar to `install_github()` (@ijlyttle, #1101) ## Bug fixes and minor improvements * Update with Rtools-3.4 information, (@jimhester) * devtools now uses https to access the RStudio CRAN mirror if it will work on your system (#1059) * Handle case when a GitHub request returns a non-JSON error response. (@jimhester, #1204, #1211) * Suggested packages, including those specified as `Remotes:` are now installed after package installation. This allows you to use circular `Remotes:` dependencies for two related packages as long as one of the dependencies is a Suggested package. (@jimhester, #1184, hadley/dplyr#1809) * bug fix for installation of binary packages on windows, they must be installed directly from a zip file. (@jimhester, #1191, #1192) * `build_vignette()` will now only install the "VignetteBuilder" if it's not present, not try and upgrade it if it is (#1139). * `clean_dll()` Only removes package_name.def files and now operates recursively. (@jimhester, #1175, #1159, #1161) * `check_man()` now prints a message if no problems are found (#1187). * `install_*` functions and `update_packages()` refactored to allow updating of packages installed using any of the install methods. (@jimhester, #1067) * `install_github()` now uses `https://api.github.com` as the host argument, so users can specify 'http:' or other protocols if needed. (@jimhester, #1131, #1200) * `load_all()` runs package hooks before sourcing test helper files allowing test helper to make use of objects created when a package is loaded or attached. (@imanuelcostigan, #1146) * `revdep_check()` will now create the `revdep/` directory if it does not already exist (#1178). * `source_gist()` gains a `filename` argument to specify a particular file to source from a GitHub gist. (@ateucher, #1172) * Add a default codecov.yml file to turn off commenting with `use_coverage()` (@jimhester, #1188) * Bug fix for 'nchar(text) : invalid multibyte string' errors when running `write_dcf()` on DESCRIPTION files with non-ASCII encodings (#1224, @jimhester). # devtools 1.11.1 * Bug fix in `search_path_for_rtools()` using the gcc-4.9.3 toolchain when there is no rtools setting in the windows registry. (@jimhester, #1155) # devtools 1.11.0 ## Infrastructure helpers * `create_description()` now sets `Encoding: UTF-8`. This helps non-English package authors (#1123). * All `use_` function have been overhauled to be more consistent, particularly around notification. Most functions now also ask to overwrite if a file already exists (#1074). * `use_coverage()` now adds covr to "Suggests", rather than recommending you install it explicitly in `.travis.yml`. * `use_cran_badge()` now uses HTTPS URL (@krlmlr, #1124). * `use_github()` now confirms that you've picked a good title and description (#1092) and prints the url of the repo (#1063). * `use_news()`, and `use_test()` open the files in RStudio (if you're using it and have the rstudioapi package installed). * `use_testthat()` tells you what it's doing (#1056). * `use_travis()` generates a template compatible with the newest R-travis. * `use_readme_md()` creates a basic `README.md` template (#1064). * `use_revdep()` has an updated template for the new revdep check system (#1090, @krlmlr). * Removed the deprecated `use_coveralls()`, `add_rstudio_project()`, `add_test_infrastructure()`, and `add_travis()`. * Deprecated `build_github_devtools()` has been removed. ## Checks and release() * `check()` now always succeeds (instead of throwing an error when `R CMD check` finds an `ERROR`), returning an object that summarises the check failures. * `check()` gains `run_dont_test` and `manual` arguments to control whether or not `\donttest{}` tests are tested, or manuals are built. This defaults to `FALSE`, but `release()` runs check with it set to `TRUE` (#1071; #1087, @krlmlr). * The `cleanup` argument to `check()` is deprecated: it now always returns the path to the check directory. * `check_built()` allows you to run `R CMD check` on an already built package. * `check_cran()` suppresses X11 with `DISPLAY = ""`. * `release()` has been tweaked to improve the order of the questions, and to ensure that you're ok with problems. It warns if both `inst/NEWS.Rd` and `NEWS.md` exist (@krlmlr, #1135), doesn't throw error if Git head is detached (@krlmlr, #1136). * `release()` gains an `args` argument to control build options, e.g. to allow passing `args = "--compact-vignettes=both"` for packages with heavy PDF vignettes (@krlmlr, #1077). * `system_check()` gains new arguments `path` to controls the working directory of the command, and `throw` to control whether or not it throws an error on command failure. `env` has been renamed to the more explicit `env_vars`. ## Revdep checks `revdep_check()` has been overhauled. All `revdep_` functions now work like other devtools functions, taking a path to the package as the first argument. `revdep_check()` now saves its results to disk as `check/check.rds`, and the other `revdep()` functions read from that cache. This also allows you to resume a partial run with `revdep_check_resume()`. This should be a big time saver if something goes unexpected wrong in the middle of the checks. You can blow away the cache and start afresh with `revdep_check_reset()`. `revdep_check_save_summary()` now creates `README.md` to save one level of clicking in github. It also creates a `problems.md` that contains only results for only packages that had warnings or errors. Each problem is limited to at most 25 lines of output - this avoids lengthy output for failing examples. `revdep_check_print_problems()` prints a bulleted list of problems, suitable for inclusion in your `cran-comments.md`. Summary results are reported as they come in, every then messages you'll get a message giving elapsed and estimated remaining time. An experimental `revdep_email()` emails individual maintainers with their `R CMD check` summary results (#1014). See testthat and dplyr for example usage. There were a handful of smaller fixes: * `revdep_check()` doesn't complain about missing `git2r` package anymore (#1068, @krlmlr). * Package index caches for `revdep_check()` now time out after 30 minutes. * `revdep_check_save_logs()` has been removed - it is just not that useful. * `revdep_check_summary()` has been removed - it never should have been part of the exported API. ## Other improvements * Devtools now uses new gcc toolchain on windows, if installed (@jimhester). * `install_git()` now allows you to pass credentials to git2r to specify specific ssh credentials (@onlymee, #982) * `load_all()` now sources all test helpers if you use testthat. This makes it much easier to interactively run tests (#1125). `load_all()` also correctly handles `unix` and `windows` subdirectories within `R` (@gaborcsardi, #1102) * `build_win()` defaults to only R-devel, since this is most commonly what you want. * Help shims now inform you that you're using development documentation (#1049). * `git_sha1()` Fix fetching the latest git commit so that it also works for shallow git clones, i.e. git clones which make use of depth. (#1048, #1046, @nparley) # devtools 1.10.0 ## New features * `curl`, `evaluate`, `roxygen2` and `rversions` have been moved from Imports to Suggests to lighten the dependency load of devtools. If you run a function that needs one of the packages, you'll prompted to install it (#962, @jimhester). * Devtools uses a new strategy for detecting RTools on windows: it now only looks for Rtools if you need to `load_all()` or `build()` a package with compiled code. This should make it easier to work with devtools if you're developing pure R packages (#947). * `package_file()` lets you find files inside a package. It starts by finding the root directory of the package (i.e. the directory that contains `DESCRIPTION`) (#985). * `use_news_md()` adds a basic `NEWS.md` template (#957). * `use_mit_license()` writes the necessary infrastructure to declare and release an R package under the MIT license in a CRAN-compliant way. (#995, @kevinushey) * `check(cran = TRUE)` adds `--run-donttest` since you do need to test code in `\dontest()` for CRAN submission (#1002). ## Package installation * `install()` installs packages specified in the `Additional_repositories` field, such as drat repositories. (#907, #1028, @jimhester). It correctly installs missing dependencies (#1013, @gaborcsardi). If called on a Bioconductor package, include the Bioconductor repositories if they are not already set (#895, @jimhester). * `install()` gains a `metadata` argument which lets you add extra fields to the `DESCRIPTION` on install. (#1027, @rmflight) * `install_github()` and `install_git()` only downloads and installs the package if the remote SHA1 reference differs from the currently installed reference (#903, @jimhester). * `install_local()` captures git and github information and stores it in the `DESCRIPTION` (#1027, @rmflight). * `install_version()` is more robust when handling multiple repos (#943, #1030, @jimhester). * Bugfix for `Remotes: ` feature that prevented it from working if devtools was not attached as is done in travis-r (#936, @jimhester). ## Bug fixes and minor improvements * `check_dev_versions()` checks only package dependencies (#983). * `check_man()` replaces `check_doc()` (since most other functions are named after the corresponding directory). `check_doc()` will hang around as an alias for the forseeable future (#958). * `create()` produces a dummy namespace will fake comment so roxygen2 will overwrite silently (#1016). * `create()` and `setup()` are more permissive -- they now accept a path to either a new directory or empty directory. (#966, @kevinushey) * `document()` now only runs `update_collate()` once. * `load_all()` resolves a longstanding lazy load database corruption issue when reloading packages which define S3 methods on generics from base or other packages (#1001, @jimhester). * `release_checks()` gains two new checks: * `check_vignette_titles()` checks that your vignette titles aren't the default "Vignette Title" (#960, @jennybc). * `check_news_md()` checks that `NEWS.md` isn't in your `.Rbuildignore` (since it's now supported by CRAN, #1042). * `revdep_check()`: * More verbose about which package is installed (#926, @krlmlr) * Verifies the integrity of already downloaded package archives (#930, @krlmlr) * Is now more tolerant of errors when retrieving the summary for a checked package (#929, @krlmlr). * When `ncpus > 1`, it includes the package name for when so you know which package has failed and can start looking at the output without needing to wait for all packages to finish (@mattdowle). * Uses proper repository when `BiocInstaller::useDevel(TRUE)` (#937, @jimhester). * Shimmed `system.file()` now respects `mustWork = TRUE` and throws an error if the file does not exist (#1034). * `use_appveyor()` template now creates `failure.zip` artifact instead of polluting the logs with `R CMD check` output (#1017, @krlmlr, @HenrikBengtsson). * `use_cran_comments()` template has been improved (#1038). * `use_data()` now warns when trying to save the same object twice, and stops if there is no object to save (#948, @krlmlr). * `use_revdep_check()` no longer includes `revdep_check_save_logs` in default template. I found I never used the logs and they just cluttered up the package directory (#1003). * `with_*()` functions have moved into the withr package, and devtools functions have been deprecated (#925, @jimhester). # devtools 1.9.1 * Avoid importing heavy dependencies to speed up loading (#830, @krlmlr). * Remove explicit `library(testthat)` call in `test()` (#798, @krlmlr). * `as.package()` and `load_all()` gain new argument `create`. Like other functions with a `pkg` argument, `load_all()` looks for a `DESCRIPTION` file in parent directories - if `create = TRUE` it will be automatically created if there's a `R/` or `data/` directory (#852, @krlmlr). * `build_vignettes()` gains dependencies argument (#825, @krlmlr). * `build_win()` now uses `curl` instead of `RCurl` for ftp upload. * `build_win()` asks for consent to receive e-mail at maintainer address in interactive mode (#800, @krlmlr). * `check()` now uses a better strategy when `cran = TRUE`. Instead of attempting to simulate `--as-cran` behaviour by turning on certain env vars, it now uses `--as-cran` and turns off problematic checks with env vars (#866). The problematic `cran_env_vars()` function has been removed. * `find_rtools()` now looks for registry keys in both HKCU (user) and HKLM (admin) locations (@Kevin-Jin, #844) * `install()` can now install dependencies from remote repositories by specifying them as `Remotes` in the `DESCRIPTION` file (#902, @jimhester). See `vignette("dependencies")` for more details. * `install_*()` detects if called on a Bioconductor package and if so, automatically includes the Bioconductor repositories if needed (#895, @jimhester). * `install_deps()` now automatically upgrades out of date dependencies. This is typically what you want when you're working on a development version of a package. To suppress this behaviour, set `upgrade_dependencies = FALSE` (#863). `install_deps()` is more careful with `...` - this means additional arguments to `install_*` are more likely to work (#870). * `install_gitorious()` has been removed since gitorious no longer exists (#913). * `load_all()` no longer fails if a `useDynLib()` entry in the NAMESPACE is incorrect. This should make it easy to recover from an incorrect `@useDynLib`, because re-documenting() should now succeed. * `release()` works for packages not located at root of git repository (#845, #846, @mbjones). * `revdep_check()` now installs _suggested_ packages by default (#808), and sets `NOT_CRAN` env var to `false` (#809). This makes testing more similar to CRAN so that more packages should pass cleanly. It also sets `RGL_USE_NULL` to `true` to stop rgl windows from popping up during testing (#897). It also downloads all source packages at the beginning - this makes life a bit easier if you're on a flaky internet connection (#906). * New `uninstall()` removes installed package (#820, @krlmlr). * Add `use_coverage()` function to add codecov.io or coveralls.io to a project, deprecate `use_coveralls()` (@jimhester, #822, #818). * `use_cran_badge()` uses canonical url form preferred by CRAN. * `use_data()` also works with data from the parent frame (#829, @krlmlr). * `use_git_hook()` now creates `.git/hooks` if needed (#888) * GitHub integration extended: `use_github()` gains a `protocol` argument (ssh or https), populates URL and BugReports fields of DESCRIPTION (only if non-existent or empty), pushes to the newly created GitHub repo, and sets a remote tracking branch. `use_github_links()` is a new exported function. `dr_github()` diagnoses more possible problems. (#642, @jennybc). * `use_travis()`: Default travis script leaves notifications on default settings. * `uses_testthat()` and `check_failures()` are now exported (#824, #839, @krlmlr). * `use_readme_rmd()` uses `uses_git()` correctly (#793). * `with_debug()` now uses `with_makevars()` rather than `with_env()`, because R reads compilation variables from the Makevars rather than the environment (@jimhester, #788). * Properly reset library path after `with_lib()` (#836, @krlmlr). * `remove_s4classes()` performs a topological sort of the classes (#848, #849, @famuvie). * `load_all()` warns (instead of failing) if importing symbols, methods, or classes from `NAMESPACE` fails (@krlmlr, #921). # devtools 1.8.0 ## Helpers * New `dr_devtools()` runs some common diagnostics: are you using the latest version of R and devtools? It is run automatically by `release()` (#592). * `use_code_of_conduct()` adds a contributor code of conduct from http://contributor-covenant.org. (#729) * `use_coveralls()` allows you to easily add test coverage with coveralls (@jimhester, #680, #681). * `use_git()` sets up a package to use git, initialising the repo and checking the existing files. * `use_test()` adds a new test file (#769, @krlmlr). * New `use_cran_badge()` adds a CRAN status badge that you can copy into a README file. Green indicates package is on CRAN. Packages not yet submitted or accepted to CRAN get a red badge. ## Package installation and info * `build_vignettes()` automatically installs the VignetteBuilder package, if necessary (#736). * `install()` and `install_deps()` gain a `...` argument, so additional arguments can be passed to `utils::install.packages()` (@jimhester, #712). `install_svn()` optionally accepts a revision (@lev-kuznetsov, #739). `install_version()` now knows how to look in multiple repos (#721). * `package_deps()` (and `dev_package_deps()`) determines all recursive dependencies and whether or not they're up-to-date (#663). Use `update(package_deps("xyz"))` to update out of date dependencies. This code is used in `install_deps()` and `revdep_check()` - it's slightly more aggressive than previous code (i.e. it forces you to use the latest version), which should avoid problems when you go to submit to CRAN. * New `update_packages()` will install a package (and its dependencies) only if they are missing or out of date (#675). * `session_info()` can now take a vector of package names, in which case it will print the version of those packages and their dependencies (#664). ## Git and github * Devtools now uses the git2r package to inspect git properties and install remote git packages with `install_git()`. This should be considerably more reliable than the previous strategy which involves calling the command line `git` client. It has two small downsides: `install_git()` no longer accepts additional `args`, and must do a deep clone when installing. * `dr_github()` checks for common problems with git/github setup (#643). * If you use git, `release()` now warns you if you have uncommited changes, or if you've forgotten to synchronise with the remote (#691). * `install_github()` warns if repository contains submodules (@ashander, #751). ## Bug fixes and minor improvements * Previously, devtools ran all external R processes with `R --vanilla`. Now it only suppresses user profiles, and constructs a custom `.Rprofile` to override the default. Currently, this `.Rprofile` sets up the `repos` option. Among others, this enables the cyclic dependency check in `devtools::release` (#602, @krlmlr). * `R_BROWSER` and `R_PDFVIEWER` environment variables are set to "false" to suppress random windows opening during checks. * Devtools correctly identifies RTools 3.1 and 3.2 (#738), and preserves continuation lines in the `DESCRIPTION` (#709). * `dev_help()` now uses `normalizePath()`. Hopefully this will make it more likely to work if you're on windows and have a space in the path. * `lint()` gains a `cache` argument (@jimhester, #708). * Fixed namespace issues related to `stats::setNames()` (#734, #772) and `utils::unzip()` (#761, @robertzk). * `release()` now reminds you to check the existing CRAN check results page (#613) and shows file size before uploading to CRAN (#683, @krlmlr). * `RCMD()` and `system_check()` are now exported so they can be used by other packages. (@jimhester, #699). * `revdep_check()` creates directories if needed (#759). * `system_check()` combines arguments with ` `, not `, `. (#753) * `test()` gains an `...` argument so that additional arguments can be passed to `testthat::test_dir` (@jimhester, #747) * `use_travis()` now suggests you link to the svg icon since that looks a little sharper. Default template sets `CRAN: http://cran.rstudio.com/` to enable the cyclic dependency check. * `NOT_CRAN` envvar no longer overrides externally set variable. * `check(check_version = TRUE)` also checks spelling of the `DESCRIPTION`; if no spell checker is installed, a warning is given (#784, @krlmlr). # devtools 1.7.0 ## Improve reverse dependency checking Devtools now supports a new and improved style of revdep checking with `use_revdep()`. This creates a new directory called `revdep` which contains a `check.R` template. Run this template to check all reverse dependencies, and save summarised results to `check/summary.md`. You can then check this file into git, making it much easier to track how reverse dependency results change between versions. The documentation for `revdep_check()` is much improved, and should be more useful (#635) I recommend that you specify a library to use when checking with `options("devtools.revdep.libpath")`. (This should be a directory that already exists). This should be difference from your default library to keep the revdep environment isolated from your development environment. I've also tweaked the output of `revdep_maintainers()` so it's easier to copy and paste into an email (#634). This makes life a little easier pre-release. ## New helpers * `lint()` runs `lintr::lint_package()` to check style consistency and errors in a package. (@jimhester, #694) * `use_appveyor()` sets up a package for testing with AppVeyor (@krlmlr, #549). * `use_cran_comments()` creates a `cran-comments.md` template and adds it to `.Rbuildignore` to help with CRAN submissions. (#661) * `use_git_hook()` allows you to easily add a git hook to a package. * `use_readme_rmd()` sets up a template to generate a `README.md` from a `README.Rmd` with knitr. ## Minor improvements * Deprecated `doc_clean` argument to `check()` has been removed. * Initial package version in `create()` is now `0.0.0.9000` (#632). `create()` and `create_description()` checks that the package name is valid (#610). * `load_all()` runs `roxygen2::update_collate()` before loading code. This ensures that files are sourced in the way you expect, as defined by roxygen `@include` tags. If you don't have any `@include` tags, the collate will be not be touched (#623). * `session_info()` gains `include_base` argument to also display loaded/attached base packages (#646). * `release()` no longer asks if you've read the CRAN policies since the CRAN submission process now asks the same question (#692). `release(check = TRUE)` now runs some additional custom checks. These include: * Checking that you don't depend on a development version of a package. * Checking that the version number has exactly three components (#633). `release()` now builds packages without the `--no-manual` switch, both for checking and for actually building the release package (#603, @krlmlr). `build()` gains an additional argument `manual`, defaulting to `FALSE`, and `check()` gains `...` unmodified to `build()`. * `use_travis()` now sets an environment variable so that any WARNING will also cause the build to fail (#570). * `with_debug()` and `compiler_flags()` set `CFLAGS` etc instead of `PKG_CFLAGS`. `PKG_*` are for packages to use, the raw values are for users to set. (According to http://cran.rstudio.com/doc/manuals/r-devel/R-exts.html#Using-Makevars) * New `setup()` works like `create()` but assumes an existing, not necessarily empty, directory (#627, @krlmlr). ## Bug fixes * When installing a pull request, `install_github()` now uses the repository associated with the pull request's branch (and not the repository of the user who created the pull request) (#658, @krlmlr). * `missing_s3()` works once again (#672) * Fixed scoping issues with `unzip()`. * `load_code()` now executes the package's code with the package's root as working directory, just like `R CMD build` et al. (#640, @krlmlr). # devtools 1.6.1 * Don't set non-portable compiler flags on Solaris. * The file `template.Rproj` is now correctly installed and the function `use_rstudio` works as it should. (#595, @hmalmedal) * The function `use_rcpp` will now create the file `src/.gitignore` with the correct wildcards. (@hmalmedal) * The functions `test`, `document`, `load_all`, `build`, `check` and any function that applies to some package directory will work from subdirectories of a package (like the "R" or "inst/tests" directories). (#616, @robertzk) # devtools 1.6 ## Tool templates and `create()` * `create()` no longer generates `man/` directory - roxygen2 now does this automatically. It also no longer generates an package-level doc template. If you want this, use `use_package_doc()`. It also makes a dummy namespace so that you can build & reload without running `document()` first. * New `use_data()` makes it easy to include data in a package, either in `data/` (for exported datasets) or in `R/sysdata.rda` (for internal data). (#542) * New `use_data_raw()` creates `data-raw/` directory for reproducible generation of `data/` files (#541). * New `use_package()` allows you to set dependencies (#559). * New `use_package_doc()` sets up an Roxygen template for package-level docs. * New `use_rcpp()` sets up a package to use Rcpp. * `use_travis()` now figures out your github username and repo so it can construct the markdown for the build image. (#546) * New `use_vignette()` creates a draft vignette using Rmarkdown (#572). * renamed `add_rstudio_project()` to `use_rstudio()`, `add_travis()` to `use_travis()`, `add_build_ignore()` to `use_build_ignore()`, and `add_test_infrastructure()` to `use_testthat()` (old functions are aliased to new) ## The release process * You can add arbitrary extra questions to `release()` by defining a function `release_questions()` in your package. Your `release_questions()` should return a character vector of questions to ask (#451). * `release()` uses new CRAN submission process, as implemented by `submit_cran()` (#430). ## Package installation * All `install_*` now use the same code and store much useful metadata. Currently only `session_info()` takes advantage of this information, but it will allow the development of future tools like generic update functions. * Vignettes are no longer installed by default because they potentially require all suggested packages to also be installed. Use `build_vignettes = TRUE` to force building and to install all suggested packages (#573). * `install_bitbucket()` has been bought into alignment with `install_github()`: this means you can now specify repos with the compact `username/repo@ref` syntax. The `username` is now deprecated. * `install_git()` has been simplified and many of the arguments have changed names for consistency with metadata for other package installs. * `install_github()` has been considerably improved: * `username` is deprecated - please include the user in the repo name: `rstudio/shiny`, `hadley/devtools` etc. * `dependencies = TRUE` is no longer forced (regression in 1.5) (@krlmlr, #462). * Deprecated parameters `auth_user`, `branch`, `pull` and `password` have all been removed. * New `host` argument which allows you to install packages from github enterprise (#410, #506). * The GitHub API is used to download archive file (@krlmlr, #466) - this makes it less likely to break in the future. * To download a specified pull request, use `ref = github_pull(...)` (@krlmlr, #509). To install the latest release, use `"user/repo@*release"` or `ref = github_release()` (@krlmlr, #350). * `install_gitorious()` has been bought into alignment with `install_github()`: this means you can now specify repos with the compact `username/repo@ref` syntax. You must now always supply user (project) name and repo. * `install_svn()` lets you install an R package from a subversion repository (assuming you have subversion installed). * `decompress()` and hence `install_url()` now work when the downloaded file decompresses without additional top-level directory (#537). ## Other minor improvements and bug fixes * If you're using RStudio, and you're trying to build a binary package without the necessary build tools, RStudio will prompt to download and install the right thing. (#488) * Commands are no longer run with `LC_ALL=C` - this no longer seems necessary (#507). * `build(binary = TRUE)` creates an even-more-temporary package library avoid conflicts (#557). * `check_dir()` no longer fails on UNC paths (#522). * `check_devtools()` also checks for dependencies on development versions of packages (#534). * `load_all()` no longer fails on partial loading of a package containing S4 or RC classes (#577). * On windows, `find_rtools()` is now run on package load, not package attach. * `help()`, `?`, and `system.file()` are now made available when a package is loaded with `load_all()`, even if the devtools package isn't attached. * `httr` 0.3 required (@krlmlr, #466). * `load_all()` no longer gives an error when objects listed as exports are missing. * Shim added for `library.dynam.unload()`. * `loaded_packages()` now returns package name and path it was loaded from. (#486) * The `parenvs()` function has been removed from devtools, because is now in the pryr package. * `missing_s3()` uses a better heuristic for determining if a function is a S3 method (#393). * New `session_info()` provides useful information about your R session. It's a little more focussed than `sessionInfo()` and includes where packages where installed from (#526). * `rstudioapi` package moved from suggests to imports, since it's always needed (it's job is to figure out if rstudio is available, #458) * Implemented own version `utils::unzip()` that throws error if command fails and doesn't print unneeded messages on non-Windows platforms (#540). * Wrote own version of `write.dcf()` that doesn't butcher whitespace and fieldnames. ## Removed functionality * The `fresh` argument to `test()` has been removed - this is best done by the editor since it can run the tests in a completely clean environment by starting a new R session. * `compile_dll()` can now build packages located in R's `tempdir()` directory (@richfitz, #531). # devtools 1.5 Four new functions make it easier to add useful infrastructure to packages: * `add_test_infrastructure()` will create test infrastructure for a new package. It is called automatically from `test()` if no test directories are found, the session is interactive and you agree. * `add_rstudio_project()` adds an RStudio project file to your package. `create()` gains an `rstudio` argument which will automatically create an RStudio project in the package directory. It defaults to `TRUE`: if you don't use RStudio, just delete the file. * `add_travis()` adds a basic travis template to your package. `.travis.yml` is automatically added to `.Rbuildignore` to avoid including it in the built package. * `add_build_ignore()` makes it easy to add files to `.Rbuildignore`, correctly escaping special characters Two dependencies were incremented: * devtools requires at least R version 3.0.2. * `document()` requires at least roxygen2 version 3.0.0. ## Minor improvements * `build_win()` now builds R-release and R-devel by default (@krlmlr, #438). It also gains parameter `args`, which is passed on to `build()` (@krlmlr, #421). * `check_doc()` now runs `document()` automatically. * `install()` gains `thread` argument which allows you to install multiple packages in parallel (@mllg, #401). `threads` argument to `check_cran()` now defaults to `getOption("Ncpus")` * `install_deps(deps = T)` no longer installs all dependencies of dependencies (#369). * `install_github()` now prefers personal access tokens supplied to `auth_token` rather than passwords (#418, @jeroenooms). * `install_github()` now defaults to `dependencies = TRUE` so you definitely get all the packages you need to build from source. * devtools supplies its own version of `system.file()` so that when the function is called from the R console, it will have special behavior for packages loaded with devtools. * devtools supplies its own version of `help` and `?`, which will search devtools-loaded packages as well as normally-loaded packages. ## Bug fixes * `check_devtools()` no longer called by `check()` because the relevant functionality is now included in `R CMD CHECK` and it was causing false positives (#446). * `install_deps(TRUE)` now includes packages listed in `VignetteBuilder` (#396) * `build()` no longer checks for `pdflatex` when building vignettes, as many modern vignettes don't need it (#398). It also uses `--no-build-vignettes` for >3.0.0 compatibility (#391). * `release()` does a better job of opening your email client if you're inside of RStudio (#433). * `check()` now correctly reports the location of the `R CMD check` output when called with a custom `check_dir`. (Thanks to @brentonk) * `check_cran()` records check times for each package tested. * Improved default `DESCRIPTION` file created by `create_description()`. (Thanks to @ncarchedi, #428) * Fixed bug in `install_github()` that prevented installing a pull request by supplying `repo = "username/repo#pull"`. (#388) * explicitly specify user agent when querying user name and ref for pull request in `install_github`. (Thanks to Kirill Müller, #405) * `install_github()` now removes blank lines found in a package `DESCRIPTION` file, protecting users from the vague `error: contains a blank line` error. (#394) * `with_options()` now works, instead of throwing an error (Thanks to @krlmlr, #434) # devtools 1.4.1 * Fixed bug in `wd()` when `path` was omitted. (#374) * Fixed bug in `dev_help()` that prevented it from working when not using RStudio. * `source_gist()` respects new github policy by sending user agent (hadley/devtools) * `install_github()` now takes repo names of the form `[username/]repo[/subdir][@ref|#pull]` - this is now the recommended form to specify username, subdir, ref and/or pull for install_github. (Thanks to Kirill Müller, #376) # devtools 1.4 ## Installation improvements * `install()` now respects the global option `keep.source.pkgs`. * `install()` gains a `build_vignettes` which defaults to TRUE, and ensures that vignettes are built even when doing a local install. It does this by forcing `local = FALSE` if the package has vignettes, so `R CMD build` can follow the usual process. (#344) * `install_github()` now takes repo names of the form `username/repo` - this is now the recommended form for install_github if your username is not hadley ;) * `install_github()` now adds details on the source of the installed package (e.g. repository, SHA1, etc.) to the package DESCRIPTION file. (Thanks to JJ Allaire) * Adjusted `install_version()` to new meta data structure on CRAN. (Thanks to Kornelius Rohmeyer) * Fixed bug so that `install_version()` works with version numbers that contain hyphens. (Thanks to Kornelius Rohmeyer) * `install_deps()` is now exported, making it easier to install the dependencies of a package. ## Other minor improvements * `build(binary = TRUE)` now no longer installs the package as a side-effect. (#335) * `build_github_devtools()` is a new function which makes it easy for Windows users to upgrade to the development version of devtools. * `create_description()` does a better job of combining defaults and user specified options. (#332) * `install()` also installs the dependencies that do not have the required versions; besides, the argument `dependencies` now works like `install.packages()` (in previous versions, it was essentially `c("Depends", "Imports", "LinkingTo")`) (thanks, Yihui Xie, #355) * `check()` and `check_cran()` gain new `check_dir` argument to control where checking takes place (#337) * `check_devtools()` no longer incorrectly complains about a `vignettes/` directory * Decompression of zip files now respects `getOption("unzip")` (#326) * `dev_help` will now use the RStudio help pane, if you're using a recent version of RStudio (#322) * Release is now a little bit smarter: if it's a new package, it'll ask you to read and agree to the CRAN policies; it will only ask about dependencies if it has any. * `source_url()` (and `source_gist()`) accept SHA1 prefixes. * `source_gist()` uses the GitHub API to reliably locate the raw gist. Additionally it now only attempts to source files with `.R` or `.r` extensions, and gains a `quiet` argument. (#348) * Safer installation of source packages, which were previously extracted directly into the temp directory; this could be a problem if directory names collide. Instead, source packages are now extracted into unique subdirectories. # devtools 1.3 ## Changes to best practices * The documentation for many devtools functions has been considerably expanded, aiming to give the novice package developer more hints about what they should be doing and why. * `load_all()` now defaults to `reset = TRUE` so that changes to the NAMESPACE etc. are incorporated. This makes it slightly slower (but hopefully not noticeably so), and generally more accurate, and a better simulation of the install + restart + reload cycle. * `test()` now looks in both `inst/test` and `tests/testthat` for unit tests. It is recommended to use `tests/testthat` because it allows users to choose whether or not to install test. If you move your tests from `inst/tests` to `tests/testthat`, you'll also need to change `tests/test-all.R` to run `test_check()` instead of `test_package()`. This change requires testthat 0.8 which will be available on CRAN shortly. * New devtools guarantee: if because of a devtools bug, a CRAN maintainer yells at you, I'll send you a hand-written apology note. Just forward me the email and your address. ## New features * New `install_local()` function for installing local package files (as zip, tar, tgz, etc.) (Suggested by landroni) * `parse_deps()`, which parses R's package dependency strings, is now exported. * All package and user events (e.g. load, unload, attach and detach) are now called in the correct place. ## Minor improvements and bug fixes * `build()` gains `args` parameter allowing you to add additional arbitrary arguments, and `check()` gains similar `build_args` parameter. * `install_git` gains `git_arg` parameter allowing you to add arbitrary additional arguments. * Files are now loaded in a way that preserves srcreferences - this means that you will get much better locations on error messages, which should considerably aid debugging. * Fixed bug in `build_vignettes()` which prevented files in `inst/doc` from being updated * `as.package()` no longer uses the full path, which should make for nicer error messages. * More flexibility when installing package dependencies with the `dependencies` argument to `install_*()` (thanks to Martin Studer) * The deprecated `show_rd()` function has now been removed. * `install_bitbucket()` gains `auth_user` and `password` params so that you can install from private repos (thanks to Brian Bolt) * Better git detection on windows (thanks to Mikhail Titov) * Fix bug so that `document()` will automatically create `man/` directory * Default `DESCRIPTION` gains `LazyData: true` * `create_description()` now checks that the directory is probably a package by looking for `R/`, `data/` or `src/` directories * Rolled back required R version from 3.0 to 2.15. * Add missing import for `digest()` * Bump max compatible version of R with RTools 3.0, and add details for RTools 3.1 # devtools 1.2 ## Better installation * `install` gains a `local` option for installing the package from the local package directory, rather than from a built tar.gz. This is now used by default for all package installations. If you want to guarantee a clean build, run `local = FALSE` * `install` now uses option `devtools.install.args` for default installation arguments. This allows you to set any useful defaults (e.g. `--no-multiarch`) in your Rprofile. * `install_git` gains `branch` argument to specify branch or tag (Fixes #255) ## Clean sessions * `run_examples` and `test` gain a `fresh` argument which forces them to run in a fresh R session. This completely insulates the examples/tests from your current session but means that interactive code (like `browser()`) won't work.(Fixes #258) * New functions `eval_clean` and `evalq_clean` make it easy to evaluate code in a clean R session. * `clean_source` loses the `vanilla` argument (which did not work) and gains a `quiet` argument ## New features * `source_url` and `source_gist` now allow you to specify a sha, so you can make sure that files you source from the internet don't change without you knowing about it. (Fixes #259) * `build_vignettes` builds using `buildVignette()` and movies/copies outputs using the same algorithm as `R CMD build`. This means that `build_vignettes()` now exactly mimics R's regular behaviour, including building non-Sweave vignettes (#277), building in the correct directory (#231), using make files (if present), and copying over extra files. * devtools now sets best practice compiler flags: from `check()`, `-Wall -pedantic` and from `load_all()`, `-Wall -pedantic -g -O0 -UNDEBUG`. These are prefixed to existing environment variables so that you can override them if desired. (Fixes #257) * If there's no `DESCRIPTION` file present, `load_all()` will automatically create one using `create_description()`. You can set options in your `.Rprofile` to control what it contains: see `package?devtools` for more details. ## Minor improvements * `check()` now also sets environment variable `_R_CHECK_CODE_DATA_INTO_GLOBALENV_` to TRUE (to match current `--as-cran` behaviour) (Fixes #256) * Improved default email sent by `release()`, eliminating `create.post()` boilerplate * `revdep` includes LinkingTo by default. * Fixed regular expression problem that caused RTools `3.0.*` to fail to be found on Windows. * `load_data()` got an overhaul and now respects `LazyData` and correctly exports datasets by default (Fixes #242) * `with_envvar` gains the option to either replace, prefix or suffix existing environmental variables. The default is to replace, which was the previous behaviour. * `check_cran` includes `sessionInfo()` in the summary output (Fixes #273) * `create()` gains a `check` argument which defaults to FALSE. * `with_env` will be deprecated in 1.2 and removed in 1.3 * When `load_all()` calls `.onAttach()` and `.onLoad()`, it now passes the lib path to those functions. # devtools 1.1 * `source_gist()` has been updated to accept new gist URLs with username. (Fixes #247) * `test()` and `document()` now set environment variables, including NOT_CRAN. * Test packages have been renamed to avoid conflicts with existing packages on CRAN. This bug prevented devtools 1.0 from passing check on CRAN for some platforms. * Catch additional case in `find_rtools()`: previously installed, but directory empty/deleted (Fixes #241) # devtools 1.0 ## Improvements to package loading * Rcpp attributes are now automatically compiled during build. * Packages listed in depends are `require()`d (Fixes #161, #178, #192) * `load_all` inserts a special version of `system.file` into the package's imports environment. This tries to simulate the behavior of `base::system.file` but gives modified results because the directory structure of installed packages and uninstalled source packages is different. (Fixes #179). In other words, `system.file` should now just work even if the package is loaded with devtools. * Source files are only recompiled if they've changed since the last run, and the recompile will be clean (`--preclean`) if any exported header files have changed. (Closes #224) * The compilation process now performs a mock install instead of using `R CMD SHLIB`. This means that `Makevars` and makefiles will now be respected and generally there should be fewer mismatches between `load_all` and the regular install and reload process. * S4 classes are correctly loaded and unloaded. ## Windows * Rtools detection on windows has been substantially overhauled and should both be more reliable, and when it fails give more information about what is wrong with your install. * If you don't have rtools installed, devtools now automatically sets the TAR environment variable to internal so you can still build packages. ## Minor features * `check_cran` now downloads packages from cran.rstudio.com. * `check()` now makes the CRAN version check optional, and off by default. The `release()` function still checks the version number against CRAN. * In `check()`, it is optional to require suggested packages, using the `force_suggests` option. * When `check()` is called, the new default behavior is to not delete existing .Rd files from man/. This behavior can be set with the "devtools.cleandoc" option. * `install_bitbucket()` now always uses lowercase repo names. (Thanks to mnel) * New function `with_lib()`, which runs an expression code with a library path prepended to the existing libpaths. It differs slightly from `with_libpaths()`, which replaces the existing libpaths. * New function `install_git()` installs a package directly from a git repository. (Thanks to David Coallier) * If `pdflatex` isn't available, don't try to build vignettes with `install()` or `check()`. (Fixes #173) * `install_github()` now downloads from a new URL, to reflect changes on how files are hosted on GitHub. * `build()` now has a `vignettes` option to turn off rebuilding vignettes. * `install(quick=TRUE)` now builds the package without rebuilding vignettes. (Fixes #167) * All R commands called from `devtools` now have the environment variable `NOT_CRAN` set, so that you can perform tasks when you know your code is definitely not running on CRAN. (Closes #227) * Most devtools functions can a quiet argument that suppresses output. This is particularly useful for testing. ## Bug fixes * Fixed path issue when looking for Rtools on windows when registry entry is not present. (Fixes #201) * Reloading a package that requires a forced-unload of the namespace now works. * When reloading a package that another loaded package depends on, if there was an error loading the code, devtools would print out something about an error in `unloadNamespace`, which was confusing. It now gives more useful errors. * An intermittent error in `clear_topic_index` related to using `rm()` has been fixed. (Thanks to Gregory Jefferis) * `revdep()` now lists "Suggests" packages, in addition to "Depends" and "Imports". * `revdep_check()` now correctly passes the `recursive` argument to `revdep()`. * The collection of check results at the end of `check_cran()` previously did not remove existing results, but now it does. * When a package is loaded with `load_all()`, it now passes the name of the package to the `.onLoad()` function. (Thanks to Andrew Redd) # devtools 0.8.0 ## New features * `create` function makes it easier to create a package skeleton using devtools standards. * `install_github()` can now install from a pull request -- it installs the branch referenced in the pull request. * `install_github` now accepts `auth_user` and `password` arguments if you want to install a package in a private github repo. You only need to specify `auth_user` if it's not your package (i.e. it's not your `username`) (Fixes #116) * new `dev_help` function replaces `show_rd` and makes it easy to get help on any topic in a development package (i.e. a package loaded with `load_all`) (Fixes #110) * `dev_example` runs the examples for one in-development package. (Fixes #108) * `build_vignettes` now looks in modern location for vignettes (`vignettes/`) and warn if vignettes found in old location (`inst/doc`). Building now occurs in a temporary directory (to avoid polluting the package with build artefacts) and only final pdf files are copied over. * new `clean_vignettes` function to remove pdfs in `inst/doc` that were built from vignettes in `vignettes/` * `load_all` does a much better job at simulating package loading (see LOADING section). It also compiles and loads C/C++/Fortran code. * `unload()` is now an exported function, which unloads a package, trying harder than just `detach`. It now also unloads DLLs. (Winston Chang. Fixes #119) * `run_examples` now has parameters `show`, `test`, `run` to control which of `\dontrun{}`, `\dontshow{}`, `\donttest{}` and `\testonly{}` are commented out. The `strict` parameter has been removed since it is no longer necessary because `load_all` can respect namespaces. (Fixes #118) * `build()`, `check()`, `install()` etc now run R in `--vanilla` mode which prevents it from reading any of your site or personal configuration files. This should prevent inconsistencies between the environment in which the package is run between your computer and other computers (e.g. the CRAN server) (Fixes #145) * All system R command now print the full command used to make it easier to understand what's going on. ## Package paths * `as.package` no longer uses `~/.Rpackages`. * `as.package` provides more informative error messages when path does not exist, isn't a directory, or doesn't contain a `DESCRIPTION` file. * New function `inst()` takes the name of a package and returns the installed path of that package. (Winston Chang. Fixes #130). This makes it possible to use `devtools` functions (e.g. `unload`) with regular installed packages, not just in-development source packages. * New function `devtest()` returns paths to an internal testing packages in devtools. ## Loading * Development packages are now loaded into a namespace environment, , and then the objects namespace are copied to the package environment, . This more accurately simulates how packages are normally loaded. However, all of the objects (not just the exported ones) are still copied to the package environment. (Winston Chang. Fixes #3, #60, and #125) * Packages listed in Imports and Depends are now loaded into an imports environment, with name attribute "imports:xxxx", which is the parent of the namespace environment. The imports environment is in turn a child of the environment, which is a child of the global environment. This more accurately simulates how packages are normally loaded. These packages previously were loaded and attached. (Winston Chang. Fixes #85) * The NAMESPACE file is now used for loading imports, instead of the DESCRIPTION file. Previously, `load_all` loaded all objects from the packages listed in DESCRIPTION. Now it loads packages (and, when 'importFrom' is used, specific objects from packages) listed in NAMESPACE. This more closely simulates normal package loading. It still checks version numbers of packages listed in DESCRIPTION. (Winston Chang) * `load_all` can now be used to properly reload devtools. It does this by creating a copy of the devtools namespace environment, and calling `load_all` from that environment. (Winston Chang) * The `.onLoad` and `.onAttach` functions for a development package are now both called when loading a package for the first time, or with `reset=TRUE`, and the order more correctly simulates normal package loading (create the namespace, call `.onLoad`, copy objects to the package environment, and then call `.onAttach`). (Winston Chang) * `load_all` will now throw a warning if a dependency package does not satisfy the version requirement listed in DESCRIPTION. (Winston Chang. Fixes #109) * The package environment now has a 'path' attribute, similar to a package loaded the normal way. (Winston Chang) * `load_all` now has an option `export_all`. When set to TRUE, only the objects listed as exports in NAMESPACE are exported. (Winston Chang) * `load_all` now compiles C files in the /src directory. (Winston Chang) * New functions `compile_dll()` and `clean_dll()`, which compile C/C++/ Fortran source code, and clean up the compiled objects, respectively. (Winston Chang. Fixes #131) ## Bug fixes * `load_code` now properly skips missing files. (Winston Chang) * Add `--no-resave-data` to default build command. * The subject line of the email created by `release` is now "CRAN submission [package] [version]", per CRAN repository policy. * `install_bitbucket` properly installs zip files of projects stored in Mercurial repositories. (Winston Chang. Fixes #148) * `build` now builds vignettes because `install` does not. (Fixes #155) ## Introspection * New function `loaded_packages()`, which returns the names of packages that are loaded and attached. * Packages loaded with `load_all` now store devtools metadata in their namespace environment, in a variable called `.__DEVTOOLS__`. This can be accessed with the `dev_meta` function. (Winston Chang. Fixes #128) * `dev_mode` now stores the path it uses in option `dev_path`. That makes it easy for other applications to detect when it is on and to act accordingly. * New function `parse_ns_file()`, which parses a NAMESPACE file for a package. * New function `parenvs()`, which parents the parent environments of an object. (Winston Chang) # devtools 0.7.1 * bump dependency to R 2.15 * `load_code` now also looks for files ending in `.q` - this is not recommended, but is needed for some older packages # devtools 0.7 ## Installation * `install_bitbucket` installs R packages on bitbucket. * `install` now uses `--with-keep.source` to make debugging a little easier. * All remote install functions give better error messages in the case of http errors (Fixes #82). * `install` has new quick option to make package installation faster, by sacrificing documentation, demos and multi-architecture binaries. (Fixes #77) * `install_url`, `install_github` and `install_gitorious` gain a subdir argument which makes it possible to install packages that are contained within a sub-directory of a repository or compressed file. (Fixes #64) ## Checking * `with_debug` function temporarily sets env vars so that compilation is performed with the appropriate debugging flags set. Contributed by Andrew Redd. * `revdep`, `revdep_maintainers` and `revdep_check` for calculating reverse dependencies, finding their maintainers and running `R CMD check`. (Fixes #78) * `check_cran` has received a massive overhaul: it now checks multiple packages, installs dependencies (in user specified library), and parse check output to extract errors and warnings * `check` uses new `--as-cran` option to make checking as close to CRAN as possible (fixes #68) ## Other new features * devtools now uses options `devtools.path` to set the default path to use with devmode, and `github.user` to set the default user when installing packages from github. * if no package supplied, and no package has been worked with previously, all functions now will try the working directory. (Fixes #87) * on windows, devtools now looks in the registry to find where Rtools is installed, and does a better a job of locating gcc. (Contributed by Andrew Redd) * `show_rd` passes `...` on to `Rd2txt` - this is useful if you're checking how build time `\Sexpr`s are generated. * A suite of `with` functions that allow you to temporarily alter the environment in which code is run: `in_dir`, `with_collate`, `with_locale`, `with_options`, `with_path`, ... (Fixes #89) * `release` ask more questions and randomises correct answers so you really need to read them (Fixes #79) * `source_gist` now accepts default url such as "https://gist.github.com/nnn" * New system path manipulation functions, `get_path`, `set_path`, `add_path` and `on_path`, contributed by Andrew Redd. * If you're on windows, `devtools` now suppresses the unimportant warning from CYGWIN about the dos style file paths ## Bug fixes * `decompress` now uses target directory as defined in the function call when expanding a compressed file. (Fixes #84) * `document` is always run in a C locale so that `NAMESPACE` sort order is consistent across platforms. * `install` now quotes `libpath` and build path so paths with embedded spaces work (Fixes #73 and #76) * `load_data` now also loads `.RData` files (Fixes #81) * `install` now has `args` argument to pass additional command line arguments on to `R CMD install` (replaces `...` which didn't actually do anything). (Fixes #69) * `load_code` does a better job of reconciling files in DESCRIPTION collate with files that actually exist in the R directory. (Fixes #14) # devtools 0.6 ## New features * `test` function takes `filter` argument which allows you to restrict which tests are to be run * `check` runs with example timings, as is done on CRAN. Run with new param `cleanup = F` to access the timings. * `missing_s3` function to help figure out if you've forgotten to export any s3 methods * `check_cran` downloads and checks a CRAN package - this is useful to run as part of the testing process of your package if you want to check the dependencies of your package * `strict` mode for `run_examples` which runs each example in a clean environment. This is much slower than the default (running in the current environment), but ensures that each example works standalone. * `dev_mode` now updates prompt to indicate that it's active (Thanks to Kohske Takahashi) * new `source_url` function for sourcing script on a remote server via protocols other than http (e.g. https or ftp). (Thanks to Kohske Takahashi) * new `source_gist` function to source R code stored in a github gist. (Thanks to Kohske Takahashi) * `load_all` now also loads all package dependencies (including suggestions) - this works around some bugs in the way that devtools attaches the development environment into the search path in a way that fails to recreate what happens normally during package loading. ## Installation * remote installation will ensure the configure file is executable. * all external package installation functions are vectorised so you can install multiple packages at time * new `install_gitorious` function install packages in gitorious repos. * new `install_url` function for installing package from an arbitrary url * include `install_version` function from Jeremy Stephens for installing a specific version of a CRAN package from the archive. ## Better windows behaviour * better check for OS type (thanks to Brian Ripley) * better default paths for 64-bit R on windows (Fixes #35) * check to see if Rtools is already available before trying to mess with the paths. (Fixes #55) ## Bug fixes * if an error occurs when calling loading R files, the cache will be automatically cleared so that all files are loaded again next time you try (Fixes #55) * functions that run R now do so with `R_LIBS` set to the current `.libPaths()` - this will ensure that checking uses the development library if you are in development mode. `R_ENVIRON_USER` is set to an empty file to avoid your existing settings overriding this. * `load_data` (called by `load_all`) will also load data defined in R files in the data directory. (Fixes #45) * `dev_mode` performs some basic tests to make sure you're not setting your development library to a directory that's not already an R library. (Fixes #25) # devtools 0.5.1 * Fix error in that was causing R commands to fail on windows. # devtools 0.5 ## New functions * new `show_rd` function that will show the development version of a help file. ## Improvements and bug fixes * external R commands always run in locale `C`, because that's what the CRAN severs do. * `clean_source` sources an R script into a fresh R environment, ensuring that it can run independently of your current working environment. Optionally (`vanilla = T`), it will source in a vanilla R environment which ignores all local environment settings. * On windows, `devtools` will also add the path to `mingw` on startup. (Thanks to pointer from Dave Lovell) # devtools 0.4 ## New functions * new `wd` function to change the working directory to a package subdirectory. * `check_doc` now checks package documentation as a whole, in the same way that `R CMD check` does, rather than low-level syntax checking, which is done by `roxygen2. DESCRIPTION checking has been moved into `load_all`. `check_rd` has been removed. * `build` is now exported, and defaults to building in the package's parent directory. It also gains a new `binary` parameter controls whether a binary or a source version (with no vignettes or manuals) is built. Confusingly, binary packages are built with `R CMD INSTALL`. * `build_win` sends your package to the R windows builder, allowing you to make a binary version of your package for windows users if you're using linux or macOS (if you're using windows already, use `build(binary = T)`) ## Improvements and bug fixes * if using `.Rpackages` config file, default function is used last, not first. * on Windows, `devtools` now checks for the presence of `Rtools` on startup, and will automatically add it to the path if needed. * `document` uses `roxygen2` instead of `roxygen`. It now loads package dependency so that they're available when roxygen executes the package source code. * `document` has new parameter `clean` which clears all roxygen caches and removes all existing man files. `check` now runs `document` in this mode. * `dev_mode` will create directories recursively, and complain if it can't create them. It should also work better on windows. * `install_github` now allows you to specify which branch to download, and automatically reloads package if needed. * `reload` now will only reload if the package is already loaded. * `release` gains `check` parameter that allows you to skip package check (if you've just done it.) * `test` automatically reloads code so you never run tests on old code # devtools 0.3 * new `bash()` function that starts bash shell in package directory. Useful if you want to use git etc. * removed inelegant `update_src()` since now superseded by `bash()` * fix bug in ftp upload that was adding extraneous space * `build` function builds package in specified directory. `install`, `check` and `release` now all use this function. * `build`, `install`, `check` and `release` better about cleaning up after themselves - always try to both work in session temporary directory and delete any files/directories that they create # devtools 0.2 * `install_github` now uses `RCurl` instead of external `wget` to retrieve package. This should make it more robust wrt external dependencies. * `load_all` will skip missing files with a warning (thanks to suggestion from Jeff Laake) * `check` automatically deletes `.Rcheck` directory on successful completion * Quote the path to R so it works even if there are spaces in the path. # devtools 0.1 * Check for presence of `DESCRIPTION` when loading packages to avoid false positives * `install` now works correctly with `devel_mode` to install packages in your development library * `release` prints news so you can more easily check it * All `R CMD xxx` functions now use the current R, not the first R found on the system path. devtools/DESCRIPTION0000644000175000017500000000404614151364022013753 0ustar nileshnileshPackage: devtools Title: Tools to Make Developing R Packages Easier Version: 2.4.3 Authors@R: c(person(given = "Hadley", family = "Wickham", role = "aut"), person(given = "Jim", family = "Hester", role = "aut"), person(given = "Winston", family = "Chang", role = "aut"), person(given = "Jennifer", family = "Bryan", role = c("aut", "cre"), email = "jenny@rstudio.com", comment = c(ORCID = "0000-0002-6983-2759")), person(given = "RStudio", role = c("cph", "fnd"))) Description: Collection of package development tools. License: MIT + file LICENSE URL: https://devtools.r-lib.org/, https://github.com/r-lib/devtools BugReports: https://github.com/r-lib/devtools/issues Depends: R (>= 3.0.2), usethis (>= 2.0.1) Imports: callr (>= 3.6.0), cli (>= 3.0.0), desc (>= 1.3.0), ellipsis (>= 0.3.1), fs (>= 1.5.0), httr (>= 1.4.2), lifecycle (>= 1.0.0), memoise (>= 2.0.0), pkgbuild (>= 1.2.0), pkgload (>= 1.2.1), rcmdcheck (>= 1.3.3), remotes (>= 2.3.0), rlang (>= 0.4.10), roxygen2 (>= 7.1.1), rstudioapi (>= 0.13), rversions (>= 2.0.2), sessioninfo (>= 1.1.1), stats, testthat (>= 3.0.2), tools, utils, withr (>= 2.4.1) Suggests: BiocManager (>= 1.30.12), covr (>= 3.5.1), curl (>= 4.3), digest (>= 0.6.27), DT (>= 0.17), foghorn (>= 1.3.2), gh (>= 1.2.1), gmailr (>= 1.0.0), knitr (>= 1.31), lintr (>= 2.0.1), MASS, mockery (>= 0.4.2), pingr (>= 2.0.1), pkgdown (>= 1.6.1), rhub (>= 1.1.1), rmarkdown (>= 2.7), spelling (>= 2.2) VignetteBuilder: knitr Encoding: UTF-8 Language: en-US RoxygenNote: 7.1.2 NeedsCompilation: no Packaged: 2021-11-29 16:01:54 UTC; jhester Author: Hadley Wickham [aut], Jim Hester [aut], Winston Chang [aut], Jennifer Bryan [aut, cre] (), RStudio [cph, fnd] Maintainer: Jennifer Bryan Repository: CRAN Date/Publication: 2021-11-30 09:00:02 UTC devtools/README.md0000644000175000017500000002003314145520536013525 0ustar nileshnilesh# devtools [![R-CMD-check](https://github.com/r-lib/devtools/workflows/R-CMD-check/badge.svg)](https://github.com/r-lib/devtools/actions) [![Codecov test coverage](https://codecov.io/gh/r-lib/devtools/branch/main/graph/badge.svg)](https://app.codecov.io/gh/r-lib/devtools?branch=main) [![CRAN_Status_Badge](https://www.r-pkg.org/badges/version/devtools)](https://cran.r-project.org/package=devtools) The aim of devtools is to make package development easier by providing R functions that simplify and expedite common tasks. [R Packages](https://r-pkgs.org/) is a book based around this workflow. ## Installation ```r # Install devtools from CRAN install.packages("devtools") # Or the development version from GitHub: # install.packages("devtools") devtools::install_github("r-lib/devtools") ``` ## Cheatsheet ## Usage All devtools functions accept a path as an argument, e.g. `load_all("path/to/mypkg")`. If you don't specify a path, devtools will look in the current working directory - this is a recommended practice. ### Frequent development tasks: * `load_all()` simulates installing and reloading your package, loading R code in `R/`, compiled shared objects in `src/` and data files in `data/`. During development you would usually want to access all functions (even un-exported internal ones) so `load_all()` works as if all functions were exported in the package `NAMESPACE`. * `document()` updates generated documentation in `man/`, file collation and `NAMESPACE`. * `test()` reloads your code with `load_all()`, then runs all `testthat` tests. * `test_coverage()` runs test coverage on your package with [covr](https://github.com/r-lib/covr). This makes it easy to see what parts of your package could use more tests! ### Building and installing: * `install()` reinstalls the package, detaches the currently loaded version then reloads the new version with `library()`. Reloading a package is not guaranteed to work: see the documentation for `unload()` for caveats. * `build()` builds a package file from package sources. You can use it to build a binary version of your package. * `install_*` functions install an R package: * `install_github()` from GitHub * `install_gitlab()` from GitLab * `install_bitbucket()` from Bitbucket * `install_url()` from an arbitrary url * `install_git()` and `install_svn()` from an arbitrary git or SVN repository * `install_local()` from a local file on disk * `install_version()` from a specific version on CRAN * `update_packages()` updates a package to the latest version. This works both on packages installed from CRAN as well as those installed from any of the `install_*` functions. ### Check and release: * `check()` updates the documentation, then builds and checks the package locally. `check_win()` checks a package using [win-builder](https://win-builder.r-project.org/), and `check_rhub()` checks a package using [r-hub](https://log.r-hub.io/). This allows you to easily check your package on all systems CRAN uses before submission. * `release()` makes sure everything is ok with your package (including asking you a number of questions), then builds and uploads to CRAN. ## Learning more R package development can be intimidating, however there are now a number of valuable resources to help! 1. R Packages is a book that gives a comprehensive treatment of all common parts of package development and uses devtools throughout. * The first edition is available at , but note that it has grown somewhat out of sync with the current version of devtools. * A second edition is under development and is evolving to reflect the current state of devtools. It is available at . * The [Whole Game](https://r-pkgs.org/whole-game.html) and [Package structure](https://r-pkgs.org/package-structure-state.html) chapters make great places to start. 2. [RStudio community - package development](https://community.rstudio.com/c/package-development/11) is a great place to ask specific questions related to package development. 3. [rOpenSci packages](https://devguide.ropensci.org/) has extensive documentation on best practices for R packages looking to be contributed to rOpenSci, but also very useful general recommendations for package authors. 4. There are a number of fantastic blog posts on writing your first package, including - [Writing an R package from scratch - Hilary Parker](https://hilaryparker.com/2014/04/29/writing-an-r-package-from-scratch/) - [How to develop good R packages - Maëlle Salmon](https://masalmon.eu/2017/12/11/goodrpackages/) - [Making your first R package - Fong Chun Chan](https://tinyheero.github.io/jekyll/update/2015/07/26/making-your-first-R-package.html) - [Writing an R package from scratch - Tomas Westlake](https://r-mageddon.netlify.app/post/writing-an-r-package-from-scratch/) 5. [Writing R Extensions](https://cran.r-project.org/doc/manuals/r-release/R-exts.html) is the exhaustive, canonical reference for writing R packages, maintained by the R core developers. ## Conscious uncoupling devtools started off as a lean-and-mean package to facilitate local package development, but over the years it accumulated more and more functionality. devtools has undergone a [conscious uncoupling](https://web.archive.org/web/20140326060230/https://www.goop.com/journal/be/conscious-uncoupling) to split out functionality into smaller, more tightly focussed packages. This includes: * [testthat](https://github.com/r-lib/testthat): Writing and running tests (i.e. `test()`). * [roxygen2](https://github.com/r-lib/roxygen2): Function and package documentation (i.e. `document()`). * [remotes](https://github.com/r-lib/remotes): Installing packages (i.e. `install_github()`). * [pkgbuild](https://github.com/r-lib/pkgbuild): Building binary packages (including checking if build tools are available) (i.e. `build()`). * [pkgload](https://github.com/r-lib/pkgload): Simulating package loading (i.e. `load_all()`). * [rcmdcheck](https://github.com/r-lib/rcmdcheck): Running R CMD check and reporting the results (i.e. `check()`). * [revdepcheck](https://github.com/r-lib/revdepcheck): Running R CMD check on all reverse dependencies, and figuring out what's changed since the last CRAN release (i.e. `revdep_check()`). * [sessioninfo](https://github.com/r-lib/sessioninfo): R session info (i.e. `session_info()`). * [usethis](https://github.com/r-lib/usethis): Automating package setup (i.e. `use_test()`). Generally, you would not need to worry about these different packages, because devtools installs all of them automatically. You will need to care, however, if you're filing a bug because reporting it at the correct place will lead to a speedier resolution. You may also need to care if you are trying to use some devtools functionality in your own package or deployed application. Generally in these cases it is better to depend on the particular package directly rather than depend on devtools, e.g. use `sessioninfo::session_info()` rather than `devtools::session_info()`, or `remotes::install_github()` vs `devtools::install_github()`. However for day to day development we recommend you continue to use `library(devtools)` to quickly load all needed development tools, just like `library(tidyverse)` quickly loads all the tools necessary for data exploration and visualization. ## Code of conduct Please note that the devtools project is released with a [Contributor Code of Conduct](https://github.com/r-lib/devtools/blob/main/.github/CODE_OF_CONDUCT.md). By contributing to this project, you agree to abide by its terms. devtools/man/0000755000175000017500000000000014151154613013017 5ustar nileshnileshdevtools/man/as.package.Rd0000644000175000017500000000104013532242644015302 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/package.R \name{as.package} \alias{as.package} \title{Coerce input to a package.} \usage{ as.package(x = NULL, create = NA) } \arguments{ \item{x}{object to coerce to a package} \item{create}{only relevant if a package structure does not exist yet: if \code{TRUE}, create a package structure; if \code{NA}, ask the user (in interactive mode only)} } \description{ Possible specifications of package: \itemize{ \item path \item package object } } \keyword{internal} devtools/man/source_gist.Rd0000644000175000017500000000344313532242644015644 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/run-source.R \name{source_gist} \alias{source_gist} \title{Run a script on gist} \usage{ source_gist(id, ..., filename = NULL, sha1 = NULL, quiet = FALSE) } \arguments{ \item{id}{either full url (character), gist ID (numeric or character of numeric).} \item{...}{other options passed to \code{\link[=source]{source()}}} \item{filename}{if there is more than one R file in the gist, which one to source (filename ending in '.R')? Default \code{NULL} will source the first file.} \item{sha1}{The SHA-1 hash of the file at the remote URL. This is highly recommend as it prevents you from accidentally running code that's not what you expect. See \code{\link[=source_url]{source_url()}} for more information on using a SHA-1 hash.} \item{quiet}{if \code{FALSE}, the default, prints informative messages.} } \description{ \dQuote{Gist is a simple way to share snippets and pastes with others. All gists are git repositories, so they are automatically versioned, forkable and usable as a git repository.} \url{https://gist.github.com/} } \examples{ \dontrun{ # You can run gists given their id source_gist(6872663) source_gist("6872663") # Or their html url source_gist("https://gist.github.com/hadley/6872663") source_gist("gist.github.com/hadley/6872663") # It's highly recommend that you run source_gist with the optional # sha1 argument - this will throw an error if the file has changed since # you first ran it source_gist(6872663, sha1 = "54f1db27e60") # Wrong hash will result in error source_gist(6872663, sha1 = "54f1db27e61") #' # You can speficy a particular R file in the gist source_gist(6872663, filename = "hi.r") source_gist(6872663, filename = "hi.r", sha1 = "54f1db27e60") } } \seealso{ \code{\link[=source_url]{source_url()}} } devtools/man/package_file.Rd0000644000175000017500000000116414031104013015664 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/package.R \name{package_file} \alias{package_file} \title{Find file in a package.} \usage{ package_file(..., path = ".") } \arguments{ \item{...}{Components of the path.} \item{path}{Place to start search for package directory.} } \description{ It always starts by walking up the path until it finds the root directory, i.e. a directory containing \code{DESCRIPTION}. If it cannot find the root directory, or it can't find the specified path, it will throw an error. } \examples{ \dontrun{ package_file("figures", "figure_1") } } \keyword{internal} devtools/man/release.Rd0000644000175000017500000000322413705571551014737 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/release.R \name{release} \alias{release} \title{Release package to CRAN.} \usage{ release(pkg = ".", check = FALSE, args = NULL) } \arguments{ \item{pkg}{The package to use, can be a file path to the package or a package object. See \code{\link[=as.package]{as.package()}} for more information.} \item{check}{if \code{TRUE}, run checking, otherwise omit it. This is useful if you've just checked your package and you're ready to release it.} \item{args}{An optional character vector of additional command line arguments to be passed to \verb{R CMD build}.} } \description{ Run automated and manual tests, then post package to CRAN. } \details{ The package release process will: \itemize{ \item Confirm that the package passes \verb{R CMD check} on relevant platforms \item Confirm that important files are up-to-date \item Build the package \item Submit the package to CRAN, using comments in "cran-comments.md" } You can add arbitrary extra questions by defining an (un-exported) function called \code{release_questions()} that returns a character vector of additional questions to ask. You also need to read the CRAN repository policy at 'https://cran.r-project.org/web/packages/policies.html' and make sure you're in line with the policies. \code{release} tries to automate as many of polices as possible, but it's impossible to be completely comprehensive, and they do change in between releases of devtools. } \seealso{ \code{\link[usethis:use_release_issue]{usethis::use_release_issue()}} to create a checklist of release tasks that you can use in addition to or in place of \code{release}. } devtools/man/build_vignettes.Rd0000644000175000017500000000613214033115641016474 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/vignettes.R \name{build_vignettes} \alias{build_vignettes} \title{Build package vignettes.} \usage{ build_vignettes( pkg = ".", dependencies = "VignetteBuilder", clean = TRUE, upgrade = "never", quiet = TRUE, install = TRUE, keep_md = TRUE ) } \arguments{ \item{pkg}{The package to use, can be a file path to the package or a package object. See \code{\link[=as.package]{as.package()}} for more information.} \item{dependencies}{Which dependencies do you want to check? Can be a character vector (selecting from "Depends", "Imports", "LinkingTo", "Suggests", or "Enhances"), or a logical vector. \code{TRUE} is shorthand for "Depends", "Imports", "LinkingTo" and "Suggests". \code{NA} is shorthand for "Depends", "Imports" and "LinkingTo" and is the default. \code{FALSE} is shorthand for no dependencies (i.e. just check this package, not its dependencies). The value "soft" means the same as \code{TRUE}, "hard" means the same as \code{NA}. You can also specify dependencies from one or more additional fields, common ones include: \itemize{ \item Config/Needs/website - for dependencies used in building the pkgdown site. \item Config/Needs/coverage for dependencies used in calculating test coverage. }} \item{clean}{Remove all files generated by the build, even if there were copies there before.} \item{upgrade}{Should package dependencies be upgraded? One of "default", "ask", "always", or "never". "default" respects the value of the \code{R_REMOTES_UPGRADE} environment variable if set, and falls back to "ask" if unset. "ask" prompts the user for which out of date packages to upgrade. For non-interactive sessions "ask" is equivalent to "always". \code{TRUE} and \code{FALSE} are also accepted and correspond to "always" and "never" respectively.} \item{quiet}{If \code{TRUE}, suppresses most output. Set to \code{FALSE} if you need to debug.} \item{install}{If \code{TRUE}, install the package before building vignettes.} \item{keep_md}{If \code{TRUE}, move md intermediates as well as rendered outputs. Most useful when using the \code{keep_md} YAML option for Rmarkdown outputs. See \url{https://bookdown.org/yihui/rmarkdown/html-document.html#keeping-markdown}.} } \description{ Builds package vignettes using the same algorithm that \verb{R CMD build} does. This means including non-Sweave vignettes, using makefiles (if present), and copying over extra files. The files are copied in the 'doc' directory and an vignette index is created in 'Meta/vignette.rds', as they would be in a built package. 'doc' and 'Meta' are added to \code{.Rbuildignore}, so will not be included in the built package. These files can be checked into version control, so they can be viewed with \code{browseVignettes()} and \code{vignette()} if the package has been loaded with \code{load_all()} without needing to re-build them locally. } \seealso{ \code{\link[=clean_vignettes]{clean_vignettes()}} to remove the pdfs in \file{doc} created from vignettes \code{\link[=clean_vignettes]{clean_vignettes()}} to remove build tex/pdf files. } \keyword{programming} devtools/man/is.package.Rd0000644000175000017500000000036213532242644015320 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/package.R \name{is.package} \alias{is.package} \title{Is the object a package?} \usage{ is.package(x) } \description{ Is the object a package? } \keyword{internal} devtools/man/clean_vignettes.Rd0000644000175000017500000000100513536443710016461 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/vignettes.R \name{clean_vignettes} \alias{clean_vignettes} \title{Clean built vignettes.} \usage{ clean_vignettes(pkg = ".") } \arguments{ \item{pkg}{The package to use, can be a file path to the package or a package object. See \code{\link[=as.package]{as.package()}} for more information.} } \description{ This uses a fairly rudimentary algorithm where any files in \file{doc} with a name that exists in \file{vignettes} are removed. } devtools/man/source_url.Rd0000644000175000017500000000272613532242644015503 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/run-source.R \name{source_url} \alias{source_url} \title{Run a script through some protocols such as http, https, ftp, etc.} \usage{ source_url(url, ..., sha1 = NULL) } \arguments{ \item{url}{url} \item{...}{other options passed to \code{\link[=source]{source()}}} \item{sha1}{The (prefix of the) SHA-1 hash of the file at the remote URL.} } \description{ If a SHA-1 hash is specified with the \code{sha1} argument, then this function will check the SHA-1 hash of the downloaded file to make sure it matches the expected value, and throw an error if it does not match. If the SHA-1 hash is not specified, it will print a message displaying the hash of the downloaded file. The purpose of this is to improve security when running remotely-hosted code; if you have a hash of the file, you can be sure that it has not changed. For convenience, it is possible to use a truncated SHA1 hash, down to 6 characters, but keep in mind that a truncated hash won't be as secure as the full hash. } \examples{ \dontrun{ source_url("https://gist.github.com/hadley/6872663/raw/hi.r") # With a hash, to make sure the remote file hasn't changed source_url("https://gist.github.com/hadley/6872663/raw/hi.r", sha1 = "54f1db27e60bb7e0486d785604909b49e8fef9f9") # With a truncated hash source_url("https://gist.github.com/hadley/6872663/raw/hi.r", sha1 = "54f1db27e60") } } \seealso{ \code{\link[=source_gist]{source_gist()}} } devtools/man/test.Rd0000644000175000017500000000406214031104013014251 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/test.R \name{test} \alias{test} \alias{test_active_file} \alias{test_coverage} \alias{test_coverage_active_file} \title{Execute testthat tests in a package} \usage{ test(pkg = ".", filter = NULL, stop_on_failure = FALSE, export_all = TRUE, ...) test_active_file(file = find_active_file(), ...) test_coverage(pkg = ".", show_report = interactive(), ...) test_coverage_active_file( file = find_active_file(), filter = TRUE, show_report = interactive(), export_all = TRUE, ... ) } \arguments{ \item{pkg}{The package to use, can be a file path to the package or a package object. See \code{\link[=as.package]{as.package()}} for more information.} \item{filter}{If not \code{NULL}, only tests with file names matching this regular expression will be executed. Matching is performed on the file name after it's stripped of \code{"test-"} and \code{".R"}.} \item{stop_on_failure}{If \code{TRUE}, throw an error if any tests fail.} \item{export_all}{If \code{TRUE} (the default), export all objects. If \code{FALSE}, export only the objects that are listed as exports in the NAMESPACE file.} \item{...}{additional arguments passed to wrapped functions.} \item{file}{One or more source or test files. If a source file the corresponding test file will be run. The default is to use the active file in RStudio (if available).} \item{show_report}{Show the test coverage report.} } \description{ \itemize{ \item \code{test()} runs all tests in a package. It's a shortcut for \code{\link[testthat:test_dir]{testthat::test_dir()}} \item \code{test_active_file()} runs \code{test()} on the active file. \item \code{test_coverage()} computes test coverage for your package. It's a shortcut for \code{\link[covr:package_coverage]{covr::package_coverage()}} plus \code{\link[covr:report]{covr::report()}}. \item \code{test_coverage_active_file()} computes test coverage for the active file. It's a shortcut for \code{\link[covr:file_coverage]{covr::file_coverage()}} plus \code{\link[covr:report]{covr::report()}}. } } devtools/man/show_news.Rd0000644000175000017500000000103213536443710015323 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/show-news.R \name{show_news} \alias{show_news} \title{Show package news} \usage{ show_news(pkg = ".", latest = TRUE, ...) } \arguments{ \item{pkg}{The package to use, can be a file path to the package or a package object. See \code{\link[=as.package]{as.package()}} for more information.} \item{latest}{if \code{TRUE}, only show the news for the most recent version.} \item{...}{other arguments passed on to \code{news}} } \description{ Show package news } devtools/man/missing_s3.Rd0000644000175000017500000000070113536443710015367 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/missing-s3.R \name{missing_s3} \alias{missing_s3} \title{Find missing s3 exports.} \usage{ missing_s3(pkg = ".") } \arguments{ \item{pkg}{The package to use, can be a file path to the package or a package object. See \code{\link[=as.package]{as.package()}} for more information.} } \description{ The method is heuristic - looking for objs with a period in their name. } devtools/man/devtools-deprecated.Rd0000644000175000017500000000073414031104013017231 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/test.R, R/zzz.R \name{test_file} \alias{test_file} \alias{test_coverage_file} \alias{devtools-deprecated} \title{Deprecated Functions} \usage{ test_file(file = find_active_file(), ...) test_coverage_file(file = find_active_file(), ...) } \description{ These functions are Deprecated in this release of devtools, they will be marked as Defunct and removed in a future version. } \keyword{internal} devtools/man/reexports.Rd0000644000175000017500000000220014031104013015315 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/package-deps.R, R/pkgbuild.R, R/pkgload.R, % R/remotes.R, R/session-info.R \docType{import} \name{reexports} \alias{reexports} \alias{parse_deps} \alias{check_dep_version} \alias{with_debug} \alias{clean_dll} \alias{has_devel} \alias{find_rtools} \alias{unload} \alias{github_pull} \alias{github_release} \alias{session_info} \alias{package_info} \title{Objects exported from other packages} \keyword{internal} \description{ These objects are imported from other packages. Follow the links below to see their documentation. \describe{ \item{pkgbuild}{\code{\link[pkgbuild]{clean_dll}}, \code{\link[pkgbuild:has_rtools]{find_rtools}}, \code{\link[pkgbuild:has_compiler]{has_devel}}, \code{\link[pkgbuild]{with_debug}}} \item{pkgload}{\code{\link[pkgload]{check_dep_version}}, \code{\link[pkgload]{parse_deps}}, \code{\link[pkgload]{unload}}} \item{remotes}{\code{\link[remotes:github_refs]{github_pull}}, \code{\link[remotes:github_refs]{github_release}}} \item{sessioninfo}{\code{\link[sessioninfo]{package_info}}, \code{\link[sessioninfo]{session_info}}} }} devtools/man/lint.Rd0000644000175000017500000000213314107010173014244 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/lint.R \name{lint} \alias{lint} \title{Lint all source files in a package.} \usage{ lint(pkg = ".", cache = TRUE, ...) } \arguments{ \item{pkg}{The package to use, can be a file path to the package or a package object. See \code{\link[=as.package]{as.package()}} for more information.} \item{cache}{store the lint results so repeated lints of the same content use the previous results.} \item{...}{additional arguments passed to \code{\link[lintr:lint_package]{lintr::lint_package()}}} } \description{ The default linters correspond to the style guide at \url{https://style.tidyverse.org/}, however it is possible to override any or all of them using the \code{linters} parameter. } \details{ The lintr cache is by default stored in \verb{~/.R/lintr_cache/} (this can be configured by setting \code{options(lintr.cache_directory)}). It can be cleared by calling \code{\link[lintr:clear_cache]{lintr::clear_cache()}}. } \seealso{ \code{\link[lintr:lint_package]{lintr::lint_package()}}, \code{\link[lintr:lint_file]{lintr::lint()}} } devtools/man/save_all.Rd0000644000175000017500000000101213532242644015072 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/save-all.R \name{save_all} \alias{save_all} \title{Save all documents in an active IDE session.} \usage{ save_all() } \description{ Helper function wrapping IDE-specific calls to save all documents in the active session. In this form, callers of \code{save_all()} don't need to execute any IDE-specific code. This function can be extended to include other IDE implementations of their equivalent \code{rstudioapi::documentSaveAll()} methods. } devtools/man/check.Rd0000644000175000017500000001300114151154613014356 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/check.R \name{check} \alias{check} \alias{check_built} \title{Build and check a package, cleaning up automatically on success.} \usage{ check( pkg = ".", document = NULL, build_args = NULL, ..., manual = FALSE, cran = TRUE, remote = FALSE, incoming = remote, force_suggests = FALSE, run_dont_test = FALSE, args = "--timings", env_vars = c(NOT_CRAN = "true"), quiet = FALSE, check_dir = tempdir(), cleanup = TRUE, vignettes = TRUE, error_on = c("never", "error", "warning", "note") ) check_built( path = NULL, cran = TRUE, remote = FALSE, incoming = remote, force_suggests = FALSE, run_dont_test = FALSE, manual = FALSE, args = "--timings", env_vars = NULL, check_dir = tempdir(), quiet = FALSE, error_on = c("never", "error", "warning", "note") ) } \arguments{ \item{pkg}{The package to use, can be a file path to the package or a package object. See \code{\link[=as.package]{as.package()}} for more information.} \item{document}{By default (\code{NULL}) will document if your installed roxygen2 version matches the version declared in the \code{DESCRIPTION} file. Use \code{TRUE} or \code{FALSE} to override the default.} \item{build_args}{Additional arguments passed to \verb{R CMD build}} \item{...}{Additional arguments passed on to \code{\link[pkgbuild:build]{pkgbuild::build()}}.} \item{manual}{If \code{FALSE}, don't build and check manual (\code{--no-manual}).} \item{cran}{if \code{TRUE} (the default), check using the same settings as CRAN uses.} \item{remote}{Sets \verb{_R_CHECK_CRAN_INCOMING_REMOTE_} env var. If \code{TRUE}, performs a number of CRAN incoming checks that require remote access.} \item{incoming}{Sets \verb{_R_CHECK_CRAN_INCOMING_} env var. If \code{TRUE}, performs a number of CRAN incoming checks.} \item{force_suggests}{Sets \verb{_R_CHECK_FORCE_SUGGESTS_}. If \code{FALSE} (the default), check will proceed even if all suggested packages aren't found.} \item{run_dont_test}{Sets \code{--run-donttest} so that tests surrounded in \verb{\\dontest\{\}} are also tested. When \code{cran = TRUE}, this only affects R 3.6 and earlier; in R 4.0.0 code in \verb{\\dontest\{\}} is always run as part of CRAN submission.} \item{args}{Character vector of arguments to pass to \verb{R CMD check}. Pass each argument as a single element of this character vector (do not use spaces to delimit arguments like you would in the shell). For example, to skip running of examples and tests, use \code{args = c("--no-examples", "--no-tests")} and not \code{args = "--no-examples --no-tests"}. (Note that instead of the \code{--output} option you should use the \code{check_dir} argument, because \code{--output} cannot deal with spaces and other special characters on Windows.)} \item{env_vars}{Environment variables set during \verb{R CMD check}} \item{quiet}{if \code{TRUE} suppresses output from this function.} \item{check_dir}{the directory in which the package is checked compatibility. \code{args = "--output=/foo/bar"} can be used to change the check directory.} \item{cleanup}{Deprecated.} \item{vignettes}{If \code{FALSE}, do not build or check vignettes, equivalent to using \verb{args = '--ignore-vignettes' and }build_args = '--no-build-vignettes'.} \item{error_on}{Whether to throw an error on \verb{R CMD check} failures. Note that the check is always completed (unless a timeout happens), and the error is only thrown after completion. If \code{"never"}, then no errors are thrown. If \code{"error"}, then only \code{ERROR} failures generate errors. If \code{"warning"}, then \code{WARNING} failures generate errors as well. If \code{"note"}, then any check failure generated an error. Its default can be modified with the \code{RCMDCHECK_ERROR_ON} environment variable. If that is not set, then \code{"never"} is used.} \item{path}{Path to built package.} } \value{ An object containing errors, warnings, and notes. } \description{ \code{check} automatically builds and checks a source package, using all known best practices. \code{check_built} checks an already built package. } \details{ Passing \verb{R CMD check} is essential if you want to submit your package to CRAN: you must not have any ERRORs or WARNINGs, and you want to ensure that there are as few NOTEs as possible. If you are not submitting to CRAN, at least ensure that there are no ERRORs or WARNINGs: these typically represent serious problems. \code{check} automatically builds a package before calling \code{check_built} as this is the recommended way to check packages. Note that this process runs in an independent realisation of R, so nothing in your current workspace will affect the process. } \section{Environment variables}{ Devtools does its best to set up an environment that combines best practices with how check works on CRAN. This includes: \itemize{ \item The standard environment variables set by devtools: \code{\link[=r_env_vars]{r_env_vars()}}. Of particular note for package tests is the \code{NOT_CRAN} env var which lets you know that your tests are not running on CRAN, and hence can take a reasonable amount of time. \item Debugging flags for the compiler, set by \code{\link{compiler_flags}(FALSE)}. \item If \code{aspell} is found \verb{_R_CHECK_CRAN_INCOMING_USE_ASPELL_} is set to \code{TRUE}. If no spell checker is installed, a warning is issued.) \item env vars set by arguments \code{incoming}, \code{remote} and \code{force_suggests} } } \seealso{ \code{\link[=release]{release()}} if you want to send the checked package to CRAN. } devtools/man/uses_testthat.Rd0000644000175000017500000000041014031104013016162 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/test.R \name{uses_testthat} \alias{uses_testthat} \title{Does a package use testthat?} \usage{ uses_testthat(pkg = ".") } \description{ Does a package use testthat? } \keyword{internal} devtools/man/check_man.Rd0000644000175000017500000000143213577154220015223 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/check-doc.R \name{check_man} \alias{check_man} \title{Check documentation, as \verb{R CMD check} does.} \usage{ check_man(pkg = ".") } \arguments{ \item{pkg}{The package to use, can be a file path to the package or a package object. See \code{\link[=as.package]{as.package()}} for more information.} } \value{ Nothing. This function is called purely for it's side effects: if } \description{ This function attempts to run the documentation related checks in the same way that \verb{R CMD check} does. Unfortunately it can't run them all because some tests require the package to be loaded, and the way they attempt to load the code conflicts with how devtools does it. } \examples{ \dontrun{ check_man("mypkg") } } devtools/man/spell_check.Rd0000644000175000017500000000140513705336467015577 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/spell-check.R \name{spell_check} \alias{spell_check} \title{Spell checking} \usage{ spell_check(pkg = ".", vignettes = TRUE, use_wordlist = TRUE) } \arguments{ \item{pkg}{The package to use, can be a file path to the package or a package object. See \code{\link[=as.package]{as.package()}} for more information.} \item{vignettes}{also check all \code{rmd} and \code{rnw} files in the pkg \code{vignettes} folder} \item{use_wordlist}{ignore words in the package \link[spelling:wordlist]{WORDLIST} file} } \description{ Runs a spell check on text fields in the package description file, manual pages, and optionally vignettes. Wraps the \link[spelling:spell_check_package]{spelling} package. } devtools/man/install_deps.Rd0000644000175000017500000000617414033115641015774 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/install.R \name{install_deps} \alias{install_deps} \alias{install_dev_deps} \title{Install package dependencies if needed.} \usage{ install_deps( pkg = ".", dependencies = NA, repos = getOption("repos"), type = getOption("pkgType"), upgrade = c("default", "ask", "always", "never"), quiet = FALSE, build = TRUE, build_opts = c("--no-resave-data", "--no-manual", " --no-build-vignettes"), ... ) install_dev_deps( pkg = ".", dependencies = TRUE, repos = getOption("repos"), type = getOption("pkgType"), upgrade = c("default", "ask", "always", "never"), quiet = FALSE, build = TRUE, build_opts = c("--no-resave-data", "--no-manual", " --no-build-vignettes"), ... ) } \arguments{ \item{pkg}{The package to use, can be a file path to the package or a package object. See \code{\link[=as.package]{as.package()}} for more information.} \item{dependencies}{Which dependencies do you want to check? Can be a character vector (selecting from "Depends", "Imports", "LinkingTo", "Suggests", or "Enhances"), or a logical vector. \code{TRUE} is shorthand for "Depends", "Imports", "LinkingTo" and "Suggests". \code{NA} is shorthand for "Depends", "Imports" and "LinkingTo" and is the default. \code{FALSE} is shorthand for no dependencies (i.e. just check this package, not its dependencies). The value "soft" means the same as \code{TRUE}, "hard" means the same as \code{NA}. You can also specify dependencies from one or more additional fields, common ones include: \itemize{ \item Config/Needs/website - for dependencies used in building the pkgdown site. \item Config/Needs/coverage for dependencies used in calculating test coverage. }} \item{repos}{A character vector giving repositories to use.} \item{type}{Type of package to \code{update}.} \item{upgrade}{Should package dependencies be upgraded? One of "default", "ask", "always", or "never". "default" respects the value of the \code{R_REMOTES_UPGRADE} environment variable if set, and falls back to "ask" if unset. "ask" prompts the user for which out of date packages to upgrade. For non-interactive sessions "ask" is equivalent to "always". \code{TRUE} and \code{FALSE} are also accepted and correspond to "always" and "never" respectively.} \item{quiet}{If \code{TRUE}, suppress output.} \item{build}{if \code{TRUE} \code{\link[pkgbuild:build]{pkgbuild::build()}}s the package first: this ensures that the installation is completely clean, and prevents any binary artefacts (like \file{.o}, \code{.so}) from appearing in your local package directory, but is considerably slower, because every compile has to start from scratch.} \item{build_opts}{Options to pass to \verb{R CMD build}, only used when \code{build} is \code{TRUE}.} \item{...}{additional arguments passed to \code{\link[remotes:install_deps]{remotes::install_deps()}} when installing dependencies.} } \description{ \code{install_deps()} will install the user dependencies needed to run the package, \code{install_dev_deps()} will also install the development dependencies needed to test and build the package. } \examples{ \dontrun{install_deps(".")} } devtools/man/check_rhub.Rd0000644000175000017500000000372514151154613015412 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/r-hub.R \name{check_rhub} \alias{check_rhub} \title{Run CRAN checks for package on R-hub} \usage{ check_rhub( pkg = ".", platforms = NULL, email = NULL, interactive = TRUE, build_args = NULL, ... ) } \arguments{ \item{pkg}{The package to use, can be a file path to the package or a package object. See \code{\link[=as.package]{as.package()}} for more information.} \item{platforms}{R-hub platforms to run the check on. If \code{NULL} uses default list of CRAN checkers (one for each major platform, and one with extra checks if you have compiled code). You can also specify your own, see \code{\link[rhub:platforms]{rhub::platforms()}} for a complete list.} \item{email}{email address to notify, defaults to the maintainer address in the package.} \item{interactive}{whether to show the status of the build interactively. R-hub will send an email to the package maintainer's email address, regardless of whether the check is interactive or not.} \item{build_args}{Arguments passed to \verb{R CMD build}} \item{...}{extra arguments, passed to \code{\link[rhub:check_for_cran]{rhub::check_for_cran()}}.} } \value{ a \code{rhub_check} object. } \description{ It runs \code{\link[=build]{build()}} on the package, with the arguments specified in \code{args}, and then submits it to the R-hub builder at \url{https://builder.r-hub.io}. The \code{interactive} option controls whether the function waits for the check output. Regardless, after the check is complete, R-hub sends an email with the results to the package maintainer. } \section{About email validation on r-hub}{ To build and check R packages on R-hub, you need to validate your email address. This is because R-hub sends out emails about build results. See more at \code{\link[rhub:validate_email]{rhub::validate_email()}}. } \seealso{ Other build functions: \code{\link{check_mac_release}()}, \code{\link{check_win}()} } \concept{build functions} devtools/man/build.Rd0000644000175000017500000000414014031104013014366 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/pkgbuild.R \name{build} \alias{build} \title{Build package} \usage{ build( pkg = ".", path = NULL, binary = FALSE, vignettes = TRUE, manual = FALSE, args = NULL, quiet = FALSE, ... ) } \arguments{ \item{pkg}{The package to use, can be a file path to the package or a package object. See \code{\link[=as.package]{as.package()}} for more information.} \item{path}{Path in which to produce package. If \code{NULL}, defaults to the parent directory of the package.} \item{binary}{Produce a binary (\code{--binary}) or source ( \code{--no-manual --no-resave-data}) version of the package.} \item{vignettes}{For source packages: if \code{FALSE}, don't build PDF vignettes (\code{--no-build-vignettes}) or manual (\code{--no-manual}).} \item{manual}{For source packages: if \code{FALSE}, don't build PDF vignettes (\code{--no-build-vignettes}) or manual (\code{--no-manual}).} \item{args}{An optional character vector of additional command line arguments to be passed to \verb{R CMD build} if \code{binary = FALSE}, or \verb{R CMD install} if \code{binary = TRUE}.} \item{quiet}{if \code{TRUE} suppresses output from this function.} \item{...}{Additional arguments passed to \link[pkgbuild:build]{pkgbuild::build}.} } \value{ a string giving the location (including file name) of the built package } \description{ Building converts a package source directory into a single bundled file. If \code{binary = FALSE} this creates a \code{tar.gz} package that can be installed on any platform, provided they have a full development environment (although packages without source code can typically be installed out of the box). If \code{binary = TRUE}, the package will have a platform specific extension (e.g. \code{.zip} for windows), and will only be installable on the current platform, but no development environment is needed. } \note{ The default \code{manual = FALSE} is not suitable for a CRAN submission, which may require \code{manual = TRUE}. Even better, use \code{\link[=submit_cran]{submit_cran()}} or \code{\link[=release]{release()}}. } devtools/man/check_mac_release.Rd0000644000175000017500000000256514151154613016713 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/check-mac.R \name{check_mac_release} \alias{check_mac_release} \title{Check macOS package} \usage{ check_mac_release( pkg = ".", dep_pkgs = ".", args = NULL, manual = TRUE, quiet = FALSE, ... ) } \arguments{ \item{pkg}{The package to use, can be a file path to the package or a package object. See \code{\link[=as.package]{as.package()}} for more information.} \item{dep_pkgs}{Additional custom dependencies to install prior to checking the package.} \item{args}{An optional character vector of additional command line arguments to be passed to \verb{R CMD build} if \code{binary = FALSE}, or \verb{R CMD install} if \code{binary = TRUE}.} \item{manual}{For source packages: if \code{FALSE}, don't build PDF vignettes (\code{--no-build-vignettes}) or manual (\code{--no-manual}).} \item{quiet}{If \code{TRUE}, suppresses output.} \item{...}{Additional arguments passed to \code{\link[pkgbuild:build]{pkgbuild::build()}}.} } \value{ The url with the check results (invisibly) } \description{ This function works by bundling source package, and then uploading to \url{https://mac.r-project.org/macbuilder/submit.html}. This function returns a link to the page with the check results. } \seealso{ Other build functions: \code{\link{check_rhub}()}, \code{\link{check_win}()} } \concept{build functions} devtools/man/install.Rd0000644000175000017500000001063514042601670014760 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/install.R \name{install} \alias{install} \title{Install a local development package.} \usage{ install( pkg = ".", reload = TRUE, quick = FALSE, build = !quick, args = getOption("devtools.install.args"), quiet = FALSE, dependencies = NA, upgrade = "default", build_vignettes = FALSE, keep_source = getOption("keep.source.pkgs"), force = FALSE, ... ) } \arguments{ \item{pkg}{The package to use, can be a file path to the package or a package object. See \code{\link[=as.package]{as.package()}} for more information.} \item{reload}{if \code{TRUE} (the default), will automatically reload the package after installing.} \item{quick}{if \code{TRUE} skips docs, multiple-architectures, demos, and vignettes, to make installation as fast as possible.} \item{build}{if \code{TRUE} \code{\link[pkgbuild:build]{pkgbuild::build()}}s the package first: this ensures that the installation is completely clean, and prevents any binary artefacts (like \file{.o}, \code{.so}) from appearing in your local package directory, but is considerably slower, because every compile has to start from scratch.} \item{args}{An optional character vector of additional command line arguments to be passed to \verb{R CMD INSTALL}. This defaults to the value of the option \code{"devtools.install.args"}.} \item{quiet}{If \code{TRUE}, suppress output.} \item{dependencies}{Which dependencies do you want to check? Can be a character vector (selecting from "Depends", "Imports", "LinkingTo", "Suggests", or "Enhances"), or a logical vector. \code{TRUE} is shorthand for "Depends", "Imports", "LinkingTo" and "Suggests". \code{NA} is shorthand for "Depends", "Imports" and "LinkingTo" and is the default. \code{FALSE} is shorthand for no dependencies (i.e. just check this package, not its dependencies). The value "soft" means the same as \code{TRUE}, "hard" means the same as \code{NA}. You can also specify dependencies from one or more additional fields, common ones include: \itemize{ \item Config/Needs/website - for dependencies used in building the pkgdown site. \item Config/Needs/coverage for dependencies used in calculating test coverage. }} \item{upgrade}{Should package dependencies be upgraded? One of "default", "ask", "always", or "never". "default" respects the value of the \code{R_REMOTES_UPGRADE} environment variable if set, and falls back to "ask" if unset. "ask" prompts the user for which out of date packages to upgrade. For non-interactive sessions "ask" is equivalent to "always". \code{TRUE} and \code{FALSE} are also accepted and correspond to "always" and "never" respectively.} \item{build_vignettes}{if \code{TRUE}, will build vignettes. Normally it is \code{build} that's responsible for creating vignettes; this argument makes sure vignettes are built even if a build never happens (i.e. because \code{build = FALSE}).} \item{keep_source}{If \code{TRUE} will keep the srcrefs from an installed package. This is useful for debugging (especially inside of RStudio). It defaults to the option \code{"keep.source.pkgs"}.} \item{force}{Force installation, even if the remote state has not changed since the previous install.} \item{...}{additional arguments passed to \code{\link[remotes:install_deps]{remotes::install_deps()}} when installing dependencies.} } \description{ Uses \verb{R CMD INSTALL} to install the package. Will also try to install dependencies of the package from CRAN, if they're not already installed. } \details{ If \code{quick = TRUE}, installation takes place using the current package directory. If you have compiled code, this means that artefacts of compilation will be created in the \verb{src/} directory. If you want to avoid this, you can use \code{build = TRUE} to first build a package bundle and then install it from a temporary directory. This is slower, but keeps the source directory pristine. If the package is loaded, it will be reloaded after installation. This is not always completely possible, see \code{\link[=reload]{reload()}} for caveats. To install a package in a non-default library, use \code{\link[withr:with_libpaths]{withr::with_libpaths()}}. } \seealso{ \code{\link[=update_packages]{update_packages()}} to update installed packages from the source location and \code{\link[=with_debug]{with_debug()}} to install packages with debugging flags set. Other package installation: \code{\link{uninstall}()} } \concept{package installation} devtools/man/reload.Rd0000644000175000017500000000221013536443710014554 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/reload.R \name{reload} \alias{reload} \title{Unload and reload package.} \usage{ reload(pkg = ".", quiet = FALSE) } \arguments{ \item{pkg}{The package to use, can be a file path to the package or a package object. See \code{\link[=as.package]{as.package()}} for more information.} \item{quiet}{if \code{TRUE} suppresses output from this function.} } \description{ This attempts to unload and reload an \emph{installed} package. If the package is not loaded already, it does nothing. It's not always possible to cleanly unload a package: see the caveats in \code{\link[=unload]{unload()}} for some of the potential failure points. If in doubt, restart R and reload the package with \code{\link[=library]{library()}}. } \examples{ \dontrun{ # Reload package that is in current directory reload(".") # Reload package that is in ./ggplot2/ reload("ggplot2/") # Can use inst() to find the package path # This will reload the installed ggplot2 package reload(pkgload::inst("ggplot2")) } } \seealso{ \code{\link[=load_all]{load_all()}} to load a package for interactive development. } devtools/man/build_rmd.Rd0000644000175000017500000000226713643625021015257 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/build-readme.R \name{build_rmd} \alias{build_rmd} \alias{build_readme} \title{Build a Rmarkdown files package} \usage{ build_rmd(files, path = ".", output_options = list(), ..., quiet = TRUE) build_readme(path = ".", quiet = TRUE, ...) } \arguments{ \item{files}{The Rmarkdown files to be rendered.} \item{path}{path to the package to build the readme.} \item{output_options}{List of output options that can override the options specified in metadata (e.g. could be used to force \code{self_contained} or \code{mathjax = "local"}). Note that this is only valid when the output format is read from metadata (i.e. not a custom format object passed to \code{output_format}).} \item{...}{additional arguments passed to \code{\link[rmarkdown:render]{rmarkdown::render()}}} \item{quiet}{If \code{TRUE}, suppress output.} } \description{ \code{build_rmd()} is a wrapper around \code{\link[rmarkdown:render]{rmarkdown::render()}} that first installs a temporary copy of the package, and then renders each \code{.Rmd} in a clean R session. \code{build_readme()} locates your \code{README.Rmd} and builds it into a \code{README.md} } devtools/man/loaded_packages.Rd0000644000175000017500000000064613532242644016406 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/session-info.R \name{loaded_packages} \alias{loaded_packages} \title{Return a vector of names of attached packages} \usage{ loaded_packages() } \value{ A data frame with columns package and path, giving the name of each package and the path it was loaded from. } \description{ Return a vector of names of attached packages } \keyword{internal} devtools/man/dev_packages.Rd0000644000175000017500000000047213532242644015731 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/session-info.R \name{dev_packages} \alias{dev_packages} \title{Return a vector of names of packages loaded by devtools} \usage{ dev_packages() } \description{ Return a vector of names of packages loaded by devtools } \keyword{internal} devtools/man/run_examples.Rd0000644000175000017500000000360613705571651016026 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/run-examples.R \name{run_examples} \alias{run_examples} \title{Run all examples in a package.} \usage{ run_examples( pkg = ".", start = NULL, show = TRUE, run_donttest = FALSE, run_dontrun = FALSE, fresh = FALSE, document = TRUE, run, test ) } \arguments{ \item{pkg}{The package to use, can be a file path to the package or a package object. See \code{\link[=as.package]{as.package()}} for more information.} \item{start}{Where to start running the examples: this can either be the name of \code{Rd} file to start with (with or without extensions), or a topic name. If omitted, will start with the (lexicographically) first file. This is useful if you have a lot of examples and don't want to rerun them every time you fix a problem.} \item{show}{DEPRECATED.} \item{run_donttest}{if \code{TRUE}, do run \verb{\\donttest} sections in the Rd files. out.} \item{run_dontrun}{if \code{TRUE}, do run \verb{\\dontrun} sections in the Rd files.} \item{fresh}{if \code{TRUE}, will be run in a fresh R session. This has the advantage that there's no way the examples can depend on anything in the current session, but interactive code (like \code{\link[=browser]{browser()}}) won't work.} \item{document}{if \code{TRUE}, \code{\link[=document]{document()}} will be run to ensure examples are updated before running them.} \item{run}{Deprecated, see \code{run_dontrun} and \code{run_donttest} above.} \item{test}{Deprecated, see \code{run_dontrun} and \code{run_donttest} above.} } \description{ One of the most frustrating parts of \verb{R CMD check} is getting all of your examples to pass - whenever one fails you need to fix the problem and then restart the whole process. This function makes it a little easier by making it possible to run all examples from an R function. } \concept{example functions} \keyword{programming} devtools/man/devtools.Rd0000644000175000017500000000337214151174367015162 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/zzz.R \docType{package} \name{devtools} \alias{devtools} \alias{devtools-package} \title{Package development tools for R.} \description{ Collection of package development tools. } \section{Package options}{ Devtools uses the following \code{\link[=options]{options()}} to configure behaviour: \itemize{ \item \code{devtools.path}: path to use for \code{\link[=dev_mode]{dev_mode()}} \item \code{devtools.name}: your name, used when signing draft emails. \item \code{devtools.install.args}: a string giving extra arguments passed to \verb{R CMD install} by \code{\link[=install]{install()}}. \item \code{devtools.desc.author}: a string providing a default Authors@R string to be used in new \file{DESCRIPTION}s. Should be a R code, and look like \code{"Hadley Wickham [aut, cre]"}. See \code{\link[utils:person]{utils::as.person()}} for more details. \item \code{devtools.desc.license}: a default license string to use for new packages. \item \code{devtools.desc.suggests}: a character vector listing packages to to add to suggests by defaults for new packages. \item \code{devtools.desc}: a named list listing any other extra options to add to \file{DESCRIPTION} } } \seealso{ Useful links: \itemize{ \item \url{https://devtools.r-lib.org/} \item \url{https://github.com/r-lib/devtools} \item Report bugs at \url{https://github.com/r-lib/devtools/issues} } } \author{ \strong{Maintainer}: Jennifer Bryan \email{jenny@rstudio.com} (\href{https://orcid.org/0000-0002-6983-2759}{ORCID}) Authors: \itemize{ \item Hadley Wickham \item Jim Hester \item Winston Chang } Other contributors: \itemize{ \item RStudio [copyright holder, funder] } } \keyword{internal} devtools/man/load_all.Rd0000644000175000017500000001012014033115641015044 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/pkgload.R \name{load_all} \alias{load_all} \title{Load complete package} \usage{ load_all( path = ".", reset = TRUE, recompile = FALSE, export_all = TRUE, helpers = TRUE, quiet = FALSE, ... ) } \arguments{ \item{path}{Path to a package, or within a package.} \item{reset}{clear package environment and reset file cache before loading any pieces of the package. This largely equivalent to running \code{\link[pkgload:unload]{unload()}}, however the old namespaces are not completely removed and no \code{.onUnload()} hooks are called. Use \code{reset = FALSE} may be faster for large code bases, but is a significantly less accurate approximation.} \item{recompile}{DEPRECATED. force a recompile of DLL from source code, if present. This is equivalent to running \code{\link[pkgbuild:clean_dll]{pkgbuild::clean_dll()}} before \code{load_all}} \item{export_all}{If \code{TRUE} (the default), export all objects. If \code{FALSE}, export only the objects that are listed as exports in the NAMESPACE file.} \item{helpers}{if \code{TRUE} loads \pkg{testthat} test helpers.} \item{quiet}{if \code{TRUE} suppresses output from this function.} \item{...}{Additional arguments passed to \code{\link[pkgload:load_all]{pkgload::load_all()}}.} } \description{ \code{load_all} loads a package. It roughly simulates what happens when a package is installed and loaded with \code{\link[=library]{library()}}. } \details{ Currently \code{load_all}: \itemize{ \item Loads all data files in \verb{data/}. See \code{\link[pkgload:load_data]{load_data()}} for more details. \item Sources all R files in the R directory, storing results in environment that behaves like a regular package namespace. See below and \code{\link[pkgload:load_code]{load_code()}} for more details. \item Compiles any C, C++, or Fortran code in the \verb{src/} directory and connects the generated DLL into R. See \code{pkgload::compile_dll()} for more details. \item Runs \code{.onAttach()}, \code{.onLoad()} and \code{.onUnload()} functions at the correct times. \item If you use \pkg{testthat}, will load all test helpers so you can access them interactively. devtools sets the \code{DEVTOOLS_LOAD} environment variable to \code{"true"} to let you check whether the helpers are run during package loading. } } \section{Namespaces}{ The namespace environment \verb{}, is a child of the imports environment, which has the name attribute \code{imports:pkgname}. It is in turn is a child of \verb{}, which is a child of the global environment. (There is also a copy of the base namespace that is a child of the empty environment.) The package environment \verb{} is an ancestor of the global environment. Normally when loading a package, the objects listed as exports in the NAMESPACE file are copied from the namespace to the package environment. However, \code{load_all} by default will copy all objects (not just the ones listed as exports) to the package environment. This is useful during development because it makes all objects easy to access. To export only the objects listed as exports, use \code{export_all=FALSE}. This more closely simulates behavior when loading an installed package with \code{\link[=library]{library()}}, and can be useful for checking for missing exports. } \section{Shim files}{ \code{load_all} also inserts shim functions into the imports environment of the loaded package. It presently adds a replacement version of \code{system.file} which returns different paths from \code{base::system.file}. This is needed because installed and uninstalled package sources have different directory structures. Note that this is not a perfect replacement for \code{base::system.file}. } \examples{ \dontrun{ # Load the package in the current directory load_all("./") # Running again loads changed files load_all("./") # With reset=TRUE, unload and reload the package for a clean start load_all("./", TRUE) # With export_all=FALSE, only objects listed as exports in NAMESPACE # are exported load_all("./", export_all = FALSE) } } devtools/man/uninstall.Rd0000644000175000017500000000213713577154220015327 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/uninstall.R \name{uninstall} \alias{uninstall} \title{Uninstall a local development package.} \usage{ uninstall(pkg = ".", unload = TRUE, quiet = FALSE, lib = .libPaths()[[1]]) } \arguments{ \item{pkg}{The package to use, can be a file path to the package or a package object. See \code{\link[=as.package]{as.package()}} for more information.} \item{unload}{if \code{TRUE} (the default), will automatically unload the package prior to uninstalling.} \item{quiet}{If \code{TRUE}, suppress output.} \item{lib}{a character vector giving the library directories to remove the packages from. If missing, defaults to the first element in \code{\link{.libPaths}()}.} } \description{ Uses \code{remove.package} to uninstall the package. To uninstall a package from a non-default library, use \code{\link[withr:with_libpaths]{withr::with_libpaths()}}. } \seealso{ \code{\link[=with_debug]{with_debug()}} to install packages with debugging flags set. Other package installation: \code{\link{install}()} } \concept{package installation} devtools/man/remote-reexports.Rd0000644000175000017500000001413013705571551016641 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/remotes.R \name{remote-reexports} \alias{remote-reexports} \alias{install_bioc} \alias{install_bitbucket} \alias{install_cran} \alias{install_dev} \alias{install_git} \alias{install_github} \alias{install_gitlab} \alias{install_local} \alias{install_svn} \alias{install_url} \alias{install_version} \alias{update_packages} \alias{dev_package_deps} \title{Functions re-exported from the remotes package} \usage{ install_bioc( repo, mirror = getOption("BioC_git", download_url("git.bioconductor.org/packages")), git = c("auto", "git2r", "external"), dependencies = NA, upgrade = c("default", "ask", "always", "never"), force = FALSE, quiet = FALSE, build = TRUE, build_opts = c("--no-resave-data", "--no-manual", "--no-build-vignettes"), build_manual = FALSE, build_vignettes = FALSE, repos = getOption("repos"), type = getOption("pkgType"), ... ) install_bitbucket( repo, ref = "HEAD", subdir = NULL, auth_user = bitbucket_user(), password = bitbucket_password(), host = "api.bitbucket.org/2.0", dependencies = NA, upgrade = c("default", "ask", "always", "never"), force = FALSE, quiet = FALSE, build = TRUE, build_opts = c("--no-resave-data", "--no-manual", "--no-build-vignettes"), build_manual = FALSE, build_vignettes = FALSE, repos = getOption("repos"), type = getOption("pkgType"), ... ) install_cran( pkgs, repos = getOption("repos"), type = getOption("pkgType"), dependencies = NA, upgrade = c("default", "ask", "always", "never"), force = FALSE, quiet = FALSE, build = TRUE, build_opts = c("--no-resave-data", "--no-manual", "--no-build-vignettes"), build_manual = FALSE, build_vignettes = FALSE, ... ) install_dev(package, cran_url = getOption("repos")[["CRAN"]], ...) install_git( url, subdir = NULL, ref = NULL, branch = NULL, credentials = git_credentials(), git = c("auto", "git2r", "external"), dependencies = NA, upgrade = c("default", "ask", "always", "never"), force = FALSE, quiet = FALSE, build = TRUE, build_opts = c("--no-resave-data", "--no-manual", "--no-build-vignettes"), build_manual = FALSE, build_vignettes = FALSE, repos = getOption("repos"), type = getOption("pkgType"), ... ) install_github( repo, ref = "HEAD", subdir = NULL, auth_token = github_pat(quiet), host = "api.github.com", dependencies = NA, upgrade = c("default", "ask", "always", "never"), force = FALSE, quiet = FALSE, build = TRUE, build_opts = c("--no-resave-data", "--no-manual", "--no-build-vignettes"), build_manual = FALSE, build_vignettes = FALSE, repos = getOption("repos"), type = getOption("pkgType"), ... ) install_gitlab( repo, subdir = NULL, auth_token = gitlab_pat(quiet), host = "gitlab.com", dependencies = NA, upgrade = c("default", "ask", "always", "never"), force = FALSE, quiet = FALSE, build = TRUE, build_opts = c("--no-resave-data", "--no-manual", "--no-build-vignettes"), build_manual = FALSE, build_vignettes = FALSE, repos = getOption("repos"), type = getOption("pkgType"), ... ) install_local( path = ".", subdir = NULL, dependencies = NA, upgrade = c("default", "ask", "always", "never"), force = FALSE, quiet = FALSE, build = !is_binary_pkg(path), build_opts = c("--no-resave-data", "--no-manual", "--no-build-vignettes"), build_manual = FALSE, build_vignettes = FALSE, repos = getOption("repos"), type = getOption("pkgType"), ... ) install_svn( url, subdir = NULL, args = character(0), revision = NULL, dependencies = NA, upgrade = c("default", "ask", "always", "never"), force = FALSE, quiet = FALSE, build = TRUE, build_opts = c("--no-resave-data", "--no-manual", "--no-build-vignettes"), build_manual = FALSE, build_vignettes = FALSE, repos = getOption("repos"), type = getOption("pkgType"), ... ) install_url( url, subdir = NULL, dependencies = NA, upgrade = c("default", "ask", "always", "never"), force = FALSE, quiet = FALSE, build = TRUE, build_opts = c("--no-resave-data", "--no-manual", "--no-build-vignettes"), build_manual = FALSE, build_vignettes = FALSE, repos = getOption("repos"), type = getOption("pkgType"), ... ) install_version( package, version = NULL, dependencies = NA, upgrade = c("default", "ask", "always", "never"), force = FALSE, quiet = FALSE, build = FALSE, build_opts = c("--no-resave-data", "--no-manual", "--no-build-vignettes"), build_manual = FALSE, build_vignettes = FALSE, repos = getOption("repos"), type = "source", ... ) update_packages( packages = TRUE, dependencies = NA, upgrade = c("default", "ask", "always", "never"), force = FALSE, quiet = FALSE, build = TRUE, build_opts = c("--no-resave-data", "--no-manual", "--no-build-vignettes"), build_manual = FALSE, build_vignettes = FALSE, repos = getOption("repos"), type = getOption("pkgType"), ... ) dev_package_deps( pkgdir = ".", dependencies = NA, repos = getOption("repos"), type = getOption("pkgType") ) } \description{ These functions are re-exported from the remotes package. They differ only that the ones in devtools use the \link{ellipsis} package to ensure all dotted arguments are used. } \details{ Follow the links below to see the documentation. \code{\link[remotes:install_bioc]{remotes::install_bioc()}}, \code{\link[remotes:install_bitbucket]{remotes::install_bitbucket()}}, \code{\link[remotes:install_cran]{remotes::install_cran()}}, \code{\link[remotes:install_dev]{remotes::install_dev()}}, \code{\link[remotes:install_git]{remotes::install_git()}}, \code{\link[remotes:install_github]{remotes::install_github()}}, \code{\link[remotes:install_gitlab]{remotes::install_gitlab()}}, \code{\link[remotes:install_local]{remotes::install_local()}}, \code{\link[remotes:install_svn]{remotes::install_svn()}}, \code{\link[remotes:install_url]{remotes::install_url()}}, \code{\link[remotes:install_version]{remotes::install_version()}}, \code{\link[remotes:update_packages]{remotes::update_packages()}}, \code{\link[remotes:package_deps]{remotes::dev_package_deps()}}. } \keyword{internal} devtools/man/wd.Rd0000644000175000017500000000073213536443710013727 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/wd.R \name{wd} \alias{wd} \title{Set working directory.} \usage{ wd(pkg = ".", path = "") } \arguments{ \item{pkg}{The package to use, can be a file path to the package or a package object. See \code{\link[=as.package]{as.package()}} for more information.} \item{path}{path within package. Leave empty to change working directory to package directory.} } \description{ Set working directory. } devtools/man/revdep.Rd0000644000175000017500000000277314031104013014566 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/revdep.R \name{revdep} \alias{revdep} \alias{revdep_maintainers} \title{Reverse dependency tools.} \usage{ revdep( pkg, dependencies = c("Depends", "Imports", "Suggests", "LinkingTo"), recursive = FALSE, ignore = NULL, bioconductor = FALSE ) revdep_maintainers(pkg = ".") } \arguments{ \item{pkg}{Package name. This is unlike most devtools packages which take a path because you might want to determine dependencies for a package that you don't have installed. If omitted, defaults to the name of the current package.} \item{dependencies}{A character vector listing the types of dependencies to follow.} \item{recursive}{If \code{TRUE} look for full set of recursive dependencies.} \item{ignore}{A character vector of package names to ignore. These packages will not appear in returned vector.} \item{bioconductor}{If \code{TRUE} also look for dependencies amongst Bioconductor packages.} } \description{ Tools to check and notify maintainers of all CRAN and Bioconductor packages that depend on the specified package. } \details{ The first run in a session will be time-consuming because it must download all package metadata from CRAN and Bioconductor. Subsequent runs will be faster. } \examples{ \dontrun{ revdep("ggplot2") revdep("ggplot2", ignore = c("xkcd", "zoo")) } } \seealso{ The \href{https://github.com/r-lib/revdepcheck}{revdepcheck} package can be used to run R CMD check on all reverse dependencies. } \keyword{internal} devtools/man/submit_cran.Rd0000644000175000017500000000155613577154220015630 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/release.R \name{submit_cran} \alias{submit_cran} \title{Submit a package to CRAN.} \usage{ submit_cran(pkg = ".", args = NULL) } \arguments{ \item{pkg}{The package to use, can be a file path to the package or a package object. See \code{\link[=as.package]{as.package()}} for more information.} \item{args}{An optional character vector of additional command line arguments to be passed to \verb{R CMD build}.} } \description{ This uses the new CRAN web-form submission process. After submission, you will receive an email asking you to confirm submission - this is used to check that the package is submitted by the maintainer. } \details{ It's recommended that you use \code{\link[=release]{release()}} rather than this function as it performs more checks prior to submission. } \keyword{internal} devtools/man/git_checks.Rd0000644000175000017500000000077213536443710015424 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/check-git.R \name{git_checks} \alias{git_checks} \title{Git checks.} \usage{ git_checks(pkg = ".") } \arguments{ \item{pkg}{The package to use, can be a file path to the package or a package object. See \code{\link[=as.package]{as.package()}} for more information.} } \description{ This function performs Git checks checks prior to release. It is called automatically by \code{\link[=release]{release()}}. } \keyword{internal} devtools/man/build_manual.Rd0000644000175000017500000000111513536443710015745 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/build-manual.R \name{build_manual} \alias{build_manual} \title{Create package pdf manual} \usage{ build_manual(pkg = ".", path = NULL) } \arguments{ \item{pkg}{The package to use, can be a file path to the package or a package object. See \code{\link[=as.package]{as.package()}} for more information.} \item{path}{path in which to produce package manual. If \code{NULL}, defaults to the parent directory of the package.} } \description{ Create package pdf manual } \seealso{ \code{\link[=Rd2pdf]{Rd2pdf()}} } devtools/man/bash.Rd0000644000175000017500000000062413536443710014232 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/bash.R \name{bash} \alias{bash} \title{Open bash shell in package directory.} \usage{ bash(pkg = ".") } \arguments{ \item{pkg}{The package to use, can be a file path to the package or a package object. See \code{\link[=as.package]{as.package()}} for more information.} } \description{ Open bash shell in package directory. } devtools/man/document.Rd0000644000175000017500000000173513577154220015137 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/document.R \name{document} \alias{document} \title{Use roxygen to document a package.} \usage{ document(pkg = ".", roclets = NULL, quiet = FALSE) } \arguments{ \item{pkg}{The package to use, can be a file path to the package or a package object. See \code{\link[=as.package]{as.package()}} for more information.} \item{roclets}{Character vector of roclet names to use with package. The default, \code{NULL}, uses the roxygen \code{roclets} option, which defaults to \code{c("collate", "namespace", "rd")}.} \item{quiet}{if \code{TRUE} suppresses output from this function.} } \description{ This function is a wrapper for the \code{\link[roxygen2:roxygenize]{roxygen2::roxygenize()}} function from the roxygen2 package. See the documentation and vignettes of that package to learn how to use roxygen. } \seealso{ \code{\link[roxygen2:roxygenize]{roxygen2::roxygenize()}}, \code{browseVignettes("roxygen2")} } devtools/man/dev_mode.Rd0000644000175000017500000000150113532242644015071 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/dev-mode.R \name{dev_mode} \alias{dev_mode} \title{Activate and deactivate development mode.} \usage{ dev_mode(on = NULL, path = getOption("devtools.path")) } \arguments{ \item{on}{turn dev mode on (\code{TRUE}) or off (\code{FALSE}). If omitted will guess based on whether or not \code{path} is in \code{\link[=.libPaths]{.libPaths()}}} \item{path}{directory to library.} } \description{ When activated, \code{dev_mode} creates a new library for storing installed packages. This new library is automatically created when \code{dev_mode} is activated if it does not already exist. This allows you to test development packages in a sandbox, without interfering with the other packages you have installed. } \examples{ \dontrun{ dev_mode() dev_mode() } } devtools/man/r_env_vars.Rd0000644000175000017500000000120413532242644015453 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/R.R \name{r_env_vars} \alias{r_env_vars} \title{Environment variables to set when calling R} \usage{ r_env_vars() } \value{ a named character vector } \description{ Devtools sets a number of environmental variables to ensure consistent between the current R session and the new session, and to ensure that everything behaves the same across systems. It also suppresses a common warning on windows, and sets \code{NOT_CRAN} so you can tell that your code is not running on CRAN. If \code{NOT_CRAN} has been set externally, it is not overwritten. } \keyword{internal} devtools/man/has_tests.Rd0000644000175000017500000000040413532242644015305 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/has-tests.R \name{has_tests} \alias{has_tests} \title{Was devtools installed with tests?} \usage{ has_tests() } \description{ Was devtools installed with tests? } \keyword{internal} devtools/man/dev_sitrep.Rd0000644000175000017500000000213313536443710015456 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/sitrep.R \name{dev_sitrep} \alias{dev_sitrep} \title{Report package development situation} \usage{ dev_sitrep(pkg = ".", debug = FALSE) } \arguments{ \item{pkg}{The package to use, can be a file path to the package or a package object. See \code{\link[=as.package]{as.package()}} for more information.} \item{debug}{If \code{TRUE}, will print out extra information useful for debugging. If \code{FALSE}, it will use result cached from a previous run.} } \value{ A named list, with S3 class \code{dev_sitrep} (for printing purposes). } \description{ \code{dev_sitrep()} reports \itemize{ \item If R is up to date \item If RStudio is up to date \item If compiler build tools are installed and available for use \item If devtools and its dependencies are up to date \item If the package's dependencies are up to date } Call this function if things seem weird and you're not sure what's wrong or how to fix it. If this function returns no output everything should be ready for package development. } \examples{ \dontrun{ dev_sitrep() } } devtools/man/check_win.Rd0000644000175000017500000000416114151154613015242 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/check-win.R \name{check_win} \alias{check_win} \alias{check_win_devel} \alias{check_win_release} \alias{check_win_oldrelease} \title{Build windows binary package.} \usage{ check_win_devel( pkg = ".", args = NULL, manual = TRUE, email = NULL, quiet = FALSE, ... ) check_win_release( pkg = ".", args = NULL, manual = TRUE, email = NULL, quiet = FALSE, ... ) check_win_oldrelease( pkg = ".", args = NULL, manual = TRUE, email = NULL, quiet = FALSE, ... ) } \arguments{ \item{pkg}{The package to use, can be a file path to the package or a package object. See \code{\link[=as.package]{as.package()}} for more information.} \item{args}{An optional character vector of additional command line arguments to be passed to \verb{R CMD build} if \code{binary = FALSE}, or \verb{R CMD install} if \code{binary = TRUE}.} \item{manual}{For source packages: if \code{FALSE}, don't build PDF vignettes (\code{--no-build-vignettes}) or manual (\code{--no-manual}).} \item{email}{An alternative email to use, default \code{NULL} uses the package Maintainer's email.} \item{quiet}{If \code{TRUE}, suppresses output.} \item{...}{Additional arguments passed to \code{\link[pkgbuild:build]{pkgbuild::build()}}.} } \description{ This function works by bundling source package, and then uploading to \url{https://win-builder.r-project.org/}. Once building is complete you'll receive a link to the built package in the email address listed in the maintainer field. It usually takes around 30 minutes. As a side effect, win-build also runs \verb{R CMD check} on the package, so \code{check_win} is also useful to check that your package is ok on windows. } \section{Functions}{ \itemize{ \item \code{check_win_devel}: Check package on the development version of R. \item \code{check_win_release}: Check package on the release version of R. \item \code{check_win_oldrelease}: Check package on the previous major release version of R. }} \seealso{ Other build functions: \code{\link{check_mac_release}()}, \code{\link{check_rhub}()} } \concept{build functions} devtools/man/figures/0000755000175000017500000000000014030366260014462 5ustar nileshnileshdevtools/man/figures/logo.svg0000644000175000017500000001623513536443710016160 0ustar nileshnileshdevtoolsdevtools/man/create.Rd0000644000175000017500000000146314042601670014554 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/create.R \name{create} \alias{create} \title{Create a package} \usage{ create(path, ..., open = FALSE) } \arguments{ \item{path}{A path. If it exists, it is used. If it does not exist, it is created, provided that the parent path exists.} \item{...}{Additional arguments passed to \code{\link[usethis:create_package]{usethis::create_package()}}} \item{open}{If \code{TRUE}, \link[usethis:proj_activate]{activates} the new project: \itemize{ \item If RStudio desktop, the package is opened in a new session. \item If on RStudio server, the current RStudio project is activated. \item Otherwise, the working directory and active project is changed. }} } \value{ The path to the created package, invisibly. } \description{ Create a package } devtools/man/build_site.Rd0000644000175000017500000000114213532242644015433 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/build-site.R \name{build_site} \alias{build_site} \title{Execute \pkg{pkgdown} build_site in a package} \usage{ build_site(path = ".", quiet = TRUE, ...) } \arguments{ \item{path}{path to the package to build the static HTML.} \item{quiet}{If \code{TRUE}, suppress output.} \item{...}{additional arguments passed to \code{\link[pkgdown:build_site]{pkgdown::build_site()}}} } \description{ \code{build_site()} is a shortcut for \code{\link[pkgdown:build_site]{pkgdown::build_site()}}, it generates the static HTML documentation. } devtools/man/release_checks.Rd0000644000175000017500000000106213536443710016252 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/check-devtools.R \name{release_checks} \alias{release_checks} \title{Custom devtools release checks.} \usage{ release_checks(pkg = ".", built_path = NULL) } \arguments{ \item{pkg}{The package to use, can be a file path to the package or a package object. See \code{\link[=as.package]{as.package()}} for more information.} } \description{ This function performs additional checks prior to release. It is called automatically by \code{\link[=release]{release()}}. } \keyword{internal} devtools/vignettes/0000755000175000017500000000000014151174560014257 5ustar nileshnileshdevtools/vignettes/dependencies.Rmd0000644000175000017500000000642414145521433017355 0ustar nileshnilesh--- title: "Devtools dependencies" author: "Jim Hester, Hadley Wickham" date: "`r Sys.Date()`" output: rmarkdown::html_vignette: keep_md: true vignette: > %\VignetteIndexEntry{Devtools dependencies} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- # Package remotes Devtools version 1.9 supports package dependency installation for packages not yet in a standard package repository such as [CRAN](https://cran.r-project.org) or [Bioconductor](http://bioconductor.org). You can mark any regular dependency defined in the `Depends`, `Imports`, `Suggests` or `Enhances` fields as being installed from a remote location by adding the remote location to `Remotes` in your `DESCRIPTION` file. This will cause devtools to download and install them prior to installing your package (so they won't be installed from CRAN). The remote dependencies specified in `Remotes` should be described in the following form. ``` Remotes: [type::], [type2::] ``` The `type` is an optional parameter. If the type is missing the default is to install from GitHub. Additional remote dependencies should be separated by commas, just like normal dependencies elsewhere in the `DESCRIPTION` file. It is important to remember that you **must always declare the dependency in the usual way**, i.e. include it in `Depends`, `Imports`, `Suggests` or `Enhances`. The `Remotes` field only provides instructions on where to install the dependency from. In this example `DESCRIPTION` file, note how rlang appears in `Imports` and in `Remotes`: ``` Package: xyz Title: What the Package Does (One Line, Title Case) Version: 0.0.0.9000 Authors@R: person(given = "First", family = "Last", role = c("aut", "cre"), email = "first.last@example.com") Description: What the package does (one paragraph). License: MIT + file LICENSE Imports: rlang Remotes: r-lib/rlang ``` ### GitHub Because GitHub is the most commonly used unofficial package distribution in R, it's the default: ```yaml Remotes: hadley/testthat ``` You can also specify a specific hash, tag, or pull request (using the same syntax as `install_github()` if you want a particular commit. Otherwise the latest commit on the HEAD of the branch is used. ```yaml Remotes: hadley/httr@v0.4, klutometis/roxygen#142, hadley/testthat@c67018fa4970 ``` A type of `github` can be specified, but is not required ```yaml Remotes: github::hadley/ggplot2 ``` ### Other sources All of the currently supported install sources are available, see the 'See Also' section in `?install` for a complete list. ```yaml # GitLab Remotes: gitlab::jimhester/covr # Git Remotes: git::git@bitbucket.org:djnavarro/lsr.git # Bitbucket Remotes: bitbucket::sulab/mygene.r@default, djnavarro/lsr # Bioconductor Remotes: bioc::3.3/SummarizedExperiment#117513, bioc::release/Biobase # SVN Remotes: svn::https://github.com/tidyverse/stringr # URL Remotes: url::https://github.com/tidyverse/stringr/archive/main.zip # Local Remotes: local::/pkgs/testthat # Gitorious Remotes: gitorious::r-mpc-package/r-mpc-package ``` ### CRAN submission When you submit your package to CRAN, all of its dependencies must also be available on CRAN. For this reason, `release()` will warn you if you try to release a package with a `Remotes` field. devtools/build/0000755000175000017500000000000014151174560013346 5ustar nileshnileshdevtools/build/vignette.rds0000644000175000017500000000031114151174560015700 0ustar nileshnileshb```b`adb`b2 1# 'ZZ&/ZVSM !%9h @!@„$Ϛa* T?iN,/AQU▙ 7$apq2݀a>9`~Ht&${+%$Q/n7devtools/tests/0000755000175000017500000000000013542445754013422 5ustar nileshnileshdevtools/tests/testthat/0000755000175000017500000000000014151364022015243 5ustar nileshnileshdevtools/tests/testthat/testCheckExtrafile/0000755000175000017500000000000013401234762021030 5ustar nileshnileshdevtools/tests/testthat/testCheckExtrafile/an_extra_file0000644000175000017500000000004613401234762023553 0ustar nileshnileshThis is an extra file in the package. devtools/tests/testthat/testCheckExtrafile/DESCRIPTION0000644000175000017500000000032513401234762022536 0ustar nileshnileshPackage: testCheckExtrafile Title: Tools to make developing R code easier License: GPL-2 Description: Author: Hadley Maintainer: Hadley Version: 0.1 Collate: 'a.r' devtools/tests/testthat/testCheckExtrafile/man/0000755000175000017500000000000013401234762021603 5ustar nileshnileshdevtools/tests/testthat/testCheckExtrafile/man/a.Rd0000644000175000017500000000020113401234762022303 0ustar nileshnilesh\docType{data} \name{a} \alias{a} \title{A number.} \format{num 1} \usage{ a } \description{ A number. } \keyword{datasets} devtools/tests/testthat/testCheckExtrafile/R/0000755000175000017500000000000013401234762021231 5ustar nileshnileshdevtools/tests/testthat/testCheckExtrafile/R/a.R0000644000175000017500000000003713401234762021574 0ustar nileshnilesh#' A number. #' @export a <- 1 devtools/tests/testthat/testCheckExtrafile/NAMESPACE0000644000175000017500000000001213401234762022240 0ustar nileshnileshexport(a) devtools/tests/testthat/testError/0000755000175000017500000000000013401234762017240 5ustar nileshnileshdevtools/tests/testthat/testError/DESCRIPTION0000644000175000017500000000031113401234762020741 0ustar nileshnileshPackage: testError Title: Test package to check error message gives file/line info License: GPL-2 Description: Author: Hadley Maintainer: Hadley Version: 0.1devtools/tests/testthat/testError/R/0000755000175000017500000000000013401234762017441 5ustar nileshnileshdevtools/tests/testthat/testError/R/error.R0000644000175000017500000000007213401234762020714 0ustar nileshnileshf <- function() { 5 * 10 } stop("This is an error!") devtools/tests/testthat/test-active.R0000644000175000017500000000127714031104013017612 0ustar nileshnileshtest_that("fails if can't find tests", { expect_error(find_test_file("DESCRIPTION"), "find tests") expect_error(find_test_file("R/foo.R"), "No test files found") }) test_that("can determine file type", { expect_equal(test_file_type("R/foo.R"), "R") expect_equal(test_file_type("R/foo.c"), NA_character_) expect_equal(test_file_type("src/foo.c"), "src") expect_equal(test_file_type("src/foo.R"), NA_character_) expect_equal(test_file_type("tests/testthat/test-foo.R"), "test") expect_equal(test_file_type("tests/testthat/test-foo.c"), NA_character_) expect_equal(test_file_type("tests/testthat/foo.R"), NA_character_) expect_equal(test_file_type("DESCRIPTION"), NA_character_) }) devtools/tests/testthat/testPkgdown/0000755000175000017500000000000013446746735017601 5ustar nileshnileshdevtools/tests/testthat/testPkgdown/DESCRIPTION0000644000175000017500000000046213455426722021300 0ustar nileshnileshPackage: testPkgdown Title: Tools to make developing R code easier License: GPL-2 Description: Authors@R: c( person("Hadley", email = "h.wickham@gmail.com", role = c("aut", "cre"))) Maintainer: Hadley Version: 0.1 VignetteBuilder: knitr Suggests: knitr, pkgdown RoxygenNote: 6.1.1 devtools/tests/testthat/testPkgdown/man/0000755000175000017500000000000013401234762020333 5ustar nileshnileshdevtools/tests/testthat/testPkgdown/man/pkgdown_test_test.Rd0000644000175000017500000000044713401234762024376 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/pkgdown-test-test.R \name{pkgdown_test_test} \alias{pkgdown_test_test} \title{pkgdown_test_test} \usage{ pkgdown_test_test(x) } \arguments{ \item{x}{marks the spot} } \value{ FALSE } \description{ pkgdown_test_test } devtools/tests/testthat/testPkgdown/vignettes/0000755000175000017500000000000013401234762021570 5ustar nileshnileshdevtools/tests/testthat/testPkgdown/vignettes/test.Rmd0000644000175000017500000000022313401234762023210 0ustar nileshnilesh This is a test. ```{r} library(testPkgdown) pkgdown_test_test() 1 + 2 ``` devtools/tests/testthat/testPkgdown/_pkgdown.yml0000644000175000017500000000002413401234762022107 0ustar nileshnileshtitle: pkgdown test devtools/tests/testthat/testPkgdown/R/0000755000175000017500000000000013401234762017761 5ustar nileshnileshdevtools/tests/testthat/testPkgdown/R/pkgdown-test-test.R0000644000175000017500000000021313401234762023503 0ustar nileshnilesh #' pkgdown_test_test #' #' @param x marks the spot #' #' @return FALSE #' @export #' pkgdown_test_test <- function(x) { return(FALSE) } devtools/tests/testthat/testPkgdown/NAMESPACE0000644000175000017500000000011013532022415020762 0ustar nileshnilesh# Generated by roxygen2: do not edit by hand export(pkgdown_test_test) devtools/tests/testthat/testUseData/0000755000175000017500000000000013401234762017475 5ustar nileshnileshdevtools/tests/testthat/testUseData/DESCRIPTION0000644000175000017500000000027213401234762021204 0ustar nileshnileshPackage: testUseData Title: Tools to make developing R code easier License: GPL-2 Description: Author: Hadley Maintainer: Hadley Version: 0.1 devtools/tests/testthat/testUseData/R/0000755000175000017500000000000013401234762017676 5ustar nileshnileshdevtools/tests/testthat/testUseData/R/a.R0000644000175000017500000000000113401234762020230 0ustar nileshnilesh devtools/tests/testthat/testUseData/NAMESPACE0000644000175000017500000000002713401234762020713 0ustar nileshnileshexport(sysdata_export) devtools/tests/testthat/test-run-source.R0000644000175000017500000000322714107202254020450 0ustar nileshnileshtest_that("gist containing single file works unambiguously", { skip_if_offline() skip_on_cran() # TODO remove the CI skips once remotes is on CRAN skip_on_ci() withr::local_envvar(list("GITHUB_PAT" = asNamespace("remotes")$github_pat())) a <- 10 source_gist( "a65ddd06db40213f1a921237c55defbe", sha1 = "f176f5e1fe05b69b1ef799fdd1e4bac6341aff51", local = environment(), quiet = TRUE ) expect_equal(a, 1) }) test_that("gist with multiple files uses first with warning", { skip_if_offline() skip_on_cran() skip_on_ci() withr::local_envvar(list("GITHUB_PAT" = asNamespace("remotes")$github_pat())) a <- 10 expect_warning( source_gist( "605a984e764f9ed358556b4ce48cbd08", sha1 = "f176f5e1fe05b69b1ef799fdd1e4bac6341aff51", quiet = TRUE, local = environment() ), "using first" ) expect_equal(a, 1) }) test_that("can specify filename", { skip_if_offline() skip_on_cran() skip_on_ci() withr::local_envvar(list("GITHUB_PAT" = asNamespace("remotes")$github_pat())) b <- 10 source_gist( "605a984e764f9ed358556b4ce48cbd08", filename = "b.r", sha1 = "8d1c53241c425a9a52700726809b7f2c164bde72", local = environment(), quiet = TRUE ) expect_equal(b, 2) }) test_that("error if file doesn't exist or no files", { skip_if_offline() skip_on_cran() skip_on_ci() withr::local_envvar(list("GITHUB_PAT" = asNamespace("remotes")$github_pat())) expect_error( source_gist("605a984e764f9ed358556b4ce48cbd08", filename = "c.r", local = environment()), "not found" ) expect_error( source_gist("c535eee2d02e5f47c8e7642811bc327c"), "No R files found" ) }) devtools/tests/testthat/testTest/0000755000175000017500000000000014107202230017053 5ustar nileshnileshdevtools/tests/testthat/testTest/DESCRIPTION0000644000175000017500000000055614107202230020567 0ustar nileshnileshPackage: testTest Title: Tools to Make Developing R Code Easier License: GPL-2 Description: Package description. Authors@R: c(person(given = "Hadley", family = "Wickham", role = c("aut", "cre"), email = "h.wickham@gmail.com")) Maintainer: Hadley Version: 0.1 Suggests: testthat RoxygenNote: 5.0.1 devtools/tests/testthat/testTest/tests/0000755000175000017500000000000013401234762020230 5ustar nileshnileshdevtools/tests/testthat/testTest/tests/testthat/0000755000175000017500000000000014151364022022064 5ustar nileshnileshdevtools/tests/testthat/testTest/tests/testthat/test-dummy.R0000644000175000017500000000010013736643460024324 0ustar nileshnileshtest_that("multiplication works", { expect_equal(2 * 2, 4) }) devtools/tests/testthat/testTest/tests/testthat/test-envvar.R0000644000175000017500000000016213736643460024502 0ustar nileshnileshtest_that("TESTTHAT_PKG environment variable is set", { expect_equal(Sys.getenv("TESTTHAT_PKG"), "testTest") }) devtools/tests/testthat/testTest/tests/testthat.R0000644000175000017500000000007413401234762022214 0ustar nileshnileshlibrary(testthat) library(testTest) test_check("testTest") devtools/tests/testthat/testTest/R/0000755000175000017500000000000013401234762017267 5ustar nileshnileshdevtools/tests/testthat/testTest/R/dummy.R0000644000175000017500000000000113401234762020534 0ustar nileshnilesh devtools/tests/testthat/testTest/NAMESPACE0000644000175000017500000000005613401234762020306 0ustar nileshnilesh# Generated by roxygen2: do not edit by hand devtools/tests/testthat/test-reload.R0000644000175000017500000000140014033123060017576 0ustar nileshnileshtest_that("reload works", { withr::local_temp_libpaths() pkg <- as.package(test_path("testTest")) install(pkg, quiet = TRUE) on.exit(unload(pkg$package), add = TRUE) expect_false(is_loaded(pkg)) # Do nothing if the package is not loaded expect_error(reload(pkg, quiet = TRUE), NA) expect_false(is_loaded(pkg)) # Reload if loaded requireNamespace(pkg$package, quietly = TRUE) expect_true(is_loaded(pkg)) reload(pkg, quiet = TRUE) expect_true(is_loaded(pkg)) # Re-attach if attached unload(pkg$package, quiet = TRUE) library(pkg$package, character.only = TRUE, quietly = TRUE) expect_true(is_loaded(pkg)) expect_true(is_attached(pkg)) reload(pkg, quiet = TRUE) expect_true(is_loaded(pkg)) expect_true(is_attached(pkg)) }) devtools/tests/testthat/test-check-doc.R0000644000175000017500000000104414056234737020177 0ustar nileshnileshtest_that("check_man works", { # tools:::.check_Rd_xrefs which is called by `check_man()` assumes the base # and recommended packages will all be in the library path, which is not the # case during R CMD check, so we only run these tests interactively skip_if(!interactive()) pkg <- create_local_package() dir.create(file.path(pkg, "man")) writeLines(c(" \\name{foo} \\title{Foo bar} \\usage{ foo(x) } \\arguments{\\item{foo}{}} "), file.path(pkg, "man", "foo.Rd")) expect_output( check_man(pkg), "Undocumented arguments" ) }) devtools/tests/testthat/test-sitrep.R0000644000175000017500000000103014033123232017636 0ustar nileshnileshtest_that("check_for_rstudio_updates", { skip_if_offline() skip_on_cran() # returns nothing rstudio not available expect_null(check_for_rstudio_updates("mac", "1.0.0", FALSE)) # returns nothing if the version is ahead of the current version expect_null(check_for_rstudio_updates("mac", "1000.0.0", TRUE)) # returns something if the version is behind of the current version res <- check_for_rstudio_updates("mac", "0.0.1", TRUE) expect_match(res, "RStudio .* is now available") expect_match(res, "Download at") }) devtools/tests/testthat/helper.R0000644000175000017500000000124714031104013016636 0ustar nileshnilesh# This is a trimmed down version of create_local_thing from usethis # https://github.com/jimhester/usethis/blob/de8aa116820a8e54f2f952b341039985d78d0352/tests/testthat/helper.R#L28-L68 create_local_package <- function() { old_project <- asNamespace("usethis")$proj_get_() # this could be `NULL`, i.e. no active project old_wd <- getwd() dir <- file_temp() withr::defer(envir = parent.frame(), { proj_set(old_project, force = TRUE) setwd(old_wd) dir_delete(dir) }) usethis::ui_silence({ create_package(dir, rstudio = FALSE, open = FALSE, check_name = FALSE) proj_set(dir) }) proj_dir <- proj_get() setwd(proj_dir) invisible(proj_dir) } devtools/tests/testthat/test-run-examples.R0000644000175000017500000000027213736643460021002 0ustar nileshnileshtest_that("Can run an example", { pkg <- "testHelp" expect_output( suppressMessages(run_examples(pkg = pkg, document = FALSE)), "You called foofoo.", fixed = TRUE ) }) devtools/tests/testthat/check-results-note.log0000644000175000017500000000640313401234762021474 0ustar nileshnilesh* using log directory ‘/private/tmp/Rtmpe1I3BZ/devtools.Rcheck’ * using R version 3.2.3 (2015-12-10) * using platform: x86_64-apple-darwin13.4.0 (64-bit) * using session charset: UTF-8 * using option ‘--as-cran’ * checking for file ‘devtools/DESCRIPTION’ ... OK * this is package ‘devtools’ version ‘1.10.0.9000’ * checking package namespace information ... OK * checking package dependencies ... OK * checking if this is a source package ... OK * checking if there is a namespace ... OK * checking for executable files ... OK * checking for hidden files and directories ... OK * checking for portable file names ... OK * checking for sufficient/correct file permissions ... OK * checking whether package ‘devtools’ can be installed ... OK * checking installed package size ... OK * checking package directory ... OK * checking ‘build’ directory ... OK * checking DESCRIPTION meta-information ... OK * checking top-level files ... OK * checking for left-over files ... OK * checking index information ... OK * checking package subdirectories ... OK * checking R files for non-ASCII characters ... OK * checking R files for syntax errors ... OK * checking whether the package can be loaded ... OK * checking whether the package can be loaded with stated dependencies ... OK * checking whether the package can be unloaded cleanly ... OK * checking whether the namespace can be loaded with stated dependencies ... OK * checking whether the namespace can be unloaded cleanly ... OK * checking loading without being on the library search path ... OK * checking dependencies in R code ... OK * checking S3 generic/method consistency ... OK * checking replacement functions ... OK * checking foreign function calls ... NOTE Registration problem: Evaluating ‘dll$foo’ during check gives error ‘object 'dll' not found’: .C(dll$foo, 0L) See chapter ‘System and foreign language interfaces’ in the ‘Writing R Extensions’ manual. * checking R code for possible problems ... NOTE Found the following calls to attach(): File ‘devtools/R/package-env.r’: attach(NULL, name = pkg_env_name(pkg)) File ‘devtools/R/shims.r’: attach(e, name = "devtools_shims", warn.conflicts = FALSE) See section ‘Good practice’ in ‘?attach’. * checking Rd files ... OK * checking Rd metadata ... OK * checking Rd line widths ... OK * checking Rd cross-references ... OK * checking for missing documentation entries ... OK * checking for code/documentation mismatches ... OK * checking Rd \usage sections ... OK * checking Rd contents ... OK * checking for unstated dependencies in examples ... OK * checking line endings in C/C++/Fortran sources/headers ... OK * checking compiled code ... OK * checking installed files from ‘inst/doc’ ... OK * checking files in ‘vignettes’ ... OK * checking examples ... OK ** found \donttest examples: check also with --run-donttest * checking for unstated dependencies in ‘tests’ ... OK * checking tests ... OK Running ‘has-devel.R’ Running ‘test-that.R’ [33s/42s] * checking for unstated dependencies in vignettes ... OK * checking package vignettes in ‘inst/doc’ ... OK * checking running R code from vignettes ... OK * checking re-building of vignette outputs ... OK * checking PDF version of manual ... OK * DONE Status: 2 NOTEs devtools/tests/testthat/testVignettes/0000755000175000017500000000000014151174562020123 5ustar nileshnileshdevtools/tests/testthat/testVignettes/DESCRIPTION0000644000175000017500000000027413401234762021630 0ustar nileshnileshPackage: testVignettes Title: Tools to make developing R code easier License: GPL-2 Description: Author: Hadley Maintainer: Hadley Version: 0.1 devtools/tests/testthat/testVignettes/vignettes/0000755000175000017500000000000014107010123022112 5ustar nileshnileshdevtools/tests/testthat/testVignettes/vignettes/new.Rnw0000644000175000017500000000010613401234762023405 0ustar nileshnilesh\documentclass[oneside]{article} \begin{document} Test \end{document}devtools/tests/testthat/testVignettes/NAMESPACE0000644000175000017500000000000013401234762021324 0ustar nileshnileshdevtools/tests/testthat/testVignettesBuilt/0000755000175000017500000000000013401234762021117 5ustar nileshnileshdevtools/tests/testthat/testVignettesBuilt/DESCRIPTION0000644000175000017500000000030113401234762022617 0ustar nileshnileshPackage: testVignettesBuilt Title: Tools to make developing R code easier License: GPL-2 Description: Author: Hadley Maintainer: Hadley Version: 0.1 devtools/tests/testthat/testVignettesBuilt/vignettes/0000755000175000017500000000000013401234762023127 5ustar nileshnileshdevtools/tests/testthat/testVignettesBuilt/vignettes/new.Rnw0000644000175000017500000000023613401234762024411 0ustar nileshnilesh%\VignetteIndexEntry{New} \documentclass[oneside]{article} \begin{document} <<>>= library(testVignettesBuilt) function_with_unusual_name() @ \end{document}devtools/tests/testthat/testVignettesBuilt/R/0000755000175000017500000000000013401234762021320 5ustar nileshnileshdevtools/tests/testthat/testVignettesBuilt/R/code.R0000644000175000017500000000007313401234762022355 0ustar nileshnileshfunction_with_unusual_name <- function() { print("Hi!") }devtools/tests/testthat/testVignettesBuilt/NAMESPACE0000644000175000017500000000004213401234762022332 0ustar nileshnileshexport(function_with_unusual_name)devtools/tests/testthat/testMissingNsObject/0000755000175000017500000000000013401234762021210 5ustar nileshnileshdevtools/tests/testthat/testMissingNsObject/DESCRIPTION0000644000175000017500000000031513401234762022715 0ustar nileshnileshPackage: testMissingNsObject Title: Tools to make developing R code easier. This package lists 'b' as an export in NAMESPACE, but the 'b' object doesn't exist. License: GPL-2 Description: Version: 0.1 devtools/tests/testthat/testMissingNsObject/R/0000755000175000017500000000000013401234762021411 5ustar nileshnileshdevtools/tests/testthat/testMissingNsObject/R/a.R0000644000175000017500000000000713401234762021751 0ustar nileshnilesha <- 1 devtools/tests/testthat/testMissingNsObject/NAMESPACE0000644000175000017500000000002313401234762022422 0ustar nileshnileshexport(a) export(b)devtools/tests/testthat/testTestWithDepends/0000755000175000017500000000000013401234762021225 5ustar nileshnileshdevtools/tests/testthat/testTestWithDepends/DESCRIPTION0000644000175000017500000000034013401234762022730 0ustar nileshnileshPackage: testTestWithDepends Title: Tools to make developing R code easier License: GPL-2 Description: Author: Hadley Maintainer: Hadley Version: 0.1 Depends: R Suggests: testthat devtools/tests/testthat/testTestWithDepends/tests/0000755000175000017500000000000013401234762022367 5ustar nileshnileshdevtools/tests/testthat/testTestWithDepends/tests/testthat/0000755000175000017500000000000014151364022024223 5ustar nileshnileshdevtools/tests/testthat/testTestWithDepends/tests/testthat/test-dummy.R0000644000175000017500000000010013736643460026463 0ustar nileshnileshtest_that("multiplication works", { expect_equal(2 * 2, 4) }) devtools/tests/testthat/testTestWithDepends/tests/testthat.R0000644000175000017500000000012213401234762024345 0ustar nileshnileshlibrary(testthat) library(testTestWithDepends) test_check("testTestWithDepends") devtools/tests/testthat/testTestWithDepends/NAMESPACE0000644000175000017500000000003113401234762022436 0ustar nileshnileshexportPattern("^[^\\.]") devtools/tests/testthat/test-install.R0000644000175000017500000000466314031104013020007 0ustar nileshnileshlibrary(mockery) local({ pkg <- create_local_package() path2char <- function(x) { if (inherits(x, "fs_path")) { as.character(x) } else { x } } expect_passes_args <- function(fn, stub, input_args = list(), expected_args) { mck <- mockery::mock(NULL) mockery::stub(fn, stub, mck) suppressMessages(do.call(fn, input_args)) mockery::expect_called(mck, 1) mock_args <- mockery::mock_args(mck)[[1]] mock_args <- lapply(mock_args, path2char) expect_equal(mock_args, expected_args) } custom_args <- list( dependencies = "dep", repos = "repo", type = "type", upgrade = "upgrade", quiet = "quiet", build = "build", build_opts = "build_opts" ) dep_defaults <- list( dependencies = NA, repos = getOption("repos"), type = getOption("pkgType"), upgrade = c("default", "ask", "always", "never"), quiet = FALSE, build = TRUE, build_opts = c("--no-resave-data", "--no-manual", " --no-build-vignettes") ) dev_dep_defaults <- list( dependencies = TRUE, repos = getOption("repos"), type = getOption("pkgType"), upgrade = c("default", "ask", "always", "never"), quiet = FALSE, build = TRUE, build_opts = c("--no-resave-data", "--no-manual", " --no-build-vignettes") ) extra <- list(foo = "foo", bar = "bar") test_that("install_deps passes default args to remotes::install_deps", { expect_passes_args( install_deps, "remotes::install_deps", list(pkg), c(pkg, dep_defaults) ) }) test_that("install_deps passes custom args to remotes::install_deps", { expect_passes_args( install_deps, "remotes::install_deps", c(pkg, custom_args), c(pkg, custom_args) ) }) test_that("install_deps passes ellipsis args to remotes::install_deps", { expect_passes_args( install_deps, "remotes::install_deps", c(pkg, extra), c(pkg, dep_defaults, extra) ) }) test_that("install_dev_deps passes default args to remotes::install_deps", { expect_passes_args( install_dev_deps, "remotes::install_deps", list(pkg), c(pkg, dev_dep_defaults) ) }) test_that("install_dev_deps passes custom args to remotes::install_deps", { expect_passes_args( install_dev_deps, "remotes::install_deps", c(pkg, custom_args), c(pkg, custom_args) ) }) test_that("install_dev_deps passes ellipsis args to remotes::install_deps", { expect_passes_args( install_dev_deps, "remotes::install_deps", c(pkg, extra), c(pkg, dev_dep_defaults, extra) ) }) }) devtools/tests/testthat/test-vignettes.R0000644000175000017500000000550114033137342020356 0ustar nileshnileshtest_that("Sweave vignettes copied into doc", { if (!pkgbuild::has_latex()) { skip("pdflatex not available") } pkg <- test_path("testVignettes") doc <- path(pkg, "doc") suppressMessages(clean_vignettes(pkg)) expect_false(dir_exists(doc)) suppressMessages(build_vignettes(pkg)) expect_setequal(path_file(dir_ls(doc)), c("new.pdf", "new.R", "new.Rnw")) suppressMessages(clean_vignettes(pkg)) expect_false(dir_exists(doc)) }) test_that("Built files are updated", { # This test is time dependant and sometimes fails on CRAN because the systems are under heavy load. skip_on_cran() if (!pkgbuild::has_latex()) { skip("pdflatex not available") } pkg <- test_path("testVignettes") suppressMessages(clean_vignettes(pkg)) suppressMessages(build_vignettes(pkg)) on.exit(suppressMessages(clean_vignettes(pkg))) output <- dir_ls(path(pkg, "doc"), regexp = "new") first <- file_info(output)$modification_time Sys.sleep(.01) suppressMessages(build_vignettes(pkg)) second <- file_info(output)$modification_time expect_true(all(second > first)) }) test_that("Rmarkdown vignettes copied into doc", { pkg <- test_path("testMarkdownVignettes") doc <- path(pkg, "doc") suppressMessages(clean_vignettes(pkg)) expect_false(dir_exists(doc)) suppressMessages(build_vignettes(pkg)) expect_setequal(path_file(dir_ls(doc)), c("test.html", "test.R", "test.Rmd")) suppressMessages(clean_vignettes(pkg)) expect_false(dir_exists(doc)) }) test_that("Extra files copied and removed", { if (!pkgbuild::has_latex()) { skip("pdflatex not available") } pkg <- test_path("testVignetteExtras") doc <- path(pkg, "doc") extras_path <- path(pkg, "vignettes", ".install_extras") writeLines("a.R", extras_path) on.exit(file_delete(extras_path)) suppressMessages(clean_vignettes(pkg)) expect_false(file_exists(path(doc, "a.R"))) suppressMessages(build_vignettes(pkg)) expect_true(file_exists(path(doc, "a.R"))) suppressMessages(clean_vignettes(pkg)) expect_false(file_exists(path(doc, "a.R"))) }) test_that("vignettes built on install", { skip_on_cran() if (!pkgbuild::has_latex()) { skip("pdflatex not available") } pkg <- test_path("testVignettesBuilt") withr::local_temp_libpaths() install(pkg, reload = FALSE, quiet = TRUE, build_vignettes = TRUE) vigs <- vignette(package = "testVignettesBuilt")$results expect_equal(nrow(vigs), 1) expect_equal(vigs[3], "new") }) test_that(".gitignore updated when building vignettes", { if (!pkgbuild::has_latex()) { skip("pdflatex not available") } pkg <- test_path("testVignettes") gitignore <- path(pkg, ".gitignore") suppressMessages(clean_vignettes(pkg)) suppressMessages(build_vignettes(pkg)) on.exit(suppressMessages(clean_vignettes(pkg))) expect_true(all(c("/Meta/", "/doc/") %in% readLines(gitignore))) }) devtools/tests/testthat/test-build-site.R0000644000175000017500000000164514033123164020411 0ustar nileshnileshtest_that("Package pkgdown site can be built ", { # This test requires internet skip_if_offline() skip_on_cran() destination <- path(tempdir(), "testPkgdown", "docs") build_output <- capture.output({ build_site( path = "testPkgdown", override = list(destination = destination) ) }, type = c("output")) build_output <- paste(build_output, collapse = "\n") expect_true(file_exists(path(destination, "index.html")), info = build_output, label = "created site index" ) expect_true(file_exists(path(destination, "reference", "index.html")), info = build_output, label = "created reference index" ) expect_true(file_exists(path(destination, "articles", "index.html")), info = build_output, label = "created articles index" ) expect_true(file_exists(path(destination, "articles", "test.html")), info = build_output, label = "created articles index" ) }) devtools/tests/testthat/test-check.R0000644000175000017500000000134314031104013017406 0ustar nileshnileshtest_that("can determine when to document", { expect_false(can_document(list())) # TODO: switch to expect_snapshot() suppressMessages(expect_message( expect_false(can_document(list(roxygennote = "15.0.00"))), "doesn't match required" )) expect_true(can_document(list(roxygennote = packageVersion("roxygen2")))) }) test_that("fail instead of sending an email to wrong recipient", { # The testTest package has both Authors@R and Maintainer field - this causes problems in change_maintainer_email(). # The function checks if the provided email is actually the one in the maintainer field instead of sending the report to the wrong recipient expect_error(check_win_release(path("testTest"), email = "foo@bar.com")) }) devtools/tests/testthat/shallowRepo/0000755000175000017500000000000013401234762017546 5ustar nileshnileshdevtools/tests/testthat/shallowRepo/HEAD0000644000175000017500000000002713401234762020171 0ustar nileshnileshref: refs/heads/master devtools/tests/testthat/shallowRepo/objects/0000755000175000017500000000000013401234762021177 5ustar nileshnileshdevtools/tests/testthat/shallowRepo/objects/pack/0000755000175000017500000000000013401234762022115 5ustar nileshnileshdevtools/tests/testthat/shallowRepo/objects/pack/pack-c4e0f1d1d68408f260cbbf0a533ad5f6bfd5524e.pack0000644000175000017500000073135113401234762031546 0ustar nileshnileshPACK xA0@}O HthWchH@ z{n~DG-GVq:/ xRuG1F7gMY#{r khhZ}PZrSҋN1/Ӯ>rkB0 xK =6|;)A6Hc^KecBBv@HLJ1hI9$2Pr6QuX|a i!r`l]\Vsޕްm"IJ:čnO/&A x !=UЀxW3q~A{mINoPm,ְNLT3 u@%8.CH{G&ZlJJTcX էɉ˂ޗRGho#L$xAN!E} vr.&xQEӱ h~o",1JX,Bg靚\'m1Z1"f:"ߞv LNq MZOt6)sLe+gY fh޻^mB+gu*tIm{]~Q>zm^,+x340075U J*IL/Je.v:>XnwDA/=$(3$[b>E'mGCR 5R͹feNvX%5߻(,X272؉//ob%9D/7Ae͕]~AxN:5*` πO?'KKհ._gsW 58ٕlUF _S$ ξ}5<d˙7T}pF*W(1ڽ@Ͽn cA: v[W^(J:A%V}ogìA=68y?T]rQbnr~nnj^I1LSJuV5y`VSڔԲb,uf S7u1Lʝq~f^q Ë6f[/aF[.<Տ o'K/)syn{"[ZZGD ך9͊_3"DAqQ2Cc?4=xt59NI1Þ鯟P>w~jtߣs pRK@ ̕Ν(}О/>ЎԬxmy pEJe(6%JaC Jygx<3L)hۍЁRI$FSJIiuhakylmlۛZjrRy9, I6ImʬoeW4ʃbρ8r!E+_5OأU=ك|Jr,7 a| _bܼxT_rԽU:a&%as6bCkş1 I.TYrÏ$.q9k~8bl)c7Zt%KxL`UH:'|X`ﰹg5фO-_۲De_=GP>q|0)=ӫwc' >Ew^*Hߢ#ؽXL>Տ~VAmls\Y0Clu5J;ٴN;{]'g<,H@H(,!ԭ9A/4{UU{5S_TƩI~eWuCw_`,K t^YCs^K._dwUq_f8{)mfa4QVp0vc[q0z^?# B$O TnĤ~vJh~Lͯ; {ݵ<|QH .iz]hbk%q[̪IW9d5<ўd2[TWfN2 A'@l]桛 #z|mhD4=cƼJ DNX)>:_NW?{rڂY, q q1c)'g)yjBkfuM#L,As8gKL0M:ruW|,1P4//2 -%`_9'L-[ryXT 85ͲrNZ؊%.\0'iVr 8bTa^f]}C}M1@f8|ˈNRKfy'^[LнwT'&hZ`0bxÏn0HRqρ1HH\*qh;Ԩ/R˭lWA Q}SF U֢%>pƬvu+iw}* 誇+qṶKS *@ A#ok69u/l~"2I BbFQaߴ=9M(zUtqÚ K~;U S?>"Ry"ȦԶ)ēUCVa"'wCk)[[*I{_k4$fc3Ϳ"$Ġl6Qxe1]F[Н;펠J` Gq@Qf?{3ND)o>09KPS#$DCl>ߩiyM)'w߰o!`}7m?q%ӷǰhޅH_WаG+薌ӟ&6yܣ~"^3=XDa^3ne_qk4?ߐھ)n4,:-O3z^[ꅱ}`tE,^*!%HDr2C/]c7x83Gz32]@(]tK</t#1k 2[[(`ڣ5WF A5v)k5#1j. <NxmoUQ $YVELPvb . #Ro$c4Z_FI$h!IA)C^Y:69ТKO8qbْ;ʸQXIe%;mG/ * KzU%2IxAC[ c'P7o2Rot'q_,/OWm6>:4;њlW[lG?Ux31܂ĒbD_~AΓvbx340031Qps uMaZVڵM[M5<3',..0BImuˡJ\]|]8*?M.`0-ɻRGk R+*ss(ҐRX \eqnjE"P=P5Cj{6CE7 _W$#jcA'NlmZ; (,oP|WyWil'l>l&xei TkpҪJPEJY,EJc̜1Ӭf%7Kl%d-{7K xQH(ɝs͸y< ٭hgbmiGssWħ*Ϸ֔:bd[Sp+SnԢ:Ky!&Ap6.scҍU<(Tdp:o>/T=M`U|Zf9$K9  =UvtG"ϸ][kfvd2~RTD4L\XH[&J^#'x dή{!Inо,lxvKG֮씈rYT}gHXw&3`_mxە/YEEަx"LY |iw}L 9_L|DclXҰ_5sӓl. X k6;Y?dDqlçN2QN.?5'CIKɷd*Gw59\1s­*jI'K,{BHe$Of|bdaT+Vǁ O?.f%u*86r]i-=\ExAtcybj R8 =NTeLq&;sf˅$ 2!p1:07u|O H]&h&'W^\#ZˆMqK6N 12  -ST?G R1>npk U'Xdl`dti桐m?KYYpnip]Q]b}鬫g󞀘v`f:%W9BtkB:~p!ۡf/=+5P䌤Mm˕ NjLug.Iguoq;3>ǯf2[.E}I{"H+-?Q֫,]+ lpRD/fٶL'ym^zE! ‹ɥ=(:xxH +s3z"p:NVl mw" 9xܿ(ԁy)=t*!hXnY׻|gv!Ә p_ZFoNd}oipí0MoxbnX+.#:Ǯ;ìF* O͉{u3liy B渀x G6֤zOTg9{ąw┶ˡ]c^?cށI\y>pkgb*g껴 =HM%i1nfTˏ~)7-0pcO^ <^_ʶZ~= CukgpZn[~ $`}< zdՁ/q[Ⱦ'KtW 7]f݆[_O3,2[} Ϩ_/{N<@*YPJ)_Tej0DJˍm~UQl;"o4GY_1{`-PdyƧ"4<8߰!kڗiD{Yjf߳&cudVݬ(9=%Wtgڀg_x\/Yxc,`{սEg~\|]: ϳrPS:aA9%Ct* iITaW < )e; cJ: sBq?&wVx/{l C"ˈu#z^H ܍2ϥwbVWQoI1Q [}(_&,ƴyBEG ۡ=l_Vȳ9bP_9|$NtgP-eᶯiu`fe&+7XW6.r$ [Bh$]|6SuMIBܭ 4ϰQ1^(*wRl"ak[ g.42g^h~+r^U.ғhhҦn͐ ~}h;{#^D:%2-zInFB.QK`O!N] ^%noO'0҅4]7n?@LKA=9fٻ&TJ ƻ6-I.WEc\ݷZzGs&JT3\//g7nfQ\`"J6a8rG7,ثTb7bu]_1, Džbj y}XjgYQd:OO*^ Mg3d{D\~6QʁWW4NRd Ra+>%(2(#{< vbVh>Pci 87:qMxRbM~BRhhvэjJ='oI #; 3|OFe9o̅  :hN iI/ߝ]@W .5?qĀy2^+x340031QK,L/Je^ﱯ8lz*9#59[/a ?<bg=Li]P%ťEz) o.+Ϟ,ɐ ?F.ݦx340031QHI-+)Kf ׮䄏ZT Rx340031QH,MI-K bx:y{wbkQVZ\[XTVUS|4+9;{gnb`U E ;xݗY\jƟ^iw,,xmy\A\ $T© `DIBg&"ǮXV*rʩbme?RTE)I+V9N@?I̛7o~3mGB\6[o/Cۆ2۷h7S*SـCsI.8Jpq :?Ahώ'.s3}m%Fp4>X7f~ R_::Ǡnl .nMɆ<~.PQbeOAEpC bZ+ y Gr}·/StKi+,6x' a:!,.bUGn<%4`ZS-lTw=S9wM0V1@rHB+M3|tEB|p@ -6,»ykdžm5Eh+ *hNe#X< SG[~ sTBIiCu{閤8DATthnaͳ/9qſ8h)-*!X2d@M)boL]ܫJNyZ<ͥF`W8.R3I\d vܽ$zcj0 ;rmpSl²X~4ߌK T?ֺR5yTլk}z h$ZݖöYe1TCR.eYq=X.JhKk|)|d/ӿ>y'#{ud6ptJj 0xcF\\Qx-ASe #K9!/Y ԦVӿ̎n?LgB2:MӮ{ UI>uxsqidڤ\:Zv2ɊE٩sKPR܇`f,Emh? =Wd 7¶LF0..sƱYpbi$(}:{y˙+)DIĹ#5ɣ:ẕ>Iߑa ^ r@ȶQS=lUva}…QPÛa%7Pd~"AeVU{1[KeeYQc*QX5,4$KHu3虩RǍfaw?h8arrjG~apX3J g3$76.`4;oxPh$'ݷQt|jAQ\餖#/@*wBIԯQ^w'#< ftx&5^h:>:5T~TIz6يޥ)`t {9m?bvE:>Uugjr:sKY OQ=gj\C9ɫ1vHdn, &ârcCO_Vt;ԺM+|#SHӂ^Zs E;J WEO2pUVx?YHϧޚ-nᒆR@X @"zs~nb-%UVa@Bo %u;m=7j2IH;}r_ lꎊa-LC)Fg-FnUޑls3#A) D|ZuujU;R!KЇÀ'4+ ;r<?ѰTs(93msz{Vioo@T}`y[wx^8chx#Q&3i5]jY%%W+ޚǹ/tXzU0?|Ҿo/"x340075U*)+(a|]ֶ+<3s;뢭!DUkPX6K>v/qv/qk熻F-fLZ`NJ?෎`|&鷨?x340031Qpq v cX*S۽ES K\nQ0M0fG7 gSs(1p=MKqbJؗC"!r)% կywY׶9U]m~ 32x340031Q(,NI,I+JIdْln$9#5''?<('E/APi~_܊ x340031QK,L/Jel+=^YW<dBT&f%3hhL&Ƨױ]M^yfĕَwYe?>_UW\P__3fb:<92S;_r3̏6Tu~p)P3x340031Qpq v c;yeGߜ p`䔽[v 1,x340031QH-*/+b}bYC_*45*5x340031Qpq v cXrUo[7.!Dkp+Cݕ_Ֆ~4bXaU Pb8:s+6fhaxiO8 ry 5M٦ŠӱNvw:ax340031QH""a._ow)9wu~dx340031QH"_.<L_;\in%=x340031Qpq v cv3Qqϗ5n{~` Pb8cG\z ߖ=ZUx340031QH+bXi}[=.-?\k$ x340031Qpq v cl/ޫzdm-nb A ok1ss׎z? V x340031Qpq v c|Uq>U,G&'ZUB98:2?y]rG4̷͞a&@0MT?\δC'Xm_m ]$x340031QH+b~{!' _wxߡ$n3oxYzɉNJJx340031Qpq v cp`<Ƀ/12^Y/O@&&[m.'si/ ||9|x340031QH+b|N.̥J x340031Qpq v cn< -o1g{ L @!"k憟ISh#x340031QH+b[ښ-/oz 2 nx340031Qpq v ch8)2&bN/~cb ey%% La v>8 Nݧ1x340031Q(I-. Ma(Ngbf-:Df x340031Qpq v c8Xܬ{k\uZ !}]]"fIQ|~kW%=[a(1J<}G_;E4p)Ox340031Qpq v cP|r#(֗e<-k{B98:22{OxL{9wB4Qp9 oܟcݷ5N&$x340031Qpq v cT,lYW㚯!Dkp+CԒ+ɋ^kĀTԊ7L @!a#ӍlϮx٘}ugL9+ɡx340031QH+biMu xm x340031Qpq v c(ٕsF=}י Jn_-u5(su ptve9Y،%oM7(^lb A Lo۾+ vj{a'yx340031QH+bhr#{B@U rx340031Qpq v c꾜em8ffQp(܉3f~ g(1pdpXup曓;Bj%x340031QHI,.N-+b`ܚoRd'Iֹ*a?_ x340031Qpq v chXٗjӏ`dvC2?G_GgWvfօw%xzYףn4pxvO̞B YГ&ӥx340031QHI,.N-+bx3eCK ة x340031Qp+(aX;ʫTO\=ѽ{2 )`)N6hpO{t)Tksg@CrW ?Ո~='Tkp+w+\S=?c˿W.51 UE xg(sO$C\f^q k~k2M$NI ;Qx340031QH+b <=nrڪq Ax340031Qp+(a8{۞,:YdQV^d"'^٩!DFx340031Qpq v c(1Zذ]gÉN]7(su ptve3֡Wވ߿{WwBIjqI1wv8jX>,x340031Q(I-.)H, bX$vĹ?\e2OcdbpE OK]viWߘX:x340031Q(I-.M)ͭ b`bfNXm.*91KǬx340031Qpq v chտ~ʓ3nt~!Dkp+Ü߿F۾z^`JRKrJ見1mSk)۩x340031Q(I-.)H, bc"3mGs?oB98:2LY9.M™+gߜob A Wv۴jnx6-x340031QH+bx6M9{wk+qIODYx340031Qpq v cXx!L zG !}]]}4{kݚʣnz<2RKJR$Z_<;y-Yl~<*~-!x340031QH+b~{!' _wxߡrrǫgW{1}἗56Rˠx340031Qpq v cXx!L zG !}]]}4{kݚʣnz<2RKJRޮzzl̍ 7w+}x340031QK- +gpzvuں{OYc}.ux340031Qpq v chnU#C>MӪ9WB98:2҈V#^6 PbȻ|\\-127C2RKJR"s{m~k?Vhc.rx!!< $睢 rϱ5QAx8R(&{R.BuA3Ñ4'\W" s+5+ix! Ekyff GԻf KxKI-+) *(RኃbJSIJL ?(1O79?775(+J-KI-2\BC‰eEPE%xs MQM-JO-J7 x+ᔜ.," ;#$K$\¥WZR^ϕW\xr wvp{u]d c5 dhHP x5+).ՊBN O\P]#E/ 2'̀cL,Ӓ{im#yݶ>.0n2ÙO(y O f{5՟[=eٚc̫^S2<,8JG.q.Kұ¡\Ř/͟-f)[zIJ#BQ42גSӌRQ?\%CR w a?\UKĊ έlC,=jQ;c~ 1ذ+?ZޅԿBLL3'ιqwH"$QB%L"[@x'ԡSq 4oP2[>9w( Rfd-'$N(J=agk%Qf>*ӍۥT΃.짊hatCBO CWλ󪮳;+), V\u\GnF}KSێǞkh7]܏^ٓNs7uu;X/tA0MCp=o"hΥЇv5:M]qu=\`-!xcJf%n@xkhlg1x3Ax6 f3"KMlR$H-Ë~uakHA塺AڃRh/_bh|Z7ߣs**4=t?_5OuMZ?%tEKdO,t-4-t/tM[ " ŜjZ|"LR<I70M`;ş{0O+;.Ŋu_x[ Q*+:g:0_@R::DW`'LP~JKn)R`WgQ2 /B N4ͅ82mt5p;ڶ?02'NΙ!,L uEmu@2M`նuldmwظ - !(U3$`A1ۂXp>5#i,T^WF\ffqJdCOXb4{,팇ԍ7tɦU@P6 RruK9 mAǞn ,f O*+rfCdbI-diyPx{gm(;مovE3wK*$;n{:*%uV<Ǫus"p[ESa4l+s6Ǜu 5|ɑR_=9RZ|д@Q, Z/ +ylX{)aXV$/|شZhͼe)wH)?H7xͽkw[בޟ,i !Qw,9YPre^i9tl-!$]r9p͉i5Ng^bכ3k#vfnL"i͏/Orؘڎ/3XcҜ@iӾYKS?}R^,vb:_mϛŎ j9tNXbuWSH=O(q`yc_;6Wp7H?{bu_;.ծ<ibu=_"y>~]7%i_r1jɥ-ZÊ˄/xJFK`R"i -[l gY\muLshZKc3W=&7Wg_-AZPRDrBG!.h(j?OdŇn2=qd 3:s>-}X +dA_,V i.~LA*j̬,5YXbOz(9kcJL $F^OA(5^s^o5O1Skxj{02 !Ñ?/p83Y :q'bQg;ON8+[ybB'Wj$b&T%<~t* TTfcwrW$2 ]xfXb .F%`!Q?_猂 Oyic'(ٚ%b]`g$U04^o$5ЬS&FX\J#u:eKJ~>|7~xlgb/7n]zSezK#8TO-bkxikRږvyAv䁭}x+&\*77rcD[\KDN0"5cN0-Sx'}ofƢlэe8,`M<$zrڐ6t.LO1 AZthߋf(xJa\/дGc 1 63ԟÁܭ|5:RTz?hE'v>|€Ū3qu mZUCn'G5 uvQ,4toK8ypW7v%E&~L!HyME,"# ÃPRՙRC'DC1o.j `cu[+% Փ屋Lx|?Is'Bo+;.vJ ly@AP0cEWOwvmX[Q V#f~xiAf(^PVxX􃞝 m 7 0FR =fGjQ -Fd{ TwF(S3_}j>M6[1[ 0úќʨ g,#iO7v̘ǚ<37F :ϰSՏk9M |W?7aee|?41ܗ>@`?ˇ9b@2 GC=#r"$(BAUUt-҉x69)9;&@km.J:p\ۧ3Dsq#۵M[_!D/P'kp>c;ԇҜ :T z̐ee 38vw} ˍt5lQ%\p]2"b2ac4%X3n@I߶Q 6Ò~g6E^- F-s]'p)%DF+g[OX %eX=H/<&2.L[(-?oy:E (^]HP{÷z[ z]B-8[o'֟1JuH?#RG|YFNՐlR/>`lx>,#*gcVvqw0mBߍ+:-Ofی5sfxw bQ+~0V*Zŗ9 s EXGFV]\, D\ "պ̾\N)?Ж̂x߽߾mM y"fs&>w(Nr} >jc;c_f$ORBZDkITcR'؄m\"oy8ŁpX:BǥbB8]N> GTȄlRbj%b}̑~ b의xxm,~ 7=Dw=!D}rTհ7>IJ}~'`odcd2 ;YWҦ  VhGȋ()>0t8I(?.}0(I#oնX,[)?'p5=790EW֙!ӨT\ 4.tC$ܢ5A8h=5MHcV[}J$ ?mzYbĥ3i_ ƛNVvH V*tNif;,Z@Ӆe;Xv\,c&?;=c#aAH<d&2%`Ͼ*Mm?h:?Ҧŏ%8 -t6ui~!T=X19lS_0b^cal?C,?rb,h ^HƑDe${JcIk+-%i G8̿%姓O cc}}!) jt0ė.^_PqcqLZAōDv|FK焎;"R0 mxv$!&;%fyE&PVUVXJ"QGj ̞0''OX4ۋ{'г#IqBYqjB'\u8z9t8'#8)b-&%D#Ȃ Z t490Bo|e5rq^AX `Hٽ"5[WD`0_qKv&ItZa=3 U,/w B*uua&gg µMXQZ2\KgR9v0rEL 'qfw;ĮșUI(&lJs= \1˨p%bx" z~aŔcIحT;D\_e fN 6=U.U^%qWO=sE.֬1XB=C ՏZ^B g!ja"*Ra4G% D{$%9[V|5J; N`9NWU٩?OhVL  d910·PŭZ*Y bLB4-p c(x6_2X3H \|[2}g&Ӌǟ( bh$)kbY<>E“al%2].gg1_s!Z!g"`Be(lY l $\^Oh| *PڧZɂ->4YQ2ie(!0c)0E6k{)qX\M9v(HȇEMduZT*N$(c_pc^آv\@Б~0#Lx2g {X9ghw<_I/QF"" d;LPHtWBI<)rQQASN8,oF %0!:RD+P5"8a?>!͂Hs":և-%??Y}}1}>@kR,B ޔ*脧R aaPU.Pq`,uhTUrL?R7u@f.+koqldzeRgkZxmW+򡧪7"c$ݞA3pGow8>̨}& :`דrxh%FPӱG)Z T+h"tVbb[r P˲B&w=Gp{?P(|94] ⋪]?'# \rTskN}jOVXe:Qa3tL2dWYPk-Eu `y(wO)a 压7$!-nfˠ˒a]v.jZ]'ӣΌ@D"H1zGj <}U ox߷;zcfPuE:#&x[o:.iF9(XEdo-{QDb \ aeZ]֌r>2l{Ng4f26dNHAxR/JuD?/^&P{?* qcpVi,X s!3>2*B &!n rI,L1<޼)"KTPaIvK9;з cg1[lW SfAl5K'"$9#%h{r nRE܏0 P7nc 0绋ݟnmt{\Q@"w)M$uA"^-Y'"Y, bYX̞N'EW6^$:k.&LmZuHoD%Je,o֛:|Na??}r<D nFQ/LJr)q Tƶ;rP{JIKo/2 nsJV܋+qǾbk#8pcXE5A6[ŷBGZ=f%'8[@qQ@h=VwԴRTYU$NPAǓXCx}ޙ,M_z< KE֞NL*jXDU?QU:o:,7ZhOq'+QY^;x]:džtQ\wGS} 9}v{2?ĎG*!ҍ5]?Zڅ^*:]R2ōRm=1p>Ȟw5 *KR`+W40Jf ~O:'-8'졛'=\ _e4xO(q:gF"od O >nm]OLc)uJ7 j;{M޹eYrd=PR}(;K~TןafFC?M 3._w`cvPb>zȇP8ר<=8Ru<5 樂OrqIݫ|<GdXOClP%ZL0T|t.ƈ%DM$煔Kd0GN_Yiq/^$:\x"1 C` kਵ:˃ )56qy̱\V`g#ԛ=a~~yн>Lxd^*JI곃5YtkbBD`t|zrT_:rcAObg]]LYO%aVJz,S[֟OoJ ,h]᳉1C Mj$z SF@J=5nH }#G򧬓H'Ph:]>J;;rxFIYҿDUmlnp3ƽmHzM;@k`k,hllF0N9_e) vTQG+lm _stvN1⍂oۓKݭP8끯)oWjDq̈E%YXa$天Qq(,59FJMfX;q[{m*4 n,kY~S;tI wcovGk!Tյd_/ΠC$#o`].gR?2E|YϏF9^CDtՇKx>֞iHO'wi*pg5ʗ|tissdOH3eQsExpNH{n G}[0ܚwqOo!gBv"¬B;y-g~$%;JXl'@4'dd¶ Jar͈%9uVA\괌f^S1 }~s  ՛gs{=zR0 rCzJkѤ&KPlUZ]#PEWGbDȉ^ӊ}48Aޣ9|fS6@HRZRR>,NFr0^s-pKWGbee z(ԓGn#ĕ/ Y;%M>o`jޮSE8&_Nre^q(:nlm'_/6l)HD^z.e˷o^vLq̈́wĚ?( ]m X;-*)}8zmحL2xbh)LQ#PUJC5TB4Wuw_=#0ۀd ŗ[8}߭Y6*fU{d7VmVK A*lTd ?Vh}%}5dآ)JS g;M߹7 Y-,hs(w'm V!}$,PJn*׵Qv`8aGJ'gd4Ư] G-K/G1UMt:WhE$dm%uVof~V,ASʸԖN;\XD@ բ(;s j{ Rc2.L.frE.~Dk$EcH*{n6;t:7wW;qńa6~utO1(taF/Wa!g [:\p.#^/ZX}m"J4LYJ'"? ƷffBã{L ?^,X%Tw|ǰl:ZE2BD Ζ@p_jWMj?4z/%ֺ;h6=x=e."dTQl!j`T7uh2Rca¾ݵa8K8PP&MgOd&nc3H&g"p\!unpaE?>Bc]97=lط$|ʓwS2s<-HwE|S|⏒-3jBu؃ğeUlG}HwLK3rȐfz PefX(>Vɰ&iaA֥Kͨg Php4(&n3u9EH'PB1<% jGffU6߇6 @v`*T'Vb ᰜ͛EY܅r9I"t{0E`$5[ `A^%u w?zsӦ1Z,]U?~ vWsSgL]&K m/a>>!܀?7i),#:RNx٭U^HTE/wWp!(,%H oz}A w ^:jIs}Ehv/eT"2ge"md*s3dtcskYR,(ZwΟsXQ/LMPxțV3T?)h`B/`= 3cDzS|bϰ|AE-p;Yƫml8UiMR#՟c",UJXc}wJ~7EjP%cM\'mG<UZ*70u(x^2'T\jHƬ~l.5+~UpOV#֟x`o, 6a2Jw rJԚǽEARb/ف.>Ȣ`:)pOĤ+8d4)R/o&3KqbI>:a؎VpNAkF{-MyQCӸ00q]xa.齽ZYj+*wXl!0.(+,۩JAjjXȆf@k-MAlEG #}p0$̆Mri'fBY.ӱӟA??7VUv?еwM:}!7:Y%@>F)o1 KzPᵁlvv>#uz` :FuMm*G+-&$:Ԁiub1nL{XY,5E_Wv_m6HD3J&/S7חX1D,u")RHz_L~$8j•-yFLVs9s𦊴` Hy]Vw&&X^X_*!D"N4qÐr 涮Ű iZ׭)'@hzV*[jbF0~7?/'+Hਂҫu)zg ="ii2Tj}:!yoE:!FnJ3Y|>T`5XFܟ@~nN*oeF5-K~ᙰ#1 ~]ЬF;;E!E%aZ<ǛH ڦPА.LO>T2of<Ҡd34,y7˚ʩK(RX,KP5b&2}cZ}t@9)g 1Fh޳ց$-WbLg$VKeC[p1VqJGZ,QPΗIHrD ,ܓFAjoN"kOFKe֍M"ѝx3DK M܍I5Y^ Z4Wt OfeBV7ؽb-hE&R}宆?Ύ_!Oc^4DS>yҴDu.T6VP3^QbP.@IT< L˺N9eQUek%Ģ4d&hoYF?Jb2WiyvUx4RLGQ{Εw 6wJ2Ҕ #QB&:ub]]rqwazne E ܣ:#.SY7p_oP *PZR6鬪y1oF*>2Q|d~5T0+̌h7%ҀJ@zސ8cij>"jŃ̠wLX.JsLS֥AM$"k̩6 *@,SqOKF!wSo̎׉t]Hu]QN*|DJJBvQy4x㿨΢"/EMI YU:0pX\s@) r^f)M5›`eɐof$i; H>&fAJ6})q\;IdP0Kѵ;^j _ߔf7I*$ègw t@"G xbN 5:AE]܁8n+zpy]^d:mлؒJ E`O}Gw9J֧3H8*ACo?mJgމvnB| J*HYт+3xd*l&P s?P^)gEh4[I7nNH1Vps\ γ"d:i@&/{t&SpDVܦtw%h%QM@ [vE_ < `ޗjBz.EΠ3EIj;ap 0TsĘY\AMrKXBEI "H-YQ MI90׽LIANBv R3F\ wU8z?]{a I͝D?*sGm?R$178@t=jAȌ|6bnIkw*ZV]=!J+0Ɍ+cER421 Sz tKblL#όV $3 qkOKIDOS>/NVlR86+4o-ΕƤB7TC ە١ r"Ȼ5=\7}i&VJh~J2CR e[[cµ~,VJgr\\hwq6ojZ0yow&/*ˮzhLb4|6z UV*G7V“=,='jK{9W Xiѳ8uo{J4bvC k3XKX|V_,55tJ\xzP@`ݨ%#%zxRRY,O.maEB_@_ztش}[(YR6E"O~}\mJquYG[o-wwp+-Ah-33h'y:Òku_ *+dwל&GfKa:μE\<|uM~5RXU=WoSCqWWAp 4][CUb V4c"uo9aAiyW.t͸ejBSh6b4˂YADFŽzN0^l)Vt7U;E'b(]ѵIԑtK..lߊ $_{D{{H~m^/rrij6ס j/pL=1eZ(@$aj]+.,'JԓDW_C&^'f h~w|]/.KPNZۉ˼_b8D;dRP3Z]ƣdRG tю /7 P7 X,<~){uqĎ[t *[f\Z@k 4bTX6U;b\`1n9& *% m\F*ky*2j~ 5"ftщOTՒ35`ᖥK}Ypș= ϻGC{ g#˛q#_Ɯ=+~ ﻉgMQnq~@(oIt'7-):'b`sP=QzV6^p~ k`o~ nB "yr*"]|iV,yexEV43ɧh&db7k*kpɿ'9H;7y`u4H/eqC~]T#NNT˜_v\0*[_|Je7Jcԩti[ }{HWf&EpѲͤ|T6f%iPCÞ(BF(J74%[~{G?BrHMx|SK0o=!J:m1`ۜ?Kv,m<*k=:֑.(NsTފn\:%b_t֯cuK_qǁb9fr!8UsE[uFzJV{e^zMb:^:S>TauZuyN0RZNiqo 3*5pNPN&M6.Mvj;=dx]IQWI4|&uB}.U|܏↑0MY4Z֘ &I.3ި7j }f 0^D)HBR# )bΟa*.cOIMj`G!1B76~HUteiZxۿ|ǷRf쯐djR5V[Πd_MoJ1[(KH_zAX *_ polܢ&%ADiiYaK@[ëXi&\r.ӆz&-CvM¯/ݚ6(FĕY;ѝcǾg@B 74EHk"x%|auXIs&R\o׻@jM&R!>//QqKX?&$ZYkԩ7s9 G{ "p(,gx)pSR CaҢSےŢJfy^CGs ȼҤ_YHp)NΎF|RǔXç;fFe*R,k/suo6Q̖"-ӢÖREnՕ8ecVŘДM@ɲlt>A, wƏGFNv$:i(2E}!9 uQD'/z83"x%7CZ ՝>ńϻ9B5)@%q? /x,s/m#3v'M6>'zl:e-L`ColsV6jb%WIـIE5NXa3$42ILJ=֦EBy._R,z-ޓBT &(hb%%+6YʌA3&rՑ By'KzS]n_,H5Z%u^kĿ%WB@JY[#x@-NFy~DnX<[+2݃$;K/aaZh8x^l-(HS]3C4 Hu35CgUN6,ě9}ɨJ$6+tp183EZ|˛wYɥggݵ|[9sdeu{T^kh }13>oCZq-|;^*#BS5ܥB>W`~_g!:Ku% q50B[/NEpr:|cv |tЅs!ҋ=~%J@eJ0t6 (֪? i\Ȁys*մV4q-,:m݄¿Li}ԙ D _%U$˱j c[kUiKyP ܧV0/A"a$j.(5ϦāW Y -K!0M:Bۘҳuˀ lLY#dgXG:?],uhkh< cm'%j_[>dMd\|`q[s Yχ z<ڪڴnlQh/$[S^) ϪC3\B'5 89enRUhwT:`]dU2CNWex65e'W-ÇiF .,km\p*އi32p ȠnidnaYUX=b >=.d{lBZ0b{C1+x Ap{M(4v1Wʝwzȩޭ\hDzo |@B@wOjYU2t>) (N} zՃn G#V(,I3)#Բq=oDsqݼ`@oZM8,CbS & [\EF˨)4$7KӅFhNJ䏊 gI?~lyQʦУ+g:~r1(zW0a|f+_.lYXJcc2S)VNQ0rϽV0M[z.{O3rlRrT]$+3dp+n7X v^8$\b2*N~ύfo{(:?o4wțxaiD "4QfBdЮW){U 9VxU9f$cC򞭝 i_V*ץ!Q-{c^_@-Y}c6"W^:AU|y/QX?$_wިƔsҏJadpŧ *% Tv*Ǜ2P>xzRȊP rq,䜦8YwXB {W`2"s> K2b䰀1 /O(zXa*pa ojb:RT d-#$P^ &u}\x>A'sYʳfD Yq«CWu W%*&){dh;{s.gr<\ deDpU!=+zv {ɶ(?YT0\r_ I?PJ(dΔheژAM]t$:PsEN> :DOGB\Ǝ9_y혁zsUeo{3'i k*g+&Sr|25B'w#퍓j3S*/(VC>sE2S"sSŒ!UpD $袬#I_:/yqˑ8~et7~&JSUGO"cMa 8HqwԲbC=C$7; /xkܼY@Y!%$??XPRp`= u(xk3BJjYI~~Ndyu8 Rx@  added to flag vignettes entitled % -gFxVo6 V`_X/)d-ѱH?P;R40,_wǻwxLYM%XgbaӺ.^:q$'4Zee*\U[j[)9ٴeedBX^J4oGD:c(N鲪e4WSߖ>N|{8}D+RtGJE0plIi][Z K )|d9!QT9rJ{jUh锪=e%?U6U]]_`},H}Y% *~ o=rʭ̻wsbBv6yC0} ^2s!CY%NBq#Du|BY(iGZalG+hhJP^f ֢Ţ7l1\4KQt2IP,hið&١n+o!{Ƕ(O3h##,T? e`)#1|8\Q0Y,KKK]o?>z#]gTou^<2ۮ(,AFo2Ed!-QVwqƽxN]ע>EL,&GۏM 2v.D]vyz.ׁ`YHOQQ'hRp2€mXW|;c8 &%7$,Jx ftzO+I0$)~]B)]"kPa<%R% <ϲ!AֵW #-Uv{=SV`{-zw-HWݘ! rѦA 5> 4Ai|P'd~$e|: cb8.>k^F\M?¡͛m/?.!RԖu{?鎩74UhP,N5n f[Tr>=e%>#=BS}}} 1yXp7/y[`p)ݪ) Ca%eU1i)ڇ"KpZ>{vq{(:s' J~-Ưh '4ǝZ#WIL'a:3|d9F`Y?ui!XS-lzi73Zcw^g[^s^`d 鋉z{h*x-\pyjV$??A#~ >E `Ix;vaJIG}bu}^e9~]y/EU`1]}/[300i W =+Mfk. l~eɺZ샗)M-};|MB74Ki\ju0(0SdQ;sRPFQPwfWPrq{7Ў/-{IK"z44b?Wש۵PkDotfן7DŽ!I ErXmxWQo6~9"gcV$mWg}Z6NgHqPlM,`1yx}ߑ \e#kyYgP[S`>8:ďER46KK++@%HekZܝp p{ۺ#p/0ՉP%dBcEڥqNjAvU- ãok]fCɯmVrqQ2GPbt\]J;<.-ЧX133&Ed[ʌS @t]{.ExK"W-T OzpB{ ^ZXI0y_"](L/__9pL?r*=Iu6SFkf-IO>l;aQ,IR39RX] S  ǰ-J }W+IhYEVs m)׭kZUZU0FA,(7Y,F(kٷ׍6n tK¼0f1sxr|*Q`O45hlF#Zɡ3BED$߰4y49ߘ_mHpY8+],v=pd{T]'>RCGp|x&>'w$-Abqh}{'zc՛|JsSbGGTm]As]JíVwHc+b2NoCDAg!iak k^Y2v] #."i, ;r[﵈/Vy[՗0.灉Œ,P̸Ij􄗶7p_21% $v Ӆ1XG yHk6W—+j5. 1 #lHdҹnzxmkNT |wMy?txU]o7|؞ Si)}1 Pw5òbw;Khr9;3;/mҦ)jգ2n蕍|ΒrtzMti'D.* ҘyS/@^Itb,PQ=~ Q7hE " .1k}y}<ȝb9ơej$s[-e%n:sSj8DL^Ǩlb1&BF[3X0ܤg ɫtK"2Ձ҂<)OM6FT:ưJq|ri2Ƶh\w:vi+V{Ds(s)iyv]& jt!|;^c>WGkt%b́7]jl kwKLq-oD ¶;hGy[ 1[L\0v7lj^NqɸP;xTU$E.o#̳;ȿq̞ mZ^ϬbLɰIY#/'ȸ8-)`(nLo^E @!IqׅHթ[@= Q 1rE웊藫9b@BgDzKNuXٸAT9#E`)ros\SUZ-b= ^ pzb Ajt~mp-p7Fue'[Mղg@M@Bzߨ"cІmmGV 2v"~"j:wu#< ~6#`Ej(('{V[1Vr>1W 6IGQRU6F+6aJ m̬?O?<1<T6qMU/Ntw}0Vq Wg"k[U@󇵘W_(`xW[o8~ϯ8S bl/i0hI-I9u I],aw>?yFUP';œgRmAZH "LokIIiop JZieCuۆ>ԦJ _۫7';娶Rx~:NxfMk [΋MBk/Dݘ{WHCԱ&sb@[{k9)ckxͷ҃i)ԡ1~{c$tUeHԚ;{Y.`>J}JbX}un~PX?F}6&:K15rl7ɐb :5N>uf-V:/p 3JujǤIк/I qCF?(4ѥQ?<( O/ayh\wx^{icMc&:Ksqqb8SlR(Kzi Q!/)xZy `8'w**yyXȵuAE%cgl_7bx C) 2nՁ߸歩CSt}C#@i2"e1Zy8/)2%tr1}`=()Kg}} _fo  rU)+C.Rd} a1T:$he[ d:N&c̃=lyeY >$ <W9go2~;Jc~OCm)xi 3x$[<&ړxQk45xVe#x1ZUY Ï]yyG%ahLi/s$%Ώ뙊 7ih4Fxm? SI'KNlp"0L֙GAMq$v`I=8NA),~L (Z#DGBa2v] {2vfNm&@GG?$*W. w#RɽP-Wđ&&Ee-%ۆzqK? hEW.y_]ǸHΐ;[Os=ZN=wc c#wcw*NZoؼD&Zb𧔞Ya-0}vF >ѢX9O \?E -5G_Ody#BORs*K52(ռ\$c8 v2Hp2)[*Gq0kE[fODx<̙֚e*A0gdYC&ri(a襯u$sr`J^?{ٛE@StB& U qrպ"UI=|l %T AAfsh'% WC점:);kցJIޔ\Fb+T:E@(O4od@彤НҥnGǦJPOwlYa'Ǟ_E`,ҕYAFt ;K\X7Q";#Ee;I 3(n""\ UѭAl;HzA5VwȠFo ~97<\S.tTֆoJ4)BS\<rcK)y_[uVmOF4t?,WV̫6 jX6!V^Q]+P|DEugʥAqq1Ta>/?\q,p"3z'*"X~m M ߹3FL,\No_m 3N<߹ry+|u ڠQZ޶Y}D}Zf 5ZMFic-.c\T.5آ(Y%WwQYgӁeq%dBw`irWTހQ]W6!m +XӥqGXO7?xt)el}{DLs q1l\9#ӌgPq_ #]k -,>?>֓$ e-+PpιvyqZJԇ '4JӋϮ9-w>fA{jqW5JÌ 1t#n\ ^"wacpˮ{_?y1x][q2LNҰL(C߰ fO8`0m,:S{h)a2VszhTFjN8=u@(KJl(pO0}s|/Z=FC+a*͌8ȓl ]QbMA,xp HI F% pF7w?&F%hAiuAL 9lT˳2k?, _-qphw6k2c#.ڽvYF[F'%F)fqbH. ϋ[g[46rIPe+ IWb4Z~/gڴb9VrTS,uF(I_~w7>[˜gKN+:rariU2IӇu=iT9*NәdzM]RRr0ҧDo)E$v U{N.Smw)1ȉڬ'6@nt.?zA^phFM<<<?O 7B1iç۩?16F%Rmcvh5my5ݎ~sѾW,8@м ~i+C@tI}!vG& XKeY_}]ա6GC[ T+;&w nezTDMBWy+<8vi:Xt#Z5HHZ(/܏4' ϩ%f!q HpGJa˜6s^IÌvHidI,~ }KF9w2Ml{yWB|ec[]  W(3x}Q?K@ҒEPEdh-.r\]hJA?B>G\r?޻T)QӉ쏽K]-.`pX-1ӷ*9& r郆x蠱guI%_aH\XJL0G1B`:k5Va;΂ڃޒw"6_6'p`iآ "(k\Ycv'_PGSq킇`EcHpE@CyP)hVbCkV'S[!fb-# a[B 艒Q9L:Q- 2BnLĂqu3tđΙ=LUE+h $kOT۠u'h[ KS]24:A8b )R v&b_ DB$J#i~sHNvm,9!{W:^eOBFfOr"+ԅމkJE&EZ.˔'eu~,;TgIדZlmEcd=&⋴,,oWXWn Yb+^NnE[>m&XĊY]/X`J׭gG_rzXYQg;HHPv_ [UqT9">R+z~]{*RӾ4>F5FQ2U;75WKguU)yzJRmUH44i$sՐb, 7z+Vs 2' ε:c Ljy0ġ(K![q _-HR?Y{H]x깭ҊVpͪCV iZ${E3RSQY ߊVUw/ mMi } E>B?4)bDMۑm)w 4MQ*3y%%A$z9;@?M6,p(Uz?9/o z^,ң]:Qn~t;vXQF08PT9&3USy2zKA]G@c:Hc >)\RlRю^wxhv=J ֜K!GHҲ"R\+qMu NJy`d73>Ss] &48&}Yh 0yUDHC4vt6 #KŎCݵh5{@8vɀOi'!"U Z(*F?BN1`|mzbIۉcs(C4tWmxMJT v%0z.9;WY믟?/׏wl_WWQN;@ x"xShیDc95&&!CXB^",cp.T#@¸q<~L_ޯcgmmR\[l;F4ol}91Ґ$0D}&џp4u kzE[v8: M}oj^8p<&Q޻yHwj_BLJ0>H3׻״0|y{C0O5UL Ei@hCHXh '8hx:X'Y:ł>H¯ΝctT)U_6屇 8A|}#<$s`u^q fjƾ3^UyR~f\4A8|Q? );az~f qƽIGpP@^o[xI=eH/~g;N߭@BHĠ ^Қ /ZoH@ d ՜gv1iqcᡟ cQG7d4b6F|¿],ecu"}nё"iZ cput$|vIs:f#;ΘDA'|Iw&Q'k?6rͷLVdVn",&C1żݮpf޸&DPC؍'.m>9>#'d$!ּ6Ǯy(bvh?+9QZ"?15qdoS͆}J6i}˰G-c%vo#\/ظ/ n!N"~ӠMhxTMO1WiR{.R9T*JȬgcx7hK7_o}-(W`(h-DR3yw."-kb 4P [ͷqw*I= qM݀HPJ j AEq [oQ`5 LO4>+(Jq8~|x% 3NYq.F6`Mk4T1Mʸn9tٵxWIPz0 %s>U2׆l6{ S=|.i =_L3.U>;_50Y‚D`;WfΎF".p!SàvS<C\VW6+Ǟ;WՀ,,3bzbFby,O*#9&^2Jrby"r郜,U3?t%W pUQ==g$9lp@]VwXe +SYhw_1d: Ci`ac4 /CR iqj!~ZQ*oNԲMF ~SWFM|KɤzS)#_DxS۪0|Wl\(2C } Qa[2|HZݕ-\rl3;#,Z,+ʒ[$\V2PXhbԙΖ2KkMҷ񭇤;X,`gc.L\0PG3W{Z ZyaQeQb-|qS>J17cj*Nw l$u<V%zyg;\}nGOI8/qE::hJrkiBtU?цǤW&ҡOȟ>z{$yqg Cc ϛ`( 2ji ͘xBA"aa?2'- *}4B{tyRZE[8*X]w0 lOBDi vY;9V axWQo6~*C-ckfi:X P ujmsHxHʢcg}&x>R'C879nkhXy˖| -^ &%Ti-mgR;!kQ 8 RWa*}+ {%wZmc%os h%7Pɭ8XTLՇf6Ӗ5H+ͭ;4YݚV[*,7 m#".3 \ Uvn[b|Z#{al){DIq!6Z ;*b0]lY֔\"V\]z%.P n<.Yռ˫Vɭ@Q )eXZt"5DJ@/k"wmZ[ah.jmiDcJbcwLD}Ǎ/X+]g&DeUEa҂5 Uxy bpZkxӪz ĕB#a"|Ik̦Ytݎ_9V~OI{c"~h#eZidrM쩴 Gc02xF}4{wb{dUhŜ7.ɳwL(dp8φj%^vJV^ҍ^sS`t ޾V *gxNa{gF4#p ޜv}1)Piabf^! |fqg>i!B̀j<| i.٘WGԁEoaH0pH킌Q f߯DI(IM=`@ޑ"S>WitƎ7(㨃= 3\d81D͎xtPa"K‘[o¶$WK,o[QTEWf8=s? u,1gW$YϚ4#ct>,NK;tԴo3\OV?ui|5s ZR\K:)PtשW"x#DQ X:BQ̣Lz?WBF+J?20M(,J?.XK O,L 9g }wX,Ǩ8(%tfi_q$IJ$&me%"NjeEtoکbvv}-*s1Ck7 5 |ma⽋Eޑ!Eݲ=%cAAO̳ϟ>MlVlrsqoq*8u:- Oڣ{*evvxŊٻ˳[zŕ:jdT B'+ǻVh۲,a,eUӇ~h,6)-RNn*AXtE|Oqvs,oHM"_#1 nxVn8}WLi ^%@~X$E &S4Ȥ+RΐI rxpf1`7 :c>22\u!J`UJmjLes8zv?#J8O0X*/LC&-gsJj]`f#"o ,(Kx0{2W q-LU]/51Uɏ51݂o .(-M8PwXp ㋏|t.XĉFJ[H[L+88",]M%Qh%oG!3#fu5ǩ͊(T0l9vH_.24{C1 m]8a}Igyå[*D?ꍅ[Zf7p/ &yt[yeԍXZbwXm!:2L:C YHNDbcϬK4;@cOP~c'fvv$ e ;d:땴Gp-|$FSJ9g%%?M̉D'J`g c=9^=PVl卤]b(kqyu_Ȭݝ7 5wֹ3 14R\Zf`-J2sR]k$ݢt=l=ā'؎)"ֽxZkw6_IC*j޺5MNs$qAqiXSJ~T}$v}vS 3zJ\zTLUU^ȍZ'dǃ_GU/J7[%ZWv1R^%VR')a+$\s&ӬLuu<ܨ(TepURϖgӕo.T^Β\֗]de!l\ .ܬӤʅ%0hj2XxFͫreVjTJln=5U$+m3AyQuIVzSG:Y!f=RݗM.!].:)VÎ9 dC&j]V5~Z&*:͊kXrCXha1zS,bM4[d4U:ʌ2KTf+N'iuB@%`S[!:CTQ*GftM/n,)Ӭו6 JRCT~E+~oYץN"< /kݱ~G!+]sm pvh@FtIuwrSf0SDf7! m4m [V y0+ N7}S/aQv0 se.;ӐFEVC*}(J (r _&xJgI@IN:p `Ё`(x Mӌ{$^Vf V˥sEi5R麩 GU'<|&{ȍ(dRO`Lb=hO$Y\]֩ TYIl>wT #IA³ i9{إ 5xY)bq'}gc+}G&~&u >eQWM!qV#uY@kN{8YQYPSm4{*W q6`(&6 jQv:EPYSʐU{IV8Z= g:˜ߓ`lH_AT31okʀJJ!q#͐]9?O:}xaW;gq*9>~X ~8MG=`V?^ * ^ Xa7txg`BX,ȉJD-GDy}EؠsUbXTp]%ZjH*s7K(A՛Z [TR'u~OI~"#8?&3SǞsґu:Yei( UV"EUVb;°)gm^bg/Z98W8zYb2&;Zs +iU8E=OYH3 <+;i[ܐmRL|ng"+ wg>NNO|O >{y:Ӌߜ}7ɻwo8 6} Sܲ|7Ck&'Hm.ad|kK\c -@aGG=%p@%BV967n{JِIH:17ݮr G=⼍9jURֆyі,Y]{}: }7ll fv72baJ:sCO4:JuŸ.Ks "asMH``&#_CF=tnGK˶Rwv($E`\F]<*f{+-$Orr:y:Ї)pYg#-!doDrh ƎaDmj(C"*1iXVNKg秧 GRluykbPh.-6hxMזH^A.GK QW/q5 ;r64k=Czf6OaeiKkAq"͆/}&bj<|t^e.n $9c Dd\yy4c) x~HW<u?iN :΋ w ޫUX]a>XJ<Īgˡ[")$=e+Ng>ʐ<߃%T!wd*5do-ҷ5 Nwb<8P c9M}sH7M0i-.cj_L|sZtEѻ-Lϳ>78wSnpJD5H681iOi} &zڒ mqW$+؛/yP@y[N88sJ&6oy v?޶GA/\.8l[ZrdGS8QAI8yEdyYGk؈c4ZߵUr#`:[y$Eקՠ ,~i2=rǀHB2Gpx#0Eu&e閶l\dini_֑\OKnMyzH3 kl>J^?H\Ďg{t 0 <ԡ(~kAm׻Nra|ɖs7ٜ`m=1N/M!)dAik9;r>~Ch_pH)+8AMc{B㒹D9Xpg*F3~>F6C~xewl'c=v>T>t]/Nh1>=̄ _lϡ8[[#\o0tIrͲg_{ԳҹV.E>e#;o̹'[0@eKY]sl~ѻf#=aH?v$PH~"H+_ua{˨^%7F8)Qi7ZLɪGN2l)&?vs&fS+r.CUɭ$K [[2G:/{w}R.B!aU dyb1#yف_s72ejۉ8p=veJDD@pYvPՕ{l`ݶ vr:=(3[t q|3?h&xmRj0+C{,-TJIi0[[vDdIHrIGPa53;b V;bP)(u~PaAq%h3l,VC) xdž" 6e (oqDaG a Q25d_RIGngX,Mc 1Γ4$k-S ̪JXʅ2Wf3.QpJšR8G>p\y6"WpɖzaX$3ʥ 0?䴿 VPPnov;/'yhoKҨ~ɎxYmo8_o7|nmۻrE~j %jI*~3Y- עfϼp;;e7WmY%m-ǶB^YLi^=Ie V8_A;finԎTX`eQU8wR7^*`V{5%fzoi7ˆI7>C-7V`{֬ܢ/@:4?m%lIUe ̻nu*ݭxn yiekij(;'+!V!twj0&G윂ZBT>Cnz\й++u%esXpeS΂ߕ$3p-J7t7|PrmͳͦUڝg9bmFՃQX&pH)@rbnaq?F/gkJS,B!\/|/F$ ߙaik>L\+7\ν䆎gcJtV1[<Ɓx`""#=D_c!_\T]@7kxX_i^4Ut+"ؤj^)#>?ߋzAT.XxUD3|pWin @bYZgQ=tOݼwSl5!ރn fuNktskz[3h/6Km6p݆L \I?ƾf.kkE{U\}LcF oGj ?r*i+6%<;Lܷ^|P }&p_@̿/pQ025vg=Q􌲲7I8FOjށ߁A/6 Z0yd_Nl_d !r-HD(ȑlL#^3OПJaJN~`4ˈ~i7DN 亄giD#JKL*>l9x^V,ѣiLJG}n.z( j BjA ۵ROF> Vr*hb?_St;;^:~TՓ=xD1Qud=CkɱZ'N29>d|?!g̙A:2V Բt4SB+:yvk ԯCfV߿}J0+fO?1% R/dp (Tedl41D4NAG&pg--N^#ѹџGn, cGCHG; qij{JŬ-#&XC=j8zk$bɇ)klD$<^M>Y C)K9GƓx6=p(H?I1`_MD i_ N,?Fzvj zEk7Um]|rVA]!Q~MI44YL`t4p4%/sB;*ͥ(߾'AIq[({ nvxxbxQa/{yoǷ0܁?: ^a6vOl÷h(Lh\Kw8lxY$5#s:OB FC[X/+ Kΰ@J, +VPR iwk7>{ZaI]ir|]a=e {3 _tX5?wLC(1JpqօdrSz0Z)}ȴ$Pq3/)*1 ҺtNPTtgDZR&8T%3ݷEY~z,g.e:yr"rL#WW:G<lb;tnn05lr<-aV/u,H?1`?oK[9ªx/KEtZ]!x25I_T޷xUo6⪠8Z5 ڡkKa0eH⸁~Xn@wwQo QITTI1+(mi5Er?t[ՂK8q{ŷT: 'AFH'ܞjY2>ep(b-}A7ʟ(`TSxWyI,HhW{O\KN ف3 hу}ZN(e,6,c0oģ6}+h 3: Y_O_~?ٺ7׷ZQmT}3@kZw{z]#"lg{Vf\`GJ9Yb{0. 2㾲&eT]g^Nc @(^w.H"~|JaX4} I_fQ%ͱ9xkb[Sdz!jF8Yt⺌(/^E) L6Ƿi@߰5OWW+ee/el_ 4E7bU5e~z#uS?b/0YHѮMyrHZxWmoH_1"*QZ*iOB&Yuk7k;NtCj30Jí14l;PF6j4Rc] =5\r/`V *#-+oؽM3]/,7Kn\jFdS|i8GBq#nQpF$}v8T< |VϹu<#Sc]!X;ٰ6Njjpv\J +%F9$|鴖(E aqsWY$s 4n@CN| M0Y"W" L]#m"**ܦuofrΜ6֓bȊRK##_-7@{CQΉ-a!sMAx JU|}(6s})qԇ >D:ȣPs}'0G6؜O=PD#R2'%lAcj#{+ 拜8@0=&&=/Df a5M.j՝խaGSY. ARMe}o{?wRn@'.'R[+z!X%_ {mp Cߝ¹p31_l4 ɧz<,$칝bʨVyWGᱰxtw%mgw'2[-NƁEG/WǾu2fb $-sX8.{so{RgL&i@Y j!c"Ϲep(-hD!7:V>PX#eR3gB=aîC$DTW_ݶ^ InYz?2ؘ SAj@ScY5drK;3]9V&l+e}8)RO@4<^\MM~]lgU'LpOyQƴ}%S*)zvsoq @V# Z ?m5sv;5gg  pԇ3hOZzd|^/XXZsh B֙*CKj9G89>]|/ziޞW@ϯΆp1>;:4( }i{Dw` + m|QnSq]mSxSKk@WLȠ Rz2MI)Ĺ4YK#i+vv\G=3ոP0>f{} T' H"x2BQZ쌨k4i@xLtR߇n%`.5TɌ|f= T [+t-茫B>%(Bx9\ˆ u>dh#k  VHw(Q-E`, l܅5wA*ZV7!~*2XjW &a 4H;2Z~mEi o1ٕ;am_M!~U~]AQ+6}+ .nfp$&9Z:[AJMQ+4xO"\"h-IҕbEb"S}1xuRAn ܃-%R(Vx]PXFm^N-`C,z.\t q.V*p5+@瓱=YWX@keZIK]#ore];_JH(hˊ4R=KM&w$\i/Љ BF5tcaZv,/"]*֓XbQfVAJl\:Wr .tR"˭3Φ/`#7kV ^'уԜԜBBJ căU}Y9Zޓ x$"~mxWmo6_qN9]6HCD[D% Z;i')~h]{}xj 7Ӆ,P2]2[ $yaru}|\ S[/Valp7ThGD}G#WI*6>^\f(#DFX8+:Q5F \Z򤦝S7N)~ ߲4lg#\RH\GR>9mf;YL=:vᬉp3dQMn{+Jœۢ"捲|*Y9#biOs]2V1y婳qG$.ɧX,NyE6J2-=z@Ía /F|,NN[")adSGdž!\p`+E5q\R ~5LHaLcMU >@J$Jc3Sp_ :;•i )'Lc '45Zcjj&]2ڏ\*n@* Nktͩo'ΐfJJ`c$xlhJl䰚 6ldQ?jep@!!C{*y\;햘|Լ )HC7sĈ_3M1F;Fo0<=& =y'8Ws4\"ԕ$M&̵;mr6e47`fGc]#0IjmɱT|[eԆ޵3866sWTi5<ÚP;ב^b}e:Ee6Q]\c4CW_~ŶTKj:谢DbNg{dj8[͋NNe})-ǼviCpg8+kލK~kMp*剜O"4ᗌ>}"1wk 3K7VV?x_Z~:Jг[85nkN'Jno$zr{T?&JkYavG`UmHL9yRmwwP2Ek\WC~|KħbmZse;5+ d\Џ65J;ʵ'7G5f1/YG_BɹNTz}Np՜h_)91h]I9&qIشN*BgaaA*XU\8|"J "iXl'pp !n?W E fB IAYA$nt]%Z`GM~A.ڮqqxU[k0~ϯдqRu,F֖)RQJrPwdRЇ B}&)n^MXK*9U=W1yj"f$6U9 9x&\Z^Ι~r"cǎF{YQ0EV+nKp3wNNdPxΒ˧m~ftctv!*!VϜ6}8VuаN2=!cE+Kn;r{}} ZsHp|^ ̰q^tUBan|hrPzCJd%TиfLʴBOVEVcJ I4Q=(pYC7Ԁ²n" i.sHerl|~6z-;=]Q͡.|yG#ҷ&gM(J1_n]DxH2mAd$te2nhmy=/)x+sFBPONo~J>7􅗁=̉t縿3&(H7e~YrXR <le&$O?P![z@ nYXAbK.S& ˠ{7$(D 2Cnp N.'=_f`aJo句6>E[%ywW69\hw-7O4<$O^ 2*guY ͭ\_[&w%`Znx͚3*xuj0X9{JPsƱXYc6Kɻwl6$ 3;d-4àw 4g@|C' 9p9h< #[@=\QO/y.ϯLv: ;v{0O586b<"h&D'15LUű}r =y#Ib'cj(eʪN*wdM)+6:(0N -58ol~v<(WQUc2'0&Q%e31XY qf9Q @ڠ j6or1E$m L 3 ,Z>/ z*c-TOޡFK~!\?#139By̦)մ`TÎP nIQa~2@-HDP'IoVj+\*[xG~$!oxUTo,}H 5q4s)kPרa&# C-z?4uR*Hm?dJޢu:wi.]&y&JQ*~m.k6|2Y ݬ`3E­#eԖ3A6K, "9D!FQ>ScG][#kiP|B 70=Y_BLHq5fPy(]-j-E`9Oiyz"ƹc E#FzvĚjE7}t½*_^69_>-V^I5.j), OBcI LU7JjCEq<)C ;v?GOرFZj8[J:6Z=u;b+5_ 4ǩEӱaEZIGG%;"ږ8s!ؗ)Z[smVM' cRaF6ʱ]oqm0-MgOjkil-ԝh:Y>[ `KxxZ<=f8:bg/rR0V6Niw;٠;/Q&K RZ_MTK;{#8l?,K:]GŻ JjJqUbN!Q.c$+gnDdHnnA=j,$Bf:lZQ&zSMMӆ^߃V)'mǐx.ZsY$˛F)QCr)a]?xL%XwPjX@{[ wo&&7 7~>Fm [PMr{-gjBK͚{{tPZ`=)҈3cLk'u@+ɭGz HLlM2]4v^vtnTh>C@."xUMEjV5R& Վ2UNPcU~g!)(pf߷_!#K.K 8R VZƁE!qttrq\88ףO?[qmҌbׯǘt~tѫ鋳ӏI75u8t;fCxܫ.Z SqkY*W(R!RЙiSY:s[vP@NP4&VG }4be\kkB.PW4!CBFw[aнBRJsJC3:#2 vZzSo3`8gJWAHm/$x665bDbtWEv?u:?G5ݼiOď_۟;2 }:+PMT :Cm*mݹ@)0*7\c) U| V)xII].+îU|_#YV3z4-kJxGEI 2~-XаHJE Ki &<CRbAϝqxʌ-2-! y{s6ad"y&(+ %V~pg1H=WvoHa6Jl5{qmGΰlNh">T5|E@j x\mw۶_~{k'ۜMǹ==q$-HY}b;洉D`/,3 _,(/6"mun$f8>3OIrߘ,i]̛*wL<ǻfb:)Y>4o09K,x6-ˏ5nn* Tz(6OaAy~̊r˷/^<6O -6$in9瓢pɪܚjL2$[IrAtRXs]L&&7g4Hv/:􆽁uyܵD`ia0 $R #>ިdV:;"TXnSVdl0_ە[?$wPe;\B\];P%ӚQo)@Cc~mH  y.ғ_ $>;x~]cΩf;y]ͅ jk"DȨi>`my wgt:,neIqNX9;^R,Rb4,WuVfJI*+.O4+%)\5'odzzjp+^`/ ,aN;V*p4_3gc\_;* ixµio2W1q Q} |>2*yvid)"ޘPglmPoSw.](@fUSUS+NVeOЪ f2=;Bi'"iz_&Q"Ӕ̭yL{I?oPdN&.OsHm^ ;̛&1BxƨO<}KntdurjIݻ̺W *iNO nkY-j03M,/k,58*)$u=zF'Yt̯'b UKMUb8S.fym>R0bCG QSu^ð zO= ¢ Ed eV]y(E`Qa- r1ߴ3"w(ٝ`תdֽg%lWTCgi3^E4i9 i1N6Cd2w)}`:Iu֩fSx{9 ne;B{?'A\OIq<׀""=1R{E\*^;QޤK1e(($8ū1[?QG=Zo6o;32Ev|qua9a]^A{Jg!|Q8q`X1'[N#0 j= lkpb5y}m<"GaBg~Z[д3JcHjDۍƹ2"$9Zv1w7Czѻ#کm$o"RlRcFJJ9Aǘ,wN?,~ v1T0Bi9}S/J ֥?;\nᐾHӵ1d蔄}LD; z,(,rDI$iSY[Ub%/NEpPF b|7Ф;Xu(P@E$|TŶ| l}1ՁaQ94=C6[=5tُp ~ WI{-xQnץRdFv1*(EB'z2fvsG@ v"9yHKGHW#n4p &$FQKQBb bP2II |qDK_nUC6v?]K\BMk1װڸF#~Kh/LSZ_|~/z5:!%p[Kl3PAK|ge]e<'?5A#[rݔðʟ̴xa;DJU~D J% Nɼx9gѯwm+;je>=U LʧX gG,.t"%&wj#1?1x:jA)ņ<iBu-tc}?D)nZta̪C쎜ǭjv\J)O8dt  ʳ)L!$T0lZ4 iH5*9i<Ew F"ʕ,^b8p‘fQ|\[l%ЯUUۖ. G{=-'(|7k Ц(6EU($/Nx>"_}ͧK9-uL,٫HӁj4"^0ЯhCvNА"6̮=0Ζ̤qf77s|QX9)A j.ǚlKHD$,sXgKXZR HLH$IZ+; KDީ(|߽ P,4xSB31\21b$߆#;+4~Dtw9EP,{@y}DB0|V~$d w̺iC㟾#Z6[uNsf!y 0"gYϵˡ ۉ"j|G^a@[:d{&rd` )`׳,L* F*? ˡ1͢?|>@SOTصB>וHy[R| ÿ)Ւ9X ZlDkU@t8P5_A"j̦p9_l.̊(K/Sp/;D-iC ;*0xƛc񌝚xvc)5ZslBs;PK)gEY_gei7ΖeS̑0K!`փ B |xɋ=ʸ08dD]Y&jKyi 9iОh3E.i2t:NqD'UzAt W^$i#A/뺪yD@b(w :5/Db)3(Ta:K=61ȡ VF Cࠫ&Bifn`ѿŏK{i \Q*İ"q6!S@ÓH*RPnCv/!s4гd.Pd_~;ܳ\Р&phyd?B8M {8aS;^6f9zρhƷ^Eb${Ow,Hؓ-17|MR,~OvF OYᱛ.9Er*A0Ėôr?;$/˓nz 0J 9Λ?x=izcp>wGX0E q5UDB9,ӎz\p87c%*a.ܴ4|սk"@em^AIo(lN+a7>x_rQ),5XT'Sj>!n1Pޙ.=$8r<\_txwX ٌ>%3ᣓ%[ PT(h.SFd/1e^Vcﶰ94k]&trv^!Vc^ #m~\GLL$.|tM6)غQ̼eߊ.*(AsVtd{~r'דf}XEc T2="i;J wm=~ZP0" zs &Y;!@EM.{HoxV1Zʎ$iA9B~v{H0-Kc$9pQ 1ab ]&uLl7̕AqH容q+Eݔ݉8Vd\u%08Б4u2pVf?<ۤtDw!ɵӂ-p9ч/Jꟸ hu@jGrgHJOR1loKH!%i">R*!S L2q<aOM|_^(bfbD*xC;iஶ jk Pm?C \}Od$g'+@[W[n(FqW3wӄDI*4ŭ\p@Ey$5؅E6a.\=>LSa'Y䠟.VZPh8vJzIم~)"O|"4utICdo :Ao-EՆ]6w:ZNY}sLNȾdnoWφrMxu]-л.H/5%z(" p@Tȹ-&^~82_Bp\|):vG]T"e<.kD42佟aLvqg~{Zru(ўS5FAbW+9ƥВ3.uҾE[9rJHM_qh^(]8t{R*&BqL#CO͓HN'aO?(s d s)Hخ fcxԥm])n* sLuɈSn̤ͿU[!ZKg(+тox ٯy"Oީ ^lhrx="OdXEރ+?b>em Eҗǖ,^L>gEnW.n1m:{ 21 1ǎ^0_}Q _@j5_#U_>WF| &cM/ZZD4biǗO|P*i6ssP>w5;\ɷ*#ݚܪZݰں`T]6m 2QZWQ7,9\_;DD[ U6 / `|D.|0%m"N'QMǏIo|4:0=JSZmP(P-7a7.7cˀ"ic94ao2Ĥ[7,ԹYV=l|-F188I;HjBҠcԂo Ԣ 'x` MtIE/%K[d('.r-ֲÆi*q ⡸ՙw pcU^`xR:tIޘ(<gɯU 3M mҷMpD8.x(>Laꑝd-GkĵJ^M !wBpòM]"Ũrϓ=/ [eG a#m̝$9z?EBUocw4Ta)‹I*VXlduYy,?Ze`J+Wce q+7]䆮nwL#'xF|olz8Fvq+`|I9%|W+F+ңDq9+%8{fǴ3%;)fitu(ޗHN1`H Cb!vׄGSK~=b/:~'t20ƣʕwp^형-jϚh^$gk }cQ\c,F|HNI?'FotdWv"Ɇ0str%WR4; "gZ]*߫\ p'*]clȴ@q'brW ݍ} 0za=y^)Q<U[_][PЦyiۋ6oA[WLQs8 #3MARעSxcYۅ2_x”?1cN0I"5eRti&__2 \i6h㛥v}uXoͤCf 9_s 4yR= `:3M&9'h 9_(8GD/Es/>Yi>/͏=Ja KI/kk裏'IJ>+ nѫ?": 1{2o+ 87ћhъw=t(E('=To]tvo,Ce??j‡rCi" onťʯRt_O4xmkPI= 91vup;U:gMI?16L<#K0I1N[&.R0p]̚03LB%J*QT뭼ͽVyD=.EY.q*szVc yt({A\/?&@3E4>yTЋŗ{?u04gxV[O6~W4JUi+JB,!<3pv`,p{hvnαWi,Pꎮf[hՑcu iYY$=VVV v,j7j(1\aR]Ge]g\Ls{I5LT\s+wB.4ZԄV%"iopX3Be]o**DMds5eD^mIzC@5 LZ VfS1q<(f 9g sT^_Ad8K34Yi*һq vg1* CĄO_I*so-[k{sXTJ6b@%T`|0e2fi瓟>RO΍v&66 i18z8H v$+YQȊWTJzOV a t5O '7XsK|3Kb T< z@b72;f= '}1.=v$v7GZe+jx0>A#3wWĬRe5ZbC!<*b;.#655 8w9LdJ![/V-oA\/9O(_\[/xV]O8}W ]5HE|H>ڊ3YہQk;CfZVE(ľsεiHP'ob!inMDždegƮvv_=)G;dET M*yjƫCGl-)JiVjJ2'-Ž ?YMSw6taJdC)2,MEQڳG@U솨^x97B5]Vh,y`wRt+vlJY:=V|-*&Vz=HV Vvlc ptrd,+%LSрܫ $ [Ďp@-"ٱpM*{Λ^?zBR ҥ!>+i^I?7WO@h (QѼ%g2v2Nh`c  3և۹hUZ?vBl!E\>U_~RIM-+@,Yb6VƣՈkVpƥx3or<(bT[TE|~`BT>O[X<#ePPƃpMNxEޅTFVA7FT\nI`TOE$994LDBᗯû^C˶Flyo IEi`.<H>'s=FkY~-g:j#ٟJ/*ſ5v\ )_ݎ6 +;jB5 ~PDxZkoF_1Ғ7v &ccp\aD%pHYjޙC/Ɛyܹs_(Z-ZikeBRFrDV*Hb!~Kt#<"iN\yEj |X}TYl.ĺhD$Ei)dOӘ:gQXtBq4J$E5F* 5cL!ioee78jZVKCǬK362وg.1\+׆Sw?EiQυ=%Uq$2kBz2tJE*Ԩ'ƒxhU|,oFYn^_m|@ (i!wU◢bӑY(i%hnAʬ_> JMc h E;r^c\ƙZӶty4kO/xH*#9b6q̜@+USղ.Lf]4y+~!Is+k|VPP~5m,BL))JxK&A&c$X_@U56$TPKYI 0-Qp쥤GBHP)ZņHGo%e{ONV#f6JLMr"_{bT[xηdsI*Qg=&_? mpmD׽=uQؤLR`e7 VMa`Kd@RH54e ;c_S*֮mDb=s: X}hm ;כֿ!g;ZxJ` 2B}oX" J_+ ͼVJ]dKħٷoļVG9rYZm0J'Ln%kUY4iJ6/v x X EMFM($A{ F{Z;F-~C SajCqgƭks4>7cW%a&HOyVxޫhb,S2*4S>}*)XUeSpYE(j@3R:`\9-ìTAGǑe8o ˹IPLh!5"{m̖lQ:9LzuqNViLH3^:: LTYJ{0jmg_p~,j1^KgFy*+ YgJ)W&[`p*`i/t*-#Y39Ve{m%3Fr0I_WITW:EUo^Bdyb7ˑFO1GG;b *\OWL#>yE+Hd$I `+S[?yM7=(3eVc[ ^;@K6stA2`=8ƈ9t@e*)DGs4]}1ި #GC77#YQ6QAZڐ6ӗփL5 Ȣ7qaѪUeV[)LƤ?ikKl~&?DlF9M^ za3nfYzm{ٱaQۮ⊺(ݿ튌oJla/Lβ }Kw#:6q/ Ԣ귘e놚7\QgwV1 Gޭ .@Ҭj-QTކ:XGy6IKg?nױQU2爵xf]0=.aՎlS}:eץ9h\ 2ɛTU|"ы&%Җy.ThY>` fgb4\*UKeoX]i}Oխݫ{j*uU%vM~T>*B"v}4!B֓+qUӐ=jvZA-g"eRQ5?-|y,norVn+JQS|;~ްHR(12Vc߂q3Mc;}фaoi>M'%Xf<` $kor߿>:f#1I8E1[tY!'>m}x -K;>E0r1$S1$7-)Vi'e2F9| zmșijA<|)4Tf2b?[W{:oEYe"}R -ʇWptFػn !|!" 38:ݞΗY^ϓ[NΝ3dlױfм"[z-\4"|L4X_v}L N`CLp S6w {W\@n ᭲Ji;|5үO\x{p e/]J"]U)8ַ3h/ijbO'⧣e`2w+'I%>;h5ڂ\|f_XZ"hub%oDg\{CkF]b5٤i: ?{ILTJ<`6proY;'BDw]aBUUAXk{?W^xTN@}WLds*DQ %A{gvZxgNL|p _Rao4F*]qT";8vBI=ڏrH+j6C1{p-fCJ=2=V.~98҄IKS0M[9Vn ޞaݞQ[o0G0}qvFxq=KΏZ$N~$ ,O2; 񡥺Zu9m-u- CQ9,=1 K`uW}Hd%i$ `X÷UeYkNڤYw4rl&:{ɲ9ֆUsi-:UTN1e(0:#b,0aV;%K_^ `_.n.#P(miw?u0V+=nIW$-mZ[ R$tWsGeJ 9D4W!d-@7 &ef* ;ޝ{ip掿K'='wR2^ծm14 qAR®ZҞr8:诐Rsrqt~Qo:N4vcJX7}494:`vE.{O[ZahTMe>Ũw5D+ezkc[ze58V(xMRN0 +L! `HHe(d-MJN ĿCۡrvx޻7Sb~KP*a%1``iJ0|NYeU az0vovP y kCdeujT1츛=X.Ẅy/ ?VT[&}cN4f?ZJ&ǵ/J',εKްjZf2%p4{m 1ֵ:3T/LLBOQ"0"{[/V( t\IŞh0>ƃ/a7oQmohH5vEM(bj>_1py]s@0L8ˬ}8GFbߓ/[Gcd|#c85a0-P 7}IILioJдgA-k! k)I\zʢj6! yNQhi®[]EIg DcյTd#*~@&.K;R){#*|_VT s&!$$q"__#3"*8 id?s' M@U F". J͒', c `1^{+!v3IhUԆSP=BX6&M:=UT_["I eqnX0G\'jv\胲!!(dɵ>Ia.oΪm]J8?q"vP͕"]GeM%kMM.d8z$TfX/:d9ўy~HiR|xx>0K,Ld&nPҨK+-˞6:ƹ&JaKd4+%c'(WӠvd%Þa^" kڒkM_/p_yFµIP_gx'.d G\"գ D|K\pqlH)3DCw(btR@—>.W[bw>[SDm'rR:D*E-r[g=M  @x16IajnD+ )ذ1(r{C~5>0Cq 76$xd}S긾;>JEggH܅/0κ)3 > hӝ]GPD&xWmo6_qU X9ۇaaKA5!)Z-"m!_dq`R<>w /'Sx/eu ZV<V no[eUL>VJNhnP%2k`AxT^`zcyt5vyo׼@Qt &#$4]mE[hf`\IW!+f5&=u-}-J--Nql6Z[1 Q ݲ'8xp`9@~K0xDDZ) #^pWZEIfՌ了ԖCQ:kZ of aɋ-ŘŅf52n$Vt<i=2Y}#{Om7dQC qlߗ<461/4m͛9fԼbeI?NfsHl v|:TWz.o/.F~|Y69 g4#ECE5kۺj/FX>SM^МYMv^Ƕ 3@$ M9^"$uP#?f ;gG-y(F֊ dzgd6_8b 7E&z8̴!ݜk \ƚc\u KO+6 erSN?slڥ'27E_O+5z\WW_l+$h2ժpR 5N@W7ui;ȃo̯Zh5󛵜s9;" gNܳTCK V싙>uDs?!s>TC}?#}n7H$WxTj0}߯:xhi)ryj2k˶,wt MHΜ#|֡~Ak@h~ps (kǕ:?)-k*5R ! p\ 6ZxeGZ ʦL4|=PDG:tHJB(ЊB5\94 ʐfM- mI[hq'z.C(s=:jA:bp=s]QF;#3!nYٕMEGBY Q%V .ΙOòtY ̱}cTN+±ŁCJ R*$}C1{#enhhyF=9nKҾ8UzBSUZ$9@ dZꪘ}[ ?5W +$Z)ާeC xXÚ`f2 .O{,:Vgх «k4 gL,F=I)_+ș#n.#)B* 00k=هH"A!+`wJ'?:C%rok޻!w=L>( o@y`tYFSfl9hZ .-7jӨ[xmUmo8 _W2Z\ ;`ء{A;`@X".ߏ%hjKyHsJkk5:i45xwڊ 95L"[ ΁oh/N/V*L(b$ 4b p5Qv꽴F;!Ttj2 `;9}j[1x?[c}x]T!KxR![an0;lo=Oނrθ ŊNjrA BYw]KyWݧ# >JG҃2fJJ:OazwaF)gg:[Q!]18Նd%:VUE]NT)7(9O/ RxoDo;Wmeϗv i2ބ,qڠ܆Y ⩩n&jOַrY!㪤ezJa1pGqSp)%XXr|p.8*%T$w9!?+uT {7yFQJ7"ARE0gc90`^2YAsf) xoŪB5jDR/kkv^ nlo8N^&=*1ڹ1*[-EiUD_YaK eY1TE~&!b]kWKH9ʊb@4ğ2Ҙ,]w} q(lTތJayΠ$s'"41t<7ʋ4x} 7&ӧtگT:6qxXmo6_Z h@q@|89'gw %.a-~E3H33 uxΕg.y*q/j섲߈دFԕxd_\]}3 rV $If'HZ%*J zdVػ˳I?jSBX+xDik6JwPԼ3RmkEVVV{l;ةw"F8, rZ-z[AJl!A*ChOFf*~eyLu~9pZƲN]TU I*jά5Rb5!ɲ;!0kKp54V!eΧqZJT9Vh'l a>|oеJm#"4kܾgk{DînjB|8U$V[$OPw{vH7p5}XsK S(o:`Zܣ5îM|ۂ?;ݒsH%zT9^ȏ[|YMǑH@2>?5 HtnIHK$bmyҵ^C%v{(5F kDCN˘n|ƈvb5"ʢ͔hbzc\e e>_۴sbd^YM T ^ڭTTM#=dOBy00_*l[b($"J^M1Ԛ/Gg2-MCS,X8 f6?RrۍagiyIpqYv ae.ۍAGB}(̐Dlޠ cneMdeO2k2C Mw.֝*$B&*ꦇ XYvZ:5I {ryq >Mr`86\#1DhԸpJ>5pfӂzo&OYB7ɮՂEjO@rz8+fYXtM #6H]i R\YTFlK%P STS(%T+L Pni=;ϖ)Bo|aua[x6{>> ]\-|(1Ev.fF6:14CLenw+Z? 8bE%F"^,]Ee jIOQ6 JTtrZ7*)Se#F]Yptt,Qڀ e`He',GpvOi\ !%C<l=}~ջO/&DaQ)g =旨}HHʰIR:Y){zf/B;I0.u {R82IFņ45ꧤ@FC)[F[@?qrߜz/JA}/ߟ] ! LC%LLJs2di߸RċPmu8|Hҡ?鹿- '3?V+w YZ>Bv[0ᒔp絙ϟWcoK\On>@~nqE=iMsTk^ASK`P\¿} W3\F`.+;{ {NdSx4 nʣls,=ȀY1嵙a}2:h⋴Yd吂A&eNoZj^"s_'+Ȗ uȎOBK1ԟV .V[Y ,4BPn4tPEe8Ň't _,C.G 3UjP.(HɢiWA$̯L͖;C.E2!$29˙7q,1'}:tp4 g{(gF9_Î%D5Q*̱~Τof+Ac d\_8qJ>Wk'Ĉj^N66}`>Ps^^}3~`5z p:5'Btd6h7ibdx[A}؜(k`.:ig3j HBx@ ~ 6vԔ0njۦ}Jcg @'闲"h Be4u*[^+=lWR'PDQwCp&~S?֤]*U[17 `#XHH>}%U[I /,bE~9Szn2D&>Z`tXlE1B 0`.dz&5*i}@6[-ЛF(Ui?xأXͳqq6钟M}7nTJ.K+ h:C5e Mɴ4 GIfPQ[GKJ~[ɞRNp.s$/FXņsxWB;$s*[ (9YZ%J}i.sZk%{qg,~q2>,=TCgJnj>\vs?㞆Fb!If8"/ϱ.ؕ'y(ln7bsm/}Oec!ohx}Tn0}+hPeZUO}i j4Uſ^n{Ϲ8g*̣Ki2Hv/o*~k+[teb!";#H~BЃYi -ZwE Meoe2(bx/:=(bp$N}lڽ q@m=Yݹ;|}te݆$RmNۈ/Pdd:Wq o8ٴ}< R@ e z򋴪Z6hT~BCSn`K j_ҠmSX.v*qG,8۫Z*jO|x3@<(]bXd;ҷS9M&$u^K)(> Y1C!t.hzn2YZxXaJȧ ~m8M#,HŶK-ter30˦xoMIڳxםRxRqb3PNq bEY95@σDK/,(+Awp#/8R# $i0K1Ǎ'qTZ礴&w=$x9$ft}!>OXI$.r9t+ڠd]'"8^ > V2/pxjq:ߖpÁ)|ɠ@|}ς&aKz{} >]J˺18>uY㬘R=$,"1(n?áaPxS_0 ϧm d۱vt=^vOr4AXdO *Hs5J[XSу2vwJ9,uN6[heY-բ/j&RX#;٠xDdWZUz1I55! yk֑-IhօD"~6)3e`"&&Sxɡ Sj:-7̦aỳZ-K/#0.Qw_>/B̴B4{iЄ]hU#͇耋#ȸW2,i[`Pڶgv`?iMhkr%خ phX2JO 2h<],?y幰ѥ)6͘(t/ s8ao(&WHc5(|:bR8̱(? nB11NjMsYD h.iXē[>?U232,<ނ">糛FFjٶ?_\_/.-o;WmybbP#C(PE0^5F,9& 柙xUN0DU q\-⬍EgFnh) O0.l tvNWPW1̈́'݉r/TbAa[ Y) ,YhS5np#({^WUpm%r|qٽ{RU1F*s&3ㆾo}fiDo>d0gLh >_HJvV txXn7}WL$Y I˕*ro$X&gs;LӼR9)ʪ֔:7h跭rjCmUvVr3g2eiWrU}ԚUWi(@6d,n[soa_U+1v%~[zT囼,ٌvxJ_F$^c;7f?#fo[ aā Sn8 Wmh>?g.s}5*fJt4~m5 Ό*N;*,HddQh}$suAhn>D1a,O O^}ʮ(? I$6κqyaeuB?='%̇ޠ#r}WW܉BmQb}^,q}M@Ԧ"7+{^Wծ6VgADg\ȟL؁h@-Eh@p$QYMg*ltU.6TW$nɔ3 V6/wh,T8OF[p#sZ(R+f{0F5v.+ʲ)gƧvWIpj:i~z0ɐ U68ƛ%`, gҬ֜5Le Tl,(`'Y 6sXaT#ܔcصrQ>:1AǞ%U!V@iUx[Eu`X.Z -\֌~ĩzk bqq:yuR:F#S-^)HFݞ{DHBO8ϔ$LF#!Ԁ+RPLd=p!˿F.pC4^l uz1[|@lLXS?WVGCA7R>,8p ,kfxji+-$C,\уi8Y`,]/ JEYZ~i8BcdqVxD PLwϰA,Ab$j^s}܋S H}o Bmus!,h~ }dm+ܿ}]o?3+ %xMl>dȾw,\ !|QM* lr\3kU[DٓGsY:ϝr}9/v.r~==ee :YPU2.ei\~Z,pgWtƠQ4;*Pbrqh0U#d"uiq4lkܜ{f!/B>FB@ݨ<`vkwxCT"B]1I;g| >ț>]}~˪8iߵ(ontTiSN:,u0+=۬ZGLh+ve 04MveUm; px;qqFaT QRZ,R=JJg'HtzO?ӻBJeYVmx$FFLyrpx4Z19OCoʑ` EHڪ}#-M-[qHC}Y9o kOrwOh>)ΓVGbQGi2 Đ_,z)@ŔqƤDxYms_qдj"i<:i><zXf<}v8n$w{>{<;W7^ٴjuyWfe0+,)+=,So:~M_x֝Z5')kS־@P^T`uΝv.s;g l3}POJ-tV,2ٳT;cpzۉ4S0vEMwMJ#nGE:SvN/[3:Z5uM) n173+8 x|@(`27U=:}zkV]OOԸZx4]l72BFM]+S,ԫu;=r~)g vm_ eW]u^&3$_JzlacѱTgmҪvAKoxz :^TEˋ~E^NKUmP͒Đrit lFOi?l휝7l*vV0ٻXߑqs2ѷ^Y5s]{rq7iqL0?l6m(Jeޘ'^e:tm6Hu 'Lz3a>IBfwWׯ vb5!twNl~nG&G<"D*& Fn:{M̈́r`tqp:Aǫޛe2jZvܔoF h~KZt8 &08=q>"U.{ V2KU^ab2?#c['%)z4Zî9+Dۑ=c^cXQ鏍8>E,88/07!䃰C״6 l>}Ůi*X5E]Ǯ{2["Fc,Jti"^:*`$yt`1fMA>Z1R'}ڊ|G?"o4cPfLTS 1UmPDL(XS=d!k'&Pmv'd5SR!jȊaj' P,`V<(w+,cz#mȤ/ C)yg>f5'z_a|"IbNg|?@G1Lia윆 c &K*4@u9. Wnti}encAݧ0BGӈRL ̳=_fń&Rԫ>бgkYq;?(HɌ-"fDbArݖhC)ew%"jo0)9c9wWlZ4@}*ޯㅺ}@]y1Gf8ZfHZQ9ze74QrHym|3Juh eoOʩSbRUZBM\9=ymMJ  0TÁdl$ ׼(Ѡ5ՒmgKH$,{1aX.P8JTRrQ%lˋWg΅&ړab;]5"9}X<$^Hd{Tf6߭ۂFV =`y[)Zt1[B7.VΜ {T- )\bp}T/c5ȿN;'^>71BnCtw6aqmOzG~S2HZHg㎋>@漃P٪QPhYrc"DΞ~Po%Wo&·A$#:_q`'Zʕz1ԯ sϸ¢P_)ྜྷV0hۺU 46P`S/h砠'39=PJ想󛎃zZ(d `[GP;0lLVBlS! Bͺ:&PEA;ȶ 1K "ņՔ Y.)C\)D OK̆{VpdH 5+0FcDEP7 5fn0gC$}7e{-[{ JHL0(^ldNt,k2?8#IC,.1U"U2s֠V( Q+ID?]-R)nCeO&ě4 ĩ7  EX܋ؼ^ےy =Gc<KXH +5wI|T)4d&oLMJ&Lb~7zz7OagW0ю nE 77BT ;g.޽tavQ}ˢKse~Oxh-o#2Pe!u!ϨE\ό[UɭkMl` Uܦ1(f﬌\"H}N"{SÇ*vL( m> 7/F}s?t''kCalǵط}O>[~B/٧*K[ n<1#'/vY̋G|&JۧRhNDhLW!.pUz~,ǂpp¿se| hC~WT<쓎X9=i$~ޅd$unp44z]hXEI]6`ꭃW mxFecY;`Ƚ|%5 p+ `AoK!b?2h +fOlO)iѳ9 Szxvb %NXeok}G(v\L L$µW/(!31`ԥآ~1Ǟom|e~:= l6VڄX+5ϪB_OC`CjSRvr:=zK^ҶPFxU`ΓH<8J+e=\47e7᯼_4!f=FjgvCwB"D'.BenD S@nOGqpsW#t5\J l#.5sWX[dB:gG)=d?`)R`8^)0w^j dYO@cezh}#>GIQ6aj }H!U~ C!9߃:Bu+i|ӿ6Ecki <6#žU(= E2PWzM@.) zʟKٯ`@1Q(k}ac<)⟤- :M .?5x}Vmo6_qVBtߊ8[еC!v_lϠͅ"5rt=ٲ{s/Kw _#آQUw`l'ڔ'/~kyǛ V 9pѽAj}R *]lb oVj.U:}X+ E,vμX7xL@;#ڛSUza@i JFXR|nuW).*~kugW޴{,HEòsxWLM> YOA+yP{x4B`㱃Vki\ߺ- R?U*K +`”2iiŊsVd%$ Yaefճd ӣmJa#VY|N`7hwk/Yf|lS><h8=ESoFJ+ ) nV:,!ic÷H%51^'8ٻ<"͒g n^ p]_C|p@rkfYPS2චocn\Q 5Ŝ@l;1X<t#&u^o/JI7r-f|3 -GFCc&pU6C^~\z((ve,p56Zԫ8_>+6=( =qcRmgކd*B}T5 ό>1#t<%X̡a%B"3mC13\`Q}1jRiiaR4ׯS ϲ~7A!M?ďhQ:C,"i/? NI޶|ӝy}SA^զz^v 3 .aQnwRk}If߃3ux}Vmo6 _ 2z[qWt=@ð 9V-dHr>Rm9m4mQIå T9pڰ^^r-JT ,Uo7_D/^~xh@޷̰v;ѨPbY(%dʁX`*vw:sM#J/WEτlo/В 5rr0V9ȡA[O~[mj3f_~U* psrs3׋f@lr1wEQ@r%$)Rzn5m8-9&<ÌAq-[3U-=ncyrBpw2ST fQ"cBZHůW.?^}P ! bMc`ml'FQۼj+epcB,+i,+dA>P`93VH@< ߱B1S&IVjYV*K '2C呕(TXfhn $WnO,tKyAaS1aaJT1)K<ͧ+dCfJfJI&w,_ ^)9Uؔyr1Zx*,gM&Q+ |źE5(?Y3;)щg}pbM(p;, wgd C /rQ}T1)'Ny:F'~ᔪE|Cx~ԻiDG*nKś{dɑj$٠X!'K IvQt; NQ]V `qOyUWyGK:cϩoDpiyd؛E!Na . 4G.X ±-19Ҩ˺Z%l67[l""L3/y2ԣcr2/q? NÄ~O7dW.Z1$bYnyKt5K/B)hȋXJKVx}Tmk0_qs!ײaoPFY;-CϱY2+=8}Y!ܝ+lSbʎzD-Ȗe@: _x: kgZ)xe6ʫ]+v5C6jD=2 )]o1 WPU ẑr(Fxv@(ÇY6TCBR1o62(k3 ŝfS䱙y9\@,Ǿps^M_J9xe(Atk~[9|9=\f0(v >,֢H/TNNOy^琺AäM8 iƦfi|4fڐm45\` 13 gC9|7Qh٘KɼbKT€]u2:`YU\ғP"7:ĝqdrz<|1Wx6#S7˚aW~]K)43%Q#J%R߀P=^fI_ڮxЭc*۫P(__bĖ6qxﶭt o[K'xuj0 ?\lPcl`>h2Й89t:N}0tlG@G *ZɃ鲃Zָ1b ZF@1eS=ɗX`ՂD5xy;TakQ ` &i\(/]wF h\(2CU9z =6iŇVYK~uR'%xsRH™Xrn)k#-?+[)H5n YFQ^˲⧇ΐm.ŔJ6Cvq8xZ[o7~`&n=q c68YH(ipBr,+~琜$iA{x9;tOBID%rlu)dB:5,kYSW߻ MDaXY+yQssu_/u9#$ JZ8uw.^Jj|}߽^|*V޻Q~'t "ʃQe[uu"x諓/Oߝ }89#LT ]Pd.]Yt7/"K*hd j30XҁR$c#˃-& :Mb,j!'PH?uih§yIp#u[ic'PӺI+  bIr\ )I#NqN ,J{ugK3Jz8UiJT+![bms=:<$dgjtUv7se[/Y#6Uu ^7^_3 4xۊ8!-~6j FۃJq@)*SŊЗQTQ b:Mb.gLH3,auahʫM NǧPMsdP> 5_ȼt_fA9E@"'Äp]%Xr,M蕸g+QjNG6Ki: yaL92;nѥ h>%Y$KcAt!&f83Nu>E0c@R+9B;O|FΧ-rޒx3 Ȑ$pHa۬"`D3pp=~C!v9GRMp !I9B$G|Ȃ,Z'LMѮ:jo`+pA@ʨy7A siIC6rh6aD޹|'*Xs]#T`p(Zp|-)O&i~^|j(yM|6VQ-uJ<;T#IJEMA>gPBpѭa{aJk)Rw"ׯ/N) ;A%¡.$(:AXQXQz:TY:ZJ/xhT@̷BÆ>յ/% m^̈A؋1[za7 + \y3J COy#dC<ۧ>Rb26,-Lzf bkl7!;L1Ԁܨ|S52Y)¨fSa1(m|TPD-9s2R|ߩgiBoSZWOr.w.&•psƦ-5 6Gݎ5]X 򠡏ltJy2j׋$H!s6UްQnn˾nio4.RMisV\E4osH m0LrW|"Gm*(hBڠkwou u.46s+.F sjӔ36ا,ir՝PGU~x ɾzz )SRl4|~mkM!%h~f^tQʀ/Pj H}P'yjdfF19ģeD&%倞vHk(k8暤i](%jkdw܄I3 TT Jd)/2/ll)qlBAg\4\EVWC9^xLg(5Wѯ b@Ws (-$H]9>)>)4?YCgKtӾxr t0InOE(s<hlzF3nA`\]OV^݂$x w((vyaߪf~cql؋g'[2A}KeK .=#V@%47B]0eeF(jKgpH b'n87'[7*r>d}ՖٓG,|tяB:: JD04JԫQ-]S8(hH]dnU)2ד>泫o}jlYX \v2;[ɤJmዚg>|xj i!<8kkb&4RQ.*U;ƪԩ[&=J3O9B47ߖQ7_Ci#}zP./Fl}*GiWDڭ+SF0'EsvJeyT+PPHi 0}plOrs۝E^#qwK5K֢l}vސ zz^n(%DB H<6 $tQKm.G4#m]HrLl&˜GոgՈ_G]!Mk/zvi8 % 쇾g6*[~smh3muDlPDn,$ɖu&ǙtuȨ!dh,p |м F~H9|z E"W>BXana=ŷ@z 5^rXͅ-UZ>DoF~TC%1bUx_j̈́4R;^~- } }%7ֱxMŏX[zN-InͿncHȚ !-.퐾K[@R$zDs`O_!Qڬ:NT搅'F?]\O}2GIHH3|µ栛]n)7s^oz=CN 2Z)EV`ۃٗJBV D$(E|‘X߿LU!SR`!S\RjvwZծuVVG}-3G'al} RH&㬦#@$lT'o~j%QwGAؿ^_IEDDNfTu^hA5Tz &?l!:Dx}S0+IacHcilSv(kȒ+HVRBKޛ^qO|L]ot]@cU"Ok Q:n=b4'<]zo(JֆКM:2ef®v.;2a!;&dY\i!=f` ۹Hux S;菇[r \Zc\ᙒ i`rY9vYg?M /ק.H#x׉7i\3:rT~c qSβ%.#K~ J{sLբz<z{ݛQ|^qjmڔP1nF$C 2Y9_e1;E*v|w??p) ̓Tme/ 9^t!oTڟ0ٛVB' Ŕ]&$&$L> _ e[W.> ĉn(j xXnH}WT10`n`'؞'ZdK&M[>B`aKͪ꺜:)]]ABW$M^Be8Rе}Hi]g:;k "Zt}XOrkF_Xyt6o߮{3mR?zҵhzY9uk< dz" 2mDWnT)+j~zDbh[GKWX9ٽ~ UIPNV} 6$5Y+yNѾ𦒭ԕ.Z\zPn}olI1&Q=E(\&.qeL5Y(j랞U\uB<؁4:UCYnrc+!㨶E 1y nv,}Ȏ={pQ 6z?L1OQ1߅ԖjCF#W{3O=H:f~LNebϾ tJyox)};-JǙ0]z9b%/Nڲ'& PЯپ" ⵤ,=XHO0+q@/ xQLCm? IP`ϽS5優.`]lz6NF3a:~Bx9Z7FRaTAyJqM{vo>F)}lc(9GY^޾f;nh&ܕYj7+6Ip#6\i4fa/{5iibU)R"A J#+0ujc@8\+eHr'e Ofq(]2<(l ӂ]=p|HVUXavfYˆl wR+$r8刯 Uev%0݈ $ RE1Z. ;e`sh&WInԲ{rP(lk;-\zd&սgH_PIPzUqv!>>?_kf<.@wZ.z!=֬d`V{I&w Kty@#GIiw\M\߀ ʼ,Th9<-oPߝi‰fc֌-i{}|i-[ܥC6.u #E>3!K~ʤ}C%,{td(0,H997^#W N[1dm+D qN:BNe:^Ka[a@ME@`ZO?讘Tfn< H8\%`ї T n7&H wB"]/ows"lB~ Ծ=۾K'bwѝ`U28' \LC8,IL9JwXc{"}ƛSA,%KFr0ThR*2GQ?M@dl6Y :q'N| v»aռ\R1}!Ig xX[s6~@iO찬3ݧ̺Yɬxt` LBes@Htd ~MSq{uFQV̔['FaMyRCByx]ofpF!Z^#?)# a]?E׻|[U[m=uQ! r;t^bnlGG^D6J:u)"M;H I"v*'atة r&\|oa}mQ"2"oUB( RC{OL/!hO3?IĸT luXzee?2zD7 1کyS/vޜ|8=Y:e}-**;;e⓷ʘ!&_'NLjDXAF: G A\";96EcF[}ժϥӏˎ뵄,P3[iyjdӺ^dT֩&Ϯ; eJeQZup2oxH'dtݣvnd;b~] Ew7p+ϧ}!@9Q]C%iL![ RE;G 8$P.SOµR,x`-bSx+d@NE՘t]mc!9Lb e5̓aX1=N+iM1C_ڹ5uaW"=9< ?0!]!#Ky&ZVa6? Yk,PP$2 xĹo<P-7t,%N/~ V`< LaYx#tlN| tG-7qC6SZu#AW(% ߕY(S]h}rksWpݿe#N/P~{5y҃5y$MpJIKn`C0=ģwqm_+H+o/P"#Ue/+c"kUa8C] _^~ sK(1X}8'vbX!*KGڡC ~9+"S{iؿjdw=r [Fv풋dzguF %rtEb MhrֻxX[o8~ϯ T\ev-0 @'-v-Zmn$QCRN~琔%b m(~/BmuJTSmr'1+^įBx%ʍ*ol+W;Hz0+!Z[#KmJV}%.,oZF(KJNzUN yaVVHstwҖJxݨWFk)ecMܵq#(/+XYӜֺҩ?zղ|2Į&=nsF0@;߾-RImٿmt!>Bxc[~3ز3hzŝ*D ge,2ȏM *Ӿb#M<|B\iJPST +ցW[K)Y׭JAไvbȉĠ+KȮSRЭmȫ/uRk>Xcn8a{)FW#k7AzʧΚeWުF;Q$VH~676|yKru eLd6wcdH ,~#b斃>B6x#?b4H|#"Nypz,2FY?[ZE8>olN)Vx3UB}t=bDlC =VBwMWG{p| -6,VyJע̳۲«d3"ٟWQ[Rh3g!>xX^64/5;7?IIBDxQy]51q?q1sfM 4 1ِjLE^Z^-\T'N̝:,وҫUNa~9;۟q~؊;\8yb6Q!;h<ʲ(Vи֋E@N6xN^SАJO`9PN[͕!\]CKi(-Zr=h hdN$tC']@A١he4P I+ޏrÃr@С573 ad.W-' Yjl>mSx %n_ bB%v..GۂM-"\5\?,!|Y\]^;1X_ž\{O>xia`@O+0E~˳'YFΖQ<=?T@p|V ^]ONsC>:Jz%c4H'__RPtă$țA -=XmV>:l"L6K0rq3>&ih24:V 0?\8D|-ʺ,(lU1鉎@4U@SWBn˜s 6_?|pC5H{9*DoA;BX p3+_poX:9',*B!5n0p.6\ZXݦ͆Tl#+~]$d@7$asVt͙1򂒜I)[}wwuo,J0I4ȥV @Ke9UNdX9BHee%@ѫ+$LpCc-r"mpgESΩ22}z,շ#IF/(+1eaF:"{r ]$ $xd4uiX{I4dmoxyt;ظ-vq9 fsIb4 %k[X>XmZ oAڂM3 a"$ CrRmKUcs)2-k CXغFsK8eDCfېD/AYMCt7Zc"T+)RtN8tTw`Ir]lNݫ_(:)eѺ$:W|Kj߬`u& 9<$O[j`70 ΍ϚK[-q`.M袬Ėz#P u/@&4 sex'Sx[#a!s3UUvveBmBfSh4xa1,EmpҰ<(ɂLeaXX`q˾p \0,UEh{ǁh_W#Ƶ؁~8XvcIvEk"+p+.鍡k}NIէ /5!S5cU7>8ޟa)~:MW~`;F} {@93RxÏIa(f58[<,8Ȅ꼆a3r_ !sj9'cFuk93dC&w:g*]Ly6BEx$DU%7e<i}q#!2Q@@4=c_NY?&!^$WX hlЋ;,,!}+Ɋуfo "vzM^47ZvY`gfz^VHb՚Ϩn#z{|h4:݆O+S~cf_mlsY#{P IzHjyZzh)%hiiO acV+Zr~ gQdWv_^uk⢹mxFѸ-!>@ǯ|L:q6*|%^G? )Wwzb Co7 Drv1]G1@+c0({yO'D=[x?xm}ow^c'K);84b=9ݫt>iݒc_iYg 0Xw=ö 84gP"H>¢Ը#lZ0rH00hp4QB=ߠ ĿT4#5^AKCC4}t~5,@ъb}?0?0Љ{D{_'xl]i&52"C?VºE.D>$<%"˯xZf &'r(pޟ3u8H|w*l=&%> C?x.fMo׺?<5ΏNRPIG+od֑y^㕛>8vv*轏xVo6~_1MK 5a@t2&(QTghxαAoۯ!FF݂ybgj}Z0? ٠{5<haM[eWyco[ĂJpK㩭7FQlUdgx -V/N*gggJkJp h%# OP?0QB!!o >X-"ZzR^Vk^:: #Qn\;dN6#T2Y}sm|8oчkNhla,jWa*/U7J2`'f]cAy\Ik6+=Kd4p7'GJQ ֧ޝc_//W_ȼZ֟y>OQ|]T $Fɤ"MO! > , \r X]*Vt%%/*Nyqm`JnDD/s3VO61B{G\&#.{ԾNE5oV q}΁ sowWB u%` ?6P@Xڸ#HW:ؿXE+ce(fҍI0کK"/iF}W x`  Q£?𼃹xV]o6}s Dc}5f`C p[)\Z,#߹$+]5H{-m:CBkOiL(b/[_F(ԒU.x^?~#)O{cl;`c`=ѩF#@Pڳ5)KS:Ӳ!aJ~6`OѪ/`Qujā=B^!@XfXo 8\Y&@x'(!jA>*/j*^;&F# od–Q+sx~ٛ].TN"CmN&#3la't‚cVLhlJUzx e?vAB~}jUle N^*މV4?/2eUIŪZ%gf>ˤAA؄$'!;SP2pʖQJ4J1~*|mO$)v {n>mi H'uMlߨQo "Ƅ-`?&C`JfpT IG[+"'o=28l% B3:gs`=irW؆L;ϴ:s䥻\ ѺCAPz.7| p\OuaoG?ލ|Y|9ZӟTkbT>kgupI> zB ,8y3t6ޏ+HiKiEƋN6Dޡ2^85ؿ"3 8b1mtR3\Gcf#e6%enNEugq[ Z'Դ4Pgw4|}e7 oߡ>eI;虤 5 L9Ey]e6s|:TS:&) k|}A.Ȭ`մ:(+=dM&Bo -0^9IiL/Ǒ.)Z>'Mr/c%{c U2G evcQpG< 3g\",$JR<'x>٪8.Ue'N ~T'0CJO m?ut p͸¥u]͆|#Y6 ِoD(1;Y}(_ qe!u-2vK~׿=Պ/ TӛqWzxUKo1+T-jFjr8%rkBIi!b6ݺ(Ӌl>FqpIjf"(0uڐ8W/A(Z+UQAљ$CuC%,CL4ճuSv:31w0LuKRVĦɼb@lK:AC#k.#d.M9sɖ[ȶ$ȶAMtӒ5U/#2~1k3)AIrg4wzw>e||ΙEISĶ''Q8U9fl:j2͒q?&)7UߴLEZt:xK*~ G$oyK+*8"zs]_Ҏ<Ј l=nxM|=tn]"YK34ҕW ⟐X`eg6qˏN1|%.hB@'6Z4n3xq%hLevߊ{==oCuR{b ,mdI4aO(UF/.a}0xCI^w%3ŰH,xD=I1tobzh4k/i,MwACe6EBEѱTh` pXJh=jgxWmoۺ_)**r|Mv+a}0$iHEDuI9#; aĴGR _[/jRoJ8҉..sZ+_o7GSQKW NzU%V@W4un~ZNмoKM ea9?̪mp\7Jx#FA_*VBYksA Opё9Iʝխ39u\vjD # vƩ`(n%bگŊf6Y4^582{2jmz Q@0.df+Z U'84jՖrP5jϦGl.E2]^( ݊HjLCOfE+6ؐpRѓ(L9\B^4ulFjFOfd'޿+ hKũQL}pٝM& |@=EiZVZOf^~?nbjR&Y8;52RrpAN"H^̧/:>y5^z1;>9=>>9Uj~:?n]pG)~; ˧w2q{0o:=G&,jk1 ղb A4Îi Uo) WΓ gg?.Wscwi+t gݦ$ ٣'NO]M7-ݕ^@,|l;4faG"(Ӕfubi[CޒwW K-9<@l QjuhԼ1#PQWbmzܜ$c1GAQ 8t,4FW.e3>㲭m;۟uy".Z7#{ KOo}qGIt{Hv=zNEGs3Q@pLS'+&z(SFК7pWb~O84 fj 5Lm @Pܘ s#i} KRnt]P@>6cHWBi:<,Cx3HեI;G D̊x fɚGo&R|\Դ0? * Z~A |@ju*̱ , $>15K!˒C !&9֊Ʌ(0fC!e%erڴwt˘k\I{1^8 $Ԃ݊!eɫb VPA' ajHM(,FrCWpmHcCqIEItj#BHV!;MJ,sQT`qt!m(!,&>Uޱn YBB?1 :mڧ[0ѡ4v!j8TS]][Rn#I ǒ&x.Ͼ* WY`݂nĀD38E.-Eڢ9q tΫof-5am ώ>SutE:dF wv*ml#ga#Y x6D` WxX[s7~Pm:g純@̤!#ʱZr%m;Gڋ/aV} Ĺz!ʃ+XNު#L,aA{Y(z@, /=̅u,` &$ȋߞYe碟G' g 6zXjϸܬ>k"RN7uvz[gEVʢ9rhҧNɠQ.#PY}ٙ-Tc`Pҋ{<hsU.XHSYM\9[k g".ktCR 3tk-"^_+p4JL7Ӈ;fDryB6~~RdXgE"d5Rw>o^^ܼ5ĵZ2WlD-q387 J \\A䲄01zXjsa*l--AL\+/V,zA 1]7@8^RNjLx'fȎN4?M-]U n k6!}F# X<coBf Uu%%FOc Ij_0S[!`hM3*W#Ra\AWY\éI`i\Lq6=1>D>–c]r5'WWrxv.tQ9<>`C {Z2 0X cCyAeO`+[Z-`t mvq\9y;tA7+ ,7$ ad$9f.uwm!@Wp%NNF U~ 9?{"Qd* usNm$St/$;w+&zWwGE#IS2"4A]T~h\ hRiXOžƻĦQ4Xn*^Q LdCm߉]vw}vg·w7ǢOp\`e`} NY'^9PRѸQFrCQ4czݻT@$)ۢ!dGRzĢBm PI@2d-#pN-TbTV&dS,ڇwu`67`K9$'^Ճz+9Τ35ޕ:r}=YvCʟM8#C䒺KtQirxc.SKFBT>FwK:SĪ/圛GhJTXsNGەOƺ,\Z= b+cD͚ 4)v9_Z Rae =Ҭ-q~kKTtxhjp5ҁܯ<1z9@ %u2IL1xQn0 D&pvo䩏)ե6J Ee} wǣ;Wt+hvTcI5E_8CR(;Ty7 ٠/vRgi a}Ե}T_ҋ1~ZPs֕t|^{lYJJӖ<%WcijWK;EȻ3̙3 O$!b Ou@/AGI)&Գ AzI},:֓ @/ M=h_(<]~2^ra0X <'>'{+˧?[̈́$ٰڱ6S]u]l C#m~/d?lv;x]_w[V5ձ"bL,6;q=8gc݇KX&XQUyGkEY^l->VlK J_&JȎ"ty\ (]W$9$QF匨Inz A(V^W,˓8L1$YOH@ ն b˛~],aٔԹfB7/^0[h ,(^RfFj&Wd$ժ•䍖~we(+| ~izva5@vcAx.PE-{\6s1~؎XiCC2iΐN՚S%z/gLa9Y-=RΓgPHbp<zU <;5)Wmgq @" _\>+ `kU nUS~i/- tf'v%}w~; n=cg\ ;!1[ف6bqAh]1e8n|rqDlPxH9CCU[ur" #}0ǟB@@ڠA@Fe9y>Hta rYֲ*␋`6iesc 1D㙖T6%$ID6 :(Q/ȹZ~vPfUfqȦJRd2ƻm%֦_qh٢h*E­aGRYScA/qU7ɕa-9-S<苸;xb=?^ڈ:a''#n\L} SCK&^?.X/^侰 VOm42`*nm~ŷCmF;9c@L7O}9[e#泏 õ:m UH9F|%çEx 8%/F 7{l\!\:S>ڴa`spɆ9~`!O ˻mmȫsڸ=nx-:U<GGU7QhCރ oy8[^~oAxӀ^žǎj/bގK;M_.ݴxU6+XmH*9  c\)6{ )YJӴhO3oͼ߉Ƕ5^l['mY۝d,wJ4m}<(dЭO!6Egw"p0jE>)+BZWT3xw*E^>7n~Il:rX;UY LK*A_1˝+%9- AXyP}g$K)2 i bpa$"hܫs(igt;6`r2c؃WھR}Lsbz m1T0%zN >N`BV u}=?PU2xM5$zySV%߭hlTCl)St^5}N:yH"|DB QSܖb4G#-{.W-U3[X;@`biԹk]ҺcA9)9Cg"˟ͳ2]Vn6VF}e/_wؘĺiUAwFaҋEVV:!ew$(p1gHB@f(ߒJe!u;iQ}ۖ|Q7=g{<{XHoc {>X'mxCRrQױ·}֩VTʞr1u…,m?]:f1.2bRG7rb]F5ex:j$7IzmG)2!7iP?+W>VP!jǃk6$?L n$AΫ&-l<4+N]:ɮ3<7s!d.?C"wiKQqkܝ|^D%Cӹ+V)r_ٓ)o}Bly;M,vlIaNQ?C=T] KZʿ7d!0hdTן2դ4x]QAn@ $ SE"Lx^RѺrpxu .&ߡCG%qwVDN:z< g(<.[I鼻3`X k"bO }}׳zL8=N1`aV:֣nf/#uVpHĒ}sS28p7^u h 'NrjbwΛ}Hgl`VEmd2q:RBh?4hTT-ê^s+04SSD˄)R#Bs/IYɲn HޏsϽ:qR>V_O| vvVU QҚQ mۼ_qNlĮFi `f9(j;`eT(JXW`QAV5dV 'fͷ'J孢\w{5Y+([]sQ^$IG?(ǽKUɿi'H6;zZwHoFӰ@»;“Q c_^]0dV1jjmt΄+ }3xiBKx=RNmw2Ty=Gsȁ&!@-Wq6y)r]A^j߂ڶ7.p5?[ y$gB\CNyWͬqKJCa^qV33ٔbbK9L|O+AwgsSh +hIS} Pzq$NF*T3"޻Z-%@Pb$%Ft@oZ3Wa0mH D/eb/-6{ \#Ѳ&N)!7 ˘rU'$oQ}12 Oz'Ȏ ^!ŵm!q҆l:1b-G~>~ngij|!KwRr˚E=dy~$իܤ]Y5 9ux"gEUˣ{t`7n:ժ8`6&H<>^zYXNh9ZJJ{wK('%ib`aϤa{$ >,{uA1DTLm-Ak"yN/Ғj2?@ ]k܁ţ*\<<: 1k0ݐNbQ*2P]\M\Z,̼L!Ov*b/bѿL` }PHar`CHÀ2 ͔=¢f $R-ZRWLbP:$Qi(V?Uӹh@zxlQx e* T+NW07I+NI|A 1/?glIP^Bg2M({4MMd_֥N"?%=1xCT'O]Ҽ <Ŋ%s׫L5~qiGj84 ˡk]?&cmT@wKS!>g3% %+N'nz jӇ=ɾ7rWbT kR|~.Tؕn)ϦSh]="IUGd%nB/E Һ)t8(㕸!lS#bV*JN;q.g*{n0Hc]וe qŐN/#TC. s\Xr[݆5uϠ蚵t%K30 #^T`R7--C@/l6*|KYBRe|Hv r$~HjO6h"T&ZӀ:ZV kS&ج<|i|t537D\D6ɞž!^;`jE֘/)-XNO}H\e@ke=}QsZ3շ kNbs Y2f'?5T0AM Ph-J tҧ\5rp4qUWdk/zƊiђ围QL%rS{v]ϼmLNTU7xj=C|&429'__9?hq("| [0Bҟ#=N+㳸<^Rg? 3kI^eĮNQ}n1Gvb Rv[uue@HW0߲ͯ&چ?$P`]4zG$T$zɰZw!}[?BùxVMF WJHV9E&[haV쁥uf䵱ɑ%YI.E>||Kym jp[!/6^'v6[;:naѓ 5>Nqda=tmv9##A:F=L Of)4~p=rUѻaܵƸ0~Fն'@Q'z@vX%м\9XעJ?O#CŝC[zT~;+ɡR{Eich{`DjRgh(#<*g\mvHCy8>PeOֱݒKG#bEMr%-; C Um3TU gY޺`jx|EF687 bNR-$Ez45J9~K2xڀls _rk[5=_2֎Rs)6R|N no 3iaŌPq{$RyQ&%'>(|2{8;x ȅ<&4J;9GgW5W=4n2-JJNM~ǣa=EnAK]8J}%+߃K=\]B+WRt&eZ|Is*=QtVZӤ%^ZPy%ONm>9u|7cV ^h̗]eȏͪF֔%˦tuj)MXMx(JcuuW& ~Y mcA^8a$۶U36 r}d: PA9-_)\;SB .j6.W纀xTj@}W Cdb6 &)uBIi$ Kbw{gV+_Tה׳gΜ)<`Q*-t߫4d *,6S\f;9/|-V~`TY\]ӋYҞY.쬋ZH+'COuf_syC\ }F r~P?Y_F E& ~< sRo0[qtykIcEbU.~{JFiVvwp[VEv0[zZ<Xvx͕͊0y{h<@hz)%V"d$%}>Bo8^bY3/c;hf[{or[y2;^ ?"/!yLc7R6Sck$GxNS9(3x,>_| }c9o+}, 5[8VEAz>d#(El;ͱ- [E7LSQhOmD(]AENw +UM$SbW"]B`WcYӆ 60]#jPkFrGXUCHq[<4JoV_'eL54VO?+Hd SB)_@vu(rT G@0DxVmo6_qSQD{t+u`ųE"oK}0,= V=V(-Z;E5u8 g.F+*+p|mpʚ`Γ V}=͌=?l@b XK7*'v[x,|13/o52 %u^-<VA+;׺p6j85Uq#ރ XPTPvod49#߿Xuo@Q!A$K4p҉M`Ecu:6U'tMH[~ N6\uOx :FLV8  :p4 hBi)VIf#h6~^~X\Di}e{x(/W>}cs6ZuYR=2@$ _T+Eo|?.[s^9.[đI5M54h<Ǖ!Gb*x O7 d hp%eM澌4c -!x*=|QEL%s/c)0$f7FGv1xw_bBPKq8:QOhBrݘsuW"K|rNi$C<:fF:^iMS+vBxB<Ö$6 ~`IOשF!ܚ+$ȧZ=Sq`kvʛfђ5#0 \AϏ+"&ǧ;cFds\}xzBX\+C2F9ԆrM~UM>2y:4!IMuegOx_JQ@V#"IW/ 33;;sRgsjQ|\/X^JT.͈<nE?\Rz\y_,l_mRRWe[1iW xXm۸_:@c/rl4E bqXQ-DEP%orA,3(S7/;]ⓗs,v޷fVublɢRuܗCSfeye%mNƊom"M^]ޭ/^RTBvj}ٽoykR=V*7Da::m^=}^ʢTA^ݞ7Nlװh qi6kRRZӵ.))bW~-J{\w&Ny[,O/mHT%)p:r乼 PX/rx,'=%9x42UKg*fGgf"UsX[kjAWk2r |Qpy;t_$] hXAZm:7(VŋBy2d_nA-Js9?$⍩*"hE&)z]l([vQsqݻVa%ř5hmRpMMkje>ּ!aQrdI\S  `qy#qfoމ#(W#)5Eb/7\)i=1X=_n*fe& U&F8S JB>ы5<*Ρ>&(9d00]6&3һ_uJ2Y759GOzvRjQQnABM^r>VQq"!.\"#a&=FvbΑ a☕ wz"KF4E!o;~!d iA%ߠ?9ECAKr&tlF_x`swCj5So*R_7TC Bԃ&W"[ [O-¼7taļ5&t(5׮Mq!Nzs ('sF#+qV_5Qy,:ˍ=i%7 %0mĥQ8e/xA BmeWšAƒ69}sFѢ\T&pr qWPoK/ϖsemo]p<|UGdܥ;p̨{.>o_1HTR˯ !?[=B*7Gu\׶tx/]cS_n/ +ihjQx䑥7E#l 3 RkkŶRD1Hih`UIITF(m. T&8drڈ`c)R?"1e|C_tǒ睃~76d"7=)uĚIajd P(7lnLv |36n܈Lw|948syG^;Yw1cɷ@=Ȋ_栌/ԮhaY#ycqqd%1 FNjDbr?} 8tXYo-¼+xG{(6eq՗I],-0۠n⹄ $sg g(^ `:4xk0W `̞=kdlmYI焆d ۨ^$N?}ݧ+Y|_>P1 Y PWpC{kH5jC Bi;c%&BPϸͭGG-z5{H27hwc3"ϽNs?V!z3L9'g[!?3&2҅F8M<08}f%x!)D+7elTLFXc?A=kQq|!Q O:DséG٠ BpL_m91%[JL;SET&=ޟ1hU5_>BaVttM* ucV Xgꢗ4++7i);\rך_bϠ_ x;v} F̂TҢT b+}"tOfI^䃌"38eXq)(;y;ƻ[)%=\]C]C 62 3/ZxmT]kH}4%m,Pڴ () H3#~=#Em,i:=HƋk0{EVJm&B^PNzӾ]JQzo²4 `ܲ荭Ӽ=[Ү"ϖulvv?SpA-7.6$z\| fO1+ JR-Qݻ2yl Ԁ]uL_U־EާcO[@xwߘ@uG4UG[S>DL0e;LAh%` _ V>nT`.eZ9$La Ø>a͚βk˨oJ։5᠚)5-DPA:̝Gަ4:BԳf ړ]<7޸;F]6@@PS!˧1P#O0n}!=X<14 ?wWOT2IWTp P0mou0 \ ~iؕD) !'M}QcYױ N["Ā H?~$ KVho[ڶ&6}2ڬѕcJ:D=2ga̠*t3 `$A并nWዦ6:'[aL&v^QS;JuI ǿ)KwBvXkY& 0Iit 3+ܒ‹:K>ыbrkv%g뻿!KVשCNc:**^ď,t} sk g"8mK:jt(zmT9ؿlFq1 ρo0&wuiJvb N6th.=N2H+.rj! 8g xa4AA/+8,5<( 19J/)k^r~Jf^Bh3/xSVV(HLNLOUR3<..-ǔD?`ܔ̜T|">ļb@F*,=. !x5AN0Es!eR'hJH(ubIl%#g\)bD!ɒD["EEr@÷oG+&};x#¦>=եhWsT8]jedm(ΌDG~7rzaVbUEֶ7O+C<%:76Lݱ`rQb6gArK|tc+ep_}PQx<伶$}ǡ2Y\a*T}\?AsﴩaZSOk82<͢h2MBP, -@YXxYmHF{Q`^kJ -BCXqk4'wvuVёjPiٵrPIHSz+2*I~lFWA+O;ZR'y_Q6䗂VPWNzy 84nl5 B|~Z^~xL*J,PJI-+)V*J-VU(J-KI-OHMB'4krCxE 0FH&{ -B]cb>krN2F-6^pǍkA;:k35=2|ld׮]7YQQm.7xL*J,(I-.)H,ʁTWW+%*jrq'g&gk(!K)irmjx {hC VAq{}7,YC{ < uiNT.IG=k(ШGnJW^=CWA >+xuRMk1 WH`BҒKZʒbkvL:8TҀfg!"ձ IYYy=4s$:DBx .?MG $U)NLg*G;Yh>WoQ탏5=ڑskM]0̲~hϳDN6V/brJIl 4x;%um򫃲`+U"xmQn0 +|AibҎL;i!ƭ&UvQ}NI{xG^j]>-@;48I6ʀjk$8 G{QXYca~i o U_zд@•!mGo^`[@yd\DRQ0uFZeqf&FۊC  |ȋct&H B9c{~9fzHJBЋIID9# dj65MbB0T`xp]70yD"!QyGVVa7zxUPJ1+BAAQ,ޤ^$nc%/-nboɼ7fWt&3,#rY`Uk{BԲ9Yg.b1&z%G*Urd=->r d.qFT!N*:=wa V^54.e 2is2XB?舁0'rZ RaK.ʘg*?pzy}3(-j)SewǒV.] D k9KoG ixi_TRbq^WL^bnj5SX dV)D3Rsr2 SR2RK*KB\ $JW-4xi_HN~bnJN^WL^bnj5H (PX,PYZPHTH-IMQpʕ'VsTO<8_".ꂢ̼Z..4ixuTM6 W^1@i lŦ PpdV#9݉^R)XE>LT ?rʃ 2IZtz 0Ҽ[yݟ%L;0~?VeP'jRJ&YtQ|UpHjowwp L(%÷8^b04qK7ֳp]QLȵqEL'fD>Az-k㈱\" j?@L2eZ+r) O-$]Ui# S sif*]MUj%2p'P@:y&04/g~)+9Fzrq BCT{ӬXK%<6nsV]]vg OЧXd14D*˱?d XhA"ZG_ϸKWT(.ro\Lhnӧ i1ľX>u}:Kb"Խ ܔb\1mRIFXi%3soYL2L`*ѯ%ym ;ZLNa6oͼdd' zsg4>OB٘~3KZ\[CHhD.ʦ\?L7EOU)ytUΥ˰Vn} KGY, m2yү_|/Ûě?<]r`xuTYk@~_1KǔBpLJ_ a%mֻv>8/;3ߥ{4d8Ѽ҂T 4ᴴE\ 2(k@XfyT*41 j:2r]_}OSu/VR+/V O\ P my3ly^n+n@UG/kěC4Gs ꞕJ\wcϾ{̃1*1Sx +u=zf5B WY) e Y'-2 X#ѐSZmi[ $:|޳b - x&Axdp嫝xlIM1}ZA5TrGöCRMc@`&ăֱ7ckW9;8REx q(?*Ǿ6[8AʱkRia$2~h mJ6mK"j$̘%mAId6n QkL`\$UkƲ@d_iGXy.cQrX@#B (&PA SֳZA.#HU~az |Vث>Z{yVe{v0Q!;ǒZL,~~2EhYE Päs `"XccF|4{.(?91cPR+'pngVx1_Bq'9ƒsy۳7?6oĻuHuR8䧠pM'fuGX(RqJ7;%k hYl9&{(꬧s绀 XN ޾*{;X4{O>4i-[ȣUxTKk1W uio&- Nr3y5Uz Ɓz(dXGGD7N*"Ef<vq6zghFZ]%)`%Ww!ApY Pahh{~цX562x EfjZÕ-c^=U0p.U®xa*b4 ܳ߯hGM9-*sAC Q}8Ly9 !G$KO:bh Yiq9 |*K#,- w0l7^\zg IW~&[q2; ĸfh[$+&\-fs>N1TpEMC{ |"VXo՘x 7=56 $r1_o2e-,RźD.M: p|c_dxVMoFjh Q\H6z1@ȕT%EJN @\.͛7QNUHu(  VB^ucLA[CCUnījS+^ej~,F)Z;QhXVp˲<) EH_ջ }ww!.}*]xl iC1,)dZ7qsBeDƊ#( LIW\xbNQa]+o\t]>;KK/t46i3̘^WJ|4kD*IgDt9Ȝfj&*br{"YA=h: # UK&=oA8gU>hx DY&EI3ߧr.>uWA/ (U-KUtKi-z}(g = I j!ڮ\6 $v=^j(a3BB G0*dduxuUk#7~_18q>J9ip}24E?eh]B7|f~GA&԰B\;t?ڃ Pi,ʈӭ*%w`lPT'sCWIkd|L8|+KuB >o?n($GĒ]l}/~Xyk֏ OS ֔FW鬒O/@Hu蹯j}K¡t(u|W |RIb@!̅W &Yc)Gꄮ3kRvҸf+[wEaJfCEw{óS6k|ؐ>|*3@*$ ֓ @Lq_٦(8EvTɕvkvָ`\L(q8.=ԑ|c9W9y8ѭx%TI@%Lu2GȖ.bZ3;_ ,ôyQdRO_:g~|uT'J1iy7{}+%x=O0 /'ćĈĀB'| mC0xQ?[pB E5gV&.ڡ (>^{ VtOWl;ʶ&lJhAv4kl=?3⥥|4` A*i)Mb3)Z* T$:ӳ^;xo6v=2Ms\Mæl^1O=)^j7R=t?4OZ"PvS~vyᆪ(Yn+z`mae8`[,0ݸ0xmRMk0W% =zK0)Z"XNRޕڛ>fwgfnc$ _kGg@ѣ-aUfE;0+Ic*+U;hnzj[4vd Ih {@*v XAk,AUuW~}?7Yo}y@Rq~]>̑E`Um" snVҰ5, H[=Ax&XN&[Ak! V[VpJIms;X#ՅriWIa/^\yV&@heLqdG:ee YM$(X[m4s5 򵨬,#jp}HsҨֶQ niv8?n*\_~:s2o2 +64W2']G#,!z;Ҳx]`RU!VmW 9%\am!aQꈍb jqQ# To"f)Sa fwH d3D#ʺQoq, ے K5FqvĽcxmQj@ W@@z赴=Ul}]9YզқF)PB! R<=B Rk3}6v (ṕ@"dڀJ_L1 TqN.jڞ2T̟q#խک?[Ŵ,䋶2bac{]]C0 pȴ]TZa_07ߌe}L7k/uՂb0eʀCNNӝ,K3cb<R- 3)]lkU8dhʋ9*Qe9-'rE b|x]Mo0 D :z(ҏK ]oRŢ!R%{[; &_|ȜZ2;x^:tH*q+p*WmA; zV1+ؖcH% :C $rїXp^$Yc'>OC pV]¯1n*R/_gԉtw, M/v {p gD)nc=t1ydd;fS}+_zض0LL<0d7ZZ)1Jְxe'1R NNiQ"p<u4-K#zbp66zmk]2f7 o#"7ۜOi_h b3*.%_c5_$>F;o`]%vx29[Hpq4{Ĥ~c=JOH,pDpLvLTnyvZ/o_Lo?fBH|v MQrgdAHCeߔȉ,f8x}RMk1W%C=n $9,4J4,߫u &ތ7.,ydR=wǚ-(1Ҝ Z%.! TPdߒed,h O47sE۾^xQYli!(*4W5~{p*C.C_gafj2vPIhxys7*&`^zv r5TdzUAĨ(HA4&_ٝvNEynQ`I6> L:g\ OI${ޑBGIS}ohĄ9D٠8s;< \ĕ8~x+v:F3CfL阺ήN0D"ˎ x-̷:87$:|tVEGyצ.(QCb|Br;%hs {H_BSkO{J67%):]BHbxTMO0WREi/ET@VB&uqh{,͛7o|HذkzXS-kR`.M-f?m6Ae )C7o*@*pnDj%_! *h.rГ$Kje(g<.Ԛj^kƩf K@ENF 1r|TIӌu[2(T͹zĝ^!rYQ= fYR߉ tԦӶEE*LZ= RiKǔiPn*q{\H1% vNՌTF!넬QG!Jl:5IekR1e2۠ L2C ip3$L8:@S-f-MRNܪFiRi[#kP yUq 1y#]oYF*DbomtUr{A|Me| $Lf5Ne]J'gve$"~ߑ۲UršC8i2<pMQpwiFtŮنsU͟J(3eګ^ɦEhb`5wG?yyNzeH-EC ^^>[ SU"z|WY#!3mި \95>9b?Z6GtG%91=GO R{ۉ;^%_,k#Ib9Z5xRj0+CH\[iKBMBl2ƶX[rQ#ٛнbKyo޼"Cڃ̛w,@Js 4h8uKi~UV #kk@ؼn-‰`Gti*>%V?b- SUZOj]|Ju1ܣaMEGndEݳxoh["aE.~M>_\.")vԦD!>Ev$ٺ(Sq@H(hgAtDJ_:<Qp dObz2]A)asyOl>0TvF{z406̴AfFF|tzc&L_z)i{p!LC)f8cI<;F{}AkkMw>]lwǵ8Z9l1&'/$xn0DUHTʑ譭rF6x!VJd]hPoΛY9 Ȥroܱy҆N-|ZHUz1ӫ=ݰ-vD;ڨ* [J¬Fh|ؽ,}fpu;mRR+V7NNbRa4ӻTAOPȓNz$#edHMIm/RH{ '-2Z+`^*5^lڶZ%Q#s|<@ׄzR"+{A,TY㾒_@q~'I:xuR@ WGx/w|Pz)֖GCx{zev&+IrpFь4O#&0@Pc|}Gg-46:ڌ [lSaϗCMQ)m69C)bNIAH ,t:!u"ieBgFf| (Fx:j䯝^ڿWlL)8sM:. MUDu7x).šGBOuSP)xJ [`a>g0o;JleGg)VYo";G0ѪQ qPAYñPT`p1mm8#3xqRJ~h\[vϲ,VTgS6"$3i5'BjnY9S\!(*/U(rEKdӰ. į˼#{'{&Yν4N俔Q/G?Mq&x}QJ1W -. ś*[iMJ2k[Uk[xoޛ7/W8cϑ ~1qM@XQbC8ߨ Mײ7H.'9}BQ9 uCW$FjAX%-諀TlOȦyyͺ6'4Ñ[pa(hkX.*َ{LXegG?Zk]|+O1X5P-;s0xUOk0 Ph/sa1ʎj"V>+KYw1c{[x%J&6$/HP jŻ-~>4@X({~v5W֞t\P;Ai5gl)zO`  gLGv+xIv1Yiro]daj;O|HM+xO!.,d ..)ӿ*S:LFIbm=ƒ3M}fQ/dxTMAϯ(9,d\Rvv=淧j1:jE{zUw1fk3!f ^1.K%Ѩw.XL HaC>y0> 7$|Z ЭKvS)|U5Yr/0+8~&Zi]'7ed*=o}qܴE:urgT^f #<ӐnNG{X vqG ڷV a aBe߀5]|CmLuו(}  @}wDm?vէ7>HϦ׋cMI.R̔$c3e}8WoǶbPJ_L`.)Wb$c,ST}47L޿^uqxЇ_hϟߴ*A{v" /HضS4X2͞\:%:zl e*4 DG|ٳ%c3%~~ٮ?O5 2?Pt/WJXʳedLd .8 lNFLi].YWLebW~l+W3s˿NUk0J6!m3KhFȵeZ1xQ.@( ^xeAK1s) <,xTnC%3)-݄T=y2-"%4;Cy/ŀ<[[k TR/}(K}$8QD^\Q0c T(w54+Tr*}Q HA&<hNgwq Bd{_Ñdmfٳj %2]'Qi3EOguKB'@Zj( :% RK)t@׋V6ݥOQౘx1k@ "h:ҭ!>9I%Pک{|)v$׹/ŀ<[] )*U/])Kp~Z%;&Hŧm G1@GY;'15t5fŞ>Lhfyt:7-aRNe&Q^:uus0I95_.{9Qc^j'O84^ȫK0f%Nt4~ӧ]j}T5xRMoA ϯxB"!gI,Mf;3%*{QӮrd~A^X-ɨGi7q9h@e-Rzܽ?qZ Olrc2 ox}1k0 w -wCSحu,%%Z ak')[d}zH"*Yhϵ# 6 dYKGoЪNyE=?E:~jhj|x @Dm-TAܒ^vv5#%`ef03SB#x/b@>4 >Kh -C`8ԥ;3 LdpgXH &aN+ՇbM}IʍNρc{`JxUmk0_qd4d4  V/ly֘$_|s:oc*|XC`,2I#Gq6k/P*Paأ0:^D#ځ3ʼnddt8|¨qBP4Nke-ۮ[` ;g·.)7C7LrO5{&ˍQ76fD$s'FS#szϤsmUی-ZxV('ֹ3eMJ4ubJp7,O4Di CUնv`uiݥAᴩ3=;ԞOdF\=/p\4Y&yu's/H _mʬTN~yٖE"!\ZCK<7 ]0IBikދ>-3Z}V2UxH i9H{eMP7&.xmRMK1W PW(Exz]dڍfJږi7y0'OhxXx9JEo5|8H#jXo; ev)ޑ=v'K^, ,(/(mK %Xr 5Hl|:rY[UXjm.K0u"{=4$S Bs)+O"Uk6kg:c2AVǁĻ!/g Ydd}nIQ Nu^:B@6JFΔGOF62Sk5wܠ{}ݑ]dz4-!L foh?-"_jn+GvtA)n%)S!,'u0Î' ]/vxWk6_1,A>AH%^h_֒jdH3w׼qf4_i4y -,8px\zRL|S9M%g^ Rf-ua}cEIUd˔degK#r?y|[oAQpq"cu}GcgpkLBGAϽl5qn*4nnQgLn ā3Ql&#.dg9\$:ȽSv^z%{E`'x S<8hie*]OF 1U}&CFKfeP؅xIq X oV}\k&[Eբ .\nep@V:B$[**_Z@A+B[#C苸#-^a(M8tVG0Ej'E#_pXADzʼ"H9SD}xªCc-1\Sz=F'7R}._J7^/xkp;m4Mx%f6<6 H@H…W)+W-iLJ G--yv!`n*̇-3^%kzOӽ} 6hMfy.9<ġ =Ts 1TCpT9GT"C3?ptǜ! Um1=utx<=V; ..R窡ghL̵Dk:gDAEy7⾮"[pL a#?%[L^ DCDE/.9">CͶ޹w {;O6kWqx7VuNx{GLlHoJ /lωO?-DcGj|?=CCmًGg=;OpYfkGOu+\}b4hk?W^'xQN+1 +>!Z$\9T;%M]J@āSxWp8AӀ|QE#i{=Gw } %,z%a wEzV|,4aݣ )] f#‹K6ϝky8-8fn?<)"inm+2ʾ5 d%s9I{X.|j~)F #phh)PS2D|UTph1JwɥP0Q$wnD}"~]ó*vvtiIJsB)[fp7J:hanNÜD7s/dYxW]k7}ׯ6cǔ>IR'}hvJSI2\I)}ܯsν~ZZeGnǍ?}x.+ic+toN)^xe4W^*h²-DӚ ޘR4٘^(wb# ~,>ow ?+V⸨yT귫/wXG&\؍r#ז>?AoLs:rv_~| w+J]I]*Io\xnVreݩzF\iU`KZH~ˍũwRTh]7V2 ,[L yzߒnq@αQ{iyқbq̈)v -SJbmE ߋl%Fk<Ժ3b'-"(G1 u[Ԏ¾<fDzJW'[ XZia`GrK|,R㟟LS3BA4$+FE]mu;]鍹>Ә Q! ?<ƙ!KVCڪr,Y$4R藮wE$|kf!0KK2E~V|&)}YZ/ztɧES ~C*EY;#:k xԷ+0>s4 Ljh+@a8&`ARU@f3Pم)Y9j: kY3d6]CXϑYx*e. vOtgoCZFCVZ%,i 5>[H5P_K_*ECS VKK%&PG,=SKRFo=I@ H#MMeYЅLJEN^B>hd>Ҵwo_ *!3tTQ_SYkan I-k՗/0)gIO_:K 8kkT4Z`hP)S>^ݬrYoAdECլH>zLY'M[@Ɠ:@D碔O:-@]S+zrWIwhyRz}MFI j2,lIgFU*~ǀȈKqc,nbh JT{4|di- HL1 FyWo)}NH-1fO⸘oŝ BI7%&X9~b)+>878D95[B `<i|݈$}7y9K\+@td{:ׯ~^ge=;Kc uxuTnF}W TDE 'm ) 9^{#Mj+X̙3gΚ\H|?Y7TGG%tOZ<Ԭh3JvB>V8{d+K0xHP#'g*ܫ#tmdWFK\үlKra0pwLDc|?PݹgcP3}~dL:}Ϗk\J㯓#\W'N5`~ J}RQ>긤 sYi4v fƎF4` &Ae%Wv%팯HXbG ܷ1%G' .yZڇHs7[O7 *:Wyx#OY9g짽e:a`뾡u3~I cgΫBr˥;}0$*Y "`$SY[]YY9ia#(dhurZʸ(0uiS_aʞ u](' ˿k[0"XbqyS9O04MIND+յH5rî6M\h? Qt1r`#ifXgJ u`y vM&_ Dd̴vSTCDf%ᤱ 5 Q@:6K'lStZda/ brM~"Ӈxoj+2^^7)t \-xV tW2XaH~%VO׿f3 dRz6Uau4qn߸g8Nm|õ`xTKo0 W@;衇= v"ѶP[H#H^DG~y_Ѡ۱F( @?4¨ ~(!4[GpW~.nష> c'JBF~,˒cľvB񷗧_'j tu~zOV/RA ;;\<#[imk~ɡ":v]2^+1Fkk-EA!hSC Zoaj;D3PS*Fˆڭ=28On}!r>aZ`[ei9b&s2ۡcWiqYTJ$ s[`T`q,6$oDl?4v`b2'3.L΀ N@(9zm>h2ZG`rbq%3k{EcM A62e{dNᎫͽՊ@ޓzWEЦ| 9c#$2NR&?i`ixrTy9rl$jŠc ^D!SZE#5CDr3\, Ѱ E1\!ɏ<͇R055hB0(:E\o[ .}y H2ZWxSMk0W 64@KiKPX/ (`clkp;ĀC /F7tK`V:mvt[vrM=B w9+QMGnJKQqÅCszq6g[mRf~\Ꮧ,Xm^ l#6ưb{C NZn-(΄O'~H#rP%>Imr m RsUX+@b=ȡE?j#t*-XD˻ֻai^AkC@=ֆL~o{1RV&nLVN{|4v~OJ 4:3MUHXD`E8o1msA[c9sXзyF /j-3dѣrѲ:423-ܯ>r9.ӛ@fm>/Mo%V־jJ`,)xVko7~b!# ȧ&'A4OmFQāAQ!!Y,y'9,=wH'i%gsiQm@V72ֶ+iR.' >7Fd/宸Z Tв=A)X!Ab.VNVAoiީlmoc;1E/'B/닋199J hL>Nw.D ``1ǺmD8'*Nƴ>pѨ/+DYW=o/>Hnʲ<)7OQL^$Iذx%BqSZCA>e%降ZJ:ׁ j-vL[lK9R>;_D)3OW# 8õc/%M_IhjÂ/PkLe Q(EVZJ=Ci]{o_Kz-Q&5T:rیSq]L}-=Ss7ҥ{w5/A1tp1Z=E2_rY;zq3ufo~lY/GlB:*@\ trP>ʞ]{JQW9o{]be::I]N6=20O>Qi+OKHs9'+u z%оg& jeJ%Pl $f3 0[P7` R݇ׯnq#iYIN ˸kYרiq-S'q * < BIމ:Z7U|W%`a[de><]xbtz ӊc$VI]SxJ*S zEg.!=Z,ƊdtrЦZLFp:9b섭+1w+c=}l|9+1q@m,8f:X}6EI薄K<6f~_(?QGC)S@5?|%ߦQOvah`{Iy*t:qPP5o#ZGy6'yvxH^"î٦Ӡ5"콼|ھV @r`(m.l{}>{PSZV;ƣ?syE$:X-xeRMk0W Xs)&T"KXY2Ҩm;6}̌{OwI שCwڃ D/wdQFܣګ4#I;0?IZ{oqrޢh52!= FC?u+ȵ)rf@Zm|o?*ga"C8,zV CTT0m *Xnyk3߻P;8:쓬ǾËJBfX%q/֑ ƽ~boLjgwI 5F̘mZD$v"&3)z|%CdF)rFHudur,f6!qħ{`c(sV|,xr/z[D)ks/4"z> ο,_JzVxSn0 +E[ u ]E7lN Ybb!ITZ𿏴7+`7I$#/+zBA /[| @HV]uÏt]ߤ/Z{`x{AutzFj7j[M _~mHB8?'*z )EPFM5_u&JGmՇ%ET{Ŕ|Ӹ^aC7l}X!pRrm P*UݞU>aR <5> H<;2s<4A;0gBu+!LĞQ,F+K7:״Bp.)fF'IR.ma^kE8 O|a^[f lq$U k,kf;0G~RumƑ[^ rA&b2ѵbY8doi'\̵x~ 9BؔFL 2 X9[L5O1\ FvB&,qf &4 o/TgcCMՖ!rYpҶn(2^\\oGdAgXIBu \<{ܯL|*쐆A/?S8̹ڷu&BxuR0+Rz XҖ%=5e[[D4J75$.5yޛrICs_kg m8'ztZwKDo@w`ԲGms&9-h#gE"[nOXE<gR(.aAUWgRϱ)pnzM3_<6W +| q @F)6K-[pd'RcH(ޜ}QѸNY*wa Croϝ㺮;=5=:rPch{sz(P8. x$B9,]gscIxW }RHVvi<[u QXݬ}[5!_ъmxuTQF ~_!B}hZ,^X&cٞƞ1q7c;Yȃ#}ʎ\L=~QH\ژvzGgkб:Z:z~Nn'c'׭rmly8Iz6m _?}^h|lwK>}y|R &6[E=0MEQܫ3yFƥش~P">Ż?VAJn|&-U`r:$ׅbl 7qZw\V0[B:欭 J?u8e,?OKNɷ%),.*dFmb7чm|HNWdrCꚋQ\-FgC2 f,=<]1H/u>0Q2^!H*%܅BVeqXiӵTU$|-˖J IS42٦ZκCOFvYmMlhձ.2xw58bWg11.k.sS (٢( Dygc>9am)cy1p^{*߇o9*1/4] Hlpt% 6pg? $.EGb<=`I)6CӬcP'Nglԉ[ߧֈRK/sTvnqzR'<-/9mں& P&7ܝs$$֭Q"d`a0GӔ[!p-P9p}?tɳxu @DmD;-ə^`‘7X o0^X8jƩf9Z4$ yj:%uA =j.#<:.AQEs&Ԇ1TO6[^!-!wpDׯWN)V>xS͎0)FVjHW,'*7&V;Le倸7{xax~\zo v`|CC|B;ٰ Y:7#rjo5te\8"C*&ӞMZjgCRs3{x wniw;ZoUa}CI-㘤# :6ک-(L<@WF(5|FT6tB|NZ3| Ej<ʉH,!"͎Iqšsy ZEB m,LKن"~s2/ͷ pB7#$"Yg}O* |EbveDѥyzhZ'=NAMUm;w|8V"{,*X ,3J*0RQ^&B%{uVgӕE[~5zxM #+u,'q7mjFl[ ]S6+J+5Z(ɹ"D($ߑ5:lhnx}WQo6~8(1[YȂ"I-Q6kH*';d'i";=2;yR YIU:򋵴xO_A +F(vsdUx`e:~.Ń4ZBѨ TfkTTFTmNn7+H'ɂ *'~(|Òz:~ TSz|sy&_PB'tTM}QBQii`㚜߃& SJ-PڸE^w)[[r?K%X^1r}[+I;v*^`y҈;eؤڠ8,4/ ݄bPg=Qㄥ ǂD]Z#P'yT63\=6DX7$~>ih|^zw}_ rzRa< zD7]xQ-2%糼vs蛍[(o Ⱦ.v2\R[qՂ:=\Rq.Z>†ћ7WP @<$X*/b!xW arItr4~+`ץ6w8 YMPing$߶6䳅1BOP+3-)0mL0K9 rʂJ{=ϡ$oA_//0wK] =&i5e`*|noO]Bk= 4x:<˸4sT8E>54 !p_U6@kc9ί&]ȇE*Pqٶx2m@Y> b> ċ@4,,*;PA'X43:eцLMrp}/x]PAj@ +D @BK.=c ȻJZ2rRciZڞ3hf&J| G', NDa/4[bE6$k'>14&5j@@5d@7x$S~{,0[͖ϱncez'o t ?,{S;WMN*ٯT^)lX-9* SBXT^DUMuā߽j pJ1]x1O1 T Ċ:WLE9UtǡBg//,\H9mAK!Y!j3z6xMLՐ8(î(=TQy[^h5e g'^ܞRG]&^wc& -6A{뷩Xݯ[gDi4p,9j8HʁgZ;tqA{lnCTq!\}vk6}e%QP8"xUAK1BA`oWz\t3,[wކ7o|o' m"QǞ= H9Nu1Y{ &xʡ趉 SH]Lk'_J&ʏ.:t :6ŰWS6GWfumjfOMˉ|.%϶iy7l04@"~<^LۉNl8%RYFd6&$2n5Gv/.3E43K5߭;߸5xmj1 "H`3^7B(e q#/b+{9w3:YpOLyO T=QF@0Y`GtC -Q~GբM)0`m)s S&aࢹVeDWS1&<7=БdRSL4߉T:ˇ+ƱZ| Z>J`,_ 8#spEOG f!)hf \~NqSSVQbSg[€A5UݭoefC՝u< M=-tɖF7*%9xAk0 "@`vvl;bDJ[Ltn̳OOo/Q@{〝+#08:˰Pʫq3jpnX(~P[@~N"@"IO0R>`GQ.*Un^jS7-w!Y1V'W,: 'v%=Qk/O)uQ^E:Wh%OVFmkT6Y6dj|WUͶ)Yt{MA l 6fO$Eowd,;}3.͚g[.qceG#q+/phGly<4KP *ˇ8~¯*[ aAY-Vs8.m6Nndo;D%r*h8p @$}(i&2\MB5YA! EJ7ƞwU:. ElK{`$OķК/ҞyBT:׈Qö.` J?jcVLf^lg;YJ&ߊjѹ(YUn ؞'_[Jx=4&$p6-# L&;QcC\68җևnk"jFݧ^sEc_IQ 2}'0m?.1@FҊچ |5$uȫDn!_T}trTjg51  ]Z'm|@sn}Հi"_p;.y}y JPR޼@cNaܱ9 /t]( i(zOR{cȣ PI/ȷMCдP'R  Su ?TV:NnƿAܠm\W=DnJLOb!G[r\_2T;kSt>a,Gay0tҠ\m&fr&/j=a.fBL7sY3/$X}t|ͺ􌇊<ǤD ,n\*Jc@:95= /#i).%^((Kƚ'k{ FbC12&jz'N39;[v|~瘼_նYšZ%ůFÓ|Gg6čJ9⨴Ɩ7/F%'yW j'&x]RM1 WK{, 6l{ ,؃!L{l6,OOOғ'el<Gʟ@,K,la4L6.82N/ǁcD«旪Awo{i{ +L\87NLsC\N}040y" V䨥,R ³mݦKy5݇hӓ|Kn@M4^5IQm:qE IBԿ}suTv6=wUՕ޽!ՙ_[΁SҜ`)mqziNd&GG|s"TWkRJ+xA06-MPz)Kz54qDdь5zQ|3zs1`Ԃ^&:u6O`  uRVóGxQ- Zpvm7QAiVN$N<"`1 X 7r%޽*-pRś, :-x#xwDh YLV_yu'T3<4Oڏyw,@{39訍`OWVkӻ0r*p?opwh #G~v L(i_E6 I7ҁ[O~Tn=9aVl"ܵ/xuQJ1 + +x=xZ=)N3n;]̿vYҒ%V( Րy҆sE)JhtC{HE Ci3x>̨vI{-+mx.*X  \a!cOdx-{N#4Iam'Z薾"՚AM1ַmR,l<ґ|pCjY#N=L"iřEbas vE9I}qN *7^ Mq×c) TIC4E(v}NBB?-|G asknYGN_]xGz|zva~ճFNjda=S1%O*䈃A7aGUuz/O>*vHԳIS͆cL' m_ړ"zdVϵoxx9biS<8-Mm\PnknA>9 O{#o%}~acr ‰(uCLRsI.Hj :'%.kKc ,Gԝ*$m,$}ڿsj_st4aHmMhQY').9"막㨈ԏp;$0jG㖛llc$[&l@>}~_?|z/P,p.9C^?yRYmh٪:ha6z l =+~ samxkFMvK~|0ܪmvuZ[ 3?Ennljtjz:Vl7ՄuN8-2wu>T={ aRV+Q KLO|حYlY4ñڧ֎XŌ]WbC+XpJz| ;9=igX^&V_öt(p`_g9<E \ #c+g0QZ6gb%G,z8$\%Z0Lp"BJ[#@P:݃.p &%^0R.ɣpK[FK{LJ 2F'*I1NIdYf]]&xeRj0+B ԅ =BfeHr ]?.Y;t< 4/ - ]F4r*hk4e ('Q%~k 1:N}'s4U냭>F xFTCst85Mvu"A8N?F* ]Hi["FBo`Mq9d _-CvVoBiN~k\|GT,2hAcM Q#V:u62[Fkc?Uް "h8fq-!1J_M}/&V-m0~U˩Ku1i %sX{+ث ݄{\Ou1ZbxuT]k1|ׯX .Їo"qtv#]l_H pVٙ}Gq+Z)}UOĕNްʆ1޾69gR۲gs}>Mqn]gsAX!-뻇/sҍ!Z{]ի1RYdN-f"'"SJ'ýTAY=:a>B^ޖC#ZZ$"$vSKkVN{ߓMh']V8Xy)N (R+S[y>c]L&ouBidkٛ3vjG/\@GXpMA*- &Ĵ@[;: `RqˁbCS;;;>Í6IO%1<[iFvː!pC_h#6#A%A6C~Hn&klq]k6 0زCY`(i;MtZ&~/jFZ@$^4QGti T-2Y`pdatIdm ,)8e]*tdCH9IXZI=_ 2$ !,XhEx,6߱0l J&Ium zבx, |n+ޘقԺ~-o `>+i\ʞ!-|:GFmNEx78e)ݩuѴيT7U|O +lv0ٝp\[ya60)b.KXB!MSNx#"4) FP..h#a!f(Ay(iwY~`< iZGOpȔd>d~ E\ퟮ]`iB6 I[`(':*E*@IbِUģByf]Q2xJ?ѝ5U@oSzUObr(qZژ2 c9q`їx f?c)M#?Axd$T’#(Vpx Wc,qx'CJ94r!s'$HJ/c\}tgbM&>k: ^qP`ŔMu]N*$k 섍z F4{UȑMyRԲȓ b16:}wh+vE{ޛnBxk {68gh ,.,a'Ld>1h'O>t VUFnR߀ȓs~˪Ŝ<`B놆sQπRnFC?J&V |/}6vxR1]*L+Lr4#?Z;{jmB;uʌ5`a{>|N{!?= ܒ\aUH1EԒbOk>N& $;>raPa0.>,X!*sDBQ81Oq'樆kPY1 Ryt$ONԩb)?wf2xGBR+*Lֿ}@T.IVX(=)8raEB /=!  tǛ 7__wR6}ga`^LSƕԇqƟ't0@xTOڵ)l1l7B1vuPI=I֋U&HSB=]2OG]..[Yi& 5.DOt3(Ng  _Y觬x E<"v`q!~+Ng.(=G~sXy'g,a"9(HG:gxTۊ0}W ]HSBJo%Uq,"KFN͜sfvt6=^PD\$ZR=um鋮at2ޑqz:i-ePkp}Z[$ês A5-/E| U+z|tH8|~ũW8ۻw Eg[8ֳZ ưͥAMf@qPɱThGT3XʗDwj]5n7踜<Ƒ*7>0g8)ce TK78!*@U^; _߁cb%^/p4*XoL\x.B +GSmmm _#kII% TuΒԵg0m!8=AekC␨!s)(!*s,"37AAE\5k$I9\:XF$BWDGO</7U;5I3(0ߐ<p~% <͊"GDn%rdRpYR/-eЍM]AC@EPiJ `]$SW.gm!rku8ȇ|_L𠾸<%UbF-7RQs{o9eW>8sAVHPcB(ƬV^ZI<6+gKRX*U犼xMd~0Ċ6z[nd֣ylsԥt)2k=:~lwy);rpHnSt x}PAj0!ЂB@%nd "VlK:4܁mr3z7[5x]R]k@|_Blpc!b0!!Vӝ=B{U?/1C1`MP7^!Ӝ5Aw ֗jﱡ|QYdOp)A.fBA}[NJvi׮3v淋 c5AmfcdSMI!Т>ȴ$ ؖАqaπ΁ hD(Oƈ: ^IʣZ򆼶y[ g)Fu!qLG.;5 %RcUnACp;sDk]O,^v: QPhĠ̨I6ZmJ䡌B`BY!b$CTvVTTf"#'N#U%ja ە%3$~BVsoL|]M눯o91Bp|N؁4ֵExeSn0+ H@z!)P8@@+5M ʮ!;dMo>fgf7%P.O=9/HJ↾[Vxd'Jwdm Xbԑ2oKp.8>PXQH+"cTOߥjzϴxڐzHTq dZ7^g:ki 58$ʷݭVLL?+8 p,hͱ fHLS=ub$v)svAI "ة ʕ~'>tZzΤjzqY_[5Z(eql`nһȆb JǍZ."!JpI_HD T <\`s^-;WqM(ljdcsplYw<Xd)jl i*6Z͒%f @Cw=]O/7~xeQ]K0}ϯ8  5 Ys׆H2޴u*垜5^ȒW4xyi>JA X4ǼkZ]?[ 038 NOh&>lr#p[Mn#b=;W'S;h)ľߜzx Mؽgokϓ>;=ҧ7YxT]k0}ׯd:Ic{V(ct+{ YDl裉1RҮ{ؒ{3jc E qCr]3 wxX--jϽ2 ҙ`断5oq8| ٳ5owK^Vu&i:kqH,=]U|G/rJq`ҟ?<3pO|}`x7Mz%Z0]ΑNZuHgpYLEx9%-<.Aӻx;bCK<Bv[@/ ҡP"D[eJq,hz(ǪEjV5 b^+V7=a$- u"(Z)ܥ#$A y%5qKo dJ9ܦZVŰJ{ҠE r]{ም{]!&~T~IdG"X{FǚCGREuG. TnfiS⨖3A'9ATc'FZ,Tq E.L;lϗX܎.{?_ez1vt$=JO3OzVMjIQ,p2[z>&beժZ=`Ż% +x]Ak0C 4ą =J/$=ʬ4k%]{Gf<|I%p >brkc-|B{E2f8D%z9 fz_-sT^[ 9Nhcw4'nM!i.$Gb/,8n#g[e^Lo{SA.mHLouՂb, Qҩـ)h.Dj`KD:x:fJW8՜{Hd(6P&CԈl Gw.V™*NZܘDcD"W< xW~KGpt' /o!z$~'$ "!fŬ  ,,LI7(2O/zOGgg:?_>~*Voiڑ4%Ҭ9t:Vxp,I;ffvrd0 ޅ?eTT)B{1#Ĕ+E}lcT\'PXsmU@|4cT-F$[JTM]f&\|}UUME~D;kNVt;21'-<ոklf[GDgZn"-zKCxqV'~j~< `23&$GjJq%6mX#<$s.Eq CmKj8# ={䉍w;{`ڄ+ MKotS 9NxTM0W ^c)m)85eJXD$n0}#;f{OO8–q{B,tꆾy֙s(~[8&M{0NC9KtZg6}a֚Be6;u}Ǡr@f 4JTi[7Ƀڸ0"$w-dtQL'0$ 7YmLQ'𹭬OMq&a,rt.lt.D|H@&ĭmj];4XIcҭ;Q΁r$3@z 8@8h B3hJ ~3)o]QP`P?+D 6XGS] 0h~iB.՜vlHSŇlJLGZJץ rv(_Umi:k#6I@iIS`UNH48ӱ] l@ zSzt̢ի*AW&}b"%*fA9~Ȑ՚3N(J4Y~,1,PLl&%eG5z=2ƹ?56+0DxuRMo0 W ;amqZhG,yHMd|{|5|'CIhCOH  BIlHq 4cT6de (QԺvbcpFؠV"AMi-j'mFlwS'͸3\WD-J~=?}oTˏ~u}+O}hH!i}X橠E 1}؂u (SDbZIi%:¿dP3QhNc"8MFn+xQŎlfKaqb3:Tj2}RM&aqyOl c 9;p_塋-j_{s9sW:ȎpYOp4=-fbmOXtgQ #ߪ0Z5ݡODO*gE'Bm:[>Oe8(= O'v3sBo,W=H|R7ӗ|9ksY7Nx}TMk0W )]Hm=zjr(Msۋlmd1$wK=Y̛yf-{YQ3ws#"1ieU6lYҖ~'Uʑzi kV$iQ C .buMǞ]u9K<.0 )SyVZjq@o)s^šuPm tQc`K-:S Ț?= `kҶp* . dx9K tm|f%_^BEopLD-jr+=K ѽE"]_4gPG'F9ҦLq+b{9 R8!1$@?gY>f%ip(؏rT]A=j#A6E7 Ƀ\ lr0MGݦNӲE <ٟ*!:MBf-.坁.<:[iԤ,!#7T=(jXRk9jBp(̕EPF0N۰{,)oޕ/~2.>WBa |Cs1w]+9,;tк).4ϻ~#VlqVxTMk0W .,] ^E&6d$91;c;7{4i=/ED{mr_A9.*V%gǠ8Du6mBadeEm])}܊C"|:l8 AxRm΃ۜsbFu6y8yXAJM`ni> @l*<=$G y}_8JG,[ӵWBFCfr ;;VMyuseqʕF߸Fww%,Eu4CxWB қr>'!@z=9q3mzmiy/\Ka.YB+O llᳶӞ*Il['#L #4ƍM<\>|ӺӁt!CMhT5nq;ApR5h]~\Lw>AS@=캖u6Qg e7H.46^GY$$ҦLuZ[ᛔi%NDL_$R{6K z37 &oiF@oˎwu`؆#(Ts@W)L`^6c~* Q9}m?iWtHMY\$9!DfAW֎/u`hwSEr z1bsDxmSMk0W z @)eLYkl%lޑm`y3o-|%CI8ٗsOH  B hW6de (t}p QR?D^:ʢA'r;TД>K BZI豧$+i-N c^~S$hLsRNO<nXKuk/d ::TpRZ_H׎3w/s >:g#N* +Z>tNG|TPAr)~]x2DŽ^9Ceq(Ϩ# dàL_8f 쉮6$vvFG}^&GCQUFP貗@XX,kql''ۚΙ9LaQCzE6I:.F:jW%xåqˀ1*OUATj`<=H&YjH k\Q*KYMa^Gd)' -}m ~KaLHQ/fs3yMXubf\Q6ܾmݟ@|ڛ[_נc׍Ja\"@nDW)԰CdYWa>46_ MDACP˜:̬qFڶz,|e9* '++ -˄ejy01`ܲryײuv0zk1AdKJL= B{~{oT=]1ScM3XJ:nx 7_cm+? Ee;sR^:.!LJݳ&xPMk0 WBa- v\)j"l]kN=5%B'ԑ}ހv`ij! ծYAag-<ک@)j4 6YhRX ,^NS*c@n0*cț~ݍ}/V4$UА2<5SھW:`4OjrgہfO8azK'I"ԻdpYf >]b/#pg^o3-M-6/ר< 5?<*xAk@+@GMpZ[M`ڱh+vfE+ۇ7y-L<|Ҵ4`7q$ܺtӋ3i/f9a/xuRMk0W @ ^z S{KHs4,֬-li4"Y{%{lB{{o|~#BNv}{XB 贺0Іj%'(Ɲ=iUR9>Z Ϡ(2 n2ԭKyj70=|bTklZӯBiGGge5qG6U(k8M tQadw)&tʻ=={|Ov#‡nkY IsA|t*/mIO(C!fƼ~A۱Nƍ Cs'/ޮe5mE2ԧ>8GȯC<KVE,k_#]^dw8.xVQo8 ~ < HX˶+[4} (6c %$' o?RVҴKG20u,PBAiKPy iF儓ZTH5:f5.]D+%jZk.MD%}y䤫́JgtMJvh]vz l7'v}iD@LWtbk8tx1PSmú{ws2G۠Z^eh- XFr [km;LiE*Ŀ} _q+ʱp%*9vwO䰏Pъa^)6/`Hr4 ҹe&JNdUIM]VMpgnќYO :È͇@NC%z.D63a]Dm$xrcŒ.X*vLGTFH^3b ΨEݴGG X$,#--|=~Yϗ?SȒ9)) (wQDœC 6ʘ^ OB6H5@8ֺAAwb=y=9]>C)TRj3.[…4<,˒bLP 6 r J99ҙVgh`o|L򂀐Y|[Q,i>HE<"OqJ*I2JLRFס^EKZ;$gJsn?>=?>M>.fO)w#GBpFE׽7CexrM rݜcu1 d&rÀj+v=ɱ.͑L捻~/Q7v˵M;~S(9ѠQLѲǗ8,;F7O7{'~(*7NzT_Z>93OX}&rhhҪhWM]9xmRM0W z\Х-fN-lIf$ c'$l.gޛ7<1&2;cM#>$ c4z?a=8 1TnTQ"m8yUѝl(?~?=D)[eYM\Ĭ*eܣn% EͶ ]F;S3UZ%RrYf1 LҭQ36!c%ֳ߳'{(zTfųv.Vb Rn\r:vER%GC CZqM!RX׺(~O# ϓ )2Yسzil- LWsp }'ȡ'"nя!=oq\)wnGy:ĭ娦vZ:5{dN+ Qx~eBS^jyq|nJ-WLbNfbquiqjpbPkE^l= B KD~2[cyb-w. ɟ݉M`GZlm Y[ 22֨tr;bSJO%*]^4o]zdo0=18^|(#nKaFtc;{0Up*llC }hF3@pKUxmP=k0+@ ]:dr-RE}Ɓ ;'=U_"B,j 2 h/!1FW$S8n6%m/- Ƙ*8JLS@g3];'yhcZlJ/eEι'(|x9R7~Lacpb6sd+b.&@:vk༾ԚJ,tL⟬Fw |w ((ǜ6xJ0 TtWNыe",*`/ l0MJw7I+ ^&vs FoZ .T1 ^el*T:wo­' >5PB$uRP;pV6قP;FPJ]B$vK9zU(+5=bXGOoebpxG"II!V>~y7X6Ku>QJ=v1i~1\gJ _,Ofo_{2faarsAhJod3@G2]!C[QzMdЪ߷r6xW6h}?N9%KiPօn_(s;/!XD*ƭ|#OOia-/~L@{2x*.M,(.ix=ks8+pw%e9VZNr;55HHETj]ݟ_rHmK\M*Int7 F~1R鳠aȼ1!L'?K;UgTj@0A>[FhrhWsRlWm35ZƶQOcX8)׍=cw1qd)\>>O[`3n>Wo5Osϥ󥚶՝jQm6 K9( _=oAih-BQ`(9yIhB 5zuGݒyE>{ܗKqYQĸHm֔l} v4f-ٌFf gA"",l"A j^mAoN.v+4{Fc/͒"L=lfFkꯊtf2ZR3AS͚lZ߮6Egh"bNLm>R,if(lc5clm@8hq2>mbL\pU*bIN0@bilu0lEf&4H˭ckI򌅓dtr,"9PkJ*"'Wjȫ6O=zHkdZ.2")kC;>Áа)5.nn.>(`{v6m4r>`E5=ҝq mƄ%Rz>B!0>}ѩ`xOaqp肰XM"1!"i*:5&?Sr}c lrmр[Sq0vM C:q-նE8q5qoM~8p@w"Q?MM#}}w%Q7]ѼaF7ZW,tډ !<0ɼ!3I^m{ #HH!^/!ǚuq!9|%WwC0/6lU, y2qD`{VK(RG<jvNb 8 hLuy#+0XĝEy mtp+J)q=g!@&ZtBTIwtq~\@AÆG^"͟?㍿} $sa!@Ru NLLBe!!~m6z{&$Gicr"sô ɜM(ؔ `ch -;L׽[$C3F څdf8XEյz23F bsҀ5?`w>Bׯ~^j37V`z{;uHMj۵F_VYy6N:xh}ǭeQ;ͼɬ7#^)Ypgf7RĠ[qFdYcF`IM"+WHĒ~\8H{ J#c"WB)nUW5ʝ_\C(1_ C*֪MA<$^4`ZAzqEӑݣe?%H(gT`? !]DƊbAKID7ȌCxB{in$``F|L"tE1VI-@()R$LM05ǽ5;M 2}(Dl+2uØl>!19Ġ 708U\?r9TryurqN0)6UpP:`r]tGN5"$D qGT$[h0̐YC s3L9C 2\յ|Z}ĭj "32i1kxC`:stCNrPh=J~K ?Ȣ1}J"$UC~al{gC5T! |ِșĀv)GI<{;1ap^0q'?8 $P=LxNZ_"2C ~ޑ PS z}1nPC,D=U{Ós?BJj<6Sc^AS^k/ŵV8ةz#2`nN87X cd~-FQ$[F:zE\SoD1@8y3U`ŨPgfdoj:^>YxtjBhpj(GQّ`Fwy孎 70>t\!Ґ쓫-vièq+r).5ޅ;::x&Z񾖍A#zwAc/h/lL'  ;Iy(牙ۨ`~(ƍ;V&o~lX:8N./:NNN񩉝POH)Q„Fv!Y\C dZ6 j ^"'WvMaX9U/Esr yr4j/l_Uw^`:j*Wۼs_ (Y28SZ[/F.!ey2mr"膶|8fAh( =T.Q]% \a,ݢ,#Yei|Q ha1'LH_zjSӨ _N"ixoN(rs?;160C45pc`~Tל[L>5K\^玘2o*XDۧ^ZMȎZ97 ?%+v~V7\_0Z-VhQ= OD˵SqCHwҿ}rG9gret<2"V ~)u0fe4% wL; Q"O "{?t0‰[baϕ1ncG#tzgŠ̓lV,gRz鹣?x_"yԥ"7A)>8V#:Í_cV =7>9ZȓHVTݙBh&}H&VXcغSXWY6[D;8ࣽbلzV.A--R}M;>ixq8#|QX-0X ߚ8&,A-}PSɣ UWBҭ ɏ_OumRr(haH>i!mزD-Oe,p}l-#[513[SOUC8fb3r1|>(o~<;;S`=-JT+t1  ifo$߈?u>e~ 0҇D}&<]h frk:We 1a8&VmVꍡBݵrP!o!*v7XEh.(լ l&jHXHI(A,]'9@W'l("FzτLlg2Hh]NJe&Դ& AZ曨T,)RR/C$( r/$U۵ ǝr449LD 0g9 P' ً׈L<:+olVBOHj0[lڳ1O~Sl п?rPE5jrf(~t['M~MhEDfITaG]уLә*9$SR܉\Oę[~o0cc)( Z4:.Gti ]1nHQ|(y h0MKu O7kڲd-$+ګh\(/$Ё־B$KeCXb#l g`9fik`U%l/X~E_W4 )%d)I@)Qrk/0<,Pz[`~i*a)<ݑ;ّ[vH/Bʛ!3Lc`dMI ~_ :T8Z7WC.>c(jDϋȼZPP7i}GL]QefuKt x,J읖A1&RQI\R>rHʋ V-H9Ȑk1ؕd_YxWbeI eP@"Z 24@G[b8D2be iH6,7H|.8e6 `쉙x 7ّߔ,ˋ Q ^>?N9Ł磡f<ea@yUՒz9rq Fx.6r?19zOV%miӶ{PO|U+-8@rd,CSnb D+x 7cVIru׾ezOH )}<_yDAְZΐ#j-u!ԍzh|ܲ5ŗ}g*U%P7ș ML`K`Z'z:lW,m;%yxa77#omW UBwT6jٹxIK\ڬ dB2^ =tBޟ$[^7辝K wxM 3oަ6" f7xد_ DCkq+@}z(2@Nk#U3qa"ED_)Ppnl(P=PުS3/L>Srxz5S#<5`xeWH/cc$N\![?&a\zCCu9ӪQ,-]/.ݑoyuc_kEt_Z)q\gHyFxyNw 1JcX`@z{u'̰TS#x,rxj6raST|*LrWA~; vn?s~ C|Ui)rܔOƌE+ÍVhr©xx\b7W_M}w:xkf|-m-epl1ۏw"V!=.pxS\G^ZrM-zW0qzW+c gTL"tIwEЅkMߣWT{AgVyuNG*N 0n?{F 0 k#> / [`Tpב;WƂ 9ٓC20 ]?\A`l.V;5g`M/=?>:4}y3^>mL. ]}ҋ7.#&&w5:ɎP,5TTҪsSo2lCaKm;@#-Q"2ojR=ܷ9Zop-9WdK| oEwBhf=Ut C<8=r7ӥ-[>iC A4شX(߱:o>eqɠ˵\*d/AiSǨE,PmsB?%XV! k 3AqRtz˽@`@)T!k^3~+SVϤGdナ657׽o醷gw<(F;﬏O" cՌt)0,#ݽ'E׏]1|:隶˼ݱ{tͱDP#pApϳ-$_o5NjN WH_b#zx"*2LN,H^I+=cTE]*o,U 36e>:P,%0Bky w|7eˋzEȑ!o|DStJ3v{/@խd_8@^,/6 xSK)MIU ˰RFpSR2RA\ yE \ E%Ey A~ɩA%E\\xL*J,HI-+)H,rSs44 ѹxL*J,(I-.)H,3R5RRJs4JxWmS8\?A(8@J9 ]ۙ~QlQc[I v%I ӒK"v}>V2Y 4<`:F D까P,YQOߜ|e hA3R:ӝXH˙0d)V  N=*_i1|5Z@UԴEłPvnsz.L67*UZ#77u0"ʪXhpJUgZxsu~I\UY >~2LwW HM77kZ}//owez>8YӢ!Vq@!"a ǘ[J"^4Fт2HLF|;SR0.Zd"5 23*2Y`8 A4:MG?|@D_|<0|$Ө}5/O+r!"W nT|qgEVgr!"nWfq+q'V(ȍ]OŸ]4OOD,dXb;?ŒG/ zF(vT3uC*fxaFbs`F8'x8#ffc4۷#CJ"byLS8.ټT`BjhpNiM4>8zc1Af5` Zw` ]2'F"<k+OVTd\Ҷ6ܚ;;JWXE#nh$4 ~m ;Nڍv[G7 $nc?ol Dt%IF^ш2ɡC ߤ2 h> qc (/0LGRky90I!#(8\f CkmfH͜TVT!cÙXoܔTh;`d PHR+. -W"a+U i$MKʼnRIaMQMJ)b?0?FuA^6"t4v u,Ң2W6*sȒXMRCn󂥛}Id,/=UX}G&'oZ'%w;᝾\[4Y{, \pmx%F:*@qŴ5,dWйqHJxy[EhBc !g U$љst~V': G[P6٥^pvpPd}XmGing(e^nY!vyмx ;Z1BVojF7fFLUˍGk#W٣e ' F=CЍb9T`LAD xm1 0F#84Ew7uR#mH!񿛢{C$yw*Kq,d=kK--&‘ H/o`uW%_;JkQ!N-5]eaʀsp#ideŒ$P jiz,;[<`GQxWYo8~ >} @6[dhidH츋ΐ:919o'JZxaUqka?V+()!BIDɫẀU,U{9I4p dXVI,,3an ]ӗL-)RY0vK{a8rQJtщLD0W-+,5'a&lu{uQW>> !X%s!!;`oRƷpN%xsPtn&Jqe lt~&Y<]_^j(VCX߶d:F@i26֖rf*pX4)KP]|>2~wwO˿n5j.u: YŎ_ F377gre7fo(E°,RNd+ !ň Gedh.CLdCzݪkcBĸtD OB05z=YC*b%o`2L~U,爗\;-A q7I(ߝM&ߣu b*O&/pD" Scg*h=`ǂ< uĿ[0ښVMG Hx5VEq:ζZ+>)>=i .3rv\LJ{4* 4\9\K*Cks,VyJK eض6X.ZUɕaX>Ƣ3eDݶwc)xeUIC]Z/Aͩ_+_E(4:UQZG$&qGSƿbƒn-yA- fB,LLF a"$ [N!&1W2tDl'.cAϟ,˗)JޞүTmQĦCx#n9_.>NLyh!n-vET9tObb3aT:2&Y# :0p3")9\ܑɵ6=@EH4"vm+dz`ԫZo3||fP'=\ɔŹ(tO<,ƣvԛ@ϻ1|P=w:qBӔNVB\7(sut&$foF=ԫRqڮC=<=;1XbHRfJpXyC<5\j!̫+ӵQ]z4F3͇;UyiWX *Gep ոo=b CUkn Ej'Yg,΀uQ_fC}]ĝc5Ƈud ՝-=@;i.:|ǂ8-L>k㷴qU%c߸d*SQV&"VĢ>Wšpf+[u=a56?f):aB4ՈU,"e* Y4I[AbVTd:(,>%_@R$# z941^3יڮk>}?xUM0!X-8BP&Ƭc!;c;iݴfE3潗](ipoYewwYђypšmQ4kkЏ>^%nRB J,e3[-hÌ21'a;j@Yq WR`Bphrcq&#U>QK|f+RwK/);3+8YZɛVuI%*Z9,xp"MEQWdhna9FdCE`hlO@L^){\"jX [Kʵ#Rβe7g!{֧;7hi8=iys q}R4 aqBipӸ^Wڙ8:''B%q |TV^;+9`ש.Mx8!u<~c#DDߘc i>L$]M.`–'H[򎨊CNO`V#]$bN˃Ir *խ`?#>٨jhaTˋ܃ͳ ܜc:ҒSq3/VdȖ OYtf# YxSMO0 WXiT8BB0Sz4&U4mGCBTՎ{~s GWUm,(C 0=@XԒCdC@(jRx(#P*<ڍcdx-e`*J湩jG)dL "]|i9pk'G=Ϋzh`5:XSA/ g@4ꞁ]Y˂Pq: 逳XȎvŕR(O}6OcJG.v< ᆮ9GI7B=-I} =8_PrLs](Yd`sEW~3HhTWowxԏGM 󶿇Z0Ƈ2 .0ktK/Ʉ:o['[+m4K[O:cp g׫/LL''s|z/xVQ@~V6{ >>"yɴnw&W9Nrək㶖x@fv@GWyVLYU w3g+)ZZ57L% |vu?0$${\o2yEѿ B-k\w-lIbʸ]@,&=\:I,Gz6B+nK؀`"Q6Ctfbu_: W-ҮTey19YԶQQCy,w~jϕzv8wgc"&.x?iC<>bvSZHHɒwI$FƎ*  [V+ET$TTr),zb1ȢD}x;BOz8>R2;K/kn4ݑФ#GD@q#m!/8xx}1k0w`+ӵ4C( xhTb ˒*c^qI޻tp"H>k  Q;,#Ԑi ى&wх.t!$&`H{0ż,@/v6a"OU5#O9(r7q!U~xꣶbAX" 't} paǽZmyk|:)'+hSLnʘ8 J"n/qJ7a}}8Ʌnq? !WM/H"ъa˾BLxTMo@WCDHC$JRc{] Ǝ"q~7ͼuaM]H-oZcr6 CM5LHAuPPw T+S5x!C#ZhQ2ѣN07q7 };:C%+}Ji*r%yhhp>(8*ǚoe s\^/7_u<!ҚErκg"m4evPvYa}mkx AYz\Iu-j14B BP*𧣢w^=LJoki)$Ru5 9ڧכ Y2g 2K)(/mmcd^-n9Qu V&rL&i\ +f6/Yd]gTI@U#-iڠ%Rz|Լtѱ5ÄNF,&[ O_m2/h7$gK>'CI25$BxX]o6} 1@ay膬- ÚlM_[Dd%i;]{IQ-Yvȇx//9#r^+~x4r`] ?/KX0ƀpL$c_G>[ 췷lUIR: L&qW._bvƧW99Fۀ7bq%n\j3Xps-}%3Vaar-IǾ?`2( (9MUM w"><Ɨ!-$R ]XUYau*bXl#8Q`1e{2VЫAۇ2"DC#&k^bo̓ ϶yQpz+p:l\{βK<h8e*կ1EO s~r:18ME;epf >U< AGF\c޸fmvz.7쵆 n6`ِNf Gw[c3|D=tM 3u;l]8;n$Ds-{q3PѮ"W"݄cI7\}!kvxN@ VN }%Hh Ӊ6;N=Fl \*rۿĒ<;#8`ZZƮ  @_h\ J`wiC7}w5by ֦,uJOgE Ǣ:8Ttê7k,+^Po3[Dv؀['GA8Z328i5U/ QSKec52z}&p1<-Q\]{IUUړ%GuZcV -8JH[ 2Pw b^,&լ'76 bOn|oٖŰ]X:OzØo6Xχj>ejCD@Z >}`i0c i!ZZxSN0 )D*m{8pPvN:vut);L5$_4R}}7ow鋧4^fvX!}]a$u,'c2sR FcSS8]fCqG0Lf1ӏg3$‹n .TxWmo6_qpVDT iZ4IѠ$,IN_jV`=wn5Λ,LbkIT.E@ q+4Bc/˒!2:1^<ؘQ\7)!( kz.r HN#ɟR Z,vIGWNYmwgLaOuEwB;=lg dE8s^iN8z9V/ty׳6/BO# 'O*?7oRP+{2iG@z xG1eD{[EΨ$2Nrdh1w|aސ7,eZ+d2{P=*L?Ek_J>/͔i/̸$w/C-4/hIJ9&}T v9SP&'q՝TMOo՟Z4A v6x}-QQƮG!`SvĻzm5vHؐ5HW;$E;-> &o M| Q osla*vx3تŕ,٢k~L/5mu.\m2N>]cث'w& ؘ1Ol, ޑ\Ꜩ1:!7`?7eH4.ɉ?ώ/8"C92f萿xA EbJU36N Pzm|Ihk2dz 2X&# *5$0SЖ1Vfܘj ;,4qXh}t(RS+eٺ=c]5fpxUkk@_qI&ݢ_bAQт/||*%&w7fgME;dRA Kw瞹s̔^J=d+M:͒ҤkA Tnmң&,-W-<%gU\d-Hj%,?A ޞ^sMp1iY)PycN2d\[y06o5QNҭk]5x}(1~g?{9[Ӄ23cϼu$Q+5@iYhu}}HXXp(8f亳,h5ɿgn&b%|JͦYS@ϭf*7̊ʨ1oܕΰz{8&k٠|`KW!̝ul:fln 5VXն|o48jӍ6_oxz?-ʰ:_2*iƕz[q k(roOlD]X+?6mcnȳjg..0.9㐋8bϛGQS]Z[CionkA kB6aiP~j} ے4\bT3&')[{l6ڇ,ɰ)%mn ‡4#P 1HN57ZgY@,u}/=5JzfWlu{F!kkb:;l,P"S5ۡw;EHE@c1Ldlf HޠeN?M6 *&t4*9FSE`H_ܶI(wDئ+y#GKDizn#72Pgchhd}۴~bQWIMe>Jb;_ *~ 9vu%SstMHcf5Ey1 R oAo#442áwq(.=:zh0f`s8xj0 "@ebe}nPۥ#OMz߷: qگC^{)7$G ĩ,[Z} ֝ܖ NN,y%cQs&/#Tn|/*: HSp"]C3κđm,״<Ύ\i@c@Gו)A)钨fױHI2H+zbxMsU/Jutqq@(L6 xi:H7HPl R.25 5\8ΘF |G9^ńe]<٘Y0xaBm^p8Szne[wlNjޝO ,MЮ=%?elRoL0 6ܻ$3w.B˴R/(^pt؟hOK""GcC~[XίĿ z6Ffo2{עi1x̹?yi)Ө&>e\ xVKO1WRBjZNku&coҊޱwC)3;4AFrAkU*m2ӛ,jђ"j.e&d".2x!aˡuC7e!KS#0x=I;9l iW=NIdڃ) S>>x&KAN$L~l3X<&cQlppq CXdM0XL!r118z\e .vSk}G7 5 BQц3,--(z"%|C{=:Jz>hL $mvDܣ\i(-~6bZWˀ-Usc*lWyfl7w5T) &,*D:p~KoYD4P;Px68:59[Ghp[ܶ^Q_Gi2tex:+̂LR̡-РM'c&1U3Bd$.,wP TF-sEg%s& ']Ht_o{Zu xWOH~_1T["ѾڞT*hu'!-aﺻkMB'/ޝo_ɬ /t9NGW5B& OOA⋺e납RaI|%\6R9c?eәܣV6.O~.T[W*t(09Έ*d .OvNwh9ZNp{S d20=Õ7ه=f 0 %}i =e9;U~$5SXTQ' 5֋-D 3 q?:"-.6s  )h$Hd|2 ]>>WV0(2K$~+7 D0\<۔)[;Mӽul`)%u|!#gF^1.m6bN(A\(lsx͝*[ Lh-m1r̤KtkxH`wN_V pK=ӽzx{\pYPQ7k:8ƥdS >jt3Q|<{-\;cy\d6㠹=%vZ/=/nns.SjﵹLNۜhھ-m'+Rǘ^H8Cڤs }9YjDm6L8]l:>ɾkDZ*yB}LhlA.UOkOZǤY-ox8j~Z'n]8Ao[l ٥jb3:}Wg&s pr%[9HC\d^ZR/z-ed&O"؄Qy]R{\Iam&L7\oKOeE\=(9I"AYHS|D4Uw f ָˣiW>iIS6ȭmgITZ3[A1a;4 D$鮧elW}5P(ހ )"EeIԶ%b|feU:~ʷac IGs'&6j%lZB]/\>8Աu?p\a28[fcɸ=9޴UED,-lkPvf뿲劳xN!<Ngzһ1m<6cnbffVrKgojs XFh7ps"#2z$^#)'ՅS.+Z;ԑZ*4ݼpSjnGluWucybecc{jٳm3)̔+( Ms"['?I]k#% _r+2xRN0 )L)J H0sw&%q&Ļtv8ߟY=|m;H,# TQ~te5x4`w!/+.YmC,<A"j|I6 |x!J0U`"간w U#k@\p}(ZY{T'T,MIx E9 G1$f2%{VZs!= ;֜r7"?Uϑsy`&^CYURdWi,caj?j ="?g8!:taR3A[6Ѣ `qk΁8@x-J}e bxݓN@<ń^ Azl=5p ZإP5wwSeVLm#SZX㒲jA0%\ RƲF;c揷Iw:fR[[2,4oe#0$;s=ώE,|e]۰-VNک37 o+vCG<[ Sq:Cic[/+]v>#`xVo0~_qMri&46:*/V;v$[ҭc>_;ˢk1Sh-(N%¢?LWsjz{,J@Ls38oL!*UԿ-H$w#zdEwfv2 .S2PzKh^<<~ZL7^ٺֺOM+|BVg7Zga*$M?=Uw²ǬVo,Cf5mL/)2:s6ބJ*Tl|PZQsݤF"Vx4 fZ变 ʥdiS=הg5FhŢB [G1qmSq"KT̅MyjSl@*={v?I5 n6R;O.ay@[v?@0CI c*G O@De '2OM,ȸ>_I+VHHeM1YN ,HYGl@Yh>_v jrr85..8Q^}g}m{\JC.HqUkuZX<ʱ.PvBiH ]LaHGRRuB~aƉv`9-I &q&NI.\ H@Luh՝HCXJCDVXMXܠYyAW5nD+0GSFN>H~s+U<wXW76xxQ: 19;1=J$9#59۵(1-3'uĉ)\ @WҷsxɸQ$ 19;1=J$$8%$qĉ1 hxxQ2 19;1=J$9?''$յ(qĴD"$"{8x;xqcRqj^De0Sx;xqofqqf^DIzETsx;xQ4 19;1=J$%$'r2~ eJSxz.%x;xQ( 19;1=J$#??x&~ Kx;xQ, 19;1=J$'?1#??x& Vux;xQ: 19;1=J$$,3=/r*)( }:xK(/*H_xSVWpT+MJ-RVWpH(/*JTU0b(x ,V<ԊD̜T6xKRU0> xA 0D9ſEݵ( n*)C:%z~=n )^$xHȤB@p$'6s[v%^%6ѷ HV>rGsR^i[BSxK(/* H,)I-PыU}zxSVWpK)MIUH+JTU0Sv 7xKTU0G xA 0E9\. EJC2$CLIFO#=TufI569 *p!p(+g+S1[ʵqͅ-*KAJ7t>pݛ0|Bt4wm/-l@AfxøQ0 19;1=J$%$q2q 8xxQ0 19;1=J$#5`BPRH/RHI-+)V*ћxK(/*(,NI,IOs5qx`fNG]%$Eh`QffVL{gZZ ) \*bcV`n8$&x`fNG]')Ln00`PE {ҍz >@"k7xKRU0#HxMkA +rPJ,Hl ;Y2{s4bO,j23[nY$W0#AG_e橇HV&uGN4Ֆߝ˵{gkCm6Fci9$eޑ'k{rQj|.YQ土XTWW:a9xkc:(jPZ\ⓟY4Qjs~NNb P)J\p7j'xSK)MIU ˰RFpSR2RA\ y99%% \ @PZRZSjU؈jjS(oxN 07`EEC"=&!9k}o fUKj3$0awPuA8lXznFU6D)R_܇T~`7ЍHNK^]<»MyB)8,Fb$.2 ?N}0Tx+-NuL(I-.q J.(J(/*(r3RsrrRP%@:KJ2JlM.~5>x J.(p(/*) )x*J.(Hɏ//IQUH+K.ЬsNPPBW`TZ\⒓TUm۰x J.(p(/*)25;xMo0 D-%(֢C4LBd%{A>Jء>Cz>GB5gPPWր@m&/1N`Kh\:pקۛpwʕYmH:z0ȶ]w-*:ml>O€[:kd QlSH[ Ϥ53JLN{|p(@X$:\OZׇr15;;섣%{xtZɚVȼ׉|i2ńH*G:N:O|@7Q_¯d $h(]4O4O_nWv)K+USHK[T۠(%mKӠ,S(Lh_ꚷ 6CJDD :% @+J<8Ŋ%qm \>ǭJ4RiE\݄&I %?̬*5L>"g ?wj:մ̲/4 x%M @὿2EZdTJDk3̽Fa7BAݷڣbm{` 48g=OLN` kg尯2 :4Dwy妨4׎A !sYU4O?;q4x]@ aBZi&˲"e:fct!??|F[@۶ZWCZK!7w* L:b*`1Y+R6Pky c9Ia|#di<͂]/Q'LȞZvUy}{Q9gaTd*(-l~k9'x}Ok0C6ie(%韋.C{sOFwo'mHzofr YMSovvl۟{{[DV;—H 7_׏S nfhpO"㢹PBȐ ;Ќq.8B6= ]Y2%A00B5cG7ۂmlQs%G>(H_4g8JJF|',3:q *W'2Y?eZOᎨ\KC$m04izIO*ľ>r+契*𩶡[gP Æ9Wuunk{~Hg xK @s " J\D"N|tx{'xoSdGAIsʦgA#,x i9pi)J)4]ڙ3 fS.{W'gq })r2')˒M FexKSUH+K.TRP0UR04 b JSH-*/RTɓxSVpOK-J,IMQHT(ʯLO3R033дRHW/QHM,)HKJ(/*H"M.s@ xEA 0D=. {Aэ$?3!AzwS, 71JV. pLǦk0΂XRdA%ڕϢZyoSpMf婤.+2iO?3y/_`h::cxE1 0 Ew/d tұȘōĐXK봅})h!u Aum͹0< 8فQ{:gʖԦ:=9(N&-EMFNQjUFbܲY#aIaH` ]<<nNgC+FylYz rC}SNxuα 0=Oq hEptu.19i6"}wZ?~G˽kҀp-w&;O[. ϶ |5i|(U#R}`$&!4ә| G6an*ͅªMMc4Rfi:?pU/UxM-.NLOPQQHO-)OQ4|1ű/x}OK1UpuAATRn &%;I ?'M>|L5Lm?&ƶ-{m1SDJw©$zO3~ ~ U5VӋ=h K+Ԫ ^mLہ,' ^[`24F pa4 :tT 9 c&2ĩQq4w$ZlchV{gW >y9RFzYǝ;7b{)/iw&N`["_lkjLjG^u+#XȌ%eQ꺘K[dICbb_\ xO 0+ 걈(zPx_%YGIofӡRBE ճ|Ip$I>M-0eղXܵ:Q1'Zgq)7pvN،dM {uERA廵urF\N5"xQ. 19;1=J$7(;%t~&+ulb]мtgE#6Vy^ly,iا: $m:u]Hhour̕)bQ5bq>|,XAtxK(/*qI,.N-H%`aM. %x+N-qI,.POQ%E%: EEũy%%yE%ELxPJ@W@YHE+#޷it*~6o:0̼=+ R/\?zq825" 8I-|8w!A"GCs] nLi_C8g_G+x4x@c[4,_{GRRO &T R=uyQszLI0W:m܏$|g/ub+wۓGn{#3kVNLx-/*qI,.N-v+(I-. 6I($dK!\\Mx+N-qI,.POI-,KMQQH+I+UOIŗǧVkrq!hxA 1 E9EvꦨTEPܗb[y/fe,_{Hi, >mϱf/`UIE#ؒ:m XwRκ.^'~6Mb dŚZPZSnB_k l8562Co W']xK(/*qI,.pQpQpQpQpQpQpQˠ ,xeAo0 Vsaw'B,M8V(Qy6Q3c*kq$ou=;Ke/XrЮw},_$?C['q?IS.CQ )8YG jhbb UxK(/*qI,.pQpQpܜT#0a;jrej$hrO[ x+N-qI,.PrT*xyy@NJ: IE -: \\HZssRy%y !L󀂎&tz#<-9#59[C &|xE 0FH&{  VwplN«_J5 2pd"ߟC CH!a&sֈ ϼ܋&יL&=;5}4} ){xL*J,(I-.)H,A ̒ ԂԼbM..h|rFjrJ\sVxIO.M+II,.K-LIN,*LIIJM̫ I-.IKA8xK(/*H+K.ϋ/,Ɉ/+-.M̉KM xK+K.ϋ/,Ɉ/+-.M̉KMUUHjh*Ts)(eh(yd**irN xE 0{}ZDppqt1%Y .v)rtf'5_]ue͒wg`z@uݎ3Į}# OHnCE} 7`ŕnO3)T(R +,̚2Ä>&mZJskL*W ǭ,7όRfI uZ4]E2*ϿܬrۓӠ"+h0A&iY+}3YpNr$JV5AB^!i]A*fRW}9Vp4C:AN=fumKk<(9ثjWY('bvi2I.D@ΔK^Al& Xm,r}&6y(Z)Koȯ)dQ$@})Q5)xVD]?{~57hϾQ[cpiaɴG>>ACGJKLNNQSWYZ[]_`bbdilmoopqssstuuvwz{}MBr)kɂav'(#8q?=Q (srV,*h4 h^d%"QcB$V?gH=Rt\oV =!glƨ$~hPluCC%95=|#(QIf=X[qi'!1м{!Q\{Z1SӎIg&nAWzi( j}>?aٯ>AYuSeB)Xq4"8yS7ZAiTLgֵ!?2"&I "wgя/k}ݾ;CS28KRAdY+'۲D9 :*>V !q eT{ 'rӭ>Lr(\|)I!nYE9;!49kE!Z@}ӡ!@򺭣BNMi!HYZv OwWH"'0f'p#hܸq[N݊#.Ra~cShdB#g3⟑0$ <ԺNRH ˺JL%hŊYi+jf@_%5qu0tx58%ґ6 @44%x L8'}e.Tm'ffH,UyM`C'kI:/&~U'ڍf(+(2rEVJQ,UwCcދA>kN,%,aCo*,,ؓ{+e N-">ܚȢ  GL&WA[-»,AƳN-OU;rVh:qE.99r>G*).??X$lW墀ƈ0j90dJ58Gatm50h6픙yeakA1&{tA㖚 TB2b]e“ siE{3+m.])x3D.kfZUĩ]Xy3Q詭R fq5"E{7cjY56k70RgHgtʳ6ҨkXXw:Q;y/0.7Z"]P[8'M*ҩ7Ʈ XCO!e<~A8q=*/9\P8DemD\6UYY9AK2J3UYm9eŸel"]wd7G;ND\#fjCH 5NaYa?#.bCn@=*:Q=ʋ Cҕ-?E¢DZk"cE|H˾Ekyff GԻfEKA4da\VEԺƲ{NIGqWF~%4΄k(g޴fCGh6({ڊ!pPRG`loƢ88cIlSG6^^QZKid~KILbALfn J_95pqx&AK2⺃xQXݎxNpKMh%Ϙ/yK˘* `K-Xw0VL[fը RMK݂Qل̂V0݁M{`(sk7ND Đ;sW"i!O"O*"q?P1Bql+Pp4ׂ¥UאPڢ)} hAlPϊ69{쟳ThJꡝQ >MSᴚʻ̹+bQg.rzԡ>*JRs ˸*OPf,2SW4m53=X:'TJh9S<^@K3TPPFTZ4 2 )IbUuΟ; +buZ5QmV; dbAX5%2Vz뱪_73pݟ3V"с gGL . ,W4Z֘P9aWLi> gđE2-6IWi̢?f!X P wJ%cu"$~#XOqv8ӽ9і91NX|d!πԖb毰Y("UIkGזiW&h][AW5+߻}< ]iPt:/-]zΦ%M ]MuMO2|G37rx ^'Re5~5,3^o87DI' l׉O^vMPcŏ H_MwhC^}&``wC'h``+ ~9poa`4Pӳw[f{L[?a)戉~>b:OVuF'~|İbv chzŹWOQebuGQΔ$,c|x9C&f|^c$hB#\,yd MktV5IVe@&= `}BzGIseWCNU2[ e:=W$cfYp&qw4Exg&H^x:p\IhhL- |u&^iCOY Ѷjf*aZ:y#kqֹZ~vkZzHw(kTqǎV(l /x> v mbw)c}Wn/WD˄UorMnEv4T>anVr9\ikdp|/L(.!cF7$p.]0g9-WYGJq]fE#Ei\yqʀlT;Cpflra~uCP ~s\ DLBLaBt6qpm:Kz&~6wtG0UR>) tl( 0?̐"FBmu"j l(vOJ~Ls H@7v]L .\/ ^9Ġw*9k2k `?x:8w=u0tyx)QP^d$'+%O^x_Vey:G5ExkJEbM!޸Ax\ E}x=YeFY\)%yπVW-Hm768o`Moyʳ+?_Qm{f"R9E=/OQ.{ܼ"dcoN&B |Z{nL|%R\V-h7%> o||%>v>EȆT&}mC>V ٍiuc~WI>Ejzxd ?i6<\~ {9[]JBVP%-覆QuS#"?-؀&ƺ@261?=" SIJ4J5B7w쁁MX.!%e[$*Q@j~cWrB(dHZ^Sw O*d*gPp9PY>bFtŔ7іv5F4oi1N|veZ-!WSL5f{K /Lc4*$7=ϱ9Gv[xK Q'Qoo5BׅtcNíPeex΅͙t"3a[AÙYrQ% !&ΰ.$#G^CeW ؇WJNO?ә"؉FuC:t۬Mgi@fI8Kx|J\jgݮwDL0nK2dl`4S{x; Yy箘k(p죴v. #q6."+8 < cc-+XjJۓ^tܐAQ?_5QD ǝ!X@v⑿W&֩HJk|yõIs:`B K0ˑG{zBWr+: yKˠbùZLveU=0F}- uc@RieFF+V4RΝ![+>ٵL+/u ؛l>?my햊\C^mw- so/W5Uߐ,;O;2lN5sa,$FmT}Benw5.B=Ľ$2ܓE<%?25׸.)eK~pM!k?@N ){.8NF/~0Zêڪ~1REؑg*7f8A3CZby|mk8{GqK`wpm@,,=¬|;a[觓.7rTMc{eUأtڭk[L[&BmO{މ`dI-}:CjŷRz\(6otk mk^ y*od.krQ@ǭ"yF8<%@6j;&vm,I ֝~|uwذ{ M!Z?>`ſYb0"P'ZX- ~\r'\W" s+(* 'W=G 8g1j? ֵvbrZv3ƶ t{CtAʱaSF絟!;7ɑY_Ogĩ0߉KV>Bۖ$3{!d1)۹2c Dź3$Ɏ3S~}%?C+u0|DƢ2vw_&"OQ]=/k dcRlk~;'rK(3h#e[yőۼA=:Co=/ĵ QU.ݫn!M7Ҡ's+01^O;¿!s| fȬ[RvJ#Yqq`Pǹ~UutU!5JځpKҐp)h;==,LYeLj5Mg-#(O[;PzL(n ݫ/klǷ<2ȀYfDL3ˮŮa>ҫ8?& 'Ǫם BĢ1eHHKnɹ=pC#,{/欢ʙ̑r+^ʱWݿskHU_%"11N2iϟ̙u@ԧ2[MN{̀:bjRMzfgS2],KΎ$N-O_.I]fߩ[ 1F,k|VLy$o) GH~(I+CK*֬v [ӰZS)F%x] Ɉ:leCW aR~Eu 1~]nPO5ԉƒD4^K%Fbwc'`Q*ˮe^hx0^xp+e!< C!MHW7zo1Qas[mRn?]yuwP4x@F/̼q;ڧC;G/7:ʨg%h{ ){J}x E/Fe^==ew;X9(oP /qg¹N<*H/Xr/ @xiC&HB1ƛQaɷhq6A._l-1lr('KYCǕNKD#[V̲ǐ:]db8T1Ks1Kr}\±'郠gݖ 6WC&VkH>7a_ny+)X/a⛲CK)wZSϖeVBPSpѵ<\+9ާh~.W8NZo P ]>REF|<ƘxjhsFUƊ0֡FN$Xs ^ъb Sq0m>2G#ߒ^i(R4>Ӄ,Lv- *gY{( Zg5M*#AC)bΗaBsaXds`$|jsoP yh-ibJH'wW~|'B|6sրj#Dt=*ɸAaY3 ]N_Zk&H+yܗ|0?i 3a`sC,H%}j |N6)9ov>Hj Gԕlf$Mh@[2y?0QYxT8_КFH 6$kbpu;3Bտ?AVBn)EC"޽\CA/K:PHBwPa$ 'z"Nof} 2srҖS佞,5[4A2Tдrimf volhVTFMS \p. >hX1g 㪕/t;} F6%L6kjEr0lqk;L'') ?7>=#%Ar.I/Rro?~HM!@حNcЦ\4_ٻ jRY&R@qx1gP_RTax:Od,ߣɼHLMN55-sR!>/C&[I$wX&qxGJezڃd&-Ti iFG /|U Q6(<%lz[qEeHxS?#@ufǎD'1t j8{<ΩWRw,߫۹;H~#+p1R ݿ3D!]p[܌UK&#o)luq=l&w?mIQ"6K&w^zt0߾i`œzoW=<8%Ղ+~g${=.߮M=sV5W"Ԡ@<L$91tz|jE#Յ|6#C"ƻ",=+.T CaWP[Nq3{n|J.Y>$RU Y P\+E8xb@:te&ۡkwEǧ'X=6Rd"-|!VqHV[`Ds`y;qO㥠^#z }>Q<R#XOB5l/е*ً #1lY43,a`c) )?S𳨁]\g/w9?h@)NᄃC,݉ WO6nSMf!AbiV3\;prmq.]sx׆ qUg[զDMCH)OE;b-4;%VV_}-꬞ 5S)cN*Rx8 kM>p1O!q+֢=]"g9ns6@4'l |?`l5˯]}F}y:b$דH *˞+ѹ[PGξ!Hӄ56N`!e^tТ%h>* B)WvV!x1[J(Z)%id¼J_X̵݄y1[U{)TtFW ܡ_hw[Z^9,W=',r줍;_w1ۭa6HIi:,<=@{ԧʯ FSoN{okaAcwda>5]/`Z!{I:Grwa$c{8odT n (%CEtknv)cE43:HD!e (_(oNUuQ蝬Tn6b aT^%2Aߒw3Ç,J ePa,&3{UZ_U$R`[ 6>Kg2Ydkh9PO'Gj׾DPYC~%2f8@73s#,:5I'OAx.}cM* C,#ZVڇ~ ~CLI8c/k7 O(ז/4v,b kA+Mt.I<$7)@e fmiw5&MIKSf)=^4:.)aA!*66{{F69A'.8N%W61$;s%$zs[4~>\4g-vl: ]ؘk;3gkncF\^/XssSv*kOR(SJa!lq)_'Hؙ;b$~ !0pckgAFUFg%1Q4mE]-(Rx;{m|Y0 =,A[Q}_n0#Lqa 1%m1p-<JRXa0`<.3PG%n@cqnf,UKH+T*iinI56S@?[~]Q]%FB#JH_D*N gz=S[ʠ"0 Maintainer: Hadley Version: 0.1 Suggests: testthat RoxygenNote: 5.0.1 devtools/tests/testthat/testTestWithFailure/tests/0000755000175000017500000000000013577154220022400 5ustar nileshnileshdevtools/tests/testthat/testTestWithFailure/tests/testthat/0000755000175000017500000000000014151364022024230 5ustar nileshnileshdevtools/tests/testthat/testTestWithFailure/tests/testthat/test-fail.R0000644000175000017500000000006013736643460026255 0ustar nileshnileshtest_that("failing test", { fail("Broken") }) devtools/tests/testthat/testTestWithFailure/tests/testthat/test-warn.R0000644000175000017500000000007113736643460026313 0ustar nileshnileshtest_that("warning from test", { warning("Beware!") }) devtools/tests/testthat/testTestWithFailure/tests/testthat.R0000644000175000017500000000007413577154220024364 0ustar nileshnileshlibrary(testthat) library(testTest) test_check("testTest") devtools/tests/testthat/testTestWithFailure/R/0000755000175000017500000000000013577154220021437 5ustar nileshnileshdevtools/tests/testthat/testTestWithFailure/R/dummy.R0000644000175000017500000000000113577154220022704 0ustar nileshnilesh devtools/tests/testthat/testTestWithFailure/NAMESPACE0000644000175000017500000000005613577154220022456 0ustar nileshnilesh# Generated by roxygen2: do not edit by hand devtools/tests/testthat/testMarkdownVignettes/0000755000175000017500000000000014151174562021626 5ustar nileshnileshdevtools/tests/testthat/testMarkdownVignettes/DESCRIPTION0000644000175000017500000000036613705630221023332 0ustar nileshnileshPackage: testMarkdownVignettes Title: Tools to make developing R code easier License: GPL-2 Description: Author: Hadley Maintainer: Hadley Version: 0.1 VignetteBuilder: knitr Suggests: knitr, rmarkdown devtools/tests/testthat/testMarkdownVignettes/vignettes/0000755000175000017500000000000014107010106023616 5ustar nileshnileshdevtools/tests/testthat/testMarkdownVignettes/vignettes/test.Rmd0000644000175000017500000000024413705630156025261 0ustar nileshnilesh This is a test. ```{r} 1 + 2 ``` devtools/tests/testthat/test-build-readme.R0000644000175000017500000000221314031104013020660 0ustar nileshnileshtest_that("Package readme in root directory can be built ", { skip_on_cran() pkg_path <- create_local_package() # errors if no readme found expect_error( build_readme(pkg_path), "Can't find a 'README.Rmd'" ) suppressMessages(use_readme_rmd()) suppressMessages(build_readme(pkg_path)) expect_true(file_exists(path(pkg_path, "README.md"))) expect_false(file_exists(path(pkg_path, "README.html"))) }) test_that("Package readme in inst/ can be built ", { skip_on_cran() pkg_path <- create_local_package() suppressMessages(use_readme_rmd()) dir_create(pkg_path, "inst") file_copy( path(pkg_path, "README.Rmd"), path(pkg_path, "inst", "README.Rmd") ) # errors if both a root readme and inst readme found expect_error( build_readme(pkg_path), "Can't have both" ) file_delete(path(pkg_path, "README.Rmd")) suppressMessages(build_readme(pkg_path)) expect_true(file_exists(path(pkg_path, "inst", "README.md"))) expect_false(file_exists(path(pkg_path, "README.Rmd"))) expect_false(file_exists(path(pkg_path, "README.md"))) expect_false(file_exists(path(pkg_path, "inst", "README.html"))) }) devtools/tests/testthat/testHelp/0000755000175000017500000000000013401234762017037 5ustar nileshnileshdevtools/tests/testthat/testHelp/DESCRIPTION0000644000175000017500000000035213401234762020545 0ustar nileshnileshPackage: testHelp Title: Tools to make developing R code easier License: GPL-2 Description: Test package for devtools help. Author: Hadley Maintainer: Hadley Version: 0.1 RoxygenNote: 6.0.1 devtools/tests/testthat/testHelp/man/0000755000175000017500000000000013401234762017612 5ustar nileshnileshdevtools/tests/testthat/testHelp/man/foofoo.Rd0000644000175000017500000000050313401234762021366 0ustar nileshnilesh% Generated by roxygen2: do not edit by hand % Please edit documentation in R/foofoo.r \name{foofoo} \alias{foofoo} \title{Test function for help} \usage{ foofoo() } \description{ The purpose of this function is to test out \code{help} and \code{?} from devtools. } \examples{ stopifnot(foofoo() == 'You called foofoo.') } devtools/tests/testthat/testHelp/R/0000755000175000017500000000000013401234762017240 5ustar nileshnileshdevtools/tests/testthat/testHelp/R/foofoo.R0000644000175000017500000000035313401234762020653 0ustar nileshnilesh#' Test function for help #' #' The purpose of this function is to test out \code{help} and \code{?} from #' devtools. #' #' @examples #' stopifnot(foofoo() == 'You called foofoo.') #' @export foofoo <- function() "You called foofoo." devtools/tests/testthat/testHelp/NAMESPACE0000644000175000017500000000007513401234762020260 0ustar nileshnilesh# Generated by roxygen2: do not edit by hand export(foofoo) devtools/tests/testthat/archive.rds0000644000175000017500000000714413401234762017410 0ustar nileshnilesh | wG$B<ãӊxWb%+\^%ASϟF|g&ݝLv6MoΜ9yey< եŕ8lo$tͻk5|"cooLEwvIʛiA3w!Ӵty:'k CSB?̕N\d3-* cVT7=8p!(\ɽN_i{ Q5lrmiz&Sn[RҔ94w"SlZTdeLl T9* H*2:!RPX3UaZ 3R否:g4Y-sGw\Bм'KEZ&ŘJL,,d(\f2-"D6Qll$ll"8ذ{TX$(g>#||?B;aa=k{h09 %*v4q+vT:x :PTgeZ'h9R(1MH 7ucK1ONƄḅ8rC^tK6y&}v+=Rz (NP`Ԋ~8p|Rp{D<efCS7ҟg> R-Em1FlXv&-ΩvA_gk62;v6uJMk(UZONxT 薛VRVk}"+1'+ +m[9qəSe/dJ*U+bdk}f\J,SGr*HN%*ƙֶb3y z9f43L7`9X8]#KA&k^iz Î{WZ`IddX Z&'Z5Z2a|kdl,JGk T&"ca'J\r>-d|80Í3hݽw}ncӉ lf~t sK;̟d'`ޅVV#Sc-hplFŸ]Ak6+;K6;. -a4}kK=r[IlŜm#7A~ntF8]S%G2E-sn$smz3 , I#dz+5BevQWg;1/Uc^y& Da>*9wzmLZAsr'Wy0%&fZ<̑%ð?#x8_On8_޵zex<6XMȗFauՒB~؟σ11xOD |cVw)x<'_8P  D.sp;Ck'(CpdQ8?񽢀I! ;wp"`b!`RiGE%1}N O]іS׍Nܰ8wQ<^bYۡP= |R2 J {+V'9-4uAY]Y`҉u~} s*tREQb!MЧp}ӧtzW^_Bϟ^ʘgzH " dlvA,A E͢ga?c݇]RMk=تՄiff`I1V0HJZꁭ%l%-a+i [IKJZRNHJXۏ(= 7ZF30ˇb_>@;7 Lx0 i4aw1q393 y7<͑X<; if =rHxzf*3ef$`2qI3j:ZuP7.)L| 0䵫@q)0oA@t 0.dpĨkzϨu,v;\X@{G#Z `F>=PMQdO I/0۶/mEV<1ڶ2M+6 I=X$ =,~у IuI&djQ0b=u}evX'OH #C,!|UQdevtools/tests/testthat/testVignetteExtras/0000755000175000017500000000000014151174562021127 5ustar nileshnileshdevtools/tests/testthat/testVignetteExtras/DESCRIPTION0000644000175000017500000000027413401234762022634 0ustar nileshnileshPackage: testVignettes Title: Tools to make developing R code easier License: GPL-2 Description: Author: Hadley Maintainer: Hadley Version: 0.1 devtools/tests/testthat/testVignetteExtras/vignettes/0000755000175000017500000000000014107010113023115 5ustar nileshnileshdevtools/tests/testthat/testVignetteExtras/vignettes/new.Rnw0000644000175000017500000000010613401234762024411 0ustar nileshnilesh\documentclass[oneside]{article} \begin{document} Test \end{document}devtools/tests/testthat/testVignetteExtras/vignettes/a.R0000644000175000017500000000000713401234762023473 0ustar nileshnilesha <- 1 devtools/tests/testthat/testVignetteExtras/NAMESPACE0000644000175000017500000000000013401234762022330 0ustar nileshnileshdevtools/tests/testthat/test-utils.R0000644000175000017500000000034413736643460017522 0ustar nileshnileshtest_that("case-insensitive sort order", { expect_equal(sort_ci(rev(letters)), letters) expect_equal(sort_ci(rev(LETTERS)), LETTERS) expect_equal(sort_ci(c(letters[1:3], LETTERS[1:3])), c("A", "a", "B", "b", "C", "c")) }) devtools/tests/testthat/test-test.R0000644000175000017500000000242714031104013017314 0ustar nileshnileshtest_test <- function(...) { suppressMessages(test(..., reporter = "silent")) } test_test_active_file <- function(...) { suppressMessages(test_active_file(..., reporter = "silent")) } test_that("Package can be tested with testthat not on search path", { pkg1 <- test_path("testTest") pkg2 <- test_path("testTestWithDepends") testthat_pos <- which(search() == "package:testthat") if (length(testthat_pos) > 0) { testthat_env <- detach(pos = testthat_pos) on.exit(attach(testthat_env, testthat_pos), add = TRUE) } test_test(pkg1) expect_true(TRUE) test_test(pkg2) expect_true(TRUE) }) test_that("Filtering works with devtools::test", { out <- test_test(test_path("testTest"), filter = "dummy") expect_equal(length(out), 1) }) test_that("devtools::test_active_file works", { out <- test_test_active_file(test_path("testTest/tests/testthat/test-dummy.R")) expect_equal(length(out), 1) }) test_that("TESTTHAT_PKG environment varaible is set", { test_test(test_path("testTest"), filter = "envvar") expect_true(TRUE) }) test_that("stop_on_failure defaults to FALSE", { expect_error( test_test(test_path("testTestWithFailure")), NA ) expect_error( test_test(test_path("testTestWithFailure"), stop_on_failure = TRUE), "Test failures" ) }) devtools/tests/testthat.R0000644000175000017500000000007413534201140015362 0ustar nileshnileshlibrary(testthat) library(devtools) test_check("devtools") devtools/tests/spelling.R0000644000175000017500000000024113542445754015357 0ustar nileshnileshif(requireNamespace('spelling', quietly = TRUE)) spelling::spell_check_test(vignettes = TRUE, error = FALSE, skip_on_cran = TRUE) devtools/R/0000755000175000017500000000000014151154613012445 5ustar nileshnileshdevtools/R/release.R0000644000175000017500000002522614144743346014230 0ustar nileshnilesh#' Release package to CRAN. #' #' Run automated and manual tests, then post package to CRAN. #' #' The package release process will: #' #' \itemize{ #' \item Confirm that the package passes `R CMD check` on relevant platforms #' \item Confirm that important files are up-to-date #' \item Build the package #' \item Submit the package to CRAN, using comments in "cran-comments.md" #' } #' #' You can add arbitrary extra questions by defining an (un-exported) function #' called `release_questions()` that returns a character vector #' of additional questions to ask. #' #' You also need to read the CRAN repository policy at #' 'https://cran.r-project.org/web/packages/policies.html' and make #' sure you're in line with the policies. `release` tries to automate as #' many of polices as possible, but it's impossible to be completely #' comprehensive, and they do change in between releases of devtools. #' #' @template devtools #' @param check if `TRUE`, run checking, otherwise omit it. This #' is useful if you've just checked your package and you're ready to #' release it. #' @param args An optional character vector of additional command #' line arguments to be passed to `R CMD build`. #' @seealso [usethis::use_release_issue()] to create a checklist of release #' tasks that you can use in addition to or in place of `release`. #' @export release <- function(pkg = ".", check = FALSE, args = NULL) { pkg <- as.package(pkg) # Figure out if this is a new package cran_version <- cran_pkg_version(pkg$package) new_pkg <- is.null(cran_version) if (yesno("Have you checked for spelling errors (with `spell_check()`)?")) { return(invisible()) } if (check) { cat_rule( left = "Building and checking", right = pkg$package, line = 2 ) check(pkg, cran = TRUE, remote = TRUE, manual = TRUE, build_args = args, run_dont_test = TRUE ) } if (yesno("Have you run `R CMD check` locally?")) { return(invisible()) } release_checks(pkg) if (yesno("Were devtool's checks successful?")) { return(invisible()) } if (!new_pkg) { show_cran_check <- TRUE cran_details <- NULL end_sentence <- " ?" if (requireNamespace("foghorn", quietly = TRUE)) { show_cran_check <- has_cran_results(pkg$package) cran_details <- foghorn::cran_details(pkg = pkg$package) } if (show_cran_check) { if (!is.null(cran_details)) { end_sentence <- "\n shown above?" cat_rule(paste0("Details of the CRAN check results for ", pkg$package)) summary(cran_details) cat_rule() } cran_url <- paste0( cran_mirror(), "/web/checks/check_results_", pkg$package, ".html" ) if (yesno( "Have you fixed all existing problems at \n", cran_url, end_sentence )) { return(invisible()) } } } if (yesno("Have you checked on R-hub (with `check_rhub()`)?")) { return(invisible()) } if (yesno("Have you checked on win-builder (with `check_win_devel()`)?")) { return(invisible()) } deps <- if (new_pkg) 0 else length(revdep(pkg$package)) if (deps > 0) { msg <- paste0( "Have you checked the ", deps, " reverse dependencies ", "(with the revdepcheck package)?" ) if (yesno(msg)) { return(invisible()) } } questions <- c( "Have you updated `NEWS.md` file?", "Have you updated `DESCRIPTION`?", "Have you updated `cran-comments.md?`", if (dir_exists("docs/")) "Have you updated website in `docs/`?", if (file_exists("codemeta.json")) "Have you updated codemeta.json with codemetar::write_codemeta()?", find_release_questions(pkg) ) for (question in questions) { if (yesno(question)) return(invisible()) } if (uses_git(pkg$path)) { git_checks(pkg) if (yesno("Were Git checks successful?")) { return(invisible()) } } submit_cran(pkg, args = args) invisible(TRUE) } has_cran_results <- function(pkg) { cran_res <- foghorn::cran_results( pkg = pkg, show = c("error", "fail", "warn", "note") ) sum(cran_res[, -1]) > 0 } find_release_questions <- function(pkg = ".") { pkg <- as.package(pkg) q_fun <- pkgload::ns_env(pkg$package)$release_questions if (is.null(q_fun)) { character() } else { q_fun() } } yesno <- function(...) { yeses <- c("Yes", "Definitely", "For sure", "Yup", "Yeah", "Of course", "Absolutely") nos <- c("No way", "Not yet", "I forget", "No", "Nope", "Uhhhh... Maybe?") cat(paste0(..., collapse = "")) qs <- c(sample(yeses, 1), sample(nos, 2)) rand <- sample(length(qs)) utils::menu(qs[rand]) != which(rand == 1) } # https://tools.ietf.org/html/rfc2368 email <- function(address, subject, body) { url <- paste( "mailto:", utils::URLencode(address), "?subject=", utils::URLencode(subject), "&body=", utils::URLencode(body), sep = "" ) tryCatch({ utils::browseURL(url, browser = email_browser()) }, error = function(e) { cli::cli_alert_danger("Sending failed with error: {e$message}") cat("To: ", address, "\n", sep = "") cat("Subject: ", subject, "\n", sep = "") cat("\n") cat(body, "\n", sep = "") } ) invisible(TRUE) } email_browser <- function() { if (!identical(.Platform$GUI, "RStudio")) { return(getOption("browser")) } # Use default browser, even if RStudio running if (.Platform$OS.type == "windows") { return(NULL) } browser <- Sys.which(c("xdg-open", "open")) browser[nchar(browser) > 0][[1]] } maintainer <- function(pkg = ".") { pkg <- as.package(pkg) authors <- pkg$`authors@r` if (!is.null(authors)) { people <- eval(parse(text = authors)) if (is.character(people)) { maintainer <- utils::as.person(people) } else { maintainer <- Find(function(x) "cre" %in% x$role, people) } } else { maintainer <- pkg$maintainer if (is.null(maintainer)) { stop("No maintainer defined in package.", call. = FALSE) } maintainer <- utils::as.person(maintainer) } list( name = paste(maintainer$given, maintainer$family), email = maintainer$email ) } cran_comments <- function(pkg = ".") { pkg <- as.package(pkg) path <- path(pkg$path, "cran-comments.md") if (!file_exists(path)) { warning("Can't find cran-comments.md.\n", "This file gives CRAN volunteers comments about the submission,\n", "Create it with use_cran_comments().\n", call. = FALSE ) return(character()) } paste0(readLines(path, warn = FALSE), collapse = "\n") } cran_submission_url <- "https://xmpalantir.wu.ac.at/cransubmit/index2.php" #' Submit a package to CRAN. #' #' This uses the new CRAN web-form submission process. After submission, you #' will receive an email asking you to confirm submission - this is used #' to check that the package is submitted by the maintainer. #' #' It's recommended that you use [release()] rather than this #' function as it performs more checks prior to submission. #' #' @template devtools #' @inheritParams release #' @export #' @keywords internal submit_cran <- function(pkg = ".", args = NULL) { if (yesno("Is your email address ", maintainer(pkg)$email, "?")) { return(invisible()) } pkg <- as.package(pkg) built_path <- build_cran(pkg, args = args) if (yesno("Ready to submit ", pkg$package, " (", pkg$version, ") to CRAN?")) { return(invisible()) } upload_cran(pkg, built_path) usethis::with_project(pkg$path, flag_release(pkg) ) } build_cran <- function(pkg, args) { cli::cli_alert_info("Building") built_path <- pkgbuild::build(pkg$path, tempdir(), manual = TRUE, args = args) cli::cli_alert_info("Submitting file: {built_path}") size <- format(as.object_size(file_info(built_path)$size), units = "auto") cli::cli_alert_info("File size: {size}") built_path } extract_cran_msg <- function(msg) { # Remove "CRAN package Submission" and "Submit package to CRAN" msg <- gsub("CRAN package Submission|Submit package to CRAN", "", msg) # remove all html tags msg <- gsub("<[^>]+>", "", msg) # remove tabs msg <- gsub("\t+", "", msg) # Remove extra newlines msg <- gsub("\n+", "\n", msg) msg } upload_cran <- function(pkg, built_path) { pkg <- as.package(pkg) maint <- maintainer(pkg) comments <- cran_comments(pkg) # Initial upload --------- cli::cli_alert_info("Uploading package & comments") body <- list( pkg_id = "", name = maint$name, email = maint$email, uploaded_file = httr::upload_file(built_path, "application/x-gzip"), comment = comments, upload = "Upload package" ) r <- httr::POST(cran_submission_url, body = body) # If a 404 likely CRAN is closed for maintenance, try to get the message if (httr::status_code(r) == 404) { msg <- "" try({ r2 <- httr::GET(sub("index2", "index", cran_submission_url)) msg <- extract_cran_msg(httr::content(r2, "text")) }) stop("Submission failed:", msg, call. = FALSE) } httr::stop_for_status(r) new_url <- httr::parse_url(r$url) # Confirmation ----------- cli::cli_alert_info("Confirming submission") body <- list( pkg_id = new_url$query$pkg_id, name = maint$name, email = maint$email, policy_check = "1/", submit = "Submit package" ) r <- httr::POST(cran_submission_url, body = body) httr::stop_for_status(r) new_url <- httr::parse_url(r$url) if (new_url$query$submit == "1") { cli::cli_alert_success("Package submission successful") cli::cli_alert_info("Check your email for confirmation link.") } else { stop("Package failed to upload.", call. = FALSE) } invisible(TRUE) } as.object_size <- function(x) structure(x, class = "object_size") flag_release <- function(pkg = ".") { pkg <- as.package(pkg) if (!uses_git(pkg$path)) { return(invisible()) } cli::cli_alert_warning("Don't forget to tag this release once accepted by CRAN") withr::with_dir(pkg$path, { sha <- system2("git", c("rev-parse", "HEAD"), stdout = TRUE) }) dat <- list( Version = pkg$version, Date = format(Sys.time(), tz = "UTC", usetz = TRUE), SHA = sha ) write.dcf(dat, file = path(pkg$path, "CRAN-SUBMISSION")) usethis::use_build_ignore("CRAN-SUBMISSION") } cran_mirror <- function(repos = getOption("repos")) { repos[repos == "@CRAN@"] <- "https://cloud.r-project.org" if (is.null(names(repos))) { names(repos) <- "CRAN" } repos[["CRAN"]] } # Return the version of a package on CRAN (or other repository) # @param package The name of the package. # @param available A matrix of information about packages. cran_pkg_version <- function(package, available = available.packages()) { idx <- available[, "Package"] == package if (any(idx)) { as.package_version(available[package, "Version"]) } else { NULL } } devtools/R/usethis.R0000644000175000017500000000115214031104013014235 0ustar nileshnilesh# Some helpers around usethis functions # we need to import some usethis function so the namespace is loaded when # devtools is loaded, but not attached. #' @importFrom usethis use_test NULL usethis_use_testthat <- function(pkg) { usethis::local_project(pkg$path, quiet = TRUE) usethis::use_testthat() } usethis_use_directory <- function(pkg, path, ignore = FALSE) { usethis::local_project(pkg$path, quiet = TRUE) usethis::use_directory(path, ignore) } usethis_use_git_ignore <- function(pkg, ignores, ignore = FALSE) { usethis::local_project(pkg$path, quiet = TRUE) usethis::use_git_ignore(ignores) } devtools/R/check-mac.R0000644000175000017500000000421514151154613014405 0ustar nileshnilesh#' Check macOS package #' #' This function works by bundling source package, and then uploading to #' . This function returns a #' link to the page with the check results. #' #' @template devtools #' @inheritParams pkgbuild::build #' @param dep_pkgs Additional custom dependencies to install prior to checking the package. #' @param quiet If `TRUE`, suppresses output. #' @param ... Additional arguments passed to [pkgbuild::build()]. #' @family build functions #' @return The url with the check results (invisibly) #' @export check_mac_release <- function(pkg = ".", dep_pkgs = ".", args = NULL, manual = TRUE, quiet = FALSE, ...) { check_dots_used(action = getOption("devtools.ellipsis_action", rlang::warn)) pkg <- as.package(pkg) if (!quiet) { cli::cli_alert_info( "Building macOS version of {.pkg {pkg$package}} ({pkg$version})", "with https://mac.r-project.org/macbuilder/submit.html." ) } built_path <- pkgbuild::build(pkg$path, tempdir(), args = args, manual = manual, quiet = quiet, ... ) dep_built_paths <- character() for (i in seq_along(dep_pkgs)) { dep_pkg <- as.package(dep_pkgs[[i]])$path dep_built_paths[[i]] <- pkgbuild::build(dep_pkg, tempdir(), args = args, manual = manual, quiet = quiet, ... ) } on.exit(file_delete(c(built_path, dep_built_paths)), add = TRUE) url <- "https://mac.r-project.org/macbuilder/v1/submit" body <- list(pkgfile = httr::upload_file(built_path)) if (length(dep_built_paths) > 0) { uploads <- lapply(dep_built_paths, httr::upload_file) names(uploads) <- rep("depfiles", length(uploads)) body <- append(body, uploads) } res <- httr::POST(url, body = body, headers = list( "Content-Type" = "multipart/form-data" ), encode = "multipart" ) httr::stop_for_status(res, task = "Uploading package") response_url <- httr::content(res)$url if (!quiet) { time <- strftime(Sys.time() + 10 * 60, "%I:%M %p") cli::cli_alert_success( "[{Sys.Date()}] Check {.url {response_url}} for the results in 5-10 mins (~{time})." ) } invisible(response_url) } devtools/R/lint.R0000644000175000017500000000173114031104013013522 0ustar nileshnilesh#' Lint all source files in a package. #' #' The default linters correspond to the style guide at #' , however it is possible to #' override any or all of them using the `linters` parameter. #' @template devtools #' @param cache store the lint results so repeated lints of the same content #' use the previous results. #' @param ... additional arguments passed to [lintr::lint_package()] #' @seealso [lintr::lint_package()], [lintr::lint()] #' @details #' The lintr cache is by default stored in `~/.R/lintr_cache/` (this can #' be configured by setting `options(lintr.cache_directory)`). It can be #' cleared by calling [lintr::clear_cache()]. #' @export lint <- function(pkg = ".", cache = TRUE, ...) { rlang::check_installed("lintr") pkg <- as.package(pkg) cli::cli_alert_info("Linting {.pkg {pkg$package}}") check_dots_used(action = getOption("devtools.ellipsis_action", rlang::warn)) lintr::lint_package(pkg$path, cache = cache, ...) } devtools/R/run-source.R0000644000175000017500000001255514031104013014664 0ustar nileshnilesh#' Run a script through some protocols such as http, https, ftp, etc. #' #' If a SHA-1 hash is specified with the `sha1` argument, then this #' function will check the SHA-1 hash of the downloaded file to make sure it #' matches the expected value, and throw an error if it does not match. If the #' SHA-1 hash is not specified, it will print a message displaying the hash of #' the downloaded file. The purpose of this is to improve security when running #' remotely-hosted code; if you have a hash of the file, you can be sure that #' it has not changed. For convenience, it is possible to use a truncated SHA1 #' hash, down to 6 characters, but keep in mind that a truncated hash won't be #' as secure as the full hash. #' #' @param url url #' @param ... other options passed to [source()] #' @param sha1 The (prefix of the) SHA-1 hash of the file at the remote URL. #' @export #' @seealso [source_gist()] #' @examples #' \dontrun{ #' #' source_url("https://gist.github.com/hadley/6872663/raw/hi.r") #' #' # With a hash, to make sure the remote file hasn't changed #' source_url("https://gist.github.com/hadley/6872663/raw/hi.r", #' sha1 = "54f1db27e60bb7e0486d785604909b49e8fef9f9") #' #' # With a truncated hash #' source_url("https://gist.github.com/hadley/6872663/raw/hi.r", #' sha1 = "54f1db27e60") #' } source_url <- function(url, ..., sha1 = NULL) { stopifnot(is.character(url), length(url) == 1) rlang::check_installed("digest") temp_file <- file_temp() on.exit(file_delete(temp_file)) request <- httr::GET(url) httr::stop_for_status(request) writeBin(httr::content(request, type = "raw"), temp_file) file_sha1 <- digest::digest(file = temp_file, algo = "sha1") if (is.null(sha1)) { cli::cli_alert_info("SHA-1 hash of file is {file_sha1}") } else { if (nchar(sha1) < 6) { stop("Supplied SHA-1 hash is too short (must be at least 6 characters)") } # Truncate file_sha1 to length of sha1 file_sha1 <- substr(file_sha1, 1, nchar(sha1)) if (!identical(file_sha1, sha1)) { stop("SHA-1 hash of downloaded file (", file_sha1, ")\n does not match expected value (", sha1, ")", call. = FALSE ) } } check_dots_used(action = getOption("devtools.ellipsis_action", rlang::warn)) source(temp_file, ...) } #' Run a script on gist #' #' \dQuote{Gist is a simple way to share snippets and pastes with others. #' All gists are git repositories, so they are automatically versioned, #' forkable and usable as a git repository.} #' #' #' @param id either full url (character), gist ID (numeric or character of #' numeric). #' @param ... other options passed to [source()] #' @param filename if there is more than one R file in the gist, which one to #' source (filename ending in '.R')? Default `NULL` will source the #' first file. #' @param sha1 The SHA-1 hash of the file at the remote URL. This is highly #' recommend as it prevents you from accidentally running code that's not #' what you expect. See [source_url()] for more information on #' using a SHA-1 hash. #' @param quiet if `FALSE`, the default, prints informative messages. #' @export #' @seealso [source_url()] #' @examples #' \dontrun{ #' # You can run gists given their id #' source_gist(6872663) #' source_gist("6872663") #' #' # Or their html url #' source_gist("https://gist.github.com/hadley/6872663") #' source_gist("gist.github.com/hadley/6872663") #' #' # It's highly recommend that you run source_gist with the optional #' # sha1 argument - this will throw an error if the file has changed since #' # you first ran it #' source_gist(6872663, sha1 = "54f1db27e60") #' # Wrong hash will result in error #' source_gist(6872663, sha1 = "54f1db27e61") #' #' #' # You can speficy a particular R file in the gist #' source_gist(6872663, filename = "hi.r") #' source_gist(6872663, filename = "hi.r", sha1 = "54f1db27e60") #' } source_gist <- function(id, ..., filename = NULL, sha1 = NULL, quiet = FALSE) { rlang::check_installed("gh") stopifnot(length(id) == 1) url_match <- "((^https://)|^)gist.github.com/([^/]+/)?([0-9a-f]+)$" if (grepl(url_match, id)) { # https://gist.github.com/kohske/1654919, https://gist.github.com/1654919, # or gist.github.com/1654919 id <- regmatches(id, regexec(url_match, id))[[1]][5] url <- find_gist(id, filename) } else if (is.numeric(id) || grepl("^[0-9a-f]+$", id)) { # 1654919 or "1654919" url <- find_gist(id, filename) } else { stop("Unknown id: ", id) } if (!quiet) cli::cli_alert_info("Sourcing {url}") check_dots_used(action = getOption("devtools.ellipsis_action", rlang::warn)) source_url(url, ..., sha1 = sha1) } find_gist <- function(id, filename) { files <- gh::gh("GET /gists/:id", id = id)$files r_files <- files[grepl("\\.[rR]$", names(files))] if (length(r_files) == 0) { stop("No R files found in gist", call. = FALSE) } if (!is.null(filename)) { if (!is.character(filename) || length(filename) > 1 || !grepl("\\.[rR]$", filename)) { stop("'filename' must be NULL, or a single filename ending in .R/.r", call. = FALSE) } which <- match(tolower(filename), tolower(names(r_files))) if (is.na(which)) { stop("'", filename, "' not found in this gist", call. = FALSE) } } else { if (length(r_files) > 1) { warning("Multiple R files in gist, using first", call. = FALSE) } which <- 1 } r_files[[which]]$raw_url } devtools/R/r-hub.R0000644000175000017500000000432014031104013013566 0ustar nileshnilesh #' Run CRAN checks for package on R-hub #' #' It runs [build()] on the package, with the arguments specified #' in `args`, and then submits it to the R-hub builder at #' . The `interactive` option controls #' whether the function waits for the check output. Regardless, after the #' check is complete, R-hub sends an email with the results to the package #' maintainer. #' #' @section About email validation on r-hub: #' To build and check R packages on R-hub, you need to validate your #' email address. This is because R-hub sends out emails about build #' results. See more at [rhub::validate_email()]. #' #' @param platforms R-hub platforms to run the check on. If `NULL` #' uses default list of CRAN checkers (one for each major platform, and #' one with extra checks if you have compiled code). You can also specify #' your own, see [rhub::platforms()] for a complete list. #' @param email email address to notify, defaults to the maintainer #' address in the package. #' @param interactive whether to show the status of the build #' interactively. R-hub will send an email to the package maintainer's #' email address, regardless of whether the check is interactive or not. #' @param build_args Arguments passed to `R CMD build` #' @param ... extra arguments, passed to [rhub::check_for_cran()]. #' @inheritParams check #' @family build functions #' @return a `rhub_check` object. #' #' @export check_rhub <- function(pkg = ".", platforms = NULL, email = NULL, interactive = TRUE, build_args = NULL, ...) { rlang::check_installed("rhub") pkg <- as.package(pkg) built_path <- build(pkg$path, tempdir(), quiet = !interactive, args = build_args) on.exit(file_delete(built_path), add = TRUE) check_dots_used(action = getOption("devtools.ellipsis_action", rlang::warn)) status <- rhub::check_for_cran( path = built_path, email = email, platforms = platforms, show_status = interactive, ... ) if (!interactive) { cli::cli_alert_success("R-hub check for package {.pkg {pkg$package}} submitted.") status } else { status } } devtools/R/dev-mode.R0000644000175000017500000000402114037273363014274 0ustar nileshnilesh#' Activate and deactivate development mode. #' #' When activated, `dev_mode` creates a new library for storing installed #' packages. This new library is automatically created when `dev_mode` is #' activated if it does not already exist. #' This allows you to test development packages in a sandbox, without #' interfering with the other packages you have installed. #' #' @param on turn dev mode on (`TRUE`) or off (`FALSE`). If omitted #' will guess based on whether or not `path` is in #' [.libPaths()] #' @param path directory to library. #' @export #' @examples #' \dontrun{ #' dev_mode() #' dev_mode() #' } dev_mode <- local({ .prompt <- NULL function(on = NULL, path = getOption("devtools.path")) { lib_paths <- .libPaths() path <- path_real(path) if (is.null(on)) { on <- !(path %in% lib_paths) } if (on) { if (!file_exists(path)) { dir_create(path) } if (!file_exists(path)) { stop("Failed to create ", path, call. = FALSE) } if (!is_library(path)) { warning(path, " does not appear to be a library. ", "Are sure you specified the correct directory?", call. = FALSE ) } cli::cli_alert_success("Dev mode: ON") options(dev_path = path) if (is.null(.prompt)) .prompt <<- getOption("prompt") options(prompt = paste("d> ")) .libPaths(c(path, lib_paths)) } else { cli::cli_alert_success("Dev mode: OFF") options(dev_path = NULL) if (!is.null(.prompt)) options(prompt = .prompt) .prompt <<- NULL .libPaths(setdiff(lib_paths, path)) } } }) is_library <- function(path) { # empty directories can be libraries if (length(dir_ls(path)) == 0) return(TRUE) # otherwise check that the directories are compiled R directories - # i.e. that they contain a Meta directory dirs <- dir_ls(path, type = "directory") has_pkg_dir <- function(path) length(dir_ls(path, regexp = "Meta")) > 0 help_dirs <- vapply(dirs, has_pkg_dir, logical(1)) all(help_dirs) } devtools/R/zzz.R0000644000175000017500000000352314142301461013423 0ustar nileshnilesh#' @importFrom utils available.packages contrib.url install.packages #' installed.packages modifyList packageDescription #' packageVersion remove.packages #' @importFrom cli cat_rule cat_bullet #' @import fs NULL #' Package development tools for R. #' #' @section Package options: #' #' Devtools uses the following [options()] to configure behaviour: #' #' \itemize{ #' \item `devtools.path`: path to use for [dev_mode()] #' #' \item `devtools.name`: your name, used when signing draft #' emails. #' #' \item `devtools.install.args`: a string giving extra arguments passed #' to `R CMD install` by [install()]. #' #' \item `devtools.desc.author`: a string providing a default Authors@@R #' string to be used in new \file{DESCRIPTION}s. Should be a R code, and #' look like `"Hadley Wickham [aut, cre]"`. See #' [utils::as.person()] for more details. #' #' \item `devtools.desc.license`: a default license string to use for #' new packages. #' #' \item `devtools.desc.suggests`: a character vector listing packages to #' to add to suggests by defaults for new packages. # #' \item `devtools.desc`: a named list listing any other #' extra options to add to \file{DESCRIPTION} #' #' } #' @docType package #' @keywords internal #' @name devtools "_PACKAGE" #' Deprecated Functions #' #' These functions are Deprecated in this release of devtools, they will be #' marked as Defunct and removed in a future version. #' @name devtools-deprecated #' @keywords internal NULL devtools_default_options <- list( devtools.path = "~/R-dev", devtools.install.args = "", devtools.ellipsis_action = rlang::warn ) .onLoad <- function(libname, pkgname) { op <- options() toset <- !(names(devtools_default_options) %in% names(op)) if (any(toset)) options(devtools_default_options[toset]) invisible() } devtools/R/save-all.R0000644000175000017500000000075613401234762014305 0ustar nileshnilesh#' Save all documents in an active IDE session. #' #' Helper function wrapping IDE-specific calls to save all documents in the #' active session. In this form, callers of `save_all()` don't need to #' execute any IDE-specific code. This function can be extended to include #' other IDE implementations of their equivalent #' `rstudioapi::documentSaveAll()` methods. #' @return NULL save_all <- function() { if (rstudioapi::hasFun("documentSaveAll")) { rstudioapi::documentSaveAll() } } devtools/R/R.R0000644000175000017500000000211313401234761012766 0ustar nileshnilesh#' Environment variables to set when calling R #' #' Devtools sets a number of environmental variables to ensure consistent #' between the current R session and the new session, and to ensure that #' everything behaves the same across systems. It also suppresses a common #' warning on windows, and sets `NOT_CRAN` so you can tell that your #' code is not running on CRAN. If `NOT_CRAN` has been set externally, it #' is not overwritten. #' #' @keywords internal #' @return a named character vector #' @export r_env_vars <- function() { vars <- c( "R_LIBS" = paste(.libPaths(), collapse = .Platform$path.sep), "CYGWIN" = "nodosfilewarning", # When R CMD check runs tests, it sets R_TESTS. When the tests # themselves run R CMD xxxx, as is the case with the tests in # devtools, having R_TESTS set causes errors because it confuses # the R subprocesses. Un-setting it here avoids those problems. "R_TESTS" = "", "R_BROWSER" = "false", "R_PDFVIEWER" = "false" ) if (is.na(Sys.getenv("NOT_CRAN", unset = NA))) { vars[["NOT_CRAN"]] <- "true" } vars } devtools/R/build-site.R0000644000175000017500000000161314031104013014614 0ustar nileshnilesh#' Execute \pkg{pkgdown} build_site in a package #' #' `build_site()` is a shortcut for [pkgdown::build_site()], it generates the #' static HTML documentation. #' #' @param path path to the package to build the static HTML. #' @param ... additional arguments passed to [pkgdown::build_site()] #' @inheritParams install #' #' @return NULL #' @export build_site <- function(path = ".", quiet = TRUE, ...) { rlang::check_installed("pkgdown") save_all() pkg <- as.package(path) check_dots_used(action = getOption("devtools.ellipsis_action", rlang::warn)) withr::with_temp_libpaths(action = "prefix", code = { install(pkg = pkg$path, upgrade = "never", reload = FALSE, quiet = quiet) if (isTRUE(quiet)) { withr::with_output_sink( file_temp(), pkgdown::build_site(pkg = pkg$path, ...) ) } else { pkgdown::build_site(pkg = pkg$path, ...) } }) } devtools/R/pkgbuild.R0000644000175000017500000000217514031104013014360 0ustar nileshnilesh#' @template devtools #' @param path Path in which to produce package. If `NULL`, defaults to #' the parent directory of the package. #' @inherit pkgbuild::build #' @note The default `manual = FALSE` is not suitable for a CRAN #' submission, which may require `manual = TRUE`. Even better, use #' [submit_cran()] or [release()]. #' @param ... Additional arguments passed to [pkgbuild::build]. #' @export build <- function(pkg = ".", path = NULL, binary = FALSE, vignettes = TRUE, manual = FALSE, args = NULL, quiet = FALSE, ...) { save_all() if (!file_exists(pkg)) { stop("`pkg` must exist", call. = FALSE) } check_dots_used(action = getOption("devtools.ellipsis_action", rlang::warn)) pkgbuild::build( path = pkg, dest_path = path, binary = binary, vignettes = vignettes, manual = manual, args = args, quiet = quiet, ... ) } #' @importFrom pkgbuild with_debug #' @export pkgbuild::with_debug #' @importFrom pkgbuild clean_dll #' @export pkgbuild::clean_dll #' @importFrom pkgbuild has_devel #' @export pkgbuild::has_devel #' @importFrom pkgbuild find_rtools #' @export pkgbuild::find_rtools devtools/R/missing-s3.R0000644000175000017500000000110513536443710014566 0ustar nileshnilesh#' Find missing s3 exports. #' #' The method is heuristic - looking for objs with a period in their name. #' #' @template devtools #' @export missing_s3 <- function(pkg = ".") { pkg <- as.package(pkg) loaded <- load_all(pkg$path) # Find all S3 methods in package objs <- ls(envir = loaded$env) is_s3 <- function(x) roxygen2::is_s3_method(x, env = loaded$env) s3_objs <- Filter(is_s3, objs) # Find all S3 methods in NAMESPACE ns <- pkgload::parse_ns_file(pkg$path) exports <- paste(ns$S3methods[, 1], ns$S3methods[, 2], sep = ".") setdiff(s3_objs, exports) } devtools/R/reload.R0000644000175000017500000000241614031104013014023 0ustar nileshnilesh#' Unload and reload package. #' #' This attempts to unload and reload an _installed_ package. If the package is #' not loaded already, it does nothing. It's not always possible to cleanly #' unload a package: see the caveats in [unload()] for some of the potential #' failure points. If in doubt, restart R and reload the package with #' [library()]. #' #' @template devtools #' @param quiet if `TRUE` suppresses output from this function. #' @seealso [load_all()] to load a package for interactive development. #' @examples #' \dontrun{ #' # Reload package that is in current directory #' reload(".") #' #' # Reload package that is in ./ggplot2/ #' reload("ggplot2/") #' #' # Can use inst() to find the package path #' # This will reload the installed ggplot2 package #' reload(pkgload::inst("ggplot2")) #' } #' @export reload <- function(pkg = ".", quiet = FALSE) { pkg <- as.package(pkg) if (is_attached(pkg)) { if (!quiet) cli::cli_alert_info("Reloading attached {.pkg {pkg$package}}") pkgload::unload(pkg$package) require(pkg$package, character.only = TRUE, quietly = TRUE) } else if (is_loaded(pkg)) { if (!quiet) cli::cli_alert_info("Reloading loaded {.pkg {pkg$package}}") pkgload::unload(pkg$package) requireNamespace(pkg$package, quietly = TRUE) } } devtools/R/install.R0000644000175000017500000001504614042601670014243 0ustar nileshnilesh#' Install a local development package. #' #' Uses `R CMD INSTALL` to install the package. Will also try to install #' dependencies of the package from CRAN, if they're not already installed. #' #' If `quick = TRUE`, installation takes place using the current package #' directory. If you have compiled code, this means that artefacts of #' compilation will be created in the `src/` directory. If you want to avoid #' this, you can use `build = TRUE` to first build a package bundle and then #' install it from a temporary directory. This is slower, but keeps the source #' directory pristine. #' #' If the package is loaded, it will be reloaded after installation. This is #' not always completely possible, see [reload()] for caveats. #' #' To install a package in a non-default library, use [withr::with_libpaths()]. #' #' @template devtools #' @inheritParams remotes::install_local #' @param reload if `TRUE` (the default), will automatically reload the #' package after installing. #' @param quick if `TRUE` skips docs, multiple-architectures, #' demos, and vignettes, to make installation as fast as possible. #' @param build if `TRUE` [pkgbuild::build()]s the package first: #' this ensures that the installation is completely clean, and prevents any #' binary artefacts (like \file{.o}, `.so`) from appearing in your local #' package directory, but is considerably slower, because every compile has #' to start from scratch. #' @param args An optional character vector of additional command line #' arguments to be passed to `R CMD INSTALL`. This defaults to the #' value of the option `"devtools.install.args"`. #' @param build_vignettes if `TRUE`, will build vignettes. Normally it is #' `build` that's responsible for creating vignettes; this argument makes #' sure vignettes are built even if a build never happens (i.e. because #' `build = FALSE`). #' @param keep_source If `TRUE` will keep the srcrefs from an installed #' package. This is useful for debugging (especially inside of RStudio). #' It defaults to the option `"keep.source.pkgs"`. #' @param ... additional arguments passed to [remotes::install_deps()] #' when installing dependencies. #' @family package installation #' @seealso [update_packages()] to update installed packages from the #' source location and [with_debug()] to install packages with #' debugging flags set. #' @export install <- function(pkg = ".", reload = TRUE, quick = FALSE, build = !quick, args = getOption("devtools.install.args"), quiet = FALSE, dependencies = NA, upgrade = "default", build_vignettes = FALSE, keep_source = getOption("keep.source.pkgs"), force = FALSE, ...) { pkg <- as.package(pkg) # Forcing all of the promises for the current namespace now will avoid lazy-load # errors when the new package is installed overtop the old one. # https://stat.ethz.ch/pipermail/r-devel/2015-December/072150.html if (reload && is_loaded(pkg)) { eapply(pkgload::ns_env(pkg$package), force, all.names = TRUE) } if (isTRUE(build_vignettes)) { # we likely need all Suggested dependencies if building vignettes dependencies <- TRUE build_opts <- c("--no-resave-data", "--no-manual") } else { build_opts <- c("--no-resave-data", "--no-manual", "--no-build-vignettes") } opts <- c( if (keep_source) "--with-keep.source", "--install-tests" ) if (quick) { opts <- c(opts, "--no-docs", "--no-multiarch", "--no-demo") } opts <- c(opts, args) check_dots_used(action = getOption("devtools.ellipsis_action", rlang::warn)) remotes::install_deps(pkg$path, build = build, build_opts = build_opts, INSTALL_opts = opts, dependencies = dependencies, quiet = quiet, force = force, upgrade = upgrade, ... ) if (build) { install_path <- pkgbuild::build(pkg$path, dest_path = tempdir(), args = build_opts, quiet = quiet) on.exit(file_delete(install_path), add = TRUE) } else { install_path <- pkg$path } was_loaded <- is_loaded(pkg) was_attached <- is_attached(pkg) if (reload && was_loaded) { pkgload::unload(pkg$package) } pkgbuild::with_build_tools(required = FALSE, callr::rcmd("INSTALL", c(install_path, opts), echo = !quiet, show = !quiet, spinner = FALSE, stderr = "2>&1", fail_on_status = TRUE) ) if (reload && was_loaded) { if (was_attached) { require(pkg$package, quietly = TRUE, character.only = TRUE) } else { requireNamespace(pkg$package, quietly = TRUE) } } invisible(TRUE) } #' Install package dependencies if needed. #' #' `install_deps()` will install the #' user dependencies needed to run the package, `install_dev_deps()` will also #' install the development dependencies needed to test and build the package. #' @inheritParams install #' @inherit remotes::install_deps #' @export install_deps <- function(pkg = ".", dependencies = NA, repos = getOption("repos"), type = getOption("pkgType"), upgrade = c("default", "ask", "always", "never"), quiet = FALSE, build = TRUE, build_opts = c("--no-resave-data", "--no-manual", " --no-build-vignettes"), ...) { pkg <- as.package(pkg) check_dots_used(action = getOption("devtools.ellipsis_action", rlang::warn)) remotes::install_deps( pkg$path, dependencies = dependencies, repos = repos, type = type, upgrade = upgrade, quiet = quiet, build = build, build_opts = build_opts, ... ) } #' @rdname install_deps #' @export install_dev_deps <- function(pkg = ".", dependencies = TRUE, repos = getOption("repos"), type = getOption("pkgType"), upgrade = c("default", "ask", "always", "never"), quiet = FALSE, build = TRUE, build_opts = c("--no-resave-data", "--no-manual", " --no-build-vignettes"), ...) { remotes::update_packages("roxygen2") pkg <- as.package(pkg) check_dots_used(action = getOption("devtools.ellipsis_action", rlang::warn)) remotes::install_deps( pkg$path, dependencies = dependencies, repos = repos, type = type, upgrade = upgrade, quiet = quiet, build = build, build_opts = build_opts, ... ) } devtools/R/spell-check.R0000644000175000017500000000124214031104013014743 0ustar nileshnilesh#' Spell checking #' #' Runs a spell check on text fields in the package description file, manual #' pages, and optionally vignettes. Wraps the \link[spelling:spell_check_package]{spelling} #' package. #' #' @export #' @rdname spell_check #' @template devtools #' @param vignettes also check all `rmd` and `rnw` files in the pkg `vignettes` folder #' @param use_wordlist ignore words in the package [WORDLIST][spelling::get_wordlist] file spell_check <- function(pkg = ".", vignettes = TRUE, use_wordlist = TRUE) { rlang::check_installed("spelling") pkg <- as.package(pkg) spelling::spell_check_package(pkg = pkg, vignettes = vignettes, use_wordlist = use_wordlist) } devtools/R/pkgload.R0000644000175000017500000000115014031104013014170 0ustar nileshnilesh#' @inherit pkgload::load_all #' @param ... Additional arguments passed to [pkgload::load_all()]. #' @export load_all <- function(path = ".", reset = TRUE, recompile = FALSE, export_all = TRUE, helpers = TRUE, quiet = FALSE, ...) { if (inherits(path, "package")) { path <- path$path } save_all() check_dots_used(action = getOption("devtools.ellipsis_action", rlang::warn)) pkgload::load_all( path = path, reset = reset, recompile = recompile, export_all = export_all, helpers = helpers, quiet = quiet, ... ) } #' @importFrom pkgload unload #' @export pkgload::unload devtools/R/check-devtools.R0000644000175000017500000000675214031104013015476 0ustar nileshnilesh#' Custom devtools release checks. #' #' This function performs additional checks prior to release. It is called #' automatically by [release()]. #' #' @template devtools #' @keywords internal #' @export release_checks <- function(pkg = ".", built_path = NULL) { pkg <- as.package(pkg) cat_rule(paste0("Running additional devtools checks for ", pkg$package)) check_version(pkg) check_dev_versions(pkg) check_vignette_titles(pkg) check_news_md(pkg) check_remotes(pkg) cat_rule() } check_dev_versions <- function(pkg = ".") { pkg <- as.package(pkg) dep_list <- pkg[tolower(remotes::standardise_dep(TRUE))] deps <- do.call("rbind", unname(compact(lapply(dep_list, parse_deps)))) deps <- deps[!is.na(deps$version), , drop = FALSE] parsed <- lapply(deps$version, function(x) unlist(numeric_version(x))) lengths <- vapply(parsed, length, integer(1)) last_ver <- vapply(parsed, function(x) x[[length(x)]], integer(1)) is_dev <- lengths == 4 & last_ver >= 9000 check_status( !any(is_dev), "dependencies don't rely on dev versions", paste( "depends on devel versions of: ", paste0(deps$name[is_dev], collapse = ", ") ) ) return(invisible(FALSE)) } check_version <- function(pkg = ".") { pkg <- as.package(pkg) ver <- unlist(numeric_version(pkg$version)) check_status( length(ver) == 3, "version number has three components", paste0("version (", pkg$version, ") should have exactly three components") ) } check_vignette_titles <- function(pkg = ".") { pkg <- as.package(pkg) vigns <- tools::pkgVignettes(dir = pkg$path) if (length(vigns$docs) == 0) return() has_vignette_title <- function(v, n) { h <- readLines(v, n = n) any(grepl("Vignette Title", h)) } v <- stats::setNames(vigns$docs, path_file(vigns$docs)) has_vt <- vapply(v, has_vignette_title, logical(1), n = 30) check_status( !any(has_vt), "vignette titles are not placeholders", paste0( "placeholder 'Vignette Title' detected in 'title' field and/or ", "'VignetteIndexEntry' for: ", paste(names(has_vt)[has_vt], collapse = ",") ) ) } check_news_md <- function(pkg) { pkg <- as.package(pkg) news_path <- path(pkg$path, "NEWS.md") if (!file_exists(news_path)) { return() } ignore_path <- path(pkg$path, ".Rbuildignore") if (!file_exists(ignore_path)) { ignore_lines <- character() } else { ignore_lines <- readLines(ignore_path) } has_news <- grepl("NEWS\\.md", ignore_lines, fixed = TRUE) | grepl("NEWS.md", ignore_lines, fixed = TRUE) check_status( !any(has_news), "NEWS.md is not ignored", "NEWS.md now supported by CRAN and doesn't need to be ignored." ) news_rd_path <- path(pkg$path, "inst/NEWS.Rd") check_status( !file_exists(news_rd_path), "NEWS.Rd does not exist", "NEWS.md now supported by CRAN, NEWS.Rd can be removed." ) } check_remotes <- function(pkg) { check_status( !has_dev_remotes(pkg), "DESCRIPTION doesn't have Remotes field", "Remotes field should be removed before CRAN submission." ) } has_dev_remotes <- function(pkg) { !is.null(pkg[["remotes"]]) } check_status <- function(status, name, warning) { cat("Checking ", name, "...", sep = "") status <- tryCatch( if (status) { cat(" OK\n") } else { cat("\n") cli::cli_alert_danger("WARNING: {warning}") }, error = function(e) { cat("\n") cli::cli_alert_danger("ERROR: {conditionMessage(e)}") FALSE } ) invisible(status) } devtools/R/sitrep.R0000644000175000017500000001164714056213161014105 0ustar nileshnilesh# Supress R CMD check note #' @importFrom memoise memoise NULL check_for_rstudio_updates <- function(os = tolower(Sys.info()[["sysname"]]), version = rstudioapi::getVersion(), in_rstudio = rstudioapi::isAvailable()) { if (!in_rstudio) { return() } url <- sprintf("https://www.rstudio.org/links/check_for_update?version=%s&os=%s&format=%s", version, os, "kvp") tmp <- file_temp() on.exit(file_delete(tmp)) utils::download.file(url, tmp, quiet = TRUE) result <- readLines(tmp, warn = FALSE) result <- strsplit(result, "&")[[1]] result <- strsplit(result, "=") # If no values then we are current if (length(result[[1]]) == 1) { return() } nms <- vcapply(result, `[[`, 1) values <- vcapply(result, function(x) utils::URLdecode(x[[2]])) result <- stats::setNames(values, nms) if (!nzchar(result[["update-version"]])) { return() } return( sprintf("%s.\nDownload at: %s", result[["update-message"]], ui_field(result[["update-url"]]) ) ) } .r_release <- function() { R_system_version(rversions::r_release()$version) } r_release <- memoise::memoise(.r_release) #' Report package development situation #' #' @template devtools #' @inheritParams pkgbuild::has_build_tools #' @description `dev_sitrep()` reports #' * If R is up to date #' * If RStudio is up to date #' * If compiler build tools are installed and available for use #' * If devtools and its dependencies are up to date #' * If the package's dependencies are up to date #' #' @description Call this function if things seem weird and you're not sure #' what's wrong or how to fix it. If this function returns no output #' everything should be ready for package development. #' #' @return A named list, with S3 class `dev_sitrep` (for printing purposes). #' @importFrom usethis ui_code ui_field ui_todo ui_value ui_done ui_path #' @export #' @examples #' \dontrun{ #' dev_sitrep() #' } dev_sitrep <- function(pkg = ".", debug = FALSE) { pkg <- tryCatch(as.package(pkg), error = function(e) NULL) has_build_tools <- !is_windows || pkgbuild::has_build_tools(debug = debug) structure( list( pkg = pkg, r_version = getRversion(), r_path = path_real(R.home()), r_release_version = r_release(), has_build_tools = has_build_tools, rtools_path = if (has_build_tools) pkgbuild::rtools_path(), devtools_version = packageVersion("devtools"), devtools_deps = remotes::package_deps("devtools", dependencies = NA), pkg_deps = if (!is.null(pkg)) { remotes::dev_package_deps(pkg$path, dependencies = TRUE) }, rstudio_version = if (rstudioapi::isAvailable()) rstudioapi::getVersion(), rstudio_msg = check_for_rstudio_updates() ), class = "dev_sitrep" ) } #' @export print.dev_sitrep <- function(x, ...) { all_ok <- TRUE hd_line("R") kv_line("version", x$r_version) kv_line("path", x$r_path, path = TRUE) if (x$r_version < x$r_release_version) { ui_todo(' {ui_field("R")} is out of date ({ui_value(x$r_version)} vs {ui_value(x$r_release_version)}) ') all_ok <- FALSE } if (is_windows) { hd_line("Rtools") if (x$has_build_tools) { kv_line("path", x$rtools_path, path = TRUE) } else { ui_todo(' {ui_field("RTools")} is not installed: Download and install it from: {ui_field("https://cloud.r-project.org/bin/windows/Rtools/")} ') } all_ok <- FALSE } if (!is.null(x$rstudio_version)) { hd_line("RStudio") kv_line("version", x$rstudio_version) if (!is.null(x$rstudio_msg)) { ui_todo(x$rstudio_msg) all_ok <- FALSE } } hd_line("devtools") kv_line("version", x$devtools_version) devtools_deps_old <- x$devtools_deps$diff < 0 if (any(devtools_deps_old)) { ui_todo(' {ui_field("devtools")} or its dependencies out of date: {paste(ui_value(x$devtools_deps$package[devtools_deps_old]), collapse = ", ")} Update them with {ui_code("devtools::update_packages(\\"devtools\\")")} ') all_ok <- FALSE } hd_line("dev package") kv_line("package", x$pkg$package) kv_line("path", x$pkg$path, path = TRUE) pkg_deps_old <- x$pkg_deps$diff < 0 if (any(pkg_deps_old)) { ui_todo(' {ui_field(x$pkg$package)} dependencies out of date: {paste(ui_value(x$pkg_deps$package[pkg_deps_old]), collapse = ", ")} Update them with {ui_code("devtools::install_dev_deps()")} ') all_ok <- FALSE } if (all_ok) { ui_done(" All checks passed ") } invisible(x) } # Helpers ----------------------------------------------------------------- hd_line <- function(name) { cat_rule(cli::style_bold(name)) } kv_line <- function (key, value, path = FALSE) { if (is.null(value)) { value <- cli::col_silver("") } else { if (path) { value <- ui_path(value, base = NA) } else { value <- ui_value(value) } } cli::cat_line(cli::symbol$bullet, " ", key, ": ", value) } devtools/R/test.R0000644000175000017500000001036414031104013013535 0ustar nileshnilesh#' Execute testthat tests in a package #' #' @description #' * `test()` runs all tests in a package. It's a shortcut for #' [testthat::test_dir()] #' * `test_active_file()` runs `test()` on the active file. #' * `test_coverage()` computes test coverage for your package. It's a #' shortcut for [covr::package_coverage()] plus [covr::report()]. #' * `test_coverage_active_file()` computes test coverage for the active file. It's a #' shortcut for [covr::file_coverage()] plus [covr::report()]. #' #' @template devtools #' @param ... additional arguments passed to wrapped functions. #' @param file One or more source or test files. If a source file the #' corresponding test file will be run. The default is to use the active file #' in RStudio (if available). #' @inheritParams testthat::test_dir #' @inheritParams pkgload::load_all #' @inheritParams run_examples #' @export test <- function(pkg = ".", filter = NULL, stop_on_failure = FALSE, export_all = TRUE, ...) { save_all() pkg <- as.package(pkg) if (!uses_testthat(pkg) && interactive()) { cli::cli_alert_danger("No testing infrastructure found. Create it?") if (utils::menu(c("Yes", "No")) == 1) { usethis_use_testthat(pkg) } return(invisible()) } load_all(pkg$path) cli::cli_alert_info("Testing {.pkg {pkg$package}}") withr::local_envvar(r_env_vars()) testthat::test_local( pkg$path, filter = filter, stop_on_failure = stop_on_failure, ... ) } #' @rdname devtools-deprecated #' @export test_file <- function(file = find_active_file(), ...) { lifecycle::deprecate_soft("2.4.0", "test_file()", "test_active_file()") test_active_file(file, ...) } #' @export #' @rdname test test_active_file <- function(file = find_active_file(), ...) { save_all() test_files <- find_test_file(file) pkg <- as.package(path_dir(test_files)[[1]]) withr::local_envvar(r_env_vars()) load_all(pkg$path, quiet = TRUE) testthat::test_file(test_files, ...) } #' @param show_report Show the test coverage report. #' @export #' @rdname test test_coverage <- function(pkg = ".", show_report = interactive(), ...) { rlang::check_installed(c("covr", "DT")) save_all() pkg <- as.package(pkg) cli::cli_alert_info("Computing test coverage for {.pkg {pkg$package}}") check_dots_used(action = getOption("devtools.ellipsis_action", rlang::warn)) withr::local_envvar(r_env_vars()) testthat::local_test_directory(pkg$path, pkg$package) coverage <- covr::package_coverage(pkg$path, ...) if (isTRUE(show_report)) { covr::report(coverage) } invisible(coverage) } #' @rdname devtools-deprecated #' @export test_coverage_file <- function(file = find_active_file(), ...) { lifecycle::deprecate_soft("2.4.0", "test_coverage()", "test_coverage_active_file()") test_coverage_active_file(file, ...) } #' @rdname test #' @export test_coverage_active_file <- function(file = find_active_file(), filter = TRUE, show_report = interactive(), export_all = TRUE, ...) { rlang::check_installed(c("covr", "DT")) save_all() test_files <- find_test_file(file) pkg <- as.package(path_dir(file)[[1]]) check_dots_used(action = getOption("devtools.ellipsis_action", rlang::warn)) withr::local_envvar(r_env_vars()) testthat::local_test_directory(pkg$path, pkg$package) reporter <- testthat::local_snapshotter(cleanup = TRUE) reporter$start_file(file, "test") env <- load_all(pkg$path, quiet = TRUE, export_all = export_all)$env testthat::with_reporter(reporter, { coverage <- covr::environment_coverage(env, test_files, ...) }) if (isTRUE(filter)) { coverage_name <- name_source(covr::display_name(coverage)) local_name <- name_test(file) coverage <- coverage[coverage_name %in% local_name] } # Use relative paths attr(coverage, "relative") <- TRUE attr(coverage, "package") <- pkg if (isTRUE(show_report)) { covered <- unique(covr::display_name(coverage)) if (length(covered) == 1) { covr::file_report(coverage) } else { covr::report(coverage) } } invisible(coverage) } #' Does a package use testthat? #' #' @export #' @keywords internal uses_testthat <- function(pkg = ".") { pkg <- as.package(pkg) paths <- c( path(pkg$path, "inst", "tests"), path(pkg$path, "tests", "testthat") ) any(dir_exists(paths)) } devtools/R/create.R0000644000175000017500000000065714042601670014042 0ustar nileshnilesh#' Create a package #' #' @param path A path. If it exists, it is used. If it does not exist, it is #' created, provided that the parent path exists. #' @param ... Additional arguments passed to [usethis::create_package()] #' @inheritParams usethis::create_package #' @return The path to the created package, invisibly. #' @export create <- function(path, ..., open = FALSE) { usethis::create_package(path, ..., open = open) } devtools/R/vignettes.R0000644000175000017500000001131414031104013014562 0ustar nileshnilesh#' Build package vignettes. #' #' Builds package vignettes using the same algorithm that `R CMD build` #' does. This means including non-Sweave vignettes, using makefiles (if #' present), and copying over extra files. The files are copied in the 'doc' #' directory and an vignette index is created in 'Meta/vignette.rds', as they #' would be in a built package. 'doc' and 'Meta' are added to #' `.Rbuildignore`, so will not be included in the built package. These #' files can be checked into version control, so they can be viewed with #' `browseVignettes()` and `vignette()` if the package has been #' loaded with `load_all()` without needing to re-build them locally. #' #' @template devtools #' @param quiet If `TRUE`, suppresses most output. Set to `FALSE` #' if you need to debug. #' @param install If `TRUE`, install the package before building #' vignettes. #' @param keep_md If `TRUE`, move md intermediates as well as rendered #' outputs. Most useful when using the `keep_md` YAML option for Rmarkdown #' outputs. See #' . #' @inheritParams tools::buildVignettes #' @inheritParams remotes::install_deps #' @importFrom stats update #' @keywords programming #' @seealso [clean_vignettes()] to remove the pdfs in #' \file{doc} created from vignettes #' @export #' @seealso [clean_vignettes()] to remove build tex/pdf files. build_vignettes <- function(pkg = ".", dependencies = "VignetteBuilder", clean = TRUE, upgrade = "never", quiet = TRUE, install = TRUE, keep_md = TRUE) { pkg <- as.package(pkg) deps <- remotes::dev_package_deps(pkg$path, dependencies) update(deps, upgrade = upgrade) vigns <- tools::pkgVignettes(dir = pkg$path) if (length(vigns$docs) == 0) return() cli::cli_alert_info("Building {.pkg {pkg$package}} vignettes") if (isTRUE(install)) { build <- function(pkg_path, clean, quiet, upgrade) { withr::with_temp_libpaths(action = "prefix", { devtools::install(pkg_path, upgrade = upgrade, reload = FALSE, quiet = quiet) tools::buildVignettes(dir = pkg_path, clean = clean, tangle = TRUE, quiet = quiet) }) } } else { build <- function(pkg_path, clean, quiet, upgrade) { tools::buildVignettes(dir = pkg_path, clean = clean, tangle = TRUE, quiet = quiet) } } callr::r( build, args = list(pkg_path = pkg$path, clean = clean, upgrade = upgrade, quiet = quiet), show = !quiet, spinner = FALSE, stderr = "2>&1" ) # We need to re-run pkgVignettes now that they are built to get the output # files as well vigns <- tools::pkgVignettes(dir = pkg$path, source = TRUE, output = TRUE) copy_vignettes(pkg, keep_md) create_vignette_index(pkg, vigns) invisible(TRUE) } create_vignette_index <- function(pkg, vigns) { usethis_use_directory(pkg, "Meta", ignore = TRUE) usethis_use_git_ignore(pkg, "/Meta/") cli::cli_alert_info("Building vignette index") vignette_index <- ("tools" %:::% ".build_vignette_index")(vigns) vignette_index_path <- path(pkg$path, "Meta", "vignette.rds") saveRDS(vignette_index, vignette_index_path, version = 2L) } #' Clean built vignettes. #' #' This uses a fairly rudimentary algorithm where any files in \file{doc} #' with a name that exists in \file{vignettes} are removed. #' #' @template devtools #' @export clean_vignettes <- function(pkg = ".") { pkg <- as.package(pkg) vigns <- tools::pkgVignettes(dir = pkg$path) if (path_file(vigns$dir) != "vignettes") return() cli::cli_alert_info("Cleaning built vignettes and index from {.pkg {pkg$package}}") doc_path <- path(pkg$path, "doc") vig_candidates <- if (dir_exists(doc_path)) dir_ls(doc_path) else character() vig_rm <- vig_candidates[file_name(vig_candidates) %in% file_name(vigns$docs)] extra_candidates <- path(doc_path, path_file(find_vignette_extras(pkg))) extra_rm <- extra_candidates[file_exists(extra_candidates)] meta_path <- path(pkg$path, "Meta") vig_index_path <- path(meta_path, "vignette.rds") vig_index_rm <- if (file_exists(vig_index_path)) vig_index_path to_remove <- c(vig_rm, extra_rm, vig_index_rm) if (length(to_remove) > 0) { cli::cli_alert_warning("Removing {.file {path_file(to_remove)}}") file_delete(to_remove) } lapply(c(doc_path, meta_path), dir_delete_if_empty) invisible(TRUE) } dir_delete_if_empty <- function(x) { if (dir_exists(x) && rlang::is_empty(dir_ls(x))) { dir_delete(x) cli::cli_alert_warning("Removing {.file {path_file(x)}}") } } file_name <- function(x) { if (length(x) == 0) return(NULL) path_ext_remove(path_file(x)) } devtools/R/build-readme.R0000644000175000017500000000416114107010220015106 0ustar nileshnilesh#' Build a Rmarkdown files package #' #' `build_rmd()` is a wrapper around [rmarkdown::render()] that first installs #' a temporary copy of the package, and then renders each `.Rmd` in a clean R #' session. `build_readme()` locates your `README.Rmd` and builds it into a #' `README.md` #' #' @param files The Rmarkdown files to be rendered. #' @param path path to the package to build the readme. #' @param ... additional arguments passed to [rmarkdown::render()] #' @inheritParams install #' @inheritParams rmarkdown::render #' @export build_rmd <- function(files, path = ".", output_options = list(), ..., quiet = TRUE) { check_dots_used(action = getOption("devtools.ellipsis_action", rlang::warn)) pkg <- as.package(path) rlang::check_installed("rmarkdown") save_all() paths <- files abs_files <- is_absolute_path(files) paths[!abs_files] <- path(pkg$path, files[!abs_files]) ok <- file_exists(paths) if (any(!ok)) { cli::cli_abort("Can't find file{?s}: {.path {files[!ok]}}.") } cli::cli_alert_info("Installing {.pkg {pkg$package}} in temporary library") withr::local_temp_libpaths() install(pkg, upgrade = "never", reload = FALSE, quick = TRUE, quiet = quiet) # Ensure rendering github_document() doesn't generate HTML file output_options$html_preview <- FALSE for (path in paths) { cli::cli_alert_info("Building {.path {path}}") callr::r_safe( function(...) rmarkdown::render(...), args = list(input = path, ..., output_options = output_options, quiet = quiet), show = TRUE, spinner = FALSE, stderr = "2>&1" ) } invisible(TRUE) } #' @rdname build_rmd #' @export build_readme <- function(path = ".", quiet = TRUE, ...) { pkg <- as.package(path) readme_path <- path_abs(dir_ls(pkg$path, ignore.case = TRUE, regexp = "(inst/)?readme[.]rmd", recurse = 1, type = "file")) if (length(readme_path) == 0) { rlang::abort("Can't find a 'README.Rmd' or 'inst/README.Rmd' file.") } if (length(readme_path) > 1) { rlang::abort("Can't have both a 'README.Rmd' and 'inst/README.Rmd' file.") } build_rmd(readme_path, path = path, quiet = quiet, ...) } devtools/R/run-examples.R0000644000175000017500000000644214031104013015200 0ustar nileshnilesh#' Run all examples in a package. #' #' One of the most frustrating parts of `R CMD check` is getting all of your #' examples to pass - whenever one fails you need to fix the problem and then #' restart the whole process. This function makes it a little easier by #' making it possible to run all examples from an R function. #' #' @template devtools #' @inheritParams pkgload::run_example #' @param start Where to start running the examples: this can either be the #' name of `Rd` file to start with (with or without extensions), or #' a topic name. If omitted, will start with the (lexicographically) first #' file. This is useful if you have a lot of examples and don't want to #' rerun them every time you fix a problem. #' @family example functions #' @param show DEPRECATED. #' @param fresh if `TRUE`, will be run in a fresh R session. This has #' the advantage that there's no way the examples can depend on anything in #' the current session, but interactive code (like [browser()]) #' won't work. #' @param document if `TRUE`, [document()] will be run to ensure #' examples are updated before running them. #' @keywords programming #' @export run_examples <- function(pkg = ".", start = NULL, show = TRUE, run_donttest = FALSE, run_dontrun = FALSE, fresh = FALSE, document = TRUE, run, test) { if (!missing(run)) { warning("`run_examples(run=)` is deprecated, please use `run_example(run_dontrun=)` instead", call. = FALSE) run_dontrun <- run } if (!missing(test)) { warning("`run_examples(test=)` is deprecated, please use `run_example(run_donttest=)` instead", call. = FALSE) run_donttest <- test } pkg <- as.package(pkg) if (fresh) { to_run <- function(path, start, run_donttest, run_dontrun) devtools::run_examples(pkg = path, start = start, run_donttest = run_donttest, run_dontrun = run_dontrun, document = FALSE) callr::r(to_run, args = list(path = pkg$path, start = start, run_donttest = run_donttest, run_dontrun = run_dontrun), show = TRUE, spinner = FALSE, stderr = "2>&1") return(invisible()) } if (document) { document(pkg) } if (!missing(show)) { warning("`show` is deprecated", call. = FALSE) } files <- rd_files(pkg$path, start = start) if (length(files) == 0) { return() } cat_rule( left = paste0("Running ", length(files), " example files"), right = pkg$package ) load_all(pkg$path, reset = TRUE, export_all = FALSE) on.exit(load_all(pkg$path, reset = TRUE)) lapply(files, pkgload::run_example, run_donttest = run_donttest, run_dontrun = run_dontrun) invisible() } # If an error occurs, should print out the suspect line of code, and offer # the following options: # * skip to the next example # * quit # * browser # * rerun example and rerun # * reload code and rerun rd_files <- function(pkg = ".", start = NULL) { pkg <- as.package(pkg) path_man <- path(pkg$path, "man") files <- dir_ls(path_man, regexp = "\\.[Rr]d$") names(files) <- path_file(files) files <- sort_ci(files) if (!is.null(start)) { topic <- pkgload::dev_help(start, dev_packages = pkg$package) start_path <- path_file(topic$path) start_pos <- which(names(files) == start_path) if (length(start_pos) == 1) { files <- files[-seq(1, start_pos - 1)] } } files } devtools/R/package.R0000644000175000017500000000533214031104013014150 0ustar nileshnilesh#' Coerce input to a package. #' #' Possible specifications of package: #' \itemize{ #' \item path #' \item package object #' } #' @param x object to coerce to a package #' @param create only relevant if a package structure does not exist yet: if #' `TRUE`, create a package structure; if `NA`, ask the user #' (in interactive mode only) #' @export #' @keywords internal as.package <- function(x = NULL, create = NA) { if (is.package(x)) return(x) x <- package_file(path = x) load_pkg_description(x, create = create) } #' Find file in a package. #' #' It always starts by walking up the path until it finds the root directory, #' i.e. a directory containing `DESCRIPTION`. If it cannot find the root #' directory, or it can't find the specified path, it will throw an error. #' #' @param ... Components of the path. #' @param path Place to start search for package directory. #' @keywords internal #' @export #' @examples #' \dontrun{ #' package_file("figures", "figure_1") #' } package_file <- function(..., path = ".") { if (!is.character(path) || length(path) != 1) { stop("`path` must be a string.", call. = FALSE) } path <- strip_slashes(path_real(path)) if (!file_exists(path)) { stop("Can't find '", path, "'.", call. = FALSE) } if (!is_dir(path)) { stop("'", path, "' is not a directory.", call. = FALSE) } # Walk up to root directory while (!has_description(path)) { path <- path_dir(path) if (is_root(path)) { stop("Could not find package root. Is your working directory inside a package?", call. = FALSE) } } path(path, ...) } has_description <- function(path) { file_exists(path(path, "DESCRIPTION")) } is_root <- function(path) { identical(path, path_dir(path)) } strip_slashes <- function(x) { x <- sub("/*$", "", x) x } # Load package DESCRIPTION into convenient form. load_pkg_description <- function(path, create) { path_desc <- path(path, "DESCRIPTION") if (!file_exists(path_desc)) { if (is.na(create)) { if (interactive()) { cli::cli_alert_danger("No package infrastructure found in {.file {path}}. Create it?") create <- (utils::menu(c("Yes", "No")) == 1) } else { create <- FALSE } } if (create) { usethis::create_package(path = path) } else { stop("No description at ", path_desc, call. = FALSE) } } info <- read.dcf(path_desc)[1, ] Encoding(info) <- 'UTF-8' desc <- as.list(info) names(desc) <- tolower(names(desc)) desc$path <- path structure(desc, class = "package") } #' Is the object a package? #' #' @keywords internal #' @export is.package <- function(x) inherits(x, "package") # Mockable variant of interactive interactive <- function() .Primitive("interactive")() devtools/R/has-tests.R0000644000175000017500000000033614031104013014467 0ustar nileshnilesh#' Was devtools installed with tests? #' #' @keywords internal #' @export has_tests <- function() { test_path <- tryCatch( path_package("devtools", "tests"), error = function(e) NULL ) !is.null(test_path) } devtools/R/remotes.R0000644000175000017500000000655613577154220014267 0ustar nileshnilesh#' @importFrom ellipsis check_dots_used with_ellipsis <- function(fun) { b <- body(fun) f <- function(...) { ellipsis::check_dots_used(action = getOption("devtools.ellipsis_action", rlang::warn)) !! b } f <- rlang::expr_interp(f) body(fun) <- body(f) fun } with_pkgbuild_build_tools <- function(fun) { b <- body(fun) pkgbuild_call <- as.call(c(call("::", as.symbol("pkgbuild"), as.symbol("with_build_tools")), b, list(required = FALSE))) body(fun) <- pkgbuild_call fun } #' Functions re-exported from the remotes package #' #' These functions are re-exported from the remotes package. They differ only #' that the ones in devtools use the [ellipsis] package to ensure all dotted #' arguments are used. #' #' Follow the links below to see the documentation. #' [remotes::install_bioc()], [remotes::install_bitbucket()], [remotes::install_cran()], [remotes::install_dev()], #' [remotes::install_git()], [remotes::install_github()], [remotes::install_gitlab()], [remotes::install_local()], #' [remotes::install_svn()], [remotes::install_url()], [remotes::install_version()], [remotes::update_packages()], #' [remotes::dev_package_deps()]. #' #' @importFrom remotes install_bioc #' @name remote-reexports #' @keywords internal #' @export install_bioc <- with_pkgbuild_build_tools(with_ellipsis(remotes::install_bioc)) #' @importFrom remotes install_bitbucket #' @rdname remote-reexports #' @export install_bitbucket <- with_pkgbuild_build_tools(with_ellipsis(remotes::install_bitbucket)) #' @importFrom remotes install_cran #' @rdname remote-reexports #' @export install_cran <- with_pkgbuild_build_tools(with_ellipsis(remotes::install_cran)) #' @importFrom remotes install_dev #' @rdname remote-reexports #' @export install_dev <- with_pkgbuild_build_tools(with_ellipsis(remotes::install_dev)) #' @importFrom remotes install_git #' @rdname remote-reexports #' @export install_git <- with_pkgbuild_build_tools(with_ellipsis(remotes::install_git)) #' @importFrom remotes install_github #' @rdname remote-reexports #' @export install_github <- with_pkgbuild_build_tools(with_ellipsis(remotes::install_github)) #' @importFrom remotes github_pull #' @rdname reexports #' @export remotes::github_pull #' @importFrom remotes github_release #' @rdname reexports #' @export remotes::github_release #' @importFrom remotes install_gitlab #' @rdname remote-reexports #' @export install_gitlab <- with_pkgbuild_build_tools(with_ellipsis(remotes::install_gitlab)) #' @importFrom remotes install_local #' @rdname remote-reexports #' @export install_local <- with_pkgbuild_build_tools(with_ellipsis(remotes::install_local)) #' @importFrom remotes install_svn #' @rdname remote-reexports #' @export install_svn <- with_pkgbuild_build_tools(with_ellipsis(remotes::install_svn)) #' @importFrom remotes install_url #' @rdname remote-reexports #' @export install_url <- with_pkgbuild_build_tools(with_ellipsis(remotes::install_url)) #' @importFrom remotes install_version #' @rdname remote-reexports #' @export install_version <- with_pkgbuild_build_tools(with_ellipsis(remotes::install_version)) #' @importFrom remotes update_packages #' @rdname remote-reexports #' @export update_packages <- with_pkgbuild_build_tools(with_ellipsis(remotes::update_packages)) #' @importFrom remotes dev_package_deps #' @rdname remote-reexports #' @export dev_package_deps <- with_pkgbuild_build_tools(remotes::dev_package_deps) devtools/R/check-doc.R0000644000175000017500000000346114056213763014422 0ustar nileshnilesh#' Check documentation, as `R CMD check` does. #' #' This function attempts to run the documentation related checks in the #' same way that `R CMD check` does. Unfortunately it can't run them #' all because some tests require the package to be loaded, and the way #' they attempt to load the code conflicts with how devtools does it. #' #' @template devtools #' @return Nothing. This function is called purely for it's side effects: if # no errors there will be no output. #' @export #' @examples #' \dontrun{ #' check_man("mypkg") #' } check_man <- function(pkg = ".") { pkg <- as.package(pkg) document(pkg) old <- options(warn = -1) on.exit(options(old)) cli::cli_alert_info("Checking documentation...") check_Rd_contents <- if (getRversion() < "4.1") { asNamespace("tools")$.check_Rd_contents } else { asNamespace("tools")$checkRdContents } ok <- all( man_message(("tools" %:::% ".check_package_parseRd")(dir = pkg$path)), man_message(("tools" %:::% ".check_Rd_metadata")(dir = pkg$path)), man_message(("tools" %:::% ".check_Rd_xrefs")(dir = pkg$path)), man_message(check_Rd_contents(dir = pkg$path)), man_message(tools::checkDocFiles(dir = pkg$path)), man_message(tools::checkDocStyle(dir = pkg$path)), man_message(tools::checkReplaceFuns(dir = pkg$path)), man_message(tools::checkS3methods(dir = pkg$path)), man_message(tools::undoc(dir = pkg$path)) ) if (ok) { cli::cli_alert_success("No issues detected") } invisible() } man_message <- function(x) { if (inherits(x, "undoc") && length(x$code) == 0) { # Returned by tools::undoc() TRUE } else if ("bad" %in% names(x) && length(x$bad) == 0) { # Returned by check_Rd_xrefs() TRUE } else if (length(x) == 0) { TRUE } else { print(x) FALSE } } devtools/R/build-manual.R0000644000175000017500000000132014031104013015120 0ustar nileshnilesh#' Create package pdf manual #' #' @template devtools #' @param path path in which to produce package manual. #' If `NULL`, defaults to the parent directory of the package. #' #' @seealso [Rd2pdf()] #' @export build_manual <- function(pkg = ".", path = NULL) { pkg <- as.package(pkg) path <- path %||% path_dir(pkg$path) name <- paste0(pkg$package, "_", pkg$version, ".pdf", collapse = " ") tryCatch(msg <- callr::rcmd("Rd2pdf", cmdargs = c( "--force", paste0("--output=", path, "/", name), pkg$path ), fail_on_status = TRUE, stderr = "2>&1", spinner = FALSE), error = function(e) { cat(e$stdout) stop("Failed to build manual", call. = FALSE) }) cat(msg$stdout) invisible(msg) } devtools/R/git.R0000644000175000017500000000055714031104013013344 0ustar nileshnileshuses_git <- function(path = ".") { dir_exists(path(path, ".git")) } git_branch <- function(path = ".") { withr::local_dir(path) system2("git", c("rev-parse", "--abbrev-ref", "HEAD"), stdout = TRUE) } git_uncommitted <- function(path = ".") { withr::local_dir(path) out <- system2("git", c("status", "--porcelain=v1"), stdout = TRUE) length(out) > 0 } devtools/R/vignette-r.R0000644000175000017500000000327214031104013014642 0ustar nileshnileshcopy_vignettes <- function(pkg, keep_md) { pkg <- as.package(pkg) usethis_use_directory(pkg, "doc", ignore = TRUE) usethis_use_git_ignore(pkg, "/doc/") doc_dir <- path(pkg$path, "doc") vignettes <- tools::pkgVignettes(dir = pkg$path, output = TRUE, source = TRUE) if (length(vignettes$docs) == 0) { return(invisible()) } md_outputs <- character() if (isTRUE(keep_md)) { md_outputs <- dir_ls(path = vignettes$dir, regexp = "[.]md$") } out_mv <- unique(c( md_outputs, vignettes$outputs, unlist(vignettes$sources, use.names = FALSE) )) out_cp <- vignettes$docs cli::cli_alert_info("Moving {.file {path_file(out_mv)}} to {.path doc/}") file_copy(out_mv, doc_dir, overwrite = TRUE) file_delete(out_mv) cli::cli_alert_info("Copying {.file {path_file(out_cp)}} to {.path doc/}") file_copy(out_cp, doc_dir, overwrite = TRUE) # Copy extra files, if needed extra_files <- find_vignette_extras(pkg) if (length(extra_files) == 0) { return(invisible()) } cli::cli_alert_info("Copying extra files {.file {path_file(extra_files)}} to {.path doc/}") file_copy(extra_files, doc_dir) invisible() } find_vignette_extras <- function(pkg = ".") { pkg <- as.package(pkg) vig_path <- path(pkg$path, "vignettes") extras_file <- path(vig_path, ".install_extras") if (!file_exists(extras_file)) { return(character()) } extras <- readLines(extras_file, warn = FALSE) if (length(extras) == 0) { return(character()) } all_files <- path_rel(dir_ls(vig_path, all = TRUE), vig_path) re <- paste0(extras, collapse = "|") files <- grep(re, all_files, perl = TRUE, ignore.case = TRUE, value = TRUE) path_real(path(vig_path, files)) } devtools/R/check-git.R0000644000175000017500000000123013705574136014434 0ustar nileshnilesh#' Git checks. #' #' This function performs Git checks checks prior to release. It is called #' automatically by [release()]. #' #' @template devtools #' @keywords internal git_checks <- function(pkg = ".") { pkg <- as.package(pkg) cat_rule(paste0("Running Git checks for ", pkg$package)) git_report_branch(pkg) git_check_uncommitted(pkg) cat_rule() } git_report_branch <- function(pkg) { cat("Current branch:", git_branch(pkg$path), "\n") } git_check_uncommitted <- function(pkg) { check_status( !git_uncommitted(pkg$path), "uncommitted files", "All files should be tracked and committed before release. Please add and commit." ) } devtools/R/wd.R0000644000175000017500000000065514031104013013172 0ustar nileshnilesh#' Set working directory. #' #' @template devtools #' @param path path within package. Leave empty to change working directory #' to package directory. #' @export wd <- function(pkg = ".", path = "") { pkg <- as.package(pkg) path <- path(pkg$path, path) if (!file_exists(path)) { stop(path, " does not exist", call. = FALSE) } cli::cli_alert_info("Changing working directory to {.path {path}}") setwd(path) } devtools/R/bash.R0000644000175000017500000000026313536443710013513 0ustar nileshnilesh#' Open bash shell in package directory. #' #' @template devtools #' @export bash <- function(pkg = ".") { pkg <- as.package(pkg) withr::with_dir(pkg$path, system("bash")) } devtools/R/check-win.R0000644000175000017500000001107114144743006014442 0ustar nileshnilesh#' Build windows binary package. #' #' This function works by bundling source package, and then uploading to #' . Once building is complete you'll #' receive a link to the built package in the email address listed in the #' maintainer field. It usually takes around 30 minutes. As a side effect, #' win-build also runs `R CMD check` on the package, so `check_win` #' is also useful to check that your package is ok on windows. #' #' @template devtools #' @inheritParams pkgbuild::build #' @param email An alternative email to use, default `NULL` uses the package #' Maintainer's email. #' @param quiet If `TRUE`, suppresses output. #' @param ... Additional arguments passed to [pkgbuild::build()]. #' @family build functions #' @name check_win NULL #' @describeIn check_win Check package on the development version of R. #' @export check_win_devel <- function(pkg = ".", args = NULL, manual = TRUE, email = NULL, quiet = FALSE, ...) { check_dots_used(action = getOption("devtools.ellipsis_action", rlang::warn)) check_win( pkg = pkg, version = "R-devel", args = args, manual = manual, email = email, quiet = quiet, ... ) } #' @describeIn check_win Check package on the release version of R. #' @export check_win_release <- function(pkg = ".", args = NULL, manual = TRUE, email = NULL, quiet = FALSE, ...) { check_dots_used(action = getOption("devtools.ellipsis_action", rlang::warn)) check_win( pkg = pkg, version = "R-release", args = args, manual = manual, email = email, quiet = quiet, ... ) } #' @describeIn check_win Check package on the previous major release version of R. #' @export check_win_oldrelease <- function(pkg = ".", args = NULL, manual = TRUE, email = NULL, quiet = FALSE, ...) { check_dots_used(action = getOption("devtools.ellipsis_action", rlang::warn)) check_win( pkg = pkg, version = "R-oldrelease", args = args, manual = manual, email = email, quiet = quiet, ... ) } check_win <- function(pkg = ".", version = c("R-devel", "R-release", "R-oldrelease"), args = NULL, manual = TRUE, email = NULL, quiet = FALSE, ...) { pkg <- as.package(pkg) if (!is.null(email)) { desc_file <- path(pkg$path, "DESCRIPTION") backup <- file_temp() file_copy(desc_file, backup) on.exit(file_move(backup, desc_file), add = TRUE) change_maintainer_email(desc_file, email) pkg <- as.package(pkg$path) } version <- match.arg(version, several.ok = TRUE) if (!quiet) { cli::cli_alert_info( "Building windows version of {.pkg {pkg$package}} ({pkg$version})", " for {paste(version, collapse = ', ')} with win-builder.r-project.org." ) email <- cli::style_bold(maintainer(pkg)$email) if (interactive() && yesno("Email results to ", email, "?")) { return(invisible()) } } built_path <- pkgbuild::build(pkg$path, tempdir(), args = args, manual = manual, quiet = quiet, ... ) on.exit(file_delete(built_path), add = TRUE) url <- paste0( "ftp://win-builder.r-project.org/", version, "/", path_file(built_path) ) lapply(url, upload_ftp, file = built_path) if (!quiet) { time <- strftime(Sys.time() + 30 * 60, "%I:%M %p") email <- maintainer(pkg)$email cli::cli_alert_success( "[{Sys.Date()}] Check <{.email {email}}> for a link to results in 15-30 mins (~{time})." ) } invisible() } change_maintainer_email <- function(desc, email) { desc <- desc::desc(file = desc) if (!desc$has_fields("Authors@R")) { stop("DESCRIPTION must use `Authors@R` field to change the maintainer email", call. = FALSE) } aut <- desc$get_authors() roles <- aut$role ## Broken person() API, vector for 1 author, list otherwise... if (!is.list(roles)) roles <- list(roles) is_maintainer <- vapply(roles, function(r) all("cre" %in% r), logical(1)) aut[is_maintainer]$email <- email desc$set_authors(aut) ## Check if the email is actually changed before we actually send the email if(!grepl(email, desc$get_maintainer())){ stop("Changing maintainer email failed. Possible reason is using both Authors@R and Maintainer fields in the DESCRIPTION file.", call. = FALSE) } desc$write() } upload_ftp <- function(file, url, verbose = FALSE) { rlang::check_installed("curl") stopifnot(file_exists(file)) stopifnot(is.character(url)) con <- file(file, open = "rb") on.exit(close(con), add = TRUE) h <- curl::new_handle(upload = TRUE, filetime = FALSE) curl::handle_setopt(h, readfunction = function(n) { readBin(con, raw(), n = n) }, verbose = verbose) curl::curl_fetch_memory(url, handle = h) } devtools/R/revdep.R0000644000175000017500000000553314031104013014045 0ustar nileshnilesh#' Reverse dependency tools. #' #' Tools to check and notify maintainers of all CRAN and Bioconductor #' packages that depend on the specified package. #' #' The first run in a session will be time-consuming because it must download #' all package metadata from CRAN and Bioconductor. Subsequent runs will #' be faster. #' #' @param pkg Package name. This is unlike most devtools packages which #' take a path because you might want to determine dependencies for a package #' that you don't have installed. If omitted, defaults to the name of the #' current package. #' @param ignore A character vector of package names to ignore. These packages #' will not appear in returned vector. #' @param dependencies A character vector listing the types of dependencies #' to follow. #' @param bioconductor If `TRUE` also look for dependencies amongst #' Bioconductor packages. #' @param recursive If `TRUE` look for full set of recursive dependencies. #' @seealso The [revdepcheck](https://github.com/r-lib/revdepcheck) package can #' be used to run R CMD check on all reverse dependencies. #' @export #' @keywords internal #' @examples #' \dontrun{ #' revdep("ggplot2") #' #' revdep("ggplot2", ignore = c("xkcd", "zoo")) #' } revdep <- function(pkg, dependencies = c("Depends", "Imports", "Suggests", "LinkingTo"), recursive = FALSE, ignore = NULL, bioconductor = FALSE) { if (missing(pkg)) pkg <- as.package(".")$package all <- if (bioconductor) packages() else cran_packages() deps <- tools::dependsOnPkgs(pkg, dependencies, recursive, installed = all) deps <- setdiff(deps, ignore) sort_ci(deps) } #' @rdname revdep #' @export revdep_maintainers <- function(pkg = ".") { if (missing(pkg)) pkg <- as.package(".")$package maintainers <- unique(packages()[revdep(pkg), "Maintainer"]) class(maintainers) <- "maintainers" maintainers } #' @export print.maintainers <- function(x, ...) { x <- gsub("\n", " ", x) cat(x, sep = ",\n") cat("\n") } # Package caches ---------------------------------------------------------- cran_packages <- memoise::memoise( function() { local <- path_temp("packages.rds") utils::download.file("https://cran.R-project.org/web/packages/packages.rds", local, mode = "wb", quiet = TRUE ) on.exit(file_delete(local)) cp <- readRDS(local) rownames(cp) <- unname(cp[, 1]) cp }, ~memoise::timeout(30 * 60) ) bioc_packages <- memoise::memoise( function(views = paste(BiocManager::repositories()[["BioCsoft"]], "VIEWS", sep = "/")) { con <- url(views) on.exit(close(con)) bioc <- read.dcf(con) rownames(bioc) <- bioc[, 1] bioc }, ~memoise::timeout(30 * 60) ) packages <- function() { bioc <- bioc_packages() cran <- cran_packages() cols <- intersect(colnames(cran), colnames(bioc)) rbind(cran[, cols], bioc[, cols]) } devtools/R/utils.R0000644000175000017500000000332514144743346013744 0ustar nileshnileshcompact <- function(x) { is_empty <- vapply(x, function(x) length(x) == 0, logical(1)) x[!is_empty] } "%||%" <- function(a, b) if (!is.null(a)) a else b "%:::%" <- function(p, f) { get(f, envir = asNamespace(p)) } # Modified version of utils::file_ext. Instead of always returning the text # after the last '.', as in "foo.tar.gz" => ".gz", if the text that directly # precedes the last '.' is ".tar", it will include also, so # "foo.tar.gz" => ".tar.gz" file_ext <- function(x) { pos <- regexpr("\\.((tar\\.)?[[:alnum:]]+)$", x) ifelse(pos > -1L, substring(x, pos + 1L), "") } is_windows <- isTRUE(.Platform$OS.type == "windows") sort_ci <- function(x) { withr::with_collate("C", x[order(tolower(x), x)]) } is_loaded <- function(pkg = ".") { pkg <- as.package(pkg) pkg$package %in% loadedNamespaces() } is_attached <- function(pkg = ".") { pkg <- as.package(pkg) !is.null(pkgload::pkg_env(pkg$package)) } # This is base::trimws from 3.2 on trim_ws <- function(x, which = c("both", "left", "right")) { which <- match.arg(which) mysub <- function(re, x) sub(re, "", x, perl = TRUE) if (which == "left") { return(mysub("^[ \t\r\n]+", x)) } if (which == "right") { return(mysub("[ \t\r\n]+$", x)) } mysub("[ \t\r\n]+$", mysub("^[ \t\r\n]+", x)) } menu <- function(...) { utils::menu(...) } escape_special_regex <- function(x) { chars <- c("*", ".", "?", "^", "+", "$", "|", "(", ")", "[", "]", "{", "}", "\\") gsub(paste0("([\\", paste0(collapse = "\\", chars), "])"), "\\\\\\1", x, perl = TRUE) } vcapply <- function(x, FUN, ...) { vapply(x, FUN, FUN.VALUE = character(1), ...) } release_bullets <- function() { c( '`usethis::use_latest_dependencies(TRUE, "CRAN")`', NULL ) } devtools/R/package-deps.R0000644000175000017500000000022113401234762015110 0ustar nileshnilesh#' @importFrom pkgload parse_deps #' @export pkgload::parse_deps #' @importFrom pkgload check_dep_version #' @export pkgload::check_dep_version devtools/R/show-news.R0000644000175000017500000000136514031104013014511 0ustar nileshnilesh#' Show package news #' #' @template devtools #' @param latest if `TRUE`, only show the news for the most recent #' version. #' @param ... other arguments passed on to `news` #' @export show_news <- function(pkg = ".", latest = TRUE, ...) { pkg <- as.package(pkg) news_path <- path(pkg$path, "NEWS") if (!file_exists(news_path)) { stop("No NEWS found", call. = FALSE) } check_dots_used(action = getOption("devtools.ellipsis_action", rlang::warn)) out <- utils::news(..., db = ("tools" %:::% ".news_reader_default")(news_path)) if (latest) { ver <- numeric_version(out$Version) recent <- ver == max(ver) structure(out[recent, ], class = class(out), bad = attr(out, "bad")[recent] ) } else { out } } devtools/R/active.R0000644000175000017500000000237014054166611014050 0ustar nileshnileshfind_active_file <- function(arg = "file") { if (!rstudioapi::isAvailable()) { stop("Argument `", arg, "` is missing, with no default", call. = FALSE) } normalizePath(rstudioapi::getSourceEditorContext()$path) } find_test_file <- function(path) { type <- test_file_type(path) if (any(is.na(type))) { rlang::abort(c( "Don't know how to find tests associated with the active file:", path[is.na(type)] )) } is_test <- type == "test" path[!is_test] <- paste0("tests/testthat/test-", name_source(path[!is_test]), ".R") path <- unique(path[file_exists(path)]) if (length(path) == 0) { rlang::abort("No test files found") } path } test_file_type <- function(path) { dir <- path_file(path_dir(path)) name <- path_file(path) ext <- tolower(path_ext(path)) src_ext <- c("c", "cc", "cpp", "cxx", "h", "hpp", "hxx") type <- rep(NA_character_, length(path)) type[dir == "R" & ext == "r"] <- "R" type[dir == "testthat" & ext == "r" & grepl("^test", name)] <- "test" type[dir == "src" & ext %in% src_ext] <- "src" type } # Figure out "name" of a test or source file name_test <- function(path) { gsub("^test[-_]", "", name_source(path)) } name_source <- function(path) { path_ext_remove(path_file(path)) } devtools/R/session-info.R0000644000175000017500000000166313401234762015213 0ustar nileshnilesh#' Return a vector of names of attached packages #' @export #' @keywords internal #' @return A data frame with columns package and path, giving the name of #' each package and the path it was loaded from. loaded_packages <- function() { attached <- data.frame( package = search(), path = searchpaths(), stringsAsFactors = FALSE ) packages <- attached[grepl("^package:", attached$package), , drop = FALSE] rownames(packages) <- NULL packages$package <- sub("^package:", "", packages$package) packages } #' Return a vector of names of packages loaded by devtools #' @export #' @keywords internal dev_packages <- function() { packages <- vapply( loadedNamespaces(), function(x) !is.null(pkgload::dev_meta(x)), logical(1) ) names(packages)[packages] } #' @export #' @importFrom sessioninfo session_info sessioninfo::session_info #' @export #' @importFrom sessioninfo package_info sessioninfo::package_info devtools/R/check.R0000644000175000017500000002013714031104013013632 0ustar nileshnilesh#' Build and check a package, cleaning up automatically on success. #' #' `check` automatically builds and checks a source package, using all #' known best practices. `check_built` checks an already built package. #' #' Passing `R CMD check` is essential if you want to submit your package #' to CRAN: you must not have any ERRORs or WARNINGs, and you want to ensure #' that there are as few NOTEs as possible. If you are not submitting to CRAN, #' at least ensure that there are no ERRORs or WARNINGs: these typically #' represent serious problems. #' #' `check` automatically builds a package before calling `check_built` #' as this is the recommended way to check packages. Note that this process #' runs in an independent realisation of R, so nothing in your current #' workspace will affect the process. #' #' @section Environment variables: #' #' Devtools does its best to set up an environment that combines best practices #' with how check works on CRAN. This includes: #' #' \itemize{ #' #' \item The standard environment variables set by devtools: #' [r_env_vars()]. Of particular note for package tests is the #' `NOT_CRAN` env var which lets you know that your tests are not #' running on CRAN, and hence can take a reasonable amount of time. #' #' \item Debugging flags for the compiler, set by #' \code{\link{compiler_flags}(FALSE)}. #' #' \item If `aspell` is found `_R_CHECK_CRAN_INCOMING_USE_ASPELL_` #' is set to `TRUE`. If no spell checker is installed, a warning is #' issued.) #' #' \item env vars set by arguments `incoming`, `remote` and #' `force_suggests` #' } #' #' @return An object containing errors, warnings, and notes. #' @template devtools #' @param document By default (`NULL`) will document if your installed #' roxygen2 version matches the version declared in the `DESCRIPTION` #' file. Use `TRUE` or `FALSE` to override the default. #' @param build_args Additional arguments passed to `R CMD build` #' @param check_dir the directory in which the package is checked #' compatibility. `args = "--output=/foo/bar"` can be used to change the #' check directory. #' @param ... Additional arguments passed on to [pkgbuild::build()]. #' @param vignettes If `FALSE`, do not build or check vignettes, equivalent to #' using `args = '--ignore-vignettes' and `build_args = '--no-build-vignettes'. #' @param cleanup Deprecated. #' @seealso [release()] if you want to send the checked package to #' CRAN. #' @export check <- function(pkg = ".", document = NULL, build_args = NULL, ..., manual = FALSE, cran = TRUE, remote = FALSE, incoming = remote, force_suggests = FALSE, run_dont_test = FALSE, args = "--timings", env_vars = c(NOT_CRAN = "true"), quiet = FALSE, check_dir = tempdir(), cleanup = TRUE, vignettes = TRUE, error_on = c("never", "error", "warning", "note")) { pkg <- as.package(pkg) withr::local_options(list(warn = 1)) save_all() if (!missing(cleanup)) { warning("`cleanup` is deprecated", call. = FALSE) } if (missing(error_on) && !interactive()) { error_on <- "warning" } error_on <- match.arg(error_on) document <- document %||% can_document(pkg) if (document) { document(pkg, quiet = quiet) } if (!quiet) { cat_rule( left = "Building", right = pkg$package, col = "cyan" ) show_env_vars(pkgbuild::compiler_flags(FALSE)) } check_dots_used(action = getOption("devtools.ellipsis_action", rlang::warn)) if (identical(vignettes, FALSE)) { args <- union(args, "--ignore-vignettes") } withr::with_envvar(pkgbuild::compiler_flags(FALSE), action = "prefix", { built_path <- pkgbuild::build( pkg$path, tempdir(), args = build_args, quiet = quiet, manual = manual, vignettes = vignettes, ... ) on.exit(file_delete(built_path), add = TRUE) }) check_built( built_path, cran = cran, remote = remote, incoming = incoming, force_suggests = force_suggests, run_dont_test = run_dont_test, manual = manual, args = args, env_vars = env_vars, quiet = quiet, check_dir = check_dir, error_on = error_on ) } can_document <- function(pkg) { required <- pkg$roxygennote if (is.null(required)) { # Doesn't use roxygen2 at all return(FALSE) } installed <- packageVersion("roxygen2") if (required != installed) { cli::cli_rule() cli::cli_alert_info( "Installed roxygen2 version ({installed}) doesn't match required version ({required})" ) cli::cli_alert_danger("check() will not re-document this package") cli::cli_rule() FALSE } else { TRUE } } #' @export #' @rdname check #' @param path Path to built package. #' @param cran if `TRUE` (the default), check using the same settings as #' CRAN uses. #' @param remote Sets `_R_CHECK_CRAN_INCOMING_REMOTE_` env var. #' If `TRUE`, performs a number of CRAN incoming checks that require #' remote access. #' @param incoming Sets `_R_CHECK_CRAN_INCOMING_` env var. #' If `TRUE`, performs a number of CRAN incoming checks. #' @param force_suggests Sets `_R_CHECK_FORCE_SUGGESTS_`. If #' `FALSE` (the default), check will proceed even if all suggested #' packages aren't found. #' @param run_dont_test Sets `--run-donttest` so that tests surrounded in #' `\dontest{}` are also tested. When `cran = TRUE`, this only affects #' R 3.6 and earlier; in R 4.0.0 code in `\dontest{}` is always run as #' part of CRAN submission. #' @param manual If `FALSE`, don't build and check manual #' (`--no-manual`). #' @param env_vars Environment variables set during `R CMD check` #' @param quiet if `TRUE` suppresses output from this function. #' @inheritParams rcmdcheck::rcmdcheck check_built <- function(path = NULL, cran = TRUE, remote = FALSE, incoming = remote, force_suggests = FALSE, run_dont_test = FALSE, manual = FALSE, args = "--timings", env_vars = NULL, check_dir = tempdir(), quiet = FALSE, error_on = c("never", "error", "warning", "note")) { if (missing(error_on) && !interactive()) { error_on <- "warning" } error_on <- match.arg(error_on) pkgname <- gsub("_.*?$", "", path_file(path)) if (cran) { args <- c("--as-cran", args) } if (run_dont_test) { args <- c("--run-donttest", args) } if (manual && !pkgbuild::has_latex()) { cli::cli_alert_danger("pdflatex not found! Not building PDF manual or vignettes") manual <- FALSE } if (!manual) { args <- c(args, "--no-manual") } env_vars <- check_env_vars(cran, remote, incoming, force_suggests, env_vars) if (!quiet) { cat_rule( left = "Checking", right = pkgname, col = "cyan" ) show_env_vars(env_vars, trailing = FALSE) } withr::with_envvar(env_vars, action = "replace", { rcmdcheck::rcmdcheck(path, quiet = quiet, args = args, check_dir = check_dir, error_on = error_on ) }) } check_env_vars <- function(cran = FALSE, remote = FALSE, incoming = remote, force_suggests = TRUE, env_vars = character()) { c( aspell_env_var(), # Switch off expensive check for package version # https://github.com/r-lib/devtools/issues/1271 if (getRversion() >= "3.4.0" && as.numeric(R.version[["svn rev"]]) >= 70944) { c("_R_CHECK_CRAN_INCOMING_REMOTE_" = as.character(remote)) }, "_R_CHECK_CRAN_INCOMING_" = as.character(incoming), "_R_CHECK_FORCE_SUGGESTS_" = as.character(force_suggests), env_vars ) } aspell_env_var <- function() { tryCatch({ utils::aspell(NULL) c("_R_CHECK_CRAN_INCOMING_USE_ASPELL_" = "TRUE") }, error = function(e) character()) } show_env_vars <- function(env_vars, trailing = TRUE) { cli::cat_line("Setting env vars:", col = "darkgrey") cat_bullet(paste0(format(names(env_vars)), ": ", unname(env_vars)), col = "darkgrey") if (trailing) { cat_rule(col = "cyan") } } devtools/R/uninstall.R0000644000175000017500000000152114031104013014562 0ustar nileshnilesh#' Uninstall a local development package. #' #' Uses `remove.package` to uninstall the package. #' To uninstall a package from a non-default library, #' use [withr::with_libpaths()]. #' #' @inheritParams install #' @param unload if `TRUE` (the default), will automatically unload the #' package prior to uninstalling. #' @inheritParams utils::remove.packages #' @export #' @family package installation #' @seealso [with_debug()] to install packages with debugging flags #' set. uninstall <- function(pkg = ".", unload = TRUE, quiet = FALSE, lib = .libPaths()[[1]]) { pkg <- as.package(pkg) if (unload && pkg$package %in% loaded_packages()$package) { pkgload::unload(pkg$package) } if (!quiet) { cli::cli_alert_info("Uninstalling {.pkg {pkg$package}}") } remove.packages(pkg$package, .libPaths()[[1]]) invisible(TRUE) } devtools/R/document.R0000644000175000017500000000200114044756641014411 0ustar nileshnilesh#' Use roxygen to document a package. #' #' This function is a wrapper for the [roxygen2::roxygenize()] #' function from the roxygen2 package. See the documentation and vignettes of #' that package to learn how to use roxygen. #' #' @template devtools #' @inheritParams roxygen2::roxygenise #' @param quiet if `TRUE` suppresses output from this function. #' @seealso [roxygen2::roxygenize()], #' `browseVignettes("roxygen2")` #' @export document <- function(pkg = ".", roclets = NULL, quiet = FALSE) { pkg <- as.package(pkg) if (!isTRUE(quiet)) { cli::cli_alert_info("Updating {.pkg {pkg$package}} documentation") } save_all() if (pkg$package == "roxygen2") { # roxygen2 crashes if it reloads itself load_all(pkg$path, quiet = quiet) } if (quiet) { output <- file_temp() withr::defer(file_delete(output)) withr::local_output_sink(output) } withr::local_envvar(r_env_vars()) roxygen2::roxygenise(pkg$path, roclets) pkgload::dev_topic_index_reset(pkg$package) invisible() } devtools/LICENSE0000644000175000017500000000005614031104013013234 0ustar nileshnileshYEAR: 2021 COPYRIGHT HOLDER: devtools authors devtools/inst/0000755000175000017500000000000014151174560013224 5ustar nileshnileshdevtools/inst/rstudio/0000755000175000017500000000000014107010220014674 5ustar nileshnileshdevtools/inst/rstudio/addins.dcf0000644000175000017500000000145114107010220016615 0ustar nileshnileshName: Run a test file Description: Run the current test file, using `devtools::test_active_file()`. Binding: test_active_file Interactive: true Name: Report test coverage for a file Description: Calculate and report test coverage for the current test file, using `devtools::test_coverage_active_file()`. Binding: test_coverage_active_file Interactive: true Name: Report test coverage for a package Description: Calculate and report the test coverage for the current package, using `devtools::test_coverage()`. Binding: test_coverage Interactive: true Name: Document a package Description: A wrapper for `roxygen`'s `roxygen2::roxygenize()` Binding: document Interactive: true Name: Run examples Description: Runs R code in examples using `devtools::run_examples()` Binding: run_examples Interactive: true devtools/inst/WORDLIST0000644000175000017500000000251714042601670014417 0ustar nileshnileshAllaire AppVeyor BiocInstaller Bioconductor Bitbucket BugReports Bugfix CMD CYGWIN Cheatsheet Chun Coallier DT ERRORs Fong GitLab Github HKCU HKLM Hadley JJ JSON Jefferis Kirill Kohske Kornelius Laake LinkingTo Lovell Makevars Maëlle Müller NOTEs README RStudio Rbuildignore Rcpp Redd Rmarkdown Rmd Rohmeyer Rprofile RTools SHA Studer Takahashi Titov UNC VignetteBuilder VignetteEncoding VignetteEngine VignetteIndexEntry WARNINGs Westlake Wickham Xie xxxx YAML Yihui addin addins al amongst args artefacts behaviour bioc bitbucket callr cleandoc cli codecov codemeta compileAttributes config covr cran dev devmode dir dplyr env envvar et fieldnames focussed forkable forseeable funder fs gcc gists github gitorious gui gz hadley http https hunspell importFrom initialising installable io json knitr landroni lexicographically libcurl libpaths linters lintr linux macOS maintainer's makefiles md mnel nchar nz objs pandoc param params passthrough pkgbuild pkgdown pkgload pkgs pre processx pryr rOpenSci randomises rcmdcheck rds readme realisation reinstalls repo repos revdep revdepcheck rgl rhub rlang rmarkdown roclet roxygen rstudio rstudioapi rtools sessioninfo sha snuck src srcreferences srcrefs subdir submodules summarised summarises svg synchronise testthat tex tgz toolchain travis trimws un uncommited usethis vectorised withr wordlists xyz yml devtools/inst/doc/0000755000175000017500000000000014151174560013771 5ustar nileshnileshdevtools/inst/doc/dependencies.html0000644000175000017500000004424414151174560017315 0ustar nileshnilesh Devtools dependencies

Devtools dependencies

Jim Hester, Hadley Wickham

2021-11-29

devtools/inst/doc/dependencies.Rmd0000644000175000017500000000642414145521433017067 0ustar nileshnilesh--- title: "Devtools dependencies" author: "Jim Hester, Hadley Wickham" date: "`r Sys.Date()`" output: rmarkdown::html_vignette: keep_md: true vignette: > %\VignetteIndexEntry{Devtools dependencies} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- # Package remotes Devtools version 1.9 supports package dependency installation for packages not yet in a standard package repository such as [CRAN](https://cran.r-project.org) or [Bioconductor](http://bioconductor.org). You can mark any regular dependency defined in the `Depends`, `Imports`, `Suggests` or `Enhances` fields as being installed from a remote location by adding the remote location to `Remotes` in your `DESCRIPTION` file. This will cause devtools to download and install them prior to installing your package (so they won't be installed from CRAN). The remote dependencies specified in `Remotes` should be described in the following form. ``` Remotes: [type::], [type2::] ``` The `type` is an optional parameter. If the type is missing the default is to install from GitHub. Additional remote dependencies should be separated by commas, just like normal dependencies elsewhere in the `DESCRIPTION` file. It is important to remember that you **must always declare the dependency in the usual way**, i.e. include it in `Depends`, `Imports`, `Suggests` or `Enhances`. The `Remotes` field only provides instructions on where to install the dependency from. In this example `DESCRIPTION` file, note how rlang appears in `Imports` and in `Remotes`: ``` Package: xyz Title: What the Package Does (One Line, Title Case) Version: 0.0.0.9000 Authors@R: person(given = "First", family = "Last", role = c("aut", "cre"), email = "first.last@example.com") Description: What the package does (one paragraph). License: MIT + file LICENSE Imports: rlang Remotes: r-lib/rlang ``` ### GitHub Because GitHub is the most commonly used unofficial package distribution in R, it's the default: ```yaml Remotes: hadley/testthat ``` You can also specify a specific hash, tag, or pull request (using the same syntax as `install_github()` if you want a particular commit. Otherwise the latest commit on the HEAD of the branch is used. ```yaml Remotes: hadley/httr@v0.4, klutometis/roxygen#142, hadley/testthat@c67018fa4970 ``` A type of `github` can be specified, but is not required ```yaml Remotes: github::hadley/ggplot2 ``` ### Other sources All of the currently supported install sources are available, see the 'See Also' section in `?install` for a complete list. ```yaml # GitLab Remotes: gitlab::jimhester/covr # Git Remotes: git::git@bitbucket.org:djnavarro/lsr.git # Bitbucket Remotes: bitbucket::sulab/mygene.r@default, djnavarro/lsr # Bioconductor Remotes: bioc::3.3/SummarizedExperiment#117513, bioc::release/Biobase # SVN Remotes: svn::https://github.com/tidyverse/stringr # URL Remotes: url::https://github.com/tidyverse/stringr/archive/main.zip # Local Remotes: local::/pkgs/testthat # Gitorious Remotes: gitorious::r-mpc-package/r-mpc-package ``` ### CRAN submission When you submit your package to CRAN, all of its dependencies must also be available on CRAN. For this reason, `release()` will warn you if you try to release a package with a `Remotes` field. devtools/NAMESPACE0000644000175000017500000000603114151174367013473 0ustar nileshnilesh# Generated by roxygen2: do not edit by hand S3method(print,dev_sitrep) S3method(print,maintainers) export(as.package) export(bash) export(build) export(build_manual) export(build_readme) export(build_rmd) export(build_site) export(build_vignettes) export(check) export(check_built) export(check_dep_version) export(check_mac_release) export(check_man) export(check_rhub) export(check_win_devel) export(check_win_oldrelease) export(check_win_release) export(clean_dll) export(clean_vignettes) export(create) export(dev_mode) export(dev_package_deps) export(dev_packages) export(dev_sitrep) export(document) export(find_rtools) export(github_pull) export(github_release) export(has_devel) export(has_tests) export(install) export(install_bioc) export(install_bitbucket) export(install_cran) export(install_deps) export(install_dev) export(install_dev_deps) export(install_git) export(install_github) export(install_gitlab) export(install_local) export(install_svn) export(install_url) export(install_version) export(is.package) export(lint) export(load_all) export(loaded_packages) export(missing_s3) export(package_file) export(package_info) export(parse_deps) export(r_env_vars) export(release) export(release_checks) export(reload) export(revdep) export(revdep_maintainers) export(run_examples) export(session_info) export(show_news) export(source_gist) export(source_url) export(spell_check) export(submit_cran) export(test) export(test_active_file) export(test_coverage) export(test_coverage_active_file) export(test_coverage_file) export(test_file) export(uninstall) export(unload) export(update_packages) export(uses_testthat) export(wd) export(with_debug) import(fs) importFrom(cli,cat_bullet) importFrom(cli,cat_rule) importFrom(ellipsis,check_dots_used) importFrom(memoise,memoise) importFrom(pkgbuild,clean_dll) importFrom(pkgbuild,find_rtools) importFrom(pkgbuild,has_devel) importFrom(pkgbuild,with_debug) importFrom(pkgload,check_dep_version) importFrom(pkgload,parse_deps) importFrom(pkgload,unload) importFrom(remotes,dev_package_deps) importFrom(remotes,github_pull) importFrom(remotes,github_release) importFrom(remotes,install_bioc) importFrom(remotes,install_bitbucket) importFrom(remotes,install_cran) importFrom(remotes,install_dev) importFrom(remotes,install_git) importFrom(remotes,install_github) importFrom(remotes,install_gitlab) importFrom(remotes,install_local) importFrom(remotes,install_svn) importFrom(remotes,install_url) importFrom(remotes,install_version) importFrom(remotes,update_packages) importFrom(sessioninfo,package_info) importFrom(sessioninfo,session_info) importFrom(stats,update) importFrom(usethis,ui_code) importFrom(usethis,ui_done) importFrom(usethis,ui_field) importFrom(usethis,ui_path) importFrom(usethis,ui_todo) importFrom(usethis,ui_value) importFrom(usethis,use_test) importFrom(utils,available.packages) importFrom(utils,contrib.url) importFrom(utils,install.packages) importFrom(utils,installed.packages) importFrom(utils,modifyList) importFrom(utils,packageDescription) importFrom(utils,packageVersion) importFrom(utils,remove.packages)

Package remotes

Devtools version 1.9 supports package dependency installation for packages not yet in a standard package repository such as CRAN or Bioconductor.

You can mark any regular dependency defined in the Depends, Imports, Suggests or Enhances fields as being installed from a remote location by adding the remote location to Remotes in your DESCRIPTION file. This will cause devtools to download and install them prior to installing your package (so they won’t be installed from CRAN).

The remote dependencies specified in Remotes should be described in the following form.

Remotes: [type::]<Repository>, [type2::]<Repository2>

The type is an optional parameter. If the type is missing the default is to install from GitHub. Additional remote dependencies should be separated by commas, just like normal dependencies elsewhere in the DESCRIPTION file.

It is important to remember that you must always declare the dependency in the usual way, i.e. include it in Depends, Imports, Suggests or Enhances. The Remotes field only provides instructions on where to install the dependency from. In this example DESCRIPTION file, note how rlang appears in Imports and in Remotes:

Package: xyz
Title: What the Package Does (One Line, Title Case)
Version: 0.0.0.9000
Authors@R: 
    person(given = "First",
           family = "Last",
           role = c("aut", "cre"),
           email = "first.last@example.com")
Description: What the package does (one paragraph).
License: MIT + file LICENSE
Imports: 
    rlang
Remotes:  
    r-lib/rlang

GitHub

Because GitHub is the most commonly used unofficial package distribution in R, it’s the default:

Remotes: hadley/testthat

You can also specify a specific hash, tag, or pull request (using the same syntax as install_github() if you want a particular commit. Otherwise the latest commit on the HEAD of the branch is used.

Remotes: hadley/httr@v0.4,
  klutometis/roxygen#142,
  hadley/testthat@c67018fa4970

A type of github can be specified, but is not required

Remotes: github::hadley/ggplot2

Other sources

All of the currently supported install sources are available, see the ‘See Also’ section in ?install for a complete list.

# GitLab
Remotes: gitlab::jimhester/covr

# Git
Remotes: git::git@bitbucket.org:djnavarro/lsr.git

# Bitbucket
Remotes: bitbucket::sulab/mygene.r@default, djnavarro/lsr

# Bioconductor
Remotes: bioc::3.3/SummarizedExperiment#117513, bioc::release/Biobase

# SVN
Remotes: svn::https://github.com/tidyverse/stringr

# URL
Remotes: url::https://github.com/tidyverse/stringr/archive/main.zip

# Local
Remotes: local::/pkgs/testthat

# Gitorious
Remotes: gitorious::r-mpc-package/r-mpc-package

CRAN submission

When you submit your package to CRAN, all of its dependencies must also be available on CRAN. For this reason, release() will warn you if you try to release a package with a Remotes field.