#!/usr/bin/env python
"""
ideone.com paster
"""
from sys import stdin, stderr
from SOAPpy import WSDL
import sys, getopt
#settings
IDEONE_SERVICE = 'http://i...content-available-to-author-only...e.com/api/1/service.wsdl'
USER = 'test'
PASS = 'test'
LANG = 'text'
#language code tables
LANGS_CODE = {
'ada' : 7,
'assembler' : 13,
'awk' : 104,
'bash' : 28,
'c' : 11,
'c++' : 1,
'clojure' : 111,
'clisp' : 32,
'erlang' : 36,
'haskell' : 21,
'java' : 10,
'lua' : 26,
'ocaml' : 8,
'perl' : 3,
'swipl' : 15,
'python' : 4,
'scala' : 39,
'text' : 62,
'default' : 62
}
def getLangCode(lang):
if LANGS_CODE.has_key(lang):
return LANGS_CODE[lang]
return LANGS_CODE['default']
# error handling
ERROR_MESSAGES = {
'AUTH_ERROR' : "User name or user's password are invalid.",
'PASTE_NOT_FOUND' : "Paste with specified link could not be found.",
'WRONG_LANG_ID' : "Language with specified id does not exist."
}
def printErrorAndDie(error):
msg = 'unknown error'
if ERROR_MESSAGES.has_key(error):
msg = ERROR_MESSAGES[error]
stderr.print_line(msg)
exit(1)
def getErrorCode(resp):
return resp['item']['value']['item'][0]['value']
def isError(resp):
return resp['item'][0] == 'error'
#options handling
USAGE = """
cat somefile | ideone.py [KEY]...
or
ideone.py file1 file2 file3
KEYS:
-h - this usage
-u 'user' - set ideone's username to 'user'
-p 'pass' - set ideone's password to 'pass'
-l 'lang' - set code's language to 'lang'
"""
def usage():
print USAGE
exit(0)
def changeUser(newUser):
global USER
USER = newUser
def changePass(newPass):
global PASS
PASS = newPass
def changeLang(newLang):
global LANG
LANG = newLang
CHANGE_ARGS = {
'-u': changeUser,
'-p': changePass,
'-l': changeLang
}
FLAG_ARGS = {
'-h': usage
}
def parseArgs(args):
copts = CHANGE_ARGS.keys()
fopts = FLAG_ARGS.keys()
return getopt.getopt(args,
''.join(map(lambda arg: arg.replace('-', '') + ':', copts)) +
''.join(map(lambda arg: arg.replace('-', ''), fopts)))
def applyOpts(optlist):
for opt in optlist:
if opt[1] != '':
CHANGE_ARGS[opt[0]](opt[1])
else:
FLAG_ARGS[opt[0]]()
#ideone wsdl client
IDEONE = WSDL.Proxy(IDEONE_SERVICE)
def paste(file):
source = file.read()
response = IDEONE.createSubmission(USER, PASS, source, getLangCode(LANG), '', False, False)
res = ''
if isError(response):
printErrorAndDie(getErrorCode(response))
else:
return "http://i...content-available-to-author-only...e.com/%s" % (response['item'][1]['value'])
optlist, filelist = parseArgs(sys.argv[1:])
applyOpts(optlist)
if filelist == []:
print paste(stdin)
else:
for filename in filelist:
file = open(filename, "r")
print paste(file)
file.close()
IyEvdXNyL2Jpbi9lbnYgcHl0aG9uCiIiIgppZGVvbmUuY29tIHBhc3RlcgoiIiIKCmZyb20gc3lzIGltcG9ydCBzdGRpbiwgc3RkZXJyCmZyb20gU09BUHB5IGltcG9ydCBXU0RMCmltcG9ydCBzeXMsIGdldG9wdAoKCiNzZXR0aW5ncwpJREVPTkVfU0VSVklDRSA9ICdodHRwOi8vaS4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uZS5jb20vYXBpLzEvc2VydmljZS53c2RsJwpVU0VSID0gJ3Rlc3QnClBBU1MgPSAndGVzdCcKTEFORyA9ICd0ZXh0JwoKCiNsYW5ndWFnZSBjb2RlIHRhYmxlcwpMQU5HU19DT0RFID0gewogICAgICAgICdhZGEnICAgICAgIDogNywKICAgICAgICAnYXNzZW1ibGVyJyA6IDEzLAogICAgICAgICdhd2snICAgICAgIDogMTA0LAogICAgICAgICdiYXNoJyAgICAgIDogMjgsCiAgICAgICAgJ2MnICAgICAgICAgOiAxMSwKICAgICAgICAnYysrJyAgICAgICA6IDEsCiAgICAgICAgJ2Nsb2p1cmUnICAgOiAxMTEsCiAgICAgICAgJ2NsaXNwJyAgICAgOiAzMiwKICAgICAgICAnZXJsYW5nJyAgICA6IDM2LAogICAgICAgICdoYXNrZWxsJyAgIDogMjEsCiAgICAgICAgJ2phdmEnICAgICAgOiAxMCwKICAgICAgICAnbHVhJyAgICAgICA6IDI2LAogICAgICAgICdvY2FtbCcgICAgIDogOCwKICAgICAgICAncGVybCcgICAgICA6IDMsCiAgICAgICAgJ3N3aXBsJyAgICAgOiAxNSwKICAgICAgICAncHl0aG9uJyAgICA6IDQsCiAgICAgICAgJ3NjYWxhJyAgICAgOiAzOSwKICAgICAgICAndGV4dCcgICAgICA6IDYyLAogICAgICAgICdkZWZhdWx0JyAgIDogNjIKfQoKZGVmIGdldExhbmdDb2RlKGxhbmcpOgogICAgaWYgTEFOR1NfQ09ERS5oYXNfa2V5KGxhbmcpOgogICAgICAgIHJldHVybiBMQU5HU19DT0RFW2xhbmddCiAgICByZXR1cm4gTEFOR1NfQ09ERVsnZGVmYXVsdCddCgoKIyBlcnJvciBoYW5kbGluZwpFUlJPUl9NRVNTQUdFUyA9IHsKICAgICAgICAnQVVUSF9FUlJPUicgICAgICAgIDogIlVzZXIgbmFtZSBvciB1c2VyJ3MgcGFzc3dvcmQgYXJlIGludmFsaWQuIiwKICAgICAgICAnUEFTVEVfTk9UX0ZPVU5EJyAgIDogIlBhc3RlIHdpdGggc3BlY2lmaWVkIGxpbmsgY291bGQgbm90IGJlIGZvdW5kLiIsCiAgICAgICAgJ1dST05HX0xBTkdfSUQnICAgICA6ICJMYW5ndWFnZSB3aXRoIHNwZWNpZmllZCBpZCBkb2VzIG5vdCBleGlzdC4iCn0KCmRlZiBwcmludEVycm9yQW5kRGllKGVycm9yKToKICAgIG1zZyA9ICd1bmtub3duIGVycm9yJwogICAgaWYgRVJST1JfTUVTU0FHRVMuaGFzX2tleShlcnJvcik6CiAgICAgICAgbXNnID0gRVJST1JfTUVTU0FHRVNbZXJyb3JdCiAgICBzdGRlcnIucHJpbnRfbGluZShtc2cpCiAgICBleGl0KDEpCgpkZWYgZ2V0RXJyb3JDb2RlKHJlc3ApOgogICAgcmV0dXJuIHJlc3BbJ2l0ZW0nXVsndmFsdWUnXVsnaXRlbSddWzBdWyd2YWx1ZSddIAoKZGVmIGlzRXJyb3IocmVzcCk6CiAgICByZXR1cm4gcmVzcFsnaXRlbSddWzBdID09ICdlcnJvcicKCgojb3B0aW9ucyBoYW5kbGluZwpVU0FHRSA9ICIiIgpjYXQgc29tZWZpbGUgfCBpZGVvbmUucHkgW0tFWV0uLi4Kb3IKaWRlb25lLnB5IGZpbGUxIGZpbGUyIGZpbGUzCgogICAgS0VZUzoKICAgIC1oICAgICAgLSB0aGlzIHVzYWdlCiAgICAtdSAndXNlcicgLSBzZXQgaWRlb25lJ3MgdXNlcm5hbWUgdG8gJ3VzZXInCiAgICAtcCAncGFzcycgLSBzZXQgaWRlb25lJ3MgcGFzc3dvcmQgdG8gJ3Bhc3MnCiAgICAtbCAnbGFuZycgLSBzZXQgY29kZSdzIGxhbmd1YWdlIHRvICdsYW5nJwoiIiIKCmRlZiB1c2FnZSgpOgogICAgcHJpbnQgVVNBR0UKICAgIGV4aXQoMCkKCmRlZiBjaGFuZ2VVc2VyKG5ld1VzZXIpOgogICAgZ2xvYmFsIFVTRVIKICAgIFVTRVIgPSBuZXdVc2VyCgpkZWYgY2hhbmdlUGFzcyhuZXdQYXNzKToKICAgIGdsb2JhbCBQQVNTCiAgICBQQVNTID0gbmV3UGFzcwoKZGVmIGNoYW5nZUxhbmcobmV3TGFuZyk6CiAgICBnbG9iYWwgTEFORwogICAgTEFORyA9IG5ld0xhbmcKCkNIQU5HRV9BUkdTID0gewogICAgICAgICctdSc6IGNoYW5nZVVzZXIsCiAgICAgICAgJy1wJzogY2hhbmdlUGFzcywKICAgICAgICAnLWwnOiBjaGFuZ2VMYW5nCn0KCkZMQUdfQVJHUyA9IHsKICAgICAgICAnLWgnOiB1c2FnZQp9CgpkZWYgcGFyc2VBcmdzKGFyZ3MpOgogICAgY29wdHMgPSBDSEFOR0VfQVJHUy5rZXlzKCkKICAgIGZvcHRzID0gRkxBR19BUkdTLmtleXMoKQogICAgcmV0dXJuIGdldG9wdC5nZXRvcHQoYXJncywKICAgICAgICAgICAgJycuam9pbihtYXAobGFtYmRhIGFyZzogYXJnLnJlcGxhY2UoJy0nLCAnJykgKyAnOicsIGNvcHRzKSkgKwogICAgICAgICAgICAnJy5qb2luKG1hcChsYW1iZGEgYXJnOiBhcmcucmVwbGFjZSgnLScsICcnKSwgZm9wdHMpKSkKCmRlZiBhcHBseU9wdHMob3B0bGlzdCk6CiAgICBmb3Igb3B0IGluIG9wdGxpc3Q6CiAgICAgICAgaWYgb3B0WzFdICE9ICcnOgogICAgICAgICAgICBDSEFOR0VfQVJHU1tvcHRbMF1dKG9wdFsxXSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBGTEFHX0FSR1Nbb3B0WzBdXSgpCgojaWRlb25lIHdzZGwgY2xpZW50CklERU9ORSA9IFdTREwuUHJveHkoSURFT05FX1NFUlZJQ0UpCgpkZWYgcGFzdGUoZmlsZSk6CiAgICBzb3VyY2UgPSBmaWxlLnJlYWQoKQogICAgcmVzcG9uc2UgPSBJREVPTkUuY3JlYXRlU3VibWlzc2lvbihVU0VSLCBQQVNTLCBzb3VyY2UsIGdldExhbmdDb2RlKExBTkcpLCAnJywgRmFsc2UsIEZhbHNlKQogICAgcmVzID0gJycKICAgIGlmIGlzRXJyb3IocmVzcG9uc2UpOgogICAgICAgIHByaW50RXJyb3JBbmREaWUoZ2V0RXJyb3JDb2RlKHJlc3BvbnNlKSkKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuICJodHRwOi8vaS4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uZS5jb20vJXMiICUgKHJlc3BvbnNlWydpdGVtJ11bMV1bJ3ZhbHVlJ10pCgoKb3B0bGlzdCwgZmlsZWxpc3QgPSBwYXJzZUFyZ3Moc3lzLmFyZ3ZbMTpdKQphcHBseU9wdHMob3B0bGlzdCkKCmlmIGZpbGVsaXN0ID09IFtdOgogICAgcHJpbnQgcGFzdGUoc3RkaW4pCmVsc2U6CiAgICBmb3IgZmlsZW5hbWUgaW4gZmlsZWxpc3Q6CiAgICAgICAgZmlsZSA9IG9wZW4oZmlsZW5hbWUsICJyIikKICAgICAgICBwcmludCBwYXN0ZShmaWxlKQogICAgICAgIGZpbGUuY2xvc2UoKQoK