Skip to content

Latest commit

 

History

History
460 lines (329 loc) · 33.8 KB

CHANGELOG.md

File metadata and controls

460 lines (329 loc) · 33.8 KB

Changelog

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.


1.9.1 - 2026-10-08

Fixed

  • Premature Stream Termination: Fixed auto-pagination in Endpoint.stream() aborting after the first page due to Mailjet's page-local Total metadata (Total == len(Data)). Iteration now continues across full pages until receiving a short or empty page (len(data) < chunk_size).
  • Stream Limit Parameter Normalization: Endpoint._normalize_stream_filters now strips both "limit" and "Limit" from input filters so chunk_size strictly dictates the request page window.
  • Integration Webhook Collision: Added idempotent pre-test cleanup to test_live_eventcallbackurl_crud_lifecycle to remove leftover "open" webhooks and avoid HTTP 400 MJ18 uniqueness constraint failures.

Added

  • API Ceiling Guardrail: Enforced Endpoint.MAX_LIMIT = 1000 to reject chunk_size > 1000 with a descriptive ValueError, preventing silent page truncation from Mailjet's upstream 1,000-record limit.
  • Pagination Examples & CI Checks: Added stream_all_contacts to samples/contacts_sample.py, and added live verification for .stream(), offset resumption, and multidict query filters to samples/smoke_readme_runner.py.
  • Pagination Unit Tests: Added test coverage in tests/unit/test_endpoint.py verifying page-local totals across varied offsets, empty collection exits, casing normalization, and maximum limit rejections.

Security

  • HTML Tag Bomb DoS Mitigation (CWE-400): Introduced SecurityGuard.MAX_TAG_COUNT = 10000 and tag-counting enforcement in _SpamGuardParser across all tag types and comments, raising ValidationError on nested tag flood attacks.
  • Security Policy Update: Updated SECURITY.md supported releases table to designate versions < 1.9.1 as end-of-life.

Changed

  • Documentation: Updated README.md with explicit examples comparing manual single-page GET queries (Limit, Offset, Sort) with lazy .stream() auto-pagination and stream resumption.
  • CI & Maintenance: Reduced ClusterFuzzLite batch fuzzing schedule to monthly, clarified the security scan workflow schedule, and bumped pre-commit hook revisions (commitizen, semgrep, typos, check-jsonschema, slotscheck, ruff, and mypy).
  • Workflow Dependencies: Upgraded GitHub Actions dependencies across CI workflows (codeql-action, setup-miniconda, codecov-action, and osv-scanner-action).

Pull Requests Merged

  • PR #161: build(deps): bump github/codeql-action/analyze from 4.38.1 to 4.38.2.
  • PR #160: build(deps): bump github/codeql-action/upload-sarif from 4.38.1 to 4.38.2.
  • PR #159: Release 1.9.1.
  • PR #158: Fix stream pagination premature termination on page-local Total.
  • PR #157: build(deps): bump github/codeql-action/analyze from 4.38.0 to 4.38.1.
  • PR #156: build(deps): bump github/codeql-action/upload-sarif from 4.38.0 to 4.38.1.
  • PR #155: build(deps): bump conda-incubator/setup-miniconda from 4.0.1 to 4.1.0.
  • PR #154: build(deps): bump codecov/codecov-action from 7.0.0 to 7.1.1.
  • PR #153: build(deps): bump google/osv-scanner-action/osv-scanner-action from 2.5.1 to 2.6.0.
  • PR #152: build(deps): bump github/codeql-action/analyze from 4.37.9 to 4.38.0.
  • PR #151: build(deps): bump github/codeql-action/upload-sarif from 4.37.9 to 4.38.0.

1.9.0 - 2026-09-14

Added

  • Static O(1) Route Additions: Registered missing static route definitions in ROUTE_MAP for contactslist_csvdata and batchjob_csverror.
  • Sub-Action Hyphenation: Re-implemented native CamelCase-to-kebab-case transformation for sub-actions in Endpoint.__init__ (e.g., statistics_linkClick $\rightarrow$ statistics/link-click).
  • Stream Query Parameter Casting: Added Endpoint._cast_query_param and _normalize_stream_filters to automatically parse and cast multidict query filter values (such as those from urllib.parse.parse_qs) to int, float, bool, list, tuple, or set.
  • Custom Headers Support: Added optional headers parameter to Endpoint.__call__, create(), and update().
  • Fuzz Dictionary Expansion: Added route tokens, streaming keywords, HTML/XSS triggers, IDN tags, and secret patterns to tests/fuzz/fuzzer.dict.

Changed

  • Stream Generator Termination: Enhanced Endpoint.stream() to check Total from response bodies, automatically halting iteration when current_offset + len(data) >= total.
  • Redaction of Complex Types: Expanded RedactingFilter to recursively sanitize typing.NamedTuple instances (preserving structure), objects with model_dump() (e.g., Pydantic models), __dict__-based instances, and set/frozenset collections.
  • Path Control Character Neutralization: SecurityGuard.sanitize_log_trace now cleans unprintable ASCII control characters ([\x00-\x1f\x7f]) before whitespace normalization.
  • Email IDN Parsing: Switched IDN extraction in SecurityGuard.normalize_domain to rpartition("@") and scoped exception interception directly to UnicodeError.
  • Sample Updates: Refactored samples/segments_sample.py to use campaigndraft and updated samples/smoke_readme_runner.py health checks to use canonical endpoints eventcallbackurl and template_contents.

Deprecated

  • Deprecation Advisory Mapping: Introduced DEPRECATION_ADVISORY in routes.py to emit non-breaking DeprecationWarning notices pointing to recommended replacements:
    • newsletter and sub-resources (newsletter_*) $\rightarrow$ campaigndraft / campaigndraft_*
    • Legacy statistics (apikeytotals, campaignstatistics, liststatistics, domainstatistics, etc.) $\rightarrow$ statcounters and statistics_recipientEsp
    • Removed SDK alias webhook $\rightarrow$ official REST resource eventcallbackurl
    • Legacy template endpoints (template_update, templates_contents) $\rightarrow$ template.update(id=...) or template_detailcontent (v3) / template_contents (v1)

Security

  • Strict Timeout Type Guard: Explicitly blocked boolean flags (True/False) in SecurityGuard.validate_timeout to prevent coercion to numeric 1.0/0.0 seconds.
  • Regular File Validation (CWE-400): Added explicit Path.is_file() verification in SecurityGuard.check_file_size before evaluating file stats.
  • Header Injection Screen (CWE-113): Broadened header sanitization in Client.api_call to accept Mapping[str, str | None] and screen non-None values against CRLF injection patterns.

Removed

  • ClusterFuzzLite Workflows: Removed redundant .github/workflows/cflite_build.yml and .github/workflows/cflite_cron.yml CI tasks.

Pull Requests Merged

  • PR #150: Release 1.9.0.
  • PR #149: Deprecate endpoints.
  • PR #148: build(deps): bump github/codeql-action/upload-sarif from 4.37.7 to 4.37.9.
  • PR #147: build(deps): bump github/codeql-action/analyze from 4.37.7 to 4.37.9.
  • PR #146: build(deps): bump github/codeql-action/analyze from 4.37.6 to 4.37.7.
  • PR #145: build(deps): bump github/codeql-action/upload-sarif from 4.37.6 to 4.37.7.
  • PR #144: build(deps): bump google/osv-scanner-action/osv-scanner-action from 2.5.0 to 2.5.1.

1.8.0 - 2026-08-17

Security

  • Secret Obfuscation (CWE-316): Added SecretAuth transport adapter and recursive RedactingFilter to strictly prevent API credentials and sensitive payload data from leaking in memory dumps, tracebacks, or system logs.
  • SpamGuard Analysis: Implemented internal HTML static analyzer (_SpamGuardParser) to preemptively intercept and block known XSS vectors (e.g., <script>, onerror=) before network dispatch.
  • Idempotency Fingerprinting: Automatically generates a safe SHA-256 Idempotency-Key header for state-mutating requests (POST, PUT, DELETE) to prevent duplicate mutations during network retries.
  • Punycode IDN Support (RFC 3490): Automatically normalizes Internationalized Domain Names (IDNs) in sender and recipient addresses via SecurityGuard.normalize_domain to prevent Unicode Homograph attacks.
  • Control Character & CRLF Validation (CWE-20, CWE-113): Added strict rejection of unprintable ASCII control characters in HTTP headers and dynamic path segments (SecurityGuard.sanitize_headers, SecurityGuard.sanitize_segment).
  • SSRF & Transport Security (CWE-918, CWE-319): Strictly enforces HTTPS scheme and authorized hostnames (mailjet.com or local test loopbacks) during Config initialization; enforces minimum TLS 1.2+ via SecureHTTPAdapter. Disabling TLS verification now strictly raises ValueError.
  • Resource Exhaustion Mitigations (CWE-400): Capped HTMLPart and TextPart inputs at 5MB safe limits, validated numeric scalar/tuple timeouts (rejecting NaN, Infinity, and non-positive values), and enforced chunk_size > 0 in generators.
  • Supply Chain & CI/CD Hardening: Integrated Google's ClusterFuzzLite, Zizmor, OpenSSF Scorecard, and OSV-Scanner into the GitHub Actions pipeline. Expanded the Atheris coverage-guided fuzzing suite.

Added

  • Memory-Safe File Chunking: Introduced ChunkedStreamer to iteratively read and base64-encode large file attachments in 512KB chunks, preventing Out-Of-Memory (OOM) allocation spikes.
  • Jitter Retry Engine: Implemented custom JitterRetry connection pooling policy utilizing exponential backoff and randomized full jitter for transient 429/5xx status codes to mitigate the "Thundering Herd" effect.
  • Fluent Builders: Added SendPayloadBuilder to construct root Send API v3.1 payload wrappers (supporting SandboxMode and Globals) and TemplateContentBuilder for Content API payloads.
  • Inline Attachments: Added .attach_inline() support to MessageBuilder for embedding inline images directly from disk.
  • Expanded Route Registry: Added explicit $O(1)$ routing entries in ROUTE_MAP for Messages, Bulk Contact Management, Campaigns, Newsletters, Template Content, DNS verifications, and Analytics endpoints.
  • Fuzzer Seed Harvester: Added dynamic corpus generation tool (seed_harvester.py) for automated security testing and schema discovery.

Changed

  • O(1) Route Resolution: Replaced dynamic __getattr__ and procedural if/elif string concatenation chains with an immutable routing table (ROUTE_MAP) and dedicated fallback resolvers (_resolve_registry_route, _resolve_dynamic_route).
  • Domain Exception Mapping: Client._execute_request now maps HTTP errors to specific domain exceptions (MailjetAuthError, ApiRateLimitError, DoesNotExistError, ValidationError, ApiError) with extracted response messages instead of returning raw error responses.
  • Stream Pagination Behavior: Endpoint.stream() default chunk_size increased from 100 to 1000, and now respects user-supplied Offset parameters for stream resumption.
  • Memory Density (__slots__): Standardized __slots__ across Endpoint, _BaseContentBuilder, MessageBuilder, SendPayloadBuilder, and TemplateContentBuilder to reduce RAM footprint and accelerate attribute access.
  • Template Content Schema: TemplateContentBuilder now generates standard kebab-case keys (Text-part, Html-part) matching the legacy v3 template endpoint expectations.
  • Builder Immutability: MessageBuilder.build() and TemplateContentBuilder.build() return deep/shallow dictionary copies (.copy()) to prevent downstream payload mutation.
  • Payload Types: Broadened PayloadType type alias in mailjet_rest.types to support bytes and list[Any] batch payloads.

Deprecated

  • Legacy Serialization Parameters: ensure_ascii and data_encoding arguments in Endpoint.__call__, create(), and update() emit DeprecationWarning; underlying requests handles JSON serialization natively.
  • Legacy Utility Functions: mailjet_rest.client.parse_response and mailjet_rest.client.logging_handler emit DeprecationWarning in favor of standard requests.Response methods and standard logging.
  • Unbounded Timeouts: Passing timeout=None emits a deprecation warning due to unbounded socket blocking risks (CWE-400).

Removed

  • Config.__getitem__ Routing Helper: Removed undocumented dictionary-style routing accessor (config[key]) from Config; route resolution is fully managed by ROUTE_MAP and Endpoint.
  • Procedural Route Functions: Removed obsolete procedural routing helpers (_route_send, _route_csv, _route_data, _route_rest) and Endpoint._build_csv_url in favor of centralized _resolve_registry_route and _resolve_dynamic_route.
  • auth Attribute Reflection: Removed raw credentials exposure on Client instances to prevent accidental credential leakage in memory inspectors and debug traces.

Fixed

  • Path Traversal Bypass (CWE-22): Explicitly sanitized action_id and dynamic path segments in legacy routing fallbacks (_resolve_dynamic_route) to prevent unescaped directory traversal execution.
  • Legacy Serialization for Lists: Fixed ensure_ascii and data_encoding fallbacks in Endpoint.__call__ to correctly serialize list batch payloads.
  • Stream None Offset Crash: Fixed TypeError in Endpoint.stream() when evaluating empty or None offsets.
  • Builder Variable Serialization: Handled non-serializable objects (such as datetime and UUID) in MessageBuilder.build() via default=str during variable length verification.

Pull Requests Merged

  • PR #135: Modernize SDK architecture, add fluent builders, implement O(1) routing, and harden OWASP security guardrails.
  • PR #142 - build(deps): bump ossf/scorecard-action from 2.4.0 to 2.4.4.
  • PR #141 — build(deps): bump github/codeql-action/analyze from 4.37.3 to 4.37.6 by @dependabot.
  • PR #140 — build(deps): bump actions/upload-artifact from 4.3.3 to 7.0.1 by @dependabot.
  • PR #139 — build(deps): bump codecov/codecov-action from 4.5.0 to 7.0.0 by @dependabot.
  • PR #138 — build(deps): bump github/codeql-action/upload-sarif from 4.37.3 to 4.37.6 by @dependabot.

1.7.0 - 2026-06-10

Security

  • Enterprise Runtime Security: Added opt-in PEP 578 Audit Hooks (sys.addaudithook) via Config.enable_security_audit to track runtime network events.
  • Path Traversal Mitigation: Implemented strict input sanitization using urllib.parse.quote(safe="") across endpoints to block directory traversal attacks.
  • Centralized Security Control: Centralized path and string checks inside SecurityGuard.sanitize_segment to stop CRLF injection and traversal attempts across all requests.
  • Pipeline validation: Added Google's osv-scanner and turned pip-audit into a strict, standalone task inside the GitHub Actions pipeline.
  • Static analysis: Expanded Semgrep scans to cover insecure transports and connected the custom Bandit configuration file straight into CI gates.
  • Fuzz testing: Integrated the Atheris coverage-guided fuzzing tool into development routines via a unified manage.sh fuzz_all script.

Added

  • Static O(1) Routing: Replaced procedural dynamic routing with an immutable ROUTE_MAP registry to process endpoints instantly and remove lookup overhead.
  • Zero-Leak Sandbox Mode: Introduced a dry_run=True client initialization parameter to safely mock mutations locally without sending real network traffic.
  • Lazy Pagination: Added a .stream() generator method on endpoints to handle records automatically without manual pagination loops.
  • Fluent payload builders: Introduced MessageBuilder and TemplateContentBuilder to easily construct and validate complex API requests.
  • Custom domain exceptions: Created a dedicated error layer with clear exceptions like ValidationError and MailjetAuthError to eliminate broad exception silencing.
  • Explicit type safety: Developed a complete types.py definition layer to remove MyPy type blindness across internal utilities.
  • URL templating engine: Added a dynamic path interpolation engine to handle multi-level REST endpoints smoothly.
  • Testing topology: Split tests into separate, dedicated environments for unit (fully offline), integration (live), regression, and fuzzing suites.
  • Structured telemetry: Enhanced internal logging to record structured API request payloads clearly.

Changed

  • Architectural Refactoring: Split the monolithic core file into single-responsibility modules and deployed __slots__ across core objects to optimize the overall memory footprint.
  • Internal performance tuning: Refactored core string operations to reduce cold-boot overhead by roughly 29ms.
  • Signature flexibility: Relaxed internal route handler parameters to support optional name identifiers.
  • Pipeline workflows: Configured pre-commit hooks to force validation over the entire repository context instead of only checking staged file fragments.
  • Infrastructure updates: Upgraded core GitHub Actions dependencies to modern release versions and aligned workspace triggers.
  • Development docs: Updated optimization benchmarks and performance profiling instructions.

Fixed

  • Legacy compatibility: Restored parity with old exceptions and dynamic routing mechanics to keep integration completely seamless for existing users.

Pull Requests Merged

  • PR_129 - Use hyphen in the package name in readme.
  • PR_130 - refactor: Modernize SDK architecture, harden security, and enable O(1) routing.
  • PR_131 - Release 1.7.0.

1.6.0 - 2026-04-27

Security

  • CWE-22 (Prevented Path Traversal): Prevented vulnerabilities by enforcing strict URL encoding (urllib.parse.quote) on all dynamically injected path parameters (id and action_id).
  • CWE-113 (CRLF Injection): Added strict header validation to block HTTP Request Smuggling.
  • CWE-117 (Log Forging): Implemented mandatory sanitization of telemetry data.
  • CWE-316 (Secret Leakage): Enhanced __repr__ and __str__ to prevent sensitive data from appearing in stack traces.
  • CWE-319 (Cleartext transmission): Prevented by enforcing strict api_url scheme validation (https) and hostname presence during Config initialization.
  • CWE-601 (Open Redirect): Hard-disabled automatic redirects (allow_redirects=False) for all API calls.
  • CWE-918 (SSRF): Added hostname validation to prevent credential exfiltration to non-Mailjet domains.
  • Added comprehensive security scanning to the CI/CD pipeline (bandit, semgrep, gitleaks, detect-secrets).
  • Updated SECURITY.md policy to clarify supported active branches.

Added

  • Official support for Python 3.14 (added to CI test matrix and PyPI classifiers).
  • Runtime dependency typing-extensions>=4.7.1 for Python versions <3.11 to support modern type hinting.
  • Context Managers (Resource Management): The Client now supports the with statement (__enter__ / __exit__) for automatic TCP connection pooling and socket cleanup, preventing resource leaks.
  • New mailjet_rest.utils.guardrails module for centralized security and routing validation.
  • sanitize_log_trace utility to protect against Log Forging attacks.
  • Proactive UserWarning for insecure TLS configurations and unencrypted HTTP proxies.
  • Smart Telemetry: The SDK now automatically extracts Mailjet Trace IDs (CustomID, Campaign, TemplateID) from payloads and headers, injecting them into debug logs for easier correlation with the Mailjet Dashboard.
  • Executable Documentation: Added samples/smoke_readme_runner.py as a dynamic test suite to guarantee all README.md examples are continuously validated and functional against the live API.
  • Developer Experience (DX) Guardrails: The SDK now logs explicit warnings when encountering ambiguous routing configurations (e.g., using the singular template resource on Content API v1, or attempting to route the Send API outside of v3/v3.1).
  • Content API (v1): Native multipart/form-data upload support using the requests files kwarg for the data_images endpoint.
  • Safe Exceptions: Network errors are now safely encapsulated in custom mailjet_rest exceptions (TimeoutError, CriticalApiError, ApiError).
  • Native Logging: Centralized HTTP status and debug logging in api_call using standard Python logging.
  • IDE Autocompletion: Overrode __dir__ in the core Client to expose high-traffic dynamic endpoints (e.g., .contact, .send, .campaigndraft) directly to IDE autocompletion engines (VS Code, PyCharm).
  • Validated and added explicit test coverage for Issue #97, proving TemplateLanguage and Variables are correctly serialized by the SDK.

Changed

  • Performance: Optimized dynamic routing by introducing an instance-level _endpoint_cache, resulting in a ~47x speedup for endpoint resolution.
  • Performance: Reduced RAM footprint and garbage collection overhead by implementing __slots__ across core Client, Config, and Endpoint classes.
  • Performance: Optimized API call overhead by replacing dynamic header generation with types.MappingProxyType (_JSON_HEADERS, _TEXT_HEADERS) and moving the retry configuration to a ClassVar.
  • Performance: Improved cold boot initialization time by replacing regex (re.match) with native string manipulation (.split()) in mailjet_rest/utils/version.py.
  • Test Suite Modernization: Migrated from legacy unittest monolith to pytest, segregated into tests/unit/ (offline) and tests/integration/ (live network), adhering to the AAA (Arrange, Act, Assert) pattern.
  • CI/CD Optimization: Drastically improved GitHub Actions speed and reliability by implementing native pip dependency caching (cache: 'pip') and isolated wheel installation tests.
  • Refactored Client and Config using @dataclass and requests.Session for robust connection pooling on multiple sequential requests.
  • Refactored Endpoint._build_url cyclomatic complexity by extracting pure @staticmethod helpers (_build_csv_url, _check_dx_guardrails) to satisfy strict static analysis.
  • Expanded pre-commit hooks for robust security and formatting (ruff, mypy, pyright, typos, bandit, semgrep).
  • Defined explicit public module interfaces using __all__ to prevent namespace pollution.
  • Cleaned up local development environments (environment-dev.yaml) and pinned sub-dependencies for stable CI pipelines.
  • Tooling Consolidation: Completely migrated to Ruff as the single source of truth for linting and formatting, purging legacy tools (Black, Flake8, Pylint, Pydocstyle) from pyproject.toml and Conda environments.
  • Documentation: Rewrote README.md to highlight modern DX configurations, including Context Managers, robust Error Handling, and Smart Telemetry.

Deprecated

  • Passing timeout=None to allow infinite socket blocking is deprecated to mitigate CWE-400. Explicit timeouts will be strictly enforced in v2.0.
  • Legacy HTTP exception classes (AuthorizationError, ApiRateLimitError, DoesNotExistError, ValidationError, ActionDeniedError). The SDK natively returns the requests.Response object for standard HTTP status codes.
  • The legacy ensure_ascii and data_encoding arguments in the create and update method signatures. The underlying requests library handles UTF-8 serialization natively.
  • The parse_response and logging_handler utility functions. Logging is now integrated cleanly and automatically via Python's standard logging library. See the README for the new 2-line setup.

Removed

  • Root test.py monolith (replaced by a modular test/ directory structure).
  • Redundant class constants (API_REF, DEFAULT_API_URL).

Fixed

  • Fixed statcounters required filters (explicitly added the CounterTiming parameter).

Pull Requests Merged

  • PR_125 - Refactor client.
  • PR_126 - build(deps): bump conda-incubator/setup-miniconda from 3.3.0 to 4.0.1
  • PR_128 - Release 1.6.0.
  • PR_129 - Use hyphen in the package name in readme.

1.5.1 - 2025-07-14

Removed

  • Remove */_version.py from .gitignore

Changed

  • Improve a conda recipe

Pull Requests Merged

1.5.0 - 2025-07-11

Added

  • Add class TestCsvImpor with a test suite for testing CSV import functionality to test.py
  • Add types-requests to mypy's additional_dependencies in pre-commit hooks
  • Add pydocstyle pre-commit's hook
  • Add */_version.py to .gitignore

Fixed

  • Fix a csvimport error 'List index (0) out of bounds': renamed json_data back to data. Corrected behavior broken since v1.4.0

Changed

  • Update pre-commit hooks to the latest versions
  • Breaking changes: drop support for Python 3.9
  • Import Callable from collections.abc
  • Improve a conda recipe
  • Update README.md

Security

  • Add the Security Policy file SECURITY.md
  • Use permissions: contents: read in all CI workflow files explicitly
  • Use commit hashes to ensure reproducible builds
  • Update pinning for runtime dependency requests >=2.32.4

Pull Requests Merged

  • PR_120 - Fix a csvimport error 'List index (0) out of bounds'
  • PR_123 - Release 1.5.0

1.4.0 - 2025-05-07

Added

  • Enabled debug logging
  • Support for Python >=3.9,<3.14
  • CI Automation (commit checks, issue-triage, PR validation, publish)
  • Issue templates for bug report, feature request, documentation
  • Type hinting
  • Docstrings
  • A conda recipe (meta.yaml)
  • Package management stuff: pyproject.toml, .editorconfig, .gitattributes, .gitignore, .pre-commit-config.yaml, Makefile, environment-dev.yaml, environment.yaml
  • Linting: py.typed
  • New samples
  • New tests

Changed

  • Update README.md
  • Improved tests

Removed

  • requirements.txt and setup.py are replaced by pyproject.toml
  • .travis.yml was obsolete

Pull Requests Merged

  • PR_105 - Update README.md, fix the license name in setup.py
  • PR_107 - PEP8 enabled
  • PR_108 - Support py>=39,<py313
  • PR_109 - PEP 484 enabled
  • PR_110 - PEP 257 enabled
  • PR_111 - Enable debug logging
  • PR_114 - Update README
  • PR_115 - Add a conda recipe
  • PR_116 - Improve CI Automation and package management
  • PR_117 - Release 1.4.0

Version 1.3.4 (2020-10-20) - Public Release

Closed issues:

  • Response 400 error #59
  • Lib expected to work on py3.7? #48
  • FromTS-ToTS filter does not work for GET /message #47
  • import name Client #33
  • proxy dict #23
  • Too many 500 #19
  • ImportError: cannot import name Client #16
  • Add a "date" property on pypi #15
  • Django support #9

Merged pull requests:

v1.3.2 (2018-11-19)

Full Changelog

Merged pull requests:

v1.3.1 (2018-11-13)

Full Changelog

Closed issues:

  • How to add a contact to a list #22
  • Impossible to know what is wrong #20
  • wrong version number #13
  • example missing / not working #11
  • Remove 'Programming Language :: Python :: 3.2', from setup.py #10

Merged pull requests:

v1.3.0 (2017-05-31)

Full Changelog

Closed issues:

  • SSL certificate validation disabled #7
  • No license? #6

Merged pull requests:

v1.2.2 (2016-06-21)

Full Changelog

Merged pull requests:

v1.0.6 (2016-06-20)

Full Changelog

Merged pull requests:

v1.0.4 (2015-11-19)

Full Changelog

v1.0.3 (2015-10-13)

Full Changelog

* This Changelog was automatically generated by github_changelog_generator