---
name: "Kwalify"
section: "3pm"
platform: "linux"
package: "pkwalify"
version: "1.24-1"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/Kwalify"
---

# Kwalify(3pm)

Kwalify schema for data structures

## NAME

Kwalify - Kwalify schema for data structures

## SYNOPSIS

```
  use Kwalify qw(validate);
  validate($schema, $data);
```

Typically used together with YAML or JSON:

```
  use YAML;
  validate(YAML::LoadFile($schema_file), YAML::LoadFile($data_file));
  use JSON;
  validate(decode_json($schema_data), decode_json($data));
```

## DESCRIPTION

Kwalify is a Perl implementation for validating data structures against the Kwalify schema. For a schema definition, see \<https://web.archive.org/web/20190718083758/http://www.kuwata-lab.com/kwalify/ruby/users-guide.01.html\>, but see also below "SCHEMA DEFINITION".

### validate($schema\_data, $data)

Validate *$data* according to Kwalify schema specified in *$schema\_data*. Dies if the validation fails.

**validate** may be exported.

## SCHEMA DEFINITION

The original schema definition document is not very specific about types and behaviour. Here's how **Kwalify.pm** implements things:

- name

  The name of the schema.

- desc

  The description for the rule. It is not used for validation.

- pattern

  A pattern matching the valid values.

  Perl regular expressions are used for patterns. This may or may not be compatible with other Kwalify validators, so restrict to "simple" regular expression constructs to be compatible with other validators.

- enum

  A list of the valid values.

- range

  A hash with the valid value ranges for types other than **seq**, **map**, **bool** and **any**.

  - max

    The maximum inclusive.

  - min

    The minimum inclusive.

  - max-ex

    The maximum exclusive.

  - min-ex

    The minimum exclusive.

- length

  Like **range** but for **str** and **text**.

- required

  A constraint to denote the value is required when **true**. The default is **false**.

- type

  The default **type** if omitted is **str**.

  - str

    Any defined value which is **not** a number. Most probably you will want to use **text** instead of **str**.

  - int

    A possibly signed integer. Note that scientific notation is not supported, and it is also not clear whether it should be supported.

  - float

    A possibly signed floating value with a mandatory decimal point. Note that scientific notation is also not supported here.

  - number

    A possibly signed floating value with an optional decimal point (so either **int** or **float**). Note that scientific notation is also not supported here.

  - text

    Any defined value which is either a **str** or a **number**.

  - bool

    The values **yes**, **true**, and **1** for true values and the values **no**, **false**, and **0** for false values are allowed. The ruby implementation possibly allows more values, but this is not documented.

    Note that this definition is problematic, because for example the string **no** is a true boolean value in Perl. So one should stick to **0** and **1** as data values, and probably define an additional **pattern** or **enum** to ensure this:

    ```
        type: bool
        enum: [0, 1]
    ```

  - date

    A string matching `"/^\d{4}-\d{2}-\d{2}$/"` (i.e. YYYY-MM-DD). Note that no date range checks are done (yet).

  - time

    A string matching `"/^\d{2}:\d{2}:\d{2}$/"` (i.e. HH:MM:SS). Note that no time range checks are done (yet).

  - timestamp

    Not supported --- it is not clear what this is supposed to be.

  - seq

    A sequence (list) of rules.

  - map

    A mapping (hash) of rules.

    The name "**=**" can be used to apply rules to any key.

  - scalar

    Currently the same as **text**, but it's not clear if this is correct. Originally defined as all but **seq** and **map**.

  - any

    Any data type.

- unique

  The value is unique for a **seq** or a **map**.

- assert

  Currently not supported by the Perl implementation.

- classname

  Previously defined what is now **class**, see \<https://web.archive.org/web/20190718083758/http://www.kuwata-lab.com/kwalify/ruby/users-guide.01.html\>.

- class

  Currently not used, as there's no genclass action.

- default

  Currently not used, as there's no genclass action.

## TECHNICAL NOTES

As **Kwalify.pm** is a pure validator and de-coupled from a parser (in fact, it does not need to deal with YAML at all, but just with pure perl data structures), there's no connection to the original validated document. This means that no line numbers are available to the validator. In case of validation errors the validator is only able to show a path-like expression to the data causing the error.

## AUTHOR

Slaven Rezić, \<srezic@cpan.org\>

## COPYRIGHT AND LICENSE

Copyright (C) 2006,2007,2008,2009,2010,2015 by Slaven Rezić

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

## SEE ALSO

pkwalify, [**kwalify**(1)](/kwalify/1.md).

Other non-XML schema languages: \<http://rx.codesimply.com/\>
