1
0
mirror of https://github.com/SpaceVim/SpaceVim.git synced 2025-02-04 02:30:04 +08:00
SpaceVim/bundle/github.vim/autoload/github/api/search.vim
2022-04-28 21:46:05 +08:00

193 lines
5.9 KiB
VimL
Vendored

""
" @public
" Search for repos, for how to {sort} result, you can use `stars`,`forks` and
" `updated`. and for {order} you can use `asc` and `desc`.for {q} see:
" Input: >
" {
" 'in' : 'name,description',
" 'size' : '',
" 'forks' : '',
" 'fork' : '',
" 'created' : '',
" 'pushed' : '',
" 'user' : '',
" 'language' : '',
" 'stars' : '',
" 'keywords' : ''
" }
" <
"
" Github API : GET /search/repositories
function! github#api#search#SearchRepos(q,sort,order) abort
let url = 'search/repositories'
let _sort = ['stars', 'forks', 'updated']
let _order = ['asc', 'desc']
let url = github#api#util#parserArgs(url, 'sort', a:sort, _sort, '')
if index(_sort, a:sort) != -1
let url = github#api#util#parserArgs(url, 'order', a:order, _order, 'desc')
endif
if stridx(url, '?') == -1
let url .= '?'
else
let url .= '&'
endif
let url .= s:parser(a:q, s:repo_scopes)
return github#api#util#Get(url, [])
endfunction
function! github#api#search#SearchCode(q,sort,order) abort
let url = 'search/code'
let _sort = ['indexed']
let _order = ['asc', 'desc']
let url = github#api#util#parserArgs(url, 'sort', a:sort, _sort, '')
if index(_sort, a:sort) != -1
let url = github#api#util#parserArgs(url, 'order', a:order, _order, 'desc')
endif
if stridx(url, '?') == -1
let url .= '?'
else
let url .= '&'
endif
let url .= s:parser(a:q, s:code_scopes)
return github#api#util#Get(url, [])
endfunction
function! github#api#search#SearchIssues(q,sort,order) abort
let url = 'search/issues'
let _sort = ['comments', 'created', 'updated']
let _order = ['asc', 'desc']
let url = github#api#util#parserArgs(url, 'sort', a:sort, _sort, '')
if index(_sort, a:sort) != -1
let url = github#api#util#parserArgs(url, 'order', a:order, _order, 'desc')
endif
if stridx(url, '?') == -1
let url .= '?'
else
let url .= '&'
endif
let url .= s:parser(a:q, s:issues_scopes)
return github#api#util#Get(url, [])
endfunction
function! github#api#search#SearchUsers(q,sort,order) abort
let url = 'search/users'
let _sort = ['followers', 'repositories', 'joined']
let _order = ['asc', 'desc']
let url = github#api#util#parserArgs(url, 'sort', a:sort, _sort, '')
if index(_sort, a:sort) != -1
let url = github#api#util#parserArgs(url, 'order', a:order, _order, 'desc')
endif
if stridx(url, '?') == -1
let url .= '?'
else
let url .= '&'
endif
let url .= s:parser(a:q, s:users_scopes)
return github#api#util#Get(url, [])
endfunction
" default scopes [valid values, default values]
let s:repo_scopes = {
\ 'in' : [['name', 'description', 'readme'], 'name,description'],
\ 'size' : '',
\ 'forks' : '',
\ 'fork' : '',
\ 'created' : '',
\ 'pushed' : '',
\ 'user' : '',
\ 'language' : '',
\ 'stars' : '',
\ 'keywords' : ''
\ }
let s:code_scopes = {
\ 'in' : 'file',
\ 'path' : '',
\ 'filename' : '',
\ 'extension' : '',
\ 'user' : '',
\ 'size' : '',
\ 'forks' : '',
\ 'fork' : '',
\ 'language' : ''
\ }
" https://help.github.com/articles/searching-issues/
let s:issues_scopes = {
\ 'type' : 'pr,issue',
\ 'in' : 'title,body,comments',
\ 'author' : '',
\ 'assignee' : '',
\ 'mentions' : '',
\ 'commenter' : '',
\ 'involves' : '',
\ 'team' : '',
\ 'state' : '',
\ 'label' : '',
\ 'milestone' : '',
\ 'no' : '',
\ 'language' : '',
\ 'is' : '',
\ 'created' : '',
\ 'updated' : '',
\ 'merged' : '',
\ 'status' : '',
\ 'head' : '',
\ 'base' : '',
\ 'closed' : '',
\ 'comments' : '',
\ 'user' : ''
\ }
let s:users_scopes = {
\ 'type' : 'org,user',
\ 'in' : 'username,email',
\ 'repos' : '',
\ 'location' : '',
\ 'language' : '',
\ 'created' : '',
\ 'followers' : ''
\ }
function! s:parser(q,scopes) abort
let scopes = copy(a:scopes)
" parser q
let rs = ''
if type(a:q) == type({})
if has_key(a:q, 'keywords')
let rs .= 'q=' . get(a:q, 'keywords')
call remove(a:q, 'keywords')
endif
for scope in keys(scopes)
if has_key(a:q, scope) && !empty(get(a:q, scope))
let res = s:getArgv(get(a:q, scope), get(scopes, scope))
if !empty(res)
let rs .= '+' . scope . ':' . res
endif
endif
endfor
elseif type(a:q) == type('')
let rs .= 'q=' . a:q
endif
return rs
endfunction
fu! s:getArgv(args,base) abort
if type(a:base) == type([])
let vars = a:base[0]
let default = a:base[1]
let f = 0
for a in (type(a:args) == type('') ? split(a:args, ',') : a:args)
if index(vars, a) == -1
let f = 1
endif
endfor
if f && !empty(default)
let result = default
elseif f
let result = ''
else
let result = a:args
endif
return result
elseif type(a:base) == type('') && empty(a:base)
return ''
endif
endf