Skip to content
duangsuse edited this page Feb 11, 2019 · 1 revision

[In reply to duangsuse::Echo] 现在这个小工具 (https://github.com/duangsuse/GeekApk/tree/finish_spectrum)效果还不错,大家可以在见到它的第一个版本,大家有 IDEA / gradle 什么环境的可以下载下来玩玩,目前可以玩这些:

[DuangSUSE@duangsuse]~/文档/geekapk_spring% ./spectrum.rb ruby 2.5.3p105 (2018-10-18 revision 65156) [x86_64-linux] Spectrum v0.1.0: usage: ./spectrum.rb [command]{show,licence,help,json,debug}

使用 ./spectrum.rb json 来自动解析生成 JSON 文件,多次操作可以节省资源 json spec 还是 geekspec 都是 SPEC 文件,只不过是表达方式稍有不同而已,本质没有区别。

后面跟 show 可以打印 API 列表、跟 debug 以调试 API 客户端,普通用户不需要调试(因为我测试好了)

./spectrum.rb spectrum_geekapk_v1b_api.json

然后可以进入 REPL

ruby 2.5.3p105 (2018-10-18 revision 65156) [x86_64-linux] Spectrum v0.1.0: usage: ./spectrum.rb [command]{show,licence,help,json,debug} [i] Faraday connection: conn, Apis: apis, Auth configuration: auth [+] run show [:apiName|apiNameRegex|apiLocationRegex] to see api documentation, run list to view api list, have fun! spectrum(0.1)>

上面写明的就不用说了,用过 Ruby 的 Rubyist(废话)肯定清楚,很方便

https://github.com/duangsuse/GeekApk/blob/finish_spectrum/spectrum.rb#L260 所有逻辑(命令)都可以在这里查到

我要讲的是 list, list_from, show, status, tree 这几个有用的命令

spectrum(0.1)> list 3 serverVersion serverDescription serverBoot

spectrum(0.5)> list_from :unStar unStar(aid-path:AppId) -> [$oldCount:number, $newCount:number] = DELETE /star/{aid} stargazers(aid-path:AppId) -> array:App = GET /star/{aid} stars(uid-path:UserId) -> array:App = GET /star/user/{uid} => 64

不带列出全部名称

spectrum(0.2)> show :serverBoot serverBoot() -> datetime = GET /serverBoot

spectrum(0.3)> show /server/ serverVersion() -> plain = GET /serverVersion

serverDescription() -> plain = GET /serverDescription

serverBoot() -> datetime = GET /serverBoot

之前没有考虑到 grep URL 的问题,算了,不如你们弄个 PR。

spectrum(0.6)> status [+] Total 67 APIs, method count: GET: 37; POST: 8; PUT: 11; DELETE: 11 receiving ["String", "UserId", "Int", "CategoryId", "AppId", "CommentId", "UserSize", "TimelineSize", "NotificationSize", "AppSize", "CommentSize"] and returning 67 types (["string", "GeekUser", "Category", "App", "AppUpdate", "Timeline", "Notification", "number", "Comment"]) [+] 55 path params, 3 body params

tree 可以列出 URL 列表(长得很像树,不过我这里它没被弄成树...) 有四种格式可以选择,plain 只有 URL、return 包含返回值、args 侧重参数、all 全部都有,默认 plain,识别不出选项都是 all

spectrum(0.7)> tree GET /serverVersion GET /serverDescription

spectrum(0.8)> tree :return GET /serverVersion = plain GET /serverDescription = plain

spectrum(0.9)> tree :args ... POST /admin/makeUser

  • username:String PUT /admin/resetMetaHash/{uid}
  • uid-path:UserId
  • shash:String?

spectrum(0.10)> tree :all ... GET /serverDetail () = object:string POST /admin/makeUser (username:String) = object:GeekUser PUT /admin/resetMetaHash/{uid} (uid-path:UserId;shash:String?) = plain

Spectrum 可以帮你从 spec 文件映射所有的参数,可选的还是必须的、是否是枚举、它的位置是在 body、query 还是 path... 都会帮你处理好,因为 Spectrum 是主打 CLI,参数不对它还会帮你指正。 spectrum(0.1)> listUser [!] Arity mismatch: expected 3 (not optional 0), got 0 [*] NOTE: fill first optional argument to get started listUser(sort:String?{created, followers}, sliceFrom:UserSize?, sliceTo:UserSize?) -> array:GeekUser = GET user/all

Spectrum 也是设计为可以被用于真正的 Ruby GeekApk binding 库,虽然貌似 Faraday 这个 HTTP 客户端不支持异步,我们不是可以用 Fiber 么。实际上我打算之后 Ruby GeekApk CLI 就利用 Spectrum 写。

pry -r./spectrum [1] pry(main)> Spectrum::ClientShowcase => Spectrum::ClientShowcase [2] pry(main)> Spectrum::ClientShowcase.from_ Spectrum::ClientShowcase.from_code Spectrum::ClientShowcase.from_file Spectrum::ClientShowcase.from_json client = Spectrum::ClientShowcase.from_file client.instance_api_methods client.show client.serverDetail (当然还有稍微实用一点的玩法,比如 Mapper,具体看这里 (https://github.com/duangsuse/GeekApk/blob/finish_spectrum/spectrum.rb#L420))

当然 Spectrum 的代码质量虽然垃圾,但也没有垃圾到一定程度,所以还是能用的(迫真)(神逻辑 所以以后,使用 Spectrum 生成其他弱类型/自动内存管理语言的客户端代码,其实也不是不可能,我个人觉得生成 Haskell 的结构然后用 Haskell 翻译也可以(跑(求不喷

Spectrum CLI 是基于 Pry 的,当然以后写 GeekApk CLI 的时候我会另外再写。

API Specs

v1b 1.0

Clone this wiki locally