From c82663cb09ab50251bf8ff93cdfc9fa9dbf9ab5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Wei=C3=9F?= Date: Sat, 28 Mar 2015 16:52:11 +0100 Subject: [PATCH 01/23] Using correct API for appending path extensions. --- ObjectGraph/ObjectGraph.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ObjectGraph/ObjectGraph.m b/ObjectGraph/ObjectGraph.m index 7791748..9381f80 100644 --- a/ObjectGraph/ObjectGraph.m +++ b/ObjectGraph/ObjectGraph.m @@ -164,14 +164,14 @@ - (void)selectPath - (NSString *)dotFileName { VWKProject *project = [VWKProject projectForKeyWindow]; - NSString *dotFileName = [project.projectName stringByAppendingString:@".dot"]; + NSString *dotFileName = [project.projectName stringByAppendingPathExtension:@"dot"]; return dotFileName; } - (NSString *)pngFileName { VWKProject *project = [VWKProject projectForKeyWindow]; - NSString *pngFileName = [project.projectName stringByAppendingString:@".png"]; + NSString *pngFileName = [project.projectName stringByAppendingPathExtension:@"png"]; return pngFileName; } From 706103f8bd792627b995a67f55dd924bb99d3231 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Wei=C3=9F?= Date: Sat, 28 Mar 2015 17:03:38 +0100 Subject: [PATCH 02/23] Replacing PNG output with PDF. This results in much smaller, higher fidelity, text-searchable files. --- ObjectGraph/ObjectGraph.m | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/ObjectGraph/ObjectGraph.m b/ObjectGraph/ObjectGraph.m index 9381f80..b93e1a8 100644 --- a/ObjectGraph/ObjectGraph.m +++ b/ObjectGraph/ObjectGraph.m @@ -47,8 +47,8 @@ @interface ObjectGraph() @property (nonatomic, strong) NSMenuItem *pathItem; @property (nonatomic, copy) NSString *sourceCodePath; @property (nonatomic, copy) TaskBlock getGraphvizExecutablePathBlock; -@property (nonatomic, copy) TaskBlock convertToPNGBlock; -@property (nonatomic, copy) TaskBlock movePNGFileBlock; +@property (nonatomic, copy) TaskBlock convertToPDFBlock; +@property (nonatomic, copy) TaskBlock movePDFFileBlock; @property (nonatomic, copy) TaskBlock moveDOTFileBlock; @property (nonatomic, copy) TaskBlock openBlock; @@ -86,8 +86,8 @@ - (id)initWithBundle:(NSBundle *)plugin [self setDefaultSourceCodePathPath]; [self setupGetGraphvizExecutablePathBlock]; - [self setupConvertToPNGBlock]; - [self setupMovePNGFileBlock]; + [self setupConvertToPDFBlock]; + [self setupMovePDFFileBlock]; [self setupMoveDOTFileBlock]; [self setupOpenBlock]; @@ -168,11 +168,11 @@ - (NSString *)dotFileName return dotFileName; } -- (NSString *)pngFileName +- (NSString *)pdfFileName { VWKProject *project = [VWKProject projectForKeyWindow]; - NSString *pngFileName = [project.projectName stringByAppendingPathExtension:@"png"]; - return pngFileName; + NSString *pdfFileName = [project.projectName stringByAppendingPathExtension:@"pdf"]; + return pdfFileName; } - (NSString *)projectPath @@ -206,36 +206,36 @@ - (void)setupGetGraphvizExecutablePathBlock [VWKShellHandler runShellCommand:shellString withArgs:args directory:strongSelf.sourceCodePath - completion:strongSelf.convertToPNGBlock]; + completion:strongSelf.convertToPDFBlock]; }; } -- (void)setupConvertToPNGBlock +- (void)setupConvertToPDFBlock { __weak __typeof(&*self)weakSelf = self; - self.convertToPNGBlock = ^(NSTask *t, + self.convertToPDFBlock = ^(NSTask *t, NSString *standardOutputString, NSString *standardErrorString){ __strong __typeof(&*weakSelf)strongSelf = weakSelf; if (standardOutputString.length > 0) { NSString *GRAPHVIZ_EXECUTABLE_PATH = [standardOutputString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; [VWKShellHandler runShellCommand:GRAPHVIZ_EXECUTABLE_PATH - withArgs:@[@"-Tpng", strongSelf.dotFileName, @"-o", strongSelf.pngFileName] + withArgs:@[@"-Tpdf", strongSelf.dotFileName, @"-o", strongSelf.pdfFileName] directory:strongSelf.sourceCodePath - completion:strongSelf.movePNGFileBlock]; + completion:strongSelf.movePDFFileBlock]; } }; } -- (void)setupMovePNGFileBlock +- (void)setupMovePDFFileBlock { __weak __typeof(&*self)weakSelf = self; - self.movePNGFileBlock = ^(NSTask *t, + self.movePDFFileBlock = ^(NSTask *t, NSString *standardOutputString, NSString *standardErrorString){ __strong __typeof(&*weakSelf)strongSelf = weakSelf; [VWKShellHandler runShellCommand:[BIN_PATH stringByAppendingPathComponent:MOVE_EXECUTABLE] - withArgs:@[strongSelf.pngFileName, strongSelf.projectPath] + withArgs:@[strongSelf.pdfFileName, strongSelf.projectPath] directory:strongSelf.sourceCodePath completion:strongSelf.moveDOTFileBlock]; }; @@ -263,7 +263,7 @@ - (void)setupOpenBlock NSString *standardErrorString){ __strong __typeof(&*weakSelf)strongSelf = weakSelf; [VWKShellHandler runShellCommand:[USER_BIN_PATH stringByAppendingPathComponent:OPEN_EXECUTABLE] - withArgs:@[strongSelf.pngFileName] + withArgs:@[strongSelf.pdfFileName] directory:strongSelf.projectPath completion:nil]; }; From 9109f2463ea13d93567562c7be812964eb87bf4e Mon Sep 17 00:00:00 2001 From: Aaron Crespo Date: Fri, 10 Apr 2015 12:33:17 -0400 Subject: [PATCH 03/23] Xcode 6.3 support. --- ObjectGraph/Info.plist | 1 + 1 file changed, 1 insertion(+) diff --git a/ObjectGraph/Info.plist b/ObjectGraph/Info.plist index c1314c8..7aae45a 100644 --- a/ObjectGraph/Info.plist +++ b/ObjectGraph/Info.plist @@ -24,6 +24,7 @@ 1 DVTPlugInCompatibilityUUIDs + 9F75337B-21B4-4ADC-B558-F9CADF7073A7 A16FF353-8441-459E-A50C-B071F53F51B7 C4A681B0-4A26-480E-93EC-1218098B9AA0 AD68E85B-441B-4301-B564-A45E4919A6AD From 1e7dc14a9718245c89c229a539782f7bbee2eb0a Mon Sep 17 00:00:00 2001 From: vampirewalk Date: Thu, 21 May 2015 16:52:21 +0800 Subject: [PATCH 04/23] Add compatibility UUID for Xcode 6.3.2 --- ObjectGraph/Info.plist | 1 + 1 file changed, 1 insertion(+) diff --git a/ObjectGraph/Info.plist b/ObjectGraph/Info.plist index 7aae45a..75f1c83 100644 --- a/ObjectGraph/Info.plist +++ b/ObjectGraph/Info.plist @@ -24,6 +24,7 @@ 1 DVTPlugInCompatibilityUUIDs + E969541F-E6F9-4D25-8158-72DC3545A6C6 9F75337B-21B4-4ADC-B558-F9CADF7073A7 A16FF353-8441-459E-A50C-B071F53F51B7 C4A681B0-4A26-480E-93EC-1218098B9AA0 From 8a355584c3349dd35dac9ebde0d9583ff87978c3 Mon Sep 17 00:00:00 2001 From: vampirewalk Date: Thu, 21 May 2015 17:34:10 +0800 Subject: [PATCH 05/23] Add menu item in main queue --- ObjectGraph/ObjectGraph.m | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ObjectGraph/ObjectGraph.m b/ObjectGraph/ObjectGraph.m index 7791748..cb7e6f9 100644 --- a/ObjectGraph/ObjectGraph.m +++ b/ObjectGraph/ObjectGraph.m @@ -93,7 +93,9 @@ - (id)initWithBundle:(NSBundle *)plugin // Create menu items, initialize UI, etc. - [self addMenuItems]; + [[NSOperationQueue mainQueue] addOperationWithBlock:^{ + [self addMenuItems]; + }]; } return self; } From 69718cad0ba7b6e044a3708cd6a53c8fbf5b658b Mon Sep 17 00:00:00 2001 From: vampirewalk Date: Wed, 1 Jul 2015 14:20:19 +0800 Subject: [PATCH 06/23] Add compatibility UUID for Xcode 6.4 --- ObjectGraph/Info.plist | 1 + 1 file changed, 1 insertion(+) diff --git a/ObjectGraph/Info.plist b/ObjectGraph/Info.plist index 75f1c83..ac110c3 100644 --- a/ObjectGraph/Info.plist +++ b/ObjectGraph/Info.plist @@ -24,6 +24,7 @@ 1 DVTPlugInCompatibilityUUIDs + 7FDF5C7A-131F-4ABB-9EDC-8C5F8F0B8A90 E969541F-E6F9-4D25-8158-72DC3545A6C6 9F75337B-21B4-4ADC-B558-F9CADF7073A7 A16FF353-8441-459E-A50C-B071F53F51B7 From a64fd036245d2aad7cd4a2dfeac62ba26346d791 Mon Sep 17 00:00:00 2001 From: vampirewalk Date: Sun, 5 Jul 2015 15:01:18 +0800 Subject: [PATCH 07/23] Add twitter badge --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 6c1e1a5..c8409f8 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,8 @@ ## ObjectGraph +============ + +[![Twitter: @vampirewalk](https://img.shields.io/badge/contact-%40vampirewalk-blue.svg)](https://twitter.com/vampirewalk) + ObjectGraph can show oriented graph of dependencies between classes in your project. This plugin is based on [objc_dep](https://github.com/nst/objc_dep) and [Graphviz](http://www.graphviz.org/). From e2c5e63237e89471bf90db981d9e88521ec37de6 Mon Sep 17 00:00:00 2001 From: vampirewalk Date: Sun, 5 Jul 2015 15:03:09 +0800 Subject: [PATCH 08/23] update twitter id --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c8409f8..0c9d7e6 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ ## ObjectGraph ============ -[![Twitter: @vampirewalk](https://img.shields.io/badge/contact-%40vampirewalk-blue.svg)](https://twitter.com/vampirewalk) +[![Twitter: @vampirewalk666](https://img.shields.io/badge/contact-%40vampirewalk-blue.svg)](https://twitter.com/vampirewalk666) ObjectGraph can show oriented graph of dependencies between classes in your project. This plugin is based on [objc_dep](https://github.com/nst/objc_dep) and [Graphviz](http://www.graphviz.org/). From c4b64ef06061c8c0214c3a9a54b9994b170a9332 Mon Sep 17 00:00:00 2001 From: vampirewalk Date: Sun, 5 Jul 2015 15:03:44 +0800 Subject: [PATCH 09/23] remove line --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 0c9d7e6..4871bca 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,4 @@ ## ObjectGraph -============ [![Twitter: @vampirewalk666](https://img.shields.io/badge/contact-%40vampirewalk-blue.svg)](https://twitter.com/vampirewalk666) From 061c17a01bfa5d935ec33c5cd0c287adfdc175bf Mon Sep 17 00:00:00 2001 From: vampirewalk Date: Wed, 9 Sep 2015 23:16:56 +0800 Subject: [PATCH 10/23] Add support for Xcode 7 Beta --- ObjectGraph/Info.plist | 1 + 1 file changed, 1 insertion(+) diff --git a/ObjectGraph/Info.plist b/ObjectGraph/Info.plist index ac110c3..99db8e1 100644 --- a/ObjectGraph/Info.plist +++ b/ObjectGraph/Info.plist @@ -30,6 +30,7 @@ A16FF353-8441-459E-A50C-B071F53F51B7 C4A681B0-4A26-480E-93EC-1218098B9AA0 AD68E85B-441B-4301-B564-A45E4919A6AD + AABB7188-E14E-4433-AD3B-5CD791EAD9A3 LSMinimumSystemVersion $(MACOSX_DEPLOYMENT_TARGET) From 95ac69f2fd38a7cdb3d9839c4832257e78e43d50 Mon Sep 17 00:00:00 2001 From: "Ai Wen, Lo" Date: Tue, 15 Sep 2015 16:10:37 +0800 Subject: [PATCH 11/23] Add support for Xcode 7 GM and Xcode 7.1 beta --- ObjectGraph/Info.plist | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ObjectGraph/Info.plist b/ObjectGraph/Info.plist index 99db8e1..5fe6f1b 100644 --- a/ObjectGraph/Info.plist +++ b/ObjectGraph/Info.plist @@ -31,6 +31,8 @@ C4A681B0-4A26-480E-93EC-1218098B9AA0 AD68E85B-441B-4301-B564-A45E4919A6AD AABB7188-E14E-4433-AD3B-5CD791EAD9A3 + CC0D0F4F-05B3-431A-8F33-F84AFCB2C651 + 0420B86A-AA43-4792-9ED0-6FE0F2B16A13 LSMinimumSystemVersion $(MACOSX_DEPLOYMENT_TARGET) From 7442306bd519e5a52246cc90aa8da1a6be74916c Mon Sep 17 00:00:00 2001 From: vampirewalk Date: Fri, 23 Oct 2015 11:38:40 +0800 Subject: [PATCH 12/23] Add support for Xcode 7.1 --- ObjectGraph/Info.plist | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ObjectGraph/Info.plist b/ObjectGraph/Info.plist index 5fe6f1b..f2edec9 100644 --- a/ObjectGraph/Info.plist +++ b/ObjectGraph/Info.plist @@ -31,8 +31,9 @@ C4A681B0-4A26-480E-93EC-1218098B9AA0 AD68E85B-441B-4301-B564-A45E4919A6AD AABB7188-E14E-4433-AD3B-5CD791EAD9A3 - CC0D0F4F-05B3-431A-8F33-F84AFCB2C651 - 0420B86A-AA43-4792-9ED0-6FE0F2B16A13 + CC0D0F4F-05B3-431A-8F33-F84AFCB2C651 + 0420B86A-AA43-4792-9ED0-6FE0F2B16A13 + 7265231C-39B4-402C-89E1-16167C4CC990 LSMinimumSystemVersion $(MACOSX_DEPLOYMENT_TARGET) From 993d6de61cf0c1ce439094a3807f6e051630c45b Mon Sep 17 00:00:00 2001 From: vampirewalk Date: Wed, 9 Dec 2015 13:39:08 +0800 Subject: [PATCH 13/23] Add support for Xcode 7.2 --- ObjectGraph/Info.plist | 1 + 1 file changed, 1 insertion(+) diff --git a/ObjectGraph/Info.plist b/ObjectGraph/Info.plist index f2edec9..6d533ba 100644 --- a/ObjectGraph/Info.plist +++ b/ObjectGraph/Info.plist @@ -34,6 +34,7 @@ CC0D0F4F-05B3-431A-8F33-F84AFCB2C651 0420B86A-AA43-4792-9ED0-6FE0F2B16A13 7265231C-39B4-402C-89E1-16167C4CC990 + F41BD31E-2683-44B8-AE7F-5F09E919790E LSMinimumSystemVersion $(MACOSX_DEPLOYMENT_TARGET) From 79c524ececa393d535a4df0badc4a4869d82ffe0 Mon Sep 17 00:00:00 2001 From: vampirewalk Date: Thu, 10 Dec 2015 11:17:47 +0800 Subject: [PATCH 14/23] Add .travis.yml --- .travis.yml | 1 + 1 file changed, 1 insertion(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..c3f4dc3 --- /dev/null +++ b/.travis.yml @@ -0,0 +1 @@ +language: objective-c From c9e10acd4d58f0ddab47f24611e1ee64e2350d05 Mon Sep 17 00:00:00 2001 From: vampirewalk Date: Thu, 10 Dec 2015 11:45:00 +0800 Subject: [PATCH 15/23] Update .gitignore --- .gitignore | 137 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 136 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 8c78cdf..362db9d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,15 @@ +# Created by https://www.gitignore.io/api/xcode,swift,osx,carthage,objective-c + +### Xcode ### # Xcode # +# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore + +## Build generated build/ +DerivedData + +## Various settings *.pbxuser !default.pbxuser *.mode1v3 @@ -10,10 +19,136 @@ build/ *.perspectivev3 !default.perspectivev3 xcuserdata + +## Other *.xccheckout *.moved-aside +*.xcuserstate + + +### Swift ### +# Xcode +# +# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore + +## Build generated +build/ DerivedData + +## Various settings +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata + +## Other +*.xccheckout +*.moved-aside +*.xcuserstate +*.xcscmblueprint + +## Obj-C/Swift specific *.hmap *.ipa + +# CocoaPods +# +# We recommend against adding the Pods directory to your .gitignore. However +# you should judge for yourself, the pros and cons are mentioned at: +# http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control +# +# Pods/ + +# Carthage +# +# Add this line if you want to avoid checking in source code from Carthage dependencies. +# Carthage/Checkouts + +Carthage/Build + + +### OSX ### +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + + +### Carthage ### +# Carthage - A simple, decentralized dependency manager for Cocoa +Carthage.checkout +Carthage.build + +### Objective-C ### +# Xcode +# +# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore + +## Build generated +build/ +DerivedData + +## Various settings +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata + +## Other +*.xccheckout +*.moved-aside *.xcuserstate -*.xcscheme +*.xcscmblueprint + +## Obj-C/Swift specific +*.hmap +*.ipa + +# CocoaPods +# +# We recommend against adding the Pods directory to your .gitignore. However +# you should judge for yourself, the pros and cons are mentioned at: +# http://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control +# +#Pods/ + +# Carthage +# +# Add this line if you want to avoid checking in source code from Carthage dependencies. +# Carthage/Checkouts + +Carthage/Build + +### Objective-C Patch ### +*.xcscmblueprint From b076da6a16b67fdf4fe3027a70bfa4a9855667b8 Mon Sep 17 00:00:00 2001 From: vampirewalk Date: Thu, 10 Dec 2015 11:45:31 +0800 Subject: [PATCH 16/23] Make scheme shared --- .../xcschemes/ObjectGraph.xcscheme | 85 +++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 ObjectGraph-Xcode.xcodeproj/xcshareddata/xcschemes/ObjectGraph.xcscheme diff --git a/ObjectGraph-Xcode.xcodeproj/xcshareddata/xcschemes/ObjectGraph.xcscheme b/ObjectGraph-Xcode.xcodeproj/xcshareddata/xcschemes/ObjectGraph.xcscheme new file mode 100644 index 0000000..7dddf67 --- /dev/null +++ b/ObjectGraph-Xcode.xcodeproj/xcshareddata/xcschemes/ObjectGraph.xcscheme @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From e867cb616804a714f15921f70d9bafd9a9e64b06 Mon Sep 17 00:00:00 2001 From: vampirewalk Date: Thu, 10 Dec 2015 11:45:46 +0800 Subject: [PATCH 17/23] Update .travis.yml --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index c3f4dc3..469ec45 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1 +1,3 @@ language: objective-c +xcode_project: ObjectGraph-Xcode.xcodeproj +xcode_scheme: ObjectGraph-Xcode From f8af4e2d36c6e3f80d55a41d8d7a4e9abe76f96d Mon Sep 17 00:00:00 2001 From: vampirewalk Date: Thu, 10 Dec 2015 11:52:37 +0800 Subject: [PATCH 18/23] fix error scheme name --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 469ec45..a012994 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,3 +1,3 @@ language: objective-c xcode_project: ObjectGraph-Xcode.xcodeproj -xcode_scheme: ObjectGraph-Xcode +xcode_scheme: ObjectGraph From b572e7e505cd481419ea506d9835d8d5679827b9 Mon Sep 17 00:00:00 2001 From: vampirewalk Date: Thu, 10 Dec 2015 12:16:09 +0800 Subject: [PATCH 19/23] Add travis.ci badge --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 4871bca..2396bcb 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ ## ObjectGraph +![](https://travis-ci.org/vampirewalk/ObjectGraph-Xcode.svg?branch=master) [![Twitter: @vampirewalk666](https://img.shields.io/badge/contact-%40vampirewalk-blue.svg)](https://twitter.com/vampirewalk666) ObjectGraph can show oriented graph of dependencies between classes in your project. From c65943e177d3581435518eda442b900b1f81e568 Mon Sep 17 00:00:00 2001 From: vampirewalk Date: Tue, 8 Mar 2016 15:08:03 +0800 Subject: [PATCH 20/23] Add pdf file sample --- ObjectGraph.pdf | Bin 0 -> 18884 bytes ObjectGraph/ObjectGraph.dot | 17 ----------------- 2 files changed, 17 deletions(-) create mode 100644 ObjectGraph.pdf delete mode 100644 ObjectGraph/ObjectGraph.dot diff --git a/ObjectGraph.pdf b/ObjectGraph.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ca75fe8a846ce6c6af296ca3e9cf4e96f4f5f4b1 GIT binary patch literal 18884 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 "VWKRunOperation"; - "VWKRunOperation" -> {}; - "VWKDocumentationManager" -> {}; - "ObjectGraph" -> "VWKProject"; - "ObjectGraph" -> "VWKWorkspaceManager"; - "ObjectGraph" -> "VWKShellHandler"; - "VWKXCodeConsole" -> {}; - - "ObjectGraph-Prefix" [color=red]; - "ObjectGraph-Prefix" -> "VWKXCodeConsole" [color=red]; - - edge [color=blue, dir=both]; - "VWKProject" -> "VWKWorkspaceManager"; -} - From 3431ced5f6af865ced736ff9dd1d028b003b0e93 Mon Sep 17 00:00:00 2001 From: vampirewalk Date: Tue, 8 Mar 2016 15:18:00 +0800 Subject: [PATCH 21/23] Add explanation of the meaning of colors --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 2396bcb..1576d36 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,10 @@ This plugin is based on [objc_dep](https://github.com/nst/objc_dep) and [Graphvi ![Example](https://raw.githubusercontent.com/vampirewalk/ObjectGraph-Xcode/master/ObjectGraph.png) +- Black arrows: imports +- Red arrows: .pch imports +- Blue arrows: two ways imports + ## Usage The default path of source code parsing is project root path, you can set new path by clicking "Set Source Path Path...". For example, if you just want to parse your product class, not test class or external library class in Pods directory, you can set path to directory which contains your product class and execute "Draw Object Graph" again. From 2354e01fcf75308d719ce4f2b209f67917858317 Mon Sep 17 00:00:00 2001 From: vampirewalk Date: Thu, 24 Mar 2016 10:54:50 +0800 Subject: [PATCH 22/23] Add support for Xcode 7.3 --- ObjectGraph/Info.plist | 1 + 1 file changed, 1 insertion(+) diff --git a/ObjectGraph/Info.plist b/ObjectGraph/Info.plist index 6d533ba..9ae8051 100644 --- a/ObjectGraph/Info.plist +++ b/ObjectGraph/Info.plist @@ -35,6 +35,7 @@ 0420B86A-AA43-4792-9ED0-6FE0F2B16A13 7265231C-39B4-402C-89E1-16167C4CC990 F41BD31E-2683-44B8-AE7F-5F09E919790E + ACA8656B-FEA8-4B6D-8E4A-93F4C95C362C LSMinimumSystemVersion $(MACOSX_DEPLOYMENT_TARGET) From 86ecfb491095ea18959a755ddee0d569c50e3f7e Mon Sep 17 00:00:00 2001 From: afei Date: Fri, 30 Jun 2017 14:20:26 +0800 Subject: [PATCH 23/23] Add support for Xcode 8.3 (#13) Add support for Xcode 8.3 --- ObjectGraph/Info.plist | 1 + 1 file changed, 1 insertion(+) diff --git a/ObjectGraph/Info.plist b/ObjectGraph/Info.plist index 9ae8051..7fa1278 100644 --- a/ObjectGraph/Info.plist +++ b/ObjectGraph/Info.plist @@ -36,6 +36,7 @@ 7265231C-39B4-402C-89E1-16167C4CC990 F41BD31E-2683-44B8-AE7F-5F09E919790E ACA8656B-FEA8-4B6D-8E4A-93F4C95C362C + DFFB3951-EB0A-4C09-9DAC-5F2D28CC839C LSMinimumSystemVersion $(MACOSX_DEPLOYMENT_TARGET)