xcodeproj 0.3.5 → 0.4.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/xcodeproj +13 -0
- data/lib/xcodeproj.rb +13 -1
- data/lib/xcodeproj/command.rb +131 -0
- data/lib/xcodeproj/command/project_diff.rb +53 -0
- data/lib/xcodeproj/command/show.rb +35 -0
- data/lib/xcodeproj/command/target_diff.rb +43 -0
- data/lib/xcodeproj/config.rb +66 -38
- data/lib/xcodeproj/constants.rb +146 -0
- data/lib/xcodeproj/helper.rb +28 -0
- data/lib/xcodeproj/project.rb +462 -156
- data/lib/xcodeproj/project/object.rb +251 -138
- data/lib/xcodeproj/project/object/build_configuration.rb +27 -0
- data/lib/xcodeproj/project/object/build_file.rb +26 -0
- data/lib/xcodeproj/project/object/build_phase.rb +132 -61
- data/lib/xcodeproj/project/object/build_rule.rb +46 -0
- data/lib/xcodeproj/project/object/configuration_list.rb +47 -0
- data/lib/xcodeproj/project/object/container_item_proxy.rb +49 -0
- data/lib/xcodeproj/project/object/file_reference.rb +80 -48
- data/lib/xcodeproj/project/object/group.rb +213 -89
- data/lib/xcodeproj/project/object/native_target.rb +171 -114
- data/lib/xcodeproj/project/object/root_object.rb +66 -0
- data/lib/xcodeproj/project/object/target_dependency.rb +23 -0
- data/lib/xcodeproj/project/object_attributes.rb +382 -0
- data/lib/xcodeproj/project/object_list.rb +64 -118
- data/lib/xcodeproj/project/recursive_diff.rb +116 -0
- data/lib/xcodeproj/workspace.rb +56 -2
- metadata +38 -10
- data/lib/xcodeproj/project/association.rb +0 -54
- data/lib/xcodeproj/project/association/has_many.rb +0 -51
- data/lib/xcodeproj/project/association/has_one.rb +0 -39
- data/lib/xcodeproj/project/association/reflection.rb +0 -86
- data/lib/xcodeproj/project/object/configuration.rb +0 -97
@@ -1,54 +0,0 @@
|
|
1
|
-
require 'xcodeproj/project/association/has_many'
|
2
|
-
require 'xcodeproj/project/association/has_one'
|
3
|
-
require 'xcodeproj/project/association/reflection'
|
4
|
-
|
5
|
-
module Xcodeproj
|
6
|
-
class Project
|
7
|
-
module Object
|
8
|
-
|
9
|
-
class AbstractPBXObject
|
10
|
-
class << self
|
11
|
-
def has_many(plural_attr_name, options = {}, &block)
|
12
|
-
create_association(:has_many, plural_attr_name, options, &block)
|
13
|
-
end
|
14
|
-
|
15
|
-
def has_one(singular_attr_name, options = {})
|
16
|
-
create_association(:has_one, singular_attr_name, options)
|
17
|
-
end
|
18
|
-
|
19
|
-
private
|
20
|
-
|
21
|
-
def create_association(type, name, options, &block)
|
22
|
-
reflection = create_reflection(type, name, options)
|
23
|
-
unless reflection.inverse?
|
24
|
-
attribute(reflection.attribute_name, :as => reflection.attribute_getter)
|
25
|
-
end
|
26
|
-
define_method(reflection.getter) do
|
27
|
-
reflection.association_for(self, &block).get
|
28
|
-
end
|
29
|
-
define_method(reflection.setter) do |new_value|
|
30
|
-
reflection.association_for(self, &block).set(new_value)
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
class Association
|
37
|
-
attr_reader :owner, :reflection
|
38
|
-
|
39
|
-
def initialize(owner, reflection, &block)
|
40
|
-
@owner, @reflection, @block = owner, reflection, block
|
41
|
-
end
|
42
|
-
|
43
|
-
def get
|
44
|
-
@reflection.inverse? ? inverse_get : direct_get
|
45
|
-
end
|
46
|
-
|
47
|
-
def set(value)
|
48
|
-
@reflection.inverse? ? inverse_set(value) : direct_set(value)
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
@@ -1,51 +0,0 @@
|
|
1
|
-
module Xcodeproj
|
2
|
-
class Project
|
3
|
-
module Object
|
4
|
-
class Association
|
5
|
-
|
6
|
-
class HasMany < Association
|
7
|
-
def direct_get
|
8
|
-
uuids = @owner.send(@reflection.attribute_getter)
|
9
|
-
if @block
|
10
|
-
# Evaluate the block, which was specified at the class level, in
|
11
|
-
# the instance’s context.
|
12
|
-
@owner.list_by_class(uuids, @reflection.klass) do |list|
|
13
|
-
list.let(:push) do |new_object|
|
14
|
-
@owner.instance_exec(new_object, &@block)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
else
|
18
|
-
@owner.list_by_class(uuids, @reflection.klass)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
def inverse_get
|
23
|
-
PBXObjectList.new(@reflection.klass, @owner.project) do |list|
|
24
|
-
list.let(:uuid_scope) do
|
25
|
-
@owner.project.objects.list_by_class(@reflection.klass).select do |object|
|
26
|
-
object.send(@reflection.inverse.attribute_getter) == @owner.uuid
|
27
|
-
end.map(&:uuid)
|
28
|
-
end
|
29
|
-
list.let(:push) do |new_object|
|
30
|
-
new_object.send(@reflection.inverse.attribute_setter, @owner.uuid)
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
# @todo Currently this does not call the @block, which means that
|
36
|
-
# in theory (like with a group's children) the object stays
|
37
|
-
# asociated with its old group.
|
38
|
-
def direct_set(list)
|
39
|
-
@owner.send(@reflection.attribute_setter, list.map(&:uuid))
|
40
|
-
end
|
41
|
-
|
42
|
-
def inverse_set(list)
|
43
|
-
raise NotImplementedError
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
@@ -1,39 +0,0 @@
|
|
1
|
-
module Xcodeproj
|
2
|
-
class Project
|
3
|
-
module Object
|
4
|
-
class Association
|
5
|
-
|
6
|
-
# @todo Does this need 'new object'-callback support too?
|
7
|
-
class HasOne < Association
|
8
|
-
def direct_get
|
9
|
-
@owner.project.objects[@owner.send(@reflection.attribute_getter)]
|
10
|
-
end
|
11
|
-
|
12
|
-
def inverse_get
|
13
|
-
# Loop over all objects of the class and find the one that includes
|
14
|
-
# this object in the specified uuid list.
|
15
|
-
@owner.project.objects.list_by_class(@reflection.klass).find do |object|
|
16
|
-
object.send(@reflection.inverse.attribute_getter).include?(@owner.uuid)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
def direct_set(object)
|
21
|
-
@owner.send(@reflection.attribute_setter, object.uuid)
|
22
|
-
end
|
23
|
-
|
24
|
-
def inverse_set(object)
|
25
|
-
# Remove this object from the uuid list of the target
|
26
|
-
# that this object was associated to.
|
27
|
-
if previous = @owner.send(@reflection.name)
|
28
|
-
previous.send(@reflection.inverse.attribute_getter).delete(@owner.uuid)
|
29
|
-
end
|
30
|
-
# Now assign this object to the new object
|
31
|
-
object.send(@reflection.inverse.attribute_getter) << @owner.uuid if object
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
@@ -1,86 +0,0 @@
|
|
1
|
-
module Xcodeproj
|
2
|
-
class Project
|
3
|
-
module Object
|
4
|
-
|
5
|
-
class AbstractPBXObject
|
6
|
-
def self.reflections
|
7
|
-
@reflections ||= []
|
8
|
-
end
|
9
|
-
|
10
|
-
def self.create_reflection(type, name, options)
|
11
|
-
(reflections << Association::Reflection.new(type, name, options)).last
|
12
|
-
end
|
13
|
-
|
14
|
-
def self.reflection(name)
|
15
|
-
reflections.find { |r| r.name.to_s == name.to_s }
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
class Association
|
20
|
-
class Reflection
|
21
|
-
def initialize(type, name, options)
|
22
|
-
@type, @name, @options = type, name.to_s, options
|
23
|
-
end
|
24
|
-
|
25
|
-
attr_reader :type, :name, :options
|
26
|
-
|
27
|
-
def klass
|
28
|
-
@options[:class] ||= begin
|
29
|
-
name = "PBX#{@name.classify}"
|
30
|
-
name = "XC#{@name.classify}" unless Xcodeproj::Project::Object.const_defined?(name)
|
31
|
-
Xcodeproj::Project::Object.const_get(name)
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
def inverse
|
36
|
-
klass.reflection(@options[:inverse_of])
|
37
|
-
end
|
38
|
-
|
39
|
-
def inverse?
|
40
|
-
!!@options[:inverse_of]
|
41
|
-
end
|
42
|
-
|
43
|
-
def attribute_name
|
44
|
-
(@options[:uuid] || @options[:uuids] || @name).to_sym
|
45
|
-
end
|
46
|
-
|
47
|
-
def attribute_getter
|
48
|
-
case type
|
49
|
-
when :has_many
|
50
|
-
uuid_method_name.pluralize
|
51
|
-
when :has_one
|
52
|
-
uuid_method_name
|
53
|
-
end.to_sym
|
54
|
-
end
|
55
|
-
|
56
|
-
def attribute_setter
|
57
|
-
"#{attribute_getter}=".to_sym
|
58
|
-
end
|
59
|
-
|
60
|
-
def getter
|
61
|
-
@name.to_sym
|
62
|
-
end
|
63
|
-
|
64
|
-
def setter
|
65
|
-
"#{@name}=".to_sym
|
66
|
-
end
|
67
|
-
|
68
|
-
def association_for(owner, &block)
|
69
|
-
case type
|
70
|
-
when :has_many then Association::HasMany
|
71
|
-
when :has_one then Association::HasOne
|
72
|
-
end.new(owner, self, &block)
|
73
|
-
end
|
74
|
-
|
75
|
-
private
|
76
|
-
|
77
|
-
def uuid_method_name
|
78
|
-
(@options[:uuids_as] || @options[:uuid] || @options[:uuids] || "#{@name.singularize}_reference").to_s.singularize
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
end
|
83
|
-
|
84
|
-
end
|
85
|
-
end
|
86
|
-
end
|
@@ -1,97 +0,0 @@
|
|
1
|
-
module Xcodeproj
|
2
|
-
class Project
|
3
|
-
module Object
|
4
|
-
|
5
|
-
class XCBuildConfiguration < AbstractPBXObject
|
6
|
-
COMMON_BUILD_SETTINGS = {
|
7
|
-
:all => {
|
8
|
-
'GCC_VERSION' => 'com.apple.compilers.llvm.clang.1_0',
|
9
|
-
'GCC_PRECOMPILE_PREFIX_HEADER' => 'YES',
|
10
|
-
'PRODUCT_NAME' => '$(TARGET_NAME)',
|
11
|
-
'SKIP_INSTALL' => 'YES',
|
12
|
-
'DSTROOT' => '/tmp/xcodeproj.dst',
|
13
|
-
'ALWAYS_SEARCH_USER_PATHS' => 'NO',
|
14
|
-
'GCC_C_LANGUAGE_STANDARD' => 'gnu99',
|
15
|
-
'INSTALL_PATH' => "$(BUILT_PRODUCTS_DIR)",
|
16
|
-
'OTHER_LDFLAGS' => '',
|
17
|
-
'COPY_PHASE_STRIP' => 'YES',
|
18
|
-
}.freeze,
|
19
|
-
:debug => {
|
20
|
-
'GCC_DYNAMIC_NO_PIC' => 'NO',
|
21
|
-
'GCC_PREPROCESSOR_DEFINITIONS' => ["DEBUG=1", "$(inherited)"],
|
22
|
-
'GCC_SYMBOLS_PRIVATE_EXTERN' => 'NO',
|
23
|
-
'GCC_OPTIMIZATION_LEVEL' => '0',
|
24
|
-
'COPY_PHASE_STRIP' => 'NO',
|
25
|
-
}.freeze,
|
26
|
-
:ios => {
|
27
|
-
'ARCHS' => "$(ARCHS_STANDARD_32_BIT)",
|
28
|
-
'IPHONEOS_DEPLOYMENT_TARGET' => '4.3',
|
29
|
-
'PUBLIC_HEADERS_FOLDER_PATH' => "$(TARGET_NAME)",
|
30
|
-
'SDKROOT' => 'iphoneos',
|
31
|
-
}.freeze,
|
32
|
-
:osx => {
|
33
|
-
'ARCHS' => "$(ARCHS_STANDARD_64_BIT)",
|
34
|
-
'GCC_ENABLE_OBJC_EXCEPTIONS' => 'YES',
|
35
|
-
'GCC_VERSION' => 'com.apple.compilers.llvm.clang.1_0',
|
36
|
-
'MACOSX_DEPLOYMENT_TARGET' => '10.7',
|
37
|
-
'SDKROOT' => 'macosx',
|
38
|
-
'COMBINE_HIDPI_IMAGES' => 'YES',
|
39
|
-
}.freeze,
|
40
|
-
[:osx, :debug] => {
|
41
|
-
'ONLY_ACTIVE_ARCH' => 'YES',
|
42
|
-
}.freeze,
|
43
|
-
[:osx, :release] => {
|
44
|
-
'DEBUG_INFORMATION_FORMAT' => 'dwarf-with-dsym',
|
45
|
-
}.freeze,
|
46
|
-
[:ios, :release] => {
|
47
|
-
'VALIDATE_PRODUCT' => 'YES',
|
48
|
-
}.freeze,
|
49
|
-
}.freeze
|
50
|
-
|
51
|
-
def self.new_release(project)
|
52
|
-
new(project, nil,
|
53
|
-
'name' => 'Release',
|
54
|
-
'buildSettings' => COMMON_BUILD_SETTINGS[:all].dup
|
55
|
-
)
|
56
|
-
end
|
57
|
-
|
58
|
-
def self.new_debug(project)
|
59
|
-
new(project, nil,
|
60
|
-
'name' => 'Debug',
|
61
|
-
'buildSettings' => COMMON_BUILD_SETTINGS[:all].merge(COMMON_BUILD_SETTINGS[:debug])
|
62
|
-
)
|
63
|
-
end
|
64
|
-
|
65
|
-
# [Hash] the build settings used when building a target
|
66
|
-
attribute :build_settings
|
67
|
-
|
68
|
-
# TODO why do I need to specify the uuid here?
|
69
|
-
has_one :base_configuration, :uuid => :base_configuration_reference
|
70
|
-
|
71
|
-
def initialize(*)
|
72
|
-
super
|
73
|
-
self.build_settings ||= {}
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
class XCConfigurationList < AbstractPBXObject
|
78
|
-
attribute :default_configuration_is_visible
|
79
|
-
attribute :default_configuration_name
|
80
|
-
|
81
|
-
has_many :build_configurations
|
82
|
-
|
83
|
-
def initialize(*)
|
84
|
-
super
|
85
|
-
self.build_configuration_references ||= []
|
86
|
-
end
|
87
|
-
|
88
|
-
def build_settings(build_configuration_name)
|
89
|
-
if config = build_configurations.where(:name => build_configuration_name)
|
90
|
-
config.build_settings
|
91
|
-
end
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
end
|
96
|
-
end
|
97
|
-
end
|