cocoapods-project-gen 0.1.0 → 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,143 @@
1
+ module ProjectGen
2
+ class Results
3
+ # !@group results
4
+
5
+ attr_reader :results
6
+
7
+ def initialize(ignore_public_only_results: false)
8
+ @ignore_public_only_results = ignore_public_only_results
9
+ @results = []
10
+ end
11
+
12
+ def self.puts(message = '')
13
+ $stdout.puts message
14
+ end
15
+
16
+ def error(*args)
17
+ add_result(:error, *args)
18
+ end
19
+
20
+ def warning(*args)
21
+ add_result(:warning, *args)
22
+ end
23
+
24
+ def note(*args)
25
+ add_result(:note, *args)
26
+ end
27
+
28
+ # Prints the result of the validation to the user.
29
+ #
30
+ # @return [void]
31
+ #
32
+ def print_results
33
+ Results.puts results_message
34
+ end
35
+
36
+ def results_message
37
+ message = ''
38
+ results.each do |result|
39
+ if result.platforms == [:ios]
40
+ platform_message = '[iOS] '
41
+ elsif result.platforms == [:osx]
42
+ platform_message = '[OSX] '
43
+ elsif result.platforms == [:watchos]
44
+ platform_message = '[watchOS] '
45
+ elsif result.platforms == [:tvos]
46
+ platform_message = '[tvOS] '
47
+ end
48
+ case result.type
49
+ when :error then type = 'ERROR'
50
+ when :warning then type = 'WARN'
51
+ when :note then type = 'NOTE'
52
+ else raise result.type.to_s end
53
+ message << " - #{type.ljust(5)} | #{platform_message}#{result.attribute_name}: #{result.message}\n"
54
+ end
55
+ message << "\n"
56
+ end
57
+
58
+ def failure_reason
59
+ results_by_type = results.group_by(&:type)
60
+ results_by_type.default = []
61
+ return nil if validated?
62
+
63
+ reasons = []
64
+ if (size = results_by_type[:error].size) && size > 0
65
+ reasons << "#{size} #{'error'.pluralize(size)}"
66
+ end
67
+ if !allow_warnings && (size = results_by_type[:warning].size) && size > 0
68
+ reason = "#{size} #{'warning'.pluralize(size)}"
69
+ pronoun = size == 1 ? 'it' : 'them'
70
+ reason << " (but you can use `--allow-warnings` to ignore #{pronoun})" if reasons.empty?
71
+ reasons << reason
72
+ end
73
+ if results.all?(&:public_only)
74
+ reasons << 'all results apply only to public specs, but you can use ' \
75
+ '`--private` to ignore them if linting the specification for a private pod'
76
+ end
77
+
78
+ reasons.to_sentence
79
+ end
80
+
81
+ # @return [Symbol] The type, which should been used to display the result.
82
+ # One of: `:error`, `:warning`, `:note`.
83
+ #
84
+ def result_type
85
+ applicable_results = results
86
+ applicable_results = applicable_results.reject(&:public_only?) if @ignore_public_only_results
87
+ types = applicable_results.map(&:type).uniq
88
+ if types.include?(:error) then :error
89
+ elsif types.include?(:warning) then :warning
90
+ else
91
+ :note
92
+ end
93
+ end
94
+ # !@group Result Helpers
95
+
96
+ def add_result(type, attribute_name, message, public_only = false)
97
+ result = results.find do |r|
98
+ r.type == type && r.attribute_name && r.message == message && r.public_only? == public_only
99
+ end
100
+ unless result
101
+ result = Pod::Specification::Linter::Results::Result.new(type, attribute_name, message, public_only)
102
+ results << result
103
+ end
104
+ end
105
+
106
+ def translate_xcodebuild_output_to_messages(output)
107
+ parsed_output = parse_xcodebuild_output(output)
108
+ parsed_output.each do |message|
109
+ next if message.include?("'InputFile' should have")
110
+
111
+ if message =~ /\S*error:/
112
+ error('xcodebuild', message)
113
+ elsif message =~ /\S*warning:/
114
+ warning('xcodebuild', message)
115
+ else
116
+ note('xcodebuild', message)
117
+ end
118
+ end
119
+ end
120
+
121
+ # Parse the xcode build output to identify the lines which are relevant
122
+ # to the linter.
123
+ #
124
+ # @param [String] output the output generated by the xcodebuild tool.
125
+ #
126
+ # @note The indentation and the temporary path is stripped form the
127
+ # lines.
128
+ #
129
+ # @return [Array<String>] the lines that are relevant to the linter.
130
+ #
131
+ def parse_xcodebuild_output(output)
132
+ lines = output.split("\n")
133
+ selected_lines = lines.select do |l|
134
+ l.include?('error: ') && (l !~ /errors? generated\./) && (l !~ /error: \(null\)/) ||
135
+ l.include?('warning: ') && (l !~ /warnings? generated\./) && (l !~ /frameworks only run on iOS 8/) ||
136
+ l.include?('note: ') && (l !~ /expanded from macro/)
137
+ end
138
+ selected_lines.map do |l|
139
+ l.force_encoding('UTF-8').gsub(/xcodebuild:\s*/, '')
140
+ end
141
+ end
142
+ end
143
+ end
@@ -0,0 +1,35 @@
1
+ require 'fileutils'
2
+
3
+ module ProjectGen
4
+ module Utils
5
+ # @return [Bool]
6
+ #
7
+ def self.absolute?(path)
8
+ Pathname(path).absolute? || path.to_s.start_with?('~')
9
+ end
10
+
11
+ def self.remove_target_scope_suffix(label, scope_suffix)
12
+ if scope_suffix.nil? || scope_suffix[0] == '.'
13
+ label.delete_suffix(scope_suffix || '')
14
+ else
15
+ label.delete_suffix("-#{scope_suffix}")
16
+ end
17
+ end
18
+
19
+ def self.zip(product_path, zip_path)
20
+ product_name = Pathname.new(product_path).basename
21
+ zip_product_name = Pathname.new(zip_path).basename
22
+ FileUtils.rm_rf(zip_path)
23
+ FileUtils.mkdir_p(zip_path.dirname)
24
+ Dir.chdir(product_path) do
25
+ out_put = `pushd #{product_name};zip -qry #{zip_path} *;popd`
26
+ if out_put.downcase.include?('error')
27
+ $stdout.puts(out_put.red)
28
+ else
29
+ $stdout.puts("#{zip_product_name}:".green)
30
+ $stdout.puts(" path: #{zip_path}".green)
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,44 @@
1
+ require 'cocoapods-project-gen/gen/project_gen'
2
+ require 'cocoapods-project-gen/gen/project_builder'
3
+
4
+ module ProjectGen
5
+ class XcframeworkGen
6
+
7
+ def self.new_from_project_gen(project_gen)
8
+ new(project_gen)
9
+ end
10
+
11
+ # Initialize a new instance
12
+ #
13
+ # @param [ProjectGenerator] project_gen
14
+ # Creates the target for the Pods libraries in the Pods project and the
15
+ # relative support files.
16
+ #
17
+ def initialize(project_gen)
18
+ @project_gen = project_gen
19
+ end
20
+
21
+ # Initialize a new instance
22
+ #
23
+ # @param [<Pathname, String>] work_dir
24
+ # the temporary directory used by the Generator.
25
+ #
26
+ # @param [Symbol] The name of the build configuration.
27
+ #
28
+ # @param [Bool] Build xcframework.
29
+ #
30
+ def generate_xcframework(work_dir, configuration = nil, build: true, build_library_for_distribution: false)
31
+ app_root = Pathname.new(work_dir).expand_path
32
+ o_value = nil
33
+ @project_gen.generate!(app_root) do |platforms, pod_targets, no_clean, fail_fast|
34
+ if build
35
+ bm = BuildManager.new(app_root, no_clean: no_clean, fail_fast: fail_fast)
36
+ o_value = bm.create_xcframework_products!(platforms, pod_targets, configuration, build_library_for_distribution: build_library_for_distribution)
37
+ else
38
+ o_value = pod_targets
39
+ end
40
+ end
41
+ o_value
42
+ end
43
+ end
44
+ end
@@ -1,7 +1,14 @@
1
- module ProjectGen
2
- require 'cocoapods'
3
- require 'cocoapods-project-gen/gem_version'
4
- # autoload registers a file path to be loaded the first time
5
- # that a specified module or class is accessed in the namespace of the calling module or class.
6
- autoload :ProjectGenerator, 'cocoapods-project-gen/gen/project_gen'
7
- end
1
+ module ProjectGen
2
+ require 'cocoapods'
3
+ require 'pathname'
4
+ require 'claide'
5
+ require 'cocoapods-project-gen/gem_version'
6
+ # autoload registers a file path to be loaded the first time
7
+ # that a specified module or class is accessed in the namespace of the calling module or class.
8
+ autoload :Command, 'cocoapods-project-gen/command/command'
9
+ autoload :ProjectGenerator, 'cocoapods-project-gen/gen/project_gen'
10
+ autoload :XcframeworkGen, 'cocoapods-project-gen/gen/xcframework_gen'
11
+ autoload :Constants, 'cocoapods-project-gen/gen/constants'
12
+ autoload :Utils, 'cocoapods-project-gen/gen/utils'
13
+ autoload :Results, 'cocoapods-project-gen/gen/results'
14
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cocoapods-project-gen
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cat1237
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-07-22 00:00:00.000000000 Z
11
+ date: 2022-08-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: cocoapods
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 1.10.0
19
+ version: 1.11.3
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 1.10.0
26
+ version: 1.11.3
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rspec
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -41,16 +41,31 @@ dependencies:
41
41
  description: cocoapods project gen
42
42
  email:
43
43
  - wangson1237@outlook.com
44
- executables: []
44
+ executables:
45
+ - xcframework
45
46
  extensions: []
46
47
  extra_rdoc_files: []
47
48
  files:
48
49
  - LICENSE
49
50
  - README.md
51
+ - bin/xcframework
50
52
  - lib/cocoapods-project-gen.rb
53
+ - lib/cocoapods-project-gen/command/command.rb
54
+ - lib/cocoapods-project-gen/command/gen.rb
51
55
  - lib/cocoapods-project-gen/gem_version.rb
56
+ - lib/cocoapods-project-gen/gen/build/headers_store.rb
57
+ - lib/cocoapods-project-gen/gen/build/xcode_build.rb
58
+ - lib/cocoapods-project-gen/gen/constants.rb
59
+ - lib/cocoapods-project-gen/gen/pod/pod_copy_cleaner.rb
60
+ - lib/cocoapods-project-gen/gen/pod/project_gen_helper.rb
61
+ - lib/cocoapods-project-gen/gen/pod/swift_module_helper.rb
62
+ - lib/cocoapods-project-gen/gen/product.rb
63
+ - lib/cocoapods-project-gen/gen/product/product_helper.rb
64
+ - lib/cocoapods-project-gen/gen/project_builder.rb
52
65
  - lib/cocoapods-project-gen/gen/project_gen.rb
53
- - lib/cocoapods-project-gen/gen/swift_module_helper.rb
66
+ - lib/cocoapods-project-gen/gen/results.rb
67
+ - lib/cocoapods-project-gen/gen/utils.rb
68
+ - lib/cocoapods-project-gen/gen/xcframework_gen.rb
54
69
  homepage: https://github.com/Cat1237/cocoapods-project-gen.git
55
70
  licenses:
56
71
  - MIT
@@ -1,52 +0,0 @@
1
- require 'cocoapods'
2
-
3
- module ProjectGen
4
- module SwiftModule
5
- COPY_LIBRARY_SWIFT_HEADERS = 'Copy-Library-Swift-Headers'
6
- private_constant :COPY_LIBRARY_SWIFT_HEADERS
7
-
8
- # Adds a shell script phase, intended only for library targets that contain swift,
9
- # to copy the ObjC compatibility header (the -Swift.h file that the swift compiler generates)
10
- # to the built products directory. Additionally, the script phase copies the module map, appending a `.Swift`
11
- # submodule that references the (moved) compatibility header. Since the module map has been moved, the umbrella header
12
- # is _also_ copied, so that it is sitting next to the module map. This is necessary for a successful archive build.
13
- #
14
- # @param [PBXNativeTarget] native_target
15
- # the native target to add the Swift static library script phase into.
16
- #
17
- # @return [Void]
18
- #
19
- def add_swift_library_compatibility_header(targets)
20
- targets.each do |target|
21
- relative_module_map_path = target.module_map_path.relative_path_from(target.sandbox.root)
22
- relative_umbrella_header_path = target.umbrella_header_path.relative_path_from(target.sandbox.root)
23
- shell_script = <<-SH.strip_heredoc
24
- COMPATIBILITY_HEADER_ROOT_PATH="${SRCROOT}/${PRODUCT_MODULE_NAME}/#{COPY_LIBRARY_SWIFT_HEADERS}"
25
- COPY_MODULE_MAP_PATH="${COMPATIBILITY_HEADER_ROOT_PATH}/${PRODUCT_MODULE_NAME}.modulemap"
26
- ditto "${PODS_ROOT}/#{relative_module_map_path}" "${COPY_MODULE_MAP_PATH}"
27
- UMBRELLA_HEADER_PATH="${PODS_ROOT}/#{relative_umbrella_header_path}"
28
- if test -f "$UMBRELLA_HEADER_PATH"; then
29
- ditto "$UMBRELLA_HEADER_PATH" "${COMPATIBILITY_HEADER_ROOT_PATH}"
30
- fi
31
- SH
32
-
33
- target.root_spec.script_phases ||= []
34
- target.root_spec.script_phases += [{ name: 'Copy Copy generated module header', script: shell_script }]
35
- next unless target.uses_swift?
36
-
37
- shell_script = <<-SH.strip_heredoc
38
- COMPATIBILITY_HEADER_ROOT_PATH="${SRCROOT}/${PRODUCT_MODULE_NAME}/#{COPY_LIBRARY_SWIFT_HEADERS}"
39
- COPY_COMPATIBILITY_HEADER_PATH="${COMPATIBILITY_HEADER_ROOT_PATH}/${PRODUCT_MODULE_NAME}-Swift.h"#{' '}
40
- COPY_MODULE_MAP_PATH="${COMPATIBILITY_HEADER_ROOT_PATH}/${PRODUCT_MODULE_NAME}.modulemap"
41
- ditto "${DERIVED_SOURCES_DIR}/${PRODUCT_MODULE_NAME}-Swift.h" "${COPY_COMPATIBILITY_HEADER_PATH}"#{' '}
42
- ditto "${BUILT_PRODUCTS_DIR}/${PRODUCT_MODULE_NAME}.swiftmodule" "${COMPATIBILITY_HEADER_ROOT_PATH}/${PRODUCT_MODULE_NAME}.swiftmodule"#{' '}
43
- printf "\\n\\nmodule ${PRODUCT_MODULE_NAME}.Swift {\\n header \\"${PRODUCT_MODULE_NAME}-Swift.h\\"\\n requires objc\\n}\\n" >> "${COPY_MODULE_MAP_PATH}"
44
- SH
45
- target.root_spec.script_phases += [{
46
- name: 'Copy Copy generated compatibility header',
47
- script: shell_script
48
- }]
49
- end
50
- end
51
- end
52
- end