Skip to content
This repository has been archived by the owner on Dec 29, 2024. It is now read-only.

Commit

Permalink
Merge pull request #25 from osspkg/add-app-template
Browse files Browse the repository at this point in the history
add app generator
  • Loading branch information
markus621 authored Mar 8, 2024
2 parents 5f554a0 + 43f3d8a commit 3b0b7b3
Show file tree
Hide file tree
Showing 22 changed files with 397 additions and 61 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
go: [ '1.18' ]
go: [ '1.20' ]
steps:
- uses: actions/checkout@v3

Expand Down
2 changes: 1 addition & 1 deletion .golangci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -362,7 +362,7 @@ linters:
- unused
- prealloc
- durationcheck
- nolintlint
# - nolintlint
- staticcheck
- makezero
- nilerr
Expand Down
2 changes: 1 addition & 1 deletion LICENSE
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
BSD 3-Clause License

Copyright (c) 2022-2023, Mikhail Knyazhev <markus621@yandex.ru>
Copyright (c) 2022-2024, Mikhail Knyazhev <markus621@yandex.ru>

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
Expand Down
14 changes: 9 additions & 5 deletions go.mod
Original file line number Diff line number Diff line change
@@ -1,15 +1,19 @@
module github.com/osspkg/devtool

go 1.18
go 1.20

require (
go.osspkg.com/algorithms v1.3.0
go.osspkg.com/goppy v0.14.0
golang.org/x/mod v0.14.0
go.osspkg.com/algorithms v1.3.1
go.osspkg.com/goppy/console v0.3.1
go.osspkg.com/goppy/errors v0.3.0
go.osspkg.com/goppy/iofile v0.3.2
go.osspkg.com/goppy/shell v0.3.0
go.osspkg.com/goppy/syscall v0.3.0
golang.org/x/mod v0.16.0
gopkg.in/yaml.v3 v3.0.1
)

require (
github.com/kr/text v0.2.0 // indirect
github.com/rogpeppe/go-internal v1.11.0 // indirect
go.osspkg.com/goppy/iosync v0.3.0 // indirect
)
28 changes: 19 additions & 9 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,26 @@ github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M=
github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA=
github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
go.osspkg.com/algorithms v1.3.0 h1:rrKO440aNTofYJwGnOVsW00w0VRtZtu+BQrgXMXw7j4=
go.osspkg.com/algorithms v1.3.0/go.mod h1:J2SXxHdqBK9ALGYJomA9XGvTOhIwMK0fvVw+KusYyoo=
go.osspkg.com/goppy v0.14.0 h1:7YoNaSA+XIAy+lbIMEdmMIXH9Em+keNRMVvqP4+4jiE=
go.osspkg.com/goppy v0.14.0/go.mod h1:NAWYk3WylEMTTcEgFiFEQsL69T/ox614gpuzlWyxlzg=
golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0=
golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
go.osspkg.com/algorithms v1.3.1 h1:Weh0Z4dMzHFRJTfMva/mU6Uk95wSRGwt1Saj2sfz3Wc=
go.osspkg.com/algorithms v1.3.1/go.mod h1:kj+oVK7UDQlXMKleMTYzbEEpUAXC2tzRBtki7F5EbXc=
go.osspkg.com/goppy/console v0.3.1 h1:fg1HDeev01h55k29B6LyzCDf3b2sn5yl3YYOGN2f4w0=
go.osspkg.com/goppy/console v0.3.1/go.mod h1:TpDVGqmJaKuxemUUPj/cNyLEo3jlyL/T0iOzsZDmjjY=
go.osspkg.com/goppy/errors v0.3.0 h1:n98V9gW8UOfooY9Y9FNwV7oznKGQxrIr/J19brqayzc=
go.osspkg.com/goppy/errors v0.3.0/go.mod h1:rbBTNHK0wpGi3FgJ4M27n7LOvB3Aw6kKc0Q4np16wh0=
go.osspkg.com/goppy/iofile v0.3.2 h1:dvI7AfSZyx7NhSdqg+iFECjSd0+rbgqg0xWvRjXkHpc=
go.osspkg.com/goppy/iofile v0.3.2/go.mod h1:bdslt9epbltr/N/8jtbGDiLIKbpIHwgYh+ax4SHI6Og=
go.osspkg.com/goppy/iosync v0.3.0 h1:eClduMtjVZUPpNYzHm7EClCa3y58lB/FlIRtHgyU9YE=
go.osspkg.com/goppy/iosync v0.3.0/go.mod h1:Ocol//DRF4n0m40jFmYBxnjHtFjeyeO0RcY/pwOCtsg=
go.osspkg.com/goppy/shell v0.3.0 h1:h1w3vRoaro2d6s/A1Tvghq5de8wHDwoobNONwhkxiJc=
go.osspkg.com/goppy/shell v0.3.0/go.mod h1:ZgAoKBOyHor1xyPZdgljNLh/gnd1EKiOhYhgFT3xueQ=
go.osspkg.com/goppy/syscall v0.3.0 h1:2PcpkqC1ol14HTOC+XyG+3lsuQ9pnG9ueE4xFywoSdE=
go.osspkg.com/goppy/syscall v0.3.0/go.mod h1:Vz1BCzM8MmyC/26SjiVh6OGcAkky1y4xalSWbVceiL4=
go.osspkg.com/goppy/xtest v0.3.0 h1:QV0159LiYXKALfsOwhCG+zUuy5jnIFeopYs00PSRa2g=
golang.org/x/mod v0.16.0 h1:QX4fJ0Rr5cPQCF7O9lh9Se4pmwfwskqZfq5moyldzic=
golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
169 changes: 169 additions & 0 deletions internal/appgoppy/appgoppy.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,169 @@
/*
* Copyright (c) 2022-2024 Mikhail Knyazhev <markus621@yandex.ru>. All rights reserved.
* Use of this source code is governed by a BSD 3-Clause license that can be found in the LICENSE file.
*/

package appgoppy

import (
"bufio"
"bytes"
"context"
"fmt"
"os"
"path/filepath"
"strings"
"text/template"

"github.com/osspkg/devtool/internal/global"
"go.osspkg.com/goppy/console"
"go.osspkg.com/goppy/iofile"
"go.osspkg.com/goppy/shell"
)

func Cmd() console.CommandGetter {
return console.NewCommand(func(setter console.CommandSetter) {
setter.Setup("goppy", "Generate new app with goppy sdk")
setter.ExecFunc(func(_ []string) {
currdir := iofile.CurrentDir()

data := make(map[string]interface{}, 100)
data["go_version"] = strings.TrimLeft(global.GoVersion(), "go")
data["app_module"] = console.Input("Input project name", nil, "app")
data["app_name"] = func() string {
vv := strings.Split(data["app_module"].(string), "/")
return vv[len(vv)-1]
}()

for _, blocks := range modules {
for _, name := range blocks {
data["mod_"+name] = false
}
}

userInput("Add modules", modules, "q", func(s string) {
data["mod_"+s] = true
})

for _, folder := range folders {
console.FatalIfErr(os.MkdirAll(currdir+"/"+folder, 0744), "Create folder")
}

for filename, tmpl := range templates {
if strings.Contains(filename, "{{") {
for key, value := range data {
filename = strings.ReplaceAll(
filename,
"{{"+key+"}}",
fmt.Sprintf("%+v", value),
)
}
}
writeFile(currdir+"/"+filename, tmpl, data)
}

sh := shell.New()
sh.SetDir(currdir)
sh.SetShell("bash")
sh.SetWriter(os.Stdout)
err := sh.CallPackageContext(context.TODO(),
"gofmt -w .",
"go mod tidy",
"devtool setup-lib",
"devtool setup-app",
)
console.FatalIfErr(err, "Call commands")
})
})
}

var modules = [][]string{
{
"metrics",
"geoip",
"oauth",
"auth_jwt",
},
{
"db_mysql",
"db_sqlite",
"db_postgre",
},
{
"web_server",
"web_client",
},
{
"websocket_server",
"websocket_client",
},
{
"unixsocket_server",
"unixsocket_client",
},
{
"dns_server",
"dns_client",
},
}

var folders = []string{
"app",
"config",
"cmd",
}

var templates = map[string]string{
".gitignore": tmplGitIgnore,
"README.md": tmplReadMe,
"go.mod": tmplGoMod,
"docker-compose.yaml": tmplDockerFile,
"cmd/{{app_name}}/main.go": tmplMainGO,
"app/plugin.go": tmplAppGo,
}

func writeFile(filename, t string, data map[string]interface{}) {
tmpl, err := template.New("bt").Parse(t)
console.FatalIfErr(err, "Parse template")
tmpl.Option("missingkey=error")

var buf bytes.Buffer
err = tmpl.Execute(&buf, data)
console.FatalIfErr(err, "Build template")

console.FatalIfErr(os.MkdirAll(filepath.Dir(filename), 0744), "Create folder")
console.FatalIfErr(os.WriteFile(filename, buf.Bytes(), 0664), "Write %s", filename)
}

func userInput(msg string, mods [][]string, exit string, call func(s string)) {
fmt.Printf("--- %s ---\n", msg)

list := make(map[string]string, len(mods)*4)
i := 0
for _, blocks := range mods {
for _, name := range blocks {
i++
fmt.Printf("(%d) %s, ", i, name)
list[fmt.Sprintf("%d", i)] = name
}
fmt.Printf("\n")
}
fmt.Printf("and (%s) Done: \n", exit)

scan := bufio.NewScanner(os.Stdin)
for {
if scan.Scan() {
r := scan.Text()
if r == exit {
fmt.Printf("\u001B[1A\u001B[K--- Done ---\n\n")
return
}
if name, ok := list[r]; ok {
call(name)
fmt.Printf("\033[1A\033[K + %s\n", name)
continue
}
fmt.Printf("\u001B[1A\u001B[KBad answer! Try again: ")
}
}
}
122 changes: 122 additions & 0 deletions internal/appgoppy/templates.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
package appgoppy

const tmplMainGO = `package main
import (
app_{{.app_name}} "{{.app_module}}/app"
"go.osspkg.com/goppy"
{{if .mod_metrics}}"go.osspkg.com/goppy/metrics"
{{end}}{{if .mod_geoip}}"go.osspkg.com/goppy/geoip"
{{end}}{{if or .mod_oauth .mod_auth_jwt}}"go.osspkg.com/goppy/auth"
{{end}}{{if .mod_db_mysql}}"go.osspkg.com/goppy/ormmysql"
{{end}}{{if .mod_db_sqlite}}"go.osspkg.com/goppy/ormsqlite"
{{end}}{{if .mod_db_postgre}}"go.osspkg.com/goppy/ormpgsql"
{{end}}{{if or .mod_web_server .mod_web_client}}"go.osspkg.com/goppy/web"
{{end}}{{if or .mod_websocket_server .mod_websocket_client}}"go.osspkg.com/goppy/ws"
{{end}}{{if or .mod_unixsocket_server .mod_unixsocket_client}}"go.osspkg.com/goppy/unixsocket"
{{end}}{{if or .mod_dns_server .mod_dns_client}}"go.osspkg.com/goppy/xdns"
{{end}}
)
var Version = "v0.0.0-dev"
func main() {
app := goppy.New()
app.AppName("{{.app_name}}")
app.AppVersion(Version)
app.Plugins(
{{if .mod_metrics}}metrics.WithMetrics(),{{end}}
{{if .mod_geoip}}geoip.WithMaxMindGeoIP(),{{end}}
{{if .mod_oauth}}auth.WithOAuth(),{{end}}
{{if .mod_auth_jwt}}auth.WithJWT(),{{end}}
{{if .mod_db_mysql}}ormmysql.WithMySQL(),{{end}}
{{if .mod_db_sqlite}}ormsqlite.WithSQLite(),{{end}}
{{if .mod_db_postgre}}ormpgsql.WithPostgreSQL(),{{end}}
{{if .mod_web_server}}web.WithHTTP(),{{end}}
{{if .mod_web_client}}web.WithHTTPClient(),{{end}}
{{if .mod_websocket_server}}ws.WithWebsocketServer(),{{end}}
{{if .mod_websocket_client}}ws.WithWebsocketClient(),{{end}}
{{if .mod_dns_server}}xdns.WithDNSServer(),{{end}}
{{if .mod_dns_client}}xdns.WithDNSClient(),{{end}}
{{if .mod_unixsocket_server}}unixsocket.WithServer(),{{end}}
{{if .mod_unixsocket_client}}unixsocket.WithClient(),{{end}}
)
app.Plugins(app_{{.app_name}}.Plugins...)
app.Run()
}
`

const tmplAppGo = `package app
import (
"go.osspkg.com/goppy/plugins"
)
var Plugins = plugins.Inject()
`

const tmplReadMe = `# {{.app_name}}
`

const tmplGitIgnore = `
*.exe
*.exe~
*.dll
*.so
*.dylib
*.test
*.out
*.dev.yaml
vendor/
build/
.idea/
.vscode/
.tools/
`

const tmplDockerFile = `version: '2.4'
networks:
database:
name: {{.app_name}}-dev-net
services:
db:
image: library/mysql:5.7.25
restart: on-failure
environment:
MYSQL_ROOT_PASSWORD: 'root'
MYSQL_USER: 'test'
MYSQL_PASSWORD: 'test'
MYSQL_DATABASE: 'test_database'
healthcheck:
test: [ "CMD", "mysql", "--user=root", "--password=root", "-e", "SHOW DATABASES;" ]
interval: 15s
timeout: 30s
retries: 30
ports:
- "127.0.0.1:3306:3306"
networks:
- database
adminer:
image: adminer:latest
restart: on-failure
links:
- db
ports:
- "127.0.0.1:8000:8080"
networks:
- database
`

const tmplGoMod = `module {{.app_module}}
go {{.go_version}}
`
4 changes: 2 additions & 2 deletions internal/build/build.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2022-2023 Mikhail Knyazhev <markus621@yandex.ru>. All rights reserved.
* Copyright (c) 2022-2024 Mikhail Knyazhev <markus621@yandex.ru>. All rights reserved.
* Use of this source code is governed by a BSD 3-Clause license that can be found in the LICENSE file.
*/

Expand All @@ -11,7 +11,7 @@ import (
"github.com/osspkg/devtool/internal/global"
"github.com/osspkg/devtool/pkg/exec"
"github.com/osspkg/devtool/pkg/files"
"go.osspkg.com/goppy/sdk/console"
"go.osspkg.com/goppy/console"
)

func Cmd() console.CommandGetter {
Expand Down
Loading

0 comments on commit 3b0b7b3

Please sign in to comment.