Hydro-Quebec-API-Wrapper 4.3.0__tar.gz → 4.3.1__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 (111) hide show
  1. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1/Hydro_Quebec_API_Wrapper.egg-info}/PKG-INFO +1 -1
  2. {hydro_quebec_api_wrapper-4.3.0/Hydro_Quebec_API_Wrapper.egg-info → hydro_quebec_api_wrapper-4.3.1}/PKG-INFO +1 -1
  3. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/hydroqc/hydro_api/client.py +8 -3
  4. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/tests/unit/test_login_flow.py +17 -0
  5. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/.coveragerc +0 -0
  6. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/.devcontainer/Dockerfile +0 -0
  7. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/.devcontainer/devcontainer.json +0 -0
  8. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/.flake8 +0 -0
  9. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/.github/scripts/home_assistant_versions.py +0 -0
  10. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/.github/workflows/ci.yml +0 -0
  11. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/.github/workflows/release.yml +0 -0
  12. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/.gitignore +0 -0
  13. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/.gitlab-ci.yml +0 -0
  14. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/.pre-commit-config.yaml +0 -0
  15. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/.pylintrc +0 -0
  16. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/Hydro_Quebec_API_Wrapper.egg-info/SOURCES.txt +0 -0
  17. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/Hydro_Quebec_API_Wrapper.egg-info/dependency_links.txt +0 -0
  18. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/Hydro_Quebec_API_Wrapper.egg-info/entry_points.txt +0 -0
  19. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/Hydro_Quebec_API_Wrapper.egg-info/requires.txt +0 -0
  20. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/Hydro_Quebec_API_Wrapper.egg-info/top_level.txt +0 -0
  21. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/LICENSE +0 -0
  22. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/MANIFEST.in +0 -0
  23. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/README.md +0 -0
  24. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/config.default.yaml +0 -0
  25. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/conflict_test_requirements.txt +0 -0
  26. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/docs/Makefile +0 -0
  27. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/docs/make.bat +0 -0
  28. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/docs/source/_static/custom.css +0 -0
  29. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/docs/source/_static/hydroqc-logo-128.png +0 -0
  30. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/docs/source/_static/hydroqc-logo.svg +0 -0
  31. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/docs/source/conf.py +0 -0
  32. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/docs/source/external/description-des-codes-interruption.pdf +0 -0
  33. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/docs/source/index.rst +0 -0
  34. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/docs/source/reference/hydroqc.contract.rst +0 -0
  35. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/docs/source/reference/hydroqc.hydro_api.rst +0 -0
  36. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/docs/source/reference/hydroqc.peak.cpc.rst +0 -0
  37. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/docs/source/reference/hydroqc.peak.dpc.rst +0 -0
  38. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/docs/source/reference/hydroqc.peak.rst +0 -0
  39. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/docs/source/reference/hydroqc.rst +0 -0
  40. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/docs/source/reference/hydroqc.types.rst +0 -0
  41. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/docs/source/reference/modules.rst +0 -0
  42. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/docs/source/todo.rst +0 -0
  43. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/examples/hydro.py +0 -0
  44. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/hydroqc/__init__.py +0 -0
  45. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/hydroqc/account.py +0 -0
  46. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/hydroqc/consts.py +0 -0
  47. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/hydroqc/contract/__init__.py +0 -0
  48. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/hydroqc/contract/common.py +0 -0
  49. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/hydroqc/contract/contract_d.py +0 -0
  50. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/hydroqc/contract/contract_d_cpc.py +0 -0
  51. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/hydroqc/contract/contract_dpc.py +0 -0
  52. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/hydroqc/contract/contract_dt.py +0 -0
  53. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/hydroqc/contract/contract_m.py +0 -0
  54. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/hydroqc/contract/contract_m_gdp.py +0 -0
  55. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/hydroqc/contract/contract_residential.py +0 -0
  56. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/hydroqc/contract/outage.py +0 -0
  57. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/hydroqc/customer.py +0 -0
  58. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/hydroqc/diagnostic.py +0 -0
  59. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/hydroqc/error.py +0 -0
  60. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/hydroqc/hydro_api/__init__.py +0 -0
  61. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/hydroqc/hydro_api/cache.py +0 -0
  62. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/hydroqc/hydro_api/consts.py +0 -0
  63. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/hydroqc/hydro_api/mfa.py +0 -0
  64. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/hydroqc/logger.py +0 -0
  65. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/hydroqc/peak/__init__.py +0 -0
  66. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/hydroqc/peak/basepeak.py +0 -0
  67. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/hydroqc/peak/basepeakhandler.py +0 -0
  68. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/hydroqc/peak/consts.py +0 -0
  69. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/hydroqc/peak/cpc/__init__.py +0 -0
  70. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/hydroqc/peak/cpc/consts.py +0 -0
  71. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/hydroqc/peak/cpc/handler.py +0 -0
  72. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/hydroqc/peak/cpc/peak.py +0 -0
  73. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/hydroqc/peak/dpc/__init__.py +0 -0
  74. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/hydroqc/peak/dpc/consts.py +0 -0
  75. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/hydroqc/peak/dpc/handler.py +0 -0
  76. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/hydroqc/peak/dpc/peak.py +0 -0
  77. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/hydroqc/public_client.py +0 -0
  78. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/hydroqc/py.typed +0 -0
  79. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/hydroqc/timerange.py +0 -0
  80. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/hydroqc/types/__init__.py +0 -0
  81. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/hydroqc/types/account.py +0 -0
  82. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/hydroqc/types/common.py +0 -0
  83. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/hydroqc/types/consump.py +0 -0
  84. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/hydroqc/types/contract.py +0 -0
  85. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/hydroqc/types/cpc.py +0 -0
  86. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/hydroqc/types/dpc.py +0 -0
  87. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/hydroqc/types/dt.py +0 -0
  88. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/hydroqc/types/outage.py +0 -0
  89. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/hydroqc/utils.py +0 -0
  90. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/hydroqc/webuser.py +0 -0
  91. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/logo/hydroqc-logo-128.png +0 -0
  92. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/logo/hydroqc-logo.svg +0 -0
  93. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/pyproject.toml +0 -0
  94. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/renovate.json5 +0 -0
  95. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/setup.cfg +0 -0
  96. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/test_requirements.txt +0 -0
  97. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/tests/__init__.py +0 -0
  98. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/tests/conftest.py +0 -0
  99. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/tests/subtest_common.py +0 -0
  100. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/tests/subtest_contract_d.py +0 -0
  101. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/tests/subtest_contract_d_cpc.py +0 -0
  102. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/tests/subtest_contract_dpc.py +0 -0
  103. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/tests/subtest_contract_dt.py +0 -0
  104. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/tests/subtest_contract_m.py +0 -0
  105. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/tests/subtest_contract_m_gdp.py +0 -0
  106. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/tests/test_basic.py +0 -0
  107. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/tests/test_timerange.py +0 -0
  108. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/tests/tools.py +0 -0
  109. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/tests/unit/__init__.py +0 -0
  110. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/tests/unit/test_mfa.py +0 -0
  111. {hydro_quebec_api_wrapper-4.3.0 → hydro_quebec_api_wrapper-4.3.1}/tox.ini +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: Hydro-Quebec-API-Wrapper
3
- Version: 4.3.0
3
+ Version: 4.3.1
4
4
  Summary: A wrapper library to access hydro quebec API and more
5
5
  Home-page: https://hydroqc.ca
6
6
  Author-email: Hydroqc Team <info@hydroqc.ca>
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: Hydro-Quebec-API-Wrapper
3
- Version: 4.3.0
3
+ Version: 4.3.1
4
4
  Summary: A wrapper library to access hydro quebec API and more
5
5
  Home-page: https://hydroqc.ca
6
6
  Author-email: Hydroqc Team <info@hydroqc.ca>
@@ -167,6 +167,7 @@ class HydroClient:
167
167
  # Azure AD B2C login state
168
168
  self._code_verifier: str = ""
169
169
  self._mfa_challenge: MFAChallenge | None = None
170
+ self._send_mfa_code: bool = True
170
171
  self._pending_cookies: list[dict[str, Any]] = []
171
172
 
172
173
  # OAuth handling variables
@@ -413,15 +414,18 @@ class HydroClient:
413
414
  return False
414
415
  return True
415
416
 
416
- async def login(self) -> LoginStatus:
417
+ async def login(self, *, send_mfa_code: bool = True) -> LoginStatus:
417
418
  """Log in HydroQuebec website.
418
419
 
419
420
  Hydroquebec is using B2C solution for authentication. The policy may now
420
421
  stop after the password round trip and ask for a one-time code sent by
421
422
  e-mail: :attr:`LoginStatus.MFA_REQUIRED` is then returned and the code
422
- has to be submitted with :meth:`submit_mfa_code`.
423
+ has to be submitted with :meth:`submit_mfa_code`. Set ``send_mfa_code``
424
+ to ``False`` to stop at that step without asking the portal to send a
425
+ code: only an interactive caller should let the user request one.
423
426
  """
424
427
  self._logger.info("Login using %s", self.username)
428
+ self._send_mfa_code = send_mfa_code
425
429
 
426
430
  # Reset cache
427
431
  self.reset()
@@ -658,7 +662,8 @@ class HydroClient:
658
662
  self.username,
659
663
  challenge.description,
660
664
  )
661
- await self.request_mfa_code()
665
+ if self._send_mfa_code:
666
+ await self.request_mfa_code()
662
667
  return LoginStatus.MFA_REQUIRED
663
668
 
664
669
  async def request_mfa_code(self) -> bool:
@@ -70,6 +70,23 @@ async def test_login_reports_mfa_for_a_code_step() -> None:
70
70
  await client.close_session()
71
71
 
72
72
 
73
+ @pytest.mark.asyncio(loop_scope="module")
74
+ async def test_login_can_skip_requesting_the_code() -> None:
75
+ """A background caller can stop at the code step without sending an e-mail."""
76
+ transport = build_mfa_login()
77
+ client = build_client(transport)
78
+
79
+ assert await client.login(send_mfa_code=False) is LoginStatus.MFA_REQUIRED
80
+ assert client._mfa_challenge is not None
81
+ assert not transport.called(SEND_CODE_URL)
82
+
83
+ # The caller that actually asks the user for the code sends it explicitly.
84
+ assert await client.request_mfa_code() is True
85
+ assert transport.called(SEND_CODE_URL)
86
+
87
+ await client.close_session()
88
+
89
+
73
90
  @pytest.mark.asyncio(loop_scope="module")
74
91
  async def test_login_reports_mfa_from_a_redirect() -> None:
75
92
  """A redirect to the verification page is also recognised."""