rtt 0.0.0.47 → 0.0.0.48
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +4 -7
- data/Gemfile.lock +28 -35
- data/Manifest +12 -12
- data/Rakefile +3 -3
- data/bin/rtt +2 -2
- data/db/config.yml +10 -0
- data/db/schema.rb +43 -0
- data/db/test.sqlite3 +0 -0
- data/lib/{rtt/array_extensions.rb → extensions/array.rb} +0 -0
- data/lib/extensions/date.rb +15 -0
- data/lib/{rtt/hash_extensions.rb → extensions/hash.rb} +0 -0
- data/lib/{rtt/system_extensions.rb → extensions/kernel.rb} +0 -0
- data/lib/models/client.rb +34 -0
- data/lib/models/project.rb +44 -0
- data/lib/models/task.rb +131 -0
- data/lib/models/user.rb +48 -0
- data/lib/rtt.rb +13 -12
- data/lib/rtt/cmd_line_parser.rb +10 -2
- data/lib/rtt/interactive_configurator.rb +11 -7
- data/lib/rtt/query_builder.rb +9 -4
- data/lib/rtt/report_generator.rb +3 -4
- data/lib/rtt/storage.rb +18 -11
- data/rtt.gemspec +17 -33
- data/spec/ar_spec_helper.rb +11 -0
- data/spec/lib/{rtt → models}/task_spec.rb +9 -10
- data/spec/lib/rtt_spec.rb +20 -22
- data/tasks/rtt.rake +1 -1
- metadata +318 -424
- data/db/rtt.sqlite3 +0 -0
- data/lib/rtt/client.rb +0 -42
- data/lib/rtt/project.rb +0 -54
- data/lib/rtt/task.rb +0 -144
- data/lib/rtt/user.rb +0 -65
- data/log/rtt.sqlite3 +0 -0
- data/spec/datamapper_spec_helper.rb +0 -3
data/db/rtt.sqlite3
DELETED
Binary file
|
data/lib/rtt/client.rb
DELETED
@@ -1,42 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
module Rtt
|
3
|
-
class Client
|
4
|
-
include DataMapper::Resource
|
5
|
-
|
6
|
-
DEFAULT_NAME = 'default'
|
7
|
-
DEFAULT_DESCRIPTION = 'Default Client'
|
8
|
-
|
9
|
-
property :id, Serial
|
10
|
-
property :name, String, :required => true, :unique => true, :default => DEFAULT_NAME
|
11
|
-
property :description, String, :default => DEFAULT_DESCRIPTION
|
12
|
-
property :active, Boolean, :default => false
|
13
|
-
has n, :projects #, :through => Resource
|
14
|
-
|
15
|
-
before :create do |client|
|
16
|
-
client.active = true if Client.all.length == 0
|
17
|
-
true
|
18
|
-
end
|
19
|
-
|
20
|
-
def self.default
|
21
|
-
first_or_create :active => true
|
22
|
-
end
|
23
|
-
|
24
|
-
def self.current_active?
|
25
|
-
first :active => true
|
26
|
-
end
|
27
|
-
|
28
|
-
def activate
|
29
|
-
deactivate_all
|
30
|
-
self.active = true
|
31
|
-
self.save
|
32
|
-
self
|
33
|
-
end
|
34
|
-
|
35
|
-
def deactivate_all
|
36
|
-
Client.all.each do |client|
|
37
|
-
client.active = false
|
38
|
-
client.save
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
data/lib/rtt/project.rb
DELETED
@@ -1,54 +0,0 @@
|
|
1
|
-
#!/usr/bin/ruby -w
|
2
|
-
module Rtt
|
3
|
-
class Project
|
4
|
-
include DataMapper::Resource
|
5
|
-
|
6
|
-
DEFAULT_NAME = 'default'
|
7
|
-
DEFAULT_DESCRIPTION = 'Default Project'
|
8
|
-
|
9
|
-
property :id, Serial
|
10
|
-
property :name, String, :required => true, :unique => true, :default => DEFAULT_NAME
|
11
|
-
property :description, String, :default => DEFAULT_DESCRIPTION
|
12
|
-
property :active, Boolean, :default => false
|
13
|
-
property :rate, Float
|
14
|
-
|
15
|
-
has n, :tasks #, :through => Resource
|
16
|
-
has n, :users, :through => :tasks
|
17
|
-
belongs_to :client
|
18
|
-
|
19
|
-
before :valid?, :set_default_client
|
20
|
-
|
21
|
-
before :create do |project|
|
22
|
-
project.active = true if Project.all.length == 0
|
23
|
-
true
|
24
|
-
end
|
25
|
-
|
26
|
-
def self.default
|
27
|
-
first_or_create :active => true
|
28
|
-
end
|
29
|
-
|
30
|
-
def self.current_active?
|
31
|
-
first :active => true
|
32
|
-
end
|
33
|
-
|
34
|
-
def activate
|
35
|
-
deactivate_all
|
36
|
-
self.active = true
|
37
|
-
self.save
|
38
|
-
self
|
39
|
-
end
|
40
|
-
|
41
|
-
def deactivate_all
|
42
|
-
Project.all.each do |project|
|
43
|
-
if project.id != self.id
|
44
|
-
project.active = false
|
45
|
-
project.save
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
def set_default_client
|
51
|
-
self.client = Client.default if self.client.nil?
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
data/lib/rtt/task.rb
DELETED
@@ -1,144 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
module Rtt
|
3
|
-
class Task
|
4
|
-
include DataMapper::Resource
|
5
|
-
|
6
|
-
DEFAULT_NAME = 'Default task'
|
7
|
-
|
8
|
-
property :id, Serial
|
9
|
-
property :name, Text, :required => true, :default => DEFAULT_NAME
|
10
|
-
property :date, Date
|
11
|
-
property :start_at, DateTime
|
12
|
-
property :end_at, DateTime
|
13
|
-
property :active, Boolean, :default => false
|
14
|
-
property :accumulated_spent_time, Float, :default => 0
|
15
|
-
property :rate, Float, :default => 0
|
16
|
-
|
17
|
-
belongs_to :project
|
18
|
-
has 1, :client, :through => :project
|
19
|
-
belongs_to :user
|
20
|
-
|
21
|
-
before :valid?, :set_default_project
|
22
|
-
before :valid?, :set_default_user
|
23
|
-
|
24
|
-
def self.task(task_name)
|
25
|
-
base_attributes = { :name => task_name, :user => Rtt.current_user, :date => Date.today, :rate => (Rtt.current_project.rate if Rtt.current_project.present?) }
|
26
|
-
if task_name.nil?
|
27
|
-
existing_task = Task.first :active => true
|
28
|
-
if existing_task
|
29
|
-
existing_task
|
30
|
-
else
|
31
|
-
base_attributes.merge!(:name => DEFAULT_NAME) if task_name.blank?
|
32
|
-
Task.create(base_attributes)
|
33
|
-
end
|
34
|
-
elsif (existing_task = Task.first base_attributes.merge({:start_at.gte => Date.today.beginning_of_day})).present?
|
35
|
-
existing_task
|
36
|
-
else
|
37
|
-
Task.create(base_attributes)
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
def start
|
42
|
-
self.start_at = DateTime.now
|
43
|
-
self.active = true
|
44
|
-
save
|
45
|
-
self
|
46
|
-
end
|
47
|
-
|
48
|
-
def add_current_spent_time_to_accumulated_spent_time
|
49
|
-
self.accumulated_spent_time = self.accumulated_spent_time + self.time_difference_since_start_at
|
50
|
-
end
|
51
|
-
|
52
|
-
def clone_task(task)
|
53
|
-
task = Task.new
|
54
|
-
task.attributes = self.attributes
|
55
|
-
task.id = nil
|
56
|
-
task
|
57
|
-
end
|
58
|
-
|
59
|
-
def duration
|
60
|
-
return '-' if end_at.blank?
|
61
|
-
convert_to_hour_and_minutes(accumulated_spent_time)
|
62
|
-
end
|
63
|
-
|
64
|
-
def duration=(d)
|
65
|
-
return unless !!/^(\d{1,2})[hH]{1,2}(\d{1,2})[mM]{1,2}$/.match(d)
|
66
|
-
self.start_at = DateTime.parse('00:00:01', self.date)
|
67
|
-
self.end_at = DateTime.parse('00:00:01', self.date).advance(:hours => $1.to_i, :minutes => $2.to_i, :seconds => 1)
|
68
|
-
self.accumulated_spent_time = self.time_difference_since_start_at
|
69
|
-
end
|
70
|
-
|
71
|
-
def set_default_project
|
72
|
-
self.project = Project.default if self.project.nil?
|
73
|
-
end
|
74
|
-
|
75
|
-
def set_default_user
|
76
|
-
self.user = User.default if self.user.nil?
|
77
|
-
end
|
78
|
-
|
79
|
-
def stop
|
80
|
-
split_task if span_multiple_days?
|
81
|
-
finish
|
82
|
-
self
|
83
|
-
end
|
84
|
-
|
85
|
-
def pause
|
86
|
-
split_task if span_multiple_days?
|
87
|
-
finish(DateTime.now, true)
|
88
|
-
self
|
89
|
-
end
|
90
|
-
|
91
|
-
def time_difference_since_start_at
|
92
|
-
end_date_or_now = self.end_at ? self.end_at : DateTime.now
|
93
|
-
end_date_or_now - self.start_at
|
94
|
-
end
|
95
|
-
|
96
|
-
private
|
97
|
-
|
98
|
-
def convert_to_hour_and_minutes(dif)
|
99
|
-
hours, mins = time_diff_in_hours_and_minutes(dif)
|
100
|
-
"#{hours}h#{mins}m"
|
101
|
-
end
|
102
|
-
|
103
|
-
def finish(end_at = DateTime.now, activation = false)
|
104
|
-
self.end_at = end_at
|
105
|
-
self.date = end_at.to_date
|
106
|
-
self.add_current_spent_time_to_accumulated_spent_time
|
107
|
-
self.active = activation
|
108
|
-
self.save
|
109
|
-
end
|
110
|
-
|
111
|
-
def save_in_between_days_split(date)
|
112
|
-
task = clone_task(self)
|
113
|
-
task.start_at = date.beginning_of_day
|
114
|
-
end_at = date.end_of_day.to_datetime
|
115
|
-
task.send(:finish, end_at)
|
116
|
-
task.save
|
117
|
-
end
|
118
|
-
|
119
|
-
def save_last_task_split(date)
|
120
|
-
task = clone_task(self)
|
121
|
-
end_at = date.end_of_day.to_datetime
|
122
|
-
task.send(:finish, end_at)
|
123
|
-
task.save
|
124
|
-
end
|
125
|
-
|
126
|
-
def span_multiple_days?
|
127
|
-
self.start_at.day != Date.today.day
|
128
|
-
end
|
129
|
-
|
130
|
-
def split_task
|
131
|
-
date = Date.today - 1
|
132
|
-
while (date > self.start_at)
|
133
|
-
save_in_between_days_split(date)
|
134
|
-
date -= 1
|
135
|
-
end
|
136
|
-
save_last_task_split(date)
|
137
|
-
self.start_at = Date.today.beginning_of_day.to_datetime
|
138
|
-
end
|
139
|
-
|
140
|
-
def time_diff_in_hours_and_minutes(dif)
|
141
|
-
Date::day_fraction_to_time(dif)
|
142
|
-
end
|
143
|
-
end
|
144
|
-
end
|
data/lib/rtt/user.rb
DELETED
@@ -1,65 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
module Rtt
|
3
|
-
class User
|
4
|
-
include DataMapper::Resource
|
5
|
-
|
6
|
-
BLANK_FIELD = ''
|
7
|
-
DEFAULT_NICK = 'Default user'
|
8
|
-
|
9
|
-
property :id, Serial
|
10
|
-
property :nickname, String, :required => true, :unique => true, :default => DEFAULT_NICK
|
11
|
-
property :first_name, String, :default => BLANK_FIELD
|
12
|
-
property :last_name, String, :default => BLANK_FIELD
|
13
|
-
property :company, String, :default => BLANK_FIELD
|
14
|
-
property :address, String, :default => BLANK_FIELD
|
15
|
-
property :city, String, :default => BLANK_FIELD
|
16
|
-
property :country, String, :default => BLANK_FIELD
|
17
|
-
property :email, String, :default => BLANK_FIELD
|
18
|
-
property :phone, String, :default => BLANK_FIELD
|
19
|
-
property :zip, String, :default => BLANK_FIELD
|
20
|
-
property :site, String, :default => BLANK_FIELD
|
21
|
-
property :active, Boolean, :default => false
|
22
|
-
|
23
|
-
has n, :tasks #, :through => Resource
|
24
|
-
has n, :projects, :through => :tasks
|
25
|
-
|
26
|
-
def self.default
|
27
|
-
first_or_create :active => true
|
28
|
-
end
|
29
|
-
|
30
|
-
def self.find_or_create_active
|
31
|
-
last_user = User.last
|
32
|
-
if last_user.present?
|
33
|
-
last_user.active = true
|
34
|
-
last_user.save
|
35
|
-
last_user
|
36
|
-
else
|
37
|
-
self.default
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
def activate
|
42
|
-
self.active = true
|
43
|
-
self.save
|
44
|
-
self
|
45
|
-
end
|
46
|
-
|
47
|
-
def deactivate
|
48
|
-
self.active = false
|
49
|
-
self.save
|
50
|
-
self
|
51
|
-
end
|
52
|
-
|
53
|
-
def full_name
|
54
|
-
"#{first_name.present? ? first_name : ''} #{last_name.present? ? last_name : ''}".strip
|
55
|
-
end
|
56
|
-
|
57
|
-
def full_name_and_nickname
|
58
|
-
"#{full_name.present? ? full_name : ''} #{full_name.present? ? "(#{nickname})" : nickname }".strip
|
59
|
-
end
|
60
|
-
|
61
|
-
def location
|
62
|
-
"#{self.city}#{self.city.present? && self.country.present? ? ', ' : ''}#{self.country}".strip
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
data/log/rtt.sqlite3
DELETED
File without changes
|