Class: XCApp::ProjectCreator

Inherits:
Object
  • Object
show all
Defined in:
lib/xcapp/project_creator.rb

Constant Summary collapse

SUPPORTED_LANGUAGES =
[:swift, :objc]
TEMPLATES_DIR_NAME =
'templates'

Instance Method Summary collapse

Constructor Details

#initializeProjectCreator

Returns a new instance of ProjectCreator.



19
20
21
# File 'lib/xcapp/project_creator.rb', line 19

def initialize
	@templates_folder = File.expand_path('../../' + TEMPLATES_DIR_NAME, __FILE__)
end

Instance Method Details

#add_folder_files_to_project_group(folder, group) ⇒ Object



80
81
82
# File 'lib/xcapp/project_creator.rb', line 80

def add_folder_files_to_project_group folder, group
	Dir.entries(folder).select { |file| !(['.', '..'].include? file) }.map { |file| group.new_file file }
end

#add_references_to_project_group(project_folder, project_group) ⇒ Object



76
77
78
# File 'lib/xcapp/project_creator.rb', line 76

def add_references_to_project_group project_folder, project_group
	add_folder_files_to_project_group project_folder, project_group
end

#copy_template_app_files_to_project(project, project_name, path, language) ⇒ Object



44
45
46
47
48
49
50
51
52
# File 'lib/xcapp/project_creator.rb', line 44

def copy_template_app_files_to_project project, project_name, path, language
	app_group  = project.new_group project_name, project_name
	dest_folder = File.join(path, project_name)

	copy_template_files_to_project :common, :app, dest_folder
	copy_template_files_to_project language, :app, dest_folder

	add_references_to_project_group dest_folder, app_group
end

#copy_template_files(template_source_folder, dest_folder) ⇒ Object



72
73
74
# File 'lib/xcapp/project_creator.rb', line 72

def copy_template_files template_source_folder, dest_folder
	FileUtils.copy_entry template_source_folder, dest_folder, false, false, true
end

#copy_template_files_to_project(language, type, dest_folder) ⇒ Object



64
65
66
67
68
69
70
# File 'lib/xcapp/project_creator.rb', line 64

def copy_template_files_to_project language, type, dest_folder
	raise 'Type is not valid. Available types: :app, :tests.' unless [:app, :tests].include? type
	raise 'Language must be :objc or :swift' unless [:common, :objc, :swift].include? language

	source_folder = "#{@templates_folder}/#{language.to_s}/#{type.to_s}"
	copy_template_files source_folder, dest_folder
end

#copy_template_tests_files_to_project(project, project_name, path, language) ⇒ Object



54
55
56
57
58
59
60
61
62
# File 'lib/xcapp/project_creator.rb', line 54

def copy_template_tests_files_to_project project, project_name, path, language
	tests_group = project.new_group "#{project_name}Tests", "#{project_name}Tests"
	dest_folder = File.join(path, "#{project_name}Tests")

	copy_template_files_to_project :common, :tests, dest_folder
	copy_template_files_to_project language, :tests, dest_folder

	add_references_to_project_group dest_folder, tests_group
end

#create_app_target(project, project_name, language, files) ⇒ Object



84
85
86
87
# File 'lib/xcapp/project_creator.rb', line 84

def create_app_target project, project_name, language, files
	files = files.reject { |file| file.path == "Info.plist" } # Skips Info.plist
	create_project_target project, project_name, :application, language, files
end

#create_default_build_configurations(project) ⇒ Object



100
101
102
# File 'lib/xcapp/project_creator.rb', line 100

def create_default_build_configurations project
	project.add_build_configuration 'Staging', :release
end

#create_default_scheme(project_path, project_name, app_target, test_target) ⇒ Object



112
113
114
115
116
117
118
119
120
# File 'lib/xcapp/project_creator.rb', line 112

def create_default_scheme project_path, project_name, app_target, test_target
	default_scheme = Xcodeproj::XCScheme.new

	default_scheme.add_build_target  app_target
	default_scheme.add_test_target   test_target
	default_scheme.set_launch_target app_target

	default_scheme.save_as project_path, project_name
end

#create_project(name, path, bundle_identifier, language) ⇒ Object



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/xcapp/project_creator.rb', line 23

def create_project name, path, bundle_identifier, language
	raise 'Language must be :objc or :swift' unless ProjectCreator::SUPPORTED_LANGUAGES.include? language

	project_path = File.join(path, "#{name}.xcodeproj")
	project = Xcodeproj::Project.new	project_path

	app_files   = copy_template_app_files_to_project   project, name, path, language
	tests_files = copy_template_tests_files_to_project project, name, path, language

	app_target  = create_app_target  project, name, language, app_files
	test_target = create_test_target project, name, language, tests_files

	create_default_build_configurations project

	set_default_build_settings project, name, bundle_identifier

	project.save

	create_default_scheme project_path, name, app_target, test_target
end

#create_project_target(project, target_name, target_type, language, files) ⇒ Object



93
94
95
96
97
98
# File 'lib/xcapp/project_creator.rb', line 93

def create_project_target project, target_name, target_type, language, files
	target = project.new_target target_type, target_name, :ios, nil, nil, language
	target.add_file_references files

	target
end

#create_test_target(project, project_name, language, files) ⇒ Object



89
90
91
# File 'lib/xcapp/project_creator.rb', line 89

def create_test_target project, project_name, language, files
	create_project_target project, "#{project_name}Tests", :unit_test_bundle, language, files
end

#set_default_build_settings(project, project_name, bundle_identifier) ⇒ Object



104
105
106
107
108
109
110
# File 'lib/xcapp/project_creator.rb', line 104

def set_default_build_settings project, project_name, bundle_identifier
	project.set_common_build_setting 'PRODUCT_BUNDLE_IDENTIFIER', bundle_identifier
	project.set_common_build_setting 'EXECUTABLE_NAME', project_name
	project.set_common_build_setting 'VERSIONING_SYSTEM', 'apple-generic'
	project.set_common_build_setting 'CURRENT_PROJECT_VERSION', '1'
	project.set_common_build_setting 'INFOPLIST_FILE', "$(SRCROOT)/#{project_name}/Info.plist";
end