shipeasy-sdk 2.1.0 → 2.3.1

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 (218) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -0
  3. data/docs/skill/SKILL.md +6 -2
  4. data/lib/generators/shipeasy/install/USAGE +24 -0
  5. data/lib/generators/shipeasy/install/install_generator.rb +86 -0
  6. data/lib/generators/shipeasy/install/templates/initializer.rb.tt +41 -0
  7. data/lib/shipeasy/admin.rb +91 -0
  8. data/lib/shipeasy/sdk/version.rb +1 -1
  9. data/lib/shipeasy_admin/api/alerts_api.rb +352 -0
  10. data/lib/shipeasy_admin/api/api_keys_api.rb +229 -0
  11. data/lib/shipeasy_admin/api/attributes_api.rb +82 -0
  12. data/lib/shipeasy_admin/api/configs_api.rb +757 -0
  13. data/lib/shipeasy_admin/api/connectors_api.rb +497 -0
  14. data/lib/shipeasy_admin/api/drafts_api.rb +82 -0
  15. data/lib/shipeasy_admin/api/errors_api.rb +389 -0
  16. data/lib/shipeasy_admin/api/events_api.rb +438 -0
  17. data/lib/shipeasy_admin/api/experiments_api.rb +727 -0
  18. data/lib/shipeasy_admin/api/flags_api.rb +438 -0
  19. data/lib/shipeasy_admin/api/keys_api.rb +317 -0
  20. data/lib/shipeasy_admin/api/killswitch_api.rb +603 -0
  21. data/lib/shipeasy_admin/api/metrics_api.rb +281 -0
  22. data/lib/shipeasy_admin/api/ops_api.rb +465 -0
  23. data/lib/shipeasy_admin/api/profiles_api.rb +226 -0
  24. data/lib/shipeasy_admin/api/projects_api.rb +216 -0
  25. data/lib/shipeasy_admin/api/universes_api.rb +306 -0
  26. data/lib/shipeasy_admin/api_client.rb +441 -0
  27. data/lib/shipeasy_admin/api_error.rb +58 -0
  28. data/lib/shipeasy_admin/api_model_base.rb +88 -0
  29. data/lib/shipeasy_admin/configuration.rb +397 -0
  30. data/lib/shipeasy_admin/models/approve_event_request.rb +198 -0
  31. data/lib/shipeasy_admin/models/approve_event_response.rb +166 -0
  32. data/lib/shipeasy_admin/models/claude_trigger_config.rb +204 -0
  33. data/lib/shipeasy_admin/models/connector_event.rb +40 -0
  34. data/lib/shipeasy_admin/models/connector_provider.rb +45 -0
  35. data/lib/shipeasy_admin/models/connector_record.rb +468 -0
  36. data/lib/shipeasy_admin/models/copilot_trigger_config.rb +276 -0
  37. data/lib/shipeasy_admin/models/create_alert_rule_request.rb +383 -0
  38. data/lib/shipeasy_admin/models/create_alert_rule_response.rb +165 -0
  39. data/lib/shipeasy_admin/models/create_claude_trigger_request.rb +309 -0
  40. data/lib/shipeasy_admin/models/create_config_request.rb +291 -0
  41. data/lib/shipeasy_admin/models/create_config_response.rb +201 -0
  42. data/lib/shipeasy_admin/models/create_connector_request.rb +64 -0
  43. data/lib/shipeasy_admin/models/create_connector_response.rb +165 -0
  44. data/lib/shipeasy_admin/models/create_copilot_trigger_request.rb +316 -0
  45. data/lib/shipeasy_admin/models/create_cursor_trigger_request.rb +352 -0
  46. data/lib/shipeasy_admin/models/create_event_request.rb +236 -0
  47. data/lib/shipeasy_admin/models/create_event_response.rb +193 -0
  48. data/lib/shipeasy_admin/models/create_experiment_request.rb +807 -0
  49. data/lib/shipeasy_admin/models/create_experiment_response.rb +212 -0
  50. data/lib/shipeasy_admin/models/create_gate_request.rb +492 -0
  51. data/lib/shipeasy_admin/models/create_gate_response.rb +212 -0
  52. data/lib/shipeasy_admin/models/create_i18n_profile_request.rb +188 -0
  53. data/lib/shipeasy_admin/models/create_i18n_profile_response.rb +193 -0
  54. data/lib/shipeasy_admin/models/create_jules_trigger_request.rb +352 -0
  55. data/lib/shipeasy_admin/models/create_key_request.rb +297 -0
  56. data/lib/shipeasy_admin/models/create_key_response.rb +286 -0
  57. data/lib/shipeasy_admin/models/create_killswitch_request.rb +274 -0
  58. data/lib/shipeasy_admin/models/create_killswitch_response.rb +201 -0
  59. data/lib/shipeasy_admin/models/create_metric_request.rb +403 -0
  60. data/lib/shipeasy_admin/models/create_metric_response.rb +193 -0
  61. data/lib/shipeasy_admin/models/create_o_auth_connector_request.rb +273 -0
  62. data/lib/shipeasy_admin/models/create_ops_item_request.rb +287 -0
  63. data/lib/shipeasy_admin/models/create_ops_item_response.rb +177 -0
  64. data/lib/shipeasy_admin/models/create_universe_request.rb +272 -0
  65. data/lib/shipeasy_admin/models/create_universe_response.rb +212 -0
  66. data/lib/shipeasy_admin/models/cursor_trigger_config.rb +231 -0
  67. data/lib/shipeasy_admin/models/delete_alert_rule_response.rb +188 -0
  68. data/lib/shipeasy_admin/models/delete_config_response.rb +188 -0
  69. data/lib/shipeasy_admin/models/delete_connector_response.rb +188 -0
  70. data/lib/shipeasy_admin/models/delete_event_response.rb +189 -0
  71. data/lib/shipeasy_admin/models/delete_experiment_response.rb +188 -0
  72. data/lib/shipeasy_admin/models/delete_gate_response.rb +188 -0
  73. data/lib/shipeasy_admin/models/delete_killswitch_response.rb +188 -0
  74. data/lib/shipeasy_admin/models/delete_metric_response.rb +189 -0
  75. data/lib/shipeasy_admin/models/delete_universe_response.rb +188 -0
  76. data/lib/shipeasy_admin/models/disable_gate_response.rb +190 -0
  77. data/lib/shipeasy_admin/models/discard_config_draft_request.rb +187 -0
  78. data/lib/shipeasy_admin/models/discard_config_draft_response.rb +188 -0
  79. data/lib/shipeasy_admin/models/enable_gate_response.rb +190 -0
  80. data/lib/shipeasy_admin/models/env.rb +41 -0
  81. data/lib/shipeasy_admin/models/error.rb +207 -0
  82. data/lib/shipeasy_admin/models/error_code.rb +52 -0
  83. data/lib/shipeasy_admin/models/error_record.rb +597 -0
  84. data/lib/shipeasy_admin/models/error_series_request.rb +251 -0
  85. data/lib/shipeasy_admin/models/error_series_response.rb +195 -0
  86. data/lib/shipeasy_admin/models/error_series_response_rows_inner.rb +192 -0
  87. data/lib/shipeasy_admin/models/experiment_inline_metric.rb +337 -0
  88. data/lib/shipeasy_admin/models/file_error_ticket_response.rb +193 -0
  89. data/lib/shipeasy_admin/models/fire_connector_request.rb +149 -0
  90. data/lib/shipeasy_admin/models/fire_connector_response.rb +176 -0
  91. data/lib/shipeasy_admin/models/get_config_response.rb +351 -0
  92. data/lib/shipeasy_admin/models/get_current_project_response.rb +606 -0
  93. data/lib/shipeasy_admin/models/get_current_project_response_module_translations.rb +104 -0
  94. data/lib/shipeasy_admin/models/get_event_response.rb +344 -0
  95. data/lib/shipeasy_admin/models/get_experiment_response.rb +688 -0
  96. data/lib/shipeasy_admin/models/get_experiment_results_response.rb +243 -0
  97. data/lib/shipeasy_admin/models/get_experiment_results_response_experiment.rb +248 -0
  98. data/lib/shipeasy_admin/models/get_experiment_results_response_results_inner.rb +252 -0
  99. data/lib/shipeasy_admin/models/get_experiment_timeseries_response.rb +192 -0
  100. data/lib/shipeasy_admin/models/get_experiment_timeseries_response_experiment.rb +261 -0
  101. data/lib/shipeasy_admin/models/get_experiment_timeseries_response_series_inner.rb +278 -0
  102. data/lib/shipeasy_admin/models/get_killswitch_response.rb +270 -0
  103. data/lib/shipeasy_admin/models/get_metric_response.rb +378 -0
  104. data/lib/shipeasy_admin/models/get_ops_item_response.rb +349 -0
  105. data/lib/shipeasy_admin/models/jules_trigger_config.rb +240 -0
  106. data/lib/shipeasy_admin/models/key_record.rb +353 -0
  107. data/lib/shipeasy_admin/models/killswitch_value.rb +178 -0
  108. data/lib/shipeasy_admin/models/link_pr_to_ops_item_request.rb +186 -0
  109. data/lib/shipeasy_admin/models/link_pr_to_ops_item_response.rb +166 -0
  110. data/lib/shipeasy_admin/models/list_alert_rules_response_inner.rb +478 -0
  111. data/lib/shipeasy_admin/models/list_attributes_response_inner.rb +176 -0
  112. data/lib/shipeasy_admin/models/list_config_activity_response_inner.rb +280 -0
  113. data/lib/shipeasy_admin/models/list_configs_response.rb +178 -0
  114. data/lib/shipeasy_admin/models/list_configs_response_data_inner.rb +351 -0
  115. data/lib/shipeasy_admin/models/list_configs_response_data_inner_drafts_value.rb +237 -0
  116. data/lib/shipeasy_admin/models/list_configs_response_data_inner_envs_value.rb +237 -0
  117. data/lib/shipeasy_admin/models/list_events_response_inner.rb +344 -0
  118. data/lib/shipeasy_admin/models/list_events_response_inner_properties_inner.rb +259 -0
  119. data/lib/shipeasy_admin/models/list_experiments_response.rb +178 -0
  120. data/lib/shipeasy_admin/models/list_experiments_response_data_inner.rb +688 -0
  121. data/lib/shipeasy_admin/models/list_experiments_response_data_inner_groups_inner.rb +241 -0
  122. data/lib/shipeasy_admin/models/list_gates_response.rb +178 -0
  123. data/lib/shipeasy_admin/models/list_gates_response_data_inner.rb +395 -0
  124. data/lib/shipeasy_admin/models/list_gates_response_data_inner_enabled.rb +104 -0
  125. data/lib/shipeasy_admin/models/list_gates_response_data_inner_rules_inner.rb +238 -0
  126. data/lib/shipeasy_admin/models/list_gates_response_data_inner_stack_inner.rb +105 -0
  127. data/lib/shipeasy_admin/models/list_gates_response_data_inner_stack_inner_one_of.rb +358 -0
  128. data/lib/shipeasy_admin/models/list_gates_response_data_inner_stack_inner_one_of1.rb +331 -0
  129. data/lib/shipeasy_admin/models/list_gates_response_data_inner_stack_inner_one_of_ramp.rb +319 -0
  130. data/lib/shipeasy_admin/models/list_i18n_drafts_response_inner.rb +272 -0
  131. data/lib/shipeasy_admin/models/list_i18n_keys_response.rb +195 -0
  132. data/lib/shipeasy_admin/models/list_i18n_keys_response_keys_inner.rb +284 -0
  133. data/lib/shipeasy_admin/models/list_i18n_profiles_response_inner.rb +224 -0
  134. data/lib/shipeasy_admin/models/list_keys_response.rb +180 -0
  135. data/lib/shipeasy_admin/models/list_killswitches_response.rb +178 -0
  136. data/lib/shipeasy_admin/models/list_killswitches_response_data_inner.rb +270 -0
  137. data/lib/shipeasy_admin/models/list_killswitches_response_data_inner_envs_value.rb +248 -0
  138. data/lib/shipeasy_admin/models/list_metrics_response_inner.rb +378 -0
  139. data/lib/shipeasy_admin/models/list_metrics_response_inner_query_ir.rb +288 -0
  140. data/lib/shipeasy_admin/models/list_metrics_response_inner_query_ir_agg.rb +113 -0
  141. data/lib/shipeasy_admin/models/list_metrics_response_inner_query_ir_agg_one_of.rb +188 -0
  142. data/lib/shipeasy_admin/models/list_metrics_response_inner_query_ir_agg_one_of1.rb +188 -0
  143. data/lib/shipeasy_admin/models/list_metrics_response_inner_query_ir_agg_one_of2.rb +188 -0
  144. data/lib/shipeasy_admin/models/list_metrics_response_inner_query_ir_agg_one_of3.rb +188 -0
  145. data/lib/shipeasy_admin/models/list_metrics_response_inner_query_ir_agg_one_of4.rb +188 -0
  146. data/lib/shipeasy_admin/models/list_metrics_response_inner_query_ir_agg_one_of5.rb +188 -0
  147. data/lib/shipeasy_admin/models/list_metrics_response_inner_query_ir_agg_one_of6.rb +188 -0
  148. data/lib/shipeasy_admin/models/list_metrics_response_inner_query_ir_agg_one_of7.rb +217 -0
  149. data/lib/shipeasy_admin/models/list_metrics_response_inner_query_ir_agg_one_of8.rb +233 -0
  150. data/lib/shipeasy_admin/models/list_metrics_response_inner_query_ir_agg_one_of9.rb +240 -0
  151. data/lib/shipeasy_admin/models/list_metrics_response_inner_query_ir_agg_one_of9_numerator.rb +266 -0
  152. data/lib/shipeasy_admin/models/list_metrics_response_inner_query_ir_agg_one_of9_numerator_filters_inner.rb +264 -0
  153. data/lib/shipeasy_admin/models/list_metrics_response_inner_query_ir_group_by.rb +228 -0
  154. data/lib/shipeasy_admin/models/list_ops_items_response_inner.rb +349 -0
  155. data/lib/shipeasy_admin/models/list_slack_channels_response.rb +195 -0
  156. data/lib/shipeasy_admin/models/list_slack_channels_response_channels_inner.rb +203 -0
  157. data/lib/shipeasy_admin/models/list_universes_response.rb +178 -0
  158. data/lib/shipeasy_admin/models/list_universes_response_data_inner.rb +305 -0
  159. data/lib/shipeasy_admin/models/notification_target.rb +159 -0
  160. data/lib/shipeasy_admin/models/notification_target_slack_channel.rb +208 -0
  161. data/lib/shipeasy_admin/models/notify_ops_request.rb +261 -0
  162. data/lib/shipeasy_admin/models/notify_ops_response.rb +193 -0
  163. data/lib/shipeasy_admin/models/publish_config_draft_request.rb +187 -0
  164. data/lib/shipeasy_admin/models/publish_config_draft_response.rb +257 -0
  165. data/lib/shipeasy_admin/models/publish_i18n_profile_request.rb +149 -0
  166. data/lib/shipeasy_admin/models/publish_i18n_profile_response.rb +404 -0
  167. data/lib/shipeasy_admin/models/push_i18n_keys_request.rb +205 -0
  168. data/lib/shipeasy_admin/models/push_i18n_keys_request_keys_inner.rb +192 -0
  169. data/lib/shipeasy_admin/models/push_i18n_keys_response.rb +261 -0
  170. data/lib/shipeasy_admin/models/reanalyze_experiment_response.rb +214 -0
  171. data/lib/shipeasy_admin/models/revoke_key_response.rb +216 -0
  172. data/lib/shipeasy_admin/models/save_config_draft_request.rb +199 -0
  173. data/lib/shipeasy_admin/models/save_config_draft_response.rb +283 -0
  174. data/lib/shipeasy_admin/models/search_hit.rb +284 -0
  175. data/lib/shipeasy_admin/models/search_response.rb +167 -0
  176. data/lib/shipeasy_admin/models/set_experiment_metrics_request.rb +168 -0
  177. data/lib/shipeasy_admin/models/set_experiment_metrics_request_metrics_inner.rb +216 -0
  178. data/lib/shipeasy_admin/models/set_experiment_metrics_response.rb +179 -0
  179. data/lib/shipeasy_admin/models/set_experiment_metrics_response_metrics_inner.rb +201 -0
  180. data/lib/shipeasy_admin/models/set_experiment_status_request.rb +190 -0
  181. data/lib/shipeasy_admin/models/set_experiment_status_response.rb +214 -0
  182. data/lib/shipeasy_admin/models/set_i18n_label_request.rb +213 -0
  183. data/lib/shipeasy_admin/models/set_i18n_label_response.rb +472 -0
  184. data/lib/shipeasy_admin/models/set_killswitch_switch_request.rb +261 -0
  185. data/lib/shipeasy_admin/models/set_killswitch_switch_response.rb +285 -0
  186. data/lib/shipeasy_admin/models/set_killswitch_value_request.rb +214 -0
  187. data/lib/shipeasy_admin/models/set_killswitch_value_response.rb +283 -0
  188. data/lib/shipeasy_admin/models/test_connector_response.rb +189 -0
  189. data/lib/shipeasy_admin/models/unset_killswitch_switch_request.rb +234 -0
  190. data/lib/shipeasy_admin/models/unset_killswitch_switch_response.rb +286 -0
  191. data/lib/shipeasy_admin/models/update_alert_rule_request.rb +304 -0
  192. data/lib/shipeasy_admin/models/update_alert_rule_response.rb +165 -0
  193. data/lib/shipeasy_admin/models/update_config_request.rb +198 -0
  194. data/lib/shipeasy_admin/models/update_config_response.rb +165 -0
  195. data/lib/shipeasy_admin/models/update_config_schema_request.rb +168 -0
  196. data/lib/shipeasy_admin/models/update_config_schema_response.rb +165 -0
  197. data/lib/shipeasy_admin/models/update_connector_request.rb +211 -0
  198. data/lib/shipeasy_admin/models/update_connector_response.rb +166 -0
  199. data/lib/shipeasy_admin/models/update_error_status_request.rb +190 -0
  200. data/lib/shipeasy_admin/models/update_event_request.rb +198 -0
  201. data/lib/shipeasy_admin/models/update_event_response.rb +166 -0
  202. data/lib/shipeasy_admin/models/update_experiment_request.rb +747 -0
  203. data/lib/shipeasy_admin/models/update_experiment_response.rb +165 -0
  204. data/lib/shipeasy_admin/models/update_gate_request.rb +403 -0
  205. data/lib/shipeasy_admin/models/update_gate_response.rb +166 -0
  206. data/lib/shipeasy_admin/models/update_i18n_key_request.rb +176 -0
  207. data/lib/shipeasy_admin/models/update_i18n_key_response.rb +166 -0
  208. data/lib/shipeasy_admin/models/update_killswitch_request.rb +224 -0
  209. data/lib/shipeasy_admin/models/update_killswitch_response.rb +165 -0
  210. data/lib/shipeasy_admin/models/update_ops_item_request.rb +205 -0
  211. data/lib/shipeasy_admin/models/update_ops_item_response.rb +166 -0
  212. data/lib/shipeasy_admin/models/update_universe_request.rb +213 -0
  213. data/lib/shipeasy_admin/models/update_universe_response.rb +165 -0
  214. data/lib/shipeasy_admin/models/upsert_project_request.rb +222 -0
  215. data/lib/shipeasy_admin/models/upsert_project_response.rb +260 -0
  216. data/lib/shipeasy_admin/version.rb +15 -0
  217. data/lib/shipeasy_admin.rb +243 -0
  218. metadata +277 -2
@@ -0,0 +1,212 @@
1
+ =begin
2
+ #Shipeasy Admin API
3
+
4
+ #REST API for managing feature gates, experiments, configs, universes, and killswitches in a Shipeasy project. Authenticate with an admin SDK key (`Authorization: Bearer sdk_admin_…`) and scope every request to a project via the `X-Project-Id` header. Mint admin keys via `POST /api/admin/keys` with `type: \"admin\"`. Keys expire after 90 days; rotate with the `revoke` action.
5
+
6
+ The version of the OpenAPI document: 2.0.0
7
+
8
+ Generated by: https://openapi-generator.tech
9
+ Generator version: 7.23.0
10
+
11
+ =end
12
+
13
+ require 'date'
14
+ require 'time'
15
+
16
+ module Shipeasy::Admin::Generated
17
+ class CreateExperimentResponse < ApiModelBase
18
+ # Newly assigned experiment id.
19
+ attr_accessor :id
20
+
21
+ # Stable experiment key. Single segment or `folder.name` (a-z, 0-9, `_`/`-`; max 128 chars). Used by SDKs as `Shipeasy.getExperiment(user, '<name>')`. Immutable after create.
22
+ attr_accessor :name
23
+
24
+ # Attribute mapping from ruby-style variable name to JSON key.
25
+ def self.attribute_map
26
+ {
27
+ :'id' => :'id',
28
+ :'name' => :'name'
29
+ }
30
+ end
31
+
32
+ # Returns attribute mapping this model knows about
33
+ def self.acceptable_attribute_map
34
+ attribute_map
35
+ end
36
+
37
+ # Returns all the JSON keys this model knows about
38
+ def self.acceptable_attributes
39
+ acceptable_attribute_map.values
40
+ end
41
+
42
+ # Attribute type mapping.
43
+ def self.openapi_types
44
+ {
45
+ :'id' => :'String',
46
+ :'name' => :'String'
47
+ }
48
+ end
49
+
50
+ # List of attributes with nullable: true
51
+ def self.openapi_nullable
52
+ Set.new([
53
+ ])
54
+ end
55
+
56
+ # Initializes the object
57
+ # @param [Hash] attributes Model attributes in the form of hash
58
+ def initialize(attributes = {})
59
+ if (!attributes.is_a?(Hash))
60
+ fail ArgumentError, "The input argument (attributes) must be a hash in `Shipeasy::Admin::Generated::CreateExperimentResponse` initialize method"
61
+ end
62
+
63
+ # check to see if the attribute exists and convert string to symbol for hash key
64
+ acceptable_attribute_map = self.class.acceptable_attribute_map
65
+ attributes = attributes.each_with_object({}) { |(k, v), h|
66
+ if (!acceptable_attribute_map.key?(k.to_sym))
67
+ fail ArgumentError, "`#{k}` is not a valid attribute in `Shipeasy::Admin::Generated::CreateExperimentResponse`. Please check the name to make sure it's valid. List of attributes: " + acceptable_attribute_map.keys.inspect
68
+ end
69
+ h[k.to_sym] = v
70
+ }
71
+
72
+ if attributes.key?(:'id')
73
+ self.id = attributes[:'id']
74
+ else
75
+ self.id = nil
76
+ end
77
+
78
+ if attributes.key?(:'name')
79
+ self.name = attributes[:'name']
80
+ else
81
+ self.name = nil
82
+ end
83
+ end
84
+
85
+ # Show invalid properties with the reasons. Usually used together with valid?
86
+ # @return Array for valid properties with the reasons
87
+ def list_invalid_properties
88
+ warn '[DEPRECATED] the `list_invalid_properties` method is obsolete'
89
+ invalid_properties = Array.new
90
+ if @id.nil?
91
+ invalid_properties.push('invalid value for "id", id cannot be nil.')
92
+ end
93
+
94
+ if @name.nil?
95
+ invalid_properties.push('invalid value for "name", name cannot be nil.')
96
+ end
97
+
98
+ if @name.to_s.length > 128
99
+ invalid_properties.push('invalid value for "name", the character length must be smaller than or equal to 128.')
100
+ end
101
+
102
+ pattern = Regexp.new(/^[a-z0-9](?:[a-z0-9_-]*[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9_-]*[a-z0-9])?)?$/)
103
+ if @name !~ pattern
104
+ invalid_properties.push("invalid value for \"name\", must conform to the pattern #{pattern}.")
105
+ end
106
+
107
+ invalid_properties
108
+ end
109
+
110
+ # Check to see if the all the properties in the model are valid
111
+ # @return true if the model is valid
112
+ def valid?
113
+ warn '[DEPRECATED] the `valid?` method is obsolete'
114
+ return false if @id.nil?
115
+ return false if @name.nil?
116
+ return false if @name.to_s.length > 128
117
+ return false if @name !~ Regexp.new(/^[a-z0-9](?:[a-z0-9_-]*[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9_-]*[a-z0-9])?)?$/)
118
+ true
119
+ end
120
+
121
+ # Custom attribute writer method with validation
122
+ # @param [Object] id Value to be assigned
123
+ def id=(id)
124
+ if id.nil?
125
+ fail ArgumentError, 'id cannot be nil'
126
+ end
127
+
128
+ @id = id
129
+ end
130
+
131
+ # Custom attribute writer method with validation
132
+ # @param [Object] name Value to be assigned
133
+ def name=(name)
134
+ if name.nil?
135
+ fail ArgumentError, 'name cannot be nil'
136
+ end
137
+
138
+ if name.to_s.length > 128
139
+ fail ArgumentError, 'invalid value for "name", the character length must be smaller than or equal to 128.'
140
+ end
141
+
142
+ pattern = Regexp.new(/^[a-z0-9](?:[a-z0-9_-]*[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9_-]*[a-z0-9])?)?$/)
143
+ if name !~ pattern
144
+ fail ArgumentError, "invalid value for \"name\", must conform to the pattern #{pattern}."
145
+ end
146
+
147
+ @name = name
148
+ end
149
+
150
+ # Checks equality by comparing each attribute.
151
+ # @param [Object] Object to be compared
152
+ def ==(o)
153
+ return true if self.equal?(o)
154
+ self.class == o.class &&
155
+ id == o.id &&
156
+ name == o.name
157
+ end
158
+
159
+ # @see the `==` method
160
+ # @param [Object] Object to be compared
161
+ def eql?(o)
162
+ self == o
163
+ end
164
+
165
+ # Calculates hash code according to all attributes.
166
+ # @return [Integer] Hash code
167
+ def hash
168
+ [id, name].hash
169
+ end
170
+
171
+ # Builds the object from hash
172
+ # @param [Hash] attributes Model attributes in the form of hash
173
+ # @return [Object] Returns the model itself
174
+ def self.build_from_hash(attributes)
175
+ return nil unless attributes.is_a?(Hash)
176
+ attributes = attributes.transform_keys(&:to_sym)
177
+ transformed_hash = {}
178
+ openapi_types.each_pair do |key, type|
179
+ if attributes.key?(attribute_map[key]) && attributes[attribute_map[key]].nil?
180
+ transformed_hash["#{key}"] = nil
181
+ elsif type =~ /\AArray<(.*)>/i
182
+ # check to ensure the input is an array given that the attribute
183
+ # is documented as an array but the input is not
184
+ if attributes[attribute_map[key]].is_a?(Array)
185
+ transformed_hash["#{key}"] = attributes[attribute_map[key]].map { |v| _deserialize($1, v) }
186
+ end
187
+ elsif !attributes[attribute_map[key]].nil?
188
+ transformed_hash["#{key}"] = _deserialize(type, attributes[attribute_map[key]])
189
+ end
190
+ end
191
+ new(transformed_hash)
192
+ end
193
+
194
+ # Returns the object in the form of hash
195
+ # @return [Hash] Returns the object in the form of hash
196
+ def to_hash
197
+ hash = {}
198
+ self.class.attribute_map.each_pair do |attr, param|
199
+ value = self.send(attr)
200
+ if value.nil?
201
+ is_nullable = self.class.openapi_nullable.include?(attr)
202
+ next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}"))
203
+ end
204
+
205
+ hash[param] = _to_hash(value)
206
+ end
207
+ hash
208
+ end
209
+
210
+ end
211
+
212
+ end
@@ -0,0 +1,492 @@
1
+ =begin
2
+ #Shipeasy Admin API
3
+
4
+ #REST API for managing feature gates, experiments, configs, universes, and killswitches in a Shipeasy project. Authenticate with an admin SDK key (`Authorization: Bearer sdk_admin_…`) and scope every request to a project via the `X-Project-Id` header. Mint admin keys via `POST /api/admin/keys` with `type: \"admin\"`. Keys expire after 90 days; rotate with the `revoke` action.
5
+
6
+ The version of the OpenAPI document: 2.0.0
7
+
8
+ Generated by: https://openapi-generator.tech
9
+ Generator version: 7.23.0
10
+
11
+ =end
12
+
13
+ require 'date'
14
+ require 'time'
15
+
16
+ module Shipeasy::Admin::Generated
17
+ # Body for `POST /api/admin/gates`. At minimum supply `name`; everything else has sensible defaults.
18
+ class CreateGateRequest < ApiModelBase
19
+ # Stable gate key used by SDKs (`Shipeasy.checkGate(user, '<name>')`). Single segment or `folder.name`. Lowercase letters, digits, `_` or `-`; max 128 chars. Immutable after create — rename = delete + recreate.
20
+ attr_accessor :name
21
+
22
+ # Master switch. Defaults to `true`. Set `false` to create the gate disabled (evaluates to `false` regardless of rules/rollout); flip on via `POST /{id}/enable` or PATCH.
23
+ attr_accessor :enabled
24
+
25
+ # Initial rollout in **basis points** (0–10000 = 0%–100%) — `100` here means **1%**, not 100%. Use `rollout_percent` (0–100) below if you'd rather think in percent. Use `0` to create the gate dark and ramp via PATCH after deploy validation.
26
+ attr_accessor :rollout_pct
27
+
28
+ # Initial rollout as a **percentage** (0–100, fractional ok). Friendlier alias for `rollout_pct`; converted internally to basis points (e.g. `100` here = 10000 bp = 100%). If both `rollout_pct` and `rollout_percent` are set, `rollout_percent` wins.
29
+ attr_accessor :rollout_percent
30
+
31
+ # Targeting predicates. AND-combined. If non-empty, the gate returns `true` only for callers that satisfy every rule **and** fall under `rollout_pct`.
32
+ attr_accessor :rules
33
+
34
+ # Hash salt for percentage bucketing. Auto-generated if omitted. Provide explicitly to keep a gate's buckets stable across delete/recreate. **Immutable after create** — there is no PATCH for `salt` because changing it would re-bucket every caller.
35
+ attr_accessor :salt
36
+
37
+ # Optional gatekeeper stack. When provided, takes precedence over `rules` + `rollout_pct` at evaluation time. Omit (or pass `null`) for a flat gate.
38
+ attr_accessor :stack
39
+
40
+ # Human-readable title shown in the dashboard. Free-form, no key format constraint.
41
+ attr_accessor :title
42
+
43
+ # Long-form description / runbook. Markdown is rendered in the dashboard.
44
+ attr_accessor :description
45
+
46
+ # Optional folder name grouping items in the dashboard. Alphanumeric, `_` or `-` (no `/`). Part of the SDK lookup key (`<folder>/<name>`).
47
+ attr_accessor :folder
48
+
49
+ # Group label for dashboard organisation (e.g. team or product area).
50
+ attr_accessor :group
51
+
52
+ # Owner contact. Displayed verbatim; not used for auth.
53
+ attr_accessor :owner_email
54
+
55
+ # Attribute mapping from ruby-style variable name to JSON key.
56
+ def self.attribute_map
57
+ {
58
+ :'name' => :'name',
59
+ :'enabled' => :'enabled',
60
+ :'rollout_pct' => :'rollout_pct',
61
+ :'rollout_percent' => :'rollout_percent',
62
+ :'rules' => :'rules',
63
+ :'salt' => :'salt',
64
+ :'stack' => :'stack',
65
+ :'title' => :'title',
66
+ :'description' => :'description',
67
+ :'folder' => :'folder',
68
+ :'group' => :'group',
69
+ :'owner_email' => :'owner_email'
70
+ }
71
+ end
72
+
73
+ # Returns attribute mapping this model knows about
74
+ def self.acceptable_attribute_map
75
+ attribute_map
76
+ end
77
+
78
+ # Returns all the JSON keys this model knows about
79
+ def self.acceptable_attributes
80
+ acceptable_attribute_map.values
81
+ end
82
+
83
+ # Attribute type mapping.
84
+ def self.openapi_types
85
+ {
86
+ :'name' => :'String',
87
+ :'enabled' => :'Boolean',
88
+ :'rollout_pct' => :'Integer',
89
+ :'rollout_percent' => :'Float',
90
+ :'rules' => :'Array<ListGatesResponseDataInnerRulesInner>',
91
+ :'salt' => :'String',
92
+ :'stack' => :'Array<ListGatesResponseDataInnerStackInner>',
93
+ :'title' => :'String',
94
+ :'description' => :'String',
95
+ :'folder' => :'String',
96
+ :'group' => :'String',
97
+ :'owner_email' => :'String'
98
+ }
99
+ end
100
+
101
+ # List of attributes with nullable: true
102
+ def self.openapi_nullable
103
+ Set.new([
104
+ :'stack',
105
+ :'folder',
106
+ ])
107
+ end
108
+
109
+ # Initializes the object
110
+ # @param [Hash] attributes Model attributes in the form of hash
111
+ def initialize(attributes = {})
112
+ if (!attributes.is_a?(Hash))
113
+ fail ArgumentError, "The input argument (attributes) must be a hash in `Shipeasy::Admin::Generated::CreateGateRequest` initialize method"
114
+ end
115
+
116
+ # check to see if the attribute exists and convert string to symbol for hash key
117
+ acceptable_attribute_map = self.class.acceptable_attribute_map
118
+ attributes = attributes.each_with_object({}) { |(k, v), h|
119
+ if (!acceptable_attribute_map.key?(k.to_sym))
120
+ fail ArgumentError, "`#{k}` is not a valid attribute in `Shipeasy::Admin::Generated::CreateGateRequest`. Please check the name to make sure it's valid. List of attributes: " + acceptable_attribute_map.keys.inspect
121
+ end
122
+ h[k.to_sym] = v
123
+ }
124
+
125
+ if attributes.key?(:'name')
126
+ self.name = attributes[:'name']
127
+ else
128
+ self.name = nil
129
+ end
130
+
131
+ if attributes.key?(:'enabled')
132
+ self.enabled = attributes[:'enabled']
133
+ else
134
+ self.enabled = true
135
+ end
136
+
137
+ if attributes.key?(:'rollout_pct')
138
+ self.rollout_pct = attributes[:'rollout_pct']
139
+ else
140
+ self.rollout_pct = 0
141
+ end
142
+
143
+ if attributes.key?(:'rollout_percent')
144
+ self.rollout_percent = attributes[:'rollout_percent']
145
+ end
146
+
147
+ if attributes.key?(:'rules')
148
+ if (value = attributes[:'rules']).is_a?(Array)
149
+ self.rules = value
150
+ end
151
+ end
152
+
153
+ if attributes.key?(:'salt')
154
+ self.salt = attributes[:'salt']
155
+ end
156
+
157
+ if attributes.key?(:'stack')
158
+ if (value = attributes[:'stack']).is_a?(Array)
159
+ self.stack = value
160
+ end
161
+ end
162
+
163
+ if attributes.key?(:'title')
164
+ self.title = attributes[:'title']
165
+ end
166
+
167
+ if attributes.key?(:'description')
168
+ self.description = attributes[:'description']
169
+ end
170
+
171
+ if attributes.key?(:'folder')
172
+ self.folder = attributes[:'folder']
173
+ end
174
+
175
+ if attributes.key?(:'group')
176
+ self.group = attributes[:'group']
177
+ end
178
+
179
+ if attributes.key?(:'owner_email')
180
+ self.owner_email = attributes[:'owner_email']
181
+ end
182
+ end
183
+
184
+ # Show invalid properties with the reasons. Usually used together with valid?
185
+ # @return Array for valid properties with the reasons
186
+ def list_invalid_properties
187
+ warn '[DEPRECATED] the `list_invalid_properties` method is obsolete'
188
+ invalid_properties = Array.new
189
+ if @name.nil?
190
+ invalid_properties.push('invalid value for "name", name cannot be nil.')
191
+ end
192
+
193
+ if @name.to_s.length > 128
194
+ invalid_properties.push('invalid value for "name", the character length must be smaller than or equal to 128.')
195
+ end
196
+
197
+ pattern = Regexp.new(/^[a-z0-9](?:[a-z0-9_-]*[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9_-]*[a-z0-9])?)?$/)
198
+ if @name !~ pattern
199
+ invalid_properties.push("invalid value for \"name\", must conform to the pattern #{pattern}.")
200
+ end
201
+
202
+ if !@rollout_pct.nil? && @rollout_pct > 10000
203
+ invalid_properties.push('invalid value for "rollout_pct", must be smaller than or equal to 10000.')
204
+ end
205
+
206
+ if !@rollout_pct.nil? && @rollout_pct < 0
207
+ invalid_properties.push('invalid value for "rollout_pct", must be greater than or equal to 0.')
208
+ end
209
+
210
+ if !@rollout_percent.nil? && @rollout_percent > 100
211
+ invalid_properties.push('invalid value for "rollout_percent", must be smaller than or equal to 100.')
212
+ end
213
+
214
+ if !@rollout_percent.nil? && @rollout_percent < 0
215
+ invalid_properties.push('invalid value for "rollout_percent", must be greater than or equal to 0.')
216
+ end
217
+
218
+ if !@salt.nil? && @salt.to_s.length > 64
219
+ invalid_properties.push('invalid value for "salt", the character length must be smaller than or equal to 64.')
220
+ end
221
+
222
+ if !@salt.nil? && @salt.to_s.length < 1
223
+ invalid_properties.push('invalid value for "salt", the character length must be greater than or equal to 1.')
224
+ end
225
+
226
+ if !@title.nil? && @title.to_s.length > 140
227
+ invalid_properties.push('invalid value for "title", the character length must be smaller than or equal to 140.')
228
+ end
229
+
230
+ if !@description.nil? && @description.to_s.length > 2000
231
+ invalid_properties.push('invalid value for "description", the character length must be smaller than or equal to 2000.')
232
+ end
233
+
234
+ if !@folder.nil? && @folder.to_s.length > 256
235
+ invalid_properties.push('invalid value for "folder", the character length must be smaller than or equal to 256.')
236
+ end
237
+
238
+ pattern = Regexp.new(/^[a-zA-Z0-9_-]+$/)
239
+ if !@folder.nil? && @folder !~ pattern
240
+ invalid_properties.push("invalid value for \"folder\", must conform to the pattern #{pattern}.")
241
+ end
242
+
243
+ if !@group.nil? && @group.to_s.length > 64
244
+ invalid_properties.push('invalid value for "group", the character length must be smaller than or equal to 64.')
245
+ end
246
+
247
+ if !@owner_email.nil? && @owner_email.to_s.length > 190
248
+ invalid_properties.push('invalid value for "owner_email", the character length must be smaller than or equal to 190.')
249
+ end
250
+
251
+ invalid_properties
252
+ end
253
+
254
+ # Check to see if the all the properties in the model are valid
255
+ # @return true if the model is valid
256
+ def valid?
257
+ warn '[DEPRECATED] the `valid?` method is obsolete'
258
+ return false if @name.nil?
259
+ return false if @name.to_s.length > 128
260
+ return false if @name !~ Regexp.new(/^[a-z0-9](?:[a-z0-9_-]*[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9_-]*[a-z0-9])?)?$/)
261
+ return false if !@rollout_pct.nil? && @rollout_pct > 10000
262
+ return false if !@rollout_pct.nil? && @rollout_pct < 0
263
+ return false if !@rollout_percent.nil? && @rollout_percent > 100
264
+ return false if !@rollout_percent.nil? && @rollout_percent < 0
265
+ return false if !@salt.nil? && @salt.to_s.length > 64
266
+ return false if !@salt.nil? && @salt.to_s.length < 1
267
+ return false if !@title.nil? && @title.to_s.length > 140
268
+ return false if !@description.nil? && @description.to_s.length > 2000
269
+ return false if !@folder.nil? && @folder.to_s.length > 256
270
+ return false if !@folder.nil? && @folder !~ Regexp.new(/^[a-zA-Z0-9_-]+$/)
271
+ return false if !@group.nil? && @group.to_s.length > 64
272
+ return false if !@owner_email.nil? && @owner_email.to_s.length > 190
273
+ true
274
+ end
275
+
276
+ # Custom attribute writer method with validation
277
+ # @param [Object] name Value to be assigned
278
+ def name=(name)
279
+ if name.nil?
280
+ fail ArgumentError, 'name cannot be nil'
281
+ end
282
+
283
+ if name.to_s.length > 128
284
+ fail ArgumentError, 'invalid value for "name", the character length must be smaller than or equal to 128.'
285
+ end
286
+
287
+ pattern = Regexp.new(/^[a-z0-9](?:[a-z0-9_-]*[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9_-]*[a-z0-9])?)?$/)
288
+ if name !~ pattern
289
+ fail ArgumentError, "invalid value for \"name\", must conform to the pattern #{pattern}."
290
+ end
291
+
292
+ @name = name
293
+ end
294
+
295
+ # Custom attribute writer method with validation
296
+ # @param [Object] rollout_pct Value to be assigned
297
+ def rollout_pct=(rollout_pct)
298
+ if rollout_pct.nil?
299
+ fail ArgumentError, 'rollout_pct cannot be nil'
300
+ end
301
+
302
+ if rollout_pct > 10000
303
+ fail ArgumentError, 'invalid value for "rollout_pct", must be smaller than or equal to 10000.'
304
+ end
305
+
306
+ if rollout_pct < 0
307
+ fail ArgumentError, 'invalid value for "rollout_pct", must be greater than or equal to 0.'
308
+ end
309
+
310
+ @rollout_pct = rollout_pct
311
+ end
312
+
313
+ # Custom attribute writer method with validation
314
+ # @param [Object] rollout_percent Value to be assigned
315
+ def rollout_percent=(rollout_percent)
316
+ if rollout_percent.nil?
317
+ fail ArgumentError, 'rollout_percent cannot be nil'
318
+ end
319
+
320
+ if rollout_percent > 100
321
+ fail ArgumentError, 'invalid value for "rollout_percent", must be smaller than or equal to 100.'
322
+ end
323
+
324
+ if rollout_percent < 0
325
+ fail ArgumentError, 'invalid value for "rollout_percent", must be greater than or equal to 0.'
326
+ end
327
+
328
+ @rollout_percent = rollout_percent
329
+ end
330
+
331
+ # Custom attribute writer method with validation
332
+ # @param [Object] salt Value to be assigned
333
+ def salt=(salt)
334
+ if salt.nil?
335
+ fail ArgumentError, 'salt cannot be nil'
336
+ end
337
+
338
+ if salt.to_s.length > 64
339
+ fail ArgumentError, 'invalid value for "salt", the character length must be smaller than or equal to 64.'
340
+ end
341
+
342
+ if salt.to_s.length < 1
343
+ fail ArgumentError, 'invalid value for "salt", the character length must be greater than or equal to 1.'
344
+ end
345
+
346
+ @salt = salt
347
+ end
348
+
349
+ # Custom attribute writer method with validation
350
+ # @param [Object] title Value to be assigned
351
+ def title=(title)
352
+ if title.nil?
353
+ fail ArgumentError, 'title cannot be nil'
354
+ end
355
+
356
+ if title.to_s.length > 140
357
+ fail ArgumentError, 'invalid value for "title", the character length must be smaller than or equal to 140.'
358
+ end
359
+
360
+ @title = title
361
+ end
362
+
363
+ # Custom attribute writer method with validation
364
+ # @param [Object] description Value to be assigned
365
+ def description=(description)
366
+ if description.nil?
367
+ fail ArgumentError, 'description cannot be nil'
368
+ end
369
+
370
+ if description.to_s.length > 2000
371
+ fail ArgumentError, 'invalid value for "description", the character length must be smaller than or equal to 2000.'
372
+ end
373
+
374
+ @description = description
375
+ end
376
+
377
+ # Custom attribute writer method with validation
378
+ # @param [Object] folder Value to be assigned
379
+ def folder=(folder)
380
+ if !folder.nil? && folder.to_s.length > 256
381
+ fail ArgumentError, 'invalid value for "folder", the character length must be smaller than or equal to 256.'
382
+ end
383
+
384
+ pattern = Regexp.new(/^[a-zA-Z0-9_-]+$/)
385
+ if !folder.nil? && folder !~ pattern
386
+ fail ArgumentError, "invalid value for \"folder\", must conform to the pattern #{pattern}."
387
+ end
388
+
389
+ @folder = folder
390
+ end
391
+
392
+ # Custom attribute writer method with validation
393
+ # @param [Object] group Value to be assigned
394
+ def group=(group)
395
+ if group.nil?
396
+ fail ArgumentError, 'group cannot be nil'
397
+ end
398
+
399
+ if group.to_s.length > 64
400
+ fail ArgumentError, 'invalid value for "group", the character length must be smaller than or equal to 64.'
401
+ end
402
+
403
+ @group = group
404
+ end
405
+
406
+ # Custom attribute writer method with validation
407
+ # @param [Object] owner_email Value to be assigned
408
+ def owner_email=(owner_email)
409
+ if owner_email.nil?
410
+ fail ArgumentError, 'owner_email cannot be nil'
411
+ end
412
+
413
+ if owner_email.to_s.length > 190
414
+ fail ArgumentError, 'invalid value for "owner_email", the character length must be smaller than or equal to 190.'
415
+ end
416
+
417
+ @owner_email = owner_email
418
+ end
419
+
420
+ # Checks equality by comparing each attribute.
421
+ # @param [Object] Object to be compared
422
+ def ==(o)
423
+ return true if self.equal?(o)
424
+ self.class == o.class &&
425
+ name == o.name &&
426
+ enabled == o.enabled &&
427
+ rollout_pct == o.rollout_pct &&
428
+ rollout_percent == o.rollout_percent &&
429
+ rules == o.rules &&
430
+ salt == o.salt &&
431
+ stack == o.stack &&
432
+ title == o.title &&
433
+ description == o.description &&
434
+ folder == o.folder &&
435
+ group == o.group &&
436
+ owner_email == o.owner_email
437
+ end
438
+
439
+ # @see the `==` method
440
+ # @param [Object] Object to be compared
441
+ def eql?(o)
442
+ self == o
443
+ end
444
+
445
+ # Calculates hash code according to all attributes.
446
+ # @return [Integer] Hash code
447
+ def hash
448
+ [name, enabled, rollout_pct, rollout_percent, rules, salt, stack, title, description, folder, group, owner_email].hash
449
+ end
450
+
451
+ # Builds the object from hash
452
+ # @param [Hash] attributes Model attributes in the form of hash
453
+ # @return [Object] Returns the model itself
454
+ def self.build_from_hash(attributes)
455
+ return nil unless attributes.is_a?(Hash)
456
+ attributes = attributes.transform_keys(&:to_sym)
457
+ transformed_hash = {}
458
+ openapi_types.each_pair do |key, type|
459
+ if attributes.key?(attribute_map[key]) && attributes[attribute_map[key]].nil?
460
+ transformed_hash["#{key}"] = nil
461
+ elsif type =~ /\AArray<(.*)>/i
462
+ # check to ensure the input is an array given that the attribute
463
+ # is documented as an array but the input is not
464
+ if attributes[attribute_map[key]].is_a?(Array)
465
+ transformed_hash["#{key}"] = attributes[attribute_map[key]].map { |v| _deserialize($1, v) }
466
+ end
467
+ elsif !attributes[attribute_map[key]].nil?
468
+ transformed_hash["#{key}"] = _deserialize(type, attributes[attribute_map[key]])
469
+ end
470
+ end
471
+ new(transformed_hash)
472
+ end
473
+
474
+ # Returns the object in the form of hash
475
+ # @return [Hash] Returns the object in the form of hash
476
+ def to_hash
477
+ hash = {}
478
+ self.class.attribute_map.each_pair do |attr, param|
479
+ value = self.send(attr)
480
+ if value.nil?
481
+ is_nullable = self.class.openapi_nullable.include?(attr)
482
+ next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}"))
483
+ end
484
+
485
+ hash[param] = _to_hash(value)
486
+ end
487
+ hash
488
+ end
489
+
490
+ end
491
+
492
+ end