[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