beggar 1.0.0 → 1.0.1
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.
- data/Gemfile.lock +1 -1
- data/README.md +5 -7
- data/lib/beggar/base.rb +7 -4
- data/lib/beggar/basecamp.rb +3 -13
- data/lib/beggar/cli.rb +23 -22
- data/lib/beggar/current_month.rb +1 -1
- data/lib/beggar/version.rb +1 -1
- data/spec/base_spec.rb +13 -10
- data/spec/basecamp_spec.rb +9 -12
- data/spec/cli_spec.rb +14 -1
- data/spec/current_month_spec.rb +37 -1
- metadata +6 -6
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -6,13 +6,10 @@ Beggar is a tool for generating time reports from your Basecamp account
|
|
6
6
|
|
7
7
|
Example output:
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
78% - working days progress in current month
|
14
|
-
140.0h, -12.0h - worked hours ratio
|
15
|
-
5320.0 zł, -456.0 zł - salary ratio
|
9
|
+
Current month
|
10
|
+
Weekdays: 78%
|
11
|
+
Worked hours: 140.0h (-12.0h)
|
12
|
+
Salary: 5320.0zł (-456.0zł)
|
16
13
|
|
17
14
|
### Installation
|
18
15
|
|
@@ -35,5 +32,6 @@ Example config:
|
|
35
32
|
rate: 50.0
|
36
33
|
|
37
34
|
## Changelog
|
35
|
+
v1.0.1 - change output
|
38
36
|
v1.0.0 - first stable release
|
39
37
|
|
data/lib/beggar/base.rb
CHANGED
@@ -8,19 +8,22 @@ module Beggar
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def progress
|
11
|
-
"#{CurrentMonth.
|
11
|
+
"#{CurrentMonth.weekdays_progression}%"
|
12
12
|
end
|
13
13
|
|
14
14
|
def worked_hours
|
15
|
-
"#{basecamp.worked_hours}h
|
15
|
+
"#{basecamp.worked_hours}h (#{ratio(basecamp.hours_ratio)}h)"
|
16
16
|
end
|
17
17
|
|
18
18
|
def salary
|
19
|
-
"#{as_money(basecamp.worked_hours)}
|
19
|
+
"#{as_money(basecamp.worked_hours)}zł (#{ratio(as_money(basecamp.hours_ratio))}zł)"
|
20
20
|
end
|
21
21
|
|
22
22
|
def summary
|
23
|
-
|
23
|
+
%Q{Current month
|
24
|
+
Weekdays: #{progress}
|
25
|
+
Worked hours: #{worked_hours}
|
26
|
+
Salary: #{salary}}
|
24
27
|
end
|
25
28
|
|
26
29
|
private
|
data/lib/beggar/basecamp.rb
CHANGED
@@ -12,12 +12,12 @@ module Beggar
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def time_report(options = {})
|
15
|
-
options.merge!(
|
16
|
-
get(
|
15
|
+
options.merge!(subject_id: current_user)
|
16
|
+
self.class.get("/time_entries/report.xml", :query => options)
|
17
17
|
end
|
18
18
|
|
19
19
|
def current_user
|
20
|
-
@current_user ||= get('/me.xml')['person']['id']
|
20
|
+
@current_user ||= self.class.get('/me.xml')['person']['id']
|
21
21
|
end
|
22
22
|
|
23
23
|
def current_month
|
@@ -33,15 +33,5 @@ module Beggar
|
|
33
33
|
def hours_ratio
|
34
34
|
CurrentMonth.weekday_hours_until_today - worked_hours
|
35
35
|
end
|
36
|
-
|
37
|
-
private
|
38
|
-
|
39
|
-
def get(path)
|
40
|
-
self.class.get(path)
|
41
|
-
end
|
42
|
-
|
43
|
-
def params(options)
|
44
|
-
'?' + options.map { |name, value| "#{name}=#{value}" }.join('&')
|
45
|
-
end
|
46
36
|
end
|
47
37
|
end
|
data/lib/beggar/cli.rb
CHANGED
@@ -2,41 +2,42 @@ module Beggar
|
|
2
2
|
class CLI
|
3
3
|
class << self
|
4
4
|
def run
|
5
|
-
|
5
|
+
if File.exists?(config)
|
6
6
|
$stdout.puts Base.new(Basecamp.new(load_config)).summary
|
7
|
-
|
7
|
+
else
|
8
8
|
create_config
|
9
9
|
$stdout.puts "New config has been created in ~/.beggar"
|
10
10
|
$stdout.puts "Please fill it with proper data."
|
11
|
-
rescue URI::InvalidURIError
|
12
|
-
$stdout.puts "Ensure that your config file is proper formatted!"
|
13
11
|
end
|
14
12
|
exit 0
|
13
|
+
rescue URI::InvalidURIError
|
14
|
+
$stdout.puts "Ensure that your config file is proper formatted!"
|
15
|
+
exit 1
|
15
16
|
end
|
16
17
|
|
17
|
-
|
18
|
+
private
|
18
19
|
|
19
|
-
|
20
|
-
|
21
|
-
|
20
|
+
def load_config
|
21
|
+
YAML.load_file(config)
|
22
|
+
end
|
22
23
|
|
23
|
-
|
24
|
-
|
25
|
-
|
24
|
+
def create_config
|
25
|
+
File.open(config, "w") do |output|
|
26
|
+
YAML.dump(defaults, output)
|
27
|
+
end
|
26
28
|
end
|
27
|
-
end
|
28
29
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
30
|
+
def defaults
|
31
|
+
{
|
32
|
+
"company" => "___",
|
33
|
+
"token" => "___",
|
34
|
+
"rate" => "___"
|
35
|
+
}
|
36
|
+
end
|
36
37
|
|
37
|
-
|
38
|
-
|
39
|
-
|
38
|
+
def config
|
39
|
+
"#{Dir.home}/.beggar"
|
40
|
+
end
|
40
41
|
end
|
41
42
|
end
|
42
43
|
end
|
data/lib/beggar/current_month.rb
CHANGED
data/lib/beggar/version.rb
CHANGED
data/spec/base_spec.rb
CHANGED
@@ -27,12 +27,12 @@ describe Beggar::Base do
|
|
27
27
|
basecamp.stub(worked_hours: 136.0, hours_ratio: 32.0)
|
28
28
|
end
|
29
29
|
|
30
|
-
it 'returns "136.0h
|
31
|
-
base.worked_hours.should == "136.0h
|
30
|
+
it 'returns "136.0h (-32.0h)"' do
|
31
|
+
base.worked_hours.should == "136.0h (-32.0h)"
|
32
32
|
end
|
33
33
|
|
34
|
-
it 'returns "6800.
|
35
|
-
base.salary.should == "6800.
|
34
|
+
it 'returns "6800.0zł (-1600.0zł)"' do
|
35
|
+
base.salary.should == "6800.0zł (-1600.0zł)"
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
@@ -41,12 +41,12 @@ describe Beggar::Base do
|
|
41
41
|
basecamp.stub(worked_hours: 176.0, hours_ratio: -8.0)
|
42
42
|
end
|
43
43
|
|
44
|
-
it 'returns "176.0h
|
45
|
-
base.worked_hours.should == "176.0h
|
44
|
+
it 'returns "176.0h (+8.0h)"' do
|
45
|
+
base.worked_hours.should == "176.0h (+8.0h)"
|
46
46
|
end
|
47
47
|
|
48
|
-
it 'returns "8800.
|
49
|
-
base.salary.should == "8800.
|
48
|
+
it 'returns "8800.0zł (+$400.0zł)"' do
|
49
|
+
base.salary.should == "8800.0zł (+400.0zł)"
|
50
50
|
end
|
51
51
|
end
|
52
52
|
|
@@ -63,8 +63,11 @@ describe Beggar::Base do
|
|
63
63
|
end
|
64
64
|
|
65
65
|
it 'returns summary' do
|
66
|
-
base.stub(progress: "78%", worked_hours: "140.0h
|
67
|
-
base.summary.should ==
|
66
|
+
base.stub(progress: "78%", worked_hours: "140.0h (-12.0h)", salary: "5320.0zł (-456.0zł)")
|
67
|
+
base.summary.should == %q{Current month
|
68
|
+
Weekdays: 78%
|
69
|
+
Worked hours: 140.0h (-12.0h)
|
70
|
+
Salary: 5320.0zł (-456.0zł)}
|
68
71
|
end
|
69
72
|
end
|
70
73
|
|
data/spec/basecamp_spec.rb
CHANGED
@@ -23,21 +23,26 @@ describe Beggar::Basecamp do
|
|
23
23
|
end
|
24
24
|
|
25
25
|
it 'returns user id' do
|
26
|
-
response = {
|
26
|
+
response = {'person' => { 'id' => 1 }}
|
27
27
|
basecamp.class.should_receive(:get).with('/me.xml').and_return(response)
|
28
28
|
basecamp.current_user.should == 1
|
29
29
|
end
|
30
30
|
|
31
31
|
it 'returns time report for current user' do
|
32
32
|
basecamp.stub(current_user: 1)
|
33
|
-
basecamp.class.should_receive(:get).with('/time_entries/report.xml
|
33
|
+
basecamp.class.should_receive(:get).with('/time_entries/report.xml', query: {subject_id: 1})
|
34
34
|
basecamp.time_report
|
35
35
|
end
|
36
36
|
|
37
37
|
it 'returns time report for current month' do
|
38
|
-
Date.stub(today: Date.new(2012, 02, 17))
|
39
38
|
basecamp.stub(current_user: 1)
|
40
|
-
basecamp.class.should_receive(:get).with('/time_entries/report.xml
|
39
|
+
basecamp.class.should_receive(:get).with('/time_entries/report.xml',
|
40
|
+
query: {
|
41
|
+
subject_id: 1,
|
42
|
+
from: Date.new(2012, 02, 01),
|
43
|
+
to: Date.new(2012, 02,17)
|
44
|
+
}
|
45
|
+
)
|
41
46
|
basecamp.current_month
|
42
47
|
end
|
43
48
|
|
@@ -58,12 +63,4 @@ describe Beggar::Basecamp do
|
|
58
63
|
basecamp.stub(worked_hours: 96.0)
|
59
64
|
basecamp.hours_ratio.should == 8.0
|
60
65
|
end
|
61
|
-
|
62
|
-
describe 'private methods' do
|
63
|
-
it 'parses options to path params' do
|
64
|
-
basecamp.send(:params, { name: 'bob'}).should == '?name=bob'
|
65
|
-
basecamp.send(:params, { name: 'bob', surname: 'example'}).should == '?name=bob&surname=example'
|
66
|
-
end
|
67
|
-
end
|
68
66
|
end
|
69
|
-
|
data/spec/cli_spec.rb
CHANGED
@@ -14,6 +14,10 @@ describe Beggar::CLI do
|
|
14
14
|
end
|
15
15
|
|
16
16
|
context 'when config file exists' do
|
17
|
+
before do
|
18
|
+
File.stub(:exists?).and_return(true)
|
19
|
+
end
|
20
|
+
|
17
21
|
it "loads it before running" do
|
18
22
|
YAML.should_receive(:load_file).with(config).and_return(double('configuration'))
|
19
23
|
end
|
@@ -29,8 +33,9 @@ describe Beggar::CLI do
|
|
29
33
|
}
|
30
34
|
|
31
35
|
before do
|
32
|
-
|
36
|
+
File.stub(:exists?).and_return(false)
|
33
37
|
end
|
38
|
+
|
34
39
|
it "creates config with default settings" do
|
35
40
|
output = double('output')
|
36
41
|
File.should_receive(:open).with(config, "w").and_yield(output)
|
@@ -44,5 +49,13 @@ describe Beggar::CLI do
|
|
44
49
|
$stdout.should_receive(:puts).with("Please fill it with proper data.")
|
45
50
|
end
|
46
51
|
end
|
52
|
+
|
53
|
+
context 'when config file is wrong' do
|
54
|
+
it 'displays notification' do
|
55
|
+
$stdout.unstub(:puts)
|
56
|
+
File.stub(:exists?) { raise URI::InvalidURIError }
|
57
|
+
$stdout.should_receive(:puts).with("Ensure that your config file is proper formatted!")
|
58
|
+
end
|
59
|
+
end
|
47
60
|
end
|
48
61
|
|
data/spec/current_month_spec.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
require 'beggar'
|
2
2
|
|
3
|
-
# FIXME add missing specs
|
4
3
|
describe Beggar::CurrentMonth do
|
5
4
|
let(:current_month) { Beggar::CurrentMonth }
|
6
5
|
|
@@ -8,6 +7,14 @@ describe Beggar::CurrentMonth do
|
|
8
7
|
Date.stub(today: Date.new(2012, 2, 17))
|
9
8
|
end
|
10
9
|
|
10
|
+
it 'returns weekdays' do
|
11
|
+
current_month.weekdays.should == 21
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'returns weekdays until today' do
|
15
|
+
current_month.weekdays_until_today.should == 13
|
16
|
+
end
|
17
|
+
|
11
18
|
it 'returns weekdays in hours' do
|
12
19
|
current_month.weekday_hours.should == 168.0
|
13
20
|
end
|
@@ -15,5 +22,34 @@ describe Beggar::CurrentMonth do
|
|
15
22
|
it 'returns weekdays in hours until today' do
|
16
23
|
current_month.weekday_hours_until_today.should == 104.0
|
17
24
|
end
|
25
|
+
|
26
|
+
it 'returns weekdays progression' do
|
27
|
+
current_month.weekdays_progression.should == 62
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'returns weekdays until date' do
|
31
|
+
date = Date.new(2012, 2, 23)
|
32
|
+
current_month.weekdays_until(date).should == 17
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'returns first day of month' do
|
36
|
+
current_month.first_day.should == Date.new(2012, 2, 1)
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'returns last day of month' do
|
40
|
+
current_month.last_day.should == Date.new(2012, 2, 29)
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'returns year' do
|
44
|
+
current_month.year.should == 2012
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'returns month' do
|
48
|
+
current_month.month.should == 2
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'returns today' do
|
52
|
+
current_month.today.should == Date.new(2012, 2, 17)
|
53
|
+
end
|
18
54
|
end
|
19
55
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: beggar
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-02-
|
12
|
+
date: 2012-02-22 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
16
|
-
requirement: &
|
16
|
+
requirement: &70364544025140 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 2.7.0
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70364544025140
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: httparty
|
27
|
-
requirement: &
|
27
|
+
requirement: &70364544023600 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,7 +32,7 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70364544023600
|
36
36
|
description: Tool for generating time reports from Basecamp. You can specify rate
|
37
37
|
for each project and get value of your month salary.
|
38
38
|
email:
|