hetzner 0.5.0.0 → 0.6.0.0
raw patch · 5 files changed
+68/−20 lines, 5 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
+ Hetzner.Cloud: [imageArchitecture] :: Image -> Architecture
+ Hetzner.Cloud: [imageName] :: Image -> Text
- Hetzner.Cloud: Image :: ZonedTime -> Maybe ZonedTime -> Maybe ZonedTime -> Text -> Int -> ImageID -> LabelMap -> OSFlavor -> ImageType -> Image
+ Hetzner.Cloud: Image :: ImageID -> Text -> Text -> OSFlavor -> Architecture -> ImageType -> Int -> ZonedTime -> Maybe ZonedTime -> Maybe ZonedTime -> LabelMap -> Image
Files
- apps/Docs.hs +40/−4
- changelog.md +4/−0
- hetzner.cabal +1/−1
- readme.md +1/−1
- src/Hetzner/Cloud.hs +22/−14
apps/Docs.hs view
@@ -4,6 +4,7 @@ -- base import Data.Foldable (forM_) import Data.List (sortOn)+import Data.Maybe (isNothing) -- hetzner import Hetzner.Cloud qualified as Hetzner -- bytestring@@ -24,14 +25,14 @@ token <- maybe (fail "HETZNER_API_TOKEN is not set") pure mtoken now <- round <$> getPOSIXTime :: IO Int -- Server types- let dir = "public/server-types"- createDirectoryIfMissing True dir+ let serverTypesFP = "public/server-types"+ createDirectoryIfMissing True serverTypesFP serverTypes0 <- Hetzner.streamToList $ Hetzner.streamPages $ Hetzner.getServerTypes token let maxPrice = maximum . (:) 0 . fmap (Hetzner.grossPrice . Hetzner.monthlyPrice) . Hetzner.serverPricing let serverTypes = sortOn maxPrice $ filter (not . Hetzner.serverDeprecated) serverTypes0- ByteString.writeFile (dir ++ "/index.html") $ renderHtml $ H.docTypeHtml $ do+ ByteString.writeFile (serverTypesFP ++ "/index.html") $ renderHtml $ H.docTypeHtml $ do H.head $ do H.title "Hetzner Server Type List" H.link ! A.rel "stylesheet" ! A.href "https://use.typekit.net/yxf7kgr.css"@@ -47,7 +48,7 @@ H.th "Cores" H.th "Memory" H.th "Disk"- H.th "Included Traffic (TB)"+ H.th "Included Traffic" H.th "CPU Type" H.th "Max Monthly Price" forM_ serverTypes $ \serverType -> H.tr $ do@@ -63,6 +64,41 @@ Hetzner.SharedCPU -> "Shared" :: String Hetzner.DedicatedCPU -> "Dedicated" H.td $ toHtml $ show (maxPrice serverType) ++ " €"+ H.p $ H.em $ do+ "Updated "+ H.script $ preEscapedToHtml $+ "const date = new Date(" ++ show (now * 1000) ++ "); "+ ++ "document.write(date.toLocaleString());"+ "."+ -- Images+ let imagesFP = "public/images"+ createDirectoryIfMissing True imagesFP+ images0 <- Hetzner.streamToList $ Hetzner.streamPages $ Hetzner.getImages token+ let images = sortOn (show . Hetzner.imageName)+ $ filter (isNothing . Hetzner.imageDeprecated) images0+ print images+ ByteString.writeFile (imagesFP ++ "/index.html") $ renderHtml $ H.docTypeHtml $ do+ H.head $ do+ H.title "Hetzner Image List"+ H.link ! A.rel "stylesheet" ! A.href "https://use.typekit.net/yxf7kgr.css"+ H.link ! A.rel "stylesheet" ! A.href "../common.css"+ H.body $ do+ H.h1 "Hetzner Image List"+ H.p "These are the images available by default. Your project might have other images available in addition to these."+ H.hr+ H.table $ do+ H.tr ! A.class_ "hrow" $ do+ H.th "Image ID"+ H.th "Name"+ H.th "OS Flavor"+ H.th "Architecture"+ H.th "Size"+ forM_ images $ \image -> H.tr $ do+ H.td $ (\(Hetzner.ImageID i) -> toHtml i) $ Hetzner.imageID image+ H.td $ toHtml $ Hetzner.imageName image+ H.td $ toHtml $ show $ Hetzner.imageOSFlavor image+ H.td $ toHtml $ show $ Hetzner.imageArchitecture image+ H.td $ toHtml $ show (Hetzner.imageDiskSize image) ++ " GB" H.p $ H.em $ do "Updated " H.script $ preEscapedToHtml $
changelog.md view
@@ -1,3 +1,7 @@+## 0.6.0.0+* Add new fields to the `Image` type: `imageArchitecture`, `imageName`.+* Add [image list webpage](https://daniel-casanueva.gitlab.io/haskell/hetzner/images).+ ## 0.5.0.0 * Do not export internal fingerprint parser. * Wrap `Fingerprint` with a newtype to provide custom
hetzner.cabal view
@@ -2,7 +2,7 @@ category: Cloud synopsis: Hetzner Cloud and DNS library. description: Hetzner Cloud and DNS library. Check the readme and documentation for more details.-version: 0.5.0.0+version: 0.6.0.0 cabal-version: 1.18 build-type: Simple author: Daniel Casanueva (daniel.casanueva `at` proton.me)
readme.md view
@@ -15,5 +15,5 @@ ## Documentation -Access documentation from the main (potentially unreleased) branch+Find documentation from the main (potentially unreleased) branch [here](https://daniel-casanueva.gitlab.io/haskell/hetzner/doc).
src/Hetzner/Cloud.hs view
@@ -19,9 +19,9 @@ -- -- > streamPages $ getServers token :: ConduitT i Server m () ----- Or to get all actions as a stream:+-- Or to get all volumes as a stream: ----- > streamPages $ getActions token :: ConduitT i Action m ()+-- > streamPages $ getVolumes token :: ConduitT i Action m () -- -- If you are not interested in the streaming functionality, you -- can simply use 'streamToList' to turn the stream into a list:@@ -1276,16 +1276,19 @@ -- | An image that can be mounted to a server. data Image = Image- { imageCreated :: ZonedTime- , imageDeleted :: Maybe ZonedTime- , imageDeprecated :: Maybe ZonedTime+ { -- | Image identifier.+ imageID :: ImageID+ , imageName :: Text , imageDescription :: Text+ , imageOSFlavor :: OSFlavor+ , imageArchitecture :: Architecture+ , imageType :: ImageType -- | Size of the disk contained in the image in GB. , imageDiskSize :: Int- , imageID :: ImageID+ , imageCreated :: ZonedTime+ , imageDeleted :: Maybe ZonedTime+ , imageDeprecated :: Maybe ZonedTime , imageLabels :: LabelMap- , imageOSFlavor :: OSFlavor- , imageType :: ImageType } deriving Show instance FromJSON Image where@@ -1299,17 +1302,22 @@ "temporary" -> pure Temporary _ -> fail $ "Unknown image type: " ++ Text.unpack t Image- <$> o .: "created"- <*> o .: "deleted"- <*> o .: "deprecated"+ <$> o .: "id"+ <*> o .: "name" <*> o .: "description"- <*> o .: "disk_size"- <*> o .: "id"- <*> o .: "labels" <*> o .: "os_flavor"+ <*> o .: "architecture" <*> pure typ+ <*> o .: "disk_size"+ <*> o .: "created"+ <*> o .: "deleted"+ <*> o .: "deprecated"+ <*> o .: "labels" -- | Get images.+--+-- A regularly updated list of images can be found+-- [here](https://daniel-casanueva.gitlab.io/haskell/hetzner/images). getImages :: Token -> Maybe Int -- ^ Page.