blueink-client-python 1.2.0__tar.gz → 1.4.0__tar.gz

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 (41) hide show
  1. {blueink_client_python-1.2.0 → blueink_client_python-1.4.0}/PKG-INFO +84 -7
  2. blueink_client_python-1.2.0/src/blueink_client_python.egg-info/PKG-INFO → blueink_client_python-1.4.0/README.md +79 -30
  3. {blueink_client_python-1.2.0 → blueink_client_python-1.4.0}/setup.cfg +5 -5
  4. {blueink_client_python-1.2.0 → blueink_client_python-1.4.0}/src/blueink/bundle_helper.py +6 -4
  5. {blueink_client_python-1.2.0 → blueink_client_python-1.4.0}/src/blueink/client.py +2 -0
  6. {blueink_client_python-1.2.0 → blueink_client_python-1.4.0}/src/blueink/constants.py +4 -0
  7. {blueink_client_python-1.2.0 → blueink_client_python-1.4.0}/src/blueink/endpoints.py +7 -0
  8. {blueink_client_python-1.2.0 → blueink_client_python-1.4.0}/src/blueink/model/bundles.py +123 -123
  9. blueink_client_python-1.4.0/src/blueink/model/persons.py +18 -0
  10. blueink_client_python-1.4.0/src/blueink/model/webhook.py +36 -0
  11. {blueink_client_python-1.2.0 → blueink_client_python-1.4.0}/src/blueink/person_helper.py +1 -1
  12. {blueink_client_python-1.2.0 → blueink_client_python-1.4.0}/src/blueink/subclients/bundle.py +45 -1
  13. {blueink_client_python-1.2.0 → blueink_client_python-1.4.0}/src/blueink/subclients/packet.py +1 -1
  14. blueink_client_python-1.4.0/src/blueink/subclients/verify.py +20 -0
  15. {blueink_client_python-1.2.0 → blueink_client_python-1.4.0}/src/blueink/subclients/webhook.py +6 -12
  16. blueink_client_python-1.4.0/src/blueink/tests/test_apiv2_218_constants.py +23 -0
  17. {blueink_client_python-1.2.0 → blueink_client_python-1.4.0}/src/blueink/tests/test_client.py +26 -6
  18. blueink_client_python-1.2.0/README.md → blueink_client_python-1.4.0/src/blueink_client_python.egg-info/PKG-INFO +107 -2
  19. {blueink_client_python-1.2.0 → blueink_client_python-1.4.0}/src/blueink_client_python.egg-info/SOURCES.txt +2 -0
  20. blueink_client_python-1.4.0/src/blueink_client_python.egg-info/requires.txt +16 -0
  21. blueink_client_python-1.2.0/src/blueink/model/persons.py +0 -20
  22. blueink_client_python-1.2.0/src/blueink/model/webhook.py +0 -30
  23. blueink_client_python-1.2.0/src/blueink_client_python.egg-info/requires.txt +0 -16
  24. {blueink_client_python-1.2.0 → blueink_client_python-1.4.0}/LICENSE +0 -0
  25. {blueink_client_python-1.2.0 → blueink_client_python-1.4.0}/pyproject.toml +0 -0
  26. {blueink_client_python-1.2.0 → blueink_client_python-1.4.0}/src/blueink/__init__.py +0 -0
  27. {blueink_client_python-1.2.0 → blueink_client_python-1.4.0}/src/blueink/model/__init__.py +0 -0
  28. {blueink_client_python-1.2.0 → blueink_client_python-1.4.0}/src/blueink/paginator.py +0 -0
  29. {blueink_client_python-1.2.0 → blueink_client_python-1.4.0}/src/blueink/request_helper.py +0 -0
  30. {blueink_client_python-1.2.0 → blueink_client_python-1.4.0}/src/blueink/subclients/__init__.py +0 -0
  31. {blueink_client_python-1.2.0 → blueink_client_python-1.4.0}/src/blueink/subclients/envelope_template.py +0 -0
  32. {blueink_client_python-1.2.0 → blueink_client_python-1.4.0}/src/blueink/subclients/person.py +0 -0
  33. {blueink_client_python-1.2.0 → blueink_client_python-1.4.0}/src/blueink/subclients/subclient.py +0 -0
  34. {blueink_client_python-1.2.0 → blueink_client_python-1.4.0}/src/blueink/subclients/template.py +0 -0
  35. {blueink_client_python-1.2.0 → blueink_client_python-1.4.0}/src/blueink/tests/__init__.py +0 -0
  36. {blueink_client_python-1.2.0 → blueink_client_python-1.4.0}/src/blueink/tests/test_bundle_helper.py +0 -0
  37. {blueink_client_python-1.2.0 → blueink_client_python-1.4.0}/src/blueink/tests/test_person_helper.py +0 -0
  38. {blueink_client_python-1.2.0 → blueink_client_python-1.4.0}/src/blueink/utils/__init__.py +0 -0
  39. {blueink_client_python-1.2.0 → blueink_client_python-1.4.0}/src/blueink/utils/testcase.py +0 -0
  40. {blueink_client_python-1.2.0 → blueink_client_python-1.4.0}/src/blueink_client_python.egg-info/dependency_links.txt +0 -0
  41. {blueink_client_python-1.2.0 → blueink_client_python-1.4.0}/src/blueink_client_python.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: blueink-client-python
3
- Version: 1.2.0
3
+ Version: 1.4.0
4
4
  Summary: Python Client for Blueink eSignature API
5
5
  Home-page: https://github.com/blueinkhq/blueink-client-python
6
6
  Author: Blueink
@@ -14,16 +14,16 @@ Description-Content-Type: text/markdown
14
14
  License-File: LICENSE
15
15
  Requires-Dist: munch
16
16
  Requires-Dist: requests
17
- Requires-Dist: pydantic
18
- Requires-Dist: email-validator
17
+ Requires-Dist: pydantic<3.0,>=2.0
18
+ Requires-Dist: email-validator<3.0,>=2.0
19
19
  Provides-Extra: munch
20
20
  Requires-Dist: munch>=2.5; extra == "munch"
21
21
  Provides-Extra: requests
22
22
  Requires-Dist: requests>=2.31; extra == "requests"
23
23
  Provides-Extra: pydantic
24
- Requires-Dist: pydantic>=1.9; extra == "pydantic"
24
+ Requires-Dist: pydantic<3.0,>=2.0; extra == "pydantic"
25
25
  Provides-Extra: email-validator
26
- Requires-Dist: 1.2; extra == "email-validator"
26
+ Requires-Dist: email-validator<3.0,>=2.0; extra == "email-validator"
27
27
  Dynamic: license-file
28
28
 
29
29
  # blueink-client-python
@@ -124,6 +124,7 @@ The supported "resources" are:
124
124
  * `persons`
125
125
  * `packets`
126
126
  * `templates`
127
+ * `envelope_templates`
127
128
  * `webhooks`
128
129
 
129
130
  The methods correspond to common REST operations:
@@ -266,6 +267,8 @@ as kwargs.
266
267
 
267
268
  ### Bundle Related
268
269
  * Create via ```client.bundles.create(...)``` or ```client.bundles.create_from_bundle_helper(...)```
270
+ * Create from Envelope Template via ```client.bundles.create_from_envelope_template_helper(...)``` or ```client.bundles.create_from_envelope_template(...)```
271
+ * Create Preparation Session via ```client.bundles.create_preparation_session(...)```
269
272
  * List via ```client.bundles.list(...)``` or ```client.bundles.paged_list(...)```
270
273
  * Retrieve via ```client.bundles.retrieve(...)```
271
274
  * Cancel via ```client.bundles.cancel(...)```
@@ -289,6 +292,12 @@ as kwargs.
289
292
  ### Template Related
290
293
  * List via ```client.templates.list(...)``` or ```client.templates.paged_list(...)```
291
294
  * Retrieve via ```client.templates.retrieve(...)```
295
+ * Update via ```client.templates.update(...)```
296
+ * Create Preparation Session via ```client.templates.create_preparation_session(...)```
297
+
298
+ ### Envelope Template Related
299
+ * List via ```client.envelope_templates.list(...)``` or ```client.envelope_templates.paged_list(...)```
300
+ * Retrieve via ```client.envelope_templates.retrieve(...)```
292
301
 
293
302
  ### Webhook Related
294
303
 
@@ -452,6 +461,19 @@ response = client.bundles.create_from_bundle_helper(bh)
452
461
  - Automatically adjusts to text position in the document
453
462
  - Can be combined with regular manually-positioned fields
454
463
 
464
+ #### Bundle Tag Values
465
+
466
+ Bundle-level `tag_values` can be set on the `BundleHelper` constructor to attach
467
+ arbitrary key/value metadata to a Bundle at creation time:
468
+
469
+ ```python
470
+ bh = BundleHelper(
471
+ label="Tagged Agreement",
472
+ is_test=True,
473
+ tag_values={"contract_type": "nda"},
474
+ )
475
+ ```
476
+
455
477
  #### Retrieval
456
478
 
457
479
  Getting a single bundle is fairly easy. They can be accessed with a single call. To get
@@ -688,9 +710,64 @@ for page in client.templates.paged_list():
688
710
  page.data # templates in page
689
711
  # single
690
712
  template_response = client.templates.retrieve(template_id)
713
+ ```
714
+
715
+ Templates can also be partially updated (for example, to write template metadata):
716
+
717
+ ```python
718
+ client.templates.update(template_id, {"metadata": {"key": "value"}})
719
+ ```
720
+
721
+ #### Template Preparation Sessions
722
+
723
+ A preparation session creates a secure, time-limited URL that can be embedded in an
724
+ iframe to let an end user prepare a template through your application:
725
+
726
+ ```python
727
+ response = client.templates.create_preparation_session({
728
+ "template_id": template_id, # optional: slug of an existing template to edit
729
+ "redirect_url": "https://your-app.example.com/done", # optional
730
+ })
731
+ prep_url = response.data.url # URL to embed in an iframe
732
+ expires = response.data.expires # ISO 8601 timestamp when the URL expires
733
+ ```
734
+
735
+ A similar session can be created for bundle/document preparation via
736
+ `client.bundles.create_preparation_session(...)`.
737
+
738
+ ### Envelope Templates
739
+
740
+ Envelope Templates are reusable document workflows that contain predefined documents,
741
+ field layouts, signer roles, and configuration settings. They can be listed (non-paged),
742
+ listed (paged) or retrieved singly:
743
+
744
+ ```python
745
+ # non paged
746
+ envelope_templates_response = client.envelope_templates.list()
747
+ # paged
748
+ for page in client.envelope_templates.paged_list():
749
+ page.data # envelope templates in page
750
+ # single
751
+ envelope_template_response = client.envelope_templates.retrieve(envelope_template_id)
752
+ ```
691
753
 
754
+ To create a Bundle from an envelope template, configure a `BundleHelper` with the
755
+ template and its signers, then create the Bundle:
692
756
 
757
+ ```python
758
+ from blueink import BundleHelper, Client
759
+
760
+ bh = BundleHelper(label="Contract", is_test=True)
761
+ bh.add_signer(name="John Doe", email="john@example.com", key="signer-1")
762
+ bh.set_envelope_template(
763
+ template_id="T-abc123",
764
+ field_values={"company_name": "ACME Corp"},
765
+ )
766
+
767
+ client = Client()
768
+ response = client.bundles.create_from_envelope_template_helper(bh)
693
769
  ```
770
+
694
771
  ### Webhooks
695
772
 
696
773
  Webhooks can be interacted with via several methods. Webhooks also have related objects, such as
@@ -701,8 +778,8 @@ methods to interact with.
701
778
  from copy import deepcopy
702
779
 
703
780
  from requests import HTTPError
704
- from src.blueink import Client
705
- from src.blueink.constants import EVENT_TYPE
781
+ from blueink import Client
782
+ from blueink.constants import EVENT_TYPE
706
783
 
707
784
  WEBHOOK_01 = {
708
785
  "url": "https://www.example.com/01/",
@@ -1,31 +1,3 @@
1
- Metadata-Version: 2.4
2
- Name: blueink-client-python
3
- Version: 1.2.0
4
- Summary: Python Client for Blueink eSignature API
5
- Home-page: https://github.com/blueinkhq/blueink-client-python
6
- Author: Blueink
7
- Author-email: pypi@blueink.com
8
- Project-URL: Bug Tracker, https://github.com/blueinkhq/blueink-client-python/issues
9
- Classifier: Programming Language :: Python :: 3
10
- Classifier: License :: OSI Approved :: MIT License
11
- Classifier: Operating System :: OS Independent
12
- Requires-Python: >=3.8
13
- Description-Content-Type: text/markdown
14
- License-File: LICENSE
15
- Requires-Dist: munch
16
- Requires-Dist: requests
17
- Requires-Dist: pydantic
18
- Requires-Dist: email-validator
19
- Provides-Extra: munch
20
- Requires-Dist: munch>=2.5; extra == "munch"
21
- Provides-Extra: requests
22
- Requires-Dist: requests>=2.31; extra == "requests"
23
- Provides-Extra: pydantic
24
- Requires-Dist: pydantic>=1.9; extra == "pydantic"
25
- Provides-Extra: email-validator
26
- Requires-Dist: 1.2; extra == "email-validator"
27
- Dynamic: license-file
28
-
29
1
  # blueink-client-python
30
2
  ![Tests](https://github.com/blueinkhq/blueink-client-python/actions/workflows/helper-tests.yml/badge.svg)
31
3
  ![Style Checks](https://github.com/blueinkhq/blueink-client-python/actions/workflows/style-checks.yml/badge.svg)
@@ -124,6 +96,7 @@ The supported "resources" are:
124
96
  * `persons`
125
97
  * `packets`
126
98
  * `templates`
99
+ * `envelope_templates`
127
100
  * `webhooks`
128
101
 
129
102
  The methods correspond to common REST operations:
@@ -266,6 +239,8 @@ as kwargs.
266
239
 
267
240
  ### Bundle Related
268
241
  * Create via ```client.bundles.create(...)``` or ```client.bundles.create_from_bundle_helper(...)```
242
+ * Create from Envelope Template via ```client.bundles.create_from_envelope_template_helper(...)``` or ```client.bundles.create_from_envelope_template(...)```
243
+ * Create Preparation Session via ```client.bundles.create_preparation_session(...)```
269
244
  * List via ```client.bundles.list(...)``` or ```client.bundles.paged_list(...)```
270
245
  * Retrieve via ```client.bundles.retrieve(...)```
271
246
  * Cancel via ```client.bundles.cancel(...)```
@@ -289,6 +264,12 @@ as kwargs.
289
264
  ### Template Related
290
265
  * List via ```client.templates.list(...)``` or ```client.templates.paged_list(...)```
291
266
  * Retrieve via ```client.templates.retrieve(...)```
267
+ * Update via ```client.templates.update(...)```
268
+ * Create Preparation Session via ```client.templates.create_preparation_session(...)```
269
+
270
+ ### Envelope Template Related
271
+ * List via ```client.envelope_templates.list(...)``` or ```client.envelope_templates.paged_list(...)```
272
+ * Retrieve via ```client.envelope_templates.retrieve(...)```
292
273
 
293
274
  ### Webhook Related
294
275
 
@@ -452,6 +433,19 @@ response = client.bundles.create_from_bundle_helper(bh)
452
433
  - Automatically adjusts to text position in the document
453
434
  - Can be combined with regular manually-positioned fields
454
435
 
436
+ #### Bundle Tag Values
437
+
438
+ Bundle-level `tag_values` can be set on the `BundleHelper` constructor to attach
439
+ arbitrary key/value metadata to a Bundle at creation time:
440
+
441
+ ```python
442
+ bh = BundleHelper(
443
+ label="Tagged Agreement",
444
+ is_test=True,
445
+ tag_values={"contract_type": "nda"},
446
+ )
447
+ ```
448
+
455
449
  #### Retrieval
456
450
 
457
451
  Getting a single bundle is fairly easy. They can be accessed with a single call. To get
@@ -688,9 +682,64 @@ for page in client.templates.paged_list():
688
682
  page.data # templates in page
689
683
  # single
690
684
  template_response = client.templates.retrieve(template_id)
685
+ ```
691
686
 
687
+ Templates can also be partially updated (for example, to write template metadata):
692
688
 
689
+ ```python
690
+ client.templates.update(template_id, {"metadata": {"key": "value"}})
693
691
  ```
692
+
693
+ #### Template Preparation Sessions
694
+
695
+ A preparation session creates a secure, time-limited URL that can be embedded in an
696
+ iframe to let an end user prepare a template through your application:
697
+
698
+ ```python
699
+ response = client.templates.create_preparation_session({
700
+ "template_id": template_id, # optional: slug of an existing template to edit
701
+ "redirect_url": "https://your-app.example.com/done", # optional
702
+ })
703
+ prep_url = response.data.url # URL to embed in an iframe
704
+ expires = response.data.expires # ISO 8601 timestamp when the URL expires
705
+ ```
706
+
707
+ A similar session can be created for bundle/document preparation via
708
+ `client.bundles.create_preparation_session(...)`.
709
+
710
+ ### Envelope Templates
711
+
712
+ Envelope Templates are reusable document workflows that contain predefined documents,
713
+ field layouts, signer roles, and configuration settings. They can be listed (non-paged),
714
+ listed (paged) or retrieved singly:
715
+
716
+ ```python
717
+ # non paged
718
+ envelope_templates_response = client.envelope_templates.list()
719
+ # paged
720
+ for page in client.envelope_templates.paged_list():
721
+ page.data # envelope templates in page
722
+ # single
723
+ envelope_template_response = client.envelope_templates.retrieve(envelope_template_id)
724
+ ```
725
+
726
+ To create a Bundle from an envelope template, configure a `BundleHelper` with the
727
+ template and its signers, then create the Bundle:
728
+
729
+ ```python
730
+ from blueink import BundleHelper, Client
731
+
732
+ bh = BundleHelper(label="Contract", is_test=True)
733
+ bh.add_signer(name="John Doe", email="john@example.com", key="signer-1")
734
+ bh.set_envelope_template(
735
+ template_id="T-abc123",
736
+ field_values={"company_name": "ACME Corp"},
737
+ )
738
+
739
+ client = Client()
740
+ response = client.bundles.create_from_envelope_template_helper(bh)
741
+ ```
742
+
694
743
  ### Webhooks
695
744
 
696
745
  Webhooks can be interacted with via several methods. Webhooks also have related objects, such as
@@ -701,8 +750,8 @@ methods to interact with.
701
750
  from copy import deepcopy
702
751
 
703
752
  from requests import HTTPError
704
- from src.blueink import Client
705
- from src.blueink.constants import EVENT_TYPE
753
+ from blueink import Client
754
+ from blueink.constants import EVENT_TYPE
706
755
 
707
756
  WEBHOOK_01 = {
708
757
  "url": "https://www.example.com/01/",
@@ -1,6 +1,6 @@
1
1
  [metadata]
2
2
  name = blueink-client-python
3
- version = 1.2.0
3
+ version = 1.4.0
4
4
  author = Blueink
5
5
  author_email = pypi@blueink.com
6
6
  description = Python Client for Blueink eSignature API
@@ -22,14 +22,14 @@ python_requires = >=3.8
22
22
  install_requires =
23
23
  munch
24
24
  requests
25
- pydantic
26
- email-validator
25
+ pydantic>=2.0,<3.0
26
+ email-validator>=2.0,<3.0
27
27
 
28
28
  [options.extras_require]
29
29
  munch = munch>=2.5;
30
30
  requests = requests>=2.31;
31
- pydantic = pydantic>=1.9
32
- email-validator> = 1.2
31
+ pydantic = pydantic>=2.0,<3.0
32
+ email-validator = email-validator>=2.0,<3.0
33
33
 
34
34
  [options.packages.find]
35
35
  where = src
@@ -558,7 +558,7 @@ class BundleHelper:
558
558
  Bundle as dictionary
559
559
  """
560
560
  bundle = self._compile_bundle(**additional_data)
561
- return bundle.dict(exclude_unset=True, exclude_none=True)
561
+ return bundle.model_dump(exclude_unset=True, exclude_none=True)
562
562
 
563
563
  def as_data_for_envelope_template(self, **additional_data):
564
564
  """Return data for creating a bundle from an envelope template.
@@ -588,8 +588,10 @@ class BundleHelper:
588
588
 
589
589
  packets = list(self._packets.values())
590
590
  result = {
591
- "packets": [p.dict(exclude_unset=True, exclude_none=True) for p in packets],
592
- "envelope_template": self._envelope_template.dict(
591
+ "packets": [
592
+ p.model_dump(exclude_unset=True, exclude_none=True) for p in packets
593
+ ],
594
+ "envelope_template": self._envelope_template.model_dump(
593
595
  exclude_unset=True, exclude_none=True
594
596
  ),
595
597
  }
@@ -627,4 +629,4 @@ class BundleHelper:
627
629
  Bundle as json
628
630
  """
629
631
  bundle = self._compile_bundle(**additional_data)
630
- return bundle.json(exclude_unset=True, exclude_none=True)
632
+ return bundle.model_dump_json(exclude_unset=True, exclude_none=True)
@@ -11,6 +11,7 @@ from blueink.subclients.envelope_template import EnvelopeTemplateSubClient
11
11
  from blueink.subclients.packet import PacketSubClient
12
12
  from blueink.subclients.person import PersonSubClient
13
13
  from blueink.subclients.template import TemplateSubClient
14
+ from blueink.subclients.verify import VerifySubClient
14
15
  from blueink.subclients.webhook import WebhookSubClient
15
16
 
16
17
 
@@ -74,3 +75,4 @@ class Client:
74
75
  self._base_url, self._request_helper
75
76
  )
76
77
  self.webhooks = WebhookSubClient(self._base_url, self._request_helper)
78
+ self.verify = VerifySubClient(self._base_url, self._request_helper)
@@ -64,6 +64,7 @@ FIELD_KIND = Munch(
64
64
  CHECKBOX="chk",
65
65
  CHECKBOXES="cbx",
66
66
  ATTACHMENT="att",
67
+ STAMP="stp",
67
68
  )
68
69
 
69
70
  PACKET_STATUS = Munch(
@@ -75,6 +76,7 @@ PACKET_STATUS = Munch(
75
76
  EXPIRED="ex",
76
77
  COMPLETE="co",
77
78
  FAILED="fa",
79
+ REASSIGNED="ra",
78
80
  )
79
81
 
80
82
  V_PATTERN = Munch(
@@ -94,6 +96,8 @@ EVENT_TYPE = Munch(
94
96
  EVENT_BUNDLE_DOCS_READY="bundle_docs_ready",
95
97
  EVENT_BUNDLE_ERROR="bundle_error",
96
98
  EVENT_BUNDLE_CANCELLED="bundle_cancelled",
99
+ EVENT_BUNDLE_SIGNER_REASSIGNED="bundle_signer_reassigned",
97
100
  EVENT_PACKET_VIEWED="packet_viewed",
98
101
  EVENT_PACKET_COMPLETE="packet_complete",
102
+ EVENT_PACKET_DECLINED="packet_declined",
99
103
  )
@@ -12,6 +12,9 @@ class BUNDLES:
12
12
  CREATE_PREPARATION_SESSION = "/bundles/preparation_session/"
13
13
  LIST = "/bundles/"
14
14
  RETRIEVE = "/bundles/${bundle_id}/"
15
+ UPDATE = "/bundles/${bundle_id}/"
16
+ SEND = "/bundles/${bundle_id}/send/"
17
+ VALIDATE = "/bundles/${bundle_id}/validate/"
15
18
  CANCEL = "/bundles/${bundle_id}/cancel/"
16
19
  LIST_EVENTS = "/bundles/${bundle_id}/events/"
17
20
  LIST_FILES = "/bundles/${bundle_id}/files/"
@@ -45,6 +48,10 @@ class ENVELOPE_TEMPLATES:
45
48
  RETRIEVE = "/envelope-templates/${envelope_template_id}/"
46
49
 
47
50
 
51
+ class VERIFY:
52
+ CREATE = "/verify/"
53
+
54
+
48
55
  class WEBHOOKS:
49
56
  CREATE = "/webhooks/"
50
57
  LIST = "/webhooks/"