From e84efc89c2846b31347ea8b80aba2b6b4c4cc8d3 Mon Sep 17 00:00:00 2001
From: Alexis Bridoux
Date: Mon, 6 Jul 2020 16:09:54 +0200
Subject: [PATCH 1/3] Lux updated to 0.3.7
- JSON empty strings fixed
- Read documentaion corrected
---
Package.resolved | 4 ++--
Sources/ScoutCLT/Read/ReadDocumentation.swift | 4 ++--
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/Package.resolved b/Package.resolved
index b3d6a958..9f9af170 100644
--- a/Package.resolved
+++ b/Package.resolved
@@ -15,8 +15,8 @@
"repositoryURL": "https://github.com/ABridoux/lux",
"state": {
"branch": null,
- "revision": "c0b65dceb8e36335874c412c9611fdac021a57af",
- "version": "0.3.6"
+ "revision": "c433264cec4e9c8563d93d2fecb0af65e683f01d",
+ "version": "0.3.7"
}
},
{
diff --git a/Sources/ScoutCLT/Read/ReadDocumentation.swift b/Sources/ScoutCLT/Read/ReadDocumentation.swift
index b9d9ca58..17ab75dd 100644
--- a/Sources/ScoutCLT/Read/ReadDocumentation.swift
+++ b/Sources/ScoutCLT/Read/ReadDocumentation.swift
@@ -30,10 +30,10 @@ struct ReadDocumentation: Documentation {
}
"""
- private static let examples = [(#"`scout "people.Tom.hobbies[0]"`"#, #"will output Tom first hobby "cooking")"#),
+ private static let examples = [(#"`scout "people.Tom.hobbies[0]"`"#, #"will output Tom first hobby "cooking""#),
(#"`scout "people.Arnaud.height"`"#, #"will output Arnaud's height "180""#),
(#"`scout "people.Tom.hobbies[-1]"`"#, #"will output Tom last hobby: "guitar""#),
- (#"`scout "people.Tom`"#, #"will output Tom dictionary"#)]
+ (#"`scout "people.Tom"`"#, #"will output Tom dictionary"#)]
static let text =
"""
From f296a2303e37664cd8fcbf4e93f7767e9dac246c Mon Sep 17 00:00:00 2001
From: Alexis Bridoux
Date: Mon, 6 Jul 2020 17:50:13 +0200
Subject: [PATCH 2/3] Removed the command error handling
ArgumentParser handles again with a generic code error 1
---
Sources/Scout/Definitions/Path.swift | 11 +-
.../Scout/Definitions/PathExplorerError.swift | 10 +-
Sources/ScoutCLT/Add/AddCommand.swift | 3 -
Sources/ScoutCLT/Command.swift | 4 +
Sources/ScoutCLT/Delete/DeleteCommand.swift | 3 -
.../Extensions/ArgumentHelp+Extensions.swift | 14 ++
.../ScoutCLT/Extensions/Path+Extensions.swift | 8 +-
.../PathExplorerError+Extensions.swift | 38 ----
.../Extensions/String+Extensions.swift | 3 +-
Sources/ScoutCLT/Main/DocCommand.swift | 206 +++++++++---------
Sources/ScoutCLT/PathAndValue.swift | 2 +-
Sources/ScoutCLT/Read/ReadCommand.swift | 6 +-
Sources/ScoutCLT/Set/SetCommand.swift | 3 -
13 files changed, 134 insertions(+), 177 deletions(-)
create mode 100644 Sources/ScoutCLT/Extensions/ArgumentHelp+Extensions.swift
delete mode 100644 Sources/ScoutCLT/Extensions/PathExplorerError+Extensions.swift
diff --git a/Sources/Scout/Definitions/Path.swift b/Sources/Scout/Definitions/Path.swift
index bfe6e8d9..13f716be 100644
--- a/Sources/Scout/Definitions/Path.swift
+++ b/Sources/Scout/Definitions/Path.swift
@@ -48,15 +48,16 @@ public extension Path {
- note: The following separators will not work: "[", "]", "(", ")".
When using a special caracter with [regular expression](https://developer.apple.com/documentation/foundation/nsregularexpression#1965589),
it is required to quote it with "\\".
-
*/
init(string: String, separator: String = "\\.") throws {
var elements = [PathElement]()
let splitRegexPattern = #"\(.+\)|[^\#(separator)]+"#
let indexRegexPattern = #"(?<=\[)[0-9-]+(?=\])"#
- let splitRegex = try NSRegularExpression(pattern: splitRegexPattern, options: [])
- let indexRegex = try NSRegularExpression(pattern: indexRegexPattern, options: [])
+ let squareBracketPattern = #"\[|\]"#
+ let splitRegex = try NSRegularExpression(pattern: splitRegexPattern)
+ let indexRegex = try NSRegularExpression(pattern: indexRegexPattern)
+ let squareBracketRegex = try NSRegularExpression(pattern: squareBracketPattern)
let matches = splitRegex.matches(in: string)
for match in matches {
@@ -94,8 +95,10 @@ public extension Path {
guard let index = Int(match[indexMatch.range]) else { throw PathExplorerError.invalidPathElement(match) }
elements.append(index)
}
-
} else {
+ if squareBracketRegex.firstMatch(in: match, range: match.nsRange) != nil {
+ throw PathExplorerError.invalidPathElement(match)
+ }
elements.append(match)
}
}
diff --git a/Sources/Scout/Definitions/PathExplorerError.swift b/Sources/Scout/Definitions/PathExplorerError.swift
index 312f6e40..7c6f6af3 100644
--- a/Sources/Scout/Definitions/PathExplorerError.swift
+++ b/Sources/Scout/Definitions/PathExplorerError.swift
@@ -21,27 +21,27 @@ public enum PathExplorerError: LocalizedError {
switch self {
case .invalidData(let type): return "Cannot intialize a \(String(describing: type)) object with the given data"
case .invalidValue(let value): return "The key value \(value) is invalid"
- case .valueConversionError(let value, let type): return "Unable to convert the value \(value) to \(type)"
+ case .valueConversionError(let value, let type): return "Unable to convert the value `\(value)` to the type \(type)"
case .wrongValueForKey(let value, let element): return "Cannot set `\(value)` to key/index #\(element)# which is a Dictionary or an Array"
- case .dictionarySubscript(let path): return "Cannot subscript the key at '\(path.description)' as it is not a Dictionary"
+ case .dictionarySubscript(let path): return "Cannot subscript the key at '\(path.description)' with a String as it is not a Dictionary"
case .subscriptMissingKey(let path, let key, let bestMatch):
let bestMatchString: String
if let match = bestMatch {
- bestMatchString = "Best match found: \(match)"
+ bestMatchString = "Best match found: #\(match)#"
} else {
bestMatchString = "No best match found"
}
return "The key #\(key)# cannot be found in the Dictionary '\(path.description)'. \(bestMatchString)"
- case .arraySubscript(let path): return "Cannot subscript the key at '\(path.description)' as is not an Array"
+ case .arraySubscript(let path): return "Cannot subscript the key at '\(path.description)' with an Integer as is not an Array"
case .subscriptWrongIndex(let path, let index, let arrayCount): return "The index #\(index)# is not within the bounds of the Array (0...\(arrayCount - 1)) at '\(path.description)'"
case .stringToDataConversionError: return "Unable to convert the input string into data"
case .dataToStringConversionError: return "Unable to convert the data to a string"
- case .invalidPathElement(let element): return "Invalid path element: \(element)"
+ case .invalidPathElement(let element): return "Invalid path element: '\(element)'"
case .underlyingError(let description): return description
}
diff --git a/Sources/ScoutCLT/Add/AddCommand.swift b/Sources/ScoutCLT/Add/AddCommand.swift
index 8c30329c..5f11b3a5 100644
--- a/Sources/ScoutCLT/Add/AddCommand.swift
+++ b/Sources/ScoutCLT/Add/AddCommand.swift
@@ -36,9 +36,6 @@ struct AddCommand: ParsableCommand {
let streamInput = FileHandle.standardInput.readDataToEndOfFile()
try add(from: streamInput)
}
- } catch let error as PathExplorerError {
- print(error.commandLineErrorDescription)
- return
}
}
diff --git a/Sources/ScoutCLT/Command.swift b/Sources/ScoutCLT/Command.swift
index e30a27c1..7d505df9 100644
--- a/Sources/ScoutCLT/Command.swift
+++ b/Sources/ScoutCLT/Command.swift
@@ -2,4 +2,8 @@ import ArgumentParser
enum Command: String, ExpressibleByArgument {
case read, set, delete, add
+
+ static var documentationDescription: String {
+ "\(Self.read.rawValue.mainColor), \(Self.set.rawValue.mainColor), \(Self.delete.rawValue.mainColor) and \(Self.add.rawValue.mainColor)"
+ }
}
diff --git a/Sources/ScoutCLT/Delete/DeleteCommand.swift b/Sources/ScoutCLT/Delete/DeleteCommand.swift
index d561f948..caabdc31 100644
--- a/Sources/ScoutCLT/Delete/DeleteCommand.swift
+++ b/Sources/ScoutCLT/Delete/DeleteCommand.swift
@@ -43,9 +43,6 @@ struct DeleteCommand: ParsableCommand {
let streamInput = FileHandle.standardInput.readDataToEndOfFile()
try delete(from: streamInput)
}
- } catch let error as PathExplorerError {
- print(error.commandLineErrorDescription)
- return
}
}
diff --git a/Sources/ScoutCLT/Extensions/ArgumentHelp+Extensions.swift b/Sources/ScoutCLT/Extensions/ArgumentHelp+Extensions.swift
new file mode 100644
index 00000000..3bf540d5
--- /dev/null
+++ b/Sources/ScoutCLT/Extensions/ArgumentHelp+Extensions.swift
@@ -0,0 +1,14 @@
+import ArgumentParser
+
+extension ArgumentHelp {
+
+ static var readingPath: ArgumentHelp {
+ ArgumentHelp(
+ "Path in the data where to read the key value",
+ discussion: """
+ A path is a sequence of keys separated with dots to navigate through the data.
+ Use a dot '.' to subscript a dictionary. For example 'parent_key.child_key'.
+ Use an integer enclosed by square brakets '[1]' to subscript an array. For example 'first_key.array[0].second_key'
+ """)
+ }
+}
diff --git a/Sources/ScoutCLT/Extensions/Path+Extensions.swift b/Sources/ScoutCLT/Extensions/Path+Extensions.swift
index 2bf1d403..680a8440 100644
--- a/Sources/ScoutCLT/Extensions/Path+Extensions.swift
+++ b/Sources/ScoutCLT/Extensions/Path+Extensions.swift
@@ -1,14 +1,10 @@
import Scout
import ArgumentParser
+import Foundation
extension Path: ExpressibleByArgument {
public init?(argument: String) {
- do {
- self = try Path(string: argument)
- } catch {
- print(error.localizedDescription)
- return nil
- }
+ try? self.init(string: argument)
}
}
diff --git a/Sources/ScoutCLT/Extensions/PathExplorerError+Extensions.swift b/Sources/ScoutCLT/Extensions/PathExplorerError+Extensions.swift
deleted file mode 100644
index 86752286..00000000
--- a/Sources/ScoutCLT/Extensions/PathExplorerError+Extensions.swift
+++ /dev/null
@@ -1,38 +0,0 @@
-import Scout
-
-extension PathExplorerError {
-
- var commandLineErrorDescription: String {
- var description = "Error".error + ": "
-
- switch self {
- case .invalidData(let type): description += "Cannot intialize a \(String(describing: type).bold) object with the given data"
- case .invalidValue(let value): description += "The key value \(String(describing: value).bold) is invalid"
- case .valueConversionError(let value, let type): description += "Unable to convert the value \(String(describing: value).bold) to \(String(describing: type).bold)"
- case .wrongValueForKey(let value, let element): description += "Cannot set \(String(describing: value).bold) to key/index \(String(describing: element).bold) which is a Dictionary or an Array"
-
- case .dictionarySubscript(let path): description += "Cannot subscript the key at '\(path.description.bold)' as it is not a Dictionary"
- case .subscriptMissingKey(let path, let key, let bestMatch):
- let bestMatchString: String
-
- if let match = bestMatch {
- bestMatchString = "Best match found: \(match.bold)"
- } else {
- bestMatchString = "No best match found"
- }
-
- description += "The key \(key.bold) cannot be found in the Dictionary '\(path.description.bold)'. \(bestMatchString)"
-
- case .arraySubscript(let path): description += "Cannot subscript the key at '\(path.description.bold)' as is not an Array"
- case .subscriptWrongIndex(let path, let index, let arrayCount): description += "The index \(String(index).bold) is not within the bounds of the Array (0...\(arrayCount - 1)) at '\(path.description)'"
-
- case .stringToDataConversionError: description += "Unable to convert the input string into data"
- case .dataToStringConversionError: description += "Unable to convert the data to a string"
- case .invalidPathElement(let element): description += "Invalid path element: \(String(describing: element).bold)"
-
- case .underlyingError(let message): description += message
- }
-
- return description
- }
-}
diff --git a/Sources/ScoutCLT/Extensions/String+Extensions.swift b/Sources/ScoutCLT/Extensions/String+Extensions.swift
index d8f945fd..6c45b5ef 100644
--- a/Sources/ScoutCLT/Extensions/String+Extensions.swift
+++ b/Sources/ScoutCLT/Extensions/String+Extensions.swift
@@ -15,10 +15,11 @@ extension String {
static var prefix: String { "\u{001B}[" }
static var colorReset: String { "\(Self.prefix)39m" }
static var reset: String { "\(Self.prefix)0m" }
+ var mainColor: String { colored(with: 88) }
var bold: String { "\(Self.prefix)1;39m\(self)\(Self.prefix)22m" }
var error: String { "\(Self.colorPrefix(91))\(self)\(Self.colorReset)"}
static func colorPrefix(_ code: Int) -> String { "\(prefix)38;5;\(code)m" }
-
+ func colored(with code: Int) -> String { "\(Self.colorPrefix(code))\(self)\(Self.reset)" }
}
diff --git a/Sources/ScoutCLT/Main/DocCommand.swift b/Sources/ScoutCLT/Main/DocCommand.swift
index 1e4a7ba0..880965f9 100644
--- a/Sources/ScoutCLT/Main/DocCommand.swift
+++ b/Sources/ScoutCLT/Main/DocCommand.swift
@@ -1,115 +1,105 @@
import ArgumentParser
import Lux
-private let jsonInjector = JSONInjector(type: .terminal)
-private let zshInjector = ZshInjector(type: .terminal)
-
-private let jsonExample =
-"""
-{
- "people": {
- "Tom": {
- "height": 175,
- "age": 68,
- "hobbies": [
- "cooking",
- "guitar"
- ]
- },
- "Arnaud": {
- "height": 180,
- "age": 23,
- "hobbies": [
- "video games",
- "party",
- "tennis"
- ]
+struct HomeDocumentation: Documentation {
+
+ private static let jsonInjector = JSONInjector(type: .terminal)
+ private static let zshInjector = ZshInjector(type: .terminal)
+
+ private static let jsonExample =
+ """
+ {
+ "people": {
+ "Tom": {
+ "height": 175,
+ "age": 68,
+ "hobbies": [
+ "cooking",
+ "guitar"
+ ]
+ },
+ "Arnaud": {
+ "height": 180,
+ "age": 23,
+ "hobbies": [
+ "video games",
+ "party",
+ "tennis"
+ ]
+ }
+ }
}
- }
+ """
+
+ private static let readExamples = [(#"`scout "people.Tom.hobbies[0]"`"#, #"will output "cooking""#),
+ (#"`scout "people.Arnaud.height"`"#, #"will output "180""#),
+ (#"`scout "people.Tom.hobbies[-1]"`"#, #"will output last Tom hobbies: "guitar""#),
+ (#"`scout "people.Tom`"#, #"will output Tom dictionary"#)]
+
+ private static let setExamples = [(#"`scout set "people.Tom.hobbies[0]=basket"`"#, #"will change Tom first hobby from "cooking" to "basket""#),
+ (#"`scout set "people.Arnaud.height=160"`"#, #"will change Arnaud's height from 180 to 160"#),
+ (#"`scout set "people.Tom.age=#years#"`"#, #"will change Tom age key name from #age# to #years#"#),
+ (#"`scout set "people.Tom.hobbies[-1]"="playing music""#, #"will change Tom last hobby from "guitar" to "playing music""#)]
+
+ private static let deleteExamples = [(#"`scout delete "people.Tom.height"`"#, #"will delete Tom height"#),
+ (#"`scout delete "people.Tom.hobbies[0]"`"#, #"will delete Tom first hobby"#),
+ (#"`scout delete "people.Tom.hobbies[-1]"`"#, #"will delete Tom last hobby"#)]
+
+ private static let addExamples = [(#"`scout add "people.Franklin.height=165"`"#, #"will create a new dictionary Franklin and add a height key into it with the value 165"#),
+ (#"`scout add "people.Tom.hobbies[-1]"="Playing music"`"#, #"will add the hobby "Playing music" to Tom hobbies at the end of the array"#),
+ (#"`scout add "people.Arnaud.hobbies[1]=reading"`"#, #"will insert the hobby "reading" to Arnaud hobbies between the hobby "video games" and "party""#),
+ (#"`scout add "people.Arnaud.hobbies[-1]=surf"`"#, #"will add the hobby "surf" to Arnaud hobbies at the end of the array"#),
+ (#"`scout add "people.Franklin.hobbies[0]=football"`"#, #"will create a new dictionary Franklin, add a hobbies array into it, and insert the value "football" in the array"#)]
+
+ static let text =
+ """
+ \u{001B}[38;5;88m
+ ______ ______ ___ _____ _____ _________
+ .' ____ \\ .' ___ | .' `.|_ _||_ _|| _ _ |
+ | (___ \\_|/ .' \\_|/ .-. \\ | | | | |_/ | | \\_|
+ _.____`. | | | | | | | ' ' | | |
+ | \\____) |\\ `.___.'\\\\ `-' / \\ \\__/ / _| |_
+ \\______.' `.____ .' `.___.' `.__.' |_____|
+
+ \u{001B}[0;0m
+
+ Here is an overview of scout subcommands: \(Command.documentationDescription).
+ To get more insights for a specific command, please type `scout doc \("[command]".mainColor)`.
+
+ To indicate what value to target, a reading path should be indicated.
+ \(ArgumentHelp.readingPath.discussion)
+
+ You can find more examples here: \("https://github.com/ABridoux/scout/wiki/%5B20%5D-Usage-examples:-command-line".mainColor)
+
+ Notes
+ =====
+ - An index is indicated between squared brackets, like this [5]
+ - When reading a value, the output is always a string
+
+ Given the following Json (as input stream or file)
+
+ \(jsonInjector.inject(in: jsonExample))
+
+ Examples
+ ========
+
+ Reading
+ -------
+ \(examplesText(from: readExamples))
+
+ Setting
+ -------
+ \(examplesText(from: setExamples))
+
+ Deleting
+ --------
+ \(examplesText(from: deleteExamples))
+
+ Adding
+ ------
+ \(examplesText(from: addExamples))
+ """
}
-"""
-
-private let readExamples = [#"`scout "people.Tom.hobbies[0]"`"#,
- #"`scout "people.Arnaud.height"`"#,
- #"`scout "people.Tom.hobbies[-1]"`"#,
- #"`scout "people.Tom`"#]
-
-private let setExamples = [#"`scout set "people.Tom.hobbies[0]=basket"`"#,
- #"`scout set "people.Arnaud.height=160"`"#,
- #"`scout set "people.Tom.age=#years#"`"#,
- #"`scout set "people.Tom.hobbies[-1]"="playing music""#]
-
-private let deleteExamples = [#"`scout delete "people.Tom.height"`"#,
- #"`scout delete "people.Tom.hobbies[0]"`"#,
- #"`scout delete "people.Tom.hobbies[-1]"`"#]
-
-private let addExamples = [#"`scout add "people.Franklin.height=165"`"#,
- #"`scout add "people.Tom.hobbies[-1]"="Playing music"`"#,
- #"`scout add "people.Arnaud.hobbies[1]=reading"`"#,
- #"`scout add "people.Arnaud.hobbies[-1]=surf"`"#,
- #"`scout add "people.Franklin.hobbies[0]=football"`"#]
-
-private let documentation =
-"""
-\u{001B}[38;5;88m
- ______ ______ ___ _____ _____ _________
- .' ____ \\ .' ___ | .' `.|_ _||_ _|| _ _ |
- | (___ \\_|/ .' \\_|/ .-. \\ | | | | |_/ | | \\_|
- _.____`. | | | | | | | ' ' | | |
- | \\____) |\\ `.___.'\\\\ `-' / \\ \\__/ / _| |_
- \\______.' `.____ .' `.___.' `.__.' |_____|
-
-\u{001B}[0;0m
-
-Here is an overview of scout subcommands: read, set, delete and add.
-To get more insights for a specifi command, please type `scout doc [command]`.
-
-To indicate what value to target, a path should be indicated. A path is a serie of key names or indexes separated by '.' to target one value.
-It looks like this "firt_key.second_key[second_index].third_key".
-
-You can find more examples here: \u{001B}[38;5;88mhttps://github.com/ABridoux/scout/blob/master/Playground/Commands.md\u{001B}[0;0m
-
-Notes
-=====
-- An index is indicated between squared brackets, like this [5]
-- When reading a value, the output is always a string
-
-Given the following Json (as input stream or file)
-
-\(jsonInjector.inject(in: jsonExample))
-
-Examples
-========
-
-Reading
--------
-\(zshInjector.inject(in: readExamples[0])) will output "cooking"
-\(zshInjector.inject(in: readExamples[1])) will output "180"
-\(zshInjector.inject(in: readExamples[2])) will output last Tom hobbies: "guitar"
-\(zshInjector.inject(in: readExamples[3])) will output Tom dictionary
-
-Setting
--------
-\(zshInjector.inject(in: setExamples[0])) will change Tom first hobby from "cooking" to "basket"
-\(zshInjector.inject(in: setExamples[1])) will change Arnaud's height from 180 to 160
-\(zshInjector.inject(in: setExamples[2])) will change Tom age key name from #age# to #years#
-\(zshInjector.inject(in: setExamples[3])) will change Tom last hobby from "guitar" to "playing music"
-
-Deleting
---------
-\(zshInjector.inject(in: deleteExamples[0])) will delete Tom height
-\(zshInjector.inject(in: deleteExamples[1])) will delete Tom first hobby
-\(zshInjector.inject(in: deleteExamples[2])) will delete Tom last hobby
-
-Adding
-------
-\(zshInjector.inject(in: addExamples[0])) will create a new dictionary Franklin and add a height key into it with the value 165
-\(zshInjector.inject(in: addExamples[1])) will add the hobby "Playing music" to Tom hobbies at the end of the array
-\(zshInjector.inject(in: addExamples[2])) will insert the hobby "reading" to Arnaud hobbies between the hobby "video games" and "party"
-\(zshInjector.inject(in: addExamples[3])) will add the hobby "surf" to Arnaud hobbies at the end of the array
-\(zshInjector.inject(in: addExamples[4])) will create a new dictionary Franklin, add a hobbies array into it, and insert the value "football" in the array
-
-"""
struct DocCommand: ParsableCommand {
static let configuration = CommandConfiguration(
@@ -128,7 +118,7 @@ static let configuration = CommandConfiguration(
case .add: print(AddDocumentation.text)
}
} else {
- print(documentation)
+ print(HomeDocumentation.text)
}
}
}
diff --git a/Sources/ScoutCLT/PathAndValue.swift b/Sources/ScoutCLT/PathAndValue.swift
index 64cafc26..e0c3b2e7 100644
--- a/Sources/ScoutCLT/PathAndValue.swift
+++ b/Sources/ScoutCLT/PathAndValue.swift
@@ -3,7 +3,7 @@ import Scout
private let abstract =
"""
-Let you specify a reading path with an associated value. Like this: `FirstKey.SecondKey[Index].ThirdKey"=value`
+Let you specify a reading path with an associated value. Like this: "FirstKey.SecondKey[Index].ThirdKey=value"
or `"FirstKey[Index]"="Text value with spaces"`
"""
diff --git a/Sources/ScoutCLT/Read/ReadCommand.swift b/Sources/ScoutCLT/Read/ReadCommand.swift
index ddfd1062..482daf4f 100644
--- a/Sources/ScoutCLT/Read/ReadCommand.swift
+++ b/Sources/ScoutCLT/Read/ReadCommand.swift
@@ -14,7 +14,7 @@ struct ReadCommand: ParsableCommand {
// MARK: - Properties
- @Argument(help: "Path in the data where to read the key value")
+ @Argument(help: .readingPath)
var readingPath: Path?
@Option(name: [.short, .customLong("input")], help: "A file path from which to read the data")
@@ -49,10 +49,6 @@ struct ReadCommand: ParsableCommand {
let output = color ? injector.inject(in: value) : value
print(output)
-
- } catch let error as PathExplorerError {
- print(error.commandLineErrorDescription)
- return
}
}
diff --git a/Sources/ScoutCLT/Set/SetCommand.swift b/Sources/ScoutCLT/Set/SetCommand.swift
index ab56e789..4273035f 100644
--- a/Sources/ScoutCLT/Set/SetCommand.swift
+++ b/Sources/ScoutCLT/Set/SetCommand.swift
@@ -36,9 +36,6 @@ struct SetCommand: ParsableCommand {
let streamInput = FileHandle.standardInput.readDataToEndOfFile()
try set(from: streamInput)
}
- } catch let error as PathExplorerError {
- print(error.commandLineErrorDescription)
- return
}
}
From 97736a67949edac7014484e7563e9cfb00ecc1fc Mon Sep 17 00:00:00 2001
From: Alexis Bridoux
Date: Mon, 6 Jul 2020 20:29:54 +0200
Subject: [PATCH 3/3] Preapre for release
---
CHANGELOG.md | 9 +++++++++
README.md | 3 +++
Resources/scout-logo.png | Bin 62228 -> 61766 bytes
Sources/Scout/Constants/Version.swift | 2 +-
Sources/ScoutCLT/{ => Models}/Command.swift | 0
.../ScoutCLT/{ => Models}/Documentation.swift | 0
.../ScoutCLT/{ => Models}/PathAndValue.swift | 0
.../ScoutCLT/{ => Models}/RuntimeError.swift | 0
Sources/ScoutCLT/{ => Models}/ValueType.swift | 0
.../{ => Version}/VersionCommand.swift | 0
10 files changed, 13 insertions(+), 1 deletion(-)
rename Sources/ScoutCLT/{ => Models}/Command.swift (100%)
rename Sources/ScoutCLT/{ => Models}/Documentation.swift (100%)
rename Sources/ScoutCLT/{ => Models}/PathAndValue.swift (100%)
rename Sources/ScoutCLT/{ => Models}/RuntimeError.swift (100%)
rename Sources/ScoutCLT/{ => Models}/ValueType.swift (100%)
rename Sources/ScoutCLT/{ => Version}/VersionCommand.swift (100%)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index da06225a..31604a44 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,15 @@
All notable changes to this project will be documented in this file. `Scout` adheres to [Semantic Versioning](http://semver.org).
---
+## [1.2.3](https://github.com/ABridoux/scout/tree/1.2.3) (06/07/2020)
+
+### Changed
+- Errors now sent to the standard error ouput with an error code different from 0 [#74]
+- Documentation updated [#74]
+
+### Fixed
+- JSON empty string colorisation [#72]
+
## [1.2.2](https://github.com/ABridoux/scout/tree/1.2.2) (04/07/2020)
### Added
diff --git a/README.md b/README.md
index 69eee2a7..987f8f71 100644
--- a/README.md
+++ b/README.md
@@ -19,6 +19,9 @@ Install:
+
+
+
diff --git a/Resources/scout-logo.png b/Resources/scout-logo.png
index 77c53e377d114a04b8acb8aa31c7f6f7e87a6975..7b069a78474e536acee3934962106020e1650bfd 100644
GIT binary patch
literal 61766
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 MiL$TDQ#uXK_a6d*Z_6Gim2qo3uyC
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