Re: Checking directory state using Groovy

Rachel Greenham <[email protected]>
Newsgroups gmane.comp.lang.groovy.user
Message-ID <[email protected]>
No, what I posted first time does work.

mg then pointed out a general fact about groovy, which is this:

Properties on an object defined in the standard JavaBeans way, that is, with a getter - getSomething() - and/or a setter - setSomething(value) - or a boolean getter - isSomething() - can be accessed from groovy as plain properties, in this case a property called 'something'.

That is, where you have a Java (or Groovy!) class something like:

public class Thing {
    private String name;
    public String getName() { return name; }
    public void setName(String newName) {
        this.name = newName;
    }
}

In groovy you can get it with eg:

def name = thing.name
thing.name = "Thing's New Name"


That's generally true.

It also generally applies when a method is added to a class through metaprogramming, eg: with an extension module.

But maybe not for a category use. I've just deleted a chunk here where I explained that the reason the property-style access doesn't work here was because isDirectory(), getOwner(), getPosixFilePermissions() all take LinkOptions or OpenOptions varargs array. But I just checked and it also doesn't work for isReadable() (where I would have expected "p.readable" to work where "p.isReadable()" does), so it may actually be a category thing.

I don't usually use categories, preferring extension modules, where this does work, and which would also work in a @CompileStatic setting.

So the simple rule seems to be that you can use categories to access static methods of a category class as if they're methods of your given type (ie: static methods where the first parameter is Path, as methods on Path, minus that parameter), but property-style access doesn't appear to work in that case. Only method calls.

-- 
Rachel Greenham
[email protected]

> On 21 Oct 2021, at 16:50, James McMahon <[email protected]> wrote:
> 
> Rachel, thanks again for weighing in. I'm a little confused and was hoping to ask you for clarification. Earlier in this thread, you use a File approach and it seemed to work. Why did you mention in the follow-up comment that it doesn't actually work? Why did it work the first time, but not the second time? Was it because in the first case you were using the groovy command line interpreter, and in the second case that failed you tried to run from inside a Groovy script, maybe? Or was it something else I'm missing entirely?
> - - -
> Jim Mc.
> 
> On Wed, Oct 20, 2021 at 7:35 AM Rachel Greenham <[email protected] <mailto:[email protected]>> wrote:
> ah sadly i did think of that when i was writing it but it didn't work. Not 100% sure why, but i think mostly that many of those methods in Files take a varargs of stuff like LinkOption... OpenOption... and the groovy category support isn't resolving properties past that.
> 
> -- 
> Rachel Greenham
> [email protected] <mailto:[email protected]>
> 
>> On 20 Oct 2021, at 11:55, MG <mgbiz-yvYIh6MZAuFWk0Htik3J/[email protected] <mailto:mgbiz-yvYIh6MZAuFWk0Htik3J/[email protected]>> wrote:
>> 
>> Don't know if you already know this, but using Groovy property syntax makes code even more readable, e.g.:
>> 
>> println "${it}: ${it.getOwner()} ${it.getPosixFilePermissions()}"
>> 
>> can be written as:
>> 
>> println "$it: $it.owner $it.posixFilePermissions"
>> 
>> In general: 
>> 1. Any getter can be accessed without the "get" prefix with a lowercase first char
>> 2. A simplified string interpolation syntax without the enclosing curly braces can be used in these cases
>> (same goes for setters)
>> 
>> Cheers,
>> mg
>> 
>> 
>> On 20/10/2021 12:14, James McMahon wrote:
>>> Many thanks to each of you who offered guidance. Redirecting back to this today, anticipating success given your advice. Still getting a feel for Groovy so this helps quite a bit.
>>> Cheers,
>>> -Jim
>>> 
>>> On Fri, Oct 15, 2021 at 11:22 AM Søren Berg Glasius <soeren-Kc6N1ySXURF/[email protected] <mailto:soeren-Kc6N1ySXURF/[email protected]>> wrote:
>>> @Rachel Rudnick <mailto:[email protected]> that is a very clever use of use - good call!
>>> 
>>> Best regards / Med venlig hilsen,
>>> Søren Berg Glasius
>>> 
>>> Hedevej 1, Gl. Rye, 8680 Ry, Denmark
>>> Mobile: +45 40 44 91 88, Skype: sbglasius
>>> --- Press ESC once to quit - twice to save the changes.
>>> 
>>> 
>>> Den fre. 15. okt. 2021 kl. 17.12 skrev Rachel Greenham <[email protected] <mailto:[email protected]>>:
>>> Looks like you could pretty much use Files as an extension module and/or category for Path...
>>> 
>>> Hang on, does it work?
>>> 
>>> groovy> import java.nio.file.* 
>>> groovy> use (Files) { 
>>> groovy>     Path p = Path.of("src/groovy") 
>>> groovy>     println "is directory? ${p.isDirectory()}" 
>>> groovy>     p.list().each { println "${it}: ${it.getOwner()} ${it.getPosixFilePermissions()}" } 
>>> groovy> } 
>>> 
>>> is directory? true
>>> src/groovy/benchmark: rachel [OWNER_WRITE, OTHERS_READ, OWNER_EXECUTE, GROUP_READ, GROUP_EXECUTE, OTHERS_EXECUTE, OWNER_READ]
>>> src/groovy/xdocs: rachel [OWNER_WRITE, OTHERS_READ, OWNER_EXECUTE, GROUP_READ, GROUP_EXECUTE, OTHERS_EXECUTE, OWNER_READ]
>>> src/groovy/bootstrap: rachel [OWNER_WRITE, OTHERS_READ, OWNER_EXECUTE, GROUP_READ, GROUP_EXECUTE, OTHERS_EXECUTE, OWNER_READ]
>>> src/groovy/LICENSE: rachel [OWNER_WRITE, OTHERS_READ, GROUP_READ, OWNER_READ]
>>> ...
>>> 
>>> oh yeah that works 😉 
>>> 
>>> -- 
>>> Rachel Greenham
>>> [email protected] <mailto:[email protected]>
>>> 
>>> > On 15 Oct 2021, at 15:57, Nelson, Erick <Erick.Nelson-NXabUB82sh5Wk0Htik3J/[email protected] <mailto:Erick.Nelson-NXabUB82sh5Wk0Htik3J/[email protected]>> wrote:
>>> > 
>>> > import java.nio.file.Path
>>> > import java.nio.file.Files
>>> >  
>>> > File f = new File('test')
>>> > Path p = f.toPath()
>>> > Files.isReadable(p) // boolean
>>> > Files.isWritable(p) // boolean
>>> > Files.isExecutable(p) // boolean
>>> > Files.isDirectory(p) // boolean
>>> > Files.isRegularFile(p) // boolean
>>> >  
>>> >  
>>> > From: James McMahon <[email protected] <mailto:[email protected]>>
>>> > Date: Friday, October 15, 2021 at 4:50 AM
>>> > To: users-GSC0n/0aZo1d/SJB6HiN2Ni2O/[email protected] <mailto:users-GSC0n/0aZo1d/SJB6HiN2Ni2O/[email protected]> <users-GSC0n/0aZo1d/SJB6HiN2Ni2O/[email protected] <mailto:users-GSC0n/0aZo1d/SJB6HiN2Ni2O/[email protected]>>
>>> > Subject: Checking directory state using Groovy
>>> > 
>>> > Hello. I am trying to convert an existing script from python to Groovy. It executes a number of os.path and os.access commands, which I've not yet been able to find examples of that are written in Groovy. I have found similar implementations that employ "add on" Jenkins libraries for Groovy, but I will not have access to such libraries.Here is a brief excerpt from what I now do in python. Has anyone done similarly in Groovy? Can I impose for an example?
>>> >  
>>> > Thanks very much in advance. Here is my python:
>>> >  
>>> > if ( os.path.exists(result['thisURL']) and os.path.isfile(result['thisURL']) ) :
>>> >      if ( os.access(result['thisURL'], os.F_OK)
>>> >           and os.access(result['thisURL'], os.R_OK)
>>> >           and os.access(thisDri, os.W_OK)
>>> >           and os.access(thisDir, os.X_OK) ) :
>>> >           # do some stuff
>>> >       else :
>>> >           # dir and file not accessible, do some different stuff
>>> 
>> 
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.