on develop help sign in
Adding preliminary generator
commitd175b115608410a41f6f0bd17a0dcd854944cf06 authorBrendan Hay <brendan.g.hay@gmail.com> dateTue 22 Sep 2015, 13:09 (11 years ago) parent04bbc07
17 files changed+1261
gen/.gitignore+40 gen/LICENSE+373 gen/Makefile+56 gen/gozen-gen.cabal+43 gen/src/Gen/Formatting.hs+29 gen/src/Gen/IO.hs+98 gen/src/Gen/Types.hs+76 gen/src/Main.hs+166 gen/stack.yaml+4 gen/static/LICENSE+373 gen/static/Makefile+1 gen/static/Setup.hs+2 gen/template/cabal.ede gen/template/operation.ede gen/template/readme.ede gen/template/toc.ede gen/template/types.ede
gen/.gitignorenew file+40
@@ -0,0 +1,40 @@
1+# Haskell
2+.conf
3+*.o
4+*.hi
5+*.chi
6+*.chs.h
7+*.imports
8+cabal.sandbox.config
9+cabal.config
10+
11+# Dirs
12+.cabal-sandbox
13+dist
14+vendor
15+.vagrant.d
16+.stack-work
17+bin
18+
19+# CTAGS
20+TAGS
21+tags
22+
23+# Emacs/Vim
24+*~
25+*#
26+.#*
27+\#*#
28+.*.sw[a-z]
29+*.un~
30+*.org
31+.projectile
32+
33+# OSX
34+.DS_Store
35+
36+# Certificates
37+*.pem
38+
39+# Go
40+*.go
gen/LICENSEnew file+373
@@ -0,0 +1,373 @@
1+Mozilla Public License Version 2.0
2+==================================
3+
4+1. Definitions
5+--------------
6+
7+1.1. "Contributor"
8+ means each individual or legal entity that creates, contributes to
9+ the creation of, or owns Covered Software.
10+
11+1.2. "Contributor Version"
12+ means the combination of the Contributions of others (if any) used
13+ by a Contributor and that particular Contributor's Contribution.
14+
15+1.3. "Contribution"
16+ means Covered Software of a particular Contributor.
17+
18+1.4. "Covered Software"
19+ means Source Code Form to which the initial Contributor has attached
20+ the notice in Exhibit A, the Executable Form of such Source Code
21+ Form, and Modifications of such Source Code Form, in each case
22+ including portions thereof.
23+
24+1.5. "Incompatible With Secondary Licenses"
25+ means
26+
27+ (a) that the initial Contributor has attached the notice described
28+ in Exhibit B to the Covered Software; or
29+
30+ (b) that the Covered Software was made available under the terms of
31+ version 1.1 or earlier of the License, but not also under the
32+ terms of a Secondary License.
33+
34+1.6. "Executable Form"
35+ means any form of the work other than Source Code Form.
36+
37+1.7. "Larger Work"
38+ means a work that combines Covered Software with other material, in
39+ a separate file or files, that is not Covered Software.
40+
41+1.8. "License"
42+ means this document.
43+
44+1.9. "Licensable"
45+ means having the right to grant, to the maximum extent possible,
46+ whether at the time of the initial grant or subsequently, any and
47+ all of the rights conveyed by this License.
48+
49+1.10. "Modifications"
50+ means any of the following:
51+
52+ (a) any file in Source Code Form that results from an addition to,
53+ deletion from, or modification of the contents of Covered
54+ Software; or
55+
56+ (b) any new file in Source Code Form that contains any Covered
57+ Software.
58+
59+1.11. "Patent Claims" of a Contributor
60+ means any patent claim(s), including without limitation, method,
61+ process, and apparatus claims, in any patent Licensable by such
62+ Contributor that would be infringed, but for the grant of the
63+ License, by the making, using, selling, offering for sale, having
64+ made, import, or transfer of either its Contributions or its
65+ Contributor Version.
66+
67+1.12. "Secondary License"
68+ means either the GNU General Public License, Version 2.0, the GNU
69+ Lesser General Public License, Version 2.1, the GNU Affero General
70+ Public License, Version 3.0, or any later versions of those
71+ licenses.
72+
73+1.13. "Source Code Form"
74+ means the form of the work preferred for making modifications.
75+
76+1.14. "You" (or "Your")
77+ means an individual or a legal entity exercising rights under this
78+ License. For legal entities, "You" includes any entity that
79+ controls, is controlled by, or is under common control with You. For
80+ purposes of this definition, "control" means (a) the power, direct
81+ or indirect, to cause the direction or management of such entity,
82+ whether by contract or otherwise, or (b) ownership of more than
83+ fifty percent (50%) of the outstanding shares or beneficial
84+ ownership of such entity.
85+
86+2. License Grants and Conditions
87+--------------------------------
88+
89+2.1. Grants
90+
91+Each Contributor hereby grants You a world-wide, royalty-free,
92+non-exclusive license:
93+
94+(a) under intellectual property rights (other than patent or trademark)
95+ Licensable by such Contributor to use, reproduce, make available,
96+ modify, display, perform, distribute, and otherwise exploit its
97+ Contributions, either on an unmodified basis, with Modifications, or
98+ as part of a Larger Work; and
99+
100+(b) under Patent Claims of such Contributor to make, use, sell, offer
101+ for sale, have made, import, and otherwise transfer either its
102+ Contributions or its Contributor Version.
103+
104+2.2. Effective Date
105+
106+The licenses granted in Section 2.1 with respect to any Contribution
107+become effective for each Contribution on the date the Contributor first
108+distributes such Contribution.
109+
110+2.3. Limitations on Grant Scope
111+
112+The licenses granted in this Section 2 are the only rights granted under
113+this License. No additional rights or licenses will be implied from the
114+distribution or licensing of Covered Software under this License.
115+Notwithstanding Section 2.1(b) above, no patent license is granted by a
116+Contributor:
117+
118+(a) for any code that a Contributor has removed from Covered Software;
119+ or
120+
121+(b) for infringements caused by: (i) Your and any other third party's
122+ modifications of Covered Software, or (ii) the combination of its
123+ Contributions with other software (except as part of its Contributor
124+ Version); or
125+
126+(c) under Patent Claims infringed by Covered Software in the absence of
127+ its Contributions.
128+
129+This License does not grant any rights in the trademarks, service marks,
130+or logos of any Contributor (except as may be necessary to comply with
131+the notice requirements in Section 3.4).
132+
133+2.4. Subsequent Licenses
134+
135+No Contributor makes additional grants as a result of Your choice to
136+distribute the Covered Software under a subsequent version of this
137+License (see Section 10.2) or under the terms of a Secondary License (if
138+permitted under the terms of Section 3.3).
139+
140+2.5. Representation
141+
142+Each Contributor represents that the Contributor believes its
143+Contributions are its original creation(s) or it has sufficient rights
144+to grant the rights to its Contributions conveyed by this License.
145+
146+2.6. Fair Use
147+
148+This License is not intended to limit any rights You have under
149+applicable copyright doctrines of fair use, fair dealing, or other
150+equivalents.
151+
152+2.7. Conditions
153+
154+Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
155+in Section 2.1.
156+
157+3. Responsibilities
158+-------------------
159+
160+3.1. Distribution of Source Form
161+
162+All distribution of Covered Software in Source Code Form, including any
163+Modifications that You create or to which You contribute, must be under
164+the terms of this License. You must inform recipients that the Source
165+Code Form of the Covered Software is governed by the terms of this
166+License, and how they can obtain a copy of this License. You may not
167+attempt to alter or restrict the recipients' rights in the Source Code
168+Form.
169+
170+3.2. Distribution of Executable Form
171+
172+If You distribute Covered Software in Executable Form then:
173+
174+(a) such Covered Software must also be made available in Source Code
175+ Form, as described in Section 3.1, and You must inform recipients of
176+ the Executable Form how they can obtain a copy of such Source Code
177+ Form by reasonable means in a timely manner, at a charge no more
178+ than the cost of distribution to the recipient; and
179+
180+(b) You may distribute such Executable Form under the terms of this
181+ License, or sublicense it under different terms, provided that the
182+ license for the Executable Form does not attempt to limit or alter
183+ the recipients' rights in the Source Code Form under this License.
184+
185+3.3. Distribution of a Larger Work
186+
187+You may create and distribute a Larger Work under terms of Your choice,
188+provided that You also comply with the requirements of this License for
189+the Covered Software. If the Larger Work is a combination of Covered
190+Software with a work governed by one or more Secondary Licenses, and the
191+Covered Software is not Incompatible With Secondary Licenses, this
192+License permits You to additionally distribute such Covered Software
193+under the terms of such Secondary License(s), so that the recipient of
194+the Larger Work may, at their option, further distribute the Covered
195+Software under the terms of either this License or such Secondary
196+License(s).
197+
198+3.4. Notices
199+
200+You may not remove or alter the substance of any license notices
201+(including copyright notices, patent notices, disclaimers of warranty,
202+or limitations of liability) contained within the Source Code Form of
203+the Covered Software, except that You may alter any license notices to
204+the extent required to remedy known factual inaccuracies.
205+
206+3.5. Application of Additional Terms
207+
208+You may choose to offer, and to charge a fee for, warranty, support,
209+indemnity or liability obligations to one or more recipients of Covered
210+Software. However, You may do so only on Your own behalf, and not on
211+behalf of any Contributor. You must make it absolutely clear that any
212+such warranty, support, indemnity, or liability obligation is offered by
213+You alone, and You hereby agree to indemnify every Contributor for any
214+liability incurred by such Contributor as a result of warranty, support,
215+indemnity or liability terms You offer. You may include additional
216+disclaimers of warranty and limitations of liability specific to any
217+jurisdiction.
218+
219+4. Inability to Comply Due to Statute or Regulation
220+---------------------------------------------------
221+
222+If it is impossible for You to comply with any of the terms of this
223+License with respect to some or all of the Covered Software due to
224+statute, judicial order, or regulation then You must: (a) comply with
225+the terms of this License to the maximum extent possible; and (b)
226+describe the limitations and the code they affect. Such description must
227+be placed in a text file included with all distributions of the Covered
228+Software under this License. Except to the extent prohibited by statute
229+or regulation, such description must be sufficiently detailed for a
230+recipient of ordinary skill to be able to understand it.
231+
232+5. Termination
233+--------------
234+
235+5.1. The rights granted under this License will terminate automatically
236+if You fail to comply with any of its terms. However, if You become
237+compliant, then the rights granted under this License from a particular
238+Contributor are reinstated (a) provisionally, unless and until such
239+Contributor explicitly and finally terminates Your grants, and (b) on an
240+ongoing basis, if such Contributor fails to notify You of the
241+non-compliance by some reasonable means prior to 60 days after You have
242+come back into compliance. Moreover, Your grants from a particular
243+Contributor are reinstated on an ongoing basis if such Contributor
244+notifies You of the non-compliance by some reasonable means, this is the
245+first time You have received notice of non-compliance with this License
246+from such Contributor, and You become compliant prior to 30 days after
247+Your receipt of the notice.
248+
249+5.2. If You initiate litigation against any entity by asserting a patent
250+infringement claim (excluding declaratory judgment actions,
251+counter-claims, and cross-claims) alleging that a Contributor Version
252+directly or indirectly infringes any patent, then the rights granted to
253+You by any and all Contributors for the Covered Software under Section
254+2.1 of this License shall terminate.
255+
256+5.3. In the event of termination under Sections 5.1 or 5.2 above, all
257+end user license agreements (excluding distributors and resellers) which
258+have been validly granted by You or Your distributors under this License
259+prior to termination shall survive termination.
260+
261+************************************************************************
262+* *
263+* 6. Disclaimer of Warranty *
264+* ------------------------- *
265+* *
266+* Covered Software is provided under this License on an "as is" *
267+* basis, without warranty of any kind, either expressed, implied, or *
268+* statutory, including, without limitation, warranties that the *
269+* Covered Software is free of defects, merchantable, fit for a *
270+* particular purpose or non-infringing. The entire risk as to the *
271+* quality and performance of the Covered Software is with You. *
272+* Should any Covered Software prove defective in any respect, You *
273+* (not any Contributor) assume the cost of any necessary servicing, *
274+* repair, or correction. This disclaimer of warranty constitutes an *
275+* essential part of this License. No use of any Covered Software is *
276+* authorized under this License except under this disclaimer. *
277+* *
278+************************************************************************
279+
280+************************************************************************
281+* *
282+* 7. Limitation of Liability *
283+* -------------------------- *
284+* *
285+* Under no circumstances and under no legal theory, whether tort *
286+* (including negligence), contract, or otherwise, shall any *
287+* Contributor, or anyone who distributes Covered Software as *
288+* permitted above, be liable to You for any direct, indirect, *
289+* special, incidental, or consequential damages of any character *
290+* including, without limitation, damages for lost profits, loss of *
291+* goodwill, work stoppage, computer failure or malfunction, or any *
292+* and all other commercial damages or losses, even if such party *
293+* shall have been informed of the possibility of such damages. This *
294+* limitation of liability shall not apply to liability for death or *
295+* personal injury resulting from such party's negligence to the *
296+* extent applicable law prohibits such limitation. Some *
297+* jurisdictions do not allow the exclusion or limitation of *
298+* incidental or consequential damages, so this exclusion and *
299+* limitation may not apply to You. *
300+* *
301+************************************************************************
302+
303+8. Litigation
304+-------------
305+
306+Any litigation relating to this License may be brought only in the
307+courts of a jurisdiction where the defendant maintains its principal
308+place of business and such litigation shall be governed by laws of that
309+jurisdiction, without reference to its conflict-of-law provisions.
310+Nothing in this Section shall prevent a party's ability to bring
311+cross-claims or counter-claims.
312+
313+9. Miscellaneous
314+----------------
315+
316+This License represents the complete agreement concerning the subject
317+matter hereof. If any provision of this License is held to be
318+unenforceable, such provision shall be reformed only to the extent
319+necessary to make it enforceable. Any law or regulation which provides
320+that the language of a contract shall be construed against the drafter
321+shall not be used to construe this License against a Contributor.
322+
323+10. Versions of the License
324+---------------------------
325+
326+10.1. New Versions
327+
328+Mozilla Foundation is the license steward. Except as provided in Section
329+10.3, no one other than the license steward has the right to modify or
330+publish new versions of this License. Each version will be given a
331+distinguishing version number.
332+
333+10.2. Effect of New Versions
334+
335+You may distribute the Covered Software under the terms of the version
336+of the License under which You originally received the Covered Software,
337+or under the terms of any subsequent version published by the license
338+steward.
339+
340+10.3. Modified Versions
341+
342+If you create software not governed by this License, and you want to
343+create a new license for such software, you may create and use a
344+modified version of this License if you rename the license and remove
345+any references to the name of the license steward (except to note that
346+such modified license differs from this License).
347+
348+10.4. Distributing Source Code Form that is Incompatible With Secondary
349+Licenses
350+
351+If You choose to distribute Source Code Form that is Incompatible With
352+Secondary Licenses under the terms of this version of the License, the
353+notice described in Exhibit B of this License must be attached.
354+
355+Exhibit A - Source Code Form License Notice
356+-------------------------------------------
357+
358+ This Source Code Form is subject to the terms of the Mozilla Public
359+ License, v. 2.0. If a copy of the MPL was not distributed with this
360+ file, You can obtain one at http://mozilla.org/MPL/2.0/.
361+
362+If it is not possible or desirable to put the notice in a particular
363+file, then You may include the notice in a location (such as a LICENSE
364+file in a relevant directory) where a recipient would be likely to look
365+for such a notice.
366+
367+You may add additional accurate notices of copyright ownership.
368+
369+Exhibit B - "Incompatible With Secondary Licenses" Notice
370+---------------------------------------------------------
371+
372+ This Source Code Form is "Incompatible With Secondary Licenses", as
373+ defined by the Mozilla Public License, v. 2.0.
gen/Makefilenew file+56
@@ -0,0 +1,56 @@
1+SHELL := /usr/bin/env bash
2+TOP := ..
3+BIN := bin
4+MODEL_DIR := model
5+OUT_DIR := ..
6+
7+define version =
8+$(shell sed -n 's/^version: *\([0-9]*\.[0-9]*\.[0-9]\).*$$/\1/p' $(1))
9+endef
10+
11+VERSION = $(shell sed -n 's/^version: *\(.*\)$$/\1/p' gozen-gen.cabal)
12+CORE_VERSION = $(call version,$(TOP)/core/gozen-core.cabal)
13+CLIENT_VERSION = $(call version,$(TOP)/gen/gozen-gen.cabal)
14+
15+MODELS ?= $(shell find $(MODEL_DIR) -type f -name '*.json' | sort)
16+
17+.PHONY: $(BIN)/gozen-gen gen format
18+
19+release: gen # format
20+
21+gen: $(BIN)/gozen-gen $(MODEL_DIR)
22+ $(BIN)/gozen-gen \
23+ --out=$(OUT_DIR) \
24+ --library-version=$(VERSION) \
25+ --client-version=$(CLIENT_VERSION) \
26+ --core-version=$(CORE_VERSION) \
27+ --templates=template \
28+ --static=static \
29+ $(addprefix --model=,$(MODELS))
30+
31+format:
32+ @echo -e '\nFormatting...'
33+ @find $(wildcard $(OUT_DIR)/gozen-*/gen) $(wildcard $(OUT_DIR)/test/Test/AWS/Gen) \
34+ -type f \
35+ -name '*.hs' \
36+ -printf ' -> %p\n' \
37+ -exec stylish-haskell -i {} \;
38+
39+$(BIN)/gozen-gen: $(BIN)
40+ stack build gozen-gen --copy-bins --local-bin-path $(BIN)
41+
42+$(BIN):
43+ mkdir $@
44+
45+clean:
46+ stack clean
47+ rm -rf $(MODEL_DIR)
48+
49+full-clean: clean
50+ rm -rf vendor model
51+
52+$(MODEL_DIR): vendor/google-api-go-client
53+ @./script/copy-models $< $@
54+
55+vendor/google-api-go-client:
56+ git clone git@github.com:google/google-api-go-client $@
gen/gozen-gen.cabalnew file+43
@@ -0,0 +1,43 @@
1+name: gozen-gen
2+version: 0.0.1
3+synopsis: Gozen Code Generator
4+homepage: https://github.com/brendanhay/gozen
5+license: OtherLicense
6+license-file: LICENSE
7+author: Brendan Hay
8+maintainer: Brendan Hay <brendan.g.hay@gmail.com>
9+copyright: Copyright (c) 2013-2015 Brendan Hay
10+category: Network, Google, Cloud, Distributed Computing
11+build-type: Simple
12+extra-source-files: README.md
13+cabal-version: >= 1.10
14+
15+description:
16+ Compiler and generator for Gozen related Google SDKs
17+
18+executable gozen-gen
19+ default-language: Haskell2010
20+ hs-source-dirs: src
21+ main-is: Main.hs
22+
23+ other-modules:
24+ Gen.IO
25+ , Gen.Types
26+
27+ ghc-options: -Wall -threaded
28+
29+ build-depends:
30+ aeson
31+ , base == 4.8.*
32+ , bytestring
33+ , ede
34+ , lens
35+ , optparse-applicative
36+ , system-fileio
37+ , system-filepath
38+ , text
39+ , mtl
40+ , errors
41+ , formatting
42+ , unordered-containers
43+ , attoparsec
gen/src/Gen/Formatting.hsnew file+29
@@ -0,0 +1,29 @@
1+{-# LANGUAGE OverloadedStrings #-}
2+
3+-- Module : Gen.Formatting
4+-- Copyright : (c) 2015 Brendan Hay
5+-- License : Mozilla Public License, v. 2.0.
6+-- Maintainer : Brendan Hay <brendan.g.hay@gmail.com>
7+-- Stability : provisional
8+-- Portability : non-portable (GHC extensions)
9+
10+module Gen.Formatting
11+ ( module Gen.Formatting
12+ , module Formatting
13+ , module Formatting.Time
14+ , runFormat
15+ ) where
16+
17+import Control.Monad.Except
18+import qualified Data.Text.Lazy as LText
19+import qualified Data.Text.Lazy.Builder as Build
20+import Formatting hiding (left, right)
21+import Formatting.Internal (runFormat)
22+import Formatting.Time hiding (fmt)
23+import Gen.Types
24+
25+path :: Format a (Path -> a)
26+path = later (Build.fromText . toTextIgnore)
27+
28+failure :: MonadError e m => Format LText.Text (a -> e) -> a -> m b
29+failure m = throwError . format m
gen/src/Gen/IO.hsnew file+98
@@ -0,0 +1,98 @@
1+{-# LANGUAGE FlexibleContexts #-}
2+{-# LANGUAGE OverloadedStrings #-}
3+{-# LANGUAGE TupleSections #-}
4+
5+-- Module : Gen.IO
6+-- Copyright : (c) 2015 Brendan Hay
7+-- License : Mozilla Public License, v. 2.0.
8+-- Maintainer : Brendan Hay <brendan.g.hay@gmail.com>
9+-- Stability : provisional
10+-- Portability : non-portable (GHC extensions)
11+
12+module Gen.IO where
13+
14+import Control.Error
15+import Control.Monad.Except
16+import Control.Monad.State
17+import Data.ByteString (ByteString)
18+import Data.Text (Text)
19+import qualified Data.Text as Text
20+import qualified Data.Text.Lazy as LText
21+import Data.Text.Lazy.Builder (toLazyText)
22+import qualified Data.Text.Lazy.IO as LText
23+import qualified Filesystem as FS
24+import Filesystem.Path.CurrentOS
25+import Gen.Formatting
26+import Gen.Types
27+import qualified Text.EDE as EDE
28+
29+run :: ExceptT Error IO a -> IO a
30+run = runScript . fmapLT LText.unpack
31+
32+io :: MonadIO m => IO a -> ExceptT Error m a
33+io = fmapLT (LText.pack . show) . syncIO
34+
35+title :: MonadIO m => Format (ExceptT Error m ()) a -> a
36+title m = runFormat m (io . LText.putStrLn . toLazyText)
37+
38+say :: MonadIO m => Format (ExceptT Error m ()) a -> a
39+say = title . (" -> " %)
40+
41+done :: MonadIO m => ExceptT Error m ()
42+done = title ""
43+
44+isFile :: MonadIO m => Path -> ExceptT Error m Bool
45+isFile = io . FS.isFile
46+
47+-- listDir :: MonadIO m => Path -> ExceptT Error m [Path]
48+-- listDir = io . FS.listDirectory
49+
50+readBSFile :: MonadIO m => Path -> ExceptT Error m ByteString
51+readBSFile f = do
52+ p <- isFile f
53+ if p
54+ then say ("Reading " % path) f >> io (FS.readFile f)
55+ else failure ("Missing " % path) f
56+
57+-- writeLTFile :: MonadIO m => Path -> LText.Text -> ExceptT Error m ()
58+-- writeLTFile f t = do
59+-- say ("Writing " % path) f
60+-- io . FS.withFile f FS.WriteMode $ \h -> do
61+-- hSetEncoding h utf8
62+-- LText.hPutStr h t
63+
64+-- touchFile :: MonadIO m => Path -> ExceptT Error m ()
65+-- touchFile f = do
66+-- p <- isFile f
67+-- unless p $
68+-- writeLTFile f mempty
69+
70+-- createDir :: MonadIO m => Path -> ExceptT Error m ()
71+-- createDir d = do
72+-- p <- io (FS.isDirectory d)
73+-- unless p $ do
74+-- say ("Creating " % path) d
75+-- io (FS.createTree d)
76+
77+-- copyDir :: MonadIO m => Path -> Path -> ExceptT Error m ()
78+-- copyDir src dst = io (FS.listDirectory src >>= mapM_ copy)
79+-- where
80+-- copy f = do
81+-- let p = dst </> filename f
82+-- fprint (" -> Copying " % path % " to " % path % "\n") f (directory p)
83+-- FS.copyFile f p
84+
85+readTemplate :: MonadIO m
86+ => Path
87+ -> Path
88+ -> StateT (Map Text (EDE.Result EDE.Template)) (ExceptT Error m) EDE.Template
89+readTemplate d f = do
90+ let tmpl = d </> f
91+ lift (readBSFile tmpl)
92+ >>= EDE.parseWith EDE.defaultSyntax (load d) (toTextIgnore tmpl)
93+ >>= EDE.result (throwError . LText.pack . show) return
94+ where
95+ load p o k _ = lift (readBSFile x) >>= EDE.parseWith o (load (directory x)) k
96+ where
97+ x | Text.null k = fromText k
98+ | otherwise = p </> fromText k
gen/src/Gen/Types.hsnew file+76
@@ -0,0 +1,76 @@
1+{-# LANGUAGE DataKinds #-}
2+{-# LANGUAGE KindSignatures #-}
3+{-# LANGUAGE OverloadedStrings #-}
4+
5+-- Module : Gen.Types
6+-- Copyright : (c) 2015 Brendan Hay
7+-- License : Mozilla Public License, v. 2.0.
8+-- Maintainer : Brendan Hay <brendan.g.hay@gmail.com>
9+-- Stability : provisional
10+-- Portability : non-portable (GHC extensions)
11+
12+module Gen.Types where
13+
14+import qualified Data.Attoparsec.Text as A
15+import Data.Function (on)
16+import qualified Data.HashMap.Strict as Map
17+import Data.List (nub, sort)
18+import Data.Monoid
19+import Data.Text (Text)
20+import qualified Data.Text as Text
21+import qualified Data.Text.Lazy as LText
22+import qualified Filesystem.Path.CurrentOS as Path
23+import GHC.TypeLits
24+import Text.EDE (Template)
25+
26+type Map = Map.HashMap
27+type Error = LText.Text
28+type Path = Path.FilePath
29+
30+toTextIgnore :: Path -> Text
31+toTextIgnore = either id id . Path.toText
32+
33+data Templates = Templates
34+ { cabalTemplate :: Template
35+ , tocTemplate :: Template
36+ , readmeTemplate :: Template
37+ , operationTemplate :: Template
38+ , typesTemplate :: Template
39+ }
40+
41+newtype Version (v :: Symbol) = Version Text
42+ deriving (Eq, Show)
43+
44+type LibraryVer = Version "library"
45+type ClientVer = Version "client"
46+type CoreVer = Version "core"
47+
48+data Versions = Versions
49+ { _libraryVersion :: LibraryVer
50+ , _clientVersion :: ClientVer
51+ , _coreVersion :: CoreVer
52+ } deriving (Show)
53+
54+-- FIXME: need a more comprehensive 'vm_alpha' vs 'vm1.1' etc check.
55+data Spec = Spec
56+ { _specName :: Text
57+ , _specVersion :: Text
58+ , _specPath :: Path
59+ }
60+
61+instance Eq Spec where
62+ (==) = on (==) _specName
63+
64+instance Ord Spec where
65+ compare a b = on compare _specName a b <> on compare _specVersion a b
66+
67+specFromPath :: Path -> Spec
68+specFromPath x = Spec (n <> v) v x
69+ where
70+ n = Text.intercalate "/"
71+ . drop 1
72+ . dropWhile (/= "model")
73+ $ Text.split (== '/') p
74+
75+ p = toTextIgnore (Path.parent (Path.parent x))
76+ v = toTextIgnore (Path.dirname x)
gen/src/Main.hsnew file+166
@@ -0,0 +1,166 @@
1+{-# LANGUAGE LambdaCase #-}
2+{-# LANGUAGE MultiParamTypeClasses #-}
3+{-# LANGUAGE OverloadedStrings #-}
4+{-# LANGUAGE RankNTypes #-}
5+{-# LANGUAGE RecordWildCards #-}
6+{-# LANGUAGE TemplateHaskell #-}
7+
8+-- Module : Main
9+-- Copyright : (c) 2015 Brendan Hay
10+-- License : Mozilla Public License, v. 2.0.
11+-- Maintainer : Brendan Hay <brendan.g.hay@gmail.com>
12+-- Stability : provisional
13+-- Portability : non-portable (GHC extensions)
14+
15+module Main (main) where
16+
17+import Control.Lens
18+import Control.Monad.State
19+import Data.List (nub, sort)
20+import Data.String
21+import qualified Data.Text as Text
22+import qualified Filesystem as FS
23+import Filesystem.Path.CurrentOS
24+import Gen.Formatting
25+import Gen.IO
26+import Gen.Types
27+import Options.Applicative
28+
29+data Opt = Opt
30+ { _optOutput :: Path
31+ , _optModels :: [Path]
32+ , _optTemplates :: Path
33+ , _optStatic :: Path
34+ , _optVersions :: Versions
35+ } deriving (Show)
36+
37+makeLenses ''Opt
38+
39+parser :: Parser Opt
40+parser = Opt
41+ <$> option isPath
42+ ( long "out"
43+ <> metavar "DIR"
44+ <> help "Directory to place the generated library."
45+ )
46+
47+ <*> some (option isPath
48+ ( long "model"
49+ <> metavar "DIR"
50+ <> help "Directory for a service's botocore models."
51+ ))
52+
53+ <*> option isPath
54+ ( long "templates"
55+ <> metavar "DIR"
56+ <> help "Directory containing ED-E templates."
57+ )
58+
59+ <*> option isPath
60+ ( long "static"
61+ <> metavar "DIR"
62+ <> help "Directory containing static files for generated libraries."
63+ )
64+
65+ <*> (Versions
66+ <$> option version
67+ ( long "library-version"
68+ <> metavar "VER"
69+ <> help "Version of the library to generate."
70+ )
71+
72+ <*> option version
73+ ( long "client-version"
74+ <> metavar "VER"
75+ <> help "Client library version dependecy for examples."
76+ )
77+
78+ <*> option version
79+ ( long "core-version"
80+ <> metavar "VER"
81+ <> help "Core library version dependency."
82+ ))
83+
84+isPath :: ReadM Path
85+isPath = eitherReader (Right . fromText . Text.dropWhileEnd (== '/') . fromString)
86+
87+version :: ReadM (Version v)
88+version = eitherReader (Right . Version . Text.pack)
89+
90+options :: ParserInfo Opt
91+options = info (helper <*> parser) fullDesc
92+
93+validate :: MonadIO m => Opt -> m Opt
94+validate o = flip execStateT o $ do
95+ sequence_
96+ [ check optOutput
97+ , check optTemplates
98+ , check optStatic
99+ ]
100+ mapM canon (o ^. optModels) >>= assign optModels
101+ where
102+ check :: (MonadIO m, MonadState s m) => Lens' s Path -> m ()
103+ check l = gets (view l) >>= canon >>= assign l
104+
105+ canon :: MonadIO m => Path -> m Path
106+ canon = liftIO . FS.canonicalizePath
107+
108+main :: IO ()
109+main = do
110+ Opt{..} <- customExecParser (prefs showHelpOnError) options >>= validate
111+
112+ let ss = nub . sort $ map specFromPath _optModels
113+
114+ run $ do
115+ title "Initialising..." <* done
116+ title ("Loading templates from " % path) _optTemplates
117+
118+ let load = readTemplate _optTemplates
119+
120+ tmpl <- flip evalStateT mempty $ Templates
121+ <$> load "cabal.ede"
122+ <*> load "toc.ede"
123+ <*> load "readme.ede"
124+ <*> load "operation.ede"
125+ <*> load "types.ede"
126+ <* lift done
127+
128+ say ("Found " % int % " model specifications.") (length _optModels)
129+ say ("Selected " % int % " newest models.") (length ss)
130+
131+ forM_ (zip [1..] ss) $ \(j, Spec n _ f) -> do
132+ title ("[" % int % "/" % int % "] model:" % stext)
133+ (j :: Int) (length ss) n
134+
135+ -- m <- listDir f >>= hoistEither . loadModel f
136+
137+ -- say ("Using version " % dateDash) (m ^. modelVersion)
138+
139+ -- cfg <- JS.required (_optConfigs </> (m ^. configFile))
140+ -- >>= hoistEither . JS.parse
141+
142+ -- api <- sequence
143+ -- [ JS.optional (_optAnnexes </> (m ^. annexFile))
144+ -- , JS.required (m ^. serviceFile)
145+ -- , JS.optional (m ^. waitersFile)
146+ -- , JS.optional (m ^. pagersFile)
147+ -- , pure r
148+ -- ] >>= hoistEither . JS.parse . JS.merge
149+
150+ -- say ("Successfully parsed '" % stext % "' API definition")
151+ -- (api ^. serviceFullName)
152+
153+ -- lib <- hoistEither (AST.rewrite _optVersions cfg api)
154+
155+ -- dir <- hoistEither (Tree.populate _optOutput tmpl lib)
156+ -- >>= Tree.fold createDir (\x -> maybe (touchFile x) (writeLTFile x))
157+
158+ -- say ("Successfully rendered " % stext % "-" % semver % " package")
159+ -- (lib ^. libraryName)
160+ -- (lib ^. libraryVersion)
161+
162+ -- copyDir _optStatic (Tree.root dir)
163+
164+ -- done
165+
166+ -- title ("Successfully processed " % int % " models.") i
gen/stack.yamlnew file+4
@@ -0,0 +1,4 @@
1+resolver: nightly-2015-08-06
2+flags: {}
3+packages: ['.']
4+extra-deps: []
gen/static/LICENSEnew file+373
@@ -0,0 +1,373 @@
1+Mozilla Public License Version 2.0
2+==================================
3+
4+1. Definitions
5+--------------
6+
7+1.1. "Contributor"
8+ means each individual or legal entity that creates, contributes to
9+ the creation of, or owns Covered Software.
10+
11+1.2. "Contributor Version"
12+ means the combination of the Contributions of others (if any) used
13+ by a Contributor and that particular Contributor's Contribution.
14+
15+1.3. "Contribution"
16+ means Covered Software of a particular Contributor.
17+
18+1.4. "Covered Software"
19+ means Source Code Form to which the initial Contributor has attached
20+ the notice in Exhibit A, the Executable Form of such Source Code
21+ Form, and Modifications of such Source Code Form, in each case
22+ including portions thereof.
23+
24+1.5. "Incompatible With Secondary Licenses"
25+ means
26+
27+ (a) that the initial Contributor has attached the notice described
28+ in Exhibit B to the Covered Software; or
29+
30+ (b) that the Covered Software was made available under the terms of
31+ version 1.1 or earlier of the License, but not also under the
32+ terms of a Secondary License.
33+
34+1.6. "Executable Form"
35+ means any form of the work other than Source Code Form.
36+
37+1.7. "Larger Work"
38+ means a work that combines Covered Software with other material, in
39+ a separate file or files, that is not Covered Software.
40+
41+1.8. "License"
42+ means this document.
43+
44+1.9. "Licensable"
45+ means having the right to grant, to the maximum extent possible,
46+ whether at the time of the initial grant or subsequently, any and
47+ all of the rights conveyed by this License.
48+
49+1.10. "Modifications"
50+ means any of the following:
51+
52+ (a) any file in Source Code Form that results from an addition to,
53+ deletion from, or modification of the contents of Covered
54+ Software; or
55+
56+ (b) any new file in Source Code Form that contains any Covered
57+ Software.
58+
59+1.11. "Patent Claims" of a Contributor
60+ means any patent claim(s), including without limitation, method,
61+ process, and apparatus claims, in any patent Licensable by such
62+ Contributor that would be infringed, but for the grant of the
63+ License, by the making, using, selling, offering for sale, having
64+ made, import, or transfer of either its Contributions or its
65+ Contributor Version.
66+
67+1.12. "Secondary License"
68+ means either the GNU General Public License, Version 2.0, the GNU
69+ Lesser General Public License, Version 2.1, the GNU Affero General
70+ Public License, Version 3.0, or any later versions of those
71+ licenses.
72+
73+1.13. "Source Code Form"
74+ means the form of the work preferred for making modifications.
75+
76+1.14. "You" (or "Your")
77+ means an individual or a legal entity exercising rights under this
78+ License. For legal entities, "You" includes any entity that
79+ controls, is controlled by, or is under common control with You. For
80+ purposes of this definition, "control" means (a) the power, direct
81+ or indirect, to cause the direction or management of such entity,
82+ whether by contract or otherwise, or (b) ownership of more than
83+ fifty percent (50%) of the outstanding shares or beneficial
84+ ownership of such entity.
85+
86+2. License Grants and Conditions
87+--------------------------------
88+
89+2.1. Grants
90+
91+Each Contributor hereby grants You a world-wide, royalty-free,
92+non-exclusive license:
93+
94+(a) under intellectual property rights (other than patent or trademark)
95+ Licensable by such Contributor to use, reproduce, make available,
96+ modify, display, perform, distribute, and otherwise exploit its
97+ Contributions, either on an unmodified basis, with Modifications, or
98+ as part of a Larger Work; and
99+
100+(b) under Patent Claims of such Contributor to make, use, sell, offer
101+ for sale, have made, import, and otherwise transfer either its
102+ Contributions or its Contributor Version.
103+
104+2.2. Effective Date
105+
106+The licenses granted in Section 2.1 with respect to any Contribution
107+become effective for each Contribution on the date the Contributor first
108+distributes such Contribution.
109+
110+2.3. Limitations on Grant Scope
111+
112+The licenses granted in this Section 2 are the only rights granted under
113+this License. No additional rights or licenses will be implied from the
114+distribution or licensing of Covered Software under this License.
115+Notwithstanding Section 2.1(b) above, no patent license is granted by a
116+Contributor:
117+
118+(a) for any code that a Contributor has removed from Covered Software;
119+ or
120+
121+(b) for infringements caused by: (i) Your and any other third party's
122+ modifications of Covered Software, or (ii) the combination of its
123+ Contributions with other software (except as part of its Contributor
124+ Version); or
125+
126+(c) under Patent Claims infringed by Covered Software in the absence of
127+ its Contributions.
128+
129+This License does not grant any rights in the trademarks, service marks,
130+or logos of any Contributor (except as may be necessary to comply with
131+the notice requirements in Section 3.4).
132+
133+2.4. Subsequent Licenses
134+
135+No Contributor makes additional grants as a result of Your choice to
136+distribute the Covered Software under a subsequent version of this
137+License (see Section 10.2) or under the terms of a Secondary License (if
138+permitted under the terms of Section 3.3).
139+
140+2.5. Representation
141+
142+Each Contributor represents that the Contributor believes its
143+Contributions are its original creation(s) or it has sufficient rights
144+to grant the rights to its Contributions conveyed by this License.
145+
146+2.6. Fair Use
147+
148+This License is not intended to limit any rights You have under
149+applicable copyright doctrines of fair use, fair dealing, or other
150+equivalents.
151+
152+2.7. Conditions
153+
154+Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
155+in Section 2.1.
156+
157+3. Responsibilities
158+-------------------
159+
160+3.1. Distribution of Source Form
161+
162+All distribution of Covered Software in Source Code Form, including any
163+Modifications that You create or to which You contribute, must be under
164+the terms of this License. You must inform recipients that the Source
165+Code Form of the Covered Software is governed by the terms of this
166+License, and how they can obtain a copy of this License. You may not
167+attempt to alter or restrict the recipients' rights in the Source Code
168+Form.
169+
170+3.2. Distribution of Executable Form
171+
172+If You distribute Covered Software in Executable Form then:
173+
174+(a) such Covered Software must also be made available in Source Code
175+ Form, as described in Section 3.1, and You must inform recipients of
176+ the Executable Form how they can obtain a copy of such Source Code
177+ Form by reasonable means in a timely manner, at a charge no more
178+ than the cost of distribution to the recipient; and
179+
180+(b) You may distribute such Executable Form under the terms of this
181+ License, or sublicense it under different terms, provided that the
182+ license for the Executable Form does not attempt to limit or alter
183+ the recipients' rights in the Source Code Form under this License.
184+
185+3.3. Distribution of a Larger Work
186+
187+You may create and distribute a Larger Work under terms of Your choice,
188+provided that You also comply with the requirements of this License for
189+the Covered Software. If the Larger Work is a combination of Covered
190+Software with a work governed by one or more Secondary Licenses, and the
191+Covered Software is not Incompatible With Secondary Licenses, this
192+License permits You to additionally distribute such Covered Software
193+under the terms of such Secondary License(s), so that the recipient of
194+the Larger Work may, at their option, further distribute the Covered
195+Software under the terms of either this License or such Secondary
196+License(s).
197+
198+3.4. Notices
199+
200+You may not remove or alter the substance of any license notices
201+(including copyright notices, patent notices, disclaimers of warranty,
202+or limitations of liability) contained within the Source Code Form of
203+the Covered Software, except that You may alter any license notices to
204+the extent required to remedy known factual inaccuracies.
205+
206+3.5. Application of Additional Terms
207+
208+You may choose to offer, and to charge a fee for, warranty, support,
209+indemnity or liability obligations to one or more recipients of Covered
210+Software. However, You may do so only on Your own behalf, and not on
211+behalf of any Contributor. You must make it absolutely clear that any
212+such warranty, support, indemnity, or liability obligation is offered by
213+You alone, and You hereby agree to indemnify every Contributor for any
214+liability incurred by such Contributor as a result of warranty, support,
215+indemnity or liability terms You offer. You may include additional
216+disclaimers of warranty and limitations of liability specific to any
217+jurisdiction.
218+
219+4. Inability to Comply Due to Statute or Regulation
220+---------------------------------------------------
221+
222+If it is impossible for You to comply with any of the terms of this
223+License with respect to some or all of the Covered Software due to
224+statute, judicial order, or regulation then You must: (a) comply with
225+the terms of this License to the maximum extent possible; and (b)
226+describe the limitations and the code they affect. Such description must
227+be placed in a text file included with all distributions of the Covered
228+Software under this License. Except to the extent prohibited by statute
229+or regulation, such description must be sufficiently detailed for a
230+recipient of ordinary skill to be able to understand it.
231+
232+5. Termination
233+--------------
234+
235+5.1. The rights granted under this License will terminate automatically
236+if You fail to comply with any of its terms. However, if You become
237+compliant, then the rights granted under this License from a particular
238+Contributor are reinstated (a) provisionally, unless and until such
239+Contributor explicitly and finally terminates Your grants, and (b) on an
240+ongoing basis, if such Contributor fails to notify You of the
241+non-compliance by some reasonable means prior to 60 days after You have
242+come back into compliance. Moreover, Your grants from a particular
243+Contributor are reinstated on an ongoing basis if such Contributor
244+notifies You of the non-compliance by some reasonable means, this is the
245+first time You have received notice of non-compliance with this License
246+from such Contributor, and You become compliant prior to 30 days after
247+Your receipt of the notice.
248+
249+5.2. If You initiate litigation against any entity by asserting a patent
250+infringement claim (excluding declaratory judgment actions,
251+counter-claims, and cross-claims) alleging that a Contributor Version
252+directly or indirectly infringes any patent, then the rights granted to
253+You by any and all Contributors for the Covered Software under Section
254+2.1 of this License shall terminate.
255+
256+5.3. In the event of termination under Sections 5.1 or 5.2 above, all
257+end user license agreements (excluding distributors and resellers) which
258+have been validly granted by You or Your distributors under this License
259+prior to termination shall survive termination.
260+
261+************************************************************************
262+* *
263+* 6. Disclaimer of Warranty *
264+* ------------------------- *
265+* *
266+* Covered Software is provided under this License on an "as is" *
267+* basis, without warranty of any kind, either expressed, implied, or *
268+* statutory, including, without limitation, warranties that the *
269+* Covered Software is free of defects, merchantable, fit for a *
270+* particular purpose or non-infringing. The entire risk as to the *
271+* quality and performance of the Covered Software is with You. *
272+* Should any Covered Software prove defective in any respect, You *
273+* (not any Contributor) assume the cost of any necessary servicing, *
274+* repair, or correction. This disclaimer of warranty constitutes an *
275+* essential part of this License. No use of any Covered Software is *
276+* authorized under this License except under this disclaimer. *
277+* *
278+************************************************************************
279+
280+************************************************************************
281+* *
282+* 7. Limitation of Liability *
283+* -------------------------- *
284+* *
285+* Under no circumstances and under no legal theory, whether tort *
286+* (including negligence), contract, or otherwise, shall any *
287+* Contributor, or anyone who distributes Covered Software as *
288+* permitted above, be liable to You for any direct, indirect, *
289+* special, incidental, or consequential damages of any character *
290+* including, without limitation, damages for lost profits, loss of *
291+* goodwill, work stoppage, computer failure or malfunction, or any *
292+* and all other commercial damages or losses, even if such party *
293+* shall have been informed of the possibility of such damages. This *
294+* limitation of liability shall not apply to liability for death or *
295+* personal injury resulting from such party's negligence to the *
296+* extent applicable law prohibits such limitation. Some *
297+* jurisdictions do not allow the exclusion or limitation of *
298+* incidental or consequential damages, so this exclusion and *
299+* limitation may not apply to You. *
300+* *
301+************************************************************************
302+
303+8. Litigation
304+-------------
305+
306+Any litigation relating to this License may be brought only in the
307+courts of a jurisdiction where the defendant maintains its principal
308+place of business and such litigation shall be governed by laws of that
309+jurisdiction, without reference to its conflict-of-law provisions.
310+Nothing in this Section shall prevent a party's ability to bring
311+cross-claims or counter-claims.
312+
313+9. Miscellaneous
314+----------------
315+
316+This License represents the complete agreement concerning the subject
317+matter hereof. If any provision of this License is held to be
318+unenforceable, such provision shall be reformed only to the extent
319+necessary to make it enforceable. Any law or regulation which provides
320+that the language of a contract shall be construed against the drafter
321+shall not be used to construe this License against a Contributor.
322+
323+10. Versions of the License
324+---------------------------
325+
326+10.1. New Versions
327+
328+Mozilla Foundation is the license steward. Except as provided in Section
329+10.3, no one other than the license steward has the right to modify or
330+publish new versions of this License. Each version will be given a
331+distinguishing version number.
332+
333+10.2. Effect of New Versions
334+
335+You may distribute the Covered Software under the terms of the version
336+of the License under which You originally received the Covered Software,
337+or under the terms of any subsequent version published by the license
338+steward.
339+
340+10.3. Modified Versions
341+
342+If you create software not governed by this License, and you want to
343+create a new license for such software, you may create and use a
344+modified version of this License if you rename the license and remove
345+any references to the name of the license steward (except to note that
346+such modified license differs from this License).
347+
348+10.4. Distributing Source Code Form that is Incompatible With Secondary
349+Licenses
350+
351+If You choose to distribute Source Code Form that is Incompatible With
352+Secondary Licenses under the terms of this version of the License, the
353+notice described in Exhibit B of this License must be attached.
354+
355+Exhibit A - Source Code Form License Notice
356+-------------------------------------------
357+
358+ This Source Code Form is subject to the terms of the Mozilla Public
359+ License, v. 2.0. If a copy of the MPL was not distributed with this
360+ file, You can obtain one at http://mozilla.org/MPL/2.0/.
361+
362+If it is not possible or desirable to put the notice in a particular
363+file, then You may include the notice in a location (such as a LICENSE
364+file in a relevant directory) where a recipient would be likely to look
365+for such a notice.
366+
367+You may add additional accurate notices of copyright ownership.
368+
369+Exhibit B - "Incompatible With Secondary Licenses" Notice
370+---------------------------------------------------------
371+
372+ This Source Code Form is "Incompatible With Secondary Licenses", as
373+ defined by the Mozilla Public License, v. 2.0.
gen/static/Makefilenew file+1
@@ -0,0 +1 @@
1+include ../share/library.mk
gen/static/Setup.hsnew file+2
@@ -0,0 +1,2 @@
1+import Distribution.Simple
2+main = defaultMain
gen/template/cabal.edenew file

No changes to the content.

gen/template/operation.edenew file

No changes to the content.

gen/template/readme.edenew file

No changes to the content.

gen/template/toc.edenew file

No changes to the content.

gen/template/types.edenew file

No changes to the content.