├── ProjectFileToolTests
├── LocalisationTestSubject
│ ├── Absolute.m
│ ├── RelToGroup.m
│ ├── RelToSdk.m
│ ├── RelToProject.m
│ ├── Folder1
│ │ └── Absolute1.m
│ ├── RelToDevDirectory.m
│ ├── RelativeGroup
│ │ ├── RelToGroup1.m
│ │ └── RelativeGroup2
│ │ │ └── RelToGroup2.m
│ ├── LocalisationTestSubject.xcodeproj
│ │ ├── project.xcworkspace
│ │ │ └── contents.xcworkspacedata
│ │ └── project.pbxproj
│ ├── LocalisationTestSubject
│ │ ├── NotInAnyTarget.m
│ │ ├── NotInAnyTarget.h
│ │ ├── AppDelegate.h
│ │ ├── Subfolder
│ │ │ ├── ViewController.h
│ │ │ └── ViewController.m
│ │ ├── main.m
│ │ ├── AppDelegate.m
│ │ ├── View.xib
│ │ ├── Images.xcassets
│ │ │ └── AppIcon.appiconset
│ │ │ │ └── Contents.json
│ │ ├── Info.plist
│ │ └── Base.lproj
│ │ │ └── Main.storyboard
│ └── LocalisationTestSubjectTests
│ │ ├── Info.plist
│ │ └── Tests.m
├── Info.plist
└── ProjectFileToolTests.m
├── ProjectFileTool.xcodeproj
├── project.xcworkspace
│ └── contents.xcworkspacedata
└── project.pbxproj
├── XCTest+HS.h
├── ProjectFileTool
├── CommandHandler.h
├── ProjectParser.h
├── main.m
├── CommandHandler.m
└── ProjectParser.m
├── XCTest+HS.m
├── .gitignore
├── help.txt
└── README.md
/ProjectFileToolTests/LocalisationTestSubject/Absolute.m:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ProjectFileToolTests/LocalisationTestSubject/RelToGroup.m:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ProjectFileToolTests/LocalisationTestSubject/RelToSdk.m:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ProjectFileToolTests/LocalisationTestSubject/RelToProject.m:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ProjectFileToolTests/LocalisationTestSubject/Folder1/Absolute1.m:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ProjectFileToolTests/LocalisationTestSubject/RelToDevDirectory.m:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ProjectFileToolTests/LocalisationTestSubject/RelativeGroup/RelToGroup1.m:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ProjectFileToolTests/LocalisationTestSubject/RelativeGroup/RelativeGroup2/RelToGroup2.m:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ProjectFileTool.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/ProjectFileToolTests/LocalisationTestSubject/LocalisationTestSubject.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/XCTest+HS.h:
--------------------------------------------------------------------------------
1 | //
2 | // XCTest+HS.h
3 | // VLCStreamer2
4 | //
5 | // Created by Rob Jonson on 23/12/2014.
6 | //
7 | //
8 |
9 | #import
10 | #import
11 |
12 | @interface XCTest(HS)
13 |
14 | - (NSString *)pathForTestResource:(NSString *)name ofType:(NSString *)ext;
15 |
16 | @end
17 |
--------------------------------------------------------------------------------
/ProjectFileToolTests/LocalisationTestSubject/LocalisationTestSubject/NotInAnyTarget.m:
--------------------------------------------------------------------------------
1 | //
2 | // NotInAnyTarget.m
3 | // LocalisationTestSubject
4 | //
5 | // Created by Rob Jonson on 07/01/2015.
6 | // Copyright (c) 2015 HobbyistSoftware. All rights reserved.
7 | //
8 |
9 | #import "NotInAnyTarget.h"
10 |
11 | @implementation NotInAnyTarget
12 |
13 | @end
14 |
--------------------------------------------------------------------------------
/ProjectFileTool/CommandHandler.h:
--------------------------------------------------------------------------------
1 | //
2 | // CommandHandler.h
3 | // LocalisationTool
4 | //
5 | // Created by Rob Jonson on 13/01/2015.
6 | // Copyright (c) 2015 HobbyistSoftware. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface CommandHandler : NSObject
12 |
13 | -(BOOL)runWithArguments:(NSArray*)arguments;
14 |
15 | @end
16 |
--------------------------------------------------------------------------------
/ProjectFileToolTests/LocalisationTestSubject/LocalisationTestSubject/NotInAnyTarget.h:
--------------------------------------------------------------------------------
1 | //
2 | // NotInAnyTarget.h
3 | // LocalisationTestSubject
4 | //
5 | // Created by Rob Jonson on 07/01/2015.
6 | // Copyright (c) 2015 HobbyistSoftware. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface NotInAnyTarget : NSObject
12 |
13 | @end
14 |
--------------------------------------------------------------------------------
/ProjectFileToolTests/LocalisationTestSubject/LocalisationTestSubject/AppDelegate.h:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.h
3 | // LocalisationTestSubject
4 | //
5 | // Created by Rob Jonson on 07/01/2015.
6 | // Copyright (c) 2015 HobbyistSoftware. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface AppDelegate : NSObject
12 |
13 |
14 | @end
15 |
16 |
--------------------------------------------------------------------------------
/ProjectFileToolTests/LocalisationTestSubject/LocalisationTestSubject/Subfolder/ViewController.h:
--------------------------------------------------------------------------------
1 | //
2 | // ViewController.h
3 | // LocalisationTestSubject
4 | //
5 | // Created by Rob Jonson on 07/01/2015.
6 | // Copyright (c) 2015 HobbyistSoftware. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface ViewController : NSViewController
12 |
13 |
14 | @end
15 |
16 |
--------------------------------------------------------------------------------
/ProjectFileToolTests/LocalisationTestSubject/LocalisationTestSubject/main.m:
--------------------------------------------------------------------------------
1 | //
2 | // main.m
3 | // LocalisationTestSubject
4 | //
5 | // Created by Rob Jonson on 07/01/2015.
6 | // Copyright (c) 2015 HobbyistSoftware. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 |
12 | int main(int argc, const char * argv[]) {
13 | return NSApplicationMain(argc, argv);
14 | }
15 |
--------------------------------------------------------------------------------
/XCTest+HS.m:
--------------------------------------------------------------------------------
1 | //
2 | // XCTest+HS.m
3 | // VLCStreamer2
4 | //
5 | // Created by Rob Jonson on 23/12/2014.
6 | //
7 | //
8 |
9 | #import "XCTest+HS.h"
10 |
11 | @implementation XCTest(HS)
12 |
13 | - (NSString *)pathForTestResource:(NSString *)name ofType:(NSString *)ext
14 | {
15 | NSBundle *testBundle=[NSBundle bundleForClass:self.class];
16 | return [testBundle pathForResource:name ofType:ext];
17 | }
18 |
19 | @end
20 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Xcode
2 | #
3 | build/
4 | *.pbxuser
5 | !default.pbxuser
6 | *.mode1v3
7 | !default.mode1v3
8 | *.mode2v3
9 | !default.mode2v3
10 | *.perspectivev3
11 | !default.perspectivev3
12 | xcuserdata
13 | *.xccheckout
14 | *.moved-aside
15 | DerivedData
16 | *.hmap
17 | *.ipa
18 | *.xcuserstate
19 |
20 | # CocoaPods
21 | #
22 | # We recommend against adding the Pods directory to your .gitignore. However
23 | # you should judge for yourself, the pros and cons are mentioned at:
24 | # http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control
25 | #
26 | # Pods/
--------------------------------------------------------------------------------
/ProjectFileToolTests/LocalisationTestSubject/LocalisationTestSubject/Subfolder/ViewController.m:
--------------------------------------------------------------------------------
1 | //
2 | // ViewController.m
3 | // LocalisationTestSubject
4 | //
5 | // Created by Rob Jonson on 07/01/2015.
6 | // Copyright (c) 2015 HobbyistSoftware. All rights reserved.
7 | //
8 |
9 | #import "ViewController.h"
10 |
11 | @implementation ViewController
12 |
13 | - (void)viewDidLoad {
14 | [super viewDidLoad];
15 |
16 | // Do any additional setup after loading the view.
17 | }
18 |
19 | - (void)setRepresentedObject:(id)representedObject {
20 | [super setRepresentedObject:representedObject];
21 |
22 | // Update the view, if already loaded.
23 | }
24 |
25 | @end
26 |
--------------------------------------------------------------------------------
/ProjectFileToolTests/LocalisationTestSubject/LocalisationTestSubject/AppDelegate.m:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.m
3 | // LocalisationTestSubject
4 | //
5 | // Created by Rob Jonson on 07/01/2015.
6 | // Copyright (c) 2015 HobbyistSoftware. All rights reserved.
7 | //
8 |
9 | #import "AppDelegate.h"
10 |
11 | @interface AppDelegate ()
12 |
13 | @end
14 |
15 | @implementation AppDelegate
16 |
17 | - (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
18 | // Insert code here to initialize your application
19 | }
20 |
21 | - (void)applicationWillTerminate:(NSNotification *)aNotification {
22 | // Insert code here to tear down your application
23 | }
24 |
25 | @end
26 |
--------------------------------------------------------------------------------
/ProjectFileTool/ProjectParser.h:
--------------------------------------------------------------------------------
1 | //
2 | // ProjectParser.h
3 | // LocalisationTool
4 | //
5 | // Created by Rob Jonson on 07/01/2015.
6 | // Copyright (c) 2015 HobbyistSoftware. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface ProjectParser : NSObject
12 |
13 | @property (strong) NSString *xcodeProjPath;
14 | @property (strong) NSArray *allowedTargets;
15 |
16 |
17 | -(NSDictionary*)pathsAndFiles;
18 | -(NSArray*)getTargets;
19 |
20 | //exposed for testing
21 | @property (strong) NSDictionary *targets;
22 | @property (strong) NSDictionary *buildPhases;
23 | @property (strong) NSString *mainGroupRef;
24 |
25 | -(void)loadPlist;
26 | -(void)extractTargets;
27 | -(void)extractProjectInfo;
28 | -(NSDictionary*)groupForFileRef:(NSString*)reference;
29 |
30 | @end
31 |
--------------------------------------------------------------------------------
/ProjectFileToolTests/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | com.HobbyistSoftware.$(PRODUCT_NAME:rfc1034identifier)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | BNDL
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | 1
23 |
24 |
25 |
--------------------------------------------------------------------------------
/ProjectFileTool/main.m:
--------------------------------------------------------------------------------
1 | //
2 | // main.m
3 | // LocalisationTool
4 | //
5 | // Created by Rob Jonson on 14/01/2015.
6 | // Copyright (c) 2015 HobbyistSoftware. All rights reserved.
7 | //
8 |
9 | #import
10 | #import "CommandHandler.h"
11 |
12 | int main(int argc, const char * argv[]) {
13 | @autoreleasepool {
14 | // insert code here...
15 | NSMutableArray *arguments=[NSMutableArray array];
16 | for (int i=0; i
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | com.HobbyistSoftware.$(PRODUCT_NAME:rfc1034identifier)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | BNDL
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | 1
23 |
24 |
25 |
--------------------------------------------------------------------------------
/help.txt:
--------------------------------------------------------------------------------
1 | ProjectFileTool
2 |
3 | Synopsis
4 |
5 | ProjectFileTool [--help | --version |-c -xcproj xcodeproject [-targets targets] [-showtargets]
6 |
7 | Description
8 |
9 | Parse the xcodeproject file to manage included files, and perform localisation tasks
10 |
11 | the options are as follows:
12 |
13 | --help
14 | output this help file
15 |
16 | -c run as command line tool (rather than cocoa app)
17 |
18 | -xcproj specify path of xcodeproject file
19 |
20 | -targets specify comma limited list of targets to parse for files (default is all targets)
21 |
22 | -showtargets output a list of target names
23 |
24 | Examples
25 |
26 | source files are ones with these extensions:
27 | NSArray *interestingExtensions=@[@"xib",@"m",@"storyboard",@"swift"];
28 |
29 | ProjectFileTool -xcproj path/To/project.xcodeproj
30 | output source files included in project.xcodeproj
31 |
32 |
33 | ProjectFileTool -xcproj path/To/project.xcodeproj -targets target1,target2
34 | output source files included in project.xcodeproj which are in target1 or target2
--------------------------------------------------------------------------------
/ProjectFileToolTests/LocalisationTestSubject/LocalisationTestSubject/View.xib:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/ProjectFileToolTests/LocalisationTestSubject/LocalisationTestSubjectTests/Tests.m:
--------------------------------------------------------------------------------
1 | //
2 | // LocalisationTestSubjectTests.m
3 | // LocalisationTestSubjectTests
4 | //
5 | // Created by Rob Jonson on 07/01/2015.
6 | // Copyright (c) 2015 HobbyistSoftware. All rights reserved.
7 | //
8 |
9 | #import
10 | #import
11 |
12 | @interface LocalisationTestSubjectTests : XCTestCase
13 |
14 | @end
15 |
16 | @implementation LocalisationTestSubjectTests
17 |
18 | - (void)setUp {
19 | [super setUp];
20 | // Put setup code here. This method is called before the invocation of each test method in the class.
21 | }
22 |
23 | - (void)tearDown {
24 | // Put teardown code here. This method is called after the invocation of each test method in the class.
25 | [super tearDown];
26 | }
27 |
28 | - (void)testExample {
29 | // This is an example of a functional test case.
30 | XCTAssert(YES, @"Pass");
31 | }
32 |
33 | - (void)testPerformanceExample {
34 | // This is an example of a performance test case.
35 | [self measureBlock:^{
36 | // Put the code you want to measure the time of here.
37 | }];
38 | }
39 |
40 | @end
41 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | **ProjectFileTool**
2 |
3 | This command line tool parses your xcodeproj file to extract information about the files included in your build phase.
4 |
5 | source files are considered to be ones with these extensions
6 | (although this would be trivially easy to change)
7 |
8 | NSArray *interestingExtensions=@[@"xib",@"m",@"storyboard",@"swift"];
9 |
10 | **Synopsis**
11 |
12 | ProjectFileTool [--help | --version |-c -xcproj xcodeproject [-targets targets] [-showtargets]
13 |
14 | **Description**
15 |
16 | Parse the xcodeproject file to manage included files
17 |
18 | the options are as follows:
19 |
20 | --help
21 | output this help file
22 |
23 | -c run as command line tool (rather than cocoa app)
24 |
25 | -xcproj specify path of xcodeproject file
26 |
27 | -targets specify comma limited list of targets to parse for files (default is all targets)
28 |
29 | -showtargets output a list of target names
30 |
31 | **Examples**
32 |
33 | ProjectFileTool -xcproj path/To/project.xcodeproj
34 |
35 | output source files included in project.xcodeproj
36 |
37 |
38 | ProjectFileTool -xcproj path/To/project.xcodeproj -targets target1,target2
39 |
40 | output source files included in project.xcodeproj which are in target1 or target2
--------------------------------------------------------------------------------
/ProjectFileToolTests/LocalisationTestSubject/LocalisationTestSubject/Images.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "mac",
5 | "size" : "16x16",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "mac",
10 | "size" : "16x16",
11 | "scale" : "2x"
12 | },
13 | {
14 | "idiom" : "mac",
15 | "size" : "32x32",
16 | "scale" : "1x"
17 | },
18 | {
19 | "idiom" : "mac",
20 | "size" : "32x32",
21 | "scale" : "2x"
22 | },
23 | {
24 | "idiom" : "mac",
25 | "size" : "128x128",
26 | "scale" : "1x"
27 | },
28 | {
29 | "idiom" : "mac",
30 | "size" : "128x128",
31 | "scale" : "2x"
32 | },
33 | {
34 | "idiom" : "mac",
35 | "size" : "256x256",
36 | "scale" : "1x"
37 | },
38 | {
39 | "idiom" : "mac",
40 | "size" : "256x256",
41 | "scale" : "2x"
42 | },
43 | {
44 | "idiom" : "mac",
45 | "size" : "512x512",
46 | "scale" : "1x"
47 | },
48 | {
49 | "idiom" : "mac",
50 | "size" : "512x512",
51 | "scale" : "2x"
52 | }
53 | ],
54 | "info" : {
55 | "version" : 1,
56 | "author" : "xcode"
57 | }
58 | }
--------------------------------------------------------------------------------
/ProjectFileToolTests/LocalisationTestSubject/LocalisationTestSubject/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIconFile
10 |
11 | CFBundleIdentifier
12 | com.HobbyistSoftware.$(PRODUCT_NAME:rfc1034identifier)
13 | CFBundleInfoDictionaryVersion
14 | 6.0
15 | CFBundleName
16 | $(PRODUCT_NAME)
17 | CFBundlePackageType
18 | APPL
19 | CFBundleShortVersionString
20 | 1.0
21 | CFBundleSignature
22 | ????
23 | CFBundleVersion
24 | 1
25 | LSMinimumSystemVersion
26 | $(MACOSX_DEPLOYMENT_TARGET)
27 | NSHumanReadableCopyright
28 | Copyright © 2015 HobbyistSoftware. All rights reserved.
29 | NSMainStoryboardFile
30 | Main
31 | NSPrincipalClass
32 | NSApplication
33 |
34 |
35 |
--------------------------------------------------------------------------------
/ProjectFileTool/CommandHandler.m:
--------------------------------------------------------------------------------
1 | //
2 | // CommandHandler.m
3 | // LocalisationTool
4 | //
5 | // Created by Rob Jonson on 13/01/2015.
6 | // Copyright (c) 2015 HobbyistSoftware. All rights reserved.
7 | //
8 |
9 | #import "CommandHandler.h"
10 | #import "ProjectParser.h"
11 |
12 | @implementation CommandHandler
13 |
14 | -(BOOL)runWithArguments:(NSArray*)arguments
15 | {
16 | BOOL needHelp=[arguments containsObject:@"--help"];
17 | if (needHelp)
18 | {
19 | printf("%s\n",[self.helpString UTF8String]);
20 | return 0;
21 | }
22 |
23 | BOOL needVersion=[arguments containsObject:@"--version"];
24 | if (needVersion)
25 | {
26 | printf("1.00\n");
27 | return 0;
28 | }
29 |
30 |
31 | BOOL showTargets=[arguments containsObject:@"-showtargets"];
32 |
33 | NSString *xcodeProj=[[NSUserDefaults standardUserDefaults] objectForKey:@"xcproj"];
34 | NSString *targetsString=[[NSUserDefaults standardUserDefaults] objectForKey:@"targets"];
35 | NSArray *targets=NULL;
36 | if (targetsString)
37 | {
38 | targets=[targetsString componentsSeparatedByString:@","];
39 | }
40 |
41 | ProjectParser *parser=[ProjectParser new];
42 |
43 | [parser setXcodeProjPath:xcodeProj];
44 | if (targets)
45 | {
46 | [parser setAllowedTargets:targets];
47 | }
48 |
49 | if (showTargets)
50 | {
51 | NSArray *targets=[parser getTargets];
52 | NSString *targetString=[targets componentsJoinedByString:@"\n"];
53 |
54 | printf("%s\n",[targetString UTF8String]);
55 |
56 | return 0;
57 | }
58 |
59 | NSDictionary *filePaths=[parser pathsAndFiles];
60 |
61 | for (NSString *path in [filePaths allKeys]) {
62 | printf("%s\n",[path UTF8String]);
63 | }
64 |
65 |
66 | return 0;
67 | }
68 |
69 | -(NSString *)helpString
70 | {
71 | return @"ProjectFileTool\n\
72 | \n\
73 | Synopsis\n\
74 | \n\
75 | ProjectFileTool [--help | --version |-c -xcproj xcodeproject [-targets targets] [-showtargets]\n\
76 | \n\
77 | Description\n\
78 | \n\
79 | Parse the xcodeproject file to manage included files\n\
80 | \n\
81 | the options are as follows:\n\
82 | \n\
83 | --help\n\
84 | output this help file\n\
85 | \n\
86 | -c run as command line tool (rather than cocoa app)\n\
87 | \n\
88 | -xcproj specify path of xcodeproject file\n\
89 | \n\
90 | -targets specify comma limited list of targets to parse for files (default is all targets)\n\
91 | \n\
92 | -showtargets output a list of target names\n\
93 | \n\
94 | Examples\n\
95 | \n\
96 | source files are ones with these extensions:\n\
97 | NSArray *interestingExtensions=@[@\"xib\",@\"m\",@\"storyboard\",@\"swift\"];\n\
98 | \n\
99 | ProjectFileTool -xcproj path/To/project.xcodeproj\n\
100 | output source files included in project.xcodeproj\n\
101 | \n\
102 | \n\
103 | ProjectFileTool -xcproj path/To/project.xcodeproj -targets target1,target2\n\
104 | output source files included in project.xcodeproj which are in target1 or target2";
105 | }
106 |
107 | @end
108 |
--------------------------------------------------------------------------------
/ProjectFileToolTests/ProjectFileToolTests.m:
--------------------------------------------------------------------------------
1 | //
2 | // LocalisationToolTests.m
3 | // LocalisationToolTests
4 | //
5 | // Created by Rob Jonson on 07/01/2015.
6 | // Copyright (c) 2015 HobbyistSoftware. All rights reserved.
7 | //
8 |
9 | #import
10 | #import
11 | #import "ProjectParser.h"
12 | #import "XCTest+HS.h"
13 |
14 | @interface ProjectFileToolTests : XCTestCase
15 |
16 | @property (retain) ProjectParser *parser;
17 |
18 | @end
19 |
20 | @implementation ProjectFileToolTests
21 |
22 | - (void)setUp {
23 | [super setUp];
24 |
25 | ProjectParser *parser=[[ProjectParser new] autorelease];
26 |
27 | NSString *projectFile=[self pathForTestResource:@"LocalisationTestSubject" ofType:@""];
28 | projectFile=[projectFile stringByAppendingPathComponent:@"LocalisationTestSubject.xcodeproj"];
29 |
30 | [parser setXcodeProjPath:projectFile];
31 | [parser loadPlist];
32 |
33 | self.parser=parser;
34 |
35 | // Put setup code here. This method is called before the invocation of each test method in the class.
36 | }
37 |
38 | - (void)tearDown {
39 | self.parser=NULL;
40 |
41 | // Put teardown code here. This method is called after the invocation of each test method in the class.
42 | [super tearDown];
43 | }
44 |
45 | -(NSString*)testProjectLocation
46 | {
47 | return @"/Users/rob/Documents/Development/Mac/MacDesktop/LocalisationTool/LocalisationToolTests/LocalisationTestSubject";
48 | }
49 |
50 | -(NSSet*)objectValuesForKey:(NSString*)infoKey fromDictionary:(NSDictionary*)dictionary lastPathComponent:(BOOL)lastPath
51 | {
52 | NSMutableSet *values=[NSMutableSet set];
53 |
54 | [dictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
55 | NSString *value=[obj objectForKey:infoKey];
56 | if (lastPath)
57 | {
58 | value=[value lastPathComponent];
59 | }
60 | [values addObject:value];
61 | }];
62 |
63 | return values;
64 | }
65 |
66 |
67 |
68 | -(void)testFilesInTest
69 | {
70 | [self.parser setAllowedTargets:@[@"TestTarget"]];
71 |
72 | NSSet *expectedNames=[NSSet setWithArray: @[@"ViewController.m",@"Tests.m"]];
73 | NSDictionary *filesAndPaths=[self.parser pathsAndFiles];
74 | NSSet *actualNames=[NSSet setWithArray:[filesAndPaths allValues]];
75 |
76 | XCTAssertEqualObjects(expectedNames,actualNames,@"TestTargetFiles");
77 | }
78 |
79 | -(void)testAbsolutePath
80 | {
81 | NSDictionary *filesAndPaths=[self.parser pathsAndFiles];
82 |
83 | NSArray *paths=[filesAndPaths allKeysForObject:@"Absolute.m"];
84 | NSString *path=[paths firstObject];
85 |
86 | NSString *expectedPath=[self testProjectLocation];
87 | expectedPath=[expectedPath stringByAppendingPathComponent:@"Absolute.m"];
88 |
89 | XCTAssertEqualObjects(path, expectedPath,@"absolute");
90 |
91 |
92 | paths=[filesAndPaths allKeysForObject:@"Absolute1.m"];
93 | path=[paths firstObject];
94 |
95 | expectedPath=[self testProjectLocation];
96 | expectedPath=[expectedPath stringByAppendingPathComponent:@"Folder1/Absolute1.m"];
97 |
98 | XCTAssertEqualObjects(path, expectedPath,@"absolute1");
99 | }
100 |
101 | -(void)checkFileFor:(NSString*)file
102 | {
103 | NSDictionary *filesAndPaths=[self.parser pathsAndFiles];
104 |
105 | NSArray *paths=[filesAndPaths allKeysForObject:file];
106 | NSString *path=[paths firstObject];
107 |
108 | NSString *lastComponent=[path lastPathComponent];
109 | XCTAssertEqualObjects(lastComponent, file,@"last component matches");
110 |
111 | BOOL exists=[[NSFileManager defaultManager] fileExistsAtPath:path];
112 | XCTAssertTrue(exists,@"file exists: %@",path);
113 | }
114 |
115 | -(void)testRelativePathBase
116 | {
117 | [self checkFileFor:@"RelToGroup.m"];
118 | }
119 |
120 | -(void)testRelativePath1
121 | {
122 | [self checkFileFor:@"RelToGroup1.m"];
123 | }
124 |
125 | -(void)testRelativePath2
126 | {
127 | [self checkFileFor:@"RelToGroup2.m"];
128 | }
129 |
130 | -(void)testGroupForFileRef
131 | {
132 | NSDictionary *group=[self.parser groupForFileRef:@"D43892521A5D796D009D7E1F"];
133 | NSArray *keys=[group allKeys];
134 | NSArray *values=[group allValues];
135 |
136 | XCTAssertEqual(1, [keys count]);
137 | XCTAssertEqual(1,[values count]);
138 |
139 | XCTAssertEqualObjects([keys firstObject], @"D438922E1A5D791A009D7E1F");
140 |
141 | NSDictionary *groupInfo=[[group allValues] firstObject];
142 | NSString *path=[groupInfo objectForKey:@"path"];
143 | NSString *tree=[groupInfo objectForKey:@"sourceTree"];
144 |
145 | XCTAssertEqualObjects(path, @"LocalisationTestSubject");
146 | XCTAssertEqualObjects(tree, @"");
147 |
148 | }
149 |
150 | -(void)testExtractProjectInfo
151 | {
152 | [self.parser extractProjectInfo];
153 |
154 | XCTAssertEqualObjects(self.parser.mainGroupRef, @"D43892231A5D7919009D7E1F");
155 | }
156 |
157 |
158 | -(void)testExpectedTargets
159 | {
160 | [self.parser extractTargets];
161 |
162 |
163 | NSSet *expectedNames=[NSSet setWithArray:@[@"BaseTarget",@"TestTarget"]];
164 |
165 | NSSet *actualNames=[self objectValuesForKey:@"name"
166 | fromDictionary:[self.parser targets]
167 | lastPathComponent:NO];
168 |
169 | XCTAssertEqualObjects(expectedNames,actualNames,@"matching targets");
170 | }
171 |
172 |
173 |
174 |
175 | @end
176 |
--------------------------------------------------------------------------------
/ProjectFileTool/ProjectParser.m:
--------------------------------------------------------------------------------
1 | //
2 | // ProjectParser.m
3 | // LocalisationTool
4 | //
5 | // Created by Rob Jonson on 07/01/2015.
6 | // Copyright (c) 2015 HobbyistSoftware. All rights reserved.
7 | //
8 |
9 | #import "ProjectParser.h"
10 |
11 |
12 |
13 | @interface ProjectParser ()
14 |
15 | @property (strong) NSDictionary *plistObjects;
16 |
17 | @end
18 |
19 | @implementation ProjectParser
20 |
21 | -(void)loadPlist
22 | {
23 | NSString *projectPath=[self.xcodeProjPath stringByAppendingPathComponent:@"project.pbxproj"];
24 |
25 | NSDictionary *plist=[[NSMutableDictionary alloc] initWithContentsOfFile:projectPath];
26 | NSDictionary *objects=[plist objectForKey:@"objects"];
27 |
28 | self.plistObjects=objects;
29 | }
30 |
31 | -(NSString*)sourceRoot
32 | {
33 | return [self.xcodeProjPath stringByDeletingLastPathComponent];
34 | }
35 |
36 | -(void)extractBuildPhases
37 | {
38 | NSArray *interestingExtensions=@[@"PBXSourcesBuildPhase",@"PBXResourcesBuildPhase"];
39 |
40 | NSMutableDictionary *interestingObjects=[NSMutableDictionary dictionary];
41 |
42 | [self.plistObjects enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
43 | NSDictionary *details=obj;
44 | NSString *type=[details objectForKey:@"isa"];
45 | if ([interestingExtensions containsObject:type])
46 | {
47 | [interestingObjects setObject:obj forKey:key];
48 | }
49 | }];
50 |
51 | self.buildPhases=interestingObjects;
52 | }
53 |
54 |
55 | -(void)extractTargets
56 | {
57 | NSMutableDictionary *interestingObjects=[NSMutableDictionary dictionary];
58 |
59 | [self.plistObjects enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
60 | NSDictionary *details=obj;
61 | NSString *type=[details objectForKey:@"isa"];
62 | if ([type isEqualToString:@"PBXNativeTarget"])
63 | {
64 | [interestingObjects setObject:obj forKey:key];
65 | }
66 | }];
67 |
68 | self.targets=interestingObjects;
69 | }
70 |
71 | -(void)extractProjectInfo
72 | {
73 | [self.plistObjects enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
74 | NSDictionary *details=obj;
75 | NSString *type=[details objectForKey:@"isa"];
76 | if ([type isEqualToString:@"PBXProject"])
77 | {
78 | self.mainGroupRef=[details objectForKey:@"mainGroup"];
79 | *stop=YES;
80 | }
81 | }];
82 |
83 | }
84 |
85 |
86 | /** returns key and dictionary as value */
87 | -(NSDictionary*)fileForFileReference:(NSString*)reference
88 | {
89 | NSDictionary *fileRef=[self.plistObjects objectForKey:reference];
90 | NSString *fileKey=[fileRef objectForKey:@"fileRef"];
91 | NSDictionary *fileObject=[self.plistObjects objectForKey:fileKey];
92 |
93 | return [NSDictionary dictionaryWithObject:fileObject
94 | forKey:fileKey];
95 | }
96 |
97 | -(NSDictionary *)filesFromTargetObject:(NSDictionary*)targetObject
98 | {
99 | NSMutableDictionary *targetFiles=[NSMutableDictionary dictionary];
100 |
101 | NSArray *buildPhaseRefs=[targetObject objectForKey:@"buildPhases"];
102 |
103 | [buildPhaseRefs enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
104 | NSDictionary *buildPhase=[self.buildPhases objectForKey:obj];
105 | NSString *buildType=[buildPhase objectForKey:@"isa"];
106 |
107 | if (buildPhase)
108 | {
109 | NSArray *files=[buildPhase objectForKey:@"files"];
110 | [files enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
111 | NSDictionary *file=[self fileForFileReference:obj];
112 |
113 | NSArray *interestingExtensions=@[@"xib",@"m",@"storyboard",@"swift"];
114 | if ([buildType isEqualToString:@"PBXResourcesBuildPhase"])
115 | {
116 | interestingExtensions=@[@"xib",@"storyboard"];
117 | }
118 |
119 | NSDictionary *fileObject=[[file allValues] firstObject];
120 | NSString *fileType=[[[fileObject objectForKey:@"path"] pathExtension] lowercaseString];
121 |
122 | if ([interestingExtensions containsObject:fileType])
123 | {
124 | [targetFiles addEntriesFromDictionary:file];
125 | }
126 | }];
127 |
128 | }
129 | }];
130 |
131 | return targetFiles;
132 | }
133 |
134 | -(NSDictionary*)groupForFileRef:(NSString*)reference
135 | {
136 | __block NSDictionary *foundGroup=NULL;
137 |
138 | [self.plistObjects enumerateKeysAndObjectsUsingBlock:^(id key, NSDictionary* obj, BOOL *stop) {
139 | NSString *type=[obj objectForKey:@"isa"];
140 | if ([type isEqualToString:@"PBXGroup"])
141 | {
142 | NSArray *children=[obj objectForKey:@"children"];
143 | if ([children containsObject:reference])
144 | {
145 | NSDictionary *group=[NSDictionary dictionaryWithObject:obj forKey:key];
146 | *stop=YES;
147 | foundGroup = group;
148 | }
149 | }
150 |
151 | }];
152 |
153 |
154 | return foundGroup;
155 | }
156 |
157 | -(NSString*)groupPathForFileRef:(NSString*)reference
158 | {
159 | NSString *fullPath=NULL;
160 |
161 | NSDictionary *groupForFileRef=[self groupForFileRef:reference];
162 | if (groupForFileRef)
163 | {
164 | NSString *groupRef=[[groupForFileRef allKeys] firstObject];
165 | if ([groupRef isEqualToString:self.mainGroupRef])
166 | {
167 | fullPath = [self sourceRoot];
168 | }
169 | else
170 | {
171 | NSDictionary *groupInfo=[[groupForFileRef allValues] firstObject];
172 |
173 | NSString *groupPath=[groupInfo objectForKey:@"path"];
174 | if (!groupPath)
175 | {
176 | groupPath=@"";
177 | }
178 |
179 | NSString *groupAntecedantPath=[self pathForFileRef:groupRef];
180 | if (!groupAntecedantPath)
181 | {
182 | groupAntecedantPath=@"";
183 | }
184 |
185 | fullPath=[groupAntecedantPath stringByAppendingPathComponent:groupPath];
186 | }
187 | }
188 |
189 | return fullPath;
190 | }
191 |
192 | -(NSString*)pathForFileRef:(NSString*)reference
193 | {
194 | NSDictionary *fileInfo=[self.plistObjects objectForKey:reference];
195 | NSString *path=[fileInfo objectForKey:@"path"];
196 | NSString *referenceType=[fileInfo objectForKey:@"sourceTree"];
197 |
198 | if ([referenceType isEqualToString:@"SDKROOT"])
199 | {
200 | path=[@"SDKROOT" stringByAppendingPathComponent:path];
201 | }
202 | else if ([referenceType isEqualToString:@"DEVELOPER_DIR"])
203 | {
204 | path=[@"DEVELOPER_DIR" stringByAppendingPathComponent:path];
205 | }
206 | else if ([referenceType isEqualToString:@"SOURCE_ROOT"])
207 | {
208 | path=[[self sourceRoot] stringByAppendingPathComponent:path];
209 | }
210 | else if ([referenceType isEqualToString:@""])
211 | {
212 | NSString *groupPath=[self groupPathForFileRef:reference];
213 |
214 | NSString *type=[fileInfo objectForKey:@"isa"];
215 | if ([type isEqualToString:@"PBXFileReference"])
216 | {
217 | path=[groupPath stringByAppendingPathComponent:path];
218 | }
219 | else
220 | {
221 | path=groupPath;
222 | }
223 |
224 | }
225 |
226 | path=[path stringByStandardizingPath];
227 |
228 | //NSLog(@"Reference: %@ - standardizedPath: %@\n",referenceType,path);
229 |
230 | return path;
231 | }
232 |
233 | /** returns dictionary with path as key, and filename as value **/
234 | -(NSDictionary*)pathsAndFiles;
235 | {
236 | [self loadPlist];
237 | [self extractTargets];
238 | [self extractBuildPhases];
239 | [self extractProjectInfo];
240 |
241 | NSMutableDictionary *filesUsedByTargets=[NSMutableDictionary dictionary];
242 |
243 | [self.targets enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
244 | NSDictionary *targetInfo=obj;
245 | NSString *targetName=[targetInfo objectForKey:@"name"];
246 | if (!self.allowedTargets || [self.allowedTargets containsObject:targetName])
247 | {
248 | [filesUsedByTargets addEntriesFromDictionary:[self filesFromTargetObject:targetInfo]];
249 | }
250 | }];
251 |
252 | NSMutableDictionary *pathsAndFiles=[NSMutableDictionary dictionary];
253 |
254 | [filesUsedByTargets enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
255 | NSString *filename=[[obj objectForKey:@"path"] lastPathComponent];
256 |
257 | NSString *path=[self pathForFileRef:key];
258 |
259 | [pathsAndFiles setObject:filename forKey:path];
260 | }];
261 |
262 | return pathsAndFiles;
263 | }
264 |
265 | -(NSArray*)getTargets
266 | {
267 | [self loadPlist];
268 | [self extractTargets];
269 |
270 | NSMutableArray *targets=[NSMutableArray array];
271 |
272 | [self.targets enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
273 | NSDictionary *targetInfo=obj;
274 | NSString *targetName=[targetInfo objectForKey:@"name"];
275 | [targets addObject:targetName];
276 | }];
277 |
278 | return targets;
279 | }
280 |
281 | @end
282 |
--------------------------------------------------------------------------------
/ProjectFileTool.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 46;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | D43A66F71A66B38A000BD408 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = D43A66F61A66B38A000BD408 /* main.m */; };
11 | D43A67061A66B3DC000BD408 /* ProjectFileToolTests.m in Sources */ = {isa = PBXBuildFile; fileRef = D43A67051A66B3DC000BD408 /* ProjectFileToolTests.m */; };
12 | D43A670E1A66B45F000BD408 /* CommandHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = D43A670B1A66B45F000BD408 /* CommandHandler.m */; };
13 | D43A670F1A66B45F000BD408 /* ProjectParser.m in Sources */ = {isa = PBXBuildFile; fileRef = D43A670D1A66B45F000BD408 /* ProjectParser.m */; };
14 | D43A67101A66B468000BD408 /* ProjectParser.m in Sources */ = {isa = PBXBuildFile; fileRef = D43A670D1A66B45F000BD408 /* ProjectParser.m */; };
15 | D43A671B1A66B4BC000BD408 /* XCTest+HS.m in Sources */ = {isa = PBXBuildFile; fileRef = D43A67191A66B4BC000BD408 /* XCTest+HS.m */; };
16 | D43A672B1A66BD3C000BD408 /* LocalisationTestSubject in Resources */ = {isa = PBXBuildFile; fileRef = D43A672A1A66BD3C000BD408 /* LocalisationTestSubject */; };
17 | /* End PBXBuildFile section */
18 |
19 | /* Begin PBXCopyFilesBuildPhase section */
20 | D43A66F11A66B38A000BD408 /* 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 | D43A66F31A66B38A000BD408 /* ProjectFileTool */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = ProjectFileTool; sourceTree = BUILT_PRODUCTS_DIR; };
33 | D43A66F61A66B38A000BD408 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; };
34 | D43A67011A66B3DC000BD408 /* ProjectFileToolTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ProjectFileToolTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
35 | D43A67041A66B3DC000BD408 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
36 | D43A67051A66B3DC000BD408 /* ProjectFileToolTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ProjectFileToolTests.m; sourceTree = ""; };
37 | D43A670A1A66B45F000BD408 /* CommandHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CommandHandler.h; sourceTree = ""; };
38 | D43A670B1A66B45F000BD408 /* CommandHandler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CommandHandler.m; sourceTree = ""; };
39 | D43A670C1A66B45F000BD408 /* ProjectParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ProjectParser.h; sourceTree = ""; };
40 | D43A670D1A66B45F000BD408 /* ProjectParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ProjectParser.m; sourceTree = ""; };
41 | D43A67181A66B4BC000BD408 /* XCTest+HS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "XCTest+HS.h"; sourceTree = ""; };
42 | D43A67191A66B4BC000BD408 /* XCTest+HS.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "XCTest+HS.m"; sourceTree = ""; };
43 | D43A672A1A66BD3C000BD408 /* LocalisationTestSubject */ = {isa = PBXFileReference; lastKnownFileType = folder; path = LocalisationTestSubject; sourceTree = ""; };
44 | /* End PBXFileReference section */
45 |
46 | /* Begin PBXFrameworksBuildPhase section */
47 | D43A66F01A66B38A000BD408 /* Frameworks */ = {
48 | isa = PBXFrameworksBuildPhase;
49 | buildActionMask = 2147483647;
50 | files = (
51 | );
52 | runOnlyForDeploymentPostprocessing = 0;
53 | };
54 | D43A66FE1A66B3DC000BD408 /* Frameworks */ = {
55 | isa = PBXFrameworksBuildPhase;
56 | buildActionMask = 2147483647;
57 | files = (
58 | );
59 | runOnlyForDeploymentPostprocessing = 0;
60 | };
61 | /* End PBXFrameworksBuildPhase section */
62 |
63 | /* Begin PBXGroup section */
64 | D43A66EA1A66B38A000BD408 = {
65 | isa = PBXGroup;
66 | children = (
67 | D43A67131A66B48E000BD408 /* Helpers */,
68 | D43A66F51A66B38A000BD408 /* ProjectFileTool */,
69 | D43A67021A66B3DC000BD408 /* ProjectFileToolTests */,
70 | D43A66F41A66B38A000BD408 /* Products */,
71 | );
72 | sourceTree = "";
73 | };
74 | D43A66F41A66B38A000BD408 /* Products */ = {
75 | isa = PBXGroup;
76 | children = (
77 | D43A66F31A66B38A000BD408 /* ProjectFileTool */,
78 | D43A67011A66B3DC000BD408 /* ProjectFileToolTests.xctest */,
79 | );
80 | name = Products;
81 | sourceTree = "";
82 | };
83 | D43A66F51A66B38A000BD408 /* ProjectFileTool */ = {
84 | isa = PBXGroup;
85 | children = (
86 | D43A670A1A66B45F000BD408 /* CommandHandler.h */,
87 | D43A670B1A66B45F000BD408 /* CommandHandler.m */,
88 | D43A670C1A66B45F000BD408 /* ProjectParser.h */,
89 | D43A670D1A66B45F000BD408 /* ProjectParser.m */,
90 | D43A66F61A66B38A000BD408 /* main.m */,
91 | );
92 | path = ProjectFileTool;
93 | sourceTree = "";
94 | };
95 | D43A67021A66B3DC000BD408 /* ProjectFileToolTests */ = {
96 | isa = PBXGroup;
97 | children = (
98 | D43A67051A66B3DC000BD408 /* ProjectFileToolTests.m */,
99 | D43A67031A66B3DC000BD408 /* Supporting Files */,
100 | );
101 | path = ProjectFileToolTests;
102 | sourceTree = "";
103 | };
104 | D43A67031A66B3DC000BD408 /* Supporting Files */ = {
105 | isa = PBXGroup;
106 | children = (
107 | D43A672A1A66BD3C000BD408 /* LocalisationTestSubject */,
108 | D43A67041A66B3DC000BD408 /* Info.plist */,
109 | );
110 | name = "Supporting Files";
111 | sourceTree = "";
112 | };
113 | D43A67131A66B48E000BD408 /* Helpers */ = {
114 | isa = PBXGroup;
115 | children = (
116 | D43A67181A66B4BC000BD408 /* XCTest+HS.h */,
117 | D43A67191A66B4BC000BD408 /* XCTest+HS.m */,
118 | );
119 | name = Helpers;
120 | sourceTree = "";
121 | };
122 | /* End PBXGroup section */
123 |
124 | /* Begin PBXNativeTarget section */
125 | D43A66F21A66B38A000BD408 /* ProjectFileTool */ = {
126 | isa = PBXNativeTarget;
127 | buildConfigurationList = D43A66FA1A66B38A000BD408 /* Build configuration list for PBXNativeTarget "ProjectFileTool" */;
128 | buildPhases = (
129 | D43A66EF1A66B38A000BD408 /* Sources */,
130 | D43A66F01A66B38A000BD408 /* Frameworks */,
131 | D43A66F11A66B38A000BD408 /* CopyFiles */,
132 | );
133 | buildRules = (
134 | );
135 | dependencies = (
136 | );
137 | name = ProjectFileTool;
138 | productName = LocalisationTool;
139 | productReference = D43A66F31A66B38A000BD408 /* ProjectFileTool */;
140 | productType = "com.apple.product-type.tool";
141 | };
142 | D43A67001A66B3DC000BD408 /* ProjectFileToolTests */ = {
143 | isa = PBXNativeTarget;
144 | buildConfigurationList = D43A67071A66B3DC000BD408 /* Build configuration list for PBXNativeTarget "ProjectFileToolTests" */;
145 | buildPhases = (
146 | D43A66FD1A66B3DC000BD408 /* Sources */,
147 | D43A66FE1A66B3DC000BD408 /* Frameworks */,
148 | D43A66FF1A66B3DC000BD408 /* Resources */,
149 | );
150 | buildRules = (
151 | );
152 | dependencies = (
153 | );
154 | name = ProjectFileToolTests;
155 | productName = LocalisationToolTests;
156 | productReference = D43A67011A66B3DC000BD408 /* ProjectFileToolTests.xctest */;
157 | productType = "com.apple.product-type.bundle.unit-test";
158 | };
159 | /* End PBXNativeTarget section */
160 |
161 | /* Begin PBXProject section */
162 | D43A66EB1A66B38A000BD408 /* Project object */ = {
163 | isa = PBXProject;
164 | attributes = {
165 | LastUpgradeCheck = 0610;
166 | ORGANIZATIONNAME = HobbyistSoftware;
167 | TargetAttributes = {
168 | D43A66F21A66B38A000BD408 = {
169 | CreatedOnToolsVersion = 6.1.1;
170 | };
171 | D43A67001A66B3DC000BD408 = {
172 | CreatedOnToolsVersion = 6.1.1;
173 | };
174 | };
175 | };
176 | buildConfigurationList = D43A66EE1A66B38A000BD408 /* Build configuration list for PBXProject "ProjectFileTool" */;
177 | compatibilityVersion = "Xcode 3.2";
178 | developmentRegion = English;
179 | hasScannedForEncodings = 0;
180 | knownRegions = (
181 | en,
182 | );
183 | mainGroup = D43A66EA1A66B38A000BD408;
184 | productRefGroup = D43A66F41A66B38A000BD408 /* Products */;
185 | projectDirPath = "";
186 | projectRoot = "";
187 | targets = (
188 | D43A66F21A66B38A000BD408 /* ProjectFileTool */,
189 | D43A67001A66B3DC000BD408 /* ProjectFileToolTests */,
190 | );
191 | };
192 | /* End PBXProject section */
193 |
194 | /* Begin PBXResourcesBuildPhase section */
195 | D43A66FF1A66B3DC000BD408 /* Resources */ = {
196 | isa = PBXResourcesBuildPhase;
197 | buildActionMask = 2147483647;
198 | files = (
199 | D43A672B1A66BD3C000BD408 /* LocalisationTestSubject in Resources */,
200 | );
201 | runOnlyForDeploymentPostprocessing = 0;
202 | };
203 | /* End PBXResourcesBuildPhase section */
204 |
205 | /* Begin PBXSourcesBuildPhase section */
206 | D43A66EF1A66B38A000BD408 /* Sources */ = {
207 | isa = PBXSourcesBuildPhase;
208 | buildActionMask = 2147483647;
209 | files = (
210 | D43A670E1A66B45F000BD408 /* CommandHandler.m in Sources */,
211 | D43A670F1A66B45F000BD408 /* ProjectParser.m in Sources */,
212 | D43A66F71A66B38A000BD408 /* main.m in Sources */,
213 | );
214 | runOnlyForDeploymentPostprocessing = 0;
215 | };
216 | D43A66FD1A66B3DC000BD408 /* Sources */ = {
217 | isa = PBXSourcesBuildPhase;
218 | buildActionMask = 2147483647;
219 | files = (
220 | D43A67101A66B468000BD408 /* ProjectParser.m in Sources */,
221 | D43A67061A66B3DC000BD408 /* ProjectFileToolTests.m in Sources */,
222 | D43A671B1A66B4BC000BD408 /* XCTest+HS.m in Sources */,
223 | );
224 | runOnlyForDeploymentPostprocessing = 0;
225 | };
226 | /* End PBXSourcesBuildPhase section */
227 |
228 | /* Begin XCBuildConfiguration section */
229 | D43A66F81A66B38A000BD408 /* Debug */ = {
230 | isa = XCBuildConfiguration;
231 | buildSettings = {
232 | ALWAYS_SEARCH_USER_PATHS = NO;
233 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
234 | CLANG_CXX_LIBRARY = "libc++";
235 | CLANG_ENABLE_MODULES = YES;
236 | CLANG_ENABLE_OBJC_ARC = NO;
237 | CLANG_WARN_BOOL_CONVERSION = YES;
238 | CLANG_WARN_CONSTANT_CONVERSION = YES;
239 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
240 | CLANG_WARN_EMPTY_BODY = YES;
241 | CLANG_WARN_ENUM_CONVERSION = YES;
242 | CLANG_WARN_INT_CONVERSION = YES;
243 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
244 | CLANG_WARN_UNREACHABLE_CODE = YES;
245 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
246 | COPY_PHASE_STRIP = NO;
247 | ENABLE_STRICT_OBJC_MSGSEND = YES;
248 | GCC_C_LANGUAGE_STANDARD = gnu99;
249 | GCC_DYNAMIC_NO_PIC = NO;
250 | GCC_OPTIMIZATION_LEVEL = 0;
251 | GCC_PREPROCESSOR_DEFINITIONS = (
252 | "DEBUG=1",
253 | "$(inherited)",
254 | );
255 | GCC_SYMBOLS_PRIVATE_EXTERN = NO;
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.10;
263 | MTL_ENABLE_DEBUG_INFO = YES;
264 | ONLY_ACTIVE_ARCH = YES;
265 | SDKROOT = macosx;
266 | };
267 | name = Debug;
268 | };
269 | D43A66F91A66B38A000BD408 /* Release */ = {
270 | isa = XCBuildConfiguration;
271 | buildSettings = {
272 | ALWAYS_SEARCH_USER_PATHS = NO;
273 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
274 | CLANG_CXX_LIBRARY = "libc++";
275 | CLANG_ENABLE_MODULES = YES;
276 | CLANG_ENABLE_OBJC_ARC = NO;
277 | CLANG_WARN_BOOL_CONVERSION = YES;
278 | CLANG_WARN_CONSTANT_CONVERSION = YES;
279 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
280 | CLANG_WARN_EMPTY_BODY = YES;
281 | CLANG_WARN_ENUM_CONVERSION = YES;
282 | CLANG_WARN_INT_CONVERSION = YES;
283 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
284 | CLANG_WARN_UNREACHABLE_CODE = YES;
285 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
286 | COPY_PHASE_STRIP = YES;
287 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
288 | ENABLE_NS_ASSERTIONS = NO;
289 | ENABLE_STRICT_OBJC_MSGSEND = YES;
290 | GCC_C_LANGUAGE_STANDARD = gnu99;
291 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
292 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
293 | GCC_WARN_UNDECLARED_SELECTOR = YES;
294 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
295 | GCC_WARN_UNUSED_FUNCTION = YES;
296 | GCC_WARN_UNUSED_VARIABLE = YES;
297 | MACOSX_DEPLOYMENT_TARGET = 10.10;
298 | MTL_ENABLE_DEBUG_INFO = NO;
299 | SDKROOT = macosx;
300 | };
301 | name = Release;
302 | };
303 | D43A66FB1A66B38A000BD408 /* Debug */ = {
304 | isa = XCBuildConfiguration;
305 | buildSettings = {
306 | CLANG_ENABLE_OBJC_ARC = YES;
307 | PRODUCT_NAME = ProjectFileTool;
308 | };
309 | name = Debug;
310 | };
311 | D43A66FC1A66B38A000BD408 /* Release */ = {
312 | isa = XCBuildConfiguration;
313 | buildSettings = {
314 | CLANG_ENABLE_OBJC_ARC = YES;
315 | PRODUCT_NAME = ProjectFileTool;
316 | };
317 | name = Release;
318 | };
319 | D43A67081A66B3DC000BD408 /* Debug */ = {
320 | isa = XCBuildConfiguration;
321 | buildSettings = {
322 | COMBINE_HIDPI_IMAGES = YES;
323 | FRAMEWORK_SEARCH_PATHS = (
324 | "$(DEVELOPER_FRAMEWORKS_DIR)",
325 | "$(inherited)",
326 | );
327 | GCC_PREPROCESSOR_DEFINITIONS = (
328 | "DEBUG=1",
329 | "$(inherited)",
330 | );
331 | INFOPLIST_FILE = ProjectFileToolTests/Info.plist;
332 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
333 | PRODUCT_NAME = ProjectFileToolTests;
334 | };
335 | name = Debug;
336 | };
337 | D43A67091A66B3DC000BD408 /* Release */ = {
338 | isa = XCBuildConfiguration;
339 | buildSettings = {
340 | COMBINE_HIDPI_IMAGES = YES;
341 | FRAMEWORK_SEARCH_PATHS = (
342 | "$(DEVELOPER_FRAMEWORKS_DIR)",
343 | "$(inherited)",
344 | );
345 | INFOPLIST_FILE = ProjectFileToolTests/Info.plist;
346 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
347 | PRODUCT_NAME = ProjectFileToolTests;
348 | };
349 | name = Release;
350 | };
351 | /* End XCBuildConfiguration section */
352 |
353 | /* Begin XCConfigurationList section */
354 | D43A66EE1A66B38A000BD408 /* Build configuration list for PBXProject "ProjectFileTool" */ = {
355 | isa = XCConfigurationList;
356 | buildConfigurations = (
357 | D43A66F81A66B38A000BD408 /* Debug */,
358 | D43A66F91A66B38A000BD408 /* Release */,
359 | );
360 | defaultConfigurationIsVisible = 0;
361 | defaultConfigurationName = Release;
362 | };
363 | D43A66FA1A66B38A000BD408 /* Build configuration list for PBXNativeTarget "ProjectFileTool" */ = {
364 | isa = XCConfigurationList;
365 | buildConfigurations = (
366 | D43A66FB1A66B38A000BD408 /* Debug */,
367 | D43A66FC1A66B38A000BD408 /* Release */,
368 | );
369 | defaultConfigurationIsVisible = 0;
370 | defaultConfigurationName = Release;
371 | };
372 | D43A67071A66B3DC000BD408 /* Build configuration list for PBXNativeTarget "ProjectFileToolTests" */ = {
373 | isa = XCConfigurationList;
374 | buildConfigurations = (
375 | D43A67081A66B3DC000BD408 /* Debug */,
376 | D43A67091A66B3DC000BD408 /* Release */,
377 | );
378 | defaultConfigurationIsVisible = 0;
379 | defaultConfigurationName = Release;
380 | };
381 | /* End XCConfigurationList section */
382 | };
383 | rootObject = D43A66EB1A66B38A000BD408 /* Project object */;
384 | }
385 |
--------------------------------------------------------------------------------
/ProjectFileToolTests/LocalisationTestSubject/LocalisationTestSubject.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 46;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | D43892331A5D791A009D7E1F /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = D43892321A5D791A009D7E1F /* AppDelegate.m */; };
11 | D43892351A5D791A009D7E1F /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = D43892341A5D791A009D7E1F /* main.m */; };
12 | D438923A1A5D791A009D7E1F /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D43892391A5D791A009D7E1F /* Images.xcassets */; };
13 | D438923D1A5D791A009D7E1F /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D438923B1A5D791A009D7E1F /* Main.storyboard */; };
14 | D43892491A5D791A009D7E1F /* Tests.m in Sources */ = {isa = PBXBuildFile; fileRef = D43892481A5D791A009D7E1F /* Tests.m */; };
15 | D43892531A5D796D009D7E1F /* View.xib in Resources */ = {isa = PBXBuildFile; fileRef = D43892521A5D796D009D7E1F /* View.xib */; };
16 | D43892631A5D858B009D7E1F /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D43892621A5D858B009D7E1F /* ViewController.m */; };
17 | D43892641A5D858B009D7E1F /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D43892621A5D858B009D7E1F /* ViewController.m */; };
18 | D438926B1A5D9479009D7E1F /* NotInAnyTarget.m in Resources */ = {isa = PBXBuildFile; fileRef = D43892661A5D8C47009D7E1F /* NotInAnyTarget.m */; };
19 | D43A667F1A5E9FE3000BD408 /* Absolute.m in Sources */ = {isa = PBXBuildFile; fileRef = D43A667A1A5E9FE3000BD408 /* Absolute.m */; };
20 | D43A66801A5E9FE3000BD408 /* RelToDevDirectory.m in Sources */ = {isa = PBXBuildFile; fileRef = D43A667B1A5E9FE3000BD408 /* RelToDevDirectory.m */; };
21 | D43A66811A5E9FE3000BD408 /* RelToGroup.m in Sources */ = {isa = PBXBuildFile; fileRef = D43A667C1A5E9FE3000BD408 /* RelToGroup.m */; };
22 | D43A66821A5E9FE3000BD408 /* RelToProject.m in Sources */ = {isa = PBXBuildFile; fileRef = D43A667D1A5E9FE3000BD408 /* RelToProject.m */; };
23 | D43A66831A5E9FE3000BD408 /* RelToSdk.m in Sources */ = {isa = PBXBuildFile; fileRef = D43A667E1A5E9FE3000BD408 /* RelToSdk.m */; };
24 | D43A66851A5EA400000BD408 /* Absolute1.m in Sources */ = {isa = PBXBuildFile; fileRef = D43A66841A5EA400000BD408 /* Absolute1.m */; };
25 | D43A668A1A6439F2000BD408 /* RelToGroup2.m in Sources */ = {isa = PBXBuildFile; fileRef = D43A66881A6439F2000BD408 /* RelToGroup2.m */; };
26 | D43A668B1A6439F2000BD408 /* RelToGroup1.m in Sources */ = {isa = PBXBuildFile; fileRef = D43A66891A6439F2000BD408 /* RelToGroup1.m */; };
27 | /* End PBXBuildFile section */
28 |
29 | /* Begin PBXContainerItemProxy section */
30 | D43892431A5D791A009D7E1F /* PBXContainerItemProxy */ = {
31 | isa = PBXContainerItemProxy;
32 | containerPortal = D43892241A5D7919009D7E1F /* Project object */;
33 | proxyType = 1;
34 | remoteGlobalIDString = D438922B1A5D791A009D7E1F;
35 | remoteInfo = LocalisationTestSubject;
36 | };
37 | /* End PBXContainerItemProxy section */
38 |
39 | /* Begin PBXFileReference section */
40 | D438922C1A5D791A009D7E1F /* BaseTarget.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = BaseTarget.app; sourceTree = BUILT_PRODUCTS_DIR; };
41 | D43892301A5D791A009D7E1F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
42 | D43892311A5D791A009D7E1F /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; };
43 | D43892321A5D791A009D7E1F /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; };
44 | D43892341A5D791A009D7E1F /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; };
45 | D43892391A5D791A009D7E1F /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; };
46 | D438923C1A5D791A009D7E1F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
47 | D43892421A5D791A009D7E1F /* TestTarget.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TestTarget.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
48 | D43892471A5D791A009D7E1F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
49 | D43892481A5D791A009D7E1F /* Tests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Tests.m; sourceTree = ""; };
50 | D43892521A5D796D009D7E1F /* View.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = View.xib; sourceTree = ""; };
51 | D43892611A5D858B009D7E1F /* ViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; };
52 | D43892621A5D858B009D7E1F /* ViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; };
53 | D43892651A5D8C47009D7E1F /* NotInAnyTarget.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NotInAnyTarget.h; sourceTree = ""; };
54 | D43892661A5D8C47009D7E1F /* NotInAnyTarget.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NotInAnyTarget.m; sourceTree = ""; };
55 | D43A667A1A5E9FE3000BD408 /* Absolute.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Absolute.m; path = /Users/rob/Documents/Development/Mac/MacDesktop/LocalisationTool/LocalisationToolTests/LocalisationTestSubject/Absolute.m; sourceTree = ""; };
56 | D43A667B1A5E9FE3000BD408 /* RelToDevDirectory.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RelToDevDirectory.m; path = ../../../../Users/rob/Documents/Development/Mac/MacDesktop/LocalisationTool/LocalisationToolTests/LocalisationTestSubject/RelToDevDirectory.m; sourceTree = DEVELOPER_DIR; };
57 | D43A667C1A5E9FE3000BD408 /* RelToGroup.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RelToGroup.m; sourceTree = ""; };
58 | D43A667D1A5E9FE3000BD408 /* RelToProject.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RelToProject.m; sourceTree = SOURCE_ROOT; };
59 | D43A667E1A5E9FE3000BD408 /* RelToSdk.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RelToSdk.m; path = ../../../../../../../../../Users/rob/Documents/Development/Mac/MacDesktop/LocalisationTool/LocalisationToolTests/LocalisationTestSubject/RelToSdk.m; sourceTree = SDKROOT; };
60 | D43A66841A5EA400000BD408 /* Absolute1.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Absolute1.m; path = /Users/rob/Documents/Development/Mac/MacDesktop/LocalisationTool/LocalisationToolTests/LocalisationTestSubject/Folder1/Absolute1.m; sourceTree = ""; };
61 | D43A66881A6439F2000BD408 /* RelToGroup2.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RelToGroup2.m; sourceTree = ""; };
62 | D43A66891A6439F2000BD408 /* RelToGroup1.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RelToGroup1.m; sourceTree = ""; };
63 | /* End PBXFileReference section */
64 |
65 | /* Begin PBXFrameworksBuildPhase section */
66 | D43892291A5D791A009D7E1F /* Frameworks */ = {
67 | isa = PBXFrameworksBuildPhase;
68 | buildActionMask = 2147483647;
69 | files = (
70 | );
71 | runOnlyForDeploymentPostprocessing = 0;
72 | };
73 | D438923F1A5D791A009D7E1F /* Frameworks */ = {
74 | isa = PBXFrameworksBuildPhase;
75 | buildActionMask = 2147483647;
76 | files = (
77 | );
78 | runOnlyForDeploymentPostprocessing = 0;
79 | };
80 | /* End PBXFrameworksBuildPhase section */
81 |
82 | /* Begin PBXGroup section */
83 | D43892231A5D7919009D7E1F = {
84 | isa = PBXGroup;
85 | children = (
86 | D43A66841A5EA400000BD408 /* Absolute1.m */,
87 | D43A667A1A5E9FE3000BD408 /* Absolute.m */,
88 | D43A667B1A5E9FE3000BD408 /* RelToDevDirectory.m */,
89 | D43A667C1A5E9FE3000BD408 /* RelToGroup.m */,
90 | D43A667D1A5E9FE3000BD408 /* RelToProject.m */,
91 | D43A667E1A5E9FE3000BD408 /* RelToSdk.m */,
92 | D43A66861A6439F2000BD408 /* RelativeGroup */,
93 | D438922E1A5D791A009D7E1F /* LocalisationTestSubject */,
94 | D43892451A5D791A009D7E1F /* LocalisationTestSubjectTests */,
95 | D438922D1A5D791A009D7E1F /* Products */,
96 | );
97 | sourceTree = "";
98 | };
99 | D438922D1A5D791A009D7E1F /* Products */ = {
100 | isa = PBXGroup;
101 | children = (
102 | D438922C1A5D791A009D7E1F /* BaseTarget.app */,
103 | D43892421A5D791A009D7E1F /* TestTarget.xctest */,
104 | );
105 | name = Products;
106 | sourceTree = "";
107 | };
108 | D438922E1A5D791A009D7E1F /* LocalisationTestSubject */ = {
109 | isa = PBXGroup;
110 | children = (
111 | D43892311A5D791A009D7E1F /* AppDelegate.h */,
112 | D43892321A5D791A009D7E1F /* AppDelegate.m */,
113 | D43892601A5D858B009D7E1F /* Subfolder */,
114 | D43892391A5D791A009D7E1F /* Images.xcassets */,
115 | D438923B1A5D791A009D7E1F /* Main.storyboard */,
116 | D438922F1A5D791A009D7E1F /* Supporting Files */,
117 | D43892521A5D796D009D7E1F /* View.xib */,
118 | D43892651A5D8C47009D7E1F /* NotInAnyTarget.h */,
119 | D43892661A5D8C47009D7E1F /* NotInAnyTarget.m */,
120 | );
121 | path = LocalisationTestSubject;
122 | sourceTree = "";
123 | };
124 | D438922F1A5D791A009D7E1F /* Supporting Files */ = {
125 | isa = PBXGroup;
126 | children = (
127 | D43892301A5D791A009D7E1F /* Info.plist */,
128 | D43892341A5D791A009D7E1F /* main.m */,
129 | );
130 | name = "Supporting Files";
131 | sourceTree = "";
132 | };
133 | D43892451A5D791A009D7E1F /* LocalisationTestSubjectTests */ = {
134 | isa = PBXGroup;
135 | children = (
136 | D43892481A5D791A009D7E1F /* Tests.m */,
137 | D43892461A5D791A009D7E1F /* Supporting Files */,
138 | );
139 | path = LocalisationTestSubjectTests;
140 | sourceTree = "";
141 | };
142 | D43892461A5D791A009D7E1F /* Supporting Files */ = {
143 | isa = PBXGroup;
144 | children = (
145 | D43892471A5D791A009D7E1F /* Info.plist */,
146 | );
147 | name = "Supporting Files";
148 | sourceTree = "";
149 | };
150 | D43892601A5D858B009D7E1F /* Subfolder */ = {
151 | isa = PBXGroup;
152 | children = (
153 | D43892611A5D858B009D7E1F /* ViewController.h */,
154 | D43892621A5D858B009D7E1F /* ViewController.m */,
155 | );
156 | path = Subfolder;
157 | sourceTree = "";
158 | };
159 | D43A66861A6439F2000BD408 /* RelativeGroup */ = {
160 | isa = PBXGroup;
161 | children = (
162 | D43A66871A6439F2000BD408 /* RelativeGroup2 */,
163 | D43A66891A6439F2000BD408 /* RelToGroup1.m */,
164 | );
165 | path = RelativeGroup;
166 | sourceTree = "";
167 | };
168 | D43A66871A6439F2000BD408 /* RelativeGroup2 */ = {
169 | isa = PBXGroup;
170 | children = (
171 | D43A66881A6439F2000BD408 /* RelToGroup2.m */,
172 | );
173 | path = RelativeGroup2;
174 | sourceTree = "";
175 | };
176 | /* End PBXGroup section */
177 |
178 | /* Begin PBXNativeTarget section */
179 | D438922B1A5D791A009D7E1F /* BaseTarget */ = {
180 | isa = PBXNativeTarget;
181 | buildConfigurationList = D438924C1A5D791A009D7E1F /* Build configuration list for PBXNativeTarget "BaseTarget" */;
182 | buildPhases = (
183 | D43892281A5D791A009D7E1F /* Sources */,
184 | D43892291A5D791A009D7E1F /* Frameworks */,
185 | D438922A1A5D791A009D7E1F /* Resources */,
186 | );
187 | buildRules = (
188 | );
189 | dependencies = (
190 | );
191 | name = BaseTarget;
192 | productName = LocalisationTestSubject;
193 | productReference = D438922C1A5D791A009D7E1F /* BaseTarget.app */;
194 | productType = "com.apple.product-type.application";
195 | };
196 | D43892411A5D791A009D7E1F /* TestTarget */ = {
197 | isa = PBXNativeTarget;
198 | buildConfigurationList = D438924F1A5D791A009D7E1F /* Build configuration list for PBXNativeTarget "TestTarget" */;
199 | buildPhases = (
200 | D438923E1A5D791A009D7E1F /* Sources */,
201 | D438923F1A5D791A009D7E1F /* Frameworks */,
202 | D43892401A5D791A009D7E1F /* Resources */,
203 | );
204 | buildRules = (
205 | );
206 | dependencies = (
207 | D43892441A5D791A009D7E1F /* PBXTargetDependency */,
208 | );
209 | name = TestTarget;
210 | productName = LocalisationTestSubjectTests;
211 | productReference = D43892421A5D791A009D7E1F /* TestTarget.xctest */;
212 | productType = "com.apple.product-type.bundle.unit-test";
213 | };
214 | /* End PBXNativeTarget section */
215 |
216 | /* Begin PBXProject section */
217 | D43892241A5D7919009D7E1F /* Project object */ = {
218 | isa = PBXProject;
219 | attributes = {
220 | LastUpgradeCheck = 0610;
221 | ORGANIZATIONNAME = HobbyistSoftware;
222 | TargetAttributes = {
223 | D438922B1A5D791A009D7E1F = {
224 | CreatedOnToolsVersion = 6.1.1;
225 | };
226 | D43892411A5D791A009D7E1F = {
227 | CreatedOnToolsVersion = 6.1.1;
228 | TestTargetID = D438922B1A5D791A009D7E1F;
229 | };
230 | };
231 | };
232 | buildConfigurationList = D43892271A5D7919009D7E1F /* Build configuration list for PBXProject "LocalisationTestSubject" */;
233 | compatibilityVersion = "Xcode 3.2";
234 | developmentRegion = English;
235 | hasScannedForEncodings = 0;
236 | knownRegions = (
237 | en,
238 | Base,
239 | );
240 | mainGroup = D43892231A5D7919009D7E1F;
241 | productRefGroup = D438922D1A5D791A009D7E1F /* Products */;
242 | projectDirPath = "";
243 | projectRoot = "";
244 | targets = (
245 | D438922B1A5D791A009D7E1F /* BaseTarget */,
246 | D43892411A5D791A009D7E1F /* TestTarget */,
247 | );
248 | };
249 | /* End PBXProject section */
250 |
251 | /* Begin PBXResourcesBuildPhase section */
252 | D438922A1A5D791A009D7E1F /* Resources */ = {
253 | isa = PBXResourcesBuildPhase;
254 | buildActionMask = 2147483647;
255 | files = (
256 | D438923A1A5D791A009D7E1F /* Images.xcassets in Resources */,
257 | D43892531A5D796D009D7E1F /* View.xib in Resources */,
258 | D438923D1A5D791A009D7E1F /* Main.storyboard in Resources */,
259 | );
260 | runOnlyForDeploymentPostprocessing = 0;
261 | };
262 | D43892401A5D791A009D7E1F /* Resources */ = {
263 | isa = PBXResourcesBuildPhase;
264 | buildActionMask = 2147483647;
265 | files = (
266 | D438926B1A5D9479009D7E1F /* NotInAnyTarget.m in Resources */,
267 | );
268 | runOnlyForDeploymentPostprocessing = 0;
269 | };
270 | /* End PBXResourcesBuildPhase section */
271 |
272 | /* Begin PBXSourcesBuildPhase section */
273 | D43892281A5D791A009D7E1F /* Sources */ = {
274 | isa = PBXSourcesBuildPhase;
275 | buildActionMask = 2147483647;
276 | files = (
277 | D43A66851A5EA400000BD408 /* Absolute1.m in Sources */,
278 | D43A668B1A6439F2000BD408 /* RelToGroup1.m in Sources */,
279 | D43A668A1A6439F2000BD408 /* RelToGroup2.m in Sources */,
280 | D43A66821A5E9FE3000BD408 /* RelToProject.m in Sources */,
281 | D43A667F1A5E9FE3000BD408 /* Absolute.m in Sources */,
282 | D43892631A5D858B009D7E1F /* ViewController.m in Sources */,
283 | D43892351A5D791A009D7E1F /* main.m in Sources */,
284 | D43A66801A5E9FE3000BD408 /* RelToDevDirectory.m in Sources */,
285 | D43A66831A5E9FE3000BD408 /* RelToSdk.m in Sources */,
286 | D43A66811A5E9FE3000BD408 /* RelToGroup.m in Sources */,
287 | D43892331A5D791A009D7E1F /* AppDelegate.m in Sources */,
288 | );
289 | runOnlyForDeploymentPostprocessing = 0;
290 | };
291 | D438923E1A5D791A009D7E1F /* Sources */ = {
292 | isa = PBXSourcesBuildPhase;
293 | buildActionMask = 2147483647;
294 | files = (
295 | D43892641A5D858B009D7E1F /* ViewController.m in Sources */,
296 | D43892491A5D791A009D7E1F /* Tests.m in Sources */,
297 | );
298 | runOnlyForDeploymentPostprocessing = 0;
299 | };
300 | /* End PBXSourcesBuildPhase section */
301 |
302 | /* Begin PBXTargetDependency section */
303 | D43892441A5D791A009D7E1F /* PBXTargetDependency */ = {
304 | isa = PBXTargetDependency;
305 | target = D438922B1A5D791A009D7E1F /* BaseTarget */;
306 | targetProxy = D43892431A5D791A009D7E1F /* PBXContainerItemProxy */;
307 | };
308 | /* End PBXTargetDependency section */
309 |
310 | /* Begin PBXVariantGroup section */
311 | D438923B1A5D791A009D7E1F /* Main.storyboard */ = {
312 | isa = PBXVariantGroup;
313 | children = (
314 | D438923C1A5D791A009D7E1F /* Base */,
315 | );
316 | name = Main.storyboard;
317 | sourceTree = "";
318 | };
319 | /* End PBXVariantGroup section */
320 |
321 | /* Begin XCBuildConfiguration section */
322 | D438924A1A5D791A009D7E1F /* Debug */ = {
323 | isa = XCBuildConfiguration;
324 | buildSettings = {
325 | ALWAYS_SEARCH_USER_PATHS = NO;
326 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
327 | CLANG_CXX_LIBRARY = "libc++";
328 | CLANG_ENABLE_MODULES = YES;
329 | CLANG_ENABLE_OBJC_ARC = YES;
330 | CLANG_WARN_BOOL_CONVERSION = YES;
331 | CLANG_WARN_CONSTANT_CONVERSION = YES;
332 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
333 | CLANG_WARN_EMPTY_BODY = YES;
334 | CLANG_WARN_ENUM_CONVERSION = YES;
335 | CLANG_WARN_INT_CONVERSION = YES;
336 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
337 | CLANG_WARN_UNREACHABLE_CODE = YES;
338 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
339 | CODE_SIGN_IDENTITY = "-";
340 | COPY_PHASE_STRIP = NO;
341 | ENABLE_STRICT_OBJC_MSGSEND = YES;
342 | GCC_C_LANGUAGE_STANDARD = gnu99;
343 | GCC_DYNAMIC_NO_PIC = NO;
344 | GCC_OPTIMIZATION_LEVEL = 0;
345 | GCC_PREPROCESSOR_DEFINITIONS = (
346 | "DEBUG=1",
347 | "$(inherited)",
348 | );
349 | GCC_SYMBOLS_PRIVATE_EXTERN = NO;
350 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
351 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
352 | GCC_WARN_UNDECLARED_SELECTOR = YES;
353 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
354 | GCC_WARN_UNUSED_FUNCTION = YES;
355 | GCC_WARN_UNUSED_VARIABLE = YES;
356 | MACOSX_DEPLOYMENT_TARGET = 10.10;
357 | MTL_ENABLE_DEBUG_INFO = YES;
358 | ONLY_ACTIVE_ARCH = YES;
359 | SDKROOT = macosx;
360 | };
361 | name = Debug;
362 | };
363 | D438924B1A5D791A009D7E1F /* Release */ = {
364 | isa = XCBuildConfiguration;
365 | buildSettings = {
366 | ALWAYS_SEARCH_USER_PATHS = NO;
367 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
368 | CLANG_CXX_LIBRARY = "libc++";
369 | CLANG_ENABLE_MODULES = YES;
370 | CLANG_ENABLE_OBJC_ARC = YES;
371 | CLANG_WARN_BOOL_CONVERSION = YES;
372 | CLANG_WARN_CONSTANT_CONVERSION = YES;
373 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
374 | CLANG_WARN_EMPTY_BODY = YES;
375 | CLANG_WARN_ENUM_CONVERSION = YES;
376 | CLANG_WARN_INT_CONVERSION = YES;
377 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
378 | CLANG_WARN_UNREACHABLE_CODE = YES;
379 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
380 | CODE_SIGN_IDENTITY = "-";
381 | COPY_PHASE_STRIP = YES;
382 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
383 | ENABLE_NS_ASSERTIONS = NO;
384 | ENABLE_STRICT_OBJC_MSGSEND = YES;
385 | GCC_C_LANGUAGE_STANDARD = gnu99;
386 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
387 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
388 | GCC_WARN_UNDECLARED_SELECTOR = YES;
389 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
390 | GCC_WARN_UNUSED_FUNCTION = YES;
391 | GCC_WARN_UNUSED_VARIABLE = YES;
392 | MACOSX_DEPLOYMENT_TARGET = 10.10;
393 | MTL_ENABLE_DEBUG_INFO = NO;
394 | SDKROOT = macosx;
395 | };
396 | name = Release;
397 | };
398 | D438924D1A5D791A009D7E1F /* Debug */ = {
399 | isa = XCBuildConfiguration;
400 | buildSettings = {
401 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
402 | COMBINE_HIDPI_IMAGES = YES;
403 | INFOPLIST_FILE = LocalisationTestSubject/Info.plist;
404 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
405 | PRODUCT_NAME = "$(TARGET_NAME)";
406 | };
407 | name = Debug;
408 | };
409 | D438924E1A5D791A009D7E1F /* Release */ = {
410 | isa = XCBuildConfiguration;
411 | buildSettings = {
412 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
413 | COMBINE_HIDPI_IMAGES = YES;
414 | INFOPLIST_FILE = LocalisationTestSubject/Info.plist;
415 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
416 | PRODUCT_NAME = "$(TARGET_NAME)";
417 | };
418 | name = Release;
419 | };
420 | D43892501A5D791A009D7E1F /* Debug */ = {
421 | isa = XCBuildConfiguration;
422 | buildSettings = {
423 | BUNDLE_LOADER = "$(TEST_HOST)";
424 | COMBINE_HIDPI_IMAGES = YES;
425 | FRAMEWORK_SEARCH_PATHS = (
426 | "$(DEVELOPER_FRAMEWORKS_DIR)",
427 | "$(inherited)",
428 | );
429 | GCC_PREPROCESSOR_DEFINITIONS = (
430 | "DEBUG=1",
431 | "$(inherited)",
432 | );
433 | INFOPLIST_FILE = LocalisationTestSubjectTests/Info.plist;
434 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
435 | PRODUCT_NAME = "$(TARGET_NAME)";
436 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/LocalisationTestSubject.app/Contents/MacOS/LocalisationTestSubject";
437 | };
438 | name = Debug;
439 | };
440 | D43892511A5D791A009D7E1F /* Release */ = {
441 | isa = XCBuildConfiguration;
442 | buildSettings = {
443 | BUNDLE_LOADER = "$(TEST_HOST)";
444 | COMBINE_HIDPI_IMAGES = YES;
445 | FRAMEWORK_SEARCH_PATHS = (
446 | "$(DEVELOPER_FRAMEWORKS_DIR)",
447 | "$(inherited)",
448 | );
449 | INFOPLIST_FILE = LocalisationTestSubjectTests/Info.plist;
450 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
451 | PRODUCT_NAME = "$(TARGET_NAME)";
452 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/LocalisationTestSubject.app/Contents/MacOS/LocalisationTestSubject";
453 | };
454 | name = Release;
455 | };
456 | /* End XCBuildConfiguration section */
457 |
458 | /* Begin XCConfigurationList section */
459 | D43892271A5D7919009D7E1F /* Build configuration list for PBXProject "LocalisationTestSubject" */ = {
460 | isa = XCConfigurationList;
461 | buildConfigurations = (
462 | D438924A1A5D791A009D7E1F /* Debug */,
463 | D438924B1A5D791A009D7E1F /* Release */,
464 | );
465 | defaultConfigurationIsVisible = 0;
466 | defaultConfigurationName = Release;
467 | };
468 | D438924C1A5D791A009D7E1F /* Build configuration list for PBXNativeTarget "BaseTarget" */ = {
469 | isa = XCConfigurationList;
470 | buildConfigurations = (
471 | D438924D1A5D791A009D7E1F /* Debug */,
472 | D438924E1A5D791A009D7E1F /* Release */,
473 | );
474 | defaultConfigurationIsVisible = 0;
475 | defaultConfigurationName = Release;
476 | };
477 | D438924F1A5D791A009D7E1F /* Build configuration list for PBXNativeTarget "TestTarget" */ = {
478 | isa = XCConfigurationList;
479 | buildConfigurations = (
480 | D43892501A5D791A009D7E1F /* Debug */,
481 | D43892511A5D791A009D7E1F /* Release */,
482 | );
483 | defaultConfigurationIsVisible = 0;
484 | defaultConfigurationName = Release;
485 | };
486 | /* End XCConfigurationList section */
487 | };
488 | rootObject = D43892241A5D7919009D7E1F /* Project object */;
489 | }
490 |
--------------------------------------------------------------------------------
/ProjectFileToolTests/LocalisationTestSubject/LocalisationTestSubject/Base.lproj/Main.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
640 |
641 |
642 |
643 |
644 |
645 |
646 |
647 |
648 |
649 |
650 |
651 |
652 |
653 |
654 |
655 |
656 |
657 |
658 |
659 |
660 |
661 |
662 |
663 |
664 |
665 |
666 |
667 |
668 |
669 |
670 |
671 |
672 |
673 |
674 |
675 |
676 |
677 |
678 |
679 |
680 |
681 |
682 |
--------------------------------------------------------------------------------