[med-svn] [r-cran-blob] 04/06: New upstream version 1.1.0
Andreas Tille
tille at debian.org
Wed Nov 29 13:55:09 UTC 2017
This is an automated email from the git hooks/post-receive script.
tille pushed a commit to branch master
in repository r-cran-blob.
commit fc1682252043971393a63a145686ba90318967dc
Author: Andreas Tille <tille at debian.org>
Date: Wed Nov 29 14:51:32 2017 +0100
New upstream version 1.1.0
---
DESCRIPTION | 29 ++++++++++++++++++
MD5 | 15 +++++++++
NAMESPACE | 24 +++++++++++++++
NEWS.md | 12 ++++++++
R/accessors.R | 27 ++++++++++++++++
R/blob.R | 63 ++++++++++++++++++++++++++++++++++++++
R/format.R | 49 +++++++++++++++++++++++++++++
R/missing.R | 14 +++++++++
R/util.R | 14 +++++++++
README.md | 38 +++++++++++++++++++++++
debian/README.test | 10 ------
debian/changelog | 13 --------
debian/compat | 1 -
debian/control | 26 ----------------
debian/copyright | 26 ----------------
debian/r-cran-blob.docs | 3 --
debian/rules | 5 ---
debian/source/format | 1 -
debian/tests/control | 9 ------
debian/tests/generic | 7 -----
debian/tests/run-unit-test | 17 ----------
debian/watch | 2 --
man/blob.Rd | 33 ++++++++++++++++++++
tests/testthat.R | 4 +++
tests/testthat/test-accessors.R | 24 +++++++++++++++
tests/testthat/test-construction.R | 7 +++++
tests/testthat/test-format.R | 43 ++++++++++++++++++++++++++
tests/testthat/test-missing.R | 13 ++++++++
28 files changed, 409 insertions(+), 120 deletions(-)
diff --git a/DESCRIPTION b/DESCRIPTION
new file mode 100644
index 0000000..e27eb6c
--- /dev/null
+++ b/DESCRIPTION
@@ -0,0 +1,29 @@
+Package: blob
+Title: A Simple S3 Class for Representing Vectors of Binary Data
+ ('BLOBS')
+Version: 1.1.0
+Authors at R: c(
+ person("Hadley", "Wickham", role = c("aut")),
+ person("Kirill", "Müller", , "krlmlr+r at mailbox.org", role = c("cre")),
+ person("RStudio", role = "cph")
+ )
+Description: R's raw vector is useful for storing a single binary object.
+ What if you want to put a vector of them in a data frame? The blob
+ package provides the blob object, a list of raw vectors, suitable for
+ use as a column in data frame.
+Imports: tibble
+License: GPL-3
+Encoding: UTF-8
+LazyData: true
+URL: https://github.com/hadley/blob
+BugReports: https://github.com/hadley/blob/issues
+Suggests: testthat, covr
+RoxygenNote: 6.0.1
+NeedsCompilation: no
+Packaged: 2017-06-17 04:01:59 UTC; muelleki
+Author: Hadley Wickham [aut],
+ Kirill Müller [cre],
+ RStudio [cph]
+Maintainer: Kirill Müller <krlmlr+r at mailbox.org>
+Repository: CRAN
+Date/Publication: 2017-06-17 14:57:46 UTC
diff --git a/MD5 b/MD5
new file mode 100644
index 0000000..8b97a65
--- /dev/null
+++ b/MD5
@@ -0,0 +1,15 @@
+7a10119e6809dda7a09988f373fe1979 *DESCRIPTION
+a70b94cf9c447530d8067af264787859 *NAMESPACE
+ecbf768d48f1a7ae3d69dbeb3d82724a *NEWS.md
+6db389b19ecd09d07b1a43ff03b70740 *R/accessors.R
+2f56178958c9a14ad503bbb8bd8fd0d6 *R/blob.R
+a19880454681cf2ace5b3be0e7b94a3c *R/format.R
+4aa476aef7a176a52f9559ba9742e347 *R/missing.R
+c85552e139c9e7fc2f9d332b86e5e4fc *R/util.R
+8fb575be9a5c8c5dbd7234f8b49bd81e *README.md
+2478bf628f24a684bf4056188c8715a6 *man/blob.Rd
+c37a14165e8d4b49908e517ea43960a7 *tests/testthat.R
+a1448eb53a4e9f79848795c3e8137620 *tests/testthat/test-accessors.R
+1a9850bdf5e584fb97ec983449bee362 *tests/testthat/test-construction.R
+afa75bcf2cbf61caf2ac91047f132c7e *tests/testthat/test-format.R
+57ce330853933b01f31f9b4413042b58 *tests/testthat/test-missing.R
diff --git a/NAMESPACE b/NAMESPACE
new file mode 100644
index 0000000..45d4185
--- /dev/null
+++ b/NAMESPACE
@@ -0,0 +1,24 @@
+# Generated by roxygen2: do not edit by hand
+
+S3method("[",blob)
+S3method("[<-",blob)
+S3method("[[<-",blob)
+S3method("is.na<-",blob)
+S3method(as.blob,blob)
+S3method(as.blob,character)
+S3method(as.blob,integer)
+S3method(as.blob,list)
+S3method(as.blob,raw)
+S3method(as.data.frame,blob)
+S3method(format,blob)
+S3method(is.na,blob)
+S3method(is_vector_s3,blob)
+S3method(obj_sum,blob)
+S3method(print,blob)
+S3method(type_sum,blob)
+export(as.blob)
+export(blob)
+export(new_blob)
+importFrom(tibble,is_vector_s3)
+importFrom(tibble,obj_sum)
+importFrom(tibble,type_sum)
diff --git a/NEWS.md b/NEWS.md
new file mode 100644
index 0000000..ce3787b
--- /dev/null
+++ b/NEWS.md
@@ -0,0 +1,12 @@
+# blob 1.1.0 (2017-06-17)
+
+- New maintainer: Kirill Müller.
+
+- Added `as.blob.blob()`and `as.data.frame.blob()` methods (#3).
+
+- Size of very large blobs is displayed correctly.
+
+
+# blob 1.0.0
+
+- Initial release.
diff --git a/R/accessors.R b/R/accessors.R
new file mode 100644
index 0000000..a5a3ef0
--- /dev/null
+++ b/R/accessors.R
@@ -0,0 +1,27 @@
+#' @export
+`[.blob` <- function(x, i, ...) {
+ new_blob(NextMethod())
+}
+
+#' @export
+`[<-.blob` <- function(x, i, ..., value) {
+ if (!is_raw_list(value)) {
+ stop("RHS must be list of raw vectors", call. = FALSE)
+ }
+
+ NextMethod()
+}
+
+#' @export
+`[[<-.blob` <- function(x, i, ..., value) {
+ if (!is.raw(value) && !is.null(value)) {
+ stop("RHS must be raw vector or NULL", call. = FALSE)
+ }
+
+ if (is.null(value)) {
+ x[i] <- list(NULL)
+ x
+ } else {
+ NextMethod()
+ }
+}
diff --git a/R/blob.R b/R/blob.R
new file mode 100644
index 0000000..478171a
--- /dev/null
+++ b/R/blob.R
@@ -0,0 +1,63 @@
+#' Construct a blob object
+#'
+#' \code{new_blob} is a low-level constructor that takes a list of
+#' raw vectors. \code{blob} constructs a blob from individual raw vectors,
+#' and \code{as.blob} is a S3 generic that converts existing objects.
+#'
+#' @param ... Individual raw vectors
+#' @param x A list of raw vectors, or other object to coerce
+#' @export
+#' @examples
+#' x1 <- charToRaw("Good morning")
+#' x2 <- as.raw(c(0x48, 0x65, 0x6c, 0x6c, 0x6f))
+#'
+#' new_blob(list(x1, x2))
+#' blob(x1, x2)
+#'
+#' as.blob(c("Good morning", "Good evening"))
+blob <- function(...) {
+ new_blob(list(...))
+}
+
+#' @export
+#' @rdname blob
+new_blob <- function(x) {
+ if (!is_raw_list(x)) {
+ stop("`x` must be a list of raw vectors", call. = FALSE)
+ }
+ structure(x, class = "blob")
+}
+
+#' @export
+#' @rdname blob
+as.blob <- function(x, ...) {
+ UseMethod("as.blob")
+}
+
+#' @export
+as.blob.blob <- function(x, ...) {
+ x
+}
+
+#' @export
+as.blob.list <- function(x, ...) {
+ new_blob(x)
+}
+
+#' @export
+as.blob.raw <- function(x, ...) {
+ new_blob(list(x))
+}
+
+#' @export
+as.blob.character <- function(x, ...) {
+ new_blob(lapply(x, charToRaw))
+}
+
+#' @export
+as.blob.integer <- function(x, ...) {
+ new_blob(lapply(x, as.raw))
+}
+
+#' @export
+as.data.frame.blob <- as.data.frame.difftime
diff --git a/R/format.R b/R/format.R
new file mode 100644
index 0000000..c214e0b
--- /dev/null
+++ b/R/format.R
@@ -0,0 +1,49 @@
+#' @export
+format.blob <- function(x, ...) {
+ if (length(x) == 0)
+ return(character())
+
+ ifelse(is.na(x), "<NA>", paste0("blob[", blob_size(x, ...) , "]"))
+}
+
+#' @export
+print.blob <- function(x, ...) {
+ if (length(x) == 0) {
+ cat("blob()\n")
+ } else {
+ print(format(x, ...), quote = FALSE)
+ }
+}
+
+#' @export
+#' @importFrom tibble type_sum
+type_sum.blob <- function(x) {
+ "blob"
+}
+
+#' @export
+#' @importFrom tibble obj_sum
+obj_sum.blob <- function(x) {
+ format(x, trim = FALSE)
+}
+
+#' @export
+#' @importFrom tibble is_vector_s3
+is_vector_s3.blob <- function(x) TRUE
+
+blob_size <- function(x, digits = 3, trim = TRUE, ...) {
+ x <- vapply(x, length, numeric(1))
+
+ units <- c("kb", "Mb", "Gb", "Tb")
+ power <- min(floor(log(abs(x), 1000)), length(units))
+ if (power < 1) {
+ unit <- "B"
+ } else {
+ unit <- units[[power]]
+ x <- x / (1024 ^ power)
+ }
+
+ x1 <- signif(x, digits = digits %||% 3)
+ x2 <- format(x1, big.mark = ",", scientific = FALSE, trim = trim)
+ paste0(x2, " ", unit)
+}
diff --git a/R/missing.R b/R/missing.R
new file mode 100644
index 0000000..c36fcbb
--- /dev/null
+++ b/R/missing.R
@@ -0,0 +1,14 @@
+#' @export
+is.na.blob <- function(x) {
+ vapply(x, is.null, logical(1))
+}
+
+#' @export
+`is.na<-.blob` <- function(x, value) {
+ if (!is.logical(value) || length(x) != length(value)) {
+ stop("RHS must be a logical the same length as `x`", call. = FALSE)
+ }
+
+ x[value] <- rep(list(NULL), sum(value))
+ x
+}
diff --git a/R/util.R b/R/util.R
new file mode 100644
index 0000000..5953dd7
--- /dev/null
+++ b/R/util.R
@@ -0,0 +1,14 @@
+is_raw_list <- function(x) {
+ if (!is.list(x))
+ return(FALSE)
+
+ raw <- vapply(x, is.raw, logical(1))
+ null <- vapply(x, is.null, logical(1))
+
+ if (!all(raw | null))
+ return(FALSE)
+
+ TRUE
+}
+
+`%||%` <- function(x, y) if (is.null(x)) y else x
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..05c8763
--- /dev/null
+++ b/README.md
@@ -0,0 +1,38 @@
+
+[![Travis-CI Build Status](https://travis-ci.org/tidyverse/blob.svg?branch=master)](https://travis-ci.org/tidyverse/blob) [![CRAN\_Status\_Badge](http://www.r-pkg.org/badges/version/blob)](https://cran.r-project.org/package=blob) [![Coverage Status](https://codecov.io/gh/tidyverse/blob/branch/master/graph/badge.svg)](https://codecov.io/github/tidyverse/blob?branch=master)
+
+<!-- README.md is generated from README.Rmd. Please edit that file -->
+blob
+====
+
+The goal of blob is to provide a simple S3 class to represent a vector of binary objects, aka blobs. The `blob` class is a lightweight wrapper around a list of raw vectors, suitable for inclusion in a data frame.
+
+In most cases you will not need to use this package explicitly: it will be used transparently by packages that need to load BLOB columns from databases or binary file formats.
+
+Installation
+------------
+
+You can install blob from github with:
+
+``` r
+# install.packages("devtools")
+devtools::install_github("tidyverse/blob")
+```
+
+Example
+-------
+
+To create a blob, use `blob()`, `new_blob()` or `as.blob()`:
+
+``` r
+x1 <- charToRaw("Good morning")
+x2 <- as.raw(c(0x48, 0x65, 0x6c, 0x6c, 0x6f))
+
+new_blob(list(x1, x2))
+#> [1] blob[12 B] blob[5 B]
+blob(x1, x2)
+#> [1] blob[12 B] blob[5 B]
+
+as.blob(c("Good morning", "Good evening"))
+#> [1] blob[12 B] blob[12 B]
+```
diff --git a/debian/README.test b/debian/README.test
deleted file mode 100644
index 4dbc14d..0000000
--- a/debian/README.test
+++ /dev/null
@@ -1,10 +0,0 @@
-Notes on how this package can be tested.
-────────────────────────────────────────
-
-To run the unit tests provided by the package you can do
-
- sh run-unit-test
-
-in this directory.
-
- -- Andreas Tille <tille at debian.org> Sat, 26 Aug 2017 00:10:39 +0200
diff --git a/debian/changelog b/debian/changelog
deleted file mode 100644
index 17ac48a..0000000
--- a/debian/changelog
+++ /dev/null
@@ -1,13 +0,0 @@
-r-cran-blob (1.1.0-2) unstable; urgency=medium
-
- * Team upload.
- * Rebuild for r-api-3.4 transition.
- * Bump Standards-Version to 4.1.1.
-
- -- Sébastien Villemot <sebastien at debian.org> Sat, 30 Sep 2017 18:54:08 +0200
-
-r-cran-blob (1.1.0-1) unstable; urgency=medium
-
- * Initial release (closes: #873272)
-
- -- Andreas Tille <tille at debian.org> Sat, 26 Aug 2017 00:33:36 +0200
diff --git a/debian/compat b/debian/compat
deleted file mode 100644
index f599e28..0000000
--- a/debian/compat
+++ /dev/null
@@ -1 +0,0 @@
-10
diff --git a/debian/control b/debian/control
deleted file mode 100644
index f4a59c9..0000000
--- a/debian/control
+++ /dev/null
@@ -1,26 +0,0 @@
-Source: r-cran-blob
-Maintainer: Debian Med Packaging Team <debian-med-packaging at lists.alioth.debian.org>
-Uploaders: Andreas Tille <tille at debian.org>
-Section: gnu-r
-Priority: optional
-Build-Depends: debhelper (>= 10),
- dh-r,
- r-base-dev,
- r-cran-tibble
-Standards-Version: 4.1.1
-Vcs-Browser: https://anonscm.debian.org/viewvc/debian-med/trunk/packages/R/r-cran-blob/trunk/
-Vcs-Svn: svn://anonscm.debian.org/debian-med/trunk/packages/R/r-cran-blob/trunk/
-Homepage: https://cran.r-project.org/package=blob
-
-Package: r-cran-blob
-Architecture: all
-Depends: ${R:Depends},
- ${shlibs:Depends},
- ${misc:Depends}
-Recommends: ${R:Recommends}
-Suggests: ${R:Suggests}
-Description: GNU R S3 Class for Representing Vectors of Binary Data ('BLOBS')
- R's raw vector is useful for storing a single binary object.
- What if you want to put a vector of them in a data frame? The blob
- package provides the blob object, a list of raw vectors, suitable for
- use as a column in data frame.
diff --git a/debian/copyright b/debian/copyright
deleted file mode 100644
index bca8692..0000000
--- a/debian/copyright
+++ /dev/null
@@ -1,26 +0,0 @@
-Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
-Upstream-Name: blob
-Upstream-Contact: Kirill Müller <krlmlr+r at mailbox.org>
-Source: https://cran.r-project.org/package=blob
-
-Files: *
-Copyright: Hadley Wickham, Kirill Müller, RStudio
-License: GPL-3
-
-Files: debian/*
-Copyright: 2017 Andreas Tille <tille at debian.org>
-License: GPL-3
-
-License: GPL-3
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; version 3 of the License.
- .
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- .
- On Debian systems, the complete text of the GNU General Public
- License can be found in `/usr/share/common-licenses/GPL-3'.
-
diff --git a/debian/r-cran-blob.docs b/debian/r-cran-blob.docs
deleted file mode 100644
index 6466d39..0000000
--- a/debian/r-cran-blob.docs
+++ /dev/null
@@ -1,3 +0,0 @@
-debian/tests/run-unit-test
-debian/README.test
-tests
diff --git a/debian/rules b/debian/rules
deleted file mode 100755
index 529c38a..0000000
--- a/debian/rules
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/usr/bin/make -f
-
-%:
- dh $@ --buildsystem R
-
diff --git a/debian/source/format b/debian/source/format
deleted file mode 100644
index 163aaf8..0000000
--- a/debian/source/format
+++ /dev/null
@@ -1 +0,0 @@
-3.0 (quilt)
diff --git a/debian/tests/control b/debian/tests/control
deleted file mode 100644
index 0cef8c2..0000000
--- a/debian/tests/control
+++ /dev/null
@@ -1,9 +0,0 @@
-Tests: run-unit-test
-Depends: @, r-cran-testthat,
-Restrictions: allow-stderr
-
-Tests: generic
-Depends: @, r-cran-testthat,
-Restrictions: allow-stderr
-
-
diff --git a/debian/tests/generic b/debian/tests/generic
deleted file mode 100644
index eb39c8e..0000000
--- a/debian/tests/generic
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/bin/sh -e
-
-for testfile in tests/*.R; do
- echo "BEGIN TEST $testfile"
- LC_ALL=C R --no-save < $testfile
-done
-
diff --git a/debian/tests/run-unit-test b/debian/tests/run-unit-test
deleted file mode 100644
index 88f6f20..0000000
--- a/debian/tests/run-unit-test
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/bin/sh -e
-
-pkgname=blob
-debname=r-cran-blob
-
-if [ "$ADTTMP" = "" ] ; then
- ADTTMP=`mktemp -d /tmp/${debname}-test.XXXXXX`
- trap "rm -rf $ADTTMP" 0 INT QUIT ABRT PIPE TERM
-fi
-cd $ADTTMP
-cp -a /usr/share/doc/$debname/tests/* $ADTTMP
-gunzip -r *
-for testfile in *.R; do
- echo "BEGIN TEST $testfile"
- LC_ALL=C R --no-save < $testfile
-done
-
diff --git a/debian/watch b/debian/watch
deleted file mode 100644
index 1cf54a8..0000000
--- a/debian/watch
+++ /dev/null
@@ -1,2 +0,0 @@
-version=4
-https://cran.r-project.org/src/contrib/blob_([-\d.]*)\.tar\.gz
diff --git a/man/blob.Rd b/man/blob.Rd
new file mode 100644
index 0000000..5ccfd2c
--- /dev/null
+++ b/man/blob.Rd
@@ -0,0 +1,33 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/blob.R
+\name{blob}
+\alias{blob}
+\alias{new_blob}
+\alias{as.blob}
+\title{Construct a blob object}
+\usage{
+blob(...)
+
+new_blob(x)
+
+as.blob(x, ...)
+}
+\arguments{
+\item{...}{Individual raw vectors}
+
+\item{x}{A list of raw vectors, or other object to coerce}
+}
+\description{
+\code{new_blob} is a low-level constructor that takes a list of
+raw vectors. \code{blob} constructs a blob from individual raw vectors,
+and \code{as.blob} is a S3 generic that converts existing objects.
+}
+\examples{
+x1 <- charToRaw("Good morning")
+x2 <- as.raw(c(0x48, 0x65, 0x6c, 0x6c, 0x6f))
+
+new_blob(list(x1, x2))
+blob(x1, x2)
+
+as.blob(c("Good morning", "Good evening"))
+}
diff --git a/tests/testthat.R b/tests/testthat.R
new file mode 100644
index 0000000..1137369
--- /dev/null
+++ b/tests/testthat.R
@@ -0,0 +1,4 @@
+library(testthat)
+library(blob)
+
+test_check("blob")
diff --git a/tests/testthat/test-accessors.R b/tests/testthat/test-accessors.R
new file mode 100644
index 0000000..af750c9
--- /dev/null
+++ b/tests/testthat/test-accessors.R
@@ -0,0 +1,24 @@
+context("accessors")
+
+test_that("subsetting blob returns blob", {
+ x <- as.blob(1:5)
+ expect_s3_class(x[1], "blob")
+})
+
+test_that("can't insert objects of incorrect type", {
+ x <- as.blob(1:5)
+
+ expect_error(x[[1]] <- 1, "must be raw vector")
+ expect_error(x[1] <- 1, "must be list of raw vectors")
+})
+
+test_that("can insert raw or NULL", {
+ x <- as.blob(1:4)
+
+ x[[1]] <- as.raw(0)
+ x[2] <- list(as.raw(0))
+ x[[3]] <- NULL
+ x[4] <- list(NULL)
+
+ expect_equal(x, blob(as.raw(0), as.raw(0), NULL, NULL))
+})
diff --git a/tests/testthat/test-construction.R b/tests/testthat/test-construction.R
new file mode 100644
index 0000000..407c21a
--- /dev/null
+++ b/tests/testthat/test-construction.R
@@ -0,0 +1,7 @@
+context("construction")
+
+test_that("input must be list of raw blobs", {
+ expect_error(new_blob(1), "must be a list of raw vectors")
+ expect_error(new_blob(list(1)), "must be a list of raw vectors")
+ expect_error(new_blob(list(1, as.raw(1))), "must be a list of raw vectors")
+})
diff --git a/tests/testthat/test-format.R b/tests/testthat/test-format.R
new file mode 100644
index 0000000..00799f4
--- /dev/null
+++ b/tests/testthat/test-format.R
@@ -0,0 +1,43 @@
+context("format")
+
+expect_format_equal <- function(formatted, result) {
+ expect_equal(
+ paste(formatted, collapse = "\n"),
+ paste(result, collapse = "\n")
+ )
+}
+
+test_that("unequal sizes", {
+ x <- blob(raw(2 ** 2), raw(2 ** 11), raw(2 ** 20))
+
+ expect_format_equal(
+ format(x),
+ c(
+ "blob[4 B]",
+ "blob[2,050 B]",
+ "blob[1,050,000 B]"
+ )
+ )
+
+ expect_format_equal(
+ format(x, trim = FALSE),
+ c(
+ "blob[ 4 B]",
+ "blob[ 2,050 B]",
+ "blob[1,050,000 B]"
+ )
+ )
+})
+
+test_that("similar sizes", {
+ x <- blob(raw(2 ** 10), raw(2 ** 11), raw(2 ** 12))
+
+ expect_format_equal(
+ format(x),
+ c(
+ "blob[1 kb]",
+ "blob[2 kb]",
+ "blob[4 kb]"
+ )
+ )
+})
diff --git a/tests/testthat/test-missing.R b/tests/testthat/test-missing.R
new file mode 100644
index 0000000..97cde21
--- /dev/null
+++ b/tests/testthat/test-missing.R
@@ -0,0 +1,13 @@
+context("missing")
+
+test_that("is.na detects nulls", {
+ x <- blob(as.raw(1), NULL, as.raw(2), NULL)
+ expect_equal(is.na(x), c(FALSE, TRUE, FALSE, TRUE))
+})
+
+test_that("is.na<- sets missing values", {
+ x <- as.blob(1:4)
+ is.na(x) <- (1:4 %% 2 == 0)
+
+ expect_equal(x, blob(as.raw(1), NULL, as.raw(3), NULL))
+})
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-med/r-cran-blob.git
More information about the debian-med-commit
mailing list