DigitalOcean 0.1.0.0 → 0.1.1.0
raw patch · 5 files changed
+58/−10 lines, 5 filesdep −randomdep ~mtlPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependencies removed: random
Dependency ranges changed: mtl
API changes (from Hackage documentation)
+ Net.DigitalOcean.Images: instance FromJSON (Maybe Image)
+ Net.DigitalOcean.Regions: instance FromJSON (Maybe Region)
- Net.DigitalOcean.Droplets: drpImage :: Lens' Droplet Image
+ Net.DigitalOcean.Droplets: drpImage :: Lens' Droplet (Maybe Image)
- Net.DigitalOcean.Droplets: drpRegion :: Lens' Droplet Region
+ Net.DigitalOcean.Droplets: drpRegion :: Lens' Droplet (Maybe Region)
- Net.DigitalOcean.Droplets: krnId :: Lens' Kernel Text
+ Net.DigitalOcean.Droplets: krnId :: Lens' Kernel Int
- Net.DigitalOcean.Regions: Region :: !Text -> !Text -> ![Text] -> ![Text] -> !Bool -> Region
+ Net.DigitalOcean.Regions: Region :: !Text -> !Text -> ![Text] -> ![Text] -> Maybe Bool -> Region
- Net.DigitalOcean.Regions: _rgnAvailable :: Region -> !Bool
+ Net.DigitalOcean.Regions: _rgnAvailable :: Region -> Maybe Bool
- Net.DigitalOcean.Regions: rgnAvailable :: Lens' Region Bool
+ Net.DigitalOcean.Regions: rgnAvailable :: Lens' Region (Maybe Bool)
Files
- DigitalOcean.cabal +4/−5
- examples/CreateDroplet.hs +32/−0
- src/Net/DigitalOcean/Droplets.hs +3/−3
- src/Net/DigitalOcean/Images.hs +9/−0
- src/Net/DigitalOcean/Regions.hs +10/−2
DigitalOcean.cabal view
@@ -1,5 +1,5 @@ name: DigitalOcean-version: 0.1.0.0+version: 0.1.1.0 synopsis: A client library for the DigitalOcean API license: AGPL-3 license-file: LICENSE@@ -9,7 +9,8 @@ build-type: Simple cabal-version: >=1.10 extra-source-files: README.md,- examples/SSHKeyInfo.hs+ examples/SSHKeyInfo.hs,+ examples/CreateDroplet.hs library exposed-modules: Net.DigitalOcean,@@ -25,10 +26,8 @@ ghc-options: -Wall build-depends: base >=4.7 && <4.8, text >= 1.2.0.3 && < 1.3,- -- Require Control.Monad.Except- mtl >= 2.2.1, -- Transative dependencies I don't want to constrain- lens, wreq, aeson, containers, random,+ lens, wreq, aeson, containers, mtl, bytestring, unordered-containers, vector, transformers, exceptions hs-source-dirs: src
+ examples/CreateDroplet.hs view
@@ -0,0 +1,32 @@+module Main where++import qualified Data.Text as T+import qualified Net.DigitalOcean as DO+import System.Environment (getArgs)+import Text.Printf (printf)+import Control.Lens++main :: IO ()+main = do+ auth <- fmap head getArgs++ putStrLn . show . getSSHKey . DO.Config . T.pack $ auth++getSSHKey :: T.Text -> DO.Config -> IO DO.SSHKey+getSSHKey keyName c =+ DO.getSSHKeys c >>= \keys ->+ case find (\k -> k ^. DO.keyName == keyName) keys of+ Just k -> return k+ Nothing -> error "No key found"++createDroplet c =+ let region = "nyc3"+ sshKeyName = "Milo"+ image = "ubuntu-14-04-x64"+ size = "512mb"+ dropletName = "test"++ sshKey <- getSSHKey sshKeyName c+ let dco = (DO.defaultDCO dropletName region size image)+ & DO.dcoSSHKeys ?~ [sshKey ^. DO.keyFingerprint]+ DO.createDroplet dco c
src/Net/DigitalOcean/Droplets.hs view
@@ -114,7 +114,7 @@ parseJSON _ = error "network must be object" data Kernel = Kernel- { _krnId :: !T.Text+ { _krnId :: !Int , _krnName :: !T.Text , _krnVersion :: !T.Text } deriving (Show, Eq)@@ -139,8 +139,8 @@ , _drpBackupIds :: ![T.Text] , _drpSnapshotIds :: ![T.Text] , _drpFeatures :: ![T.Text]- , _drpRegion :: Region- , _drpImage :: Image+ , _drpRegion :: Maybe Region+ , _drpImage :: Maybe Image , _drpNetworks :: [Network] , _drpKernel :: Kernel } deriving (Show, Eq)
src/Net/DigitalOcean/Images.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE FlexibleInstances #-} module Net.DigitalOcean.Images ( Image(..) , getImages@@ -14,6 +15,7 @@ ) where import qualified Data.Text as T import qualified Data.Map as M+import qualified Data.HashMap.Strict as HM import qualified Network.Wreq as W import Data.Aeson(FromJSON(..), Value(..), (.:)) import Control.Applicative@@ -50,6 +52,13 @@ x .: "created_at" <*> x .: "min_disk_size" parseJSON _ = fail "image must be object"+++instance FromJSON (Maybe Image) where+ parseJSON xs@(Object x)+ | HM.null x = return Nothing+ | otherwise = fmap Just . parseJSON $ xs+ parseJSON _ = return Nothing imagesEndpoint :: String imagesEndpoint = "/v2/images/"
src/Net/DigitalOcean/Regions.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE FlexibleInstances #-} module Net.DigitalOcean.Regions ( Region(..) , getRegions@@ -6,7 +7,8 @@ , rgnName, rgnSlug, rgnSizes, rgnFeatures, rgnAvailable ) where import qualified Data.Text as T-import Data.Aeson(FromJSON(..), Value(..), (.:))+import qualified Data.HashMap.Strict as HM+import Data.Aeson(FromJSON(..), Value(..), (.:), fromJSON) import Control.Applicative import Control.Lens hiding (Action) @@ -22,7 +24,7 @@ , _rgnSlug :: !T.Text , _rgnSizes :: ![T.Text] , _rgnFeatures :: ![T.Text]- , _rgnAvailable :: !Bool+ , _rgnAvailable :: Maybe Bool } deriving (Show, Eq) makeLenses ''Region @@ -34,6 +36,12 @@ x .: "features" <*> x .: "available" parseJSON _ = fail "region must be object"++instance FromJSON (Maybe Region) where+ parseJSON xs@(Object x)+ | HM.null x = return Nothing+ | otherwise = fmap Just . parseJSON $ xs+ parseJSON _ = return Nothing -- | Returns a list of all the visible Digital Ocean regions --