Diff with current LegiFrance version too

This commit is contained in:
Denis Merigoux 2020-04-22 19:35:16 +02:00
parent 0f5da2c27d
commit 15fdc7de0e
2 changed files with 66 additions and 47 deletions

View File

@ -66,7 +66,7 @@ champ d'application CalculPrestationsFamiliales :
conséquence rempli conséquence rempli
*/ */
Toutefois, pour l'attribution du complément familial et de l'allocation de logement mentionnés aux 3° et 4° de l'article L. 511-1, l'âge limite peut être différent de celui mentionné au 2° du présent article. Toutefois, pour l'attribution du complément familial et de l'allocation de logement mentionnés aux 3° et 4° de l'article L. 511-1 , l'âge limite peut être différent de celui mentionné au 2° du présent article.
/* /*
champ d'application CalculPrestationsFamiliales : champ d'application CalculPrestationsFamiliales :
définition l512_3.âge_limite_alinéa_2 sous condition définition l512_3.âge_limite_alinéa_2 sous condition

View File

@ -127,39 +127,48 @@ let check_article_expiration (article_catala : Catala.Ast.law_article) (access_t
None None
end end
type article_text_acc_ref = { text : string; new_version : string } type article_text_acc = {
text : string;
let article_text_acc : article_text_acc_ref option ref = ref None new_version : string option;
current_version : string option;
}
module Diff = Simple_diff.Make (String) module Diff = Simple_diff.Make (String)
let compare_previous_article_to_new_version (access_token : string) = let compare_article_to_version (access_token : string) (text : string) (version : string) =
match !article_text_acc with let new_article = Api.get_article_json access_token version in
let new_article_text = Api.get_article_text new_article in
let text_to_list text = List.filter (fun word -> word <> "") (String.split_on_char ' ' text) in
let old_list = text_to_list text in
let new_list = text_to_list new_article_text in
let diff = Diff.get_diff (Array.of_list old_list) (Array.of_list new_list) in
let all_equal = List.for_all (fun chunk -> match chunk with Diff.Equal _ -> true | _ -> false) diff in
if not all_equal then
Catala.Cli.warning_print
(Printf.sprintf "Diff:\n%s"
(String.concat "\n"
(List.map
(fun chunk ->
match chunk with
| Diff.Equal words ->
ANSITerminal.sprintf [] "= %s" (String.concat " " (Array.to_list words))
| Diff.Added words ->
ANSITerminal.sprintf [ ANSITerminal.green ] "+ %s"
(String.concat " " (Array.to_list words))
| Diff.Deleted words ->
ANSITerminal.sprintf [ ANSITerminal.red ] "- %s"
(String.concat " " (Array.to_list words)))
diff)))
let compare_to_versions (article_text_acc : article_text_acc) (access_token : string) : unit =
begin
match article_text_acc.new_version with
| Some version -> compare_article_to_version access_token article_text_acc.text version
| None -> ()
end;
match article_text_acc.current_version with
| Some version -> compare_article_to_version access_token article_text_acc.text version
| None -> () | None -> ()
| Some text_acc ->
let new_article = Api.get_article_json access_token text_acc.new_version in
let new_article_text = Api.get_article_text new_article in
let text_to_list text =
List.filter (fun word -> word <> "") (String.split_on_char ' ' text)
in
let old_list = text_to_list text_acc.text in
let new_list = text_to_list new_article_text in
let diff = Diff.get_diff (Array.of_list old_list) (Array.of_list new_list) in
Catala.Cli.warning_print
(Printf.sprintf "Diff between old article version and new article version:\n%s"
(String.concat "\n"
(List.map
(fun chunk ->
match chunk with
| Diff.Equal words ->
ANSITerminal.sprintf [] "= %s" (String.concat " " (Array.to_list words))
| Diff.Added words ->
ANSITerminal.sprintf [ ANSITerminal.green ] "+ %s"
(String.concat " " (Array.to_list words))
| Diff.Deleted words ->
ANSITerminal.sprintf [ ANSITerminal.red ] "- %s"
(String.concat " " (Array.to_list words)))
diff)))
let driver (file : string) (debug : bool) (client_id : string) (client_secret : string) = let driver (file : string) (debug : bool) (client_id : string) (client_secret : string) =
if debug then Catala.Cli.debug_flag := true; if debug then Catala.Cli.debug_flag := true;
@ -167,23 +176,33 @@ let driver (file : string) (debug : bool) (client_id : string) (client_secret :
Catala.Cli.debug_print (Printf.sprintf "The LegiFrance API access token is %s" access_token); Catala.Cli.debug_print (Printf.sprintf "The LegiFrance API access token is %s" access_token);
(* LegiFrance is only supported for French texts *) (* LegiFrance is only supported for French texts *)
let program = Catala.Parser_driver.parse_source_files [ file ] Catala.Cli.Fr in let program = Catala.Parser_driver.parse_source_files [ file ] Catala.Cli.Fr in
List.iter let article_text_acc =
(fun item -> List.fold_left
match item with (fun article_text_acc item ->
| Catala.Ast.LawArticle article_catala -> ( match item with
compare_previous_article_to_new_version access_token; | Catala.Ast.LawArticle article_catala -> (
let new_version = check_article_expiration article_catala access_token in compare_to_versions article_text_acc access_token;
match new_version with let new_version = check_article_expiration article_catala access_token in
| Some (Available version) -> match new_version with
article_text_acc := Some { text = ""; new_version = version } | Some (Available version) ->
| _ -> article_text_acc := None ) {
| Catala.Ast.LawText art_text -> ( text = "";
match !article_text_acc with new_version = Some version;
| None -> () current_version = article_catala.Catala.Ast.law_article_id;
| Some text_acc -> }
article_text_acc := Some { text_acc with text = text_acc.text ^ " " ^ art_text } ) | _ ->
| _ -> ()) {
program.program_items; text = "";
new_version = None;
current_version = article_catala.Catala.Ast.law_article_id;
} )
| Catala.Ast.LawText art_text ->
{ article_text_acc with text = article_text_acc.text ^ " " ^ art_text }
| _ -> article_text_acc)
{ text = ""; new_version = None; current_version = None }
program.program_items
in
compare_to_versions article_text_acc access_token;
exit 0 exit 0
let main () = Cmdliner.Term.exit @@ Cmdliner.Term.eval (catala_legifrance_t driver, info) let main () = Cmdliner.Term.exit @@ Cmdliner.Term.eval (catala_legifrance_t driver, info)