Commit 99d20425 authored by Fabio Pelosin's avatar Fabio Pelosin

Simplified resolution process and implemented `main_subspec' substitution.

parent 87778d87
......@@ -14,7 +14,7 @@ module Pod
def initialize(*name_and_version_requirements, &block)
if name_and_version_requirements.empty? && block
@inline_podspec = true
@specification = Specification.new(&block)
@specification = Specification.new(&block).main_subspec
super(@specification.name, @specification.version)
elsif !name_and_version_requirements.empty? && block.nil?
......
......@@ -22,13 +22,11 @@ module Pod
@podfile.target_definitions.values.each do |target_definition|
puts "\nResolving dependencies for target `#{target_definition.name}' (#{target_definition.platform})".green if config.verbose?
@loaded_specs = []
# TODO @podfile.platform will change to target_definition.platform
find_dependency_sets(@podfile, target_definition.dependencies, target_definition)
targets_and_specs[target_definition] = @specs.values_at(*@loaded_specs).sort_by(&:name)
end
@specs.values.sort_by(&:name)
targets_and_specs
end
......@@ -59,20 +57,11 @@ module Pod
set.required_by(dependent_specification)
# Ensure we don't resolve the same spec twice for one target
unless @loaded_specs.include?(dependency.name)
# Get a reference to the spec that’s actually being loaded.
# If it’s a subspec dependency, e.g. 'RestKit/Network', then
# find that subspec.
spec = set.specification
if dependency.subspec_dependency?
spec = spec.subspec_by_name(dependency.name)
end
spec = set.specification_by_name(dependency.name)
@loaded_specs << spec.name
@specs[spec.name] = spec
# And recursively load the dependencies of the spec.
# TODO fix the need to return an empty arrayf if there are no deps for the given platform
find_dependency_sets(spec, (spec.dependencies[target_definition.platform.to_sym] || []), target_definition)
find_dependency_sets(spec, (spec.dependencies[target_definition.platform.to_sym]), target_definition) if spec.dependencies[target_definition.platform.to_sym]
end
validate_platform!(spec || @specs[dependency.name], target_definition)
end
......
......@@ -68,7 +68,7 @@ module Pod
set.name == dependency.top_level_spec_name &&
# Now either check if it's a dependency on the top level spec, or if it's not
# check if the requested subspec exists in the top level spec.
(!dependency.subspec_dependency? || !set.specification.subspec_by_name(dependency.name).nil?)
set.specification.subspec_by_name(dependency.name)
end
end
......
......@@ -74,7 +74,12 @@ module Pod
@platform.nil? ? @define_for_platforms.map { |platform| Platform.new(platform, @deployment_target[platform]) } : [ platform ]
end
attr_accessor :main_subspec
attr_writer :main_subspec
def main_subspec
return self unless @main_subspec
subspecs.find { |s| s.name == "#{self.name}/#{@main_subspec}" }
end
### Top level attributes. These attributes represent the unique features of pod and can't be specified by subspecs.
......@@ -256,7 +261,7 @@ module Pod
def dependencies
result = {}
@define_for_platforms.each do |platform|
inherited_subspecs = main_subspec ? [Dependency.new("#{name}/#{main_subspec}", version)] : subspecs.map {|s| Dependency.new(s.name, version) }
inherited_subspecs = subspecs.map {|s| Dependency.new(s.name, version) }
result[platform] = @dependencies[platform] + inherited_subspecs
end
result
......@@ -306,7 +311,7 @@ module Pod
end
def subspec_by_name(name)
return self if name.nil? || name == self.name
return main_subspec if name.nil? || name == self.name
# Remove this spec's name from the beginning of the name we’re looking for
# and take the first component from the remainder, which is the spec we need
# to find now.
......@@ -390,6 +395,14 @@ module Pod
false
end
def dependency_by_top_level_spec_name(name)
@dependencies.each do |_, platform_deps|
platform_deps.each do |dep|
return dep if dep.top_level_spec_name == name
end
end
end
def to_s
"#{name} (#{version})"
end
......@@ -398,14 +411,6 @@ module Pod
"#<#{self.class.name} for #{to_s}>"
end
def dependency_by_top_level_spec_name(name)
dependencies.each do |_, platform_deps|
platform_deps.each do |dep|
return dep if dep.top_level_spec_name == name
end
end
end
def ==(other)
object_id == other.object_id ||
(self.class === other &&
......
......@@ -9,6 +9,9 @@ module Pod
end
def required_by(specification)
# Skip subspecs because the can't require a different version of the top level parent
return if !specification.podfile? && specification.top_level_parent.name == name
dependency = specification.dependency_by_top_level_spec_name(name)
# TODO we don’t actually do anything in our Version subclass. Maybe we should just remove that.
unless @required_by.empty? || dependency.requirement.satisfied_by?(Gem::Version.new(required_version.to_s))
......@@ -21,6 +24,10 @@ module Pod
@required_by << specification
end
def specification_by_name(name)
specification.top_level_parent.subspec_by_name(name)
end
def dependency
@required_by.inject(Dependency.new(name)) do |previous, spec|
previous.merge(spec.dependency_by_top_level_spec_name(name).to_top_level_spec_dependency)
......@@ -70,7 +77,7 @@ module Pod
end
def name
@specification.name
@specification.top_level_parent.name
end
def ==(other)
......
......@@ -131,7 +131,9 @@ describe "Pod::Resolver" do
js.dependency 'RestKit/ObjectMapping/CoreData'
end
s.subspec 'Network'
s.subspec 'Network' do |ns|
ns.dependency 'LibComponentLogging-NSLog', '>= 1.0.4'
end
s.subspec 'UI'
s.subspec 'ObjectMapping' do |os|
os.subspec 'JSON'
......@@ -142,7 +144,8 @@ describe "Pod::Resolver" do
end
resolver = Pod::Resolver.new(@podfile, stub('sandbox'))
resolver.resolve.values.flatten.map(&:name).sort.should == %w{
RestKit
LibComponentLogging-Core
LibComponentLogging-NSLog
RestKit/JSON
RestKit/Network
RestKit/ObjectMapping/CoreData
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment