I apologize for the confusion. We decided some time ago to not really support the function NanoRibbon, since it's so easy now to build graphene nanoribbons in the graphical interface, in the Builder in VNL.
But fortunately it still works, and for a zigzag edge you would just do NanoRibbon(10,10) for instance.
The example in the manual is, however, indeed wrong for the passivation. Here is how you need to do it now:
from NL.CommonConcepts.Configurations.Passivate import passivate
ribbon = NanoRibbon(10,10)
ribbon = passivate(ribbon,selection=[True]*len(ribbon))
There is a complete description of the public API in the Reference Manual. However, in addition to that there is also a "secret" API which we use internally, which contains hundreds of useful functions. The reason these are publicly documented is mostly because we want to be free to change them as we like and need - and if they are public and people start using them, you get into issues with backwards compatibility.
Since most of the framework is object-oriented, the easiest way to find some of the "hidden" functionality is to query the objects. If you start "atkpython" in an interactive session, you can for instance type
and find the method you are looking for in this case: the private (and thus undocumented) "_changeAtoms". To access the doc-string for that, type
help BulkConfiguration._changeAtoms
which at least shows which arguments you need to provide.
So to change atom numbers 4,5 and 10 (first atom has index 0) to Ruthenium, you can do
my_system = NanoRibbon(10,10)
my_system._changeAtoms(indices=[4,5,10], elements=[Ruthenium,]*3)
nlprint(my_system)
And so on ;)