From 775dbf0852f5d53d964cf599ff91279bb28da687 Mon Sep 17 00:00:00 2001 From: Olof Hellman Date: Thu, 11 Jan 2018 00:51:25 -0800 Subject: [PATCH] basic readonly scripting support for account, feed, folder --- AppleEvents/AppleEventUtils.swift | 6 ++ Evergreen.xcodeproj/project.pbxproj | 53 ++++++++++- Evergreen/Resources/Evergreen.sdef | 80 ++++++++++++++++ .../Scriptability/Account+Scriptability.swift | 95 +++++++++++++++++++ .../Scriptability/Feed+Scriptability.swift | 62 ++++++++++++ .../Scriptability/Folder+Scriptability.swift | 56 +++++++++++ .../NSApplication+Scriptability.swift | 30 ++++++ Evergreen/Scriptability/ScriptingObject.swift | 22 +++++ .../ScriptingObjectContainer.swift | 38 ++++++++ .../ScriptingTests/ScriptingTests.swift | 8 ++ .../testNameAndUrlOfEveryFeed.applescript | 10 ++ .../scripts/testNameOfEveryFolder.applescript | 11 +++ Frameworks/Account/Folder.swift | 2 +- 13 files changed, 469 insertions(+), 4 deletions(-) create mode 100644 Evergreen/Scriptability/Account+Scriptability.swift create mode 100644 Evergreen/Scriptability/Feed+Scriptability.swift create mode 100644 Evergreen/Scriptability/Folder+Scriptability.swift create mode 100644 Evergreen/Scriptability/NSApplication+Scriptability.swift create mode 100644 Evergreen/Scriptability/ScriptingObject.swift create mode 100644 Evergreen/Scriptability/ScriptingObjectContainer.swift create mode 100644 EvergreenTests/ScriptingTests/scripts/testNameAndUrlOfEveryFeed.applescript create mode 100644 EvergreenTests/ScriptingTests/scripts/testNameOfEveryFolder.applescript diff --git a/AppleEvents/AppleEventUtils.swift b/AppleEvents/AppleEventUtils.swift index d608fc5ca..80825c5b2 100644 --- a/AppleEvents/AppleEventUtils.swift +++ b/AppleEvents/AppleEventUtils.swift @@ -31,3 +31,9 @@ extension String { return (sum) } } +extension Int { + func FourCharCode() -> FourCharCode { + return (UInt32(self)) + } +} + diff --git a/Evergreen.xcodeproj/project.pbxproj b/Evergreen.xcodeproj/project.pbxproj index 166e84988..75e02d26e 100644 --- a/Evergreen.xcodeproj/project.pbxproj +++ b/Evergreen.xcodeproj/project.pbxproj @@ -134,7 +134,18 @@ D5907CA1200232A1005947E5 /* testGetURL.applescript in Sources */ = {isa = PBXBuildFile; fileRef = D5558FD1200223F60066386B /* testGetURL.applescript */; }; D5907CA2200232AD005947E5 /* testGenericScript.applescript in CopyFiles */ = {isa = PBXBuildFile; fileRef = D5907C9D20023249005947E5 /* testGenericScript.applescript */; }; D5907CA3200232AF005947E5 /* testGetURL.applescript in CopyFiles */ = {isa = PBXBuildFile; fileRef = D5558FD1200223F60066386B /* testGetURL.applescript */; }; + D5907D7F2004AC00005947E5 /* NSApplication+Scriptability.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5907D7E2004AC00005947E5 /* NSApplication+Scriptability.swift */; }; + D5907D972004B7EB005947E5 /* Account+Scriptability.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5907D962004B7EB005947E5 /* Account+Scriptability.swift */; }; + D5907DB22004BB37005947E5 /* ScriptingObjectContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5907DB12004BB37005947E5 /* ScriptingObjectContainer.swift */; }; + D5907DB32005F45D005947E5 /* AppleEventUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5558FD7200228B80066386B /* AppleEventUtils.swift */; }; D5D1751220020B980047B29D /* Evergreen.sdef in Resources */ = {isa = PBXBuildFile; fileRef = D5D175012002039D0047B29D /* Evergreen.sdef */; }; + D5F4EDB5200744A700B9E363 /* ScriptingObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5F4EDB4200744A700B9E363 /* ScriptingObject.swift */; }; + D5F4EDB720074D6500B9E363 /* Feed+Scriptability.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5F4EDB620074D6500B9E363 /* Feed+Scriptability.swift */; }; + D5F4EDB920074D7C00B9E363 /* Folder+Scriptability.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5F4EDB820074D7C00B9E363 /* Folder+Scriptability.swift */; }; + D5F4EDE620075C1300B9E363 /* testNameOfEveryFolder.applescript in Sources */ = {isa = PBXBuildFile; fileRef = D5F4EDD720075C1300B9E363 /* testNameOfEveryFolder.applescript */; }; + D5F4EDE820075C1800B9E363 /* testNameAndUrlOfEveryFeed.applescript in Sources */ = {isa = PBXBuildFile; fileRef = D5F4EDE720075C1800B9E363 /* testNameAndUrlOfEveryFeed.applescript */; }; + D5F4EDE920075C6700B9E363 /* testNameAndUrlOfEveryFeed.applescript in CopyFiles */ = {isa = PBXBuildFile; fileRef = D5F4EDE720075C1800B9E363 /* testNameAndUrlOfEveryFeed.applescript */; }; + D5F4EDEA20075C6700B9E363 /* testNameOfEveryFolder.applescript in CopyFiles */ = {isa = PBXBuildFile; fileRef = D5F4EDD720075C1300B9E363 /* testNameOfEveryFolder.applescript */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -428,6 +439,8 @@ dstPath = TestScripts; dstSubfolderSpec = 7; files = ( + D5F4EDE920075C6700B9E363 /* testNameAndUrlOfEveryFeed.applescript in CopyFiles */, + D5F4EDEA20075C6700B9E363 /* testNameOfEveryFolder.applescript in CopyFiles */, D5907CA2200232AD005947E5 /* testGenericScript.applescript in CopyFiles */, D5907CA3200232AF005947E5 /* testGetURL.applescript in CopyFiles */, ); @@ -562,7 +575,15 @@ D5907CDE2002F0BE005947E5 /* Evergreen_project.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Evergreen_project.xcconfig; sourceTree = ""; }; D5907CDF2002F0F9005947E5 /* EvergreenTests_target.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = EvergreenTests_target.xcconfig; sourceTree = ""; }; D5907CE02002F0FA005947E5 /* Evergreen_target.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Evergreen_target.xcconfig; sourceTree = ""; }; + D5907D7E2004AC00005947E5 /* NSApplication+Scriptability.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSApplication+Scriptability.swift"; sourceTree = ""; }; + D5907D962004B7EB005947E5 /* Account+Scriptability.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Account+Scriptability.swift"; sourceTree = ""; }; + D5907DB12004BB37005947E5 /* ScriptingObjectContainer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScriptingObjectContainer.swift; sourceTree = ""; }; D5D175012002039D0047B29D /* Evergreen.sdef */ = {isa = PBXFileReference; lastKnownFileType = text.xml; name = Evergreen.sdef; path = ../Resources/Evergreen.sdef; sourceTree = ""; }; + D5F4EDB4200744A700B9E363 /* ScriptingObject.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScriptingObject.swift; sourceTree = ""; }; + D5F4EDB620074D6500B9E363 /* Feed+Scriptability.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Feed+Scriptability.swift"; sourceTree = ""; }; + D5F4EDB820074D7C00B9E363 /* Folder+Scriptability.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Folder+Scriptability.swift"; sourceTree = ""; }; + D5F4EDD720075C1300B9E363 /* testNameOfEveryFolder.applescript */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.applescript; path = testNameOfEveryFolder.applescript; sourceTree = ""; }; + D5F4EDE720075C1800B9E363 /* testNameAndUrlOfEveryFeed.applescript */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.applescript; path = testNameAndUrlOfEveryFeed.applescript; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -912,6 +933,7 @@ 848F6AE31FC29CFA002D422E /* Favicons */, 845213211FCA5B10003B6E93 /* Images */, 849A97961ED9EFAA007D329B /* Extensions */, + D5907D6F2004AB67005947E5 /* Scriptability */, D5558FD6200227E60066386B /* AppleEvents */, 849A97991ED9EFB6007D329B /* Resources */, 84FB9A2C1EDCD6A4003D53B9 /* Frameworks */, @@ -1092,6 +1114,8 @@ children = ( D5907C9D20023249005947E5 /* testGenericScript.applescript */, D5558FD1200223F60066386B /* testGetURL.applescript */, + D5F4EDE720075C1800B9E363 /* testNameAndUrlOfEveryFeed.applescript */, + D5F4EDD720075C1300B9E363 /* testNameOfEveryFolder.applescript */, ); path = scripts; sourceTree = ""; @@ -1117,6 +1141,20 @@ path = xcconfig; sourceTree = ""; }; + D5907D6F2004AB67005947E5 /* Scriptability */ = { + isa = PBXGroup; + children = ( + D5907D962004B7EB005947E5 /* Account+Scriptability.swift */, + D5F4EDB620074D6500B9E363 /* Feed+Scriptability.swift */, + D5F4EDB820074D7C00B9E363 /* Folder+Scriptability.swift */, + D5907D7E2004AC00005947E5 /* NSApplication+Scriptability.swift */, + D5907DB12004BB37005947E5 /* ScriptingObjectContainer.swift */, + D5F4EDB4200744A700B9E363 /* ScriptingObject.swift */, + ); + name = Scriptability; + path = Evergreen/Scriptability; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -1181,12 +1219,12 @@ TargetAttributes = { 849C645F1ED37A5D003D8FC0 = { CreatedOnToolsVersion = 8.2.1; - DevelopmentTeam = M8L2WTLA8W; - ProvisioningStyle = Manual; + DevelopmentTeam = 6V7D786XTL; + ProvisioningStyle = Automatic; }; 849C64701ED37A5D003D8FC0 = { CreatedOnToolsVersion = 8.2.1; - DevelopmentTeam = 9C84TZ7Q6Z; + DevelopmentTeam = 6V7D786XTL; ProvisioningStyle = Automatic; TestTargetID = 849C645F1ED37A5D003D8FC0; }; @@ -1495,12 +1533,14 @@ 849C64641ED37A5D003D8FC0 /* AppDelegate.swift in Sources */, 84513F901FAA63950023A1A9 /* FeedListControlsView.swift in Sources */, 84E46C7D1F75EF7B005ECFB3 /* AppDefaults.swift in Sources */, + D5907D972004B7EB005947E5 /* Account+Scriptability.swift in Sources */, 842E45CE1ED8C308000A8B52 /* AppNotifications.swift in Sources */, 844B5B5B1FEA00FB00C7C76A /* TimelineKeyboardDelegate.swift in Sources */, 84DAEE321F870B390058304B /* DockBadge.swift in Sources */, 842E45DD1ED8C54B000A8B52 /* Browser.swift in Sources */, 842E45E31ED8C681000A8B52 /* KeyboardDelegateProtocol.swift in Sources */, 845F52ED1FB2B9FC00C10BF0 /* FeedPasteboardWriter.swift in Sources */, + D5907DB32005F45D005947E5 /* AppleEventUtils.swift in Sources */, 8444C8F21FED81840051386C /* OPMLExporter.swift in Sources */, 849A975E1ED9EB72007D329B /* MainWindowController.swift in Sources */, 842E45E51ED8C6B7000A8B52 /* MainWindowSplitView.swift in Sources */, @@ -1512,6 +1552,7 @@ 84F2D5371FC22FCC00998D64 /* PseudoFeed.swift in Sources */, 845EE7C11FC2488C00854A1F /* SmartFeed.swift in Sources */, 84702AA41FA27AC0006B8943 /* MarkReadOrUnreadCommand.swift in Sources */, + D5907D7F2004AC00005947E5 /* NSApplication+Scriptability.swift in Sources */, 849A979F1ED9F130007D329B /* SidebarCell.swift in Sources */, 849A97651ED9EB96007D329B /* SidebarTreeControllerDelegate.swift in Sources */, 849A97671ED9EB96007D329B /* UnreadCountView.swift in Sources */, @@ -1525,6 +1566,7 @@ 84FF69B11FC3793300DC198E /* FaviconURLFinder.swift in Sources */, 842611A21FCB769D0086A189 /* RSHTMLMetadata+Extension.swift in Sources */, 84A1500520048DDF0046AD9A /* SendToMarsEditCommand.swift in Sources */, + D5907DB22004BB37005947E5 /* ScriptingObjectContainer.swift in Sources */, 849A978A1ED9ECEF007D329B /* ArticleStylesManager.swift in Sources */, 849A97791ED9EC04007D329B /* TimelineStringUtilities.swift in Sources */, 84F204CE1FAACB660076E152 /* FeedListViewController.swift in Sources */, @@ -1545,6 +1587,8 @@ 849A978D1ED9EE4D007D329B /* FeedListWindowController.swift in Sources */, 849A97771ED9EC04007D329B /* TimelineCellData.swift in Sources */, 84B99C6B1FAE370B00ECDEDB /* FeedListFeed.swift in Sources */, + D5F4EDB5200744A700B9E363 /* ScriptingObject.swift in Sources */, + D5F4EDB920074D7C00B9E363 /* Folder+Scriptability.swift in Sources */, 842611A01FCB72600086A189 /* FeaturedImageDownloader.swift in Sources */, 849A97781ED9EC04007D329B /* TimelineCellLayout.swift in Sources */, 84CC08061FF5D2E000C0C0ED /* FeedListSplitViewController.swift in Sources */, @@ -1563,6 +1607,7 @@ 84A1500320048D660046AD9A /* SendToCommand.swift in Sources */, 845A29091FC74B8E007B49E3 /* SingleFaviconDownloader.swift in Sources */, 849A97851ED9ECCD007D329B /* PreferencesWindowController.swift in Sources */, + D5F4EDB720074D6500B9E363 /* Feed+Scriptability.swift in Sources */, 84E850861FCB60CE0072EA88 /* AuthorAvatarDownloader.swift in Sources */, 8414AD251FCF5A1E00955102 /* TimelineHeaderView.swift in Sources */, 849A977A1ED9EC04007D329B /* TimelineTableCellView.swift in Sources */, @@ -1581,7 +1626,9 @@ D5907CA1200232A1005947E5 /* testGetURL.applescript in Sources */, 849C64761ED37A5D003D8FC0 /* EvergreenTests.swift in Sources */, D5558FD32002245C0066386B /* ScriptingTests.swift in Sources */, + D5F4EDE820075C1800B9E363 /* testNameAndUrlOfEveryFeed.applescript in Sources */, D5907CA0200232A1005947E5 /* testGenericScript.applescript in Sources */, + D5F4EDE620075C1300B9E363 /* testNameOfEveryFolder.applescript in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Evergreen/Resources/Evergreen.sdef b/Evergreen/Resources/Evergreen.sdef index 3cb46db91..50a362990 100644 --- a/Evergreen/Resources/Evergreen.sdef +++ b/Evergreen/Resources/Evergreen.sdef @@ -5,6 +5,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Evergreen/Scriptability/Account+Scriptability.swift b/Evergreen/Scriptability/Account+Scriptability.swift new file mode 100644 index 000000000..6ad57f854 --- /dev/null +++ b/Evergreen/Scriptability/Account+Scriptability.swift @@ -0,0 +1,95 @@ +// +// Account+Scriptability.swift +// Evergreen +// +// Created by Olof Hellman on 1/9/18. +// Copyright © 2018 Olof Hellman. All rights reserved. +// + +import Cocoa +import Account +import Data + +@objc(ScriptableAccount) +class ScriptableAccount: NSObject, UniqueIdScriptingObject, ScriptingObjectContainer { + + let account:Account + init (_ account:Account) { + self.account = account + } + + @objc(objectSpecifier) + override var objectSpecifier: NSScriptObjectSpecifier? { + let myContainer = NSApplication.shared + let scriptObjectSpecifier = myContainer.makeFormUniqueIDScriptObjectSpecifier(forObject:self) + return (scriptObjectSpecifier) + } + + // MARK: --- ScriptingObject protocol --- + + var scriptingKey: String { + return "accounts" + } + + // MARK: --- UniqueIdScriptingObject protocol --- + + // I am not sure if account should prefer to be specified by name or by ID + // but in either case it seems like the accountID would be used as the keydata, so I chose ID + + var scriptingUniqueId:Any { + return account.accountID + } + + // MARK: --- ScriptingObjectContainer protocol --- + + var scriptingClassDescription: NSScriptClassDescription { + return self.classDescription as! NSScriptClassDescription + } + + // MARK: --- Scriptable elements --- + + @objc(feeds) + var feeds:NSArray { + let feeds = account.children.flatMap { $0 as? Feed } + return feeds.map { ScriptableFeed($0, container:self) } as NSArray + } + + @objc(folders) + var folders:NSArray { + let folders = account.children.flatMap { $0 as? Folder } + return folders.map { ScriptableFolder($0, container:self) } as NSArray + } + + // MARK: --- Scriptable properties --- + + @objc(contents) + var contents:NSArray { + var contentsArray:[AnyObject] = [] + for child in account.children { + if let aFeed = child as? Feed { + contentsArray.append(ScriptableFeed(aFeed, container:self)) + } else if let aFolder = child as? Folder { + contentsArray.append(ScriptableFolder(aFolder, container:self)) + } + } + return contentsArray as NSArray + } + + @objc(accountType) + var accountType:OSType { + var osType:String = "" + switch self.account.type { + case .onMyMac: + osType = "Locl" + case .feedly: + osType = "Fdly" + case .feedbin: + osType = "Fdbn" + case .feedWrangler: + osType = "FWrg" + case .newsBlur: + osType = "NBlr" + } + return osType.FourCharCode() + } +} diff --git a/Evergreen/Scriptability/Feed+Scriptability.swift b/Evergreen/Scriptability/Feed+Scriptability.swift new file mode 100644 index 000000000..904297536 --- /dev/null +++ b/Evergreen/Scriptability/Feed+Scriptability.swift @@ -0,0 +1,62 @@ +// +// Feed+Scriptability.swift +// Evergreen +// +// Created by Olof Hellman on 1/10/18. +// Copyright © 2018 Olof Hellman. All rights reserved. +// + +import Foundation +import Account +import Data + +@objc(ScriptableFeed) +class ScriptableFeed: NSObject, UniqueIdScriptingObject { + + let feed:Feed + let container:ScriptingObjectContainer + + init (_ feed:Feed, container:ScriptingObjectContainer) { + self.feed = feed + self.container = container + } + + @objc(objectSpecifier) + override var objectSpecifier: NSScriptObjectSpecifier? { + let scriptObjectSpecifier = self.container.makeFormUniqueIDScriptObjectSpecifier(forObject:self) + return (scriptObjectSpecifier) + } + + // MARK: --- ScriptingObject protocol --- + + var scriptingKey: String { + return "feeds" + } + + // MARK: --- UniqueIdScriptingObject protocol --- + + // I am not sure if account should prefer to be specified by name or by ID + // but in either case it seems like the accountID would be used as the keydata, so I chose ID + + var scriptingUniqueId:Any { + return feed.feedID + } + + // MARK: --- Scriptable properties --- + + @objc(url) + var url:String { + return self.feed.url + } + + @objc(uniqueId) + var uniqueId:String { + return self.feed.feedID + } + + @objc(name) + var name:String { + return self.feed.name ?? "" + } + +} diff --git a/Evergreen/Scriptability/Folder+Scriptability.swift b/Evergreen/Scriptability/Folder+Scriptability.swift new file mode 100644 index 000000000..fc81a433f --- /dev/null +++ b/Evergreen/Scriptability/Folder+Scriptability.swift @@ -0,0 +1,56 @@ +// +// Folder+Scriptability.swift +// Evergreen +// +// Created by Olof Hellman on 1/10/18. +// Copyright © 2018 Olof Hellman. All rights reserved. +// + +import Foundation +import Account + +@objc(ScriptableFolder) +class ScriptableFolder: NSObject, UniqueIdScriptingObject { + + let folder:Folder + let container:ScriptingObjectContainer + + init (_ folder:Folder, container:ScriptingObjectContainer) { + self.folder = folder + self.container = container + } + + @objc(objectSpecifier) + override var objectSpecifier: NSScriptObjectSpecifier? { + let scriptObjectSpecifier = self.container.makeFormUniqueIDScriptObjectSpecifier(forObject:self) + return (scriptObjectSpecifier) + } + + // MARK: --- ScriptingObject protocol --- + + var scriptingKey: String { + return "folders" + } + + // MARK: --- UniqueIdScriptingObject protocol --- + + // I am not sure if account should prefer to be specified by name or by ID + // but in either case it seems like the accountID would be used as the keydata, so I chose ID + + var scriptingUniqueId:Any { + return folder.folderID + } + + // MARK: --- Scriptable properties --- + + @objc(uniqueId) + var uniqueId:Int { + return self.folder.folderID + } + + @objc(name) + var name:String { + return self.folder.name ?? "" + } + +} diff --git a/Evergreen/Scriptability/NSApplication+Scriptability.swift b/Evergreen/Scriptability/NSApplication+Scriptability.swift new file mode 100644 index 000000000..d95a141ef --- /dev/null +++ b/Evergreen/Scriptability/NSApplication+Scriptability.swift @@ -0,0 +1,30 @@ +// +// NSApplication+Scriptability.swift +// Evergreen +// +// Created by Olof Hellman on 1/8/18. +// Copyright © 2018 Olof Hellman. All rights reserved. +// + +import Cocoa +import Account + +extension NSApplication : ScriptingObjectContainer { + + var scriptingClassDescription: NSScriptClassDescription { + return NSApplication.shared.classDescription as! NSScriptClassDescription + } + + var scriptingKey: String { + return "application" + } + + @objc(accounts) + func accounts() -> NSArray { + let accounts = AccountManager.shared.accounts + return accounts.map { ScriptableAccount($0) } as NSArray + } + +} + + diff --git a/Evergreen/Scriptability/ScriptingObject.swift b/Evergreen/Scriptability/ScriptingObject.swift new file mode 100644 index 000000000..5ffba4279 --- /dev/null +++ b/Evergreen/Scriptability/ScriptingObject.swift @@ -0,0 +1,22 @@ +// +// ScriptingObject.swift +// Evergreen +// +// Created by Olof Hellman on 1/10/18. +// Copyright © 2018 Olof Hellman. All rights reserved. +// + +import Foundation + +protocol ScriptingObject { + var objectSpecifier: NSScriptObjectSpecifier? { get } + var scriptingKey: String { get } +} + +protocol NamedScriptingObject: ScriptingObject { + var name:String { get } +} + +protocol UniqueIdScriptingObject: ScriptingObject { + var scriptingUniqueId:Any { get } +} diff --git a/Evergreen/Scriptability/ScriptingObjectContainer.swift b/Evergreen/Scriptability/ScriptingObjectContainer.swift new file mode 100644 index 000000000..fbe11adde --- /dev/null +++ b/Evergreen/Scriptability/ScriptingObjectContainer.swift @@ -0,0 +1,38 @@ +// +// ScriptingObjectContainer.swift +// Account +// +// Created by Olof Hellman on 1/9/18. +// Copyright © 2018 Olof Hellman. All rights reserved. +// + +import Cocoa + +protocol ScriptingObjectContainer: ScriptingObject { + var scriptingClassDescription:NSScriptClassDescription { get } +} + + +extension ScriptingObjectContainer { + + func makeFormNameScriptObjectSpecifier(forObject object:NamedScriptingObject) -> NSScriptObjectSpecifier? { + let containerClassDescription = self.scriptingClassDescription + let containerScriptObjectSpecifier = self.objectSpecifier + let scriptingKey = object.scriptingKey + let name = object.name + let specifier = NSNameSpecifier(containerClassDescription:containerClassDescription, + containerSpecifier:containerScriptObjectSpecifier, key:scriptingKey, name:name) + return specifier + } + + func makeFormUniqueIDScriptObjectSpecifier(forObject object:UniqueIdScriptingObject) -> NSScriptObjectSpecifier? { + let containerClassDescription = self.scriptingClassDescription + let containerScriptObjectSpecifier = self.objectSpecifier + let scriptingKey = object.scriptingKey + let uniqueId = object.scriptingUniqueId + let specifier = NSUniqueIDSpecifier(containerClassDescription:containerClassDescription, + containerSpecifier:containerScriptObjectSpecifier, key:scriptingKey, uniqueID: uniqueId) + return specifier + } +} + diff --git a/EvergreenTests/ScriptingTests/ScriptingTests.swift b/EvergreenTests/ScriptingTests/ScriptingTests.swift index 2846f064a..2ab49fee1 100644 --- a/EvergreenTests/ScriptingTests/ScriptingTests.swift +++ b/EvergreenTests/ScriptingTests/ScriptingTests.swift @@ -77,5 +77,13 @@ class ScriptingTests: XCTestCase { func testGetUrlScript() { _ = doIndividualScript(filename: "testGetURL") } + + func testNameAndUrlOfEveryFeedScript() { + _ = doIndividualScript(filename: "testNameAndUrlOfEveryFeed") + } + + func testNameOfEveryFolderScript() { + _ = doIndividualScript(filename: "testNameOfEveryFolder") + } } diff --git a/EvergreenTests/ScriptingTests/scripts/testNameAndUrlOfEveryFeed.applescript b/EvergreenTests/ScriptingTests/scripts/testNameAndUrlOfEveryFeed.applescript new file mode 100644 index 000000000..c501cf8de --- /dev/null +++ b/EvergreenTests/ScriptingTests/scripts/testNameAndUrlOfEveryFeed.applescript @@ -0,0 +1,10 @@ +-- this script just tests that no error was generated from the script +try + tell application "Evergreen" + {name, url} of every feed of every account + end tell +on error message + return {test_result:false, script_result:message} +end try + +return {test_result:true} diff --git a/EvergreenTests/ScriptingTests/scripts/testNameOfEveryFolder.applescript b/EvergreenTests/ScriptingTests/scripts/testNameOfEveryFolder.applescript new file mode 100644 index 000000000..1112d8494 --- /dev/null +++ b/EvergreenTests/ScriptingTests/scripts/testNameOfEveryFolder.applescript @@ -0,0 +1,11 @@ + +-- this script just tests that no error was generated from the script +try + tell application "Evergreen" + name of every folder of every account + end tell +on error message + return {test_result:false, script_result:message} +end try + +return {test_result:true} diff --git a/Frameworks/Account/Folder.swift b/Frameworks/Account/Folder.swift index 8bb905555..fbdd67883 100644 --- a/Frameworks/Account/Folder.swift +++ b/Frameworks/Account/Folder.swift @@ -14,7 +14,7 @@ public final class Folder: DisplayNameProvider, Container, UnreadCountProvider, public weak var account: Account? public var children = [AnyObject]() - var name: String? + public private(set) var name: String? static let untitledName = NSLocalizedString("Untitled ƒ", comment: "Folder name") public let folderID: Int // not saved: per-run only static var incrementingID = 0