diff --git a/docs/Changelog.md b/docs/Changelog.md index 3d8a04c68da..731e3a213b9 100644 --- a/docs/Changelog.md +++ b/docs/Changelog.md @@ -34,23 +34,23 @@ ### 1.18.0 (Not released yet) * [#6944](https://github.com/TouK/nussknacker/pull/6944) Changes around adhoc testing feature - * `test-with-form` button was renamed to `adhoc-testing` - * Improved form validators inside adhoc tests (validation was moved to backend) - * Moved `testInfo/*` endpoints to `scenarioTesting/` path and rewrite then using Tapir + * `test-with-form` button was renamed to `adhoc-testing` + * Improved form validators inside adhoc tests (validation was moved to backend) + * Moved `testInfo/*` endpoints to `scenarioTesting/` path and rewrite then using Tapir * Batch processing mode related improvements: - * [#6692](https://github.com/TouK/nussknacker/pull/6692) Kryo serializers for `UnmodifiableCollection`, `scala.Product` etc. - are registered based on class of Serializer instead of instance of Serializer. Thanks to this change, it is possible to use `RAW<>` - data type in Table API components - * [#6552](https://github.com/TouK/nussknacker/pull/6552) Added aggregation functions to Batch aggregation component - (`Average`, `Count`, `Max`, `Min`, `Population standard deviation`, `Sample standard deviation`, `Population variance`, `Sample variance`) - * [#6734](https://github.com/TouK/nussknacker/pull/6734) Tables from external catalogs are now refreshed automatically - when entering into node form. Please be aware that changes in `tableDefinition.sql` are not refreshed. - To do this, use `/app/processingtype/reload` API - * [#6741](https://github.com/TouK/nussknacker/pull/6741) [#6886](https://github.com/TouK/nussknacker/pull/6886) Added `catalogConfiguration` configuration option allowing to set up catalog - directly in config instead of by `tableDefinition.sql` - * [#6741](https://github.com/TouK/nussknacker/pull/6741) (Breaking change) Fully qualified table paths are used instead of table names - in table source and sink components in `Table` parameter - * [#6950](https://github.com/TouK/nussknacker/pull/6950) Fix for testing mechanism for table sources: using full, model classpath instead of only flinkTable.jar + * [#6692](https://github.com/TouK/nussknacker/pull/6692) Kryo serializers for `UnmodifiableCollection`, `scala.Product` etc. + are registered based on class of Serializer instead of instance of Serializer. Thanks to this change, it is possible to use `RAW<>` + data type in Table API components + * [#6552](https://github.com/TouK/nussknacker/pull/6552) Added aggregation functions to Batch aggregation component + (`Average`, `Count`, `Max`, `Min`, `Population standard deviation`, `Sample standard deviation`, `Population variance`, `Sample variance`) + * [#6734](https://github.com/TouK/nussknacker/pull/6734) Tables from external catalogs are now refreshed automatically + when entering into node form. Please be aware that changes in `tableDefinition.sql` are not refreshed. + To do this, use `/app/processingtype/reload` API + * [#6741](https://github.com/TouK/nussknacker/pull/6741) [#6886](https://github.com/TouK/nussknacker/pull/6886) Added `catalogConfiguration` configuration option allowing to set up catalog + directly in config instead of by `tableDefinition.sql` + * [#6741](https://github.com/TouK/nussknacker/pull/6741) (Breaking change) Fully qualified table paths are used instead of table names + in table source and sink components in `Table` parameter + * [#6950](https://github.com/TouK/nussknacker/pull/6950) Fix for testing mechanism for table sources: using full, model classpath instead of only flinkTable.jar * [#6716](https://github.com/TouK/nussknacker/pull/6716) Fix type hints for #COLLECTION.merge function. * [#6695](https://github.com/TouK/nussknacker/pull/6695) [7032](https://github.com/TouK/nussknacker/pull/7032) From now on, arrays on UI are visible as lists but on a background they are stored as it is. * [#6750](https://github.com/TouK/nussknacker/pull/6750) Add varargs to `#COLLECTION.concat` and `#COLLECTION.merge`. @@ -58,11 +58,11 @@ * [#6769](https://github.com/TouK/nussknacker/pull/6769) Added possibility to choose presets and define lists for Long typed parameter inputs in fragments. * [#6995](https://github.com/TouK/nussknacker/pull/6995) Add `toJson` and `toJsonString` conversions (in the `#CONV` helper) * [#6995](https://github.com/TouK/nussknacker/pull/6995) Add `#BASE64` helper to decode/encode Base64 values -* [#6826](https://github.com/TouK/nussknacker/pull/6826) Security fix: added validation of expression used inside - indexer for Maps and Lists (for example `{1,2,3}[#otherList.remove(1) == null ? 0 : 0]`). This allowed executing +* [#6826](https://github.com/TouK/nussknacker/pull/6826) Security fix: added validation of expression used inside + indexer for Maps and Lists (for example `{1,2,3}[#otherList.remove(1) == null ? 0 : 0]`). This allowed executing some types of not allowed expressions. * [#6880](https://github.com/TouK/nussknacker/pull/6880) Performance optimization of generating Avro messages with unions - - shorter message in logs + - shorter message in logs * [#6766](https://github.com/TouK/nussknacker/pull/6766) Scenario labels support - you can assign labels to scenarios and use them to filter the scenario list * [#6176](https://github.com/TouK/nussknacker/pull/6176) [#6996](https://github.com/TouK/nussknacker/pull/6996) @@ -70,20 +70,20 @@ [#7014](https://github.com/TouK/nussknacker/pull/7014) [#7113](https://github.com/TouK/nussknacker/pull/7113) Update most dependencies to latest versions, most important ones: - * Flink 1.18.1 -> 1.19.1 - * Jackson 2.15.4 -> 2.17.2 - * Cats 2.10 -> 2.12 - * Avro 1.11.3 -> 1.11.4 - * swagger-parser 2.1.15 -> 2.1.22 - * Tapir -> 1.11.7 - * openapi-circe-yaml -> 0.11.3 - * Scala 2.13 to 2.13.15 + * Flink 1.18.1 -> 1.19.1 + * Jackson 2.15.4 -> 2.17.2 + * Cats 2.10 -> 2.12 + * Avro 1.11.3 -> 1.11.4 + * swagger-parser 2.1.15 -> 2.1.22 + * Tapir -> 1.11.7 + * openapi-circe-yaml -> 0.11.3 + * Scala 2.13 to 2.13.15 * Scenario activities mechanism replacing old process actions: - * [#6822](https://github.com/TouK/nussknacker/pull/6822), [#6929](https://github.com/TouK/nussknacker/pull/6929) - * Scenario Activity API contract (without BE implementation) - * [#6823](https://github.com/TouK/nussknacker/pull/6823) , [#6962](https://github.com/TouK/nussknacker/pull/6962) - * old process actions and comments migrated to new table in the db - * Scenario Activity API BE implementation + * [#6822](https://github.com/TouK/nussknacker/pull/6822), [#6929](https://github.com/TouK/nussknacker/pull/6929) + * Scenario Activity API contract (without BE implementation) + * [#6823](https://github.com/TouK/nussknacker/pull/6823) , [#6962](https://github.com/TouK/nussknacker/pull/6962) + * old process actions and comments migrated to new table in the db + * Scenario Activity API BE implementation * [#6925](https://github.com/TouK/nussknacker/pull/6925) Fix situation when preset labels were presented as `null` when node didn't pass the validation. * [#6935](https://github.com/TouK/nussknacker/pull/6935) Spel: Scenario labels added to meta variable - `#meta.scenarioLabels` * [#6952](https://github.com/TouK/nussknacker/pull/6952) Improvement: TypeInformation support for scala.Option @@ -92,19 +92,26 @@ * [#6988](https://github.com/TouK/nussknacker/pull/6988) Remove unused API classes: `MultiMap`, `TimestampedEvictableStateFunction` * [#7000](https://github.com/TouK/nussknacker/pull/7000) Show all possible options for dictionary editor on open. * [#6979](https://github.com/TouK/nussknacker/pull/6979) Introduces an activities panel that provides information about all system activities. -* Performance optimization: - * [#7058](https://github.com/TouK/nussknacker/pull/7058) Add missing Flink TypeInformation for better serialization - * [#7097](https://github.com/TouK/nussknacker/pull/7097) Flink base types registration mechanism +* Performance optimization: + * [#7058](https://github.com/TouK/nussknacker/pull/7058) Add missing Flink TypeInformation for better serialization + * [#7097](https://github.com/TouK/nussknacker/pull/7097) Flink base types registration mechanism * [#7021](https://github.com/TouK/nussknacker/pull/7021) Definitions service can return definition without UI config * [#7010](https://github.com/TouK/nussknacker/pull/7010) Dynamic access allowed via indexer operator (`[]`) on expressions typed as `Unknown` * [#7063](https://github.com/TouK/nussknacker/pull/7063) Introduce conversion extension methods in SpeL: - * is(className)/to(className)/toOrNull(className) - * isBoolean/toBoolean/toBooleanOrNull - * isLong/toLong/toLongOrNull - * isDouble/toDouble/toDoubleOrNull - * isBigDecimal/toBigDecimal/toBigDecimalOrNull - * isList/toList/toListOrNull - * isMap/toMap/toMapOrNull - the list of key-value pairs or unknown map can be converted to a map. + * canBe(className)/to(className)/toOrNull(className) + * canBeBoolean/toBoolean/toBooleanOrNull + * canBeLong/toLong/toLongOrNull + * canBeDouble/toDouble/toDoubleOrNull + * canBeBigDecimal/toBigDecimal/toBigDecimalOrNull + * canBeList/toList/toListOrNull + * canBeMap/toMap/toMapOrNull - the list of key-value pairs or unknown map can be converted to a map. +* [#7106](https://github.com/TouK/nussknacker/pull/7106) Fix an issue where pressing the “Esc” key did not remove focus from input fields in dialogs, which prevented the dialog window from closing +* [#7002](https://github.com/TouK/nussknacker/pull/7002) Resolve an issue with union nodes output expression when nodes were copied and pasted +* [#6994](https://github.com/TouK/nussknacker/pull/6994) Fix styling issues for form checkboxes in Firefox +* [#6721](https://github.com/TouK/nussknacker/pull/6721) Provide a popover to display additional information about count +* [#7099](https://github.com/TouK/nussknacker/pull/7099) Provide an option to embedded video to the markdown +* [#7102](https://github.com/TouK/nussknacker/pull/7102) Introduce a new UI to defining aggregations within nodes +* [#7147](https://github.com/TouK/nussknacker/pull/7147) Fix redundant "ParameterName(...)" wrapper string in exported PDFs in nodes details ## 1.17 @@ -126,10 +133,10 @@ ### 1.17.1 (Not released yet) * [#6880](https://github.com/TouK/nussknacker/pull/6880) Performance optimization of generating Avro messages with unions - - shorter message in logs + - shorter message in logs * [#6877](https://github.com/TouK/nussknacker/pull/6877) Fix application crash on edit node details window open - + ### 1.17.0 (12 September 2024) * [#6658](https://github.com/TouK/nussknacker/pull/6658) Bump up circe-yaml lib to 0.15.2 @@ -145,7 +152,7 @@ * [#6333](https://github.com/TouK/nussknacker/pull/6333) Test data generation: more meaningful error message when no data to generate * [#6386](https://github.com/TouK/nussknacker/pull/6386) Security fix for situation where array constructor could be used to execute unallowed expressions by exploiting the lack of full validation inside array dimensions. - * Array constructor expressions are now illegal. + * Array constructor expressions are now illegal. * [#6432](https://github.com/TouK/nussknacker/pull/6432) The default `topicsExistenceValidationConfig.validatorConfig.adminClientTimeout` increased from `500ms` to `10s` to avoid scenario starting problems * [#6217](https://github.com/TouK/nussknacker/pull/6217) Improvement: Make flink-metrics-dropwizard as provided dependency at flink-components-utils @@ -158,45 +165,45 @@ determined automatically, developer doesn't need to provide it by his/her own * [#6445](https://github.com/TouK/nussknacker/pull/6445) [#6499](https://github.com/TouK/nussknacker/pull/6499) Add support to seconds in a duration editor * [#6436](https://github.com/TouK/nussknacker/pull/6436) Typed SpEL list expressions will now infer their compile-time known values, instead of only the supertype of its elements. These values can be used in custom components or validators. - * NOTE: selection (`.?`), projection (`.!`) or operations from the `#COLLECTIONS` helper cause the typed list to lose its elements' values + * NOTE: selection (`.?`), projection (`.!`) or operations from the `#COLLECTIONS` helper cause the typed list to lose its elements' values * [#6570](https://github.com/TouK/nussknacker/pull/6570) Generic parameters of collection types are better typed now: e.g. `List[Integer]` can be passed to `List[Number]` but not the other way * Batch processing mode related improvements: - * [#6353](https://github.com/TouK/nussknacker/pull/6353) [#6467](https://github.com/TouK/nussknacker/pull/6467) Added `join` component - * [#6503](https://github.com/TouK/nussknacker/pull/6503) Records are produced by Table Source as `Row`s instead of `Map`s. - Thanks to that, more scenario constructions work correctly with table components such as `join`. - * [#6195](https://github.com/TouK/nussknacker/pull/6195) [#6340](https://github.com/TouK/nussknacker/pull/6340) [#6506](https://github.com/TouK/nussknacker/pull/6506) Added test data generation and testing for Table Source: - * Added test data generation with 2 modes: - * Live (default) - creates records by pulling data from the currently configured data source - * Random - creates randomized records - * Data generation mode can be configured through the `testDataGenerationMode` in the table components configuration - with `"live"` or `"random"` setting - * The test data can be generated into a file through the `generate file` button - * Added ability to run tests on data from file or generated on the spot (the `generated` button) - * [#6518](https://github.com/TouK/nussknacker/pull/6518) Added user friendly editor for Table Sink output value - * The editor can be easily switched backed to 'raw' version similarly to the current Kafka Sink - * [#6545](https://github.com/TouK/nussknacker/pull/6545) Non-physical columns are properly handled in Table Sink now - * User need to provide only persisted column values now - values for computed columns and virtual columns are not required anymore - * [#6559](https://github.com/TouK/nussknacker/pull/6559) Extension: Move previousValue and delay components from unbounded to base Flink components - * [#6546](https://github.com/TouK/nussknacker/pull/6546) [#6619](https://github.com/TouK/nussknacker/pull/6619) Types alignment and support for advanced data types: ARRAY, MAP, MULTISET, nested types (like ROW with ROW as a field or ARRAY) - * [#6546](https://github.com/TouK/nussknacker/pull/6546) Error handling during saving data to table sink - * [#6567](https://github.com/TouK/nussknacker/pull/6567) Flink's [execution mode](https://ci.apache.org/projects/flink/flink-docs-stable/docs/dev/datastream/execution_mode) - can now be set for Flink-based scenario types under `modelConfig.executionMode`. + * [#6353](https://github.com/TouK/nussknacker/pull/6353) [#6467](https://github.com/TouK/nussknacker/pull/6467) Added `join` component + * [#6503](https://github.com/TouK/nussknacker/pull/6503) Records are produced by Table Source as `Row`s instead of `Map`s. + Thanks to that, more scenario constructions work correctly with table components such as `join`. + * [#6195](https://github.com/TouK/nussknacker/pull/6195) [#6340](https://github.com/TouK/nussknacker/pull/6340) [#6506](https://github.com/TouK/nussknacker/pull/6506) Added test data generation and testing for Table Source: + * Added test data generation with 2 modes: + * Live (default) - creates records by pulling data from the currently configured data source + * Random - creates randomized records + * Data generation mode can be configured through the `testDataGenerationMode` in the table components configuration + with `"live"` or `"random"` setting + * The test data can be generated into a file through the `generate file` button + * Added ability to run tests on data from file or generated on the spot (the `generated` button) + * [#6518](https://github.com/TouK/nussknacker/pull/6518) Added user friendly editor for Table Sink output value + * The editor can be easily switched backed to 'raw' version similarly to the current Kafka Sink + * [#6545](https://github.com/TouK/nussknacker/pull/6545) Non-physical columns are properly handled in Table Sink now + * User need to provide only persisted column values now - values for computed columns and virtual columns are not required anymore + * [#6559](https://github.com/TouK/nussknacker/pull/6559) Extension: Move previousValue and delay components from unbounded to base Flink components + * [#6546](https://github.com/TouK/nussknacker/pull/6546) [#6619](https://github.com/TouK/nussknacker/pull/6619) Types alignment and support for advanced data types: ARRAY, MAP, MULTISET, nested types (like ROW with ROW as a field or ARRAY) + * [#6546](https://github.com/TouK/nussknacker/pull/6546) Error handling during saving data to table sink + * [#6567](https://github.com/TouK/nussknacker/pull/6567) Flink's [execution mode](https://ci.apache.org/projects/flink/flink-docs-stable/docs/dev/datastream/execution_mode) + can now be set for Flink-based scenario types under `modelConfig.executionMode`. * [#6615](https://github.com/TouK/nussknacker/pull/6615) Add encode/decode support for typed SpEL values of types: `java.time.LocalDateTime`, `java.time.LocalDate`, `java.time.LocalTime`, `java.time.Duration`, `java.time.Period` * [#6591](https://github.com/TouK/nussknacker/pull/6591) The whole model can be reloaded with `POST /api/app/processingtype/reload` now - you can use this endpoint to reconfigure Nu processing types without need to restart the app * [#6623](https://github.com/TouK/nussknacker/pull/6623) Added `sortedAscBy` and `reverse` functions to `#COLLECTION` helper * [#6650](https://github.com/TouK/nussknacker/pull/6650) Added a workaround for situations when an updated scenario with Kafka source started reading from the earliest offsets * [#6586](https://github.com/TouK/nussknacker/pull/6586) For now on, the SQL enricher automatically converts types as shown below: - * java.sql.Array -> java.util.List - * java.sql.Time -> java.time.LocalTime - * java.sql.Date -> java.time.LocalDate - * java.sql.Timestamp -> java.time.Instant - * java.sql.Clob -> java.lang.String + * java.sql.Array -> java.util.List + * java.sql.Time -> java.time.LocalTime + * java.sql.Date -> java.time.LocalDate + * java.sql.Timestamp -> java.time.Instant + * java.sql.Clob -> java.lang.String * [#6656](https://github.com/TouK/nussknacker/pull/6656) - * Remove not working MODEL_CLASS_PATH environment variable - * Add default DB connection name + * Remove not working MODEL_CLASS_PATH environment variable + * Add default DB connection name * [#6614](https://github.com/TouK/nussknacker/pull/6614) Array in SpeL improvements: - * From now on it is possible to pass an array as a parameter of type List - e.g. `T(java.lang.String).join(',', #array)`. - * Fix result type of projection (`.!`) - e.g. `#array.![#this]` returns a type array instead of a type List. + * From now on it is possible to pass an array as a parameter of type List - e.g. `T(java.lang.String).join(',', #array)`. + * Fix result type of projection (`.!`) - e.g. `#array.![#this]` returns a type array instead of a type List. * [#6685](https://github.com/TouK/nussknacker/pull/6685) Fixed an issue with dictionary parameter editor language being set to spel when no default value was present. * [#6797](https://github.com/TouK/nussknacker/pull/6797) [#6815](https://github.com/TouK/nussknacker/pull/6815) Performance optimization of Avro processing * [#6578](https://github.com/TouK/nussknacker/pull/6578) Introduced support for displaying a docsUrl with an icon in scenario properties. This feature is based on the processingType and is configurable via the model.conf file. @@ -218,7 +225,7 @@ ### 1.16.3 (8 August 2024) * [#6527](https://github.com/TouK/nussknacker/pull/6527) Typed SpEL list expressions will now infer their compile-time known values, instead of only the supertype of its elements. These values can be used in custom components or validators. - * NOTE: selection (`.?`), projection (`.!`) or operations from the `#COLLECTIONS` helper cause the typed list to lose its elements' values + * NOTE: selection (`.?`), projection (`.!`) or operations from the `#COLLECTIONS` helper cause the typed list to lose its elements' values * [#6517](https://github.com/TouK/nussknacker/pull/6517) Allow using same variable names in a fragment and outside a fragment. Fix bleeding context from outside scenario into the fragment output node. ### 1.16.2 (18 July 2024) @@ -238,12 +245,12 @@ * [#6053](https://github.com/TouK/nussknacker/pull/6053) Added impersonation mechanism support in Nu API for BasicAuth security module. * [#6008](https://github.com/TouK/nussknacker/pull/6008) Add embedded QuestDB as database for FE statistics. * [#5982](https://github.com/TouK/nussknacker/pull/5982) [#6155](https://github.com/TouK/nussknacker/pull/6155) [#6172](https://github.com/TouK/nussknacker/pull/6172) [#6221](https://github.com/TouK/nussknacker/pull/6221) Batch processing mode related improvements: - * Deployments API returns correct status of deployment instead of returning always the last deployment's status - * Deployments API returns more information about status of a deployment: problem description and status modification time - * Status of a deployment is cached on the Designer side - in case of retention of finished job on Flink, status is still returned as FINISHED - * Overlapping deployment metrics/counts workaround: Ensure that only one deployment is performed for each scenario at a time - * Blocking of deployment of a fragment - * Blocking of deployment of an archived scenario + * Deployments API returns correct status of deployment instead of returning always the last deployment's status + * Deployments API returns more information about status of a deployment: problem description and status modification time + * Status of a deployment is cached on the Designer side - in case of retention of finished job on Flink, status is still returned as FINISHED + * Overlapping deployment metrics/counts workaround: Ensure that only one deployment is performed for each scenario at a time + * Blocking of deployment of a fragment + * Blocking of deployment of an archived scenario * [#6121](https://github.com/TouK/nussknacker/pull/6121) Add functionality to reorder columns within the table editor. * [#6136](https://github.com/TouK/nussknacker/pull/6136) Add possibility to configure kafka exactly-once delivery for flink. * [#6185](https://github.com/TouK/nussknacker/pull/6185) Improvement: Make UniversalKafkaSinkFactory available at BoundedStream @@ -286,8 +293,8 @@ ### 1.15.2 (7 June 2024) * [#6134](https://github.com/TouK/nussknacker/pull/6134) Fixes in determining `lastStateActionData` and `lastDeployedActionData` for Scenario. - * Deployed version of scenario is now shown properly even if other actions followed deploy. - * Scenario state is now not impacted by actions that don't actually change it. + * Deployed version of scenario is now shown properly even if other actions followed deploy. + * Scenario state is now not impacted by actions that don't actually change it. ### 1.15.1 (5 June 2024) @@ -298,17 +305,17 @@ * [#5620](https://github.com/TouK/nussknacker/pull/5620) Nodes Api OpenApi-based documentation (e.g. `https://demo.nussknacker.io/api/docs`) * [#5760](https://github.com/TouK/nussknacker/pull/5760) [#5599](https://github.com/TouK/nussknacker/pull/5599) [#3922](https://github.com/TouK/nussknacker/pull/5901) Libraries bump: - * Cats 2.9.0 -> 2.10.0 - * Cats Effect: 3.5.2 -> 3.5.4 - * Flink: 1.17.2 -> 1.18.1 - * Kafka client: 3.6.1 -> 3.6.2 - * Netty 4.1.93 -> 4.1.109 - * openapi-circe-yaml: 0.6.0 -> 0.7.4 - * Tapir: 1.7.4 -> 1.9.11 + * Cats 2.9.0 -> 2.10.0 + * Cats Effect: 3.5.2 -> 3.5.4 + * Flink: 1.17.2 -> 1.18.1 + * Kafka client: 3.6.1 -> 3.6.2 + * Netty 4.1.93 -> 4.1.109 + * openapi-circe-yaml: 0.6.0 -> 0.7.4 + * Tapir: 1.7.4 -> 1.9.11 * [#5438](https://github.com/TouK/nussknacker/pull/5438) [#5495](https://github.com/TouK/nussknacker/pull/5495) Improvement in DeploymentManager API: - * Alignment in the api of primary (deploy/cancel) actions and the experimental api of custom actions. + * Alignment in the api of primary (deploy/cancel) actions and the experimental api of custom actions. * [#5798](https://github.com/TouK/nussknacker/pull/5798) Improvements in DeploymentService: - * Custom actions are handled in the same way as deploy and cancel: action and comment are registered in NU database + * Custom actions are handled in the same way as deploy and cancel: action and comment are registered in NU database * [#5783](https://github.com/TouK/nussknacker/pull/5783) Added information about component's allowed processing modes to Component API * [#5831](https://github.com/TouK/nussknacker/pull/5831) Fragment input parameters presets support * [#5780](https://github.com/TouK/nussknacker/pull/5780) Fixed Scala case classes serialization when a class has additional fields in its body @@ -352,12 +359,12 @@ ### 1.14.0 (21 Mar 2024) * [#4287](https://github.com/TouK/nussknacker/pull/4287) [#5257](https://github.com/TouK/nussknacker/pull/5257) [#5432](https://github.com/TouK/nussknacker/pull/5432) [#5552](https://github.com/TouK/nussknacker/pull/5552) [#5645](https://github.com/TouK/nussknacker/pull/5645) Libraries bump: - * Flink: 1.16.2 -> 1.17.2 - * Cats Effect: 2.5.5 -> 3.5.2 - * Kafka client: 3.3.2 -> 3.6.1 - * Confluent Schema Registry client: 7.3.2 -> 7.5.1 - * Avro: 1.11.1 -> 1.11.3 - * Skuber: 3.0.6 -> 3.2 + * Flink: 1.16.2 -> 1.17.2 + * Cats Effect: 2.5.5 -> 3.5.2 + * Kafka client: 3.3.2 -> 3.6.1 + * Confluent Schema Registry client: 7.3.2 -> 7.5.1 + * Avro: 1.11.1 -> 1.11.3 + * Skuber: 3.0.6 -> 3.2 * [#5253](https://github.com/TouK/nussknacker/pull/5253) Removed the option to configure fragments via config. Due to the recent expansion of FragmentParameter, the option has become largely redundant. Removed to decrease unnecessary complexity. * [#5271](https://github.com/TouK/nussknacker/pull/5271) Changed `AdditionalUIConfigProvider.getAllForProcessingType` API to be more in line with FragmentParameter * [#5278](https://github.com/TouK/nussknacker/pull/5278) Recreate assembled model JAR for Flink if it got removed (e.g. by systemd-tmpfiles) @@ -372,10 +379,10 @@ * [#5413](https://github.com/TouK/nussknacker/pull/5413) Avro Records now has additional `get(String)` method allowing to access fields dynamically * [#5419](https://github.com/TouK/nussknacker/pull/5419) Remove system properties from merged model config * [#5363](https://github.com/TouK/nussknacker/pull/5363) Improvements and fixes related to scenario level errors: - * Fixed bug where scenario level error related to node flashed when opening a node - * Fixed highlighting of fragment nodes causing errors - * Display fragment level validation errors when editing fragment - * Improved error messages + * Fixed bug where scenario level error related to node flashed when opening a node + * Fixed highlighting of fragment nodes causing errors + * Display fragment level validation errors when editing fragment + * Improved error messages * [#5364](https://github.com/TouK/nussknacker/pull/5364) Fixed wrong expression suggestions and validation errors in disabled nodes * [#5447](https://github.com/TouK/nussknacker/pull/5447) Fixed `java.lang.reflect.InaccessibleObjectException: Unable to make public java.lang.Object` exception by downgrade of JRE from 17 to 11 in lite runner image for scala 2.13 * [#5465](https://github.com/TouK/nussknacker/pull/5465) Fix: Sometimes `Bad expression type, expected: X found X` error was reported when comparing matching Records. @@ -386,8 +393,8 @@ * [#5475](https://github.com/TouK/nussknacker/pull/5475) SpEL expressions checking improvement: The equals operator used with two Lists with different element types is reported as an error * [#5389](https://github.com/TouK/nussknacker/pull/5389) Scenario activity API OpenAPI-based documentation (e.g. `https://demo.nussknacker.io/api/docs`) * [#5509](https://github.com/TouK/nussknacker/pull/5509) Security improvement: - * Added authorization check for listing activities and downloading attachments in scenario activity API - * Fixed the ability to download an unrelated attachment from a given scenario + * Added authorization check for listing activities and downloading attachments in scenario activity API + * Fixed the ability to download an unrelated attachment from a given scenario * [#5522](https://github.com/TouK/nussknacker/pull/5522), [#5519](https://github.com/TouK/nussknacker/pull/5519) Scenario status caching more often * [#5505](https://github.com/TouK/nussknacker/pull/5505) [#5710](https://github.com/TouK/nussknacker/pull/5710) Fix: anonymous user handling regression * [#5371](https://github.com/TouK/nussknacker/pull/5371) Added new parameter editor type: DictParameterEditor. @@ -461,31 +468,31 @@ * [#4828](https://github.com/TouK/nussknacker/pull/4828) Improvement: Allow passing timestampAssigner at FlinkTestScenarioRunner * [#4839](https://github.com/TouK/nussknacker/pull/4839) Fixed: Fragment migration to secondary env is again available * [#4901](https://github.com/TouK/nussknacker/pull/4901) Improvements TestScenarioRunner: - * Run runner with proper prepared invocation collector for test mode - * Fix passing global variables on LiteTestScenarioRunner and RequestResponseTestScenarioRunner - * Add missing tests for passing global variables - * Fix bug with passing components on RequestResponseTestScenarioRunner - * Fix bug building source test context on LiteTestScenarioRunner + * Run runner with proper prepared invocation collector for test mode + * Fix passing global variables on LiteTestScenarioRunner and RequestResponseTestScenarioRunner + * Add missing tests for passing global variables + * Fix bug with passing components on RequestResponseTestScenarioRunner + * Fix bug building source test context on LiteTestScenarioRunner * [#4854](https://github.com/TouK/nussknacker/pull/4854)[#5059](https://github.com/TouK/nussknacker/pull/5059) Categories configuration redesign * [#4919](https://github.com/TouK/nussknacker/pull/4919) Improvement: Support for handling runtime exceptions at FlinkTestScenarioRunner * [#4923](https://github.com/TouK/nussknacker/pull/4923) Fix non-unique test case ids when testing scenario with union * [#4745](https://github.com/TouK/nussknacker/pull/4745) Improvement: Stricter Node and scenario id validation * [#4928](https://github.com/TouK/nussknacker/pull/4928) [#5028](https://github.com/TouK/nussknacker/pull/5028) Breaking change: `Validator.isValid` method now takes expression and optional evaluated value, instead of just expression. Also: - * `LiteralRegExpParameterValidator` is renamed to `RegExpParameterValidator`, - * `LiteralNumberValidator` is removed, - * `LiteralIntegerValidator` is considered deprecated and will be removed in the future. - * new validator: `CompileTimeEvaluableValueValidator` that checks if value is valid at compile time and it should be used instead of literal validators - * annotation `pl.touk.nussknacker.engine.api.validation.Literal` was renamed to `pl.touk.nussknacker.engine.api.validation.CompileTimeEvaluableValue` + * `LiteralRegExpParameterValidator` is renamed to `RegExpParameterValidator`, + * `LiteralNumberValidator` is removed, + * `LiteralIntegerValidator` is considered deprecated and will be removed in the future. + * new validator: `CompileTimeEvaluableValueValidator` that checks if value is valid at compile time and it should be used instead of literal validators + * annotation `pl.touk.nussknacker.engine.api.validation.Literal` was renamed to `pl.touk.nussknacker.engine.api.validation.CompileTimeEvaluableValue` * [#5033](https://github.com/TouK/nussknacker/pull/5033) Updated Scala 2.13 to 2.13.12 * [#4887](https://github.com/TouK/nussknacker/pull/4887) New parameter validator - `ValidationExpressionParameterValidator` that allows to use SpEL (or any other) expression to validate parameters * [#5077](https://github.com/TouK/nussknacker/pull/5077) Add an option to set schema on connections in SQL enricher * [#5059](https://github.com/TouK/nussknacker/pull/5059) [#5100](https://github.com/TouK/nussknacker/pull/5100) [#5103](https://github.com/TouK/nussknacker/pull/5103) Breaking change: Scenario type to Category mapping become 1-to-1 instead of 1-to-many. * [#4978](https://github.com/TouK/nussknacker/pull/4978) [#5241](https://github.com/TouK/nussknacker/pull/5241) Expand `FragmentParameter` with new fields: - * `hintText` - shown next to the parameter when using the fragment - * `initialValue` - initial value of the parameter (before user changes it) - * `required` - whether the parameter is mandatory - * `valueCompileTimeValidation` - allows configuration of `ValidationExpressionParameterValidator` for this parameter + * `hintText` - shown next to the parameter when using the fragment + * `initialValue` - initial value of the parameter (before user changes it) + * `required` - whether the parameter is mandatory + * `valueCompileTimeValidation` - allows configuration of `ValidationExpressionParameterValidator` for this parameter * [#4953](https://github.com/TouK/nussknacker/pull/4953) Improved node validation * [#5141](https://github.com/TouK/nussknacker/pull/5141) Security improvement: API endpoints check if user has access rights to Category associated with Processing Type provided in API * [#5182](https://github.com/TouK/nussknacker/pull/5182) [#5203](https://github.com/TouK/nussknacker/pull/5203) [#5250](https://github.com/TouK/nussknacker/pull/5250) Component, User and Notification API OpenAPI-based documentation (e.g. `https://demo.nussknacker.io/api/docs`) @@ -545,8 +552,8 @@ ### 1.12.0 (6 Oct 2023) * [#4697](https://github.com/TouK/nussknacker/pull/4697) Change `api/parameters/*/validate` and `api/parameters/*/suggestions` endpoints. - * Use `processingType` instead of `processName` - * Add `scenarioName` parameter to `ParametersValidationRequest` used in `api/parameters/*/validate` + * Use `processingType` instead of `processName` + * Add `scenarioName` parameter to `ParametersValidationRequest` used in `api/parameters/*/validate` * [#4677](https://github.com/TouK/nussknacker/pull/4677) Added validation to SpEL string literal conversions (allow only constant that convert successfully) * [#4602](https://github.com/TouK/nussknacker/pull/4602) Cleaning subprocess usages after NU 1.11 release * [#4582](https://github.com/TouK/nussknacker/pull/4582) Fixed: Releasing app resources on the designer close @@ -555,9 +562,9 @@ * [#4561](https://github.com/TouK/nussknacker/pull/4561) Improvement: Users are not required at OAuth2 config file * [#4492](https://github.com/TouK/nussknacker/pull/4492) Allow testing fragments using ad hoc testing. * [#4572](https://github.com/TouK/nussknacker/pull/4572) The package of improvements: - - make the properties of the `FlinkStreamingPropertiesConfig` public, so that they can be reused - - introduce the `CaseClassTypeInfoFactory`, a generic factory for creating `CaseClassTypeInfo` - - allow passing classLoader at `ResourceLoader.load` + - make the properties of the `FlinkStreamingPropertiesConfig` public, so that they can be reused + - introduce the `CaseClassTypeInfoFactory`, a generic factory for creating `CaseClassTypeInfo` + - allow passing classLoader at `ResourceLoader.load` * [#4574](https://github.com/TouK/nussknacker/pull/4574) Improvements: at `KafkaClient` and `RichKafkaConsumer` in kafka-test-utils * [#4640](https://github.com/TouK/nussknacker/pull/4640) Expand timestamp support to handle more types/formats * [#4685](https://github.com/TouK/nussknacker/pull/4685) App API OpenAPI-based documentation (e.g. `https://demo.nussknacker.io/api/docs`) @@ -565,8 +572,8 @@ * [#4739](https://github.com/TouK/nussknacker/pull/4739) Add configuration parameter for sending additional headers to InfluxDB (`countsSettings.additionalHeaders`) * [#4762](https://github.com/TouK/nussknacker/pull/4762) Fix: RegExpParameterValidator, trimming SPeL comprehension * [#4744](https://github.com/TouK/nussknacker/pull/4744) Fix for OIDC: support for simultaneously Machine-2-Machine and Basic flow handling: - * Skip user profile call based on the fact that access token is JWT with subject and user has username configured. - * `accessTokenIsJwt` Oidc configuration introduced in [#4283](https://github.com/TouK/nussknacker/pull/4283) is removed: `audience` configuration specifies that access token is a JWT as it was before this change + * Skip user profile call based on the fact that access token is JWT with subject and user has username configured. + * `accessTokenIsJwt` Oidc configuration introduced in [#4283](https://github.com/TouK/nussknacker/pull/4283) is removed: `audience` configuration specifies that access token is a JWT as it was before this change * [#4797](https://github.com/TouK/nussknacker/pull/4797) Ability to define the name of query parameter with access token that will be passed into tabs url * [#4804](https://github.com/TouK/nussknacker/pull/4804) Improvement: Allow passing globalVariables on TestRunner @@ -576,10 +583,10 @@ - New: API changes allowing for operations on individual scenario deployments - New: SpEL templates - - Custom components can now handle parameters described in SpEL template instead of SpEL expression. It might be useful for components that mix some other language like SQL with SpEL or normal, human-readable text with elements of SpEL. Currently no components from public distribution support this feature, but it is available for component's developers. + - Custom components can now handle parameters described in SpEL template instead of SpEL expression. It might be useful for components that mix some other language like SQL with SpEL or normal, human-readable text with elements of SpEL. Currently no components from public distribution support this feature, but it is available for component's developers. - Improvement: New filter in components view allowing for displaying direct and indirect usage - Improvement: Better readability of displayed types - - For example previous `{key: String{val}}` will now be displayed as `Record{key: String(val)}` + - For example previous `{key: String{val}}` will now be displayed as `Record{key: String(val)}` - Improvement: More graceful handling of backend and network connection problems in designer - Improvement: Kafka exception handler now provides information about parent context of variables during handling errors in fragments - Fix: Handling of non-parametrized queries in SQL query enricher @@ -605,8 +612,8 @@ * [#4353](https://github.com/TouK/nussknacker/pull/4353) Removed isCancelled/isDeployed flags based on `ProcessAction`, `ProcessAction.action` renamed to actionType. Trait `Process` is removed. * [#4488](https://github.com/TouK/nussknacker/pull/4488) Fix stopping processes with `/api/adminProcessManagement/stop/{processName}` endpoint on recent Flink versions * [#4517](https://github.com/TouK/nussknacker/pull/4517) Improvement: Better readability of types display: - * values of primitive types are now displayed in parentheses - previous `String{val}` is now `String(val)` - * values of record types are now displayed with `Record` prefix - previous `{key: String{val}}` is now `Record{key: String(val)}` + * values of primitive types are now displayed in parentheses - previous `String{val}` is now `String(val)` + * values of record types are now displayed with `Record` prefix - previous `{key: String{val}}` is now `Record{key: String(val)}` ## 1.11 @@ -615,15 +622,15 @@ * [#4400](https://github.com/TouK/nussknacker/pull/4400) Improvement: Avoid long waits for closing job on test Flink minicluster * [#4435](https://github.com/TouK/nussknacker/pull/4435) Fix: handle resolving refs when parsing Swagger 2.0 schema in openapi enricher * [#4275](https://github.com/TouK/nussknacker/pull/4275) Add helper methods for use in expressions: - * `#COLLECTION`: `concat`, `merge`, `min`, `max`, `slice`, `sum`, `sortedAsc`, `sortedDesc`, `take`, `takeLast`, `join`, `product`, `diff`, `intersect`, `distinct`, `shuffle`, `flatten` - * `#UTIL`: `split` + * `#COLLECTION`: `concat`, `merge`, `min`, `max`, `slice`, `sum`, `sortedAsc`, `sortedDesc`, `take`, `takeLast`, `join`, `product`, `diff`, `intersect`, `distinct`, `shuffle`, `flatten` + * `#UTIL`: `split` * [#4315](https://github.com/TouK/nussknacker/pull/4315) Add support for test with parameters for kafka sources - FlinkKafkaSource / LiteKafkaSource. * [#4261](https://github.com/TouK/nussknacker/pull/4261) Add TestWithParametersSupport support for flink engine * [#4294](https://github.com/TouK/nussknacker/pull/4294) Allow to pass username while migrating scenario to secondary environment. * [#4265](https://github.com/TouK/nussknacker/pull/4265) Removed implicit helper methods in SpEL: sum, today, now, distinct * [#4230](https://github.com/TouK/nussknacker/pull/4230) Extend TestInfoProvider with getTestParameters to test scenarios based on window with generated fields. - * Endpoint to test scenario based on parameters - * New generic dialog to display scenario input parameters + * Endpoint to test scenario based on parameters + * New generic dialog to display scenario input parameters * [#4204](https://github.com/TouK/nussknacker/pull/4204) ProcessingTypeDataProvider has combined data being a result of all processing types * [#4219](https://github.com/TouK/nussknacker/pull/4219) Components are aware of processing data reload * [#4256](https://github.com/TouK/nussknacker/pull/4256) Ignore error message and description when comparing errors lists in model migration tests @@ -632,11 +639,11 @@ added completions for some missing types like `TimestampType` (`#inputMeta.timestampType`) * [#4290](https://github.com/TouK/nussknacker/pull/4290) Expression compilation speedup: replace most regular expression matching with plain string matching * [#4292](https://github.com/TouK/nussknacker/pull/4292) Expose more methods for use in expressions: - * `java.lang.CharSequence`: `replace` - * `java.util.Collection`: `lastIndexOf` - * `java.util.Optional`: `isEmpty` - * `scala.Option`, `scala.collection.Iterable`: `head`, `nonEmpty`, `orNull`, `tail` - * `io.circe.*` (deserialized raw JSON objects): `noSpacesSortKeys`, `spaces2SortKeys`, `spaces4SortKeys` + * `java.lang.CharSequence`: `replace` + * `java.util.Collection`: `lastIndexOf` + * `java.util.Optional`: `isEmpty` + * `scala.Option`, `scala.collection.Iterable`: `head`, `nonEmpty`, `orNull`, `tail` + * `io.circe.*` (deserialized raw JSON objects): `noSpacesSortKeys`, `spaces2SortKeys`, `spaces4SortKeys` * [#4298](https://github.com/TouK/nussknacker/pull/4298) Support arrays in `BestEffortJsonEncoder` * [#4283](https://github.com/TouK/nussknacker/pull/4283) Fix for OIDC provider access token verification. For OIDC provider, `accessTokenIsJwt` config property is introduced, with default values `false`. This change also introduced a possibility to override username incoming from OIDC provider. @@ -686,19 +693,19 @@ * [#4055](https://github.com/TouK/nussknacker/pull/4055) Performance tweaks for API operations like: process status, deploy, cancel * [#3675](https://github.com/TouK/nussknacker/pull/3675) Improvements: Normalize kafka params name * [#4101](https://github.com/TouK/nussknacker/pull/4101) Notifications fixes: - * Scenario state wasn't refreshed after deploy/cancel action was successfully finished (was only after failure) - * Notification "Deployment of ... failed ..." was presented even for cancel action + * Scenario state wasn't refreshed after deploy/cancel action was successfully finished (was only after failure) + * Notification "Deployment of ... failed ..." was presented even for cancel action * [#4102](https://github.com/TouK/nussknacker/pull/4102) Flink deploy now wait until job is started on TaskManagers before reporting that is finished - thanks to that status and versions panel are refreshed with "DEPLOYED" state in the same time * [#3992](https://github.com/TouK/nussknacker/pull/3992) Fix for compiling scenarios containing filter node with only 'false' edge * [#4127](https://github.com/TouK/nussknacker/pull/4127) ResourceLoader and bumps commons io 2.4 -> to 2.6 * [#4122](https://github.com/TouK/nussknacker/pull/4122), [#4132](https://github.com/TouK/nussknacker/pull/4132), [#4179](https://github.com/TouK/nussknacker/pull/4179), [#4189](https://github.com/TouK/nussknacker/pull/4189) - * Add state definitions to `ProcessStateDefinitionManager` - * Add `StatusResources` endpoint `/statusDefinitions` that returns state definitions with default state properties (such as displayable name, icon and description), - to allow filtering by state in UI. - * Combine statuses Failing, Failed, Error, Warning, FailedToGet and MulipleJobsRunning into one status that represents a "Problem". - Statuses `FailedStateStatus` and "Unknown" are removed. - * Status configuration for icon, tooltip and description is obligatory. + * Add state definitions to `ProcessStateDefinitionManager` + * Add `StatusResources` endpoint `/statusDefinitions` that returns state definitions with default state properties (such as displayable name, icon and description), + to allow filtering by state in UI. + * Combine statuses Failing, Failed, Error, Warning, FailedToGet and MulipleJobsRunning into one status that represents a "Problem". + Statuses `FailedStateStatus` and "Unknown" are removed. + * Status configuration for icon, tooltip and description is obligatory. * [#4100](https://github.com/TouK/nussknacker/pull/4100), [#4104](https://github.com/TouK/nussknacker/pull/4104), [#4150](https://github.com/TouK/nussknacker/pull/4150) Before the change, the scenario list for a moment presented "local" states - based only on Nussknacker's actions log. After the change, we always present state is based on engine (e.g. Flink) state - in some places like scenario list, it is cached. @@ -738,9 +745,9 @@ * [#3922](https://github.com/TouK/nussknacker/pull/3922) Bumps: jwks 0.19.0 -> 0.21.3, jackson: 2.11.3 -> 2.13.4 * [#3958](https://github.com/TouK/nussknacker/pull/3958) OpenAPI: specify Content-Type header based on schema * [#3948](https://github.com/TouK/nussknacker/pull/3948) - * Performance fix: `kafka` source on Flink engine doesn't serialize schema during record serialization - * Configuration handling fixes: `avroKryoGenericRecordSchemaIdSerialization` wasn't checked properly - * Avro: added support for top level array schema + * Performance fix: `kafka` source on Flink engine doesn't serialize schema during record serialization + * Configuration handling fixes: `avroKryoGenericRecordSchemaIdSerialization` wasn't checked properly + * Avro: added support for top level array schema * [#3972](https://github.com/TouK/nussknacker/pull/3972) Lite engine: Kafka transactions are now optional and by default disabled for Azure's Event Hubs which doesn't support them so far. For other Kafka clusters they are enabled. You can change this behavior by setting `kafkaTransactionsEnabled` configuration option @@ -752,37 +759,37 @@ * [#3560](https://github.com/TouK/nussknacker/pull/3560), [#3560](https://github.com/TouK/nussknacker/pull/3560), [#3595](https://github.com/TouK/nussknacker/pull/3595) Migrate from Flink Scala API to Java API * JSON Schema handling improvements: - * [#3687](https://github.com/TouK/nussknacker/pull/3687) Support for union types - * [#3695](https://github.com/TouK/nussknacker/pull/3695) Fixed delaying JSON records by field in universal source - * [#3699](https://github.com/TouK/nussknacker/pull/3699) Handling null on JSON schema - * [#3709](https://github.com/TouK/nussknacker/pull/3709) Support for typing `Map[String, T]` using JSON Schema. - * When `properties` are defined `additionalProperties` is ignored and type is determined by `properties` - as it was before. - * When `"additionalProperties": true` type is `Map[String, Unknown]` - * When `"additionalProperties": T` type is `Map[String, T]` - * [#3709](https://github.com/TouK/nussknacker/pull/3709) `BestEffortJsonSchemaEncoder` encodes only Strings for `"type": String` - * [#3730](https://github.com/TouK/nussknacker/pull/3730) Additional fields are not trimmed during encoding when `additionalProperties` are allowed by schema - * [#3742](https://github.com/TouK/nussknacker/pull/3742) More strict encoding - always validate against schema - * [#3749](https://github.com/TouK/nussknacker/pull/3749) More precise encoding against integer schema + * [#3687](https://github.com/TouK/nussknacker/pull/3687) Support for union types + * [#3695](https://github.com/TouK/nussknacker/pull/3695) Fixed delaying JSON records by field in universal source + * [#3699](https://github.com/TouK/nussknacker/pull/3699) Handling null on JSON schema + * [#3709](https://github.com/TouK/nussknacker/pull/3709) Support for typing `Map[String, T]` using JSON Schema. + * When `properties` are defined `additionalProperties` is ignored and type is determined by `properties` - as it was before. + * When `"additionalProperties": true` type is `Map[String, Unknown]` + * When `"additionalProperties": T` type is `Map[String, T]` + * [#3709](https://github.com/TouK/nussknacker/pull/3709) `BestEffortJsonSchemaEncoder` encodes only Strings for `"type": String` + * [#3730](https://github.com/TouK/nussknacker/pull/3730) Additional fields are not trimmed during encoding when `additionalProperties` are allowed by schema + * [#3742](https://github.com/TouK/nussknacker/pull/3742) More strict encoding - always validate against schema + * [#3749](https://github.com/TouK/nussknacker/pull/3749) More precise encoding against integer schema * Request-response JSON schema sink improvements: - * [#3607](https://github.com/TouK/nussknacker/pull/3607) Encoder based on response schema. - * [#3727](https://github.com/TouK/nussknacker/pull/3727) Sink validation changes: - * Added param `Value validation mode` - * We no longer support `nullable` param from Everit schema. Nullable schema are supported by union with null e.g. `["null", "string"]` - * [#3716](https://github.com/TouK/nussknacker/pull/3716) Allow to add additional fields also in `strict validation mode`, if schema permits them. - * [#3722](https://github.com/TouK/nussknacker/pull/3722) Validation of JSON schema with additionalProperties + * [#3607](https://github.com/TouK/nussknacker/pull/3607) Encoder based on response schema. + * [#3727](https://github.com/TouK/nussknacker/pull/3727) Sink validation changes: + * Added param `Value validation mode` + * We no longer support `nullable` param from Everit schema. Nullable schema are supported by union with null e.g. `["null", "string"]` + * [#3716](https://github.com/TouK/nussknacker/pull/3716) Allow to add additional fields also in `strict validation mode`, if schema permits them. + * [#3722](https://github.com/TouK/nussknacker/pull/3722) Validation of JSON schema with additionalProperties * [#3707](https://github.com/TouK/nussknacker/pull/3707), [#3719](https://github.com/TouK/nussknacker/pull/3719), [#3692](https://github.com/TouK/nussknacker/pull/3692), [#3656](https://github.com/TouK/nussknacker/pull/3656), [#3776](https://github.com/TouK/nussknacker/pull/3776), [#3786](https://github.com/TouK/nussknacker/pull/3786) Improvements in OpenAPI: - * Support for OpenAPI 3.1.0 - * Basic support for type references in JSON schemas - * Better logging from OpenAPI enrichers - * Handling of API Keys in query parameter and cookie - * It's possible to configure which HTTP codes (404 by default) can be used as successful, empty response - * Documentation link is taken from global configuration, if operation doesn't provide one - * Handle recursive schemas gracefully (we fall back to Unknown type on recursion detected) + * Support for OpenAPI 3.1.0 + * Basic support for type references in JSON schemas + * Better logging from OpenAPI enrichers + * Handling of API Keys in query parameter and cookie + * It's possible to configure which HTTP codes (404 by default) can be used as successful, empty response + * Documentation link is taken from global configuration, if operation doesn't provide one + * Handle recursive schemas gracefully (we fall back to Unknown type on recursion detected) * Upgrades: - * [#3738](https://github.com/TouK/nussknacker/pull/3738) Kafka 3.2.3 - * [#3683](https://github.com/TouK/nussknacker/pull/3683) Flink 1.16 + * [#3738](https://github.com/TouK/nussknacker/pull/3738) Kafka 3.2.3 + * [#3683](https://github.com/TouK/nussknacker/pull/3683) Flink 1.16 * [#3524](https://github.com/TouK/nussknacker/pull/3524) Change base Docker image to eclipse temurin due to openjdk deprecation. * [#3606](https://github.com/TouK/nussknacker/pull/3606) Removed nussknacker-request-response-app. See MigrationGuide for details. @@ -797,8 +804,8 @@ * [#3733](https://github.com/TouK/nussknacker/pull/3733) Fix for: some validation (e.g. Flink scenario name validation) were causing error message blinking in scenario properties. * [#3752](https://github.com/TouK/nussknacker/pull/3752) Do not specify migrations which did not change process in process migration comment. If no migrations, do not add comment. * [#3754](https://github.com/TouK/nussknacker/pull/3754) Fix for migrating scenarios not existing on target environment [#3700](https://github.com/TouK/nussknacker/issues/3700) - * Will work after upgrading NU installations on both environments to version containing the fixup. - * In conversation between versions 1.6 - 1.7 (and reversed) only migration of scenarios that exists on both envs will work. + * Will work after upgrading NU installations on both environments to version containing the fixup. + * In conversation between versions 1.6 - 1.7 (and reversed) only migration of scenarios that exists on both envs will work. ## 1.6 @@ -830,8 +837,8 @@ after entering to node edition they were disappearing. Now this transient situation is replaced by well-prepared form with whole necessary parameters. * [#3493](https://github.com/TouK/nussknacker/pull/3493), [#3582](https://github.com/TouK/nussknacker/pull/3582) Methods added to to `DeploymentManagerProvider`: - * `additionalPropertiesConfig`, which allows to configure additional scenario properties programmatically. - * `additionalValidators`, which allows to define DeploymentManager-specific validators. + * `additionalPropertiesConfig`, which allows to configure additional scenario properties programmatically. + * `additionalValidators`, which allows to define DeploymentManager-specific validators. * [#3505](https://github.com/TouK/nussknacker/pull/3505) Bump node version to 16.5.1 * [#3506](https://github.com/TouK/nussknacker/pull/3506) Fix date formatting to use client timezone * [#3542](https://github.com/TouK/nussknacker/pull/3542) Feature: properties validation and properties additional info @@ -889,11 +896,11 @@ [#3299](https://github.com/TouK/nussknacker/pull/3299) [#3309](https://github.com/TouK/nussknacker/pull/3309) [#3316](https://github.com/TouK/nussknacker/pull/3316) [#3322](https://github.com/TouK/nussknacker/pull/3322) [#3337](https://github.com/TouK/nussknacker/pull/3337) [#3287](https://github.com/TouK/nussknacker/pull/3287) Universal Kafka source/sink, handling multiple scenarios like: Avro message for Avro schema, JSON message for JSON schema. Legacy, low level Kafka components can be turned on by new lowLevelComponentsEnabled flag - * [#3317](https://github.com/TouK/nussknacker/pull/3317) Support JSON Schema in universal source - * [#3332](https://github.com/TouK/nussknacker/pull/3332) Config option to handle JSON payload with Avro schema - * [#3354](https://github.com/TouK/nussknacker/pull/3354) Universal source optimization - if message without schemaId, using cache when getting one - * [#3346](https://github.com/TouK/nussknacker/pull/3346) UniversalKafkaSink provides also 'raw editor' - * [#3345](https://github.com/TouK/nussknacker/pull/3345) Swagger 2.2.1, OpenAPI 3.1, JSON Schema typing and deserialization same as in OpenAPI components + * [#3317](https://github.com/TouK/nussknacker/pull/3317) Support JSON Schema in universal source + * [#3332](https://github.com/TouK/nussknacker/pull/3332) Config option to handle JSON payload with Avro schema + * [#3354](https://github.com/TouK/nussknacker/pull/3354) Universal source optimization - if message without schemaId, using cache when getting one + * [#3346](https://github.com/TouK/nussknacker/pull/3346) UniversalKafkaSink provides also 'raw editor' + * [#3345](https://github.com/TouK/nussknacker/pull/3345) Swagger 2.2.1, OpenAPI 3.1, JSON Schema typing and deserialization same as in OpenAPI components * [#3249](https://github.com/TouK/nussknacker/pull/3249) Confluent 5.5->7.2, avro 1.9->1.11 bump * [#3250](https://github.com/TouK/nussknacker/pull/3250) [#3302](https://github.com/TouK/nussknacker/pull/3302) Kafka 2.4 -> 2.8, Flink 1.14.4 -> 1.14.5 @@ -948,10 +955,10 @@ * [#2773](https://github.com/TouK/nussknacker/pull/2773) Using VersionId / ProcessId / ProcessName instead of Long or String * [#2830](https://github.com/TouK/nussknacker/pull/2830) `RunMode` is renamed to `ComponanteUseCase` and `Normal` value is split into: `EngineRuntime`, `Validation`, `ServiceQuery`, `TestDataGeneration`. `RunMode.Test` becomes `ComponanteUseCase.TestRuntime` * [#2825](https://github.com/TouK/nussknacker/pull/2825), [#2868](https://github.com/TouK/nussknacker/pull/2868), [#2907](https://github.com/TouK/nussknacker/pull/2907) API refactorings: - * Division of API by usage: `nussknacker-components-api`, - `nussknacker-scenario-api`, `nussknacker-extensions-api` - * API cleanup, some classes moved to `utils` or `interpreter`, - untangling dependencies, see [migration guide](MigrationGuide.md) for the details + * Division of API by usage: `nussknacker-components-api`, + `nussknacker-scenario-api`, `nussknacker-extensions-api` + * API cleanup, some classes moved to `utils` or `interpreter`, + untangling dependencies, see [migration guide](MigrationGuide.md) for the details * [#2886](https://github.com/TouK/nussknacker/pull/2886) Add explicit serialVersionUID for classes registered by `Serializers.registerSerializers`. * [#2887](https://github.com/TouK/nussknacker/pull/2887) Request-Response engine in embedded mode * [#2890](https://github.com/TouK/nussknacker/pull/2890) Fixed displaying configured labels for node details fields. @@ -966,10 +973,10 @@ * Added component tab * [#2537](https://github.com/TouK/nussknacker/pull/2537) Refactoring of `LazyParameter` API: - * `map`, `product` and `pure` methods don't require `LazyParameterInterpreter` implicit parameter anymore: can be used in other place then `LazyParameterInterpreterFunction` - * `pure` method moved to `LazyParameter` companion object - * new `sequence` method added to `LazyParameter` companion object - * `map` method now takes `TypingResult => TypingResult` instead of just `TypingResult` to be visible what is relation between input and output type + * `map`, `product` and `pure` methods don't require `LazyParameterInterpreter` implicit parameter anymore: can be used in other place then `LazyParameterInterpreterFunction` + * `pure` method moved to `LazyParameter` companion object + * new `sequence` method added to `LazyParameter` companion object + * `map` method now takes `TypingResult => TypingResult` instead of just `TypingResult` to be visible what is relation between input and output type * [#2535](https://github.com/TouK/nussknacker/pull/2535), [#2625](https://github.com/TouK/nussknacker/pull/2625) Rename `standalone` to `request-response`, move request-response modules to `base` dir. Also - small refactorings in the engine and configuration format * [#2483](https://github.com/TouK/nussknacker/pull/2483) Embedded DeploymentManager for Lite Streaming. @@ -982,9 +989,9 @@ * [#2651](https://github.com/TouK/nussknacker/pull/2651) Fixed behaviour of fragments which use components which clear context. * [#2564](https://github.com/TouK/nussknacker/pull/2564) Flink union simplification, it now takes only 'Output expression' parameters for branches (previously 'value' parameter), output variable must be of the same type * [#2671](https://github.com/TouK/nussknacker/pull/2671) Bumped libs: - * akka 2.15 -> 2.16 - * akka-http 10.1 -> 10.2 - * akka-http-circe 1.28 -> 1.38 + * akka 2.15 -> 2.16 + * akka-http 10.1 -> 10.2 + * akka-http-circe 1.28 -> 1.38 * [#2684](https://github.com/TouK/nussknacker/pull/2684) Handled 'Restarting' state in Embedded DeploymentManager when the embedded scenario is failing * [#2686](https://github.com/TouK/nussknacker/pull/2686) Rename `ServiceWithStaticParameters` to `EagerServiceWithStaticParameters` to avoid confusion about lazy and eager parameters used by default * [#2695](https://github.com/TouK/nussknacker/pull/2695) Replaced `nodeId` with `NodeComponentInfo` in `NuExceptionInfo` @@ -1017,11 +1024,11 @@ a custom DB metadata provider that extends the standard JDBC Driver with missing features. * [#2301](https://github.com/TouK/nussknacker/pull/2301) [#2366](https://github.com/TouK/nussknacker/pull/2366) [#2409](https://github.com/TouK/nussknacker/pull/2409) [#2477](https://github.com/TouK/nussknacker/pull/2477) Simplification of component API: - * `GenericNodeTransformation.initialParameters` was removed - * `GenericNodeTransformation.fallbackFinalResult` introduced for not handle step, with default graceful strategy - * `GenericNodeTransformation.contextTransformation` now handles `ParameterValidator` properly. Invalid value is handled as `FailedToDefineParameter` - and `GenericNodeTransformation.implementation` is not invoked in this case - * `FinalResults.forValidation` utility method added to easily handle situation when you need to make some validation on context of variables (e.g. add variable checking if it already exists) + * `GenericNodeTransformation.initialParameters` was removed + * `GenericNodeTransformation.fallbackFinalResult` introduced for not handle step, with default graceful strategy + * `GenericNodeTransformation.contextTransformation` now handles `ParameterValidator` properly. Invalid value is handled as `FailedToDefineParameter` + and `GenericNodeTransformation.implementation` is not invoked in this case + * `FinalResults.forValidation` utility method added to easily handle situation when you need to make some validation on context of variables (e.g. add variable checking if it already exists) * [#2245](https://github.com/TouK/nussknacker/pull/2245) Periodic process scheduler retries failed scenario deployments based on PeriodicBatchConfig. Breaking change in PeriodicProcessListener FailedEvent. Failed event is split into FailedOnDeployEvent and FailedOnRunEvent. Please note that this mechanism only retries when failure on deployment occurs - failure recovery of running scenario should be handled by [restart strategy](https://docs.nussknacker.io/docs/installation_configuration_guide/ModelConfiguration#configuring-restart-strategies-flink-only) @@ -1038,10 +1045,10 @@ * [#2305](https://github.com/TouK/nussknacker/pull/2305) Enhancement: change `processingTypeToDashboard` configuration to `scenarioTypeToDashboard` * [#2374](https://github.com/TouK/nussknacker/pull/2374) Auto-loaded `ComponentProvider`s * [#2337](https://github.com/TouK/nussknacker/pull/2337) Extract base engine from standalone - * Common functionality of base engine (i.e. microservice based, without Flink) is extracted to `base-api` and `base-runtime` - * It's possible to use generic effect type instead of `Future` - * Possibility to accumulate errors - * New API for custom components (transformers and sinks) + * Common functionality of base engine (i.e. microservice based, without Flink) is extracted to `base-api` and `base-runtime` + * It's possible to use generic effect type instead of `Future` + * Possibility to accumulate errors + * New API for custom components (transformers and sinks) * [#2349](https://github.com/TouK/nussknacker/pull/2349) Removed module `queryable-state`, `FlinkQueryableClient` was moved to `nussknacker-flink-manager`. * `PrettyValidationErrors`, `CustomActionRequest` and `CustomActionResponse` moved from `nussknacker-ui` to `nussknacker-restmodel`. * [#2361](https://github.com/TouK/nussknacker/pull/2361) Removed `security` dependency from `listener-api`. `LoggedUser` replaced with dedicated class in `listener-api`. @@ -1075,53 +1082,53 @@ * [#2104](https://github.com/TouK/nussknacker/pull/2104) SQL component can retrieve table names for completion * [#2028](https://github.com/TouK/nussknacker/pull/2028) Limit (row and bytes) for generating and using test data * Various improvements in security/OAuth components - * [#2042](https://github.com/TouK/nussknacker/pull/2042) `redirectUrl` is optional - * [#2070](https://github.com/TouK/nussknacker/pull/2070) separate, easy to use OIDC `AuthenticationProvider` - * [#2079](https://github.com/TouK/nussknacker/pull/2079) anonymous access for OAuth2 - * [#2093](https://github.com/TouK/nussknacker/pull/2093) appending role claims from OAuth2 token - * [#1933](https://github.com/TouK/nussknacker/pull/1933) being able to configure own FE `AuthenticationProvider` with module federation + * [#2042](https://github.com/TouK/nussknacker/pull/2042) `redirectUrl` is optional + * [#2070](https://github.com/TouK/nussknacker/pull/2070) separate, easy to use OIDC `AuthenticationProvider` + * [#2079](https://github.com/TouK/nussknacker/pull/2079) anonymous access for OAuth2 + * [#2093](https://github.com/TouK/nussknacker/pull/2093) appending role claims from OAuth2 token + * [#1933](https://github.com/TouK/nussknacker/pull/1933) being able to configure own FE `AuthenticationProvider` with module federation * [#2046](https://github.com/TouK/nussknacker/pull/2046) Additional functions in generic model * Security improvements: - * [#2067](https://github.com/TouK/nussknacker/pull/2067) Blocking dangerous methods in SpEL in runtime - * [#1966](https://github.com/TouK/nussknacker/pull/1966) Disable dynamic property access by default - * [#1909](https://github.com/TouK/nussknacker/pull/1909) Static method validation - * [#1922](https://github.com/TouK/nussknacker/pull/1922) Block method invocation on `Unknown` + * [#2067](https://github.com/TouK/nussknacker/pull/2067) Blocking dangerous methods in SpEL in runtime + * [#1966](https://github.com/TouK/nussknacker/pull/1966) Disable dynamic property access by default + * [#1909](https://github.com/TouK/nussknacker/pull/1909) Static method validation + * [#1922](https://github.com/TouK/nussknacker/pull/1922) Block method invocation on `Unknown` * [#2095](https://github.com/TouK/nussknacker/pull/2095) Remove business view * [#2110](https://github.com/TouK/nussknacker/pull/2110) Remove node grouping * [#2098](https://github.com/TouK/nussknacker/pull/2098) Correct timestamps for tests of Kafka sources * [#2108](https://github.com/TouK/nussknacker/pull/2108) Enhanced class extraction settings, fewer unnecessary methods * [#2191](https://github.com/TouK/nussknacker/pull/2191) KafkaAvroSink performance fix * UI enhancements: - * [#1706](https://github.com/TouK/nussknacker/pull/1706) New window manager, consistent behaviour, many improvements, - e.g. modals can be expanded to full screen, fix display of fragments in FF - * [#2184](https://github.com/TouK/nussknacker/pull/2184), [#2101](https://github.com/TouK/nussknacker/pull/2101) Fix undo breaking UI in certain circumstances - * [#2181](https://github.com/TouK/nussknacker/pull/2181), [#1975](https://github.com/TouK/nussknacker/pull/1975) Remove spurious 'unsaved changes' after opening aggregation nodes - * [#2202](https://github.com/TouK/nussknacker/pull/2202) Correct hashes of FE assets - * [#2097](https://github.com/TouK/nussknacker/pull/2097), [#2178](https://github.com/TouK/nussknacker/pull/2178) Pasting nodes in correct places - * [#2003](https://github.com/TouK/nussknacker/pull/2003) Counts dialog fixes: timezone handling, datepicker allows editing from keyboard - * [#2111](https://github.com/TouK/nussknacker/pull/2111) Correct graph display after opening fragment - * [#2087](https://github.com/TouK/nussknacker/pull/2087) Pan and zoom animation - * [#2081](https://github.com/TouK/nussknacker/pull/2081) Fix switch behaviour after changing condition - * [#2071](https://github.com/TouK/nussknacker/pull/2071) Fix pasting cell on multiple edges - * [#1978](https://github.com/TouK/nussknacker/pull/1978) Removed unclear node details panel + * [#1706](https://github.com/TouK/nussknacker/pull/1706) New window manager, consistent behaviour, many improvements, + e.g. modals can be expanded to full screen, fix display of fragments in FF + * [#2184](https://github.com/TouK/nussknacker/pull/2184), [#2101](https://github.com/TouK/nussknacker/pull/2101) Fix undo breaking UI in certain circumstances + * [#2181](https://github.com/TouK/nussknacker/pull/2181), [#1975](https://github.com/TouK/nussknacker/pull/1975) Remove spurious 'unsaved changes' after opening aggregation nodes + * [#2202](https://github.com/TouK/nussknacker/pull/2202) Correct hashes of FE assets + * [#2097](https://github.com/TouK/nussknacker/pull/2097), [#2178](https://github.com/TouK/nussknacker/pull/2178) Pasting nodes in correct places + * [#2003](https://github.com/TouK/nussknacker/pull/2003) Counts dialog fixes: timezone handling, datepicker allows editing from keyboard + * [#2111](https://github.com/TouK/nussknacker/pull/2111) Correct graph display after opening fragment + * [#2087](https://github.com/TouK/nussknacker/pull/2087) Pan and zoom animation + * [#2081](https://github.com/TouK/nussknacker/pull/2081) Fix switch behaviour after changing condition + * [#2071](https://github.com/TouK/nussknacker/pull/2071) Fix pasting cell on multiple edges + * [#1978](https://github.com/TouK/nussknacker/pull/1978) Removed unclear node details panel ## 0.4 ### 0.4.0 (12 Aug 2021) * More precise TypeInformation generation - * [#1338](https://github.com/TouK/nussknacker/pull/1338) Defining TypeInformation based on TypingResult - * [#1343](https://github.com/TouK/nussknacker/pull/1343) Aggregators compute stored types - * [#1343](https://github.com/TouK/nussknacker/pull/1359) Improvements in variable output validation - * [#1360](https://github.com/TouK/nussknacker/pull/1360) Service query can use global variables - * [#1375](https://github.com/TouK/nussknacker/pull/1375) Opt-in for new TypeInformation detection for inter operator serialization + * [#1338](https://github.com/TouK/nussknacker/pull/1338) Defining TypeInformation based on TypingResult + * [#1343](https://github.com/TouK/nussknacker/pull/1343) Aggregators compute stored types + * [#1343](https://github.com/TouK/nussknacker/pull/1359) Improvements in variable output validation + * [#1360](https://github.com/TouK/nussknacker/pull/1360) Service query can use global variables + * [#1375](https://github.com/TouK/nussknacker/pull/1375) Opt-in for new TypeInformation detection for inter operator serialization * [#1361](https://github.com/TouK/nussknacker/pull/1361) Lazy vars removal * [#1363](https://github.com/TouK/nussknacker/pull/1363) Open/close only services that are actually used in process * [#1367](https://github.com/TouK/nussknacker/pull/1367) Custom actions - first, experimental version * Migration of CI to github actions - * [#1368](https://github.com/TouK/nussknacker/pull/1368) Publish Docker images/jars via GH actions (experimental) - * [#1381](https://github.com/TouK/nussknacker/pull/1381) Use GH Actions for coverage - * [#1383](https://github.com/TouK/nussknacker/pull/1383) Switch github badges + * [#1368](https://github.com/TouK/nussknacker/pull/1368) Publish Docker images/jars via GH actions (experimental) + * [#1381](https://github.com/TouK/nussknacker/pull/1381) Use GH Actions for coverage + * [#1383](https://github.com/TouK/nussknacker/pull/1383) Switch github badges * [#1382](https://github.com/TouK/nussknacker/pull/1382) First E2E FE tests * [#1373](https://github.com/TouK/nussknacker/pull/1373) Ability to load custom model config programmatically * [#1406](https://github.com/TouK/nussknacker/pull/1406) Eager services - ability to create service object using static parameters @@ -1158,16 +1165,16 @@ Run mode is can be declared as a dependency in generic node transformations. Nodes created via `@MethodToInvoke` can declare `RunMode` as an implicit parameter. `RunMode` is also available in `FlinkCustomNodeContext`. * Various naming changes: - * [#1917](https://github.com/TouK/nussknacker/pull/1917) configuration of `engineConfig` to `deploymentConfig` - * [#1911](https://github.com/TouK/nussknacker/pull/1911) Rename `process` to `scenario`, `subprocess` to `fragment` in messages at backend and some test cases names - * [#1921](https://github.com/TouK/nussknacker/pull/1921) `ProcessManager` to `DeploymentManager` - * [#1927](https://github.com/TouK/nussknacker/pull/1927) Rename `outer-join` to `single-side-join` + * [#1917](https://github.com/TouK/nussknacker/pull/1917) configuration of `engineConfig` to `deploymentConfig` + * [#1911](https://github.com/TouK/nussknacker/pull/1911) Rename `process` to `scenario`, `subprocess` to `fragment` in messages at backend and some test cases names + * [#1921](https://github.com/TouK/nussknacker/pull/1921) `ProcessManager` to `DeploymentManager` + * [#1927](https://github.com/TouK/nussknacker/pull/1927) Rename `outer-join` to `single-side-join` * Performance fixes: - * [#1330](https://github.com/TouK/nussknacker/pull/1330) Multiple times parsing expressions in map/product LazyParameter - * [#1331](https://github.com/TouK/nussknacker/pull/1331) LoggingListener caches loggers - * [#1334](https://github.com/TouK/nussknacker/pull/1334) Type promotion cache - * [#1335](https://github.com/TouK/nussknacker/pull/1335) Omitting zeros for sum aggregate to avoid unnecessary buckets - * [#1336](https://github.com/TouK/nussknacker/pull/1336) Aggregation metrics + * [#1330](https://github.com/TouK/nussknacker/pull/1330) Multiple times parsing expressions in map/product LazyParameter + * [#1331](https://github.com/TouK/nussknacker/pull/1331) LoggingListener caches loggers + * [#1334](https://github.com/TouK/nussknacker/pull/1334) Type promotion cache + * [#1335](https://github.com/TouK/nussknacker/pull/1335) Omitting zeros for sum aggregate to avoid unnecessary buckets + * [#1336](https://github.com/TouK/nussknacker/pull/1336) Aggregation metrics * [#1321](https://github.com/TouK/nussknacker/pull/1321) Exception handler accessible via custom node context, Avro record encoding errors reported by exception handler ## 0.3 diff --git a/utils/test-utils/src/main/scala/pl/touk/nussknacker/test/RandomImplicits.scala b/utils/test-utils/src/main/scala/pl/touk/nussknacker/test/RandomImplicits.scala index 5b9f5c2ae0d..e0e8c01b80d 100644 --- a/utils/test-utils/src/main/scala/pl/touk/nussknacker/test/RandomImplicits.scala +++ b/utils/test-utils/src/main/scala/pl/touk/nussknacker/test/RandomImplicits.scala @@ -15,8 +15,10 @@ object RandomImplicits { def nextString(): String = randomString(MinStringLength + rand.nextInt(MaxStringLength - MinStringLength)) - def randomString(length: Int): String = - (0 until length).map(_ => AllowedStringLetters(rand.nextInt(AllowedStringLetters.length))).mkString + def randomString(length: Int): String = { + require(length >= 0, "Length must be non-negative") ∑ + (0 until length).map(_ => AllowedStringLetters(rand.nextInt(AllowedStringLetters.length))).mkString + } }