Hi, this implements the 'set from array' functionality, there a just two litte things: - How would I make the 'set_internal' method a private one? It doesn't have to be exposed throug the ruby binding, no? - @David: How is the process of patching the puppet augeas provider for this?
Thanks a lot and bye, Frederik On Sun, Mar 21, 2010 at 11:08 AM, Frederik Wagner <[email protected]> wrote: > The 'set' function has been extended to set multiple elements at the > same time. > * ext/augeas/_augeas.c: > renamed the 'set' function from the API to 'set_internal' > * lib/augeas.rb: > added new 'set' function, changed 'set!' correspondingly, > made other function use 'set_internal' when necessary > * tests/tc_augeas.rb, tests/root/etc/group: > added tests for new function 'set' > --- > ext/augeas/_augeas.c | 2 +- > lib/augeas.rb | 27 +++++++++++++++++++-------- > tests/root/etc/group | 26 ++++++++++++++++++++++++++ > tests/tc_augeas.rb | 23 +++++++++++++++++++++++ > 4 files changed, 69 insertions(+), 9 deletions(-) > create mode 100644 tests/root/etc/group > > diff --git a/ext/augeas/_augeas.c b/ext/augeas/_augeas.c > index c396037..74b1c3c 100644 > --- a/ext/augeas/_augeas.c > +++ b/ext/augeas/_augeas.c > @@ -316,7 +316,7 @@ void Init__augeas() { > rb_define_method(c_augeas, "match", augeas_match, 1); > rb_define_method(c_augeas, "save", augeas_save, 0); > rb_define_method(c_augeas, "load", augeas_load, 0); > - rb_define_method(c_augeas, "set", augeas_set, 2); > + rb_define_method(c_augeas, "set_internal", augeas_set, 2); > rb_define_method(c_augeas, "close", augeas_close, 0); > } > > diff --git a/lib/augeas.rb b/lib/augeas.rb > index c42d073..6bbbf63 100644 > --- a/lib/augeas.rb > +++ b/lib/augeas.rb > @@ -58,9 +58,24 @@ class Augeas > end > end > > + # Set one or multiple elemens to path. > + # Multiple elements are mainly sensfull when a path like > + # .../array[last()+1] is used, since this wil append all > + # elements. > + def set(path, *values) > + values.to_a.flatten.each { |v| set_internal(path, v) } > + end > + > + # The same as +set+, but raises <tt>Augeas::Error</tt> if setting fails > + def set!(path, *values) > + values.flatten.each do |v| > + raise Augeas::Error unless set_internal(path, v) > + end > + end > + > # Clear the +path+, i.e. make its value +nil+ > def clear(path) > - set(path, nil) > + set_internal(path, nil) > end > > # Clear all transforms under <tt>/augeas/load</tt>. If +load+ > @@ -89,9 +104,9 @@ class Augeas > excl = [ excl ] unless incl.is_a?(Array) > > xfm = "/augeas/load/#{name}/" > - set(xfm + "lens", lens) > - incl.each { |inc| set(xfm + "incl[last()+1]", inc) } > - excl.each { |exc| set(xfm + "excl[last()+1]", exc) } > + set_internal(xfm + "lens", lens) > + incl.each { |inc| set_internal(xfm + "incl[last()+1]", inc) } > + excl.each { |exc| set_internal(xfm + "excl[last()+1]", exc) } > end > > # The same as +save+, but raises <tt>Augeas::Error</tt> if saving fails > @@ -104,8 +119,4 @@ class Augeas > raise Augeas::Error unless load > end > > - # The same as +set+, but raises <tt>Augeas::Error</tt> if loading fails > - def set!(path, value) > - raise Augeas::Error unless set(path, value) > - end > end > diff --git a/tests/root/etc/group b/tests/root/etc/group > new file mode 100644 > index 0000000..206b7a6 > --- /dev/null > +++ b/tests/root/etc/group > @@ -0,0 +1,26 @@ > +root:x:0:root > +bin:x:1:root,bin,daemon > +daemon:x:2:root,bin,daemon > +sys:x:3:root,bin,adm > +adm:x:4:root,adm,daemon > +tty:x:5: > +disk:x:6:root > +lp:x:7:daemon,lp > +mem:x:8: > +kmem:x:9: > +wheel:x:10:root > +mail:x:12:mail,postfix > +uucp:x:14:uucp > +man:x:15: > +games:x:20: > +gopher:x:30: > +dip:x:40: > +ftp:x:50: > +lock:x:54: > +nobody:x:99: > +users:x:100: > +floppy:x:19: > +vcsa:x:69: > +rpc:x:32:asfd > +rpcuser:x:29: > +nfsnobody:x:499: > diff --git a/tests/tc_augeas.rb b/tests/tc_augeas.rb > index b14ea66..489986f 100644 > --- a/tests/tc_augeas.rb > +++ b/tests/tc_augeas.rb > @@ -132,6 +132,29 @@ class TestAugeas < Test::Unit::TestCase > assert_raises(Augeas::Error) { aug.set!("files/etc/hosts/*", nil) } > end > > + def test_set > + aug = aug_open > + aug.set("/files/etc/group/disk/user[last()+1]",["user1","user2"]) > + assert_equal( aug.get("/files/etc/group/disk/user[1]"),"root" ) > + assert_equal( aug.get("/files/etc/group/disk/user[2]"),"user1" ) > + assert_equal( aug.get("/files/etc/group/disk/user[3]"),"user2" ) > + > + aug.set("/files/etc/group/new_group/user[last()+1]", > + "nuser1",["nuser2","nuser3"]) > + assert_equal( aug.get("/files/etc/group/new_group/user[1]"),"nuser1") > + assert_equal( aug.get("/files/etc/group/new_group/user[2]"),"nuser2" ) > + assert_equal( aug.get("/files/etc/group/new_group/user[3]"),"nuser3" ) > + > + aug.rm("/files/etc/group/disk/user") > + aug.set("/files/etc/group/disk/user[last()+1]","testuser") > + assert_equal( aug.get("/files/etc/group/disk/user"),"testuser") > + > + aug.rm("/files/etc/group/disk/user") > + aug.set("/files/etc/group/disk/user[last()+1]", nil) > + assert_equal( aug.get("/files/etc/group/disk/user"), nil) > + end > + > + > private > def aug_open(flags = Augeas::NONE) > if File::directory?(TST_ROOT) > -- > 1.7.0 > > _______________________________________________ augeas-devel mailing list [email protected] https://www.redhat.com/mailman/listinfo/augeas-devel
