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

.createObject



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_dirObject



206
207
208
# File 'lib/cheat.rb', line 206

def cache_dir
  mswin? ? win32_cache_dir : File.join(File.expand_path("~"), ".cheat")
end

#cache_fileObject



101
102
103
# File 'lib/cheat.rb', line 101

def cache_file
  "#{cache_dir}/#{@sheet}.yml" if cache_dir
end

#cheat_uriObject



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_cacheObject



220
221
222
# File 'lib/cheat.rb', line 220

def clear_cache
  FileUtils.rm_rf(cache_dir) if cache_dir
end

#clear_cache_fileObject



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

$ cheat greader –diff 1



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

#editorObject



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
  # do nothing
rescue
  puts "That didn't work.  Maybe try `$ cheat cheat' for help?" # Fix Emacs ruby-mode highlighting bug: `"
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, headers) 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

#headersObject



105
106
107
# File 'lib/cheat.rb', line 105

def headers
  { 'User-Agent' => 'cheat!', 'Accept' => 'text/yaml' }
end

#listObject



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")
  # use offline (use cached versions only) if no active connection to internet
  @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, headers) { |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
  # do nothing
rescue
  puts "That didn't work.  Maybe try `$ cheat cheat' for help?" # Fix Emacs ruby-mode highlighting bug: `"
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_dirObject



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)
  # god dammit i hate tempfile, this is so messy but i think it's
  # the only way.
  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