Module: Xcoed

Defined in:
lib/xcoed.rb,
lib/xcoed/version.rb,
lib/xcoed/constants.rb

Defined Under Namespace

Modules: Constants

Constant Summary collapse

VERSION =
'1.0.0'.freeze

Class Method Summary collapse

Class Method Details

.add_local_swift_package_reference(project, dependency) ⇒ Object



102
103
104
105
106
107
108
109
110
# File 'lib/xcoed.rb', line 102

def self.add_local_swift_package_reference(project, dependency)
  local_packages_group = local_packages_group(project)
  local_packages_group.children
                      .select { |c| File.expand_path(c.path).downcase == dependency['path'].downcase }
                      .each(&:remove_from_project)
  package_ref = Xcodeproj::Project::Object::FileReferencesFactory.new_reference(local_packages_group, dependency['path'], :group)
  package_ref.last_known_file_type = 'folder'
  package_ref
end

.add_remote_swift_package_branch_reference(project, dependency) ⇒ Object



72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/xcoed.rb', line 72

def self.add_remote_swift_package_branch_reference(project, dependency)
  project.root_object.package_references
         .select { |r| r.repositoryURL.downcase == dependency['location'].downcase }
         .each(&:remove_from_project)

  package_ref = Xcodeproj::Project::Object::XCRemoteSwiftPackageReference.new(project, project.generate_uuid)
  package_ref.repositoryURL = dependency['location']
  package_ref.requirement = {
    'kind' => 'branch',
    'branch' => dependency['requirement']['branch'].first
  }
  project.root_object.package_references << package_ref
  package_ref
end

.add_remote_swift_package_range_reference(project, dependency) ⇒ Object



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/xcoed.rb', line 56

def self.add_remote_swift_package_range_reference(project, dependency)
  project.root_object.package_references
         .select { |r| r.repositoryURL.downcase == dependency['location'].downcase }
         .each(&:remove_from_project)

  package_ref = Xcodeproj::Project::Object::XCRemoteSwiftPackageReference.new(project, project.generate_uuid)
  package_ref.repositoryURL = dependency['location']
  package_ref.requirement = {
    'kind' => 'versionRange',
    'minimumVersion' => dependency['requirement']['range'][0]['lowerBound'],
    'maximumVersion' => dependency['requirement']['range'][0]['upperBound']
  }
  project.root_object.package_references << package_ref
  package_ref
end

.add_remote_swift_package_reference(project, dependency) ⇒ Object



41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/xcoed.rb', line 41

def self.add_remote_swift_package_reference(project, dependency)
  STDERR.puts dependency
  requirement_type = dependency['requirement']&.keys&.first
  case requirement_type
  when 'range'
    add_remote_swift_package_range_reference(project, dependency)
  when 'branch'
    add_remote_swift_package_branch_reference(project, dependency)
  when 'revision'
    add_remote_swift_package_revision_reference(project, dependency)
  else
    raise "Unsupported package requirement for dependency: `#{dependency}`"
  end
end

.add_remote_swift_package_revision_reference(project, dependency) ⇒ Object



87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/xcoed.rb', line 87

def self.add_remote_swift_package_revision_reference(project, dependency)
  project.root_object.package_references
         .select { |r| r.repositoryURL.downcase == dependency['location'].downcase }
         .each(&:remove_from_project)

  package_ref = Xcodeproj::Project::Object::XCRemoteSwiftPackageReference.new(project, project.generate_uuid)
  package_ref.repositoryURL = dependency['location']
  package_ref.requirement = {
    'kind' => 'revision',
    'revision' => dependency['requirement']['revision'].first
  }
  project.root_object.package_references << package_ref
  package_ref
end

.integrate_package_swift!(project) ⇒ Object



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/xcoed.rb', line 7

def self.integrate_package_swift!(project)
  package_json = JSON.parse(`swift package dump-package`)

  packages = {}
  package_json['dependencies'].each do |dependency|
    if dependency.key?('local')
      package_ref = add_local_swift_package_reference(project, dependency['local'].first)
    else
      dependency = dependency['scm'].first if dependency.key?('scm')
      package_ref = add_remote_swift_package_reference(project, dependency)
    end
     
    packages[dependency['name']] = package_ref
  end

  package_json['targets'].each do |target|
    target_ref = project.targets.select { |t| t.name == target['name'] }.first
    raise "Target `#{target['name']}` not found in project" if target_ref.nil?

    target['dependencies'].each do |dependency|
      by_name = dependency['byName'].first

      target_ref.package_product_dependencies
                .select { |p| p.product_name == by_name }
                .each(&:remove_from_project)

      package_dep = Xcodeproj::Project::Object::XCSwiftPackageProductDependency.new(project, project.generate_uuid)
      package_dep.product_name = by_name

      target_ref.package_product_dependencies << package_dep
    end
  end
end

.local_packages_group(project) ⇒ Object



112
113
114
115
116
# File 'lib/xcoed.rb', line 112

def self.local_packages_group(project)
  name = 'Local Packages'
  project.main_group.groups.select { |g| g.name == name }.first ||
    project.main_group.new_group(name)
end