vimgolf 0.1.3 → 0.2.0
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.lock +1 -1
- data/lib/vimgolf.rb +2 -0
- data/lib/vimgolf/cli.rb +35 -12
- data/lib/vimgolf/keylog.rb +105 -0
- data/lib/vimgolf/version.rb +1 -1
- data/spec/cli_spec.rb +1 -1
- data/spec/fixtures/4d19832d8ae121365c00000b.log +1 -0
- data/spec/fixtures/4d1a1c36567bac34a9000002.log +1 -0
- data/spec/fixtures/4d1a1c69567bac34a9000004.log +1 -0
- data/spec/fixtures/4d1a21e88ae121365c00000e.log +1 -0
- data/spec/fixtures/4d1a34ccfa85f32065000004.log +1 -0
- data/spec/keylog_spec.rb +15 -0
- data/vimgolf.gemspec +4 -2
- metadata +20 -6
data/Gemfile.lock
CHANGED
data/lib/vimgolf.rb
CHANGED
data/lib/vimgolf/cli.rb
CHANGED
@@ -1,7 +1,9 @@
|
|
1
1
|
module VimGolf
|
2
2
|
|
3
|
-
GOLFHOST
|
3
|
+
GOLFHOST = ENV['GOLFHOST'] || "http://vimgolf.com"
|
4
4
|
GOLFDEBUG = ENV['GOLFDEBUG'].to_sym rescue false
|
5
|
+
DIFF = ENV['DIFF'] || 'diff'
|
6
|
+
PROXY = ENV['http_proxy'] || ''
|
5
7
|
|
6
8
|
class Error
|
7
9
|
end
|
@@ -72,7 +74,7 @@ module VimGolf
|
|
72
74
|
system(vimcmd)
|
73
75
|
|
74
76
|
if $?.exitstatus.zero?
|
75
|
-
diff =
|
77
|
+
diff = `#{DIFF} #{input(id, type)} #{output(id)}`
|
76
78
|
|
77
79
|
if diff.size > 0
|
78
80
|
VimGolf.ui.warn "Uh oh, looks like your entry does not match the desired output:"
|
@@ -83,7 +85,7 @@ module VimGolf
|
|
83
85
|
return
|
84
86
|
end
|
85
87
|
|
86
|
-
score =
|
88
|
+
score = Keylog.score(IO.read(log(id)))
|
87
89
|
VimGolf.ui.info "Success! Your output matches. Your score: #{score}"
|
88
90
|
|
89
91
|
if VimGolf.ui.yes? "Upload result to VimGolf? (yes / no)"
|
@@ -93,7 +95,7 @@ module VimGolf
|
|
93
95
|
VimGolf.ui.info "Uploaded entry, thanks for golfing!"
|
94
96
|
VimGolf.ui.info "View the leaderboard: #{GOLFHOST}/challenges/#{id}"
|
95
97
|
else
|
96
|
-
VimGolf.ui.error "Uh oh, upload
|
98
|
+
VimGolf.ui.error "Uh oh, upload failed. You're not cheating are you? :-)"
|
97
99
|
end
|
98
100
|
|
99
101
|
else
|
@@ -110,7 +112,7 @@ module VimGolf
|
|
110
112
|
end
|
111
113
|
|
112
114
|
rescue Exception => e
|
113
|
-
VimGolf.ui.error "Uh oh, something
|
115
|
+
VimGolf.ui.error "Uh oh, something went wrong! Error: #{e}"
|
114
116
|
VimGolf.ui.error "If the error persists, please report it to github.com/igrigorik/vimgolf"
|
115
117
|
end
|
116
118
|
end
|
@@ -120,7 +122,11 @@ module VimGolf
|
|
120
122
|
begin
|
121
123
|
url = URI.parse("#{GOLFHOST}/challenges/#{id}.json")
|
122
124
|
req = Net::HTTP::Get.new(url.path)
|
123
|
-
|
125
|
+
|
126
|
+
proxy_url, proxy_user, proxy_pass = get_proxy
|
127
|
+
proxy = Net::HTTP::Proxy(proxy_url.host, proxy_url.port, proxy_user, proxy_pass)
|
128
|
+
res = proxy.start(url.host, url.port) { |http| http.request(req) }
|
129
|
+
|
124
130
|
data = JSON.parse(res.body)
|
125
131
|
|
126
132
|
if data['client'] != Vimgolf::VERSION
|
@@ -144,15 +150,18 @@ module VimGolf
|
|
144
150
|
def upload(id)
|
145
151
|
begin
|
146
152
|
url = URI.parse("#{GOLFHOST}/entry.json")
|
147
|
-
http = Net::HTTP.new(url.host, url.port)
|
148
153
|
|
149
|
-
|
150
|
-
|
151
|
-
request["Accept"] = "application/json"
|
154
|
+
proxy_url, proxy_user, proxy_pass = get_proxy
|
155
|
+
proxy = Net::HTTP::Proxy(proxy_url.host, proxy_url.port, proxy_user, proxy_pass)
|
152
156
|
|
153
|
-
|
154
|
-
|
157
|
+
proxy.start(url.host, url.port) do |http|
|
158
|
+
request = Net::HTTP::Post.new(url.request_uri)
|
159
|
+
request.set_form_data({"challenge_id" => id, "apikey" => Config.load['key'], "entry" => IO.read(log(id))})
|
160
|
+
request["Accept"] = "application/json"
|
155
161
|
|
162
|
+
res = http.request(request)
|
163
|
+
JSON.parse(res.body)['status'].to_sym
|
164
|
+
end
|
156
165
|
rescue Exception => e
|
157
166
|
debug(e)
|
158
167
|
raise "Uh oh, entry upload has failed, please check your key."
|
@@ -170,6 +179,20 @@ module VimGolf
|
|
170
179
|
Config.put_path + "/#{id}"
|
171
180
|
end
|
172
181
|
|
182
|
+
def get_proxy
|
183
|
+
begin
|
184
|
+
proxy_url = URI.parse(PROXY)
|
185
|
+
rescue Exception => e
|
186
|
+
VimGolf.ui.error "Invalid proxy uri in http_proxy environment variable - will try to run with out proxy"
|
187
|
+
proxy_url = URI.parse("");
|
188
|
+
end
|
189
|
+
|
190
|
+
proxy_url.port ||= 80
|
191
|
+
proxy_user, proxy_pass = proxy_url.userinfo.split(/:/) if proxy_url.userinfo
|
192
|
+
|
193
|
+
return proxy_url, proxy_user, proxy_pass
|
194
|
+
end
|
195
|
+
|
173
196
|
def debug(msg)
|
174
197
|
p [caller.first, msg] if GOLFDEBUG
|
175
198
|
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
module VimGolf
|
2
|
+
class Session < Array
|
3
|
+
def to_s(sep = '')
|
4
|
+
@log.join(sep)
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
8
|
+
class Keylog
|
9
|
+
def self.parse(input)
|
10
|
+
session = Session.new
|
11
|
+
scan(input) {|s| session << s }
|
12
|
+
session
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.convert(input)
|
16
|
+
parse(input).join('')
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.score(input)
|
20
|
+
keys = 0
|
21
|
+
scan(input) {|s| keys += 1 }
|
22
|
+
keys
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.scan(input)
|
26
|
+
scanner = StringScanner.new(input)
|
27
|
+
output = ""
|
28
|
+
|
29
|
+
until scanner.eos?
|
30
|
+
c = scanner.get_byte
|
31
|
+
n = c.unpack('C').first
|
32
|
+
|
33
|
+
out_char = \
|
34
|
+
case n
|
35
|
+
|
36
|
+
# Special platform-independent encoding stuff
|
37
|
+
when 0x80
|
38
|
+
code = scanner.get_byte + scanner.get_byte
|
39
|
+
|
40
|
+
# This list has been populated by experimentation so far,
|
41
|
+
# because I haven't bothered looking for a more authoritative
|
42
|
+
# source.
|
43
|
+
case code
|
44
|
+
when "k1"; "<F1>"
|
45
|
+
when "k2"; "<F2>"
|
46
|
+
when "k3"; "<F3>"
|
47
|
+
when "k4"; "<F4>"
|
48
|
+
when "k5"; "<F5>"
|
49
|
+
when "k6"; "<F6>"
|
50
|
+
when "k7"; "<F7>"
|
51
|
+
when "k8"; "<F8>"
|
52
|
+
when "k9"; "<F9>"
|
53
|
+
when "k;"; "<F10>"
|
54
|
+
when "F1"; "<F11>"
|
55
|
+
when "F2"; "<F12>"
|
56
|
+
|
57
|
+
when "kP"; "<PageUp>"
|
58
|
+
when "kN"; "<PageDown>"
|
59
|
+
when "kh"; "<Home>"
|
60
|
+
when "@7"; "<End>"
|
61
|
+
when "kI"; "<Insert>"
|
62
|
+
when "kD"; "<Del>"
|
63
|
+
when "kb"; "<BS>"
|
64
|
+
|
65
|
+
when "ku"; "<Up>"
|
66
|
+
when "kd"; "<Down>"
|
67
|
+
when "kl"; "<Left>"
|
68
|
+
when "kr"; "<Right>"
|
69
|
+
when "#4"; "<S-Left>"
|
70
|
+
when "%i"; "<S-Right>"
|
71
|
+
|
72
|
+
when "kB"; "<S-Tab>"
|
73
|
+
when "\xffX"; "<C-Space>"
|
74
|
+
|
75
|
+
else
|
76
|
+
#puts "Unknown Vim code: #{code.inspect}"
|
77
|
+
'<%02x-%02x>' % code.unpack('CC')
|
78
|
+
end
|
79
|
+
|
80
|
+
# Control characters with special names
|
81
|
+
when 0; "<Nul>"
|
82
|
+
when 9; "<Tab>"
|
83
|
+
when 10; "<NL>"
|
84
|
+
when 13; "<CR>"
|
85
|
+
when 27; "<Esc>"
|
86
|
+
|
87
|
+
when 127; "<Del>"
|
88
|
+
|
89
|
+
# Otherwise, use <C-x> format
|
90
|
+
when 0..31; "<C-#{(n + 64).chr}>"
|
91
|
+
|
92
|
+
# The rest of ANSI is printable
|
93
|
+
when 32..126; c
|
94
|
+
|
95
|
+
else
|
96
|
+
#puts "Unexpected extended ASCII: #{'%#04x' % n}"
|
97
|
+
'<%#04x>' % n
|
98
|
+
|
99
|
+
end
|
100
|
+
|
101
|
+
yield out_char
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
data/lib/vimgolf/version.rb
CHANGED
data/spec/cli_spec.rb
CHANGED
@@ -0,0 +1 @@
|
|
1
|
+
��5ibbb�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr�kb�kb�kb�kb�kb�kb�kb�kb�kb�kb�kb�kb�kb�kb�kb�kb�kb�kb:wq
|
@@ -0,0 +1 @@
|
|
1
|
+
�kdd3di�kb�kb�kd�kr�kr�kb�kb �kd�kl�kb�ku�kr�kb�ku�kl�kr�kr�kb�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr*�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr�kl�kb�kb�kb�kb�kb�kb�kba�kd.join(',')�kr�krd$i�kr":wq
|
@@ -0,0 +1 @@
|
|
1
|
+
��5�kd�kd�kd�kdA "Vi IMproved"�kd�kd�kd�kdAa�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kli�kb�kb�kb�kb�kb�kb�kb�kb�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr�kroriginally �kd�kd�kdyyp�kddd:wq
|
@@ -0,0 +1 @@
|
|
1
|
+
��5�kdd3di�kb�kb�kd�kd�ku�ku�kb�ku�kr�kd�kd�kr�kb�kb�kd�kr�kb�ku�ku�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr�kl�kl*�kr�kr�kr�kr�kr�kr�kr�kb�kb�kb�kb�kb�kb�kd.join(',')�kr�krd$i"�kb�kr":wq
|
@@ -0,0 +1 @@
|
|
1
|
+
��5�kd�kd�kd�kdAi �kb�kb "Vi IMproved"�kd�kd�kd�kd�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kl�kr�kr�kr�kr�kr�kr originallyG�ku�ku�ku�kudwdw�kd�kd�kd�kd�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr�kr�kld$:wq
|
data/spec/keylog_spec.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require "helper"
|
2
|
+
|
3
|
+
describe VimGolf::Keylog do
|
4
|
+
include VimGolf
|
5
|
+
|
6
|
+
Dir['spec/fixtures/*'].each do |f|
|
7
|
+
it "should parse #{f} logfile" do
|
8
|
+
lambda { Keylog.convert(IO.read(f)) }.should_not raise_error
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should score #{f} logfile" do
|
12
|
+
lambda { Keylog.score(IO.read(f)) }.should_not raise_error
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/vimgolf.gemspec
CHANGED
@@ -26,8 +26,10 @@ Gem::Specification.new do |s|
|
|
26
26
|
|
27
27
|
s.post_install_message = %{
|
28
28
|
------------------------------------------------------------------------------
|
29
|
-
Thank you for installing vimgolf-#{Vimgolf::VERSION}.
|
30
|
-
|
29
|
+
Thank you for installing vimgolf-#{Vimgolf::VERSION}.
|
30
|
+
|
31
|
+
0.1.3: custom vimgolf .vimrc file to help level the playing field
|
32
|
+
0.2.0: proxy support, custom diffs + proper vimscript parser/scoring
|
31
33
|
|
32
34
|
For more information, rules & updates: http://vimgolf.com/about
|
33
35
|
------------------------------------------------------------------------------
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
8
|
-
-
|
9
|
-
version: 0.
|
7
|
+
- 2
|
8
|
+
- 0
|
9
|
+
version: 0.2.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Ilya Grigorik
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-12-
|
17
|
+
date: 2010-12-31 00:00:00 -05:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -91,10 +91,17 @@ files:
|
|
91
91
|
- lib/vimgolf.rb
|
92
92
|
- lib/vimgolf/cli.rb
|
93
93
|
- lib/vimgolf/config.rb
|
94
|
+
- lib/vimgolf/keylog.rb
|
94
95
|
- lib/vimgolf/ui.rb
|
95
96
|
- lib/vimgolf/version.rb
|
96
97
|
- spec/cli_spec.rb
|
98
|
+
- spec/fixtures/4d19832d8ae121365c00000b.log
|
99
|
+
- spec/fixtures/4d1a1c36567bac34a9000002.log
|
100
|
+
- spec/fixtures/4d1a1c69567bac34a9000004.log
|
101
|
+
- spec/fixtures/4d1a21e88ae121365c00000e.log
|
102
|
+
- spec/fixtures/4d1a34ccfa85f32065000004.log
|
97
103
|
- spec/helper.rb
|
104
|
+
- spec/keylog_spec.rb
|
98
105
|
- vimgolf.gemspec
|
99
106
|
has_rdoc: true
|
100
107
|
homepage: http://github.com/igrigorik/vimgolf
|
@@ -102,8 +109,9 @@ licenses: []
|
|
102
109
|
|
103
110
|
post_install_message: "\n\
|
104
111
|
------------------------------------------------------------------------------\n\
|
105
|
-
Thank you for installing vimgolf-0.
|
106
|
-
vimgolf .vimrc file
|
112
|
+
Thank you for installing vimgolf-0.2.0. \n\n\
|
113
|
+
0.1.3: custom vimgolf .vimrc file to help level the playing field\n\
|
114
|
+
0.2.0: proxy support, custom diffs + proper vimscript parser/scoring\n\n\
|
107
115
|
For more information, rules & updates: http://vimgolf.com/about\n\
|
108
116
|
------------------------------------------------------------------------------\n"
|
109
117
|
rdoc_options: []
|
@@ -135,4 +143,10 @@ specification_version: 3
|
|
135
143
|
summary: CLI client for vimgolf.com
|
136
144
|
test_files:
|
137
145
|
- spec/cli_spec.rb
|
146
|
+
- spec/fixtures/4d19832d8ae121365c00000b.log
|
147
|
+
- spec/fixtures/4d1a1c36567bac34a9000002.log
|
148
|
+
- spec/fixtures/4d1a1c69567bac34a9000004.log
|
149
|
+
- spec/fixtures/4d1a21e88ae121365c00000e.log
|
150
|
+
- spec/fixtures/4d1a34ccfa85f32065000004.log
|
138
151
|
- spec/helper.rb
|
152
|
+
- spec/keylog_spec.rb
|