Module: Cheat
- Extended by:
- Cheat
- Includes:
- Pager
- Included in:
- Cheat
- Defined in:
- lib/cheat.rb,
lib/cheat/diffr.rb,
lib/cheat/version.rb
Defined Under Namespace
Modules: Controllers, Helpers, Models, Views
Classes: Diffr, Version
Constant Summary
collapse
- HOST =
ARGV.include?('debug') ? 'localhost' : 'cheat.errtheblog.com'
- PORT =
ARGV.include?('debug') ? 3001 : 80
- SUFFIX =
''
Class Method Summary
collapse
Instance Method Summary
collapse
Class Method Details
.create ⇒ Object
592
593
594
|
# File 'lib/cheat/site.rb', line 592
def Cheat.create
Cheat::Models.create_schema
end
|
Instance Method Details
#add(title) ⇒ Object
166
167
168
169
170
|
# File 'lib/cheat.rb', line 166
def add(title)
body = write_to_tempfile(title)
res = post_sheet(title, body, true)
check_errors(res, title, body)
end
|
#cache_dir ⇒ Object
206
207
208
|
# File 'lib/cheat.rb', line 206
def cache_dir
mswin? ? win32_cache_dir : File.join(File.expand_path("~"), ".cheat")
end
|
#cache_file ⇒ Object
101
102
103
|
# File 'lib/cheat.rb', line 101
def cache_file
"#{cache_dir}/#{@sheet}.yml" if cache_dir
end
|
#cheat_uri ⇒ Object
109
110
111
|
# File 'lib/cheat.rb', line 109
def cheat_uri
"#{HOST}:#{PORT}#{SUFFIX}"
end
|
#check_errors(result, title, text) ⇒ Object
191
192
193
194
195
196
197
198
199
200
|
# File 'lib/cheat.rb', line 191
def check_errors(result, title, text)
if result.body =~ /<p class="error">(.+?)<\/p>/m
puts $1.gsub(/\n/, '').gsub(/<.+?>/, '').squeeze(' ').wrap(80)
puts
puts "Here's what you wrote, so it isn't lost in the void:"
puts text
else
puts "Success! Try it!", "$ cheat #{title}"
end
end
|
#clear_cache ⇒ Object
220
221
222
|
# File 'lib/cheat.rb', line 220
def clear_cache
FileUtils.rm_rf(cache_dir) if cache_dir
end
|
#clear_cache_file ⇒ Object
224
225
226
|
# File 'lib/cheat.rb', line 224
def clear_cache_file
FileUtils.rm(cache_file) if File.exists?(cache_file)
end
|
#diff_sheets(sheet, version) ⇒ Object
84
85
86
87
88
89
90
91
92
|
# File 'lib/cheat.rb', line 84
def diff_sheets(sheet, version)
return unless version =~ /^(\d+)(:(\d+))?$/
old_version, new_version = $1, $3
uri = "http://#{cheat_uri}/d/#{sheet}/#{old_version}"
uri += "/#{new_version}" if new_version
fetch_sheet(uri, false)
end
|
#edit(sheet_yaml) ⇒ Object
157
158
159
160
161
162
163
164
|
# File 'lib/cheat.rb', line 157
def edit(sheet_yaml)
sheet = YAML.load(sheet_yaml).to_a.first
sheet[-1] = sheet.last.gsub("\r", '')
body, title = write_to_tempfile(*sheet), sheet.first
return if body.strip == sheet.last.strip
res = post_sheet(title, body)
check_errors(res, title, body)
end
|
#editor ⇒ Object
202
203
204
|
# File 'lib/cheat.rb', line 202
def editor
ENV['VISUAL'] || ENV['EDITOR'] || "vim"
end
|
#execute(sheet_yaml) ⇒ Object
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
# File 'lib/cheat.rb', line 113
def execute(sheet_yaml)
sheet_body = YAML.load(sheet_yaml).to_a.flatten.last
puts "\n " + sheet_body.gsub("\r",'').gsub("\n", "\n ").wrap
puts "\nWould you like to execute the above sheet? (Y/N)"
answer = STDIN.gets
case answer.chomp
when "Y" then system YAML.load(sheet_yaml).to_a.flatten.last
when "N" then puts "Not executing sheet."
else
puts "Must be Y or N!"
end
rescue Errno::EPIPE
rescue
puts "That didn't work. Maybe try `$ cheat cheat' for help?" end
|
#fetch_sheet(uri, try_to_cache = true) ⇒ Object
38
39
40
41
42
43
44
45
46
47
48
|
# File 'lib/cheat.rb', line 38
def fetch_sheet(uri, try_to_cache = true)
open(uri, ) do |body|
sheet = body.read
FileUtils.mkdir_p(cache_dir) unless File.exists?(cache_dir)
File.open(cache_file, 'w') { |f| f.write(sheet) } if try_to_cache && has_content(sheet) && cache_file && !@edit
@edit ? edit(sheet) : show(sheet)
end
exit
rescue OpenURI::HTTPError => e
puts "Whoa, some kind of Internets error!", "=> #{e} from #{uri}"
end
|
#has_content(sheet) ⇒ Object
94
95
96
97
98
99
|
# File 'lib/cheat.rb', line 94
def has_content(sheet)
if sheet.is_a?(String)
return (sheet.length > 15) && !sheet[0,14].include?("Error!")
end
return true
end
|
105
106
107
|
# File 'lib/cheat.rb', line 105
def
{ 'User-Agent' => 'cheat!', 'Accept' => 'text/yaml' }
end
|
#list ⇒ Object
138
139
140
141
142
143
|
# File 'lib/cheat.rb', line 138
def list
if cache_dir
d = Dir.glob "#{cache_dir}/#{@sheet}*.yml"
d.each {|f| puts File.basename(f, ".yml")}
end
end
|
#parse_args(args) ⇒ Object
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
# File 'lib/cheat.rb', line 50
def parse_args(args)
puts "Looking for help? Try http://cheat.errtheblog.com or `$ cheat cheat'" and return if args.empty?
if args.delete('--clear-cache') || args.delete('--new')
clear_cache
return if args.empty?
end
if i = args.index('--diff')
diff_sheets(args.first, args[i+1])
end
show_versions(args.first) if args.delete('--versions')
list if args.delete('--list')
add(args.shift) and return if args.delete('--add')
incoming_file = true if @edit = args.delete('--edit')
@execute = true if args.delete("--execute") || args.delete("-x")
@offline = true if args.delete("--local") || args.delete("-l")
@sheet = args.shift
clear_cache_file if incoming_file
true
end
|
#post_sheet(title, body, new = false) ⇒ Object
172
173
174
175
176
|
# File 'lib/cheat.rb', line 172
def post_sheet(title, body, new = false)
uri = "http://#{cheat_uri}/w/"
uri += title unless new
Net::HTTP.post_form(URI.parse(uri), "sheet_title" => title, "sheet_body" => body.strip, "from_gem" => true)
end
|
#process(sheet_yaml) ⇒ Object
130
131
132
133
134
135
136
|
# File 'lib/cheat.rb', line 130
def process(sheet_yaml)
if @execute
execute(sheet_yaml)
else
show(sheet_yaml)
end
end
|
#sheets(args) ⇒ Object
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
# File 'lib/cheat.rb', line 17
def sheets(args)
args = args.dup
return unless parse_args(args)
FileUtils.mkdir(cache_dir) unless File.exists?(cache_dir) if cache_dir
uri = "http://#{cheat_uri}/y/"
if @offline
return process(File.read(cache_file)) if File.exists?(cache_file) rescue clear_cache if cache_file
else
if %w[sheets all recent].include? @sheet
uri = uri.sub('/y/', @sheet == 'recent' ? '/yr/' : '/ya/')
return open(uri, ) { |body| process(body.read) }
end
return process(File.read(cache_file)) if File.exists?(cache_file) rescue clear_cache if cache_file
fetch_sheet(uri + @sheet) if @sheet
end
end
|
#show(sheet_yaml) ⇒ Object
145
146
147
148
149
150
151
152
153
154
155
|
# File 'lib/cheat.rb', line 145
def show(sheet_yaml)
sheet = YAML.load(sheet_yaml).to_a.first
sheet[-1] = sheet.last.join("\n") if sheet[-1].is_a?(Array)
page
puts sheet.first + ':'
puts ' ' + sheet.last.gsub("\r",'').gsub("\n", "\n ").wrap
rescue Errno::EPIPE
rescue
puts "That didn't work. Maybe try `$ cheat cheat' for help?" end
|
#show_versions(sheet) ⇒ Object
$ cheat greader –versions
79
80
81
|
# File 'lib/cheat.rb', line 79
def show_versions(sheet)
fetch_sheet("http://#{cheat_uri}/h/#{sheet}/", false)
end
|
#win32_cache_dir ⇒ Object
210
211
212
213
214
215
216
217
218
|
# File 'lib/cheat.rb', line 210
def win32_cache_dir
unless File.exists?(home = ENV['HOMEDRIVE'] + ENV['HOMEPATH'])
puts "No HOMEDRIVE or HOMEPATH environment variable. Set one to save a" +
"local cache of cheat sheets."
return false
else
return File.join(home, 'Cheat')
end
end
|
#write_to_tempfile(title, body = nil) ⇒ Object
178
179
180
181
182
183
184
185
186
187
188
189
|
# File 'lib/cheat.rb', line 178
def write_to_tempfile(title, body = nil)
tempfile = Tempfile.new(title + '.cheat')
tempfile.write(body) if body
tempfile.close
system "#{editor} #{tempfile.path}"
tempfile.open
body = tempfile.read
tempfile.close
body
end
|