Slide 1

Slide 1 text

Swift FOR COMMAND-LINE TOOLS Marin Usalj - @supermarin - supermar.in

Slide 2

Slide 2 text

Swift FOR COMMAND-LINE TOOLS Marin Usalj - @supermarin - supermar.in

Slide 3

Slide 3 text

EVOLUTION Marin Usalj - @supermarin - supermar.in

Slide 4

Slide 4 text

/Applications/Xcode6-Beta1.app/Contents/ Developer/usr/bin/xcrun swift -i hello.swift Marin Usalj - @supermarin - supermar.in

Slide 5

Slide 5 text

xcrun swift -i hello.swift Marin Usalj - @supermarin - supermar.in

Slide 6

Slide 6 text

swift -i hello.swift Marin Usalj - @supermarin - supermar.in

Slide 7

Slide 7 text

swift hello.swift Marin Usalj - @supermarin - supermar.in

Slide 8

Slide 8 text

XCODE-LESS DEVELOPMENT Marin Usalj - @supermarin - supermar.in

Slide 9

Slide 9 text

SCRIPTING VS COMPILING Marin Usalj - @supermarin - supermar.in

Slide 10

Slide 10 text

INTERPRETED LANGUAGES $ruby script.rb #Hello world! Marin Usalj - @supermarin - supermar.in

Slide 11

Slide 11 text

INTERPRETED LANGUAGES $python script.py #Hello workd! Marin Usalj - @supermarin - supermar.in

Slide 12

Slide 12 text

Marin Usalj - @supermarin - supermar.in

Slide 13

Slide 13 text

COMPILED LANGUAGES $ clang -lobjc -framework Foundation -c script.m -o script.o $ chmod +x script.o $ ./script.o Marin Usalj - @supermarin - supermar.in

Slide 14

Slide 14 text

GOLANG $ go run script.go Marin Usalj - @supermarin - supermar.in

Slide 15

Slide 15 text

GOLANG $ go build script.go $ chmod +x script $ ./script Marin Usalj - @supermarin - supermar.in

Slide 16

Slide 16 text

GOLANG $ go install script.go $ script Marin Usalj - @supermarin - supermar.in

Slide 17

Slide 17 text

SWIFT WENT IN THE GO DIRECTION Marin Usalj - @supermarin - supermar.in

Slide 18

Slide 18 text

SWIFT # Execute inline $ swift todos.swift Marin Usalj - @supermarin - supermar.in

Slide 19

Slide 19 text

SWIFT # Compile and run - $ swiftc todos.swift -o todos - chmod +x todos - todos Marin Usalj - @supermarin - supermar.in

Slide 20

Slide 20 text

CAVEATS $ time swift hello.swift Hello ! 0.33 real 0.04 user 0.05 sys Marin Usalj - @supermarin - supermar.in

Slide 21

Slide 21 text

CAVEATS $ swiftc hello.swift $ time ./hello Hello ! 0.00 real 0.00 user 0.00 sys Marin Usalj - @supermarin - supermar.in

Slide 22

Slide 22 text

CLI 101 Marin Usalj - @supermarin - supermar.in

Slide 23

Slide 23 text

Marin Usalj - @supermarin - supermar.in

Slide 24

Slide 24 text

#!/usr/bin/env swift var args = Process.arguments[1..

Slide 25

Slide 25 text

$ ./hello.swift SLUG Hello SLUG! Marin Usalj - @supermarin - supermar.in

Slide 26

Slide 26 text

SHEBANG1 #!/usr/bin/env swift 1 Also known as Hashbang, or even pound-bang (Wikipedia) Marin Usalj - @supermarin - supermar.in

Slide 27

Slide 27 text

SHEBANG1 #!/usr/bin/env swift 1 Also known as Hashbang, or even pound-bang (Wikipedia) Marin Usalj - @supermarin - supermar.in

Slide 28

Slide 28 text

SHEBANG1 $ swift hello.swift BECOMES $ ./hello 1 Also known as Hashbang, or even pound-bang (Wikipedia) Marin Usalj - @supermarin - supermar.in

Slide 29

Slide 29 text

CHMOD $ chmod +x hello $ ./hello Marin Usalj - @supermarin - supermar.in

Slide 30

Slide 30 text

$PATH $ export PATH=~/bin:$PATH Tell your OS where to find the custom scripts Marin Usalj - @supermarin - supermar.in

Slide 31

Slide 31 text

STATUS CODES $? == 0 ! $? != 0 " Marin Usalj - @supermarin - supermar.in

Slide 32

Slide 32 text

STATUS CODES if drink == ! println(“NEED SCOTCH”) exit(1) else # do work exit(0) end Marin Usalj - @supermarin - supermar.in

Slide 33

Slide 33 text

OPTION PARSING2 OptionParser.new do |opts| opts.banner = "Usage: xcodebuild [options] | xcpretty" opts.on('-t', '--test', 'Use RSpec style output') do printer_opts[:formatter] = XCPretty::RSpec end end 2 Code sample is written in Ruby Marin Usalj - @supermarin - supermar.in

Slide 34

Slide 34 text

OPTION PARSING DON’T WRITE BY HAND. USE FRAMEWORKS Marin Usalj - @supermarin - supermar.in

Slide 35

Slide 35 text

CLIKIT KYLE FULLER Marin Usalj - @supermarin - supermar.in

Slide 36

Slide 36 text

CLIKIT var manager = Manager() manager.register("issue", "Options for issue") { argv in println("Say `open`, `close` or `edit`") } manager.run() Marin Usalj - @supermarin - supermar.in

Slide 37

Slide 37 text

OPTIONKIT ALEXANDROS SALAZAR Marin Usalj - @supermarin - supermar.in

Slide 38

Slide 38 text

OPTIONKIT import OptionKit let opt1 = Option(trigger:.Mixed("e", "echo")) let opt2 = Option(trigger:.Mixed("h", "help")) let opt3 = Option(trigger:.Mixed("a", "allow-nothing")) let actualArguments = Array(Process.arguments[1..

Slide 39

Slide 39 text

POSIX FLAGS --FLAG -F Marin Usalj - @supermarin - supermar.in

Slide 40

Slide 40 text

POSIX FLAGS --VIEW --CONTROLLER -VC Marin Usalj - @supermarin - supermar.in

Slide 41

Slide 41 text

DOCUMENTATION Marin Usalj - @supermarin - supermar.in

Slide 42

Slide 42 text

git --help man git Marin Usalj - @supermarin - supermar.in

Slide 43

Slide 43 text

Usage: xcodebuild [options] | xcpretty -t, --test Use RSpec style output -s, --simple Use simple output (default) -k, --knock Use knock output -f, --formatter PATH Use formatter returned from evaluating the specified Ruby file -c, --color Use colorized output Marin Usalj - @supermarin - supermar.in

Slide 44

Slide 44 text

OPTION PARSER GENERATES DOCS FOR YOU Marin Usalj - @supermarin - supermar.in

Slide 45

Slide 45 text

IO THE MOST IMPORTANT PART OF A CLI TOOL Marin Usalj - @supermarin - supermar.in

Slide 46

Slide 46 text

IO SPAWNING (POPEN) Marin Usalj - @supermarin - supermar.in

Slide 47

Slide 47 text

IO BEING SPAWNED git status | slug | say Marin Usalj - @supermarin - supermar.in

Slide 48

Slide 48 text

READING / WRITING Marin Usalj - @supermarin - supermar.in

Slide 49

Slide 49 text

import IO STDIN.eachLine { line in print("PRINTING: \(line)") } file.eachLine { line in print("PRINTING: \(line)") } Marin Usalj - @supermarin - supermar.in

Slide 50

Slide 50 text

import IO readLines(stdin) { line in print("PRINTING: \(line)") } readLines(file) { line in print("PRINTING: \(line)") } Marin Usalj - @supermarin - supermar.in

Slide 51

Slide 51 text

FILE FILESYSTEM TRAVERSAL Marin Usalj - @supermarin - supermar.in

Slide 52

Slide 52 text

NSFILEMANAGER APIS Marin Usalj - @supermarin - supermar.in

Slide 53

Slide 53 text

NSFILEMANAGER APIS Marin Usalj - @supermarin - supermar.in

Slide 54

Slide 54 text

File.join(Dir.home, "code") # ~/code File.expand_path("~/code/file.rb") # /Users/supermarin/code/file.rb Marin Usalj - @supermarin - supermar.in

Slide 55

Slide 55 text

Pain points Marin Usalj - @supermarin - supermar.in

Slide 56

Slide 56 text

Marin Usalj - @supermarin - supermar.in

Slide 57

Slide 57 text

EXTERNAL LIBRARIES Marin Usalj - @supermarin - supermar.in

Slide 58

Slide 58 text

Imagine building an alarm clock that also talks to your coffee machine through it's API and requests a Lyft after you drink the coffee. Marin Usalj - @supermarin - supermar.in

Slide 59

Slide 59 text

RUBYGEMS COCOAPODS Marin Usalj - @supermarin - supermar.in

Slide 60

Slide 60 text

PEOPLE ABUSING /LIBRARY/FRAMEWORKS REQUIRES SUDO Marin Usalj - @supermarin - supermar.in

Slide 61

Slide 61 text

FILE STRUCTURE --XCODE-- Marin Usalj - @supermarin - supermar.in

Slide 62

Slide 62 text

FILE STRUCTURE !"" slug #"" bin !"" lib Marin Usalj - @supermarin - supermar.in

Slide 63

Slide 63 text

TESTS Marin Usalj - @supermarin - supermar.in

Slide 64

Slide 64 text

TESTS !"" slug #"" bin #"" lib !"" test Marin Usalj - @supermarin - supermar.in

Slide 65

Slide 65 text

$ swift test Marin Usalj - @supermarin - supermar.in

Slide 66

Slide 66 text

STRING MANIPULATION Marin Usalj - @supermarin - supermar.in

Slide 67

Slide 67 text

REGEX Marin Usalj - @supermarin - supermar.in

Slide 68

Slide 68 text

DISTRIBUTING FRAMEWORKS Marin Usalj - @supermarin - supermar.in

Slide 69

Slide 69 text

Q/A MARIN USALJ | @SUPERMARIN | SUPERMAR.IN Marin Usalj - @supermarin - supermar.in

Slide 70

Slide 70 text

Thank you Marin Usalj - @supermarin - supermar.in