Issue #3 update with rule and sequence support, also scope to specific target
diff --git a/WhiskSwiftTools/PBXProject.swift b/WhiskSwiftTools/PBXProject.swift
index 94e8e77..016509f 100644
--- a/WhiskSwiftTools/PBXProject.swift
+++ b/WhiskSwiftTools/PBXProject.swift
@@ -13,6 +13,7 @@
case inTarget
case inNamedTarget
case inSources
+ case inResources
case inFiles
case parseFileNames
case done
@@ -63,6 +64,10 @@
parseState = .inSources
let components = trimmedLine.components(separatedBy: CharacterSet.whitespaces)
targetKey = components[0]
+ } else if trimmedLine.range(of: "/* Resources */") != nil {
+ parseState = .inResources
+ let components = trimmedLine.components(separatedBy: CharacterSet.whitespaces)
+ targetKey = components[0]
}
case .inSources:
@@ -70,12 +75,17 @@
if trimmedLine.range(of: token ) != nil {
parseState = .inFiles
}
+ case .inResources:
+ let token = "\(targetKey!) /* Resources */"
+ if trimmedLine.range(of: token ) != nil {
+ parseState = .inFiles
+ }
case .inFiles:
if trimmedLine.range(of: "files = (") != nil {
parseState = .parseFileNames
}
case .parseFileNames:
- if (trimmedLine.range(of: "in Sources */") != nil) {
+ if (trimmedLine.range(of: "in Sources */") != nil) || (trimmedLine.range(of: "in Resources */") != nil) {
let components = trimmedLine.components(separatedBy: CharacterSet.whitespaces)
let fileName = components[2]
if var files = filesForTarget[targetName] {
diff --git a/WhiskSwiftTools/ProjectManager.swift b/WhiskSwiftTools/ProjectManager.swift
index 7752387..424d176 100644
--- a/WhiskSwiftTools/ProjectManager.swift
+++ b/WhiskSwiftTools/ProjectManager.swift
@@ -62,7 +62,7 @@
try self.installActions()
try self.installSequences()
try self.installRules()
- try self.enableRules()
+ //try self.enableRules()
group.leave()
} catch {
@@ -197,6 +197,7 @@
let group = DispatchGroup()
for (name, rule) in rules {
+ print("Creating rule \(name)")
try whisk.createRule(name: name as String, namespace: namespace, triggerName: rule.trigger as String, actionName: rule.action as String, group: group)
}
diff --git a/WhiskSwiftTools/ProjectReader.swift b/WhiskSwiftTools/ProjectReader.swift
index f5c2965..1573bdd 100644
--- a/WhiskSwiftTools/ProjectReader.swift
+++ b/WhiskSwiftTools/ProjectReader.swift
@@ -345,6 +345,7 @@
}
for entity in xcodeTuple.rules {
+ print("Processing rule \(entity.name)")
ruleDict[entity.name] = entity
}
@@ -352,6 +353,7 @@
sequenceDict[entity.name] = entity
}
+
} catch {
print("Error reading xcode project \(error)")
}
diff --git a/WhiskSwiftTools/WhiskAPI.swift b/WhiskSwiftTools/WhiskAPI.swift
index 37c7585..acbb944 100644
--- a/WhiskSwiftTools/WhiskAPI.swift
+++ b/WhiskSwiftTools/WhiskAPI.swift
@@ -314,10 +314,17 @@
let path = "namespaces/\(namespace)/rules/\(name)"
- let whiskParameters = ["trigger": triggerName, "action": actionName]
+ let whiskParameters = ["action": actionName,"trigger":triggerName]
group.enter()
- try networkManager.putCall(url: urlStr, path: path, parameters: whiskParameters as [String : AnyObject]?, group: group)
+ try networkManager.putCall(url: urlStr, path: path, parameters: whiskParameters as [String : AnyObject], group: group) {
+ response, error in
+ if let error = error {
+ print("Error creating rule \(name), error \(error)")
+ } else {
+ print("Created rule response \(response)")
+ }
+ }
}
@@ -325,7 +332,6 @@
let urlStr: String = whiskBaseURL != nil ? whiskBaseURL! : DefaultBaseURL
-
let path = "namespaces/\(namespace)/rules/\(name)"
group.enter()
@@ -528,9 +534,9 @@
request.addValue("Basic \(whiskCredentials.getBase64AuthString())", forHTTPHeaderField: "Authorization")
request.httpMethod = "PUT"
+
if let parameters = parameters {
request.httpBody = try JSONSerialization.data(withJSONObject: parameters as AnyObject, options: JSONSerialization.WritingOptions())
-
}
let task = urlSession.dataTask(with: request) {
@@ -552,7 +558,12 @@
} else {
if let callback = callback {
- callback(["status":statusCode, "msg":"PUT call success"], nil)
+ do {
+ let respMsg = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions())
+ callback(["status":statusCode, "msg":respMsg], nil)
+ } catch {
+ print("Error serialzing server response \(error)")
+ }
}
}
diff --git a/WhiskSwiftTools/WhiskTokenizer.swift b/WhiskSwiftTools/WhiskTokenizer.swift
index a799b51..6cb23ad 100644
--- a/WhiskSwiftTools/WhiskTokenizer.swift
+++ b/WhiskSwiftTools/WhiskTokenizer.swift
@@ -89,18 +89,19 @@
var isDir = ObjCBool(false)
let fullPath = atPath+"/\(item)"
- //print("===== inspecting \(fullPath)")
+ print("===== inspecting \(item.lastPathComponent)")
if dir.fileExists(atPath: fullPath, isDirectory: &isDir) == true {
if isDir.boolValue == true {
} else if item.hasSuffix(".swift") {
if fileList.contains(item.lastPathComponent as String) {
+ print("****Processing \(item.lastPathComponent)")
do {
let fileStr = try String(contentsOfFile: fullPath)
if let entityTuple = getWhiskEntities(str: fileStr) {
- for action in entityTuple.0 {
+ for action in entityTuple.actions {
do {
let actionDirPath = toPath+"/\(OpenWhiskActionTarget)"
@@ -121,11 +122,21 @@
}
}
- for trigger in entityTuple.1 {
+ for trigger in entityTuple.triggers {
let whiskTrigger = Trigger(name: trigger.triggerName as NSString, feed: nil, parameters: nil)
whiskTriggerArray.append(whiskTrigger)
}
+ for rule in entityTuple.rules {
+ let rule = Rule(name: rule.ruleName as NSString, trigger: rule.triggerName as NSString, action: rule.actionName as NSString)
+ whiskRuleArray.append(rule)
+ }
+
+ for sequence in entityTuple.sequences {
+ let seq = Sequence(name: sequence.sequenceName as NSString, actions: sequence.actionNames)
+ whiskSequenceArray.append(seq)
+ }
+
}
} catch {
@@ -143,7 +154,7 @@
return (whiskActionArray, whiskTriggerArray, whiskRuleArray, whiskSequenceArray)
}
- func getWhiskEntities(str: String) -> ([ActionToken], [TriggerToken], [RuleToken], [SequenceToken])? {
+ func getWhiskEntities(str: String) -> (actions: [ActionToken], triggers: [TriggerToken], rules: [RuleToken], sequences: [SequenceToken])? {
let scanner = Scanner(string: str)
@@ -179,23 +190,50 @@
switch state {
case .initial:
- if trimmedLine.range(of: "class") != nil && trimmedLine.range(of: "WhiskTrigger") != nil && trimmedLine.range(of: ":") != nil {
+ if trimmedLine.range(of: "let") != nil && trimmedLine.range(of: "WhiskTrigger()") != nil {
- let classStr = trimmedLine.components(separatedBy: ":")
-
+ let classStr = trimmedLine.components(separatedBy: "=")
// get actionName
- let classIndex = classStr[0].characters.index(classStr[0].startIndex, offsetBy: 6)
-
- let triggerName = classStr[0].substring(from: classIndex).trimmingCharacters(in: CharacterSet.whitespaces)
-
- print("Trigger name is \(triggerName)")
-
+ let letStr = classStr[0].components(separatedBy: .whitespaces)
+ let triggerName = letStr[1]
let triggerToken = TriggerToken(triggerName: triggerName)
triggerArray.append(triggerToken)
- } else if trimmedLine.range(of: "WhiskRule") != nil {
+ } else if trimmedLine.range(of: "let") != nil && trimmedLine.range(of: "WhiskRule(") != nil && trimmedLine.range(of: "trigger:") != nil && trimmedLine.range(of: "action:") != nil{
+ var classStr = trimmedLine.components(separatedBy: "=")
+ let letStr = classStr[0].components(separatedBy: .whitespaces)
+ let ruleName = letStr[1].trimmingCharacters(in: .whitespacesAndNewlines)
- } else if trimmedLine.range(of: "WhiskSequence") != nil {
+ let paramStr = classStr[1].replacingOccurrences(of: "WhiskRule", with: "").components(separatedBy: ",")
+ let triggerStr = paramStr[0].components(separatedBy: ":")
+ let triggerName = triggerStr[1].trimmingCharacters(in: .whitespacesAndNewlines)
+ var actionStr = paramStr[1].components(separatedBy: ":")
+ let actionName = actionStr[1].replacingOccurrences(of: "(", with: "").replacingOccurrences(of: ")", with: "").trimmingCharacters(in: .whitespaces)
+
+
+
+ print("Got trigger:\(triggerName), action:\(actionName)")
+
+ let rule = RuleToken(ruleName: ruleName, triggerName: triggerName, actionName: actionName)
+ ruleArray.append(rule)
+
+ } else if trimmedLine.range(of: "let") != nil && trimmedLine.range(of: "WhiskSequence(") != nil {
+ var classStr = trimmedLine.components(separatedBy: "=")
+ let letStr = classStr[0].components(separatedBy: .whitespaces)
+ let sequenceName = letStr[1]
+
+ let paramStr = classStr[1].replacingOccurrences(of: "WhiskSequence", with: "").components(separatedBy: ":")
+
+ let actionNames = paramStr[1].replacingOccurrences(of: "[", with: "").replacingOccurrences(of: "]", with: "").replacingOccurrences(of: "(", with: "").replacingOccurrences(of: ")", with: "").replacingOccurrences(of: " ", with: "")
+
+ print("Got sequence \(actionNames)")
+ let names = actionNames.components(separatedBy: ",")
+ var sequenceActions = [String]()
+ for name in names {
+ sequenceActions.append(name)
+ }
+ let sequence = SequenceToken(sequenceName: sequenceName, actionNames: sequenceActions)
+ sequenceArray.append(sequence)
} else if trimmedLine.range(of: "OpenWhiskAction") == nil && trimmedLine.range(of: "class") != nil && trimmedLine.range(of: ":") != nil && trimmedLine.range(of: "WhiskAction") != nil {
@@ -276,7 +314,7 @@
}
- return (actionArray, triggerArray, ruleArray, sequenceArray)
+ return (actions: actionArray, triggers: triggerArray, rules: ruleArray, sequences: sequenceArray)
}
}