Skip to content

Commit

Permalink
novo argumento para a padronizar_enderecos()
Browse files Browse the repository at this point in the history
  • Loading branch information
dhersz committed Apr 19, 2024
1 parent 5e410ae commit 53cf6ea
Show file tree
Hide file tree
Showing 4 changed files with 126 additions and 44 deletions.
14 changes: 13 additions & 1 deletion R/enderecopadrao.R
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,16 @@
#' @keywords internal
"_PACKAGE"

utils::globalVariables(c("codigos_estados", "codigos_municipios"))
utils::globalVariables(
c(
"codigos_estados",
"codigos_municipios",
"logradouro",
"numero",
"complemento",
"cep",
"bairro",
"municipio",
"estado"
)
)
115 changes: 77 additions & 38 deletions R/padronizar_enderecos.R
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,15 @@
#' valor `NULL` são ignorados, e ao menos um valor diferente de nulo deve ser
#' fornecido. Caso deseje criar o vetor manualmente, note que seus nomes devem
#' ser os mesmos nomes dos parâmetros da função `correspondencia_campos()`.
#' @param manter_cols_extras Um logical. Se colunas não especificadas em
#' `campos_do_endereco` devem ser mantidas ou não (por exemplo, uma coluna de
#' id do conjunto de dados sendo padronizado). Por padrão, `TRUE`.
#'
#' @return Um dataframe com os campos de endereço padronizados.
#'
#' @examples
#' enderecos <- data.frame(
#' id = 1,
#' logradouro = "r ns sra da piedade",
#' nroLogradouro = 20,
#' complemento = "qd 20",
Expand All @@ -37,68 +41,103 @@
#' estado = "uf_dom"
#' )
#'
#' enderecos_padronizados <- padronizar_enderecos(enderecos, campos)
#' enderecos_padronizados
#' padronizar_enderecos(enderecos, campos)
#'
#' padronizar_enderecos(enderecos, campos, manter_cols_extras = FALSE)
#'
#' @export
padronizar_enderecos <- function(
enderecos,
campos_do_endereco = correspondencia_campos()
campos_do_endereco = correspondencia_campos(),
manter_cols_extras = TRUE
) {
checkmate::assert_data_frame(enderecos)
checkmate::assert_logical(manter_cols_extras, any.missing = FALSE, len = 1)
checa_campos_do_endereco(campos_do_endereco, enderecos)

campos_presentes <- names(campos_do_endereco)[!is.null(campos_do_endereco)]
enderecos_padrao <- data.table::as.data.table(enderecos)

campos_extras <- setdiff(
names(enderecos),
c(campos_do_endereco, names(campos_do_endereco))
)
campos_finais <- if (manter_cols_extras) {
c(campos_extras, names(campos_do_endereco))
} else {
names(campos_do_endereco)
}

enderecos_padrao <- data.table::data.table()
enderecos_padrao[
,
(names(campos_do_endereco)) := character(nrow(enderecos))
]
if ("logradouro" %in% campos_finais) {
enderecos_padrao[
,
logradouro := padronizar_logradouros(
enderecos[[campos_do_endereco["logradouro"]]]
)
]
}

if ("logradouro" %in% campos_presentes) {
enderecos_padrao$logradouro <- padronizar_logradouros(
enderecos[[campos_do_endereco["logradouro"]]]
)
if ("numero" %in% campos_finais) {
enderecos_padrao[
,
numero := padronizar_numeros(
enderecos[[campos_do_endereco["numero"]]]
)
]
}

if ("numero" %in% campos_presentes) {
enderecos_padrao$numero <- padronizar_numeros(
enderecos[[campos_do_endereco["numero"]]]
)
if ("complemento" %in% campos_finais) {
enderecos_padrao[
,
complemento := padronizar_complementos(
enderecos[[campos_do_endereco["complemento"]]]
)
]
}

if ("complemento" %in% campos_presentes) {
enderecos_padrao$complemento <- padronizar_complementos(
enderecos[[campos_do_endereco["complemento"]]]
)
if ("cep" %in% campos_finais) {
enderecos_padrao[
,
cep := padronizar_ceps(
enderecos[[campos_do_endereco["cep"]]]
)
]
}

if ("cep" %in% campos_presentes) {
enderecos_padrao$cep <- padronizar_ceps(
enderecos[[campos_do_endereco["cep"]]]
)
if ("bairro" %in% campos_finais) {
enderecos_padrao[
,
bairro := padronizar_bairros(
enderecos[[campos_do_endereco["bairro"]]]
)
]
}

if ("bairro" %in% campos_presentes) {
enderecos_padrao$bairro <- padronizar_bairros(
enderecos[[campos_do_endereco["bairro"]]]
)
if ("municipio" %in% campos_finais) {
enderecos_padrao[
,
municipio := padronizar_municipios(
enderecos[[campos_do_endereco["municipio"]]]
)
]
}

if ("municipio" %in% campos_presentes) {
enderecos_padrao$municipio <- padronizar_municipios(
enderecos[[campos_do_endereco["municipio"]]]
)
if ("estado" %in% campos_finais) {
enderecos_padrao[
,
estado := padronizar_estados(
enderecos[[campos_do_endereco["estado"]]]
)
]
}

if ("estado" %in% campos_presentes) {
enderecos_padrao$estado <- padronizar_estados(
enderecos[[campos_do_endereco["estado"]]]
)
campos_a_remover <- setdiff(names(enderecos), campos_finais)
enderecos_padrao[, (campos_a_remover) := NULL]

if (manter_cols_extras) {
data.table::setcolorder(enderecos_padrao, campos_extras)
}

return(enderecos_padrao)
return(enderecos_padrao[])
}

checa_campos_do_endereco <- function(campos_do_endereco, enderecos) {
Expand Down
16 changes: 13 additions & 3 deletions man/padronizar_enderecos.Rd

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

25 changes: 23 additions & 2 deletions tests/testthat/test-padronizar_enderecos.R
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
enderecos <- data.frame(
id = 1,
logradouro = "r ns sra da piedade",
numero = 20,
complemento = "qd 20",
Expand All @@ -17,8 +18,9 @@ tester <- function(enderecos = get("enderecos", envir = parent.frame()),
bairro = "bairro",
municipio = "municipio",
estado = "estado"
)) {
padronizar_enderecos(enderecos, campos_do_endereco)
),
manter_cols_extras = TRUE) {
padronizar_enderecos(enderecos, campos_do_endereco, manter_cols_extras)
}

test_that("da erro com inputs incorretos", {
Expand All @@ -27,6 +29,10 @@ test_that("da erro com inputs incorretos", {
expect_error(tester(campos_do_endereco = c(logradouro = 1)))
expect_error(tester(campos_do_endereco = c(oie = "logradouro")))
expect_error(tester(campos_do_endereco = c(logradouro = "oie")))

expect_error(tester(manter_cols_extras = 1))
expect_error(tester(manter_cols_extras = NA))
expect_error(tester(manter_cols_extras = c(TRUE, TRUE)))
})

test_that("retorna enderecos padronizados", {
Expand All @@ -35,6 +41,7 @@ test_that("retorna enderecos padronizados", {
expect_identical(
tester(),
data.table::data.table(
id = 1,
logradouro = "RUA NOSSA SENHORA DA PIEDADE",
numero = "20",
complemento = "QUADRA 20",
Expand All @@ -45,3 +52,17 @@ test_that("retorna enderecos padronizados", {
)
)
})

test_that("respeita manter_cols_extras", {
# as padronizacoes em si sao testadas em outros arquivos, aqui checamos apenas
# se os valores estao de fato sendo padronizados ou nao
expect_identical(
names(tester(manter_cols_extras = TRUE)),
c("id", "logradouro", "numero", "complemento", "cep", "bairro", "municipio", "estado")
)

expect_identical(
names(tester(manter_cols_extras = FALSE)),
c("logradouro", "numero", "complemento", "cep", "bairro", "municipio", "estado")
)
})

0 comments on commit 53cf6ea

Please sign in to comment.