meta-api 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.autoenv.zsh +1 -0
- data/.gitignore +6 -0
- data/.rubocop.yml +28 -0
- data/Gemfile +18 -0
- data/Gemfile.lock +66 -0
- data/LICENSE.txt +502 -0
- data/README.md +149 -0
- data/Rakefile +3 -0
- data/config/locales/zh-CN.yml +6 -0
- data/docs//345/220/215/347/247/260/347/224/261/346/235/245.md +7 -0
- data/docs//346/225/231/347/250/213.md +1199 -0
- data/docs//347/264/242/345/274/225.md +173 -0
- data/examples/lobster.rb +71 -0
- data/examples/rack_app/README.md +3 -0
- data/examples/rack_app/config.ru +6 -0
- data/examples/rack_app/hello.rb +6 -0
- data/examples/rack_app/timing.rb +15 -0
- data/lib/meta/api.rb +3 -0
- data/lib/meta/application/application.rb +63 -0
- data/lib/meta/application/execution.rb +178 -0
- data/lib/meta/application/meta.rb +71 -0
- data/lib/meta/application/path_matching_mod.rb +53 -0
- data/lib/meta/application/route.rb +58 -0
- data/lib/meta/application.rb +42 -0
- data/lib/meta/entity.rb +59 -0
- data/lib/meta/errors.rb +29 -0
- data/lib/meta/json_schema/builders/array_schema_builder.rb +29 -0
- data/lib/meta/json_schema/builders/object_schema_builder.rb +120 -0
- data/lib/meta/json_schema/builders/schema_builder_tool.rb +29 -0
- data/lib/meta/json_schema/schemas/array_schema.rb +40 -0
- data/lib/meta/json_schema/schemas/base_schema.rb +110 -0
- data/lib/meta/json_schema/schemas/object_schema.rb +161 -0
- data/lib/meta/json_schema/schemas.rb +12 -0
- data/lib/meta/json_schema/support/errors.rb +38 -0
- data/lib/meta/json_schema/support/presenters.rb +35 -0
- data/lib/meta/json_schema/support/schema_options.rb +55 -0
- data/lib/meta/json_schema/support/type_converter.rb +137 -0
- data/lib/meta/json_schema/support/validators.rb +54 -0
- data/lib/meta/load_i18n.rb +8 -0
- data/lib/meta/route_dsl/action_builder.rb +15 -0
- data/lib/meta/route_dsl/application_builder.rb +108 -0
- data/lib/meta/route_dsl/chain_builder.rb +48 -0
- data/lib/meta/route_dsl/helpers.rb +15 -0
- data/lib/meta/route_dsl/meta_builder.rb +57 -0
- data/lib/meta/route_dsl/parameters_builder.rb +24 -0
- data/lib/meta/route_dsl/route_builder.rb +85 -0
- data/lib/meta/route_dsl/uniformed_params_builder.rb +34 -0
- data/lib/meta/swagger_doc.rb +86 -0
- data/lib/meta/utils/path.rb +20 -0
- data/meta-api.gemspec +23 -0
- metadata +96 -0
data/README.md
ADDED
@@ -0,0 +1,149 @@
|
|
1
|
+
# Meta 框架
|
2
|
+
|
3
|
+
Meta 框架是一个适用于 Web API 的后端框架,采用 Ruby 语言编写。正如它的名字,它是用定义“元”信息的方式实现 API,同时一份符合 Open API 语义的文档也能同步生成。
|
4
|
+
|
5
|
+
> 有关框架名称的由来,阅读[框架的名称由来](docs/名称由来.md)。
|
6
|
+
|
7
|
+
## 脚手架
|
8
|
+
|
9
|
+
你可直接使用我的脚手架项目上手体验:
|
10
|
+
|
11
|
+
```bash
|
12
|
+
$ git clone https://github.com/yetrun/web-frame-example
|
13
|
+
```
|
14
|
+
|
15
|
+
## 安装
|
16
|
+
|
17
|
+
在 Gemfile 中添加:
|
18
|
+
|
19
|
+
```ruby
|
20
|
+
gem 'meta-api', git: 'https://github.com/yetrun/web-frame'
|
21
|
+
```
|
22
|
+
|
23
|
+
然后在 Ruby 代码中引用:
|
24
|
+
|
25
|
+
```ruby
|
26
|
+
require 'meta/api'
|
27
|
+
```
|
28
|
+
|
29
|
+
## 快速上手
|
30
|
+
|
31
|
+
### 定义 API
|
32
|
+
|
33
|
+
通过继承 `Meta::Application` 来定义一个 API 模块。(PS:以下示例的运行依赖 `ActiveRecord`)
|
34
|
+
|
35
|
+
```ruby
|
36
|
+
class NotesAPI < Meta::Application
|
37
|
+
get '/notes' do
|
38
|
+
title '查看笔记列表'
|
39
|
+
status 200 do
|
40
|
+
expose :notes, type: 'array', using: NoteEntity
|
41
|
+
end
|
42
|
+
action do
|
43
|
+
render :notes, Note.all
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
post '/notes' do
|
48
|
+
title '创建新的笔记'
|
49
|
+
params do
|
50
|
+
param :note, type: 'object', using: NoteEntity
|
51
|
+
end
|
52
|
+
status 201 do
|
53
|
+
expose :note, type: 'object', using: NoteEntity
|
54
|
+
end
|
55
|
+
action do
|
56
|
+
note = Note.create!(params[:note])
|
57
|
+
response.status = 201
|
58
|
+
render :note, note, scope: 'full'
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
get '/notes/:id' do
|
63
|
+
title '查看笔记'
|
64
|
+
params do
|
65
|
+
param :id, type: 'integer'
|
66
|
+
end
|
67
|
+
status 200 do
|
68
|
+
expose :note, type: 'object', using: NoteEntity
|
69
|
+
end
|
70
|
+
action do
|
71
|
+
note = Note.find(params[:id])
|
72
|
+
render :note, note, scope: 'full'
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
put '/notes/:id' do
|
77
|
+
title '更新笔记'
|
78
|
+
params do
|
79
|
+
param :note, type: 'object', using: NoteEntity
|
80
|
+
end
|
81
|
+
status 200 do
|
82
|
+
expose :note, type: 'object', using: NoteEntity
|
83
|
+
end
|
84
|
+
action do
|
85
|
+
note = Note.find(params[:id])
|
86
|
+
note.update!(params[:note])
|
87
|
+
render :note, note, scope: 'full'
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
delete '/notes/:id' do
|
92
|
+
title '删除笔记'
|
93
|
+
action do
|
94
|
+
note = Note.find(params[:id])
|
95
|
+
note.destroy!
|
96
|
+
response.status = 204
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
```
|
101
|
+
|
102
|
+
### 定义实体
|
103
|
+
|
104
|
+
以上示例看到有用到 `NoteEntity`,它是一个预先定义的实体:
|
105
|
+
|
106
|
+
```ruby
|
107
|
+
class NoteEntity < Meta::Entity
|
108
|
+
property :id, type: 'integer', param: false
|
109
|
+
property :title, type: 'string'
|
110
|
+
property :content, type: 'string', render: { scope: 'full' }
|
111
|
+
end
|
112
|
+
```
|
113
|
+
|
114
|
+
我们发现了一些特殊的定义:
|
115
|
+
|
116
|
+
- 标记 `id` 的 `param` 选项为 `false`,它不作为参数传递。
|
117
|
+
|
118
|
+
- 标记 `content` 在 `render` 下的 `scope`,当且仅当显示传递 `scope` 为 `false` 时才会渲染此字段。(对比 *查看笔记列表* 和 *查看笔记* 接口)
|
119
|
+
|
120
|
+
### 生成 API 文档
|
121
|
+
|
122
|
+
通过主动调用以下的方法可以生成 Open API 的规格文档:
|
123
|
+
|
124
|
+
```ruby
|
125
|
+
NotesAPI.to_swagger_doc
|
126
|
+
```
|
127
|
+
|
128
|
+
该 Open API 文档是 JSON 格式,可以在 Swagger UI 下预览效果。如果你不想寻找提供 Swagger UI 服务的站点,也不想自己搭建,可以直接使用我的:
|
129
|
+
|
130
|
+
> http://openapi.yet.run/playground
|
131
|
+
|
132
|
+
### 将模块挂载在 Rack 下运行
|
133
|
+
|
134
|
+
API 模块同时也是一个 Rack 中间件,它可以挂载在 Rack 下运行:
|
135
|
+
|
136
|
+
```ruby
|
137
|
+
# config.ru
|
138
|
+
|
139
|
+
run NotesAPI
|
140
|
+
```
|
141
|
+
|
142
|
+
## 文档
|
143
|
+
|
144
|
+
- [教程](docs/教程.md)
|
145
|
+
- [索引](docs/索引.md)
|
146
|
+
|
147
|
+
## License
|
148
|
+
|
149
|
+
LGPL-2.1
|
data/Rakefile
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
# 框架的名称由来
|
2
|
+
|
3
|
+
我一直在寻找适合在团队内使用的纯 API 框架。我先是试用了 Rails API 模式,继而又尝试了 Grape 框架。面对这种框架我始终觉得缺少了些什么。这种缺憾似乎是与 API 文档相关的。我似乎每次都要先实现一遍业务逻辑,然后再想办法编写一个文档(或者反过来)。在文档和业务逻辑结合方面,Rails 做得不够好,Grape 做得更好一些,但还是不够好。
|
4
|
+
|
5
|
+
直到后来,我尝试自己编写 API 框架时,一个词汇在脑海里涌现。Meta,即“元”,当我们撰写 API 文档时,实际上就是在定义 API 文档的元信息。然后,我就尝试将脑海中的想法付诸实践。编写 API,我们首先是编写 API 的元信息;然后对应地,API 的相关实现就已经有了,诸如参数的解析、实体的渲染等;然后对应地,一份 API 文档也就生成了。我们不用为了生成一份文档再单独地另写一套逻辑,我们只用定义一遍它的元信息。
|
6
|
+
|
7
|
+
这就是 Meta 框架名称的由来。
|