diff options
Diffstat (limited to '')
12 files changed, 215 insertions, 37 deletions
diff --git a/ansible_collections/community/postgresql/.azure-pipelines/azure-pipelines.yml b/ansible_collections/community/postgresql/.azure-pipelines/azure-pipelines.yml index 28f8b2497..431614af9 100644 --- a/ansible_collections/community/postgresql/.azure-pipelines/azure-pipelines.yml +++ b/ansible_collections/community/postgresql/.azure-pipelines/azure-pipelines.yml @@ -75,6 +75,18 @@ stages: - name: Units test: 'devel/units/1' + - stage: Ansible_2_17 + displayName: Sanity & Units 2.17 + dependsOn: [] + jobs: + - template: templates/matrix.yml + parameters: + targets: + - name: Sanity + test: '2.17/sanity/1' + - name: Units + test: '2.17/units/1' + - stage: Ansible_2_16 displayName: Sanity & Units 2.16 dependsOn: [] @@ -127,6 +139,21 @@ stages: - name: Ubuntu 22.04 test: ubuntu2204 + - stage: Docker_2_17 + displayName: Docker 2.17 + dependsOn: [] + jobs: + - template: templates/matrix.yml + parameters: + testFormat: 2.17/linux/{0}/1 + targets: + - name: Fedora 39 + test: fedora39 + - name: Ubuntu 20.04 + test: ubuntu2004 + - name: Ubuntu 22.04 + test: ubuntu2204 + - stage: Docker_2_16 displayName: Docker 2.16 dependsOn: [] @@ -186,6 +213,17 @@ stages: - name: RHEL 9.3 test: rhel/9.3 + - stage: Remote_2_17 + displayName: Remote 2.17 + dependsOn: [] + jobs: + - template: templates/matrix.yml + parameters: + testFormat: 2.17/{0}/1 + targets: + - name: RHEL 9.3 + test: rhel/9.3 + - stage: Remote_2_16 displayName: Remote 2.16 dependsOn: [] @@ -225,14 +263,17 @@ stages: condition: succeededOrFailed() dependsOn: - Ansible_devel + - Ansible_2_17 - Ansible_2_16 - Ansible_2_15 - Ansible_2_14 - Docker_devel + - Docker_2_17 - Docker_2_16 - Docker_2_15 - Docker_2_14 - Remote_devel + - Remote_2_17 - Remote_2_16 - Remote_2_15 - Remote_2_14 diff --git a/ansible_collections/community/postgresql/CHANGELOG.rst b/ansible_collections/community/postgresql/CHANGELOG.rst index d9990ab6a..fc0805301 100644 --- a/ansible_collections/community/postgresql/CHANGELOG.rst +++ b/ansible_collections/community/postgresql/CHANGELOG.rst @@ -5,6 +5,24 @@ Community PostgreSQL Collection Release Notes .. contents:: Topics +v3.4.1 +====== + +Release Summary +--------------- + +This is a patch release of the ``community.postgresql`` collection. +This changelog contains all changes to the modules and plugins in this collection +that have been added after the release of ``community.postgresql`` 3.4.0. + +Bugfixes +-------- + +- postgresql_db - ``restore`` custom format as file instead of stdin to allow the use of --job flag in ``target_opts`` (https://github.com/ansible-collections/community.postgresql/issues/594). +- postgresql_ext - Reconnect before upgrade to avoid accidental load of the upgraded extension (https://github.com/ansible-collections/community.postgresql/pull/689). +- postgresql_idx - consider schema name when checking for index (https://github.com/ansible-collections/community.postgresql/issues/692). Index names are only unique within a schema. This allows using the same index name in multiple schemas. +- postgresql_privs - Enables the ability to revoke functions from user (https://github.com/ansible-collections/community.postgresql/issues/687). + v3.4.0 ====== diff --git a/ansible_collections/community/postgresql/CONTRIBUTING.md b/ansible_collections/community/postgresql/CONTRIBUTING.md index ecb18f74a..8beed5512 100644 --- a/ansible_collections/community/postgresql/CONTRIBUTING.md +++ b/ansible_collections/community/postgresql/CONTRIBUTING.md @@ -1,12 +1,85 @@ -# Contributing +# Contributing to this project -Refer to the [Ansible Contributing guidelines](https://docs.ansible.com/ansible/devel/community/index.html) to learn how to contribute to this collection. +In this guide, you will find information relevant for code contributions, though any other kinds of contribution mentioned in the [Ansible Contributing guidelines](https://docs.ansible.com/ansible/devel/community/index.html) are equally appreciated and valuable. -Refer to the [review checklist](https://docs.ansible.com/ansible/devel/community/collection_contributors/collection_reviewing.html) when triaging issues or reviewing PRs. +If you have any questions after reading, please contact the community via one or more of the [available channels](https://github.com/ansible-collections/community.postgresql#communication). Any feedback on this guide is very welcome. + +## Reviewing open issue and pull requests + +Refer to the [review checklist](https://docs.ansible.com/ansible/devel/community/collection_contributors/collection_reviewing.html) when triaging issues or reviewing pull requests (hereinafter PRs). + +Most important things to pay attention to: + +- Do not let major/breaking changes sneak into a minor/bugfix release! All such changes should be discussed in a dedicated issue, added to a corresponding milestone (which can be found or created in the project's Issues), and merged right before the major release. Take a look at similar issues to see what needs to be done and reflect on the steps you did/need to do in the issue. +- Every PR (except doc, refactoring, test-related, or a PR containing a new module/plugin) contains a [changelog fragment](https://docs.ansible.com/ansible/latest/community/development_process.html#creating-a-changelog-fragment). Let's give users a chance to know about the changes. +- Every new module `DOCUMENTATION` section contains the `version_added: 'x.y.z'` field. Besides the informative purpose, it is used by the changelog-generating tool to add a corresponding entry to the changelog. As the project follows SemVer, it is typically a next minor (x.y.0) version. +- Every new module argument contains the `version_added: 'x.y.z'` field. As the project follows SemVer, it is typically a next minor (x.y.0) version. +- Non-refactoring code changes (bugfixes, new features) are covered with, at least, integration tests! There can be exceptions but generally it is a requirement. + +## Code contributions + +If you want to submit a bugfix or new feature, refer to the [Quick-start development guide](https://docs.ansible.com/ansible/devel/community/create_pr_quick_start.html) first. + +## Project-specific info + +We assume you have read the [Quick-start development guide](https://docs.ansible.com/ansible/devel/community/create_pr_quick_start.html). + +In order for any submitted PR to get merged, this project requires sanity, unit, and integration tests to pass. +Codecov job is there but not required. +We use the Azure Pipelines platform to run the tests. +You can see the result in the bottom of every PR in the box listing the jobs and their results: + +- Green checkmark: the test has been passed, no more action is needed. +- Red cross: the test has failed. You can see the reason by clicking the ``Details`` link. Fix them locally and push the commit. + +Generally, all jobs must be green. +Sometimes, there can be failures unrelated to a PR, for example, when a test container is unavailable or there is another part of the code that does not satisfy recently introduced additional sanity checks. +If you think the failure does not relate to your changes, put a comment about it. + +## CI testing + +The jobs are launched automatically by Azure Pipelines in every PR based on the [matrix](https://github.com/ansible-collections/community.postgresql/blob/main/.azure-pipelines/azure-pipelines.yml). + +As the project is included in `ansible` community package, it is a requirement for us to test against all supported `ansible-core` versions and corresponding Python versions. +To keep the matrix relevant, we are subscribed to the [news-for-maintainers](https://github.com/ansible-collections/news-for-maintainers) repository and the [Collection maintainers & contributors](https://forum.ansible.com/g/CollectionMaintainer) forum group to track announcements affecting CI. + +If our matrix is permanently outdated, for example, when supported `ansible-core` versions are missed, the collections can get excluded from the package, so keep it updated! + +## Adding tests + +If you are new here, read the [Quick-start development guide](https://docs.ansible.com/ansible/devel/community/create_pr_quick_start.html) first. + +When fixing a bug, first reproduce it by adding a task as reported to a suitable file under the ``tests/integration/targets/<module_name>/tasks/`` directory and run the integration tests as described below. The same is relevant for new features. + +It is not necessary but if you want you can also add unit tests to a suitable file under the ``tests/units/`` directory and run them as described below. ## Checking your code locally -### By hand +It will make your and other people's life a bit easier if you run the tests locally and fix all failures before pushing. If you're unable to run the tests locally, please create your PR as a **draft** to avoid reviewers being added automatically. + +If you are new here, read the [Quick-start development guide](https://docs.ansible.com/ansible/devel/community/create_pr_quick_start.html) first. + +We assume you [prepared your local environment](https://docs.ansible.com/ansible/devel/community/create_pr_quick_start.html#prepare-your-environment) as described in the guide before running the following commands. Otherwise, the command will fail. + +### Sanity tests + +``` console +$ ansible-test sanity path/to/changed_file.py --docker -v +``` + +### Integration tests + +``` console +$ ansible-test integration <module_name you changed> --docker <container, e.g. ubuntu2204> -v +``` + +### Unit tests + +``` console +$ ansible-test units tests/unit/plugins/unit_test_file.py --docker +``` + +### tox You can run flake8 with tox to verify the quality of your code. For that you can simply call tox with that command: @@ -14,8 +87,8 @@ can simply call tox with that command: $ tox -e lint ``` -If you tox is missing on your environment you can probably install it through -your package manager (Eg: `sudo apt install tox`) or with pip (within a +If tox is missing on your environment you can probably install it through +your package manager (for example, `sudo apt install tox`) or with pip (within a virtualenv): ``` console diff --git a/ansible_collections/community/postgresql/FILES.json b/ansible_collections/community/postgresql/FILES.json index 4302f209c..5619dc342 100644 --- a/ansible_collections/community/postgresql/FILES.json +++ b/ansible_collections/community/postgresql/FILES.json @@ -109,7 +109,7 @@ "name": ".azure-pipelines/azure-pipelines.yml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "d51571bbcb9d9cd269b46558fbd86071be6a450a189a5383a38b2da0b14b1c86", + "chksum_sha256": "21c5919dd3e83d15b1fe22120b78b236f87440c760ba0461aae5a9cb8c1f943b", "format": 1 }, { @@ -158,7 +158,7 @@ "name": "changelogs/changelog.yaml", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "b9669874dadda6fc914c52186ac175b590b7c2c4481da2896dbfaad9d36ea263", + "chksum_sha256": "c64b2b9cd3bcd7a5cf4ded207014b072f448416c29f652112ea6c0c168b6fc51", "format": 1 }, { @@ -284,21 +284,21 @@ "name": "plugins/modules/postgresql_db.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "ee2ae220616261dee6e44204168ec6e67e5cdb89d5fb8cb8a79a3d9969800219", + "chksum_sha256": "74361df6b6b5c08dfbae2ce2e06c259a7dc0de5e1ee9cd0e1fe036de75c3ac26", "format": 1 }, { "name": "plugins/modules/postgresql_ext.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "4e715015d05e5273e6a5c78720e837a31d0b65d8c059242391602d7258401248", + "chksum_sha256": "d7685a5e6aa6a012b04f6d473d2e525f3077e857ee3aba4883a47f42312f3c37", "format": 1 }, { "name": "plugins/modules/postgresql_idx.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "3113e2c7531aaf65c8c5996cdd0906d4a3a4ad603a7eb90ec6c2a61011ef8dbb", + "chksum_sha256": "e5cad7d80e230faef5fe681aea7b90eba0a485d70240748d6a0fe14f283d90d1", "format": 1 }, { @@ -347,7 +347,7 @@ "name": "plugins/modules/postgresql_privs.py", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "84b979c32e98cbe03a96ff07b009e5c53a24910289498dd2ba15e850417bbe66", + "chksum_sha256": "54b343e1e1699ac2b0c0b562f3552ec57a52370805f215024b76c6d75cf4b299", "format": 1 }, { @@ -2339,6 +2339,13 @@ "format": 1 }, { + "name": "tests/sanity/ignore-2.18.txt", + "ftype": "file", + "chksum_type": "sha256", + "chksum_sha256": "f1e2e4351ae7e8b366042aef4f75e1a4df73a64203296484944df297ddbfbdf0", + "format": 1 + }, + { "name": "tests/unit", "ftype": "dir", "chksum_type": null, @@ -2538,14 +2545,14 @@ "name": "CHANGELOG.rst", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "02924d737dff1a6dd5b7e9a137a2c426526ec976780e141bfdfb3262e29557b6", + "chksum_sha256": "383aef409d69d0aa94f226597152f8d42c43a1eed6339098fb6207f9511cd0fa", "format": 1 }, { "name": "CONTRIBUTING.md", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "e1b3cbadfbb785585ca2c984365edef37a0d813798ad5c8ea7c296135045f9ee", + "chksum_sha256": "6131e3c155206d545289e3f13aca82a0d9f0a0a6dfa47fb8616fd6a5f8613b2f", "format": 1 }, { @@ -2580,7 +2587,7 @@ "name": "README.md", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "522dc34d303faf3a818d0a57b1a7b9a7338f3acdadd55de2226ef7720765246f", + "chksum_sha256": "375a82d12ffaa2bfae010228498554f9f16f375050379950febc5a7f031aa4eb", "format": 1 }, { diff --git a/ansible_collections/community/postgresql/MANIFEST.json b/ansible_collections/community/postgresql/MANIFEST.json index b16ee0f4d..672a8aa0c 100644 --- a/ansible_collections/community/postgresql/MANIFEST.json +++ b/ansible_collections/community/postgresql/MANIFEST.json @@ -2,7 +2,7 @@ "collection_info": { "namespace": "community", "name": "postgresql", - "version": "3.4.0", + "version": "3.4.1", "authors": [ "Ansible PostgreSQL community" ], @@ -25,7 +25,7 @@ "name": "FILES.json", "ftype": "file", "chksum_type": "sha256", - "chksum_sha256": "87d0437e40df1ddaf3161d1baaf5340d03e0c8983c7326257fab831e5f47e682", + "chksum_sha256": "ac501f2b0873534b223a2abcc10170a5f29269eb2f1268362ffafc797e6e3cde", "format": 1 }, "format": 1 diff --git a/ansible_collections/community/postgresql/README.md b/ansible_collections/community/postgresql/README.md index fde669888..13cc89235 100644 --- a/ansible_collections/community/postgresql/README.md +++ b/ansible_collections/community/postgresql/README.md @@ -56,23 +56,27 @@ They also should be subscribed to Ansible's [The Bullhorn newsletter](https://do > `GitHub Discussions` feature is disabled in this repository. Use the `postgresql` tag on the forum in the [Project Discussions](https://forum.ansible.com/new-topic?title=topic%20title&body=topic%20body&category=project&tags=postgresql) or [Get Help](https://forum.ansible.com/new-topic?title=topic%20title&body=topic%20body&category=help&tags=postgresql) category instead. -We announce important development changes and releases through Ansible's [The Bullhorn newsletter](https://docs.ansible.com/ansible/devel/community/communication.html#the-bullhorn). If you are a collection developer, be sure you are subscribed. - -Join [our team](https://forum.ansible.com/g/PostgreSQLTeam?asc=true&order=) on: -* The Ansible forums: - * [News & Announcements](https://forum.ansible.com/c/news/5/none) - * [Get Help](https://forum.ansible.com/c/help/6/none) - * [Social Spaces](https://forum.ansible.com/c/chat/4) - * [Posts tagged 'postgresql'](https://forum.ansible.com/tag/postgresql) -* Matrix: - * `#postgresql:ansible.com` [room](https://matrix.to/#/#postgresql:ansible.com): questions on how to contribute and use this collection. - * `#users:ansible.com` [room](https://matrix.to/#/#users:ansible.com): general use questions and support. - * `#ansible-community:ansible.com` [room](https://matrix.to/#/#community:ansible.com): community and collection development questions. - * other Matrix rooms or corresponding bridged Libera.Chat channels. See the [Ansible Communication Guide](https://docs.ansible.com/ansible/devel/community/communication.html) for details. +### Asynchronous channels + +* Join the Ansible forum: + * [PostgreSQL Team](https://forum.ansible.com/g/PostgreSQLTeam): by joining the team you will automatically get subscribed to the posts tagged with [postgresql](https://forum.ansible.com/tag/postgresql). + * [Get Help](https://forum.ansible.com/c/help/6/none): get help or help others. + * [Posts tagged with 'postgresql'](https://forum.ansible.com/tag/postgresql): leverage tags to narrow the scope. + * [Social Spaces](https://forum.ansible.com/c/chat/4): gather and interact with fellow enthusiasts. + * [News & Announcements](https://forum.ansible.com/c/news/5/none): track project-wide announcements including social events. + +* The Ansible [Bullhorn newsletter](https://forum.ansible.com/t/about-the-newsletter-category/166): used to announce releases and important changes. -We take part in the global quarterly [Ansible Contributor Summit](https://github.com/ansible/community/wiki/Contributor-Summit) virtually or in-person. Track [The Bullhorn newsletter](https://docs.ansible.com/ansible/devel/community/communication.html#the-bullhorn) and join us. +### Real-time channels + +* Matrix rooms: + * [#postgresql:ansible.com](https://matrix.to/#/#postgresql:ansible.com): questions on how to contribute and use this collection. + * [#users:ansible.com](https://matrix.to/#/#users:ansible.com): general use questions and support. + * [#social:ansible.com](https://matrix.to/#/#social:ansible.com): say hello or share a funny joke and let's laugh together;) + * [#ansible-community:ansible.com](https://matrix.to/#/#community:ansible.com): community and collection development questions. + * other Matrix rooms or corresponding bridged Libera.Chat channels. See the [Ansible Communication Guide](https://docs.ansible.com/ansible/devel/community/communication.html) for details. -For more information about communication, refer to the [Ansible Communication guide](https://docs.ansible.com/ansible/devel/community/communication.html). +For more information about communication, including how to join these channels, see the [Ansible communication guide](https://docs.ansible.com/ansible/devel/community/communication.html). ## Governance @@ -93,7 +97,7 @@ The minimum supported and tested versions of Psycopg are 2.5.1 and 3.1.8 respect We maintain each major release version (1.x.y, 2.x.y, ...) for two years after the next major version is released. Here is the table for the support timeline: -- 1.x.y: released 2020-11-17, supported until 2024-02-10 +- 1.x.y: released 2020-11-17, EOL - 2.x.y: released 2022-02-10, supported until 2025-06-09 - 3.x.y: released 2023-06-09, current - 4.x.y: to be released; not earlier than after Ansible 10 release (~May 2024) @@ -104,6 +108,7 @@ Tested with the following `ansible-core` releases: - 2.14 - 2.15 - 2.16 +- 2.17 - current development version Ansible-core versions before 2.12.0 are not supported. diff --git a/ansible_collections/community/postgresql/changelogs/changelog.yaml b/ansible_collections/community/postgresql/changelogs/changelog.yaml index bacf00e7a..331cc0e02 100644 --- a/ansible_collections/community/postgresql/changelogs/changelog.yaml +++ b/ansible_collections/community/postgresql/changelogs/changelog.yaml @@ -678,3 +678,26 @@ releases: - 3.4.0.yml - 667-db_icu_provider.yml release_date: '2024-02-09' + 3.4.1: + changes: + bugfixes: + - postgresql_db - ``restore`` custom format as file instead of stdin to allow + the use of --job flag in ``target_opts`` (https://github.com/ansible-collections/community.postgresql/issues/594). + - postgresql_ext - Reconnect before upgrade to avoid accidental load of the + upgraded extension (https://github.com/ansible-collections/community.postgresql/pull/689). + - postgresql_idx - consider schema name when checking for index (https://github.com/ansible-collections/community.postgresql/issues/692). Index + names are only unique within a schema. This allows using the same index name + in multiple schemas. + - postgresql_privs - Enables the ability to revoke functions from user (https://github.com/ansible-collections/community.postgresql/issues/687). + release_summary: 'This is a patch release of the ``community.postgresql`` collection. + + This changelog contains all changes to the modules and plugins in this collection + + that have been added after the release of ``community.postgresql`` 3.4.0.' + fragments: + - 3.4.1.yml + - 681-restore-custom-format-as-file.yml + - 689-reconnect-before-upgrade.yml + - 690-revoke-functions-from-user.yaml + - 693-idx-consider-schema.yaml + release_date: '2024-05-17' diff --git a/ansible_collections/community/postgresql/plugins/modules/postgresql_db.py b/ansible_collections/community/postgresql/plugins/modules/postgresql_db.py index ae2faa007..ca9093566 100644 --- a/ansible_collections/community/postgresql/plugins/modules/postgresql_db.py +++ b/ansible_collections/community/postgresql/plugins/modules/postgresql_db.py @@ -628,7 +628,7 @@ def db_restore(module, target, target_opts="", else: return p2.returncode, '', stderr2, 'cmd: ****' else: - if '--format=Directory' in cmd: + if any(substring in cmd for substring in ['--format=Directory', '--format=Custom']): cmd = '{0} {1}'.format(cmd, shlex_quote(target)) else: cmd = '{0} < {1}'.format(cmd, shlex_quote(target)) diff --git a/ansible_collections/community/postgresql/plugins/modules/postgresql_ext.py b/ansible_collections/community/postgresql/plugins/modules/postgresql_ext.py index 7dfc95ac4..d302acdaa 100644 --- a/ansible_collections/community/postgresql/plugins/modules/postgresql_ext.py +++ b/ansible_collections/community/postgresql/plugins/modules/postgresql_ext.py @@ -469,6 +469,11 @@ def main(): else: valid_update_path = ext_valid_update_path(cursor, ext, curr_version, real_version) if valid_update_path: + # Reconnect (required by some extensions like timescaledb) + if not module.check_mode: + db_connection.close() + db_connection, dummy = connect_to_db(module, conn_params, autocommit=True) + cursor = db_connection.cursor(**pg_cursor_args) changed = ext_update_version(module.check_mode, cursor, ext, version) else: if version == 'latest': diff --git a/ansible_collections/community/postgresql/plugins/modules/postgresql_idx.py b/ansible_collections/community/postgresql/plugins/modules/postgresql_idx.py index 7eb35de40..48784d283 100644 --- a/ansible_collections/community/postgresql/plugins/modules/postgresql_idx.py +++ b/ansible_collections/community/postgresql/plugins/modules/postgresql_idx.py @@ -344,9 +344,10 @@ class Index(object): "ON i.indexname = c.relname " "JOIN pg_catalog.pg_index AS pi " "ON c.oid = pi.indexrelid " - "WHERE i.indexname = %(name)s") + "WHERE i.schemaname = %(schema)s " + "AND i.indexname = %(name)s") - res = exec_sql(self, query, query_params={'name': self.name}, add_to_executed=False) + res = exec_sql(self, query, query_params={'schema': self.schema, 'name': self.name}, add_to_executed=False) if res: self.exists = True self.info = dict( diff --git a/ansible_collections/community/postgresql/plugins/modules/postgresql_privs.py b/ansible_collections/community/postgresql/plugins/modules/postgresql_privs.py index 2c4ca7086..56f8c602e 100644 --- a/ansible_collections/community/postgresql/plugins/modules/postgresql_privs.py +++ b/ansible_collections/community/postgresql/plugins/modules/postgresql_privs.py @@ -972,7 +972,7 @@ class QueryBuilder(object): def build_absent(self): if self._obj_type == 'default_privs': self.query = [] - for obj in ['TABLES', 'SEQUENCES', 'TYPES']: + for obj in ['TABLES', 'FUNCTIONS', 'SEQUENCES', 'TYPES']: if self._as_who: self.query.append( 'ALTER DEFAULT PRIVILEGES FOR ROLE {0}{1} REVOKE ALL ON {2} FROM {3};'.format(self._as_who, diff --git a/ansible_collections/community/postgresql/tests/sanity/ignore-2.18.txt b/ansible_collections/community/postgresql/tests/sanity/ignore-2.18.txt new file mode 100644 index 000000000..230ec3421 --- /dev/null +++ b/ansible_collections/community/postgresql/tests/sanity/ignore-2.18.txt @@ -0,0 +1,5 @@ +plugins/modules/postgresql_db.py use-argspec-type-path +plugins/modules/postgresql_db.py validate-modules:use-run-command-not-popen +plugins/module_utils/version.py pylint:unused-import +tests/utils/shippable/timing.py shebang +tests/unit/plugins/module_utils/test_postgres.py pylint:unidiomatic-typecheck |