From 50792ee989e81b52ed886be967843d85433f0ce5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Pinson?= Date: Tue, 3 Dec 2013 10:11:38 +0100 Subject: [PATCH] Yum.lns: simplify code for combinatory logic of list_entry elements (cherry picked from commit 9c645afbde88a2bdb5f8b139fde44968b019234c) Build: Add combinatorics group (cherry picked from commit 3f57641d8df3ed1edf89cd7641c4c6e84c3a3429) Yum.lns: split excludes as lists (ticket #275) (cherry picked from commit c16ccfd64045cb5f9c8793bc7589fc80fc027064) --- lenses/build.aug | 57 +++++++++++++++++++++++++++++++++++ lenses/tests/test_build.aug | 73 +++++++++++++++++++++++++++++++++++++++++++++ lenses/tests/test_yum.aug | 11 +++++++ lenses/yum.aug | 16 +++++----- 4 files changed, 149 insertions(+), 8 deletions(-) diff --git a/lenses/build.aug b/lenses/build.aug index 2e57356..efc8814 100644 --- a/lenses/build.aug +++ b/lenses/build.aug @@ -298,3 +298,60 @@ let block_newlines (entry:lens) (comment:lens) = ************************************************************************) let named_block (kw:regexp) (entry:lens) = [ key kw . block entry . eol ] + +(************************************************************************ + * Group: COMBINATORICS + ************************************************************************) + +(************************************************************************ + * View: combine_two_opt_ord + * Combine two lenses optionally, ensuring first lens is first + * (a, and optionally b) + * + * Parameters: + * a:lens - the first lens + * b:lens - the second lens + ************************************************************************) +let combine_two_opt_ord (a:lens) (b:lens) = a . b? + +(************************************************************************ + * View: combine_two_opt + * Combine two lenses optionally + * (either a, b, or both, in any order) + * + * Parameters: + * a:lens - the first lens + * b:lens - the second lens + ************************************************************************) +let combine_two_opt (a:lens) (b:lens) = + combine_two_opt_ord a b | combine_two_opt_ord b a + + +(************************************************************************ + * View: combine_three_opt_ord + * Combine three lenses optionally, ensuring first lens is first + * (a followed by either b, c, or any of them, in any order) + * + * Parameters: + * a:lens - the first lens + * b:lens - the second lens + * c:lens - the third lens + ************************************************************************) +let combine_three_opt_ord (a:lens) (b:lens) (c:lens) = + combine_two_opt_ord a (combine_two_opt b c) + +(************************************************************************ + * View: combine_three_opt + * Combine three lenses optionally + * (either a, b, c, or any of them, in any order) + * + * Parameters: + * a:lens - the first lens + * b:lens - the second lens + * c:lens - the third lens + ************************************************************************) +let combine_three_opt (a:lens) (b:lens) (c:lens) = + combine_three_opt_ord a b c + | combine_three_opt_ord b a c + | combine_three_opt_ord c b a + diff --git a/lenses/tests/test_build.aug b/lenses/tests/test_build.aug index b9b09fa..bc565f3 100644 --- a/lenses/tests/test_build.aug +++ b/lenses/tests/test_build.aug @@ -174,3 +174,76 @@ test logrotate_block get "/var/log/wtmp\n/var/log/wtmp2\n{ { "monthly" } } + +(************************************************************************ + * Group: COMBINATORICS + ************************************************************************) + +(* View: combine_two_opt + A minimalistic optional combination lens *) +let combine_two_opt = + let entry (k:string) = [ key k ] + in Build.combine_two_opt (entry "a") (entry "b") + +(* Test: combine_two_opt + Should parse ab *) +test combine_two_opt get "ab" = { "a" } { "b" } + +(* Test: combine_two_opt + Should parse ba *) +test combine_two_opt get "ba" = { "b" } { "a" } + +(* Test: combine_two_opt + Should parse a *) +test combine_two_opt get "a" = { "a" } + +(* Test: combine_two_opt + Should parse b *) +test combine_two_opt get "b" = { "b" } + +(* Test: combine_two_opt + Should not parse aa *) +test combine_two_opt get "aa" = * + +(* Test: combine_two_opt + Should not parse bb *) +test combine_two_opt get "bb" = * + + +(* View: combine_three_opt + A minimalistic optional combination lens *) +let combine_three_opt = + let entry (k:string) = [ key k ] + in Build.combine_three_opt (entry "a") (entry "b") (entry "c") + +(* Test: combine_three_opt + Should parse ab *) +test combine_three_opt get "ab" = { "a" } { "b" } + +(* Test: combine_three_opt + Should parse ba *) +test combine_three_opt get "ba" = { "b" } { "a" } + +(* Test: combine_three_opt + Should parse a *) +test combine_three_opt get "a" = { "a" } + +(* Test: combine_three_opt + Should parse b *) +test combine_three_opt get "b" = { "b" } + +(* Test: combine_three_opt + Should not parse aa *) +test combine_three_opt get "aa" = * + +(* Test: combine_three_opt + Should not parse bbc *) +test combine_three_opt get "bbc" = * + +(* Test: combine_three_opt + Should parse abc *) +test combine_three_opt get "abc" = { "a" } { "b" } { "c" } + +(* Test: combine_three_opt + Should parse cab *) +test combine_three_opt get "cab" = { "c" } { "a" } { "b" } diff --git a/lenses/tests/test_yum.aug b/lenses/tests/test_yum.aug index 17d4ea2..2688182 100644 --- a/lenses/tests/test_yum.aug +++ b/lenses/tests/test_yum.aug @@ -211,6 +211,17 @@ baseurl = http://apt.sw.be/redhat/el6/en/$basearch/rpmforge\n" = { "baseurl" = "http://apt.sw.be/redhat/el6/en/$basearch/rpmforge" } } + (* Test: Yum.lns + Issue #275: parse excludes as a list *) + test Yum.lns get "[epel] +name=Extra Packages for Enterprise Linux 6 - $basearch +exclude=ocs* clamav* +" = + { "epel" + { "name" = "Extra Packages for Enterprise Linux 6 - $basearch" } + { "exclude" = "ocs*" } + { "exclude" = "clamav*" } } + (* Local Variables: *) (* mode: caml *) (* End: *) diff --git a/lenses/yum.aug b/lenses/yum.aug index 1b13833..030d944 100644 --- a/lenses/yum.aug +++ b/lenses/yum.aug @@ -11,7 +11,6 @@ let sep = IniFile.sep "=" "=" let empty = Util.empty let eol = IniFile.eol - (************************************************************************ * ENTRY *************************************************************************) @@ -23,17 +22,18 @@ let list_entry (list_key:string) = . (list_sep . Build.opt_list [ label list_key . list_value ] list_sep)? . eol -let entry_re = IniFile.entry_re - ("baseurl" | "gpgkey") +let entry_re = IniFile.entry_re - ("baseurl" | "gpgkey" | "exclude") let entry = IniFile.entry entry_re sep comment | empty -let entries = entry* - | entry* . list_entry "baseurl" . entry* - | entry* . list_entry "gpgkey" . entry* - | entry* . list_entry "baseurl" . entry* . list_entry "gpgkey" . entry* - | entry* . list_entry "gpgkey" . entry* . list_entry "baseurl" . entry* - +let entries = + let list_entry_elem (k:string) = list_entry k . entry* + in entry* + | entry* . Build.combine_three_opt + (list_entry_elem "baseurl") + (list_entry_elem "gpgkey") + (list_entry_elem "exclude") (***********************************************************************a -- 1.8.5.3