---
title: "dev_history.Rmd for working package"
format: html
editor_options: 
  chunk_output_type: console
---

```{r development}
#| include: false
library(testthat)
```

<!--
# Description of your package

This will fill the description of your package.
-->

```{r description}
# --> for parse tests
fusen::fill_description(
  pkg = here::here(),
  fields = list(
    Title = "Build A Package From Rmarkdown file",
    Description = "Use Rmarkdown First method to build your package. Start your package with documentation. Everything can be set from a Rmarkdown file in your project.",
    `Authors@R` = c(
      person("John", "Doe", email = "john@email.me", role = c("aut", "cre"), comment = c(ORCID = "0000-0000-0000-0000"))
    )
  )
)
# Define License with use_*_license()
usethis::use_mit_license("John Doe")
```

# Read data

<!-- Store your dataset in a directory named "inst/" at the root of your project -->
<!-- Use it for your tests in this Rmd thanks to `load_all()` to make it available
and `system.file()` to read it in your examples 
-->

```{r development-2}
# Set , error=TRUE for checks() if needed
# Run all in the console directly
# Create "inst/" directory
dir.create(here::here("inst"))
# Example dataset
file.copy(system.file("nyc_squirrels_sample.csv", package = "fusen"), here::here("inst"))
# Make your dataset file available to the current Rmd
pkgload::load_all(path = here::here(), export_all = FALSE)
# You will be able to read your example data file in each of your function examples and tests as follows
# For check() only, we need to shim system.file, otherwise base::system.file does not recognised load_all()
pkgload:::shim_system.file(package = "<my_package_name>")
system.file(package = "<my_package_name>")
list.files(system.file(package = "<my_package_name>"))
datafile <- system.file("nyc_squirrels_sample.csv", package = "<my_package_name>")
datafile <- pkgload:::shim_system.file("nyc_squirrels_sample.csv", package = "<my_package_name>")
here::here()
datafile
nyc_squirrels <- read.csv(datafile, encoding = "UTF-8")
```

# Calculate the median of a vector

```{r function}
#' My median
#'
#' @param x Vector of Numeric values
#' @inheritParams stats::median
#'
#' @return
#' Median of vector x
#' @export
#'
#' @examples
#' my_median(2:20)
my_median <- function(x, na.rm = TRUE) {
  if (!is.numeric(x)) {
    stop("x should be numeric")
  }
  stats::median(x, na.rm = na.rm)
}
```

```{r examples}
my_median(1:12)
```

```{r tests}
test_that("my_median works properly and show error if needed", {
  expect_error(my_median("text"))
})
```

# Calculate the mean of a vector
## Use sub-functions in the same chunk

```{r function-1}
#' My Other median
#'
#' @param x Vector of Numeric values
#' @inheritParams stats::median
#'
#' @return
#' Median of vector x
#' @export
#'
#' @examples
my_other_median <- function(x, na.rm = TRUE) {
  if (!is.numeric(x)) {
    stop("x should be numeric")
  }
  sub_median(x, na.rm = na.rm)
}

#' Core of the median not exported
#' @param x Vector of Numeric values
#' @inheritParams stats::median
sub_median <- function(x, na.rm = TRUE) {
  stats::median(x, na.rm)
}
```

```{r examples-1}
my_other_median(1:12)
my_other_median(8:20)
my_other_median(20:50)
```

```{r tests-1}
test_that("my_median works properly and show error if needed", {
  expect_true(my_other_median(1:12) == 6.5)
  expect_error(my_other_median("text"))
})
```

# The third median without example

```{r function-2}
#' My third median
#'
#' @param x Vector of Numeric values
#' @inheritParams stats::median
#'
#' @return
#' Median of vector x
#' @export
my_third_median <- function(x, na.rm = TRUE) {
  if (!is.numeric(x)) {
    stop("x should be numeric")
  }
  stats::median(x, na.rm = na.rm)
}
```


# The fourth median without example in but one out

```{r function-3}
#' My fourth median
#'
#' @param x Vector of Numeric values
#' @inheritParams stats::median
#'
#' @return
#' Median of vector x
#' @export
my_fourth_median <- function(x, na.rm = TRUE) {
  if (!is.numeric(x)) {
    stop("x should be numeric")
  }
  stats::median(x, na.rm = na.rm)
}
```

```{r examples-3}
my_fourth_median(1:12)
my_fourth_median(8:20)
```

# The fifth median without empty example and test

```{r function-4}
#' My fifth median
#'
#' @param x Vector of Numeric values
#' @inheritParams stats::median
#'
#' @return
#' Median of vector x
#' @export
my_fifth_median <- function(x, na.rm = TRUE) {
  if (!is.numeric(x)) {
    stop("x should be numeric")
  }
  stats::median(x, na.rm = na.rm)
}
```

```{r examples-4}
```

```{r tests-4}
```

# The sixth median with dot in function name

```{r function-6}
#' My sixth median
#'
#' @param x Vector of Numeric values
#' @inheritParams stats::median
#'
#' @return
#' Median of vector x
#' @export
my.sixth.median_function <- function(x, na.rm = TRUE) {
  if (!is.numeric(x)) {
    stop("x should be numeric")
  }
  stats::median(x, na.rm = na.rm)
}
```

```{r examples-6}
my.sixth.median_function(1:12)
my.sixth.median_function(8:20)
my.sixth.median_function(20:50)
```

```{r tests-6}
test_that("my.sixth.median_function works properly and show error if needed", {
  expect_true(my.sixth.median_function(1:12) == 6.5)
  expect_error(my.sixth.median_function("text"))
})
```

## Empty ones

```{r function-5}
```

```{r examples-5}
```

```{r tests-5}
```

## Uppercase names

```{r function-7}
#' MyUppercaseFunction
MyUppercaseFunction <- function() {
  message("hello")
}
```

```{r tests-7}
test_that("MyUppercaseFunction works properly and show error if needed", {
  expect_message(MyUppercaseFunction() == "hello")
})
```

# No roxygen and chunk named `fun` only

```{r fun}
my_norox <- function(x) {
  x + 10
}
```

# No roxygen with example, chunk named `fun-` and chunk named `ex-`

```{r fun-norox2}
my_norox2 <- function(x) {
  x + 10
}
```

```{r ex-norox2}
#| eval: false

#' \dontrun{
#' # comment
#' my_norox2(10)
#' }
#'
#' \dontrun{
# comment
my_norox2(12)
#' }
```

# space with function, chunk named `fun_`, chunk named `ex_` and extra or no space before `@`

```{r fun_space}
#' My space function
#'
#'   @param x Vector of Numeric values
#'
#' @return Median of vector x
#' @examples
#' @export

my_space <- function(x) {
  x + 10
}
```

```{r ex_space}
my_space(10)
```

# space with no export, chunk named `fun_`

```{r fun_space2}
#' My space 2 function
#'
#' @param x Vector of Numeric values
#'
#' @return Median of vector x
#' @examples
my_space2 <- function(x) {
  x + 10
}
```


# There can be development actions

These are only included in the present flat template file, their content will not be part of the package anywhere else.

```{r dev}
# Short chunk dev name not in vignette
```

```{r development-1}
#| eval: false

# Run but keep eval=FALSE to avoid infinite loop
# Execute in the console directly
fusen::inflate(flat_file = "dev/dev-template-tests.qmd")
```


# Inflate your package

```{r}
# duplicate empty name
```

```{r}
# duplicate empty name
```


You're one inflate from paper to box.
Build your package from this very Rmd using `fusen::inflate()`

- Verify your `"DESCRIPTION"` file has been updated
- Verify your function is in `"R/"` directory
- Verify your test is in `"tests/testthat/"` directory
- Verify this Rmd appears in `"vignettes/"` directory
