1
0
mirror of https://github.com/hybridgroup/gobot.git synced 2025-04-27 13:48:56 +08:00
hybridgroup.gobot/gobot/generate.go

398 lines
8.1 KiB
Go
Raw Normal View History

2013-12-02 14:50:02 -08:00
package main
import (
"fmt"
2014-12-24 09:53:48 -08:00
"io/ioutil"
2013-12-02 14:50:02 -08:00
"os"
2014-06-09 19:59:59 -07:00
"strings"
2013-12-02 14:50:02 -08:00
"text/template"
2014-07-12 09:49:18 -07:00
"github.com/codegangsta/cli"
2013-12-02 14:50:02 -08:00
)
2014-06-09 19:59:59 -07:00
type generate struct {
Name string
UpperName string
FirstLetter string
2013-12-02 14:50:02 -08:00
}
2014-06-09 19:59:59 -07:00
func Generate() cli.Command {
return cli.Command{
Name: "generate",
Usage: "Generate new Gobot skeleton project",
Action: func(c *cli.Context) {
args := c.Args()
if len(args) == 0 || len(args) > 1 {
fmt.Println("Please provide a one word package name.")
return
}
pwd, _ := os.Getwd()
2014-12-24 09:53:48 -08:00
dir := fmt.Sprintf("%s/%s", pwd, "gobot-"+args[0])
2014-06-09 19:59:59 -07:00
fmt.Println("Creating", dir)
err := os.MkdirAll(dir, 0700)
if err != nil {
fmt.Println(err)
err = nil
}
2014-12-24 09:53:48 -08:00
examplesDir := dir + "/examples"
fmt.Println("Creating", examplesDir)
err = os.MkdirAll(examplesDir, 0700)
if err != nil {
fmt.Println(err)
err = nil
}
2014-07-12 09:49:18 -07:00
upperName := fmt.Sprintf("%s%s",
strings.ToUpper(string(args[0][0])),
string(args[0][1:]))
2014-06-09 19:59:59 -07:00
2014-07-12 09:49:18 -07:00
name := generate{
UpperName: upperName,
Name: string(args[0]),
FirstLetter: string(args[0][0]),
}
2014-06-09 19:59:59 -07:00
adaptor, _ := template.New("").Parse(adaptor())
2014-06-10 15:16:11 -07:00
fileLocation := fmt.Sprintf("%s/%s_adaptor.go", dir, args[0])
fmt.Println("Creating", fileLocation)
f, err := os.Create(fileLocation)
2014-06-09 19:59:59 -07:00
if err != nil {
fmt.Println(err)
err = nil
}
adaptor.Execute(f, name)
f.Close()
driver, _ := template.New("").Parse(driver())
2014-06-10 15:16:11 -07:00
fileLocation = fmt.Sprintf("%s/%s_driver.go", dir, args[0])
fmt.Println("Creating", fileLocation)
f, err = os.Create(fileLocation)
2014-06-09 19:59:59 -07:00
if err != nil {
fmt.Println(err)
err = nil
}
driver.Execute(f, name)
f.Close()
2014-12-24 09:53:48 -08:00
fileLocation = fmt.Sprintf("%s/LICENSE", dir)
2014-06-10 15:16:11 -07:00
fmt.Println("Creating", fileLocation)
f, err = os.Create(fileLocation)
2014-06-09 19:59:59 -07:00
if err != nil {
fmt.Println(err)
err = nil
}
f.Close()
2014-12-24 09:53:48 -08:00
driverTest, _ := template.New("").Parse(driverTest())
fileLocation = fmt.Sprintf("%s/%s_driver_test.go", dir, args[0])
2014-06-10 15:16:11 -07:00
fmt.Println("Creating", fileLocation)
f, err = os.Create(fileLocation)
2014-06-09 19:59:59 -07:00
if err != nil {
fmt.Println(err)
err = nil
}
2014-12-24 09:53:48 -08:00
driverTest.Execute(f, name)
2014-06-09 19:59:59 -07:00
f.Close()
2014-12-24 09:53:48 -08:00
adaptorTest, _ := template.New("").Parse(adaptorTest())
fileLocation = fmt.Sprintf("%s/%s_adaptor_test.go", dir, args[0])
2014-06-10 15:16:11 -07:00
fmt.Println("Creating", fileLocation)
f, err = os.Create(fileLocation)
2014-06-09 19:59:59 -07:00
if err != nil {
fmt.Println(err)
err = nil
}
2014-12-24 09:53:48 -08:00
adaptorTest.Execute(f, name)
2014-06-09 19:59:59 -07:00
f.Close()
2014-12-24 09:53:48 -08:00
example, _ := template.New("").Parse(example())
fileLocation = fmt.Sprintf("%s/main.go", examplesDir)
2014-06-10 15:16:11 -07:00
fmt.Println("Creating", fileLocation)
f, err = os.Create(fileLocation)
2014-06-09 19:59:59 -07:00
if err != nil {
fmt.Println(err)
err = nil
}
2014-12-24 09:53:48 -08:00
example.Execute(f, name)
f.Close()
readme, _ := template.New("").Parse(readme())
fileLocation = fmt.Sprintf("%s/README.md", dir)
fmt.Println("Creating", fileLocation)
f, err = os.Create(fileLocation)
if err != nil {
fmt.Println(err)
err = nil
}
ex, _ := ioutil.ReadFile(examplesDir + "/main.go")
data := struct {
Name string
Example string
}{
name.Name,
string(ex),
}
readme.Execute(f, data)
2014-06-09 19:59:59 -07:00
f.Close()
},
2014-02-24 20:18:12 -08:00
}
2013-12-02 14:50:02 -08:00
}
func adaptor() string {
2014-12-24 09:53:48 -08:00
return `package {{.Name}}
2013-12-02 14:50:02 -08:00
import (
2014-12-24 09:53:48 -08:00
"github.com/hybridgroup/gobot"
2013-12-02 14:50:02 -08:00
)
2014-12-24 09:53:48 -08:00
var _ gobot.Adaptor = (*{{.UpperName}}Adaptor)(nil)
type {{.UpperName}}Adaptor struct {
name string
2014-02-24 20:18:12 -08:00
}
2014-06-09 19:59:59 -07:00
func New{{.UpperName}}Adaptor(name string) *{{.UpperName}}Adaptor {
2014-12-24 09:53:48 -08:00
return &{{.UpperName}}Adaptor{
name: name,
}
2014-02-24 20:18:12 -08:00
}
2014-12-24 09:53:48 -08:00
func ({{.FirstLetter}} *{{.UpperName}}Adaptor) Name() string { return {{.FirstLetter}}.name }
2013-12-02 14:50:02 -08:00
2014-12-24 09:53:48 -08:00
func ({{.FirstLetter}} *{{.UpperName}}Adaptor) Connect() []error { return nil }
func ({{.FirstLetter}} *{{.UpperName}}Adaptor) Finalize() []error { return nil }
func ({{.FirstLetter}} *{{.UpperName}}Adaptor) Ping() string { return "pong" }
2013-12-02 14:50:02 -08:00
`
}
func driver() string {
2014-12-24 09:53:48 -08:00
return `package {{.Name }}
2013-12-02 14:50:02 -08:00
import (
2014-12-24 09:53:48 -08:00
"time"
"github.com/hybridgroup/gobot"
2013-12-02 14:50:02 -08:00
)
2014-12-24 09:53:48 -08:00
var _ gobot.Driver = (*{{.UpperName}}Driver)(nil)
const Hello string = "hello"
2013-12-02 14:50:02 -08:00
2014-12-24 09:53:48 -08:00
type {{.UpperName}}Driver struct {
name string
connection gobot.Connection
interval time.Duration
halt chan bool
gobot.Eventer
gobot.Commander
2014-02-24 20:18:12 -08:00
}
2014-06-09 19:59:59 -07:00
func New{{.UpperName}}Driver(a *{{.UpperName}}Adaptor, name string) *{{.UpperName}}Driver {
2014-12-24 09:53:48 -08:00
{{.FirstLetter}} := &{{.UpperName}}Driver{
name: name,
connection: a,
interval: 500*time.Millisecond,
halt: make(chan bool, 0),
Eventer: gobot.NewEventer(),
Commander: gobot.NewCommander(),
}
{{.FirstLetter}}.AddEvent(Hello)
{{.FirstLetter}}.AddCommand(Hello, func(params map[string]interface{}) interface{} {
return {{.FirstLetter}}.Hello()
})
return {{.FirstLetter}}
}
func ({{.FirstLetter}} *{{.UpperName}}Driver) Name() string { return {{.FirstLetter}}.name }
func ({{.FirstLetter}} *{{.UpperName}}Driver) Connection() gobot.Connection {
return {{.FirstLetter}}.connection
}
func ({{.FirstLetter}} *{{.UpperName}}Driver) adaptor() *{{.UpperName}}Adaptor {
return {{.FirstLetter}}.Connection().(*{{.UpperName}}Adaptor)
2013-12-02 14:50:02 -08:00
}
2014-12-24 09:53:48 -08:00
func ({{.FirstLetter}} *{{.UpperName}}Driver) Hello() string {
return "hello from " + {{.FirstLetter}}.Name() + "!"
}
func ({{.FirstLetter}} *{{.UpperName}}Driver) Ping() string {
return {{.FirstLetter}}.adaptor().Ping()
}
func ({{.FirstLetter}} *{{.UpperName}}Driver) Start() []error {
go func() {
for {
gobot.Publish({{.FirstLetter}}.Event(Hello), {{.FirstLetter}}.Hello())
select {
case <- time.After({{.FirstLetter}}.interval):
case <- {{.FirstLetter}}.halt:
return
}
}
}()
return nil
}
func ({{.FirstLetter}} *{{.UpperName}}Driver) Halt() []error {
{{.FirstLetter}}.halt <- true
return nil
2014-06-15 17:27:51 -07:00
}
2014-04-01 19:20:38 -07:00
`
}
2014-12-24 09:53:48 -08:00
func example() string {
return `
package main
2014-04-01 19:20:38 -07:00
import (
2014-12-24 09:53:48 -08:00
"../"
"fmt"
"time"
2014-06-13 15:09:04 -07:00
"github.com/hybridgroup/gobot"
2014-04-01 19:20:38 -07:00
)
2014-12-24 09:53:48 -08:00
func main() {
gbot := gobot.NewGobot()
2014-04-01 19:20:38 -07:00
2014-12-24 09:53:48 -08:00
conn := {{.Name}}.New{{.UpperName}}Adaptor("conn")
dev := {{.Name}}.New{{.UpperName}}Driver(conn, "dev")
work := func() {
gobot.On(dev.Event({{.Name}}.Hello), func(data interface{}) {
fmt.Println(data)
})
gobot.Every(1200*time.Millisecond, func() {
fmt.Println(dev.Ping())
})
}
2014-04-01 19:20:38 -07:00
2014-12-24 09:53:48 -08:00
robot := gobot.NewRobot(
"robot",
[]gobot.Connection{conn},
[]gobot.Device{dev},
work,
)
gbot.AddRobot(robot)
gbot.Start()
2014-06-13 15:09:04 -07:00
}
2014-04-01 19:20:38 -07:00
`
2013-12-02 14:50:02 -08:00
}
2014-12-24 09:53:48 -08:00
func driverTest() string {
return `package {{.Name}}
2014-04-01 19:20:38 -07:00
import (
2014-12-24 09:53:48 -08:00
"testing"
"time"
"github.com/hybridgroup/gobot"
2014-04-01 19:20:38 -07:00
)
2014-12-24 09:53:48 -08:00
func Test{{.UpperName}}Driver(t *testing.T) {
d := New{{.UpperName}}Driver(New{{.UpperName}}Adaptor("conn"), "dev")
gobot.Assert(t, d.Name(), "dev")
gobot.Assert(t, d.Connection().Name(), "conn")
ret := d.Command(Hello)(nil)
gobot.Assert(t, ret.(string), "hello from dev!")
gobot.Assert(t, d.Ping(), "pong")
gobot.Assert(t, len(d.Start()), 0)
<-time.After(d.interval)
sem := make(chan bool, 0)
gobot.On(d.Event(Hello), func(data interface{}) {
sem <- true
})
select {
case <-sem:
case <-time.After(600 * time.Millisecond):
t.Errorf("Hello Event was not published")
}
gobot.Assert(t, len(d.Halt()), 0)
gobot.On(d.Event(Hello), func(data interface{}) {
sem <- true
})
select {
case <-sem:
t.Errorf("Hello Event should not publish after Halt")
case <-time.After(600 * time.Millisecond):
}
2014-06-13 15:09:04 -07:00
}
2014-12-24 09:53:48 -08:00
`
2014-06-13 15:09:04 -07:00
}
2014-12-24 09:53:48 -08:00
func adaptorTest() string {
return `package {{.Name}}
import (
"testing"
"github.com/hybridgroup/gobot"
)
func Test{{.UpperName}}Adaptor(t *testing.T) {
a := New{{.UpperName}}Adaptor("tester")
gobot.Assert(t, a.Name(), "tester")
gobot.Assert(t, len(a.Connect()), 0)
gobot.Assert(t, a.Ping(), "pong")
gobot.Assert(t, len(a.Connect()), 0)
gobot.Assert(t, len(a.Finalize()), 0)
2013-12-02 14:50:02 -08:00
}
`
}
2014-02-24 20:18:12 -08:00
func readme() string {
2014-12-24 09:53:48 -08:00
return `# {{.Name}}
2014-02-24 20:18:12 -08:00
2014-06-09 19:59:59 -07:00
Gobot (http://gobot.io/) is a framework for robotics and physical computing using Go
2014-02-24 20:18:12 -08:00
2014-12-24 09:53:48 -08:00
This repository contains the Gobot adaptor and driver for {{.Name}}.
2014-02-24 20:18:12 -08:00
For more information about Gobot, check out the github repo at
https://github.com/hybridgroup/gobot
## Installing
2014-12-24 09:53:48 -08:00
` + "```bash\ngo get path/to/repo/{{.Name}}\n```" + `
2014-02-24 20:18:12 -08:00
## Using
2014-12-24 09:53:48 -08:00
` + "```go{{.Example}}\n```" + `
2014-02-24 20:18:12 -08:00
## Connecting
2014-12-24 09:53:48 -08:00
Explain how to connect to the device here...
2014-02-24 20:18:12 -08:00
## License
Copyright (c) 2014 Your Name Here. See LICENSE for more details
`
}