From murdoch.duncan at gmail.com  Thu Nov 27 02:08:54 2014
From: murdoch.duncan at gmail.com (Duncan Murdoch)
Date: Wed, 26 Nov 2014 20:08:54 -0500
Subject: [Rd] Problem understanding behaviour of versionCheck for
 loadNamespace (and when versions for Imports packages are checked)
In-Reply-To: <011301d009da$845492c0$8cfdb840$@gmail.com>
References: <00ff01d009c9$db1446c0$913cd440$@bigpond.com>
	<547668E9.3050505@gmail.com>
	<011301d009da$845492c0$8cfdb840$@gmail.com>
Message-ID: <547679A6.3000907@gmail.com>

On 26/11/2014, 7:38 PM, Geoff Lee wrote:
> Many thanks Duncan for the quick response. 

A little too quick, it seems...
> 
> A bug is a relief in a way. I've been digging my way deeper into this (and
> learning more as I go) for several days now - but it is a diversion from (a
> diversion from) my main goal :-(
> 
> Is there somewhere specific I should report or log the bug or will that
> happen from this mailing-list automatically? (I have seen the Bug Tracking
> link on the r-project page and followed that, but don't yet have a Bugzilla
> account, nor know the precise mechanics and protocols for notifying a bug)

If you can put together a simple set of steps to illustrate a bug, then
reporting on bugs.r-project.org is the way to get it recorded.
Reporting it on this list is really hit and miss.  But I think from your
previous description, something else is going on.  When I try to load a
namespace with a bad version number, I get an error:

loadNamespace("rgl", versionCheck=list(name="rgl", op=">",
version=package_version('3.0')))
Error in loadNamespace("rgl", versionCheck = list(name = "rgl", op =
">",  :
  namespace ?rgl? 0.95.1163 is being loaded, but > 3.0 is required

Duncan Murdoch

> 
> Geoff
> 
> PS Building package2 - via devtools::build('package2', binary = TRUE) does
> check and insist that I have an appropriate version of the 'to be imported'
> package1 installed in my .libPath().
> 
> It was only when I simulated a user who has and older version of the
> Imported package1 (by overwriting the later version of package 1 with an
> earlier version), then trying to load or attach package2 that the (failure
> of the version checking) at loadNamespace time for package1 became apparent
> (well apparentish after quite a bit of digging)
> 
> -----Original Message-----
> From: Duncan Murdoch [mailto:murdoch.duncan at gmail.com] 
> Sent: Thursday, 27 November 2014 10:57 AM
> To: Geoff Lee; r-devel at r-project.org
> Subject: Re: [Rd] Problem understanding behaviour of versionCheck for
> loadNamespace (and when versions for Imports packages are checked)
> 
> Summary:  I think you've found a bug.
> 
> On 26/11/2014, 5:39 PM, Geoff Lee wrote:
>> Hi
>>
>>  
>>
>> I'm still exploring the R programming universe, so if this is being 
>> asked in the wrong place, or in the wrong way (e.g. too verbose or 
>> lacking in crucial detail or in the wrong format) please let me know
>>
>>  
>>
>> I am trying to understand when the version constraints for packages 
>> which appear in the Imports field of a DESCRIPTION file are checked.
> 
> I would have assumed they are checked when you try to install the package.
> If you ask for version 3.0, and only have 0.3, the install should fail.
> 
> But as you've found, the documents say something else...
> 
>>
>>  
>>
>> Along the way I've hit a snag understanding what loadNamespace with 
>> the versionCheck argument set does.  The core of my query is 'am I 
>> doing something wrong, or have I stumbled across a bug?'.  Probably 
>> the former, but after several days I still can't figure it out, so any 
>> guidance, hints or outright help would be much appreciated.
>>
>>  
>>
>> Thanks in advance
>>
>>  
>>
>> Geoff
>>
>>  
>>
>> What I've tried so far.
>>
>>  
>>
>> "Writing R extensions" section 1.1.3 says
>>
>>  
>>
>> "The 'Imports' field lists packages whose namespaces are imported from 
>> (as specified in the NAMESPACE file) but which do not need to be attached.
> ...
>> shortened for brevity ... Packages declared in the 'Depends' field 
>> should not also be in the 'Imports' field. Version requirements can be 
>> specified and are checked when the namespace is loaded (since R >= 3.0.0).
> "
>>
>>  
>>
>> It is slightly ambiguous, but seems to mean that the version 
>> dependencies for both Depends packages and Imports packages are 
>> checked when the package
>> (namespace?) is loaded.
>>
>>  
>>
>> The release notes for R3.0.0 are more direct.  They say
>>
>>  
>>
>> "loadNamespace() allows a version specification to be given, and this 
>> is used to check version specifications given in the Imports field 
>> when a namespace is loaded"
>>
>>  
>>
>> But some toy (locally built and loaded) examples seem to show that 
>> while the Depends versions are checked, the Imports version 
>> constraints are not (on Windows 64, running R3.1.2, see full session_info
> later).
>>
>>  
>>
>> My tests (package2 imports package1) use implicit loading (via the
>> package1::fun1() idiom) so I have worked back to try get a minimal 
>> example of what's causing me problems. I have tried
> 
> According to what you have written, that should have failed.  So it looks
> like a bug.
>>
>>  
>>
>> loadNamespace('package2', versionCheck = list (op = ">=", version =
>> package_version('3.0')))
>>
>>  
>>
>> This should fail (package2 has version 0.3, not 3.0) but instead it 
>> seems to load package2, version 0.3 OK.
>>
>>  
>>
>> Reading the code of loadNamespace, there is some code which says
>>
>>  
>>
>> if (length(z <- versionCheck) == 3L && !do.call(z$op,
>>
>>     list(as.numeric_version(version), z$version)))
>>
>>     stop(gettextf("namespace %s %s is being loaded, but %s %s is 
>> required",
>>
>>       sQuote(package), version, z$op, z$version),
>>
>>        domain = NA)
>>
>>  
>>
>> I think it is the length(z <- versionCheck) == 3L part of the if test 
>> that is allowing the incorrect version be loaded.
> 
> That does seem like a typo.
> 
> Duncan Murdoch
> 
>>
>>  
>>
>> The documentation for loadNamespace says that "versionCheck" is
>>
>> "NULL or a version specification (a list with components op and
> version))."
>>
>>  
>>
>> If I add a third (nonsense) component to the versionCheck argument 
>> list, then loadNamespace does what I expect.  Is there supposed to be 
>> a third component in the list, and if so what should it be? Or is this a
> bug?
>>
>>  
>>
>> I've got this far and am now stumped, hence my query.
>>
>>  
>>
>> Some output from my tests.
>>
>>  
>>
>> d> devtools::session_info()
>>
>> Session
>> info------------------------------------------------------------------
>> --
>>
>>   setting  value                       
>>
>> version  R version 3.1.2 (2014-10-31)
>>
>> system   x86_64, mingw32             
>>
>> ui       RStudio (0.98.953)          
>>
>> language (EN)                        
>>
>> collate  English_Australia.1252      
>>
>> tz       Australia/Sydney            
>>
>>  
>>
>> Packages--------------------------------------------------------------
>> ------
>> ----
>>
>>   package    * version date       source        
>>
>> devtools     1.6.1   2014-10-07 CRAN (R 3.1.2)
>>
>> rstudioapi   0.1     2014-03-27 CRAN (R 3.1.1)
>>
>>  
>>
>> d> # I think this should fail but it does not
>>
>> d> loadNamespace('package2', versionCheck = list(op='>=', version =
>> package_version('3.0')))
>>
>> <environment: namespace:package2>
>>
>>   
>>
>>   
>>
>>   d> devtools::session_info()
>>
>> Session
>> info------------------------------------------------------------------
>> --
>>
>>   setting  value                       
>>
>> version  R version 3.1.2 (2014-10-31)
>>
>> system   x86_64, mingw32             
>>
>> ui       RStudio (0.98.953)          
>>
>> language (EN)                        
>>
>> collate  English_Australia.1252      
>>
>> tz       Australia/Sydney            
>>
>>  
>>
>> Packages--------------------------------------------------------------
>> ------
>> ----
>>
>>   package    * version date       source        
>>
>> devtools     1.6.1   2014-10-07 CRAN (R 3.1.2)
>>
>> package2     0.3     2014-11-24 local         
>>
>> rstudioapi   0.1     2014-03-27 CRAN (R 3.1.1)
>>
>>  
>>
>> d> #Try again with a third (nonsense) entry in the versionCheck list
>>
>> d> unloadNamespace('package2')
>>
>> d> loadNamespace('package2', versionCheck = list(op='>=', version =
>> package_version('3.0'), please = 'check it'))
>>
>> Error in loadNamespace("package2", versionCheck = list(op = ">=", 
>> version = package_version("3.0"),  :
>>
>>  namespace 'package2' 0.3 is being loaded, but >= 3.0 is required
>>
>>  
>>
>>  
>>
>>  
>>
>> d> devtools::session_info()
>>
>> Session
>> info------------------------------------------------------------------
>> --
>>
>> setting  value                       
>>
>> version  R version 3.1.2 (2014-10-31)
>>
>> system   x86_64, mingw32             
>>
>> ui       RStudio (0.98.953)          
>>
>> language (EN)                        
>>
>> collate  English_Australia.1252      
>>
>> tz       Australia/Sydney            
>>
>>  
>>
>> Packages--------------------------------------------------------------
>> ------
>> ----
>>
>> package    * version date       source        
>>
>> devtools     1.6.1   2014-10-07 CRAN (R 3.1.2)
>>
>> rstudioapi   0.1     2014-03-27 CRAN (R 3.1.1)
>>
>> d> loadNamespace('package2', versionCheck = list(op='>=', version =
>> package_version('0.3'), please = 'check it'))
>>
>> <environment: namespace:package2>
>>
>> d>
>>
>>
>> 	[[alternative HTML version deleted]]
>>
>> ______________________________________________
>> R-devel at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>
> 
>



[Rd] Problem understanding behaviour of versionCheck for loadNamespace (and when versions for Imports packages are checked)
Duncan Murdoch