0.10.9
What is it?
Izumi (jp. 泉水, spring) is an ecosystem of independent libraries and frameworks allowing you to significantly increase productivity of your Scala development.
including the following components:
- distage – Transparent and debuggable Dependency Injection framework for pure FP Scala,
- distage-testkit – Hyper-pragmatic pure FP Test framework. Shares heavy resources globally across all test suites; lets you easily swap implementations of component; uses your effect type for parallelism.
- distage-framework-docker – A distage extension for using docker containers in tests or for local application runs, comes with example Postgres, Cassandra, Kafka & DynamoDB containers.
- LogStage – Automatic structural logs from Scala string interpolations,
- BIO - A typeclass hierarchy for tagless final style with Bifunctor and Trifunctor effect types. Focused on ergonomics and ease of use with zero boilerplate.
- izumi-reflect (moved to zio/izumi-reflect) - Portable, lightweight and kind-polymorphic alternative to
scala-reflect
's Typetag for Scala, Scala.js, Scala Native and (soon) Dotty - IdeaLingua (moved to 7mind/idealingua-v1) – API Definition, Data Modeling and RPC language, optimized for fast prototyping – like gRPC or Swagger, but with a human face. Generates RPC servers and clients for Go, TypeScript, C# and Scala,
- Opinionated SBT plugins (moved to 7mind/sbtgen) – Reduces verbosity of SBT builds and introduces new features – inter-project shared test scopes and BOM plugins (from Maven)
- Percept-Plan-Execute-Repeat (PPER) – A pattern that enables modeling very complex domains and orchestrate deadly complex processes a lot easier than you're used to.
Changes since 0.10.8
distage-testkit:
- Smart merging of memoization environments by @Caparow (#1072)
distage-testkit
allows designating components asmemoization roots
, these 'memoized' components will then be instantiated just before all tests start and shared between them. In practice, becauseTestConfig
allows overriding component implementations and changing dependency injection parameters, memoized components couldn't be safely shared between tests with differentTestConfig
s; to mitigate that, nearly any difference inTestConfig
fields between tests would result in creation of a separatememoization environment
that would reacquire global resources again. This split of memoization environments meant it was hard to ensure global sharing and easy to break it. e.g. by usingTestConfig#moduleOverrides
to override a component implementation within a suite.- New smart merging strategy solved this brittleness by changing the criteria for splitting into multiple environments. Instead of splitting by the input (TestConfig) in fear of potential changes to the output (the shared components sub-graph), we first compute the dependency injection plan for all
TestConfig
s and then compare the results - if the plans are equal we can safely conclude that the output object graphs will be equal as well and merge the memoization environments. In practice this means that now, inversely, nearly all changes toTestConfig
will NOT cause global component sharing to break, unless they directly affect thememoization root
components OR their dependencies.
- New smart merging strategy solved this brittleness by changing the criteria for splitting into multiple environments. Instead of splitting by the input (TestConfig) in fear of potential changes to the output (the shared components sub-graph), we first compute the dependency injection plan for all
- Added option to specify a fixed level of parallelism for tests, suites and memoization environments in
TestConfig
in addition to unlimited parallelism / sequential only execution. by @Caparow (#1064) - New logs were added to enumerate the memoization environments and the suite classes included in them.
distage-framework-docker:
- Randomized port numbers are now passed into docker containers as environment variables of form
export DISTAGE_PORT_TCP_8080=38553
where 8080 is the exposed port. by @Caparow (#1079) - Added
ElasticMQDocker
for softwaremill/elasticmq as a usage example for port environment variables. by @Caparow (#1079) ContainerConfig#cmd
was renamedContainerConfig#entrypoint
by @Caparow (#1079)- Use default
Docker.ClientConfig
ifdocker
config section is not found instead of failing (#1075) DockerContainerModule
was renamed toDockerSupportModule
(#1070)
distage-extension-config:
- Add
makeConfigWithDefault
,wireConfig
,wireConfigWithDefault
toConfigModuleDef
(#1075)
distage-core:
GCMode
was renamed toRoots
(#1059)- add
DIKey.apply
short-hand (writeDIKey[T]
/DIKey[T]("x")
instead ofDIKey.get[T]
/DIKey.get[T].named("x")
) (#1059)
Pull requests merged since 0.10.8:
- distage-testkit-scalatest: Add ability to alter test discovery configuration in SBT runner (#1080)
- distage-testkit-docker: Pass bind ports into container env. Fix entrypoint builder. (#1079)
- distage-testkit: add config for parallelism level (#1078)
- distage-testkit: Fix merged environments mixing up correct Activations for tests (#1077)
- Remove deprecated method
addImplicit[T](name)
(replaced byaddImplicit[T].named(name)
) (#1076) - remove inter-test dependencies on distage-core/test module to build more modules in parallel (#1064)
- distage-testkit: Add
TestConfig#debugOutput
, renameTestConfig#testRunnerLogLevel
->logLevel
, choose lowestlogLevel
among all tests envs for test runner logs (allow silencing config load log). (#1074) - distage-framework-docker: Use default
Docker.ClientConfig
if dockerconfig section is not found, addmakeConfigWithDefault
,wireConfig
,wireConfigWithDefault
toConfigModuleDef
(#1075) - distage-testkit: Smart memoization group merging. (#1072)
- Add BIOParallel to ZIODIEffectModule
- Use
FiniteDuration
in PortCheck instead (#1071) - distage-framework-docker: rename DockerContainerModule to DockerSupportModule (#1070)
- Rename
PortCheck#timeout
toPortCheck#timeoutMillis
(#1069) - Update zio to 1.0.0-RC19-2 (#1068)
- distage-framework-docker: alias Config object in ContainerDef/NetworkDef to not force imports of ContainerConfig (#1065)
- Rename GCMode to Roots (#1059)
- Update izumi-reflect to 1.0.0-M2 (#1062)