README.md in fugit-0.9.0 vs README.md in fugit-0.9.1

- old
+ new

@@ -2,22 +2,56 @@ # fugit [![Build Status](https://secure.travis-ci.org/floraison/fugit.svg)](http://travis-ci.org/floraison/fugit) [![Gem Version](https://badge.fury.io/rb/fugit.svg)](http://badge.fury.io/rb/fugit) -Time tools for [flor](https://github.com/floraison/flor) and the floraison project. +Time tools for [flor](https://github.com/floraison/flor) and the floraison group. +Fugit will probably become the foundation for [rufus-scheduler](https://github.com/jmettraux/rufus-scheduler) 4.x + + +## Related projects + +### Sister projects + +* [rufus-scheduler](https://github.com/jmettraux/rufus-scheduler) - a cron/at/in/every/interval in-process scheduler, in fact, it's the father project to this fugit project +* [flor](https://github.com/floraison/flor) - a Ruby workflow engine, fugit provides the foundation for its time scheduling capabilities + +### Similar, somehow overlapping projects + +* [chronic](https://github.com/mojombo/chronic) - a pure Ruby natural language date parser +* [parse-cron](https://github.com/siebertm/parse-cron) - parses cron expressions and calculates the next occurence after a given date +* [ice_cube](https://github.com/seejohnrun/ice_cube) - Ruby date recurrence library +* [ISO8601](https://github.com/arnau/ISO8601) - Ruby parser to work with ISO8601 dateTimes and durations +* ... + + ## `Fugit::Cron` +A class `Fugit::Cron` to parse cron strings and then `#next_time` and `#previous_time` to compute the next or the previous occurrence respectively. + +There is also a `#brute_frequency` method which returns an array `[ shortest delta, longest delta, occurrence count ]` where delta is the time between two occurences. + ```ruby require 'fugit' c = Fugit::Cron.parse('0 0 * * sun') + # or +c = Fugit::Cron.new('0 0 * * sun') -p Time.now # => 2017-01-03 09:53:27 +0900 +p Time.now # => 2017-01-03 09:53:27 +0900 -p c.next_time # => 2017-01-08 00:00:00 +0900 +p c.next_time # => 2017-01-08 00:00:00 +0900 +p c.previous_time # => 2017-01-01 00:00:00 +0900 + +p c.brute_frequency # => [ 604800, 604800, 53 ] + # [ delta min, delta max, occurrence count ] + +p c.match?(Time.parse('2017-08-06')) # => true +p c.match?(Time.parse('2017-08-07')) # => false +p c.match?('2017-08-06') # => true +p c.match?('2017-08-06 12:00') # => false ``` Example of cron strings understood by fugit: ```ruby '5 0 * * *' # 5 minutes after midnight, every day @@ -37,9 +71,35 @@ '0 0 last * *' # idem '0 0 -7-L * *' # from the seventh to last to the last day of month at 00:00 # and more... ``` + +## `Fugit::Duration` + +A class `Fugit::Duration` to parse duration strings (vanilla [rufus-scheduler](https://github.com/jmettraux/rufus-scheduler) ones and [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) ones. + +Provides duration arithmetic tools. + +```ruby +require 'fugit' + +d = Fugit::Duration.parse('1y2M1d4h') + +p d.to_plain_s # => "1Y2M1D4h" +p d.to_iso_s # => "P1Y2M1DT4H" ISO 8601 duration +p d.to_long_s # => "1 year, 2 months, 1 day, and 4 hours" + +d += Fugit::Duration.parse('1y1h') + +p d.to_long_s # => "2 years, 2 months, 1 day, and 5 hours" + +d += 3600 + +p d.to_plain_s # => "2Y2M1D5h3600s" +``` +TODO: continue me + ## LICENSE MIT, see [LICENSE.txt](LICENSE.txt)