library(devtools)
devtools::session_info()
Session info -------------------------------------------------------------
 setting  value                       
 version  R version 3.4.1 (2017-06-30)
 system   x86_64, darwin15.6.0        
 ui       RStudio (1.0.143)           
 language (EN)                        
 collate  en_GB.UTF-8                 
 tz       America/Los_Angeles         
 date     2017-08-04                  
Packages -----------------------------------------------------------------
 package    * version date       source                             
 assertthat   0.2.0   2017-04-11 CRAN (R 3.4.0)                     
 backports    1.1.0   2017-05-22 CRAN (R 3.4.0)                     
 base       * 3.4.1   2017-07-07 local                              
 base64enc    0.1-3   2015-07-28 CRAN (R 3.4.0)                     
 bindr        0.1     2016-11-13 CRAN (R 3.4.0)                     
 bindrcpp     0.2     2017-06-17 CRAN (R 3.4.0)                     
 broom        0.4.2   2017-02-13 CRAN (R 3.4.0)                     
 cellranger   1.1.0   2016-07-27 CRAN (R 3.4.0)                     
 codemetar  * 0.1.0   2017-08-02 Github (codemeta/codemetar@3a1deca)
 colorspace   1.3-2   2016-12-14 CRAN (R 3.4.0)                     
 compiler     3.4.1   2017-07-07 local                              
 curl         2.7     2017-06-26 cran (@2.7)                        
 datasets   * 3.4.1   2017-07-07 local                              
 devtools   * 1.13.2  2017-06-02 CRAN (R 3.4.0)                     
 digest       0.6.12  2017-01-27 CRAN (R 3.4.0)                     
 dplyr      * 0.7.2   2017-07-20 CRAN (R 3.4.1)                     
 evaluate     0.10.1  2017-06-24 CRAN (R 3.4.1)                     
 forcats      0.2.0   2017-01-23 CRAN (R 3.4.0)                     
 foreign      0.8-69  2017-06-22 CRAN (R 3.4.1)                     
 ggplot2    * 2.2.1   2016-12-30 CRAN (R 3.4.0)                     
 gh           1.0.1   2017-07-16 CRAN (R 3.4.1)                     
 git2r        0.19.0  2017-07-19 cran (@0.19.0)                     
 glue         1.1.1   2017-06-21 CRAN (R 3.4.0)                     
 graphics   * 3.4.1   2017-07-07 local                              
 grDevices  * 3.4.1   2017-07-07 local                              
 grid         3.4.1   2017-07-07 local                              
 gtable       0.2.0   2016-02-26 CRAN (R 3.4.0)                     
 haven        1.1.0   2017-07-09 CRAN (R 3.4.1)                     
 hms          0.3     2016-11-22 CRAN (R 3.4.0)                     
 htmltools    0.3.6   2017-04-28 CRAN (R 3.4.0)                     
 httr         1.2.1   2016-07-03 CRAN (R 3.4.0)                     
 jsonld       1.2     2017-04-11 cran (@1.2)                        
 jsonlite   * 1.5     2017-06-01 cran (@1.5)                        
 knitr        1.16    2017-05-18 cran (@1.16)                       
 lattice      0.20-35 2017-03-25 CRAN (R 3.4.1)                     
 lazyeval     0.2.0   2016-06-12 CRAN (R 3.4.0)                     
 lubridate    1.6.0   2016-09-13 CRAN (R 3.4.0)                     
 magrittr     1.5     2014-11-22 CRAN (R 3.4.0)                     
 memoise      1.1.0   2017-04-21 CRAN (R 3.4.0)                     
 methods    * 3.4.1   2017-07-07 local                              
 mnormt       1.5-5   2016-10-15 CRAN (R 3.4.0)                     
 modelr       0.1.0   2016-08-31 CRAN (R 3.4.0)                     
 munsell      0.4.3   2016-02-13 CRAN (R 3.4.0)                     
 nlme         3.1-131 2017-02-06 CRAN (R 3.4.1)                     
 parallel     3.4.1   2017-07-07 local                              
 pkgconfig    2.0.1   2017-03-21 CRAN (R 3.4.0)                     
 plyr         1.8.4   2016-06-08 CRAN (R 3.4.0)                     
 psych        1.7.5   2017-05-03 CRAN (R 3.4.0)                     
 purrr      * 0.2.2.2 2017-05-11 CRAN (R 3.4.0)                     
 R6           2.2.2   2017-06-17 cran (@2.2.2)                      
 Rcpp         0.12.12 2017-07-15 CRAN (R 3.4.1)                     
 readr      * 1.1.1   2017-05-16 CRAN (R 3.4.0)                     
 readxl       1.0.0   2017-04-18 CRAN (R 3.4.0)                     
 remotes    * 1.1.0   2017-07-09 CRAN (R 3.4.1)                     
 reshape2     1.4.2   2016-10-22 CRAN (R 3.4.0)                     
 rlang        0.1.1   2017-05-18 CRAN (R 3.4.0)                     
 rmarkdown  * 1.6     2017-06-15 cran (@1.6)                        
 rprojroot    1.2     2017-01-16 CRAN (R 3.4.0)                     
 rsconnect    0.8     2017-05-08 CRAN (R 3.4.0)                     
 rstudioapi   0.6     2016-06-27 CRAN (R 3.4.0)                     
 rvest        0.3.2   2016-06-17 CRAN (R 3.4.0)                     
 scales       0.4.1   2016-11-09 CRAN (R 3.4.0)                     
 stats      * 3.4.1   2017-07-07 local                              
 stringi      1.1.5   2017-04-07 CRAN (R 3.4.0)                     
 stringr      1.2.0   2017-02-18 CRAN (R 3.4.0)                     
 tibble     * 1.3.3   2017-05-28 CRAN (R 3.4.0)                     
 tidyr      * 0.6.3   2017-05-15 CRAN (R 3.4.0)                     
 tidyverse  * 1.1.1   2017-01-27 CRAN (R 3.4.0)                     
 tools        3.4.1   2017-07-07 local                              
 utils      * 3.4.1   2017-07-07 local                              
 V8           1.5     2017-04-25 cran (@1.5)                        
 withr        1.0.2   2016-06-20 CRAN (R 3.4.0)                     
 xml2         1.1.1   2017-01-24 CRAN (R 3.4.0)                     
 yaml         2.1.14  2016-11-12 CRAN (R 3.4.0)                     

Test installation and loading

devtools::install_github("codemeta/codemetar")
Skipping install of 'codemetar' from a github remote, the SHA1 (3a1deca0) has not changed since last install.
  Use `force = TRUE` to force installation
#devtools::install_github("codemeta/codemetar", force = T)
library("codemetar")

All looks good so far.

Check functions

All functions:

ls("package:codemetar")
[1] "codemeta_validate" "create_codemeta"   "crosswalk"        
[4] "drop_context"      "write_codemeta"   
codemeta_validate

create_codemeta

crosswalk

drop_context

write_codemeta


[x] codemeta_validate


code

codemeta_validate
function (codemeta = "codemeta.json", context = NULL) 
{
    if (file.exists(codemeta)) {
        A <- read_json(codemeta)
    }
    else if (is(codemeta, "json")) {
        A <- fromJSON(codemeta)
    }
    if (is.null(context)) {
        context <- A$`@context`
        if (length(context) > 1) {
            context <- jsonlite::toJSON(list(`@context` = context), 
                auto_unbox = TRUE)
        }
    }
    test <- tempfile(fileext = ".json")
    writeLines(jsonld::jsonld_compact(jsonld::jsonld_expand(codemeta), 
        context), test)
    B <- jsonlite::read_json(test)
    unlink(test)
    A$`@context` <- NULL
    B$`@context` <- NULL
    same_n_properties <- identical(length(unlist(A)), length(unlist(B)))
    compaction_fail <- any(grepl(names(unlist(B)), pattern = ":"))
    same_n_properties && !compaction_fail
}
<bytecode: 0x10a5a1750>
<environment: namespace:codemetar>


documentation

?codemeta_validate
  • I think the description might not be complete? (ie …verifying that the result matches or conforms to sth?).


examples

ex <- system.file("examples/codemeta.json", package="codemetar")
ex
[1] "/Users/Anna/Library/R/3.4/library/codemetar/examples/codemeta.json"
/Users/Anna/Library/R/3.4/library/codemetar/examples/codemeta.json
codemeta_validate(ex)
[1] TRUE

Random xml file

codemeta_validate("../assets/example/example.xml") 

Random json file

codemeta_validate("../assets/example/example.json") 

Validate a different json

create_codemeta("jsonlite") %>% jsonlite::write_json(path = "../assets/example/jsonlite.json", pretty = TRUE, auto_unbox = TRUE)
codemeta_validate("../assets/example/jsonlite.json")
[1] TRUE

Despite not being mentioned in the documentation (ie codemeta argument description only mentions path/filename), the function is geared up to accept a JSON-LD (also demonstrated in the crosswalking vignette).

e.g.

ex_json <- read_json(ex) %>% crosswalk("R Package Description")
codemeta_validate(ex_json)
[1] TRUE

BTW this also made me think that %>% crosswalk("R Package Description") is the only way to get from a JSON-LD r list to a JSON-LD in r as toJSON doesn’t work. While its great that there is a way to do it, it almost feels a bit like a hack. At the very least I feel it should be included as an example so the users are aware of it but I’m wondering if an explicit function for that might also be useful?



- [x] create_codemeta


code

create_codemeta
function (pkg = ".", root = ".", id = NULL, force_update = getOption("codemeta_force_update", 
    TRUE), ...) 
{
    if (is.character(pkg)) {
        root <- get_root_path(pkg)
        if (file.exists(get_file("codemeta.json", root))) {
            cm <- jsonlite::read_json(get_file("codemeta.json", 
                root))
        }
        else {
            cm <- new_codemeta()
        }
    }
    else if (is.list(pkg)) {
        cm <- pkg
        root <- get_root_path(root)
    }
    cm <- codemeta_description(file.path(root, "DESCRIPTION"), 
        id = id, cm)
    if (is.null(cm$codeRepository) | force_update) 
        cm$codeRepository <- guess_github(root)
    if (is.null(cm$contIntegration) | force_update) 
        cm$contIntegration <- guess_ci(file.path(root, "README.md"))
    if (is.null(cm$developmentStatus) | force_update) 
        cm$developmentStatus <- guess_devStatus(file.path(root, 
            "README.md"))
    if (is.null(cm$releaseNotes) | force_update) 
        cm$releaseNotes <- guess_releaseNotes(root)
    if (is.null(cm$readme) | force_update) 
        cm$readme <- guess_readme(root)
    if (is.null(cm$fileSize) | force_update) 
        cm$fileSize <- guess_fileSize(root)
    if (is.character(pkg)) {
        cm$citation <- guess_citation(pkg)
        if (!any(grepl("http://schema.org", cm$`@context`))) {
            cm$`@context` <- c(cm$`@context`, "http://schema.org")
        }
    }
    cm
}
<bytecode: 0x104f51d20>
<environment: namespace:codemetar>


documentation

?create_codemeta


examples

cm <- create_codemeta("jsonlite")
cm
$`@context`
[1] "https://doi.org/doi:10.5063/schema/codemeta-2.0"
[2] "http://schema.org"                              

$`@type`
[1] "SoftwareSourceCode"

$identifier
[1] "jsonlite"

$description
[1] "A fast JSON parser and generator optimized for statistical data\n    and the web. Started out as a fork of 'RJSONIO', but has been completely\n    rewritten in recent versions. The package offers flexible, robust, high\n    performance tools for working with JSON in R and is particularly powerful\n    for building pipelines and interacting with a web API. The implementation is\n    based on the mapping described in the vignette (Ooms, 2014). In addition to\n    converting JSON data from/to R objects, 'jsonlite' contains functions to\n    stream, validate, and prettify JSON data. The unit tests included with the\n    package verify that all edge cases are encoded and decoded consistently for\n    use with dynamic data in systems and applications."

$name
[1] "jsonlite: A Robust, High Performance JSON Parser and Generator for R"

$issueTracker
[1] "http://github.com/jeroen/jsonlite/issues"

$datePublished
[1] "2017-06-01 12:03:37 UTC"

$license
[1] "https://spdx.org/licenses/MIT"

$version
[1] "1.5"

$programmingLanguage
$programmingLanguage$`@type`
[1] "ComputerLanguage"

$programmingLanguage$name
[1] "R"

$programmingLanguage$version
[1] "3.4.1"

$programmingLanguage$url
[1] "https://r-project.org"


$runtimePlatform
[1] "R version 3.4.1 (2017-06-30)"

$provider
$provider$`@id`
[1] "https://cran.r-project.org"

$provider$`@type`
[1] "Organization"

$provider$name
[1] "Central R Archive Network (CRAN)"

$provider$url
[1] "https://cran.r-project.org"


$author
$author[[1]]
$author[[1]]$`@type`
[1] "Person"

$author[[1]]$givenName
[1] "Jeroen"

$author[[1]]$familyName
[1] "Ooms"


$author[[2]]
$author[[2]]$`@type`
[1] "Person"

$author[[2]]$givenName
[1] "Duncan" "Temple"

$author[[2]]$familyName
[1] "Lang"


$author[[3]]
$author[[3]]$`@type`
[1] "Person"

$author[[3]]$givenName
[1] "Lloyd"

$author[[3]]$familyName
[1] "Hilaiel"



$maintainer
$maintainer$`@type`
[1] "Person"

$maintainer$givenName
[1] "Jeroen"

$maintainer$familyName
[1] "Ooms"

$maintainer$email
[1] "jeroen@berkeley.edu"


$softwareSuggestions
$softwareSuggestions[[1]]
$softwareSuggestions[[1]]$`@type`
[1] "SoftwareApplication"

$softwareSuggestions[[1]]$identifier
[1] "httr"

$softwareSuggestions[[1]]$name
[1] "httr"

$softwareSuggestions[[1]]$provider
$softwareSuggestions[[1]]$provider$`@id`
[1] "https://cran.r-project.org"

$softwareSuggestions[[1]]$provider$`@type`
[1] "Organization"

$softwareSuggestions[[1]]$provider$name
[1] "Central R Archive Network (CRAN)"

$softwareSuggestions[[1]]$provider$url
[1] "https://cran.r-project.org"



$softwareSuggestions[[2]]
$softwareSuggestions[[2]]$`@type`
[1] "SoftwareApplication"

$softwareSuggestions[[2]]$identifier
[1] "curl"

$softwareSuggestions[[2]]$name
[1] "curl"

$softwareSuggestions[[2]]$provider
$softwareSuggestions[[2]]$provider$`@id`
[1] "https://cran.r-project.org"

$softwareSuggestions[[2]]$provider$`@type`
[1] "Organization"

$softwareSuggestions[[2]]$provider$name
[1] "Central R Archive Network (CRAN)"

$softwareSuggestions[[2]]$provider$url
[1] "https://cran.r-project.org"



$softwareSuggestions[[3]]
$softwareSuggestions[[3]]$`@type`
[1] "SoftwareApplication"

$softwareSuggestions[[3]]$identifier
[1] "plyr"

$softwareSuggestions[[3]]$name
[1] "plyr"

$softwareSuggestions[[3]]$provider
$softwareSuggestions[[3]]$provider$`@id`
[1] "https://cran.r-project.org"

$softwareSuggestions[[3]]$provider$`@type`
[1] "Organization"

$softwareSuggestions[[3]]$provider$name
[1] "Central R Archive Network (CRAN)"

$softwareSuggestions[[3]]$provider$url
[1] "https://cran.r-project.org"



$softwareSuggestions[[4]]
$softwareSuggestions[[4]]$`@type`
[1] "SoftwareApplication"

$softwareSuggestions[[4]]$identifier
[1] "testthat"

$softwareSuggestions[[4]]$name
[1] "testthat"

$softwareSuggestions[[4]]$provider
$softwareSuggestions[[4]]$provider$`@id`
[1] "https://cran.r-project.org"

$softwareSuggestions[[4]]$provider$`@type`
[1] "Organization"

$softwareSuggestions[[4]]$provider$name
[1] "Central R Archive Network (CRAN)"

$softwareSuggestions[[4]]$provider$url
[1] "https://cran.r-project.org"



$softwareSuggestions[[5]]
$softwareSuggestions[[5]]$`@type`
[1] "SoftwareApplication"

$softwareSuggestions[[5]]$identifier
[1] "knitr"

$softwareSuggestions[[5]]$name
[1] "knitr"

$softwareSuggestions[[5]]$provider
$softwareSuggestions[[5]]$provider$`@id`
[1] "https://cran.r-project.org"

$softwareSuggestions[[5]]$provider$`@type`
[1] "Organization"

$softwareSuggestions[[5]]$provider$name
[1] "Central R Archive Network (CRAN)"

$softwareSuggestions[[5]]$provider$url
[1] "https://cran.r-project.org"



$softwareSuggestions[[6]]
$softwareSuggestions[[6]]$`@type`
[1] "SoftwareApplication"

$softwareSuggestions[[6]]$identifier
[1] "rmarkdown"

$softwareSuggestions[[6]]$name
[1] "rmarkdown"

$softwareSuggestions[[6]]$provider
$softwareSuggestions[[6]]$provider$`@id`
[1] "https://cran.r-project.org"

$softwareSuggestions[[6]]$provider$`@type`
[1] "Organization"

$softwareSuggestions[[6]]$provider$name
[1] "Central R Archive Network (CRAN)"

$softwareSuggestions[[6]]$provider$url
[1] "https://cran.r-project.org"



$softwareSuggestions[[7]]
$softwareSuggestions[[7]]$`@type`
[1] "SoftwareApplication"

$softwareSuggestions[[7]]$identifier
[1] "R.rsp"

$softwareSuggestions[[7]]$name
[1] "R.rsp"

$softwareSuggestions[[7]]$provider
$softwareSuggestions[[7]]$provider$`@id`
[1] "https://cran.r-project.org"

$softwareSuggestions[[7]]$provider$`@type`
[1] "Organization"

$softwareSuggestions[[7]]$provider$name
[1] "Central R Archive Network (CRAN)"

$softwareSuggestions[[7]]$provider$url
[1] "https://cran.r-project.org"



$softwareSuggestions[[8]]
$softwareSuggestions[[8]]$`@type`
[1] "SoftwareApplication"

$softwareSuggestions[[8]]$identifier
[1] "sp"

$softwareSuggestions[[8]]$name
[1] "sp"

$softwareSuggestions[[8]]$provider
$softwareSuggestions[[8]]$provider$`@id`
[1] "https://cran.r-project.org"

$softwareSuggestions[[8]]$provider$`@type`
[1] "Organization"

$softwareSuggestions[[8]]$provider$name
[1] "Central R Archive Network (CRAN)"

$softwareSuggestions[[8]]$provider$url
[1] "https://cran.r-project.org"




$softwareRequirements
$softwareRequirements[[1]]
$softwareRequirements[[1]]$`@type`
[1] "SoftwareApplication"

$softwareRequirements[[1]]$identifier
[1] "methods"

$softwareRequirements[[1]]$name
[1] "methods"



$citation
$citation[[1]]
$citation[[1]]$`@type`
[1] "ScholarlyArticle"

$citation[[1]]$datePublished
[1] "2014"

$citation[[1]]$author
$citation[[1]]$author[[1]]
$citation[[1]]$author[[1]]$`@type`
[1] "Person"

$citation[[1]]$author[[1]]$givenName
[1] "Jeroen"

$citation[[1]]$author[[1]]$familyName
[1] "Ooms"



$citation[[1]]$name
[1] "The jsonlite Package: A Practical and Consistent Mapping Between JSON Data and R Objects"

$citation[[1]]$url
[1] "https://arxiv.org/abs/1403.2805"

$citation[[1]]$isPartOf
$citation[[1]]$isPartOf$`@type`
[1] "PublicationIssue"

$citation[[1]]$isPartOf$datePublished
[1] "2014"

$citation[[1]]$isPartOf$isPartOf
$citation[[1]]$isPartOf$isPartOf$`@type`
[1] "PublicationVolume" "Periodical"       

$citation[[1]]$isPartOf$isPartOf$name
[1] "arXiv:1403.2805 [stat.CO]"
https://doi.org/doi:10.5063/schema/codemeta-2.0

http://schema.org
SoftwareSourceCode
jsonlite
A fast JSON parser and generator optimized for statistical data
    and the web. Started out as a fork of 'RJSONIO', but has been completely
    rewritten in recent versions. The package offers flexible, robust, high
    performance tools for working with JSON in R and is particularly powerful
    for building pipelines and interacting with a web API. The implementation is
    based on the mapping described in the vignette (Ooms, 2014). In addition to
    converting JSON data from/to R objects, 'jsonlite' contains functions to
    stream, validate, and prettify JSON data. The unit tests included with the
    package verify that all edge cases are encoded and decoded consistently for
    use with dynamic data in systems and applications.
jsonlite: A Robust, High Performance JSON Parser and Generator for R
http://github.com/jeroen/jsonlite/issues
2017-06-01 12:03:37 UTC
https://spdx.org/licenses/MIT
1.5
ComputerLanguage
R
3.4.1
https://r-project.org
R version 3.4.1 (2017-06-30)
https://cran.r-project.org
Organization
Central R Archive Network (CRAN)
https://cran.r-project.org
Person
Jeroen
Ooms
Person
Duncan

Temple
Lang
Person
Lloyd
Hilaiel
Person
Jeroen
Ooms
jeroen@berkeley.edu
SoftwareApplication
httr
httr
https://cran.r-project.org
Organization
Central R Archive Network (CRAN)
https://cran.r-project.org
SoftwareApplication
curl
curl
https://cran.r-project.org
Organization
Central R Archive Network (CRAN)
https://cran.r-project.org
SoftwareApplication
plyr
plyr
https://cran.r-project.org
Organization
Central R Archive Network (CRAN)
https://cran.r-project.org
SoftwareApplication
testthat
testthat
https://cran.r-project.org
Organization
Central R Archive Network (CRAN)
https://cran.r-project.org
SoftwareApplication
knitr
knitr
https://cran.r-project.org
Organization
Central R Archive Network (CRAN)
https://cran.r-project.org
SoftwareApplication
rmarkdown
rmarkdown
https://cran.r-project.org
Organization
Central R Archive Network (CRAN)
https://cran.r-project.org
SoftwareApplication
R.rsp
R.rsp
https://cran.r-project.org
Organization
Central R Archive Network (CRAN)
https://cran.r-project.org
SoftwareApplication
sp
sp
https://cran.r-project.org
Organization
Central R Archive Network (CRAN)
https://cran.r-project.org
SoftwareApplication
methods
methods
ScholarlyArticle
2014
Person
Jeroen
Ooms
The jsonlite Package: A Practical and Consistent Mapping Between JSON Data and R Objects
https://arxiv.org/abs/1403.2805
PublicationIssue
2014
PublicationVolume

Periodical
arXiv:1403.2805 [stat.CO]
What if we install the development version of a package? Does it pick that up?
devtools::install_github('rstudio/tufte')
dev.tufte <- create_codemeta("tufte")
install.packages("tufte")
cran.tufte <- create_codemeta("tufte")
all.equal(dev.tufte, cran.tufte)
[1] "Component \"version\": 1 string mismatch"                                    
[2] "Component \"contributor\": Length mismatch: comparison on first 1 components"
[3] "Component \"contributor\": Component 1: Component 2: 1 string mismatch"      
[4] "Component \"contributor\": Component 1: Component 3: 1 string mismatch"      
[5] "Component \"citation\": Component 1: Component 5: 1 string mismatch"         
[6] "Component \"citation\": Component 1: Component 6: 1 string mismatch"         
Component "version": 1 string mismatch

Component "contributor": Length mismatch: comparison on first 1 components

Component "contributor": Component 1: Component 2: 1 string mismatch

Component "contributor": Component 1: Component 3: 1 string mismatch

Component "citation": Component 1: Component 5: 1 string mismatch

Component "citation": Component 1: Component 6: 1 string mismatch

Differences to be expected.

cran.tufte$version
[1] "0.2"
0.2
dev.tufte$version
[1] "0.2.7"
0.2.7
cran.tufte$contributor
[[1]]
[[1]]$`@type`
[1] "Person"

[[1]]$givenName
[1] "Dave"

[[1]]$familyName
[1] "Liepmann"
Person
Dave
Liepmann
dev.tufte$contributor
[[1]]
[[1]]$`@type`
[1] "Person"

[[1]]$givenName
[1] "Andrzej"

[[1]]$familyName
[1] "Oles"


[[2]]
[[2]]$`@type`
[1] "Person"

[[2]]$givenName
[1] "Dave"

[[2]]$familyName
[1] "Liepmann"
Person
Andrzej
Oles
Person
Dave
Liepmann

Looks like dev.tufte has picked up another contributor! Sweet!

library(remotes)
remotes::install_github("mangothecat/franc")
Downloading GitHub repo mangothecat/franc@master
Installing package into '/Users/Anna/Library/R/3.4/library'
(as 'lib' is unspecified)
create_codemeta("franc")
$`@context`
[1] "https://doi.org/doi:10.5063/schema/codemeta-2.0"
[2] "http://schema.org"                              

$`@type`
[1] "SoftwareSourceCode"

$identifier
[1] "franc"

$description
[1] "With no external dependencies and\n    support for 335 languages; all languages spoken by\n    more than one million speakers. 'Franc' is a port\n    of the 'JavaScript' project of the same name,\n    see <https://github.com/wooorm/franc>."

$name
[1] "franc: Detect the Language of Text"

$issueTracker
[1] "https://github.com/mangothecat/franc/issues"

$license
[1] "https://spdx.org/licenses/MIT"

$version
[1] "1.1.1"

$programmingLanguage
$programmingLanguage$`@type`
[1] "ComputerLanguage"

$programmingLanguage$name
[1] "R"

$programmingLanguage$version
[1] "3.4.1"

$programmingLanguage$url
[1] "https://r-project.org"


$runtimePlatform
[1] "R version 3.4.1 (2017-06-30)"

$provider
$provider$`@id`
[1] "https://cran.r-project.org"

$provider$`@type`
[1] "Organization"

$provider$name
[1] "Central R Archive Network (CRAN)"

$provider$url
[1] "https://cran.r-project.org"


$author
$author[[1]]
$author[[1]]$`@type`
[1] "Person"

$author[[1]]$givenName
[1] "Gabor"

$author[[1]]$familyName
[1] "Csardi"


$author[[2]]
$author[[2]]$`@type`
[1] "Person"

$author[[2]]$givenName
[1] "Titus"

$author[[2]]$familyName
[1] "Wormer"


$author[[3]]
$author[[3]]$`@type`
[1] "Person"

$author[[3]]$givenName
[1] "Maciej"

$author[[3]]$familyName
[1] "Ceglowski"


$author[[4]]
$author[[4]]$`@type`
[1] "Person"

$author[[4]]$givenName
[1] "Jacob" "R."   

$author[[4]]$familyName
[1] "Rideout"


$author[[5]]
$author[[5]]$`@type`
[1] "Person"

$author[[5]]$givenName
[1] "and"  "Kent" "S."  

$author[[5]]$familyName
[1] "Johnson"



$maintainer
$maintainer$`@type`
[1] "Person"

$maintainer$givenName
[1] "Gabor"

$maintainer$familyName
[1] "Csardi"

$maintainer$email
[1] "gcsardi@mango-solutions.com"


$softwareSuggestions
$softwareSuggestions[[1]]
$softwareSuggestions[[1]]$`@type`
[1] "SoftwareApplication"

$softwareSuggestions[[1]]$identifier
[1] "testthat"

$softwareSuggestions[[1]]$name
[1] "testthat"

$softwareSuggestions[[1]]$provider
$softwareSuggestions[[1]]$provider$`@id`
[1] "https://cran.r-project.org"

$softwareSuggestions[[1]]$provider$`@type`
[1] "Organization"

$softwareSuggestions[[1]]$provider$name
[1] "Central R Archive Network (CRAN)"

$softwareSuggestions[[1]]$provider$url
[1] "https://cran.r-project.org"




$softwareRequirements
$softwareRequirements[[1]]
$softwareRequirements[[1]]$`@type`
[1] "SoftwareApplication"

$softwareRequirements[[1]]$identifier
[1] "jsonlite"

$softwareRequirements[[1]]$name
[1] "jsonlite"

$softwareRequirements[[1]]$provider
$softwareRequirements[[1]]$provider$`@id`
[1] "https://cran.r-project.org"

$softwareRequirements[[1]]$provider$`@type`
[1] "Organization"

$softwareRequirements[[1]]$provider$name
[1] "Central R Archive Network (CRAN)"

$softwareRequirements[[1]]$provider$url
[1] "https://cran.r-project.org"




$contIntegration
[1] "https://travis-ci.org/MangoTheCat/franc"

$developmentStatus
[1] "active"

$citation
$citation[[1]]
$citation[[1]]$`@type`
[1] "SoftwareSourceCode"

$citation[[1]]$author
$citation[[1]]$author[[1]]
$citation[[1]]$author[[1]]$`@type`
[1] "Person"

$citation[[1]]$author[[1]]$givenName
[1] "Gabor"

$citation[[1]]$author[[1]]$familyName
[1] "Csardi"


$citation[[1]]$author[[2]]
$citation[[1]]$author[[2]]$`@type`
[1] "Person"

$citation[[1]]$author[[2]]$givenName
[1] "Titus"

$citation[[1]]$author[[2]]$familyName
[1] "Wormer"


$citation[[1]]$author[[3]]
$citation[[1]]$author[[3]]$`@type`
[1] "Person"

$citation[[1]]$author[[3]]$givenName
[1] "Maciej"

$citation[[1]]$author[[3]]$familyName
[1] "Ceglowski"


$citation[[1]]$author[[4]]
$citation[[1]]$author[[4]]$`@type`
[1] "Person"

$citation[[1]]$author[[4]]$givenName
[1] "Jacob" "R."   

$citation[[1]]$author[[4]]$familyName
[1] "Rideout"


$citation[[1]]$author[[5]]
$citation[[1]]$author[[5]]$`@type`
[1] "Person"

$citation[[1]]$author[[5]]$givenName
[1] "and"  "Kent" "S."  

$citation[[1]]$author[[5]]$familyName
[1] "Johnson"



$citation[[1]]$name
[1] "franc: Detect the Language of Text"

$citation[[1]]$url
[1] "https://github.com/mangothecat/franc"

$citation[[1]]$description
[1] "R package version 1.1.1"
https://doi.org/doi:10.5063/schema/codemeta-2.0

http://schema.org
SoftwareSourceCode
franc
With no external dependencies and
    support for 335 languages; all languages spoken by
    more than one million speakers. 'Franc' is a port
    of the 'JavaScript' project of the same name,
    see <https://github.com/wooorm/franc>.
franc: Detect the Language of Text
https://github.com/mangothecat/franc/issues
https://spdx.org/licenses/MIT
1.1.1
ComputerLanguage
R
3.4.1
https://r-project.org
R version 3.4.1 (2017-06-30)
https://cran.r-project.org
Organization
Central R Archive Network (CRAN)
https://cran.r-project.org
Person
Gabor
Csardi
Person
Titus
Wormer
Person
Maciej
Ceglowski
Person
Jacob

R.
Rideout
Person
and

Kent

S.
Johnson
Person
Gabor
Csardi
gcsardi@mango-solutions.com
SoftwareApplication
testthat
testthat
https://cran.r-project.org
Organization
Central R Archive Network (CRAN)
https://cran.r-project.org
SoftwareApplication
jsonlite
jsonlite
https://cran.r-project.org
Organization
Central R Archive Network (CRAN)
https://cran.r-project.org
https://travis-ci.org/MangoTheCat/franc
active
SoftwareSourceCode
Person
Gabor
Csardi
Person
Titus
Wormer
Person
Maciej
Ceglowski
Person
Jacob

R.
Rideout
Person
and

Kent

S.
Johnson
franc: Detect the Language of Text
https://github.com/mangothecat/franc
R package version 1.1.1
devtools::install_github(repo = "maksimhorowitz/nflscrapR")
Skipping install of 'nflscrapR' from a github remote, the SHA1 (8c356484) has not changed since last install.
  Use `force = TRUE` to force installation
create_codemeta("nflscrapR")
$`@context`
[1] "https://doi.org/doi:10.5063/schema/codemeta-2.0"
[2] "http://schema.org"                              

$`@type`
[1] "SoftwareSourceCode"

$identifier
[1] "nflscrapR"

$description
[1] "This package allows data driven sports enthusiasts to use the NFL JSON API data to perform detailed analysis on the game, player, and season levels.  The 11 functions within this package helps parse and clean the data from Nfl.com for R users.  nflscrapR was build to enhance advanced sports analytics research specifically for American Football with the hopes of developing metrics and insights that could potentially be useful for professional NFL teams. \n    R (>= 3.0.2)"

$name
[1] "nflscrapR: Will scrape NFL play-by-play and boxscore data across full\n        seasons"

$issueTracker
[1] "https://github.com/maksimhorowitz/nflscrapR/issues"

$license
[1] "https://spdx.org/licenses/CC0-1.0"

$version
[1] "1.4.0"

$programmingLanguage
$programmingLanguage$`@type`
[1] "ComputerLanguage"

$programmingLanguage$name
[1] "R"

$programmingLanguage$version
[1] "3.4.1"

$programmingLanguage$url
[1] "https://r-project.org"


$runtimePlatform
[1] "R version 3.4.1 (2017-06-30)"

$author
$author[[1]]
$author[[1]]$`@type`
[1] "Person"

$author[[1]]$givenName
[1] "Maksim"

$author[[1]]$familyName
[1] "Horowitz"

$author[[1]]$email
[1] "maksim.horowitz@gmail.com"


$author[[2]]
$author[[2]]$`@type`
[1] "Person"

$author[[2]]$givenName
[1] "Ron"

$author[[2]]$familyName
[1] "Yurko"

$author[[2]]$email
[1] "ryurko21@gmail.com"



$maintainer
$maintainer$`@type`
[1] "Person"

$maintainer$givenName
[1] "Maksim"

$maintainer$familyName
[1] "Horowitz"

$maintainer$email
[1] "maksim.horowitz@gmail.com"


$softwareSuggestions
$softwareSuggestions[[1]]
$softwareSuggestions[[1]]$`@type`
[1] "SoftwareApplication"

$softwareSuggestions[[1]]$identifier
[1] "testthat"

$softwareSuggestions[[1]]$name
[1] "testthat"

$softwareSuggestions[[1]]$provider
$softwareSuggestions[[1]]$provider$`@id`
[1] "https://cran.r-project.org"

$softwareSuggestions[[1]]$provider$`@type`
[1] "Organization"

$softwareSuggestions[[1]]$provider$name
[1] "Central R Archive Network (CRAN)"

$softwareSuggestions[[1]]$provider$url
[1] "https://cran.r-project.org"



$softwareSuggestions[[2]]
$softwareSuggestions[[2]]$`@type`
[1] "SoftwareApplication"

$softwareSuggestions[[2]]$identifier
[1] "knitr"

$softwareSuggestions[[2]]$name
[1] "knitr"

$softwareSuggestions[[2]]$provider
$softwareSuggestions[[2]]$provider$`@id`
[1] "https://cran.r-project.org"

$softwareSuggestions[[2]]$provider$`@type`
[1] "Organization"

$softwareSuggestions[[2]]$provider$name
[1] "Central R Archive Network (CRAN)"

$softwareSuggestions[[2]]$provider$url
[1] "https://cran.r-project.org"



$softwareSuggestions[[3]]
$softwareSuggestions[[3]]$`@type`
[1] "SoftwareApplication"

$softwareSuggestions[[3]]$identifier
[1] "rmarkdown"

$softwareSuggestions[[3]]$name
[1] "rmarkdown"

$softwareSuggestions[[3]]$provider
$softwareSuggestions[[3]]$provider$`@id`
[1] "https://cran.r-project.org"

$softwareSuggestions[[3]]$provider$`@type`
[1] "Organization"

$softwareSuggestions[[3]]$provider$name
[1] "Central R Archive Network (CRAN)"

$softwareSuggestions[[3]]$provider$url
[1] "https://cran.r-project.org"




$softwareRequirements
$softwareRequirements[[1]]
$softwareRequirements[[1]]$`@type`
[1] "SoftwareApplication"

$softwareRequirements[[1]]$identifier
[1] "RJSONIO"

$softwareRequirements[[1]]$name
[1] "RJSONIO"

$softwareRequirements[[1]]$provider
$softwareRequirements[[1]]$provider$`@id`
[1] "https://cran.r-project.org"

$softwareRequirements[[1]]$provider$`@type`
[1] "Organization"

$softwareRequirements[[1]]$provider$name
[1] "Central R Archive Network (CRAN)"

$softwareRequirements[[1]]$provider$url
[1] "https://cran.r-project.org"



$softwareRequirements[[2]]
$softwareRequirements[[2]]$`@type`
[1] "SoftwareApplication"

$softwareRequirements[[2]]$identifier
[1] "RCurl"

$softwareRequirements[[2]]$name
[1] "RCurl"

$softwareRequirements[[2]]$provider
$softwareRequirements[[2]]$provider$`@id`
[1] "https://cran.r-project.org"

$softwareRequirements[[2]]$provider$`@type`
[1] "Organization"

$softwareRequirements[[2]]$provider$name
[1] "Central R Archive Network (CRAN)"

$softwareRequirements[[2]]$provider$url
[1] "https://cran.r-project.org"



$softwareRequirements[[3]]
$softwareRequirements[[3]]$`@type`
[1] "SoftwareApplication"

$softwareRequirements[[3]]$identifier
[1] "stringr"

$softwareRequirements[[3]]$name
[1] "stringr"

$softwareRequirements[[3]]$provider
$softwareRequirements[[3]]$provider$`@id`
[1] "https://cran.r-project.org"

$softwareRequirements[[3]]$provider$`@type`
[1] "Organization"

$softwareRequirements[[3]]$provider$name
[1] "Central R Archive Network (CRAN)"

$softwareRequirements[[3]]$provider$url
[1] "https://cran.r-project.org"



$softwareRequirements[[4]]
$softwareRequirements[[4]]$`@type`
[1] "SoftwareApplication"

$softwareRequirements[[4]]$identifier
[1] "lubridate"

$softwareRequirements[[4]]$name
[1] "lubridate"

$softwareRequirements[[4]]$provider
$softwareRequirements[[4]]$provider$`@id`
[1] "https://cran.r-project.org"

$softwareRequirements[[4]]$provider$`@type`
[1] "Organization"

$softwareRequirements[[4]]$provider$name
[1] "Central R Archive Network (CRAN)"

$softwareRequirements[[4]]$provider$url
[1] "https://cran.r-project.org"



$softwareRequirements[[5]]
$softwareRequirements[[5]]$`@type`
[1] "SoftwareApplication"

$softwareRequirements[[5]]$identifier
[1] "dplyr"

$softwareRequirements[[5]]$name
[1] "dplyr"

$softwareRequirements[[5]]$provider
$softwareRequirements[[5]]$provider$`@id`
[1] "https://cran.r-project.org"

$softwareRequirements[[5]]$provider$`@type`
[1] "Organization"

$softwareRequirements[[5]]$provider$name
[1] "Central R Archive Network (CRAN)"

$softwareRequirements[[5]]$provider$url
[1] "https://cran.r-project.org"



$softwareRequirements[[6]]
$softwareRequirements[[6]]$`@type`
[1] "SoftwareApplication"

$softwareRequirements[[6]]$identifier
[1] "reshape"

$softwareRequirements[[6]]$name
[1] "reshape"

$softwareRequirements[[6]]$provider
$softwareRequirements[[6]]$provider$`@id`
[1] "https://cran.r-project.org"

$softwareRequirements[[6]]$provider$`@type`
[1] "Organization"

$softwareRequirements[[6]]$provider$name
[1] "Central R Archive Network (CRAN)"

$softwareRequirements[[6]]$provider$url
[1] "https://cran.r-project.org"



$softwareRequirements[[7]]
$softwareRequirements[[7]]$`@type`
[1] "SoftwareApplication"

$softwareRequirements[[7]]$identifier
[1] "reshape2"

$softwareRequirements[[7]]$name
[1] "reshape2"

$softwareRequirements[[7]]$provider
$softwareRequirements[[7]]$provider$`@id`
[1] "https://cran.r-project.org"

$softwareRequirements[[7]]$provider$`@type`
[1] "Organization"

$softwareRequirements[[7]]$provider$name
[1] "Central R Archive Network (CRAN)"

$softwareRequirements[[7]]$provider$url
[1] "https://cran.r-project.org"



$softwareRequirements[[8]]
$softwareRequirements[[8]]$`@type`
[1] "SoftwareApplication"

$softwareRequirements[[8]]$identifier
[1] "scrapeR"

$softwareRequirements[[8]]$name
[1] "scrapeR"

$softwareRequirements[[8]]$provider
$softwareRequirements[[8]]$provider$`@id`
[1] "https://cran.r-project.org"

$softwareRequirements[[8]]$provider$`@type`
[1] "Organization"

$softwareRequirements[[8]]$provider$name
[1] "Central R Archive Network (CRAN)"

$softwareRequirements[[8]]$provider$url
[1] "https://cran.r-project.org"



$softwareRequirements[[9]]
$softwareRequirements[[9]]$`@type`
[1] "SoftwareApplication"

$softwareRequirements[[9]]$identifier
[1] "ggplot2"

$softwareRequirements[[9]]$name
[1] "ggplot2"

$softwareRequirements[[9]]$provider
$softwareRequirements[[9]]$provider$`@id`
[1] "https://cran.r-project.org"

$softwareRequirements[[9]]$provider$`@type`
[1] "Organization"

$softwareRequirements[[9]]$provider$name
[1] "Central R Archive Network (CRAN)"

$softwareRequirements[[9]]$provider$url
[1] "https://cran.r-project.org"



$softwareRequirements[[10]]
$softwareRequirements[[10]]$`@type`
[1] "SoftwareApplication"

$softwareRequirements[[10]]$identifier
[1] "DT"

$softwareRequirements[[10]]$name
[1] "DT"

$softwareRequirements[[10]]$provider
$softwareRequirements[[10]]$provider$`@id`
[1] "https://cran.r-project.org"

$softwareRequirements[[10]]$provider$`@type`
[1] "Organization"

$softwareRequirements[[10]]$provider$name
[1] "Central R Archive Network (CRAN)"

$softwareRequirements[[10]]$provider$url
[1] "https://cran.r-project.org"



$softwareRequirements[[11]]
$softwareRequirements[[11]]$`@type`
[1] "SoftwareApplication"

$softwareRequirements[[11]]$identifier
[1] "gridExtra"

$softwareRequirements[[11]]$name
[1] "gridExtra"

$softwareRequirements[[11]]$provider
$softwareRequirements[[11]]$provider$`@id`
[1] "https://cran.r-project.org"

$softwareRequirements[[11]]$provider$`@type`
[1] "Organization"

$softwareRequirements[[11]]$provider$name
[1] "Central R Archive Network (CRAN)"

$softwareRequirements[[11]]$provider$url
[1] "https://cran.r-project.org"



$softwareRequirements[[12]]
$softwareRequirements[[12]]$`@type`
[1] "SoftwareApplication"

$softwareRequirements[[12]]$identifier
[1] "mgcv"

$softwareRequirements[[12]]$name
[1] "mgcv"

$softwareRequirements[[12]]$provider
$softwareRequirements[[12]]$provider$`@id`
[1] "https://cran.r-project.org"

$softwareRequirements[[12]]$provider$`@type`
[1] "Organization"

$softwareRequirements[[12]]$provider$name
[1] "Central R Archive Network (CRAN)"

$softwareRequirements[[12]]$provider$url
[1] "https://cran.r-project.org"



$softwareRequirements[[13]]
$softwareRequirements[[13]]$`@type`
[1] "SoftwareApplication"

$softwareRequirements[[13]]$identifier
[1] "rvest"

$softwareRequirements[[13]]$name
[1] "rvest"

$softwareRequirements[[13]]$provider
$softwareRequirements[[13]]$provider$`@id`
[1] "https://cran.r-project.org"

$softwareRequirements[[13]]$provider$`@type`
[1] "Organization"

$softwareRequirements[[13]]$provider$name
[1] "Central R Archive Network (CRAN)"

$softwareRequirements[[13]]$provider$url
[1] "https://cran.r-project.org"



$softwareRequirements[[14]]
$softwareRequirements[[14]]$`@type`
[1] "SoftwareApplication"

$softwareRequirements[[14]]$identifier
[1] "purrr"

$softwareRequirements[[14]]$name
[1] "purrr"

$softwareRequirements[[14]]$provider
$softwareRequirements[[14]]$provider$`@id`
[1] "https://cran.r-project.org"

$softwareRequirements[[14]]$provider$`@type`
[1] "Organization"

$softwareRequirements[[14]]$provider$name
[1] "Central R Archive Network (CRAN)"

$softwareRequirements[[14]]$provider$url
[1] "https://cran.r-project.org"



$softwareRequirements[[15]]
$softwareRequirements[[15]]$`@type`
[1] "SoftwareApplication"

$softwareRequirements[[15]]$identifier
[1] "xml2"

$softwareRequirements[[15]]$name
[1] "xml2"

$softwareRequirements[[15]]$provider
$softwareRequirements[[15]]$provider$`@id`
[1] "https://cran.r-project.org"

$softwareRequirements[[15]]$provider$`@type`
[1] "Organization"

$softwareRequirements[[15]]$provider$name
[1] "Central R Archive Network (CRAN)"

$softwareRequirements[[15]]$provider$url
[1] "https://cran.r-project.org"



$softwareRequirements[[16]]
$softwareRequirements[[16]]$`@type`
[1] "SoftwareApplication"

$softwareRequirements[[16]]$identifier
[1] "nnet"

$softwareRequirements[[16]]$name
[1] "nnet"

$softwareRequirements[[16]]$provider
$softwareRequirements[[16]]$provider$`@id`
[1] "https://cran.r-project.org"

$softwareRequirements[[16]]$provider$`@type`
[1] "Organization"

$softwareRequirements[[16]]$provider$name
[1] "Central R Archive Network (CRAN)"

$softwareRequirements[[16]]$provider$url
[1] "https://cran.r-project.org"



$softwareRequirements[[17]]
$softwareRequirements[[17]]$`@type`
[1] "SoftwareApplication"

$softwareRequirements[[17]]$identifier
[1] "magrittr"

$softwareRequirements[[17]]$name
[1] "magrittr"

$softwareRequirements[[17]]$provider
$softwareRequirements[[17]]$provider$`@id`
[1] "https://cran.r-project.org"

$softwareRequirements[[17]]$provider$`@type`
[1] "Organization"

$softwareRequirements[[17]]$provider$name
[1] "Central R Archive Network (CRAN)"

$softwareRequirements[[17]]$provider$url
[1] "https://cran.r-project.org"




$citation
$citation[[1]]
$citation[[1]]$`@type`
[1] "SoftwareSourceCode"

$citation[[1]]$author
$citation[[1]]$author[[1]]
$citation[[1]]$author[[1]]$`@type`
[1] "Person"

$citation[[1]]$author[[1]]$givenName
[1] "Maksim"

$citation[[1]]$author[[1]]$familyName
[1] "Horowitz"

$citation[[1]]$author[[1]]$email
[1] "maksim.horowitz@gmail.com"


$citation[[1]]$author[[2]]
$citation[[1]]$author[[2]]$`@type`
[1] "Person"

$citation[[1]]$author[[2]]$givenName
[1] "Ron"

$citation[[1]]$author[[2]]$familyName
[1] "Yurko"

$citation[[1]]$author[[2]]$email
[1] "ryurko21@gmail.com"



$citation[[1]]$name
[1] "nflscrapR: Will scrape NFL play-by-play and boxscore data across full seasons"

$citation[[1]]$url
[1] "https://github.com/maksimhorowitz/nflscrapR"

$citation[[1]]$description
[1] "R package version 1.4.0"
https://doi.org/doi:10.5063/schema/codemeta-2.0

http://schema.org
SoftwareSourceCode
nflscrapR
This package allows data driven sports enthusiasts to use the NFL JSON API data to perform detailed analysis on the game, player, and season levels.  The 11 functions within this package helps parse and clean the data from Nfl.com for R users.  nflscrapR was build to enhance advanced sports analytics research specifically for American Football with the hopes of developing metrics and insights that could potentially be useful for professional NFL teams. 
    R (>= 3.0.2)
nflscrapR: Will scrape NFL play-by-play and boxscore data across full
        seasons
https://github.com/maksimhorowitz/nflscrapR/issues
https://spdx.org/licenses/CC0-1.0
1.4.0
ComputerLanguage
R
3.4.1
https://r-project.org
R version 3.4.1 (2017-06-30)
Person
Maksim
Horowitz
maksim.horowitz@gmail.com
Person
Ron
Yurko
ryurko21@gmail.com
Person
Maksim
Horowitz
maksim.horowitz@gmail.com
SoftwareApplication
testthat
testthat
https://cran.r-project.org
Organization
Central R Archive Network (CRAN)
https://cran.r-project.org
SoftwareApplication
knitr
knitr
https://cran.r-project.org
Organization
Central R Archive Network (CRAN)
https://cran.r-project.org
SoftwareApplication
rmarkdown
rmarkdown
https://cran.r-project.org
Organization
Central R Archive Network (CRAN)
https://cran.r-project.org
SoftwareApplication
RJSONIO
RJSONIO
https://cran.r-project.org
Organization
Central R Archive Network (CRAN)
https://cran.r-project.org
SoftwareApplication
RCurl
RCurl
https://cran.r-project.org
Organization
Central R Archive Network (CRAN)
https://cran.r-project.org
SoftwareApplication
stringr
stringr
https://cran.r-project.org
Organization
Central R Archive Network (CRAN)
https://cran.r-project.org
SoftwareApplication
lubridate
lubridate
https://cran.r-project.org
Organization
Central R Archive Network (CRAN)
https://cran.r-project.org
SoftwareApplication
dplyr
dplyr
https://cran.r-project.org
Organization
Central R Archive Network (CRAN)
https://cran.r-project.org
SoftwareApplication
reshape
reshape
https://cran.r-project.org
Organization
Central R Archive Network (CRAN)
https://cran.r-project.org
SoftwareApplication
reshape2
reshape2
https://cran.r-project.org
Organization
Central R Archive Network (CRAN)
https://cran.r-project.org
SoftwareApplication
scrapeR
scrapeR
https://cran.r-project.org
Organization
Central R Archive Network (CRAN)
https://cran.r-project.org
SoftwareApplication
ggplot2
ggplot2
https://cran.r-project.org
Organization
Central R Archive Network (CRAN)
https://cran.r-project.org
SoftwareApplication
DT
DT
https://cran.r-project.org
Organization
Central R Archive Network (CRAN)
https://cran.r-project.org
SoftwareApplication
gridExtra
gridExtra
https://cran.r-project.org
Organization
Central R Archive Network (CRAN)
https://cran.r-project.org
SoftwareApplication
mgcv
mgcv
https://cran.r-project.org
Organization
Central R Archive Network (CRAN)
https://cran.r-project.org
SoftwareApplication
rvest
rvest
https://cran.r-project.org
Organization
Central R Archive Network (CRAN)
https://cran.r-project.org
SoftwareApplication
purrr
purrr
https://cran.r-project.org
Organization
Central R Archive Network (CRAN)
https://cran.r-project.org
SoftwareApplication
xml2
xml2
https://cran.r-project.org
Organization
Central R Archive Network (CRAN)
https://cran.r-project.org
SoftwareApplication
nnet
nnet
https://cran.r-project.org
Organization
Central R Archive Network (CRAN)
https://cran.r-project.org
SoftwareApplication
magrittr
magrittr
https://cran.r-project.org
Organization
Central R Archive Network (CRAN)
https://cran.r-project.org
SoftwareSourceCode
Person
Maksim
Horowitz
maksim.horowitz@gmail.com
Person
Ron
Yurko
ryurko21@gmail.com
nflscrapR: Will scrape NFL play-by-play and boxscore data across full seasons
https://github.com/maksimhorowitz/nflscrapR
R package version 1.4.0





- [x] crosswalk

code

crosswalk
function (x, from, to = "codemeta", codemeta_context = "https://doi.org/10.5063/schema/codemeta-2.0") 
{
    from_context <- crosswalk_context(crosswalk_table(from), 
        codemeta_context)
    if (to != "codemeta") {
        to_context <- crosswalk_context(crosswalk_table(to), 
            codemeta_context)
        to_context <- toJSON(to_context, auto_unbox = TRUE, pretty = TRUE)
    }
    else {
        to_context <- codemeta_context
    }
    crosswalk_transform(x, crosswalk_context = from_context, 
        codemeta_context = to_context)
}
<environment: namespace:codemetar>


documentation

?crosswalk

Description in help file could be a touch more informative, eg:

Crosswalk between different metadata fields used by different repositories, registries and archives. For more details see here.

Also suggest that where the crosswalk table is mentioned, a link to it be supplied.

e.g.

from the corresponding column name from the crosswalk table.

Finally, while it is relatively straight forward to get the crosswalk .csv, I feel it might be good to be able to access information from it through the package. Here are some suggestions based on what I would find personally useful:

  • At the very least to have a function that just fetches the .csv.

But moving beyond that it could be useful to have a few helper functions to quickly interrogate it? e.g.

  • I’d find it quite useful to quickly get the options for arguments to and from in crosswalk. Could be cool to have another function eg crosswalks that prints the available crosswalk column options. e.g.
crosswalks <- function(){
    df <-
        readr::read_csv(
            "https://github.com/codemeta/codemeta/raw/master/crosswalk.csv",
            col_types = cols(.default = "c"))
    names(df)[!names(df) %in% c("Parent Type", "Property", "Type", "Description")]
}

crosswalks()
 [1] "codemeta-V1"                          "DataCite"                            
 [3] "OntoSoft"                             "Zenodo"                              
 [5] "GitHub"                               "Figshare"                            
 [7] "Software Ontology"                    "Software Discovery Index"            
 [9] "Dublin Core"                          "R Package Description"               
[11] "Debian Package"                       "Python Distutils (PyPI)"             
[13] "Trove Software Map"                   "Perl Module Description (CPAN::Meta)"
[15] "NodeJS"                               "Java (Maven)"                        
[17] "Octave"                               "Ruby Gem"                            
[19] "ASCL"                                 "DOAP"                                
[21] "Wikidata"                            
codemeta-V1

DataCite

OntoSoft

Zenodo

GitHub

Figshare

Software Ontology

Software Discovery Index

Dublin Core

R Package Description

Debian Package

Python Distutils (PyPI)

Trove Software Map

Perl Module Description (CPAN::Meta)

NodeJS

Java (Maven)

Octave

Ruby Gem

ASCL

DOAP

Wikidata
  • I also found the non-exported function crosswalk_table quite useful (some commented out code in there). Other’s might too?

  • But I feel the most useful is to be able to narrow down field matches between particular repositories of interest. So building on the crosswalk_table function, I would probably find the following functions quite useful:

library(readr)
crosswalk_map <- function(from, to, 
                            full_crosswalk =
  "https://github.com/codemeta/codemeta/raw/master/crosswalk.csv",
  trim = FALSE){
  df <-
    readr::read_csv(full_crosswalk,
             col_types = cols(.default = "c"))
  df <- df[c("Property", from, to)]
  if(trim) df <- df[!is.na(df[,from]),] # trim to `from` argument fields
  df
}

crosswalk_map(from = "GitHub", to = c("Zenodo", "Figshare"), trim = T)

examples

help file example
## Not run: 
## Crosswalk data returned by the GitHub API into CodeMeta format
r <- gh::gh("/repos/:owner/:repo", owner = "ropensci", repo = "EML")
class(r)
[1] "gh_response" "list"       
gh_response

list
r_json.ld <- crosswalk(r, "GitHub")
class(r_json.ld)
[1] "json"
json
codemeta_validate(r_json.ld)
[1] TRUE
r_json.ld
{
  "@context": "https://doi.org/10.5063/schema/codemeta-2.0",
  "codeRepository": "https://github.com/ropensci/EML",
  "dateCreated": "2013-06-23T23:20:03Z",
  "dateModified": "2017-07-16T23:31:02Z",
  "description": " Ecological Metadata Language interface for R: synthesis and integration of heterogenous data",
  "downloadUrl": "https://api.github.com/repos/ropensci/EML/{archive_format}{/ref}",
  "identifier": "10894022",
  "name": "ropensci/EML",
  "programmingLanguage": "https://api.github.com/repos/ropensci/EML/languages",
  "issueTracker": "https://api.github.com/repos/ropensci/EML/issues{/number}"
} 
Let’s go from github to Zenodo.
crosswalk(r, "GitHub", "Zenodo")
{
  "@context": {
    "schema": "http://schema.org/",
    "codemeta": "https://codemeta.github.io/terms/",
    "relatedLink": {
      "@id": "schema:codeRepository",
      "@type": "@id"
    },
    "communities": {
      "@id": "schema:applicationCategory",
      "@type": "@id"
    },
    "creators": {
      "@id": "schema:author",
      "@container": "@list"
    },
    "date_published": {
      "@id": "schema:datePublished",
      "@type": "schema:Date"
    },
    "contributors.Funder": {
      "@id": "schema:funder"
    },
    "keywords": {
      "@id": "schema:keywords"
    },
    "license": {
      "@id": "schema:license",
      "@type": "@id"
    },
    "description/notes": {
      "@id": "schema:description"
    },
    "id": {
      "@id": "schema:identifier",
      "@type": "@id"
    },
    "title": {
      "@id": "schema:name"
    },
    "affiliation": {
      "@id": "schema:affiliation"
    },
    "ORCID": {
      "@id": "schema:identifier",
      "@type": "@id"
    },
    "name": {
      "@id": "schema:name"
    }
  },
  "relatedLink": "https://github.com/ropensci/EML",
  "schema:dateCreated": {
    "@type": "schema:Date",
    "@value": "2013-06-23T23:20:03Z"
  },
  "schema:dateModified": {
    "@type": "schema:Date",
    "@value": "2017-07-16T23:31:02Z"
  },
  "description/notes": " Ecological Metadata Language interface for R: synthesis and integration of heterogenous data",
  "schema:downloadUrl": {
    "@id": "https://api.github.com/repos/ropensci/EML/{archive_format}{/ref}"
  },
  "id": "10894022",
  "name": "ropensci/EML",
  "schema:programmingLanguage": "https://api.github.com/repos/ropensci/EML/languages",
  "codemeta:issueTracker": {
    "@id": "https://api.github.com/repos/ropensci/EML/issues{/number}"
  }
} 

Let’s try and break it!

crosswalk(r, "myImaginaryRepo")

A reasonably informative error when combined with ?crosswalk

crosswalk_table <- function(column,
                            full_crosswalk =
  "https://github.com/codemeta/codemeta/raw/master/crosswalk.csv"){
  df <-
    readr::read_csv(full_crosswalk,
             col_types = cols(.default = "c"))
  df <- df[c("Property", column)]
  stats::na.omit(df)
  ## df[!is.na(df[[column]]),] ## stats::na.omit
}

crosswalk_context <-
  function(df,
           codemeta_context =
             "https://doi.org/10.5063/schema/codemeta-2.0"){

    context <- jsonlite::read_json(codemeta_context)
    context[[1]][["id"]] <- NULL ## avoid collisions with @id
    properties <- names(context[[1]])

    new_context <- list("@context" =
                        list(schema = "http://schema.org/",
                             codemeta = "https://codemeta.github.io/terms/"))

    for(i in 1:dim(df)[1]){
      original_term <- properties[properties == df[[i, 1]] ]
      new_context[["@context"]][[ df[[i,2]] ]] <- context[[1]][[original_term]]
    }
  new_context
  }





- [ ] drop_context

code

drop_context
function (x, json_output = FALSE) 
{
    if (is(x, "json") || is.character(x)) {
        x <- fromJSON(x)
        json_output <- TRUE
    }
    x$`@context` <- NULL
    if (json_output) {
        x <- toJSON(x, auto_unbox = TRUE, pretty = TRUE)
    }
    x
}
<environment: namespace:codemetar>


documentation

?drop_context

examples

No examples provided

fromJSON(ex)
$`@context`
[1] "https://raw.githubusercontent.com/codemeta/codemeta/master/codemeta.jsonld"

$`@type`
[1] "SoftwareSourceCode"

$identifier
[1] "codemetar"

$description
[1] "Codemeta defines a 'JSON-LD' format for describing software metadata.\n    This package provides utilities to generate, parse, and modify codemeta.jsonld\n    files automatically for R packages."

$name
[1] "codemetar: Generate CodeMeta Metadata for R Packages"

$codeRepository
[1] "https://github.com/codemeta/codemetar"

$issueTracker
[1] "https://github.com/codemeta/codemetar/issues"

$license
[1] "https://spdx.org/licenses/MIT"

$version
[1] "0.1.0"

$programmingLanguage
$programmingLanguage$`@type`
[1] "ComputerLanguage"

$programmingLanguage$name
[1] "R"

$programmingLanguage$version
[1] "3.4.0"

$programmingLanguage$url
[1] "https://r-project.org"


$runtimePlatform
[1] "R version 3.4.0 (2017-04-21)"

$author
   @type givenName familyName              email                                  @id
1 Person      Carl  Boettiger cboettig@gmail.com http://orcid.org/0000-0002-1642-628X

$copyrightHolder
   @type givenName familyName              email                                  @id
1 Person      Carl  Boettiger cboettig@gmail.com http://orcid.org/0000-0002-1642-628X

$maintainer
$maintainer$`@type`
[1] "Person"

$maintainer$givenName
[1] "Carl"

$maintainer$familyName
[1] "Boettiger"

$maintainer$email
[1] "cboettig@gmail.com"

$maintainer$`@id`
[1] "http://orcid.org/0000-0002-1642-628X"


$softwareSuggestions
                @type         name               provider.@id provider.@type
1 SoftwareApplication     testthat https://cran.r-project.org   Organization
2 SoftwareApplication jsonvalidate https://cran.r-project.org   Organization
3 SoftwareApplication         covr https://cran.r-project.org   Organization
4 SoftwareApplication        knitr https://cran.r-project.org   Organization
5 SoftwareApplication    rmarkdown https://cran.r-project.org   Organization
6 SoftwareApplication         httr https://cran.r-project.org   Organization
7 SoftwareApplication     magrittr https://cran.r-project.org   Organization
8 SoftwareApplication        readr https://cran.r-project.org   Organization
9 SoftwareApplication         xml2 https://cran.r-project.org   Organization
                     provider.name               provider.url
1 Central R Archive Network (CRAN) https://cran.r-project.org
2 Central R Archive Network (CRAN) https://cran.r-project.org
3 Central R Archive Network (CRAN) https://cran.r-project.org
4 Central R Archive Network (CRAN) https://cran.r-project.org
5 Central R Archive Network (CRAN) https://cran.r-project.org
6 Central R Archive Network (CRAN) https://cran.r-project.org
7 Central R Archive Network (CRAN) https://cran.r-project.org
8 Central R Archive Network (CRAN) https://cran.r-project.org
9 Central R Archive Network (CRAN) https://cran.r-project.org

$softwareRequirements
                @type     name version               provider.@id provider.@type
1 SoftwareApplication jsonlite     1.3 https://cran.r-project.org   Organization
2 SoftwareApplication   jsonld    <NA> https://cran.r-project.org   Organization
3 SoftwareApplication    git2r    <NA> https://cran.r-project.org   Organization
4 SoftwareApplication devtools    <NA> https://cran.r-project.org   Organization
5 SoftwareApplication  methods    <NA>                       <NA>           <NA>
6 SoftwareApplication        R   3.0.0                       <NA>           <NA>
                     provider.name               provider.url
1 Central R Archive Network (CRAN) https://cran.r-project.org
2 Central R Archive Network (CRAN) https://cran.r-project.org
3 Central R Archive Network (CRAN) https://cran.r-project.org
4 Central R Archive Network (CRAN) https://cran.r-project.org
5                             <NA>                       <NA>
6                             <NA>                       <NA>

$contIntegration
[1] "https://travis-ci.org/codemeta/codemetar"

$developmentStatus
[1] "wip"

$releaseNotes
[1] "https://github.com/codemeta/codemetar/blob/master/README.md"

$readme
[1] "https://github.com/codemeta/codemetar/blob/master/README.md"

$fileSize
[1] "119.335KB"
https://raw.githubusercontent.com/codemeta/codemeta/master/codemeta.jsonld
SoftwareSourceCode
codemetar
Codemeta defines a 'JSON-LD' format for describing software metadata.
    This package provides utilities to generate, parse, and modify codemeta.jsonld
    files automatically for R packages.
codemetar: Generate CodeMeta Metadata for R Packages
https://github.com/codemeta/codemetar
https://github.com/codemeta/codemetar/issues
https://spdx.org/licenses/MIT
0.1.0
ComputerLanguage
R
3.4.0
https://r-project.org
R version 3.4.0 (2017-04-21)
Person
Carl
Boettiger
cboettig@gmail.com
http://orcid.org/0000-0002-1642-628X
https://travis-ci.org/codemeta/codemetar
wip
https://github.com/codemeta/codemetar/blob/master/README.md
https://github.com/codemeta/codemetar/blob/master/README.md
119.335KB
fromJSON(ex) %>% drop_context()
$`@type`
[1] "SoftwareSourceCode"

$identifier
[1] "codemetar"

$description
[1] "Codemeta defines a 'JSON-LD' format for describing software metadata.\n    This package provides utilities to generate, parse, and modify codemeta.jsonld\n    files automatically for R packages."

$name
[1] "codemetar: Generate CodeMeta Metadata for R Packages"

$codeRepository
[1] "https://github.com/codemeta/codemetar"

$issueTracker
[1] "https://github.com/codemeta/codemetar/issues"

$license
[1] "https://spdx.org/licenses/MIT"

$version
[1] "0.1.0"

$programmingLanguage
$programmingLanguage$`@type`
[1] "ComputerLanguage"

$programmingLanguage$name
[1] "R"

$programmingLanguage$version
[1] "3.4.0"

$programmingLanguage$url
[1] "https://r-project.org"


$runtimePlatform
[1] "R version 3.4.0 (2017-04-21)"

$author
   @type givenName familyName              email                                  @id
1 Person      Carl  Boettiger cboettig@gmail.com http://orcid.org/0000-0002-1642-628X

$copyrightHolder
   @type givenName familyName              email                                  @id
1 Person      Carl  Boettiger cboettig@gmail.com http://orcid.org/0000-0002-1642-628X

$maintainer
$maintainer$`@type`
[1] "Person"

$maintainer$givenName
[1] "Carl"

$maintainer$familyName
[1] "Boettiger"

$maintainer$email
[1] "cboettig@gmail.com"

$maintainer$`@id`
[1] "http://orcid.org/0000-0002-1642-628X"


$softwareSuggestions
                @type         name               provider.@id provider.@type
1 SoftwareApplication     testthat https://cran.r-project.org   Organization
2 SoftwareApplication jsonvalidate https://cran.r-project.org   Organization
3 SoftwareApplication         covr https://cran.r-project.org   Organization
4 SoftwareApplication        knitr https://cran.r-project.org   Organization
5 SoftwareApplication    rmarkdown https://cran.r-project.org   Organization
6 SoftwareApplication         httr https://cran.r-project.org   Organization
7 SoftwareApplication     magrittr https://cran.r-project.org   Organization
8 SoftwareApplication        readr https://cran.r-project.org   Organization
9 SoftwareApplication         xml2 https://cran.r-project.org   Organization
                     provider.name               provider.url
1 Central R Archive Network (CRAN) https://cran.r-project.org
2 Central R Archive Network (CRAN) https://cran.r-project.org
3 Central R Archive Network (CRAN) https://cran.r-project.org
4 Central R Archive Network (CRAN) https://cran.r-project.org
5 Central R Archive Network (CRAN) https://cran.r-project.org
6 Central R Archive Network (CRAN) https://cran.r-project.org
7 Central R Archive Network (CRAN) https://cran.r-project.org
8 Central R Archive Network (CRAN) https://cran.r-project.org
9 Central R Archive Network (CRAN) https://cran.r-project.org

$softwareRequirements
                @type     name version               provider.@id provider.@type
1 SoftwareApplication jsonlite     1.3 https://cran.r-project.org   Organization
2 SoftwareApplication   jsonld    <NA> https://cran.r-project.org   Organization
3 SoftwareApplication    git2r    <NA> https://cran.r-project.org   Organization
4 SoftwareApplication devtools    <NA> https://cran.r-project.org   Organization
5 SoftwareApplication  methods    <NA>                       <NA>           <NA>
6 SoftwareApplication        R   3.0.0                       <NA>           <NA>
                     provider.name               provider.url
1 Central R Archive Network (CRAN) https://cran.r-project.org
2 Central R Archive Network (CRAN) https://cran.r-project.org
3 Central R Archive Network (CRAN) https://cran.r-project.org
4 Central R Archive Network (CRAN) https://cran.r-project.org
5                             <NA>                       <NA>
6                             <NA>                       <NA>

$contIntegration
[1] "https://travis-ci.org/codemeta/codemetar"

$developmentStatus
[1] "wip"

$releaseNotes
[1] "https://github.com/codemeta/codemetar/blob/master/README.md"

$readme
[1] "https://github.com/codemeta/codemetar/blob/master/README.md"

$fileSize
[1] "119.335KB"
SoftwareSourceCode
codemetar
Codemeta defines a 'JSON-LD' format for describing software metadata.
    This package provides utilities to generate, parse, and modify codemeta.jsonld
    files automatically for R packages.
codemetar: Generate CodeMeta Metadata for R Packages
https://github.com/codemeta/codemetar
https://github.com/codemeta/codemetar/issues
https://spdx.org/licenses/MIT
0.1.0
ComputerLanguage
R
3.4.0
https://r-project.org
R version 3.4.0 (2017-04-21)
Person
Carl
Boettiger
cboettig@gmail.com
http://orcid.org/0000-0002-1642-628X
https://travis-ci.org/codemeta/codemetar
wip
https://github.com/codemeta/codemetar/blob/master/README.md
https://github.com/codemeta/codemetar/blob/master/README.md
119.335KB


- [x] write_codemeta

code

write_codemeta
function (pkg = ".", path = "codemeta.json", root = ".", id = NULL, 
    force_update = getOption("codemeta_force_update", TRUE), 
    ...) 
{
    if (file.exists(file.path(pkg, "DESCRIPTION"))) {
        devtools::use_build_ignore("codemeta.json", pkg = pkg)
    }
    cm <- create_codemeta(pkg = pkg, root = root)
    jsonlite::write_json(cm, path, pretty = TRUE, auto_unbox = TRUE, 
        ...)
}
<environment: namespace:codemetar>

When writing the file into a package (ie when DESCRIPTION is detected), adding "codemeta.json" to .Rbuildignore assumes that the user has not changed the path. While it is advised in the help file to leave as default, as the user can change it, there could theoretically be a situation where the user has called it something else but the function has written "codemeta.json" to .Rbuildignore. Just wondering whether that would cause in problems downstream or somehow guarded against or warned?

Which brings me to a suggestion for the documentation. Currently the description is just the name of the function. But what I like is that it cleverly automates the creation of a codemeta file within a package. My impression is that this will become a standard file that all r packages will have and therefore following standard proceedure when creating and naming conventions (ie keep default "codemeta.json" name and save in package root). While the function is set up beautifully to this as default, it might be worth mentioning, either in the kelp file or the README, what the broader intention behind these settings is.


documentation

?write_codemeta

In terms of good quality control of information relating to existing packages I really appreciate the automatic updating and overwriting of fields in a supplied. For what appears to me to be the main use case envisaged (ie creating a )

examples

break.author <- create_codemeta("codemetar")
break.author$author[[1]]$givenName <- "Anna"
break.author$author[[1]]$familyName <- "Krystalli"
break.author$author[[1]]
$`@type`
[1] "Person"

$givenName
[1] "Anna"

$familyName
[1] "Krystalli"

$email
[1] "cboettig@gmail.com"

$`@id`
[1] "http://orcid.org/0000-0002-1642-628X"
Person
Anna
Krystalli
cboettig@gmail.com
http://orcid.org/0000-0002-1642-628X
is(break.author %>% toJSON, "json")
[1] TRUE
break.author %>% codemeta_validate()

returns error: Error in file.exists(codemeta) : invalid 'file' argument

codemeta_validate("codemeta_breakit.json")
[1] TRUE

Changing the path to save somewhere other than the working directory:

  • If no root is supplied, information is not automatically updated from the package and I’ve managed to retain my name as the author.
write_codemeta(pkg = break.author, path = "../test-codemetas/codemeta_breakit.json")
Warning in if (file.exists(file.path(pkg, "DESCRIPTION"))) {: the condition has length >
1 and only the first element will be used
codemeta_validate("../test-codemetas/codemeta_breakit.json")
[1] TRUE
read_json("../test-codemetas/codemeta_breakit.json")$author
[[1]]
[[1]]$`@type`
[1] "Person"

[[1]]$givenName
[1] "Anna"

[[1]]$familyName
[1] "Krystalli"

[[1]]$email
[1] "cboettig@gmail.com"

[[1]]$`@id`
[1] "http://orcid.org/0000-0002-1642-628X"
Person
Anna
Krystalli
cboettig@gmail.com
http://orcid.org/0000-0002-1642-628X
  • If root is supplied, the incorrect information is replaced with the correct information from the DESCRIPTION.
write_codemeta(pkg = break.author, path = "../test-codemetas/codemeta_breakit2.json", root = "../pkg/codemetar/")
Warning in if (file.exists(file.path(pkg, "DESCRIPTION"))) {: the condition has length >
1 and only the first element will be used
codemeta_validate("../test-codemetas/codemeta_breakit2.json")
[1] TRUE
read_json("../test-codemetas/codemeta_breakit2.json")$author
[[1]]
[[1]]$`@type`
[1] "Person"

[[1]]$givenName
[1] "Carl"

[[1]]$familyName
[1] "Boettiger"

[[1]]$email
[1] "cboettig@gmail.com"

[[1]]$`@id`
[1] "http://orcid.org/0000-0002-1642-628X"
Person
Carl
Boettiger
cboettig@gmail.com
http://orcid.org/0000-0002-1642-628X
write_codemeta(pkg = "../pkg/codemetar/", path = "codemeta1.json")


Overall comments:

I think it could be useful to make a distinction in the functions and documentation between codemeta JSON-LD format and the codemeta JSON-LD r list objects. Let’s say we associated codemeta with the JSON-LD format and codemetar with r lists. Using these associations in function names could make it a bit more explicit to the user. E.g. Functions write_codemeta and validate_codemeta would remain the same because they either output or work on JSON-LD formats but create_codemeta could become create_codemetar to indicate that the output is an r list? I only mention it because it confused me a little at times.

ie slight confusion throughout documentation. For example I believe that the same datatype is referenced in crosswalk documentation as JSON list, while in create_codemeta documentation as codemeta object (list). I think standardisation of the terminology throughout documentation would be best.

LS0tCnRpdGxlOiAicmV2aWV3IHdvcmtmbG93IgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgoKYGBge3J9CmxpYnJhcnkoZGV2dG9vbHMpCmRldnRvb2xzOjpzZXNzaW9uX2luZm8oKQpgYGAKCmBgYHtyLCBlY2hvPUZBTFNFfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShqc29ubGl0ZSkKYGBgCgoKIyMgVGVzdCBpbnN0YWxsYXRpb24gYW5kIGxvYWRpbmcKCmBgYHtyfQpkZXZ0b29sczo6aW5zdGFsbF9naXRodWIoImNvZGVtZXRhL2NvZGVtZXRhciIpCiNkZXZ0b29sczo6aW5zdGFsbF9naXRodWIoImNvZGVtZXRhL2NvZGVtZXRhciIsIGZvcmNlID0gVCkKYGBgCmBgYHtyfQpsaWJyYXJ5KCJjb2RlbWV0YXIiKQpgYGAKCkFsbCBsb29rcyBnb29kIHNvIGZhci4KCiMjIENoZWNrIGZ1bmN0aW9ucwoKIyMjIEFsbCBmdW5jdGlvbnM6CmBgYHtyfQoKbHMoInBhY2thZ2U6Y29kZW1ldGFyIikKYGBgCjxicj4KCiMjIyBbeF0gY29kZW1ldGFfdmFsaWRhdGUKCjxicj4KCiMjIyMgY29kZQpgYGB7cn0KY29kZW1ldGFfdmFsaWRhdGUKYGBgCgo8YnI+CgojIyMjIGRvY3VtZW50YXRpb24KCmBgYHtyfQo/Y29kZW1ldGFfdmFsaWRhdGUKYGBgCi0gSSB0aGluayB0aGUgZGVzY3JpcHRpb24gbWlnaHQgbm90IGJlIGNvbXBsZXRlPyAoaWUgLi4udmVyaWZ5aW5nIHRoYXQgdGhlIHJlc3VsdCAqKiptYXRjaGVzIG9yIGNvbmZvcm1zIHRvIHN0aD8qKiopLiAKCgo8YnI+CgojIyMjIGV4YW1wbGVzCgpgYGB7cn0KZXggPC0gc3lzdGVtLmZpbGUoImV4YW1wbGVzL2NvZGVtZXRhLmpzb24iLCBwYWNrYWdlPSJjb2RlbWV0YXIiKQpleApjb2RlbWV0YV92YWxpZGF0ZShleCkKYGBgClJhbmRvbSB4bWwgZmlsZQpgYGB7ciwgZXZhbD1GQUxTRX0KY29kZW1ldGFfdmFsaWRhdGUoIi4uL2Fzc2V0cy9leGFtcGxlL2V4YW1wbGUueG1sIikgCmBgYApSYW5kb20ganNvbiBmaWxlCmBgYHtyLCBldmFsPUZBTFNFfQpjb2RlbWV0YV92YWxpZGF0ZSgiLi4vYXNzZXRzL2V4YW1wbGUvZXhhbXBsZS5qc29uIikgCmBgYAoKVmFsaWRhdGUgYSBkaWZmZXJlbnQgYGpzb25gCmBgYHtyfQpjcmVhdGVfY29kZW1ldGEoImpzb25saXRlIikgJT4lIGpzb25saXRlOjp3cml0ZV9qc29uKHBhdGggPSAiLi4vYXNzZXRzL2V4YW1wbGUvanNvbmxpdGUuanNvbiIsIHByZXR0eSA9IFRSVUUsIGF1dG9fdW5ib3ggPSBUUlVFKQpjb2RlbWV0YV92YWxpZGF0ZSgiLi4vYXNzZXRzL2V4YW1wbGUvanNvbmxpdGUuanNvbiIpCmBgYAoKCkRlc3BpdGUgbm90IGJlaW5nIG1lbnRpb25lZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiAoaWUgYGNvZGVtZXRhYCBhcmd1bWVudCBkZXNjcmlwdGlvbiBvbmx5IG1lbnRpb25zIHBhdGgvZmlsZW5hbWUpLCB0aGUgZnVuY3Rpb24gaXMgZ2VhcmVkIHVwIHRvIGFjY2VwdCBhICBgSlNPTi1MRGAgKGFsc28gZGVtb25zdHJhdGVkIGluIHRoZSBjcm9zc3dhbGtpbmcgdmlnbmV0dGUpLgoKZS5nLgoKYGBge3IsIGV2YWw9VFJVRX0KZXhfanNvbiA8LSByZWFkX2pzb24oZXgpICU+JSBjcm9zc3dhbGsoIlIgUGFja2FnZSBEZXNjcmlwdGlvbiIpCmNvZGVtZXRhX3ZhbGlkYXRlKGV4X2pzb24pCmBgYAoKQlRXIHRoaXMgYWxzbyBtYWRlIG1lIHRoaW5rIHRoYXQgYCAlPiUgY3Jvc3N3YWxrKCJSIFBhY2thZ2UgRGVzY3JpcHRpb24iKWAgaXMgdGhlIG9ubHkgd2F5IHRvIGdldCBmcm9tIGEgYEpTT04tTEQgciBsaXN0YCB0byBhIGBKU09OLUxEYCBpbiByIGFzIGB0b0pTT05gIGRvZXNuJ3Qgd29yay4gV2hpbGUgaXRzIGdyZWF0IHRoYXQgdGhlcmUgaXMgYSB3YXkgdG8gZG8gaXQsIGl0IGFsbW9zdCBmZWVscyBhIGJpdCBsaWtlIGEgaGFjay4gQXQgdGhlIHZlcnkgbGVhc3QgSSBmZWVsIGl0IHNob3VsZCBiZSBpbmNsdWRlZCBhcyBhbiBleGFtcGxlIHNvIHRoZSB1c2VycyBhcmUgYXdhcmUgb2YgaXQgYnV0IEknbSB3b25kZXJpbmcgaWYgYW4gZXhwbGljaXQgZnVuY3Rpb24gZm9yIHRoYXQgbWlnaHQgYWxzbyBiZSB1c2VmdWw/Cgo8YnI+PGJyPgoKCiMjIyAtIFt4XSBjcmVhdGVfY29kZW1ldGEKCjxicj4KCiMjIyMgY29kZQpgYGB7cn0KY3JlYXRlX2NvZGVtZXRhCmBgYAo8YnI+CgojIyMjIGRvY3VtZW50YXRpb24KCmBgYHtyfQo/Y3JlYXRlX2NvZGVtZXRhCmBgYAo8YnI+CgojIyMjIGV4YW1wbGVzCgpgYGB7cn0KY20gPC0gY3JlYXRlX2NvZGVtZXRhKCJqc29ubGl0ZSIpCmNtCmBgYAoKIyMjIyMgV2hhdCBpZiB3ZSBpbnN0YWxsIHRoZSBkZXZlbG9wbWVudCB2ZXJzaW9uIG9mIGEgcGFja2FnZT8gRG9lcyBpdCBwaWNrIHRoYXQgdXA/CgpgYGB7ciwgZXZhbD1GQUxTRX0KCmRldnRvb2xzOjppbnN0YWxsX2dpdGh1YigncnN0dWRpby90dWZ0ZScpCmRldi50dWZ0ZSA8LSBjcmVhdGVfY29kZW1ldGEoInR1ZnRlIikKaW5zdGFsbC5wYWNrYWdlcygidHVmdGUiKQpjcmFuLnR1ZnRlIDwtIGNyZWF0ZV9jb2RlbWV0YSgidHVmdGUiKQpgYGAKCmBgYHtyfQphbGwuZXF1YWwoZGV2LnR1ZnRlLCBjcmFuLnR1ZnRlKQpgYGAKRGlmZmVyZW5jZXMgdG8gYmUgZXhwZWN0ZWQuCgpgYGB7cn0KCmNyYW4udHVmdGUkdmVyc2lvbgpkZXYudHVmdGUkdmVyc2lvbgpgYGAKCmBgYHtyfQoKY3Jhbi50dWZ0ZSRjb250cmlidXRvcgpkZXYudHVmdGUkY29udHJpYnV0b3IKYGBgCgpMb29rcyBsaWtlIGBkZXYudHVmdGVgIGhhcyBwaWNrZWQgdXAgYW5vdGhlciBjb250cmlidXRvciEgU3dlZXQhCgoKYGBge3J9CmxpYnJhcnkocmVtb3RlcykKcmVtb3Rlczo6aW5zdGFsbF9naXRodWIoIm1hbmdvdGhlY2F0L2ZyYW5jIikKY3JlYXRlX2NvZGVtZXRhKCJmcmFuYyIpCmBgYAoKCmBgYHtyfQpkZXZ0b29sczo6aW5zdGFsbF9naXRodWIocmVwbyA9ICJtYWtzaW1ob3Jvd2l0ei9uZmxzY3JhcFIiKQpjcmVhdGVfY29kZW1ldGEoIm5mbHNjcmFwUiIpCmBgYAoKCjxicj4KPGJyPgo8YnI+CgoqKioKCgojIyMgLSBbeF0gY3Jvc3N3YWxrCgojIyMjIGNvZGUKYGBge3J9CmNyb3Nzd2FsawpgYGAKCgo8YnI+CgojIyMjIGRvY3VtZW50YXRpb24KCmBgYHtyfQo/Y3Jvc3N3YWxrCmBgYAoKRGVzY3JpcHRpb24gaW4gaGVscCBmaWxlIGNvdWxkIGJlIGEgdG91Y2ggbW9yZSBpbmZvcm1hdGl2ZSwgZWc6Cgo+IENyb3Nzd2FsayBiZXR3ZWVuIGRpZmZlcmVudCBtZXRhZGF0YSBmaWVsZHMgdXNlZCBieSBkaWZmZXJlbnQgcmVwb3NpdG9yaWVzLCByZWdpc3RyaWVzIGFuZCBhcmNoaXZlcy4gRm9yIG1vcmUgZGV0YWlscyBzZWUgW2hlcmVdKGh0dHBzOi8vY29kZW1ldGEuZ2l0aHViLmlvL2Nyb3Nzd2Fsay8pLgoKQWxzbyBzdWdnZXN0IHRoYXQgd2hlcmUgdGhlIGNyb3Nzd2FsayB0YWJsZSBpcyBtZW50aW9uZWQsIGEgbGluayB0byBpdCBiZSBzdXBwbGllZC4KCmUuZy4gCgo+IGBmcm9tYAl0aGUgY29ycmVzcG9uZGluZyBjb2x1bW4gbmFtZSBmcm9tIHRoZSBbY3Jvc3N3YWxrIHRhYmxlXShodHRwczovL2dpdGh1Yi5jb20vY29kZW1ldGEvY29kZW1ldGEvYmxvYi9tYXN0ZXIvY3Jvc3N3YWxrLmNzdikuCgoKCkZpbmFsbHksIHdoaWxlIGl0IGlzIHJlbGF0aXZlbHkgc3RyYWlnaHQgZm9yd2FyZCB0byBnZXQgIHRoZSBjcm9zc3dhbGsgLmNzdiwgSSBmZWVsIGl0IG1pZ2h0IGJlIGdvb2QgdG8gYmUgYWJsZSB0byBhY2Nlc3MgaW5mb3JtYXRpb24gZnJvbSBpdCB0aHJvdWdoIHRoZSBwYWNrYWdlLiBIZXJlIGFyZSBzb21lIHN1Z2dlc3Rpb25zIGJhc2VkIG9uIHdoYXQgSSB3b3VsZCBmaW5kIHBlcnNvbmFsbHkgdXNlZnVsOgoKLSBBdCB0aGUgdmVyeSBsZWFzdCB0byBoYXZlIGEgZnVuY3Rpb24gdGhhdCBqdXN0IGZldGNoZXMgdGhlIGAuY3N2YC4KCkJ1dCBtb3ZpbmcgYmV5b25kIHRoYXQgaXQgY291bGQgYmUgdXNlZnVsIHRvIGhhdmUgYSBmZXcgaGVscGVyIGZ1bmN0aW9ucyB0byBxdWlja2x5IGludGVycm9nYXRlIGl0PyBlLmcuCgotIEknZCBmaW5kIGl0IHF1aXRlIHVzZWZ1bCB0byBxdWlja2x5IGdldCB0aGUgb3B0aW9ucyBmb3IgYXJndW1lbnRzIGB0b2AgYW5kIGBmcm9tYCBpbiBgY3Jvc3N3YWxrYC4gQ291bGQgYmUgY29vbCB0byBoYXZlIGFub3RoZXIgZnVuY3Rpb24gZWcgYGNyb3Nzd2Fsa3NgIHRoYXQgcHJpbnRzIHRoZSBhdmFpbGFibGUgY3Jvc3N3YWxrIGNvbHVtbiBvcHRpb25zLiBlLmcuCgpgYGB7cn0KY3Jvc3N3YWxrcyA8LSBmdW5jdGlvbigpewogICAgZGYgPC0KICAgICAgICByZWFkcjo6cmVhZF9jc3YoCiAgICAgICAgICAgICJodHRwczovL2dpdGh1Yi5jb20vY29kZW1ldGEvY29kZW1ldGEvcmF3L21hc3Rlci9jcm9zc3dhbGsuY3N2IiwKICAgICAgICAgICAgY29sX3R5cGVzID0gY29scyguZGVmYXVsdCA9ICJjIikpCiAgICBuYW1lcyhkZilbIW5hbWVzKGRmKSAlaW4lIGMoIlBhcmVudCBUeXBlIiwgIlByb3BlcnR5IiwgIlR5cGUiLCAiRGVzY3JpcHRpb24iKV0KfQoKY3Jvc3N3YWxrcygpCmBgYAoKCi0gSSBhbHNvIGZvdW5kIHRoZSBub24tZXhwb3J0ZWQgZnVuY3Rpb24gYGNyb3Nzd2Fsa190YWJsZWAgcXVpdGUgdXNlZnVsIChzb21lIGNvbW1lbnRlZCBvdXQgY29kZSBpbiB0aGVyZSkuIE90aGVyJ3MgbWlnaHQgdG9vPwoKLSBCdXQgSSBmZWVsIHRoZSBtb3N0IHVzZWZ1bCBpcyB0byBiZSBhYmxlIHRvIG5hcnJvdyBkb3duIGZpZWxkIG1hdGNoZXMgYmV0d2VlbiBwYXJ0aWN1bGFyIHJlcG9zaXRvcmllcyBvZiBpbnRlcmVzdC4gU28gYnVpbGRpbmcgb24gdGhlIGBjcm9zc3dhbGtfdGFibGVgIGZ1bmN0aW9uLCBJIHdvdWxkIHByb2JhYmx5IGZpbmQgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgcXVpdGUgdXNlZnVsOgoKCmBgYHtyfQpsaWJyYXJ5KHJlYWRyKQpjcm9zc3dhbGtfbWFwIDwtIGZ1bmN0aW9uKGZyb20sIHRvLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxfY3Jvc3N3YWxrID0KICAiaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtZXRhL2NvZGVtZXRhL3Jhdy9tYXN0ZXIvY3Jvc3N3YWxrLmNzdiIsCiAgdHJpbSA9IEZBTFNFKXsKICBkZiA8LQogICAgcmVhZHI6OnJlYWRfY3N2KGZ1bGxfY3Jvc3N3YWxrLAogICAgICAgICAgICAgY29sX3R5cGVzID0gY29scyguZGVmYXVsdCA9ICJjIikpCiAgZGYgPC0gZGZbYygiUHJvcGVydHkiLCBmcm9tLCB0byldCiAgaWYodHJpbSkgZGYgPC0gZGZbIWlzLm5hKGRmWyxmcm9tXSksXSAjIHRyaW0gdG8gYGZyb21gIGFyZ3VtZW50IGZpZWxkcwogIGRmCn0KCmNyb3Nzd2Fsa19tYXAoZnJvbSA9ICJHaXRIdWIiLCB0byA9IGMoIlplbm9kbyIsICJGaWdzaGFyZSIpLCB0cmltID0gVCkKYGBgCgoKCgoKIyMjIyBleGFtcGxlcwoKIyMjIyMgaGVscCBmaWxlIGV4YW1wbGUKYGBge3J9CiMjIE5vdCBydW46IAojIyBDcm9zc3dhbGsgZGF0YSByZXR1cm5lZCBieSB0aGUgR2l0SHViIEFQSSBpbnRvIENvZGVNZXRhIGZvcm1hdApyIDwtIGdoOjpnaCgiL3JlcG9zLzpvd25lci86cmVwbyIsIG93bmVyID0gInJvcGVuc2NpIiwgcmVwbyA9ICJFTUwiKQpjbGFzcyhyKQpyX2pzb24ubGQgPC0gY3Jvc3N3YWxrKHIsICJHaXRIdWIiKQpjbGFzcyhyX2pzb24ubGQpCmBgYAoKCmBgYHtyfQpjb2RlbWV0YV92YWxpZGF0ZShyX2pzb24ubGQpCnJfanNvbi5sZApgYGAKCgojIyMjIyBMZXQncyBnbyBmcm9tIGdpdGh1YiB0byBaZW5vZG8uICAKYGBge3J9CmNyb3Nzd2FsayhyLCAiR2l0SHViIiwgIlplbm9kbyIpCmBgYAoKCkxldCdzIHRyeSBhbmQgYnJlYWsgaXQhIApgYGB7ciwgZXZhbD1GQUxTRX0KY3Jvc3N3YWxrKHIsICJteUltYWdpbmFyeVJlcG8iKQpgYGAKQSByZWFzb25hYmx5IGluZm9ybWF0aXZlIGVycm9yIHdoZW4gY29tYmluZWQgd2l0aCA/Y3Jvc3N3YWxrCgpgYGB7cn0KY3Jvc3N3YWxrX3RhYmxlIDwtIGZ1bmN0aW9uKGNvbHVtbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxfY3Jvc3N3YWxrID0KICAiaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtZXRhL2NvZGVtZXRhL3Jhdy9tYXN0ZXIvY3Jvc3N3YWxrLmNzdiIpewogIGRmIDwtCiAgICByZWFkcjo6cmVhZF9jc3YoZnVsbF9jcm9zc3dhbGssCiAgICAgICAgICAgICBjb2xfdHlwZXMgPSBjb2xzKC5kZWZhdWx0ID0gImMiKSkKICBkZiA8LSBkZltjKCJQcm9wZXJ0eSIsIGNvbHVtbildCiAgc3RhdHM6Om5hLm9taXQoZGYpCiAgIyMgZGZbIWlzLm5hKGRmW1tjb2x1bW5dXSksXSAjIyBzdGF0czo6bmEub21pdAp9Cgpjcm9zc3dhbGtfY29udGV4dCA8LQogIGZ1bmN0aW9uKGRmLAogICAgICAgICAgIGNvZGVtZXRhX2NvbnRleHQgPQogICAgICAgICAgICAgImh0dHBzOi8vZG9pLm9yZy8xMC41MDYzL3NjaGVtYS9jb2RlbWV0YS0yLjAiKXsKCiAgICBjb250ZXh0IDwtIGpzb25saXRlOjpyZWFkX2pzb24oY29kZW1ldGFfY29udGV4dCkKICAgIGNvbnRleHRbWzFdXVtbImlkIl1dIDwtIE5VTEwgIyMgYXZvaWQgY29sbGlzaW9ucyB3aXRoIEBpZAogICAgcHJvcGVydGllcyA8LSBuYW1lcyhjb250ZXh0W1sxXV0pCgogICAgbmV3X2NvbnRleHQgPC0gbGlzdCgiQGNvbnRleHQiID0KICAgICAgICAgICAgICAgICAgICAgICAgbGlzdChzY2hlbWEgPSAiaHR0cDovL3NjaGVtYS5vcmcvIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlbWV0YSA9ICJodHRwczovL2NvZGVtZXRhLmdpdGh1Yi5pby90ZXJtcy8iKSkKCiAgICBmb3IoaSBpbiAxOmRpbShkZilbMV0pewogICAgICBvcmlnaW5hbF90ZXJtIDwtIHByb3BlcnRpZXNbcHJvcGVydGllcyA9PSBkZltbaSwgMV1dIF0KICAgICAgbmV3X2NvbnRleHRbWyJAY29udGV4dCJdXVtbIGRmW1tpLDJdXSBdXSA8LSBjb250ZXh0W1sxXV1bW29yaWdpbmFsX3Rlcm1dXQogICAgfQogIG5ld19jb250ZXh0CiAgfQpgYGAKCmBgYHtyfQoKYGBgCgoKCgo8YnI+Cjxicj4KPGJyPgoKKioqCgojIyMgLSBbIF0gZHJvcF9jb250ZXh0CgojIyMjIGNvZGUKYGBge3J9CmRyb3BfY29udGV4dApgYGAKCgo8YnI+CgojIyMjIGRvY3VtZW50YXRpb24KCmBgYHtyfQo/ZHJvcF9jb250ZXh0CmBgYAoKCiMjIyMgZXhhbXBsZXMKCj4gTm8gZXhhbXBsZXMgcHJvdmlkZWQKCmBgYHtyfQpmcm9tSlNPTihleCkKYGBgCgpgYGB7cn0KZnJvbUpTT04oZXgpICU+JSBkcm9wX2NvbnRleHQoKQpgYGAKCgoKPGJyPgoKIyMjIC0gW3hdIHdyaXRlX2NvZGVtZXRhCgojIyMjIGNvZGUKYGBge3J9CndyaXRlX2NvZGVtZXRhCmBgYAoKV2hlbiB3cml0aW5nIHRoZSBmaWxlIGludG8gYSBwYWNrYWdlIChpZSB3aGVuIGBERVNDUklQVElPTmAgaXMgZGV0ZWN0ZWQpLCBhZGRpbmcgYCJjb2RlbWV0YS5qc29uImAgdG8gYC5SYnVpbGRpZ25vcmVgIGFzc3VtZXMgdGhhdCB0aGUgdXNlciBoYXMgbm90IGNoYW5nZWQgdGhlIGBwYXRoYC4gV2hpbGUgaXQgaXMgYWR2aXNlZCBpbiB0aGUgaGVscCBmaWxlIHRvIGxlYXZlIGFzIGRlZmF1bHQsIGFzIHRoZSB1c2VyIGNhbiBjaGFuZ2UgaXQsIHRoZXJlIGNvdWxkIHRoZW9yZXRpY2FsbHkgYmUgYSBzaXR1YXRpb24gd2hlcmUgdGhlIHVzZXIgaGFzIGNhbGxlZCBpdCBzb21ldGhpbmcgZWxzZSBidXQgdGhlIGZ1bmN0aW9uIGhhcyB3cml0dGVuIGAiY29kZW1ldGEuanNvbiJgIHRvIGAuUmJ1aWxkaWdub3JlYC4gSnVzdCB3b25kZXJpbmcgd2hldGhlciB0aGF0IHdvdWxkIGNhdXNlIGluIHByb2JsZW1zIGRvd25zdHJlYW0gb3Igc29tZWhvdyBndWFyZGVkIGFnYWluc3Qgb3Igd2FybmVkPwoKV2hpY2ggYnJpbmdzIG1lIHRvIGEgc3VnZ2VzdGlvbiBmb3IgdGhlIGRvY3VtZW50YXRpb24uIEN1cnJlbnRseSB0aGUgZGVzY3JpcHRpb24gaXMganVzdCB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24uIEJ1dCB3aGF0IEkgbGlrZSBpcyB0aGF0IGl0IGNsZXZlcmx5IGF1dG9tYXRlcyB0aGUgY3JlYXRpb24gb2YgYSBjb2RlbWV0YSBmaWxlIHdpdGhpbiBhIHBhY2thZ2UuIE15IGltcHJlc3Npb24gaXMgdGhhdCB0aGlzIHdpbGwgYmVjb21lIGEgc3RhbmRhcmQgZmlsZSB0aGF0IGFsbCByIHBhY2thZ2VzIHdpbGwgaGF2ZSBhbmQgdGhlcmVmb3JlIGZvbGxvd2luZyBzdGFuZGFyZCBwcm9jZWVkdXJlIHdoZW4gY3JlYXRpbmcgYW5kIG5hbWluZyBjb252ZW50aW9ucyAoaWUga2VlcCBkZWZhdWx0IGAiY29kZW1ldGEuanNvbiJgIG5hbWUgYW5kIHNhdmUgaW4gcGFja2FnZSByb290KS4gV2hpbGUgdGhlIGZ1bmN0aW9uIGlzIHNldCB1cCBiZWF1dGlmdWxseSB0byB0aGlzIGFzIGRlZmF1bHQsIGl0IG1pZ2h0IGJlIHdvcnRoIG1lbnRpb25pbmcsIGVpdGhlciBpbiB0aGUga2VscCBmaWxlIG9yIHRoZSBSRUFETUUsIHdoYXQgdGhlIGJyb2FkZXIgaW50ZW50aW9uIGJlaGluZCB0aGVzZSBzZXR0aW5ncyBpcy4gCgoKPGJyPgoKIyMjIyBkb2N1bWVudGF0aW9uCgpgYGB7cn0KP3dyaXRlX2NvZGVtZXRhCmBgYAoKCkluIHRlcm1zIG9mIGdvb2QgcXVhbGl0eSBjb250cm9sIG9mIGluZm9ybWF0aW9uIHJlbGF0aW5nIHRvIGV4aXN0aW5nIHBhY2thZ2VzIEkgcmVhbGx5IGFwcHJlY2lhdGUgdGhlIGF1dG9tYXRpYyB1cGRhdGluZyBhbmQgb3ZlcndyaXRpbmcgb2YgZmllbGRzIGluIGEgc3VwcGxpZWQuIEZvciB3aGF0IGFwcGVhcnMgdG8gbWUgdG8gYmUgdGhlIG1haW4gdXNlIGNhc2UgZW52aXNhZ2VkIChpZSBjcmVhdGluZyBhICkKCgojIyMjIGV4YW1wbGVzCgpgYGB7cn0KYnJlYWsuYXV0aG9yIDwtIGNyZWF0ZV9jb2RlbWV0YSgiY29kZW1ldGFyIikKYnJlYWsuYXV0aG9yJGF1dGhvcltbMV1dJGdpdmVuTmFtZSA8LSAiQW5uYSIKYnJlYWsuYXV0aG9yJGF1dGhvcltbMV1dJGZhbWlseU5hbWUgPC0gIktyeXN0YWxsaSIKYnJlYWsuYXV0aG9yJGF1dGhvcltbMV1dCmBgYAoKCmBgYHtyfQppcyhicmVhay5hdXRob3IgJT4lIHRvSlNPTiwgImpzb24iKQpgYGAKYGBgCmJyZWFrLmF1dGhvciAlPiUgY29kZW1ldGFfdmFsaWRhdGUoKQpgYGAKcmV0dXJucyBlcnJvcjogYEVycm9yIGluIGZpbGUuZXhpc3RzKGNvZGVtZXRhKSA6IGludmFsaWQgJ2ZpbGUnIGFyZ3VtZW50YAoKYGBge3J9CmNvZGVtZXRhX3ZhbGlkYXRlKCJjb2RlbWV0YV9icmVha2l0Lmpzb24iKQoKYGBgCiMjIyMgQ2hhbmdpbmcgdGhlIHBhdGggdG8gc2F2ZSBzb21ld2hlcmUgb3RoZXIgdGhhbiB0aGUgd29ya2luZyBkaXJlY3Rvcnk6Ci0gIyMjIyMgSWYgbm8gcm9vdCBpcyBzdXBwbGllZCwgaW5mb3JtYXRpb24gaXMgbm90IGF1dG9tYXRpY2FsbHkgdXBkYXRlZCBmcm9tIHRoZSBwYWNrYWdlIGFuZCBJJ3ZlIG1hbmFnZWQgdG8gcmV0YWluIG15IG5hbWUgYXMgdGhlIGF1dGhvci4KCmBgYHtyfQp3cml0ZV9jb2RlbWV0YShwa2cgPSBicmVhay5hdXRob3IsIHBhdGggPSAiLi4vdGVzdC1jb2RlbWV0YXMvY29kZW1ldGFfYnJlYWtpdC5qc29uIikKY29kZW1ldGFfdmFsaWRhdGUoIi4uL3Rlc3QtY29kZW1ldGFzL2NvZGVtZXRhX2JyZWFraXQuanNvbiIpCnJlYWRfanNvbigiLi4vdGVzdC1jb2RlbWV0YXMvY29kZW1ldGFfYnJlYWtpdC5qc29uIikkYXV0aG9yCmBgYAoKLSAjIyMjIyBJZiByb290IGlzIHN1cHBsaWVkLCB0aGUgaW5jb3JyZWN0IGluZm9ybWF0aW9uIGlzIHJlcGxhY2VkIHdpdGggdGhlIGNvcnJlY3QgaW5mb3JtYXRpb24gZnJvbSB0aGUgREVTQ1JJUFRJT04uCgoKYGBge3J9CndyaXRlX2NvZGVtZXRhKHBrZyA9IGJyZWFrLmF1dGhvciwgcGF0aCA9ICIuLi90ZXN0LWNvZGVtZXRhcy9jb2RlbWV0YV9icmVha2l0Mi5qc29uIiwgcm9vdCA9ICIuLi9wa2cvY29kZW1ldGFyLyIpCmNvZGVtZXRhX3ZhbGlkYXRlKCIuLi90ZXN0LWNvZGVtZXRhcy9jb2RlbWV0YV9icmVha2l0Mi5qc29uIikKcmVhZF9qc29uKCIuLi90ZXN0LWNvZGVtZXRhcy9jb2RlbWV0YV9icmVha2l0Mi5qc29uIikkYXV0aG9yCgpgYGAKCgoKCmBgYHtyfQp3cml0ZV9jb2RlbWV0YShwa2cgPSAiLi4vcGtnL2NvZGVtZXRhci8iLCBwYXRoID0gImNvZGVtZXRhMS5qc29uIikKYGBgCgoKPGJyPgoKT3ZlcmFsbCBjb21tZW50czoKCkkgdGhpbmsgaXQgY291bGQgYmUgdXNlZnVsIHRvIG1ha2UgYSBkaXN0aW5jdGlvbiBpbiB0aGUgZnVuY3Rpb25zIGFuZCBkb2N1bWVudGF0aW9uIGJldHdlZW4gKipjb2RlbWV0YSBKU09OLUxEKiogZm9ybWF0IGFuZCB0aGUgKipjb2RlbWV0YSBKU09OLUxEIHIgbGlzdCoqIG9iamVjdHMuIExldCdzIHNheSB3ZSBhc3NvY2lhdGVkIGBjb2RlbWV0YWAgd2l0aCB0aGUgSlNPTi1MRCBmb3JtYXQgYW5kIGBjb2RlbWV0YXJgIHdpdGggciBsaXN0cy4gVXNpbmcgdGhlc2UgYXNzb2NpYXRpb25zIGluIGZ1bmN0aW9uIG5hbWVzIGNvdWxkIG1ha2UgaXQgYSBiaXQgbW9yZSBleHBsaWNpdCB0byB0aGUgdXNlci4gRS5nLiBGdW5jdGlvbnMgYHdyaXRlX2NvZGVtZXRhYCBhbmQgYHZhbGlkYXRlX2NvZGVtZXRhYCB3b3VsZCByZW1haW4gdGhlIHNhbWUgYmVjYXVzZSB0aGV5IGVpdGhlciBvdXRwdXQgb3Igd29yayBvbiBKU09OLUxEIGZvcm1hdHMgYnV0IGBjcmVhdGVfY29kZW1ldGFgIGNvdWxkIGJlY29tZSBgY3JlYXRlX2NvZGVtZXRhcmAgdG8gaW5kaWNhdGUgdGhhdCB0aGUgb3V0cHV0IGlzIGFuICoqciBsaXN0Kio/IEkgb25seSBtZW50aW9uIGl0IGJlY2F1c2UgaXQgY29uZnVzZWQgbWUgYSBsaXR0bGUgYXQgdGltZXMuCgppZSBzbGlnaHQgY29uZnVzaW9uIHRocm91Z2hvdXQgZG9jdW1lbnRhdGlvbi4gRm9yIGV4YW1wbGUgSSBiZWxpZXZlIHRoYXQgdGhlIHNhbWUgZGF0YXR5cGUgaXMgcmVmZXJlbmNlZCBpbiBgY3Jvc3N3YWxrYCBkb2N1bWVudGF0aW9uIGFzICoqSlNPTiBsaXN0KiosIHdoaWxlIGluIGBjcmVhdGVfY29kZW1ldGFgIGRvY3VtZW50YXRpb24gYXMgKipjb2RlbWV0YSBvYmplY3QgKGxpc3QpKiouIEkgdGhpbmsgc3RhbmRhcmRpc2F0aW9uIG9mIHRoZSB0ZXJtaW5vbG9neSB0aHJvdWdob3V0IGRvY3VtZW50YXRpb24gd291bGQgYmUgYmVzdC4K