From d749c4f52786c19ac7fb0af74a6521ae4704ffcf Mon Sep 17 00:00:00 2001 From: Robin Heggelund Hansen <854889+robinheghan@users.noreply.github.com> Date: Fri, 9 Sep 2022 14:17:56 +0200 Subject: [PATCH] Split package commands into seperate namespace. --- gren.cabal | 1 + terminal/src/Main.hs | 124 +++++----------------------- terminal/src/Package.hs | 177 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 197 insertions(+), 105 deletions(-) create mode 100644 terminal/src/Package.hs diff --git a/gren.cabal b/gren.cabal index 7bda8948..ef803ded 100644 --- a/gren.cabal +++ b/gren.cabal @@ -60,6 +60,7 @@ Common gren-common Docs Publish Repl + Package -- terminal args Terminal diff --git a/terminal/src/Main.hs b/terminal/src/Main.hs index 1b22509b..2d4dae2e 100644 --- a/terminal/src/Main.hs +++ b/terminal/src/Main.hs @@ -5,20 +5,17 @@ module Main ) where -import Bump qualified import Data.List qualified as List -import Diff qualified import Docs qualified import Format qualified import Gren.Platform qualified as Platform import Gren.Version qualified as V import Init qualified -import Install qualified import Make qualified -import Publish qualified +import Package qualified import Repl qualified import Terminal -import Terminal.Helpers +import Terminal.Helpers qualified as H import Text.PrettyPrint.ANSI.Leijen qualified as P import Prelude hiding (init) @@ -33,11 +30,8 @@ main = init, make, docs, - install, format, - bump, - diff, - publish + package ] intro :: P.Doc @@ -157,7 +151,7 @@ make = |-- onOff "optimize" "Turn on optimizations to make code smaller and faster. For example, the compiler renames record fields to be as short as possible and unboxes values to reduce allocation." |-- flag "output" Make.output "Specify the name of the resulting JS file. For example --output=assets/gren.js to generate the JS at assets/gren.js. You can also use --output=/dev/stdout to output the JS to the terminal, or --output=/dev/null to generate no output at all!" |-- flag "report" Make.reportType "You can say --report=json to get error messages as JSON. This is only really useful if you are an editor plugin. Humans should avoid it!" - in Terminal.Command "make" Uncommon details example (zeroOrMore grenFile) makeFlags Make.run + in Terminal.Command "make" Uncommon details example (zeroOrMore H.grenFile) makeFlags Make.run -- DOCS @@ -182,112 +176,32 @@ docs = |-- flag "report" Docs.reportType "You can say --report=json to get error messages as JSON. This is only really useful if you are an editor plugin. Humans should avoid it!" in Terminal.Command "docs" Uncommon details example noArgs docsFlags Docs.run --- INSTALL +-- PACKAGE -install :: Terminal.Command -install = +package :: Terminal.Command +package = let details = - "The `install` command fetches packages from for\ - \ use in your project:" + "The `package` command contains sub-commands which help you manage your package,\ + \ or your dependant packages:" example = stack [ reflow - "For example, if you want to get packages for HTTP and JSON, you would say:", + "For example, if you want to install packages for Browser APIs in your project,\ + \ you would say:", P.indent 4 $ P.green $ P.vcat $ - [ "gren install gren/http", - "gren install gren/json" + [ "gren package install gren-lang/browser" ], reflow - "Notice that you must say the AUTHOR name and PROJECT name! After running those\ - \ commands, you could say `import Http` or `import Json.Decode` in your code.", - reflow - "What if two projects use different versions of the same package? No problem!\ - \ Each project is independent, so there cannot be conflicts like that!" + "To see a description of all available sub-commands, execute:", + P.indent 4 $ + P.green $ + P.vcat $ + ["gren package"] ] - - installArgs = - oneOf - [ require0 Install.NoArgs, - require1 Install.Install package - ] - in Terminal.Command "install" Uncommon details example installArgs noFlags Install.run - --- PUBLISH - -publish :: Terminal.Command -publish = - let details = - "The `publish` command publishes your package on \ - \ so that anyone in the Gren community can use it." - - example = - stack - [ reflow - "Think hard if you are ready to publish NEW packages though!", - reflow - "Part of what makes Gren great is the packages ecosystem. The fact that\ - \ there is usually one option (usually very well done) makes it way\ - \ easier to pick packages and become productive. So having a million\ - \ packages would be a failure in Gren. We do not need twenty of\ - \ everything, all coded in a single weekend.", - reflow - "So as community members gain wisdom through experience, we want\ - \ them to share that through thoughtful API design and excellent\ - \ documentation. It is more about sharing ideas and insights than\ - \ just sharing code! The first step may be asking for advice from\ - \ people you respect, or in community forums. The second step may\ - \ be using it at work to see if it is as nice as you think. Maybe\ - \ it ends up as an experiment on GitHub only. Point is, try to be\ - \ respectful of the community and package ecosystem!", - reflow - "Check out for guidance on how to create great packages!" - ] - in Terminal.Command "publish" Uncommon details example noArgs noFlags Publish.run - --- BUMP - -bump :: Terminal.Command -bump = - let details = - "The `bump` command figures out the next version number based on API changes:" - - example = - reflow - "Say you just published version 1.0.0, but then decided to remove a function.\ - \ I will compare the published API to what you have locally, figure out that\ - \ it is a MAJOR change, and bump your version number to 2.0.0. I do this with\ - \ all packages, so there cannot be MAJOR changes hiding in PATCH releases in Gren!" - in Terminal.Command "bump" Uncommon details example noArgs noFlags Bump.run - --- DIFF - -diff :: Terminal.Command -diff = - let details = - "The `diff` command detects API changes:" - - example = - stack - [ reflow - "For example, to see what changed in the HTML package between\ - \ versions 1.0.0 and 2.0.0, you can say:", - P.indent 4 $ P.green $ "gren diff gren/html 1.0.0 2.0.0", - reflow - "Sometimes a MAJOR change is not actually very big, so\ - \ this can help you plan your upgrade timelines." - ] - - diffArgs = - oneOf - [ require0 Diff.CodeVsLatest, - require1 Diff.CodeVsExactly version, - require2 Diff.LocalInquiry version version, - require3 Diff.GlobalInquiry package version version - ] - in Terminal.Command "diff" Uncommon details example diffArgs noFlags Diff.run + in Terminal.Command "package" Uncommon details example noArgs noFlags Package.run -- FORMAT @@ -303,7 +217,7 @@ format = flags Format.Flags |-- onOff "yes" "Assume yes for all interactive prompts." |-- onOff "stdin" "Format stdin and write it to stdout." - in Terminal.Command "format" Uncommon details example (zeroOrMore grenFileOrDirectory) formatFlags Format.run + in Terminal.Command "format" Uncommon details example (zeroOrMore H.grenFileOrDirectory) formatFlags Format.run -- HELPERS diff --git a/terminal/src/Package.hs b/terminal/src/Package.hs new file mode 100644 index 00000000..3b199465 --- /dev/null +++ b/terminal/src/Package.hs @@ -0,0 +1,177 @@ +{-# LANGUAGE OverloadedStrings #-} + +module Package + ( run, + ) +where + +import Bump qualified +import Data.List qualified as List +import Diff qualified +import Gren.Version qualified as V +import Install qualified +import Publish qualified +import Terminal +import Terminal.Helpers +import Text.PrettyPrint.ANSI.Leijen qualified as P +import Prelude hiding (init) + +-- RUN + +run :: () -> () -> IO () +run () () = + Terminal.app + intro + outro + [ install, + bump, + diff, + publish + ] + +intro :: P.Doc +intro = + P.vcat + [ P.fillSep + [ "Hi,", + "thank", + "you", + "for", + "trying", + "out", + P.green "Gren", + P.green (P.text (V.toChars V.compiler)) <> ".", + "I hope you like it!" + ], + "", + P.black "-------------------------------------------------------------------------------", + P.black "I highly recommend working through to get started.", + P.black "It teaches many important concepts, including how to use `gren` in the terminal.", + P.black "-------------------------------------------------------------------------------" + ] + +outro :: P.Doc +outro = + P.fillSep $ + map P.text $ + words + "Be sure to ask on the Gren zulip if you run into trouble! Folks are friendly and\ + \ happy to help out. They hang out there because it is fun, so be kind to get the\ + \ best results!" + +-- INSTALL + +install :: Terminal.Command +install = + let details = + "The `install` command fetches packages from for\ + \ use in your project:" + + example = + stack + [ reflow + "For example, if you want to get packages for HTTP and JSON, you would say:", + P.indent 4 $ + P.green $ + P.vcat $ + [ "gren install gren/http", + "gren install gren/json" + ], + reflow + "Notice that you must say the AUTHOR name and PROJECT name! After running those\ + \ commands, you could say `import Http` or `import Json.Decode` in your code.", + reflow + "What if two projects use different versions of the same package? No problem!\ + \ Each project is independent, so there cannot be conflicts like that!" + ] + + installArgs = + oneOf + [ require0 Install.NoArgs, + require1 Install.Install package + ] + in Terminal.Command "install" Uncommon details example installArgs noFlags Install.run + +-- PUBLISH + +publish :: Terminal.Command +publish = + let details = + "The `publish` command publishes your package on \ + \ so that anyone in the Gren community can use it." + + example = + stack + [ reflow + "Think hard if you are ready to publish NEW packages though!", + reflow + "Part of what makes Gren great is the packages ecosystem. The fact that\ + \ there is usually one option (usually very well done) makes it way\ + \ easier to pick packages and become productive. So having a million\ + \ packages would be a failure in Gren. We do not need twenty of\ + \ everything, all coded in a single weekend.", + reflow + "So as community members gain wisdom through experience, we want\ + \ them to share that through thoughtful API design and excellent\ + \ documentation. It is more about sharing ideas and insights than\ + \ just sharing code! The first step may be asking for advice from\ + \ people you respect, or in community forums. The second step may\ + \ be using it at work to see if it is as nice as you think. Maybe\ + \ it ends up as an experiment on GitHub only. Point is, try to be\ + \ respectful of the community and package ecosystem!", + reflow + "Check out for guidance on how to create great packages!" + ] + in Terminal.Command "publish" Uncommon details example noArgs noFlags Publish.run + +-- BUMP + +bump :: Terminal.Command +bump = + let details = + "The `bump` command figures out the next version number based on API changes:" + + example = + reflow + "Say you just published version 1.0.0, but then decided to remove a function.\ + \ I will compare the published API to what you have locally, figure out that\ + \ it is a MAJOR change, and bump your version number to 2.0.0. I do this with\ + \ all packages, so there cannot be MAJOR changes hiding in PATCH releases in Gren!" + in Terminal.Command "bump" Uncommon details example noArgs noFlags Bump.run + +-- DIFF + +diff :: Terminal.Command +diff = + let details = + "The `diff` command detects API changes:" + + example = + stack + [ reflow + "For example, to see what changed in the HTML package between\ + \ versions 1.0.0 and 2.0.0, you can say:", + P.indent 4 $ P.green $ "gren diff gren/html 1.0.0 2.0.0", + reflow + "Sometimes a MAJOR change is not actually very big, so\ + \ this can help you plan your upgrade timelines." + ] + + diffArgs = + oneOf + [ require0 Diff.CodeVsLatest, + require1 Diff.CodeVsExactly version, + require2 Diff.LocalInquiry version version, + require3 Diff.GlobalInquiry package version version + ] + in Terminal.Command "diff" Uncommon details example diffArgs noFlags Diff.run + +-- HELPERS + +stack :: [P.Doc] -> P.Doc +stack docList = + P.vcat $ List.intersperse "" docList + +reflow :: String -> P.Doc +reflow string = + P.fillSep $ map P.text $ words string