From 897bcfd9a41ad0f84d74045633a324fa176f0ffb Mon Sep 17 00:00:00 2001 From: Ryan O'Hara-Reid Date: Fri, 21 Jun 2019 12:38:35 +1000 Subject: [PATCH] Documentation Update (#318) * Initial update * update * Fix linter issues * Add new documentation template and fix --- CONTRIBUTORS | 6 +- README.md | 17 +- cmd/documentation/README.md | 98 +++ .../cmd_templates/documentation.tmpl | 63 ++ cmd/documentation/documentation.go | 635 +++++++++--------- .../{CONTRIBUTORS => CONTRIBUTORS.tmpl} | 4 +- .../root_templates/{LICENSE => LICENSE.tmpl} | 0 .../sub_templates/contributors.tmpl | 5 +- .../testdata_templates/testdata_readme.tmpl | 2 +- communications/slack/README.md | 32 - 10 files changed, 496 insertions(+), 366 deletions(-) create mode 100644 cmd/documentation/README.md create mode 100644 cmd/documentation/cmd_templates/documentation.tmpl rename cmd/documentation/root_templates/{CONTRIBUTORS => CONTRIBUTORS.tmpl} (69%) rename cmd/documentation/root_templates/{LICENSE => LICENSE.tmpl} (100%) diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 0de25e74..74691599 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -3,12 +3,13 @@ Thanks to the following contributors: thrasher- | https://github.com/thrasher- shazbert | https://github.com/shazbert gloriousCode | https://github.com/gloriousCode -ermalguni | https://github.com/ermalguni xtda | https://github.com/xtda +ermalguni | https://github.com/ermalguni +vadimzhukck | https://github.com/vadimzhukck 140am | https://github.com/140am marcofranssen | https://github.com/marcofranssen -vadimzhukck | https://github.com/vadimzhukck cranktakular | https://github.com/cranktakular +leilaes | https://github.com/leilaes crackcomm | https://github.com/crackcomm MadCozBadd | https://github.com/MadCozBadd andreygrehov | https://github.com/andreygrehov @@ -29,5 +30,4 @@ starit | https://github.com/starit Jimexist | https://github.com/Jimexist lookfirst | https://github.com/lookfirst zeldrinn | https://github.com/zeldrinn -mattkanwisher | https://github.com/mattkanwisher diff --git a/README.md b/README.md index bed3517c..27808101 100644 --- a/README.md +++ b/README.md @@ -129,16 +129,16 @@ Binaries will be published once the codebase reaches a stable condition. ### A very special thank you to all who have contributed to this program: |User|Github|Contribution Amount| -|--|--|--| -| thrasher- | https://github.com/thrasher- | 526 | -| shazbert | https://github.com/shazbert | 166 | -| gloriousCode | https://github.com/gloriousCode | 146 | +|--|--|--|| thrasher- | https://github.com/thrasher- | 540 | +| shazbert | https://github.com/shazbert | 173 | +| gloriousCode | https://github.com/gloriousCode | 150 | +| xtda | https://github.com/xtda | 17 | | ermalguni | https://github.com/ermalguni | 14 | -| xtda | https://github.com/xtda | 11 | +| vadimzhukck | https://github.com/vadimzhukck | 10 | | 140am | https://github.com/140am | 8 | | marcofranssen | https://github.com/marcofranssen | 8 | -| vadimzhukck | https://github.com/vadimzhukck | 8 | | cranktakular | https://github.com/cranktakular | 5 | +| leilaes | https://github.com/leilaes | 3 | | crackcomm | https://github.com/crackcomm | 3 | | MadCozBadd | https://github.com/MadCozBadd | 2 | | andreygrehov | https://github.com/andreygrehov | 2 | @@ -159,10 +159,5 @@ Binaries will be published once the codebase reaches a stable condition. | Jimexist | https://github.com/Jimexist | 1 | | lookfirst | https://github.com/lookfirst | 1 | | zeldrinn | https://github.com/zeldrinn | 1 | -| mattkanwisher | https://github.com/mattkanwisher | 1 | -| mKurrels | https://github.com/mKurrels | 1 | -| m1kola | https://github.com/m1kola | 1 | -| cavapoo2 | https://github.com/cavapoo2 | 1 | - diff --git a/cmd/documentation/README.md b/cmd/documentation/README.md new file mode 100644 index 00000000..252a4faa --- /dev/null +++ b/cmd/documentation/README.md @@ -0,0 +1,98 @@ +# GoCryptoTrader package Documentation + + + + +[![Build Status](https://travis-ci.org/thrasher-/gocryptotrader.svg?branch=master)](https://travis-ci.org/thrasher-/gocryptotrader) +[![Software License](https://img.shields.io/badge/License-MIT-orange.svg?style=flat-square)](https://github.com/thrasher-/gocryptotrader/blob/master/LICENSE) +[![GoDoc](https://godoc.org/github.com/thrasher-/gocryptotrader?status.svg)](https://godoc.org/github.com/thrasher-/gocryptotrader/cmd/documentation) +[![Coverage Status](http://codecov.io/github/thrasher-/gocryptotrader/coverage.svg?branch=master)](http://codecov.io/github/thrasher-/gocryptotrader?branch=master) +[![Go Report Card](https://goreportcard.com/badge/github.com/thrasher-/gocryptotrader)](https://goreportcard.com/report/github.com/thrasher-/gocryptotrader) + + +This documentation package is part of the GoCryptoTrader codebase. + +## This is still in active development + +You can track ideas, planned features and what's in progresss on this Trello board: [https://trello.com/b/ZAhMhpOy/gocryptotrader](https://trello.com/b/ZAhMhpOy/gocryptotrader). + +Join our slack to discuss all things related to GoCryptoTrader! [GoCryptoTrader Slack](https://join.slack.com/t/gocryptotrader/shared_invite/enQtNTQ5NDAxMjA2Mjc5LTQyYjIxNGVhMWU5MDZlOGYzMmE0NTJmM2MzYWY5NGMzMmM4MzUwNTBjZTEzNjIwODM5NDcxODQwZDljMGQyNGY) + +## Current Features for documentation + +#### This tool allows for the generation of new documentation through templating + +From the `gocryptotrader/cmd/documentation/` folder, using the go command: **go run documentation.go** this will auto-generate and regenerate documentation across the **GoCryptoTrader** code base. +>Using the -v command will, ie **go run documentation.go -v** put the tool into verbose mode allowing you to see what is happening with a little more depth. + +Be aware, this tool will: +- Works off a configuration JSON file located at ``gocryptotrader/cmd/documentation/`` for future use with multiple repositories. +- Automatically find the directory and file tree for the GoCryptoTrader source code and alert you of undocumented file systems which **need** to be updated. +- Automatically find the template folder tree. +- Fetch an updated contributor list and rank on pull request commit amount +- Sets up core folder docs for the root directory tree including **LICENSE** and **CONTRIBUTORS** + +### config.json example + +```json +{ +"githubRepo": "https://api.github.com/repos/thrasher-/gocryptotrader", This is your current repo +"exclusionList": { This allows for excluded directories and files +"Files": null, +"Directories": [ +"_templates", +".git", +"web" +] +}, +"rootReadmeActive": true, allows a root directory README.md +"licenseFileActive": true, allows for a license file to be generated +"contributorFileActive": true, fetches a new contributor list +"referencePathToRepo": "../../" +} +``` +### Template example +>place a new template **example_file.tmpl** located in the current gocryptotrader/cmd/documentation/ folder; when the documentation tool finishes it will give you the define template associated name e.g. ``Template not found for path ../../cmd/documentation create new template with \{\{define "cmd documentation" -\}\} TEMPLATE HERE \{\{end}}`` so you can replace the below example with ``\{\{define "cmd documentation" -}}`` + +``` +\{\{\define "example_definition_created_by_documentation_tool" -}} +\{\{\template "header" .}} +## Current Features for documentation + +#### A concise blurb about the package or tool system + ++ Coding examples +import "github.com/thrasher-/gocryptotrader/something" +testString := "aAaAa" +upper := strings.ToUpper(testString) +// upper == "AAAAA" + +{\{\template "contributions"}} +{\{\template "donations"}} +{\{\end}} +``` + +### ALL NEW UPDATES AND FILE SYSTEM ADDITIONS NEED A DOCUMENTATION UPDATE USING THIS TOOL OR PR MERGE REQUEST MAY BE POSTPONED. + + +### Please click GoDocs chevron above to view current GoDoc information for this package + +## Contribution + +Please feel free to submit any pull requests or suggest any desired features to be added. + +When submitting a PR, please abide by our coding guidelines: + ++ Code must adhere to the official Go [formatting](https://golang.org/doc/effective_go.html#formatting) guidelines (i.e. uses [gofmt](https://golang.org/cmd/gofmt/)). ++ Code must be documented adhering to the official Go [commentary](https://golang.org/doc/effective_go.html#commentary) guidelines. ++ Code must adhere to our [coding style](https://github.com/thrasher-/gocryptotrader/blob/master/doc/coding_style.md). ++ Pull requests need to be based on and opened against the `master` branch. + +## Donations + + + +If this framework helped you in any way, or you would like to support the developers working on it, please donate Bitcoin to: + +***1F5zVDgNjorJ51oGebSvNCrSAHpwGkUdDB*** + diff --git a/cmd/documentation/cmd_templates/documentation.tmpl b/cmd/documentation/cmd_templates/documentation.tmpl new file mode 100644 index 00000000..7ec9a94d --- /dev/null +++ b/cmd/documentation/cmd_templates/documentation.tmpl @@ -0,0 +1,63 @@ +{{define "cmd documentation" -}} +{{template "header" .}} +## Current Features for {{.Name}} + +#### This tool allows for the generation of new documentation through templating + +From the `gocryptotrader/cmd/documentation/` folder, using the go command: **go run documentation.go** this will auto-generate and regenerate documentation across the **GoCryptoTrader** code base. +>Using the -v command will, ie **go run documentation.go -v** put the tool into verbose mode allowing you to see what is happening with a little more depth. + +Be aware, this tool will: +- Works off a configuration JSON file located at ``gocryptotrader/cmd/documentation/`` for future use with multiple repositories. +- Automatically find the directory and file tree for the GoCryptoTrader source code and alert you of undocumented file systems which **need** to be updated. +- Automatically find the template folder tree. +- Fetch an updated contributor list and rank on pull request commit amount +- Sets up core folder docs for the root directory tree including **LICENSE** and **CONTRIBUTORS** + +### config.json example + +```json +{ +"githubRepo": "https://api.github.com/repos/thrasher-/gocryptotrader", This is your current repo +"exclusionList": { This allows for excluded directories and files +"Files": null, +"Directories": [ +"_templates", +".git", +"web" +] +}, +"rootReadmeActive": true, allows a root directory README.md +"licenseFileActive": true, allows for a license file to be generated +"contributorFileActive": true, fetches a new contributor list +"referencePathToRepo": "../../" +} +``` +### Template example +>place a new template **example_file.tmpl** located in the current gocryptotrader/cmd/documentation/ folder; when the documentation tool finishes it will give you the define template associated name e.g. ``Template not found for path ../../cmd/documentation create new template with \{\{define "cmd documentation" -\}\} TEMPLATE HERE \{\{end}}`` so you can replace the below example with ``\{\{define "cmd documentation" -}}`` + +``` +\{\{\define "example_definition_created_by_documentation_tool" -}} +\{\{\template "header" .}} +## Current Features for {{.Name}} + +#### A concise blurb about the package or tool system + ++ Coding examples +import "github.com/thrasher-/gocryptotrader/something" +testString := "aAaAa" +upper := strings.ToUpper(testString) +// upper == "AAAAA" + +{\{\template "contributions"}} +{\{\template "donations"}} +{\{\end}} +``` + +### ALL NEW UPDATES AND FILE SYSTEM ADDITIONS NEED A DOCUMENTATION UPDATE USING THIS TOOL OR PR MERGE REQUEST MAY BE POSTPONED. + + +### Please click GoDocs chevron above to view current GoDoc information for this package +{{template "contributions"}} +{{template "donations"}} +{{end}} \ No newline at end of file diff --git a/cmd/documentation/documentation.go b/cmd/documentation/documentation.go index b5d348d3..2200d1f9 100644 --- a/cmd/documentation/documentation.go +++ b/cmd/documentation/documentation.go @@ -1,390 +1,397 @@ package main import ( + "encoding/json" + "errors" "flag" "fmt" "html/template" + "io/ioutil" "log" "os" - "runtime" + "path/filepath" "strings" "time" "github.com/thrasher-/gocryptotrader/common" + "github.com/thrasher-/gocryptotrader/core" ) const ( - commonPath = "..%s..%scommon%s" - communicationsPath = "..%s..%scommunications%s" - communicationsBasePath = "..%s..%scommunications%sbase%s" - communicationsSlackPath = "..%s..%scommunications%sslack%s" - communicationsSmsglobalPath = "..%s..%scommunications%ssmsglobal%s" - communicationsSMTPPath = "..%s..%scommunications%ssmtpservice%s" - communicationsTelegramPath = "..%s..%scommunications%stelegram%s" - configPath = "..%s..%sconfig%s" - currencyPath = "..%s..%scurrency%s" - currencyFXPath = "..%s..%scurrency%sforexprovider%s" - currencyFXBasePath = "..%s..%scurrency%sforexprovider%sbase%s" - currencyFXCurrencyConverterPath = "..%s..%scurrency%sforexprovider%scurrencyconverterapi%s" - currencyFXCurrencylayerPath = "..%s..%scurrency%sforexprovider%scurrencylayer%s" - currencyFXFixerPath = "..%s..%scurrency%sforexprovider%sfixer.io%s" - currencyFXOpenExchangeRatesPath = "..%s..%scurrency%sforexprovider%sopenexchangerates%s" - currencyPairPath = "..%s..%scurrency%spair%s" - currencySymbolPath = "..%s..%scurrency%ssymbol%s" - currencyTranslationPath = "..%s..%scurrency%stranslation%s" - eventsPath = "..%s..%sevents%s" - exchangesPath = "..%s..%sexchanges%s" - exchangesNoncePath = "..%s..%sexchanges%snonce%s" - exchangesOrderbookPath = "..%s..%sexchanges%sorderbook%s" - exchangesStatsPath = "..%s..%sexchanges%sstats%s" - exchangesTickerPath = "..%s..%sexchanges%sticker%s" - exchangesOrdersPath = "..%s..%sexchanges%sorders%s" - exchangesRequestPath = "..%s..%sexchanges%srequest%s" - portfolioPath = "..%s..%sportfolio%s" - testdataPath = "..%s..%stestdata%s" - toolsPath = "..%s..%stools%s" - webPath = "..%s..%sweb%s" - rootPath = "..%s..%s" + // DefaultRepo is the main example repository + DefaultRepo = "https://api.github.com/repos/[REPO ADDRESS HERE]" - // exchange packages - alphapoint = "..%s..%sexchanges%salphapoint%s" - anx = "..%s..%sexchanges%sanx%s" - binance = "..%s..%sexchanges%sbinance%s" - bitfinex = "..%s..%sexchanges%sbitfinex%s" - bitflyer = "..%s..%sexchanges%sbitflyer%s" - bithumb = "..%s..%sexchanges%sbithumb%s" - bitmex = "..%s..%sexchanges%sbitmex%s" - bitstamp = "..%s..%sexchanges%sbitstamp%s" - bittrex = "..%s..%sexchanges%sbittrex%s" - btcmarkets = "..%s..%sexchanges%sbtcmarkets%s" - coinbasepro = "..%s..%sexchanges%scoinbasepro%s" - coinut = "..%s..%sexchanges%scoinut%s" - exmo = "..%s..%sexchanges%sexmo%s" - gateio = "..%s..%sexchanges%sgateio%s" - gemini = "..%s..%sexchanges%sgemini%s" - hitbtc = "..%s..%sexchanges%shitbtc%s" - huobi = "..%s..%sexchanges%shuobi%s" - huobihadax = "..%s..%sexchanges%shuobihadax%s" - itbit = "..%s..%sexchanges%sitbit%s" - kraken = "..%s..%sexchanges%skraken%s" - lakebtc = "..%s..%sexchanges%slakebtc%s" - localbitcoins = "..%s..%sexchanges%slocalbitcoins%s" - okcoin = "..%s..%sexchanges%sokcoin%s" - okex = "..%s..%sexchanges%sokex%s" - poloniex = "..%s..%sexchanges%spoloniex%s" - yobit = "..%s..%sexchanges%syobit%s" - zb = "..%s..%sexchanges%szb%s" + // GithubAPIEndpoint allows the program to query your repository + // contributor list + GithubAPIEndpoint = "/contributors" - contributorsList = "https://api.github.com/repos/thrasher-/gocryptotrader/contributors" + // LicenseFile defines a license file + LicenseFile = "LICENSE" - licenseName = "LICENSE" - contributorName = "CONTRIBUTORS" + // ContributorFile defines contributor file + ContributorFile = "CONTRIBUTORS" ) -var ( - verbose, replace bool - codebasePaths map[string]string - codebaseTemplatePath map[string]string - codebaseReadme map[string]readme - tmpl *template.Template - path string - contributors []contributor -) - -type readme struct { - Name string - Contributors []contributor - NameURL string - Year int - CapitalName string -} - -type contributor struct { +// Contributor defines an account associated with this code base by doing +// contributions +type Contributor struct { Login string `json:"login"` URL string `json:"html_url"` Contributions int `json:"contributions"` } +// Config defines the running config to deploy documentation across a github +// repository including exclusion lists for files and directories +type Config struct { + GithubRepo string `json:"githubRepo"` + Exclusions Exclusions `json:"exclusionList"` + RootReadme bool `json:"rootReadmeActive"` + LicenseFile bool `json:"licenseFileActive"` + ContributorFile bool `json:"contributorFileActive"` + ReferencePathToRepo string `json:"referencePathToRepo"` +} + +// Exclusions defines the exclusion list so documents are not generated +type Exclusions struct { + Files []string `json:"Files"` + Directories []string `json:"Directories"` +} + +// DocumentationDetails defines parameters to update documentation +type DocumentationDetails struct { + Directories []string + Tmpl *template.Template + Contributors []Contributor + Verbose bool + Config *Config +} + +// Attributes defines specific documentation attributes when a template is +// executed +type Attributes struct { + Name string + Contributors []Contributor + NameURL string + Year int + CapitalName string +} + func main() { - flag.BoolVar(&verbose, "v", false, "-v Verbose flag prints more information to the std output") - flag.BoolVar(&replace, "r", false, "-r Replace flag generates and replaces all documentation across the code base") + verbose := flag.Bool("v", false, "Verbose output") + flag.Parse() - fmt.Println(` - GoCryptoTrader: Exchange documentation tool + fmt.Println(core.Banner) + fmt.Println("This will update and regenerate documentation for the different packages in your repo.") + fmt.Println() - This will update and regenerate documentation for the different packages - in GoCryptoTrader.`) - - codebasePaths = make(map[string]string) - codebaseTemplatePath = make(map[string]string) - codebaseReadme = make(map[string]readme) - path = getOSPathSlash() - - if err := getContributorList(); err != nil { - log.Fatal("GoCryptoTrader: Exchange documentation tool GET error ", err) + if *verbose { + fmt.Println("Fetching configuration...") } - fmt.Println("Contributor list fetched") - - if err := addTemplates(); err != nil { - log.Fatal("GoCryptoTrader: Exchange documentation tool add template error ", err) + config, err := GetConfiguration() + if err != nil { + log.Fatalf("Documentation Generation Tool - GetConfiguration error %s", + err) } - fmt.Println("Templates parsed") - - if err := updateReadme(); err != nil { - log.Fatal("GoCryptoTrader: Exchange documentation tool update readme error ", err) + if *verbose { + fmt.Println("Fetching project directory tree...") } - fmt.Println("\nTool finished") -} - -// getOSPathSlash returns the slash used by the operating systems -// file system -// TO-DO: Change all paths to not use this -func getOSPathSlash() string { - if runtime.GOOS == "windows" { - return "\\" + dirList, err := GetProjectDirectoryTree(&config, *verbose) + if err != nil { + log.Fatalf("Documentation Generation Tool - GetProjectDirectoryTree error %s", + err) } - return "/" -} -// updateReadme iterates through codebase paths to check for readme files and either adds -// or replaces with new readme files. -func updateReadme() error { - addPaths() + var contributors []Contributor + if config.ContributorFile { + if *verbose { + fmt.Println("Fetching repository contributor list...") + } + contributors, err = GetContributorList(config.GithubRepo) + if err != nil { + log.Fatalf("Documentation Generation Tool - GetContributorList error %s", + err) + } - for packageName := range codebasePaths { - addReadmeData(packageName) - - if !checkReadme(packageName) { - if verbose { - fmt.Printf("* %s Readme file FOUND.\n", packageName) + if *verbose { + fmt.Println("Contributor List Fetched") + for i := range contributors { + fmt.Println(contributors[i].Login) } - if replace { + } + } else { + fmt.Println("Contributor list file disabled skipping fetching details") + } + + if *verbose { + fmt.Println("Fetching template files...") + } + + tmpl, err := GetTemplateFiles() + if err != nil { + log.Fatalf("Documentation Generation Tool - GetTemplateFiles error %s", + err) + } + + if *verbose { + fmt.Println("All core systems fetched, updating documentation...") + } + + err = UpdateDocumentation(DocumentationDetails{ + dirList, + tmpl, + contributors, + *verbose, + &config}) + if err != nil { + log.Fatalf("Documentation Generation Tool - UpdateDocumentation error %s", + err) + } + + fmt.Println("\nDocumentation Generation Tool - Finished") +} + +// GetConfiguration retrieves the documentation configuration +func GetConfiguration() (Config, error) { + var c Config + file, err := os.OpenFile("config.json", os.O_RDWR, os.ModePerm) + if err != nil { + fmt.Println("Creating configuration file, please add github repository path and preferences") + + file, err = os.Create("config.json") + if err != nil { + return c, err + } + + // Set default params for configuration + c.GithubRepo = DefaultRepo + c.ContributorFile = true + c.LicenseFile = true + c.RootReadme = true + c.ReferencePathToRepo = "../../" + c.Exclusions.Directories = []string{".github"} + + data, mErr := json.MarshalIndent(c, "", " ") + if mErr != nil { + return c, mErr + } + + _, err = file.WriteAt(data, 0) + if err != nil { + return c, err + } + } + + defer file.Close() + + config, err := ioutil.ReadAll(file) + if err != nil { + return c, err + } + + err = json.Unmarshal(config, &c) + if err != nil { + return c, err + } + + if c.GithubRepo == "" || c.GithubRepo == DefaultRepo { + return c, errors.New("repository not set in config.json file, please change") + } + + if c.ReferencePathToRepo == "" { + return c, errors.New("reference path not set in the config.json file, please set") + } + + return c, nil +} + +// IsExcluded returns if the file path is included in the exclusion list +func IsExcluded(path string, exclusion []string) bool { + for _, data := range exclusion { + if strings.Contains(path, data) { + return true + } + } + return false +} + +// GetProjectDirectoryTree uses filepath walk functions to get each individual +// directory name and path to match templates with +func GetProjectDirectoryTree(c *Config, verbose bool) ([]string, error) { + var directoryData []string + if c.RootReadme { // Projects root README.md + directoryData = append(directoryData, c.ReferencePathToRepo) + } + + if c.LicenseFile { // Standard license file + directoryData = append(directoryData, c.ReferencePathToRepo+LicenseFile) + } + + if c.ContributorFile { // Standard contributor file + directoryData = append(directoryData, c.ReferencePathToRepo+ContributorFile) + } + + walkfn := func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + if info.IsDir() { + // Bypass what is contained in config.json directory exclusion + if IsExcluded(info.Name(), c.Exclusions.Directories) { if verbose { - fmt.Println("file replacement") + fmt.Println("Excluding Directory:", info.Name()) } - if err := replaceReadme(packageName); err != nil { - return err - } - continue + return filepath.SkipDir } - continue - } - if verbose { - fmt.Printf("* %s Readme file NOT FOUND.\n", packageName) - } - if replace { - if verbose { - log.Println("file creation") + // Don't append parent directory + if strings.EqualFold(info.Name(), "..") { + return nil } - if err := createReadme(packageName); err != nil { - return err - } - continue + directoryData = append(directoryData, path) } + return nil } - return nil + + return directoryData, filepath.Walk(c.ReferencePathToRepo, walkfn) } -// addPaths adds paths to different potential README.md files in the codebase -func addPaths() { - codebasePaths["common"] = fmt.Sprintf(commonPath, path, path, path) +// GetTemplateFiles parses and returns all template files in the documentation +// tree +func GetTemplateFiles() (*template.Template, error) { + tmpl := template.New("") - codebasePaths["communications comms"] = fmt.Sprintf(communicationsPath, path, path, path) - codebasePaths["communications base"] = fmt.Sprintf(communicationsBasePath, path, path, path, path) - codebasePaths["communications slack"] = fmt.Sprintf(communicationsSlackPath, path, path, path, path) - codebasePaths["communications smsglobal"] = fmt.Sprintf(communicationsSmsglobalPath, path, path, path, path) - codebasePaths["communications smtp"] = fmt.Sprintf(communicationsSMTPPath, path, path, path, path) - codebasePaths["communications telegram"] = fmt.Sprintf(communicationsTelegramPath, path, path, path, path) + walkfn := func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + if info.IsDir() { + if path == "." || path == ".." { + return nil + } - codebasePaths["config"] = fmt.Sprintf(configPath, path, path, path) + var parseError error + tmpl, parseError = tmpl.ParseGlob(filepath.Join(path, "*.tmpl")) + if parseError != nil { + return parseError + } + return filepath.SkipDir + } + return nil + } - codebasePaths["currency"] = fmt.Sprintf(currencyPath, path, path, path) - codebasePaths["currency forexprovider"] = fmt.Sprintf(currencyFXPath, path, path, path, path) - codebasePaths["currency forexprovider base"] = fmt.Sprintf(currencyFXBasePath, path, path, path, path, path) - codebasePaths["currency forexprovider currencyconverter"] = fmt.Sprintf(currencyFXCurrencyConverterPath, path, path, path, path, path) - codebasePaths["currency forexprovider currencylayer"] = fmt.Sprintf(currencyFXCurrencylayerPath, path, path, path, path, path) - codebasePaths["currency forexprovider fixer"] = fmt.Sprintf(currencyFXFixerPath, path, path, path, path, path) - codebasePaths["currency forexprovider openexchangerates"] = fmt.Sprintf(currencyFXOpenExchangeRatesPath, path, path, path, path, path) - codebasePaths["currency pair"] = fmt.Sprintf(currencyPairPath, path, path, path, path) - codebasePaths["currency symbol"] = fmt.Sprintf(currencySymbolPath, path, path, path, path) - codebasePaths["currency translation"] = fmt.Sprintf(currencyTranslationPath, path, path, path, path) - - codebasePaths["events"] = fmt.Sprintf(eventsPath, path, path, path) - - codebasePaths["portfolio"] = fmt.Sprintf(portfolioPath, path, path, path) - codebasePaths["testdata"] = fmt.Sprintf(testdataPath, path, path, path) - codebasePaths["tools"] = fmt.Sprintf(toolsPath, path, path, path) - codebasePaths["web"] = fmt.Sprintf(webPath, path, path, path) - codebasePaths["root"] = fmt.Sprintf(rootPath, path, path) - - codebasePaths["exchanges"] = fmt.Sprintf(exchangesPath, path, path, path) - codebasePaths["exchanges nonce"] = fmt.Sprintf(exchangesNoncePath, path, path, path, path) - codebasePaths["exchanges orderbook"] = fmt.Sprintf(exchangesOrderbookPath, path, path, path, path) - codebasePaths["exchanges stats"] = fmt.Sprintf(exchangesStatsPath, path, path, path, path) - codebasePaths["exchanges ticker"] = fmt.Sprintf(exchangesTickerPath, path, path, path, path) - codebasePaths["exchanges orders"] = fmt.Sprintf(exchangesOrdersPath, path, path, path, path) - codebasePaths["exchanges request"] = fmt.Sprintf(exchangesRequestPath, path, path, path, path) - - codebasePaths["exchanges alphapoint"] = fmt.Sprintf(alphapoint, path, path, path, path) - codebasePaths["exchanges anx"] = fmt.Sprintf(anx, path, path, path, path) - codebasePaths["exchanges binance"] = fmt.Sprintf(binance, path, path, path, path) - codebasePaths["exchanges bitfinex"] = fmt.Sprintf(bitfinex, path, path, path, path) - codebasePaths["exchanges bitflyer"] = fmt.Sprintf(bitflyer, path, path, path, path) - codebasePaths["exchanges bithumb"] = fmt.Sprintf(bithumb, path, path, path, path) - codebasePaths["exchanges bitmex"] = fmt.Sprintf(bitmex, path, path, path, path) - codebasePaths["exchanges bitstamp"] = fmt.Sprintf(bitstamp, path, path, path, path) - codebasePaths["exchanges bittrex"] = fmt.Sprintf(bittrex, path, path, path, path) - codebasePaths["exchanges btcmarkets"] = fmt.Sprintf(btcmarkets, path, path, path, path) - codebasePaths["exchanges coinut"] = fmt.Sprintf(coinut, path, path, path, path) - codebasePaths["exchanges exmo"] = fmt.Sprintf(exmo, path, path, path, path) - codebasePaths["exchanges coinbasepro"] = fmt.Sprintf(coinbasepro, path, path, path, path) - codebasePaths["exchanges gateio"] = fmt.Sprintf(gateio, path, path, path, path) - codebasePaths["exchanges gemini"] = fmt.Sprintf(gemini, path, path, path, path) - codebasePaths["exchanges hitbtc"] = fmt.Sprintf(hitbtc, path, path, path, path) - codebasePaths["exchanges huobi"] = fmt.Sprintf(huobi, path, path, path, path) - codebasePaths["exchanges huobihadax"] = fmt.Sprintf(huobihadax, path, path, path, path) - codebasePaths["exchanges itbit"] = fmt.Sprintf(itbit, path, path, path, path) - codebasePaths["exchanges kraken"] = fmt.Sprintf(kraken, path, path, path, path) - codebasePaths["exchanges lakebtc"] = fmt.Sprintf(lakebtc, path, path, path, path) - codebasePaths["exchanges localbitcoins"] = fmt.Sprintf(localbitcoins, path, path, path, path) - codebasePaths["exchanges okcoin"] = fmt.Sprintf(okcoin, path, path, path, path) - codebasePaths["exchanges okex"] = fmt.Sprintf(okex, path, path, path, path) - codebasePaths["exchanges poloniex"] = fmt.Sprintf(poloniex, path, path, path, path) - codebasePaths["exchanges yobit"] = fmt.Sprintf(yobit, path, path, path, path) - codebasePaths["exchanges zb"] = fmt.Sprintf(zb, path, path, path, path) - - codebasePaths["CONTRIBUTORS"] = fmt.Sprintf(rootPath, path, path) - codebasePaths["LICENSE"] = fmt.Sprintf(rootPath, path, path) + return tmpl, filepath.Walk(".", walkfn) } -func addReadmeData(packageName string) { - readmeInfo := readme{ - Name: getName(packageName, false), +// GetContributorList fetches a list of contributors from the github api +// endpoint +func GetContributorList(repo string) ([]Contributor, error) { + var resp []Contributor + return resp, common.SendHTTPGetRequest(repo+GithubAPIEndpoint, true, false, &resp) +} + +// GetDocumentationAttributes returns specific attributes for a file template +func GetDocumentationAttributes(packageName string, contributors []Contributor) Attributes { + return Attributes{ + Name: GetPackageName(packageName, false), Contributors: contributors, - NameURL: getslashFromName(packageName), + NameURL: GetGoDocURL(packageName), Year: time.Now().Year(), - CapitalName: getName(packageName, true), + CapitalName: GetPackageName(packageName, true), } - codebaseReadme[packageName] = readmeInfo } -func getName(name string, capital bool) string { +// GetPackageName returns the package name after cleaning path as a string +func GetPackageName(name string, capital bool) string { newStrings := strings.Split(name, " ") + var i int if len(newStrings) > 1 { - if capital { - return getCapital(newStrings[1]) - } - return newStrings[1] + i = 1 } if capital { - return getCapital(name) + return strings.Title(newStrings[i]) + } + return newStrings[i] +} + +// GetGoDocURL returns a string for godoc package names +func GetGoDocURL(name string) string { + if strings.Contains(name, " ") { + return strings.Join(strings.Split(name, " "), "/") + } + if name == "testdata" || + name == "tools" || + name == ContributorFile || + name == LicenseFile { + return "" } return name } -func getCapital(name string) string { - capLetter := strings.ToUpper(string(name[0])) - last := name[1:] +// UpdateDocumentation generates or updates readme/documentation files across +// the codebase +func UpdateDocumentation(details DocumentationDetails) error { + for _, path := range details.Directories { + data := strings.Split(path, "/") + var temp []string + for _, d := range data { + if d == ".." { + continue + } + if d == "" { + break + } - return capLetter + last -} + temp = append(temp, d) + } -// getslashFromName returns a string for godoc package names -func getslashFromName(packageName string) string { - if strings.Contains(packageName, " ") { - s := strings.Split(packageName, " ") - return strings.Join(s, "/") - } - if packageName == "testdata" || packageName == "tools" || packageName == contributorName || packageName == licenseName { - return "" - } - return packageName -} + var name string + if len(temp) == 0 { + name = "root" + } else { + name = strings.Join(temp, " ") + } -var globS = []string{ - fmt.Sprintf("common_templates%s*", getOSPathSlash()), - fmt.Sprintf("communications_templates%s*", getOSPathSlash()), - fmt.Sprintf("config_templates%s*", getOSPathSlash()), - fmt.Sprintf("currency_templates%s*", getOSPathSlash()), - fmt.Sprintf("events_templates%s*", getOSPathSlash()), - fmt.Sprintf("exchanges_templates%s*", getOSPathSlash()), - fmt.Sprintf("portfolio_templates%s*", getOSPathSlash()), - fmt.Sprintf("root_templates%s*", getOSPathSlash()), - fmt.Sprintf("sub_templates%s*", getOSPathSlash()), - fmt.Sprintf("testdata_templates%s*", getOSPathSlash()), - fmt.Sprintf("tools_templates%s*", getOSPathSlash()), - fmt.Sprintf("web_templates%s*", getOSPathSlash()), -} + if IsExcluded(name, details.Config.Exclusions.Files) { + if details.Verbose { + fmt.Println("Excluding file:", name) + } + continue + } -// addTemplates adds all the template files -func addTemplates() error { - tmpl = template.New("") + if details.Tmpl.Lookup(name) == nil { + fmt.Printf("Template not found for path %s create new template with {{define \"%s\" -}} TEMPLATE HERE {{end}}\n", + path, + name) + continue + } - for _, s := range globS { - _, err := tmpl.ParseGlob(s) + var mainPath string + if name == LicenseFile || name == ContributorFile { + mainPath = path + } else { + mainPath = filepath.Join(path, "README.md") + } + + err := os.Remove(mainPath) + if err != nil && !strings.Contains(err.Error(), "no such file or directory") { + return err + } + + file, err := os.Create(mainPath) + if err != nil { + return err + } + defer file.Close() + + attr := GetDocumentationAttributes(name, details.Contributors) + + err = details.Tmpl.ExecuteTemplate(file, name, attr) if err != nil { return err } } return nil } - -// checkReadme checks to see if the file exists -func checkReadme(packageName string) bool { - if packageName == licenseName || packageName == contributorName { - _, err := os.Stat(codebasePaths[packageName] + packageName) - return os.IsNotExist(err) - } - _, err := os.Stat(codebasePaths[packageName] + "README.md") - return os.IsNotExist(err) -} - -// replaceReadme replaces readme file -func replaceReadme(packageName string) error { - if packageName == licenseName || packageName == contributorName { - if err := deleteFile(codebasePaths[packageName] + packageName); err != nil { - return err - } - return createReadme(packageName) - } - if err := deleteFile(codebasePaths[packageName] + "README.md"); err != nil { - return err - } - return createReadme(packageName) -} - -// createReadme creates new readme file and executes template -func createReadme(packageName string) error { - if packageName == licenseName || packageName == contributorName { - file, err := os.Create(codebasePaths[packageName] + packageName) - if err != nil { - return err - } - defer file.Close() - if verbose { - fmt.Println("File done") - } - return tmpl.ExecuteTemplate(file, packageName, codebaseReadme[packageName]) - } - file, err := os.Create(codebasePaths[packageName] + "README.md") - if err != nil { - return err - } - defer file.Close() - if verbose { - fmt.Println("File done") - } - return tmpl.ExecuteTemplate(file, packageName, codebaseReadme[packageName]) -} - -func deleteFile(path string) error { - return os.Remove(path) -} - -func getContributorList() error { - return common.SendHTTPGetRequest(contributorsList, true, false, &contributors) -} diff --git a/cmd/documentation/root_templates/CONTRIBUTORS b/cmd/documentation/root_templates/CONTRIBUTORS.tmpl similarity index 69% rename from cmd/documentation/root_templates/CONTRIBUTORS rename to cmd/documentation/root_templates/CONTRIBUTORS.tmpl index eda72237..fa2ba817 100644 --- a/cmd/documentation/root_templates/CONTRIBUTORS +++ b/cmd/documentation/root_templates/CONTRIBUTORS.tmpl @@ -1,6 +1,6 @@ {{define "CONTRIBUTORS"}} Thanks to the following contributors: -{{ range $contributor := .Contributors -}} +{{range $contributor := .Contributors -}} {{$contributor.Login}} | {{$contributor.URL}} -{{ end }} +{{end}} {{end}} diff --git a/cmd/documentation/root_templates/LICENSE b/cmd/documentation/root_templates/LICENSE.tmpl similarity index 100% rename from cmd/documentation/root_templates/LICENSE rename to cmd/documentation/root_templates/LICENSE.tmpl diff --git a/cmd/documentation/sub_templates/contributors.tmpl b/cmd/documentation/sub_templates/contributors.tmpl index 0d124405..e08f5609 100644 --- a/cmd/documentation/sub_templates/contributors.tmpl +++ b/cmd/documentation/sub_templates/contributors.tmpl @@ -5,8 +5,7 @@ |User|Github|Contribution Amount| |--|--|--| -{{ range $contributor := .Contributors -}} +{{- range $contributor := .Contributors -}} | {{$contributor.Login}} | {{$contributor.URL}} | {{$contributor.Contributions}} | -{{ end }} - +{{end}} {{end}} diff --git a/cmd/documentation/testdata_templates/testdata_readme.tmpl b/cmd/documentation/testdata_templates/testdata_readme.tmpl index 15a6e5d9..68a08abf 100644 --- a/cmd/documentation/testdata_templates/testdata_readme.tmpl +++ b/cmd/documentation/testdata_templates/testdata_readme.tmpl @@ -6,5 +6,5 @@ This folder contains a configuration test file for non-deployement test params. It also has the code coverage test files that allow us to monitor our entire codebase, click this link for more information [https://codecov.io/](https://codecov.io/). {{template "contributions"}} -{{template "donations"}} +{{template "donations" -}} {{end}} diff --git a/communications/slack/README.md b/communications/slack/README.md index 96639baf..b56e0617 100644 --- a/communications/slack/README.md +++ b/communications/slack/README.md @@ -63,38 +63,6 @@ err := s.Connect Once the bot has started you can interact with the bot using these commands via Slack: -main.go -```go -var b exchange.IBotExchange - -for i := range bot.Exchanges { - if bot.Exchanges[i].GetName() == "Bitfinex" { - b = bot.Exchanges[i] - } -} - -// Public calls - wrapper functions - -// Fetches current ticker information -tick, err := b.FetchTicker() -if err != nil { - // Handle error -} - -// Fetches current orderbook information -ob, err := b.FetchOrderbook() -if err != nil { - // Handle error -} - -// Private calls - wrapper functions - make sure your APIKEY and APISECRET are -// set and AuthenticatedAPISupport is set to true - -// Fetches current account information -accountInfo, err := b.GetAccountInfo() -if err != nil { - // Handle error -} ``` !status - Displays current working status of bot !help - Displays help text