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.
Files changed (100) hide show
  1. checksums.yaml +4 -4
  2. data/.env.example +14 -0
  3. data/.rspec +3 -0
  4. data/.rubocop.yml +8 -0
  5. data/.yardopts +10 -0
  6. data/CHANGELOG.md +125 -114
  7. data/CLAUDE.md +385 -0
  8. data/README.md +629 -244
  9. data/Rakefile +7 -1
  10. data/Steepfile +29 -0
  11. data/docs/implementation/00-overview.md +220 -0
  12. data/docs/implementation/01-setup_dependencies.md +668 -0
  13. data/docs/implementation/02-error_handling.md +65 -0
  14. data/docs/implementation/03-core_components.md +457 -0
  15. data/docs/implementation/03.5-variable_preservation.md +509 -0
  16. data/docs/implementation/04-provider_architecture.md +571 -0
  17. data/docs/implementation/05-translation_logic.md +1065 -0
  18. data/docs/implementation/06-main_module_api.md +122 -0
  19. data/docs/implementation/07-direct_translation_helpers.md +582 -0
  20. data/docs/implementation/08-rails_integration.md +323 -0
  21. data/docs/implementation/09-testing_suite.md +228 -0
  22. data/docs/implementation/10-documentation_examples.md +150 -0
  23. data/docs/implementation/11-quality_security.md +65 -0
  24. data/docs/implementation/12-cli_standalone.md +698 -0
  25. data/exe/better_translate +9 -0
  26. data/lib/better_translate/cache.rb +125 -0
  27. data/lib/better_translate/cli.rb +304 -0
  28. data/lib/better_translate/configuration.rb +201 -0
  29. data/lib/better_translate/direct_translator.rb +131 -0
  30. data/lib/better_translate/errors.rb +101 -0
  31. data/lib/better_translate/progress_tracker.rb +157 -0
  32. data/lib/better_translate/provider_factory.rb +45 -0
  33. data/lib/better_translate/providers/anthropic_provider.rb +154 -0
  34. data/lib/better_translate/providers/base_http_provider.rb +239 -0
  35. data/lib/better_translate/providers/chatgpt_provider.rb +138 -44
  36. data/lib/better_translate/providers/gemini_provider.rb +123 -61
  37. data/lib/better_translate/railtie.rb +18 -0
  38. data/lib/better_translate/rate_limiter.rb +90 -0
  39. data/lib/better_translate/strategies/base_strategy.rb +58 -0
  40. data/lib/better_translate/strategies/batch_strategy.rb +56 -0
  41. data/lib/better_translate/strategies/deep_strategy.rb +45 -0
  42. data/lib/better_translate/strategies/strategy_selector.rb +43 -0
  43. data/lib/better_translate/translator.rb +115 -284
  44. data/lib/better_translate/utils/hash_flattener.rb +104 -0
  45. data/lib/better_translate/validator.rb +105 -0
  46. data/lib/better_translate/variable_extractor.rb +259 -0
  47. data/lib/better_translate/version.rb +2 -9
  48. data/lib/better_translate/yaml_handler.rb +168 -0
  49. data/lib/better_translate.rb +97 -73
  50. data/lib/generators/better_translate/analyze/USAGE +12 -0
  51. data/lib/generators/better_translate/analyze/analyze_generator.rb +94 -0
  52. data/lib/generators/better_translate/install/USAGE +13 -0
  53. data/lib/generators/better_translate/install/install_generator.rb +71 -0
  54. data/lib/generators/better_translate/install/templates/README +20 -0
  55. data/lib/generators/better_translate/install/templates/initializer.rb.tt +47 -0
  56. data/lib/generators/better_translate/translate/USAGE +13 -0
  57. data/lib/generators/better_translate/translate/translate_generator.rb +114 -0
  58. data/lib/tasks/better_translate.rake +136 -0
  59. data/sig/better_translate/cache.rbs +28 -0
  60. data/sig/better_translate/cli.rbs +24 -0
  61. data/sig/better_translate/configuration.rbs +78 -0
  62. data/sig/better_translate/direct_translator.rbs +18 -0
  63. data/sig/better_translate/errors.rbs +46 -0
  64. data/sig/better_translate/progress_tracker.rbs +29 -0
  65. data/sig/better_translate/provider_factory.rbs +8 -0
  66. data/sig/better_translate/providers/anthropic_provider.rbs +27 -0
  67. data/sig/better_translate/providers/base_http_provider.rbs +44 -0
  68. data/sig/better_translate/providers/chatgpt_provider.rbs +25 -0
  69. data/sig/better_translate/providers/gemini_provider.rbs +22 -0
  70. data/sig/better_translate/railtie.rbs +7 -0
  71. data/sig/better_translate/rate_limiter.rbs +20 -0
  72. data/sig/better_translate/strategies/base_strategy.rbs +19 -0
  73. data/sig/better_translate/strategies/batch_strategy.rbs +13 -0
  74. data/sig/better_translate/strategies/deep_strategy.rbs +11 -0
  75. data/sig/better_translate/strategies/strategy_selector.rbs +10 -0
  76. data/sig/better_translate/translator.rbs +24 -0
  77. data/sig/better_translate/utils/hash_flattener.rbs +14 -0
  78. data/sig/better_translate/validator.rbs +14 -0
  79. data/sig/better_translate/variable_extractor.rbs +40 -0
  80. data/sig/better_translate/version.rbs +4 -0
  81. data/sig/better_translate/yaml_handler.rbs +29 -0
  82. data/sig/better_translate.rbs +32 -2
  83. data/sig/faraday.rbs +22 -0
  84. data/sig/generators/better_translate/analyze/analyze_generator.rbs +18 -0
  85. data/sig/generators/better_translate/install/install_generator.rbs +14 -0
  86. data/sig/generators/better_translate/translate/translate_generator.rbs +10 -0
  87. data/sig/optparse.rbs +9 -0
  88. data/sig/psych.rbs +5 -0
  89. data/sig/rails.rbs +34 -0
  90. metadata +89 -203
  91. data/lib/better_translate/helper.rb +0 -83
  92. data/lib/better_translate/providers/base_provider.rb +0 -102
  93. data/lib/better_translate/service.rb +0 -144
  94. data/lib/better_translate/similarity_analyzer.rb +0 -218
  95. data/lib/better_translate/utils.rb +0 -55
  96. data/lib/better_translate/writer.rb +0 -75
  97. data/lib/generators/better_translate/analyze_generator.rb +0 -57
  98. data/lib/generators/better_translate/install_generator.rb +0 -14
  99. data/lib/generators/better_translate/templates/better_translate.rb +0 -56
  100. 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
- task default: %i[spec rubocop]
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)