apiwork 0.0.0.pre → 0.1.2

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 (202) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +2 -2
  3. data/README.md +117 -1
  4. data/Rakefile +5 -3
  5. data/app/controllers/apiwork/errors_controller.rb +13 -0
  6. data/app/controllers/apiwork/exports_controller.rb +22 -0
  7. data/lib/apiwork/abstractable.rb +26 -0
  8. data/lib/apiwork/adapter/base.rb +369 -0
  9. data/lib/apiwork/adapter/builder/api/base.rb +66 -0
  10. data/lib/apiwork/adapter/builder/contract/base.rb +86 -0
  11. data/lib/apiwork/adapter/capability/api/base.rb +51 -0
  12. data/lib/apiwork/adapter/capability/api/scope.rb +64 -0
  13. data/lib/apiwork/adapter/capability/base.rb +291 -0
  14. data/lib/apiwork/adapter/capability/contract/base.rb +37 -0
  15. data/lib/apiwork/adapter/capability/contract/scope.rb +110 -0
  16. data/lib/apiwork/adapter/capability/operation/base.rb +172 -0
  17. data/lib/apiwork/adapter/capability/operation/metadata_shape.rb +165 -0
  18. data/lib/apiwork/adapter/capability/result.rb +21 -0
  19. data/lib/apiwork/adapter/capability/runner.rb +56 -0
  20. data/lib/apiwork/adapter/capability/transformer/request/base.rb +72 -0
  21. data/lib/apiwork/adapter/capability/transformer/response/base.rb +45 -0
  22. data/lib/apiwork/adapter/registry.rb +16 -0
  23. data/lib/apiwork/adapter/serializer/error/base.rb +72 -0
  24. data/lib/apiwork/adapter/serializer/error/default/api_builder.rb +32 -0
  25. data/lib/apiwork/adapter/serializer/error/default.rb +37 -0
  26. data/lib/apiwork/adapter/serializer/resource/base.rb +84 -0
  27. data/lib/apiwork/adapter/serializer/resource/default/contract_builder.rb +209 -0
  28. data/lib/apiwork/adapter/serializer/resource/default.rb +39 -0
  29. data/lib/apiwork/adapter/standard/capability/filtering/api_builder.rb +75 -0
  30. data/lib/apiwork/adapter/standard/capability/filtering/constants.rb +37 -0
  31. data/lib/apiwork/adapter/standard/capability/filtering/contract_builder.rb +193 -0
  32. data/lib/apiwork/adapter/standard/capability/filtering/operation/filter/builder.rb +47 -0
  33. data/lib/apiwork/adapter/standard/capability/filtering/operation/filter/operator_builder.rb +36 -0
  34. data/lib/apiwork/adapter/standard/capability/filtering/operation/filter.rb +462 -0
  35. data/lib/apiwork/adapter/standard/capability/filtering/operation.rb +22 -0
  36. data/lib/apiwork/adapter/standard/capability/filtering/request_transformer.rb +47 -0
  37. data/lib/apiwork/adapter/standard/capability/filtering.rb +18 -0
  38. data/lib/apiwork/adapter/standard/capability/including/contract_builder.rb +169 -0
  39. data/lib/apiwork/adapter/standard/capability/including/operation.rb +20 -0
  40. data/lib/apiwork/adapter/standard/capability/including.rb +16 -0
  41. data/lib/apiwork/adapter/standard/capability/pagination/api_builder.rb +34 -0
  42. data/lib/apiwork/adapter/standard/capability/pagination/contract_builder.rb +35 -0
  43. data/lib/apiwork/adapter/standard/capability/pagination/operation/paginate/cursor.rb +84 -0
  44. data/lib/apiwork/adapter/standard/capability/pagination/operation/paginate/offset.rb +66 -0
  45. data/lib/apiwork/adapter/standard/capability/pagination/operation/paginate.rb +24 -0
  46. data/lib/apiwork/adapter/standard/capability/pagination/operation.rb +24 -0
  47. data/lib/apiwork/adapter/standard/capability/pagination.rb +21 -0
  48. data/lib/apiwork/adapter/standard/capability/sorting/api_builder.rb +19 -0
  49. data/lib/apiwork/adapter/standard/capability/sorting/contract_builder.rb +84 -0
  50. data/lib/apiwork/adapter/standard/capability/sorting/operation/sort.rb +83 -0
  51. data/lib/apiwork/adapter/standard/capability/sorting/operation.rb +22 -0
  52. data/lib/apiwork/adapter/standard/capability/sorting.rb +17 -0
  53. data/lib/apiwork/adapter/standard/capability/writing/constants.rb +15 -0
  54. data/lib/apiwork/adapter/standard/capability/writing/contract_builder.rb +253 -0
  55. data/lib/apiwork/adapter/standard/capability/writing/operation/issue_mapper.rb +210 -0
  56. data/lib/apiwork/adapter/standard/capability/writing/operation.rb +32 -0
  57. data/lib/apiwork/adapter/standard/capability/writing/request_transformer.rb +37 -0
  58. data/lib/apiwork/adapter/standard/capability/writing.rb +17 -0
  59. data/lib/apiwork/adapter/standard/includes_resolver.rb +106 -0
  60. data/lib/apiwork/adapter/standard.rb +22 -0
  61. data/lib/apiwork/adapter/wrapper/base.rb +70 -0
  62. data/lib/apiwork/adapter/wrapper/collection/base.rb +60 -0
  63. data/lib/apiwork/adapter/wrapper/collection/default.rb +47 -0
  64. data/lib/apiwork/adapter/wrapper/error/base.rb +30 -0
  65. data/lib/apiwork/adapter/wrapper/error/default.rb +34 -0
  66. data/lib/apiwork/adapter/wrapper/member/base.rb +58 -0
  67. data/lib/apiwork/adapter/wrapper/member/default.rb +40 -0
  68. data/lib/apiwork/adapter/wrapper/shape.rb +203 -0
  69. data/lib/apiwork/adapter.rb +50 -0
  70. data/lib/apiwork/api/base.rb +802 -0
  71. data/lib/apiwork/api/element.rb +110 -0
  72. data/lib/apiwork/api/enum_registry/definition.rb +51 -0
  73. data/lib/apiwork/api/enum_registry.rb +98 -0
  74. data/lib/apiwork/api/info/contact.rb +67 -0
  75. data/lib/apiwork/api/info/license.rb +50 -0
  76. data/lib/apiwork/api/info/server.rb +50 -0
  77. data/lib/apiwork/api/info.rb +221 -0
  78. data/lib/apiwork/api/object.rb +235 -0
  79. data/lib/apiwork/api/registry.rb +33 -0
  80. data/lib/apiwork/api/representation_registry.rb +76 -0
  81. data/lib/apiwork/api/resource/action.rb +41 -0
  82. data/lib/apiwork/api/resource.rb +648 -0
  83. data/lib/apiwork/api/router.rb +104 -0
  84. data/lib/apiwork/api/type_registry/definition.rb +117 -0
  85. data/lib/apiwork/api/type_registry.rb +99 -0
  86. data/lib/apiwork/api/union.rb +49 -0
  87. data/lib/apiwork/api.rb +85 -0
  88. data/lib/apiwork/configurable.rb +71 -0
  89. data/lib/apiwork/configuration/option.rb +125 -0
  90. data/lib/apiwork/configuration/validatable.rb +25 -0
  91. data/lib/apiwork/configuration.rb +95 -0
  92. data/lib/apiwork/configuration_error.rb +6 -0
  93. data/lib/apiwork/constraint_error.rb +20 -0
  94. data/lib/apiwork/contract/action/request.rb +79 -0
  95. data/lib/apiwork/contract/action/response.rb +87 -0
  96. data/lib/apiwork/contract/action.rb +258 -0
  97. data/lib/apiwork/contract/base.rb +714 -0
  98. data/lib/apiwork/contract/element.rb +130 -0
  99. data/lib/apiwork/contract/object/coercer.rb +194 -0
  100. data/lib/apiwork/contract/object/deserializer.rb +101 -0
  101. data/lib/apiwork/contract/object/transformer.rb +95 -0
  102. data/lib/apiwork/contract/object/validator/result.rb +27 -0
  103. data/lib/apiwork/contract/object/validator.rb +734 -0
  104. data/lib/apiwork/contract/object.rb +566 -0
  105. data/lib/apiwork/contract/request_parser/result.rb +25 -0
  106. data/lib/apiwork/contract/request_parser.rb +72 -0
  107. data/lib/apiwork/contract/response_parser/result.rb +25 -0
  108. data/lib/apiwork/contract/response_parser.rb +35 -0
  109. data/lib/apiwork/contract/union.rb +56 -0
  110. data/lib/apiwork/contract_error.rb +9 -0
  111. data/lib/apiwork/controller.rb +300 -0
  112. data/lib/apiwork/domain_error.rb +13 -0
  113. data/lib/apiwork/element.rb +386 -0
  114. data/lib/apiwork/engine.rb +20 -0
  115. data/lib/apiwork/error.rb +6 -0
  116. data/lib/apiwork/error_code/definition.rb +63 -0
  117. data/lib/apiwork/error_code/registry.rb +18 -0
  118. data/lib/apiwork/error_code.rb +132 -0
  119. data/lib/apiwork/export/base.rb +291 -0
  120. data/lib/apiwork/export/open_api.rb +600 -0
  121. data/lib/apiwork/export/pipeline/writer.rb +66 -0
  122. data/lib/apiwork/export/pipeline.rb +84 -0
  123. data/lib/apiwork/export/registry.rb +16 -0
  124. data/lib/apiwork/export/surface_resolver.rb +189 -0
  125. data/lib/apiwork/export/type_analysis.rb +170 -0
  126. data/lib/apiwork/export/type_script.rb +23 -0
  127. data/lib/apiwork/export/type_script_mapper.rb +349 -0
  128. data/lib/apiwork/export/zod.rb +39 -0
  129. data/lib/apiwork/export/zod_mapper.rb +421 -0
  130. data/lib/apiwork/export.rb +80 -0
  131. data/lib/apiwork/http_error.rb +16 -0
  132. data/lib/apiwork/introspection/action/request.rb +66 -0
  133. data/lib/apiwork/introspection/action/response.rb +57 -0
  134. data/lib/apiwork/introspection/action.rb +124 -0
  135. data/lib/apiwork/introspection/api/info/contact.rb +59 -0
  136. data/lib/apiwork/introspection/api/info/license.rb +49 -0
  137. data/lib/apiwork/introspection/api/info/server.rb +50 -0
  138. data/lib/apiwork/introspection/api/info.rb +107 -0
  139. data/lib/apiwork/introspection/api/resource.rb +83 -0
  140. data/lib/apiwork/introspection/api.rb +92 -0
  141. data/lib/apiwork/introspection/contract.rb +63 -0
  142. data/lib/apiwork/introspection/dump/action.rb +101 -0
  143. data/lib/apiwork/introspection/dump/api.rb +119 -0
  144. data/lib/apiwork/introspection/dump/contract.rb +129 -0
  145. data/lib/apiwork/introspection/dump/param.rb +486 -0
  146. data/lib/apiwork/introspection/dump/resource.rb +112 -0
  147. data/lib/apiwork/introspection/dump/type.rb +339 -0
  148. data/lib/apiwork/introspection/dump.rb +17 -0
  149. data/lib/apiwork/introspection/enum.rb +63 -0
  150. data/lib/apiwork/introspection/error_code.rb +44 -0
  151. data/lib/apiwork/introspection/param/array.rb +88 -0
  152. data/lib/apiwork/introspection/param/base.rb +285 -0
  153. data/lib/apiwork/introspection/param/binary.rb +73 -0
  154. data/lib/apiwork/introspection/param/boolean.rb +73 -0
  155. data/lib/apiwork/introspection/param/date.rb +73 -0
  156. data/lib/apiwork/introspection/param/date_time.rb +73 -0
  157. data/lib/apiwork/introspection/param/decimal.rb +121 -0
  158. data/lib/apiwork/introspection/param/integer.rb +131 -0
  159. data/lib/apiwork/introspection/param/literal.rb +45 -0
  160. data/lib/apiwork/introspection/param/number.rb +121 -0
  161. data/lib/apiwork/introspection/param/object.rb +59 -0
  162. data/lib/apiwork/introspection/param/reference.rb +45 -0
  163. data/lib/apiwork/introspection/param/string.rb +122 -0
  164. data/lib/apiwork/introspection/param/time.rb +73 -0
  165. data/lib/apiwork/introspection/param/union.rb +57 -0
  166. data/lib/apiwork/introspection/param/unknown.rb +26 -0
  167. data/lib/apiwork/introspection/param/uuid.rb +73 -0
  168. data/lib/apiwork/introspection/param.rb +31 -0
  169. data/lib/apiwork/introspection/type.rb +129 -0
  170. data/lib/apiwork/introspection.rb +28 -0
  171. data/lib/apiwork/issue.rb +80 -0
  172. data/lib/apiwork/json_pointer.rb +21 -0
  173. data/lib/apiwork/object.rb +1618 -0
  174. data/lib/apiwork/reference_generator.rb +638 -0
  175. data/lib/apiwork/registry.rb +56 -0
  176. data/lib/apiwork/representation/association.rb +391 -0
  177. data/lib/apiwork/representation/attribute.rb +335 -0
  178. data/lib/apiwork/representation/base.rb +819 -0
  179. data/lib/apiwork/representation/deserializer.rb +95 -0
  180. data/lib/apiwork/representation/element.rb +128 -0
  181. data/lib/apiwork/representation/inheritance.rb +78 -0
  182. data/lib/apiwork/representation/model_detector.rb +75 -0
  183. data/lib/apiwork/representation/root_key.rb +35 -0
  184. data/lib/apiwork/representation/serializer.rb +127 -0
  185. data/lib/apiwork/request.rb +79 -0
  186. data/lib/apiwork/response.rb +56 -0
  187. data/lib/apiwork/union.rb +102 -0
  188. data/lib/apiwork/version.rb +2 -2
  189. data/lib/apiwork.rb +61 -3
  190. data/lib/generators/apiwork/api_generator.rb +38 -0
  191. data/lib/generators/apiwork/contract_generator.rb +25 -0
  192. data/lib/generators/apiwork/install_generator.rb +27 -0
  193. data/lib/generators/apiwork/representation_generator.rb +25 -0
  194. data/lib/generators/apiwork/templates/api/api.rb.tt +4 -0
  195. data/lib/generators/apiwork/templates/contract/contract.rb.tt +6 -0
  196. data/lib/generators/apiwork/templates/install/application_contract.rb.tt +5 -0
  197. data/lib/generators/apiwork/templates/install/application_representation.rb.tt +5 -0
  198. data/lib/generators/apiwork/templates/representation/representation.rb.tt +6 -0
  199. data/lib/tasks/apiwork.rake +102 -0
  200. metadata +319 -19
  201. data/.rubocop.yml +0 -8
  202. data/sig/apiwork.rbs +0 -4
@@ -0,0 +1,131 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Apiwork
4
+ module Introspection
5
+ module Param
6
+ # @api public
7
+ # Integer param representing whole number values.
8
+ #
9
+ # @example Basic usage
10
+ # param.type # => :integer
11
+ # param.scalar? # => true
12
+ # param.integer? # => true
13
+ # param.numeric? # => true
14
+ #
15
+ # @example Constraints
16
+ # param.min # => 0 or nil
17
+ # param.max # => 100 or nil
18
+ # param.format # => :int32 or nil
19
+ # param.boundable? # => true
20
+ # param.formattable? # => true
21
+ #
22
+ # @example Enum
23
+ # if param.enum?
24
+ # param.enum # => [1, 2, 3]
25
+ # param.enum_reference? # => false
26
+ # end
27
+ class Integer < Base
28
+ # @api public
29
+ # The minimum for this param.
30
+ #
31
+ # @return [Numeric, nil]
32
+ def min
33
+ @dump[:min]
34
+ end
35
+
36
+ # @api public
37
+ # The maximum for this param.
38
+ #
39
+ # @return [Numeric, nil]
40
+ def max
41
+ @dump[:max]
42
+ end
43
+
44
+ # @api public
45
+ # The format for this param.
46
+ #
47
+ # @return [Symbol, nil]
48
+ def format
49
+ @dump[:format]
50
+ end
51
+
52
+ # @api public
53
+ # Whether this param is scalar.
54
+ #
55
+ # @return [Boolean]
56
+ def scalar?
57
+ true
58
+ end
59
+
60
+ # @api public
61
+ # Whether this param has an enum.
62
+ #
63
+ # @return [Boolean]
64
+ def enum?
65
+ @dump[:enum].present?
66
+ end
67
+
68
+ # @api public
69
+ # The enum for this param.
70
+ #
71
+ # @return [Array<Integer>, Symbol, nil]
72
+ def enum
73
+ @dump[:enum]
74
+ end
75
+
76
+ # @api public
77
+ # Whether this param is an enum reference.
78
+ #
79
+ # @return [Boolean]
80
+ def enum_reference?
81
+ @dump[:enum].is_a?(Symbol)
82
+ end
83
+
84
+ # @api public
85
+ # Whether this param is numeric.
86
+ #
87
+ # @return [Boolean]
88
+ def numeric?
89
+ true
90
+ end
91
+
92
+ # @api public
93
+ # Whether this param is boundable.
94
+ #
95
+ # @return [Boolean]
96
+ def boundable?
97
+ true
98
+ end
99
+
100
+ # @api public
101
+ # Whether this param is formattable.
102
+ #
103
+ # @return [Boolean]
104
+ def formattable?
105
+ true
106
+ end
107
+
108
+ # @api public
109
+ # Whether this param is an integer.
110
+ #
111
+ # @return [Boolean]
112
+ def integer?
113
+ true
114
+ end
115
+
116
+ # @api public
117
+ # Converts this param to a hash.
118
+ #
119
+ # @return [Hash]
120
+ def to_h
121
+ result = super
122
+ result[:enum] = enum if enum?
123
+ result[:format] = format
124
+ result[:max] = max
125
+ result[:min] = min
126
+ result
127
+ end
128
+ end
129
+ end
130
+ end
131
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Apiwork
4
+ module Introspection
5
+ module Param
6
+ # @api public
7
+ # Literal param representing a constant value.
8
+ #
9
+ # @example Basic usage
10
+ # param.type # => :literal
11
+ # param.literal? # => true
12
+ # param.scalar? # => false
13
+ #
14
+ # @example Value
15
+ # param.value # => "active" or 42 or true
16
+ class Literal < Base
17
+ # @api public
18
+ # The value for this param.
19
+ #
20
+ # @return [String, Numeric, Boolean, nil]
21
+ def value
22
+ @dump[:value]
23
+ end
24
+
25
+ # @api public
26
+ # Whether this param is a literal.
27
+ #
28
+ # @return [Boolean]
29
+ def literal?
30
+ true
31
+ end
32
+
33
+ # @api public
34
+ # Converts this param to a hash.
35
+ #
36
+ # @return [Hash]
37
+ def to_h
38
+ result = super
39
+ result[:value] = value
40
+ result
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,121 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Apiwork
4
+ module Introspection
5
+ module Param
6
+ # @api public
7
+ # Number param representing floating-point number values.
8
+ #
9
+ # @example Basic usage
10
+ # param.type # => :number
11
+ # param.scalar? # => true
12
+ # param.number? # => true
13
+ # param.numeric? # => true
14
+ #
15
+ # @example Constraints
16
+ # param.min # => 0.0 or nil
17
+ # param.max # => 100.0 or nil
18
+ # param.boundable? # => true
19
+ # param.formattable? # => false
20
+ #
21
+ # @example Enum
22
+ # if param.enum?
23
+ # param.enum # => [0.5, 1.0, 1.5]
24
+ # param.enum_reference? # => false
25
+ # end
26
+ class Number < Base
27
+ # @api public
28
+ # The minimum for this param.
29
+ #
30
+ # @return [Numeric, nil]
31
+ def min
32
+ @dump[:min]
33
+ end
34
+
35
+ # @api public
36
+ # The maximum for this param.
37
+ #
38
+ # @return [Numeric, nil]
39
+ def max
40
+ @dump[:max]
41
+ end
42
+
43
+ # @api public
44
+ # Whether this param is scalar.
45
+ #
46
+ # @return [Boolean]
47
+ def scalar?
48
+ true
49
+ end
50
+
51
+ # @api public
52
+ # Whether this param has an enum.
53
+ #
54
+ # @return [Boolean]
55
+ def enum?
56
+ @dump[:enum].present?
57
+ end
58
+
59
+ # @api public
60
+ # The enum for this param.
61
+ #
62
+ # @return [Array<Numeric>, Symbol, nil]
63
+ def enum
64
+ @dump[:enum]
65
+ end
66
+
67
+ # @api public
68
+ # Whether this param is an enum reference.
69
+ #
70
+ # @return [Boolean]
71
+ def enum_reference?
72
+ @dump[:enum].is_a?(Symbol)
73
+ end
74
+
75
+ # @api public
76
+ # Whether this param is numeric.
77
+ #
78
+ # @return [Boolean]
79
+ def numeric?
80
+ true
81
+ end
82
+
83
+ # @api public
84
+ # Whether this param is boundable.
85
+ #
86
+ # @return [Boolean]
87
+ def boundable?
88
+ true
89
+ end
90
+
91
+ # @api public
92
+ # Whether this param is a number.
93
+ #
94
+ # @return [Boolean]
95
+ def number?
96
+ true
97
+ end
98
+
99
+ # @api public
100
+ # Whether this param is formattable.
101
+ #
102
+ # @return [Boolean]
103
+ def formattable?
104
+ false
105
+ end
106
+
107
+ # @api public
108
+ # Converts this param to a hash.
109
+ #
110
+ # @return [Hash]
111
+ def to_h
112
+ result = super
113
+ result[:enum] = enum if enum?
114
+ result[:max] = max
115
+ result[:min] = min
116
+ result
117
+ end
118
+ end
119
+ end
120
+ end
121
+ end
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Apiwork
4
+ module Introspection
5
+ module Param
6
+ # @api public
7
+ # Object param representing structured data with named fields.
8
+ #
9
+ # @example Basic usage
10
+ # param.type # => :object
11
+ # param.object? # => true
12
+ # param.scalar? # => false
13
+ #
14
+ # @example Fields
15
+ # param.shape # => { name: Param, email: Param }
16
+ #
17
+ # @example Partial objects (for updates)
18
+ # param.partial? # => true if all fields are optional
19
+ class Object < Base
20
+ # @api public
21
+ # The shape for this param.
22
+ #
23
+ # @return [Hash{Symbol => Param::Base}]
24
+ def shape
25
+ return @shape if defined?(@shape)
26
+
27
+ @shape = @dump[:shape]&.transform_values { |dump| Param.build(dump) } || {}
28
+ end
29
+
30
+ # @api public
31
+ # Whether this param is partial.
32
+ #
33
+ # @return [Boolean]
34
+ def partial?
35
+ @dump[:partial]
36
+ end
37
+
38
+ # @api public
39
+ # Whether this param is an object.
40
+ #
41
+ # @return [Boolean]
42
+ def object?
43
+ true
44
+ end
45
+
46
+ # @api public
47
+ # Converts this param to a hash.
48
+ #
49
+ # @return [Hash]
50
+ def to_h
51
+ result = super
52
+ result[:partial] = partial?
53
+ result[:shape] = shape.transform_values(&:to_h)
54
+ result
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Apiwork
4
+ module Introspection
5
+ module Param
6
+ # @api public
7
+ # Reference param representing a reference to a named type.
8
+ #
9
+ # @example Basic usage
10
+ # param.type # => :reference
11
+ # param.reference? # => true
12
+ # param.scalar? # => false
13
+ #
14
+ # @example Reference
15
+ # param.reference # => :address
16
+ class Reference < Base
17
+ # @api public
18
+ # The reference for this param.
19
+ #
20
+ # @return [Symbol]
21
+ def reference
22
+ @dump[:reference]
23
+ end
24
+
25
+ # @api public
26
+ # Whether this param is a reference.
27
+ #
28
+ # @return [Boolean]
29
+ def reference?
30
+ true
31
+ end
32
+
33
+ # @api public
34
+ # Converts this param to a hash.
35
+ #
36
+ # @return [Hash]
37
+ def to_h
38
+ result = super
39
+ result[:reference] = reference
40
+ result
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,122 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Apiwork
4
+ module Introspection
5
+ module Param
6
+ # @api public
7
+ # String param representing text values.
8
+ #
9
+ # @example Basic usage
10
+ # param.type # => :string
11
+ # param.scalar? # => true
12
+ # param.string? # => true
13
+ #
14
+ # @example Constraints
15
+ # param.min # => 1 or nil
16
+ # param.max # => 255 or nil
17
+ # param.format # => :email or nil
18
+ # param.boundable? # => true
19
+ # param.formattable? # => true
20
+ #
21
+ # @example Enum
22
+ # if param.enum?
23
+ # param.enum # => ["draft", "published"]
24
+ # param.enum_reference? # => false
25
+ # end
26
+ class String < Base
27
+ # @api public
28
+ # The format for this param.
29
+ #
30
+ # @return [Symbol, nil]
31
+ def format
32
+ @dump[:format]
33
+ end
34
+
35
+ # @api public
36
+ # The minimum for this param.
37
+ #
38
+ # @return [Integer, nil]
39
+ def min
40
+ @dump[:min]
41
+ end
42
+
43
+ # @api public
44
+ # The maximum for this param.
45
+ #
46
+ # @return [Integer, nil]
47
+ def max
48
+ @dump[:max]
49
+ end
50
+
51
+ # @api public
52
+ # Whether this param is scalar.
53
+ #
54
+ # @return [Boolean]
55
+ def scalar?
56
+ true
57
+ end
58
+
59
+ # @api public
60
+ # Whether this param has an enum.
61
+ #
62
+ # @return [Boolean]
63
+ def enum?
64
+ @dump[:enum].present?
65
+ end
66
+
67
+ # @api public
68
+ # The enum for this param.
69
+ #
70
+ # @return [Array<String>, Symbol, nil]
71
+ def enum
72
+ @dump[:enum]
73
+ end
74
+
75
+ # @api public
76
+ # Whether this param is an enum reference.
77
+ #
78
+ # @return [Boolean]
79
+ def enum_reference?
80
+ @dump[:enum].is_a?(Symbol)
81
+ end
82
+
83
+ # @api public
84
+ # Whether this param is boundable.
85
+ #
86
+ # @return [Boolean]
87
+ def boundable?
88
+ true
89
+ end
90
+
91
+ # @api public
92
+ # Whether this param is formattable.
93
+ #
94
+ # @return [Boolean]
95
+ def formattable?
96
+ true
97
+ end
98
+
99
+ # @api public
100
+ # Whether this param is a string.
101
+ #
102
+ # @return [Boolean]
103
+ def string?
104
+ true
105
+ end
106
+
107
+ # @api public
108
+ # Converts this param to a hash.
109
+ #
110
+ # @return [Hash]
111
+ def to_h
112
+ result = super
113
+ result[:enum] = enum if enum?
114
+ result[:format] = format
115
+ result[:max] = max
116
+ result[:min] = min
117
+ result
118
+ end
119
+ end
120
+ end
121
+ end
122
+ end
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Apiwork
4
+ module Introspection
5
+ module Param
6
+ # @api public
7
+ # Time param representing time-of-day values.
8
+ #
9
+ # @example Basic usage
10
+ # param.type # => :time
11
+ # param.scalar? # => true
12
+ # param.time? # => true
13
+ #
14
+ # @example Capabilities
15
+ # param.formattable? # => false
16
+ #
17
+ # @example Enum
18
+ # if param.enum?
19
+ # param.enum # => ["09:00", "17:00"]
20
+ # param.enum_reference? # => false
21
+ # end
22
+ class Time < Base
23
+ # @api public
24
+ # Whether this param is scalar.
25
+ #
26
+ # @return [Boolean]
27
+ def scalar?
28
+ true
29
+ end
30
+
31
+ # @api public
32
+ # Whether this param has an enum.
33
+ #
34
+ # @return [Boolean]
35
+ def enum?
36
+ @dump[:enum].present?
37
+ end
38
+
39
+ # @api public
40
+ # The enum for this param.
41
+ #
42
+ # @return [Array<String>, Symbol, nil]
43
+ def enum
44
+ @dump[:enum]
45
+ end
46
+
47
+ # @api public
48
+ # Whether this param is an enum reference.
49
+ #
50
+ # @return [Boolean]
51
+ def enum_reference?
52
+ @dump[:enum].is_a?(Symbol)
53
+ end
54
+
55
+ # @api public
56
+ # Whether this param is a time.
57
+ #
58
+ # @return [Boolean]
59
+ def time?
60
+ true
61
+ end
62
+
63
+ # @api public
64
+ # Whether this param is formattable.
65
+ #
66
+ # @return [Boolean]
67
+ def formattable?
68
+ false
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Apiwork
4
+ module Introspection
5
+ module Param
6
+ # @api public
7
+ # Union param representing a value that can be one of several types.
8
+ #
9
+ # @example Basic usage
10
+ # param.type # => :union
11
+ # param.union? # => true
12
+ # param.scalar? # => false
13
+ #
14
+ # @example Variants
15
+ # param.variants # => [Param, Param, ...]
16
+ #
17
+ # @example Discriminated unions
18
+ # param.discriminator # => :type or nil
19
+ class Union < Base
20
+ # @api public
21
+ # The variants for this param.
22
+ #
23
+ # @return [Array<Param::Base>]
24
+ def variants
25
+ @variants ||= @dump[:variants].map { |dump| Param.build(dump) }
26
+ end
27
+
28
+ # @api public
29
+ # The discriminator for this param.
30
+ #
31
+ # @return [Symbol, nil]
32
+ def discriminator
33
+ @dump[:discriminator]
34
+ end
35
+
36
+ # @api public
37
+ # Whether this param is a union.
38
+ #
39
+ # @return [Boolean]
40
+ def union?
41
+ true
42
+ end
43
+
44
+ # @api public
45
+ # Converts this param to a hash.
46
+ #
47
+ # @return [Hash]
48
+ def to_h
49
+ result = super
50
+ result[:discriminator] = discriminator
51
+ result[:variants] = variants.map(&:to_h)
52
+ result
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Apiwork
4
+ module Introspection
5
+ module Param
6
+ # @api public
7
+ # Unknown param representing an unrecognized type.
8
+ #
9
+ # Used as a fallback when the type cannot be determined during introspection.
10
+ #
11
+ # @example Basic usage
12
+ # param.type # => :unknown
13
+ # param.unknown? # => true
14
+ # param.scalar? # => false
15
+ class Unknown < Base
16
+ # @api public
17
+ # Whether this param is of unknown type.
18
+ #
19
+ # @return [Boolean]
20
+ def unknown?
21
+ true
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end