metar 0.0.2 → 0.0.3
raw patch · 4 files changed
+74/−32 lines, 4 filesdep +bytestringdep +http-clientdep +wreqdep ~deriving-compatnew-uploaderPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependencies added: bytestring, http-client, wreq
Dependency ranges changed: deriving-compat
API changes (from Hackage documentation)
- Data.Aviation.Metar.TAFResultT: instance (Data.Aviation.Metar.TAFResultT.TAFResultT f1 a1 ~ t) => Control.Lens.Wrapped.Rewrapped (Data.Aviation.Metar.TAFResultT.TAFResultT f2 a2) t
+ Data.Aviation.Metar.TAFResultT: instance (Data.Aviation.Metar.TAFResultT.TAFResultT f1 a1 Data.Type.Equality.~ t) => Control.Lens.Wrapped.Rewrapped (Data.Aviation.Metar.TAFResultT.TAFResultT f2 a2) t
- Data.Aviation.Metar.BOMTAFResult: bOMTAFResponse :: HasBOMTAFResponse c_abPL => Lens' c_abPL BOMTAFResponse
+ Data.Aviation.Metar.BOMTAFResult: bOMTAFResponse :: HasBOMTAFResponse c_aew3 => Lens' c_aew3 BOMTAFResponse
- Data.Aviation.Metar.BOMTAFResult: bomMETAR :: HasBOMTAFResponse c_abPL => Lens' c_abPL [String]
+ Data.Aviation.Metar.BOMTAFResult: bomMETAR :: HasBOMTAFResponse c_aew3 => Lens' c_aew3 [String]
- Data.Aviation.Metar.BOMTAFResult: bomTAF :: HasBOMTAFResponse c_abPL => Lens' c_abPL [String]
+ Data.Aviation.Metar.BOMTAFResult: bomTAF :: HasBOMTAFResponse c_aew3 => Lens' c_aew3 [String]
- Data.Aviation.Metar.BOMTAFResult: bomTitle :: HasBOMTAFResponse c_abPL => Lens' c_abPL String
+ Data.Aviation.Metar.BOMTAFResult: bomTitle :: HasBOMTAFResponse c_aew3 => Lens' c_aew3 String
- Data.Aviation.Metar.BOMTAFResult: class HasBOMTAFResponse c_abPL
+ Data.Aviation.Metar.BOMTAFResult: class HasBOMTAFResponse c_aew3
- Data.Aviation.Metar.TAFResult: _ConnErrorResult :: AsTAFResult r_aevY a_adIn => Prism' r_aevY ConnError
+ Data.Aviation.Metar.TAFResult: _ConnErrorResult :: AsTAFResult r_ahiB a_aguZ => Prism' r_ahiB ConnError
- Data.Aviation.Metar.TAFResult: _ParseErrorResult :: AsTAFResult r_aevY a_adIn => Prism' r_aevY ()
+ Data.Aviation.Metar.TAFResult: _ParseErrorResult :: AsTAFResult r_ahiB a_aguZ => Prism' r_ahiB ()
- Data.Aviation.Metar.TAFResult: _TAFResult :: AsTAFResult r_aevY a_adIn => Prism' r_aevY (TAFResult a_adIn)
+ Data.Aviation.Metar.TAFResult: _TAFResult :: AsTAFResult r_ahiB a_aguZ => Prism' r_ahiB (TAFResult a_aguZ)
- Data.Aviation.Metar.TAFResult: _TAFResultValue :: AsTAFResult r_aevY a_adIn => Prism' r_aevY a_adIn
+ Data.Aviation.Metar.TAFResult: _TAFResultValue :: AsTAFResult r_ahiB a_aguZ => Prism' r_ahiB a_aguZ
- Data.Aviation.Metar.TAFResult: class AsTAFResult r_aevY a_adIn | r_aevY -> a_adIn
+ Data.Aviation.Metar.TAFResult: class AsTAFResult r_ahiB a_aguZ | r_ahiB -> a_aguZ
- Data.Aviation.Metar.TAFResult: class HasTAFResult c_aeq0 a_adIn | c_aeq0 -> a_adIn
+ Data.Aviation.Metar.TAFResult: class HasTAFResult c_ahcc a_aguZ | c_ahcc -> a_aguZ
- Data.Aviation.Metar.TAFResult: tAFResult :: HasTAFResult c_aeq0 a_adIn => Lens' c_aeq0 (TAFResult a_adIn)
+ Data.Aviation.Metar.TAFResult: tAFResult :: HasTAFResult c_ahcc a_aguZ => Lens' c_ahcc (TAFResult a_aguZ)
- Data.Aviation.Metar.TAFResultT: TAFResultT :: (f (TAFResult a)) -> TAFResultT f a
+ Data.Aviation.Metar.TAFResultT: TAFResultT :: f (TAFResult a) -> TAFResultT f a
- Data.Aviation.Metar.TAFResultT: class HasTAFResultT c_ahBQ f_ahBf a_ahBg | c_ahBQ -> f_ahBf a_ahBg
+ Data.Aviation.Metar.TAFResultT: class HasTAFResultT c_ajCy f_ajBX a_ajBY | c_ajCy -> f_ajBX a_ajBY
- Data.Aviation.Metar.TAFResultT: tAFResultT :: HasTAFResultT c_ahBQ f_ahBf a_ahBg => Lens' c_ahBQ (TAFResultT f_ahBf a_ahBg)
+ Data.Aviation.Metar.TAFResultT: tAFResultT :: HasTAFResultT c_ajCy f_ajBX a_ajBY => Lens' c_ajCy (TAFResultT f_ajBX a_ajBY)
Files
- LICENCE +1/−2
- changelog.md +5/−0
- metar.cabal +6/−3
- src/Data/Aviation/Metar.hs +62/−27
LICENCE view
@@ -1,5 +1,4 @@-Copyright 2017,2018 Commonwealth Scientific and Industrial Research Organisation-(CSIRO) ABN 41 687 119 230.+Copyright 2018 Tony Morris All rights reserved.
changelog.md view
@@ -1,3 +1,8 @@+0.0.3++* tgftp.nws.noaa.gov moved to forcing https, so use wreq library+* add metar version when given no arguments+ 0.0.2 * update nix
metar.cabal view
@@ -1,5 +1,5 @@ name: metar-version: 0.0.2+version: 0.0.3 license: BSD3 license-file: LICENCE author: Tony Morris <ʇǝu˙sıɹɹoɯʇ@sıɹɹoɯʇ>@@ -29,6 +29,8 @@ build-depends: base >= 4.8 && < 5+ , bytestring >= 0.10 && < 0.11+ , http-client >= 0.5 && < 0.6 , HTTP >= 4000 && < 5000 , lens >= 4 && < 5 , network-uri >= 2.6 && < 3@@ -37,8 +39,9 @@ , tagsoup >= 0.13 && < 0.15 , tagsoup-selection >= 0.1 && < 0.2 , transformers >= 0.5 && < 0.6- , deriving-compat- + , deriving-compat >= 0.5 && < 0.6+ , wreq >= 0.5 && < 0.6+ ghc-options: -Wall
src/Data/Aviation/Metar.hs view
@@ -1,4 +1,6 @@ {-# LANGUAGE NoImplicitPrelude #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE CPP #-} module Data.Aviation.Metar( getBOMTAF@@ -10,22 +12,29 @@ import Control.Applicative(pure) import Control.Category((.))-import Control.Lens(view, _Wrapped)+import Control.Exception(catch)+import Control.Lens(view, _Wrapped, (&), (.~), (^.)) import Control.Monad(Monad((>>=))) import Data.Aviation.Metar.BOMTAFResult(BOMTAFResponse(BOMTAFResponse), bomMETAR, bomTAF) import Data.Aviation.Metar.TAFResult(TAFResult(ConnErrorResult, ParseErrorResult, TAFResultValue)) import Data.Aviation.Metar.TAFResultT(TAFResultT(TAFResultT))+import Data.ByteString.Lazy(ByteString)+import Data.ByteString.Lazy.Char8(unpack) import Data.Char(toUpper) import Data.Either(Either(Left, Right)) import Data.Foldable(length)+import Data.Function(($)) import Data.Functor(fmap) import Data.List(intercalate) import Data.Maybe(Maybe(Nothing, Just)) import Data.String(String, lines) import Data.Semigroup((<>))-import Network.HTTP(Request, Response, setHeaders, setRequestBody, mkRequest, RequestMethod(POST, GET), Header(Header), HeaderName(..), rspBody, simpleHTTP)-import Network.Stream(ConnError)+import Network.HTTP(Request, Response, setHeaders, setRequestBody, mkRequest, RequestMethod(POST), Header(Header), HeaderName(..), rspBody, simpleHTTP)+import Network.HTTP.Client(HttpException)+import Network.Stream(ConnError(ErrorMisc)) import Network.URI(URI(URI), URIAuth(URIAuth))+import Network.Wreq(getWith, defaults, headers, Options, responseBody)+import qualified Network.Wreq as Wreq(Response) import Prelude(show) import System.IO(IO, hPutStrLn, putStrLn, stderr) import Text.HTML.TagSoup(Tag(TagText))@@ -101,40 +110,65 @@ mkTAFResponse . parseTree . rspBody in TAFResultT . fmap (withResult respTAF) . simpleHTTP . request --- http://tgftp.nws.noaa.gov/data/observations/metar/stations/xxxx.TXT getNOAAMETAR :: String -> TAFResultT IO String getNOAAMETAR =- let request ::- String- -> Request String- request xxxx =- setHeaders- (- mkRequest- GET- (URI "http" (Just (URIAuth "" "tgftp.nws.noaa.gov" "")) ("data/observations/metar/stations/" <> fmap toUpper xxxx <> ".TXT") "" "") - )+ let options ::+ Options+ options =+ defaults & headers .~ [- Header HdrHost "tgftp.nws.noaa.gov"- , Header HdrUserAgent "tonymorris/metar"- , Header HdrAccept "*/*"- , Header HdrAcceptLanguage "en-US,en;q=0.5"- , Header HdrAcceptEncoding "text/html"- , Header HdrConnection "keep-alive"- , Header HdrPragma "no-cache"- , Header HdrCacheControl "no-cache"- , Header (HdrCustom "DNT") "1"+ (+ "Host"+ , "tgftp.nws.noaa.gov"+ )+ , (+ "User-Agent"+ , "tonymorris/metar"+ )+ , (+ "Accept"+ , "*/*"+ )+ , (+ "Accept-Language"+ , "en-US,en;q=0.5"+ )+ , (+ "Accept-Encoding"+ , "text/html"+ )+ , (+ "Connection"+ , "keep-alive"+ )+ , (+ "Pragma"+ , "no-cache"+ )+ , (+ "Cache-Control"+ , "no-cache"+ )+ , (+ "DNT"+ , "1"+ ) ]+ request xxxx =+ catch (fmap Right (getWith options ("https://tgftp.nws.noaa.gov/data/observations/metar/stations/" <> fmap toUpper xxxx <> ".TXT")))+ (\e -> let e' :: HttpException+ e' = e+ in pure . Left . ErrorMisc . show $ e') respMETAR ::- Response String+ Wreq.Response ByteString -> Maybe String respMETAR r =- case lines (rspBody r) of+ case lines . unpack $ r ^. responseBody of [_, r'] -> Just r' _ -> Nothing- in TAFResultT . fmap (withResult respMETAR) . simpleHTTP . request+ in TAFResultT . fmap (withResult respMETAR) . request getAllMETAR :: String@@ -157,7 +191,8 @@ hPutStrLn stderr in case x of [] ->- stderr' "enter an argument (ICAO code)"+ do putStrLn ("metar version " <> VERSION_metar)+ stderr' "enter an argument (ICAO code)" (r:_) -> let s = view _Wrapped (fmap (intercalate "\n") (getAllMETAR r)) in s >>= \s' ->