diff --git a/README.md b/README.md
index 6d679af..6eb9e79 100644
--- a/README.md
+++ b/README.md
@@ -5,7 +5,7 @@
- [2017] Originally ported from it's [original location](https://github.com/kubicorn/kubicorn/tree/master/pkg/logger) in the Kubicorn code base.
- [2021] Refactored to support custom `io.Writer`'s
-
+
## Install
diff --git a/go.mod b/go.mod
index c880780..554c615 100644
--- a/go.mod
+++ b/go.mod
@@ -1,6 +1,6 @@
module git.zio.sh/astra/logger
-go 1.18
+go 1.16
require (
github.com/fatih/color v1.10.0
diff --git a/logger_legacy.go b/logger_legacy.go
new file mode 100644
index 0000000..ea3b711
--- /dev/null
+++ b/logger_legacy.go
@@ -0,0 +1,108 @@
+// Copyright © 2021 Kris Nóva
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package logger
+
+import (
+ "io"
+ "sync"
+)
+
+// Legacy Logic for 0.1.0
+//
+// Here we store the legacy (0.1.0) compatible configuration options
+// that will eventually be deprecated.
+//
+var (
+
+ // Timestamps are used to toggle timestamps
+ // deprecated
+ Timestamps = true
+
+ // TestMode is used for running
+ // the regression tests.
+ // deprecated
+ TestMode = false
+
+ // Color is no longer used
+ // deprecated
+ Color = true
+
+ // Level is the legacy log level
+ //
+ // 0 (Least verbose)
+ // 1
+ // 2
+ // 3
+ // 4 (Most verbose)
+ //
+ // deprecated
+ Level = -1
+)
+
+var (
+ testRaceMutex = sync.Mutex{}
+ annoyed = false
+)
+
+// checkDeprecatedValues is a singleton
+// that will only execute once.
+// This will convert the legacy logger.Level
+// to the new logger.BitwiseLevel
+//
+// LogEverything =
+func checkDeprecatedValues() {
+ testRaceMutex.Lock()
+ defer testRaceMutex.Unlock()
+ if Level != -1 {
+ if !annoyed {
+ Deprecated("********")
+ Deprecated("***")
+ Deprecated("*")
+ Deprecated("logger.Level is deprecated. Use logger.BitwiseLevel")
+ Deprecated("*")
+ Deprecated("***")
+ Deprecated("********")
+ annoyed = true
+ }
+ if Level == 4 {
+ BitwiseLevel = LogDeprecated | LogAlways | LogSuccess | LogCritical | LogWarning | LogInfo | LogDebug
+ } else if Level == 3 {
+ BitwiseLevel = LogDeprecated | LogAlways | LogSuccess | LogCritical | LogWarning | LogInfo
+ } else if Level == 2 {
+ BitwiseLevel = LogDeprecated | LogAlways | LogSuccess | LogCritical | LogWarning
+ } else if Level == 1 {
+ BitwiseLevel = LogDeprecated | LogAlways | LogSuccess | LogCritical
+ } else if Level == 0 {
+ BitwiseLevel = LogDeprecated | LogAlways | LogSuccess
+ } else {
+ BitwiseLevel = LogDeprecated | LogEverything
+ }
+ }
+}
+
+// legacyFindWriter will check if there is an io.Writer
+// appended to the end of the arguments passed to the logger.
+//
+// deprecated
+func legacyFindWriter(a ...interface{}) []interface{} {
+ if n := len(a); n > 0 {
+ // extract an io.Writer at the end of a
+ if newWriter, ok := a[n-1].(io.Writer); ok {
+ Writer = newWriter
+ a = a[0 : n-1]
+ }
+ }
+ return a
+}
diff --git a/logger_legacy_test.go b/logger_legacy_test.go
new file mode 100644
index 0000000..1ac038b
--- /dev/null
+++ b/logger_legacy_test.go
@@ -0,0 +1,158 @@
+// Copyright © 2021 Kris Nóva
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// ----------------------------------------------------------------------------
+//
+// Legacy Regression tests for 0.1.0
+//
+// Note: @christopherhein added these tests and I am unsure if Amazon
+// is still using the old io.Writer append() convention.
+// Either way, I am keeping legacy (deprecated) support for it.
+//
+// All of these regression tests should still pass.
+//
+// ----------------------------------------------------------------------------
+
+package logger
+
+import (
+ "bytes"
+ "fmt"
+ "regexp"
+ "testing"
+)
+
+const (
+ format = "%v, %v, %v, all eyes on me!"
+ formatExp = `^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.* \[%s\] \d, \d, \d, all eyes on me!`
+ formatWOTimeExp = `\[%s\] \d, \d, \d, all eyes on me!`
+)
+
+var (
+ a = []interface{}{1, 2, 3}
+)
+
+func TestMain(m *testing.M) {
+ TestMode = true
+ m.Run()
+}
+
+func TestAlwaysLegacy(t *testing.T) {
+ e, err := regexp.Compile(fmt.Sprintf(formatExp, PreAlways))
+ g := captureLoggerOutput(Always, format, a)
+
+ if err != nil {
+ t.Fatalf("Failed to compile regexp '%v': %v", e.String(), err)
+ }
+
+ if !e.MatchString(g) {
+ t.Fatalf("Always should produce a pattern '%v' but produces: %v", e.String(), g)
+ }
+}
+
+func TestCriticalLegacy(t *testing.T) {
+ Level = 1
+
+ e, err := regexp.Compile(fmt.Sprintf(formatExp, PreCritical))
+ g := captureLoggerOutput(Critical, format, a)
+
+ if err != nil {
+ t.Fatalf("Failed to compile regexp '%v': %v", e.String(), err)
+ }
+
+ if !e.MatchString(g) {
+ t.Fatalf("Critical should produce a pattern '%v' but produces: %v", e.String(), g)
+ }
+}
+
+func TestInfoLegacy(t *testing.T) {
+ Level = 3
+
+ e, err := regexp.Compile(fmt.Sprintf(formatExp, PreInfo))
+ g := captureLoggerOutput(Info, format, a)
+
+ if err != nil {
+ t.Fatalf("Failed to compile regexp '%v': %v", e.String(), err)
+ }
+
+ if !e.MatchString(g) {
+ t.Fatalf("Info should produce a pattern '%v' but produces: %v", e.String(), g)
+ }
+}
+
+func TestSuccessLegacy(t *testing.T) {
+ Level = 3
+
+ e, err := regexp.Compile(fmt.Sprintf(formatExp, PreSuccess))
+ g := captureLoggerOutput(Success, format, a)
+
+ if err != nil {
+ t.Fatalf("Failed to compile regexp '%v': %v", e.String(), err)
+ }
+
+ if !e.MatchString(g) {
+ t.Fatalf("Success should produce a pattern '%v' but produces: %v", e.String(), g)
+ }
+}
+
+func TestDebugLegacy(t *testing.T) {
+ Level = 4
+
+ e, err := regexp.Compile(fmt.Sprintf(formatExp, PreDebug))
+ g := captureLoggerOutput(Debug, format, a)
+
+ if err != nil {
+ t.Fatalf("Failed to compile regexp '%v': %v", e.String(), err)
+ }
+
+ if !e.MatchString(g) {
+ t.Fatalf("Info should produce a pattern '%v' but produces: %v", e.String(), g)
+ }
+}
+
+func TestWarningLegacy(t *testing.T) {
+ Level = 2
+
+ e, err := regexp.Compile(fmt.Sprintf(formatExp, PreWarning))
+ g := captureLoggerOutput(Warning, format, a)
+
+ if err != nil {
+ t.Fatalf("Failed to compile regexp '%v': %v", e.String(), err)
+ }
+
+ if !e.MatchString(g) {
+ t.Fatalf("Info should produce a pattern '%v' but produces: %v", e.String(), g)
+ }
+}
+
+func TestWithoutTimestampsLegacy(t *testing.T) {
+ Timestamps = false
+ e, err := regexp.Compile(fmt.Sprintf(formatWOTimeExp, PreAlways))
+ g := captureLoggerOutput(Always, format, a)
+
+ if err != nil {
+ t.Fatalf("Failed to compile regexp '%v': %v", e.String(), err)
+ }
+
+ if !e.MatchString(g) {
+ t.Fatalf("Always should produce a pattern '%v' but produces: %v", e.String(), g)
+ }
+}
+
+// captureLoggerOutput is used to test the log functions
+func captureLoggerOutput(l LoggerFunc, format string, a []interface{}) string {
+ b := new(bytes.Buffer)
+ l(format, append(a, b)...)
+ return b.String()
+}