├── todo.xcodeproj
├── project.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ │ └── IDEWorkspaceChecks.plist
├── xcuserdata
│ └── thall.xcuserdatad
│ │ └── xcschemes
│ │ └── xcschememanagement.plist
└── project.pbxproj
├── todo
├── Ticket.swift
├── Extensions.swift
├── Person.swift
├── Task.swift
├── Document.swift
└── main.swift
└── .gitignore
/todo.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/todo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/todo/Ticket.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Ticket.swift
3 | // todo
4 | //
5 | // Created by Tyler Hall on 6/21/20.
6 | // Copyright © 2020 Tyler Hall. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | class Ticket {
12 |
13 | static var all = [Ticket]()
14 |
15 | var prefix = "IOT"
16 | var guid = "0"
17 | }
18 |
--------------------------------------------------------------------------------
/todo.xcodeproj/xcuserdata/thall.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | todo.xcscheme_^#shared#^_
8 |
9 | orderHint
10 | 0
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/todo/Extensions.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Extensions.swift
3 | // todo
4 | //
5 | // Created by Tyler Hall on 6/21/20.
6 | // Copyright © 2020 Tyler Hall. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | extension String {
12 |
13 | func matchingStrings(regex: String) -> [[String]] {
14 | guard let regex = try? NSRegularExpression(pattern: regex, options: [.dotMatchesLineSeparators]) else { return [] }
15 | let nsString = self as NSString
16 | let results = regex.matches(in: self, options: [.withoutAnchoringBounds], range: NSMakeRange(0, nsString.length))
17 | return results.map { result in
18 | (0.. Bool {
19 | return lhs.name == rhs.name
20 | }
21 |
22 | func hash(into hasher: inout Hasher) {
23 | hasher.combine(name)
24 | }
25 |
26 | static func withName(_ name: String) -> Person {
27 | let name = name.trimmingCharacters(in: CharacterSet(charactersIn: "@")).lowercased()
28 | if let foundPerson = Person.all.first(where: { (p) -> Bool in
29 | return p.name == name
30 | }) {
31 | return foundPerson
32 | }
33 |
34 | let person = Person()
35 | person.name = name
36 | Person.all.append(person)
37 | return person
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/todo/Task.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Task.swift
3 | // todo
4 | //
5 | // Created by Tyler Hall on 6/21/20.
6 | // Copyright © 2020 Tyler Hall. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | class Task {
12 |
13 | static var all = [Ticket]()
14 |
15 | var guid = UUID().uuidString
16 | var document: Document
17 | var text: String
18 | var people = Set()
19 | var tickets = [Ticket]()
20 |
21 | var completed: Bool {
22 | let lower = text.lowercased()
23 | if lower.contains("xxx") {
24 | return true
25 | }
26 | if lower.hasPrefix("x ") {
27 | return true
28 | }
29 | return false
30 | }
31 |
32 | var date: Date {
33 | if text.contains("EOD") {
34 | return document.date
35 | }
36 |
37 | let pattern = #"20[0-9]{2}-[0-9]{2}-[0-9]{2}"#
38 | let matches = text.matchingStrings(regex: pattern)
39 | if matches.count > 0 {
40 | let df = DateFormatter()
41 | df.dateFormat = "YYYY-MM-dd"
42 | if let dateStr = matches[0].first, let date = df.date(from: dateStr) {
43 | return date
44 | }
45 | }
46 |
47 | return document.date
48 | }
49 |
50 | var string: String {
51 | var str = completed ? "[x] " : "[ ] "
52 |
53 | if !Calendar.current.isDate(date, inSameDayAs: document.date) {
54 | let dateStr = mainDF.string(from: date)
55 | str += "(\(dateStr) "
56 | }
57 |
58 | return "\(str) \(text)"
59 | }
60 |
61 | init(document: Document, text: String) {
62 | self.document = document
63 | self.text = text.trimmingCharacters(in: .whitespacesAndNewlines)
64 | }
65 | }
66 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Xcode
2 | #
3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
4 |
5 | ## Build generated
6 | build/
7 | DerivedData/
8 |
9 | ## Various settings
10 | *.pbxuser
11 | !default.pbxuser
12 | *.mode1v3
13 | !default.mode1v3
14 | *.mode2v3
15 | !default.mode2v3
16 | *.perspectivev3
17 | !default.perspectivev3
18 | xcuserdata/
19 |
20 | ## Other
21 | *.moved-aside
22 | *.xccheckout
23 | *.xcscmblueprint
24 |
25 | ## Obj-C/Swift specific
26 | *.hmap
27 | *.ipa
28 | *.dSYM.zip
29 | *.dSYM
30 |
31 | ## Playgrounds
32 | timeline.xctimeline
33 | playground.xcworkspace
34 |
35 | # Swift Package Manager
36 | #
37 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.
38 | Packages/
39 | Package.pins
40 | Package.resolved
41 | .build/
42 | .swiftpm
43 |
44 | # CocoaPods
45 | #
46 | # We recommend against adding the Pods directory to your .gitignore. However
47 | # you should judge for yourself, the pros and cons are mentioned at:
48 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
49 | #
50 | Pods/
51 |
52 | # Carthage
53 | #
54 | # Add this line if you want to avoid checking in source code from Carthage dependencies.
55 | Carthage/Checkouts
56 |
57 | Carthage/Build
58 |
59 | # fastlane
60 | #
61 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the
62 | # screenshots whenever they are needed.
63 | # For more information about the recommended setup visit:
64 | # https://docs.fastlane.tools/best-practices/source-control/#source-control
65 |
66 | fastlane/report.xml
67 | fastlane/Preview.html
68 | fastlane/screenshots/**/*.png
69 | fastlane/test_output
70 |
71 | .DS_Store
72 |
--------------------------------------------------------------------------------
/todo/Document.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Document.swift
3 | // todo
4 | //
5 | // Created by Tyler Hall on 6/21/20.
6 | // Copyright © 2020 Tyler Hall. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | class Document {
12 |
13 | static var all = [Document]()
14 |
15 | var fileURL: URL
16 | var tasks = [Task]()
17 | var people = Set()
18 |
19 | var title: String {
20 | return fileURL.deletingPathExtension().lastPathComponent
21 | }
22 |
23 | var date: Date {
24 | let pattern = #"20[0-9]{2}-[0-9]{2}-[0-9]{2}"#
25 | let matches = title.matchingStrings(regex: pattern)
26 | if matches.count > 0 {
27 | let df = DateFormatter()
28 | df.dateFormat = "YYYY-MM-dd"
29 | if let dateStr = matches[0].first, let date = df.date(from: dateStr) {
30 | return date
31 | }
32 | }
33 |
34 | if let attr = try? FileManager.default.attributesOfItem(atPath: fileURL.path), let date = attr[FileAttributeKey.creationDate] as? Date {
35 | return date
36 | }
37 |
38 | return Date.distantPast
39 | }
40 |
41 | var string: String {
42 | let df = DateFormatter()
43 | df.dateFormat = "EEEE MMM d"
44 | let dateStr = df.string(from: date)
45 | return "\(dateStr): \(title)".uppercased()
46 | }
47 |
48 | init(fileURL: URL) {
49 | self.fileURL = fileURL
50 | parse()
51 | }
52 |
53 | func parse() {
54 | let textURL = fileURL.appendingPathComponent("text").appendingPathExtension("md")
55 | guard let data = try? Data(contentsOf: textURL) else { return }
56 | guard let contents = String(data: data, encoding: .utf8) else { return }
57 | let lines = contents.components(separatedBy: "\n")
58 | guard lines.count > 0 else { return }
59 |
60 | for line in lines {
61 | let pattern = #"@[a-zA-Z]{3,99}"#
62 | let names = line.matchingStrings(regex: pattern)
63 | if names.count > 0 {
64 | let task = Task(document: self, text: line)
65 | tasks.append(task)
66 |
67 | for name in names {
68 | if let name = name.first {
69 | let person = Person.withName(name)
70 | people.insert(person)
71 | task.people.insert(person)
72 | person.tasks.append(task)
73 | }
74 | }
75 | }
76 | }
77 | }
78 | }
79 |
--------------------------------------------------------------------------------
/todo/main.swift:
--------------------------------------------------------------------------------
1 | //
2 | // main.swift
3 | // todo
4 | //
5 | // Created by Tyler Hall on 6/21/20.
6 | // Copyright © 2020 Tyler Hall. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | import ArgumentParser
11 |
12 | struct TodoOptions: ParsableArguments {
13 | @Option(name: .shortAndLong, help: ArgumentHelp("The folder to scan.", discussion: "If omitted, the current directory will be used.", valueName: "folder"))
14 | var folder: String?
15 |
16 | @Flag(help: "Show completed tasks.")
17 | var done: Bool
18 |
19 | @Flag(help: "Show incomplete tasks.")
20 | var undone: Bool
21 |
22 | @Option(name: .shortAndLong, help: ArgumentHelp("The number of recent documents to display", discussion: "Defaults to 1.", valueName: "integer"))
23 | var count: Int?
24 | }
25 |
26 | let options = TodoOptions.parseOrExit()
27 | let documentCount = options.count ?? 1
28 | let showDone = (!options.done && !options.undone) || options.done
29 | let showUndone = (!options.done && !options.undone) || options.undone
30 |
31 | let mainDF = DateFormatter()
32 | mainDF.dateFormat = "YYYY-MM-dd"
33 |
34 | let folderPath = options.folder ?? FileManager.default.currentDirectoryPath
35 | let folderURL = URL(fileURLWithPath: folderPath)
36 |
37 | var files: [URL]
38 | do {
39 | files = try FileManager.default.contentsOfDirectory(at: folderURL, includingPropertiesForKeys: nil, options: [FileManager.DirectoryEnumerationOptions.skipsHiddenFiles])
40 | } catch {
41 | fatalError("Could not read contents of \(folderPath)")
42 | }
43 |
44 | // PARSE CONTENTS
45 |
46 | for file in files where file.pathExtension == "textbundle" {
47 | let doc = Document(fileURL: file)
48 | Document.all.append(doc)
49 | }
50 |
51 | let sortedDocuments = Document.all.sorted { (a, b) -> Bool in
52 | return a.date > b.date
53 | }
54 | for i in 0.. 0 else { continue }
57 |
58 | let docStr = doc.string
59 | print(docStr)
60 | print(String(repeating: "=", count: docStr.count))
61 |
62 | let sortedPeople = doc.people.sorted { (a, b) -> Bool in
63 | return a.name < b.name
64 | }
65 |
66 | var printedSomething = false
67 | for person in sortedPeople where person.tasks.count > 0 {
68 | var tasksStr = ""
69 | for t in person.tasks where Calendar.current.isDate(t.date, inSameDayAs: doc.date) {
70 | if t.completed && showDone {
71 | tasksStr += t.string + "\n"
72 | } else if !t.completed && showUndone {
73 | tasksStr += t.string + "\n"
74 | }
75 | }
76 |
77 | if tasksStr != "" {
78 | print(person.name)
79 | print(String(repeating: "-", count: person.name.count))
80 | print(tasksStr)
81 | printedSomething = true
82 | }
83 | }
84 |
85 | if printedSomething {
86 | print("\n")
87 | }
88 | }
89 |
--------------------------------------------------------------------------------
/todo.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 52;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | C609C93524A01AC6004E80B4 /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = C609C93424A01AC6004E80B4 /* main.swift */; };
11 | C609C93C24A01AEB004E80B4 /* Task.swift in Sources */ = {isa = PBXBuildFile; fileRef = C609C93B24A01AEB004E80B4 /* Task.swift */; };
12 | C609C93E24A01B14004E80B4 /* Person.swift in Sources */ = {isa = PBXBuildFile; fileRef = C609C93D24A01B14004E80B4 /* Person.swift */; };
13 | C609C94024A01B71004E80B4 /* Ticket.swift in Sources */ = {isa = PBXBuildFile; fileRef = C609C93F24A01B71004E80B4 /* Ticket.swift */; };
14 | C609C94224A01BD1004E80B4 /* Document.swift in Sources */ = {isa = PBXBuildFile; fileRef = C609C94124A01BD1004E80B4 /* Document.swift */; };
15 | C609C94424A01DD7004E80B4 /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C609C94324A01DD7004E80B4 /* Extensions.swift */; };
16 | C6D60BDD24A01EE100FC76CF /* ArgumentParser in Frameworks */ = {isa = PBXBuildFile; productRef = C6D60BDC24A01EE100FC76CF /* ArgumentParser */; };
17 | /* End PBXBuildFile section */
18 |
19 | /* Begin PBXCopyFilesBuildPhase section */
20 | C609C92F24A01AC6004E80B4 /* CopyFiles */ = {
21 | isa = PBXCopyFilesBuildPhase;
22 | buildActionMask = 2147483647;
23 | dstPath = /usr/share/man/man1/;
24 | dstSubfolderSpec = 0;
25 | files = (
26 | );
27 | runOnlyForDeploymentPostprocessing = 1;
28 | };
29 | /* End PBXCopyFilesBuildPhase section */
30 |
31 | /* Begin PBXFileReference section */
32 | C609C93124A01AC6004E80B4 /* todo */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = todo; sourceTree = BUILT_PRODUCTS_DIR; };
33 | C609C93424A01AC6004E80B4 /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = ""; };
34 | C609C93B24A01AEB004E80B4 /* Task.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Task.swift; sourceTree = ""; };
35 | C609C93D24A01B14004E80B4 /* Person.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Person.swift; sourceTree = ""; };
36 | C609C93F24A01B71004E80B4 /* Ticket.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Ticket.swift; sourceTree = ""; };
37 | C609C94124A01BD1004E80B4 /* Document.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Document.swift; sourceTree = ""; };
38 | C609C94324A01DD7004E80B4 /* Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Extensions.swift; sourceTree = ""; };
39 | /* End PBXFileReference section */
40 |
41 | /* Begin PBXFrameworksBuildPhase section */
42 | C609C92E24A01AC6004E80B4 /* Frameworks */ = {
43 | isa = PBXFrameworksBuildPhase;
44 | buildActionMask = 2147483647;
45 | files = (
46 | C6D60BDD24A01EE100FC76CF /* ArgumentParser in Frameworks */,
47 | );
48 | runOnlyForDeploymentPostprocessing = 0;
49 | };
50 | /* End PBXFrameworksBuildPhase section */
51 |
52 | /* Begin PBXGroup section */
53 | C609C92824A01AC6004E80B4 = {
54 | isa = PBXGroup;
55 | children = (
56 | C609C93324A01AC6004E80B4 /* todo */,
57 | C609C93224A01AC6004E80B4 /* Products */,
58 | );
59 | sourceTree = "";
60 | };
61 | C609C93224A01AC6004E80B4 /* Products */ = {
62 | isa = PBXGroup;
63 | children = (
64 | C609C93124A01AC6004E80B4 /* todo */,
65 | );
66 | name = Products;
67 | sourceTree = "";
68 | };
69 | C609C93324A01AC6004E80B4 /* todo */ = {
70 | isa = PBXGroup;
71 | children = (
72 | C609C93424A01AC6004E80B4 /* main.swift */,
73 | C609C93B24A01AEB004E80B4 /* Task.swift */,
74 | C609C93D24A01B14004E80B4 /* Person.swift */,
75 | C609C93F24A01B71004E80B4 /* Ticket.swift */,
76 | C609C94124A01BD1004E80B4 /* Document.swift */,
77 | C609C94324A01DD7004E80B4 /* Extensions.swift */,
78 | );
79 | path = todo;
80 | sourceTree = "";
81 | };
82 | /* End PBXGroup section */
83 |
84 | /* Begin PBXNativeTarget section */
85 | C609C93024A01AC6004E80B4 /* todo */ = {
86 | isa = PBXNativeTarget;
87 | buildConfigurationList = C609C93824A01AC6004E80B4 /* Build configuration list for PBXNativeTarget "todo" */;
88 | buildPhases = (
89 | C609C92D24A01AC6004E80B4 /* Sources */,
90 | C609C92E24A01AC6004E80B4 /* Frameworks */,
91 | C609C92F24A01AC6004E80B4 /* CopyFiles */,
92 | );
93 | buildRules = (
94 | );
95 | dependencies = (
96 | );
97 | name = todo;
98 | packageProductDependencies = (
99 | C6D60BDC24A01EE100FC76CF /* ArgumentParser */,
100 | );
101 | productName = todo;
102 | productReference = C609C93124A01AC6004E80B4 /* todo */;
103 | productType = "com.apple.product-type.tool";
104 | };
105 | /* End PBXNativeTarget section */
106 |
107 | /* Begin PBXProject section */
108 | C609C92924A01AC6004E80B4 /* Project object */ = {
109 | isa = PBXProject;
110 | attributes = {
111 | LastSwiftUpdateCheck = 1150;
112 | LastUpgradeCheck = 1150;
113 | ORGANIZATIONNAME = "Tyler Hall";
114 | TargetAttributes = {
115 | C609C93024A01AC6004E80B4 = {
116 | CreatedOnToolsVersion = 11.5;
117 | };
118 | };
119 | };
120 | buildConfigurationList = C609C92C24A01AC6004E80B4 /* Build configuration list for PBXProject "todo" */;
121 | compatibilityVersion = "Xcode 9.3";
122 | developmentRegion = en;
123 | hasScannedForEncodings = 0;
124 | knownRegions = (
125 | en,
126 | Base,
127 | );
128 | mainGroup = C609C92824A01AC6004E80B4;
129 | packageReferences = (
130 | C6D60BDB24A01EE100FC76CF /* XCRemoteSwiftPackageReference "swift-argument-parser" */,
131 | );
132 | productRefGroup = C609C93224A01AC6004E80B4 /* Products */;
133 | projectDirPath = "";
134 | projectRoot = "";
135 | targets = (
136 | C609C93024A01AC6004E80B4 /* todo */,
137 | );
138 | };
139 | /* End PBXProject section */
140 |
141 | /* Begin PBXSourcesBuildPhase section */
142 | C609C92D24A01AC6004E80B4 /* Sources */ = {
143 | isa = PBXSourcesBuildPhase;
144 | buildActionMask = 2147483647;
145 | files = (
146 | C609C93E24A01B14004E80B4 /* Person.swift in Sources */,
147 | C609C94424A01DD7004E80B4 /* Extensions.swift in Sources */,
148 | C609C93C24A01AEB004E80B4 /* Task.swift in Sources */,
149 | C609C93524A01AC6004E80B4 /* main.swift in Sources */,
150 | C609C94024A01B71004E80B4 /* Ticket.swift in Sources */,
151 | C609C94224A01BD1004E80B4 /* Document.swift in Sources */,
152 | );
153 | runOnlyForDeploymentPostprocessing = 0;
154 | };
155 | /* End PBXSourcesBuildPhase section */
156 |
157 | /* Begin XCBuildConfiguration section */
158 | C609C93624A01AC6004E80B4 /* Debug */ = {
159 | isa = XCBuildConfiguration;
160 | buildSettings = {
161 | ALWAYS_SEARCH_USER_PATHS = NO;
162 | CLANG_ANALYZER_NONNULL = YES;
163 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
164 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
165 | CLANG_CXX_LIBRARY = "libc++";
166 | CLANG_ENABLE_MODULES = YES;
167 | CLANG_ENABLE_OBJC_ARC = YES;
168 | CLANG_ENABLE_OBJC_WEAK = YES;
169 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
170 | CLANG_WARN_BOOL_CONVERSION = YES;
171 | CLANG_WARN_COMMA = YES;
172 | CLANG_WARN_CONSTANT_CONVERSION = YES;
173 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
174 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
175 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
176 | CLANG_WARN_EMPTY_BODY = YES;
177 | CLANG_WARN_ENUM_CONVERSION = YES;
178 | CLANG_WARN_INFINITE_RECURSION = YES;
179 | CLANG_WARN_INT_CONVERSION = YES;
180 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
181 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
182 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
183 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
184 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
185 | CLANG_WARN_STRICT_PROTOTYPES = YES;
186 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
187 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
188 | CLANG_WARN_UNREACHABLE_CODE = YES;
189 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
190 | COPY_PHASE_STRIP = NO;
191 | DEBUG_INFORMATION_FORMAT = dwarf;
192 | ENABLE_STRICT_OBJC_MSGSEND = YES;
193 | ENABLE_TESTABILITY = YES;
194 | GCC_C_LANGUAGE_STANDARD = gnu11;
195 | GCC_DYNAMIC_NO_PIC = NO;
196 | GCC_NO_COMMON_BLOCKS = YES;
197 | GCC_OPTIMIZATION_LEVEL = 0;
198 | GCC_PREPROCESSOR_DEFINITIONS = (
199 | "DEBUG=1",
200 | "$(inherited)",
201 | );
202 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
203 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
204 | GCC_WARN_UNDECLARED_SELECTOR = YES;
205 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
206 | GCC_WARN_UNUSED_FUNCTION = YES;
207 | GCC_WARN_UNUSED_VARIABLE = YES;
208 | MACOSX_DEPLOYMENT_TARGET = 10.15;
209 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
210 | MTL_FAST_MATH = YES;
211 | ONLY_ACTIVE_ARCH = YES;
212 | SDKROOT = macosx;
213 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
214 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
215 | };
216 | name = Debug;
217 | };
218 | C609C93724A01AC6004E80B4 /* Release */ = {
219 | isa = XCBuildConfiguration;
220 | buildSettings = {
221 | ALWAYS_SEARCH_USER_PATHS = NO;
222 | CLANG_ANALYZER_NONNULL = YES;
223 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
224 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
225 | CLANG_CXX_LIBRARY = "libc++";
226 | CLANG_ENABLE_MODULES = YES;
227 | CLANG_ENABLE_OBJC_ARC = YES;
228 | CLANG_ENABLE_OBJC_WEAK = YES;
229 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
230 | CLANG_WARN_BOOL_CONVERSION = YES;
231 | CLANG_WARN_COMMA = YES;
232 | CLANG_WARN_CONSTANT_CONVERSION = YES;
233 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
234 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
235 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
236 | CLANG_WARN_EMPTY_BODY = YES;
237 | CLANG_WARN_ENUM_CONVERSION = YES;
238 | CLANG_WARN_INFINITE_RECURSION = YES;
239 | CLANG_WARN_INT_CONVERSION = YES;
240 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
241 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
242 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
243 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
244 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
245 | CLANG_WARN_STRICT_PROTOTYPES = YES;
246 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
247 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
248 | CLANG_WARN_UNREACHABLE_CODE = YES;
249 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
250 | COPY_PHASE_STRIP = NO;
251 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
252 | ENABLE_NS_ASSERTIONS = NO;
253 | ENABLE_STRICT_OBJC_MSGSEND = YES;
254 | GCC_C_LANGUAGE_STANDARD = gnu11;
255 | GCC_NO_COMMON_BLOCKS = YES;
256 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
257 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
258 | GCC_WARN_UNDECLARED_SELECTOR = YES;
259 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
260 | GCC_WARN_UNUSED_FUNCTION = YES;
261 | GCC_WARN_UNUSED_VARIABLE = YES;
262 | MACOSX_DEPLOYMENT_TARGET = 10.15;
263 | MTL_ENABLE_DEBUG_INFO = NO;
264 | MTL_FAST_MATH = YES;
265 | SDKROOT = macosx;
266 | SWIFT_COMPILATION_MODE = wholemodule;
267 | SWIFT_OPTIMIZATION_LEVEL = "-O";
268 | };
269 | name = Release;
270 | };
271 | C609C93924A01AC6004E80B4 /* Debug */ = {
272 | isa = XCBuildConfiguration;
273 | buildSettings = {
274 | CODE_SIGN_STYLE = Automatic;
275 | DEVELOPMENT_TEAM = 3A6K89K388;
276 | ENABLE_HARDENED_RUNTIME = YES;
277 | PRODUCT_NAME = "$(TARGET_NAME)";
278 | SWIFT_VERSION = 5.0;
279 | };
280 | name = Debug;
281 | };
282 | C609C93A24A01AC6004E80B4 /* Release */ = {
283 | isa = XCBuildConfiguration;
284 | buildSettings = {
285 | CODE_SIGN_STYLE = Automatic;
286 | DEVELOPMENT_TEAM = 3A6K89K388;
287 | ENABLE_HARDENED_RUNTIME = YES;
288 | PRODUCT_NAME = "$(TARGET_NAME)";
289 | SWIFT_VERSION = 5.0;
290 | };
291 | name = Release;
292 | };
293 | /* End XCBuildConfiguration section */
294 |
295 | /* Begin XCConfigurationList section */
296 | C609C92C24A01AC6004E80B4 /* Build configuration list for PBXProject "todo" */ = {
297 | isa = XCConfigurationList;
298 | buildConfigurations = (
299 | C609C93624A01AC6004E80B4 /* Debug */,
300 | C609C93724A01AC6004E80B4 /* Release */,
301 | );
302 | defaultConfigurationIsVisible = 0;
303 | defaultConfigurationName = Release;
304 | };
305 | C609C93824A01AC6004E80B4 /* Build configuration list for PBXNativeTarget "todo" */ = {
306 | isa = XCConfigurationList;
307 | buildConfigurations = (
308 | C609C93924A01AC6004E80B4 /* Debug */,
309 | C609C93A24A01AC6004E80B4 /* Release */,
310 | );
311 | defaultConfigurationIsVisible = 0;
312 | defaultConfigurationName = Release;
313 | };
314 | /* End XCConfigurationList section */
315 |
316 | /* Begin XCRemoteSwiftPackageReference section */
317 | C6D60BDB24A01EE100FC76CF /* XCRemoteSwiftPackageReference "swift-argument-parser" */ = {
318 | isa = XCRemoteSwiftPackageReference;
319 | repositoryURL = "https://github.com/apple/swift-argument-parser";
320 | requirement = {
321 | kind = upToNextMajorVersion;
322 | minimumVersion = 0.1.0;
323 | };
324 | };
325 | /* End XCRemoteSwiftPackageReference section */
326 |
327 | /* Begin XCSwiftPackageProductDependency section */
328 | C6D60BDC24A01EE100FC76CF /* ArgumentParser */ = {
329 | isa = XCSwiftPackageProductDependency;
330 | package = C6D60BDB24A01EE100FC76CF /* XCRemoteSwiftPackageReference "swift-argument-parser" */;
331 | productName = ArgumentParser;
332 | };
333 | /* End XCSwiftPackageProductDependency section */
334 | };
335 | rootObject = C609C92924A01AC6004E80B4 /* Project object */;
336 | }
337 |
--------------------------------------------------------------------------------