dropbox-sign 1.0.0.pre.beta2301

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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
+ }