coinbase-pro 0.9.2.2 → 0.9.3.0
raw patch · 5 files changed
+121/−12 lines, 5 filesdep +tastydep +tasty-hunitPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependencies added: tasty, tasty-hunit
API changes (from Hackage documentation)
- CoinbasePro.Authenticated.Orders: [bTif] :: PlaceOrderBody -> Maybe TimeInForce
+ CoinbasePro.Authenticated: placeOrderBody :: PlaceOrderBody -> CBAuthT ClientM Order
+ CoinbasePro.Authenticated.Orders: Entry :: StopLossSide
+ CoinbasePro.Authenticated.Orders: Loss :: StopLossSide
+ CoinbasePro.Authenticated.Orders: [bStopPrice] :: PlaceOrderBody -> Maybe Price
+ CoinbasePro.Authenticated.Orders: [bStop] :: PlaceOrderBody -> Maybe StopLossSide
+ CoinbasePro.Authenticated.Orders: [bTimeInForce] :: PlaceOrderBody -> Maybe TimeInForce
+ CoinbasePro.Authenticated.Orders: [stopPrice] :: Order -> Maybe Price
+ CoinbasePro.Authenticated.Orders: [stop] :: Order -> Maybe StopLossSide
+ CoinbasePro.Authenticated.Orders: data StopLossSide
+ CoinbasePro.Authenticated.Orders: instance Data.Aeson.Types.FromJSON.FromJSON CoinbasePro.Authenticated.Orders.StopLossSide
+ CoinbasePro.Authenticated.Orders: instance Data.Aeson.Types.ToJSON.ToJSON CoinbasePro.Authenticated.Orders.StopLossSide
+ CoinbasePro.Authenticated.Orders: instance GHC.Classes.Eq CoinbasePro.Authenticated.Orders.StopLossSide
+ CoinbasePro.Authenticated.Orders: instance GHC.Classes.Ord CoinbasePro.Authenticated.Orders.StopLossSide
+ CoinbasePro.Authenticated.Orders: instance GHC.Show.Show CoinbasePro.Authenticated.Orders.StopLossSide
+ CoinbasePro.Authenticated.Orders: instance Web.Internal.HttpApiData.ToHttpApiData CoinbasePro.Authenticated.Orders.StopLossSide
- CoinbasePro.Authenticated.Orders: Order :: OrderId -> Maybe Price -> Maybe Size -> ProductId -> Side -> Maybe STP -> OrderType -> Maybe TimeInForce -> Bool -> CreatedAt -> FillFees -> Size -> Maybe ExecutedValue -> Status -> Bool -> Order
+ CoinbasePro.Authenticated.Orders: Order :: OrderId -> Maybe Price -> Maybe Size -> ProductId -> Side -> Maybe STP -> OrderType -> Maybe TimeInForce -> Maybe Bool -> CreatedAt -> FillFees -> Size -> Maybe ExecutedValue -> Status -> Bool -> Maybe StopLossSide -> Maybe Price -> Order
- CoinbasePro.Authenticated.Orders: PlaceOrderBody :: Maybe ClientOrderId -> ProductId -> Side -> Size -> Price -> Bool -> Maybe OrderType -> Maybe STP -> Maybe TimeInForce -> PlaceOrderBody
+ CoinbasePro.Authenticated.Orders: PlaceOrderBody :: Maybe ClientOrderId -> ProductId -> Side -> Size -> Price -> Bool -> Maybe OrderType -> Maybe STP -> Maybe TimeInForce -> Maybe StopLossSide -> Maybe Price -> PlaceOrderBody
- CoinbasePro.Authenticated.Orders: [postOnly] :: Order -> Bool
+ CoinbasePro.Authenticated.Orders: [postOnly] :: Order -> Maybe Bool
Files
- changelog.md +16/−0
- coinbase-pro.cabal +50/−1
- src/lib/CoinbasePro/Authenticated.hs +11/−1
- src/lib/CoinbasePro/Authenticated/Orders.hs +26/−10
- src/test/Test.hs +18/−0
changelog.md view
@@ -1,3 +1,19 @@+# Version 0.9.3.0++- `Order` now has `Maybe Bool` instead of `Bool` for `postOnly`. Required to maintain spec compliance.+ From https://docs.pro.coinbase.com/#upcoming-changes:++```+08/09/21++ Orders with a "pending" status returned by the REST API endpoints GET /orders, GET /orders/<id>,+ and GET /orders/client:<client_oid> will have a reduced set of fields. See the List Orders documentation+ for more details. Orders with non-pending statuses will be unaffected by this change. The change will+ take effect in Sandbox starting after August 12th, 2021 and in Production starting after August 19th, 2021.+```++- Added tests to test order parsing from json file+ # Version 0.9.2.2 - Added `CoinbasePro.Unauthenticated.singleProduct`
coinbase-pro.cabal view
@@ -5,7 +5,7 @@ -- see: https://github.com/sol/hpack name: coinbase-pro-version: 0.9.2.2+version: 0.9.3.0 synopsis: Client for Coinbase Pro description: Client for Coinbase Pro REST and Websocket APIs category: Web, Finance@@ -93,6 +93,8 @@ , servant >=0.14 && <0.19 , servant-client >=0.14 && <0.19 , servant-client-core >=0.14 && <0.19+ , tasty >=1.2.2+ , tasty-hunit >=0.10 , text ==1.2.* , time >=1.8 && <2.0 , transformers ==0.5.*@@ -133,6 +135,8 @@ , servant >=0.14 && <0.19 , servant-client >=0.14 && <0.19 , servant-client-core >=0.14 && <0.19+ , tasty >=1.2.2+ , tasty-hunit >=0.10 , text ==1.2.* , time >=1.8 && <2.0 , transformers ==0.5.*@@ -173,6 +177,51 @@ , servant >=0.14 && <0.19 , servant-client >=0.14 && <0.19 , servant-client-core >=0.14 && <0.19+ , tasty >=1.2.2+ , tasty-hunit >=0.10+ , text ==1.2.*+ , time >=1.8 && <2.0+ , transformers ==0.5.*+ , unagi-streams ==0.2.*+ , unordered-containers ==0.2.*+ , uuid ==1.3.*+ , vector ==0.12.*+ , websockets ==0.12.*+ , wuss ==1.1.*+ default-language: Haskell2010++test-suite coinbase-pro-test+ type: exitcode-stdio-1.0+ main-is: Test.hs+ other-modules:+ Paths_coinbase_pro+ hs-source-dirs:+ src/test+ build-depends:+ HsOpenSSL ==0.11.*+ , aeson >=1.2 && <1.6+ , aeson-casing >=0.1 && <0.3+ , async >=2.1 && <2.3+ , base >=4.7 && <5+ , binary ==0.8.*+ , bytestring ==0.10.*+ , coinbase-pro+ , containers >=0.5 && <0.7+ , cryptonite >=0.24 && <0.30+ , exceptions >=0.4 && <1.0+ , http-api-data >=0.3 && <0.5+ , http-client >=0.5 && <0.7+ , http-client-tls ==0.3.*+ , http-streams ==0.8.*+ , http-types ==0.12.*+ , io-streams ==1.5.*+ , memory >=0.14 && <0.16+ , network >=2.6 && <3.2+ , servant >=0.14 && <0.19+ , servant-client >=0.14 && <0.19+ , servant-client-core >=0.14 && <0.19+ , tasty >=1.2.2+ , tasty-hunit >=0.10 , text ==1.2.* , time >=1.8 && <2.0 , transformers ==0.5.*
src/lib/CoinbasePro/Authenticated.hs view
@@ -11,6 +11,7 @@ , getOrder , getClientOrder , placeOrder+ , placeOrderBody , cancelOrder , cancelAll , fills@@ -247,7 +248,16 @@ authRequest methodPost requestPath (encodeBody body) $ API.placeOrder body where requestPath = encodeRequestPath [ordersPath]- body = PlaceOrderBody clordid prid sd sz price po ot stp tif+ body = PlaceOrderBody clordid prid sd sz price po ot stp tif Nothing Nothing+++-- | https://docs.pro.coinbase.com/#place-a-new-order+-- Use the underlying post body record+placeOrderBody :: PlaceOrderBody -> CBAuthT ClientM Order+placeOrderBody body =+ authRequest methodPost requestPath (encodeBody body) $ API.placeOrder body+ where+ requestPath = encodeRequestPath [ordersPath] -- | https://docs.pro.coinbase.com/#cancel-an-order
src/lib/CoinbasePro/Authenticated/Orders.hs view
@@ -8,6 +8,7 @@ , STP (..) , TimeInForce (..) , PlaceOrderBody (..)+ , StopLossSide (..) , statuses ) where@@ -94,7 +95,18 @@ parseJSON = withText "executed_value" $ \t -> return . ExecutedValue . read $ unpack t +data StopLossSide = Loss | Entry+ deriving (Eq, Ord, Show) ++instance ToHttpApiData StopLossSide where+ toUrlPiece = toLower . pack . show+ toQueryParam = toLower . pack . show+++deriveJSON defaultOptions {constructorTagModifier = fmap Char.toLower} ''StopLossSide++ -- TODO: This might need to be split up into different order types. data Order = Order { id :: OrderId@@ -105,13 +117,15 @@ , stp :: Maybe STP , orderType :: OrderType , timeInForce :: Maybe TimeInForce- , postOnly :: Bool+ , postOnly :: Maybe Bool , createdAt :: CreatedAt , fillFees :: FillFees , filledSize :: Size , executedValue :: Maybe ExecutedValue , status :: Status , settled :: Bool+ , stop :: Maybe StopLossSide+ , stopPrice :: Maybe Price } deriving (Eq, Show) @@ -119,15 +133,17 @@ data PlaceOrderBody = PlaceOrderBody- { bClientOid :: Maybe ClientOrderId- , bProductId :: ProductId- , bSide :: Side- , bSize :: Size- , bPrice :: Price- , bPostOnly :: Bool- , bOrderType :: Maybe OrderType- , bStp :: Maybe STP- , bTif :: Maybe TimeInForce+ { bClientOid :: Maybe ClientOrderId+ , bProductId :: ProductId+ , bSide :: Side+ , bSize :: Size+ , bPrice :: Price+ , bPostOnly :: Bool+ , bOrderType :: Maybe OrderType+ , bStp :: Maybe STP+ , bTimeInForce :: Maybe TimeInForce+ , bStop :: Maybe StopLossSide+ , bStopPrice :: Maybe Price } deriving (Eq, Show)
+ src/test/Test.hs view
@@ -0,0 +1,18 @@+import Data.Aeson (decode')+import qualified Data.ByteString.Lazy as B+import Data.Maybe (isJust)+import Test.Tasty+import Test.Tasty.HUnit++import CoinbasePro.Authenticated.Orders (Order)+++main :: IO ()+main = defaultMain listOrderParse+++listOrderParse :: TestTree+listOrderParse = testCase "parse orders" $ do+ bytes <- B.readFile "./src/test/data/list-orders.json"+ let orders = (decode' bytes :: Maybe [Order])+ assertBool "failed to parse" $ isJust orders