• initializeLogging() now creates a WARN.log file to complete the suite of TRACE, DEBUG, INFO, WARN and ERROR.
  • Updated dependencies to R 4.0.0 and rlang 1.1.0.
  • initializeLogging() now properly uses filePrefix argument.
  • The timeStamp() function now defaults to lubridate::now("UTC") when no datetime is provided. This supports common use cases such as:
> timeStamp(unit = "hour")
[1] "2023102618"
> timeStamp(style = "clock")
[1] "2023-10-26T18:25:55"
  • Updated imports from futile.logger to avoid error messages like this: WARN [2023-08-29 14:06:58] Oops: object 'flog.appender' not found
  • Added createLocationMask() to identify invalid locations.
  • createLocationID() now defaults to algorithm = "geohash".
  • createLocationID() now returns the user specified invalidID for invalid locations rather than stopping with an error message.
  • Addressed CRAN package documentation issue.
  • `parseDatetime() now supports data formats with UTC offset: “2018-10-16 12:00:00+00:00”.
  • Added algorithm argument to createLocationID() to select between “digest” and “geohash”.

The “geohash” algorithm is preferred but the “digest” algorithm is retained (and the default) because several existing databases use the “digest” algorithm as a unique identifier.

  • Updated stopOnError() function documentation and associated vignette.
  • Updated stopOnError() with the following additional arguments: prefix, code, maxLength, truncatedLength, call..
  • Corrected documentation for timeStamp().
  • Fixed bug in dateRange() when creating single day date ranges.
  • Added "ymdThms" format to timeStamp().
  • Added "msec" unit option to timestamp().
  • Renamed default branch from ‘master’ to ‘main’.
  • Updated check_~() functions to use devtools::check() manual and run_dont_test arguments.
  • Fixed improper handling of single day date ranges in dateRange().

This version address a few issues encountered while using 0.3.11 in production.

  • New timeStamp() function creates character timestamps useful for labeling.
  • New dateSequence() function generates a sequence of POSIXct values that align with midnight local time even through the switch to/from daylight savings.
  • New loadDataFile() function supports loading data from local directories or URLs.
  • Added year-only support to parseDatetime() when parsing julian dates.
  • Renamed parsDatetime() argument julian to isJulian.
  • stopIfNull() and setIfNull() now issue stop(...) messages with call. = TRUE so that the stack information bubbles up.
  • Now exporting futile.logger::flog.logger() to avoid downstream complaints.
  • Added this package’s own date parsing functions to timezoneLintrules.

Added a suite of functions to easily run devtools::check() with different arguments: * check_fastest() * check_faster() * check_fast() * check() * check_slow() * check_slower() * check_slowest()

  • Added more lubridate functions to timezoneLintRules.

More consistency improvements to dateRange(). When specified, the days parameter now takes precedence over ceilingEnd when no enddate is specified.

Fully self-consistent package using internal functions wherever possible.

Various improvements after usage in an operational setting:

  • timezoneLintRules includes more date related functions.
  • Added quiet argument to parseDateTime().
  • timeRange() function now accepts unit and ceilingEnd arguments.
  • dateRange() function now accepts ceilingEnd argument.
  • More unit tests for dates and times.

The ceilingEnd argument addresses the ambiguity of a phrase like: “August 1-8”. With ceilingEnd = FALSE (default) this pharse means “through the beginning of Aug 8”. With ceilingEnd = TRUE it means “through the end of Aug 8”.

This version adds new convenience functions for dealing with NULL values in pipeline flow control.

New functions

Dealing with NULL values

In a lot of the data pipelines we build (web services, packages, etc.), we need to deal with the possibility of NULL inputs. Setting a default value or throwing an error are two of the most common ways NUll values are dealt with. While the code to handle this is straightforward to write, it is verbose and repetitive. setIfNull() and stopIfNull() are designed to abstract away boilerplate code, allowing us to focus on more important things.

  • Improved documentation for enddate in `dateRange().
  • Tweak for CRAN.
  • Renamed lintFunctionArgs_directory() to lintFunctionArgs_dir().
  • Added fullPath argument to linting functions.
  • Added date-parsing vignette.

This version focuses on enhancing the time utility capabilities of MazamaCoreUtils.

New functions

Function Argument Linting

In order to ensure that we are working with timezones consistently, the functions lintFunctionArgs_file() and lintFunctionArgs_directory() were created to parse R source files and determine if certain functions contained specific named arguments, based on a set of rules. A set of rules, timezoneLintRules, was created to check that all functions that accept a timezone have that argument explicitly fill, avoiding inconsistent default behavior.

Consolidating Time-Utility functions

PWFSLSmoke::parseDatetime() was moved into MazamaCoreUtils so more packages can benefit from it without importing the rest of PWFSLSmoke. Also, timeRange() was created to work as a function analogous to dateRange(), parsing time ranges instead of finding date ranges.

As part of this consolidation, more unit tests were added to the package.

  • Moved futile.logger from Depends to Imports.
  • Version bump.
  • Add linter
  • Add Rproj file
  • Minor style refactor
  • Added pkgdown documentation.
  • New vignettes for error-handling and logging.
  • Package now Depends: on futile.logger – avoids futile.logger not found error messages.
  • Additional logging unit tests.
  • Added maxFileAge parameter to cacheManagement() to help with removal of out-of-data products.
  • New dependencies on magrittr and rlang packages.
  • Minor cleanup and documentation improvements.
  • Initial functionality.