test-test-sink-test-test 0.0.2.pre.alpha.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (265) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +151 -0
  3. data/lib/sink/base_client.rb +404 -0
  4. data/lib/sink/base_model.rb +226 -0
  5. data/lib/sink/client.rb +391 -0
  6. data/lib/sink/fake_page.rb +44 -0
  7. data/lib/sink/models/address.rb +55 -0
  8. data/lib/sink/models/allof_base_parent.rb +18 -0
  9. data/lib/sink/models/allof_multiple_inline_entries.rb +15 -0
  10. data/lib/sink/models/api_status.rb +18 -0
  11. data/lib/sink/models/array_float_items_response.rb +6 -0
  12. data/lib/sink/models/array_missing_items_response.rb +18 -0
  13. data/lib/sink/models/array_object_items.rb +18 -0
  14. data/lib/sink/models/array_object_items_response.rb +18 -0
  15. data/lib/sink/models/array_recursion.rb +6 -0
  16. data/lib/sink/models/balance.rb +18 -0
  17. data/lib/sink/models/basic_shared_model_object.rb +23 -0
  18. data/lib/sink/models/body_param_top_level_all_of_response.rb +28 -0
  19. data/lib/sink/models/body_param_top_level_any_of_response.rb +6 -0
  20. data/lib/sink/models/body_param_top_level_one_of_response.rb +6 -0
  21. data/lib/sink/models/body_param_union_overlapping_prop_response.rb +19 -0
  22. data/lib/sink/models/card.rb +211 -0
  23. data/lib/sink/models/card_list_response.rb +36 -0
  24. data/lib/sink/models/card_provision_foo_response.rb +18 -0
  25. data/lib/sink/models/child_inlined_response_response.rb +18 -0
  26. data/lib/sink/models/child_model.rb +36 -0
  27. data/lib/sink/models/class_.rb +18 -0
  28. data/lib/sink/models/client.rb +23 -0
  29. data/lib/sink/models/company.rb +18 -0
  30. data/lib/sink/models/company_payment.rb +18 -0
  31. data/lib/sink/models/complex_query_array_query_response.rb +26 -0
  32. data/lib/sink/models/config_tool_model_ref_from_nested_response_body_response.rb +32 -0
  33. data/lib/sink/models/currency.rb +23 -0
  34. data/lib/sink/models/decorator_test_keep_me_response.rb +18 -0
  35. data/lib/sink/models/docstring_leading_double_quote_response.rb +20 -0
  36. data/lib/sink/models/docstring_trailing_double_quote_response.rb +32 -0
  37. data/lib/sink/models/documents.rb +23 -0
  38. data/lib/sink/models/eeoc.rb +18 -0
  39. data/lib/sink/models/employment_data.rb +18 -0
  40. data/lib/sink/models/enum_basic_response.rb +62 -0
  41. data/lib/sink/models/envelope_inline_response_response.rb +18 -0
  42. data/lib/sink/models/envelope_wrapped_array_response.rb +6 -0
  43. data/lib/sink/models/export.rb +19 -0
  44. data/lib/sink/models/file_create_multipart_response.rb +18 -0
  45. data/lib/sink/models/file_everything_multipart_response.rb +19 -0
  46. data/lib/sink/models/file_no_file_multipart_response.rb +18 -0
  47. data/lib/sink/models/file_with_optional_param_response.rb +18 -0
  48. data/lib/sink/models/funding_account.rb +100 -0
  49. data/lib/sink/models/import.rb +18 -0
  50. data/lib/sink/models/interface.rb +18 -0
  51. data/lib/sink/models/keep_this_resource_keep_this_method_response.rb +19 -0
  52. data/lib/sink/models/make_ambiguous_schemas_explicit_make_ambiguous_schemas_explicit_response.rb +45 -0
  53. data/lib/sink/models/make_ambiguous_schemas_looser_make_ambiguous_schemas_looser_response.rb +45 -0
  54. data/lib/sink/models/map_nullable_items_response.rb +28 -0
  55. data/lib/sink/models/method_config_skipped_tests_all_response.rb +19 -0
  56. data/lib/sink/models/method_config_skipped_tests_go_response.rb +19 -0
  57. data/lib/sink/models/method_config_skipped_tests_java_response.rb +19 -0
  58. data/lib/sink/models/method_config_skipped_tests_kotlin_response.rb +19 -0
  59. data/lib/sink/models/method_config_skipped_tests_node_and_python_response.rb +19 -0
  60. data/lib/sink/models/method_config_skipped_tests_node_response.rb +19 -0
  61. data/lib/sink/models/method_config_skipped_tests_python_response.rb +19 -0
  62. data/lib/sink/models/method_config_skipped_tests_ruby_response.rb +19 -0
  63. data/lib/sink/models/model_from_nested_path.rb +39 -0
  64. data/lib/sink/models/model_from_nested_response_body_ref.rb +18 -0
  65. data/lib/sink/models/model_from_schemas_ref.rb +18 -0
  66. data/lib/sink/models/model_from_schemas_ref_openapi_uri.rb +18 -0
  67. data/lib/sink/models/model_from_schemas_ref_openapi_uri_jmespath.rb +19 -0
  68. data/lib/sink/models/model_from_schemas_ref_openapi_uri_jsonpath.rb +19 -0
  69. data/lib/sink/models/model_level_1.rb +22 -0
  70. data/lib/sink/models/model_level_2.rb +22 -0
  71. data/lib/sink/models/model_level_3.rb +22 -0
  72. data/lib/sink/models/model_referenced_in_parent_and_child.rb +19 -0
  73. data/lib/sink/models/model_with_nested_model.rb +24 -0
  74. data/lib/sink/models/my_model.rb +18 -0
  75. data/lib/sink/models/name_child_prop_import_clash_response.rb +37 -0
  76. data/lib/sink/models/name_properties_common_conflicts_response.rb +84 -0
  77. data/lib/sink/models/name_properties_illegal_go_identifiers_response.rb +19 -0
  78. data/lib/sink/models/name_properties_illegal_javascript_identifiers_response.rb +6 -0
  79. data/lib/sink/models/name_response_property_clashes_model_import_response.rb +24 -0
  80. data/lib/sink/models/name_response_shadows_pydantic_response.rb +24 -0
  81. data/lib/sink/models/nested_request_model_a.rb +18 -0
  82. data/lib/sink/models/nested_request_model_b.rb +18 -0
  83. data/lib/sink/models/nested_request_model_c.rb +31 -0
  84. data/lib/sink/models/object_missing_items_response.rb +18 -0
  85. data/lib/sink/models/object_mixed_known_and_unknown_response.rb +19 -0
  86. data/lib/sink/models/object_multiple_array_properties_same_ref_response.rb +73 -0
  87. data/lib/sink/models/object_multiple_properties_same_model_response.rb +29 -0
  88. data/lib/sink/models/object_multiple_properties_same_ref_response.rb +68 -0
  89. data/lib/sink/models/object_skipped_props.rb +38 -0
  90. data/lib/sink/models/object_two_dimensional_array_primitive_property_response.rb +34 -0
  91. data/lib/sink/models/object_with_any_of_null_property.rb +31 -0
  92. data/lib/sink/models/object_with_child_ref.rb +23 -0
  93. data/lib/sink/models/object_with_one_of_null_property.rb +31 -0
  94. data/lib/sink/models/object_with_union_properties.rb +23 -0
  95. data/lib/sink/models/openapi_format_array_type_one_entry_response.rb +19 -0
  96. data/lib/sink/models/openapi_format_array_type_one_entry_with_null_response.rb +19 -0
  97. data/lib/sink/models/openapi_special_used_used_as_property_name_response.rb +19 -0
  98. data/lib/sink/models/page_cursor_shared_ref_pagination.rb +23 -0
  99. data/lib/sink/models/parent_model_with_child_ref.rb +28 -0
  100. data/lib/sink/models/path_param_colon_suffix_response.rb +18 -0
  101. data/lib/sink/models/path_param_file_extension_response.rb +18 -0
  102. data/lib/sink/models/path_param_multiple_response.rb +18 -0
  103. data/lib/sink/models/path_param_query_param_response.rb +18 -0
  104. data/lib/sink/models/path_param_singular_response.rb +18 -0
  105. data/lib/sink/models/primitive_strings_response.rb +18 -0
  106. data/lib/sink/models/private.rb +18 -0
  107. data/lib/sink/models/public.rb +18 -0
  108. data/lib/sink/models/recursion_create_envelope_response.rb +19 -0
  109. data/lib/sink/models/response_allof_simple_response.rb +23 -0
  110. data/lib/sink/models/response_array_object_with_union_properties_response.rb +6 -0
  111. data/lib/sink/models/response_array_response_response.rb +6 -0
  112. data/lib/sink/models/response_missing_required_response.rb +24 -0
  113. data/lib/sink/models/response_nested_array_response.rb +36 -0
  114. data/lib/sink/models/response_object_all_properties_response.rb +65 -0
  115. data/lib/sink/models/response_object_no_properties_response.rb +14 -0
  116. data/lib/sink/models/response_object_with_additional_properties_prop_response.rb +32 -0
  117. data/lib/sink/models/response_object_with_heavily_nested_union_response.rb +19 -0
  118. data/lib/sink/models/response_only_read_only_properties_response.rb +25 -0
  119. data/lib/sink/models/responses_allof_cross_object.rb +23 -0
  120. data/lib/sink/models/return_.rb +18 -0
  121. data/lib/sink/models/root_response.rb +31 -0
  122. data/lib/sink/models/self_recursion.rb +23 -0
  123. data/lib/sink/models/shared_cursor_nested_response_prop_meta.rb +33 -0
  124. data/lib/sink/models/shared_self_recursion.rb +23 -0
  125. data/lib/sink/models/shipping_address.rb +85 -0
  126. data/lib/sink/models/simple_allof.rb +28 -0
  127. data/lib/sink/models/simple_object.rb +32 -0
  128. data/lib/sink/models/skip_this_resource_i_never_appear_response.rb +19 -0
  129. data/lib/sink/models/streaming_basic_response.rb +23 -0
  130. data/lib/sink/models/streaming_nested_params_response.rb +23 -0
  131. data/lib/sink/models/streaming_no_discriminator_response.rb +24 -0
  132. data/lib/sink/models/streaming_query_param_discriminator_response.rb +24 -0
  133. data/lib/sink/models/streaming_with_unrelated_default_param_response.rb +24 -0
  134. data/lib/sink/models/type_dates_response.rb +38 -0
  135. data/lib/sink/models/type_datetimes_response.rb +38 -0
  136. data/lib/sink/models/union_discriminated_variant_a.rb +27 -0
  137. data/lib/sink/models/union_discriminated_variant_b.rb +27 -0
  138. data/lib/sink/models/union_response_discriminated_by_property_name_response.rb +6 -0
  139. data/lib/sink/models/union_response_discriminated_with_basic_mapping_response.rb +6 -0
  140. data/lib/sink/models/union_type_mixed_types_response.rb +6 -0
  141. data/lib/sink/models/union_type_nullable_union_response.rb +6 -0
  142. data/lib/sink/models/union_type_objects_response.rb +6 -0
  143. data/lib/sink/models/union_type_super_mixed_types_response.rb +6 -0
  144. data/lib/sink/models/union_type_unknown_variant_response.rb +6 -0
  145. data/lib/sink/models/version_1_30_name_create_response.rb +18 -0
  146. data/lib/sink/models/widget.rb +19 -0
  147. data/lib/sink/models/write_only_response_simple_response.rb +21 -0
  148. data/lib/sink/page_cursor.rb +54 -0
  149. data/lib/sink/page_cursor_from_headers.rb +54 -0
  150. data/lib/sink/page_cursor_id.rb +50 -0
  151. data/lib/sink/page_cursor_nested_items.rb +84 -0
  152. data/lib/sink/page_cursor_nested_object_ref.rb +71 -0
  153. data/lib/sink/page_cursor_shared_ref.rb +72 -0
  154. data/lib/sink/page_cursor_top_level_array.rb +51 -0
  155. data/lib/sink/page_cursor_url.rb +51 -0
  156. data/lib/sink/page_cursor_with_reverse.rb +58 -0
  157. data/lib/sink/page_offset.rb +54 -0
  158. data/lib/sink/page_offset_no_start_field.rb +50 -0
  159. data/lib/sink/page_offset_total_count.rb +58 -0
  160. data/lib/sink/page_page_number.rb +58 -0
  161. data/lib/sink/page_page_number_without_current_page_response.rb +50 -0
  162. data/lib/sink/pooled_net_requester.rb +72 -0
  163. data/lib/sink/request_options.rb +89 -0
  164. data/lib/sink/resources/body_params/objects.rb +34 -0
  165. data/lib/sink/resources/body_params/unions.rb +34 -0
  166. data/lib/sink/resources/body_params.rb +630 -0
  167. data/lib/sink/resources/cards.rb +508 -0
  168. data/lib/sink/resources/casing/eeoc.rb +34 -0
  169. data/lib/sink/resources/casing.rb +16 -0
  170. data/lib/sink/resources/clients.rb +30 -0
  171. data/lib/sink/resources/company/payments.rb +30 -0
  172. data/lib/sink/resources/company.rb +18 -0
  173. data/lib/sink/resources/complex_queries.rb +60 -0
  174. data/lib/sink/resources/config_tools/parent_with_skip_node_python/child_only_skip_python.rb +99 -0
  175. data/lib/sink/resources/config_tools/parent_with_skip_node_python.rb +101 -0
  176. data/lib/sink/resources/config_tools.rb +40 -0
  177. data/lib/sink/resources/decorator_tests/keep_this_resource.rb +29 -0
  178. data/lib/sink/resources/decorator_tests/languages.rb +59 -0
  179. data/lib/sink/resources/decorator_tests/skip_this_resource.rb +28 -0
  180. data/lib/sink/resources/decorator_tests.rb +38 -0
  181. data/lib/sink/resources/deeply_nested/level_one/level_two/level_three.rb +33 -0
  182. data/lib/sink/resources/deeply_nested/level_one/level_two.rb +35 -0
  183. data/lib/sink/resources/deeply_nested/level_one.rb +33 -0
  184. data/lib/sink/resources/deeply_nested.rb +16 -0
  185. data/lib/sink/resources/docstrings.rb +82 -0
  186. data/lib/sink/resources/empty_body.rb +60 -0
  187. data/lib/sink/resources/envelopes.rb +74 -0
  188. data/lib/sink/resources/files.rb +101 -0
  189. data/lib/sink/resources/header_params.rb +81 -0
  190. data/lib/sink/resources/invalid_schemas/arrays.rb +26 -0
  191. data/lib/sink/resources/invalid_schemas/objects.rb +26 -0
  192. data/lib/sink/resources/invalid_schemas.rb +20 -0
  193. data/lib/sink/resources/make_ambiguous_schemas_explicit.rb +26 -0
  194. data/lib/sink/resources/make_ambiguous_schemas_looser.rb +26 -0
  195. data/lib/sink/resources/method_config.rb +167 -0
  196. data/lib/sink/resources/mixed_params/duplicates.rb +79 -0
  197. data/lib/sink/resources/mixed_params.rb +88 -0
  198. data/lib/sink/resources/model_referenced_in_parent_and_child/child.rb +26 -0
  199. data/lib/sink/resources/model_referenced_in_parent_and_child.rb +28 -0
  200. data/lib/sink/resources/names/can_cause_clashes/employment_data.rb +16 -0
  201. data/lib/sink/resources/names/can_cause_clashes/response.rb +32 -0
  202. data/lib/sink/resources/names/can_cause_clashes.rb +23 -0
  203. data/lib/sink/resources/names/documents.rb +28 -0
  204. data/lib/sink/resources/names/openapi_specials.rb +26 -0
  205. data/lib/sink/resources/names/params.rb +52 -0
  206. data/lib/sink/resources/names/reserved_names/import.rb +31 -0
  207. data/lib/sink/resources/names/reserved_names/methods.rb +40 -0
  208. data/lib/sink/resources/names/reserved_names/public/class_.rb +30 -0
  209. data/lib/sink/resources/names/reserved_names/public/interface.rb +30 -0
  210. data/lib/sink/resources/names/reserved_names/public/private.rb +30 -0
  211. data/lib/sink/resources/names/reserved_names/public.rb +40 -0
  212. data/lib/sink/resources/names/reserved_names.rb +46 -0
  213. data/lib/sink/resources/names.rb +170 -0
  214. data/lib/sink/resources/openapi_formats.rb +53 -0
  215. data/lib/sink/resources/pagination_tests/cursor.rb +57 -0
  216. data/lib/sink/resources/pagination_tests/cursor_id.rb +34 -0
  217. data/lib/sink/resources/pagination_tests/cursor_url.rb +34 -0
  218. data/lib/sink/resources/pagination_tests/fake_pages.rb +33 -0
  219. data/lib/sink/resources/pagination_tests/items_types.rb +34 -0
  220. data/lib/sink/resources/pagination_tests/nested_items.rb +34 -0
  221. data/lib/sink/resources/pagination_tests/offset.rb +74 -0
  222. data/lib/sink/resources/pagination_tests/page_number.rb +54 -0
  223. data/lib/sink/resources/pagination_tests/page_number_without_current_page_response.rb +55 -0
  224. data/lib/sink/resources/pagination_tests/refs.rb +55 -0
  225. data/lib/sink/resources/pagination_tests/response_headers.rb +34 -0
  226. data/lib/sink/resources/pagination_tests/schema_types.rb +54 -0
  227. data/lib/sink/resources/pagination_tests/top_level_arrays.rb +34 -0
  228. data/lib/sink/resources/pagination_tests.rb +64 -0
  229. data/lib/sink/resources/parent/child.rb +30 -0
  230. data/lib/sink/resources/parent.rb +18 -0
  231. data/lib/sink/resources/path_params.rb +210 -0
  232. data/lib/sink/resources/positional_params.rb +237 -0
  233. data/lib/sink/resources/query_params.rb +166 -0
  234. data/lib/sink/resources/recursion/shared_responses.rb +26 -0
  235. data/lib/sink/resources/recursion.rb +68 -0
  236. data/lib/sink/resources/resource_refs/paginated_model_first_ref.rb +14 -0
  237. data/lib/sink/resources/resource_refs/paginated_model_second_ref.rb +14 -0
  238. data/lib/sink/resources/resource_refs/parent/child.rb +31 -0
  239. data/lib/sink/resources/resource_refs/parent.rb +32 -0
  240. data/lib/sink/resources/resource_refs.rb +24 -0
  241. data/lib/sink/resources/resources.rb +26 -0
  242. data/lib/sink/resources/responses/union_types.rb +98 -0
  243. data/lib/sink/resources/responses.rb +319 -0
  244. data/lib/sink/resources/shared_query_params.rb +48 -0
  245. data/lib/sink/resources/streaming.rb +106 -0
  246. data/lib/sink/resources/testing.rb +24 -0
  247. data/lib/sink/resources/tests.rb +26 -0
  248. data/lib/sink/resources/tools.rb +33 -0
  249. data/lib/sink/resources/types/allofs.rb +14 -0
  250. data/lib/sink/resources/types/arrays.rb +62 -0
  251. data/lib/sink/resources/types/enums.rb +95 -0
  252. data/lib/sink/resources/types/maps.rb +29 -0
  253. data/lib/sink/resources/types/objects.rb +105 -0
  254. data/lib/sink/resources/types/primitives.rb +34 -0
  255. data/lib/sink/resources/types/read_only_params.rb +34 -0
  256. data/lib/sink/resources/types/unions.rb +126 -0
  257. data/lib/sink/resources/types/write_only_responses.rb +28 -0
  258. data/lib/sink/resources/types.rb +95 -0
  259. data/lib/sink/resources/undocumented_resource.rb +47 -0
  260. data/lib/sink/resources/version_1_30_names.rb +41 -0
  261. data/lib/sink/resources/widgets.rb +30 -0
  262. data/lib/sink/util.rb +78 -0
  263. data/lib/sink/version.rb +5 -0
  264. data/lib/sink.rb +276 -0
  265. metadata +322 -0
@@ -0,0 +1,226 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sink
4
+ # @!visibility private
5
+ module Converter
6
+ # Based on `value`, returns a value that conforms to `type`, to the extent possible:
7
+ # - If the given `value` conforms to `type` already, the given `value`.
8
+ # - If it's possible and safe to convert the given `value` to `type`, such a converted value.
9
+ # - Otherwise, the given `value` unaltered.
10
+ def self.convert(type, value)
11
+ # If `type.is_a?(Converter)`, `type` is an instance of a class that mixes
12
+ # in `Converter`, indicating that the type should define `#convert` on this
13
+ # instance. This is used for Enums and ArrayOfs, which are parameterized.
14
+ # If `type.include?(Converter)`, `type` is a class that mixes in `Converter`
15
+ # which we use to signal that the class should define `.convert`. This is
16
+ # used where the class itself fully specifies the type, like model classes.
17
+ # We don't monkey-patch Ruby-native types, so those need to be handled
18
+ # directly.
19
+ if type.is_a?(Converter) || type.include?(Converter)
20
+ type.convert(value)
21
+ elsif type == Date
22
+ Date.parse(value)
23
+ elsif type == Time
24
+ Time.parse(value)
25
+ elsif type == NilClass
26
+ nil
27
+ elsif type == Float
28
+ value.is_a?(Numeric) ? value.to_f : value
29
+ elsif [Object, Integer, String, Hash].include?(type)
30
+ value
31
+ else
32
+ raise StandardError, "Unexpected type #{type}"
33
+ end
34
+ end
35
+ end
36
+
37
+ # When we don't know what to expect for the value.
38
+ # @!visibility private
39
+ class Unknown
40
+ include Converter
41
+
42
+ def self.convert(value)
43
+ value
44
+ end
45
+ end
46
+
47
+ # Ruby has no Boolean class; this is something for models to refer to.
48
+ # @!visibility private
49
+ class BooleanModel
50
+ include Converter
51
+
52
+ def self.convert(value)
53
+ value
54
+ end
55
+ end
56
+
57
+ # A value from among a specified list of options. OpenAPI enum values map to
58
+ # Ruby values in the SDK as follows:
59
+ # boolean => true|false
60
+ # integer => Integer
61
+ # float => Float
62
+ # string => Symbol
63
+ # We can therefore convert string values to Symbols, but can't convert other
64
+ # values safely.
65
+ # @!visibility private
66
+ class Enum
67
+ include Converter
68
+
69
+ def self.convert(value)
70
+ if value.is_a?(String)
71
+ value.to_sym
72
+ else
73
+ value
74
+ end
75
+ end
76
+
77
+ # @return [Array<Symbol>] All of the valid Symbol values for this enum.
78
+ def self.values
79
+ @values ||= constants.map { |c| const_get(c) }
80
+ end
81
+ end
82
+
83
+ # Array of items of a given type.
84
+ # @!visibility private
85
+ class ArrayOf
86
+ include Converter
87
+
88
+ def initialize(items_type_info = nil, enum: nil)
89
+ @items_type_fn = enum || (items_type_info.is_a?(Proc) ? items_type_info : -> { items_type_info })
90
+ end
91
+
92
+ def convert(value)
93
+ items_type = @items_type_fn.call
94
+ value.map { |item| Converter.convert(items_type, item) }
95
+ end
96
+ end
97
+
98
+ class BaseModel
99
+ include Converter
100
+
101
+ # @!visibility private
102
+ # Assumes superclass fields are totally defined before fields are accessed / defined on subclasses.
103
+ # @return [Hash{Symbol => Hash{Symbol => Object}}]
104
+ def self.fields
105
+ @fields ||= (superclass == BaseModel ? {} : superclass.fields.dup)
106
+ end
107
+
108
+ # @!visibility private
109
+ # @param name_sym [Symbol]
110
+ # @param api_name [Symbol, nil]
111
+ # @param type_info [Proc, Object]
112
+ # @param mode [Symbol]
113
+ # @return [void]
114
+ def self.add_field(name_sym, api_name:, type_info:, mode:)
115
+ type_fn = type_info.is_a?(Proc) ? type_info : -> { type_info }
116
+ key = api_name || name_sym
117
+ fields[name_sym] = {type_fn: type_fn, mode: mode, key: key}
118
+
119
+ define_method(name_sym) do
120
+ field_type = type_fn.call
121
+ Converter.convert(field_type, @data[key])
122
+ rescue StandardError
123
+ name = self.class.name.split("::").last
124
+ raise ConversionError,
125
+ "Failed to parse #{name}.#{name_sym} as #{field_type.inspect}. " \
126
+ "To get the unparsed API response, use #{name}[:#{key}]."
127
+ end
128
+ define_method("#{name_sym}=") { |val| @data[key] = val }
129
+ end
130
+
131
+ # @!visibility private
132
+ # NB `required` is just a signal to the reader. We don't do runtime validation anyway.
133
+ def self.required(name_sym, type_info = nil, mode = :rw, api_name: nil, enum: nil)
134
+ add_field(name_sym, api_name: api_name, type_info: enum || type_info, mode: mode)
135
+ end
136
+
137
+ # @!visibility private
138
+ # NB `optional` is just a signal to the reader. We don't do runtime validation anyway.
139
+ def self.optional(name_sym, type_info = nil, mode = :rw, api_name: nil, enum: nil)
140
+ add_field(name_sym, api_name: api_name, type_info: enum || type_info, mode: mode)
141
+ end
142
+
143
+ # @!visibility private
144
+ def self.convert(data)
145
+ new(data)
146
+ end
147
+
148
+ # Create a new instance of a model.
149
+ # @param data [Hash{Symbol => Object}] Raw data to initialize the model with.
150
+ def initialize(data = {})
151
+ @data = {}
152
+ # TODO: what if data isn't a hash?
153
+ data.each do |field_name, value|
154
+ next if value.nil?
155
+
156
+ field = self.class.fields[field_name.to_sym]
157
+ if field
158
+ next if field[:mode] == :w
159
+ end
160
+ @data[field_name.to_sym] = value
161
+ end
162
+ end
163
+
164
+ # Returns a Hash of the data underlying this object.
165
+ # Keys are Symbols and values are the raw values from the response.
166
+ # The return value indicates which values were ever set on the object -
167
+ # i.e. there will be a key in this hash if they ever were, even if the
168
+ # set value was nil.
169
+ # This method is not recursive.
170
+ # The returned value is shared by the object, so it should not be mutated.
171
+ #
172
+ # @return [Hash{Symbol => Object}] Data for this object.
173
+ def to_h
174
+ @data
175
+ end
176
+
177
+ alias_method :to_hash, :to_h
178
+
179
+ # Returns the raw value associated with the given key, if found. Otherwise, nil is returned.
180
+ # It is valid to lookup keys that are not in the API spec, for example to access
181
+ # undocumented features.
182
+ # This method does not parse response data into higher-level types.
183
+ # Lookup by anything other than a Symbol is an ArgumentError.
184
+ #
185
+ # @param key [Symbol] Key to look up by.
186
+ #
187
+ # @return [Object, nil] The raw value at the given key.
188
+ def [](key)
189
+ if !key.instance_of?(Symbol)
190
+ raise ArgumentError, "Expected symbol key for lookup, got #{key.inspect}"
191
+ end
192
+ @data[key]
193
+ end
194
+
195
+ # @param keys [Array<Symbol>, nil]
196
+ # @return [Hash{Symbol => Object}]
197
+ def deconstruct_keys(keys)
198
+ (keys || self.class.fields.keys).to_h do |k|
199
+ if !k.instance_of?(Symbol)
200
+ raise ArgumentError, "Expected symbol key for lookup, got #{k.inspect}"
201
+ end
202
+
203
+ if !self.class.fields.key?(k)
204
+ raise KeyError, "Expected one of #{self.class.fields.keys}, got #{k.inspect}"
205
+ end
206
+
207
+ [k, method(k).call]
208
+ end
209
+ end
210
+
211
+ # @return [String]
212
+ def inspect
213
+ "#<#{self.class.name}:0x#{object_id.to_s(16)} #{deconstruct_keys(nil).map do |k, v|
214
+ "#{k}=#{v.inspect}"
215
+ end.join(' ')}>"
216
+ end
217
+
218
+ # @return [String]
219
+ def to_s
220
+ @data.to_s
221
+ end
222
+ end
223
+
224
+ class ConversionError < Error
225
+ end
226
+ end
@@ -0,0 +1,391 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sink
4
+ class Client < BaseClient
5
+ # Default max number of retries to attempt after a failed retryable request.
6
+ DEFAULT_MAX_RETRIES = 1
7
+
8
+ # Client option
9
+ # @return [String]
10
+ attr_reader :user_token
11
+
12
+ # Client option
13
+ # @return [String]
14
+ attr_reader :api_key_header
15
+
16
+ # Client option
17
+ # @return [String]
18
+ attr_reader :api_key_query
19
+
20
+ # Client option
21
+ # @return [String]
22
+ attr_reader :username
23
+
24
+ # Client option
25
+ # @return [String]
26
+ attr_reader :client_id
27
+
28
+ # Client option
29
+ # @return [String]
30
+ attr_reader :client_secret
31
+
32
+ # Client option
33
+ # @return [Boolean]
34
+ attr_reader :some_boolean_arg
35
+
36
+ # Client option
37
+ # @return [Integer]
38
+ attr_reader :some_integer_arg
39
+
40
+ # Client option
41
+ # @return [Float]
42
+ attr_reader :some_number_arg
43
+
44
+ # Client option
45
+ # @return [Float]
46
+ attr_reader :some_number_arg_required
47
+
48
+ # Client option
49
+ # @return [Float]
50
+ attr_reader :some_number_arg_required_no_default
51
+
52
+ # Client option
53
+ # @return [Float]
54
+ attr_reader :some_number_arg_required_no_default_no_env
55
+
56
+ # Client option
57
+ # @return [String]
58
+ attr_reader :required_arg_no_env
59
+
60
+ # Client option
61
+ # @return [String]
62
+ attr_reader :required_arg_no_env_with_default
63
+
64
+ # Client option
65
+ # @return [String]
66
+ attr_reader :client_path_param
67
+
68
+ # Client option
69
+ # @return [String]
70
+ attr_reader :camel_case_path
71
+
72
+ # Client option
73
+ # @return [String]
74
+ attr_reader :client_query_param
75
+
76
+ # Client option
77
+ # @return [String]
78
+ attr_reader :client_path_or_query_param
79
+
80
+ # @return [Sink::Resources::Testing]
81
+ attr_reader :testing
82
+
83
+ # @return [Sink::Resources::ComplexQueries]
84
+ attr_reader :complex_queries
85
+
86
+ # @return [Sink::Resources::Casing]
87
+ attr_reader :casing
88
+
89
+ # @return [Sink::Resources::Tools]
90
+ attr_reader :tools
91
+
92
+ # @return [Sink::Resources::UndocumentedResource]
93
+ attr_reader :undocumented_resource
94
+
95
+ # @return [Sink::Resources::MethodConfig]
96
+ attr_reader :method_config
97
+
98
+ # @return [Sink::Resources::Streaming]
99
+ attr_reader :streaming
100
+
101
+ # @return [Sink::Resources::PaginationTests]
102
+ attr_reader :pagination_tests
103
+
104
+ # @return [Sink::Resources::Docstrings]
105
+ attr_reader :docstrings
106
+
107
+ # @return [Sink::Resources::InvalidSchemas]
108
+ attr_reader :invalid_schemas
109
+
110
+ # @return [Sink::Resources::ResourceRefs]
111
+ attr_reader :resource_refs
112
+
113
+ # @return [Sink::Resources::Cards]
114
+ attr_reader :cards
115
+
116
+ # @return [Sink::Resources::Files]
117
+ attr_reader :files
118
+
119
+ # @return [Sink::Resources::Resources]
120
+ attr_reader :resources
121
+
122
+ # @return [Sink::Resources::ConfigTools]
123
+ attr_reader :config_tools
124
+
125
+ # Stainless API company
126
+ # @return [Sink::Resources::Company]
127
+ attr_reader :company
128
+
129
+ # @return [Sink::Resources::OpenAPIFormats]
130
+ attr_reader :openapi_formats
131
+
132
+ # @return [Sink::Resources::Parent]
133
+ attr_reader :parent
134
+
135
+ # @return [Sink::Resources::Envelopes]
136
+ attr_reader :envelopes
137
+
138
+ # @return [Sink::Resources::Types]
139
+ attr_reader :types
140
+
141
+ # @return [Sink::Resources::Clients]
142
+ attr_reader :clients
143
+
144
+ # @return [Sink::Resources::Names]
145
+ attr_reader :names
146
+
147
+ # Widget is love
148
+ # Widget is life
149
+ # @return [Sink::Resources::Widgets]
150
+ attr_reader :widgets
151
+
152
+ # @return [Sink::Resources::Responses]
153
+ attr_reader :responses
154
+
155
+ # @return [Sink::Resources::PathParams]
156
+ attr_reader :path_params
157
+
158
+ # @return [Sink::Resources::PositionalParams]
159
+ attr_reader :positional_params
160
+
161
+ # @return [Sink::Resources::EmptyBody]
162
+ attr_reader :empty_body
163
+
164
+ # @return [Sink::Resources::QueryParams]
165
+ attr_reader :query_params
166
+
167
+ # @return [Sink::Resources::BodyParams]
168
+ attr_reader :body_params
169
+
170
+ # @return [Sink::Resources::HeaderParams]
171
+ attr_reader :header_params
172
+
173
+ # @return [Sink::Resources::MixedParams]
174
+ attr_reader :mixed_params
175
+
176
+ # @return [Sink::Resources::MakeAmbiguousSchemasLooser]
177
+ attr_reader :make_ambiguous_schemas_looser
178
+
179
+ # @return [Sink::Resources::MakeAmbiguousSchemasExplicit]
180
+ attr_reader :make_ambiguous_schemas_explicit
181
+
182
+ # @return [Sink::Resources::DecoratorTests]
183
+ attr_reader :decorator_tests
184
+
185
+ # @return [Sink::Resources::Tests]
186
+ attr_reader :tests
187
+
188
+ # @return [Sink::Resources::DeeplyNested]
189
+ attr_reader :deeply_nested
190
+
191
+ # @return [Sink::Resources::Version1_30Names]
192
+ attr_reader :version_1_30_names
193
+
194
+ # @return [Sink::Resources::Recursion]
195
+ attr_reader :recursion
196
+
197
+ # @return [Sink::Resources::SharedQueryParams]
198
+ attr_reader :shared_query_params
199
+
200
+ # @return [Sink::Resources::ModelReferencedInParentAndChild]
201
+ attr_reader :model_referenced_in_parent_and_child
202
+
203
+ # Creates and returns a new client for interacting with the API.
204
+ #
205
+ # @param environment ["production", "sandbox", nil] Specifies the environment to use for the API.
206
+ #
207
+ # Each environment maps to a different base URL:
208
+ #
209
+ # - `production` corresponds to `https://demo.stainlessapi.com/`
210
+ # - `sandbox` corresponds to `https://demo-sanbox.stainlessapi.com/`
211
+ # @param base_url [String, nil] Override the default base URL for the API, e.g., `"https://api.example.com/v2/"`
212
+ # @param user_token [String, nil] The API Key for the SINK API, sent as a bearer token Defaults to
213
+ # `ENV["SINK_CUSTOM_API_KEY_ENV"]`
214
+ # @param api_key_header [String, nil] The API Key for the SINK API, sent as an api key header Defaults to
215
+ # `ENV["SINK_CUSTOM_API_KEY_HEADER_ENV"]`
216
+ # @param api_key_query [String, nil] The API Key for the SINK API, sent as an api key query Defaults to
217
+ # `ENV["SINK_CUSTOM_API_KEY_QUERY_ENV"]`
218
+ # @param username [String, nil] Defaults to `ENV["SINK_USER"]`
219
+ # @param client_id [String, nil] Defaults to `ENV["SINK_CLIENT_ID"]`
220
+ # @param client_secret [String, nil] Defaults to `ENV["SINK_CLIENT_SECRET"]`
221
+ # @param some_boolean_arg [Boolean, nil] Defaults to `ENV["SINK_SOME_BOOLEAN_ARG"]`
222
+ # @param some_integer_arg [Integer, nil] Defaults to `ENV["SINK_SOME_INTEGER_ARG"]`
223
+ # @param some_number_arg [Float, nil] Defaults to `ENV["SINK_SOME_NUMBER_ARG"]`
224
+ # @param some_number_arg_required [Float, nil] Defaults to `ENV["SINK_SOME_NUMBER_ARG"]`
225
+ # @param some_number_arg_required_no_default [Float, nil] Defaults to `ENV["SINK_SOME_NUMBER_ARG"]`
226
+ # @param some_number_arg_required_no_default_no_env [Float, nil]
227
+ # @param required_arg_no_env [String, nil]
228
+ # @param required_arg_no_env_with_default [String, nil]
229
+ # @param client_path_param [String, nil]
230
+ # @param camel_case_path [String, nil]
231
+ # @param client_query_param [String, nil]
232
+ # @param client_path_or_query_param [String, nil]
233
+ # @param max_retries [Integer] Max number of retries to attempt after a failed retryable request.
234
+ #
235
+ # @return [Sink::Client]
236
+ def initialize(
237
+ environment: nil,
238
+ base_url: nil,
239
+ user_token: nil,
240
+ api_key_header: nil,
241
+ api_key_query: nil,
242
+ username: nil,
243
+ client_id: nil,
244
+ client_secret: nil,
245
+ some_boolean_arg: nil,
246
+ some_integer_arg: nil,
247
+ some_number_arg: nil,
248
+ some_number_arg_required: nil,
249
+ some_number_arg_required_no_default: nil,
250
+ some_number_arg_required_no_default_no_env: nil,
251
+ required_arg_no_env: nil,
252
+ required_arg_no_env_with_default: nil,
253
+ client_path_param: nil,
254
+ camel_case_path: nil,
255
+ client_query_param: nil,
256
+ client_path_or_query_param: nil,
257
+ max_retries: DEFAULT_MAX_RETRIES,
258
+ timeout: 60
259
+ )
260
+ environments = {"production" => "https://demo.stainlessapi.com/", "sandbox" => "https://demo-sanbox.stainlessapi.com/"}
261
+ if environment && base_url
262
+ raise ArgumentError, "both environment and base_url given, expected only one"
263
+ elsif environment
264
+ if !environments.key?(environment.to_s)
265
+ raise ArgumentError, "environment must be one of #{environments.keys}, got #{environment}"
266
+ end
267
+ base_url = environments[environment.to_s]
268
+ elsif !base_url
269
+ base_url = "https://demo.stainlessapi.com/"
270
+ end
271
+
272
+ username_header = [username, ENV["SINK_USER"]].find { |v| !v.nil? }
273
+ if username_header.nil?
274
+ raise ArgumentError, "username is required"
275
+ end
276
+ client_secret_header = [client_secret, ENV["SINK_CLIENT_SECRET"], "hellosecret"].find { |v| !v.nil? }
277
+ some_integer_arg_header = [some_integer_arg, ENV["SINK_SOME_INTEGER_ARG"], 123].find { |v| !v.nil? }
278
+ headers = {
279
+ "My-Api-Version" => "11",
280
+ "X-Enable-Metrics" => "1",
281
+ "X-Client-UserName" => username_header,
282
+ "X-Client-Secret" => client_secret_header,
283
+ "X-Integer" => some_integer_arg_header
284
+ }
285
+
286
+ idempotency_header = "Idempotency-Key"
287
+
288
+ @user_token = [user_token, ENV["SINK_CUSTOM_API_KEY_ENV"]].find { |v| !v.nil? }
289
+ @api_key_header = [api_key_header, ENV["SINK_CUSTOM_API_KEY_HEADER_ENV"]].find { |v| !v.nil? }
290
+ @api_key_query = [api_key_query, ENV["SINK_CUSTOM_API_KEY_QUERY_ENV"]].find { |v| !v.nil? }
291
+ @client_id = [client_id, ENV["SINK_CLIENT_ID"]].find { |v| !v.nil? }
292
+ @some_boolean_arg = [some_boolean_arg, ENV["SINK_SOME_BOOLEAN_ARG"], true].find { |v| !v.nil? }
293
+ @some_number_arg = [some_number_arg, ENV["SINK_SOME_NUMBER_ARG"], 1.2].find { |v| !v.nil? }
294
+ @some_number_arg_required = [some_number_arg_required, ENV["SINK_SOME_NUMBER_ARG"], 1.2].find do |v|
295
+ !v.nil?
296
+ end
297
+ @some_number_arg_required_no_default = [
298
+ some_number_arg_required_no_default,
299
+ ENV["SINK_SOME_NUMBER_ARG"]
300
+ ].find do |v|
301
+ !v.nil?
302
+ end
303
+ if @some_number_arg_required_no_default.nil?
304
+ raise ArgumentError, "some_number_arg_required_no_default is required"
305
+ end
306
+ @some_number_arg_required_no_default_no_env = some_number_arg_required_no_default_no_env
307
+ if @some_number_arg_required_no_default_no_env.nil?
308
+ raise ArgumentError, "some_number_arg_required_no_default_no_env is required"
309
+ end
310
+ @required_arg_no_env = required_arg_no_env
311
+ if @required_arg_no_env.nil?
312
+ raise ArgumentError, "required_arg_no_env is required"
313
+ end
314
+ @required_arg_no_env_with_default = [required_arg_no_env_with_default, "hi!"].find { |v| !v.nil? }
315
+ @client_query_param = client_query_param
316
+
317
+ super(
318
+ base_url: base_url,
319
+ max_retries: max_retries,
320
+ timeout: timeout,
321
+ headers: headers,
322
+ idempotency_header: idempotency_header
323
+ )
324
+
325
+ @testing = Sink::Resources::Testing.new(client: self)
326
+ @complex_queries = Sink::Resources::ComplexQueries.new(client: self)
327
+ @casing = Sink::Resources::Casing.new(client: self)
328
+ @tools = Sink::Resources::Tools.new(client: self)
329
+ @undocumented_resource = Sink::Resources::UndocumentedResource.new(client: self)
330
+ @method_config = Sink::Resources::MethodConfig.new(client: self)
331
+ @streaming = Sink::Resources::Streaming.new(client: self)
332
+ @pagination_tests = Sink::Resources::PaginationTests.new(client: self)
333
+ @docstrings = Sink::Resources::Docstrings.new(client: self)
334
+ @invalid_schemas = Sink::Resources::InvalidSchemas.new(client: self)
335
+ @resource_refs = Sink::Resources::ResourceRefs.new(client: self)
336
+ @cards = Sink::Resources::Cards.new(client: self)
337
+ @files = Sink::Resources::Files.new(client: self)
338
+ @resources = Sink::Resources::Resources.new(client: self)
339
+ @config_tools = Sink::Resources::ConfigTools.new(client: self)
340
+ @company = Sink::Resources::Company.new(client: self)
341
+ @openapi_formats = Sink::Resources::OpenAPIFormats.new(client: self)
342
+ @parent = Sink::Resources::Parent.new(client: self)
343
+ @envelopes = Sink::Resources::Envelopes.new(client: self)
344
+ @types = Sink::Resources::Types.new(client: self)
345
+ @clients = Sink::Resources::Clients.new(client: self)
346
+ @names = Sink::Resources::Names.new(client: self)
347
+ @widgets = Sink::Resources::Widgets.new(client: self)
348
+ @responses = Sink::Resources::Responses.new(client: self)
349
+ @path_params = Sink::Resources::PathParams.new(client: self)
350
+ @positional_params = Sink::Resources::PositionalParams.new(client: self)
351
+ @empty_body = Sink::Resources::EmptyBody.new(client: self)
352
+ @query_params = Sink::Resources::QueryParams.new(client: self)
353
+ @body_params = Sink::Resources::BodyParams.new(client: self)
354
+ @header_params = Sink::Resources::HeaderParams.new(client: self)
355
+ @mixed_params = Sink::Resources::MixedParams.new(client: self)
356
+ @make_ambiguous_schemas_looser = Sink::Resources::MakeAmbiguousSchemasLooser.new(client: self)
357
+ @make_ambiguous_schemas_explicit = Sink::Resources::MakeAmbiguousSchemasExplicit.new(client: self)
358
+ @decorator_tests = Sink::Resources::DecoratorTests.new(client: self)
359
+ @tests = Sink::Resources::Tests.new(client: self)
360
+ @deeply_nested = Sink::Resources::DeeplyNested.new(client: self)
361
+ @version_1_30_names = Sink::Resources::Version1_30Names.new(client: self)
362
+ @recursion = Sink::Resources::Recursion.new(client: self)
363
+ @shared_query_params = Sink::Resources::SharedQueryParams.new(client: self)
364
+ @model_referenced_in_parent_and_child = Sink::Resources::ModelReferencedInParentAndChild.new(client: self)
365
+ end
366
+
367
+ # @!visibility private
368
+ def make_status_error(message:, body:, response:)
369
+ case response.code.to_i
370
+ when 400
371
+ Sink::HTTP::BadRequestError.new(message: message, response: response, body: body)
372
+ when 401
373
+ Sink::HTTP::AuthenticationError.new(message: message, response: response, body: body)
374
+ when 403
375
+ Sink::HTTP::PermissionDeniedError.new(message: message, response: response, body: body)
376
+ when 404
377
+ Sink::HTTP::NotFoundError.new(message: message, response: response, body: body)
378
+ when 409
379
+ Sink::HTTP::ConflictError.new(message: message, response: response, body: body)
380
+ when 422
381
+ Sink::HTTP::UnprocessableEntityError.new(message: message, response: response, body: body)
382
+ when 429
383
+ Sink::HTTP::RateLimitError.new(message: message, response: response, body: body)
384
+ when 500..599
385
+ Sink::HTTP::InternalServerError.new(message: message, response: response, body: body)
386
+ else
387
+ Sink::HTTP::APIStatusError.new(message: message, response: response, body: body)
388
+ end
389
+ end
390
+ end
391
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sink
4
+ class FakePage < ::Array
5
+ # @!visibility private
6
+ attr_accessor :client, :req, :opts
7
+
8
+ # @!visibility private
9
+ def initialize(model, raw_data, _response, client, req, opts)
10
+ super(raw_data.map { |e| model.convert(e) })
11
+ self.client = client
12
+ self.req = req
13
+ self.opts = opts
14
+ end
15
+
16
+ # @return [Boolean]
17
+ def next_page?
18
+ false
19
+ end
20
+
21
+ # @return [Sink::FakePage]
22
+ def next_page
23
+ raise NotImplementedError
24
+ end
25
+
26
+ # @return [nil]
27
+ def auto_paging_each(&blk)
28
+ if !blk
29
+ raise "A block must be given to #auto_paging_each"
30
+ end
31
+ page = self
32
+ loop do
33
+ page.each { |e| blk.call(e) }
34
+ break if !page.next_page?
35
+ page = page.next_page
36
+ end
37
+ end
38
+
39
+ # @return String
40
+ def inspect
41
+ "#<#{selfl.class}:0x#{object_id.to_s(16)}>"
42
+ end
43
+ end
44
+ end