Commit Graph

379 Commits

Author SHA1 Message Date
Jeremiah Russell
bcb93fd68f feat: integrate configurable rules path throughout CLI
- Make parse_config_root() public for reuse in main.rs
- Add get_rules_path() helper to extract and resolve rules path from config
- Update main CLI to use configured rules path for default rule execution
- Add run_with_rules_path() method to RulesCli for custom path support
- Update all unit tests to include rules_dir field
- Rules path now supports h:, c:, r: prefixes throughout the application
2025-10-22 06:38:00 +01:00
Jeremiah Russell
20b36a00ed feat: add get_rules_from() to load rules from custom path
- Add get_rules_from(path) function that accepts optional custom path
- Keep get_rules() as backward-compatible wrapper
- Automatically create and save default rules to custom path if not found
2025-10-22 06:38:00 +01:00
Jeremiah Russell
2083c5c5fe feat: add configurable rules directory support to Rules and InitCli
- Add Rules::load_from() and Rules::save_to() methods for custom paths
- Add --rules-dir option to init command
- Support h:, c:, r: path prefixes for rules directory
- Generate config file with correct rules path when using separate directory
- Create rules directory automatically if it doesn't exist
- Maintain backward compatibility with default ~/.cull-gmail/rules.toml
2025-10-22 06:38:00 +01:00
Jeremiah Russell
df9d2b6c8a 🔧 fix: address clippy warnings after refactoring
- Change &PathBuf to &Path parameter in plan_credential_file_operation
- Use inline format string in log message
- Both formatting and linting now clean
2025-10-21 14:48:31 +01:00
Jeremiah Russell
aaa4ebcbde ♻️ refactor: reduce cognitive complexity of plan_operations and execute_operation
## Refactoring Changes

### plan_operations function:
- Split monolithic function into focused single-purpose methods
- Extract plan_config_directory, plan_credential_file_operation, etc.
- Add check_file_conflicts helper to eliminate repetitive error checking
- Fix should_backup logic (was always returning true)

### execute_operation function:
- Replace large match statement with focused execution methods
- Extract execute_create_directory, execute_copy_file, etc.
- Add handle_existing_file helper for backup/interactive logic
- Add prompt_for_overwrite and apply_permissions_if_needed helpers

## Benefits:
- Each function now has single responsibility
- Eliminated code duplication in conflict checking and interactive prompts
- Reduced cyclomatic complexity from ~15 to 2-3 per function
- Improved testability and maintainability
- All tests continue to pass
2025-10-21 14:48:31 +01:00
Jeremiah Russell
5bcfc8fd29 🐛 fix: allow init command to run without existing config file
- Move init command handling before config loading in CLI dispatcher
- Prevents init from failing when no configuration exists yet
- Fixes CircleCI test failures where init was trying to load ~/.cull-gmail/cull-gmail.toml
- All integration tests now pass in CI environment
2025-10-21 14:48:31 +01:00
Jeremiah Russell
b33458cf3e 🎨 style: apply rustfmt formatting to test assertions 2025-10-21 14:48:31 +01:00
Jeremiah Russell
3dcd229ee9 🐛 fix: replace hardcoded paths in tests with temp directories for CI compatibility 2025-10-21 14:48:31 +01:00
Jeremiah Russell
8f79081b4f 🔧 fix: address clippy warnings and improve code formatting 2025-10-21 14:48:31 +01:00
Jeremiah Russell
2cfd16c8ac 🧪 test(init): unit tests for planning and file IO 2025-10-21 14:48:31 +01:00
Jeremiah Russell
0a047dd547 🏗️ feat(init): implement plan and apply operations
- Add comprehensive Operation enum for file/directory operations
- Implement path resolution with h:, c:, r: prefix support
- Create default config and rules file templates
- Add interactive prompts for credential file setup
- Support dry-run mode with detailed operation preview
- Include progress bar for operation execution
- Implement secure file permissions (0600 for credentials, 0700 for tokens)
- Add timestamped backup functionality for existing files
- Support force overwrite and interactive conflict resolution
2025-10-21 14:48:31 +01:00
Jeremiah Russell
fd70ef9511 feat(cli): scaffold InitCli subcommand and clap wiring 2025-10-21 14:48:31 +01:00
Jeremiah Russell
171f441f1d 🔧 fix: Resolve clippy warnings and formatting issues
- Remove unnecessary borrowing where values can be used directly
- Use variables directly in format strings for better readability
- Apply consistent code formatting per rustfmt standards
- All clippy warnings resolved with -D warnings flag
- Code now follows Rust idioms and best practices
2025-10-21 07:47:55 +01:00
Jeremiah Russell
2bee42d7ba 🔐 feat: Add token export/import for ephemeral environments
- Add token CLI subcommand with export/import operations
- Enable OAuth2 token persistence across clean environments
- Support for containers, CI/CD, and ephemeral compute workflows
- Compress tokens with gzip and encode as base64 for env vars
- Automatic token restoration from CULL_GMAIL_TOKEN_CACHE
- Secure file permissions (600) on restored tokens
- Add comprehensive error handling for token operations
- Update dependencies: base64, flate2, serde_json

This feature enables cull-gmail to run in ephemeral environments
like Docker containers and CI/CD pipelines without re-authentication
by exporting tokens once and restoring them via environment variables.
2025-10-21 07:47:55 +01:00
Jeremiah Russell
3979379795 🎨 style(cli): apply rustfmt formatting standards to CLI modules
- Apply cargo fmt to ensure consistent code formatting across CLI modules
- Fix trailing whitespace in documentation comments
- Optimize comment formatting and indentation
- All clippy checks pass with no warnings
- Documentation generates cleanly with strict nightly flags
- All tests continue to pass after formatting changes
2025-10-20 22:27:38 +01:00
Jeremiah Russell
97947033ce 📝 docs(cli): add comprehensive documentation for rules module
- Add extensive module-level documentation explaining rule-based message management
- Document complete rule configuration and execution workflow
- Include comprehensive TOML configuration examples with retention periods
- Add detailed safety features and error handling documentation
- Document subcommand architecture and delegation patterns
- Include practical usage examples for configuration and execution
- Add comprehensive method documentation with operation flows and side effects
- Document automatic configuration fallback and validation systems
2025-10-20 22:27:38 +01:00
Jeremiah Russell
3a2f2ad31b 📝 docs(cli): add comprehensive documentation for labels and messages modules
- Add extensive module-level documentation for labels_cli with usage examples
- Document complete messages_cli module with Gmail query syntax guide
- Add comprehensive struct and method documentation with safety considerations
- Include detailed parameter explanations and error handling guidance
- Document action types with safety levels and reversibility information
- Add practical usage patterns and safety recommendations
- Include extensive examples of Gmail query syntax and filtering options
2025-10-20 22:27:38 +01:00
Jeremiah Russell
a35b5f9248 📝 docs(cli): add comprehensive module documentation and function docs
- Add extensive module-level documentation explaining CLI architecture
- Document all CLI structs with detailed field explanations and usage examples
- Add comprehensive function documentation covering all main workflow functions
- Include safety considerations, error handling, and configuration guidance
- Fix configuration parameter name: credentials -> credential_file
- Document logging levels, exit codes, and environment variable overrides
- Add detailed explanations of rule processing workflow and safety features
2025-10-20 22:27:38 +01:00
Jeremiah Russell
07d01aa61e 🎨 style(client_config): apply rustfmt formatting standards
- Apply cargo fmt to ensure consistent code formatting
- Fix line wrapping for long assertions and method chains
- Optimize whitespace and indentation
- All clippy checks pass with no warnings
- Documentation generates without warnings on nightly with -Dwarnings
2025-10-20 14:59:32 +01:00
Jeremiah Russell
5f7b180a75 🧪 test(client_config): add comprehensive unit test coverage
- Add 20 unit tests covering all public API functionality
- Test builder pattern with direct OAuth2 parameters and credential files
- Test configuration loading from Config objects with error conditions
- Test path resolution schemes (home, root, current directory)
- Test configuration priority (direct params vs credential file)
- Test error conditions with proper panic expectations
- Test edge cases: Unicode strings, multiple redirect URIs, optional fields
- Cover accessor methods and method chaining functionality
- Include temporary file testing for credential file loading
2025-10-20 14:59:32 +01:00
Jeremiah Russell
7920106306 📝 docs(client_config): add comprehensive module and API documentation
- Add detailed module-level documentation with security considerations
- Document all public structs, methods, and their usage patterns
- Include practical examples for builder pattern and configuration loading
- Fix typo in default auth_uri (https;:// -> https://)
- Add security notes for sensitive credential handling
- Document path resolution schemes and configuration directory structure
2025-10-20 14:59:32 +01:00
Jeremiah Russell
4c2cfac06d ♻️ refactor: remove redundant credential module
- Delete src/credential.rs - module was unused in actual codebase
- Remove credential module references from lib.rs exports
- Update documentation to use standard OAuth2 terminology
- Fix CLI docs to reference correct credential_file config
- Application uses ConsoleApplicationSecret directly instead

The custom Credential struct duplicated functionality already
provided by yup_oauth2::ConsoleApplicationSecret. All credential
loading is handled by ClientConfig::new_from_configuration() which
uses the standard OAuth2 types.
2025-10-20 14:32:44 +01:00
Jeremiah Russell
2ca7d27b91 🧪 test(credential): add comprehensive unit test coverage
- Add 16 unit tests covering serialization/deserialization
- Test JSON parsing with valid, minimal, and invalid inputs
- Verify conversion to yup_oauth2::ApplicationSecret
- Test edge cases: empty fields, Unicode, large data sets
- Add security-focused tests for credential handling
- All tests pass with 100% coverage of public API
2025-10-20 14:32:44 +01:00
Jeremiah Russell
a1827042a6 📝 docs(credential): add comprehensive OAuth2 credential documentation with security guidance 2025-10-20 14:32:44 +01:00
Jeremiah Russell
783eefebbb 🎨 style: fix rustfmt formatting issues for CI 2025-10-20 14:08:17 +01:00
Jeremiah Russell
a8a79f92ec 🎨 style(eol_action): fix clippy warnings and improve Copy trait usage 2025-10-20 14:08:17 +01:00
Jeremiah Russell
ce9928aa22 🧪 test(eol_action): add comprehensive unit tests covering all functionality and edge cases 2025-10-20 14:08:17 +01:00
Jeremiah Russell
c120169f90 📝 docs(eol_action): add comprehensive rustdoc with safety warnings and usage examples 2025-10-20 14:08:17 +01:00
Jeremiah Russell
f95ac2f1ff 🐛 fix(rule_processor): correct spelling of "behaviour"
- correct spelling of "behaviour" in comment for consistency
2025-10-20 12:00:17 +01:00
Jeremiah Russell
b26887e05a 🎨 style: fix clippy warnings and clean up test code 2025-10-20 12:00:17 +01:00
Jeremiah Russell
084a643b74 🧪 test(gmail_client): add unit tests with comprehensive coverage for MessageSummary and public API 2025-10-20 12:00:17 +01:00
Jeremiah Russell
9bf69f3624 📝 docs(gmail_client): add comprehensive rustdoc with examples and guidance 2025-10-20 12:00:17 +01:00
Jeremiah Russell
cd907882ae 🧪 test(message-list): add edge-case tests (empty first page, no next_page_token despite pages > 1) 2025-10-20 08:16:45 +01:00
Jeremiah Russell
34125e7d5c 🧪 test(message-list): add test-only GmailService mock and end-to-end pagination test (no network) 2025-10-20 08:16:45 +01:00
Jeremiah Russell
4c5378c90b ♻️ refactor(message-list): introduce GmailService abstraction and refactor to use it; fix borrows and lifetimes 2025-10-20 08:16:45 +01:00
Jeremiah Russell
161710e1f9 ♻️ refactor(message-list): extract helper to append messages from ListMessagesResponse and add unit test 2025-10-20 08:16:45 +01:00
Jeremiah Russell
d0b1391738 fix(message-list): improve idioms (avoid redundant clone, extend labels, safer message extraction) 2025-10-20 08:16:45 +01:00
Jeremiah Russell
1fd9c29ead 🧹 chore(message-list): enable missing_docs lint for module 2025-10-20 08:16:45 +01:00
Jeremiah Russell
b878ff6152 🎨 style(message-list): apply rustfmt to satisfy CI fmt check 2025-10-20 08:16:45 +01:00
Jeremiah Russell
0042ba271f fix(clippy): move tests module to file end to satisfy items_after_test_module lint 2025-10-20 08:16:45 +01:00
Jeremiah Russell
e48535c623 🎨 style: format codebase with cargo fmt 2025-10-20 08:16:45 +01:00
Jeremiah Russell
3d16bd22d1 🧪 test(message-list): add unit tests for trait behavior using mock implementation 2025-10-20 08:16:45 +01:00
Jeremiah Russell
501d8a5830 📝 docs(message-list): document trait and public methods with examples and error semantics 2025-10-20 08:16:45 +01:00
Jeremiah Russell
257caf55ab 📝 docs(message-list): add module-level rustdoc with overview and usage example 2025-10-20 08:16:45 +01:00
Jeremiah Russell
06d63fbd03 🎨 style(rule_processor): apply rustfmt and resolve clippy warnings 2025-10-19 09:51:56 +01:00
Jeremiah Russell
f16eb0a768 🧪 test(rule_processor): add passing rustdoc examples and validate with doc tests 2025-10-19 09:51:56 +01:00
Jeremiah Russell
1012047d89 🧪 test(rule_processor): add comprehensive unit tests for orchestration and state setters 2025-10-19 09:51:56 +01:00
Jeremiah Russell
992414e0b9 ♻️ refactor(rule_processor): extract process_label and add internal ops trait for unit testing 2025-10-19 09:51:56 +01:00
Jeremiah Russell
d91b3e3b92 ♻️ refactor(rule_processor): add TRASH_LABEL, correct Gmail scopes, early returns, and improve idioms 2025-10-19 09:51:56 +01:00
Jeremiah Russell
ea948eda27 📝 docs(rule_processor): add module and method docs with safety notes and doctest examples 2025-10-19 09:51:56 +01:00