pto 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/bin/pto +77 -0
  3. metadata +44 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: d180d119e1f1b5b66163fbaeb1336b7e740edf53e3a25ec6c3de46311f965f1d
4
+ data.tar.gz: '068f57a398f5dade3702dc165344e2d7a7705b9e5b66750bfd8016f838cdc85d'
5
+ SHA512:
6
+ metadata.gz: eedd1ac8f77c5c9a2869cb894d6ad31024217747ddb87399225d29663507549d7a3b79e499d663fcb2e3acb68e53ed4850bc9e1e0baf1d60ef47737e0aaa562f
7
+ data.tar.gz: 2e1400872b68c20153d0f97752da5819763d74f3905b7a35d3d245f01b48273198036649a43e3ec3dad0b433bbe340095145f98ed69d62736040832dc1534925
data/bin/pto ADDED
@@ -0,0 +1,77 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'optparse'
4
+ require 'date'
5
+
6
+ def convert(str)
7
+ case str
8
+ when /(.*)\/(.*)/
9
+ return Float($1) / Float($2)
10
+ when /(.*)\.(.*)/
11
+ return Float(str)
12
+ else
13
+ return Integer(str)
14
+ end
15
+ end
16
+
17
+ def days_until_cap(accrual:, cap:, rate:)
18
+ days = 0
19
+ return days if accrual >= cap
20
+
21
+ daily_rate = rate / 365.0
22
+ while accrual < cap
23
+ accrual += daily_rate
24
+ days += 1
25
+ end
26
+ days
27
+ end
28
+
29
+ def main(options = {})
30
+ accrual = convert(options[:accrual])
31
+ cap = convert(options[:cap])
32
+ rate = convert(options[:rate])
33
+
34
+ days = days_until_cap(accrual: accrual, cap: cap, rate: rate)
35
+ if days == 0
36
+ puts "Already over cap :-( Please take some PTO ASAP!"
37
+ else
38
+ cap_date = Date.today + days
39
+ puts "Cap is hit in #{days} days - on #{cap_date}. Please take some PTO before then :-)"
40
+ end
41
+
42
+ return true
43
+ end
44
+
45
+ options = {}
46
+ optparse = OptionParser.new do |opts|
47
+ opts.on("-aACCRUAL", "--accrual=ACCRUAL", "Set current accrual in number of days. Defaults to zero.") do |accrual|
48
+ options[:accrual] = accrual
49
+ end
50
+ opts.on("-cCAP", "--cap=CAP", "Set cap in number of days. Required argument.") do |cap|
51
+ options[:cap] = cap
52
+ end
53
+ opts.on("-rRATE", "--rate=RATE", "Set accrual rate in number of days per year. Required argument.") do |rate|
54
+ options[:rate] = rate
55
+ end
56
+ opts.on("-h", "--help", "Prints this help") do
57
+ puts opts
58
+ exit
59
+ end
60
+ end
61
+
62
+ begin
63
+ optparse.parse!
64
+ mandatory = [:cap, :rate]
65
+ missing = mandatory.select{ |param| options[param].nil? }
66
+ unless missing.empty?
67
+ raise OptionParser::MissingArgument.new(missing.join(', '))
68
+ end
69
+ rescue OptionParser::InvalidOption, OptionParser::MissingArgument
70
+ puts $!.to_s
71
+ puts optparse
72
+ exit
73
+ end
74
+
75
+ options[:accrual] = 0.0 if options[:accrual].nil?
76
+
77
+ main(options)
metadata ADDED
@@ -0,0 +1,44 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pto
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Magne Land
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2021-01-08 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description:
14
+ email: magne.land@gmail.com
15
+ executables:
16
+ - pto
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - bin/pto
21
+ homepage: https://github.com/magneland/pto
22
+ licenses:
23
+ - MIT
24
+ metadata: {}
25
+ post_install_message:
26
+ rdoc_options: []
27
+ require_paths:
28
+ - lib
29
+ required_ruby_version: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ required_rubygems_version: !ruby/object:Gem::Requirement
35
+ requirements:
36
+ - - ">="
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ requirements: []
40
+ rubygems_version: 3.1.3
41
+ signing_key:
42
+ specification_version: 4
43
+ summary: Calculate your future Paid Time Off (PTO) accrual
44
+ test_files: []