1
0
mirror of https://github.com/beego/bee.git synced 2024-11-25 20:10:55 +00:00
bee/new.go

306 lines
76 KiB
Go
Raw Normal View History

2013-09-03 17:23:58 +00:00
// Copyright 2013 bee authors
//
// Licensed under the Apache License, Version 2.0 (the "License"): you may
// not use this file except in compliance with the License. You may obtain
// a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations
// under the License.
package main
import (
"fmt"
"os"
path "path/filepath"
"strings"
)
var cmdNew = &Command{
UsageLine: "new [appname]",
Short: "Creates a Beego application",
Long: `
Creates a Beego application for the given app name in the current directory.
The command 'new' creates a folder named [appname] and generates the following structure:
main.go
{{"conf"|foldername}}
app.conf
{{"controllers"|foldername}}
default.go
{{"models"|foldername}}
{{"routers"|foldername}}
router.go
{{"tests"|foldername}}
default_test.go
{{"static"|foldername}}
{{"js"|foldername}}
{{"css"|foldername}}
{{"img"|foldername}}
{{"views"|foldername}}
index.tpl
`,
PreRun: func(cmd *Command, args []string) { ShowShortVersionBanner() },
Run: createApp,
}
2014-08-15 09:38:51 +00:00
func createApp(cmd *Command, args []string) int {
output := cmd.Out()
if len(args) != 1 {
logger.Fatal("Argument [appname] is missing")
}
apppath, packpath, err := checkEnv(args[0])
if err != nil {
logger.Fatalf("%s", err)
}
2015-05-09 10:20:08 +00:00
if isExist(apppath) {
logger.Errorf(bold("Application '%s' already exists"), apppath)
logger.Warn(bold("Do you want to overwrite it? [Yes|No] "))
2015-05-09 10:20:08 +00:00
if !askForConfirmation() {
os.Exit(2)
}
}
logger.Info("Creating application...")
os.MkdirAll(apppath, 0755)
fmt.Fprintf(output, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", apppath+string(path.Separator), "\x1b[0m")
os.Mkdir(path.Join(apppath, "conf"), 0755)
fmt.Fprintf(output, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "conf")+string(path.Separator), "\x1b[0m")
os.Mkdir(path.Join(apppath, "controllers"), 0755)
fmt.Fprintf(output, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "controllers")+string(path.Separator), "\x1b[0m")
os.Mkdir(path.Join(apppath, "models"), 0755)
fmt.Fprintf(output, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "models")+string(path.Separator), "\x1b[0m")
2013-12-23 15:45:15 +00:00
os.Mkdir(path.Join(apppath, "routers"), 0755)
fmt.Fprintf(output, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "routers")+string(path.Separator), "\x1b[0m")
2013-12-23 15:28:31 +00:00
os.Mkdir(path.Join(apppath, "tests"), 0755)
fmt.Fprintf(output, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "tests")+string(path.Separator), "\x1b[0m")
os.Mkdir(path.Join(apppath, "static"), 0755)
fmt.Fprintf(output, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "static")+string(path.Separator), "\x1b[0m")
os.Mkdir(path.Join(apppath, "static", "js"), 0755)
2017-01-27 15:57:37 +00:00
WriteToFile(path.Join(apppath, "static", "js", "reload.min.js"), reloadJsClient)
fmt.Fprintf(output, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "static", "js")+string(path.Separator), "\x1b[0m")
os.Mkdir(path.Join(apppath, "static", "css"), 0755)
fmt.Fprintf(output, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "static", "css")+string(path.Separator), "\x1b[0m")
os.Mkdir(path.Join(apppath, "static", "img"), 0755)
fmt.Fprintf(output, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "static", "img")+string(path.Separator), "\x1b[0m")
fmt.Fprintf(output, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "views")+string(path.Separator), "\x1b[0m")
os.Mkdir(path.Join(apppath, "views"), 0755)
fmt.Fprintf(output, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "conf", "app.conf"), "\x1b[0m")
2016-05-26 16:17:24 +00:00
WriteToFile(path.Join(apppath, "conf", "app.conf"), strings.Replace(appconf, "{{.Appname}}", path.Base(args[0]), -1))
fmt.Fprintf(output, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "controllers", "default.go"), "\x1b[0m")
2016-05-26 16:17:24 +00:00
WriteToFile(path.Join(apppath, "controllers", "default.go"), controllers)
fmt.Fprintf(output, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "views", "index.tpl"), "\x1b[0m")
2016-05-26 16:17:24 +00:00
WriteToFile(path.Join(apppath, "views", "index.tpl"), indextpl)
fmt.Fprintf(output, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "routers", "router.go"), "\x1b[0m")
WriteToFile(path.Join(apppath, "routers", "router.go"), strings.Replace(router, "{{.Appname}}", packpath, -1))
2013-12-23 15:28:31 +00:00
fmt.Fprintf(output, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "tests", "default_test.go"), "\x1b[0m")
WriteToFile(path.Join(apppath, "tests", "default_test.go"), strings.Replace(test, "{{.Appname}}", packpath, -1))
2013-12-23 15:28:31 +00:00
fmt.Fprintf(output, "\t%s%screate%s\t %s%s\n", "\x1b[32m", "\x1b[1m", "\x1b[21m", path.Join(apppath, "main.go"), "\x1b[0m")
WriteToFile(path.Join(apppath, "main.go"), strings.Replace(maingo, "{{.Appname}}", packpath, -1))
logger.Success("New application successfully created!")
2014-08-15 09:38:51 +00:00
return 0
}
var appconf = `appname = {{.Appname}}
httpport = 8080
runmode = dev
`
var maingo = `package main
import (
2013-12-23 16:00:52 +00:00
_ "{{.Appname}}/routers"
"github.com/astaxie/beego"
)
func main() {
beego.Run()
}
`
2013-12-23 16:00:52 +00:00
var router = `package routers
2013-12-23 15:28:31 +00:00
import (
"{{.Appname}}/controllers"
"github.com/astaxie/beego"
)
func init() {
beego.Router("/", &controllers.MainController{})
}
`
var test = `package test
import (
"net/http"
"net/http/httptest"
"testing"
2014-04-03 08:46:47 +00:00
"runtime"
"path/filepath"
2013-12-23 16:00:52 +00:00
_ "{{.Appname}}/routers"
2013-12-23 15:28:31 +00:00
"github.com/astaxie/beego"
. "github.com/smartystreets/goconvey/convey"
)
2014-04-03 08:41:44 +00:00
func init() {
_, file, _, _ := runtime.Caller(1)
apppath, _ := filepath.Abs(filepath.Dir(filepath.Join(file, ".." + string(filepath.Separator))))
2014-04-03 08:41:44 +00:00
beego.TestBeegoInit(apppath)
}
2016-11-09 12:17:55 +00:00
// TestBeego is a sample to run an endpoint test
func TestBeego(t *testing.T) {
2013-12-23 16:11:13 +00:00
r, _ := http.NewRequest("GET", "/", nil)
2013-12-23 15:28:31 +00:00
w := httptest.NewRecorder()
beego.BeeApp.Handlers.ServeHTTP(w, r)
2016-11-09 12:17:55 +00:00
beego.Trace("testing", "TestBeego", "Code[%d]\n%s", w.Code, w.Body.String())
2013-12-23 15:28:31 +00:00
Convey("Subject: Test Station Endpoint\n", t, func() {
Convey("Status Code Should Be 200", func() {
So(w.Code, ShouldEqual, 200)
})
Convey("The Result Should Not Be Empty", func() {
So(w.Body.Len(), ShouldBeGreaterThan, 0)
})
})
}
`
var controllers = `package controllers
import (
"github.com/astaxie/beego"
)
type MainController struct {
beego.Controller
}
2014-11-05 14:48:09 +00:00
func (c *MainController) Get() {
c.Data["Website"] = "beego.me"
c.Data["Email"] = "astaxie@gmail.com"
c.TplName = "index.tpl"
}
`
var indextpl = `<!DOCTYPE html>
<html>
2014-12-04 07:14:00 +00:00
<head>
<title>Beego</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel="shortcut icon" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpFNTdGOTA3OTczQTgxMUU0QTlEQUM0NEYyRkI1NEQxQiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpFNTdGOTA3QTczQTgxMUU0QTlEQUM0NEYyRkI1NEQxQiI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkU1N0Y5MDc3NzNBODExRTRBOURBQzQ0RjJGQjU0RDFCIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkU1N0Y5MDc4NzNBODExRTRBOURBQzQ0RjJGQjU0RDFCIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+lsWdMwAAIvtJREFUeNrke3d8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
<style type="text/css">
*,body {
margin: 0px;
padding: 0px;
}
body {
margin: 0px;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
font-size: 14px;
line-height: 20px;
background-color: #fff;
}
header,
footer {
width: 960px;
margin-left: auto;
margin-right: auto;
}
.logo {
background-image: url('data:image/png;base64,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
background-repeat: no-repeat;
-webkit-background-size: 100px 100px;
background-size: 100px 100px;
background-position: center center;
text-align: center;
font-size: 42px;
padding: 250px 0 70px;
font-weight: normal;
text-shadow: 0px 1px 2px #ddd;
}
header {
padding: 100px 0;
}
footer {
line-height: 1.8;
text-align: center;
padding: 50px 0;
color: #999;
}
.description {
text-align: center;
font-size: 16px;
}
a {
color: #444;
text-decoration: none;
}
.backdrop {
position: absolute;
width: 100%;
height: 100%;
box-shadow: inset 0px 0px 100px #ddd;
z-index: -1;
top: 0px;
left: 0px;
}
</style>
</head>
<body>
<header>
<h1 class="logo">Welcome to Beego</h1>
<div class="description">
Beego is a simple & powerful Go web framework which is inspired by tornado and sinatra.
</div>
</header>
<footer>
<div class="author">
Official website:
<a href="http://{{.Website}}">{{.Website}}</a> /
Contact me:
2014-12-04 07:14:00 +00:00
<a class="email" href="mailto:{{.Email}}">{{.Email}}</a>
</div>
</footer>
<div class="backdrop"></div>
2017-01-27 15:57:37 +00:00
<script src="/static/js/reload.min.js"></script>
2014-12-04 07:14:00 +00:00
</body>
</html>
`
2017-01-27 15:57:37 +00:00
var reloadJsClient = `function b(a){var c=new WebSocket(a);c.onclose=function(){setTimeout(function(){b(a)},2E3)};c.onmessage=function(){location.reload()}}try{if(window.WebSocket)try{b("ws://localhost:12450/reload")}catch(a){console.error(a)}else console.log("Your browser does not support WebSockets.")}catch(a){console.error("Exception during connecting to Reload:",a)};
`