meta-api 0.0.2 → 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 (73) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +4 -4
  3. data/CHANGELOG.md +6 -1
  4. data/Gemfile.lock +1 -1
  5. data/README.md +9 -7
  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 +21 -21
  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/application/execution.rb +3 -11
  50. data/lib/meta/application/{meta.rb → metadata.rb} +5 -15
  51. data/lib/meta/application/parameters.rb +47 -0
  52. data/lib/meta/application/route.rb +2 -2
  53. data/lib/meta/json_schema/builders/array_schema_builder.rb +11 -10
  54. data/lib/meta/json_schema/builders/dynamic_schema_builder.rb +23 -0
  55. data/lib/meta/json_schema/builders/object_schema_builder.rb +4 -18
  56. data/lib/meta/json_schema/builders/ref_schema_builder.rb +19 -0
  57. data/lib/meta/json_schema/builders/schema_builder_tool.rb +26 -1
  58. data/lib/meta/json_schema/schemas/array_schema.rb +3 -3
  59. data/lib/meta/json_schema/schemas/base_schema.rb +29 -69
  60. data/lib/meta/json_schema/schemas/dynamic_schema.rb +29 -0
  61. data/lib/meta/json_schema/schemas/object_schema.rb +27 -113
  62. data/lib/meta/json_schema/schemas/properties.rb +157 -0
  63. data/lib/meta/json_schema/schemas/ref_schema.rb +35 -0
  64. data/lib/meta/json_schema/schemas.rb +0 -2
  65. data/lib/meta/json_schema/support/schema_options.rb +21 -12
  66. data/lib/meta/json_schema.rb +2 -0
  67. data/lib/meta/rails.rb +98 -0
  68. data/lib/meta/route_dsl/parameters_builder.rb +2 -1
  69. data/lib/meta/swagger_doc.rb +5 -2
  70. data/lib/meta/utils/kwargs/builder.rb +115 -0
  71. data/lib/meta/utils/{kwargs.rb → kwargs/check.rb} +22 -22
  72. data/meta-api.gemspec +1 -1
  73. metadata +55 -4
@@ -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
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # 运行时检查关键字参数。
3
+ # 运行时检查关键字参数。(已过时,请使用 Builder)
4
4
  #
5
5
  # 在 Ruby 3 中,关键字参数有所变化。简单来说,关键字参数和 Hash 类型不再自动转化,并且一般情况下推荐使用关键字参数。
6
6
  # 但关键字参数还是有稍稍不足之处,比如在做一些复杂的关键字参数定义时。
@@ -58,33 +58,33 @@ module Meta
58
58
 
59
59
  private
60
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
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}"
71
70
  end
71
+ end
72
72
 
73
- def build_schemas_from_array(spec_array)
74
- spec_array.inject({}) do |accumulated, val|
75
- accumulated.merge!(build_schemas(val))
76
- end
73
+ def build_schemas_from_array(spec_array)
74
+ spec_array.inject({}) do |accumulated, val|
75
+ accumulated.merge!(build_schemas(val))
77
76
  end
77
+ end
78
78
 
79
- def build_schemas_from_hash(spec_hash)
80
- spec_hash.transform_values do |val|
81
- { default: val }
82
- end
79
+ def build_schemas_from_hash(spec_hash)
80
+ spec_hash.transform_values do |val|
81
+ { default: val }
83
82
  end
83
+ end
84
84
 
85
- def build_schemas_from_symbol(spec_symbol)
86
- { spec_symbol => {} }
87
- end
85
+ def build_schemas_from_symbol(spec_symbol)
86
+ { spec_symbol => {} }
87
+ end
88
88
  end
89
89
  end
90
90
  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.2"
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.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - yetrun
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-03-08 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:
@@ -27,7 +27,9 @@ files:
27
27
  - README.md
28
28
  - Rakefile
29
29
  - config/locales/zh-CN.yml
30
+ - docs/Rails.md
30
31
  - docs/名称由来.md
32
+ - docs/如何贡献.md
31
33
  - docs/教程.md
32
34
  - docs/索引.md
33
35
  - examples/lobster.rb
@@ -35,29 +37,77 @@ files:
35
37
  - examples/rack_app/config.ru
36
38
  - examples/rack_app/hello.rb
37
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
38
80
  - lib/meta/api.rb
39
81
  - lib/meta/application.rb
40
82
  - lib/meta/application/application.rb
41
83
  - lib/meta/application/execution.rb
42
- - lib/meta/application/meta.rb
84
+ - lib/meta/application/metadata.rb
85
+ - lib/meta/application/parameters.rb
43
86
  - lib/meta/application/path_matching_mod.rb
44
87
  - lib/meta/application/route.rb
45
88
  - lib/meta/config.rb
46
89
  - lib/meta/entity.rb
47
90
  - lib/meta/errors.rb
91
+ - lib/meta/json_schema.rb
48
92
  - lib/meta/json_schema/builders/array_schema_builder.rb
93
+ - lib/meta/json_schema/builders/dynamic_schema_builder.rb
49
94
  - lib/meta/json_schema/builders/object_schema_builder.rb
95
+ - lib/meta/json_schema/builders/ref_schema_builder.rb
50
96
  - lib/meta/json_schema/builders/schema_builder_tool.rb
51
97
  - lib/meta/json_schema/schemas.rb
52
98
  - lib/meta/json_schema/schemas/array_schema.rb
53
99
  - lib/meta/json_schema/schemas/base_schema.rb
100
+ - lib/meta/json_schema/schemas/dynamic_schema.rb
54
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
55
104
  - lib/meta/json_schema/support/errors.rb
56
105
  - lib/meta/json_schema/support/presenters.rb
57
106
  - lib/meta/json_schema/support/schema_options.rb
58
107
  - lib/meta/json_schema/support/type_converter.rb
59
108
  - lib/meta/json_schema/support/validators.rb
60
109
  - lib/meta/load_i18n.rb
110
+ - lib/meta/rails.rb
61
111
  - lib/meta/route_dsl/action_builder.rb
62
112
  - lib/meta/route_dsl/application_builder.rb
63
113
  - lib/meta/route_dsl/chain_builder.rb
@@ -67,7 +117,8 @@ files:
67
117
  - lib/meta/route_dsl/route_builder.rb
68
118
  - lib/meta/route_dsl/uniformed_params_builder.rb
69
119
  - lib/meta/swagger_doc.rb
70
- - lib/meta/utils/kwargs.rb
120
+ - lib/meta/utils/kwargs/builder.rb
121
+ - lib/meta/utils/kwargs/check.rb
71
122
  - lib/meta/utils/path.rb
72
123
  - meta-api.gemspec
73
124
  homepage: https://github.com/yetrun/web-frame