dropbox-sign 1.0.0.pre.beta2301

Sign up to get free protection for your applications and to get access to all the features.
Files changed (552) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +10 -0
  3. data/Gemfile.lock +78 -0
  4. data/LICENSE +21 -0
  5. data/README.md +333 -0
  6. data/Rakefile +10 -0
  7. data/bin/generate-examples.php +269 -0
  8. data/bin/php +16 -0
  9. data/bin/replace +11 -0
  10. data/bin/ruby +16 -0
  11. data/bin/scan_for +32 -0
  12. data/composer.json +10 -0
  13. data/composer.lock +246 -0
  14. data/docs/AccountApi.md +301 -0
  15. data/docs/AccountCreateRequest.md +13 -0
  16. data/docs/AccountCreateResponse.md +12 -0
  17. data/docs/AccountGetResponse.md +11 -0
  18. data/docs/AccountResponse.md +19 -0
  19. data/docs/AccountResponseQuotas.md +14 -0
  20. data/docs/AccountUpdateRequest.md +12 -0
  21. data/docs/AccountVerifyRequest.md +10 -0
  22. data/docs/AccountVerifyResponse.md +11 -0
  23. data/docs/AccountVerifyResponseAccount.md +10 -0
  24. data/docs/ApiAppApi.md +402 -0
  25. data/docs/ApiAppCreateRequest.md +16 -0
  26. data/docs/ApiAppGetResponse.md +11 -0
  27. data/docs/ApiAppListResponse.md +12 -0
  28. data/docs/ApiAppResponse.md +19 -0
  29. data/docs/ApiAppResponseOAuth.md +13 -0
  30. data/docs/ApiAppResponseOptions.md +10 -0
  31. data/docs/ApiAppResponseOwnerAccount.md +11 -0
  32. data/docs/ApiAppResponseWhiteLabelingOptions.md +23 -0
  33. data/docs/ApiAppUpdateRequest.md +16 -0
  34. data/docs/BulkSendJobApi.md +155 -0
  35. data/docs/BulkSendJobGetResponse.md +13 -0
  36. data/docs/BulkSendJobGetResponseSignatureRequests.md +33 -0
  37. data/docs/BulkSendJobListResponse.md +12 -0
  38. data/docs/BulkSendJobResponse.md +13 -0
  39. data/docs/BulkSendJobSendResponse.md +11 -0
  40. data/docs/EmbeddedApi.md +158 -0
  41. data/docs/EmbeddedEditUrlRequest.md +19 -0
  42. data/docs/EmbeddedEditUrlResponse.md +11 -0
  43. data/docs/EmbeddedEditUrlResponseEmbedded.md +11 -0
  44. data/docs/EmbeddedSignUrlResponse.md +11 -0
  45. data/docs/EmbeddedSignUrlResponseEmbedded.md +11 -0
  46. data/docs/ErrorResponse.md +10 -0
  47. data/docs/ErrorResponseError.md +12 -0
  48. data/docs/EventCallbackRequest.md +13 -0
  49. data/docs/EventCallbackRequestEvent.md +13 -0
  50. data/docs/EventCallbackRequestEventMetadata.md +13 -0
  51. data/docs/FileResponse.md +11 -0
  52. data/docs/FileResponseDataUri.md +10 -0
  53. data/docs/ListInfoResponse.md +13 -0
  54. data/docs/OAuthApi.md +158 -0
  55. data/docs/OAuthTokenGenerateRequest.md +14 -0
  56. data/docs/OAuthTokenRefreshRequest.md +11 -0
  57. data/docs/OAuthTokenResponse.md +14 -0
  58. data/docs/ReportApi.md +83 -0
  59. data/docs/ReportCreateRequest.md +12 -0
  60. data/docs/ReportCreateResponse.md +11 -0
  61. data/docs/ReportResponse.md +13 -0
  62. data/docs/SignatureRequestApi.md +1377 -0
  63. data/docs/SignatureRequestBulkCreateEmbeddedWithTemplateRequest.md +22 -0
  64. data/docs/SignatureRequestBulkSendWithTemplateRequest.md +22 -0
  65. data/docs/SignatureRequestCreateEmbeddedRequest.md +33 -0
  66. data/docs/SignatureRequestCreateEmbeddedWithTemplateRequest.md +24 -0
  67. data/docs/SignatureRequestGetResponse.md +11 -0
  68. data/docs/SignatureRequestListResponse.md +12 -0
  69. data/docs/SignatureRequestRemindRequest.md +11 -0
  70. data/docs/SignatureRequestResponse.md +32 -0
  71. data/docs/SignatureRequestResponseAttachment.md +15 -0
  72. data/docs/SignatureRequestResponseCustomFieldBase.md +17 -0
  73. data/docs/SignatureRequestResponseCustomFieldCheckbox.md +11 -0
  74. data/docs/SignatureRequestResponseCustomFieldText.md +11 -0
  75. data/docs/SignatureRequestResponseCustomFieldTypeEnum.md +9 -0
  76. data/docs/SignatureRequestResponseDataBase.md +14 -0
  77. data/docs/SignatureRequestResponseDataTypeEnum.md +9 -0
  78. data/docs/SignatureRequestResponseDataValueCheckbox.md +11 -0
  79. data/docs/SignatureRequestResponseDataValueCheckboxMerge.md +11 -0
  80. data/docs/SignatureRequestResponseDataValueDateSigned.md +11 -0
  81. data/docs/SignatureRequestResponseDataValueDropdown.md +11 -0
  82. data/docs/SignatureRequestResponseDataValueInitials.md +11 -0
  83. data/docs/SignatureRequestResponseDataValueRadio.md +11 -0
  84. data/docs/SignatureRequestResponseDataValueSignature.md +11 -0
  85. data/docs/SignatureRequestResponseDataValueText.md +11 -0
  86. data/docs/SignatureRequestResponseDataValueTextMerge.md +11 -0
  87. data/docs/SignatureRequestResponseSignatures.md +28 -0
  88. data/docs/SignatureRequestSendRequest.md +34 -0
  89. data/docs/SignatureRequestSendWithTemplateRequest.md +25 -0
  90. data/docs/SignatureRequestUpdateRequest.md +13 -0
  91. data/docs/SubAttachment.md +13 -0
  92. data/docs/SubBulkSignerList.md +11 -0
  93. data/docs/SubBulkSignerListCustomField.md +11 -0
  94. data/docs/SubCC.md +11 -0
  95. data/docs/SubCustomField.md +17 -0
  96. data/docs/SubEditorOptions.md +11 -0
  97. data/docs/SubFieldOptions.md +10 -0
  98. data/docs/SubFormFieldGroup.md +12 -0
  99. data/docs/SubFormFieldRule.md +13 -0
  100. data/docs/SubFormFieldRuleAction.md +13 -0
  101. data/docs/SubFormFieldRuleTrigger.md +13 -0
  102. data/docs/SubFormFieldsPerDocumentBase.md +33 -0
  103. data/docs/SubFormFieldsPerDocumentCheckbox.md +12 -0
  104. data/docs/SubFormFieldsPerDocumentCheckboxMerge.md +10 -0
  105. data/docs/SubFormFieldsPerDocumentDateSigned.md +10 -0
  106. data/docs/SubFormFieldsPerDocumentDropdown.md +12 -0
  107. data/docs/SubFormFieldsPerDocumentHyperlink.md +12 -0
  108. data/docs/SubFormFieldsPerDocumentInitials.md +10 -0
  109. data/docs/SubFormFieldsPerDocumentRadio.md +12 -0
  110. data/docs/SubFormFieldsPerDocumentSignature.md +10 -0
  111. data/docs/SubFormFieldsPerDocumentText.md +17 -0
  112. data/docs/SubFormFieldsPerDocumentTextMerge.md +10 -0
  113. data/docs/SubFormFieldsPerDocumentTypeEnum.md +9 -0
  114. data/docs/SubMergeField.md +11 -0
  115. data/docs/SubOAuth.md +11 -0
  116. data/docs/SubOptions.md +10 -0
  117. data/docs/SubSignatureRequestGroupedSigners.md +12 -0
  118. data/docs/SubSignatureRequestSigner.md +15 -0
  119. data/docs/SubSignatureRequestTemplateSigner.md +15 -0
  120. data/docs/SubSigningOptions.md +16 -0
  121. data/docs/SubTeamResponse.md +11 -0
  122. data/docs/SubTemplateRole.md +11 -0
  123. data/docs/SubUnclaimedDraftSigner.md +12 -0
  124. data/docs/SubUnclaimedDraftTemplateSigner.md +12 -0
  125. data/docs/SubWhiteLabelingOptions.md +26 -0
  126. data/docs/TeamAddMemberRequest.md +12 -0
  127. data/docs/TeamApi.md +737 -0
  128. data/docs/TeamCreateRequest.md +10 -0
  129. data/docs/TeamGetInfoResponse.md +11 -0
  130. data/docs/TeamGetResponse.md +11 -0
  131. data/docs/TeamInfoResponse.md +14 -0
  132. data/docs/TeamInviteResponse.md +15 -0
  133. data/docs/TeamInvitesResponse.md +11 -0
  134. data/docs/TeamMemberResponse.md +12 -0
  135. data/docs/TeamMembersResponse.md +12 -0
  136. data/docs/TeamParentResponse.md +11 -0
  137. data/docs/TeamRemoveMemberRequest.md +14 -0
  138. data/docs/TeamResponse.md +12 -0
  139. data/docs/TeamSubTeamsResponse.md +12 -0
  140. data/docs/TeamUpdateRequest.md +10 -0
  141. data/docs/TemplateAddUserRequest.md +12 -0
  142. data/docs/TemplateApi.md +782 -0
  143. data/docs/TemplateCreateEmbeddedDraftRequest.md +34 -0
  144. data/docs/TemplateCreateEmbeddedDraftResponse.md +11 -0
  145. data/docs/TemplateCreateEmbeddedDraftResponseTemplate.md +13 -0
  146. data/docs/TemplateEditResponse.md +10 -0
  147. data/docs/TemplateGetResponse.md +11 -0
  148. data/docs/TemplateListResponse.md +12 -0
  149. data/docs/TemplateRemoveUserRequest.md +11 -0
  150. data/docs/TemplateResponse.md +24 -0
  151. data/docs/TemplateResponseAccount.md +15 -0
  152. data/docs/TemplateResponseAccountQuota.md +13 -0
  153. data/docs/TemplateResponseCCRole.md +10 -0
  154. data/docs/TemplateResponseCustomField.md +22 -0
  155. data/docs/TemplateResponseDocument.md +15 -0
  156. data/docs/TemplateResponseDocumentCustomField.md +25 -0
  157. data/docs/TemplateResponseDocumentFieldGroup.md +11 -0
  158. data/docs/TemplateResponseDocumentFormField.md +23 -0
  159. data/docs/TemplateResponseDocumentStaticField.md +19 -0
  160. data/docs/TemplateResponseFieldAvgTextLength.md +11 -0
  161. data/docs/TemplateResponseNamedFormField.md +23 -0
  162. data/docs/TemplateResponseSignerRole.md +11 -0
  163. data/docs/TemplateUpdateFilesRequest.md +15 -0
  164. data/docs/TemplateUpdateFilesResponse.md +10 -0
  165. data/docs/TemplateUpdateFilesResponseTemplate.md +11 -0
  166. data/docs/UnclaimedDraftApi.md +359 -0
  167. data/docs/UnclaimedDraftCreateEmbeddedRequest.md +45 -0
  168. data/docs/UnclaimedDraftCreateEmbeddedWithTemplateRequest.md +38 -0
  169. data/docs/UnclaimedDraftCreateRequest.md +33 -0
  170. data/docs/UnclaimedDraftCreateResponse.md +11 -0
  171. data/docs/UnclaimedDraftEditAndResendRequest.md +17 -0
  172. data/docs/UnclaimedDraftResponse.md +15 -0
  173. data/docs/WarningResponse.md +11 -0
  174. data/dropbox-sign.gemspec +38 -0
  175. data/examples/AccountCreate.rb +21 -0
  176. data/examples/AccountGet.rb +18 -0
  177. data/examples/AccountUpdate.rb +21 -0
  178. data/examples/AccountVerify.rb +21 -0
  179. data/examples/ApiAppCreate.rb +35 -0
  180. data/examples/ApiAppDelete.rb +20 -0
  181. data/examples/ApiAppGet.rb +20 -0
  182. data/examples/ApiAppList.rb +21 -0
  183. data/examples/ApiAppUpdate.rb +32 -0
  184. data/examples/BulkSendJobGet.rb +20 -0
  185. data/examples/BulkSendJobList.rb +21 -0
  186. data/examples/EmbeddedEditUrl.rb +24 -0
  187. data/examples/EmbeddedSignUrl.rb +20 -0
  188. data/examples/EventCallback.rb +32 -0
  189. data/examples/OauthTokenGenerate.rb +24 -0
  190. data/examples/OauthTokenRefresh.rb +21 -0
  191. data/examples/ReportCreate.rb +23 -0
  192. data/examples/SignatureRequestBulkCreateEmbeddedWithTemplate.rb +59 -0
  193. data/examples/SignatureRequestBulkSendWithTemplate.rb +58 -0
  194. data/examples/SignatureRequestCancel.rb +20 -0
  195. data/examples/SignatureRequestCreateEmbedded.rb +46 -0
  196. data/examples/SignatureRequestCreateEmbeddedWithTemplate.rb +39 -0
  197. data/examples/SignatureRequestFiles.rb +20 -0
  198. data/examples/SignatureRequestFilesAsDataUri.rb +20 -0
  199. data/examples/SignatureRequestFilesAsFileUrl.rb +20 -0
  200. data/examples/SignatureRequestGet.rb +20 -0
  201. data/examples/SignatureRequestList.rb +21 -0
  202. data/examples/SignatureRequestReleaseHold.rb +20 -0
  203. data/examples/SignatureRequestRemind.rb +23 -0
  204. data/examples/SignatureRequestRemove.rb +20 -0
  205. data/examples/SignatureRequestSend.rb +56 -0
  206. data/examples/SignatureRequestSendWithTemplate.rb +50 -0
  207. data/examples/SignatureRequestUpdate.rb +24 -0
  208. data/examples/TeamAddMember.rb +21 -0
  209. data/examples/TeamCreate.rb +21 -0
  210. data/examples/TeamDelete.rb +18 -0
  211. data/examples/TeamGet.rb +18 -0
  212. data/examples/TeamInfo.rb +18 -0
  213. data/examples/TeamInvites.rb +20 -0
  214. data/examples/TeamMembers.rb +20 -0
  215. data/examples/TeamRemoveMember.rb +22 -0
  216. data/examples/TeamSubTeams.rb +20 -0
  217. data/examples/TeamUpdate.rb +21 -0
  218. data/examples/TemplateAddUser.rb +23 -0
  219. data/examples/TemplateCreateEmbeddedDraft.rb +49 -0
  220. data/examples/TemplateDelete.rb +20 -0
  221. data/examples/TemplateFiles.rb +20 -0
  222. data/examples/TemplateFilesAsDataUri.rb +20 -0
  223. data/examples/TemplateFilesAsFileUrl.rb +20 -0
  224. data/examples/TemplateGet.rb +20 -0
  225. data/examples/TemplateList.rb +20 -0
  226. data/examples/TemplateRemoveUser.rb +23 -0
  227. data/examples/TemplateUpdateFiles.rb +23 -0
  228. data/examples/UnclaimedDraftCreate.rb +56 -0
  229. data/examples/UnclaimedDraftCreateEmbedded.rb +24 -0
  230. data/examples/UnclaimedDraftCreateEmbeddedWithTemplate.rb +35 -0
  231. data/examples/UnclaimedDraftEditAndResend.rb +24 -0
  232. data/lib/dropbox-sign/api/account_api.rb +446 -0
  233. data/lib/dropbox-sign/api/api_app_api.rb +504 -0
  234. data/lib/dropbox-sign/api/bulk_send_job_api.rb +213 -0
  235. data/lib/dropbox-sign/api/embedded_api.rb +234 -0
  236. data/lib/dropbox-sign/api/o_auth_api.rb +215 -0
  237. data/lib/dropbox-sign/api/report_api.rb +134 -0
  238. data/lib/dropbox-sign/api/signature_request_api.rb +1620 -0
  239. data/lib/dropbox-sign/api/team_api.rb +1011 -0
  240. data/lib/dropbox-sign/api/template_api.rb +1037 -0
  241. data/lib/dropbox-sign/api/unclaimed_draft_api.rb +467 -0
  242. data/lib/dropbox-sign/api_client.rb +417 -0
  243. data/lib/dropbox-sign/api_error.rb +60 -0
  244. data/lib/dropbox-sign/configuration.rb +303 -0
  245. data/lib/dropbox-sign/event_callback_helper.rb +54 -0
  246. data/lib/dropbox-sign/models/account_create_request.rb +285 -0
  247. data/lib/dropbox-sign/models/account_create_response.rb +270 -0
  248. data/lib/dropbox-sign/models/account_get_response.rb +261 -0
  249. data/lib/dropbox-sign/models/account_response.rb +343 -0
  250. data/lib/dropbox-sign/models/account_response_quotas.rb +296 -0
  251. data/lib/dropbox-sign/models/account_update_request.rb +271 -0
  252. data/lib/dropbox-sign/models/account_verify_request.rb +255 -0
  253. data/lib/dropbox-sign/models/account_verify_response.rb +261 -0
  254. data/lib/dropbox-sign/models/account_verify_response_account.rb +250 -0
  255. data/lib/dropbox-sign/models/api_app_create_request.rb +347 -0
  256. data/lib/dropbox-sign/models/api_app_get_response.rb +261 -0
  257. data/lib/dropbox-sign/models/api_app_list_response.rb +273 -0
  258. data/lib/dropbox-sign/models/api_app_response.rb +343 -0
  259. data/lib/dropbox-sign/models/api_app_response_o_auth.rb +283 -0
  260. data/lib/dropbox-sign/models/api_app_response_options.rb +251 -0
  261. data/lib/dropbox-sign/models/api_app_response_owner_account.rb +261 -0
  262. data/lib/dropbox-sign/models/api_app_response_white_labeling_options.rb +367 -0
  263. data/lib/dropbox-sign/models/api_app_update_request.rb +324 -0
  264. data/lib/dropbox-sign/models/bulk_send_job_get_response.rb +282 -0
  265. data/lib/dropbox-sign/models/bulk_send_job_get_response_signature_requests.rb +503 -0
  266. data/lib/dropbox-sign/models/bulk_send_job_list_response.rb +273 -0
  267. data/lib/dropbox-sign/models/bulk_send_job_response.rb +282 -0
  268. data/lib/dropbox-sign/models/bulk_send_job_send_response.rb +261 -0
  269. data/lib/dropbox-sign/models/embedded_edit_url_request.rb +357 -0
  270. data/lib/dropbox-sign/models/embedded_edit_url_response.rb +261 -0
  271. data/lib/dropbox-sign/models/embedded_edit_url_response_embedded.rb +261 -0
  272. data/lib/dropbox-sign/models/embedded_sign_url_response.rb +261 -0
  273. data/lib/dropbox-sign/models/embedded_sign_url_response_embedded.rb +261 -0
  274. data/lib/dropbox-sign/models/error_response.rb +254 -0
  275. data/lib/dropbox-sign/models/error_response_error.rb +281 -0
  276. data/lib/dropbox-sign/models/event_callback_request.rb +281 -0
  277. data/lib/dropbox-sign/models/event_callback_request_event.rb +334 -0
  278. data/lib/dropbox-sign/models/event_callback_request_event_metadata.rb +285 -0
  279. data/lib/dropbox-sign/models/file_response.rb +260 -0
  280. data/lib/dropbox-sign/models/file_response_data_uri.rb +250 -0
  281. data/lib/dropbox-sign/models/list_info_response.rb +282 -0
  282. data/lib/dropbox-sign/models/o_auth_token_generate_request.rb +317 -0
  283. data/lib/dropbox-sign/models/o_auth_token_refresh_request.rb +272 -0
  284. data/lib/dropbox-sign/models/o_auth_token_response.rb +287 -0
  285. data/lib/dropbox-sign/models/report_create_request.rb +319 -0
  286. data/lib/dropbox-sign/models/report_create_response.rb +261 -0
  287. data/lib/dropbox-sign/models/report_response.rb +305 -0
  288. data/lib/dropbox-sign/models/signature_request_bulk_create_embedded_with_template_request.rb +445 -0
  289. data/lib/dropbox-sign/models/signature_request_bulk_send_with_template_request.rb +440 -0
  290. data/lib/dropbox-sign/models/signature_request_create_embedded_request.rb +569 -0
  291. data/lib/dropbox-sign/models/signature_request_create_embedded_with_template_request.rb +475 -0
  292. data/lib/dropbox-sign/models/signature_request_get_response.rb +261 -0
  293. data/lib/dropbox-sign/models/signature_request_list_response.rb +273 -0
  294. data/lib/dropbox-sign/models/signature_request_remind_request.rb +265 -0
  295. data/lib/dropbox-sign/models/signature_request_response.rb +494 -0
  296. data/lib/dropbox-sign/models/signature_request_response_attachment.rb +323 -0
  297. data/lib/dropbox-sign/models/signature_request_response_custom_field_base.rb +316 -0
  298. data/lib/dropbox-sign/models/signature_request_response_custom_field_checkbox.rb +272 -0
  299. data/lib/dropbox-sign/models/signature_request_response_custom_field_text.rb +272 -0
  300. data/lib/dropbox-sign/models/signature_request_response_custom_field_type_enum.rb +40 -0
  301. data/lib/dropbox-sign/models/signature_request_response_data_base.rb +326 -0
  302. data/lib/dropbox-sign/models/signature_request_response_data_type_enum.rb +47 -0
  303. data/lib/dropbox-sign/models/signature_request_response_data_value_checkbox.rb +266 -0
  304. data/lib/dropbox-sign/models/signature_request_response_data_value_checkbox_merge.rb +266 -0
  305. data/lib/dropbox-sign/models/signature_request_response_data_value_date_signed.rb +266 -0
  306. data/lib/dropbox-sign/models/signature_request_response_data_value_dropdown.rb +266 -0
  307. data/lib/dropbox-sign/models/signature_request_response_data_value_initials.rb +266 -0
  308. data/lib/dropbox-sign/models/signature_request_response_data_value_radio.rb +266 -0
  309. data/lib/dropbox-sign/models/signature_request_response_data_value_signature.rb +266 -0
  310. data/lib/dropbox-sign/models/signature_request_response_data_value_text.rb +266 -0
  311. data/lib/dropbox-sign/models/signature_request_response_data_value_text_merge.rb +266 -0
  312. data/lib/dropbox-sign/models/signature_request_response_signatures.rb +446 -0
  313. data/lib/dropbox-sign/models/signature_request_send_request.rb +574 -0
  314. data/lib/dropbox-sign/models/signature_request_send_with_template_request.rb +480 -0
  315. data/lib/dropbox-sign/models/signature_request_update_request.rb +286 -0
  316. data/lib/dropbox-sign/models/sub_attachment.rb +292 -0
  317. data/lib/dropbox-sign/models/sub_bulk_signer_list.rb +264 -0
  318. data/lib/dropbox-sign/models/sub_bulk_signer_list_custom_field.rb +270 -0
  319. data/lib/dropbox-sign/models/sub_cc.rb +270 -0
  320. data/lib/dropbox-sign/models/sub_custom_field.rb +288 -0
  321. data/lib/dropbox-sign/models/sub_editor_options.rb +265 -0
  322. data/lib/dropbox-sign/models/sub_field_options.rb +290 -0
  323. data/lib/dropbox-sign/models/sub_form_field_group.rb +285 -0
  324. data/lib/dropbox-sign/models/sub_form_field_rule.rb +353 -0
  325. data/lib/dropbox-sign/models/sub_form_field_rule_action.rb +323 -0
  326. data/lib/dropbox-sign/models/sub_form_field_rule_trigger.rb +326 -0
  327. data/lib/dropbox-sign/models/sub_form_fields_per_document_base.rb +435 -0
  328. data/lib/dropbox-sign/models/sub_form_fields_per_document_checkbox.rb +287 -0
  329. data/lib/dropbox-sign/models/sub_form_fields_per_document_checkbox_merge.rb +262 -0
  330. data/lib/dropbox-sign/models/sub_form_fields_per_document_date_signed.rb +262 -0
  331. data/lib/dropbox-sign/models/sub_form_fields_per_document_dropdown.rb +308 -0
  332. data/lib/dropbox-sign/models/sub_form_fields_per_document_hyperlink.rb +292 -0
  333. data/lib/dropbox-sign/models/sub_form_fields_per_document_initials.rb +262 -0
  334. data/lib/dropbox-sign/models/sub_form_fields_per_document_radio.rb +292 -0
  335. data/lib/dropbox-sign/models/sub_form_fields_per_document_signature.rb +262 -0
  336. data/lib/dropbox-sign/models/sub_form_fields_per_document_text.rb +364 -0
  337. data/lib/dropbox-sign/models/sub_form_fields_per_document_text_merge.rb +262 -0
  338. data/lib/dropbox-sign/models/sub_form_fields_per_document_type_enum.rb +48 -0
  339. data/lib/dropbox-sign/models/sub_merge_field.rb +304 -0
  340. data/lib/dropbox-sign/models/sub_o_auth.rb +285 -0
  341. data/lib/dropbox-sign/models/sub_options.rb +253 -0
  342. data/lib/dropbox-sign/models/sub_signature_request_grouped_signers.rb +283 -0
  343. data/lib/dropbox-sign/models/sub_signature_request_signer.rb +369 -0
  344. data/lib/dropbox-sign/models/sub_signature_request_template_signer.rb +373 -0
  345. data/lib/dropbox-sign/models/sub_signing_options.rb +338 -0
  346. data/lib/dropbox-sign/models/sub_team_response.rb +260 -0
  347. data/lib/dropbox-sign/models/sub_template_role.rb +261 -0
  348. data/lib/dropbox-sign/models/sub_unclaimed_draft_signer.rb +281 -0
  349. data/lib/dropbox-sign/models/sub_unclaimed_draft_template_signer.rb +285 -0
  350. data/lib/dropbox-sign/models/sub_white_labeling_options.rb +439 -0
  351. data/lib/dropbox-sign/models/team_add_member_request.rb +304 -0
  352. data/lib/dropbox-sign/models/team_create_request.rb +252 -0
  353. data/lib/dropbox-sign/models/team_get_info_response.rb +261 -0
  354. data/lib/dropbox-sign/models/team_get_response.rb +261 -0
  355. data/lib/dropbox-sign/models/team_info_response.rb +290 -0
  356. data/lib/dropbox-sign/models/team_invite_response.rb +300 -0
  357. data/lib/dropbox-sign/models/team_invites_response.rb +263 -0
  358. data/lib/dropbox-sign/models/team_member_response.rb +270 -0
  359. data/lib/dropbox-sign/models/team_members_response.rb +272 -0
  360. data/lib/dropbox-sign/models/team_parent_response.rb +261 -0
  361. data/lib/dropbox-sign/models/team_remove_member_request.rb +324 -0
  362. data/lib/dropbox-sign/models/team_response.rb +274 -0
  363. data/lib/dropbox-sign/models/team_sub_teams_response.rb +272 -0
  364. data/lib/dropbox-sign/models/team_update_request.rb +250 -0
  365. data/lib/dropbox-sign/models/template_add_user_request.rb +272 -0
  366. data/lib/dropbox-sign/models/template_create_embedded_draft_request.rb +567 -0
  367. data/lib/dropbox-sign/models/template_create_embedded_draft_response.rb +261 -0
  368. data/lib/dropbox-sign/models/template_create_embedded_draft_response_template.rb +283 -0
  369. data/lib/dropbox-sign/models/template_edit_response.rb +250 -0
  370. data/lib/dropbox-sign/models/template_get_response.rb +261 -0
  371. data/lib/dropbox-sign/models/template_list_response.rb +273 -0
  372. data/lib/dropbox-sign/models/template_remove_user_request.rb +260 -0
  373. data/lib/dropbox-sign/models/template_response.rb +410 -0
  374. data/lib/dropbox-sign/models/template_response_account.rb +299 -0
  375. data/lib/dropbox-sign/models/template_response_account_quota.rb +281 -0
  376. data/lib/dropbox-sign/models/template_response_cc_role.rb +250 -0
  377. data/lib/dropbox-sign/models/template_response_custom_field.rb +407 -0
  378. data/lib/dropbox-sign/models/template_response_document.rb +309 -0
  379. data/lib/dropbox-sign/models/template_response_document_custom_field.rb +438 -0
  380. data/lib/dropbox-sign/models/template_response_document_field_group.rb +260 -0
  381. data/lib/dropbox-sign/models/template_response_document_form_field.rb +417 -0
  382. data/lib/dropbox-sign/models/template_response_document_static_field.rb +341 -0
  383. data/lib/dropbox-sign/models/template_response_field_avg_text_length.rb +261 -0
  384. data/lib/dropbox-sign/models/template_response_named_form_field.rb +383 -0
  385. data/lib/dropbox-sign/models/template_response_signer_role.rb +260 -0
  386. data/lib/dropbox-sign/models/template_update_files_request.rb +336 -0
  387. data/lib/dropbox-sign/models/template_update_files_response.rb +249 -0
  388. data/lib/dropbox-sign/models/template_update_files_response_template.rb +263 -0
  389. data/lib/dropbox-sign/models/unclaimed_draft_create_embedded_request.rb +728 -0
  390. data/lib/dropbox-sign/models/unclaimed_draft_create_embedded_with_template_request.rb +631 -0
  391. data/lib/dropbox-sign/models/unclaimed_draft_create_request.rb +586 -0
  392. data/lib/dropbox-sign/models/unclaimed_draft_create_response.rb +261 -0
  393. data/lib/dropbox-sign/models/unclaimed_draft_edit_and_resend_request.rb +328 -0
  394. data/lib/dropbox-sign/models/unclaimed_draft_response.rb +305 -0
  395. data/lib/dropbox-sign/models/warning_response.rb +271 -0
  396. data/lib/dropbox-sign/version.rb +18 -0
  397. data/lib/dropbox-sign.rb +204 -0
  398. data/openapi-config.yaml +21 -0
  399. data/openapi-sdk.yaml +11080 -0
  400. data/run-build +53 -0
  401. data/spec/api/account_api_spec.rb +107 -0
  402. data/spec/api/api_app_api_spec.rb +95 -0
  403. data/spec/api/bulk_send_job_api_spec.rb +52 -0
  404. data/spec/api/embedded_api_spec.rb +55 -0
  405. data/spec/api/oauth_api_spec.rb +55 -0
  406. data/spec/api/report_api_spec.rb +38 -0
  407. data/spec/api/signature_request_api_spec.rb +263 -0
  408. data/spec/api/team_api_spec.rb +105 -0
  409. data/spec/api/template_api_spec.rb +147 -0
  410. data/spec/api/unclaimed_draft_api_spec.rb +95 -0
  411. data/spec/api_client_spec.rb +226 -0
  412. data/spec/configuration_spec.rb +42 -0
  413. data/spec/event_callback_helper_spec.rb +22 -0
  414. data/spec/fixtures_spec.rb +59 -0
  415. data/spec/models/sub_form_fields_per_document_base_spec.rb +24 -0
  416. data/spec/spec_helper.rb +111 -0
  417. data/spec/test_utils.rb +19 -0
  418. data/templates/Gemfile.mustache +10 -0
  419. data/templates/README.mustache +133 -0
  420. data/templates/Rakefile.mustache +10 -0
  421. data/templates/api.mustache +283 -0
  422. data/templates/api_client.mustache +291 -0
  423. data/templates/api_client_faraday_partial.mustache +136 -0
  424. data/templates/api_client_spec.mustache +220 -0
  425. data/templates/api_client_typhoeus_partial.mustache +153 -0
  426. data/templates/api_doc.mustache +77 -0
  427. data/templates/api_error.mustache +52 -0
  428. data/templates/api_info.mustache +12 -0
  429. data/templates/api_test.mustache +47 -0
  430. data/templates/base_object.mustache +132 -0
  431. data/templates/configuration.mustache +372 -0
  432. data/templates/configuration_spec.mustache +34 -0
  433. data/templates/configuration_tls_faraday_partial.mustache +29 -0
  434. data/templates/configuration_tls_typhoeus_partial.mustache +34 -0
  435. data/templates/event_callback_helper.mustache +46 -0
  436. data/templates/gem.mustache +55 -0
  437. data/templates/gemspec.mustache +35 -0
  438. data/templates/git_push.sh.mustache +57 -0
  439. data/templates/gitignore.mustache +41 -0
  440. data/templates/model.mustache +29 -0
  441. data/templates/model_doc.mustache +12 -0
  442. data/templates/model_test.mustache +77 -0
  443. data/templates/partial_model_enum_class.mustache +20 -0
  444. data/templates/partial_model_generic.mustache +414 -0
  445. data/templates/partial_model_generic_doc.mustache +10 -0
  446. data/templates/partial_oneof_module.mustache +137 -0
  447. data/templates/partial_oneof_module_doc.mustache +92 -0
  448. data/templates/rspec.mustache +2 -0
  449. data/templates/rubocop.mustache +148 -0
  450. data/templates/spec_helper.mustache +103 -0
  451. data/templates/travis.mustache +14 -0
  452. data/templates/version.mustache +10 -0
  453. data/test_fixtures/AccountCreateRequest.json +7 -0
  454. data/test_fixtures/AccountCreateResponse.json +15 -0
  455. data/test_fixtures/AccountGetResponse.json +14 -0
  456. data/test_fixtures/AccountUpdateRequest.json +5 -0
  457. data/test_fixtures/AccountVerifyRequest.json +5 -0
  458. data/test_fixtures/AccountVerifyResponse.json +7 -0
  459. data/test_fixtures/ApiAppCreateRequest.json +35 -0
  460. data/test_fixtures/ApiAppGetResponse.json +27 -0
  461. data/test_fixtures/ApiAppListResponse.json +42 -0
  462. data/test_fixtures/ApiAppUpdateRequest.json +35 -0
  463. data/test_fixtures/BulkSendJobGetResponse.json +67 -0
  464. data/test_fixtures/BulkSendJobListResponse.json +24 -0
  465. data/test_fixtures/BulkSendJobSendResponse.json +10 -0
  466. data/test_fixtures/EmbeddedEditUrlRequest.json +28 -0
  467. data/test_fixtures/EmbeddedEditUrlResponse.json +8 -0
  468. data/test_fixtures/EmbeddedSignUrlResponse.json +8 -0
  469. data/test_fixtures/ErrorResponse.json +9 -0
  470. data/test_fixtures/EventCallbackHelper.json +50 -0
  471. data/test_fixtures/FileResponse.json +6 -0
  472. data/test_fixtures/OAuthTokenGenerateRequest.json +9 -0
  473. data/test_fixtures/OAuthTokenRefreshRequest.json +6 -0
  474. data/test_fixtures/OAuthTokenResponse.json +15 -0
  475. data/test_fixtures/ReportCreateRequest.json +10 -0
  476. data/test_fixtures/ReportCreateResponse.json +13 -0
  477. data/test_fixtures/SignatureRequestBulkCreateEmbeddedWithTemplateRequest.json +67 -0
  478. data/test_fixtures/SignatureRequestBulkSendWithTemplateRequest.json +66 -0
  479. data/test_fixtures/SignatureRequestCreateEmbeddedRequest.json +252 -0
  480. data/test_fixtures/SignatureRequestCreateEmbeddedWithTemplateRequest.json +60 -0
  481. data/test_fixtures/SignatureRequestGetResponse.json +146 -0
  482. data/test_fixtures/SignatureRequestListResponse.json +102 -0
  483. data/test_fixtures/SignatureRequestRemindRequest.json +5 -0
  484. data/test_fixtures/SignatureRequestSendRequest.json +463 -0
  485. data/test_fixtures/SignatureRequestSendWithTemplateRequest.json +48 -0
  486. data/test_fixtures/SignatureRequestUpdateRequest.json +7 -0
  487. data/test_fixtures/SubFormFieldsPerDocument.json +107 -0
  488. data/test_fixtures/TeamAddMemberRequest.json +6 -0
  489. data/test_fixtures/TeamCreateRequest.json +5 -0
  490. data/test_fixtures/TeamGetResponse.json +34 -0
  491. data/test_fixtures/TeamRemoveMemberRequest.json +7 -0
  492. data/test_fixtures/TeamUpdateRequest.json +5 -0
  493. data/test_fixtures/TemplateAddUserRequest.json +7 -0
  494. data/test_fixtures/TemplateCreateEmbeddedDraftRequest.json +118 -0
  495. data/test_fixtures/TemplateCreateEmbeddedDraftResponse.json +9 -0
  496. data/test_fixtures/TemplateGetResponse.json +102 -0
  497. data/test_fixtures/TemplateListResponse.json +143 -0
  498. data/test_fixtures/TemplateRemoveUserRequest.json +6 -0
  499. data/test_fixtures/TemplateUpdateFilesRequest.json +11 -0
  500. data/test_fixtures/TemplateUpdateFilesResponse.json +7 -0
  501. data/test_fixtures/UnclaimedDraftCreateEmbeddedRequest.json +134 -0
  502. data/test_fixtures/UnclaimedDraftCreateEmbeddedWithTemplateRequest.json +67 -0
  503. data/test_fixtures/UnclaimedDraftCreateRequest.json +119 -0
  504. data/test_fixtures/UnclaimedDraftCreateResponse.json +9 -0
  505. data/test_fixtures/UnclaimedDraftEditAndResendRequest.json +15 -0
  506. data/test_fixtures/bulk-send-sample.csv +3 -0
  507. data/test_fixtures/pdf-sample-2.pdf +0 -0
  508. data/test_fixtures/pdf-sample.pdf +0 -0
  509. data/vendor/autoload.php +7 -0
  510. data/vendor/bin/yaml-lint +117 -0
  511. data/vendor/composer/ClassLoader.php +572 -0
  512. data/vendor/composer/InstalledVersions.php +350 -0
  513. data/vendor/composer/LICENSE +21 -0
  514. data/vendor/composer/autoload_classmap.php +10 -0
  515. data/vendor/composer/autoload_files.php +11 -0
  516. data/vendor/composer/autoload_namespaces.php +9 -0
  517. data/vendor/composer/autoload_psr4.php +11 -0
  518. data/vendor/composer/autoload_real.php +80 -0
  519. data/vendor/composer/autoload_static.php +46 -0
  520. data/vendor/composer/installed.json +239 -0
  521. data/vendor/composer/installed.php +50 -0
  522. data/vendor/composer/platform_check.php +26 -0
  523. data/vendor/symfony/deprecation-contracts/.gitignore +3 -0
  524. data/vendor/symfony/deprecation-contracts/CHANGELOG.md +5 -0
  525. data/vendor/symfony/deprecation-contracts/LICENSE +19 -0
  526. data/vendor/symfony/deprecation-contracts/README.md +26 -0
  527. data/vendor/symfony/deprecation-contracts/composer.json +35 -0
  528. data/vendor/symfony/deprecation-contracts/function.php +27 -0
  529. data/vendor/symfony/polyfill-ctype/Ctype.php +232 -0
  530. data/vendor/symfony/polyfill-ctype/LICENSE +19 -0
  531. data/vendor/symfony/polyfill-ctype/README.md +12 -0
  532. data/vendor/symfony/polyfill-ctype/bootstrap.php +50 -0
  533. data/vendor/symfony/polyfill-ctype/bootstrap80.php +46 -0
  534. data/vendor/symfony/polyfill-ctype/composer.json +41 -0
  535. data/vendor/symfony/yaml/CHANGELOG.md +237 -0
  536. data/vendor/symfony/yaml/Command/LintCommand.php +289 -0
  537. data/vendor/symfony/yaml/Dumper.php +140 -0
  538. data/vendor/symfony/yaml/Escaper.php +95 -0
  539. data/vendor/symfony/yaml/Exception/DumpException.php +21 -0
  540. data/vendor/symfony/yaml/Exception/ExceptionInterface.php +21 -0
  541. data/vendor/symfony/yaml/Exception/ParseException.php +132 -0
  542. data/vendor/symfony/yaml/Exception/RuntimeException.php +21 -0
  543. data/vendor/symfony/yaml/Inline.php +812 -0
  544. data/vendor/symfony/yaml/LICENSE +19 -0
  545. data/vendor/symfony/yaml/Parser.php +1305 -0
  546. data/vendor/symfony/yaml/README.md +13 -0
  547. data/vendor/symfony/yaml/Resources/bin/yaml-lint +45 -0
  548. data/vendor/symfony/yaml/Tag/TaggedValue.php +38 -0
  549. data/vendor/symfony/yaml/Unescaper.php +132 -0
  550. data/vendor/symfony/yaml/Yaml.php +100 -0
  551. data/vendor/symfony/yaml/composer.json +42 -0
  552. metadata +650 -0
@@ -0,0 +1,1305 @@
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ namespace Symfony\Component\Yaml;
13
+
14
+ use Symfony\Component\Yaml\Exception\ParseException;
15
+ use Symfony\Component\Yaml\Tag\TaggedValue;
16
+
17
+ /**
18
+ * Parser parses YAML strings to convert them to PHP arrays.
19
+ *
20
+ * @author Fabien Potencier <fabien@symfony.com>
21
+ *
22
+ * @final
23
+ */
24
+ class Parser
25
+ {
26
+ public const TAG_PATTERN = '(?P<tag>![\w!.\/:-]+)';
27
+ public const BLOCK_SCALAR_HEADER_PATTERN = '(?P<separator>\||>)(?P<modifiers>\+|\-|\d+|\+\d+|\-\d+|\d+\+|\d+\-)?(?P<comments> +#.*)?';
28
+ public const REFERENCE_PATTERN = '#^&(?P<ref>[^ ]++) *+(?P<value>.*)#u';
29
+
30
+ private $filename;
31
+ private $offset = 0;
32
+ private $numberOfParsedLines = 0;
33
+ private $totalNumberOfLines;
34
+ private $lines = [];
35
+ private $currentLineNb = -1;
36
+ private $currentLine = '';
37
+ private $refs = [];
38
+ private $skippedLineNumbers = [];
39
+ private $locallySkippedLineNumbers = [];
40
+ private $refsBeingParsed = [];
41
+
42
+ /**
43
+ * Parses a YAML file into a PHP value.
44
+ *
45
+ * @param string $filename The path to the YAML file to be parsed
46
+ * @param int $flags A bit field of PARSE_* constants to customize the YAML parser behavior
47
+ *
48
+ * @return mixed
49
+ *
50
+ * @throws ParseException If the file could not be read or the YAML is not valid
51
+ */
52
+ public function parseFile(string $filename, int $flags = 0)
53
+ {
54
+ if (!is_file($filename)) {
55
+ throw new ParseException(sprintf('File "%s" does not exist.', $filename));
56
+ }
57
+
58
+ if (!is_readable($filename)) {
59
+ throw new ParseException(sprintf('File "%s" cannot be read.', $filename));
60
+ }
61
+
62
+ $this->filename = $filename;
63
+
64
+ try {
65
+ return $this->parse(file_get_contents($filename), $flags);
66
+ } finally {
67
+ $this->filename = null;
68
+ }
69
+ }
70
+
71
+ /**
72
+ * Parses a YAML string to a PHP value.
73
+ *
74
+ * @param string $value A YAML string
75
+ * @param int $flags A bit field of PARSE_* constants to customize the YAML parser behavior
76
+ *
77
+ * @return mixed
78
+ *
79
+ * @throws ParseException If the YAML is not valid
80
+ */
81
+ public function parse(string $value, int $flags = 0)
82
+ {
83
+ if (false === preg_match('//u', $value)) {
84
+ throw new ParseException('The YAML value does not appear to be valid UTF-8.', -1, null, $this->filename);
85
+ }
86
+
87
+ $this->refs = [];
88
+
89
+ $mbEncoding = null;
90
+
91
+ if (2 /* MB_OVERLOAD_STRING */ & (int) ini_get('mbstring.func_overload')) {
92
+ $mbEncoding = mb_internal_encoding();
93
+ mb_internal_encoding('UTF-8');
94
+ }
95
+
96
+ try {
97
+ $data = $this->doParse($value, $flags);
98
+ } finally {
99
+ if (null !== $mbEncoding) {
100
+ mb_internal_encoding($mbEncoding);
101
+ }
102
+ $this->refsBeingParsed = [];
103
+ $this->offset = 0;
104
+ $this->lines = [];
105
+ $this->currentLine = '';
106
+ $this->numberOfParsedLines = 0;
107
+ $this->refs = [];
108
+ $this->skippedLineNumbers = [];
109
+ $this->locallySkippedLineNumbers = [];
110
+ $this->totalNumberOfLines = null;
111
+ }
112
+
113
+ return $data;
114
+ }
115
+
116
+ private function doParse(string $value, int $flags)
117
+ {
118
+ $this->currentLineNb = -1;
119
+ $this->currentLine = '';
120
+ $value = $this->cleanup($value);
121
+ $this->lines = explode("\n", $value);
122
+ $this->numberOfParsedLines = \count($this->lines);
123
+ $this->locallySkippedLineNumbers = [];
124
+
125
+ if (null === $this->totalNumberOfLines) {
126
+ $this->totalNumberOfLines = $this->numberOfParsedLines;
127
+ }
128
+
129
+ if (!$this->moveToNextLine()) {
130
+ return null;
131
+ }
132
+
133
+ $data = [];
134
+ $context = null;
135
+ $allowOverwrite = false;
136
+
137
+ while ($this->isCurrentLineEmpty()) {
138
+ if (!$this->moveToNextLine()) {
139
+ return null;
140
+ }
141
+ }
142
+
143
+ // Resolves the tag and returns if end of the document
144
+ if (null !== ($tag = $this->getLineTag($this->currentLine, $flags, false)) && !$this->moveToNextLine()) {
145
+ return new TaggedValue($tag, '');
146
+ }
147
+
148
+ do {
149
+ if ($this->isCurrentLineEmpty()) {
150
+ continue;
151
+ }
152
+
153
+ // tab?
154
+ if ("\t" === $this->currentLine[0]) {
155
+ throw new ParseException('A YAML file cannot contain tabs as indentation.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
156
+ }
157
+
158
+ Inline::initialize($flags, $this->getRealCurrentLineNb(), $this->filename);
159
+
160
+ $isRef = $mergeNode = false;
161
+ if ('-' === $this->currentLine[0] && self::preg_match('#^\-((?P<leadspaces>\s+)(?P<value>.+))?$#u', rtrim($this->currentLine), $values)) {
162
+ if ($context && 'mapping' == $context) {
163
+ throw new ParseException('You cannot define a sequence item when in a mapping.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
164
+ }
165
+ $context = 'sequence';
166
+
167
+ if (isset($values['value']) && '&' === $values['value'][0] && self::preg_match(self::REFERENCE_PATTERN, $values['value'], $matches)) {
168
+ $isRef = $matches['ref'];
169
+ $this->refsBeingParsed[] = $isRef;
170
+ $values['value'] = $matches['value'];
171
+ }
172
+
173
+ if (isset($values['value'][1]) && '?' === $values['value'][0] && ' ' === $values['value'][1]) {
174
+ throw new ParseException('Complex mappings are not supported.', $this->getRealCurrentLineNb() + 1, $this->currentLine);
175
+ }
176
+
177
+ // array
178
+ if (isset($values['value']) && 0 === strpos(ltrim($values['value'], ' '), '-')) {
179
+ // Inline first child
180
+ $currentLineNumber = $this->getRealCurrentLineNb();
181
+
182
+ $sequenceIndentation = \strlen($values['leadspaces']) + 1;
183
+ $sequenceYaml = substr($this->currentLine, $sequenceIndentation);
184
+ $sequenceYaml .= "\n".$this->getNextEmbedBlock($sequenceIndentation, true);
185
+
186
+ $data[] = $this->parseBlock($currentLineNumber, rtrim($sequenceYaml), $flags);
187
+ } elseif (!isset($values['value']) || '' == trim($values['value'], ' ') || 0 === strpos(ltrim($values['value'], ' '), '#')) {
188
+ $data[] = $this->parseBlock($this->getRealCurrentLineNb() + 1, $this->getNextEmbedBlock(null, true) ?? '', $flags);
189
+ } elseif (null !== $subTag = $this->getLineTag(ltrim($values['value'], ' '), $flags)) {
190
+ $data[] = new TaggedValue(
191
+ $subTag,
192
+ $this->parseBlock($this->getRealCurrentLineNb() + 1, $this->getNextEmbedBlock(null, true), $flags)
193
+ );
194
+ } else {
195
+ if (
196
+ isset($values['leadspaces'])
197
+ && (
198
+ '!' === $values['value'][0]
199
+ || self::preg_match('#^(?P<key>'.Inline::REGEX_QUOTED_STRING.'|[^ \'"\{\[].*?) *\:(\s+(?P<value>.+?))?\s*$#u', $this->trimTag($values['value']), $matches)
200
+ )
201
+ ) {
202
+ // this is a compact notation element, add to next block and parse
203
+ $block = $values['value'];
204
+ if ($this->isNextLineIndented()) {
205
+ $block .= "\n".$this->getNextEmbedBlock($this->getCurrentLineIndentation() + \strlen($values['leadspaces']) + 1);
206
+ }
207
+
208
+ $data[] = $this->parseBlock($this->getRealCurrentLineNb(), $block, $flags);
209
+ } else {
210
+ $data[] = $this->parseValue($values['value'], $flags, $context);
211
+ }
212
+ }
213
+ if ($isRef) {
214
+ $this->refs[$isRef] = end($data);
215
+ array_pop($this->refsBeingParsed);
216
+ }
217
+ } elseif (
218
+ self::preg_match('#^(?P<key>(?:![^\s]++\s++)?(?:'.Inline::REGEX_QUOTED_STRING.'|(?:!?!php/const:)?[^ \'"\[\{!].*?)) *\:(( |\t)++(?P<value>.+))?$#u', rtrim($this->currentLine), $values)
219
+ && (false === strpos($values['key'], ' #') || \in_array($values['key'][0], ['"', "'"]))
220
+ ) {
221
+ if ($context && 'sequence' == $context) {
222
+ throw new ParseException('You cannot define a mapping item when in a sequence.', $this->currentLineNb + 1, $this->currentLine, $this->filename);
223
+ }
224
+ $context = 'mapping';
225
+
226
+ try {
227
+ $key = Inline::parseScalar($values['key']);
228
+ } catch (ParseException $e) {
229
+ $e->setParsedLine($this->getRealCurrentLineNb() + 1);
230
+ $e->setSnippet($this->currentLine);
231
+
232
+ throw $e;
233
+ }
234
+
235
+ if (!\is_string($key) && !\is_int($key)) {
236
+ throw new ParseException((is_numeric($key) ? 'Numeric' : 'Non-string').' keys are not supported. Quote your evaluable mapping keys instead.', $this->getRealCurrentLineNb() + 1, $this->currentLine);
237
+ }
238
+
239
+ // Convert float keys to strings, to avoid being converted to integers by PHP
240
+ if (\is_float($key)) {
241
+ $key = (string) $key;
242
+ }
243
+
244
+ if ('<<' === $key && (!isset($values['value']) || '&' !== $values['value'][0] || !self::preg_match('#^&(?P<ref>[^ ]+)#u', $values['value'], $refMatches))) {
245
+ $mergeNode = true;
246
+ $allowOverwrite = true;
247
+ if (isset($values['value'][0]) && '*' === $values['value'][0]) {
248
+ $refName = substr(rtrim($values['value']), 1);
249
+ if (!\array_key_exists($refName, $this->refs)) {
250
+ if (false !== $pos = array_search($refName, $this->refsBeingParsed, true)) {
251
+ throw new ParseException(sprintf('Circular reference [%s] detected for reference "%s".', implode(', ', array_merge(\array_slice($this->refsBeingParsed, $pos), [$refName])), $refName), $this->currentLineNb + 1, $this->currentLine, $this->filename);
252
+ }
253
+
254
+ throw new ParseException(sprintf('Reference "%s" does not exist.', $refName), $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
255
+ }
256
+
257
+ $refValue = $this->refs[$refName];
258
+
259
+ if (Yaml::PARSE_OBJECT_FOR_MAP & $flags && $refValue instanceof \stdClass) {
260
+ $refValue = (array) $refValue;
261
+ }
262
+
263
+ if (!\is_array($refValue)) {
264
+ throw new ParseException('YAML merge keys used with a scalar value instead of an array.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
265
+ }
266
+
267
+ $data += $refValue; // array union
268
+ } else {
269
+ if (isset($values['value']) && '' !== $values['value']) {
270
+ $value = $values['value'];
271
+ } else {
272
+ $value = $this->getNextEmbedBlock();
273
+ }
274
+ $parsed = $this->parseBlock($this->getRealCurrentLineNb() + 1, $value, $flags);
275
+
276
+ if (Yaml::PARSE_OBJECT_FOR_MAP & $flags && $parsed instanceof \stdClass) {
277
+ $parsed = (array) $parsed;
278
+ }
279
+
280
+ if (!\is_array($parsed)) {
281
+ throw new ParseException('YAML merge keys used with a scalar value instead of an array.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
282
+ }
283
+
284
+ if (isset($parsed[0])) {
285
+ // If the value associated with the merge key is a sequence, then this sequence is expected to contain mapping nodes
286
+ // and each of these nodes is merged in turn according to its order in the sequence. Keys in mapping nodes earlier
287
+ // in the sequence override keys specified in later mapping nodes.
288
+ foreach ($parsed as $parsedItem) {
289
+ if (Yaml::PARSE_OBJECT_FOR_MAP & $flags && $parsedItem instanceof \stdClass) {
290
+ $parsedItem = (array) $parsedItem;
291
+ }
292
+
293
+ if (!\is_array($parsedItem)) {
294
+ throw new ParseException('Merge items must be arrays.', $this->getRealCurrentLineNb() + 1, $parsedItem, $this->filename);
295
+ }
296
+
297
+ $data += $parsedItem; // array union
298
+ }
299
+ } else {
300
+ // If the value associated with the key is a single mapping node, each of its key/value pairs is inserted into the
301
+ // current mapping, unless the key already exists in it.
302
+ $data += $parsed; // array union
303
+ }
304
+ }
305
+ } elseif ('<<' !== $key && isset($values['value']) && '&' === $values['value'][0] && self::preg_match(self::REFERENCE_PATTERN, $values['value'], $matches)) {
306
+ $isRef = $matches['ref'];
307
+ $this->refsBeingParsed[] = $isRef;
308
+ $values['value'] = $matches['value'];
309
+ }
310
+
311
+ $subTag = null;
312
+ if ($mergeNode) {
313
+ // Merge keys
314
+ } elseif (!isset($values['value']) || '' === $values['value'] || 0 === strpos($values['value'], '#') || (null !== $subTag = $this->getLineTag($values['value'], $flags)) || '<<' === $key) {
315
+ // hash
316
+ // if next line is less indented or equal, then it means that the current value is null
317
+ if (!$this->isNextLineIndented() && !$this->isNextLineUnIndentedCollection()) {
318
+ // Spec: Keys MUST be unique; first one wins.
319
+ // But overwriting is allowed when a merge node is used in current block.
320
+ if ($allowOverwrite || !isset($data[$key])) {
321
+ if (null !== $subTag) {
322
+ $data[$key] = new TaggedValue($subTag, '');
323
+ } else {
324
+ $data[$key] = null;
325
+ }
326
+ } else {
327
+ throw new ParseException(sprintf('Duplicate key "%s" detected.', $key), $this->getRealCurrentLineNb() + 1, $this->currentLine);
328
+ }
329
+ } else {
330
+ // remember the parsed line number here in case we need it to provide some contexts in error messages below
331
+ $realCurrentLineNbKey = $this->getRealCurrentLineNb();
332
+ $value = $this->parseBlock($this->getRealCurrentLineNb() + 1, $this->getNextEmbedBlock(), $flags);
333
+ if ('<<' === $key) {
334
+ $this->refs[$refMatches['ref']] = $value;
335
+
336
+ if (Yaml::PARSE_OBJECT_FOR_MAP & $flags && $value instanceof \stdClass) {
337
+ $value = (array) $value;
338
+ }
339
+
340
+ $data += $value;
341
+ } elseif ($allowOverwrite || !isset($data[$key])) {
342
+ // Spec: Keys MUST be unique; first one wins.
343
+ // But overwriting is allowed when a merge node is used in current block.
344
+ if (null !== $subTag) {
345
+ $data[$key] = new TaggedValue($subTag, $value);
346
+ } else {
347
+ $data[$key] = $value;
348
+ }
349
+ } else {
350
+ throw new ParseException(sprintf('Duplicate key "%s" detected.', $key), $realCurrentLineNbKey + 1, $this->currentLine);
351
+ }
352
+ }
353
+ } else {
354
+ $value = $this->parseValue(rtrim($values['value']), $flags, $context);
355
+ // Spec: Keys MUST be unique; first one wins.
356
+ // But overwriting is allowed when a merge node is used in current block.
357
+ if ($allowOverwrite || !isset($data[$key])) {
358
+ $data[$key] = $value;
359
+ } else {
360
+ throw new ParseException(sprintf('Duplicate key "%s" detected.', $key), $this->getRealCurrentLineNb() + 1, $this->currentLine);
361
+ }
362
+ }
363
+ if ($isRef) {
364
+ $this->refs[$isRef] = $data[$key];
365
+ array_pop($this->refsBeingParsed);
366
+ }
367
+ } elseif ('"' === $this->currentLine[0] || "'" === $this->currentLine[0]) {
368
+ if (null !== $context) {
369
+ throw new ParseException('Unable to parse.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
370
+ }
371
+
372
+ try {
373
+ return Inline::parse($this->lexInlineQuotedString(), $flags, $this->refs);
374
+ } catch (ParseException $e) {
375
+ $e->setParsedLine($this->getRealCurrentLineNb() + 1);
376
+ $e->setSnippet($this->currentLine);
377
+
378
+ throw $e;
379
+ }
380
+ } elseif ('{' === $this->currentLine[0]) {
381
+ if (null !== $context) {
382
+ throw new ParseException('Unable to parse.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
383
+ }
384
+
385
+ try {
386
+ $parsedMapping = Inline::parse($this->lexInlineMapping(), $flags, $this->refs);
387
+
388
+ while ($this->moveToNextLine()) {
389
+ if (!$this->isCurrentLineEmpty()) {
390
+ throw new ParseException('Unable to parse.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
391
+ }
392
+ }
393
+
394
+ return $parsedMapping;
395
+ } catch (ParseException $e) {
396
+ $e->setParsedLine($this->getRealCurrentLineNb() + 1);
397
+ $e->setSnippet($this->currentLine);
398
+
399
+ throw $e;
400
+ }
401
+ } elseif ('[' === $this->currentLine[0]) {
402
+ if (null !== $context) {
403
+ throw new ParseException('Unable to parse.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
404
+ }
405
+
406
+ try {
407
+ $parsedSequence = Inline::parse($this->lexInlineSequence(), $flags, $this->refs);
408
+
409
+ while ($this->moveToNextLine()) {
410
+ if (!$this->isCurrentLineEmpty()) {
411
+ throw new ParseException('Unable to parse.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
412
+ }
413
+ }
414
+
415
+ return $parsedSequence;
416
+ } catch (ParseException $e) {
417
+ $e->setParsedLine($this->getRealCurrentLineNb() + 1);
418
+ $e->setSnippet($this->currentLine);
419
+
420
+ throw $e;
421
+ }
422
+ } else {
423
+ // multiple documents are not supported
424
+ if ('---' === $this->currentLine) {
425
+ throw new ParseException('Multiple documents are not supported.', $this->currentLineNb + 1, $this->currentLine, $this->filename);
426
+ }
427
+
428
+ if ($deprecatedUsage = (isset($this->currentLine[1]) && '?' === $this->currentLine[0] && ' ' === $this->currentLine[1])) {
429
+ throw new ParseException('Complex mappings are not supported.', $this->getRealCurrentLineNb() + 1, $this->currentLine);
430
+ }
431
+
432
+ // 1-liner optionally followed by newline(s)
433
+ if (\is_string($value) && $this->lines[0] === trim($value)) {
434
+ try {
435
+ $value = Inline::parse($this->lines[0], $flags, $this->refs);
436
+ } catch (ParseException $e) {
437
+ $e->setParsedLine($this->getRealCurrentLineNb() + 1);
438
+ $e->setSnippet($this->currentLine);
439
+
440
+ throw $e;
441
+ }
442
+
443
+ return $value;
444
+ }
445
+
446
+ // try to parse the value as a multi-line string as a last resort
447
+ if (0 === $this->currentLineNb) {
448
+ $previousLineWasNewline = false;
449
+ $previousLineWasTerminatedWithBackslash = false;
450
+ $value = '';
451
+
452
+ foreach ($this->lines as $line) {
453
+ $trimmedLine = trim($line);
454
+ if ('#' === ($trimmedLine[0] ?? '')) {
455
+ continue;
456
+ }
457
+ // If the indentation is not consistent at offset 0, it is to be considered as a ParseError
458
+ if (0 === $this->offset && !$deprecatedUsage && isset($line[0]) && ' ' === $line[0]) {
459
+ throw new ParseException('Unable to parse.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
460
+ }
461
+
462
+ if (false !== strpos($line, ': ')) {
463
+ throw new ParseException('Mapping values are not allowed in multi-line blocks.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
464
+ }
465
+
466
+ if ('' === $trimmedLine) {
467
+ $value .= "\n";
468
+ } elseif (!$previousLineWasNewline && !$previousLineWasTerminatedWithBackslash) {
469
+ $value .= ' ';
470
+ }
471
+
472
+ if ('' !== $trimmedLine && '\\' === substr($line, -1)) {
473
+ $value .= ltrim(substr($line, 0, -1));
474
+ } elseif ('' !== $trimmedLine) {
475
+ $value .= $trimmedLine;
476
+ }
477
+
478
+ if ('' === $trimmedLine) {
479
+ $previousLineWasNewline = true;
480
+ $previousLineWasTerminatedWithBackslash = false;
481
+ } elseif ('\\' === substr($line, -1)) {
482
+ $previousLineWasNewline = false;
483
+ $previousLineWasTerminatedWithBackslash = true;
484
+ } else {
485
+ $previousLineWasNewline = false;
486
+ $previousLineWasTerminatedWithBackslash = false;
487
+ }
488
+ }
489
+
490
+ try {
491
+ return Inline::parse(trim($value));
492
+ } catch (ParseException $e) {
493
+ // fall-through to the ParseException thrown below
494
+ }
495
+ }
496
+
497
+ throw new ParseException('Unable to parse.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
498
+ }
499
+ } while ($this->moveToNextLine());
500
+
501
+ if (null !== $tag) {
502
+ $data = new TaggedValue($tag, $data);
503
+ }
504
+
505
+ if (Yaml::PARSE_OBJECT_FOR_MAP & $flags && 'mapping' === $context && !\is_object($data)) {
506
+ $object = new \stdClass();
507
+
508
+ foreach ($data as $key => $value) {
509
+ $object->$key = $value;
510
+ }
511
+
512
+ $data = $object;
513
+ }
514
+
515
+ return empty($data) ? null : $data;
516
+ }
517
+
518
+ private function parseBlock(int $offset, string $yaml, int $flags)
519
+ {
520
+ $skippedLineNumbers = $this->skippedLineNumbers;
521
+
522
+ foreach ($this->locallySkippedLineNumbers as $lineNumber) {
523
+ if ($lineNumber < $offset) {
524
+ continue;
525
+ }
526
+
527
+ $skippedLineNumbers[] = $lineNumber;
528
+ }
529
+
530
+ $parser = new self();
531
+ $parser->offset = $offset;
532
+ $parser->totalNumberOfLines = $this->totalNumberOfLines;
533
+ $parser->skippedLineNumbers = $skippedLineNumbers;
534
+ $parser->refs = &$this->refs;
535
+ $parser->refsBeingParsed = $this->refsBeingParsed;
536
+
537
+ return $parser->doParse($yaml, $flags);
538
+ }
539
+
540
+ /**
541
+ * Returns the current line number (takes the offset into account).
542
+ *
543
+ * @internal
544
+ */
545
+ public function getRealCurrentLineNb(): int
546
+ {
547
+ $realCurrentLineNumber = $this->currentLineNb + $this->offset;
548
+
549
+ foreach ($this->skippedLineNumbers as $skippedLineNumber) {
550
+ if ($skippedLineNumber > $realCurrentLineNumber) {
551
+ break;
552
+ }
553
+
554
+ ++$realCurrentLineNumber;
555
+ }
556
+
557
+ return $realCurrentLineNumber;
558
+ }
559
+
560
+ /**
561
+ * Returns the current line indentation.
562
+ */
563
+ private function getCurrentLineIndentation(): int
564
+ {
565
+ if (' ' !== ($this->currentLine[0] ?? '')) {
566
+ return 0;
567
+ }
568
+
569
+ return \strlen($this->currentLine) - \strlen(ltrim($this->currentLine, ' '));
570
+ }
571
+
572
+ /**
573
+ * Returns the next embed block of YAML.
574
+ *
575
+ * @param int|null $indentation The indent level at which the block is to be read, or null for default
576
+ * @param bool $inSequence True if the enclosing data structure is a sequence
577
+ *
578
+ * @throws ParseException When indentation problem are detected
579
+ */
580
+ private function getNextEmbedBlock(int $indentation = null, bool $inSequence = false): string
581
+ {
582
+ $oldLineIndentation = $this->getCurrentLineIndentation();
583
+
584
+ if (!$this->moveToNextLine()) {
585
+ return '';
586
+ }
587
+
588
+ if (null === $indentation) {
589
+ $newIndent = null;
590
+ $movements = 0;
591
+
592
+ do {
593
+ $EOF = false;
594
+
595
+ // empty and comment-like lines do not influence the indentation depth
596
+ if ($this->isCurrentLineEmpty() || $this->isCurrentLineComment()) {
597
+ $EOF = !$this->moveToNextLine();
598
+
599
+ if (!$EOF) {
600
+ ++$movements;
601
+ }
602
+ } else {
603
+ $newIndent = $this->getCurrentLineIndentation();
604
+ }
605
+ } while (!$EOF && null === $newIndent);
606
+
607
+ for ($i = 0; $i < $movements; ++$i) {
608
+ $this->moveToPreviousLine();
609
+ }
610
+
611
+ $unindentedEmbedBlock = $this->isStringUnIndentedCollectionItem();
612
+
613
+ if (!$this->isCurrentLineEmpty() && 0 === $newIndent && !$unindentedEmbedBlock) {
614
+ throw new ParseException('Indentation problem.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
615
+ }
616
+ } else {
617
+ $newIndent = $indentation;
618
+ }
619
+
620
+ $data = [];
621
+
622
+ if ($this->getCurrentLineIndentation() >= $newIndent) {
623
+ $data[] = substr($this->currentLine, $newIndent ?? 0);
624
+ } elseif ($this->isCurrentLineEmpty() || $this->isCurrentLineComment()) {
625
+ $data[] = $this->currentLine;
626
+ } else {
627
+ $this->moveToPreviousLine();
628
+
629
+ return '';
630
+ }
631
+
632
+ if ($inSequence && $oldLineIndentation === $newIndent && isset($data[0][0]) && '-' === $data[0][0]) {
633
+ // the previous line contained a dash but no item content, this line is a sequence item with the same indentation
634
+ // and therefore no nested list or mapping
635
+ $this->moveToPreviousLine();
636
+
637
+ return '';
638
+ }
639
+
640
+ $isItUnindentedCollection = $this->isStringUnIndentedCollectionItem();
641
+ $isItComment = $this->isCurrentLineComment();
642
+
643
+ while ($this->moveToNextLine()) {
644
+ if ($isItComment && !$isItUnindentedCollection) {
645
+ $isItUnindentedCollection = $this->isStringUnIndentedCollectionItem();
646
+ $isItComment = $this->isCurrentLineComment();
647
+ }
648
+
649
+ $indent = $this->getCurrentLineIndentation();
650
+
651
+ if ($isItUnindentedCollection && !$this->isCurrentLineEmpty() && !$this->isStringUnIndentedCollectionItem() && $newIndent === $indent) {
652
+ $this->moveToPreviousLine();
653
+ break;
654
+ }
655
+
656
+ if ($this->isCurrentLineBlank()) {
657
+ $data[] = substr($this->currentLine, $newIndent);
658
+ continue;
659
+ }
660
+
661
+ if ($indent >= $newIndent) {
662
+ $data[] = substr($this->currentLine, $newIndent);
663
+ } elseif ($this->isCurrentLineComment()) {
664
+ $data[] = $this->currentLine;
665
+ } elseif (0 == $indent) {
666
+ $this->moveToPreviousLine();
667
+
668
+ break;
669
+ } else {
670
+ throw new ParseException('Indentation problem.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
671
+ }
672
+ }
673
+
674
+ return implode("\n", $data);
675
+ }
676
+
677
+ private function hasMoreLines(): bool
678
+ {
679
+ return (\count($this->lines) - 1) > $this->currentLineNb;
680
+ }
681
+
682
+ /**
683
+ * Moves the parser to the next line.
684
+ */
685
+ private function moveToNextLine(): bool
686
+ {
687
+ if ($this->currentLineNb >= $this->numberOfParsedLines - 1) {
688
+ return false;
689
+ }
690
+
691
+ $this->currentLine = $this->lines[++$this->currentLineNb];
692
+
693
+ return true;
694
+ }
695
+
696
+ /**
697
+ * Moves the parser to the previous line.
698
+ */
699
+ private function moveToPreviousLine(): bool
700
+ {
701
+ if ($this->currentLineNb < 1) {
702
+ return false;
703
+ }
704
+
705
+ $this->currentLine = $this->lines[--$this->currentLineNb];
706
+
707
+ return true;
708
+ }
709
+
710
+ /**
711
+ * Parses a YAML value.
712
+ *
713
+ * @param string $value A YAML value
714
+ * @param int $flags A bit field of PARSE_* constants to customize the YAML parser behavior
715
+ * @param string $context The parser context (either sequence or mapping)
716
+ *
717
+ * @return mixed
718
+ *
719
+ * @throws ParseException When reference does not exist
720
+ */
721
+ private function parseValue(string $value, int $flags, string $context)
722
+ {
723
+ if (0 === strpos($value, '*')) {
724
+ if (false !== $pos = strpos($value, '#')) {
725
+ $value = substr($value, 1, $pos - 2);
726
+ } else {
727
+ $value = substr($value, 1);
728
+ }
729
+
730
+ if (!\array_key_exists($value, $this->refs)) {
731
+ if (false !== $pos = array_search($value, $this->refsBeingParsed, true)) {
732
+ throw new ParseException(sprintf('Circular reference [%s] detected for reference "%s".', implode(', ', array_merge(\array_slice($this->refsBeingParsed, $pos), [$value])), $value), $this->currentLineNb + 1, $this->currentLine, $this->filename);
733
+ }
734
+
735
+ throw new ParseException(sprintf('Reference "%s" does not exist.', $value), $this->currentLineNb + 1, $this->currentLine, $this->filename);
736
+ }
737
+
738
+ return $this->refs[$value];
739
+ }
740
+
741
+ if (\in_array($value[0], ['!', '|', '>'], true) && self::preg_match('/^(?:'.self::TAG_PATTERN.' +)?'.self::BLOCK_SCALAR_HEADER_PATTERN.'$/', $value, $matches)) {
742
+ $modifiers = $matches['modifiers'] ?? '';
743
+
744
+ $data = $this->parseBlockScalar($matches['separator'], preg_replace('#\d+#', '', $modifiers), abs((int) $modifiers));
745
+
746
+ if ('' !== $matches['tag'] && '!' !== $matches['tag']) {
747
+ if ('!!binary' === $matches['tag']) {
748
+ return Inline::evaluateBinaryScalar($data);
749
+ }
750
+
751
+ return new TaggedValue(substr($matches['tag'], 1), $data);
752
+ }
753
+
754
+ return $data;
755
+ }
756
+
757
+ try {
758
+ if ('' !== $value && '{' === $value[0]) {
759
+ $cursor = \strlen(rtrim($this->currentLine)) - \strlen(rtrim($value));
760
+
761
+ return Inline::parse($this->lexInlineMapping($cursor), $flags, $this->refs);
762
+ } elseif ('' !== $value && '[' === $value[0]) {
763
+ $cursor = \strlen(rtrim($this->currentLine)) - \strlen(rtrim($value));
764
+
765
+ return Inline::parse($this->lexInlineSequence($cursor), $flags, $this->refs);
766
+ }
767
+
768
+ switch ($value[0] ?? '') {
769
+ case '"':
770
+ case "'":
771
+ $cursor = \strlen(rtrim($this->currentLine)) - \strlen(rtrim($value));
772
+ $parsedValue = Inline::parse($this->lexInlineQuotedString($cursor), $flags, $this->refs);
773
+
774
+ if (isset($this->currentLine[$cursor]) && preg_replace('/\s*(#.*)?$/A', '', substr($this->currentLine, $cursor))) {
775
+ throw new ParseException(sprintf('Unexpected characters near "%s".', substr($this->currentLine, $cursor)));
776
+ }
777
+
778
+ return $parsedValue;
779
+ default:
780
+ $lines = [];
781
+
782
+ while ($this->moveToNextLine()) {
783
+ // unquoted strings end before the first unindented line
784
+ if (0 === $this->getCurrentLineIndentation()) {
785
+ $this->moveToPreviousLine();
786
+
787
+ break;
788
+ }
789
+
790
+ $lines[] = trim($this->currentLine);
791
+ }
792
+
793
+ for ($i = 0, $linesCount = \count($lines), $previousLineBlank = false; $i < $linesCount; ++$i) {
794
+ if ('' === $lines[$i]) {
795
+ $value .= "\n";
796
+ $previousLineBlank = true;
797
+ } elseif ($previousLineBlank) {
798
+ $value .= $lines[$i];
799
+ $previousLineBlank = false;
800
+ } else {
801
+ $value .= ' '.$lines[$i];
802
+ $previousLineBlank = false;
803
+ }
804
+ }
805
+
806
+ Inline::$parsedLineNumber = $this->getRealCurrentLineNb();
807
+
808
+ $parsedValue = Inline::parse($value, $flags, $this->refs);
809
+
810
+ if ('mapping' === $context && \is_string($parsedValue) && '"' !== $value[0] && "'" !== $value[0] && '[' !== $value[0] && '{' !== $value[0] && '!' !== $value[0] && false !== strpos($parsedValue, ': ')) {
811
+ throw new ParseException('A colon cannot be used in an unquoted mapping value.', $this->getRealCurrentLineNb() + 1, $value, $this->filename);
812
+ }
813
+
814
+ return $parsedValue;
815
+ }
816
+ } catch (ParseException $e) {
817
+ $e->setParsedLine($this->getRealCurrentLineNb() + 1);
818
+ $e->setSnippet($this->currentLine);
819
+
820
+ throw $e;
821
+ }
822
+ }
823
+
824
+ /**
825
+ * Parses a block scalar.
826
+ *
827
+ * @param string $style The style indicator that was used to begin this block scalar (| or >)
828
+ * @param string $chomping The chomping indicator that was used to begin this block scalar (+ or -)
829
+ * @param int $indentation The indentation indicator that was used to begin this block scalar
830
+ */
831
+ private function parseBlockScalar(string $style, string $chomping = '', int $indentation = 0): string
832
+ {
833
+ $notEOF = $this->moveToNextLine();
834
+ if (!$notEOF) {
835
+ return '';
836
+ }
837
+
838
+ $isCurrentLineBlank = $this->isCurrentLineBlank();
839
+ $blockLines = [];
840
+
841
+ // leading blank lines are consumed before determining indentation
842
+ while ($notEOF && $isCurrentLineBlank) {
843
+ // newline only if not EOF
844
+ if ($notEOF = $this->moveToNextLine()) {
845
+ $blockLines[] = '';
846
+ $isCurrentLineBlank = $this->isCurrentLineBlank();
847
+ }
848
+ }
849
+
850
+ // determine indentation if not specified
851
+ if (0 === $indentation) {
852
+ $currentLineLength = \strlen($this->currentLine);
853
+
854
+ for ($i = 0; $i < $currentLineLength && ' ' === $this->currentLine[$i]; ++$i) {
855
+ ++$indentation;
856
+ }
857
+ }
858
+
859
+ if ($indentation > 0) {
860
+ $pattern = sprintf('/^ {%d}(.*)$/', $indentation);
861
+
862
+ while (
863
+ $notEOF && (
864
+ $isCurrentLineBlank ||
865
+ self::preg_match($pattern, $this->currentLine, $matches)
866
+ )
867
+ ) {
868
+ if ($isCurrentLineBlank && \strlen($this->currentLine) > $indentation) {
869
+ $blockLines[] = substr($this->currentLine, $indentation);
870
+ } elseif ($isCurrentLineBlank) {
871
+ $blockLines[] = '';
872
+ } else {
873
+ $blockLines[] = $matches[1];
874
+ }
875
+
876
+ // newline only if not EOF
877
+ if ($notEOF = $this->moveToNextLine()) {
878
+ $isCurrentLineBlank = $this->isCurrentLineBlank();
879
+ }
880
+ }
881
+ } elseif ($notEOF) {
882
+ $blockLines[] = '';
883
+ }
884
+
885
+ if ($notEOF) {
886
+ $blockLines[] = '';
887
+ $this->moveToPreviousLine();
888
+ } elseif (!$notEOF && !$this->isCurrentLineLastLineInDocument()) {
889
+ $blockLines[] = '';
890
+ }
891
+
892
+ // folded style
893
+ if ('>' === $style) {
894
+ $text = '';
895
+ $previousLineIndented = false;
896
+ $previousLineBlank = false;
897
+
898
+ for ($i = 0, $blockLinesCount = \count($blockLines); $i < $blockLinesCount; ++$i) {
899
+ if ('' === $blockLines[$i]) {
900
+ $text .= "\n";
901
+ $previousLineIndented = false;
902
+ $previousLineBlank = true;
903
+ } elseif (' ' === $blockLines[$i][0]) {
904
+ $text .= "\n".$blockLines[$i];
905
+ $previousLineIndented = true;
906
+ $previousLineBlank = false;
907
+ } elseif ($previousLineIndented) {
908
+ $text .= "\n".$blockLines[$i];
909
+ $previousLineIndented = false;
910
+ $previousLineBlank = false;
911
+ } elseif ($previousLineBlank || 0 === $i) {
912
+ $text .= $blockLines[$i];
913
+ $previousLineIndented = false;
914
+ $previousLineBlank = false;
915
+ } else {
916
+ $text .= ' '.$blockLines[$i];
917
+ $previousLineIndented = false;
918
+ $previousLineBlank = false;
919
+ }
920
+ }
921
+ } else {
922
+ $text = implode("\n", $blockLines);
923
+ }
924
+
925
+ // deal with trailing newlines
926
+ if ('' === $chomping) {
927
+ $text = preg_replace('/\n+$/', "\n", $text);
928
+ } elseif ('-' === $chomping) {
929
+ $text = preg_replace('/\n+$/', '', $text);
930
+ }
931
+
932
+ return $text;
933
+ }
934
+
935
+ /**
936
+ * Returns true if the next line is indented.
937
+ */
938
+ private function isNextLineIndented(): bool
939
+ {
940
+ $currentIndentation = $this->getCurrentLineIndentation();
941
+ $movements = 0;
942
+
943
+ do {
944
+ $EOF = !$this->moveToNextLine();
945
+
946
+ if (!$EOF) {
947
+ ++$movements;
948
+ }
949
+ } while (!$EOF && ($this->isCurrentLineEmpty() || $this->isCurrentLineComment()));
950
+
951
+ if ($EOF) {
952
+ return false;
953
+ }
954
+
955
+ $ret = $this->getCurrentLineIndentation() > $currentIndentation;
956
+
957
+ for ($i = 0; $i < $movements; ++$i) {
958
+ $this->moveToPreviousLine();
959
+ }
960
+
961
+ return $ret;
962
+ }
963
+
964
+ /**
965
+ * Returns true if the current line is blank or if it is a comment line.
966
+ */
967
+ private function isCurrentLineEmpty(): bool
968
+ {
969
+ return $this->isCurrentLineBlank() || $this->isCurrentLineComment();
970
+ }
971
+
972
+ /**
973
+ * Returns true if the current line is blank.
974
+ */
975
+ private function isCurrentLineBlank(): bool
976
+ {
977
+ return '' === $this->currentLine || '' === trim($this->currentLine, ' ');
978
+ }
979
+
980
+ /**
981
+ * Returns true if the current line is a comment line.
982
+ */
983
+ private function isCurrentLineComment(): bool
984
+ {
985
+ //checking explicitly the first char of the trim is faster than loops or strpos
986
+ $ltrimmedLine = '' !== $this->currentLine && ' ' === $this->currentLine[0] ? ltrim($this->currentLine, ' ') : $this->currentLine;
987
+
988
+ return '' !== $ltrimmedLine && '#' === $ltrimmedLine[0];
989
+ }
990
+
991
+ private function isCurrentLineLastLineInDocument(): bool
992
+ {
993
+ return ($this->offset + $this->currentLineNb) >= ($this->totalNumberOfLines - 1);
994
+ }
995
+
996
+ /**
997
+ * Cleanups a YAML string to be parsed.
998
+ *
999
+ * @param string $value The input YAML string
1000
+ */
1001
+ private function cleanup(string $value): string
1002
+ {
1003
+ $value = str_replace(["\r\n", "\r"], "\n", $value);
1004
+
1005
+ // strip YAML header
1006
+ $count = 0;
1007
+ $value = preg_replace('#^\%YAML[: ][\d\.]+.*\n#u', '', $value, -1, $count);
1008
+ $this->offset += $count;
1009
+
1010
+ // remove leading comments
1011
+ $trimmedValue = preg_replace('#^(\#.*?\n)+#s', '', $value, -1, $count);
1012
+ if (1 === $count) {
1013
+ // items have been removed, update the offset
1014
+ $this->offset += substr_count($value, "\n") - substr_count($trimmedValue, "\n");
1015
+ $value = $trimmedValue;
1016
+ }
1017
+
1018
+ // remove start of the document marker (---)
1019
+ $trimmedValue = preg_replace('#^\-\-\-.*?\n#s', '', $value, -1, $count);
1020
+ if (1 === $count) {
1021
+ // items have been removed, update the offset
1022
+ $this->offset += substr_count($value, "\n") - substr_count($trimmedValue, "\n");
1023
+ $value = $trimmedValue;
1024
+
1025
+ // remove end of the document marker (...)
1026
+ $value = preg_replace('#\.\.\.\s*$#', '', $value);
1027
+ }
1028
+
1029
+ return $value;
1030
+ }
1031
+
1032
+ /**
1033
+ * Returns true if the next line starts unindented collection.
1034
+ */
1035
+ private function isNextLineUnIndentedCollection(): bool
1036
+ {
1037
+ $currentIndentation = $this->getCurrentLineIndentation();
1038
+ $movements = 0;
1039
+
1040
+ do {
1041
+ $EOF = !$this->moveToNextLine();
1042
+
1043
+ if (!$EOF) {
1044
+ ++$movements;
1045
+ }
1046
+ } while (!$EOF && ($this->isCurrentLineEmpty() || $this->isCurrentLineComment()));
1047
+
1048
+ if ($EOF) {
1049
+ return false;
1050
+ }
1051
+
1052
+ $ret = $this->getCurrentLineIndentation() === $currentIndentation && $this->isStringUnIndentedCollectionItem();
1053
+
1054
+ for ($i = 0; $i < $movements; ++$i) {
1055
+ $this->moveToPreviousLine();
1056
+ }
1057
+
1058
+ return $ret;
1059
+ }
1060
+
1061
+ /**
1062
+ * Returns true if the string is un-indented collection item.
1063
+ */
1064
+ private function isStringUnIndentedCollectionItem(): bool
1065
+ {
1066
+ return '-' === rtrim($this->currentLine) || 0 === strpos($this->currentLine, '- ');
1067
+ }
1068
+
1069
+ /**
1070
+ * A local wrapper for "preg_match" which will throw a ParseException if there
1071
+ * is an internal error in the PCRE engine.
1072
+ *
1073
+ * This avoids us needing to check for "false" every time PCRE is used
1074
+ * in the YAML engine
1075
+ *
1076
+ * @throws ParseException on a PCRE internal error
1077
+ *
1078
+ * @see preg_last_error()
1079
+ *
1080
+ * @internal
1081
+ */
1082
+ public static function preg_match(string $pattern, string $subject, array &$matches = null, int $flags = 0, int $offset = 0): int
1083
+ {
1084
+ if (false === $ret = preg_match($pattern, $subject, $matches, $flags, $offset)) {
1085
+ switch (preg_last_error()) {
1086
+ case \PREG_INTERNAL_ERROR:
1087
+ $error = 'Internal PCRE error.';
1088
+ break;
1089
+ case \PREG_BACKTRACK_LIMIT_ERROR:
1090
+ $error = 'pcre.backtrack_limit reached.';
1091
+ break;
1092
+ case \PREG_RECURSION_LIMIT_ERROR:
1093
+ $error = 'pcre.recursion_limit reached.';
1094
+ break;
1095
+ case \PREG_BAD_UTF8_ERROR:
1096
+ $error = 'Malformed UTF-8 data.';
1097
+ break;
1098
+ case \PREG_BAD_UTF8_OFFSET_ERROR:
1099
+ $error = 'Offset doesn\'t correspond to the begin of a valid UTF-8 code point.';
1100
+ break;
1101
+ default:
1102
+ $error = 'Error.';
1103
+ }
1104
+
1105
+ throw new ParseException($error);
1106
+ }
1107
+
1108
+ return $ret;
1109
+ }
1110
+
1111
+ /**
1112
+ * Trim the tag on top of the value.
1113
+ *
1114
+ * Prevent values such as "!foo {quz: bar}" to be considered as
1115
+ * a mapping block.
1116
+ */
1117
+ private function trimTag(string $value): string
1118
+ {
1119
+ if ('!' === $value[0]) {
1120
+ return ltrim(substr($value, 1, strcspn($value, " \r\n", 1)), ' ');
1121
+ }
1122
+
1123
+ return $value;
1124
+ }
1125
+
1126
+ private function getLineTag(string $value, int $flags, bool $nextLineCheck = true): ?string
1127
+ {
1128
+ if ('' === $value || '!' !== $value[0] || 1 !== self::preg_match('/^'.self::TAG_PATTERN.' *( +#.*)?$/', $value, $matches)) {
1129
+ return null;
1130
+ }
1131
+
1132
+ if ($nextLineCheck && !$this->isNextLineIndented()) {
1133
+ return null;
1134
+ }
1135
+
1136
+ $tag = substr($matches['tag'], 1);
1137
+
1138
+ // Built-in tags
1139
+ if ($tag && '!' === $tag[0]) {
1140
+ throw new ParseException(sprintf('The built-in tag "!%s" is not implemented.', $tag), $this->getRealCurrentLineNb() + 1, $value, $this->filename);
1141
+ }
1142
+
1143
+ if (Yaml::PARSE_CUSTOM_TAGS & $flags) {
1144
+ return $tag;
1145
+ }
1146
+
1147
+ throw new ParseException(sprintf('Tags support is not enabled. You must use the flag "Yaml::PARSE_CUSTOM_TAGS" to use "%s".', $matches['tag']), $this->getRealCurrentLineNb() + 1, $value, $this->filename);
1148
+ }
1149
+
1150
+ private function lexInlineQuotedString(int &$cursor = 0): string
1151
+ {
1152
+ $quotation = $this->currentLine[$cursor];
1153
+ $value = $quotation;
1154
+ ++$cursor;
1155
+
1156
+ $previousLineWasNewline = true;
1157
+ $previousLineWasTerminatedWithBackslash = false;
1158
+ $lineNumber = 0;
1159
+
1160
+ do {
1161
+ if (++$lineNumber > 1) {
1162
+ $cursor += strspn($this->currentLine, ' ', $cursor);
1163
+ }
1164
+
1165
+ if ($this->isCurrentLineBlank()) {
1166
+ $value .= "\n";
1167
+ } elseif (!$previousLineWasNewline && !$previousLineWasTerminatedWithBackslash) {
1168
+ $value .= ' ';
1169
+ }
1170
+
1171
+ for (; \strlen($this->currentLine) > $cursor; ++$cursor) {
1172
+ switch ($this->currentLine[$cursor]) {
1173
+ case '\\':
1174
+ if ("'" === $quotation) {
1175
+ $value .= '\\';
1176
+ } elseif (isset($this->currentLine[++$cursor])) {
1177
+ $value .= '\\'.$this->currentLine[$cursor];
1178
+ }
1179
+
1180
+ break;
1181
+ case $quotation:
1182
+ ++$cursor;
1183
+
1184
+ if ("'" === $quotation && isset($this->currentLine[$cursor]) && "'" === $this->currentLine[$cursor]) {
1185
+ $value .= "''";
1186
+ break;
1187
+ }
1188
+
1189
+ return $value.$quotation;
1190
+ default:
1191
+ $value .= $this->currentLine[$cursor];
1192
+ }
1193
+ }
1194
+
1195
+ if ($this->isCurrentLineBlank()) {
1196
+ $previousLineWasNewline = true;
1197
+ $previousLineWasTerminatedWithBackslash = false;
1198
+ } elseif ('\\' === $this->currentLine[-1]) {
1199
+ $previousLineWasNewline = false;
1200
+ $previousLineWasTerminatedWithBackslash = true;
1201
+ } else {
1202
+ $previousLineWasNewline = false;
1203
+ $previousLineWasTerminatedWithBackslash = false;
1204
+ }
1205
+
1206
+ if ($this->hasMoreLines()) {
1207
+ $cursor = 0;
1208
+ }
1209
+ } while ($this->moveToNextLine());
1210
+
1211
+ throw new ParseException('Malformed inline YAML string.');
1212
+ }
1213
+
1214
+ private function lexUnquotedString(int &$cursor): string
1215
+ {
1216
+ $offset = $cursor;
1217
+ $cursor += strcspn($this->currentLine, '[]{},: ', $cursor);
1218
+
1219
+ if ($cursor === $offset) {
1220
+ throw new ParseException('Malformed unquoted YAML string.');
1221
+ }
1222
+
1223
+ return substr($this->currentLine, $offset, $cursor - $offset);
1224
+ }
1225
+
1226
+ private function lexInlineMapping(int &$cursor = 0): string
1227
+ {
1228
+ return $this->lexInlineStructure($cursor, '}');
1229
+ }
1230
+
1231
+ private function lexInlineSequence(int &$cursor = 0): string
1232
+ {
1233
+ return $this->lexInlineStructure($cursor, ']');
1234
+ }
1235
+
1236
+ private function lexInlineStructure(int &$cursor, string $closingTag): string
1237
+ {
1238
+ $value = $this->currentLine[$cursor];
1239
+ ++$cursor;
1240
+
1241
+ do {
1242
+ $this->consumeWhitespaces($cursor);
1243
+
1244
+ while (isset($this->currentLine[$cursor])) {
1245
+ switch ($this->currentLine[$cursor]) {
1246
+ case '"':
1247
+ case "'":
1248
+ $value .= $this->lexInlineQuotedString($cursor);
1249
+ break;
1250
+ case ':':
1251
+ case ',':
1252
+ $value .= $this->currentLine[$cursor];
1253
+ ++$cursor;
1254
+ break;
1255
+ case '{':
1256
+ $value .= $this->lexInlineMapping($cursor);
1257
+ break;
1258
+ case '[':
1259
+ $value .= $this->lexInlineSequence($cursor);
1260
+ break;
1261
+ case $closingTag:
1262
+ $value .= $this->currentLine[$cursor];
1263
+ ++$cursor;
1264
+
1265
+ return $value;
1266
+ case '#':
1267
+ break 2;
1268
+ default:
1269
+ $value .= $this->lexUnquotedString($cursor);
1270
+ }
1271
+
1272
+ if ($this->consumeWhitespaces($cursor)) {
1273
+ $value .= ' ';
1274
+ }
1275
+ }
1276
+
1277
+ if ($this->hasMoreLines()) {
1278
+ $cursor = 0;
1279
+ }
1280
+ } while ($this->moveToNextLine());
1281
+
1282
+ throw new ParseException('Malformed inline YAML string.');
1283
+ }
1284
+
1285
+ private function consumeWhitespaces(int &$cursor): bool
1286
+ {
1287
+ $whitespacesConsumed = 0;
1288
+
1289
+ do {
1290
+ $whitespaceOnlyTokenLength = strspn($this->currentLine, ' ', $cursor);
1291
+ $whitespacesConsumed += $whitespaceOnlyTokenLength;
1292
+ $cursor += $whitespaceOnlyTokenLength;
1293
+
1294
+ if (isset($this->currentLine[$cursor])) {
1295
+ return 0 < $whitespacesConsumed;
1296
+ }
1297
+
1298
+ if ($this->hasMoreLines()) {
1299
+ $cursor = 0;
1300
+ }
1301
+ } while ($this->moveToNextLine());
1302
+
1303
+ return 0 < $whitespacesConsumed;
1304
+ }
1305
+ }