/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

  1. ""
  2. " @public
  3. " Search for repos, for how to {sort} result, you can use `stars`,`forks` and
  4. " `updated`. and for {order} you can use `asc` and `desc`.for {q} see:
  5. " Input: >
  6. " {
  7. " 'in' : 'name,description',
  8. " 'size' : '',
  9. " 'forks' : '',
  10. " 'fork' : '',
  11. " 'created' : '',
  12. " 'pushed' : '',
  13. " 'user' : '',
  14. " 'language' : '',
  15. " 'stars' : '',
  16. " 'keywords' : ''
  17. " }
  18. " <
  19. "
  20. " Github API : GET /search/repositories
  21. function! github#api#search#SearchRepos(q,sort,order) abort
  22. let url = 'search/repositories'
  23. let _sort = ['stars', 'forks', 'updated']
  24. let _order = ['asc', 'desc']
  25. let url = github#api#util#parserArgs(url, 'sort', a:sort, _sort, '')
  26. if index(_sort, a:sort) != -1
  27. let url = github#api#util#parserArgs(url, 'order', a:order, _order, 'desc')
  28. endif
  29. if stridx(url, '?') == -1
  30. let url .= '?'
  31. else
  32. let url .= '&'
  33. endif
  34. let url .= s:parser(a:q, s:repo_scopes)
  35. return github#api#util#Get(url, [])
  36. endfunction
  37. function! github#api#search#SearchCode(q,sort,order) abort
  38. let url = 'search/code'
  39. let _sort = ['indexed']
  40. let _order = ['asc', 'desc']
  41. let url = github#api#util#parserArgs(url, 'sort', a:sort, _sort, '')
  42. if index(_sort, a:sort) != -1
  43. let url = github#api#util#parserArgs(url, 'order', a:order, _order, 'desc')
  44. endif
  45. if stridx(url, '?') == -1
  46. let url .= '?'
  47. else
  48. let url .= '&'
  49. endif
  50. let url .= s:parser(a:q, s:code_scopes)
  51. return github#api#util#Get(url, [])
  52. endfunction
  53. function! github#api#search#SearchIssues(q,sort,order) abort
  54. let url = 'search/issues'
  55. let _sort = ['comments', 'created', 'updated']
  56. let _order = ['asc', 'desc']
  57. let url = github#api#util#parserArgs(url, 'sort', a:sort, _sort, '')
  58. if index(_sort, a:sort) != -1
  59. let url = github#api#util#parserArgs(url, 'order', a:order, _order, 'desc')
  60. endif
  61. if stridx(url, '?') == -1
  62. let url .= '?'
  63. else
  64. let url .= '&'
  65. endif
  66. let url .= s:parser(a:q, s:issues_scopes)
  67. return github#api#util#Get(url, [])
  68. endfunction
  69. function! github#api#search#SearchUsers(q,sort,order) abort
  70. let url = 'search/users'
  71. let _sort = ['followers', 'repositories', 'joined']
  72. let _order = ['asc', 'desc']
  73. let url = github#api#util#parserArgs(url, 'sort', a:sort, _sort, '')
  74. if index(_sort, a:sort) != -1
  75. let url = github#api#util#parserArgs(url, 'order', a:order, _order, 'desc')
  76. endif
  77. if stridx(url, '?') == -1
  78. let url .= '?'
  79. else
  80. let url .= '&'
  81. endif
  82. let url .= s:parser(a:q, s:users_scopes)
  83. return github#api#util#Get(url, [])
  84. endfunction
  85. " default scopes [valid values, default values]
  86. let s:repo_scopes = {
  87. \ 'in' : [['name', 'description', 'readme'], 'name,description'],
  88. \ 'size' : '',
  89. \ 'forks' : '',
  90. \ 'fork' : '',
  91. \ 'created' : '',
  92. \ 'pushed' : '',
  93. \ 'user' : '',
  94. \ 'language' : '',
  95. \ 'stars' : '',
  96. \ 'keywords' : ''
  97. \ }
  98. let s:code_scopes = {
  99. \ 'in' : 'file',
  100. \ 'path' : '',
  101. \ 'filename' : '',
  102. \ 'extension' : '',
  103. \ 'user' : '',
  104. \ 'size' : '',
  105. \ 'forks' : '',
  106. \ 'fork' : '',
  107. \ 'language' : ''
  108. \ }
  109. " https://help.github.com/articles/searching-issues/
  110. let s:issues_scopes = {
  111. \ 'type' : 'pr,issue',
  112. \ 'in' : 'title,body,comments',
  113. \ 'author' : '',
  114. \ 'assignee' : '',
  115. \ 'mentions' : '',
  116. \ 'commenter' : '',
  117. \ 'involves' : '',
  118. \ 'team' : '',
  119. \ 'state' : '',
  120. \ 'label' : '',
  121. \ 'milestone' : '',
  122. \ 'no' : '',
  123. \ 'language' : '',
  124. \ 'is' : '',
  125. \ 'created' : '',
  126. \ 'updated' : '',
  127. \ 'merged' : '',
  128. \ 'status' : '',
  129. \ 'head' : '',
  130. \ 'base' : '',
  131. \ 'closed' : '',
  132. \ 'comments' : '',
  133. \ 'user' : ''
  134. \ }
  135. let s:users_scopes = {
  136. \ 'type' : 'org,user',
  137. \ 'in' : 'username,email',
  138. \ 'repos' : '',
  139. \ 'location' : '',
  140. \ 'language' : '',
  141. \ 'created' : '',
  142. \ 'followers' : ''
  143. \ }
  144. function! s:parser(q,scopes) abort
  145. let scopes = copy(a:scopes)
  146. " parser q
  147. let rs = ''
  148. if type(a:q) == type({})
  149. if has_key(a:q, 'keywords')
  150. let rs .= 'q=' . get(a:q, 'keywords')
  151. call remove(a:q, 'keywords')
  152. endif
  153. for scope in keys(scopes)
  154. if has_key(a:q, scope) && !empty(get(a:q, scope))
  155. let res = s:getArgv(get(a:q, scope), get(scopes, scope))
  156. if !empty(res)
  157. let rs .= '+' . scope . ':' . res
  158. endif
  159. endif
  160. endfor
  161. elseif type(a:q) == type('')
  162. let rs .= 'q=' . a:q
  163. endif
  164. return rs
  165. endfunction
  166. fu! s:getArgv(args,base) abort
  167. if type(a:base) == type([])
  168. let vars = a:base[0]
  169. let default = a:base[1]
  170. let f = 0
  171. for a in (type(a:args) == type('') ? split(a:args, ',') : a:args)
  172. if index(vars, a) == -1
  173. let f = 1
  174. endif
  175. endfor
  176. if f && !empty(default)
  177. let result = default
  178. elseif f
  179. let result = ''
  180. else
  181. let result = a:args
  182. endif
  183. return result
  184. elseif type(a:base) == type('') && empty(a:base)
  185. return ''
  186. endif
  187. endf