pto 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
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: []