Swiftline 0.5.0

Swiftline 0.5.0

测试测试过的
语言语言 SwiftSwift
许可证 MIT
发布最后发布2016年12月
SwiftSwift版本3.0
SPM支持SPM

oarrabi维护。



Swiftline 0.5.0

  • Omar Abdelhafith



Swiftline 是一组帮助你创建命令行应用程序的工具。Swiftline 受highline的启发。
Swiftline 包含以下内容

  • Colorize:帮助向写入终端的字符串添加颜色
  • Ask, Choose 和 Agree:轻松创建用于获取用户更多信息的通知
  • Run:以快速方式运行外部命令并读取其标准输出和标准错误。
  • Env:读取和写入环境变量 ruby 味道
  • Args:解析命令行参数并返回一个包含传递标志的哈希

内容

使用方法 安装 示例 文档 测试

使用方法

Colorize🎨

Colorize 帮助在将字符串打印到终端之前对其进行样式设置。您可以更改文字颜色、文字背景和文字样式。Colorize 通过扩展 String 结构来为它添加样式。

要更改文字颜色,使用 string.fstring.foreground

    print("Red String".f.Red)
    print("Blue String".foreground.Blue)

要更改文字背景颜色,使用 string.bstring.background

    print("I have a white background".b.White)
    print("My background color is green".background.Green)

要更改文字背景样式,使用 string.sstring.style

    print("I am a bold string".s.Bold)
    print("I have an underline".style.Underline)

您可以组合前景、背景和样式

    print("I am an underlined red on white string".s.Underline.f.Red.b.White)

Ask, Choose, Agree

Ask, Choose 和 Agree 用于提示用户获取更多信息。

Ask

Ask 向用户展示一个提示并等待用户输入。

    let userName = ask("Enter user name?")

userName 将包含用户输入的名称

Ask 可以用于请求整型、双精度浮点型或浮点型的值,例如请求一个整型

    let age = ask("How old are you?", type: Int.self)

如果用户打印的内容无法转换为整型,则会向用户展示一个新的提示,此提示会一直显示,直到用户输入一个整型

How old are you?
None
You must enter a valid Integer.
?  Error
You must enter a valid Integer.
?  5
5

通过在 AskSettings 上调用 addInvalidCase 添加验证。

    let name = ask("Who are you?") { settings in
        settings.addInvalidCase("Snuffles is not allowed") { value in
            value.containsString("Snuffles")
        }
    }

如果用户输入了 Snuffles,Ask 将会持续显示 addInvalidCase 传递给它的无效消息

Who are you?
Snuffles
Snuffles is not allowed
?  Snuffles
Snuffles is not allowed
?  Snowball

Your name is Snowball

AskSettings.confirm 将会在用户输入后要求用户确认他们的选择

    let name = ask("Who are you?") { settings in
        settings.confirm = true
    }

上面的代码将输出

Who are you?
Snuffles
Are you sure?  YES

Your name is Snuffles

Choose

“选择”用于提示用户在几个可能的选项之间选择一个。

例如,显示编程语言的选项。

    let choice = choose("Whats your favorite programming language? ",
        choices: "Swift", "Objective C", "Ruby", "Python", "Java :S")

这将打印:

1. Swift
2. Objective C
3. Ruby
4. Python
5. Java :S
Whats your favorite programming language?

用户可以选择数字(1..5)或项目本身。如果用户输入错误,将会一直提示用户,直到用户做出了正确的选择。

Whats your favorite programming language? JavaScript
You must choose one of [1, 2, 3, 4, 5, Swift, Objective C, Ruby, Python, Java :S].
?  BBB
You must choose one of [1, 2, 3, 4, 5, Swift, Objective C, Ruby, Python, Java :S].
?  Swift

You selected Swift, good choice!

您可以自定义每个选择元素的返回值。例如,如果要从选择中获取一个整数值,可以这样操作:

    let choice = choose("Whats your favorite programming language? ", type: Int.self) { settings in
        settings.addChoice("Swift") { 42 }
        settings.addChoice("Objective C") { 20 }
    }

左侧的数字可以改为字母,以下是操作方法:

    let choice = choose("Whats your favorite programming language? ", type: String.self) { settings in
        //choice value will be set to GOOD
        settings.addChoice("Swift") { "GOOD" }

        //choice value will be set to BAD
        settings.addChoice("Java") { "BAD" }

        settings.index = .Letters
        settings.indexSuffix = " ----> "
    }

这将打印:

a ----> Swift
b ----> Java
Whats your favorite programming language?

同意

“同意”用于询问用户一个是/否的问题。它返回一个表示用户输入的布尔值。

    let choice = agree("Are you sure you want to `rm -rf /` ?")

如果用户输入任何无效输入,则“同意”将继续提示用户是/否问题。

Are you sure you want to `rm -rf /` ?  What!
Please enter "yes" or "no".
Are you sure you want to `rm -rf /` ?  Wait
Please enter "yes" or "no".
Are you sure you want to `rm -rf /` ?  No

You entered false

运行🏃

“运行”提供了一种快速、简洁的方式来运行外部命令并读取其标准输出和标准错误。

要执行简单命令,可以这样操作:

    let result = run("ls -all")
    print(result.stdout)

result 类型是 RunResults,它包含以下内容:

  • exitStatus:命令的退出状态
  • stdout:已执行命令的标准输出
  • stderr:已执行命令的标准错误

虽然 run("command") 可以通过空格来拆分参数,但有时参数拆分并不是显而易见的。如果有多个参数需要传递给要执行的命令,应使用 run(command: String, args: String...)。上面的代码可以转换为:

    let result = run("ls", args: "-all")

要自定义运行函数,可以传递一个自定义块。

    let result = run("ls -all") { settings in
        settings.dryRun = true
        settings.echo = [.Stdout, .Stderr, .Command]
        settings.interactive = false
    }

settings 是一个 RunSettings 的实例,它包含以下变量:

  • settings.dryRun:默认为 false。如果为 false,则实际上会运行命令。如果为 true,则将命令记录到结果的 stdout 参数中。
  • settings.echo:自定义打印到标准输出的消息,echo 可以包含以下内容中的任何一个:
    • EchoSettings.Stdout:将运行命令返回的标准输出打印到终端
    • EchoSettings.Stderr:将运行命令返回的标准错误打印到终端
    • EchoSettings.Command:将执行的命令打印到终端

  • settings.interactive:默认为 false。如果设置为 true,则使用 system 内核功能执行命令,并且仅捕获退出状态。如果设置为 false,使用 NSTask 执行命令,并捕获标准输出和标准错误。如果预期启动的命令将通过标准输入询问用户输入,则将 interactive 设置为 true。

runWithoutCapture("command") 是以交互模式快速运行命令的一种方法。返回值是命令的退出代码。

环境变量

环境变量用于读取和写入传递给脚本的脚本。

// Set enviroment variable
Env.set("key1", "value1")

// Get environment variable
Env.get("SomeKey")

// Clear all variables
Env.clear()

// Get all keys and values
Env.keys()
Env.values()

参数

返回传递给脚本的参数。例如,在调用 script -f1 val1 -f2 val2 -- val3 val4 时。

Args.all 返回所有原始参数的数组,在这个例子中它将是 ["-f1", "val1", "-f2", "val2", "--", "val3", "val4"]

Args.parsed 返回一个包含已解析参数映射和参数数组的结构,对于这个例子

Args.parsed.parameters 返回 ["val3", "val4"]

Args.parsed.flags 返回标志字典 ["f1": "val1", "f2", "val2"]

Args.parsed.command 返回可执行文件本身的名称 "script"

安装

您可以使用CocoaPods、carthage和Swift包管理器安装Swiftline。

Swift包管理器

将swiftline作为依赖项添加到您的Package.swift文件中。

  import PackageDescription

  let package = Package(name: "YourPackage",
    dependencies: [
      .Package(url: "https://github.com/Swiftline/Swiftline.git", majorVersion: 0, minor: 3),
    ]
  )

手动安装

要手动安装Swiftline,请将Pod/Swiftline目录添加到您的项目中。

示例

示例列表可以在这里找到。

测试

测试可以在这里找到。他们可以从Xcode中正常运行。

文档

文档可以在这里找到。

未来改进

  • 将(gather)从highline添加到询问功能中
  • 找出一种方法来消灭对interactive的需求
  • 添加Glob处理
  • 更好的文档

致谢

Daniel Beere为创建标志@DanielBeere,查看danielbeere on dribble;Omar Abdelhafith是当前项目的维护者@ifnottrue