wsdjeg/GitHub.vim

Can not create gist, when data too complex.

wsdjeg opened this issue · 1 comments

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.

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