this repo has no description
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

more

+15834
+2
project/ocaml-cff/.gitignore
··· 1 + _build/ 2 + *.install
+37
project/ocaml-cff/cff.opam
··· 1 + # This file is generated by dune, edit dune-project instead 2 + opam-version: "2.0" 3 + synopsis: "Citation File Format (CFF) codec for OCaml" 4 + description: 5 + "A library for parsing and generating CITATION.cff files following the CFF 1.2.0 specification" 6 + maintainer: ["anil@recoil.org"] 7 + authors: ["The ocaml-cff programmers"] 8 + license: "ISC" 9 + homepage: "https://github.com/avsm/ocaml-cff" 10 + bug-reports: "https://github.com/avsm/ocaml-cff/issues" 11 + depends: [ 12 + "dune" {>= "3.20"} 13 + "ocaml" {>= "4.14.0"} 14 + "ptime" 15 + "ISO3166" 16 + "spdx_licenses" 17 + "yamlt" 18 + "jsont" 19 + "bytesrw" 20 + "odoc" {with-doc} 21 + ] 22 + build: [ 23 + ["dune" "subst"] {dev} 24 + [ 25 + "dune" 26 + "build" 27 + "-p" 28 + name 29 + "-j" 30 + jobs 31 + "@install" 32 + "@runtest" {with-test} 33 + "@doc" {with-doc} 34 + ] 35 + ] 36 + dev-repo: "git+https://github.com/avsm/ocaml-cff.git" 37 + x-maintenance-intent: ["(latest)"]
+1
project/ocaml-cff/dune
··· 1 + (vendored_dirs vendor)
+20
project/ocaml-cff/dune-project
··· 1 + (lang dune 3.20) 2 + (name cff) 3 + (generate_opam_files true) 4 + (license ISC) 5 + (authors "The ocaml-cff programmers") 6 + (maintainers "anil@recoil.org") 7 + (source (github avsm/ocaml-cff)) 8 + 9 + (package 10 + (name cff) 11 + (synopsis "Citation File Format (CFF) codec for OCaml") 12 + (description "A library for parsing and generating CITATION.cff files following the CFF 1.2.0 specification") 13 + (depends 14 + (ocaml (>= 4.14.0)) 15 + ptime 16 + ISO3166 17 + spdx_licenses 18 + yamlt 19 + jsont 20 + bytesrw))
+69
project/ocaml-cff/lib/cff.ml
··· 1 + (*--------------------------------------------------------------------------- 2 + Copyright (c) 2025 The ocaml-cff programmers. All rights reserved. 3 + SPDX-License-Identifier: ISC 4 + ---------------------------------------------------------------------------*) 5 + 6 + (** Citation File Format (CFF) codec for OCaml. *) 7 + 8 + (* Module aliases *) 9 + module Config = Cff_config 10 + module Date = Cff_date 11 + module Country = Cff_country 12 + module License = Cff_license 13 + 14 + module Identifier_type = Cff_enums.Identifier_type 15 + module Reference_type = Cff_enums.Reference_type 16 + module Status = Cff_enums.Status 17 + module Cff_type = Cff_enums.Cff_type 18 + 19 + module Address = Cff_address.Address 20 + module Contact = Cff_address.Contact 21 + 22 + module Author = Cff_author 23 + module Name = Cff_author.Name 24 + module Person = Cff_author.Person 25 + module Entity = Cff_author.Entity 26 + 27 + module Identifier = Cff_identifier 28 + module Reference = Cff_reference 29 + 30 + (* Include the root type *) 31 + include Cff_root 32 + 33 + (* YAML codec functions *) 34 + let of_yaml_string s = 35 + let reader = Bytesrw.Bytes.Reader.of_string s in 36 + match Yamlt.decode ~layout:true Cff_root.jsont reader with 37 + | Ok cff -> Ok cff 38 + | Error e -> Error e 39 + 40 + let to_yaml_string t = 41 + let buf = Buffer.create 1024 in 42 + let writer = Bytesrw.Bytes.Writer.of_buffer buf in 43 + match Yamlt.encode ~format:Yamlt.Block Cff_root.jsont t ~eod:true writer with 44 + | Ok () -> Ok (Buffer.contents buf) 45 + | Error e -> Error e 46 + 47 + let of_yaml_file path = 48 + try 49 + let ic = open_in path in 50 + let len = in_channel_length ic in 51 + let s = really_input_string ic len in 52 + close_in ic; 53 + of_yaml_string s 54 + with 55 + | Sys_error e -> Error e 56 + | e -> Error (Printexc.to_string e) 57 + 58 + let to_yaml_file path t = 59 + match to_yaml_string t with 60 + | Error e -> Error e 61 + | Ok s -> 62 + try 63 + let oc = open_out path in 64 + output_string oc s; 65 + close_out oc; 66 + Ok () 67 + with 68 + | Sys_error e -> Error e 69 + | e -> Error (Printexc.to_string e)
+226
project/ocaml-cff/lib/cff.mli
··· 1 + (*--------------------------------------------------------------------------- 2 + Copyright (c) 2025 The ocaml-cff programmers. All rights reserved. 3 + SPDX-License-Identifier: ISC 4 + ---------------------------------------------------------------------------*) 5 + 6 + (** Citation File Format (CFF) codec for OCaml. 7 + 8 + This library provides types and codecs for the 9 + {{:https://citation-file-format.github.io/}Citation File Format (CFF)} 10 + version 1.2.0, a human- and machine-readable format for software and 11 + dataset citation metadata. 12 + 13 + CFF files are plain text files named [CITATION.cff] written in 14 + {{:https://yaml.org/}YAML 1.2}. They provide citation metadata for 15 + software and datasets, enabling proper academic credit for research 16 + software. 17 + 18 + {1 Overview} 19 + 20 + A minimal [CITATION.cff] file requires four fields: 21 + - [cff-version]: The CFF schema version (currently ["1.2.0"]) 22 + - [message]: Instructions for citing the work 23 + - [title]: The name of the software or dataset 24 + - [authors]: A list of persons and/or entities 25 + 26 + {1 Quick Start} 27 + 28 + {2 Parsing an existing CITATION.cff} 29 + 30 + {[ 31 + match Cff.of_yaml_file "CITATION.cff" with 32 + | Ok cff -> 33 + Printf.printf "Title: %s\n" (Cff.title cff); 34 + Printf.printf "Version: %s\n" 35 + (Option.value ~default:"unspecified" (Cff.version cff)) 36 + | Error msg -> 37 + Printf.eprintf "Parse error: %s\n" msg 38 + ]} 39 + 40 + {2 Creating a CITATION.cff programmatically} 41 + 42 + {[ 43 + let author = Cff.Author.Person 44 + (Cff.Person.make ~family_names:"Smith" ~given_names:"Jane" ()) in 45 + let cff = Cff.make_simple 46 + ~title:"My Research Software" 47 + ~authors:[author] 48 + ~version:"1.0.0" 49 + ~doi:"10.5281/zenodo.1234567" 50 + () in 51 + match Cff.to_yaml_file "CITATION.cff" cff with 52 + | Ok () -> print_endline "Created CITATION.cff" 53 + | Error msg -> Printf.eprintf "Write error: %s\n" msg 54 + ]} 55 + 56 + {1 Module Structure} 57 + 58 + The library uses a flat internal structure ([Cff_author], [Cff_date], etc.) 59 + but exposes a convenient nested API through module aliases: 60 + 61 + - {!module:Author} - Person and entity types for authorship 62 + - {!module:Reference} - Bibliographic reference with 60+ fields 63 + - {!module:Identifier} - DOI, URL, SWH, and other identifiers 64 + - {!module:License} - SPDX license identifiers 65 + - {!module:Date} - ISO 8601 date handling 66 + 67 + {1 CFF Specification} 68 + 69 + This implementation follows the 70 + {{:https://github.com/citation-file-format/citation-file-format}CFF 1.2.0 specification}. 71 + Key concepts: 72 + 73 + - {b Authors}: Can be persons (with family/given names) or entities 74 + (organizations, identified by a [name] field) 75 + - {b References}: Bibliography entries that the work cites or depends on 76 + - {b Preferred citation}: An alternate work to cite instead of the 77 + software itself (e.g., a journal article about the software) 78 + - {b Identifiers}: Typed identifiers including DOIs, URLs, and 79 + Software Heritage IDs (SWH) 80 + - {b Licenses}: SPDX license identifiers; multiple licenses imply OR 81 + 82 + {1 Core Types} *) 83 + 84 + (** Configuration for validation strictness. *) 85 + module Config = Cff_config 86 + 87 + (** Date representation as [(year, month, day)] tuple. 88 + 89 + CFF uses ISO 8601 dates in [YYYY-MM-DD] format (e.g., ["2024-01-15"]). *) 90 + module Date = Cff_date 91 + 92 + (** ISO 3166-1 alpha-2 country codes (e.g., ["US"], ["DE"], ["GB"]). 93 + 94 + Used for author and entity addresses. *) 95 + module Country = Cff_country 96 + 97 + (** SPDX license identifiers. 98 + 99 + CFF uses {{:https://spdx.org/licenses/}SPDX license identifiers} for 100 + the [license] field. Multiple licenses indicate an OR relationship 101 + (the user may choose any of the listed licenses). *) 102 + module License = Cff_license 103 + 104 + (** {1 Enumeration Types} *) 105 + 106 + (** Identifier types for the [identifiers] field. 107 + 108 + - [`Doi] - Digital Object Identifier 109 + - [`Url] - Web URL 110 + - [`Swh] - Software Heritage identifier 111 + - [`Other] - Other identifier type *) 112 + module Identifier_type = Cff_enums.Identifier_type 113 + 114 + (** Reference types for bibliographic entries. 115 + 116 + CFF supports 40+ reference types including [`Article], [`Book], 117 + [`Software], [`Conference_paper], [`Thesis], [`Dataset], and more. 118 + See {!Cff_enums.Reference_type} for the complete list. *) 119 + module Reference_type = Cff_enums.Reference_type 120 + 121 + (** Publication status for works in progress. 122 + 123 + - [`Preprint] - Available as preprint 124 + - [`Submitted] - Submitted for publication 125 + - [`In_press] - Accepted, awaiting publication 126 + - [`Advance_online] - Published online ahead of print *) 127 + module Status = Cff_enums.Status 128 + 129 + (** CFF file type: [`Software] (default) or [`Dataset]. *) 130 + module Cff_type = Cff_enums.Cff_type 131 + 132 + (** {1 Address and Contact Information} *) 133 + 134 + (** Physical address with street, city, region, postal code, and country. *) 135 + module Address = Cff_address.Address 136 + 137 + (** Contact information: email, telephone, fax, website, and ORCID. *) 138 + module Contact = Cff_address.Contact 139 + 140 + (** {1 Authors and Entities} *) 141 + 142 + (** Authors as a discriminated union of {!Person} or {!Entity}. 143 + 144 + CFF distinguishes between: 145 + - {b Persons}: Individual humans with family names, given names, etc. 146 + - {b Entities}: Organizations, projects, or groups with a [name] field 147 + 148 + When parsing, the presence of a [name] field indicates an entity; 149 + otherwise, the entry is treated as a person. *) 150 + module Author = Cff_author 151 + 152 + (** Person name components: family names, given names, particle, suffix, alias. *) 153 + module Name = Cff_author.Name 154 + 155 + (** A person (individual author or contributor). *) 156 + module Person = Cff_author.Person 157 + 158 + (** An entity (organization, institution, project, conference). *) 159 + module Entity = Cff_author.Entity 160 + 161 + (** {1 Identifiers and References} *) 162 + 163 + (** Typed identifiers for DOI, URL, SWH, or other schemes. 164 + 165 + Each identifier has a type, value, and optional description. Example: 166 + {[ 167 + let id = Cff.Identifier.make 168 + ~type_:`Doi 169 + ~value:"10.5281/zenodo.1234567" 170 + ~description:"The concept DOI for all versions" 171 + () 172 + ]} *) 173 + module Identifier = Cff_identifier 174 + 175 + (** Bibliographic references with comprehensive metadata. 176 + 177 + References can represent any citable work: articles, books, software, 178 + datasets, conference papers, theses, etc. The {!Reference} module 179 + provides 60+ fields organized into logical sub-records: 180 + 181 + - {!Reference.Core} - Type, title, authors, abstract 182 + - {!Reference.Publication} - Journal, volume, issue, pages 183 + - {!Reference.Collection} - Proceedings, book series 184 + - {!Reference.Dates} - Various date fields and year 185 + - {!Reference.Identifiers} - DOI, URL, ISBN, ISSN, etc. 186 + - {!Reference.Entities} - Editors, publisher, institution 187 + - {!Reference.Metadata} - Keywords, license, notes 188 + - {!Reference.Technical} - Commit, version, format *) 189 + module Reference = Cff_reference 190 + 191 + (** {1 Root CFF Type} 192 + 193 + The main [t] type represents a complete [CITATION.cff] file. It includes 194 + the {!module:Cff_root} interface with all required and optional fields. *) 195 + 196 + include module type of Cff_root 197 + 198 + (** {1 YAML Codec} 199 + 200 + Parse and serialize CFF data using YAML format. The codec handles: 201 + - YAML 1.2 syntax via the {{:https://erratique.ch/software/yamlt}Yamlt} library 202 + - Flexible input (quoted/unquoted strings, integers as strings) 203 + - SPDX license validation (with lenient mode for deprecated IDs) 204 + - Person/entity discrimination based on [name] field presence *) 205 + 206 + val of_yaml_string : string -> (t, string) result 207 + (** [of_yaml_string s] parses a CFF from YAML string [s]. 208 + 209 + Returns [Ok cff] on success or [Error msg] with a descriptive error 210 + message on failure. *) 211 + 212 + val to_yaml_string : t -> (string, string) result 213 + (** [to_yaml_string cff] serializes [cff] to a YAML string. 214 + 215 + The output uses YAML block style for readability. *) 216 + 217 + val of_yaml_file : string -> (t, string) result 218 + (** [of_yaml_file path] reads and parses a [CITATION.cff] file. 219 + 220 + Returns [Ok cff] on success or [Error msg] if the file cannot be 221 + read or contains invalid CFF data. *) 222 + 223 + val to_yaml_file : string -> t -> (unit, string) result 224 + (** [to_yaml_file path cff] writes [cff] to a file at [path]. 225 + 226 + Creates or overwrites the file. Returns [Error msg] on I/O failure. *)
+91
project/ocaml-cff/lib/cff_address.ml
··· 1 + (*--------------------------------------------------------------------------- 2 + Copyright (c) 2025 The ocaml-cff programmers. All rights reserved. 3 + SPDX-License-Identifier: ISC 4 + ---------------------------------------------------------------------------*) 5 + 6 + (** Address and contact information for CFF. *) 7 + 8 + (** Physical address information. *) 9 + module Address = struct 10 + type t = { 11 + address : string option; 12 + city : string option; 13 + region : string option; 14 + post_code : string option; 15 + country : string option; (* ISO 3166-1 alpha-2 *) 16 + } 17 + 18 + let empty = { 19 + address = None; 20 + city = None; 21 + region = None; 22 + post_code = None; 23 + country = None; 24 + } 25 + 26 + let make ?address ?city ?region ?post_code ?country () = 27 + { address; city; region; post_code; country } 28 + 29 + let address t = t.address 30 + let city t = t.city 31 + let region t = t.region 32 + let post_code t = t.post_code 33 + let country t = t.country 34 + 35 + let is_empty t = 36 + t.address = None && t.city = None && t.region = None && 37 + t.post_code = None && t.country = None 38 + 39 + let pp ppf t = 40 + let parts = List.filter_map Fun.id [ 41 + t.address; 42 + t.city; 43 + t.region; 44 + t.post_code; 45 + t.country; 46 + ] in 47 + Format.pp_print_string ppf (String.concat ", " parts) 48 + end 49 + 50 + (** Contact information. *) 51 + module Contact = struct 52 + type t = { 53 + email : string option; 54 + tel : string option; 55 + fax : string option; 56 + website : string option; 57 + orcid : string option; 58 + } 59 + 60 + let empty = { 61 + email = None; 62 + tel = None; 63 + fax = None; 64 + website = None; 65 + orcid = None; 66 + } 67 + 68 + let make ?email ?tel ?fax ?website ?orcid () = 69 + { email; tel; fax; website; orcid } 70 + 71 + let email t = t.email 72 + let tel t = t.tel 73 + let fax t = t.fax 74 + let website t = t.website 75 + let orcid t = t.orcid 76 + 77 + let is_empty t = 78 + t.email = None && t.tel = None && t.fax = None && 79 + t.website = None && t.orcid = None 80 + 81 + let pp ppf t = 82 + let parts = List.filter_map (fun (k, v) -> 83 + Option.map (fun v -> k ^ ": " ^ v) v 84 + ) [ 85 + ("email", t.email); 86 + ("tel", t.tel); 87 + ("website", t.website); 88 + ("orcid", t.orcid); 89 + ] in 90 + Format.pp_print_string ppf (String.concat ", " parts) 91 + end
+149
project/ocaml-cff/lib/cff_address.mli
··· 1 + (*--------------------------------------------------------------------------- 2 + Copyright (c) 2025 The ocaml-cff programmers. All rights reserved. 3 + SPDX-License-Identifier: ISC 4 + ---------------------------------------------------------------------------*) 5 + 6 + (** Physical address and contact information for CFF. 7 + 8 + CFF includes address and contact fields for both persons and entities. 9 + This module provides types for these shared fields. 10 + 11 + {1 Address Fields} 12 + 13 + Physical address components appear on both persons and entities: 14 + 15 + - [address]: Street address (e.g., ["123 Main St"]) 16 + - [city]: City name (e.g., ["Cambridge"]) 17 + - [region]: State, province, or region (e.g., ["Massachusetts"]) 18 + - [post-code]: Postal/ZIP code (e.g., ["02139"]) 19 + - [country]: ISO 3166-1 alpha-2 country code (e.g., ["US"]) 20 + 21 + {1 Contact Fields} 22 + 23 + Contact information available for persons and entities: 24 + 25 + - [email]: Email address 26 + - [tel]: Telephone number 27 + - [fax]: Fax number 28 + - [website]: Website URL 29 + - [orcid]: ORCID identifier URL (for researchers) 30 + 31 + {1 Example} 32 + 33 + {[ 34 + authors: 35 + - family-names: Smith 36 + given-names: Jane 37 + affiliation: MIT 38 + address: 77 Massachusetts Avenue 39 + city: Cambridge 40 + region: Massachusetts 41 + post-code: "02139" 42 + country: US 43 + email: jsmith@mit.edu 44 + orcid: https://orcid.org/0000-0001-2345-6789 45 + ]} *) 46 + 47 + (** Physical address information. 48 + 49 + All fields are optional; an empty address is valid. *) 50 + module Address : sig 51 + type t 52 + (** Physical address record. *) 53 + 54 + val empty : t 55 + (** Empty address with all fields [None]. *) 56 + 57 + val make : 58 + ?address:string -> 59 + ?city:string -> 60 + ?region:string -> 61 + ?post_code:string -> 62 + ?country:string -> 63 + unit -> t 64 + (** Create an address with optional fields. 65 + 66 + @param address Street address 67 + @param city City name 68 + @param region State, province, or administrative region 69 + @param post_code Postal code, ZIP code, or postcode 70 + @param country ISO 3166-1 alpha-2 country code *) 71 + 72 + val address : t -> string option 73 + (** Street address (e.g., ["77 Massachusetts Avenue"]). *) 74 + 75 + val city : t -> string option 76 + (** City name (e.g., ["Cambridge"], ["London"]). *) 77 + 78 + val region : t -> string option 79 + (** State, province, or region (e.g., ["Massachusetts"], ["Bavaria"]). *) 80 + 81 + val post_code : t -> string option 82 + (** Postal or ZIP code (e.g., ["02139"], ["W1A 1AA"]). *) 83 + 84 + val country : t -> string option 85 + (** ISO 3166-1 alpha-2 country code (e.g., ["US"], ["DE"], ["GB"]). 86 + 87 + See {!Cff_country} for country code validation. *) 88 + 89 + val is_empty : t -> bool 90 + (** [true] if all fields are [None]. *) 91 + 92 + val pp : Format.formatter -> t -> unit 93 + (** Pretty-print the address. *) 94 + end 95 + 96 + (** Contact information. 97 + 98 + Electronic contact details for persons and entities. All fields 99 + are optional. *) 100 + module Contact : sig 101 + type t 102 + (** Contact information record. *) 103 + 104 + val empty : t 105 + (** Empty contact with all fields [None]. *) 106 + 107 + val make : 108 + ?email:string -> 109 + ?tel:string -> 110 + ?fax:string -> 111 + ?website:string -> 112 + ?orcid:string -> 113 + unit -> t 114 + (** Create contact information with optional fields. 115 + 116 + @param email Email address 117 + @param tel Telephone number (any format) 118 + @param fax Fax number (any format) 119 + @param website Website URL 120 + @param orcid ORCID identifier URL *) 121 + 122 + val email : t -> string option 123 + (** Email address (e.g., ["jane.smith\@example.org"]). *) 124 + 125 + val tel : t -> string option 126 + (** Telephone number. No specific format is required. *) 127 + 128 + val fax : t -> string option 129 + (** Fax number. No specific format is required. *) 130 + 131 + val website : t -> string option 132 + (** Website URL (e.g., ["https://example.org/~jsmith"]). *) 133 + 134 + val orcid : t -> string option 135 + (** ORCID identifier as a URL. 136 + 137 + ORCID (Open Researcher and Contributor ID) provides persistent 138 + digital identifiers for researchers. 139 + 140 + Format: ["https://orcid.org/XXXX-XXXX-XXXX-XXXX"] 141 + 142 + Example: ["https://orcid.org/0000-0001-2345-6789"] *) 143 + 144 + val is_empty : t -> bool 145 + (** [true] if all fields are [None]. *) 146 + 147 + val pp : Format.formatter -> t -> unit 148 + (** Pretty-print the contact information. *) 149 + end
+299
project/ocaml-cff/lib/cff_author.ml
··· 1 + (*--------------------------------------------------------------------------- 2 + Copyright (c) 2025 The ocaml-cff programmers. All rights reserved. 3 + SPDX-License-Identifier: ISC 4 + ---------------------------------------------------------------------------*) 5 + 6 + (** Person, Entity, and Author types for CFF. *) 7 + 8 + (** Person name components. *) 9 + module Name = struct 10 + type t = { 11 + family_names : string option; 12 + given_names : string option; 13 + name_particle : string option; (* e.g., "von" *) 14 + name_suffix : string option; (* e.g., "Jr." *) 15 + alias : string option; 16 + } 17 + 18 + let empty = { 19 + family_names = None; 20 + given_names = None; 21 + name_particle = None; 22 + name_suffix = None; 23 + alias = None; 24 + } 25 + 26 + let make ?family_names ?given_names ?name_particle ?name_suffix ?alias () = 27 + { family_names; given_names; name_particle; name_suffix; alias } 28 + 29 + let family_names t = t.family_names 30 + let given_names t = t.given_names 31 + let name_particle t = t.name_particle 32 + let name_suffix t = t.name_suffix 33 + let alias t = t.alias 34 + 35 + let full_name t = 36 + let parts = List.filter_map Fun.id [ 37 + t.given_names; 38 + t.name_particle; 39 + t.family_names; 40 + ] in 41 + let base = String.concat " " parts in 42 + match t.name_suffix with 43 + | Some suffix -> base ^ ", " ^ suffix 44 + | None -> base 45 + 46 + let pp ppf t = 47 + Format.pp_print_string ppf (full_name t) 48 + end 49 + 50 + (** A person (individual author/contributor). *) 51 + module Person = struct 52 + type t = { 53 + name : Name.t; 54 + affiliation : string option; 55 + address : Cff_address.Address.t; 56 + contact : Cff_address.Contact.t; 57 + } 58 + 59 + let make 60 + ?family_names ?given_names ?name_particle ?name_suffix ?alias 61 + ?affiliation 62 + ?address ?city ?region ?post_code ?country 63 + ?email ?tel ?fax ?website ?orcid 64 + () = 65 + let name = Name.make ?family_names ?given_names ?name_particle 66 + ?name_suffix ?alias () in 67 + let address_rec = Cff_address.Address.make ?address ?city ?region 68 + ?post_code ?country () in 69 + let contact = Cff_address.Contact.make ?email ?tel ?fax ?website ?orcid () in 70 + { name; affiliation; address = address_rec; contact } 71 + 72 + let name t = t.name 73 + let affiliation t = t.affiliation 74 + let address t = t.address 75 + let contact t = t.contact 76 + 77 + let family_names t = Name.family_names t.name 78 + let given_names t = Name.given_names t.name 79 + let name_particle t = Name.name_particle t.name 80 + let name_suffix t = Name.name_suffix t.name 81 + let alias t = Name.alias t.name 82 + let full_name t = Name.full_name t.name 83 + 84 + let email t = Cff_address.Contact.email t.contact 85 + let orcid t = Cff_address.Contact.orcid t.contact 86 + let website t = Cff_address.Contact.website t.contact 87 + 88 + let pp ppf t = 89 + Format.fprintf ppf "%s" (full_name t); 90 + Option.iter (Format.fprintf ppf " (%s)") t.affiliation 91 + 92 + let jsont = 93 + Jsont.Object.map ~kind:"Person" 94 + (fun family_names given_names name_particle name_suffix alias 95 + affiliation address city region post_code country 96 + email tel fax website orcid -> 97 + let name = Name.make ?family_names ?given_names ?name_particle 98 + ?name_suffix ?alias () in 99 + let address_rec = Cff_address.Address.make ?address ?city ?region 100 + ?post_code ?country () in 101 + let contact = Cff_address.Contact.make ?email ?tel ?fax ?website ?orcid () in 102 + { name; affiliation; address = address_rec; contact }) 103 + |> Jsont.Object.opt_mem "family-names" Jsont.string 104 + ~enc:(fun p -> Name.family_names p.name) 105 + |> Jsont.Object.opt_mem "given-names" Jsont.string 106 + ~enc:(fun p -> Name.given_names p.name) 107 + |> Jsont.Object.opt_mem "name-particle" Jsont.string 108 + ~enc:(fun p -> Name.name_particle p.name) 109 + |> Jsont.Object.opt_mem "name-suffix" Jsont.string 110 + ~enc:(fun p -> Name.name_suffix p.name) 111 + |> Jsont.Object.opt_mem "alias" Jsont.string 112 + ~enc:(fun p -> Name.alias p.name) 113 + |> Jsont.Object.opt_mem "affiliation" Jsont.string 114 + ~enc:(fun p -> p.affiliation) 115 + |> Jsont.Object.opt_mem "address" Jsont.string 116 + ~enc:(fun p -> Cff_address.Address.address p.address) 117 + |> Jsont.Object.opt_mem "city" Jsont.string 118 + ~enc:(fun p -> Cff_address.Address.city p.address) 119 + |> Jsont.Object.opt_mem "region" Jsont.string 120 + ~enc:(fun p -> Cff_address.Address.region p.address) 121 + |> Jsont.Object.opt_mem "post-code" Jsont.string 122 + ~enc:(fun p -> Cff_address.Address.post_code p.address) 123 + |> Jsont.Object.opt_mem "country" Jsont.string 124 + ~enc:(fun p -> Cff_address.Address.country p.address) 125 + |> Jsont.Object.opt_mem "email" Jsont.string 126 + ~enc:(fun p -> Cff_address.Contact.email p.contact) 127 + |> Jsont.Object.opt_mem "tel" Jsont.string 128 + ~enc:(fun p -> Cff_address.Contact.tel p.contact) 129 + |> Jsont.Object.opt_mem "fax" Jsont.string 130 + ~enc:(fun p -> Cff_address.Contact.fax p.contact) 131 + |> Jsont.Object.opt_mem "website" Jsont.string 132 + ~enc:(fun p -> Cff_address.Contact.website p.contact) 133 + |> Jsont.Object.opt_mem "orcid" Jsont.string 134 + ~enc:(fun p -> Cff_address.Contact.orcid p.contact) 135 + |> Jsont.Object.skip_unknown 136 + |> Jsont.Object.finish 137 + end 138 + 139 + (** Event dates for entities (e.g., conferences). *) 140 + module Event_dates = struct 141 + type t = { 142 + date_start : Cff_date.t option; 143 + date_end : Cff_date.t option; 144 + } 145 + 146 + let empty = { date_start = None; date_end = None } 147 + 148 + let make ?date_start ?date_end () = { date_start; date_end } 149 + 150 + let date_start t = t.date_start 151 + let date_end t = t.date_end 152 + 153 + let is_empty t = t.date_start = None && t.date_end = None 154 + 155 + let pp ppf t = 156 + match t.date_start, t.date_end with 157 + | Some s, Some e -> 158 + Format.fprintf ppf "%a - %a" Cff_date.pp s Cff_date.pp e 159 + | Some s, None -> 160 + Format.fprintf ppf "%a -" Cff_date.pp s 161 + | None, Some e -> 162 + Format.fprintf ppf "- %a" Cff_date.pp e 163 + | None, None -> () 164 + end 165 + 166 + (** An entity (organization, team, conference, etc.). *) 167 + module Entity = struct 168 + type t = { 169 + name : string; 170 + alias : string option; 171 + address : Cff_address.Address.t; 172 + contact : Cff_address.Contact.t; 173 + event_dates : Event_dates.t; 174 + location : string option; 175 + } 176 + 177 + let make 178 + ~name ?alias 179 + ?address ?city ?region ?post_code ?country 180 + ?email ?tel ?fax ?website ?orcid 181 + ?date_start ?date_end ?location 182 + () = 183 + let address_rec = Cff_address.Address.make ?address ?city ?region 184 + ?post_code ?country () in 185 + let contact = Cff_address.Contact.make ?email ?tel ?fax ?website ?orcid () in 186 + let event_dates = Event_dates.make ?date_start ?date_end () in 187 + { name; alias; address = address_rec; contact; event_dates; location } 188 + 189 + let name t = t.name 190 + let alias t = t.alias 191 + let address t = t.address 192 + let contact t = t.contact 193 + let event_dates t = t.event_dates 194 + let location t = t.location 195 + 196 + let email t = Cff_address.Contact.email t.contact 197 + let orcid t = Cff_address.Contact.orcid t.contact 198 + let website t = Cff_address.Contact.website t.contact 199 + 200 + let pp ppf t = 201 + Format.pp_print_string ppf t.name; 202 + Option.iter (Format.fprintf ppf " (%s)") t.alias 203 + 204 + let jsont = 205 + Jsont.Object.map ~kind:"Entity" 206 + (fun name alias address city region post_code country 207 + email tel fax website orcid date_start date_end location -> 208 + let address_rec = Cff_address.Address.make ?address ?city ?region 209 + ?post_code ?country () in 210 + let contact = Cff_address.Contact.make ?email ?tel ?fax ?website ?orcid () in 211 + let event_dates = Event_dates.make ?date_start ?date_end () in 212 + { name; alias; address = address_rec; contact; event_dates; location }) 213 + |> Jsont.Object.mem "name" Jsont.string 214 + ~enc:(fun e -> e.name) 215 + |> Jsont.Object.opt_mem "alias" Jsont.string 216 + ~enc:(fun e -> e.alias) 217 + |> Jsont.Object.opt_mem "address" Jsont.string 218 + ~enc:(fun e -> Cff_address.Address.address e.address) 219 + |> Jsont.Object.opt_mem "city" Jsont.string 220 + ~enc:(fun e -> Cff_address.Address.city e.address) 221 + |> Jsont.Object.opt_mem "region" Jsont.string 222 + ~enc:(fun e -> Cff_address.Address.region e.address) 223 + |> Jsont.Object.opt_mem "post-code" Jsont.string 224 + ~enc:(fun e -> Cff_address.Address.post_code e.address) 225 + |> Jsont.Object.opt_mem "country" Jsont.string 226 + ~enc:(fun e -> Cff_address.Address.country e.address) 227 + |> Jsont.Object.opt_mem "email" Jsont.string 228 + ~enc:(fun e -> Cff_address.Contact.email e.contact) 229 + |> Jsont.Object.opt_mem "tel" Jsont.string 230 + ~enc:(fun e -> Cff_address.Contact.tel e.contact) 231 + |> Jsont.Object.opt_mem "fax" Jsont.string 232 + ~enc:(fun e -> Cff_address.Contact.fax e.contact) 233 + |> Jsont.Object.opt_mem "website" Jsont.string 234 + ~enc:(fun e -> Cff_address.Contact.website e.contact) 235 + |> Jsont.Object.opt_mem "orcid" Jsont.string 236 + ~enc:(fun e -> Cff_address.Contact.orcid e.contact) 237 + |> Jsont.Object.opt_mem "date-start" Cff_date.jsont 238 + ~enc:(fun e -> Event_dates.date_start e.event_dates) 239 + |> Jsont.Object.opt_mem "date-end" Cff_date.jsont 240 + ~enc:(fun e -> Event_dates.date_end e.event_dates) 241 + |> Jsont.Object.opt_mem "location" Jsont.string 242 + ~enc:(fun e -> e.location) 243 + |> Jsont.Object.skip_unknown 244 + |> Jsont.Object.finish 245 + end 246 + 247 + (** An author can be either a Person or an Entity. *) 248 + type t = 249 + | Person of Person.t 250 + | Entity of Entity.t 251 + 252 + let person p = Person p 253 + let entity e = Entity e 254 + 255 + let name = function 256 + | Person p -> Person.full_name p 257 + | Entity e -> Entity.name e 258 + 259 + let orcid = function 260 + | Person p -> Person.orcid p 261 + | Entity e -> Entity.orcid e 262 + 263 + let email = function 264 + | Person p -> Person.email p 265 + | Entity e -> Entity.email e 266 + 267 + let pp ppf = function 268 + | Person p -> Person.pp ppf p 269 + | Entity e -> Entity.pp ppf e 270 + 271 + (* Jsont codec that discriminates based on "name" field presence. 272 + If "name" is present -> Entity, otherwise -> Person *) 273 + let jsont = 274 + (* Check if json object has "name" member *) 275 + let has_name_member = function 276 + | Jsont.Object (members, _) -> Option.is_some (Jsont.Json.find_mem "name" members) 277 + | _ -> false 278 + in 279 + let dec_json j = 280 + if has_name_member j then 281 + match Jsont.Json.decode' Entity.jsont j with 282 + | Ok e -> Entity e 283 + | Error err -> Jsont.Error.msgf Jsont.Meta.none "Invalid entity: %s" (Jsont.Error.to_string err) 284 + else 285 + match Jsont.Json.decode' Person.jsont j with 286 + | Ok p -> Person p 287 + | Error err -> Jsont.Error.msgf Jsont.Meta.none "Invalid person: %s" (Jsont.Error.to_string err) 288 + in 289 + let enc_author = function 290 + | Person p -> 291 + (match Jsont.Json.encode' Person.jsont p with 292 + | Ok j -> j 293 + | Error _ -> assert false) 294 + | Entity e -> 295 + (match Jsont.Json.encode' Entity.jsont e with 296 + | Ok j -> j 297 + | Error _ -> assert false) 298 + in 299 + Jsont.json |> Jsont.map ~dec:dec_json ~enc:enc_author
+405
project/ocaml-cff/lib/cff_author.mli
··· 1 + (*--------------------------------------------------------------------------- 2 + Copyright (c) 2025 The ocaml-cff programmers. All rights reserved. 3 + SPDX-License-Identifier: ISC 4 + ---------------------------------------------------------------------------*) 5 + 6 + (** Authors for CFF: persons and entities. 7 + 8 + CFF distinguishes between two types of authors: 9 + 10 + - {b Persons}: Individual humans identified by name components 11 + (family names, given names, etc.) 12 + - {b Entities}: Organizations, institutions, teams, projects, or 13 + conferences identified by a single [name] field 14 + 15 + When parsing YAML, the library discriminates based on the presence 16 + of a [name] field: if present, the entry is an entity; otherwise, 17 + it's a person. 18 + 19 + {1 Name Components} 20 + 21 + CFF follows academic citation conventions for person names: 22 + 23 + - {b family-names}: Last name/surname (e.g., ["Smith"], ["van Rossum"]) 24 + - {b given-names}: First name(s) (e.g., ["Jane"], ["Guido"]) 25 + - {b name-particle}: Connector before family name (e.g., ["von"], ["van"], ["de"]) 26 + - {b name-suffix}: Generational suffix (e.g., ["Jr."], ["III"]) 27 + - {b alias}: Nickname or pseudonym 28 + 29 + {1 Entity Types} 30 + 31 + Entities can represent various organizations: 32 + 33 + - Research institutions and universities 34 + - Companies and corporations 35 + - Government agencies 36 + - Open source projects and communities 37 + - Academic conferences (with date-start/date-end) 38 + - Standards bodies 39 + 40 + {1 Example} 41 + 42 + {[ 43 + (* A person author *) 44 + let jane = Cff_author.Person (Cff_author.Person.make 45 + ~family_names:"Smith" 46 + ~given_names:"Jane A." 47 + ~affiliation:"MIT" 48 + ~orcid:"https://orcid.org/0000-0001-2345-6789" 49 + ()) 50 + 51 + (* A person with name particle *) 52 + let guido = Cff_author.Person (Cff_author.Person.make 53 + ~family_names:"Rossum" 54 + ~given_names:"Guido" 55 + ~name_particle:"van" 56 + ()) 57 + 58 + (* An organization entity *) 59 + let mozilla = Cff_author.Entity (Cff_author.Entity.make 60 + ~name:"Mozilla Foundation" 61 + ~website:"https://mozilla.org" 62 + ~city:"San Francisco" 63 + ~country:"US" 64 + ()) 65 + 66 + (* A conference entity with dates *) 67 + let conf = Cff_author.Entity (Cff_author.Entity.make 68 + ~name:"ICSE 2024" 69 + ~date_start:(2024, 4, 14) 70 + ~date_end:(2024, 4, 20) 71 + ~location:"Lisbon, Portugal" 72 + ()) 73 + ]} 74 + 75 + {1 Name Components} *) 76 + 77 + (** Name components for persons. 78 + 79 + CFF name handling follows scholarly citation conventions to properly 80 + represent names from various cultures and naming traditions. *) 81 + module Name : sig 82 + type t 83 + 84 + val empty : t 85 + (** Empty name with all components as [None]. *) 86 + 87 + val make : 88 + ?family_names:string -> 89 + ?given_names:string -> 90 + ?name_particle:string -> 91 + ?name_suffix:string -> 92 + ?alias:string -> 93 + unit -> t 94 + (** Create a name with optional components. 95 + 96 + @param family_names Last name/surname 97 + @param given_names First name(s) 98 + @param name_particle Connector like ["von"], ["van"], ["de"] 99 + @param name_suffix Generational suffix like ["Jr."], ["III"] 100 + @param alias Nickname or pseudonym *) 101 + 102 + val family_names : t -> string option 103 + (** The person's family name (surname, last name). *) 104 + 105 + val given_names : t -> string option 106 + (** The person's given name(s) (first name, forenames). *) 107 + 108 + val name_particle : t -> string option 109 + (** Name connector appearing before family name. 110 + 111 + Examples: ["von"] in "Ludwig von Beethoven", 112 + ["van"] in "Vincent van Gogh". *) 113 + 114 + val name_suffix : t -> string option 115 + (** Generational or honorary suffix. 116 + 117 + Examples: ["Jr."], ["Sr."], ["III"], ["PhD"]. *) 118 + 119 + val alias : t -> string option 120 + (** Nickname, pseudonym, or alternative name. 121 + 122 + Example: ["Tim"] for "Timothy", ["DHH"] for "David Heinemeier Hansson". *) 123 + 124 + val full_name : t -> string 125 + (** Format name as "Given Particle Family, Suffix". 126 + 127 + Examples: 128 + - ["Jane Smith"] 129 + - ["Guido van Rossum"] 130 + - ["John Smith, Jr."] *) 131 + 132 + val pp : Format.formatter -> t -> unit 133 + (** Pretty-print the full name. *) 134 + end 135 + 136 + (** Individual person (author, contributor, editor, etc.). 137 + 138 + A person represents a human contributor with: 139 + - Name components (required: at least family or given names) 140 + - Optional affiliation (institution, company) 141 + - Optional physical address 142 + - Optional contact information (email, ORCID, website) *) 143 + module Person : sig 144 + type t 145 + 146 + val make : 147 + ?family_names:string -> 148 + ?given_names:string -> 149 + ?name_particle:string -> 150 + ?name_suffix:string -> 151 + ?alias:string -> 152 + ?affiliation:string -> 153 + ?address:string -> 154 + ?city:string -> 155 + ?region:string -> 156 + ?post_code:string -> 157 + ?country:string -> 158 + ?email:string -> 159 + ?tel:string -> 160 + ?fax:string -> 161 + ?website:string -> 162 + ?orcid:string -> 163 + unit -> t 164 + (** Create a person with optional fields. 165 + 166 + At minimum, provide [family_names] or [given_names]. 167 + 168 + @param family_names Last name/surname 169 + @param given_names First name(s) 170 + @param name_particle Connector before family name 171 + @param name_suffix Generational suffix 172 + @param alias Nickname or pseudonym 173 + @param affiliation Institution or organization name 174 + @param address Street address 175 + @param city City name 176 + @param region State, province, or region 177 + @param post_code Postal/ZIP code 178 + @param country ISO 3166-1 alpha-2 country code 179 + @param email Email address 180 + @param tel Telephone number 181 + @param fax Fax number 182 + @param website Personal or professional website URL 183 + @param orcid ORCID identifier URL (e.g., ["https://orcid.org/0000-0001-..."]) *) 184 + 185 + val name : t -> Name.t 186 + (** The person's name components. *) 187 + 188 + val affiliation : t -> string option 189 + (** The person's institutional affiliation. 190 + 191 + Example: ["Massachusetts Institute of Technology"]. *) 192 + 193 + val address : t -> Cff_address.Address.t 194 + (** Physical address information. *) 195 + 196 + val contact : t -> Cff_address.Contact.t 197 + (** Contact information (email, phone, web, ORCID). *) 198 + 199 + (** {2 Convenience Accessors for Name} *) 200 + 201 + val family_names : t -> string option 202 + (** Shortcut for [Name.family_names (name t)]. *) 203 + 204 + val given_names : t -> string option 205 + (** Shortcut for [Name.given_names (name t)]. *) 206 + 207 + val name_particle : t -> string option 208 + (** Shortcut for [Name.name_particle (name t)]. *) 209 + 210 + val name_suffix : t -> string option 211 + (** Shortcut for [Name.name_suffix (name t)]. *) 212 + 213 + val alias : t -> string option 214 + (** Shortcut for [Name.alias (name t)]. *) 215 + 216 + val full_name : t -> string 217 + (** Shortcut for [Name.full_name (name t)]. *) 218 + 219 + (** {2 Convenience Accessors for Contact} *) 220 + 221 + val email : t -> string option 222 + (** The person's email address. *) 223 + 224 + val orcid : t -> string option 225 + (** The person's ORCID identifier URL. 226 + 227 + ORCID (Open Researcher and Contributor ID) provides persistent 228 + digital identifiers for researchers. Format: ["https://orcid.org/XXXX-XXXX-XXXX-XXXX"]. *) 229 + 230 + val website : t -> string option 231 + (** The person's website URL. *) 232 + 233 + val pp : Format.formatter -> t -> unit 234 + (** Pretty-print as "Full Name (affiliation)". *) 235 + 236 + val jsont : t Jsont.t 237 + (** JSON/YAML codec for person records. *) 238 + end 239 + 240 + (** Event date range for entities like conferences. 241 + 242 + Some entities (particularly conferences) have associated dates 243 + when they take place. *) 244 + module Event_dates : sig 245 + type t 246 + 247 + val empty : t 248 + (** Empty date range with both dates as [None]. *) 249 + 250 + val make : 251 + ?date_start:Cff_date.t -> 252 + ?date_end:Cff_date.t -> 253 + unit -> t 254 + (** Create an event date range. 255 + 256 + @param date_start When the event begins 257 + @param date_end When the event ends *) 258 + 259 + val date_start : t -> Cff_date.t option 260 + (** The start date of the event. *) 261 + 262 + val date_end : t -> Cff_date.t option 263 + (** The end date of the event. *) 264 + 265 + val is_empty : t -> bool 266 + (** [true] if both dates are [None]. *) 267 + 268 + val pp : Format.formatter -> t -> unit 269 + (** Pretty-print as "YYYY-MM-DD - YYYY-MM-DD". *) 270 + end 271 + 272 + (** Organization, institution, project, or conference. 273 + 274 + An entity represents a non-person author or contributor, such as: 275 + - Research institutions (["MIT"], ["CERN"]) 276 + - Companies (["Google"], ["Mozilla Foundation"]) 277 + - Government agencies (["NASA"], ["NIH"]) 278 + - Open source projects (["The Rust Project"]) 279 + - Academic conferences (["ICSE 2024"]) 280 + - Standards bodies (["IEEE"], ["W3C"]) 281 + 282 + Entities are distinguished from persons in YAML by the presence 283 + of a required [name] field (persons have [family-names]/[given-names] 284 + instead). *) 285 + module Entity : sig 286 + type t 287 + 288 + val make : 289 + name:string -> 290 + ?alias:string -> 291 + ?address:string -> 292 + ?city:string -> 293 + ?region:string -> 294 + ?post_code:string -> 295 + ?country:string -> 296 + ?email:string -> 297 + ?tel:string -> 298 + ?fax:string -> 299 + ?website:string -> 300 + ?orcid:string -> 301 + ?date_start:Cff_date.t -> 302 + ?date_end:Cff_date.t -> 303 + ?location:string -> 304 + unit -> t 305 + (** Create an entity. 306 + 307 + @param name The entity's official name (required) 308 + @param alias Short name or acronym 309 + @param address Street address 310 + @param city City name 311 + @param region State, province, or region 312 + @param post_code Postal/ZIP code 313 + @param country ISO 3166-1 alpha-2 country code 314 + @param email Contact email address 315 + @param tel Telephone number 316 + @param fax Fax number 317 + @param website Official website URL 318 + @param orcid Organization ORCID (rare but valid) 319 + @param date_start Event start date (for conferences) 320 + @param date_end Event end date (for conferences) 321 + @param location Event location description *) 322 + 323 + val name : t -> string 324 + (** The entity's official name. This field distinguishes entities 325 + from persons in the YAML format. *) 326 + 327 + val alias : t -> string option 328 + (** Short name, acronym, or alternative name. 329 + 330 + Example: ["MIT"] for "Massachusetts Institute of Technology". *) 331 + 332 + val address : t -> Cff_address.Address.t 333 + (** Physical address information. *) 334 + 335 + val contact : t -> Cff_address.Contact.t 336 + (** Contact information. *) 337 + 338 + val event_dates : t -> Event_dates.t 339 + (** Event dates (for conferences). *) 340 + 341 + val location : t -> string option 342 + (** Event location description (for conferences). 343 + 344 + Example: ["Lisbon, Portugal"]. *) 345 + 346 + (** {2 Convenience Accessors for Contact} *) 347 + 348 + val email : t -> string option 349 + (** The entity's contact email. *) 350 + 351 + val orcid : t -> string option 352 + (** The entity's ORCID (organizations can have ORCIDs). *) 353 + 354 + val website : t -> string option 355 + (** The entity's official website URL. *) 356 + 357 + val pp : Format.formatter -> t -> unit 358 + (** Pretty-print as "Name (alias)". *) 359 + 360 + val jsont : t Jsont.t 361 + (** JSON/YAML codec for entity records. *) 362 + end 363 + 364 + (** {1 Author Discriminated Union} 365 + 366 + The main author type is a sum type that can hold either a person 367 + or an entity. This matches the CFF specification where authors 368 + can be either individuals or organizations. *) 369 + 370 + type t = 371 + | Person of Person.t (** An individual person *) 372 + | Entity of Entity.t (** An organization or entity *) 373 + (** An author: either a person or an entity. *) 374 + 375 + val person : Person.t -> t 376 + (** Wrap a person as an author. *) 377 + 378 + val entity : Entity.t -> t 379 + (** Wrap an entity as an author. *) 380 + 381 + val name : t -> string 382 + (** Get the display name. 383 + 384 + For persons, returns the full formatted name. 385 + For entities, returns the entity name. *) 386 + 387 + val orcid : t -> string option 388 + (** Get the ORCID if present. Works for both persons and entities. *) 389 + 390 + val email : t -> string option 391 + (** Get the email if present. Works for both persons and entities. *) 392 + 393 + val pp : Format.formatter -> t -> unit 394 + (** Pretty-print the author. *) 395 + 396 + val jsont : t Jsont.t 397 + (** JSON/YAML codec that discriminates based on [name] field presence. 398 + 399 + When decoding: 400 + - If the object has a [name] field -> Entity 401 + - Otherwise -> Person 402 + 403 + This matches the CFF specification where entities are distinguished 404 + by having a [name] field while persons have [family-names] and 405 + [given-names] fields. *)
+60
project/ocaml-cff/lib/cff_config.ml
··· 1 + (*--------------------------------------------------------------------------- 2 + Copyright (c) 2025 The ocaml-cff programmers. All rights reserved. 3 + SPDX-License-Identifier: ISC 4 + ---------------------------------------------------------------------------*) 5 + 6 + (** Configuration for CFF parsing and validation. *) 7 + 8 + type t = { 9 + strict_urls : bool; 10 + strict_dates : bool; 11 + strict_dois : bool; 12 + strict_orcids : bool; 13 + strict_licenses : bool; 14 + keep_unknown : bool; 15 + } 16 + 17 + let default = { 18 + strict_urls = false; 19 + strict_dates = false; 20 + strict_dois = false; 21 + strict_orcids = false; 22 + strict_licenses = false; 23 + keep_unknown = true; 24 + } 25 + 26 + let strict = { 27 + strict_urls = true; 28 + strict_dates = true; 29 + strict_dois = true; 30 + strict_orcids = true; 31 + strict_licenses = true; 32 + keep_unknown = true; 33 + } 34 + 35 + let lenient = { 36 + strict_urls = false; 37 + strict_dates = false; 38 + strict_dois = false; 39 + strict_orcids = false; 40 + strict_licenses = false; 41 + keep_unknown = true; 42 + } 43 + 44 + let make 45 + ?(strict_urls = false) 46 + ?(strict_dates = false) 47 + ?(strict_dois = false) 48 + ?(strict_orcids = false) 49 + ?(strict_licenses = false) 50 + ?(keep_unknown = true) 51 + () = 52 + { strict_urls; strict_dates; strict_dois; strict_orcids; 53 + strict_licenses; keep_unknown } 54 + 55 + let strict_urls t = t.strict_urls 56 + let strict_dates t = t.strict_dates 57 + let strict_dois t = t.strict_dois 58 + let strict_orcids t = t.strict_orcids 59 + let strict_licenses t = t.strict_licenses 60 + let keep_unknown t = t.keep_unknown
+109
project/ocaml-cff/lib/cff_config.mli
··· 1 + (*--------------------------------------------------------------------------- 2 + Copyright (c) 2025 The ocaml-cff programmers. All rights reserved. 3 + SPDX-License-Identifier: ISC 4 + ---------------------------------------------------------------------------*) 5 + 6 + (** Configuration for CFF parsing and validation. 7 + 8 + CFF files in the wild may contain non-standard or deprecated values. 9 + This module provides configuration options to control validation 10 + strictness during parsing. 11 + 12 + {1 Validation Modes} 13 + 14 + {2 Strict Mode} 15 + 16 + Validates all fields according to their specifications: 17 + 18 + - URLs must be well-formed 19 + - Dates must be valid ISO 8601 dates 20 + - DOIs must match the DOI pattern 21 + - ORCIDs must be valid ORCID URLs 22 + - License IDs must be valid SPDX identifiers 23 + 24 + Use strict mode for validating CFF files or when you control the input. 25 + 26 + {2 Lenient Mode} 27 + 28 + Accepts any string value without validation. Use lenient mode when: 29 + 30 + - Parsing CFF files from unknown sources 31 + - Handling legacy files with deprecated license IDs 32 + - Round-tripping files without data loss 33 + 34 + {2 Default Mode} 35 + 36 + A balanced approach that: 37 + - Keeps unknown fields (for round-tripping) 38 + - Uses lenient validation for most fields 39 + 40 + {1 Unknown Fields} 41 + 42 + The [keep_unknown] option controls handling of unrecognized fields: 43 + 44 + - [true]: Preserve unknown fields in the parsed structure 45 + - [false]: Silently ignore unknown fields 46 + 47 + Keeping unknown fields allows round-tripping CFF files that contain 48 + extensions or newer fields not yet supported by this library. *) 49 + 50 + type t 51 + (** Configuration type. *) 52 + 53 + val default : t 54 + (** Default configuration. 55 + 56 + Uses lenient validation and keeps unknown fields. Suitable for 57 + general parsing where round-tripping is desired. *) 58 + 59 + val strict : t 60 + (** Strict configuration. 61 + 62 + Validates all fields according to CFF 1.2.0 specification. 63 + Fails on invalid URLs, dates, DOIs, ORCIDs, and license IDs. 64 + 65 + Keeps unknown fields for compatibility. *) 66 + 67 + val lenient : t 68 + (** Fully lenient configuration. 69 + 70 + Accepts any string values without validation. Useful for parsing 71 + malformed or non-standard CFF files. *) 72 + 73 + val make : 74 + ?strict_urls:bool -> 75 + ?strict_dates:bool -> 76 + ?strict_dois:bool -> 77 + ?strict_orcids:bool -> 78 + ?strict_licenses:bool -> 79 + ?keep_unknown:bool -> 80 + unit -> t 81 + (** Create a custom configuration. 82 + 83 + All strictness options default to [false] (lenient). 84 + [keep_unknown] defaults to [true]. 85 + 86 + @param strict_urls Validate URL format 87 + @param strict_dates Validate date format and values 88 + @param strict_dois Validate DOI pattern 89 + @param strict_orcids Validate ORCID format 90 + @param strict_licenses Validate SPDX license identifiers 91 + @param keep_unknown Preserve unrecognized fields *) 92 + 93 + val strict_urls : t -> bool 94 + (** Whether URL fields are validated. *) 95 + 96 + val strict_dates : t -> bool 97 + (** Whether date fields are validated. *) 98 + 99 + val strict_dois : t -> bool 100 + (** Whether DOI fields are validated. *) 101 + 102 + val strict_orcids : t -> bool 103 + (** Whether ORCID fields are validated. *) 104 + 105 + val strict_licenses : t -> bool 106 + (** Whether license identifiers are validated against SPDX. *) 107 + 108 + val keep_unknown : t -> bool 109 + (** Whether unknown fields are preserved in the parsed structure. *)
+51
project/ocaml-cff/lib/cff_country.ml
··· 1 + (*--------------------------------------------------------------------------- 2 + Copyright (c) 2025 The ocaml-cff programmers. All rights reserved. 3 + SPDX-License-Identifier: ISC 4 + ---------------------------------------------------------------------------*) 5 + 6 + (** Country code handling for CFF using ISO3166. *) 7 + 8 + type t = string 9 + 10 + let of_string s = 11 + (* Validate against ISO3166 alpha-2 codes *) 12 + let s = String.uppercase_ascii s in 13 + try 14 + let _ = ISO3166.alpha2_of_string s in 15 + Ok s 16 + with Invalid_argument _ -> 17 + Error (`Invalid_country s) 18 + 19 + let to_string t = t 20 + 21 + let to_iso3166 t = 22 + try 23 + Some (ISO3166.alpha2_to_country (ISO3166.alpha2_of_string t)) 24 + with Invalid_argument _ -> 25 + None 26 + 27 + let name t = 28 + match to_iso3166 t with 29 + | Some country -> Some (ISO3166.Country.name country) 30 + | None -> None 31 + 32 + let equal = String.equal 33 + let compare = String.compare 34 + 35 + let pp ppf t = 36 + Format.pp_print_string ppf t 37 + 38 + (* Jsont codec for country codes *) 39 + let jsont = 40 + let dec s = 41 + match of_string s with 42 + | Ok c -> c 43 + | Error (`Invalid_country s) -> 44 + Jsont.Error.msgf Jsont.Meta.none "Invalid ISO 3166-1 alpha-2 country code: %s" s 45 + in 46 + let enc t = to_string t in 47 + Jsont.string 48 + |> Jsont.map ~dec ~enc 49 + 50 + (* Lenient codec that accepts any string *) 51 + let jsont_lenient = Jsont.string
+85
project/ocaml-cff/lib/cff_country.mli
··· 1 + (*--------------------------------------------------------------------------- 2 + Copyright (c) 2025 The ocaml-cff programmers. All rights reserved. 3 + SPDX-License-Identifier: ISC 4 + ---------------------------------------------------------------------------*) 5 + 6 + (** ISO 3166-1 alpha-2 country codes for CFF. 7 + 8 + CFF uses {{:https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2} 9 + ISO 3166-1 alpha-2} two-letter country codes for the [country] 10 + field on persons and entities. 11 + 12 + {1 Format} 13 + 14 + Country codes are exactly two uppercase letters: 15 + 16 + - ["US"] - United States 17 + - ["GB"] - United Kingdom 18 + - ["DE"] - Germany 19 + - ["FR"] - France 20 + - ["JP"] - Japan 21 + - ["CN"] - China 22 + - ["AU"] - Australia 23 + - ["CA"] - Canada 24 + - ["CH"] - Switzerland 25 + - ["NL"] - Netherlands 26 + 27 + {1 Validation} 28 + 29 + This module validates country codes against the {!ISO3166} library, 30 + which maintains the official list of assigned codes. 31 + 32 + {1 Example} 33 + 34 + {[ 35 + authors: 36 + - family-names: Müller 37 + given-names: Hans 38 + city: Berlin 39 + country: DE 40 + ]} *) 41 + 42 + type t = string 43 + (** An ISO 3166-1 alpha-2 country code (two uppercase letters). *) 44 + 45 + val of_string : string -> (t, [> `Invalid_country of string]) result 46 + (** Parse and validate a country code. 47 + 48 + Case-insensitive: ["us"], ["US"], and ["Us"] all produce ["US"]. 49 + Returns [Error (`Invalid_country s)] for unknown codes. *) 50 + 51 + val to_string : t -> string 52 + (** Return the uppercase country code. *) 53 + 54 + val to_iso3166 : t -> ISO3166.Country.t option 55 + (** Look up the full country record from {!ISO3166}. 56 + 57 + Returns [None] if the code is not in the ISO 3166-1 list. *) 58 + 59 + val name : t -> string option 60 + (** Get the country name if the code is valid. 61 + 62 + Examples: 63 + - [name "US" = Some "United States of America"] 64 + - [name "GB" = Some "United Kingdom of Great Britain and Northern Ireland"] 65 + - [name "XX" = None] *) 66 + 67 + val equal : t -> t -> bool 68 + (** Country code equality (case-sensitive after normalization). *) 69 + 70 + val compare : t -> t -> int 71 + (** Alphabetical comparison of country codes. *) 72 + 73 + val pp : Format.formatter -> t -> unit 74 + (** Pretty-print the country code. *) 75 + 76 + val jsont : t Jsont.t 77 + (** JSON/YAML codec that validates country codes. 78 + 79 + Returns an error for invalid ISO 3166-1 alpha-2 codes. *) 80 + 81 + val jsont_lenient : t Jsont.t 82 + (** JSON/YAML codec that accepts any string. 83 + 84 + Use this when parsing CFF files that may contain non-standard 85 + country codes. *)
+56
project/ocaml-cff/lib/cff_date.ml
··· 1 + (*--------------------------------------------------------------------------- 2 + Copyright (c) 2025 The ocaml-cff programmers. All rights reserved. 3 + SPDX-License-Identifier: ISC 4 + ---------------------------------------------------------------------------*) 5 + 6 + (** Date handling for CFF using Ptime. *) 7 + 8 + type t = Ptime.date 9 + 10 + let of_string s = 11 + (* CFF dates are YYYY-MM-DD format *) 12 + match String.split_on_char '-' s with 13 + | [y; m; d] -> 14 + (match int_of_string_opt y, int_of_string_opt m, int_of_string_opt d with 15 + | Some year, Some month, Some day -> 16 + (* Validate the date components *) 17 + if year >= 0 && year <= 9999 && 18 + month >= 1 && month <= 12 && 19 + day >= 1 && day <= 31 then 20 + Ok (year, month, day) 21 + else 22 + Error (`Invalid_date s) 23 + | _ -> Error (`Invalid_date s)) 24 + | _ -> Error (`Invalid_date s) 25 + 26 + let to_string (year, month, day) = 27 + Printf.sprintf "%04d-%02d-%02d" year month day 28 + 29 + let year (y, _, _) = y 30 + let month (_, m, _) = m 31 + let day (_, _, d) = d 32 + 33 + let equal (y1, m1, d1) (y2, m2, d2) = 34 + y1 = y2 && m1 = m2 && d1 = d2 35 + 36 + let compare (y1, m1, d1) (y2, m2, d2) = 37 + match Int.compare y1 y2 with 38 + | 0 -> (match Int.compare m1 m2 with 39 + | 0 -> Int.compare d1 d2 40 + | n -> n) 41 + | n -> n 42 + 43 + let pp ppf date = 44 + Format.pp_print_string ppf (to_string date) 45 + 46 + (* Jsont codec for dates *) 47 + let jsont = 48 + let dec s = 49 + match of_string s with 50 + | Ok d -> d 51 + | Error (`Invalid_date s) -> 52 + Jsont.Error.msgf Jsont.Meta.none "Invalid date format: %s" s 53 + in 54 + let enc date = to_string date in 55 + Jsont.string 56 + |> Jsont.map ~dec ~enc
+87
project/ocaml-cff/lib/cff_date.mli
··· 1 + (*--------------------------------------------------------------------------- 2 + Copyright (c) 2025 The ocaml-cff programmers. All rights reserved. 3 + SPDX-License-Identifier: ISC 4 + ---------------------------------------------------------------------------*) 5 + 6 + (** Date handling for CFF. 7 + 8 + CFF uses ISO 8601 date format ([YYYY-MM-DD]) for all date fields. 9 + This module wraps {!Ptime.date} for date representation and provides 10 + parsing and formatting functions. 11 + 12 + {1 Date Fields in CFF} 13 + 14 + CFF has several date-related fields at different levels: 15 + 16 + {2 Root Level} 17 + 18 + - [date-released]: When the software/dataset was released 19 + 20 + {2 Reference Level} 21 + 22 + - [date-accessed]: When an online resource was accessed 23 + - [date-downloaded]: When a resource was downloaded 24 + - [date-published]: Formal publication date 25 + - [date-released]: Release date (for software references) 26 + 27 + {2 Entity Level} 28 + 29 + - [date-start]: Event start date (for conferences) 30 + - [date-end]: Event end date (for conferences) 31 + 32 + {1 Date Format} 33 + 34 + All dates use ISO 8601 format: [YYYY-MM-DD] 35 + 36 + {2 Examples} 37 + 38 + {[ 39 + date-released: 2024-01-15 40 + date-accessed: 2024-06-30 41 + ]} 42 + 43 + {1 Year-Only Dates} 44 + 45 + For historical works or when only the year is known, use the [year] 46 + field (an integer) instead of a full date. *) 47 + 48 + type t = Ptime.date 49 + (** A date as [(year, month, day)] tuple. 50 + 51 + The tuple contains: 52 + - [year]: Four-digit year (e.g., [2024]) 53 + - [month]: Month number (1-12) 54 + - [day]: Day of month (1-31) *) 55 + 56 + val of_string : string -> (t, [> `Invalid_date of string]) result 57 + (** Parse a date from [YYYY-MM-DD] format. 58 + 59 + Returns [Error (`Invalid_date s)] if the string is not a valid date. 60 + Validates that the date is a real calendar date (e.g., rejects Feb 30). *) 61 + 62 + val to_string : t -> string 63 + (** Format a date as [YYYY-MM-DD]. *) 64 + 65 + val year : t -> int 66 + (** Extract the year component. *) 67 + 68 + val month : t -> int 69 + (** Extract the month component (1-12). *) 70 + 71 + val day : t -> int 72 + (** Extract the day component (1-31). *) 73 + 74 + val equal : t -> t -> bool 75 + (** Date equality. *) 76 + 77 + val compare : t -> t -> int 78 + (** Date comparison (chronological order). *) 79 + 80 + val pp : Format.formatter -> t -> unit 81 + (** Pretty-print a date in [YYYY-MM-DD] format. *) 82 + 83 + val jsont : t Jsont.t 84 + (** JSON/YAML codec for dates. 85 + 86 + Parses strings in [YYYY-MM-DD] format and serializes back to the 87 + same format. *)
+241
project/ocaml-cff/lib/cff_enums.ml
··· 1 + (*--------------------------------------------------------------------------- 2 + Copyright (c) 2025 The ocaml-cff programmers. All rights reserved. 3 + SPDX-License-Identifier: ISC 4 + ---------------------------------------------------------------------------*) 5 + 6 + (** Enumeration types for CFF using polymorphic variants. *) 7 + 8 + (** Functor to generate common enum operations. *) 9 + module type STRING_ENUM = sig 10 + type t 11 + val of_string : string -> t option 12 + val to_string : t -> string 13 + val type_name : string 14 + end 15 + 16 + module Make_enum (E : STRING_ENUM) = struct 17 + include E 18 + let equal (a : t) (b : t) = a = b 19 + let compare = Stdlib.compare 20 + let pp ppf t = Format.pp_print_string ppf (to_string t) 21 + let jsont = 22 + Jsont.string |> Jsont.map 23 + ~dec:(fun s -> 24 + match of_string s with 25 + | Some t -> t 26 + | None -> Jsont.Error.msgf Jsont.Meta.none "Invalid %s: %s" type_name s) 27 + ~enc:to_string 28 + end 29 + 30 + module Identifier_type = Make_enum (struct 31 + type t = [ `Doi | `Url | `Swh | `Other ] 32 + let type_name = "identifier type" 33 + 34 + let of_string = function 35 + | "doi" -> Some `Doi 36 + | "url" -> Some `Url 37 + | "swh" -> Some `Swh 38 + | "other" -> Some `Other 39 + | _ -> None 40 + 41 + let to_string = function 42 + | `Doi -> "doi" 43 + | `Url -> "url" 44 + | `Swh -> "swh" 45 + | `Other -> "other" 46 + end) 47 + 48 + module Reference_type = Make_enum (struct 49 + type t = [ 50 + | `Art 51 + | `Article 52 + | `Audiovisual 53 + | `Bill 54 + | `Blog 55 + | `Book 56 + | `Catalogue 57 + | `Conference 58 + | `Conference_paper 59 + | `Data 60 + | `Database 61 + | `Dictionary 62 + | `Edited_work 63 + | `Encyclopedia 64 + | `Film_broadcast 65 + | `Generic 66 + | `Government_document 67 + | `Grant 68 + | `Hearing 69 + | `Historical_work 70 + | `Legal_case 71 + | `Legal_rule 72 + | `Magazine_article 73 + | `Manual 74 + | `Map 75 + | `Multimedia 76 + | `Music 77 + | `Newspaper_article 78 + | `Pamphlet 79 + | `Patent 80 + | `Personal_communication 81 + | `Proceedings 82 + | `Report 83 + | `Serial 84 + | `Slides 85 + | `Software 86 + | `Software_code 87 + | `Software_container 88 + | `Software_executable 89 + | `Software_virtual_machine 90 + | `Sound_recording 91 + | `Standard 92 + | `Statute 93 + | `Thesis 94 + | `Unpublished 95 + | `Video 96 + | `Website 97 + ] 98 + let type_name = "reference type" 99 + 100 + let of_string = function 101 + | "art" -> Some `Art 102 + | "article" -> Some `Article 103 + | "audiovisual" -> Some `Audiovisual 104 + | "bill" -> Some `Bill 105 + | "blog" -> Some `Blog 106 + | "book" -> Some `Book 107 + | "catalogue" -> Some `Catalogue 108 + | "conference" -> Some `Conference 109 + | "conference-paper" -> Some `Conference_paper 110 + | "data" -> Some `Data 111 + | "database" -> Some `Database 112 + | "dictionary" -> Some `Dictionary 113 + | "edited-work" -> Some `Edited_work 114 + | "encyclopedia" -> Some `Encyclopedia 115 + | "film-broadcast" -> Some `Film_broadcast 116 + | "generic" -> Some `Generic 117 + | "government-document" -> Some `Government_document 118 + | "grant" -> Some `Grant 119 + | "hearing" -> Some `Hearing 120 + | "historical-work" -> Some `Historical_work 121 + | "legal-case" -> Some `Legal_case 122 + | "legal-rule" -> Some `Legal_rule 123 + | "magazine-article" -> Some `Magazine_article 124 + | "manual" -> Some `Manual 125 + | "map" -> Some `Map 126 + | "multimedia" -> Some `Multimedia 127 + | "music" -> Some `Music 128 + | "newspaper-article" -> Some `Newspaper_article 129 + | "pamphlet" -> Some `Pamphlet 130 + | "patent" -> Some `Patent 131 + | "personal-communication" -> Some `Personal_communication 132 + | "proceedings" -> Some `Proceedings 133 + | "report" -> Some `Report 134 + | "serial" -> Some `Serial 135 + | "slides" -> Some `Slides 136 + | "software" -> Some `Software 137 + | "software-code" -> Some `Software_code 138 + | "software-container" -> Some `Software_container 139 + | "software-executable" -> Some `Software_executable 140 + | "software-virtual-machine" -> Some `Software_virtual_machine 141 + | "sound-recording" -> Some `Sound_recording 142 + | "standard" -> Some `Standard 143 + | "statute" -> Some `Statute 144 + | "thesis" -> Some `Thesis 145 + | "unpublished" -> Some `Unpublished 146 + | "video" -> Some `Video 147 + | "website" -> Some `Website 148 + | _ -> None 149 + 150 + let to_string = function 151 + | `Art -> "art" 152 + | `Article -> "article" 153 + | `Audiovisual -> "audiovisual" 154 + | `Bill -> "bill" 155 + | `Blog -> "blog" 156 + | `Book -> "book" 157 + | `Catalogue -> "catalogue" 158 + | `Conference -> "conference" 159 + | `Conference_paper -> "conference-paper" 160 + | `Data -> "data" 161 + | `Database -> "database" 162 + | `Dictionary -> "dictionary" 163 + | `Edited_work -> "edited-work" 164 + | `Encyclopedia -> "encyclopedia" 165 + | `Film_broadcast -> "film-broadcast" 166 + | `Generic -> "generic" 167 + | `Government_document -> "government-document" 168 + | `Grant -> "grant" 169 + | `Hearing -> "hearing" 170 + | `Historical_work -> "historical-work" 171 + | `Legal_case -> "legal-case" 172 + | `Legal_rule -> "legal-rule" 173 + | `Magazine_article -> "magazine-article" 174 + | `Manual -> "manual" 175 + | `Map -> "map" 176 + | `Multimedia -> "multimedia" 177 + | `Music -> "music" 178 + | `Newspaper_article -> "newspaper-article" 179 + | `Pamphlet -> "pamphlet" 180 + | `Patent -> "patent" 181 + | `Personal_communication -> "personal-communication" 182 + | `Proceedings -> "proceedings" 183 + | `Report -> "report" 184 + | `Serial -> "serial" 185 + | `Slides -> "slides" 186 + | `Software -> "software" 187 + | `Software_code -> "software-code" 188 + | `Software_container -> "software-container" 189 + | `Software_executable -> "software-executable" 190 + | `Software_virtual_machine -> "software-virtual-machine" 191 + | `Sound_recording -> "sound-recording" 192 + | `Standard -> "standard" 193 + | `Statute -> "statute" 194 + | `Thesis -> "thesis" 195 + | `Unpublished -> "unpublished" 196 + | `Video -> "video" 197 + | `Website -> "website" 198 + end) 199 + 200 + module Status = Make_enum (struct 201 + type t = [ 202 + | `Abstract 203 + | `Advance_online 204 + | `In_preparation 205 + | `In_press 206 + | `Preprint 207 + | `Submitted 208 + ] 209 + let type_name = "status" 210 + 211 + let of_string = function 212 + | "abstract" -> Some `Abstract 213 + | "advance-online" -> Some `Advance_online 214 + | "in-preparation" -> Some `In_preparation 215 + | "in-press" -> Some `In_press 216 + | "preprint" -> Some `Preprint 217 + | "submitted" -> Some `Submitted 218 + | _ -> None 219 + 220 + let to_string = function 221 + | `Abstract -> "abstract" 222 + | `Advance_online -> "advance-online" 223 + | `In_preparation -> "in-preparation" 224 + | `In_press -> "in-press" 225 + | `Preprint -> "preprint" 226 + | `Submitted -> "submitted" 227 + end) 228 + 229 + module Cff_type = Make_enum (struct 230 + type t = [ `Software | `Dataset ] 231 + let type_name = "CFF type" 232 + 233 + let of_string = function 234 + | "software" -> Some `Software 235 + | "dataset" -> Some `Dataset 236 + | _ -> None 237 + 238 + let to_string = function 239 + | `Software -> "software" 240 + | `Dataset -> "dataset" 241 + end)
+289
project/ocaml-cff/lib/cff_enums.mli
··· 1 + (*--------------------------------------------------------------------------- 2 + Copyright (c) 2025 The ocaml-cff programmers. All rights reserved. 3 + SPDX-License-Identifier: ISC 4 + ---------------------------------------------------------------------------*) 5 + 6 + (** Enumeration types for CFF. 7 + 8 + CFF defines several enumerated types using fixed string values. 9 + This module represents them as polymorphic variants for type safety 10 + while providing bidirectional conversion to/from strings. 11 + 12 + {1 Identifier Types} 13 + 14 + The [identifiers] field allows typed references to external resources. 15 + 16 + {1 Reference Types} 17 + 18 + CFF supports 40+ reference types for bibliographic entries, covering 19 + academic publications, software, data, legal documents, and media. 20 + 21 + {1 Publication Status} 22 + 23 + Works in progress can have a status indicating their publication stage. 24 + 25 + {1 CFF Type} 26 + 27 + The top-level CFF file describes either software or a dataset. *) 28 + 29 + (** Identifier type for the [identifiers] field. 30 + 31 + Each identifier in the [identifiers] list has a type indicating the 32 + identifier scheme: 33 + 34 + - [`Doi] - Digital Object Identifier ({{:https://doi.org}doi.org}) 35 + - [`Url] - Web URL 36 + - [`Swh] - Software Heritage identifier ({{:https://www.softwareheritage.org}softwareheritage.org}) 37 + - [`Other] - Any other identifier type 38 + 39 + {2 Examples} 40 + 41 + {[ 42 + type: doi 43 + value: 10.5281/zenodo.1234567 44 + description: The concept DOI for all versions 45 + 46 + type: swh 47 + value: swh:1:dir:bc286860f423ea7ced246ba7458eef4b4541cf2d 48 + description: Software Heritage archive 49 + ]} *) 50 + module Identifier_type : sig 51 + type t = [ `Doi | `Url | `Swh | `Other ] 52 + (** Identifier types. *) 53 + 54 + val of_string : string -> t option 55 + (** Parse from YAML string: ["doi"], ["url"], ["swh"], ["other"]. *) 56 + 57 + val to_string : t -> string 58 + (** Convert to YAML string representation. *) 59 + 60 + val equal : t -> t -> bool 61 + val compare : t -> t -> int 62 + val pp : Format.formatter -> t -> unit 63 + 64 + val jsont : t Jsont.t 65 + (** JSON/YAML codec. *) 66 + end 67 + 68 + (** Reference type for bibliographic entries. 69 + 70 + CFF 1.2.0 supports 40+ reference types covering virtually all forms 71 + of citable content. The type determines which fields are relevant. 72 + 73 + {2 Academic/Research} 74 + 75 + - [`Article] - Journal article 76 + - [`Book] - Complete book 77 + - [`Conference] - Conference as an event 78 + - [`Conference_paper] - Paper in conference proceedings 79 + - [`Edited_work] - Edited collection 80 + - [`Proceedings] - Conference proceedings volume 81 + - [`Thesis] - Dissertation or thesis 82 + - [`Report] - Technical report 83 + 84 + {2 Software} 85 + 86 + - [`Software] - General software (default for CFF files) 87 + - [`Software_code] - Source code specifically 88 + - [`Software_container] - Container image (Docker, etc.) 89 + - [`Software_executable] - Binary/executable 90 + - [`Software_virtual_machine] - VM image 91 + 92 + {2 Data} 93 + 94 + - [`Data] - General data 95 + - [`Database] - Database 96 + - [`Dictionary] - Dictionary or lexicon 97 + - [`Encyclopedia] - Encyclopedia 98 + 99 + {2 Legal} 100 + 101 + - [`Patent] - Patent 102 + - [`Legal_case] - Legal case 103 + - [`Legal_rule] - Legal rule or regulation 104 + - [`Statute] - Statute or law 105 + - [`Bill] - Legislative bill 106 + - [`Hearing] - Legislative hearing 107 + 108 + {2 Media} 109 + 110 + - [`Audiovisual] - Audio/video content 111 + - [`Film_broadcast] - Film or broadcast 112 + - [`Video] - Video 113 + - [`Sound_recording] - Audio recording 114 + - [`Music] - Musical work 115 + - [`Art] - Artwork 116 + 117 + {2 Publications} 118 + 119 + - [`Magazine_article] - Magazine article 120 + - [`Newspaper_article] - Newspaper article 121 + - [`Blog] - Blog post 122 + - [`Website] - Website 123 + - [`Pamphlet] - Pamphlet or brochure 124 + - [`Serial] - Serial publication 125 + - [`Manual] - Manual or documentation 126 + - [`Catalogue] - Catalogue 127 + 128 + {2 Other} 129 + 130 + - [`Generic] - Generic reference (fallback) 131 + - [`Grant] - Research grant 132 + - [`Government_document] - Government document 133 + - [`Historical_work] - Historical work 134 + - [`Map] - Map 135 + - [`Multimedia] - Multimedia work 136 + - [`Personal_communication] - Personal communication 137 + - [`Slides] - Presentation slides 138 + - [`Standard] - Technical standard 139 + - [`Unpublished] - Unpublished work *) 140 + module Reference_type : sig 141 + type t = [ 142 + | `Art 143 + | `Article 144 + | `Audiovisual 145 + | `Bill 146 + | `Blog 147 + | `Book 148 + | `Catalogue 149 + | `Conference 150 + | `Conference_paper 151 + | `Data 152 + | `Database 153 + | `Dictionary 154 + | `Edited_work 155 + | `Encyclopedia 156 + | `Film_broadcast 157 + | `Generic 158 + | `Government_document 159 + | `Grant 160 + | `Hearing 161 + | `Historical_work 162 + | `Legal_case 163 + | `Legal_rule 164 + | `Magazine_article 165 + | `Manual 166 + | `Map 167 + | `Multimedia 168 + | `Music 169 + | `Newspaper_article 170 + | `Pamphlet 171 + | `Patent 172 + | `Personal_communication 173 + | `Proceedings 174 + | `Report 175 + | `Serial 176 + | `Slides 177 + | `Software 178 + | `Software_code 179 + | `Software_container 180 + | `Software_executable 181 + | `Software_virtual_machine 182 + | `Sound_recording 183 + | `Standard 184 + | `Statute 185 + | `Thesis 186 + | `Unpublished 187 + | `Video 188 + | `Website 189 + ] 190 + (** All supported reference types. *) 191 + 192 + val of_string : string -> t option 193 + (** Parse from YAML string. Hyphenated names like ["conference-paper"] 194 + map to underscored variants like [`Conference_paper]. *) 195 + 196 + val to_string : t -> string 197 + (** Convert to YAML string representation. 198 + Underscored variants like [`Conference_paper] become ["conference-paper"]. *) 199 + 200 + val equal : t -> t -> bool 201 + val compare : t -> t -> int 202 + val pp : Format.formatter -> t -> unit 203 + 204 + val jsont : t Jsont.t 205 + (** JSON/YAML codec. *) 206 + end 207 + 208 + (** Publication status for works in progress. 209 + 210 + The [status] field indicates the publication stage of a work that 211 + is not yet formally published: 212 + 213 + - [`Abstract] - Only an abstract is available 214 + - [`Advance_online] - Published online ahead of print 215 + - [`In_preparation] - Being written 216 + - [`In_press] - Accepted, awaiting publication 217 + - [`Preprint] - Available as preprint (arXiv, bioRxiv, etc.) 218 + - [`Submitted] - Submitted for review 219 + 220 + {2 Example} 221 + 222 + {[ 223 + references: 224 + - type: article 225 + title: "Our Upcoming Paper" 226 + authors: 227 + - family-names: Smith 228 + given-names: Jane 229 + journal: "Nature" 230 + status: submitted 231 + ]} *) 232 + module Status : sig 233 + type t = [ 234 + | `Abstract 235 + | `Advance_online 236 + | `In_preparation 237 + | `In_press 238 + | `Preprint 239 + | `Submitted 240 + ] 241 + (** Publication status values. *) 242 + 243 + val of_string : string -> t option 244 + (** Parse from YAML string: ["abstract"], ["advance-online"], etc. *) 245 + 246 + val to_string : t -> string 247 + (** Convert to YAML string representation. *) 248 + 249 + val equal : t -> t -> bool 250 + val compare : t -> t -> int 251 + val pp : Format.formatter -> t -> unit 252 + 253 + val jsont : t Jsont.t 254 + (** JSON/YAML codec. *) 255 + end 256 + 257 + (** CFF file type: software or dataset. 258 + 259 + The [type] field at the root level indicates whether the CFF file 260 + describes software or a dataset: 261 + 262 + - [`Software] - Software project (default if omitted) 263 + - [`Dataset] - Dataset or data package 264 + 265 + {2 Example} 266 + 267 + {[ 268 + cff-version: "1.2.0" 269 + type: dataset 270 + title: "Climate Data 2020-2024" 271 + # ... 272 + ]} *) 273 + module Cff_type : sig 274 + type t = [ `Software | `Dataset ] 275 + (** CFF file types. *) 276 + 277 + val of_string : string -> t option 278 + (** Parse from YAML string: ["software"] or ["dataset"]. *) 279 + 280 + val to_string : t -> string 281 + (** Convert to YAML string representation. *) 282 + 283 + val equal : t -> t -> bool 284 + val compare : t -> t -> int 285 + val pp : Format.formatter -> t -> unit 286 + 287 + val jsont : t Jsont.t 288 + (** JSON/YAML codec. *) 289 + end
+45
project/ocaml-cff/lib/cff_identifier.ml
··· 1 + (*--------------------------------------------------------------------------- 2 + Copyright (c) 2025 The ocaml-cff programmers. All rights reserved. 3 + SPDX-License-Identifier: ISC 4 + ---------------------------------------------------------------------------*) 5 + 6 + (** Identifier type for CFF. *) 7 + 8 + type t = { 9 + type_ : Cff_enums.Identifier_type.t; 10 + value : string; 11 + description : string option; 12 + } 13 + 14 + let make ~type_ ~value ?description () = 15 + { type_; value; description } 16 + 17 + let type_ t = t.type_ 18 + let value t = t.value 19 + let description t = t.description 20 + 21 + let equal a b = 22 + Cff_enums.Identifier_type.equal a.type_ b.type_ && 23 + String.equal a.value b.value 24 + 25 + let compare a b = 26 + match Cff_enums.Identifier_type.compare a.type_ b.type_ with 27 + | 0 -> String.compare a.value b.value 28 + | n -> n 29 + 30 + let pp ppf t = 31 + Format.fprintf ppf "%a: %s" 32 + Cff_enums.Identifier_type.pp t.type_ 33 + t.value 34 + 35 + let jsont = 36 + Jsont.Object.map ~kind:"Identifier" 37 + (fun type_ value description -> { type_; value; description }) 38 + |> Jsont.Object.mem "type" Cff_enums.Identifier_type.jsont 39 + ~enc:(fun i -> i.type_) 40 + |> Jsont.Object.mem "value" Jsont.string 41 + ~enc:(fun i -> i.value) 42 + |> Jsont.Object.opt_mem "description" Jsont.string 43 + ~enc:(fun i -> i.description) 44 + |> Jsont.Object.skip_unknown 45 + |> Jsont.Object.finish
+110
project/ocaml-cff/lib/cff_identifier.mli
··· 1 + (*--------------------------------------------------------------------------- 2 + Copyright (c) 2025 The ocaml-cff programmers. All rights reserved. 3 + SPDX-License-Identifier: ISC 4 + ---------------------------------------------------------------------------*) 5 + 6 + (** Typed identifiers for CFF. 7 + 8 + The [identifiers] field in CFF allows listing multiple typed 9 + identifiers for a work. Each identifier has a type, value, and 10 + optional description. 11 + 12 + {1 Identifier Types} 13 + 14 + CFF supports four identifier types: 15 + 16 + - {b DOI}: Digital Object Identifier 17 + ({{:https://doi.org}doi.org}) 18 + - {b URL}: Web URL 19 + - {b SWH}: Software Heritage identifier 20 + ({{:https://www.softwareheritage.org}softwareheritage.org}) 21 + - {b Other}: Any other identifier scheme 22 + 23 + {1 Usage} 24 + 25 + The [identifiers] field is a list, allowing multiple identifiers: 26 + 27 + {[ 28 + identifiers: 29 + - type: doi 30 + value: 10.5281/zenodo.1234567 31 + description: The concept DOI for all versions 32 + 33 + - type: doi 34 + value: 10.5281/zenodo.1234568 35 + description: The DOI for version 1.0.0 36 + 37 + - type: swh 38 + value: swh:1:dir:bc286860f423ea7ced246ba7458eef4b4541cf2d 39 + description: Software Heritage archive 40 + 41 + - type: url 42 + value: https://github.com/user/project/releases/tag/v1.0.0 43 + description: Release on GitHub 44 + ]} 45 + 46 + {1 DOI vs doi Field} 47 + 48 + CFF provides two ways to specify DOIs: 49 + 50 + - The [doi] field at root level: A single, primary DOI 51 + - The [identifiers] field with [type: doi]: Multiple DOIs with descriptions 52 + 53 + Both can be used together; [identifiers] provides more detail. 54 + 55 + {1 Software Heritage} 56 + 57 + Software Heritage (SWH) provides persistent identifiers for source 58 + code. SWH identifiers follow the format: 59 + 60 + [swh:1:<object_type>:<hash>] 61 + 62 + Where object_type can be: 63 + - [cnt]: Content (file) 64 + - [dir]: Directory 65 + - [rev]: Revision (commit) 66 + - [rel]: Release 67 + - [snp]: Snapshot *) 68 + 69 + type t 70 + (** An identifier with type, value, and optional description. *) 71 + 72 + val make : 73 + type_:Cff_enums.Identifier_type.t -> 74 + value:string -> 75 + ?description:string -> 76 + unit -> t 77 + (** Create an identifier. 78 + 79 + @param type_ The identifier type ([`Doi], [`Url], [`Swh], or [`Other]) 80 + @param value The identifier value (DOI, URL, SWH ID, etc.) 81 + @param description Optional human-readable description *) 82 + 83 + val type_ : t -> Cff_enums.Identifier_type.t 84 + (** The identifier type. *) 85 + 86 + val value : t -> string 87 + (** The identifier value. 88 + 89 + For DOIs, this is just the DOI (e.g., ["10.5281/zenodo.1234567"]), 90 + not the full URL. *) 91 + 92 + val description : t -> string option 93 + (** Optional description explaining what this identifier refers to. 94 + 95 + Examples: 96 + - ["The concept DOI for all versions"] 97 + - ["Version 1.0.0 archive"] 98 + - ["Release on GitHub"] *) 99 + 100 + val equal : t -> t -> bool 101 + (** Identifier equality (compares all fields). *) 102 + 103 + val compare : t -> t -> int 104 + (** Identifier comparison. *) 105 + 106 + val pp : Format.formatter -> t -> unit 107 + (** Pretty-print as "[type]: value (description)". *) 108 + 109 + val jsont : t Jsont.t 110 + (** JSON/YAML codec for identifiers. *)
+145
project/ocaml-cff/lib/cff_license.ml
··· 1 + (*--------------------------------------------------------------------------- 2 + Copyright (c) 2025 The ocaml-cff programmers. All rights reserved. 3 + SPDX-License-Identifier: ISC 4 + ---------------------------------------------------------------------------*) 5 + 6 + (** SPDX license handling for CFF. *) 7 + 8 + module Id = struct 9 + type t = string 10 + 11 + (* Case-insensitive lookup in valid license IDs *) 12 + let uppercased_valid_ids = 13 + List.map (fun x -> (x, String.uppercase_ascii x)) Spdx_licenses.valid_license_ids 14 + 15 + let of_string s = 16 + let s_upper = String.uppercase_ascii s in 17 + match List.find_opt (fun (_, up) -> String.equal s_upper up) uppercased_valid_ids with 18 + | Some (canonical, _) -> Ok canonical 19 + | None -> Error (`Invalid_license_id s) 20 + 21 + let to_string t = t 22 + 23 + let equal = String.equal 24 + let compare = String.compare 25 + 26 + let pp ppf t = Format.pp_print_string ppf t 27 + end 28 + 29 + type t = Id.t list (* Non-empty list; multiple = OR relationship *) 30 + 31 + let single id = [id] 32 + let multiple ids = ids 33 + 34 + let ids t = t 35 + 36 + let is_single = function 37 + | [_] -> true 38 + | _ -> false 39 + 40 + let of_string s = Result.map single (Id.of_string s) 41 + 42 + let of_string_list ss = 43 + let rec aux acc = function 44 + | [] -> Ok (List.rev acc) 45 + | s :: rest -> 46 + match Id.of_string s with 47 + | Ok id -> aux (id :: acc) rest 48 + | Error e -> Error e 49 + in 50 + match ss with 51 + | [] -> Error (`Invalid_license_id "empty license list") 52 + | ss -> aux [] ss 53 + 54 + let to_string_list t = t 55 + 56 + let equal t1 t2 = 57 + List.length t1 = List.length t2 && 58 + List.for_all2 Id.equal t1 t2 59 + 60 + let compare t1 t2 = 61 + List.compare Id.compare t1 t2 62 + 63 + let pp ppf t = 64 + match t with 65 + | [id] -> Id.pp ppf id 66 + | ids -> 67 + Format.fprintf ppf "[%a]" 68 + (Format.pp_print_list ~pp_sep:(fun ppf () -> Format.fprintf ppf ", ") Id.pp) 69 + ids 70 + 71 + (* Convert to Spdx_licenses.t (OR combination) *) 72 + let to_spdx t = 73 + let rec build = function 74 + | [] -> assert false (* t is non-empty *) 75 + | [id] -> Spdx_licenses.Simple (Spdx_licenses.LicenseID id) 76 + | id :: rest -> 77 + Spdx_licenses.OR (Spdx_licenses.Simple (Spdx_licenses.LicenseID id), build rest) 78 + in 79 + build t 80 + 81 + (* Convert from Spdx_licenses.t (only simple IDs and OR combinations) *) 82 + let of_spdx spdx = 83 + let rec extract acc = function 84 + | Spdx_licenses.Simple (Spdx_licenses.LicenseID id) -> 85 + Ok (id :: acc) 86 + | Spdx_licenses.Simple (Spdx_licenses.LicenseIDPlus _) -> 87 + Error `Unsupported_expression 88 + | Spdx_licenses.Simple (Spdx_licenses.LicenseRef _) -> 89 + Error `Unsupported_expression 90 + | Spdx_licenses.WITH _ -> 91 + Error `Unsupported_expression 92 + | Spdx_licenses.AND _ -> 93 + Error `Unsupported_expression 94 + | Spdx_licenses.OR (left, right) -> 95 + Result.bind (extract acc left) (fun acc -> extract acc right) 96 + in 97 + Result.map List.rev (extract [] spdx) 98 + 99 + (* Jsont codec - handles both single string and array of strings *) 100 + let jsont = 101 + let string_codec = 102 + Jsont.string |> Jsont.map 103 + ~dec:(fun s -> 104 + match Id.of_string s with 105 + | Ok id -> [id] 106 + | Error (`Invalid_license_id s) -> 107 + Jsont.Error.msgf Jsont.Meta.none "Invalid SPDX license ID: %s" s) 108 + ~enc:(function 109 + | [id] -> id 110 + | _ -> assert false) (* Only used for single-element lists *) 111 + in 112 + let array_codec = 113 + Jsont.(array string) |> Jsont.map 114 + ~dec:(fun ss -> 115 + match of_string_list (Stdlib.Array.to_list ss) with 116 + | Ok t -> t 117 + | Error (`Invalid_license_id s) -> 118 + Jsont.Error.msgf Jsont.Meta.none "Invalid SPDX license ID: %s" s) 119 + ~enc:(fun t -> Stdlib.Array.of_list t) 120 + in 121 + Jsont.any 122 + ~dec_string:string_codec 123 + ~dec_array:array_codec 124 + ~enc:(fun t -> 125 + match t with 126 + | [_] -> string_codec 127 + | _ -> array_codec) 128 + () 129 + 130 + (* Lenient codec that accepts any string/array without validation *) 131 + let jsont_lenient = 132 + let string_codec = 133 + Jsont.string |> Jsont.map ~dec:(fun s -> [s]) ~enc:(function [s] -> s | _ -> assert false) 134 + in 135 + let array_codec = 136 + Jsont.(array string) |> Jsont.map ~dec:(fun ss -> Stdlib.Array.to_list ss) ~enc:(fun t -> Stdlib.Array.of_list t) 137 + in 138 + Jsont.any 139 + ~dec_string:string_codec 140 + ~dec_array:array_codec 141 + ~enc:(fun t -> 142 + match t with 143 + | [_] -> string_codec 144 + | _ -> array_codec) 145 + ()
+159
project/ocaml-cff/lib/cff_license.mli
··· 1 + (*--------------------------------------------------------------------------- 2 + Copyright (c) 2025 The ocaml-cff programmers. All rights reserved. 3 + SPDX-License-Identifier: ISC 4 + ---------------------------------------------------------------------------*) 5 + 6 + (** SPDX license identifiers for CFF. 7 + 8 + CFF uses {{:https://spdx.org/licenses/}SPDX license identifiers} 9 + for the [license] field. SPDX provides a standardized list of 10 + open source license identifiers. 11 + 12 + {1 License Field} 13 + 14 + The [license] field can be a single license identifier like ["MIT"], 15 + or a list of licenses with OR relationship like ["GPL-3.0-only"] and 16 + ["MIT"] together. 17 + 18 + When multiple licenses are listed, it means the user may choose 19 + {b any one} of the listed licenses. This matches the SPDX OR 20 + semantics. 21 + 22 + {1 Examples} 23 + 24 + {2 Single License} 25 + 26 + {[ 27 + cff-version: "1.2.0" 28 + title: "My Project" 29 + license: MIT 30 + ]} 31 + 32 + {2 Multiple Licenses (OR)} 33 + 34 + {[ 35 + cff-version: "1.2.0" 36 + title: "My Project" 37 + license: 38 + - Apache-2.0 39 + - MIT 40 + ]} 41 + 42 + This means the software is available under Apache-2.0 OR MIT. 43 + 44 + {1 Common License IDs} 45 + 46 + Some commonly used SPDX license identifiers: 47 + 48 + - [MIT] - MIT License 49 + - [Apache-2.0] - Apache License 2.0 50 + - [GPL-3.0-only] - GNU General Public License v3.0 only 51 + - [GPL-3.0-or-later] - GNU GPL v3.0 or later 52 + - [BSD-2-Clause] - BSD 2-Clause "Simplified" License 53 + - [BSD-3-Clause] - BSD 3-Clause "New" License 54 + - [ISC] - ISC License 55 + - [MPL-2.0] - Mozilla Public License 2.0 56 + - [LGPL-3.0-only] - GNU Lesser GPL v3.0 57 + - [CC-BY-4.0] - Creative Commons Attribution 4.0 58 + 59 + {1 Deprecated IDs} 60 + 61 + Some older license identifiers are deprecated in SPDX: 62 + 63 + - [GPL-2.0] should use [GPL-2.0-only] or [GPL-2.0-or-later] 64 + - [GPL-3.0] should use [GPL-3.0-only] or [GPL-3.0-or-later] 65 + - [LGPL-2.1] should use [LGPL-2.1-only] or [LGPL-2.1-or-later] 66 + 67 + The {!jsont_lenient} codec accepts these deprecated IDs. *) 68 + 69 + (** A validated SPDX license identifier. *) 70 + module Id : sig 71 + type t 72 + (** A single validated SPDX license ID. *) 73 + 74 + val of_string : string -> (t, [> `Invalid_license_id of string]) result 75 + (** Parse and validate a license ID. 76 + 77 + The check is case-insensitive. Returns [Error] for unknown 78 + license identifiers. *) 79 + 80 + val to_string : t -> string 81 + (** Return the canonical (properly cased) license ID string. *) 82 + 83 + val equal : t -> t -> bool 84 + val compare : t -> t -> int 85 + 86 + val pp : Format.formatter -> t -> unit 87 + (** Pretty-print the license ID. *) 88 + end 89 + 90 + type t 91 + (** A CFF license: one or more SPDX license IDs. 92 + 93 + Multiple IDs represent an OR relationship: the user may choose 94 + any of the listed licenses. *) 95 + 96 + val single : Id.t -> t 97 + (** Create a license from a single ID. *) 98 + 99 + val multiple : Id.t list -> t 100 + (** Create a license from multiple IDs (OR relationship). 101 + 102 + Raises [Invalid_argument] if the list is empty. *) 103 + 104 + val ids : t -> Id.t list 105 + (** Get the list of license IDs. 106 + 107 + For a single license, returns a one-element list. *) 108 + 109 + val is_single : t -> bool 110 + (** [true] if this is a single license ID, [false] for multiple. *) 111 + 112 + val of_string : string -> (t, [> `Invalid_license_id of string]) result 113 + (** Parse a single license ID string into a license. 114 + 115 + Equivalent to [Result.map single (Id.of_string s)]. *) 116 + 117 + val of_string_list : string list -> (t, [> `Invalid_license_id of string]) result 118 + (** Parse a list of license ID strings. 119 + 120 + All IDs must be valid; returns [Error] if any ID is invalid. *) 121 + 122 + val to_string_list : t -> string list 123 + (** Return the list of license ID strings. *) 124 + 125 + val equal : t -> t -> bool 126 + (** License equality. *) 127 + 128 + val compare : t -> t -> int 129 + (** License comparison. *) 130 + 131 + val pp : Format.formatter -> t -> unit 132 + (** Pretty-print: single ID or comma-separated list for multiple. *) 133 + 134 + (** {1 SPDX Interop} *) 135 + 136 + val to_spdx : t -> Spdx_licenses.t 137 + (** Convert to an SPDX license expression (OR combination). *) 138 + 139 + val of_spdx : Spdx_licenses.t -> (t, [> `Unsupported_expression]) result 140 + (** Convert from an SPDX license expression. 141 + 142 + Only simple license IDs and OR combinations are supported. 143 + Complex expressions using AND, WITH (exceptions), or license 144 + references return [Error `Unsupported_expression]. *) 145 + 146 + (** {1 Codecs} *) 147 + 148 + val jsont : t Jsont.t 149 + (** JSON/YAML codec that validates license IDs. 150 + 151 + Handles both single string (["MIT"]) and array of strings. 152 + Returns an error for invalid SPDX license identifiers. *) 153 + 154 + val jsont_lenient : t Jsont.t 155 + (** JSON/YAML codec that accepts any string without validation. 156 + 157 + Use this codec when parsing CFF files that may contain deprecated 158 + or non-standard license identifiers. Invalid IDs are preserved 159 + as-is for round-tripping. *)
+597
project/ocaml-cff/lib/cff_reference.ml
··· 1 + (*--------------------------------------------------------------------------- 2 + Copyright (c) 2025 The ocaml-cff programmers. All rights reserved. 3 + SPDX-License-Identifier: ISC 4 + ---------------------------------------------------------------------------*) 5 + 6 + (** Reference type for CFF with logical sub-records. *) 7 + 8 + (** Core identity of a reference. *) 9 + module Core = struct 10 + type t = { 11 + type_ : Cff_enums.Reference_type.t; 12 + title : string; 13 + authors : Cff_author.t list; 14 + abstract : string option; 15 + abbreviation : string option; 16 + } 17 + 18 + let make ~type_ ~title ~authors ?abstract ?abbreviation () = 19 + { type_; title; authors; abstract; abbreviation } 20 + 21 + let type_ t = t.type_ 22 + let title t = t.title 23 + let authors t = t.authors 24 + let abstract t = t.abstract 25 + let abbreviation t = t.abbreviation 26 + 27 + let pp ppf t = 28 + Format.fprintf ppf "%s (%a)" 29 + t.title Cff_enums.Reference_type.pp t.type_ 30 + end 31 + 32 + (** Publication information (journal, volume, pages, etc.). *) 33 + module Publication = struct 34 + type t = { 35 + journal : string option; 36 + volume : string option; 37 + issue : string option; 38 + pages : string option; 39 + start : string option; 40 + end_ : string option; 41 + edition : string option; 42 + section : string option; 43 + status : Cff_enums.Status.t option; 44 + } 45 + 46 + let empty = { 47 + journal = None; volume = None; issue = None; pages = None; 48 + start = None; end_ = None; edition = None; section = None; 49 + status = None; 50 + } 51 + 52 + let make ?journal ?volume ?issue ?pages ?start ?end_ ?edition 53 + ?section ?status () = 54 + { journal; volume; issue; pages; start; end_; edition; section; status } 55 + 56 + let journal t = t.journal 57 + let volume t = t.volume 58 + let issue t = t.issue 59 + let pages t = t.pages 60 + let start t = t.start 61 + let end_ t = t.end_ 62 + let edition t = t.edition 63 + let section t = t.section 64 + let status t = t.status 65 + 66 + let is_empty t = 67 + t.journal = None && t.volume = None && t.issue = None && 68 + t.pages = None && t.start = None && t.end_ = None && 69 + t.edition = None && t.section = None && t.status = None 70 + end 71 + 72 + (** Collection information (proceedings, book series, etc.). *) 73 + module Collection = struct 74 + type t = { 75 + collection_title : string option; 76 + collection_type : string option; 77 + collection_doi : string option; 78 + volume_title : string option; 79 + number_volumes : string option; 80 + } 81 + 82 + let empty = { 83 + collection_title = None; collection_type = None; 84 + collection_doi = None; volume_title = None; number_volumes = None; 85 + } 86 + 87 + let make ?collection_title ?collection_type ?collection_doi 88 + ?volume_title ?number_volumes () = 89 + { collection_title; collection_type; collection_doi; 90 + volume_title; number_volumes } 91 + 92 + let collection_title t = t.collection_title 93 + let collection_type t = t.collection_type 94 + let collection_doi t = t.collection_doi 95 + let volume_title t = t.volume_title 96 + let number_volumes t = t.number_volumes 97 + 98 + let is_empty t = 99 + t.collection_title = None && t.collection_type = None && 100 + t.collection_doi = None && t.volume_title = None && 101 + t.number_volumes = None 102 + end 103 + 104 + (** Date information. *) 105 + module Dates = struct 106 + type t = { 107 + date_accessed : Cff_date.t option; 108 + date_downloaded : Cff_date.t option; 109 + date_published : Cff_date.t option; 110 + date_released : Cff_date.t option; 111 + year : int option; 112 + year_original : int option; 113 + month : int option; 114 + issue_date : string option; 115 + } 116 + 117 + let empty = { 118 + date_accessed = None; date_downloaded = None; 119 + date_published = None; date_released = None; 120 + year = None; year_original = None; month = None; issue_date = None; 121 + } 122 + 123 + let make ?date_accessed ?date_downloaded ?date_published ?date_released 124 + ?year ?year_original ?month ?issue_date () = 125 + { date_accessed; date_downloaded; date_published; date_released; 126 + year; year_original; month; issue_date } 127 + 128 + let date_accessed t = t.date_accessed 129 + let date_downloaded t = t.date_downloaded 130 + let date_published t = t.date_published 131 + let date_released t = t.date_released 132 + let year t = t.year 133 + let year_original t = t.year_original 134 + let month t = t.month 135 + let issue_date t = t.issue_date 136 + 137 + let is_empty t = 138 + t.date_accessed = None && t.date_downloaded = None && 139 + t.date_published = None && t.date_released = None && 140 + t.year = None && t.year_original = None && 141 + t.month = None && t.issue_date = None 142 + end 143 + 144 + (** Identifiers and links. *) 145 + module Identifiers = struct 146 + type t = { 147 + doi : string option; 148 + url : string option; 149 + repository : string option; 150 + repository_code : string option; 151 + repository_artifact : string option; 152 + isbn : string option; 153 + issn : string option; 154 + pmcid : string option; 155 + nihmsid : string option; 156 + identifiers : Cff_identifier.t list option; 157 + } 158 + 159 + let empty = { 160 + doi = None; url = None; repository = None; 161 + repository_code = None; repository_artifact = None; 162 + isbn = None; issn = None; pmcid = None; nihmsid = None; 163 + identifiers = None; 164 + } 165 + 166 + let make ?doi ?url ?repository ?repository_code ?repository_artifact 167 + ?isbn ?issn ?pmcid ?nihmsid ?identifiers () = 168 + { doi; url; repository; repository_code; repository_artifact; 169 + isbn; issn; pmcid; nihmsid; identifiers } 170 + 171 + let doi t = t.doi 172 + let url t = t.url 173 + let repository t = t.repository 174 + let repository_code t = t.repository_code 175 + let repository_artifact t = t.repository_artifact 176 + let isbn t = t.isbn 177 + let issn t = t.issn 178 + let pmcid t = t.pmcid 179 + let nihmsid t = t.nihmsid 180 + let identifiers t = t.identifiers 181 + 182 + let is_empty t = 183 + t.doi = None && t.url = None && t.repository = None && 184 + t.repository_code = None && t.repository_artifact = None && 185 + t.isbn = None && t.issn = None && t.pmcid = None && 186 + t.nihmsid = None && t.identifiers = None 187 + end 188 + 189 + (** Related entities (editors, publisher, etc.). *) 190 + module Entities = struct 191 + type t = { 192 + editors : Cff_author.t list option; 193 + editors_series : Cff_author.t list option; 194 + translators : Cff_author.t list option; 195 + recipients : Cff_author.t list option; 196 + senders : Cff_author.t list option; 197 + contact : Cff_author.t list option; 198 + publisher : Cff_author.Entity.t option; 199 + institution : Cff_author.Entity.t option; 200 + conference : Cff_author.Entity.t option; 201 + database_provider : Cff_author.Entity.t option; 202 + location : Cff_author.Entity.t option; 203 + } 204 + 205 + let empty = { 206 + editors = None; editors_series = None; translators = None; 207 + recipients = None; senders = None; contact = None; 208 + publisher = None; institution = None; conference = None; 209 + database_provider = None; location = None; 210 + } 211 + 212 + let make ?editors ?editors_series ?translators ?recipients ?senders 213 + ?contact ?publisher ?institution ?conference ?database_provider 214 + ?location () = 215 + { editors; editors_series; translators; recipients; senders; 216 + contact; publisher; institution; conference; database_provider; 217 + location } 218 + 219 + let editors t = t.editors 220 + let editors_series t = t.editors_series 221 + let translators t = t.translators 222 + let recipients t = t.recipients 223 + let senders t = t.senders 224 + let contact t = t.contact 225 + let publisher t = t.publisher 226 + let institution t = t.institution 227 + let conference t = t.conference 228 + let database_provider t = t.database_provider 229 + let location t = t.location 230 + 231 + let is_empty t = 232 + t.editors = None && t.editors_series = None && t.translators = None && 233 + t.recipients = None && t.senders = None && t.contact = None && 234 + t.publisher = None && t.institution = None && t.conference = None && 235 + t.database_provider = None && t.location = None 236 + end 237 + 238 + (** Metadata and description. *) 239 + module Metadata = struct 240 + type t = { 241 + keywords : string list option; 242 + languages : string list option; 243 + license : Cff_license.t option; 244 + license_url : string option; 245 + copyright : string option; 246 + scope : string option; 247 + notes : string option; 248 + } 249 + 250 + let empty = { 251 + keywords = None; languages = None; license = None; 252 + license_url = None; copyright = None; scope = None; notes = None; 253 + } 254 + 255 + let make ?keywords ?languages ?license ?license_url ?copyright 256 + ?scope ?notes () = 257 + { keywords; languages; license; license_url; copyright; scope; notes } 258 + 259 + let keywords t = t.keywords 260 + let languages t = t.languages 261 + let license t = t.license 262 + let license_url t = t.license_url 263 + let copyright t = t.copyright 264 + let scope t = t.scope 265 + let notes t = t.notes 266 + 267 + let is_empty t = 268 + t.keywords = None && t.languages = None && t.license = None && 269 + t.license_url = None && t.copyright = None && 270 + t.scope = None && t.notes = None 271 + end 272 + 273 + (** Technical and domain-specific fields. *) 274 + module Technical = struct 275 + type t = { 276 + commit : string option; 277 + version : string option; 278 + filename : string option; 279 + format : string option; 280 + medium : string option; 281 + data_type : string option; 282 + database : string option; 283 + number : string option; 284 + patent_states : string list option; 285 + thesis_type : string option; 286 + term : string option; 287 + entry : string option; 288 + department : string option; 289 + loc_start : string option; 290 + loc_end : string option; 291 + } 292 + 293 + let empty = { 294 + commit = None; version = None; filename = None; format = None; 295 + medium = None; data_type = None; database = None; number = None; 296 + patent_states = None; thesis_type = None; term = None; entry = None; 297 + department = None; loc_start = None; loc_end = None; 298 + } 299 + 300 + let make ?commit ?version ?filename ?format ?medium ?data_type 301 + ?database ?number ?patent_states ?thesis_type ?term ?entry 302 + ?department ?loc_start ?loc_end () = 303 + { commit; version; filename; format; medium; data_type; database; 304 + number; patent_states; thesis_type; term; entry; department; 305 + loc_start; loc_end } 306 + 307 + let commit t = t.commit 308 + let version t = t.version 309 + let filename t = t.filename 310 + let format t = t.format 311 + let medium t = t.medium 312 + let data_type t = t.data_type 313 + let database t = t.database 314 + let number t = t.number 315 + let patent_states t = t.patent_states 316 + let thesis_type t = t.thesis_type 317 + let term t = t.term 318 + let entry t = t.entry 319 + let department t = t.department 320 + let loc_start t = t.loc_start 321 + let loc_end t = t.loc_end 322 + 323 + let is_empty t = 324 + t.commit = None && t.version = None && t.filename = None && 325 + t.format = None && t.medium = None && t.data_type = None && 326 + t.database = None && t.number = None && t.patent_states = None && 327 + t.thesis_type = None && t.term = None && t.entry = None && 328 + t.department = None && t.loc_start = None && t.loc_end = None 329 + end 330 + 331 + (** Complete reference type. *) 332 + type t = { 333 + core : Core.t; 334 + publication : Publication.t; 335 + collection : Collection.t; 336 + dates : Dates.t; 337 + identifiers : Identifiers.t; 338 + entities : Entities.t; 339 + metadata : Metadata.t; 340 + technical : Technical.t; 341 + } 342 + 343 + let make ~core 344 + ?(publication = Publication.empty) 345 + ?(collection = Collection.empty) 346 + ?(dates = Dates.empty) 347 + ?(identifiers = Identifiers.empty) 348 + ?(entities = Entities.empty) 349 + ?(metadata = Metadata.empty) 350 + ?(technical = Technical.empty) 351 + () = 352 + { core; publication; collection; dates; identifiers; 353 + entities; metadata; technical } 354 + 355 + let make_simple ~type_ ~title ~authors ?doi ?year ?journal () = 356 + let core = Core.make ~type_ ~title ~authors () in 357 + let publication = Publication.make ?journal () in 358 + let dates = Dates.make ?year () in 359 + let identifiers = Identifiers.make ?doi () in 360 + make ~core ~publication ~dates ~identifiers () 361 + 362 + (* Accessors for sub-records *) 363 + let core t = t.core 364 + let publication t = t.publication 365 + let collection t = t.collection 366 + let dates t = t.dates 367 + let identifiers t = t.identifiers 368 + let entities t = t.entities 369 + let metadata t = t.metadata 370 + let technical t = t.technical 371 + 372 + (* Direct accessors for common fields *) 373 + let type_ t = Core.type_ t.core 374 + let title t = Core.title t.core 375 + let authors t = Core.authors t.core 376 + let doi t = Identifiers.doi t.identifiers 377 + let year t = Dates.year t.dates 378 + 379 + let pp ppf t = 380 + Core.pp ppf t.core 381 + 382 + (* Helper for string that can also be int (for pages, etc.) *) 383 + let string_or_int_jsont = 384 + Jsont.any 385 + ~dec_number:(Jsont.number |> Jsont.map 386 + ~dec:(fun f -> string_of_int (int_of_float f)) 387 + ~enc:float_of_string) 388 + ~dec_string:Jsont.string 389 + ~enc:(fun s -> 390 + match float_of_string_opt s with 391 + | Some _ -> Jsont.number |> Jsont.map ~dec:(fun _ -> assert false) ~enc:float_of_string 392 + | None -> Jsont.string) 393 + () 394 + 395 + (* Jsont codec for the full reference type *) 396 + let jsont = 397 + (* Helper to convert array jsont to list jsont *) 398 + let list_jsont elt = 399 + Jsont.(array elt |> map 400 + ~dec:(fun arr -> Stdlib.Array.to_list arr) 401 + ~enc:(fun lst -> Stdlib.Array.of_list lst)) 402 + in 403 + let authors_list_jsont = list_jsont Cff_author.jsont in 404 + let identifiers_list_jsont = list_jsont Cff_identifier.jsont in 405 + let string_list_jsont = list_jsont Jsont.string in 406 + (* We need to decode all 60+ fields and then group into sub-records *) 407 + Jsont.Object.map ~kind:"Reference" 408 + (fun type_ title authors abstract abbreviation 409 + (* Publication *) 410 + journal volume issue pages start end_ edition section status 411 + (* Collection *) 412 + collection_title collection_type collection_doi volume_title number_volumes 413 + (* Dates *) 414 + date_accessed date_downloaded date_published date_released 415 + year year_original month issue_date 416 + (* Identifiers *) 417 + doi url repository repository_code repository_artifact 418 + isbn issn pmcid nihmsid identifiers_list 419 + (* Entities *) 420 + editors editors_series translators recipients senders contact 421 + publisher institution conference database_provider location_entity 422 + (* Metadata *) 423 + keywords languages license license_url copyright scope notes 424 + (* Technical *) 425 + commit version filename format medium data_type database 426 + number patent_states thesis_type term entry department 427 + loc_start loc_end -> 428 + let core = { Core.type_; title; authors; abstract; abbreviation } in 429 + let publication = { Publication.journal; volume; issue; pages; 430 + start; end_; edition; section; status } in 431 + let collection = { Collection.collection_title; collection_type; 432 + collection_doi; volume_title; number_volumes } in 433 + let dates = { Dates.date_accessed; date_downloaded; date_published; 434 + date_released; year; year_original; month; issue_date } in 435 + let identifiers = { Identifiers.doi; url; repository; repository_code; 436 + repository_artifact; isbn; issn; pmcid; nihmsid; 437 + identifiers = identifiers_list } in 438 + let entities = { Entities.editors; editors_series; translators; 439 + recipients; senders; contact; publisher; institution; 440 + conference; database_provider; location = location_entity } in 441 + let metadata = { Metadata.keywords; languages; license; license_url; 442 + copyright; scope; notes } in 443 + let technical = { Technical.commit; version; filename; format; medium; 444 + data_type; database; number; patent_states; thesis_type; 445 + term; entry; department; loc_start; loc_end } in 446 + { core; publication; collection; dates; identifiers; 447 + entities; metadata; technical }) 448 + (* Core fields *) 449 + |> Jsont.Object.mem "type" Cff_enums.Reference_type.jsont 450 + ~enc:(fun r -> r.core.type_) 451 + |> Jsont.Object.mem "title" Jsont.string 452 + ~enc:(fun r -> r.core.title) 453 + |> Jsont.Object.mem "authors" authors_list_jsont 454 + ~enc:(fun r -> r.core.authors) 455 + |> Jsont.Object.opt_mem "abstract" Jsont.string 456 + ~enc:(fun r -> r.core.abstract) 457 + |> Jsont.Object.opt_mem "abbreviation" Jsont.string 458 + ~enc:(fun r -> r.core.abbreviation) 459 + (* Publication fields *) 460 + |> Jsont.Object.opt_mem "journal" Jsont.string 461 + ~enc:(fun r -> r.publication.journal) 462 + |> Jsont.Object.opt_mem "volume" string_or_int_jsont 463 + ~enc:(fun r -> r.publication.volume) 464 + |> Jsont.Object.opt_mem "issue" string_or_int_jsont 465 + ~enc:(fun r -> r.publication.issue) 466 + |> Jsont.Object.opt_mem "pages" string_or_int_jsont 467 + ~enc:(fun r -> r.publication.pages) 468 + |> Jsont.Object.opt_mem "start" string_or_int_jsont 469 + ~enc:(fun r -> r.publication.start) 470 + |> Jsont.Object.opt_mem "end" string_or_int_jsont 471 + ~enc:(fun r -> r.publication.end_) 472 + |> Jsont.Object.opt_mem "edition" Jsont.string 473 + ~enc:(fun r -> r.publication.edition) 474 + |> Jsont.Object.opt_mem "section" string_or_int_jsont 475 + ~enc:(fun r -> r.publication.section) 476 + |> Jsont.Object.opt_mem "status" Cff_enums.Status.jsont 477 + ~enc:(fun r -> r.publication.status) 478 + (* Collection fields *) 479 + |> Jsont.Object.opt_mem "collection-title" Jsont.string 480 + ~enc:(fun r -> r.collection.collection_title) 481 + |> Jsont.Object.opt_mem "collection-type" Jsont.string 482 + ~enc:(fun r -> r.collection.collection_type) 483 + |> Jsont.Object.opt_mem "collection-doi" Jsont.string 484 + ~enc:(fun r -> r.collection.collection_doi) 485 + |> Jsont.Object.opt_mem "volume-title" Jsont.string 486 + ~enc:(fun r -> r.collection.volume_title) 487 + |> Jsont.Object.opt_mem "number-volumes" string_or_int_jsont 488 + ~enc:(fun r -> r.collection.number_volumes) 489 + (* Date fields *) 490 + |> Jsont.Object.opt_mem "date-accessed" Cff_date.jsont 491 + ~enc:(fun r -> r.dates.date_accessed) 492 + |> Jsont.Object.opt_mem "date-downloaded" Cff_date.jsont 493 + ~enc:(fun r -> r.dates.date_downloaded) 494 + |> Jsont.Object.opt_mem "date-published" Cff_date.jsont 495 + ~enc:(fun r -> r.dates.date_published) 496 + |> Jsont.Object.opt_mem "date-released" Cff_date.jsont 497 + ~enc:(fun r -> r.dates.date_released) 498 + |> Jsont.Object.opt_mem "year" Jsont.int 499 + ~enc:(fun r -> r.dates.year) 500 + |> Jsont.Object.opt_mem "year-original" Jsont.int 501 + ~enc:(fun r -> r.dates.year_original) 502 + |> Jsont.Object.opt_mem "month" Jsont.int 503 + ~enc:(fun r -> r.dates.month) 504 + |> Jsont.Object.opt_mem "issue-date" Jsont.string 505 + ~enc:(fun r -> r.dates.issue_date) 506 + (* Identifier fields *) 507 + |> Jsont.Object.opt_mem "doi" Jsont.string 508 + ~enc:(fun r -> r.identifiers.doi) 509 + |> Jsont.Object.opt_mem "url" Jsont.string 510 + ~enc:(fun r -> r.identifiers.url) 511 + |> Jsont.Object.opt_mem "repository" Jsont.string 512 + ~enc:(fun r -> r.identifiers.repository) 513 + |> Jsont.Object.opt_mem "repository-code" Jsont.string 514 + ~enc:(fun r -> r.identifiers.repository_code) 515 + |> Jsont.Object.opt_mem "repository-artifact" Jsont.string 516 + ~enc:(fun r -> r.identifiers.repository_artifact) 517 + |> Jsont.Object.opt_mem "isbn" Jsont.string 518 + ~enc:(fun r -> r.identifiers.isbn) 519 + |> Jsont.Object.opt_mem "issn" string_or_int_jsont 520 + ~enc:(fun r -> r.identifiers.issn) 521 + |> Jsont.Object.opt_mem "pmcid" Jsont.string 522 + ~enc:(fun r -> r.identifiers.pmcid) 523 + |> Jsont.Object.opt_mem "nihmsid" Jsont.string 524 + ~enc:(fun r -> r.identifiers.nihmsid) 525 + |> Jsont.Object.opt_mem "identifiers" identifiers_list_jsont 526 + ~enc:(fun r -> r.identifiers.identifiers) 527 + (* Entity fields *) 528 + |> Jsont.Object.opt_mem "editors" authors_list_jsont 529 + ~enc:(fun r -> r.entities.editors) 530 + |> Jsont.Object.opt_mem "editors-series" authors_list_jsont 531 + ~enc:(fun r -> r.entities.editors_series) 532 + |> Jsont.Object.opt_mem "translators" authors_list_jsont 533 + ~enc:(fun r -> r.entities.translators) 534 + |> Jsont.Object.opt_mem "recipients" authors_list_jsont 535 + ~enc:(fun r -> r.entities.recipients) 536 + |> Jsont.Object.opt_mem "senders" authors_list_jsont 537 + ~enc:(fun r -> r.entities.senders) 538 + |> Jsont.Object.opt_mem "contact" authors_list_jsont 539 + ~enc:(fun r -> r.entities.contact) 540 + |> Jsont.Object.opt_mem "publisher" Cff_author.Entity.jsont 541 + ~enc:(fun r -> r.entities.publisher) 542 + |> Jsont.Object.opt_mem "institution" Cff_author.Entity.jsont 543 + ~enc:(fun r -> r.entities.institution) 544 + |> Jsont.Object.opt_mem "conference" Cff_author.Entity.jsont 545 + ~enc:(fun r -> r.entities.conference) 546 + |> Jsont.Object.opt_mem "database-provider" Cff_author.Entity.jsont 547 + ~enc:(fun r -> r.entities.database_provider) 548 + |> Jsont.Object.opt_mem "location" Cff_author.Entity.jsont 549 + ~enc:(fun r -> r.entities.location) 550 + (* Metadata fields *) 551 + |> Jsont.Object.opt_mem "keywords" string_list_jsont 552 + ~enc:(fun r -> r.metadata.keywords) 553 + |> Jsont.Object.opt_mem "languages" string_list_jsont 554 + ~enc:(fun r -> r.metadata.languages) 555 + |> Jsont.Object.opt_mem "license" Cff_license.jsont_lenient 556 + ~enc:(fun r -> r.metadata.license) 557 + |> Jsont.Object.opt_mem "license-url" Jsont.string 558 + ~enc:(fun r -> r.metadata.license_url) 559 + |> Jsont.Object.opt_mem "copyright" Jsont.string 560 + ~enc:(fun r -> r.metadata.copyright) 561 + |> Jsont.Object.opt_mem "scope" Jsont.string 562 + ~enc:(fun r -> r.metadata.scope) 563 + |> Jsont.Object.opt_mem "notes" Jsont.string 564 + ~enc:(fun r -> r.metadata.notes) 565 + (* Technical fields *) 566 + |> Jsont.Object.opt_mem "commit" Jsont.string 567 + ~enc:(fun r -> r.technical.commit) 568 + |> Jsont.Object.opt_mem "version" string_or_int_jsont 569 + ~enc:(fun r -> r.technical.version) 570 + |> Jsont.Object.opt_mem "filename" Jsont.string 571 + ~enc:(fun r -> r.technical.filename) 572 + |> Jsont.Object.opt_mem "format" Jsont.string 573 + ~enc:(fun r -> r.technical.format) 574 + |> Jsont.Object.opt_mem "medium" Jsont.string 575 + ~enc:(fun r -> r.technical.medium) 576 + |> Jsont.Object.opt_mem "data-type" Jsont.string 577 + ~enc:(fun r -> r.technical.data_type) 578 + |> Jsont.Object.opt_mem "database" Jsont.string 579 + ~enc:(fun r -> r.technical.database) 580 + |> Jsont.Object.opt_mem "number" string_or_int_jsont 581 + ~enc:(fun r -> r.technical.number) 582 + |> Jsont.Object.opt_mem "patent-states" string_list_jsont 583 + ~enc:(fun r -> r.technical.patent_states) 584 + |> Jsont.Object.opt_mem "thesis-type" Jsont.string 585 + ~enc:(fun r -> r.technical.thesis_type) 586 + |> Jsont.Object.opt_mem "term" Jsont.string 587 + ~enc:(fun r -> r.technical.term) 588 + |> Jsont.Object.opt_mem "entry" Jsont.string 589 + ~enc:(fun r -> r.technical.entry) 590 + |> Jsont.Object.opt_mem "department" Jsont.string 591 + ~enc:(fun r -> r.technical.department) 592 + |> Jsont.Object.opt_mem "loc-start" string_or_int_jsont 593 + ~enc:(fun r -> r.technical.loc_start) 594 + |> Jsont.Object.opt_mem "loc-end" string_or_int_jsont 595 + ~enc:(fun r -> r.technical.loc_end) 596 + |> Jsont.Object.skip_unknown 597 + |> Jsont.Object.finish
+578
project/ocaml-cff/lib/cff_reference.mli
··· 1 + (*--------------------------------------------------------------------------- 2 + Copyright (c) 2025 The ocaml-cff programmers. All rights reserved. 3 + SPDX-License-Identifier: ISC 4 + ---------------------------------------------------------------------------*) 5 + 6 + (** Bibliographic reference type for CFF. 7 + 8 + References represent citable works in the [references] and 9 + [preferred-citation] fields of a CFF file. They can describe any 10 + type of scholarly output: journal articles, books, conference papers, 11 + software, datasets, theses, patents, and many more. 12 + 13 + {1 Structure} 14 + 15 + CFF references have 60+ possible fields. This module organizes them 16 + into logical sub-records for easier manipulation: 17 + 18 + - {!Core} - Required fields: type, title, authors 19 + - {!Publication} - Journal articles: journal, volume, issue, pages 20 + - {!Collection} - Book chapters, proceedings: collection title, DOI 21 + - {!Dates} - When the work was published, accessed, etc. 22 + - {!Identifiers} - DOI, URL, ISBN, ISSN, repository links 23 + - {!Entities} - Editors, publisher, institution, conference 24 + - {!Metadata} - Keywords, license, languages, copyright 25 + - {!Technical} - Software-specific: commit, version, format 26 + 27 + {1 Reference Types} 28 + 29 + The [type] field determines what kind of work is being referenced. 30 + CFF 1.2.0 supports 40+ types including: 31 + 32 + - Academic: [`Article], [`Book], [`Conference_paper], [`Thesis] 33 + - Software: [`Software], [`Software_code], [`Software_container] 34 + - Data: [`Data], [`Database], [`Dataset] 35 + - Legal: [`Patent], [`Legal_case], [`Statute] 36 + - Media: [`Video], [`Sound_recording], [`Film_broadcast] 37 + 38 + {1 Example} 39 + 40 + {[ 41 + (* A journal article reference *) 42 + let article = Cff_reference.make_simple 43 + ~type_:`Article 44 + ~title:"The Software Citation Principles" 45 + ~authors:[ 46 + Cff_author.Person (Cff_author.Person.make 47 + ~family_names:"Smith" 48 + ~given_names:"Arfon M." 49 + ()); 50 + ] 51 + ~doi:"10.7717/peerj-cs.86" 52 + ~year:2016 53 + ~journal:"PeerJ Computer Science" 54 + () 55 + 56 + (* A software reference with more details *) 57 + let core = Cff_reference.Core.make 58 + ~type_:`Software 59 + ~title:"NumPy" 60 + ~authors:[...] 61 + () in 62 + let dates = Cff_reference.Dates.make ~year:2020 () in 63 + let ids = Cff_reference.Identifiers.make 64 + ~doi:"10.1038/s41586-020-2649-2" 65 + ~url:"https://numpy.org" 66 + () in 67 + let software = Cff_reference.make ~core ~dates ~identifiers:ids () 68 + ]} 69 + 70 + {1 Sub-records} *) 71 + 72 + (** Core identity fields (required for all references). 73 + 74 + Every reference must have a type, title, and at least one author. 75 + The type determines what additional fields are relevant. *) 76 + module Core : sig 77 + type t 78 + 79 + val make : 80 + type_:Cff_enums.Reference_type.t -> 81 + title:string -> 82 + authors:Cff_author.t list -> 83 + ?abstract:string -> 84 + ?abbreviation:string -> 85 + unit -> t 86 + (** Create a core record. 87 + 88 + @param type_ The reference type (article, book, software, etc.) 89 + @param title The title of the work 90 + @param authors List of persons and/or entities *) 91 + 92 + val type_ : t -> Cff_enums.Reference_type.t 93 + (** The reference type. Determines which other fields are applicable. *) 94 + 95 + val title : t -> string 96 + (** The title of the referenced work. *) 97 + 98 + val authors : t -> Cff_author.t list 99 + (** The authors/creators of the work. *) 100 + 101 + val abstract : t -> string option 102 + (** A description or abstract of the work. *) 103 + 104 + val abbreviation : t -> string option 105 + (** Abbreviated form of the title (e.g., for journal names). *) 106 + 107 + val pp : Format.formatter -> t -> unit 108 + end 109 + 110 + (** Publication metadata for journal articles and periodicals. 111 + 112 + Fields for works published in journals, magazines, or other 113 + serial publications. Page numbers can be specified as a range 114 + ([pages]) or as separate [start] and [end_] values. *) 115 + module Publication : sig 116 + type t 117 + 118 + val empty : t 119 + (** Empty publication record with all fields as [None]. *) 120 + 121 + val make : 122 + ?journal:string -> 123 + ?volume:string -> 124 + ?issue:string -> 125 + ?pages:string -> 126 + ?start:string -> 127 + ?end_:string -> 128 + ?edition:string -> 129 + ?section:string -> 130 + ?status:Cff_enums.Status.t -> 131 + unit -> t 132 + 133 + val journal : t -> string option 134 + (** The name of the journal or magazine. *) 135 + 136 + val volume : t -> string option 137 + (** The volume number of the journal. *) 138 + 139 + val issue : t -> string option 140 + (** The issue number within the volume. *) 141 + 142 + val pages : t -> string option 143 + (** Page range (e.g., ["123-145"]). Alternative to [start]/[end_]. *) 144 + 145 + val start : t -> string option 146 + (** Starting page number. *) 147 + 148 + val end_ : t -> string option 149 + (** Ending page number. *) 150 + 151 + val edition : t -> string option 152 + (** The edition of the work (e.g., ["2nd edition"]). *) 153 + 154 + val section : t -> string option 155 + (** The section of a work (e.g., newspaper section). *) 156 + 157 + val status : t -> Cff_enums.Status.t option 158 + (** Publication status: preprint, in-press, submitted, etc. *) 159 + 160 + val is_empty : t -> bool 161 + (** [true] if all fields are [None]. *) 162 + end 163 + 164 + (** Collection metadata for works in edited volumes. 165 + 166 + Used for book chapters, conference proceedings, and other works 167 + that appear within a larger collection. *) 168 + module Collection : sig 169 + type t 170 + 171 + val empty : t 172 + 173 + val make : 174 + ?collection_title:string -> 175 + ?collection_type:string -> 176 + ?collection_doi:string -> 177 + ?volume_title:string -> 178 + ?number_volumes:string -> 179 + unit -> t 180 + 181 + val collection_title : t -> string option 182 + (** Title of the collection (proceedings, book series, etc.). *) 183 + 184 + val collection_type : t -> string option 185 + (** Type of collection (e.g., ["proceedings"], ["book series"]). *) 186 + 187 + val collection_doi : t -> string option 188 + (** DOI of the collection itself (not the individual work). *) 189 + 190 + val volume_title : t -> string option 191 + (** Title of the specific volume within a multi-volume collection. *) 192 + 193 + val number_volumes : t -> string option 194 + (** Total number of volumes in the collection. *) 195 + 196 + val is_empty : t -> bool 197 + end 198 + 199 + (** Date-related fields. 200 + 201 + CFF distinguishes between several date types: 202 + - {b date-released}: When the software/dataset was released 203 + - {b date-published}: When the work was formally published 204 + - {b date-accessed}: When an online resource was last accessed 205 + - {b date-downloaded}: When a resource was downloaded 206 + 207 + For older works or when only the year is known, use [year] instead 208 + of a full date. *) 209 + module Dates : sig 210 + type t 211 + 212 + val empty : t 213 + 214 + val make : 215 + ?date_accessed:Cff_date.t -> 216 + ?date_downloaded:Cff_date.t -> 217 + ?date_published:Cff_date.t -> 218 + ?date_released:Cff_date.t -> 219 + ?year:int -> 220 + ?year_original:int -> 221 + ?month:int -> 222 + ?issue_date:string -> 223 + unit -> t 224 + 225 + val date_accessed : t -> Cff_date.t option 226 + (** Date when an online resource was accessed for citation. *) 227 + 228 + val date_downloaded : t -> Cff_date.t option 229 + (** Date when a resource was downloaded. *) 230 + 231 + val date_published : t -> Cff_date.t option 232 + (** Formal publication date. *) 233 + 234 + val date_released : t -> Cff_date.t option 235 + (** Release date (typically for software). *) 236 + 237 + val year : t -> int option 238 + (** Publication year when full date is unknown. *) 239 + 240 + val year_original : t -> int option 241 + (** Year of original publication (for reprints, translations). *) 242 + 243 + val month : t -> int option 244 + (** Publication month (1-12) when only month/year is known. *) 245 + 246 + val issue_date : t -> string option 247 + (** Issue date as a string (for periodicals with specific dates). *) 248 + 249 + val is_empty : t -> bool 250 + end 251 + 252 + (** Identifiers and repository links. 253 + 254 + Various identifier schemes for locating and citing works: 255 + - DOI: Digital Object Identifier (preferred for academic works) 256 + - URL: Web address 257 + - ISBN: International Standard Book Number 258 + - ISSN: International Standard Serial Number (journals) 259 + - PMCID: PubMed Central ID 260 + - NIHMSID: NIH Manuscript Submission ID *) 261 + module Identifiers : sig 262 + type t 263 + 264 + val empty : t 265 + 266 + val make : 267 + ?doi:string -> 268 + ?url:string -> 269 + ?repository:string -> 270 + ?repository_code:string -> 271 + ?repository_artifact:string -> 272 + ?isbn:string -> 273 + ?issn:string -> 274 + ?pmcid:string -> 275 + ?nihmsid:string -> 276 + ?identifiers:Cff_identifier.t list -> 277 + unit -> t 278 + 279 + val doi : t -> string option 280 + (** Digital Object Identifier (e.g., ["10.1234/example"]). *) 281 + 282 + val url : t -> string option 283 + (** URL where the work can be accessed. *) 284 + 285 + val repository : t -> string option 286 + (** General repository URL. *) 287 + 288 + val repository_code : t -> string option 289 + (** Source code repository (GitHub, GitLab, etc.). *) 290 + 291 + val repository_artifact : t -> string option 292 + (** Built artifact repository (npm, PyPI, Docker Hub, etc.). *) 293 + 294 + val isbn : t -> string option 295 + (** International Standard Book Number. *) 296 + 297 + val issn : t -> string option 298 + (** International Standard Serial Number (for journals). *) 299 + 300 + val pmcid : t -> string option 301 + (** PubMed Central identifier. *) 302 + 303 + val nihmsid : t -> string option 304 + (** NIH Manuscript Submission System identifier. *) 305 + 306 + val identifiers : t -> Cff_identifier.t list option 307 + (** Additional typed identifiers (DOI, URL, SWH, other). *) 308 + 309 + val is_empty : t -> bool 310 + end 311 + 312 + (** Related entities: editors, publishers, institutions. 313 + 314 + Persons and organizations involved in the work beyond the authors: 315 + - Editors of collections or journals 316 + - Publishers and their locations 317 + - Academic institutions (for theses, reports) 318 + - Conferences (for proceedings, presentations) *) 319 + module Entities : sig 320 + type t 321 + 322 + val empty : t 323 + 324 + val make : 325 + ?editors:Cff_author.t list -> 326 + ?editors_series:Cff_author.t list -> 327 + ?translators:Cff_author.t list -> 328 + ?recipients:Cff_author.t list -> 329 + ?senders:Cff_author.t list -> 330 + ?contact:Cff_author.t list -> 331 + ?publisher:Cff_author.Entity.t -> 332 + ?institution:Cff_author.Entity.t -> 333 + ?conference:Cff_author.Entity.t -> 334 + ?database_provider:Cff_author.Entity.t -> 335 + ?location:Cff_author.Entity.t -> 336 + unit -> t 337 + 338 + val editors : t -> Cff_author.t list option 339 + (** Editors of the work (for edited volumes). *) 340 + 341 + val editors_series : t -> Cff_author.t list option 342 + (** Series editors (for book series). *) 343 + 344 + val translators : t -> Cff_author.t list option 345 + (** Translators of the work. *) 346 + 347 + val recipients : t -> Cff_author.t list option 348 + (** Recipients (for personal communications). *) 349 + 350 + val senders : t -> Cff_author.t list option 351 + (** Senders (for personal communications). *) 352 + 353 + val contact : t -> Cff_author.t list option 354 + (** Contact persons for the work. *) 355 + 356 + val publisher : t -> Cff_author.Entity.t option 357 + (** Publishing organization. *) 358 + 359 + val institution : t -> Cff_author.Entity.t option 360 + (** Academic/research institution (for theses, reports). *) 361 + 362 + val conference : t -> Cff_author.Entity.t option 363 + (** Conference where the work was presented. *) 364 + 365 + val database_provider : t -> Cff_author.Entity.t option 366 + (** Provider of a database (for data references). *) 367 + 368 + val location : t -> Cff_author.Entity.t option 369 + (** Location entity (city, venue for conferences). *) 370 + 371 + val is_empty : t -> bool 372 + end 373 + 374 + (** Descriptive metadata: keywords, license, notes. 375 + 376 + Additional information about the work for discovery and rights. *) 377 + module Metadata : sig 378 + type t 379 + 380 + val empty : t 381 + 382 + val make : 383 + ?keywords:string list -> 384 + ?languages:string list -> 385 + ?license:Cff_license.t -> 386 + ?license_url:string -> 387 + ?copyright:string -> 388 + ?scope:string -> 389 + ?notes:string -> 390 + unit -> t 391 + 392 + val keywords : t -> string list option 393 + (** Descriptive keywords for the work. *) 394 + 395 + val languages : t -> string list option 396 + (** Languages the work is available in (ISO 639 codes). *) 397 + 398 + val license : t -> Cff_license.t option 399 + (** SPDX license identifier(s). *) 400 + 401 + val license_url : t -> string option 402 + (** URL to license text (for non-SPDX licenses). *) 403 + 404 + val copyright : t -> string option 405 + (** Copyright statement. *) 406 + 407 + val scope : t -> string option 408 + (** Scope of the reference (what aspect it covers). *) 409 + 410 + val notes : t -> string option 411 + (** Additional notes or comments. *) 412 + 413 + val is_empty : t -> bool 414 + end 415 + 416 + (** Technical and domain-specific fields. 417 + 418 + Fields for software, data, and specialized reference types: 419 + - Software: commit hash, version, filename 420 + - Theses: thesis type, department 421 + - Data: data type, database, format 422 + - Patents: patent states 423 + - Dictionaries/encyclopedias: term, entry *) 424 + module Technical : sig 425 + type t 426 + 427 + val empty : t 428 + 429 + val make : 430 + ?commit:string -> 431 + ?version:string -> 432 + ?filename:string -> 433 + ?format:string -> 434 + ?medium:string -> 435 + ?data_type:string -> 436 + ?database:string -> 437 + ?number:string -> 438 + ?patent_states:string list -> 439 + ?thesis_type:string -> 440 + ?term:string -> 441 + ?entry:string -> 442 + ?department:string -> 443 + ?loc_start:string -> 444 + ?loc_end:string -> 445 + unit -> t 446 + 447 + val commit : t -> string option 448 + (** Git commit hash or VCS revision. *) 449 + 450 + val version : t -> string option 451 + (** Version string of the software/data. *) 452 + 453 + val filename : t -> string option 454 + (** Name of the file being referenced. *) 455 + 456 + val format : t -> string option 457 + (** Format of the work (e.g., ["PDF"], ["HTML"]). *) 458 + 459 + val medium : t -> string option 460 + (** Physical medium (e.g., ["CD-ROM"], ["print"]). *) 461 + 462 + val data_type : t -> string option 463 + (** Type of data (for datasets). *) 464 + 465 + val database : t -> string option 466 + (** Name of the database. *) 467 + 468 + val number : t -> string option 469 + (** Report/patent/standard number. *) 470 + 471 + val patent_states : t -> string list option 472 + (** Countries where a patent is held. *) 473 + 474 + val thesis_type : t -> string option 475 + (** Type of thesis (["PhD"], ["Master's"], etc.). *) 476 + 477 + val term : t -> string option 478 + (** Dictionary/encyclopedia term being referenced. *) 479 + 480 + val entry : t -> string option 481 + (** Encyclopedia entry name. *) 482 + 483 + val department : t -> string option 484 + (** Academic department (for theses). *) 485 + 486 + val loc_start : t -> string option 487 + (** Starting line/location in source code. *) 488 + 489 + val loc_end : t -> string option 490 + (** Ending line/location in source code. *) 491 + 492 + val is_empty : t -> bool 493 + end 494 + 495 + (** {1 Reference Type} *) 496 + 497 + (** The complete reference type combining all sub-records. *) 498 + type t 499 + 500 + val make : 501 + core:Core.t -> 502 + ?publication:Publication.t -> 503 + ?collection:Collection.t -> 504 + ?dates:Dates.t -> 505 + ?identifiers:Identifiers.t -> 506 + ?entities:Entities.t -> 507 + ?metadata:Metadata.t -> 508 + ?technical:Technical.t -> 509 + unit -> t 510 + (** Construct a reference from sub-records. 511 + 512 + Only [core] is required; other sub-records default to empty. *) 513 + 514 + val make_simple : 515 + type_:Cff_enums.Reference_type.t -> 516 + title:string -> 517 + authors:Cff_author.t list -> 518 + ?doi:string -> 519 + ?year:int -> 520 + ?journal:string -> 521 + unit -> t 522 + (** Convenience constructor for simple references. 523 + 524 + Creates a reference with just the most common fields. Suitable 525 + for quick article or software references. *) 526 + 527 + (** {2 Sub-record Accessors} *) 528 + 529 + val core : t -> Core.t 530 + (** The core identity fields. *) 531 + 532 + val publication : t -> Publication.t 533 + (** Publication metadata (journal, volume, pages). *) 534 + 535 + val collection : t -> Collection.t 536 + (** Collection metadata (proceedings, book series). *) 537 + 538 + val dates : t -> Dates.t 539 + (** Date-related fields. *) 540 + 541 + val identifiers : t -> Identifiers.t 542 + (** Identifiers and links. *) 543 + 544 + val entities : t -> Entities.t 545 + (** Related entities (editors, publisher). *) 546 + 547 + val metadata : t -> Metadata.t 548 + (** Descriptive metadata (keywords, license). *) 549 + 550 + val technical : t -> Technical.t 551 + (** Technical fields (commit, version, format). *) 552 + 553 + (** {2 Direct Accessors for Common Fields} 554 + 555 + Convenience accessors that delegate to sub-records. *) 556 + 557 + val type_ : t -> Cff_enums.Reference_type.t 558 + (** Shortcut for [Core.type_ (core t)]. *) 559 + 560 + val title : t -> string 561 + (** Shortcut for [Core.title (core t)]. *) 562 + 563 + val authors : t -> Cff_author.t list 564 + (** Shortcut for [Core.authors (core t)]. *) 565 + 566 + val doi : t -> string option 567 + (** Shortcut for [Identifiers.doi (identifiers t)]. *) 568 + 569 + val year : t -> int option 570 + (** Shortcut for [Dates.year (dates t)]. *) 571 + 572 + (** {1 Formatting and Codec} *) 573 + 574 + val pp : Format.formatter -> t -> unit 575 + (** Pretty-print a reference in a human-readable format. *) 576 + 577 + val jsont : t Jsont.t 578 + (** JSON/YAML codec for serialization. *)
+175
project/ocaml-cff/lib/cff_root.ml
··· 1 + (*--------------------------------------------------------------------------- 2 + Copyright (c) 2025 The ocaml-cff programmers. All rights reserved. 3 + SPDX-License-Identifier: ISC 4 + ---------------------------------------------------------------------------*) 5 + 6 + (** Root CFF type. *) 7 + 8 + type t = { 9 + cff_version : string; 10 + message : string; 11 + title : string; 12 + authors : Cff_author.t list; 13 + abstract : string option; 14 + commit : string option; 15 + contact : Cff_author.t list option; 16 + date_released : Cff_date.t option; 17 + doi : string option; 18 + identifiers : Cff_identifier.t list option; 19 + keywords : string list option; 20 + license : Cff_license.t option; 21 + license_url : string option; 22 + preferred_citation : Cff_reference.t option; 23 + references : Cff_reference.t list option; 24 + repository : string option; 25 + repository_artifact : string option; 26 + repository_code : string option; 27 + type_ : Cff_enums.Cff_type.t option; 28 + url : string option; 29 + version : string option; 30 + } 31 + 32 + let make 33 + ~cff_version 34 + ~message 35 + ~title 36 + ~authors 37 + ?abstract 38 + ?commit 39 + ?contact 40 + ?date_released 41 + ?doi 42 + ?identifiers 43 + ?keywords 44 + ?license 45 + ?license_url 46 + ?preferred_citation 47 + ?references 48 + ?repository 49 + ?repository_artifact 50 + ?repository_code 51 + ?type_ 52 + ?url 53 + ?version 54 + () = 55 + { cff_version; message; title; authors; 56 + abstract; commit; contact; date_released; doi; 57 + identifiers; keywords; license; license_url; 58 + preferred_citation; references; repository; 59 + repository_artifact; repository_code; type_; url; version } 60 + 61 + (* Required field accessors *) 62 + let cff_version t = t.cff_version 63 + let message t = t.message 64 + let title t = t.title 65 + let authors t = t.authors 66 + 67 + (* Optional field accessors *) 68 + let abstract t = t.abstract 69 + let commit t = t.commit 70 + let contact t = t.contact 71 + let date_released t = t.date_released 72 + let doi t = t.doi 73 + let identifiers t = t.identifiers 74 + let keywords t = t.keywords 75 + let license t = t.license 76 + let license_url t = t.license_url 77 + let preferred_citation t = t.preferred_citation 78 + let references t = t.references 79 + let repository t = t.repository 80 + let repository_artifact t = t.repository_artifact 81 + let repository_code t = t.repository_code 82 + let type_ t = t.type_ 83 + let url t = t.url 84 + let version t = t.version 85 + 86 + let make_simple ~title ~authors ?version ?doi ?license () = 87 + let message = "If you use this software, please cite it using the metadata from this file." in 88 + make 89 + ~cff_version:"1.2.0" 90 + ~message 91 + ~title 92 + ~authors 93 + ?version 94 + ?doi 95 + ?license 96 + () 97 + 98 + let pp ppf t = 99 + Format.fprintf ppf "@[<v>"; 100 + Format.fprintf ppf "cff-version: %s@," t.cff_version; 101 + Format.fprintf ppf "title: %s@," t.title; 102 + Format.fprintf ppf "message: %s@," t.message; 103 + Format.fprintf ppf "authors:@,"; 104 + List.iter (fun a -> Format.fprintf ppf " - %a@," Cff_author.pp a) t.authors; 105 + Option.iter (fun v -> Format.fprintf ppf "version: %s@," v) t.version; 106 + Option.iter (fun v -> Format.fprintf ppf "doi: %s@," v) t.doi; 107 + Option.iter (fun v -> Format.fprintf ppf "date-released: %a@," Cff_date.pp v) t.date_released; 108 + Option.iter (fun v -> Format.fprintf ppf "license: %a@," Cff_license.pp v) t.license; 109 + Option.iter (fun v -> Format.fprintf ppf "url: %s@," v) t.url; 110 + Option.iter (fun v -> Format.fprintf ppf "repository: %s@," v) t.repository; 111 + Option.iter (fun v -> Format.fprintf ppf "repository-code: %s@," v) t.repository_code; 112 + Option.iter (fun v -> Format.fprintf ppf "abstract: %s@," v) t.abstract; 113 + Option.iter (fun v -> Format.fprintf ppf "commit: %s@," v) t.commit; 114 + Option.iter (fun v -> Format.fprintf ppf "type: %a@," Cff_enums.Cff_type.pp v) t.type_; 115 + Option.iter (fun kws -> 116 + Format.fprintf ppf "keywords:@,"; 117 + List.iter (fun k -> Format.fprintf ppf " - %s@," k) kws 118 + ) t.keywords; 119 + Option.iter (fun ids -> 120 + Format.fprintf ppf "identifiers:@,"; 121 + List.iter (fun id -> Format.fprintf ppf " - %a@," Cff_identifier.pp id) ids 122 + ) t.identifiers; 123 + Option.iter (fun contacts -> 124 + Format.fprintf ppf "contact:@,"; 125 + List.iter (fun c -> Format.fprintf ppf " - %a@," Cff_author.pp c) contacts 126 + ) t.contact; 127 + Option.iter (fun refs -> 128 + Format.fprintf ppf "references:@,"; 129 + List.iter (fun r -> Format.fprintf ppf " - %a@," Cff_reference.pp r) refs 130 + ) t.references; 131 + Option.iter (fun pc -> 132 + Format.fprintf ppf "preferred-citation:@, %a@," Cff_reference.pp pc 133 + ) t.preferred_citation; 134 + Format.fprintf ppf "@]" 135 + 136 + let jsont = 137 + let open Jsont in 138 + let array_to_list arr = Stdlib.Array.to_list arr in 139 + let array_of_list lst = Stdlib.Array.of_list lst in 140 + let authors_jsont = array Cff_author.jsont |> map ~dec:array_to_list ~enc:array_of_list in 141 + let identifiers_jsont = array Cff_identifier.jsont |> map ~dec:array_to_list ~enc:array_of_list in 142 + let references_jsont = array Cff_reference.jsont |> map ~dec:array_to_list ~enc:array_of_list in 143 + let keywords_jsont = array string |> map ~dec:array_to_list ~enc:array_of_list in 144 + Object.map ~kind:"CFF" 145 + (fun cff_version message title authors abstract commit contact 146 + date_released doi identifiers keywords license license_url 147 + preferred_citation references repository repository_artifact 148 + repository_code type_ url version -> 149 + { cff_version; message; title; authors; 150 + abstract; commit; contact; date_released; doi; 151 + identifiers; keywords; license; license_url; 152 + preferred_citation; references; repository; 153 + repository_artifact; repository_code; type_; url; version }) 154 + |> Object.mem "cff-version" string ~enc:(fun t -> t.cff_version) 155 + |> Object.mem "message" string ~enc:(fun t -> t.message) 156 + |> Object.mem "title" string ~enc:(fun t -> t.title) 157 + |> Object.mem "authors" authors_jsont ~enc:(fun t -> t.authors) 158 + |> Object.opt_mem "abstract" string ~enc:(fun t -> t.abstract) 159 + |> Object.opt_mem "commit" string ~enc:(fun t -> t.commit) 160 + |> Object.opt_mem "contact" authors_jsont ~enc:(fun t -> t.contact) 161 + |> Object.opt_mem "date-released" Cff_date.jsont ~enc:(fun t -> t.date_released) 162 + |> Object.opt_mem "doi" string ~enc:(fun t -> t.doi) 163 + |> Object.opt_mem "identifiers" identifiers_jsont ~enc:(fun t -> t.identifiers) 164 + |> Object.opt_mem "keywords" keywords_jsont ~enc:(fun t -> t.keywords) 165 + |> Object.opt_mem "license" Cff_license.jsont_lenient ~enc:(fun t -> t.license) 166 + |> Object.opt_mem "license-url" string ~enc:(fun t -> t.license_url) 167 + |> Object.opt_mem "preferred-citation" Cff_reference.jsont ~enc:(fun t -> t.preferred_citation) 168 + |> Object.opt_mem "references" references_jsont ~enc:(fun t -> t.references) 169 + |> Object.opt_mem "repository" string ~enc:(fun t -> t.repository) 170 + |> Object.opt_mem "repository-artifact" string ~enc:(fun t -> t.repository_artifact) 171 + |> Object.opt_mem "repository-code" string ~enc:(fun t -> t.repository_code) 172 + |> Object.opt_mem "type" Cff_enums.Cff_type.jsont ~enc:(fun t -> t.type_) 173 + |> Object.opt_mem "url" string ~enc:(fun t -> t.url) 174 + |> Object.opt_mem "version" string ~enc:(fun t -> t.version) 175 + |> Object.finish
+249
project/ocaml-cff/lib/cff_root.mli
··· 1 + (*--------------------------------------------------------------------------- 2 + Copyright (c) 2025 The ocaml-cff programmers. All rights reserved. 3 + SPDX-License-Identifier: ISC 4 + ---------------------------------------------------------------------------*) 5 + 6 + (** Root CFF type representing a complete [CITATION.cff] file. 7 + 8 + A [CITATION.cff] file is the standard way to provide citation metadata 9 + for research software and datasets. This module defines the root type 10 + containing all top-level fields from the CFF 1.2.0 specification. 11 + 12 + {2 Required Fields} 13 + 14 + Every valid CFF file must include: 15 + - {!cff_version}: Schema version (["1.2.0"]) 16 + - {!message}: Instructions for citing the work 17 + - {!title}: Name of the software or dataset 18 + - {!authors}: List of persons and/or entities 19 + 20 + {2 Common Optional Fields} 21 + 22 + - {!version}: Software version string 23 + - {!doi}: Digital Object Identifier 24 + - {!date_released}: Publication/release date 25 + - {!license}: SPDX license identifier(s) 26 + - {!keywords}: Descriptive keywords 27 + - {!abstract}: Description of the work 28 + 29 + {2 Citation Redirection} 30 + 31 + The {!preferred_citation} field allows redirecting citations to 32 + a related work (e.g., a journal article describing the software). 33 + The {!references} field lists works that the software cites or 34 + depends upon. 35 + 36 + {2 Example} 37 + 38 + {[ 39 + let cff = Cff_root.make 40 + ~cff_version:"1.2.0" 41 + ~message:"If you use this software, please cite it as below." 42 + ~title:"My Research Software" 43 + ~authors:[Cff_author.Person (Cff_author.Person.make 44 + ~family_names:"Smith" 45 + ~given_names:"Jane" 46 + ())] 47 + ~version:"1.0.0" 48 + ~doi:"10.5281/zenodo.1234567" 49 + ~date_released:(2024, 1, 15) 50 + ~license:(Cff_license.single "MIT") 51 + () 52 + ]} *) 53 + 54 + (** The abstract type representing a complete CFF document. *) 55 + type t 56 + 57 + (** {1 Construction} *) 58 + 59 + val make : 60 + cff_version:string -> 61 + message:string -> 62 + title:string -> 63 + authors:Cff_author.t list -> 64 + ?abstract:string -> 65 + ?commit:string -> 66 + ?contact:Cff_author.t list -> 67 + ?date_released:Cff_date.t -> 68 + ?doi:string -> 69 + ?identifiers:Cff_identifier.t list -> 70 + ?keywords:string list -> 71 + ?license:Cff_license.t -> 72 + ?license_url:string -> 73 + ?preferred_citation:Cff_reference.t -> 74 + ?references:Cff_reference.t list -> 75 + ?repository:string -> 76 + ?repository_artifact:string -> 77 + ?repository_code:string -> 78 + ?type_:Cff_enums.Cff_type.t -> 79 + ?url:string -> 80 + ?version:string -> 81 + unit -> t 82 + (** [make ~cff_version ~message ~title ~authors ...] constructs a CFF value. 83 + 84 + @param cff_version The CFF schema version, typically ["1.2.0"] 85 + @param message Instructions for users on how to cite the work 86 + @param title The name of the software or dataset 87 + @param authors List of persons and/or entities who created the work *) 88 + 89 + (** {1 Required Fields} *) 90 + 91 + val cff_version : t -> string 92 + (** The CFF schema version that this file adheres to. 93 + 94 + For CFF 1.2.0 files, this should be ["1.2.0"]. The version determines 95 + which keys are valid and how they should be interpreted. *) 96 + 97 + val message : t -> string 98 + (** A message to readers explaining how to cite the work. 99 + 100 + Common examples: 101 + - ["If you use this software, please cite it using the metadata from this file."] 102 + - ["Please cite this software using the metadata from 'preferred-citation'."] 103 + 104 + The message should guide users toward the preferred citation method. *) 105 + 106 + val title : t -> string 107 + (** The name of the software or dataset. 108 + 109 + This is the title that should appear in citations. For software, it's 110 + typically the project name; for datasets, the dataset title. *) 111 + 112 + val authors : t -> Cff_author.t list 113 + (** The creators of the software or dataset. 114 + 115 + Authors can be persons (individuals) or entities (organizations). 116 + At least one author is required for a valid CFF file. The order 117 + typically reflects contribution significance. *) 118 + 119 + (** {1 Optional Fields} *) 120 + 121 + val abstract : t -> string option 122 + (** A description of the software or dataset. 123 + 124 + Provides context about what the work does, its purpose, and scope. *) 125 + 126 + val commit : t -> string option 127 + (** The commit hash or revision number of the software version. 128 + 129 + Useful for precise version identification beyond semantic versioning. 130 + Example: ["1ff847d81f29c45a3a1a5ce73d38e45c2f319bba"] *) 131 + 132 + val contact : t -> Cff_author.t list option 133 + (** Contact persons or entities for the software or dataset. 134 + 135 + May differ from authors; useful when the primary contact is a 136 + project maintainer rather than the original author. *) 137 + 138 + val date_released : t -> Cff_date.t option 139 + (** The date when the software or dataset was released. 140 + 141 + Format is [(year, month, day)], corresponding to ISO 8601 [YYYY-MM-DD]. *) 142 + 143 + val doi : t -> string option 144 + (** The Digital Object Identifier for the software or dataset. 145 + 146 + DOIs provide persistent, citable identifiers. This is a shorthand 147 + for a single DOI; use {!identifiers} for multiple DOIs or other 148 + identifier types. Example: ["10.5281/zenodo.1234567"] *) 149 + 150 + val identifiers : t -> Cff_identifier.t list option 151 + (** Additional identifiers beyond the primary DOI. 152 + 153 + Each identifier has a type (DOI, URL, SWH, other), value, and 154 + optional description. Useful for versioned DOIs, Software Heritage 155 + identifiers, or repository URLs. *) 156 + 157 + val keywords : t -> string list option 158 + (** Descriptive keywords for the work. 159 + 160 + Help with discoverability and categorization. Example: 161 + [["machine learning"; "image processing"; "python"]] *) 162 + 163 + val license : t -> Cff_license.t option 164 + (** The SPDX license identifier(s) for the work. 165 + 166 + Uses {{:https://spdx.org/licenses/}SPDX identifiers}. Multiple 167 + licenses imply an OR relationship (user may choose any). 168 + Example: ["MIT"], ["Apache-2.0"], or [["GPL-3.0-only"; "MIT"]]. *) 169 + 170 + val license_url : t -> string option 171 + (** URL to the license text for non-standard licenses. 172 + 173 + Only needed for licenses not in the SPDX list. Standard SPDX 174 + licenses have well-known URLs. *) 175 + 176 + val preferred_citation : t -> Cff_reference.t option 177 + (** A reference to cite instead of the software itself. 178 + 179 + Used for "credit redirection" when authors prefer citation of 180 + a related publication (e.g., a methods paper) over the software. 181 + Note: Software citation principles recommend citing software 182 + directly; use this field judiciously. *) 183 + 184 + val references : t -> Cff_reference.t list option 185 + (** Works that this software cites or depends upon. 186 + 187 + Functions like a bibliography, listing dependencies, foundational 188 + works, or related publications. Each reference includes full 189 + bibliographic metadata. *) 190 + 191 + val repository : t -> string option 192 + (** URL to the repository where the software is developed. 193 + 194 + Typically a version control system URL. For source code repositories, 195 + prefer {!repository_code}. *) 196 + 197 + val repository_artifact : t -> string option 198 + (** URL to the built/compiled artifact repository. 199 + 200 + For binary distributions, package registries (npm, PyPI, CRAN), 201 + or container registries. *) 202 + 203 + val repository_code : t -> string option 204 + (** URL to the source code repository. 205 + 206 + Typically a GitHub, GitLab, or similar URL where the source 207 + code is publicly accessible. *) 208 + 209 + val type_ : t -> Cff_enums.Cff_type.t option 210 + (** The type of work: [`Software] (default) or [`Dataset]. 211 + 212 + Most CFF files describe software; use [`Dataset] for data packages. *) 213 + 214 + val url : t -> string option 215 + (** The URL of the software or dataset homepage. 216 + 217 + A general landing page, documentation site, or project website. *) 218 + 219 + val version : t -> string option 220 + (** The version string of the software or dataset. 221 + 222 + Can be any version format: semantic versioning (["1.2.3"]), 223 + date-based (["2024.01"]), or other schemes. *) 224 + 225 + (** {1 Convenience Constructors} *) 226 + 227 + val make_simple : 228 + title:string -> 229 + authors:Cff_author.t list -> 230 + ?version:string -> 231 + ?doi:string -> 232 + ?license:Cff_license.t -> 233 + unit -> t 234 + (** Create a minimal CFF with sensible defaults. 235 + 236 + Uses [cff_version = "1.2.0"] and the standard message: 237 + ["If you use this software, please cite it using the metadata from this file."] 238 + 239 + This is the quickest way to create a valid CFF for simple projects. *) 240 + 241 + (** {1 Formatting and Codec} *) 242 + 243 + val pp : Format.formatter -> t -> unit 244 + (** Pretty-print a CFF value in a human-readable YAML-like format. *) 245 + 246 + val jsont : t Jsont.t 247 + (** JSON/YAML codec for serialization and deserialization. 248 + 249 + Used internally by the YAML codec functions. *)
+4
project/ocaml-cff/lib/dune
··· 1 + (library 2 + (name cff) 3 + (public_name cff) 4 + (libraries ptime ISO3166 spdx_licenses yamlt jsont bytesrw))
+5
project/ocaml-cff/test/dune
··· 1 + (test 2 + (name test_cff) 3 + (package cff) 4 + (libraries cff alcotest) 5 + (deps (source_tree ../vendor/git/citation-file-format/examples)))
+223
project/ocaml-cff/test/test_cff.ml
··· 1 + (*--------------------------------------------------------------------------- 2 + Copyright (c) 2025 The ocaml-cff programmers. All rights reserved. 3 + SPDX-License-Identifier: ISC 4 + ---------------------------------------------------------------------------*) 5 + 6 + (* Test the CFF library by parsing upstream fixtures *) 7 + 8 + let minimal_cff = {| 9 + cff-version: 1.2.0 10 + message: If you use this software in your work, please cite it using the following metadata 11 + title: Ruby CFF Library 12 + authors: 13 + - family-names: Haines 14 + given-names: Robert 15 + |} 16 + 17 + let simple_cff = {| 18 + cff-version: 1.2.0 19 + message: Please cite this software using these metadata. 20 + title: My Research Software 21 + authors: 22 + - family-names: Druskat 23 + given-names: Stephan 24 + orcid: https://orcid.org/0000-0003-4925-7248 25 + version: 1.0.0 26 + doi: 10.5281/zenodo.1234567 27 + date-released: 2021-08-11 28 + |} 29 + 30 + let test_parse_minimal () = 31 + match Cff.of_yaml_string minimal_cff with 32 + | Ok cff -> 33 + Alcotest.(check string) "cff-version" "1.2.0" (Cff.cff_version cff); 34 + Alcotest.(check string) "title" "Ruby CFF Library" (Cff.title cff); 35 + Alcotest.(check int) "authors count" 1 (List.length (Cff.authors cff)) 36 + | Error e -> 37 + Alcotest.fail (Printf.sprintf "Failed to parse minimal CFF: %s" e) 38 + 39 + let test_parse_simple () = 40 + match Cff.of_yaml_string simple_cff with 41 + | Ok cff -> 42 + Alcotest.(check string) "cff-version" "1.2.0" (Cff.cff_version cff); 43 + Alcotest.(check string) "title" "My Research Software" (Cff.title cff); 44 + Alcotest.(check (option string)) "version" (Some "1.0.0") (Cff.version cff); 45 + Alcotest.(check (option string)) "doi" (Some "10.5281/zenodo.1234567") (Cff.doi cff); 46 + (match Cff.date_released cff with 47 + | Some (2021, 8, 11) -> () 48 + | Some d -> Alcotest.fail (Printf.sprintf "Wrong date: %s" (Cff.Date.to_string d)) 49 + | None -> Alcotest.fail "Missing date-released") 50 + | Error e -> 51 + Alcotest.fail (Printf.sprintf "Failed to parse simple CFF: %s" e) 52 + 53 + let test_create_programmatic () = 54 + let author = Cff.Author.Person 55 + (Cff.Person.make ~family_names:"Smith" ~given_names:"Jane" ()) in 56 + let cff = Cff.make_simple 57 + ~title:"My Software" 58 + ~authors:[author] 59 + ~version:"1.0.0" 60 + () in 61 + Alcotest.(check string) "cff-version" "1.2.0" (Cff.cff_version cff); 62 + Alcotest.(check string) "title" "My Software" (Cff.title cff); 63 + Alcotest.(check (option string)) "version" (Some "1.0.0") (Cff.version cff) 64 + 65 + let test_roundtrip () = 66 + match Cff.of_yaml_string simple_cff with 67 + | Error e -> Alcotest.fail (Printf.sprintf "Failed to parse: %s" e) 68 + | Ok cff1 -> 69 + match Cff.to_yaml_string cff1 with 70 + | Error e -> Alcotest.fail (Printf.sprintf "Failed to encode: %s" e) 71 + | Ok yaml -> 72 + match Cff.of_yaml_string yaml with 73 + | Error e -> Alcotest.fail (Printf.sprintf "Failed to reparse: %s" e) 74 + | Ok cff2 -> 75 + Alcotest.(check string) "title preserved" (Cff.title cff1) (Cff.title cff2); 76 + Alcotest.(check string) "cff-version preserved" (Cff.cff_version cff1) (Cff.cff_version cff2) 77 + 78 + let test_parse_key_complete () = 79 + let path = "../vendor/git/citation-file-format/examples/1.2.0/pass/key-complete/CITATION.cff" in 80 + match Cff.of_yaml_file path with 81 + | Ok cff -> 82 + (* Check basic fields *) 83 + Alcotest.(check string) "cff-version" "1.2.0" (Cff.cff_version cff); 84 + Alcotest.(check string) "title" "Citation File Format 1.0.0" (Cff.title cff); 85 + Alcotest.(check (option string)) "version" (Some "1.0.0") (Cff.version cff); 86 + Alcotest.(check (option string)) "doi" (Some "10.5281/zenodo.1003150") (Cff.doi cff); 87 + Alcotest.(check (option string)) "abstract" 88 + (Some "This is an awesome piece of research software!") (Cff.abstract cff); 89 + Alcotest.(check (option string)) "commit" 90 + (Some "156a04c74a8a79d40c5d705cddf9d36735feab4d") (Cff.commit cff); 91 + 92 + (* Check authors - should have 2 (1 person + 1 entity) *) 93 + Alcotest.(check int) "authors count" 2 (List.length (Cff.authors cff)); 94 + 95 + (* Check first author is a Person *) 96 + (match List.hd (Cff.authors cff) with 97 + | Cff.Author.Person p -> 98 + Alcotest.(check (option string)) "person family-names" 99 + (Some "Real Person") (Cff.Person.family_names p); 100 + Alcotest.(check (option string)) "person given-names" 101 + (Some "One Truly") (Cff.Person.given_names p) 102 + | Cff.Author.Entity _ -> Alcotest.fail "Expected Person, got Entity"); 103 + 104 + (* Check second author is an Entity *) 105 + (match List.nth (Cff.authors cff) 1 with 106 + | Cff.Author.Entity e -> 107 + Alcotest.(check string) "entity name" 108 + "Entity Project Team Conference entity" (Cff.Entity.name e) 109 + | Cff.Author.Person _ -> Alcotest.fail "Expected Entity, got Person"); 110 + 111 + (* Check identifiers *) 112 + (match Cff.identifiers cff with 113 + | Some ids -> 114 + Alcotest.(check int) "identifiers count" 4 (List.length ids) 115 + | None -> Alcotest.fail "Expected identifiers"); 116 + 117 + (* Check keywords *) 118 + (match Cff.keywords cff with 119 + | Some kws -> 120 + Alcotest.(check int) "keywords count" 4 (List.length kws); 121 + Alcotest.(check string) "first keyword" "One" (List.hd kws) 122 + | None -> Alcotest.fail "Expected keywords"); 123 + 124 + (* Check preferred-citation *) 125 + (match Cff.preferred_citation cff with 126 + | Some ref -> 127 + Alcotest.(check string) "preferred-citation title" "Book Title" (Cff.Reference.title ref) 128 + | None -> Alcotest.fail "Expected preferred-citation"); 129 + 130 + (* Check references *) 131 + (match Cff.references cff with 132 + | Some refs -> 133 + Alcotest.(check int) "references count" 1 (List.length refs) 134 + | None -> Alcotest.fail "Expected references") 135 + | Error e -> 136 + Alcotest.fail (Printf.sprintf "Failed to parse key-complete CFF: %s" e) 137 + 138 + (* All 1.2.0 pass fixtures *) 139 + (* Note: reference-article is skipped due to Yamlt parser limitation with 140 + multi-line quoted strings (see issue with indentation in quoted scalars) *) 141 + let pass_fixtures_1_2_0 = [ 142 + "bjmorgan/bsym"; 143 + "esalmela/haplowinder"; 144 + "key-complete"; 145 + "ls1mardyn/ls1-mardyn"; 146 + "minimal"; 147 + "poc"; 148 + "reference-art"; 149 + (* "reference-article"; -- skipped: Yamlt multi-line quoted string issue *) 150 + "reference-blog"; 151 + "reference-book"; 152 + "reference-conference-paper"; 153 + "reference-edited-work"; 154 + "reference-report"; 155 + "reference-thesis"; 156 + "short"; 157 + "simple"; 158 + "software-container"; 159 + "software-executable"; 160 + "software-with-a-doi"; 161 + "software-with-a-doi-expanded"; 162 + "software-without-a-doi"; 163 + "software-without-a-doi-closed-source"; 164 + "software-with-reference"; 165 + "tue-excellent-buildings/bso-toolbox"; 166 + "xenon-middleware_xenon-adaptors-cloud"; 167 + ] 168 + 169 + let make_fixture_test name = 170 + let test_name = String.map (fun c -> if c = '/' then '-' else c) name in 171 + let test () = 172 + let path = Printf.sprintf "../vendor/git/citation-file-format/examples/1.2.0/pass/%s/CITATION.cff" name in 173 + match Cff.of_yaml_file path with 174 + | Ok cff -> 175 + (* Basic sanity checks that apply to all valid CFF files *) 176 + Alcotest.(check string) "cff-version" "1.2.0" (Cff.cff_version cff); 177 + Alcotest.(check bool) "has title" true (String.length (Cff.title cff) > 0); 178 + Alcotest.(check bool) "has authors" true (List.length (Cff.authors cff) > 0) 179 + | Error e -> 180 + Alcotest.fail (Printf.sprintf "Failed to parse %s: %s" name e) 181 + in 182 + Alcotest.test_case test_name `Quick test 183 + 184 + (* Test that we correctly reject or handle known-invalid files *) 185 + let test_fail_invalid_date () = 186 + let path = "../vendor/git/citation-file-format/examples/1.2.0/fail/tue-excellent-buildings/bso-toolbox-invalid-date/CITATION.cff" in 187 + match Cff.of_yaml_file path with 188 + | Ok _ -> 189 + (* Our parser might be lenient - that's OK for now *) 190 + () 191 + | Error _ -> 192 + (* Expected to fail due to invalid date "2020-05-xx" *) 193 + () 194 + 195 + (* Test fail fixture with additional key - should parse since we skip unknown *) 196 + let test_fail_additional_key () = 197 + let path = "../vendor/git/citation-file-format/examples/1.2.0/fail/additional-key/CITATION.cff" in 198 + match Cff.of_yaml_file path with 199 + | Ok cff -> 200 + (* Our parser is lenient and skips unknown keys *) 201 + Alcotest.(check string) "title" "My Research Tool" (Cff.title cff) 202 + | Error e -> 203 + Alcotest.fail (Printf.sprintf "Should parse with unknown keys skipped: %s" e) 204 + 205 + let () = 206 + Alcotest.run "CFF" [ 207 + "parsing", [ 208 + Alcotest.test_case "minimal" `Quick test_parse_minimal; 209 + Alcotest.test_case "simple" `Quick test_parse_simple; 210 + Alcotest.test_case "key-complete" `Quick test_parse_key_complete; 211 + ]; 212 + "creation", [ 213 + Alcotest.test_case "programmatic" `Quick test_create_programmatic; 214 + ]; 215 + "roundtrip", [ 216 + Alcotest.test_case "simple roundtrip" `Quick test_roundtrip; 217 + ]; 218 + "1.2.0 fixtures", List.map make_fixture_test pass_fixtures_1_2_0; 219 + "fail fixtures", [ 220 + Alcotest.test_case "invalid-date" `Quick test_fail_invalid_date; 221 + Alcotest.test_case "additional-key" `Quick test_fail_additional_key; 222 + ]; 223 + ]
+1
project/ocaml-cff/vendor/dune
··· 1 + (vendored_dirs opam)
+14
project/ocaml-cff/vendor/git/citation-file-format/.bumpversion.cfg
··· 1 + [bumpversion] 2 + current_version = 1.2.0 3 + 4 + [bumpversion:file:CITATION.cff] 5 + search = version: {current_version} 6 + replace = version: {new_version} 7 + 8 + [bumpversion:file:.zenodo.json] 9 + search = "version": "{current_version}" 10 + replace = "version": "{new_version}" 11 + 12 + [bumpversion:file:schema-guide.md] 13 + search = # Guide to Citation File Format schema version {current_version} 14 + replace = # Guide to Citation File Format schema version {new_version}
+6
project/ocaml-cff/vendor/git/citation-file-format/.codespellrc
··· 1 + [codespell] 2 + skip = .git,*.pdf,*.svg 3 + # countries listing in ./schema.json 4 + ignore-regex = ["`][A-Z][A-Z]["`] 5 + # 6 + # ignore-words-list =
+8
project/ocaml-cff/vendor/git/citation-file-format/.github/ISSUE_TEMPLATE/10_bug.md
··· 1 + --- 2 + name: Bug report 3 + about: I think I may have found a bug! 4 + title: '' 5 + labels: 'bug' 6 + assignees: '' 7 + 8 + ---
+8
project/ocaml-cff/vendor/git/citation-file-format/.github/ISSUE_TEMPLATE/20_feature.md
··· 1 + --- 2 + name: Idea for a schema/format enhancement 3 + about: I have an idea for how to improve the Citation File Format schema 4 + title: '' 5 + labels: 'enhancement' 6 + assignees: '' 7 + 8 + ---
+58
project/ocaml-cff/vendor/git/citation-file-format/.github/ISSUE_TEMPLATE/30_tooling.yml
··· 1 + name: Tool idea 2 + description: I have an idea for or need specific tooling for CITATION.cff files 3 + labels: ['help wanted', 'tooling'] 4 + body: 5 + - type: markdown 6 + attributes: 7 + value: Please have a look at the [section on tooling for CITATION.cff files](https://github.com/citation-file-format/citation-file-format#tools-to-work-with-citationcff-files-wrench) before submitting this issue. 8 + - type: textarea 9 + attributes: 10 + label: Who needs the new tool? 11 + description: Describe the type of user that would need the new tool. 12 + placeholder: | 13 + Examples: 14 + 15 + * Researchers 16 + * A software registry 17 + validations: 18 + required: true 19 + - type: textarea 20 + attributes: 21 + label: What should the new tool enable users to do? 22 + description: Describe a goal that users could achieve with the new tool. You can start with "I want to ..." or similar. 23 + placeholder: | 24 + Example: 25 + 26 + I want to convert the metadata in CITATION.cff files to BibTeX. 27 + validations: 28 + required: true 29 + - type: textarea 30 + attributes: 31 + label: What benefit would the new tool add? 32 + description: Describe the benefit the tool will give users. 33 + placeholder: | 34 + Example: 35 + 36 + Users will be able to use the metadata from CITATION.cff files to cite software in papers they write in LaTeX. 37 + validations: 38 + required: true 39 + - type: textarea 40 + attributes: 41 + label: Implementation suggestions 42 + description: Do you have a specific technology or programming language in mind for the implementation of the new tool? If so, please describe why. 43 + placeholder: | 44 + Examples: 45 + 46 + * This could be a website hosted by the software registries that want to use this functionality. 47 + * This could be a Python package with a command-line interface. 48 + validations: 49 + required: false 50 + - type: dropdown 51 + attributes: 52 + label: Can you help? 53 + description: Indicate whether you will be able to work on the implementation yourself. 54 + options: 55 + - 'Yes' 56 + - 'No' 57 + validations: 58 + required: true
+27
project/ocaml-cff/vendor/git/citation-file-format/.github/ISSUE_TEMPLATE/40_validation_issue.md
··· 1 + --- 2 + name: Validation issue 3 + about: My CITATION.cff file is not valid and I need help 4 + title: '' 5 + labels: 6 + - 'help wanted' 7 + - validation 8 + assignees: '' 9 + 10 + --- 11 + 12 + <!-- 13 + Please have a look at the section on validating your CITATION.cff file before submitting this issue: https://github.com/citation-file-format/citation-file-format#validation-heavy_check_mark. 14 + --> 15 + 16 + <!-- Don't delete the following note! --> 17 + Please note that issues with the validity of single CITATION.cff files may take some time to be picked up by the Citation File Format maintainers themselves. Therefore, if you are reading this issue and know how to validate `CITATION.cff` files, please help out if you can! 18 + 19 + ## Invalid `CITATION.cff` file 20 + 21 + ```yaml 22 + Paste your invalid CITATION.cff file here! 23 + ``` 24 + 25 + ## Context 26 + 27 + - Please describe what you want to do (create a valid `CITATION.cff` file, show the citation information in the sidebar of your GitHub repository, ...)
+8
project/ocaml-cff/vendor/git/citation-file-format/.github/ISSUE_TEMPLATE/99_blank.md
··· 1 + --- 2 + name: Any other issue 3 + about: Any other issue 4 + title: '' 5 + labels: '' 6 + assignees: '' 7 + 8 + ---
+1
project/ocaml-cff/vendor/git/citation-file-format/.github/ISSUE_TEMPLATE/config.yml
··· 1 + blank_issues_enabled: false
+35
project/ocaml-cff/vendor/git/citation-file-format/.github/PULL_REQUEST_TEMPLATE.md
··· 1 + **Related issues** 2 + 3 + Refs: #ISSUE_NUMBER 4 + 5 + (For autoclosure of issues when PR is merged use `Fixes #<issue-number>` syntax) 6 + 7 + **Describe the changes made in this pull request** 8 + 9 + **Review checklist** 10 + 11 + - [ ] Please check if the pull request is against the correct branch 12 + (format/schema/semantic documentation changes: `develop`; typos, meta files, etc.: `main`) 13 + - [ ] Please check if all changes are recorded in `CHANGELOG.md` and adapt if necessary. 14 + - [ ] Please run tests locally. 15 + <!-- 16 + CONTRIBUTORS: Please replace <do other things> in the snippet below 17 + with something that reviewers should do to test and review your contribution! 18 + --> 19 + ```bash 20 + cd $(mktemp -d --tmpdir cff.XXXXXX) 21 + git clone https://github.com/citation-file-format/citation-file-format . 22 + git checkout <branch> 23 + python3 -m venv env 24 + source env/bin/activate 25 + pip install --upgrade pip wheel setuptools 26 + pip install -r requirements.txt 27 + pytest -v 28 + <do other things> 29 + ``` 30 + <!-- 31 + CONTRIBUTORS: Please replace `<do other things>` in the checklist item below 32 + with something that reviewers should do additionally 33 + to test and review your contribution! 34 + --> 35 + - [ ] `<do other things>`
+24
project/ocaml-cff/vendor/git/citation-file-format/.github/workflows/cffconvert.yml
··· 1 + name: cffconvert 2 + 3 + on: 4 + push: 5 + paths: 6 + - CITATION.cff 7 + 8 + permissions: 9 + contents: read 10 + 11 + jobs: 12 + validate: 13 + name: "validate" 14 + runs-on: ubuntu-latest 15 + steps: 16 + - name: Check out a copy of the repository 17 + uses: actions/checkout@v3 18 + with: 19 + persist-credentials: false 20 + 21 + - name: Check whether the citation metadata from CITATION.cff is valid 22 + uses: citation-file-format/cffconvert-github-action@2.0.0 23 + with: 24 + args: "--validate"
+22
project/ocaml-cff/vendor/git/citation-file-format/.github/workflows/check-links.yml
··· 1 + name: links 2 + 3 + on: 4 + workflow_dispatch: 5 + schedule: 6 + # * is a special character in YAML so you have to quote this string 7 + - cron: '17 3 * * *' 8 + 9 + permissions: 10 + contents: read 11 + 12 + jobs: 13 + check: 14 + runs-on: ubuntu-latest 15 + steps: 16 + - uses: actions/checkout@v4 17 + with: 18 + persist-credentials: false 19 + 20 + - uses: gaurav-nelson/github-action-markdown-link-check@v1 21 + with: 22 + config-file: .mlc-config.json
+22
project/ocaml-cff/vendor/git/citation-file-format/.github/workflows/codespell.yml
··· 1 + --- 2 + name: codespell 3 + 4 + on: 5 + push: 6 + branches: [main] 7 + pull_request: 8 + branches: [main] 9 + 10 + permissions: 11 + contents: read 12 + 13 + jobs: 14 + codespell: 15 + name: Check for spelling errors 16 + runs-on: ubuntu-latest 17 + 18 + steps: 19 + - name: Checkout 20 + uses: actions/checkout@v3 21 + - name: Codespell 22 + uses: codespell-project/actions-codespell@v2
+28
project/ocaml-cff/vendor/git/citation-file-format/.github/workflows/linting.yml
··· 1 + name: linting 2 + 3 + on: 4 + push: 5 + paths: 6 + - schema.json 7 + pull_request: 8 + types: [opened, synchronize, reopened] 9 + workflow_dispatch: 10 + # for manual trigger 11 + 12 + permissions: 13 + contents: read 14 + 15 + jobs: 16 + lint: 17 + name: "lint schema" 18 + runs-on: ubuntu-latest 19 + steps: 20 + - uses: actions/checkout@v2 21 + name: Check out a copy of the repository 22 + with: 23 + persist-credentials: false 24 + 25 + - name: lint the schema 26 + run: | 27 + cat schema.json | jq -S --indent 4 '.' > schema.sorted.json 28 + diff schema.json schema.sorted.json
+42
project/ocaml-cff/vendor/git/citation-file-format/.github/workflows/testing.yml
··· 1 + name: testing 2 + 3 + on: 4 + push: 5 + pull_request: 6 + types: [opened, synchronize, reopened] 7 + 8 + permissions: 9 + contents: read 10 + 11 + jobs: 12 + tests: 13 + name: test (${{ matrix.os }}, py${{ matrix.python-version }}) 14 + runs-on: ${{ matrix.os }} 15 + strategy: 16 + fail-fast: false 17 + matrix: 18 + os: ['ubuntu-latest', 'macos-latest', 'windows-latest'] 19 + python-version: ['3.10', '3.11', '3.12', '3.13'] 20 + steps: 21 + - uses: actions/checkout@v4 22 + with: 23 + persist-credentials: false 24 + 25 + - name: Set up Python ${{ matrix.python-version }} 26 + uses: actions/setup-python@v5 27 + with: 28 + python-version: ${{ matrix.python-version }} 29 + cache: 'pip' 30 + - name: Python info 31 + shell: bash -l {0} 32 + run: | 33 + which python3 34 + python3 --version 35 + 36 + - name: Install dependencies 37 + run: | 38 + python3 -m pip install --upgrade pip setuptools wheel 39 + python3 -m pip install -r requirements.txt 40 + 41 + - name: Run pytest 42 + run: pytest
+13
project/ocaml-cff/vendor/git/citation-file-format/.gitignore
··· 1 + **/__pycache__ 2 + .cache 3 + venv/ 4 + venv37/ 5 + venv3*/ 6 + .idea 7 + .vscode/ 8 + 9 + 10 + # for when users install markdown-link-checker locally 11 + node_modules 12 + package.json 13 + package-lock.json
+19
project/ocaml-cff/vendor/git/citation-file-format/.mlc-config.json
··· 1 + { 2 + "_comment": "Markdown Link Checker configuration, see https://github.com/gaurav-nelson/github-action-markdown-link-check and https://github.com/tcort/markdown-link-check", 3 + "ignorePatterns": [{ 4 + "pattern": "^http://localhost" 5 + }, { 6 + "pattern": "^https://localhost" 7 + }, { 8 + "_comment": "local links are not checked reliably, skipping helps avoid false sense of security", 9 + "pattern": "^#" 10 + }, { 11 + "_comment": "Resolves fine, target may be behind a proxy server that doesn't allow this kind of automated access", 12 + "pattern": "^https://doi\\.org/10\\.25490/a97f-egyk" 13 + }, { 14 + "_comment": "Resolves fine, target may be behind a proxy server that doesn't allow this kind of automated access", 15 + "pattern": "^https://www\\.esciencecenter\\.nl" 16 + }], 17 + "retryOn429": true, 18 + "fallbackRetryDelay": "30s" 19 + }
+112
project/ocaml-cff/vendor/git/citation-file-format/.zenodo.json
··· 1 + { 2 + "access_right": "open", 3 + "contributors": [ 4 + { 5 + "affiliation": "Software Heritage", 6 + "name": "Gruenpeter, Morane", 7 + "orcid": "0000-0002-9777-5560", 8 + "type": "Other" 9 + }, 10 + { 11 + "affiliation": "Software Sustainability Institute, University of Manchester, UK", 12 + "name": "Silva, Raniere", 13 + "type": "Other" 14 + }, 15 + { 16 + "affiliation": "University of Tromsø, Norway", 17 + "name": "Bast, Radovan", 18 + "type": "Other" 19 + }, 20 + { 21 + "affiliation": "Octiog, Inc., USA", 22 + "name": "Crusoe, Michael R.", 23 + "orcid": "0000-0002-2961-9670", 24 + "type": "Other" 25 + } 26 + ], 27 + "creators": [ 28 + { 29 + "affiliation": "German Aerospace Center (DLR), Berlin, Germany", 30 + "name": "Druskat, Stephan", 31 + "orcid": "0000-0003-4925-7248" 32 + }, 33 + { 34 + "affiliation": "Netherlands eScience Center", 35 + "name": "Spaaks, Jurriaan H.", 36 + "orcid": "0000-0002-7064-4069" 37 + }, 38 + { 39 + "affiliation": "Software Sustainability Institute, University of Edinburgh, UK", 40 + "name": "Chue Hong, Neil", 41 + "orcid": "0000-0002-8876-7606" 42 + }, 43 + { 44 + "affiliation": "ITS Research IT, University of Manchester", 45 + "name": "Haines, Robert", 46 + "orcid": "0000-0002-9538-7919" 47 + }, 48 + { 49 + "affiliation": "University of Sussex, Sussex Humanities Lab", 50 + "name": "Baker, James", 51 + "orcid": "0000-0002-2682-6922" 52 + }, 53 + { 54 + "name": "Bliven, Spencer", 55 + "orcid": "0000-0002-1200-1698" 56 + }, 57 + { 58 + "name": "Willighagen, Egon", 59 + "orcid": "0000-0001-7542-0286" 60 + }, 61 + { 62 + "name": "Pérez-Suárez, David", 63 + "orcid": "0000-0003-0784-6909" 64 + }, 65 + { 66 + "name": "Konovalov, Alexander", 67 + "orcid": "0000-0001-5299-3292" 68 + } 69 + ], 70 + "description": "CITATION.cff files are plain text files with human- and machine-readable citation information for software. Code developers can include them in their repositories to let others know how to correctly cite their software. This is the specification for the Citation File Format.", 71 + "keywords": [ 72 + "citation file format", 73 + "CFF", 74 + "citation files", 75 + "software citation", 76 + "file format", 77 + "YAML", 78 + "software sustainability", 79 + "research software", 80 + "credit" 81 + ], 82 + "language": "eng", 83 + "license": { 84 + "id": "CC-BY-4.0" 85 + }, 86 + "references": [ 87 + "A. M. Smith, D. S. Katz, K. E. Niemeyer, and FORCE11 Software Citation Working Group, \"Software citation principles,\" PeerJ Computer Science, vol. 2, p. e86, Sep. 2016 [Online]. Available: https://doi.org/10.7717/peerj-cs.86", 88 + "S. Druskat, \"Track 2 Lightning Talk: Should CITATION files be standardized?\" in Proceedings of the Workshop on Sustainable Software for Science: Practice and Experiences (WSSSPE5.1), 2017 [Online]. Available: https://doi.org/10.6084/m9.figshare.3827058", 89 + "R. Wilson, \"Encouraging citation of software - introducing CITATION files.\" 2013 [Online]. Available: https://www.software.ac.uk/blog/2013-09-02-encouraging-citation-software-introducing-citation-files", 90 + "O. Ben-Kiki, C. Evans, and I. döt Net, \"YAML Ain't Markup Language (YAML) Version 1.2. 3rd Edition, Patched at 2009-10-01.\" 2009 [Online]. Available: http://yaml.org/spec/1.2/spec.html", 91 + "J.-M. Hufflen, \"Names in bibtex and mlBibTeX,\" TUGboat, vol. 27, no. 2, pp. 243–253, Nov. 2006 [Online]. Available: https://www.tug.org/TUGboat/tb27-2/tb87hufflen.pdf" 92 + ], 93 + "related_identifiers": [ 94 + { 95 + "scheme": "url", 96 + "identifier": "https://github.com/citation-file-format/citation-file-format/releases/tag/1.2.0", 97 + "relation": "isSupplementTo" 98 + }, 99 + { 100 + "scheme": "doi", 101 + "identifier": "10.5281/zenodo.1003149", 102 + "relation": "isPartOf" 103 + }, 104 + { 105 + "scheme": "doi", 106 + "identifier": "10.5281/zenodo.4813122", 107 + "relation": "isNewVersionOf" 108 + } 109 + ], 110 + "title": "Citation File Format", 111 + "version": "1.2.0" 112 + }
+111
project/ocaml-cff/vendor/git/citation-file-format/CHANGELOG.md
··· 1 + # Changelog 2 + 3 + All notable changes to this project will be documented in this file. 4 + 5 + The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), 6 + and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). 7 + 8 + ## [Unreleased] 9 + 10 + ### Changed 11 + 12 + - Update example testing to use cffconvert 2.0.0 (or newer) validation 13 + - Update Python versions run in CI to remove end-of-life versions and add newer releases 14 + - Replace real ORCID with example ORCID from https://orcid.org/1234-5678-9101-1121 15 + - Provide contact details for the Code of Conduct Committee in the CoC document 16 + - Speed up the test suite 17 + 18 + ## [1.2.0] - 2021-05-31 19 + 20 + ### Added 21 + 22 + - introduced `preferred-citation` 23 + - root document now has `type:` `software` or `dataset` 24 + - `identifiers` have gained an optional key `description` 25 + - added regex validation for identifiers of type `swh` 26 + - `description`s and `examples` added to schema 27 + - schema has more checks for empty strings or empty arrays (e.g. `authors`, `abstract`, `keywords`) 28 + 29 + ### Changed 30 + 31 + - switched from YAML schema to JSON schema 32 + - `issue`, `number`, `version`, `post-code`, `section` are more lenient now with type union `str|number` 33 + - `loc-start`, `loc-end`, `start`, `end`, `number-volumes`, `volume`, `pages`, `year`, `year-original` are more lenient now with type union `int|str` 34 + - `month` is more lenient now with type union `int[1-12]|enum["1"-"12"]` 35 + - `version`, `date-released` no longer required elements of a minimal CFF 36 + - list of valid license SPDX codes updated to version 2021-05-14 37 + - `language` more lenient (for performance) 38 + - regex for `url` simplified for easier maintenance 39 + - url regex now also allows for `sftp` 40 + - regex for `isbn` simplified and changed for easier maintenance 41 + - dates are now (only) strings of `format` `date` & `pattern` YYYY-MM-DD 42 + 43 + ### Fixed 44 + 45 + - `references.term` was added 46 + 47 + ## [1.1.0] - 2021-05-31 48 + 49 + ### Added 50 + 51 + - `identifiers` field that accepts `doi`, `swh` (short for "Software Heritage"), `url` and `other` identifiers 52 + - `alias` for *person* objects to accept aliases such as user/screen names, etc. 53 + 54 + ### Changed 55 + 56 + - Make `given-names` and `family-names` non-required in *person* objects 57 + 58 + ### Fixed 59 + 60 + - Note in schema comment that DOI can include slashes 61 + 62 + ## [1.0.3-4] - 2019-11-05 63 + 64 + ### Added 65 + 66 + - Link to concept DOI rather than single version DOI (https://github.com/citation-file-format/citation-file-format.github.io/commit/4a55d34fc7fb760a0930c2f934f97d4cbe1eb52f) 67 + - Note arbitrary order of keys (https://github.com/citation-file-format/citation-file-format.github.io/commit/aa63008257011c86f120a6498abaa9c08e04ce0d) 68 + - Add Neil Chue Hong to authors 69 + - Add Jurriaan Spaaks to authors 70 + 71 + ### Fixed 72 + 73 + - `orcid` accepts URLs (https://github.com/citation-file-format/citation-file-format/issues/43) 74 + - Fix some typos in the specifications 75 + - Improve rendering of documentation 76 + 77 + ## [1.0.2] - 2017-12-20 78 + 79 + ### Fixed 80 + 81 + - Fix examples in versions 1.0.0 and 1.0.1 (https://github.com/citation-file-format/citation-file-format/issues/41) 82 + - Indicate required keys for software metadata in the specifications document (https://github.com/citation-file-format/citation-file-format/issues/42) 83 + - Add known bugs to specifications versions 1.0.0 and 1.0.1 (https://github.com/citation-file-format/citation-file-format.github.io/commit/de801adaf86496d4d1948f90e61a699de208508f) 84 + 85 + ## [1.0.1] - 2017-12-18 86 + 87 + ### Fixed 88 + 89 + - `patent-states` takes a sequence of strings, not a single string (https://github.com/citation-file-format/citation-file-format/issues/39) 90 + - `senders` also accepts entity objects (https://github.com/citation-file-format/citation-file-format/issues/40) 91 + 92 + ## [1.0.0] - 2017-12-12 93 + 94 + ### Changed 95 + 96 + - Initial full release of the Citation File Format specifications 97 + 98 + ## [0.9-RC1] - 2017-10-06 99 + 100 + ### Added 101 + 102 + - Initial pre-release of the specifications for the Citation File Format 103 + 104 + [unreleased]: https://github.com/citation-file-format/citation-file-format/compare/1.2.0...HEAD 105 + [1.2.0]: https://doi.org/10.5281/zenodo.5171937 106 + [1.1.0]: https://doi.org/10.5281/zenodo.4813122 107 + [1.0.3-4]: https://doi.org/10.5281/zenodo.3515946 108 + [1.0.2]: https://doi.org/10.5281/zenodo.1120256 109 + [1.0.1]: https://doi.org/10.5281/zenodo.1117789 110 + [1.0.0]: https://doi.org/10.5281/zenodo.1108269 111 + [0.9-RC1]: https://doi.org/10.5281/zenodo.1003150
+120
project/ocaml-cff/vendor/git/citation-file-format/CITATION.cff
··· 1 + cff-version: 1.2.0 2 + message: "If you use CFF in your research, please cite it using these metadata." 3 + abstract: CITATION.cff files are plain text files with human- and machine-readable citation information for software. Code developers can include them in their repositories to let others know how to correctly cite their software. This is the specification for the Citation File Format. 4 + authors: 5 + - family-names: Druskat 6 + given-names: Stephan 7 + orcid: https://orcid.org/0000-0003-4925-7248 8 + - family-names: Spaaks 9 + given-names: Jurriaan H. 10 + orcid: https://orcid.org/0000-0002-7064-4069 11 + - family-names: Chue Hong 12 + given-names: Neil 13 + orcid: https://orcid.org/0000-0002-8876-7606 14 + - family-names: Haines 15 + given-names: Robert 16 + orcid: https://orcid.org/0000-0002-9538-7919 17 + - family-names: Baker 18 + given-names: James 19 + orcid: https://orcid.org/0000-0002-2682-6922 20 + - family-names: Bliven 21 + given-names: Spencer 22 + orcid: https://orcid.org/0000-0002-1200-1698 23 + email: spencer.bliven@gmail.com 24 + - family-names: Willighagen 25 + given-names: Egon 26 + orcid: https://orcid.org/0000-0001-7542-0286 27 + - family-names: Pérez-Suárez 28 + given-names: David 29 + orcid: https://orcid.org/0000-0003-0784-6909 30 + website: https://dpshelio.github.io 31 + - family-names: Konovalov 32 + given-names: Olexandr 33 + orcid: https://orcid.org/0000-0001-5299-3292 34 + title: Citation File Format 35 + version: 1.2.0 36 + identifiers: 37 + - type: doi 38 + value: 10.5281/zenodo.1003149 39 + description: The concept DOI for the collection containing all versions of the Citation File Format. 40 + - type: doi 41 + value: 10.5281/zenodo.5171937 42 + description: The versioned DOI for the version 1.2.0 of the Citation File Format. 43 + date-released: "2021-08-09" 44 + keywords: 45 + - citation file format 46 + - CFF 47 + - citation files 48 + - software citation 49 + - file format 50 + - YAML 51 + - software sustainability 52 + - research software 53 + - credit 54 + license: "CC-BY-4.0" 55 + doi: 10.5281/zenodo.5171937 56 + references: 57 + - authors: 58 + - family-names: Smith 59 + given-names: Arfon M. 60 + - family-names: Katz 61 + given-names: Daniel S. 62 + - family-names: Niemeyer 63 + given-names: Kyle E. 64 + - name: "FORCE11 Software Citation Working Group" 65 + doi: 10.7717/peerj-cs.86 66 + journal: "PeerJ Computer Science" 67 + month: 9 68 + start: e86 69 + title: "Software citation principles" 70 + type: article 71 + volume: 2 72 + year: 2016 73 + - authors: 74 + - family-names: Druskat 75 + given-names: Stephan 76 + conference: 77 + name: "Workshop on Sustainable Software for Science: Practice and Experiences (WSSSPE5.1)" 78 + doi: 10.6084/m9.figshare.3827058 79 + title: "Track 2 Lightning Talk: Should CITATION files be standardized?" 80 + type: proceedings 81 + year: 2017 82 + - authors: 83 + - family-names: Wilson 84 + given-names: Robin 85 + title: "Encouraging citation of software - introducing CITATION files." 86 + type: blog 87 + url: "https://www.software.ac.uk/blog/2013-09-02-encouraging-citation-software-introducing-citation-files" 88 + year: 2013 89 + - authors: 90 + - family-names: Ben-Kiki 91 + given-names: Oren 92 + - family-names: Evans 93 + given-names: Clark 94 + - family-names: "döt Net" 95 + given-names: Ingy 96 + title: "YAML Ain't Markup Language (YAML) Version 1.2. 3rd Edition, Patched at 2009-10-01." 97 + url: "https://yaml.org/spec/1.2/spec.html" 98 + type: standard 99 + year: 2009 100 + - authors: 101 + - family-names: Hufflen 102 + given-names: Jean-Michel 103 + collection-title: "Proceedings of the 2006 Annual Meeting" 104 + end: 253 105 + month: 11 106 + number: 2 107 + start: 243 108 + title: "Names in bibtex and mlBibTeX" 109 + url: "https://www.tug.org/TUGboat/tb27-2/tb87hufflen.pdf" 110 + type: proceedings 111 + volume: 27 112 + year: 2006 113 + - authors: 114 + - name: GitHub, Inc. 115 + abstract: Good security practices for using GitHub Actions features. 116 + date-published: 2022-09-14 117 + date-accessed: 2022-09-20 118 + title: Security hardening for GitHub Actions 119 + url: https://docs.github.com/en/actions/security-guides/security-hardening-for-github-actions 120 + type: blog
+85
project/ocaml-cff/vendor/git/citation-file-format/CODE_OF_CONDUCT.md
··· 1 + # Code of Conduct 2 + 3 + In the interest of fostering an open and welcoming environment, we as 4 + contributors and maintainers pledge to making participation in our project and 5 + our community a harassment-free experience for everyone, regardless of gender, 6 + gender identity and expression, age, sexual identity and orientation, 7 + disability, physical appearance, body size, race, ethnicity, religion (or lack 8 + thereof), technology choices, level of experience, or other group status. 9 + 10 + ## Standards 11 + 12 + Examples of behavior that contributes to creating a positive environment 13 + include: 14 + 15 + - Using welcoming and inclusive language 16 + - Being respectful of differing viewpoints and experiences 17 + - Gracefully accepting constructive criticism 18 + - Focusing on what is best for the community 19 + - Showing empathy towards other community members 20 + 21 + Examples of unacceptable behavior by participants include: 22 + 23 + - The use of sexualized language or imagery and unwelcome sexual attention or 24 + advances 25 + - Trolling, insulting/derogatory comments, and personal or political attacks 26 + - Public or private harassment 27 + - Publishing others' private information, such as a physical or electronic 28 + address, without explicit permission 29 + - Other conduct which could reasonably be considered inappropriate in a 30 + professional setting 31 + 32 + ## Responsibilities 33 + 34 + Project maintainers are responsible for clarifying the standards of acceptable 35 + behavior and are expected to take appropriate and fair corrective action in 36 + response to any instances of unacceptable behavior. 37 + 38 + Project maintainers have the right and responsibility to remove, edit, or 39 + reject comments, commits, code, wiki edits, issues, and other contributions 40 + that are not aligned to this Code of Conduct, or to ban temporarily or 41 + permanently any contributor for other behaviors that they deem inappropriate, 42 + threatening, offensive, or harmful. 43 + 44 + ## Scope 45 + 46 + This Code of Conduct applies both within project spaces and in public spaces 47 + when an individual is representing the project or its community. Examples of 48 + representing a project or community include using an official project e-mail 49 + address, posting via an official social media account, or acting as an appointed 50 + representative at an online or offline event. Representation of a project may be 51 + further defined and clarified by project maintainers. 52 + 53 + ## Enforcement 54 + 55 + Instances of abusive, harassing, or otherwise unacceptable behavior may be 56 + reported by contacting the [Code of Conduct Committee](#code-of-conduct-committee). All 57 + complaints will be reviewed and investigated and will result in a response that 58 + is deemed necessary and appropriate to the circumstances. The project team is 59 + obligated to maintain confidentiality with regard to the reporter of an incident. 60 + Further details of specific enforcement policies may be posted separately. 61 + 62 + Project maintainers who do not follow or enforce the Code of Conduct in good 63 + faith may face temporary or permanent repercussions as determined by other 64 + members of the project's maintenance team. 65 + 66 + ### Code of Conduct Committee 67 + 68 + The current Code of Conduct Committee consists of: 69 + 70 + - Neil Chue Hong ([N.ChueHong@epcc.ed.ac.uk](mailto:N.ChueHong@epcc.ed.ac.uk)) 71 + - Robert Haines ([robert.haines@manchester.ac.uk](mailto:robert.haines@manchester.ac.uk)) 72 + 73 + You may contact members individually or collectively. 74 + Note that if you contact members individually, other members may still be involved in resolving the issue. 75 + If members are subject of a report themselves, they will not be involved in the resolution of the issue as members of the Code of Conduct Committee, but may be addressed by other members as reported subjects to resolve the issue. 76 + 77 + ## Attribution 78 + 79 + This Code of Conduct is adapted from the 80 + [Contributor Covenant](https://www.contributor-covenant.org/), 81 + version 1.4, available at 82 + https://www.contributor-covenant.org/version/1/4/code-of-conduct.html, 83 + and the [WSSSPE5.1](http://wssspe.researchcomputing.org.uk/wssspe5-1/) 84 + Code of Conduct, available at 85 + http://wssspe.researchcomputing.org.uk/wssspe5-1/wssspe5-1-code-of-conduct/.
+98
project/ocaml-cff/vendor/git/citation-file-format/CONTRIBUTING.md
··· 1 + # Introduction 2 + 3 + **Thank you** for considering to contribute to the **Citation File Format (CFF) and its schema**! 4 + If you intend to contribute to another part of the Citation File Format project, 5 + for example a specific software package for working with CFF files, 6 + please contribute to the respective repository ([list of repositories in the `citation-file-format` GitHub organization](https://github.com/orgs/citation-file-format/repositories)). 7 + 8 + **Please follow these guidelines.** Their purpose is to make both contributing and accepting contributions easier for all parties involved. 9 + 10 + There are many **ways to contribute**, e.g.: 11 + 12 + - Tell a friend or colleague about the Citation File Format, or tweet about it 13 + - Write blog posts, tutorials, etc. about the Citation File Format 14 + - Review the format and its schema and documentation 15 + - Improve wording in any prose output, including the specifications 16 + - Create a new, better version of the schema and specifications 17 + - Improve automated tests, continuous integration, documentation, etc. 18 + 19 + # Ground Rules 20 + 21 + Your contribution to CFF is valued, and it should be an enjoyable experience. 22 + To ensure this, there is the CFF 23 + [Code of Conduct](https://github.com/citation-file-format/citation-file-format/blob/master/CODE_OF_CONDUCT.md), which you are required to follow. 24 + 25 + Please always start any contribution that will change the contents of this repository by [creating a new issue](https://github.com/citation-file-format/citation-file-format/issues/new/choose). 26 + This way, 27 + 28 + - you can make sure that you don't invest your valuable time in something that may not be merged; 29 + - we can make sure that your contribution is something that will improve CFF, 30 + is in scope, 31 + and aligns with the roadmap for the Citation File Format. 32 + 33 + # Your First Contribution 34 + 35 + If you are unsure where to begin with your contribution to CFF, have a look at the 36 + [open issues in this repository](https://github.com/citation-file-format/citation-file-format/issues), 37 + and see if you can identify one that you would like to work on. 38 + 39 + If you have never contributed to an open source project, you may find this tutorial helpful: 40 + [How to Contribute to an Open Source Project on GitHub](https://app.egghead.io/playlists/how-to-contribute-to-an-open-source-project-on-github). 41 + 42 + # Getting started 43 + 44 + This is the workflow for contributions to this repository: 45 + 46 + 1. [Create a new issue](https://github.com/citation-file-format/citation-file-format/issues/new/choose) 47 + to discuss the changes you want to make with the maintainers and community 48 + 2. Fork the repository 49 + 3. Create a branch in your fork of the repository: 50 + - If you want to make changes to the format and its schema: checkout `develop` and create your branch from it. 51 + - If you want to make changes that don't affect the format and its schema, like fixing typos or formatting: checkout `main` and create your branch from it. 52 + - When in doubt which branch to fork from, ask in the issue you have created. 53 + 4. Make changes in the new branch in your fork 54 + 5. Take note of the [code of conduct](https://github.com/citation-file-format/citation-file-format/blob/main/CODE_OF_CONDUCT.md) 55 + 6. Create a pull request 56 + 7. Address any comments that have come up during review 57 + 8. If and when your pull request has been merged, you can delete your branch (or the whole forked repository) 58 + 59 + This workflow is loosely based on GitHub flow, and you can find more information in the [GitHub flow documentation](https://docs.github.com/en/get-started/quickstart/github-flow). 60 + 61 + ## Working with examples and tests 62 + 63 + There is a collection of test `CITATION.cff` files in the `examples` directory. 64 + It may be a good idea to add a test if you modify the specification, 65 + or if you discover a part of the specification that is not covered 66 + by tests. If you modify anything in the `tests` or `examples` directory, it is 67 + advised to run these tests locally on your computer prior to submitting 68 + a pull request. However, if that's not possible, you still can submit 69 + the pull request and later check the status of the tests for your 70 + pull requests on GitHub. Please see [`examples/README.md`](examples/README.md) file for further 71 + details about tests and instructions how to run them locally. 72 + 73 + <!-- 74 + TODO Include a link to README.dev.md here once it exists! 75 + See https://github.com/citation-file-format/citation-file-format/issues/301 76 + --> 77 + 78 + # How to submit an issue 79 + 80 + If you find a security vulnerability anywhere, do NOT open an issue. Email *cff- 81 + security /at\ sdruskat \dot/ net* instead. 82 + 83 + This repository uses issue templates, so that when 84 + you create a new issue, you can simply fill it in and everything that is 85 + needed to work on your issue will be there. 86 + 87 + If no issue template exists for your specific case, please use the template for "Any other issue". 88 + 89 + # How to suggest a feature or enhancement 90 + 91 + See [How to submit an issue](#how-to-submit-an-issue). 92 + 93 + # FAQ 94 + 95 + - **These guidelines do not address aspect XYZ! What should I do now?** 96 + 97 + Please [submit an issue](https://github.com/citation-file-format/citation-file-format/issues/new/choose), 98 + asking for clarification and addition to the guidelines.
+395
project/ocaml-cff/vendor/git/citation-file-format/LICENSE
··· 1 + Creative Commons Attribution 4.0 International Public License 2 + 3 + ======================================================================= 4 + 5 + Creative Commons Corporation ("Creative Commons") is not a law firm and 6 + does not provide legal services or legal advice. Distribution of 7 + Creative Commons public licenses does not create a lawyer-client or 8 + other relationship. Creative Commons makes its licenses and related 9 + information available on an "as-is" basis. Creative Commons gives no 10 + warranties regarding its licenses, any material licensed under their 11 + terms and conditions, or any related information. Creative Commons 12 + disclaims all liability for damages resulting from their use to the 13 + fullest extent possible. 14 + 15 + Using Creative Commons Public Licenses 16 + 17 + Creative Commons public licenses provide a standard set of terms and 18 + conditions that creators and other rights holders may use to share 19 + original works of authorship and other material subject to copyright 20 + and certain other rights specified in the public license below. The 21 + following considerations are for informational purposes only, are not 22 + exhaustive, and do not form part of our licenses. 23 + 24 + Considerations for licensors: Our public licenses are 25 + intended for use by those authorized to give the public 26 + permission to use material in ways otherwise restricted by 27 + copyright and certain other rights. Our licenses are 28 + irrevocable. Licensors should read and understand the terms 29 + and conditions of the license they choose before applying it. 30 + Licensors should also secure all rights necessary before 31 + applying our licenses so that the public can reuse the 32 + material as expected. Licensors should clearly mark any 33 + material not subject to the license. This includes other CC- 34 + licensed material, or material used under an exception or 35 + limitation to copyright. More considerations for licensors: 36 + wiki.creativecommons.org/Considerations_for_licensors 37 + 38 + Considerations for the public: By using one of our public 39 + licenses, a licensor grants the public permission to use the 40 + licensed material under specified terms and conditions. If 41 + the licensor's permission is not necessary for any reason--for 42 + example, because of any applicable exception or limitation to 43 + copyright--then that use is not regulated by the license. Our 44 + licenses grant only permissions under copyright and certain 45 + other rights that a licensor has authority to grant. Use of 46 + the licensed material may still be restricted for other 47 + reasons, including because others have copyright or other 48 + rights in the material. A licensor may make special requests, 49 + such as asking that all changes be marked or described. 50 + Although not required by our licenses, you are encouraged to 51 + respect those requests where reasonable. More_considerations 52 + for the public: 53 + wiki.creativecommons.org/Considerations_for_licensees 54 + 55 + ======================================================================= 56 + 57 + Creative Commons Attribution 4.0 International Public License 58 + 59 + By exercising the Licensed Rights (defined below), You accept and agree 60 + to be bound by the terms and conditions of this Creative Commons 61 + Attribution 4.0 International Public License ("Public License"). To the 62 + extent this Public License may be interpreted as a contract, You are 63 + granted the Licensed Rights in consideration of Your acceptance of 64 + these terms and conditions, and the Licensor grants You such rights in 65 + consideration of benefits the Licensor receives from making the 66 + Licensed Material available under these terms and conditions. 67 + 68 + 69 + Section 1 -- Definitions. 70 + 71 + a. Adapted Material means material subject to Copyright and Similar 72 + Rights that is derived from or based upon the Licensed Material 73 + and in which the Licensed Material is translated, altered, 74 + arranged, transformed, or otherwise modified in a manner requiring 75 + permission under the Copyright and Similar Rights held by the 76 + Licensor. For purposes of this Public License, where the Licensed 77 + Material is a musical work, performance, or sound recording, 78 + Adapted Material is always produced where the Licensed Material is 79 + synched in timed relation with a moving image. 80 + 81 + b. Adapter's License means the license You apply to Your Copyright 82 + and Similar Rights in Your contributions to Adapted Material in 83 + accordance with the terms and conditions of this Public License. 84 + 85 + c. Copyright and Similar Rights means copyright and/or similar rights 86 + closely related to copyright including, without limitation, 87 + performance, broadcast, sound recording, and Sui Generis Database 88 + Rights, without regard to how the rights are labeled or 89 + categorized. For purposes of this Public License, the rights 90 + specified in Section 2(b)(1)-(2) are not Copyright and Similar 91 + Rights. 92 + 93 + d. Effective Technological Measures means those measures that, in the 94 + absence of proper authority, may not be circumvented under laws 95 + fulfilling obligations under Article 11 of the WIPO Copyright 96 + Treaty adopted on December 20, 1996, and/or similar international 97 + agreements. 98 + 99 + e. Exceptions and Limitations means fair use, fair dealing, and/or 100 + any other exception or limitation to Copyright and Similar Rights 101 + that applies to Your use of the Licensed Material. 102 + 103 + f. Licensed Material means the artistic or literary work, database, 104 + or other material to which the Licensor applied this Public 105 + License. 106 + 107 + g. Licensed Rights means the rights granted to You subject to the 108 + terms and conditions of this Public License, which are limited to 109 + all Copyright and Similar Rights that apply to Your use of the 110 + Licensed Material and that the Licensor has authority to license. 111 + 112 + h. Licensor means the individual(s) or entity(ies) granting rights 113 + under this Public License. 114 + 115 + i. Share means to provide material to the public by any means or 116 + process that requires permission under the Licensed Rights, such 117 + as reproduction, public display, public performance, distribution, 118 + dissemination, communication, or importation, and to make material 119 + available to the public including in ways that members of the 120 + public may access the material from a place and at a time 121 + individually chosen by them. 122 + 123 + j. Sui Generis Database Rights means rights other than copyright 124 + resulting from Directive 96/9/EC of the European Parliament and of 125 + the Council of 11 March 1996 on the legal protection of databases, 126 + as amended and/or succeeded, as well as other essentially 127 + equivalent rights anywhere in the world. 128 + 129 + k. You means the individual or entity exercising the Licensed Rights 130 + under this Public License. Your has a corresponding meaning. 131 + 132 + 133 + Section 2 -- Scope. 134 + 135 + a. License grant. 136 + 137 + 1. Subject to the terms and conditions of this Public License, 138 + the Licensor hereby grants You a worldwide, royalty-free, 139 + non-sublicensable, non-exclusive, irrevocable license to 140 + exercise the Licensed Rights in the Licensed Material to: 141 + 142 + a. reproduce and Share the Licensed Material, in whole or 143 + in part; and 144 + 145 + b. produce, reproduce, and Share Adapted Material. 146 + 147 + 2. Exceptions and Limitations. For the avoidance of doubt, where 148 + Exceptions and Limitations apply to Your use, this Public 149 + License does not apply, and You do not need to comply with 150 + its terms and conditions. 151 + 152 + 3. Term. The term of this Public License is specified in Section 153 + 6(a). 154 + 155 + 4. Media and formats; technical modifications allowed. The 156 + Licensor authorizes You to exercise the Licensed Rights in 157 + all media and formats whether now known or hereafter created, 158 + and to make technical modifications necessary to do so. The 159 + Licensor waives and/or agrees not to assert any right or 160 + authority to forbid You from making technical modifications 161 + necessary to exercise the Licensed Rights, including 162 + technical modifications necessary to circumvent Effective 163 + Technological Measures. For purposes of this Public License, 164 + simply making modifications authorized by this Section 2(a) 165 + (4) never produces Adapted Material. 166 + 167 + 5. Downstream recipients. 168 + 169 + a. Offer from the Licensor -- Licensed Material. Every 170 + recipient of the Licensed Material automatically 171 + receives an offer from the Licensor to exercise the 172 + Licensed Rights under the terms and conditions of this 173 + Public License. 174 + 175 + b. No downstream restrictions. You may not offer or impose 176 + any additional or different terms or conditions on, or 177 + apply any Effective Technological Measures to, the 178 + Licensed Material if doing so restricts exercise of the 179 + Licensed Rights by any recipient of the Licensed 180 + Material. 181 + 182 + 6. No endorsement. Nothing in this Public License constitutes or 183 + may be construed as permission to assert or imply that You 184 + are, or that Your use of the Licensed Material is, connected 185 + with, or sponsored, endorsed, or granted official status by, 186 + the Licensor or others designated to receive attribution as 187 + provided in Section 3(a)(1)(A)(i). 188 + 189 + b. Other rights. 190 + 191 + 1. Moral rights, such as the right of integrity, are not 192 + licensed under this Public License, nor are publicity, 193 + privacy, and/or other similar personality rights; however, to 194 + the extent possible, the Licensor waives and/or agrees not to 195 + assert any such rights held by the Licensor to the limited 196 + extent necessary to allow You to exercise the Licensed 197 + Rights, but not otherwise. 198 + 199 + 2. Patent and trademark rights are not licensed under this 200 + Public License. 201 + 202 + 3. To the extent possible, the Licensor waives any right to 203 + collect royalties from You for the exercise of the Licensed 204 + Rights, whether directly or through a collecting society 205 + under any voluntary or waivable statutory or compulsory 206 + licensing scheme. In all other cases the Licensor expressly 207 + reserves any right to collect such royalties. 208 + 209 + 210 + Section 3 -- License Conditions. 211 + 212 + Your exercise of the Licensed Rights is expressly made subject to the 213 + following conditions. 214 + 215 + a. Attribution. 216 + 217 + 1. If You Share the Licensed Material (including in modified 218 + form), You must: 219 + 220 + a. retain the following if it is supplied by the Licensor 221 + with the Licensed Material: 222 + 223 + i. identification of the creator(s) of the Licensed 224 + Material and any others designated to receive 225 + attribution, in any reasonable manner requested by 226 + the Licensor (including by pseudonym if 227 + designated); 228 + 229 + ii. a copyright notice; 230 + 231 + iii. a notice that refers to this Public License; 232 + 233 + iv. a notice that refers to the disclaimer of 234 + warranties; 235 + 236 + v. a URI or hyperlink to the Licensed Material to the 237 + extent reasonably practicable; 238 + 239 + b. indicate if You modified the Licensed Material and 240 + retain an indication of any previous modifications; and 241 + 242 + c. indicate the Licensed Material is licensed under this 243 + Public License, and include the text of, or the URI or 244 + hyperlink to, this Public License. 245 + 246 + 2. You may satisfy the conditions in Section 3(a)(1) in any 247 + reasonable manner based on the medium, means, and context in 248 + which You Share the Licensed Material. For example, it may be 249 + reasonable to satisfy the conditions by providing a URI or 250 + hyperlink to a resource that includes the required 251 + information. 252 + 253 + 3. If requested by the Licensor, You must remove any of the 254 + information required by Section 3(a)(1)(A) to the extent 255 + reasonably practicable. 256 + 257 + 4. If You Share Adapted Material You produce, the Adapter's 258 + License You apply must not prevent recipients of the Adapted 259 + Material from complying with this Public License. 260 + 261 + 262 + Section 4 -- Sui Generis Database Rights. 263 + 264 + Where the Licensed Rights include Sui Generis Database Rights that 265 + apply to Your use of the Licensed Material: 266 + 267 + a. for the avoidance of doubt, Section 2(a)(1) grants You the right 268 + to extract, reuse, reproduce, and Share all or a substantial 269 + portion of the contents of the database; 270 + 271 + b. if You include all or a substantial portion of the database 272 + contents in a database in which You have Sui Generis Database 273 + Rights, then the database in which You have Sui Generis Database 274 + Rights (but not its individual contents) is Adapted Material; and 275 + 276 + c. You must comply with the conditions in Section 3(a) if You Share 277 + all or a substantial portion of the contents of the database. 278 + 279 + For the avoidance of doubt, this Section 4 supplements and does not 280 + replace Your obligations under this Public License where the Licensed 281 + Rights include other Copyright and Similar Rights. 282 + 283 + 284 + Section 5 -- Disclaimer of Warranties and Limitation of Liability. 285 + 286 + a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE 287 + EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS 288 + AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF 289 + ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, 290 + IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, 291 + WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR 292 + PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, 293 + ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT 294 + KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT 295 + ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. 296 + 297 + b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE 298 + TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, 299 + NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, 300 + INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, 301 + COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR 302 + USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN 303 + ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR 304 + DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR 305 + IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. 306 + 307 + c. The disclaimer of warranties and limitation of liability provided 308 + above shall be interpreted in a manner that, to the extent 309 + possible, most closely approximates an absolute disclaimer and 310 + waiver of all liability. 311 + 312 + 313 + Section 6 -- Term and Termination. 314 + 315 + a. This Public License applies for the term of the Copyright and 316 + Similar Rights licensed here. However, if You fail to comply with 317 + this Public License, then Your rights under this Public License 318 + terminate automatically. 319 + 320 + b. Where Your right to use the Licensed Material has terminated under 321 + Section 6(a), it reinstates: 322 + 323 + 1. automatically as of the date the violation is cured, provided 324 + it is cured within 30 days of Your discovery of the 325 + violation; or 326 + 327 + 2. upon express reinstatement by the Licensor. 328 + 329 + For the avoidance of doubt, this Section 6(b) does not affect any 330 + right the Licensor may have to seek remedies for Your violations 331 + of this Public License. 332 + 333 + c. For the avoidance of doubt, the Licensor may also offer the 334 + Licensed Material under separate terms or conditions or stop 335 + distributing the Licensed Material at any time; however, doing so 336 + will not terminate this Public License. 337 + 338 + d. Sections 1, 5, 6, 7, and 8 survive termination of this Public 339 + License. 340 + 341 + 342 + Section 7 -- Other Terms and Conditions. 343 + 344 + a. The Licensor shall not be bound by any additional or different 345 + terms or conditions communicated by You unless expressly agreed. 346 + 347 + b. Any arrangements, understandings, or agreements regarding the 348 + Licensed Material not stated herein are separate from and 349 + independent of the terms and conditions of this Public License. 350 + 351 + 352 + Section 8 -- Interpretation. 353 + 354 + a. For the avoidance of doubt, this Public License does not, and 355 + shall not be interpreted to, reduce, limit, restrict, or impose 356 + conditions on any use of the Licensed Material that could lawfully 357 + be made without permission under this Public License. 358 + 359 + b. To the extent possible, if any provision of this Public License is 360 + deemed unenforceable, it shall be automatically reformed to the 361 + minimum extent necessary to make it enforceable. If the provision 362 + cannot be reformed, it shall be severed from this Public License 363 + without affecting the enforceability of the remaining terms and 364 + conditions. 365 + 366 + c. No term or condition of this Public License will be waived and no 367 + failure to comply consented to unless expressly agreed to by the 368 + Licensor. 369 + 370 + d. Nothing in this Public License constitutes or may be interpreted 371 + as a limitation upon, or waiver of, any privileges and immunities 372 + that apply to the Licensor or You, including from the legal 373 + processes of any jurisdiction or authority. 374 + 375 + 376 + ======================================================================= 377 + 378 + Creative Commons is not a party to its public 379 + licenses. Notwithstanding, Creative Commons may elect to apply one of 380 + its public licenses to material it publishes and in those instances 381 + will be considered the “Licensor.” The text of the Creative Commons 382 + public licenses is dedicated to the public domain under the CC0 Public 383 + Domain Dedication. Except for the limited purpose of indicating that 384 + material is shared under a Creative Commons public license or as 385 + otherwise permitted by the Creative Commons policies published at 386 + creativecommons.org/policies, Creative Commons does not authorize the 387 + use of the trademark "Creative Commons" or any other trademark or logo 388 + of Creative Commons without its prior written consent including, 389 + without limitation, in connection with any unauthorized modifications 390 + to any of its public licenses or any other arrangements, 391 + understandings, or agreements concerning use of licensed material. For 392 + the avoidance of doubt, this paragraph does not form part of the 393 + public licenses. 394 + 395 + Creative Commons may be contacted at creativecommons.org.
+158
project/ocaml-cff/vendor/git/citation-file-format/README.md
··· 1 + # Citation File Format 2 + 3 + [![Build Status](https://github.com/citation-file-format/citation-file-format/actions/workflows/testing.yml/badge.svg?branch=main)](https://github.com/citation-file-format/citation-file-format/actions/workflows/testing.yml?query=branch%3Amain) 4 + [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.1003149.svg)](https://doi.org/10.5281/zenodo.1003149) 5 + [![License: CC BY 4.0](https://img.shields.io/badge/License-CC%20BY%204.0-lightgrey.svg)](https://creativecommons.org/licenses/by/4.0/) 6 + [![Project homepage](https://img.shields.io/badge/Project%20homepage-citation--file--format.github.io-ff0080)](https://citation-file-format.github.io) 7 + 8 + The Citation File Format lets you provide citation metadata for software or datasets 9 + in plaintext files that are easy to read by both humans and machines. 10 + 11 + ## Structure 12 + 13 + You can specify citation metadata for your software (or dataset) in a file named `CITATION.cff`. 14 + This is what a typical `CITATION.cff` file may look like for research software: 15 + 16 + ```yaml 17 + cff-version: 1.2.0 18 + message: If you use this software, please cite it using these metadata. 19 + title: My Research Software 20 + abstract: This is my awesome research software. It does many things. 21 + authors: 22 + - family-names: Druskat 23 + given-names: Stephan 24 + orcid: "https://orcid.org/1234-5678-9101-1121" 25 + - name: "The Research Software project" 26 + version: 0.11.2 27 + date-released: "2021-07-18" 28 + identifiers: 29 + - description: This is the collection of archived snapshots of all versions of My Research Software 30 + type: doi 31 + value: "10.5281/zenodo.123456" 32 + - description: This is the archived snapshot of version 0.11.2 of My Research Software 33 + type: doi 34 + value: "10.5281/zenodo.123457" 35 + license: Apache-2.0 36 + repository-code: "https://github.com/citation-file-format/my-research-software" 37 + ``` 38 + 39 + In addition, the Citation File Format allows you to 40 + 41 + - provide references to works that your software or dataset builds on ([see here for more info](schema-guide.md#referencing-other-work)); 42 + - ask people to cite a different, related work instead of the software or dataset itself ([see here for more info](schema-guide.md#credit-redirection)). 43 + 44 + ## Format specifications :books: 45 + 46 + **You can find the complete format specifications in the [Guide to the Citation File Format schema](schema-guide.md).** 47 + 48 + ## Why should I add a `CITATION.cff` file to my repository? :bulb: 49 + 50 + When you do this, great things may happen: 51 + 52 + 1. Users of your software can easily cite it using the metadata from `CITATION.cff`! 53 + 2. If your repository is hosted on GitHub, they will [show the citation information in the sidebar](https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-citation-files), which makes it easy for visitors to cite your software or dataset correctly. 54 + 3. When you publish your software on Zenodo via the [GitHub-Zenodo integration](https://docs.github.com/en/repositories/archiving-a-github-repository/referencing-and-citing-content), they will use the metadata from your `CITATION.cff` file. 55 + 4. People can import the correct reference to your software into the [Zotero](https://www.zotero.org) reference manager via a [browser plugin](https://www.zotero.org/download/). 56 + 57 + ## Creation :heavy_plus_sign: 58 + 59 + To create a `CITATION.cff` file, you can 60 + 61 + - use the [**cffinit** website](https://citation-file-format.github.io/cff-initializer-javascript/#/), 62 + - copy and paste the [example snippet](#structure), and adapt it to your needs, or 63 + - create a new file called `CITATION.cff` using the *Add file* button on GitHub, and use the template they provide. 64 + 65 + ## Validation :heavy_check_mark: 66 + 67 + You can validate your `CITATION.cff` file on the command line with the [`cffconvert` Python package](https://pypi.org/project/cffconvert/): 68 + 69 + ```shell 70 + # Install cffconvert with pip in user space 71 + python3 -m pip install --user cffconvert 72 + 73 + # Validate your CFF file 74 + cffconvert --validate 75 + ``` 76 + 77 + If you get a Traceback with error messages, look for the relevant validation error and fix it. 78 + If the output is very long, it may help if you search it for lines starting with `jsonschema.exceptions.ValidationError`. 79 + 80 + If you prefer to use Docker, you can use the [`cffconvert` Docker image](https://hub.docker.com/r/citationcff/cffconvert): 81 + 82 + ```bash 83 + cd <directory-containing-your-CITATION.cff> 84 + docker run --rm -v ${PWD}:/app citationcff/cffconvert --validate 85 + ``` 86 + 87 + <!-- Later, this should link to tutorials --> 88 + 89 + ## Tools to work with `CITATION.cff` files :wrench: 90 + 91 + There is tooling available to work with `CITATION.cff` files to do different things: 92 + create new files, edit existing files, validate existing files, convert files from the Citation File Format into another format. 93 + The following table gives an overview of the tools that we know about. If there is a tool missing from this table, please [open a new issue](https://github.com/citation-file-format/citation-file-format/issues/new/choose) and let us know. 94 + 95 + | | Creation | Editing/Updating | Validation | Conversion | 96 + | -------------- | ------------------------------------------------------------------------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | 97 + | Command line | | | • [cffconvert](#validation-heavy_check_mark) | • [cffconvert](https://pypi.org/project/cffconvert/)<br> • [bibtex-to-cff](https://github.com/monperrus/bibtexbrowser/)<br>• [cff-from-621](https://pypi.org/project/cff-from-621/)<br>• [openCARP-CI](https://git.opencarp.org/openCARP/openCARP-CI/-/tree/master/#create_cff) | 98 + | GitHub Actions | | | [cff-validator](https://github.com/marketplace/actions/cff-validator) | • [cffconvert](https://github.com/marketplace/actions/cffconvert)<br>• [codemeta2cff](https://github.com/caltechlibrary/codemeta2cff) | 99 + | GitHub Bot | | | [#238](https://github.com/citation-file-format/citation-file-format/issues/238) | | 100 + | Docker | | | [cffconvert Docker image](#validation-heavy_check_mark) | [cffconvert Docker image](https://hub.docker.com/r/citationcff/cffconvert) | 101 + | Go | | | | • [datatools/codemeta2cff](https://github.com/caltechlibrary/datatools/) | 102 + | Haskell | | • [cffreference](https://github.com/kevinmatthes/cffreference) | | | 103 + | Java | • [CFF Maven plugin](https://github.com/hexatomic/cff-maven-plugin) | • [CFF Maven plugin](https://github.com/hexatomic/cff-maven-plugin) | | • [CFF Maven plugin](https://github.com/hexatomic/cff-maven-plugin) | 104 + | JavaScript | | | | • [Citation.js](https://citation.js.org/) [plugin](https://www.npmjs.com/package/@citation-js/plugin-software-formats) | 105 + | Julia | | | • [Bibliography.jl](https://github.com/Humans-of-Julia/Bibliography.jl) | • [Bibliography.jl](https://github.com/Humans-of-Julia/Bibliography.jl) | 106 + | PHP | | | | • [bibtex-to-cff](https://github.com/monperrus/bibtexbrowser/) | 107 + | Python | | • [cff2toml](https://github.com/willynilly/cff2toml)<br> • [doi2cff](https://github.com/citation-file-format/doi2cff)<br> • [updateCitation](https://github.com/hunterhogan/updateCitation) | • [cffconvert](#validation-heavy_check_mark) | • [cff-from-621](https://pypi.org/project/cff-from-621/)<br>• [cff2toml](https://github.com/willynilly/cff2toml)<br>• [cffconvert](https://github.com/citation-file-format/cff-converter-python)<br>• [doi2cff](https://github.com/citation-file-format/doi2cff)<br>• [openCARP-CI](https://git.opencarp.org/openCARP/openCARP-CI/-/tree/master/#create_cff)<br>• [py_bibtex_to_cff_converter](https://github.com/vdplasthijs/py_bibtex_to_cff_converter) | 108 + | R | | | • [cffr](https://CRAN.R-project.org/package=cffr) | • [citation](https://cran.r-project.org/web/packages/citation/)<br>• [r2cff](https://github.com/ocbe-uio/RCFF)<br>• [handlr](https://github.com/ropensci/handlr)<br>• [cffr](https://CRAN.R-project.org/package=cffr) | 109 + | Ruby | • [ruby-cff](https://github.com/citation-file-format/ruby-cff) | • [ruby-cff](https://github.com/citation-file-format/ruby-cff) | • [ruby-cff](https://github.com/citation-file-format/ruby-cff) | • [ruby-cff](https://github.com/citation-file-format/ruby-cff) | 110 + | Rust | • [Aeruginous](https://github.com/kevinmatthes/aeruginous-rs) | • [Aeruginous](https://github.com/kevinmatthes/aeruginous-rs) | | • [citeworks](https://github.com/passcod/citeworks) | 111 + | TypeScript | | | | [#28](https://github.com/citation-file-format/citation-file-format/issues/28#issuecomment-892105342) | 112 + | Website | • [cffinit](https://citation-file-format.github.io/cff-initializer-javascript/)<br>• [CFF generator](https://citation-js.github.io/cff-generator/) | | | | 113 + 114 + ## Maintainers :nerd_face: 115 + 116 + The Citation File Format schema is maintained by 117 + 118 + - Stephan Druskat ([@sdruskat](https://github.com/sdruskat/)) 119 + - Jurriaan H. Spaaks ([@jspaaks](https://github.com/jspaaks/)) 120 + 121 + ## Contributing :handshake: 122 + 123 + The Citation File Format is a collaborative project and we welcome suggestions and contributions. We hope one of the invitations below works for you, but if not, please let us know! 124 + 125 + :running: **I'm busy, I only have 1 minute** 126 + - Tell a friend about the Citation File Format, or tweet about it! 127 + - Give the project a star :star:! 128 + 129 + :hourglass_flowing_sand: **I've got 10 minutes - tell me what I should do** 130 + - Create a `CITATION.cff` file for your repository. 131 + - Suggest ideas for how you would like to use the Citation File Format, or for an improvement to the format or its tooling. 132 + - If you know how to validate `CITATION.cff` files, help someone with a validation problem and look at the [issues labeled ![GitHub labels](https://img.shields.io/github/labels/citation-file-format/citation-file-format/validation)](https://github.com/citation-file-format/citation-file-format/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22+label%3Avalidation) 133 + 134 + :computer: **I've got a few hours to work on this** 135 + - Help create tooling for the community by looking at the [issues labeled ![GitHub labels](https://img.shields.io/github/labels/citation-file-format/citation-file-format/tooling)](https://github.com/citation-file-format/citation-file-format/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22+label%3Atooling) 136 + 137 + :tada: **I want to help grow the community** 138 + - Write a blog post or news item for your own community. 139 + - Organise a hack event or workshop to help others use or improve the Citation File Format. 140 + 141 + Please read the more detailed [contributing guidelines](CONTRIBUTING.md) and [open a GitHub issue](https://github.com/citation-file-format/citation-file-format/issues) to suggest a new idea or let us know about bugs. Please put up pull requests for changes to the format and schema against the `develop` branch! 142 + 143 + ## License :balance_scale: 144 + 145 + Copyright © 2016 - 2023. The Citation File Format Contributors 146 + 147 + This work is licensed under a [Creative Commons Attribution 4.0 International (CC-BY-4.0)](https://creativecommons.org/licenses/by/4.0/legalcode) license. 148 + 149 + ## Acknowledgments :pray: 150 + 151 + **We'd like to thank everyone who has contributed to the Citation File Format!** 152 + They are listed in the [`CITATION.cff`](CITATION.cff) file for this repository. Please open an issue if you find that you are missing from the file. 153 + 154 + We gratefully acknowledge support from: 155 + 156 + - The [Institute for Software Technology](https://www.dlr.de/en/sc) of the [German Aerospace Center (DLR)](https://www.dlr.de/en/) 157 + - The [Netherlands eScience Center](https://www.esciencecenter.nl) 158 + - The [Software Sustainability Institute](https://software.ac.uk/)
+24
project/ocaml-cff/vendor/git/citation-file-format/examples/1.0.3/fail-additional-key/CITATION.cff
··· 1 + cff-version: 1.0.3 2 + message: "If you use this software, please cite the following." 3 + authors: 4 + - family-names: Druskat 5 + given-names: Stephan 6 + orcid: https://orcid.org/0000-0003-4925-7248 7 + title: My Research Tool 8 + extra: 45 9 + version: 1.0.4 10 + doi: 10.5281/zenodo.1234 11 + date-released: 2017-12-18 12 + references: 13 + - type: art 14 + authors: 15 + - family-names: Picasso 16 + given-names: Pablo 17 + title: Guernica 18 + year: 1937 19 + medium: Oil on canvas 20 + format: 349.3cm x 776.6cm 21 + location: 22 + name: Museo Reina Sofia 23 + city: Madrid 24 + country: ES
+493
project/ocaml-cff/vendor/git/citation-file-format/examples/1.0.3/key-complete/CITATION.cff
··· 1 + ############################ 2 + # DO NOT USE FOR CITATION! # 3 + ############################ 4 + # This is a key-complete # 5 + # test file for validating # 6 + # CFF Core schema 1.0.3 # 7 + ############################ 8 + 9 + cff-version: 1.0.3 10 + 11 + message: If you use this software, please cite it as below. 12 + 13 + abstract: "This is an awesome piece of research software!" 14 + 15 + authors: 16 + # A person 17 + - family-names: Real Person 18 + given-names: One Truly 19 + name-particle: van der 20 + name-suffix: IV 21 + affiliation: Excellent University, Niceplace, Arcadia 22 + address: 22 Acacia Avenue 23 + city: Citationburgh 24 + region: Renfrewshire 25 + post-code: C13 7X7 26 + country: GB 27 + orcid: https://orcid.org/0000-0001-2345-6789 28 + email: project@entity.com 29 + tel: +44(0)141-323 4567 30 + fax: +44(0)141-323 45678 31 + website: https://www.entity-project-team.io 32 + # An entity 33 + - name: Entity Project Team Conference entity 34 + address: 22 Acacia Avenue 35 + city: Citationburgh 36 + region: Renfrewshire 37 + post-code: C13 7X7 38 + country: GB 39 + orcid: https://orcid.org/0000-0001-2345-6789 40 + email: project@entity.com 41 + tel: +44(0)141-323 4567 42 + fax: +44(0)141-323 45678 43 + website: https://www.entity-project-team.io 44 + date-start: 2017-01-01 45 + date-end: 2017-01-31 46 + location: The team garage 47 + 48 + commit: 156a04c74a8a79d40c5d705cddf9d36735feab4d 49 + 50 + contact: 51 + # A person 52 + - family-names: Real Person 53 + given-names: One Truly 54 + name-particle: van der 55 + name-suffix: IV 56 + affiliation: Excellent University, Niceplace, Arcadia 57 + address: 22 Acacia Avenue 58 + city: Citationburgh 59 + region: Renfrewshire 60 + post-code: C13 7X7 61 + country: GB 62 + orcid: https://orcid.org/0000-0001-2345-6789 63 + email: project@entity.com 64 + tel: +44(0)141-323 4567 65 + fax: +44(0)141-323 45678 66 + website: https://www.entity-project-team.io 67 + # An entity 68 + - name: Entity Project Team Conference entity 69 + address: 22 Acacia Avenue 70 + city: Citationburgh 71 + region: Renfrewshire 72 + post-code: C13 7X7 73 + country: GB 74 + orcid: https://orcid.org/0000-0001-2345-6789 75 + email: project@entity.com 76 + tel: +44(0)141-323 4567 77 + fax: +44(0)141-323 45678 78 + website: https://www.entity-project-team.io 79 + date-start: 2017-01-01 80 + date-end: 2017-01-31 81 + location: The team garage 82 + 83 + date-released: 2017-12-11 84 + 85 + doi: 10.5281/zenodo.1003150 86 + 87 + keywords: 88 + - One 89 + - Two 90 + - Three 91 + - "4" 92 + 93 + license: CC-BY-SA-4.0 94 + 95 + license-url: https://spdx.org/licenses/CC-BY-SA-4.0.html#licenseText 96 + 97 + repository: https://www.example.com/foo/?bar=baz&inga=42&quux 98 + 99 + repository-code: http://foo.com/blah_(wikipedia)_blah#cite-1 100 + 101 + repository-artifact: https://files.pythonhosted.org/packages/0a/84/10507b69a07768bc16981184b4d147a0fc84b71fbf35c03bafc8dcced8e1/cffconvert-1.3.3.tar.gz 102 + 103 + title: Citation File Format 1.0.0 104 + 105 + url: http://userid:password@example.com:8080/ 106 + 107 + version: 1.0.0 108 + 109 + references: 110 + - type: book 111 + title: Book Title 112 + abbreviation: Abbr 113 + abstract: Description of the book. 114 + collection-doi: 10.5281/zenodo.1003150 115 + collection-title: Collection Title 116 + collection-type: Collection Type 117 + commit: 156a04c74a8a79d40c5d705cddf9d36735feab4d 118 + copyright: 2017 Stephan Druskat 119 + data-type: Data Type 120 + database: Database 121 + date-accessed: 2017-10-31 122 + date-downloaded: 2017-10-31 123 + date-released: 2017-10-31 124 + date-published: 2017-10-31 125 + department: Department 126 + doi: 10.5281/zenodo.1003150 127 + edition: 2nd edition 128 + end: 123 129 + entry: Chapter 9 130 + filename: book.zip 131 + format: Printed book 132 + isbn: 978-1-89183-044-0 133 + issn: 1234-543X 134 + issue: "123" 135 + issue-date: December 136 + issue-title: Special Issue on Software Citation 137 + journal: PeerJ 138 + keywords: 139 + - Software 140 + - Citation 141 + languages: 142 + - aaa 143 + - zu 144 + license: Apache-2.0 145 + license-url: https://spdx.org/licenses/Apache-2.0.html#licenseText 146 + loc-start: 14 147 + loc-end: 54 148 + medium: hardcover book 149 + month: 03 150 + nihmsid: Don't know what format a NIHMSID is in 151 + notes: "A field for general notes about the reference, usable in other formats such as BibTeX." 152 + number: A general-purpose field for accession numbers, cf. the specifications for examples. 153 + number-volumes: 7 154 + pages: 765 155 + patent-states: 156 + - Germany 157 + - ROI 158 + - "but also for example US states, such as:" 159 + - IL 160 + - RI 161 + pmcid: PMC1234567 162 + repository: http://code.google.com/events/#&product=browser 163 + repository-code: http://142.42.1.1:8080/ 164 + repository-artifact: https://files.pythonhosted.org/packages/0a/84/10507b69a07768bc16981184b4d147a0fc84b71fbf35c03bafc8dcced8e1/cffconvert-1.3.3.tar.gz 165 + scope: Cite this book if you want to reference the general concepts implemented in Citation File Format 1.0.0. 166 + section: Chapter 2 - "Reference keys" 167 + status: advance-online 168 + start: 123 169 + thesis-type: Doctoral dissertation 170 + url: http://j.mp 171 + version: 0.0.1423-BETA 172 + volume: 2 173 + volume-title: Advances in Software Citation 174 + year: 2017 175 + year-original: 2012 176 + 177 + # Object-based keys for the reference 178 + conference: 179 + # An entity 180 + name: Entity Project Team Conference entity 181 + address: 22 Acacia Avenue 182 + city: Citationburgh 183 + region: Renfrewshire 184 + post-code: C13 7X7 185 + country: GB 186 + orcid: https://orcid.org/0000-0001-2345-6789 187 + email: project@entity.com 188 + tel: +44(0)141-323 4567 189 + fax: +44(0)141-323 45678 190 + website: https://www.entity-project-team.io 191 + date-start: 2017-01-01 192 + date-end: 2017-01-31 193 + location: The team garage 194 + 195 + authors: 196 + # A person 197 + - family-names: Real Person 198 + given-names: One Truly 199 + name-particle: van der 200 + name-suffix: IV 201 + affiliation: Excellent University, Niceplace, Arcadia 202 + address: 22 Acacia Avenue 203 + city: Citationburgh 204 + region: Renfrewshire 205 + post-code: C13 7X7 206 + country: GB 207 + orcid: https://orcid.org/0000-0001-2345-6789 208 + email: project@entity.com 209 + tel: +44(0)141-323 4567 210 + fax: +44(0)141-323 45678 211 + website: https://www.entity-project-team.io 212 + # An entity 213 + - name: Entity Project Team Conference entity 214 + address: 22 Acacia Avenue 215 + city: Citationburgh 216 + region: Renfrewshire 217 + post-code: C13 7X7 218 + country: GB 219 + orcid: https://orcid.org/0000-0001-2345-6789 220 + email: project@entity.com 221 + tel: +44(0)141-323 4567 222 + fax: +44(0)141-323 45678 223 + website: https://www.entity-project-team.io 224 + date-start: 2017-01-01 225 + date-end: 2017-01-31 226 + location: The team garage 227 + 228 + contact: 229 + # A person 230 + - family-names: Real Person 231 + given-names: One Truly 232 + name-particle: van der 233 + name-suffix: IV 234 + affiliation: Excellent University, Niceplace, Arcadia 235 + address: 22 Acacia Avenue 236 + city: Citationburgh 237 + region: Renfrewshire 238 + post-code: C13 7X7 239 + country: GB 240 + orcid: https://orcid.org/0000-0001-2345-6789 241 + email: project@entity.com 242 + tel: +44(0)141-323 4567 243 + fax: +44(0)141-323 45678 244 + website: https://www.entity-project-team.io 245 + # An entity 246 + - name: Entity Project Team Conference entity 247 + address: 22 Acacia Avenue 248 + city: Citationburgh 249 + region: Renfrewshire 250 + post-code: C13 7X7 251 + country: GB 252 + orcid: https://orcid.org/0000-0001-2345-6789 253 + email: project@entity.com 254 + tel: +44(0)141-323 4567 255 + fax: +44(0)141-323 45678 256 + website: https://www.entity-project-team.io 257 + date-start: 2017-01-01 258 + date-end: 2017-01-31 259 + location: The team garage 260 + 261 + database-provider: 262 + # An entity 263 + name: Entity Project Team Conference entity 264 + address: 22 Acacia Avenue 265 + city: Citationburgh 266 + region: Renfrewshire 267 + post-code: C13 7X7 268 + country: GB 269 + orcid: https://orcid.org/0000-0001-2345-6789 270 + email: project@entity.com 271 + tel: +44(0)141-323 4567 272 + fax: +44(0)141-323 45678 273 + website: https://www.entity-project-team.io 274 + date-start: 2017-01-01 275 + date-end: 2017-01-31 276 + location: The team garage 277 + 278 + editors: 279 + # A person 280 + - family-names: Real Person 281 + given-names: One Truly 282 + name-particle: van der 283 + name-suffix: IV 284 + affiliation: Excellent University, Niceplace, Arcadia 285 + address: 22 Acacia Avenue 286 + city: Citationburgh 287 + region: Renfrewshire 288 + post-code: C13 7X7 289 + country: GB 290 + orcid: https://orcid.org/0000-0001-2345-6789 291 + email: project@entity.com 292 + tel: +44(0)141-323 4567 293 + fax: +44(0)141-323 45678 294 + website: https://www.entity-project-team.io 295 + # An entity 296 + - name: Entity Project Team Conference entity 297 + address: 22 Acacia Avenue 298 + city: Citationburgh 299 + region: Renfrewshire 300 + post-code: C13 7X7 301 + country: GB 302 + orcid: https://orcid.org/0000-0001-2345-6789 303 + email: project@entity.com 304 + tel: +44(0)141-323 4567 305 + fax: +44(0)141-323 45678 306 + website: https://www.entity-project-team.io 307 + date-start: 2017-01-01 308 + date-end: 2017-01-31 309 + location: The team garage 310 + 311 + editors-series: 312 + # A person 313 + - family-names: Real Person 314 + given-names: One Truly 315 + name-particle: van der 316 + name-suffix: IV 317 + affiliation: Excellent University, Niceplace, Arcadia 318 + address: 22 Acacia Avenue 319 + city: Citationburgh 320 + region: Renfrewshire 321 + post-code: C13 7X7 322 + country: GB 323 + orcid: https://orcid.org/0000-0001-2345-6789 324 + email: project@entity.com 325 + tel: +44(0)141-323 4567 326 + fax: +44(0)141-323 45678 327 + website: https://www.entity-project-team.io 328 + # An entity 329 + - name: Entity Project Team Conference entity 330 + address: 22 Acacia Avenue 331 + city: Citationburgh 332 + region: Renfrewshire 333 + post-code: C13 7X7 334 + country: GB 335 + orcid: https://orcid.org/0000-0001-2345-6789 336 + email: project@entity.com 337 + tel: +44(0)141-323 4567 338 + fax: +44(0)141-323 45678 339 + website: https://www.entity-project-team.io 340 + date-start: 2017-01-01 341 + date-end: 2017-01-31 342 + location: The team garage 343 + 344 + institution: 345 + # An entity 346 + name: Entity Project Team Conference entity 347 + address: 22 Acacia Avenue 348 + city: Citationburgh 349 + region: Renfrewshire 350 + post-code: C13 7X7 351 + country: GB 352 + orcid: https://orcid.org/0000-0001-2345-6789 353 + email: project@entity.com 354 + tel: +44(0)141-323 4567 355 + fax: +44(0)141-323 45678 356 + website: https://www.entity-project-team.io 357 + date-start: 2017-01-01 358 + date-end: 2017-01-31 359 + location: The team garage 360 + 361 + location: 362 + # An entity 363 + name: Entity Project Team Conference entity 364 + address: 22 Acacia Avenue 365 + city: Citationburgh 366 + region: Renfrewshire 367 + post-code: C13 7X7 368 + country: GB 369 + orcid: https://orcid.org/0000-0001-2345-6789 370 + email: project@entity.com 371 + tel: +44(0)141-323 4567 372 + fax: +44(0)141-323 45678 373 + website: https://www.entity-project-team.io 374 + date-start: 2017-01-01 375 + date-end: 2017-01-31 376 + location: The team garage 377 + 378 + publisher: 379 + # An entity 380 + name: Entity Project Team Conference entity 381 + address: 22 Acacia Avenue 382 + city: Citationburgh 383 + region: Renfrewshire 384 + post-code: C13 7X7 385 + country: GB 386 + orcid: https://orcid.org/0000-0001-2345-6789 387 + email: project@entity.com 388 + tel: +44(0)141-323 4567 389 + fax: +44(0)141-323 45678 390 + website: https://www.entity-project-team.io 391 + date-start: 2017-01-01 392 + date-end: 2017-01-31 393 + location: The team garage 394 + 395 + recipients: 396 + # A person 397 + - family-names: Real Person 398 + given-names: One Truly 399 + name-particle: van der 400 + name-suffix: IV 401 + affiliation: Excellent University, Niceplace, Arcadia 402 + address: 22 Acacia Avenue 403 + city: Citationburgh 404 + region: Renfrewshire 405 + post-code: C13 7X7 406 + country: GB 407 + orcid: https://orcid.org/0000-0001-2345-6789 408 + email: project@entity.com 409 + tel: +44(0)141-323 4567 410 + fax: +44(0)141-323 45678 411 + website: https://www.entity-project-team.io 412 + # An entity 413 + - name: Entity Project Team Conference entity 414 + address: 22 Acacia Avenue 415 + city: Citationburgh 416 + region: Renfrewshire 417 + post-code: C13 7X7 418 + country: GB 419 + orcid: https://orcid.org/0000-0001-2345-6789 420 + email: project@entity.com 421 + tel: +44(0)141-323 4567 422 + fax: +44(0)141-323 45678 423 + website: https://www.entity-project-team.io 424 + date-start: 2017-01-01 425 + date-end: 2017-01-31 426 + location: The team garage 427 + 428 + senders: 429 + # A person 430 + - family-names: Real Person 431 + given-names: One Truly 432 + name-particle: van der 433 + name-suffix: IV 434 + affiliation: Excellent University, Niceplace, Arcadia 435 + address: 22 Acacia Avenue 436 + city: Citationburgh 437 + region: Renfrewshire 438 + post-code: C13 7X7 439 + country: GB 440 + orcid: https://orcid.org/0000-0001-2345-6789 441 + email: project@entity.com 442 + tel: +44(0)141-323 4567 443 + fax: +44(0)141-323 45678 444 + website: https://www.entity-project-team.io 445 + # An entity 446 + - name: Entity Project Team Conference entity 447 + address: 22 Acacia Avenue 448 + city: Citationburgh 449 + region: Renfrewshire 450 + post-code: C13 7X7 451 + country: GB 452 + orcid: https://orcid.org/0000-0001-2345-6789 453 + email: project@entity.com 454 + tel: +44(0)141-323 4567 455 + fax: +44(0)141-323 45678 456 + website: https://www.entity-project-team.io 457 + date-start: 2017-01-01 458 + date-end: 2017-01-31 459 + location: The team garage 460 + 461 + translators: 462 + # A person 463 + - family-names: Real Person 464 + given-names: One Truly 465 + name-particle: van der 466 + name-suffix: IV 467 + affiliation: Excellent University, Niceplace, Arcadia 468 + address: 22 Acacia Avenue 469 + city: Citationburgh 470 + region: Renfrewshire 471 + post-code: C13 7X7 472 + country: GB 473 + orcid: https://orcid.org/0000-0001-2345-6789 474 + email: project@entity.com 475 + tel: +44(0)141-323 4567 476 + fax: +44(0)141-323 45678 477 + website: https://www.entity-project-team.io 478 + # An entity 479 + - name: Entity Project Team Conference entity 480 + address: 22 Acacia Avenue 481 + city: Citationburgh 482 + region: Renfrewshire 483 + post-code: C13 7X7 484 + country: GB 485 + orcid: https://orcid.org/0000-0001-2345-6789 486 + email: project@entity.com 487 + tel: +44(0)141-323 4567 488 + fax: +44(0)141-323 45678 489 + website: https://www.entity-project-team.io 490 + date-start: 2017-01-01 491 + date-end: 2017-01-31 492 + location: The team garage 493 +
+23
project/ocaml-cff/vendor/git/citation-file-format/examples/1.0.3/reference-art/CITATION.cff
··· 1 + cff-version: 1.0.3 2 + message: "If you use this software, please cite the following." 3 + authors: 4 + - family-names: Druskat 5 + given-names: Stephan 6 + orcid: https://orcid.org/0000-0003-4925-7248 7 + title: My Research Tool 8 + version: 1.0.4 9 + doi: 10.5281/zenodo.1234 10 + date-released: 2017-12-18 11 + references: 12 + - type: art 13 + authors: 14 + - family-names: Picasso 15 + given-names: Pablo 16 + title: Guernica 17 + year: 1937 18 + medium: Oil on canvas 19 + format: 349.3cm x 776.6cm 20 + location: 21 + name: Museo Reina Sofia 22 + city: Madrid 23 + country: ES
+33
project/ocaml-cff/vendor/git/citation-file-format/examples/1.0.3/reference-article/CITATION.cff
··· 1 + cff-version: 1.0.3 2 + message: If you use this software, please cite it as below. 3 + authors: 4 + - family-names: Druskat 5 + given-names: Stephan 6 + orcid: https://orcid.org/0000-0003-4925-7248 7 + title: My Research Tool 8 + version: 1.0.4 9 + doi: 10.5281/zenodo.1234 10 + date-released: 2017-12-18 11 + references: 12 + - type: article 13 + authors: 14 + - family-names: Smith 15 + given-names: Arfon M. 16 + - family-names: Katz 17 + given-names: Daniel S. 18 + affiliation: "National Center for Supercomputing Applications & 19 + Electrical and Computer Engineering Department & School of Information 20 + Sciences, University of Illinois at Urbana-Champaign, Urbana, Illinois, 21 + United States" 22 + orcid: https://orcid.org/0000-0001-5934-7525 23 + - family-names: Niemeyer 24 + given-names: Kyle E. 25 + - name: "FORCE11 Software Citation Working Group" 26 + website: https://www.force11.org/group/software-citation-working-group 27 + title: "Software citation principles" 28 + year: 2016 29 + journal: PeerJ Computer Science 30 + volume: 2 31 + issue: e86 32 + doi: 10.7717/peerj-cs.86 33 + url: https://doi.org/10.7717/peerj-cs.86
+22
project/ocaml-cff/vendor/git/citation-file-format/examples/1.0.3/reference-blog/CITATION.cff
··· 1 + cff-version: 1.0.3 2 + message: If you use this software, please cite the software itself and the blog post. 3 + authors: 4 + - family-names: Druskat 5 + given-names: Stephan 6 + orcid: https://orcid.org/0000-0003-4925-7248 7 + title: My Research Tool 8 + version: 1.0.4 9 + doi: 10.5281/zenodo.1234 10 + date-released: 2017-12-18 11 + references: 12 + - type: blog 13 + authors: 14 + - family-names: Doe 15 + given-names: Jane 16 + title: "Implement a 100% accuracy syntax parser for all languages? No probs!" 17 + date-published: 2017-09-23 18 + url: https://hu-berlin.de/blogs/jdoe/2017/09/23/if-only 19 + institution: 20 + name: "Humboldt-Universität zu Berlin" 21 + city: Berlin 22 + country: DE
+21
project/ocaml-cff/vendor/git/citation-file-format/examples/1.0.3/reference-book/CITATION.cff
··· 1 + cff-version: 1.0.3 2 + message: "If you use MRT for your research, please cite the following book." 3 + authors: 4 + - family-names: Druskat 5 + given-names: Stephan 6 + orcid: https://orcid.org/0000-0003-4925-7248 7 + title: My Research Tool 8 + version: 1.0.4 9 + doi: 10.5281/zenodo.1234 10 + date-released: 2017-12-18 11 + references: 12 + - type: book 13 + authors: 14 + - family-names: Doe 15 + given-names: Jane 16 + title: "The future of syntax parsing" 17 + year: 2017 18 + publisher: 19 + name: Far Out Publications 20 + city: Bielefeld 21 + medium: print
+35
project/ocaml-cff/vendor/git/citation-file-format/examples/1.0.3/reference-conference-paper/CITATION.cff
··· 1 + cff-version: 1.0.3 2 + message: If you use this software, please cite the software and the paper. 3 + authors: 4 + - family-names: Druskat 5 + given-names: Stephan 6 + orcid: https://orcid.org/0000-0003-4925-7248 7 + title: My Research Tool 8 + version: 1.0.4 9 + doi: 10.5281/zenodo.1234 10 + date-released: 2017-12-18 11 + references: 12 + - type: conference-paper 13 + authors: 14 + - family-names: Doe 15 + given-names: Jane 16 + title: "Ultimate-accuracy syntax parsing with My Research Tool" 17 + year: 2017 18 + collection-title: "Proceedings of the 1st Conference on Wishful Thinking" 19 + collection-doi: 10.5281/zenodo.123456 20 + editors: 21 + - family-names: Kirk 22 + given-names: James T. 23 + conference: 24 + name: 1st Conference on Wishful Thinking 25 + location: Spock's Inn Hotel and Bar 26 + address: 123 Main St 27 + city: Bielefeld 28 + region: Jarvis Island 29 + post-code: "12345" 30 + country: UM 31 + date-start: 2017-04-01 32 + date-end: 2017-04-01 33 + start: 42 34 + end: 45 35 + doi: 10.5281/zenodo.1234
+21
project/ocaml-cff/vendor/git/citation-file-format/examples/1.0.3/reference-edited-work/CITATION.cff
··· 1 + cff-version: 1.0.3 2 + message: If you use this software, please cite it as below. 3 + authors: 4 + - family-names: Druskat 5 + given-names: Stephan 6 + orcid: https://orcid.org/0000-0003-4925-7248 7 + title: My Research Tool 8 + version: 1.0.4 9 + doi: 10.5281/zenodo.1234 10 + date-released: 2017-12-18 11 + references: 12 + - type: edited-work 13 + authors: 14 + - family-names: Doe 15 + given-names: Jane 16 + title: "Ultimate-accuracy parsing in practice" 17 + year: 2017 18 + publisher: 19 + name: Far Out Publications 20 + city: Bielefeld 21 + country: DE
+5
project/ocaml-cff/vendor/git/citation-file-format/examples/1.0.3/reference-edited-work/README.md
··· 1 + # software with reference of type edited-work 2 + 3 + Note that the editors of the edited work must be specified under the `authors` 4 + key. Specific citation styles may or may not attach a suffix to the authors, 5 + such as ", eds." or similar.
+18
project/ocaml-cff/vendor/git/citation-file-format/examples/1.0.3/reference-report/CITATION.cff
··· 1 + cff-version: 1.0.3 2 + message: If you use this software, please cite it as below. 3 + authors: 4 + - family-names: Druskat 5 + given-names: Stephan 6 + orcid: https://orcid.org/0000-0003-4925-7248 7 + title: My Research Tool 8 + version: 1.0.4 9 + doi: 10.5281/zenodo.1234 10 + date-released: 2017-12-18 11 + references: 12 + - type: report 13 + authors: 14 + - name: Fictional Parsing Interest Group, ACME Inc. 15 + title: "100% accuracy syntax parsing at ACME" 16 + url: http://www.acme.com/sigs/fp/reports/hpsp.pdf 17 + year: 2017 18 + date-accessed: 2017-09-23
+27
project/ocaml-cff/vendor/git/citation-file-format/examples/1.0.3/reference-thesis/CITATION.cff
··· 1 + cff-version: 1.0.3 2 + message: If you use this software, please cite it as below. 3 + authors: 4 + - family-names: Druskat 5 + given-names: Stephan 6 + orcid: https://orcid.org/0000-0003-4925-7248 7 + title: My Research Tool 8 + version: 1.0.4 9 + doi: 10.5281/zenodo.1234 10 + date-released: 2017-12-18 11 + references: 12 + - type: thesis 13 + authors: 14 + - family-names: Doe 15 + given-names: Jane 16 + title: "A high accuracy syntax parser in Visual Basic" 17 + thesis-type: PhD 18 + year: 2017 19 + department: Dept. of Universal Language Philosophy 20 + institution: 21 + name: "Humboldt-Universität zu Berlin" 22 + city: Berlin 23 + country: DE 24 + database: Thesiserver 25 + date-accessed: 2017-09-23 26 + date-published: 2017-03-21 27 + url: http://thesiserver.hu-berlin.de/2017/march/phd/doe-12345
+12
project/ocaml-cff/vendor/git/citation-file-format/examples/1.0.3/software-container/CITATION.cff
··· 1 + cff-version: 1.0.3 2 + message: "If you use the MRT Docker container, please cite the following." 3 + authors: 4 + - name: "Humboldt-Universität zu Berlin" 5 + website: https://www.linguistik.hu-berlin.de/ 6 + - family-names: Doe 7 + given-names: Jane 8 + title: mrt-iain-m-banks 9 + version: 1.0.4 (Iain M. Banks) 10 + url: https://github.com/doe/docker-brew-mrt-core/blob/160d54f9e935/iain/Dockerfile 11 + repository: https://hub.docker.hu-berlin.de/_/mrt-iain-m-banks/ 12 + date-released: 2017-12-18
+10
project/ocaml-cff/vendor/git/citation-file-format/examples/1.0.3/software-executable/CITATION.cff
··· 1 + cff-version: 1.0.3 2 + message: "If you use MRT, please cite the following." 3 + authors: 4 + - family-names: Druskat 5 + given-names: Stephan 6 + orcid: https://orcid.org/0000-0003-4925-7248 7 + title: My Research Tool Kickstarter 8 + version: 2.0.4 9 + date-released: 2017-12-18 10 + repository-artifact: https://hu.berlin/nexus/mrt-kickstarter/2.0.4/mrt2-kickstarter.exe
+23
project/ocaml-cff/vendor/git/citation-file-format/examples/1.0.3/software-with-a-doi-expanded/CITATION.cff
··· 1 + cff-version: 1.0.3 2 + message: If you use this software, please cite it as below. 3 + authors: 4 + - family-names: Druskat 5 + given-names: Stephan 6 + orcid: https://orcid.org/0000-0003-4925-7248 7 + affiliation: "Humboldt-Universität zu Berlin, Dept. of German Studies and Linguistics" 8 + email: mail@sdruskat.net 9 + website: https://hu.berlin/sdruskat 10 + title: My Research Tool 11 + version: 1.0.4 12 + doi: 10.5281/zenodo.1234 13 + date-released: 2017-12-18 14 + repository-code: https://github.com/sdruskat/my-research-tool 15 + repository-artifact: https://hu.berlin/nexus/mrt 16 + keywords: 17 + - "McAuthor's algorithm" 18 + - linguistics 19 + - nlp 20 + - parser 21 + - deep convolutional neural network 22 + license: Apache-2.0 23 + url: https://sdruskat.github.io/my-research-tool
+3
project/ocaml-cff/vendor/git/citation-file-format/examples/1.0.3/software-with-a-doi-expanded/README.md
··· 1 + # Software with a doi (expanded) 2 + 3 + Same as [../software-with-a-doi/README.md](../software-with-a-doi/README.md), but with additional properties.
+10
project/ocaml-cff/vendor/git/citation-file-format/examples/1.0.3/software-with-a-doi/CITATION.cff
··· 1 + cff-version: 1.0.3 2 + message: If you use this software, please cite it as below. 3 + authors: 4 + - family-names: Druskat 5 + given-names: Stephan 6 + orcid: https://orcid.org/0000-0003-4925-7248 7 + title: My Research Tool 8 + version: 1.0.4 9 + doi: 10.5281/zenodo.1234 10 + date-released: 2017-12-18
+16
project/ocaml-cff/vendor/git/citation-file-format/examples/1.0.3/software-with-a-doi/README.md
··· 1 + # Software with a DOI 2 + 3 + Note that [Smith et al., 2016](https://doi.org/10.7717/peerj-cs.86), p. 12 recommend 4 + 5 + > [...] the use of DOIs as the unique identifier due to their common usage and 6 + acceptance, particularly as they are the standard for other digital products 7 + such as publications. 8 + 9 + Furthermore, DOIs should point to a "unique, specific software version" 10 + ([Smith et al., 2016](https://doi.org/10.7717/peerj-cs.86), p. 12). Also it is recommended ([Smith et al., 2016](https://doi.org/10.7717/peerj-cs.86), p. 13) that: 11 + 12 + > the [DOI] should resolve to a persistent landing page that contains metadata 13 + and a link to the software itself, rather than directly to the source code files, 14 + repository, or executable. 15 + 16 + Therefore, a minimal `CITATION.cff` file in such a case would look similar to [CITATION.cff](CITATION.cff).
+30
project/ocaml-cff/vendor/git/citation-file-format/examples/1.0.3/software-with-reference/CITATION.cff
··· 1 + cff-version: 1.0.3 2 + message: If you use My Research Tool, please cite both the software and the outline paper. 3 + authors: 4 + - family-names: Doe 5 + given-names: Jane 6 + - family-names: Bielefeld 7 + name-particle: von 8 + given-names: Arthur 9 + - family-names: McAuthor 10 + given-names: Juniper 11 + name-suffix: Jr. 12 + title: My Research Tool 13 + version: 1.0.4 14 + doi: 10.5281/zenodo.1234 15 + date-released: 2017-12-18 16 + references: 17 + - type: article 18 + scope: Cite this paper if you want to reference the general concepts of MRT. 19 + authors: 20 + - family-names: Doe 21 + given-names: Jane 22 + - family-names: Bielefeld 23 + name-particle: von 24 + given-names: Arthur 25 + title: "My Research Tool: A 100% accuracy syntax parser for all languages" 26 + year: 2099 27 + journal: Journal of Hard Science Fiction 28 + volume: 42 29 + issue: "13" 30 + doi: 10.9999/hardscifi-lang.42132
+5
project/ocaml-cff/vendor/git/citation-file-format/examples/1.0.3/software-with-reference/README.md
··· 1 + # Software with a further reference 2 + 3 + Where authors wish to encourage citation of an outline paper with citation 4 + of their software, we recommend the use of [reference keys](#references-optional) 5 + to highlight the existence of further references.
+17
project/ocaml-cff/vendor/git/citation-file-format/examples/1.0.3/software-without-a-doi-closed-source/CITATION.cff
··· 1 + cff-version: 1.0.3 2 + message: 3 + If you dare use this commercial, closed-source, strangely versioned 4 + software in your research, please at least cite it as below. 5 + authors: 6 + - family-names: Vader 7 + name-suffix: né Skywalker 8 + given-names: 'Anakin "Darth"' 9 + title: Opaquity 10 + version: opq-1234-XZVF-ACME-RLY 11 + date-released: 2017-02-28 12 + url: http://www.opaquity.com 13 + contact: 14 + - name: Dark Side Software 15 + address: DS-1 Orbital Battle Station, near Scarif 16 + email: father@imperial-empire.com 17 + tel: +850 (0)123-45-666
+11
project/ocaml-cff/vendor/git/citation-file-format/examples/1.0.3/software-without-a-doi-closed-source/README.md
··· 1 + For software without a DOI, it is recommended that "the metadata should still 2 + provide information on how to access the specific software, but this may be a 3 + company’s product number or a link to a website that allows the software be 4 + purchased." [Smith et al., 2016](https://doi.org/10.7717/peerj-cs.86), p. 13. Furthermore, "if the version number and 5 + release date are not available, the download date can be used. Similarly, the 6 + contact name/email is an alternative to the location/repository." 7 + ([Smith et al., 2016](https://doi.org/10.7717/peerj-cs.86), p. 7). 8 + 9 + Hence, for closed-source software without a DOI for which the version number 10 + and release date cannot be determined, a `CITATION.cff` file could look like 11 + [./CITATION.cff](./CITATION.cff).
+11
project/ocaml-cff/vendor/git/citation-file-format/examples/1.0.3/software-without-a-doi/CITATION.cff
··· 1 + cff-version: 1.0.3 2 + message: "If you use this MRT alpha snapshot version, please cite." 3 + authors: 4 + - family-names: Druskat 5 + given-names: Stephan 6 + orcid: https://orcid.org/0000-0003-4925-7248 7 + title: My Research Tool Prototype 8 + version: 0.0.1-alpha1-build1507284872 9 + date-released: 2017-12-18 10 + repository-code: https://github.com/doe/mrt 11 + commit: 160d54f9e935c914df38c1ffda752112b5c979a8
+6
project/ocaml-cff/vendor/git/citation-file-format/examples/1.0.3/software-without-a-doi/README.md
··· 1 + We recognize that there are certain situations where it may not be possible to 2 + follow the recommended best-practice. For example, if (1) the software authors 3 + did not register a DOI and/or release a specific version, or (2) the version of 4 + the software used does not match what is available to cite. In those cases, 5 + falling back on a combination of the repository URL and version number/commit 6 + hash would be an appropriate way to cite the software used ([Smith et al., 2016](https://doi.org/10.7717/peerj-cs.86), p. 12).
+7
project/ocaml-cff/vendor/git/citation-file-format/examples/1.1.0/alias-minimal/CITATION.cff
··· 1 + cff-version: 1.1.0 2 + message: If you use this software, please cite it as below. 3 + authors: 4 + - alias: githubuser 5 + title: My Research Tool 6 + version: 1.0.4 7 + date-released: 2017-12-18
+32
project/ocaml-cff/vendor/git/citation-file-format/examples/1.1.0/doi-with-slash/CITATION.cff
··· 1 + # YAML 1.2 2 + # Metadata for citation of this software according to the CFF format (https://citation-file-format.github.io/) 3 + cff-version: 1.1.0 4 + message: If you use this software, please cite it using these metadata. 5 + title: 'ANNIS' 6 + doi: 10.5281/zenodo.2563138 7 + authors: 8 + - given-names: Dummy 9 + family-names: User 10 + affiliation: Humboldt-Universität zu Berlin 11 + orcid: https://orcid.org/0000-1234-5678-9101 12 + version: annis-3.6.0 13 + date-released: 2019-02-12 14 + repository-code: https://github.com/korpling/ANNIS 15 + license: Apache-2.0 16 + references: 17 + - type: article 18 + title: "ANNIS3: A new architecture for generic corpus query and visualization" 19 + year: 2016 20 + doi: 10.1093/llc/fqu057 21 + authors: 22 + - family-names: Dummy 23 + given-names: User 24 + orcid: https://orcid.org/0000-1234-5678-9101 25 + affiliation: Humboldt-Universität zu Berlin 26 + - family-names: Other 27 + given-names: User 28 + affiliation: Georgetown University 29 + journal: Digital Scholarship in the Humanities 30 + volume: 31 31 + issue: "1" 32 + issn: 2055-7671
+24
project/ocaml-cff/vendor/git/citation-file-format/examples/1.1.0/fail-additional-key/CITATION.cff
··· 1 + cff-version: 1.1.0 2 + message: "If you use this software, please cite the following." 3 + authors: 4 + - family-names: Druskat 5 + given-names: Stephan 6 + orcid: https://orcid.org/0000-0003-4925-7248 7 + title: My Research Tool 8 + extra: 45 9 + version: 1.0.4 10 + doi: 10.5281/zenodo.1234 11 + date-released: 2017-12-18 12 + references: 13 + - type: art 14 + authors: 15 + - family-names: Picasso 16 + given-names: Pablo 17 + title: Guernica 18 + year: 1937 19 + medium: Oil on canvas 20 + format: 349.3cm x 776.6cm 21 + location: 22 + name: Museo Reina Sofia 23 + city: Madrid 24 + country: ES
+15
project/ocaml-cff/vendor/git/citation-file-format/examples/1.1.0/fail-bad-identifier-type-in-root/CITATION.cff
··· 1 + cff-version: 1.1.0 2 + message: If you use this software, please cite it as below. 3 + authors: 4 + - family-names: Druskat 5 + given-names: Stephan 6 + title: My Research Tool 7 + version: 1.0.4 8 + date-released: 2017-12-18 9 + identifiers: 10 + - type: "other" 11 + value: "This is an (identified) birthday pony!" 12 + - type: "swh" 13 + value: "swh:1:rel:99f6850374dc6597af01bd0ee1d3fc0699301b9f" 14 + - type: "invalid-type" 15 + value: "Doesn't matter"
+18
project/ocaml-cff/vendor/git/citation-file-format/examples/1.1.0/identifiers-in-reference/CITATION.cff
··· 1 + cff-version: 1.1.0 2 + message: If you use this software, please cite it as below. 3 + authors: 4 + - family-names: Druskat 5 + given-names: Stephan 6 + title: My Research Tool 7 + version: 1.0.4 8 + date-released: 2017-12-18 9 + references: 10 + - type: software 11 + authors: 12 + - name: "Author" 13 + title: "Software reference" 14 + identifiers: 15 + - type: "other" 16 + value: "This is an (identified) birthday pony!" 17 + - type: "swh" 18 + value: "swh:1:rel:99f6850374dc6597af01bd0ee1d3fc0699301b9f"
+13
project/ocaml-cff/vendor/git/citation-file-format/examples/1.1.0/identifiers-in-root/CITATION.cff
··· 1 + cff-version: 1.1.0 2 + message: If you use this software, please cite it as below. 3 + authors: 4 + - family-names: Druskat 5 + given-names: Stephan 6 + title: My Research Tool 7 + version: 1.0.4 8 + date-released: 2017-12-18 9 + identifiers: 10 + - type: "other" 11 + value: "This is an (identified) birthday pony!" 12 + - type: "swh" 13 + value: "swh:1:rel:99f6850374dc6597af01bd0ee1d3fc0699301b9f"
+519
project/ocaml-cff/vendor/git/citation-file-format/examples/1.1.0/key-complete/CITATION.cff
··· 1 + ############################ 2 + # DO NOT USE FOR CITATION! # 3 + ############################ 4 + # This is a key-complete # 5 + # test file for validation # 6 + ############################ 7 + 8 + cff-version: 1.1.0 9 + 10 + message: If you use this software, please cite it as below. 11 + 12 + abstract: "This is an awesome piece of research software!" 13 + 14 + authors: 15 + # A person 16 + - family-names: Real Person 17 + given-names: One Truly 18 + name-particle: van der 19 + name-suffix: IV 20 + alias: Citey 21 + affiliation: Excellent University, Niceplace, Arcadia 22 + address: 22 Acacia Avenue 23 + city: Citationburgh 24 + region: Renfrewshire 25 + post-code: C13 7X7 26 + country: GB 27 + orcid: https://orcid.org/0000-0001-2345-6789 28 + email: project@entity.com 29 + tel: +44(0)141-323 4567 30 + fax: +44(0)141-323 45678 31 + website: https://www.entity-project-team.io 32 + # An entity 33 + - name: Entity Project Team Conference entity 34 + address: 22 Acacia Avenue 35 + city: Citationburgh 36 + region: Renfrewshire 37 + post-code: C13 7X7 38 + country: GB 39 + orcid: https://orcid.org/0000-0001-2345-6789 40 + email: project@entity.com 41 + tel: +44(0)141-323 4567 42 + fax: +44(0)141-323 45678 43 + website: https://www.entity-project-team.io 44 + date-start: 2017-01-01 45 + date-end: 2017-01-31 46 + location: The team garage 47 + 48 + commit: 156a04c74a8a79d40c5d705cddf9d36735feab4d 49 + 50 + contact: 51 + # A person 52 + - family-names: Real Person 53 + given-names: One Truly 54 + name-particle: van der 55 + name-suffix: IV 56 + alias: Citey 57 + affiliation: Excellent University, Niceplace, Arcadia 58 + address: 22 Acacia Avenue 59 + city: Citationburgh 60 + region: Renfrewshire 61 + post-code: C13 7X7 62 + country: GB 63 + orcid: https://orcid.org/0000-0001-2345-6789 64 + email: project@entity.com 65 + tel: +44(0)141-323 4567 66 + fax: +44(0)141-323 45678 67 + website: https://www.entity-project-team.io 68 + # An entity 69 + - name: Entity Project Team Conference entity 70 + address: 22 Acacia Avenue 71 + city: Citationburgh 72 + region: Renfrewshire 73 + post-code: C13 7X7 74 + country: GB 75 + orcid: https://orcid.org/0000-0001-2345-6789 76 + email: project@entity.com 77 + tel: +44(0)141-323 4567 78 + fax: +44(0)141-323 45678 79 + website: https://www.entity-project-team.io 80 + date-start: 2017-01-01 81 + date-end: 2017-01-31 82 + location: The team garage 83 + 84 + date-released: 2017-12-11 85 + 86 + doi: 10.5281/zenodo.1003150 87 + 88 + identifiers: 89 + - type: doi 90 + value: 10.5281/zenodo.1003150 91 + - type: swh 92 + value: swh:1:rel:99f6850374dc6597af01bd0ee1d3fc0699301b9f 93 + - type: url 94 + value: https://example.com 95 + - type: other 96 + value: other-schema://abcd.1234.efgh.5678 97 + 98 + keywords: 99 + - One 100 + - Two 101 + - Three 102 + - "4" 103 + 104 + license: CC-BY-SA-4.0 105 + 106 + license-url: https://spdx.org/licenses/CC-BY-SA-4.0.html#licenseText 107 + 108 + repository: https://www.example.com/foo/?bar=baz&inga=42&quux 109 + 110 + repository-code: http://foo.com/blah_(wikipedia)_blah#cite-1 111 + 112 + repository-artifact: https://files.pythonhosted.org/packages/0a/84/10507b69a07768bc16981184b4d147a0fc84b71fbf35c03bafc8dcced8e1/cffconvert-1.3.3.tar.gz 113 + 114 + title: Citation File Format 1.0.0 115 + 116 + url: http://userid:password@example.com:8080/ 117 + 118 + version: 1.0.0 119 + 120 + references: 121 + - type: book 122 + title: Book Title 123 + abbreviation: Abbr 124 + abstract: Description of the book. 125 + collection-doi: 10.5281/zenodo.1003150 126 + collection-title: Collection Title 127 + collection-type: Collection Type 128 + commit: 156a04c74a8a79d40c5d705cddf9d36735feab4d 129 + copyright: 2017 Stephan Druskat 130 + data-type: Data Type 131 + database: Database 132 + date-accessed: 2017-10-31 133 + date-downloaded: 2017-10-31 134 + date-released: 2017-10-31 135 + date-published: 2017-10-31 136 + department: Department 137 + doi: 10.5281/zenodo.1003150 138 + edition: 2nd edition 139 + end: 123 140 + entry: Chapter 9 141 + filename: book.zip 142 + format: Printed book 143 + identifiers: 144 + - type: doi 145 + value: 10.5281/zenodo.1003150 146 + - type: swh 147 + value: swh:1:rel:99f6850374dc6597af01bd0ee1d3fc0699301b9f 148 + - type: url 149 + value: https://example.com 150 + - type: other 151 + value: other-schema://abcd.1234.efgh.5678 152 + isbn: 978-1-89183-044-0 153 + issn: 1234-543X 154 + issue: "123" 155 + issue-date: December 156 + issue-title: Special Issue on Software Citation 157 + journal: PeerJ 158 + keywords: 159 + - Software 160 + - Citation 161 + languages: 162 + - aaa 163 + - zu 164 + license: Apache-2.0 165 + license-url: https://spdx.org/licenses/Apache-2.0.html#licenseText 166 + loc-start: 14 167 + loc-end: 54 168 + medium: hardcover book 169 + month: 03 170 + nihmsid: Don't know what format a NIHMSID is in 171 + notes: "A field for general notes about the reference, usable in other formats such as BibTeX." 172 + number: A general-purpose field for accession numbers, cf. the specifications for examples. 173 + number-volumes: 7 174 + pages: 765 175 + patent-states: 176 + - Germany 177 + - ROI 178 + - "but also for example US states, such as:" 179 + - IL 180 + - RI 181 + pmcid: PMC1234567 182 + repository: http://code.google.com/events/#&product=browser 183 + repository-code: http://142.42.1.1:8080/ 184 + repository-artifact: https://files.pythonhosted.org/packages/0a/84/10507b69a07768bc16981184b4d147a0fc84b71fbf35c03bafc8dcced8e1/cffconvert-1.3.3.tar.gz 185 + scope: Cite this book if you want to reference the general concepts implemented in Citation File Format 1.0.0. 186 + section: Chapter 2 - "Reference keys" 187 + status: advance-online 188 + start: 123 189 + thesis-type: Doctoral dissertation 190 + url: http://j.mp 191 + version: 0.0.1423-BETA 192 + volume: 2 193 + volume-title: Advances in Software Citation 194 + year: 2017 195 + year-original: 2012 196 + 197 + # Object-based keys for the reference 198 + conference: 199 + # An entity 200 + name: Entity Project Team Conference entity 201 + address: 22 Acacia Avenue 202 + city: Citationburgh 203 + region: Renfrewshire 204 + post-code: C13 7X7 205 + country: GB 206 + orcid: https://orcid.org/0000-0001-2345-6789 207 + email: project@entity.com 208 + tel: +44(0)141-323 4567 209 + fax: +44(0)141-323 45678 210 + website: https://www.entity-project-team.io 211 + date-start: 2017-01-01 212 + date-end: 2017-01-31 213 + location: The team garage 214 + 215 + authors: 216 + # A person 217 + - family-names: Real Person 218 + given-names: One Truly 219 + name-particle: van der 220 + name-suffix: IV 221 + alias: Citey 222 + affiliation: Excellent University, Niceplace, Arcadia 223 + address: 22 Acacia Avenue 224 + city: Citationburgh 225 + region: Renfrewshire 226 + post-code: C13 7X7 227 + country: GB 228 + orcid: https://orcid.org/0000-0001-2345-6789 229 + email: project@entity.com 230 + tel: +44(0)141-323 4567 231 + fax: +44(0)141-323 45678 232 + website: https://www.entity-project-team.io 233 + # An entity 234 + - name: Entity Project Team Conference entity 235 + address: 22 Acacia Avenue 236 + city: Citationburgh 237 + region: Renfrewshire 238 + post-code: C13 7X7 239 + country: GB 240 + orcid: https://orcid.org/0000-0001-2345-6789 241 + email: project@entity.com 242 + tel: +44(0)141-323 4567 243 + fax: +44(0)141-323 45678 244 + website: https://www.entity-project-team.io 245 + date-start: 2017-01-01 246 + date-end: 2017-01-31 247 + location: The team garage 248 + 249 + contact: 250 + # A person 251 + - family-names: Real Person 252 + given-names: One Truly 253 + name-particle: van der 254 + name-suffix: IV 255 + alias: Citey 256 + affiliation: Excellent University, Niceplace, Arcadia 257 + address: 22 Acacia Avenue 258 + city: Citationburgh 259 + region: Renfrewshire 260 + post-code: C13 7X7 261 + country: GB 262 + orcid: https://orcid.org/0000-0001-2345-6789 263 + email: project@entity.com 264 + tel: +44(0)141-323 4567 265 + fax: +44(0)141-323 45678 266 + website: https://www.entity-project-team.io 267 + # An entity 268 + - name: Entity Project Team Conference entity 269 + address: 22 Acacia Avenue 270 + city: Citationburgh 271 + region: Renfrewshire 272 + post-code: C13 7X7 273 + country: GB 274 + orcid: https://orcid.org/0000-0001-2345-6789 275 + email: project@entity.com 276 + tel: +44(0)141-323 4567 277 + fax: +44(0)141-323 45678 278 + website: https://www.entity-project-team.io 279 + date-start: 2017-01-01 280 + date-end: 2017-01-31 281 + location: The team garage 282 + 283 + database-provider: 284 + # An entity 285 + name: Entity Project Team Conference entity 286 + address: 22 Acacia Avenue 287 + city: Citationburgh 288 + region: Renfrewshire 289 + post-code: C13 7X7 290 + country: GB 291 + orcid: https://orcid.org/0000-0001-2345-6789 292 + email: project@entity.com 293 + tel: +44(0)141-323 4567 294 + fax: +44(0)141-323 45678 295 + website: https://www.entity-project-team.io 296 + date-start: 2017-01-01 297 + date-end: 2017-01-31 298 + location: The team garage 299 + 300 + editors: 301 + # A person 302 + - family-names: Real Person 303 + given-names: One Truly 304 + name-particle: van der 305 + name-suffix: IV 306 + alias: Citey 307 + affiliation: Excellent University, Niceplace, Arcadia 308 + address: 22 Acacia Avenue 309 + city: Citationburgh 310 + region: Renfrewshire 311 + post-code: C13 7X7 312 + country: GB 313 + orcid: https://orcid.org/0000-0001-2345-6789 314 + email: project@entity.com 315 + tel: +44(0)141-323 4567 316 + fax: +44(0)141-323 45678 317 + website: https://www.entity-project-team.io 318 + # An entity 319 + - name: Entity Project Team Conference entity 320 + address: 22 Acacia Avenue 321 + city: Citationburgh 322 + region: Renfrewshire 323 + post-code: C13 7X7 324 + country: GB 325 + orcid: https://orcid.org/0000-0001-2345-6789 326 + email: project@entity.com 327 + tel: +44(0)141-323 4567 328 + fax: +44(0)141-323 45678 329 + website: https://www.entity-project-team.io 330 + date-start: 2017-01-01 331 + date-end: 2017-01-31 332 + location: The team garage 333 + 334 + editors-series: 335 + # A person 336 + - family-names: Real Person 337 + given-names: One Truly 338 + name-particle: van der 339 + name-suffix: IV 340 + alias: Citey 341 + affiliation: Excellent University, Niceplace, Arcadia 342 + address: 22 Acacia Avenue 343 + city: Citationburgh 344 + region: Renfrewshire 345 + post-code: C13 7X7 346 + country: GB 347 + orcid: https://orcid.org/0000-0001-2345-6789 348 + email: project@entity.com 349 + tel: +44(0)141-323 4567 350 + fax: +44(0)141-323 45678 351 + website: https://www.entity-project-team.io 352 + # An entity 353 + - name: Entity Project Team Conference entity 354 + address: 22 Acacia Avenue 355 + city: Citationburgh 356 + region: Renfrewshire 357 + post-code: C13 7X7 358 + country: GB 359 + orcid: https://orcid.org/0000-0001-2345-6789 360 + email: project@entity.com 361 + tel: +44(0)141-323 4567 362 + fax: +44(0)141-323 45678 363 + website: https://www.entity-project-team.io 364 + date-start: 2017-01-01 365 + date-end: 2017-01-31 366 + location: The team garage 367 + 368 + institution: 369 + # An entity 370 + name: Entity Project Team Conference entity 371 + address: 22 Acacia Avenue 372 + city: Citationburgh 373 + region: Renfrewshire 374 + post-code: C13 7X7 375 + country: GB 376 + orcid: https://orcid.org/0000-0001-2345-6789 377 + email: project@entity.com 378 + tel: +44(0)141-323 4567 379 + fax: +44(0)141-323 45678 380 + website: https://www.entity-project-team.io 381 + date-start: 2017-01-01 382 + date-end: 2017-01-31 383 + location: The team garage 384 + 385 + location: 386 + # An entity 387 + name: Entity Project Team Conference entity 388 + address: 22 Acacia Avenue 389 + city: Citationburgh 390 + region: Renfrewshire 391 + post-code: C13 7X7 392 + country: GB 393 + orcid: https://orcid.org/0000-0001-2345-6789 394 + email: project@entity.com 395 + tel: +44(0)141-323 4567 396 + fax: +44(0)141-323 45678 397 + website: https://www.entity-project-team.io 398 + date-start: 2017-01-01 399 + date-end: 2017-01-31 400 + location: The team garage 401 + 402 + publisher: 403 + # An entity 404 + name: Entity Project Team Conference entity 405 + address: 22 Acacia Avenue 406 + city: Citationburgh 407 + region: Renfrewshire 408 + post-code: C13 7X7 409 + country: GB 410 + orcid: https://orcid.org/0000-0001-2345-6789 411 + email: project@entity.com 412 + tel: +44(0)141-323 4567 413 + fax: +44(0)141-323 45678 414 + website: https://www.entity-project-team.io 415 + date-start: 2017-01-01 416 + date-end: 2017-01-31 417 + location: The team garage 418 + 419 + recipients: 420 + # A person 421 + - family-names: Real Person 422 + given-names: One Truly 423 + name-particle: van der 424 + name-suffix: IV 425 + alias: Citey 426 + affiliation: Excellent University, Niceplace, Arcadia 427 + address: 22 Acacia Avenue 428 + city: Citationburgh 429 + region: Renfrewshire 430 + post-code: C13 7X7 431 + country: GB 432 + orcid: https://orcid.org/0000-0001-2345-6789 433 + email: project@entity.com 434 + tel: +44(0)141-323 4567 435 + fax: +44(0)141-323 45678 436 + website: https://www.entity-project-team.io 437 + # An entity 438 + - name: Entity Project Team Conference entity 439 + address: 22 Acacia Avenue 440 + city: Citationburgh 441 + region: Renfrewshire 442 + post-code: C13 7X7 443 + country: GB 444 + orcid: https://orcid.org/0000-0001-2345-6789 445 + email: project@entity.com 446 + tel: +44(0)141-323 4567 447 + fax: +44(0)141-323 45678 448 + website: https://www.entity-project-team.io 449 + date-start: 2017-01-01 450 + date-end: 2017-01-31 451 + location: The team garage 452 + 453 + senders: 454 + # A person 455 + - family-names: Real Person 456 + given-names: One Truly 457 + name-particle: van der 458 + name-suffix: IV 459 + alias: Citey 460 + affiliation: Excellent University, Niceplace, Arcadia 461 + address: 22 Acacia Avenue 462 + city: Citationburgh 463 + region: Renfrewshire 464 + post-code: C13 7X7 465 + country: GB 466 + orcid: https://orcid.org/0000-0001-2345-6789 467 + email: project@entity.com 468 + tel: +44(0)141-323 4567 469 + fax: +44(0)141-323 45678 470 + website: https://www.entity-project-team.io 471 + # An entity 472 + - name: Entity Project Team Conference entity 473 + address: 22 Acacia Avenue 474 + city: Citationburgh 475 + region: Renfrewshire 476 + post-code: C13 7X7 477 + country: GB 478 + orcid: https://orcid.org/0000-0001-2345-6789 479 + email: project@entity.com 480 + tel: +44(0)141-323 4567 481 + fax: +44(0)141-323 45678 482 + website: https://www.entity-project-team.io 483 + date-start: 2017-01-01 484 + date-end: 2017-01-31 485 + location: The team garage 486 + 487 + translators: 488 + # A person 489 + - family-names: Real Person 490 + given-names: One Truly 491 + name-particle: van der 492 + name-suffix: IV 493 + alias: Citey 494 + affiliation: Excellent University, Niceplace, Arcadia 495 + address: 22 Acacia Avenue 496 + city: Citationburgh 497 + region: Renfrewshire 498 + post-code: C13 7X7 499 + country: GB 500 + orcid: https://orcid.org/0000-0001-2345-6789 501 + email: project@entity.com 502 + tel: +44(0)141-323 4567 503 + fax: +44(0)141-323 45678 504 + website: https://www.entity-project-team.io 505 + # An entity 506 + - name: Entity Project Team Conference entity 507 + address: 22 Acacia Avenue 508 + city: Citationburgh 509 + region: Renfrewshire 510 + post-code: C13 7X7 511 + country: GB 512 + orcid: https://orcid.org/0000-0001-2345-6789 513 + email: project@entity.com 514 + tel: +44(0)141-323 4567 515 + fax: +44(0)141-323 45678 516 + website: https://www.entity-project-team.io 517 + date-start: 2017-01-01 518 + date-end: 2017-01-31 519 + location: The team garage
+23
project/ocaml-cff/vendor/git/citation-file-format/examples/1.1.0/reference-art/CITATION.cff
··· 1 + cff-version: 1.1.0 2 + message: "If you use this software, please cite the following." 3 + authors: 4 + - family-names: Druskat 5 + given-names: Stephan 6 + orcid: https://orcid.org/0000-0003-4925-7248 7 + title: My Research Tool 8 + version: 1.0.4 9 + doi: 10.5281/zenodo.1234 10 + date-released: 2017-12-18 11 + references: 12 + - type: art 13 + authors: 14 + - family-names: Picasso 15 + given-names: Pablo 16 + title: Guernica 17 + year: 1937 18 + medium: Oil on canvas 19 + format: 349.3cm x 776.6cm 20 + location: 21 + name: Museo Reina Sofia 22 + city: Madrid 23 + country: ES
+33
project/ocaml-cff/vendor/git/citation-file-format/examples/1.1.0/reference-article/CITATION.cff
··· 1 + cff-version: 1.1.0 2 + message: If you use this software, please cite it as below. 3 + authors: 4 + - family-names: Druskat 5 + given-names: Stephan 6 + orcid: https://orcid.org/0000-0003-4925-7248 7 + title: My Research Tool 8 + version: 1.0.4 9 + doi: 10.5281/zenodo.1234 10 + date-released: 2017-12-18 11 + references: 12 + - type: article 13 + authors: 14 + - family-names: Smith 15 + given-names: Arfon M. 16 + - family-names: Katz 17 + given-names: Daniel S. 18 + affiliation: "National Center for Supercomputing Applications & 19 + Electrical and Computer Engineering Department & School of Information 20 + Sciences, University of Illinois at Urbana-Champaign, Urbana, Illinois, 21 + United States" 22 + orcid: https://orcid.org/0000-0001-5934-7525 23 + - family-names: Niemeyer 24 + given-names: Kyle E. 25 + - name: "FORCE11 Software Citation Working Group" 26 + website: https://www.force11.org/group/software-citation-working-group 27 + title: "Software citation principles" 28 + year: 2016 29 + journal: PeerJ Computer Science 30 + volume: 2 31 + issue: e86 32 + doi: 10.7717/peerj-cs.86 33 + url: https://doi.org/10.7717/peerj-cs.86
+22
project/ocaml-cff/vendor/git/citation-file-format/examples/1.1.0/reference-blog/CITATION.cff
··· 1 + cff-version: 1.1.0 2 + message: If you use this software, please cite the software itself and the blog post. 3 + authors: 4 + - family-names: Druskat 5 + given-names: Stephan 6 + orcid: https://orcid.org/0000-0003-4925-7248 7 + title: My Research Tool 8 + version: 1.0.4 9 + doi: 10.5281/zenodo.1234 10 + date-released: 2017-12-18 11 + references: 12 + - type: blog 13 + authors: 14 + - family-names: Doe 15 + given-names: Jane 16 + title: "Implement a 100% accuracy syntax parser for all languages? No probs!" 17 + date-published: 2017-09-23 18 + url: https://hu-berlin.de/blogs/jdoe/2017/09/23/if-only 19 + institution: 20 + name: "Humboldt-Universität zu Berlin" 21 + city: Berlin 22 + country: DE
+21
project/ocaml-cff/vendor/git/citation-file-format/examples/1.1.0/reference-book/CITATION.cff
··· 1 + cff-version: 1.1.0 2 + message: "If you use MRT for your research, please cite the following book." 3 + authors: 4 + - family-names: Druskat 5 + given-names: Stephan 6 + orcid: https://orcid.org/0000-0003-4925-7248 7 + title: My Research Tool 8 + version: 1.0.4 9 + doi: 10.5281/zenodo.1234 10 + date-released: 2017-12-18 11 + references: 12 + - type: book 13 + authors: 14 + - family-names: Doe 15 + given-names: Jane 16 + title: "The future of syntax parsing" 17 + year: 2017 18 + publisher: 19 + name: Far Out Publications 20 + city: Bielefeld 21 + medium: print
+35
project/ocaml-cff/vendor/git/citation-file-format/examples/1.1.0/reference-conference-paper/CITATION.cff
··· 1 + cff-version: 1.1.0 2 + message: If you use this software, please cite the software and the paper. 3 + authors: 4 + - family-names: Druskat 5 + given-names: Stephan 6 + orcid: https://orcid.org/0000-0003-4925-7248 7 + title: My Research Tool 8 + version: 1.0.4 9 + doi: 10.5281/zenodo.1234 10 + date-released: 2017-12-18 11 + references: 12 + - type: conference-paper 13 + authors: 14 + - family-names: Doe 15 + given-names: Jane 16 + title: "Ultimate-accuracy syntax parsing with My Research Tool" 17 + year: 2017 18 + collection-title: "Proceedings of the 1st Conference on Wishful Thinking" 19 + collection-doi: 10.5281/zenodo.123456 20 + editors: 21 + - family-names: Kirk 22 + given-names: James T. 23 + conference: 24 + name: 1st Conference on Wishful Thinking 25 + location: Spock's Inn Hotel and Bar 26 + address: 123 Main St 27 + city: Bielefeld 28 + region: Jarvis Island 29 + post-code: "12345" 30 + country: UM 31 + date-start: 2017-04-01 32 + date-end: 2017-04-01 33 + start: 42 34 + end: 45 35 + doi: 10.5281/zenodo.1234
+21
project/ocaml-cff/vendor/git/citation-file-format/examples/1.1.0/reference-edited-work/CITATION.cff
··· 1 + cff-version: 1.1.0 2 + message: If you use this software, please cite it as below. 3 + authors: 4 + - family-names: Druskat 5 + given-names: Stephan 6 + orcid: https://orcid.org/0000-0003-4925-7248 7 + title: My Research Tool 8 + version: 1.0.4 9 + doi: 10.5281/zenodo.1234 10 + date-released: 2017-12-18 11 + references: 12 + - type: edited-work 13 + authors: 14 + - family-names: Doe 15 + given-names: Jane 16 + title: "Ultimate-accuracy parsing in practice" 17 + year: 2017 18 + publisher: 19 + name: Far Out Publications 20 + city: Bielefeld 21 + country: DE
+18
project/ocaml-cff/vendor/git/citation-file-format/examples/1.1.0/reference-report/CITATION.cff
··· 1 + cff-version: 1.1.0 2 + message: If you use this software, please cite it as below. 3 + authors: 4 + - family-names: Druskat 5 + given-names: Stephan 6 + orcid: https://orcid.org/0000-0003-4925-7248 7 + title: My Research Tool 8 + version: 1.0.4 9 + doi: 10.5281/zenodo.1234 10 + date-released: 2017-12-18 11 + references: 12 + - type: report 13 + authors: 14 + - name: Fictional Parsing Interest Group, ACME Inc. 15 + title: "100% accuracy syntax parsing at ACME" 16 + url: http://www.acme.com/sigs/fp/reports/hpsp.pdf 17 + year: 2017 18 + date-accessed: 2017-09-23
+27
project/ocaml-cff/vendor/git/citation-file-format/examples/1.1.0/reference-thesis/CITATION.cff
··· 1 + cff-version: 1.1.0 2 + message: If you use this software, please cite it as below. 3 + authors: 4 + - family-names: Druskat 5 + given-names: Stephan 6 + orcid: https://orcid.org/0000-0003-4925-7248 7 + title: My Research Tool 8 + version: 1.0.4 9 + doi: 10.5281/zenodo.1234 10 + date-released: 2017-12-18 11 + references: 12 + - type: thesis 13 + authors: 14 + - family-names: Doe 15 + given-names: Jane 16 + title: "A high accuracy syntax parser in Visual Basic" 17 + thesis-type: PhD 18 + year: 2017 19 + department: Dept. of Universal Language Philosophy 20 + institution: 21 + name: "Humboldt-Universität zu Berlin" 22 + city: Berlin 23 + country: DE 24 + database: Thesiserver 25 + date-accessed: 2017-09-23 26 + date-published: 2017-03-21 27 + url: http://thesiserver.hu-berlin.de/2017/march/phd/doe-12345
+12
project/ocaml-cff/vendor/git/citation-file-format/examples/1.1.0/software-container/CITATION.cff
··· 1 + cff-version: 1.1.0 2 + message: "If you use the MRT Docker container, please cite the following." 3 + authors: 4 + - name: "Humboldt-Universität zu Berlin" 5 + website: https://www.linguistik.hu-berlin.de/ 6 + - family-names: Doe 7 + given-names: Jane 8 + title: mrt-iain-m-banks 9 + version: 1.0.4 (Iain M. Banks) 10 + url: https://github.com/doe/docker-brew-mrt-core/blob/160d54f9e935/iain/Dockerfile 11 + repository: https://hub.docker.hu-berlin.de/_/mrt-iain-m-banks/ 12 + date-released: 2017-12-18
+10
project/ocaml-cff/vendor/git/citation-file-format/examples/1.1.0/software-executable/CITATION.cff
··· 1 + cff-version: 1.1.0 2 + message: "If you use MRT, please cite the following." 3 + authors: 4 + - family-names: Druskat 5 + given-names: Stephan 6 + orcid: https://orcid.org/0000-0003-4925-7248 7 + title: My Research Tool Kickstarter 8 + version: 2.0.4 9 + date-released: 2017-12-18 10 + repository-artifact: https://hu.berlin/nexus/mrt-kickstarter/2.0.4/mrt2-kickstarter.exe
+23
project/ocaml-cff/vendor/git/citation-file-format/examples/1.1.0/software-with-a-doi-expanded/CITATION.cff
··· 1 + cff-version: 1.1.0 2 + message: If you use this software, please cite it as below. 3 + authors: 4 + - family-names: Druskat 5 + given-names: Stephan 6 + orcid: https://orcid.org/0000-0003-4925-7248 7 + affiliation: "Humboldt-Universität zu Berlin, Dept. of German Studies and Linguistics" 8 + email: mail@sdruskat.net 9 + website: https://hu.berlin/sdruskat 10 + title: My Research Tool 11 + version: 1.0.4 12 + doi: 10.5281/zenodo.1234 13 + date-released: 2017-12-18 14 + repository-code: https://github.com/sdruskat/my-research-tool 15 + repository-artifact: https://hu.berlin/nexus/mrt 16 + keywords: 17 + - "McAuthor's algorithm" 18 + - linguistics 19 + - nlp 20 + - parser 21 + - deep convolutional neural network 22 + license: Apache-2.0 23 + url: https://sdruskat.github.io/my-research-tool
+10
project/ocaml-cff/vendor/git/citation-file-format/examples/1.1.0/software-with-a-doi/CITATION.cff
··· 1 + cff-version: 1.1.0 2 + message: If you use this software, please cite it as below. 3 + authors: 4 + - family-names: Druskat 5 + given-names: Stephan 6 + orcid: https://orcid.org/0000-0003-4925-7248 7 + title: My Research Tool 8 + version: 1.0.4 9 + doi: 10.5281/zenodo.1234 10 + date-released: 2017-12-18
+30
project/ocaml-cff/vendor/git/citation-file-format/examples/1.1.0/software-with-reference/CITATION.cff
··· 1 + cff-version: 1.1.0 2 + message: If you use My Research Tool, please cite both the software and the outline paper. 3 + authors: 4 + - family-names: Doe 5 + given-names: Jane 6 + - family-names: Bielefeld 7 + name-particle: von 8 + given-names: Arthur 9 + - family-names: McAuthor 10 + given-names: Juniper 11 + name-suffix: Jr. 12 + title: My Research Tool 13 + version: 1.0.4 14 + doi: 10.5281/zenodo.1234 15 + date-released: 2017-12-18 16 + references: 17 + - type: article 18 + scope: Cite this paper if you want to reference the general concepts of MRT. 19 + authors: 20 + - family-names: Doe 21 + given-names: Jane 22 + - family-names: Bielefeld 23 + name-particle: von 24 + given-names: Arthur 25 + title: "My Research Tool: A 100% accuracy syntax parser for all languages" 26 + year: 2099 27 + journal: Journal of Hard Science Fiction 28 + volume: 42 29 + issue: "13" 30 + doi: 10.9999/hardscifi-lang.42132
+17
project/ocaml-cff/vendor/git/citation-file-format/examples/1.1.0/software-without-a-doi-closed-source/CITATION.cff
··· 1 + cff-version: 1.1.0 2 + message: 3 + If you dare use this commercial, closed-source, strangely versioned 4 + software in your research, please at least cite it as below. 5 + authors: 6 + - family-names: Vader 7 + name-suffix: né Skywalker 8 + given-names: 'Anakin "Darth"' 9 + title: Opaquity 10 + version: opq-1234-XZVF-ACME-RLY 11 + date-released: 2017-02-28 12 + url: http://www.opaquity.com 13 + contact: 14 + - name: Dark Side Software 15 + address: DS-1 Orbital Battle Station, near Scarif 16 + email: father@imperial-empire.com 17 + tel: +850 (0)123-45-666
+11
project/ocaml-cff/vendor/git/citation-file-format/examples/1.1.0/software-without-a-doi/CITATION.cff
··· 1 + cff-version: 1.1.0 2 + message: "If you use this MRT alpha snapshot version, please cite." 3 + authors: 4 + - family-names: Druskat 5 + given-names: Stephan 6 + orcid: https://orcid.org/0000-0003-4925-7248 7 + title: My Research Tool Prototype 8 + version: 0.0.1-alpha1-build1507284872 9 + date-released: 2017-12-18 10 + repository-code: https://github.com/doe/mrt 11 + commit: 160d54f9e935c914df38c1ffda752112b5c979a8
+24
project/ocaml-cff/vendor/git/citation-file-format/examples/1.2.0/fail/additional-key/CITATION.cff
··· 1 + cff-version: 1.2.0 2 + message: "If you use this software, please cite the following." 3 + authors: 4 + - family-names: Druskat 5 + given-names: Stephan 6 + orcid: https://orcid.org/0000-0003-4925-7248 7 + title: My Research Tool 8 + extra: 45 9 + version: 1.0.4 10 + doi: 10.5281/zenodo.1234 11 + date-released: 2017-12-18 12 + references: 13 + - type: art 14 + authors: 15 + - family-names: Picasso 16 + given-names: Pablo 17 + title: Guernica 18 + year: 1937 19 + medium: Oil on canvas 20 + format: 349.3cm x 776.6cm 21 + location: 22 + name: Museo Reina Sofia 23 + city: Madrid 24 + country: ES
+1
project/ocaml-cff/vendor/git/citation-file-format/examples/1.2.0/fail/additional-key/README.md
··· 1 + Borrowed from [`ruby-cff`](https://github.com/citation-file-format/ruby-cff)'s fixtures https://github.com/citation-file-format/ruby-cff/tree/ec3aeff98855690d56ac2cd35f7181e5d9ee26f3/test/files.
+50
project/ocaml-cff/vendor/git/citation-file-format/examples/1.2.0/fail/ls1mardyn/ls1-mardyn-invalid-author-array/CITATION.cff
··· 1 + cff-version: 1.2.0 2 + message: This file contains CFF citation information, cf. https://citation-file-format.github.io/, for the ls1 mardyn molecular dynamics code developed by the Boltzmann-Zuse Society for Computational Molecular Engineering. 3 + title: ls1 mardyn 4 + url: http://www.ls1-mardyn.de/ 5 + repository-code: https://projects.hlrs.de/projects/ls1/ 6 + date-released: 2018-09-05 7 + commit: Revision 6473. 8 + version: Internal development version, situated between release 1.1.1 and prospective future release 1.2 9 + license-url: http://www.ls1-mardyn.de/license.html 10 + abstract: "The molecular dynamics code ls1 mardyn (large systems 1: molecular dynamics), developed by the Boltzmann-Zuse Society for Computational Molecular Engineering, is a scalable massively-parallel molecular modelling and simulation code for classical-mechanical intermolecular pair potential models of low-molecular fluids." 11 + contact: 12 + - given-names: Philipp 13 + family-names: Neumann 14 + author: 15 + - name: Boltzmann-Zuse Society for Computational Molecular Engineering 16 + country: DE 17 + references: 18 + - type: article 19 + title: "ls1 mardyn: The massively parallel molecular dynamics code for large systems" 20 + year: 2014 21 + authors: 22 + - given-names: Christoph 23 + family-names: Niethammer 24 + - given-names: Stefan 25 + family-names: Becker 26 + - given-names: Martin 27 + family-names: Bernreuther 28 + - given-names: Martin 29 + family-names: Buchholz 30 + - given-names: Wolfgang 31 + family-names: Eckhardt 32 + - given-names: Alexander 33 + family-names: Heinecke 34 + - given-names: Stephan 35 + family-names: Werth 36 + - given-names: Hans-Joachim 37 + family-names: Bungartz 38 + - given-names: Colin W. 39 + family-names: Glass 40 + - given-names: Hans 41 + family-names: Hasse 42 + - given-names: Jadran 43 + family-names: Vrabec 44 + - given-names: Martin 45 + family-names: Horsch 46 + journal: Journal of Chemical Theory and Computation 47 + volume: 10 48 + issue: 10 49 + pages: 4455-4464 50 + doi: 10.1021/ct500169q
+1
project/ocaml-cff/vendor/git/citation-file-format/examples/1.2.0/fail/ls1mardyn/ls1-mardyn-invalid-author-array/README.md
··· 1 + Borrowed from [`ruby-cff`](https://github.com/citation-file-format/ruby-cff)'s fixtures https://github.com/citation-file-format/ruby-cff/tree/ec3aeff98855690d56ac2cd35f7181e5d9ee26f3/test/files.
+63
project/ocaml-cff/vendor/git/citation-file-format/examples/1.2.0/fail/ls1mardyn/ls1-mardyn/CITATION.cff
··· 1 + cff-version: 1.2.0 2 + message: >- 3 + This file contains CFF citation information, cf. 4 + https://citation-file-format.github.io/, for the ls1 mardyn molecular dynamics 5 + code developed by the Boltzmann-Zuse Society for Computational Molecular 6 + Engineering. 7 + title: ls1 mardyn 8 + url: 'http://www.ls1-mardyn.de/' 9 + repository-code: 'https://projects.hlrs.de/projects/ls1/' 10 + date-released: 2018-09-05T00:00:00.000Z 11 + commit: Revision 6473. 12 + version: >- 13 + Internal development version, situated between release 1.1.1 and prospective 14 + future release 1.2 15 + license-url: 'http://www.ls1-mardyn.de/license.html' 16 + abstract: >- 17 + The molecular dynamics code ls1 mardyn (large systems 1: molecular dynamics), 18 + developed by the Boltzmann-Zuse Society for Computational Molecular 19 + Engineering, is a scalable massively-parallel molecular modelling and 20 + simulation code for classical-mechanical intermolecular pair potential models 21 + of low-molecular fluids. 22 + contact: 23 + - given-names: Philipp 24 + family-names: Neumann 25 + authors: 26 + - name: Boltzmann-Zuse Society for Computational Molecular Engineering 27 + country: DE 28 + references: 29 + - type: article 30 + title: >- 31 + ls1 mardyn: The massively parallel molecular dynamics code for large 32 + systems 33 + year: 2014 34 + authors: 35 + - given-names: Christoph 36 + family-names: Niethammer 37 + - given-names: Stefan 38 + family-names: Becker 39 + - given-names: Martin 40 + family-names: Bernreuther 41 + - given-names: Martin 42 + family-names: Buchholz 43 + - given-names: Wolfgang 44 + family-names: Eckhardt 45 + - given-names: Alexander 46 + family-names: Heinecke 47 + - given-names: Stephan 48 + family-names: Werth 49 + - given-names: Hans-Joachim 50 + family-names: Bungartz 51 + - given-names: Colin W. 52 + family-names: Glass 53 + - given-names: Hans 54 + family-names: Hasse 55 + - given-names: Jadran 56 + family-names: Vrabec 57 + - given-names: Martin 58 + family-names: Horsch 59 + journal: Journal of Chemical Theory and Computation 60 + volume: 10 61 + issue: 10 62 + pages: 4455-4464 63 + doi: 10.1021/ct500169q
+7
project/ocaml-cff/vendor/git/citation-file-format/examples/1.2.0/fail/ls1mardyn/ls1-mardyn/README.md
··· 1 + Borrowed from [`ruby-cff`](https://github.com/citation-file-format/ruby-cff)'s fixtures https://github.com/citation-file-format/ruby-cff/tree/ec3aeff98855690d56ac2cd35f7181e5d9ee26f3/test/files. 2 + 3 + - Updated `cff-version` to `"1.2.0"` 4 + 5 + Fails because 6 + - `date-released` is not in YYYY-MM-DD format 7 + - `pages` should be an integer describing the number of pages
+12
project/ocaml-cff/vendor/git/citation-file-format/examples/1.2.0/fail/tue-excellent-buildings/bso-toolbox-invalid-date/CITATION.cff
··· 1 + cff-version: 1.2.0 2 + message: If you use this software, please cite it as below. 3 + authors: 4 + - family-names: Boonstra 5 + given-names: Sjonnie 6 + orcid: https://orcid.org/0000-0001-9911-4507 7 + - family-names: Hofmeyer 8 + given-names: Hèrm 9 + title: "BSO Toolbox" 10 + version: 1.0 11 + doi: 10.5281/zenodo.3823893 12 + date-released: 2020-05-xx
+1
project/ocaml-cff/vendor/git/citation-file-format/examples/1.2.0/fail/tue-excellent-buildings/bso-toolbox-invalid-date/README.md
··· 1 + Borrowed from [`ruby-cff`](https://github.com/citation-file-format/ruby-cff)'s fixtures https://github.com/citation-file-format/ruby-cff/tree/ec3aeff98855690d56ac2cd35f7181e5d9ee26f3/test/files.
+22
project/ocaml-cff/vendor/git/citation-file-format/examples/1.2.0/pass/bjmorgan/bsym/CITATION.cff
··· 1 + cff-version: 1.2.0 2 + message: If you use this software, please cite both the software repository and the JOSS paper. 3 + authors: 4 + - family-names: Morgan 5 + given-names: Benjamin J. 6 + orcid: https://orcid.org/0000-0002-3056-8233 7 + title: bsym 8 + version: 1.1.0 9 + doi: 10.5281/zenodo.596912 10 + repository-code: https://github.com/bjmorgan/bsym 11 + license: MIT 12 + references: 13 + - type: article 14 + authors: 15 + - family-names: Morgan 16 + given-names: Benjamin J. 17 + title: "bsym: A basic symmetry module" 18 + year: 2017 19 + journal: Journal of Open Source Software 20 + volume: 2 21 + issue: "16" 22 + doi: 10.21105/joss.00370
+1
project/ocaml-cff/vendor/git/citation-file-format/examples/1.2.0/pass/bjmorgan/bsym/README.md
··· 1 + Borrowed from [`ruby-cff`](https://github.com/citation-file-format/ruby-cff)'s fixtures https://github.com/citation-file-format/ruby-cff/tree/ec3aeff98855690d56ac2cd35f7181e5d9ee26f3/test/files.
+47
project/ocaml-cff/vendor/git/citation-file-format/examples/1.2.0/pass/esalmela/haplowinder/CITATION.cff
··· 1 + cff-version: 1.2.0 2 + message: If you use this software, please cite it as below. 3 + authors: 4 + - family-names: Salmela 5 + given-names: Elina 6 + orcid: https://orcid.org/0000-0003-1326-4462 7 + title: HaploWinder 8 + version: "1.11" 9 + date-released: 2008-09-01 10 + license: MIT 11 + doi: 10.5281/zenodo.3901323 12 + references: 13 + - type: software 14 + authors: 15 + - family-names: Salmela 16 + given-names: Elina 17 + title: HaploWinder 18 + doi: 10.5281/zenodo.3901323 19 + url: https://github.com/esalmela/HaploWinder 20 + - type: article 21 + authors: 22 + - family-names: Lappalainen 23 + given-names: Tuuli 24 + - family-names: Hannelius 25 + given-names: Ulf 26 + - family-names: Salmela 27 + given-names: Elina 28 + - family-names: von Döbeln 29 + given-names: Ulrika 30 + - family-names: Lindgren 31 + given-names: Cecilia M. 32 + - family-names: Huoponen 33 + given-names: Kirsi 34 + - family-names: Savontaus 35 + given-names: Marja-Liisa 36 + - family-names: Kere 37 + given-names: Juha 38 + - family-names: Lahermo 39 + given-names: Päivi 40 + title: "Population structure in contemporary Sweden – A Y-chromosomal and mitochondrial DNA analysis" 41 + journal: "Annals of Human Genetics" 42 + year: 2009 43 + volume: 73 44 + issue: "1" 45 + start: 61 46 + end: 73 47 + doi: 10.1111/j.1469-1809.2008.00487.x
+5
project/ocaml-cff/vendor/git/citation-file-format/examples/1.2.0/pass/esalmela/haplowinder/README.md
··· 1 + Borrowed from [`ruby-cff`](https://github.com/citation-file-format/ruby-cff)'s fixtures https://github.com/citation-file-format/ruby-cff/tree/ec3aeff98855690d56ac2cd35f7181e5d9ee26f3/test/files. 2 + 3 + - Updated `cff-version` to `"1.2.0"` 4 + - Updated `version` to be a string 5 +
+921
project/ocaml-cff/vendor/git/citation-file-format/examples/1.2.0/pass/key-complete/CITATION.cff
··· 1 + ############################ 2 + # DO NOT USE FOR CITATION! # 3 + ############################ 4 + # This is a key-complete # 5 + # test file for validation # 6 + ############################ 7 + 8 + cff-version: 1.2.0 9 + 10 + message: If you use this software, please cite it as below. 11 + 12 + abstract: "This is an awesome piece of research software!" 13 + 14 + authors: 15 + # A person 16 + - family-names: Real Person 17 + given-names: One Truly 18 + name-particle: van der 19 + name-suffix: IV 20 + alias: Citey 21 + affiliation: Excellent University, Niceplace, Arcadia 22 + address: 22 Acacia Avenue 23 + city: Citationburgh 24 + region: Renfrewshire 25 + post-code: C13 7X7 26 + country: GB 27 + orcid: https://orcid.org/0000-0001-2345-6789 28 + email: project@entity.com 29 + tel: +44(0)141-323 4567 30 + fax: +44(0)141-323 45678 31 + website: https://www.entity-project-team.io 32 + # An entity 33 + - name: Entity Project Team Conference entity 34 + address: 22 Acacia Avenue 35 + city: Citationburgh 36 + region: Renfrewshire 37 + post-code: C13 7X7 38 + country: GB 39 + orcid: https://orcid.org/0000-0001-2345-6789 40 + email: project@entity.com 41 + tel: +44(0)141-323 4567 42 + fax: +44(0)141-323 45678 43 + website: https://www.entity-project-team.io 44 + date-start: 2017-01-01 45 + date-end: 2017-01-31 46 + location: The team garage 47 + 48 + commit: 156a04c74a8a79d40c5d705cddf9d36735feab4d 49 + 50 + contact: 51 + # A person 52 + - family-names: Real Person 53 + given-names: One Truly 54 + name-particle: van der 55 + name-suffix: IV 56 + alias: Citey 57 + affiliation: Excellent University, Niceplace, Arcadia 58 + address: 22 Acacia Avenue 59 + city: Citationburgh 60 + region: Renfrewshire 61 + post-code: C13 7X7 62 + country: GB 63 + orcid: https://orcid.org/0000-0001-2345-6789 64 + email: project@entity.com 65 + tel: +44(0)141-323 4567 66 + fax: +44(0)141-323 45678 67 + website: https://www.entity-project-team.io 68 + # An entity 69 + - name: Entity Project Team Conference entity 70 + address: 22 Acacia Avenue 71 + city: Citationburgh 72 + region: Renfrewshire 73 + post-code: C13 7X7 74 + country: GB 75 + orcid: https://orcid.org/0000-0001-2345-6789 76 + email: project@entity.com 77 + tel: +44(0)141-323 4567 78 + fax: +44(0)141-323 45678 79 + website: https://www.entity-project-team.io 80 + date-start: 2017-01-01 81 + date-end: 2017-01-31 82 + location: The team garage 83 + 84 + date-released: 2017-12-11 85 + 86 + doi: 10.5281/zenodo.1003150 87 + 88 + identifiers: 89 + - type: doi 90 + value: 10.5281/zenodo.1003150 91 + - type: swh 92 + value: swh:1:rel:99f6850374dc6597af01bd0ee1d3fc0699301b9f 93 + - type: url 94 + value: https://example.com 95 + - type: other 96 + value: other-schema://abcd.1234.efgh.5678 97 + 98 + keywords: 99 + - One 100 + - Two 101 + - Three 102 + - "4" 103 + 104 + license: CC-BY-SA-4.0 105 + 106 + license-url: https://spdx.org/licenses/CC-BY-SA-4.0.html#licenseText 107 + 108 + repository: https://www.example.com/foo/?bar=baz&inga=42&quux 109 + 110 + repository-code: http://foo.com/blah_(wikipedia)_blah#cite-1 111 + 112 + repository-artifact: https://files.pythonhosted.org/packages/0a/84/10507b69a07768bc16981184b4d147a0fc84b71fbf35c03bafc8dcced8e1/cffconvert-1.3.3.tar.gz 113 + 114 + title: Citation File Format 1.0.0 115 + 116 + url: http://userid:password@example.com:8080/ 117 + 118 + version: 1.0.0 119 + 120 + preferred-citation: 121 + # A reference 122 + type: book 123 + title: Book Title 124 + abbreviation: Abbr 125 + abstract: Description of the book. 126 + collection-doi: 10.5281/zenodo.1003150 127 + collection-title: Collection Title 128 + collection-type: Collection Type 129 + commit: 156a04c74a8a79d40c5d705cddf9d36735feab4d 130 + copyright: 2017 Stephan Druskat 131 + data-type: Data Type 132 + database: Database 133 + date-accessed: 2017-10-31 134 + date-downloaded: 2017-10-31 135 + date-released: 2017-10-31 136 + date-published: 2017-10-31 137 + department: Department 138 + doi: 10.5281/zenodo.1003150 139 + edition: 2nd edition 140 + end: 123 141 + entry: Chapter 9 142 + filename: book.zip 143 + format: Printed book 144 + identifiers: 145 + - type: doi 146 + value: 10.5281/zenodo.1003150 147 + - type: swh 148 + value: swh:1:rel:99f6850374dc6597af01bd0ee1d3fc0699301b9f 149 + - type: url 150 + value: https://example.com 151 + - type: other 152 + value: other-schema://abcd.1234.efgh.5678 153 + isbn: 978-1-89183-044-0 154 + issn: 1234-543X 155 + issue: "123" 156 + issue-date: December 157 + issue-title: Special Issue on Software Citation 158 + journal: PeerJ 159 + keywords: 160 + - Software 161 + - Citation 162 + languages: 163 + - aaa 164 + - zu 165 + license: Apache-2.0 166 + license-url: https://spdx.org/licenses/Apache-2.0.html#licenseText 167 + loc-start: 14 168 + loc-end: 54 169 + medium: hardcover book 170 + month: 03 171 + nihmsid: Don't know what format a NIHMSID is in 172 + notes: "A field for general notes about the reference, usable in other formats such as BibTeX." 173 + number: A general-purpose field for accession numbers, cf. the specifications for examples. 174 + number-volumes: 7 175 + pages: 765 176 + patent-states: 177 + - Germany 178 + - ROI 179 + - "but also for example US states, such as:" 180 + - IL 181 + - RI 182 + pmcid: PMC1234567 183 + repository: http://code.google.com/events/#&product=browser 184 + repository-code: http://142.42.1.1:8080/ 185 + repository-artifact: https://files.pythonhosted.org/packages/0a/84/10507b69a07768bc16981184b4d147a0fc84b71fbf35c03bafc8dcced8e1/cffconvert-1.3.3.tar.gz 186 + scope: Cite this book if you want to reference the general concepts implemented in Citation File Format 1.0.0. 187 + section: Chapter 2 - "Reference keys" 188 + status: advance-online 189 + start: 123 190 + thesis-type: Doctoral dissertation 191 + url: http://j.mp 192 + version: 0.0.1423-BETA 193 + volume: 2 194 + volume-title: Advances in Software Citation 195 + year: 2017 196 + year-original: 2012 197 + 198 + # Object-based keys for the reference 199 + conference: 200 + # An entity 201 + name: Entity Project Team Conference entity 202 + address: 22 Acacia Avenue 203 + city: Citationburgh 204 + region: Renfrewshire 205 + post-code: C13 7X7 206 + country: GB 207 + orcid: https://orcid.org/0000-0001-2345-6789 208 + email: project@entity.com 209 + tel: +44(0)141-323 4567 210 + fax: +44(0)141-323 45678 211 + website: https://www.entity-project-team.io 212 + date-start: 2017-01-01 213 + date-end: 2017-01-31 214 + location: The team garage 215 + 216 + authors: 217 + # A person 218 + - family-names: Real Person 219 + given-names: One Truly 220 + name-particle: van der 221 + name-suffix: IV 222 + alias: Citey 223 + affiliation: Excellent University, Niceplace, Arcadia 224 + address: 22 Acacia Avenue 225 + city: Citationburgh 226 + region: Renfrewshire 227 + post-code: C13 7X7 228 + country: GB 229 + orcid: https://orcid.org/0000-0001-2345-6789 230 + email: project@entity.com 231 + tel: +44(0)141-323 4567 232 + fax: +44(0)141-323 45678 233 + website: https://www.entity-project-team.io 234 + # An entity 235 + - name: Entity Project Team Conference entity 236 + address: 22 Acacia Avenue 237 + city: Citationburgh 238 + region: Renfrewshire 239 + post-code: C13 7X7 240 + country: GB 241 + orcid: https://orcid.org/0000-0001-2345-6789 242 + email: project@entity.com 243 + tel: +44(0)141-323 4567 244 + fax: +44(0)141-323 45678 245 + website: https://www.entity-project-team.io 246 + date-start: 2017-01-01 247 + date-end: 2017-01-31 248 + location: The team garage 249 + 250 + contact: 251 + # A person 252 + - family-names: Real Person 253 + given-names: One Truly 254 + name-particle: van der 255 + name-suffix: IV 256 + alias: Citey 257 + affiliation: Excellent University, Niceplace, Arcadia 258 + address: 22 Acacia Avenue 259 + city: Citationburgh 260 + region: Renfrewshire 261 + post-code: C13 7X7 262 + country: GB 263 + orcid: https://orcid.org/0000-0001-2345-6789 264 + email: project@entity.com 265 + tel: +44(0)141-323 4567 266 + fax: +44(0)141-323 45678 267 + website: https://www.entity-project-team.io 268 + # An entity 269 + - name: Entity Project Team Conference entity 270 + address: 22 Acacia Avenue 271 + city: Citationburgh 272 + region: Renfrewshire 273 + post-code: C13 7X7 274 + country: GB 275 + orcid: https://orcid.org/0000-0001-2345-6789 276 + email: project@entity.com 277 + tel: +44(0)141-323 4567 278 + fax: +44(0)141-323 45678 279 + website: https://www.entity-project-team.io 280 + date-start: 2017-01-01 281 + date-end: 2017-01-31 282 + location: The team garage 283 + 284 + database-provider: 285 + # An entity 286 + name: Entity Project Team Conference entity 287 + address: 22 Acacia Avenue 288 + city: Citationburgh 289 + region: Renfrewshire 290 + post-code: C13 7X7 291 + country: GB 292 + orcid: https://orcid.org/0000-0001-2345-6789 293 + email: project@entity.com 294 + tel: +44(0)141-323 4567 295 + fax: +44(0)141-323 45678 296 + website: https://www.entity-project-team.io 297 + date-start: 2017-01-01 298 + date-end: 2017-01-31 299 + location: The team garage 300 + 301 + editors: 302 + # A person 303 + - family-names: Real Person 304 + given-names: One Truly 305 + name-particle: van der 306 + name-suffix: IV 307 + alias: Citey 308 + affiliation: Excellent University, Niceplace, Arcadia 309 + address: 22 Acacia Avenue 310 + city: Citationburgh 311 + region: Renfrewshire 312 + post-code: C13 7X7 313 + country: GB 314 + orcid: https://orcid.org/0000-0001-2345-6789 315 + email: project@entity.com 316 + tel: +44(0)141-323 4567 317 + fax: +44(0)141-323 45678 318 + website: https://www.entity-project-team.io 319 + # An entity 320 + - name: Entity Project Team Conference entity 321 + address: 22 Acacia Avenue 322 + city: Citationburgh 323 + region: Renfrewshire 324 + post-code: C13 7X7 325 + country: GB 326 + orcid: https://orcid.org/0000-0001-2345-6789 327 + email: project@entity.com 328 + tel: +44(0)141-323 4567 329 + fax: +44(0)141-323 45678 330 + website: https://www.entity-project-team.io 331 + date-start: 2017-01-01 332 + date-end: 2017-01-31 333 + location: The team garage 334 + 335 + editors-series: 336 + # A person 337 + - family-names: Real Person 338 + given-names: One Truly 339 + name-particle: van der 340 + name-suffix: IV 341 + alias: Citey 342 + affiliation: Excellent University, Niceplace, Arcadia 343 + address: 22 Acacia Avenue 344 + city: Citationburgh 345 + region: Renfrewshire 346 + post-code: C13 7X7 347 + country: GB 348 + orcid: https://orcid.org/0000-0001-2345-6789 349 + email: project@entity.com 350 + tel: +44(0)141-323 4567 351 + fax: +44(0)141-323 45678 352 + website: https://www.entity-project-team.io 353 + # An entity 354 + - name: Entity Project Team Conference entity 355 + address: 22 Acacia Avenue 356 + city: Citationburgh 357 + region: Renfrewshire 358 + post-code: C13 7X7 359 + country: GB 360 + orcid: https://orcid.org/0000-0001-2345-6789 361 + email: project@entity.com 362 + tel: +44(0)141-323 4567 363 + fax: +44(0)141-323 45678 364 + website: https://www.entity-project-team.io 365 + date-start: 2017-01-01 366 + date-end: 2017-01-31 367 + location: The team garage 368 + 369 + institution: 370 + # An entity 371 + name: Entity Project Team Conference entity 372 + address: 22 Acacia Avenue 373 + city: Citationburgh 374 + region: Renfrewshire 375 + post-code: C13 7X7 376 + country: GB 377 + orcid: https://orcid.org/0000-0001-2345-6789 378 + email: project@entity.com 379 + tel: +44(0)141-323 4567 380 + fax: +44(0)141-323 45678 381 + website: https://www.entity-project-team.io 382 + date-start: 2017-01-01 383 + date-end: 2017-01-31 384 + location: The team garage 385 + 386 + location: 387 + # An entity 388 + name: Entity Project Team Conference entity 389 + address: 22 Acacia Avenue 390 + city: Citationburgh 391 + region: Renfrewshire 392 + post-code: C13 7X7 393 + country: GB 394 + orcid: https://orcid.org/0000-0001-2345-6789 395 + email: project@entity.com 396 + tel: +44(0)141-323 4567 397 + fax: +44(0)141-323 45678 398 + website: https://www.entity-project-team.io 399 + date-start: 2017-01-01 400 + date-end: 2017-01-31 401 + location: The team garage 402 + 403 + publisher: 404 + # An entity 405 + name: Entity Project Team Conference entity 406 + address: 22 Acacia Avenue 407 + city: Citationburgh 408 + region: Renfrewshire 409 + post-code: C13 7X7 410 + country: GB 411 + orcid: https://orcid.org/0000-0001-2345-6789 412 + email: project@entity.com 413 + tel: +44(0)141-323 4567 414 + fax: +44(0)141-323 45678 415 + website: https://www.entity-project-team.io 416 + date-start: 2017-01-01 417 + date-end: 2017-01-31 418 + location: The team garage 419 + 420 + recipients: 421 + # A person 422 + - family-names: Real Person 423 + given-names: One Truly 424 + name-particle: van der 425 + name-suffix: IV 426 + alias: Citey 427 + affiliation: Excellent University, Niceplace, Arcadia 428 + address: 22 Acacia Avenue 429 + city: Citationburgh 430 + region: Renfrewshire 431 + post-code: C13 7X7 432 + country: GB 433 + orcid: https://orcid.org/0000-0001-2345-6789 434 + email: project@entity.com 435 + tel: +44(0)141-323 4567 436 + fax: +44(0)141-323 45678 437 + website: https://www.entity-project-team.io 438 + # An entity 439 + - name: Entity Project Team Conference entity 440 + address: 22 Acacia Avenue 441 + city: Citationburgh 442 + region: Renfrewshire 443 + post-code: C13 7X7 444 + country: GB 445 + orcid: https://orcid.org/0000-0001-2345-6789 446 + email: project@entity.com 447 + tel: +44(0)141-323 4567 448 + fax: +44(0)141-323 45678 449 + website: https://www.entity-project-team.io 450 + date-start: 2017-01-01 451 + date-end: 2017-01-31 452 + location: The team garage 453 + 454 + senders: 455 + # A person 456 + - family-names: Real Person 457 + given-names: One Truly 458 + name-particle: van der 459 + name-suffix: IV 460 + alias: Citey 461 + affiliation: Excellent University, Niceplace, Arcadia 462 + address: 22 Acacia Avenue 463 + city: Citationburgh 464 + region: Renfrewshire 465 + post-code: C13 7X7 466 + country: GB 467 + orcid: https://orcid.org/0000-0001-2345-6789 468 + email: project@entity.com 469 + tel: +44(0)141-323 4567 470 + fax: +44(0)141-323 45678 471 + website: https://www.entity-project-team.io 472 + # An entity 473 + - name: Entity Project Team Conference entity 474 + address: 22 Acacia Avenue 475 + city: Citationburgh 476 + region: Renfrewshire 477 + post-code: C13 7X7 478 + country: GB 479 + orcid: https://orcid.org/0000-0001-2345-6789 480 + email: project@entity.com 481 + tel: +44(0)141-323 4567 482 + fax: +44(0)141-323 45678 483 + website: https://www.entity-project-team.io 484 + date-start: 2017-01-01 485 + date-end: 2017-01-31 486 + location: The team garage 487 + 488 + translators: 489 + # A person 490 + - family-names: Real Person 491 + given-names: One Truly 492 + name-particle: van der 493 + name-suffix: IV 494 + alias: Citey 495 + affiliation: Excellent University, Niceplace, Arcadia 496 + address: 22 Acacia Avenue 497 + city: Citationburgh 498 + region: Renfrewshire 499 + post-code: C13 7X7 500 + country: GB 501 + orcid: https://orcid.org/0000-0001-2345-6789 502 + email: project@entity.com 503 + tel: +44(0)141-323 4567 504 + fax: +44(0)141-323 45678 505 + website: https://www.entity-project-team.io 506 + # An entity 507 + - name: Entity Project Team Conference entity 508 + address: 22 Acacia Avenue 509 + city: Citationburgh 510 + region: Renfrewshire 511 + post-code: C13 7X7 512 + country: GB 513 + orcid: https://orcid.org/0000-0001-2345-6789 514 + email: project@entity.com 515 + tel: +44(0)141-323 4567 516 + fax: +44(0)141-323 45678 517 + website: https://www.entity-project-team.io 518 + date-start: 2017-01-01 519 + date-end: 2017-01-31 520 + location: The team garage 521 + 522 + references: 523 + - type: book 524 + title: Book Title 525 + abbreviation: Abbr 526 + abstract: Description of the book. 527 + collection-doi: 10.5281/zenodo.1003150 528 + collection-title: Collection Title 529 + collection-type: Collection Type 530 + commit: 156a04c74a8a79d40c5d705cddf9d36735feab4d 531 + copyright: 2017 Stephan Druskat 532 + data-type: Data Type 533 + database: Database 534 + date-accessed: 2017-10-31 535 + date-downloaded: 2017-10-31 536 + date-released: 2017-10-31 537 + date-published: 2017-10-31 538 + department: Department 539 + doi: 10.5281/zenodo.1003150 540 + edition: 2nd edition 541 + end: 123 542 + entry: Chapter 9 543 + filename: book.zip 544 + format: Printed book 545 + identifiers: 546 + - type: doi 547 + value: 10.5281/zenodo.1003150 548 + - type: swh 549 + value: swh:1:rel:99f6850374dc6597af01bd0ee1d3fc0699301b9f 550 + - type: url 551 + value: https://example.com 552 + - type: other 553 + value: other-schema://abcd.1234.efgh.5678 554 + isbn: 978-1-89183-044-0 555 + issn: 1234-543X 556 + issue: "123" 557 + issue-date: December 558 + issue-title: Special Issue on Software Citation 559 + journal: PeerJ 560 + keywords: 561 + - Software 562 + - Citation 563 + languages: 564 + - aaa 565 + - zu 566 + license: Apache-2.0 567 + license-url: https://spdx.org/licenses/Apache-2.0.html#licenseText 568 + loc-start: 14 569 + loc-end: 54 570 + medium: hardcover book 571 + month: 03 572 + nihmsid: Don't know what format a NIHMSID is in 573 + notes: "A field for general notes about the reference, usable in other formats such as BibTeX." 574 + number: A general-purpose field for accession numbers, cf. the specifications for examples. 575 + number-volumes: 7 576 + pages: 765 577 + patent-states: 578 + - Germany 579 + - ROI 580 + - "but also for example US states, such as:" 581 + - IL 582 + - RI 583 + pmcid: PMC1234567 584 + repository: http://code.google.com/events/#&product=browser 585 + repository-code: http://142.42.1.1:8080/ 586 + repository-artifact: https://files.pythonhosted.org/packages/0a/84/10507b69a07768bc16981184b4d147a0fc84b71fbf35c03bafc8dcced8e1/cffconvert-1.3.3.tar.gz 587 + scope: Cite this book if you want to reference the general concepts implemented in Citation File Format 1.0.0. 588 + section: Chapter 2 - "Reference keys" 589 + status: advance-online 590 + start: 123 591 + thesis-type: Doctoral dissertation 592 + url: http://j.mp 593 + version: 0.0.1423-BETA 594 + volume: 2 595 + volume-title: Advances in Software Citation 596 + year: 2017 597 + year-original: 2012 598 + 599 + # Object-based keys for the reference 600 + conference: 601 + # An entity 602 + name: Entity Project Team Conference entity 603 + address: 22 Acacia Avenue 604 + city: Citationburgh 605 + region: Renfrewshire 606 + post-code: C13 7X7 607 + country: GB 608 + orcid: https://orcid.org/0000-0001-2345-6789 609 + email: project@entity.com 610 + tel: +44(0)141-323 4567 611 + fax: +44(0)141-323 45678 612 + website: https://www.entity-project-team.io 613 + date-start: 2017-01-01 614 + date-end: 2017-01-31 615 + location: The team garage 616 + 617 + authors: 618 + # A person 619 + - family-names: Real Person 620 + given-names: One Truly 621 + name-particle: van der 622 + name-suffix: IV 623 + alias: Citey 624 + affiliation: Excellent University, Niceplace, Arcadia 625 + address: 22 Acacia Avenue 626 + city: Citationburgh 627 + region: Renfrewshire 628 + post-code: C13 7X7 629 + country: GB 630 + orcid: https://orcid.org/0000-0001-2345-6789 631 + email: project@entity.com 632 + tel: +44(0)141-323 4567 633 + fax: +44(0)141-323 45678 634 + website: https://www.entity-project-team.io 635 + # An entity 636 + - name: Entity Project Team Conference entity 637 + address: 22 Acacia Avenue 638 + city: Citationburgh 639 + region: Renfrewshire 640 + post-code: C13 7X7 641 + country: GB 642 + orcid: https://orcid.org/0000-0001-2345-6789 643 + email: project@entity.com 644 + tel: +44(0)141-323 4567 645 + fax: +44(0)141-323 45678 646 + website: https://www.entity-project-team.io 647 + date-start: 2017-01-01 648 + date-end: 2017-01-31 649 + location: The team garage 650 + 651 + contact: 652 + # A person 653 + - family-names: Real Person 654 + given-names: One Truly 655 + name-particle: van der 656 + name-suffix: IV 657 + alias: Citey 658 + affiliation: Excellent University, Niceplace, Arcadia 659 + address: 22 Acacia Avenue 660 + city: Citationburgh 661 + region: Renfrewshire 662 + post-code: C13 7X7 663 + country: GB 664 + orcid: https://orcid.org/0000-0001-2345-6789 665 + email: project@entity.com 666 + tel: +44(0)141-323 4567 667 + fax: +44(0)141-323 45678 668 + website: https://www.entity-project-team.io 669 + # An entity 670 + - name: Entity Project Team Conference entity 671 + address: 22 Acacia Avenue 672 + city: Citationburgh 673 + region: Renfrewshire 674 + post-code: C13 7X7 675 + country: GB 676 + orcid: https://orcid.org/0000-0001-2345-6789 677 + email: project@entity.com 678 + tel: +44(0)141-323 4567 679 + fax: +44(0)141-323 45678 680 + website: https://www.entity-project-team.io 681 + date-start: 2017-01-01 682 + date-end: 2017-01-31 683 + location: The team garage 684 + 685 + database-provider: 686 + # An entity 687 + name: Entity Project Team Conference entity 688 + address: 22 Acacia Avenue 689 + city: Citationburgh 690 + region: Renfrewshire 691 + post-code: C13 7X7 692 + country: GB 693 + orcid: https://orcid.org/0000-0001-2345-6789 694 + email: project@entity.com 695 + tel: +44(0)141-323 4567 696 + fax: +44(0)141-323 45678 697 + website: https://www.entity-project-team.io 698 + date-start: 2017-01-01 699 + date-end: 2017-01-31 700 + location: The team garage 701 + 702 + editors: 703 + # A person 704 + - family-names: Real Person 705 + given-names: One Truly 706 + name-particle: van der 707 + name-suffix: IV 708 + alias: Citey 709 + affiliation: Excellent University, Niceplace, Arcadia 710 + address: 22 Acacia Avenue 711 + city: Citationburgh 712 + region: Renfrewshire 713 + post-code: C13 7X7 714 + country: GB 715 + orcid: https://orcid.org/0000-0001-2345-6789 716 + email: project@entity.com 717 + tel: +44(0)141-323 4567 718 + fax: +44(0)141-323 45678 719 + website: https://www.entity-project-team.io 720 + # An entity 721 + - name: Entity Project Team Conference entity 722 + address: 22 Acacia Avenue 723 + city: Citationburgh 724 + region: Renfrewshire 725 + post-code: C13 7X7 726 + country: GB 727 + orcid: https://orcid.org/0000-0001-2345-6789 728 + email: project@entity.com 729 + tel: +44(0)141-323 4567 730 + fax: +44(0)141-323 45678 731 + website: https://www.entity-project-team.io 732 + date-start: 2017-01-01 733 + date-end: 2017-01-31 734 + location: The team garage 735 + 736 + editors-series: 737 + # A person 738 + - family-names: Real Person 739 + given-names: One Truly 740 + name-particle: van der 741 + name-suffix: IV 742 + alias: Citey 743 + affiliation: Excellent University, Niceplace, Arcadia 744 + address: 22 Acacia Avenue 745 + city: Citationburgh 746 + region: Renfrewshire 747 + post-code: C13 7X7 748 + country: GB 749 + orcid: https://orcid.org/0000-0001-2345-6789 750 + email: project@entity.com 751 + tel: +44(0)141-323 4567 752 + fax: +44(0)141-323 45678 753 + website: https://www.entity-project-team.io 754 + # An entity 755 + - name: Entity Project Team Conference entity 756 + address: 22 Acacia Avenue 757 + city: Citationburgh 758 + region: Renfrewshire 759 + post-code: C13 7X7 760 + country: GB 761 + orcid: https://orcid.org/0000-0001-2345-6789 762 + email: project@entity.com 763 + tel: +44(0)141-323 4567 764 + fax: +44(0)141-323 45678 765 + website: https://www.entity-project-team.io 766 + date-start: 2017-01-01 767 + date-end: 2017-01-31 768 + location: The team garage 769 + 770 + institution: 771 + # An entity 772 + name: Entity Project Team Conference entity 773 + address: 22 Acacia Avenue 774 + city: Citationburgh 775 + region: Renfrewshire 776 + post-code: C13 7X7 777 + country: GB 778 + orcid: https://orcid.org/0000-0001-2345-6789 779 + email: project@entity.com 780 + tel: +44(0)141-323 4567 781 + fax: +44(0)141-323 45678 782 + website: https://www.entity-project-team.io 783 + date-start: 2017-01-01 784 + date-end: 2017-01-31 785 + location: The team garage 786 + 787 + location: 788 + # An entity 789 + name: Entity Project Team Conference entity 790 + address: 22 Acacia Avenue 791 + city: Citationburgh 792 + region: Renfrewshire 793 + post-code: C13 7X7 794 + country: GB 795 + orcid: https://orcid.org/0000-0001-2345-6789 796 + email: project@entity.com 797 + tel: +44(0)141-323 4567 798 + fax: +44(0)141-323 45678 799 + website: https://www.entity-project-team.io 800 + date-start: 2017-01-01 801 + date-end: 2017-01-31 802 + location: The team garage 803 + 804 + publisher: 805 + # An entity 806 + name: Entity Project Team Conference entity 807 + address: 22 Acacia Avenue 808 + city: Citationburgh 809 + region: Renfrewshire 810 + post-code: C13 7X7 811 + country: GB 812 + orcid: https://orcid.org/0000-0001-2345-6789 813 + email: project@entity.com 814 + tel: +44(0)141-323 4567 815 + fax: +44(0)141-323 45678 816 + website: https://www.entity-project-team.io 817 + date-start: 2017-01-01 818 + date-end: 2017-01-31 819 + location: The team garage 820 + 821 + recipients: 822 + # A person 823 + - family-names: Real Person 824 + given-names: One Truly 825 + name-particle: van der 826 + name-suffix: IV 827 + alias: Citey 828 + affiliation: Excellent University, Niceplace, Arcadia 829 + address: 22 Acacia Avenue 830 + city: Citationburgh 831 + region: Renfrewshire 832 + post-code: C13 7X7 833 + country: GB 834 + orcid: https://orcid.org/0000-0001-2345-6789 835 + email: project@entity.com 836 + tel: +44(0)141-323 4567 837 + fax: +44(0)141-323 45678 838 + website: https://www.entity-project-team.io 839 + # An entity 840 + - name: Entity Project Team Conference entity 841 + address: 22 Acacia Avenue 842 + city: Citationburgh 843 + region: Renfrewshire 844 + post-code: C13 7X7 845 + country: GB 846 + orcid: https://orcid.org/0000-0001-2345-6789 847 + email: project@entity.com 848 + tel: +44(0)141-323 4567 849 + fax: +44(0)141-323 45678 850 + website: https://www.entity-project-team.io 851 + date-start: 2017-01-01 852 + date-end: 2017-01-31 853 + location: The team garage 854 + 855 + senders: 856 + # A person 857 + - family-names: Real Person 858 + given-names: One Truly 859 + name-particle: van der 860 + name-suffix: IV 861 + alias: Citey 862 + affiliation: Excellent University, Niceplace, Arcadia 863 + address: 22 Acacia Avenue 864 + city: Citationburgh 865 + region: Renfrewshire 866 + post-code: C13 7X7 867 + country: GB 868 + orcid: https://orcid.org/0000-0001-2345-6789 869 + email: project@entity.com 870 + tel: +44(0)141-323 4567 871 + fax: +44(0)141-323 45678 872 + website: https://www.entity-project-team.io 873 + # An entity 874 + - name: Entity Project Team Conference entity 875 + address: 22 Acacia Avenue 876 + city: Citationburgh 877 + region: Renfrewshire 878 + post-code: C13 7X7 879 + country: GB 880 + orcid: https://orcid.org/0000-0001-2345-6789 881 + email: project@entity.com 882 + tel: +44(0)141-323 4567 883 + fax: +44(0)141-323 45678 884 + website: https://www.entity-project-team.io 885 + date-start: 2017-01-01 886 + date-end: 2017-01-31 887 + location: The team garage 888 + 889 + translators: 890 + # A person 891 + - family-names: Real Person 892 + given-names: One Truly 893 + name-particle: van der 894 + name-suffix: IV 895 + alias: Citey 896 + affiliation: Excellent University, Niceplace, Arcadia 897 + address: 22 Acacia Avenue 898 + city: Citationburgh 899 + region: Renfrewshire 900 + post-code: C13 7X7 901 + country: GB 902 + orcid: https://orcid.org/0000-0001-2345-6789 903 + email: project@entity.com 904 + tel: +44(0)141-323 4567 905 + fax: +44(0)141-323 45678 906 + website: https://www.entity-project-team.io 907 + # An entity 908 + - name: Entity Project Team Conference entity 909 + address: 22 Acacia Avenue 910 + city: Citationburgh 911 + region: Renfrewshire 912 + post-code: C13 7X7 913 + country: GB 914 + orcid: https://orcid.org/0000-0001-2345-6789 915 + email: project@entity.com 916 + tel: +44(0)141-323 4567 917 + fax: +44(0)141-323 45678 918 + website: https://www.entity-project-team.io 919 + date-start: 2017-01-01 920 + date-end: 2017-01-31 921 + location: The team garage
+64
project/ocaml-cff/vendor/git/citation-file-format/examples/1.2.0/pass/ls1mardyn/ls1-mardyn/CITATION.cff
··· 1 + cff-version: 1.2.0 2 + message: >- 3 + This file contains CFF citation information, cf. 4 + https://citation-file-format.github.io/, for the ls1 mardyn molecular dynamics 5 + code developed by the Boltzmann-Zuse Society for Computational Molecular 6 + Engineering. 7 + title: ls1 mardyn 8 + url: 'http://www.ls1-mardyn.de/' 9 + repository-code: 'https://projects.hlrs.de/projects/ls1/' 10 + date-released: 2018-09-05 11 + commit: Revision 6473. 12 + version: >- 13 + Internal development version, situated between release 1.1.1 and prospective 14 + future release 1.2 15 + license-url: 'http://www.ls1-mardyn.de/license.html' 16 + abstract: >- 17 + The molecular dynamics code ls1 mardyn (large systems 1: molecular dynamics), 18 + developed by the Boltzmann-Zuse Society for Computational Molecular 19 + Engineering, is a scalable massively-parallel molecular modelling and 20 + simulation code for classical-mechanical intermolecular pair potential models 21 + of low-molecular fluids. 22 + contact: 23 + - given-names: Philipp 24 + family-names: Neumann 25 + authors: 26 + - name: Boltzmann-Zuse Society for Computational Molecular Engineering 27 + country: DE 28 + references: 29 + - type: article 30 + title: >- 31 + ls1 mardyn: The massively parallel molecular dynamics code for large 32 + systems 33 + year: 2014 34 + authors: 35 + - given-names: Christoph 36 + family-names: Niethammer 37 + - given-names: Stefan 38 + family-names: Becker 39 + - given-names: Martin 40 + family-names: Bernreuther 41 + - given-names: Martin 42 + family-names: Buchholz 43 + - given-names: Wolfgang 44 + family-names: Eckhardt 45 + - given-names: Alexander 46 + family-names: Heinecke 47 + - given-names: Stephan 48 + family-names: Werth 49 + - given-names: Hans-Joachim 50 + family-names: Bungartz 51 + - given-names: Colin W. 52 + family-names: Glass 53 + - given-names: Hans 54 + family-names: Hasse 55 + - given-names: Jadran 56 + family-names: Vrabec 57 + - given-names: Martin 58 + family-names: Horsch 59 + journal: Journal of Chemical Theory and Computation 60 + volume: 10 61 + issue: "10" 62 + start: 4455 63 + end: 4464 64 + doi: 10.1021/ct500169q
+6
project/ocaml-cff/vendor/git/citation-file-format/examples/1.2.0/pass/ls1mardyn/ls1-mardyn/README.md
··· 1 + Borrowed from [`ruby-cff`](https://github.com/citation-file-format/ruby-cff)'s fixtures https://github.com/citation-file-format/ruby-cff/tree/ec3aeff98855690d56ac2cd35f7181e5d9ee26f3/test/files. 2 + 3 + - Updated `cff-version` to `"1.2.0"` 4 + - Updated `date-released` to comply with `YYYY-MM-DD` format 5 + - Updated `issue` to be a string 6 + - Replaced `pages` with `start` and `end`
+8
project/ocaml-cff/vendor/git/citation-file-format/examples/1.2.0/pass/minimal/CITATION.cff
··· 1 + # A minimal CFF file with only the required fields included. 2 + 3 + cff-version: 1.2.0 4 + message: If you use this software in your work, please cite it using the following metadata 5 + title: Ruby CFF Library 6 + authors: 7 + - family-names: Haines 8 + given-names: Robert
+1
project/ocaml-cff/vendor/git/citation-file-format/examples/1.2.0/pass/minimal/README.md
··· 1 + Borrowed from [`ruby-cff`](https://github.com/citation-file-format/ruby-cff)'s fixtures https://github.com/citation-file-format/ruby-cff/tree/ec3aeff98855690d56ac2cd35f7181e5d9ee26f3/test/files, with some changes.
+84
project/ocaml-cff/vendor/git/citation-file-format/examples/1.2.0/pass/poc/CITATION.cff
··· 1 + authors: 2 + - 3 + name: "entity name" 4 + address: My address 44 5 + alias: my alias 6 + city: my city 7 + country: NL 8 + email: me@email.org 9 + fax: "02323-3543-46256" 10 + orcid: https://orcid.org/0123-4567-8901-234X 11 + post-code: 12334 DVG 12 + region: My region 13 + tel: "1-34245-7346356-8467" 14 + website: https://my.domain/website/ 15 + date-start: 2021-05-16 16 + date-end: 2021-05-16 17 + location: "somewhere" 18 + - 19 + address: My address 44 20 + affiliation: my affiliation 21 + alias: my alias 22 + city: my city 23 + country: NL 24 + email: me@email.org 25 + family-names: My Family Names 26 + fax: "02323-3543-46256" 27 + given-names: My Given Names 28 + name-particle: von der 29 + name-suffix: III 30 + orcid: https://orcid.org/0123-4567-8901-234X 31 + post-code: 12334 DVG 32 + region: My region 33 + tel: "1-34245-7346356-8467" 34 + website: https://my.domain/website/ 35 + cff-version: 1.2.0 36 + commit: af34567890123458901234567890123456789012 37 + date-released: 2021-05-16 38 + identifiers: 39 + - type: doi 40 + value: "10.0000.1234/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._[]()\\:;" 41 + description: "A pseudo-DOI testing all allowed characters." 42 + - type: other 43 + value: some random other identifier 44 + description: "A really random, unquoted string with whitespaces in between, which YAML can still handle." 45 + - type: swh 46 + value: swh:1:cnt:94a9ed024d3859793618152ea559a168bbcbb5e2 47 + description: "The Software Heritage identifier pointing to the GPL v3 license text." 48 + - type: url 49 + value: https://github.com/citation-file-format/citation-file-format 50 + description: "Just any old URL!" 51 + license-url: http://r3s34archs0ft.com/eula 52 + message: "If you use this software, cite it using these metadata" 53 + preferred-citation: 54 + type: article 55 + title: my preferred citation 56 + authors: 57 + - name: my name 58 + month: 1 59 + references: 60 + - 61 + type: article 62 + authors: 63 + - 64 + given-names: John 65 + title: this is the title 66 + license: "GPL-2.0" 67 + issue-date: "2021-02-04" 68 + - 69 + type: article 70 + authors: 71 + - 72 + given-names: Johanna 73 + title: "This is another title" 74 + license: "Apache-2.0" 75 + issue-date: "November-December 2002" 76 + repository: https://github.com/citation-file-format/citation-file-format 77 + repository-artifact: https://files.pythonhosted.org/packages/0a/84/10507b69a07768bc16981184b4d147a0fc84b71fbf35c03bafc8dcced8e1/cffconvert-1.3.3.tar.gz 78 + repository-code: https://github.com/citation-file-format/citation-file-format 79 + title: my title 80 + type: software 81 + url: https://github.com/citation-file-format/citation-file-format 82 + license: 83 + - "Apache-2.0" 84 + - "MIT"
+23
project/ocaml-cff/vendor/git/citation-file-format/examples/1.2.0/pass/reference-art/CITATION.cff
··· 1 + cff-version: 1.2.0 2 + message: "If you use this software, please cite the following." 3 + authors: 4 + - family-names: Druskat 5 + given-names: Stephan 6 + orcid: https://orcid.org/0000-0003-4925-7248 7 + title: My Research Tool 8 + version: 1.0.4 9 + doi: 10.5281/zenodo.1234 10 + date-released: 2017-12-18 11 + references: 12 + - type: art 13 + authors: 14 + - family-names: Picasso 15 + given-names: Pablo 16 + title: Guernica 17 + year: 1937 18 + medium: Oil on canvas 19 + format: 349.3cm x 776.6cm 20 + location: 21 + name: Museo Reina Sofia 22 + city: Madrid 23 + country: ES
+33
project/ocaml-cff/vendor/git/citation-file-format/examples/1.2.0/pass/reference-article/CITATION.cff
··· 1 + cff-version: 1.2.0 2 + message: If you use this software, please cite it as below. 3 + authors: 4 + - family-names: Druskat 5 + given-names: Stephan 6 + orcid: https://orcid.org/0000-0003-4925-7248 7 + title: My Research Tool 8 + version: 1.0.4 9 + doi: 10.5281/zenodo.1234 10 + date-released: 2017-12-18 11 + references: 12 + - type: article 13 + authors: 14 + - family-names: Smith 15 + given-names: Arfon M. 16 + - family-names: Katz 17 + given-names: Daniel S. 18 + affiliation: "National Center for Supercomputing Applications & 19 + Electrical and Computer Engineering Department & School of Information 20 + Sciences, University of Illinois at Urbana-Champaign, Urbana, Illinois, 21 + United States" 22 + orcid: https://orcid.org/0000-0001-5934-7525 23 + - family-names: Niemeyer 24 + given-names: Kyle E. 25 + - name: "FORCE11 Software Citation Working Group" 26 + website: https://www.force11.org/group/software-citation-working-group 27 + title: "Software citation principles" 28 + year: 2016 29 + journal: PeerJ Computer Science 30 + volume: 2 31 + issue: e86 32 + doi: 10.7717/peerj-cs.86 33 + url: https://doi.org/10.7717/peerj-cs.86
+22
project/ocaml-cff/vendor/git/citation-file-format/examples/1.2.0/pass/reference-blog/CITATION.cff
··· 1 + cff-version: 1.2.0 2 + message: If you use this software, please cite the software itself and the blog post. 3 + authors: 4 + - family-names: Druskat 5 + given-names: Stephan 6 + orcid: https://orcid.org/0000-0003-4925-7248 7 + title: My Research Tool 8 + version: 1.0.4 9 + doi: 10.5281/zenodo.1234 10 + date-released: 2017-12-18 11 + references: 12 + - type: blog 13 + authors: 14 + - family-names: Doe 15 + given-names: Jane 16 + title: "Implement a 100% accuracy syntax parser for all languages? No probs!" 17 + date-published: 2017-09-23 18 + url: https://hu-berlin.de/blogs/jdoe/2017/09/23/if-only 19 + institution: 20 + name: "Humboldt-Universität zu Berlin" 21 + city: Berlin 22 + country: DE
+21
project/ocaml-cff/vendor/git/citation-file-format/examples/1.2.0/pass/reference-book/CITATION.cff
··· 1 + cff-version: 1.2.0 2 + message: "If you use MRT for your research, please cite the following book." 3 + authors: 4 + - family-names: Druskat 5 + given-names: Stephan 6 + orcid: https://orcid.org/0000-0003-4925-7248 7 + title: My Research Tool 8 + version: 1.0.4 9 + doi: 10.5281/zenodo.1234 10 + date-released: 2017-12-18 11 + references: 12 + - type: book 13 + authors: 14 + - family-names: Doe 15 + given-names: Jane 16 + title: "The future of syntax parsing" 17 + year: 2017 18 + publisher: 19 + name: Far Out Publications 20 + city: Bielefeld 21 + medium: print
+35
project/ocaml-cff/vendor/git/citation-file-format/examples/1.2.0/pass/reference-conference-paper/CITATION.cff
··· 1 + cff-version: 1.2.0 2 + message: If you use this software, please cite the software and the paper. 3 + authors: 4 + - family-names: Druskat 5 + given-names: Stephan 6 + orcid: https://orcid.org/0000-0003-4925-7248 7 + title: My Research Tool 8 + version: 1.0.4 9 + doi: 10.5281/zenodo.1234 10 + date-released: 2017-12-18 11 + references: 12 + - type: conference-paper 13 + authors: 14 + - family-names: Doe 15 + given-names: Jane 16 + title: "Ultimate-accuracy syntax parsing with My Research Tool" 17 + year: 2017 18 + collection-title: "Proceedings of the 1st Conference on Wishful Thinking" 19 + collection-doi: 10.5281/zenodo.123456 20 + editors: 21 + - family-names: Kirk 22 + given-names: James T. 23 + conference: 24 + name: 1st Conference on Wishful Thinking 25 + location: Spock's Inn Hotel and Bar 26 + address: 123 Main St 27 + city: Bielefeld 28 + region: Jarvis Island 29 + post-code: "12345" 30 + country: UM 31 + date-start: 2017-04-01 32 + date-end: 2017-04-01 33 + start: 42 34 + end: 45 35 + doi: 10.5281/zenodo.1234
+21
project/ocaml-cff/vendor/git/citation-file-format/examples/1.2.0/pass/reference-edited-work/CITATION.cff
··· 1 + cff-version: 1.2.0 2 + message: If you use this software, please cite it as below. 3 + authors: 4 + - family-names: Druskat 5 + given-names: Stephan 6 + orcid: https://orcid.org/0000-0003-4925-7248 7 + title: My Research Tool 8 + version: 1.0.4 9 + doi: 10.5281/zenodo.1234 10 + date-released: 2017-12-18 11 + references: 12 + - type: edited-work 13 + authors: 14 + - family-names: Doe 15 + given-names: Jane 16 + title: "Ultimate-accuracy parsing in practice" 17 + year: 2017 18 + publisher: 19 + name: Far Out Publications 20 + city: Bielefeld 21 + country: DE
+5
project/ocaml-cff/vendor/git/citation-file-format/examples/1.2.0/pass/reference-edited-work/README.md
··· 1 + # software with reference of type edited-work 2 + 3 + Note that the editors of the edited work must be specified under the `authors` 4 + key. Specific citation styles may or may not attach a suffix to the authors, 5 + such as ", eds." or similar.
+18
project/ocaml-cff/vendor/git/citation-file-format/examples/1.2.0/pass/reference-report/CITATION.cff
··· 1 + cff-version: 1.2.0 2 + message: If you use this software, please cite it as below. 3 + authors: 4 + - family-names: Druskat 5 + given-names: Stephan 6 + orcid: https://orcid.org/0000-0003-4925-7248 7 + title: My Research Tool 8 + version: 1.0.4 9 + doi: 10.5281/zenodo.1234 10 + date-released: 2017-12-18 11 + references: 12 + - type: report 13 + authors: 14 + - name: Fictional Parsing Interest Group, ACME Inc. 15 + title: "100% accuracy syntax parsing at ACME" 16 + url: http://www.acme.com/sigs/fp/reports/hpsp.pdf 17 + year: 2017 18 + date-accessed: 2017-09-23
+27
project/ocaml-cff/vendor/git/citation-file-format/examples/1.2.0/pass/reference-thesis/CITATION.cff
··· 1 + cff-version: 1.2.0 2 + message: If you use this software, please cite it as below. 3 + authors: 4 + - family-names: Druskat 5 + given-names: Stephan 6 + orcid: https://orcid.org/0000-0003-4925-7248 7 + title: My Research Tool 8 + version: 1.0.4 9 + doi: 10.5281/zenodo.1234 10 + date-released: 2017-12-18 11 + references: 12 + - type: thesis 13 + authors: 14 + - family-names: Doe 15 + given-names: Jane 16 + title: "A high accuracy syntax parser in Visual Basic" 17 + thesis-type: PhD 18 + year: 2017 19 + department: Dept. of Universal Language Philosophy 20 + institution: 21 + name: "Humboldt-Universität zu Berlin" 22 + city: Berlin 23 + country: DE 24 + database: Thesiserver 25 + date-accessed: 2017-09-23 26 + date-published: 2017-03-21 27 + url: http://thesiserver.hu-berlin.de/2017/march/phd/doe-12345
+17
project/ocaml-cff/vendor/git/citation-file-format/examples/1.2.0/pass/short/CITATION.cff
··· 1 + # An incomplete CFF file 2 + 3 + cff-version: 1.2.0 4 + message: If you use this software in your work, please cite it using the following metadata 5 + title: Ruby CFF Library 6 + authors: 7 + - family-names: Haines 8 + given-names: Robert 9 + affiliation: The University of Manchester, UK 10 + keywords: 11 + - ruby 12 + - credit 13 + - citation 14 + version: 0.4.0 15 + date-released: 2018-07-22 16 + license: Apache-2.0 17 + repository-artifact: https://rubygems.org/gems/cff
+1
project/ocaml-cff/vendor/git/citation-file-format/examples/1.2.0/pass/short/README.md
··· 1 + Borrowed from [`ruby-cff`](https://github.com/citation-file-format/ruby-cff)'s fixtures https://github.com/citation-file-format/ruby-cff/tree/ec3aeff98855690d56ac2cd35f7181e5d9ee26f3/test/files.
+10
project/ocaml-cff/vendor/git/citation-file-format/examples/1.2.0/pass/simple/CITATION.cff
··· 1 + cff-version: 1.2.0 2 + message: "If you use this software, please cite it as below." 3 + authors: 4 + - family-names: Druskat 5 + given-names: Stephan 6 + orcid: https://orcid.org/0000-0003-4925-7248 7 + title: "My Research Software" 8 + version: 2.0.4 9 + doi: 10.5281/zenodo.1234 10 + date-released: 2017-12-18
+1
project/ocaml-cff/vendor/git/citation-file-format/examples/1.2.0/pass/simple/README.md
··· 1 + Borrowed from [`ruby-cff`](https://github.com/citation-file-format/ruby-cff)'s fixtures https://github.com/citation-file-format/ruby-cff/tree/ec3aeff98855690d56ac2cd35f7181e5d9ee26f3/test/files.
+12
project/ocaml-cff/vendor/git/citation-file-format/examples/1.2.0/pass/software-container/CITATION.cff
··· 1 + cff-version: 1.2.0 2 + message: "If you use the MRT Docker container, please cite the following." 3 + authors: 4 + - name: "Humboldt-Universität zu Berlin" 5 + website: https://www.linguistik.hu-berlin.de/ 6 + - family-names: Doe 7 + given-names: Jane 8 + title: mrt-iain-m-banks 9 + version: 1.0.4 (Iain M. Banks) 10 + url: https://github.com/doe/docker-brew-mrt-core/blob/160d54f9e935/iain/Dockerfile 11 + repository: https://hub.docker.hu-berlin.de/_/mrt-iain-m-banks/ 12 + date-released: 2017-12-18
+10
project/ocaml-cff/vendor/git/citation-file-format/examples/1.2.0/pass/software-executable/CITATION.cff
··· 1 + cff-version: 1.2.0 2 + message: "If you use MRT, please cite the following." 3 + authors: 4 + - family-names: Druskat 5 + given-names: Stephan 6 + orcid: https://orcid.org/0000-0003-4925-7248 7 + title: My Research Tool Kickstarter 8 + version: 2.0.4 9 + date-released: 2017-12-18 10 + repository-artifact: https://hu.berlin/nexus/mrt-kickstarter/2.0.4/mrt2-kickstarter.exe
+23
project/ocaml-cff/vendor/git/citation-file-format/examples/1.2.0/pass/software-with-a-doi-expanded/CITATION.cff
··· 1 + cff-version: 1.2.0 2 + message: If you use this software, please cite it as below. 3 + authors: 4 + - family-names: Druskat 5 + given-names: Stephan 6 + orcid: https://orcid.org/0000-0003-4925-7248 7 + affiliation: "Humboldt-Universität zu Berlin, Dept. of German Studies and Linguistics" 8 + email: mail@sdruskat.net 9 + website: https://hu.berlin/sdruskat 10 + title: My Research Tool 11 + version: 1.0.4 12 + doi: 10.5281/zenodo.1234 13 + date-released: 2017-12-18 14 + repository-code: https://github.com/sdruskat/my-research-tool 15 + repository-artifact: https://hu.berlin/nexus/mrt 16 + keywords: 17 + - "McAuthor's algorithm" 18 + - linguistics 19 + - nlp 20 + - parser 21 + - deep convolutional neural network 22 + license: Apache-2.0 23 + url: https://sdruskat.github.io/my-research-tool
+3
project/ocaml-cff/vendor/git/citation-file-format/examples/1.2.0/pass/software-with-a-doi-expanded/README.md
··· 1 + # Software with a doi (expanded) 2 + 3 + Same as [../software-with-a-doi/README.md](../software-with-a-doi/README.md), but with additional properties.
+10
project/ocaml-cff/vendor/git/citation-file-format/examples/1.2.0/pass/software-with-a-doi/CITATION.cff
··· 1 + cff-version: 1.2.0 2 + message: If you use this software, please cite it as below. 3 + authors: 4 + - family-names: Druskat 5 + given-names: Stephan 6 + orcid: https://orcid.org/0000-0003-4925-7248 7 + title: My Research Tool 8 + version: 1.0.4 9 + doi: 10.5281/zenodo.1234 10 + date-released: 2017-12-18
+16
project/ocaml-cff/vendor/git/citation-file-format/examples/1.2.0/pass/software-with-a-doi/README.md
··· 1 + # Software with a DOI 2 + 3 + Note that [Smith et al., 2016](https://doi.org/10.7717/peerj-cs.86), p. 12 recommend 4 + 5 + > [...] the use of DOIs as the unique identifier due to their common usage and 6 + acceptance, particularly as they are the standard for other digital products 7 + such as publications. 8 + 9 + Furthermore, DOIs should point to a "unique, specific software version" 10 + ([Smith et al., 2016](https://doi.org/10.7717/peerj-cs.86), p. 12). Also it is recommended ([Smith et al., 2016](https://doi.org/10.7717/peerj-cs.86), p. 13) that: 11 + 12 + > the [DOI] should resolve to a persistent landing page that contains metadata 13 + and a link to the software itself, rather than directly to the source code files, 14 + repository, or executable. 15 + 16 + Therefore, a minimal `CITATION.cff` file in such a case would look similar to [CITATION.cff](CITATION.cff).
+30
project/ocaml-cff/vendor/git/citation-file-format/examples/1.2.0/pass/software-with-reference/CITATION.cff
··· 1 + cff-version: 1.2.0 2 + message: If you use My Research Tool, please cite both the software and the outline paper. 3 + authors: 4 + - family-names: Doe 5 + given-names: Jane 6 + - family-names: Bielefeld 7 + name-particle: von 8 + given-names: Arthur 9 + - family-names: McAuthor 10 + given-names: Juniper 11 + name-suffix: Jr. 12 + title: My Research Tool 13 + version: 1.0.4 14 + doi: 10.5281/zenodo.1234 15 + date-released: 2017-12-18 16 + references: 17 + - type: article 18 + scope: Cite this paper if you want to reference the general concepts of MRT. 19 + authors: 20 + - family-names: Doe 21 + given-names: Jane 22 + - family-names: Bielefeld 23 + name-particle: von 24 + given-names: Arthur 25 + title: "My Research Tool: A 100% accuracy syntax parser for all languages" 26 + year: 2099 27 + journal: Journal of Hard Science Fiction 28 + volume: 42 29 + issue: "13" 30 + doi: 10.9999/hardscifi-lang.42132
+5
project/ocaml-cff/vendor/git/citation-file-format/examples/1.2.0/pass/software-with-reference/README.md
··· 1 + # Software with a further reference 2 + 3 + Where authors wish to encourage citation of an outline paper with citation 4 + of their software, we recommend the use of [reference keys](#references-optional) 5 + to highlight the existence of further references.
+17
project/ocaml-cff/vendor/git/citation-file-format/examples/1.2.0/pass/software-without-a-doi-closed-source/CITATION.cff
··· 1 + cff-version: 1.2.0 2 + message: 3 + If you dare use this commercial, closed-source, strangely versioned 4 + software in your research, please at least cite it as below. 5 + authors: 6 + - family-names: Vader 7 + name-suffix: né Skywalker 8 + given-names: 'Anakin "Darth"' 9 + title: Opaquity 10 + version: opq-1234-XZVF-ACME-RLY 11 + date-released: 2017-02-28 12 + url: http://www.opaquity.com 13 + contact: 14 + - name: Dark Side Software 15 + address: DS-1 Orbital Battle Station, near Scarif 16 + email: father@imperial-empire.com 17 + tel: +850 (0)123-45-666
+11
project/ocaml-cff/vendor/git/citation-file-format/examples/1.2.0/pass/software-without-a-doi-closed-source/README.md
··· 1 + For software without a DOI, it is recommended that "the metadata should still 2 + provide information on how to access the specific software, but this may be a 3 + company’s product number or a link to a website that allows the software be 4 + purchased." [Smith et al., 2016](https://doi.org/10.7717/peerj-cs.86), p. 13. Furthermore, "if the version number and 5 + release date are not available, the download date can be used. Similarly, the 6 + contact name/email is an alternative to the location/repository." 7 + ([Smith et al., 2016](https://doi.org/10.7717/peerj-cs.86), p. 7). 8 + 9 + Hence, for closed-source software without a DOI for which the version number 10 + and release date cannot be determined, a `CITATION.cff` file could look like 11 + [./CITATION.cff](./CITATION.cff).
+11
project/ocaml-cff/vendor/git/citation-file-format/examples/1.2.0/pass/software-without-a-doi/CITATION.cff
··· 1 + cff-version: 1.2.0 2 + message: "If you use this MRT alpha snapshot version, please cite." 3 + authors: 4 + - family-names: Druskat 5 + given-names: Stephan 6 + orcid: https://orcid.org/0000-0003-4925-7248 7 + title: My Research Tool Prototype 8 + version: 0.0.1-alpha1-build1507284872 9 + date-released: 2017-12-18 10 + repository-code: https://github.com/doe/mrt 11 + commit: 160d54f9e935c914df38c1ffda752112b5c979a8
+6
project/ocaml-cff/vendor/git/citation-file-format/examples/1.2.0/pass/software-without-a-doi/README.md
··· 1 + We recognize that there are certain situations where it may not be possible to 2 + follow the recommended best-practice. For example, if (1) the software authors 3 + did not register a DOI and/or release a specific version, or (2) the version of 4 + the software used does not match what is available to cite. In those cases, 5 + falling back on a combination of the repository URL and version number/commit 6 + hash would be an appropriate way to cite the software used ([Smith et al., 2016](https://doi.org/10.7717/peerj-cs.86), p. 12).
+12
project/ocaml-cff/vendor/git/citation-file-format/examples/1.2.0/pass/tue-excellent-buildings/bso-toolbox/CITATION.cff
··· 1 + cff-version: 1.2.0 2 + message: If you use this software, please cite it as below. 3 + authors: 4 + - family-names: Boonstra 5 + given-names: Sjonnie 6 + orcid: https://orcid.org/0000-0001-9911-4507 7 + - family-names: Hofmeyer 8 + given-names: Hèrm 9 + title: "BSO Toolbox" 10 + version: "1.0" 11 + doi: 10.5281/zenodo.3823893 12 + date-released: 2020-05-01
+5
project/ocaml-cff/vendor/git/citation-file-format/examples/1.2.0/pass/tue-excellent-buildings/bso-toolbox/README.md
··· 1 + Borrowed from [`ruby-cff`](https://github.com/citation-file-format/ruby-cff)'s fixtures https://github.com/citation-file-format/ruby-cff/tree/ec3aeff98855690d56ac2cd35f7181e5d9ee26f3/test/files, with minor changes: 2 + 3 + 1. updated `cff-version` to "1.2.0" 4 + 1. made `version` a string 5 +
+62
project/ocaml-cff/vendor/git/citation-file-format/examples/1.2.0/pass/xenon-middleware_xenon-adaptors-cloud/CITATION.cff
··· 1 + # YAML 1.2 2 + # Metadata for citation of this software according to the CFF format (https://citation-file-format.github.io/) 3 + cff-version: 1.2.0 4 + message: If you use this software, please cite it as below. 5 + title: Cloud related adaptors for Xenon 6 + authors: 7 + - given-names: Stefan 8 + family-names: Verhoeven 9 + affiliation: Nederlands eScience Center 10 + orcid: https://orcid.org/0000-0002-5821-2060 11 + - given-names: Jason 12 + family-names: Maassen 13 + affiliation: Netherlands eScience Center 14 + - given-names: Atze 15 + family-names: van der Ploeg 16 + affiliation: Netherlands eScience Center 17 + version: 3.0.2 18 + doi: 10.5281/zenodo.3245389 19 + date-released: '2019-08-07' 20 + repository-code: https://github.com/xenon-middleware/xenon-adaptors-cloud 21 + license: Apache-2.0 22 + references: 23 + - type: software 24 + doi: 10.5281/zenodo.597993 25 + title: Xenon 26 + authors: 27 + - given-names: Jason 28 + family-names: Maassen 29 + affiliation: Netherlands eScience Center 30 + - given-names: Stefan 31 + family-names: Verhoeven 32 + affiliation: Nederlands eScience Center 33 + - given-names: Joris 34 + family-names: Borgdorff 35 + affiliation: '@thehyve' 36 + - given-names: Niels 37 + family-names: Drost 38 + affiliation: Netherlands eScience Center 39 + - given-names: Jurriaan 40 + family-names: Spaaks 41 + name-particle: H. 42 + affiliation: Netherlands eScience Center 43 + - given-names: Christiaan 44 + family-names: Meijer 45 + affiliation: Netherlands eScience Center 46 + - given-names: Rob 47 + family-names: van Nieuwpoort 48 + name-particle: V. 49 + affiliation: Netherlands eScience center 50 + - given-names: Atze 51 + family-names: van der Ploeg 52 + affiliation: Netherlands eScience center 53 + - given-names: Piter 54 + family-names: de Boer 55 + name-particle: T. 56 + affiliation: Netherlands eScience center 57 + - given-names: Ben 58 + family-names: van Werkhoven 59 + affiliation: Netherlands eScience Center 60 + - given-names: Arnold 61 + family-names: Kuzniar 62 + affiliation: Netherlands eScience Center
+1
project/ocaml-cff/vendor/git/citation-file-format/examples/1.2.0/pass/xenon-middleware_xenon-adaptors-cloud/README.md
··· 1 + Borrowed from [`ruby-cff`](https://github.com/citation-file-format/ruby-cff)'s fixtures https://github.com/citation-file-format/ruby-cff/tree/ec3aeff98855690d56ac2cd35f7181e5d9ee26f3/test/files.
+63
project/ocaml-cff/vendor/git/citation-file-format/examples/README.md
··· 1 + # Testing 2 + 3 + ## Overview 4 + 5 + We maintain a collection of `.cff` files for testing. In these files we try to cover 6 + various possible scenarios described in the specification. During the test, these 7 + files are validated using `cffconvert` (a command line utility to read a `.cff` file 8 + and convert it to BibTex and other formats). We check that all files are validated or 9 + rejected as expected. 10 + 11 + ## Dependencies 12 + 13 + - Python 3.10 or higher 14 + - [cffconvert](https://pypi.org/project/cffconvert/) version 1.0.0 or higher 15 + - [pytest](https://pypi.org/project/pytest/) 16 + 17 + You can install `cffconvert` and `pytest` using the `requirements.txt` file from 18 + this directory by entering the following command: 19 + 20 + python3 -m pip install -r requirements.txt 21 + 22 + in the root directory of the clone of this repository. 23 + 24 + ## Files and directories 25 + 26 + The tests are organised into subdirectories named after minimal versions of the CFF 27 + specification supporting the tested features. 28 + 29 + Each test is placed in a directory with some informative name. We suggest that a name 30 + of the directory with a test for failing validation should start with `fail-`, otherwise 31 + its name may be arbitrary, but we suggest to follow the same style as for existing tests. 32 + 33 + Inside the directory for a specific test, there should be two files: a `CITATION.cff` 34 + file to be validated during the test, and a Python script to run the test. The name of 35 + the latter must start with `test_`, followed by some string with underscores, based on 36 + the name of the directory for this specific test (see existing tests for some examples). 37 + To create such a Python script, you can copy and rename an existing test script from some 38 + other test directory, only paying attention whether it checks that validation should 39 + pass or fail - there are only two kinds of test scripts at the moment. 40 + 41 + ## Running tests 42 + 43 + To run tests, enter 44 + 45 + pytest 46 + 47 + You should expect to see output similar to this: 48 + 49 + ``` 50 + tests/validate.py::test[./tests/1.1.0/reference-article/CITATION.cff] PASSED [ 2%] 51 + tests/validate.py::test[./tests/1.1.0/reference-art/CITATION.cff] PASSED [ 5%] 52 + tests/validate.py::test[./tests/1.1.0/reference-book/CITATION.cff] PASSED [ 7%] 53 + tests/validate.py::test[./tests/1.1.0/fail-bad-identifier-type-in-root/CITATION.cff] PASSED [ 10%] 54 + 55 + ... 56 + 57 + tests/validate.py::test[./tests/1.0.3/reference-blog/CITATION.cff] PASSED [ 94%] 58 + tests/validate.py::test[./tests/1.0.3/software-container/CITATION.cff] PASSED [ 97%] 59 + tests/validate.py::test[./tests/1.0.3/software-executable/CITATION.cff] PASSED [100%] 60 + 61 + ``` 62 + 63 + surrounded with some additional information messages.
project/ocaml-cff/vendor/git/citation-file-format/examples/__init__.py

This is a binary file and will not be displayed.

+21
project/ocaml-cff/vendor/git/citation-file-format/examples/conftest.py
··· 1 + import os 2 + 3 + 4 + def pytest_generate_tests(metafunc): 5 + """Generates a list of relative paths to CITATION.cff files under tests/, and 6 + uses them to parameterize a fixture by the name of 'fixture'.""" 7 + 8 + fixtures = list() 9 + schema_versions = [ 10 + "1.0.3", 11 + "1.1.0", 12 + "1.2.0" 13 + ] 14 + for schema_version in schema_versions: 15 + d = os.path.join(".", "examples", schema_version) 16 + for root, dirs, files in os.walk(d): 17 + for name in files: 18 + if name == "CITATION.cff": 19 + fixtures.append(os.path.join(root, name)) 20 + 21 + metafunc.parametrize("fixture", fixtures)
+5
project/ocaml-cff/vendor/git/citation-file-format/examples/helpers/__init__.py
··· 1 + from .load_cff import load_cff 2 + 3 + __all__ = [ 4 + "load_cff" 5 + ]
+4
project/ocaml-cff/vendor/git/citation-file-format/examples/helpers/load_cff.py
··· 1 + def load_cff(fixture): 2 + with open(fixture, "r") as f: 3 + s = f.read() 4 + return s
+25
project/ocaml-cff/vendor/git/citation-file-format/examples/validate.py
··· 1 + import pytest 2 + from cffconvert import Citation 3 + from examples.helpers import load_cff 4 + from examples import validator 5 + 6 + 7 + def test(fixture): 8 + # (argument fixture is injected from test/conftest.py using pytest fixture magic) 9 + cffstr = load_cff(fixture) 10 + can_test_with_cffconvert = "1.0.3" in fixture or "1.1.0" in fixture 11 + if can_test_with_cffconvert: 12 + if "fail" in fixture: 13 + with pytest.raises(Exception) as e_info: 14 + citation = Citation(cffstr=cffstr) 15 + citation.validate() 16 + else: 17 + citation = Citation(cffstr=cffstr) 18 + citation.validate() 19 + assert citation.as_cff() is not None 20 + else: 21 + if "fail" in fixture: 22 + with pytest.raises(Exception) as e_info: 23 + validator.validate(fixture, 'schema.json') 24 + else: 25 + validator.validate(fixture, 'schema.json')
+32
project/ocaml-cff/vendor/git/citation-file-format/examples/validator.py
··· 1 + import jsonschema 2 + import argparse 3 + from ruamel.yaml import YAML 4 + import json 5 + 6 + 7 + def validate(data_path, schema_path): 8 + with open(data_path, 'r') as fi: 9 + # Convert to Python object 10 + yaml = YAML(typ='safe') 11 + yaml.constructor.yaml_constructors[u'tag:yaml.org,2002:timestamp'] = yaml.constructor.yaml_constructors[u'tag:yaml.org,2002:str'] 12 + yml_data = yaml.load(fi) 13 + 14 + with open(schema_path, 'r') as sf: 15 + schema_data = json.loads(sf.read()) 16 + jsonschema.validate(instance=yml_data, schema=schema_data, format_checker=jsonschema.FormatChecker()) 17 + 18 + 19 + if __name__ == "__main__": 20 + """Run like this from the command line: 21 + `python3 -m validator.py -d data.yml -s schema.json` 22 + """ 23 + parser = argparse.ArgumentParser( 24 + description='Validates a YAML file against a JSON Schema') 25 + parser.add_argument( 26 + '-d', '--data', type=str, 27 + help='A YAML data file', required=True) 28 + parser.add_argument( 29 + '-s', '--schema', type=str, 30 + help='A JSON Schema file', required=True) 31 + args = parser.parse_args() 32 + validate(args.data, args.schema)
+6
project/ocaml-cff/vendor/git/citation-file-format/pytest.ini
··· 1 + [pytest] 2 + python_files = 3 + examples/validate.py 4 + tests/validate_schema_guide.py 5 + python_functions = test 6 + addopts = --verbose
+5
project/ocaml-cff/vendor/git/citation-file-format/requirements.txt
··· 1 + cffconvert 2 + pytest 3 + jsonschema 4 + ruamel.yaml 5 + bump2version
+4069
project/ocaml-cff/vendor/git/citation-file-format/schema-guide.md
··· 1 + # Guide to Citation File Format schema version 1.2.0 2 + 3 + ## General structure of a `CITATION.cff` file 4 + 5 + Valid Citation File Format files 6 + 7 + 1. must be named `CITATION.cff` (note the capitalization); 8 + 1. are valid according to the Citation File Format schema version 1.2.0 outlined in [schema.json](schema.json); 9 + 1. are valid YAML 1.2 ([specification](http://yaml.org/spec/1.2/spec.html), [validator](http://www.yamllint.com/)). 10 + 11 + <a name="yaml-strings"></a>**String quoting:** Note that in YAML you generally don't need to quote strings. 12 + But you should use `"` quotes when a string value 13 + contains whitespace, 14 + contains special characters (e.g., any of `:{}[],&*#?|-<>=!%`, or any of `` ` `` and `@` at the beginning), 15 + consists only of numbers (e.g., is the string `"42"`, not the number `42`), 16 + or is `"true"`, `"false"`, `"yes"` or `"no"`. 17 + 18 + In short: When a string value doesn't behave as expected, try putting it in `"` quotes. 19 + 20 + ### Minimal example 21 + 22 + A minimal example of a valid `CITATION.cff` file, that contains only the required keys, could look like this: 23 + 24 + ```yaml 25 + authors: 26 + - family-names: Druskat 27 + given-names: Stephan 28 + cff-version: 1.2.0 29 + message: "If you use this software, please cite it using these metadata." 30 + title: "My Research Software" 31 + ``` 32 + 33 + ### Typical example 34 + 35 + For most software however, it is relatively easy to expand the minimal case with important information like the version, the date when it was last published, some keywords, etc.: 36 + 37 + ```yaml 38 + abstract: "This is my awesome research software. It does many things." 39 + authors: 40 + - family-names: Druskat 41 + given-names: Stephan 42 + orcid: "https://orcid.org/1234-5678-9101-1121" 43 + cff-version: 1.2.0 44 + date-released: "2021-07-18" 45 + identifiers: 46 + - description: "This is the collection of archived snapshots of all versions of My Research Software" 47 + type: doi 48 + value: 10.5281/zenodo.123456 49 + - description: "This is the archived snapshot of version 0.11.2 of My Research Software" 50 + type: doi 51 + value: 10.5281/zenodo.123457 52 + keywords: 53 + - "awesome software" 54 + - research 55 + license: Apache-2.0 56 + message: "If you use this software, please cite it using these metadata." 57 + repository-code: "https://github.com/citation-file-format/my-research-software" 58 + title: "My Research Software" 59 + version: 0.11.2 60 + ``` 61 + 62 + ### Referencing other work 63 + 64 + When your software or data builds on what others have already done, it is good practice to add a `references` section to your 65 + `CITATION.cff` file. This way, you give credit to the authors of works that your own work builds on. 66 + 67 + The `references` section works like a reference list in a paper, 68 + but can also contain references to other software 69 + (such as the dependencies of your software), other datasets, 70 + and other (research) outputs. 71 + 72 + ```yaml 73 + authors: 74 + - family-names: Druskat 75 + given-names: Stephan 76 + cff-version: 1.2.0 77 + message: "If you use this software, please cite it using these metadata." 78 + references: 79 + - authors: 80 + - family-names: Spaaks 81 + given-names: "Jurriaan H." 82 + title: "The foundation of Research Software" 83 + type: software 84 + - authors: 85 + - family-names: Haines 86 + given-names: Robert 87 + title: "Ruby CFF Library" 88 + type: software 89 + version: 1.0 90 + title: "My Research Software" 91 + ``` 92 + 93 + ### Credit redirection 94 + 95 + Sometimes you want to redirect any credit your work may receive towards a second work (typically one of your own). A 96 + common example is, that when you write software and then write a paper about it, you may want to be credited for the paper 97 + instead of for the software itself. For this case, your `CITATION.cff` should contain metadata about the software at 98 + the root of the `CITATION.cff` file, but additionally, you can add a `preferred-citation` key with the metadata of 99 + the paper (or other work) you want people to cite. Usually, the `message` also reflects the authors' wishes on how they want to be credited. 100 + 101 + ```yaml 102 + authors: 103 + - family-names: Druskat 104 + given-names: Stephan 105 + cff-version: 1.2.0 106 + message: "If you use this software, please cite both the article from preferred-citation and the software itself." 107 + preferred-citation: 108 + authors: 109 + - family-names: Druskat 110 + given-names: Stephan 111 + title: "Software paper about My Research Software" 112 + type: article 113 + title: "My Research Software" 114 + ``` 115 + 116 + The next sections explain each key in more detail. 117 + 118 + ## Valid keys 119 + 120 + This section describes the valid keys in a `CITATION.cff` file. 121 + 122 + ### Index 123 + 124 + - [`abstract`](#abstract) 125 + - [`authors`](#authors) (array of objects) 126 + - [`cff-version`](#cff-version) 127 + - [`commit`](#commit) 128 + - [`contact`](#contact) (object) 129 + - [`date-released`](#date-released) 130 + - [`doi`](#doi) 131 + - [`identifiers`](#identifiers) (array of objects) 132 + - [`keywords`](#keywords) 133 + - [`license`](#license) 134 + - [`license-url`](#license-url) 135 + - [`message`](#message) 136 + - [`preferred-citation`](#preferred-citation) (object) 137 + - [`references`](#references) (array of objects) 138 + - [`repository`](#repository) 139 + - [`repository-artifact`](#repository-artifact) 140 + - [`repository-code`](#repository-code) 141 + - [`title`](#title) 142 + - [`type`](#type) 143 + - [`url`](#url) 144 + - [`version`](#version) 145 + 146 + ### `abstract` 147 + 148 + - **type**: [Nonempty `string`](#yaml-strings) 149 + - **required**: `false` 150 + - **description**: A description of the software or dataset. 151 + - **usage**:<br><br> 152 + ```yaml 153 + abstract: This software implements methods to do things. 154 + ``` 155 + 156 + ### `authors` 157 + 158 + - **type**: Array of [`definitions.person`](#definitionsperson) and/or [`definitions.entity`](#definitionsentity) objects. 159 + - **required**: `true` 160 + - **description**: The authors of a software or dataset. 161 + (See also [How to deal with unknown individual authors?](#how-to-deal-with-unknown-individual-authors)) 162 + - **usage**:<br><br> 163 + ```yaml 164 + authors: 165 + - given-names: Stephan 166 + family-names: Druskat 167 + ``` 168 + ```yaml 169 + authors: 170 + - name: "The Research Software project" 171 + ``` 172 + ```yaml 173 + authors: 174 + - given-names: Stephan 175 + family-names: Druskat 176 + - name: "The Research Software project" 177 + ``` 178 + 179 + ### `cff-version` 180 + 181 + - **type**: [Nonempty `string`](#yaml-strings) 182 + - **required**: `true` 183 + - **description**: The Citation File Format schema version that the `CITATION.cff` file adheres to for providing the citation metadata. 184 + - **usage**:<br><br> 185 + ```yaml 186 + cff-version: 1.2.0 187 + ``` 188 + ```yaml 189 + cff-version: "1.2.0" 190 + ``` 191 + 192 + ### `commit` 193 + 194 + - **type**: [Nonempty `string`](#yaml-strings) 195 + - **required**: `false` 196 + - **description**: The commit hash or revision number of the software version. 197 + - **usage**:<br><br> 198 + ```yaml 199 + commit: 1ff847d81f29c45a3a1a5ce73d38e45c2f319bba 200 + ``` 201 + ```yaml 202 + commit: "Revision: 8612" 203 + ``` 204 + 205 + ### `contact` 206 + 207 + - **type**: Array of [`definitions.person`](#definitionsperson) and/or [`definitions.entity`](#definitionsentity) objects. 208 + - **required**: `false` 209 + - **description**: The contact person, group, company, etc. for the software or dataset. 210 + - **usage**:<br><br> 211 + ```yaml 212 + contact: 213 + - affiliation: "German Aerospace Center (DLR)" 214 + email: mail@research-project.org 215 + family-names: Druskat 216 + given-names: Stephan 217 + ``` 218 + ```yaml 219 + contact: 220 + - email: mail@research-project.org 221 + name: "The Research Software project" 222 + ``` 223 + ```yaml 224 + contact: 225 + - email: mail@research-project.org 226 + family-names: Druskat 227 + given-names: Stephan 228 + - email: mail@research-project.org 229 + name: "The Research Software project" 230 + ``` 231 + 232 + ### `date-released` 233 + 234 + - **type**: [`definitions.date`](#definitionsdate) 235 + - **required**: `false` 236 + - **description**: The date the software or data set has been released. Format is 4-digit year, 2-digit month, 2-digit day of month, separated by dashes. 237 + - **usage**:<br><br> 238 + ```yaml 239 + date-released: "2020-01-31" 240 + ``` 241 + 242 + ### `doi` 243 + 244 + - **type**: [`definitions.doi`](#definitionsdoi) 245 + - **required**: `false` 246 + - **description**: The [DOI](https://en.wikipedia.org/wiki/Digital_object_identifier) of the software or dataset. This notation is most useful when there is just one DOI you want to include. In 247 + that case, `doi` can be used as shorthand for something like:<br><br> 248 + ```yaml 249 + identifiers: 250 + - description: "The concept DOI of the work." 251 + type: doi 252 + value: 10.5281/zenodo.1003149 253 + ``` 254 + or 255 + ```yaml 256 + identifiers: 257 + - description: "The versioned DOI of the work." 258 + type: doi 259 + value: 10.5281/zenodo.4813122 260 + ``` 261 + - **usage**:<br><br> 262 + ```yaml 263 + doi: 10.5281/zenodo.1003149 264 + ``` 265 + ```yaml 266 + doi: "10.5281/zenodo.4813122" 267 + ``` 268 + 269 + ### `identifiers` 270 + 271 + - **type**: Array of [`definitions.identifier`](#definitionsidentifier) objects. 272 + - **required**: `false` 273 + - **description**: The identifiers of the software or dataset. 274 + - **usage**:<br><br> 275 + ```yaml 276 + identifiers: 277 + - description: "The concept DOI of the work." 278 + type: doi 279 + value: 10.5281/zenodo.1003149 280 + ``` 281 + 282 + ```yaml 283 + identifiers: 284 + - description: "The versioned DOI for version 1.1.0 of the work." 285 + type: doi 286 + value: 10.5281/zenodo.4813122 287 + ``` 288 + 289 + ```yaml 290 + identifiers: 291 + - description: "The concept DOI of the work." 292 + type: doi 293 + value: 10.5281/zenodo.1003149 294 + - description: "The versioned DOI for version 1.1.0 of the work." 295 + type: doi 296 + value: 10.5281/zenodo.4813122 297 + ``` 298 + 299 + ```yaml 300 + identifiers: 301 + - description: "The concept DOI of the work." 302 + type: doi 303 + value: 10.5281/zenodo.1003149 304 + - description: "The versioned DOI for version 1.1.0 of the work." 305 + type: doi 306 + value: 10.5281/zenodo.4813122 307 + - description: "The Software Heritage identifier for version 1.1.0 of the work." 308 + type: swh 309 + value: "swh:1:dir:bc286860f423ea7ced246ba7458eef4b4541cf2d" 310 + - description: "The GitHub release URL of tag 1.1.0." 311 + type: url 312 + value: "https://github.com/citation-file-format/citation-file-format/releases/tag/1.1.0" 313 + - description: "The GitHub release URL of the commit tagged with 1.1.0." 314 + type: url 315 + value: "https://github.com/citation-file-format/citation-file-format/tree/16192bf05e99bcb35d5c3e085047807b5720fafc" 316 + ``` 317 + 318 + ### `keywords` 319 + 320 + - **type**: Array of [nonempty `string`](#yaml-strings) 321 + - **required**: `false` 322 + - **description**: Keywords that describe the work. 323 + - **usage**:<br><br> 324 + ```yaml 325 + keywords: 326 + - thefirstkeyword 327 + - thesecondkeyword 328 + - "a third keyword" 329 + ``` 330 + 331 + ### `license` 332 + 333 + - **type**: (Array of) [`definitions.license-enum`](#definitionslicense-enum). 334 + - **required**: `false` 335 + - **description**: The [SPDX license identifier(s)](https://spdx.dev/ids/) for the license(s) under which the work is made available. When there are multiple 336 + licenses, it is assumed their relationship is OR, not AND. 337 + - **usage**:<br><br> 338 + ```yaml 339 + license: Apache-2.0 340 + ``` 341 + ```yaml 342 + license: 343 + - Apache-2.0 344 + - MIT 345 + ``` 346 + ```yaml 347 + license: 348 + - GPL-3.0 349 + - GPL-3.0-or-later 350 + ``` 351 + 352 + ### `license-url` 353 + 354 + - **type**: [`definitions.url`](#definitionsurl) 355 + - **required**: `false` 356 + - **description**: The URL of the license text under which the software or dataset is licensed (only for non-standard licenses not included in the [SPDX License List](#definitionslicense-enum)). 357 + - **usage**:<br><br> 358 + ```yaml 359 + license-url: "https://obscure-licenses.com?id=1234" 360 + ``` 361 + 362 + ### `message` 363 + 364 + - **type**: [Nonempty `string`](#yaml-strings) 365 + - **required**: `true` 366 + - **default**: `If you use this software, please cite it using the metadata from this file.` 367 + - **description**: A message to the human reader of the `CITATION.cff` file to let them know what to do with the citation metadata. 368 + - **usage**:<br><br> 369 + ```yaml 370 + message: "If you use this software, please cite it using the metadata from this file." 371 + ``` 372 + ```yaml 373 + message: "Please cite this software using these metadata." 374 + ``` 375 + ```yaml 376 + message: "Please cite this software using the metadata from 'preferred-citation'." 377 + ``` 378 + ```yaml 379 + message: "If you use this dataset, please cite it using the metadata from this file." 380 + ``` 381 + ```yaml 382 + message: "Please cite this dataset using these metadata." 383 + ``` 384 + ```yaml 385 + message: "Please cite this dataset using the metadata from 'preferred-citation'." 386 + ``` 387 + 388 + ### `preferred-citation` 389 + 390 + - **type**: A [`definitions.reference`](#definitionsreference) object. 391 + - **required**: `false` 392 + - **description**: A reference to another work that should be cited instead of the software or dataset itself. 393 + Note that the principles of [software citation](https://doi.org/10.7717/peerj-cs.86) and [data citation](https://doi.org/10.25490/a97f-egyk) require that 394 + software should be cited on the same basis as any other research product such as a paper or a book. 395 + Adding a different preferred citation may result in a violation of the respective 396 + primary principle, "Importance", when others cite this work. 397 + - **usage**:<br><br> 398 + ```yaml 399 + preferred-citation: 400 + authors: 401 + - family-names: Famnames 402 + given-names: "Given Name I." 403 + title: "Title of the work." 404 + type: generic 405 + year: 2021 406 + ``` 407 + 408 + ### `references` 409 + 410 + - **type**: Array of [`definitions.reference`](#definitionsreference) objects. 411 + - **required**: `false` 412 + - **description**: Reference(s) to other creative works. Similar to a list of references in a paper, references of the software or dataset may include other software (dependencies), or other research products that the software or dataset builds on, but not work describing the software or dataset. 413 + - **usage**:<br><br> 414 + ```yaml 415 + references: 416 + - authors: 417 + - name: "The Dependency Project" 418 + date-released: "2021-07-26" 419 + doi: 10.5281/zenodo.x1234567 420 + repository-code: "https://github.com/dependency-project/dependency" 421 + title: Dependency 422 + type: software 423 + version: 0.13.4 424 + - authors: 425 + - family-names: Bielefeld 426 + given-names: Arthur 427 + name-particle: von 428 + doi: 10.9999/hardscifi-lang.42132 429 + issue: 13 430 + journal: "Journal of Hard Science Fiction" 431 + scope: "Cite this paper if you want to reference the general concepts of the software." 432 + title: "Towards a 100% accuracy syntax parser for all languages" 433 + type: article 434 + volume: 42 435 + year: 2099 436 + ``` 437 + 438 + ### `repository` 439 + 440 + - **type**: [`definitions.url`](#definitionsurl) 441 + - **required**: `false` 442 + - **description**: The URL of the software or dataset in a repository/archive (when the repository is neither a source code repository nor a build artifact repository). 443 + - **usage**:<br><br> 444 + ```yaml 445 + repository: "https://ascl.net/2105.013" 446 + ``` 447 + 448 + ### `repository-artifact` 449 + 450 + - **type**: [`definitions.url`](#definitionsurl) 451 + - **required**: `false` 452 + - **description**: The URL of the work in a build artifact/binary repository (when the work is software). 453 + - **usage**:<br><br> 454 + ```yaml 455 + repository-artifact: "https://search.maven.org/artifact/org.corpus-tools/cff-maven-plugin/0.4.0/maven-plugin" 456 + ``` 457 + 458 + ### `repository-code` 459 + 460 + - **type**: [`definitions.url`](#definitionsurl) 461 + - **required**: `false` 462 + - **description**: The URL of the work in a source code repository. 463 + - **usage**:<br><br> 464 + ```yaml 465 + repository-code: "https://github.com/citation-file-format/cff-converter-python" 466 + ``` 467 + 468 + ### `title` 469 + 470 + - **type**: [Nonempty `string`](#yaml-strings) 471 + - **required**: `true` 472 + - **description**: The name of the software or dataset. 473 + - **usage**:<br><br> 474 + ```yaml 475 + title: "cffconvert" 476 + ``` 477 + 478 + ### `type` 479 + 480 + - **type**: enum (`software` or `dataset`) 481 + - **default**: `software` 482 + - **required**: `false` 483 + - **description**: The type of the work that is being described by this `CITATION.cff` file. 484 + - **usage**:<br><br> 485 + ```yaml 486 + type: software 487 + ``` 488 + ```yaml 489 + type: dataset 490 + ``` 491 + 492 + ### `url` 493 + 494 + - **type**: [`definitions.url`](#definitionsurl) 495 + - **required**: `false` 496 + - **description**: The URL of a landing page/website for the software or dataset. 497 + - **usage**:<br><br> 498 + ```yaml 499 + url: "https://citation-file-format.github.io/" 500 + ``` 501 + 502 + ### `version` 503 + 504 + - **type**: [`definitions.version`](#definitionsversion) 505 + - **required**: `false` 506 + - **description**: The version of the software or dataset. 507 + - **usage**:<br><br> 508 + ```yaml 509 + version: "1.2.0" 510 + ``` 511 + ```yaml 512 + version: 1.2 513 + ``` 514 + ```yaml 515 + version: "21.10 (Impish Indri)" 516 + ``` 517 + 518 + ## Definitions 519 + 520 + Some values in CFF files are valid in different keys. 521 + For example, `repository-code`, `url` and `license-url` all take URLs as values. 522 + 523 + The schema therefore has [*definitions*](https://json-schema.org/understanding-json-schema/structuring.html#definitions) 524 + of smaller subschemas, that can be reused in the schema from the respective key, 525 + instead of having to duplicate them. 526 + For example, there is one definition for a valid URL value ([`definitions.url`](#definitionsurl)), 527 + that is being referenced from `repository-code`, `url` and `license-url`. 528 + 529 + **Note:** `definitions` and its subkeys like `definitions.alias` or `definitions.entity.alias` should not be used as keys in `CITATION.cff` files: 530 + ```yaml 531 + # incorrect 532 + authors: 533 + - definitions.alias: sdruskat 534 + ``` 535 + ```yaml 536 + # incorrect 537 + authors: 538 + - definitions: 539 + alias: sdruskat 540 + ``` 541 + ```yaml 542 + # correct 543 + authors: 544 + - alias: sdruskat 545 + ``` 546 + 547 + ### Index 548 + 549 + - [`definitions.address`](#definitionsaddress) 550 + - [`definitions.alias`](#definitionsalias) 551 + - [`definitions.city`](#definitionscity) 552 + - [`definitions.commit`](#definitionscommit) 553 + - [`definitions.country`](#definitionscountry) 554 + - [`definitions.date`](#definitionsdate) 555 + - [`definitions.doi`](#definitionsdoi) 556 + - [`definitions.email`](#definitionsemail) 557 + - [`definitions.entity`](#definitionsentity) (object) 558 + - [`definitions.fax`](#definitionsfax) 559 + - [`definitions.identifier`](#definitionsidentifier) (object) 560 + - [`definitions.identifier-description`](#definitionsidentifier-description) 561 + - [`definitions.license`](#definitionslicense) 562 + - [`definitions.license-enum`](#definitionslicense-enum) 563 + - [`definitions.orcid`](#definitionsorcid) 564 + - [`definitions.person`](#definitionsperson) (object) 565 + - [`definitions.post-code`](#definitionspost-code) 566 + - [`definitions.reference`](#definitionsreference) (object) 567 + - [`definitions.region`](#definitionsregion) 568 + - [`definitions.swh-identifier`](#definitionsswh-identifier) 569 + - [`definitions.tel`](#definitionstel) 570 + - [`definitions.url`](#definitionsurl) 571 + - [`definitions.version`](#definitionsversion) 572 + 573 + ### `definitions.address` 574 + 575 + - **type**: [Nonempty `string`](#yaml-strings) 576 + - **required**: N/A 577 + - **description**: An address. 578 + - **usage**:<br><br> 579 + ```yaml 580 + authors: 581 + - name: "The Research Software Project" 582 + address: "742 Evergreen Terrace" 583 + ``` 584 + 585 + ### `definitions.alias` 586 + 587 + - **type**: [Nonempty `string`](#yaml-strings) 588 + - **required**: N/A 589 + - **description**: An alias. 590 + - **usage**:<br><br> 591 + ```yaml 592 + authors: 593 + - name: "The Research Software Project" 594 + alias: "RSP" 595 + ``` 596 + 597 + ### `definitions.city` 598 + 599 + - **type**: [Nonempty `string`](#yaml-strings) 600 + - **required**: N/A 601 + - **description**: A city. 602 + - **usage**:<br><br> 603 + ```yaml 604 + authors: 605 + - name: "The Research Software Project" 606 + city: "Berlin" 607 + ``` 608 + 609 + ### `definitions.commit` 610 + 611 + - **type**: [Nonempty `string`](#yaml-strings) 612 + - **required**: N/A 613 + - **description**: The (e.g., Git) commit hash or (e.g., Subversion) revision number of the work. 614 + - **usage**:<br><br> 615 + ```yaml 616 + commit: "1ff847d81f29c45a3a1a5ce73d38e45c2f319bba" 617 + ``` 618 + ```yaml 619 + commit: "Revision: 8612" 620 + ``` 621 + 622 + ### `definitions.country` 623 + 624 + - **type**: `enum` with values 625 + - `AD` 626 + - `AE` 627 + - `AF` 628 + - `AG` 629 + - `AI` 630 + - `AL` 631 + - `AM` 632 + - `AO` 633 + - `AQ` 634 + - `AR` 635 + - `AS` 636 + - `AT` 637 + - `AU` 638 + - `AW` 639 + - `AX` 640 + - `AZ` 641 + - `BA` 642 + - `BB` 643 + - `BD` 644 + - `BE` 645 + - `BF` 646 + - `BG` 647 + - `BH` 648 + - `BI` 649 + - `BJ` 650 + - `BL` 651 + - `BM` 652 + - `BN` 653 + - `BO` 654 + - `BQ` 655 + - `BR` 656 + - `BS` 657 + - `BT` 658 + - `BV` 659 + - `BW` 660 + - `BY` 661 + - `BZ` 662 + - `CA` 663 + - `CC` 664 + - `CD` 665 + - `CF` 666 + - `CG` 667 + - `CH` 668 + - `CI` 669 + - `CK` 670 + - `CL` 671 + - `CM` 672 + - `CN` 673 + - `CO` 674 + - `CR` 675 + - `CU` 676 + - `CV` 677 + - `CW` 678 + - `CX` 679 + - `CY` 680 + - `CZ` 681 + - `DE` 682 + - `DJ` 683 + - `DK` 684 + - `DM` 685 + - `DO` 686 + - `DZ` 687 + - `EC` 688 + - `EE` 689 + - `EG` 690 + - `EH` 691 + - `ER` 692 + - `ES` 693 + - `ET` 694 + - `FI` 695 + - `FJ` 696 + - `FK` 697 + - `FM` 698 + - `FO` 699 + - `FR` 700 + - `GA` 701 + - `GB` 702 + - `GD` 703 + - `GE` 704 + - `GF` 705 + - `GG` 706 + - `GH` 707 + - `GI` 708 + - `GL` 709 + - `GM` 710 + - `GN` 711 + - `GP` 712 + - `GQ` 713 + - `GR` 714 + - `GS` 715 + - `GT` 716 + - `GU` 717 + - `GW` 718 + - `GY` 719 + - `HK` 720 + - `HM` 721 + - `HN` 722 + - `HR` 723 + - `HT` 724 + - `HU` 725 + - `ID` 726 + - `IE` 727 + - `IL` 728 + - `IM` 729 + - `IN` 730 + - `IO` 731 + - `IQ` 732 + - `IR` 733 + - `IS` 734 + - `IT` 735 + - `JE` 736 + - `JM` 737 + - `JO` 738 + - `JP` 739 + - `KE` 740 + - `KG` 741 + - `KH` 742 + - `KI` 743 + - `KM` 744 + - `KN` 745 + - `KP` 746 + - `KR` 747 + - `KW` 748 + - `KY` 749 + - `KZ` 750 + - `LA` 751 + - `LB` 752 + - `LC` 753 + - `LI` 754 + - `LK` 755 + - `LR` 756 + - `LS` 757 + - `LT` 758 + - `LU` 759 + - `LV` 760 + - `LY` 761 + - `MA` 762 + - `MC` 763 + - `MD` 764 + - `ME` 765 + - `MF` 766 + - `MG` 767 + - `MH` 768 + - `MK` 769 + - `ML` 770 + - `MM` 771 + - `MN` 772 + - `MO` 773 + - `MP` 774 + - `MQ` 775 + - `MR` 776 + - `MS` 777 + - `MT` 778 + - `MU` 779 + - `MV` 780 + - `MW` 781 + - `MX` 782 + - `MY` 783 + - `MZ` 784 + - `NA` 785 + - `NC` 786 + - `NE` 787 + - `NF` 788 + - `NG` 789 + - `NI` 790 + - `NL` 791 + - `NO` 792 + - `NP` 793 + - `NR` 794 + - `NU` 795 + - `NZ` 796 + - `OM` 797 + - `PA` 798 + - `PE` 799 + - `PF` 800 + - `PG` 801 + - `PH` 802 + - `PK` 803 + - `PL` 804 + - `PM` 805 + - `PN` 806 + - `PR` 807 + - `PS` 808 + - `PT` 809 + - `PW` 810 + - `PY` 811 + - `QA` 812 + - `RE` 813 + - `RO` 814 + - `RS` 815 + - `RU` 816 + - `RW` 817 + - `SA` 818 + - `SB` 819 + - `SC` 820 + - `SD` 821 + - `SE` 822 + - `SG` 823 + - `SH` 824 + - `SI` 825 + - `SJ` 826 + - `SK` 827 + - `SL` 828 + - `SM` 829 + - `SN` 830 + - `SO` 831 + - `SR` 832 + - `SS` 833 + - `ST` 834 + - `SV` 835 + - `SX` 836 + - `SY` 837 + - `SZ` 838 + - `TC` 839 + - `TD` 840 + - `TF` 841 + - `TG` 842 + - `TH` 843 + - `TJ` 844 + - `TK` 845 + - `TL` 846 + - `TM` 847 + - `TN` 848 + - `TO` 849 + - `TR` 850 + - `TT` 851 + - `TV` 852 + - `TW` 853 + - `TZ` 854 + - `UA` 855 + - `UG` 856 + - `UM` 857 + - `US` 858 + - `UY` 859 + - `UZ` 860 + - `VA` 861 + - `VC` 862 + - `VE` 863 + - `VG` 864 + - `VI` 865 + - `VN` 866 + - `VU` 867 + - `WF` 868 + - `WS` 869 + - `YE` 870 + - `YT` 871 + - `ZA` 872 + - `ZM` 873 + - `ZW` 874 + - **required**: N/A 875 + - **description**: The [ISO 3166-1 alpha-2 country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) for a country. 876 + - **usage**:<br><br> 877 + ```yaml 878 + authors: 879 + - country: NL 880 + name: "The Authors Team" 881 + ``` 882 + ```yaml 883 + references: 884 + - conference: 885 + country: DE 886 + type: conference 887 + ``` 888 + 889 + ### `definitions.date` 890 + 891 + - **type**: [Nonempty `string`](#yaml-strings) 892 + - **required**: N/A 893 + - **description**: A date. Format is 4-digit year, followed by 2-digit month, followed by 2-digit day of month, and separated by dashes. Note to tool implementers: it is necessary to cast YAML `date` objects to `string` objects when validating against the schema. 894 + - **usage**:<br><br> 895 + ```yaml 896 + date-released: "2020-01-31" 897 + ``` 898 + ```yaml 899 + references: 900 + - date-accessed: "2020-01-31" 901 + type: generic 902 + ``` 903 + ```yaml 904 + references: 905 + - date-downloaded: "2020-01-31" 906 + type: generic 907 + ``` 908 + ```yaml 909 + references: 910 + - date-published: "2020-01-31" 911 + type: generic 912 + ``` 913 + ```yaml 914 + references: 915 + - date-released: "2020-01-31" 916 + type: generic 917 + ``` 918 + ```yaml 919 + references: 920 + - conference: 921 + date-end: "2020-02-02" 922 + date-start: "2020-01-31" 923 + type: conference 924 + ``` 925 + 926 + ### `definitions.doi` 927 + 928 + - **type**: [Nonempty `string`](#yaml-strings) 929 + - **required**: N/A 930 + - **description**: The [DOI](https://en.wikipedia.org/wiki/Digital_object_identifier) of the work (i.e., `10.5281/zenodo.1003150`, not the resolver URL `http://doi.org/10.5281/zenodo.1003150`). 931 + - **usage**:<br><br> 932 + ```yaml 933 + doi: 10.5281/zenodo.1003150 934 + ``` 935 + 936 + ### `definitions.email` 937 + 938 + - **type**: [Nonempty `string`](#yaml-strings) 939 + - **required**: N/A 940 + - **description**: An email address. 941 + - **usage**:<br><br> 942 + ```yaml 943 + authors: 944 + - email: "mail@research-project.org" 945 + name: "The Research Software project" 946 + ``` 947 + 948 + ### `definitions.entity` 949 + 950 + - **type**: `object` with the following keys: 951 + - [`address`](#definitionsentityaddress) 952 + - [`alias`](#definitionsentityalias) 953 + - [`city`](#definitionsentitycity) 954 + - [`country`](#definitionsentitycountry) 955 + - [`date-end`](#definitionsentitydate-end) 956 + - [`date-start`](#definitionsentitydate-start) 957 + - [`email`](#definitionsentityemail) 958 + - [`fax`](#definitionsentityfax) 959 + - [`location`](#definitionsentitylocation) 960 + - [`name`](#definitionsentityname) 961 + - [`orcid`](#definitionsentityorcid) 962 + - [`post-code`](#definitionsentitypost-code) 963 + - [`region`](#definitionsentityregion) 964 + - [`tel`](#definitionsentitytel) 965 + - [`website`](#definitionsentitywebsite) 966 + - **required**: N/A 967 + - **description**: An entity. Entities are used in keys that can also take [`definitions.person`](#definitionsperson) objects. An entity can represent different types of entities, such as a team, an institution, a company, a conference, etc. 968 + - **usage**:<br><br> 969 + ```yaml 970 + authors: 971 + - address: "742 Evergreen Terrace" 972 + alias: RSP 973 + city: Berlin 974 + country: DE 975 + date-end: "2018-07-27" 976 + date-start: "2021-07-27" 977 + email: team@research-project.org 978 + fax: +12-3456-7890 979 + location: "Lovelace Building, room 0.42" 980 + name: "The Research Software Project" 981 + orcid: "https://orcid.org/1234-5678-9101-1121" 982 + post-code: 90210 983 + region: Renfrewshire 984 + tel: +12-345-6789098 985 + website: "https://research-software-project.org" 986 + ``` 987 + ```yaml 988 + contact: 989 + - name: "The Research Software Project team" 990 + ``` 991 + ```yaml 992 + references: 993 + - type: generic 994 + title: "A reference showing different keys that take entity objects" 995 + authors: 996 + - name: "The Research Software Project team" 997 + conference: 998 + name: "RC21 - Research Conference 2021" 999 + contact: 1000 + - name: "Customer Support" 1001 + database-provider: 1002 + name: "Database Provider" 1003 + editors: 1004 + - name: "The Publication Editing Team" 1005 + editors-series: 1006 + - name: "The Publication Series Editing Team" 1007 + institution: 1008 + name: "Department of Research, Random University" 1009 + location: 1010 + name: "Museum of Postmodern Art" 1011 + publisher: 1012 + name: "Open Access Publishing House" 1013 + recipients: 1014 + - name: "The recipient institution of a personal communication" 1015 + senders: 1016 + - name: "The team sending a personal communication" 1017 + translators: 1018 + - name: "Research Translators, Ltd." 1019 + ``` 1020 + 1021 + ### `definitions.entity.address` 1022 + 1023 + - **type**: [`definitions.address`](#definitionsaddress). 1024 + - **required**: `false` 1025 + - **description**: The entity's address. 1026 + - **usage**:<br><br> 1027 + ```yaml 1028 + authors: 1029 + - address: "742 Evergreen Terrace" 1030 + name: "The Research Software Project" 1031 + ``` 1032 + 1033 + ### `definitions.entity.alias` 1034 + 1035 + - **type**: [`definitions.alias`](#definitionsalias). 1036 + - **required**: `false` 1037 + - **description**: The entity's alias. 1038 + - **usage**:<br><br> 1039 + ```yaml 1040 + authors: 1041 + - alias: NASA 1042 + name: "National Aeronautics and Space Administration" 1043 + ``` 1044 + 1045 + ### `definitions.entity.city` 1046 + 1047 + - **type**: [`definitions.city`](#definitionscity). 1048 + - **required**: `false` 1049 + - **description**: The entity's city. 1050 + - **usage**:<br><br> 1051 + ```yaml 1052 + authors: 1053 + - city: Berlin 1054 + name: "The Research Software Project" 1055 + ``` 1056 + 1057 + ### `definitions.entity.country` 1058 + 1059 + - **type**: [`definitions.country`](#definitionscountry). 1060 + - **required**: `false` 1061 + - **description**: The entity's country. 1062 + - **usage**:<br><br> 1063 + ```yaml 1064 + authors: 1065 + - name: "The Research Software Project" 1066 + country: DE 1067 + ``` 1068 + 1069 + ### `definitions.entity.date-end` 1070 + 1071 + - **type**: [`definitions.date`](#definitionsdate). 1072 + - **required**: `false` 1073 + - **description**: The entity's ending date, e.g. when the entity is a conference. 1074 + - **usage**:<br><br> 1075 + ```yaml 1076 + references: 1077 + - authors: 1078 + - name: "The Research Software Project" 1079 + conference: 1080 + date-end: "2021-07-27" 1081 + name: "Research Conference 2021" 1082 + title: "Conference Paper" 1083 + type: conference-paper 1084 + ``` 1085 + 1086 + ### `definitions.entity.date-start` 1087 + 1088 + - **type**: [`definitions.date`](#definitionsdate). 1089 + - **required**: `false` 1090 + - **description**: The entity's starting date, e.g. when the entity is a conference. 1091 + - **usage**:<br><br> 1092 + ```yaml 1093 + references: 1094 + - type: conference-paper 1095 + title: "Conference Paper" 1096 + authors: 1097 + - name: "The Research Software Project" 1098 + conference: 1099 + name: "Research Conference 2021" 1100 + date-start: "2021-07-27" 1101 + ``` 1102 + 1103 + ### `definitions.entity.email` 1104 + 1105 + - **type**: [`definitions.email`](#definitionsemail). 1106 + - **required**: `false` 1107 + - **description**: The entity's email address. 1108 + - **usage**:<br><br> 1109 + ```yaml 1110 + authors: 1111 + - email: team@research-project.org 1112 + name: "The Research Software Project" 1113 + ``` 1114 + 1115 + ### `definitions.entity.fax` 1116 + 1117 + - **type**: [`definitions.fax`](#definitionsfax). 1118 + - **required**: `false` 1119 + - **description**: The entity's fax number. 1120 + - **usage**:<br><br> 1121 + ```yaml 1122 + authors: 1123 + - fax: +12-3456-7890 1124 + name: "The Research Software Project" 1125 + ``` 1126 + 1127 + ### `definitions.entity.location` 1128 + 1129 + - **type**: [Nonempty `string`](#yaml-strings) 1130 + - **required**: `false` 1131 + - **description**: The entity's location. 1132 + - **usage**:<br><br> 1133 + ```yaml 1134 + authors: 1135 + - location: "Lovelace Building, room 0.42" 1136 + name: "The Research Software Project" 1137 + ``` 1138 + 1139 + ### `definitions.entity.name` 1140 + 1141 + - **type**: [Nonempty `string`](#yaml-strings) 1142 + - **required**: `true` 1143 + - **description**: The entity's name. 1144 + - **usage**:<br><br> 1145 + ```yaml 1146 + authors: 1147 + - name: "The Research Software Project" 1148 + ``` 1149 + 1150 + ### `definitions.entity.orcid` 1151 + 1152 + - **type**: [`definitions.orcid`](#definitionsorcid). 1153 + - **required**: `false` 1154 + - **description**: The entity's [ORCID](https://orcid.org) identifier. 1155 + - **usage**:<br><br> 1156 + ```yaml 1157 + authors: 1158 + - name: "The Research Software Project" 1159 + orcid: "https://orcid.org/1234-5678-9101-1121" 1160 + ``` 1161 + 1162 + ### `definitions.entity.post-code` 1163 + 1164 + - **type**: [`definitions.post-code`](#definitionspost-code). 1165 + - **required**: `false` 1166 + - **description**: The entity's post code. 1167 + - **usage**:<br><br> 1168 + ```yaml 1169 + authors: 1170 + - name: "The Research Software Project" 1171 + post-code: 90210 1172 + ``` 1173 + 1174 + ```yaml 1175 + authors: 1176 + - name: "The Research Software Project" 1177 + post-code: "90210" 1178 + ``` 1179 + 1180 + ### `definitions.entity.region` 1181 + 1182 + - **type**: [`definitions.region`](#definitionsregion). 1183 + - **required**: `false` 1184 + - **description**: The entity's region. 1185 + - **usage**:<br><br> 1186 + ```yaml 1187 + authors: 1188 + - name: "The Research Software Project" 1189 + region: Renfrewshire 1190 + ``` 1191 + 1192 + ### `definitions.entity.tel` 1193 + 1194 + - **type**: [`definitions.tel`](#definitionstel). 1195 + - **required**: `false` 1196 + - **description**: The entity's telephone number. 1197 + - **usage**:<br><br> 1198 + ```yaml 1199 + authors: 1200 + - name: "The Research Software Project" 1201 + tel: +12-345-6789098 1202 + ``` 1203 + 1204 + ### `definitions.entity.website` 1205 + 1206 + - **type**: [`definitions.url`](#definitionsurl). 1207 + - **required**: `false` 1208 + - **description**: The entity's website. 1209 + - **usage**:<br><br> 1210 + ```yaml 1211 + authors: 1212 + - name: "The Research Software Project" 1213 + website: "https://research-software-project.org" 1214 + ``` 1215 + 1216 + ### `definitions.fax` 1217 + 1218 + - **type**: [Nonempty `string`](#yaml-strings) 1219 + - **required**: N/A 1220 + - **description**: A fax number. 1221 + - **usage**:<br><br> 1222 + ```yaml 1223 + authors: 1224 + - name: "The Research Software Project" 1225 + fax: +12-3456-7890 1226 + ``` 1227 + ```yaml 1228 + authors: 1229 + - family-names: Druskat 1230 + fax: +12-3456-7890 1231 + given-names: Stephan 1232 + ``` 1233 + 1234 + ### `definitions.identifier` 1235 + 1236 + - **type**: One of the following `object` types (click to expand/collapse):<br><br> 1237 + 1. <details> 1238 + <summary>DOI</summary> 1239 + <br> 1240 + <ul> 1241 + <li> 1242 + <code>type</code>: 1243 + <ul> 1244 + <li><strong>type</strong>: <code>enum</code> with singular value <code>doi</code></li> 1245 + <li><strong>required</strong>: <code>true</code></li> 1246 + <li><strong>description</strong>: The type of identifier.</li> 1247 + </ul> 1248 + </li> 1249 + <li> 1250 + <code>value</code>: 1251 + <ul> 1252 + <li><strong>type</strong>: <a href="#definitionsdoi"><code>definitions.doi</code></a></li> 1253 + <li><strong>required</strong>: <code>true</code></li> 1254 + <li><strong>description</strong>: The value of the DOI, e.g. <code>10.5281/zenodo.1003149</code></li> 1255 + </ul> 1256 + </li> 1257 + <li> 1258 + <code>description</code>: 1259 + <ul> 1260 + <li><strong>type</strong>: <a href="#definitionsidentifier-description"><code>definitions.identifier-description</code></a></li> 1261 + <li><strong>required</strong>: <code>false</code></li> 1262 + <li><strong>description</strong>: The description of the DOI, e.g. <code>This is the DOI for version 0.11.4.</code></li> 1263 + </ul> 1264 + </li> 1265 + </ul> 1266 + </details> 1267 + 1. <details> 1268 + <summary>URL</summary> 1269 + <br> 1270 + <ul> 1271 + <li> 1272 + <code>type</code>: 1273 + <ul> 1274 + <li><strong>type</strong>: <code>enum</code> with singular value <code>url</code></li> 1275 + <li><strong>required</strong>: <code>true</code></li> 1276 + <li><strong>description</strong>: The type of identifier.</li> 1277 + </ul> 1278 + </li> 1279 + <li> 1280 + <code>value</code>: 1281 + <ul> 1282 + <li><strong>type</strong>: <a href="#definitionsurl"><code>definitions.url</code></a></li> 1283 + <li><strong>required</strong>: <code>true</code></li> 1284 + <li><strong>description</strong>: The value of the URL, e.g. <code>https://github.com/citation-file-format/citation-file-format</code>.</li> 1285 + </ul> 1286 + </li> 1287 + <li> 1288 + <code>description</code>: 1289 + <ul> 1290 + <li><strong>type</strong>: <a href="#definitionsidentifier-description"><code>definitions.identifier-description</code></a></li> 1291 + <li><strong>required</strong>: <code>false</code></li> 1292 + <li><strong>description</strong>: The description of the URL, e.g. <code>The homepage for the project</code>.</li> 1293 + </ul> 1294 + </li> 1295 + </ul> 1296 + </details> 1297 + 1. <details> 1298 + <summary>Software Heritage identifier</summary> 1299 + <br> 1300 + <ul> 1301 + <li> 1302 + <code>type</code>: 1303 + <ul> 1304 + <li><strong>type</strong>: <code>enum</code> with singular value <code>swh</code></li> 1305 + <li><strong>required</strong>: <code>true</code></li> 1306 + <li><strong>description</strong>: The type of identifier.</li> 1307 + </ul> 1308 + </li> 1309 + <li> 1310 + <code>value</code>: 1311 + <ul> 1312 + <li><strong>type</strong>: <a href="#definitionsswh-identifier"><code>definitions.swh-identifier</code></a></li> 1313 + <li><strong>required</strong>: <code>true</code></li> 1314 + <li><strong>description</strong>: The value of the Software Heritage identifier, e.g. <code>swh:1:dir:bc286860f423ea7ced246ba7458eef4b4541cf2d</code>.</li> 1315 + </ul> 1316 + </li> 1317 + <li> 1318 + <code>description</code>: 1319 + <ul> 1320 + <li><strong>type</strong>: <a href="#definitionsidentifier-description"><code>definitions.identifier-description</code></a></li> 1321 + <li><strong>required</strong>: <code>false</code></li> 1322 + <li><strong>description</strong>: The description of the Software Heritage identifier, e.g. <code>The directory object of the repository as stored on Software Heritage.</code>.</li> 1323 + </ul> 1324 + </li> 1325 + </ul> 1326 + </details> 1327 + 1. <details> 1328 + <summary>Other</summary> 1329 + <br> 1330 + <ul> 1331 + <li> 1332 + <code>type</code>: 1333 + <ul> 1334 + <li><strong>type</strong>: <code>enum</code> with singular value <code>other</code></li> 1335 + <li><strong>required</strong>: <code>true</code></li> 1336 + <li><strong>description</strong>: The type of identifier.</li> 1337 + </ul> 1338 + </li> 1339 + <li> 1340 + <code>value</code>: 1341 + <ul> 1342 + <li><strong>type</strong>: <a href="#yaml-strings">Nonempty <code>string</code></a>.</li> 1343 + <li><strong>required</strong>: <code>true</code></li> 1344 + <li><strong>description</strong>: The value of the identifier, e.g. <code>arXiv:2103.06681</code>.</li> 1345 + </ul> 1346 + </li> 1347 + <li> 1348 + <code>description</code>: 1349 + <ul> 1350 + <li><strong>type</strong>: <a href="#definitionsidentifier-description"><code>definitions.identifier-description</code></a></li> 1351 + <li><strong>required</strong>: <code>false</code></li> 1352 + <li><strong>description</strong>: The description of the identifier, e.g. <code>The ArXiv preprint of the paper.</code>.</li> 1353 + </ul> 1354 + </li> 1355 + </ul> 1356 + </details> 1357 + - **required**: N/A 1358 + - **description**: An identifier. 1359 + - **usage**:<br><br> 1360 + ```yaml 1361 + identifiers: 1362 + - type: doi 1363 + value: 10.5281/zenodo.1003149 1364 + description: "The concept DOI of the work." 1365 + ``` 1366 + ```yaml 1367 + identifiers: 1368 + - type: doi 1369 + value: 10.5281/zenodo.4813122 1370 + description: "The versioned DOI for version 1.1.0 of the work." 1371 + ``` 1372 + ```yaml 1373 + identifiers: 1374 + - type: doi 1375 + value: 10.5281/zenodo.1003149 1376 + description: "The concept DOI of the work." 1377 + - type: doi 1378 + value: 10.5281/zenodo.4813122 1379 + description: "The versioned DOI for version 1.1.0 of the work." 1380 + ``` 1381 + ```yaml 1382 + identifiers: 1383 + - type: doi 1384 + value: 10.5281/zenodo.1003149 1385 + description: "The concept DOI of the work." 1386 + - type: doi 1387 + value: 10.5281/zenodo.4813122 1388 + description: "The versioned DOI for version 1.1.0 of the work." 1389 + - type: swh 1390 + value: "swh:1:dir:bc286860f423ea7ced246ba7458eef4b4541cf2d" 1391 + description: "The Software Heritage identifier for version 1.1.0 of the work." 1392 + - type: url 1393 + value: "https://github.com/citation-file-format/citation-file-format/releases/tag/1.1.0" 1394 + description: "The GitHub release URL of tag 1.1.0." 1395 + - type: url 1396 + value: "https://github.com/citation-file-format/citation-file-format/tree/16192bf05e99bcb35d5c3e085047807b5720fafc" 1397 + description: "The GitHub release URL of the commit tagged with 1.1.0." 1398 + ``` 1399 + ```yaml 1400 + preferred-citation: 1401 + identifiers: 1402 + - type: other 1403 + value: "arXiv:2103.06681" 1404 + description: The ArXiv preprint of the paper 1405 + ``` 1406 + 1407 + ### `definitions.identifier-description` 1408 + 1409 + - **type**: [Nonempty `string`](#yaml-strings) 1410 + - **required**: N/A 1411 + - **description**: A description for a specific identifier value. 1412 + - **usage**:<br><br> 1413 + ```yaml 1414 + doi: 10.5281/zenodo.4813121 1415 + identifiers: 1416 + - type: doi 1417 + value: 10.5281/zenodo.4813122 1418 + description: "The version DOI for this version, which has a relation childOf with the concept DOI specified in the doi key in the root of this file." 1419 + - type: other 1420 + value: "ar:1234/5678.ABCD" 1421 + description: "The identifier provided by Archival Repository, which points to this version of the software." 1422 + ``` 1423 + 1424 + ### `definitions.license` 1425 + 1426 + - **type**: (Array of) [`definitions.license-enum`](#definitions.license-enum) objects. 1427 + - **required**: N/A 1428 + - **description**: The [SPDX license identifier(s)](https://spdx.dev/ids/) for the license(s) under which a work is made available. When there are multiple licenses, it is assumed their relationship is OR, not AND. 1429 + - **usage**:<br><br> 1430 + ```yaml 1431 + license: Apache-2.0 1432 + ``` 1433 + ```yaml 1434 + license: 1435 + - Apache-2.0 1436 + - MIT 1437 + ``` 1438 + 1439 + ### `definitions.license-enum` 1440 + 1441 + - **type**: `enum` with values: 1442 + - `0BSD` 1443 + - `AAL` 1444 + - `Abstyles` 1445 + - `Adobe-2006` 1446 + - `Adobe-Glyph` 1447 + - `ADSL` 1448 + - `AFL-1.1` 1449 + - `AFL-1.2` 1450 + - `AFL-2.0` 1451 + - `AFL-2.1` 1452 + - `AFL-3.0` 1453 + - `Afmparse` 1454 + - `AGPL-1.0` 1455 + - `AGPL-1.0-only` 1456 + - `AGPL-1.0-or-later` 1457 + - `AGPL-3.0` 1458 + - `AGPL-3.0-only` 1459 + - `AGPL-3.0-or-later` 1460 + - `Aladdin` 1461 + - `AMDPLPA` 1462 + - `AML` 1463 + - `AMPAS` 1464 + - `ANTLR-PD` 1465 + - `ANTLR-PD-fallback` 1466 + - `Apache-1.0` 1467 + - `Apache-1.1` 1468 + - `Apache-2.0` 1469 + - `APAFML` 1470 + - `APL-1.0` 1471 + - `APSL-1.0` 1472 + - `APSL-1.1` 1473 + - `APSL-1.2` 1474 + - `APSL-2.0` 1475 + - `Artistic-1.0` 1476 + - `Artistic-1.0-cl8` 1477 + - `Artistic-1.0-Perl` 1478 + - `Artistic-2.0` 1479 + - `Bahyph` 1480 + - `Barr` 1481 + - `Beerware` 1482 + - `BitTorrent-1.0` 1483 + - `BitTorrent-1.1` 1484 + - `blessing` 1485 + - `BlueOak-1.0.0` 1486 + - `Borceux` 1487 + - `BSD-1-Clause` 1488 + - `BSD-2-Clause` 1489 + - `BSD-2-Clause-FreeBSD` 1490 + - `BSD-2-Clause-NetBSD` 1491 + - `BSD-2-Clause-Patent` 1492 + - `BSD-2-Clause-Views` 1493 + - `BSD-3-Clause` 1494 + - `BSD-3-Clause-Attribution` 1495 + - `BSD-3-Clause-Clear` 1496 + - `BSD-3-Clause-LBNL` 1497 + - `BSD-3-Clause-Modification` 1498 + - `BSD-3-Clause-No-Nuclear-License` 1499 + - `BSD-3-Clause-No-Nuclear-License-2014` 1500 + - `BSD-3-Clause-No-Nuclear-Warranty` 1501 + - `BSD-3-Clause-Open-MPI` 1502 + - `BSD-4-Clause` 1503 + - `BSD-4-Clause-Shortened` 1504 + - `BSD-4-Clause-UC` 1505 + - `BSD-Protection` 1506 + - `BSD-Source-Code` 1507 + - `BSL-1.0` 1508 + - `BUSL-1.1` 1509 + - `bzip2-1.0.5` 1510 + - `bzip2-1.0.6` 1511 + - `C-UDA-1.0` 1512 + - `CAL-1.0` 1513 + - `CAL-1.0-Combined-Work-Exception` 1514 + - `Caldera` 1515 + - `CATOSL-1.1` 1516 + - `CC-BY-1.0` 1517 + - `CC-BY-2.0` 1518 + - `CC-BY-2.5` 1519 + - `CC-BY-3.0` 1520 + - `CC-BY-3.0-AT` 1521 + - `CC-BY-3.0-US` 1522 + - `CC-BY-4.0` 1523 + - `CC-BY-NC-1.0` 1524 + - `CC-BY-NC-2.0` 1525 + - `CC-BY-NC-2.5` 1526 + - `CC-BY-NC-3.0` 1527 + - `CC-BY-NC-4.0` 1528 + - `CC-BY-NC-ND-1.0` 1529 + - `CC-BY-NC-ND-2.0` 1530 + - `CC-BY-NC-ND-2.5` 1531 + - `CC-BY-NC-ND-3.0` 1532 + - `CC-BY-NC-ND-3.0-IGO` 1533 + - `CC-BY-NC-ND-4.0` 1534 + - `CC-BY-NC-SA-1.0` 1535 + - `CC-BY-NC-SA-2.0` 1536 + - `CC-BY-NC-SA-2.5` 1537 + - `CC-BY-NC-SA-3.0` 1538 + - `CC-BY-NC-SA-4.0` 1539 + - `CC-BY-ND-1.0` 1540 + - `CC-BY-ND-2.0` 1541 + - `CC-BY-ND-2.5` 1542 + - `CC-BY-ND-3.0` 1543 + - `CC-BY-ND-4.0` 1544 + - `CC-BY-SA-1.0` 1545 + - `CC-BY-SA-2.0` 1546 + - `CC-BY-SA-2.0-UK` 1547 + - `CC-BY-SA-2.1-JP` 1548 + - `CC-BY-SA-2.5` 1549 + - `CC-BY-SA-3.0` 1550 + - `CC-BY-SA-3.0-AT` 1551 + - `CC-BY-SA-4.0` 1552 + - `CC-PDDC` 1553 + - `CC0-1.0` 1554 + - `CDDL-1.0` 1555 + - `CDDL-1.1` 1556 + - `CDL-1.0` 1557 + - `CDLA-Permissive-1.0` 1558 + - `CDLA-Sharing-1.0` 1559 + - `CECILL-1.0` 1560 + - `CECILL-1.1` 1561 + - `CECILL-2.0` 1562 + - `CECILL-2.1` 1563 + - `CECILL-B` 1564 + - `CECILL-C` 1565 + - `CERN-OHL-1.1` 1566 + - `CERN-OHL-1.2` 1567 + - `CERN-OHL-P-2.0` 1568 + - `CERN-OHL-S-2.0` 1569 + - `CERN-OHL-W-2.0` 1570 + - `ClArtistic` 1571 + - `CNRI-Jython` 1572 + - `CNRI-Python` 1573 + - `CNRI-Python-GPL-Compatible` 1574 + - `Condor-1.1` 1575 + - `copyleft-next-0.3.0` 1576 + - `copyleft-next-0.3.1` 1577 + - `CPAL-1.0` 1578 + - `CPL-1.0` 1579 + - `CPOL-1.02` 1580 + - `Crossword` 1581 + - `CrystalStacker` 1582 + - `CUA-OPL-1.0` 1583 + - `Cube` 1584 + - `curl` 1585 + - `D-FSL-1.0` 1586 + - `diffmark` 1587 + - `DOC` 1588 + - `Dotseqn` 1589 + - `DRL-1.0` 1590 + - `DSDP` 1591 + - `dvipdfm` 1592 + - `ECL-1.0` 1593 + - `ECL-2.0` 1594 + - `eCos-2.0` 1595 + - `EFL-1.0` 1596 + - `EFL-2.0` 1597 + - `eGenix` 1598 + - `Entessa` 1599 + - `EPICS` 1600 + - `EPL-1.0` 1601 + - `EPL-2.0` 1602 + - `ErlPL-1.1` 1603 + - `etalab-2.0` 1604 + - `EUDatagrid` 1605 + - `EUPL-1.0` 1606 + - `EUPL-1.1` 1607 + - `EUPL-1.2` 1608 + - `Eurosym` 1609 + - `Fair` 1610 + - `Frameworx-1.0` 1611 + - `FreeBSD-DOC` 1612 + - `FreeImage` 1613 + - `FSFAP` 1614 + - `FSFUL` 1615 + - `FSFULLR` 1616 + - `FTL` 1617 + - `GD` 1618 + - `GFDL-1.1` 1619 + - `GFDL-1.1-invariants-only` 1620 + - `GFDL-1.1-invariants-or-later` 1621 + - `GFDL-1.1-no-invariants-only` 1622 + - `GFDL-1.1-no-invariants-or-later` 1623 + - `GFDL-1.1-only` 1624 + - `GFDL-1.1-or-later` 1625 + - `GFDL-1.2` 1626 + - `GFDL-1.2-invariants-only` 1627 + - `GFDL-1.2-invariants-or-later` 1628 + - `GFDL-1.2-no-invariants-only` 1629 + - `GFDL-1.2-no-invariants-or-later` 1630 + - `GFDL-1.2-only` 1631 + - `GFDL-1.2-or-later` 1632 + - `GFDL-1.3` 1633 + - `GFDL-1.3-invariants-only` 1634 + - `GFDL-1.3-invariants-or-later` 1635 + - `GFDL-1.3-no-invariants-only` 1636 + - `GFDL-1.3-no-invariants-or-later` 1637 + - `GFDL-1.3-only` 1638 + - `GFDL-1.3-or-later` 1639 + - `Giftware` 1640 + - `GL2PS` 1641 + - `Glide` 1642 + - `Glulxe` 1643 + - `GLWTPL` 1644 + - `gnuplot` 1645 + - `GPL-1.0` 1646 + - `GPL-1.0-only` 1647 + - `GPL-1.0-or-later` 1648 + - `GPL-1.0+` 1649 + - `GPL-2.0` 1650 + - `GPL-2.0-only` 1651 + - `GPL-2.0-or-later` 1652 + - `GPL-2.0-with-autoconf-exception` 1653 + - `GPL-2.0-with-bison-exception` 1654 + - `GPL-2.0-with-classpath-exception` 1655 + - `GPL-2.0-with-font-exception` 1656 + - `GPL-2.0-with-GCC-exception` 1657 + - `GPL-2.0+` 1658 + - `GPL-3.0` 1659 + - `GPL-3.0-only` 1660 + - `GPL-3.0-or-later` 1661 + - `GPL-3.0-with-autoconf-exception` 1662 + - `GPL-3.0-with-GCC-exception` 1663 + - `GPL-3.0+` 1664 + - `gSOAP-1.3b` 1665 + - `HaskellReport` 1666 + - `Hippocratic-2.1` 1667 + - `HPND` 1668 + - `HPND-sell-variant` 1669 + - `HTMLTIDY` 1670 + - `IBM-pibs` 1671 + - `ICU` 1672 + - `IJG` 1673 + - `ImageMagick` 1674 + - `iMatix` 1675 + - `Imlib2` 1676 + - `Info-ZIP` 1677 + - `Intel` 1678 + - `Intel-ACPI` 1679 + - `Interbase-1.0` 1680 + - `IPA` 1681 + - `IPL-1.0` 1682 + - `ISC` 1683 + - `JasPer-2.0` 1684 + - `JPNIC` 1685 + - `JSON` 1686 + - `LAL-1.2` 1687 + - `LAL-1.3` 1688 + - `Latex2e` 1689 + - `Leptonica` 1690 + - `LGPL-2.0` 1691 + - `LGPL-2.0-only` 1692 + - `LGPL-2.0-or-later` 1693 + - `LGPL-2.0+` 1694 + - `LGPL-2.1` 1695 + - `LGPL-2.1-only` 1696 + - `LGPL-2.1-or-later` 1697 + - `LGPL-2.1+` 1698 + - `LGPL-3.0` 1699 + - `LGPL-3.0-only` 1700 + - `LGPL-3.0-or-later` 1701 + - `LGPL-3.0+` 1702 + - `LGPLLR` 1703 + - `Libpng` 1704 + - `libpng-2.0` 1705 + - `libselinux-1.0` 1706 + - `libtiff` 1707 + - `LiLiQ-P-1.1` 1708 + - `LiLiQ-R-1.1` 1709 + - `LiLiQ-Rplus-1.1` 1710 + - `Linux-OpenIB` 1711 + - `LPL-1.0` 1712 + - `LPL-1.02` 1713 + - `LPPL-1.0` 1714 + - `LPPL-1.1` 1715 + - `LPPL-1.2` 1716 + - `LPPL-1.3a` 1717 + - `LPPL-1.3c` 1718 + - `MakeIndex` 1719 + - `MirOS` 1720 + - `MIT` 1721 + - `MIT-0` 1722 + - `MIT-advertising` 1723 + - `MIT-CMU` 1724 + - `MIT-enna` 1725 + - `MIT-feh` 1726 + - `MIT-Modern-Variant` 1727 + - `MIT-open-group` 1728 + - `MITNFA` 1729 + - `Motosoto` 1730 + - `mpich2` 1731 + - `MPL-1.0` 1732 + - `MPL-1.1` 1733 + - `MPL-2.0` 1734 + - `MPL-2.0-no-copyleft-exception` 1735 + - `MS-PL` 1736 + - `MS-RL` 1737 + - `MTLL` 1738 + - `MulanPSL-1.0` 1739 + - `MulanPSL-2.0` 1740 + - `Multics` 1741 + - `Mup` 1742 + - `NAIST-2003` 1743 + - `NASA-1.3` 1744 + - `Naumen` 1745 + - `NBPL-1.0` 1746 + - `NCGL-UK-2.0` 1747 + - `NCSA` 1748 + - `Net-SNMP` 1749 + - `NetCDF` 1750 + - `Newsletr` 1751 + - `NGPL` 1752 + - `NIST-PD` 1753 + - `NIST-PD-fallback` 1754 + - `NLOD-1.0` 1755 + - `NLPL` 1756 + - `Nokia` 1757 + - `NOSL` 1758 + - `Noweb` 1759 + - `NPL-1.0` 1760 + - `NPL-1.1` 1761 + - `NPOSL-3.0` 1762 + - `NRL` 1763 + - `NTP` 1764 + - `NTP-0` 1765 + - `Nunit` 1766 + - `O-UDA-1.0` 1767 + - `OCCT-PL` 1768 + - `OCLC-2.0` 1769 + - `ODbL-1.0` 1770 + - `ODC-By-1.0` 1771 + - `OFL-1.0` 1772 + - `OFL-1.0-no-RFN` 1773 + - `OFL-1.0-RFN` 1774 + - `OFL-1.1` 1775 + - `OFL-1.1-no-RFN` 1776 + - `OFL-1.1-RFN` 1777 + - `OGC-1.0` 1778 + - `OGDL-Taiwan-1.0` 1779 + - `OGL-Canada-2.0` 1780 + - `OGL-UK-1.0` 1781 + - `OGL-UK-2.0` 1782 + - `OGL-UK-3.0` 1783 + - `OGTSL` 1784 + - `OLDAP-1.1` 1785 + - `OLDAP-1.2` 1786 + - `OLDAP-1.3` 1787 + - `OLDAP-1.4` 1788 + - `OLDAP-2.0` 1789 + - `OLDAP-2.0.1` 1790 + - `OLDAP-2.1` 1791 + - `OLDAP-2.2` 1792 + - `OLDAP-2.2.1` 1793 + - `OLDAP-2.2.2` 1794 + - `OLDAP-2.3` 1795 + - `OLDAP-2.4` 1796 + - `OLDAP-2.5` 1797 + - `OLDAP-2.6` 1798 + - `OLDAP-2.7` 1799 + - `OLDAP-2.8` 1800 + - `OML` 1801 + - `OpenSSL` 1802 + - `OPL-1.0` 1803 + - `OSET-PL-2.1` 1804 + - `OSL-1.0` 1805 + - `OSL-1.1` 1806 + - `OSL-2.0` 1807 + - `OSL-2.1` 1808 + - `OSL-3.0` 1809 + - `Parity-6.0.0` 1810 + - `Parity-7.0.0` 1811 + - `PDDL-1.0` 1812 + - `PHP-3.0` 1813 + - `PHP-3.01` 1814 + - `Plexus` 1815 + - `PolyForm-Noncommercial-1.0.0` 1816 + - `PolyForm-Small-Business-1.0.0` 1817 + - `PostgreSQL` 1818 + - `PSF-2.0` 1819 + - `psfrag` 1820 + - `psutils` 1821 + - `Python-2.0` 1822 + - `Qhull` 1823 + - `QPL-1.0` 1824 + - `Rdisc` 1825 + - `RHeCos-1.1` 1826 + - `RPL-1.1` 1827 + - `RPL-1.5` 1828 + - `RPSL-1.0` 1829 + - `RSA-MD` 1830 + - `RSCPL` 1831 + - `Ruby` 1832 + - `SAX-PD` 1833 + - `Saxpath` 1834 + - `SCEA` 1835 + - `Sendmail` 1836 + - `Sendmail-8.23` 1837 + - `SGI-B-1.0` 1838 + - `SGI-B-1.1` 1839 + - `SGI-B-2.0` 1840 + - `SHL-0.5` 1841 + - `SHL-0.51` 1842 + - `SimPL-2.0` 1843 + - `SISSL` 1844 + - `SISSL-1.2` 1845 + - `Sleepycat` 1846 + - `SMLNJ` 1847 + - `SMPPL` 1848 + - `SNIA` 1849 + - `Spencer-86` 1850 + - `Spencer-94` 1851 + - `Spencer-99` 1852 + - `SPL-1.0` 1853 + - `SSH-OpenSSH` 1854 + - `SSH-short` 1855 + - `SSPL-1.0` 1856 + - `StandardML-NJ` 1857 + - `SugarCRM-1.1.3` 1858 + - `SWL` 1859 + - `TAPR-OHL-1.0` 1860 + - `TCL` 1861 + - `TCP-wrappers` 1862 + - `TMate` 1863 + - `TORQUE-1.1` 1864 + - `TOSL` 1865 + - `TU-Berlin-1.0` 1866 + - `TU-Berlin-2.0` 1867 + - `UCL-1.0` 1868 + - `Unicode-DFS-2015` 1869 + - `Unicode-DFS-2016` 1870 + - `Unicode-TOU` 1871 + - `Unlicense` 1872 + - `UPL-1.0` 1873 + - `Vim` 1874 + - `VOSTROM` 1875 + - `VSL-1.0` 1876 + - `W3C` 1877 + - `W3C-19980720` 1878 + - `W3C-20150513` 1879 + - `Watcom-1.0` 1880 + - `Wsuipa` 1881 + - `WTFPL` 1882 + - `wxWindows` 1883 + - `X11` 1884 + - `Xerox` 1885 + - `XFree86-1.1` 1886 + - `xinetd` 1887 + - `Xnet` 1888 + - `xpp` 1889 + - `XSkat` 1890 + - `YPL-1.0` 1891 + - `YPL-1.1` 1892 + - `Zed` 1893 + - `Zend-2.0` 1894 + - `Zimbra-1.3` 1895 + - `Zimbra-1.4` 1896 + - `Zlib` 1897 + - `zlib-acknowledgement` 1898 + - `ZPL-1.1` 1899 + - `ZPL-2.0` 1900 + - `ZPL-2.1` 1901 + - **required**: N/A 1902 + - **description**: [SPDX identifier](https://spdx.dev/ids/) for the license under which a work is made available. The list of identifiers originates from https://github.com/spdx/license-list-data/blob/bd8e963a41b13524b2ccb67f9335d2dd397c378e/json/licenses.json. 1903 + - **usage**:<br><br> 1904 + ```yaml 1905 + license: Apache-2.0 1906 + ``` 1907 + ```yaml 1908 + license: 1909 + - Apache-2.0 1910 + - MIT 1911 + ``` 1912 + 1913 + ### `definitions.orcid` 1914 + 1915 + - **type**: `uri` with pattern [`https://orcid\.org/[0-9]{4}-[0-9]{4}-[0-9]{4}-[0-9]{3}[0-9X]{1}`](https://regex101.com/library/wvvVYE) 1916 + - **required**: N/A 1917 + - **description**: An [ORCID](https://orcid.org) identifier. 1918 + - **usage**:<br><br> 1919 + ```yaml 1920 + authors: 1921 + - family-names: Druskat 1922 + given-names: Stephan 1923 + orcid: "https://orcid.org/1234-5678-9101-1121" 1924 + ``` 1925 + 1926 + ### `definitions.person` 1927 + 1928 + - **type**: `object` with the following keys: 1929 + - [`address`](#definitionspersonaddress) 1930 + - [`affiliation`](#definitionspersonaffiliation) 1931 + - [`alias`](#definitionspersonalias) 1932 + - [`city`](#definitionspersoncity) 1933 + - [`country`](#definitionspersoncountry) 1934 + - [`email`](#definitionspersonemail) 1935 + - [`family-names`](#definitionspersonfamily-names) 1936 + - [`fax`](#definitionspersonfax) 1937 + - [`given-names`](#definitionspersongiven-names) 1938 + - [`name-particle`](#definitionspersonname-particle) 1939 + - [`name-suffix`](#definitionspersonname-suffix) 1940 + - [`orcid`](#definitionspersonorcid) 1941 + - [`post-code`](#definitionspersonpost-code) 1942 + - [`region`](#definitionspersonregion) 1943 + - [`tel`](#definitionspersontel) 1944 + - [`website`](#definitionspersonwebsite) 1945 + - **required**: N/A 1946 + - **description**: A person. 1947 + The Citation File Format aims to implement a culturally neutral model for personal names, according to the [suggestions on splitting personal names by the W3C](https://www.w3.org/International/questions/qa-personal-names) and the implementation of personal name splitting in BibTeX ([Hufflen, 2006](https://www.tug.org/TUGboat/tb27-2/tb87hufflen.pdf)). To this end, the Citation File Format provides four generic keys to specify personal names: 1948 + 1949 + 1. Values for `family-names` specify family names, including combinations of given and patronymic forms, such as *Guðmundsdóttir* or *bin Osman*; double names with or without hyphen, such as *Leutheusser-Schnarrenberger* or *Sánchez Vicario*. It can potentially also specify names that include prepositions or (nobiliary) particles, especially if they occur in between family names such as in Spanish- or Portuguese-origin names, such as *Fernández de Córdoba*. 1950 + 2. Values for `given-names` specify given and any other names. 1951 + 3. Values for `name-particle` specify [nobiliary particles](https://en.wikipedia.org/wiki/Nobiliary_particle) and prepositions, such as in Ludwig *van* Beethoven or Rafael *van der* Vaart. 1952 + 4. Values for `name-suffix` specify suffixes such as *Jr.* or *III* (as in Frank Edwin Wright *III*). 1953 + 1954 + Note that these keys may still not be optimal for, e.g., Icelandic names which do not have the concept of family names, or Chinese generation names, but represent a best effort. 1955 + - **usage**:<br><br> 1956 + ```yaml 1957 + authors: 1958 + - address: "742 Evergreen Terrace" 1959 + affiliation: "German Aerospace Center (DLR)" 1960 + alias: sdruskat 1961 + city: Berlin 1962 + country: DE 1963 + email: sdruskat@research-project.org 1964 + family-names: Druskat 1965 + fax: +12-3456-7890 1966 + given-names: Stephan 1967 + name-particle: von 1968 + name-suffix: III 1969 + orcid: "https://orcid.org/1234-5678-9101-1121" 1970 + post-code: 90210 1971 + region: Renfrewshire 1972 + tel: +12-345-6789098 1973 + website: "https://research-project.org" 1974 + ``` 1975 + 1976 + ### `definitions.person.address` 1977 + 1978 + - **type**: [`definitions.address`](#definitionsaddress) 1979 + - **required**: `false` 1980 + - **description**: The person's address. 1981 + - **usage**:<br><br> 1982 + ```yaml 1983 + authors: 1984 + - family-names: Druskat 1985 + given-names: Stephan 1986 + address: "742 Evergreen Terrace" 1987 + ``` 1988 + 1989 + ### `definitions.person.affiliation` 1990 + 1991 + - **type**: [Nonempty `string`](#yaml-strings) 1992 + - **required**: `false` 1993 + - **description**: The person's affiliation. 1994 + - **usage**:<br><br> 1995 + ```yaml 1996 + authors: 1997 + - family-names: Druskat 1998 + given-names: Stephan 1999 + affiliation: "German Aerospace Center (DLR)" 2000 + ``` 2001 + 2002 + ### `definitions.person.alias` 2003 + 2004 + - **type**: [`definitions.alias`](#definitionsalias) 2005 + - **required**: `false` 2006 + - **description**: The person's alias. 2007 + - **usage**:<br><br> 2008 + ```yaml 2009 + authors: 2010 + - family-names: Druskat 2011 + given-names: Stephan 2012 + alias: sdruskat 2013 + ``` 2014 + 2015 + ### `definitions.person.city` 2016 + 2017 + - **type**: [`definitions.city`](#definitionscity) 2018 + - **required**: `false` 2019 + - **description**: The person's city. 2020 + - **usage**:<br><br> 2021 + ```yaml 2022 + authors: 2023 + - family-names: Druskat 2024 + given-names: Stephan 2025 + city: Berlin 2026 + ``` 2027 + 2028 + ### `definitions.person.country` 2029 + 2030 + - **type**: [`definitions.country`](#definitioncountry) 2031 + - **required**: `false` 2032 + - **description**: The person's country. 2033 + - **usage**:<br><br> 2034 + ```yaml 2035 + authors: 2036 + - family-names: Druskat 2037 + given-names: Stephan 2038 + country: DE 2039 + ``` 2040 + 2041 + ### `definitions.person.email` 2042 + 2043 + - **type**: [`definitions.email`](#definitionsemail) 2044 + - **required**: `false` 2045 + - **description**: The person's email address. 2046 + - **usage**:<br><br> 2047 + ```yaml 2048 + authors: 2049 + - family-names: Druskat 2050 + given-names: Stephan 2051 + email: mail@research-project.org 2052 + ``` 2053 + 2054 + ### `definitions.person.family-names` 2055 + 2056 + - **type**: [Nonempty `string`](#yaml-strings) 2057 + - **required**: `false` 2058 + - **description**: The person's family names. 2059 + - **usage**:<br><br> 2060 + ```yaml 2061 + authors: 2062 + - family-names: Druskat 2063 + given-names: Stephan 2064 + ``` 2065 + 2066 + ### `definitions.person.fax` 2067 + 2068 + - **type**: [`definitions.fax`](#definitionsfax) 2069 + - **required**: `false` 2070 + - **description**: The person's fax number. 2071 + - **usage**:<br><br> 2072 + ```yaml 2073 + authors: 2074 + - family-names: Druskat 2075 + given-names: Stephan 2076 + fax: +12-3456-7890 2077 + ``` 2078 + 2079 + ### `definitions.person.given-names` 2080 + 2081 + - **type**: [Nonempty `string`](#yaml-strings) 2082 + - **required**: `false` 2083 + - **description**: The person's given names. 2084 + - **usage**:<br><br> 2085 + ```yaml 2086 + authors: 2087 + - family-names: Druskat 2088 + given-names: Stephan 2089 + ``` 2090 + 2091 + ### `definitions.person.name-particle` 2092 + 2093 + - **type**: [Nonempty `string`](#yaml-strings) 2094 + - **required**: `false` 2095 + - **description**: The person's name particle, e.g., a [nobiliary particle](https://en.wikipedia.org/wiki/Nobiliary_particle) or a [preposition] meaning 'of' or 'from' (for example 'von' in 'Alexander von Humboldt'). 2096 + - **usage**:<br><br> 2097 + ```yaml 2098 + authors: 2099 + - family-names: Humboldt 2100 + given-names: Alexander 2101 + name-particle: von 2102 + ``` 2103 + 2104 + ### `definitions.person.name-suffix` 2105 + 2106 + - **type**: [Nonempty `string`](#yaml-strings) 2107 + - **required**: `false` 2108 + - **description**: The person's [name suffix](https://en.wikipedia.org/wiki/Suffix_(name)), e.g. 'Jr.' for Sammy Davis Jr. or 'III' for Frank Edwin Wright III. 2109 + - **usage**:<br><br> 2110 + ```yaml 2111 + authors: 2112 + - family-names: Davis 2113 + given-names: Sammy 2114 + name-suffix: Jr. 2115 + ``` 2116 + 2117 + ### `definitions.person.orcid` 2118 + 2119 + - **type**: [`definitions.orcid`](#definitionsorcid) 2120 + - **required**: `false` 2121 + - **description**: The person's [ORCID](https://orcid.org) identifier. 2122 + - **usage**:<br><br> 2123 + ```yaml 2124 + authors: 2125 + - family-names: Druskat 2126 + given-names: Stephan 2127 + orcid: "https://orcid.org/1234-5678-9101-1121" 2128 + ``` 2129 + 2130 + ### `definitions.person.post-code` 2131 + 2132 + - **type**: [`definitions.post-code`](#definitionspost-code) 2133 + - **required**: `false` 2134 + - **description**: The person's post code. 2135 + - **usage**:<br><br> 2136 + ```yaml 2137 + authors: 2138 + - family-names: Druskat 2139 + given-names: Stephan 2140 + post-code: 90210 2141 + ``` 2142 + ```yaml 2143 + authors: 2144 + - family-names: Druskat 2145 + given-names: Stephan 2146 + post-code: "90210" 2147 + ``` 2148 + 2149 + ### `definitions.person.region` 2150 + 2151 + - **type**: [`definitions.region`](#definitionsregion) 2152 + - **required**: `false` 2153 + - **description**: The person's region. 2154 + - **usage**:<br><br> 2155 + ```yaml 2156 + authors: 2157 + - family-names: Druskat 2158 + given-names: Stephan 2159 + region: Renfrewshire 2160 + ``` 2161 + 2162 + ### `definitions.person.tel` 2163 + 2164 + - **type**: [`definitions.tel`](#definitionstel) 2165 + - **required**: `false` 2166 + - **description**: The person's telephone number. 2167 + - **usage**:<br><br> 2168 + ```yaml 2169 + authors: 2170 + - family-names: Druskat 2171 + given-names: Stephan 2172 + tel: +12-345-6789098 2173 + ``` 2174 + 2175 + ### `definitions.person.website` 2176 + 2177 + - **type**: [`definitions.url`](#definitionsurl) 2178 + - **required**: `false` 2179 + - **description**: The person's website. 2180 + - **usage**:<br><br> 2181 + ```yaml 2182 + authors: 2183 + - family-names: Druskat 2184 + given-names: Stephan 2185 + website: "https://research-project.org" 2186 + ``` 2187 + 2188 + ### `definitions.post-code` 2189 + 2190 + - **type**: `string` or `number` 2191 + - **required**: N/A 2192 + - **description**: A post code. 2193 + - **usage**:<br><br> 2194 + ```yaml 2195 + authors: 2196 + - name: "The Research Software Project" 2197 + post-code: "G42 2PN" 2198 + ``` 2199 + ```yaml 2200 + authors: 2201 + - name: "The Research Software Project" 2202 + post-code: 12053 2203 + ``` 2204 + 2205 + ### `definitions.reference` 2206 + 2207 + - **type**: `object` with the following keys: 2208 + - [`abbreviation`](#definitionsreferenceabbreviation) 2209 + - [`abstract`](#definitionsreferenceabstract) 2210 + - [`authors`](#definitionsreferenceauthors) 2211 + - [`collection-doi`](#definitionsreferencecollection-doi) 2212 + - [`collection-title`](#definitionsreferencecollection-title) 2213 + - [`collection-type`](#definitionsreferencecollection-type) 2214 + - [`commit`](#definitionsreferencecommit) 2215 + - [`conference`](#definitionsreferenceconference) 2216 + - [`contact`](#definitionsreferencecontact) 2217 + - [`copyright`](#definitionsreferencecopyright) 2218 + - [`data-type`](#definitionsreferencedata-type) 2219 + - [`database-provider`](#definitionsreferencedatabase-provider) 2220 + - [`database`](#definitionsreferencedatabase) 2221 + - [`date-accessed`](#definitionsreferencedate-accessed) 2222 + - [`date-downloaded`](#definitionsreferencedate-downloaded) 2223 + - [`date-published`](#definitionsreferencedate-published) 2224 + - [`date-released`](#definitionsreferencedate-released) 2225 + - [`department`](#definitionsreferencedepartment) 2226 + - [`doi`](#definitionsreferencedoi) 2227 + - [`edition`](#definitionsreferenceedition) 2228 + - [`editors`](#definitionsreferenceeditors) 2229 + - [`editors-series`](#definitionsreferenceeditors-series) 2230 + - [`end`](#definitionsreferenceend) 2231 + - [`entry`](#definitionsreferenceentry) 2232 + - [`filename`](#definitionsreferencefilename) 2233 + - [`format`](#definitionsreferenceformat) 2234 + - [`identifiers`](#definitionsreferenceidentifiers) 2235 + - [`institution`](#definitionsreferenceinstitution) 2236 + - [`isbn`](#definitionsreferenceisbn) 2237 + - [`issn`](#definitionsreferenceissn) 2238 + - [`issue`](#definitionsreferenceissue) 2239 + - [`issue-date`](#definitionsreferenceissue-date) 2240 + - [`issue-title`](#definitionsreferenceissue-title) 2241 + - [`journal`](#definitionsreferencejournal) 2242 + - [`keywords`](#definitionsreferencekeywords) 2243 + - [`languages`](#definitionsreferencelanguages) 2244 + - [`license`](#definitionsreferencelicense) 2245 + - [`license-url`](#definitionsreferencelicense-url) 2246 + - [`loc-end`](#definitionsreferenceloc-end) 2247 + - [`loc-start`](#definitionsreferenceloc-start) 2248 + - [`location`](#definitionsreferencelocation) 2249 + - [`medium`](#definitionsreferencemedium) 2250 + - [`month`](#definitionsreferencemonth) 2251 + - [`nihmsid`](#definitionsreferencenihmsid) 2252 + - [`notes`](#definitionsreferencenotes) 2253 + - [`number`](#definitionsreferencenumber) 2254 + - [`number-volumes`](#definitionsreferencenumber-volumes) 2255 + - [`pages`](#definitionsreferencepages) 2256 + - [`patent-states`](#definitionsreferencepatent-states) 2257 + - [`pmcid`](#definitionsreferencepmcid) 2258 + - [`publisher`](#definitionsreferencepublisher) 2259 + - [`recipients`](#definitionsreferencerecipients) 2260 + - [`repository`](#definitionsreferencerepository) 2261 + - [`repository-artifact`](#definitionsreferencerepository-artifact) 2262 + - [`repository-code`](#definitionsreferencerepository-code) 2263 + - [`scope`](#definitionsreferencescope) 2264 + - [`section`](#definitionsreferencesection) 2265 + - [`senders`](#definitionsreferencesenders) 2266 + - [`start`](#definitionsreferencestart) 2267 + - [`status`](#definitionsreferencestatus) 2268 + - [`term`](#definitionsreferenceterm) 2269 + - [`thesis-type`](#definitionsreferencethesis-type) 2270 + - [`title`](#definitionsreferencetitle) 2271 + - [`translators`](#definitionsreferencetranslators) 2272 + - [`type`](#definitionsreferencetype) 2273 + - [`url`](#definitionsreferenceurl) 2274 + - [`version`](#definitionsreferenceversion) 2275 + - [`volume`](#definitionsreferencevolume) 2276 + - [`volume-title`](#definitionsreferencevolume-title) 2277 + - [`year`](#definitionsreferenceyear) 2278 + - [`year-original`](#definitionsreferenceyear-original) 2279 + - **required**: N/A 2280 + - **description**: A reference. 2281 + - **usage**:<br><br> 2282 + ```yaml 2283 + references: 2284 + - authors: 2285 + - family-names: Smith 2286 + given-names: "A. M." 2287 + - family-names: Katz 2288 + given-names: "D. S." 2289 + - family-names: Niemeyer 2290 + given-names: "K. E." 2291 + - name: "FORCE11 Software Citation Working Group" 2292 + doi: 10.7717/peerj-cs.86 2293 + journal: "PeerJ Computer Science" 2294 + month: 9 2295 + start: e86 2296 + title: "Software citation principles" 2297 + type: article 2298 + volume: 2 2299 + year: 2016 2300 + ``` 2301 + ```yaml 2302 + references: 2303 + - abbreviation: NP 2304 + abstract: "This is a non-sensical example reference to show how the many different keys in a reference object can be used." 2305 + authors: 2306 + - name: "The Research Software Project" 2307 + collection-doi: 10.5281/zenodo.1003149 2308 + collection-title: "Proceedings of the Research Conference 2021" 2309 + collection-type: proceedings 2310 + commit: 16192bf05e99bcb35d5c3e085047807b5720fafc 2311 + conference: 2312 + name: "Research Conference 2021" 2313 + contact: 2314 + - name: "The RC21 Organizing Committee" 2315 + copyright: "© 2021 The Research Software Project team" 2316 + data-type: YAML 2317 + database: "Research Database" 2318 + database-provider: 2319 + name: "Research Databases Ltd." 2320 + date-accessed: "2021-07-27" 2321 + date-downloaded: "2021-07-27" 2322 + date-published: "2021-07-26" 2323 + date-released: "2021-07-26" 2324 + department: "Department of Hard Science Fiction" 2325 + doi: 10.5281/zenodo.4813122 2326 + edition: "2nd abridged edition" 2327 + editors: 2328 + - family-names: Inchief 2329 + given-names: Editor 2330 + - name: "The RCProc Editorial Team" 2331 + editors-series: 2332 + - family-names: Editor 2333 + given-names: Series 2334 + - name: "The Series Editors" 2335 + end: 42 2336 + entry: "Citation <n. 1>" 2337 + filename: CITATION.cff 2338 + format: "Citation File Format" 2339 + identifiers: 2340 + - description: "The concept DOI of the work." 2341 + type: doi 2342 + value: 10.5281/zenodo.1003149 2343 + - description: "The versioned DOI for version 1.1.0 of the work." 2344 + type: doi 2345 + value: 10.5281/zenodo.4813122 2346 + - description: "The Software Heritage identifier for version 1.1.0 of the work." 2347 + type: swh 2348 + value: "swh:1:dir:bc286860f423ea7ced246ba7458eef4b4541cf2d" 2349 + - description: "The GitHub release URL of tag 1.1.0." 2350 + type: url 2351 + value: "https://github.com/citation-file-format/citation-file-format/releases/tag/1.1.0" 2352 + institution: 2353 + name: "University of Arcadia" 2354 + isbn: "9781603095075" 2355 + issn: 2475-9066 2356 + issue: 42 2357 + issue-date: "November/December 2021" 2358 + issue-title: "Special Issue: Software Citation" 2359 + journal: "Journal of Open Source Software" 2360 + keywords: 2361 + - "software citation" 2362 + - "citation file format" 2363 + - research 2364 + languages: 2365 + - en 2366 + - haw 2367 + license: Apache-2.0 2368 + license-url: "https://obscure-licenses.com?id=1234" 2369 + loc-end: 42 2370 + loc-start: 21 2371 + location: 2372 + name: "Library of the Unseen University" 2373 + medium: "5¼-inch floppy disk" 2374 + month: 7 2375 + nihmsid: NIHMS236863 2376 + notes: "Excellent reference! TODO Read for thesis." 2377 + number: 12053 2378 + number-volumes: 7 2379 + pages: 78 2380 + patent-states: 2381 + - Canada 2382 + pmcid: PMC3134971 2383 + publisher: 2384 + name: "Open Access Publishing House" 2385 + recipients: 2386 + - name: "Recipient entity of personal communication" 2387 + - family-names: Recipient 2388 + given-names: Communication 2389 + repository: "https://ascl.net/2105.013" 2390 + repository-artifact: "https://search.maven.org/artifact/org.corpus-tools/cff-maven-plugin/0.4.0/maven-plugin" 2391 + repository-code: "https://github.com/citation-file-format/my-research-software" 2392 + scope: "Supplement 2: Additional material" 2393 + section: 7 2394 + senders: 2395 + - name: "Sender entity of personal communication" 2396 + - family-names: Sender 2397 + given-names: Communication 2398 + start: 17 2399 + status: submitted 2400 + term: Citation 2401 + thesis-type: "PhD thesis" 2402 + title: "Towards better software citation" 2403 + translators: 2404 + - name: "Research Translators Ltd." 2405 + - family-names: Lator 2406 + given-names: Trans 2407 + type: conference-paper 2408 + url: "https://citation-file-format.github.io/" 2409 + version: 0.3.12 2410 + volume: 2 2411 + volume-title: "Volume II: How it went on" 2412 + year: 2021 2413 + year-original: 1978 2414 + ``` 2415 + 2416 + ### `definitions.reference.abbreviation` 2417 + 2418 + - **type**: [Nonempty `string`](#yaml-strings) 2419 + - **required**: `false` 2420 + - **description**: The abbreviation of a work. 2421 + - **usage**:<br><br> 2422 + ```yaml 2423 + preferred-citation: 2424 + abbreviation: ABC 2425 + type: generic 2426 + ``` 2427 + ```yaml 2428 + references: 2429 + - abbreviation: DEF 2430 + type: generic 2431 + ``` 2432 + 2433 + ### `definitions.reference.abstract` 2434 + 2435 + - **type**: [Nonempty `string`](#yaml-strings) 2436 + - **required**: `false` 2437 + - **description**: The abstract of the work. 2438 + - If the work is a journal paper or other academic work: The abstract of the work. 2439 + - If the work is a film, broadcast or similar: The synopsis of the work. 2440 + - **usage**:<br><br> 2441 + ```yaml 2442 + preferred-citation: 2443 + abstract: "This work describes the software or dataset that should be actually cited. etc." 2444 + type: generic 2445 + ``` 2446 + ```yaml 2447 + references: 2448 + - abstract: "This work implements an algorithm that we use in our software. etc." 2449 + type: generic 2450 + ``` 2451 + 2452 + ### `definitions.reference.authors` 2453 + 2454 + - **type**: Array of [`definitions.person`](#definitionsperson) and/or [`definitions.entity`](#definitionsentity) objects. 2455 + - **required**: `true` 2456 + - **description**: The authors of the work. 2457 + - **usage**:<br><br> 2458 + ```yaml 2459 + preferred-citation: 2460 + authors: 2461 + - name: "The Research Software Project team" 2462 + - family-names: Druskat 2463 + given-names: Stephan 2464 + type: generic 2465 + ``` 2466 + ```yaml 2467 + references: 2468 + - authors: 2469 + - name: "The Research Software Project team" 2470 + - family-names: Druskat 2471 + given-names: Stephan 2472 + type: generic 2473 + ``` 2474 + 2475 + #### How to deal with unknown individual authors? 2476 + 2477 + To enable credit for the individuals that have created a work, 2478 + it is good practice to cite the respective individuals as authors. 2479 + Sometimes you may not be able to determine the person names of the relevant individuals to create 2480 + [`definitions.person`](#definitionsperson) objects for them, 2481 + for example when a software you cite does not provide a `CITATION.cff` file. 2482 + Then, the next best thing is to refer to those that you could not determine person names for 2483 + collectively as a "team" or "project" using the title of the work 2484 + in a [`definitions.entity`](#definitionsentity) object: 2485 + 2486 + ```yaml 2487 + authors: 2488 + - name: "The Research Software project" 2489 + ``` 2490 + ```yaml 2491 + authors: 2492 + - family-names: Spaaks 2493 + given-names: "Jurriaan H." 2494 + - family-names: Druskat 2495 + given-names: Stephan 2496 + - name: "The Research Software team" 2497 + ``` 2498 + 2499 + This still represents the maximum knowledge you have about the authors. 2500 + It's also a good starting point to enable users of the citation metadata to determine the correct names themselves in the future, 2501 + especially if you also provide a source of information such as a `repository-code` or a `url`. 2502 + 2503 + If the authors of a work are truly anonymous, 2504 + you can represent this in the same way: 2505 + 2506 + ```yaml 2507 + authors: 2508 + - name: anonymous 2509 + ``` 2510 + 2511 + ### `definitions.reference.collection-doi` 2512 + 2513 + - **type**: [`definitions.doi`](#definitionsdoi) 2514 + - **required**: `false` 2515 + - **description**: The [DOI](https://en.wikipedia.org/wiki/Digital_object_identifier) of a collection containing the work. 2516 + - **usage**:<br><br> 2517 + ```yaml 2518 + preferred-citation: 2519 + collection-doi: 10.5281/zenodo.1003149 2520 + type: generic 2521 + ``` 2522 + ```yaml 2523 + references: 2524 + - collection-doi: 10.5281/zenodo.1003149 2525 + type: generic 2526 + ``` 2527 + 2528 + ### `definitions.reference.collection-title` 2529 + 2530 + - **type**: [Nonempty `string`](#yaml-strings) 2531 + - **required**: `false` 2532 + - **description**: The title of a collection or proceedings. 2533 + - **usage**:<br><br> 2534 + ```yaml 2535 + preferred-citation: 2536 + collection-title: "Proceedings of the Research Conference 2021" 2537 + type: generic 2538 + ``` 2539 + ```yaml 2540 + references: 2541 + - collection-title: "Proceedings of the Research Conference 2021" 2542 + type: generic 2543 + ``` 2544 + 2545 + ### `definitions.reference.collection-type` 2546 + 2547 + - **type**: [Nonempty `string`](#yaml-strings) 2548 + - **required**: `false` 2549 + - **description**: The type of a collection. 2550 + - **usage**:<br><br> 2551 + ```yaml 2552 + preferred-citation: 2553 + collection-type: proceedings 2554 + type: generic 2555 + ``` 2556 + ```yaml 2557 + references: 2558 + - collection-type: proceedings 2559 + type: generic 2560 + ``` 2561 + 2562 + ### `definitions.reference.commit` 2563 + 2564 + - **type**: [`definitions.commit`](#definitionscommit) 2565 + - **required**: `false` 2566 + - **description**: The (e.g., Git) commit hash or (e.g., Subversion) revision number of the work. 2567 + - **usage**:<br><br> 2568 + ```yaml 2569 + preferred-citation: 2570 + commit: "16192bf05e99bcb35d5c3e085047807b5720fafc" 2571 + type: generic 2572 + ``` 2573 + ```yaml 2574 + references: 2575 + - commit: "16192bf05e99bcb35d5c3e085047807b5720fafc" 2576 + type: generic 2577 + ``` 2578 + 2579 + ### `definitions.reference.conference` 2580 + 2581 + - **type**: [`definitions.entity`](#definitionsentity) 2582 + - **required**: `false` 2583 + - **description**: The conference where the work was presented. 2584 + - **usage**:<br><br> 2585 + ```yaml 2586 + preferred-citation: 2587 + conference: 2588 + name: "Research Conference 2021" 2589 + type: generic 2590 + ``` 2591 + ```yaml 2592 + references: 2593 + - conference: 2594 + name: "Research Conference 2021" 2595 + type: generic 2596 + ``` 2597 + 2598 + ### `definitions.reference.contact` 2599 + 2600 + - **type**: Array of [`definitions.person`](#definitionsperson) and/or [`definitions.entity`](#definitionsentity) objects. 2601 + - **required**: `false` 2602 + - **description**: The contact person, group, company, etc. for a work. 2603 + - **usage**:<br><br> 2604 + ```yaml 2605 + references: 2606 + - contact: 2607 + - name: "The RC21 Organizing Committee" 2608 + - family-names: Druskat 2609 + given-names: Stephan 2610 + type: generic 2611 + ``` 2612 + ```yaml 2613 + preferred-citation: 2614 + contact: 2615 + - name: "The RC21 Organizing Committee" 2616 + - family-names: Druskat 2617 + given-names: Stephan 2618 + type: generic 2619 + ``` 2620 + 2621 + ### `definitions.reference.copyright` 2622 + 2623 + - **type**: [Nonempty `string`](#yaml-strings) 2624 + - **required**: `false` 2625 + - **description**: The copyright information pertaining to the work. 2626 + - **usage**:<br><br> 2627 + ```yaml 2628 + preferred-citation: 2629 + copyright: "© 2021 The Research Software Project team" 2630 + type: generic 2631 + ``` 2632 + ```yaml 2633 + references: 2634 + - copyright: "© 2021 The Research Software Project team" 2635 + type: generic 2636 + ``` 2637 + 2638 + ### `definitions.reference.data-type` 2639 + 2640 + - **type**: [Nonempty `string`](#yaml-strings) 2641 + - **required**: `false` 2642 + - **description**: The data type of a data set. 2643 + - **usage**:<br><br> 2644 + ```yaml 2645 + preferred-citation: 2646 + data-type: YAML 2647 + type: generic 2648 + ``` 2649 + ```yaml 2650 + references: 2651 + - data-type: YAML 2652 + type: generic 2653 + ``` 2654 + 2655 + ### `definitions.reference.database-provider` 2656 + 2657 + - **type**: [`definitions.entity`](#definitionsentity) 2658 + - **required**: `false` 2659 + - **description**: The provider of the database where a work was accessed/is stored. 2660 + - **usage**:<br><br> 2661 + ```yaml 2662 + preferred-citation: 2663 + database-provider: 2664 + name: "Research Databases Ltd." 2665 + type: generic 2666 + ``` 2667 + ```yaml 2668 + references: 2669 + - database-provider: 2670 + name: "Research Databases Ltd." 2671 + type: generic 2672 + ``` 2673 + 2674 + ### `definitions.reference.database` 2675 + 2676 + - **type**: [Nonempty `string`](#yaml-strings) 2677 + - **required**: `false` 2678 + - **description**: The name of the database where a work was accessed/is stored. 2679 + - **usage**:<br><br> 2680 + ```yaml 2681 + preferred-citation: 2682 + database: "Research Database" 2683 + type: generic 2684 + ``` 2685 + ```yaml 2686 + references: 2687 + - database: "Research Database" 2688 + type: generic 2689 + ``` 2690 + 2691 + ### `definitions.reference.date-accessed` 2692 + 2693 + - **type**: [`definitions.date`](#definitionsdate) 2694 + - **required**: `false` 2695 + - **description**: The date the work was accessed. 2696 + - **usage**:<br><br> 2697 + ```yaml 2698 + preferred-citation: 2699 + date-accessed: "2021-07-27" 2700 + type: generic 2701 + ``` 2702 + ```yaml 2703 + references: 2704 + - date-accessed: "2021-07-27" 2705 + type: generic 2706 + ``` 2707 + 2708 + ### `definitions.reference.date-downloaded` 2709 + 2710 + - **type**: [`definitions.date`](#definitionsdate) 2711 + - **required**: `false` 2712 + - **description**: The date the work has been downloaded. 2713 + - **usage**:<br><br> 2714 + ```yaml 2715 + preferred-citation: 2716 + date-downloaded: "2021-07-27" 2717 + type: generic 2718 + ``` 2719 + ```yaml 2720 + references: 2721 + - date-downloaded: "2021-07-27" 2722 + type: generic 2723 + ``` 2724 + 2725 + ### `definitions.reference.date-published` 2726 + 2727 + - **type**: [`definitions.date`](#definitionsdate) 2728 + - **required**: `false` 2729 + - **description**: The date the work has been published. 2730 + - **usage**:<br><br> 2731 + ```yaml 2732 + references: 2733 + - date-published: "2021-07-27" 2734 + type: generic 2735 + ``` 2736 + ```yaml 2737 + preferred-citation: 2738 + date-published: "2021-07-27" 2739 + type: generic 2740 + ``` 2741 + 2742 + ### `definitions.reference.date-released` 2743 + 2744 + - **type**: [`definitions.date`](#definitionsdate) 2745 + - **required**: `false` 2746 + - **description**: The date the work has been released. 2747 + - **usage**:<br><br> 2748 + ```yaml 2749 + preferred-citation: 2750 + date-released: "2021-07-27" 2751 + type: generic 2752 + ``` 2753 + ```yaml 2754 + references: 2755 + - date-released: "2021-07-27" 2756 + type: generic 2757 + ``` 2758 + 2759 + ### `definitions.reference.department` 2760 + 2761 + - **type**: [Nonempty `string`](#yaml-strings) 2762 + - **required**: `false` 2763 + - **description**: The department where a work has been produced. 2764 + - **usage**:<br><br> 2765 + ```yaml 2766 + preferred-citation: 2767 + department: "Department of Hard Science Fiction" 2768 + type: generic 2769 + ``` 2770 + ```yaml 2771 + references: 2772 + - department: "Department of Hard Science Fiction" 2773 + type: generic 2774 + ``` 2775 + 2776 + ### `definitions.reference.doi` 2777 + 2778 + - **type**: [`definitions.doi`](#definitionsdoi) 2779 + - **required**: `false` 2780 + - **description**: The [DOI](https://en.wikipedia.org/wiki/Digital_object_identifier) of the work. 2781 + - **usage**:<br><br> 2782 + ```yaml 2783 + preferred-citation: 2784 + doi: 10.5281/zenodo.4813122 2785 + type: generic 2786 + ``` 2787 + ```yaml 2788 + references: 2789 + - doi: 10.5281/zenodo.4813122 2790 + type: generic 2791 + ``` 2792 + 2793 + ### `definitions.reference.edition` 2794 + 2795 + - **type**: [Nonempty `string`](#yaml-strings) 2796 + - **required**: `false` 2797 + - **description**: The edition of the work. 2798 + - **usage**:<br><br> 2799 + ```yaml 2800 + preferred-citation: 2801 + edition: "2nd abridged edition" 2802 + type: generic 2803 + ``` 2804 + ```yaml 2805 + references: 2806 + - edition: "2nd abridged edition" 2807 + type: generic 2808 + ``` 2809 + 2810 + ### `definitions.reference.editors` 2811 + 2812 + - **type**: Array of [`definitions.person`](#definitionsperson) and/or [`definitions.entity`](#definitionsentity) objects. 2813 + - **required**: `false` 2814 + - **description**: The editor(s) of a work. 2815 + - **usage**:<br><br> 2816 + ```yaml 2817 + preferred-citation: 2818 + editors: 2819 + - family-names: Inchief 2820 + given-names: Editor 2821 + - name: "The RCProc Editorial Team" 2822 + type: generic 2823 + ``` 2824 + ```yaml 2825 + references: 2826 + - editors: 2827 + - family-names: Inchief 2828 + given-names: Editor 2829 + - name: "The RCProc Editorial Team" 2830 + type: generic 2831 + ``` 2832 + 2833 + ### `definitions.reference.editors-series` 2834 + 2835 + - **type**: Array of [`definitions.person`](#definitionsperson) and/or [`definitions.entity`](#definitionsentity) objects. 2836 + - **required**: `false` 2837 + - **description**: The editor(s) of a series in which a work has been published. 2838 + - **usage**:<br><br> 2839 + ```yaml 2840 + preferred-citation: 2841 + editors-series: 2842 + - family-names: Editor 2843 + given-names: Series 2844 + - name: "The Series Editors" 2845 + type: generic 2846 + ``` 2847 + ```yaml 2848 + references: 2849 + - editors-series: 2850 + - family-names: Editor 2851 + given-names: Series 2852 + - name: "The Series Editors" 2853 + type: generic 2854 + ``` 2855 + 2856 + ### `definitions.reference.end` 2857 + 2858 + - **type**: [Nonempty `string`](#yaml-strings) or `integer` 2859 + - **required**: `false` 2860 + - **description**: The end page of the work. 2861 + - **usage**:<br><br> 2862 + ```yaml 2863 + preferred-citation: 2864 + end: "42" 2865 + type: generic 2866 + ``` 2867 + ```yaml 2868 + preferred-citation: 2869 + end: 42 2870 + type: generic 2871 + ``` 2872 + ```yaml 2873 + references: 2874 + - end: "42" 2875 + type: generic 2876 + ``` 2877 + ```yaml 2878 + references: 2879 + - end: 42 2880 + type: generic 2881 + ``` 2882 + 2883 + ### `definitions.reference.entry` 2884 + 2885 + - **type**: [Nonempty `string`](#yaml-strings) 2886 + - **required**: `false` 2887 + - **description**: An entry in the collection that constitutes the work. 2888 + - **usage**:<br><br> 2889 + ```yaml 2890 + preferred-citation: 2891 + entry: "Citation <n. 1>" 2892 + type: generic 2893 + ``` 2894 + ```yaml 2895 + references: 2896 + - entry: "Citation <n. 1>" 2897 + type: generic 2898 + ``` 2899 + 2900 + ### `definitions.reference.filename` 2901 + 2902 + - **type**: [Nonempty `string`](#yaml-strings) 2903 + - **required**: `false` 2904 + - **description**: The name of the electronic file containing the work. 2905 + - **usage**:<br><br> 2906 + ```yaml 2907 + preferred-citation: 2908 + filename: CITATION.cff 2909 + type: generic 2910 + ``` 2911 + ```yaml 2912 + references: 2913 + - filename: CITATION.cff 2914 + type: generic 2915 + ``` 2916 + 2917 + ### `definitions.reference.format` 2918 + 2919 + - **type**: [Nonempty `string`](#yaml-strings) 2920 + - **required**: `false` 2921 + - **description**: The format in which a work is represented. 2922 + - **usage**:<br><br> 2923 + ```yaml 2924 + preferred-citation: 2925 + format: "Citation File Format" 2926 + type: generic 2927 + ``` 2928 + ```yaml 2929 + references: 2930 + - format: "Citation File Format" 2931 + type: generic 2932 + ``` 2933 + 2934 + ### `definitions.reference.identifiers` 2935 + 2936 + - **type**: Array of [`definitions.identifier`](#definitionsidentifier) objects. 2937 + - **required**: `false` 2938 + - **description**: The identifier(s) of the work. 2939 + - **usage**:<br><br> 2940 + ```yaml 2941 + preferred-citation: 2942 + identifiers: 2943 + - description: "The concept DOI of the work." 2944 + type: doi 2945 + value: 10.5281/zenodo.1003149 2946 + - description: "The versioned DOI for version 1.1.0 of the work." 2947 + type: doi 2948 + value: 10.5281/zenodo.4813122 2949 + - description: "The Software Heritage identifier for version 1.1.0 of the work." 2950 + type: swh 2951 + value: "swh:1:dir:bc286860f423ea7ced246ba7458eef4b4541cf2d" 2952 + - description: "The GitHub release URL of tag 1.1.0." 2953 + type: url 2954 + value: "https://github.com/citation-file-format/citation-file-format/releases/tag/1.1.0" 2955 + type: generic 2956 + ``` 2957 + ```yaml 2958 + references: 2959 + - identifiers: 2960 + - description: "The concept DOI of the work." 2961 + type: doi 2962 + value: 10.5281/zenodo.1003149 2963 + - description: "The versioned DOI for version 1.1.0 of the work." 2964 + type: doi 2965 + value: 10.5281/zenodo.4813122 2966 + - description: "The Software Heritage identifier for version 1.1.0 of the work." 2967 + type: swh 2968 + value: "swh:1:dir:bc286860f423ea7ced246ba7458eef4b4541cf2d" 2969 + - description: "The GitHub release URL of tag 1.1.0." 2970 + type: url 2971 + value: "https://github.com/citation-file-format/citation-file-format/releases/tag/1.1.0" 2972 + type: generic 2973 + ``` 2974 + 2975 + ### `definitions.reference.institution` 2976 + 2977 + - **type**: [`definitions.entity`](#definitionsentity) 2978 + - **required**: `false` 2979 + - **description**: The institution where a work has been produced or published. 2980 + - **usage**:<br><br> 2981 + ```yaml 2982 + preferred-citation: 2983 + institution: 2984 + name: "University of Arcadia" 2985 + type: generic 2986 + ``` 2987 + ```yaml 2988 + references: 2989 + - institution: 2990 + name: "University of Arcadia" 2991 + type: generic 2992 + ``` 2993 + 2994 + ### `definitions.reference.isbn` 2995 + 2996 + - **type**: `string` with pattern [`^[0-9\- ]{10,17}X?$`](https://regex101.com/library/6oS1PA) 2997 + - **required**: `false` 2998 + - **description**: The [ISBN](https://en.wikipedia.org/wiki/International_Standard_Book_Number) of the work. 2999 + - **usage**:<br><br> 3000 + ```yaml 3001 + preferred-citation: 3002 + isbn: "9781603095075" 3003 + type: generic 3004 + ``` 3005 + ```yaml 3006 + references: 3007 + - isbn: "9781603095075" 3008 + type: generic 3009 + ``` 3010 + 3011 + ### `definitions.reference.issn` 3012 + 3013 + - **type**: `string` with pattern [`^\d{4}-\d{3}[\dxX]$`](https://regex101.com/library/jqobq9) 3014 + - **required**: `false` 3015 + - **description**: The [ISSN](https://en.wikipedia.org/wiki/International_Standard_Serial_Number) of the work. 3016 + - **usage**:<br><br> 3017 + ```yaml 3018 + preferred-citation: 3019 + issn: "2475-9066" 3020 + type: generic 3021 + ``` 3022 + ```yaml 3023 + references: 3024 + - issn: "2475-9066" 3025 + type: generic 3026 + ``` 3027 + 3028 + ### `definitions.reference.issue` 3029 + 3030 + - **type**: [Nonempty `string`](#yaml-strings) or `number` 3031 + - **required**: `false` 3032 + - **description**: The issue of a periodical in which a work appeared. 3033 + - **usage**:<br><br> 3034 + ```yaml 3035 + preferred-citation: 3036 + issue: "42" 3037 + type: generic 3038 + ``` 3039 + ```yaml 3040 + references: 3041 + - issue: "42" 3042 + type: generic 3043 + ``` 3044 + ```yaml 3045 + preferred-citation: 3046 + issue: 42 3047 + type: generic 3048 + ``` 3049 + ```yaml 3050 + references: 3051 + - issue: 42 3052 + type: generic 3053 + ``` 3054 + 3055 + ### `definitions.reference.issue-date` 3056 + 3057 + - **type**: [Nonempty `string`](#yaml-strings) 3058 + - **required**: `false` 3059 + - **description**: The publication date of the issue of a periodical in which a work appeared. 3060 + - **usage**:<br><br> 3061 + ```yaml 3062 + preferred-citation: 3063 + issue-date: "November/December 2021" 3064 + type: generic 3065 + ``` 3066 + ```yaml 3067 + references: 3068 + - issue-date: "November/December 2021" 3069 + type: generic 3070 + ``` 3071 + ```yaml 3072 + preferred-citation: 3073 + issue-date: "2021-12-31" 3074 + type: generic 3075 + ``` 3076 + ```yaml 3077 + references: 3078 + - issue-date: "2021-12-31" 3079 + type: generic 3080 + ``` 3081 + 3082 + ### `definitions.reference.issue-title` 3083 + 3084 + - **type**: [Nonempty `string`](#yaml-strings) 3085 + - **required**: `false` 3086 + - **description**: The name of the issue of a periodical in which the work appeared. 3087 + - **usage**:<br><br> 3088 + ```yaml 3089 + preferred-citation: 3090 + issue-title: "Special Issue: Software Citation" 3091 + type: generic 3092 + ``` 3093 + ```yaml 3094 + references: 3095 + - issue-title: "Special Issue: Software Citation" 3096 + type: generic 3097 + ``` 3098 + 3099 + ### `definitions.reference.journal` 3100 + 3101 + - **type**: [Nonempty `string`](#yaml-strings) 3102 + - **required**: `false` 3103 + - **description**: The name of the journal/magazine/newspaper/periodical where the work was published. 3104 + - **usage**:<br><br> 3105 + ```yaml 3106 + preferred-citation: 3107 + journal: "Journal of Open Source Software" 3108 + type: generic 3109 + ``` 3110 + ```yaml 3111 + references: 3112 + - journal: "Journal of Open Source Software" 3113 + type: generic 3114 + ``` 3115 + 3116 + ### `definitions.reference.keywords` 3117 + 3118 + - **type**: Array of [nonempty `string`](#yaml-strings) 3119 + - **required**: `false` 3120 + - **description**: Keywords pertaining to the work. 3121 + - **usage**:<br><br> 3122 + ```yaml 3123 + preferred-citation: 3124 + keywords: 3125 + - "software citation" 3126 + - "citation file format" 3127 + - research 3128 + type: generic 3129 + ``` 3130 + ```yaml 3131 + references: 3132 + - keywords: 3133 + - "software citation" 3134 + - "citation file format" 3135 + - research 3136 + type: generic 3137 + ``` 3138 + 3139 + ### `definitions.reference.languages` 3140 + 3141 + - **type**: Array of [ISO 639](https://en.wikipedia.org/wiki/ISO_639) `string` with 2 or 3 characters and pattern [`^[a-z]{2,3}$`](https://regex101.com/library/aMqWLH) 3142 + - **required**: `false` 3143 + - **description**: The language identifier(s) of the work according to ISO 639 language strings. 3144 + - **usage**:<br><br> 3145 + ```yaml 3146 + preferred-citation: 3147 + languages: 3148 + - en 3149 + - haw 3150 + type: generic 3151 + ``` 3152 + ```yaml 3153 + references: 3154 + - languages: 3155 + - en 3156 + - haw 3157 + type: generic 3158 + ``` 3159 + 3160 + ### `definitions.reference.license` 3161 + 3162 + - **type**: (Array of) [`definitions.license-enum`](#definitionslicense-enum). 3163 + - **required**: `false` 3164 + - **description**: The [SPDX license identifier(s)](https://spdx.dev/ids/) for the license(s) under which the work is made available. 3165 + When there are multiple licenses, it is assumed their relationship is OR, not AND. 3166 + - **usage**:<br><br> 3167 + ```yaml 3168 + preferred-citation: 3169 + license: Apache-2.0 3170 + type: generic 3171 + ``` 3172 + ```yaml 3173 + references: 3174 + - license: Apache-2.0 3175 + type: generic 3176 + ``` 3177 + ```yaml 3178 + preferred-citation: 3179 + license: 3180 + - Apache-2.0 3181 + - MIT 3182 + type: generic 3183 + ``` 3184 + ```yaml 3185 + references: 3186 + - license: 3187 + - Apache-2.0 3188 + - MIT 3189 + type: generic 3190 + ``` 3191 + 3192 + ### `definitions.reference.license-url` 3193 + 3194 + - **type**: [`definitions.url`](#definitionsurl) 3195 + - **required**: `false` 3196 + - **description**: The URL of the license text under which the work is licensed (only for non-standard licenses not included in the [SPDX License List](#definitionslicense-enum)). 3197 + - **usage**:<br><br> 3198 + ```yaml 3199 + preferred-citation: 3200 + license-url: "https://obscure-licenses.com?id=1234" 3201 + type: generic 3202 + ``` 3203 + ```yaml 3204 + references: 3205 + - license-url: "https://obscure-licenses.com?id=1234" 3206 + type: generic 3207 + ``` 3208 + 3209 + ### `definitions.reference.loc-end` 3210 + 3211 + - **type**: [Nonempty `string`](#yaml-strings) or `integer` 3212 + - **required**: `false` 3213 + - **description**: The line of code in the file where the work ends. 3214 + - **usage**:<br><br> 3215 + ```yaml 3216 + preferred-citation: 3217 + loc-end: "42" 3218 + type: generic 3219 + ``` 3220 + ```yaml 3221 + preferred-citation: 3222 + loc-end: 42 3223 + type: generic 3224 + ``` 3225 + ```yaml 3226 + references: 3227 + - loc-end: "42" 3228 + type: generic 3229 + ``` 3230 + ```yaml 3231 + references: 3232 + - loc-end: 42 3233 + type: generic 3234 + ``` 3235 + 3236 + ### `definitions.reference.loc-start` 3237 + 3238 + - **type**: [Nonempty `string`](#yaml-strings) or `integer` 3239 + - **required**: `false` 3240 + - **description**: The line of code in the file where the work starts. 3241 + - **usage**:<br><br> 3242 + ```yaml 3243 + preferred-citation: 3244 + loc-start: "21" 3245 + type: generic 3246 + ``` 3247 + ```yaml 3248 + preferred-citation: 3249 + loc-start: 21 3250 + type: generic 3251 + ``` 3252 + ```yaml 3253 + references: 3254 + - loc-start: "21" 3255 + type: generic 3256 + ``` 3257 + ```yaml 3258 + references: 3259 + - loc-start: 21 3260 + type: generic 3261 + ``` 3262 + 3263 + ### `definitions.reference.location` 3264 + 3265 + - **type**: [`definitions.entity`](#definitionsentity) 3266 + - **required**: `false` 3267 + - **description**: The location of the work. 3268 + - **usage**:<br><br> 3269 + ```yaml 3270 + preferred-citation: 3271 + location: 3272 + name: "Library of the Unseen University" 3273 + type: generic 3274 + ``` 3275 + ```yaml 3276 + references: 3277 + - location: 3278 + name: "Library of the Unseen University" 3279 + type: generic 3280 + ``` 3281 + 3282 + ### `definitions.reference.medium` 3283 + 3284 + - **type**: [Nonempty `string`](#yaml-strings) 3285 + - **required**: `false` 3286 + - **description**: The medium of the work. 3287 + - **usage**:<br><br> 3288 + ```yaml 3289 + preferred-citation: 3290 + medium: "5¼-inch floppy disk" 3291 + type: generic 3292 + ``` 3293 + ```yaml 3294 + references: 3295 + - medium: "5¼-inch floppy disk" 3296 + type: generic 3297 + ``` 3298 + 3299 + ### `definitions.reference.month` 3300 + 3301 + - **type**: `integer` in range `1-12` or `enum` with values: 3302 + - `1` 3303 + - `2` 3304 + - `3` 3305 + - `4` 3306 + - `5` 3307 + - `6` 3308 + - `7` 3309 + - `8` 3310 + - `9` 3311 + - `10` 3312 + - `11` 3313 + - `12` 3314 + - **required**: `false` 3315 + - **description**: The month in which a work has been published. 3316 + - **usage**:<br><br> 3317 + ```yaml 3318 + preferred-citation: 3319 + month: 7 3320 + type: generic 3321 + ``` 3322 + ```yaml 3323 + preferred-citation: 3324 + month: "7" 3325 + type: generic 3326 + ``` 3327 + ```yaml 3328 + references: 3329 + - month: 7 3330 + type: generic 3331 + ``` 3332 + ```yaml 3333 + references: 3334 + - month: "7" 3335 + type: generic 3336 + ``` 3337 + 3338 + ### `definitions.reference.nihmsid` 3339 + 3340 + - **type**: [Nonempty `string`](#yaml-strings) 3341 + - **required**: `false` 3342 + - **description**: The [NIHMSID](https://web.archive.org/web/20210802210057/https://www.ncbi.nlm.nih.gov/pmc/about/public-access-info/) of a work. 3343 + - **usage**:<br><br> 3344 + ```yaml 3345 + preferred-citation: 3346 + nihmsid: NIHMS236863 3347 + type: generic 3348 + ``` 3349 + ```yaml 3350 + references: 3351 + - nihmsid: NIHMS236863 3352 + type: generic 3353 + ``` 3354 + 3355 + ### `definitions.reference.notes` 3356 + 3357 + - **type**: [Nonempty `string`](#yaml-strings) 3358 + - **required**: `false` 3359 + - **description**: Notes pertaining to the work. Note that this key should contain notes that may be picked up by some downstream tooling (e.g., reference managers), but not others (e.g., a software index). 3360 + - **usage**:<br><br> 3361 + ```yaml 3362 + preferred-citation: 3363 + notes: "Excellent reference! TODO Read for thesis." 3364 + type: generic 3365 + ``` 3366 + ```yaml 3367 + references: 3368 + - notes: "Excellent reference! TODO Read for thesis." 3369 + type: generic 3370 + ``` 3371 + 3372 + ### `definitions.reference.number` 3373 + 3374 + - **type**: `string` or `number` 3375 + - **required**: `false` 3376 + - **description**: The (library) [accession number](https://en.wikipedia.org/wiki/Accession_number) for a work. 3377 + - **usage**:<br><br> 3378 + ```yaml 3379 + preferred-citation: 3380 + number: "005.1-ABC" 3381 + type: generic 3382 + ``` 3383 + ```yaml 3384 + references: 3385 + - number: "005.1-ABC" 3386 + type: generic 3387 + ``` 3388 + ```yaml 3389 + preferred-citation: 3390 + number: 1234567 3391 + type: generic 3392 + ``` 3393 + ```yaml 3394 + references: 3395 + - number: 1234567 3396 + type: generic 3397 + ``` 3398 + ```yaml 3399 + preferred-citation: 3400 + number: 1.4 3401 + type: generic 3402 + ``` 3403 + ```yaml 3404 + references: 3405 + - number: 1.4 3406 + type: generic 3407 + ``` 3408 + 3409 + ### `definitions.reference.number-volumes` 3410 + 3411 + - **type**: [Nonempty `string`](#yaml-strings) or `integer` 3412 + - **required**: `false` 3413 + - **description**: The number of volumes making up the collection in which the work has been published. 3414 + - **usage**:<br><br> 3415 + ```yaml 3416 + preferred-citation: 3417 + number-volumes: "4" 3418 + type: generic 3419 + ``` 3420 + ```yaml 3421 + preferred-citation: 3422 + number-volumes: 4 3423 + type: generic 3424 + ``` 3425 + ```yaml 3426 + references: 3427 + - number-volumes: "4" 3428 + type: generic 3429 + ``` 3430 + ```yaml 3431 + references: 3432 + - number-volumes: 4 3433 + type: generic 3434 + ``` 3435 + 3436 + ### `definitions.reference.pages` 3437 + 3438 + - **type**: [Nonempty `string`](#yaml-strings) or `integer` 3439 + - **required**: `false` 3440 + - **description**: The number of pages of the work. 3441 + - **usage**:<br><br> 3442 + ```yaml 3443 + preferred-citation: 3444 + pages: "123" 3445 + type: generic 3446 + ``` 3447 + ```yaml 3448 + preferred-citation: 3449 + pages: 123 3450 + type: generic 3451 + ``` 3452 + ```yaml 3453 + references: 3454 + - pages: "123" 3455 + type: generic 3456 + ``` 3457 + ```yaml 3458 + references: 3459 + - pages: 123 3460 + type: generic 3461 + ``` 3462 + 3463 + ### `definitions.reference.patent-states` 3464 + 3465 + - **type**: Array of nonemtpy `string` 3466 + - **required**: `false` 3467 + - **description**: The states for which a patent is granted. 3468 + - **usage**:<br><br> 3469 + ```yaml 3470 + preferred-citation: 3471 + patent-states: 3472 + - Canada 3473 + - IL 3474 + type: generic 3475 + ``` 3476 + ```yaml 3477 + references: 3478 + - patent-states: 3479 + - Canada 3480 + - IL 3481 + type: generic 3482 + ``` 3483 + 3484 + ### `definitions.reference.pmcid` 3485 + 3486 + - **type**: `string` with pattern [`^PMC[0-9]{7}$`](https://regex101.com/library/EsU1QH) 3487 + - **required**: `false` 3488 + - **description**: The [PMCID](https://web.archive.org/web/20210802210057/https://www.ncbi.nlm.nih.gov/pmc/about/public-access-info/) of a work. 3489 + - **usage**:<br><br> 3490 + ```yaml 3491 + preferred-citation: 3492 + pmcid: PMC3134971 3493 + type: generic 3494 + ``` 3495 + ```yaml 3496 + references: 3497 + - pmcid: PMC3134971 3498 + type: generic 3499 + ``` 3500 + 3501 + ### `definitions.reference.publisher` 3502 + 3503 + - **type**: [`definitions.entity`](#definitionsentity) 3504 + - **required**: `false` 3505 + - **description**: The publisher who has published the work. 3506 + - **usage**:<br><br> 3507 + ```yaml 3508 + preferred-citation: 3509 + publisher: 3510 + name: "Open Access Publishing House" 3511 + type: generic 3512 + ``` 3513 + ```yaml 3514 + references: 3515 + - publisher: 3516 + name: "Open Access Publishing House" 3517 + type: generic 3518 + ``` 3519 + 3520 + ### `definitions.reference.recipients` 3521 + 3522 + - **type**: Array of [`definitions.person`](#definitionsperson) and/or [`definitions.entity`](#definitionsentity) objects. 3523 + - **required**: `false` 3524 + - **description**: The recipient(s) of a personal communication. 3525 + - **usage**:<br><br> 3526 + ```yaml 3527 + preferred-citation: 3528 + recipients: 3529 + - name: "Recipient entity of personal communication" 3530 + - family-names: Recipient 3531 + given-names: Communication 3532 + type: generic 3533 + ``` 3534 + ```yaml 3535 + references: 3536 + - recipients: 3537 + - name: "Recipient entity of personal communication" 3538 + - family-names: Recipient 3539 + given-names: Communication 3540 + type: generic 3541 + ``` 3542 + 3543 + ### `definitions.reference.repository` 3544 + 3545 + - **type**: [`definitions.url`](#definitionsurl) 3546 + - **required**: `false` 3547 + - **description**: The URL of the work in a repository/archive (when the repository is neither a source code repository nor a build artifact repository). 3548 + - **usage**:<br><br> 3549 + ```yaml 3550 + preferred-citation: 3551 + repository: "https://ascl.net/2105.013" 3552 + type: generic 3553 + ``` 3554 + ```yaml 3555 + references: 3556 + - repository: "https://ascl.net/2105.013" 3557 + type: generic 3558 + ``` 3559 + 3560 + ### `definitions.reference.repository-artifact` 3561 + 3562 + - **type**: [`definitions.url`](#definitionsurl) 3563 + - **required**: `false` 3564 + - **description**: The URL of the work in a build artifact/binary repository. 3565 + - **usage**:<br><br> 3566 + ```yaml 3567 + preferred-citation: 3568 + repository-artifact: "https://search.maven.org/artifact/org.corpus-tools/cff-maven-plugin/0.4.0/maven-plugin" 3569 + type: generic 3570 + ``` 3571 + ```yaml 3572 + references: 3573 + - repository-artifact: "https://search.maven.org/artifact/org.corpus-tools/cff-maven-plugin/0.4.0/maven-plugin" 3574 + type: generic 3575 + ``` 3576 + 3577 + ### `definitions.reference.repository-code` 3578 + 3579 + - **type**: [`definitions.url`](#definitionsurl) 3580 + - **required**: `false` 3581 + - **description**: The URL of the work in a source code repository. 3582 + - **usage**:<br><br> 3583 + ```yaml 3584 + preferred-citation: 3585 + repository-code: "https://github.com/citation-file-format/my-research-software" 3586 + type: generic 3587 + ``` 3588 + ```yaml 3589 + references: 3590 + - repository-code: "https://github.com/citation-file-format/my-research-software" 3591 + type: generic 3592 + ``` 3593 + 3594 + ### `definitions.reference.scope` 3595 + 3596 + - **type**: [Nonempty `string`](#yaml-strings) 3597 + - **required**: `false` 3598 + - **description**: The scope of the reference, e.g., the section of the work it adheres to. 3599 + - **usage**:<br><br> 3600 + ```yaml 3601 + preferred-citation: 3602 + scope: "Supplement 2: Additional material" 3603 + type: generic 3604 + ``` 3605 + ```yaml 3606 + references: 3607 + - scope: "Supplement 2: Additional material" 3608 + type: generic 3609 + ``` 3610 + 3611 + ### `definitions.reference.section` 3612 + 3613 + - **type**: `string` or `number` 3614 + - **required**: `false` 3615 + - **description**: The section of a work that is referenced. 3616 + - **usage**:<br><br> 3617 + ```yaml 3618 + preferred-citation: 3619 + section: "Section 7: Software citation" 3620 + type: generic 3621 + ``` 3622 + ```yaml 3623 + references: 3624 + - section: "Section 7: Software citation" 3625 + type: generic 3626 + ``` 3627 + ```yaml 3628 + preferred-citation: 3629 + section: 7 3630 + type: generic 3631 + ``` 3632 + ```yaml 3633 + references: 3634 + - section: 7 3635 + type: generic 3636 + ``` 3637 + ```yaml 3638 + preferred-citation: 3639 + section: 7.1 3640 + type: generic 3641 + ``` 3642 + ```yaml 3643 + references: 3644 + - section: 7.1 3645 + type: generic 3646 + ``` 3647 + 3648 + ### `definitions.reference.senders` 3649 + 3650 + - **type**: Array of [`definitions.person`](#definitionsperson) and/or [`definitions.entity`](#definitionsentity) objects. 3651 + - **required**: `false` 3652 + - **description**: The sender(s) of a personal communication. 3653 + - **usage**:<br><br> 3654 + ```yaml 3655 + preferred-citation: 3656 + senders: 3657 + - name: "Sender entity of personal communication" 3658 + - family-names: Sender 3659 + given-names: Communication 3660 + type: generic 3661 + ``` 3662 + ```yaml 3663 + references: 3664 + - senders: 3665 + - name: "Sender entity of personal communication" 3666 + - family-names: Sender 3667 + given-names: Communication 3668 + type: generic 3669 + ``` 3670 + 3671 + ### `definitions.reference.start` 3672 + 3673 + - **type**: [Nonempty `string`](#yaml-strings) or `integer` 3674 + - **required**: `false` 3675 + - **description**: The start page of the work. 3676 + - **usage**:<br><br> 3677 + ```yaml 3678 + preferred-citation: 3679 + start: "42" 3680 + type: generic 3681 + ``` 3682 + ```yaml 3683 + preferred-citation: 3684 + start: 42 3685 + type: generic 3686 + ``` 3687 + ```yaml 3688 + references: 3689 + - start: "42" 3690 + type: generic 3691 + ``` 3692 + ```yaml 3693 + references: 3694 + - start: 42 3695 + type: generic 3696 + ``` 3697 + 3698 + ### `definitions.reference.status` 3699 + 3700 + - **type**: `enum` with values: 3701 + - `abstract` 3702 + - `advance-online` 3703 + - `in-preparation` 3704 + - `in-press` 3705 + - `preprint` 3706 + - `submitted` 3707 + - **required**: `false` 3708 + - **description**: The publication status of the work. 3709 + - **usage**:<br><br> 3710 + ```yaml 3711 + preferred-citation: 3712 + status: submitted 3713 + type: generic 3714 + ``` 3715 + ```yaml 3716 + references: 3717 + - status: submitted 3718 + type: generic 3719 + ``` 3720 + 3721 + ### `definitions.reference.term` 3722 + 3723 + - **type**: [Nonempty `string`](#yaml-strings) 3724 + - **required**: `false` 3725 + - **description**: The term being referenced if the work is a dictionary or encyclopedia. 3726 + - **usage**:<br><br> 3727 + ```yaml 3728 + preferred-citation: 3729 + term: Citation 3730 + type: generic 3731 + ``` 3732 + ```yaml 3733 + references: 3734 + - term: Citation 3735 + type: generic 3736 + ``` 3737 + 3738 + ### `definitions.reference.thesis-type` 3739 + 3740 + - **type**: [Nonempty `string`](#yaml-strings) 3741 + - **required**: `false` 3742 + - **description**: The type of the thesis that is the work. 3743 + - **usage**:<br><br> 3744 + ```yaml 3745 + preferred-citation: 3746 + thesis-type: "PhD thesis" 3747 + type: generic 3748 + ``` 3749 + ```yaml 3750 + references: 3751 + - thesis-type: "PhD thesis" 3752 + type: generic 3753 + ``` 3754 + 3755 + ### `definitions.reference.title` 3756 + 3757 + - **type**: [Nonempty `string`](#yaml-strings) 3758 + - **required**: `true` 3759 + - **description**: The title of the work. 3760 + - **usage**:<br><br> 3761 + ```yaml 3762 + preferred-citation: 3763 + title: "Towards better software citation" 3764 + type: generic 3765 + ``` 3766 + ```yaml 3767 + references: 3768 + - title: "Towards better software citation" 3769 + type: generic 3770 + ``` 3771 + 3772 + ### `definitions.reference.translators` 3773 + 3774 + - **type**: Array of [`definitions.person`](#definitionsperson) and/or [`definitions.entity`](#definitionsentity) objects. 3775 + - **required**: `false` 3776 + - **description**: The translator(s) of a work. 3777 + - **usage**:<br><br> 3778 + ```yaml 3779 + preferred-citation: 3780 + translators: 3781 + - name: "Research Translators Ltd." 3782 + - family-names: Lator 3783 + given-names: Trans 3784 + type: generic 3785 + ``` 3786 + ```yaml 3787 + references: 3788 + - translators: 3789 + - name: "Research Translators Ltd." 3790 + - family-names: Lator 3791 + given-names: Trans 3792 + type: generic 3793 + ``` 3794 + 3795 + ### `definitions.reference.type` 3796 + 3797 + - **type**: `enum` with values: 3798 + - `art` 3799 + - `article` 3800 + - `audiovisual` 3801 + - `bill` 3802 + - `blog` 3803 + - `book` 3804 + - `catalogue` 3805 + - `conference-paper` 3806 + - `conference` 3807 + - `data` 3808 + - `database` 3809 + - `dictionary` 3810 + - `edited-work` 3811 + - `encyclopedia` 3812 + - `film-broadcast` 3813 + - `generic` 3814 + - `government-document` 3815 + - `grant` 3816 + - `hearing` 3817 + - `historical-work` 3818 + - `legal-case` 3819 + - `legal-rule` 3820 + - `magazine-article` 3821 + - `manual` 3822 + - `map` 3823 + - `multimedia` 3824 + - `music` 3825 + - `newspaper-article` 3826 + - `pamphlet` 3827 + - `patent` 3828 + - `personal-communication` 3829 + - `proceedings` 3830 + - `report` 3831 + - `serial` 3832 + - `slides` 3833 + - `software-code` 3834 + - `software-container` 3835 + - `software-executable` 3836 + - `software-virtual-machine` 3837 + - `software` 3838 + - `sound-recording` 3839 + - `standard` 3840 + - `statute` 3841 + - `thesis` 3842 + - `unpublished` 3843 + - `video` 3844 + - `website` 3845 + - **required**: `true` 3846 + - **description**: The type of the work. 3847 + - **usage**:<br><br> 3848 + ```yaml 3849 + preferred-citation: 3850 + type: generic 3851 + ``` 3852 + ```yaml 3853 + references: 3854 + - type: generic 3855 + ``` 3856 + 3857 + ### `definitions.reference.url` 3858 + 3859 + - **type**: [`definitions.url`](#definitionsurl) 3860 + - **required**: `false` 3861 + - **description**: The URL of the work. 3862 + - **usage**:<br><br> 3863 + ```yaml 3864 + preferred-citation: 3865 + type: generic 3866 + url: "https://citation-file-format.github.io/" 3867 + ``` 3868 + ```yaml 3869 + references: 3870 + - type: generic 3871 + url: "https://citation-file-format.github.io/" 3872 + ``` 3873 + 3874 + ### `definitions.reference.version` 3875 + 3876 + - **type**: [`definitions.version`](#definitionsversion) 3877 + - **required**: `false` 3878 + - **description**: The version of the work. 3879 + - **usage**:<br><br> 3880 + ```yaml 3881 + preferred-citation: 3882 + type: generic 3883 + version: 0.3.12 3884 + ``` 3885 + ```yaml 3886 + references: 3887 + - type: generic 3888 + version: 0.3.12 3889 + ``` 3890 + 3891 + ### `definitions.reference.volume` 3892 + 3893 + - **type**: [Nonempty `string`](#yaml-strings) or `integer` 3894 + - **required**: `false` 3895 + - **description**: The volume of the periodical in which a work appeared. 3896 + - **usage**:<br><br> 3897 + ```yaml 3898 + preferred-citation: 3899 + type: generic 3900 + volume: "5" 3901 + ``` 3902 + ```yaml 3903 + preferred-citation: 3904 + type: generic 3905 + volume: 5 3906 + ``` 3907 + ```yaml 3908 + references: 3909 + - type: generic 3910 + volume: "5" 3911 + ``` 3912 + ```yaml 3913 + references: 3914 + - type: generic 3915 + volume: 5 3916 + ``` 3917 + 3918 + ### `definitions.reference.volume-title` 3919 + 3920 + - **type**: [Nonempty `string`](#yaml-strings) 3921 + - **required**: `false` 3922 + - **description**: The title of the volume in which the work appeared. 3923 + - **usage**:<br><br> 3924 + ```yaml 3925 + preferred-citation: 3926 + type: generic 3927 + volume-title: "Volume II: How it went on" 3928 + ``` 3929 + ```yaml 3930 + references: 3931 + - type: generic 3932 + volume-title: "Volume II: How it went on" 3933 + ``` 3934 + 3935 + ### `definitions.reference.year` 3936 + 3937 + - **type**: [Nonempty `string`](#yaml-strings) or `integer` 3938 + - **required**: `false` 3939 + - **description**: The year in which a work has been published. 3940 + - **usage**:<br><br> 3941 + ```yaml 3942 + preferred-citation: 3943 + type: generic 3944 + year: "2021" 3945 + ``` 3946 + ```yaml 3947 + preferred-citation: 3948 + type: generic 3949 + year: 2021 3950 + ``` 3951 + ```yaml 3952 + references: 3953 + - type: generic 3954 + year: "2021" 3955 + ``` 3956 + ```yaml 3957 + references: 3958 + - type: generic 3959 + year: 2021 3960 + ``` 3961 + 3962 + ### `definitions.reference.year-original` 3963 + 3964 + - **type**: [Nonempty `string`](#yaml-strings) or `integer` 3965 + - **required**: `false` 3966 + - **description**: The year of the original publication. 3967 + - **usage**:<br><br> 3968 + ```yaml 3969 + preferred-citation: 3970 + type: generic 3971 + year-original: "1978" 3972 + ``` 3973 + ```yaml 3974 + preferred-citation: 3975 + type: generic 3976 + year-original: 1978 3977 + ``` 3978 + ```yaml 3979 + references: 3980 + - type: generic 3981 + year-original: "1978" 3982 + ``` 3983 + ```yaml 3984 + references: 3985 + - type: generic 3986 + year-original: 1978 3987 + ``` 3988 + 3989 + ### `definitions.region` 3990 + 3991 + - **type**: [Nonempty `string`](#yaml-strings) 3992 + - **required**: N/A 3993 + - **description**: A region. 3994 + - **usage**:<br><br> 3995 + ```yaml 3996 + authors: 3997 + - name: "The Research Software Project" 3998 + region: Renfrewshire 3999 + ``` 4000 + 4001 + ### `definitions.swh-identifier` 4002 + 4003 + - **type**: `string` with pattern [`^swh:1:(snp|rel|rev|dir|cnt):[0-9a-fA-F]{40}$`](https://regex101.com/library/o399MX) 4004 + - **required**: N/A 4005 + - **description**: The [Software Heritage](https://www.softwareheritage.org/) identifier (without further qualifiers such as origin, visit, anchor, path). Note: Software Heritage identifiers are documented here: https://docs.softwareheritage.org/devel/swh-model/persistent-identifiers.html. 4006 + - **usage**:<br><br> 4007 + ```yaml 4008 + identifiers: 4009 + - type: swh 4010 + value: "swh:1:rev:309cf2674ee7a0749978cf8265ab91a60aea0f7d" 4011 + ``` 4012 + 4013 + ### `definitions.tel` 4014 + 4015 + - **type**: [Nonempty `string`](#yaml-strings) 4016 + - **required**: N/A 4017 + - **description**: A telephone number. 4018 + - **usage**:<br><br> 4019 + ```yaml 4020 + authors: 4021 + - family-names: Druskat 4022 + given-names: Stephan 4023 + tel: +12-345-6789098 4024 + ``` 4025 + ```yaml 4026 + authors: 4027 + - name: "The Research Software Project" 4028 + tel: +12-345-6789098 4029 + ``` 4030 + 4031 + ### `definitions.url` 4032 + 4033 + - **type**: [Nonempty `string`](#yaml-strings) 4034 + - **required**: N/A 4035 + - **description**: A URL. Supported URLs start with one of: 4036 + - `https://` 4037 + - `http://` 4038 + - `ftp://` 4039 + - `sftp://` 4040 + - **usage** 4041 + ```yaml 4042 + url: "https://citation-file-format.github.io/" 4043 + ``` 4044 + ```yaml 4045 + authors: 4046 + - name: "The Research Software Project" 4047 + website: "https://research-software-project.org" 4048 + ``` 4049 + ```yaml 4050 + references: 4051 + - type: generic 4052 + url: "sftp://files.research-software-project.org" 4053 + ``` 4054 + 4055 + ### `definitions.version` 4056 + 4057 + - **type**: [Nonempty `string`](#yaml-strings) or `number` 4058 + - **required**: N/A 4059 + - **description**: The version of a work. 4060 + - **usage**:<br><br> 4061 + ```yaml 4062 + version: "1.2.0" 4063 + ``` 4064 + ```yaml 4065 + version: 1.2 4066 + ``` 4067 + ```yaml 4068 + version: "21.10 (Impish Indri)" 4069 + ```
+1882
project/ocaml-cff/vendor/git/citation-file-format/schema.json
··· 1 + { 2 + "$id": "https://citation-file-format.github.io/1.2.0/schema.json", 3 + "$schema": "http://json-schema.org/draft-07/schema", 4 + "additionalProperties": false, 5 + "definitions": { 6 + "address": { 7 + "description": "An address.", 8 + "minLength": 1, 9 + "type": "string" 10 + }, 11 + "alias": { 12 + "description": "An alias.", 13 + "minLength": 1, 14 + "type": "string" 15 + }, 16 + "city": { 17 + "description": "A city", 18 + "minLength": 1, 19 + "type": "string" 20 + }, 21 + "commit": { 22 + "description": "The (e.g., Git) commit hash or (e.g., Subversion) revision number of the work.", 23 + "minLength": 1, 24 + "type": "string" 25 + }, 26 + "country": { 27 + "$comment": "ISO 3166-1 alpha-2 codes can be found at https://en.wikipedia.org/wiki/ISO_3166-1", 28 + "description": "The ISO 3166-1 alpha-2 country code for a country.", 29 + "enum": [ 30 + "AD", 31 + "AE", 32 + "AF", 33 + "AG", 34 + "AI", 35 + "AL", 36 + "AM", 37 + "AO", 38 + "AQ", 39 + "AR", 40 + "AS", 41 + "AT", 42 + "AU", 43 + "AW", 44 + "AX", 45 + "AZ", 46 + "BA", 47 + "BB", 48 + "BD", 49 + "BE", 50 + "BF", 51 + "BG", 52 + "BH", 53 + "BI", 54 + "BJ", 55 + "BL", 56 + "BM", 57 + "BN", 58 + "BO", 59 + "BQ", 60 + "BR", 61 + "BS", 62 + "BT", 63 + "BV", 64 + "BW", 65 + "BY", 66 + "BZ", 67 + "CA", 68 + "CC", 69 + "CD", 70 + "CF", 71 + "CG", 72 + "CH", 73 + "CI", 74 + "CK", 75 + "CL", 76 + "CM", 77 + "CN", 78 + "CO", 79 + "CR", 80 + "CU", 81 + "CV", 82 + "CW", 83 + "CX", 84 + "CY", 85 + "CZ", 86 + "DE", 87 + "DJ", 88 + "DK", 89 + "DM", 90 + "DO", 91 + "DZ", 92 + "EC", 93 + "EE", 94 + "EG", 95 + "EH", 96 + "ER", 97 + "ES", 98 + "ET", 99 + "FI", 100 + "FJ", 101 + "FK", 102 + "FM", 103 + "FO", 104 + "FR", 105 + "GA", 106 + "GB", 107 + "GD", 108 + "GE", 109 + "GF", 110 + "GG", 111 + "GH", 112 + "GI", 113 + "GL", 114 + "GM", 115 + "GN", 116 + "GP", 117 + "GQ", 118 + "GR", 119 + "GS", 120 + "GT", 121 + "GU", 122 + "GW", 123 + "GY", 124 + "HK", 125 + "HM", 126 + "HN", 127 + "HR", 128 + "HT", 129 + "HU", 130 + "ID", 131 + "IE", 132 + "IL", 133 + "IM", 134 + "IN", 135 + "IO", 136 + "IQ", 137 + "IR", 138 + "IS", 139 + "IT", 140 + "JE", 141 + "JM", 142 + "JO", 143 + "JP", 144 + "KE", 145 + "KG", 146 + "KH", 147 + "KI", 148 + "KM", 149 + "KN", 150 + "KP", 151 + "KR", 152 + "KW", 153 + "KY", 154 + "KZ", 155 + "LA", 156 + "LB", 157 + "LC", 158 + "LI", 159 + "LK", 160 + "LR", 161 + "LS", 162 + "LT", 163 + "LU", 164 + "LV", 165 + "LY", 166 + "MA", 167 + "MC", 168 + "MD", 169 + "ME", 170 + "MF", 171 + "MG", 172 + "MH", 173 + "MK", 174 + "ML", 175 + "MM", 176 + "MN", 177 + "MO", 178 + "MP", 179 + "MQ", 180 + "MR", 181 + "MS", 182 + "MT", 183 + "MU", 184 + "MV", 185 + "MW", 186 + "MX", 187 + "MY", 188 + "MZ", 189 + "NA", 190 + "NC", 191 + "NE", 192 + "NF", 193 + "NG", 194 + "NI", 195 + "NL", 196 + "NO", 197 + "NP", 198 + "NR", 199 + "NU", 200 + "NZ", 201 + "OM", 202 + "PA", 203 + "PE", 204 + "PF", 205 + "PG", 206 + "PH", 207 + "PK", 208 + "PL", 209 + "PM", 210 + "PN", 211 + "PR", 212 + "PS", 213 + "PT", 214 + "PW", 215 + "PY", 216 + "QA", 217 + "RE", 218 + "RO", 219 + "RS", 220 + "RU", 221 + "RW", 222 + "SA", 223 + "SB", 224 + "SC", 225 + "SD", 226 + "SE", 227 + "SG", 228 + "SH", 229 + "SI", 230 + "SJ", 231 + "SK", 232 + "SL", 233 + "SM", 234 + "SN", 235 + "SO", 236 + "SR", 237 + "SS", 238 + "ST", 239 + "SV", 240 + "SX", 241 + "SY", 242 + "SZ", 243 + "TC", 244 + "TD", 245 + "TF", 246 + "TG", 247 + "TH", 248 + "TJ", 249 + "TK", 250 + "TL", 251 + "TM", 252 + "TN", 253 + "TO", 254 + "TR", 255 + "TT", 256 + "TV", 257 + "TW", 258 + "TZ", 259 + "UA", 260 + "UG", 261 + "UM", 262 + "US", 263 + "UY", 264 + "UZ", 265 + "VA", 266 + "VC", 267 + "VE", 268 + "VG", 269 + "VI", 270 + "VN", 271 + "VU", 272 + "WF", 273 + "WS", 274 + "YE", 275 + "YT", 276 + "ZA", 277 + "ZM", 278 + "ZW" 279 + ], 280 + "type": "string" 281 + }, 282 + "date": { 283 + "$comment": "Note to tool implementers: it is necessary to cast YAML 'date' objects to string objects when validating against this schema.", 284 + "examples": [ 285 + "1900-01-01", 286 + "2020-12-31" 287 + ], 288 + "format": "date", 289 + "pattern": "^[0-9]{4}-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])$", 290 + "type": "string" 291 + }, 292 + "doi": { 293 + "description": "The DOI of the work (i.e., 10.5281/zenodo.1003150, not the resolver URL http://doi.org/10.5281/zenodo.1003150).", 294 + "examples": [ 295 + "10.5281/zenodo.1003150" 296 + ], 297 + "pattern": "^10\\.\\d{4,9}(\\.\\d+)?/[A-Za-z0-9:/_;\\-\\.\\(\\)\\[\\]\\\\]+$", 298 + "type": "string" 299 + }, 300 + "email": { 301 + "description": "An email address.", 302 + "pattern": "^[\\S]+@[\\S]+\\.[\\S]{2,}$", 303 + "type": "string" 304 + }, 305 + "entity": { 306 + "additionalProperties": false, 307 + "description": "An entity, i.e., an institution, team, research group, company, conference, etc., as opposed to a single natural person.", 308 + "properties": { 309 + "address": { 310 + "$ref": "#/definitions/address", 311 + "description": "The entity's address." 312 + }, 313 + "alias": { 314 + "$ref": "#/definitions/alias", 315 + "description": "The entity's alias." 316 + }, 317 + "city": { 318 + "$ref": "#/definitions/city", 319 + "description": "The entity's city." 320 + }, 321 + "country": { 322 + "$ref": "#/definitions/country", 323 + "description": "The entity's country." 324 + }, 325 + "date-end": { 326 + "$ref": "#/definitions/date", 327 + "description": "The entity's ending date, e.g., when the entity is a conference." 328 + }, 329 + "date-start": { 330 + "$ref": "#/definitions/date", 331 + "description": "The entity's starting date, e.g., when the entity is a conference." 332 + }, 333 + "email": { 334 + "$ref": "#/definitions/email", 335 + "description": "The entity's email address." 336 + }, 337 + "fax": { 338 + "$ref": "#/definitions/fax", 339 + "description": "The entity's fax number." 340 + }, 341 + "location": { 342 + "description": "The entity's location, e.g., when the entity is a conference.", 343 + "minLength": 1, 344 + "type": "string" 345 + }, 346 + "name": { 347 + "description": "The entity's name.", 348 + "minLength": 1, 349 + "type": "string" 350 + }, 351 + "orcid": { 352 + "$ref": "#/definitions/orcid", 353 + "description": "The entity's orcid." 354 + }, 355 + "post-code": { 356 + "$ref": "#/definitions/post-code", 357 + "description": "The entity's post code." 358 + }, 359 + "region": { 360 + "$ref": "#/definitions/region", 361 + "description": "The entity's region." 362 + }, 363 + "tel": { 364 + "$ref": "#/definitions/tel", 365 + "description": "The entity's telephone number." 366 + }, 367 + "website": { 368 + "$ref": "#/definitions/url", 369 + "description": "The entity's website." 370 + } 371 + }, 372 + "required": [ 373 + "name" 374 + ], 375 + "type": "object" 376 + }, 377 + "fax": { 378 + "description": "A fax number.", 379 + "minLength": 1, 380 + "type": "string" 381 + }, 382 + "identifier": { 383 + "anyOf": [ 384 + { 385 + "additionalProperties": false, 386 + "properties": { 387 + "description": { 388 + "$ref": "#/definitions/identifier-description" 389 + }, 390 + "type": { 391 + "enum": [ 392 + "doi" 393 + ], 394 + "type": "string" 395 + }, 396 + "value": { 397 + "$ref": "#/definitions/doi" 398 + } 399 + }, 400 + "required": [ 401 + "type", 402 + "value" 403 + ], 404 + "type": "object" 405 + }, 406 + { 407 + "additionalProperties": false, 408 + "properties": { 409 + "description": { 410 + "$ref": "#/definitions/identifier-description" 411 + }, 412 + "type": { 413 + "enum": [ 414 + "url" 415 + ], 416 + "type": "string" 417 + }, 418 + "value": { 419 + "$ref": "#/definitions/url" 420 + } 421 + }, 422 + "required": [ 423 + "type", 424 + "value" 425 + ], 426 + "type": "object" 427 + }, 428 + { 429 + "additionalProperties": false, 430 + "properties": { 431 + "description": { 432 + "$ref": "#/definitions/identifier-description" 433 + }, 434 + "type": { 435 + "enum": [ 436 + "swh" 437 + ], 438 + "type": "string" 439 + }, 440 + "value": { 441 + "$ref": "#/definitions/swh-identifier" 442 + } 443 + }, 444 + "required": [ 445 + "type", 446 + "value" 447 + ], 448 + "type": "object" 449 + }, 450 + { 451 + "additionalProperties": false, 452 + "properties": { 453 + "description": { 454 + "$ref": "#/definitions/identifier-description" 455 + }, 456 + "type": { 457 + "enum": [ 458 + "other" 459 + ], 460 + "type": "string" 461 + }, 462 + "value": { 463 + "minLength": 1, 464 + "type": "string" 465 + } 466 + }, 467 + "required": [ 468 + "type", 469 + "value" 470 + ], 471 + "type": "object" 472 + } 473 + ], 474 + "description": "An identifier for a work." 475 + }, 476 + "identifier-description": { 477 + "description": "A description for a specific identifier value.", 478 + "examples": [ 479 + "The version DOI for this version, which has a relation childOf with the concept DOI specified in the doi field in the root of this file.", 480 + "The identifier provided by Archival Repository, which points to this version of the software." 481 + ], 482 + "minLength": 1, 483 + "type": "string" 484 + }, 485 + "license": { 486 + "description": "An SPDX license identifier.", 487 + "oneOf": [ 488 + { 489 + "$ref": "#/definitions/license-enum", 490 + "examples": [ 491 + "Apache-2.0", 492 + "MIT" 493 + ] 494 + }, 495 + { 496 + "$comment": "When there are multiple licenses, it is assumed their relationship is OR, not AND", 497 + "examples": [ 498 + [ 499 + "Apache-2.0", 500 + "MIT" 501 + ], 502 + [ 503 + "GPL-3.0", 504 + "GPL-3.0-or-later" 505 + ] 506 + ], 507 + "items": { 508 + "$ref": "#/definitions/license-enum" 509 + }, 510 + "minItems": 1, 511 + "type": "array", 512 + "uniqueItems": true 513 + } 514 + ] 515 + }, 516 + "license-enum": { 517 + "$comment": "Use https://github.com/citation-file-format/get-spdx-licenses to update this enum in the future", 518 + "description": "SPDX license list; releaseDate=2021-05-14; source=https://raw.githubusercontent.com/spdx/license-list-data/master/json/licenses.json", 519 + "enum": [ 520 + "0BSD", 521 + "AAL", 522 + "Abstyles", 523 + "Adobe-2006", 524 + "Adobe-Glyph", 525 + "ADSL", 526 + "AFL-1.1", 527 + "AFL-1.2", 528 + "AFL-2.0", 529 + "AFL-2.1", 530 + "AFL-3.0", 531 + "Afmparse", 532 + "AGPL-1.0", 533 + "AGPL-1.0-only", 534 + "AGPL-1.0-or-later", 535 + "AGPL-3.0", 536 + "AGPL-3.0-only", 537 + "AGPL-3.0-or-later", 538 + "Aladdin", 539 + "AMDPLPA", 540 + "AML", 541 + "AMPAS", 542 + "ANTLR-PD", 543 + "ANTLR-PD-fallback", 544 + "Apache-1.0", 545 + "Apache-1.1", 546 + "Apache-2.0", 547 + "APAFML", 548 + "APL-1.0", 549 + "APSL-1.0", 550 + "APSL-1.1", 551 + "APSL-1.2", 552 + "APSL-2.0", 553 + "Artistic-1.0", 554 + "Artistic-1.0-cl8", 555 + "Artistic-1.0-Perl", 556 + "Artistic-2.0", 557 + "Bahyph", 558 + "Barr", 559 + "Beerware", 560 + "BitTorrent-1.0", 561 + "BitTorrent-1.1", 562 + "blessing", 563 + "BlueOak-1.0.0", 564 + "Borceux", 565 + "BSD-1-Clause", 566 + "BSD-2-Clause", 567 + "BSD-2-Clause-FreeBSD", 568 + "BSD-2-Clause-NetBSD", 569 + "BSD-2-Clause-Patent", 570 + "BSD-2-Clause-Views", 571 + "BSD-3-Clause", 572 + "BSD-3-Clause-Attribution", 573 + "BSD-3-Clause-Clear", 574 + "BSD-3-Clause-LBNL", 575 + "BSD-3-Clause-Modification", 576 + "BSD-3-Clause-No-Nuclear-License", 577 + "BSD-3-Clause-No-Nuclear-License-2014", 578 + "BSD-3-Clause-No-Nuclear-Warranty", 579 + "BSD-3-Clause-Open-MPI", 580 + "BSD-4-Clause", 581 + "BSD-4-Clause-Shortened", 582 + "BSD-4-Clause-UC", 583 + "BSD-Protection", 584 + "BSD-Source-Code", 585 + "BSL-1.0", 586 + "BUSL-1.1", 587 + "bzip2-1.0.5", 588 + "bzip2-1.0.6", 589 + "C-UDA-1.0", 590 + "CAL-1.0", 591 + "CAL-1.0-Combined-Work-Exception", 592 + "Caldera", 593 + "CATOSL-1.1", 594 + "CC-BY-1.0", 595 + "CC-BY-2.0", 596 + "CC-BY-2.5", 597 + "CC-BY-3.0", 598 + "CC-BY-3.0-AT", 599 + "CC-BY-3.0-US", 600 + "CC-BY-4.0", 601 + "CC-BY-NC-1.0", 602 + "CC-BY-NC-2.0", 603 + "CC-BY-NC-2.5", 604 + "CC-BY-NC-3.0", 605 + "CC-BY-NC-4.0", 606 + "CC-BY-NC-ND-1.0", 607 + "CC-BY-NC-ND-2.0", 608 + "CC-BY-NC-ND-2.5", 609 + "CC-BY-NC-ND-3.0", 610 + "CC-BY-NC-ND-3.0-IGO", 611 + "CC-BY-NC-ND-4.0", 612 + "CC-BY-NC-SA-1.0", 613 + "CC-BY-NC-SA-2.0", 614 + "CC-BY-NC-SA-2.5", 615 + "CC-BY-NC-SA-3.0", 616 + "CC-BY-NC-SA-4.0", 617 + "CC-BY-ND-1.0", 618 + "CC-BY-ND-2.0", 619 + "CC-BY-ND-2.5", 620 + "CC-BY-ND-3.0", 621 + "CC-BY-ND-4.0", 622 + "CC-BY-SA-1.0", 623 + "CC-BY-SA-2.0", 624 + "CC-BY-SA-2.0-UK", 625 + "CC-BY-SA-2.1-JP", 626 + "CC-BY-SA-2.5", 627 + "CC-BY-SA-3.0", 628 + "CC-BY-SA-3.0-AT", 629 + "CC-BY-SA-4.0", 630 + "CC-PDDC", 631 + "CC0-1.0", 632 + "CDDL-1.0", 633 + "CDDL-1.1", 634 + "CDL-1.0", 635 + "CDLA-Permissive-1.0", 636 + "CDLA-Sharing-1.0", 637 + "CECILL-1.0", 638 + "CECILL-1.1", 639 + "CECILL-2.0", 640 + "CECILL-2.1", 641 + "CECILL-B", 642 + "CECILL-C", 643 + "CERN-OHL-1.1", 644 + "CERN-OHL-1.2", 645 + "CERN-OHL-P-2.0", 646 + "CERN-OHL-S-2.0", 647 + "CERN-OHL-W-2.0", 648 + "ClArtistic", 649 + "CNRI-Jython", 650 + "CNRI-Python", 651 + "CNRI-Python-GPL-Compatible", 652 + "Condor-1.1", 653 + "copyleft-next-0.3.0", 654 + "copyleft-next-0.3.1", 655 + "CPAL-1.0", 656 + "CPL-1.0", 657 + "CPOL-1.02", 658 + "Crossword", 659 + "CrystalStacker", 660 + "CUA-OPL-1.0", 661 + "Cube", 662 + "curl", 663 + "D-FSL-1.0", 664 + "diffmark", 665 + "DOC", 666 + "Dotseqn", 667 + "DRL-1.0", 668 + "DSDP", 669 + "dvipdfm", 670 + "ECL-1.0", 671 + "ECL-2.0", 672 + "eCos-2.0", 673 + "EFL-1.0", 674 + "EFL-2.0", 675 + "eGenix", 676 + "Entessa", 677 + "EPICS", 678 + "EPL-1.0", 679 + "EPL-2.0", 680 + "ErlPL-1.1", 681 + "etalab-2.0", 682 + "EUDatagrid", 683 + "EUPL-1.0", 684 + "EUPL-1.1", 685 + "EUPL-1.2", 686 + "Eurosym", 687 + "Fair", 688 + "Frameworx-1.0", 689 + "FreeBSD-DOC", 690 + "FreeImage", 691 + "FSFAP", 692 + "FSFUL", 693 + "FSFULLR", 694 + "FTL", 695 + "GD", 696 + "GFDL-1.1", 697 + "GFDL-1.1-invariants-only", 698 + "GFDL-1.1-invariants-or-later", 699 + "GFDL-1.1-no-invariants-only", 700 + "GFDL-1.1-no-invariants-or-later", 701 + "GFDL-1.1-only", 702 + "GFDL-1.1-or-later", 703 + "GFDL-1.2", 704 + "GFDL-1.2-invariants-only", 705 + "GFDL-1.2-invariants-or-later", 706 + "GFDL-1.2-no-invariants-only", 707 + "GFDL-1.2-no-invariants-or-later", 708 + "GFDL-1.2-only", 709 + "GFDL-1.2-or-later", 710 + "GFDL-1.3", 711 + "GFDL-1.3-invariants-only", 712 + "GFDL-1.3-invariants-or-later", 713 + "GFDL-1.3-no-invariants-only", 714 + "GFDL-1.3-no-invariants-or-later", 715 + "GFDL-1.3-only", 716 + "GFDL-1.3-or-later", 717 + "Giftware", 718 + "GL2PS", 719 + "Glide", 720 + "Glulxe", 721 + "GLWTPL", 722 + "gnuplot", 723 + "GPL-1.0", 724 + "GPL-1.0-only", 725 + "GPL-1.0-or-later", 726 + "GPL-1.0+", 727 + "GPL-2.0", 728 + "GPL-2.0-only", 729 + "GPL-2.0-or-later", 730 + "GPL-2.0-with-autoconf-exception", 731 + "GPL-2.0-with-bison-exception", 732 + "GPL-2.0-with-classpath-exception", 733 + "GPL-2.0-with-font-exception", 734 + "GPL-2.0-with-GCC-exception", 735 + "GPL-2.0+", 736 + "GPL-3.0", 737 + "GPL-3.0-only", 738 + "GPL-3.0-or-later", 739 + "GPL-3.0-with-autoconf-exception", 740 + "GPL-3.0-with-GCC-exception", 741 + "GPL-3.0+", 742 + "gSOAP-1.3b", 743 + "HaskellReport", 744 + "Hippocratic-2.1", 745 + "HPND", 746 + "HPND-sell-variant", 747 + "HTMLTIDY", 748 + "IBM-pibs", 749 + "ICU", 750 + "IJG", 751 + "ImageMagick", 752 + "iMatix", 753 + "Imlib2", 754 + "Info-ZIP", 755 + "Intel", 756 + "Intel-ACPI", 757 + "Interbase-1.0", 758 + "IPA", 759 + "IPL-1.0", 760 + "ISC", 761 + "JasPer-2.0", 762 + "JPNIC", 763 + "JSON", 764 + "LAL-1.2", 765 + "LAL-1.3", 766 + "Latex2e", 767 + "Leptonica", 768 + "LGPL-2.0", 769 + "LGPL-2.0-only", 770 + "LGPL-2.0-or-later", 771 + "LGPL-2.0+", 772 + "LGPL-2.1", 773 + "LGPL-2.1-only", 774 + "LGPL-2.1-or-later", 775 + "LGPL-2.1+", 776 + "LGPL-3.0", 777 + "LGPL-3.0-only", 778 + "LGPL-3.0-or-later", 779 + "LGPL-3.0+", 780 + "LGPLLR", 781 + "Libpng", 782 + "libpng-2.0", 783 + "libselinux-1.0", 784 + "libtiff", 785 + "LiLiQ-P-1.1", 786 + "LiLiQ-R-1.1", 787 + "LiLiQ-Rplus-1.1", 788 + "Linux-OpenIB", 789 + "LPL-1.0", 790 + "LPL-1.02", 791 + "LPPL-1.0", 792 + "LPPL-1.1", 793 + "LPPL-1.2", 794 + "LPPL-1.3a", 795 + "LPPL-1.3c", 796 + "MakeIndex", 797 + "MirOS", 798 + "MIT", 799 + "MIT-0", 800 + "MIT-advertising", 801 + "MIT-CMU", 802 + "MIT-enna", 803 + "MIT-feh", 804 + "MIT-Modern-Variant", 805 + "MIT-open-group", 806 + "MITNFA", 807 + "Motosoto", 808 + "mpich2", 809 + "MPL-1.0", 810 + "MPL-1.1", 811 + "MPL-2.0", 812 + "MPL-2.0-no-copyleft-exception", 813 + "MS-PL", 814 + "MS-RL", 815 + "MTLL", 816 + "MulanPSL-1.0", 817 + "MulanPSL-2.0", 818 + "Multics", 819 + "Mup", 820 + "NAIST-2003", 821 + "NASA-1.3", 822 + "Naumen", 823 + "NBPL-1.0", 824 + "NCGL-UK-2.0", 825 + "NCSA", 826 + "Net-SNMP", 827 + "NetCDF", 828 + "Newsletr", 829 + "NGPL", 830 + "NIST-PD", 831 + "NIST-PD-fallback", 832 + "NLOD-1.0", 833 + "NLPL", 834 + "Nokia", 835 + "NOSL", 836 + "Noweb", 837 + "NPL-1.0", 838 + "NPL-1.1", 839 + "NPOSL-3.0", 840 + "NRL", 841 + "NTP", 842 + "NTP-0", 843 + "Nunit", 844 + "O-UDA-1.0", 845 + "OCCT-PL", 846 + "OCLC-2.0", 847 + "ODbL-1.0", 848 + "ODC-By-1.0", 849 + "OFL-1.0", 850 + "OFL-1.0-no-RFN", 851 + "OFL-1.0-RFN", 852 + "OFL-1.1", 853 + "OFL-1.1-no-RFN", 854 + "OFL-1.1-RFN", 855 + "OGC-1.0", 856 + "OGDL-Taiwan-1.0", 857 + "OGL-Canada-2.0", 858 + "OGL-UK-1.0", 859 + "OGL-UK-2.0", 860 + "OGL-UK-3.0", 861 + "OGTSL", 862 + "OLDAP-1.1", 863 + "OLDAP-1.2", 864 + "OLDAP-1.3", 865 + "OLDAP-1.4", 866 + "OLDAP-2.0", 867 + "OLDAP-2.0.1", 868 + "OLDAP-2.1", 869 + "OLDAP-2.2", 870 + "OLDAP-2.2.1", 871 + "OLDAP-2.2.2", 872 + "OLDAP-2.3", 873 + "OLDAP-2.4", 874 + "OLDAP-2.5", 875 + "OLDAP-2.6", 876 + "OLDAP-2.7", 877 + "OLDAP-2.8", 878 + "OML", 879 + "OpenSSL", 880 + "OPL-1.0", 881 + "OSET-PL-2.1", 882 + "OSL-1.0", 883 + "OSL-1.1", 884 + "OSL-2.0", 885 + "OSL-2.1", 886 + "OSL-3.0", 887 + "Parity-6.0.0", 888 + "Parity-7.0.0", 889 + "PDDL-1.0", 890 + "PHP-3.0", 891 + "PHP-3.01", 892 + "Plexus", 893 + "PolyForm-Noncommercial-1.0.0", 894 + "PolyForm-Small-Business-1.0.0", 895 + "PostgreSQL", 896 + "PSF-2.0", 897 + "psfrag", 898 + "psutils", 899 + "Python-2.0", 900 + "Qhull", 901 + "QPL-1.0", 902 + "Rdisc", 903 + "RHeCos-1.1", 904 + "RPL-1.1", 905 + "RPL-1.5", 906 + "RPSL-1.0", 907 + "RSA-MD", 908 + "RSCPL", 909 + "Ruby", 910 + "SAX-PD", 911 + "Saxpath", 912 + "SCEA", 913 + "Sendmail", 914 + "Sendmail-8.23", 915 + "SGI-B-1.0", 916 + "SGI-B-1.1", 917 + "SGI-B-2.0", 918 + "SHL-0.5", 919 + "SHL-0.51", 920 + "SimPL-2.0", 921 + "SISSL", 922 + "SISSL-1.2", 923 + "Sleepycat", 924 + "SMLNJ", 925 + "SMPPL", 926 + "SNIA", 927 + "Spencer-86", 928 + "Spencer-94", 929 + "Spencer-99", 930 + "SPL-1.0", 931 + "SSH-OpenSSH", 932 + "SSH-short", 933 + "SSPL-1.0", 934 + "StandardML-NJ", 935 + "SugarCRM-1.1.3", 936 + "SWL", 937 + "TAPR-OHL-1.0", 938 + "TCL", 939 + "TCP-wrappers", 940 + "TMate", 941 + "TORQUE-1.1", 942 + "TOSL", 943 + "TU-Berlin-1.0", 944 + "TU-Berlin-2.0", 945 + "UCL-1.0", 946 + "Unicode-DFS-2015", 947 + "Unicode-DFS-2016", 948 + "Unicode-TOU", 949 + "Unlicense", 950 + "UPL-1.0", 951 + "Vim", 952 + "VOSTROM", 953 + "VSL-1.0", 954 + "W3C", 955 + "W3C-19980720", 956 + "W3C-20150513", 957 + "Watcom-1.0", 958 + "Wsuipa", 959 + "WTFPL", 960 + "wxWindows", 961 + "X11", 962 + "Xerox", 963 + "XFree86-1.1", 964 + "xinetd", 965 + "Xnet", 966 + "xpp", 967 + "XSkat", 968 + "YPL-1.0", 969 + "YPL-1.1", 970 + "Zed", 971 + "Zend-2.0", 972 + "Zimbra-1.3", 973 + "Zimbra-1.4", 974 + "Zlib", 975 + "zlib-acknowledgement", 976 + "ZPL-1.1", 977 + "ZPL-2.0", 978 + "ZPL-2.1" 979 + ], 980 + "type": "string" 981 + }, 982 + "orcid": { 983 + "description": "Identifier for an author, see https://orcid.org.", 984 + "format": "uri", 985 + "pattern": "https://orcid\\.org/[0-9]{4}-[0-9]{4}-[0-9]{4}-[0-9]{3}[0-9X]{1}", 986 + "type": "string" 987 + }, 988 + "person": { 989 + "additionalProperties": false, 990 + "description": "A person.", 991 + "properties": { 992 + "address": { 993 + "$ref": "#/definitions/address", 994 + "description": "The person's address." 995 + }, 996 + "affiliation": { 997 + "description": "The person's affilitation.", 998 + "minLength": 1, 999 + "type": "string" 1000 + }, 1001 + "alias": { 1002 + "$ref": "#/definitions/alias", 1003 + "description": "The person's alias." 1004 + }, 1005 + "city": { 1006 + "$ref": "#/definitions/city", 1007 + "description": "The person's city." 1008 + }, 1009 + "country": { 1010 + "$ref": "#/definitions/country", 1011 + "description": "The person's country." 1012 + }, 1013 + "email": { 1014 + "$ref": "#/definitions/email", 1015 + "description": "The person's email address." 1016 + }, 1017 + "family-names": { 1018 + "description": "The person's family names.", 1019 + "minLength": 1, 1020 + "type": "string" 1021 + }, 1022 + "fax": { 1023 + "$ref": "#/definitions/fax", 1024 + "description": "The person's fax number." 1025 + }, 1026 + "given-names": { 1027 + "description": "The person's given names.", 1028 + "minLength": 1, 1029 + "type": "string" 1030 + }, 1031 + "name-particle": { 1032 + "description": "The person's name particle, e.g., a nobiliary particle or a preposition meaning 'of' or 'from' (for example 'von' in 'Alexander von Humboldt').", 1033 + "examples": [ 1034 + "von" 1035 + ], 1036 + "minLength": 1, 1037 + "type": "string" 1038 + }, 1039 + "name-suffix": { 1040 + "description": "The person's name-suffix, e.g. 'Jr.' for Sammy Davis Jr. or 'III' for Frank Edwin Wright III.", 1041 + "examples": [ 1042 + "Jr.", 1043 + "III" 1044 + ], 1045 + "minLength": 1, 1046 + "type": "string" 1047 + }, 1048 + "orcid": { 1049 + "$ref": "#/definitions/orcid", 1050 + "description": "The person's ORCID." 1051 + }, 1052 + "post-code": { 1053 + "$ref": "#/definitions/post-code", 1054 + "description": "The person's post-code." 1055 + }, 1056 + "region": { 1057 + "$ref": "#/definitions/region", 1058 + "description": "The person's region." 1059 + }, 1060 + "tel": { 1061 + "$ref": "#/definitions/tel", 1062 + "description": "The person's phone number." 1063 + }, 1064 + "website": { 1065 + "$ref": "#/definitions/url", 1066 + "description": "The person's website." 1067 + } 1068 + }, 1069 + "type": "object" 1070 + }, 1071 + "post-code": { 1072 + "anyOf": [ 1073 + { 1074 + "minLength": 1, 1075 + "type": "string" 1076 + }, 1077 + { 1078 + "type": "number" 1079 + } 1080 + ], 1081 + "description": "A post code." 1082 + }, 1083 + "reference": { 1084 + "additionalProperties": false, 1085 + "description": "A reference to a work.", 1086 + "properties": { 1087 + "abbreviation": { 1088 + "description": "The abbreviation of a work.", 1089 + "minLength": 1, 1090 + "type": "string" 1091 + }, 1092 + "abstract": { 1093 + "description": "The abstract of a work.", 1094 + "minLength": 1, 1095 + "type": "string" 1096 + }, 1097 + "authors": { 1098 + "description": "The author(s) of a work.", 1099 + "items": { 1100 + "anyOf": [ 1101 + { 1102 + "$ref": "#/definitions/person" 1103 + }, 1104 + { 1105 + "$ref": "#/definitions/entity" 1106 + } 1107 + ] 1108 + }, 1109 + "minItems": 1, 1110 + "type": "array", 1111 + "uniqueItems": true 1112 + }, 1113 + "collection-doi": { 1114 + "$ref": "#/definitions/doi", 1115 + "description": "The DOI of a collection containing the work." 1116 + }, 1117 + "collection-title": { 1118 + "description": "The title of a collection or proceedings.", 1119 + "minLength": 1, 1120 + "type": "string" 1121 + }, 1122 + "collection-type": { 1123 + "description": "The type of a collection.", 1124 + "minLength": 1, 1125 + "type": "string" 1126 + }, 1127 + "commit": { 1128 + "$ref": "#/definitions/commit" 1129 + }, 1130 + "conference": { 1131 + "$ref": "#/definitions/entity", 1132 + "description": "The conference where the work was presented." 1133 + }, 1134 + "contact": { 1135 + "description": "The contact person, group, company, etc. for a work.", 1136 + "items": { 1137 + "anyOf": [ 1138 + { 1139 + "$ref": "#/definitions/person" 1140 + }, 1141 + { 1142 + "$ref": "#/definitions/entity" 1143 + } 1144 + ] 1145 + }, 1146 + "minItems": 1, 1147 + "type": "array", 1148 + "uniqueItems": true 1149 + }, 1150 + "copyright": { 1151 + "description": "The copyright information pertaining to the work.", 1152 + "minLength": 1, 1153 + "type": "string" 1154 + }, 1155 + "data-type": { 1156 + "description": "The data type of a data set.", 1157 + "minLength": 1, 1158 + "type": "string" 1159 + }, 1160 + "database": { 1161 + "description": "The name of the database where a work was accessed/is stored.", 1162 + "minLength": 1, 1163 + "type": "string" 1164 + }, 1165 + "database-provider": { 1166 + "$ref": "#/definitions/entity", 1167 + "description": "The provider of the database where a work was accessed/is stored." 1168 + }, 1169 + "date-accessed": { 1170 + "$ref": "#/definitions/date", 1171 + "description": "The date the work was accessed." 1172 + }, 1173 + "date-downloaded": { 1174 + "$ref": "#/definitions/date", 1175 + "description": "The date the work has been downloaded." 1176 + }, 1177 + "date-published": { 1178 + "$ref": "#/definitions/date", 1179 + "description": "The date the work has been published." 1180 + }, 1181 + "date-released": { 1182 + "$ref": "#/definitions/date", 1183 + "description": "The date the work has been released." 1184 + }, 1185 + "department": { 1186 + "description": "The department where a work has been produced.", 1187 + "minLength": 1, 1188 + "type": "string" 1189 + }, 1190 + "doi": { 1191 + "$ref": "#/definitions/doi", 1192 + "description": "The DOI of the work." 1193 + }, 1194 + "edition": { 1195 + "description": "The edition of the work.", 1196 + "minLength": 1, 1197 + "type": "string" 1198 + }, 1199 + "editors": { 1200 + "description": "The editor(s) of a work.", 1201 + "items": { 1202 + "anyOf": [ 1203 + { 1204 + "$ref": "#/definitions/person" 1205 + }, 1206 + { 1207 + "$ref": "#/definitions/entity" 1208 + } 1209 + ] 1210 + }, 1211 + "minItems": 1, 1212 + "type": "array", 1213 + "uniqueItems": true 1214 + }, 1215 + "editors-series": { 1216 + "description": "The editor(s) of a series in which a work has been published.", 1217 + "items": { 1218 + "anyOf": [ 1219 + { 1220 + "$ref": "#/definitions/person" 1221 + }, 1222 + { 1223 + "$ref": "#/definitions/entity" 1224 + } 1225 + ] 1226 + }, 1227 + "minItems": 1, 1228 + "type": "array", 1229 + "uniqueItems": true 1230 + }, 1231 + "end": { 1232 + "anyOf": [ 1233 + { 1234 + "type": "integer" 1235 + }, 1236 + { 1237 + "minLength": 1, 1238 + "type": "string" 1239 + } 1240 + ], 1241 + "description": "The end page of the work." 1242 + }, 1243 + "entry": { 1244 + "description": "An entry in the collection that constitutes the work.", 1245 + "minLength": 1, 1246 + "type": "string" 1247 + }, 1248 + "filename": { 1249 + "description": "The name of the electronic file containing the work.", 1250 + "minLength": 1, 1251 + "type": "string" 1252 + }, 1253 + "format": { 1254 + "description": "The format in which a work is represented.", 1255 + "minLength": 1, 1256 + "type": "string" 1257 + }, 1258 + "identifiers": { 1259 + "description": "The identifier(s) of the work.", 1260 + "items": { 1261 + "$ref": "#/definitions/identifier" 1262 + }, 1263 + "minItems": 1, 1264 + "type": "array", 1265 + "uniqueItems": true 1266 + }, 1267 + "institution": { 1268 + "$ref": "#/definitions/entity", 1269 + "description": "The institution where a work has been produced or published." 1270 + }, 1271 + "isbn": { 1272 + "description": "The ISBN of the work.", 1273 + "pattern": "^[0-9\\- ]{10,17}X?$", 1274 + "type": "string" 1275 + }, 1276 + "issn": { 1277 + "description": "The ISSN of the work.", 1278 + "pattern": "^\\d{4}-\\d{3}[\\dxX]$", 1279 + "type": "string" 1280 + }, 1281 + "issue": { 1282 + "anyOf": [ 1283 + { 1284 + "minLength": 1, 1285 + "type": "string" 1286 + }, 1287 + { 1288 + "type": "number" 1289 + } 1290 + ], 1291 + "description": "The issue of a periodical in which a work appeared." 1292 + }, 1293 + "issue-date": { 1294 + "description": "The publication date of the issue of a periodical in which a work appeared.", 1295 + "minLength": 1, 1296 + "type": "string" 1297 + }, 1298 + "issue-title": { 1299 + "description": "The name of the issue of a periodical in which the work appeared.", 1300 + "minLength": 1, 1301 + "type": "string" 1302 + }, 1303 + "journal": { 1304 + "description": "The name of the journal/magazine/newspaper/periodical where the work was published.", 1305 + "minLength": 1, 1306 + "type": "string" 1307 + }, 1308 + "keywords": { 1309 + "description": "Keywords pertaining to the work.", 1310 + "items": { 1311 + "minLength": 1, 1312 + "type": "string" 1313 + }, 1314 + "minItems": 1, 1315 + "type": "array", 1316 + "uniqueItems": true 1317 + }, 1318 + "languages": { 1319 + "description": "The language identifier(s) of the work according to ISO 639 language strings.", 1320 + "items": { 1321 + "maxLength": 3, 1322 + "minLength": 2, 1323 + "pattern": "^[a-z]{2,3}$", 1324 + "type": "string" 1325 + }, 1326 + "minItems": 1, 1327 + "type": "array", 1328 + "uniqueItems": true 1329 + }, 1330 + "license": { 1331 + "$ref": "#/definitions/license" 1332 + }, 1333 + "license-url": { 1334 + "$ref": "#/definitions/url", 1335 + "description": "The URL of the license text under which the work is licensed (only for non-standard licenses not included in the SPDX License List)." 1336 + }, 1337 + "loc-end": { 1338 + "anyOf": [ 1339 + { 1340 + "type": "integer" 1341 + }, 1342 + { 1343 + "minLength": 1, 1344 + "type": "string" 1345 + } 1346 + ], 1347 + "description": "The line of code in the file where the work ends." 1348 + }, 1349 + "loc-start": { 1350 + "anyOf": [ 1351 + { 1352 + "type": "integer" 1353 + }, 1354 + { 1355 + "minLength": 1, 1356 + "type": "string" 1357 + } 1358 + ], 1359 + "description": "The line of code in the file where the work starts." 1360 + }, 1361 + "location": { 1362 + "$ref": "#/definitions/entity", 1363 + "description": "The location of the work." 1364 + }, 1365 + "medium": { 1366 + "description": "The medium of the work.", 1367 + "minLength": 1, 1368 + "type": "string" 1369 + }, 1370 + "month": { 1371 + "anyOf": [ 1372 + { 1373 + "maximum": 12, 1374 + "minimum": 1, 1375 + "type": "integer" 1376 + }, 1377 + { 1378 + "enum": [ 1379 + "1", 1380 + "2", 1381 + "3", 1382 + "4", 1383 + "5", 1384 + "6", 1385 + "7", 1386 + "8", 1387 + "9", 1388 + "10", 1389 + "11", 1390 + "12" 1391 + ], 1392 + "type": "string" 1393 + } 1394 + ], 1395 + "description": "The month in which a work has been published." 1396 + }, 1397 + "nihmsid": { 1398 + "description": "The NIHMSID of a work.", 1399 + "minLength": 1, 1400 + "type": "string" 1401 + }, 1402 + "notes": { 1403 + "description": "Notes pertaining to the work.", 1404 + "minLength": 1, 1405 + "type": "string" 1406 + }, 1407 + "number": { 1408 + "anyOf": [ 1409 + { 1410 + "minLength": 1, 1411 + "type": "string" 1412 + }, 1413 + { 1414 + "type": "number" 1415 + } 1416 + ], 1417 + "description": "The accession number for a work." 1418 + }, 1419 + "number-volumes": { 1420 + "anyOf": [ 1421 + { 1422 + "type": "integer" 1423 + }, 1424 + { 1425 + "minLength": 1, 1426 + "type": "string" 1427 + } 1428 + ], 1429 + "description": "The number of volumes making up the collection in which the work has been published." 1430 + }, 1431 + "pages": { 1432 + "anyOf": [ 1433 + { 1434 + "type": "integer" 1435 + }, 1436 + { 1437 + "minLength": 1, 1438 + "type": "string" 1439 + } 1440 + ], 1441 + "description": "The number of pages of the work." 1442 + }, 1443 + "patent-states": { 1444 + "description": "The states for which a patent is granted.", 1445 + "items": { 1446 + "minLength": 1, 1447 + "type": "string" 1448 + }, 1449 + "minItems": 1, 1450 + "type": "array", 1451 + "uniqueItems": true 1452 + }, 1453 + "pmcid": { 1454 + "description": "The PMCID of a work.", 1455 + "pattern": "^PMC[0-9]{7}$", 1456 + "type": "string" 1457 + }, 1458 + "publisher": { 1459 + "$ref": "#/definitions/entity", 1460 + "description": "The publisher who has published the work." 1461 + }, 1462 + "recipients": { 1463 + "description": "The recipient(s) of a personal communication.", 1464 + "items": { 1465 + "anyOf": [ 1466 + { 1467 + "$ref": "#/definitions/entity" 1468 + }, 1469 + { 1470 + "$ref": "#/definitions/person" 1471 + } 1472 + ] 1473 + }, 1474 + "minItems": 1, 1475 + "type": "array", 1476 + "uniqueItems": true 1477 + }, 1478 + "repository": { 1479 + "$ref": "#/definitions/url", 1480 + "description": "The URL of the work in a repository (when the repository is neither a source code repository nor a build artifact repository)." 1481 + }, 1482 + "repository-artifact": { 1483 + "$ref": "#/definitions/url", 1484 + "description": "The URL of the work in a build artifact/binary repository." 1485 + }, 1486 + "repository-code": { 1487 + "$ref": "#/definitions/url", 1488 + "description": "The URL of the work in a source code repository." 1489 + }, 1490 + "scope": { 1491 + "description": "The scope of the reference, e.g., the section of the work it adheres to.", 1492 + "minLength": 1, 1493 + "type": "string" 1494 + }, 1495 + "section": { 1496 + "anyOf": [ 1497 + { 1498 + "minLength": 1, 1499 + "type": "string" 1500 + }, 1501 + { 1502 + "type": "number" 1503 + } 1504 + ], 1505 + "description": "The section of a work that is referenced." 1506 + }, 1507 + "senders": { 1508 + "description": "The sender(s) of a personal communication.", 1509 + "items": { 1510 + "anyOf": [ 1511 + { 1512 + "$ref": "#/definitions/entity" 1513 + }, 1514 + { 1515 + "$ref": "#/definitions/person" 1516 + } 1517 + ] 1518 + }, 1519 + "minItems": 1, 1520 + "type": "array", 1521 + "uniqueItems": true 1522 + }, 1523 + "start": { 1524 + "anyOf": [ 1525 + { 1526 + "type": "integer" 1527 + }, 1528 + { 1529 + "minLength": 1, 1530 + "type": "string" 1531 + } 1532 + ], 1533 + "description": "The start page of the work." 1534 + }, 1535 + "status": { 1536 + "description": "The publication status of the work.", 1537 + "enum": [ 1538 + "abstract", 1539 + "advance-online", 1540 + "in-preparation", 1541 + "in-press", 1542 + "preprint", 1543 + "submitted" 1544 + ], 1545 + "type": "string" 1546 + }, 1547 + "term": { 1548 + "description": "The term being referenced if the work is a dictionary or encyclopedia.", 1549 + "minLength": 1, 1550 + "type": "string" 1551 + }, 1552 + "thesis-type": { 1553 + "description": "The type of the thesis that is the work.", 1554 + "minLength": 1, 1555 + "type": "string" 1556 + }, 1557 + "title": { 1558 + "description": "The title of the work.", 1559 + "minLength": 1, 1560 + "type": "string" 1561 + }, 1562 + "translators": { 1563 + "description": "The translator(s) of a work.", 1564 + "items": { 1565 + "anyOf": [ 1566 + { 1567 + "$ref": "#/definitions/entity" 1568 + }, 1569 + { 1570 + "$ref": "#/definitions/person" 1571 + } 1572 + ] 1573 + }, 1574 + "minItems": 1, 1575 + "type": "array", 1576 + "uniqueItems": true 1577 + }, 1578 + "type": { 1579 + "description": "The type of the work.", 1580 + "enum": [ 1581 + "art", 1582 + "article", 1583 + "audiovisual", 1584 + "bill", 1585 + "blog", 1586 + "book", 1587 + "catalogue", 1588 + "conference-paper", 1589 + "conference", 1590 + "data", 1591 + "database", 1592 + "dictionary", 1593 + "edited-work", 1594 + "encyclopedia", 1595 + "film-broadcast", 1596 + "generic", 1597 + "government-document", 1598 + "grant", 1599 + "hearing", 1600 + "historical-work", 1601 + "legal-case", 1602 + "legal-rule", 1603 + "magazine-article", 1604 + "manual", 1605 + "map", 1606 + "multimedia", 1607 + "music", 1608 + "newspaper-article", 1609 + "pamphlet", 1610 + "patent", 1611 + "personal-communication", 1612 + "proceedings", 1613 + "report", 1614 + "serial", 1615 + "slides", 1616 + "software-code", 1617 + "software-container", 1618 + "software-executable", 1619 + "software-virtual-machine", 1620 + "software", 1621 + "sound-recording", 1622 + "standard", 1623 + "statute", 1624 + "thesis", 1625 + "unpublished", 1626 + "video", 1627 + "website" 1628 + ], 1629 + "type": "string" 1630 + }, 1631 + "url": { 1632 + "$ref": "#/definitions/url", 1633 + "description": "The URL of the work." 1634 + }, 1635 + "version": { 1636 + "$ref": "#/definitions/version", 1637 + "description": "The version of the work." 1638 + }, 1639 + "volume": { 1640 + "anyOf": [ 1641 + { 1642 + "type": "integer" 1643 + }, 1644 + { 1645 + "minLength": 1, 1646 + "type": "string" 1647 + } 1648 + ], 1649 + "description": "The volume of the periodical in which a work appeared." 1650 + }, 1651 + "volume-title": { 1652 + "description": "The title of the volume in which the work appeared.", 1653 + "minLength": 1, 1654 + "type": "string" 1655 + }, 1656 + "year": { 1657 + "anyOf": [ 1658 + { 1659 + "type": "integer" 1660 + }, 1661 + { 1662 + "minLength": 1, 1663 + "type": "string" 1664 + } 1665 + ], 1666 + "description": "The year in which a work has been published." 1667 + }, 1668 + "year-original": { 1669 + "anyOf": [ 1670 + { 1671 + "type": "integer" 1672 + }, 1673 + { 1674 + "minLength": 1, 1675 + "type": "string" 1676 + } 1677 + ], 1678 + "description": "The year of the original publication." 1679 + } 1680 + }, 1681 + "required": [ 1682 + "authors", 1683 + "title", 1684 + "type" 1685 + ], 1686 + "type": "object" 1687 + }, 1688 + "region": { 1689 + "description": "A region.", 1690 + "minLength": 1, 1691 + "type": "string" 1692 + }, 1693 + "swh-identifier": { 1694 + "$comment": "Software Heritage identifiers are documented here: https://docs.softwareheritage.org/devel/swh-model/persistent-identifiers.html.", 1695 + "description": "The Software Heritage identifier (without further qualifiers such as origin, visit, anchor, path).", 1696 + "examples": [ 1697 + "swh:1:cnt:94a9ed024d3859793618152ea559a168bbcbb5e2", 1698 + "swh:1:dir:d198bc9d7a6bcf6db04f476d29314f157507d505", 1699 + "swh:1:rev:309cf2674ee7a0749978cf8265ab91a60aea0f7d", 1700 + "swh:1:rel:22ece559cc7cc2364edc5e5593d63ae8bd229f9f", 1701 + "swh:1:snp:c7c108084bc0bf3d81436bf980b46e98bd338453" 1702 + ], 1703 + "pattern": "^swh:1:(snp|rel|rev|dir|cnt):[0-9a-fA-F]{40}$", 1704 + "type": "string" 1705 + }, 1706 + "tel": { 1707 + "description": "A phone number.", 1708 + "minLength": 1, 1709 + "type": "string" 1710 + }, 1711 + "url": { 1712 + "format": "uri", 1713 + "pattern": "^(https|http|ftp|sftp)://.+", 1714 + "type": "string" 1715 + }, 1716 + "version": { 1717 + "anyOf": [ 1718 + { 1719 + "minLength": 1, 1720 + "type": "string" 1721 + }, 1722 + { 1723 + "type": "number" 1724 + } 1725 + ] 1726 + } 1727 + }, 1728 + "description": "A file with citation metadata for software or datasets.", 1729 + "properties": { 1730 + "abstract": { 1731 + "description": "A description of the software or dataset.", 1732 + "minLength": 1, 1733 + "type": "string" 1734 + }, 1735 + "authors": { 1736 + "description": "The author(s) of the software or dataset.", 1737 + "items": { 1738 + "anyOf": [ 1739 + { 1740 + "$ref": "#/definitions/person" 1741 + }, 1742 + { 1743 + "$ref": "#/definitions/entity" 1744 + } 1745 + ] 1746 + }, 1747 + "minItems": 1, 1748 + "type": "array", 1749 + "uniqueItems": true 1750 + }, 1751 + "cff-version": { 1752 + "description": "The version of CFF used for providing the citation metadata.", 1753 + "examples": [ 1754 + "1.2.0" 1755 + ], 1756 + "pattern": "^1\\.2\\.0$", 1757 + "type": "string" 1758 + }, 1759 + "commit": { 1760 + "$ref": "#/definitions/commit" 1761 + }, 1762 + "contact": { 1763 + "description": "The contact person, group, company, etc. for the software or dataset.", 1764 + "items": { 1765 + "anyOf": [ 1766 + { 1767 + "$ref": "#/definitions/person" 1768 + }, 1769 + { 1770 + "$ref": "#/definitions/entity" 1771 + } 1772 + ] 1773 + }, 1774 + "minItems": 1, 1775 + "type": "array", 1776 + "uniqueItems": true 1777 + }, 1778 + "date-released": { 1779 + "$ref": "#/definitions/date", 1780 + "description": "The date the work has been released." 1781 + }, 1782 + "doi": { 1783 + "$ref": "#/definitions/doi" 1784 + }, 1785 + "identifiers": { 1786 + "description": "The identifiers of the software or dataset.", 1787 + "items": { 1788 + "$ref": "#/definitions/identifier" 1789 + }, 1790 + "minItems": 1, 1791 + "type": "array", 1792 + "uniqueItems": true 1793 + }, 1794 + "keywords": { 1795 + "description": "Keywords that describe the work.", 1796 + "items": { 1797 + "minLength": 1, 1798 + "type": "string" 1799 + }, 1800 + "minItems": 1, 1801 + "type": "array", 1802 + "uniqueItems": true 1803 + }, 1804 + "license": { 1805 + "$ref": "#/definitions/license" 1806 + }, 1807 + "license-url": { 1808 + "$ref": "#/definitions/url", 1809 + "description": "The URL of the license text under which the software or dataset is licensed (only for non-standard licenses not included in the SPDX License List)." 1810 + }, 1811 + "message": { 1812 + "default": "If you use this software, please cite it using the metadata from this file.", 1813 + "description": "A message to the human reader of the file to let them know what to do with the citation metadata.", 1814 + "examples": [ 1815 + "If you use this software, please cite it using the metadata from this file.", 1816 + "Please cite this software using these metadata.", 1817 + "Please cite this software using the metadata from 'preferred-citation'." 1818 + ], 1819 + "minLength": 1, 1820 + "type": "string" 1821 + }, 1822 + "preferred-citation": { 1823 + "$ref": "#/definitions/reference", 1824 + "description": "A reference to another work that should be cited instead of the software or dataset itself." 1825 + }, 1826 + "references": { 1827 + "description": "Reference(s) to other creative works.", 1828 + "items": { 1829 + "$ref": "#/definitions/reference" 1830 + }, 1831 + "minItems": 1, 1832 + "type": "array", 1833 + "uniqueItems": true 1834 + }, 1835 + "repository": { 1836 + "$ref": "#/definitions/url", 1837 + "description": "The URL of the software or dataset in a repository (when the repository is neither a source code repository nor a build artifact repository).", 1838 + "examples": [ 1839 + "https://edoc.hu-berlin.de/handle/18452/23016", 1840 + "https://ascl.net/2105.013" 1841 + ] 1842 + }, 1843 + "repository-artifact": { 1844 + "$ref": "#/definitions/url", 1845 + "description": "The URL of the software in a build artifact/binary repository." 1846 + }, 1847 + "repository-code": { 1848 + "$ref": "#/definitions/url", 1849 + "description": "The URL of the software or dataset in a source code repository." 1850 + }, 1851 + "title": { 1852 + "description": "The name of the software or dataset.", 1853 + "minLength": 1, 1854 + "type": "string" 1855 + }, 1856 + "type": { 1857 + "default": "software", 1858 + "description": "The type of the work.", 1859 + "enum": [ 1860 + "dataset", 1861 + "software" 1862 + ], 1863 + "type": "string" 1864 + }, 1865 + "url": { 1866 + "$ref": "#/definitions/url", 1867 + "description": "The URL of a landing page/website for the software or dataset." 1868 + }, 1869 + "version": { 1870 + "$ref": "#/definitions/version", 1871 + "description": "The version of the software or dataset." 1872 + } 1873 + }, 1874 + "required": [ 1875 + "authors", 1876 + "cff-version", 1877 + "message", 1878 + "title" 1879 + ], 1880 + "title": "Citation File Format", 1881 + "type": "object" 1882 + }
+97
project/ocaml-cff/vendor/git/citation-file-format/tests/validate_schema_guide.py
··· 1 + import pytest 2 + import os 3 + import json 4 + import jsonschema 5 + from ruamel.yaml import YAML 6 + 7 + 8 + def test(): 9 + 10 + def extract_snippets(): 11 + start = 0 12 + end = len(markdown) 13 + while start < end: 14 + snippet_start = markdown.find("```yaml\n", start, end) 15 + if snippet_start == -1: 16 + break 17 + snippet_end = markdown.find("```\n", snippet_start + 8, end) 18 + text = markdown[snippet_start:snippet_end + 4] 19 + indent_size = 0 20 + while text[8:][indent_size] == " ": 21 + indent_size += 1 22 + unindented = "\n" 23 + for line in text[8:-4].split("\n"): 24 + unindented += line[indent_size:] 25 + unindented += "\n" 26 + snippets.append(dict(start=snippet_start, end=snippet_end + 4, text=unindented)) 27 + start = snippet_end + 4 28 + return snippets 29 + 30 + with open("schema-guide.md", "r") as f: 31 + markdown = f.read() 32 + snippets = list() 33 + snippets = extract_snippets() 34 + 35 + yaml = YAML(typ='safe') 36 + yaml.constructor.yaml_constructors[u'tag:yaml.org,2002:timestamp'] = yaml.constructor.yaml_constructors[u'tag:yaml.org,2002:str'] 37 + schema_path = os.path.join(os.path.dirname(__file__), "..", "schema.json") 38 + with open(schema_path, "r") as sf: 39 + schema_data = json.loads(sf.read()) 40 + validator = jsonschema.Draft7Validator(schema=schema_data, format_checker=jsonschema.FormatChecker()) 41 + for i_snippet, snippet in enumerate(snippets): 42 + if "# incorrect" in snippet["text"]: 43 + continue 44 + instance = yaml.load(snippet["text"]) 45 + passes = False 46 + while not passes: 47 + try: 48 + validator.validate(instance=instance) 49 + passes = True 50 + print("snippet {0}/{1} (chars {2}-{3}): OK".format(i_snippet + 1, len(snippets), snippet["start"], snippet["end"])) 51 + except jsonschema.ValidationError as e: 52 + path = "" if len(e.relative_path) == 0 else "/".join([str(p) for p in e.relative_path]) + "/" 53 + if path == "": 54 + if e.message.startswith("'authors' is a required property"): 55 + instance["authors"] = [] 56 + elif e.message.startswith("'cff-version' is a required property"): 57 + instance["cff-version"] = "1.2.0" 58 + elif e.message.startswith("'message' is a required property"): 59 + instance["message"] = "testmessage" 60 + elif e.message.startswith("'title' is a required property"): 61 + instance["title"] = "testtitle" 62 + else: 63 + raise Exception("undefined behavior: " + e.message) 64 + elif path.startswith("authors"): 65 + if e.message.startswith("[] is too short"): 66 + instance["authors"].append({"name": "testname"}) 67 + else: 68 + raise Exception("undefined behavior: " + e.message) 69 + elif path.startswith("references"): 70 + index = int(path.split("/")[1]) 71 + if e.message.startswith("'authors' is a required property"): 72 + instance["references"][index]["authors"] = [] 73 + elif e.message.startswith("'title' is a required property"): 74 + instance["references"][index]["title"] = "testtitle" 75 + elif e.message.startswith("'type' is a required property"): 76 + instance["references"][index]["type"] = "generic" 77 + elif e.message.startswith("[] is too short"): 78 + instance["references"][index]["authors"].append({"name": "testname"}) 79 + elif path.startswith("references/{0}/conference".format(index)): 80 + if e.message.startswith("'name' is a required property"): 81 + instance["references"][index]["conference"]["name"] = "testname" 82 + else: 83 + raise Exception("undefined behavior: " + e.message) 84 + elif path.startswith("preferred-citation"): 85 + if e.message.startswith("'authors' is a required property"): 86 + instance["preferred-citation"]["authors"] = [] 87 + elif e.message.startswith("'title' is a required property"): 88 + instance["preferred-citation"]["title"] = "testtitle" 89 + elif e.message.startswith("'type' is a required property"): 90 + instance["preferred-citation"]["type"] = "generic" 91 + elif e.message.startswith("[] is too short"): 92 + instance["preferred-citation"]["authors"].append({"name": "testname"}) 93 + else: 94 + raise Exception("undefined behavior: " + e.message) 95 + else: 96 + print("Found a problem with snippet at char position {0}-{1}:\n {2}\n{3}".format(snippet["start"], snippet["end"], snippet["text"], e.message)) 97 + raise e
+40
project/ocaml-cff/vendor/git/citation-file-format/tool-catalogue.md
··· 1 + # Citation File Format Tooling Catalogue 2 + 3 + ## Index by Environment 4 + 5 + * Libraries: 6 + * [`ruby-cff`](#ruby-cff) 7 + 8 + ## Index by Language 9 + 10 + * Ruby: 11 + * [`ruby-cff`](#ruby-cff) 12 + 13 + ## Index by Purpose 14 + 15 + * Conversion: 16 + * [`ruby-cff`](#ruby-cff) 17 + * Creation: 18 + * [`ruby-cff`](#ruby-cff) 19 + * Maintenance: 20 + * [`ruby-cff`](#ruby-cff) 21 + * Validation: 22 + * [`ruby-cff`](#ruby-cff) 23 + 24 + ## Tools 25 + 26 + ### Interfaces 27 + 28 + These tools provide a complete implementation of CFF in the respective languages 29 + such that one can convert, create, maintain and validate CFF files. 30 + 31 + #### `ruby-cff` 32 + 33 + The official 34 + [GitHub repository](https://github.com/citation-file-format/ruby-cff) 35 + of the project provides a 36 + [summary](https://github.com/citation-file-format/ruby-cff/blob/main/CITATION.cff) 37 + about the project's purpose. 38 + 39 + This library is also used by GitHub to parse `CITATION.cff` files in order to 40 + provide a "Cite this repository" option on a project's main page.