Can not create gist, when data too complex.
wsdjeg opened this issue · 1 comments
wsdjeg commented
I am working on an lib Github-api.vim, I just impl the api of gist, but there are some issues.
here is my two func for create gist.
""
" @public
" Create a gist
"
" POST : /gists
" Input: >
" {
" "description": "the description for this gist",
" "public": true,
" "files": {
" "file1.txt": {
" "content": "String file contents"
" }
" }
" }
" <
function! githubapi#gist#Create(desc,filename,content,public,user,password) abort
let data = {}
let data.description = a:desc
let data.public = a:public
call extend(data, {'files': {a:filename : {'content' :a:content}}})
return githubapi#util#Get('gists', " -d '" . json_encode(data) . "' -X POST -u " . a:user . ':' .a:password)
endfunction
function! githubapi#util#Get(url,args) abort
let cmd = 'curl -s "' .g:githubapi_root_url . a:url . '"'
if !empty(a:args)
let cmd = cmd . a:args
endif
call githubapi#util#log('util#Get cmd : ' . cmd)
let result = join(systemlist(cmd),"\n")
return empty(result) ? result : json_decode(result)
endfunction
if I run
echo githubapi#gist#Create('test create','test.text','hello word','true','wsdjeg','mypassword').html_url
then I can see the url of the created gist.
but if I run
echo githubapi#gist#Create('test create','test.text',join(getline(1,'$'), "\n"),'true','wsdjeg','mypassword').html_url
I get a lot of error.
wsdjeg commented
let's see the diff of json_encode()
and webapi#json#encode()
json_encode
{"files": {"test.vim": {"content": "\"\"\n\" @public\n\" List public gists for the specified user:\n\"\n\" GET /users/:username/gists\nfunction! githubapi#gist#List(user) abort\n return githubapi#util#Get(join(['users', a:user, 'gists'], '/'), '')\nendfunction\n\n\"\"\n\" @public\n\" List the authenticated user's gists or if called anonymously, this will return all public gists:\n\"\n\" GET /gists\nfunction! githubapi#gist#ListAll(user,password) abort\n if empty(a:user) || empty(a:password)\n return githubapi#util#Get('gists','')\n else\n return githubapi#util#Get('gists',' -u ' . a:user . ':' . a:password)\n endif\nendfunction\n\n\"\"\n\" @public\n\" List all public gists\n\"\n\" Get /gists/public\nfunction! githubapi#gist#ListPublic(since) abort\n let url = 'gists/public'\n if !empty(a:since)\n let url = url . '?since=' . a:since\n endif\n return githubapi#util#Get(url, '')\nendfunction\n\n\"\"\n\" @public\n\" List starred gists,{since}A timestamp in ISO 8601 format: YYYY-MM-DDTHH:MM:SSZ.\n\" Only gists updated at or after this time are returned.\n\"\n\" GET /gists/starred\nfunction! githubapi#gist#ListStarred(user,password,since) abort\n let url = 'gists/starred'\n if !empty(a:since)\n let url = url . '?since=' . a:since\n endif\n return githubapi#util#Get(url,' -u ' . a:user . ':' . a:password)\nendfunction\n\n\"\"\n\" @public\n\" Get a single gist\n\"\n\" Github API : GET /gists/:id\nfunction! githubapi#gist#GetSingle(id) abort\n return githubapi#util#Get('gists/' . a:id, '')\nendfunction\n\n\"\"\n\" @public\n\" Get a specific revision of a gist\n\"\n\" Github API : GET /gists/:id/:sha\nfunction! githubapi#gist#GetSingleSha(id,sha) abort\n return githubapi#util#Get(join(['gists', a:id, a:sha], '/'), '')\nendfunction\n\n\"\"\n\" @public\n\" Create a gist\n\"\n\" POST : /gists\n\" Input: >\n\" {\n\" \"description\": \"the description for this gist\",\n\" \"public\": true,\n\" \"files\": {\n\" \"file1.txt\": {\n\" \"content\": \"String file contents\"\n\" }\n\" }\n\" }\n\" <\nfunction! githubapi#gist#Create(desc,filename,content,public,user,password) abort\n let data = {}\n let data.description = a:desc\n let data.public = a:public\n call extend(data, {'files': {a:filename : {'content' :a:content}}})\n return githubapi#util#Get('gists', \" -d '\" . json_encode(data) . \"' -X POST -u \" . a:user . ':' .a:password)\nendfunction\n\n\n\"\"\n\" @public\n\" Edit a gist\n\"\n\" PATCH : /gists/:id\n\" Input: >\n\" {\n\" \"description\": \"the description for this gist\",\n\" \"files\": {\n\" \"file1.txt\": {\n\" \"content\": \"updated file contents\"\n\" },\n\" \"old_name.txt\": {\n\" \"filename\": \"new_name.txt\",\n\" \"content\": \"modified contents\"\n\" },\n\" \"new_file.txt\": {\n\" \"content\": \"a new file\"\n\" },\n\" \"delete_this_file.txt\": null\n\" }\n\" }\n\" <\n\" Note: All files from the previous version of the gist are carried over by default\n\" if not included in the object. Deletes can be performed by including the filename\n\" with a null object.\nfunction! githubapi#gist#Edit(desc,filename,content,public,user,password,id) abort\n let data = {}\n let data.description = a:desc\n let data.public = a:public\n call extend(data, {'files': {a:filename : {'content' :a:content}}})\n return githubapi#util#Get('gists/' . a:id, \" -d '\" . json_encode(data) . \"' -X PATCH -u \" . a:user . ':' .a:password)\nendfunction\n\n\"\"\n\" @public\n\" List gist commits\n\"\n\" Github API : GET /gists/:id/commits\nfunction! githubapi#gitst#ListCommits(id) abort\n return githubapi#util#Get(join(['gists', a:id, 'commits'], '/'), '')\nendfunction\n\n\"\"\n\" @public\n\" Star a gist\n\"\n\" Github API : PUT /gists/:id/star\nfunction! githubapi#gist#Star(user,password,id) abort\n return githubapi#util#GetStatus(join(['gists', a:id, 'star'], '/'),\n \\ ' -X PUT -u ' . a:user . ':' . a:password) == 204\nendfunction\n\n\"\"\n\" @public\n\" Unstar a gist\n\"\n\" Github API : DELETE /gists/:id/star\nfunction! githubapi#gist#Unstar(user,password,id) abort\n return githubapi#util#GetStatus(join(['gists', a:id, 'star'], '/'),\n \\ ' -X DELETE -u ' . a:user . ':' . a:password) == 204\nendfunction\n\n\"\"\n\" @public\n\" Check if a gist is starred\n\"\n\" Github API : GET /gists/:id/star\nfunction! githubapi#gist#CheckStar(user,password,id) abort\n return githubapi#util#GetStatus(join(['gists', a:id, 'star'], '/'),\n \\ ' -u ' . a:user . ':' . a:password) == 204\nendfunction\n\n\"\"\n\" @public\n\" Fork a gist\n\"\n\" Github API : POST /gists/:id/forks\nfunction! githubapi#gist#Fork(user,password,id) abort\n return githubapi#util#Get(join(['gists', a:id, 'forks'], '/'),\n \\ ' -X POST -u ' . a:user . ':' . a:password)\nendfunction\n\n\"\"\n\" @public\n\" List Fork of a gist\n\"\n\" Github API : GET /gists/:id/forks\nfunction! githubapi#gist#ListFork(user,password,id) abort\n return githubapi#util#Get(join(['gists', a:id, 'forks'], '/'),\n \\ ' -u ' . a:user . ':' . a:password)\nendfunction\n\n\"\"\n\" @public\n\" Delete a gist\n\"\n\" Github API : DELETE /gists/:id\nfunction! githubapi#gist#Del(user,password,id) abort\n return githubapi#util#GetStatus(join(['gists', a:id], '/'),\n \\ ' -X DELETE -u ' . a:user . ':' . a:password) == 204\nendfunction"}}, "description": "desc", "public": "true"}
webapi
{"files":{"test.vim":{"content":"\"\"\n\" @public\n\" List public gists for the specified user:\n\"\n\" GET /users/:username/gists\nfunction! githubapi#gist#List(user) abort\n return githubapi#util#Get(join(['users', a:user, 'gists'], '/'), '')\nendfunction\n\n\"\"\n\" @public\n\" List the authenticated user's gists or if called anonymously, this will return all public gists:\n\"\n\" GET /gists\nfunction! githubapi#gist#ListAll(user,password) abort\n if empty(a:user) || empty(a:password)\n return githubapi#util#Get('gists','')\n else\n return githubapi#util#Get('gists',' -u ' . a:user . ':' . a:password)\n endif\nendfunction\n\n\"\"\n\" @public\n\" List all public gists\n\"\n\" Get /gists/public\nfunction! githubapi#gist#ListPublic(since) abort\n let url = 'gists/public'\n if !empty(a:since)\n let url = url . '?since=' . a:since\n endif\n return githubapi#util#Get(url, '')\nendfunction\n\n\"\"\n\" @public\n\" List starred gists,{since}A timestamp in ISO 8601 format: YYYY-MM-DDTHH:MM:SSZ.\n\" Only gists updated at or after this time are returned.\n\"\n\" GET /gists/starred\nfunction! githubapi#gist#ListStarred(user,password,since) abort\n let url = 'gists/starred'\n if !empty(a:since)\n let url = url . '?since=' . a:since\n endif\n return githubapi#util#Get(url,' -u ' . a:user . ':' . a:password)\nendfunction\n\n\"\"\n\" @public\n\" Get a single gist\n\"\n\" Github API : GET /gists/:id\nfunction! githubapi#gist#GetSingle(id) abort\n return githubapi#util#Get('gists/' . a:id, '')\nendfunction\n\n\"\"\n\" @public\n\" Get a specific revision of a gist\n\"\n\" Github API : GET /gists/:id/:sha\nfunction! githubapi#gist#GetSingleSha(id,sha) abort\n return githubapi#util#Get(join(['gists', a:id, a:sha], '/'), '')\nendfunction\n\n\"\"\n\" @public\n\" Create a gist\n\"\n\" POST : /gists\n\" Input: >\n\" {\n\" \"description\": \"the description for this gist\",\n\" \"public\": true,\n\" \"files\": {\n\" \"file1.txt\": {\n\" \"content\": \"String file contents\"\n\" }\n\" }\n\" }\n\" <\nfunction! githubapi#gist#Create(desc,filename,content,public,user,password) abort\n let data = {}\n let data.description = a:desc\n let data.public = a:public\n call extend(data, {'files': {a:filename : {'content' :a:content}}})\n return githubapi#util#Get('gists', \" -d '\" . json_encode(data) . \"' -X POST -u \" . a:user . ':' .a:password)\nendfunction\n\n\n\"\"\n\" @public\n\" Edit a gist\n\"\n\" PATCH : /gists/:id\n\" Input: >\n\" {\n\" \"description\": \"the description for this gist\",\n\" \"files\": {\n\" \"file1.txt\": {\n\" \"content\": \"updated file contents\"\n\" },\n\" \"old_name.txt\": {\n\" \"filename\": \"new_name.txt\",\n\" \"content\": \"modified contents\"\n\" },\n\" \"new_file.txt\": {\n\" \"content\": \"a new file\"\n\" },\n\" \"delete_this_file.txt\": null\n\" }\n\" }\n\" <\n\" Note: All files from the previous version of the gist are carried over by default\n\" if not included in the object. Deletes can be performed by including the filename\n\" with a null object.\nfunction! githubapi#gist#Edit(desc,filename,content,public,user,password,id) abort\n let data = {}\n let data.description = a:desc\n let data.public = a:public\n call extend(data, {'files': {a:filename : {'content' :a:content}}})\n return githubapi#util#Get('gists/' . a:id, \" -d '\" . json_encode(data) . \"' -X PATCH -u \" . a:user . ':' .a:password)\nendfunction\n\n\"\"\n\" @public\n\" List gist commits\n\"\n\" Github API : GET /gists/:id/commits\nfunction! githubapi#gitst#ListCommits(id) abort\n return githubapi#util#Get(join(['gists', a:id, 'commits'], '/'), '')\nendfunction\n\n\"\"\n\" @public\n\" Star a gist\n\"\n\" Github API : PUT /gists/:id/star\nfunction! githubapi#gist#Star(user,password,id) abort\n return githubapi#util#GetStatus(join(['gists', a:id, 'star'], '/'),\n \\ ' -X PUT -u ' . a:user . ':' . a:password) == 204\nendfunction\n\n\"\"\n\" @public\n\" Unstar a gist\n\"\n\" Github API : DELETE /gists/:id/star\nfunction! githubapi#gist#Unstar(user,password,id) abort\n return githubapi#util#GetStatus(join(['gists', a:id, 'star'], '/'),\n \\ ' -X DELETE -u ' . a:user . ':' . a:password) == 204\nendfunction\n\n\"\"\n\" @public\n\" Check if a gist is starred\n\"\n\" Github API : GET /gists/:id/star\nfunction! githubapi#gist#CheckStar(user,password,id) abort\n return githubapi#util#GetStatus(join(['gists', a:id, 'star'], '/'),\n \\ ' -u ' . a:user . ':' . a:password) == 204\nendfunction\n\n\"\"\n\" @public\n\" Fork a gist\n\"\n\" Github API : POST /gists/:id/forks\nfunction! githubapi#gist#Fork(user,password,id) abort\n return githubapi#util#Get(join(['gists', a:id, 'forks'], '/'),\n \\ ' -X POST -u ' . a:user . ':' . a:password)\nendfunction\n\n\"\"\n\" @public\n\" List Fork of a gist\n\"\n\" Github API : GET /gists/:id/forks\nfunction! githubapi#gist#ListFork(user,password,id) abort\n return githubapi#util#Get(join(['gists', a:id, 'forks'], '/'),\n \\ ' -u ' . a:user . ':' . a:password)\nendfunction\n\n\"\"\n\" @public\n\" Delete a gist\n\"\n\" Github API : DELETE /gists/:id\nfunction! githubapi#gist#Del(user,password,id) abort\n return githubapi#util#GetStatus(join(['gists', a:id], '/'),\n \\ ' -X DELETE -u ' . a:user . ':' . a:password) == 204\nendfunction"}},"description":"desc","public":"true"}