[augeas-devel] [PATCH 1/2] 'set' sets multiple elements
Frederik Wagner
fnerdwq at googlemail.com
Sun Mar 21 10:15:00 UTC 2010
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
<fnerdwq at googlemail.com> 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
>
>
More information about the augeas-devel
mailing list