-
Notifications
You must be signed in to change notification settings - Fork 2
Spectrum
[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 的时候我会另外再写。