From 17e7d40d3140feef55950fd8656ce706e97f5d42 Mon Sep 17 00:00:00 2001 From: NotZippy Date: Wed, 20 Sep 2017 13:13:10 -0700 Subject: [PATCH] Fixed missing debug context parameter name Added check to see if specfication was not exported Added warnings if expected types did not match specification --- harness/app.go | 14 ++++----- harness/build.go | 2 +- harness/reflect.go | 41 ++++++++++++++++++++++++--- revel/run.go | 10 +++---- revel/skeleton/conf/app.conf.template | 12 ++++---- 5 files changed, 55 insertions(+), 24 deletions(-) diff --git a/harness/app.go b/harness/app.go index bb37069..5423f8c 100644 --- a/harness/app.go +++ b/harness/app.go @@ -60,9 +60,9 @@ func NewAppCmd(binPath string, port int) AppCmd { func (cmd AppCmd) Start() error { listeningWriter := &startupListeningWriter{os.Stdout, make(chan bool)} cmd.Stdout = listeningWriter - revel.RevelLog.Debug("Exec app:","path", cmd.Path,"args", cmd.Args) + revel.RevelLog.Debug("Exec app:", "path", cmd.Path, "args", cmd.Args) if err := cmd.Cmd.Start(); err != nil { - revel.RevelLog.Fatal("Error running:","error", err) + revel.RevelLog.Fatal("Error running:", "error", err) } select { @@ -70,7 +70,7 @@ func (cmd AppCmd) Start() error { return errors.New("revel/harness: app died") case <-time.After(30 * time.Second): - revel.RevelLog.Debug("Killing revel server process did not respond after wait timeout", cmd.Process.Pid) + revel.RevelLog.Debug("Killing revel server process did not respond after wait timeout", "processid", cmd.Process.Pid) cmd.Kill() return errors.New("revel/harness: app timed out") @@ -84,19 +84,19 @@ func (cmd AppCmd) Start() error { // Run the app server inline. Never returns. func (cmd AppCmd) Run() { - revel.RevelLog.Debug("Exec app:","path", cmd.Path,"args", cmd.Args) + revel.RevelLog.Debug("Exec app:", "path", cmd.Path, "args", cmd.Args) if err := cmd.Cmd.Run(); err != nil { - revel.RevelLog.Fatal("Error running:","error", err) + revel.RevelLog.Fatal("Error running:", "error", err) } } // Kill terminates the app server if it's running. func (cmd AppCmd) Kill() { if cmd.Cmd != nil && (cmd.ProcessState == nil || !cmd.ProcessState.Exited()) { - revel.RevelLog.Debug("Killing revel server pid","pid", cmd.Process.Pid) + revel.RevelLog.Debug("Killing revel server pid", "pid", cmd.Process.Pid) err := cmd.Process.Kill() if err != nil { - revel.RevelLog.Fatal("Failed to kill revel server:","error", err) + revel.RevelLog.Fatal("Failed to kill revel server:", "error", err) } } } diff --git a/harness/build.go b/harness/build.go index f8a3e12..b70efbe 100755 --- a/harness/build.go +++ b/harness/build.go @@ -393,7 +393,7 @@ var ( func main() { flag.Parse() revel.Init(*runMode, *importPath, *srcPath) - revel.INFO.Println("Running revel server") + revel.AppLog.Info("Running revel server") {{range $i, $c := .Controllers}} revel.RegisterController((*{{index $.ImportPaths .ImportPath}}.{{.StructName}})(nil), []*revel.MethodType{ diff --git a/harness/reflect.go b/harness/reflect.go index 406d06d..244aaa8 100644 --- a/harness/reflect.go +++ b/harness/reflect.go @@ -18,6 +18,7 @@ import ( "strings" "github.com/revel/revel" + "unicode" ) // SourceInfo is the top-level struct containing all extracted information @@ -335,6 +336,7 @@ func appendStruct(specs []*TypeInfo, pkgImportPath string, pkg *ast.Package, dec if !found { return specs } + structType := spec.Type.(*ast.StructType) // At this point we know it's a type declaration for a struct. @@ -462,7 +464,7 @@ func appendAction(fset *token.FileSet, mm methodMap, decl ast.Decl, pkgImportPat } else if typeExpr.PkgName != "" { var ok bool if importPath, ok = imports[typeExpr.PkgName]; !ok { - revel.RevelLog.Errorf("Failed to find import for arg of type: %s , %s",typeExpr.PkgName, typeExpr.TypeName("")) + revel.RevelLog.Errorf("Failed to find import for arg of type: %s , %s", typeExpr.PkgName, typeExpr.TypeName("")) } } method.Args = append(method.Args, &MethodArg{ @@ -661,7 +663,7 @@ func getStructTypeDecl(decl ast.Decl, fset *token.FileSet) (spec *ast.TypeSpec, // TypesThatEmbed returns all types that (directly or indirectly) embed the // target type, which must be a fully qualified type name, // e.g. "github.com/revel/revel.Controller" -func (s *SourceInfo) TypesThatEmbed(targetType string) (filtered []*TypeInfo) { +func (s *SourceInfo) TypesThatEmbed(targetType, packageFilter string) (filtered []*TypeInfo) { // Do a search in the "embedded type graph", starting with the target type. var ( nodeQueue = []string{targetType} @@ -693,6 +695,37 @@ func (s *SourceInfo) TypesThatEmbed(targetType string) (filtered []*TypeInfo) { } } } + // Strip out any specifications that contain a lower case + for exit := false; !exit; exit = true { + for i, filteredItem := range filtered { + if unicode.IsLower([]rune(filteredItem.StructName)[0]) { + revel.RevelLog.Debug("Skipping adding spec for unexported type", + "type", filteredItem.StructName, + "package", filteredItem.ImportPath) + filtered = append(filtered[:i], filtered[i+1:]...) + exit = false + break + } + } + } + + // Check for any missed types that where from expected packages + for _, spec := range s.StructSpecs { + if spec.PackageName == packageFilter { + found := false + for _, filteredItem := range filtered { + if filteredItem.StructName == spec.StructName { + found = true + break + } + } + if !found { + revel.RevelLog.Warn("Type found in package: "+packageFilter+ + ", but did not inherit from: "+filepath.Base(targetType), + "name", spec.StructName, "path", spec.ImportPath) + } + } + } return } @@ -700,7 +733,7 @@ func (s *SourceInfo) TypesThatEmbed(targetType string) (filtered []*TypeInfo) { // `revel.Controller` func (s *SourceInfo) ControllerSpecs() []*TypeInfo { if s.controllerSpecs == nil { - s.controllerSpecs = s.TypesThatEmbed(revel.RevelImportPath + ".Controller") + s.controllerSpecs = s.TypesThatEmbed(revel.RevelImportPath+".Controller", "controllers") } return s.controllerSpecs } @@ -709,7 +742,7 @@ func (s *SourceInfo) ControllerSpecs() []*TypeInfo { // `testing.TestSuite` func (s *SourceInfo) TestSuites() []*TypeInfo { if s.testSuites == nil { - s.testSuites = s.TypesThatEmbed(revel.RevelImportPath + "/testing.TestSuite") + s.testSuites = s.TypesThatEmbed(revel.RevelImportPath+"/testing.TestSuite", "testsuite") } return s.testSuites } diff --git a/revel/run.go b/revel/run.go index 2d181d3..a8cb8b5 100644 --- a/revel/run.go +++ b/revel/run.go @@ -91,7 +91,7 @@ func parseRunArgs(args []string) *RunArgs { // 3. revel run [run-mode] _, err := build.Import(args[0], "", build.FindOnly) if err != nil { - revel.WARN.Printf("Unable to run using an import path, assuming import path is working directory %s %s", args[0], err.Error()) + revel.RevelLog.Warn("Unable to run using an import path, assuming import path is working directory %s %s", "Argument", args[0], "error", err.Error()) } println("Trying to build with", args[0], err) if err == nil { @@ -121,18 +121,18 @@ func runApp(args []string) { runArgs.Port = revel.HTTPPort } - revel.INFO.Printf("Running %s (%s) in %s mode\n", revel.AppName, revel.ImportPath, runArgs.Mode) - revel.TRACE.Println("Base path:", revel.BasePath) + revel.RevelLog.Infof("Running %s (%s) in %s mode\n", revel.AppName, revel.ImportPath, runArgs.Mode) + revel.RevelLog.Debug("Base path:", "path", revel.BasePath) // If the app is run in "watched" mode, use the harness to run it. if revel.Config.BoolDefault("watch", true) && revel.Config.BoolDefault("watch.code", true) { - revel.TRACE.Println("Running in watched mode.") + revel.RevelLog.Debug("Running in watched mode.") revel.HTTPPort = runArgs.Port harness.NewHarness().Run() // Never returns. } // Else, just build and run the app. - revel.TRACE.Println("Running in live build mode.") + revel.RevelLog.Debug("Running in live build mode.") app, err := harness.Build() if err != nil { errorf("Failed to build app: %s", err) diff --git a/revel/skeleton/conf/app.conf.template b/revel/skeleton/conf/app.conf.template index f091181..55665c6 100644 --- a/revel/skeleton/conf/app.conf.template +++ b/revel/skeleton/conf/app.conf.template @@ -170,13 +170,13 @@ module.testrunner = github.com/revel/modules/testrunner # Log to Os's standard error output. Default value. # "relative/path/to/log" # Log to file. -log.all.filter.module.app = stdout # Log all loggers for the application to the stdout -log.error.output = stderr # Log all loggers for Revel errors to the stderr +log.all.filter.module.app = stdout # Log all loggers for the application to the stdout +log.error.nfilter.module.app = stderr # Everything else that logs an error to stderr # Revel request access log # Access log line format: # INFO 21:53:55 static server-engine.go:169: Request Stats ip=127.0.0.1 path=/public/vendors/datatables.net-buttons/js/buttons.html5.min.js method=GET start=2017/08/31 21:53:55 status=200 duration_seconds=0.0002583 section=requestlog -log.request.output = stderr +log.request.output = stdout @@ -199,9 +199,7 @@ module.testrunner = log.warn.output = log/%(app.name)s.log # Log all loggers for the application to the stdout log.error.output = log/%(app.name)s.log # Log all errors to the stdout -# Revel request access log -# Access log line format: -# INFO 21:53:55 static server-engine.go:169: Request Stats ip=127.0.0.1 path=/public/vendors/datatables.net-buttons/js/buttons.html5.min.js method=GET start=2017/08/31 21:53:55 status=200 duration_seconds=0.0002583 section=requestlog +# Revel request access log (json format) # Example: # log.request.output = %(app.name)s-request.json -log.request.output = log/requests.json +log.request.output = log/%(app.name)s-requests.json