/autoload/github/api/search.vim
https://github.com/wsdjeg/GitHub.vim · Vim Script · 192 lines · 164 code · 5 blank · 23 comment · 34 complexity · 4d8dd7632c4ae0089103b471dd7338f8 MD5 · raw file
- ""
- " @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