## [_Unreleased_](https://github.com/freckle/freckle-app/compare/v1.6.0.2...main)
## [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.