rtt 0.0.0.47 → 0.0.0.48
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 +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
|