Switch from ClassyPrelude to Relude
[?]
May 29, 2020, 2:05 PM
4R7XIYK3BP664CO3YJ2VM64ES2JYN27UTQG5KS34OTEPAIODSZLQCDependencies
- [2]
GMYPBCWEMake docker-compose work. - [3]
4IQVQL4TAdded client for payouts endpoint. - [4]
DXIGERDTChange order of Docker build to avoid rebuilding the universe. - [5]
4ZLEDBK7Initial attempts at dockerizing, cabal isn't cooperating. - [6]
MJ6R42RCUtility methods for reading key & cert data. - [7]
EQXRXRZDChanged to use tasty instead of test-framework - [8]
PBD7LZYQPostgres & auth are beginning to function. - [9]
TJEUE7TYAdded OverloadedStrings to eliminate Text fiddling. - [10]
AL37SVTCImplement payments service endpoints. - [11]
7KZP4RHZSwitch from Data.Time to Data.Thyme - [12]
6L5BK5EHUse generic SMTP rather than Sendmail-specific mail client. - [13]
A6HKMINBAttempting to improve JSON handling. - [14]
HBULCDN6Add tests for auction winner determination algorithm. - [15]
Z3MK2PJ5Add GET handler for retrieving auction data. - [16]
BSIUHCGFAdd payment response handler. - [17]
2MNO5FUYUpgrade LTS version - [18]
RSEB2NFGReplacing Snap with Scotty. - [19]
64C6AWH6Rename Ananke -> Quixotic, project reboot. - [20]
OBFPJS2GProject successfully builds and tests under nix. - [21]
B6HWAPDPModularize & update to recent haskoin. - [22]
5XFJNUAZStart of addition of project infrastructure. - [23]
2XQD6KKKAdd invitation logic and clean up DBProg error handling. - [24]
BROSTG5KBeginning of modularization of server. - [25]
Z7KS5XHHVery WIP. Wow. - [26]
WZUHEZSBStart of migration back toward snap. - [27]
2G3GNDDUEvent logging is now functioning in postgres. - [28]
SCXG6TJWMake log reduction safer in presence of overlapping events. - [29]
N4NDAZYTInitial implementation of payouts. - [30]
EKI57EJRAdd alternative implementation of auction winner determination. - [31]
O227CEAVAdds storage of original event JSON for some DBOp constructors. - [32]
JFOEOFGAstylish-haskell formatting. - [33]
NAS4BFL4Trivial stylish-haskell reformat. - [34]
HALRDT2FAdded initial auction create route. - [35]
TCOAKCGGCompleted conversion to snap. - [36]
64VI73NPServer now compiles using abstracted SQLite - [37]
73NDXDEZBegin implementation of billing event persistence. - [38]
ASF3UPJLAdd auction creation and bid handlers - [39]
5DRIWGLUImproving TimeLog specs - [40]
DFOBMSAOInitial work on payments API - [41]
FXJQACESEnsure that auction is not ended at the time of bid - [42]
SEWTRB6SImplement payment request creation functions. - [43]
O5FVTOM6Undo JSON silliness, enable a couple more routes. - [44]
5W5M56VJMove library code to 'lib' - [45]
GCVQD44VCreate amends endpoint, switch to UUID primary keys - [46]
7VGYLTMUClean up schema version handling. - [47]
NVOCQVASInitial failing tests. - [48]
IZEVQF62Work in progress replacing sqlite with postgres. - [49]
PGZJ736CUpdate aftok.cfg.example and revise INSTALL instructions - [50]
NLZ3JXLOFix formatting with stylish-haskell. - [51]
V2VDN77HEnable postgres configuration via environment variable for Heroku. - [52]
LHJ2HFXVAdd property test for auction algorithm. - [53]
5ZSKPQ3KAdd created_at and auction_start timestamps to auction - [54]
7HPY3QPFFix linting errors. (yay hlint!) - [55]
WZFQDWW4Add retrieval/storage of current exchange rate data to payment recording. - [56]
4FDQGIXNMake payment request retrieval key an opaque 32-bit hash. - [57]
NMWWP4ZNTrying out Hspec - [58]
7XN3I3QJAdd 'loggedIntervals' endpoint. - [59]
4U7F3CPITHE GREAT RENAMING OF THINGS! - [60]
UUR6SMCAAdd start of specs for auctions. - [61]
I2KHGVD4Require project permissions for access to most data. - [62]
EKY7U7SKFinish conversion to stack. - [63]
WO2MINIFAuctions now compile! - [64]
RN7EI6INUpdate database layer to use CreditTo - [65]
QADKFHARAdds CreatePayment handler implementation. - [66]
RPAJLHMTChange to use UUIDs instead of ints for primary keys. - [67]
KEP5WUFJConvert project to stack-based build. - [68]
TNR3TEHKSwitch to Postgres + snaplet arch compiles. - [69]
TZQJVHBAAdd auction functions to ADB. - [70]
O722AOKEAdd route to allow crediting of events to users/projects. - [71]
Y35QCWYWMinor improvement in WorkIndex type to eliminate duplicated information. - [72]
IPG33FAWAdd billing daemon - [73]
EMVTF2IWWIP moving back to snap. - [74]
UILI6PILThe route-based logStart/logStop is nicer. - [75]
VJPT6HDRFix remaining type errors after addition of login handler. - [76]
ADMKQQGCInitial empty Snap project. - [77]
Z3M53KTLAdrift. - [78]
Q5X5RYQLstylish-haskell reformatting - [79]
HMDM3B55Implement core of payments/billing infrastructure. - [80]
3GBSDS5PFix out-of-date test code, add skeleton for payments spec. - [81]
MB5SHULBAdd route for accepting an invitation with an existing account - [82]
GLFF5ZDKFactor winningBids for easier testing. - [83]
NEDDHXUKReformat via stylish-haskell - [84]
LAROLAYUWIP - [85]
QMRKFEPGRefactor QDB to use a free monad algebra instead. - [86]
W35DDBFYFactor common JSON conversions up into client lib module. - [87]
EW2XN7KUUpdate docker build, clean up migration for payments tables. - [*]
Y3LIJ5USAdd handler for CreatePaymentRequest
Change contents
- edit in aftok.cabal at line 1
cabal-version: 2.4 - replacement in aftok.cabal at line 7
License: AllRightsReservedLicense: NONE - edit in aftok.cabal at line 13
Cabal-version: >= 2.0 - replacement in aftok.cabal at line 14
librarycommon buildenv - replacement in aftok.cabal at line 17
hs-source-dirs: libdefault-extensions: NoImplicitPreludedefault-extensions: KindSignatures, LambdaCase - edit in aftok.cabal at line 20
, RecordWildCards - replacement in aftok.cabal at line 21
, KindSignaturesbuild-depends:base, reludemixins: base hiding (Prelude), relude (Relude as Prelude)libraryimport: buildenvhs-source-dirs: lib - edit in aftok.cabal at line 49
base - edit in aftok.cabal at line 51
, classy-prelude - edit in aftok.cabal at line 78[89.30][3.456]
, relude - replacement in aftok.cabal at line 95
default-language: Haskell2010import: buildenv - edit in aftok.cabal at line 97
ghc-options: -Wall -Werror - edit in aftok.cabal at line 99
default-extensions: NoImplicitPrelude, OverloadedStrings, RecordWildCards, ScopedTypeVariables, KindSignatures - edit in aftok.cabal at line 107[3.480]→[3.2148:2159](∅→∅),[3.2148]→[3.2148:2159](∅→∅),[3.2931]→[3.3090:3111](∅→∅),[3.2159]→[3.3090:3111](∅→∅)
, base, classy-prelude - replacement in aftok.cabal at line 125
default-language: Haskell2010import: buildenv - edit in aftok.cabal at line 128
default-extensions: NoImplicitPrelude, OverloadedStrings, RecordWildCards, ScopedTypeVariables, KindSignatures - edit in aftok.cabal at line 144
, base - edit in aftok.cabal at line 150
, classy-prelude - replacement in aftok.cabal at line 184
default-language: Haskell2010ghc-options: -Wall -Werrorimport: buildenv - edit in aftok.cabal at line 186
default-extensions: NoImplicitPrelude, OverloadedStrings, RecordWildCards, ScopedTypeVariables, KindSignatures - edit in aftok.cabal at line 192
, base - edit in aftok.cabal at line 198
, classy-prelude - edit in daemon/AftokD/AftokM.hs at line 7
import ClassyPrelude - edit in daemon/AftokD/AftokM.hs at line 8
- replacement in daemon/AftokD/AftokM.hs at line 21
import Data.Thyme.Time as Timport Data.Thyme.Time as Cimport qualified Data.Text as T - replacement in daemon/AftokD/AftokM.hs at line 124
let billTemplate = (newSTMP . unpack) <$> req ^. (subscription . billable . paymentRequestEmailTemplate)let billTemplate = (newSTMP . T.unpack) <$> req ^. (subscription . billable . paymentRequestEmailTemplate) - replacement in daemon/AftokD/AftokM.hs at line 137
, ("amount_due", tshow $ total ^. satoshi), ("payment_url", tshow paymentUrl), ("amount_due", show $ total ^. satoshi), ("payment_url", show paymentUrl) - replacement in daemon/AftokD/AftokM.hs at line 147
-> T.Day-> C.Day - replacement in daemon/AftokD/AftokM.hs at line 152
let template = (newSTMP . unpack) <$> (sub ^. (billable . paymentRequestMemoTemplate))let template = (newSTMP . T.unpack) <$> (sub ^. (billable . paymentRequestMemoTemplate)) - replacement in daemon/AftokD/AftokM.hs at line 156
, ("billing_date", tshow billingDate), ("issue_time", tshow requestTime), ("billing_date", show billingDate), ("issue_time", show requestTime) - replacement in daemon/AftokD/AftokM.hs at line 173
payloadGen :: Monad m => Subscription' UserId Billable -> T.Day -> C.UTCTime -> m (Maybe ByteString)payloadGen :: Monad m => Subscription' UserId Billable -> C.Day -> C.UTCTime -> m (Maybe ByteString) - edit in daemon/AftokD.hs at line 4
import ClassyPrelude hiding (FilePath) - replacement in daemon/AftokD.hs at line 10
import Filesystem.Path.CurrentOS (FilePath, fromText, encodeString)import Filesystem.Path.CurrentOS (fromText, encodeString)import qualified Filesystem.Path.CurrentOS as P - replacement in daemon/AftokD.hs at line 18
, _templatePath :: FilePath, _templatePath :: P.FilePath - replacement in daemon/AftokD.hs at line 31
loadConfig :: FilePath -> IO ConfigloadConfig :: P.FilePath -> IO Config - edit in daemon/Main.hs at line 2
{-# LANGUAGE TypeApplications #-} - replacement in daemon/Main.hs at line 5
import ClassyPrelude - edit in daemon/Main.hs at line 7
import Control.Exception (try) - edit in daemon/Main.hs at line 9
import System.IO.Error (IOError) - replacement in daemon/Main.hs at line 15
main :: IO ()main :: IO () - replacement in daemon/Main.hs at line 17
cfgPath <- try $ getEnv "AFTOK_CFG" :: IO (Either IOError String)cfgPath <- try @IOError $ getEnv "AFTOK_CFG" - edit in lib/Aftok/Auction.hs at line 5
import ClassyPrelude hiding (rem) - edit in lib/Aftok/Auction.hs at line 6
import Control.Monad.State - replacement in lib/Aftok/Auction.hs at line 78
let winFraction rem = rem % (bid ^. bidAmount . satoshi)remainderSeconds (Satoshi rem) = Seconds . round $ winFraction rem * fromIntegral (bid ^. bidSeconds)adjustBid rem = bid & bidSeconds .~ remainderSeconds rem & bidAmount .~ remlet winFraction r = r % (bid ^. bidAmount . satoshi)remainderSeconds (Satoshi r) = Seconds . round $ winFraction r * fromIntegral (bid ^. bidSeconds)adjustBid r = bid & bidSeconds .~ remainderSeconds r & bidAmount .~ r - replacement in lib/Aftok/Auction.hs at line 103
let winFraction rem = rem % (bid ^. bidAmount . satoshi)remainderSeconds (Satoshi rem) = Seconds . round $ winFraction rem * fromIntegral (bid ^. bidSeconds)let winFraction r = r % (bid ^. bidAmount . satoshi)remainderSeconds (Satoshi r) = Seconds . round $ winFraction r * fromIntegral (bid ^. bidSeconds) - edit in lib/Aftok/Billables.hs at line 9
import ClassyPrelude - edit in lib/Aftok/Billables.hs at line 10
- edit in lib/Aftok/Config.hs at line 4
import ClassyPrelude hiding (FilePath) - replacement in lib/Aftok/Config.hs at line 11
import Filesystem.Path.CurrentOS (FilePath, fromText, encodeString)import Filesystem.Path.CurrentOS (fromText, encodeString)import qualified Filesystem.Path.CurrentOS as Pimport Safe (headMay) - replacement in lib/Aftok/Config.hs at line 32
, _signingKeyFile :: FilePath, _certsFile :: FilePath, _signingKeyFile :: P.FilePath, _certsFile :: P.FilePath - replacement in lib/Aftok/Currency/Bitcoin.hs at line 7
import ClassyPrelude - edit in lib/Aftok/Database/PostgreSQL/Types.hs at line 3
import ClassyPrelude hiding (null) - edit in lib/Aftok/Database/PostgreSQL.hs at line 3
{-# LANGUAGE LambdaCase #-} - replacement in lib/Aftok/Database/PostgreSQL.hs at line 8
import ClassyPrelude hiding (null)import Prelude hiding (null) - edit in lib/Aftok/Database/PostgreSQL.hs at line 28
import Safe (headMay) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 196[3.3624]→[3.1153:1250](∅→∅),[3.1250]→[3.2107:2168](∅→∅),[3.3727]→[3.2107:2168](∅→∅),[3.2168]→[3.1251:1420](∅→∅)
prec "annually" = nullField *> pure B.Annuallyprec "monthly" = B.Monthly <$> field--prec "semimonthly" = nullField *> pure B.SemiMonthlyprec "weekly" = B.Weekly <$> fieldprec "onetime" = nullField *> pure B.OneTimeprec s = fail $ "Unrecognized recurrence type: " ++ show sprec = \case"annually" -> nullField *> pure B.Annually"monthly" -> B.Monthly <$> field--"semimonthly" = nullField *> pure B.SemiMonthly"weekly" -> B.Weekly <$> field"onetime" -> nullField *> pure B.OneTime_ -> empty - replacement in lib/Aftok/Database/PostgreSQL.hs at line 215
<*> ((either fail pure . runGet decodeMessage) =<< field)<*> ((either (const empty) pure . runGet decodeMessage) =<< field) - replacement in lib/Aftok/Database/PostgreSQL.hs at line 223
<*> (field >>= (either fail pure . runGet decodeMessage))<*> (field >>= (either (const empty) pure . runGet decodeMessage)) - replacement in lib/Aftok/Database.hs at line 10
import ClassyPrelude - edit in lib/Aftok/Database.hs at line 16
import Safe (headMay) - edit in lib/Aftok/Interval.hs at line 10
import ClassyPrelude - edit in lib/Aftok/Interval.hs at line 11
- edit in lib/Aftok/Json.hs at line 11
import ClassyPrelude hiding (Day, fail, fromEitherM, UTCTime) - edit in lib/Aftok/Json.hs at line 27
import qualified Data.Text.Encoding as T - replacement in lib/Aftok/Json.hs at line 57
printVersion Version{..} = T.intercalate "." $ fmap (pack . show) [majorVersion, minorVersion]printVersion Version{..} = T.intercalate "." $ fmap (T.pack . show) [majorVersion, minorVersion] - replacement in lib/Aftok/Json.hs at line 88
vers <- fromEitherM fail $ PC.parseOnly versionParser (encodeUtf8 verstr)vers <- fromEitherM fail $ PC.parseOnly versionParser (T.encodeUtf8 verstr) - replacement in lib/Aftok/Json.hs at line 108
const . fail $ "Unrecognized " <> name <> " schema version: " <> unpack (printVersion ver)const . fail $ "Unrecognized " <> name <> " schema version: " <> T.unpack (printVersion ver) - replacement in lib/Aftok/Json.hs at line 137
, "initiator" .= tshow (p ^. (P.initiator._UserId)), "initiator" .= (p ^. P.initiator . _UserId) - replacement in lib/Aftok/Json.hs at line 155
obj [ "bidId" .= tshow (pid ^. _BidId) ]obj [ "bidId" .= (pid ^. _BidId) ] - replacement in lib/Aftok/Json.hs at line 184
(fail . unpack $ "Address " <> addrText <> " cannot be parsed as a BTC network address.")(fail . T.unpack $ "Address " <> addrText <> " cannot be parsed as a BTC network address.") - replacement in lib/Aftok/Json.hs at line 329
prBytes = (paymentRequest . to (decodeUtf8 . B64.encode . runPut . encodeMessage))prBytes = paymentRequest . to (T.decodeUtf8 . B64.encode . runPut . encodeMessage) - replacement in lib/Aftok/Json.hs at line 354
paymentBytes = payment . to (decodeUtf8 . B64.encode . runPut . encodeMessage)paymentBytes = payment . to (T.decodeUtf8 . B64.encode . runPut . encodeMessage) - replacement in lib/Aftok/Json.hs at line 387
parseA tid = fail . unpack $ "Amendment type " <> tid <> " not recognized."parseA tid = fail . T.unpack $ "Amendment type " <> tid <> " not recognized." - replacement in lib/Aftok/Json.hs at line 400
parseA tid = fail . unpack $ "Amendment type " <> tid <> " not recognized."parseA tid = fail . T.unpack $ "Amendment type " <> tid <> " not recognized." - edit in lib/Aftok/Payments/Types.hs at line 9
import ClassyPrelude - edit in lib/Aftok/Payments/Types.hs at line 10
- replacement in lib/Aftok/Payments/Types.hs at line 15
import Data.Thyme.Time as Timport Data.Thyme.Time as Cimport qualified Data.Text as T - replacement in lib/Aftok/Payments/Types.hs at line 42
, _billingDate :: T.Day, _billingDate :: C.Day - replacement in lib/Aftok/Payments/Types.hs at line 65
let check = any ((now >) . T.toThyme . expiryTime)let check = any ((now >) . C.toThyme . expiryTime) - replacement in lib/Aftok/Payments/Types.hs at line 68
in either error (check . getExpires) $ getPaymentDetails (view paymentRequest req)in either (error . T.pack) (check . getExpires) $ getPaymentDetails (view paymentRequest req) - edit in lib/Aftok/Payments.hs at line 10
import ClassyPrelude - edit in lib/Aftok/Payments.hs at line 11
- edit in lib/Aftok/Project.hs at line 5
import ClassyPrelude - edit in lib/Aftok/Project.hs at line 6
- edit in lib/Aftok/Project.hs at line 10
import qualified Data.ByteString as BS - replacement in lib/Aftok/Project.hs at line 35
if length code == 32if BS.length code == 32 - edit in lib/Aftok/TimeLog/Serialization.hs at line 2
{-# LANGUAGE NoImplicitPrelude #-} - replacement in lib/Aftok/TimeLog/Serialization.hs at line 8
import ClassyPrelude - edit in lib/Aftok/TimeLog/Serialization.hs at line 14
import Data.Text (unpack) - edit in lib/Aftok/TimeLog.hs at line 2
{-# LANGUAGE NoImplicitPrelude #-} - edit in lib/Aftok/Types.hs at line 2
{-# LANGUAGE NoImplicitPrelude #-} - edit in lib/Aftok/Util/Http.hs at line 3
import ClassyPrelude - edit in lib/Aftok/Util/Http.hs at line 4
- edit in lib/Aftok/Util.hs at line 6
import ClassyPrelude - edit in lib/Aftok/Util.hs at line 7
- edit in server/Aftok/QConfig.hs at line 6
import ClassyPrelude hiding (FilePath) - replacement in server/Aftok/QConfig.hs at line 7
import Control.Lens (makeLenses, (^.))import Control.Lens (makeLenses, (^.)) - replacement in server/Aftok/QConfig.hs at line 11
import System.Directory (doesFileExist, doesPathExist, listDirectory)import qualified Data.List as L - replacement in server/Aftok/QConfig.hs at line 13
import Filesystem.Path.CurrentOS (FilePath, fromText, encodeString, parent)import Filesystem.Path.CurrentOS (fromText, encodeString)import qualified Filesystem.Path.CurrentOS as P - replacement in server/Aftok/QConfig.hs at line 23
{ _hostname :: ByteString{ _hostname :: C8.ByteString - replacement in server/Aftok/QConfig.hs at line 25
, _authSiteKey :: FilePath, _authSiteKey :: P.FilePath - replacement in server/Aftok/QConfig.hs at line 30
, _templatePath :: FilePath, _staticAssetPath :: FilePath, _templatePath :: P.FilePath, _staticAssetPath :: P.FilePath - replacement in server/Aftok/QConfig.hs at line 35
loadQConfig :: FilePath -> IO QConfigloadQConfig :: P.FilePath -> IO QConfig - edit in server/Aftok/QConfig.hs at line 38
cfgExists <- doesFileExist $ encodeString cfgFilepathExists <- doesPathExist $ encodeString cfgFilefiles <- listDirectory (encodeString $ parent cfgFile)putStrLn $ "Loading config from: " <> (pack . encodeString $ cfgFile)<> "; file exists = " <> (pack . show $ cfgExists)<> "; path exists = " <> (pack . show $ pathExists)<> "; parent dir = " <> (pack . encodeString $ parent cfgFile)<> "; dir contents = " <> (pack . show $ files) - replacement in server/Aftok/QConfig.hs at line 39
let dbEnvCfg = pgsDefaultConfig . C8.pack <$> lookup "DATABASE_URL" envconf <- readQConfig cfg dbEnvCfgputStrLn $ "Config loaded successfully."pure conflet dbEnvCfg = pgsDefaultConfig . C8.pack <$> L.lookup "DATABASE_URL" envreadQConfig cfg dbEnvCfg - replacement in server/Aftok/Snaplet/Auctions.hs at line 9
import ClassyPrelude - replacement in server/Aftok/Snaplet/Auctions.hs at line 49
req <- either (snapError 400 . tshow) pure $ parseEither auctionCreateParser requestBodyreq <- either (snapError 400 . show) pure $ parseEither auctionCreateParser requestBody - replacement in server/Aftok/Snaplet/Auctions.hs at line 59
(snapError 404 $ "Auction not found for id " <> tshow aid)(snapError 404 $ "Auction not found for id " <> show aid) - replacement in server/Aftok/Snaplet/Auctions.hs at line 68
bid <- either (snapError 400 . tshow) pure $ parseEither (bidCreateParser uid timestamp) requestBodybid <- either (snapError 400 . show) pure $ parseEither (bidCreateParser uid timestamp) requestBody - replacement in server/Aftok/Snaplet/Auth.hs at line 3
import ClassyPrelude - replacement in server/Aftok/Snaplet/Auth.hs at line 49
writeText $ "Access Denied: " <> tshow failurewriteText $ "Access Denied: " <> show failure - replacement in server/Aftok/Snaplet/Billing.hs at line 9
import ClassyPrelude - replacement in server/Aftok/Snaplet/Billing.hs at line 50
b <- either (snapError 400 . tshow) pure $ parseEither (parseCreateBillable uid pid) requestBodyb <- either (snapError 400 . show) pure $ parseEither (parseCreateBillable uid pid) requestBody - edit in server/Aftok/Snaplet/Payments.hs at line 9
import ClassyPrelude - edit in server/Aftok/Snaplet/Payments.hs at line 10
- edit in server/Aftok/Snaplet/Payments.hs at line 13
import Control.Exception (try) - edit in server/Aftok/Snaplet/Payments.hs at line 18
import qualified Data.Text.Encoding as T - replacement in server/Aftok/Snaplet/Payments.hs at line 31
import Aftok.Paymentsimport Aftok.Payments - replacement in server/Aftok/Snaplet/Payments.hs at line 53
(\msg -> snapError 400 $ "Could not decode payment response: " <> tshow msg)(\msg -> snapError 400 $ "Could not decode payment response: " <> show msg) - replacement in server/Aftok/Snaplet/Payments.hs at line 61
exchResp <- liftIO . try $ asValue =<< (withOpenSSL $ getWith opts (cfg ^. exchangeRateServiceURI))_ <- traverse (logError . encodeUtf8 . tshow @ HttpException) (preview _Left exchResp)exchResp <- liftIO . try @HttpException $ asValue =<< (withOpenSSL $ getWith opts (cfg ^. exchangeRateServiceURI))_ <- traverse (logError . T.encodeUtf8 . show) (preview _Left exchResp) - edit in server/Aftok/Snaplet/Projects.hs at line 11
import ClassyPrelude hiding (FilePath) - replacement in server/Aftok/Snaplet/Projects.hs at line 17
import Filesystem.Path.CurrentOS (FilePath, encodeString)import Filesystem.Path.CurrentOS (encodeString)import qualified Filesystem.Path.CurrentOS as F - replacement in server/Aftok/Snaplet/Projects.hs at line 48
cp <- either (snapError 400 . tshow) pure $ A.eitherDecode requestBodycp <- either (snapError 400 . show) pure $ A.eitherDecode requestBody - replacement in server/Aftok/Snaplet/Projects.hs at line 62
(snapError 404 $ "Project not found for id " <> tshow pid)(snapError 404 $ "Project not found for id " <> show pid) - replacement in server/Aftok/Snaplet/Projects.hs at line 91
buildProjectInviteEmail :: FilePathbuildProjectInviteEmail :: F.FilePath - edit in server/Aftok/Snaplet/Users.hs at line 9
import ClassyPrelude - edit in server/Aftok/Snaplet/Users.hs at line 10
- edit in server/Aftok/Snaplet/Users.hs at line 13
import qualified Data.Map.Strict as M - replacement in server/Aftok/Snaplet/Users.hs at line 78
(lookup "invCode" params)(M.lookup "invCode" params) - edit in server/Aftok/Snaplet/Util.hs at line 3
import ClassyPrelude - replacement in server/Aftok/Snaplet/Util.hs at line 4
import Control.Monad.Trans.Maybe - edit in server/Aftok/Snaplet/WorkLog.hs at line 3
import ClassyPrelude - edit in server/Aftok/Snaplet/WorkLog.hs at line 4
- edit in server/Aftok/Snaplet/WorkLog.hs at line 10
import qualified Data.Text as T - replacement in server/Aftok/Snaplet/WorkLog.hs at line 40
snapError 400 $ "Unable to parse log entry " <> (tshow requestBody) <> ": " <> tshow errsnapError 400 $ "Unable to parse log entry " <> (show requestBody) <> ": " <> show err - replacement in server/Aftok/Snaplet/WorkLog.hs at line 55
snapError 400 $ "Unable to parse bitcoin address from " <> (tshow addrBytes)snapError 400 $ "Unable to parse bitcoin address from " <> (show addrBytes) - replacement in server/Aftok/Snaplet/WorkLog.hs at line 85
(snapError 400 $ "Project not found for id " <> tshow pid)(snapError 400 $ "Project not found for id " <> show pid) - replacement in server/Aftok/Snaplet/WorkLog.hs at line 103
(snapError 400 . pack)(snapError 400 . T.pack) - edit in server/Aftok/Snaplet.hs at line 6
import ClassyPrelude - edit in server/Aftok/Snaplet.hs at line 7
- edit in server/Aftok/Snaplet.hs at line 9
import Control.Monad.Readerimport Control.Monad.State - replacement in server/Aftok/Snaplet.hs at line 52
snapError 403 $ tshow reason <> " (User " <> tshow uid <> ")"snapError 403 $ show reason <> " (User " <> show uid <> ")" - replacement in server/Aftok/Snaplet.hs at line 65
writeText $ ((tshow c) <> " - " <> t)writeText $ ((show c) <> " - " <> t) - replacement in server/Aftok/Snaplet.hs at line 76
maybe (snapError 400 $ "Parameter "<> tshow name <>" is required") pure maybeBytesmaybe (snapError 400 $ "Parameter "<> show name <>" is required") pure maybeBytes - replacement in server/Aftok/Snaplet.hs at line 85
(const . snapError 400 $ "Value of parameter "<> tshow name <>" could not be parsed to a valid value.")(const . snapError 400 $ "Value of parameter "<> show name <>" could not be parsed to a valid value.") - edit in server/Main.hs at line 1
{-# LANGUAGE TypeApplications #-} - edit in server/Main.hs at line 5[3.1461]→[3.37690:37739](∅→∅),[3.170]→[3.5259:5260](∅→∅),[3.1340]→[3.5259:5260](∅→∅),[3.1482]→[3.5259:5260](∅→∅),[3.11227]→[3.5259:5260](∅→∅),[3.37739]→[3.5259:5260](∅→∅),[3.5259]→[3.5259:5260](∅→∅)
import ClassyPrelude hiding (FilePath) - edit in server/Main.hs at line 6
import Control.Exception (try) - edit in server/Main.hs at line 8
import Data.Either.Combinators (fromRight) - edit in server/Main.hs at line 12
import System.IO.Error (IOError) - replacement in server/Main.hs at line 37
cfgPath <- try $ getEnv "AFTOK_CFG" :: IO (Either IOError String)cfgPath <- try @IOError $ getEnv "AFTOK_CFG" - edit in test/Aftok/AuctionSpec.hs at line 3
import ClassyPrelude - edit in test/Aftok/AuctionSpec.hs at line 4
- edit in test/Aftok/Generators.hs at line 3
import ClassyPrelude - edit in test/Aftok/Generators.hs at line 4
- replacement in test/Aftok/PaymentsSpec.hs at line 5
import ClassyPrelude - edit in test/Aftok/TimeLogSpec.hs at line 1
{-# LANGUAGE NoImplicitPrelude #-} - replacement in test/Aftok/TimeLogSpec.hs at line 7
import ClassyPrelude - edit in test/Aftok/Util/HttpSpec.hs at line 1
{-# LANGUAGE NoImplicitPrelude #-} - replacement in test/Aftok/Util/HttpSpec.hs at line 6
import ClassyPrelude