[augeas-devel] Re: More generic constructions in util.aug

Raphaël Pinson raphink at gmail.com
Fri Mar 27 22:04:52 UTC 2009


And here are some examples on group.aug and fstab.aug, adapting util.aug a
bit more still :

diff --git a/lenses/util.aug b/lenses/util.aug
index 0dced14..03ec6de 100644
--- a/lenses/util.aug
+++ b/lenses/util.aug
@@ -5,7 +5,7 @@ Module: Util
 Author: David Lutterkort

 About: License
-  This file is licensed under the LGPLv2+, like the rest of Augeas.
+  This file is licensed under the GPL.
 *)


@@ -97,6 +97,31 @@ Variable: stdexcl
     (excl "*.augsave") .
     (excl "*.augnew")


+
+(* Lists constructions *)
+  let list (lns:lens) (sep:lens) = lns . ( sep . lns ) *
+
+(* Stores *)
+  let sto_to_spc = store /([^ \t\n].*[^ \t\n]|[^ \t\n])/
+  let sto_no_spc = store /[^ ^\t\n]+/
+
+(* Labels *)
+  let xchg (m:regexp) (d:string) (l:string) = del m d . label l
+  let key_value_line (kw: regexp) (sep:lens) (sto:lens) =
+                                   [ key kw . sep . sto . eol ]
+  let key_value (kw: regexp) (sep:lens) (sto:lens) =
+                                   [ key kw . sep . sto ]
+
+  let brackets (l:lens) (r:lens) (lns:lens) = l . lns . r
+
+(* Regexps *)
+  let word    = /[A-Za-z0-9_.-]+/
+  let integer = /[0-9]+/
+  let ip      = /[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/
+
+
+
+
 (* Local Variables: *)
 (* mode: caml       *)
 (* End:             *)

diff --git a/lenses/fstab.aug b/lenses/fstab.aug
index 2246026..92f5250 100644
--- a/lenses/fstab.aug
+++ b/lenses/fstab.aug
@@ -5,21 +5,22 @@ module Fstab =

   let sep_tab = Util.del_ws_tab
   let sep_spc = Util.del_ws_spc
-  let comma = Util.del_str ","
-  let eol = del /[ \t]*\n/ "\n"
+  let sep_com = Util.del_str ","
+  let eol     = Util.eol

   let comment = Util.comment
   let empty   = Util.empty

   let word = /[^,# \n\t]+/
   let comma_sep_list (l:string) =
-    [ label l . store word ] . ([comma . label l . store word])*
+    let lns = [ label l . store word ] in
+       Util.list lns sep_com
   let record = [ seq "mntent" .
                    [ label "spec" . store  word ] . sep_tab .
-                   [ label "file" . store word ] . sep_tab .
-                   comma_sep_list "vfstype" . sep_tab .
+                   [ label "file" . store word ]  . sep_tab .
+                   comma_sep_list "vfstype"       . sep_tab .
                    comma_sep_list "opt" .
-                   (sep_tab . [ label "dump" . store /[0-9]+/ ] .
+                   ( sep_tab . [ label "dump" . store /[0-9]+/ ] .
                     ( sep_spc . [ label "passno" . store /[0-9]+/ ])? )?
                  . eol ]

diff --git a/lenses/group.aug b/lenses/group.aug
index 26bfc61..0c5425b 100644
--- a/lenses/group.aug
+++ b/lenses/group.aug
@@ -17,25 +17,22 @@ let eol        = Util.eol
 let comment    = Util.comment
 let empty      = Util.empty

-let colon      = del ":" ":"
-let comma      = del "," ","
+let sep_col    = Util.del_str ":"
+let sep_com    = Util.del_str ","

-let sto_to_eol = store /([^ \t\n].*[^ \t\n]|[^ \t\n])/
-
-let word       = /[A-Za-z0-9_.-]+/
-let integer    = /[0-9]+/
+let word       = Util.word
+let integer    = Util.integer

 (************************************************************************
  *                               ENTRIES
  *************************************************************************)

-let user      = [ label "user"     . store word ]
-let entry     = [ key word
-                . colon
-                . [ label "password" . store word    . colon ]
-                . [ label "gid"      . store integer . colon ]
-                . (user . (comma . user)*)?
-                . eol ]
+let user      = [ label "user" . store word ]
+let user_list = Util.list user sep_com
+let params    = [ label "password" . store word    . sep_col ]
+                . [ label "gid"    . store integer . sep_col ]
+                . user_list?
+let entry     = Util.key_value_line word sep_col params

 (************************************************************************
  *                                LENS







2009/3/27 Raphaël Pinson <raphink at gmail.com>

> Hi all,
>
> As shared with David on IRC, I think we should go even more towards sharing
> generic constructions in lenses to make writing lenses easier, and adopt
> generic ways of implementing common patterns.
>
> Here are some propositions already, taken from monit.aug and exports.aug
> and how these two lenses can be simplified by using the newly defined types
> :
>
>
> diff --git a/lenses/util.aug b/lenses/util.aug
> index 0dced14..40a9ec3 100644
> --- a/lenses/util.aug
> +++ b/lenses/util.aug
>  @@ -97,6 +97,27 @@ Variable: stdexcl
>      (excl "*.augsave") .
>      (excl "*.augnew")
>
> +
> +(* Lists constructions *)
> +  let list (lns:lens) (sep:lens) = lns . ( sep . lns ) *
> +
> +(* Stores *)
> +  let sto_to_spc = store /([^ \t\n].*[^ \t\n]|[^ \t\n])/
> +  let sto_no_spc = store /[^ ^\t\n]+/
> +
> +(* Labels *)
> +  let xchg (m:regexp) (d:string) (l:string) = del m d . label l
> +  let key_value_line (kw: regexp) (sep:lens) (sto:lens) =
> +                                   [ key kw . sep . sto . eol ]
> +  let key_value (kw: regexp) (sep:lens) (sto:lens) =
> +                                   [ key kw . sep . sto ]
> +
> +  let brackets (l:lens) (r:lens) (lns:lens) = l . lns . r
> +
> +(* Regexps *)
> +  let word = /[A-Za-z0-9_.-]+/
> +
> +
>  (* Local Variables: *)
>  (* mode: caml       *)
>  (* End:             *)
>
>
> diff --git a/lenses/exports.aug b/lenses/exports.aug
> index 499a3af..d3103e1 100644
> --- a/lenses/exports.aug
> +++ b/lenses/exports.aug
> @@ -78,19 +78,20 @@ module Exports =
>
>    let client_re = /[a-zA-Z0-9\-\.@\*\?\/]+/
>
> -  let eol = del /[ \t]*\n/ "\n"
> +  let eol       = Util.eol
> +  let lbracket  = Util.del_str "("
> +  let rbracket  = Util.del_str ")"
> +  let sep_com   = Util.del_str ","
> +  let sep_spc   = Util.del_ws_spc
>
>  let option = [ label "option" . store /[^,)]+/ ]
>
> -  let client = [ label "client" . store client_re .
> -                    ( Util.del_str "(" .
> -                        option .
> -                        ( Util.del_str "," . option ) * .
> -                      Util.del_str ")" )? ]
> +  let client    = [ label "client" . store client_re .
> +                    ( Util.brackets lbracket rbracket
> +                         ( Util.list option sep_com ) )? ]
>
> -  let entry = [ label "dir" . store /\/[^ \t]*/ .
> -                Util.del_ws_spc .
> -                client . (Util.del_ws_spc . client)* . eol ]
> +  let entry = [ label "dir" . store /\/[^ \t]*/
> +                . sep_spc . Util.list client sep_spc . eol ]
>
>    let lns = (Hosts.empty | Hosts.comment | entry)*
>
> diff --git a/lenses/monit.aug b/lenses/monit.aug
> index bd4e63e..24b69ae 100644
> --- a/lenses/monit.aug
> +++ b/lenses/monit.aug
> @@ -38,24 +38,24 @@ let spc        = Util.del_ws_spc
>  let comment    = Util.comment
>  let empty      = Util.empty
>
> -let sto_to_eol = store /([^ \t\n].*[^ \t\n]|[^ \t\n])/
> -let sto_to_spc = store /[^ \t\n]+/
> +let sto_to_eol = Util.sto_to_spc
> +let sto_no_spc = Util.sto_no_spc
>
> -let word       = /[A-Za-z0-9_.-]+/
> -let value      = [ key word . spc . sto_to_eol . eol ]
> +let word       = Util.word
> +let value      = Util.key_value_line word spc sto_to_eol
>
>  (************************************************************************
>   *                               ENTRIES
>
> *************************************************************************)
>
>  (* set statement *)
> -let set        = [ key "set" . spc . value  ]
> +let set        = Util.key_value "set" spc value
>
>  (* include statement *)
> -let include    = [ key "include" . spc . sto_to_eol . eol ]
> +let include    = Util.key_value_line "include" spc sto_to_eol
>
>  (* service statement *)
> -let service    = [ key "check" . spc . value . (spc . value)+ ]
> +let service    = Util.key_value_line "check" spc (Util.list value spc)
>
>  let entry      = (set|include|service)
>
>
>
>
> Any ideas/comments are welcome :)
>
>
> Raphaël
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://listman.redhat.com/archives/augeas-devel/attachments/20090327/8e9ae49b/attachment.htm>


More information about the augeas-devel mailing list