logtime 0.0.3 → 0.0.4
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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/Gemfile.lock +2 -4
- data/README.md +14 -12
- data/VERSION +1 -1
- data/bin/lt +3 -0
- data/config/application.rb +4 -2
- data/config/database.rb +1 -1
- data/config/initialisation.rb +1 -2
- data/config/schema.rb +1 -1
- data/lib/commands/add.rb +2 -3
- data/lib/commands/list.rb +22 -15
- data/lib/commands/start.rb +13 -8
- data/lib/commands/stop.rb +19 -10
- data/lib/helpers/time_display.rb +2 -2
- data/lib/models/log.rb +79 -6
- data/lib/models/series.rb +5 -6
- data/lib/subcommands/series.rb +15 -14
- data/lib/subcommands/tags.rb +3 -3
- data.tar.gz.sig +0 -0
- metadata +3 -17
- metadata.gz.sig +0 -0
- data/lib/app/commands/add.rb +0 -41
- data/lib/app/commands/list.rb +0 -56
- data/lib/app/commands/start.rb +0 -28
- data/lib/app/commands/stop.rb +0 -29
- data/lib/app/helpers/estimate.rb +0 -13
- data/lib/app/helpers/statistics.rb +0 -45
- data/lib/app/helpers/time_to_words.rb +0 -33
- data/lib/app/logtime.rb +0 -67
- data/lib/app/models/log.rb +0 -42
- data/lib/app/models/series.rb +0 -35
- data/lib/app/models/tag.rb +0 -9
- data/lib/app/subcommands/keyword.rb +0 -214
- data/lib/app/subcommands/series.rb +0 -58
- data/lib/app/subcommands/tags.rb +0 -79
- data/lib/helpers/estimate.rb +0 -13
- data/lib/subcommands/keyword.rb +0 -214
data/lib/app/commands/list.rb
DELETED
@@ -1,56 +0,0 @@
|
|
1
|
-
module Commands
|
2
|
-
module List
|
3
|
-
def self.included(thor)
|
4
|
-
thor.class_eval do
|
5
|
-
option :active, :type => :boolean, :default => true
|
6
|
-
option :tag, :type => :boolean, :alias => '-t'
|
7
|
-
desc "ls", "list time series"
|
8
|
-
def ls()
|
9
|
-
logs = Log.where(active: options[:active]).includes(:series)
|
10
|
-
# logs = Tag.where(tag: options[:tag]).logs if options[:tag]
|
11
|
-
|
12
|
-
|
13
|
-
creep_stats = Statistics.new
|
14
|
-
table = [['#', 'name', 'active', 'tags', 'series', 'time', 'estimate', 'creep %']] # header
|
15
|
-
logs.each do |log|
|
16
|
-
|
17
|
-
# tags
|
18
|
-
tags = log.tags.map do |t|
|
19
|
-
t.tag
|
20
|
-
end
|
21
|
-
|
22
|
-
# active text
|
23
|
-
active = "ACTIVE" if log.active == "t"
|
24
|
-
|
25
|
-
# total counter
|
26
|
-
total_time = (log.total/3600).round(2)
|
27
|
-
|
28
|
-
# estimation creep
|
29
|
-
if log.estimation
|
30
|
-
creep = (total_time/log.estimation)*100
|
31
|
-
creep_stats << creep
|
32
|
-
creep = creep.round(3)
|
33
|
-
estimation = (log.estimation/3600).round(3) # log estimation to hours
|
34
|
-
end
|
35
|
-
|
36
|
-
table << [log.id,
|
37
|
-
log.name,
|
38
|
-
active || '',
|
39
|
-
tags,
|
40
|
-
log.series.count || '',
|
41
|
-
total_time || '',
|
42
|
-
estimation || '',
|
43
|
-
creep || '']
|
44
|
-
end
|
45
|
-
puts ""
|
46
|
-
print_table table
|
47
|
-
puts ""
|
48
|
-
|
49
|
-
say [logs.count.to_s, "logs out of", Log.count.to_s].join(' '), :cyan
|
50
|
-
say [creep_stats.count, "estimations"].join(' '), :cyan
|
51
|
-
say [creep_stats.mean.round(3), "avg creep"].join(' '), :cyan
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
data/lib/app/commands/start.rb
DELETED
@@ -1,28 +0,0 @@
|
|
1
|
-
module Commands
|
2
|
-
module Start
|
3
|
-
def self.included(thor)
|
4
|
-
thor.class_eval do
|
5
|
-
desc "start [NAME]", "start new timer"
|
6
|
-
def start(name)
|
7
|
-
|
8
|
-
# not found
|
9
|
-
if Log.where(name: name).count == 0
|
10
|
-
say name.to_s + " not found", :red
|
11
|
-
exit
|
12
|
-
end
|
13
|
-
|
14
|
-
log = Log.find_by(name: name)
|
15
|
-
|
16
|
-
# already active?
|
17
|
-
if log.active == "t"
|
18
|
-
say name.to_s + " already active", :red
|
19
|
-
exit
|
20
|
-
end
|
21
|
-
|
22
|
-
# begin new series, activate log
|
23
|
-
series = Series.begin(log_id: log.id) and log.activate
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
data/lib/app/commands/stop.rb
DELETED
@@ -1,29 +0,0 @@
|
|
1
|
-
module Commands
|
2
|
-
module Stop
|
3
|
-
def self.included(thor)
|
4
|
-
thor.class_eval do
|
5
|
-
desc "stop [NAME]", "stop active timer"
|
6
|
-
def stop(name)
|
7
|
-
if Log.where(name: name).count == 0
|
8
|
-
say name.to_s + " not found", :red
|
9
|
-
exit
|
10
|
-
end
|
11
|
-
|
12
|
-
log = Log.find_by(name: name)
|
13
|
-
if log.active == "f"
|
14
|
-
say name.to_s + " not active", :red
|
15
|
-
exit
|
16
|
-
end
|
17
|
-
|
18
|
-
series = log.series.last
|
19
|
-
if series.stop and log.deactivate
|
20
|
-
say name + " stopped!", :green
|
21
|
-
|
22
|
-
# this_series = log.series.last
|
23
|
-
say (series.total/3600).round(3).to_s + " hours out of " + (log.total/3600).round(3).to_s, :cyan
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
data/lib/app/helpers/estimate.rb
DELETED
@@ -1,45 +0,0 @@
|
|
1
|
-
module StatisticsHelper
|
2
|
-
class Series < Array
|
3
|
-
def sum
|
4
|
-
inject(0.0) { |result, el| result + el }
|
5
|
-
end
|
6
|
-
|
7
|
-
def mean
|
8
|
-
sum / size
|
9
|
-
end
|
10
|
-
|
11
|
-
alias :average :mean
|
12
|
-
end
|
13
|
-
|
14
|
-
class Statistics
|
15
|
-
def initialize
|
16
|
-
@statistics = Series.new
|
17
|
-
end
|
18
|
-
|
19
|
-
def add(statistic)
|
20
|
-
@statistics << statistic
|
21
|
-
end
|
22
|
-
|
23
|
-
def count
|
24
|
-
@statistics.count
|
25
|
-
end
|
26
|
-
|
27
|
-
def mean
|
28
|
-
@statistics.mean
|
29
|
-
end
|
30
|
-
|
31
|
-
def <<(statistic)
|
32
|
-
add(statistic)
|
33
|
-
end
|
34
|
-
|
35
|
-
def +(statistics)
|
36
|
-
@statistics = @statistics + statistics.data
|
37
|
-
end
|
38
|
-
|
39
|
-
def data
|
40
|
-
@statistics
|
41
|
-
end
|
42
|
-
|
43
|
-
alias :average :mean
|
44
|
-
end
|
45
|
-
end
|
@@ -1,33 +0,0 @@
|
|
1
|
-
module TimeToWordsHelper
|
2
|
-
def time_to_words_ago(time)
|
3
|
-
a = (Time.now-time).to_i
|
4
|
-
case a
|
5
|
-
when 0 then 'just now'
|
6
|
-
when 1 then 'a second ago'
|
7
|
-
when 2..59 then a.to_s+' seconds ago'
|
8
|
-
when 60..119 then 'a minute ago' # 120 = 2 minutes
|
9
|
-
when 120..3540 then (a/60).to_i.to_s+' minutes ago'
|
10
|
-
when 3541..7100 then 'an hour ago' # 3600 = 1 hour
|
11
|
-
when 7101..82800 then ((a+99)/3600).to_i.to_s+' hours ago'
|
12
|
-
when 82801..172000 then 'a day ago' # 86400 = 1 day
|
13
|
-
when 172001..518400 then ((a+800)/(60*60*24)).to_i.to_s+' days ago'
|
14
|
-
when 518400..1036800 then 'a week ago'
|
15
|
-
else ((a+180000)/(60*60*24*7)).to_i.to_s+' weeks ago'
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
def time_to_words(seconds)
|
20
|
-
seconds
|
21
|
-
case a
|
22
|
-
when 0..60 then 'seconds'
|
23
|
-
when 60..69 then 'minute'
|
24
|
-
when 70..3600 then 'minutes'
|
25
|
-
when 3600..7199 then 'day'
|
26
|
-
when 7200..107999 then 'days' # 3600 = 1 hour
|
27
|
-
when 108000..215999 then 'month'
|
28
|
-
when 216000..1296000 then 'months'
|
29
|
-
when 1296000..1296000 then 'year'
|
30
|
-
else 'years'
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
data/lib/app/logtime.rb
DELETED
@@ -1,67 +0,0 @@
|
|
1
|
-
require '../config/initialisation'
|
2
|
-
|
3
|
-
# require models
|
4
|
-
models_path = '../app/models'
|
5
|
-
if Dir.exists?(models_path)
|
6
|
-
Dir.entries(models_path).each do |file|
|
7
|
-
require File.join(models_path, file) if file =~ /^(.*)\.rb$/
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
# require helpers
|
12
|
-
helpers_path = '../app/helpers'
|
13
|
-
if Dir.exists?(helpers_path)
|
14
|
-
Dir.entries(helpers_path).each do |file|
|
15
|
-
next unless file =~ /^(.*)\.rb$/
|
16
|
-
|
17
|
-
require File.join(helpers_path, 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
|
-
# rescue
|
30
|
-
# ActiveRecord::Base.logger.warn "Failed to load " + load
|
31
|
-
# end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
# require commands
|
36
|
-
commands_path = '../app/commands'
|
37
|
-
if Dir.exists?(commands_path)
|
38
|
-
Dir.entries(commands_path).each do |file|
|
39
|
-
require File.join(commands_path, file) if file =~ /^(.*)\.rb$/
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
# require subcommands
|
44
|
-
subcommands_path = '../app/subcommands'
|
45
|
-
if Dir.exists?(subcommands_path)
|
46
|
-
Dir.entries(subcommands_path).each do |file|
|
47
|
-
require File.join(subcommands_path, file) if file =~ /^(.*)\.rb$/
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
# Application
|
52
|
-
class LogTime < Thor
|
53
|
-
|
54
|
-
# commands
|
55
|
-
include Commands::List
|
56
|
-
include Commands::Add
|
57
|
-
# include Commands::Remove
|
58
|
-
include Commands::Start
|
59
|
-
include Commands::Stop
|
60
|
-
|
61
|
-
# subcommands
|
62
|
-
desc "series", ""
|
63
|
-
subcommand "series", SubCommands::Series
|
64
|
-
|
65
|
-
desc "tags", ""
|
66
|
-
subcommand "tags", SubCommands::Tags
|
67
|
-
end
|
data/lib/app/models/log.rb
DELETED
@@ -1,42 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Logs
|
3
|
-
#
|
4
|
-
|
5
|
-
class Log < ActiveRecord::Base
|
6
|
-
scope :active, -> { where(active: true) }
|
7
|
-
scope :inactive, -> { where(active: false) }
|
8
|
-
scope :estimated, -> { where("estimation is not null") }
|
9
|
-
|
10
|
-
validates :name, uniqueness: true
|
11
|
-
|
12
|
-
has_many :series
|
13
|
-
has_and_belongs_to_many :tags
|
14
|
-
|
15
|
-
def tag(tags)
|
16
|
-
tags.split(',').each do |t|
|
17
|
-
self.tags << Tag.where(tag: t).first_or_create
|
18
|
-
end
|
19
|
-
|
20
|
-
return self
|
21
|
-
end
|
22
|
-
|
23
|
-
def activate
|
24
|
-
self.active = true
|
25
|
-
self.save
|
26
|
-
end
|
27
|
-
|
28
|
-
def deactivate
|
29
|
-
self.active = false
|
30
|
-
self.save
|
31
|
-
end
|
32
|
-
|
33
|
-
def total
|
34
|
-
difference = 0
|
35
|
-
self.series.each do |s|
|
36
|
-
ending = s.end || Time.now
|
37
|
-
# next unless s.start and s.end
|
38
|
-
difference = difference + s.start.difference(ending)
|
39
|
-
end
|
40
|
-
difference
|
41
|
-
end
|
42
|
-
end
|
data/lib/app/models/series.rb
DELETED
@@ -1,35 +0,0 @@
|
|
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/app/models/tag.rb
DELETED
@@ -1,214 +0,0 @@
|
|
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
|
@@ -1,58 +0,0 @@
|
|
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 = start.display if start
|
20
|
-
finish = finish.display 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
|
-
puts ''
|
28
|
-
print_table table
|
29
|
-
puts ''
|
30
|
-
|
31
|
-
say [series.count.to_s, "series out of", ::Series.count].join(' '), :cyan
|
32
|
-
say [(series_stats.mean/3600).round(2), " hours avg"].join(' '), :cyan
|
33
|
-
end
|
34
|
-
|
35
|
-
desc "rm [ID]", "remove series"
|
36
|
-
option :confirm, :type => :boolean, :default => false, :alias => '-y'
|
37
|
-
def rm(id)
|
38
|
-
if ::Series.where(id: id).count == 0
|
39
|
-
say "Series #" + id.to_s + " not found", :red
|
40
|
-
exit
|
41
|
-
end
|
42
|
-
|
43
|
-
series = ::Series.find(id)
|
44
|
-
|
45
|
-
if !options[:confirm]
|
46
|
-
say "You must --confirm before removing this series", :red
|
47
|
-
exit
|
48
|
-
end
|
49
|
-
|
50
|
-
if !series.finished?
|
51
|
-
series.log.deactivate
|
52
|
-
end
|
53
|
-
|
54
|
-
destroyed = series.destroy
|
55
|
-
say "Series #" + id.to_s + " has been destroyed", :green
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|