[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