libObjCAttr/Resources/ROADConfigurator.rb (145 lines of code) (raw):
require 'xcodeproj'
class ROADConfigurator
def self.post_install(installer, config_path = './ROADConfigurator.yml')
if File.exists?(config_path)
@@config = YAML::load(File.open(config_path))
end
ROADConfigurator::modify_user_project(installer)
end
def self.modify_user_project(installer)
ROADConfigurator::remove_configurator_from_project(installer.pods_project)
ROADConfigurator::remove_generator_from_project(installer.pods_project)
installer.analysis_result.targets.each do |target|
libObjCAttrPod = false
target.pod_targets.each do |pod_target|
if pod_target.pod_name == 'libObjCAttr'
libObjCAttrPod = true
end
end
if !libObjCAttrPod
next
end
if target.user_project_path.exist? && target.user_target_uuids.any?
user_project = Xcodeproj::Project.open(target.user_project_path)
user_project_dir = File.dirname(user_project.path)
user_targets = Array.new
target.user_target_uuids.each do |user_target_uuid|
user_target = get_target_from_project_by_uuid(user_project, user_target_uuid)
if not user_target.nil?
user_targets.push(user_target)
genereted_attributes_path = "#{user_project_dir}/#{user_target.name}/ROADGeneratedAttributes"
generated_attributes_file_path = ROADConfigurator::create_path_for_generated_attributes_file_for_folder_path(genereted_attributes_path)
# if 'ROADGeneratedAttribute.m' does not exist
if !File.exists?(generated_attributes_file_path)
ROADConfigurator::create_generated_attributes_folder_and_file_for_path(genereted_attributes_path, generated_attributes_file_path)
end
gen_attr_absolute_path = Pathname.new(user_project_dir + create_path_for_generated_attributes_file_for_folder_path("/#{user_target.name}/ROADGeneratedAttributes"))
# file have not been added to project
attributes_file_reference = user_project.reference_for_path(gen_attr_absolute_path)
if !attributes_file_reference
attributes_file_reference = user_project.new_file(generated_attributes_file_path)
user_target.source_build_phase.add_file_reference(attributes_file_reference)
else
# if not added to compile build phase
if !user_target.source_build_phase.include?(attributes_file_reference)
user_target.source_build_phase.add_file_reference(attributes_file_reference)
end
end
end
end
run_script_user = "\"${PODS_ROOT}/libObjCAttr/tools/binaries/ROADAttributesCodeGenerator\""\
" -src=\"${SRCROOT}/${TARGET_NAME}\" -src=\"${PODS_ROOT}\""
if defined? @@config
if @@config['source']
attr_source = @@config['source']
if attr_source.respond_to?("each")
attr_source.each do |attr_source_dir|
run_script_user += " -src=#{attr_source_dir}"
end
else
run_script_user += " -src=#{attr_source}"
end
end
if @@config['define_file']
attr_def_file = @@config['define_file']
if attr_def_file.respond_to?("each")
attr_def_file.each do |attr_def_file_path|
run_script_user += " -def_file=#{attr_def_file_path}"
end
else
run_script_user += " -def_file=#{attr_def_file}"
end
end
if @@config['exclude']
exclude_arg = @@config['exclude']
if exclude_arg.respond_to?("each")
exclude_arg.each do |exclude_pattern|
run_script_user += " -e=#{exclude_pattern}"
end
else
run_script_user += " -e=#{exclude_arg}"
end
end
end
run_script_user += " -dst=\"${SRCROOT}/${TARGET_NAME}/ROADGeneratedAttributes/\""
ROADConfigurator::add_script_to_project_targets(run_script_user, 'libObjCAttr - generate attributes', user_project, user_targets)
end
end
end
def self.get_target_from_project_by_uuid(project, uuid)
project.targets.each do |project_target|
if project_target.uuid.eql? uuid
return project_target
end
end
return nil
end
def self.create_path_for_generated_attributes_file_for_folder_path(path)
generated_attributes_file_path = "#{path}/ROADGeneratedAttribute.m"
generated_attributes_file_path
end
def self.create_generated_attributes_folder_and_file_for_path(path, generated_attributes_file_path)
if !File.exists?(generated_attributes_file_path)
FileUtils.mkdir_p(path)
puts "create: #{generated_attributes_file_path}"
File.new(generated_attributes_file_path, 'w+').close
end
end
def self.create_generated_attributes_for_path(path)
generated_attributes_file_path = ROADConfigurator::create_path_for_generated_attributes_file_for_folder_path(path)
ROADConfigurator::create_generated_attributes_folder_and_file_for_path(path, generated_attributes_file_path)
generated_attributes_file_path
end
def self.add_script_to_project_targets(script, script_name, project, targets)
targets.each do |target|
phase = project.new(Xcodeproj::Project::PBXShellScriptBuildPhase)
phase.name = script_name
phase.shell_script = script
target.build_phases.each do |build_phase|
# Removing old version phase too
if build_phase.display_name == script_name || build_phase.display_name == 'ROAD - generate attributes'
build_phase.remove_from_project
break
end
end
target.build_phases.insert(0, phase)
end
project.save
end
def self.remove_configurator_from_project(project)
path = project.path
pod_path = File.dirname(path)
configurator_path = "#{pod_path}/libObjCAttr/libObjCAttr/Resources/ROADConfigurator.rb"
reference_for_path = project.reference_for_path(configurator_path)
if !reference_for_path.nil?
reference_for_path.remove_from_project()
end
project.save;
end
def self.remove_generator_from_project(project)
path = project.path
pod_path = File.dirname(path)
generator_path = "#{pod_path}/libObjCAttr/tools/binaries/ROADAttributesCodeGenerator"
reference_for_path = project.reference_for_path(generator_path)
if !reference_for_path.nil?
reference_for_path.remove_from_project()
end
project.save;
end
end