Module: Cheat

Extended by:
Cheat
Included in:
Cheat
Defined in:
lib/cheat.rb,
lib/diffr.rb,
lib/new_cheat.rb,
lib/cheat/commands.rb

Defined Under Namespace

Modules: Controllers Classes: Commands, Diffr

Constant Summary collapse

HOST =
ARGV.include?('debug') ? 'localhost' : 'cheat.errtheblog.com'
PORT =
ARGV.include?('debug') ? 3001 : 80
SUFFIX =
''

Instance Method Summary collapse

Instance Method Details

#add(title) ⇒ Object



109
110
111
112
113
# File 'lib/cheat.rb', line 109

def add(title)
  body = write_to_tempfile(title)
  res = post_sheet(title, body, true)
  check_errors(res, title, body)
end

#cache_dirObject



149
150
151
# File 'lib/cheat.rb', line 149

def cache_dir
  PLATFORM =~ /win32/ ? win32_cache_dir : File.join(File.expand_path("~"), ".cheat")
end

#cache_fileObject



79
80
81
# File 'lib/cheat.rb', line 79

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

#cheat_uriObject



87
88
89
# File 'lib/cheat.rb', line 87

def cheat_uri
  "#{HOST}:#{PORT}#{SUFFIX}"
end

#check_errors(result, title, text) ⇒ Object



134
135
136
137
138
139
140
141
142
143
# File 'lib/cheat.rb', line 134

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} --new"
  end
end

#clear_cacheObject



163
164
165
# File 'lib/cheat.rb', line 163

def clear_cache
  FileUtils.rm_rf(cache_dir) if cache_dir
end

#diff_sheets(sheet, version) ⇒ Object

$ cheat greader --diff 1



69
70
71
72
73
74
75
76
77
# File 'lib/cheat.rb', line 69

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



100
101
102
103
104
105
106
107
# File 'lib/cheat.rb', line 100

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



145
146
147
# File 'lib/cheat.rb', line 145

def editor
  ENV['VISUAL'] || ENV['EDITOR'] || "vim" 
end

#fetch_sheet(uri, try_to_cache = true) ⇒ Object



30
31
32
33
34
35
36
37
38
39
# File 'lib/cheat.rb', line 30

def fetch_sheet(uri, try_to_cache = true)
  open(uri, headers) do |body|
    sheet = body.read
    File.open(cache_file, 'w') { |f| f.write(sheet) } if try_to_cache && 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

#headersObject



83
84
85
# File 'lib/cheat.rb', line 83

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

#parse_args(args) ⇒ Object



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/cheat.rb', line 41

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')

  add(args.shift) and return if args.delete('--add')
  clear_cache if @edit = args.delete('--edit')

  @sheet = args.shift

  true
end

#post_sheet(title, body, new = false) ⇒ Object



115
116
117
118
119
# File 'lib/cheat.rb', line 115

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

#sheets(args) ⇒ Object



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/cheat.rb', line 11

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 %w[sheets all recent].include? @sheet
    uri = uri.sub('/y/', @sheet == 'recent' ? '/yr/' : '/ya/')
    return open(uri) { |body| show(body.read) } 
  end

  return show(File.read(cache_file)) if File.exists?(cache_file) rescue clear_cache if cache_file 

  fetch_sheet(uri + @sheet) if @sheet
end

#show(sheet_yaml) ⇒ Object



91
92
93
94
95
96
97
98
# File 'lib/cheat.rb', line 91

def show(sheet_yaml)
  sheet = YAML.load(sheet_yaml).to_a.first
  sheet[-1] = sheet.last.join("\n") if sheet[-1].is_a?(Array)
  puts sheet.first + ':'
  puts '  ' + sheet.last.gsub("\r",'').gsub("\n", "\n  ").wrap
rescue
  puts "That didn't work.  Maybe try `$ cheat cheat' for help?"
end

#show_versions(sheet) ⇒ Object

$ cheat greader --versions



64
65
66
# File 'lib/cheat.rb', line 64

def show_versions(sheet)
  fetch_sheet("http://#{cheat_uri}/h/#{sheet}/", false)
end

#win32_cache_dirObject



153
154
155
156
157
158
159
160
161
# File 'lib/cheat.rb', line 153

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



121
122
123
124
125
126
127
128
129
130
131
132
# File 'lib/cheat.rb', line 121

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