From bf9a052462e0470b3d76267f5963072364bbc8b5 Mon Sep 17 00:00:00 2001 From: Mike Gehard Date: Sun, 25 Aug 2013 19:24:58 -0600 Subject: [PATCH] Clean up usage of homedir and removing ~. Closes #2 --- src/exercism/config.go | 34 ++++++++-------------------------- src/exercism/config_test.go | 23 +---------------------- src/exercism/exercism_test.go | 4 +--- src/exercism/fileutils.go | 25 +++++++++++++++++++++++++ src/exercism/fileutils_test.go | 11 +++++++++++ src/main/exercism.go | 30 ++++++++---------------------- 6 files changed, 54 insertions(+), 73 deletions(-) create mode 100644 src/exercism/fileutils.go create mode 100644 src/exercism/fileutils_test.go diff --git a/src/exercism/config.go b/src/exercism/config.go index 726e31496..66ae69b18 100644 --- a/src/exercism/config.go +++ b/src/exercism/config.go @@ -3,12 +3,17 @@ package exercism import ( "encoding/json" "io/ioutil" - "os/user" - "strings" ) const FILENAME = ".exercism.go" +type Config struct { + GithubUsername string `json:"githubUsername"` + ApiKey string `json:"apiKey"` + ExercismDirectory string `json:"exercismDirectory"` + Hostname string `json:"hostname"` +} + func ConfigFromFile(dir string) (c Config, err error) { bytes, err := ioutil.ReadFile(configFilename(dir)) if err != nil { @@ -19,39 +24,16 @@ func ConfigFromFile(dir string) (c Config, err error) { return } -func ConfigToFile(u user.User, dir string, c Config) (err error) { - expandedPath, err := replaceTilde(u, c.ExercismDirectory) - if err != nil { - return - } - - c.ExercismDirectory = expandedPath +func ConfigToFile(dir string, c Config) (err error) { bytes, err := json.Marshal(c) if err != nil { return } err = ioutil.WriteFile(configFilename(dir), bytes, 0644) - if err != nil { - return - } - return } -type Config struct { - GithubUsername string `json:"githubUsername"` - ApiKey string `json:"apiKey"` - ExercismDirectory string `json:"exercismDirectory"` - Hostname string `json:"hostname"` -} - func configFilename(dir string) string { return dir + "/" + FILENAME } - -func replaceTilde(u user.User, oldPath string) (newPath string, err error) { - dir := u.HomeDir - newPath = strings.Replace(oldPath, "~/", dir+"/", 1) - return -} diff --git a/src/exercism/config_test.go b/src/exercism/config_test.go index 3b0f1b0d9..dd3b8c335 100644 --- a/src/exercism/config_test.go +++ b/src/exercism/config_test.go @@ -3,7 +3,6 @@ package exercism import ( "github.com/stretchr/testify/assert" "io/ioutil" - "os/user" "testing" ) @@ -17,30 +16,10 @@ func TestReadingWritingConfig(t *testing.T) { ExercismDirectory: "/exercism/directory", } - u := user.User{HomeDir: "/Users/foo"} - ConfigToFile(u, tmpDir, writtenConfig) + ConfigToFile(tmpDir, writtenConfig) loadedConfig, err := ConfigFromFile(tmpDir) assert.NoError(t, err) assert.Equal(t, writtenConfig, loadedConfig) } - -func TestExpandsTildeInExercismDirectory(t *testing.T) { - tmpDir, err := ioutil.TempDir("", "") - assert.NoError(t, err) - - writtenConfig := Config{ - GithubUsername: "user", - ApiKey: "MyKey", - ExercismDirectory: "~/exercism/directory", - } - - u := user.User{HomeDir: "/Users/foo"} - ConfigToFile(u, tmpDir, writtenConfig) - - loadedConfig, err := ConfigFromFile(tmpDir) - assert.NoError(t, err) - - assert.Equal(t, loadedConfig.ExercismDirectory, "/Users/foo/exercism/directory") -} diff --git a/src/exercism/exercism_test.go b/src/exercism/exercism_test.go index 172d70f86..d22154d7e 100644 --- a/src/exercism/exercism_test.go +++ b/src/exercism/exercism_test.go @@ -4,7 +4,6 @@ import ( "github.com/stretchr/testify/assert" "io/ioutil" "os" - "os/user" "testing" ) @@ -22,8 +21,7 @@ func TestLogoutDeletesConfigFile(t *testing.T) { c := Config{} - user := user.User{HomeDir: "/Users/foo"} - ConfigToFile(user, tmpDir, c) + ConfigToFile(tmpDir, c) Logout(tmpDir) diff --git a/src/exercism/fileutils.go b/src/exercism/fileutils.go new file mode 100644 index 000000000..1e05c8888 --- /dev/null +++ b/src/exercism/fileutils.go @@ -0,0 +1,25 @@ +package exercism + +import ( + "os" + "runtime" + "strings" +) + +func ReplaceTilde(oldPath string) string { + return strings.Replace(oldPath, "~/", HomeDir()+"/", 1) +} + +// See: http://stackoverflow.com/questions/7922270/obtain-users-home-directory +// we can't cross compile using cgo and use user.Current() +func HomeDir() string { + if runtime.GOOS == "windows" { + home := os.Getenv("HOMEDRIVE") + os.Getenv("HOMEPATH") + if home == "" { + home = os.Getenv("USERPROFILE") + } + return home + } + + return os.Getenv("HOME") +} diff --git a/src/exercism/fileutils_test.go b/src/exercism/fileutils_test.go new file mode 100644 index 000000000..87d433882 --- /dev/null +++ b/src/exercism/fileutils_test.go @@ -0,0 +1,11 @@ +package exercism + +import ( + "github.com/stretchr/testify/assert" + "testing" +) + +func TestExpandsTildeInExercismDirectory(t *testing.T) { + expandedDir := ReplaceTilde("~/exercism/directory") + assert.NotContains(t, "~", expandedDir) +} diff --git a/src/main/exercism.go b/src/main/exercism.go index e6382a940..5d5924b10 100644 --- a/src/main/exercism.go +++ b/src/main/exercism.go @@ -5,7 +5,6 @@ import ( "fmt" "github.com/codegangsta/cli" "os" - "os/user" ) func main() { @@ -19,7 +18,7 @@ func main() { ShortName: "d", Usage: "Fetch first assignment for each language from exercism.io", Action: func(c *cli.Context) { - config, err := exercism.ConfigFromFile(homeDir()) + config, err := exercism.ConfigFromFile(exercism.HomeDir()) if err != nil { fmt.Println("Are you sure you are logged in? Please login again.") return @@ -44,7 +43,7 @@ func main() { ShortName: "f", Usage: "Fetch current assignment from exercism.io", Action: func(c *cli.Context) { - config, err := exercism.ConfigFromFile(homeDir()) + config, err := exercism.ConfigFromFile(exercism.HomeDir()) if err != nil { fmt.Println("Are you sure you are logged in? Please login again.") return @@ -69,11 +68,7 @@ func main() { ShortName: "l", Usage: "Save exercism.io api credentials", Action: func(c *cli.Context) { - usr, err := user.Current() - if err != nil { - panic(nil) - } - exercism.ConfigToFile(*usr, homeDir(), askForConfigInfo()) + exercism.ConfigToFile(exercism.HomeDir(), askForConfigInfo()) }, }, { @@ -81,7 +76,7 @@ func main() { ShortName: "o", Usage: "Clear exercism.io api credentials", Action: func(c *cli.Context) { - exercism.Logout(homeDir()) + exercism.Logout(exercism.HomeDir()) }, }, { @@ -89,7 +84,7 @@ func main() { ShortName: "p", Usage: "Fetch upcoming assignment from exercism.io", Action: func(c *cli.Context) { - config, err := exercism.ConfigFromFile(homeDir()) + config, err := exercism.ConfigFromFile(exercism.HomeDir()) if err != nil { fmt.Println("Are you sure you are logged in? Please login again.") return @@ -114,7 +109,7 @@ func main() { ShortName: "s", Usage: "Submit code to exercism.io on your current assignment", Action: func(c *cli.Context) { - config, err := exercism.ConfigFromFile(homeDir()) + config, err := exercism.ConfigFromFile(exercism.HomeDir()) if err != nil { fmt.Println("Are you sure you are logged in? Please login again.") return @@ -148,7 +143,7 @@ func main() { ShortName: "w", Usage: "Get the github username that you are logged in as", Action: func(c *cli.Context) { - config, err := exercism.ConfigFromFile(homeDir()) + config, err := exercism.ConfigFromFile(exercism.HomeDir()) if err != nil { fmt.Println("Are you sure you are logged in? Please login again.") return @@ -161,15 +156,6 @@ func main() { app.Run(os.Args) } -func homeDir() string { - user, err := user.Current() - if err != nil { - panic(err) - } - - return user.HomeDir -} - func askForConfigInfo() (c exercism.Config) { var un, key, dir string @@ -202,5 +188,5 @@ func askForConfigInfo() (c exercism.Config) { dir = currentDir } - return exercism.Config{un, key, dir, "http://exercism.io"} + return exercism.Config{un, key, exercism.ReplaceTilde(dir), "http://exercism.io"} }