0.914   2022-10-19  Released-By: PERLANCAR; Urgency: medium

        - Remove 'invalid_examples' clause definition, add 'links'.

0.913   2022-09-30  Released-By: PERLANCAR; Urgency: medium

        - [bugfix] Fix escaping mistake in generating type check for
          duration, which resulted in 00:10 being passed as OK when only
          00.10 should've been passed.

        - [doc] Some reorganization and formatting tweaks in Data::Sah's POD.

0.912   2022-08-20  Released-By: PERLANCAR; Urgency: low

        - Note about Module::List::More & Regexp::From::String pp/noncore.

0.911   2021-12-01  Released-By: PERLANCAR; Urgency: medium

	- Support dynamic default value via x.perl.default_value_rules.

0.910   2021-08-01  Released-By: PERLANCAR; Urgency: medium

	- Bump prereq of Sah::SpecTest to 0.9.50 (RT#131729).

	- Add support for cached validator for base schema (does not yet pass
	  error message or details). This is not documented yet.

0.909   2020-07-29  Released-By: PERLANCAR

        - Update to Data::Sah::Normalize 0.051 & Data::Sah::Resolve 0.010.

0.908   2020-05-21  Released-By: PERLANCAR; Urgency: low

	- Note a couple of modules's pp/core status.

        - [doc] Mention Data::Sah::Tiny & Params::Sah.

	- [doc] Update information about Sah::Schema::* namespace, mention
	  Sah::Schemas::* namespace.

0.907   2020-02-12  Released-By: PERLANCAR; Urgency: medium

	- Rename return_type values for clarity: bool -> bool_valid, bool+val ->
	  bool_valid+val, str -> str_errmsg, str+val -> str_errmsg+val, full ->
	  hash_details. (Old names are supported for now, but deprecated and no
	  longer documented).

	- [doc] Mention Params::ValidationCompiler.

	- [doc] Note in Status that postfilters is not yet implemented.

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

	- Adjust to Sah 0.9.49 (elements in prefilters/postfilters can be
	  [name,args] instead of just name).

	- Support filter rules that might fail.

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

	- Implement prefilters.

0.904   2020-02-07  Released-By: PERLANCAR; Urgency: medium

	- [test] Update a test that still used old coerce rule module names.

0.903   2019-11-29  Released-By: PERLANCAR; Urgency: high

        - Merge two releases 0.902 and 0.902.1.

0.902.1 2019-11-28  Released-By: PERLANCAR; Urgency: medium

	- Adjust to Data::Sah::Coerce 0.034+ (new naming of Data::Sah::Coerce::*
	  rule modules). UPDATE 2019-11-29: rename to 0.902.1, cancel release
	  (duplicate version).

0.902   2019-10-24  Released-By: PERLANCAR; Urgency: medium

	- [bugfix] Didn't set value of data in the case of coercion
	  failure, so data incorrectly became the return value of coerce

0.901   2019-08-14  Released-By: PERLANCAR; Urgency: medium

	- [bugfix] Handle cases where we generate code "grep { ... } ..."
	  and data_term contains $_ which clashes with topic variable
	  inside the grep block.

0.900   2019-08-12  Released-By: PERLANCAR; Urgency: medium

        - Avoid generating code that uses smartmatch.

0.899   2019-07-25  Released-By: PERLANCAR; Urgency: medium

	- [bugfix] Update module name

0.898   2019-07-25  Released-By: PERLANCAR; Urgency: medium

        - [experimental] Add basic support for 'if' clause. Currently only
          handles the case where 'cond'=str (expr), 'then'=array (schema), and
          no 'else'. The human text rendering is also very basic.

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

	- Update to Sah 0.9.46 (new clauses examples & invalid_examples).

0.896   2019-07-04  Released-By: PERLANCAR; Urgency: medium

	- Data::Sah::Compiler::Prog: expr_validator_sub(): accept argument
	  'cd' instead of always compile()-ing.

	- [doc] Note about the Sah::SchemaV::* namespace.

	- [doc] Note about the Sah::SchemaR::* namespace.

0.895   2018-12-16  Released-By: PERLANCAR

	- Add type: timeofday.

0.894   2018-12-15  Released-By: PERLANCAR

	- Add types: datenotime & datetime.

0.893   2018-09-11  Released-By: PERLANCAR

	- Allow coerce module to supply information about whether a Perl
	  module is core or pp.

0.892   2018-06-05  Released-By: PERLANCAR

	- No functional changes.

	- [Bugfix][test] Fix test case that depends on local timezone to
	  succeed/fail [RT#125478].

0.891    2018-06-03  Released-By: PERLANCAR

	- Adjust to Data::Sah::Coerce 0.025 (bump metadata version to 3, coerce
          expression now can contain coercion error message as well as coerced

0.890    2018-05-29  Released-By: PERLANCAR

	- No functional changes.

	- Document return_type bool+var & str+val.

0.88    2016-07-10  Released-By: PERLANCAR

        - No functional changes.

        - Replace Log::Any with Log::ger.

0.87    2016-09-14  Released-By: PERLANCAR

        - Revert to using JSON instead of JSON::MaybeXS because JSON-MaybeXS
          specifies RuntimeRequires to XS module Cpanel::JSON::XS and this
          breaks "depakability".

        - Reduce dependencies: 1) split JS compiler/stuffs to its own dist
          Data-Sah-JS, this removes several deps like Data::Clean::JSON,
          File::Temp, IPC::System::Options, and Nodejs::Util; 2) inline
          String::LineNumber & String::Indent to reduce dep; 3) remove
          dependency to Sub::Install; 4) remove dependency to
          Algorithm::Dependency (currently unused & will be replaced with

        - Replace code to check for installed module from using
          Module::Path::More to using Module::Installed::Tiny (works with
          fatpacked/datapacked scripts).

0.86    2016-07-22  Released-By: PERLANCAR

        - [Bugfix] Handle nested loop variable, e.g. in

        - [Bugfix] perl: Avoid duplicate pragma/use statement.

0.85    2016-07-20  Released-By: PERLANCAR

        - Add Sah::Schema::* modules to list of required modules during

0.84    2016-07-20  Released-By: PERLANCAR

        - Split schema resolving and clause merging to Data::Sah::Resolve.

        - Tweak type metadata: add 'constraint' tags to HasElems clauses.

0.83    2016-06-12  Released-By: PERLANCAR

	- Implement hash clause req_some_keys (Sah 0.9.41).

	- Adjust to IPC::System::Options 0.27+ (backtick() renamed to

0.82    2016-06-04  Released-By: PERLANCAR

	- Use IPC::System::Options 0.25's backtick() to properly
	  shell-quote on win32.

0.81    2016-06-03  Released-By: PERLANCAR

	- No functional changes.

	- Fix syntax error in clause declaration (caught as a warning in
	  perl >= 5.23, older perls doesn't spew any warning).

0.80    2016-06-02  Released-By: PERLANCAR

        - perl: Add option 'whitelist_modules'.

0.79    2016-06-01  Released-By: PERLANCAR


        - Introduce 'v' for use when declaring clause in Data::Sah::Type::*,
          bump required version to 2 (see changes below). This is used to force
          Data::Sah type extension distributions to upgrade whenever a
          backward-incompatible change is introduced in the clause

        - [compilation data] Introduce 'v' property and bump it to version 2.
          This is so we can break old client code when a backward-incompatible
          change is introduced into the structure.

        - [clause specification] rename 'arg' to 'schema', remove 'args'.

        - [compilation data] Change the structure of 'modules' from array of
          strings to array of hashes to make it more flexible (can contain more
          information). Remove the use of 'module_statements'. Aside from
          runtime modules (modules required by the generated code), will also
          list modules required during compilation (coercion rule modules
          Data::Sah::Coerce::*, and so on). Runtime modules have their 'phase'
          key set to 'runtime', while compile modules have their 'phase' set to


        - Clause values are now also coerced (using default coerce rules).

        - [clause specification] Introduce 'subschema' property which indicates
          that the clause contains a subschema. The value of this property must
          be a coderef to extract and return a list of subschemas from clause
          value. This coderef is useful when we want to recursively extract all
          subschemas from a schema (see Data::Sah::Util::Subschema).

        - [clause specification] Introduce 'inspect_elem' property which means
          the clause inspects elements of data.

        - [compilation data] New keys: 'cl_value_coerced_from' (str, the name of
          the coerce rule used; undef if no coercion was performed on clause
          value), 'cl_raw_value' (clause value as specified by the schema,
          without any coercion/filtering applied), 'is_inner' (previous release
          uses internal _inner, we just rename it to a public name).


        - Generated code will not declare and set variable '_sahv_dpath' when
          unnecessary, i.e. when schema does not contain subschemas.


        - Add documentation: ParamsValidating.

        [BUG FIXES]

        - Fix a case when compilation data 'outer_cd' was created accidentally.


        - Update to Data::Sah::Coerce 0.011 (coerce_from + dont_coerce_from
          replaced by coerce_rules).

0.78    2016-05-20  Released-By: PERLANCAR

        - [Bugfix] A few bug fixes.

0.77    2016-05-19  Released-By: PERLANCAR


        - perl: date: coerce_to=int(epoch) renamed to float(epoch).


        - Implement coercion rule ordering by priority (Data::Sah::Coerce

        - js: bool: Adjust code generation to new coercion rules. The validation
          rule is now stricter (only JavaScript type 'boolean' is accepted as
          bool type), but some coercion rules from string (e.g. "yes", "no",
          "true", "false", etc, see Data::Sah::Coerce::js::bool::str) and number
          (1 for true, 0 for false) are applied.

0.76    2016-05-18  Released-By: PERLANCAR


        - Modular coercion, so now it's easier to add more coercion rules.
          Coercion rules are now put in Data::Sah::Coerce::$COMPILER::* modules
          and split to another distribution Data-Sah-Coerce. It is possible to
          disable some coercion rules. In the process, a couple of
          improvements/fixes are also made to the existing rules: 1) time zone
          is properly set when coercing date from epoch/iso8601 string to
          DateTime; 2) date/duration does not always have to be converted to
          DateTime/DateTime::Duration during validation, by default ints are
          used to reduce overhead and dependencies, but this can be changed.
          Coercion of clause/attribute value has not been reimplemented though,
          that will follow in the next release.

        - Introduce new return types: bool+val and str+val. These are convenient
          when doing e.g. function argument validation because in addition to
          validation result, the validator will also return the input value with
          default/coercion/filters already applied. The value can then be used
          further after the validation process. Note that for return_type=full,
          the final value is now also returned in the 'value' key.

        - duration type is now made to be Comparable and Sortable.

        - js: Implement duration type.


        - Add compilation data keys: compiler_name, use_dpath (Prog only).

        - Split get_nodejs_path() to Nodejs-Util to be reusable by


        - [ux] Change the notation for data path in error message string from
          '@idx/idx2/...' to the more familiar/suggestive-of-index
          '@[idx][idx2]...'. Note that when return_type=full, the
          errors/warnings are still put in keys of data path with the old format
          (slash-separated) for easier parsing.


        - Update to Sah specification 0.9.40 (allow x.* attributes).

0.75    2016-03-16  Released-By: PERLANCAR

	- No functional changes.

        - Replace JSON with JSON::MaybeXS. UPDATE: Revert back to JSON because
          JSON-MaybeXS specifies RuntimeRequires to XS module Cpanel::JSON::XS.

        - Remove benchmark devscripts (see Benchmark-Scenarios-DataSah now).

0.74    2015-10-18  Released-By: PERLANCAR

	- No functional changes.

	- [dist] Add explicit dep to Data::Dumper even though it's a core
	  module [CT].

0.73    2015-09-26  Released-By: PERLANCAR

	- No functional changes.

	- Skip test when Time::Duration::Parse::AsHash (a runtime
	  recommends) is not available [CT].

0.72    2015-09-25  Released-By: PERLANCAR

	- Accept text parseable by Time::Duration::Parse::AsHash as valid
	  duration value.

0.71    2015-09-25  Released-By: PERLANCAR

	- Allow positive numbers for duration (assumed to be number of

	- [opt] Don't convert to DateTime/DateTime::Duration when there are
	  no constraint clauses.

0.70    2015-09-09  Released-By: PERLANCAR

	- No functional changes.

	- [dist] Depend on (dummy module) Sah::SpecTest, while Sah (spec
	  module) becomes a DevelopRecommends, to express things more

0.69    2015-07-08  Released-By: PERLANCAR

	- Use time_zone=UTC in all DateTime construction [CT].

0.68    2015-07-01  Released-By: PERLANCAR

        - Support Time::Moment & Time::Piece in addition to DateTime (currently
          only when coercing).

0.67    2015-06-18  Released-By: PERLANCAR

	- No functional changes.

        - [Test] Put generated javascript temporary files under a temporary dir
          to avoid cluttering /tmp too much.

0.66    2015-06-11  Released-By: PERLANCAR

	- More tweaks to human text for hash clauses.

0.65    2015-06-11  Released-By: PERLANCAR

        - Tweak/fix human text for hash clauses

0.64    2015-06-10  Released-By: PERLANCAR

	- No functional changes.

	- N'th attempt to fix test failures: don't switch to core_or_pp=1
	  mode when we can't find Scalar::Util::Numeric, just switch the
	  sun module to use Scalar::Util::Numeric::PP.

0.63    2015-06-09  Released-By: PERLANCAR

	- No functional changes.

	- Previous guess about failed tests is incorrect, the correct reason is
	  that Data::Sah perl compiler switches to pp=1 mode when it can't find
	  Scalar::Util::Numeric (which is a 'recommends' prereq, not a
	  'requires'), we now switch to core_or_pp=1 instead.

0.62    2015-06-07  Released-By: PERLANCAR

	- Introduce package variables $PP, $CORE, $CORE_OR_PP, $NO_MODULES as
	  alternatives to environments DATA_SAH_{PP,CORE,CORE_OR_PP,NO_MODULES}
	  and use those for tests, due to reported failures.

	- Preload Test::Builder's prereq so it doesn't fail when testing
	  with lib::filter.

0.61    2015-05-26  Released-By: PERLANCAR

	- perl: Add compile option: no_modules.

0.60    2015-05-26  Released-By: PERLANCAR

	- Handle different capitalization of 'nan' -> 'NaN' in newer perl
	  5.21+ [RT#104682].

0.59    2015-05-22  Released-By: PERLANCAR

	- perl: Add compile option: core_or_pp.

        - perl: Make sure we respect compile option core/pp/core_or_pp, or we
          die during compilation.

0.58    2015-05-22  Released-By: PERLANCAR

	- perl: Add compile option: core (avoid non-core modules); add
	  tests for core & pp.

0.57    2015-05-17  Released-By: PERLANCAR

	- Make DateTime truly optional/recommends (previously it's still a

0.56    2015-05-13  Released-By: PERLANCAR

	- Add perl support for type 'duration'.

0.55    2015-05-06  Released-By: PERLANCAR

	- Add option 'hash_values' to human's compile() and add
          'human_hash_values' to Prog's compile(). This is used to override hash
          argument in sprintfn() during human compilation.

        - Make 'field'/'fields' hash term overridable (e.g. to
	  'argument'/'arguments'), for Rinci's args_rels implementation.

0.54    2015-05-05  Released-By: PERLANCAR

	- Implement hash clause choose_one_key, choose_all_keys, req_one_key,
          dep_any, dep_all, req_dep_any, req_dep_all (Sah 0.9.36).

0.53    2015-04-24  Released-By: PERLANCAR

	- No functional changes.

	- Adjust to Data::Sah::Normalize 0.03 (perl gotcha, if we add a
	  proto ($) then func(@_) will become foo(1), is this DWIM??).

0.52    2015-04-15  Released-By: PERLANCAR

        - No functional changes.

        - [dist] Downgrade DateTime from runtime prereq to runtime recommends
          and test prereq, to make dist slimmer.

0.51    2015-04-14  Released-By: PERLANCAR

        - [Bugfix] Add missing dependency to Scalar::Util::Numeric::PP. Test the
          existence of Scalar::Util::Numeric for the default of 'pp' compile

0.50    2015-04-13  Released-By: PERLANCAR

        - Perl compiler: Add compile option 'pp' to generate validator which
          avoids the use of XS modules (currently, Scalar::Util::Numeric will be
          replaced with Scalar::Util::Numeric::PP). DATA_SAH_PP is also observed
          to set default for this option.

0.49    2015-04-10  Released-By: PERLANCAR

        - [Bugfix] Fix regression: missing 'use experimental "smartmatch"'
          statement in the generated code causing Perl warning to be emitted.

        - Add devscripts: bench-startup, bench-gen_validator-perl.

0.48    2015-04-08  Released-By: PERLANCAR

        - [Bugfix] Avoid Perl's list flattening which sometimes cause wrong
          result when return_type=str (regression test added to Sah spectest

        - [Internal] Change gen_each() to accept indices_expr only but allow
          changing data_term, this is to allow better path reporting in error
          message (e.g. in hash's each_value we now report the key names and not
          the confusing key value).

        - [Documentation] Add manual overview page and the start of developer's
          manual, change some formatting, mention App::SahUtils.

0.47    2015-03-24  Released-By: PERLANCAR

        - No functional changes.

        - [opt] Shave more startup overhead by replacing Data::Dumper with
          Data::Dmp, and producing literal in human compiler from using JSON to
          Data::Dmp (shaved +- 14ms on my computer when generating validator for
          two simple schemas from 54ms to 40ms).

0.46    2015-02-21  Released-By: PERLANCAR

        - No functional changes.


        - [opt] Reduce startup overhead by: 1) switching from Moo & Moo::Role to
          Mo & Role::Tiny; 2) avoid calling _merge_clause_sets() when there is
          only a single clause set (a common case) to avoid loading
          Data::ModeMerge. On my computer, startup overhead for generating perl
          code for schema ["int", min=>1, max=>10] is now reduced from 0.048s to

0.45    2015-02-19  Released-By: PERLANCAR

	- Allow 'no MODULE IMPORT' in addition to just 'no MODULE', add 'no
	  warnings 'void'' to perl validator code.

0.44    2015-02-18  Released-By: PERLANCAR

	- Introduce comment-style 'shell2' for Perinci::Sub::Wrapper use.

0.43    2015-02-18  Released-By: PERLANCAR

	- [Bugfix] Fix pushing+popping of _sahv_dpath [RT#102184].

0.42    2015-01-27  Released-By: PERLANCAR

	- Split (again) Data::Sah::Util::Type to its own dist, to minimize

0.41    2015-01-06  Released-By: PERLANCAR

	- No functional changes.

	- Use Regexp::Stringify.

0.40    2015-01-04  Released-By: PERLANCAR

        - On js (node) error, show output. Also, capture $? and $! before being
          reset (trying to find out the cause of error reported in [RT#101269]).

0.39    2015-01-03  Released-By: PERLANCAR

	- No functional changes.

	- Rebuild (Generate TODO.md).

0.38    2015-01-02  Released-By: PERLANCAR

	- Fix production of regex literal in perl compiler; also, now
	  produces 5.10-compatible regex literal.

0.37    2015-01-02  Released-By: PERLANCAR

	- Incorporate Data::Sah::MoreUtils as Data::Sah::Util::Type.

	- [Incompatible change] Rename Data::Sah::Util::Type ->

0.36    2014-12-27  Released-By: PERLANCAR

        - No functional changes.

        - Replace Module::Path with Module::Path::More.

        - POD fixes/tweaks: add more examples in Synopsis, fix typos/grammar.

0.35    2014-12-19  Released-By: PERLANCAR

	- Change Perl compiler to generate code that use
	  Scalar::Util::Numeric's isneg() & isinf() instead of direct
	  comparison =='inf' or =='-inf' to check for is_{,neg_,pos_}inf
	  clauses, because that might result in failure in some systems
	  (ref: https://github.com/perlancar/perl-Data-Sah/issues/2).

0.34    2014-12-19  Released-By: PERLANCAR

	- No functional changes.

        - Format diagnostics message.

0.33    2014-12-19  Released-By: PERLANCAR

	- No functional changes.

	- Refactor test routine into module Test::Data::Sah.

        - Give better test names and more diagnostics message upon failure, to
          help diagnose GH#2.

0.32    2014-12-10  Released-By: PERLANCAR

	- No functional changes.

	- Use new name of renamed/split module SHARYANTO::String::Util ->
	  String::LineNumber & String::Indent.

0.31     2014-11-07  Released-By: PERLANCAR

         - No functional changes.

         - Wording changes for error messages, the term/noun 'input' is removed
           because Sah is not limited to being used to validate input but also
           output/result. That specific term can be confusing.

0.30     2014-10-23  Released-By: PERLANCAR

         - Support 'encoding' clause for string (specified Sah 0.9.31):
           currently does nothing.

         - Extract normalize_clset & normalize_schema to its own dist/module
           Data::Sah::Normalize. This is to significantly reduce dependencies
           for modules that just want to normalize schemas.

0.29     2014-06-30  Released-By: SHARYANTO

         - No functional changes.

         - Replace Scalar::Util's looks_like_number() with
           Scalar::Util::Numeric's isint, isfloat, etc. This is because in 1.39,
           looks_like_number()'s result is booleanized.

0.28     2014-05-17  Released-By: SHARYANTO

         - No functional changes.

         - Replace File::Slurp with File::Slurp::Tiny.

0.27     2014-05-04  Released-By: SHARYANTO

         - Support string in the form of YYYY-MM-DDThh:mm:ssZ format for date

0.26     2014-04-28  Released-By: SHARYANTO

         - No functional changes.

         - [build] Remove dependency to Language::Expr temporarily because it
           (RG actually) is broken.

         - Remove Data::Sah::Schema::* modules, they have been renamed to
           Sah::Schema::* and put into Sah and other dists.

0.25     2014-04-25  Released-By: SHARYANTO

         - [bugfix] Some bug fixes for date.

         - Add debug note when setting temporary data term & restore orig data

         - Add module: Data::Sah::Util::Type.

0.24     2014-04-25  Released-By: SHARYANTO

         - No functional changes.

         - Forgot to skip t/js-type-date.t when node.js is not available.

0.23     2014-04-25  Released-By: SHARYANTO

         - Add (partial) support for type 'date'. Some human formatting not yet
           handled. You can already do things like specifying minimum/maximum
           date, but since properties are not supported yet you cannot say e.g.
           month must be August.

0.22     2014-01-09  Released-By: SHARYANTO

         - No functional changes. Add test, tweak logging in generated code.

         [BUG FIXES]

         - Prog: data path (dpath) prefix was not shown for error message in
           expression version (err_expr), e.g. for hash clause req_keys.

         - JS: Fix error message for req_keys clause.

0.21     2014-01-03  Released-By: SHARYANTO

         [BUG FIXES]

         - perl: req_keys clause: Avoid clashing of variable '$_' when '$dt'
           happens to contain '$_' also (can happen e.g. with schema like [array
           => of => [hash => req_keys => ["a"]]].

0.20     2013-11-25  Released-By: SHARYANTO


         - Implement hash clause: 're_keys'.

         [BUG FIXES]

         - 'cistr' type: fix matching in perl >= 5.14.0 due to not yet handling
           (?^...:...) regex stringification form.


         - Add Manual::Contributing.

0.19     2013-11-23  Released-By: SHARYANTO


         - Implement types 'undef', 'cistr', 'buf'.

         - Implement clauses: 'ok', 'has'.

         - Implement hash clauses: req_keys (thanks Michal Sedlák),
           allowed_keys, allowed_keys_re, forbidden_keys, forbidden_keys_re.

         - Add modules: Data::Sah::JS, Data::Sah::Human.


         - Adjust to Sah 0.9.29.

         [BUG FIXES]

         - Fix bug in generating human/error message for "between|".

0.18     2013-09-11  Released-By: SHARYANTO

         - Add 'use experimental smartmatch' in generated code so that the
           generated code compiles cleanly on Perl 5.18+ [CT].

0.17     2013-09-09  Released-By: SHARYANTO

         - No functional changes. Add 'use experimental smartmatch' for Perl
           5.18+ [CT].

0.16     2013-08-11  Released-By: SHARYANTO

         - Tweak docs.

         - Handle case when LANGUAGE/LANG is ''.

0.15     2013-03-11  Released-By: SHARYANTO

         - No functional changes. Avoid perl undef warning in human compiler
           (e.g. when schema is [int => default => undef]).

0.14     2013-02-07  Released-By: SHARYANTO

         - This is the first release that includes a working js compiler. Along
           with this release are some fixes and refactorings.

0.13     2013-01-18  Released-By: SHARYANTO


         - Slightly tweak max/re clauses so the human can generate clauses in
           nicer order, e.g. "at least X, at most Y" instead of "at most Y, at
           least X" (since max is alphabetically smaller than min).

         [BUG FIXES]

         - Fallback to en_US if Data::Sah::Lang::$lang cannot be found [CT

         - Alphabetical sorting of clause names used wrong variables [CT

0.12     2013-01-16  Released-By: SHARYANTO

         - No functional changes. Add a human test.

0.11     2013-01-16  Released-By: SHARYANTO

         - No functional changes. Minor fixes/adjustments [CT reports].

0.10     2013-01-11  Released-By: SHARYANTO

         - 0.09 was also broken, sorry.


         - Now follow Sah 0.9.23 spec (previously 0.9.19).

         - Basic human compiler now works, with English and Indonesian
           translation. The Perl compiler is now using error messages produced
           by the human compiler. Error message also now indicates data path,
           e.g. if there is an error in the second element of array data, it
           shows '@1'.

         - Line number when logging generated validator/schema code can be
           omitted by setting environment variable LINENUM=0.


         - Rename compile option 'mark_fallback' to 'mark_missing_translation'
           to make it clearer.


         - Remove min

         [BUG FIXES]

         - Subcompilation now uses all options from parent (except those that
           need to be set/changed by the subcompilation).

         - Various fixes and refactorings.

0.09     2012-11-22  Released-By: SHARYANTO

         - 0.08 was broken, sorry.


         - Add gen_validator() options: accept_ref and source. Unknown options
           are still passed to Perl schema compiler.

         - Add compile() option: skip_clause.

         - perl: Implement hash's keys, keys.restrict, keys.create_default.
           Implement array's elems, elems.create_default.


         - Split Data::Sah::Util{::Role,::TypeX} so each can stay slim.

0.08     2012-11-06  Released-By: SHARYANTO


         - Add compile option: 'comment' (to allow stripping comment in
           generated code).

         - perl: Implement str's {match, is_re}, obj's {can, isa}.

         - Add a way to control logging of generated code via
           $Log_Validator_Code or LOG_SAH_VALIDATOR_CODE.

0.07     2012-11-01  Released-By: SHARYANTO


         - Remove module Data::Sah::Simple (IMO Data::Sah is not large enough to
           warrant a 'simple' variant). Data::Sah now can export
           'normalize_schema' as well as 'gen_validator'.

         - Rename compile option 'validator_return_type' to 'return_type'
           (Huffman encoding).


         - Remove compile(), perl(), human(), js() to make things more
           orthogonal. They are just shortcuts, and I reckon they will not be
           used relatively often.

0.06     2012-10-26  Released-By: SHARYANTO

         - Follow latest Sah spec (0.9.16).

         - perl: Handle more types and clauses: array's 'of', str (incomplete),
           hash (incomplete), bool (incomplete), any, all. Data::Sah can now
           handle compilation of schemas from Perinci-Sub-Wrapper and
           Perinci-Examples! Finally, it's starting to be usable (happy face).

         - Some refactoring (rename modules).

0.05     2012-10-25  Released-By: SHARYANTO

         - Split spec to Sah. To follow spec changes, see Sah's Changes.

         - Many changes following latest Sah spec (0.9.15).

         - Simplify compiler interface a bit: no longer accept multiple input.
           However, result is now a data structure ('$cd') instead of string,
           for more flexibility.

         - Generating Perl validator now works for simple schemas, like "int",
           ["array*", {min_len=>1, max_len=>10}]. There are still many types and
           clauses not yet implemented (currently only "int", "float", and
           "array" types are supported; more will be coming soon).

         - Add module Data::Sah::Simple.

         - Add compile() option: on_unhandled_{clause,attr}.

0.04     2012-07-20  Released-By: SHARYANTO

         - No functional changes. Rebuild because dzil still included files in

0.03     2012-07-20  Released-By: SHARYANTO

         - Mostly spec changes (syntax changes, lots of removed clauses to be
           more orthogonal). Implementation is still grossly incomplete.

         - (spec) New clause 'cset' to contain a clause set inside a clause.
           This provides a more elegant way to nest clauses, with possibly
           complex relationships (combine with {max,min}_{ok,nok} attributes).

         - [INCOMPATIBLE] (spec) Remove {max,min}_{ok,nok} *clauses*. They are
           now purely attributes. To apply to a set of clauses, apply to the
           new 'cset' clause.

         - [INCOMPATIBLE] (spec) Rename 'value' and 'values' attribute to
           'val'/'vals'.  Released-By: Huffman principle

         - [INCOMPATIBLE] (spec) Remove 'CLAUSENAME.*' syntax, it's ugly.

         - [INCOMPATIBLE] (spec) Change 'if' clause syntax: [if, expr, EXPR,
           cset, CSET]. Might probably change again :-)

         - [INCOMPATIBLE] (spec) Change merge prefix syntax from [merge:OP] to
           [mergeOP], e.g. [merge+].  Released-By: Huffman principle

         - [INCOMPATIBLE] (spec) Remove unnecessary 'str' clauses: match_all,
           match_any, not_match, match_none (they can be replaced with the more
           generic clause sttributes 'values' and {min,max}_{ok,nok})

         - [INCOMPATIBLE] (spec) Remove unnecessary 'int' clauses: indiv_by (can
           be replaced with the more generic clause attributes 'values' and

         - [INCOMPATIBLE] (spec) Remove unnecessary 'HasElems' clauses: has_all,
           has_any, has_none (can be replaced with the more generic clause
           attributes 'values' and {min,max}_{ok,nok})

         - [INCOMPATIBLE] (spec) Remove unnecessary 'Comparable' clauses: isnt,
           not_in (can be replaced with the more generic clause attributes
           'values' and {min,max}_{ok,nok})

         - [INCOMPATIBLE] (spec) Remove .revert attribute, use .max_ok instead

         - '.attr' clause is now allowed again.

         - (spec) New attribute: default_lang  Released-By: like in Rinci

         - Remove warning under Perl 5.16 [RT#78491]

0.02     2012-01-27  Released-By: SHARYANTO

         - Mostly spec changes (some major, backward-incompatible).
           Implementation still minimal/incomplete.

         - [INCOMPATIBLE] No more hash form! Now schema is either string or
           array. I've always hated writing the hash form and 99% always used
           the array form. Hash form can be re-added in the future in the
           unlikely event that we need it.

         - [INCOMPATIBLE] Array form now only allows one clause sets. To specify
           multiple clause sets, now there is a new clause named 'csets'. This
           is an application of Huffman encoding principle, as specifying
           multiple clause sets is relatively rare. The third element of array
           now can be used for other purposes, it is now an optional hash to
           store future extra stuffs.

         - [INCOMPATIBLE] Change merge prefixes, from the default provided by
           Data::ModeMerge (!, +, -, ^, et al) to the more verbose ([merge],
           [merge:+], [merge:!], and so on). This is also an application of
           Huffman encoding principle, since merging is relatively rare. The !,
           etc prefixes are going to be reused for other purposes. For example,
           !clause now means setting the .max_ok attribute to 0.

         - [INCOMPATIBLE] Change syntax of attribute, from 'CLAUSE:ATTR' and
           ':ATTR' to 'CLAUSE.ATTR' and '.ATTR'. Using dot is nicer and now
           possible as the first character since we have changed merge prefixes.

         - Introduce shortcuts

         - [INCOMPATIBLE] String shortcuts are cut back. Now only 'foo*' is
           supported, to mean [foo => {req=>1}]. I find that this is the only
           shortcut that is commonly used, the rest not so much. Limiting the
           shortcuts feature allows simplifying the schema for Sah itself (no
           grammar needed, only a single regex needed to validate).

         - [INCOMPATIBLE] Sortable types: rename clause {min,max,between}ex ->

         - Type now can have namespaces too (e.g. MyCompany::order_id)

         - Add new clauses 'name', 'summary', 'description', 'tags'

         - (Re-)add manuals

0.01     2011-11-23  Released-By: SHARYANTO

         - First release, very preliminary, almost nothing is implemented. Old
           incarnation is Data::Schema.

         - [INCOMPATIBLE] Terminology changes from Data::Schema: 'attribute'
           becomes 'clause', to make it less ambiguous.