meta-api 0.0.7 → 0.0.9

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.
Files changed (80) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +14 -0
  3. data/lib/meta/application/execution.rb +19 -49
  4. data/lib/meta/application/metadata.rb +65 -5
  5. data/lib/meta/application/route.rb +4 -26
  6. data/lib/meta/config.rb +14 -14
  7. data/lib/meta/json_schema/builders/schema_builder_tool.rb +2 -1
  8. data/lib/meta/json_schema/schemas/array_schema.rb +13 -14
  9. data/lib/meta/json_schema/schemas/base_schema.rb +101 -36
  10. data/lib/meta/json_schema/schemas/object_schema.rb +22 -9
  11. data/lib/meta/json_schema/schemas/properties.rb +20 -74
  12. data/lib/meta/json_schema/schemas/scoping_schema.rb +41 -0
  13. data/lib/meta/json_schema/schemas/staging_schema.rb +58 -0
  14. data/lib/meta/json_schema/schemas/unsupported_schema.rb +22 -0
  15. data/lib/meta/json_schema/support/errors.rb +3 -0
  16. data/lib/meta/json_schema/support/schema_options.rb +0 -9
  17. data/lib/meta/route_dsl/meta_builder.rb +2 -2
  18. data/lib/meta/route_dsl/uniformed_params_builder.rb +5 -5
  19. data/lib/meta/swagger_doc.rb +1 -1
  20. data/lib/meta/utils/kwargs/builder.rb +2 -0
  21. data/lib/meta/utils/route_dsl_builders.rb +1 -0
  22. data/meta-api.gemspec +6 -5
  23. metadata +71 -111
  24. data/.autoenv.zsh +0 -1
  25. data/.gitignore +0 -7
  26. data/.rubocop.yml +0 -28
  27. data/Gemfile +0 -18
  28. data/Gemfile.lock +0 -66
  29. data/README.md +0 -166
  30. data/Rakefile +0 -3
  31. data/docs/Rails.md +0 -61
  32. data/docs//345/220/215/347/247/260/347/224/261/346/235/245.md +0 -7
  33. data/docs//345/246/202/344/275/225/350/264/241/347/214/256.md +0 -10
  34. data/docs//346/225/231/347/250/213.md +0 -1647
  35. data/docs//347/264/242/345/274/225.md +0 -183
  36. data/examples/lobster.rb +0 -71
  37. data/examples/rack_app/README.md +0 -3
  38. data/examples/rack_app/config.ru +0 -6
  39. data/examples/rack_app/hello.rb +0 -6
  40. data/examples/rack_app/timing.rb +0 -15
  41. data/examples/rails_app/.gitattributes +0 -5
  42. data/examples/rails_app/.gitignore +0 -23
  43. data/examples/rails_app/.rspec +0 -1
  44. data/examples/rails_app/.ruby-version +0 -1
  45. data/examples/rails_app/Gemfile +0 -29
  46. data/examples/rails_app/Gemfile.lock +0 -190
  47. data/examples/rails_app/README.md +0 -11
  48. data/examples/rails_app/Rakefile +0 -6
  49. data/examples/rails_app/app/controllers/application_controller.rb +0 -7
  50. data/examples/rails_app/app/controllers/concerns/.keep +0 -0
  51. data/examples/rails_app/app/controllers/data_controller.rb +0 -63
  52. data/examples/rails_app/app/controllers/swagger_controller.rb +0 -13
  53. data/examples/rails_app/app/models/concerns/.keep +0 -0
  54. data/examples/rails_app/bin/rails +0 -4
  55. data/examples/rails_app/bin/rake +0 -4
  56. data/examples/rails_app/bin/setup +0 -25
  57. data/examples/rails_app/config/application.rb +0 -39
  58. data/examples/rails_app/config/boot.rb +0 -3
  59. data/examples/rails_app/config/credentials.yml.enc +0 -1
  60. data/examples/rails_app/config/environment.rb +0 -5
  61. data/examples/rails_app/config/environments/development.rb +0 -51
  62. data/examples/rails_app/config/environments/production.rb +0 -65
  63. data/examples/rails_app/config/environments/test.rb +0 -50
  64. data/examples/rails_app/config/initializers/cors.rb +0 -16
  65. data/examples/rails_app/config/initializers/filter_parameter_logging.rb +0 -8
  66. data/examples/rails_app/config/initializers/inflections.rb +0 -16
  67. data/examples/rails_app/config/initializers/meta_rails_plugin.rb +0 -3
  68. data/examples/rails_app/config/locales/en.yml +0 -33
  69. data/examples/rails_app/config/puma.rb +0 -43
  70. data/examples/rails_app/config/routes.rb +0 -13
  71. data/examples/rails_app/config.ru +0 -6
  72. data/examples/rails_app/lib/tasks/.keep +0 -0
  73. data/examples/rails_app/log/.keep +0 -0
  74. data/examples/rails_app/public/robots.txt +0 -1
  75. data/examples/rails_app/spec/data_controller_spec.rb +0 -60
  76. data/examples/rails_app/spec/rails_helper.rb +0 -55
  77. data/examples/rails_app/spec/spec_helper.rb +0 -94
  78. data/examples/rails_app/spec/swagger_controller_spec.rb +0 -13
  79. data/examples/rails_app/tmp/.keep +0 -0
  80. data/examples/rails_app/tmp/pids/.keep +0 -0
data/.rubocop.yml DELETED
@@ -1,28 +0,0 @@
1
- # https://docs.rubocop.org/rubocop/1.24/cops_style.html
2
-
3
- AllCops:
4
- NewCops: enable
5
-
6
- Style/BlockDelimiters:
7
- Enabled: false
8
- Style/Documentation:
9
- Enabled: false
10
- Style/GuardClause:
11
- Enabled: false
12
- Style/RaiseArgs:
13
- Enabled: false
14
-
15
- Metrics/MethodLength:
16
- Max: 20
17
- Metrics/BlockLength:
18
- IgnoredMethods: ['describe', 'context']
19
- Metrics/AbcSize:
20
- CountRepeatedAttributes: false
21
- Max: 30
22
- Metrics/PerceivedComplexity:
23
- Max: 10
24
- Metrics/CyclomaticComplexity:
25
- Max: 10
26
-
27
- Layout/MultilineMethodCallIndentation:
28
- EnforcedStyle: indented_relative_to_receiver
data/Gemfile DELETED
@@ -1,18 +0,0 @@
1
- source 'https://gems.ruby-china.com/'
2
-
3
- # Specify your gem's dependencies in xxx.gemspec
4
- gemspec
5
-
6
- gem "rake", "~> 12.0"
7
- gem 'i18n'
8
-
9
- group :test do
10
- gem 'rspec'
11
- gem 'rack-test'
12
- gem 'grape-entity'
13
- end
14
-
15
- group :test, :development do
16
- gem 'rack'
17
- gem 'pry-byebug'
18
- end
data/Gemfile.lock DELETED
@@ -1,66 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- meta-api (0.0.7)
5
-
6
- GEM
7
- remote: https://gems.ruby-china.com/
8
- specs:
9
- activesupport (7.0.1)
10
- concurrent-ruby (~> 1.0, >= 1.0.2)
11
- i18n (>= 1.6, < 2)
12
- minitest (>= 5.1)
13
- tzinfo (~> 2.0)
14
- byebug (11.1.3)
15
- coderay (1.1.3)
16
- concurrent-ruby (1.1.9)
17
- diff-lcs (1.5.0)
18
- grape-entity (0.10.1)
19
- activesupport (>= 3.0.0)
20
- multi_json (>= 1.3.2)
21
- i18n (1.8.11)
22
- concurrent-ruby (~> 1.0)
23
- method_source (1.0.0)
24
- minitest (5.15.0)
25
- multi_json (1.15.0)
26
- pry (0.13.1)
27
- coderay (~> 1.1)
28
- method_source (~> 1.0)
29
- pry-byebug (3.9.0)
30
- byebug (~> 11.0)
31
- pry (~> 0.13.0)
32
- rack (2.2.3)
33
- rack-test (1.1.0)
34
- rack (>= 1.0, < 3)
35
- rake (12.3.3)
36
- rspec (3.10.0)
37
- rspec-core (~> 3.10.0)
38
- rspec-expectations (~> 3.10.0)
39
- rspec-mocks (~> 3.10.0)
40
- rspec-core (3.10.1)
41
- rspec-support (~> 3.10.0)
42
- rspec-expectations (3.10.1)
43
- diff-lcs (>= 1.2.0, < 2.0)
44
- rspec-support (~> 3.10.0)
45
- rspec-mocks (3.10.2)
46
- diff-lcs (>= 1.2.0, < 2.0)
47
- rspec-support (~> 3.10.0)
48
- rspec-support (3.10.3)
49
- tzinfo (2.0.4)
50
- concurrent-ruby (~> 1.0)
51
-
52
- PLATFORMS
53
- ruby
54
-
55
- DEPENDENCIES
56
- grape-entity
57
- i18n
58
- meta-api!
59
- pry-byebug
60
- rack
61
- rack-test
62
- rake (~> 12.0)
63
- rspec
64
-
65
- BUNDLED WITH
66
- 2.3.7
data/README.md DELETED
@@ -1,166 +0,0 @@
1
- # Meta 框架
2
-
3
- Meta 框架是一个用于开发 Web API 的后端框架,采用 Ruby 语言编写。正如它的名字,它是用定义“元”信息的方式实现 API,同时生成一份符合 Open API 规格的接口文档。
4
-
5
- > 有关框架名称的由来,阅读[框架的名称由来](docs/名称由来.md)。
6
-
7
- ## 脚手架
8
-
9
- 可直接使用我的[脚手架](https://github.com/yetrun/web-frame-example)项目上手体验:
10
-
11
- ```bash
12
- $ git clone https://github.com/yetrun/web-frame-example.git
13
- ```
14
-
15
- ## 安装
16
-
17
- 在 Gemfile 中添加:
18
-
19
- ```ruby
20
- gem 'meta-api', '~> 0.0.7' # Meta 框架处于快速开发阶段,引入时应尽量固定版本
21
- ```
22
-
23
- 然后在 Ruby 代码中引用:
24
-
25
- ```ruby
26
- require 'meta/api'
27
- ```
28
-
29
- > 或者可嵌入到 Rails 项目中使用,参考[为 Rails 项目带来参数验证效果](docs/Rails.md)。
30
-
31
- ## 快速一览
32
-
33
- ### 定义 API
34
-
35
- 通过继承 `Meta::Application` 来定义一个 API 模块。(PS:以下示例的运行依赖 `ActiveRecord`)
36
-
37
- ```ruby
38
- class NotesAPI < Meta::Application
39
- get '/notes' do
40
- title '查看笔记列表'
41
- status 200 do
42
- expose :notes, type: 'array', ref: NoteEntity
43
- end
44
- action do
45
- render :notes, Note.all
46
- end
47
- end
48
-
49
- post '/notes' do
50
- title '创建新的笔记'
51
- params do
52
- param :note, type: 'object', ref: NoteEntity
53
- end
54
- status 201 do
55
- expose :note, type: 'object', ref: NoteEntity.lock_scope('full')
56
- end
57
- action do
58
- note = Note.create!(params[:note])
59
- response.status = 201
60
- render :note, note
61
- end
62
- end
63
-
64
- get '/notes/:id' do
65
- title '查看笔记'
66
- params do
67
- param :id, type: 'integer'
68
- end
69
- status 200 do
70
- expose :note, type: 'object', ref: NoteEntity.lock_scope('full')
71
- end
72
- action do
73
- note = Note.find(params[:id])
74
- render :note, note, scope: 'full'
75
- end
76
- end
77
-
78
- put '/notes/:id' do
79
- title '更新笔记'
80
- params do
81
- param :note, type: 'object', ref: NoteEntity
82
- end
83
- status 200 do
84
- expose :note, type: 'object', ref: NoteEntity.lock_scope('full')
85
- end
86
- action do
87
- note = Note.find(params[:id])
88
- note.update!(params[:note])
89
- render :note, note, scope: 'full'
90
- end
91
- end
92
-
93
- delete '/notes/:id' do
94
- title '删除笔记'
95
- status 204
96
- action do
97
- note = Note.find(params[:id])
98
- note.destroy!
99
- response.status = 204
100
- end
101
- end
102
- end
103
- ```
104
-
105
- ### 定义实体
106
-
107
- 以上示例看到有用到 `NoteEntity`,它是一个预先定义的实体:
108
-
109
- ```ruby
110
- class NoteEntity < Meta::Entity
111
- property :id, type: 'integer', param: false # 不作为参数传递
112
- property :title, type: 'string'
113
- property :content, type: 'string', render: { scope: 'full' } # 列表页接口不返回此字段
114
- end
115
- ```
116
-
117
- ### 生成 API 文档
118
-
119
- 通过主动调用以下的方法可以生成 Open API 的规格文档:
120
-
121
- ```ruby
122
- NotesAPI.to_swagger_doc
123
- ```
124
-
125
- 该 Open API 文档是 JSON 格式,可以在 Swagger UI 下预览效果。如果也不乐意自己搭建 Swagger UI,可以直接使用在线的:
126
-
127
- > http://openapi.yet.run/playground
128
-
129
- ### 将模块挂载在 Rack 下运行
130
-
131
- API 模块同时也是一个 Rack 中间件,它可以挂载在 Rack 下运行。假设以上文件分别位于 `notes_api.rb` 和 `note_entity.rb`,在项目下新建文件 `config.ru`,并写入:
132
-
133
- ```ruby
134
- require 'meta/api'
135
- require_relative 'notes_api'
136
- require_relative 'note_entity'
137
-
138
- # 将文档挂载到 /api_spec 锚点下
139
- map '/api_spec' do
140
- run ->(env) {
141
- [200, { 'CONTENT_TYPE' => 'application/json' }, [JSON.generate(NotesAPI.to_swagger_doc)]]
142
- }
143
- end
144
-
145
- # 启动 NotesAPI 中定义的接口
146
- run NotesAPI
147
- ```
148
-
149
- 然后执行命令:`bundle exec rackup`,接口即可启动。
150
-
151
- ## 文档
152
-
153
- - [教程](docs/教程.md)
154
- - [索引](docs/索引.md)
155
-
156
- ## 支持
157
-
158
- 你可以通过以下途径获得支持:
159
-
160
- 1. 通过 GitHub 提交 [ISSUE](https://github.com/yetrun/web-frame/issues)
161
- 2. 通过 QQ 群(489579810)获得实时答疑
162
- 3. 对本项目提交 [Pull Request](https://github.com/yetrun/web-frame/pulls)
163
-
164
- ## License
165
-
166
- LGPL-2.1
data/Rakefile DELETED
@@ -1,3 +0,0 @@
1
- require "bundler/gem_tasks"
2
-
3
- task :default => :spec
data/docs/Rails.md DELETED
@@ -1,61 +0,0 @@
1
- # 作为 Rails 插件
2
-
3
- ## 安装
4
-
5
- 首先,你需要将其安装在 Rails 项目中:
6
-
7
- ```ruby
8
- gem 'meta-api', '~> 0.0.3' # 0.0.3 版本以上才提供 Rails 插件功能
9
- ```
10
-
11
- 在 config/initializers 目录下创建一个文件,例如 `meta_rails_plugin.rb`,并写入:
12
-
13
- ```ruby
14
- require 'meta/rails'
15
-
16
- Meta::Rails.setup
17
- ```
18
-
19
- 在 `application_controller.rb` 下加入:
20
-
21
- ```ruby
22
- class ApplicationController < ActionController::API
23
- # 引入插件,同时引入 route 宏、params_on_schema 方法、json_on_schema 渲染器
24
- include Meta::Rails::Plugin
25
-
26
- # 处理参数验证错误
27
- rescue_from Meta::Errors::ParameterInvalid do |e|
28
- render json: e.errors, status: :bad_request
29
- end
30
- end
31
- ```
32
-
33
- 这样,一切就准备好了。
34
-
35
- ## 示例
36
-
37
- 接口定义:
38
-
39
- ```ruby
40
- class UsersController < ApplicationController
41
- route '/users', :post do
42
- params do
43
- param :user, required: true do
44
- param :name, type: 'string'
45
- param :age, type: 'integer'
46
- end
47
- end
48
- end
49
- def create
50
- user = User.create!(params_on_schema[:user])
51
- render json_on_schema: user
52
- end
53
- end
54
- ```
55
-
56
- 生成 Swagger 文档:
57
-
58
- ```ruby
59
- Rails.application.eager_load! # 需要提前加载所有常量
60
- Meta::Rails::Plugin.generate_swagger_doc(ApplicationController)
61
- ```
@@ -1,7 +0,0 @@
1
- # 框架的名称由来
2
-
3
- 我一直在寻找适合在团队内使用的纯 API 框架。我先是试用了 Rails API 模式,继而又尝试了 Grape 框架。面对这种框架我始终觉得缺少了些什么。这种缺憾似乎是与 API 文档相关的。我似乎每次都要先实现一遍业务逻辑,然后再想办法编写一个文档(或者反过来)。在文档和业务逻辑结合方面,Rails 做得不够好,Grape 做得更好一些,但还是不够好。
4
-
5
- 直到后来,我尝试自己编写 API 框架时,一个词汇在脑海里涌现。Meta,即“元”,当我们撰写 API 文档时,实际上就是在定义 API 文档的元信息。然后,我就尝试将脑海中的想法付诸实践。编写 API,我们首先是编写 API 的元信息;然后对应地,API 的相关实现就已经有了,诸如参数的解析、实体的渲染等;然后对应地,一份 API 文档也就生成了。我们不用为了生成一份文档再单独地另写一套逻辑,我们只用定义一遍它的元信息。
6
-
7
- 这就是 Meta 框架名称的由来。
@@ -1,10 +0,0 @@
1
- # 如何贡献
2
-
3
- ## 发布 Gem
4
-
5
- 执行两条命令:
6
-
7
- ```bash
8
- $ gem build meta-api.gemspec
9
- $ gem push meta-api-x.x.x.gem
10
- ```