git.iko.soy/typeable/pagerduty
on develop help sign in
.gitignore+1
since splitsnapshots
unifiedsplit
@@ -9,6 +9,7 @@
9cabal.sandbox.config
9cabal.sandbox.config
10
10
11# Dirs
11# Dirs
12+.stack-work
12cabal-dev
13cabal-dev
13bin
14bin
14dist
15dist
.travis.ymlnew file+30
@@ -0,0 +1,30 @@
1+sudo: false
2+
3+cache:
4+ apt: true
5+ directories:
6+ - ~/.stack
7+
8+branches:
9+ only:
10+ - master
11+ - develop
12+
13+before_install:
14+ - export PATH=/opt/ghc/$GHCVER/bin:$PATH
15+ - export PATH=~/.local/bin:$PATH
16+ - ./script/travis-lifecycle-before_install
17+
18+install:
19+ - ./script/travis-lifecycle-install
20+
21+script:
22+ - ./script/travis-lifecycle-script
23+
24+matrix:
25+ fast_finish: true
26+ include:
27+ - env: GHCVER=8.0.1
28+ addons: { apt: { packages: [ghc-8.0.1], sources: [hvr-ghc] } }
29+ - env: GHCVER=7.10.3
30+ addons: { apt: { packages: [ghc-7.10.3], sources: [hvr-ghc] } }
Makefiledeleted−20
@@ -1,20 +0,0 @@
1−FLAGS := -j --disable-documentation --disable-library-coverage
2−
3−build:
4− cabal build $(addprefix -,$(findstring j,$(MAKEFLAGS)))
5−
6−all:
7− make clean; make install && make build
8−
9−install: cabal.sandbox.config
10− cabal install $(FLAGS) --only-dependencies
11−
12−clean:
13− cabal clean
14− rm -rf cabal.sandbox.config .cabal-sandbox
15−
16−doc:
17− cabal haddock
18−
19−cabal.sandbox.config:
20− cabal sandbox init
README.md+14
@@ -0,0 +1,14 @@
1+# PagerDuty
2+
3+[![Build Status](https://travis-ci.org/brendanhay/amazonka.svg?branch=develop)](https://travis-ci.org/brendanhay/pagerduty)
4+
5+* [Contribute](#contribute)
6+* [Licence](#licence)
7+
8+## Contribute
9+
10+For any problems, comments, or feedback please create an issue [here on GitHub](https://github.com/brendanhay/pagerduty/issues).
11+
12+## Licence
13+
14+PagerDuty is released under the [Mozilla Public License Version 2.0](http://www.mozilla.org/MPL/).
pagerduty.cabal+32−21
@@ -1,23 +1,32 @@
1name: pagerduty
1name: pagerduty
2−version: 0.0.0
2+version: 0.0.8
3−synopsis: Pager Duty API Client
3+synopsis: Client library for PagerDuty Integration and REST APIs.
4homepage: http://github.com/brendanhay/pagerduty
4homepage: http://github.com/brendanhay/pagerduty
5license: OtherLicense
5license: OtherLicense
6license-file: LICENSE
6license-file: LICENSE
7author: Brendan Hay
7author: Brendan Hay
8maintainer: Brendan Hay <brendan.g.hay@gmail.com>
8maintainer: Brendan Hay <brendan.g.hay@gmail.com>
9−copyright: Copyright (c) 2013-2014 Brendan Hay, 2014 Kim Altintop
9+copyright: Copyright (c) 2013-2015 Brendan Hay, 2014 Kim Altintop
10−category: Network, Monitoring, Alerting
10+category: Network, PagerDuty, Monitoring
11build-type: Simple
11build-type: Simple
12cabal-version: >= 1.10
12cabal-version: >= 1.10
13
13
14description:
14description:
15+ PagerDuty is an alerting system for IT professionals. PagerDuty connects
16+ with a variety of systems (including monitoring tools and ticketing
17+ systems) and dispatches alerts via automated phone call, SMS and email.
18+
15− Client library for the the PagerDuty REST APIs documented here:
19+ This library implements the full PagerDuty Integration and REST APIs which
20+ are documented here:
16 .
21 .
17 * Integration API - <http://developer.pagerduty.com/documentation/integration>
22 * Integration API - <http://developer.pagerduty.com/documentation/integration>
23+ .
18 * REST API - <http://developer.pagerduty.com/documentation/rest>
24 * REST API - <http://developer.pagerduty.com/documentation/rest>
19 .
25 .
20− /Warning:/ This is a /highly/ experimental preview release, caveat emptor!
26+ /Warning:/ This is an experimental preview release which is still under
27+ heavy development and not intended for public consumption, caveat emptor!
28+ .
29+ /Note:/ An alternative source for Haddock documentation can be found <http://brendanhay.nz/pagerduty here>.
21
30
22extra-source-files:
31extra-source-files:
23 README.md
32 README.md
@@ -59,28 +68,30 @@ library
59 , Network.PagerDuty.Internal.Query
68 , Network.PagerDuty.Internal.Query
60 , Network.PagerDuty.Internal.TH
69 , Network.PagerDuty.Internal.TH
61 , Network.PagerDuty.Internal.Types
70 , Network.PagerDuty.Internal.Types
71+ , Network.PagerDuty.Types
62
72
63 build-depends:
73 build-depends:
64− aeson > 0.7 && <= 0.8
74+ aeson >= 2.0
65− , base >= 4.5 && < 5.0
75+ , base >= 4.7 && < 5
66− , bifunctors >= 4
76+ , bifunctors >= 4.1
67 , bytestring >= 0.9
77 , bytestring >= 0.9
68 , bytestring-conversion >= 0.2.1
78 , bytestring-conversion >= 0.2.1
69− , conduit >= 0.5.5
79+ , conduit > 1.1
70 , data-default-class >= 0.0.1
80 , data-default-class >= 0.0.1
71 , exceptions >= 0.6
81 , exceptions >= 0.6
72− , generics-sop >= 0.1.0.2
82+ , generics-sop >= 0.5.0.0
73− , http-client >= 0.3.6
83+ , http-client >= 0.5 && < 1
74 , http-types >= 0.8
84 , http-types >= 0.8
75− , lens >= 4.0
85+ , lens >= 4.4
76− , lens-aeson >= 1.0
86+ , lens-aeson >= 1
77− , mmorph >= 1.0
87+ , mmorph >= 1
78− , monad-control >= 0.3.2
88+ , monad-control >= 1
79− , mtl >= 2.2.1
89+ , mtl >= 2.1.3.1
80− , old-locale >= 1.0.0.5
81 , template-haskell >= 2.2
90 , template-haskell >= 2.2
82 , text >= 1.1
91 , text >= 1.1
83− , time == 1.4.*
92+ , time >= 1.2
93+ , time-locale-compat >= 0.1.0.1
84− , transformers >= 0.4.1
94+ , transformers >= 0.2
95+ , transformers-compat >= 0.3
85− , transformers-base >= 0.4.1
96+ , transformers-base >= 0.4.2
86 , unordered-containers >= 0.2.3
97 , unordered-containers >= 0.2.3
script/generate-pagesdeleted−25
@@ -1,25 +0,0 @@
1−#!/usr/bin/env bash
2−
3−set -e
4−set -x
5−set -o errexit
6−
7−branch=$(git symbolic-ref -q HEAD)
8−branch=${branch##refs/heads/}
9−branch=${branch:-HEAD}
10−
11−cabal configure --disable-tests
12−
13−DOCDIR=`mktemp -d -t pages.XXXXXX`
14−cabal haddock --haddock-option=-o$DOCDIR
15−
16−HEAD=`git rev-parse HEAD`
17−
18−git checkout gh-pages
19−
20−mv $DOCDIR/* .
21−
22−git add *.html *.js *.css *.gif *.png
23−git commit -m "Generated documentation from $HEAD on $branch"
24−git push origin gh-pages
25−git checkout $branch
script/travis-lifecycle-before_installnew file+11
@@ -0,0 +1,11 @@
1+#!/usr/bin/env bash
2+
3+set -e
4+
5+mkdir -p ~/.local/bin
6+
7+curl -L https://www.stackage.org/stack/linux-x86_64 | \
8+ tar xz --wildcards --strip-components=1 -C ~/.local/bin '*/stack'
9+
10+ghc --version
11+stack --version
script/travis-lifecycle-installnew file+13
@@ -0,0 +1,13 @@
1+#!/usr/bin/env bash
2+
3+set -e
4+
5+GHCVER=${GHCVER?"GHCVER needs to be set."}
6+
7+path=$(cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd)
8+
9+$path/travis-timeout \
10+ stack --no-terminal --skip-ghc-check --stack-yaml stack-$GHCVER.yaml setup
11+
12+$path/travis-timeout \
13+ stack --no-terminal --skip-ghc-check --stack-yaml stack-$GHCVER.yaml test pagerduty --only-snapshot
script/travis-lifecycle-scriptnew file+9
@@ -0,0 +1,9 @@
1+#!/usr/bin/env bash
2+
3+set -e
4+
5+GHCVER=${GHCVER?"GHCVER needs to be set."}
6+
7+path=$(cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd)
8+
9+stack --no-terminal --skip-ghc-check --stack-yaml stack-$GHCVER.yaml test pagerduty
script/travis-timeoutnew file+15
@@ -0,0 +1,15 @@
1+#!/usr/bin/env bash
2+
3+$* &
4+pidA=$!
5+minutes=0
6+
7+while true; do sleep 60; ((minutes++)); echo -e "\033[0;32m$minutes minute(s) elapsed running '$*'\033[0m."; done &
8+pidB=$!
9+wait $pidA
10+resA=$?
11+
12+echo -e "\033[0;32m'$*' exited with status ${resA}.\033[0m"
13+kill -9 $pidB
14+
15+exit $resA
script/upload-documentationdeleted−37
@@ -1,37 +0,0 @@
1−#!/usr/bin/env bash
2−
3−set -e
4−
5−package=${PWD##*/}
6−
7−echo "Package: ${package}"
8−read -p "Version: " version
9−read -p "Hackage user: " user
10−read -sp "Hackage password (not echoed): " password
11−
12−echo
13−echo "BUILDING"
14−echo
15−
16−cabal configure
17−cabal build
18−cabal haddock \
19− --hyperlink-source \
20− --html-location='/package/$pkg-$version/docs' \
21− --contents-location='/package/$pkg'
22−
23−echo
24−echo "ARCHIVING"
25−echo
26−
27−cd dist/doc/html
28−DDIR="${package}-${version}-docs"
29−cp -r "${package}" "${DDIR}" && gtar -c -v -z -Hustar -f "${DDIR}.tar.gz" "${DDIR}"
30−
31−echo
32−echo "UPLOADING"
33−echo
34−
35−curl -X PUT -H 'Content-Type: application/x-tar' \
36− -H 'Content-Encoding: gzip' --data-binary "@${DDIR}.tar.gz" \
37− "http://${user}:${password}@hackage.haskell.org/package/${package}-${version}/docs"
src/Control/Monad/Trans/PagerDuty.hs+55−72
@@ -2,15 +2,12 @@
2{-# LANGUAGE FlexibleContexts #-}
2{-# LANGUAGE FlexibleContexts #-}
3{-# LANGUAGE FlexibleInstances #-}
3{-# LANGUAGE FlexibleInstances #-}
4{-# LANGUAGE GeneralizedNewtypeDeriving #-}
4{-# LANGUAGE GeneralizedNewtypeDeriving #-}
5−{-# LANGUAGE KindSignatures #-}
6{-# LANGUAGE MultiParamTypeClasses #-}
5{-# LANGUAGE MultiParamTypeClasses #-}
7−{-# LANGUAGE RecordWildCards #-}
8−{-# LANGUAGE TemplateHaskell #-}
9{-# LANGUAGE TypeFamilies #-}
6{-# LANGUAGE TypeFamilies #-}
10{-# LANGUAGE UndecidableInstances #-}
7{-# LANGUAGE UndecidableInstances #-}
11
8
12-- Module : Control.Monad.Trans.PagerDuty
9-- Module : Control.Monad.Trans.PagerDuty
13−-- Copyright : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
10+-- Copyright : (c) 2013-2015 Brendan Hay <brendan.g.hay@gmail.com>
14-- License : This Source Code Form is subject to the terms of
11-- License : This Source Code Form is subject to the terms of
15-- the Mozilla Public License, v. 2.0.
12-- the Mozilla Public License, v. 2.0.
16-- A copy of the MPL can be found in the LICENSE file or
13-- A copy of the MPL can be found in the LICENSE file or
@@ -22,57 +19,50 @@
22module Control.Monad.Trans.PagerDuty
19module Control.Monad.Trans.PagerDuty
23 (
20 (
24 -- * Transformer
21 -- * Transformer
25− PD
22+ PagerDuty
26− , PDT
23+ , PagerDutyT
27
24
28− -- * Run
25+ -- * Running
29− , runPDT
26+ , runPagerDutyT
30
27
31− -- * Environment
32− , Env
33− , envDomain
34− , envAuth
35− , envManager
36−-- , envLogging
37−
38− -- * Integration API
28+ -- * Integration events
39 , submit
29 , submit
30+ , submitCatch
40
31
41− -- * REST API
32+ -- * REST requests
42 , send
33 , send
34+ , sendCatch
43 , paginate
35 , paginate
36+ , paginateCatch
37+
38+ -- ** Lifting errors
39+ , hoistError
40+
41+ , module Network.PagerDuty.Types
44 ) where
42 ) where
45
43
46import Control.Applicative
44import Control.Applicative
47−import Control.Lens
45+import Control.Monad
48import Control.Monad.Base
46import Control.Monad.Base
49import Control.Monad.Catch
47import Control.Monad.Catch
50−import Control.Monad.Except
48+import Control.Monad.Except (MonadError (..))
51import Control.Monad.Morph
49import Control.Monad.Morph
52import Control.Monad.Reader
50import Control.Monad.Reader
53import Control.Monad.Trans.Control
51import Control.Monad.Trans.Control
52+import Control.Monad.Trans.Except
54import Data.Aeson
53import Data.Aeson
55import Data.Conduit
54import Data.Conduit
56−import Network.HTTP.Client (Manager)
57−import Network.PagerDuty.Integration (Event, Response)
55+import Network.PagerDuty.Integration (Event, Response)
58−import qualified Network.PagerDuty.Integration as Int
56+import qualified Network.PagerDuty.Integration as Int
59−import qualified Network.PagerDuty.REST as REST
60import Network.PagerDuty.Internal.Types
57import Network.PagerDuty.Internal.Types
58+import qualified Network.PagerDuty.REST as REST
59+import Network.PagerDuty.Types
61
60
62−data Env (s :: Security) = Env
63− { _envDomain :: SubDomain
64− , _envAuth :: Auth s
65− , _envManager :: Manager
66−-- , _envLogging ::
67− }
68−
69−makeLenses ''Env
70−
71−-- | A convenient alias for 'PDT' 'IO'.
61+-- | A convenient alias for 'PagerDutyT' 'IO'.
72−type PD s = PDT s IO
62+type PagerDuty s = PagerDutyT s IO
73
63
74−newtype PDT s m a = PDT
64+newtype PagerDutyT s m a = PagerDutyT
75− { unPDT :: ReaderT (Env s) (ExceptT Error m) a
65+ { unPagerDutyT :: ReaderT (Env s) (ExceptT Error m) a
76 } deriving
66 } deriving
77 ( Functor
67 ( Functor
78 , Applicative
68 , Applicative
@@ -84,50 +74,48 @@ newtype PDT s m a = PDT
84 , MonadError Error
74 , MonadError Error
85 )
75 )
86
76
87−instance MonadTrans (PDT s) where
77+instance MonadTrans (PagerDutyT s) where
88− lift = PDT . lift . lift
78+ lift = PagerDutyT . lift . lift
89 {-# INLINE lift #-}
79 {-# INLINE lift #-}
90
80
91−instance MonadBase b m => MonadBase b (PDT s m) where
81+instance MonadBase b m => MonadBase b (PagerDutyT s m) where
92 liftBase = liftBaseDefault
82 liftBase = liftBaseDefault
93 {-# INLINE liftBase #-}
83 {-# INLINE liftBase #-}
94
84
95−instance MonadTransControl (PDT s) where
85+instance MonadTransControl (PagerDutyT s) where
96− newtype StT (PDT s) a = StTAWS
97− { unStTAWS :: StT (ExceptT Error) (StT (ReaderT (Env s)) a)
86+ type StT (PagerDutyT s) a = StT (ExceptT Error) (StT (ReaderT (Env s)) a)
98− }
99
87
100− liftWith f = PDT $
88+ liftWith f = PagerDutyT $
101 liftWith $ \g ->
89 liftWith $ \g ->
102− liftWith $ \h ->
90+ liftWith $ \h ->
103− f (liftM StTAWS . h . g . unPDT)
91+ f (h . g . unPagerDutyT)
104 {-# INLINE liftWith #-}
92 {-# INLINE liftWith #-}
105
93
106− restoreT = PDT . restoreT . restoreT . liftM unStTAWS
94+ restoreT = PagerDutyT . restoreT . restoreT
107 {-# INLINE restoreT #-}
95 {-# INLINE restoreT #-}
108
96
109−instance MonadBaseControl b m => MonadBaseControl b (PDT s m) where
97+instance MonadBaseControl b m => MonadBaseControl b (PagerDutyT s m) where
110− newtype StM (PDT s m) a = StMPDT { unStMPDT :: ComposeSt (PDT s) m a }
98+ type StM (PagerDutyT s m) a = ComposeSt (PagerDutyT s) m a
111
99
112− liftBaseWith = defaultLiftBaseWith StMPDT
100+ liftBaseWith = defaultLiftBaseWith
113 {-# INLINE liftBaseWith #-}
101 {-# INLINE liftBaseWith #-}
114
102
115− restoreM = defaultRestoreM unStMPDT
103+ restoreM = defaultRestoreM
116 {-# INLINE restoreM #-}
104 {-# INLINE restoreM #-}
117
105
118−instance MFunctor (PDT s) where
106+instance MFunctor (PagerDutyT s) where
119− hoist nat m = PDT (ReaderT (ExceptT . nat . runPDT m))
107+ hoist nat m = PagerDutyT (ReaderT (ExceptT . nat . runPagerDutyT m))
120 {-# INLINE hoist #-}
108 {-# INLINE hoist #-}
121
109
122−instance MMonad (PDT s) where
110+instance MMonad (PagerDutyT s) where
123− embed f m = ask >>= f . runPDT m >>= either throwError return
111+ embed f m = ask >>= f . runPagerDutyT m >>= either throwError return
124 {-# INLINE embed #-}
112 {-# INLINE embed #-}
125
113
126−runPDT :: PDT s m a -> Env s -> m (Either Error a)
114+runPagerDutyT :: PagerDutyT s m a -> Env s -> m (Either Error a)
127−runPDT (PDT k) = runExceptT . runReaderT k
115+runPagerDutyT (PagerDutyT k) = runExceptT . runReaderT k
128
116
129−hoistEither :: (MonadError Error m) => Either Error a -> m a
117+hoistError :: (MonadError Error m) => Either Error a -> m a
130−hoistEither = either throwError return
118+hoistError = either throwError return
131
119
132scoped :: MonadReader (Env s) m => (Env s -> m a) -> m a
120scoped :: MonadReader (Env s) m => (Env s -> m a) -> m a
133scoped f = ask >>= f
121scoped f = ask >>= f
@@ -135,20 +123,17 @@ scoped f = ask >>= f
135submit :: ( MonadIO m
123submit :: ( MonadIO m
136 , MonadReader (Env s) m
124 , MonadReader (Env s) m
137 , MonadError Error m
125 , MonadError Error m
138− , Event a
139 )
126 )
140− => a
127+ => Event
141 -> m Response
128 -> m Response
142−submit = submitCatch >=> hoistEither
129+submit = submitCatch >=> hoistError
143
130
144submitCatch :: ( MonadIO m
131submitCatch :: ( MonadIO m
145 , MonadReader (Env s) m
132 , MonadReader (Env s) m
146− , Event a
147 )
133 )
148− => a
134+ => Event
149 -> m (Either Error Response)
135 -> m (Either Error Response)
150−submitCatch x = scoped $ \e ->
136+submitCatch x = scoped $ \e -> Int.submitWith (_envManager e) (_envLogger e) x
151− Int.submit (_envManager e) x
152
137
153send :: ( MonadIO m
138send :: ( MonadIO m
154 , MonadReader (Env s) m
139 , MonadReader (Env s) m
@@ -157,7 +142,7 @@ send :: ( MonadIO m
157 )
142 )
158 => Request a s b
143 => Request a s b
159 -> m b
144 -> m b
160−send = sendCatch >=> hoistEither
145+send = sendCatch >=> hoistError
161
146
162sendCatch :: ( MonadIO m
147sendCatch :: ( MonadIO m
163 , MonadReader (Env s) m
148 , MonadReader (Env s) m
@@ -165,8 +150,7 @@ sendCatch :: ( MonadIO m
165 )
150 )
166 => Request a s b
151 => Request a s b
167 -> m (Either Error b)
152 -> m (Either Error b)
168−sendCatch x = scoped $ \Env{..} ->
153+sendCatch x = scoped (`REST.sendWith` x)
169− REST.send _envAuth _envDomain _envManager x
170
154
171paginate :: ( MonadIO m
155paginate :: ( MonadIO m
172 , MonadReader (Env s) m
156 , MonadReader (Env s) m
@@ -176,7 +160,7 @@ paginate :: ( MonadIO m
176 )
160 )
177 => Request a s b
161 => Request a s b
178 -> Source m b
162 -> Source m b
179−paginate x = paginateCatch x $= awaitForever (hoistEither >=> yield)
163+paginate x = paginateCatch x $= awaitForever (hoistError >=> yield)
180
164
181paginateCatch :: ( MonadIO m
165paginateCatch :: ( MonadIO m
182 , MonadReader (Env s) m
166 , MonadReader (Env s) m
@@ -185,5 +169,4 @@ paginateCatch :: ( MonadIO m
185 )
169 )
186 => Request a s b
170 => Request a s b
187 -> Source m (Either Error b)
171 -> Source m (Either Error b)
188−paginateCatch x = scoped $ \Env{..} ->
172+paginateCatch x = scoped (`REST.paginateWith` x)
189− REST.paginate _envAuth _envDomain _envManager x
src/Network/PagerDuty/Integration.hs+187−147
@@ -1,10 +1,12 @@
1−{-# LANGUAGE GADTs #-}
1+{-# LANGUAGE FlexibleInstances #-}
2−{-# LANGUAGE DefaultSignatures #-}
2+{-# LANGUAGE FunctionalDependencies #-}
3+{-# LANGUAGE LambdaCase #-}
4+{-# LANGUAGE MultiParamTypeClasses #-}
3−{-# LANGUAGE OverloadedStrings #-}
5+{-# LANGUAGE OverloadedStrings #-}
4−{-# LANGUAGE TemplateHaskell #-}
6+{-# LANGUAGE TemplateHaskell #-}
5
7
6-- Module : Network.PagerDuty.Integration
8-- Module : Network.PagerDuty.Integration
7−-- Copyright : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
9+-- Copyright : (c) 2013-2015 Brendan Hay <brendan.g.hay@gmail.com>
8-- License : This Source Code Form is subject to the terms of
10-- License : This Source Code Form is subject to the terms of
9-- the Mozilla Public License, v. 2.0.
11-- the Mozilla Public License, v. 2.0.
10-- A copy of the MPL can be found in the LICENSE file or
12-- A copy of the MPL can be found in the LICENSE file or
@@ -36,52 +38,57 @@
36-- /See:/ <http://developer.pagerduty.com/documentation/integration/events>
38-- /See:/ <http://developer.pagerduty.com/documentation/integration/events>
37module Network.PagerDuty.Integration
39module Network.PagerDuty.Integration
38 (
40 (
39− -- * Events
41+ -- * Sending events
40 submit
42 submit
43+ , submitWith
41
44
42 -- ** Trigger
45 -- ** Trigger
43 , Trigger
46 , Trigger
44 , trigger
47 , trigger
45− , tDescription
48+ , client
46− , tIncidentKey
49+ , clientUrl
47− , tClient
48− , tClientUrl
49− , tDetails
50
50
51 -- ** Acknowledge
51 -- ** Acknowledge
52 , Acknowledge
52 , Acknowledge
53 , acknowledge
53 , acknowledge
54− , aDescription
55− , aDetails
56
54
57 -- ** Resolve
55 -- ** Resolve
58 , Resolve
56 , Resolve
59 , resolve
57 , resolve
60− , rDescription
58+
61− , rDetails
59+ -- * Fields
60+ , HasServiceKey (..)
61+ , HasIncidentKey (..)
62+ , HasDescription (..)
63+ , HasDetails (..)
62
64
63 -- * Types
65 -- * Types
64− , Event
66+ , Event (..)
65− , AnyEvent (..)
67+ , _Trigger
68+ , _Acknowledge
69+ , _Resolve
66
70
67 , Response
71 , Response
68 , rsStatus
72 , rsStatus
69 , rsMessage
73 , rsMessage
70 , rsIncidentKey
74 , rsIncidentKey
75+
76+ , Generic
77+
78+ , module Network.PagerDuty.Types
71 ) where
79 ) where
72
80
73import Control.Lens
81import Control.Lens
74import Control.Monad.IO.Class
82import Control.Monad.IO.Class
75import Data.Aeson
83import Data.Aeson
76−import Data.Default.Class
77−import qualified Data.HashMap.Strict as Map
84+import qualified Data.Aeson.KeyMap as Map
78−import Data.Monoid
85+import Data.Text (Text)
79−import Data.Text (Text)
80−import Network.HTTP.Client (Manager)
86+import Network.HTTP.Client (Manager)
81−import qualified Network.HTTP.Client as Client
87+import qualified Network.HTTP.Client as Client
82import Network.PagerDuty.Internal.IO
88import Network.PagerDuty.Internal.IO
83import Network.PagerDuty.Internal.TH
89import Network.PagerDuty.Internal.TH
84import Network.PagerDuty.Internal.Types
90import Network.PagerDuty.Internal.Types
91+import Network.PagerDuty.Types hiding (description, message)
85
92
86data Response = Response
93data Response = Response
87 { _rsStatus :: Text
94 { _rsStatus :: Text
@@ -100,128 +107,161 @@ makeLens "_rsMessage" ''Response
100-- | The key of the incident that will be affected by the request.
107-- | The key of the incident that will be affected by the request.
101makeLens "_rsIncidentKey" ''Response
108makeLens "_rsIncidentKey" ''Response
102
109
103−class Event a where
110+class HasServiceKey s a | s -> a where
104− eventType :: a -> Text
111+ -- | The GUID of one of your "Generic API" services. This is the "service key"
105− eventPayload :: a -> Object
112+ -- listed on a Generic API's service detail page.
106−
113+ serviceKey :: Lens' s a
107− default eventPayload :: ToJSON a => a -> Object
114+
108− eventPayload x = let Object o = toJSON x in o
115+class HasIncidentKey s a | s -> a where
109−
116+ -- | Identifies the incident to which this trigger event should be applied.
110−data AnyEvent where
117+ -- If there's no open (i.e. unresolved) incident with this key, a new one
111− Event :: Event a => a -> AnyEvent
118+ -- will be created. If there's already an open incident with a matching key,
112−
119+ -- this event will be appended to that incident's log. The event key provides
113−instance Event AnyEvent where
120+ -- an easy way to "de-dup" problem reports. If this field isn't provided,
114− eventType (Event x) = eventType x
121+ -- PagerDuty will automatically open a new incident with a unique key.
115− eventPayload (Event x) = eventPayload x
122+ incidentKey :: Lens' s a
116−
123+
117−data Generic = Generic
124+class HasDescription s a | s -> a where
125+ -- | A short description of the problem that led to this trigger.
126+ -- This field (or a truncated version) will be used when generating phone
127+ -- calls, SMS messages and alert emails. It will also appear on the incidents
128+ -- tables in the PagerDuty UI. The maximum length is 1024 characters.
129+ description :: Lens' s a
130+
131+class HasDetails s a | s -> a where
132+ -- | An arbitrary JSON object containing any data you'd like included
133+ -- in the incident log.
134+ details :: Lens' s a
135+
136+data Trigger = Trigger'
118− { _gServiceKey :: ServiceKey
137+ { _tServiceKey' :: ServiceKey
119− , _gDescription :: Maybe Text
120− , _gIncidentKey :: IncidentKey
138+ , _tIncidentKey' :: IncidentKey
121− , _gDetails :: Object
139+ , _tDescription' :: Text
140+ , _tDetails' :: Maybe Object
141+ , _tClient' :: Maybe Text
142+ , _tClientUrl' :: Maybe Text
122 } deriving (Eq, Show)
143 } deriving (Eq, Show)
123
144
124−deriveJSON ''Generic
145+deriveRecord ''Trigger
125
146
126−makeLens "_gDescription" ''Generic
147+instance HasServiceKey Trigger ServiceKey where serviceKey = tServiceKey'
127−makeLens "_gDetails" ''Generic
148+instance HasIncidentKey Trigger IncidentKey where incidentKey = tIncidentKey'
149+instance HasDescription Trigger Text where description = tDescription'
150+instance HasDetails Trigger (Maybe Object) where details = tDetails'
128
151
129−data Trigger = Trigger
152+-- | The name of the monitoring client that is triggering this event.
130− { _tServiceKey :: ServiceKey
153+client :: Lens' Trigger (Maybe Text)
131− , _tDescription :: Text
154+client = tClient'
132− , _tIncidentKey :: Maybe IncidentKey
133− , _tClient :: Maybe Text
134− , _tClientUrl :: Maybe Text
135− , _tDetails :: Object
136− } deriving (Eq, Show)
137
155
138−deriveJSON ''Trigger
156+-- | The URL of the monitoring client that is triggering this event.
157+clientUrl :: Lens' Trigger (Maybe Text)
158+clientUrl = tClientUrl'
159+
160+data Generic = Generic'
161+ { _gServiceKey' :: ServiceKey
162+ , _gIncidentKey' :: IncidentKey
163+ , _gDescription' :: Maybe Text
164+ , _gDetails' :: Maybe Object
165+ } deriving (Eq, Show)
139
166
140−instance Event Trigger where
167+deriveRecord ''Generic
141− eventType = const "trigger"
168+
169+instance HasServiceKey Generic ServiceKey where serviceKey = gServiceKey'
170+instance HasIncidentKey Generic IncidentKey where incidentKey = gIncidentKey'
171+instance HasDescription Generic (Maybe Text) where description = gDescription'
172+instance HasDetails Generic (Maybe Object) where details = gDetails'
173+
174+type Resolve = Generic
175+type Acknowledge = Generic
176+
177+data Event
178+ = Trigger Trigger -- ^ /See:/ 'trigger'
179+ | Acknowledge Generic -- ^ /See:/ 'acknowledge'
180+ | Resolve Generic -- ^ /See:/ 'resolve'
181+ deriving (Eq, Show)
182+
183+makePrisms ''Event
184+
185+instance HasServiceKey Event ServiceKey where
186+ serviceKey = lens f g
187+ where
188+ f (Trigger s) = _tServiceKey' s
189+ f (Acknowledge s) = _gServiceKey' s
190+ f (Resolve s) = _gServiceKey' s
191+
192+ g (Trigger s) x = Trigger $ s { _tServiceKey' = x }
193+ g (Acknowledge s) x = Acknowledge $ s { _gServiceKey' = x }
194+ g (Resolve s) x = Resolve $ s { _gServiceKey' = x }
195+
196+instance HasIncidentKey Event IncidentKey where
197+ incidentKey = lens f g
198+ where
199+ f (Trigger s) = _tIncidentKey' s
200+ f (Acknowledge s) = _gIncidentKey' s
201+ f (Resolve s) = _gIncidentKey' s
202+
203+ g (Trigger s) x = Trigger $ s { _tIncidentKey' = x }
204+ g (Acknowledge s) x = Acknowledge $ s { _gIncidentKey' = x }
205+ g (Resolve s) x = Resolve $ s { _gIncidentKey' = x }
206+
207+instance HasDetails Event (Maybe Object) where
208+ details = lens f g
209+ where
210+ f (Trigger s) = _tDetails' s
211+ f (Acknowledge s) = _gDetails' s
212+ f (Resolve s) = _gDetails' s
213+
214+ g (Trigger s) x = Trigger $ s { _tDetails' = x }
215+ g (Acknowledge s) x = Acknowledge $ s { _gDetails' = x }
216+ g (Resolve s) x = Resolve $ s { _gDetails' = x }
217+
218+instance ToJSON Event where
219+ toJSON = \case
220+ Trigger x -> event "trigger" x
221+ Acknowledge x -> event "acknowledge" x
222+ Resolve x -> event "resolve" x
223+ where
224+ event k x =
225+ case toJSON x of
226+ Object o -> Object (Map.insert "event_type" (String k) o)
227+ v -> v
142
228
143-- | Your monitoring tools should send PagerDuty a trigger event to report a new
229-- | Your monitoring tools should send PagerDuty a trigger event to report a new
144-- or ongoing problem. When PagerDuty receives a trigger event, it will either open
230-- or ongoing problem. When PagerDuty receives a trigger event, it will either open
145-- a new incident, or add a new trigger log entry to an existing incident,
231-- a new incident, or add a new trigger log entry to an existing incident,
146-- depending on the provided incident_key.
232-- depending on the provided incident_key.
147−trigger :: ServiceKey
233+trigger :: ServiceKey -- ^ 'serviceKey'
148− -> Text -- ^ 'tDescription'
234+ -> IncidentKey -- ^ 'incidentKey'
149− -> Trigger
235+ -> Text -- ^ 'description'
236+ -> Event
150−trigger k d =
237+trigger k i d =
151− Trigger
238+ Trigger Trigger'
152− { _tServiceKey = k
239+ { _tServiceKey' = k
153− , _tDescription = d
240+ , _tDescription' = d
154− , _tIncidentKey = Nothing
241+ , _tIncidentKey' = i
155− , _tClient = Nothing
242+ , _tClient' = Nothing
156− , _tClientUrl = Nothing
243+ , _tClientUrl' = Nothing
157− , _tDetails = mempty
244+ , _tDetails' = Nothing
158 }
245 }
159
246
160−-- | A short description of the problem that led to this trigger.
161−-- This field (or a truncated version) will be used when generating phone
162−-- calls, SMS messages and alert emails. It will also appear on the incidents
163−-- tables in the PagerDuty UI. The maximum length is 1024 characters.
164−makeLens "_tDescription" ''Trigger
165−
166−-- | Identifies the incident to which this trigger event should be applied.
167−-- If there's no open (i.e. unresolved) incident with this key, a new one
168−-- will be created. If there's already an open incident with a matching key,
169−-- this event will be appended to that incident's log. The event key provides
170−-- an easy way to "de-dup" problem reports. If this field isn't provided,
171−-- PagerDuty will automatically open a new incident with a unique key.
172−makeLens "_tIncidentKey" ''Trigger
173−
174−-- | The name of the monitoring client that is triggering this event.
175−makeLens "_tClient" ''Trigger
176−
177−-- | The URL of the monitoring client that is triggering this event.
178−makeLens "_tClientUrl" ''Trigger
179−
180−-- | An arbitrary JSON object containing any data you'd like included
181−-- in the incident log.
182−makeLens "_tDetails" ''Trigger
183−
184−newtype Acknowledge = Acknowledge Generic
185−
186−deriveJSON ''Acknowledge
187−makePrisms ''Acknowledge
188−
189−instance Event Acknowledge where
190− eventType = const "acknowledge"
191−
192-- | Acknowledge events cause the referenced incident to enter the acknowledged
247-- | Acknowledge events cause the referenced incident to enter the acknowledged
193-- state.
248-- state.
194--
249--
195-- While an incident is acknowledged, it won't generate any additional
250-- While an incident is acknowledged, it won't generate any additional
196-- notifications, even if it receives new trigger events. Your monitoring tools
251-- notifications, even if it receives new trigger events. Your monitoring tools
197−-- should send PagerDuty an acknowledge event when they know someone is presently
252+-- should send PagerDuty an acknowledge event when they know someone is
198−-- working on the problem.
253+-- presently working on the problem.
199−acknowledge :: ServiceKey -> IncidentKey -> Acknowledge
254+acknowledge :: ServiceKey -- ^ 'serviceKey'
255+ -> IncidentKey -- ^ 'incidentKey'
256+ -> Event
200acknowledge k i =
257acknowledge k i =
201− Acknowledge Generic
258+ Acknowledge Generic'
202− { _gServiceKey = k
259+ { _gServiceKey' = k
203− , _gDescription = Nothing
204− , _gIncidentKey = i
260+ , _gIncidentKey' = i
261+ , _gDescription' = Nothing
205− , _gDetails = mempty
262+ , _gDetails' = Nothing
206 }
263 }
207
264
208−-- | Text that will appear in the incident's log associated with this event.
209−aDescription :: Lens' Acknowledge (Maybe Text)
210−aDescription = _Acknowledge.gDescription
211−
212−-- | An arbitrary JSON object containing any data you'd like included
213−-- in the incident log.
214−aDetails :: Lens' Acknowledge Object
215−aDetails = _Acknowledge.gDetails
216−
217−newtype Resolve = Resolve Generic
218−
219−deriveJSON ''Resolve
220−makePrisms ''Resolve
221−
222−instance Event Resolve where
223− eventType = const "acknowledge"
224−
225-- | Resolve events cause the referenced incident to enter the resolved state.
265-- | Resolve events cause the referenced incident to enter the resolved state.
226--
266--
227-- Once an incident is resolved, it won't generate any additional
267-- Once an incident is resolved, it won't generate any additional
@@ -229,30 +269,30 @@ instance Event Resolve where
229-- incident won't re-open the incident. Instead, a new incident will be
269-- incident won't re-open the incident. Instead, a new incident will be
230-- created. Your monitoring tools should send PagerDuty a resolve event when the
270-- created. Your monitoring tools should send PagerDuty a resolve event when the
231-- problem that caused the initial trigger event has been fixed.
271-- problem that caused the initial trigger event has been fixed.
232−resolve :: ServiceKey -> IncidentKey -> Resolve
272+resolve :: ServiceKey -- ^ 'serviceKey'
273+ -> IncidentKey -- ^ 'incidentKey'
274+ -> Event
233resolve k i =
275resolve k i =
234− Resolve Generic
276+ Resolve Generic'
235− { _gServiceKey = k
277+ { _gServiceKey' = k
236− , _gDescription = Nothing
237− , _gIncidentKey = i
278+ , _gIncidentKey' = i
279+ , _gDescription' = Nothing
238− , _gDetails = mempty
280+ , _gDetails' = Nothing
239 }
281 }
240
282
241−-- | Text that will appear in the incident's log associated with this event.
242−rDescription :: Lens' Resolve (Maybe Text)
243−rDescription = _Resolve.gDescription
244−
245−-- | An arbitrary JSON object containing any data youd like included
246−-- in the incident log.
247−rDetails :: Lens' Resolve Object
248−rDetails = _Resolve.gDetails
249−
250-- | Send an event to the integration API.
283-- | Send an event to the integration API.
284+submit :: MonadIO m => Manager -> Event -> m (Either Error Response)
285+submit m = submitWith m None
286+
287+-- | /See:/ 'submit'
288+submitWith :: MonadIO m
289+ => Manager
290+ -> Logger
291+ -> Event
251−submit :: (MonadIO m, Event a) => Manager -> a -> m (Either Error Response)
292+ -> m (Either Error Response)
252−submit m x = request m payload $ def
293+submitWith m l e = request m l e $
294+ Client.defaultRequest
253− { Client.host = "events.pagerduty.com"
295+ { Client.host = "events.pagerduty.com"
254− , Client.path = "/generic/2010-04-15/create_event.json"
296+ , Client.path = "/generic/2010-04-15/create_event.json"
297+ , Client.method = "POST"
255− }
298+ }
256− where
257− payload = Object $
258− Map.insert "event_type" (String (eventType x)) (eventPayload x)
src/Network/PagerDuty/Internal/IO.hs+27−17
@@ -1,7 +1,8 @@
1−{-# LANGUAGE OverloadedStrings #-}
1+{-# LANGUAGE OverloadedStrings #-}
2+{-# LANGUAGE ScopedTypeVariables #-}
2
3
3-- Module : Network.PagerDuty.Internal.IO
4-- Module : Network.PagerDuty.Internal.IO
4−-- Copyright : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
5+-- Copyright : (c) 2013-2015 Brendan Hay <brendan.g.hay@gmail.com>
5-- License : This Source Code Form is subject to the terms of
6-- License : This Source Code Form is subject to the terms of
6-- the Mozilla Public License, v. 2.0.
7-- the Mozilla Public License, v. 2.0.
7-- A copy of the MPL can be found in the LICENSE file or
8-- A copy of the MPL can be found in the LICENSE file or
@@ -14,20 +15,25 @@ module Network.PagerDuty.Internal.IO where
14
15
15import Control.Monad
16import Control.Monad
16import Control.Monad.IO.Class
17import Control.Monad.IO.Class
17−import Data.Aeson hiding (Error)
18+import Data.Aeson hiding (Error)
18−import qualified Data.ByteString.Lazy as LBS
19+import qualified Data.ByteString.Lazy as LBS
20+import Data.Monoid
21+import qualified Data.Text as Text
19−import Network.HTTP.Client (Manager, httpLbs)
22+import Network.HTTP.Client (Manager, httpLbs)
20−import qualified Network.HTTP.Client as Client
23+import qualified Network.HTTP.Client as Client
21import Network.HTTP.Types
24import Network.HTTP.Types
22import Network.PagerDuty.Internal.Types
25import Network.PagerDuty.Internal.Types
23
26
24request :: (MonadIO m, ToJSON a, FromJSON b)
27request :: (MonadIO m, ToJSON a, FromJSON b)
25 => Manager
28 => Manager
29+ -> Logger
26 -> a
30 -> a
27 -> Client.Request
31 -> Client.Request
28 -> m (Either Error b)
32 -> m (Either Error b)
29−request m x rq = liftIO (httpLbs raw m) >>= response
33+request m l x rq = msg >> liftIO (httpLbs raw m) >>= response l
30 where
34 where
35+ msg = debug l ("[Raw Request]\n" <> Text.pack (show raw))
36+
31 raw = rq
37 raw = rq
32 { Client.secure = True
38 { Client.secure = True
33 , Client.port = 443
39 , Client.port = 443
@@ -40,10 +46,11 @@ request m x rq = liftIO (httpLbs raw m) >>= response
40 , ("Accept", "application/json")
46 , ("Accept", "application/json")
41 ]
47 ]
42
48
43−response :: (Monad m, FromJSON b)
49+response :: forall m b. (MonadIO m, FromJSON b)
50+ => Logger
44− => Client.Response LBS.ByteString
51+ -> Client.Response LBS.ByteString
45 -> m (Either Error b)
52 -> m (Either Error b)
46−response rs = case statusCode (Client.responseStatus rs) of
53+response l rs = case statusCode (Client.responseStatus rs) of
47 200 -> success
54 200 -> success
48 201 -> success
55 201 -> success
49 400 -> failure
56 400 -> failure
@@ -53,14 +60,17 @@ response rs = case statusCode (Client.responseStatus rs) of
53 success = maybe (Left unknown) Right `liftM` parse
60 success = maybe (Left unknown) Right `liftM` parse
54 failure = maybe (Left unknown) Left `liftM` parse
61 failure = maybe (Left unknown) Left `liftM` parse
55
62
56− unhandled n = Internal
63+ unhandled n = Internal $
57− $ "PagerDuty returned unhandled status code: " ++ show n
64+ "PagerDuty returned unhandled status code: "
65+ <> Text.pack (show n)
66+
67+ unknown = Internal $
68+ "Unable to parse response into a PagerDuty API compatible type: "
69+ <> Text.pack (show body)
58
70
59− unknown = Internal
71+ parse :: FromJSON a => m (Maybe a)
60− $ "Unable to parse response into a PagerDuty API compatible type: "
72+ parse = msg >> return (decode body)
61− ++ show body
62
73
63− parse :: (Monad m, FromJSON a) => m (Maybe a)
74+ msg = debug l ("[Raw Response]\n" <> Text.pack (show rs))
64− parse = return (decode body)
65
75
66 body = Client.responseBody rs
76 body = Client.responseBody rs
src/Network/PagerDuty/Internal/Options.hs+4−4
@@ -1,5 +1,5 @@
1-- Module : Network.PagerDuty.Internal.Options
1-- Module : Network.PagerDuty.Internal.Options
2−-- Copyright : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
2+-- Copyright : (c) 2013-2015 Brendan Hay <brendan.g.hay@gmail.com>
3-- License : This Source Code Form is subject to the terms of
3-- License : This Source Code Form is subject to the terms of
4-- the Mozilla Public License, v. 2.0.
4-- the Mozilla Public License, v. 2.0.
5-- A copy of the MPL can be found in the LICENSE file or
5-- A copy of the MPL can be found in the LICENSE file or
@@ -14,9 +14,9 @@ module Network.PagerDuty.Internal.Options
14 , underscored
14 , underscored
15 ) where
15 ) where
16
16
17−import Data.Aeson.Types
17+import Data.Aeson.Types
18−import Data.Char
18+import Data.Char
19−import Data.List
19+import Data.List
20
20
21dropped :: Int -> Options -> Options
21dropped :: Int -> Options -> Options
22dropped n o = o
22dropped n o = o
src/Network/PagerDuty/Internal/Query.hs+14−12
@@ -1,12 +1,13 @@
1{-# LANGUAGE ConstraintKinds #-}
1{-# LANGUAGE ConstraintKinds #-}
2{-# LANGUAGE DefaultSignatures #-}
2{-# LANGUAGE DefaultSignatures #-}
3+{-# LANGUAGE FlexibleContexts #-}
3{-# LANGUAGE GADTs #-}
4{-# LANGUAGE GADTs #-}
4{-# LANGUAGE OverloadedStrings #-}
5{-# LANGUAGE OverloadedStrings #-}
5{-# LANGUAGE ScopedTypeVariables #-}
6{-# LANGUAGE ScopedTypeVariables #-}
6{-# LANGUAGE TupleSections #-}
7{-# LANGUAGE TupleSections #-}
7
8
8-- Module : Network.PagerDuty.Internal.Query
9-- Module : Network.PagerDuty.Internal.Query
9−-- Copyright : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
10+-- Copyright : (c) 2013-2015 Brendan Hay <brendan.g.hay@gmail.com>
10-- License : This Source Code Form is subject to the terms of
11-- License : This Source Code Form is subject to the terms of
11-- the Mozilla Public License, v. 2.0.
12-- the Mozilla Public License, v. 2.0.
12-- A copy of the MPL can be found in the LICENSE file or
13-- A copy of the MPL can be found in the LICENSE file or
@@ -23,14 +24,14 @@ module Network.PagerDuty.Internal.Query
23
24
24import Data.Aeson.Types
25import Data.Aeson.Types
25import Data.Bifunctor
26import Data.Bifunctor
26−import Data.ByteString (ByteString)
27+import Data.ByteString (ByteString)
27−import qualified Data.ByteString.Char8 as BS
28+import qualified Data.ByteString.Char8 as BS
28import Data.ByteString.Conversion
29import Data.ByteString.Conversion
29−import Data.Function (on)
30+import Data.Function (on)
30−import Data.List (groupBy)
31+import Data.List (groupBy)
31−import Data.Monoid ((<>))
32+import Data.Monoid ((<>))
32−import Data.Text (Text)
33+import Data.Text (Text)
33−import qualified Data.Text.Encoding as Text
34+import qualified Data.Text.Encoding as Text
34import Generics.SOP
35import Generics.SOP
35import Network.HTTP.Types
36import Network.HTTP.Types
36import Network.PagerDuty.Internal.Options
37import Network.PagerDuty.Internal.Options
@@ -58,14 +59,15 @@ gqueryWith :: forall a. (Generic a, HasDatatypeInfo a, All2 QueryValues (Code a)
58 -> a
59 -> a
59 -> Query
60 -> Query
60gqueryWith o a = case datatypeInfo (Proxy :: Proxy a) of
61gqueryWith o a = case datatypeInfo (Proxy :: Proxy a) of
61− ADT _ _ cs -> go cs (from a)
62+ ADT _ _ cs _ -> go cs (from a)
62− Newtype _ _ c -> go (c :* Nil) (from a)
63+ Newtype _ _ c -> go (c :* Nil) (from a)
63 where
64 where
64− go :: (All2 QueryValues xss, SingI xss)
65+ go :: (All2 QueryValues xss, SListI xss)
65 => NP ConstructorInfo xss
66 => NP ConstructorInfo xss
66 -> SOP I xss
67 -> SOP I xss
67 -> Query
68 -> Query
69+ go cs (SOP sop) =
68− go cs (SOP sop) = group . unI . hcollapse $ hcliftA2' p (gctor o) cs sop
70+ group . hcollapse $ hcliftA2' p (gctor o) cs sop
69
71
70 group :: [(ByteString, ByteString)] -> Query
72 group :: [(ByteString, ByteString)] -> Query
71 group = concatMap f . groupBy ((==) `on` fst)
73 group = concatMap f . groupBy ((==) `on` fst)
src/Network/PagerDuty/Internal/TH.hs+6−6
@@ -1,7 +1,7 @@
1{-# LANGUAGE TemplateHaskell #-}
1{-# LANGUAGE TemplateHaskell #-}
2
2
3-- Module : Network.PagerDuty.Internal.TH
3-- Module : Network.PagerDuty.Internal.TH
4−-- Copyright : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
4+-- Copyright : (c) 2013-2015 Brendan Hay <brendan.g.hay@gmail.com>
5-- License : This Source Code Form is subject to the terms of
5-- License : This Source Code Form is subject to the terms of
6-- the Mozilla Public License, v. 2.0.
6-- the Mozilla Public License, v. 2.0.
7-- A copy of the MPL can be found in the LICENSE file or
7-- A copy of the MPL can be found in the LICENSE file or
@@ -40,15 +40,15 @@ module Network.PagerDuty.Internal.TH
40
40
41import Control.Applicative
41import Control.Applicative
42import Control.Lens
42import Control.Lens
43−import qualified Data.Aeson.TH as Aeson
43+import qualified Data.Aeson.TH as Aeson
44import Data.Aeson.Types
44import Data.Aeson.Types
45−import Data.ByteString (ByteString)
45+import Data.ByteString (ByteString)
46−import qualified Data.Text.Encoding as Text
46+import qualified Data.Text.Encoding as Text
47import Generics.SOP.TH
47import Generics.SOP.TH
48import Language.Haskell.TH
48import Language.Haskell.TH
49import Network.HTTP.Types.QueryLike
49import Network.HTTP.Types.QueryLike
50−import Network.PagerDuty.Internal.Query
51import Network.PagerDuty.Internal.Options
50import Network.PagerDuty.Internal.Options
51+import Network.PagerDuty.Internal.Query
52
52
53jsonRequest :: Name -> Q [Dec]
53jsonRequest :: Name -> Q [Dec]
54jsonRequest n = concat <$> sequence
54jsonRequest n = concat <$> sequence
@@ -61,7 +61,7 @@ queryRequest :: Name -> Q [Dec]
61queryRequest n = concat <$> sequence
61queryRequest n = concat <$> sequence
62 [ deriveGeneric n
62 [ deriveGeneric n
63 , makeLenses n
63 , makeLenses n
64− , [d|instance ToJSON $(conT n) where toJSON = const (toJSON (object []))|]
64+ , [d|instance ToJSON $(conT n) where toJSON = const emptyObject|]
65 , [d|instance QueryLike $(conT n) where toQuery = gquery|]
65 , [d|instance QueryLike $(conT n) where toQuery = gquery|]
66 ]
66 ]
67
67
src/Network/PagerDuty/Internal/Types.hs+125−41
@@ -1,9 +1,11 @@
1{-# LANGUAGE BangPatterns #-}
1{-# LANGUAGE BangPatterns #-}
2{-# LANGUAGE DataKinds #-}
2{-# LANGUAGE DataKinds #-}
3{-# LANGUAGE FlexibleInstances #-}
3{-# LANGUAGE FlexibleInstances #-}
4+{-# LANGUAGE FunctionalDependencies #-}
4{-# LANGUAGE GADTs #-}
5{-# LANGUAGE GADTs #-}
5{-# LANGUAGE GeneralizedNewtypeDeriving #-}
6{-# LANGUAGE GeneralizedNewtypeDeriving #-}
6{-# LANGUAGE KindSignatures #-}
7{-# LANGUAGE KindSignatures #-}
8+{-# LANGUAGE MultiParamTypeClasses #-}
7{-# LANGUAGE OverloadedStrings #-}
9{-# LANGUAGE OverloadedStrings #-}
8{-# LANGUAGE PatternSynonyms #-}
10{-# LANGUAGE PatternSynonyms #-}
9{-# LANGUAGE RankNTypes #-}
11{-# LANGUAGE RankNTypes #-}
@@ -13,7 +15,7 @@
13{-# LANGUAGE ViewPatterns #-}
15{-# LANGUAGE ViewPatterns #-}
14
16
15-- Module : Network.PagerDuty.Internal.Types
17-- Module : Network.PagerDuty.Internal.Types
16−-- Copyright : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
18+-- Copyright : (c) 2013-2015 Brendan Hay <brendan.g.hay@gmail.com>
17-- License : This Source Code Form is subject to the terms of
19-- License : This Source Code Form is subject to the terms of
18-- the Mozilla Public License, v. 2.0.
20-- the Mozilla Public License, v. 2.0.
19-- A copy of the MPL can be found in the LICENSE file or
21-- A copy of the MPL can be found in the LICENSE file or
@@ -25,33 +27,33 @@
25module Network.PagerDuty.Internal.Types where
27module Network.PagerDuty.Internal.Types where
26
28
27import Control.Applicative
29import Control.Applicative
28−import Control.Lens hiding ((.=))
30+import Control.Lens hiding ((.=), Empty)
31+import Control.Monad.IO.Class
29−import Data.Aeson hiding (Error)
32+import Data.Aeson hiding (Error, Key)
33+import qualified Data.Aeson.KeyMap as Map
30−import Data.Aeson.Types (Parser)
34+import Data.Aeson.Types (Parser)
31−import Data.ByteString (ByteString)
35+import Data.ByteString (ByteString)
32−import qualified Data.ByteString.Char8 as BS
36+import qualified Data.ByteString.Char8 as BS
33−import Data.ByteString.Conversion hiding (List)
37+import Data.ByteString.Conversion hiding (List)
34import Data.Default.Class
38import Data.Default.Class
35−import Data.Function (on)
39+import Data.Function (on)
36−import qualified Data.HashMap.Strict as Map
37−import Data.List (deleteBy, intersperse)
40+import Data.List (deleteBy, intersperse)
38import Data.Monoid
41import Data.Monoid
39import Data.String
42import Data.String
40−import Data.Text (Text)
43+import Data.Text (Text)
41−import qualified Data.Text as Text
44+import qualified Data.Text as Text
42−import qualified Data.Text.Encoding as Text
45+import qualified Data.Text.Encoding as Text
43−import Data.Time
46+import Data.Time (UTCTime, TimeZone, formatTime, utc, timeZoneName)
44import GHC.TypeLits
47import GHC.TypeLits
48+import Network.HTTP.Client (Manager)
45import Network.HTTP.Types
49import Network.HTTP.Types
46import Network.HTTP.Types.QueryLike
50import Network.HTTP.Types.QueryLike
47import Network.PagerDuty.Internal.Query
51import Network.PagerDuty.Internal.Query
48import Network.PagerDuty.Internal.TH
52import Network.PagerDuty.Internal.TH
49−import System.Locale
53+import Data.Time.Locale.Compat
50−
51−-- FIXME: Verify IncidentId/IncidentKey .. *Id/*Key are actually different or needed
52
54
53newtype CSV a = CSV [a]
55newtype CSV a = CSV [a]
54− deriving (Eq, Show, Monoid)
56+ deriving (Eq, Show, Semigroup, Monoid)
55
57
56makePrisms ''CSV
58makePrisms ''CSV
57
59
@@ -68,7 +70,7 @@ instance ToByteString a => ToJSON (CSV a) where
68 toJSON = String . Text.decodeUtf8 . toByteString'
70 toJSON = String . Text.decodeUtf8 . toByteString'
69
71
70newtype List a = L [a]
72newtype List a = L [a]
71− deriving (Eq, Show, Monoid)
73+ deriving (Eq, Show, Semigroup, Monoid)
72
74
73deriveJSON ''List
75deriveJSON ''List
74makePrisms ''List
76makePrisms ''List
@@ -104,7 +106,7 @@ instance ToJSON Date where
104
106
105instance ToByteString Date where
107instance ToByteString Date where
106 builder (D d) = builder
108 builder (D d) = builder
107− (formatTime defaultTimeLocale (iso8601DateFormat $ Just "%XZ") d)
109+ (formatTime defaultTimeLocale ("%Y-%m-%dT%XZ") d)
108
110
109instance QueryValues Date
111instance QueryValues Date
110
112
@@ -131,14 +133,17 @@ data Security = Basic | Token
131 deriving (Eq, Show)
133 deriving (Eq, Show)
132
134
133data Auth (a :: Security) where
135data Auth (a :: Security) where
134− AuthBasic :: ByteString -> ByteString -> Auth Basic
136+ AuthBasic :: ByteString -> ByteString -> Auth 'Basic
135− AuthToken :: ByteString -> Auth Token
137+ AuthToken :: ByteString -> Auth 'Token
136
138
137deriving instance Eq (Auth a)
139deriving instance Eq (Auth a)
138deriving instance Show (Auth a)
140deriving instance Show (Auth a)
139
141
140−newtype SubDomain = SubDomain ByteString
142+newtype SubDomain = SubDomain { subDomain :: ByteString }
141− deriving (Eq, Show, IsString)
143+ deriving (Eq, Show, IsString, ToByteString)
144+
145+mkSubDomain :: ByteString -> SubDomain
146+mkSubDomain = SubDomain
142
147
143domain :: SubDomain -> ByteString
148domain :: SubDomain -> ByteString
144domain (SubDomain s)
149domain (SubDomain s)
@@ -147,8 +152,35 @@ domain (SubDomain s)
147 where
152 where
148 base = ".pagerduty.com"
153 base = ".pagerduty.com"
149
154
155+-- | The log level and associated logger function.
156+data Logger
157+ = None
158+ | Debug (Text -> IO ())
159+
160+-- | Log a message using the debug logger, or if none is specified noop.
161+debug :: MonadIO m => Logger -> Text -> m ()
162+debug None = const (return ())
163+debug (Debug f) = liftIO . f
164+
165+-- | The environment containing the parameters required to
166+-- make PagerDuty requests.
167+data Env (s :: Security) = Env
168+ { _envDomain :: SubDomain
169+ , _envAuth' :: Auth s
170+ , _envManager :: Manager
171+ , _envLogger :: Logger
172+ }
173+
174+makeLenses ''Env
175+
176+envAuth :: forall s s'. Lens (Env s) (Env s') (Auth s) (Auth s')
177+envAuth = lens _envAuth' (\s x -> s { _envAuth' = x })
178+
179+prod :: SubDomain -> Auth s -> Manager -> Env s
180+prod d a m = Env d a m None
181+
150newtype Code = Code Integer
182newtype Code = Code Integer
151− deriving (Eq, Show)
183+ deriving (Eq, Show, Num)
152
184
153deriveJSON ''Code
185deriveJSON ''Code
154
186
@@ -170,6 +202,15 @@ description (Code c) =
170 2012 -> "Your account is expired and cannot use the API"
202 2012 -> "Your account is expired and cannot use the API"
171 _ -> "Unrecognised error code"
203 _ -> "Unrecognised error code"
172
204
205+class HasMessage s a | s -> a where
206+ -- | A short human-readable message describing the error.
207+ message :: Lens' s a
208+
209+class HasErrors s a | s -> a where
210+ -- | A list of human-readable reasons for the error. These values,
211+ -- and even their format, are subject to change.
212+ errors :: Lens' s a
213+
173data IntegrationError = IntegrationError
214data IntegrationError = IntegrationError
174 { _ieStatus :: Text
215 { _ieStatus :: Text
175 , _ieMessage :: Text
216 , _ieMessage :: Text
@@ -178,26 +219,53 @@ data IntegrationError = IntegrationError
178
219
179deriveRecord ''IntegrationError
220deriveRecord ''IntegrationError
180
221
181−data RestError = RestError
222+instance HasMessage IntegrationError Text where message = ieMessage
223+instance HasErrors IntegrationError [Text] where errors = ieErrors
224+
225+status :: Lens' IntegrationError Text
226+status = ieStatus
227+
228+data RESTError = RESTError
182 { _reCode :: Code
229 { _reCode :: Code
183 , _reMessage :: Text
230 , _reMessage :: Text
184 , _reErrors :: [Text]
231 , _reErrors :: [Text]
185 } deriving (Eq, Show)
232 } deriving (Eq, Show)
186
233
187−deriveRecord ''RestError
234+deriveRecord ''RESTError
235+
236+instance HasMessage RESTError Text where message = reMessage
237+instance HasErrors RESTError [Text] where errors = reErrors
238+
239+-- | In the case of an error, the PagerDuty error code can give further details
240+-- on the nature of the error.
241+--
242+-- /See:/ 'description'
243+code :: Lens' RESTError Code
244+code = reCode
188
245
189data Error
246data Error
190− = Internal String
247+ = Internal Text
191 | Integration IntegrationError
248 | Integration IntegrationError
192− | Rest RestError
249+ | REST RESTError
193 deriving (Eq, Show)
250 deriving (Eq, Show)
194
251
195instance FromJSON Error where
252instance FromJSON Error where
196− parseJSON o = (Rest <$> parseJSON o)
253+ parseJSON o = (REST <$> parseJSON o)
197 <|> (Integration <$> parseJSON o)
254 <|> (Integration <$> parseJSON o)
198
255
199makePrisms ''Error
256makePrisms ''Error
200
257
258+instance HasMessage Error Text where
259+ message = lens f g
260+ where
261+ f (Internal x) = x
262+ f (Integration s) = _ieMessage s
263+ f (REST s) = _reMessage s
264+
265+ g (Internal _) x = Internal x
266+ g (Integration s) x = Integration $ s { _ieMessage = x }
267+ g (REST s) x = REST $ s { _reMessage = x }
268+
201data Pager = Pager
269data Pager = Pager
202 { _pgOffset :: !Int
270 { _pgOffset :: !Int
203 -- ^ The offset used in the execution of the query.
271 -- ^ The offset used in the execution of the query.
@@ -211,8 +279,13 @@ data Pager = Pager
211
279
212makeLenses ''Pager
280makeLenses ''Pager
213
281
282+data Page a = Page
283+ { _pgItem :: a
284+ , _pgPager :: Maybe Pager
285+ }
286+
214−instance FromJSON a => FromJSON (a, Maybe Pager) where
287+instance FromJSON a => FromJSON (Page a) where
215− parseJSON = withObject "paginated" $ \o -> (,)
288+ parseJSON = withObject "paginated" $ \o -> Page
216 <$> parseJSON (Object o)
289 <$> parseJSON (Object o)
217 <*> optional (parse o)
290 <*> optional (parse o)
218 where
291 where
@@ -237,11 +310,13 @@ data Path where
237 Path :: Path
310 Path :: Path
238 Seg :: ToByteString a => a -> Path
311 Seg :: ToByteString a => a -> Path
239
312
313+instance Semigroup Path where
314+ x <> Path = x
315+ Path <> y = y
316+ Seg x <> Seg y = Seg (builder x <> "/" <> builder y)
317+
240instance Monoid Path where
318instance Monoid Path where
241− mempty = Path
319+ mempty = Path
242− mappend x Path = x
243− mappend Path y = y
244− mappend (Seg x) (Seg y) = Seg (builder x <> "/" <> builder y)
245
320
246instance IsString Path where
321instance IsString Path where
247 fromString = Seg
322 fromString = Seg
@@ -318,13 +393,13 @@ class Paginate a where
318 next :: Request a s b -> Maybe Pager -> Maybe (Request a s b)
393 next :: Request a s b -> Maybe Pager -> Maybe (Request a s b)
319 next rq = maybe Nothing go
394 next rq = maybe Nothing go
320 where
395 where
321− go x | x^.pgTotal == 0 = Nothing
396+ go x | x ^. pgTotal == 0 = Nothing
322− | otherwise = Just $
397+ | otherwise = Just $
323− rq & pager ?~ (x & pgOffset +~ x^.pgTotal)
398+ rq & pager ?~ (x & pgOffset +~ x ^. pgTotal)
324 & query %~ (add . clear)
399 & query %~ (add . clear)
325 where
400 where
326 add :: Query -> Query
401 add :: Query -> Query
327− add = maybe id ((:) . (k,) . Just . Text.encodeUtf8) (x^.pgQuery)
402+ add = maybe id ((:) . (k,) . Just . Text.encodeUtf8) (x ^. pgQuery)
328
403
329 clear :: Query -> Query
404 clear :: Query -> Query
330 clear = deleteBy ((==) `on` fst) (k, Nothing)
405 clear = deleteBy ((==) `on` fst) (k, Nothing)
@@ -335,6 +410,9 @@ class Paginate a where
335newtype Key (a :: Symbol) = Key Text
410newtype Key (a :: Symbol) = Key Text
336 deriving (Eq, Show, IsString)
411 deriving (Eq, Show, IsString)
337
412
413+mkKey :: Text -> Key a
414+mkKey = Key
415+
338instance FromJSON (Key a) where
416instance FromJSON (Key a) where
339 parseJSON = withText "key" (return . Key)
417 parseJSON = withText "key" (return . Key)
340
418
@@ -355,6 +433,9 @@ type IncidentKey = Key "incident"
355newtype Id (a :: Symbol) = Id Text
433newtype Id (a :: Symbol) = Id Text
356 deriving (Eq, Show, IsString)
434 deriving (Eq, Show, IsString)
357
435
436+mkId :: Text -> Id a
437+mkId = Id
438+
358instance FromJSON (Id a) where
439instance FromJSON (Id a) where
359 parseJSON = withText "id" (return . Id)
440 parseJSON = withText "id" (return . Id)
360
441
@@ -402,7 +483,10 @@ instance QueryLike Empty where
402 toQuery = const []
483 toQuery = const []
403
484
404newtype Address = Address Text
485newtype Address = Address Text
405− deriving (Eq, Show)
486+ deriving (Eq, Show, IsString)
487+
488+mkAddress :: Text -> Address
489+mkAddress = Address
406
490
407deriveJSON ''Address
491deriveJSON ''Address
408makePrisms ''Address
492makePrisms ''Address
src/Network/PagerDuty/REST.hs+41−29
@@ -2,7 +2,7 @@
2{-# LANGUAGE OverloadedStrings #-}
2{-# LANGUAGE OverloadedStrings #-}
3
3
4-- Module : Network.PagerDuty.REST
4-- Module : Network.PagerDuty.REST
5−-- Copyright : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
5+-- Copyright : (c) 2013-2015 Brendan Hay <brendan.g.hay@gmail.com>
6-- License : This Source Code Form is subject to the terms of
6-- License : This Source Code Form is subject to the terms of
7-- the Mozilla Public License, v. 2.0.
7-- the Mozilla Public License, v. 2.0.
8-- A copy of the MPL can be found in the LICENSE file or
8-- A copy of the MPL can be found in the LICENSE file or
@@ -15,7 +15,11 @@ module Network.PagerDuty.REST
15 (
15 (
16 -- * Sending requests
16 -- * Sending requests
17 send
17 send
18+ , sendWith
18 , paginate
19 , paginate
20+ , paginateWith
21+
22+ , module Network.PagerDuty.Types
19 ) where
23 ) where
20
24
21import Control.Applicative
25import Control.Applicative
@@ -23,61 +27,69 @@ import Control.Lens
23import Control.Monad
27import Control.Monad
24import Control.Monad.IO.Class
28import Control.Monad.IO.Class
25import Control.Monad.Trans
29import Control.Monad.Trans
26−import Data.Aeson (FromJSON)
30+import Data.Aeson (FromJSON)
27import Data.Conduit
31import Data.Conduit
28−import Data.Default.Class
29import Data.Monoid
32import Data.Monoid
30−import Network.HTTP.Client (Manager)
33+import Network.HTTP.Client (Manager)
31−import qualified Network.HTTP.Client as Client
34+import qualified Network.HTTP.Client as Client
32import Network.HTTP.Types
35import Network.HTTP.Types
33import Network.PagerDuty.Internal.IO
36import Network.PagerDuty.Internal.IO
34import Network.PagerDuty.Internal.Types
37import Network.PagerDuty.Internal.Types
35−
38+import Network.PagerDuty.Types
36−-- Make the type names consistent, for example:
37−-- Suffix with *Details or *Info for results
38−-- No suffix for requests if necessary
39
39
40-- FIXME: verify correct actions are all paginated
40-- FIXME: verify correct actions are all paginated
41+-- FIXME: Ensure RequesterId parameter is always most significant param
42+-- FIXME: add smart constructors for all types, for testing purposes
41
43
42−-- FIXME: Ensure requesterid parameter is always first
44+-- | /See:/ 'sendWith'
43−
44send :: (MonadIO m, FromJSON b)
45send :: (MonadIO m, FromJSON b)
46+ => SubDomain
45− => Auth s
47+ -> Auth s
46− -> SubDomain
47 -> Manager
48 -> Manager
48 -> Request a s b
49 -> Request a s b
49 -> m (Either Error b)
50 -> m (Either Error b)
50−send a s m = liftM (fmap fst) . http a s m
51+send d a m = sendWith (prod d a m)
51
52
53+sendWith :: (MonadIO m, FromJSON b)
54+ => Env s
55+ -> Request a s b
56+ -> m (Either Error b)
57+sendWith e = liftM (fmap _pgItem) . http e
58+
59+-- | /See:/ 'paginateWith'
52paginate :: (MonadIO m, Paginate a, FromJSON b)
60paginate :: (MonadIO m, Paginate a, FromJSON b)
61+ => SubDomain
53− => Auth s
62+ -> Auth s
54− -> SubDomain
55 -> Manager
63 -> Manager
56 -> Request a s b
64 -> Request a s b
57 -> Source m (Either Error b)
65 -> Source m (Either Error b)
58−paginate a d m = go
66+paginate d a m = paginateWith (prod d a m)
67+
68+paginateWith :: (MonadIO m, Paginate a, FromJSON b)
69+ => Env s
70+ -> Request a s b
71+ -> Source m (Either Error b)
72+paginateWith e = go
59 where
73 where
60 go rq = do
74 go rq = do
61− rs <- lift (http a d m rq)
75+ rs <- lift (http e rq)
62− yield (fst <$> rs)
76+ yield (_pgItem <$> rs)
63 either (const (return ()))
77 either (const (return ()))
64− (maybe (return ()) go . next rq . snd)
78+ (maybe (return ()) go . next rq . _pgPager)
65 rs
79 rs
66
80
67http :: (MonadIO m, FromJSON b)
81http :: (MonadIO m, FromJSON b)
68− => Auth s
82+ => Env s
69− -> SubDomain
70− -> Manager
71 -> Request a s b
83 -> Request a s b
72− -> m (Either Error (b, Maybe Pager))
84+ -> m (Either Error (Page b))
73−http a (SubDomain h) m rq = request m rq $ raw
85+http e rq = request (e ^. envManager) (e ^. envLogger) rq $ raw
74− { Client.host = h
86+ { Client.host = domain (e ^. envDomain)
75 , Client.path = renderPath (rq ^. path)
87 , Client.path = renderPath (rq ^. path)
76 , Client.queryString = renderQuery False (rq ^. query)
88 , Client.queryString = renderQuery False (rq ^. query)
77 }
89 }
78 where
90 where
79− raw = case a of
91+ raw = case e ^. envAuth of
80− AuthBasic u p -> Client.applyBasicAuth u p def
92+ AuthBasic u p -> Client.applyBasicAuth u p Client.defaultRequest
81− AuthToken t -> def
93+ AuthToken t -> Client.defaultRequest
82 { Client.requestHeaders = [("Authorization", "Token token=" <> t)]
94 { Client.requestHeaders = [("Authorization", "Token token=" <> t)]
83 }
95 }
src/Network/PagerDuty/REST/Alerts.hs+7−7
@@ -4,7 +4,7 @@
4{-# LANGUAGE TypeFamilies #-}
4{-# LANGUAGE TypeFamilies #-}
5
5
6-- Module : Network.PagerDuty.REST.Alerts
6-- Module : Network.PagerDuty.REST.Alerts
7−-- Copyright : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
7+-- Copyright : (c) 2013-2015 Brendan Hay <brendan.g.hay@gmail.com>
8-- License : This Source Code Form is subject to the terms of
8-- License : This Source Code Form is subject to the terms of
9-- the Mozilla Public License, v. 2.0.
9-- the Mozilla Public License, v. 2.0.
10-- A copy of the MPL can be found in the LICENSE file or
10-- A copy of the MPL can be found in the LICENSE file or
@@ -43,12 +43,12 @@ module Network.PagerDuty.REST.Alerts
43 , alertAddress
43 , alertAddress
44 ) where
44 ) where
45
45
46−import Control.Lens
46+import Control.Lens hiding (Empty)
47−import Data.Aeson.Lens
47+import Data.Aeson.Lens
48−import Data.Time
48+import Data.Time
49+import Network.PagerDuty.Internal.TH
50+import Network.PagerDuty.Internal.Types
49−import Network.PagerDuty.REST.Users (User)
51+import Network.PagerDuty.REST.Users (User)
50−import Network.PagerDuty.Internal.TH
51−import Network.PagerDuty.Internal.Types
52
52
53alerts :: Path
53alerts :: Path
54alerts = "alerts"
54alerts = "alerts"
src/Network/PagerDuty/REST/EscalationPolicies.hs+14−14
@@ -1,13 +1,13 @@
1+{-# LANGUAGE DataKinds #-}
1−{-# LANGUAGE ExtendedDefaultRules #-}
2+{-# LANGUAGE ExtendedDefaultRules #-}
2−{-# LANGUAGE DataKinds #-}
3−{-# LANGUAGE OverloadedStrings #-}
3+{-# LANGUAGE OverloadedStrings #-}
4−{-# LANGUAGE TemplateHaskell #-}
4+{-# LANGUAGE TemplateHaskell #-}
5−{-# LANGUAGE TypeFamilies #-}
5+{-# LANGUAGE TypeFamilies #-}
6
6
7{-# OPTIONS_GHC -fno-warn-type-defaults #-}
7{-# OPTIONS_GHC -fno-warn-type-defaults #-}
8
8
9-- Module : Network.PagerDuty.REST.EscalationPolicies
9-- Module : Network.PagerDuty.REST.EscalationPolicies
10−-- Copyright : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
10+-- Copyright : (c) 2013-2015 Brendan Hay <brendan.g.hay@gmail.com>
11-- License : This Source Code Form is subject to the terms of
11-- License : This Source Code Form is subject to the terms of
12-- the Mozilla Public License, v. 2.0.
12-- the Mozilla Public License, v. 2.0.
13-- A copy of the MPL can be found in the LICENSE file or
13-- A copy of the MPL can be found in the LICENSE file or
@@ -60,15 +60,15 @@ module Network.PagerDuty.REST.EscalationPolicies
60 , pServices
60 , pServices
61 ) where
61 ) where
62
62
63−import Control.Lens
63+import Control.Lens hiding (Empty)
64−import Data.Aeson.Lens
64+import Data.Aeson.Lens
65−import Data.Text (Text)
65+import Data.Text (Text)
66−import Network.HTTP.Types
66+import Network.HTTP.Types
67+import Network.PagerDuty.Internal.TH
68+import Network.PagerDuty.Internal.Types
67−import Network.PagerDuty.REST.Services (Service)
69+import Network.PagerDuty.REST.Services (Service)
68−import Network.PagerDuty.Internal.TH
69−import Network.PagerDuty.Internal.Types
70
70
71−import Network.PagerDuty.REST.EscalationPolicies.EscalationRules
71+import Network.PagerDuty.REST.EscalationPolicies.EscalationRules
72
72
73default (Path)
73default (Path)
74
74
src/Network/PagerDuty/REST/EscalationPolicies/EscalationRules.hs+10−10
@@ -1,12 +1,12 @@
1−{-# LANGUAGE ExtendedDefaultRules #-}
1+{-# LANGUAGE ExtendedDefaultRules #-}
2−{-# LANGUAGE FlexibleInstances #-}
2+{-# LANGUAGE FlexibleInstances #-}
3−{-# LANGUAGE OverloadedStrings #-}
3+{-# LANGUAGE OverloadedStrings #-}
4−{-# LANGUAGE TemplateHaskell #-}
4+{-# LANGUAGE TemplateHaskell #-}
5
5
6{-# OPTIONS_GHC -fno-warn-type-defaults #-}
6{-# OPTIONS_GHC -fno-warn-type-defaults #-}
7
7
8-- Module : Network.PagerDuty.REST.EscalationPolicies.EscalationRules
8-- Module : Network.PagerDuty.REST.EscalationPolicies.EscalationRules
9−-- Copyright : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
9+-- Copyright : (c) 2013-2015 Brendan Hay <brendan.g.hay@gmail.com>
10-- License : This Source Code Form is subject to the terms of
10-- License : This Source Code Form is subject to the terms of
11-- the Mozilla Public License, v. 2.0.
11-- the Mozilla Public License, v. 2.0.
12-- A copy of the MPL can be found in the LICENSE file or
12-- A copy of the MPL can be found in the LICENSE file or
@@ -64,15 +64,15 @@ module Network.PagerDuty.REST.EscalationPolicies.EscalationRules
64 , rTargets
64 , rTargets
65 ) where
65 ) where
66
66
67−import Control.Applicative ((<$>))
67+import Control.Applicative ((<$>))
68−import Control.Lens hiding ((.=))
68+import Control.Lens hiding ((.=))
69import Data.Aeson
69import Data.Aeson
70−import qualified Data.HashMap.Strict as Map
70+import qualified Data.Aeson.KeyMap as Map
71−import Data.Text (Text)
71+import Data.Text (Text)
72import Network.HTTP.Types
72import Network.HTTP.Types
73−import Network.PagerDuty.REST.Users
74import Network.PagerDuty.Internal.TH
73import Network.PagerDuty.Internal.TH
75import Network.PagerDuty.Internal.Types
74import Network.PagerDuty.Internal.Types
75+import Network.PagerDuty.REST.Users
76
76
77default (Path)
77default (Path)
78
78
src/Network/PagerDuty/REST/Incidents.hs+20−24
@@ -10,7 +10,7 @@
10{-# OPTIONS_GHC -fno-warn-type-defaults #-}
10{-# OPTIONS_GHC -fno-warn-type-defaults #-}
11
11
12-- Module : Network.PagerDuty.REST.Incidents
12-- Module : Network.PagerDuty.REST.Incidents
13−-- Copyright : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
13+-- Copyright : (c) 2013-2015 Brendan Hay <brendan.g.hay@gmail.com>
14-- License : This Source Code Form is subject to the terms of
14-- License : This Source Code Form is subject to the terms of
15-- the Mozilla Public License, v. 2.0.
15-- the Mozilla Public License, v. 2.0.
16-- A copy of the MPL can be found in the LICENSE file or
16-- A copy of the MPL can be found in the LICENSE file or
@@ -129,14 +129,16 @@ module Network.PagerDuty.REST.Incidents
129 , Incident
129 , Incident
130 ) where
130 ) where
131
131
132−import Control.Applicative hiding (empty)
132+import Control.Applicative hiding (empty)
133−import Control.Lens
133+import Control.Lens hiding (Empty)
134import Data.Aeson
134import Data.Aeson
135−import Data.ByteString.Conversion (ToByteString(..), toByteString')
135+import Data.ByteString.Conversion (ToByteString (..),
136+ toByteString')
136import Data.Default.Class
137import Data.Default.Class
138+import Data.Maybe
137−import Data.Monoid hiding (All)
139+import Data.Monoid hiding (All)
138−import Data.Text (Text)
140+import Data.Text (Text)
139−import qualified Data.Text.Encoding as Text
141+import qualified Data.Text.Encoding as Text
140import Data.Time
142import Data.Time
141import Network.HTTP.Types
143import Network.HTTP.Types
142import Network.PagerDuty.Internal.Query
144import Network.PagerDuty.Internal.Query
@@ -345,13 +347,10 @@ lsUntil = upd.lsUntil'.mapping _D
345-- | When set, the since and until parameters and defaults are
347-- | When set, the since and until parameters and defaults are
346-- ignored. Use this to get all incidents since the account was created.
348-- ignored. Use this to get all incidents since the account was created.
347lsDateRange :: Lens' (Request ListIncidents s b) Bool
349lsDateRange :: Lens' (Request ListIncidents s b) Bool
348−lsDateRange = upd . lens get_ set_
350+lsDateRange = upd.lens get_ (flip set_)
349 where
351 where
350− get_ x
352+ get_ = (Just All ==) . view lsDateRange'
351− | Just All <- _lsDateRange' x = True
353+ set_ x = lsDateRange' .~ listToMaybe [All | x]
352− | otherwise = False
353−
354− set_ l x = l { _lsDateRange' = if x then Just All else Nothing }
355
354
356-- | Returns only the incidents currently in the passed status(es).
355-- | Returns only the incidents currently in the passed status(es).
357lsStatus :: Lens' (Request ListIncidents s b) (Maybe [IncidentStatus])
356lsStatus :: Lens' (Request ListIncidents s b) (Maybe [IncidentStatus])
@@ -438,12 +437,12 @@ cSince = upd.cSince'.mapping _D
438
437
439-- | The end of the date range over which you want to search.
438-- | The end of the date range over which you want to search.
440--
439--
441−-- /Note: If you leave off either since or until, a 30 day default range is
440+-- /Note:/ If you leave off either since or until, a 30 day default range is
442-- applied to your open ended range. Not including the since parameter will set
441-- applied to your open ended range. Not including the since parameter will set
443−-- the date range to until - 30 days. Likewise, if you leave off until,
442+-- the date range to until @-30@ days. Likewise, if you leave off until,
444−-- it is set to since + 30 days.
443+-- it is set to since @+30@ days.
445--
444--
446−-- Defaults to the last 30 days if you leave off both. The size of the date
445+-- /Default:/ The last 30 days if you leave off both. The size of the date
447-- range must be less than 180 days.
446-- range must be less than 180 days.
448cUntil :: Lens' (Request CountIncidents s b) (Maybe UTCTime)
447cUntil :: Lens' (Request CountIncidents s b) (Maybe UTCTime)
449cUntil = upd.cUntil'.mapping _D
448cUntil = upd.cUntil'.mapping _D
@@ -451,13 +450,10 @@ cUntil = upd.cUntil'.mapping _D
451-- | When set, the since and until parameters and defaults are
450-- | When set, the since and until parameters and defaults are
452-- ignored. Use this to get all counts since the account was created.
451-- ignored. Use this to get all counts since the account was created.
453cDateRange :: Lens' (Request CountIncidents s b) Bool
452cDateRange :: Lens' (Request CountIncidents s b) Bool
454−cDateRange = upd . lens get_ set_
453+cDateRange = upd.lens get_ (flip set_)
455 where
454 where
456− get_ x
455+ get_ = (Just All ==) . view cDateRange'
457− | Just All <- _cDateRange' x = True
456+ set_ x = cDateRange' .~ listToMaybe [All | x]
458− | otherwise = False
459−
460− set_ l x = l { _cDateRange' = if x then Just All else Nothing }
461
457
462-- | Only counts the incidents currently in the passed status(es).
458-- | Only counts the incidents currently in the passed status(es).
463cStatus :: Lens' (Request CountIncidents s b) (Maybe [IncidentStatus])
459cStatus :: Lens' (Request CountIncidents s b) (Maybe [IncidentStatus])
@@ -571,7 +567,7 @@ updateIncidents r = auth updateIncidentsBasic & query .~ [("requester_id", r)]
571
567
572-- | A version of 'updateIncidents' which uses HTTP Basic authentication and
568-- | A version of 'updateIncidents' which uses HTTP Basic authentication and
573-- doesn't require a 'RequesterId'.
569-- doesn't require a 'RequesterId'.
574−updateIncidentsBasic :: Request UpdateIncidents Basic [UpdatedIncidents]
570+updateIncidentsBasic :: Request UpdateIncidents 'Basic [UpdatedIncidents]
575updateIncidentsBasic =
571updateIncidentsBasic =
576 mk UpdateIncidents
572 mk UpdateIncidents
577 { _uiIncidents' = []
573 { _uiIncidents' = []
src/Network/PagerDuty/REST/Incidents/Notes.hs+12−12
@@ -1,11 +1,11 @@
1−{-# LANGUAGE ExtendedDefaultRules #-}
1+{-# LANGUAGE ExtendedDefaultRules #-}
2−{-# LANGUAGE OverloadedStrings #-}
2+{-# LANGUAGE OverloadedStrings #-}
3−{-# LANGUAGE TemplateHaskell #-}
3+{-# LANGUAGE TemplateHaskell #-}
4
4
5{-# OPTIONS_GHC -fno-warn-type-defaults #-}
5{-# OPTIONS_GHC -fno-warn-type-defaults #-}
6
6
7-- Module : Network.PagerDuty.REST.Incidents.Notes
7-- Module : Network.PagerDuty.REST.Incidents.Notes
8−-- Copyright : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
8+-- Copyright : (c) 2013-2015 Brendan Hay <brendan.g.hay@gmail.com>
9-- License : This Source Code Form is subject to the terms of
9-- License : This Source Code Form is subject to the terms of
10-- the Mozilla Public License, v. 2.0.
10-- the Mozilla Public License, v. 2.0.
11-- A copy of the MPL can be found in the LICENSE file or
11-- A copy of the MPL can be found in the LICENSE file or
@@ -36,14 +36,14 @@ module Network.PagerDuty.REST.Incidents.Notes
36 , nContent
36 , nContent
37 ) where
37 ) where
38
38
39−import Control.Lens hiding ((.=))
39+import Control.Lens hiding ((.=))
40−import Data.Aeson
40+import Data.Aeson
41−import Data.Text (Text)
41+import Data.Text (Text)
42−import Data.Time
42+import Data.Time
43−import Network.HTTP.Types
43+import Network.HTTP.Types
44+import Network.PagerDuty.Internal.TH
45+import Network.PagerDuty.Internal.Types
44−import Network.PagerDuty.REST.Users
46+import Network.PagerDuty.REST.Users
45−import Network.PagerDuty.Internal.TH
46−import Network.PagerDuty.Internal.Types
47
47
48default (Path)
48default (Path)
49
49
src/Network/PagerDuty/REST/LogEntries.hs+6−7
@@ -5,7 +5,7 @@
5{-# LANGUAGE TypeFamilies #-}
5{-# LANGUAGE TypeFamilies #-}
6
6
7-- Module : Network.PagerDuty.REST.LogEntries
7-- Module : Network.PagerDuty.REST.LogEntries
8−-- Copyright : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
8+-- Copyright : (c) 2013-2015 Brendan Hay <brendan.g.hay@gmail.com>
9-- License : This Source Code Form is subject to the terms of
9-- License : This Source Code Form is subject to the terms of
10-- the Mozilla Public License, v. 2.0.
10-- the Mozilla Public License, v. 2.0.
11-- A copy of the MPL can be found in the LICENSE file or
11-- A copy of the MPL can be found in the LICENSE file or
@@ -111,19 +111,18 @@ module Network.PagerDuty.REST.LogEntries
111 , nAddress
111 , nAddress
112 ) where
112 ) where
113
113
114−import Control.Applicative
114+import Control.Lens hiding (Empty)
115−import Control.Lens
116import Data.Aeson
115import Data.Aeson
117import Data.Aeson.Lens
116import Data.Aeson.Lens
117+import qualified Data.Aeson.KeyMap as Map
118import Data.Default.Class
118import Data.Default.Class
119−import qualified Data.HashMap.Strict as Map
120−import Data.Text (Text)
119+import Data.Text (Text)
121−import qualified Data.Text as Text
120+import qualified Data.Text as Text
122import Data.Time
121import Data.Time
123import Network.HTTP.Types
122import Network.HTTP.Types
124−import Network.PagerDuty.REST.Users (User)
125import Network.PagerDuty.Internal.TH
123import Network.PagerDuty.Internal.TH
126import Network.PagerDuty.Internal.Types
124import Network.PagerDuty.Internal.Types
125+import Network.PagerDuty.REST.Users (User)
127
126
128logs :: Path
127logs :: Path
129logs = "log_entries"
128logs = "log_entries"
src/Network/PagerDuty/REST/MaintenanceWindows.hs+10−10
@@ -4,7 +4,7 @@
4{-# LANGUAGE TypeFamilies #-}
4{-# LANGUAGE TypeFamilies #-}
5
5
6-- Module : Network.PagerDuty.REST.MaintenanceWindows
6-- Module : Network.PagerDuty.REST.MaintenanceWindows
7−-- Copyright : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
7+-- Copyright : (c) 2013-2015 Brendan Hay <brendan.g.hay@gmail.com>
8-- License : This Source Code Form is subject to the terms of
8-- License : This Source Code Form is subject to the terms of
9-- the Mozilla Public License, v. 2.0.
9-- the Mozilla Public License, v. 2.0.
10-- A copy of the MPL can be found in the LICENSE file or
10-- A copy of the MPL can be found in the LICENSE file or
@@ -74,14 +74,14 @@ module Network.PagerDuty.REST.MaintenanceWindows
74 , mwServices
74 , mwServices
75 ) where
75 ) where
76
76
77−import Control.Lens
77+import Control.Lens hiding (Empty)
78−import Data.Monoid
78+import Data.Monoid
79−import Data.Text (Text)
79+import Data.Text (Text)
80−import Data.Time
80+import Data.Time
81−import Network.HTTP.Types
81+import Network.HTTP.Types
82+import Network.PagerDuty.Internal.TH
83+import Network.PagerDuty.Internal.Types
82−import Network.PagerDuty.REST.Users (User)
84+import Network.PagerDuty.REST.Users (User)
83−import Network.PagerDuty.Internal.TH
84−import Network.PagerDuty.Internal.Types
85
85
86windows :: Path
86windows :: Path
87windows = "maintenance_windows"
87windows = "maintenance_windows"
@@ -214,7 +214,7 @@ createWindow r s e xs =
214createWindowBasic :: UTCTime -- ^ 'cwStartTime'
214createWindowBasic :: UTCTime -- ^ 'cwStartTime'
215 -> UTCTime -- ^ 'cwEndTime'
215 -> UTCTime -- ^ 'cwEndTime'
216 -> [ServiceId] -- ^ 'cwServiceIds'
216 -> [ServiceId] -- ^ 'cwServiceIds'
217− -> Request CreateWindow Basic MaintenanceWindow
217+ -> Request CreateWindow 'Basic MaintenanceWindow
218createWindowBasic s e xs =
218createWindowBasic s e xs =
219 mk CreateWindow
219 mk CreateWindow
220 { _cwRequesterId' = Nothing
220 { _cwRequesterId' = Nothing
src/Network/PagerDuty/REST/Reports.hs+11−11
@@ -1,13 +1,13 @@
1−{-# LANGUAGE DataKinds #-}
1+{-# LANGUAGE DataKinds #-}
2−{-# LANGUAGE ExtendedDefaultRules #-}
2+{-# LANGUAGE ExtendedDefaultRules #-}
3−{-# LANGUAGE OverloadedStrings #-}
3+{-# LANGUAGE OverloadedStrings #-}
4−{-# LANGUAGE TemplateHaskell #-}
4+{-# LANGUAGE TemplateHaskell #-}
5−{-# LANGUAGE TypeFamilies #-}
5+{-# LANGUAGE TypeFamilies #-}
6
6
7{-# OPTIONS_GHC -fno-warn-type-defaults #-}
7{-# OPTIONS_GHC -fno-warn-type-defaults #-}
8
8
9-- Module : Network.PagerDuty.REST.Reports
9-- Module : Network.PagerDuty.REST.Reports
10−-- Copyright : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
10+-- Copyright : (c) 2013-2015 Brendan Hay <brendan.g.hay@gmail.com>
11-- License : This Source Code Form is subject to the terms of
11-- License : This Source Code Form is subject to the terms of
12-- the Mozilla Public License, v. 2.0.
12-- the Mozilla Public License, v. 2.0.
13-- A copy of the MPL can be found in the LICENSE file or
13-- A copy of the MPL can be found in the LICENSE file or
@@ -58,11 +58,11 @@ module Network.PagerDuty.REST.Reports
58 , irNumberOfIncidents
58 , irNumberOfIncidents
59 ) where
59 ) where
60
60
61−import Control.Lens
61+import Control.Lens hiding (Empty)
62−import Data.Aeson.Lens
62+import Data.Aeson.Lens
63−import Data.Time
63+import Data.Time
64−import Network.PagerDuty.Internal.TH
64+import Network.PagerDuty.Internal.TH
65−import Network.PagerDuty.Internal.Types
65+import Network.PagerDuty.Internal.Types
66
66
67default (Path)
67default (Path)
68
68
src/Network/PagerDuty/REST/Schedules.hs+14−14
@@ -1,13 +1,13 @@
1−{-# LANGUAGE DataKinds #-}
1+{-# LANGUAGE DataKinds #-}
2−{-# LANGUAGE ExtendedDefaultRules #-}
2+{-# LANGUAGE ExtendedDefaultRules #-}
3−{-# LANGUAGE OverloadedStrings #-}
3+{-# LANGUAGE OverloadedStrings #-}
4−{-# LANGUAGE TemplateHaskell #-}
4+{-# LANGUAGE TemplateHaskell #-}
5−{-# LANGUAGE TypeFamilies #-}
5+{-# LANGUAGE TypeFamilies #-}
6
6
7{-# OPTIONS_GHC -fno-warn-type-defaults #-}
7{-# OPTIONS_GHC -fno-warn-type-defaults #-}
8
8
9-- Module : Network.PagerDuty.REST.Schedules
9-- Module : Network.PagerDuty.REST.Schedules
10−-- Copyright : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
10+-- Copyright : (c) 2013-2015 Brendan Hay <brendan.g.hay@gmail.com>
11-- License : This Source Code Form is subject to the terms of
11-- License : This Source Code Form is subject to the terms of
12-- the Mozilla Public License, v. 2.0.
12-- the Mozilla Public License, v. 2.0.
13-- A copy of the MPL can be found in the LICENSE file or
13-- A copy of the MPL can be found in the LICENSE file or
@@ -110,14 +110,14 @@ module Network.PagerDuty.REST.Schedules
110 , sFinalSchedule
110 , sFinalSchedule
111 ) where
111 ) where
112
112
113−import Control.Lens hiding ((.=))
113+import Control.Lens hiding (Empty, (.=))
114−import Data.Aeson
114+import Data.Aeson
115−import Data.Text (Text)
115+import Data.Text (Text)
116−import Data.Time
116+import Data.Time
117−import Network.HTTP.Types
117+import Network.HTTP.Types
118+import Network.PagerDuty.Internal.TH
119+import Network.PagerDuty.Internal.Types
118−import Network.PagerDuty.REST.Users (User)
120+import Network.PagerDuty.REST.Users (User)
119−import Network.PagerDuty.Internal.TH
120−import Network.PagerDuty.Internal.Types
121
121
122default (Path)
122default (Path)
123
123
src/Network/PagerDuty/REST/Schedules/Overrides.hs+12−12
@@ -1,13 +1,13 @@
1−{-# LANGUAGE DataKinds #-}
1+{-# LANGUAGE DataKinds #-}
2−{-# LANGUAGE ExtendedDefaultRules #-}
2+{-# LANGUAGE ExtendedDefaultRules #-}
3−{-# LANGUAGE OverloadedStrings #-}
3+{-# LANGUAGE OverloadedStrings #-}
4−{-# LANGUAGE TemplateHaskell #-}
4+{-# LANGUAGE TemplateHaskell #-}
5−{-# LANGUAGE TypeFamilies #-}
5+{-# LANGUAGE TypeFamilies #-}
6
6
7{-# OPTIONS_GHC -fno-warn-type-defaults #-}
7{-# OPTIONS_GHC -fno-warn-type-defaults #-}
8
8
9-- Module : Network.PagerDuty.REST.Schedules
9-- Module : Network.PagerDuty.REST.Schedules
10−-- Copyright : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
10+-- Copyright : (c) 2013-2015 Brendan Hay <brendan.g.hay@gmail.com>
11-- License : This Source Code Form is subject to the terms of
11-- License : This Source Code Form is subject to the terms of
12-- the Mozilla Public License, v. 2.0.
12-- the Mozilla Public License, v. 2.0.
13-- A copy of the MPL can be found in the LICENSE file or
13-- A copy of the MPL can be found in the LICENSE file or
@@ -50,12 +50,12 @@ module Network.PagerDuty.REST.Schedules.Overrides
50 , oUser
50 , oUser
51 ) where
51 ) where
52
52
53−import Control.Lens
53+import Control.Lens
54−import Data.Time
54+import Data.Time
55−import Network.HTTP.Types
55+import Network.HTTP.Types
56+import Network.PagerDuty.Internal.TH
57+import Network.PagerDuty.Internal.Types
56−import Network.PagerDuty.REST.Users
58+import Network.PagerDuty.REST.Users
57−import Network.PagerDuty.Internal.TH
58−import Network.PagerDuty.Internal.Types
59
59
60overrides :: ScheduleId -> Path
60overrides :: ScheduleId -> Path
61overrides i = "schedules" % i % "overrides"
61overrides i = "schedules" % i % "overrides"
src/Network/PagerDuty/REST/Services.hs+16−16
@@ -1,13 +1,13 @@
1−{-# LANGUAGE DataKinds #-}
1+{-# LANGUAGE DataKinds #-}
2−{-# LANGUAGE ExtendedDefaultRules #-}
2+{-# LANGUAGE ExtendedDefaultRules #-}
3−{-# LANGUAGE OverloadedStrings #-}
3+{-# LANGUAGE OverloadedStrings #-}
4−{-# LANGUAGE TemplateHaskell #-}
4+{-# LANGUAGE TemplateHaskell #-}
5−{-# LANGUAGE TypeFamilies #-}
5+{-# LANGUAGE TypeFamilies #-}
6
6
7{-# OPTIONS_GHC -fno-warn-type-defaults #-}
7{-# OPTIONS_GHC -fno-warn-type-defaults #-}
8
8
9-- Module : Network.PagerDuty.REST.Services
9-- Module : Network.PagerDuty.REST.Services
10−-- Copyright : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
10+-- Copyright : (c) 2013-2015 Brendan Hay <brendan.g.hay@gmail.com>
11-- License : This Source Code Form is subject to the terms of
11-- License : This Source Code Form is subject to the terms of
12-- the Mozilla Public License, v. 2.0.
12-- the Mozilla Public License, v. 2.0.
13-- A copy of the MPL can be found in the LICENSE file or
13-- A copy of the MPL can be found in the LICENSE file or
@@ -106,14 +106,14 @@ module Network.PagerDuty.REST.Services
106 , svcSeverityFilter
106 , svcSeverityFilter
107 ) where
107 ) where
108
108
109−import Control.Lens
109+import Control.Lens hiding (Empty)
110−import Data.Aeson.Lens
110+import Data.Aeson.Lens
111−import Data.Text (Text)
111+import Data.Text (Text)
112−import Data.Time
112+import Data.Time
113−import Network.HTTP.Types
113+import Network.HTTP.Types
114+import Network.PagerDuty.Internal.TH
115+import Network.PagerDuty.Internal.Types
114−import Network.PagerDuty.REST.Services.EmailFilters
116+import Network.PagerDuty.REST.Services.EmailFilters
115−import Network.PagerDuty.Internal.TH
116−import Network.PagerDuty.Internal.Types
117
117
118default (Path)
118default (Path)
119
119
@@ -483,7 +483,7 @@ enableService r i =
483
483
484-- | A version of 'enableService' which uses HTTP Basic authentication and
484-- | A version of 'enableService' which uses HTTP Basic authentication and
485-- doesn't require a 'RequesterId'.
485-- doesn't require a 'RequesterId'.
486−enableServiceBasic :: ServiceId -> Request Empty Basic Empty
486+enableServiceBasic :: ServiceId -> Request Empty 'Basic Empty
487enableServiceBasic i = empty & meth .~ PUT & path .~ services % i % "enable"
487enableServiceBasic i = empty & meth .~ PUT & path .~ services % i % "enable"
488
488
489-- | Disable a service. Once a service is disabled, it will not be able to
489-- | Disable a service. Once a service is disabled, it will not be able to
@@ -498,7 +498,7 @@ disableService r i =
498
498
499-- | A version of 'disableService' which uses HTTP Basic authentication and
499-- | A version of 'disableService' which uses HTTP Basic authentication and
500-- doesn't require a 'RequesterId'.
500-- doesn't require a 'RequesterId'.
501−disableServiceBasic :: ServiceId -> Request Empty Basic Empty
501+disableServiceBasic :: ServiceId -> Request Empty 'Basic Empty
502disableServiceBasic i = empty & meth .~ PUT & path .~ services % i % "disable"
502disableServiceBasic i = empty & meth .~ PUT & path .~ services % i % "disable"
503
503
504-- | Regenerate a new service key for an existing service.
504-- | Regenerate a new service key for an existing service.
src/Network/PagerDuty/REST/Services/EmailFilters.hs+14−14
@@ -1,11 +1,11 @@
1−{-# LANGUAGE ExtendedDefaultRules #-}
1+{-# LANGUAGE ExtendedDefaultRules #-}
2−{-# LANGUAGE OverloadedStrings #-}
2+{-# LANGUAGE OverloadedStrings #-}
3−{-# LANGUAGE TemplateHaskell #-}
3+{-# LANGUAGE TemplateHaskell #-}
4
4
5{-# OPTIONS_GHC -fno-warn-type-defaults #-}
5{-# OPTIONS_GHC -fno-warn-type-defaults #-}
6
6
7-- Module : Network.PagerDuty.REST.Services.EmailFilters
7-- Module : Network.PagerDuty.REST.Services.EmailFilters
8−-- Copyright : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
8+-- Copyright : (c) 2013-2015 Brendan Hay <brendan.g.hay@gmail.com>
9-- License : This Source Code Form is subject to the terms of
9-- License : This Source Code Form is subject to the terms of
10-- the Mozilla Public License, v. 2.0.
10-- the Mozilla Public License, v. 2.0.
11-- A copy of the MPL can be found in the LICENSE file or
11-- A copy of the MPL can be found in the LICENSE file or
@@ -39,15 +39,15 @@ module Network.PagerDuty.REST.Services.EmailFilters
39 , efId
39 , efId
40 ) where
40 ) where
41
41
42−import Control.Applicative hiding (empty)
42+import Control.Applicative hiding (empty)
43−import Control.Lens hiding ((.=))
43+import Control.Lens hiding ((.=))
44−import Data.Aeson
44+import Data.Aeson
45−import Data.Default.Class
45+import Data.Default.Class
46−import Data.Monoid
46+import Data.Monoid
47−import Data.Text (Text)
47+import Data.Text (Text)
48−import Network.HTTP.Types
48+import Network.HTTP.Types
49−import Network.PagerDuty.Internal.TH
49+import Network.PagerDuty.Internal.TH
50−import Network.PagerDuty.Internal.Types
50+import Network.PagerDuty.Internal.Types
51
51
52default (Path)
52default (Path)
53
53
@@ -65,7 +65,7 @@ deriveNullaryWith hyphenated ''MatchMode
65-- FIXME: Tighten up this type! Make the regex required for match/no-match and
65-- FIXME: Tighten up this type! Make the regex required for match/no-match and
66-- encode the conditional invariants.
66-- encode the conditional invariants.
67data EmailFilterInfo = EmailFilterInfo
67data EmailFilterInfo = EmailFilterInfo
68− { _efSubjectMode' :: Maybe MatchMode
68+ { _efSubjectMode' :: Maybe MatchMode
69 , _efSubjectRegex' :: Maybe Text
69 , _efSubjectRegex' :: Maybe Text
70 , _efBodyMode' :: Maybe MatchMode
70 , _efBodyMode' :: Maybe MatchMode
71 , _efBodyRegex' :: Maybe Text
71 , _efBodyRegex' :: Maybe Text
src/Network/PagerDuty/REST/Users.hs+17−17
@@ -1,13 +1,13 @@
1−{-# LANGUAGE DataKinds #-}
1+{-# LANGUAGE DataKinds #-}
2−{-# LANGUAGE ExtendedDefaultRules #-}
2+{-# LANGUAGE ExtendedDefaultRules #-}
3−{-# LANGUAGE OverloadedStrings #-}
3+{-# LANGUAGE OverloadedStrings #-}
4−{-# LANGUAGE TemplateHaskell #-}
4+{-# LANGUAGE TemplateHaskell #-}
5−{-# LANGUAGE TypeFamilies #-}
5+{-# LANGUAGE TypeFamilies #-}
6
6
7{-# OPTIONS_GHC -fno-warn-type-defaults #-}
7{-# OPTIONS_GHC -fno-warn-type-defaults #-}
8
8
9-- Module : Network.PagerDuty.REST.Users
9-- Module : Network.PagerDuty.REST.Users
10−-- Copyright : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
10+-- Copyright : (c) 2013-2015 Brendan Hay <brendan.g.hay@gmail.com>
11-- License : This Source Code Form is subject to the terms of
11-- License : This Source Code Form is subject to the terms of
12-- the Mozilla Public License, v. 2.0.
12-- the Mozilla Public License, v. 2.0.
13-- A copy of the MPL can be found in the LICENSE file or
13-- A copy of the MPL can be found in the LICENSE file or
@@ -81,16 +81,16 @@ module Network.PagerDuty.REST.Users
81 , uJobTitle
81 , uJobTitle
82 ) where
82 ) where
83
83
84−import Control.Applicative hiding (empty)
84+import Control.Applicative hiding (empty)
85−import Control.Lens hiding ((.=))
85+import Control.Lens hiding (Empty, (.=))
86−import Data.Aeson
86+import Data.Aeson
87−import Data.Default.Class
87+import Data.Default.Class
88−import Data.Monoid
88+import Data.Monoid
89−import Data.Text (Text)
89+import Data.Text (Text)
90−import Data.Time
90+import Data.Time
91−import Network.HTTP.Types
91+import Network.HTTP.Types
92−import Network.PagerDuty.Internal.TH
92+import Network.PagerDuty.Internal.TH
93−import Network.PagerDuty.Internal.Types
93+import Network.PagerDuty.Internal.Types
94
94
95default (Path)
95default (Path)
96
96
@@ -315,7 +315,7 @@ createUser r n e = auth (createUserBasic n e) & query .~ [("requester_id", r)]
315-- doesn't require a 'RequesterId'.
315-- doesn't require a 'RequesterId'.
316createUserBasic :: Text -- ^ 'cuName'
316createUserBasic :: Text -- ^ 'cuName'
317 -> Address -- ^ 'cuEmail'
317 -> Address -- ^ 'cuEmail'
318− -> Request CreateUser Basic User
318+ -> Request CreateUser 'Basic User
319createUserBasic n e =
319createUserBasic n e =
320 mk CreateUser
320 mk CreateUser
321 { _cuName' = n
321 { _cuName' = n
src/Network/PagerDuty/REST/Users/ContactMethods.hs+10−10
@@ -1,11 +1,11 @@
1−{-# LANGUAGE ExtendedDefaultRules #-}
1+{-# LANGUAGE ExtendedDefaultRules #-}
2−{-# LANGUAGE OverloadedStrings #-}
2+{-# LANGUAGE OverloadedStrings #-}
3−{-# LANGUAGE TemplateHaskell #-}
3+{-# LANGUAGE TemplateHaskell #-}
4
4
5{-# OPTIONS_GHC -fno-warn-type-defaults #-}
5{-# OPTIONS_GHC -fno-warn-type-defaults #-}
6
6
7-- Module : Network.PagerDuty.REST.Users.ContactMethods
7-- Module : Network.PagerDuty.REST.Users.ContactMethods
8−-- Copyright : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
8+-- Copyright : (c) 2013-2015 Brendan Hay <brendan.g.hay@gmail.com>
9-- License : This Source Code Form is subject to the terms of
9-- License : This Source Code Form is subject to the terms of
10-- the Mozilla Public License, v. 2.0.
10-- the Mozilla Public License, v. 2.0.
11-- A copy of the MPL can be found in the LICENSE file or
11-- A copy of the MPL can be found in the LICENSE file or
@@ -56,12 +56,12 @@ module Network.PagerDuty.REST.Users.ContactMethods
56 , Contact
56 , Contact
57 ) where
57 ) where
58
58
59−import Control.Lens
59+import Control.Lens
60−import Data.Aeson.Lens
60+import Data.Aeson.Lens
61−import Data.Text (Text)
61+import Data.Text (Text)
62−import Network.HTTP.Types
62+import Network.HTTP.Types
63−import Network.PagerDuty.Internal.TH
63+import Network.PagerDuty.Internal.TH
64−import Network.PagerDuty.Internal.Types
64+import Network.PagerDuty.Internal.Types
65
65
66default (Path)
66default (Path)
67
67
src/Network/PagerDuty/REST/Users/NotificationRules.hs+10−10
@@ -1,11 +1,11 @@
1−{-# LANGUAGE ExtendedDefaultRules #-}
1+{-# LANGUAGE ExtendedDefaultRules #-}
2−{-# LANGUAGE OverloadedStrings #-}
2+{-# LANGUAGE OverloadedStrings #-}
3−{-# LANGUAGE TemplateHaskell #-}
3+{-# LANGUAGE TemplateHaskell #-}
4
4
5{-# OPTIONS_GHC -fno-warn-type-defaults #-}
5{-# OPTIONS_GHC -fno-warn-type-defaults #-}
6
6
7-- Module : Network.PagerDuty.REST.Users.NotificationRules
7-- Module : Network.PagerDuty.REST.Users.NotificationRules
8−-- Copyright : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
8+-- Copyright : (c) 2013-2015 Brendan Hay <brendan.g.hay@gmail.com>
9-- License : This Source Code Form is subject to the terms of
9-- License : This Source Code Form is subject to the terms of
10-- the Mozilla Public License, v. 2.0.
10-- the Mozilla Public License, v. 2.0.
11-- A copy of the MPL can be found in the LICENSE file or
11-- A copy of the MPL can be found in the LICENSE file or
@@ -51,12 +51,12 @@ module Network.PagerDuty.REST.Users.NotificationRules
51 , rContactMethod
51 , rContactMethod
52 ) where
52 ) where
53
53
54−import Control.Lens
54+import Control.Lens
55−import Data.Aeson.Lens
55+import Data.Aeson.Lens
56−import Network.HTTP.Types
56+import Network.HTTP.Types
57+import Network.PagerDuty.Internal.TH
58+import Network.PagerDuty.Internal.Types
57−import Network.PagerDuty.REST.Users.ContactMethods
59+import Network.PagerDuty.REST.Users.ContactMethods
58−import Network.PagerDuty.Internal.TH
59−import Network.PagerDuty.Internal.Types
60
60
61default (Path)
61default (Path)
62
62
src/Network/PagerDuty/REST/Webhooks.hs+4−3
@@ -3,7 +3,7 @@
3{-# LANGUAGE TemplateHaskell #-}
3{-# LANGUAGE TemplateHaskell #-}
4
4
5-- Module : Network.PagerDuty.REST.Webhooks
5-- Module : Network.PagerDuty.REST.Webhooks
6−-- Copyright : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
6+-- Copyright : (c) 2013-2015 Brendan Hay <brendan.g.hay@gmail.com>
7-- License : This Source Code Form is subject to the terms of
7-- License : This Source Code Form is subject to the terms of
8-- the Mozilla Public License, v. 2.0.
8-- the Mozilla Public License, v. 2.0.
9-- A copy of the MPL can be found in the LICENSE file or
9-- A copy of the MPL can be found in the LICENSE file or
@@ -35,13 +35,14 @@ module Network.PagerDuty.REST.Webhooks
35import Control.Applicative hiding (empty)
35import Control.Applicative hiding (empty)
36import Control.Lens
36import Control.Lens
37import Data.Aeson
37import Data.Aeson
38−import Data.ByteString.Conversion (ToByteString(..), toByteString')
38+import Data.ByteString.Conversion (ToByteString (..),
39+ toByteString')
39import Data.Text (Text)
40import Data.Text (Text)
40import qualified Data.Text.Encoding as Text
41import qualified Data.Text.Encoding as Text
41import Data.Time
42import Data.Time
42−import Network.PagerDuty.REST.Incidents
43import Network.PagerDuty.Internal.TH
43import Network.PagerDuty.Internal.TH
44import Network.PagerDuty.Internal.Types
44import Network.PagerDuty.Internal.Types
45+import Network.PagerDuty.REST.Incidents
45
46
46data WebhookType
47data WebhookType
47 = WTrigger
48 = WTrigger
src/Network/PagerDuty/Types.hsnew file+93
@@ -0,0 +1,93 @@
1+-- Module : Network.PagerDuty.Types
2+-- Copyright : (c) 2013-2015 Brendan Hay <brendan.g.hay@gmail.com>
3+-- License : This Source Code Form is subject to the terms of
4+-- the Mozilla Public License, v. 2.0.
5+-- A copy of the MPL can be found in the LICENSE file or
6+-- you can obtain it at http://mozilla.org/MPL/2.0/.
7+-- Maintainer : Brendan Hay <brendan.g.hay@gmail.com>
8+-- Stability : experimental
9+-- Portability : non-portable (GHC extensions)
10+
11+module Network.PagerDuty.Types
12+ (
13+ -- * Configuration
14+ -- ** Environment
15+ Env
16+ , envDomain
17+ , envAuth
18+ , envManager
19+ , envLogger
20+
21+ -- ** Logging
22+ , Logger (..)
23+ , debug
24+
25+ -- * Types
26+ -- ** Requests
27+ , Paginate
28+ , Request
29+
30+ -- ** Errors
31+ , Error
32+ , _Internal
33+ , _Integration
34+ , _REST
35+ -- *** Messages
36+ , HasMessage (..)
37+ -- *** Fields
38+ , HasErrors (..)
39+ -- *** Integration
40+ , IntegrationError
41+ , status
42+ -- *** REST
43+ , RESTError
44+ , Code
45+ , code
46+ , description
47+
48+ -- ** Authentication
49+ , Security (..)
50+ , Auth (..)
51+
52+ -- ** Keys
53+ , Key
54+ , mkKey
55+ -- *** Aliases
56+ , ServiceKey
57+ , IncidentKey
58+
59+ -- ** Identifiers
60+ , Id
61+ , mkId
62+ -- *** Aliases
63+ , AlertId
64+ , ContactId
65+ , EmailFilterId
66+ , EscalationPolicyId
67+ , EscalationRuleId
68+ , IncidentId
69+ , LogEntryId
70+ , NoteId
71+ , NotificationRuleId
72+ , OverrideId
73+ , RequesterId
74+ , ScheduleId
75+ , ServiceId
76+ , UserId
77+ , VendorId
78+ , WebhookId
79+ , WindowId
80+
81+ -- ** SubDomain
82+ , SubDomain
83+ , mkSubDomain
84+
85+ -- ** Address
86+ , Address
87+ , mkAddress
88+
89+ -- ** Miscellaneous
90+ , Empty (..)
91+ ) where
92+
93+import Network.PagerDuty.Internal.Types
stack.yamlnew file+7
@@ -0,0 +1,7 @@
1+resolver: lts-19.23
2+
3+packages:
4+- .
5+
6+nix:
7+ packages: [zlib]