cocoapods 0.3.4 → 0.3.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  module Pod
2
- VERSION = '0.3.4'
2
+ VERSION = '0.3.5'
3
3
 
4
4
  class Informative < StandardError
5
5
  end
@@ -2,15 +2,18 @@ module Pod
2
2
  class Command
3
3
  class Install < Command
4
4
  def self.banner
5
- %{Installing dependencies of a pod spec:
5
+ %{Installing dependencies of a project:
6
6
 
7
- $ pod install [NAME] [PROJECT]
7
+ $ pod install [PROJECT]
8
8
 
9
- Downloads all dependencies of the specified podspec file `NAME',
10
- creates an Xcode Pods library project in `./Pods', and sets up `PROJECT'
11
- to use the specified pods (if `PROJECT' is given). In case `NAME' is
12
- omitted it defaults to either `Podfile' or `*.podspec' in the current
13
- working directory.
9
+ Downloads all dependencies defined in `Podfile' and creates an Xcode
10
+ Pods library project in `./Pods'.
11
+
12
+ In case `PROJECT' is given, it configures it to use the specified Pods
13
+ and generates a workspace with the Pods project and `PROJECT'. (It is
14
+ important that once you have run this you open the workspace instead of
15
+ `PROJECT'.) You usually specify `PROJECT' only the first time that you
16
+ run `pod install'.
14
17
  }
15
18
  end
16
19
 
@@ -21,27 +24,18 @@ module Pod
21
24
 
22
25
  def initialize(argv)
23
26
  config.clean = !argv.option('--no-clean')
24
- projpath = argv.shift_argument
25
- projpath =~ /\.xcodeproj\/?$/ ? @projpath = projpath : podspec = projpath
26
- @podspec = Pathname.new(podspec) if podspec
27
- @projpath ||= argv.shift_argument
27
+ @projpath = argv.shift_argument
28
28
  super unless argv.empty?
29
29
  end
30
30
 
31
31
  def run
32
- spec = nil
33
- if @podspec
34
- if @podspec.exist?
35
- spec = Specification.from_file(@podspec)
36
- else
37
- raise Informative, "The specified podspec `#{@podspec}' doesn't exist."
38
- end
39
- else
40
- unless spec = config.rootspec
41
- raise Informative, "No `Podfile' or `.podspec' file found in the current working directory."
42
- end
32
+ unless podfile = config.rootspec
33
+ raise Informative, "No `Podfile' found in the current working directory."
34
+ end
35
+ if @projpath && !File.exist?(@projpath)
36
+ raise Informative, "The specified project `#{@projpath}' does not exist."
43
37
  end
44
- installer = Installer.new(spec)
38
+ installer = Installer.new(podfile)
45
39
  installer.install!
46
40
  installer.configure_project(@projpath) if @projpath
47
41
  end
@@ -11,8 +11,7 @@ module Pod
11
11
 
12
12
  https://github.com/CocoaPods/Specs
13
13
 
14
- If the clone already exists, it will ensure that it points to the correct
15
- remote.}
14
+ If the clone already exists, it will ensure that it is up-to-date.}
16
15
  end
17
16
 
18
17
  def initialize(argv)
@@ -28,15 +27,23 @@ module Pod
28
27
  end
29
28
 
30
29
  def update_master_repo_remote_command
31
- @command ||= Repo.new(ARGV.new(['set-url', 'master', master_repo_url]))
30
+ Repo.new(ARGV.new(['set-url', 'master', master_repo_url]))
31
+ end
32
+
33
+ def update_master_repo_command
34
+ Repo.new(ARGV.new(['update', 'master']))
32
35
  end
33
36
 
34
37
  def run
35
38
  if (config.repos_dir + 'master').exist?
36
39
  update_master_repo_remote_command.run
40
+ update_master_repo_command.run
37
41
  else
38
42
  add_master_repo_command.run
39
43
  end
44
+ hook = config.repos_dir + 'master/.git/hooks/pre-commit'
45
+ hook.open('w') { |f| f << "#!/bin/sh\nrake lint" }
46
+ `chmod +x '#{hook}'`
40
47
  end
41
48
  end
42
49
  end
@@ -31,24 +31,87 @@ module Pod
31
31
  author = `git config --get user.name`.strip
32
32
  email = `git config --get user.email`.strip
33
33
  spec = <<-SPEC.gsub(/^ /, '')
34
+ #
35
+ # Be sure to run `pod lint #{@name}.podspec' to ensure this is a
36
+ # valid spec.
37
+ #
38
+ # Remove all comments before submitting the spec.
39
+ #
34
40
  Pod::Spec.new do |s|
35
41
  s.name = '#{@name}'
36
42
  s.version = '1.0.0'
37
43
  s.license = 'MIT'
38
44
  s.summary = 'A short description of #{@name}.'
39
- s.homepage = 'http://example.com/#{@name}'
45
+ s.homepage = 'http://EXAMPLE/#{@name}'
40
46
  s.author = { '#{author}' => '#{email}' }
41
- s.source = { :git => 'http://example.com/#{@name}.git', :tag => '1.0.0' }
47
+
48
+ # Specify the location from where the source should be retreived.
49
+ #
50
+ s.source = { :git => 'http://EXAMPLE/#{@name}.git', :tag => '1.0.0' }
51
+ # s.source = { :svn => 'http://EXAMPLE/#{@name}/tags/1.0.0' }
52
+ # s.source = { :hg => 'http://EXAMPLE/#{@name}', :revision => '1.0.0' }
42
53
 
43
54
  s.description = 'An optional longer description of #{@name}.'
44
55
 
45
- # A list of file patterns. If the pattern is a directory then the path will
46
- # automatically have '*.{h,m,mm,c,cpp}' appended.
56
+ # If this Pod runs only on iOS or OS X, then specify that with one of
57
+ # these, or none if it runs on both platforms.
58
+ #
59
+ # s.platform = :ios
60
+ # s.platform = :osx
61
+
62
+ # A list of file patterns which select the source files that should be
63
+ # added to the Pods project. If the pattern is a directory then the
64
+ # path will automatically have '*.{h,m,mm,c,cpp}' appended.
65
+ #
66
+ # Alternatively, you can use the FileList class for even more control
67
+ # over the selected files.
68
+ # (See http://rake.rubyforge.org/classes/Rake/FileList.html.)
69
+ #
47
70
  s.source_files = 'Classes', 'Classes/**/*.{h,m}'
48
71
 
49
- s.framework = 'SomeRequiredFramework'
72
+ # A list of resources included with the Pod. These are copied into the
73
+ # target bundle with a build phase script.
74
+ #
75
+ # Also allows the use of the FileList class like `source_files does.
76
+ #
77
+ # s.resource = "icon.png"
78
+ # s.resources = "Resources/*.png"
79
+
80
+ # A list of paths to remove after installing the Pod without the
81
+ # `--no-clean' option. These can be examples, docs, and any other type
82
+ # of files that are not needed to build the Pod.
83
+ #
84
+ # *NOTE*: Never remove license and README files.
85
+ #
86
+ # Also allows the use of the FileList class like `source_files does.
87
+ #
88
+ # s.clean_path = "examples"
89
+ # s.clean_paths = "examples", "doc"
90
+
91
+ # Specify a list of frameworks that the application needs to link
92
+ # against for this Pod to work.
93
+ #
94
+ # s.framework = 'SomeFramework'
95
+ # s.frameworks = 'SomeFramework', 'AnotherFramework'
96
+
97
+ # Specify a list of libraries that the application needs to link
98
+ # against for this Pod to work.
99
+ #
100
+ # s.library = 'iconv'
101
+ # s.libraries = 'iconv', 'xml2'
102
+
103
+ # If this Pod uses ARC, specify it like so.
104
+ #
105
+ # s.requires_arc = true
106
+
107
+ # If you need to specify any other build settings, add them to the
108
+ # xcconfig hash.
109
+ #
110
+ # s.xcconfig = { 'HEADER_SEARCH_PATHS' => '$(SDKROOT)/usr/include/libxml2' }
50
111
 
51
- s.dependency 'SomeLibraryThat#{@name}DependsOn', '>= 1.0.0'
112
+ # Finally, specify any Pods that this Pod depends on.
113
+ #
114
+ # s.dependency 'JSONKit', '~> 1.4'
52
115
  end
53
116
  SPEC
54
117
  (Pathname.pwd + "#{@name}.podspec").open('w') { |f| f << spec }
@@ -1,9 +1,19 @@
1
1
  module Pod
2
2
  class Downloader
3
+ autoload :Git, 'cocoapods/downloader/git'
4
+ autoload :Mercurial, 'cocoapods/downloader/mercurial'
5
+ autoload :Subversion, 'cocoapods/downloader/subversion'
6
+
7
+ extend Executable
8
+
3
9
  def self.for_source(pod_root, source)
4
10
  options = source.dup
5
11
  if url = options.delete(:git)
6
12
  Git.new(pod_root, url, options)
13
+ elsif url = options.delete(:hg)
14
+ Mercurial.new(pod_root, url, options)
15
+ elsif url = options.delete(:svn)
16
+ Subversion.new(pod_root, url, options)
7
17
  else
8
18
  raise "Unsupported download strategy `#{source.inspect}'."
9
19
  end
@@ -15,49 +25,10 @@ module Pod
15
25
  @pod_root, @url, @options = pod_root, url, options
16
26
  end
17
27
 
18
- class Git < Downloader
19
- extend Executable
20
- executable :git
21
-
22
- def download
23
- @pod_root.dirname.mkpath
24
- if @options[:tag]
25
- download_tag
26
- elsif @options[:commit]
27
- download_commit
28
- else
29
- download_head
30
- end
31
- end
32
-
33
- def download_head
34
- git "clone '#{@url}' '#{@pod_root}'"
35
- end
36
-
37
- def download_tag
38
- @pod_root.mkpath
39
- Dir.chdir(@pod_root) do
40
- git "init"
41
- git "remote add origin '#{@url}'"
42
- git "fetch origin tags/#{@options[:tag]}"
43
- git "reset --hard FETCH_HEAD"
44
- git "checkout -b activated-pod-commit"
45
- end
46
- end
47
-
48
- def download_commit
49
- git "clone '#{@url}' '#{@pod_root}'"
50
- Dir.chdir(@pod_root) do
51
- git "checkout -b activated-pod-commit #{@options[:commit]}"
52
- end
53
- end
54
-
55
- def clean(clean_paths = [])
56
- (@pod_root + '.git').rmtree
57
- clean_paths.each do |path|
58
- path.rmtree
59
- end if clean_paths
60
- end
28
+ def clean(clean_paths = [])
29
+ clean_paths.each do |path|
30
+ path.rmtree
31
+ end if clean_paths
61
32
  end
62
33
  end
63
34
  end
@@ -0,0 +1,46 @@
1
+ module Pod
2
+ class Downloader
3
+ class Git < Downloader
4
+ executable :git
5
+
6
+ def download
7
+ @pod_root.dirname.mkpath
8
+ if @options[:tag]
9
+ download_tag
10
+ elsif @options[:commit]
11
+ download_commit
12
+ else
13
+ download_head
14
+ end
15
+ end
16
+
17
+ def download_head
18
+ git "clone '#{@url}' '#{@pod_root}'"
19
+ end
20
+
21
+ def download_tag
22
+ @pod_root.mkpath
23
+ Dir.chdir(@pod_root) do
24
+ git "init"
25
+ git "remote add origin '#{@url}'"
26
+ git "fetch origin tags/#{@options[:tag]}"
27
+ git "reset --hard FETCH_HEAD"
28
+ git "checkout -b activated-pod-commit"
29
+ end
30
+ end
31
+
32
+ def download_commit
33
+ git "clone '#{@url}' '#{@pod_root}'"
34
+ Dir.chdir(@pod_root) do
35
+ git "checkout -b activated-pod-commit #{@options[:commit]}"
36
+ end
37
+ end
38
+
39
+ def clean(clean_paths = [])
40
+ super
41
+ (@pod_root + '.git').rmtree
42
+ end
43
+ end
44
+ end
45
+ end
46
+
@@ -0,0 +1,30 @@
1
+ module Pod
2
+ class Downloader
3
+ class Mercurial < Downloader
4
+ executable :hg
5
+
6
+ def download
7
+ @pod_root.dirname.mkpath
8
+ if @options[:revision]
9
+ download_revision
10
+ else
11
+ download_head
12
+ end
13
+ end
14
+
15
+ def download_head
16
+ hg "clone '#{@url}' '#{@pod_root}'"
17
+ end
18
+
19
+ def download_revision
20
+ hg "clone '#{@url}' --rev '#{@options[:revision]}' '#{@pod_root}'"
21
+ end
22
+
23
+ def clean(clean_paths = [])
24
+ super
25
+ (@pod_root + '.hg').rmtree
26
+ end
27
+ end
28
+ end
29
+ end
30
+
@@ -0,0 +1,29 @@
1
+ module Pod
2
+ class Downloader
3
+ class Subversion < Downloader
4
+ executable :svn
5
+
6
+ def download
7
+ @pod_root.dirname.mkpath
8
+ if @options[:revision]
9
+ download_revision
10
+ else
11
+ download_head
12
+ end
13
+ end
14
+
15
+ def download_head
16
+ svn "checkout '#{@url}' '#{@pod_root}'"
17
+ end
18
+
19
+ def download_revision
20
+ svn "checkout '#{@url}' -r '#{@options[:revision]}' '#{@pod_root}'"
21
+ end
22
+
23
+ def clean(clean_paths = [])
24
+ super
25
+ @pod_root.glob('**/.svn').each(&:rmtree)
26
+ end
27
+ end
28
+ end
29
+ end
@@ -1,12 +1,16 @@
1
1
  module Pod
2
2
  module Executable
3
3
  def executable(name)
4
+ bin = `which #{name}`.strip
4
5
  define_method(name) do |command|
6
+ if bin.empty?
7
+ raise Informative, "Unable to locate the executable `#{name}'"
8
+ end
5
9
  if Config.instance.verbose?
6
- puts "#{name} #{command}"
7
- `#{name} #{command} 1>&2`
10
+ puts "#{bin} #{command}"
11
+ `#{bin} #{command} 1>&2`
8
12
  else
9
- `#{name} #{command} 2> /dev/null`
13
+ `#{bin} #{command} 2> /dev/null`
10
14
  end
11
15
  end
12
16
  private name
@@ -18,7 +18,7 @@ module Pod
18
18
  include Config::Mixin
19
19
  include Shared
20
20
 
21
- attr_reader :target
21
+ attr_reader :podfile, :project, :definition, :target
22
22
 
23
23
  def initialize(podfile, project, definition)
24
24
  @podfile, @project, @definition = podfile, project, definition
@@ -163,8 +163,8 @@ module Pod
163
163
 
164
164
  def target_installers
165
165
  @target_installers ||= @podfile.target_definitions.values.map do |definition|
166
- TargetInstaller.new(@podfile, project, definition)
167
- end
166
+ TargetInstaller.new(@podfile, project, definition) unless definition.empty?
167
+ end.compact
168
168
  end
169
169
 
170
170
  def install!
@@ -8,7 +8,13 @@ module Pod
8
8
  end
9
9
 
10
10
  def lib_name
11
- name == :default ? "Pods" : "Pods-#{name}"
11
+ if name == :default
12
+ "Pods"
13
+ elsif @parent
14
+ "#{@parent.lib_name}-#{name}"
15
+ else
16
+ "Pods-#{name}"
17
+ end
12
18
  end
13
19
 
14
20
  # Returns *all* dependencies of this target, not only the target specific
@@ -16,6 +22,10 @@ module Pod
16
22
  def dependencies
17
23
  @target_dependencies + (@parent ? @parent.dependencies : [])
18
24
  end
25
+
26
+ def empty?
27
+ target_dependencies.empty?
28
+ end
19
29
  end
20
30
 
21
31
  def self.from_file(path)
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 3
8
- - 4
9
- version: 0.3.4
8
+ - 5
9
+ version: 0.3.5
10
10
  platform: ruby
11
11
  authors:
12
12
  - Eloy Duran
@@ -53,6 +53,9 @@ files:
53
53
  - lib/cocoapods/command.rb
54
54
  - lib/cocoapods/config.rb
55
55
  - lib/cocoapods/dependency.rb
56
+ - lib/cocoapods/downloader/git.rb
57
+ - lib/cocoapods/downloader/mercurial.rb
58
+ - lib/cocoapods/downloader/subversion.rb
56
59
  - lib/cocoapods/downloader.rb
57
60
  - lib/cocoapods/executable.rb
58
61
  - lib/cocoapods/file_list.rb