meta-api 0.0.1 → 0.0.3

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 (76) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +5 -4
  3. data/CHANGELOG.md +11 -0
  4. data/Gemfile.lock +1 -1
  5. data/README.md +14 -8
  6. data/docs/Rails.md +61 -0
  7. data/docs//345/246/202/344/275/225/350/264/241/347/214/256.md +10 -0
  8. data/docs//346/225/231/347/250/213.md +50 -20
  9. data/examples/rails_app/.gitattributes +5 -0
  10. data/examples/rails_app/.gitignore +23 -0
  11. data/examples/rails_app/.rspec +1 -0
  12. data/examples/rails_app/.ruby-version +1 -0
  13. data/examples/rails_app/Gemfile +29 -0
  14. data/examples/rails_app/Gemfile.lock +190 -0
  15. data/examples/rails_app/README.md +11 -0
  16. data/examples/rails_app/Rakefile +6 -0
  17. data/examples/rails_app/app/controllers/application_controller.rb +7 -0
  18. data/examples/rails_app/app/controllers/concerns/.keep +0 -0
  19. data/examples/rails_app/app/controllers/data_controller.rb +63 -0
  20. data/examples/rails_app/app/controllers/swagger_controller.rb +13 -0
  21. data/examples/rails_app/app/models/concerns/.keep +0 -0
  22. data/examples/rails_app/bin/rails +4 -0
  23. data/examples/rails_app/bin/rake +4 -0
  24. data/examples/rails_app/bin/setup +25 -0
  25. data/examples/rails_app/config/application.rb +39 -0
  26. data/examples/rails_app/config/boot.rb +3 -0
  27. data/examples/rails_app/config/credentials.yml.enc +1 -0
  28. data/examples/rails_app/config/environment.rb +5 -0
  29. data/examples/rails_app/config/environments/development.rb +51 -0
  30. data/examples/rails_app/config/environments/production.rb +65 -0
  31. data/examples/rails_app/config/environments/test.rb +50 -0
  32. data/examples/rails_app/config/initializers/cors.rb +16 -0
  33. data/examples/rails_app/config/initializers/filter_parameter_logging.rb +8 -0
  34. data/examples/rails_app/config/initializers/inflections.rb +16 -0
  35. data/examples/rails_app/config/initializers/meta_rails_plugin.rb +3 -0
  36. data/examples/rails_app/config/locales/en.yml +33 -0
  37. data/examples/rails_app/config/puma.rb +43 -0
  38. data/examples/rails_app/config/routes.rb +13 -0
  39. data/examples/rails_app/config.ru +6 -0
  40. data/examples/rails_app/lib/tasks/.keep +0 -0
  41. data/examples/rails_app/log/.keep +0 -0
  42. data/examples/rails_app/public/robots.txt +1 -0
  43. data/examples/rails_app/spec/data_controller_spec.rb +60 -0
  44. data/examples/rails_app/spec/rails_helper.rb +55 -0
  45. data/examples/rails_app/spec/spec_helper.rb +94 -0
  46. data/examples/rails_app/spec/swagger_controller_spec.rb +13 -0
  47. data/examples/rails_app/tmp/.keep +0 -0
  48. data/examples/rails_app/tmp/pids/.keep +0 -0
  49. data/lib/meta/api.rb +1 -0
  50. data/lib/meta/application/execution.rb +5 -13
  51. data/lib/meta/application/{meta.rb → metadata.rb} +5 -15
  52. data/lib/meta/application/parameters.rb +47 -0
  53. data/lib/meta/application/route.rb +2 -2
  54. data/lib/meta/config.rb +17 -0
  55. data/lib/meta/entity.rb +0 -1
  56. data/lib/meta/json_schema/builders/array_schema_builder.rb +11 -10
  57. data/lib/meta/json_schema/builders/dynamic_schema_builder.rb +23 -0
  58. data/lib/meta/json_schema/builders/object_schema_builder.rb +4 -18
  59. data/lib/meta/json_schema/builders/ref_schema_builder.rb +19 -0
  60. data/lib/meta/json_schema/builders/schema_builder_tool.rb +26 -1
  61. data/lib/meta/json_schema/schemas/array_schema.rb +3 -3
  62. data/lib/meta/json_schema/schemas/base_schema.rb +32 -42
  63. data/lib/meta/json_schema/schemas/dynamic_schema.rb +29 -0
  64. data/lib/meta/json_schema/schemas/object_schema.rb +29 -109
  65. data/lib/meta/json_schema/schemas/properties.rb +157 -0
  66. data/lib/meta/json_schema/schemas/ref_schema.rb +35 -0
  67. data/lib/meta/json_schema/schemas.rb +0 -2
  68. data/lib/meta/json_schema/support/schema_options.rb +22 -11
  69. data/lib/meta/json_schema.rb +2 -0
  70. data/lib/meta/rails.rb +98 -0
  71. data/lib/meta/route_dsl/parameters_builder.rb +2 -1
  72. data/lib/meta/swagger_doc.rb +5 -2
  73. data/lib/meta/utils/kwargs/builder.rb +115 -0
  74. data/lib/meta/utils/kwargs/check.rb +91 -0
  75. data/meta-api.gemspec +1 -1
  76. metadata +61 -7
@@ -0,0 +1,115 @@
1
+ # frozen_string_literal: true
2
+
3
+ # 使用构建器构建关键字参数检查器。
4
+ #
5
+ # 在 Ruby 3 中,关键字参数有所变化。简单来说,关键字参数和 Hash 类型不再自动转化,并且一般情况下推荐使用关键字参数。
6
+ # 但关键字参数还是有稍稍不足之处,比如在做一些复杂的关键字参数定义时。
7
+ #
8
+ # 这个文件编写了一个方法,帮助我们在运行时检查关键字参数。这样,我们就可以像下面这样笼统的方式定义参数,不必用明确的关
9
+ # 键字参数名称。
10
+ #
11
+ # def method_name(x, y, z, **kwargs); end
12
+ # def method_name(x, y, z, kwargs={}); end
13
+ #
14
+ # 构建器使用示例:
15
+ #
16
+ # Meta::Utils::KeywordArgs::Builder.build do
17
+ # key :a, :b, :c
18
+ # key :d, normalizer: ->(value) { normalize_to_array(value) }
19
+ # end
20
+ #
21
+
22
+ module Meta
23
+ module Utils
24
+ class KeywordArgs
25
+ def initialize(arguments, permit_extras = false, final_consumer = nil)
26
+ @arguments = arguments
27
+ @permit_extras = permit_extras
28
+ @final_consumer = final_consumer
29
+ end
30
+
31
+ def check(args)
32
+ args = args.dup
33
+ final_args = {}
34
+
35
+ @arguments.each do |argument|
36
+ argument.consume(final_args, args)
37
+ end
38
+
39
+ # 做最终的修饰
40
+ @final_consumer.call(final_args, args) if @final_consumer
41
+
42
+ # 处理剩余字段
43
+ unless args.keys.empty?
44
+ if @permit_extras
45
+ final_args.merge!(args)
46
+ else
47
+ extras = args.keys
48
+ raise "不接受额外的关键字参数:#{extras.join(', ')}" unless extras.empty?
49
+ end
50
+ end
51
+
52
+ final_args
53
+ end
54
+
55
+ class Argument
56
+ DEFAULT_TRANSFORMER = ->(value) { value }
57
+
58
+ def initialize(name:, normalizer: DEFAULT_TRANSFORMER, alias_names: [])
59
+ @key_name = name
60
+ @consumer_names = [name] + alias_names
61
+ @normalizer = normalizer
62
+ end
63
+
64
+ def consume(final_args, args)
65
+ @consumer_names.each do |name|
66
+ return true if consume_name(final_args, args, name)
67
+ end
68
+ return false
69
+ end
70
+
71
+ def consume_name(final_args, args, consumer_name)
72
+ if args.key?(consumer_name)
73
+ value = @normalizer.call(args.delete(consumer_name))
74
+ final_args[@key_name] = value
75
+ true
76
+ else
77
+ false
78
+ end
79
+ end
80
+ end
81
+
82
+ class Builder
83
+ def initialize
84
+ @arguments = []
85
+ @permit_extras = false
86
+ @final_consumer = nil
87
+ end
88
+
89
+ def key(*names, **options)
90
+ names.each do |name|
91
+ @arguments << Argument.new(name: name, **options)
92
+ end
93
+ end
94
+
95
+ def permit_extras(value)
96
+ @permit_extras = value
97
+ end
98
+
99
+ def final_consumer(&block)
100
+ @final_consumer = block
101
+ end
102
+
103
+ def build
104
+ KeywordArgs.new(@arguments, @permit_extras, @final_consumer)
105
+ end
106
+
107
+ def self.build(&block)
108
+ builder = Builder.new
109
+ builder.instance_exec &block
110
+ builder.build
111
+ end
112
+ end
113
+ end
114
+ end
115
+ end
@@ -0,0 +1,91 @@
1
+ # frozen_string_literal: true
2
+
3
+ # 运行时检查关键字参数。(已过时,请使用 Builder)
4
+ #
5
+ # 在 Ruby 3 中,关键字参数有所变化。简单来说,关键字参数和 Hash 类型不再自动转化,并且一般情况下推荐使用关键字参数。
6
+ # 但关键字参数还是有稍稍不足之处,比如在做一些复杂的关键字参数定义时。
7
+ #
8
+ # 这个文件编写了一个方法,帮助我们在运行时检查关键字参数。这样,我们就可以像下面这样笼统的方式定义参数,不必用明确的关
9
+ # 键字参数名称。
10
+ #
11
+ # def method_name(x, y, z, **kwargs); end
12
+ # def method_name(x, y, z, kwargs={}); end
13
+ #
14
+ # 使用示例:
15
+ #
16
+ # # 返回 { x: 1, y: 2, z: 3 }
17
+ # Meta::Utils::KeywordArgs.check(args: { x: 1, y: 2 }, schema: [:x, :y, { z: 3 }])
18
+ #
19
+ # # 返回 { x: 1, y: 2, z: 4 }
20
+ # Meta::Utils::KeywordArgs.check(args: { x: 1, y: 2, z: 4 }, schema: [:x, :y, { z: 3 }])
21
+ #
22
+ # # Error: `x` is required
23
+ # Meta::Utils::KeywordArgs.check(args: { y: 2, z: 3 }, schema: [:x, :y, { z: 3 }])
24
+ #
25
+ # # Error: `a` is not allowed
26
+ # Meta::Utils::KeywordArgs.check(args: { a: 1, y: 2, z: 3 }, schema: [:x, :y, { z: 3 }])
27
+
28
+ module Meta
29
+ module Utils
30
+ class KeywordArgs
31
+ class << self
32
+ def check(args:, schema:)
33
+ schemas = build_schemas(schema)
34
+
35
+ # 不接受额外的关键字参数
36
+ extras = args.keys - schemas.keys
37
+ raise "不接受额外的关键字参数:#{extras.join(', ')}" unless extras.empty?
38
+
39
+ # 通过 schema 导出关键字参数
40
+ missing = []
41
+ result = schemas.map do |name, spec|
42
+ if args.include?(name)
43
+ [name, args[name]]
44
+ elsif spec.include?(:default)
45
+ [name, spec[:default]]
46
+ else
47
+ missing << name
48
+ end
49
+ end.to_h
50
+
51
+ # 检查以上导出过程中是否找到缺失的参数
52
+ if missing.empty?
53
+ result
54
+ else
55
+ raise "缺失必要的关键字参数:#{missing.join(', ')}"
56
+ end
57
+ end
58
+
59
+ private
60
+
61
+ def build_schemas(spec)
62
+ if spec.is_a?(Array)
63
+ build_schemas_from_array(spec)
64
+ elsif spec.is_a?(Hash)
65
+ build_schemas_from_hash(spec)
66
+ elsif spec.is_a?(Symbol)
67
+ build_schemas_from_symbol(spec)
68
+ else
69
+ raise "未知的参数类型:#{spec.class}"
70
+ end
71
+ end
72
+
73
+ def build_schemas_from_array(spec_array)
74
+ spec_array.inject({}) do |accumulated, val|
75
+ accumulated.merge!(build_schemas(val))
76
+ end
77
+ end
78
+
79
+ def build_schemas_from_hash(spec_hash)
80
+ spec_hash.transform_values do |val|
81
+ { default: val }
82
+ end
83
+ end
84
+
85
+ def build_schemas_from_symbol(spec_symbol)
86
+ { spec_symbol => {} }
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
data/meta-api.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |spec|
2
2
  spec.name = "meta-api"
3
- spec.version = "0.0.1"
3
+ spec.version = "0.0.3"
4
4
  spec.authors = ["yetrun"]
5
5
  spec.email = ["yetrun@foxmail.com"]
6
6
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: meta-api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - yetrun
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-01-02 00:00:00.000000000 Z
11
+ date: 2023-04-04 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: 一个 Web API 框架,该框架采用定义元信息的方式编写 API,并同步生成 API 文档
14
14
  email:
@@ -20,13 +20,16 @@ files:
20
20
  - ".autoenv.zsh"
21
21
  - ".gitignore"
22
22
  - ".rubocop.yml"
23
+ - CHANGELOG.md
23
24
  - Gemfile
24
25
  - Gemfile.lock
25
26
  - LICENSE.txt
26
27
  - README.md
27
28
  - Rakefile
28
29
  - config/locales/zh-CN.yml
30
+ - docs/Rails.md
29
31
  - docs/名称由来.md
32
+ - docs/如何贡献.md
30
33
  - docs/教程.md
31
34
  - docs/索引.md
32
35
  - examples/lobster.rb
@@ -34,28 +37,77 @@ files:
34
37
  - examples/rack_app/config.ru
35
38
  - examples/rack_app/hello.rb
36
39
  - examples/rack_app/timing.rb
40
+ - examples/rails_app/.gitattributes
41
+ - examples/rails_app/.gitignore
42
+ - examples/rails_app/.rspec
43
+ - examples/rails_app/.ruby-version
44
+ - examples/rails_app/Gemfile
45
+ - examples/rails_app/Gemfile.lock
46
+ - examples/rails_app/README.md
47
+ - examples/rails_app/Rakefile
48
+ - examples/rails_app/app/controllers/application_controller.rb
49
+ - examples/rails_app/app/controllers/concerns/.keep
50
+ - examples/rails_app/app/controllers/data_controller.rb
51
+ - examples/rails_app/app/controllers/swagger_controller.rb
52
+ - examples/rails_app/app/models/concerns/.keep
53
+ - examples/rails_app/bin/rails
54
+ - examples/rails_app/bin/rake
55
+ - examples/rails_app/bin/setup
56
+ - examples/rails_app/config.ru
57
+ - examples/rails_app/config/application.rb
58
+ - examples/rails_app/config/boot.rb
59
+ - examples/rails_app/config/credentials.yml.enc
60
+ - examples/rails_app/config/environment.rb
61
+ - examples/rails_app/config/environments/development.rb
62
+ - examples/rails_app/config/environments/production.rb
63
+ - examples/rails_app/config/environments/test.rb
64
+ - examples/rails_app/config/initializers/cors.rb
65
+ - examples/rails_app/config/initializers/filter_parameter_logging.rb
66
+ - examples/rails_app/config/initializers/inflections.rb
67
+ - examples/rails_app/config/initializers/meta_rails_plugin.rb
68
+ - examples/rails_app/config/locales/en.yml
69
+ - examples/rails_app/config/puma.rb
70
+ - examples/rails_app/config/routes.rb
71
+ - examples/rails_app/lib/tasks/.keep
72
+ - examples/rails_app/log/.keep
73
+ - examples/rails_app/public/robots.txt
74
+ - examples/rails_app/spec/data_controller_spec.rb
75
+ - examples/rails_app/spec/rails_helper.rb
76
+ - examples/rails_app/spec/spec_helper.rb
77
+ - examples/rails_app/spec/swagger_controller_spec.rb
78
+ - examples/rails_app/tmp/.keep
79
+ - examples/rails_app/tmp/pids/.keep
37
80
  - lib/meta/api.rb
38
81
  - lib/meta/application.rb
39
82
  - lib/meta/application/application.rb
40
83
  - lib/meta/application/execution.rb
41
- - lib/meta/application/meta.rb
84
+ - lib/meta/application/metadata.rb
85
+ - lib/meta/application/parameters.rb
42
86
  - lib/meta/application/path_matching_mod.rb
43
87
  - lib/meta/application/route.rb
88
+ - lib/meta/config.rb
44
89
  - lib/meta/entity.rb
45
90
  - lib/meta/errors.rb
91
+ - lib/meta/json_schema.rb
46
92
  - lib/meta/json_schema/builders/array_schema_builder.rb
93
+ - lib/meta/json_schema/builders/dynamic_schema_builder.rb
47
94
  - lib/meta/json_schema/builders/object_schema_builder.rb
95
+ - lib/meta/json_schema/builders/ref_schema_builder.rb
48
96
  - lib/meta/json_schema/builders/schema_builder_tool.rb
49
97
  - lib/meta/json_schema/schemas.rb
50
98
  - lib/meta/json_schema/schemas/array_schema.rb
51
99
  - lib/meta/json_schema/schemas/base_schema.rb
100
+ - lib/meta/json_schema/schemas/dynamic_schema.rb
52
101
  - lib/meta/json_schema/schemas/object_schema.rb
102
+ - lib/meta/json_schema/schemas/properties.rb
103
+ - lib/meta/json_schema/schemas/ref_schema.rb
53
104
  - lib/meta/json_schema/support/errors.rb
54
105
  - lib/meta/json_schema/support/presenters.rb
55
106
  - lib/meta/json_schema/support/schema_options.rb
56
107
  - lib/meta/json_schema/support/type_converter.rb
57
108
  - lib/meta/json_schema/support/validators.rb
58
109
  - lib/meta/load_i18n.rb
110
+ - lib/meta/rails.rb
59
111
  - lib/meta/route_dsl/action_builder.rb
60
112
  - lib/meta/route_dsl/application_builder.rb
61
113
  - lib/meta/route_dsl/chain_builder.rb
@@ -65,6 +117,8 @@ files:
65
117
  - lib/meta/route_dsl/route_builder.rb
66
118
  - lib/meta/route_dsl/uniformed_params_builder.rb
67
119
  - lib/meta/swagger_doc.rb
120
+ - lib/meta/utils/kwargs/builder.rb
121
+ - lib/meta/utils/kwargs/check.rb
68
122
  - lib/meta/utils/path.rb
69
123
  - meta-api.gemspec
70
124
  homepage: https://github.com/yetrun/web-frame
@@ -74,7 +128,7 @@ metadata:
74
128
  allowed_push_host: https://rubygems.org
75
129
  homepage_uri: https://github.com/yetrun/web-frame
76
130
  source_code_uri: https://github.com/yetrun/web-frame.git
77
- post_install_message:
131
+ post_install_message:
78
132
  rdoc_options: []
79
133
  require_paths:
80
134
  - lib
@@ -89,8 +143,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
89
143
  - !ruby/object:Gem::Version
90
144
  version: '0'
91
145
  requirements: []
92
- rubygems_version: 3.3.26
93
- signing_key:
146
+ rubygems_version: 3.3.7
147
+ signing_key:
94
148
  specification_version: 4
95
149
  summary: 一个 Web API 框架
96
150
  test_files: []