cocoapods-spm 0.0.4 → 0.1.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7d90d3841df89cb8d7eb74c8ad184992ae08ec0ed58581827bae94fecdbb9d71
4
- data.tar.gz: 90220d0a9b57102775d8819e972098f5d43a8ddb367e091f1963fe24fead0232
3
+ metadata.gz: b31c9b35087187bc68aa7537abeb5fec4fb45e496c767382b8b8300ebadebf30
4
+ data.tar.gz: fa9dcb1a770f7aeb42db04739bc81ae9ff52c9e0fffe0368e7769f36e1b99977
5
5
  SHA512:
6
- metadata.gz: e67677e877f86e94e159630506ab0638429f374cb2aeed940630db7c0b05450ac40cc23fc21868caeef91be9c2c5feed11b61d4e1d2d2f23383da6329d3a1f7c
7
- data.tar.gz: cb91b35ceff530f2b475ab25a5a645cc4e9622401de79064cf0841403135c83aa440265803b7c9520931dd37d18745be7a9dcda7f030a6cfdc36000d79f30279
6
+ metadata.gz: e644e4b8ba131f6eac0694ee25548e85f0782fadc794d68c944a18c969671f175aa14baaa0928b31cbbdbea0a8b3e14cd8ca01fb78022d8b4db1a66f676758e7
7
+ data.tar.gz: ea77387bf7c1e8ecb35fc00693450d0456b3535490561c4012397ab347127381719038d3ce6de88b529ba3966645d40d9d42adc8e5481763006f731f0c4e82d2
@@ -8,11 +8,28 @@ module Pod
8
8
 
9
9
  def initialize(name, options = {})
10
10
  @name = name
11
- @options = options
12
- @requirement = requirement_from(options)
13
- @url = options[:url]
14
- @relative_path = options[:relative_path]
11
+ @_options = options
12
+ @relative_path = nil
13
+ @linkage = nil
14
+ @url = nil
15
+ @requirement = nil
16
+ parse_options(options)
17
+ end
18
+
19
+ def parse_options(options)
20
+ @url = options[:url] || options[:git]
15
21
  @linkage = options[:linkage]
22
+ @relative_path = relative_path_from(options)
23
+ @requirement = requirement_from(options)
24
+ end
25
+
26
+ def relative_path_from(options)
27
+ if (relative_path = options[:relative_path])
28
+ relative_path
29
+ elsif (path = options[:path])
30
+ path = Pathname(path).expand_path
31
+ path.relative_path_from(File.absolute_path("Pods")).to_s
32
+ end
16
33
  end
17
34
 
18
35
  def inspect
@@ -24,7 +41,7 @@ module Pod
24
41
  end
25
42
 
26
43
  def to_dependencies
27
- if (products = @options[:products])
44
+ if (products = @_options[:products])
28
45
  products.map { |product| Dependency.new(@name, product: product, pkg: self) }
29
46
  else
30
47
  [Dependency.new(@name, pkg: self)]
@@ -47,16 +64,16 @@ module Pod
47
64
  private
48
65
 
49
66
  def requirement_from(options)
50
- if options[:requirement]
51
- options[:requirement]
52
- elsif (version = options.delete(:version))
67
+ return if @relative_path
68
+
69
+ if (requirement = options[:requirement])
70
+ requirement
71
+ elsif (version = options.delete(:version) || options.delete(:tag))
53
72
  { :kind => "exactVersion", :version => version }
54
73
  elsif (branch = options.delete(:branch))
55
74
  { :kind => "branch", :branch => branch }
56
75
  elsif (revision = options.delete(:commit))
57
76
  { :kind => "revision", :revision => revision }
58
- elsif options[:relative_path]
59
- nil
60
77
  else
61
78
  raise "Missing requirement for SPM package: #{name}"
62
79
  end
@@ -0,0 +1,9 @@
1
+ module Pod
2
+ module SPM
3
+ module Executables
4
+ extend Executable
5
+
6
+ executable :swift
7
+ end
8
+ end
9
+ end
@@ -45,8 +45,9 @@ module Pod
45
45
  require f
46
46
  id = File.basename(f, ".*")
47
47
  cls_name = "Pod::SPM::Hook::#{id.camelize}"
48
- UI.message "Running hook: #{cls_name}"
49
- cls_name.constantize.new(context, options).run
48
+ UI.message "- Running hook: #{cls_name}" do
49
+ cls_name.constantize.new(context, options).run
50
+ end
50
51
  end
51
52
  end
52
53
 
@@ -61,6 +62,9 @@ module Pod
61
62
  hash = update.call(target, setting, config)
62
63
  setting.xcconfig.merge!(hash)
63
64
  setting.generate.merge!(hash)
65
+ Installer::Xcode::PodsProjectGenerator::TargetInstallerHelper.update_changed_file(
66
+ setting, target.xcconfig_path(config)
67
+ )
64
68
  end
65
69
 
66
70
  pod_targets.each do |target|
@@ -32,7 +32,7 @@ module Pod
32
32
  end
33
33
 
34
34
  def update_other_swift_flags
35
- return unless spm_config.macros
35
+ return if spm_config.all_macros.empty?
36
36
 
37
37
  # For prebuilt macros
38
38
  perform_settings_update(
@@ -43,7 +43,7 @@ module Pod
43
43
  end
44
44
 
45
45
  def update_linker_flags
46
- return unless @spm_analyzer.spm_pkgs
46
+ return if @spm_analyzer.spm_pkgs.empty?
47
47
 
48
48
  # For packages to work in the main target
49
49
  perform_settings_update(
@@ -65,7 +65,7 @@ module Pod
65
65
  end
66
66
 
67
67
  def update_swift_include_paths
68
- return unless @spm_analyzer.spm_pkgs
68
+ return if @spm_analyzer.spm_pkgs.empty?
69
69
 
70
70
  # For macro packages
71
71
  perform_settings_update(
@@ -1,11 +1,13 @@
1
+ require "cocoapods-spm/installer/validator"
2
+
1
3
  module Pod
2
4
  class Installer
3
5
  class SPMAnalyzer
4
6
  attr_reader :spm_pkgs, :spm_dependencies_by_target
5
7
 
6
- def initialize(podfile, umbrella_targets)
8
+ def initialize(podfile, aggregate_targets)
7
9
  @podfile = podfile
8
- @umbrella_targets = umbrella_targets
10
+ @aggregate_targets = aggregate_targets
9
11
  @spm_pkgs = []
10
12
  @spm_dependencies_by_target = {}
11
13
  end
@@ -13,6 +15,7 @@ module Pod
13
15
  def analyze
14
16
  analyze_spm_pkgs
15
17
  analyze_spm_dependencies_by_target
18
+ validate!
16
19
  end
17
20
 
18
21
  def spm_dependencies_for(target)
@@ -27,19 +30,19 @@ module Pod
27
30
 
28
31
  def analyze_spm_dependencies_by_target
29
32
  analyze_dependencies_for_targets
30
- analyze_dependencies_for_umbrella_targets
33
+ analyze_dependencies_for_aggregate_targets
31
34
  @spm_dependencies_by_target.values.flatten.each { |d| d.pkg = spm_pkg_for(d.name) }
32
35
  end
33
36
 
34
37
  def analyze_dependencies_for_targets
35
- specs = @umbrella_targets.flat_map(&:specs).uniq
38
+ specs = @aggregate_targets.flat_map(&:specs).uniq
36
39
  specs.each do |spec|
37
40
  @spm_dependencies_by_target[spec.name] = spec.spm_dependencies
38
41
  end
39
42
  end
40
43
 
41
- def analyze_dependencies_for_umbrella_targets
42
- @umbrella_targets.each do |target|
44
+ def analyze_dependencies_for_aggregate_targets
45
+ @aggregate_targets.each do |target|
43
46
  spm_dependencies = target.specs.flat_map(&:spm_dependencies)
44
47
  @spm_dependencies_by_target[target.to_s] = merge_spm_dependencies(spm_dependencies)
45
48
  end
@@ -64,6 +67,11 @@ module Pod
64
67
  @_spm_pkgs_by_name ||= @spm_pkgs.to_h { |pkg| [pkg.name, pkg] }
65
68
  @_spm_pkgs_by_name[name]
66
69
  end
70
+
71
+ def validate!
72
+ validator = SPMValidator.new(@aggregate_targets, @spm_pkgs, @spm_dependencies_by_target)
73
+ validator.validate!
74
+ end
67
75
  end
68
76
  end
69
77
  end
@@ -0,0 +1,32 @@
1
+ module Pod
2
+ class Installer
3
+ class SPMValidator
4
+ def initialize(aggregate_targets, spm_pkgs, spm_dependencies_by_target)
5
+ @aggregate_targets = aggregate_targets
6
+ @spm_pkgs = spm_pkgs
7
+ @spm_dependencies_by_target = spm_dependencies_by_target
8
+ end
9
+
10
+ def validate!
11
+ verify_no_missing_pkgs
12
+ end
13
+
14
+ private
15
+
16
+ def dependents_of_pkg(name)
17
+ @specs ||= @aggregate_targets.flat_map(&:specs).uniq
18
+ @specs.select { |s| s.spm_dependencies.any? { |d| d.name == name } }.map(&:name)
19
+ end
20
+
21
+ def verify_no_missing_pkgs
22
+ missing_pkgs = @spm_dependencies_by_target.values.flatten.select { |d| d.pkg.nil? }.map(&:name).uniq
23
+ return if missing_pkgs.empty?
24
+
25
+ messages = ["The following packages were not declared in Podfile:"]
26
+ messages += missing_pkgs.map { |pkg| " • #{pkg}: used by #{dependents_of_pkg(pkg).join(', ')}" }
27
+ messages << "Use the `spm_pkg` method to declare those packages in Podfile."
28
+ raise Informative, messages.join("\n")
29
+ end
30
+ end
31
+ end
32
+ end
@@ -4,6 +4,7 @@ module Pod
4
4
  module SPM
5
5
  class MacroPrebuilder
6
6
  include Config::Mixin
7
+ include Executables
7
8
 
8
9
  attr_reader :name
9
10
 
@@ -36,12 +37,13 @@ module Pod
36
37
  raise "Package.swift not exist in #{macro_downloaded_dir}" \
37
38
  unless (macro_downloaded_dir / "Package.swift").exist?
38
39
 
39
- cmd =
40
- "cd #{macro_downloaded_dir} " \
41
- "&& swift package dump-package " \
42
- "> #{metadata_path.relative_path_from(macro_downloaded_dir)}"
43
- `#{cmd}`
44
- @metadata = Metadata.from_file(metadata_path)
40
+ UI.message "Generating metadata at: #{metadata_path}" do
41
+ raw = Dir.chdir(macro_downloaded_dir) do
42
+ swift! ["package", "dump-package"]
43
+ end
44
+ metadata_path.write(raw)
45
+ @metadata = Metadata.from_s(raw)
46
+ end
45
47
  end
46
48
 
47
49
  def prebuild_macro_impl
@@ -51,8 +53,12 @@ module Pod
51
53
  impl_module_name = @metadata.macro_impl_name
52
54
  return if spm_config.dont_prebuild_macros_if_exist? && (macro_prebuilt_dir / config / impl_module_name).exist?
53
55
 
54
- UI.puts "Building macro implementation: #{impl_module_name} (#{config})...".green
55
- `cd #{macro_downloaded_dir} && swift build -c #{config}`
56
+ UI.section "Building macro implementation: #{impl_module_name} (#{config})...".green do
57
+ Dir.chdir(macro_downloaded_dir) do
58
+ swift! ["build", "-c", config, "--product", impl_module_name]
59
+ end
60
+ end
61
+
56
62
  (macro_prebuilt_dir / config).mkpath
57
63
  FileUtils.copy_entry(
58
64
  macro_downloaded_dir / ".build" / config / impl_module_name,
@@ -1,3 +1,6 @@
1
+ require "cocoapods-spm/config"
2
+ require "cocoapods-spm/metadata"
3
+ require "cocoapods-spm/executables"
1
4
  require "cocoapods-spm/def/target_definition"
2
5
  require "cocoapods-spm/def/podfile"
3
6
  require "cocoapods-spm/def/spec"
@@ -9,8 +9,12 @@ module Pod
9
9
  @raw = raw
10
10
  end
11
11
 
12
+ def self.from_s(str)
13
+ new(JSON.parse(str))
14
+ end
15
+
12
16
  def self.from_file(path)
13
- new(JSON.parse(File.read(path)))
17
+ from_s(File.read(path))
14
18
  end
15
19
 
16
20
  def self.for_pod(name)
@@ -55,7 +55,6 @@ module Pod
55
55
  end
56
56
 
57
57
  def resolve_spm_dependencies
58
- # TODO: convert aggregate_targets to umbrella_targets?
59
58
  UI.section "Analyzing SPM dependencies" do
60
59
  @spm_analyzer ||= Pod::Installer::SPMAnalyzer.new(podfile, aggregate_targets)
61
60
  @spm_analyzer.analyze
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cocoapods-spm
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thuyen Trinh
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-12-26 00:00:00.000000000 Z
11
+ date: 2024-03-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: xcodeproj
@@ -42,11 +42,13 @@ files:
42
42
  - lib/cocoapods-spm/def/spm_package.rb
43
43
  - lib/cocoapods-spm/def/target_definition.rb
44
44
  - lib/cocoapods-spm/def/xcodeproj.rb
45
+ - lib/cocoapods-spm/executables.rb
45
46
  - lib/cocoapods-spm/hooks/base.rb
46
47
  - lib/cocoapods-spm/hooks/post_integrate/add_spm_pkgs.rb
47
48
  - lib/cocoapods-spm/hooks/post_integrate/update_embed_frameworks_script.rb
48
- - lib/cocoapods-spm/hooks/pre_integrate/update_settings.rb
49
+ - lib/cocoapods-spm/hooks/post_integrate/update_settings.rb
49
50
  - lib/cocoapods-spm/installer/analyzer.rb
51
+ - lib/cocoapods-spm/installer/validator.rb
50
52
  - lib/cocoapods-spm/macro/fetcher.rb
51
53
  - lib/cocoapods-spm/macro/pod_installer.rb
52
54
  - lib/cocoapods-spm/macro/prebuilder.rb
@@ -74,7 +76,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
74
76
  - !ruby/object:Gem::Version
75
77
  version: '0'
76
78
  requirements: []
77
- rubygems_version: 3.1.6
79
+ rubygems_version: 3.2.33
78
80
  signing_key:
79
81
  specification_version: 4
80
82
  summary: CocoaPods plugin to add SPM dependencies to CocoaPods targets