packages feed

freckle-app-1.9.0.0: CHANGELOG.md

## [_Unreleased_](https://github.com/freckle/freckle-app/compare/v1.9.0.0...main)

## [v1.9.0.0](https://github.com/freckle/freckle-app/compare/v1.8.1.0...v1.9.0.0)

- Refactor `Freckle.App.Wai` interface
- Add `addThreadContextFromStatsTags`
- Replace `HasXRayVaultData` with `MonadTracer`
- Introduce `AppT`

## [v1.8.1.0](https://github.com/freckle/freckle-app/compare/v1.8.0.0...v1.8.1.0)

- Add `runDBSimple` for use cases where instrumentation is not valuable.

## [v1.8.0.0](https://github.com/freckle/freckle-app/compare/v1.7.1.0...v1.8.0.0)

- Fix bug: gauges not being published.
- Add HasVaultData type class to remove the dependency on Yesod's MonadHandler

## [v1.7.1.0](https://github.com/freckle/freckle-app/compare/v1.7.0.0...v1.7.1.0)

- Add Incremental CSV parsing

## [v1.7.0.0](https://github.com/freckle/freckle-app/compare/v1.6.0.3...v1.7.0.0)

- Add XRay and EKG support to freckle-app's runDB.

  This involves an breaking change in `runDB`'s constraints, thus the major version
  bump.

## [v1.6.0.3](https://github.com/freckle/freckle-app/compare/v1.6.0.2...v1.6.0.3)

- Revert regrouping of `SqlError` by `url`

  Consider `/foos/1` vs `/foos/2`: grouping naively by `url` makes these two
  errors when we wanted them to be one. This can't be solved without knowledge
  of the routing system, so we can't do it from within this library as-is.
  Therefore, we've reverted the feature for now.

## [v1.6.0.2](https://github.com/freckle/freckle-app/compare/v1.6.0.1...v1.6.0.2)

- Strip query string from URLs used to group timeout exceptions in Bugsnag.

## [v1.6.0.1](https://github.com/freckle/freckle-app/compare/v1.6.0.0...v1.6.0.1)

- The built-in Bugsnag `BeforeNotify` will further group `SqlError`s that are
  timeouts (57014) by Request URL (when request info is present in the `Event`)

## [v1.6.0.0](https://github.com/freckle/freckle-app/compare/v1.5.0.1...v1.6.0.0)

- Remove `AppVersion`

  This also removes the `test-git` flag.

  This was over-engineered, in our opinion. If you're making use of the
  conventional `DD_` variables that the `Stats` module expects, you should be
  able to:

  - Replace any `appVersion :: AppVersion` with `appVersion :: Text`
  - Replace `appVersion <- getAppVersion` with `appVersion <- maybe "unknown" pack <$> lookupEnv "DD_VERSION"`
  - Replace `avName appVersion` with `appVersion`
  - Remove uses of `avCreatedAt`

- Add `Freckle.App.Dotenv`, wrapping [`dotenv`](https://hackage.haskell.org/package/dotenv)

  And move `Freckle.App.Test.withApp` to use it instead of `LoadEnv`. This is
  behavior-neutral except:

  - We no longer load `.env` after `.env.test`, we only load `.env.test`

    Missing variables should generate errors prompting you to copy values from
    the former to the latter as required.

  - We will verify the `.env` file against an `.env.example` if present.

- Add `Freckle.App.Bugsnag.Metadata`

## [v1.5.0.1](https://github.com/freckle/freckle-app/compare/v1.5.0.1...v1.5.1.0)

- Export `Freckle.App.Stats.tagsL`

## [v1.5.0.1](https://github.com/freckle/freckle-app/compare/v1.5.0.0...v1.5.0.1)

- Relax lower bound on `primitive`

## [v1.5.0.0](https://github.com/freckle/freckle-app/compare/v1.4.0.0...v1.5.0.0)

- Remove `Freckle.App.Datadog` modules for `Freckle.App.Stats` equivalents

  It's not a drop-in, but the required changes should be mechanical:

  - Instead of `HasDogStats{Client,Tags}`, implement a single `HasStatsClient`
  - Instead of `mkStatsClient` use `withStatsClient` (the new style of `runApp`
    had will enable that)
  - Use `tagged` instead of extra arguments to metric sends
  - Move to the new `Rts`, `Gauge`, and `Middleware.Stats` modules

- Change signature of `runApp` and `withApp`

  Instead of passing a loaded `App` (or a function that loads an `App`) to
  `runApp` and `withApp`, you should now pass a function that _takes a function_
  and calls it on the loaded `App`.

  This is necessary for apps that hold onto values that require cleanup, like
  `withStatsClient`.

  ```hs
  -- This doesn't work
  loadApp :: IO App
  loadApp = do
    -- ...
    withStatsClient $ \appStatsClient -> do
      -- ???

  -- This does
  loadApp :: (App -> IO a) -> IO a
  loadApp f = do
    -- ...
    withStatsClient $ \appStatsClient -> do
      f App { .. }
  ```

  The old form can be trivially converted to the new form like so,

  ```hs
  loadApp :: (App -> IO a) -> IO a
  loadApp f = f =<< loadApp'

  loadApp' :: IO App
  loadApp' = -- old code
  ```

- Add functions that check properties that we like to commonly test.

## [v1.4.0.0](https://github.com/freckle/freckle-app/compare/v1.3.0.0...v1.4.0.0)

- Remove `runCapturedLoggingT`

  We can use `Blammo.Logging.Logger.newTestLogger` instead. See `MemcachedSpec`
  as an example.

- Compatibility down to LTS 12.26 / GHC 8.4

## [v1.3.0.0](https://github.com/freckle/freckle-app/compare/v1.2.0.2...v1.3.0.0)

- Adjust `Freckle.App.Test` interface
  - Remove `runAppTest`
  - Add `appExample` for making a expectation concretely `AppExample`
  - Add `expectationFailure`, and `pending(With)` helpers in `MonadIO`

## [v1.2.0.2](https://github.com/freckle/freckle-app/compare/v1.2.0.1...v1.2.0.2)

- `Env.kept` compatibility with envparse-0.5

## [v1.2.0.1](https://github.com/freckle/freckle-app/compare/v1.2.0.0...v1.2.0.1)

- Use `Env.kept` with parsing that occurs in `makePostgresPool`

  This ensure all `PG` variables are kept in the environment after parsing, to
  again match pre-v1.1 behavior.

  If you would prefer not to keep these variables, parse them yourself (e.g.
  with `envParseDatabaseConf`) and use `makePostgresPoolWith`.

- Add `Freckle.App.Env.kept` to re-define a `Parser` so that all variables are
  kept after reading. Not doing this can break tests if you are re-parsing the
  environment for each example.

  Replace `Env.parse f` with `Env.parse f $ Env.kept` to recover how this module
  behaved prior to v1.1.

## [v1.2.0.0](https://github.com/freckle/freckle-app/compare/v1.1.0.0...v1.2.0.0)

- Remove `Freckle.App.Logging`, integrate with [blammo][] instead.

  This will require the following end-user changes:

  - Remove `HasLogging` instance and add `HasLogger`

    This will require storing a `Logger` on your runtime `App` type, instead of
    a `LogLevel` (et al) in your static `AppSettings` type. (Or move to
    `runSimpleLoggingT`.)

  - Replace WAI middleware with [Blammo integration][blammo-wai]

  - Replace Yesod functions with [Blammo integration][blammo-yesod]

  And changes to environment variable values:

  - If using `LOG_OUTPUT=std(out|err)`, use `LOG_DESTINATION=std(out|err)` (note
    that `stdout` is the default)
  - If using `LOG_OUTPUT=file`, use `LOG_DESTINATION=@fancy.log` (yes, that's
    this option did)
  - If using `LOG_FORMAT=terminal`, use `LOG_FORMAT=tty` (note that this is the
    defualt)

[blammo]: https://hackage.haskell.org/package/Blammo
[blammo-wai]: https://github.com/freckle/blammo/#integration-with-wai
[blammo-yesode]: https://github.com/freckle/blammo/#integration-with-yesod

## [v1.1.0.0](https://github.com/freckle/freckle-app/compare/v1.0.4.0...v1.1.0.0)

- Require `MonadLoggerIO` in `makePostgresPool` (and so respect that logging
  context from DB activities).

  Previous behavior can be recovered by using `runNoLoggingT makePostgresPool`.

- Re-implement `FronRow.App.Env` via external library, `envparse`

  Some conversions will be required:

  - `Reader a` should now be `Reader Error a`
  - `Parser a` should now be `Parser Error a`
  - `parse` should now be `parse id`
  - `var x X nonEmpty` should now be `var (x <=< nonempty) X mempty`

    Note that `(str <=< nonempty)` is redundant.

  - `var (f <$> g) X m` should now be `f <$> var g X m`

    Note that `def` will now need a value the same type as `g`, not `f`.

  - `switch` and `flag` no longer accept `def` (the non-active value is an
    implicit default; the previous behavior was kind of surprising and
    ambiguous).

  - `handleEither` has been removed. Users will have to parse a complete value
    and then further validate/throw externally.

  - Previously, we always behaved as if `keep` was applied. Add that explicitly
    if you need that behavior.

## [v1.0.4.0](https://github.com/freckle/freckle-app/compare/v1.0.3.0...v1.0.4.0)

- Add `Freckle.App.Bugsnag` for Bugsnag logging in applications.
- Increased default PG poolsize to 10.

## [v1.0.3.0](https://github.com/freckle/freckle-app/compare/v1.0.2.10...v1.0.3.0)

- Add `Freckle.App.Memcache` for using memcached in Apps
- Add `Freckle.App.Scientist` for using [scientist][] in Apps

  [scientist]: https://github.com/freckle/scientist-hs#readme

## [v1.0.2.10](https://github.com/freckle/freckle-app/compare/v1.0.2.9...v1.0.2.10)

- Support GHC 9.0 and 9.2

- Change `Wai` function arguments for producing `RouteName` and `TraceId` to
  tags

  To maintain the same behavior, replace

  ```hs
  makeLoggingMiddleware app getRouteName getTraceId ...
  ```

  With

  ```hs
  makeLoggingMiddleware app getTags ...
    where
      getTags req = catMaybes
        [ ("route", ) <$> getRouteName req
        , ("trace_id", ) <$> getTraceId req
        ]
  ```

  And similar for `makeRequestMetricsMiddleware`.

## [v1.0.2.9](https://github.com/freckle/freckle-app/compare/v1.0.2.8...v1.0.2.9)

- Add some common textual encoding functions to prelude

## [v1.0.2.8](https://github.com/freckle/freckle-app/compare/v1.0.2.7...v1.0.2.8)

- Don't allow `aeson-2.0`

## [v1.0.2.7](https://github.com/freckle/freckle-app/compare/v1.0.2.6...v1.0.2.7)

- Remove explicit `--region` in IAM DB token call
- Relax lower-bounds throughout

## [v1.0.2.6](https://github.com/freckle/freckle-app/compare/v1.0.2.5...v1.0.2.6)

- Add a looser lower-bound on `containers`

## [v1.0.2.5](https://github.com/freckle/freckle-app/compare/v1.0.2.4...v1.0.2.5)

- Add a looser lower-bound on `bytestring`
- Add a looser lower-bound on `template-haskell`

## [v1.0.2.4](https://github.com/freckle/freckle-app/compare/v1.0.2.3...v1.0.2.4)

- Add a looser lower-bound on `base`

## [v1.0.2.3](https://github.com/freckle/freckle-app/compare/v1.0.2.2...v1.0.2.3)

- Add Freckle-specific prelude.

## [v1.0.2.2](https://github.com/freckle/freckle-app/compare/v1.0.2.1...v1.0.2.2)

- Target `hspec-junit-formatter-1.0.3.0` (use `1.1.0.0` in development)

## [v1.0.2.1](https://github.com/freckle/freckle-app/compare/v1.0.2.0...v1.0.2.1)

- Add `denyFrameEmbeddingMiddleware` for denying HTML frame embedding.

## [v1.0.2.0](https://github.com/freckle/freckle-app/compare/v1.0.1.0...v1.0.2.0)

- Add 'Freckle.App.Yesod.Route' to allow printing route names.

## [v1.0.1.0](https://github.com/freckle/freckle-app/compare/v1.0.0.4...v1.0.1.0)

- Added `Freckle.App.Datadog.Gauge` for client side stateful gauges.
- Added `Freckle.App.Datadog.Rts` for sending RTS statistics to DataDog.

## [v1.0.0.4](https://github.com/freckle/freckle-app/compare/v1.0.0.3...v1.0.0.4)

- Support seconds or milliseconds in `PGSTATEMENTTIMEOUT`

  NOTE: We consider this a non-breaking change because the environment variable
  interface is backwards-compatible. By normal Haskell rules, it would be major
  since it's changing the type of something exported.

- Add `respondQueryCanceled` Yesod Middlewares

- Add `makeRequestMetricsMiddleware`

## [v1.0.0.3](https://github.com/freckle/freckle-app/compare/v1.0.0.2...v1.0.0.3)

- Add `package.yaml` to `extra-source-files`.

## [v1.0.0.2](https://github.com/freckle/freckle-app/compare/v1.0.0.1...v1.0.0.2)

- Extract tests that require `git` into a new suite.

## [v1.0.0.1](https://github.com/freckle/freckle-app/compare/v1.0.0.0...v1.0.0.1)

- Ensure `release` GitHub Action completes properly.

## [v1.0.0.0](https://github.com/freckle/freckle-app/tree/v1.0.0.0)

First tagged release.