synx 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +46 -0
- data/.travis.yml +20 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +70 -0
- data/Rakefile +2 -0
- data/bin/synx +18 -0
- data/lib/synx.rb +13 -0
- data/lib/synx/abstract_object.rb +44 -0
- data/lib/synx/pbx_file_reference.rb +70 -0
- data/lib/synx/pbx_group.rb +126 -0
- data/lib/synx/pbx_native_target.rb +15 -0
- data/lib/synx/pbx_variant_group.rb +20 -0
- data/lib/synx/project.rb +100 -0
- data/lib/synx/tabber.rb +35 -0
- data/lib/synx/version.rb +3 -0
- data/spec/dummy/dummy.xcodeproj/project.pbxproj +534 -0
- data/spec/dummy/dummy.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
- data/spec/dummy/dummy/AlreadySynced/Core Data.xcdatamodeld/.xccurrentversion +8 -0
- data/spec/dummy/dummy/AlreadySynced/Core Data.xcdatamodeld/Core Data 2.xcdatamodel/contents +4 -0
- data/spec/dummy/dummy/AlreadySynced/Core Data.xcdatamodeld/Core Data 3.xcdatamodel/contents +4 -0
- data/spec/dummy/dummy/AlreadySynced/Core Data.xcdatamodeld/Core Data 4.xcdatamodel/contents +4 -0
- data/spec/dummy/dummy/AlreadySynced/Core Data.xcdatamodeld/Core Data.xcdatamodel/contents +4 -0
- data/spec/dummy/dummy/AlreadySynced/FolderNotInXcodeProj/AnotherFileNotInXcodeProj.h +0 -0
- data/spec/dummy/dummy/AlreadySynced/FolderNotInXcodeProj/NSObject+abc.h +13 -0
- data/spec/dummy/dummy/AlreadySynced/FolderNotInXcodeProj/NSObject+abc.m +13 -0
- data/spec/dummy/dummy/AlreadySynced/FolderNotInXcodeProj/Wowwww.h +13 -0
- data/spec/dummy/dummy/AlreadySynced/FolderNotInXcodeProj/Wowwww.m +13 -0
- data/spec/dummy/dummy/AlreadySynced/Woot.h +13 -0
- data/spec/dummy/dummy/AlreadySynced/Woot.m +13 -0
- data/spec/dummy/dummy/AlreadySynced/stuff.xml +0 -0
- data/spec/dummy/dummy/FileNotInXcodeProj.h +0 -0
- data/spec/dummy/dummy/ManyFiles.h +13 -0
- data/spec/dummy/dummy/ManyFiles.m +13 -0
- data/spec/dummy/dummy/Wow.h +13 -0
- data/spec/dummy/dummy/Wow.m +13 -0
- data/spec/dummy/dummy/data.json +0 -0
- data/spec/dummy/dummy/dummy-Prefix.pch +9 -0
- data/spec/dummy/dummy/dummy.h +13 -0
- data/spec/dummy/dummy/dummy.m +13 -0
- data/spec/dummy/dummy/image-not-in-xcodeproj.png +0 -0
- data/spec/dummy/dummy/image.png +0 -0
- data/spec/dummy/dummyTests/dummyTests-Info.plist +22 -0
- data/spec/dummy/dummyTests/dummyTests-prefix.pch +15 -0
- data/spec/dummy/dummyTests/dummyTests.m +34 -0
- data/spec/dummy/dummyTests/en.lproj/InfoPlist.strings +2 -0
- data/spec/spec_helper.rb +11 -0
- data/spec/synx/expected_file_structure.yml +44 -0
- data/spec/synx/expected_group_structure.yml +37 -0
- data/spec/synx/project_spec.rb +218 -0
- data/spec/synx/tabber_spec.rb +64 -0
- data/synx.gemspec +33 -0
- metadata +251 -0
@@ -0,0 +1,8 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
3
|
+
<plist version="1.0">
|
4
|
+
<dict>
|
5
|
+
<key>_XCCurrentVersionName</key>
|
6
|
+
<string>Core Data 3.xcdatamodel</string>
|
7
|
+
</dict>
|
8
|
+
</plist>
|
@@ -0,0 +1,4 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
2
|
+
<model userDefinedModelVersionIdentifier="" type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="5064" systemVersion="13C64" minimumToolsVersion="Xcode 4.3" macOSVersion="Automatic" iOSVersion="Automatic">
|
3
|
+
<elements/>
|
4
|
+
</model>
|
@@ -0,0 +1,4 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
2
|
+
<model userDefinedModelVersionIdentifier="" type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="5064" systemVersion="13C64" minimumToolsVersion="Xcode 4.3" macOSVersion="Automatic" iOSVersion="Automatic">
|
3
|
+
<elements/>
|
4
|
+
</model>
|
@@ -0,0 +1,4 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
2
|
+
<model userDefinedModelVersionIdentifier="" type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="5064" systemVersion="13C64" minimumToolsVersion="Xcode 4.3" macOSVersion="Automatic" iOSVersion="Automatic">
|
3
|
+
<elements/>
|
4
|
+
</model>
|
@@ -0,0 +1,4 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
2
|
+
<model userDefinedModelVersionIdentifier="" type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="5064" systemVersion="13C64" minimumToolsVersion="Xcode 4.3" macOSVersion="Automatic" iOSVersion="Automatic">
|
3
|
+
<elements/>
|
4
|
+
</model>
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,22 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
3
|
+
<plist version="1.0">
|
4
|
+
<dict>
|
5
|
+
<key>CFBundleDevelopmentRegion</key>
|
6
|
+
<string>en</string>
|
7
|
+
<key>CFBundleExecutable</key>
|
8
|
+
<string>${EXECUTABLE_NAME}</string>
|
9
|
+
<key>CFBundleIdentifier</key>
|
10
|
+
<string>marklarr.${PRODUCT_NAME:rfc1034identifier}</string>
|
11
|
+
<key>CFBundleInfoDictionaryVersion</key>
|
12
|
+
<string>6.0</string>
|
13
|
+
<key>CFBundlePackageType</key>
|
14
|
+
<string>BNDL</string>
|
15
|
+
<key>CFBundleShortVersionString</key>
|
16
|
+
<string>1.0</string>
|
17
|
+
<key>CFBundleSignature</key>
|
18
|
+
<string>????</string>
|
19
|
+
<key>CFBundleVersion</key>
|
20
|
+
<string>1</string>
|
21
|
+
</dict>
|
22
|
+
</plist>
|
@@ -0,0 +1,15 @@
|
|
1
|
+
//
|
2
|
+
// dummyTests-prefix.pch
|
3
|
+
// dummy
|
4
|
+
//
|
5
|
+
// Created by Mark Larsen on 5/13/14.
|
6
|
+
// Copyright (c) 2014 marklarr. All rights reserved.
|
7
|
+
//
|
8
|
+
|
9
|
+
#ifndef dummy_dummyTests_prefix_pch
|
10
|
+
#define dummy_dummyTests_prefix_pch
|
11
|
+
|
12
|
+
// Include any system framework and library headers here that should be included in all compilation units.
|
13
|
+
// You will also need to set the Prefix Header build setting of one or more of your targets to reference this file.
|
14
|
+
|
15
|
+
#endif
|
@@ -0,0 +1,34 @@
|
|
1
|
+
//
|
2
|
+
// dummyTests.m
|
3
|
+
// dummyTests
|
4
|
+
//
|
5
|
+
// Created by Mark Larsen on 4/27/14.
|
6
|
+
// Copyright (c) 2014 marklarr. All rights reserved.
|
7
|
+
//
|
8
|
+
|
9
|
+
#import <XCTest/XCTest.h>
|
10
|
+
|
11
|
+
@interface dummyTests : XCTestCase
|
12
|
+
|
13
|
+
@end
|
14
|
+
|
15
|
+
@implementation dummyTests
|
16
|
+
|
17
|
+
- (void)setUp
|
18
|
+
{
|
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
|
+
{
|
25
|
+
// Put teardown code here. This method is called after the invocation of each test method in the class.
|
26
|
+
[super tearDown];
|
27
|
+
}
|
28
|
+
|
29
|
+
- (void)testExample
|
30
|
+
{
|
31
|
+
XCTFail(@"No implementation for \"%s\"", __PRETTY_FUNCTION__);
|
32
|
+
}
|
33
|
+
|
34
|
+
@end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
dummy:
|
2
|
+
Resources:
|
3
|
+
image.png:
|
4
|
+
data.json:
|
5
|
+
image-not-in-xcodeproj.png:
|
6
|
+
AlreadySynced:
|
7
|
+
Core Data.xcdatamodeld:
|
8
|
+
Core Data.xcdatamodel:
|
9
|
+
contents:
|
10
|
+
Core Data 2.xcdatamodel:
|
11
|
+
contents:
|
12
|
+
Core Data 3.xcdatamodel:
|
13
|
+
contents:
|
14
|
+
Core Data 4.xcdatamodel:
|
15
|
+
contents:
|
16
|
+
FolderNotInXcodeProj:
|
17
|
+
AnotherFileNotInXcodeProj.h:
|
18
|
+
NSObject+abc.h:
|
19
|
+
NSObject+abc.m:
|
20
|
+
Woot.h:
|
21
|
+
Woot.m:
|
22
|
+
stuff.xml:
|
23
|
+
GroupThatDoubleReferencesFile:
|
24
|
+
ManyFiles.h:
|
25
|
+
ManyFiles.m:
|
26
|
+
Supporting Files:
|
27
|
+
dummy-Prefix.pch:
|
28
|
+
dummy.h:
|
29
|
+
dummy.m:
|
30
|
+
FileNotInXcodeProj.h:
|
31
|
+
SuchGroup:
|
32
|
+
Wow.h:
|
33
|
+
Wow.m:
|
34
|
+
VeryChildGroup:
|
35
|
+
Wowwww.h:
|
36
|
+
Wowwww.m:
|
37
|
+
dummyTests:
|
38
|
+
Other Files:
|
39
|
+
en.lproj:
|
40
|
+
InfoPlist.strings:
|
41
|
+
Supporting Files:
|
42
|
+
dummyTests-Prefix.pch:
|
43
|
+
dummyTests-Info.plist:
|
44
|
+
dummyTests.m:
|
@@ -0,0 +1,37 @@
|
|
1
|
+
dummy:
|
2
|
+
Resources:
|
3
|
+
image.png:
|
4
|
+
AlreadySynced:
|
5
|
+
Core Data.xcdatamodeld:
|
6
|
+
Core Data.xcdatamodel:
|
7
|
+
contents:
|
8
|
+
Core Data 2.xcdatamodel:
|
9
|
+
contents:
|
10
|
+
Core Data 3.xcdatamodel:
|
11
|
+
contents:
|
12
|
+
Core Data 4.xcdatamodel:
|
13
|
+
contents:
|
14
|
+
NSObject+abc.h:
|
15
|
+
NSObject+abc.m:
|
16
|
+
Woot.h:
|
17
|
+
Woot.m:
|
18
|
+
GroupThatDoubleReferencesFile:
|
19
|
+
ManyFiles.h:
|
20
|
+
ManyFiles.m:
|
21
|
+
Supporting Files:
|
22
|
+
dummy-Prefix.pch:
|
23
|
+
dummy.h:
|
24
|
+
dummy.m:
|
25
|
+
SuchGroup:
|
26
|
+
Wow.h:
|
27
|
+
Wow.m:
|
28
|
+
VeryChildGroup:
|
29
|
+
Wowwww.h:
|
30
|
+
Wowwww.m:
|
31
|
+
dummyTests:
|
32
|
+
Other Files:
|
33
|
+
InfoPlist.strings:
|
34
|
+
Supporting Files:
|
35
|
+
dummyTests-Prefix.pch:
|
36
|
+
dummyTests-Info.plist:
|
37
|
+
dummyTests.m:
|
@@ -0,0 +1,218 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', 'spec_helper')
|
2
|
+
|
3
|
+
require 'fileutils'
|
4
|
+
require 'pathname'
|
5
|
+
require 'yaml'
|
6
|
+
|
7
|
+
class Hash
|
8
|
+
# Return a hash that includes everything but the given keys. This is useful for
|
9
|
+
# limiting a set of parameters to everything but a few known toggles:
|
10
|
+
#
|
11
|
+
# @person.update_attributes(params[:person].except(:admin))
|
12
|
+
#
|
13
|
+
# If the receiver responds to +convert_key+, the method is called on each of the
|
14
|
+
# arguments. This allows +except+ to play nice with hashes with indifferent access
|
15
|
+
# for instance:
|
16
|
+
#
|
17
|
+
# {:a => 1}.with_indifferent_access.except(:a) # => {}
|
18
|
+
# {:a => 1}.with_indifferent_access.except("a") # => {}
|
19
|
+
#
|
20
|
+
def except(*keys)
|
21
|
+
dup.except!(*keys)
|
22
|
+
end
|
23
|
+
|
24
|
+
# Replaces the hash without the given keys.
|
25
|
+
def except!(*keys)
|
26
|
+
keys.each { |key| delete(key) }
|
27
|
+
self
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe Synx::Project do
|
32
|
+
|
33
|
+
DUMMY_SYNX_PATH = File.join(File.dirname(__FILE__), '..', 'dummy')
|
34
|
+
DUMMY_SYNX_TEST_PATH = File.join(File.dirname(__FILE__), '..', 'test_dummy')
|
35
|
+
DUMMY_SYNX_TEST_PROJECT_PATH = File.join(DUMMY_SYNX_TEST_PATH, 'dummy.xcodeproj')
|
36
|
+
|
37
|
+
before(:all) do
|
38
|
+
FileUtils.rm_rf(DUMMY_SYNX_TEST_PATH)
|
39
|
+
FileUtils.cp_r(DUMMY_SYNX_PATH, DUMMY_SYNX_TEST_PATH)
|
40
|
+
DUMMY_SYNX_TEST_PROJECT = Synx::Project.open(DUMMY_SYNX_TEST_PROJECT_PATH)
|
41
|
+
end
|
42
|
+
|
43
|
+
describe "#sync" do
|
44
|
+
|
45
|
+
def verify_group_structure(group, expected_structure)
|
46
|
+
expected_structure.each do |object_name, object_children|
|
47
|
+
failure_message = "expected group `#{group.basename}` to have child `#{object_name}`"
|
48
|
+
object = group.children.detect { |child| child.basename == object_name }
|
49
|
+
expect(group).to_not be_nil, failure_message
|
50
|
+
|
51
|
+
if object.instance_of?(Xcodeproj::Project::Object::PBXGroup)
|
52
|
+
object_children ||= {}
|
53
|
+
failure_message = "Expected #{object_name} to have #{object_children.count} children, found #{object.children.count}"
|
54
|
+
expect(object_children.count).to eq(object.children.count), failure_message
|
55
|
+
verify_group_structure(object, object_children) if object_children.count > 0
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def verify_file_structure(dir_pathname, expected_structure)
|
61
|
+
expected_structure.each do |entry_name, entry_entries|
|
62
|
+
entry_pathname = dir_pathname + entry_name
|
63
|
+
expect(File.exist?(entry_pathname) || Dir.exists?(entry_pathname)).to be(true), "Expected #{entry_pathname} to exist"
|
64
|
+
|
65
|
+
if File.directory?(entry_pathname)
|
66
|
+
entry_entries ||= {}
|
67
|
+
# '.' and '..' show up in entries, so add 2
|
68
|
+
failure_message = "Expected #{entry_pathname} to have #{entry_entries.count} children, found #{entry_pathname.entries.count - 2}"
|
69
|
+
expect(entry_entries.count + 2).to eq(entry_pathname.entries.count), failure_message
|
70
|
+
verify_file_structure(entry_pathname, entry_entries) if entry_entries.count > 0
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def expected_file_structure
|
76
|
+
YAML::load_file(File.join(File.dirname(__FILE__), "expected_file_structure.yml"))
|
77
|
+
end
|
78
|
+
|
79
|
+
def expected_group_structure
|
80
|
+
YAML::load_file(File.join(File.dirname(__FILE__), "expected_group_structure.yml"))
|
81
|
+
end
|
82
|
+
|
83
|
+
describe "with no additional options" do
|
84
|
+
|
85
|
+
before(:all) do
|
86
|
+
DUMMY_SYNX_TEST_PROJECT.sync
|
87
|
+
end
|
88
|
+
|
89
|
+
it "should have the correct physical file structure" do
|
90
|
+
verify_file_structure(Pathname(DUMMY_SYNX_TEST_PROJECT_PATH).parent, expected_file_structure)
|
91
|
+
end
|
92
|
+
|
93
|
+
it "should not have modified the Xcode group structure, except for fixing double file references" do
|
94
|
+
verify_group_structure(DUMMY_SYNX_TEST_PROJECT.main_group, expected_group_structure)
|
95
|
+
end
|
96
|
+
|
97
|
+
it "should have updated the pch and info.plist build setting paths" do
|
98
|
+
# dummy target
|
99
|
+
DUMMY_SYNX_TEST_PROJECT.targets.first.each_build_settings do |bs|
|
100
|
+
expect(bs["GCC_PREFIX_HEADER"]).to eq("dummy/Supporting Files/dummy-Prefix.pch")
|
101
|
+
expect(bs["INFOPLIST_FILE"]).to be_nil
|
102
|
+
end
|
103
|
+
|
104
|
+
# dummyTests target
|
105
|
+
DUMMY_SYNX_TEST_PROJECT.targets.last.each_build_settings do |bs|
|
106
|
+
expect(bs["GCC_PREFIX_HEADER"]).to eq("dummyTests/Supporting Files/dummyTests-Prefix.pch")
|
107
|
+
expect(bs["INFOPLIST_FILE"]).to eq("dummyTests/Supporting Files/dummyTests-Info.plist")
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
describe "with the prune option toggled" do
|
113
|
+
|
114
|
+
before(:all) do
|
115
|
+
DUMMY_SYNX_TEST_PROJECT.sync(:prune => true)
|
116
|
+
end
|
117
|
+
|
118
|
+
it "should remove unreferenced images and source files if the prune option is toggled" do
|
119
|
+
expected_file_structure_with_removals = expected_file_structure
|
120
|
+
expected_file_structure_with_removals["dummy"].except!("image-not-in-xcodeproj.png")
|
121
|
+
expected_file_structure_with_removals["dummy"].except!("FileNotInXcodeProj.h")
|
122
|
+
expected_file_structure_with_removals["dummy"]["AlreadySynced"]["FolderNotInXcodeProj"].except!("AnotherFileNotInXcodeProj.h")
|
123
|
+
verify_file_structure(Pathname(DUMMY_SYNX_TEST_PROJECT_PATH).parent, expected_file_structure_with_removals)
|
124
|
+
end
|
125
|
+
|
126
|
+
it "should not have modified the Xcode group structure, except for fixing double file references" do
|
127
|
+
verify_group_structure(DUMMY_SYNX_TEST_PROJECT.main_group, expected_group_structure)
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
describe "with the no_default_exclusions option toggled" do
|
132
|
+
|
133
|
+
before(:all) do
|
134
|
+
DUMMY_SYNX_TEST_PROJECT.sync(:no_default_exclusions => true)
|
135
|
+
end
|
136
|
+
|
137
|
+
it "should have an empty array for default exclusions" do
|
138
|
+
expect(DUMMY_SYNX_TEST_PROJECT.group_exclusions.count).to eq(0)
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
describe "with group_exclusions provided as options" do
|
143
|
+
|
144
|
+
before(:all) do
|
145
|
+
DUMMY_SYNX_TEST_PROJECT.sync(:group_exclusions => %W(/dummy /dummy/SuchGroup/VeryChildGroup))
|
146
|
+
end
|
147
|
+
|
148
|
+
it "should add the group exclusions to the array" do
|
149
|
+
expect(DUMMY_SYNX_TEST_PROJECT.group_exclusions.sort).to eq(%W(/Libraries /Products /Frameworks /dummy /dummy/SuchGroup/VeryChildGroup).sort)
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
end
|
154
|
+
|
155
|
+
describe "group_exclusions=" do
|
156
|
+
|
157
|
+
it "should raise an IndexError if any of the groups do not exist" do
|
158
|
+
expect { DUMMY_SYNX_TEST_PROJECT.group_exclusions = %W(/dummy /dummy/DoesntExist) }.to raise_error(IndexError)
|
159
|
+
end
|
160
|
+
|
161
|
+
it "should be fine if the groups all exist" do
|
162
|
+
group_exclusions = %W(/dummy /dummy/GroupThatDoubleReferencesFile /dummy/SuchGroup/VeryChildGroup)
|
163
|
+
DUMMY_SYNX_TEST_PROJECT.group_exclusions = group_exclusions
|
164
|
+
|
165
|
+
expect(DUMMY_SYNX_TEST_PROJECT.group_exclusions).to eq(group_exclusions)
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
describe "#root_pathname" do
|
170
|
+
|
171
|
+
it "should return the pathname to the directory that the .pbxproj file is inside" do
|
172
|
+
expected = Pathname(File.join(File.dirname(__FILE__), '..', 'test_dummy'))
|
173
|
+
DUMMY_SYNX_TEST_PROJECT.send(:root_pathname).realpath.should eq(expected.realpath)
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
describe "#work_root_pathname" do
|
178
|
+
|
179
|
+
before(:each) { DUMMY_SYNX_TEST_PROJECT.instance_variable_set("@work_root_pathname", nil) }
|
180
|
+
|
181
|
+
it "should return the pathname to the directory synxchronize will do its work in" do
|
182
|
+
expected = Pathname(Synx::Project.const_get(:SYNXRONIZE_DIR)) + "test_dummy"
|
183
|
+
DUMMY_SYNX_TEST_PROJECT.send(:work_root_pathname).realpath.should eq(expected.realpath)
|
184
|
+
end
|
185
|
+
|
186
|
+
it "should start fresh by removing any existing directory at work_root_pathname" do
|
187
|
+
Pathname.any_instance.stub(:exist?).and_return(true)
|
188
|
+
expect(FileUtils).to receive(:rm_rf)
|
189
|
+
|
190
|
+
DUMMY_SYNX_TEST_PROJECT.send(:work_root_pathname)
|
191
|
+
end
|
192
|
+
|
193
|
+
it "should create a directory at work_root_pathname" do
|
194
|
+
expect_any_instance_of(Pathname).to receive(:mkpath)
|
195
|
+
DUMMY_SYNX_TEST_PROJECT.send(:work_root_pathname)
|
196
|
+
end
|
197
|
+
|
198
|
+
it "should be an idempotent operation but return the same value through memoization" do
|
199
|
+
pathname = DUMMY_SYNX_TEST_PROJECT.send(:work_root_pathname)
|
200
|
+
expect(FileUtils).to_not receive(:rm_rf)
|
201
|
+
expect_any_instance_of(Pathname).to_not receive(:exist?)
|
202
|
+
expect_any_instance_of(Pathname).to_not receive(:mkpath)
|
203
|
+
expect(DUMMY_SYNX_TEST_PROJECT.send(:work_root_pathname)).to be(pathname)
|
204
|
+
end
|
205
|
+
end
|
206
|
+
|
207
|
+
describe "#pathname_to_work_pathname" do
|
208
|
+
|
209
|
+
it "should return the path in work_root_pathname that is relatively equivalent to root_pathname" do
|
210
|
+
pathname = DUMMY_SYNX_TEST_PROJECT.send(:root_pathname) + "some" + "path" + "to" + "thing"
|
211
|
+
|
212
|
+
value = DUMMY_SYNX_TEST_PROJECT.send(:pathname_to_work_pathname, pathname)
|
213
|
+
expected = DUMMY_SYNX_TEST_PROJECT.send(:work_root_pathname) + "some" + "path" + "to" + "thing"
|
214
|
+
|
215
|
+
expect(value).to eq(expected)
|
216
|
+
end
|
217
|
+
end
|
218
|
+
end
|