ruby-rescuetime 0.0.5 → 0.0.6
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/lib/rescuetime/application.rb +34 -22
- data/lib/rescuetime/config.rb +18 -16
- data/lib/rescuetime/debug.rb +10 -6
- data/lib/rescuetime/loop.rb +100 -22
- data/lib/rescuetime/uploader.rb +29 -20
- data/lib/rescuetime/version.rb +1 -1
- data/lib/rescuetime/version.rb~ +4 -0
- data/spec/rescuetime_spec.rb +2 -4
- metadata +7 -7
- data/lib/tasks/ruby-rescuetime_tasks.rake +0 -4
@@ -2,6 +2,14 @@ module Rescuetime
|
|
2
2
|
class Application
|
3
3
|
include Rescuetime::Debug
|
4
4
|
|
5
|
+
# NEW && UNTESTED
|
6
|
+
def self.to_yaml(apps = [])
|
7
|
+
yaml = "---\n"
|
8
|
+
[*apps].each { |app| yaml += app.to_yaml }
|
9
|
+
|
10
|
+
return yaml
|
11
|
+
end
|
12
|
+
|
5
13
|
def self.current_application_name
|
6
14
|
cmd = <<-CMD
|
7
15
|
xprop -id `xprop -root |
|
@@ -113,31 +121,35 @@ module Rescuetime
|
|
113
121
|
return out
|
114
122
|
end
|
115
123
|
|
124
|
+
def to_yaml
|
125
|
+
to_upload_data
|
126
|
+
end
|
127
|
+
|
116
128
|
|
117
129
|
|
118
130
|
private
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
131
|
+
def finish!
|
132
|
+
@active = false
|
133
|
+
@finished_at = Time.now
|
134
|
+
end
|
135
|
+
|
136
|
+
def current_application_name
|
137
|
+
application_name(self.class.current_application_name)
|
138
|
+
end
|
139
|
+
|
140
|
+
def current_window_title
|
141
|
+
window_title(self.class.current_window_title)
|
142
|
+
end
|
143
|
+
|
144
|
+
# To be overwritten
|
145
|
+
def application_name(name)
|
146
|
+
name
|
147
|
+
end
|
148
|
+
|
149
|
+
# To be overwritten
|
150
|
+
def window_title(title)
|
151
|
+
title
|
152
|
+
end
|
141
153
|
end
|
142
154
|
end
|
143
155
|
|
data/lib/rescuetime/config.rb
CHANGED
@@ -22,7 +22,8 @@ module Rescuetime
|
|
22
22
|
:path => nil
|
23
23
|
}.merge(options)
|
24
24
|
|
25
|
-
|
25
|
+
debug! if options[:debug]
|
26
|
+
|
26
27
|
@config_path = options[:config] || File.join(options[:path] || DEFAULT_PATH, DEFAULT_FILE)
|
27
28
|
config = read_config(@config_path)
|
28
29
|
|
@@ -31,6 +32,7 @@ module Rescuetime
|
|
31
32
|
:password => options[:password] || config[:password],
|
32
33
|
:path => DEFAULT_PATH || config[:path]
|
33
34
|
}
|
35
|
+
|
34
36
|
update if @config != config
|
35
37
|
end
|
36
38
|
|
@@ -59,25 +61,25 @@ module Rescuetime
|
|
59
61
|
|
60
62
|
|
61
63
|
private
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
64
|
+
def read_config(path)
|
65
|
+
create_config_file(path) unless File.exist?(path)
|
66
|
+
YAML::load(File.open(path))
|
67
|
+
end
|
66
68
|
|
67
|
-
|
68
|
-
|
69
|
-
|
69
|
+
def create_config_file(path)
|
70
|
+
write_config_file(DEFAULT_CONFIG, path)
|
71
|
+
end
|
70
72
|
|
71
|
-
|
72
|
-
|
73
|
-
|
73
|
+
def update_config(config, path)
|
74
|
+
write_config_file(config, path)
|
75
|
+
end
|
74
76
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
end
|
77
|
+
def write_config_file(config, path)
|
78
|
+
FileUtils.mkdir_p(File.dirname(path))
|
79
|
+
File.open(path, 'w') do |f|
|
80
|
+
f.write(YAML::dump(config))
|
80
81
|
end
|
82
|
+
end
|
81
83
|
end
|
82
84
|
end
|
83
85
|
|
data/lib/rescuetime/debug.rb
CHANGED
@@ -6,13 +6,17 @@ module Rescuetime
|
|
6
6
|
end
|
7
7
|
|
8
8
|
private
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
def debug!(to_debug = true)
|
10
|
+
@debug = to_debug
|
11
|
+
end
|
12
|
+
|
13
|
+
# Debug-Wrapper
|
14
|
+
def debug(msg = nil, &block)
|
15
|
+
return unless debug?
|
12
16
|
|
13
|
-
|
14
|
-
|
15
|
-
|
17
|
+
puts msg if msg
|
18
|
+
yield if block_given?
|
19
|
+
end
|
16
20
|
end
|
17
21
|
end
|
18
22
|
|
data/lib/rescuetime/loop.rb
CHANGED
@@ -2,6 +2,8 @@ module Rescuetime
|
|
2
2
|
class Loop
|
3
3
|
include Rescuetime::Debug
|
4
4
|
|
5
|
+
attr_reader :config
|
6
|
+
|
5
7
|
# =Creates and run a new Rescuetime::Loop:
|
6
8
|
# Rescuetime::Loop.new({
|
7
9
|
# :email => "foo@example.com",
|
@@ -21,12 +23,13 @@ module Rescuetime
|
|
21
23
|
|
22
24
|
@config = Config.new(options)
|
23
25
|
|
24
|
-
|
26
|
+
debug! if @config.debug?
|
27
|
+
|
25
28
|
debug "[OPTIONS]" do p options end
|
26
29
|
|
27
|
-
@apps
|
30
|
+
@apps = []
|
28
31
|
@current_app = nil
|
29
|
-
@uploader = Rescuetime::Uploader.new( :debug =>
|
32
|
+
@uploader = Rescuetime::Uploader.new( :debug => debug?,
|
30
33
|
:email => @config.email,
|
31
34
|
:password => @config.password)
|
32
35
|
|
@@ -39,55 +42,130 @@ module Rescuetime
|
|
39
42
|
puts "Please call ruby-rescuetime with correct login credentials."
|
40
43
|
puts " * ruby-rescuetime --email foo@example.com --password secret\n OR"
|
41
44
|
puts " * edit: #{@config.location}"
|
42
|
-
|
45
|
+
puts "\n[OFFLINE-MODE]"
|
46
|
+
else
|
47
|
+
upload!
|
48
|
+
upload!("failure")
|
43
49
|
end
|
44
50
|
|
45
|
-
@running = true
|
46
51
|
Signal.trap("INT") do
|
47
|
-
shutdown if
|
52
|
+
shutdown! if running?
|
48
53
|
end
|
49
54
|
|
50
55
|
self.run
|
51
56
|
end
|
52
57
|
|
58
|
+
def running!(running = true)
|
59
|
+
@running = running
|
60
|
+
end
|
61
|
+
|
53
62
|
def running?
|
54
63
|
@running == true
|
55
64
|
end
|
56
65
|
|
57
66
|
# Handler called if 'Ctrl + C' is pressed
|
58
|
-
def shutdown
|
59
|
-
|
67
|
+
def shutdown!
|
68
|
+
running!(false)
|
60
69
|
@apps << @current_app
|
61
|
-
yamldata = @uploader.prepare_data(@apps)
|
62
|
-
success = @uploader.upload(:yamldata => yamldata)
|
63
|
-
raise "Upload failed" unless success
|
64
70
|
|
71
|
+
backup!
|
72
|
+
upload!
|
65
73
|
exit
|
66
74
|
end
|
67
75
|
|
68
76
|
# Run the loop
|
69
77
|
def run
|
70
|
-
|
71
|
-
|
78
|
+
running!
|
79
|
+
@current_app = Application.create(:debug => debug?)
|
72
80
|
|
73
81
|
while true
|
74
82
|
sleep 1 # TODO: move to config
|
75
|
-
|
83
|
+
focus_changed if @current_app.finished? || backup?
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
|
88
|
+
|
89
|
+
### BACKUP DATA ### (may be moved)
|
90
|
+
|
91
|
+
# NEW && UNTESTED
|
92
|
+
def last_backup_at
|
93
|
+
@last_backup_at ||= Time.now
|
94
|
+
end
|
95
|
+
|
96
|
+
# NEW && UNTESTED
|
97
|
+
def seconds_since_last_backup
|
98
|
+
Time.now - last_backup_at
|
99
|
+
end
|
100
|
+
|
101
|
+
# NEW && UNTESTED
|
102
|
+
# TODO: read from config
|
103
|
+
def backup?
|
104
|
+
@apps.length > 100 || seconds_since_last_backup > 30*60
|
105
|
+
end
|
106
|
+
|
107
|
+
# NEW && UNTESTED
|
108
|
+
def backup!
|
109
|
+
debug "[BACKUP]"
|
110
|
+
|
111
|
+
@last_backup_at = Time.now
|
112
|
+
timestamp = @last_backup_at.to_i
|
113
|
+
|
114
|
+
path = File.join(config.path, "upload", "todo", "#{timestamp}.yaml")
|
115
|
+
FileUtils.mkdir_p(File.dirname(path))
|
116
|
+
|
117
|
+
File.open(path, 'w') do |f|
|
118
|
+
f.write(Rescuetime::Application.to_yaml(@apps))
|
119
|
+
end
|
120
|
+
|
121
|
+
@apps = []
|
122
|
+
end
|
123
|
+
|
124
|
+
# NEW && UNTESTED
|
125
|
+
def upload!(mode = "todo") # possible modes: todo, failure
|
126
|
+
path = File.join(config.path, "upload", mode, "*.yaml")
|
127
|
+
files = Dir.glob(path)
|
128
|
+
|
129
|
+
success_path = File.join(config.path, "upload", "success")
|
130
|
+
failure_path = File.join(config.path, "upload", "failure")
|
131
|
+
|
132
|
+
# Make sure directories exist
|
133
|
+
FileUtils.mkdir_p(success_path)
|
134
|
+
FileUtils.mkdir_p(failure_path)
|
135
|
+
|
136
|
+
debug "[UPLOAD] #{files.count} files"
|
137
|
+
files.each_with_index do |f, i|
|
138
|
+
debug "#{f} (#{i})"
|
139
|
+
file = File.open(f, "rb")
|
140
|
+
yamldata = file.read
|
141
|
+
file.close
|
142
|
+
success = @uploader.upload(:yamldata => yamldata)
|
143
|
+
|
144
|
+
# CHECK: may another solution for base_name exist?
|
145
|
+
base_name = f.split("/").last
|
146
|
+
|
147
|
+
path = success ? success_path : failure_path
|
148
|
+
path = File.join(path, base_name)
|
149
|
+
|
150
|
+
# HACK: don't copy if mode == failure and failure again
|
151
|
+
FileUtils.mv(f, path) unless !success && mode == "failure"
|
76
152
|
end
|
77
153
|
end
|
78
154
|
|
79
155
|
|
80
156
|
|
81
157
|
private
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
@current_app
|
89
|
-
puts "[FOCUS] #{@current_app}"
|
158
|
+
# Old app lost focus, get new one
|
159
|
+
def focus_changed
|
160
|
+
backup! if backup?
|
161
|
+
|
162
|
+
@apps << @current_app
|
163
|
+
debug "\n[OLD FOCUS]" do
|
164
|
+
puts "#{@current_app.to_s}:\n#{@current_app.active_time} seconds alive\n\n"
|
90
165
|
end
|
166
|
+
@current_app = Application.create(:debug => debug?)
|
167
|
+
puts "#{@current_app}"
|
168
|
+
end
|
91
169
|
end
|
92
170
|
end
|
93
171
|
|
data/lib/rescuetime/uploader.rb
CHANGED
@@ -20,7 +20,8 @@ module Rescuetime
|
|
20
20
|
# :debug => false
|
21
21
|
# })
|
22
22
|
def initialize(options = {})
|
23
|
-
|
23
|
+
debug! if options[:debug]
|
24
|
+
|
24
25
|
@http = Net::HTTP.new(API_HOST, 443)
|
25
26
|
@http.use_ssl = true
|
26
27
|
|
@@ -28,27 +29,21 @@ module Rescuetime
|
|
28
29
|
@password = options[:password]
|
29
30
|
end
|
30
31
|
|
31
|
-
# Convert array of app objects to yamldata
|
32
|
-
def prepare_data(apps)
|
33
|
-
data = "---\n"
|
34
|
-
apps.each { |app| data += app.to_upload_data }
|
35
|
-
debug "[DATA TO SAVE]" do puts data end
|
36
|
-
# YAML::dump(apps)
|
37
|
-
|
38
|
-
return data
|
39
|
-
end
|
40
|
-
|
41
32
|
# Service available?
|
42
33
|
def connection_alive?
|
43
34
|
resp = @http.get(API_HANDSHAKE_PATH)
|
44
35
|
resp.code == "200"
|
45
36
|
end
|
46
37
|
|
47
|
-
#
|
38
|
+
# =Uploads yaml-formatted data
|
39
|
+
# ==Usage:
|
40
|
+
# @uploader.upload(:yamldata => yamldata)
|
41
|
+
# ==Returns:
|
42
|
+
# true if upload successful, false otherwise
|
48
43
|
def upload(options = {})
|
49
|
-
hash = {
|
50
|
-
|
51
|
-
|
44
|
+
hash = { :email => @email,
|
45
|
+
:password => @password,
|
46
|
+
:yamldata => options[:yamldata] }
|
52
47
|
|
53
48
|
data = []
|
54
49
|
hash.each do |key, value|
|
@@ -59,18 +54,32 @@ module Rescuetime
|
|
59
54
|
debug "[YAMLDATA]" do puts data end
|
60
55
|
|
61
56
|
headers = { 'User-agent' => USER_AGENT }
|
62
|
-
|
63
|
-
|
57
|
+
|
58
|
+
begin
|
59
|
+
resp = @http.post(API_UPLOAD_PATH, data, headers)
|
60
|
+
rescue
|
61
|
+
return false
|
62
|
+
end
|
63
|
+
|
64
|
+
debug "[UPLOAD]" do puts resp.body end
|
64
65
|
|
65
66
|
return (resp.code == "200" && !resp.body["<error>"])
|
66
67
|
end
|
67
68
|
|
68
|
-
# Handshake with login credentials
|
69
|
+
# =Handshake with login credentials
|
70
|
+
# ==Returns:
|
71
|
+
# true if handshake successful, false otherwise
|
69
72
|
def handshake
|
70
73
|
data = "email=#{@email}&password=#{@password}"
|
71
74
|
headers = { 'User-agent' => USER_AGENT }
|
72
|
-
|
73
|
-
|
75
|
+
|
76
|
+
begin
|
77
|
+
resp = @http.post(API_HANDSHAKE_PATH, data, headers)
|
78
|
+
rescue SocketError
|
79
|
+
return false
|
80
|
+
end
|
81
|
+
|
82
|
+
debug "[HANDSHAKE]" do puts resp.body end
|
74
83
|
|
75
84
|
return (resp.code == "200" && !resp.body["login failure"])
|
76
85
|
end
|
data/lib/rescuetime/version.rb
CHANGED
data/spec/rescuetime_spec.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-rescuetime
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-06-04 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
16
|
-
requirement: &
|
16
|
+
requirement: &84534550 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,7 +21,7 @@ dependencies:
|
|
21
21
|
version: '2.6'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *84534550
|
25
25
|
description: ! 'Upload your data to: https://www.rescuetime.com'
|
26
26
|
email:
|
27
27
|
- deradon87@gmail.com
|
@@ -32,11 +32,11 @@ extra_rdoc_files: []
|
|
32
32
|
files:
|
33
33
|
- bin/ruby-rescuetime
|
34
34
|
- lib/rescuetime.rb
|
35
|
-
- lib/tasks/ruby-rescuetime_tasks.rake
|
36
35
|
- lib/rescuetime/config.rb
|
37
36
|
- lib/rescuetime/version.rb
|
38
37
|
- lib/rescuetime/loop.rb
|
39
38
|
- lib/rescuetime/commands.rb
|
39
|
+
- lib/rescuetime/version.rb~
|
40
40
|
- lib/rescuetime/extensions/gedit.rb
|
41
41
|
- lib/rescuetime/extensions/chromium.rb
|
42
42
|
- lib/rescuetime/debug.rb
|
@@ -62,7 +62,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
62
62
|
version: '0'
|
63
63
|
segments:
|
64
64
|
- 0
|
65
|
-
hash:
|
65
|
+
hash: 61471837
|
66
66
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
67
67
|
none: false
|
68
68
|
requirements:
|
@@ -71,7 +71,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
71
71
|
version: '0'
|
72
72
|
segments:
|
73
73
|
- 0
|
74
|
-
hash:
|
74
|
+
hash: 61471837
|
75
75
|
requirements: []
|
76
76
|
rubyforge_project:
|
77
77
|
rubygems_version: 1.8.10
|