Twitter Util v21.9.0 Release Notes

  • ๐Ÿ†• New Features

    
    * util-jvm: Experimentally crossbuilds with Scala 3. ``PHAB_ID=D728602``
    
    * util-stats: Counter, Gauge, and Stat can be instrumented with descriptions. ``PHAB_ID = D615481``
    
    * util-cache: Experimentally crossbuilds with Scala 3. ``PHAB_ID=D714304``.
    
    * util-cache-guava: Experimentally crossbuilds with Scala 3. ``PHAB_ID=D716101``.
    
    * util-routing: Experimentally crossbuilds with Scala 3. ``PHAB_ID=D727120``
    
    * util-sl4j-api: Experimentally crossbuilds with Scala 3. ``PHAB_ID=D725491``
    
    * util-sl4j-jul-bridge: Experimentally crossbuilds with Scala 3. ``PHAB_ID=D726468``
    
    * util-stats: Experimentally crossbuilds with Scala 3. ``PHAB_ID=D720514``
    
    * โœ… util-zk-test: Experimentally crossbuilds with Scala 3. ``PHAB_ID=D720603``
    
    * ๐Ÿ“œ util-app: Flags parsing will now roll-up multiple flag parsing errors into a single
      error message. When an error is encountered, flag parsing will continue to collect parse error
      information instead of escaping on the first flag failure. After parsing all flags, if any errors
      are present, a message containing all of the failed flags and their error reason,
      along with the `help` usage message will be emitted. ```PHAB_ID=D729700``
    
    โš™ Runtime Behavior Changes
    
    • util: Bump version of Jackson to 2.11.4. PHAB_ID=D727879

    • util: Bump version of json4s to 3.6.11. PHAB_ID=D729764

    ๐Ÿ’ฅ Breaking API Changes

    
    * util-app: the `c.t.app.App#flags` field is now a `final def` instead of a `val` to address
      `override val` scenarios where the `c.t.app.App#flags` are accessed as part of construction,
      resulting in a NullPointerException due to access ordering issues.
      The `c.t.app.Flags` class is now made final. The `c.t.app.App#name` field has changed from
      a `val` and is now a `def`. A new `c.t.app.App#includeGlobalFlags` def has been exposed, which
      defaults to `true`. The `c.t.app#includeGlobalFlags` def can be overridden to `false`
      (ex: `override protected def includeGlobalFlags: Boolean = false`) in order to skip discovery
      of `GlobalFlag`s during flag parsing. ```PHAB_ID=D723956``