heroku (empty) → 0.1
raw patch · 4 files changed
+100/−0 lines, 4 filesdep +basedep +networkdep +textsetup-changed
Dependencies added: base, network, text
Files
- LICENSE +30/−0
- Setup.hs +2/−0
- Web/Heroku.hs +47/−0
- heroku.cabal +21/−0
+ LICENSE view
@@ -0,0 +1,30 @@+Copyright (c)2011, Greg Weber++All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions are met:++ * Redistributions of source code must retain the above copyright+ notice, this list of conditions and the following disclaimer.++ * Redistributions in binary form must reproduce the above+ copyright notice, this list of conditions and the following+ disclaimer in the documentation and/or other materials provided+ with the distribution.++ * Neither the name of Greg Weber nor the names of other+ contributors may be used to endorse or promote products derived+ from this software without specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ Web/Heroku.hs view
@@ -0,0 +1,47 @@+module Web.Heroku ( + dbConnParams + , parseDatabaseUrl+ ) where++import System.Environment+import Network.URI+import Data.Text+import Prelude++-- | read the DATABASE_URL environment variable+-- and return an alist of connection parameters with the following keys:+-- user, password, host, port, dbname+--+-- warning: just calls error if it can't parse correctly+dbConnParams :: IO [(Text, Text)]+dbConnParams = getEnv "DATABASE_URL" >>= return . parseDatabaseUrl++parseDatabaseUrl :: String -> [(Text, Text)]+parseDatabaseUrl durl =+ let muri = parseAbsoluteURI durl+ (auth, path) = case muri of+ Nothing -> error "couldn't parse absolute uri"+ Just uri -> if uriScheme uri /= "postgres:"+ then schemeError uri+ else case uriAuthority uri of+ Nothing -> invalid+ Just a -> (a, uriPath uri)+ (user,password) = userAndPassword auth+ in [+ (pack "user", user)+ -- tail not safe, but should be there on Heroku+ ,(pack "password", Data.Text.tail password)+ ,(pack "host", pack $ uriRegName auth)+ -- Heroku should use default port+ -- ,(pack "port", pack $ uriPort auth)+ -- tail not safe but path should always be there+ ,(pack "dbname", pack $ Prelude.tail $ path)+ ]+ where+ -- init is not safe, but should be there on Heroku+ userAndPassword :: URIAuth -> (Text, Text)+ userAndPassword = (breakOn $ pack ":") . pack . Prelude.init . uriUserInfo++ schemeError uri = error $ "was expecting a postgres scheme, not: " ++ (uriScheme uri) ++ "\n" ++ (show uri)+ -- should be an error + invalid = error "could not parse heroku DATABASE_URL"
+ heroku.cabal view
@@ -0,0 +1,21 @@+Name: heroku+Version: 0.1+Synopsis: helpers for deploying to Heroku+Description: currently just a parser for DATABASE_URL+Homepage: https://github.com/gregwebs/haskell-heroku+License: BSD3+License-file: LICENSE+Author: Greg Weber+Maintainer: greg@gregweber.info+Category: Web+Build-type: Simple++Cabal-version: >=1.2+++Library+ Exposed-modules: Web.Heroku+ + Build-depends: base >= 4 && < 5+ , text+ , network