0.9.50  2021-07-20  Released-By: PERLANCAR; Urgency: medium

        - No spec changes.

        - Edit Changes entry for 0.9.47. The important incompatible change,
          which is the removal of extras/subschemas, was not mentioned.

        - Remove remaining subschema/extras stuffs, e.g. in the spectest.


0.9.49  2020-02-11  Released-By: PERLANCAR; Urgency: medium

	- In addition to string (filter rule name), element of
	  prefilters/postfilters value can also be a 2-element array:
	  [filter rule name, argument hash] to pass arguments to filter
	  rule generator module [no spectest yet].


0.9.48  2020-02-10  Released-By: PERLANCAR; Urgency: medium

	- Fix prefilters spectest.


0.9.47  2020-02-10  Released-By: PERLANCAR; Urgency: medium; Backward-Incompatible: yes

        - [incompatible change] Remove extras/subschemas, for simplicity. The
          canonicalized form of a schema is now just [$TYPENAME, \%CLAUSE_SET],
          but the old form [$TYPENAME, \%CLAUSE_SET, \%EXTRAS] is still
          supported for now and the \%EXTRAS part must be an empty hashref.

	- [incompatible change] prefilters/postfilters values are now rule
	  names instead of expr.

	- Add some expr tests.


0.9.46  2019-07-19  Released-By: PERLANCAR; Urgency: medium

	- Introduce clauses: examples, invalid_examples.

	- Change formatting for better linkability, linkify clauses and types.

	- Mention some other types (that have been implemented in Data::Sah for
	  a while) but not yet specified: datetime, datenotime, duration,
	  timeofday.


0.9.45  2017-03-09  Released-By: PERLANCAR

	- No spec changes.

	- Move examples to Sah-Examples distribution.


0.9.44  2016-07-28  Released-By: PERLANCAR

	- No spec changes.

	- [Removed] Split Sah::Schema::* into its own dist to avoid having
	  to release this spec dists everytime we tweak the schemas.


0.9.43  2016-07-22  Released-By: PERLANCAR

        - No spec changes.

        - Remove Sah::Schemas::Sah because we are not a Sah-Schemas-*
          distribution.


0.9.42  2016-07-22  Released-By: PERLANCAR

        - No spec changes.

        - Add a couple of tests to test for nested loop variables in
          implementation (e.g. [array => of=>[array => of=>int]]).

        - Some minor refactoring, add missing tags, add untested clause aliases.


0.9.41  2016-06-11  Released-By: PERLANCAR

	- Add hash clause: req_some_keys (and alias req_some).

        - Follow Sah::Schemas convention (schemas for Sah are now put in
          Sah::Schema::sah::*).


0.9.40  2016-05-12  Released-By: PERLANCAR

	- Introduce x.* attribute, like in DefHash.


0.9.39  2015-09-09  Released-By: PERLANCAR

	- No spec changes.

	- Add Sah::SpecTest, a dummy module just so other dists can express
	  depending on share/spectest.


0.9.38  2015-09-03  Released-By: PERLANCAR

	- No spec changes.

	- [dist] Move spec prereqs from RuntimeRequires to
	  DevelopRecommends to reduce deps but still allow indicating spec
	  requirement.


0.9.37  2015-06-11  Released-By: PERLANCAR

        - No spec changes.

        - spectest: Add ID number to type tests, produce canonical  Released-By: sorted keys
          JSON.


0.9.36  2015-05-05  Released-By: PERLANCAR

        - Rename dep_one -> dep_any, req_dep_one -> req_dep_any because those
          are the more apt names.


0.9.35  2015-05-05  Released-By: PERLANCAR

	- No spec changes.

	- Fix spectests for req_dep_one & req_dep_all.


0.9.34   2015-04-30  Released-By: PERLANCAR

         - Add clauses for hash: choose_one_key (choose_one), choose_all_keys
           (choose_all), req_one_key (req_one), dep_one, dep_all, req_dep_one,
           req_dep_all. UPDATE: dep_one has been renamed to dep_any, req_dep_one
           to req_dep_any.

         - Add aliases req_all_keys & req_all for hash clause req_keys.


0.9.33   2015-04-08  Released-By: PERLANCAR

         - No spec changes.

         - Add a test for any.


0.9.32   2015-02-14  Released-By: PERLANCAR; Note: The Day After Friday The 13th

         - No spec changes.

         - Update text which still says *.{human,err_msg}.LANGCODE instead of
           *.{human,err_msg}.alt.lang.LANGCODE.


0.9.31   2014-10-23  Released-By: PERLANCAR

         - Add clause for string: encoding.


0.9.30   2013-11-25  Released-By: SHARYANTO

         - No spec changes. Fix spectest for 're_keys' clause.


0.9.29   2013-11-23  Released-By: SHARYANTO

         - Add spectests for all types and clauses and properties that have not
           been equipped with them. The spectest is now pretty complete and
           covers most of the specification document. Some clause attributes and
           advanced features (like expresssion and function) have not been
           covered though.

         [INCOMPATIBLE CHANGES]

         - Rename obj properties: 'methods' -> 'meths', 'attributes' -> 'attrs'.
           This is to be consistent with design principle 'abbreviate when
           common abbreviation is present and won't introduce ambiguity'.

         [REMOVED FEATURES]

         - Remove hash 'req_keys_re', which doesn't make any sense.


0.9.28   2013-11-21  Released-By: SHARYANTO

         - No spec changes. Rebuild with updated
           Dist::Zilla::Plugin::ShareDir::Tarball (0.9.27 temporarily reverts to
           using ShareDir due to garbled shared-files.tar.gz problem).


0.9.27   2013-11-20  Released-By: SHARYANTO

         [NEW FEATURES]

         - Add clauses for hash: 'req_keys_re', 'forbidden_keys',
           'forbidden_keys_re'.

         [ENHANCEMENTS]

         - Add spectests for: hash's {req,allowed,forbidden}_keys{,_re}.

         - Add tags to tests, so an implementation can more easily skip some
           tests.


0.9.26   2013-02-13  Released-By: SHARYANTO

         - No spec changes. Add FAQ entry on using abbreviations in type/clause
           names.


0.9.25   2013-02-02  Released-By: SHARYANTO

         - No spec changes. Convert spectest format from YAML to JSON due to
           different Perl YAML implementations dumping/loading data differently
           (YAML::Syck loads floats as strings ('1.23'), while YAML::XS causes
           test failures).


0.9.24   2013-01-30  Released-By: SHARYANTO

         - No spec changes. Fixes for spectest.


0.9.23   2013-01-11  Released-By: SHARYANTO

         - No spec changes. Add tests to spectest, including tests for 'clause'
           and 'clset' clauses and for array's 'elems' clause. Fix a couple of
           bugs in spectest.


0.9.22   2012-11-28  Released-By: SHARYANTO

         [NEW FEATURES]

         - Add clause 'clause'.

         [INCOMPATIBLE CHANGES]

         - Rename clause 'cset' to 'clset' to make it less ambiguous (since we
           also use the notation 'cname' [clname], 'cval' [clvar]).

         [BUG FIXES]

         - Fix typos and grammar.


0.9.21   2012-11-27  Released-By: SHARYANTO

         - No spec changes. Forgot to update spectest.


0.9.20   2012-11-27  Released-By: SHARYANTO

         [REMOVED FEATURES]

         - Remove .{min,max}_{ok,nok} attributes because they are too generic
           and only the and/or/not/none cases are needed most of the time. This
           generic attributes make it slightly more complex for compilers. They
           are now replaced by the new .op attribute, which can currently
           contain 'and', 'or', 'not', or 'none'. The old attributes will
           probably be re-added in the future if proven needed, perhaps in the
           form of .op having the value of [1, 3] (equivalent of .min_ok 1 +
           .max_ok 3) or [-1, -3] (equivalent to .min_nok 1 + .max_nok 3).

         - Remove .ok_err_msg attribute to simplify things.

         [NEW FEATURES]

         - Add attribute .op (see above).

         - Add clause 'clause'.


0.9.19   2012-11-20  Released-By: SHARYANTO

         - Introduce shortcut form CLAUSE(LANG) and C.ATTR(LANG) for
           CLAUSE.alt.lang.LANG and C.ATTR.alt.lang.LANG.


0.9.18   2012-11-20  Released-By: SHARYANTO

         - No spec changes. Fix some typos in POD and spectest.


0.9.17   2012-11-13  Released-By: SHARYANTO

         - Add hash's keys.create_default attribute.

         - Add array's elems.create_default attribute.

         - Add more spectests.


0.9.16   2012-10-26  Released-By: SHARYANTO

         - Normalization rule: extras are now always normalized to {} so before
           "int" => ["int", {}] and now => ["int", {}, {}]. (I think it's more
           proper, normalized form doesn't change when extras {} exist, and more
           clearly make the normalized form stand out visually).

         - bool: Add clause 'is_true' (I think it'll be more portable than using
           'is').

         - array and hash no longer assume the Sortable role (actually it was a
           typo, it never was).

         - spectest: Add more tests (str, hash, bool, any, all).


0.9.15   2012-10-25  Released-By: SHARYANTO

         - No spec changes.

         - spectest: Add tests for type 'array' (incomplete).


0.9.14   2012-10-25  Released-By: SHARYANTO

         - No spec changes.

         - spectest: Add tests for type 'float'.

         - build: Move spectest to share/ so it gets installed.


0.9.13   2012-10-25  Released-By: SHARYANTO

         - No spec changes.

         - spectest: reenable "clause|" tests, add {min,max}_{ok,nok}
           and .err_level=warn tests.


0.9.12   2012-10-18  Released-By: SHARYANTO

         [ENHANCEMENTS]

         - Add 'c.COMPILER' attribute namespace to store compiler-specific
           options.

         - float: Add clauses 'is_pos_inf' and 'is_neg_inf'.

         - Add type spectest. Preliminary version, now only available for 'int'.


0.9.11   2012-10-16  Released-By: SHARYANTO

         [ENHANCEMENTS]

         - Add .ok_err_msg to set error message when clause succeeds (existing
           .err_msg is for when clause fails). Succeeding clause is regarded as
           a validation failure under the presence of .max_ok or .min_ok
           attributes.

         - Introduce another error level (.err_level => 'fatal').


0.9.10   2012-10-16  Released-By: SHARYANTO

         [INCOMPATIBLE CHANGES]

         - Simplify syntax for 'if' clause. Argument back to 3-element array
           [COND, THEN, ELSE]. Whether COND/THEN/ELSE is an expression, schema,
           clause set, or simple true/false is determined by its type (str,
           array, str, hash, bool). This improves readability.

         - Replace '.input' attribute with 'prop' and 'check_prop' clauses (and
           possibly others in the future). '.input' does not provide a clean
           switch between types (e.g. to express string which has an even
           length, we used ["str", "div_by.input", ["prop", "len"], "div_by",
           2], but 'div_by' is not a clause for str. Now we simply use: ["str",
           "prop", ["len", ["int", "div_by": 2]]] or ["str", "check_prop", "$_ %
           2 == 0"].


0.9.9    2012-10-05  Released-By: SHARYANTO

         [INCOMPATIBLE CHANGES]

         - Change attribute for 'prefilters' clause, from 'perm' to 'temp' (to
           make it consistent with the new default.temp).

         [NEW FEATURES]

         - Add attribute for 'default' clause: 'temp'.


0.9.8    2012-10-03  Released-By: SHARYANTO

         - No functional changes. Fix examples and misplaced clauses.


0.9.7    2012-10-03  Released-By: SHARYANTO

         [INCOMPATIBLE CHANGES]

         - Rename HasElems' clause: 'each' to 'each_elem' to avoid ambiguity
           with 'each_index'. Also rename 'check_each' to 'check_each_elem'.

         [NEW FEATURES]

         - Add hash clauses: 'check_each_key', 'check_each_value'.


0.9.6    2012-10-03  Released-By: SHARYANTO

         [INCOMPATIBLE CHANGES]

         - Remove hash clause 'allow_extra_keys' and replace it with '.restrict'
           attribute for 'keys' clause.

         [NEW FEATURES]

         - Add property: 'prio'.

         - Add HasElems properties: 'elems', 'indices'.

         - Add hash properties: 'keys', 'values'.

         - Add hash clauses: 're_keys', 'allowed_keys', 'allowed_keys_re'.

         [ENHANCEMENTS]

         - Specification for 'req_keys' (previously forgotten to be written).

         - Reorganize FAQ and add some items.


0.9.5    2012-09-26  Released-By: SHARYANTO

         [INCOMPATIBLE CHANGES]

         - Change merge prefix from "[merge]", "[merge+]", etc to
           "merge.normal.", "merge.add.", etc  Released-By: to be compliant with DefHash


0.9.4    2012-09-21  Released-By: SHARYANTO

         - Rewrite some parts.

         - Specify types 'all', 'any', 'obj', 'date' (moved from Data::Sah).
           Type 'date' still doesn't have clauses specified yet.

         - Specify clauses for 'hash' and 'array' (moved from Data::Sah)

         - Change examples to use JSON instead of Perl notation.

         - Add FAQ item: comparison to JSON schema.

         - Add FAQ item: advice on writing schemas (preliminary).

         [NEW]

         - Add type: 'undef'.

         - Add attribute: 'input'.

         - Add clauses: 'check_each', 'exists', 'check_exists', 'each_index',
           'check_each_index'.

         [INCOMPATIBLE CHANGES]

         - Rename 'vals' attribute to 'is_multi' (a bool) and store the multiple
           values in the clause value itself. This is to avoid having both
           'CLAUSE' and 'CLAUSE.vals'.

         - Rename 'expr' clause attribute to 'is_expr' (a bool). The expression
           is now contained in the original clause value/attribute. This is to
           be consistent with 'is_multi'.

         - Tweak the 'if' clause (change 'then_ok' or 'else_nok' to 'then' and
           'else').

         - Rename clause 'noop' to 'ok' (consistency with min_ok/max_nok/etc).
           Remove clause 'fail' (can be replaced with '!ok').

         - Rename clause 'check' to 'expr' (consistency with 'prop' as well as
           the 'prop' and 'expr' keys in the 'if' clause).

         [REMOVED]

         - HasElems: remove 'num_of' clause (not generic enough, might be split
           to a custom clause distribution later).


0.9.3    2012-09-20  Released-By: SHARYANTO

         [INCOMPATIBLE CHANGES]

         - BaseType: Rename old 'if' clause to 'if_clause' (the new 'if' clause
           is now a generic condition clause which accepts a hash).

         - HasElems: Rename clause 'all_elems' to 'each_elem'.

         [NEW]

         - Introduce 'result_var' attribute.

         - Introduce 'type property'.

         - BaseType: add clauses 'schema_v' & 'base_v'. Also mention 'defhash_v'
           (from DefHash specification).

         - BaseType: add generic condition clause 'if' (this is different from
           the old 'if', which has been renamed to 'if_clause').

         - BaseType: add generic looping clauses 'each' and 'exists'.

         [FIXED]

         - Move 'elems' clause to array (POD mistake).

         [OTHER]

         - Specify behavior when CLAUSE value and CLAUSE.vals both exist.


0.9.2    2012-09-19  Released-By: SHARYANTO

         - Clause set now uses DefHash.

         - '=' is now a shortcut for '.expr' attribute.

         - Add FAQ and overview (moved from Data::Sah's POD).

         [REMOVED]

         - '.val' removed, now use clause value (DefHash).

         [FIXES]

         - Update some examples.


0.9.1    2012-09-13  Released-By: SHARYANTO

         - Move type documentation from Data::Sah.

         - BaseType: remove clauses 'comment' and add clauses 'v' (DefHash);
           remove implementation clauses (SANITY, PREPROCESS, POSTPROCESS).

         - HasElems: rename clause 'elem_deps' to 'if_elems_re', add clause
           'if_elems'.

         - str: rename clause 'is_regex' to 'is_re'.


0.9.0    2012-07-21  Released-By: SHARYANTO

         - First release, split specification from Data-Sah.