tlog 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,277 @@
1
+
2
+ class Tlog::Storage::Disk
3
+
4
+ attr_accessor :git
5
+ attr_accessor :tlog_dir
6
+ attr_accessor :tlog_working
7
+ attr_accessor :tlog_index
8
+ attr_accessor :working_dir
9
+
10
+ # Class methods 'create_repo' 'all_logs', also 'create' command
11
+
12
+ def initialize(git_dir)
13
+ @git = Git.open(find_repo(git_dir))
14
+ # Format class?
15
+ proj_path = @git.dir.path.downcase.gsub(/[^a-z0-9]+/i, '-')
16
+
17
+ @tlog_dir = '~/.tlog'
18
+ @tlog_working = File.expand_path(File.join(@tlog_dir, proj_path, 'working'))
19
+ @tlog_index = File.expand_path(File.join(@tlog_dir, proj_path, 'index'))
20
+
21
+ bs = git.lib.branches_all.map{|b| b.first}
22
+
23
+ unless(bs.include?('tlog') && File.directory?(@tlog_working))
24
+ init_tlog_branch(bs.include?('tlog'))
25
+ end
26
+ end
27
+
28
+ def create_log(log)
29
+ log.path = log_path(log.name)
30
+ if log.create
31
+ git.add
32
+ git.commit("Created log #{log.name}")
33
+ true
34
+ else
35
+ false
36
+ end
37
+ end
38
+
39
+ def delete_log(log)
40
+ log.path = log_path(log.name)
41
+ if log.delete
42
+ delete_current(log.name)
43
+ git.remove(log.path, {:recursive => "-r"})
44
+ git.commit("Deleted log #{log.name}")
45
+ true
46
+ else
47
+ false
48
+ end
49
+ end
50
+
51
+ def require_log(log_name)
52
+ decode_log_path(Pathname.new(log_path(log_name)))
53
+ end
54
+
55
+ def start_log(log, entry_description)
56
+ entry_description = '(no description)' unless entry_description
57
+ if update_current(log.name, entry_description)
58
+ create_log(log) # Creates directory if it has not already been created
59
+ git.add
60
+ git.commit("Started log #{log.name}")
61
+ true
62
+ else
63
+ false
64
+ end
65
+ end
66
+
67
+ def stop_log(log)
68
+ if Dir.exists?(current_path)
69
+ current_hash = {
70
+ :name => current_log_name,
71
+ :start_time => current_start_time,
72
+ :description => current_entry_description,
73
+ :owner => cur_entry_owner
74
+ }
75
+ delete_current(current_hash[:name])
76
+ log.add_entry(current_hash)
77
+ git.add
78
+ git.commit("Stopped log #{log.name}")
79
+ true
80
+ else
81
+ false
82
+ end
83
+ end
84
+
85
+ def log_duration(log_name)
86
+ duration = 0
87
+ if current_log_name == log_name
88
+ duration += time_since_start
89
+ end
90
+ log_entries(log_name).each do |entry| # should just be able to do log.entries.each
91
+ duration += entry.length
92
+ end
93
+ duration
94
+ end
95
+
96
+ def find_repo(dir)
97
+ full = File.expand_path(dir)
98
+ ENV["GIT_WORKING_DIR"] || loop do
99
+ return full if File.directory?(File.join(full, ".git"))
100
+ raise "No Repo Found" if full == full=File.dirname(full)
101
+ end
102
+ end
103
+
104
+ def start_time_string
105
+ current_start_time
106
+ end
107
+
108
+ def time_since_start
109
+ if Dir.exists?(current_path)
110
+ difference = Time.now - Time.parse(current_start_time)
111
+ difference.to_i
112
+ else
113
+ nil
114
+ end
115
+ end
116
+
117
+ def cur_start_time
118
+ Time.parse(current_start_time) if current_start_path
119
+ end
120
+
121
+ def cur_entry_owner
122
+ git.config["user.email"].split('@').first rescue ''
123
+ end
124
+
125
+ def cur_entry_description
126
+ current_entry_description
127
+ end
128
+
129
+ def current_log_name
130
+ name_contents = File.read(current_name_path) if File.exists?(current_name_path)
131
+ name_contents.strip if name_contents
132
+ end
133
+
134
+ def get_current_start_time
135
+ current_start_time
136
+ end
137
+
138
+ def all_log_dirs
139
+ Pathname.new(logs_path).children.select { |c| c.directory? }
140
+ end
141
+
142
+ # Code from 'ticgit', temporarily switches to tlog branch
143
+ def in_branch(branch_exists = true)
144
+ unless File.directory?(@tlog_working)
145
+ FileUtils.mkdir_p(@tlog_working)
146
+ end
147
+
148
+ old_current = git.lib.branch_current
149
+ begin
150
+ git.lib.change_head_branch('tlog')
151
+ git.with_index(@tlog_index) do
152
+ git.with_working(@tlog_working) do |wd|
153
+ git.lib.checkout('tlog') if branch_exists
154
+ yield wd
155
+ end
156
+ end
157
+ ensure
158
+ git.lib.change_head_branch(old_current)
159
+ end
160
+ end
161
+
162
+ private
163
+
164
+ def decode_log_path(log_path)
165
+ if Dir.exists?(log_path)
166
+ log = Tlog::Entity::Log.new(log_path)
167
+ #log_storage.log_path = log_path # add this to the log class...i think task_store may not be neccessary
168
+ #lgolog.entries = log_storage.entries
169
+ end
170
+ return log
171
+ end
172
+
173
+ def init_tlog_branch(tlog_branch = false)
174
+ in_branch(tlog_branch) do
175
+ unless tlog_branch
176
+ git.add
177
+ git.commit('creating the tlog branch')
178
+ end
179
+ end
180
+ end
181
+
182
+ def update_current(log_name, entry_description)
183
+ unless Dir.exists?(current_path)
184
+ FileUtils.mkdir_p(current_path)
185
+ write_to_current(log_name, entry_description)
186
+ true
187
+ else
188
+ false
189
+ end
190
+ end
191
+
192
+ def delete_current(log_name) # Change this method name or add one
193
+ if Dir.exists?(current_path)
194
+ if current_log_name == log_name
195
+ FileUtils.rm_rf(current_path)
196
+ git.remove(current_path, {:recursive => 'r'})
197
+ end
198
+ else
199
+ false
200
+ end
201
+ end
202
+
203
+ def write_to_current(log_name, entry_description)
204
+ # Create a current object, with a "read" method
205
+ File.open(current_name_path, 'w'){ |f| f.write(log_name)}
206
+ File.open(current_description_path, 'w'){ |f| f.write(entry_description)} if entry_description
207
+ File.open(current_start_path, 'w'){ |f| f.write(Time.now.to_s)}
208
+ end
209
+
210
+ def current_exists?
211
+ Dir.exists?(current_path)
212
+ end
213
+
214
+ def stop_current
215
+ if Dir.exists?(current_path)
216
+ create_log_entry(current_log_name, current_start_time, current_entry_description) # CURRENT Dictionary?!
217
+ true
218
+ else
219
+ false
220
+ end
221
+ end
222
+
223
+ #Eventually want to take this out and just create the entry on start
224
+ def current_start_time
225
+ read_file(current_start_path)
226
+ end
227
+
228
+ def current_entry_description
229
+ read_file(current_description_path)
230
+ end
231
+
232
+ def current_log_length
233
+ read_file(current_length_path)
234
+ end
235
+
236
+ def read_file(path)
237
+ if File.exists?(path)
238
+ contents = File.read(path)
239
+ contents.strip
240
+ else
241
+ nil
242
+ end
243
+ end
244
+
245
+ def log_path(log_name)
246
+ File.join(logs_path, log_name)
247
+ end
248
+
249
+ def goal_path(log_name)
250
+ File.join(log_path(log_name), 'GOAL')
251
+ end
252
+
253
+ def logs_path
254
+ File.expand_path(File.join('tasks'))
255
+ end
256
+
257
+ def current_path
258
+ File.expand_path(File.join('current'))
259
+ end
260
+
261
+ def current_name_path
262
+ File.join(current_path, 'NAME')
263
+ end
264
+
265
+ def current_start_path
266
+ File.join(current_path, 'START')
267
+ end
268
+
269
+ def current_length_path
270
+ File.join(current_path, 'LENGTH')
271
+ end
272
+
273
+ def current_description_path
274
+ File.join(current_path, 'DESCRIPTION')
275
+ end
276
+
277
+ end
@@ -0,0 +1,3 @@
1
+ module Tlog
2
+ VERSION = "0.0.0"
3
+ end
data/lib/tlog.rb ADDED
@@ -0,0 +1,47 @@
1
+
2
+ module Tlog
3
+ Version = "0.0.0"
4
+
5
+ module Storage
6
+ end
7
+
8
+ module Error
9
+ end
10
+
11
+ module Format
12
+ end
13
+
14
+ module Entity
15
+ end
16
+ end
17
+
18
+ require "chronic_duration"
19
+ require 'fileutils'
20
+ require 'git'
21
+ require 'securerandom'
22
+ require 'pathname'
23
+ require 'time'
24
+ require 'chronic'
25
+
26
+ require 'tlog/command'
27
+ require 'tlog/command/init'
28
+ require 'tlog/command/start'
29
+ require 'tlog/command/stop'
30
+ require 'tlog/command/active'
31
+ require 'tlog/command/delete'
32
+ require 'tlog/command/display'
33
+ require 'tlog/command/create'
34
+
35
+ require 'tlog/storage/disk'
36
+
37
+ require 'tlog/format/seconds'
38
+ require 'tlog/format/date_time'
39
+
40
+ require 'tlog/entity/log'
41
+ require 'tlog/entity/active_log'
42
+ require 'tlog/entity/entry'
43
+
44
+ require 'tlog/error'
45
+
46
+
47
+
data/tlog.gemspec ADDED
@@ -0,0 +1,28 @@
1
+
2
+ Gem::Specification.new do |spec|
3
+
4
+ spec.name = "tlog"
5
+ spec.version = "0.0.1"
6
+ spec.date = "2013-05-26"
7
+
8
+ spec.required_ruby_version = ">=1.9.3"
9
+
10
+ spec.summary = "CLI Project Time Logger"
11
+ spec.description = "tlog is a git-based command-line time logger that keeps track the time you've spend on different parts of a project"
12
+ spec.license = "GPL-2"
13
+
14
+ spec.add_dependency("commander", "~> 4.0")
15
+ spec.add_dependency("chronic_duration", "~> 0.10.2")
16
+ spec.add_dependency("fileutils", "~> 0.7")
17
+ spec.add_dependency("git", "~> 1.2.5")
18
+ spec.add_dependency("chronic", "~> 0.9.1")
19
+
20
+ spec.authors = ["Chris Wendel"]
21
+ spec.email = "chriwend@umich.edu"
22
+
23
+ spec.executables = "tlog"
24
+
25
+ spec.files = `git ls-files`.split("\n")
26
+ spec.require_path = "lib"
27
+
28
+ end
metadata ADDED
@@ -0,0 +1,142 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: tlog
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Chris Wendel
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-05-26 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: commander
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '4.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '4.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: chronic_duration
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: 0.10.2
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: 0.10.2
41
+ - !ruby/object:Gem::Dependency
42
+ name: fileutils
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: '0.7'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '0.7'
55
+ - !ruby/object:Gem::Dependency
56
+ name: git
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 1.2.5
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: 1.2.5
69
+ - !ruby/object:Gem::Dependency
70
+ name: chronic
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ~>
74
+ - !ruby/object:Gem::Version
75
+ version: 0.9.1
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ~>
81
+ - !ruby/object:Gem::Version
82
+ version: 0.9.1
83
+ description: tlog is a git-based command-line time logger that keeps track the time
84
+ you've spend on different parts of a project
85
+ email: chriwend@umich.edu
86
+ executables:
87
+ - tlog
88
+ extensions: []
89
+ extra_rdoc_files: []
90
+ files:
91
+ - .gitignore
92
+ - LICENSE
93
+ - README.md
94
+ - TODO
95
+ - bin/tlog
96
+ - lib/tlog.rb
97
+ - lib/tlog/application.rb
98
+ - lib/tlog/command.rb
99
+ - lib/tlog/command/active.rb
100
+ - lib/tlog/command/create.rb
101
+ - lib/tlog/command/delete.rb
102
+ - lib/tlog/command/display.rb
103
+ - lib/tlog/command/init.rb
104
+ - lib/tlog/command/start.rb
105
+ - lib/tlog/command/stop.rb
106
+ - lib/tlog/command/test.rb
107
+ - lib/tlog/entity/active_log.rb
108
+ - lib/tlog/entity/entry.rb
109
+ - lib/tlog/entity/log.rb
110
+ - lib/tlog/error.rb
111
+ - lib/tlog/format/date_time.rb
112
+ - lib/tlog/format/seconds.rb
113
+ - lib/tlog/input.rb
114
+ - lib/tlog/output.rb
115
+ - lib/tlog/storage/disk.rb
116
+ - lib/tlog/version.rb
117
+ - tlog.gemspec
118
+ homepage:
119
+ licenses:
120
+ - GPL-2
121
+ metadata: {}
122
+ post_install_message:
123
+ rdoc_options: []
124
+ require_paths:
125
+ - lib
126
+ required_ruby_version: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ! '>='
129
+ - !ruby/object:Gem::Version
130
+ version: 1.9.3
131
+ required_rubygems_version: !ruby/object:Gem::Requirement
132
+ requirements:
133
+ - - ! '>='
134
+ - !ruby/object:Gem::Version
135
+ version: '0'
136
+ requirements: []
137
+ rubyforge_project:
138
+ rubygems_version: 2.0.3
139
+ signing_key:
140
+ specification_version: 4
141
+ summary: CLI Project Time Logger
142
+ test_files: []