Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

logDetailsParseRecord #5

Merged
merged 4 commits into from
Dec 18, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions NEWS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
## Version 0.3.0

### Deprecated Functions

* `parseLogDetails()` is deprecated; use `logDetailsParseRecord()` instead.
* `parseLogDetailsToInstance()` is deprecated; use `logDetailsParseRecordInstance()` instead.
53 changes: 53 additions & 0 deletions R/logParse.R
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@

logDetailsParseRecord <- function(details) {
pairs <- strsplit(details, ",(?=[^']*(?:'[^']*'[^']*)*$)", perl = TRUE)

pattern <- "(\\w+) = '(.*)'"
pattern_checkbox <- "(\\w+)\\((\\d+)\\) = (unchecked|checked)"

lapply(pairs, function(row_pairs){
# Initialize empty list
result <- list()

# Iterate over pairs and populate list
for (pair in row_pairs) {
if (grepl(pattern_checkbox, pair)) {
key <- sub(pattern_checkbox, "\\1___\\2", pair)
value <- sub(pattern_checkbox, "\\3", pair)

value <- gsub("unchecked", "0", value)
value <- gsub("checked", "1", value)

key <- gsub("^\\s+|\\s+$", "", key)
value <- gsub("^\\s+|\\s+$", "", value)

result[[key]] <- value
} else if(grepl(pattern, pair)) {
key <- sub(pattern, "\\1", pair)
value <- sub(pattern, "\\2", pair)

key <- gsub("^\\s+|\\s+$", "", key)
value <- gsub("^\\s+|\\s+$", "", value)

result[[key]] <- value
} else if(grepl("(Erase all data|\\[instance = \\d+\\]|\\[Erase survey responses and start survey over\\])", pair)) {
} else {
warning(paste("During parse logging details, encountered unparseable content:", pair))
}
}
return(result)
})
}

logDetailsParseRecordInstance <- function(details) {
pattern <- "\\[instance = (\\d+)\\]"

lapply(details, function(row_details){
if (grepl(pattern, row_details)) {
return(sub(pattern, "\\1", regmatches(row_details, gregexpr(pattern, row_details))[[1]]))
}
else{
return('1')
}
})
}
50 changes: 4 additions & 46 deletions R/parseLogs.R
Original file line number Diff line number Diff line change
@@ -1,53 +1,11 @@

parseLogDetails <- function(details) {
pairs <- strsplit(details, ",(?=[^']*(?:'[^']*'[^']*)*$)", perl = TRUE)
.Deprecated("logDetailsParseRecord")
logDetailsParseRecord(details)

pattern <- "(\\w+) = '(.*)'"
pattern_checkbox <- "(\\w+)\\((\\d+)\\) = (unchecked|checked)"

lapply(pairs, function(row_pairs){
# Initialize empty list
result <- list()

# Iterate over pairs and populate list
for (pair in row_pairs) {
if (grepl(pattern_checkbox, pair)) {
key <- sub(pattern_checkbox, "\\1___\\2", pair)
value <- sub(pattern_checkbox, "\\3", pair)

value <- gsub("unchecked", "0", value)
value <- gsub("checked", "1", value)

key <- gsub("^\\s+|\\s+$", "", key)
value <- gsub("^\\s+|\\s+$", "", value)

result[[key]] <- value
} else if(grepl(pattern, pair)) {
key <- sub(pattern, "\\1", pair)
value <- sub(pattern, "\\2", pair)

key <- gsub("^\\s+|\\s+$", "", key)
value <- gsub("^\\s+|\\s+$", "", value)

result[[key]] <- value
} else if(grepl("(Erase all data|\\[instance = \\d+\\]|\\[Erase survey responses and start survey over\\])", pair)) {
} else {
warning(paste("During parse logging details, encountered unparseable content:", pair))
}
}
return(result)
})
}

parseLogDetailsToInstance <- function(details) {
pattern <- "\\[instance = (\\d+)\\]"

lapply(details, function(row_details){
if (grepl(pattern, row_details)) {
return(sub(pattern, "\\1", regmatches(row_details, gregexpr(pattern, row_details))[[1]]))
}
else{
return('1')
}
})
.Deprecated("logDetailsParseRecordInstance")
logDetailsParseRecordInstance(details)
}
12 changes: 6 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@
rcUtils is an R library providing utility functions for parsing and analyzing log data. It includes:

## Functions
### parseLogDetails
### logDetailsParseRecord
Extracts key-value pairs from log details.
### parseLogDetailsToInstance
### logDetailsParseRecordInstance
Extracts instance numbers from log details.
### logFilter
Filters log actions based on specified types.
Expand All @@ -30,10 +30,10 @@ log <- data.frame(
)

# Parse log details
log$detailObj <- parseLogDetails(log$details)
log$detailObj <- logDetailsParseRecord(log$details)

# Extract instance numbers
log$instance <- parseLogDetailsToInstance(log$details)
log$instance <- logDetailsParseRecordInstance(log$details)

# Filter log actions
types <- c("manage", "export")
Expand All @@ -42,8 +42,8 @@ log[selected,]

```
## Features
* parseLogDetails: Extracts key-value pairs from log details.
* parseLogDetailsToInstance: Extracts instance numbers from log details.
* logDetailsParseRecord: Extracts key-value pairs from log details.
* logDetailsParseRecordInstance: Extracts instance numbers from log details.
* logFilter: Filters log actions based on specified types.

## Documentation
Expand Down
29 changes: 29 additions & 0 deletions man/logDetailsParseRecord.Rd
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
\name{logDetailsParseRecord}
\alias{logDetailsParseRecord}
\title{Parse Log Details into Key-Value Pairs}
\description{
Parse log details into a list of key-value pairs, handling checkboxes and instance numbers.
}
\usage{
logDetailsParseRecord(details)
}
\arguments{
\item{details}{Character string containing log details.}
}
\value{
A list of key-value pairs parsed from the log details.
}
\examples{
log_details <- "name = 'John', age = '30', hobbies(1) = checked"
parsed_details <- logDetailsParseRecord(log_details)
print(parsed_details)
}
\seealso{
\code{logDetailsParseRecordInstance()}
}
\author{
Lynne & Jubilee
}
\note{
Replaces deprecated parseLogDetails() function.
}
29 changes: 29 additions & 0 deletions man/logDetailsParseRecordInstance.Rd
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
\name{logDetailsParseRecordInstance}
\alias{logDetailsParseRecordInstance}
\title{Extract Instance Numbers from Log Details}
\description{
Extract instance numbers from log details, defaulting to 1 if not found.
}
\usage{
logDetailsParseRecordInstance(details)
}
\arguments{
\item{details}{Character vector containing log details.}
}
\value{
A character vector of instance numbers parsed from the log details.
}
\examples{
log_details <- c("[instance = 123] name = 'John', age = '30'", "name = 'Jane', age = '25'")
instance_numbers <- logDetailsParseRecordInstance(log_details)
print(instance_numbers)
}
\seealso{
\code{logDetailsParseRecord()}
}
\author{
Lynne & Jubilee
}
\note{
Replaces deprecated parseLogDetailsToInstance() function.
}
25 changes: 13 additions & 12 deletions man/parseLogDetails.Rd
Original file line number Diff line number Diff line change
@@ -1,30 +1,31 @@
\name{parseLogDetails}
\alias{parseLogDetails}
\title{Parse Log Details}
\title{Parse Log Details (Deprecated)}
\description{
Parse log details into a list of key-value pairs.
Parse log details into a list of key-value pairs.
Deprecation Notice
This function is deprecated since version 0.3.0. Use \code{logDetailsParseRecord()} instead.
}
\usage{
parseLogDetails(details)
parseLogDetails(details)
}
\arguments{
\item{details}{Character string containing log details.}
\item{details}{Character string containing log details.}
}
\value{
A list of key-value pairs parsed from the log details.
A list of key-value pairs parsed from the log details.
}
\examples{
# Example usage
log_details <- "name = 'John', age = '30', hobbies(1) = checked"
parsed_details <- parseLogDetails(log_details)
print(parsed_details)
log_details <- "name = 'John', age = '30', hobbies(1) = checked"
parsed_details <- logDetailsParseRecord(log_details)
print(parsed_details)
}
\seealso{
# Optional: related functions or packages
\code{logDetailsParseRecord()}
}
\author{
Lynne & Jubilee
Lynne & Jubilee
}
\note{
# Optional: additional notes or warnings
Use \code{logDetailsParseRecord()} instead.
}
25 changes: 18 additions & 7 deletions man/parseLogDetailsToInstance.Rd
Original file line number Diff line number Diff line change
@@ -1,19 +1,30 @@
\name{parseLogDetailsToInstance}
\alias{parseLogDetailsToInstance}
\title{Extract Instance Numbers from Log Details}
\title{Extract Instance Numbers from Log Details (Deprecated)}
\description{
Extracts instance numbers from log details.
Extracts instance numbers from log details.
Deprecation Notice
This function is deprecated since version 0.3.0. Use \code{logDetailsParseRecordInstance()} instead.
}
\usage{
parseLogDetailsToInstance(details)
parseLogDetailsToInstance(details)
}
\arguments{
\item{details}{A character vector containing log details.}
\item{details}{A character vector containing log details.}
}
\value{
A character vector of instance numbers parsed from the log details.
A character vector of instance numbers parsed from the log details.
}
\examples{
log_details <- "[instance = 123] name = 'John', age = '30'"
result <- parseLogDetailsToInstance(log_details)
log_details <- "[instance = 123] name = 'John', age = '30'"
result <- logDetailsParseRecordInstance(log_details)
}
\seealso{
\code{logDetailsParseRecordInstance()}
}
\author{
Lynne & Jubilee
}
\note{
Use \code{logDetailsParseRecordInstance()} instead.
}
40 changes: 20 additions & 20 deletions tests/testthat/test-parseLogs.R → tests/testthat/test-logParse.R
Original file line number Diff line number Diff line change
@@ -1,80 +1,80 @@
# test-parseLogs.R

# Test case 1: Simple key-value pair
test_that("parseLogDetails works for simple key-value pair", {
test_that("logDetailsParseRecord works for simple key-value pair", {
test_details <- "name = 'John', age = '30'"
result <- parseLogDetails(test_details)[[1]]
result <- logDetailsParseRecord(test_details)[[1]]
expected <- list(name = "John", age = "30")
expect_equal(result, expected)
})

# Test case 2: Checkbox key-value pair
test_that("parseLogDetails works for checkbox key-value pair", {
test_that("logDetailsParseRecord works for checkbox key-value pair", {
test_details <- "hobbies(1) = checked, hobbies(2) = unchecked"
result <- parseLogDetails(test_details)[[1]]
result <- logDetailsParseRecord(test_details)[[1]]
expected <- list(hobbies___1 = "1", hobbies___2 = "0")
expect_equal(result, expected)
})

# Test case 3: Mixed key-value pairs
test_that("parseLogDetails works for mixed key-value pairs", {
test_that("logDetailsParseRecord works for mixed key-value pairs", {
test_details <- "name = 'Jane', hobbies(1) = checked, age = '25', hobbies(2) = unchecked"
result <- parseLogDetails(test_details)[[1]]
result <- logDetailsParseRecord(test_details)[[1]]
expected <- list(name = "Jane", hobbies___1 = "1", age = "25", hobbies___2 = "0")
expect_equal(result, expected)
})

# Test case 4: Unparseable content
test_that("parseLogDetails warns for unparseable content", {
test_that("logDetailsParseRecord warns for unparseable content", {
test_details <- "name = 'Bob', invalid_content"
expect_warning(parseLogDetails(test_details), "unparseable content")
expect_warning(logDetailsParseRecord(test_details), "unparseable content")
})

# Test case 5: Empty input
test_that("parseLogDetails returns empty list for empty input", {
test_that("logDetailsParseRecord returns empty list for empty input", {
test_details <- ""
result <- parseLogDetails(test_details)[[1]]
result <- logDetailsParseRecord(test_details)[[1]]
expected <- list()
expect_equal(result, expected)
})

####

# Test case 1: Details with instance number
test_that("parseLogDetailsToInstance extracts instance number", {
test_that("logDetailsParseRecordInstance extracts instance number", {
test_details <- c("[instance = 123]", "[instance = 456]")
result <- parseLogDetailsToInstance(test_details)[[1]]
result <- logDetailsParseRecordInstance(test_details)[[1]]
expect_equal(result, '123')
})

# Test case 2: Details without instance number
test_that("parseLogDetailsToInstance returns '1' for no instance number", {
test_that("logDetailsParseRecordInstance returns '1' for no instance number", {
test_details <- c("No instance number")
result <- parseLogDetailsToInstance(test_details)[[1]]
result <- logDetailsParseRecordInstance(test_details)[[1]]
expected <- "1"
expect_equal(result, expected)
})

# Test case 3: Multiple details with and without instance number
test_that("parseLogDetailsToInstance handles multiple details", {
test_that("logDetailsParseRecordInstance handles multiple details", {
test_details <- c("[instance = 789]", "No instance number", "[instance = 1011]")
result <- parseLogDetailsToInstance(test_details)
result <- logDetailsParseRecordInstance(test_details)
expected <- list("789", "1", "1011")
expect_equal(result, expected)
})

# Test case 4: Empty details
test_that("parseLogDetailsToInstance returns '1' for empty details", {
test_that("logDetailsParseRecordInstance returns '1' for empty details", {
test_details <- c("")
result <- parseLogDetailsToInstance(test_details)
result <- logDetailsParseRecordInstance(test_details)
expected <- list("1")
expect_equal(result, expected)
})

# Test case 5: NA details
test_that("parseLogDetailsToInstance returns '1' for NA details", {
test_that("logDetailsParseRecordInstance returns '1' for NA details", {
test_details <- c(NA)
result <- parseLogDetailsToInstance(test_details)
result <- logDetailsParseRecordInstance(test_details)
expected <- list("1")
expect_equal(result, expected)
})
Loading