├── .gitignore ├── .rspec ├── .rubocop.yml ├── .simplecov ├── .travis.yml ├── Gemfile ├── Gemfile.lock ├── LICENSE.txt ├── README.md ├── Rakefile ├── bin ├── analyze ├── console └── setup ├── cocoapods-dependency.gemspec ├── lib ├── cocoapods-dependency.rb ├── cocoapods-dependency │ ├── analyze.rb │ ├── command.rb │ ├── command │ │ └── dependency.rb │ ├── resources │ │ └── index.html │ ├── version.rb │ └── visual_out.rb └── cocoapods_plugin.rb ├── showcase.gif └── spec ├── cocoapods ├── Fixtures │ ├── Test │ │ ├── Podfile │ │ ├── Podfile.lock │ │ ├── Pods │ │ │ ├── Manifest.lock │ │ │ ├── Pods.xcodeproj │ │ │ │ ├── project.pbxproj │ │ │ │ └── xcuserdata │ │ │ │ │ └── x140yu.xcuserdatad │ │ │ │ │ └── xcschemes │ │ │ │ │ ├── Pods-Test.xcscheme │ │ │ │ │ └── xcschememanagement.plist │ │ │ └── Target Support Files │ │ │ │ └── Pods-Test │ │ │ │ ├── Pods-Test-acknowledgements.markdown │ │ │ │ ├── Pods-Test-acknowledgements.plist │ │ │ │ ├── Pods-Test-dummy.m │ │ │ │ ├── Pods-Test-frameworks.sh │ │ │ │ ├── Pods-Test-resources.sh │ │ │ │ ├── Pods-Test.debug.xcconfig │ │ │ │ └── Pods-Test.release.xcconfig │ │ ├── Test.xcodeproj │ │ │ ├── project.pbxproj │ │ │ ├── project.xcworkspace │ │ │ │ ├── contents.xcworkspacedata │ │ │ │ ├── xcshareddata │ │ │ │ │ └── IDEWorkspaceChecks.plist │ │ │ │ └── xcuserdata │ │ │ │ │ └── x140yu.xcuserdatad │ │ │ │ │ └── UserInterfaceState.xcuserstate │ │ │ └── xcuserdata │ │ │ │ └── x140yu.xcuserdatad │ │ │ │ └── xcschemes │ │ │ │ └── xcschememanagement.plist │ │ ├── Test.xcworkspace │ │ │ ├── contents.xcworkspacedata │ │ │ ├── xcshareddata │ │ │ │ └── IDEWorkspaceChecks.plist │ │ │ └── xcuserdata │ │ │ │ └── x140yu.xcuserdatad │ │ │ │ └── UserInterfaceState.xcuserstate │ │ └── Test │ │ │ ├── AppDelegate.h │ │ │ ├── AppDelegate.m │ │ │ ├── Assets.xcassets │ │ │ ├── AppIcon.appiconset │ │ │ │ └── Contents.json │ │ │ └── Contents.json │ │ │ ├── Base.lproj │ │ │ ├── LaunchScreen.storyboard │ │ │ └── Main.storyboard │ │ │ ├── Info.plist │ │ │ ├── ViewController.h │ │ │ ├── ViewController.m │ │ │ └── main.m │ ├── index.js │ ├── index2.json │ ├── index2_res.json │ └── index_res.js ├── dependency_spec.rb └── visual_out_spec.rb └── spec_helper.rb /.gitignore: -------------------------------------------------------------------------------- 1 | /.bundle/ 2 | /.yardoc 3 | /_yardoc/ 4 | /coverage/ 5 | /doc/ 6 | /pkg/ 7 | /spec/reports/ 8 | /tmp/ 9 | 10 | .DS_Store 11 | 12 | # rspec failure tracking 13 | .rspec_status 14 | 15 | *.gem -------------------------------------------------------------------------------- /.rspec: -------------------------------------------------------------------------------- 1 | --format documentation 2 | --color 3 | --require spec_helper 4 | -------------------------------------------------------------------------------- /.rubocop.yml: -------------------------------------------------------------------------------- 1 | Metrics/MethodLength: 2 | Max: 20 3 | 4 | Style/TrailingCommaInHashLiteral: 5 | Enabled: false -------------------------------------------------------------------------------- /.simplecov: -------------------------------------------------------------------------------- 1 | SimpleCov.start do 2 | track_files 'lib/**/*.rb' 3 | add_filter '/spec/' 4 | end 5 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | sudo: false 2 | language: ruby 3 | os: osx 4 | rvm: 5 | - 2.4.1 6 | before_install: 7 | - gem install bundler -v 1.16.1 8 | - bundle 9 | - bundle exec pod repo update 10 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source "https://rubygems.org" 2 | 3 | git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } 4 | 5 | # Specify your gem's dependencies in cocoapods-dependency.gemspec 6 | gemspec 7 | -------------------------------------------------------------------------------- /Gemfile.lock: -------------------------------------------------------------------------------- 1 | PATH 2 | remote: . 3 | specs: 4 | cocoapods-dependency (0.2.0) 5 | cocoapods (~> 1.5) 6 | 7 | GEM 8 | remote: https://rubygems.org/ 9 | specs: 10 | CFPropertyList (3.0.0) 11 | activesupport (4.2.10) 12 | i18n (~> 0.7) 13 | minitest (~> 5.1) 14 | thread_safe (~> 0.3, >= 0.3.4) 15 | tzinfo (~> 1.1) 16 | atomos (0.1.3) 17 | claide (1.0.2) 18 | cocoapods (1.5.0) 19 | activesupport (>= 4.0.2, < 5) 20 | claide (>= 1.0.2, < 2.0) 21 | cocoapods-core (= 1.5.0) 22 | cocoapods-deintegrate (>= 1.0.2, < 2.0) 23 | cocoapods-downloader (>= 1.2.0, < 2.0) 24 | cocoapods-plugins (>= 1.0.0, < 2.0) 25 | cocoapods-search (>= 1.0.0, < 2.0) 26 | cocoapods-stats (>= 1.0.0, < 2.0) 27 | cocoapods-trunk (>= 1.3.0, < 2.0) 28 | cocoapods-try (>= 1.1.0, < 2.0) 29 | colored2 (~> 3.1) 30 | escape (~> 0.0.4) 31 | fourflusher (~> 2.0.1) 32 | gh_inspector (~> 1.0) 33 | molinillo (~> 0.6.5) 34 | nap (~> 1.0) 35 | ruby-macho (~> 1.1) 36 | xcodeproj (>= 1.5.7, < 2.0) 37 | cocoapods-core (1.5.0) 38 | activesupport (>= 4.0.2, < 6) 39 | fuzzy_match (~> 2.0.4) 40 | nap (~> 1.0) 41 | cocoapods-deintegrate (1.0.2) 42 | cocoapods-downloader (1.2.2) 43 | cocoapods-plugins (1.0.0) 44 | nap 45 | cocoapods-search (1.0.0) 46 | cocoapods-stats (1.0.0) 47 | cocoapods-trunk (1.3.1) 48 | nap (>= 0.8, < 2.0) 49 | netrc (~> 0.11) 50 | cocoapods-try (1.1.0) 51 | colored2 (3.1.2) 52 | concurrent-ruby (1.0.5) 53 | coveralls (0.8.22) 54 | json (>= 1.8, < 3) 55 | simplecov (~> 0.16.1) 56 | term-ansicolor (~> 1.3) 57 | thor (~> 0.19.4) 58 | tins (~> 1.6) 59 | diff-lcs (1.3) 60 | docile (1.3.1) 61 | escape (0.0.4) 62 | fourflusher (2.0.1) 63 | fuzzy_match (2.0.4) 64 | gh_inspector (1.1.3) 65 | i18n (0.9.5) 66 | concurrent-ruby (~> 1.0) 67 | json (2.1.0) 68 | minitest (5.11.3) 69 | molinillo (0.6.6) 70 | nanaimo (0.2.6) 71 | nap (1.1.0) 72 | netrc (0.11.0) 73 | rake (10.5.0) 74 | rspec (3.8.0) 75 | rspec-core (~> 3.8.0) 76 | rspec-expectations (~> 3.8.0) 77 | rspec-mocks (~> 3.8.0) 78 | rspec-core (3.8.0) 79 | rspec-support (~> 3.8.0) 80 | rspec-expectations (3.8.2) 81 | diff-lcs (>= 1.2.0, < 2.0) 82 | rspec-support (~> 3.8.0) 83 | rspec-mocks (3.8.0) 84 | diff-lcs (>= 1.2.0, < 2.0) 85 | rspec-support (~> 3.8.0) 86 | rspec-support (3.8.0) 87 | ruby-macho (1.3.1) 88 | simplecov (0.16.1) 89 | docile (~> 1.1) 90 | json (>= 1.8, < 3) 91 | simplecov-html (~> 0.10.0) 92 | simplecov-html (0.10.2) 93 | term-ansicolor (1.6.0) 94 | tins (~> 1.0) 95 | thor (0.19.4) 96 | thread_safe (0.3.6) 97 | tins (1.17.0) 98 | tzinfo (1.2.5) 99 | thread_safe (~> 0.1) 100 | xcodeproj (1.7.0) 101 | CFPropertyList (>= 2.3.3, < 4.0) 102 | atomos (~> 0.1.3) 103 | claide (>= 1.0.2, < 2.0) 104 | colored2 (~> 3.1) 105 | nanaimo (~> 0.2.6) 106 | 107 | PLATFORMS 108 | ruby 109 | 110 | DEPENDENCIES 111 | bundler (~> 1.16) 112 | cocoapods-dependency! 113 | coveralls (~> 0) 114 | rake (~> 10.0) 115 | rspec (~> 3.0) 116 | 117 | BUNDLED WITH 118 | 1.17.0 119 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2018 TODO: Write your name 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Cocoapods Dependency 2 | 3 | [![Build Status](https://travis-ci.org/X140Yu/cocoapods-dependency.svg?branch=master)](https://travis-ci.org/X140Yu/cocoapods-dependency) 4 | [![Coverage Status](https://coveralls.io/repos/github/X140Yu/cocoapods-dependency/badge.svg?branch=master)](https://coveralls.io/github/X140Yu/cocoapods-dependency?branch=master) 5 | [![Gem Version](https://badge.fury.io/rb/cocoapods-dependency.svg)](https://badge.fury.io/rb/cocoapods-dependency) 6 | 7 | 8 | A CocoaPods plugin which analyzes the dependencies of any cocoapods projects. Subspecs are properly handled. 9 | 10 | ![](showcase.gif) 11 | 12 | ## [中文说明](https://zhaoxinyu.me/2018-08-20-analyze-pods-dependecy/) 13 | 14 | ## Installation 15 | 16 | $ gem install cocoapods-dependency 17 | 18 | ## Usage 19 | 20 | The command should be executed in directory that contains podfile. 21 | 22 | ```shell 23 | # put the analyze result to console 24 | $ pod dependency 25 | 26 | # write te analyze result to a readable HTML 27 | $ pod dependency --visual 28 | ``` 29 | 30 | ## Why this gem? 31 | 32 | Suppose you have a project with a simple dependency, 33 | 34 | ```ruby podfile 35 | target 'Test' do 36 | pod 'Texture', '2.7' 37 | end 38 | ``` 39 | 40 | It seems like this project has just a single dependency, but behind this pod, it may depend on several other pods and these other pods may also depend on some other pods as well 🤦🏻‍♂️, it's hard to determine what the exactly dependency situation of the project with just a glance of the podfile. So I wrote this it to do this thing. 41 | 42 | - ✅ It can print all the dependencies 43 | - ✅ Each dependecy's dependencies can also be printed 44 | - ✅ Subspecs are properly handled, `pod 'Texture', '2.7'` and `pod 'Texture', '2.7', subspecs: %w[PINRemoteImage IGListKit Yoga]` will lead to different results 45 | 46 | ## TODO 47 | 48 | - [X] Lift it to a cocoapods-plugin 49 | - [X] Pretty printed result 50 | 51 | ## License 52 | 53 | The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT). 54 | -------------------------------------------------------------------------------- /Rakefile: -------------------------------------------------------------------------------- 1 | require "bundler/gem_tasks" 2 | require "rspec/core/rake_task" 3 | 4 | RSpec::Core::RakeTask.new(:spec) 5 | 6 | task :default => :spec 7 | -------------------------------------------------------------------------------- /bin/analyze: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | 3 | require_relative '../lib/cocoapods/analyze' 4 | require 'pp' 5 | 6 | path = ARGV.shift 7 | raise 'Please pass the path of the podfile directory as the argument' unless path 8 | 9 | pp Cocoapods::DependencyAnalyzer.analyze(path) 10 | -------------------------------------------------------------------------------- /bin/console: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | 3 | require "bundler/setup" 4 | require "cocoapods/dependency" 5 | 6 | # You can add fixtures and/or initialization code here to make experimenting 7 | # with your gem easier. You can also use a different console, if you like. 8 | 9 | # (If you use this, don't forget to add pry to your Gemfile!) 10 | # require "pry" 11 | # Pry.start 12 | 13 | require "irb" 14 | IRB.start(__FILE__) 15 | -------------------------------------------------------------------------------- /bin/setup: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | set -euo pipefail 3 | IFS=$'\n\t' 4 | set -vx 5 | 6 | bundle install 7 | 8 | # Do any other automated setup that you need to do here 9 | -------------------------------------------------------------------------------- /cocoapods-dependency.gemspec: -------------------------------------------------------------------------------- 1 | lib = File.expand_path('lib', __dir__) 2 | $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) 3 | require 'cocoapods-dependency/version' 4 | 5 | Gem::Specification.new do |spec| 6 | spec.name = 'cocoapods-dependency' 7 | spec.version = CocoapodsDependency::VERSION 8 | spec.authors = ['Xinyu Zhao'] 9 | spec.email = ['zhaoxinyu1994@gmail.com'] 10 | 11 | spec.summary = 'Analyzes the dependencies of any cocoapods projects.' 12 | spec.description = 'Analyzes the dependencies of any cocoapods projects. Subspecs are properly handled.' 13 | spec.homepage = 'https://github.com/X140Yu/cocoapods-dependency' 14 | spec.license = 'MIT' 15 | 16 | spec.files = `git ls-files -z`.split("\x0").reject do |f| 17 | f.match(%r{^(test|spec|features)/}) 18 | end 19 | spec.bindir = 'exe' 20 | spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) } 21 | spec.require_paths = ['lib'] 22 | 23 | spec.add_development_dependency 'bundler', '~> 1.16' 24 | spec.add_development_dependency 'coveralls', '~> 0' 25 | spec.add_development_dependency 'rake', '~> 10.0' 26 | spec.add_development_dependency 'rspec', '~> 3.0' 27 | 28 | spec.add_dependency 'cocoapods', '~> 1.5' 29 | end 30 | -------------------------------------------------------------------------------- /lib/cocoapods-dependency.rb: -------------------------------------------------------------------------------- 1 | require 'cocoapods-dependency/version' 2 | -------------------------------------------------------------------------------- /lib/cocoapods-dependency/analyze.rb: -------------------------------------------------------------------------------- 1 | require 'cocoapods' 2 | require 'pathname' 3 | 4 | module CocoapodsDependency 5 | # 6 | # Analyze the project using cocoapods 7 | # 8 | class Analyzer 9 | def self.analyze(podfile_dir_path) 10 | path = Pathname.new(podfile_dir_path) 11 | raise 'absolute path is needed' unless path.absolute? 12 | 13 | Dir.chdir(podfile_dir_path) do 14 | analyze_with_podfile( 15 | path, 16 | Pod::Podfile.from_file(path + 'Podfile'), 17 | Pod::Lockfile.from_file(path + 'Podfile.lock') 18 | ) 19 | end 20 | end 21 | 22 | def self.podfile_dependencies(podfile) 23 | res = [] 24 | podfile.root_target_definitions.each do |td| 25 | children_definitions = td.recursive_children 26 | children_definitions.each do |cd| 27 | dependencies_hash_array = cd.send(:get_hash_value, 'dependencies') 28 | next if dependencies_hash_array.nil? || dependencies_hash_array.count.zero? 29 | 30 | dependencies_hash_array.each do |item| 31 | next if item.class.name != 'Hash' 32 | 33 | item.each do |name, _| 34 | res.push name 35 | end 36 | end 37 | end 38 | end 39 | res 40 | end 41 | 42 | def self.analyze_with_podfile(_podfile_dir_path, podfile, lockfile = nil) 43 | if _podfile_dir_path 44 | sandbox = Dir.mktmpdir 45 | else 46 | sandbox = Dir.pwd + '/Pods' 47 | end 48 | analyzer = Pod::Installer::Analyzer.new( 49 | Pod::Sandbox.new(sandbox), 50 | podfile, 51 | lockfile 52 | ) 53 | 54 | specifications = analyzer.analyze.specifications.map(&:root).uniq 55 | 56 | podfile_dependencies = podfile_dependencies(podfile) 57 | 58 | map = {} 59 | specifications.each do |s| 60 | map[s.name] = if s.default_subspecs.count > 0 61 | subspecs_with_name(s, s.default_subspecs) + s.dependencies 62 | else 63 | s.subspecs + s.dependencies 64 | end 65 | subspecs_in_podfile = podfile_dependencies.select { |pd| pd.split('/')[0] == s.name } 66 | sp = subspecs_in_podfile.map { |sip| s.subspecs.find { |ss| ss.name == sip } }.compact 67 | map[s.name] = sp if sp.count != 0 68 | s.subspecs.each do |ss| 69 | map[ss.name] = ss.dependencies 70 | end 71 | end 72 | 73 | # for performance 74 | dependencies_map = {} 75 | specifications.each do |s| 76 | dependencies_map[s.name] = s 77 | end 78 | 79 | new_map = {} 80 | specifications.each do |s| 81 | new_map[s.name] = find_dependencies(s.name, map, [], dependencies_map, s.name).uniq.sort 82 | end 83 | 84 | new_map 85 | end 86 | 87 | def self.find_dependencies(name, map, res, dependencies_map, root_name) 88 | return unless map[name] 89 | 90 | map[name].each do |k| 91 | find_dependencies(k.name, map, res, dependencies_map, root_name) 92 | dependency = dependencies_map[k.name.split('/')[0]] 93 | res.push dependency.name if dependency && dependency.name != root_name 94 | end 95 | res 96 | end 97 | 98 | def self.subspecs_with_name(spec, subspecs_short_names) 99 | subspecs_short_names.map do |name| 100 | spec.subspecs.find { |ss| ss.name.include? name } 101 | end 102 | end 103 | end 104 | end 105 | -------------------------------------------------------------------------------- /lib/cocoapods-dependency/command.rb: -------------------------------------------------------------------------------- 1 | require 'cocoapods-dependency/command/dependency' 2 | -------------------------------------------------------------------------------- /lib/cocoapods-dependency/command/dependency.rb: -------------------------------------------------------------------------------- 1 | require 'cocoapods-dependency/analyze' 2 | require 'pp' 3 | require 'cocoapods-dependency/visual_out' 4 | require 'tmpdir' 5 | 6 | module Pod 7 | class Command 8 | 9 | class Dependency < Command 10 | self.summary = 'Analyzes the dependencies of any cocoapods projects.' 11 | 12 | self.description = <<-DESC 13 | Analyzes the dependencies of any cocoapods projects. Subspecs are properly handled. 14 | DESC 15 | 16 | def initialize(argv) 17 | @using_visual_output = argv.flag?('visual', false) 18 | super 19 | end 20 | 21 | def self.options 22 | [ 23 | ['--visual', 'Output the result using html'], 24 | ].concat(super) 25 | end 26 | 27 | def validate! 28 | super 29 | verify_podfile_exists! 30 | end 31 | 32 | def run 33 | analyze_result = CocoapodsDependency::Analyzer.analyze_with_podfile(nil, config.podfile) 34 | if @using_visual_output 35 | helper = CocoapodsDependency::VisualOutHelper.new(analyze_result) 36 | final_path = Dir.tmpdir 37 | helper.write_json_to_file("#{final_path}/index.json") 38 | html_path = File.expand_path("../resources/index.html", __dir__) 39 | system "cp #{html_path} #{final_path}" 40 | final_html_path = "#{final_path}/index.html" 41 | puts "[CocoapodsDependency] ✅ html file generated at path #{final_html_path}" 42 | system "open #{final_html_path}" 43 | else 44 | pp analyze_result 45 | end 46 | end 47 | end 48 | end 49 | end 50 | -------------------------------------------------------------------------------- /lib/cocoapods-dependency/resources/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Dependency Checker for CocoaPods Projects 7 | 33 | 34 | 35 | 36 | 37 | 99 | 100 | 101 | 102 | 105 |
106 |
107 |
108 | 109 | 110 | 111 | -------------------------------------------------------------------------------- /lib/cocoapods-dependency/version.rb: -------------------------------------------------------------------------------- 1 | # :nocov: 2 | module CocoapodsDependency 3 | VERSION = '0.2.0' 4 | end 5 | -------------------------------------------------------------------------------- /lib/cocoapods-dependency/visual_out.rb: -------------------------------------------------------------------------------- 1 | require 'json' 2 | require 'yaml' 3 | require 'cocoapods' 4 | module CocoapodsDependency 5 | class VisualOutHelper 6 | def initialize(dependency_map) 7 | @dependency_map = dependency_map 8 | end 9 | 10 | def to_d3js_json 11 | json = {} 12 | links = [] 13 | @dependency_map.each do |node, v| 14 | v.each do |dependency| 15 | links.push( 16 | { 17 | 'source': node, 18 | 'dest': dependency, 19 | } 20 | ) 21 | end 22 | end 23 | 24 | json['links'] = links 25 | 26 | JSON.pretty_generate(json) 27 | end 28 | 29 | def write_json_to_file(path) 30 | links = [] 31 | json = {} 32 | @dependency_map.each do |node, v| 33 | links.push( 34 | { 35 | 'source': node, 36 | 'dependencies': v, 37 | } 38 | ) 39 | end 40 | json['links'] = links 41 | json_result = JSON.pretty_generate(json) 42 | File.write(path, json_result) 43 | end 44 | 45 | def write_d3js_to_file(path) 46 | json = 'var dependencies = ' + to_d3js_json 47 | File.write(path, json) 48 | end 49 | end 50 | end 51 | -------------------------------------------------------------------------------- /lib/cocoapods_plugin.rb: -------------------------------------------------------------------------------- 1 | require 'cocoapods-dependency/command' 2 | -------------------------------------------------------------------------------- /showcase.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/X140Yu/cocoapods-dependency/6100886d7b9834eddc3ce470d554f7bf56ae86e4/showcase.gif -------------------------------------------------------------------------------- /spec/cocoapods/Fixtures/Test/Podfile: -------------------------------------------------------------------------------- 1 | # Uncomment the next line to define a global platform for your project 2 | # platform :ios, '9.0' 3 | 4 | target 'Test' do 5 | # Uncomment the next line if you're using Swift or would like to use dynamic frameworks 6 | # use_frameworks! 7 | 8 | # Pods for Test 9 | 10 | end 11 | -------------------------------------------------------------------------------- /spec/cocoapods/Fixtures/Test/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODFILE CHECKSUM: f9cae7b789afd8c9d5f455a6066e7416d4e9046d 2 | 3 | COCOAPODS: 1.5.3 4 | -------------------------------------------------------------------------------- /spec/cocoapods/Fixtures/Test/Pods/Manifest.lock: -------------------------------------------------------------------------------- 1 | PODFILE CHECKSUM: f9cae7b789afd8c9d5f455a6066e7416d4e9046d 2 | 3 | COCOAPODS: 1.5.3 4 | -------------------------------------------------------------------------------- /spec/cocoapods/Fixtures/Test/Pods/Pods.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 50; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | A69B7AB3DA026FF585A71CC390A7695E /* Pods-Test-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 34AB7A009B93A7F6124CD64F7BE67F24 /* Pods-Test-dummy.m */; }; 11 | /* End PBXBuildFile section */ 12 | 13 | /* Begin PBXFileReference section */ 14 | 057B9B5664EBDF99F445A06963F992B8 /* Pods-Test-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-Test-resources.sh"; sourceTree = ""; }; 15 | 2A72899288972745BA643575E877AECE /* Pods-Test-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-Test-frameworks.sh"; sourceTree = ""; }; 16 | 2F1C5FEB70200C53A4C15811385BF48A /* Pods-Test.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Test.release.xcconfig"; sourceTree = ""; }; 17 | 34AB7A009B93A7F6124CD64F7BE67F24 /* Pods-Test-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-Test-dummy.m"; sourceTree = ""; }; 18 | 920A10832FB38D2B738C95033142D121 /* Pods-Test-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-Test-acknowledgements.markdown"; sourceTree = ""; }; 19 | 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 20 | A7AA39B4814E3A0DB306B10448351606 /* libPods-Test.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = "libPods-Test.a"; path = "libPods-Test.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 21 | C442E78EFBB15674D4706AC69D8FA5A1 /* Pods-Test.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Test.debug.xcconfig"; sourceTree = ""; }; 22 | E8812030B1AE14904E7DC404AEC19EE8 /* Pods-Test-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-Test-acknowledgements.plist"; sourceTree = ""; }; 23 | /* End PBXFileReference section */ 24 | 25 | /* Begin PBXFrameworksBuildPhase section */ 26 | 4313DA02B93167649C16D6F9AC0E1B25 /* Frameworks */ = { 27 | isa = PBXFrameworksBuildPhase; 28 | buildActionMask = 2147483647; 29 | files = ( 30 | ); 31 | runOnlyForDeploymentPostprocessing = 0; 32 | }; 33 | /* End PBXFrameworksBuildPhase section */ 34 | 35 | /* Begin PBXGroup section */ 36 | 0F8D2E47FE03D3B91B51069F7C273AF4 /* Frameworks */ = { 37 | isa = PBXGroup; 38 | children = ( 39 | ); 40 | name = Frameworks; 41 | sourceTree = ""; 42 | }; 43 | 49F38B3D50C8530F2E5FB5F7E061DC2C /* Targets Support Files */ = { 44 | isa = PBXGroup; 45 | children = ( 46 | E0A0E26B136B48EB6AFD179870B6C87F /* Pods-Test */, 47 | ); 48 | name = "Targets Support Files"; 49 | sourceTree = ""; 50 | }; 51 | 63F6A7F1D0CF3EDD889BDC319837D5CC /* Products */ = { 52 | isa = PBXGroup; 53 | children = ( 54 | A7AA39B4814E3A0DB306B10448351606 /* libPods-Test.a */, 55 | ); 56 | name = Products; 57 | sourceTree = ""; 58 | }; 59 | 7DB346D0F39D3F0E887471402A8071AB = { 60 | isa = PBXGroup; 61 | children = ( 62 | 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */, 63 | 0F8D2E47FE03D3B91B51069F7C273AF4 /* Frameworks */, 64 | 63F6A7F1D0CF3EDD889BDC319837D5CC /* Products */, 65 | 49F38B3D50C8530F2E5FB5F7E061DC2C /* Targets Support Files */, 66 | ); 67 | sourceTree = ""; 68 | }; 69 | E0A0E26B136B48EB6AFD179870B6C87F /* Pods-Test */ = { 70 | isa = PBXGroup; 71 | children = ( 72 | 920A10832FB38D2B738C95033142D121 /* Pods-Test-acknowledgements.markdown */, 73 | E8812030B1AE14904E7DC404AEC19EE8 /* Pods-Test-acknowledgements.plist */, 74 | 34AB7A009B93A7F6124CD64F7BE67F24 /* Pods-Test-dummy.m */, 75 | 2A72899288972745BA643575E877AECE /* Pods-Test-frameworks.sh */, 76 | 057B9B5664EBDF99F445A06963F992B8 /* Pods-Test-resources.sh */, 77 | C442E78EFBB15674D4706AC69D8FA5A1 /* Pods-Test.debug.xcconfig */, 78 | 2F1C5FEB70200C53A4C15811385BF48A /* Pods-Test.release.xcconfig */, 79 | ); 80 | name = "Pods-Test"; 81 | path = "Target Support Files/Pods-Test"; 82 | sourceTree = ""; 83 | }; 84 | /* End PBXGroup section */ 85 | 86 | /* Begin PBXHeadersBuildPhase section */ 87 | 9C74E3CEC8CD24ACCA79B131E359247C /* Headers */ = { 88 | isa = PBXHeadersBuildPhase; 89 | buildActionMask = 2147483647; 90 | files = ( 91 | ); 92 | runOnlyForDeploymentPostprocessing = 0; 93 | }; 94 | /* End PBXHeadersBuildPhase section */ 95 | 96 | /* Begin PBXNativeTarget section */ 97 | 2B04E78BB41C1199B3DCBE4A3E7A8333 /* Pods-Test */ = { 98 | isa = PBXNativeTarget; 99 | buildConfigurationList = 1C4DACFE44D40D9FAB29E976DECC32A6 /* Build configuration list for PBXNativeTarget "Pods-Test" */; 100 | buildPhases = ( 101 | 9C74E3CEC8CD24ACCA79B131E359247C /* Headers */, 102 | C22431D4ED1970403A7B5C82A6D708C3 /* Sources */, 103 | 4313DA02B93167649C16D6F9AC0E1B25 /* Frameworks */, 104 | ); 105 | buildRules = ( 106 | ); 107 | dependencies = ( 108 | ); 109 | name = "Pods-Test"; 110 | productName = "Pods-Test"; 111 | productReference = A7AA39B4814E3A0DB306B10448351606 /* libPods-Test.a */; 112 | productType = "com.apple.product-type.library.static"; 113 | }; 114 | /* End PBXNativeTarget section */ 115 | 116 | /* Begin PBXProject section */ 117 | D41D8CD98F00B204E9800998ECF8427E /* Project object */ = { 118 | isa = PBXProject; 119 | attributes = { 120 | LastSwiftUpdateCheck = 0930; 121 | LastUpgradeCheck = 0930; 122 | }; 123 | buildConfigurationList = 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */; 124 | compatibilityVersion = "Xcode 3.2"; 125 | developmentRegion = English; 126 | hasScannedForEncodings = 0; 127 | knownRegions = ( 128 | en, 129 | ); 130 | mainGroup = 7DB346D0F39D3F0E887471402A8071AB; 131 | productRefGroup = 63F6A7F1D0CF3EDD889BDC319837D5CC /* Products */; 132 | projectDirPath = ""; 133 | projectRoot = ""; 134 | targets = ( 135 | 2B04E78BB41C1199B3DCBE4A3E7A8333 /* Pods-Test */, 136 | ); 137 | }; 138 | /* End PBXProject section */ 139 | 140 | /* Begin PBXSourcesBuildPhase section */ 141 | C22431D4ED1970403A7B5C82A6D708C3 /* Sources */ = { 142 | isa = PBXSourcesBuildPhase; 143 | buildActionMask = 2147483647; 144 | files = ( 145 | A69B7AB3DA026FF585A71CC390A7695E /* Pods-Test-dummy.m in Sources */, 146 | ); 147 | runOnlyForDeploymentPostprocessing = 0; 148 | }; 149 | /* End PBXSourcesBuildPhase section */ 150 | 151 | /* Begin XCBuildConfiguration section */ 152 | 007F1066051A467FBEB0038594E9D7C2 /* Release */ = { 153 | isa = XCBuildConfiguration; 154 | buildSettings = { 155 | ALWAYS_SEARCH_USER_PATHS = NO; 156 | CLANG_ANALYZER_NONNULL = YES; 157 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 158 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 159 | CLANG_CXX_LIBRARY = "libc++"; 160 | CLANG_ENABLE_MODULES = YES; 161 | CLANG_ENABLE_OBJC_ARC = YES; 162 | CLANG_ENABLE_OBJC_WEAK = YES; 163 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 164 | CLANG_WARN_BOOL_CONVERSION = YES; 165 | CLANG_WARN_COMMA = YES; 166 | CLANG_WARN_CONSTANT_CONVERSION = YES; 167 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 168 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 169 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 170 | CLANG_WARN_EMPTY_BODY = YES; 171 | CLANG_WARN_ENUM_CONVERSION = YES; 172 | CLANG_WARN_INFINITE_RECURSION = YES; 173 | CLANG_WARN_INT_CONVERSION = YES; 174 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 175 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 176 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 177 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 178 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 179 | CLANG_WARN_STRICT_PROTOTYPES = YES; 180 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 181 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 182 | CLANG_WARN_UNREACHABLE_CODE = YES; 183 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 184 | CODE_SIGNING_ALLOWED = NO; 185 | CODE_SIGNING_REQUIRED = NO; 186 | COPY_PHASE_STRIP = NO; 187 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 188 | ENABLE_NS_ASSERTIONS = NO; 189 | ENABLE_STRICT_OBJC_MSGSEND = YES; 190 | GCC_C_LANGUAGE_STANDARD = gnu11; 191 | GCC_NO_COMMON_BLOCKS = YES; 192 | GCC_PREPROCESSOR_DEFINITIONS = ( 193 | "POD_CONFIGURATION_RELEASE=1", 194 | "$(inherited)", 195 | ); 196 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 197 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 198 | GCC_WARN_UNDECLARED_SELECTOR = YES; 199 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 200 | GCC_WARN_UNUSED_FUNCTION = YES; 201 | GCC_WARN_UNUSED_VARIABLE = YES; 202 | IPHONEOS_DEPLOYMENT_TARGET = 11.4; 203 | MTL_ENABLE_DEBUG_INFO = NO; 204 | MTL_FAST_MATH = YES; 205 | PRODUCT_NAME = "$(TARGET_NAME)"; 206 | STRIP_INSTALLED_PRODUCT = NO; 207 | SYMROOT = "${SRCROOT}/../build"; 208 | }; 209 | name = Release; 210 | }; 211 | 8F09BB92731F0DC8EB4F6E9E24F36EEA /* Release */ = { 212 | isa = XCBuildConfiguration; 213 | baseConfigurationReference = 2F1C5FEB70200C53A4C15811385BF48A /* Pods-Test.release.xcconfig */; 214 | buildSettings = { 215 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 216 | CLANG_ENABLE_OBJC_WEAK = NO; 217 | CODE_SIGN_IDENTITY = "iPhone Developer"; 218 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 219 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 220 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 221 | IPHONEOS_DEPLOYMENT_TARGET = 11.4; 222 | MACH_O_TYPE = staticlib; 223 | OTHER_LDFLAGS = ""; 224 | OTHER_LIBTOOLFLAGS = ""; 225 | PODS_ROOT = "$(SRCROOT)"; 226 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 227 | SDKROOT = iphoneos; 228 | SKIP_INSTALL = YES; 229 | TARGETED_DEVICE_FAMILY = "1,2"; 230 | VALIDATE_PRODUCT = YES; 231 | }; 232 | name = Release; 233 | }; 234 | E246FC26AF4A9832D7AA01080188D618 /* Debug */ = { 235 | isa = XCBuildConfiguration; 236 | buildSettings = { 237 | ALWAYS_SEARCH_USER_PATHS = NO; 238 | CLANG_ANALYZER_NONNULL = YES; 239 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 240 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 241 | CLANG_CXX_LIBRARY = "libc++"; 242 | CLANG_ENABLE_MODULES = YES; 243 | CLANG_ENABLE_OBJC_ARC = YES; 244 | CLANG_ENABLE_OBJC_WEAK = YES; 245 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 246 | CLANG_WARN_BOOL_CONVERSION = YES; 247 | CLANG_WARN_COMMA = YES; 248 | CLANG_WARN_CONSTANT_CONVERSION = YES; 249 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 250 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 251 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 252 | CLANG_WARN_EMPTY_BODY = YES; 253 | CLANG_WARN_ENUM_CONVERSION = YES; 254 | CLANG_WARN_INFINITE_RECURSION = YES; 255 | CLANG_WARN_INT_CONVERSION = YES; 256 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 257 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 258 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 259 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 260 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 261 | CLANG_WARN_STRICT_PROTOTYPES = YES; 262 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 263 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 264 | CLANG_WARN_UNREACHABLE_CODE = YES; 265 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 266 | CODE_SIGNING_ALLOWED = NO; 267 | CODE_SIGNING_REQUIRED = NO; 268 | COPY_PHASE_STRIP = NO; 269 | DEBUG_INFORMATION_FORMAT = dwarf; 270 | ENABLE_STRICT_OBJC_MSGSEND = YES; 271 | ENABLE_TESTABILITY = YES; 272 | GCC_C_LANGUAGE_STANDARD = gnu11; 273 | GCC_DYNAMIC_NO_PIC = NO; 274 | GCC_NO_COMMON_BLOCKS = YES; 275 | GCC_OPTIMIZATION_LEVEL = 0; 276 | GCC_PREPROCESSOR_DEFINITIONS = ( 277 | "POD_CONFIGURATION_DEBUG=1", 278 | "DEBUG=1", 279 | "$(inherited)", 280 | ); 281 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 282 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 283 | GCC_WARN_UNDECLARED_SELECTOR = YES; 284 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 285 | GCC_WARN_UNUSED_FUNCTION = YES; 286 | GCC_WARN_UNUSED_VARIABLE = YES; 287 | IPHONEOS_DEPLOYMENT_TARGET = 11.4; 288 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 289 | MTL_FAST_MATH = YES; 290 | ONLY_ACTIVE_ARCH = YES; 291 | PRODUCT_NAME = "$(TARGET_NAME)"; 292 | STRIP_INSTALLED_PRODUCT = NO; 293 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 294 | SYMROOT = "${SRCROOT}/../build"; 295 | }; 296 | name = Debug; 297 | }; 298 | FA4297C2E155A7943B47A016D09B2FEE /* Debug */ = { 299 | isa = XCBuildConfiguration; 300 | baseConfigurationReference = C442E78EFBB15674D4706AC69D8FA5A1 /* Pods-Test.debug.xcconfig */; 301 | buildSettings = { 302 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 303 | CLANG_ENABLE_OBJC_WEAK = NO; 304 | CODE_SIGN_IDENTITY = "iPhone Developer"; 305 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 306 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 307 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 308 | IPHONEOS_DEPLOYMENT_TARGET = 11.4; 309 | MACH_O_TYPE = staticlib; 310 | OTHER_LDFLAGS = ""; 311 | OTHER_LIBTOOLFLAGS = ""; 312 | PODS_ROOT = "$(SRCROOT)"; 313 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 314 | SDKROOT = iphoneos; 315 | SKIP_INSTALL = YES; 316 | TARGETED_DEVICE_FAMILY = "1,2"; 317 | }; 318 | name = Debug; 319 | }; 320 | /* End XCBuildConfiguration section */ 321 | 322 | /* Begin XCConfigurationList section */ 323 | 1C4DACFE44D40D9FAB29E976DECC32A6 /* Build configuration list for PBXNativeTarget "Pods-Test" */ = { 324 | isa = XCConfigurationList; 325 | buildConfigurations = ( 326 | FA4297C2E155A7943B47A016D09B2FEE /* Debug */, 327 | 8F09BB92731F0DC8EB4F6E9E24F36EEA /* Release */, 328 | ); 329 | defaultConfigurationIsVisible = 0; 330 | defaultConfigurationName = Release; 331 | }; 332 | 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { 333 | isa = XCConfigurationList; 334 | buildConfigurations = ( 335 | E246FC26AF4A9832D7AA01080188D618 /* Debug */, 336 | 007F1066051A467FBEB0038594E9D7C2 /* Release */, 337 | ); 338 | defaultConfigurationIsVisible = 0; 339 | defaultConfigurationName = Release; 340 | }; 341 | /* End XCConfigurationList section */ 342 | }; 343 | rootObject = D41D8CD98F00B204E9800998ECF8427E /* Project object */; 344 | } 345 | -------------------------------------------------------------------------------- /spec/cocoapods/Fixtures/Test/Pods/Pods.xcodeproj/xcuserdata/x140yu.xcuserdatad/xcschemes/Pods-Test.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 43 | 44 | 45 | 46 | 52 | 53 | 55 | 56 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /spec/cocoapods/Fixtures/Test/Pods/Pods.xcodeproj/xcuserdata/x140yu.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | Pods-Test.xcscheme 8 | 9 | isShown 10 | 11 | orderHint 12 | 0 13 | 14 | 15 | SuppressBuildableAutocreation 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /spec/cocoapods/Fixtures/Test/Pods/Target Support Files/Pods-Test/Pods-Test-acknowledgements.markdown: -------------------------------------------------------------------------------- 1 | # Acknowledgements 2 | This application makes use of the following third party libraries: 3 | Generated by CocoaPods - https://cocoapods.org 4 | -------------------------------------------------------------------------------- /spec/cocoapods/Fixtures/Test/Pods/Target Support Files/Pods-Test/Pods-Test-acknowledgements.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | This application makes use of the following third party libraries: 10 | Title 11 | Acknowledgements 12 | Type 13 | PSGroupSpecifier 14 | 15 | 16 | FooterText 17 | Generated by CocoaPods - https://cocoapods.org 18 | Title 19 | 20 | Type 21 | PSGroupSpecifier 22 | 23 | 24 | StringsTable 25 | Acknowledgements 26 | Title 27 | Acknowledgements 28 | 29 | 30 | -------------------------------------------------------------------------------- /spec/cocoapods/Fixtures/Test/Pods/Target Support Files/Pods-Test/Pods-Test-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_Test : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_Test 5 | @end 6 | -------------------------------------------------------------------------------- /spec/cocoapods/Fixtures/Test/Pods/Target Support Files/Pods-Test/Pods-Test-frameworks.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | set -u 4 | set -o pipefail 5 | 6 | if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then 7 | # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy 8 | # frameworks to, so exit 0 (signalling the script phase was successful). 9 | exit 0 10 | fi 11 | 12 | echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 13 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 14 | 15 | COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}" 16 | SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" 17 | 18 | # Used as a return value for each invocation of `strip_invalid_archs` function. 19 | STRIP_BINARY_RETVAL=0 20 | 21 | # This protects against multiple targets copying the same framework dependency at the same time. The solution 22 | # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html 23 | RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") 24 | 25 | # Copies and strips a vendored framework 26 | install_framework() 27 | { 28 | if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then 29 | local source="${BUILT_PRODUCTS_DIR}/$1" 30 | elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then 31 | local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" 32 | elif [ -r "$1" ]; then 33 | local source="$1" 34 | fi 35 | 36 | local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 37 | 38 | if [ -L "${source}" ]; then 39 | echo "Symlinked..." 40 | source="$(readlink "${source}")" 41 | fi 42 | 43 | # Use filter instead of exclude so missing patterns don't throw errors. 44 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" 45 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" 46 | 47 | local basename 48 | basename="$(basename -s .framework "$1")" 49 | binary="${destination}/${basename}.framework/${basename}" 50 | if ! [ -r "$binary" ]; then 51 | binary="${destination}/${basename}" 52 | fi 53 | 54 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 55 | if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then 56 | strip_invalid_archs "$binary" 57 | fi 58 | 59 | # Resign the code if required by the build settings to avoid unstable apps 60 | code_sign_if_enabled "${destination}/$(basename "$1")" 61 | 62 | # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. 63 | if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then 64 | local swift_runtime_libs 65 | swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]}) 66 | for lib in $swift_runtime_libs; do 67 | echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" 68 | rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" 69 | code_sign_if_enabled "${destination}/${lib}" 70 | done 71 | fi 72 | } 73 | 74 | # Copies and strips a vendored dSYM 75 | install_dsym() { 76 | local source="$1" 77 | if [ -r "$source" ]; then 78 | # Copy the dSYM into a the targets temp dir. 79 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\"" 80 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}" 81 | 82 | local basename 83 | basename="$(basename -s .framework.dSYM "$source")" 84 | binary="${DERIVED_FILES_DIR}/${basename}.framework.dSYM/Contents/Resources/DWARF/${basename}" 85 | 86 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 87 | if [[ "$(file "$binary")" == *"Mach-O dSYM companion"* ]]; then 88 | strip_invalid_archs "$binary" 89 | fi 90 | 91 | if [[ $STRIP_BINARY_RETVAL == 1 ]]; then 92 | # Move the stripped file into its final destination. 93 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"" 94 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.framework.dSYM" "${DWARF_DSYM_FOLDER_PATH}" 95 | else 96 | # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing. 97 | touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.framework.dSYM" 98 | fi 99 | fi 100 | } 101 | 102 | # Signs a framework with the provided identity 103 | code_sign_if_enabled() { 104 | if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then 105 | # Use the current code_sign_identitiy 106 | echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" 107 | local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" 108 | 109 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 110 | code_sign_cmd="$code_sign_cmd &" 111 | fi 112 | echo "$code_sign_cmd" 113 | eval "$code_sign_cmd" 114 | fi 115 | } 116 | 117 | # Strip invalid architectures 118 | strip_invalid_archs() { 119 | binary="$1" 120 | # Get architectures for current target binary 121 | binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)" 122 | # Intersect them with the architectures we are building for 123 | intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)" 124 | # If there are no archs supported by this binary then warn the user 125 | if [[ -z "$intersected_archs" ]]; then 126 | echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." 127 | STRIP_BINARY_RETVAL=0 128 | return 129 | fi 130 | stripped="" 131 | for arch in $binary_archs; do 132 | if ! [[ "${ARCHS}" == *"$arch"* ]]; then 133 | # Strip non-valid architectures in-place 134 | lipo -remove "$arch" -output "$binary" "$binary" || exit 1 135 | stripped="$stripped $arch" 136 | fi 137 | done 138 | if [[ "$stripped" ]]; then 139 | echo "Stripped $binary of architectures:$stripped" 140 | fi 141 | STRIP_BINARY_RETVAL=1 142 | } 143 | 144 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 145 | wait 146 | fi 147 | -------------------------------------------------------------------------------- /spec/cocoapods/Fixtures/Test/Pods/Target Support Files/Pods-Test/Pods-Test-resources.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | set -u 4 | set -o pipefail 5 | 6 | if [ -z ${UNLOCALIZED_RESOURCES_FOLDER_PATH+x} ]; then 7 | # If UNLOCALIZED_RESOURCES_FOLDER_PATH is not set, then there's nowhere for us to copy 8 | # resources to, so exit 0 (signalling the script phase was successful). 9 | exit 0 10 | fi 11 | 12 | mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 13 | 14 | RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt 15 | > "$RESOURCES_TO_COPY" 16 | 17 | XCASSET_FILES=() 18 | 19 | # This protects against multiple targets copying the same framework dependency at the same time. The solution 20 | # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html 21 | RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") 22 | 23 | case "${TARGETED_DEVICE_FAMILY:-}" in 24 | 1,2) 25 | TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" 26 | ;; 27 | 1) 28 | TARGET_DEVICE_ARGS="--target-device iphone" 29 | ;; 30 | 2) 31 | TARGET_DEVICE_ARGS="--target-device ipad" 32 | ;; 33 | 3) 34 | TARGET_DEVICE_ARGS="--target-device tv" 35 | ;; 36 | 4) 37 | TARGET_DEVICE_ARGS="--target-device watch" 38 | ;; 39 | *) 40 | TARGET_DEVICE_ARGS="--target-device mac" 41 | ;; 42 | esac 43 | 44 | install_resource() 45 | { 46 | if [[ "$1" = /* ]] ; then 47 | RESOURCE_PATH="$1" 48 | else 49 | RESOURCE_PATH="${PODS_ROOT}/$1" 50 | fi 51 | if [[ ! -e "$RESOURCE_PATH" ]] ; then 52 | cat << EOM 53 | error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script. 54 | EOM 55 | exit 1 56 | fi 57 | case $RESOURCE_PATH in 58 | *.storyboard) 59 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true 60 | ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} 61 | ;; 62 | *.xib) 63 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true 64 | ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} 65 | ;; 66 | *.framework) 67 | echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true 68 | mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 69 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true 70 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 71 | ;; 72 | *.xcdatamodel) 73 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" || true 74 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" 75 | ;; 76 | *.xcdatamodeld) 77 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" || true 78 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" 79 | ;; 80 | *.xcmappingmodel) 81 | echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" || true 82 | xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" 83 | ;; 84 | *.xcassets) 85 | ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH" 86 | XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") 87 | ;; 88 | *) 89 | echo "$RESOURCE_PATH" || true 90 | echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" 91 | ;; 92 | esac 93 | } 94 | 95 | mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 96 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 97 | if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then 98 | mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 99 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 100 | fi 101 | rm -f "$RESOURCES_TO_COPY" 102 | 103 | if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "${XCASSET_FILES:-}" ] 104 | then 105 | # Find all other xcassets (this unfortunately includes those of path pods and other targets). 106 | OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) 107 | while read line; do 108 | if [[ $line != "${PODS_ROOT}*" ]]; then 109 | XCASSET_FILES+=("$line") 110 | fi 111 | done <<<"$OTHER_XCASSETS" 112 | 113 | if [ -z ${ASSETCATALOG_COMPILER_APPICON_NAME+x} ]; then 114 | printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 115 | else 116 | printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" --app-icon "${ASSETCATALOG_COMPILER_APPICON_NAME}" --output-partial-info-plist "${TARGET_TEMP_DIR}/assetcatalog_generated_info_cocoapods.plist" 117 | fi 118 | fi 119 | -------------------------------------------------------------------------------- /spec/cocoapods/Fixtures/Test/Pods/Target Support Files/Pods-Test/Pods-Test.debug.xcconfig: -------------------------------------------------------------------------------- 1 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 2 | OTHER_LDFLAGS = $(inherited) -ObjC 3 | PODS_BUILD_DIR = ${BUILD_DIR} 4 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 5 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 6 | PODS_ROOT = ${SRCROOT}/Pods 7 | -------------------------------------------------------------------------------- /spec/cocoapods/Fixtures/Test/Pods/Target Support Files/Pods-Test/Pods-Test.release.xcconfig: -------------------------------------------------------------------------------- 1 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 2 | OTHER_LDFLAGS = $(inherited) -ObjC 3 | PODS_BUILD_DIR = ${BUILD_DIR} 4 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 5 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 6 | PODS_ROOT = ${SRCROOT}/Pods 7 | -------------------------------------------------------------------------------- /spec/cocoapods/Fixtures/Test/Test.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 50; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 98AC7E8273A5639693B1B50F /* libPods-Test.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B5CCD72E2D3BAB561C26BD49 /* libPods-Test.a */; }; 11 | A8B8BCF42133AE0900C776CF /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = A8B8BCF32133AE0900C776CF /* AppDelegate.m */; }; 12 | A8B8BCF72133AE0900C776CF /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A8B8BCF62133AE0900C776CF /* ViewController.m */; }; 13 | A8B8BCFA2133AE0900C776CF /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A8B8BCF82133AE0900C776CF /* Main.storyboard */; }; 14 | A8B8BCFC2133AE0A00C776CF /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A8B8BCFB2133AE0A00C776CF /* Assets.xcassets */; }; 15 | A8B8BCFF2133AE0A00C776CF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A8B8BCFD2133AE0A00C776CF /* LaunchScreen.storyboard */; }; 16 | A8B8BD022133AE0A00C776CF /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = A8B8BD012133AE0A00C776CF /* main.m */; }; 17 | /* End PBXBuildFile section */ 18 | 19 | /* Begin PBXFileReference section */ 20 | 76CAE2C15916EDE5D0F80FA6 /* Pods-Test.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Test.release.xcconfig"; path = "Pods/Target Support Files/Pods-Test/Pods-Test.release.xcconfig"; sourceTree = ""; }; 21 | A8B8BCEF2133AE0900C776CF /* Test.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Test.app; sourceTree = BUILT_PRODUCTS_DIR; }; 22 | A8B8BCF22133AE0900C776CF /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 23 | A8B8BCF32133AE0900C776CF /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 24 | A8B8BCF52133AE0900C776CF /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; 25 | A8B8BCF62133AE0900C776CF /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; 26 | A8B8BCF92133AE0900C776CF /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 27 | A8B8BCFB2133AE0A00C776CF /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 28 | A8B8BCFE2133AE0A00C776CF /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 29 | A8B8BD002133AE0A00C776CF /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 30 | A8B8BD012133AE0A00C776CF /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 31 | B5CCD72E2D3BAB561C26BD49 /* libPods-Test.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Test.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 32 | C87517BA379E02964F623E82 /* Pods-Test.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Test.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Test/Pods-Test.debug.xcconfig"; sourceTree = ""; }; 33 | /* End PBXFileReference section */ 34 | 35 | /* Begin PBXFrameworksBuildPhase section */ 36 | A8B8BCEC2133AE0900C776CF /* Frameworks */ = { 37 | isa = PBXFrameworksBuildPhase; 38 | buildActionMask = 2147483647; 39 | files = ( 40 | 98AC7E8273A5639693B1B50F /* libPods-Test.a in Frameworks */, 41 | ); 42 | runOnlyForDeploymentPostprocessing = 0; 43 | }; 44 | /* End PBXFrameworksBuildPhase section */ 45 | 46 | /* Begin PBXGroup section */ 47 | 08BBC7E88125A88873FF9EDF /* Pods */ = { 48 | isa = PBXGroup; 49 | children = ( 50 | C87517BA379E02964F623E82 /* Pods-Test.debug.xcconfig */, 51 | 76CAE2C15916EDE5D0F80FA6 /* Pods-Test.release.xcconfig */, 52 | ); 53 | name = Pods; 54 | sourceTree = ""; 55 | }; 56 | 9E3097DE6C76A5045E6B31C9 /* Frameworks */ = { 57 | isa = PBXGroup; 58 | children = ( 59 | B5CCD72E2D3BAB561C26BD49 /* libPods-Test.a */, 60 | ); 61 | name = Frameworks; 62 | sourceTree = ""; 63 | }; 64 | A8B8BCE62133AE0900C776CF = { 65 | isa = PBXGroup; 66 | children = ( 67 | A8B8BCF12133AE0900C776CF /* Test */, 68 | A8B8BCF02133AE0900C776CF /* Products */, 69 | 08BBC7E88125A88873FF9EDF /* Pods */, 70 | 9E3097DE6C76A5045E6B31C9 /* Frameworks */, 71 | ); 72 | sourceTree = ""; 73 | }; 74 | A8B8BCF02133AE0900C776CF /* Products */ = { 75 | isa = PBXGroup; 76 | children = ( 77 | A8B8BCEF2133AE0900C776CF /* Test.app */, 78 | ); 79 | name = Products; 80 | sourceTree = ""; 81 | }; 82 | A8B8BCF12133AE0900C776CF /* Test */ = { 83 | isa = PBXGroup; 84 | children = ( 85 | A8B8BCF22133AE0900C776CF /* AppDelegate.h */, 86 | A8B8BCF32133AE0900C776CF /* AppDelegate.m */, 87 | A8B8BCF52133AE0900C776CF /* ViewController.h */, 88 | A8B8BCF62133AE0900C776CF /* ViewController.m */, 89 | A8B8BCF82133AE0900C776CF /* Main.storyboard */, 90 | A8B8BCFB2133AE0A00C776CF /* Assets.xcassets */, 91 | A8B8BCFD2133AE0A00C776CF /* LaunchScreen.storyboard */, 92 | A8B8BD002133AE0A00C776CF /* Info.plist */, 93 | A8B8BD012133AE0A00C776CF /* main.m */, 94 | ); 95 | path = Test; 96 | sourceTree = ""; 97 | }; 98 | /* End PBXGroup section */ 99 | 100 | /* Begin PBXNativeTarget section */ 101 | A8B8BCEE2133AE0900C776CF /* Test */ = { 102 | isa = PBXNativeTarget; 103 | buildConfigurationList = A8B8BD052133AE0A00C776CF /* Build configuration list for PBXNativeTarget "Test" */; 104 | buildPhases = ( 105 | C5D5E2082AC06E6D1904E36C /* [CP] Check Pods Manifest.lock */, 106 | A8B8BCEB2133AE0900C776CF /* Sources */, 107 | A8B8BCEC2133AE0900C776CF /* Frameworks */, 108 | A8B8BCED2133AE0900C776CF /* Resources */, 109 | ); 110 | buildRules = ( 111 | ); 112 | dependencies = ( 113 | ); 114 | name = Test; 115 | productName = Test; 116 | productReference = A8B8BCEF2133AE0900C776CF /* Test.app */; 117 | productType = "com.apple.product-type.application"; 118 | }; 119 | /* End PBXNativeTarget section */ 120 | 121 | /* Begin PBXProject section */ 122 | A8B8BCE72133AE0900C776CF /* Project object */ = { 123 | isa = PBXProject; 124 | attributes = { 125 | LastUpgradeCheck = 0940; 126 | ORGANIZATIONNAME = "Xinyu Zhao"; 127 | TargetAttributes = { 128 | A8B8BCEE2133AE0900C776CF = { 129 | CreatedOnToolsVersion = 9.4.1; 130 | }; 131 | }; 132 | }; 133 | buildConfigurationList = A8B8BCEA2133AE0900C776CF /* Build configuration list for PBXProject "Test" */; 134 | compatibilityVersion = "Xcode 9.3"; 135 | developmentRegion = en; 136 | hasScannedForEncodings = 0; 137 | knownRegions = ( 138 | en, 139 | Base, 140 | ); 141 | mainGroup = A8B8BCE62133AE0900C776CF; 142 | productRefGroup = A8B8BCF02133AE0900C776CF /* Products */; 143 | projectDirPath = ""; 144 | projectRoot = ""; 145 | targets = ( 146 | A8B8BCEE2133AE0900C776CF /* Test */, 147 | ); 148 | }; 149 | /* End PBXProject section */ 150 | 151 | /* Begin PBXResourcesBuildPhase section */ 152 | A8B8BCED2133AE0900C776CF /* Resources */ = { 153 | isa = PBXResourcesBuildPhase; 154 | buildActionMask = 2147483647; 155 | files = ( 156 | A8B8BCFF2133AE0A00C776CF /* LaunchScreen.storyboard in Resources */, 157 | A8B8BCFC2133AE0A00C776CF /* Assets.xcassets in Resources */, 158 | A8B8BCFA2133AE0900C776CF /* Main.storyboard in Resources */, 159 | ); 160 | runOnlyForDeploymentPostprocessing = 0; 161 | }; 162 | /* End PBXResourcesBuildPhase section */ 163 | 164 | /* Begin PBXShellScriptBuildPhase section */ 165 | C5D5E2082AC06E6D1904E36C /* [CP] Check Pods Manifest.lock */ = { 166 | isa = PBXShellScriptBuildPhase; 167 | buildActionMask = 2147483647; 168 | files = ( 169 | ); 170 | inputFileListPaths = ( 171 | ); 172 | inputPaths = ( 173 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 174 | "${PODS_ROOT}/Manifest.lock", 175 | ); 176 | name = "[CP] Check Pods Manifest.lock"; 177 | outputFileListPaths = ( 178 | ); 179 | outputPaths = ( 180 | "$(DERIVED_FILE_DIR)/Pods-Test-checkManifestLockResult.txt", 181 | ); 182 | runOnlyForDeploymentPostprocessing = 0; 183 | shellPath = /bin/sh; 184 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 185 | showEnvVarsInLog = 0; 186 | }; 187 | /* End PBXShellScriptBuildPhase section */ 188 | 189 | /* Begin PBXSourcesBuildPhase section */ 190 | A8B8BCEB2133AE0900C776CF /* Sources */ = { 191 | isa = PBXSourcesBuildPhase; 192 | buildActionMask = 2147483647; 193 | files = ( 194 | A8B8BCF72133AE0900C776CF /* ViewController.m in Sources */, 195 | A8B8BD022133AE0A00C776CF /* main.m in Sources */, 196 | A8B8BCF42133AE0900C776CF /* AppDelegate.m in Sources */, 197 | ); 198 | runOnlyForDeploymentPostprocessing = 0; 199 | }; 200 | /* End PBXSourcesBuildPhase section */ 201 | 202 | /* Begin PBXVariantGroup section */ 203 | A8B8BCF82133AE0900C776CF /* Main.storyboard */ = { 204 | isa = PBXVariantGroup; 205 | children = ( 206 | A8B8BCF92133AE0900C776CF /* Base */, 207 | ); 208 | name = Main.storyboard; 209 | sourceTree = ""; 210 | }; 211 | A8B8BCFD2133AE0A00C776CF /* LaunchScreen.storyboard */ = { 212 | isa = PBXVariantGroup; 213 | children = ( 214 | A8B8BCFE2133AE0A00C776CF /* Base */, 215 | ); 216 | name = LaunchScreen.storyboard; 217 | sourceTree = ""; 218 | }; 219 | /* End PBXVariantGroup section */ 220 | 221 | /* Begin XCBuildConfiguration section */ 222 | A8B8BD032133AE0A00C776CF /* Debug */ = { 223 | isa = XCBuildConfiguration; 224 | buildSettings = { 225 | ALWAYS_SEARCH_USER_PATHS = NO; 226 | CLANG_ANALYZER_NONNULL = YES; 227 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 228 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 229 | CLANG_CXX_LIBRARY = "libc++"; 230 | CLANG_ENABLE_MODULES = YES; 231 | CLANG_ENABLE_OBJC_ARC = YES; 232 | CLANG_ENABLE_OBJC_WEAK = YES; 233 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 234 | CLANG_WARN_BOOL_CONVERSION = YES; 235 | CLANG_WARN_COMMA = YES; 236 | CLANG_WARN_CONSTANT_CONVERSION = YES; 237 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 238 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 239 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 240 | CLANG_WARN_EMPTY_BODY = YES; 241 | CLANG_WARN_ENUM_CONVERSION = YES; 242 | CLANG_WARN_INFINITE_RECURSION = YES; 243 | CLANG_WARN_INT_CONVERSION = YES; 244 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 245 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 246 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 247 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 248 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 249 | CLANG_WARN_STRICT_PROTOTYPES = YES; 250 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 251 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 252 | CLANG_WARN_UNREACHABLE_CODE = YES; 253 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 254 | CODE_SIGN_IDENTITY = "iPhone Developer"; 255 | COPY_PHASE_STRIP = NO; 256 | DEBUG_INFORMATION_FORMAT = dwarf; 257 | ENABLE_STRICT_OBJC_MSGSEND = YES; 258 | ENABLE_TESTABILITY = YES; 259 | GCC_C_LANGUAGE_STANDARD = gnu11; 260 | GCC_DYNAMIC_NO_PIC = NO; 261 | GCC_NO_COMMON_BLOCKS = YES; 262 | GCC_OPTIMIZATION_LEVEL = 0; 263 | GCC_PREPROCESSOR_DEFINITIONS = ( 264 | "DEBUG=1", 265 | "$(inherited)", 266 | ); 267 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 268 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 269 | GCC_WARN_UNDECLARED_SELECTOR = YES; 270 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 271 | GCC_WARN_UNUSED_FUNCTION = YES; 272 | GCC_WARN_UNUSED_VARIABLE = YES; 273 | IPHONEOS_DEPLOYMENT_TARGET = 11.4; 274 | MTL_ENABLE_DEBUG_INFO = YES; 275 | ONLY_ACTIVE_ARCH = YES; 276 | SDKROOT = iphoneos; 277 | }; 278 | name = Debug; 279 | }; 280 | A8B8BD042133AE0A00C776CF /* Release */ = { 281 | isa = XCBuildConfiguration; 282 | buildSettings = { 283 | ALWAYS_SEARCH_USER_PATHS = NO; 284 | CLANG_ANALYZER_NONNULL = YES; 285 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 286 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 287 | CLANG_CXX_LIBRARY = "libc++"; 288 | CLANG_ENABLE_MODULES = YES; 289 | CLANG_ENABLE_OBJC_ARC = YES; 290 | CLANG_ENABLE_OBJC_WEAK = YES; 291 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 292 | CLANG_WARN_BOOL_CONVERSION = YES; 293 | CLANG_WARN_COMMA = YES; 294 | CLANG_WARN_CONSTANT_CONVERSION = YES; 295 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 296 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 297 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 298 | CLANG_WARN_EMPTY_BODY = YES; 299 | CLANG_WARN_ENUM_CONVERSION = YES; 300 | CLANG_WARN_INFINITE_RECURSION = YES; 301 | CLANG_WARN_INT_CONVERSION = YES; 302 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 303 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 304 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 305 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 306 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 307 | CLANG_WARN_STRICT_PROTOTYPES = YES; 308 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 309 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 310 | CLANG_WARN_UNREACHABLE_CODE = YES; 311 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 312 | CODE_SIGN_IDENTITY = "iPhone Developer"; 313 | COPY_PHASE_STRIP = NO; 314 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 315 | ENABLE_NS_ASSERTIONS = NO; 316 | ENABLE_STRICT_OBJC_MSGSEND = YES; 317 | GCC_C_LANGUAGE_STANDARD = gnu11; 318 | GCC_NO_COMMON_BLOCKS = YES; 319 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 320 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 321 | GCC_WARN_UNDECLARED_SELECTOR = YES; 322 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 323 | GCC_WARN_UNUSED_FUNCTION = YES; 324 | GCC_WARN_UNUSED_VARIABLE = YES; 325 | IPHONEOS_DEPLOYMENT_TARGET = 11.4; 326 | MTL_ENABLE_DEBUG_INFO = NO; 327 | SDKROOT = iphoneos; 328 | VALIDATE_PRODUCT = YES; 329 | }; 330 | name = Release; 331 | }; 332 | A8B8BD062133AE0A00C776CF /* Debug */ = { 333 | isa = XCBuildConfiguration; 334 | baseConfigurationReference = C87517BA379E02964F623E82 /* Pods-Test.debug.xcconfig */; 335 | buildSettings = { 336 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 337 | CODE_SIGN_STYLE = Automatic; 338 | DEVELOPMENT_TEAM = ""; 339 | INFOPLIST_FILE = Test/Info.plist; 340 | LD_RUNPATH_SEARCH_PATHS = ( 341 | "$(inherited)", 342 | "@executable_path/Frameworks", 343 | ); 344 | PRODUCT_BUNDLE_IDENTIFIER = "com.x140yu.cocoapods-dependency.Test"; 345 | PRODUCT_NAME = "$(TARGET_NAME)"; 346 | TARGETED_DEVICE_FAMILY = "1,2"; 347 | }; 348 | name = Debug; 349 | }; 350 | A8B8BD072133AE0A00C776CF /* Release */ = { 351 | isa = XCBuildConfiguration; 352 | baseConfigurationReference = 76CAE2C15916EDE5D0F80FA6 /* Pods-Test.release.xcconfig */; 353 | buildSettings = { 354 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 355 | CODE_SIGN_STYLE = Automatic; 356 | DEVELOPMENT_TEAM = ""; 357 | INFOPLIST_FILE = Test/Info.plist; 358 | LD_RUNPATH_SEARCH_PATHS = ( 359 | "$(inherited)", 360 | "@executable_path/Frameworks", 361 | ); 362 | PRODUCT_BUNDLE_IDENTIFIER = "com.x140yu.cocoapods-dependency.Test"; 363 | PRODUCT_NAME = "$(TARGET_NAME)"; 364 | TARGETED_DEVICE_FAMILY = "1,2"; 365 | }; 366 | name = Release; 367 | }; 368 | /* End XCBuildConfiguration section */ 369 | 370 | /* Begin XCConfigurationList section */ 371 | A8B8BCEA2133AE0900C776CF /* Build configuration list for PBXProject "Test" */ = { 372 | isa = XCConfigurationList; 373 | buildConfigurations = ( 374 | A8B8BD032133AE0A00C776CF /* Debug */, 375 | A8B8BD042133AE0A00C776CF /* Release */, 376 | ); 377 | defaultConfigurationIsVisible = 0; 378 | defaultConfigurationName = Release; 379 | }; 380 | A8B8BD052133AE0A00C776CF /* Build configuration list for PBXNativeTarget "Test" */ = { 381 | isa = XCConfigurationList; 382 | buildConfigurations = ( 383 | A8B8BD062133AE0A00C776CF /* Debug */, 384 | A8B8BD072133AE0A00C776CF /* Release */, 385 | ); 386 | defaultConfigurationIsVisible = 0; 387 | defaultConfigurationName = Release; 388 | }; 389 | /* End XCConfigurationList section */ 390 | }; 391 | rootObject = A8B8BCE72133AE0900C776CF /* Project object */; 392 | } 393 | -------------------------------------------------------------------------------- /spec/cocoapods/Fixtures/Test/Test.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /spec/cocoapods/Fixtures/Test/Test.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /spec/cocoapods/Fixtures/Test/Test.xcodeproj/project.xcworkspace/xcuserdata/x140yu.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/X140Yu/cocoapods-dependency/6100886d7b9834eddc3ce470d554f7bf56ae86e4/spec/cocoapods/Fixtures/Test/Test.xcodeproj/project.xcworkspace/xcuserdata/x140yu.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /spec/cocoapods/Fixtures/Test/Test.xcodeproj/xcuserdata/x140yu.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | Test.xcscheme 8 | 9 | orderHint 10 | 1 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /spec/cocoapods/Fixtures/Test/Test.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /spec/cocoapods/Fixtures/Test/Test.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /spec/cocoapods/Fixtures/Test/Test.xcworkspace/xcuserdata/x140yu.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/X140Yu/cocoapods-dependency/6100886d7b9834eddc3ce470d554f7bf56ae86e4/spec/cocoapods/Fixtures/Test/Test.xcworkspace/xcuserdata/x140yu.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /spec/cocoapods/Fixtures/Test/Test/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // Test 4 | // 5 | // Created by Xinyu Zhao on 2018/8/27. 6 | // Copyright © 2018 Xinyu Zhao. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface AppDelegate : UIResponder 12 | 13 | @property (strong, nonatomic) UIWindow *window; 14 | 15 | 16 | @end 17 | 18 | -------------------------------------------------------------------------------- /spec/cocoapods/Fixtures/Test/Test/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // Test 4 | // 5 | // Created by Xinyu Zhao on 2018/8/27. 6 | // Copyright © 2018 Xinyu Zhao. All rights reserved. 7 | // 8 | 9 | #import "AppDelegate.h" 10 | 11 | @interface AppDelegate () 12 | 13 | @end 14 | 15 | @implementation AppDelegate 16 | 17 | 18 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 19 | // Override point for customization after application launch. 20 | return YES; 21 | } 22 | 23 | 24 | - (void)applicationWillResignActive:(UIApplication *)application { 25 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 26 | // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. 27 | } 28 | 29 | 30 | - (void)applicationDidEnterBackground:(UIApplication *)application { 31 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 32 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 33 | } 34 | 35 | 36 | - (void)applicationWillEnterForeground:(UIApplication *)application { 37 | // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. 38 | } 39 | 40 | 41 | - (void)applicationDidBecomeActive:(UIApplication *)application { 42 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 43 | } 44 | 45 | 46 | - (void)applicationWillTerminate:(UIApplication *)application { 47 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 48 | } 49 | 50 | 51 | @end 52 | -------------------------------------------------------------------------------- /spec/cocoapods/Fixtures/Test/Test/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "20x20", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "20x20", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "29x29", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "29x29", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "40x40", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "40x40", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "size" : "60x60", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "size" : "60x60", 41 | "scale" : "3x" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "size" : "20x20", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "size" : "20x20", 51 | "scale" : "2x" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "size" : "29x29", 56 | "scale" : "1x" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "size" : "29x29", 61 | "scale" : "2x" 62 | }, 63 | { 64 | "idiom" : "ipad", 65 | "size" : "40x40", 66 | "scale" : "1x" 67 | }, 68 | { 69 | "idiom" : "ipad", 70 | "size" : "40x40", 71 | "scale" : "2x" 72 | }, 73 | { 74 | "idiom" : "ipad", 75 | "size" : "76x76", 76 | "scale" : "1x" 77 | }, 78 | { 79 | "idiom" : "ipad", 80 | "size" : "76x76", 81 | "scale" : "2x" 82 | }, 83 | { 84 | "idiom" : "ipad", 85 | "size" : "83.5x83.5", 86 | "scale" : "2x" 87 | }, 88 | { 89 | "idiom" : "ios-marketing", 90 | "size" : "1024x1024", 91 | "scale" : "1x" 92 | } 93 | ], 94 | "info" : { 95 | "version" : 1, 96 | "author" : "xcode" 97 | } 98 | } -------------------------------------------------------------------------------- /spec/cocoapods/Fixtures/Test/Test/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /spec/cocoapods/Fixtures/Test/Test/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /spec/cocoapods/Fixtures/Test/Test/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /spec/cocoapods/Fixtures/Test/Test/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | LSRequiresIPhoneOS 22 | 23 | UILaunchStoryboardName 24 | LaunchScreen 25 | UIMainStoryboardFile 26 | Main 27 | UIRequiredDeviceCapabilities 28 | 29 | armv7 30 | 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | UIInterfaceOrientationLandscapeLeft 35 | UIInterfaceOrientationLandscapeRight 36 | 37 | UISupportedInterfaceOrientations~ipad 38 | 39 | UIInterfaceOrientationPortrait 40 | UIInterfaceOrientationPortraitUpsideDown 41 | UIInterfaceOrientationLandscapeLeft 42 | UIInterfaceOrientationLandscapeRight 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /spec/cocoapods/Fixtures/Test/Test/ViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.h 3 | // Test 4 | // 5 | // Created by Xinyu Zhao on 2018/8/27. 6 | // Copyright © 2018 Xinyu Zhao. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface ViewController : UIViewController 12 | 13 | 14 | @end 15 | 16 | -------------------------------------------------------------------------------- /spec/cocoapods/Fixtures/Test/Test/ViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.m 3 | // Test 4 | // 5 | // Created by Xinyu Zhao on 2018/8/27. 6 | // Copyright © 2018 Xinyu Zhao. All rights reserved. 7 | // 8 | 9 | #import "ViewController.h" 10 | 11 | @interface ViewController () 12 | 13 | @end 14 | 15 | @implementation ViewController 16 | 17 | - (void)viewDidLoad { 18 | [super viewDidLoad]; 19 | // Do any additional setup after loading the view, typically from a nib. 20 | } 21 | 22 | 23 | - (void)didReceiveMemoryWarning { 24 | [super didReceiveMemoryWarning]; 25 | // Dispose of any resources that can be recreated. 26 | } 27 | 28 | 29 | @end 30 | -------------------------------------------------------------------------------- /spec/cocoapods/Fixtures/Test/Test/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // Test 4 | // 5 | // Created by Xinyu Zhao on 2018/8/27. 6 | // Copyright © 2018 Xinyu Zhao. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "AppDelegate.h" 11 | 12 | int main(int argc, char * argv[]) { 13 | @autoreleasepool { 14 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /spec/cocoapods/Fixtures/index.js: -------------------------------------------------------------------------------- 1 | var dependencies = { 2 | "links": [ 3 | { 4 | "source": "A", 5 | "dest": "B" 6 | }, 7 | { 8 | "source": "A", 9 | "dest": "C" 10 | }, 11 | { 12 | "source": "B", 13 | "dest": "C" 14 | }, 15 | { 16 | "source": "B", 17 | "dest": "D" 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /spec/cocoapods/Fixtures/index2.json: -------------------------------------------------------------------------------- 1 | { 2 | "links": [ 3 | { 4 | "source": "A", 5 | "dependencies": [ 6 | "B", 7 | "C" 8 | ] 9 | }, 10 | { 11 | "source": "B", 12 | "dependencies": [ 13 | "C", 14 | "D" 15 | ] 16 | } 17 | ] 18 | } -------------------------------------------------------------------------------- /spec/cocoapods/Fixtures/index2_res.json: -------------------------------------------------------------------------------- 1 | { 2 | "links": [ 3 | { 4 | "source": "A", 5 | "dependencies": [ 6 | "B", 7 | "C" 8 | ] 9 | }, 10 | { 11 | "source": "B", 12 | "dependencies": [ 13 | "C", 14 | "D" 15 | ] 16 | } 17 | ] 18 | } -------------------------------------------------------------------------------- /spec/cocoapods/Fixtures/index_res.js: -------------------------------------------------------------------------------- 1 | var dependencies = { 2 | "links": [ 3 | { 4 | "source": "A", 5 | "dest": "B" 6 | }, 7 | { 8 | "source": "A", 9 | "dest": "C" 10 | }, 11 | { 12 | "source": "B", 13 | "dest": "C" 14 | }, 15 | { 16 | "source": "B", 17 | "dest": "D" 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /spec/cocoapods/dependency_spec.rb: -------------------------------------------------------------------------------- 1 | RSpec.describe 'CocoapodsDependency' do 2 | it 'has a version number' do 3 | expect(CocoapodsDependency::VERSION).not_to be nil 4 | end 5 | 6 | it 'no podfile exists in path will raise error' do 7 | expect { CocoapodsDependency::Analyzer.analyze(Pathname.new('/')) }.to raise_error(/No Podfile exists/) 8 | end 9 | 10 | it 'generate custom podfile' do 11 | podfile = Pod::Podfile.new do 12 | platform :ios 13 | pod 'BananaLib', '1.0' 14 | pod 'CoconutLib', '1.0' 15 | pod 'OCMock', '3.4' 16 | end 17 | 18 | expect(podfile).not_to be nil 19 | end 20 | 21 | it 'custom podfile with simple dependency' do 22 | podfile = Pod::Podfile.new do 23 | project 'spec/cocoapods/Fixtures/Test/Test.xcodeproj' 24 | target 'Test' do 25 | pod 'Masonry', '1.0' 26 | end 27 | end 28 | 29 | expect( 30 | CocoapodsDependency::Analyzer.analyze_with_podfile(Pathname.new('/'), podfile) 31 | ).to eq('Masonry' => []) 32 | end 33 | 34 | it 'custom podfile with two dependencies' do 35 | podfile = Pod::Podfile.new do 36 | project 'spec/cocoapods/Fixtures/Test/Test.xcodeproj' 37 | target 'Test' do 38 | pod 'Masonry', '1.0' 39 | pod 'ReactiveObjC', '1.0.1' 40 | end 41 | end 42 | 43 | res_map = { 44 | 'Masonry' => [], 45 | 'ReactiveObjC' => [] 46 | } 47 | 48 | expect( 49 | CocoapodsDependency::Analyzer.analyze_with_podfile(Pathname.new('/'), podfile) 50 | ).to eq(res_map) 51 | end 52 | 53 | it 'dependencies with dependencies' do 54 | podfile = Pod::Podfile.new do 55 | project 'spec/cocoapods/Fixtures/Test/Test.xcodeproj' 56 | target 'Test' do 57 | pod 'RxCocoa', '4.2' 58 | end 59 | end 60 | 61 | res_map = { 62 | 'RxSwift' => [], 63 | 'RxCocoa' => ['RxSwift'] 64 | } 65 | 66 | expect( 67 | CocoapodsDependency::Analyzer.analyze_with_podfile(Pathname.new('/'), podfile) 68 | ).to eq(res_map) 69 | end 70 | 71 | it 'dependencies with subspec' do 72 | podfile = Pod::Podfile.new do 73 | project 'spec/cocoapods/Fixtures/Test/Test.xcodeproj' 74 | target 'Test' do 75 | # https://github.com/rs/SDWebImage/blob/master/SDWebImage.podspec 76 | pod 'SDWebImage', '4.4.2' 77 | end 78 | end 79 | 80 | res_map = { 81 | 'SDWebImage' => [], 82 | } 83 | 84 | expect( 85 | CocoapodsDependency::Analyzer.analyze_with_podfile(Pathname.new('/'), podfile) 86 | ).to eq(res_map) 87 | end 88 | 89 | it 'dependencies with subspec 2' do 90 | podfile = Pod::Podfile.new do 91 | project 'spec/cocoapods/Fixtures/Test/Test.xcodeproj' 92 | target 'Test' do 93 | # https://github.com/rs/SDWebImage/blob/master/SDWebImage.podspec 94 | pod 'SDWebImage/GIF', '4.4.2' 95 | end 96 | end 97 | 98 | res_map = { 99 | 'SDWebImage' => ['FLAnimatedImage'], 100 | 'FLAnimatedImage' => [], 101 | } 102 | 103 | expect( 104 | CocoapodsDependency::Analyzer.analyze_with_podfile(Pathname.new('/'), podfile) 105 | ).to eq(res_map) 106 | end 107 | 108 | it 'dependencies with subspec 3' do 109 | podfile = Pod::Podfile.new do 110 | project 'spec/cocoapods/Fixtures/Test/Test.xcodeproj' 111 | target 'Test' do 112 | # https://github.com/rs/SDWebImage/blob/master/SDWebImage.podspec 113 | pod 'SDWebImage/GIF', '4.4.2' 114 | pod 'SDWebImage/WebP', '4.4.2' 115 | end 116 | end 117 | 118 | res_map = { 119 | 'SDWebImage' => %w[FLAnimatedImage libwebp], 120 | 'FLAnimatedImage' => [], 121 | 'libwebp' => [], 122 | } 123 | 124 | expect( 125 | CocoapodsDependency::Analyzer.analyze_with_podfile(Pathname.new('/'), podfile) 126 | ).to eq(res_map) 127 | end 128 | 129 | it 'dependencies with subspec 4' do 130 | podfile = Pod::Podfile.new do 131 | project 'spec/cocoapods/Fixtures/Test/Test.xcodeproj' 132 | target 'Test' do 133 | # https://github.com/rs/SDWebImage/blob/master/SDWebImage.podspec 134 | pod 'SDWebImage/GIF', '4.4.2' 135 | pod 'SDWebImage/WebP', '4.4.2' 136 | pod 'RxCocoa', '4.2' 137 | end 138 | end 139 | 140 | res_map = { 141 | 'SDWebImage' => %w[FLAnimatedImage libwebp], 142 | 'FLAnimatedImage' => [], 143 | 'libwebp' => [], 144 | 'RxCocoa' => %w[RxSwift], 145 | 'RxSwift' => [], 146 | } 147 | 148 | expect( 149 | CocoapodsDependency::Analyzer.analyze_with_podfile(Pathname.new('/'), podfile) 150 | ).to eq(res_map) 151 | end 152 | 153 | it 'dependencies with subspec 5' do 154 | podfile = Pod::Podfile.new do 155 | project 'spec/cocoapods/Fixtures/Test/Test.xcodeproj' 156 | target 'Test' do 157 | # https://github.com/TextureGroup/Texture/blob/master/Texture.podspec 158 | pod 'Texture', '2.7' 159 | end 160 | end 161 | 162 | res_map = { 163 | 'Texture' => %w[PINCache PINOperation PINRemoteImage], 164 | 'PINCache' => %w[PINOperation], 165 | 'PINRemoteImage' => %w[PINCache PINOperation], 166 | 'PINOperation' => [], 167 | } 168 | 169 | expect( 170 | CocoapodsDependency::Analyzer.analyze_with_podfile(Pathname.new('/'), podfile) 171 | ).to eq(res_map) 172 | end 173 | 174 | it 'dependencies with subspec 6' do 175 | podfile = Pod::Podfile.new do 176 | project 'spec/cocoapods/Fixtures/Test/Test.xcodeproj' 177 | target 'Test' do 178 | # https://github.com/TextureGroup/Texture/blob/master/Texture.podspec 179 | pod 'Texture', '2.7', subspecs: %w[PINRemoteImage IGListKit Yoga] 180 | end 181 | end 182 | 183 | res_map = { 184 | 'Texture' => %w[IGListKit PINCache PINOperation PINRemoteImage Yoga], 185 | 'PINCache' => %w[PINOperation], 186 | 'PINRemoteImage' => %w[PINCache PINOperation], 187 | 'PINOperation' => [], 188 | 'IGListKit' => [], 189 | 'Yoga' => [], 190 | } 191 | 192 | expect( 193 | CocoapodsDependency::Analyzer.analyze_with_podfile(Pathname.new('/'), podfile) 194 | ).to eq(res_map) 195 | end 196 | end 197 | -------------------------------------------------------------------------------- /spec/cocoapods/visual_out_spec.rb: -------------------------------------------------------------------------------- 1 | require 'cocoapods-dependency/visual_out' 2 | 3 | RSpec.describe 'CocoapodsDependency' do 4 | it 'visual out works' do 5 | dependency_map = { 6 | 'A': %w[B C], 7 | 'B': %w[C D] 8 | } 9 | json_output = CocoapodsDependency::VisualOutHelper.new(dependency_map).to_d3js_json 10 | json_expected = { 11 | 'links': [ 12 | { 'source': 'A', 'dest': 'B' }, 13 | { 'source': 'A', 'dest': 'C' }, 14 | { 'source': 'B', 'dest': 'C' }, 15 | { 'source': 'B', 'dest': 'D' } 16 | ] 17 | } 18 | # expect(json_output).to eq(json_expected.to_json) 19 | end 20 | 21 | it 'file output' do 22 | dependency_map = { 23 | 'A': %w[B C], 24 | 'B': %w[C D] 25 | } 26 | result_path = File.expand_path('Fixtures/index_res.js', __dir__) 27 | expected_path = File.expand_path('Fixtures/index.js', __dir__) 28 | CocoapodsDependency::VisualOutHelper.new(dependency_map).write_d3js_to_file(result_path) 29 | expect(File.read(result_path) == File.read(expected_path)) 30 | end 31 | 32 | it 'json output' do 33 | dependency_map = { 34 | 'A': %w[B C], 35 | 'B': %w[C D] 36 | } 37 | result_path = File.expand_path('Fixtures/index2_res.json', __dir__) 38 | expected_path = File.expand_path('Fixtures/index2.json', __dir__) 39 | CocoapodsDependency::VisualOutHelper.new(dependency_map).write_json_to_file(result_path) 40 | expect(File.read(result_path) == File.read(expected_path)) 41 | end 42 | end 43 | -------------------------------------------------------------------------------- /spec/spec_helper.rb: -------------------------------------------------------------------------------- 1 | require 'coveralls' 2 | Coveralls.wear! 3 | 4 | require 'bundler/setup' 5 | require 'cocoapods-dependency/analyze' 6 | 7 | RSpec.configure do |config| 8 | # Enable flags like --only-failures and --next-failure 9 | config.example_status_persistence_file_path = '.rspec_status' 10 | 11 | # Disable RSpec exposing methods globally on `Module` and `main` 12 | config.disable_monkey_patching! 13 | 14 | config.expect_with :rspec do |c| 15 | c.syntax = :expect 16 | end 17 | end 18 | --------------------------------------------------------------------------------