wefunder 1.0.0 → 1.1.0

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 (113) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +35 -13
  3. data/lib/wefunder/client.rb +127 -12
  4. data/lib/wefunder/version.rb +1 -1
  5. data/lib/wefunder/webhooks.rb +5 -2
  6. data/lib/wefunder_generated/api/activity_api.rb +0 -92
  7. data/lib/wefunder_generated/api/explore_api.rb +24 -6
  8. data/lib/wefunder_generated/api/intents_api.rb +2 -2
  9. data/lib/wefunder_generated/api/investment_delta_api.rb +4 -4
  10. data/lib/wefunder_generated/api/investments_api.rb +2 -2
  11. data/lib/wefunder_generated/api/member_links_api.rb +287 -0
  12. data/lib/wefunder_generated/api/partner_invites_sessions_api.rb +374 -0
  13. data/lib/wefunder_generated/api/portfolio_api.rb +2 -2
  14. data/lib/wefunder_generated/api/referral_codes_api.rb +374 -0
  15. data/lib/wefunder_generated/api/syndicate_deals_api.rb +2 -140
  16. data/lib/wefunder_generated/api/syndicate_members_api.rb +216 -0
  17. data/lib/wefunder_generated/api/syndicate_statistics_api.rb +2 -2
  18. data/lib/wefunder_generated/api/users_api.rb +4 -4
  19. data/lib/wefunder_generated/models/audit_event_attributes.rb +1 -0
  20. data/lib/wefunder_generated/models/campaign.rb +1 -1
  21. data/lib/wefunder_generated/models/company_attributes.rb +88 -1
  22. data/lib/wefunder_generated/models/company_disclosures_attributes_ratios.rb +13 -2
  23. data/lib/wefunder_generated/models/create_intent_request.rb +2 -2
  24. data/lib/wefunder_generated/models/{webhook_subscription_with_secret2_envelope.rb → create_offering_investment_session_request.rb} +17 -10
  25. data/lib/wefunder_generated/models/{attribution_stats_envelope.rb → create_offering_member_link_request.rb} +10 -10
  26. data/lib/wefunder_generated/models/{create_partner_invite_request.rb → create_referral_code_request.rb} +58 -63
  27. data/lib/wefunder_generated/models/{attribution_stats_period.rb → create_syndicate_join_session_request.rb} +17 -19
  28. data/lib/wefunder_generated/models/{anonymized_attribution.rb → create_syndicate_join_session_request_join_session.rb} +81 -53
  29. data/lib/wefunder_generated/models/create_webhook_endpoint_request.rb +11 -1
  30. data/lib/wefunder_generated/models/fiscal_year_financials.rb +25 -1
  31. data/lib/wefunder_generated/models/intent_attributes.rb +1 -0
  32. data/lib/wefunder_generated/models/investment_delta_record.rb +4 -4
  33. data/lib/wefunder_generated/models/investment_session_attributes.rb +1 -0
  34. data/lib/wefunder_generated/models/investment_session_create_input.rb +13 -2
  35. data/lib/wefunder_generated/models/investment_session_envelope.rb +1 -1
  36. data/lib/wefunder_generated/models/invite_link_attributes.rb +47 -4
  37. data/lib/wefunder_generated/models/invite_link_attributes_events_inner.rb +12 -1
  38. data/lib/wefunder_generated/models/invite_link_envelope.rb +1 -1
  39. data/lib/wefunder_generated/models/{full_attribution_status.rb → member_link.rb} +34 -24
  40. data/lib/wefunder_generated/models/{marketing_partner.rb → member_link_attributes.rb} +60 -44
  41. data/lib/wefunder_generated/models/{attribution_me_envelope.rb → member_link_create_input.rb} +40 -10
  42. data/lib/wefunder_generated/models/{spv_with_meta_envelope.rb → member_link_envelope.rb} +5 -5
  43. data/lib/wefunder_generated/models/{spv_list_envelope.rb → member_link_list_envelope.rb} +5 -5
  44. data/lib/wefunder_generated/models/{full_attribution_investor.rb → member_link_list_envelope_meta.rb} +28 -29
  45. data/lib/wefunder_generated/models/offering_attributes.rb +34 -1
  46. data/lib/wefunder_generated/models/offering_list_envelope_meta.rb +57 -3
  47. data/lib/wefunder_generated/models/portfolio_company_ref.rb +16 -5
  48. data/lib/wefunder_generated/models/portfolio_position_attributes.rb +13 -2
  49. data/lib/wefunder_generated/models/portfolio_security_terms.rb +15 -2
  50. data/lib/wefunder_generated/models/{spv_status.rb → referral_code.rb} +4 -4
  51. data/lib/wefunder_generated/models/{webhook_subscription.rb → referral_code_attributes.rb} +51 -63
  52. data/lib/wefunder_generated/models/{anonymized_attribution_status.rb → referral_code_attributes_target.rb} +36 -27
  53. data/lib/wefunder_generated/models/{spv_status_envelope.rb → referral_code_envelope.rb} +5 -5
  54. data/lib/wefunder_generated/models/{spv_with_meta_envelope_meta.rb → referral_code_envelope_meta.rb} +3 -3
  55. data/lib/wefunder_generated/models/{partner_investor_list_envelope.rb → referral_code_list_envelope.rb} +5 -5
  56. data/lib/wefunder_generated/models/{attribution_campaign_summary.rb → referral_code_list_envelope_meta.rb} +36 -35
  57. data/lib/wefunder_generated/models/{spv_status_attributes.rb → referral_code_stats_company.rb} +70 -47
  58. data/lib/wefunder_generated/models/referral_code_stats_envelope.rb +223 -0
  59. data/lib/wefunder_generated/models/{partner_investor.rb → referral_code_stats_envelope_data.rb} +4 -5
  60. data/lib/wefunder_generated/models/{syndicate_deal_finalize_intent_envelope_meta.rb → referral_code_stats_envelope_data_attributes.rb} +56 -10
  61. data/lib/wefunder_generated/models/{webhook_endpoint_envelope_meta.rb → referral_code_stats_envelope_meta.rb} +32 -4
  62. data/lib/wefunder_generated/models/{full_attribution.rb → referral_code_utm.rb} +130 -56
  63. data/lib/wefunder_generated/models/{attribution_me.rb → referral_code_visits.rb} +23 -25
  64. data/lib/wefunder_generated/models/{attribution_campaign_access.rb → referral_cohort.rb} +29 -28
  65. data/lib/wefunder_generated/models/referral_cohort_investors.rb +224 -0
  66. data/lib/wefunder_generated/models/syndicate_attributes.rb +11 -1
  67. data/lib/wefunder_generated/models/{syndicate_deal_close_intent_envelope.rb → syndicate_deal_created_envelope.rb} +5 -5
  68. data/lib/wefunder_generated/models/{attribution_campaign_summary_list_envelope.rb → syndicate_deal_created_envelope_meta.rb} +11 -12
  69. data/lib/wefunder_generated/models/{attribution_user.rb → syndicate_deal_created_envelope_meta_target_company.rb} +5 -14
  70. data/lib/wefunder_generated/models/{marketing_partner_envelope.rb → syndicate_deal_readiness_envelope.rb} +4 -4
  71. data/lib/wefunder_generated/models/syndicate_deal_readiness_envelope_data.rb +267 -0
  72. data/lib/wefunder_generated/models/{attribution_partner.rb → syndicate_deal_readiness_envelope_data_attributes.rb} +27 -33
  73. data/lib/wefunder_generated/models/{webhook_delivery.rb → syndicate_deal_readiness_item.rb} +55 -61
  74. data/lib/wefunder_generated/models/syndicate_statistics_attributes.rb +2 -2
  75. data/lib/wefunder_generated/models/test_webhook_endpoint_request.rb +2 -2
  76. data/lib/wefunder_generated/models/{webhook_test_result_envelope.rb → update_referral_code_request.rb} +47 -10
  77. data/lib/wefunder_generated/models/user_attributes.rb +1 -0
  78. data/lib/wefunder_generated/models/webhook_endpoint_attributes.rb +23 -1
  79. data/lib/wefunder_generated/models/webhook_endpoint_envelope.rb +1 -1
  80. data/lib/wefunder_generated/models/webhook_endpoint_test_result_envelope.rb +1 -1
  81. data/lib/wefunder_generated.rb +38 -63
  82. metadata +40 -65
  83. data/lib/wefunder_generated/api/attribution_api.rb +0 -182
  84. data/lib/wefunder_generated/api/attribution_partners_api.rb +0 -392
  85. data/lib/wefunder_generated/api/attribution_webhooks_api.rb +0 -504
  86. data/lib/wefunder_generated/models/anonymized_attribution_attribution.rb +0 -330
  87. data/lib/wefunder_generated/models/attributed_investment_list_envelope.rb +0 -226
  88. data/lib/wefunder_generated/models/attributed_investment_list_envelope_data_inner.rb +0 -105
  89. data/lib/wefunder_generated/models/attributed_investment_list_envelope_meta.rb +0 -295
  90. data/lib/wefunder_generated/models/attribution_stats.rb +0 -266
  91. data/lib/wefunder_generated/models/attribution_stats_by_campaign_inner.rb +0 -232
  92. data/lib/wefunder_generated/models/attribution_stats_by_source_inner.rb +0 -232
  93. data/lib/wefunder_generated/models/attribution_stats_quality_breakdown.rb +0 -236
  94. data/lib/wefunder_generated/models/attribution_stats_totals.rb +0 -245
  95. data/lib/wefunder_generated/models/create_webhook_subscription_request.rb +0 -263
  96. data/lib/wefunder_generated/models/full_attribution_attribution.rb +0 -326
  97. data/lib/wefunder_generated/models/partner_investment_list_envelope.rb +0 -225
  98. data/lib/wefunder_generated/models/partner_investor_attributes.rb +0 -264
  99. data/lib/wefunder_generated/models/partner_invite.rb +0 -360
  100. data/lib/wefunder_generated/models/partner_invite_envelope.rb +0 -214
  101. data/lib/wefunder_generated/models/partner_invite_list_envelope.rb +0 -216
  102. data/lib/wefunder_generated/models/register_as_partner_request.rb +0 -232
  103. data/lib/wefunder_generated/models/syndicate_deal_close_intent_envelope_meta.rb +0 -214
  104. data/lib/wefunder_generated/models/syndicate_deal_finalize_intent_envelope.rb +0 -224
  105. data/lib/wefunder_generated/models/webhook_subscription_envelope.rb +0 -214
  106. data/lib/wefunder_generated/models/webhook_subscription_list_envelope.rb +0 -225
  107. data/lib/wefunder_generated/models/webhook_subscription_list_envelope_meta.rb +0 -225
  108. data/lib/wefunder_generated/models/webhook_subscription_with_recent_deliveries_envelope.rb +0 -214
  109. data/lib/wefunder_generated/models/webhook_subscription_with_recent_deliveries_envelope_data.rb +0 -322
  110. data/lib/wefunder_generated/models/webhook_subscription_with_secret2_envelope_data.rb +0 -320
  111. data/lib/wefunder_generated/models/webhook_subscription_with_secret_envelope.rb +0 -214
  112. data/lib/wefunder_generated/models/webhook_subscription_with_secret_envelope_data.rb +0 -320
  113. data/lib/wefunder_generated/models/webhook_test_result.rb +0 -233
@@ -1,330 +0,0 @@
1
- =begin
2
- #Wefunder API v2
3
-
4
- #OAuth 2.0 API for accessing Wefunder data programmatically. ## Authentication This API uses OAuth 2.0 for authentication. To get started: 1. Create an OAuth application at `/oauth/applications` 2. Get your Client ID and Client Secret 3. Implement the OAuth 2.0 Authorization Code flow 4. Use the access token to make API requests ## Versioning The API is versioned by the dated `Wefunder-Version` request header (`YYYY-MM-DD`), never by the URL. Resolution is header → your application's pinned version → latest; every response carries `Wefunder-Version` (the version that handled it) and `Wefunder-Version-Latest`. An unknown value returns `400 invalid_request` naming the valid versions. Current: `2026-10-01`. ## Rate Limits - Standard API: 1,000 requests/hour per token - Admin API: 10,000 requests/hour per token ## Base URL All API requests should be made to: `https://api.wefunder.com` (no version in the path).
5
-
6
- The version of the OpenAPI document: 2.0
7
- Contact: api@wefunder.com
8
- Generated by: https://openapi-generator.tech
9
- Generator version: 7.10.0
10
-
11
- =end
12
-
13
- require 'date'
14
- require 'time'
15
-
16
- module WefunderGenerated
17
- # UTM attribution data
18
- class AnonymizedAttributionAttribution
19
- attr_accessor :utm_source
20
-
21
- attr_accessor :utm_campaign
22
-
23
- attr_accessor :utm_medium
24
-
25
- attr_accessor :utm_content
26
-
27
- # When the UTM link was clicked
28
- attr_accessor :clicked_at
29
-
30
- # Time from click to investment
31
- attr_accessor :time_to_invest_bucket
32
-
33
- # Attribution quality assessment
34
- attr_accessor :quality_score
35
-
36
- # Number of other UTM sources in the attribution window
37
- attr_accessor :competing_sources
38
-
39
- class EnumAttributeValidator
40
- attr_reader :datatype
41
- attr_reader :allowable_values
42
-
43
- def initialize(datatype, allowable_values)
44
- @allowable_values = allowable_values.map do |value|
45
- case datatype.to_s
46
- when /Integer/i
47
- value.to_i
48
- when /Float/i
49
- value.to_f
50
- else
51
- value
52
- end
53
- end
54
- end
55
-
56
- def valid?(value)
57
- !value || allowable_values.include?(value)
58
- end
59
- end
60
-
61
- # Attribute mapping from ruby-style variable name to JSON key.
62
- def self.attribute_map
63
- {
64
- :'utm_source' => :'utm_source',
65
- :'utm_campaign' => :'utm_campaign',
66
- :'utm_medium' => :'utm_medium',
67
- :'utm_content' => :'utm_content',
68
- :'clicked_at' => :'clicked_at',
69
- :'time_to_invest_bucket' => :'time_to_invest_bucket',
70
- :'quality_score' => :'quality_score',
71
- :'competing_sources' => :'competing_sources'
72
- }
73
- end
74
-
75
- # Returns all the JSON keys this model knows about
76
- def self.acceptable_attributes
77
- attribute_map.values
78
- end
79
-
80
- # Attribute type mapping.
81
- def self.openapi_types
82
- {
83
- :'utm_source' => :'String',
84
- :'utm_campaign' => :'String',
85
- :'utm_medium' => :'String',
86
- :'utm_content' => :'String',
87
- :'clicked_at' => :'Time',
88
- :'time_to_invest_bucket' => :'String',
89
- :'quality_score' => :'String',
90
- :'competing_sources' => :'Integer'
91
- }
92
- end
93
-
94
- # List of attributes with nullable: true
95
- def self.openapi_nullable
96
- Set.new([
97
- :'utm_medium',
98
- :'utm_content',
99
- ])
100
- end
101
-
102
- # Initializes the object
103
- # @param [Hash] attributes Model attributes in the form of hash
104
- def initialize(attributes = {})
105
- if (!attributes.is_a?(Hash))
106
- fail ArgumentError, "The input argument (attributes) must be a hash in `WefunderGenerated::AnonymizedAttributionAttribution` initialize method"
107
- end
108
-
109
- # check to see if the attribute exists and convert string to symbol for hash key
110
- attributes = attributes.each_with_object({}) { |(k, v), h|
111
- if (!self.class.attribute_map.key?(k.to_sym))
112
- fail ArgumentError, "`#{k}` is not a valid attribute in `WefunderGenerated::AnonymizedAttributionAttribution`. Please check the name to make sure it's valid. List of attributes: " + self.class.attribute_map.keys.inspect
113
- end
114
- h[k.to_sym] = v
115
- }
116
-
117
- if attributes.key?(:'utm_source')
118
- self.utm_source = attributes[:'utm_source']
119
- end
120
-
121
- if attributes.key?(:'utm_campaign')
122
- self.utm_campaign = attributes[:'utm_campaign']
123
- end
124
-
125
- if attributes.key?(:'utm_medium')
126
- self.utm_medium = attributes[:'utm_medium']
127
- end
128
-
129
- if attributes.key?(:'utm_content')
130
- self.utm_content = attributes[:'utm_content']
131
- end
132
-
133
- if attributes.key?(:'clicked_at')
134
- self.clicked_at = attributes[:'clicked_at']
135
- end
136
-
137
- if attributes.key?(:'time_to_invest_bucket')
138
- self.time_to_invest_bucket = attributes[:'time_to_invest_bucket']
139
- end
140
-
141
- if attributes.key?(:'quality_score')
142
- self.quality_score = attributes[:'quality_score']
143
- end
144
-
145
- if attributes.key?(:'competing_sources')
146
- self.competing_sources = attributes[:'competing_sources']
147
- end
148
- end
149
-
150
- # Show invalid properties with the reasons. Usually used together with valid?
151
- # @return Array for valid properties with the reasons
152
- def list_invalid_properties
153
- warn '[DEPRECATED] the `list_invalid_properties` method is obsolete'
154
- invalid_properties = Array.new
155
- invalid_properties
156
- end
157
-
158
- # Check to see if the all the properties in the model are valid
159
- # @return true if the model is valid
160
- def valid?
161
- warn '[DEPRECATED] the `valid?` method is obsolete'
162
- time_to_invest_bucket_validator = EnumAttributeValidator.new('String', ["direct", "assisted", "delayed"])
163
- return false unless time_to_invest_bucket_validator.valid?(@time_to_invest_bucket)
164
- quality_score_validator = EnumAttributeValidator.new('String', ["high", "medium", "low", "suspicious"])
165
- return false unless quality_score_validator.valid?(@quality_score)
166
- true
167
- end
168
-
169
- # Custom attribute writer method checking allowed values (enum).
170
- # @param [Object] time_to_invest_bucket Object to be assigned
171
- def time_to_invest_bucket=(time_to_invest_bucket)
172
- validator = EnumAttributeValidator.new('String', ["direct", "assisted", "delayed"])
173
- unless validator.valid?(time_to_invest_bucket)
174
- fail ArgumentError, "invalid value for \"time_to_invest_bucket\", must be one of #{validator.allowable_values}."
175
- end
176
- @time_to_invest_bucket = time_to_invest_bucket
177
- end
178
-
179
- # Custom attribute writer method checking allowed values (enum).
180
- # @param [Object] quality_score Object to be assigned
181
- def quality_score=(quality_score)
182
- validator = EnumAttributeValidator.new('String', ["high", "medium", "low", "suspicious"])
183
- unless validator.valid?(quality_score)
184
- fail ArgumentError, "invalid value for \"quality_score\", must be one of #{validator.allowable_values}."
185
- end
186
- @quality_score = quality_score
187
- end
188
-
189
- # Checks equality by comparing each attribute.
190
- # @param [Object] Object to be compared
191
- def ==(o)
192
- return true if self.equal?(o)
193
- self.class == o.class &&
194
- utm_source == o.utm_source &&
195
- utm_campaign == o.utm_campaign &&
196
- utm_medium == o.utm_medium &&
197
- utm_content == o.utm_content &&
198
- clicked_at == o.clicked_at &&
199
- time_to_invest_bucket == o.time_to_invest_bucket &&
200
- quality_score == o.quality_score &&
201
- competing_sources == o.competing_sources
202
- end
203
-
204
- # @see the `==` method
205
- # @param [Object] Object to be compared
206
- def eql?(o)
207
- self == o
208
- end
209
-
210
- # Calculates hash code according to all attributes.
211
- # @return [Integer] Hash code
212
- def hash
213
- [utm_source, utm_campaign, utm_medium, utm_content, clicked_at, time_to_invest_bucket, quality_score, competing_sources].hash
214
- end
215
-
216
- # Builds the object from hash
217
- # @param [Hash] attributes Model attributes in the form of hash
218
- # @return [Object] Returns the model itself
219
- def self.build_from_hash(attributes)
220
- return nil unless attributes.is_a?(Hash)
221
- attributes = attributes.transform_keys(&:to_sym)
222
- transformed_hash = {}
223
- openapi_types.each_pair do |key, type|
224
- if attributes.key?(attribute_map[key]) && attributes[attribute_map[key]].nil?
225
- transformed_hash["#{key}"] = nil
226
- elsif type =~ /\AArray<(.*)>/i
227
- # check to ensure the input is an array given that the attribute
228
- # is documented as an array but the input is not
229
- if attributes[attribute_map[key]].is_a?(Array)
230
- transformed_hash["#{key}"] = attributes[attribute_map[key]].map { |v| _deserialize($1, v) }
231
- end
232
- elsif !attributes[attribute_map[key]].nil?
233
- transformed_hash["#{key}"] = _deserialize(type, attributes[attribute_map[key]])
234
- end
235
- end
236
- new(transformed_hash)
237
- end
238
-
239
- # Deserializes the data based on type
240
- # @param string type Data type
241
- # @param string value Value to be deserialized
242
- # @return [Object] Deserialized data
243
- def self._deserialize(type, value)
244
- case type.to_sym
245
- when :Time
246
- Time.parse(value)
247
- when :Date
248
- Date.parse(value)
249
- when :String
250
- value.to_s
251
- when :Integer
252
- value.to_i
253
- when :Float
254
- value.to_f
255
- when :Boolean
256
- if value.to_s =~ /\A(true|t|yes|y|1)\z/i
257
- true
258
- else
259
- false
260
- end
261
- when :Object
262
- # generic object (usually a Hash), return directly
263
- value
264
- when /\AArray<(?<inner_type>.+)>\z/
265
- inner_type = Regexp.last_match[:inner_type]
266
- value.map { |v| _deserialize(inner_type, v) }
267
- when /\AHash<(?<k_type>.+?), (?<v_type>.+)>\z/
268
- k_type = Regexp.last_match[:k_type]
269
- v_type = Regexp.last_match[:v_type]
270
- {}.tap do |hash|
271
- value.each do |k, v|
272
- hash[_deserialize(k_type, k)] = _deserialize(v_type, v)
273
- end
274
- end
275
- else # model
276
- # models (e.g. Pet) or oneOf
277
- klass = WefunderGenerated.const_get(type)
278
- klass.respond_to?(:openapi_any_of) || klass.respond_to?(:openapi_one_of) ? klass.build(value) : klass.build_from_hash(value)
279
- end
280
- end
281
-
282
- # Returns the string representation of the object
283
- # @return [String] String presentation of the object
284
- def to_s
285
- to_hash.to_s
286
- end
287
-
288
- # to_body is an alias to to_hash (backward compatibility)
289
- # @return [Hash] Returns the object in the form of hash
290
- def to_body
291
- to_hash
292
- end
293
-
294
- # Returns the object in the form of hash
295
- # @return [Hash] Returns the object in the form of hash
296
- def to_hash
297
- hash = {}
298
- self.class.attribute_map.each_pair do |attr, param|
299
- value = self.send(attr)
300
- if value.nil?
301
- is_nullable = self.class.openapi_nullable.include?(attr)
302
- next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}"))
303
- end
304
-
305
- hash[param] = _to_hash(value)
306
- end
307
- hash
308
- end
309
-
310
- # Outputs non-array value in the form of hash
311
- # For object, use to_hash. Otherwise, just return the value
312
- # @param [Object] value Any valid value
313
- # @return [Hash] Returns the value in the form of hash
314
- def _to_hash(value)
315
- if value.is_a?(Array)
316
- value.compact.map { |v| _to_hash(v) }
317
- elsif value.is_a?(Hash)
318
- {}.tap do |hash|
319
- value.each { |k, v| hash[k] = _to_hash(v) }
320
- end
321
- elsif value.respond_to? :to_hash
322
- value.to_hash
323
- else
324
- value
325
- end
326
- end
327
-
328
- end
329
-
330
- end
@@ -1,226 +0,0 @@
1
- =begin
2
- #Wefunder API v2
3
-
4
- #OAuth 2.0 API for accessing Wefunder data programmatically. ## Authentication This API uses OAuth 2.0 for authentication. To get started: 1. Create an OAuth application at `/oauth/applications` 2. Get your Client ID and Client Secret 3. Implement the OAuth 2.0 Authorization Code flow 4. Use the access token to make API requests ## Versioning The API is versioned by the dated `Wefunder-Version` request header (`YYYY-MM-DD`), never by the URL. Resolution is header → your application's pinned version → latest; every response carries `Wefunder-Version` (the version that handled it) and `Wefunder-Version-Latest`. An unknown value returns `400 invalid_request` naming the valid versions. Current: `2026-10-01`. ## Rate Limits - Standard API: 1,000 requests/hour per token - Admin API: 10,000 requests/hour per token ## Base URL All API requests should be made to: `https://api.wefunder.com` (no version in the path).
5
-
6
- The version of the OpenAPI document: 2.0
7
- Contact: api@wefunder.com
8
- Generated by: https://openapi-generator.tech
9
- Generator version: 7.10.0
10
-
11
- =end
12
-
13
- require 'date'
14
- require 'time'
15
-
16
- module WefunderGenerated
17
- class AttributedInvestmentListEnvelope
18
- # Returns AnonymizedAttribution or FullAttribution objects depending on detail_level and user permissions.
19
- attr_accessor :data
20
-
21
- attr_accessor :meta
22
-
23
- # Attribute mapping from ruby-style variable name to JSON key.
24
- def self.attribute_map
25
- {
26
- :'data' => :'data',
27
- :'meta' => :'meta'
28
- }
29
- end
30
-
31
- # Returns all the JSON keys this model knows about
32
- def self.acceptable_attributes
33
- attribute_map.values
34
- end
35
-
36
- # Attribute type mapping.
37
- def self.openapi_types
38
- {
39
- :'data' => :'Array<AttributedInvestmentListEnvelopeDataInner>',
40
- :'meta' => :'AttributedInvestmentListEnvelopeMeta'
41
- }
42
- end
43
-
44
- # List of attributes with nullable: true
45
- def self.openapi_nullable
46
- Set.new([
47
- ])
48
- end
49
-
50
- # Initializes the object
51
- # @param [Hash] attributes Model attributes in the form of hash
52
- def initialize(attributes = {})
53
- if (!attributes.is_a?(Hash))
54
- fail ArgumentError, "The input argument (attributes) must be a hash in `WefunderGenerated::AttributedInvestmentListEnvelope` initialize method"
55
- end
56
-
57
- # check to see if the attribute exists and convert string to symbol for hash key
58
- attributes = attributes.each_with_object({}) { |(k, v), h|
59
- if (!self.class.attribute_map.key?(k.to_sym))
60
- fail ArgumentError, "`#{k}` is not a valid attribute in `WefunderGenerated::AttributedInvestmentListEnvelope`. Please check the name to make sure it's valid. List of attributes: " + self.class.attribute_map.keys.inspect
61
- end
62
- h[k.to_sym] = v
63
- }
64
-
65
- if attributes.key?(:'data')
66
- if (value = attributes[:'data']).is_a?(Array)
67
- self.data = value
68
- end
69
- end
70
-
71
- if attributes.key?(:'meta')
72
- self.meta = attributes[:'meta']
73
- end
74
- end
75
-
76
- # Show invalid properties with the reasons. Usually used together with valid?
77
- # @return Array for valid properties with the reasons
78
- def list_invalid_properties
79
- warn '[DEPRECATED] the `list_invalid_properties` method is obsolete'
80
- invalid_properties = Array.new
81
- invalid_properties
82
- end
83
-
84
- # Check to see if the all the properties in the model are valid
85
- # @return true if the model is valid
86
- def valid?
87
- warn '[DEPRECATED] the `valid?` method is obsolete'
88
- true
89
- end
90
-
91
- # Checks equality by comparing each attribute.
92
- # @param [Object] Object to be compared
93
- def ==(o)
94
- return true if self.equal?(o)
95
- self.class == o.class &&
96
- data == o.data &&
97
- meta == o.meta
98
- end
99
-
100
- # @see the `==` method
101
- # @param [Object] Object to be compared
102
- def eql?(o)
103
- self == o
104
- end
105
-
106
- # Calculates hash code according to all attributes.
107
- # @return [Integer] Hash code
108
- def hash
109
- [data, meta].hash
110
- end
111
-
112
- # Builds the object from hash
113
- # @param [Hash] attributes Model attributes in the form of hash
114
- # @return [Object] Returns the model itself
115
- def self.build_from_hash(attributes)
116
- return nil unless attributes.is_a?(Hash)
117
- attributes = attributes.transform_keys(&:to_sym)
118
- transformed_hash = {}
119
- openapi_types.each_pair do |key, type|
120
- if attributes.key?(attribute_map[key]) && attributes[attribute_map[key]].nil?
121
- transformed_hash["#{key}"] = nil
122
- elsif type =~ /\AArray<(.*)>/i
123
- # check to ensure the input is an array given that the attribute
124
- # is documented as an array but the input is not
125
- if attributes[attribute_map[key]].is_a?(Array)
126
- transformed_hash["#{key}"] = attributes[attribute_map[key]].map { |v| _deserialize($1, v) }
127
- end
128
- elsif !attributes[attribute_map[key]].nil?
129
- transformed_hash["#{key}"] = _deserialize(type, attributes[attribute_map[key]])
130
- end
131
- end
132
- new(transformed_hash)
133
- end
134
-
135
- # Deserializes the data based on type
136
- # @param string type Data type
137
- # @param string value Value to be deserialized
138
- # @return [Object] Deserialized data
139
- def self._deserialize(type, value)
140
- case type.to_sym
141
- when :Time
142
- Time.parse(value)
143
- when :Date
144
- Date.parse(value)
145
- when :String
146
- value.to_s
147
- when :Integer
148
- value.to_i
149
- when :Float
150
- value.to_f
151
- when :Boolean
152
- if value.to_s =~ /\A(true|t|yes|y|1)\z/i
153
- true
154
- else
155
- false
156
- end
157
- when :Object
158
- # generic object (usually a Hash), return directly
159
- value
160
- when /\AArray<(?<inner_type>.+)>\z/
161
- inner_type = Regexp.last_match[:inner_type]
162
- value.map { |v| _deserialize(inner_type, v) }
163
- when /\AHash<(?<k_type>.+?), (?<v_type>.+)>\z/
164
- k_type = Regexp.last_match[:k_type]
165
- v_type = Regexp.last_match[:v_type]
166
- {}.tap do |hash|
167
- value.each do |k, v|
168
- hash[_deserialize(k_type, k)] = _deserialize(v_type, v)
169
- end
170
- end
171
- else # model
172
- # models (e.g. Pet) or oneOf
173
- klass = WefunderGenerated.const_get(type)
174
- klass.respond_to?(:openapi_any_of) || klass.respond_to?(:openapi_one_of) ? klass.build(value) : klass.build_from_hash(value)
175
- end
176
- end
177
-
178
- # Returns the string representation of the object
179
- # @return [String] String presentation of the object
180
- def to_s
181
- to_hash.to_s
182
- end
183
-
184
- # to_body is an alias to to_hash (backward compatibility)
185
- # @return [Hash] Returns the object in the form of hash
186
- def to_body
187
- to_hash
188
- end
189
-
190
- # Returns the object in the form of hash
191
- # @return [Hash] Returns the object in the form of hash
192
- def to_hash
193
- hash = {}
194
- self.class.attribute_map.each_pair do |attr, param|
195
- value = self.send(attr)
196
- if value.nil?
197
- is_nullable = self.class.openapi_nullable.include?(attr)
198
- next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}"))
199
- end
200
-
201
- hash[param] = _to_hash(value)
202
- end
203
- hash
204
- end
205
-
206
- # Outputs non-array value in the form of hash
207
- # For object, use to_hash. Otherwise, just return the value
208
- # @param [Object] value Any valid value
209
- # @return [Hash] Returns the value in the form of hash
210
- def _to_hash(value)
211
- if value.is_a?(Array)
212
- value.compact.map { |v| _to_hash(v) }
213
- elsif value.is_a?(Hash)
214
- {}.tap do |hash|
215
- value.each { |k, v| hash[k] = _to_hash(v) }
216
- end
217
- elsif value.respond_to? :to_hash
218
- value.to_hash
219
- else
220
- value
221
- end
222
- end
223
-
224
- end
225
-
226
- end
@@ -1,105 +0,0 @@
1
- =begin
2
- #Wefunder API v2
3
-
4
- #OAuth 2.0 API for accessing Wefunder data programmatically. ## Authentication This API uses OAuth 2.0 for authentication. To get started: 1. Create an OAuth application at `/oauth/applications` 2. Get your Client ID and Client Secret 3. Implement the OAuth 2.0 Authorization Code flow 4. Use the access token to make API requests ## Versioning The API is versioned by the dated `Wefunder-Version` request header (`YYYY-MM-DD`), never by the URL. Resolution is header → your application's pinned version → latest; every response carries `Wefunder-Version` (the version that handled it) and `Wefunder-Version-Latest`. An unknown value returns `400 invalid_request` naming the valid versions. Current: `2026-10-01`. ## Rate Limits - Standard API: 1,000 requests/hour per token - Admin API: 10,000 requests/hour per token ## Base URL All API requests should be made to: `https://api.wefunder.com` (no version in the path).
5
-
6
- The version of the OpenAPI document: 2.0
7
- Contact: api@wefunder.com
8
- Generated by: https://openapi-generator.tech
9
- Generator version: 7.10.0
10
-
11
- =end
12
-
13
- require 'date'
14
- require 'time'
15
-
16
- module WefunderGenerated
17
- module AttributedInvestmentListEnvelopeDataInner
18
- class << self
19
- # List of class defined in oneOf (OpenAPI v3)
20
- def openapi_one_of
21
- [
22
- :'AnonymizedAttribution',
23
- :'FullAttribution'
24
- ]
25
- end
26
-
27
- # Builds the object
28
- # @param [Mixed] Data to be matched against the list of oneOf items
29
- # @return [Object] Returns the model or the data itself
30
- def build(data)
31
- # Go through the list of oneOf items and attempt to identify the appropriate one.
32
- # Note:
33
- # - We do not attempt to check whether exactly one item matches.
34
- # - No advanced validation of types in some cases (e.g. "x: { type: string }" will happily match { x: 123 })
35
- # due to the way the deserialization is made in the base_object template (it just casts without verifying).
36
- # - TODO: scalar values are de facto behaving as if they were nullable.
37
- # - TODO: logging when debugging is set.
38
- openapi_one_of.each do |klass|
39
- begin
40
- next if klass == :AnyType # "nullable: true"
41
- typed_data = find_and_cast_into_type(klass, data)
42
- return typed_data if typed_data
43
- rescue # rescue all errors so we keep iterating even if the current item lookup raises
44
- end
45
- end
46
-
47
- openapi_one_of.include?(:AnyType) ? data : nil
48
- end
49
-
50
- private
51
-
52
- SchemaMismatchError = Class.new(StandardError)
53
-
54
- # Note: 'File' is missing here because in the regular case we get the data _after_ a call to JSON.parse.
55
- def find_and_cast_into_type(klass, data)
56
- return if data.nil?
57
-
58
- case klass.to_s
59
- when 'Boolean'
60
- return data if data.instance_of?(TrueClass) || data.instance_of?(FalseClass)
61
- when 'Float'
62
- return data if data.instance_of?(Float)
63
- when 'Integer'
64
- return data if data.instance_of?(Integer)
65
- when 'Time'
66
- return Time.parse(data)
67
- when 'Date'
68
- return Date.parse(data)
69
- when 'String'
70
- return data if data.instance_of?(String)
71
- when 'Object' # "type: object"
72
- return data if data.instance_of?(Hash)
73
- when /\AArray<(?<sub_type>.+)>\z/ # "type: array"
74
- if data.instance_of?(Array)
75
- sub_type = Regexp.last_match[:sub_type]
76
- return data.map { |item| find_and_cast_into_type(sub_type, item) }
77
- end
78
- when /\AHash<String, (?<sub_type>.+)>\z/ # "type: object" with "additionalProperties: { ... }"
79
- if data.instance_of?(Hash) && data.keys.all? { |k| k.instance_of?(Symbol) || k.instance_of?(String) }
80
- sub_type = Regexp.last_match[:sub_type]
81
- return data.each_with_object({}) { |(k, v), hsh| hsh[k] = find_and_cast_into_type(sub_type, v) }
82
- end
83
- else # model
84
- const = WefunderGenerated.const_get(klass)
85
- if const
86
- if const.respond_to?(:openapi_one_of) # nested oneOf model
87
- model = const.build(data)
88
- return model if model
89
- else
90
- # raise if data contains keys that are not known to the model
91
- raise if const.respond_to?(:acceptable_attributes) && !(data.keys - const.acceptable_attributes).empty?
92
- model = const.build_from_hash(data)
93
- return model if model
94
- end
95
- end
96
- end
97
-
98
- raise # if no match by now, raise
99
- rescue
100
- raise SchemaMismatchError, "#{data} doesn't match the #{klass} type"
101
- end
102
- end
103
- end
104
-
105
- end