diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 3fb68af8..65d6119b 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -14,14 +14,14 @@ jobs: - name: Install Python 3 uses: actions/setup-python@v3 with: - python-version: 3.8 + python-version: 3.9 - name: Install dependencies run: | python -m pip install --upgrade pip pip install -r requirements.txt pip install python-dateutil backoff monotonic pip install --user . - sudo pip install pylint==2.8.0 flake8 mock==3.0.5 python-dateutil aiohttp==3.9.1 + sudo pip install pylint==3.3.1 flake8 mock==3.0.5 python-dateutil aiohttp==3.9.1 - name: Run tests run: python -m unittest discover -s segment @@ -41,17 +41,11 @@ jobs: # runs-on: ubuntu-latest # strategy: # matrix: -# python: ['3.7', '3.8', '3.9', '3.10', '3.11'] +# python: ['3.9', '3.10', '3.11'] # coverage: [false] # experimental: [false] # include: # # Run code coverage. -# - python: '3.7' -# coverage: true -# experimental: false -# - python: '3.8' -# coverage: true -# experimental: false # - python: '3.9' # coverage: true # experimental: false diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 792a2200..97b401c2 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -19,15 +19,6 @@ jobs: - name: Checkout uses: actions/checkout@v4 - - name: Run with setup-python 3.8 - uses: actions/setup-python@v5 - with: - python-version: '3.8' - - name: Setup required modules - run: python -m pip install -r requirements.txt - - name: Run tests - run: python -m unittest discover -s segment - - name: Run with setup-python 3.9 uses: actions/setup-python@v5 with: diff --git a/HISTORY.md b/HISTORY.md index fa7009c4..41f21e60 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,3 +1,6 @@ +# 2.3.3 / 2024-10-07 +- Update time handling and OAuth + # 2.3.2 / 2024-02-15 - Updating version to create a release wheel without the outdated /analytics files diff --git a/requirements.txt b/requirements.txt index 18c9d174..602f7a40 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,8 +1,8 @@ backoff==2.2.1 -cryptography==43.0.1 +cryptography==43.0.3 flake8==7.1.1 mock==2.0.0 -pylint==3.2.7 -PyJWT==2.9.0 +pylint==3.3.2 +PyJWT==2.10.1 python-dateutil==2.8.2 requests==2.32.3 diff --git a/segment/analytics/oauth_manager.py b/segment/analytics/oauth_manager.py index 453a23a0..61a54ea5 100644 --- a/segment/analytics/oauth_manager.py +++ b/segment/analytics/oauth_manager.py @@ -152,13 +152,13 @@ def _poller_loop(self): elif response.status_code == 429: self.retry_count += 1 - rate_limit_reset_timestamp = None + rate_limit_reset_time = None try: - rate_limit_reset_timestamp = int(response.headers.get("X-RateLimit-Reset")) + rate_limit_reset_time = int(response.headers.get("X-RateLimit-Reset")) except Exception as e: self.log.error("OAuth rate limit response did not have a valid rest time: {} | {}".format(response, e)) - if rate_limit_reset_timestamp: - refresh_timer_ms = rate_limit_reset_timestamp - time.time() * 1000 + if rate_limit_reset_time: + refresh_timer_ms = rate_limit_reset_time * 1000 else: refresh_timer_ms = 5 * 1000 diff --git a/segment/analytics/test/test_oauth.py b/segment/analytics/test/test_oauth.py index 259342bc..a2269507 100644 --- a/segment/analytics/test/test_oauth.py +++ b/segment/analytics/test/test_oauth.py @@ -55,7 +55,7 @@ def json(self): elif kwargs['url'] == 'http://127.0.0.1:400/token': return MockResponse({"reason": "test_reason", "json_data" : {"error":"unrecoverable", "error_description":"nah"}}, 400) elif kwargs['url'] == 'http://127.0.0.1:429/token': - return MockResponse({"reason": "test_reason", "headers" : {"X-RateLimit-Reset": time.time()*1000 + 2000}}, 429) + return MockResponse({"reason": "test_reason", "headers" : {"X-RateLimit-Reset": 234}}, 429) elif kwargs['url'] == 'http://127.0.0.1:500/token': return MockResponse({"reason": "test_reason", "json_data" : {"error":"recoverable", "error_description":"nah"}}, 500) elif kwargs['url'] == 'http://127.0.0.1:501/token': @@ -106,7 +106,7 @@ def test_oauth_fail_with_retries(self, mock_post): def test_oauth_rate_limit_delay(self, mock_sleep, mock_post): manager = segment.analytics.oauth_manager.OauthManager("id", privatekey, "keyid", "http://127.0.0.1:429") manager._poller_loop() - self.assertTrue(mock_sleep.call_args[0][0] > 1.9 and mock_sleep.call_args[0][0] <= 2.0) + mock_sleep.assert_called_with(234) class TestOauthIntegration(unittest.TestCase): def fail(self, e, batch=[]): @@ -152,4 +152,4 @@ def test_oauth_integration_fail_bad_key(self, mock_post): self.assertTrue(self.failed) if __name__ == '__main__': - unittest.main() \ No newline at end of file + unittest.main() diff --git a/segment/analytics/version.py b/segment/analytics/version.py index a5ac6164..47cb28fc 100644 --- a/segment/analytics/version.py +++ b/segment/analytics/version.py @@ -1 +1 @@ -VERSION = '2.3.2' +VERSION = '2.3.3' diff --git a/setup.py b/setup.py index 4bfdd978..0443d7b2 100644 --- a/setup.py +++ b/setup.py @@ -23,12 +23,12 @@ "requests~=2.7", "backoff~=2.1", "python-dateutil~=2.2", - "PyJWT~=2.8" + "PyJWT~=2.10.1" ] tests_require = [ "mock==2.0.0", - "pylint==2.8.0", + "pylint==3.3.1", "flake8==3.7.9", ] @@ -42,7 +42,7 @@ maintainer_email='friends@segment.com', test_suite='segment.analytics.test.all', packages=['segment.analytics', 'segment.analytics.test'], - python_requires='>=3.6.0', + python_requires='>=3.9.0', license='MIT License', install_requires=install_requires, extras_require={ @@ -56,9 +56,6 @@ "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python", - "Programming Language :: Python :: 3.6", - "Programming Language :: Python :: 3.7", - "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11",