Class: Pod::Command::Try
- Inherits:
-
Pod::Command
- Object
- Pod::Command
- Pod::Command::Try
- Includes:
- RepoUpdate
- Defined in:
- lib/pod/command/try.rb
Overview
The pod try command.
Constant Summary collapse
- TRY_TMP_DIR =
Pathname.new(Dir.tmpdir) + 'CocoaPods/Try'
Instance Method Summary collapse
-
#git_url?(name) ⇒ Bool
Wether the given string is the name of a Pod or an URL for a Git repo.
-
#initialize(argv) ⇒ Try
constructor
A new instance of Try.
-
#install_pod(spec, sandbox) ⇒ Pathname
Installs the specification in the given directory.
-
#install_podfile(proj) ⇒ String
Performs a CocoaPods installation for the given project if Podfile is found.
-
#open_project(path) ⇒ String, void
Opens the project at the given path.
-
#perform_cocoapods_installation ⇒ void
Performs a CocoaPods installation in the working directory.
-
#pick_demo_project(dir) ⇒ String
Picks a project or workspace suitable for the demo purposes in the given directory.
-
#projects_in_dir(dir) ⇒ Array<String>
The list of the workspaces and projects in a given directory excluding The Pods project and the projects that have a sister workspace.
- #run ⇒ Object
-
#setup_spec_in_sandbox(sandbox) ⇒ Object
Puts the spec’s data in the sandbox.
-
#spec_with_name(name) ⇒ Specification
Returns the specification of the last version of the Pod with the given name.
-
#spec_with_url(url) ⇒ Specification
Returns the specification found in the given Git repository URL by downloading the repository.
-
#update_specs_repos ⇒ void
Updates the specs repo unless disabled by the config.
- #validate! ⇒ Object
Constructor Details
#initialize(argv) ⇒ Try
Returns a new instance of Try.
23 24 25 26 |
# File 'lib/pod/command/try.rb', line 23 def initialize(argv) @name = argv.shift_argument super end |
Instance Method Details
#git_url?(name) ⇒ Bool
Returns Wether the given string is the name of a Pod or an URL for a Git repo.
230 231 232 233 |
# File 'lib/pod/command/try.rb', line 230 def git_url?(name) prefixes = ['https://', 'http://'] prefixes.any? { |prefix| name.start_with?(prefix) } end |
#install_pod(spec, sandbox) ⇒ Pathname
Installs the specification in the given directory.
121 122 123 124 125 126 |
# File 'lib/pod/command/try.rb', line 121 def install_pod(spec, sandbox) specs = { :ios => spec, :osx => spec } installer = Installer::PodSourceInstaller.new(sandbox, specs, :can_cache => false) installer.install! sandbox.root + spec.name end |
#install_podfile(proj) ⇒ String
Performs a CocoaPods installation for the given project if Podfile is found. Shells out to avoid issues with the config of the process running the try command.
171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 |
# File 'lib/pod/command/try.rb', line 171 def install_podfile(proj) return unless proj dirname = Pathname.new(proj).dirname podfile_path = dirname + 'Podfile' if podfile_path.exist? Dir.chdir(dirname) do perform_cocoapods_installation podfile = Pod::Podfile.from_file(podfile_path) if podfile.workspace_path File.(podfile.workspace_path) else proj.to_s.chomp(File.extname(proj.to_s)) + '.xcworkspace' end end else proj end end |
#open_project(path) ⇒ String, void
Opens the project at the given path.
213 214 215 216 |
# File 'lib/pod/command/try.rb', line 213 def open_project(path) UI.puts "Opening '#{path}'" `open "#{path}"` end |
#perform_cocoapods_installation ⇒ void
This method returns an undefined value.
Returns Performs a CocoaPods installation in the working directory.
221 222 223 224 225 |
# File 'lib/pod/command/try.rb', line 221 def perform_cocoapods_installation UI.titled_section 'Performing CocoaPods Installation' do Command::Install.invoke end end |
#pick_demo_project(dir) ⇒ String
Picks a project or workspace suitable for the demo purposes in the given directory.
To decide the project simple heuristics are used according to the name, if no project is found this method raises and ‘Informative` otherwise if more than one project is found the choice is presented to the user.
140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 |
# File 'lib/pod/command/try.rb', line 140 def pick_demo_project(dir) projs = projects_in_dir(dir) if projs.count == 0 raise Informative, 'Unable to find any project in the source files' \ " of the Pod: `#{dir}`" elsif projs.count == 1 projs.first elsif (workspaces = projs.grep(/(demo|example|sample).*\.xcworkspace$/i)).count == 1 workspaces.first elsif (projects = projs.grep(/demo|example|sample/i)).count == 1 projects.first else = 'Which project would you like to open' selection_array = projs.map do |p| Pathname.new(p).relative_path_from(dir).to_s end index = UI.choose_from_array(selection_array, ) projs[index] end end |
#projects_in_dir(dir) ⇒ Array<String>
Returns The list of the workspaces and projects in a given directory excluding The Pods project and the projects that have a sister workspace.
239 240 241 242 243 244 245 246 247 |
# File 'lib/pod/command/try.rb', line 239 def projects_in_dir(dir) glob_match = Dir.glob("#{dir}/**/*.xc{odeproj,workspace}") glob_match = glob_match.reject do |p| next true if p.include?('Pods.xcodeproj') next true if p.end_with?('.xcodeproj/project.xcworkspace') sister_workspace = p.chomp(File.extname(p.to_s)) + '.xcworkspace' p.end_with?('.xcodeproj') && glob_match.include?(sister_workspace) end end |
#run ⇒ Object
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
# File 'lib/pod/command/try.rb', line 33 def run ensure_master_spec_repo_exists! sandbox = Sandbox.new(TRY_TMP_DIR) spec = setup_spec_in_sandbox(sandbox) UI.title "Trying #{spec.name}" do pod_dir = install_pod(spec, sandbox) settings = TrySettings.settings_from_folder(pod_dir) Dir.chdir(pod_dir) { settings.run_pre_install_commands(true) } proj = settings.project_path || pick_demo_project(pod_dir) file = install_podfile(proj) if file open_project(file) else UI.puts "Unable to locate a project for #{spec.name}" end end end |
#setup_spec_in_sandbox(sandbox) ⇒ Object
Puts the spec’s data in the sandbox
63 64 65 66 67 68 69 70 71 72 |
# File 'lib/pod/command/try.rb', line 63 def setup_spec_in_sandbox(sandbox) if git_url?(@name) spec = spec_with_url(@name) sandbox.store_pre_downloaded_pod(spec.name) else update_specs_repos spec = spec_with_name(@name) end spec end |
#spec_with_name(name) ⇒ Specification
Returns the specification of the last version of the Pod with the given name.
82 83 84 85 86 87 88 89 |
# File 'lib/pod/command/try.rb', line 82 def spec_with_name(name) set = config.sources_manager.search(Dependency.new(name)) if set set.specification.root else raise Informative, "Unable to find a specification for `#{name}`" end end |
#spec_with_url(url) ⇒ Specification
Returns the specification found in the given Git repository URL by downloading the repository.
99 100 101 102 103 104 105 106 107 108 109 110 111 |
# File 'lib/pod/command/try.rb', line 99 def spec_with_url(url) name = url.split('/').last name = name.chomp('.git') if name.end_with?('.git') target_dir = TRY_TMP_DIR + name target_dir.rmtree if target_dir.exist? downloader = Pod::Downloader.for_target(target_dir, :git => url) downloader.download spec_file = Pathname.glob(target_dir + "#{name}.podspec{,.json}").first Pod::Specification.from_file(spec_file) end |
#update_specs_repos ⇒ void
This method returns an undefined value.
Returns Updates the specs repo unless disabled by the config.
199 200 201 202 203 204 |
# File 'lib/pod/command/try.rb', line 199 def update_specs_repos return unless repo_update?(:default => true) UI.section 'Updating spec repositories' do config.sources_manager.update end end |
#validate! ⇒ Object
28 29 30 31 |
# File 'lib/pod/command/try.rb', line 28 def validate! super help! 'A Pod name or URL is required.' unless @name end |