All Versions
101
Latest Version
Avg Release Cycle
30 days
Latest Release
79 days ago

Changelog History
Page 1

  • v20.5.0

    May 19, 2020

    ➕ Added

    
    * 🚚 inject-mdc: Move MDC integration from `inject/inject-slf4j` to `inject/inject-mdc`.
      ``PHAB_ID=D485870``
    
    * ⚡️ finatra-http|finatra-thrift: Update TraceIdMDCFilter to log traceSampled and traceSpanId
      ``PHAB_ID=472013``
    
    * finatra-examples: Ensure there are Java and Scala examples for the different
      types of applications and servers which can be built with Finatra. Update `/examples`
      directory layout for discoverability and consistency. ``PHAB_ID=D469677``
    
    
    🔄 Changed
    
    • 🚚 inject-slf4j: Move MDC integration from inject/inject-slf4j to inject/inject-mdc. PHAB_ID=D485870

    • finatra-http: Allow extensions of the c.t.finatra.http.filters.HttpResponseFilter to specify how to set the Location Header value into a Response. Additionally, don't allow exceptions resulting from the inability to set a non-compliant 'Location' response header escape the filter. PHAB_ID=D483793

    • inject-core: Make flag methods in c.t.inject.TwitterModule public an final. PHAB_ID=D484168

    • 🗄 inject-core: c.t.inject.Mockito has been marked deprecated. Users are encouraged to prefer mockito-scala <https://github.com/mockito/mockito-scala>_ (or ScalaTest MockitoSugar <http://doc.scalatest.org/3.1.1/#org.scalatest.mock.MockitoSugar>_ which provides some basic syntax sugar for Mockito). PHAB_ID=D482531

    • ⚡️ http: (BREAKING API CHANGE) Update the c.t.finatra.http.HttpResponseFilter to optionally fully qualify response 'Location' header values. A previous change <https://github.com/twitter/finatra/commit/ff9acc9fbf4e89b532df9daf2b9cba6d90b2df96>_ made the filter always attempt to fully qualify any response 'Location' header value. This updates the logic to be opt-in for the more strict returning of fully qualified 'Location' header values with the default being to allow relative values per the RFC7231 <https://tools.ietf.org/html/rfc7231#section-7.1.2>_ which replaces the obsolete RFC2616 <https://tools.ietf.org/html/rfc2616#section-14.30>_. This is thus a breaking API change as the default is now to allow relative values. To enable the previous strict behavior, users should instantiate the filter with the constructor arg fullyQualifyLocationHeader set to 'true'. This addresses issue #524. PHAB_ID=D467909

    • 🚚 jackson: Remove deprecated FinatraObjectMapper and FinatraJacksonModule. Users are encouraged to switch to the equivalent c.t.finatra.jackson.ScalaObjectMapper and c.t.finatra.jackson.modules.ScalaObjectMapperModule. PHAB_ID=D473177

    • ⚡️ finatra-http: Update c.t.finatra.http.StreamingJsonTestHelper to not use Thread.sleep for writing JSON elements on an artificial delay. PHAB_ID=D470793

    • 🚚 inject-app: Remove finagle-core dependency. Introduce finatra/inject/inject-dtab. PHAB_ID=D474298

    • finatra: Bump version of Jackson to 2.11.0. PHAB_ID=D457496

    • finatra-http: Only create EnrichedResponse counters when needed. Any "service/failure" response counters will only be generated upon first failure and not eagerly for each response generated. This change impacts users who expect a counter value of 0 when no response failures have been encountered - now the counter will not exist until the first failure has been recorded. PHAB_ID=D474918

    • finatra: Bump version of Joda-Time to 2.10.6. PHAB_ID=D473522

    🛠 Fixed

    
    * inject-thrift-client: Convert non-camel case `ThriftMethod` names, e.g., "get_tweets" to
      camelCase, e.g., "getTweets" for reflection lookup of generated `ReqRepServicePerEndpoint`
      interface methods in `c.t.inject.thrift.filters.DarkTrafficFilter`. ``PHAB_ID=D478104``
    
  • v20.4.1

    April 26, 2020

    ➕ Added

    
    * 0️⃣ inject-app: Add default type conversions for `java.time.LocalTime`, `c.t.util.Time`,
      `java.net.InetSocketAddress`, and `c.t.util.StorageUnit`. This allows the injector to convert from
      a String representation to the given type. The type conversion for `java.net.InetSocketAddress`
      uses the `c.t.app.Flaggable.ofInetSocketAddress` implementation and the type conversion for
      `c.t.util.Time` uses the `c.t.app.Flaggable.ofTime` implementation for consistency with Flag parsing.
      Because of the current state of type erasure with `c.t.app.Flag` instances, Finatra currently binds
      a parsed `c.t.app.Flag` value as a String type, relying on registered Guice TypeConverters to convert
      from the bound String type to the requested type. These conversions now allow for a `c.t.app.Flag`
      defined over the type to be injected by the type as Guice now has a type conversion from the bound
      String type rather than as a String representation which then must be manually converted.
      ``PHAB_ID=D471545``
    
    * ✅ finatra-http: Method in tests to return an absolute path URI with the https scheme and authority
      ``PHAB_ID=D466424``
    
    * ✅ finatra: Java-friendly `bindClass` test APIs. The `bindClass` API calls from Java can be
      now chained with the `TestInjector`, `EmbeddedApp`, `EmbeddedTwitterServer`,
      `EmbeddedThriftServer`, and `EmbeddedHttpServer`. For example, the following is now possible:
    
    

    EmbeddedHttpServer server = new EmbeddedHttpServer( new HelloWorldServer(), Collections.emptyMap(), Stage.DEVELOPMENT) .bindClass(Integer.class, Flags.named("magic.number"), 42) .bindClass(Integer.class, Flags.named("module.magic.number"), 9999);

    return server;

      ``PHAB_ID=D463042``
    
    🔄 Changed
    
    • inject-app: Introduce consistent c.t.app.Flag creation methods for Java. Bring HTTP and Thrift server traits inline with each other to provide consistent Java support. Ensure Java examples in documentation. PHAB_ID=D471716

    • ⚡️ inject-core: Update the configuration of c.t.app.Flag instances created within a c.t.inject.TwitterModule to have failFastUntilParsed set to 'true' by default. While this is configurable for a given c.t.inject.TwitterModule, much like for the application itself, it is STRONGLY recommended that users adopt this behavior. PHAB_ID=D448047

    • ⚡️ inject-app: Update c.t.inject.app.TestInjector to always add the InjectorModule. PHAB_ID=D465943

    • inject-app: Reduce visibility of internal code in c.t.inject.app.internal. PHAB_ID=D465597

    • ⚡️ inject-modules: Updated BUILD files for Pants 1:1:1 layout. PHAB_ID=D442977

    🛠 Fixed

    
    * finatra-kafka: Close a result observer when Namer.resolve fails. ``PHAB_ID=D416044``
    
  • v20.4.0

    April 02, 2020

    ➕ Added

    inject-app: Add Java-friendly main to EmbeddedApp. 4b40075d

    ⏱ finatra-kafka: Expose timeout duration in KafkaProducerConfig dest(). c5340a97

    🔄 Changed

    • finatra-validation|jackson: (BREAKING API CHANGE) Introduced new case class validation library
      inspired by JSR-380 specification. The new library can be used as its own to validate field and
      method annotations for a case class. The library is also automatically integrated with Finatra's
      custom CaseClassDeserializer to efficiently apply per field and method validations as request
      📜 parsing is performed. However, Users can easily turn off validation during request parsing with
      🔧 the setting noValidation in their server configurations. For more information, please checkout
      Finatra User's Guide <https://docbird.twitter.biz/finatra/user-guide/index.html>__.
      d874b1a9
  • v20.3.0

    March 08, 2020

    ➕ Added

    ✅ finatra-kafka-streams: Add method to c.t.f.kafkastreams.test.TopologyTesterTopic to write
    Kafka messages with custom headers to topics. a9fef3dc

    finatra-http: Add toBufReader to get the underlying Reader of Buf from StreamingResponse.
    If the consumed Stream primitive is not Buf, the returned reader streams a serialized
    JSON array. 876d0ba9

    👍 inject-app: Add functions to c.t.inject.app.AbstractApp to provide better
    ergonomics for Java users to call and use basic App lifecycle callbacks.
    f04772df

    inject-server: Add functions to c.t.inject.server.AbstractTwitterServer to provide
    👍 better ergonomics for Java users to call and use basic TwitterServer lifecycle
    callbacks. f04772df

    inject-slf4j: Add a way to retrieve the currently stored Local Context map backing the
    MDC. 12b9410e

    👍 finatra-jackson: Added new functionality in the CaseClassDeserializer to support more
    📚 Jackson annotations during deserialization. See documentation for more information.
    49014890

    ✅ finatra: Add NullKafkaProducer for unit tests to avoid network connection failures in the log.
    d8d4d5db

    🔄 Changed

    🚚 finatra-validation|jackson: Remove Jackson dependency from finatra/validation. This
    🚚 was for ErrorCode reporting but can be moved to finatra/jackson. f024f929

    ⚡️ finatra-kafka-streams: (BREAKING API CHANGE) Update AsyncTransformer to preserve
    record context. be5dd08f

    👍 finatra-jackson: Better handling of Scala enumeration mapping errors. Currently, if mapping
    of a Scala enumeration during deserialization fails a java.util.NoSuchElementException is
    ⚡️ thrown which escapes deserialization error handling. Update to instead handle this failure case
    in order to correctly translate into a CaseClassFieldMappingException which will be wrapped
    into a CaseClassMappingException. 4753c6e8

    ⚡️ finatra: Update Google Guice version to 4.2.0 76506c35

    finatra: Bumped version of Joda to 2.10.2 and Joda-Convert to 1.5. 9adef421

    🚚 finatra-jackson|finatra-http-annotations: Move http-releated Jackson "injectablevalues"
    annotations from finatra/jackson to finatra/http-annotations.

    📦 Specifically the follow have changed packages,
    c.t.finatra.request.QueryParam --> c.t.finatra.http.annotations.QueryParam
    c.t.finatra.request.RouteParam --> c.t.finatra.http.annotations.RouteParam
    c.t.finatra.request.FormParam --> c.t.finatra.http.annotations.FormParam
    c.t.finatra.request.Header --> c.t.finatra.http.annotations.Header
    c.t.finatra.request.JsonIgnoreBody --> c.t.finatra.http.annotations.JsonIgnoreBody

    ⚡️ Users should update from finatra/jackson/src/main/java (finatra-jackson_2.12)
    to finatra/http-annotations/src/main/java (finatra-http-annotations_2.12).
    77469e17

    ⚡️ finatra-jackson: Updated Finatra Jackson integration to introduce a new ScalaObjectMapper
    📚 and module to simplify configuration and creation of the mapper. See documentation for more
    information. 49014890

    🚚 finatra-jackson: (BREAKING API CHANGE) Moved the java binding annotations, CamelCaseMapper and
    SnakeCaseMapper from c.t.finatra.annotations in finatra/jackson to
    🚚 c.t.finatra.json.annotations in finatra/json-annotations. Moved
    c.t.finatra.response.JsonCamelCase to c.t.finatra.json.annotations.JsonCamelCase which is also
    🗄 now deprecated. Users are encouraged to use the standard Jackson annotations or a mapper with
    🔧 the desired property naming strategy configured.

    Many exceptions for case class deserialization were meant to be internal to the framework but are
    👉 useful or necessary outside of the internals of JSON deserialization. As such we have cleaned up
    🚚 and made most JSON deserialization exceptions public. As a result, all the exceptions have been moved
    from c.t.finatra.json.internal.caseclass.exceptions to c.t.finatra.jackson.caseclass.exceptions.

    c.t.finatra.json.internal.caseclass.exceptions.CaseClassValidationException has been renamed to
    c.t.finatra.jackson.caseclass.exceptions.CaseClassFieldMappingException. JsonInjectException,
    👍 JsonInjectionNotSupportedException, and RequestFieldInjectionNotSupportedException have all been
    ✂ deleted and replaced with c.t.finatra.jackson.caseclass.exceptions.InjectableValuesException
    which represents the same error cases.

    🚚 The FinatraJsonMappingException has been removed. Users are encouraged to instead use the general
    Jackson JsonMappingException (which the FinatraJsonMappingException extends).

    🚚 RepeatedCommaSeparatedQueryParameterException has been moved tom finatra/http.
    49014890

    🛠 Fixed

    👍 finatra-jackson: Access to parameter names via Java reflection is not supported in Scala 2.11.
    ➕ Added a work around for the parsing of case class structures to support JSON deserialization in
    Scala 2.11 and forward. 59ec2c21

    finatra-jackson: Fix for enforcing "fail on unknown properties" during deserialization. Previously,
    ⚡️ the CaseClassDeserializer was optimized to only read the fields in the case class constructor
    from the incoming JSON and thus ignored any unknown fields during deserialization. The fix will
    🔧 now properly fail if the DeserializationFeature is set or if the JsonProperties is configured
    accordingly. 49014890

  • v20.2.1

    ➕ Added

    
    * ✅ finatra-kafka-streams: Add method to `c.t.f.kafkastreams.test.TopologyTesterTopic` to write
      Kafka messages with custom headers to topics. ``PHAB_ID=D424440``
    
    * finatra-http: Add `toBufReader` to get the underlying Reader of Buf from StreamingResponse.
      If the consumed Stream primitive is not Buf, the returned reader streams a serialized
      JSON array. ``PHAB_ID=D434448``
    
    * 👍 inject-app: Add functions to `c.t.inject.app.AbstractApp` to provide better
      ergonomics for Java users to call and use basic `App` lifecycle callbacks. 
      ``PHAB_ID=D433874``
    
    * inject-server: Add functions to `c.t.inject.server.AbstractTwitterServer` to provide 
      better ergonomics for Java users to call and use basic `TwitterServer` lifecycle 
      callbacks. ``PHAB_ID=D433874``
    
    * inject-slf4j: Add a way to retrieve the currently stored Local Context map backing the
      MDC. ``PHAB_ID=D431148``
    
    * 👍 finatra-jackson: Added new functionality in the `CaseClassDeserializer` to support more
      Jackson annotations during deserialization. See documentation for more information.
      ``PHAB_ID=D407284``
    
    * ✅ finatra: Add NullKafkaProducer for unit tests to avoid network connection failures in the log.
      ``PHAB_ID=D429004``
    
    🔄 Changed
    
    • ⚡️ finatra: Update Google Guice version to 4.2.0 PHAB_ID=D372886

    • finatra: Bumped version of Joda to 2.10.2 and Joda-Convert to 1.5. PHAB_ID=D435987

    • 🚚 finatra-jackson|finatra-http-annotations: Move http-releated Jackson "injectablevalues" annotations from finatra/jackson to finatra/http-annotations.

    Specifically the follow have changed packages, c.t.finatra.request.QueryParam --> c.t.finatra.http.annotations.QueryParam c.t.finatra.request.RouteParam --> c.t.finatra.http.annotations.RouteParam c.t.finatra.request.FormParam --> c.t.finatra.http.annotations.FormParam c.t.finatra.request.Header --> c.t.finatra.http.annotations.Header c.t.finatra.request.JsonIgnoreBody --> c.t.finatra.http.annotations.JsonIgnoreBody

    Users should update from finatra/jackson/src/main/java (finatra-jackson_2.12) to finatra/http-annotations/src/main/java (finatra-http-annotations_2.12). PHAB_ID=D418766

    • ⚡️ finatra-jackson: Updated Finatra Jackson integration to introduce a new ScalaObjectMapper and module to simplify configuration and creation of the mapper. See documentation for more information. PHAB_ID=D407284

    • 🚚 finatra-jackson: (BREAKING API CHANGE) Moved the java binding annotations, CamelCaseMapper and SnakeCaseMapper from c.t.finatra.annotations in finatra/jackson to c.t.finatra.json.annotations in finatra/json-annotations. Moved c.t.finatra.response.JsonCamelCase to c.t.finatra.json.annotations.JsonCamelCase which is also now deprecated. Users are encouraged to use the standard Jackson annotations or a mapper with the desired property naming strategy configured.

    Many exceptions for case class deserialization were meant to be internal to the framework but are useful or necessary outside of the internals of JSON deserialization. As such we have cleaned up and made most JSON deserialization exceptions public. As a result, all the exceptions have been moved from c.t.finatra.json.internal.caseclass.exceptions to c.t.finatra.jackson.caseclass.exceptions.

    c.t.finatra.json.internal.caseclass.exceptions.CaseClassValidationException has been renamed to c.t.finatra.jackson.caseclass.exceptions.CaseClassFieldMappingException. JsonInjectException, JsonInjectionNotSupportedException, and RequestFieldInjectionNotSupportedException have all been deleted and replaced with c.t.finatra.jackson.caseclass.exceptions.InjectableValuesException which represents the same error cases.

    The FinatraJsonMappingException has been removed. Users are encouraged to instead use the general Jackson JsonMappingException (which the FinatraJsonMappingException extends).

    RepeatedCommaSeparatedQueryParameterException has been moved tom finatra/http. PHAB_ID=D407284

    🛠 Fixed

    
    * 👍 finatra-jackson: Access to parameter names via Java reflection is not supported in Scala 2.11.
      Added a work around for the parsing of case class structures to support JSON deserialization in
      Scala 2.11 and forward. ``PHAB_ID=D431837``
    
    * finatra-jackson: Fix for enforcing "fail on unknown properties" during deserialization. Previously,
      the `CaseClassDeserializer` was optimized to only read the fields in the case class constructor
      from the incoming JSON and thus ignored any unknown fields during deserialization. The fix will
      now properly fail if the `DeserializationFeature` is set or if the `JsonProperties` is configured
      accordingly. ``PHAB_ID=D407284``
    
  • v20.1.0

    January 29, 2020

    🔄 Changed

    • finatra: Exposing Listening Server's bound address in Thrift and HTTP server traits
      c17f55df
    • ⬆️ finatra: Upgrade logback to 1.2.3 445ddf89

    🛠 Fixed

    • inject-server: Fix issue in c.t.inject.server.EmbeddedHttpClient where assertion of an
      empty response body was incorrectly disallowed. This prevented asserting that a server
      was not yet healthy as the /health endpoint returns an empty string, thus even a not yet
      ✅ healthy server would report as "healthy" to the testing infrastructure as long as the health
      endpoint returned a 200 - OK response. e9aa2dac
  • v19.12.0

    December 13, 2019

    🔄 Changed

    ⬆️ finatra: Upgrade to jackson 2.9.10 and jackson-databind 2.9.10.1 14fc3714

    finatra: Correctly track Ignorable Exceptions in per-method StatsFilter. Responses
    marked as Ignorable are tracked in the global requests and exceptions metrics but
    were not counted under the per-method metrics. There are now counts of ignored
    👻 and total requests as well as ignored requests by Exception for each method. E.g.

    per_method_stats/foo/ignored 1
    per_method_stats/foo/ignored/java.lang.Exception 1
    per_method_stats/foo/requests 1

    80946f4d

    🚚 finatra-http|jackson (BREAKING API CHANGE): Move parsing of message body contents
    📜 from finatra/jackson via the FinatraObjectMapper #parseMessageBody, #parseRequestBody,
    📜 and #parseResponseBody methods to finatra/http with functionality replicated via an
    ⚡️ implicit which enhances a given FinatraObjectMapper. Additionally we have updated
    finatra-http the MessageBodyComponent API to use c.t.finagle.http.Message instead
    of c.t.finagle.http.Request and c.t.finagle.http.Response. This means that users can use the
    MessageBodyComponent API to read the body of Finagle HTTP requests or responses and all HTTP
    concerns are co-located in finatra-http instead of being partially implemented in finatra-jackson.

    ⚡️ In updating the MessageBodyComponent API we have removed support for polymorphic MessageBodyReader
    📜 types, that is we have simplified the MessageBodyReader API to no longer express the #parse
    📜 method parameterized to a subtype of the class type. This API allowed parsing a message body
    into a subtype solely through the presence of a given type parameter but the resulting API has
    proven to be extremely clunky. We feel that the same behavior is achievable in other ways (such
    📜 as adapting the type after parsing) and the improvement and simplification of the
    MessageBodyReader API to be worth removing the awkward method signature.

    🛠 Lastly, we have fixed the returned charset encoding on response content-type header to be
    applicable only where appropriate instead of always being added when the
    http.response.charset.enabled flag is set to true. 4c6283b2

    🚚 finatra: (BREAKING API CHANGE) move DarkTrafficFilter and related modules
    from finatra/thrift to inject/inject-thrift-client. The modules now extend
    🔧 from c.t.inject.thrift.modules.ThriftClientModuleTrait for more uniform configuration.
    The following changes were made:

    • c.t.finatra.thrift.filters.DarkTrafficFilter ->
      c.t.inject.thrift.filters.DarkTrafficFilter
    • c.t.finatra.thrift.modules.DarkTrafficFilterModule ->
      c.t.inject.thrift.modules.DarkTrafficFilterModule
    • c.t.finatra.thrift.modules.ReqRepDarkTrafficFilterModule ->
      c.t.inject.thrift.modules.ReqRepDarkTrafficFilterModule
    • c.t.finatra.thrift.modules.JavaDarkTrafficFilterModule ->
      c.t.inject.thrift.modules.JavaDarkTrafficFilterModule

    a8e54f34

    ⚡️ finatra: Update Google Guice version to 4.1.0, update ScalaTest to 3.0.8, and ScalaCheck
    to 1.14.0. 1bc3e889

    🚚 finatra-http: Remove deprecated c.t.finatra.http.HttpHeaders. Users should use
    com.twitter.finagle.http.Fields instead. e9e5d4e2

    🚚 finatra-http: Remove deprecated DocRootModule. 6163e7f7

    🚚 finatra-http: (BREAKING CHANGE) Remove automatic handling of Mustache rendering from
    👍 finatra/http and break Mustache support into two separate libraries: finatra/mustache
    and finatra/http-mustache.

    HTTP services that want the framework to automatically negotiate Mustache template rendering
    via the Finatra HTTP MessageBodyComponents framework must now bring this concern into their
    HTTP services via the finatra/http-mustache c.t.finatra.http.modules.MustacheModule as the
    🚚 HTTP framework support for specifying a MustacheModule in the HttpServer has been removed.
    I.e., add this module to the server's list of modules.

    ➕ Additionally, it is also now possible to use Mustache templating completely independent of
    Finatra HTTP concerns by consuming and using only the finatra/mustache library which will
    render Strings via defined Mustache templates. e6aaa19f

    🛠 Fixed

    • 0️⃣ finatra-http: Fixed issue in the DefaultMessageBodyReaderImpl that determines if the incoming
      message is "json encoded". c1f1a093
    • 🚚 inject-modules: Removed the extra registration for closing a client, which used to log false
      ⚠ warnings when startup a ClientModule. Only register close after materialized clients.
      ddda0b12
    • inject-server: Addressed a race condition that could allow for an AdminHttpServer to be
      started, even when the disableAdminHttpServer property was set. The AdminHttpServer will
      no longer start prior to the warm-up phase if disabled. The disableAdminHttpServer property
      🚚 has also been moved to com.twitter.server.AdminHttpServer. 113b7d8
    • 🏗 finatra: Remove com.sun.activation dependency from build.sbt file. The dependency
      duplicates the javax.activation dependency and as a result can cause a uber-JAR to fail
      🏗 to build. fd67b836

    ➕ Added

    • 🚚 finatra-jackson: (BREAKING API CHANGE) Move all Case Class annotation validation related logic to
      ⚡️ a new library in finatra-validation. Please update your library dependencies to the new library if
      you are using case class validations. ba5a0451
  • v19.11.0

    November 06, 2019

    🛠 Fixed

    • 👍 finatra-http: Better handling of URI decoding issues when extracting path parameters for
      👻 routing. If we cannot extract a path pattern, and the exception is not intercepted by a
      👻 user-defined Exception Mapper, we will now explicitly return a 400 - BAD REQUEST.
      🛠 Fixes #507. 5f293844

    ➕ Added

    • 👍 finatra: Add initial support for JDK 11 compatibility. dfc521c9
    • 👍 inject-core: Add support for optional binding in c.t.inject.TwitterModule.
      285da3bb

    🔄 Changed

    • finatra-http: (BREAKING API CHANGE) AsyncStream[Buf] => AsyncStream[String] and
      Reader[Buf] => Reader[String] handlers will always be tread the output as a JSON arrays of
      Strings. Whereas, before, the incoming bytes would have been converted to String and
      returned as-is. 43eaa555
    • 🗄 finatra: Deprecate c.t.finatra.http.modules.DocRootModule. Introduce FileResolverModule.
      🔧 The DocRootModule defines configuration flags for the FileResolver which was moved from
      🔧 finatra/http to a more correctly generic location in finatra/utils. However, configuration for
      🔧 injection of a properly configured FileResolver is still incorrectly tied to HTTP because of the
      🗄 DocRootModule. Thus, we deprecate the DocRootModule and introduce the
      c.t.finatra.modules.FileResolverModule which is defined closer to the
      c.t.finatra.utils.FileResolver in finatra/utils. This allows the FileResolver to be properly
      🔧 configured outside of HTTP concerns. 5a97b2aa
    • ⚡️ finatra-thrift: Updated BUILD files for Pants 1:1:1 layout. c46209fd
    • inject-ports: Add finatra/inject/inject-ports which has c.t.inject.server.Ports and
      c.t.inject.server.PortUtils. 5676d038
    • 🚚 inject-utils: Move AnnotationUtils to c.t.inject.utils.AnnotationUtils and make public
      for use. 0ac7af99
    • ⚡️ finatra-http: Updated package structure for Pants 1:1:1 layout. Moved META-INF/mime.types file
      to finatra/utils which is where the FileResolver is located for proper resolution of mime types
      from file extension. 57555f80
  • v19.10.0

    October 09, 2019

    🔄 Changed

    • ⚡️ finatra-jackson: Update jackson reflection to use org.json.reflect instead of
      📜 custom reflection. This enables support for parsing case classes defined over generic
      types, e.g., case class Page[T](data: T). As a result of this change, use of lazy val
      for trait members which are mixed into case classes for use in deserialization is no
      👍 longer supported. This addresses issue #480. 83d3ed6d

    🛠 Fixed

    • 📜 finatra-jackson: Add support for parsing of case classes defined over generic types
      (even nested, and multiple), e.g., case class Page[T, U] (data: List[T], column: U).
      🛠 Fixes issue #408. 83d3ed6d
    • finatra-kafka: Sanitize topic name in MonitoringConsumer stats scope
      0df09c6b
    • 🖨 inject-server: Fix printing of all stats from the underlying InMemoryStatsReceiver in
      ✅ the eventually loop for stat assertion. Address finatra/kafka test logging for
      finatra/kakfa-streams/kafka-streams and finatra/kafka. 32833de1
    • inject-logback: A NullReferenceException could be thrown during metrics
      🔧 collection due to an incorrect logback.xml configuration. This has been fixed.
      82f0382f
  • v19.9.0

    September 11, 2019

    ➕ Added

    • 🔧 finatra-kafka: Add withConfig method variant which takes a Map[String, String] to allow for more complex configurations 60b5d3f1

    🔄 Changed

    🚚 finatra: Remove commons-lang as a dependency and replace it with alternatives from stdlib when possible. 1c32f9a7

    inject-server: Changed c.t.inject.server.InMemoryStatsReceiverUtility to show the expected and
    actual values as part of the error message when metric values do not match. cefb1749

    finatra-kafka-streams: Improve StaticPartitioning error message ec0f87fd

    🛠 Fixed

    🐎 finatra-http: Support Http 405 response code, improve routing performance for non-constant route 983a2c8f

    ⚡️ inject-app: Update c.t.inject.app.App to only recurse through modules once. We currently
    📜 call TwitterModule#modules more than once in reading flags and parsing the list of modules
    over which to create the injector. When TwitterModule#modules is a function that inlines the
    instantiation of new modules we can end up creating multiple instances causing issues with the
    list of flags defined in the application. This is especially true in instances of TwitterModule
    implemented in Java as there is no way to implement the trait TwitterModule#modules method as a
    eagerly evaluated value. We also don't provide an ergonomic method for Java users to define
    dependent modules like we do in apps and servers via App#javaModules. Thus we also add a
    👍 TwitterModule#javaModules function which expresses a better API for Java users. 8d0a59fa