aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/datamaps/config.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/datamaps/config.go')
-rw-r--r--pkg/datamaps/config.go267
1 files changed, 0 insertions, 267 deletions
diff --git a/pkg/datamaps/config.go b/pkg/datamaps/config.go
deleted file mode 100644
index ec6f91e..0000000
--- a/pkg/datamaps/config.go
+++ /dev/null
@@ -1,267 +0,0 @@
-package datamaps
-
-import (
- "log"
- "os"
- "path/filepath"
-)
-
-const (
- configDirName = "datamaps"
- dbName = "datamaps.db"
-)
-
-// Help text.
-const Usage = `
-usage: datamaps COMMAND [OPTIONS]
-
--Managing datamap files-
-
-Command: datamap
-
-All datamap related actions. Before datamaps can do much, it must know about a datamap.
-A datamap starts life as a CSV file with the format:
-
-cell_key,template_sheet,cell_reference,type
-key1,sheet1,A10,TEXT
-key2,sheet1,A11,NUMBER
-...
-
-Options:
- --import PATH Import a datamap the csv datamap at PATH
- --datamapname NAME Name for imported datamap
-`
-
-// mocking funcs in go https://stackoverflow.com/questions/19167970/mock-functions-in-go
-// we only need the func signature to create the type. This is pretty weird, we're want to mock
-// os.UserHomeDir so that we can set it to something like /tmp in our tests. Here we are creating
-// two types: getUserConfigDir to represent the os.UserConfigDir function, dbPathChecker as a wrapper
-// which which we can assign methods to that holds the value of the func os.UserConfigDir and the
-// method, check(), which does the work, using the passed in func to determine the user $HOME/.config
-// directory.
-// Which is a lot of work for what it is, but it does make this testable and serves as an example
-// of how things could be done in Go.
-
-// getUserConfigDir allows replaces os.UserConfigDir
-// for testing purposes.
-type getUserConfigDir func() (string, error)
-
-// DBPathChecker contains the func used to create the user config dir.
-type DBPathChecker struct {
- userConfig getUserConfigDir
-}
-
-// NewDBPathChecker creates a DBPathChecker using whatever
-// func you want as the argument, as long as it matches the
-// type os.UserConfigDir. This makes it convenient for testing
-// and was done as an experiment here to practice mocking in Go.
-func NewDBPathChecker(h getUserConfigDir) *DBPathChecker {
- return &DBPathChecker{userConfig: h}
-}
-
-// Check returns true if the necessary config files (including
-// the database) are in place - false if not
-func (db *DBPathChecker) Check() bool {
- userConfig, err := db.userConfig()
- if err != nil {
- log.Fatal(err)
- }
- dbPath := filepath.Join(userConfig, "datamaps.db")
- if _, err := os.Stat(dbPath); os.IsNotExist(err) {
- return false
- }
- return true
-}
-
-// SetUp creates the config directory and requisite files
-func SetUp() (string, error) {
- dir, err := os.UserConfigDir()
- if err != nil {
- return "", err
- }
- // check if config folder exists
- configPath := filepath.Join(dir, configDirName)
- dbPath := filepath.Join(configPath, dbName)
- if _, err := os.Stat(configPath); os.IsNotExist(err) {
- log.Println("Config directory does not exist.")
- log.Printf("Creating config directory %s.\n", configPath)
- if err := os.Mkdir(filepath.Join(dir, "datamaps"), 0700); err != nil {
- return "", err
- }
- } else {
- log.Println("Config directory found.")
- }
- if _, err := os.Stat(dbPath); os.IsNotExist(err) {
- log.Println("Database does not exist.")
- _, err = os.Create(dbPath)
- if err != nil {
- return "", err
- }
- log.Printf("Creating database file at %s.\n", dbPath)
- _, err := setupDB(dbPath)
- if err != nil {
- return "", err
- }
- } else {
- log.Println("Database file found.")
- }
- return dir, nil
-}
-
-func userConfigDir() (string, error) {
- dir, err := os.UserConfigDir()
- if err != nil {
- return "", err
- }
-
- configPath := filepath.Join(dir, configDirName)
-
- return configPath, nil
-}
-
-func defaultDMPath() (string, error) {
- dir, err := os.UserHomeDir()
- if err != nil {
- return "", err
- }
-
- return filepath.Join(dir, "Documents", "datamaps"), nil
-}
-
-func defaultXLSXPath() (string, error) {
- dir, err := os.UserHomeDir()
- if err != nil {
- return "", err
- }
-
- return filepath.Join(dir, "Documents", "datamaps", "import"), nil
-}
-
-// Options for the whole CLI application.
-type Options struct {
- // Command is the main CLI sub-command (e.g. "datamap" handles all datamap
- // operations and the flags that follow pertain only to that operation.
- Command string
-
- // DBPath is the path to the database file.
- DBPath string
-
- // DMPath is the path to a datamap file.
- DMPath string
-
- // DMNane is the name of a datamap, whether setting or querying.
- DMName string
-
- // XLSXPath is the path to a directory containing ".xlsx" files for
- // importing.
- XLSXPath string
-
- // ReturnName is the name of a Return, whether setting or querying.
- ReturnName string
-
- // DMOverwrite is currently not used.
- DMOverwrite bool
-
- // DMInitial is currently not used.
- DMInitial bool
-
- // MasterOutPutPath is where the master.xlsx file is to be saved
- MasterOutPutPath string
-}
-
-func defaultOptions() *Options {
- dbpath, err := userConfigDir()
- if err != nil {
- log.Fatalf("Unable to get user config directory %v", err)
- }
-
- dmPath, err := defaultDMPath()
- if err != nil {
- log.Fatalf("unable to get default datamaps directory path: %v", err)
- }
-
- xlsxPath, err := defaultXLSXPath()
- if err != nil {
- log.Fatalf("unable to get default XLSX directory path: %v", err)
- }
-
- homeDir, err := os.UserHomeDir()
- if err != nil {
- log.Fatal("unable to get user home directory")
- }
-
- return &Options{
- Command: "help",
- DBPath: filepath.Join(dbpath, dbName),
- DMPath: dmPath,
- DMName: "Unnamed Datamap",
- XLSXPath: xlsxPath,
- ReturnName: "Unnamed Return",
- DMOverwrite: false,
- DMInitial: false,
- MasterOutPutPath: filepath.Join(homeDir, "Desktop"),
- }
-}
-
-// nextString get the next string in a slice.
-func nextString(args []string, i *int, message string) string {
- if len(args) > *i+1 {
- *i++
- } else {
- log.Fatal(message)
- }
-
- return args[*i]
-}
-
-func processOptions(opts *Options, allArgs []string) {
- if len(allArgs) == 0 {
- allArgs = append(allArgs, "help")
- }
- switch allArgs[0] {
- case "import":
- opts.Command = "import"
- case "help":
- opts.Command = "help"
- case "datamap":
- opts.Command = "datamap"
- case "setup":
- opts.Command = "setup"
- case "server":
- opts.Command = "server"
- case "createmaster":
- opts.Command = "createmaster"
- default:
- log.Fatal("No relevant command provided.")
- }
-
- restArgs := allArgs[1:]
-
- for i := 0; i < len(allArgs[1:]); i++ {
- arg := restArgs[i]
- switch arg {
- case "--xlsxpath":
- opts.XLSXPath = nextString(restArgs, &i, "xlsx directory path required")
- case "--returnname":
- opts.ReturnName = nextString(restArgs, &i, "return name required")
- case "--import":
- opts.DMPath = nextString(restArgs, &i, "import path required")
- case "--datamapname":
- opts.DMName = nextString(restArgs, &i, "datamap name required")
- case "--overwrite":
- opts.DMOverwrite = true
- case "--initial":
- opts.DMInitial = true
- case "--masteroutputdir":
- opts.MasterOutPutPath = nextString(restArgs, &i, "master output directory required")
- }
- }
-}
-
-//ParseOptions for CLI.
-func ParseOptions() *Options {
- opts := defaultOptions()
- processOptions(opts, os.Args[1:])
-
- return opts
-}