goal 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/bin/goal +9 -1
- data/lib/goal.rb +11 -9
- data/lib/goal/freshbooks_calculator.rb +16 -10
- data/lib/goal/hour_calculator.rb +11 -5
- data/lib/goal/version.rb +1 -1
- data/spec/calculator_spec.rb +2 -2
- data/spec/freshbooks_calculator_spec.rb +4 -5
- data/spec/hour_calculator_spec.rb +4 -0
- data/spec/report_spec.rb +1 -1
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8d56f5e9e0c22d0b08781b9dbdf216e984a6d1a8
|
4
|
+
data.tar.gz: bd8b68ca175fff89f194f74d918aa73d4d9dc50d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8a958a934fcbf74fdb4ba7dc3d99ca9209f412a62cde80d10eff55f72ab8df457a9c27fe686009a7d733f943ed188a0309190dbde96b03b86bfefca57471d446
|
7
|
+
data.tar.gz: 1dcc996014c566cbf6bdc477457128b5ac6bbfd555e648aaa2e1f30d6e479b7af4a0d68b5c002b9e4b4ae17cc3dcf6ddf21e4f79f021b39838267526d7f6e3f1
|
data/Gemfile.lock
CHANGED
data/bin/goal
CHANGED
@@ -16,6 +16,10 @@ optparse = OptionParser.new do |opts|
|
|
16
16
|
options[:token] = t
|
17
17
|
end
|
18
18
|
|
19
|
+
opts.on("-p", "--project=PROJECT", "Freshbooks project id") do |p|
|
20
|
+
options[:project_id] = p.to_i
|
21
|
+
end
|
22
|
+
|
19
23
|
opts.on("-g", "--goals=[GOALS]", "Your goal list. Ex 160:200:300") do |g|
|
20
24
|
options[:goal_list] = g.split(':').map(&:to_i)
|
21
25
|
end
|
@@ -27,11 +31,15 @@ optparse = OptionParser.new do |opts|
|
|
27
31
|
opts.on("-m", "--money=MONEY", "The money rate.") do |m|
|
28
32
|
options[:money_rate] = m.to_f
|
29
33
|
end
|
34
|
+
|
35
|
+
opts.on("-d", "--start_day=START_DAY", "Start day.") do |s|
|
36
|
+
options[:start_day] = s.to_i
|
37
|
+
end
|
30
38
|
end
|
31
39
|
|
32
40
|
optparse.parse!
|
33
41
|
|
34
|
-
unless options[:hours] || (options[:username] && options[:token])
|
42
|
+
unless options[:hours] || (options[:username] && options[:token] && options[:project_id])
|
35
43
|
puts 'Arguments -h or -u and -t are required.'
|
36
44
|
puts optparse
|
37
45
|
exit
|
data/lib/goal.rb
CHANGED
@@ -5,18 +5,20 @@ require 'goal/report'
|
|
5
5
|
module Goal
|
6
6
|
class Calculator
|
7
7
|
def initialize(options = {})
|
8
|
-
@
|
9
|
-
@
|
10
|
-
@
|
11
|
-
@
|
12
|
-
@hours
|
8
|
+
@goal_list = options.fetch(:goal_list, [160, 200, 250, 300])
|
9
|
+
@username = options[:username]
|
10
|
+
@token = options[:token]
|
11
|
+
@project_id = options[:project_id]
|
12
|
+
@hours = options[:hours]
|
13
13
|
@money_rate = options[:money_rate]
|
14
|
+
@start_day = options.fetch(:start_day, 1)
|
15
|
+
@calculator = Goal::HourCalculator.new(start_day)
|
14
16
|
end
|
15
17
|
|
16
18
|
def worked_time
|
17
|
-
if hours
|
19
|
+
@time ||= if hours
|
18
20
|
hours
|
19
|
-
elsif username && token
|
21
|
+
elsif username && token && project_id
|
20
22
|
freshbooks.hours
|
21
23
|
else
|
22
24
|
0
|
@@ -44,10 +46,10 @@ module Goal
|
|
44
46
|
private
|
45
47
|
|
46
48
|
attr_reader :base, :calculator, :goal_list, :username, :token, :hours,
|
47
|
-
:money_rate
|
49
|
+
:money_rate, :start_day, :project_id
|
48
50
|
|
49
51
|
def freshbooks
|
50
|
-
Goal::FreshbooksCalculator.new(username, token)
|
52
|
+
Goal::FreshbooksCalculator.new(username, token, project_id, start_day)
|
51
53
|
end
|
52
54
|
|
53
55
|
def goals
|
@@ -2,9 +2,11 @@ require 'ruby-freshbooks'
|
|
2
2
|
|
3
3
|
module Goal
|
4
4
|
class FreshbooksCalculator
|
5
|
-
def initialize(freshbooks_username, token)
|
6
|
-
@username
|
7
|
-
@token
|
5
|
+
def initialize(freshbooks_username, token, project_id, start_day)
|
6
|
+
@username = freshbooks_username
|
7
|
+
@token = token
|
8
|
+
@project_id = project_id
|
9
|
+
@start_day = start_day
|
8
10
|
end
|
9
11
|
|
10
12
|
def hours
|
@@ -13,24 +15,28 @@ module Goal
|
|
13
15
|
|
14
16
|
private
|
15
17
|
|
16
|
-
attr_reader :username, :token
|
18
|
+
attr_reader :username, :token, :start_day, :project_id
|
17
19
|
|
18
20
|
def entries_for_month
|
19
|
-
entries = connection.time_entry.list(date_from: date_from, date_to: date_to, per_page: per_page)
|
20
|
-
|
21
|
-
if entries.has_key?('time_entries')
|
22
|
-
entries['time_entries']['time_entry']
|
21
|
+
entries = connection.time_entry.list(date_from: date_from, date_to: date_to, project_id: project_id, per_page: per_page)
|
22
|
+
|
23
|
+
if entries.has_key?('time_entries') &&entries['time_entries'].has_key?('time_entry')
|
24
|
+
if entries['time_entries']['time_entry'].is_a?(Array)
|
25
|
+
entries['time_entries']['time_entry']
|
26
|
+
else
|
27
|
+
[] << entries['time_entries']['time_entry']
|
28
|
+
end
|
23
29
|
else
|
24
30
|
[]
|
25
31
|
end
|
26
32
|
end
|
27
33
|
|
28
34
|
def date_from
|
29
|
-
Date.new Date.today.year, Date.today.month,
|
35
|
+
Date.new Date.today.year, Date.today.month, start_day
|
30
36
|
end
|
31
37
|
|
32
38
|
def date_to
|
33
|
-
|
39
|
+
date_from + 30
|
34
40
|
end
|
35
41
|
|
36
42
|
def per_page
|
data/lib/goal/hour_calculator.rb
CHANGED
@@ -1,10 +1,14 @@
|
|
1
1
|
module Goal
|
2
2
|
class HourCalculator
|
3
|
+
def initialize(start_day)
|
4
|
+
@start_day = start_day
|
5
|
+
end
|
6
|
+
|
3
7
|
def total_days_until(date = Date.today)
|
4
8
|
total = 0
|
5
9
|
month = Date.today.month
|
6
10
|
year = Date.today.year
|
7
|
-
date.day.downto(
|
11
|
+
date.day.downto(start_day) do |day|
|
8
12
|
current = Date.new(year, month, day)
|
9
13
|
|
10
14
|
total += 1 unless current.saturday? || current.sunday?
|
@@ -15,7 +19,7 @@ module Goal
|
|
15
19
|
|
16
20
|
def estimated_for(goal)
|
17
21
|
current_days = total_days_until
|
18
|
-
total_days = total_days_until(
|
22
|
+
total_days = total_days_until(end_of_period)
|
19
23
|
|
20
24
|
hours_per_day = goal.to_f / total_days.to_f
|
21
25
|
|
@@ -31,13 +35,15 @@ module Goal
|
|
31
35
|
end
|
32
36
|
|
33
37
|
def days_left
|
34
|
-
total_days_until(
|
38
|
+
total_days_until(end_of_period) - total_days_until + 1
|
35
39
|
end
|
36
40
|
|
37
41
|
private
|
38
42
|
|
39
|
-
|
40
|
-
|
43
|
+
attr_reader :start_day
|
44
|
+
|
45
|
+
def end_of_period
|
46
|
+
Date.new(Date.today.year, Date.today.month, start_day) + 30
|
41
47
|
end
|
42
48
|
end
|
43
49
|
end
|
data/lib/goal/version.rb
CHANGED
data/spec/calculator_spec.rb
CHANGED
@@ -14,13 +14,13 @@ describe Goal::Calculator do
|
|
14
14
|
|
15
15
|
context 'with hours' do
|
16
16
|
subject do
|
17
|
-
described_class.new(username: 'username', token: 'token')
|
17
|
+
described_class.new(username: 'username', token: 'token', project_id: 222)
|
18
18
|
end
|
19
19
|
|
20
20
|
it 'should return the freshbooks hours' do
|
21
21
|
instance = double(:instance)
|
22
22
|
|
23
|
-
Goal::FreshbooksCalculator.should_receive(:new).with('username', 'token').and_return(instance)
|
23
|
+
Goal::FreshbooksCalculator.should_receive(:new).with('username', 'token', 222, 1).and_return(instance)
|
24
24
|
instance.should_receive(:hours).and_return 55.55
|
25
25
|
|
26
26
|
expect(subject.worked_time).to eq 55.55
|
@@ -3,8 +3,7 @@ require 'spec_helper'
|
|
3
3
|
describe Goal::FreshbooksCalculator do
|
4
4
|
let(:time_entry) { double(:time_entry) }
|
5
5
|
let(:connection) { double(:connection, time_entry: time_entry) }
|
6
|
-
let(:
|
7
|
-
let(:begin_of_month) { Date.new Date.today.year, Date.today.month, 1 }
|
6
|
+
let(:begin_of_month) { Date.new Date.today.year, Date.today.month, 5 }
|
8
7
|
|
9
8
|
let :entries do
|
10
9
|
{
|
@@ -29,7 +28,7 @@ describe Goal::FreshbooksCalculator do
|
|
29
28
|
end
|
30
29
|
|
31
30
|
subject do
|
32
|
-
described_class.new 'username', 'token'
|
31
|
+
described_class.new 'username', 'token', 12, 5
|
33
32
|
end
|
34
33
|
|
35
34
|
describe '#hours' do
|
@@ -38,7 +37,7 @@ describe Goal::FreshbooksCalculator do
|
|
38
37
|
FreshBooks::Client.should_receive(:new).with('username.freshbooks.com', 'token').and_return(connection)
|
39
38
|
time_entry.
|
40
39
|
should_receive(:list).
|
41
|
-
with(date_from: begin_of_month, date_to:
|
40
|
+
with(date_from: begin_of_month, date_to: begin_of_month + 30, project_id: 12, per_page: 1000).
|
42
41
|
and_return(entries)
|
43
42
|
|
44
43
|
expect(subject.hours).to eq 15.9
|
@@ -50,7 +49,7 @@ describe Goal::FreshbooksCalculator do
|
|
50
49
|
FreshBooks::Client.should_receive(:new).with('username.freshbooks.com', 'token').and_return(connection)
|
51
50
|
time_entry.
|
52
51
|
should_receive(:list).
|
53
|
-
with(date_from: begin_of_month, date_to:
|
52
|
+
with(date_from: begin_of_month, date_to: begin_of_month + 30, project_id: 12, per_page: 1000).
|
54
53
|
and_return(error_entries)
|
55
54
|
|
56
55
|
expect(subject.hours).to eq 0
|
@@ -1,6 +1,10 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Goal::HourCalculator do
|
4
|
+
subject do
|
5
|
+
described_class.new(1)
|
6
|
+
end
|
7
|
+
|
4
8
|
describe '#total_days_until' do
|
5
9
|
it 'should calculate the business days from the beginning of the month until the specified day' do
|
6
10
|
Date.stub(today: Date.new(2013, 10, 1))
|
data/spec/report_spec.rb
CHANGED
@@ -52,7 +52,7 @@ describe Goal::Report do
|
|
52
52
|
report += "| 200 | 121.74 | 12.22 |\n"
|
53
53
|
report += "|--------------------------------|\n"
|
54
54
|
report += "| Current time: 90.0\n"
|
55
|
-
report += "| Current money:
|
55
|
+
report += "| Current money: 15.000,45\n"
|
56
56
|
report += "| Current rate: 6.43\n"
|
57
57
|
report += "| Days left: 9"
|
58
58
|
|
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.
|
4
|
+
version: 0.3.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:
|
11
|
+
date: 2014-03-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ruby-freshbooks
|
@@ -112,8 +112,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
112
112
|
version: '0'
|
113
113
|
requirements: []
|
114
114
|
rubyforge_project:
|
115
|
-
rubygems_version: 2.1.
|
115
|
+
rubygems_version: 2.1.11
|
116
116
|
signing_key:
|
117
117
|
specification_version: 4
|
118
118
|
summary: Keep track of your hour goals
|
119
119
|
test_files: []
|
120
|
+
has_rdoc:
|