zerg_xcode 0.4.0 → 0.5.0

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.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.4.0
1
+ 0.5.0
@@ -10,34 +10,76 @@ module ZergXcode::Objects
10
10
 
11
11
  # A group of files (shown as a folder) in an Xcode project.
12
12
  class PBXGroup < ZergXcode::XcodeObject
13
- def find_group_named(group_name)
14
- self['children'].each do |child|
15
- if child.isa == :PBXGroup
16
- if child.xref_name == group_name
17
- return child
18
- elsif grandchild = child.find_group_named(group_name)
19
- return grandchild
20
- end
21
- end
13
+
14
+ # call-seq:
15
+ # mkdir(name) aChild
16
+ #
17
+ # Creates a child group with name _name_. Raises Errno::EEXIST if a child
18
+ # with that name already exists.
19
+ def mkdir name
20
+ raise Errno::ENOTNAM if name =~ /\//
21
+ raise Errno::EEXIST if exists? name
22
+ group = ZergXcode::Objects::PBXGroup.new 'name' => name,
23
+ 'path' => name,
24
+ 'children' => [],
25
+ 'sourceTree' => '<group>'
26
+ self.children << group
27
+ group
28
+ end
29
+
30
+ # call-seq:
31
+ # mkdir_f(name) ⇒ aChild
32
+ #
33
+ # If a child with name _name_ already exists, that child is returned;
34
+ # otherwise, a new child group is created and returned.
35
+ def mkdir_f name
36
+ child_with_name(name) || mkdir(name)
37
+ end
38
+
39
+ # call-seq:
40
+ # mkdir_p(path) ⇒ aChild
41
+ #
42
+ # If a child with path _path_ exists, that child is returned; otherwise,
43
+ # groups are created to make the path exist and the deepest group is
44
+ # returned.
45
+ def mkdir_p path
46
+ path_elements(path).inject(self) do |group, path_element|
47
+ group.mkdir_f path_element
22
48
  end
23
- return nil
24
49
  end
25
-
50
+
51
+ # An array of all immediate children of this node
52
+ attr_reader :children
26
53
  def children
27
54
  self['children']
28
55
  end
29
56
 
30
- def create_group(path_name, group_name=nil, source_tree='<group>')
31
- group_name = group_name || path_name
32
- unless group = find_group_named(group_name)
33
- group = ZergXcode::Objects::PBXGroup.new 'name' => group_name,
34
- 'path' => path_name,
35
- 'children' => [],
36
- 'sourceTree' => source_tree
37
- self.children << group
57
+ # If a child exists at the specified path (which may contain slashes), that
58
+ # child is returned. Otherwise, nil is returned.
59
+ def child_with_path path
60
+ path_elements(path).inject(self) do |group, path_element|
61
+ group.child_with_name(path_element) if group
38
62
  end
39
- group
40
63
  end
41
- end # class ZergXcode::Objects::PBXGroup
64
+ alias_method :exist?, :child_with_path
65
+ alias_method :exists?, :child_with_path
66
+
67
+ # If this group has an _immediate_ child with the specified name, it is
68
+ # returned; otherwise, nil is returned.
69
+ def child_with_name name
70
+ children.detect {|child| child.xref_name == name}
71
+ end
72
+
73
+ # :nodoc:
74
+ def to_s
75
+ "PBXGroup<#{xref_name}>"
76
+ end
77
+
78
+ private
79
+ def path_elements path
80
+ path.split('/')
81
+ end
82
+
83
+ end
42
84
 
43
- end # namespace ZergXcode::Objects
85
+ end
@@ -43,10 +43,6 @@ class PBXProject < ZergXcode::XcodeObject
43
43
  isa.to_s
44
44
  end
45
45
 
46
- def find_group_named name
47
- self["mainGroup"].find_group_named name
48
- end
49
-
50
46
  # Container for the visitor that lists all files in a project.
51
47
  module FileVisitor
52
48
  def self.visit(object, root_path, files)
@@ -0,0 +1,134 @@
1
+ require 'zerg_xcode'
2
+
3
+ describe PBXGroup = ZergXcode::Objects::PBXGroup do
4
+ let(:proj) { ZergXcode.load 'spec/fixtures/project.pbxproj' }
5
+ let(:main_group) { proj['mainGroup'] }
6
+
7
+ context "when the meta data says it should be a pbx group" do
8
+ subject { main_group }
9
+ it { should be_a PBXGroup }
10
+ end
11
+
12
+ describe '#mkdir' do
13
+ context 'when the group does not already exist' do
14
+ describe 'the new group' do
15
+ subject { main_group.mkdir 'New Group' }
16
+ it { should_not be_nil }
17
+ it 'should have children' do
18
+ subject.children.should_not be_nil
19
+ end
20
+ it 'should have a "sourceTree" of "<group>"' do
21
+ subject['sourceTree'].should eq "<group>"
22
+ end
23
+ it { should be_found_within main_group }
24
+ end
25
+ end
26
+ context 'when the group already exists' do
27
+ before {main_group.mkdir 'New Group'}
28
+ describe 'the invocation' do
29
+ subject {lambda {main_group.mkdir 'New Group'}}
30
+ it {should raise_error(Errno::EEXIST)}
31
+ end
32
+ end
33
+ context 'using a group name with a slash' do
34
+ describe 'the invocation' do
35
+ subject {lambda {main_group.mkdir 'Foo/Bar'}}
36
+ it {should raise_error(Errno::ENOTNAM)}
37
+ end
38
+ end
39
+ end
40
+
41
+ describe '#mkdir_f' do
42
+ context 'when the group already exists' do
43
+ let(:the_group) {main_group.mkdir 'Foo'}
44
+ subject {main_group.mkdir_f 'Foo'}
45
+ it 'should be that group' do
46
+ should be(the_group)
47
+ end
48
+ end
49
+ context 'when the group does not exist' do
50
+ subject {main_group.mkdir_f 'Foo'}
51
+ it 'should create it' do
52
+ subject.xref_name.should eq 'Foo'
53
+ subject.should be_found_within main_group
54
+ end
55
+ end
56
+ end
57
+
58
+ describe '#mkdir_p' do
59
+ before {main_group.mkdir_p 'Foo/Bar'}
60
+ it 'creates the first part of the path' do
61
+ main_group.exists?('Foo').should be_true
62
+ end
63
+ it 'creates the second part of the path' do
64
+ main_group.exists?('Foo/Bar').should be_true
65
+ end
66
+ context 'when the first part of the path exists' do
67
+ before do
68
+ @first = main_group.mkdir 'First'
69
+ @second = main_group.mkdir_p 'First/Second'
70
+ end
71
+ it 'reuses the first part' do
72
+ @second.should be_found_within @first
73
+ end
74
+ end
75
+ end
76
+
77
+ describe '#child_with_path' do
78
+ context 'with a one-element path' do
79
+ subject {main_group.exists?('Foo')}
80
+ context 'when the element does not exist' do
81
+ it {should be_nil}
82
+ end
83
+
84
+ context 'when the element exists' do
85
+ let(:foo) {main_group.mkdir 'Foo'}
86
+ it 'should be that element' do
87
+ should be(foo)
88
+ end
89
+ end
90
+ end
91
+
92
+ context 'with a multiple element path' do
93
+ subject {main_group.exists?('Foo/Bar/Baz')}
94
+ context 'when no elements of the path exist' do
95
+ it {should be_nil}
96
+ end
97
+ context 'when part of the path exists' do
98
+ before {main_group.mkdir('Foo').mkdir('Bar')}
99
+ it {should be_nil}
100
+ end
101
+ context 'when all of the path exists' do
102
+ let(:last_element) {main_group.mkdir('Foo').mkdir('Bar').mkdir('Baz')}
103
+ it 'should be the last element of that path' do
104
+ should be(last_element)
105
+ end
106
+ end
107
+ end
108
+ end
109
+
110
+ describe '#child_with_name' do
111
+ subject {main_group.child_with_name 'Foo'}
112
+ context 'when the child does not exist' do
113
+ it {should be_nil}
114
+ end
115
+ context 'when the child exists' do
116
+ let(:the_child) {main_group.mkdir 'Foo'}
117
+ it 'should be that child' do
118
+ should be(the_child)
119
+ end
120
+ end
121
+
122
+ end
123
+
124
+ end
125
+
126
+ Rspec::Matchers.define :be_found_within do |expected|
127
+ match do |actual|
128
+ expected.child_with_name(actual.xref_name).equal? actual
129
+ end
130
+ failure_message_for_should do |actual|
131
+ "expected #{expected.xref_name} to be found within #{actual.xref_name}"
132
+ end
133
+ end
134
+
@@ -81,11 +81,4 @@ class PBXProjectTest < Test::Unit::TestCase
81
81
  assert_equal 'PBXProject', project.xref_name
82
82
  end
83
83
 
84
- def test_find_group_named
85
- project = ZergXcode.load('spec/fixtures/project.pbxproj')
86
- found_group = project.find_group_named("Classes")
87
- assert_not_nil found_group
88
- assert_equal PBXGroup, found_group.class
89
- assert_equal "Classes", found_group.xref_name
90
- end
91
84
  end
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "zerg_xcode"
8
- s.version = "0.4.0"
8
+ s.version = "0.5.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Victor Costan"]
12
- s.date = "2012-01-03"
12
+ s.date = "2012-01-12"
13
13
  s.email = "victor@zergling.net"
14
14
  s.executables = ["zerg-xcode"]
15
15
  s.extra_rdoc_files = [
@@ -74,13 +74,13 @@ Gem::Specification.new do |s|
74
74
  "spec/fixtures/project.pbxproj.compat",
75
75
  "spec/id_generator_spec.rb",
76
76
  "spec/lexer_spec.rb",
77
+ "spec/objects/pbx_group_spec.rb",
77
78
  "spec/parser_spec.rb",
78
79
  "spec/paths_spec.rb",
79
80
  "spec/shortcuts_spec.rb",
80
81
  "test/objects/pbx_build_file_test.rb",
81
82
  "test/objects/pbx_build_phase_test.rb",
82
83
  "test/objects/pbx_container_item_proxy_test.rb",
83
- "test/objects/pbx_group_test.rb",
84
84
  "test/objects/pbx_native_target_test.rb",
85
85
  "test/objects/pbx_project_test.rb",
86
86
  "test/objects/pbx_target_dependency_test.rb",
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zerg_xcode
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-01-03 00:00:00.000000000 Z
12
+ date: 2012-01-12 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
16
- requirement: &70360439882840 !ruby/object:Gem::Requirement
16
+ requirement: &70192525123100 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 1.0.0
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *70360439882840
24
+ version_requirements: *70192525123100
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: jeweler
27
- requirement: &70360439895920 !ruby/object:Gem::Requirement
27
+ requirement: &70192525135440 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 1.6.4
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *70360439895920
35
+ version_requirements: *70192525135440
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rcov
38
- requirement: &70360439892000 !ruby/object:Gem::Requirement
38
+ requirement: &70192525132800 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *70360439892000
46
+ version_requirements: *70192525132800
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rspec
49
- requirement: &70360439948260 !ruby/object:Gem::Requirement
49
+ requirement: &70192525144980 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: 2.7.0
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *70360439948260
57
+ version_requirements: *70192525144980
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: flexmock
60
- requirement: &70360439945920 !ruby/object:Gem::Requirement
60
+ requirement: &70192525142780 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,7 +65,7 @@ dependencies:
65
65
  version: '0'
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *70360439945920
68
+ version_requirements: *70192525142780
69
69
  description:
70
70
  email: victor@zergling.net
71
71
  executables:
@@ -132,13 +132,13 @@ files:
132
132
  - spec/fixtures/project.pbxproj.compat
133
133
  - spec/id_generator_spec.rb
134
134
  - spec/lexer_spec.rb
135
+ - spec/objects/pbx_group_spec.rb
135
136
  - spec/parser_spec.rb
136
137
  - spec/paths_spec.rb
137
138
  - spec/shortcuts_spec.rb
138
139
  - test/objects/pbx_build_file_test.rb
139
140
  - test/objects/pbx_build_phase_test.rb
140
141
  - test/objects/pbx_container_item_proxy_test.rb
141
- - test/objects/pbx_group_test.rb
142
142
  - test/objects/pbx_native_target_test.rb
143
143
  - test/objects/pbx_project_test.rb
144
144
  - test/objects/pbx_target_dependency_test.rb
@@ -167,7 +167,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
167
167
  version: '0'
168
168
  segments:
169
169
  - 0
170
- hash: -3299336587567125592
170
+ hash: 4530039425077302079
171
171
  required_rubygems_version: !ruby/object:Gem::Requirement
172
172
  none: false
173
173
  requirements:
@@ -1,44 +0,0 @@
1
- # Author:: Christopher Garrett
2
- # Copyright:: Copyright (C) 2009 Zergling.Net
3
- # License:: MIT
4
-
5
- require 'zerg_xcode'
6
- require 'test/unit'
7
-
8
- class PBXGroupTest < Test::Unit::TestCase
9
- PBXGroup = ZergXcode::Objects::PBXGroup
10
-
11
- def setup
12
- @proj = ZergXcode.load 'spec/fixtures/project.pbxproj'
13
- @main_group = @proj['mainGroup']
14
- end
15
-
16
- def test_instantiation
17
- assert_equal PBXGroup, @main_group.class
18
- end
19
-
20
- def test_find_group_named
21
- found_group = @main_group.find_group_named 'Classes'
22
- assert_not_nil found_group
23
- assert_equal PBXGroup, found_group.class
24
- assert_equal 'Classes', found_group.xref_name
25
- end
26
-
27
- def test_create_group
28
- assert_nil @main_group.find_group_named('Foo'), 'Found inexistent group Foo'
29
-
30
- created_group = @main_group.create_group 'Foo'
31
- assert_not_nil created_group, 'Newly created group Foo'
32
- assert_not_nil created_group.children,
33
- "Newly created group's children attribute"
34
-
35
- new_group = @main_group.find_group_named 'Foo'
36
- assert_not_nil new_group, 'Did not find group Foo after creating it'
37
-
38
- # Should return the existing group if it is already there
39
- assert_operator created_group, :equal?, @main_group.create_group('Foo'),
40
- "create_group should return an existing group if it's there"
41
-
42
- assert_equal "<group>", new_group["sourceTree"]
43
- end
44
- end