├── .gitignore ├── DEV_README.md ├── LICENSE ├── README.assets ├── image-20201007205410006.png └── image-20201007213841235.png ├── README.md ├── cocoapods-dependency-graph ├── .gitignore ├── Gemfile ├── LICENSE.txt ├── README.md ├── Rakefile ├── cocoapods-dependency-graph.gemspec ├── lib │ ├── cocoapods-dependency-graph │ │ ├── command.rb │ │ ├── command │ │ │ └── graph.rb │ │ ├── gem_version.rb │ │ └── generator │ │ │ ├── excel_generator.rb │ │ │ ├── graph_generator.rb │ │ │ └── json_generator.rb │ ├── cocoapods_dependency_graph.rb │ └── cocoapods_plugin.rb └── spec │ ├── command │ └── graph_spec.rb │ └── spec_helper.rb └── demo └── DependencyGraphDemo ├── DependencyGraphDemo.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist └── xcuserdata │ └── zhengrongyan.xcuserdatad │ └── xcschemes │ └── xcschememanagement.plist ├── DependencyGraphDemo ├── AppDelegate.swift ├── Assets.xcassets │ ├── AppIcon.appiconset │ │ └── Contents.json │ └── Contents.json ├── Base.lproj │ ├── LaunchScreen.storyboard │ └── Main.storyboard ├── Info.plist ├── SceneDelegate.swift └── ViewController.swift ├── DependencyGraphDemoTests ├── DependencyGraphDemoTests.swift └── Info.plist ├── DependencyGraphDemoUITests ├── DependencyGraphDemoUITests.swift └── Info.plist ├── Podfile └── text.txt /.gitignore: -------------------------------------------------------------------------------- 1 | demo/DependencyGraphDemo/DependencyGraphDemo.xcodeproj/xcshareddata/ 2 | demo/DependencyGraphDemo/DependencyGraphDemo.xcworkspace/ 3 | demo/DependencyGraphDemo/Pods/ 4 | demo/DependencyGraphDemo/Podfile.lock 5 | demo/DependencyGraphDemo/DependencyGraphDemo.xcodeproj/project.xcworkspace/xcuserdata/zhengrongyan.xcuserdatad/UserInterfaceState.xcuserstate 6 | demo/DependencyGraphDemo/DependencyGraphDemo.xcodeproj/xcuserdata/zhengrongyan.xcuserdatad/xcschemes/xcschemema 7 | cocoapods-dependency-graph/*.gem 8 | -------------------------------------------------------------------------------- /DEV_README.md: -------------------------------------------------------------------------------- 1 | 2 | ### How to dev 3 | 4 | 1. learn [Getting Started with CocoaPods Plugin Development](https://medium.com/@vladkorzun/getting-started-with-cocoapods-plugin-development-86cd55bee1b3) 5 | 6 | 2. change code 7 | 3. build gemspec 8 | 3.1. If you add a new file, make sure that file is added in git before building. Because in the `gemspec`, we use 9 | ``` 10 | spec.files = `git ls-files`.split($/) 11 | ``` 12 | Now, you can build the `cocoapods-dependency-graph` 13 | ``` 14 | ~> cd cocoapods-dependency-graph 15 | ~> gem build cocoapods-dependency-graph.gemspec 16 | ``` 17 | 3.2. Go to `~/.gem/ruby/${version}/gems/cocoapods-dependency-graph-0.0.1/lib/cocoapods-dependency-graph/`, check if your file is packed into the plugin bundle. 18 | 4. install cocoapods-dependency-graph 19 | 20 | ``` 21 | ~> gem install cocoapods-dependency-graph --user-install 22 | ~> pod plugins installed 23 | ``` 24 | 25 | 5. go to the demo folder, we already add `plugin 'cocoapods-dependency-graph'` in the `Podfile`. 26 | 27 | ``` 28 | ~> cd ../demo/DependencyGraphDemo 29 | ~> pod install --verbose 30 | ``` 31 | 32 | ### Release new version 33 | 1. update `VERSION` in `gem_version.rb` 34 | 2. build, `gem build cocoapods-dependency-graph.gemspec`. 35 | 3. publish, `gem push cocoapods-dependency-graph-#{version}.gem` 36 | 37 | ### Doc for cocoapods 38 | 39 | Check the doc and API in https://rubydoc.info/gems/cocoapods/Pod -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 RY Zheng 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 all 13 | 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 THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.assets/image-20201007205410006.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sueLan/cocoapods-dependency-graph/dcffd5c10a89e0f996a6bc3aa79fc774c807c705/README.assets/image-20201007205410006.png -------------------------------------------------------------------------------- /README.assets/image-20201007213841235.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sueLan/cocoapods-dependency-graph/dcffd5c10a89e0f996a6bc3aa79fc774c807c705/README.assets/image-20201007213841235.png -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # cocoapods-dependency-graph 2 | 3 | A Cocoapods plugin to create the dependency graph and help you manage dependencies in your project. 4 | 5 | 6 | ## Installation 7 | ### Install 8 | 9 | ``` 10 | $ gem install cocoapods-dependency-graph 11 | ``` 12 | 13 | ### Build and Install Plugin 14 | 15 | $ git clone git@github.com:sueLan/cocoapods-dependency-graph.git 16 | $ cd cocoapods-dependency-graph 17 | $ gem build cocoapods-dependency-graph.gemspec && gem install cocoapods-dependency-graph --user-install 18 | 19 | ## Usage 20 | 21 | 1. add `plugin` in the `Podfile` 22 | 23 | ``` 24 | plugin 'cocoapods-dependency-graph' 25 | ``` 26 | 27 | 2. run `pod install` 28 | 3. output files in the project folder 29 | 30 | In the `Podfile`, you can define `dependency_output` to decide which kind of output file this plugin generates. 31 | 32 | ``` 33 | dependency_output :json 34 | dependency_output :excel 35 | dependency_output :graph 36 | ``` 37 | There are 3 symbols to control the output format. You can choose one of them. If you don't define `dependency_output`, by default, this plugin generates `png` and `dot` file for dependency graph. 38 | 39 | The following are output files you can generate: 40 | 41 | - `#{target_label}_dependency_json.json`: JSON file for dependencies. You can view the json in any JSON becauty tool you like. 42 | 43 | image-20201007205410006 44 | 45 | - `#{target_label}_dependency_graph.png`: A png picture shows the dependency graph 46 | 47 | ![image-20201007213841235](README.assets/image-20201007213841235.png) 48 | 49 | - `#{target_label}_dependency_graph.dot`: A dot file which represents the dependency graph. [A site](https://dreampuf.github.io/GraphvizOnline/) that can process the dot language. Or you can use [Graphviz](https://www.graphviz.org/theory/) 50 | 51 | - `#{target_label}_dependency_list.xlsx`: xlsx file for dependency list. 52 | -------------------------------------------------------------------------------- /cocoapods-dependency-graph/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | pkg 3 | .idea/ 4 | -------------------------------------------------------------------------------- /cocoapods-dependency-graph/Gemfile: -------------------------------------------------------------------------------- 1 | source 'https://rubygems.org' 2 | 3 | # Specify your gem's dependencies in cocoapods-dependency-graph.gemspec 4 | gemspec 5 | 6 | -------------------------------------------------------------------------------- /cocoapods-dependency-graph/LICENSE.txt: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 RY Zheng 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 all 13 | 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 THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /cocoapods-dependency-graph/README.md: -------------------------------------------------------------------------------- 1 | # cocoapods-dependency-graph 2 | 3 | A Cocoapods plugin to create the dependency graph and help you manage dependencies in your project. 4 | 5 | ### Install 6 | 7 | ``` 8 | $ gem install cocoapods-dependency-graph 9 | ``` 10 | 11 | ## Usage 12 | 13 | [See More](https://github.com/sueLan/cocoapods-dependency-graph) 14 | -------------------------------------------------------------------------------- /cocoapods-dependency-graph/Rakefile: -------------------------------------------------------------------------------- 1 | require 'bundler/gem_tasks' 2 | 3 | def specs(dir) 4 | FileList["spec/#{dir}/*_spec.rb"].shuffle.join(' ') 5 | end 6 | 7 | desc 'Runs all the specs' 8 | task :specs do 9 | sh "bundle exec bacon #{specs('**')}" 10 | end 11 | 12 | task :default => :specs 13 | 14 | -------------------------------------------------------------------------------- /cocoapods-dependency-graph/cocoapods-dependency-graph.gemspec: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | lib = File.expand_path('../lib', __FILE__) 3 | $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) 4 | require 'cocoapods-dependency-graph/gem_version.rb' 5 | 6 | Gem::Specification.new do |spec| 7 | spec.name = 'cocoapods-dependency-graph' 8 | spec.version = CocoapodsDependencyGraph::VERSION 9 | spec.authors = ['Rongyan Zheng'] 10 | spec.email = ['scutryzheng@gmail.com'] 11 | spec.description = %q{A short description of cocoapods-dependency-graph.} 12 | spec.summary = %q{A longer description of cocoapods-dependency-graph.} 13 | spec.homepage = 'https://github.com/EXAMPLE/cocoapods-dependency-graph' 14 | spec.license = 'MIT' 15 | 16 | spec.files = `git ls-files`.split($/) 17 | spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) } 18 | spec.test_files = spec.files.grep(%r{^(test|spec|features)/}) 19 | spec.require_paths = ['lib'] 20 | 21 | spec.add_development_dependency 'bundler', '~> 1.3' 22 | spec.add_development_dependency 'rake' 23 | spec.add_dependency 'cocoapods' 24 | spec.add_dependency 'rgl' 25 | spec.add_dependency 'fast_excel' 26 | end 27 | -------------------------------------------------------------------------------- /cocoapods-dependency-graph/lib/cocoapods-dependency-graph/command.rb: -------------------------------------------------------------------------------- 1 | require 'cocoapods-dependency-graph/command/graph' 2 | -------------------------------------------------------------------------------- /cocoapods-dependency-graph/lib/cocoapods-dependency-graph/command/graph.rb: -------------------------------------------------------------------------------- 1 | module Pod 2 | class Command 3 | # This is an example of a cocoapods plugin adding a top-level subcommand 4 | # to the 'pod' command. 5 | # 6 | # You can also create subcommands of existing or new commands. Say you 7 | # wanted to add a subcommand to `list` to show newly deprecated pods, 8 | # (e.g. `pod list deprecated`), there are a few things that would need 9 | # to change. 10 | # 11 | # - move this file to `lib/pod/command/list/deprecated.rb` and update 12 | # the class to exist in the the Pod::Command::List namespace 13 | # - change this class to extend from `List` instead of `Command`. This 14 | # tells the plugin system that it is a subcommand of `list`. 15 | # - edit `lib/cocoapods_plugins.rb` to require this file 16 | # 17 | # @todo Create a PR to add your plugin to CocoaPods/cocoapods.org 18 | # in the `plugins.json` file, once your plugin is released. 19 | # 20 | class Dependency < Command 21 | self.summary = 'Short description of cocoapods-dependency-graph.' 22 | 23 | self.description = <<-DESC 24 | Longer description of cocoapods-dependency-graph. 25 | DESC 26 | 27 | # self.arguments = 'NAME' 28 | 29 | def initialize(argv) 30 | #@name = argv.shift_argument 31 | super 32 | end 33 | 34 | def run 35 | end 36 | end 37 | end 38 | end 39 | -------------------------------------------------------------------------------- /cocoapods-dependency-graph/lib/cocoapods-dependency-graph/gem_version.rb: -------------------------------------------------------------------------------- 1 | module CocoapodsDependencyGraph 2 | VERSION = "1.0.5" 3 | end 4 | -------------------------------------------------------------------------------- /cocoapods-dependency-graph/lib/cocoapods-dependency-graph/generator/excel_generator.rb: -------------------------------------------------------------------------------- 1 | require 'fast_excel' 2 | 3 | module Dependency 4 | class ExcelGenerator 5 | attr_accessor :workbook 6 | attr_accessor :worksheet 7 | 8 | def create_excel(target_label) 9 | filename = "#{target_label}_dependency_list.xlsx" 10 | File.delete(filename) if File.file?(filename) 11 | 12 | @workbook = FastExcel.open(filename, constant_memory: true) 13 | @worksheet = workbook.add_worksheet("cocoapods-dependency-list") 14 | @worksheet.auto_width = true 15 | end 16 | 17 | def create_title() 18 | @worksheet.append_row(["module name", "local", "source", "version", "homepage", "summary"], @workbook.bold_format) 19 | end 20 | 21 | def create_row(spec) 22 | return unless spec.source 23 | local = spec.local? if spec.source 24 | summary = spec.root.attributes_hash['summary'] 25 | worksheet << [spec.module_name, local, spec.source, spec.version, spec.homepage, summary] 26 | end 27 | 28 | # @param [Array] specs a list specification 29 | def create_content(specs) 30 | specs.each { | spec | 31 | create_row(spec) 32 | } 33 | end 34 | 35 | def close_excel 36 | @workbook.close 37 | end 38 | 39 | # @param [UmbrellaTargetDescription] umbrella_target the CocoaPods umbrella targets generated by the installer. 40 | # @param [Hash{}] module_spec_hash 41 | # 42 | def generate(umbrella_target, module_spec_hash) 43 | create_excel(umbrella_target.cocoapods_target_label) 44 | create_title 45 | create_content(umbrella_target.specs) 46 | close_excel 47 | end 48 | end 49 | end 50 | -------------------------------------------------------------------------------- /cocoapods-dependency-graph/lib/cocoapods-dependency-graph/generator/graph_generator.rb: -------------------------------------------------------------------------------- 1 | require 'rgl/adjacency' 2 | require 'rgl/dot' 3 | 4 | module Dependency 5 | class GraphGenerator 6 | def dependency_spces(spec) 7 | dependencies = [] 8 | spec.dependencies.each { | dependency | 9 | d_spec = @module_spec_hash[dependency.name] 10 | next unless d_spec.source 11 | dependencies << d_spec 12 | } 13 | dependencies 14 | end 15 | 16 | def dfs_graph(parent, specs) 17 | specs.each { | spec | 18 | next unless spec.source 19 | @graph.add_edge(parent, spec) 20 | dfs_graph(spec, dependency_spces(spec)) 21 | } 22 | end 23 | 24 | # @param [UmbrellaTargetDescription] umbrella_target the CocoaPods umbrella targets generated by the installer. 25 | # @param [Hash{}] module_spec_hash 26 | # 27 | def generate(umbrella_target, module_spec_hash) 28 | @graph = RGL::DirectedAdjacencyGraph.new 29 | @module_spec_hash = module_spec_hash 30 | 31 | target_name = umbrella_target.cocoapods_target_label 32 | root_node = {:target => target_name} 33 | dfs_graph(root_node, umbrella_target.specs) 34 | 35 | @graph.print_dotted_on 36 | dot_file = "#{target_name}_dependency_graph" 37 | @graph.write_to_graphic_file('png', dot_file) 38 | end 39 | end 40 | end -------------------------------------------------------------------------------- /cocoapods-dependency-graph/lib/cocoapods-dependency-graph/generator/json_generator.rb: -------------------------------------------------------------------------------- 1 | require 'json' 2 | 3 | module Dependency 4 | class JsonGenerator 5 | # @param [Array] specs a list specification 6 | def create_hash(target_name, specs) 7 | dependencies = Array.new 8 | specs.each { | spec | 9 | next unless spec.source 10 | dependencies << SpecNode.new(spec).to_hash 11 | } 12 | 13 | {:target_name => dependencies} 14 | end 15 | 16 | def self.module_spec_hash 17 | @@module_spec_hash 18 | end 19 | 20 | # @param [UmbrellaTargetDescription] umbrella_target the CocoaPods umbrella targets generated by the installer. 21 | # @param [Hash{}] module_spec_hash 22 | # 23 | def generate(umbrella_target, module_spec_hash) 24 | @@module_spec_hash = module_spec_hash 25 | target_name = umbrella_target.cocoapods_target_label 26 | dependency_hash = create_hash(target_name, umbrella_target.specs) 27 | # puts dependency_hash.to_json 28 | File.open("#{target_name}_dependency_json.json","w") do |f| 29 | f.write(dependency_hash.to_json) 30 | end 31 | end 32 | 33 | class SpecNode 34 | def spec_brief_info(spec) 35 | spec_brief = Hash.new 36 | spec_brief[:name] = spec.name 37 | spec_brief[:module_name] = spec.module_name 38 | spec_brief[:source] = spec.source 39 | spec_brief[:version] = spec.version 40 | spec_brief[:homepage] = spec.homepage 41 | spec_brief[:local] = spec.local? if spec.source 42 | spec_brief[:summary] = spec.root.attributes_hash['summary'] 43 | spec_brief[:subspec] = spec.subspecs 44 | 45 | spec_brief 46 | end 47 | 48 | def initialize(spec) 49 | @name = spec_brief_info(spec) 50 | @dependencies = [] 51 | spec.dependencies.each { | dependency | 52 | d_spec = JsonGenerator.module_spec_hash[dependency.name] 53 | next unless d_spec.source 54 | @dependencies << SpecNode.new(d_spec).to_hash 55 | } 56 | end 57 | 58 | def to_hash() 59 | res = Hash.new 60 | res[:name] = @name 61 | res[:dependencies] = @dependencies 62 | res 63 | end 64 | end 65 | end 66 | end -------------------------------------------------------------------------------- /cocoapods-dependency-graph/lib/cocoapods_dependency_graph.rb: -------------------------------------------------------------------------------- 1 | require 'cocoapods-dependency-graph/gem_version' 2 | require 'cocoapods' 3 | require 'fileutils' 4 | require_relative 'cocoapods-dependency-graph/generator/excel_generator' 5 | require_relative 'cocoapods-dependency-graph/generator/json_generator' 6 | require_relative 'cocoapods-dependency-graph/generator/graph_generator' 7 | 8 | module Output 9 | GRAPH = :graph 10 | JSON = :json 11 | EXCEL = :excel 12 | end 13 | 14 | # attr_accessor for class variable. 15 | def class_attr_accessor(symbol) 16 | self.class.send(:attr_accessor, symbol) 17 | end 18 | 19 | module Pod 20 | class Podfile 21 | module DSL 22 | def dependency_output(output_symbol) 23 | DSL.dependency_output_format = output_symbol 24 | end 25 | 26 | private 27 | class_attr_accessor :dependency_output_format 28 | DSL.dependency_output_format = Output::GRAPH 29 | end 30 | end 31 | end 32 | 33 | module Dependency 34 | class Graph 35 | attr_accessor :output_class_hash 36 | 37 | def init_output_hash 38 | @output_class_hash = { 39 | :graph => 'Dependency::GraphGenerator', 40 | :json => 'Dependency::JsonGenerator', 41 | :excel => 'Dependency::ExcelGenerator' 42 | } 43 | end 44 | 45 | # @param [Array] The list of 46 | # the CocoaPods umbrella targets generated by the installer. 47 | # 48 | def generate(umbrella_targets) 49 | unless umbrella_targets.length() > 0 50 | puts "No target detected" 51 | end 52 | 53 | umbrella_targets.each { |target| 54 | next if target.cocoapods_target_label.end_with?("Tests") 55 | generate_graph_for_target(target) 56 | } 57 | end 58 | 59 | # @param [UmbrellaTargetDescription] umbrella_target 60 | def generate_graph_for_target(umbrella_target) 61 | module_spec_hash = {} 62 | umbrella_target.specs.each { | spec | 63 | module_spec_hash[spec.name] = spec 64 | } 65 | 66 | init_output_hash 67 | output_key = Pod::Podfile::DSL.dependency_output_format 68 | output_key = Output::GRAPH unless output_key 69 | 70 | generator_string = @output_class_hash[output_key] 71 | 72 | unless generator_string 73 | puts "The dependency_output should be one of #{Output::GRAPH}, #{Output::JSON}, and #{Output::EXCEL}" 74 | return 75 | end 76 | 77 | generator_class = Object.const_get(generator_string) 78 | generator_class.new.generate(umbrella_target,module_spec_hash) 79 | end 80 | end 81 | end 82 | 83 | -------------------------------------------------------------------------------- /cocoapods-dependency-graph/lib/cocoapods_plugin.rb: -------------------------------------------------------------------------------- 1 | require 'cocoapods-dependency-graph/command' 2 | require_relative 'cocoapods_dependency_graph' 3 | 4 | module Dependency 5 | # Register the post_install hook. The context is passed when running block 6 | Pod::HooksManager.register('cocoapods-dependency-graph', :post_install) do |installer_context| 7 | Graph.new.generate(installer_context.umbrella_targets) 8 | end 9 | end -------------------------------------------------------------------------------- /cocoapods-dependency-graph/spec/command/graph_spec.rb: -------------------------------------------------------------------------------- 1 | require File.expand_path('../../spec_helper', __FILE__) 2 | 3 | module Pod 4 | describe Command::Graph do 5 | describe 'CLAide' do 6 | it 'registers it self' do 7 | Command.parse(%w{ graph }).should.be.instance_of Command::Graph 8 | end 9 | end 10 | end 11 | end 12 | 13 | -------------------------------------------------------------------------------- /cocoapods-dependency-graph/spec/spec_helper.rb: -------------------------------------------------------------------------------- 1 | require 'pathname' 2 | ROOT = Pathname.new(File.expand_path('../../', __FILE__)) 3 | $:.unshift((ROOT + 'lib').to_s) 4 | $:.unshift((ROOT + 'spec').to_s) 5 | 6 | require 'bundler/setup' 7 | require 'pathname' 8 | require 'cocoapods' 9 | 10 | Mocha::Configuration.prevent(:stubbing_non_existent_method) 11 | 12 | require 'cocoapods_plugin' 13 | 14 | #-----------------------------------------------------------------------------# 15 | 16 | module Pod 17 | 18 | # Disable the wrapping so the output is deterministic in the tests. 19 | # 20 | UI.disable_wrap = true 21 | 22 | # Redirects the messages to an internal store. 23 | # 24 | module UI 25 | @output = '' 26 | @warnings = '' 27 | 28 | class << self 29 | attr_accessor :output 30 | attr_accessor :warnings 31 | 32 | def puts(message = '') 33 | @output << "#{message}\n" 34 | end 35 | 36 | def warn(message = '', actions = []) 37 | @warnings << "#{message}\n" 38 | end 39 | 40 | def print(message) 41 | @output << message 42 | end 43 | end 44 | end 45 | end 46 | 47 | #-----------------------------------------------------------------------------# 48 | -------------------------------------------------------------------------------- /demo/DependencyGraphDemo/DependencyGraphDemo.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 50; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 454A369524D59C0A00AC3B59 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 454A369424D59C0A00AC3B59 /* AppDelegate.swift */; }; 11 | 454A369724D59C0A00AC3B59 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 454A369624D59C0A00AC3B59 /* SceneDelegate.swift */; }; 12 | 454A369924D59C0A00AC3B59 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 454A369824D59C0A00AC3B59 /* ViewController.swift */; }; 13 | 454A369C24D59C0A00AC3B59 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 454A369A24D59C0A00AC3B59 /* Main.storyboard */; }; 14 | 454A369E24D59C0C00AC3B59 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 454A369D24D59C0C00AC3B59 /* Assets.xcassets */; }; 15 | 454A36A124D59C0C00AC3B59 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 454A369F24D59C0C00AC3B59 /* LaunchScreen.storyboard */; }; 16 | 454A36AC24D59C0C00AC3B59 /* DependencyGraphDemoTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 454A36AB24D59C0C00AC3B59 /* DependencyGraphDemoTests.swift */; }; 17 | 454A36B724D59C0C00AC3B59 /* DependencyGraphDemoUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 454A36B624D59C0C00AC3B59 /* DependencyGraphDemoUITests.swift */; }; 18 | 508EF8A7980B218E137DF52C /* Pods_DependencyGraphDemo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4DCB922D16DF0D94DCFCE622 /* Pods_DependencyGraphDemo.framework */; }; 19 | 593100A2CFD0A28C7FDB773C /* Pods_DependencyGraphDemo_DependencyGraphDemoUITests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F2B4E60EB0957D3326F36B89 /* Pods_DependencyGraphDemo_DependencyGraphDemoUITests.framework */; }; 20 | AC61FE821A0A7D6227C7C7AE /* Pods_DependencyGraphDemoTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B26964FDDDB3B22842767B /* Pods_DependencyGraphDemoTests.framework */; }; 21 | /* End PBXBuildFile section */ 22 | 23 | /* Begin PBXContainerItemProxy section */ 24 | 454A36A824D59C0C00AC3B59 /* PBXContainerItemProxy */ = { 25 | isa = PBXContainerItemProxy; 26 | containerPortal = 454A368924D59C0A00AC3B59 /* Project object */; 27 | proxyType = 1; 28 | remoteGlobalIDString = 454A369024D59C0A00AC3B59; 29 | remoteInfo = DependencyGraphDemo; 30 | }; 31 | 454A36B324D59C0C00AC3B59 /* PBXContainerItemProxy */ = { 32 | isa = PBXContainerItemProxy; 33 | containerPortal = 454A368924D59C0A00AC3B59 /* Project object */; 34 | proxyType = 1; 35 | remoteGlobalIDString = 454A369024D59C0A00AC3B59; 36 | remoteInfo = DependencyGraphDemo; 37 | }; 38 | /* End PBXContainerItemProxy section */ 39 | 40 | /* Begin PBXFileReference section */ 41 | 29B26964FDDDB3B22842767B /* Pods_DependencyGraphDemoTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_DependencyGraphDemoTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 42 | 2CEBB6F230E3F5E4E66085CE /* Pods-DependencyGraphDemo-DependencyGraphDemoUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-DependencyGraphDemo-DependencyGraphDemoUITests.release.xcconfig"; path = "Target Support Files/Pods-DependencyGraphDemo-DependencyGraphDemoUITests/Pods-DependencyGraphDemo-DependencyGraphDemoUITests.release.xcconfig"; sourceTree = ""; }; 43 | 454A369124D59C0A00AC3B59 /* DependencyGraphDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = DependencyGraphDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; 44 | 454A369424D59C0A00AC3B59 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 45 | 454A369624D59C0A00AC3B59 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; 46 | 454A369824D59C0A00AC3B59 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 47 | 454A369B24D59C0A00AC3B59 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 48 | 454A369D24D59C0C00AC3B59 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 49 | 454A36A024D59C0C00AC3B59 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 50 | 454A36A224D59C0C00AC3B59 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 51 | 454A36A724D59C0C00AC3B59 /* DependencyGraphDemoTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = DependencyGraphDemoTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 52 | 454A36AB24D59C0C00AC3B59 /* DependencyGraphDemoTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DependencyGraphDemoTests.swift; sourceTree = ""; }; 53 | 454A36AD24D59C0C00AC3B59 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 54 | 454A36B224D59C0C00AC3B59 /* DependencyGraphDemoUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = DependencyGraphDemoUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 55 | 454A36B624D59C0C00AC3B59 /* DependencyGraphDemoUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DependencyGraphDemoUITests.swift; sourceTree = ""; }; 56 | 454A36B824D59C0C00AC3B59 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 57 | 4DCB922D16DF0D94DCFCE622 /* Pods_DependencyGraphDemo.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_DependencyGraphDemo.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 58 | 6D90743A5775187C92EB54BC /* Pods-DependencyGraphDemoTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-DependencyGraphDemoTests.debug.xcconfig"; path = "Target Support Files/Pods-DependencyGraphDemoTests/Pods-DependencyGraphDemoTests.debug.xcconfig"; sourceTree = ""; }; 59 | 914CE38D51159F7BA8973ED8 /* Pods-DependencyGraphDemo-DependencyGraphDemoUITests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-DependencyGraphDemo-DependencyGraphDemoUITests.debug.xcconfig"; path = "Target Support Files/Pods-DependencyGraphDemo-DependencyGraphDemoUITests/Pods-DependencyGraphDemo-DependencyGraphDemoUITests.debug.xcconfig"; sourceTree = ""; }; 60 | BF79C953E7A95BB500D6C2CE /* Pods-DependencyGraphDemoTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-DependencyGraphDemoTests.release.xcconfig"; path = "Target Support Files/Pods-DependencyGraphDemoTests/Pods-DependencyGraphDemoTests.release.xcconfig"; sourceTree = ""; }; 61 | C5BEB8ADA80E705659B02867 /* Pods-DependencyGraphDemo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-DependencyGraphDemo.debug.xcconfig"; path = "Target Support Files/Pods-DependencyGraphDemo/Pods-DependencyGraphDemo.debug.xcconfig"; sourceTree = ""; }; 62 | DA58025080C680B085519590 /* Pods-DependencyGraphDemo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-DependencyGraphDemo.release.xcconfig"; path = "Target Support Files/Pods-DependencyGraphDemo/Pods-DependencyGraphDemo.release.xcconfig"; sourceTree = ""; }; 63 | F2B4E60EB0957D3326F36B89 /* Pods_DependencyGraphDemo_DependencyGraphDemoUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_DependencyGraphDemo_DependencyGraphDemoUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 64 | /* End PBXFileReference section */ 65 | 66 | /* Begin PBXFrameworksBuildPhase section */ 67 | 454A368E24D59C0A00AC3B59 /* Frameworks */ = { 68 | isa = PBXFrameworksBuildPhase; 69 | buildActionMask = 2147483647; 70 | files = ( 71 | 508EF8A7980B218E137DF52C /* Pods_DependencyGraphDemo.framework in Frameworks */, 72 | ); 73 | runOnlyForDeploymentPostprocessing = 0; 74 | }; 75 | 454A36A424D59C0C00AC3B59 /* Frameworks */ = { 76 | isa = PBXFrameworksBuildPhase; 77 | buildActionMask = 2147483647; 78 | files = ( 79 | AC61FE821A0A7D6227C7C7AE /* Pods_DependencyGraphDemoTests.framework in Frameworks */, 80 | ); 81 | runOnlyForDeploymentPostprocessing = 0; 82 | }; 83 | 454A36AF24D59C0C00AC3B59 /* Frameworks */ = { 84 | isa = PBXFrameworksBuildPhase; 85 | buildActionMask = 2147483647; 86 | files = ( 87 | 593100A2CFD0A28C7FDB773C /* Pods_DependencyGraphDemo_DependencyGraphDemoUITests.framework in Frameworks */, 88 | ); 89 | runOnlyForDeploymentPostprocessing = 0; 90 | }; 91 | /* End PBXFrameworksBuildPhase section */ 92 | 93 | /* Begin PBXGroup section */ 94 | 0332883E35757AA7E1A45F33 /* Frameworks */ = { 95 | isa = PBXGroup; 96 | children = ( 97 | 4DCB922D16DF0D94DCFCE622 /* Pods_DependencyGraphDemo.framework */, 98 | F2B4E60EB0957D3326F36B89 /* Pods_DependencyGraphDemo_DependencyGraphDemoUITests.framework */, 99 | 29B26964FDDDB3B22842767B /* Pods_DependencyGraphDemoTests.framework */, 100 | ); 101 | name = Frameworks; 102 | sourceTree = ""; 103 | }; 104 | 454A368824D59C0A00AC3B59 = { 105 | isa = PBXGroup; 106 | children = ( 107 | 454A369324D59C0A00AC3B59 /* DependencyGraphDemo */, 108 | 454A36AA24D59C0C00AC3B59 /* DependencyGraphDemoTests */, 109 | 454A36B524D59C0C00AC3B59 /* DependencyGraphDemoUITests */, 110 | 454A369224D59C0A00AC3B59 /* Products */, 111 | 9D7CF61899BEF194FEE522CD /* Pods */, 112 | 0332883E35757AA7E1A45F33 /* Frameworks */, 113 | ); 114 | sourceTree = ""; 115 | }; 116 | 454A369224D59C0A00AC3B59 /* Products */ = { 117 | isa = PBXGroup; 118 | children = ( 119 | 454A369124D59C0A00AC3B59 /* DependencyGraphDemo.app */, 120 | 454A36A724D59C0C00AC3B59 /* DependencyGraphDemoTests.xctest */, 121 | 454A36B224D59C0C00AC3B59 /* DependencyGraphDemoUITests.xctest */, 122 | ); 123 | name = Products; 124 | sourceTree = ""; 125 | }; 126 | 454A369324D59C0A00AC3B59 /* DependencyGraphDemo */ = { 127 | isa = PBXGroup; 128 | children = ( 129 | 454A369424D59C0A00AC3B59 /* AppDelegate.swift */, 130 | 454A369624D59C0A00AC3B59 /* SceneDelegate.swift */, 131 | 454A369824D59C0A00AC3B59 /* ViewController.swift */, 132 | 454A369A24D59C0A00AC3B59 /* Main.storyboard */, 133 | 454A369D24D59C0C00AC3B59 /* Assets.xcassets */, 134 | 454A369F24D59C0C00AC3B59 /* LaunchScreen.storyboard */, 135 | 454A36A224D59C0C00AC3B59 /* Info.plist */, 136 | ); 137 | path = DependencyGraphDemo; 138 | sourceTree = ""; 139 | }; 140 | 454A36AA24D59C0C00AC3B59 /* DependencyGraphDemoTests */ = { 141 | isa = PBXGroup; 142 | children = ( 143 | 454A36AB24D59C0C00AC3B59 /* DependencyGraphDemoTests.swift */, 144 | 454A36AD24D59C0C00AC3B59 /* Info.plist */, 145 | ); 146 | path = DependencyGraphDemoTests; 147 | sourceTree = ""; 148 | }; 149 | 454A36B524D59C0C00AC3B59 /* DependencyGraphDemoUITests */ = { 150 | isa = PBXGroup; 151 | children = ( 152 | 454A36B624D59C0C00AC3B59 /* DependencyGraphDemoUITests.swift */, 153 | 454A36B824D59C0C00AC3B59 /* Info.plist */, 154 | ); 155 | path = DependencyGraphDemoUITests; 156 | sourceTree = ""; 157 | }; 158 | 9D7CF61899BEF194FEE522CD /* Pods */ = { 159 | isa = PBXGroup; 160 | children = ( 161 | C5BEB8ADA80E705659B02867 /* Pods-DependencyGraphDemo.debug.xcconfig */, 162 | DA58025080C680B085519590 /* Pods-DependencyGraphDemo.release.xcconfig */, 163 | 914CE38D51159F7BA8973ED8 /* Pods-DependencyGraphDemo-DependencyGraphDemoUITests.debug.xcconfig */, 164 | 2CEBB6F230E3F5E4E66085CE /* Pods-DependencyGraphDemo-DependencyGraphDemoUITests.release.xcconfig */, 165 | 6D90743A5775187C92EB54BC /* Pods-DependencyGraphDemoTests.debug.xcconfig */, 166 | BF79C953E7A95BB500D6C2CE /* Pods-DependencyGraphDemoTests.release.xcconfig */, 167 | ); 168 | name = Pods; 169 | path = Pods; 170 | sourceTree = ""; 171 | }; 172 | /* End PBXGroup section */ 173 | 174 | /* Begin PBXNativeTarget section */ 175 | 454A369024D59C0A00AC3B59 /* DependencyGraphDemo */ = { 176 | isa = PBXNativeTarget; 177 | buildConfigurationList = 454A36BB24D59C0C00AC3B59 /* Build configuration list for PBXNativeTarget "DependencyGraphDemo" */; 178 | buildPhases = ( 179 | 9AE683DC1DE2DA980A6A0C86 /* [CP] Check Pods Manifest.lock */, 180 | 454A368D24D59C0A00AC3B59 /* Sources */, 181 | 454A368E24D59C0A00AC3B59 /* Frameworks */, 182 | 454A368F24D59C0A00AC3B59 /* Resources */, 183 | 1ECA1C6716089A662D93DF6B /* [CP] Embed Pods Frameworks */, 184 | ); 185 | buildRules = ( 186 | ); 187 | dependencies = ( 188 | ); 189 | name = DependencyGraphDemo; 190 | productName = DependencyGraphDemo; 191 | productReference = 454A369124D59C0A00AC3B59 /* DependencyGraphDemo.app */; 192 | productType = "com.apple.product-type.application"; 193 | }; 194 | 454A36A624D59C0C00AC3B59 /* DependencyGraphDemoTests */ = { 195 | isa = PBXNativeTarget; 196 | buildConfigurationList = 454A36BE24D59C0C00AC3B59 /* Build configuration list for PBXNativeTarget "DependencyGraphDemoTests" */; 197 | buildPhases = ( 198 | 8A619171DA1D275CDA7963BC /* [CP] Check Pods Manifest.lock */, 199 | 454A36A324D59C0C00AC3B59 /* Sources */, 200 | 454A36A424D59C0C00AC3B59 /* Frameworks */, 201 | 454A36A524D59C0C00AC3B59 /* Resources */, 202 | ); 203 | buildRules = ( 204 | ); 205 | dependencies = ( 206 | 454A36A924D59C0C00AC3B59 /* PBXTargetDependency */, 207 | ); 208 | name = DependencyGraphDemoTests; 209 | productName = DependencyGraphDemoTests; 210 | productReference = 454A36A724D59C0C00AC3B59 /* DependencyGraphDemoTests.xctest */; 211 | productType = "com.apple.product-type.bundle.unit-test"; 212 | }; 213 | 454A36B124D59C0C00AC3B59 /* DependencyGraphDemoUITests */ = { 214 | isa = PBXNativeTarget; 215 | buildConfigurationList = 454A36C124D59C0C00AC3B59 /* Build configuration list for PBXNativeTarget "DependencyGraphDemoUITests" */; 216 | buildPhases = ( 217 | 4D7F541A5130337AD18AA537 /* [CP] Check Pods Manifest.lock */, 218 | 454A36AE24D59C0C00AC3B59 /* Sources */, 219 | 454A36AF24D59C0C00AC3B59 /* Frameworks */, 220 | 454A36B024D59C0C00AC3B59 /* Resources */, 221 | 733E550254A52319CD2893C8 /* [CP] Embed Pods Frameworks */, 222 | ); 223 | buildRules = ( 224 | ); 225 | dependencies = ( 226 | 454A36B424D59C0C00AC3B59 /* PBXTargetDependency */, 227 | ); 228 | name = DependencyGraphDemoUITests; 229 | productName = DependencyGraphDemoUITests; 230 | productReference = 454A36B224D59C0C00AC3B59 /* DependencyGraphDemoUITests.xctest */; 231 | productType = "com.apple.product-type.bundle.ui-testing"; 232 | }; 233 | /* End PBXNativeTarget section */ 234 | 235 | /* Begin PBXProject section */ 236 | 454A368924D59C0A00AC3B59 /* Project object */ = { 237 | isa = PBXProject; 238 | attributes = { 239 | LastSwiftUpdateCheck = 1160; 240 | LastUpgradeCheck = 1160; 241 | ORGANIZATIONNAME = RY; 242 | TargetAttributes = { 243 | 454A369024D59C0A00AC3B59 = { 244 | CreatedOnToolsVersion = 11.6; 245 | }; 246 | 454A36A624D59C0C00AC3B59 = { 247 | CreatedOnToolsVersion = 11.6; 248 | TestTargetID = 454A369024D59C0A00AC3B59; 249 | }; 250 | 454A36B124D59C0C00AC3B59 = { 251 | CreatedOnToolsVersion = 11.6; 252 | TestTargetID = 454A369024D59C0A00AC3B59; 253 | }; 254 | }; 255 | }; 256 | buildConfigurationList = 454A368C24D59C0A00AC3B59 /* Build configuration list for PBXProject "DependencyGraphDemo" */; 257 | compatibilityVersion = "Xcode 9.3"; 258 | developmentRegion = en; 259 | hasScannedForEncodings = 0; 260 | knownRegions = ( 261 | en, 262 | Base, 263 | ); 264 | mainGroup = 454A368824D59C0A00AC3B59; 265 | productRefGroup = 454A369224D59C0A00AC3B59 /* Products */; 266 | projectDirPath = ""; 267 | projectRoot = ""; 268 | targets = ( 269 | 454A369024D59C0A00AC3B59 /* DependencyGraphDemo */, 270 | 454A36A624D59C0C00AC3B59 /* DependencyGraphDemoTests */, 271 | 454A36B124D59C0C00AC3B59 /* DependencyGraphDemoUITests */, 272 | ); 273 | }; 274 | /* End PBXProject section */ 275 | 276 | /* Begin PBXResourcesBuildPhase section */ 277 | 454A368F24D59C0A00AC3B59 /* Resources */ = { 278 | isa = PBXResourcesBuildPhase; 279 | buildActionMask = 2147483647; 280 | files = ( 281 | 454A36A124D59C0C00AC3B59 /* LaunchScreen.storyboard in Resources */, 282 | 454A369E24D59C0C00AC3B59 /* Assets.xcassets in Resources */, 283 | 454A369C24D59C0A00AC3B59 /* Main.storyboard in Resources */, 284 | ); 285 | runOnlyForDeploymentPostprocessing = 0; 286 | }; 287 | 454A36A524D59C0C00AC3B59 /* Resources */ = { 288 | isa = PBXResourcesBuildPhase; 289 | buildActionMask = 2147483647; 290 | files = ( 291 | ); 292 | runOnlyForDeploymentPostprocessing = 0; 293 | }; 294 | 454A36B024D59C0C00AC3B59 /* Resources */ = { 295 | isa = PBXResourcesBuildPhase; 296 | buildActionMask = 2147483647; 297 | files = ( 298 | ); 299 | runOnlyForDeploymentPostprocessing = 0; 300 | }; 301 | /* End PBXResourcesBuildPhase section */ 302 | 303 | /* Begin PBXShellScriptBuildPhase section */ 304 | 1ECA1C6716089A662D93DF6B /* [CP] Embed Pods Frameworks */ = { 305 | isa = PBXShellScriptBuildPhase; 306 | buildActionMask = 2147483647; 307 | files = ( 308 | ); 309 | inputFileListPaths = ( 310 | "${PODS_ROOT}/Target Support Files/Pods-DependencyGraphDemo/Pods-DependencyGraphDemo-frameworks-${CONFIGURATION}-input-files.xcfilelist", 311 | ); 312 | name = "[CP] Embed Pods Frameworks"; 313 | outputFileListPaths = ( 314 | "${PODS_ROOT}/Target Support Files/Pods-DependencyGraphDemo/Pods-DependencyGraphDemo-frameworks-${CONFIGURATION}-output-files.xcfilelist", 315 | ); 316 | runOnlyForDeploymentPostprocessing = 0; 317 | shellPath = /bin/sh; 318 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-DependencyGraphDemo/Pods-DependencyGraphDemo-frameworks.sh\"\n"; 319 | showEnvVarsInLog = 0; 320 | }; 321 | 4D7F541A5130337AD18AA537 /* [CP] Check Pods Manifest.lock */ = { 322 | isa = PBXShellScriptBuildPhase; 323 | buildActionMask = 2147483647; 324 | files = ( 325 | ); 326 | inputFileListPaths = ( 327 | ); 328 | inputPaths = ( 329 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 330 | "${PODS_ROOT}/Manifest.lock", 331 | ); 332 | name = "[CP] Check Pods Manifest.lock"; 333 | outputFileListPaths = ( 334 | ); 335 | outputPaths = ( 336 | "$(DERIVED_FILE_DIR)/Pods-DependencyGraphDemo-DependencyGraphDemoUITests-checkManifestLockResult.txt", 337 | ); 338 | runOnlyForDeploymentPostprocessing = 0; 339 | shellPath = /bin/sh; 340 | 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"; 341 | showEnvVarsInLog = 0; 342 | }; 343 | 733E550254A52319CD2893C8 /* [CP] Embed Pods Frameworks */ = { 344 | isa = PBXShellScriptBuildPhase; 345 | buildActionMask = 2147483647; 346 | files = ( 347 | ); 348 | inputFileListPaths = ( 349 | "${PODS_ROOT}/Target Support Files/Pods-DependencyGraphDemo-DependencyGraphDemoUITests/Pods-DependencyGraphDemo-DependencyGraphDemoUITests-frameworks-${CONFIGURATION}-input-files.xcfilelist", 350 | ); 351 | name = "[CP] Embed Pods Frameworks"; 352 | outputFileListPaths = ( 353 | "${PODS_ROOT}/Target Support Files/Pods-DependencyGraphDemo-DependencyGraphDemoUITests/Pods-DependencyGraphDemo-DependencyGraphDemoUITests-frameworks-${CONFIGURATION}-output-files.xcfilelist", 354 | ); 355 | runOnlyForDeploymentPostprocessing = 0; 356 | shellPath = /bin/sh; 357 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-DependencyGraphDemo-DependencyGraphDemoUITests/Pods-DependencyGraphDemo-DependencyGraphDemoUITests-frameworks.sh\"\n"; 358 | showEnvVarsInLog = 0; 359 | }; 360 | 8A619171DA1D275CDA7963BC /* [CP] Check Pods Manifest.lock */ = { 361 | isa = PBXShellScriptBuildPhase; 362 | buildActionMask = 2147483647; 363 | files = ( 364 | ); 365 | inputFileListPaths = ( 366 | ); 367 | inputPaths = ( 368 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 369 | "${PODS_ROOT}/Manifest.lock", 370 | ); 371 | name = "[CP] Check Pods Manifest.lock"; 372 | outputFileListPaths = ( 373 | ); 374 | outputPaths = ( 375 | "$(DERIVED_FILE_DIR)/Pods-DependencyGraphDemoTests-checkManifestLockResult.txt", 376 | ); 377 | runOnlyForDeploymentPostprocessing = 0; 378 | shellPath = /bin/sh; 379 | 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"; 380 | showEnvVarsInLog = 0; 381 | }; 382 | 9AE683DC1DE2DA980A6A0C86 /* [CP] Check Pods Manifest.lock */ = { 383 | isa = PBXShellScriptBuildPhase; 384 | buildActionMask = 2147483647; 385 | files = ( 386 | ); 387 | inputFileListPaths = ( 388 | ); 389 | inputPaths = ( 390 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 391 | "${PODS_ROOT}/Manifest.lock", 392 | ); 393 | name = "[CP] Check Pods Manifest.lock"; 394 | outputFileListPaths = ( 395 | ); 396 | outputPaths = ( 397 | "$(DERIVED_FILE_DIR)/Pods-DependencyGraphDemo-checkManifestLockResult.txt", 398 | ); 399 | runOnlyForDeploymentPostprocessing = 0; 400 | shellPath = /bin/sh; 401 | 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"; 402 | showEnvVarsInLog = 0; 403 | }; 404 | /* End PBXShellScriptBuildPhase section */ 405 | 406 | /* Begin PBXSourcesBuildPhase section */ 407 | 454A368D24D59C0A00AC3B59 /* Sources */ = { 408 | isa = PBXSourcesBuildPhase; 409 | buildActionMask = 2147483647; 410 | files = ( 411 | 454A369924D59C0A00AC3B59 /* ViewController.swift in Sources */, 412 | 454A369524D59C0A00AC3B59 /* AppDelegate.swift in Sources */, 413 | 454A369724D59C0A00AC3B59 /* SceneDelegate.swift in Sources */, 414 | ); 415 | runOnlyForDeploymentPostprocessing = 0; 416 | }; 417 | 454A36A324D59C0C00AC3B59 /* Sources */ = { 418 | isa = PBXSourcesBuildPhase; 419 | buildActionMask = 2147483647; 420 | files = ( 421 | 454A36AC24D59C0C00AC3B59 /* DependencyGraphDemoTests.swift in Sources */, 422 | ); 423 | runOnlyForDeploymentPostprocessing = 0; 424 | }; 425 | 454A36AE24D59C0C00AC3B59 /* Sources */ = { 426 | isa = PBXSourcesBuildPhase; 427 | buildActionMask = 2147483647; 428 | files = ( 429 | 454A36B724D59C0C00AC3B59 /* DependencyGraphDemoUITests.swift in Sources */, 430 | ); 431 | runOnlyForDeploymentPostprocessing = 0; 432 | }; 433 | /* End PBXSourcesBuildPhase section */ 434 | 435 | /* Begin PBXTargetDependency section */ 436 | 454A36A924D59C0C00AC3B59 /* PBXTargetDependency */ = { 437 | isa = PBXTargetDependency; 438 | target = 454A369024D59C0A00AC3B59 /* DependencyGraphDemo */; 439 | targetProxy = 454A36A824D59C0C00AC3B59 /* PBXContainerItemProxy */; 440 | }; 441 | 454A36B424D59C0C00AC3B59 /* PBXTargetDependency */ = { 442 | isa = PBXTargetDependency; 443 | target = 454A369024D59C0A00AC3B59 /* DependencyGraphDemo */; 444 | targetProxy = 454A36B324D59C0C00AC3B59 /* PBXContainerItemProxy */; 445 | }; 446 | /* End PBXTargetDependency section */ 447 | 448 | /* Begin PBXVariantGroup section */ 449 | 454A369A24D59C0A00AC3B59 /* Main.storyboard */ = { 450 | isa = PBXVariantGroup; 451 | children = ( 452 | 454A369B24D59C0A00AC3B59 /* Base */, 453 | ); 454 | name = Main.storyboard; 455 | sourceTree = ""; 456 | }; 457 | 454A369F24D59C0C00AC3B59 /* LaunchScreen.storyboard */ = { 458 | isa = PBXVariantGroup; 459 | children = ( 460 | 454A36A024D59C0C00AC3B59 /* Base */, 461 | ); 462 | name = LaunchScreen.storyboard; 463 | sourceTree = ""; 464 | }; 465 | /* End PBXVariantGroup section */ 466 | 467 | /* Begin XCBuildConfiguration section */ 468 | 454A36B924D59C0C00AC3B59 /* Debug */ = { 469 | isa = XCBuildConfiguration; 470 | buildSettings = { 471 | ALWAYS_SEARCH_USER_PATHS = NO; 472 | CLANG_ANALYZER_NONNULL = YES; 473 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 474 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 475 | CLANG_CXX_LIBRARY = "libc++"; 476 | CLANG_ENABLE_MODULES = YES; 477 | CLANG_ENABLE_OBJC_ARC = YES; 478 | CLANG_ENABLE_OBJC_WEAK = YES; 479 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 480 | CLANG_WARN_BOOL_CONVERSION = YES; 481 | CLANG_WARN_COMMA = YES; 482 | CLANG_WARN_CONSTANT_CONVERSION = YES; 483 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 484 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 485 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 486 | CLANG_WARN_EMPTY_BODY = YES; 487 | CLANG_WARN_ENUM_CONVERSION = YES; 488 | CLANG_WARN_INFINITE_RECURSION = YES; 489 | CLANG_WARN_INT_CONVERSION = YES; 490 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 491 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 492 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 493 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 494 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 495 | CLANG_WARN_STRICT_PROTOTYPES = YES; 496 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 497 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 498 | CLANG_WARN_UNREACHABLE_CODE = YES; 499 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 500 | COPY_PHASE_STRIP = NO; 501 | DEBUG_INFORMATION_FORMAT = dwarf; 502 | ENABLE_STRICT_OBJC_MSGSEND = YES; 503 | ENABLE_TESTABILITY = YES; 504 | GCC_C_LANGUAGE_STANDARD = gnu11; 505 | GCC_DYNAMIC_NO_PIC = NO; 506 | GCC_NO_COMMON_BLOCKS = YES; 507 | GCC_OPTIMIZATION_LEVEL = 0; 508 | GCC_PREPROCESSOR_DEFINITIONS = ( 509 | "DEBUG=1", 510 | "$(inherited)", 511 | ); 512 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 513 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 514 | GCC_WARN_UNDECLARED_SELECTOR = YES; 515 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 516 | GCC_WARN_UNUSED_FUNCTION = YES; 517 | GCC_WARN_UNUSED_VARIABLE = YES; 518 | IPHONEOS_DEPLOYMENT_TARGET = 13.6; 519 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 520 | MTL_FAST_MATH = YES; 521 | ONLY_ACTIVE_ARCH = YES; 522 | SDKROOT = iphoneos; 523 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 524 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 525 | }; 526 | name = Debug; 527 | }; 528 | 454A36BA24D59C0C00AC3B59 /* Release */ = { 529 | isa = XCBuildConfiguration; 530 | buildSettings = { 531 | ALWAYS_SEARCH_USER_PATHS = NO; 532 | CLANG_ANALYZER_NONNULL = YES; 533 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 534 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 535 | CLANG_CXX_LIBRARY = "libc++"; 536 | CLANG_ENABLE_MODULES = YES; 537 | CLANG_ENABLE_OBJC_ARC = YES; 538 | CLANG_ENABLE_OBJC_WEAK = YES; 539 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 540 | CLANG_WARN_BOOL_CONVERSION = YES; 541 | CLANG_WARN_COMMA = YES; 542 | CLANG_WARN_CONSTANT_CONVERSION = YES; 543 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 544 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 545 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 546 | CLANG_WARN_EMPTY_BODY = YES; 547 | CLANG_WARN_ENUM_CONVERSION = YES; 548 | CLANG_WARN_INFINITE_RECURSION = YES; 549 | CLANG_WARN_INT_CONVERSION = YES; 550 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 551 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 552 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 553 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 554 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 555 | CLANG_WARN_STRICT_PROTOTYPES = YES; 556 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 557 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 558 | CLANG_WARN_UNREACHABLE_CODE = YES; 559 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 560 | COPY_PHASE_STRIP = NO; 561 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 562 | ENABLE_NS_ASSERTIONS = NO; 563 | ENABLE_STRICT_OBJC_MSGSEND = YES; 564 | GCC_C_LANGUAGE_STANDARD = gnu11; 565 | GCC_NO_COMMON_BLOCKS = YES; 566 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 567 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 568 | GCC_WARN_UNDECLARED_SELECTOR = YES; 569 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 570 | GCC_WARN_UNUSED_FUNCTION = YES; 571 | GCC_WARN_UNUSED_VARIABLE = YES; 572 | IPHONEOS_DEPLOYMENT_TARGET = 13.6; 573 | MTL_ENABLE_DEBUG_INFO = NO; 574 | MTL_FAST_MATH = YES; 575 | SDKROOT = iphoneos; 576 | SWIFT_COMPILATION_MODE = wholemodule; 577 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 578 | VALIDATE_PRODUCT = YES; 579 | }; 580 | name = Release; 581 | }; 582 | 454A36BC24D59C0C00AC3B59 /* Debug */ = { 583 | isa = XCBuildConfiguration; 584 | baseConfigurationReference = C5BEB8ADA80E705659B02867 /* Pods-DependencyGraphDemo.debug.xcconfig */; 585 | buildSettings = { 586 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 587 | CODE_SIGN_STYLE = Automatic; 588 | DEVELOPMENT_TEAM = 93885954WQ; 589 | INFOPLIST_FILE = DependencyGraphDemo/Info.plist; 590 | LD_RUNPATH_SEARCH_PATHS = ( 591 | "$(inherited)", 592 | "@executable_path/Frameworks", 593 | ); 594 | PRODUCT_BUNDLE_IDENTIFIER = com.rong.lan.DependencyGraphDemo; 595 | PRODUCT_NAME = "$(TARGET_NAME)"; 596 | SWIFT_VERSION = 5.0; 597 | TARGETED_DEVICE_FAMILY = "1,2"; 598 | }; 599 | name = Debug; 600 | }; 601 | 454A36BD24D59C0C00AC3B59 /* Release */ = { 602 | isa = XCBuildConfiguration; 603 | baseConfigurationReference = DA58025080C680B085519590 /* Pods-DependencyGraphDemo.release.xcconfig */; 604 | buildSettings = { 605 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 606 | CODE_SIGN_STYLE = Automatic; 607 | DEVELOPMENT_TEAM = 93885954WQ; 608 | INFOPLIST_FILE = DependencyGraphDemo/Info.plist; 609 | LD_RUNPATH_SEARCH_PATHS = ( 610 | "$(inherited)", 611 | "@executable_path/Frameworks", 612 | ); 613 | PRODUCT_BUNDLE_IDENTIFIER = com.rong.lan.DependencyGraphDemo; 614 | PRODUCT_NAME = "$(TARGET_NAME)"; 615 | SWIFT_VERSION = 5.0; 616 | TARGETED_DEVICE_FAMILY = "1,2"; 617 | }; 618 | name = Release; 619 | }; 620 | 454A36BF24D59C0C00AC3B59 /* Debug */ = { 621 | isa = XCBuildConfiguration; 622 | baseConfigurationReference = 6D90743A5775187C92EB54BC /* Pods-DependencyGraphDemoTests.debug.xcconfig */; 623 | buildSettings = { 624 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 625 | BUNDLE_LOADER = "$(TEST_HOST)"; 626 | CODE_SIGN_STYLE = Automatic; 627 | DEVELOPMENT_TEAM = 93885954WQ; 628 | INFOPLIST_FILE = DependencyGraphDemoTests/Info.plist; 629 | IPHONEOS_DEPLOYMENT_TARGET = 13.6; 630 | LD_RUNPATH_SEARCH_PATHS = ( 631 | "$(inherited)", 632 | "@executable_path/Frameworks", 633 | "@loader_path/Frameworks", 634 | ); 635 | PRODUCT_BUNDLE_IDENTIFIER = com.rong.lan.DependencyGraphDemoTests; 636 | PRODUCT_NAME = "$(TARGET_NAME)"; 637 | SWIFT_VERSION = 5.0; 638 | TARGETED_DEVICE_FAMILY = "1,2"; 639 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/DependencyGraphDemo.app/DependencyGraphDemo"; 640 | }; 641 | name = Debug; 642 | }; 643 | 454A36C024D59C0C00AC3B59 /* Release */ = { 644 | isa = XCBuildConfiguration; 645 | baseConfigurationReference = BF79C953E7A95BB500D6C2CE /* Pods-DependencyGraphDemoTests.release.xcconfig */; 646 | buildSettings = { 647 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 648 | BUNDLE_LOADER = "$(TEST_HOST)"; 649 | CODE_SIGN_STYLE = Automatic; 650 | DEVELOPMENT_TEAM = 93885954WQ; 651 | INFOPLIST_FILE = DependencyGraphDemoTests/Info.plist; 652 | IPHONEOS_DEPLOYMENT_TARGET = 13.6; 653 | LD_RUNPATH_SEARCH_PATHS = ( 654 | "$(inherited)", 655 | "@executable_path/Frameworks", 656 | "@loader_path/Frameworks", 657 | ); 658 | PRODUCT_BUNDLE_IDENTIFIER = com.rong.lan.DependencyGraphDemoTests; 659 | PRODUCT_NAME = "$(TARGET_NAME)"; 660 | SWIFT_VERSION = 5.0; 661 | TARGETED_DEVICE_FAMILY = "1,2"; 662 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/DependencyGraphDemo.app/DependencyGraphDemo"; 663 | }; 664 | name = Release; 665 | }; 666 | 454A36C224D59C0C00AC3B59 /* Debug */ = { 667 | isa = XCBuildConfiguration; 668 | baseConfigurationReference = 914CE38D51159F7BA8973ED8 /* Pods-DependencyGraphDemo-DependencyGraphDemoUITests.debug.xcconfig */; 669 | buildSettings = { 670 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 671 | CODE_SIGN_STYLE = Automatic; 672 | DEVELOPMENT_TEAM = 93885954WQ; 673 | INFOPLIST_FILE = DependencyGraphDemoUITests/Info.plist; 674 | LD_RUNPATH_SEARCH_PATHS = ( 675 | "$(inherited)", 676 | "@executable_path/Frameworks", 677 | "@loader_path/Frameworks", 678 | ); 679 | PRODUCT_BUNDLE_IDENTIFIER = com.rong.lan.DependencyGraphDemoUITests; 680 | PRODUCT_NAME = "$(TARGET_NAME)"; 681 | SWIFT_VERSION = 5.0; 682 | TARGETED_DEVICE_FAMILY = "1,2"; 683 | TEST_TARGET_NAME = DependencyGraphDemo; 684 | }; 685 | name = Debug; 686 | }; 687 | 454A36C324D59C0C00AC3B59 /* Release */ = { 688 | isa = XCBuildConfiguration; 689 | baseConfigurationReference = 2CEBB6F230E3F5E4E66085CE /* Pods-DependencyGraphDemo-DependencyGraphDemoUITests.release.xcconfig */; 690 | buildSettings = { 691 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 692 | CODE_SIGN_STYLE = Automatic; 693 | DEVELOPMENT_TEAM = 93885954WQ; 694 | INFOPLIST_FILE = DependencyGraphDemoUITests/Info.plist; 695 | LD_RUNPATH_SEARCH_PATHS = ( 696 | "$(inherited)", 697 | "@executable_path/Frameworks", 698 | "@loader_path/Frameworks", 699 | ); 700 | PRODUCT_BUNDLE_IDENTIFIER = com.rong.lan.DependencyGraphDemoUITests; 701 | PRODUCT_NAME = "$(TARGET_NAME)"; 702 | SWIFT_VERSION = 5.0; 703 | TARGETED_DEVICE_FAMILY = "1,2"; 704 | TEST_TARGET_NAME = DependencyGraphDemo; 705 | }; 706 | name = Release; 707 | }; 708 | /* End XCBuildConfiguration section */ 709 | 710 | /* Begin XCConfigurationList section */ 711 | 454A368C24D59C0A00AC3B59 /* Build configuration list for PBXProject "DependencyGraphDemo" */ = { 712 | isa = XCConfigurationList; 713 | buildConfigurations = ( 714 | 454A36B924D59C0C00AC3B59 /* Debug */, 715 | 454A36BA24D59C0C00AC3B59 /* Release */, 716 | ); 717 | defaultConfigurationIsVisible = 0; 718 | defaultConfigurationName = Release; 719 | }; 720 | 454A36BB24D59C0C00AC3B59 /* Build configuration list for PBXNativeTarget "DependencyGraphDemo" */ = { 721 | isa = XCConfigurationList; 722 | buildConfigurations = ( 723 | 454A36BC24D59C0C00AC3B59 /* Debug */, 724 | 454A36BD24D59C0C00AC3B59 /* Release */, 725 | ); 726 | defaultConfigurationIsVisible = 0; 727 | defaultConfigurationName = Release; 728 | }; 729 | 454A36BE24D59C0C00AC3B59 /* Build configuration list for PBXNativeTarget "DependencyGraphDemoTests" */ = { 730 | isa = XCConfigurationList; 731 | buildConfigurations = ( 732 | 454A36BF24D59C0C00AC3B59 /* Debug */, 733 | 454A36C024D59C0C00AC3B59 /* Release */, 734 | ); 735 | defaultConfigurationIsVisible = 0; 736 | defaultConfigurationName = Release; 737 | }; 738 | 454A36C124D59C0C00AC3B59 /* Build configuration list for PBXNativeTarget "DependencyGraphDemoUITests" */ = { 739 | isa = XCConfigurationList; 740 | buildConfigurations = ( 741 | 454A36C224D59C0C00AC3B59 /* Debug */, 742 | 454A36C324D59C0C00AC3B59 /* Release */, 743 | ); 744 | defaultConfigurationIsVisible = 0; 745 | defaultConfigurationName = Release; 746 | }; 747 | /* End XCConfigurationList section */ 748 | }; 749 | rootObject = 454A368924D59C0A00AC3B59 /* Project object */; 750 | } 751 | -------------------------------------------------------------------------------- /demo/DependencyGraphDemo/DependencyGraphDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /demo/DependencyGraphDemo/DependencyGraphDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /demo/DependencyGraphDemo/DependencyGraphDemo.xcodeproj/xcuserdata/zhengrongyan.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | DependencyGraphDemo.xcscheme_^#shared#^_ 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /demo/DependencyGraphDemo/DependencyGraphDemo/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // DependencyGraphDemo 4 | // 5 | // Created by 蓝容 on 1/8/20. 6 | // Copyright © 2020 RY. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @UIApplicationMain 12 | class AppDelegate: UIResponder, UIApplicationDelegate { 13 | 14 | 15 | 16 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 17 | // Override point for customization after application launch. 18 | return true 19 | } 20 | 21 | // MARK: UISceneSession Lifecycle 22 | 23 | func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { 24 | // Called when a new scene session is being created. 25 | // Use this method to select a configuration to create the new scene with. 26 | return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) 27 | } 28 | 29 | func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) { 30 | // Called when the user discards a scene session. 31 | // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions. 32 | // Use this method to release any resources that were specific to the discarded scenes, as they will not return. 33 | } 34 | 35 | 36 | } 37 | 38 | -------------------------------------------------------------------------------- /demo/DependencyGraphDemo/DependencyGraphDemo/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "scale" : "2x", 6 | "size" : "20x20" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "scale" : "3x", 11 | "size" : "20x20" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "scale" : "2x", 16 | "size" : "29x29" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "scale" : "3x", 21 | "size" : "29x29" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "scale" : "2x", 26 | "size" : "40x40" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "scale" : "3x", 31 | "size" : "40x40" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "scale" : "2x", 36 | "size" : "60x60" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "scale" : "3x", 41 | "size" : "60x60" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "scale" : "1x", 46 | "size" : "20x20" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "scale" : "2x", 51 | "size" : "20x20" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "scale" : "1x", 56 | "size" : "29x29" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "scale" : "2x", 61 | "size" : "29x29" 62 | }, 63 | { 64 | "idiom" : "ipad", 65 | "scale" : "1x", 66 | "size" : "40x40" 67 | }, 68 | { 69 | "idiom" : "ipad", 70 | "scale" : "2x", 71 | "size" : "40x40" 72 | }, 73 | { 74 | "idiom" : "ipad", 75 | "scale" : "1x", 76 | "size" : "76x76" 77 | }, 78 | { 79 | "idiom" : "ipad", 80 | "scale" : "2x", 81 | "size" : "76x76" 82 | }, 83 | { 84 | "idiom" : "ipad", 85 | "scale" : "2x", 86 | "size" : "83.5x83.5" 87 | }, 88 | { 89 | "idiom" : "ios-marketing", 90 | "scale" : "1x", 91 | "size" : "1024x1024" 92 | } 93 | ], 94 | "info" : { 95 | "author" : "xcode", 96 | "version" : 1 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /demo/DependencyGraphDemo/DependencyGraphDemo/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /demo/DependencyGraphDemo/DependencyGraphDemo/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 | -------------------------------------------------------------------------------- /demo/DependencyGraphDemo/DependencyGraphDemo/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 | -------------------------------------------------------------------------------- /demo/DependencyGraphDemo/DependencyGraphDemo/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 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | LSRequiresIPhoneOS 22 | 23 | UIApplicationSceneManifest 24 | 25 | UIApplicationSupportsMultipleScenes 26 | 27 | UISceneConfigurations 28 | 29 | UIWindowSceneSessionRoleApplication 30 | 31 | 32 | UISceneConfigurationName 33 | Default Configuration 34 | UISceneDelegateClassName 35 | $(PRODUCT_MODULE_NAME).SceneDelegate 36 | UISceneStoryboardFile 37 | Main 38 | 39 | 40 | 41 | 42 | UILaunchStoryboardName 43 | LaunchScreen 44 | UIMainStoryboardFile 45 | Main 46 | UIRequiredDeviceCapabilities 47 | 48 | armv7 49 | 50 | UISupportedInterfaceOrientations 51 | 52 | UIInterfaceOrientationPortrait 53 | UIInterfaceOrientationLandscapeLeft 54 | UIInterfaceOrientationLandscapeRight 55 | 56 | UISupportedInterfaceOrientations~ipad 57 | 58 | UIInterfaceOrientationPortrait 59 | UIInterfaceOrientationPortraitUpsideDown 60 | UIInterfaceOrientationLandscapeLeft 61 | UIInterfaceOrientationLandscapeRight 62 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /demo/DependencyGraphDemo/DependencyGraphDemo/SceneDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SceneDelegate.swift 3 | // DependencyGraphDemo 4 | // 5 | // Created by 蓝容 on 1/8/20. 6 | // Copyright © 2020 RY. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class SceneDelegate: UIResponder, UIWindowSceneDelegate { 12 | 13 | var window: UIWindow? 14 | 15 | 16 | func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { 17 | // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`. 18 | // If using a storyboard, the `window` property will automatically be initialized and attached to the scene. 19 | // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead). 20 | guard let _ = (scene as? UIWindowScene) else { return } 21 | } 22 | 23 | func sceneDidDisconnect(_ scene: UIScene) { 24 | // Called as the scene is being released by the system. 25 | // This occurs shortly after the scene enters the background, or when its session is discarded. 26 | // Release any resources associated with this scene that can be re-created the next time the scene connects. 27 | // The scene may re-connect later, as its session was not neccessarily discarded (see `application:didDiscardSceneSessions` instead). 28 | } 29 | 30 | func sceneDidBecomeActive(_ scene: UIScene) { 31 | // Called when the scene has moved from an inactive state to an active state. 32 | // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive. 33 | } 34 | 35 | func sceneWillResignActive(_ scene: UIScene) { 36 | // Called when the scene will move from an active state to an inactive state. 37 | // This may occur due to temporary interruptions (ex. an incoming phone call). 38 | } 39 | 40 | func sceneWillEnterForeground(_ scene: UIScene) { 41 | // Called as the scene transitions from the background to the foreground. 42 | // Use this method to undo the changes made on entering the background. 43 | } 44 | 45 | func sceneDidEnterBackground(_ scene: UIScene) { 46 | // Called as the scene transitions from the foreground to the background. 47 | // Use this method to save data, release shared resources, and store enough scene-specific state information 48 | // to restore the scene back to its current state. 49 | } 50 | 51 | 52 | } 53 | 54 | -------------------------------------------------------------------------------- /demo/DependencyGraphDemo/DependencyGraphDemo/ViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.swift 3 | // DependencyGraphDemo 4 | // 5 | // Created by 蓝容 on 1/8/20. 6 | // Copyright © 2020 RY. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class ViewController: UIViewController { 12 | 13 | override func viewDidLoad() { 14 | super.viewDidLoad() 15 | // Do any additional setup after loading the view. 16 | } 17 | 18 | 19 | } 20 | 21 | -------------------------------------------------------------------------------- /demo/DependencyGraphDemo/DependencyGraphDemoTests/DependencyGraphDemoTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DependencyGraphDemoTests.swift 3 | // DependencyGraphDemoTests 4 | // 5 | // Created by 蓝容 on 1/8/20. 6 | // Copyright © 2020 RY. All rights reserved. 7 | // 8 | 9 | import XCTest 10 | @testable import DependencyGraphDemo 11 | 12 | class DependencyGraphDemoTests: XCTestCase { 13 | 14 | override func setUpWithError() throws { 15 | // Put setup code here. This method is called before the invocation of each test method in the class. 16 | } 17 | 18 | override func tearDownWithError() throws { 19 | // Put teardown code here. This method is called after the invocation of each test method in the class. 20 | } 21 | 22 | func testExample() throws { 23 | // This is an example of a functional test case. 24 | // Use XCTAssert and related functions to verify your tests produce the correct results. 25 | } 26 | 27 | func testPerformanceExample() throws { 28 | // This is an example of a performance test case. 29 | self.measure { 30 | // Put the code you want to measure the time of here. 31 | } 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /demo/DependencyGraphDemo/DependencyGraphDemoTests/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 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /demo/DependencyGraphDemo/DependencyGraphDemoUITests/DependencyGraphDemoUITests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DependencyGraphDemoUITests.swift 3 | // DependencyGraphDemoUITests 4 | // 5 | // Created by 蓝容 on 1/8/20. 6 | // Copyright © 2020 RY. All rights reserved. 7 | // 8 | 9 | import XCTest 10 | 11 | class DependencyGraphDemoUITests: XCTestCase { 12 | 13 | override func setUpWithError() throws { 14 | // Put setup code here. This method is called before the invocation of each test method in the class. 15 | 16 | // In UI tests it is usually best to stop immediately when a failure occurs. 17 | continueAfterFailure = false 18 | 19 | // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. 20 | } 21 | 22 | override func tearDownWithError() throws { 23 | // Put teardown code here. This method is called after the invocation of each test method in the class. 24 | } 25 | 26 | func testExample() throws { 27 | // UI tests must launch the application that they test. 28 | let app = XCUIApplication() 29 | app.launch() 30 | 31 | // Use recording to get started writing UI tests. 32 | // Use XCTAssert and related functions to verify your tests produce the correct results. 33 | } 34 | 35 | func testLaunchPerformance() throws { 36 | if #available(macOS 10.15, iOS 13.0, tvOS 13.0, *) { 37 | // This measures how long it takes to launch your application. 38 | measure(metrics: [XCTOSSignpostMetric.applicationLaunch]) { 39 | XCUIApplication().launch() 40 | } 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /demo/DependencyGraphDemo/DependencyGraphDemoUITests/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 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /demo/DependencyGraphDemo/Podfile: -------------------------------------------------------------------------------- 1 | # Uncomment the next line to define a global platform for your project 2 | # platform :ios, '9.0' 3 | # Uncomment the next line to define a global platform for your project 4 | # platform :ios, '9.0' 5 | plugin 'cocoapods-dependency-graph' 6 | dependency_output :json 7 | 8 | target 'DependencyGraphDemo' do 9 | # Comment the next line if you don't want to use dynamic frameworks 10 | use_frameworks! 11 | 12 | # Pods for DependencyGraphDemo 13 | pod 'Alamofire', '~> 5.2' 14 | pod 'RxSwift', '~> 5' 15 | pod 'RxCocoa', '~> 5' 16 | pod 'lottie-ios' 17 | pod 'SVProgressHUD' 18 | pod 'Firebase/Analytics' 19 | pod 'Reachability' 20 | target 'DependencyGraphDemoTests' do 21 | inherit! :search_paths 22 | # Pods for testing 23 | end 24 | 25 | target 'DependencyGraphDemoUITests' do 26 | # Pods for testing 27 | end 28 | 29 | end 30 | -------------------------------------------------------------------------------- /demo/DependencyGraphDemo/text.txt: -------------------------------------------------------------------------------- 1 | [!] Your Podfile requires that the plugin `cocoapods-dependency-graph` be installed. Please install it and try installation again. 2 | --------------------------------------------------------------------------------