logtime 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. checksums.yaml +7 -0
  2. checksums.yaml.gz.sig +0 -0
  3. data/.gitignore +5 -0
  4. data/Gemfile +6 -0
  5. data/Gemfile.lock +40 -0
  6. data/LICENSE.md +21 -0
  7. data/VERSION +1 -0
  8. data/bin/logtime +3 -0
  9. data/certs/paperback.pem +21 -0
  10. data/config/application.rb +6 -0
  11. data/config/database.rb +4 -0
  12. data/config/initialisation.rb +8 -0
  13. data/config/schema.rb +41 -0
  14. data/lib/app/commands/add.rb +41 -0
  15. data/lib/app/commands/list.rb +56 -0
  16. data/lib/app/commands/start.rb +28 -0
  17. data/lib/app/commands/stop.rb +29 -0
  18. data/lib/app/helpers/estimate.rb +13 -0
  19. data/lib/app/helpers/statistics.rb +45 -0
  20. data/lib/app/helpers/time_to_words.rb +33 -0
  21. data/lib/app/logtime.rb +67 -0
  22. data/lib/app/models/log.rb +42 -0
  23. data/lib/app/models/series.rb +35 -0
  24. data/lib/app/models/tag.rb +9 -0
  25. data/lib/app/subcommands/keyword.rb +214 -0
  26. data/lib/app/subcommands/series.rb +58 -0
  27. data/lib/app/subcommands/tags.rb +79 -0
  28. data/lib/commands/add.rb +41 -0
  29. data/lib/commands/list.rb +67 -0
  30. data/lib/commands/start.rb +28 -0
  31. data/lib/commands/stop.rb +29 -0
  32. data/lib/commands/version.rb +12 -0
  33. data/lib/helpers/estimate.rb +13 -0
  34. data/lib/helpers/statistics.rb +48 -0
  35. data/lib/helpers/time_difference.rb +20 -0
  36. data/lib/helpers/time_display.rb +5 -0
  37. data/lib/helpers/time_to_words.rb +33 -0
  38. data/lib/logtime.rb +68 -0
  39. data/lib/models/log.rb +47 -0
  40. data/lib/models/series.rb +35 -0
  41. data/lib/models/tag.rb +9 -0
  42. data/lib/subcommands/keyword.rb +214 -0
  43. data/lib/subcommands/series.rb +59 -0
  44. data/lib/subcommands/tags.rb +37 -0
  45. data/logtime.gemspec +23 -0
  46. data.tar.gz.sig +2 -0
  47. metadata +167 -0
  48. metadata.gz.sig +0 -0
data/lib/logtime.rb ADDED
@@ -0,0 +1,68 @@
1
+ require_relative '../config/initialisation'
2
+
3
+ # require models
4
+ models = File.expand_path(File.join('..', 'models'), __FILE__)
5
+ if Dir.exists?(models)
6
+ Dir.entries(models).each do |file|
7
+ require File.join(models, file) if file =~ /^(.*)\.rb$/
8
+ end
9
+ end
10
+
11
+ # require helpers
12
+ helpers = File.expand_path(File.join('..', 'helpers'), __FILE__)
13
+ if Dir.exists?(helpers)
14
+ Dir.entries(helpers).each do |file|
15
+ next unless file =~ /^(.*)\.rb$/
16
+
17
+ require File.join(helpers, file)
18
+
19
+ # helper name
20
+ load = file.split '_'
21
+ load = load.each { |h| h.capitalize! }
22
+ load = load.join
23
+ load = load[0..-4] # '.rb'
24
+ load = load + "Helper"
25
+
26
+ # load helper
27
+ begin
28
+ send(:include, load.constantize)
29
+
30
+ rescue
31
+ ActiveRecord::Base.logger.warn "Failed to load " + load
32
+ end
33
+ end
34
+ end
35
+
36
+ # require commands
37
+ commands = File.expand_path(File.join('..', 'commands'), __FILE__)
38
+ if Dir.exists?(commands)
39
+ Dir.entries(commands).each do |file|
40
+ require_relative File.join(commands, file) if file =~ /^(.*)\.rb$/
41
+ end
42
+ end
43
+
44
+ # require subcommands
45
+ subcommands = File.expand_path(File.join('..', 'subcommands'), __FILE__)
46
+ if Dir.exists?(subcommands)
47
+ Dir.entries(subcommands).each do |file|
48
+ require_relative File.join(subcommands, file) if file =~ /^(.*)\.rb$/
49
+ end
50
+ end
51
+
52
+ # Application
53
+ class LogTime < Thor
54
+
55
+ # commands
56
+ include ::Commands::List
57
+ include ::Commands::Add
58
+ include ::Commands::Start
59
+ include ::Commands::Stop
60
+ include ::Commands::Version
61
+
62
+ # subcommands
63
+ desc "series", ""
64
+ subcommand "series", SubCommands::Series
65
+
66
+ desc "tags", ""
67
+ subcommand "tags", SubCommands::Tags
68
+ end
data/lib/models/log.rb ADDED
@@ -0,0 +1,47 @@
1
+ #
2
+ # Logs
3
+ #
4
+
5
+ class Log < ActiveRecord::Base
6
+ scope :active, -> { where(active: true) }
7
+ scope :inactive, -> { where(active: false) }
8
+ scope :tagged, ->(tag) { where(tags: { tag: tag }) }
9
+ scope :estimated, -> { where("estimation is not null") }
10
+
11
+ validates :name, uniqueness: true
12
+
13
+ has_many :series
14
+ has_and_belongs_to_many :tags
15
+
16
+ def tag(tags)
17
+ tags.split(',').each do |t|
18
+ self.tags << Tag.where(tag: t).first_or_create
19
+ end
20
+
21
+ return self
22
+ end
23
+
24
+ def tagged(tag)
25
+
26
+ end
27
+
28
+ def activate
29
+ self.active = true
30
+ self.save
31
+ end
32
+
33
+ def deactivate
34
+ self.active = false
35
+ self.save
36
+ end
37
+
38
+ def total
39
+ difference = 0
40
+ self.series.each do |s|
41
+ ending = s.end || Time.now
42
+ # next unless s.start and s.end
43
+ difference = difference + s.start.difference(ending)
44
+ end
45
+ difference
46
+ end
47
+ end
@@ -0,0 +1,35 @@
1
+ #
2
+ # Series
3
+ #
4
+
5
+ class Series < ActiveRecord::Base
6
+ belongs_to :log
7
+
8
+ def self.begin(options = {})
9
+ attributes = {
10
+ start: Time.now
11
+ }.merge! options
12
+
13
+ create(attributes)
14
+ end
15
+
16
+ def begin
17
+ self.start = Time.now
18
+ self.save
19
+ end
20
+
21
+ def stop
22
+ self.end = Time.now
23
+ self.save
24
+ end
25
+
26
+ def finished?
27
+ !self.end.blank?
28
+ end
29
+
30
+ def total
31
+ return false if self.end.blank? or self.start.blank?
32
+
33
+ self.start.difference(self.end)
34
+ end
35
+ end
data/lib/models/tag.rb ADDED
@@ -0,0 +1,9 @@
1
+ #
2
+ # Tags
3
+ #
4
+
5
+ class Tag < ActiveRecord::Base
6
+ validates :tag, uniqueness: true
7
+ validates_format_of :tag, :with => /[-a-z]+/
8
+ has_and_belongs_to_many :logs
9
+ end
@@ -0,0 +1,214 @@
1
+ class Keywords < Thor
2
+ # desc "add <account> <keyword>", "Add a new <keyword> to an <account>"
3
+ # option :interactive, :type => :boolean, :alias => :i
4
+ # def add(account, keyword=nil)
5
+ # account = Account.find_by(:name => account)
6
+
7
+ # if account.blank?
8
+ # say 'no account found', :red
9
+ # else
10
+ # if options[:interactive]
11
+ # say "To stop adding keywords type exit", :cyan
12
+ # while true
13
+ # keyword = ask ':'
14
+ # break if keyword == 'exit'
15
+ # if Keyword.new(:keyword => keyword, :account_id => account.id).save
16
+ # say 'added', :green
17
+ # else
18
+ # say 'failed', :red
19
+ # end
20
+ # end
21
+ # else
22
+ # keyword.split(',').each do |k|
23
+ # k = Keyword.new(:keyword => k, :account_id => account.id)
24
+
25
+ # if k.save
26
+ # say k.keyword + ' keyword added', :green
27
+ # else
28
+ # say 'could not add keyword!', :red
29
+ # error k.errors.first[0].to_s + ' ' + k.errors.first[1]
30
+ # end
31
+ # end
32
+ # end
33
+ # end
34
+ # end
35
+
36
+ # desc "delete <account> <keyword>", "Removes <keyword> on an <account>"
37
+ # def delete(account, keyword)
38
+ # account = Account.search(account)
39
+
40
+ # if account.blank?
41
+ # say 'no account found', :red
42
+ # else
43
+ # keyword.split(',').each do |k|
44
+ # k = Keyword.search(k)
45
+
46
+ # if k.blank?
47
+ # say 'could not find keyword!', :red
48
+ # else
49
+ # say k.keyword + ' removed', :green if k.destroy
50
+ # end
51
+ # end
52
+ # end
53
+ # end
54
+
55
+ # desc "list", "Lists keywords belonging to an <account>"
56
+ # option :account
57
+ # def list(account=nil)
58
+ # if account.nil?
59
+ # keywords = Keyword.all
60
+
61
+ # table = [['# Keyword', '# Position', '']] # header
62
+ # keywords.each do |k|
63
+ # stat = k.keyword_statistics.last unless k.keyword_statistics.empty?
64
+ # table << [k.keyword, stat.position || '', stat.created_at.pretty ] # row
65
+ # end
66
+
67
+ # say ''
68
+ # print_table table
69
+ # say ''
70
+ # else
71
+ # account = Account.search(account)
72
+ # if account.blank?
73
+ # say 'no account found', :red
74
+ # elsif account.keywords.empty?
75
+ # say 'no keywords exist for that account yet', :red
76
+ # else
77
+ # table = [['# Keyword', '# Position', '']] # header
78
+ # account.keywords.each do |k|
79
+ # stat = k.keyword_statistics.last unless k.keyword_statistics.empty?
80
+ # table << [k.keyword, stat.position || '', stat.created_at.pretty] # row
81
+ # end
82
+
83
+ # say ''
84
+ # print_table table
85
+ # say ''
86
+ # end
87
+ # end
88
+ # end
89
+
90
+ # desc "stats", "Compare keywords over time"
91
+ # option :search, :default => 'year', :banner => 'year,month,week,day'
92
+ # option :length, :type => :numeric, :default => 1
93
+ # option :engine, :default => :google
94
+ # def stats(account)
95
+ # account = Account.search(account)
96
+
97
+ # if account.blank?
98
+ # say 'no account found', :red
99
+ # elsif account.keywords.empty?
100
+ # say 'no keywords exist for that account yet', :red
101
+ # else
102
+
103
+ # table = [['# Keyword', 'n', 'High', 'Low', 'Current', 'Delta']] # header
104
+ # searched = 0;
105
+ # account.keywords.each do |k|
106
+ # stats = KeywordStatistic.send options[:search], k.id, options[:length], options[:engine]
107
+ # stats.order(:position)
108
+
109
+ # if !stats.empty?
110
+ # delta = stats.last.position - stats.first.position
111
+ # delta = '' if delta == 0
112
+ # table << [k.keyword, stats.size, stats.last.position, stats.first.position, stats.last.position, delta] # row
113
+ # searched = searched + stats.size
114
+ # end
115
+ # end
116
+
117
+ # if searched == 0
118
+ # say 'these keywords have not been indexed yet', :red
119
+ # else
120
+ # say ''
121
+ # say account.name + ' has ' + searched.to_s + ' recorded positions for ' + account.keywords.size.to_s + ' keywords', :green
122
+ # say ''
123
+ # print_table table
124
+ # say ''
125
+ # end
126
+ # end
127
+ # end
128
+
129
+ # #desc "import", "imports csv file"
130
+ # #options :file
131
+ # #def import(file)
132
+
133
+ # #end
134
+
135
+ # desc "index", "gets keyword position and saves it for later use"
136
+ # def index(account)
137
+ # account = Account.search(account)
138
+ # if account.blank?
139
+ # say 'no account found', :red
140
+ # else
141
+ # table = [['# Keyword', '# Google', '# GoogleUS']] # header
142
+ # account.keywords.each do |k|
143
+ # # Google
144
+ # google = ::Ranking.new(:keyword => k.keyword, :url => account.domain, :limit =>100).from_googleAU
145
+ # if !google.blank?
146
+ # KeywordStatistic.new(:keyword_id => k.id, :engine => :google, :position => google).save
147
+ # say '.', :green, false
148
+ # else
149
+ # say '.', :red, false
150
+ # end
151
+
152
+ # # GoogleUS
153
+ # googleUS = ::Ranking.new(:keyword => k.keyword, :url => account.domain, :limit =>100).from_googleUS
154
+ # if !googleUS.blank?
155
+ # KeywordStatistic.new(:keyword_id => k.id, :engine => :googleUS, :position => googleUS).save
156
+ # say '.', :green, false
157
+ # else
158
+ # say '.', :red, false
159
+ # end
160
+
161
+ # # Bing
162
+ # # bing = ::Ranking.new(:keyword => k.keyword, :url => account.domain, :limit =>100).from_bingAU
163
+ # # if !bing.blank?
164
+ # # KeywordStatistic.new(:keyword_id => k.id, :engine => :bing, :position => bing).save
165
+ # # say '.', :green, false
166
+ # # else
167
+ # # say '.', :red, false
168
+ # # end
169
+
170
+
171
+ # # Yahoo
172
+ # # yahoo = ::Ranking.new(:keyword => k.keyword, :url => account.domain, :limit =>100).from_yahooAU
173
+ # # if !yahoo.blank?
174
+ # # KeywordStatistic.new(:keyword_id => k.id, :engine => :yahoo, :position => yahoo).save
175
+ # # say '.', :green, false
176
+ # # else
177
+ # # say '.', :red, false
178
+ # # end
179
+
180
+ # table << [k.keyword, google, googleUS]
181
+ # end
182
+
183
+ # say ''
184
+ # print_table table
185
+ # say ''
186
+ # end
187
+ # end
188
+
189
+ # desc "export", "export keywords with positions"
190
+ # option :file
191
+ # def export(account)
192
+ # account = Account.search(account)
193
+ # if account.blank?
194
+ # say 'no account found', :red
195
+ # else
196
+ # table = [['# Date', '# Keyword', '# Position']] # header
197
+
198
+ # options[:file] = 'export.csv' unless options.includes? :file
199
+ # CSV.open(options[:file], 'w') do |csv|
200
+ # account.keywords.each do |keyword|
201
+ # keyword.keyword_statistics.each do |stat|
202
+ # row = [stat.created_at, keyword.keyword, stat.position]
203
+ # table << row
204
+ # csv << row
205
+ # end
206
+ # end
207
+ # end
208
+
209
+ # say ''
210
+ # print_table table
211
+ # say ''
212
+ # end
213
+ # end
214
+ end
@@ -0,0 +1,59 @@
1
+ module SubCommands
2
+ class Series < Thor
3
+ desc "ls", "list series"
4
+ option :order, :type => :string, :default => "updated_at"
5
+ def ls
6
+ series = ::Series.all.order(options[:order].to_sym => :desc)
7
+
8
+ series_stats = Statistics.new
9
+ table = [['#', 'log', 'start', 'end', 'hours']] # header
10
+ series.each do |s|
11
+ next if s.log_id.blank?
12
+
13
+ start = s.start
14
+ finish = s.end
15
+
16
+ # total time
17
+ series_stats << timer = start.difference(finish || Time.now)
18
+
19
+ start = display_time(start) if start
20
+ finish = display_time(finish) if finish
21
+
22
+ table << [s.id,
23
+ Log.find(s.log_id).name,
24
+ start, finish || "active",
25
+ (timer/3600).round(2).to_s] # row
26
+ end
27
+
28
+ puts ''
29
+ print_table table
30
+ puts ''
31
+
32
+ say [series.count.to_s, "series out of", ::Series.count].join(' '), :cyan
33
+ say [(series_stats.mean/3600).round(2), " hours avg"].join(' '), :cyan
34
+ end
35
+
36
+ desc "rm [ID]", "remove series"
37
+ option :confirm, :type => :boolean, :default => false, :alias => '-y'
38
+ def rm(id)
39
+ if ::Series.where(id: id).count == 0
40
+ say "Series #" + id.to_s + " not found", :red
41
+ exit
42
+ end
43
+
44
+ series = ::Series.find(id)
45
+
46
+ if !options[:confirm]
47
+ say "You must --confirm before removing this series", :red
48
+ exit
49
+ end
50
+
51
+ if !series.finished?
52
+ series.log.deactivate
53
+ end
54
+
55
+ destroyed = series.destroy
56
+ say "Series #" + id.to_s + " has been destroyed", :green
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,37 @@
1
+ module SubCommands
2
+ class Tags < Thor
3
+ desc "add", "create new tag"
4
+ def add(tag)
5
+ tag = ::Tag.new(tag: tag.strip)
6
+
7
+ if !tag.save
8
+ tag.errors.full_messages.each do |error|
9
+ say error, :red
10
+ end
11
+ exit 1
12
+ end
13
+
14
+ say tag.tag + " added!", :green
15
+ end
16
+
17
+ desc "rm", "remove tag"
18
+ # option :prune, :type => :boolean, :alias => '-p', :default => false not implemented yet
19
+ def rm(tag)
20
+ tag = ::Tag.find_by!(tag: tag)
21
+ tag.destroy
22
+ say ["Tag", tag.tag, "destroyed forever"].join(' '), :green
23
+ end
24
+
25
+ desc "ls", "list all tags"
26
+ option :order, :type => :string, :default => "created_at"
27
+ def ls
28
+ tags = ::Tag.order(options[:order].to_sym => :desc)
29
+
30
+ table = [['#', 'name', 'logs']] # header
31
+ tags.each do |tag|
32
+ table << [tag.id, tag.tag, tag.logs.count] # row
33
+ end
34
+ print_table table
35
+ end
36
+ end
37
+ end
data/logtime.gemspec ADDED
@@ -0,0 +1,23 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = 'logtime'
3
+ s.date = '2015-06-03'
4
+ s.version = `cat VERSION`.strip
5
+ s.platform = Gem::Platform::RUBY
6
+ s.description = <<-EOF
7
+ Tag, record and estimate your time.
8
+ Get better at time estimation with statistics.
9
+ EOF
10
+ s.summary = 'Log your time'
11
+ s.authors = ['Paperback']
12
+ s.email = 'sam@samwhat.com'
13
+ s.files = `git ls-files`.split($RS)
14
+ s.executables = s.files.grep(/^bin\//) { |f| File.basename(f) }
15
+ s.license = 'MIT'
16
+ s.homepage = 'https://github.com/Paperback/Logtime.git'
17
+ s.add_runtime_dependency "thor", ["= 0.19.1"]
18
+ s.add_runtime_dependency "activerecord", ["= 4.1.6"]
19
+ s.add_runtime_dependency "sqlite3", ["= 1.3.9"]
20
+ s.add_runtime_dependency "chronic_duration", ["= 0.10.6"]
21
+ s.cert_chain = ['certs/paperback.pem']
22
+ s.signing_key = File.expand_path("~/.ssh/gem-private_key.pem") if $0 =~ /gem\z/
23
+ end
data.tar.gz.sig ADDED
@@ -0,0 +1,2 @@
1
+ bڴ���� ��ET����v�x$�B�K�L�o#�b�Z�e���Xk���U��.���m$ķ�����=�}4����
2
+ O%V.�kPO8P�jNF�+���|����Y���hs��s&3ʗ��"��
metadata ADDED
@@ -0,0 +1,167 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: logtime
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - Paperback
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain:
11
+ - |
12
+ -----BEGIN CERTIFICATE-----
13
+ MIIDZDCCAkygAwIBAgIBATANBgkqhkiG9w0BAQUFADA8MQwwCgYDVQQDDANzYW0x
14
+ FzAVBgoJkiaJk/IsZAEZFgdzYW13aGF0MRMwEQYKCZImiZPyLGQBGRYDY29tMB4X
15
+ DTE1MDYwMjA5NTQxOVoXDTE2MDYwMTA5NTQxOVowPDEMMAoGA1UEAwwDc2FtMRcw
16
+ FQYKCZImiZPyLGQBGRYHc2Ftd2hhdDETMBEGCgmSJomT8ixkARkWA2NvbTCCASIw
17
+ DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPKKZV2uNAV6W+IlPDriPQNMPp7C
18
+ Xw7yNlbhmrmgNxJotT4DP6Eyc1NzAJdfz5kQMqgrzxRWBbFD1wPFJB3IdgX1PGKi
19
+ VOV/BO6sFBFrje/2a364FtKkGjm5V+zyeNZO/DUMuFalnbs+OWvfktFrx2JdBWeU
20
+ Utmtx3+AcW91+OFZ8y7ZZjUd1FbNP6A+WTYh2odUDFCQXe4xk3bcSGa0Ca7uAfv8
21
+ VMm1cWu23n+cer1dUW0VspFprSoo/f1WGduZus8PjBFAgEQdDDmTbB49DrigilzT
22
+ swXvrzGfCKZ0OveVFmhJz1Zr9WUlFNs/GU5x2iQpIZjg1S1mbIfhRhw+H1MCAwEA
23
+ AaNxMG8wCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAwHQYDVR0OBBYEFOGu79hFpVdT
24
+ ALi15MDDorfHC7nPMBoGA1UdEQQTMBGBD3NhbUBzYW13aGF0LmNvbTAaBgNVHRIE
25
+ EzARgQ9zYW1Ac2Ftd2hhdC5jb20wDQYJKoZIhvcNAQEFBQADggEBAIQ69hz8tXeJ
26
+ YPTz23tOss7qcY9xo5HInXQXfQ8wZGNVaBPmtBognGO/Kqf5PxeoaZ3FfT8pE9qz
27
+ giuth+pA2j2EXCBwEuu6+I4J9lfIT030uVMaBIQ1JJxKZcXtRpOP2yd/gKodDVn/
28
+ KIGKFrb3RWI2VVKNYV7lBCtHyx4uhEBvHmOhHKm3vlkzc+IZWQtCHhJ9iSKSefZ+
29
+ fZbMJQmYpt4/9KimNcpD+k3mQwMEW947060mRhnpAGkwlIujltb5lQwlWQoKm/Z4
30
+ 2/luIWFCIDih/t3xy/BezkXJLXfRZF2Xd6/Ax9+zEVss6iUJ6kcxwaZ/J5r28EDI
31
+ KS3vMuAGgck=
32
+ -----END CERTIFICATE-----
33
+ date: 2015-06-03 00:00:00.000000000 Z
34
+ dependencies:
35
+ - !ruby/object:Gem::Dependency
36
+ name: thor
37
+ requirement: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - '='
40
+ - !ruby/object:Gem::Version
41
+ version: 0.19.1
42
+ type: :runtime
43
+ prerelease: false
44
+ version_requirements: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - '='
47
+ - !ruby/object:Gem::Version
48
+ version: 0.19.1
49
+ - !ruby/object:Gem::Dependency
50
+ name: activerecord
51
+ requirement: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - '='
54
+ - !ruby/object:Gem::Version
55
+ version: 4.1.6
56
+ type: :runtime
57
+ prerelease: false
58
+ version_requirements: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - '='
61
+ - !ruby/object:Gem::Version
62
+ version: 4.1.6
63
+ - !ruby/object:Gem::Dependency
64
+ name: sqlite3
65
+ requirement: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - '='
68
+ - !ruby/object:Gem::Version
69
+ version: 1.3.9
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - '='
75
+ - !ruby/object:Gem::Version
76
+ version: 1.3.9
77
+ - !ruby/object:Gem::Dependency
78
+ name: chronic_duration
79
+ requirement: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - '='
82
+ - !ruby/object:Gem::Version
83
+ version: 0.10.6
84
+ type: :runtime
85
+ prerelease: false
86
+ version_requirements: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - '='
89
+ - !ruby/object:Gem::Version
90
+ version: 0.10.6
91
+ description: |2
92
+ Tag, record and estimate your time.
93
+ Get better at time estimation with statistics.
94
+ email: sam@samwhat.com
95
+ executables:
96
+ - logtime
97
+ extensions: []
98
+ extra_rdoc_files: []
99
+ files:
100
+ - ".gitignore"
101
+ - Gemfile
102
+ - Gemfile.lock
103
+ - LICENSE.md
104
+ - VERSION
105
+ - bin/logtime
106
+ - certs/paperback.pem
107
+ - config/application.rb
108
+ - config/database.rb
109
+ - config/initialisation.rb
110
+ - config/schema.rb
111
+ - lib/app/commands/add.rb
112
+ - lib/app/commands/list.rb
113
+ - lib/app/commands/start.rb
114
+ - lib/app/commands/stop.rb
115
+ - lib/app/helpers/estimate.rb
116
+ - lib/app/helpers/statistics.rb
117
+ - lib/app/helpers/time_to_words.rb
118
+ - lib/app/logtime.rb
119
+ - lib/app/models/log.rb
120
+ - lib/app/models/series.rb
121
+ - lib/app/models/tag.rb
122
+ - lib/app/subcommands/keyword.rb
123
+ - lib/app/subcommands/series.rb
124
+ - lib/app/subcommands/tags.rb
125
+ - lib/commands/add.rb
126
+ - lib/commands/list.rb
127
+ - lib/commands/start.rb
128
+ - lib/commands/stop.rb
129
+ - lib/commands/version.rb
130
+ - lib/helpers/estimate.rb
131
+ - lib/helpers/statistics.rb
132
+ - lib/helpers/time_difference.rb
133
+ - lib/helpers/time_display.rb
134
+ - lib/helpers/time_to_words.rb
135
+ - lib/logtime.rb
136
+ - lib/models/log.rb
137
+ - lib/models/series.rb
138
+ - lib/models/tag.rb
139
+ - lib/subcommands/keyword.rb
140
+ - lib/subcommands/series.rb
141
+ - lib/subcommands/tags.rb
142
+ - logtime.gemspec
143
+ homepage: https://github.com/Paperback/Logtime.git
144
+ licenses:
145
+ - MIT
146
+ metadata: {}
147
+ post_install_message:
148
+ rdoc_options: []
149
+ require_paths:
150
+ - lib
151
+ required_ruby_version: !ruby/object:Gem::Requirement
152
+ requirements:
153
+ - - ">="
154
+ - !ruby/object:Gem::Version
155
+ version: '0'
156
+ required_rubygems_version: !ruby/object:Gem::Requirement
157
+ requirements:
158
+ - - ">="
159
+ - !ruby/object:Gem::Version
160
+ version: '0'
161
+ requirements: []
162
+ rubyforge_project:
163
+ rubygems_version: 2.4.6
164
+ signing_key:
165
+ specification_version: 4
166
+ summary: Log your time
167
+ test_files: []
metadata.gz.sig ADDED
Binary file