flat_api 0.3.5 → 1.0.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +69 -0
- data/LICENSE +201 -0
- data/README.md +92 -0
- data/lib/flat_api/api/account_api.rb +4 -4
- data/lib/flat_api/api/class_api.rb +281 -63
- data/lib/flat_api/api/collection_api.rb +63 -50
- data/lib/flat_api/api/edu_resources_api.rb +38 -26
- data/lib/flat_api/api/group_api.rb +432 -9
- data/lib/flat_api/api/omr_api.rb +894 -0
- data/lib/flat_api/api/organization_api.rb +307 -35
- data/lib/flat_api/api/score_api.rb +129 -80
- data/lib/flat_api/api/task_api.rb +5 -5
- data/lib/flat_api/api/user_api.rb +45 -14
- data/lib/flat_api/api_client.rb +169 -96
- data/lib/flat_api/api_error.rb +3 -3
- data/lib/flat_api/api_model_base.rb +88 -0
- data/lib/flat_api/client.rb +69 -0
- data/lib/flat_api/configuration.rb +124 -25
- data/lib/flat_api/errors.rb +86 -0
- data/lib/flat_api/models/add_group_user200_response.rb +148 -0
- data/lib/flat_api/models/add_group_user_request.rb +165 -0
- data/lib/flat_api/models/api_access_token.rb +13 -80
- data/lib/flat_api/models/app_scopes.rb +6 -4
- data/lib/flat_api/models/assignment.rb +190 -85
- data/lib/flat_api/models/assignment_capabilities.rb +53 -80
- data/lib/flat_api/models/assignment_capabilities_can_publish_in_class_error.rb +33 -80
- data/lib/flat_api/models/assignment_copy.rb +5 -6
- data/lib/flat_api/models/assignment_copy_response.rb +187 -82
- data/lib/flat_api/models/assignment_copy_to_class.rb +23 -80
- data/lib/flat_api/models/assignment_copy_to_resource_library.rb +23 -80
- data/lib/flat_api/models/assignment_group.rb +232 -0
- data/lib/flat_api/models/assignment_submission.rb +104 -81
- data/lib/flat_api/models/assignment_submission_comment.rb +13 -80
- data/lib/flat_api/models/assignment_submission_comment_creation.rb +23 -80
- data/lib/flat_api/models/assignment_submission_comments.rb +13 -80
- data/lib/flat_api/models/assignment_submission_history.rb +33 -80
- data/lib/flat_api/models/assignment_submission_history_attachment.rb +13 -80
- data/lib/flat_api/models/assignment_submission_history_state.rb +3 -3
- data/lib/flat_api/models/assignment_submission_lti.rb +64 -86
- data/lib/flat_api/models/{assignment_submission_playback_inner.rb → assignment_submission_playback.rb} +36 -83
- data/lib/flat_api/models/assignment_submission_state.rb +3 -3
- data/lib/flat_api/models/assignment_submission_students_mode.rb +40 -0
- data/lib/flat_api/models/assignment_submission_update.rb +25 -81
- data/lib/flat_api/models/assignment_type.rb +5 -4
- data/lib/flat_api/models/assignment_update.rb +218 -87
- data/lib/flat_api/models/class_assignment.rb +219 -82
- data/lib/flat_api/models/class_assignment_all_of_canvas.rb +13 -80
- data/lib/flat_api/models/class_assignment_all_of_lti.rb +13 -80
- data/lib/flat_api/models/class_assignment_all_of_mfc.rb +13 -80
- data/lib/flat_api/models/class_assignment_update.rb +237 -94
- data/lib/flat_api/models/class_assignment_update_all_of_google_classroom.rb +13 -80
- data/lib/flat_api/models/class_assignment_update_all_of_microsoft_graph.rb +13 -80
- data/lib/flat_api/models/class_attachment_creation.rb +51 -86
- data/lib/flat_api/models/class_creation.rb +13 -80
- data/lib/flat_api/models/class_details.rb +85 -81
- data/lib/flat_api/models/class_details_canvas.rb +13 -80
- data/lib/flat_api/models/class_details_clever.rb +13 -80
- data/lib/flat_api/models/class_details_google_classroom.rb +13 -80
- data/lib/flat_api/models/class_details_google_drive.rb +13 -80
- data/lib/flat_api/models/class_details_issues.rb +13 -80
- data/lib/flat_api/models/class_details_issues_sync_inner.rb +15 -82
- data/lib/flat_api/models/class_details_lti.rb +28 -85
- data/lib/flat_api/models/class_details_mfc.rb +13 -80
- data/lib/flat_api/models/class_details_microsoft_graph.rb +13 -80
- data/lib/flat_api/models/class_grade_level.rb +3 -3
- data/lib/flat_api/models/class_roles.rb +3 -3
- data/lib/flat_api/models/class_state.rb +5 -4
- data/lib/flat_api/models/class_update.rb +13 -80
- data/lib/flat_api/models/collection.rb +182 -81
- data/lib/flat_api/models/collection_app.rb +13 -80
- data/lib/flat_api/models/collection_capabilities.rb +63 -80
- data/lib/flat_api/models/collection_contents.rb +166 -0
- data/lib/flat_api/models/collection_creation.rb +20 -99
- data/lib/flat_api/models/collection_modification.rb +17 -82
- data/lib/flat_api/models/collection_privacy.rb +3 -3
- data/lib/flat_api/models/collection_type.rb +7 -6
- data/lib/flat_api/models/credit_transaction.rb +388 -0
- data/lib/flat_api/models/edu_library.rb +63 -82
- data/lib/flat_api/models/edu_resource.rb +101 -84
- data/lib/flat_api/models/edu_resource_assignment_creation.rb +170 -0
- data/lib/flat_api/models/edu_resource_capabilities.rb +27 -84
- data/lib/flat_api/models/edu_resource_copy.rb +23 -80
- data/lib/flat_api/models/edu_resource_creation.rb +96 -86
- data/lib/flat_api/models/edu_resource_folder.rb +39 -84
- data/lib/flat_api/models/edu_resource_lti_link.rb +23 -80
- data/lib/flat_api/models/edu_resource_move.rb +23 -80
- data/lib/flat_api/models/edu_resource_privacy.rb +3 -3
- data/lib/flat_api/models/edu_resource_resource.rb +5 -6
- data/lib/flat_api/models/edu_resource_type.rb +3 -3
- data/lib/flat_api/models/edu_resource_update.rb +101 -86
- data/lib/flat_api/models/edu_resource_use_in_class.rb +23 -80
- data/lib/flat_api/models/flat_error_response.rb +47 -84
- data/lib/flat_api/models/google_classroom_coursework.rb +13 -80
- data/lib/flat_api/models/google_classroom_submission.rb +43 -80
- data/lib/flat_api/models/grade.rb +51 -0
- data/lib/flat_api/models/group.rb +14 -94
- data/lib/flat_api/models/group_creation.rb +238 -0
- data/lib/flat_api/models/group_details.rb +178 -84
- data/lib/flat_api/models/group_type.rb +6 -4
- data/lib/flat_api/models/license_mode.rb +3 -3
- data/lib/flat_api/models/license_sources.rb +3 -3
- data/lib/flat_api/models/lms_name.rb +3 -3
- data/lib/flat_api/models/lti_configuration.rb +56 -0
- data/lib/flat_api/models/lti_configuration1p1.rb +361 -0
- data/lib/flat_api/models/lti_configuration1p1_all_of_tool.rb +199 -0
- data/lib/flat_api/models/lti_configuration1p3.rb +106 -0
- data/lib/flat_api/models/lti_configuration1p3_base.rb +336 -0
- data/lib/flat_api/models/lti_configuration1p3_base_supported_services.rb +166 -0
- data/lib/flat_api/models/lti_configuration1p3_base_supported_services_ags.rb +179 -0
- data/lib/flat_api/models/lti_configuration1p3_base_supported_services_deep_linking.rb +159 -0
- data/lib/flat_api/models/lti_configuration1p3_base_supported_services_nrps.rb +169 -0
- data/lib/flat_api/models/lti_configuration1p3_base_tool.rb +199 -0
- data/lib/flat_api/models/lti_configuration1p3_deployment.rb +529 -0
- data/lib/flat_api/models/lti_configuration1p3_dynamic.rb +530 -0
- data/lib/flat_api/models/lti_configuration1p3_manual.rb +489 -0
- data/lib/flat_api/models/lti_configuration_base.rb +306 -0
- data/lib/flat_api/models/lti_configuration_create.rb +60 -0
- data/lib/flat_api/models/lti_configuration_create1p1.rb +210 -0
- data/lib/flat_api/models/lti_configuration_create1p3_deployment.rb +264 -0
- data/lib/flat_api/models/lti_configuration_create1p3_dynamic.rb +209 -0
- data/lib/flat_api/models/lti_configuration_create1p3_dynamic_platform_info.rb +159 -0
- data/lib/flat_api/models/lti_configuration_create1p3_manual.rb +270 -0
- data/lib/flat_api/models/lti_configuration_update.rb +104 -0
- data/lib/flat_api/models/lti_configuration_update_deployment.rb +169 -0
- data/lib/flat_api/models/lti_configuration_update_standalone.rb +219 -0
- data/lib/flat_api/models/lti_credentials.rb +29 -84
- data/lib/flat_api/models/lti_credentials_creation.rb +23 -80
- data/lib/flat_api/models/media_attachment.rb +43 -88
- data/lib/flat_api/models/media_score_sharing_mode.rb +3 -3
- data/lib/flat_api/models/microsoft_graph_assignment.rb +99 -88
- data/lib/flat_api/models/microsoft_graph_submission.rb +33 -80
- data/lib/flat_api/models/omr_capabilities.rb +480 -0
- data/lib/flat_api/models/omr_details_step_data.rb +228 -0
- data/lib/flat_api/models/omr_details_submission.rb +288 -0
- data/lib/flat_api/models/omr_detected_instrument.rb +260 -0
- data/lib/flat_api/models/omr_imported_metadata.rb +181 -0
- data/lib/flat_api/models/omr_instrument_override.rb +311 -0
- data/lib/flat_api/models/omr_job.rb +394 -0
- data/lib/flat_api/models/omr_job_creation.rb +238 -0
- data/lib/flat_api/models/omr_job_file_metadata.rb +199 -0
- data/lib/flat_api/models/omr_job_file_upload.rb +176 -0
- data/lib/flat_api/models/omr_job_file_upload_result.rb +159 -0
- data/lib/flat_api/models/omr_job_input_file.rb +176 -0
- data/lib/flat_api/models/omr_job_output.rb +40 -0
- data/lib/flat_api/models/omr_job_progress.rb +169 -0
- data/lib/flat_api/models/omr_job_result.rb +161 -0
- data/lib/flat_api/models/omr_job_retention.rb +176 -0
- data/lib/flat_api/models/omr_job_status.rb +44 -0
- data/lib/flat_api/models/omr_locale_details.rb +193 -0
- data/lib/flat_api/models/omr_pending_step.rb +213 -0
- data/lib/flat_api/models/omr_step_name.rb +39 -0
- data/lib/flat_api/models/organization_invitation.rb +54 -81
- data/lib/flat_api/models/organization_invitation_creation.rb +15 -82
- data/lib/flat_api/models/organization_roles.rb +5 -5
- data/lib/flat_api/models/organization_user_access_token_creation.rb +23 -80
- data/lib/flat_api/models/rename_group_request.rb +165 -0
- data/lib/flat_api/models/resource_collaborator.rb +43 -85
- data/lib/flat_api/models/resource_collaborator_creation.rb +13 -80
- data/lib/flat_api/models/resource_rights.rb +43 -85
- data/lib/flat_api/models/score_comment.rb +122 -80
- data/lib/flat_api/models/score_comment_context.rb +73 -80
- data/lib/flat_api/models/score_comment_creation.rb +24 -81
- data/lib/flat_api/models/score_comment_moderation.rb +13 -80
- data/lib/flat_api/models/score_comment_update.rb +18 -85
- data/lib/flat_api/models/score_comments_counts.rb +28 -85
- data/lib/flat_api/models/score_creation.rb +5 -6
- data/lib/flat_api/models/score_creation_builder_data.rb +24 -88
- data/lib/flat_api/models/score_creation_builder_data_all_of_builder_data.rb +23 -80
- data/lib/flat_api/models/score_creation_builder_data_all_of_builder_data_layout_data.rb +13 -80
- data/lib/flat_api/models/score_creation_builder_data_all_of_builder_data_score_data.rb +24 -81
- data/lib/flat_api/models/score_creation_builder_data_all_of_builder_data_score_data_instruments.rb +33 -80
- data/lib/flat_api/models/score_creation_common.rb +14 -81
- data/lib/flat_api/models/score_creation_file_import.rb +39 -86
- data/lib/flat_api/models/score_creation_google_drive_import.rb +24 -81
- data/lib/flat_api/models/score_creation_type.rb +4 -5
- data/lib/flat_api/models/score_details.rb +180 -89
- data/lib/flat_api/models/score_details_all_of_me.rb +193 -0
- data/lib/flat_api/models/score_fork.rb +14 -83
- data/lib/flat_api/models/score_license.rb +4 -5
- data/lib/flat_api/models/score_likes_counts.rb +28 -106
- data/lib/flat_api/models/score_modification.rb +13 -80
- data/lib/flat_api/models/score_plays_counts.rb +28 -85
- data/lib/flat_api/models/score_privacy.rb +3 -3
- data/lib/flat_api/models/score_revision.rb +81 -87
- data/lib/flat_api/models/score_revision_creation.rb +23 -80
- data/lib/flat_api/models/score_revision_statistics.rb +13 -80
- data/lib/flat_api/models/score_source.rb +13 -80
- data/lib/flat_api/models/score_summary.rb +63 -80
- data/lib/flat_api/models/score_track.rb +94 -88
- data/lib/flat_api/models/score_track_creation.rb +13 -80
- data/lib/flat_api/models/score_track_creation_response.rb +165 -0
- data/lib/flat_api/models/score_track_point.rb +23 -80
- data/lib/flat_api/models/score_track_purpose.rb +3 -3
- data/lib/flat_api/models/score_track_state.rb +3 -3
- data/lib/flat_api/models/score_track_type.rb +3 -3
- data/lib/flat_api/models/score_track_update.rb +25 -81
- data/lib/flat_api/models/score_views_counts.rb +28 -85
- data/lib/flat_api/models/task.rb +62 -87
- data/lib/flat_api/models/task_export_options.rb +13 -80
- data/lib/flat_api/models/task_progress.rb +13 -80
- data/lib/flat_api/models/task_result.rb +13 -80
- data/lib/flat_api/models/teaching_theme.rb +47 -0
- data/lib/flat_api/models/tutteo_product.rb +3 -3
- data/lib/flat_api/models/user_admin_update.rb +17 -95
- data/lib/flat_api/models/user_azure_details.rb +13 -80
- data/lib/flat_api/models/user_basics.rb +43 -80
- data/lib/flat_api/models/user_community_profile_links.rb +13 -80
- data/lib/flat_api/models/user_creation.rb +21 -98
- data/lib/flat_api/models/user_details.rb +101 -96
- data/lib/flat_api/models/user_details_admin.rb +72 -85
- data/lib/flat_api/models/user_details_admin_all_of_license.rb +13 -80
- data/lib/flat_api/models/user_public.rb +89 -94
- data/lib/flat_api/models/user_public_summary.rb +58 -81
- data/lib/flat_api/models/user_signin_link.rb +24 -81
- data/lib/flat_api/models/user_signin_link_creation.rb +13 -80
- data/lib/flat_api/oauth.rb +128 -0
- data/lib/flat_api/pagination.rb +88 -0
- data/lib/flat_api/retry.rb +56 -0
- data/lib/flat_api/version.rb +4 -4
- data/lib/flat_api.rb +70 -5
- metadata +98 -330
- data/lib/flat_api/models/flat_locales.rb +0 -56
- data/spec/api/account_api_spec.rb +0 -47
- data/spec/api/class_api_spec.rb +0 -422
- data/spec/api/collection_api_spec.rb +0 -158
- data/spec/api/edu_resources_api_spec.rb +0 -181
- data/spec/api/group_api_spec.rb +0 -71
- data/spec/api/organization_api_spec.rb +0 -201
- data/spec/api/score_api_spec.rb +0 -440
- data/spec/api/task_api_spec.rb +0 -47
- data/spec/api/user_api_spec.rb +0 -75
- data/spec/models/api_access_token_spec.rb +0 -66
- data/spec/models/app_scopes_spec.rb +0 -30
- data/spec/models/assignment_capabilities_can_publish_in_class_error_spec.rb +0 -42
- data/spec/models/assignment_capabilities_spec.rb +0 -60
- data/spec/models/assignment_copy_response_spec.rb +0 -124
- data/spec/models/assignment_copy_spec.rb +0 -32
- data/spec/models/assignment_copy_to_class_spec.rb +0 -48
- data/spec/models/assignment_copy_to_resource_library_spec.rb +0 -42
- data/spec/models/assignment_spec.rb +0 -118
- data/spec/models/assignment_submission_comment_creation_spec.rb +0 -36
- data/spec/models/assignment_submission_comment_spec.rb +0 -72
- data/spec/models/assignment_submission_comments_spec.rb +0 -42
- data/spec/models/assignment_submission_history_attachment_spec.rb +0 -48
- data/spec/models/assignment_submission_history_spec.rb +0 -112
- data/spec/models/assignment_submission_history_state_spec.rb +0 -30
- data/spec/models/assignment_submission_lti_spec.rb +0 -36
- data/spec/models/assignment_submission_playback_inner_spec.rb +0 -42
- data/spec/models/assignment_submission_spec.rb +0 -144
- data/spec/models/assignment_submission_state_spec.rb +0 -30
- data/spec/models/assignment_submission_update_spec.rb +0 -66
- data/spec/models/assignment_type_spec.rb +0 -30
- data/spec/models/assignment_update_spec.rb +0 -100
- data/spec/models/class_assignment_all_of_canvas_spec.rb +0 -42
- data/spec/models/class_assignment_all_of_lti_spec.rb +0 -36
- data/spec/models/class_assignment_all_of_mfc_spec.rb +0 -42
- data/spec/models/class_assignment_spec.rb +0 -216
- data/spec/models/class_assignment_update_all_of_google_classroom_spec.rb +0 -36
- data/spec/models/class_assignment_update_all_of_microsoft_graph_spec.rb +0 -36
- data/spec/models/class_assignment_update_spec.rb +0 -150
- data/spec/models/class_attachment_creation_spec.rb +0 -76
- data/spec/models/class_creation_spec.rb +0 -64
- data/spec/models/class_details_canvas_spec.rb +0 -42
- data/spec/models/class_details_clever_spec.rb +0 -76
- data/spec/models/class_details_google_classroom_spec.rb +0 -42
- data/spec/models/class_details_google_drive_spec.rb +0 -42
- data/spec/models/class_details_issues_spec.rb +0 -36
- data/spec/models/class_details_issues_sync_inner_spec.rb +0 -52
- data/spec/models/class_details_lti_spec.rb +0 -48
- data/spec/models/class_details_mfc_spec.rb +0 -42
- data/spec/models/class_details_microsoft_graph_spec.rb +0 -36
- data/spec/models/class_details_spec.rb +0 -178
- data/spec/models/class_grade_level_spec.rb +0 -30
- data/spec/models/class_roles_spec.rb +0 -30
- data/spec/models/class_state_spec.rb +0 -30
- data/spec/models/class_update_spec.rb +0 -64
- data/spec/models/collection_app_spec.rb +0 -48
- data/spec/models/collection_capabilities_spec.rb +0 -60
- data/spec/models/collection_creation_spec.rb +0 -42
- data/spec/models/collection_modification_spec.rb +0 -42
- data/spec/models/collection_privacy_spec.rb +0 -30
- data/spec/models/collection_spec.rb +0 -114
- data/spec/models/collection_type_spec.rb +0 -30
- data/spec/models/edu_library_spec.rb +0 -62
- data/spec/models/edu_resource_capabilities_spec.rb +0 -48
- data/spec/models/edu_resource_copy_spec.rb +0 -36
- data/spec/models/edu_resource_creation_spec.rb +0 -48
- data/spec/models/edu_resource_folder_spec.rb +0 -36
- data/spec/models/edu_resource_lti_link_spec.rb +0 -36
- data/spec/models/edu_resource_move_spec.rb +0 -36
- data/spec/models/edu_resource_privacy_spec.rb +0 -30
- data/spec/models/edu_resource_resource_spec.rb +0 -32
- data/spec/models/edu_resource_spec.rb +0 -96
- data/spec/models/edu_resource_type_spec.rb +0 -30
- data/spec/models/edu_resource_update_spec.rb +0 -42
- data/spec/models/edu_resource_use_in_class_spec.rb +0 -42
- data/spec/models/flat_error_response_spec.rb +0 -54
- data/spec/models/flat_locales_spec.rb +0 -30
- data/spec/models/google_classroom_coursework_spec.rb +0 -54
- data/spec/models/google_classroom_submission_spec.rb +0 -48
- data/spec/models/group_details_spec.rb +0 -72
- data/spec/models/group_spec.rb +0 -76
- data/spec/models/group_type_spec.rb +0 -30
- data/spec/models/license_mode_spec.rb +0 -30
- data/spec/models/license_sources_spec.rb +0 -30
- data/spec/models/lms_name_spec.rb +0 -30
- data/spec/models/lti_credentials_creation_spec.rb +0 -42
- data/spec/models/lti_credentials_spec.rb +0 -84
- data/spec/models/media_attachment_spec.rb +0 -166
- data/spec/models/media_score_sharing_mode_spec.rb +0 -30
- data/spec/models/microsoft_graph_assignment_spec.rb +0 -54
- data/spec/models/microsoft_graph_submission_spec.rb +0 -42
- data/spec/models/organization_invitation_creation_spec.rb +0 -46
- data/spec/models/organization_invitation_spec.rb +0 -84
- data/spec/models/organization_roles_spec.rb +0 -30
- data/spec/models/organization_user_access_token_creation_spec.rb +0 -36
- data/spec/models/resource_collaborator_creation_spec.rb +0 -72
- data/spec/models/resource_collaborator_spec.rb +0 -112
- data/spec/models/resource_rights_spec.rb +0 -64
- data/spec/models/score_comment_context_spec.rb +0 -78
- data/spec/models/score_comment_creation_spec.rb +0 -66
- data/spec/models/score_comment_moderation_spec.rb +0 -46
- data/spec/models/score_comment_spec.rb +0 -130
- data/spec/models/score_comment_update_spec.rb +0 -54
- data/spec/models/score_comments_counts_spec.rb +0 -54
- data/spec/models/score_creation_builder_data_all_of_builder_data_layout_data_spec.rb +0 -82
- data/spec/models/score_creation_builder_data_all_of_builder_data_score_data_instruments_spec.rb +0 -60
- data/spec/models/score_creation_builder_data_all_of_builder_data_score_data_spec.rb +0 -66
- data/spec/models/score_creation_builder_data_all_of_builder_data_spec.rb +0 -42
- data/spec/models/score_creation_builder_data_spec.rb +0 -60
- data/spec/models/score_creation_common_spec.rb +0 -54
- data/spec/models/score_creation_file_import_spec.rb +0 -76
- data/spec/models/score_creation_google_drive_import_spec.rb +0 -60
- data/spec/models/score_creation_spec.rb +0 -32
- data/spec/models/score_creation_type_spec.rb +0 -30
- data/spec/models/score_details_spec.rb +0 -240
- data/spec/models/score_fork_spec.rb +0 -48
- data/spec/models/score_license_spec.rb +0 -30
- data/spec/models/score_likes_counts_spec.rb +0 -48
- data/spec/models/score_modification_spec.rb +0 -102
- data/spec/models/score_plays_counts_spec.rb +0 -48
- data/spec/models/score_privacy_spec.rb +0 -30
- data/spec/models/score_revision_creation_spec.rb +0 -58
- data/spec/models/score_revision_spec.rb +0 -78
- data/spec/models/score_revision_statistics_spec.rb +0 -54
- data/spec/models/score_source_spec.rb +0 -36
- data/spec/models/score_summary_spec.rb +0 -66
- data/spec/models/score_track_creation_spec.rb +0 -66
- data/spec/models/score_track_point_spec.rb +0 -52
- data/spec/models/score_track_purpose_spec.rb +0 -30
- data/spec/models/score_track_spec.rb +0 -108
- data/spec/models/score_track_state_spec.rb +0 -30
- data/spec/models/score_track_type_spec.rb +0 -30
- data/spec/models/score_track_update_spec.rb +0 -54
- data/spec/models/score_views_counts_spec.rb +0 -48
- data/spec/models/task_export_options_spec.rb +0 -36
- data/spec/models/task_progress_spec.rb +0 -42
- data/spec/models/task_result_spec.rb +0 -42
- data/spec/models/task_spec.rb +0 -100
- data/spec/models/tutteo_product_spec.rb +0 -30
- data/spec/models/user_admin_update_spec.rb +0 -66
- data/spec/models/user_azure_details_spec.rb +0 -48
- data/spec/models/user_basics_spec.rb +0 -94
- data/spec/models/user_community_profile_links_spec.rb +0 -66
- data/spec/models/user_creation_spec.rb +0 -76
- data/spec/models/user_details_admin_all_of_license_spec.rb +0 -60
- data/spec/models/user_details_admin_spec.rb +0 -142
- data/spec/models/user_details_spec.rb +0 -214
- data/spec/models/user_public_spec.rb +0 -178
- data/spec/models/user_public_summary_spec.rb +0 -118
- data/spec/models/user_signin_link_creation_spec.rb +0 -36
- data/spec/models/user_signin_link_spec.rb +0 -42
- data/spec/spec_helper.rb +0 -111
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
=begin
|
|
2
2
|
#Flat API
|
|
3
3
|
|
|
4
|
-
#The Flat API allows you to easily extend the abilities of the [Flat Platform](https://flat.io), with a wide range of use cases including the following: * Creating and importing new music scores using MusicXML, MIDI, Guitar Pro
|
|
4
|
+
#The Flat API allows you to easily extend the abilities of the [Flat Platform](https://flat.io), with a wide range of use cases including the following: * Creating and importing new music scores using MusicXML, MIDI, Guitar Pro, MuseScore, ABC notation, and many other formats * Browsing, updating, copying, exporting the user's scores (for example in MP3, WAV or MIDI) * Managing educational resources with Flat for Education: creating & updating the organization accounts, the classes, rosters and assignments. The Flat API is built on HTTP. Our API is RESTful It has predictable resource URLs. It returns HTTP response codes to indicate errors. It also accepts and returns JSON in the HTTP body. The [schema](/swagger.yaml) of this API follows the [OpenAPI Initiative (OAI) specification](https://www.openapis.org/), you can use and work with [compatible Swagger tools](http://swagger.io/open-source-integrations/). This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). You can use your favorite HTTP/REST library for your programming language to use Flat's API. This specification and reference is [available on Github](https://github.com/FlatIO/api-reference). Getting Started and learn more: * [API Overview and introduction](https://flat.io/developers/docs/api/) * [Authentication (Personal Access Tokens or OAuth2)](https://flat.io/developers/docs/api/authentication.html) * [SDKs](https://flat.io/developers/docs/api/sdks.html) * [Rate Limits](https://flat.io/developers/docs/api/rate-limits.html) * [Changelog](https://flat.io/developers/docs/api/changelog.html)
|
|
5
5
|
|
|
6
|
-
The version of the OpenAPI document: 2.
|
|
6
|
+
The version of the OpenAPI document: 2.26.1
|
|
7
7
|
Contact: developers@flat.io
|
|
8
8
|
Generated by: https://openapi-generator.tech
|
|
9
|
-
|
|
9
|
+
Generator version: 7.24.0
|
|
10
10
|
|
|
11
11
|
=end
|
|
12
12
|
|
|
@@ -14,10 +14,13 @@ require 'date'
|
|
|
14
14
|
require 'time'
|
|
15
15
|
|
|
16
16
|
module FlatApi
|
|
17
|
-
class UserSigninLink
|
|
17
|
+
class UserSigninLink < ApiModelBase
|
|
18
18
|
# URL to use to sign in to this account
|
|
19
19
|
attr_accessor :url
|
|
20
20
|
|
|
21
|
+
# Raw sign-in token, can be used to build custom URLs (e.g. deep links)
|
|
22
|
+
attr_accessor :token
|
|
23
|
+
|
|
21
24
|
# Date when the link expires
|
|
22
25
|
attr_accessor :expiration_date
|
|
23
26
|
|
|
@@ -25,19 +28,26 @@ module FlatApi
|
|
|
25
28
|
def self.attribute_map
|
|
26
29
|
{
|
|
27
30
|
:'url' => :'url',
|
|
31
|
+
:'token' => :'token',
|
|
28
32
|
:'expiration_date' => :'expirationDate'
|
|
29
33
|
}
|
|
30
34
|
end
|
|
31
35
|
|
|
36
|
+
# Returns attribute mapping this model knows about
|
|
37
|
+
def self.acceptable_attribute_map
|
|
38
|
+
attribute_map
|
|
39
|
+
end
|
|
40
|
+
|
|
32
41
|
# Returns all the JSON keys this model knows about
|
|
33
42
|
def self.acceptable_attributes
|
|
34
|
-
|
|
43
|
+
acceptable_attribute_map.values
|
|
35
44
|
end
|
|
36
45
|
|
|
37
46
|
# Attribute type mapping.
|
|
38
47
|
def self.openapi_types
|
|
39
48
|
{
|
|
40
49
|
:'url' => :'String',
|
|
50
|
+
:'token' => :'String',
|
|
41
51
|
:'expiration_date' => :'Time'
|
|
42
52
|
}
|
|
43
53
|
end
|
|
@@ -56,9 +66,10 @@ module FlatApi
|
|
|
56
66
|
end
|
|
57
67
|
|
|
58
68
|
# check to see if the attribute exists and convert string to symbol for hash key
|
|
69
|
+
acceptable_attribute_map = self.class.acceptable_attribute_map
|
|
59
70
|
attributes = attributes.each_with_object({}) { |(k, v), h|
|
|
60
|
-
if (!
|
|
61
|
-
fail ArgumentError, "`#{k}` is not a valid attribute in `FlatApi::UserSigninLink`. Please check the name to make sure it's valid. List of attributes: " +
|
|
71
|
+
if (!acceptable_attribute_map.key?(k.to_sym))
|
|
72
|
+
fail ArgumentError, "`#{k}` is not a valid attribute in `FlatApi::UserSigninLink`. Please check the name to make sure it's valid. List of attributes: " + acceptable_attribute_map.keys.inspect
|
|
62
73
|
end
|
|
63
74
|
h[k.to_sym] = v
|
|
64
75
|
}
|
|
@@ -67,6 +78,10 @@ module FlatApi
|
|
|
67
78
|
self.url = attributes[:'url']
|
|
68
79
|
end
|
|
69
80
|
|
|
81
|
+
if attributes.key?(:'token')
|
|
82
|
+
self.token = attributes[:'token']
|
|
83
|
+
end
|
|
84
|
+
|
|
70
85
|
if attributes.key?(:'expiration_date')
|
|
71
86
|
self.expiration_date = attributes[:'expiration_date']
|
|
72
87
|
end
|
|
@@ -93,6 +108,7 @@ module FlatApi
|
|
|
93
108
|
return true if self.equal?(o)
|
|
94
109
|
self.class == o.class &&
|
|
95
110
|
url == o.url &&
|
|
111
|
+
token == o.token &&
|
|
96
112
|
expiration_date == o.expiration_date
|
|
97
113
|
end
|
|
98
114
|
|
|
@@ -105,7 +121,7 @@ module FlatApi
|
|
|
105
121
|
# Calculates hash code according to all attributes.
|
|
106
122
|
# @return [Integer] Hash code
|
|
107
123
|
def hash
|
|
108
|
-
[url, expiration_date].hash
|
|
124
|
+
[url, token, expiration_date].hash
|
|
109
125
|
end
|
|
110
126
|
|
|
111
127
|
# Builds the object from hash
|
|
@@ -131,61 +147,6 @@ module FlatApi
|
|
|
131
147
|
new(transformed_hash)
|
|
132
148
|
end
|
|
133
149
|
|
|
134
|
-
# Deserializes the data based on type
|
|
135
|
-
# @param string type Data type
|
|
136
|
-
# @param string value Value to be deserialized
|
|
137
|
-
# @return [Object] Deserialized data
|
|
138
|
-
def self._deserialize(type, value)
|
|
139
|
-
case type.to_sym
|
|
140
|
-
when :Time
|
|
141
|
-
Time.parse(value)
|
|
142
|
-
when :Date
|
|
143
|
-
Date.parse(value)
|
|
144
|
-
when :String
|
|
145
|
-
value.to_s
|
|
146
|
-
when :Integer
|
|
147
|
-
value.to_i
|
|
148
|
-
when :Float
|
|
149
|
-
value.to_f
|
|
150
|
-
when :Boolean
|
|
151
|
-
if value.to_s =~ /\A(true|t|yes|y|1)\z/i
|
|
152
|
-
true
|
|
153
|
-
else
|
|
154
|
-
false
|
|
155
|
-
end
|
|
156
|
-
when :Object
|
|
157
|
-
# generic object (usually a Hash), return directly
|
|
158
|
-
value
|
|
159
|
-
when /\AArray<(?<inner_type>.+)>\z/
|
|
160
|
-
inner_type = Regexp.last_match[:inner_type]
|
|
161
|
-
value.map { |v| _deserialize(inner_type, v) }
|
|
162
|
-
when /\AHash<(?<k_type>.+?), (?<v_type>.+)>\z/
|
|
163
|
-
k_type = Regexp.last_match[:k_type]
|
|
164
|
-
v_type = Regexp.last_match[:v_type]
|
|
165
|
-
{}.tap do |hash|
|
|
166
|
-
value.each do |k, v|
|
|
167
|
-
hash[_deserialize(k_type, k)] = _deserialize(v_type, v)
|
|
168
|
-
end
|
|
169
|
-
end
|
|
170
|
-
else # model
|
|
171
|
-
# models (e.g. Pet) or oneOf
|
|
172
|
-
klass = FlatApi.const_get(type)
|
|
173
|
-
klass.respond_to?(:openapi_any_of) || klass.respond_to?(:openapi_one_of) ? klass.build(value) : klass.build_from_hash(value)
|
|
174
|
-
end
|
|
175
|
-
end
|
|
176
|
-
|
|
177
|
-
# Returns the string representation of the object
|
|
178
|
-
# @return [String] String presentation of the object
|
|
179
|
-
def to_s
|
|
180
|
-
to_hash.to_s
|
|
181
|
-
end
|
|
182
|
-
|
|
183
|
-
# to_body is an alias to to_hash (backward compatibility)
|
|
184
|
-
# @return [Hash] Returns the object in the form of hash
|
|
185
|
-
def to_body
|
|
186
|
-
to_hash
|
|
187
|
-
end
|
|
188
|
-
|
|
189
150
|
# Returns the object in the form of hash
|
|
190
151
|
# @return [Hash] Returns the object in the form of hash
|
|
191
152
|
def to_hash
|
|
@@ -202,24 +163,6 @@ module FlatApi
|
|
|
202
163
|
hash
|
|
203
164
|
end
|
|
204
165
|
|
|
205
|
-
# Outputs non-array value in the form of hash
|
|
206
|
-
# For object, use to_hash. Otherwise, just return the value
|
|
207
|
-
# @param [Object] value Any valid value
|
|
208
|
-
# @return [Hash] Returns the value in the form of hash
|
|
209
|
-
def _to_hash(value)
|
|
210
|
-
if value.is_a?(Array)
|
|
211
|
-
value.compact.map { |v| _to_hash(v) }
|
|
212
|
-
elsif value.is_a?(Hash)
|
|
213
|
-
{}.tap do |hash|
|
|
214
|
-
value.each { |k, v| hash[k] = _to_hash(v) }
|
|
215
|
-
end
|
|
216
|
-
elsif value.respond_to? :to_hash
|
|
217
|
-
value.to_hash
|
|
218
|
-
else
|
|
219
|
-
value
|
|
220
|
-
end
|
|
221
|
-
end
|
|
222
|
-
|
|
223
166
|
end
|
|
224
167
|
|
|
225
168
|
end
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
=begin
|
|
2
2
|
#Flat API
|
|
3
3
|
|
|
4
|
-
#The Flat API allows you to easily extend the abilities of the [Flat Platform](https://flat.io), with a wide range of use cases including the following: * Creating and importing new music scores using MusicXML, MIDI, Guitar Pro
|
|
4
|
+
#The Flat API allows you to easily extend the abilities of the [Flat Platform](https://flat.io), with a wide range of use cases including the following: * Creating and importing new music scores using MusicXML, MIDI, Guitar Pro, MuseScore, ABC notation, and many other formats * Browsing, updating, copying, exporting the user's scores (for example in MP3, WAV or MIDI) * Managing educational resources with Flat for Education: creating & updating the organization accounts, the classes, rosters and assignments. The Flat API is built on HTTP. Our API is RESTful It has predictable resource URLs. It returns HTTP response codes to indicate errors. It also accepts and returns JSON in the HTTP body. The [schema](/swagger.yaml) of this API follows the [OpenAPI Initiative (OAI) specification](https://www.openapis.org/), you can use and work with [compatible Swagger tools](http://swagger.io/open-source-integrations/). This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). You can use your favorite HTTP/REST library for your programming language to use Flat's API. This specification and reference is [available on Github](https://github.com/FlatIO/api-reference). Getting Started and learn more: * [API Overview and introduction](https://flat.io/developers/docs/api/) * [Authentication (Personal Access Tokens or OAuth2)](https://flat.io/developers/docs/api/authentication.html) * [SDKs](https://flat.io/developers/docs/api/sdks.html) * [Rate Limits](https://flat.io/developers/docs/api/rate-limits.html) * [Changelog](https://flat.io/developers/docs/api/changelog.html)
|
|
5
5
|
|
|
6
|
-
The version of the OpenAPI document: 2.
|
|
6
|
+
The version of the OpenAPI document: 2.26.1
|
|
7
7
|
Contact: developers@flat.io
|
|
8
8
|
Generated by: https://openapi-generator.tech
|
|
9
|
-
|
|
9
|
+
Generator version: 7.24.0
|
|
10
10
|
|
|
11
11
|
=end
|
|
12
12
|
|
|
@@ -14,7 +14,7 @@ require 'date'
|
|
|
14
14
|
require 'time'
|
|
15
15
|
|
|
16
16
|
module FlatApi
|
|
17
|
-
class UserSigninLinkCreation
|
|
17
|
+
class UserSigninLinkCreation < ApiModelBase
|
|
18
18
|
# Path to redirect to after signin
|
|
19
19
|
attr_accessor :destination_path
|
|
20
20
|
|
|
@@ -25,9 +25,14 @@ module FlatApi
|
|
|
25
25
|
}
|
|
26
26
|
end
|
|
27
27
|
|
|
28
|
+
# Returns attribute mapping this model knows about
|
|
29
|
+
def self.acceptable_attribute_map
|
|
30
|
+
attribute_map
|
|
31
|
+
end
|
|
32
|
+
|
|
28
33
|
# Returns all the JSON keys this model knows about
|
|
29
34
|
def self.acceptable_attributes
|
|
30
|
-
|
|
35
|
+
acceptable_attribute_map.values
|
|
31
36
|
end
|
|
32
37
|
|
|
33
38
|
# Attribute type mapping.
|
|
@@ -51,9 +56,10 @@ module FlatApi
|
|
|
51
56
|
end
|
|
52
57
|
|
|
53
58
|
# check to see if the attribute exists and convert string to symbol for hash key
|
|
59
|
+
acceptable_attribute_map = self.class.acceptable_attribute_map
|
|
54
60
|
attributes = attributes.each_with_object({}) { |(k, v), h|
|
|
55
|
-
if (!
|
|
56
|
-
fail ArgumentError, "`#{k}` is not a valid attribute in `FlatApi::UserSigninLinkCreation`. Please check the name to make sure it's valid. List of attributes: " +
|
|
61
|
+
if (!acceptable_attribute_map.key?(k.to_sym))
|
|
62
|
+
fail ArgumentError, "`#{k}` is not a valid attribute in `FlatApi::UserSigninLinkCreation`. Please check the name to make sure it's valid. List of attributes: " + acceptable_attribute_map.keys.inspect
|
|
57
63
|
end
|
|
58
64
|
h[k.to_sym] = v
|
|
59
65
|
}
|
|
@@ -123,61 +129,6 @@ module FlatApi
|
|
|
123
129
|
new(transformed_hash)
|
|
124
130
|
end
|
|
125
131
|
|
|
126
|
-
# Deserializes the data based on type
|
|
127
|
-
# @param string type Data type
|
|
128
|
-
# @param string value Value to be deserialized
|
|
129
|
-
# @return [Object] Deserialized data
|
|
130
|
-
def self._deserialize(type, value)
|
|
131
|
-
case type.to_sym
|
|
132
|
-
when :Time
|
|
133
|
-
Time.parse(value)
|
|
134
|
-
when :Date
|
|
135
|
-
Date.parse(value)
|
|
136
|
-
when :String
|
|
137
|
-
value.to_s
|
|
138
|
-
when :Integer
|
|
139
|
-
value.to_i
|
|
140
|
-
when :Float
|
|
141
|
-
value.to_f
|
|
142
|
-
when :Boolean
|
|
143
|
-
if value.to_s =~ /\A(true|t|yes|y|1)\z/i
|
|
144
|
-
true
|
|
145
|
-
else
|
|
146
|
-
false
|
|
147
|
-
end
|
|
148
|
-
when :Object
|
|
149
|
-
# generic object (usually a Hash), return directly
|
|
150
|
-
value
|
|
151
|
-
when /\AArray<(?<inner_type>.+)>\z/
|
|
152
|
-
inner_type = Regexp.last_match[:inner_type]
|
|
153
|
-
value.map { |v| _deserialize(inner_type, v) }
|
|
154
|
-
when /\AHash<(?<k_type>.+?), (?<v_type>.+)>\z/
|
|
155
|
-
k_type = Regexp.last_match[:k_type]
|
|
156
|
-
v_type = Regexp.last_match[:v_type]
|
|
157
|
-
{}.tap do |hash|
|
|
158
|
-
value.each do |k, v|
|
|
159
|
-
hash[_deserialize(k_type, k)] = _deserialize(v_type, v)
|
|
160
|
-
end
|
|
161
|
-
end
|
|
162
|
-
else # model
|
|
163
|
-
# models (e.g. Pet) or oneOf
|
|
164
|
-
klass = FlatApi.const_get(type)
|
|
165
|
-
klass.respond_to?(:openapi_any_of) || klass.respond_to?(:openapi_one_of) ? klass.build(value) : klass.build_from_hash(value)
|
|
166
|
-
end
|
|
167
|
-
end
|
|
168
|
-
|
|
169
|
-
# Returns the string representation of the object
|
|
170
|
-
# @return [String] String presentation of the object
|
|
171
|
-
def to_s
|
|
172
|
-
to_hash.to_s
|
|
173
|
-
end
|
|
174
|
-
|
|
175
|
-
# to_body is an alias to to_hash (backward compatibility)
|
|
176
|
-
# @return [Hash] Returns the object in the form of hash
|
|
177
|
-
def to_body
|
|
178
|
-
to_hash
|
|
179
|
-
end
|
|
180
|
-
|
|
181
132
|
# Returns the object in the form of hash
|
|
182
133
|
# @return [Hash] Returns the object in the form of hash
|
|
183
134
|
def to_hash
|
|
@@ -194,24 +145,6 @@ module FlatApi
|
|
|
194
145
|
hash
|
|
195
146
|
end
|
|
196
147
|
|
|
197
|
-
# Outputs non-array value in the form of hash
|
|
198
|
-
# For object, use to_hash. Otherwise, just return the value
|
|
199
|
-
# @param [Object] value Any valid value
|
|
200
|
-
# @return [Hash] Returns the value in the form of hash
|
|
201
|
-
def _to_hash(value)
|
|
202
|
-
if value.is_a?(Array)
|
|
203
|
-
value.compact.map { |v| _to_hash(v) }
|
|
204
|
-
elsif value.is_a?(Hash)
|
|
205
|
-
{}.tap do |hash|
|
|
206
|
-
value.each { |k, v| hash[k] = _to_hash(v) }
|
|
207
|
-
end
|
|
208
|
-
elsif value.respond_to? :to_hash
|
|
209
|
-
value.to_hash
|
|
210
|
-
else
|
|
211
|
-
value
|
|
212
|
-
end
|
|
213
|
-
end
|
|
214
|
-
|
|
215
148
|
end
|
|
216
149
|
|
|
217
150
|
end
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'json'
|
|
4
|
+
require 'net/http'
|
|
5
|
+
require 'uri'
|
|
6
|
+
require 'flat_api/errors'
|
|
7
|
+
|
|
8
|
+
# OAuth2 support for the Flat API.
|
|
9
|
+
#
|
|
10
|
+
# The public specification declares one security scheme: OAuth2 authorization-code with 23 scopes.
|
|
11
|
+
# A Personal Access Token is an OAuth access token for your own account, so passing a token straight
|
|
12
|
+
# to the client covers both cases.
|
|
13
|
+
#
|
|
14
|
+
# A refresh token is only issued when the authorization request sets access_type=offline.
|
|
15
|
+
#
|
|
16
|
+
# This module never stores a token. Persistence is deployment-specific, so refreshed tokens go to a
|
|
17
|
+
# callback you supply.
|
|
18
|
+
module FlatApi
|
|
19
|
+
AUTHORIZE_URL = 'https://flat.io/auth/oauth'
|
|
20
|
+
TOKEN_URL = 'https://api.flat.io/oauth/access_token'
|
|
21
|
+
# Refresh slightly before nominal expiry, to avoid racing the server clock.
|
|
22
|
+
EXPIRY_SKEW = 30
|
|
23
|
+
|
|
24
|
+
Tokens = Struct.new(:access_token, :refresh_token, :expires_at, keyword_init: true) do
|
|
25
|
+
def self.from_response(payload)
|
|
26
|
+
expires_in = payload['expires_in']
|
|
27
|
+
new(
|
|
28
|
+
access_token: payload['access_token'],
|
|
29
|
+
refresh_token: payload['refresh_token'],
|
|
30
|
+
expires_at: expires_in ? Time.now.to_i + expires_in.to_i : nil
|
|
31
|
+
)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def expired?
|
|
35
|
+
!expires_at.nil? && Time.now.to_i >= expires_at - EXPIRY_SKEW
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Builds the authorization URL and exchanges codes for tokens.
|
|
40
|
+
class OAuth2Helper
|
|
41
|
+
def initialize(client_id:, client_secret:, redirect_uri:)
|
|
42
|
+
@client_id = client_id
|
|
43
|
+
@client_secret = client_secret
|
|
44
|
+
@redirect_uri = redirect_uri
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# URL to send a user to. +offline+ is what yields a refresh token.
|
|
48
|
+
def authorize_url(scopes:, state:, offline: true)
|
|
49
|
+
params = {
|
|
50
|
+
client_id: @client_id, redirect_uri: @redirect_uri, response_type: 'code',
|
|
51
|
+
scope: Array(scopes).join(' '), state: state
|
|
52
|
+
}
|
|
53
|
+
params[:access_type] = 'offline' if offline
|
|
54
|
+
"#{AUTHORIZE_URL}?#{URI.encode_www_form(params)}"
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def exchange_code(code)
|
|
58
|
+
token_request(grant_type: 'authorization_code', code: code, redirect_uri: @redirect_uri)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def refresh(refresh_token)
|
|
62
|
+
token_request(grant_type: 'refresh_token', refresh_token: refresh_token)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
private
|
|
66
|
+
|
|
67
|
+
def token_request(**payload)
|
|
68
|
+
response = Net::HTTP.post_form(
|
|
69
|
+
URI(TOKEN_URL), payload.merge(client_id: @client_id, client_secret: @client_secret)
|
|
70
|
+
)
|
|
71
|
+
unless response.is_a?(Net::HTTPSuccess)
|
|
72
|
+
raise FlatAuthenticationError.new(
|
|
73
|
+
'OAuth2 token request failed; the user must re-authorize', status: response.code.to_i
|
|
74
|
+
)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
Tokens.from_response(JSON.parse(response.body))
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# Holds the current tokens and refreshes them at most once at a time.
|
|
82
|
+
#
|
|
83
|
+
# Single-flight matters: two concurrent requests hitting an expired token must not both refresh,
|
|
84
|
+
# because the second refresh would invalidate the token the first just obtained.
|
|
85
|
+
class TokenManager
|
|
86
|
+
def initialize(tokens, helper: nil, on_token_refresh: nil)
|
|
87
|
+
@tokens = tokens
|
|
88
|
+
@helper = helper
|
|
89
|
+
@on_token_refresh = on_token_refresh
|
|
90
|
+
@mutex = Mutex.new
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
# Refreshes when the token has expired, which is the whole point of a TokenManager: a caller
|
|
94
|
+
# installs this as Configuration#access_token_getter and never thinks about expiry again.
|
|
95
|
+
# Returning @tokens.access_token unconditionally made Tokens#expired? dead code, and every
|
|
96
|
+
# request after the expiry failed with a 401 that a refresh would have avoided.
|
|
97
|
+
def access_token
|
|
98
|
+
return @tokens.access_token unless @tokens.expired?
|
|
99
|
+
|
|
100
|
+
@mutex.synchronize do
|
|
101
|
+
# Checked again inside the lock: a thread that waited here may find the token already
|
|
102
|
+
# refreshed, and refreshing twice would spend a second round trip and, with a provider
|
|
103
|
+
# that rotates refresh tokens, invalidate the one the first thread just stored.
|
|
104
|
+
next @tokens.access_token unless @tokens.expired?
|
|
105
|
+
|
|
106
|
+
refresh_locked
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
# Refreshes unconditionally. Use it to force a refresh; access_token already handles expiry.
|
|
111
|
+
def refresh
|
|
112
|
+
@mutex.synchronize { refresh_locked }
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
private
|
|
116
|
+
|
|
117
|
+
def refresh_locked
|
|
118
|
+
if @helper.nil? || @tokens.refresh_token.nil?
|
|
119
|
+
raise FlatAuthenticationError,
|
|
120
|
+
'the access token expired and no refresh token is available; re-authorize'
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
@tokens = @helper.refresh(@tokens.refresh_token)
|
|
124
|
+
@on_token_refresh&.call(@tokens)
|
|
125
|
+
@tokens.access_token
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
end
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Cursor pagination for the Flat API.
|
|
4
|
+
#
|
|
5
|
+
# Eight operations at v2.25.0 are cursor-paginated, identified by a +next+ query parameter. That
|
|
6
|
+
# parameter is a shared component (#/components/parameters/next): any tool that reads an
|
|
7
|
+
# operation's parameters without resolving $ref under-counts them and ships collections that
|
|
8
|
+
# silently truncate.
|
|
9
|
+
#
|
|
10
|
+
# The cursor is not in the response body. It arrives in the Link header, which the specification
|
|
11
|
+
# does not declare, so it is parsed at runtime.
|
|
12
|
+
require 'uri'
|
|
13
|
+
|
|
14
|
+
module FlatApi
|
|
15
|
+
module Pagination
|
|
16
|
+
LINK = /<([^>]+)>\s*;\s*rel="([^"]+)"/.freeze
|
|
17
|
+
|
|
18
|
+
module_function
|
|
19
|
+
|
|
20
|
+
# Parse an RFC 5988 Link header into { rel => url }.
|
|
21
|
+
def parse_link_header(value)
|
|
22
|
+
return {} if value.nil? || value.empty?
|
|
23
|
+
|
|
24
|
+
value.scan(LINK).to_h { |url, rel| [rel, url] }
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Extract the opaque +next+ cursor from a response's Link header, if any.
|
|
28
|
+
#
|
|
29
|
+
# Decoded, not captured raw. The cursor arrives percent-encoded inside the Link header's
|
|
30
|
+
# URL, and the client encodes whatever it is given when building the next request, so
|
|
31
|
+
# passing the encoded form through sends it encoded twice and the server rejects the very
|
|
32
|
+
# cursor it issued. URI.decode_www_form applies the rules the server used to write it, so
|
|
33
|
+
# an opaque value round-trips exactly.
|
|
34
|
+
def next_cursor(headers)
|
|
35
|
+
return nil if headers.nil?
|
|
36
|
+
|
|
37
|
+
_, link = headers.find { |k, _| k.to_s.downcase == 'link' }
|
|
38
|
+
url = parse_link_header(link)['next']
|
|
39
|
+
return nil if url.nil?
|
|
40
|
+
|
|
41
|
+
query = begin
|
|
42
|
+
URI.parse(url).query
|
|
43
|
+
rescue URI::InvalidURIError
|
|
44
|
+
nil
|
|
45
|
+
end
|
|
46
|
+
return nil if query.nil? || query.empty?
|
|
47
|
+
|
|
48
|
+
URI.decode_www_form(query).assoc('next')&.last
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Every item across all pages of a cursor-paginated operation, as a lazy Enumerator.
|
|
52
|
+
#
|
|
53
|
+
# +fetch_page+ is called with a params hash and must return [data, status, headers], which is
|
|
54
|
+
# exactly what the generated *_with_http_info methods return. The cursor lives in the headers.
|
|
55
|
+
#
|
|
56
|
+
# A token expiring mid-traversal is refreshed by the client and the traversal resumes from the
|
|
57
|
+
# same cursor, so no page is skipped or repeated.
|
|
58
|
+
#
|
|
59
|
+
# FlatApi::Pagination.paginate(user: 'me') do |params|
|
|
60
|
+
# api.get_user_scores_with_http_info('me', params)
|
|
61
|
+
# end.each { |score| puts score.title }
|
|
62
|
+
def paginate(**params, &fetch_page)
|
|
63
|
+
raise ArgumentError, 'paginate requires a block that fetches one page' unless fetch_page
|
|
64
|
+
|
|
65
|
+
Enumerator.new do |yielder|
|
|
66
|
+
# +_next+, not +next+. `next` is a Ruby keyword, so the generator names the option
|
|
67
|
+
# +:_next+ and maps it back to the +next+ query parameter itself. Passing +:next+ here
|
|
68
|
+
# sends nothing: every iteration refetches page one, the loop guard below sees a cursor it
|
|
69
|
+
# has already used, and the traversal stops after the first page while looking successful.
|
|
70
|
+
cursor = params.delete(:_next) || params.delete(:next)
|
|
71
|
+
seen = {}
|
|
72
|
+
|
|
73
|
+
loop do
|
|
74
|
+
page_params = cursor ? params.merge(_next: cursor) : params
|
|
75
|
+
data, _status, headers = fetch_page.call(page_params)
|
|
76
|
+
Array(data).each { |item| yielder << item }
|
|
77
|
+
|
|
78
|
+
cursor = next_cursor(headers)
|
|
79
|
+
break if cursor.nil?
|
|
80
|
+
# A server that returns a cursor it already gave us would loop forever.
|
|
81
|
+
break if seen[cursor]
|
|
82
|
+
|
|
83
|
+
seen[cursor] = true
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'flat_api/errors'
|
|
4
|
+
|
|
5
|
+
# Retry policy for the Flat API.
|
|
6
|
+
#
|
|
7
|
+
# Flat does not follow the usual conventions, and getting this wrong is silent:
|
|
8
|
+
# * rate limiting returns 403, not 429
|
|
9
|
+
# * there is no Retry-After header; the reset is X-RateLimit-Reset, UTC epoch seconds
|
|
10
|
+
# * a plain 403 is a genuine authorization failure and must never be retried
|
|
11
|
+
module FlatApi
|
|
12
|
+
# Methods safe to replay. A non-idempotent request that may already have been applied is not.
|
|
13
|
+
IDEMPOTENT_METHODS = %w[GET HEAD OPTIONS PUT DELETE].freeze
|
|
14
|
+
MAX_RATE_LIMIT_WAIT = 300.0
|
|
15
|
+
|
|
16
|
+
class RetryPolicy
|
|
17
|
+
attr_reader :attempts, :backoff_base, :backoff_max, :jitter, :respect_rate_limit_reset
|
|
18
|
+
|
|
19
|
+
def initialize(attempts: 3, backoff_base: 0.5, backoff_max: 30.0, jitter: 0.25,
|
|
20
|
+
respect_rate_limit_reset: true)
|
|
21
|
+
@attempts = attempts
|
|
22
|
+
@backoff_base = backoff_base
|
|
23
|
+
@backoff_max = backoff_max
|
|
24
|
+
@jitter = jitter
|
|
25
|
+
@respect_rate_limit_reset = respect_rate_limit_reset
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# No retries. Errors still arrive typed, and a rate-limit error still carries its reset.
|
|
29
|
+
def self.disabled
|
|
30
|
+
new(attempts: 1)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def enabled?
|
|
34
|
+
attempts > 1
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def should_retry?(error, method, attempt)
|
|
38
|
+
return false if attempt >= attempts
|
|
39
|
+
return false unless IDEMPOTENT_METHODS.include?(method.to_s.upcase)
|
|
40
|
+
return true if error.is_a?(FlatRateLimitError)
|
|
41
|
+
return true if error.is_a?(FlatServerError)
|
|
42
|
+
|
|
43
|
+
# A transport failure before the request was sent is safe to replay.
|
|
44
|
+
error.is_a?(IOError) || error.is_a?(SystemCallError)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def delay_for(error, attempt)
|
|
48
|
+
if respect_rate_limit_reset && error.is_a?(FlatRateLimitError) && error.reset
|
|
49
|
+
wait = error.reset - Time.now.to_i
|
|
50
|
+
return [wait + rand * jitter, MAX_RATE_LIMIT_WAIT].min if wait.positive?
|
|
51
|
+
end
|
|
52
|
+
exponential = [backoff_base * (2**(attempt - 1)), backoff_max].min
|
|
53
|
+
exponential + (rand * jitter * exponential)
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
data/lib/flat_api/version.rb
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
=begin
|
|
2
2
|
#Flat API
|
|
3
3
|
|
|
4
|
-
#The Flat API allows you to easily extend the abilities of the [Flat Platform](https://flat.io), with a wide range of use cases including the following: * Creating and importing new music scores using MusicXML, MIDI, Guitar Pro
|
|
4
|
+
#The Flat API allows you to easily extend the abilities of the [Flat Platform](https://flat.io), with a wide range of use cases including the following: * Creating and importing new music scores using MusicXML, MIDI, Guitar Pro, MuseScore, ABC notation, and many other formats * Browsing, updating, copying, exporting the user's scores (for example in MP3, WAV or MIDI) * Managing educational resources with Flat for Education: creating & updating the organization accounts, the classes, rosters and assignments. The Flat API is built on HTTP. Our API is RESTful It has predictable resource URLs. It returns HTTP response codes to indicate errors. It also accepts and returns JSON in the HTTP body. The [schema](/swagger.yaml) of this API follows the [OpenAPI Initiative (OAI) specification](https://www.openapis.org/), you can use and work with [compatible Swagger tools](http://swagger.io/open-source-integrations/). This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). You can use your favorite HTTP/REST library for your programming language to use Flat's API. This specification and reference is [available on Github](https://github.com/FlatIO/api-reference). Getting Started and learn more: * [API Overview and introduction](https://flat.io/developers/docs/api/) * [Authentication (Personal Access Tokens or OAuth2)](https://flat.io/developers/docs/api/authentication.html) * [SDKs](https://flat.io/developers/docs/api/sdks.html) * [Rate Limits](https://flat.io/developers/docs/api/rate-limits.html) * [Changelog](https://flat.io/developers/docs/api/changelog.html)
|
|
5
5
|
|
|
6
|
-
The version of the OpenAPI document: 2.
|
|
6
|
+
The version of the OpenAPI document: 2.26.1
|
|
7
7
|
Contact: developers@flat.io
|
|
8
8
|
Generated by: https://openapi-generator.tech
|
|
9
|
-
|
|
9
|
+
Generator version: 7.24.0
|
|
10
10
|
|
|
11
11
|
=end
|
|
12
12
|
|
|
13
13
|
module FlatApi
|
|
14
|
-
VERSION = '0.
|
|
14
|
+
VERSION = '1.0.0'
|
|
15
15
|
end
|