packages feed

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 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