[augeas-devel] [PATCH 1/2] 'set' sets multiple elements

Frederik Wagner fnerdwq at googlemail.com
Sun Mar 21 10:08:30 UTC 2010


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




More information about the augeas-devel mailing list