--- /dev/null +++ b/calendar.opam @@ -0,0 +1,25 @@ +opam-version: "2.0" +version: "dev" +author: "Julien Signoles" +maintainer: "ocaml-community" +license: "LGPL-2.1 with OCaml linking exception" +synopsis: "Library for handling dates and times in your program" +build: [ + ["dune" "build" "-p" name] + ["dune" "build" "@doc" "-p" name] {with-doc} + ["dune" "runtest" "-p" name] {with-test} +] +depends: [ + "re" + "dune" {build} + "odoc" {with-doc} + "alcotest" {with-test} +] +tags: [ "calendar" "date" "time" "datetime" ] +homepage: "https://github.com/ocaml-community/calendar" +doc: "https://ocaml-community.github.io/calendar/" +bug-reports: "https://github.com/ocaml-community/calendar/issues" +dev-repo: "git+https://github.com/ocaml-community/calendar" +description:""" +Calendar is a library for handling dates and times in your program. +""" --- /dev/null +++ b/dune-project @@ -0,0 +1 @@ +(lang dune 1.0) --- a/src/date.ml +++ b/src/date.ml @@ -70,7 +70,7 @@ let hash = Utils.Int.hash (* Constructors. *) let lt (d1 : int * int * int) (d2 : int * int * int) = - Pervasives.compare d1 d2 < 0 + Stdlib.compare d1 d2 < 0 (* [date_ok] returns [true] is the date belongs to the Julian period; [false] otherwise. *) @@ -249,10 +249,10 @@ module Period = struct let sub x y = { m = x.m - y.m; d = x.d - y.d } let opp x = { m = - x.m; d = - x.d } - (* exactly equivalent to [Pervasives.compare] but more flexible typing *) + (* exactly equivalent to [Stdlib.compare] but more flexible typing *) let compare x y = - let n = Pervasives.compare x.m y.m in - if n = 0 then Pervasives.compare x.d y.d else n + let n = Stdlib.compare x.m y.m in + if n = 0 then Stdlib.compare x.d y.d else n let equal x y = compare x y = 0 let hash = Hashtbl.hash @@ -337,7 +337,7 @@ let weeks_in_year y = | _ -> 52 let week_first_last w y = - let d = make y 1 1 in + let d = make y 1 4 in (* January 4th must be in the first week (ISO 8601) *) let d = d - d mod 7 in let b = d + 7 * (w - 1) in b, 6 + b --- /dev/null +++ b/src/dune @@ -0,0 +1,16 @@ +(library + (name calendarLib) + (public_name calendar) + (libraries re unix) + (modules_without_implementation calendar_sig date_sig period time_sig) + (flags :standard -warn-error -32 -safe-string)) + +(rule + (targets version.ml) + (action + (with-stdout-to %{targets} + (progn + (echo "let version = String.trim \"" %{version:calendar} "\"\n") + (echo "let date = String.trim \"") + (echo "\"\n"))))) + --- a/src/printer.ml +++ b/src/printer.ml @@ -121,7 +121,7 @@ let gen_day_of_name f fmt name = let day_of_name = gen_day_of_name name_of_day "%a" let day_of_short_name = gen_day_of_name short_name_of_day "%A" -let word_regexp = ref (Str.regexp "[a-zA-Z]+") +let word_regexp = ref (Re.Str.regexp "[a-zA-Z]+") let set_word_regexp r = word_regexp := r @@ -181,7 +181,7 @@ struct let print_int pad k n = print_number fmt pad k (Lazy.force n) in let print_string pad s = let pad s = match pad with - | Uppercase -> String.uppercase s + | Uppercase -> String.uppercase_ascii s | Empty | Zero | Blank -> s in Format.pp_print_string fmt (pad (Lazy.force s)) @@ -236,7 +236,7 @@ struct | 'n' -> print_char '\n' | 'p' -> print_string pad apm | 'P' -> - Format.pp_print_string fmt (String.lowercase (Lazy.force apm)) + Format.pp_print_string fmt (String.lowercase_ascii (Lazy.force apm)) | 'r' -> print_time pad shour; print_char ' '; @@ -259,10 +259,10 @@ struct print_number fmt Zero 10 0 | ':' -> let idx = - try Str.search_forward (Str.regexp "z\\|:z\\|::z") f (i+1) + try Re.Str.search_forward (Re.Str.regexp "z\\|:z\\|::z") f (i+1) with Not_found -> bad_format f in - let next = Str.matched_string f in + let next = Re.Str.matched_string f in if idx <> i+1 then bad_format f; if Lazy.force tz >= 0 then print_char '+'; print_int pad 10 tz; @@ -352,15 +352,15 @@ struct in let read_word ?(regexp=(!word_regexp)) () = let jn = - try Str.search_forward regexp s !j with Not_found -> not_match f s + try Re.Str.search_forward regexp s !j with Not_found -> not_match f s in if jn <> !j then not_match f s; - let w = Str.matched_string s in + let w = Re.Str.matched_string s in j := jn + String.length w; w in let read_float = - let regexp = Str.regexp "[0-9][0-9]\\(\\.[0-9]*\\)?" in + let regexp = Re.Str.regexp "[0-9][0-9]\\(\\.[0-9]*\\)?" in fun () -> try float_of_string (read_word ~regexp ()) with Failure _ -> not_match f s @@ -390,7 +390,7 @@ struct let parse_y () = year := read_number 2 + 1900 in let parse_Y () = year := read_number 4 in let parse_tz () = - let sign = match read_word ~regexp:(Str.regexp "[\\+-]") () with + let sign = match read_word ~regexp:(Re.Str.regexp "[\\+-]") () with | "+" -> -1 | "-" -> 1 | _ -> assert false --- a/src/printer.mli +++ b/src/printer.mli @@ -125,7 +125,7 @@ val short_name_of_month : Date.month -> [name_of_month d]. Used by the specifier [%b]. *) -val set_word_regexp: Str.regexp -> unit +val set_word_regexp: Re.Str.regexp -> unit (** Set the regular expression used to recognize words in [from_fstring]. Default is [[a-zA-Z]*]. @since 1.10 *) --- a/src/time_Zone.ml +++ b/src/time_Zone.ml @@ -44,7 +44,6 @@ let gap_gmt_local = let current () = !tz let change = function - | UTC_Plus x when out_of_bounds x -> invalid_arg "Not a valid time zone" | _ as t -> tz := t let gap t1 t2 = --- a/src/utils.ml +++ b/src/utils.ml @@ -29,8 +29,8 @@ end module Int = struct type t = int - let equal = Pervasives.(=) - let compare = Pervasives.compare + let equal = Stdlib.(=) + let compare = Stdlib.compare let hash = Hashtbl.hash end @@ -38,7 +38,7 @@ module Float = struct type t = float - let precision = ref 1e-3 + let precision = ref 1e-8 let set_precision f = precision := f --- a/src/utils.mli +++ b/src/utils.mli @@ -58,8 +58,8 @@ module Float: sig val set_precision: float -> unit (** Set the precision of [equal] and [compare] for float. If the precision is [p], then the floats [x] and [y] are equal iff - [abs(x-y) < p]. By default, the precision is [1e-3] (that is one - millisecond if floats represents seconds). *) + [abs(x-y) < p]. By default, the precision is [1e-8] (that is 0.864 + milliseconds if floats represent days). *) val round: t -> int (** Round a float to the nearest integer. *) --- /dev/null +++ b/tests/dune @@ -0,0 +1,8 @@ +(executable + (name test) + (libraries calendar)) + +(alias + (name runtest) + (deps test.exe) + (action (run ./test.exe -e))) --- a/tests/test_timezone.ml +++ b/tests/test_timezone.ml @@ -29,6 +29,7 @@ open Time_Zone;; include Gen_test;; reset ();; +change UTC;; test (current () = UTC) "current () = UTC";; change Local;; test (current () = Local) "current () = Local";;