Cabal

The following metadata fields can be extracted from a cabal file.
These fields are defined in the Cabal specification, currently at version 3.10 and are mapped according to the Codemeta crosswalk for cabal.

Software metadata category SOMEF metadata JSON path CABAL metadata file field
description description[i].result.value synopsis / description (1)
development_status development_status[i].result.value stability
has_package_file has_package_file[i].result.value URL of the filename.cabal file
homepage homepage[i].result.value homepage (2)
issue_tracker issue_tracker[i].result.value bug-reports
license license[i].result.value Regex license (3)
package_id package_id[i].value name (4)
requirements - value requirements[i].result.value (5)
requirements - name requirements[i].result.name library.build-depends name (5.1)
requirements - version requirements[i].result.version library.build-depends version (5.2)
requirements - development type requirements[i].result.development_type "runtime"
version version[i].result.value version (6)

(1)
- Regex: r'description:\s*(.*?)(?=\n\S|\Z)' → group[1]
- Example: description: text description - Result: text description

(2)
- Regex: re.search(r'homepage:\s*(.*)' → group[1]
- Example: homepage: https://github.com/joshuaclayton/unused#readme - Result: https://github.com/joshuaclayton/unused#readme

(3)
- Regex: r'license:\s*(.*)' → group[1]
- Example: license: BSD-3-Clause - Result: BSD-3-Clause

(4)
- Regex: r'name:\s*(.*)' → group[1]
- Example: name: unused - Result: unused

(5), (5.1), (5.2)

  • Regex 1: r'library\s*\n(.*?)(?=\n\S|\Z)' → group[1] --> first look into library
  • Regex 2: r'build-depends:\s*(.*?)(?=\n\s*(?:[A-Za-z0-9_-]+\s*:|if\s|\Z)) ' → group[1] --> build-depends into library content
  • Regex 3: r'^([a-zA-Z0-9-_]+)\s*(.*?)$' --> extract groups for name and version
  • Example:
library
  build-depends:
    Cabal-syntax ^>= 3.17,
    array         >= 0.4.0.1  && < 0.6
  • Result value: Cabal-syntax ^>= 3.17
  • Result name: Cabal-syntax
  • Result version: ^>= 3.17

(6)
- Regex: r'version:\s*(.*)' → group[1]
- Example: version: 0.10.0.0 - Result: 0.10.0.0