View Source Changelog
Changelog
0.13.7 -
- Fixes: (c.f. #195)
- Fixing new compiler warnings (stricter checks, deprecation warnings) of Elixir v1.16/v1.17
- Ensuring map order shown in most output is sorted, esp. when creating
fixed_map/1s (including structs). This ensures output of inspect(my_type) and type error formatting should be identical between OTP <= 25 and OTP 26+
- Fixes: (c.f. #195)
0.13.6 -
- Support for Elixir v1.17.x:
- Fix an oversight in the pre-expander now that there was a slight change to the Elixir AST format. Thank you, @skwerlman! (c.f. #190)
- Fixing a bunch of compile-time warnings. Amongst them, a reordering of split function heads (Thank you, @ulfurinn! c.f. #191)
- Fixing some documentation typos, Thank you, @kianmeng! (c.f. #179)
- Support for Elixir v1.17.x:
0.13.5 -
- Support for Elixir v1.15.x. Thank you so much for your guidance and help, @josevalim! (c.f. #185, #186)
- This required turning off part of TypeCheck's self-usage ('dogfooding'). This change should be temporary and will be re-introduced in a future version (c.f. #187).
- Support for Elixir v1.15.x. Thank you so much for your guidance and help, @josevalim! (c.f. #185, #186)
0.13.4 -
- No code changes, but two small improvements to the documentation:
- Changelog has been split off from the README file.
- A link to Marten's ElixirConf EU 2022 talk about TypeCheck has been added.
- No code changes, but two small improvements to the documentation:
0.13.3 -
- Fixes:
- Ensures that TypeCheck can be used in Erlang-style modules (that do not start with 'Elixir.') (c.f. #174).
- Fixes:
0.13.2 -
- Fixes:
- Fixes issue when unions are used as type arguments in remote types. Than you very much, @dvic! (c.f. #164).
- Fixes:
0.13.1 -
- Fixes:
- Fixes issues with aliases to remote types not being followed. (c.f. #160)
- Fixes:
0.13.0 -
- Additions:
- Support for maps with multiple optional atom keys. Thank you very much, @dvic! (c.f. #165)
- Fixes:
- Fixes 'Enumerable not implemented' crash when passing a struct to a type expecting a fixed map. (c.f. #161)
- Additions:
0.12.4 -
- Fixes:
- Allow syntax
%{String.t() => any()}as shorthand for%{required(String.t()) => any()}. (c.f. #152) - Situations in which the fully qualified name of a type defined in the current module were not picked up (
Example.t()not being found inside specs inExample. even thoughExampledefined a type calledt()). (c.f. #154) - A problem with using types with type guards in other modules. (c.f. #147)
- Allow syntax
- Fixes:
0.12.3 -
- Fixes:
- Compatibility problems with Elixir v1.14. (
Code.Identifier.inspect_as_key, working with the AST of imported functions) Thank you very much, @marcandre! (c.f. #150)
- Compatibility problems with Elixir v1.14. (
- Fixes:
0.12.2 -
- Fixes:
- Compilation error in a new Phoenix 1.16 project. Thank you very much, @assimelha! (c.f. #114)
- Fixes:
0.12.1 -
- Performance:
- Significant reduction on generated code size of runtime type checks. This will speed up compilation roughly ~10-50%.
- Fixes:
- No longer use white ANSI color in exception formatting, ensuring messages of the DefaultFormatter are also visible on white backgrounds (Livebook, anyone? :D)
- Skip OTP app lookup (used to fetch per OTP app compile-time configuration) if we're not compiled inside an OTP app (such as inside a Livebook).
- Improve generator for
Regex.t()to generate only correct regular expressions. Thank you very much, @skwerlman!(c.f. #133)
- Performance:
0.12.0 -
- Additions:
- The default options used are now fetched from the application configuration. This means that you can configure a default for your app as well as for each of your dependencies(!) by adding
config :app_name, :type_check [...]to your configuration file(s). (c.f. #61) TypeCheck.Externalmodule, with functions to work with typespecs in modules outside of your control. Thank you very much, @orsinium! (c.f. #113)fetch_specto build a TypeCheck type from any function that has a@spec.fetch_typeto build a TypeCheck type from any@type.enforce_spec!to wrap a call to any function that has a@specwith a runtime type-check on the input parameters and return value.applyandapply!to wrap a call to any function with the function spec type that you give it.
TypeCheck.Defstruct.defstruct!, a way to combinedefstruct,@enforce_keysand the creation of the struct's type, reducing boilerplate and the possibility of mistakes. (c.f. #118)
- The default options used are now fetched from the application configuration. This means that you can configure a default for your app as well as for each of your dependencies(!) by adding
- Fixes:
- Long-standing issue where Dialyzer would sometimes complain in apps using TypeCheck is resolved. (c.f. #95)
- Creation of the new
maybe_nonempty_listtype will no longer get stuck in an infinite loop on creation. (c.f. #120)
- Additions:
0.11.0 -
- Additions:
- Support for fancier map syntaxes:
%{required(key_type) => value_type}Maps with a single kind of required key-value type.%{optional(key_type) => value_type}Maps with a single kind of optional key-value type.%{:some => a(), :fixed => b(), :keys => c(), optional(atom()) => any()}Maps with any number of fixed keys and a single optional key-value type.- TypeCheck now supports nearly all kinds of map types that see use. Archaic combinations of optional and required are not supported, but also not very useful types in practice.
- Because of this, the inspection of the builtin type
map(key, value)has been changed to look the same as an optional map. This is a minor backwards-incompatible change.
- Desugaring
%{}has changed from 'any map' to 'the empty map' in line with Elixir's Typespecs. This is a minor backwards-incompatible change. - Support for the builtin types
port(),reference()and (based on these)identifier(). - Support for the builtin type
struct(). - Support for the builtin type
timeout(). - Support for the builtin type
nonempty_charlist()andmaybe_improper_listand (based on these)iolist()andiodata(). - Adding types depending on these builtins to the default type overrides. We now support all modules of the full standard library!
TypeCheck.Credo.Check.Readability.Specs: an opt-in alternative Credo check which will check whether all functions have either a@spec!or 'normal'@spec. (Fixes #102).
- Support for fancier map syntaxes:
- Additions:
0.10.8 -
- Fixes:
- Ensures that the
Inspectprotocol is properly implemented for sized bitstring types (c.f. #104). Thank you very much, @trarbr!
- Ensures that the
- Fixes:
0.10.7 -
- Fixes:
- Ensures fixed-maps are checked for superfluous keys (c.f. #96). Thank you very much, @spatrik!
- Fixes:
0.10.6 -
- Fixes:
- Fixes issue where Dialyzer would sometimes complain about the generated return-type checking code if the implementation of the function itself was trivial. (c.f. #85).
- Fixes:
0.10.5 -
- Additions:
- Support for the builtin types of the
Systemmodule. Thank you, @paulswartz!
- Support for the builtin types of the
- Additions:
0.10.4 -
- Fixes:
- Fixes issue where sometimes results of specs returning a struct would remove some or all struct fields. (c.f. #78)
- Related: Ensures that when a
@type!containing a%__MODULE__{}is used before that module'sdefstruct, a clear CompileError is created (c.f. #83).
- Fixes:
0.10.3 -
- Fixes:
- Fixes issue when TypeCheck specs were used inside a defprotocol module or other modules where the normal
def/defpmacros are hidden/overridden.
- Fixes issue when TypeCheck specs were used inside a defprotocol module or other modules where the normal
- Fixes:
0.10.2 -
- Fixes:
- Fixes issue where FixedMaps would accept maps any maps (even those missing the required keys) sometimes. (c.f. #74)
- Fixes:
0.10.1 -
- Fixes:
- Swaps
Murmurout for Erlang's builtin:erlang.phash2/2to generate data for function-types, allowing the removal of the optional dependency on the:murmurlibrary.
- Swaps
- Fixes:
0.10.0 -
- Additions
- Support for function-types (for typechecks as well as property-testing generators):
(-> result_type)(...-> result_type)(param_type, param2_type -> result_type)
- Support for function-types (for typechecks as well as property-testing generators):
- Fixes:
- Wrapping private functions no longer make the function public. (c.f. #64)
- Wrapping macros now works correctly. (also related to #64)
- Using
__MODULE__inside a struct inside a type now expands correctly. (c.f. #66)
- Additions
0.9.0 -
- Support for bitstring type syntax:
<<>>,<<_ :: size>>,<<_ :: _ * unit>>,<<_ :: size, _ :: _ * unit>>(both as types and as generators)
- Support for bitstring type syntax:
0.8.2 -
- Fixed compiler warnings when optional dependency StreamData is not installed.
- Fixed pretty-printing of typedoc of opaque types.
0.8.1 -
- Improved documentation with a page comparing TypeCheck with Elixir's plain typespecs. (Thank you very much, @baldwindavid )
- Addition of missing override for the type
t Range.t/0. (Thank you very much, @baldwindavid )
0.8.0 -
- Fixes prettyprinting of
TypeCheck.Builtin.Range. - Addition of
require TypeCheck.Typetouse TypeCheckso there no longer is a need to call this manually if you want to e.g. useTypeCheck.Type.build/1. - Pretty-printing of types and TypeError output in multiple colors.
- Nicer indentation of errors.
- named types are now printed in abbreviated fashion if they are repeated multiple times in an error message. This makes a nested error message much easier to read, especially for larger specs.
[type]no longer creates afixed_list(type)but instead alist(type)(just as Elixir's own typespecs.)- Support for
[...]and[type, ...]as alias fornonempty_list()andnonempty_list(type)respectively. - Remove support for list literals with multiple elements.
- Improved documentation. Thank you, @0ourobor0s!
- Fixes prettyprinting of
0.7.0 - Addition of the option
enable_runtime_checks. When false, all runtime checks in the given module are completely disabled.- Adding
DateTime.tto the default overrides, as it was still missing.
- Adding
0.6.0 - Addition of
spectest& 'default overrides' Elixir's standard library types:- Adding
TypeCheck.ExUnit, with the functionspectestto test function-specifications.- Possibility to use options
:except,:only,:initial_seed. - Possibility to pass custom options to StreamData.
- Possibility to use options
- Adding
TypeCheck.DefaultOverrideswith many sub-modules containing checked typespecs for the types in Elixir's standard library (75% done).- Ensure that these types are correct also on older Elixir versions (1.9, 1.10, 1.11)
- By default load these 'DefaultOverrides', but have the option to turn this behaviour off in
TypeCheck.Option. - Nice generators for
Enum.t,Collectable.t,String.t. - Support for the builtin types:
pid()nonempty_list(),nonempty_list(type).
- Allow
use TypeCheckin IEx or other non-module contexts, to requireTypeCheckand importTypeCheck.Builtinin the current scope (without importing/using the macros that only work at the module level.) - The introspection function
__type_check__/1is now added to any module that contains ause TypeCheck. - Fixes the
Inspectimplementation of custom structs, by falling back toAny, which is more useful than attempting to use a customized implementation that would try to read the values in the struct and failing because the struct-type containing types in the fields. - Fixes conditional compilation warnings when optional dependency
:stream_datawas not included in your project.
- Adding
0.5.0 - Stability improvements:
- Adding
Typecheck.Optiondebug: true, which will (at compile-time) print the checks that TypeCheck is generating. - Actually autogenerate a
@spec, which did not yet happen before. - When writing
@autogen_typespec false, no typespec is exported for the next@type!/@opaque/@spec!encountered in a module. - Code coverage increased to 85%
- Bugfixes w.r.t. generating typespecs
- Fixes compiler-warnings on unused named types when using a type guard. (c.f. #25)
- Fixes any warnings that were triggered during the test suite before.
- Adding
0.4.0 - Support for
impl(ProtocolName)to accept any type implementing a particular protocol.- Also adds rudimentary support for overriding remote types.
- Bugfix when inspecting
lazy( ...)-types.
0.3.2 - Support for unquote fragments inside types and specs. (c.f. #39)
0.3.1 - Fixed link in the documentation.
0.3.0 - Improve DefaultFormatter output when used with long function- or type-signatures (c.f. #32). Also, bugfix for
Builtin.tuple/1.0.2.3 - Bugfix release: Ensure TypeCheck compiles on Elixir v1.11 (#30), Ensure StreamData truly is an optional dependency (#27).
0.2.2 - Support for literal strings should no longer break in Elixir's builtin typespecs.
0.2.1 - Improved parsing of types that have a type-guard at the root level. (c.f. #24), support for custom generators.
0.2.0 - Improved (and changed) API that works better with the Elixir formatter: Use
@type!/@spec!instead, support named types in specs.0.1.2 - Added missing
keywordtype to TypeCheck.Builtin (#20)0.1.1 - Fixing some documentation typos
0.1.0 - Initial Release