Skip to content

Commit 6ff3bbe

Browse files
authored
Merge pull request #341 from frictionlessdata/generic-version
Generic `version()`
2 parents 81ca197 + 4c793e9 commit 6ff3bbe

5 files changed

Lines changed: 185 additions & 43 deletions

File tree

DESCRIPTION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,4 +58,4 @@ Config/testthat/edition: 3
5858
Encoding: UTF-8
5959
LazyData: true
6060
Roxygen: list(markdown = TRUE)
61-
Config/roxygen2/version: 8.0.0
61+
Config/roxygen2/version: 8.1.0

NEWS.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
# frictionless (development version)
22

3+
* `version()` is now generic and can report what version of the Data Package standard is used by a Data Package (as before), Data Resource, Table Dialect and Table Schema (#341).
4+
35
# frictionless 1.3.0
46

57
## Changes for users

R/version.R

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,35 @@
1-
#' Get Data Package version
1+
#' Get Data Package standard version
22
#'
33
#' Determines what version of the [Data Package standard](
4-
#' https://datapackage.org/) is used by a Data Package, based on the
5-
#' [`$schema`](https://datapackage.org/standard/data-package/#dollar-schema)
6-
#' property.
4+
#' https://datapackage.org/) is used by a Data Package, Data Resource, Table
5+
#' Dialect or Table Schema, based on the [`$schema`](
6+
#' https://datapackage.org/standard/data-package/#dollar-schema) property.
77
#' Version `"1.0"` is assumed if `$schema` is missing, version `">=2.0"` is
88
#' assumed for custom values (e.g. [extensions](
99
#' https://datapackage.org/standard/extensions/)).
1010
#'
11-
#' @inheritParams read_resource
12-
#' @returns Data Package version number (e.g. `"1.0"`).
11+
#' @param x A list describing either a Data Package, Data Resource, Table
12+
#' Dialect or Table Schema.
13+
#' @returns Data Package standard version number (e.g. `"1.0"`).
1314
#' @family version functions
1415
#' @export
1516
#' @examples
17+
#' # Data Package
1618
#' package <- example_package()
1719
#' version(package)
18-
version <- function(package) {
19-
dollar_schema <- purrr::pluck(package, "$schema")
20+
#'
21+
#' # Data Resource
22+
#' resource <- resource(package, "observations")
23+
#' version(resource)
24+
#'
25+
#' # Table Dialect
26+
#' version(resource$dialect)
27+
#'
28+
#' # Table Schema
29+
#' schema <- schema(package, "observations")
30+
#' version(schema)
31+
version <- function(x) {
32+
dollar_schema <- purrr::pluck(x, "$schema")
2033

2134
if (is.null(dollar_schema)) {
2235
return("1.0") # Assume 1.0 if $schema is undefined
@@ -26,7 +39,8 @@ version <- function(package) {
2639
}
2740

2841
# Extract version from e.g.
29-
# "https://datapackage.org/profiles/<version>/datapackage.json"
42+
# "https://datapackage.org/profiles/1.0/datapackage.json" or
43+
# "https://datapackage.org/profiles/2.0/tableschema.json"
3044
pattern = "^https://datapackage\\.org/profiles/((?:[0-9A-Za-z]|\\.|-)+)/.*"
3145
extracted_version <- sub(
3246
pattern,

man/version.Rd

Lines changed: 19 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tests/testthat/test-version.R

Lines changed: 140 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,159 @@
1-
test_that("version() returns version based on $schema", {
2-
p <- create_package()
1+
test_that("version() returns correct version for Data Package", {
2+
package <- create_package()
33

4-
# Undefined
5-
p$`$schema` <- NULL
6-
expect_equal(version(p), "1.0")
4+
# Undefined $schema
5+
package$`$schema` <- NULL
6+
expect_equal(version(package), "1.0")
77

88
# Defined default
9-
p$`$schema` <- "https://datapackage.org/profiles/1.0/datapackage.json"
10-
expect_equal(version(p), "1.0")
9+
package$`$schema` <- "https://datapackage.org/profiles/1.0/datapackage.json"
10+
expect_equal(version(package), "1.0")
1111

1212
# 2.0
13-
p$`$schema` <- "https://datapackage.org/profiles/2.0/datapackage.json"
14-
expect_equal(version(p), "2.0")
13+
package$`$schema` <- "https://datapackage.org/profiles/2.0/datapackage.json"
14+
expect_equal(version(package), "2.0")
1515

1616
# Future versions
17-
p$`$schema` <- "https://datapackage.org/profiles/2.1/datapackage.json"
18-
expect_equal(version(p), "2.1")
19-
p$`$schema` <- "https://datapackage.org/profiles/2.2-rc.1/datapackage.json"
20-
expect_equal(version(p), "2.2-rc.1")
21-
p$`$schema` <- "https://datapackage.org/profiles/3.0/datapackage.json"
22-
expect_equal(version(p), "3.0")
17+
package$`$schema` <- "https://datapackage.org/profiles/2.1/datapackage.json"
18+
expect_equal(version(package), "2.1")
19+
package$`$schema` <- "https://datapackage.org/profiles/2.2-rc.1/datapackage.json"
20+
expect_equal(version(package), "2.2-rc.1")
21+
package$`$schema` <- "https://datapackage.org/profiles/3.0/datapackage.json"
22+
expect_equal(version(package), "3.0")
2323

2424
# Custom extensions
25-
p$`$schema` <- "https://spatial.datapackage.org/profiles/1.0/datapackage.json"
26-
expect_equal(version(p), ">=2.0")
27-
p$`$schema` <- "http://rs.tdwg.org/dwc-dp/1.0/dwc-dp-profile.json"
28-
expect_equal(version(p), ">=2.0")
25+
package$`$schema` <- "https://custom.datapackage.org/package-profile.json"
26+
expect_equal(version(package), ">=2.0")
27+
package$`$schema` <- "https://rs.tdwg.org/dwc-dp/1.0/dwc-dp-profile.json"
28+
expect_equal(version(package), ">=2.0")
29+
})
30+
31+
test_that("version() returns correct version for Data Resource", {
32+
resource <- list(
33+
name = "custom_resource",
34+
path = "https://example.com/data.csv"
35+
)
36+
37+
# Undefined $schema
38+
resource$`$schema` <- NULL
39+
expect_equal(version(resource), "1.0")
40+
41+
# Defined default
42+
resource$`$schema` <- "https://datapackage.org/profiles/1.0/dataresource.json"
43+
expect_equal(version(resource), "1.0")
44+
45+
# 2.0
46+
resource$`$schema` <- "https://datapackage.org/profiles/2.0/dataresource.json"
47+
expect_equal(version(resource), "2.0")
48+
49+
# Future versions
50+
resource$`$schema` <- "https://datapackage.org/profiles/2.1/dataresource.json"
51+
expect_equal(version(resource), "2.1")
52+
resource$`$schema` <- "https://datapackage.org/profiles/2.2-rc.1/dataresource.json"
53+
expect_equal(version(resource), "2.2-rc.1")
54+
resource$`$schema` <- "https://datapackage.org/profiles/3.0/dataresource.json"
55+
expect_equal(version(resource), "3.0")
56+
57+
# Custom extensions
58+
resource$`$schema` <- "https://custom.datapackage.org/resource-profile.json"
59+
expect_equal(version(resource), ">=2.0")
60+
})
61+
62+
test_that("version() returns correct version for Table Dialect", {
63+
# Entire dialect undefined => $schema is undefined => 1.0
64+
dialect <- NULL
65+
expect_equal(version(dialect), "1.0")
66+
67+
# Undefined $schema
68+
dialect <- list(
69+
delimiter = ","
70+
)
71+
dialect$`$schema` <- NULL
72+
expect_equal(version(dialect), "1.0")
73+
74+
# Defined default
75+
dialect$`$schema` <- "https://datapackage.org/profiles/1.0/tabledialect.json"
76+
expect_equal(version(dialect), "1.0")
77+
78+
# 2.0
79+
dialect$`$schema` <- "https://datapackage.org/profiles/2.0/tabledialect.json"
80+
expect_equal(version(dialect), "2.0")
81+
82+
# Future versions
83+
dialect$`$schema` <- "https://datapackage.org/profiles/2.1/tabledialect.json"
84+
expect_equal(version(dialect), "2.1")
85+
dialect$`$schema` <- "https://datapackage.org/profiles/2.2-rc.1/tabledialect.json"
86+
expect_equal(version(dialect), "2.2-rc.1")
87+
dialect$`$schema` <- "https://datapackage.org/profiles/3.0/tabledialect.json"
88+
expect_equal(version(dialect), "3.0")
89+
90+
# Custom extensions
91+
dialect$`$schema` <- "https://custom.datapackage.org/dialect-profile.json"
92+
expect_equal(version(dialect), ">=2.0")
93+
})
94+
95+
test_that("version() returns correct version for Table Schema", {
96+
schema <- list(
97+
fields = list()
98+
)
99+
100+
# Undefined $schema
101+
schema$`$schema` <- NULL
102+
expect_equal(version(schema), "1.0")
103+
104+
# Defined default
105+
schema$`$schema` <- "https://datapackage.org/profiles/1.0/tableschema.json"
106+
expect_equal(version(schema), "1.0")
107+
108+
# 2.0
109+
schema$`$schema` <- "https://datapackage.org/profiles/2.0/tableschema.json"
110+
expect_equal(version(schema), "2.0")
111+
112+
# Future versions
113+
schema$`$schema` <- "https://datapackage.org/profiles/2.1/tableschema.json"
114+
expect_equal(version(schema), "2.1")
115+
schema$`$schema` <- "https://datapackage.org/profiles/2.2-rc.1/tableschema.json"
116+
expect_equal(version(schema), "2.2-rc.1")
117+
schema$`$schema` <- "https://datapackage.org/profiles/3.0/tableschema.json"
118+
expect_equal(version(schema), "3.0")
119+
120+
# Custom extensions
121+
schema$`$schema` <- "https://custom.datapackage.org/schema-profile.json"
122+
expect_equal(version(schema), ">=2.0")
29123
})
30124

31125
test_that("version() returns >=2.0 for invalid $schema", {
32-
p <- create_package()
33-
p$`$schema` <- list()
34-
expect_equal(version(p), ">=2.0")
35-
p$`$schema` <- 3.0
36-
expect_equal(version(p), ">=2.0")
126+
x <- list()
127+
x$`$schema` <- list()
128+
expect_equal(version(x), ">=2.0")
129+
x$`$schema` <- 3.0
130+
expect_equal(version(x), ">=2.0")
37131
})
38132

39-
test_that("version() returns correct version for example packages", {
133+
test_that("version() returns correct version for example package properties", {
40134
p_1.0 <- example_package(version = "1.0")
135+
136+
# Data Package
41137
expect_equal(version(p_1.0), "1.0")
138+
# Data Resource
139+
expect_equal(version(p_1.0$resources[[1]]), "1.0")
140+
# Data Dialect (undefined for deployments)
141+
expect_equal(version(p_1.0$resources[[1]]$dialect), "1.0")
142+
# Table Dialect (defined for observations)
143+
expect_equal(version(p_1.0$resources[[2]]$dialect), "1.0")
144+
# Table Schema
145+
expect_equal(version(p_1.0$resources[[1]]$schema), "1.0")
146+
42147
p_2.0 <- example_package(version = "2.0")
148+
149+
# Data Package
43150
expect_equal(version(p_2.0), "2.0")
151+
# Data Resource
152+
expect_equal(version(p_2.0$resources[[1]]), "2.0")
153+
# Data Dialect (undefined for deployments)
154+
expect_equal(version(p_2.0$resources[[1]]$dialect), "1.0")
155+
# Table Dialect (defined for observations)
156+
expect_equal(version(p_2.0$resources[[2]]$dialect), "2.0")
157+
# Table Schema
158+
expect_equal(version(p_2.0$resources[[1]]$schema), "2.0")
44159
})

0 commit comments

Comments
 (0)