cocoapods-acknowledgements-addons 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,8 +1,8 @@
1
- default: install
1
+ default:
2
+ make install-dependencies
2
3
  open App.xcworkspace
3
4
 
4
- install:
5
+ install-dependencies:
5
6
  git submodule update --init --recursive
6
7
  carthage bootstrap --platform ios --no-build
7
- bundle install
8
8
  bundle exec pod install
@@ -1,15 +1,20 @@
1
1
  platform :ios, "12.0"
2
+ use_frameworks!
3
+ inhibit_all_warnings!
2
4
 
3
5
  target :App do
4
- use_frameworks!
5
6
  pod "Alamofire", git: "https://github.com/Alamofire/Alamofire.git", tag: "4.8.2"
6
- pod "CPDAcknowledgements", inhibit_warnings: true
7
+ pod "CPDAcknowledgements"
8
+ end
9
+
10
+ target :AppTests do
7
11
  end
8
12
 
9
13
  # Generates a plist of dependencies installed via CocoaPods
10
- plugin "cocoapods-acknowledgements"
14
+ plugin "cocoapods-acknowledgements", settings_bundle: true
11
15
 
12
16
  # Adds additional acknowledgements to the generated plist
13
17
  plugin "cocoapods-acknowledgements-addons",
14
18
  add: ["Acknowledgements", "Carthage/Checkouts", "Dependencies"],
15
- exclude: ["QuickTableViewController"]
19
+ with_spm: true,
20
+ exclude: ["Quick*"]
@@ -7,7 +7,7 @@ DEPENDENCIES:
7
7
  - CPDAcknowledgements
8
8
 
9
9
  SPEC REPOS:
10
- https://github.com/cocoapods/specs.git:
10
+ https://github.com/CocoaPods/Specs.git:
11
11
  - CPDAcknowledgements
12
12
 
13
13
  EXTERNAL SOURCES:
@@ -24,6 +24,6 @@ SPEC CHECKSUMS:
24
24
  Alamofire: ae5c501addb7afdbb13687d7f2f722c78734c2d3
25
25
  CPDAcknowledgements: 6e15e71849ba4ad5e8a17a0bb9d20938ad23bac8
26
26
 
27
- PODFILE CHECKSUM: f95597022bf609d22d7eb87aee64383751ce2c4c
27
+ PODFILE CHECKSUM: 510b2adb00afb6eb355a2f628b554a1370e84972
28
28
 
29
- COCOAPODS: 1.6.1
29
+ COCOAPODS: 1.8.4
@@ -5,7 +5,7 @@
5
5
  ```rb
6
6
  plugin "cocoapods-acknowledgements-addons",
7
7
  add: ["Acknowledgements", "Carthage/Checkouts", "Dependencies"],
8
- exclude: ["QuickTableViewController"]
8
+ exclude: ["Quick*"]
9
9
  ```
10
10
 
11
11
  The plugin finds additional acknowledgements from the following directories:
@@ -1,8 +1,9 @@
1
1
  require "cocoapods"
2
2
  require "cocoapods_acknowledgements"
3
3
  require "cocoapods_acknowledgements/addons/podspec_accumulator"
4
- require "cocoapods_acknowledgements/addons/plist_modifier"
5
- require "cocoapods_acknowledgements/addons/settings_plist_modifier"
4
+ require "cocoapods_acknowledgements/addons/swift_package_accumulator"
5
+ require "cocoapods_acknowledgements/addons/modifiers/pods_plist_modifier"
6
+ require "cocoapods_acknowledgements/addons/modifiers/metadata_plist_modifier"
6
7
 
7
8
  module CocoaPodsAcknowledgements
8
9
  module AddOns
@@ -10,21 +11,31 @@ module CocoaPodsAcknowledgements
10
11
  Pod::HooksManager.register("cocoapods-acknowledgements-addons", :post_install) do |context, user_options|
11
12
  paths = [*user_options[:add]]
12
13
  excluded_names = [*user_options[:exclude]]
14
+ includes_spm = user_options[:with_spm] || false
13
15
 
14
16
  acknowledgements = paths.reduce([]) do |results, path|
15
17
  accumulator = PodspecAccumulator.new(Pathname(path).expand_path)
16
- results + accumulator.acknowledgements
18
+ (results + accumulator.acknowledgements).uniq { |a| a.spec.name }
19
+ end
20
+
21
+ if includes_spm
22
+ spm_acknowledgements = context.umbrella_targets.reduce([]) do |results, target|
23
+ accumulator = SwiftPackageAccumulator.new(target.user_project.path)
24
+ (results + accumulator.acknowledgements).uniq { |a| a.spec.name }
25
+ end
26
+ acknowledgements += spm_acknowledgements
27
+ Pod::UI.info %(Found #{spm_acknowledgements.count} Swift Package(s)).green
17
28
  end
18
29
 
19
30
  sandbox = context.sandbox if defined? context.sandbox
20
31
  sandbox ||= Pod::Sandbox.new(context.sandbox_root)
21
32
 
22
33
  context.umbrella_targets.each do |target|
23
- plist_modifier = PlistModifier.new(target, sandbox)
24
- plist_modifier.add(acknowledgements.map(&:plist_metadata), excluded_names)
34
+ metadata_plist_modifier = MetadataPlistModifier.new(target, sandbox)
35
+ metadata_plist_modifier.add(acknowledgements.map(&:metadata_plist_item), excluded_names)
25
36
 
26
- settings_plist_modifier = SettingsPlistModifier.new(target)
27
- settings_plist_modifier.add(acknowledgements.map(&:settings_plist_metadata), excluded_names)
37
+ pods_plist_modifier = PodsPlistModifier.new(target, sandbox)
38
+ pods_plist_modifier.add(acknowledgements.map(&:settings_plist_item), excluded_names)
28
39
  end
29
40
  end
30
41
 
@@ -3,6 +3,7 @@ require "cocoapods-core"
3
3
  module CocoaPodsAcknowledgements
4
4
  module AddOns
5
5
  class Acknowledgement
6
+ attr_reader :spec
6
7
 
7
8
  # @param path [String] the path string to a pod spec.
8
9
  #
@@ -34,10 +35,10 @@ module CocoaPodsAcknowledgements
34
35
  text
35
36
  end
36
37
 
37
- # @return [Hash] the acknowledgement info for the plist.
38
+ # @return [Hash] the acknowledgement info for the Pods metadata plist.
38
39
  # @return [Nil] if the license text is missing.
39
40
  #
40
- def plist_metadata
41
+ def metadata_plist_item
41
42
  return nil unless @spec and @license_text
42
43
  {
43
44
  name: @spec.name,
@@ -54,7 +55,7 @@ module CocoaPodsAcknowledgements
54
55
  # @return [Hash] the acknowledgement info for the Settings.bundle plist.
55
56
  # @return [Nil] if the license text is missing.
56
57
  #
57
- def settings_plist_metadata
58
+ def settings_plist_item
58
59
  return nil unless @spec and @license_text
59
60
  {
60
61
  Title: @spec.name,
@@ -4,8 +4,10 @@ require "cocoapods_acknowledgements/addons/acknowledgement"
4
4
 
5
5
  module CocoaPodsAcknowledgements
6
6
  module AddOns
7
- class PlistModifier
7
+ class MetadataPlistModifier
8
8
 
9
+ # A modifier to update Pods/Pods-#{app_name}-metadata.plist.
10
+ #
9
11
  # @param target [Pod::Installer::PostInstallHooksContext::UmbrellaTargetDescription] the xcodeproj target.
10
12
  # @param sandbox [Pod::Sandbox] the CocoaPods sandbox
11
13
  #
@@ -13,6 +15,13 @@ module CocoaPodsAcknowledgements
13
15
  @plist_path = sandbox.root + "#{target.cocoapods_target_label}-metadata.plist"
14
16
  end
15
17
 
18
+ # @return [CFPropertyList::List] the acknowledgement plist at Pods/Pods-#{app_name}-metadata.plist.
19
+ #
20
+ def plist
21
+ return nil unless @plist_path&.readable?
22
+ CFPropertyList::List.new(file: @plist_path)
23
+ end
24
+
16
25
  # Adds acknowledgements to the plist except the excluded ones.
17
26
  #
18
27
  # @param plist_metadata [Array<Hash>] the array of acknowledgement plist metadata.
@@ -27,19 +36,30 @@ module CocoaPodsAcknowledgements
27
36
  plist = CFPropertyList::List.new(file: @plist_path)
28
37
  entries = plist.value.value["specs"].value
29
38
  existing_titles = entries.map { |spec| spec.value["name"].value }
30
- excluded_names += existing_titles
39
+ excluded_names.uniq!
31
40
 
32
- additions = plist_metadata.map { |metadata|
33
- next if metadata.nil? or excluded_names.include? metadata[:name]
41
+ additions = plist_metadata.map do |metadata|
42
+ next if metadata.nil? or existing_titles.include? metadata[:name]
34
43
  Pod::UI.info "Adding #{metadata[:name]} to #{@plist_path.basename}"
35
44
  CFPropertyList.guess(metadata)
36
- }.reject(&:nil?)
45
+ end.reject(&:nil?)
37
46
 
38
47
  acknowledgements = entries + additions
39
- acknowledgements.sort! { |a, b| a.value["name"].value <=> b.value["name"].value }
48
+ acknowledgements
49
+ .sort! { |a, b| a.value["name"].value <=> b.value["name"].value }
50
+ .reject! do |entry|
51
+ matches = excluded_names.any? do |excluded_name|
52
+ pattern = %r(^#{Regexp.escape(excluded_name).gsub("\*", ".*?")})
53
+ entry.value["name"].value =~ pattern
54
+ end
55
+ Pod::UI.info %(Removing #{entry.value["name"].value} from #{@plist_path.basename}) if matches
56
+ matches
57
+ end
40
58
 
41
59
  plist.value.value["specs"].value = acknowledgements
42
60
  plist.save(@plist_path, CFPropertyList::List::FORMAT_XML)
61
+
62
+ Pod::UI.puts "Saving #{@plist_path}".green
43
63
  end
44
64
 
45
65
  end
@@ -0,0 +1,133 @@
1
+ require "cfpropertylist"
2
+ require "cocoapods"
3
+ require "cocoapods_acknowledgements/addons/acknowledgement"
4
+
5
+ module CocoaPodsAcknowledgements
6
+ module AddOns
7
+ class PodsPlistModifier
8
+
9
+ # A modifier to update:
10
+ #
11
+ # - Pods/Target Support Files/Pods-#{app_name}/Pods-#{app_name}-acknowledgements.{plist|markdown}
12
+ # - settings_bundle/#{app_name}-settings-metadata.plist"
13
+ #
14
+ # @param target [Pod::Installer::PostInstallHooksContext::UmbrellaTargetDescription] the xcodeproj target.
15
+ # @param sandbox [Pod::Sandbox] the CocoaPods sandbox
16
+ #
17
+ def initialize(target, sandbox)
18
+ @markdown_path = sandbox.target_support_files_root + target.cocoapods_target_label + "#{target.cocoapods_target_label}-acknowledgements.markdown"
19
+ @plist_path = sandbox.target_support_files_root + target.cocoapods_target_label + "#{target.cocoapods_target_label}-acknowledgements.plist"
20
+
21
+ project = Xcodeproj::Project.open(target.user_project_path)
22
+ file = project.files.find { |f| f.path =~ /Settings\.bundle$/ }
23
+ settings_bundle = file&.real_path
24
+ @settings_plist = settings_bundle + "#{target.cocoapods_target_label}-settings-metadata.plist" if settings_bundle&.exist?
25
+ end
26
+
27
+ # @return [String] the acknowledgement texts at Pods/Target Support Files/Pods-#{app_name}/Pods-#{app_name}-acknowledgements.markdown.
28
+ #
29
+ def markdown
30
+ return nil unless @markdown_path&.readable?
31
+ File.read @markdown_path
32
+ end
33
+
34
+ # @return [CFPropertyList::List] the acknowledgement plist at Pods/Target Support Files/Pods-#{app_name}/Pods-#{app_name}-acknowledgements.plist.
35
+ #
36
+ def plist
37
+ return nil unless @plist_path&.readable?
38
+ CFPropertyList::List.new(file: @plist_path)
39
+ end
40
+
41
+ # @return [CFPropertyList::List] the acknowledgement plist in the app Settings.bundle.
42
+ #
43
+ def settings_plist
44
+ return nil unless @settings_plist&.readable?
45
+ CFPropertyList::List.new(file: @settings_plist)
46
+ end
47
+
48
+ # Adds acknowledgements to the CocoaPods generated plist and markdown files except the excluded ones.
49
+ #
50
+ # @param plist_metadata [Array<Hash>] the array of acknowledgement plist metadata.
51
+ # @param excluded_names [Array<String>] the array of names to ignore.
52
+ #
53
+ def add(plist_metadata, excluded_names)
54
+ plist_metadata = [*plist_metadata]
55
+ excluded_names = [*excluded_names]
56
+
57
+ return if plist_metadata.empty?
58
+ plist = plist_with_additional_metadata(plist_metadata, excluded_names)
59
+
60
+ [@plist_path, @settings_plist].each do |path|
61
+ next unless path&.writable?
62
+ Pod::UI.puts "Saving #{path}".green
63
+ plist.save(path, CFPropertyList::List::FORMAT_XML)
64
+ end
65
+
66
+ File.write @markdown_path, markdown_text_with(plist)
67
+ end
68
+
69
+ private
70
+
71
+ def plist_with_additional_metadata(plist_metadata, excluded_names)
72
+ return nil unless @plist_path&.readable?
73
+
74
+ plist = CFPropertyList::List.new(file: @plist_path)
75
+ entries = plist.value.value["PreferenceSpecifiers"].value
76
+
77
+ header = entries.first
78
+ footer = entries.last
79
+ attributes = [header.value["Title"].value, footer.value["Title"].value]
80
+
81
+ existing_titles = entries
82
+ .map { |spec| spec.value["Title"].value }
83
+ .reject { |title| attributes.include? title }
84
+ excluded_names.uniq!
85
+
86
+ additions = plist_metadata.map do |metadata|
87
+ next if metadata.nil? or existing_titles.include? metadata[:Title]
88
+ Pod::UI.info "Adding #{metadata[:Title]} to #{@plist_path.basename}"
89
+ CFPropertyList.guess(metadata)
90
+ end.reject(&:nil?)
91
+
92
+ acknowledgements = entries[1...-1] + additions
93
+ acknowledgements
94
+ .sort! { |a, b| a.value["Title"].value <=> b.value["Title"].value }
95
+ .reject! do |entry|
96
+ matches = excluded_names.any? do |excluded_name|
97
+ pattern = %r(^#{Regexp.escape(excluded_name).gsub("\*", ".*?")})
98
+ entry.value["Title"].value =~ pattern
99
+ end
100
+ Pod::UI.info %(Removing #{entry.value["Title"].value} from #{@plist_path.basename}) if matches
101
+ matches
102
+ end
103
+
104
+ footer.value["FooterText"].value.gsub!("http:", "https:")
105
+
106
+ plist.value.value["PreferenceSpecifiers"].value = [header] + acknowledgements + [footer]
107
+ plist
108
+ end
109
+
110
+ def markdown_text_with(plist)
111
+ entries = plist.value.value["PreferenceSpecifiers"].value
112
+ header = entries.first
113
+ footer = entries.last
114
+ acknowledgements = entries[1...-1].map do |entry|
115
+ <<~ACKNOWLEDGEMENT.strip
116
+ ## #{entry.value["Title"].value}
117
+
118
+ #{entry.value["FooterText"].value}
119
+ ACKNOWLEDGEMENT
120
+ end
121
+
122
+ texts = <<~MARKDOWN
123
+ # #{header.value["Title"].value}
124
+ #{header.value["FooterText"].value}
125
+
126
+ #{acknowledgements.join("\n\n\n")}
127
+
128
+ #{footer.value["FooterText"].value}
129
+ MARKDOWN
130
+ end
131
+ end
132
+ end
133
+ end
@@ -0,0 +1,28 @@
1
+ require "cocoapods-core"
2
+ require "cocoapods_acknowledgements/addons/acknowledgement"
3
+
4
+ module CocoaPodsAcknowledgements
5
+ module AddOns
6
+ class SwiftPackageAccumulator
7
+
8
+ # @param xcodeproj_path [Pathname] the directory to look for podspecs.
9
+ #
10
+ def initialize(xcodeproj_path = nil)
11
+ if xcodeproj_path.nil?
12
+ @files = []
13
+ else
14
+ build_dir = %x{xcodebuild -project "#{xcodeproj_path}" -showBuildSettings | grep -m 1 BUILD_DIR | grep -oEi "\/.*"}.strip
15
+ source_packages_dir = Pathname(build_dir) + "../../SourcePackages/checkouts"
16
+ @files = Dir[source_packages_dir + "*/*.podspec"] # skip nested git submodules
17
+ end
18
+ end
19
+
20
+ # @return [Array<Acknowledgement>] the array of Acknowledgement objects.
21
+ #
22
+ def acknowledgements
23
+ @files.map { |file| Acknowledgement.new(file) }
24
+ end
25
+
26
+ end
27
+ end
28
+ end
@@ -1,5 +1,5 @@
1
1
  module CocoaPodsAcknowledgements
2
2
  module AddOns
3
- VERSION = "0.2.0"
3
+ VERSION = "0.3.0"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cocoapods-acknowledgements-addons
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - bcylin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-05-28 00:00:00.000000000 Z
11
+ date: 2020-02-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: cocoapods
@@ -72,6 +72,7 @@ executables: []
72
72
  extensions: []
73
73
  extra_rdoc_files: []
74
74
  files:
75
+ - ".github/workflows/run_tests.yml"
75
76
  - ".gitignore"
76
77
  - ".gitmodules"
77
78
  - ".travis.yml"
@@ -87,9 +88,11 @@ files:
87
88
  - example/App.xcodeproj/project.pbxproj
88
89
  - example/App.xcodeproj/project.xcworkspace/contents.xcworkspacedata
89
90
  - example/App.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
91
+ - example/App.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
90
92
  - example/App.xcodeproj/xcshareddata/xcschemes/App.xcscheme
91
93
  - example/App.xcworkspace/contents.xcworkspacedata
92
94
  - example/App.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
95
+ - example/App.xcworkspace/xcshareddata/swiftpm/Package.resolved
93
96
  - example/App/App-Bridging-Header.h
94
97
  - example/App/AppDelegate.swift
95
98
  - example/App/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -113,9 +116,10 @@ files:
113
116
  - example/README.md
114
117
  - lib/cocoapods_acknowledgements/addons.rb
115
118
  - lib/cocoapods_acknowledgements/addons/acknowledgement.rb
116
- - lib/cocoapods_acknowledgements/addons/plist_modifier.rb
119
+ - lib/cocoapods_acknowledgements/addons/modifiers/metadata_plist_modifier.rb
120
+ - lib/cocoapods_acknowledgements/addons/modifiers/pods_plist_modifier.rb
117
121
  - lib/cocoapods_acknowledgements/addons/podspec_accumulator.rb
118
- - lib/cocoapods_acknowledgements/addons/settings_plist_modifier.rb
122
+ - lib/cocoapods_acknowledgements/addons/swift_package_accumulator.rb
119
123
  - lib/cocoapods_plugin.rb
120
124
  - lib/version.rb
121
125
  homepage: https://github.com/bcylin/cocoapods-acknowledgements-addons
@@ -137,8 +141,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
137
141
  - !ruby/object:Gem::Version
138
142
  version: '0'
139
143
  requirements: []
140
- rubyforge_project:
141
- rubygems_version: 2.6.14.1
144
+ rubygems_version: 3.0.3
142
145
  signing_key:
143
146
  specification_version: 4
144
147
  summary: A CocoaPods plugin that adds additional acknowledgements to the plist generated
@@ -1,58 +0,0 @@
1
- require "cfpropertylist"
2
- require "cocoapods"
3
- require "cocoapods_acknowledgements/addons/acknowledgement"
4
-
5
- module CocoaPodsAcknowledgements
6
- module AddOns
7
- class SettingsPlistModifier
8
-
9
- # @param target [Pod::Installer::PostInstallHooksContext::UmbrellaTargetDescription] the xcodeproj target.
10
- #
11
- def initialize(target)
12
- project = Xcodeproj::Project.open(target.user_project_path)
13
- file = project.files.find { |f| f.path =~ /Settings\.bundle$/ }
14
- settings_bundle = file&.real_path
15
-
16
- return unless settings_bundle&.exist?
17
- @plist_path = settings_bundle + "#{target.cocoapods_target_label}-settings-metadata.plist"
18
- end
19
-
20
- # Adds acknowledgements to the plist except the excluded ones.
21
- #
22
- # @param plist_metadata [Array<Hash>] the array of acknowledgement plist metadata.
23
- # @param excluded_names [Array<String>] the array of names to ignore.
24
- #
25
- def add(plist_metadata, excluded_names)
26
- plist_metadata = [*plist_metadata]
27
- excluded_names = [*excluded_names]
28
-
29
- return if plist_metadata.empty? or not @plist_path&.writable?
30
-
31
- plist = CFPropertyList::List.new(file: @plist_path)
32
- entries = plist.value.value["PreferenceSpecifiers"].value
33
-
34
- header = entries.first
35
- footer = entries.last
36
- attributes = [header.value["Title"].value, footer.value["Title"].value]
37
-
38
- existing_titles = entries
39
- .map { |spec| spec.value["Title"].value }
40
- .reject { |title| attributes.include? title }
41
- excluded_names += existing_titles
42
-
43
- additions = plist_metadata.map { |metadata|
44
- next if metadata.nil? or excluded_names.include? metadata[:Title]
45
- Pod::UI.info "Adding #{metadata[:Title]} to #{@plist_path.basename}"
46
- CFPropertyList.guess(metadata)
47
- }.reject(&:nil?)
48
-
49
- acknowledgements = entries[1...-1] + additions
50
- acknowledgements.sort! { |a, b| a.value["Title"].value <=> b.value["Title"].value }
51
-
52
- plist.value.value["PreferenceSpecifiers"].value = [header] + acknowledgements + [footer]
53
- plist.save(@plist_path, CFPropertyList::List::FORMAT_XML)
54
- end
55
-
56
- end
57
- end
58
- end