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 <[email protected]
>> <mailto:[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 <[email protected]
>>> <mailto:[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 <[email protected]
>>> > <mailto:[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: [email protected] <mailto:[email protected]>
>>> > <[email protected] <mailto:[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
>>>
>>
>