Skip to content

Commit 68cb224

Browse files
committed
merge main
2 parents d10bf0a + f43fc40 commit 68cb224

File tree

7 files changed

+37
-51
lines changed

7 files changed

+37
-51
lines changed

.github/workflows/ci-cd.yml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ jobs:
2626
strategy:
2727
fail-fast: false # Don't cancel other jobs if one lint version fails
2828
matrix:
29-
python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"]
29+
python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"]
3030
steps:
3131
- name: Checkout repository
3232
uses: actions/checkout@v4
@@ -74,7 +74,7 @@ jobs:
7474
strategy:
7575
fail-fast: false # Don't cancel other jobs if one test version fails
7676
matrix:
77-
python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"]
77+
python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"]
7878
steps:
7979
- name: Checkout repository
8080
uses: actions/checkout@v4
@@ -116,7 +116,7 @@ jobs:
116116
strategy:
117117
fail-fast: false
118118
matrix:
119-
python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"]
119+
python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"]
120120
steps:
121121
- name: Checkout repository
122122
uses: actions/checkout@v4
@@ -204,7 +204,7 @@ jobs:
204204
fail-fast: true # If one deployment fails, stop others
205205
matrix:
206206
# Define ALL python versions for Docker images
207-
python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"]
207+
python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"]
208208
# Designate ONE primary version for PyPI publish and Docker 'latest' tag
209209
primary-py: ['3.11'] # Choose your primary Python version
210210

@@ -286,7 +286,7 @@ jobs:
286286
# Use the Git tag from the event ref as the base version
287287
# Assumes tags are like '0.1.0' or 'v0.1.0' - metadata-action handles 'v' prefix
288288
tags: |
289-
# Generate tags like: 0.1.0-py3.8, 0.1-py3.8, 0-py3.8
289+
# Generate tags like: 0.1.0-py3.9, 0.1-py3.9, 0-py3.9
290290
type=semver,pattern={{version}}-py${{ matrix.python-version }}
291291
type=semver,pattern={{major}}.{{minor}}-py${{ matrix.python-version }}
292292
type=semver,pattern={{major}}-py${{ matrix.python-version }}
@@ -315,4 +315,4 @@ jobs:
315315
PYTHON_VERSION=${{ matrix.python-version }}
316316
VERSION=${{ steps.get_version_tag.outputs.VERSION }}
317317
cache-from: type=gha,scope=deploy-${{ matrix.python-version }}
318-
cache-to: type=gha,mode=max,scope=deploy-${{ matrix.python-version }}
318+
cache-to: type=gha,mode=max,scope=deploy-${{ matrix.python-version }}

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ docker run --rm -v $(pwd):/app -w /app --entrypoint python python-gpt-po -m pyte
161161

162162
## 📋 Requirements
163163

164-
- Python 3.8+
164+
- Python 3.9+
165165
- Dependencies: `polib`, `openai`, `anthropic`, `requests`, `tenacity`
166166

167167
## 📖 Documentation
@@ -172,4 +172,4 @@ docker run --rm -v $(pwd):/app -w /app --entrypoint python python-gpt-po -m pyte
172172

173173
## 📄 License
174174

175-
MIT License - See [LICENSE](LICENSE) for details.
175+
MIT License - See [LICENSE](LICENSE) for details.

pyproject.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ authors = [
1818
]
1919
description = "A CLI tool for translating .po files using GPT models."
2020
readme = "README.md"
21-
requires-python = ">=3.8"
21+
requires-python = ">=3.9"
2222
license = {text = "MIT"}
2323
dependencies = [
2424
"polib==1.2.0",
@@ -42,11 +42,11 @@ classifiers = [
4242
"Topic :: Text Processing :: Linguistic",
4343
"Operating System :: OS Independent",
4444
"Programming Language :: Python :: 3",
45-
"Programming Language :: Python :: 3.8",
4645
"Programming Language :: Python :: 3.9",
4746
"Programming Language :: Python :: 3.10",
4847
"Programming Language :: Python :: 3.11",
4948
"Programming Language :: Python :: 3.12",
49+
"Programming Language :: Python :: 3.13",
5050
"Programming Language :: Python :: 3 :: Only",
5151
"Natural Language :: English",
5252
"Natural Language :: Dutch",

python_gpt_po/main.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@
1616
from .models.provider_clients import ProviderClients
1717
from .services.model_manager import ModelManager
1818
from .services.translation_service import TranslationService
19-
from .utils.cli import (auto_select_provider, create_language_mapping, get_api_keys_from_args, get_provider_from_args,
20-
parse_args, parse_languages, show_help_and_exit, validate_provider_key)
19+
from .utils.cli import (auto_select_provider, create_language_mapping, get_provider_from_args, parse_args,
20+
parse_languages, show_help_and_exit, validate_provider_key)
2121

2222

2323
def setup_logging():
@@ -44,12 +44,9 @@ def initialize_provider(args: Namespace) -> tuple[ProviderClients, ModelProvider
4444
Raises:
4545
SystemExit: If no valid provider can be found or initialized
4646
"""
47-
# Get API keys from arguments and environment variables
48-
api_keys = get_api_keys_from_args(args)
49-
5047
# Initialize provider clients
5148
provider_clients = ProviderClients()
52-
provider_clients.initialize_clients(args, api_keys)
49+
api_keys = provider_clients.initialize_clients(args)
5350

5451
# Get provider from arguments or auto-select
5552
provider = get_provider_from_args(args)

python_gpt_po/models/enums.py

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,4 @@ class ModelProvider(Enum):
1313
AZURE_OPENAI = "azure_openai"
1414

1515

16-
ModelProviderList = [
17-
ModelProvider.OPENAI.value,
18-
ModelProvider.ANTHROPIC.value,
19-
ModelProvider.DEEPSEEK.value,
20-
ModelProvider.AZURE_OPENAI.value
21-
]
16+
ModelProviderList = [provider.value for provider in ModelProvider]

python_gpt_po/models/provider_clients.py

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,20 @@ def __init__(self):
2222
self.deepseek_api_key = None
2323
self.deepseek_base_url = "https://api.deepseek.com/v1"
2424

25-
def initialize_clients(self, args: Namespace, api_keys: Dict[str, str]):
25+
def initialize_clients(self, args: Namespace) -> Dict[str, str]:
2626
"""Initialize API clients for all providers with available keys.
2727
2828
Args:
29-
api_keys (Dict[str, str]): Dictionary of provider names to API keys
29+
args (Namespace): Parsed command line arguments
30+
Returns:
31+
Dict[str, str]: Dictionary of API keys for each provider
3032
"""
31-
if api_keys.get(ModelProvider.OPENAI.value):
32-
self.openai_client = OpenAI(api_key=api_keys[ModelProvider.OPENAI.value])
33+
openai_key = args.openai_key or args.api_key or os.getenv("OPENAI_API_KEY", "")
34+
if openai_key:
35+
self.openai_client = OpenAI(api_key=openai_key)
3336

34-
if api_keys.get(ModelProvider.AZURE_OPENAI.value):
37+
azure_openai_key = args.azure_openai_key or os.getenv("AZURE_OPENAI_API_KEY", "")
38+
if azure_openai_key:
3539
endpoint = args.azure_openai_endpoint or os.getenv("AZURE_OPENAI_ENDPOINT")
3640
if not endpoint:
3741
raise ValueError("Missing Azure OpenAI endpoint.")
@@ -42,12 +46,21 @@ def initialize_clients(self, args: Namespace, api_keys: Dict[str, str]):
4246

4347
self.azure_openai_client = AzureOpenAI(
4448
azure_endpoint=endpoint,
45-
api_key=api_keys[ModelProvider.AZURE_OPENAI.value],
49+
api_key=azure_openai_key,
4650
api_version=api_version
4751
)
4852

49-
if api_keys.get(ModelProvider.ANTHROPIC.value):
50-
self.anthropic_client = Anthropic(api_key=api_keys[ModelProvider.ANTHROPIC.value])
53+
antropic_key = args.anthropic_key or os.getenv("ANTHROPIC_API_KEY", "")
54+
if antropic_key:
55+
self.anthropic_client = Anthropic(api_key=antropic_key)
5156

52-
if api_keys.get(ModelProvider.DEEPSEEK.value):
53-
self.deepseek_api_key = api_keys[ModelProvider.DEEPSEEK.value]
57+
deepseek_key = args.deepseek_key or os.getenv("DEEPSEEK_API_KEY", "")
58+
if deepseek_key:
59+
self.deepseek_api_key = deepseek_key
60+
61+
return {
62+
ModelProvider.OPENAI.value: openai_key,
63+
ModelProvider.ANTHROPIC.value: antropic_key,
64+
ModelProvider.DEEPSEEK.value: deepseek_key,
65+
ModelProvider.AZURE_OPENAI.value: azure_openai_key,
66+
}

python_gpt_po/utils/cli.py

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
including argument definitions, help text generation, and command processing.
55
"""
66
import logging
7-
import os
87
import sys
98
from argparse import ArgumentParser, Namespace, RawDescriptionHelpFormatter
109
from typing import Dict, List, Optional
@@ -259,24 +258,6 @@ def get_provider_from_args(args: Namespace) -> Optional[ModelProvider]:
259258
return None
260259

261260

262-
def get_api_keys_from_args(args: Namespace) -> Dict[str, str]:
263-
"""
264-
Extract API keys from command line arguments and environment variables.
265-
266-
Args:
267-
args (Namespace): Parsed command line arguments
268-
269-
Returns:
270-
Dict[str, str]: Dictionary of provider names to API keys
271-
"""
272-
return {
273-
ModelProvider.OPENAI.value: args.openai_key or args.api_key or os.getenv("OPENAI_API_KEY", ""),
274-
ModelProvider.ANTHROPIC.value: args.anthropic_key or os.getenv("ANTHROPIC_API_KEY", ""),
275-
ModelProvider.DEEPSEEK.value: args.deepseek_key or os.getenv("DEEPSEEK_API_KEY", ""),
276-
ModelProvider.AZURE_OPENAI.value: args.azure_openai_key or os.getenv("AZURE_OPENAI_API_KEY", ""),
277-
}
278-
279-
280261
def auto_select_provider(api_keys: Dict[str, str]) -> Optional[ModelProvider]:
281262
"""
282263
Auto-select a provider based on available API keys.

0 commit comments

Comments
 (0)