better_translate 0.5.0 → 1.0.0
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.
- checksums.yaml +4 -4
- data/.env.example +14 -0
- data/.rspec +3 -0
- data/.rubocop.yml +8 -0
- data/.yardopts +10 -0
- data/CHANGELOG.md +125 -114
- data/CLAUDE.md +385 -0
- data/README.md +629 -244
- data/Rakefile +7 -1
- data/Steepfile +29 -0
- data/docs/implementation/00-overview.md +220 -0
- data/docs/implementation/01-setup_dependencies.md +668 -0
- data/docs/implementation/02-error_handling.md +65 -0
- data/docs/implementation/03-core_components.md +457 -0
- data/docs/implementation/03.5-variable_preservation.md +509 -0
- data/docs/implementation/04-provider_architecture.md +571 -0
- data/docs/implementation/05-translation_logic.md +1065 -0
- data/docs/implementation/06-main_module_api.md +122 -0
- data/docs/implementation/07-direct_translation_helpers.md +582 -0
- data/docs/implementation/08-rails_integration.md +323 -0
- data/docs/implementation/09-testing_suite.md +228 -0
- data/docs/implementation/10-documentation_examples.md +150 -0
- data/docs/implementation/11-quality_security.md +65 -0
- data/docs/implementation/12-cli_standalone.md +698 -0
- data/exe/better_translate +9 -0
- data/lib/better_translate/cache.rb +125 -0
- data/lib/better_translate/cli.rb +304 -0
- data/lib/better_translate/configuration.rb +201 -0
- data/lib/better_translate/direct_translator.rb +131 -0
- data/lib/better_translate/errors.rb +101 -0
- data/lib/better_translate/progress_tracker.rb +157 -0
- data/lib/better_translate/provider_factory.rb +45 -0
- data/lib/better_translate/providers/anthropic_provider.rb +154 -0
- data/lib/better_translate/providers/base_http_provider.rb +239 -0
- data/lib/better_translate/providers/chatgpt_provider.rb +138 -44
- data/lib/better_translate/providers/gemini_provider.rb +123 -61
- data/lib/better_translate/railtie.rb +18 -0
- data/lib/better_translate/rate_limiter.rb +90 -0
- data/lib/better_translate/strategies/base_strategy.rb +58 -0
- data/lib/better_translate/strategies/batch_strategy.rb +56 -0
- data/lib/better_translate/strategies/deep_strategy.rb +45 -0
- data/lib/better_translate/strategies/strategy_selector.rb +43 -0
- data/lib/better_translate/translator.rb +115 -284
- data/lib/better_translate/utils/hash_flattener.rb +104 -0
- data/lib/better_translate/validator.rb +105 -0
- data/lib/better_translate/variable_extractor.rb +259 -0
- data/lib/better_translate/version.rb +2 -9
- data/lib/better_translate/yaml_handler.rb +168 -0
- data/lib/better_translate.rb +97 -73
- data/lib/generators/better_translate/analyze/USAGE +12 -0
- data/lib/generators/better_translate/analyze/analyze_generator.rb +94 -0
- data/lib/generators/better_translate/install/USAGE +13 -0
- data/lib/generators/better_translate/install/install_generator.rb +71 -0
- data/lib/generators/better_translate/install/templates/README +20 -0
- data/lib/generators/better_translate/install/templates/initializer.rb.tt +47 -0
- data/lib/generators/better_translate/translate/USAGE +13 -0
- data/lib/generators/better_translate/translate/translate_generator.rb +114 -0
- data/lib/tasks/better_translate.rake +136 -0
- data/sig/better_translate/cache.rbs +28 -0
- data/sig/better_translate/cli.rbs +24 -0
- data/sig/better_translate/configuration.rbs +78 -0
- data/sig/better_translate/direct_translator.rbs +18 -0
- data/sig/better_translate/errors.rbs +46 -0
- data/sig/better_translate/progress_tracker.rbs +29 -0
- data/sig/better_translate/provider_factory.rbs +8 -0
- data/sig/better_translate/providers/anthropic_provider.rbs +27 -0
- data/sig/better_translate/providers/base_http_provider.rbs +44 -0
- data/sig/better_translate/providers/chatgpt_provider.rbs +25 -0
- data/sig/better_translate/providers/gemini_provider.rbs +22 -0
- data/sig/better_translate/railtie.rbs +7 -0
- data/sig/better_translate/rate_limiter.rbs +20 -0
- data/sig/better_translate/strategies/base_strategy.rbs +19 -0
- data/sig/better_translate/strategies/batch_strategy.rbs +13 -0
- data/sig/better_translate/strategies/deep_strategy.rbs +11 -0
- data/sig/better_translate/strategies/strategy_selector.rbs +10 -0
- data/sig/better_translate/translator.rbs +24 -0
- data/sig/better_translate/utils/hash_flattener.rbs +14 -0
- data/sig/better_translate/validator.rbs +14 -0
- data/sig/better_translate/variable_extractor.rbs +40 -0
- data/sig/better_translate/version.rbs +4 -0
- data/sig/better_translate/yaml_handler.rbs +29 -0
- data/sig/better_translate.rbs +32 -2
- data/sig/faraday.rbs +22 -0
- data/sig/generators/better_translate/analyze/analyze_generator.rbs +18 -0
- data/sig/generators/better_translate/install/install_generator.rbs +14 -0
- data/sig/generators/better_translate/translate/translate_generator.rbs +10 -0
- data/sig/optparse.rbs +9 -0
- data/sig/psych.rbs +5 -0
- data/sig/rails.rbs +34 -0
- metadata +89 -203
- data/lib/better_translate/helper.rb +0 -83
- data/lib/better_translate/providers/base_provider.rb +0 -102
- data/lib/better_translate/service.rb +0 -144
- data/lib/better_translate/similarity_analyzer.rb +0 -218
- data/lib/better_translate/utils.rb +0 -55
- data/lib/better_translate/writer.rb +0 -75
- data/lib/generators/better_translate/analyze_generator.rb +0 -57
- data/lib/generators/better_translate/install_generator.rb +0 -14
- data/lib/generators/better_translate/templates/better_translate.rb +0 -56
- data/lib/generators/better_translate/translate_generator.rb +0 -84
data/Rakefile
CHANGED
|
@@ -9,4 +9,10 @@ require "rubocop/rake_task"
|
|
|
9
9
|
|
|
10
10
|
RuboCop::RakeTask.new
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
# Type checking with Steep
|
|
13
|
+
desc "Run type checking with Steep"
|
|
14
|
+
task :steep do
|
|
15
|
+
sh "bundle exec steep check"
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
task default: %i[spec rubocop steep]
|
data/Steepfile
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Steep configuration for BetterTranslate
|
|
4
|
+
# Run with: bundle exec steep check
|
|
5
|
+
|
|
6
|
+
D = Steep::Diagnostic
|
|
7
|
+
|
|
8
|
+
target :lib do
|
|
9
|
+
# Specify Ruby version
|
|
10
|
+
check "lib"
|
|
11
|
+
|
|
12
|
+
# Signature files location
|
|
13
|
+
signature "sig"
|
|
14
|
+
|
|
15
|
+
# Configure diagnostics
|
|
16
|
+
configure_code_diagnostics(D::Ruby.strict)
|
|
17
|
+
|
|
18
|
+
# Library definitions
|
|
19
|
+
library "pathname"
|
|
20
|
+
library "monitor"
|
|
21
|
+
library "logger"
|
|
22
|
+
library "set"
|
|
23
|
+
library "json"
|
|
24
|
+
library "yaml"
|
|
25
|
+
library "securerandom"
|
|
26
|
+
library "time"
|
|
27
|
+
library "mutex_m"
|
|
28
|
+
library "fileutils"
|
|
29
|
+
end
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
# 00 - Overview & Project Structure
|
|
2
|
+
|
|
3
|
+
[← Back to Index](../../IMPLEMENTATION_PLAN.md) | [Next: 01 - Setup Dependencies →](./01-setup_dependencies.md)
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## BetterTranslate - Implementation Plan Overview
|
|
8
|
+
|
|
9
|
+
This document provides an overview of the complete BetterTranslate implementation based on the detailed specifications.
|
|
10
|
+
|
|
11
|
+
### Project Goals
|
|
12
|
+
|
|
13
|
+
BetterTranslate is a powerful Ruby gem designed to automatically translate YAML locale files using AI-powered translation providers. It's optimized for Rails applications but works with any Ruby project.
|
|
14
|
+
|
|
15
|
+
### Key Features
|
|
16
|
+
|
|
17
|
+
- **Multiple AI Providers**: ChatGPT (GPT-5-nano), Google Gemini (gemini-2.0-flash-exp), Anthropic Claude (claude-3-5-sonnet-20241022)
|
|
18
|
+
- **Smart Translation Strategies**: Automatic selection between Deep (< 50 strings) and Batch (≥ 50 strings) processing
|
|
19
|
+
- **Intelligent Caching**: LRU cache with configurable capacity and TTL
|
|
20
|
+
- **Rails Integration**: 3 generators (install, translate, analyze)
|
|
21
|
+
- **Direct Translation API**: Helper methods for on-demand text translation
|
|
22
|
+
- **Thread-Safe**: Mutex-protected cache and rate limiting
|
|
23
|
+
- **Comprehensive Testing**: RSpec with VCR for API mocking
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## Complete File Structure
|
|
28
|
+
|
|
29
|
+
### Core Library (21 files)
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
lib/better_translate/
|
|
33
|
+
├── better_translate.rb # Main module (UPDATE)
|
|
34
|
+
├── version.rb # Exists
|
|
35
|
+
├── errors.rb # NEW - Error hierarchy
|
|
36
|
+
├── configuration.rb # NEW - Configuration class
|
|
37
|
+
├── cache.rb # NEW - LRU Cache
|
|
38
|
+
├── rate_limiter.rb # NEW - Rate limiting
|
|
39
|
+
├── validator.rb # NEW - Input validation
|
|
40
|
+
├── yaml_handler.rb # NEW - YAML operations
|
|
41
|
+
├── translator.rb # NEW - Main translator
|
|
42
|
+
├── progress_tracker.rb # NEW - Progress display
|
|
43
|
+
├── provider_factory.rb # NEW - Provider factory
|
|
44
|
+
├── helpers.rb # NEW - Direct translation API
|
|
45
|
+
├── providers/
|
|
46
|
+
│ ├── base_http_provider.rb # NEW - Base class
|
|
47
|
+
│ ├── chatgpt_provider.rb # NEW - OpenAI
|
|
48
|
+
│ ├── gemini_provider.rb # NEW - Google
|
|
49
|
+
│ └── anthropic_provider.rb # NEW - Anthropic Claude
|
|
50
|
+
├── strategies/
|
|
51
|
+
│ ├── base_strategy.rb # NEW - Base strategy
|
|
52
|
+
│ ├── deep_strategy.rb # NEW - Individual translation
|
|
53
|
+
│ ├── batch_strategy.rb # NEW - Batch translation
|
|
54
|
+
│ └── strategy_selector.rb # NEW - Auto-selection
|
|
55
|
+
└── utils/
|
|
56
|
+
└── hash_flattener.rb # NEW - Nested hash utils
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### Rails Generators (4 files)
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
lib/generators/better_translate/
|
|
63
|
+
├── install/
|
|
64
|
+
│ ├── install_generator.rb # NEW
|
|
65
|
+
│ └── templates/
|
|
66
|
+
│ └── initializer.rb.tt # NEW
|
|
67
|
+
├── translate/
|
|
68
|
+
│ └── translate_generator.rb # NEW
|
|
69
|
+
└── analyze/
|
|
70
|
+
└── analyze_generator.rb # NEW
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### Test Suite (~21 files)
|
|
74
|
+
|
|
75
|
+
```
|
|
76
|
+
spec/
|
|
77
|
+
├── spec_helper.rb # UPDATE
|
|
78
|
+
├── better_translate_spec.rb # UPDATE
|
|
79
|
+
├── support/
|
|
80
|
+
│ ├── vcr.rb # NEW - VCR config
|
|
81
|
+
│ └── test_helpers.rb # NEW - TranslationHelper
|
|
82
|
+
├── fixtures/
|
|
83
|
+
│ ├── en.yml # NEW - Test YAML
|
|
84
|
+
│ ├── it.yml # NEW
|
|
85
|
+
│ └── invalid.yml # NEW
|
|
86
|
+
├── vcr_cassettes/ # NEW directory
|
|
87
|
+
├── better_translate/
|
|
88
|
+
│ ├── configuration_spec.rb # NEW
|
|
89
|
+
│ ├── cache_spec.rb # NEW
|
|
90
|
+
│ ├── rate_limiter_spec.rb # NEW
|
|
91
|
+
│ ├── validator_spec.rb # NEW
|
|
92
|
+
│ ├── yaml_handler_spec.rb # NEW
|
|
93
|
+
│ ├── translator_spec.rb # NEW
|
|
94
|
+
│ ├── progress_tracker_spec.rb # NEW
|
|
95
|
+
│ ├── provider_factory_spec.rb # NEW
|
|
96
|
+
│ ├── helpers_spec.rb # NEW
|
|
97
|
+
│ ├── providers/
|
|
98
|
+
│ │ ├── base_http_provider_spec.rb # NEW
|
|
99
|
+
│ │ ├── chatgpt_provider_spec.rb # NEW
|
|
100
|
+
│ │ ├── gemini_provider_spec.rb # NEW
|
|
101
|
+
│ │ └── anthropic_provider_spec.rb # NEW
|
|
102
|
+
│ ├── strategies/
|
|
103
|
+
│ │ ├── deep_strategy_spec.rb # NEW
|
|
104
|
+
│ │ ├── batch_strategy_spec.rb # NEW
|
|
105
|
+
│ │ └── strategy_selector_spec.rb # NEW
|
|
106
|
+
│ └── utils/
|
|
107
|
+
│ └── hash_flattener_spec.rb # NEW
|
|
108
|
+
├── integration/
|
|
109
|
+
│ └── translation_workflow_spec.rb # NEW
|
|
110
|
+
└── generators/
|
|
111
|
+
├── install_generator_spec.rb # NEW
|
|
112
|
+
├── translate_generator_spec.rb # NEW
|
|
113
|
+
└── analyze_generator_spec.rb # NEW
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### Documentation & Examples (6 files)
|
|
117
|
+
|
|
118
|
+
```
|
|
119
|
+
Root files:
|
|
120
|
+
├── Gemfile # UPDATE
|
|
121
|
+
├── better_translate.gemspec # UPDATE
|
|
122
|
+
├── .yardopts # NEW
|
|
123
|
+
├── README.md # UPDATE
|
|
124
|
+
├── CHANGELOG.md # UPDATE
|
|
125
|
+
└── examples/
|
|
126
|
+
├── basic_usage.rb # NEW
|
|
127
|
+
├── advanced_usage.rb # NEW
|
|
128
|
+
└── direct_translation.rb # NEW
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
**TOTAL: ~53 files**
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## Implementation Phases
|
|
136
|
+
|
|
137
|
+
The implementation is divided into 11 phases, each building upon the previous:
|
|
138
|
+
|
|
139
|
+
| # | Phase | Files | Description |
|
|
140
|
+
|---|-------|-------|-------------|
|
|
141
|
+
| 01 | [Setup Dependencies](./01-setup_dependencies.md) | 3 | Gemfile, gemspec, .yardopts |
|
|
142
|
+
| 02 | [Error Handling](./02-error_handling.md) | 1 | Complete error hierarchy |
|
|
143
|
+
| 03 | [Core Components](./03-core_components.md) | 5 | Configuration, Cache, RateLimiter, Validator, HashFlattener |
|
|
144
|
+
| 04 | [Provider Architecture](./04-provider_architecture.md) | 5 | BaseHttpProvider + 3 providers + Factory |
|
|
145
|
+
| 05 | [Translation Logic](./05-translation_logic.md) | 6 | YAMLHandler, 3 Strategies, ProgressTracker, Translator |
|
|
146
|
+
| 06 | [Main Module & API](./06-main_module_api.md) | 1 | Update lib/better_translate.rb |
|
|
147
|
+
| 07 | [Direct Translation Helpers](./07-direct_translation_helpers.md) | 1 | Helpers module for on-demand translation |
|
|
148
|
+
| 08 | [Rails Integration](./08-rails_integration.md) | 4 | 3 generators + templates |
|
|
149
|
+
| 09 | [Testing Suite](./09-testing_suite.md) | ~21 | Complete RSpec test suite |
|
|
150
|
+
| 10 | [Documentation & Examples](./10-documentation_examples.md) | 3 | YARD, usage examples |
|
|
151
|
+
| 11 | [Quality & Security](./11-quality_security.md) | - | RuboCop, Bundler Audit, CI/CD |
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
## Development Effort Estimate
|
|
156
|
+
|
|
157
|
+
| Area | Estimated Time |
|
|
158
|
+
|------|----------------|
|
|
159
|
+
| Core Implementation | 10-12 hours |
|
|
160
|
+
| Rails Integration | 2-3 hours |
|
|
161
|
+
| Testing Suite | 6-8 hours |
|
|
162
|
+
| Documentation | 3-4 hours |
|
|
163
|
+
| QA & Fixes | 3-4 hours |
|
|
164
|
+
| **TOTAL** | **24-31 hours** |
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
## Recommended Implementation Order
|
|
169
|
+
|
|
170
|
+
1. ✅ **01 - Setup Dependencies**: Foundation (Gemfile, gemspec, .yardopts)
|
|
171
|
+
2. ✅ **02 - Error Handling**: Error hierarchy for all modules
|
|
172
|
+
3. ✅ **03 - Core Components**: Configuration, Cache, RateLimiter, Validator, HashFlattener
|
|
173
|
+
4. ✅ **04 - Provider Architecture**: BaseHttpProvider, ChatGPT, Gemini, Anthropic, Factory
|
|
174
|
+
5. ✅ **05 - Translation Logic**: YAMLHandler, Strategies, ProgressTracker, Translator
|
|
175
|
+
6. ✅ **06 - Main Module & API**: Update lib/better_translate.rb
|
|
176
|
+
7. ✅ **07 - Direct Translation Helpers**: On-demand text translation
|
|
177
|
+
8. ✅ **08 - Rails Integration**: Generators for Rails apps
|
|
178
|
+
9. ✅ **09 - Testing Suite**: Complete test coverage
|
|
179
|
+
10. ✅ **10 - Documentation & Examples**: YARD + usage examples
|
|
180
|
+
11. ✅ **Quality & Security**: Final checks and CI/CD
|
|
181
|
+
|
|
182
|
+
---
|
|
183
|
+
|
|
184
|
+
## Important Development Notes
|
|
185
|
+
|
|
186
|
+
### Mandatory Requirements
|
|
187
|
+
|
|
188
|
+
1. **YARD Documentation** - All public classes and methods must have comprehensive YARD documentation
|
|
189
|
+
2. **Faraday HTTP Client** - All HTTP connections must use Faraday (not Net::HTTP or HTTParty)
|
|
190
|
+
3. **Thread Safety** - Cache and RateLimiter must be thread-safe with Mutex
|
|
191
|
+
4. **Environment Variables** - All API keys must be read from ENV variables
|
|
192
|
+
5. **RuboCop Compliance** - Code must pass RuboCop before commits
|
|
193
|
+
6. **Test Coverage** - Minimum 90% coverage for core components
|
|
194
|
+
7. **Test-Driven Development** - ALWAYS write tests BEFORE implementation (see CLAUDE.md)
|
|
195
|
+
|
|
196
|
+
### Code Style
|
|
197
|
+
|
|
198
|
+
- **String Literals**: Double quotes (enforced by RuboCop)
|
|
199
|
+
- **Ruby Version**: 3.0+
|
|
200
|
+
- **Frozen String Literals**: Required at top of all files
|
|
201
|
+
|
|
202
|
+
### Security
|
|
203
|
+
|
|
204
|
+
- **Never hardcode API keys**
|
|
205
|
+
- **VCR anonymization** for test cassettes
|
|
206
|
+
- **Input validation** for all user-provided data
|
|
207
|
+
- **Bundle audit** for dependency vulnerabilities
|
|
208
|
+
|
|
209
|
+
---
|
|
210
|
+
|
|
211
|
+
## Project Information
|
|
212
|
+
|
|
213
|
+
- **Author**: alessiobussolari
|
|
214
|
+
- **Email**: alessio.bussolari@pandev.it
|
|
215
|
+
- **License**: MIT
|
|
216
|
+
- **Repository**: https://github.com/alessiobussolari/better_translate
|
|
217
|
+
|
|
218
|
+
---
|
|
219
|
+
|
|
220
|
+
[← Back to Index](../../IMPLEMENTATION_PLAN.md) | [Next: 01 - Setup Dependencies →](./01-setup_dependencies.md)
|