All notable changes to MiniJinja are documented here.
- Item or attribute lookup will no longer swallow all errors in Python. #814
- Added
|zipfilter. #818 - Fix
break_on_hyphensfor the|wordwrapfilter. #823 - Prefer error message from
unknown_method_callback. #824 - Ignore
.jinjaand.jinja2as extensions in auto escape. #832
- Fixed incorrect joining of leading undefineds or empty
strings in the
|joinfilter. This was inconsistent with Jinja2 and the filter itself for undefineds in other positions. #794 - Allow negative arguments to
rangefunction and change range toisize. #799 - Allow
isizeas argument type. #799 - MiniJinja now correctly handles
\xescape sequences in strings as well as octals. #805 - Added a new
|chainfilter. #807
- Fixed an issue with the function bounds that caused the next-generation trait resolver to fail. #787
- Re-release of 2.10.0 because of a broken release process.
- Fix incorrect permissions when
--outputis used in the CLI. #772 - Added
mj_err_get_debug_infoto the C-ABI. #775 - Modules now capture their output like they do in Jinja2. This
means that if you do
{% import 'template.j2' as x %}and you then render{{ x }}the output oftemplate.j2is rendered as if it was included. #778 - Improved compatibility with Jinja2 for slicing. Negative steps are now correctly handled. Additionally slicing on bytes now correctly handles steps other than 1. #781
- Do not panic if too large templates (too many lines or too many columns) are loaded. The error reporting will be wrong in those cases but the templates will load. #742
- Fixed a bug that caused unknown method callbacks to not get proper error reporting if they cannot find a method. #743
- Added
merge_mapswhich is a dynamic version of thecontext!merge feature, and fixed enumeration behavior when non-map objects are attempted to be merged. #745 - Added
mj_value_new_bytesto the C-ABI. #749 - Added
mj_value_as_bytesto the C-ABI to borrow from strings or byte values. #750 - Fixed buggy
mj_err_get_detailandmj_err_get_template_name. These did not work correctly. To fix them the return value now needs to be freed. #754 - Fix a compilation issue on 32bit systems when
AtomicU64is not available in minijinja-contrib. #755 - Correctly handle
with contextandwithout contextfor imports. #759 - The
defaultfilter is now also registered asdfor Jinja2 compatibility. #763 - The
defaultfilter now accepts a second argument to enable lax defaulting. #764 - Added a
striptagsfilter to the contrib module. #765 - Enable
pycompatby default for the Python bindings and register the default contrib filters and tests. #767
- Added
SemiStrictundefined mode that is like strict but allows to be checked for truthiness. Additionally an if expression without an else block will always produce a silent undefined object that never errors for compatibility with Jinja2. #687 - Make the trait bounds of
ViaDeserializestricter. Now the type can only be constructed if the type implementsDeserializeOwned. This is not a new requirement for passing the function toadd_functionbut bad code will now error earlier for better error reporting. #689 - Raise MSRV to 1.70.
- The contrib crate now uses a basic xorrand implementation instead
of depending on all of the
randmodule. #696 - Added temps, a way to stash away temporary state during rendering. #697
- Fixed a bug that caused the random functions in the contrib crate to not advance the RNG between calls. #698
- Added
Environment.undeclared_variables_in_templateandEnvironnent.undeclared_variables_in_strto Python binding. #699 - Enable
loop_controlsfor Python in-line with the CLI. #704 - Fixed a panic when comparing plain objects. #705
- Added
Object::custom_cmpto allow objects to influence how they compare against themselves. This also fixes Python objects in the Python binding not to compare correctly. #707 - Fixed a bug where
undeclared_variableswould incorrectly handle variables referenced by macros. #714 - Fixed a deadlock in the Python binding when multiple threads were rendering from the same environment at once. #717
- The Python bindings handle
__bool__correctly now for custom objects in if-conditions and filters. #719 - Fixed a bug where
}}caused a syntax error in expressions with open parentheses, braces or brackets. #723 - Added
State::known_variablesto return a list of known variables andEnvironment::globals. #724 - Fixed an issue with undeclared variables not handling
caller. #725 - Removed unnecessary
FiltersandTeststraits. They remain as hidden aliases toFunction. #726 - Fixed a bug that caused implicit string concatenation to not correctly handle escapes. #728
- Implemented constant folding in the code generator. #731
- Improved error reporting for bad loop recursion calls. #734
- The engine now uses smaller integers to represent columns, line numbers and addresses. This cuts down on the memory usage needed for debug information. #735
- Added
load_from_pathto python. #736 - Added JavaScript bindings. #737
- Removed string interning. #675
loop.nextitemis now a lazy operation. This prevents issues when iterating over one-shot iterators combined with{% break %}and it now ensures that the iterator is not running "one item ahead". #677- Fixed an issue that caused loop aliasing not to be supported for recursive loops. #678
- CLI moved from
serde_ymltoserde_yaml. #684 - Improved undefined error reporting. Undefined values will now in most cases point to exactly where the error happened. #686
- Allow newer notify dependency versions (up to 8.x) for the autoreload crate. #688
- Added
sumfilter. #648 - Added
truncatefilter tominijinja-contrib. #647 - Added
wordcountfilter tominijinja-contrib. #649 - Added
wordwrapfilter tominijinja-contrib. #651 - Some tests and filters now pass borrowed values for performance reasons and a bug was fixed that caused undefined values in strict undefined mode not to work with tests. #657
- Fixed an error reporting issue for some syntax errors. #655
- Removed an
unsafecode block from theKwargstype internally which was probably unsafe. #659 - Fix a regression with latest serde that caused internals to leak out when flattening on value handles is used. #664
- Added
Value::make_object_mapto create projections from object into maps, similar to how it was already possible to create iterators that were projected from objects. #663 - The
|itemsfilter will no longer allocate a list and instead return an iterator. #665 - Fixed a bug that caused
lstrip_blocksto act too eager. #674
minijinja-clinow supports preservation of order in maps. #611- Fixed an issue where CBOR was not correctly deserialized in
minijinja-cli. #611 - Added a
linesfilter to split a string into lines. - Bytes are now better supported in MiniJinja. They can be created from
Value::from_byteswithout having to go via serde, and they are now producing a nicer looking debug output. #616 - Added the missing
stringfilter from Jinja2. #617 - Reversing bytes and convergint them implicitly to strings will now work more consistently. #619
- Added type hints for the Python binding and relaxed maturin constraint. #590
minijinja-clinow allows the template name to be set to an empty string when--templateis used, to allow suppliying a data file. #624- Added the missing
sameasfilter from Jinja2. #625 - Tests can now support one argument without parentheses like in Jinja2
(
1 is sameas 1). #626 - Added error context for strict undefined errors during template rendering. #627
- Syntax errors caused by the lexer now include the correct position of the error. #630
minijinja-clinow has all features enabled by default as documented (that means also shell completion and ini). #633minijinja-clinow does not convert INI files to lowercase anymore. This was an unintended behavior. #633- Moved up MSRV to 1.63.0 due to indexmap. #635
- Added argument splatting support (
*argsfor variable args and**kwargsfor keyword arguments) and fixed a bug where sometimes maps and keyword arguments were created in inverse order. #642
- Updated version of
minijinja-cliwith support for better documentation, config file and environment variable support. #602 minijinja-clinow supports template source passed by parameter for simple cases. #606minijinja-clinow has a--syntax-helpargument that prints out the primer on the syntax. #607minijinja-clinow installs to~/.local/binby default. #608- Made the c-bindings compatible with wasm compilation. #603
String/Cow<str>argument types will no longer implicitly convert keyword arguments to string form. This was an unintended foot gun. #605
- Fixes a regression in
PartialEq/EqinValuecaused by changes in 2.3.0. #584
- Fixes some compiler warnings in Rust 1.81. #575
- Fixes incorrect ordering of maps when the keys of those maps were not in consistent order. #569
- Implemented the missing
groupbyfilter. #570 - The
uniquefilter now is case insensitive by default like in Jinja2 and supports an optional flag to make it case sensitive. It also now lets one check individual attributes instead of values. #571 - Changed sort order of
Ordto avoid accidentally non total order that could cause panics on Rust 1.81. #579 - Added a
Value::is_integermethod to allow a user to tell floats and true integers apart. #580
- Fixes a bug where some enums did not deserialize correctly when
used with
ViaDeserialize. #554 - Implemented
IntoDeserializerforValueand&Value. #555 - Added
filesizeformatto minijinja-contrib. #556 - Added support for the
loop_controlsfeature which adds{% break %}and{% continue %}. #558 - Iterables can now be indexed into. It was already possible previously to slice them. This improves support for Jinja2 compatibility as Jinja2 is more likely to create temporary lists when slicing lists. #565
- Flush filter and test cache when processing extended template. This fixes a bug that caused the wrong filters to be used in some cases. #551
- Added
indentparameter totojsonfilter. #546 - Added
randrange,lipsum,random,cyclerandjoinertominijinja-contrib. #547 - Added the ability to use
&TandArc<T>as parameters to filters and functions ifTis anObject. #548 minijinja-clinow also enables the datetime, timezone and rand features. #549- Aligned the behavior of the
intfilter closer to Jinja2. #549
- minijinja-cli now supports
.inifiles. #532 - Fixed a bug that caused cycle detection to trigger incorrectly when an included template extended from another template. #538
- Bumped the minimum version of
self_cellto 1.0.4. #540 - MiniJinja will now warn if the
serdefeature is disabled. This is in anticipation of removing the serde dependency in the future. #541 - Improved an edge case with
State::resolve. It now can resolve the initial template context in macro calls even if no closure has been created. #542
- Added new methods to pycompat:
str.endswith,str.rfind,str.isalnum,str.isalpha,str.isascii,str.isdigit,str.isnumeric,str.join,str.startswith. #522 - Added the missing tests
boolean,divisibleby,lowerandupper. #592 - minijinja-cli now supports YAML aliases and merge keys. #531
- Implemented sequence (+ some iterator) and string repeating with the
*operator to match Jinja2 behavior. #519 - Added the new
minijinja::pycompatmodule which allows one to register an unknown method callback that provides most built-in Python methods. This makes things such asdict.keyswork. Also adds a new--py-compatflag tominijinja-clithat enables it. This improves the compatibility with Python based templates. #521 - Added a new
|splitfilter that works like the.splitmethod in Python. #517
- Fixed an issue that caused custom delimiters to not work in the Python binding. #506
This is a major update to MiniJinja that changes a lot of core internals and cleans up some APIs. In particular it resolves some limitations in the engine in relation to working with dynamic objects, unlocks potentials for future performance improvements and enhancements.
It's very likely that you will need to do changes to your code when upgrading, particular when implementing dynamic objects. In short:
StructObjectandSeqObjectare gone. They have been replaced by improved APIs directly onObject. Please refer to the updated documentation to see how these objects behave now. For the most part code should become quite a bit clearer during the upgrade.ObjectKindhas been replaced byObjectRepr. Rather than holding a reference to aStructObjectorSeqObjectthis now is a simple enum that just indicates how that object serializes, renders and behaves.Objectno longer usesfmt::Displayfor rendering. Instead the newObject::rendermethod is used which has a default implementation.- The
Objecttrait has been completely transformed and the new type-erased typeDynObjecthas been added to work with unknown objects. This trait has an improved user experience and more flexibility. It's now possible to implement any non-primitive value type including maps with non string keys which was previously not possible. ValueKindis now non exhaustive and got a log of new value types. This resolves various issues in particular in relationship with iterators. As a result of this functions will no longer accidentally serialize into empty objects for example.Value::from_iteratorhas been replaced by the newValue::make_iterable,Value::make_object_iterableandValue::make_one_shot_iterator. The direct replacement isValue::make_one_shot_iteratorbut for most uses it's strongly recommended to use one of the other APIs instead. This results in a much improved user experience as it's possible to iterate over such values more than once.- The
Syntaxtype has been replaced by theSyntaxConfigtype. It uses a builder pattern to reconfigure the delimiters.
For upgrade instructions read the UPDATING guide.
Other Changes:
- Added a new
Environment::templatesmethod that iterates over loaded templates. #471 - Reverse iteration and slicing now return iterables instead of real sequences.
- The engine no longer reports iterable as sequences.
- The value iterator returned by
Value::try_iternow holds a reference to theValueinternally via reference counting. DynObjectnow replacesArc<Object>.- The debug printing of some objects was simplified.
- Added the
iterabletest. #475 - The parser no longer panics when using dotted assignments in unexpected places. #479
- The CLI now enables unicode support by default.
Value::from_serializableis nowValue::from_serialize.- Ranges are now iterables and no longer sequences and their maximum number of iterations was raised to 100000. #493
Value::fromis now implemented forErroras public API to create invalid values. Previously this behavior was hidden internally in the serde support. #495UndefinedBehavior::Strictnow acts more delayed. This means that nowvalue.key is definedwill no longer fail.- Added support for line statements and comments. #503
- The CLI now accepts
--syntaxto reconfigure syntax flags such as delimiters. #504
- Fixed an issue with the function bounds that caused the next-generation trait resolver to fail. #790
- Fixed an issue where
lstrip_blocksunintentionally also applied to variable expression blocks. #502
- Added support for implicit string concatenation for Jinja2 compatibility. #489
- Added support for sequence concatenation with the plus operator for Jinja2 compatibility. #491
- Deprecated
Value::from_iteratorand introduced replacementValue::make_one_shot_iteratorAPI which also exists in 2.x. #487
- Fixed an endless loop in
undeclared_variables. #486
- Added support for
Option<Into<Value>>as return value from functions. #452 - Deprecated
Value::from_serializablefor the improved replacement methodValue::from_serialize. #482
- Tolerate underscores in number literals. #443
- Added support for
trim_blocksandlstrip_blocksfor Jinja2 compatibility. #447 - Changed API of
unstable_machinery. Thetokenizefunction got an extra argument for theWhitespaceConfig. It's however recommended to use the newTokenizerstruct instead.parse_exprwas added, theparsefunction now takes aSyntaxConfigandWhitespaceConfig. #447
- Resolved a compiler warning for Rust 1.77. #440
- Fixed an incorrect error case in
call_method. NowUnknownMethodis returned instead ofInvalidOperationcorrectly. #439 - Added
Environment::set_unknown_method_callbackwhich allows a user to intercept method calls on primitives. The motivation here is that this can be used to implement python like methods to improve the compatibility with Jinja2 Python templates. #441
- Fixed a bug with broken closure handling when working with nested
{% macro %}or{% call %}blocks. #435
minijinja-clinow supports an-oor--outputparameter to write into a target file. #405minijinja-clinow accepts the--safe-pathparameter to disallow includes or extends from paths not explicitly allowlisted. #432- Added support for
Error::display_debug_infowhich displays just the debug info, same way as alternative display on the error does. #420 - Added the
namespace()function from Jinja2 and the ability to assign to it via{% set %}. #422 minijinja-autoreloadnow supportson_should_reload_callbackwhich lets one register a callback to be called just before an auto reload should be performed. #424- Added support for
Value::from_iterator,IteratorObjectandObjectKind::Iterator. #426 - Added support for
0b/0o/0xprefixed integer literals for binary, octal and hexadecimal notation. #433
- The
urlencodefilter now correctly skips over none and undefined. #394 - The
dictfunction now supports merging in of extra arguments. #395 - Added support for primitive datetimes in the contrib module. #398
- Added
Environment::compile_expression_ownedto allow compiled expressions to be held without requiring a reference. #383 - Added
minijinja-embedcrate which provides a simple way to embed templates directly in the binary. #392
- Added
intandfloatfilters. #372 - Added
integerandfloattests. #373 - Fixed an issue that caused the CLI not to run when the
replfeature was disabled. #374 - Added
-n/--no-newlineoption to CLI. #375
- Fixed a memory leak involving macros. Previously using macros was leaking memory due to an undetected cycle. #359
- The
debugfunction in templates can now also be used to print out the debug output of a variable. #356 - Added a new
stackerfeature which allows raising of the recursion limits. It enables monitoring of the call stack via stacker and automatically acquires additional memory when the call stack runs out of space. #354
- Large integer literals in templates are now correctly handled. #353
- Relax the trait bounds of
Value::downcast_object_ref/Object::downcast_ref/Object::isand added support for downcasting of types that were directly created withValue::from_seq_objectandValue::from_struct_object. #349 - Overflowing additions on very large integers now fails rather than silently wrapping around. #350
- Fixed a few overflow panics: dividing integers with an overflow and
- Exposed missing new functionality for the Python binding. #339
- Added support for
keep_trailing_newlineswhich allows you to disable the automatic trimming of trailing newlines. #334 - Added
minijinja-cliwhich lets you render and debug templates from the command line. #331 - Macros called with the wrong state will no longer panic. #330
- Debug output of
Value::UNDEFINEDandValue::from(())is nowundefinedandnonerather thanUndefinedandNone. This was an accidental inconsistency. - Fixed a potential panic in debug error printing.
- Added
Environment::set_path_join_callbackandState::get_templateto support path joining. This is for greater compatibility with Jinja2 where path joining was overridable. With this you can configure the engine so that paths used byincludeorextendscan be relative to the current template. #328 - The default auto-escape detection now accepts
.html.j2as alias for.htmlas well as for all other choices. In general.j2as an extension is now generally supported.
- Fixed iso datetime formatting not handling negative offsets correctly. #327
- Re-report
Valuedirectly from the crate root for convenience. - It's now possible to
deserializefrom aValue. Additionally theViaDeserialize<T>argument type was added to support value conversions via serde as argument type. #325
- Added the ability to merge multiple values with the
context!macro. (#317) Option<T>now acceptsnonein filters. Previously only undefined values were accepted. This bugfix might have a minor impact on code that relied in this behavior. (#320)- Fix a compilation error for
minijinja-contribif thetimezonefeature is not enabled.
- Added the
args!macro which can be used to create an argument slice on the stack. (#311) - Improved error reporting for missing keyword arguments.
- Added
chronosupport to the time filters in theminijinja-contribcrate.
- Republished
1.0.2with fixed docs.
- Added
TryFromandArgTypeforArc<str>. - Added
datetimeformat,dateformat,timeformatandnow()to the contrib crate. (#309)
- Fixed a bug that caused
{% raw %}blocks to accidentally not skip the surrounding tags, causing{% raw %}and{% endraw %}to show up in output. (#307)
-
Support unicode sorting for filters when the
unicodefeature is enabled. This also fixes confusing behavior when mixed types were sorted. (#299) -
Added
json5as file extension for JSON formatter. -
The autoreload crate now supports fast reloading by just clearing the already templates. This is enabled via
set_fast_reloadon theNotifier.
Note: This also includes all the changes in the different 1.0.0 alphas.
1.0 includes a lot of changes that are breaking. However they should with some minor exceptions be rather trivial changes.
-
Environment::source,Environment::set_sourceand theSourcetype together with thesourcefeature were removed. The replacement is the newloaderfeature which adds theadd_template_ownedandset_loaderAPIs. The functionality previously provided bySource::from_pathis now available viapath_loader.Old:
let mut source = Source::with_loader(|name| ...); source.add_template("foo", "...").unwrap(); let mut env = Environment::new(); env.set_source(source);
New:
let mut env = Environment::new(); env.set_loader(|name| ...); env.add_template_owned("foo", "...").unwrap();
Old:
let mut env = Environment::new(); env.set_source(Source::from_path("templates"));
New:
let mut env = Environment::new(); env.set_loader(path_loader("templates"));
-
Template::render_blockandTemplate::render_block_to_writewere replaced with APIs of the same name on theStatereturned byTemplate::eval_to_stateorTemplate::render_and_return_state:Old:
let rv = tmpl.render_block("name", ctx)?;
New:
let rv = tmpl.eval_to_state(ctx)?.render_block("name")?;
-
Kwargs::from_argswas removed as API as it's no longer necessary since thefrom_argsfunction now provides the same functionality:Before:
// just split let (args, kwargs) = Kwargs::from_args(values); // split and parse let (args, kwargs) = Kwargs::from_args(values); let (a, b): (i32, i32) = from_args(args)?;
After:
// just split let (args, kwargs): (&[Value], Kwargs) = from_args(values)?; // split and parse let (a, b, kwargs): (i32, i32, Kwargs) = from_args(values)?;
-
The
testutilsfeature andtestutilsmodule were removed. Instead you can now directly create an emptyStateand use the methods provided to invoke filters.Before:
let env = Environment::new(); let rv = apply_filter(&env, "upper", &["hello world".into()]).unwrap();
After:
let env = Environment::new(); let rv = env.empty_state().apply_filter("upper", &["hello world".into()]).unwrap();
Before:
let env = Environment::new(); let rv = perform_test(&env, "even", &[42.into()]).unwrap();
After:
let env = Environment::new(); let rv = env.empty_state().perform_test("even", &[42.into()]).unwrap();
Before:
let env = Environment::new(); let rv = format(&env, 42.into()).unwrap();
After:
let env = Environment::new(); let rv = env.empty_state().format(42.into()).unwrap();
-
internand some APIs that useArc<String>now useArc<str>. This means that for instanceStructObject::fieldsreturnsArc<str>instead ofArc<String>. All the type conversions that previously acceptedArc<String>now only supportArc<str>. -
State::current_callwas removed without replacement. This information was unreliably maintained in the engine and caused issues with recursive calls. If you have a need for this API please reach out on the issue tracker. -
Output::is_discardingwas removed without replacement. This is an implementation detail and was unintentionally exposed. You should not write code that depends on the internal state of theOutput.
-
Valuenow implementsOrd. This also improves the ability of the engine to sort more complex values in filters. (#295) -
Arc<String>was replaced withArc<str>in some of the public APIs where this shined through. Support for more complex key types in maps was added. You can now have tuple keys for instance. (#297)
-
Removed
charas a value type. Characters are now represented as strings instead. This solves a bunch of Jinja2 incompatibilities that resulted by indexing into strings. (#292) -
Marked
ErrorKindas#[non_exhaustive]. -
Correctly handle coercing of characters and strings.
"w" == "w"[0]is now evaluating totrueas one would expect.
-
The
includeblock now supportswith contextandwithout contextmodifiers but they are ignored. This is mostly helpful to render some Jinja2 templates that depend on this functionality. (#288) -
Added tests
true,false,filter,testand filterspprintandunique. (#287) -
Added support for indexing into strings. (#149)
-
Added
Error::detailwhich returns the detail help string. (#289) -
Added
Error::template_sourceandError::rangeto better support rendering of errors outside of the built-in debug printing. (#286)
-
Removed
testutilsfeature. New replacement APIs are directly available on theState. -
Added
Template::render_and_return_stateto render a template and return the resultingStateto permit introspection.Template::render_to_writenow also returns theState. -
Added
State::fuel_levelsto introspect fuel consumption when the fuel feature is in use. -
Removed
Sourceand thesourcefeature. The replacement is the newloaderfeature and the functionality of the source is moved directly into theEnvironment. This also addsEnvironment::clear_templatesto unload all already loaded templates. (#275) -
Added
Environment::template_from_strandEnvironment::template_from_named_strto compile templates for temporary use. (#274) -
Removed
Kwargs::from_argsas this can now be expressed with justfrom_args. (#273) -
Outputno longer reveals if it's discarding in the public API. -
Added
Value::call,Value::call_methodandTemplate::new_state. The combination of these APIs makes it possible to call values which was previously not possible. (#272) -
Added
Template::eval_to_state. This replaces the functionality of the previousTemplate::render_blockwhich is now available viaState. It also adds support for accessing globals and macros from a template via theState. (#271) -
Removed support for
State::current_call. This property wasn't too useful and unreliable. Supporting it properly for nested invocations would require calls to take a mutable state or use interior mutability which did not seem reasonable for this. (#269)
-
Updated
self_cellandpercent-encodingdependencies. (#264) -
Added
Template::render_blockandTemplate::render_block_to_writewhich allows rendering a single block in isolation. (#262)
- Hide accidentally exposed
Syntax::compilemethod. - Added
undeclared_variablesmethods toTemplateandExpression. (#250)
- Fixed an issue with autoreload not working properly on windows. (#249)
- Added
Value::is_number. (#240) TryFromforValuenow converts integers tof32andf64.- Added the new
custom_syntaxfeature which allows custom delimiters to be configured. (#245) - Added
Kwargsabstraction to easier handle keyword arguments. - Fixed an issue that
Option<T>was incorrectly picking upnonefor undefined values. - The
sortfilter now acceptsreverse,attributeandcase_sensitiveby keyword argument and sorts case insensitive by default. - The
dictsortfilter now supports reversing, by value sorting, and is sorting case insensitive by default.
- The
inoperator now does not fail if the value is undefined and the undefined behavior is not strict. (#235) - The Python binding now supports finalizers. (#238)
- Changed the closure behavior of macros to match the one of Jinja2. (#233)
Value::from_serializablewill no longer panic on invalid values. Instead the error is deferred to runtime which makes working with objects possible that are only partially valid for the runtime environment. (#234)
- Added
testutilsmodule. (#221) - Make it more obvious that serde flatten sometimes does not work. (#223)
- Added configurable "undefined" value behavior. (#227)
- Make
render!()reuse the hidden environment.
- Resolve bad closure being generated for
doblocks. (#219) - Add support for float number values in scientific notation. (#220)
- Small performance improvements for when
preserve_orderis used by passing known capacities to the constructor. - Minor performance improvements to the VM by giving the stack an initial capacity.
- Change the internal representation of spans to use
u32rather thanusizefor line and column offsets as a small speed improvement during compilation. - Performance improvements for the key interning.
- Disabled
key_interningby default. - Renamed features
multi-templatetomulti_templateandadjacent-loop-itemstoadjacent_loop_items. The old feature names will hang around until 1.x as legacy aliases.
- Restore compilation on 32bit targets. (#207)
- Added the Jinja2 tests
==,!=,<,<=,>,>=andinfor the use withselectandreject. (#205) - String rendering now uses fewer reallocations by setting an initial capacity based on the complexity of the template. (#206)
- Fixed Python bindings not allowing to access dict keys prefixed with an underscore. (#197)
- Added
min,maxandsortfilters. (#199)
- Changed
add_globalto performInto<Value>implicitly. - Added
source_mutto retrieve a mutable reference to the source. - Improved Python bindings by adding support for template reloading, better documentation, error reporting.
- Added
pass_stateto the Python binding.
- Expose
debugflag from environment. - Added experimental Python bindings.
- Resolve a runtime panic if
{% extends %}appears in the template but never is executed. - Fixed recursion detection for macros.
- Enforce a maximum size of 10000 items on the range output.
- Added fuel tracking support.
- Added
nonetest. (#185) - Improved various issues with whitespace trimming. (#187)
Value::defaultnow returnsUndefinedrather thanNone.- Added support for
loop.previtemandloop.nextitem. (#188)
- Added
capitalizefilter. (#163) - Added support for
{% call %}. (#164) - Added support for
{% do %}. (#167) - Improved testsuite to execute on wasm32-wasi.
- Filters, tests and other functions can now be registered with a dynamically allocated name. (#146)
- Added
State::current_callwhich exposes the name of the currently called item. (#150) - Introduced revamped object model with
SeqObjectandStructObject. (#148) Objectnow directly exposesdowncast_refandis.- Removed
Value::as_slice - Introduced
Value::as_seqandValue::as_struct. - Introduced
Value::from_seq_objectandValue::from_struct_object. - Added the ability for function arguments to be of type
&dyn SeqObject. - Renamed
ItertoValueIter. - Added
Environment::render_named_str. (#149) - Exposed string interning via the
internfunction. - Improved support for structs in built-in filters.
- Added
indentfilter. (#151) - Added the
map,select/selectattrandreject/rejectattrfilters. - Added
safe/escapedtest. - Strings now have the same iteration behavior as in Jinja2. (#152)
- The
Objectmodel changed significantly in this release. It's now possible for objects to have different shapes (structs or sequences today). As a resultSeqObjectandStructObjectwere added to the API. For changing your objects over have a look at the new documentation forObject. - The
Itertype is now calledValueIter.
- Changed
Object::attributesto being an iterator. (#138) Arc<T: Object>now implementsObject. (#139)- Aligned semantics of top-level template code after
extendswith Jinja2. (#140) - Exposed value creation from Arcs. (#141)
- Performance improvements for value conversions and object creation. (#142)
- Align iteration behavior of dynamic objects with maps.
- The
attributesmethod on objects now returns iterators. To make the transition easy change[..]toBox::new([..].into_iter()).
- Added support for recursive macro invocations. (#133)
- Added optional unicode identifier support. (#134)
- Catch divisions by zero.
- Correctly render
inffloats. - Enforce a maximum recursion depth during parsing.
- Added
Value::try_iterto iterate over maps and sequences. (#132)
- Added
Value::from_function. (#121) - Fixed incorrect location information with blocks.
- Fixed broken nested
super()calls. - Improve error reporting for failures in blocks and trying to
super()when there is no parent block. - Performance improvements.
- Added support for
{% import %}/{% from .. import .. %}and{% macro %}. (#123) - Added
Value::is_kwargswhich disambiguates if an object passed to a function or filter is a normal object or if it represents keyword arguments. - Added the ability to call functions stored on objects.
- Added
macrosandmulti_templatefeatures to disable some of the heavier pieces of MiniJinja. - Fixed an issue that caused trailing commas not to work in lists.
- Fixed an incorrect manifest for
minijinja-autoreload.
- Add
definedandundefinedtests to always be included. - Removed
Source::load_from_path. - Added
Source::from_path.
- Removed
Source::load_from_path. UseSource::with_loaderinstead.
- Added custom autoescape settings.
- Added custom formatters.
- Restructured engine internals for greater clarity.
- Added support for rendering to
io::Write. (#111) - Make it impossible to implement
Filter,TestorFunctionfrom outside the crate by sealed the traits. (#113) - Added support for remaining arguments with
Rest. (#114) - Filters, tests and functions can now borrow arguments. (#115)
- Added
Value::as_sliceandValue::get_get_item_by_index. - Added support for span error reporting. (#118)
- Greatly improved handling of nested errors. (#119)
ImpossibleOperationis nowInvalidOperation.- Added support for slice syntax. (#120)
Filter,TestandFunctionare now sealed traits.ErrorKind::ImpossibleOperationis nowErrorKind::InvalidOperation.- Moved up MSRV to 1.61.0 due to bugs on older rust versions related to HRTBs.
- Remove internal refcounts from environment.
- Changed
ObjectandFunctionArgsinterface to take arguments by reference. (#101) syncmode is now always enabled. (#104)- Removed meta API. (#105)
- Error no longer implements
PartialEq. - Simplified the function interface. Filters, tests and global functions can now directly return values instead of results. (#107)
- MiniJinja no longer silently iterates over non iterable values.
- The
metaAPI is gone without replacement. Object::call_methodandObject::callnow take the arguments as&[Value]instead ofVec<Value>.Object::call_method,Object::callandFunctionArgs::from_valuesnow take the arguments as&[Value]instead ofVec<Value>.- The error object used to implement
PartialEqbut this was implemented by comparing the error kind instead. Explicitly use the.kind()method of the error if you want the same behavior. DebugInfois no longer exposed. This might come back if a better API can be found.
- Fixed binary subtraction operator requiring a space. (#94)
- Fixed trailing commas not working in function calls. (#95)
- Small internal improvements to context creation. (#79)
- Add support for JSON/YAML/JavaScript Escaping. (#82)
- Add missing escape support for single quotes (
'). (#81) - Added support for newlines in string literals. (#85)
- Added support for block assignment syntax. (#86)
- Added string concatenation with
+for Jinja compat. (#87) - Enable debug mode by default in debug builds. (#88)
- Added
render!macro andrender_str. (#89) - Fixed an issue where trailing whitespace removal did not work on blocks. (#90)
- Added
loop.changed()method. (#91)
- Fixed a bad dependency declaration.
- Improved debug printing of context.
- Added
-,_and.to set of unescaped characters inurlencode. (#72) - Bumped
v_htmlescapedependency. (#74)
- Added support for
{% raw %}. (#67) - Minimum Rust version moved up to 1.45.
- Added support for
{% set %}. (#70)
- Added support for unpacking in
withblocks. (#65)
- Bumped minimum version requirement to 1.43.
- Internal refactorings.
- Added support for fully dynamic loading via
Source::with_loader. - Renamed
get_sourcetosource.
- Fixed
orexpressions not working properly.
- Added
boolfilter. - Added
metaAPI. (#55) - Added support for
ignore missingin include tags. (#56) - Added support for choices in include tags. (#57)
- Removed deprecated functionality.
- Fix an panic in debug error printing. (#49)
- Deprecated
Primitiveandas_primitive. - Deprecated
as_f64. - Truthiness of values is now checking container length. Previously containers were always true, now they are only true if they are not empty.
- Strings and safe strings no longer compare the same.
- Changed list and map string output to have delimiters and debug printing.
- Added
batchandslicefilter. - Added the new
itemsfilter. - Removed value internal distinction between maps and structs.
- Added
listfilter. - Added
firstandlastfilters. - Added
roundandabsfilters. - Implemented integer division operator (
//) and changed division to always return floats like documented and to match the Jinja2 implementation. To make this more convenient whole integer floats are now handled like integers in some situations. - Added
recursivesupport to for loops. - Merged
builtin_filters,builtin_testsandbuiltin_functionsfeatures intobuiltins. - Added
value::serializing_for_valueto check if serialization is taking place for MiniJinja. - The
Valuetype now supports deserialization. This feature can be disabled by removing the defaultdeserializationfeature. - Removed optional
memchrdependency as it does not appear to be useful.
Yanked — this was a release from the wrong branch
- Restructured the value type internally to be simpler and not use unsafe at the cost of slightly larger memory footprint. (#30)
- Added
debugsupport. If the debug mode is enabled, errors now carry a lot of useful debug information and an alternative representation when formatted into strings that show the context of the template where it went all wrong. (#31) - Added automatic string interning of object/map keys in values. This feature can
be disabled by removing the default
key_interningfeature. (#35) - Removed deprecated
Singletype.
- Remove one trailing newline to be consistent with Jinja2.
- Resolved a bug where borrowed keys on dynamic objects could not be looked up. (#29)
- Restored unconditional compatibility with 1.42.
- Turned on all features for the docs on docs.rs
- Added
context!and deprecateSingle. - Correctly report template file names in errors.
- Added the
sourcemethod on templates. - Introduced
Statetype and changed parameter to functions from&Environmentto&State. - Added
debugglobal. - Added
tojsonfilter. - Added
urlencodefilter.
- Made the
sourcemethod on error be bound toSendandSync.
- Added
defaultfilter. - Added
startingwithandendingwithtests. - Added global variables and function support.
- Added
rangefunction. - Added
dictfunction. - Fixed panic caused by
super()calls outside of blocks. - Added
Error::with_sourcemethod. - Added
objectabstraction. - Added keyword arguments to function and filter invocations.
- Added Jinja2 filter aliases
e,dandcount.
- Added support for rustc 1.41.0
- Added
v_htmlescapefeature to turn on a faster HTML escaping. - Export
HtmlEscapehelper. - Also escape
/in HTML escaping likev_htmlescapedoes. - Changed return value type of
get_templateto be a result rather than an option. - Added
Sourcebehind thesourcefeature to support loading of templates at runtime without lifetime complications. - Initial auto escaping decision is now made when the template is loaded from the environment and not when they are added.
- The environment can now be cloned.
- Added
syncfeature that can be disabled to disable the ability to send objects to other threads where that comes at a cost. safeandescapeare now always provided as filters.- Added support for
self.block_name(). - Fixed incorrect behavior where
super()did not allow filters. - Added
{% filter %}blocks. - Added
value::Singletype to render simple templates with a single value passed.
- Added the ability to roundtrip arbitrary values via the serialize interface.
- Added support for tuple unpacking in lists.
- Added dictsort filter.
- Introduced a new trait
ArgTypeto handle argument conversions for filters and tests so optional arguments can exist. - Renamed
ValueArgstrait toFunctionArgs. - Added
reversefilter. - Added
trimfilter. - Added
joinfilter. - Added
numbertest. - Added
stringtest. - Added
sequencetest. - Added
mappingtest. - Added
builtin_filtersandbuiltin_testsfeatures to disable the built-in filter and test functions. - Added
is notsyntax for negated tests. - Added
elseblock to for loops. - Added
ifcondition expression to for loops. - Fixed a bug that caused or/and not to evaluate correctly in certain situations.
- Added
inandnot inexpressions. - Added inline
ifexpressions.
- Added support for
{% include %} - Resolved a bug that caused
withblocks to fully shadow the outer scope. - Improved documentation in the crate.
- Added support for rustc versions down to 1.42.0
- Initial release of the library