From a850d8c98bf32a5f8fe14e274155efdf822dcb45 Mon Sep 17 00:00:00 2001 From: Antoine Toulme Date: Sat, 13 Aug 2016 22:44:02 -0700 Subject: [PATCH] BUILDR-454: Definition-level parent-child references-by-name fail in 1.4.0 but not in 1.3.5 --- lib/buildr/core/project.rb | 15 ++++++++++++++- spec/core/project_spec.rb | 17 +++++++++++------ 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/lib/buildr/core/project.rb b/lib/buildr/core/project.rb index 1b34eb46a..4511ae45a 100644 --- a/lib/buildr/core/project.rb +++ b/lib/buildr/core/project.rb @@ -220,6 +220,11 @@ def define(name, properties, &block) #:nodoc: # Enhance the project using the definition block. project.enhance { project.instance_exec project, &block } if block + # Mark the project as defined + project.enhance do |project| + project.send :define! + end + # Top-level project? Invoke the project definition. Sub-project? We don't invoke # the project definiton yet (allow project calls to establish order of evaluation), # but must do so before the parent project's definition is done. @@ -253,7 +258,7 @@ def project(*args, &block) #:nodoc: end project ||= @projects[name] # Not found in scope. raise "No such project #{name}" unless project - project.invoke unless no_invoke || Buildr.application.current_scope.join(":").to_s == project.name.to_s + project.invoke unless project.defined? || no_invoke || Buildr.application.current_scope.join(":").to_s == project.name.to_s project end @@ -614,7 +619,15 @@ def calledback #:nodoc: @calledback ||= {} end + def defined? + @defined + end + protected + def define! + @defined = true + end + # :call-seq: # base_dir = dir diff --git a/spec/core/project_spec.rb b/spec/core/project_spec.rb index 97bbf0163..b9f591a9a 100644 --- a/spec/core/project_spec.rb +++ b/spec/core/project_spec.rb @@ -83,6 +83,16 @@ Buildr.define('foo') { define('bar') { project('baz:bar') } } lambda { project('foo') }.should raise_error(RuntimeError, /Circular dependency/) end + + it 'should handle non-circular dependencies' do + Buildr.define "root" do + define "child" do + puts project('root')._('foo.resource') + end + end + + lambda { project('root') }.should_not raise_error + end end describe Project, ' property' do @@ -533,7 +543,7 @@ project('foo:bar').project('baz').should be(project('foo:baz')) end - it 'should fine a project from its parent by proximity' do + it 'should find a project from its parent by proximity' do define 'foo' do define('bar') { define 'baz' } define 'baz' @@ -542,11 +552,6 @@ project('foo:bar').project('baz').should be(project('foo:bar:baz')) end - it 'should invoke project before returning it' do - define('foo').should_receive(:invoke).once - project('foo') - end - it 'should fail if called without a project name' do lambda { project }.should raise_error(ArgumentError) end