Require configuration to create Environment

This commit is contained in:
Mitchell Hashimoto 2013-04-20 19:00:03 -06:00
parent 12049e3d87
commit 116442510b
3 changed files with 57 additions and 34 deletions

View File

@ -3,10 +3,16 @@ package main
import (
"github.com/mitchellh/packer/packer"
"fmt"
"os"
)
func main() {
env := packer.NewEnvironment(nil)
env, err := packer.NewEnvironment(nil)
if err != nil {
fmt.Fprintf(os.Stderr, "Packer initialization error: \n\n%s\n", err)
os.Exit(1)
}
os.Exit(env.Cli(os.Args[1:]))
}

View File

@ -2,6 +2,7 @@
package packer
import (
"errors"
"fmt"
"os"
"sort"
@ -46,33 +47,36 @@ type EnvironmentConfig struct {
Ui Ui
}
// DefaultEnvironmentConfig returns a default EnvironmentConfig that can
// be used to create a new enviroment with NewEnvironment with sane defaults.
func DefaultEnvironmentConfig() *EnvironmentConfig {
config := &EnvironmentConfig{}
config.Ui = &ReaderWriterUi{os.Stdin, os.Stdout}
return config
}
// This creates a new environment
func NewEnvironment(config *EnvironmentConfig) *Environment {
env := &Environment{}
func NewEnvironment(config *EnvironmentConfig) (env *Environment, err error) {
if config == nil {
err = errors.New("config must be given to initialize environment")
return
}
env = &Environment{}
env.builderFactory = config.BuilderFactory
env.command = make(map[string]Command)
env.ui = config.Ui
if config != nil {
for k, v := range config.Command {
env.command[k] = v
}
env.builderFactory = config.BuilderFactory
env.ui = config.Ui
}
if _, ok := env.command["build"]; !ok {
env.command["build"] = new(buildCommand)
for k, v := range config.Command {
env.command[k] = v
}
// TODO: Should "version" be allowed to be overriden?
if _, ok := env.command["version"]; !ok {
env.command["version"] = new(versionCommand)
}
if env.ui == nil {
env.ui = &ReaderWriterUi{os.Stdin, os.Stdout}
}
return env
return
}
// Executes a command as if it was typed on the command-line interface.

View File

@ -32,7 +32,32 @@ func testEnvironment() *Environment {
new(bytes.Buffer),
}
return NewEnvironment(config)
env, err := NewEnvironment(config)
if err != nil {
panic(err)
}
return env
}
func TestEnvironment_DefaultConfig_Ui(t *testing.T) {
assert := asserts.NewTestingAsserts(t, true)
config := DefaultEnvironmentConfig()
assert.NotNil(config.Ui, "default UI should not be nil")
rwUi, ok := config.Ui.(*ReaderWriterUi)
assert.True(ok, "default UI should be ReaderWriterUi")
assert.Equal(rwUi.Writer, os.Stdout, "default UI should go to stdout")
assert.Equal(rwUi.Reader, os.Stdin, "default UI should read from stdin")
}
func TestNewEnvironment_NoConfig(t *testing.T) {
assert := asserts.NewTestingAsserts(t, true)
env, err := NewEnvironment(nil)
assert.Nil(env, "env should be nil")
assert.NotNil(err, "should be an error")
}
func TestEnvironment_Cli_CallsRun(t *testing.T) {
@ -44,7 +69,7 @@ func TestEnvironment_Cli_CallsRun(t *testing.T) {
config.Command = make(map[string]Command)
config.Command["foo"] = command
env := NewEnvironment(config)
env, _ := NewEnvironment(config)
assert.Equal(env.Cli([]string{"foo", "bar", "baz"}), 0, "runs foo command")
assert.True(command.runCalled, "run should've been called")
assert.Equal(command.runEnv, env, "should've ran with env")
@ -99,18 +124,6 @@ func TestEnvironment_DefaultCli_Version(t *testing.T) {
assert.Equal(defaultEnv.Cli([]string{"bad", "version"}), 1, "version should NOT work anywhere")
}
func TestEnvironment_DefaultUi(t *testing.T) {
assert := asserts.NewTestingAsserts(t, true)
defaultEnv := NewEnvironment(nil)
assert.NotNil(defaultEnv.Ui(), "default UI should not be nil")
rwUi, ok := defaultEnv.Ui().(*ReaderWriterUi)
assert.True(ok, "default UI should be ReaderWriterUi")
assert.Equal(rwUi.Writer, os.Stdout, "default UI should go to stdout")
assert.Equal(rwUi.Reader, os.Stdin, "default UI should read from stdin")
}
func TestEnvironment_PrintHelp(t *testing.T) {
// Just call the function and verify that no panics occur
testEnvironment().PrintHelp()
@ -124,7 +137,7 @@ func TestEnvironment_SettingUi(t *testing.T) {
config := &EnvironmentConfig{}
config.Ui = ui
env := NewEnvironment(config)
env, _ := NewEnvironment(config)
assert.Equal(env.Ui(), ui, "UIs should be equal")
}