repull 0.2.0 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/repull/api/ai_api.rb +1 -1
- data/lib/repull/api/airbnb_api.rb +271 -16
- data/lib/repull/api/atlas_api.rb +1 -1
- data/lib/repull/api/availability_api.rb +1 -1
- data/lib/repull/api/billing_api.rb +1 -1
- data/lib/repull/api/booking_com_api.rb +133 -1
- data/lib/repull/api/connect_api.rb +3 -3
- data/lib/repull/api/conversations_api.rb +27 -5
- data/lib/repull/api/guests_api.rb +14 -3
- data/lib/repull/api/kv_api.rb +361 -0
- data/lib/repull/api/listings_api.rb +26 -9
- data/lib/repull/api/markets_api.rb +14 -3
- data/lib/repull/api/plumguide_api.rb +1 -1
- data/lib/repull/api/pricing_api.rb +14 -3
- data/lib/repull/api/properties_api.rb +32 -8
- data/lib/repull/api/reservations_api.rb +34 -5
- data/lib/repull/api/reviews_api.rb +14 -3
- data/lib/repull/api/schema_api.rb +1 -1
- data/lib/repull/api/studio_api.rb +1094 -0
- data/lib/repull/api/system_api.rb +1 -1
- data/lib/repull/api/vrbo_api.rb +31 -3
- data/lib/repull/api/webhooks_api.rb +16 -5
- data/lib/repull/api_client.rb +1 -1
- data/lib/repull/api_error.rb +1 -1
- data/lib/repull/api_model_base.rb +1 -1
- data/lib/repull/configuration.rb +1 -1
- data/lib/repull/models/account_created_event.rb +217 -0
- data/lib/repull/models/account_created_payload.rb +185 -0
- data/lib/repull/models/account_disconnected_event.rb +217 -0
- data/lib/repull/models/account_disconnected_payload.rb +196 -0
- data/lib/repull/models/ai_operation.rb +1 -1
- data/lib/repull/models/ai_operation_completed_event.rb +217 -0
- data/lib/repull/models/ai_operation_completed_payload.rb +197 -0
- data/lib/repull/models/ai_operation_failed_event.rb +217 -0
- data/lib/repull/models/ai_operation_failed_payload.rb +175 -0
- data/lib/repull/models/ai_operation_failed_payload_error.rb +156 -0
- data/lib/repull/models/airbnb_connection.rb +242 -0
- data/lib/repull/models/airbnb_connection_accessibility_amenities_inner.rb +167 -0
- data/lib/repull/models/airbnb_connection_amenities_inner.rb +168 -0
- data/lib/repull/models/airbnb_connection_host.rb +244 -0
- data/lib/repull/models/airbnb_connection_response.rb +164 -0
- data/lib/repull/models/airbnb_connection_summary.rb +231 -0
- data/lib/repull/models/airbnb_data_freshness.rb +201 -0
- data/lib/repull/models/airbnb_listing.rb +25 -74
- data/lib/repull/models/airbnb_listing_list_response.rb +65 -5
- data/lib/repull/models/airbnb_reservation.rb +1 -1
- data/lib/repull/models/airbnb_reservation_list_response.rb +2 -1
- data/lib/repull/models/airbnb_review.rb +1 -1
- data/lib/repull/models/airbnb_review_list_response.rb +1 -1
- data/lib/repull/models/airbnb_thread.rb +1 -1
- data/lib/repull/models/airbnb_thread_list_response.rb +1 -1
- data/lib/repull/models/booking_connect_listing_option.rb +1 -1
- data/lib/repull/models/booking_connect_room.rb +1 -1
- data/lib/repull/models/booking_connect_rooms_response.rb +1 -1
- data/lib/repull/models/booking_conversation.rb +1 -1
- data/lib/repull/models/booking_conversation_list_response.rb +1 -1
- data/lib/repull/models/booking_pricing_rate_update.rb +1 -1
- data/lib/repull/models/booking_pricing_rate_update_date_range.rb +1 -1
- data/lib/repull/models/booking_pricing_rate_update_restrictions.rb +1 -1
- data/lib/repull/models/booking_pricing_response.rb +1 -1
- data/lib/repull/models/booking_pricing_update_request.rb +1 -1
- data/lib/repull/models/booking_pricing_update_response.rb +1 -1
- data/lib/repull/models/booking_property.rb +1 -1
- data/lib/repull/models/booking_property_list_response.rb +1 -1
- data/lib/repull/models/booking_room_mapping.rb +1 -1
- data/lib/repull/models/booking_verify_hotel_request.rb +1 -1
- data/lib/repull/models/booking_verify_hotel_response.rb +1 -1
- data/lib/repull/models/bulk_pricing_failure.rb +1 -1
- data/lib/repull/models/bulk_pricing_item.rb +1 -1
- data/lib/repull/models/bulk_pricing_request.rb +1 -1
- data/lib/repull/models/bulk_pricing_response.rb +1 -1
- data/lib/repull/models/calendar_day.rb +1 -1
- data/lib/repull/models/calendar_response.rb +1 -1
- data/lib/repull/models/calendar_updated_event.rb +217 -0
- data/lib/repull/models/calendar_updated_payload.rb +184 -0
- data/lib/repull/models/calendar_updated_payload_range.rb +156 -0
- data/lib/repull/models/clear_kv200_response.rb +147 -0
- data/lib/repull/models/connect_host.rb +1 -1
- data/lib/repull/models/connect_provider.rb +1 -1
- data/lib/repull/models/connect_provider_list_response.rb +1 -1
- data/lib/repull/models/connect_session.rb +1 -1
- data/lib/repull/models/connect_status.rb +1 -1
- data/lib/repull/models/connection.rb +1 -1
- data/lib/repull/models/connection_list_response.rb +1 -1
- data/lib/repull/models/conversation.rb +1 -1
- data/lib/repull/models/conversation_detail.rb +1 -1
- data/lib/repull/models/conversation_guest.rb +1 -1
- data/lib/repull/models/conversation_guest_contact.rb +1 -1
- data/lib/repull/models/conversation_host.rb +1 -1
- data/lib/repull/models/conversation_list_response.rb +1 -1
- data/lib/repull/models/conversation_message_attachment.rb +1 -1
- data/lib/repull/models/create_ai_operation200_response.rb +1 -1
- data/lib/repull/models/create_billing_checkout_request.rb +1 -1
- data/lib/repull/models/create_connect_session_request.rb +1 -1
- data/lib/repull/models/create_connection_request.rb +1 -1
- data/lib/repull/models/create_reservation_request.rb +1 -1
- data/lib/repull/models/create_studio_deployment201_response.rb +147 -0
- data/lib/repull/models/create_studio_deployment201_response_data.rb +199 -0
- data/lib/repull/models/create_studio_deployment_request.rb +165 -0
- data/lib/repull/models/create_studio_project201_response.rb +147 -0
- data/lib/repull/models/create_studio_project201_response_data.rb +199 -0
- data/lib/repull/models/create_studio_project_generation201_response.rb +147 -0
- data/lib/repull/models/create_studio_project_generation201_response_data.rb +165 -0
- data/lib/repull/models/create_studio_project_generation_request.rb +165 -0
- data/lib/repull/models/create_studio_project_request.rb +203 -0
- data/lib/repull/models/create_webhook_request.rb +2 -2
- data/lib/repull/models/custom_schema.rb +1 -1
- data/lib/repull/models/custom_schema_create.rb +1 -1
- data/lib/repull/models/custom_schema_create_response.rb +1 -1
- data/lib/repull/models/custom_schema_delete_response.rb +1 -1
- data/lib/repull/models/custom_schema_list_response.rb +1 -1
- data/lib/repull/models/custom_schema_summary.rb +1 -1
- data/lib/repull/models/custom_schema_update.rb +1 -1
- data/lib/repull/models/delete_kv200_response.rb +147 -0
- data/lib/repull/models/delete_studio_deployment200_response.rb +147 -0
- data/lib/repull/models/delete_studio_deployment200_response_data.rb +156 -0
- data/lib/repull/models/delete_studio_project200_response.rb +147 -0
- data/lib/repull/models/delete_studio_project200_response_data.rb +156 -0
- data/lib/repull/models/delete_studio_project_file200_response.rb +147 -0
- data/lib/repull/models/delete_studio_project_file200_response_data.rb +156 -0
- data/lib/repull/models/error.rb +1 -1
- data/lib/repull/models/error_error.rb +1 -1
- data/lib/repull/models/error_error_support.rb +1 -1
- data/lib/repull/models/generate_studio_completion200_response.rb +147 -0
- data/lib/repull/models/generate_studio_completion200_response_data.rb +224 -0
- data/lib/repull/models/generate_studio_completion_request.rb +305 -0
- data/lib/repull/models/generate_studio_completion_request_project_id.rb +105 -0
- data/lib/repull/models/get_health200_response.rb +1 -1
- data/lib/repull/models/get_studio_deployment200_response.rb +147 -0
- data/lib/repull/models/get_studio_project200_response.rb +147 -0
- data/lib/repull/models/guest.rb +1 -1
- data/lib/repull/models/guest_contact.rb +1 -1
- data/lib/repull/models/guest_flag.rb +1 -1
- data/lib/repull/models/guest_list_response.rb +1 -1
- data/lib/repull/models/guest_note.rb +1 -1
- data/lib/repull/models/guest_profile.rb +1 -1
- data/lib/repull/models/guest_reservations_summary.rb +1 -1
- data/lib/repull/models/list_kv200_response.rb +158 -0
- data/lib/repull/models/list_kv200_response_data_inner.rb +176 -0
- data/lib/repull/models/list_kv200_response_pagination.rb +156 -0
- data/lib/repull/models/list_studio_deployments200_response.rb +158 -0
- data/lib/repull/models/list_studio_project_files200_response.rb +149 -0
- data/lib/repull/models/list_studio_projects200_response.rb +149 -0
- data/lib/repull/models/listing.rb +36 -2
- data/lib/repull/models/listing_address.rb +1 -1
- data/lib/repull/models/listing_amenity.rb +215 -0
- data/lib/repull/models/listing_channel.rb +1 -1
- data/lib/repull/models/listing_comp.rb +1 -1
- data/lib/repull/models/listing_comp_nightly.rb +1 -1
- data/lib/repull/models/listing_comp_ratings.rb +1 -1
- data/lib/repull/models/listing_comps_response.rb +1 -1
- data/lib/repull/models/listing_content.rb +54 -13
- data/lib/repull/models/listing_create_request.rb +1 -1
- data/lib/repull/models/listing_create_response.rb +1 -1
- data/lib/repull/models/listing_created_event.rb +217 -0
- data/lib/repull/models/listing_created_payload.rb +202 -0
- data/lib/repull/models/listing_created_payload_address.rb +165 -0
- data/lib/repull/models/listing_deleted_event.rb +217 -0
- data/lib/repull/models/listing_deleted_payload.rb +167 -0
- data/lib/repull/models/listing_details.rb +374 -0
- data/lib/repull/models/listing_generate_content_request.rb +2 -2
- data/lib/repull/models/listing_generate_content_response.rb +1 -1
- data/lib/repull/models/listing_list_response.rb +1 -1
- data/lib/repull/models/listing_pricing_apply_request.rb +1 -1
- data/lib/repull/models/listing_pricing_apply_response.rb +1 -1
- data/lib/repull/models/listing_pricing_history_entry.rb +1 -1
- data/lib/repull/models/listing_pricing_history_response.rb +1 -1
- data/lib/repull/models/listing_pricing_recommendation.rb +1 -1
- data/lib/repull/models/listing_pricing_response.rb +1 -1
- data/lib/repull/models/listing_pricing_response_comp_summary.rb +1 -1
- data/lib/repull/models/listing_pricing_response_date_range.rb +1 -1
- data/lib/repull/models/listing_pricing_response_listing.rb +1 -1
- data/lib/repull/models/listing_pricing_strategy.rb +1 -1
- data/lib/repull/models/listing_pricing_strategy_input.rb +1 -1
- data/lib/repull/models/listing_publish_airbnb_request.rb +1 -1
- data/lib/repull/models/listing_publish_response.rb +1 -1
- data/lib/repull/models/listing_publish_status_channel.rb +1 -1
- data/lib/repull/models/listing_publish_status_connection.rb +180 -0
- data/lib/repull/models/listing_publish_status_response.rb +18 -5
- data/lib/repull/models/listing_quality_tier.rb +1 -1
- data/lib/repull/models/listing_segment.rb +1 -1
- data/lib/repull/models/listing_segment_recommendation.rb +1 -1
- data/lib/repull/models/listing_segments_response.rb +1 -1
- data/lib/repull/models/listing_segments_response_scope.rb +1 -1
- data/lib/repull/models/listing_updated_event.rb +217 -0
- data/lib/repull/models/listing_updated_payload.rb +169 -0
- data/lib/repull/models/map_connect_booking_rooms_request.rb +1 -1
- data/lib/repull/models/map_connect_booking_rooms_response.rb +1 -1
- data/lib/repull/models/market_browse_category.rb +1 -1
- data/lib/repull/models/market_browse_entry.rb +1 -1
- data/lib/repull/models/market_browse_featured.rb +1 -1
- data/lib/repull/models/market_browse_response.rb +1 -1
- data/lib/repull/models/market_calendar_day.rb +1 -1
- data/lib/repull/models/market_calendar_day_events_inner.rb +1 -1
- data/lib/repull/models/market_calendar_response.rb +1 -1
- data/lib/repull/models/market_detail_response.rb +1 -1
- data/lib/repull/models/market_detail_response_price_distribution_inner.rb +1 -1
- data/lib/repull/models/market_detail_response_property_type_mix_inner.rb +1 -1
- data/lib/repull/models/market_detail_response_supply_trend_inner.rb +1 -1
- data/lib/repull/models/market_detail_response_top_comps.rb +1 -1
- data/lib/repull/models/market_event.rb +1 -1
- data/lib/repull/models/market_my_listing.rb +1 -1
- data/lib/repull/models/market_summary.rb +1 -1
- data/lib/repull/models/market_top_comp.rb +1 -1
- data/lib/repull/models/markets_overview_response.rb +2 -2
- data/lib/repull/models/markets_overview_response_browse.rb +1 -1
- data/lib/repull/models/markets_overview_response_subscriptions.rb +1 -1
- data/lib/repull/models/markets_overview_response_totals.rb +1 -1
- data/lib/repull/models/message.rb +1 -1
- data/lib/repull/models/message_list_response.rb +1 -1
- data/lib/repull/models/pagination.rb +1 -1
- data/lib/repull/models/payment_completed_event.rb +217 -0
- data/lib/repull/models/payment_completed_payload.rb +193 -0
- data/lib/repull/models/payment_refunded_event.rb +217 -0
- data/lib/repull/models/payment_refunded_payload.rb +193 -0
- data/lib/repull/models/plumguide_listing.rb +1 -1
- data/lib/repull/models/plumguide_listing_list_response.rb +1 -1
- data/lib/repull/models/property.rb +17 -5
- data/lib/repull/models/property_list_response.rb +1 -1
- data/lib/repull/models/reply_booking_review200_response.rb +147 -0
- data/lib/repull/models/reply_booking_review_request.rb +219 -0
- data/lib/repull/models/repull_ping_event.rb +217 -0
- data/lib/repull/models/repull_ping_payload.rb +148 -0
- data/lib/repull/models/reservation.rb +74 -89
- data/lib/repull/models/reservation_cancelled_event.rb +217 -0
- data/lib/repull/models/reservation_cancelled_payload.rb +196 -0
- data/lib/repull/models/reservation_created_event.rb +218 -0
- data/lib/repull/models/reservation_created_payload.rb +165 -0
- data/lib/repull/models/reservation_financials.rb +172 -0
- data/lib/repull/models/reservation_list_response.rb +1 -1
- data/lib/repull/models/reservation_message_received_event.rb +217 -0
- data/lib/repull/models/reservation_message_received_payload.rb +184 -0
- data/lib/repull/models/reservation_message_received_payload_from.rb +157 -0
- data/lib/repull/models/reservation_occupancy.rb +190 -0
- data/lib/repull/models/reservation_primary_guest.rb +202 -0
- data/lib/repull/models/reservation_updated_event.rb +217 -0
- data/lib/repull/models/reservation_updated_payload.rb +177 -0
- data/lib/repull/models/reservation_webhook_object.rb +355 -0
- data/lib/repull/models/respond_airbnb_review_request.rb +174 -0
- data/lib/repull/models/review.rb +1 -1
- data/lib/repull/models/review_category.rb +1 -1
- data/lib/repull/models/review_list_response.rb +1 -1
- data/lib/repull/models/review_response.rb +1 -1
- data/lib/repull/models/rotate_webhook_secret200_response.rb +1 -1
- data/lib/repull/models/select_connect_provider_request.rb +1 -1
- data/lib/repull/models/select_provider_response.rb +1 -1
- data/lib/repull/models/set_kv_request.rb +180 -0
- data/lib/repull/models/studio_deployment.rb +207 -0
- data/lib/repull/models/studio_error.rb +148 -0
- data/lib/repull/models/studio_error_error.rb +212 -0
- data/lib/repull/models/studio_file.rb +188 -0
- data/lib/repull/models/studio_generation.rb +215 -0
- data/lib/repull/models/studio_project.rb +241 -0
- data/lib/repull/models/test_webhook_request.rb +24 -2
- data/lib/repull/models/update_availability_request.rb +1 -1
- data/lib/repull/models/update_listing_pricing_strategy200_response.rb +1 -1
- data/lib/repull/models/update_reservation_request.rb +1 -1
- data/lib/repull/models/update_studio_project_request.rb +190 -0
- data/lib/repull/models/update_webhook_request.rb +2 -2
- data/lib/repull/models/upsert_studio_project_file200_response.rb +147 -0
- data/lib/repull/models/upsert_studio_project_file200_response_data.rb +147 -0
- data/lib/repull/models/upsert_studio_project_file_request.rb +165 -0
- data/lib/repull/models/vrbo_listing.rb +1 -1
- data/lib/repull/models/vrbo_listing_list_response.rb +1 -1
- data/lib/repull/models/vrbo_reservation.rb +1 -1
- data/lib/repull/models/vrbo_reservation_list_response.rb +1 -1
- data/lib/repull/models/webhook_delivery.rb +25 -2
- data/lib/repull/models/webhook_delivery_detail.rb +26 -3
- data/lib/repull/models/webhook_delivery_list_response.rb +1 -1
- data/lib/repull/models/webhook_event.rb +82 -0
- data/lib/repull/models/webhook_event_catalog.rb +18 -5
- data/lib/repull/models/webhook_event_catalog_domains_inner.rb +2 -2
- data/lib/repull/models/{webhook_event_catalog_domains_inner_events_inner.rb → webhook_event_catalog_entry.rb} +28 -5
- data/lib/repull/models/webhook_event_type.rb +53 -0
- data/lib/repull/models/webhook_list_response.rb +1 -1
- data/lib/repull/models/webhook_subscription.rb +2 -2
- data/lib/repull/version.rb +2 -2
- data/lib/repull.rb +97 -2
- data/openapi/v1.json +8717 -4724
- data/scripts/regen.sh +1 -1
- metadata +99 -4
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
=begin
|
|
2
2
|
#Repull API
|
|
3
3
|
|
|
4
|
-
#The unified API for vacation rental tech. Connect to 50+ PMS platforms and 4 OTA channels through one REST API. Built-in AI operations for guest communication, pricing, and listing optimization. ## Designed for AI agents Every error response on this API includes machine-parseable fields so an LLM (Claude in MCP, Cursor, Cline, GPT, etc.) can self-recover without escalating to a human: - `error.code` — stable string identifier (e.g. `invalid_params`, `rate_limit_exceeded`) - `error.message` — human-readable cause - `error.fix` — exact recovery steps (e.g. \"Pass `check_in_after` as ISO 8601: `?check_in_after=2026-01-15`\") - `error.docs_url` — link to the canonical write-up at `https://repull.dev/docs/errors/{code}` - `error.request_id` — id to correlate with server-side logs - `error.field` / `error.value_received` / `error.valid_values` / `error.did_you_mean` — when the error is parameter-specific - `error.retry_after` — seconds to wait before retrying (rate-limit + transient upstream) `Access-Control-Expose-Headers` lists `x-request-id` and the `X-RateLimit-*` family so browsers can read them on cross-origin responses. ## Quick Start 1. Get an API key at https://repull.dev/dashboard 2. Connect a PMS: `POST /v1/connect/{provider}` 3. List properties: `GET /v1/properties` 4. Get reservations: `GET /v1/reservations` ## Authentication All requests require a Bearer token: ``` Authorization: Bearer sk_test_YOUR_API_KEY ``` Sandbox keys start with `sk_test_`, production with `sk_live_`. ## Request Correlation (X-Request-ID) Every response carries an `X-Request-ID` header, e.g. `X-Request-ID: req_01HXY...`. Include this id in support tickets and bug reports — we can trace the full request lifecycle (auth, rate limit, handler, downstream calls, log row) from a single id. You may set the header on the inbound request to forward your own trace id; we will echo it back instead of generating a new one. Accepted format: `^[\\\\w.-]{1,128}$`. The id is also embedded in error envelopes as `request_id` so server-side log diffs work even when the response headers are stripped by an intermediate proxy. ## Rate Limits The public API enforces a per-API-key sliding-window rate limit on top of the per-tier monthly + daily-AI quotas. **Default policy:** 600 requests per 60 seconds, per API key. Sliding window — there is no fixed-minute boundary you can burst across. Every response includes: | Header | Meaning | |---|---| | `X-RateLimit-Limit` | Requests permitted in the current window. | | `X-RateLimit-Remaining` | Requests left in the current window after this call. | | `X-RateLimit-Reset` | Unix epoch (seconds) when the next slot opens. | | `X-RateLimit-Policy` | Machine-readable policy descriptor, e.g. `600;w=60`. | | `Retry-After` | Seconds to wait before retrying. **Only present on 429 responses.** | **On 429 (rate_limit_exceeded):** the response body matches the standard error envelope with `code: \"rate_limit_exceeded\"`, plus `limit`, `window_seconds`, `retry_after`, and `request_id` fields. SDKs MUST honor `Retry-After` and use exponential backoff with jitter on subsequent retries — never a tight loop. Recommended backoff: ``` sleep_ms = (Retry-After * 1000) + random(0..250) ``` Monthly + daily-AI tier quotas (`free`, `starter`, `
|
|
4
|
+
#The unified API for vacation rental tech. Connect to 50+ PMS platforms and 4 OTA channels through one REST API. Built-in AI operations for guest communication, pricing, and listing optimization. ## Designed for AI agents Every error response on this API includes machine-parseable fields so an LLM (Claude in MCP, Cursor, Cline, GPT, etc.) can self-recover without escalating to a human: - `error.code` — stable string identifier (e.g. `invalid_params`, `rate_limit_exceeded`) - `error.message` — human-readable cause - `error.fix` — exact recovery steps (e.g. \"Pass `check_in_after` as ISO 8601: `?check_in_after=2026-01-15`\") - `error.docs_url` — link to the canonical write-up at `https://repull.dev/docs/errors/{code}` - `error.request_id` — id to correlate with server-side logs - `error.field` / `error.value_received` / `error.valid_values` / `error.did_you_mean` — when the error is parameter-specific - `error.retry_after` — seconds to wait before retrying (rate-limit + transient upstream) `Access-Control-Expose-Headers` lists `x-request-id` and the `X-RateLimit-*` family so browsers can read them on cross-origin responses. ## Quick Start 1. Get an API key at https://repull.dev/dashboard 2. Connect a PMS: `POST /v1/connect/{provider}` 3. List properties: `GET /v1/properties` 4. Get reservations: `GET /v1/reservations` ## Authentication All requests require a Bearer token: ``` Authorization: Bearer sk_test_YOUR_API_KEY ``` Sandbox keys start with `sk_test_`, production with `sk_live_`. ## Request Correlation (X-Request-ID) Every response carries an `X-Request-ID` header, e.g. `X-Request-ID: req_01HXY...`. Include this id in support tickets and bug reports — we can trace the full request lifecycle (auth, rate limit, handler, downstream calls, log row) from a single id. You may set the header on the inbound request to forward your own trace id; we will echo it back instead of generating a new one. Accepted format: `^[\\\\w.-]{1,128}$`. The id is also embedded in error envelopes as `request_id` so server-side log diffs work even when the response headers are stripped by an intermediate proxy. ## Rate Limits The public API enforces a per-API-key sliding-window rate limit on top of the per-tier monthly + daily-AI quotas. **Default policy:** 600 requests per 60 seconds, per API key. Sliding window — there is no fixed-minute boundary you can burst across. Every response includes: | Header | Meaning | |---|---| | `X-RateLimit-Limit` | Requests permitted in the current window. | | `X-RateLimit-Remaining` | Requests left in the current window after this call. | | `X-RateLimit-Reset` | Unix epoch (seconds) when the next slot opens. | | `X-RateLimit-Policy` | Machine-readable policy descriptor, e.g. `600;w=60`. | | `Retry-After` | Seconds to wait before retrying. **Only present on 429 responses.** | **On 429 (rate_limit_exceeded):** the response body matches the standard error envelope with `code: \"rate_limit_exceeded\"`, plus `limit`, `window_seconds`, `retry_after`, and `request_id` fields. SDKs MUST honor `Retry-After` and use exponential backoff with jitter on subsequent retries — never a tight loop. Recommended backoff: ``` sleep_ms = (Retry-After * 1000) + random(0..250) ``` Monthly + daily-AI tier quotas (`free`, `starter`, `custom`) are enforced separately and also surface as 429s; they include `tier`, `scope`, and `resets_at` fields.
|
|
5
5
|
|
|
6
6
|
The version of the OpenAPI document: 1.0.0
|
|
7
7
|
Contact: ivan@vanio.ai
|
|
@@ -14,7 +14,7 @@ require 'date'
|
|
|
14
14
|
require 'time'
|
|
15
15
|
|
|
16
16
|
module Repull
|
|
17
|
-
# A booking/reservation from a connected PMS. Identical shape between list-row (`GET /v1/reservations`) and detail (`GET /v1/reservations/{id}`) — SDK consumers can use the same type for both.
|
|
17
|
+
# A booking/reservation from a connected PMS. Identical shape between list-row (`GET /v1/reservations`) and detail (`GET /v1/reservations/{id}`) — SDK consumers can use the same type for both. The canonical (post-2026-05) shape uses nested `primaryGuest`, `occupancy`, `financials` blocks. The legacy flat fields (`guestId`, `totalPrice`, `currency`, `guestDetails`) remain populated for back-compat and are marked `deprecated` here. New consumers should read from the nested blocks; existing consumers continue to work unchanged.
|
|
18
18
|
class Reservation < ApiModelBase
|
|
19
19
|
# Internal Repull reservation ID
|
|
20
20
|
attr_accessor :id
|
|
@@ -22,34 +22,50 @@ module Repull
|
|
|
22
22
|
# Internal Repull listing ID this reservation is on.
|
|
23
23
|
attr_accessor :listing_id
|
|
24
24
|
|
|
25
|
-
# Internal Repull guest ID.
|
|
25
|
+
# DEPRECATED — use `primaryGuest.id`. Internal Repull guest ID. Kept populated for back-compat.
|
|
26
26
|
attr_accessor :guest_id
|
|
27
27
|
|
|
28
28
|
attr_accessor :check_in
|
|
29
29
|
|
|
30
30
|
attr_accessor :check_out
|
|
31
31
|
|
|
32
|
+
# Lifecycle status. The API normalises a multi-decade internal taxonomy down to these four buckets, so the value you receive is always one of the enum constants. `completed` is derived from `checkOut < today`.
|
|
32
33
|
attr_accessor :status
|
|
33
34
|
|
|
34
|
-
# Booking source. Lowercase. May be null on legacy rows.
|
|
35
|
+
# Booking source / channel. Lowercase. May be null on legacy rows. Canonical name as of 2026-05; `platform` is kept as an alias.
|
|
36
|
+
attr_accessor :source
|
|
37
|
+
|
|
38
|
+
# DEPRECATED alias for `source`. Same value, kept for back-compat.
|
|
35
39
|
attr_accessor :platform
|
|
36
40
|
|
|
37
|
-
#
|
|
41
|
+
# Channel-side confirmation code (Airbnb HMxxx, Booking.com numeric, etc.).
|
|
42
|
+
attr_accessor :confirmation_code
|
|
43
|
+
|
|
44
|
+
# Inline guest summary. May be undefined for owner-blocks / pre-arrival rows.
|
|
45
|
+
attr_accessor :primary_guest
|
|
46
|
+
|
|
47
|
+
# Normalized guest counts. May be undefined when the source channel did not provide counts.
|
|
48
|
+
attr_accessor :occupancy
|
|
49
|
+
|
|
50
|
+
# Normalized money block. Always populated for paid reservations.
|
|
51
|
+
attr_accessor :financials
|
|
52
|
+
|
|
53
|
+
# DEPRECATED — use `financials.totalPrice` (a number). Decimal-as-string (precision 10, scale 2) kept for back-compat.
|
|
38
54
|
attr_accessor :total_price
|
|
39
55
|
|
|
40
|
-
# ISO 4217 currency code.
|
|
56
|
+
# DEPRECATED — use `financials.currency`. ISO 4217 currency code.
|
|
41
57
|
attr_accessor :currency
|
|
42
58
|
|
|
43
|
-
#
|
|
44
|
-
attr_accessor :confirmation_code
|
|
45
|
-
|
|
46
|
-
# Raw guest details from the source channel (firstName, lastName, email, phone, count, etc.). Shape varies by platform — use the dedicated guest endpoint for a normalized profile.
|
|
59
|
+
# DEPRECATED — use `occupancy` for normalized counts and `primaryGuest` for guest identity. Raw guest details from the source channel; shape varies by platform.
|
|
47
60
|
attr_accessor :guest_details
|
|
48
61
|
|
|
49
62
|
# When the reservation row was created in Repull (not the booking-on-channel timestamp).
|
|
50
63
|
attr_accessor :created_at
|
|
51
64
|
|
|
52
|
-
#
|
|
65
|
+
# When the booking was made on the source channel (when reported by the channel).
|
|
66
|
+
attr_accessor :booked_at
|
|
67
|
+
|
|
68
|
+
# Pre-resolved display name (`firstName lastName`) from the joined guest row. Undefined when no first name is available.
|
|
53
69
|
attr_accessor :guest_name
|
|
54
70
|
|
|
55
71
|
# Attribute mapping from ruby-style variable name to JSON key.
|
|
@@ -61,12 +77,17 @@ module Repull
|
|
|
61
77
|
:'check_in' => :'checkIn',
|
|
62
78
|
:'check_out' => :'checkOut',
|
|
63
79
|
:'status' => :'status',
|
|
80
|
+
:'source' => :'source',
|
|
64
81
|
:'platform' => :'platform',
|
|
82
|
+
:'confirmation_code' => :'confirmationCode',
|
|
83
|
+
:'primary_guest' => :'primaryGuest',
|
|
84
|
+
:'occupancy' => :'occupancy',
|
|
85
|
+
:'financials' => :'financials',
|
|
65
86
|
:'total_price' => :'totalPrice',
|
|
66
87
|
:'currency' => :'currency',
|
|
67
|
-
:'confirmation_code' => :'confirmationCode',
|
|
68
88
|
:'guest_details' => :'guestDetails',
|
|
69
89
|
:'created_at' => :'createdAt',
|
|
90
|
+
:'booked_at' => :'bookedAt',
|
|
70
91
|
:'guest_name' => :'guestName'
|
|
71
92
|
}
|
|
72
93
|
end
|
|
@@ -90,12 +111,17 @@ module Repull
|
|
|
90
111
|
:'check_in' => :'Date',
|
|
91
112
|
:'check_out' => :'Date',
|
|
92
113
|
:'status' => :'String',
|
|
114
|
+
:'source' => :'String',
|
|
93
115
|
:'platform' => :'String',
|
|
116
|
+
:'confirmation_code' => :'String',
|
|
117
|
+
:'primary_guest' => :'ReservationPrimaryGuest',
|
|
118
|
+
:'occupancy' => :'ReservationOccupancy',
|
|
119
|
+
:'financials' => :'ReservationFinancials',
|
|
94
120
|
:'total_price' => :'String',
|
|
95
121
|
:'currency' => :'String',
|
|
96
|
-
:'confirmation_code' => :'String',
|
|
97
122
|
:'guest_details' => :'Hash<String, Object>',
|
|
98
123
|
:'created_at' => :'Time',
|
|
124
|
+
:'booked_at' => :'Time',
|
|
99
125
|
:'guest_name' => :'String'
|
|
100
126
|
}
|
|
101
127
|
end
|
|
@@ -103,7 +129,9 @@ module Repull
|
|
|
103
129
|
# List of attributes with nullable: true
|
|
104
130
|
def self.openapi_nullable
|
|
105
131
|
Set.new([
|
|
132
|
+
:'source',
|
|
106
133
|
:'platform',
|
|
134
|
+
:'booked_at',
|
|
107
135
|
:'guest_name'
|
|
108
136
|
])
|
|
109
137
|
end
|
|
@@ -138,8 +166,6 @@ module Repull
|
|
|
138
166
|
|
|
139
167
|
if attributes.key?(:'guest_id')
|
|
140
168
|
self.guest_id = attributes[:'guest_id']
|
|
141
|
-
else
|
|
142
|
-
self.guest_id = nil
|
|
143
169
|
end
|
|
144
170
|
|
|
145
171
|
if attributes.key?(:'check_in')
|
|
@@ -160,34 +186,44 @@ module Repull
|
|
|
160
186
|
self.status = nil
|
|
161
187
|
end
|
|
162
188
|
|
|
189
|
+
if attributes.key?(:'source')
|
|
190
|
+
self.source = attributes[:'source']
|
|
191
|
+
end
|
|
192
|
+
|
|
163
193
|
if attributes.key?(:'platform')
|
|
164
194
|
self.platform = attributes[:'platform']
|
|
165
195
|
end
|
|
166
196
|
|
|
197
|
+
if attributes.key?(:'confirmation_code')
|
|
198
|
+
self.confirmation_code = attributes[:'confirmation_code']
|
|
199
|
+
else
|
|
200
|
+
self.confirmation_code = nil
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
if attributes.key?(:'primary_guest')
|
|
204
|
+
self.primary_guest = attributes[:'primary_guest']
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
if attributes.key?(:'occupancy')
|
|
208
|
+
self.occupancy = attributes[:'occupancy']
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
if attributes.key?(:'financials')
|
|
212
|
+
self.financials = attributes[:'financials']
|
|
213
|
+
end
|
|
214
|
+
|
|
167
215
|
if attributes.key?(:'total_price')
|
|
168
216
|
self.total_price = attributes[:'total_price']
|
|
169
|
-
else
|
|
170
|
-
self.total_price = nil
|
|
171
217
|
end
|
|
172
218
|
|
|
173
219
|
if attributes.key?(:'currency')
|
|
174
220
|
self.currency = attributes[:'currency']
|
|
175
|
-
else
|
|
176
|
-
self.currency = nil
|
|
177
|
-
end
|
|
178
|
-
|
|
179
|
-
if attributes.key?(:'confirmation_code')
|
|
180
|
-
self.confirmation_code = attributes[:'confirmation_code']
|
|
181
|
-
else
|
|
182
|
-
self.confirmation_code = nil
|
|
183
221
|
end
|
|
184
222
|
|
|
185
223
|
if attributes.key?(:'guest_details')
|
|
186
224
|
if (value = attributes[:'guest_details']).is_a?(Hash)
|
|
187
225
|
self.guest_details = value
|
|
188
226
|
end
|
|
189
|
-
else
|
|
190
|
-
self.guest_details = nil
|
|
191
227
|
end
|
|
192
228
|
|
|
193
229
|
if attributes.key?(:'created_at')
|
|
@@ -196,6 +232,10 @@ module Repull
|
|
|
196
232
|
self.created_at = nil
|
|
197
233
|
end
|
|
198
234
|
|
|
235
|
+
if attributes.key?(:'booked_at')
|
|
236
|
+
self.booked_at = attributes[:'booked_at']
|
|
237
|
+
end
|
|
238
|
+
|
|
199
239
|
if attributes.key?(:'guest_name')
|
|
200
240
|
self.guest_name = attributes[:'guest_name']
|
|
201
241
|
end
|
|
@@ -214,10 +254,6 @@ module Repull
|
|
|
214
254
|
invalid_properties.push('invalid value for "listing_id", listing_id cannot be nil.')
|
|
215
255
|
end
|
|
216
256
|
|
|
217
|
-
if @guest_id.nil?
|
|
218
|
-
invalid_properties.push('invalid value for "guest_id", guest_id cannot be nil.')
|
|
219
|
-
end
|
|
220
|
-
|
|
221
257
|
if @check_in.nil?
|
|
222
258
|
invalid_properties.push('invalid value for "check_in", check_in cannot be nil.')
|
|
223
259
|
end
|
|
@@ -230,22 +266,10 @@ module Repull
|
|
|
230
266
|
invalid_properties.push('invalid value for "status", status cannot be nil.')
|
|
231
267
|
end
|
|
232
268
|
|
|
233
|
-
if @total_price.nil?
|
|
234
|
-
invalid_properties.push('invalid value for "total_price", total_price cannot be nil.')
|
|
235
|
-
end
|
|
236
|
-
|
|
237
|
-
if @currency.nil?
|
|
238
|
-
invalid_properties.push('invalid value for "currency", currency cannot be nil.')
|
|
239
|
-
end
|
|
240
|
-
|
|
241
269
|
if @confirmation_code.nil?
|
|
242
270
|
invalid_properties.push('invalid value for "confirmation_code", confirmation_code cannot be nil.')
|
|
243
271
|
end
|
|
244
272
|
|
|
245
|
-
if @guest_details.nil?
|
|
246
|
-
invalid_properties.push('invalid value for "guest_details", guest_details cannot be nil.')
|
|
247
|
-
end
|
|
248
|
-
|
|
249
273
|
if @created_at.nil?
|
|
250
274
|
invalid_properties.push('invalid value for "created_at", created_at cannot be nil.')
|
|
251
275
|
end
|
|
@@ -259,14 +283,10 @@ module Repull
|
|
|
259
283
|
warn '[DEPRECATED] the `valid?` method is obsolete'
|
|
260
284
|
return false if @id.nil?
|
|
261
285
|
return false if @listing_id.nil?
|
|
262
|
-
return false if @guest_id.nil?
|
|
263
286
|
return false if @check_in.nil?
|
|
264
287
|
return false if @check_out.nil?
|
|
265
288
|
return false if @status.nil?
|
|
266
|
-
return false if @total_price.nil?
|
|
267
|
-
return false if @currency.nil?
|
|
268
289
|
return false if @confirmation_code.nil?
|
|
269
|
-
return false if @guest_details.nil?
|
|
270
290
|
return false if @created_at.nil?
|
|
271
291
|
true
|
|
272
292
|
end
|
|
@@ -291,16 +311,6 @@ module Repull
|
|
|
291
311
|
@listing_id = listing_id
|
|
292
312
|
end
|
|
293
313
|
|
|
294
|
-
# Custom attribute writer method with validation
|
|
295
|
-
# @param [Object] guest_id Value to be assigned
|
|
296
|
-
def guest_id=(guest_id)
|
|
297
|
-
if guest_id.nil?
|
|
298
|
-
fail ArgumentError, 'guest_id cannot be nil'
|
|
299
|
-
end
|
|
300
|
-
|
|
301
|
-
@guest_id = guest_id
|
|
302
|
-
end
|
|
303
|
-
|
|
304
314
|
# Custom attribute writer method with validation
|
|
305
315
|
# @param [Object] check_in Value to be assigned
|
|
306
316
|
def check_in=(check_in)
|
|
@@ -331,26 +341,6 @@ module Repull
|
|
|
331
341
|
@status = status
|
|
332
342
|
end
|
|
333
343
|
|
|
334
|
-
# Custom attribute writer method with validation
|
|
335
|
-
# @param [Object] total_price Value to be assigned
|
|
336
|
-
def total_price=(total_price)
|
|
337
|
-
if total_price.nil?
|
|
338
|
-
fail ArgumentError, 'total_price cannot be nil'
|
|
339
|
-
end
|
|
340
|
-
|
|
341
|
-
@total_price = total_price
|
|
342
|
-
end
|
|
343
|
-
|
|
344
|
-
# Custom attribute writer method with validation
|
|
345
|
-
# @param [Object] currency Value to be assigned
|
|
346
|
-
def currency=(currency)
|
|
347
|
-
if currency.nil?
|
|
348
|
-
fail ArgumentError, 'currency cannot be nil'
|
|
349
|
-
end
|
|
350
|
-
|
|
351
|
-
@currency = currency
|
|
352
|
-
end
|
|
353
|
-
|
|
354
344
|
# Custom attribute writer method with validation
|
|
355
345
|
# @param [Object] confirmation_code Value to be assigned
|
|
356
346
|
def confirmation_code=(confirmation_code)
|
|
@@ -361,16 +351,6 @@ module Repull
|
|
|
361
351
|
@confirmation_code = confirmation_code
|
|
362
352
|
end
|
|
363
353
|
|
|
364
|
-
# Custom attribute writer method with validation
|
|
365
|
-
# @param [Object] guest_details Value to be assigned
|
|
366
|
-
def guest_details=(guest_details)
|
|
367
|
-
if guest_details.nil?
|
|
368
|
-
fail ArgumentError, 'guest_details cannot be nil'
|
|
369
|
-
end
|
|
370
|
-
|
|
371
|
-
@guest_details = guest_details
|
|
372
|
-
end
|
|
373
|
-
|
|
374
354
|
# Custom attribute writer method with validation
|
|
375
355
|
# @param [Object] created_at Value to be assigned
|
|
376
356
|
def created_at=(created_at)
|
|
@@ -392,12 +372,17 @@ module Repull
|
|
|
392
372
|
check_in == o.check_in &&
|
|
393
373
|
check_out == o.check_out &&
|
|
394
374
|
status == o.status &&
|
|
375
|
+
source == o.source &&
|
|
395
376
|
platform == o.platform &&
|
|
377
|
+
confirmation_code == o.confirmation_code &&
|
|
378
|
+
primary_guest == o.primary_guest &&
|
|
379
|
+
occupancy == o.occupancy &&
|
|
380
|
+
financials == o.financials &&
|
|
396
381
|
total_price == o.total_price &&
|
|
397
382
|
currency == o.currency &&
|
|
398
|
-
confirmation_code == o.confirmation_code &&
|
|
399
383
|
guest_details == o.guest_details &&
|
|
400
384
|
created_at == o.created_at &&
|
|
385
|
+
booked_at == o.booked_at &&
|
|
401
386
|
guest_name == o.guest_name
|
|
402
387
|
end
|
|
403
388
|
|
|
@@ -410,7 +395,7 @@ module Repull
|
|
|
410
395
|
# Calculates hash code according to all attributes.
|
|
411
396
|
# @return [Integer] Hash code
|
|
412
397
|
def hash
|
|
413
|
-
[id, listing_id, guest_id, check_in, check_out, status, platform, total_price, currency,
|
|
398
|
+
[id, listing_id, guest_id, check_in, check_out, status, source, platform, confirmation_code, primary_guest, occupancy, financials, total_price, currency, guest_details, created_at, booked_at, guest_name].hash
|
|
414
399
|
end
|
|
415
400
|
|
|
416
401
|
# Builds the object from hash
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
=begin
|
|
2
|
+
#Repull API
|
|
3
|
+
|
|
4
|
+
#The unified API for vacation rental tech. Connect to 50+ PMS platforms and 4 OTA channels through one REST API. Built-in AI operations for guest communication, pricing, and listing optimization. ## Designed for AI agents Every error response on this API includes machine-parseable fields so an LLM (Claude in MCP, Cursor, Cline, GPT, etc.) can self-recover without escalating to a human: - `error.code` — stable string identifier (e.g. `invalid_params`, `rate_limit_exceeded`) - `error.message` — human-readable cause - `error.fix` — exact recovery steps (e.g. \"Pass `check_in_after` as ISO 8601: `?check_in_after=2026-01-15`\") - `error.docs_url` — link to the canonical write-up at `https://repull.dev/docs/errors/{code}` - `error.request_id` — id to correlate with server-side logs - `error.field` / `error.value_received` / `error.valid_values` / `error.did_you_mean` — when the error is parameter-specific - `error.retry_after` — seconds to wait before retrying (rate-limit + transient upstream) `Access-Control-Expose-Headers` lists `x-request-id` and the `X-RateLimit-*` family so browsers can read them on cross-origin responses. ## Quick Start 1. Get an API key at https://repull.dev/dashboard 2. Connect a PMS: `POST /v1/connect/{provider}` 3. List properties: `GET /v1/properties` 4. Get reservations: `GET /v1/reservations` ## Authentication All requests require a Bearer token: ``` Authorization: Bearer sk_test_YOUR_API_KEY ``` Sandbox keys start with `sk_test_`, production with `sk_live_`. ## Request Correlation (X-Request-ID) Every response carries an `X-Request-ID` header, e.g. `X-Request-ID: req_01HXY...`. Include this id in support tickets and bug reports — we can trace the full request lifecycle (auth, rate limit, handler, downstream calls, log row) from a single id. You may set the header on the inbound request to forward your own trace id; we will echo it back instead of generating a new one. Accepted format: `^[\\\\w.-]{1,128}$`. The id is also embedded in error envelopes as `request_id` so server-side log diffs work even when the response headers are stripped by an intermediate proxy. ## Rate Limits The public API enforces a per-API-key sliding-window rate limit on top of the per-tier monthly + daily-AI quotas. **Default policy:** 600 requests per 60 seconds, per API key. Sliding window — there is no fixed-minute boundary you can burst across. Every response includes: | Header | Meaning | |---|---| | `X-RateLimit-Limit` | Requests permitted in the current window. | | `X-RateLimit-Remaining` | Requests left in the current window after this call. | | `X-RateLimit-Reset` | Unix epoch (seconds) when the next slot opens. | | `X-RateLimit-Policy` | Machine-readable policy descriptor, e.g. `600;w=60`. | | `Retry-After` | Seconds to wait before retrying. **Only present on 429 responses.** | **On 429 (rate_limit_exceeded):** the response body matches the standard error envelope with `code: \"rate_limit_exceeded\"`, plus `limit`, `window_seconds`, `retry_after`, and `request_id` fields. SDKs MUST honor `Retry-After` and use exponential backoff with jitter on subsequent retries — never a tight loop. Recommended backoff: ``` sleep_ms = (Retry-After * 1000) + random(0..250) ``` Monthly + daily-AI tier quotas (`free`, `starter`, `custom`) are enforced separately and also surface as 429s; they include `tier`, `scope`, and `resets_at` fields.
|
|
5
|
+
|
|
6
|
+
The version of the OpenAPI document: 1.0.0
|
|
7
|
+
Contact: ivan@vanio.ai
|
|
8
|
+
Generated by: https://openapi-generator.tech
|
|
9
|
+
Generator version: 7.22.0
|
|
10
|
+
|
|
11
|
+
=end
|
|
12
|
+
|
|
13
|
+
require 'date'
|
|
14
|
+
require 'time'
|
|
15
|
+
|
|
16
|
+
module Repull
|
|
17
|
+
class ReservationCancelledEvent < ApiModelBase
|
|
18
|
+
attr_accessor :id
|
|
19
|
+
|
|
20
|
+
attr_accessor :type
|
|
21
|
+
|
|
22
|
+
attr_accessor :created_at
|
|
23
|
+
|
|
24
|
+
attr_accessor :api_version
|
|
25
|
+
|
|
26
|
+
attr_accessor :data
|
|
27
|
+
|
|
28
|
+
# Attribute mapping from ruby-style variable name to JSON key.
|
|
29
|
+
def self.attribute_map
|
|
30
|
+
{
|
|
31
|
+
:'id' => :'id',
|
|
32
|
+
:'type' => :'type',
|
|
33
|
+
:'created_at' => :'createdAt',
|
|
34
|
+
:'api_version' => :'apiVersion',
|
|
35
|
+
:'data' => :'data'
|
|
36
|
+
}
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Returns attribute mapping this model knows about
|
|
40
|
+
def self.acceptable_attribute_map
|
|
41
|
+
attribute_map
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Returns all the JSON keys this model knows about
|
|
45
|
+
def self.acceptable_attributes
|
|
46
|
+
acceptable_attribute_map.values
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Attribute type mapping.
|
|
50
|
+
def self.openapi_types
|
|
51
|
+
{
|
|
52
|
+
:'id' => :'String',
|
|
53
|
+
:'type' => :'String',
|
|
54
|
+
:'created_at' => :'Time',
|
|
55
|
+
:'api_version' => :'String',
|
|
56
|
+
:'data' => :'ReservationCancelledPayload'
|
|
57
|
+
}
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# List of attributes with nullable: true
|
|
61
|
+
def self.openapi_nullable
|
|
62
|
+
Set.new([
|
|
63
|
+
])
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# Initializes the object
|
|
67
|
+
# @param [Hash] attributes Model attributes in the form of hash
|
|
68
|
+
def initialize(attributes = {})
|
|
69
|
+
if (!attributes.is_a?(Hash))
|
|
70
|
+
fail ArgumentError, "The input argument (attributes) must be a hash in `Repull::ReservationCancelledEvent` initialize method"
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# check to see if the attribute exists and convert string to symbol for hash key
|
|
74
|
+
acceptable_attribute_map = self.class.acceptable_attribute_map
|
|
75
|
+
attributes = attributes.each_with_object({}) { |(k, v), h|
|
|
76
|
+
if (!acceptable_attribute_map.key?(k.to_sym))
|
|
77
|
+
fail ArgumentError, "`#{k}` is not a valid attribute in `Repull::ReservationCancelledEvent`. Please check the name to make sure it's valid. List of attributes: " + acceptable_attribute_map.keys.inspect
|
|
78
|
+
end
|
|
79
|
+
h[k.to_sym] = v
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
if attributes.key?(:'id')
|
|
83
|
+
self.id = attributes[:'id']
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
if attributes.key?(:'type')
|
|
87
|
+
self.type = attributes[:'type']
|
|
88
|
+
else
|
|
89
|
+
self.type = nil
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
if attributes.key?(:'created_at')
|
|
93
|
+
self.created_at = attributes[:'created_at']
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
if attributes.key?(:'api_version')
|
|
97
|
+
self.api_version = attributes[:'api_version']
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
if attributes.key?(:'data')
|
|
101
|
+
self.data = attributes[:'data']
|
|
102
|
+
else
|
|
103
|
+
self.data = nil
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
# Show invalid properties with the reasons. Usually used together with valid?
|
|
108
|
+
# @return Array for valid properties with the reasons
|
|
109
|
+
def list_invalid_properties
|
|
110
|
+
warn '[DEPRECATED] the `list_invalid_properties` method is obsolete'
|
|
111
|
+
invalid_properties = Array.new
|
|
112
|
+
if @type.nil?
|
|
113
|
+
invalid_properties.push('invalid value for "type", type cannot be nil.')
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
if @data.nil?
|
|
117
|
+
invalid_properties.push('invalid value for "data", data cannot be nil.')
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
invalid_properties
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
# Check to see if the all the properties in the model are valid
|
|
124
|
+
# @return true if the model is valid
|
|
125
|
+
def valid?
|
|
126
|
+
warn '[DEPRECATED] the `valid?` method is obsolete'
|
|
127
|
+
return false if @type.nil?
|
|
128
|
+
return false if @data.nil?
|
|
129
|
+
true
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
# Custom attribute writer method with validation
|
|
133
|
+
# @param [Object] type Value to be assigned
|
|
134
|
+
def type=(type)
|
|
135
|
+
if type.nil?
|
|
136
|
+
fail ArgumentError, 'type cannot be nil'
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
@type = type
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
# Custom attribute writer method with validation
|
|
143
|
+
# @param [Object] data Value to be assigned
|
|
144
|
+
def data=(data)
|
|
145
|
+
if data.nil?
|
|
146
|
+
fail ArgumentError, 'data cannot be nil'
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
@data = data
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
# Checks equality by comparing each attribute.
|
|
153
|
+
# @param [Object] Object to be compared
|
|
154
|
+
def ==(o)
|
|
155
|
+
return true if self.equal?(o)
|
|
156
|
+
self.class == o.class &&
|
|
157
|
+
id == o.id &&
|
|
158
|
+
type == o.type &&
|
|
159
|
+
created_at == o.created_at &&
|
|
160
|
+
api_version == o.api_version &&
|
|
161
|
+
data == o.data
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
# @see the `==` method
|
|
165
|
+
# @param [Object] Object to be compared
|
|
166
|
+
def eql?(o)
|
|
167
|
+
self == o
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
# Calculates hash code according to all attributes.
|
|
171
|
+
# @return [Integer] Hash code
|
|
172
|
+
def hash
|
|
173
|
+
[id, type, created_at, api_version, data].hash
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
# Builds the object from hash
|
|
177
|
+
# @param [Hash] attributes Model attributes in the form of hash
|
|
178
|
+
# @return [Object] Returns the model itself
|
|
179
|
+
def self.build_from_hash(attributes)
|
|
180
|
+
return nil unless attributes.is_a?(Hash)
|
|
181
|
+
attributes = attributes.transform_keys(&:to_sym)
|
|
182
|
+
transformed_hash = {}
|
|
183
|
+
openapi_types.each_pair do |key, type|
|
|
184
|
+
if attributes.key?(attribute_map[key]) && attributes[attribute_map[key]].nil?
|
|
185
|
+
transformed_hash["#{key}"] = nil
|
|
186
|
+
elsif type =~ /\AArray<(.*)>/i
|
|
187
|
+
# check to ensure the input is an array given that the attribute
|
|
188
|
+
# is documented as an array but the input is not
|
|
189
|
+
if attributes[attribute_map[key]].is_a?(Array)
|
|
190
|
+
transformed_hash["#{key}"] = attributes[attribute_map[key]].map { |v| _deserialize($1, v) }
|
|
191
|
+
end
|
|
192
|
+
elsif !attributes[attribute_map[key]].nil?
|
|
193
|
+
transformed_hash["#{key}"] = _deserialize(type, attributes[attribute_map[key]])
|
|
194
|
+
end
|
|
195
|
+
end
|
|
196
|
+
new(transformed_hash)
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
# Returns the object in the form of hash
|
|
200
|
+
# @return [Hash] Returns the object in the form of hash
|
|
201
|
+
def to_hash
|
|
202
|
+
hash = {}
|
|
203
|
+
self.class.attribute_map.each_pair do |attr, param|
|
|
204
|
+
value = self.send(attr)
|
|
205
|
+
if value.nil?
|
|
206
|
+
is_nullable = self.class.openapi_nullable.include?(attr)
|
|
207
|
+
next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}"))
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
hash[param] = _to_hash(value)
|
|
211
|
+
end
|
|
212
|
+
hash
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
end
|