From 5f80f06e7c189b9b514a24bc777acfb45b450fdf Mon Sep 17 00:00:00 2001 From: Jono Wenger <jono@elixxir.io> Date: Fri, 20 Jan 2023 10:31:21 -0800 Subject: [PATCH] Fix flags and add more logging --- .gitlab-ci.yml | 2 +- emoji/emojiSet.go | 21 ++++++++- emoji/main.go | 115 +++++++++++++++++++++++++--------------------- emoji/utils.go | 46 ------------------- 4 files changed, 83 insertions(+), 101 deletions(-) delete mode 100644 emoji/utils.go diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index c2ae9a4e..4ad2d894 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -51,7 +51,7 @@ emoji-update: script: - go mod vendor -v - mkdir -p release - - go run -ldflags '-w -s' ./emoji/... -o emojiSet.json -l - -v 2 + - go run -ldflags '-w -s' ./emoji/... -o emojiSet.json -v 2 - cp emojiSet.json release/ artifacts: paths: diff --git a/emoji/emojiSet.go b/emoji/emojiSet.go index 39ab468f..2a903774 100644 --- a/emoji/emojiSet.go +++ b/emoji/emojiSet.go @@ -55,16 +55,19 @@ func (s *Set) SanitizeEmojiMartSet(frontendEmojiSetJson []byte) ([]byte, error) "failed to unmarshal emoji-mart set JSON: %+v", err) } - jww.INFO.Printf("[SanitizeEmojiMartSet] Finding incompatible emojis...") + jww.INFO.Printf( + "Finding incompatible emojis and replacing mismatched codepoints.") // Find all incompatible emojis in the front end set emojisToRemove := s.findIncompatibleEmojis(&frontEndEmojiSet) - jww.INFO.Printf("[SanitizeEmojiMartSet] Removing incompatible emojis...") + jww.INFO.Printf("Removing incompatible emojis.") // Remove all incompatible emojis from the set removeIncompatibleEmojis(&frontEndEmojiSet, emojisToRemove) + jww.INFO.Printf("Removed %d incompatible codepoints.", len(emojisToRemove)) + return json.Marshal(frontEndEmojiSet) } @@ -79,9 +82,14 @@ func (s *Set) findIncompatibleEmojis(set *emojiMartSet) (emojisToRemove []emojiI // Determine if the emoji's codepoint should be replaced or removed replacement, replace := s.replace(Skin.Unified) if replace { + jww.TRACE.Printf("Replaced codepoint %q with %q for emoji %q", + Skin.Unified, replacement, id) newSkins = append(newSkins, replacement) } else if !s.remove(Skin.Unified) { newSkins = append(newSkins, Skin) + } else { + jww.TRACE.Printf("Removed codepoint %q from emoji %q", + Skin.Unified, id) } } @@ -93,6 +101,7 @@ func (s *Set) findIncompatibleEmojis(set *emojiMartSet) (emojisToRemove []emojiI } else { // If all skins have been removed, then mark the emoji for removal emojisToRemove = append(emojisToRemove, id) + jww.DEBUG.Printf("All skins removed for emoji %q", id) } } @@ -102,8 +111,12 @@ func (s *Set) findIncompatibleEmojis(set *emojiMartSet) (emojisToRemove []emojiI // removeIncompatibleEmojis removes all the emojis in emojisToRemove from the // emojiMartSet set. func removeIncompatibleEmojis(set *emojiMartSet, emojisToRemove []emojiID) { + jww.DEBUG.Printf( + "Removing %d emojis: %s", len(emojisToRemove), emojisToRemove) + // Remove all incompatible emojis from the emojiMartSet.Emojis list for _, char := range emojisToRemove { + jww.TRACE.Printf("Removing %q from emojiMartSet.Emojis", char) delete(set.Emojis, char) } @@ -115,6 +128,8 @@ func removeIncompatibleEmojis(set *emojiMartSet, emojisToRemove []emojiID) { for _, char := range emojisToRemove { if cat.Emojis[i] == char { cat.Emojis = append(cat.Emojis[:i], cat.Emojis[i+1:]...) + jww.TRACE.Printf( + "Removing %q from emojiMartSet.Categories", char) } } } @@ -125,6 +140,8 @@ func removeIncompatibleEmojis(set *emojiMartSet, emojisToRemove []emojiID) { for _, removedId := range emojisToRemove { if id == removedId { delete(set.Aliases, alias) + jww.TRACE.Printf( + "Removing %q from emojiMartSet.Aliases", alias) } } } diff --git a/emoji/main.go b/emoji/main.go index faa3ee3e..135d7cab 100644 --- a/emoji/main.go +++ b/emoji/main.go @@ -12,8 +12,9 @@ import ( "fmt" "github.com/spf13/cobra" jww "github.com/spf13/jwalterweatherman" - "github.com/spf13/viper" "gitlab.com/xx_network/primitives/utils" + "io" + "log" "net/http" "os" ) @@ -25,25 +26,24 @@ import ( // URL should be updated if new sets become available. const emojiMartUrl = "https://raw.githubusercontent.com/missive/emoji-mart/main/packages/emoji-mart-data/sets/14/native.json" -// Flag constants. -const ( - sanitizedOutputFlag = "output" - logLevelFlag = "logLevel" - logFileFlag = "logFile" +// Flag variables. +var ( + requestURL, outputPath, logFile string + logLevel int ) func main() { - if err := sanitizeEmojis.Execute(); err != nil { + if err := cmd.Execute(); err != nil { fmt.Println(err) os.Exit(1) } } -// sanitizeEmojis Downloads the emoji file (from emoji-mart) and sanitizes that +// Downloads the emoji file (from emoji-mart) and sanitizes that // list. Sanitization removes all emojis not supported by the backend. The -// sanitized JSON is returned via a file specified by the user. Refer to the flags -// for details. -var sanitizeEmojis = &cobra.Command{ +// sanitized JSON is returned via a file specified by the user. Refer to the +// flags for details. +var cmd = &cobra.Command{ Use: "sanitizeEmojis", Short: "Downloads the emoji file (from emoji-mart) and sanitizes that " + "list. Sanitization removes all emojis not supported by the backend. " + @@ -53,20 +53,22 @@ var sanitizeEmojis = &cobra.Command{ Run: func(cmd *cobra.Command, args []string) { // Initialize the logging if set - if logFile := viper.GetString(logFileFlag); logFile != "" { - initLog(viper.GetInt(logFileFlag), logFile) + if logFile != "" { + initLog(logLevel, logFile) } - jww.INFO.Printf("Retrieving emoji-mart JSON file...") - // Retrieve emoji-mart file from URL - resp, err := http.Get(emojiMartUrl) + jww.INFO.Printf("Requesting file %s", requestURL) + resp, err := http.Get(requestURL) if err != nil { jww.FATAL.Panicf( "Failed to retrieve emoji-mart JSON from URL: %+v", err) + } else if resp.StatusCode != http.StatusOK { + jww.FATAL.Panicf("Bad status: %s", resp.Status) } - jww.INFO.Printf("Reading emoji-mart JSON file into bytes...") + jww.INFO.Printf("Received HTTP response: %s", resp.Status) + jww.DEBUG.Printf("Response: %+v", resp) // Read HTTP response into byte slice var buf bytes.Buffer @@ -79,7 +81,7 @@ var sanitizeEmojis = &cobra.Command{ } emojiMartJson := buf.Bytes() - jww.INFO.Printf("Sanitizing emoji-mart JSON...") + jww.INFO.Printf("Read %d bytes of JSON file", len(emojiMartJson)) // Sanitize the JSON file backendSet := NewSet() @@ -88,52 +90,61 @@ var sanitizeEmojis = &cobra.Command{ jww.FATAL.Panicf("Failed to sanitize emoji-mart list: %+v", err) } - jww.INFO.Printf("Outputting sanitized emoji JSON to file...") + jww.INFO.Printf("Sanitised JSON file.") // Write sanitized JSON to file - sanitizedOutputFilePath := viper.GetString(sanitizedOutputFlag) - err = utils.WriteFileDef(sanitizedOutputFilePath, sanitizedJSON) + err = utils.WriteFileDef(outputPath, sanitizedJSON) if err != nil { jww.FATAL.Panicf( "Failed to write sanitized emojis to filepath %s: %+v", - sanitizedOutputFilePath, err) + outputPath, err) } + + jww.INFO.Printf("Wrote sanitised JSON file to %s", outputPath) }, } -// init is the initialization function for Cobra which defines commands -// and flags. +// init is the initialization function for Cobra which defines flags. func init() { - // Here you will define your flags and configuration settings. - // Cobra supports persistent flags, which, if defined here, - // will be global for your application. - sanitizeEmojis.PersistentFlags().StringP(sanitizedOutputFlag, "o", - "output.json", - "File path that the sanitized JSON file will be outputted to.") - err := viper.BindPFlag(sanitizedOutputFlag, sanitizeEmojis.PersistentFlags(). - Lookup(sanitizedOutputFlag)) - if err != nil { - jww.FATAL.Panicf( - "Failed to bind pf flag to %q: %+v", sanitizedOutputFlag, err) - } + cmd.Flags().StringVarP(&requestURL, "url", "u", emojiMartUrl, + "URL to download emoji-mart JSON file.") + cmd.Flags().StringVarP(&outputPath, "output", "o", "output.json", + "Output JSON file path.") + cmd.Flags().StringVarP(&logFile, "log", "l", "-", + "Log output path. By default, logs are printed to stdout. "+ + "To disable logging, set this to empty.") + cmd.Flags().IntVarP(&logLevel, "logLevel", "v", 0, + "Verbosity level of logging. 0 = INFO, 1 = DEBUG, 2 = TRACE") +} - sanitizeEmojis.PersistentFlags().StringP(logFileFlag, "l", "", - "Path to the log output path. By default, this flag is not set "+ - "so a log will not be created unless specified.") - err = viper.BindPFlag(logFileFlag, sanitizeEmojis.PersistentFlags(). - Lookup(logFileFlag)) - if err != nil { - jww.FATAL.Panicf( - "Failed to bind pf flag to %q: %+v", logFileFlag, err) - } +// initLog will enable JWW logging. +func initLog(threshold int, logPath string) { + if logPath != "-" && logPath != "" { + // Disable stdout output + jww.SetStdoutOutput(io.Discard) - sanitizeEmojis.PersistentFlags().IntP(logLevelFlag, "v", 0, - "Verbosity level of logging. This defaults to 0. ") - err = viper.BindPFlag(logLevelFlag, sanitizeEmojis.PersistentFlags(). - Lookup(logLevelFlag)) - if err != nil { - jww.FATAL.Panicf( - "Failed to bind pf flag to %q: %+v", logLevelFlag, err) + // Use log file + logOutput, err := + os.OpenFile(logPath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) + if err != nil { + panic(err) + } + jww.SetLogOutput(logOutput) } + if threshold > 1 { + jww.SetStdoutThreshold(jww.LevelTrace) + jww.SetLogThreshold(jww.LevelTrace) + jww.SetFlags(log.LstdFlags | log.Lmicroseconds) + jww.INFO.Printf("log level set to: %s", jww.LevelTrace) + } else if threshold == 1 { + jww.SetStdoutThreshold(jww.LevelDebug) + jww.SetLogThreshold(jww.LevelDebug) + jww.SetFlags(log.LstdFlags | log.Lmicroseconds) + jww.INFO.Printf("log level set to: %s", jww.LevelDebug) + } else { + jww.SetStdoutThreshold(jww.LevelInfo) + jww.SetLogThreshold(jww.LevelInfo) + jww.INFO.Printf("log level set to: %s", jww.LevelInfo) + } } diff --git a/emoji/utils.go b/emoji/utils.go deleted file mode 100644 index b50d0229..00000000 --- a/emoji/utils.go +++ /dev/null @@ -1,46 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// Copyright © 2022 xx foundation // -// // -// Use of this source code is governed by a license that can be found in the // -// LICENSE file. // -//////////////////////////////////////////////////////////////////////////////// - -package main - -import ( - jww "github.com/spf13/jwalterweatherman" - "io" - "log" - "os" -) - -// initLog will enable JWW logging. -func initLog(threshold int, logPath string) { - if logPath != "-" && logPath != "" { - // Disable stdout output - jww.SetStdoutOutput(io.Discard) - // Use log file - logOutput, err := - os.OpenFile(logPath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) - if err != nil { - panic(err) - } - jww.SetLogOutput(logOutput) - } - - if threshold > 1 { - jww.INFO.Printf("log level set to: %s", jww.LevelTrace) - jww.SetStdoutThreshold(jww.LevelTrace) - jww.SetLogThreshold(jww.LevelTrace) - jww.SetFlags(log.LstdFlags | log.Lmicroseconds) - } else if threshold == 1 { - jww.INFO.Printf("log level set to: %s", jww.LevelDebug) - jww.SetStdoutThreshold(jww.LevelDebug) - jww.SetLogThreshold(jww.LevelDebug) - jww.SetFlags(log.LstdFlags | log.Lmicroseconds) - } else { - jww.INFO.Printf("log level set to: %s", jww.LevelInfo) - jww.SetStdoutThreshold(jww.LevelInfo) - jww.SetLogThreshold(jww.LevelInfo) - } -} -- GitLab