Merge lp:~rogpeppe/pyjuju/testing2 into lp:pyjuju/go

Proposed by Roger Peppe
Status: Work in progress
Proposed branch: lp:~rogpeppe/pyjuju/testing2
Merge into: lp:pyjuju/go
Diff against target: 238 lines (+199/-1)
5 files modified
charm/config.go (+1/-1)
cloudinit/cloudinit_test.go (+1/-0)
control/bootstrap.go (+28/-0)
control/command.go (+69/-0)
control/command_test.go (+100/-0)
To merge this branch: bzr merge lp:~rogpeppe/pyjuju/testing2
Reviewer Review Type Date Requested Status
Juju Engineering Pending
Review via email: mp+89091@code.launchpad.net

Description of the change

To post a comment you must log in.

Unmerged revisions

38. By William Reade

merge go-add-control-package

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'charm/config.go'
--- charm/config.go 2011-12-19 09:59:01 +0000
+++ charm/config.go 2012-01-18 17:42:24 +0000
@@ -1,8 +1,8 @@
1package charm1package charm
22
3import (3import (
4 "errors"
4 "fmt"5 "fmt"
5 "errors"
6 "io"6 "io"
7 "io/ioutil"7 "io/ioutil"
8 "launchpad.net/goyaml"8 "launchpad.net/goyaml"
99
=== modified file 'cloudinit/cloudinit_test.go'
--- cloudinit/cloudinit_test.go 2011-12-14 12:53:47 +0000
+++ cloudinit/cloudinit_test.go 2012-01-18 17:42:24 +0000
@@ -6,6 +6,7 @@
6 "launchpad.net/juju/go/cloudinit"6 "launchpad.net/juju/go/cloudinit"
7 "testing"7 "testing"
8)8)
9
9// TODO integration tests, but how?10// TODO integration tests, but how?
1011
11type S struct{}12type S struct{}
1213
=== added directory 'control'
=== added file 'control/bootstrap.go'
--- control/bootstrap.go 1970-01-01 00:00:00 +0000
+++ control/bootstrap.go 2012-01-18 17:42:24 +0000
@@ -0,0 +1,28 @@
1package control
2
3import "flag"
4import "fmt"
5
6type BootstrapCommand struct {
7 environment string
8}
9
10var _ Command = (*BootstrapCommand)(nil)
11
12func (c *BootstrapCommand) Parse(args []string) error {
13 fs := flag.NewFlagSet("bootstrap", flag.ExitOnError)
14 fs.StringVar(&c.environment, "e", "", "juju environment to operate in")
15 fs.StringVar(&c.environment, "environment", "", "juju environment to operate in")
16 if err := fs.Parse(args); err != nil {
17 return err
18 }
19 if len(fs.Args()) != 0 {
20 return fmt.Errorf("Unknown args: %s", fs.Args())
21 }
22 return nil
23}
24
25func (c *BootstrapCommand) Run() error {
26 fmt.Println("Running bootstrap in environment ", c.environment)
27 return nil
28}
029
=== added file 'control/command.go'
--- control/command.go 1970-01-01 00:00:00 +0000
+++ control/command.go 2012-01-18 17:42:24 +0000
@@ -0,0 +1,69 @@
1package control
2
3import "fmt"
4import "flag"
5
6type Command interface {
7 Parse(args []string) error
8 Run() error
9}
10
11type JujuCommand struct {
12 logfile string
13 verbose bool
14 subcmds map[string]Command
15 subcmd Command
16}
17
18func (c *JujuCommand) Logfile() string {
19 return c.logfile
20}
21
22func (c *JujuCommand) Verbose() bool {
23 return c.verbose
24}
25
26func (c *JujuCommand) Register(name string, subcmd Command) error {
27 if c.subcmds == nil {
28 c.subcmds = make(map[string]Command)
29 }
30 _, alreadythere := c.subcmds[name]
31 if alreadythere {
32 return fmt.Errorf("subcommand %s already registered", name)
33 }
34 c.subcmds[name] = subcmd
35 return nil
36}
37
38func (c *JujuCommand) Parse(args []string) error {
39 if len(args) == 0 {
40 return fmt.Errorf("no args to parse")
41 }
42 fs := flag.NewFlagSet(args[0], flag.ExitOnError)
43 fs.StringVar(&c.logfile, "l", "", "where to log to")
44 fs.StringVar(&c.logfile, "log-file", "", "where to log to")
45 fs.BoolVar(&c.verbose, "v", false, "whether to be noisy")
46 fs.BoolVar(&c.verbose, "verbose", false, "whether to be noisy")
47 if err := fs.Parse(args[1:]); err != nil {
48 return err
49 }
50 return c.parseSubcmd(fs.Args())
51}
52
53func (c *JujuCommand) parseSubcmd(args []string) error {
54 if len(args) == 0 {
55 return fmt.Errorf("no subcommand specified")
56 }
57 if c.subcmds == nil {
58 return fmt.Errorf("no subcommands registered")
59 }
60 exists := false
61 if c.subcmd, exists = c.subcmds[args[0]]; !exists {
62 return fmt.Errorf("no %s subcommand registered", args[0])
63 }
64 return c.subcmd.Parse(args[1:])
65}
66
67func (c *JujuCommand) Run() error {
68 return c.subcmd.Run()
69}
070
=== added file 'control/command_test.go'
--- control/command_test.go 1970-01-01 00:00:00 +0000
+++ control/command_test.go 2012-01-18 17:42:24 +0000
@@ -0,0 +1,100 @@
1package control_test
2
3import (
4 "flag"
5 . "launchpad.net/gocheck"
6 "launchpad.net/juju/go/control"
7 "testing"
8)
9
10func Test(t *testing.T) { TestingT(t) }
11
12type CommandSuite struct{}
13
14var _ = Suite(&CommandSuite{})
15
16type testCommand struct {
17 value string
18}
19
20func (c *testCommand) Parse(args []string) error {
21 fs := flag.NewFlagSet("defenestrate", flag.ContinueOnError)
22 fs.StringVar(&c.value, "value", "", "doc")
23 return fs.Parse(args)
24}
25
26func (c *testCommand) Run() error {
27 return nil
28}
29
30func parseEmpty(args []string) (*control.JujuCommand, error) {
31 jc := new(control.JujuCommand)
32 err := jc.Parse(args)
33 return jc, err
34}
35
36func parseDefenestrate(args []string) (*control.JujuCommand, *testCommand, error) {
37 jc := new(control.JujuCommand)
38 tc := new(testCommand)
39 jc.Register("defenestrate", tc)
40 err := jc.Parse(args)
41 return jc, tc, err
42}
43
44func (s *CommandSuite) TestSubcommandDispatch(c *C) {
45 _, err := parseEmpty([]string{"juju"})
46 c.Assert(err, ErrorMatches, `no subcommand specified`)
47
48 _, err = parseEmpty([]string{"juju", "defenstrate"})
49 c.Assert(err, ErrorMatches, `no subcommands registered`)
50
51 _, _, err = parseDefenestrate([]string{"juju", "discombobulate"})
52 c.Assert(err, ErrorMatches, `no discombobulate subcommand registered`)
53
54 _, tc, err := parseDefenestrate([]string{"juju", "defenestrate"})
55 c.Assert(err, IsNil)
56 c.Assert(tc.value, Equals, "")
57
58 _, tc, err = parseDefenestrate([]string{"juju", "defenestrate", "--value", "firmly"})
59 c.Assert(err, IsNil)
60 c.Assert(tc.value, Equals, "firmly")
61
62 _, tc, err = parseDefenestrate([]string{"juju", "defenestrate", "--gibberish", "burble"})
63 c.Assert(err, ErrorMatches, "flag provided but not defined: -gibberish")
64}
65
66func (s *CommandSuite) TestVerbose(c *C) {
67 jc, err := parseEmpty([]string{"juju"})
68 c.Assert(err, ErrorMatches, "no subcommand specified")
69 c.Assert(jc.Verbose(), Equals, false)
70
71 jc, _, err = parseDefenestrate([]string{"juju", "defenestrate"})
72 c.Assert(err, IsNil)
73 c.Assert(jc.Verbose(), Equals, false)
74
75 jc, err = parseEmpty([]string{"juju", "--verbose"})
76 c.Assert(err, ErrorMatches, "no subcommand specified")
77 c.Assert(jc.Verbose(), Equals, true)
78
79 jc, _, err = parseDefenestrate([]string{"juju", "-v", "defenestrate"})
80 c.Assert(err, IsNil)
81 c.Assert(jc.Verbose(), Equals, true)
82}
83
84func (s *CommandSuite) TestLogfile(c *C) {
85 jc, err := parseEmpty([]string{"juju"})
86 c.Assert(err, ErrorMatches, "no subcommand specified")
87 c.Assert(jc.Logfile(), Equals, "")
88
89 jc, _, err = parseDefenestrate([]string{"juju", "defenestrate"})
90 c.Assert(err, IsNil)
91 c.Assert(jc.Logfile(), Equals, "")
92
93 jc, err = parseEmpty([]string{"juju", "-l", "foo"})
94 c.Assert(err, ErrorMatches, "no subcommand specified")
95 c.Assert(jc.Logfile(), Equals, "foo")
96
97 jc, _, err = parseDefenestrate([]string{"juju", "--log-file", "bar", "defenestrate"})
98 c.Assert(err, IsNil)
99 c.Assert(jc.Logfile(), Equals, "bar")
100}

Subscribers

People subscribed via source and target branches

to all changes: