goal 0.1.0 → 0.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3a273a57258b55e11c3d0f61514950efb5026ffa
4
- data.tar.gz: 9e98c87c2cee48f8617f609acdf7388d6f9ede4f
3
+ metadata.gz: 9e6dc9f385d0532851d70b7d1d37a24cb250709f
4
+ data.tar.gz: 636a43dc39b232239589589602b3691f9b23ccf8
5
5
  SHA512:
6
- metadata.gz: 2674f99af748b9e286bf9b04316816e6561c7f3b5599ccf466d8ecfcf7723901f4abb7ed9bd3d2634ea69991827f74523463f78f75d1e90b2e8ac0807fe26bb0
7
- data.tar.gz: 964867d39e49b6d1a4a31ed4aa87fd62f9eaeedc34becd4e6ae54cc36d5110f822ed9ed86417f8f77d1409f33ed575701468b063e14a01555539ff81e0d44e1a
6
+ metadata.gz: 16be09eaf6287db18b6fa0e3aee7e25142b4e705baabbbc733a362e16a8ac4eab8018682637c103d449793b381364ecd0f5442e2e539d88d93ceb25197bc4b22
7
+ data.tar.gz: 1880eda0ab7fb3e59fd0969ed4ccc30223f725381edac0143fff21c867c8b478d85268da348e68c535ed74f1738780878578ae11135c296b142b1314397c617c
data/CHANGELOG.md CHANGED
@@ -1,3 +1,12 @@
1
+ ### 0.2.0
2
+
3
+ * bug fix
4
+ * Fix the wrong average when in beginning or end of month, issue #1
5
+
6
+ * new
7
+ * Add a extra option -m, it is used to calculate the current money based on
8
+ the current time.
9
+
1
10
  ### 0.1.0
2
11
 
3
12
  * bug fix
data/README.md CHANGED
@@ -1,3 +1,5 @@
1
+ [![Gem Version](https://badge.fury.io/rb/goal.png)](http://badge.fury.io/rb/goal)
2
+
1
3
  Goal
2
4
  ====
3
5
 
@@ -27,9 +29,9 @@ $ goal -u freshbooks_user -t freshbooks_token
27
29
  | 250 | 152 | 14.93 |
28
30
  | 300 | 182 | 20.48 |
29
31
  |____________________________|
30
- | Current: 115.66h
31
- | Average: 8.26h
32
- | Days left: 9
32
+ | Current time: 115.66h
33
+ | Current rate: 8.26h
34
+ | Days left: 9
33
35
  ```
34
36
 
35
37
  or
@@ -43,8 +45,25 @@ $ goal -h 115.66
43
45
  | 250 | 152 | 14.93 |
44
46
  | 300 | 182 | 20.48 |
45
47
  |____________________________|
46
- | Current: 115.66h
47
- | Average: 8.26h
48
+ | Current time: 115.66h
49
+ | Current rate: 8.26h
50
+ | Days left: 9
51
+ ```
52
+
53
+ or
54
+
55
+ ```bash
56
+ $ goal -h 115.66 -m 120
57
+
58
+ | Goals | Expected | Average |
59
+ | 160 | 97 | 4.93 |
60
+ | 200 | 121 | 9.37 |
61
+ | 250 | 152 | 14.93 |
62
+ | 300 | 182 | 20.48 |
63
+ |____________________________|
64
+ | Current time: 115.66h
65
+ | Current money: 13.879.20
66
+ | Current rate: 8.26h
48
67
  | Days left: 9
49
68
  ```
50
69
 
@@ -56,6 +75,7 @@ Usage: goal [options]
56
75
  -t, --token=TOKEN Freshbooks token
57
76
  -g, --goals=[GOALS] Your goal list. Ex 160:200:300
58
77
  -h, --hours=HOURS Worked time in hours.
78
+ -m, --money=MONEY The money rate.
59
79
  ```
60
80
 
61
81
  Options `-u` and `-t` are required and specify the user and token to access the
data/bin/goal CHANGED
@@ -23,6 +23,10 @@ optparse = OptionParser.new do |opts|
23
23
  opts.on("-h", "--hours=HOURS", "Worked time in hours.") do |h|
24
24
  options[:hours] = h.to_f
25
25
  end
26
+
27
+ opts.on("-m", "--money=MONEY", "The money rate.") do |m|
28
+ options[:money_rate] = m.to_f
29
+ end
26
30
  end
27
31
 
28
32
  optparse.parse!
@@ -31,7 +31,7 @@ module Goal
31
31
  end
32
32
 
33
33
  def days_left
34
- total_days_until(end_of_month) - total_days_until
34
+ total_days_until(end_of_month) - total_days_until + 1
35
35
  end
36
36
 
37
37
  private
data/lib/goal/report.rb CHANGED
@@ -26,10 +26,17 @@ module Goal
26
26
  end
27
27
 
28
28
  def footer
29
- "|" + ('-' * ((column_width * 3) + 8)) + "|\n" +
30
- "| Current time: #{data[:summary][:total_time]}\n" +
31
- "| Current rate: #{data[:summary][:rate]}\n" +
32
- "| Days left: #{data[:summary][:days_left]}"
29
+ summary = "|" + ('-' * ((column_width * 3) + 8)) + "|\n"
30
+ summary += "| Current time: #{data[:summary][:total_time]}\n"
31
+
32
+ if data[:summary][:money]
33
+ summary += "| Current money: #{number_to_currency(data[:summary][:money])}\n"
34
+ end
35
+
36
+ summary += "| Current rate: #{data[:summary][:rate]}\n"
37
+ summary += "| Days left: #{data[:summary][:days_left]}"
38
+
39
+ summary
33
40
  end
34
41
 
35
42
  def row(columns)
@@ -43,5 +50,13 @@ module Goal
43
50
  c.to_s.ljust(column_width)
44
51
  end
45
52
  end
53
+
54
+ def number_to_currency(value)
55
+ val_str = ("%.2f" % [value.to_s]).gsub('.', ',')
56
+
57
+ while val_str.sub!(/(\d+)(\d\d\d)/, '\1.\2'); end
58
+
59
+ val_str
60
+ end
46
61
  end
47
62
  end
data/lib/goal/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Goal
2
- VERSION = '0.1.0'.freeze
2
+ VERSION = '0.2.0'.freeze
3
3
  end
data/lib/goal.rb CHANGED
@@ -10,6 +10,7 @@ module Goal
10
10
  @username = options[:username]
11
11
  @token = options[:token]
12
12
  @hours = options[:hours]
13
+ @money_rate = options[:money_rate]
13
14
  end
14
15
 
15
16
  def worked_time
@@ -22,6 +23,10 @@ module Goal
22
23
  end.round(2)
23
24
  end
24
25
 
26
+ def total_money
27
+ (worked_time * money_rate).round(2)
28
+ end
29
+
25
30
  # It calculates the current hour rate
26
31
  def rate
27
32
  calculator.hour_rate(worked_time).round(2)
@@ -38,7 +43,8 @@ module Goal
38
43
 
39
44
  private
40
45
 
41
- attr_reader :base, :calculator, :goal_list, :username, :token, :hours
46
+ attr_reader :base, :calculator, :goal_list, :username, :token, :hours,
47
+ :money_rate
42
48
 
43
49
  def freshbooks
44
50
  Goal::FreshbooksCalculator.new(username, token)
@@ -59,11 +65,15 @@ module Goal
59
65
  end
60
66
 
61
67
  def summary
62
- {
68
+ data = {
63
69
  total_time: worked_time,
64
70
  rate: rate,
65
71
  days_left: calculator.days_left
66
72
  }
73
+
74
+ data[:money] = total_money if money_rate
75
+
76
+ data
67
77
  end
68
78
  end
69
79
  end
@@ -53,18 +53,18 @@ describe Goal::Calculator do
53
53
  {
54
54
  goal: 160,
55
55
  expected: 97.39,
56
- average: 7.78
56
+ average: 7.0
57
57
  },
58
58
  {
59
59
  goal: 200,
60
60
  expected: 121.74,
61
- average: 12.22
61
+ average: 11.0
62
62
  }
63
63
  ],
64
64
  summary: {
65
65
  total_time: 90.0,
66
66
  rate: 6.43,
67
- days_left: 9
67
+ days_left: 10
68
68
  }
69
69
  })
70
70
  end
@@ -3,6 +3,8 @@ require 'spec_helper'
3
3
  describe Goal::HourCalculator do
4
4
  describe '#total_days_until' do
5
5
  it 'should calculate the business days from the beginning of the month until the specified day' do
6
+ Date.stub(today: Date.new(2013, 10, 1))
7
+
6
8
  expect(subject.total_days_until Date.new(2013, 10, 17)).to eq 13 # Thursday
7
9
  expect(subject.total_days_until Date.new(2013, 10, 18)).to eq 14 # Friday
8
10
  expect(subject.total_days_until Date.new(2013, 10, 19)).to eq 14 # Saturday
@@ -32,21 +34,72 @@ describe Goal::HourCalculator do
32
34
 
33
35
  expect(subject.hour_rate(95)).to eq 6.785714285714286
34
36
  end
37
+
38
+ context 'when on the last day of the month' do
39
+ it 'should calculate the hour rate' do
40
+ Date.stub(today: Date.new(2013, 10, 31))
41
+
42
+ expect(subject.hour_rate(200)).to eq 8.695652173913043
43
+ end
44
+ end
45
+
46
+ context 'when on the first day of the month' do
47
+ it 'should calculate the hour rate' do
48
+ Date.stub(today: Date.new(2013, 10, 1))
49
+
50
+ expect(subject.hour_rate(0)).to eq 0.0
51
+ expect(subject.hour_rate(5)).to eq 5.0
52
+ end
53
+ end
35
54
  end
36
55
 
37
56
  describe '#rate_to_goal' do
38
57
  it 'should calculate the hour per day needed to the goal from the left days of the month' do
39
58
  Date.stub(today: Date.new(2013, 10, 18))
40
59
 
41
- expect(subject.rate_to_goal(200, 115.66)).to eq 9.371111111111112
60
+ expect(subject.rate_to_goal(200, 115.66)).to eq 8.434000000000001
61
+ end
62
+
63
+ context 'when on the last day of the month' do
64
+ it 'should calculate rate_to_goal' do
65
+ Date.stub(today: Date.new(2013, 10, 31))
66
+
67
+ expect(subject.rate_to_goal(200, 115.66)).to eq 84.34
68
+ end
69
+ end
70
+
71
+ context 'when on the first day of the month' do
72
+ it 'should calculate the rate to goal' do
73
+ Date.stub(today: Date.new(2013, 10, 1))
74
+
75
+ expect(subject.rate_to_goal(200, 0)).to eq 8.0
76
+ end
42
77
  end
43
78
  end
44
79
 
45
80
  describe '#days_left' do
46
- it 'should return the days left from de month since today' do
47
- Date.stub(today: Date.new(2013, 10, 18))
81
+ context 'when in beginning of the month' do
82
+ it 'should return the days left from de month since today' do
83
+ Date.stub(today: Date.new(2013, 10, 1))
84
+
85
+ expect(subject.days_left).to eq 23
86
+ end
87
+ end
88
+
89
+ context 'when in middle of the month' do
90
+ it 'should return the days left from de month since today' do
91
+ Date.stub(today: Date.new(2013, 10, 18))
92
+
93
+ expect(subject.days_left).to eq 10
94
+ end
95
+ end
96
+
97
+ context 'when in the end of the month' do
98
+ it 'should return the days left from de month since today' do
99
+ Date.stub(today: Date.new(2013, 10, 31))
48
100
 
49
- expect(subject.days_left).to eq 9
101
+ expect(subject.days_left).to eq 1
102
+ end
50
103
  end
51
104
  end
52
105
  end
data/spec/report_spec.rb CHANGED
@@ -23,21 +23,41 @@ describe Goal::Report do
23
23
  }
24
24
  end
25
25
 
26
+
26
27
  subject do
27
28
  described_class.new(data)
28
29
  end
29
30
 
30
31
  describe '#to_s' do
31
- it 'should build the report' do
32
- report = "| Goals | Expected | Average |\n"
33
- report += "| 160 | 97.39 | 7.78 |\n"
34
- report += "| 200 | 121.74 | 12.22 |\n"
35
- report += "|--------------------------------|\n"
36
- report += "| Current time: 90.0\n"
37
- report += "| Current rate: 6.43\n"
38
- report += "| Days left: 9"
39
-
40
- expect(subject.to_s).to eq report
32
+ context 'when has not money setted to summary' do
33
+ it 'should build the report' do
34
+ report = "| Goals | Expected | Average |\n"
35
+ report += "| 160 | 97.39 | 7.78 |\n"
36
+ report += "| 200 | 121.74 | 12.22 |\n"
37
+ report += "|--------------------------------|\n"
38
+ report += "| Current time: 90.0\n"
39
+ report += "| Current rate: 6.43\n"
40
+ report += "| Days left: 9"
41
+
42
+ expect(subject.to_s).to eq report
43
+ end
44
+ end
45
+
46
+ context 'when has money setted to summary' do
47
+ it 'should build the report' do
48
+ data[:summary][:money] = 15000.45
49
+
50
+ report = "| Goals | Expected | Average |\n"
51
+ report += "| 160 | 97.39 | 7.78 |\n"
52
+ report += "| 200 | 121.74 | 12.22 |\n"
53
+ report += "|--------------------------------|\n"
54
+ report += "| Current time: 90.0\n"
55
+ report += "| Current money: 15000.45\n"
56
+ report += "| Current rate: 6.43\n"
57
+ report += "| Days left: 9"
58
+
59
+ expect(subject.to_s).to eq report
60
+ end
41
61
  end
42
62
  end
43
63
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: goal
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mateus Lorandi dos Santos
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-10-22 00:00:00.000000000 Z
11
+ date: 2013-11-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ruby-freshbooks