Skip to content

Releases: fatbobman/Objects2XLSX

1.3.2: clean: remove debug output from ZIP structure fix

10 Jul 09:53

Choose a tag to compare

Removed all temporary debugging output added during the ZIP structure
investigation. The fix has been verified to work correctly:

- XLSX files now have proper internal structure when unzipped
- No unwanted directory layers (like random hex strings) appear
- All working directory strategies (.alongsideOutput, .systemTemp, .custom) work correctly
- All existing tests continue to pass

The core fix (URL symlink resolution in SimpleZip.collectEntries) remains intact.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

Release 1.3.1

09 Jul 09:57

Choose a tag to compare

- Added convenience factory methods for all column output types
- Simplified syntax for custom mappings with static methods like `.string()`, `.double()`, `.int()`, etc.
- Support for both optional and non-optional values
- Clear separation between type creation and nil handling strategy

- Better documentation for new factory methods with usage examples
- Maintains backward compatibility with existing API
- Preserves the flexibility of Column's defaultValue mechanism

This release focuses on developer experience improvements, making it easier to create custom column mappings while maintaining the library's type safety and flexibility.

Release 1.3.0

09 Jul 09:20

Choose a tag to compare

- Add generic mapping constructors to Column API for flexible type transformations
- Support custom transformations from any input type to any output type
- Enable simplified syntax for common conversion patterns (enums, conditional logic, formatting)

- Enhanced Column API flexibility while maintaining backward compatibility
- Better support for complex data transformations in Excel generation

- Simplified column declarations for type conversions
- Comprehensive test coverage for new mapping constructors
- Fixed compiler warnings in test suite

Release 1.2.0: Async Data Provider Support

01 Jul 01:05

Choose a tag to compare

- **Async data fetching**: Support for `@Sendable () async -> [ObjectType]` data providers
- **Thread-safe operations**: Safe cross-thread data fetching for Core Data, SwiftData, and API calls
- **Mixed workbooks**: Combine sync and async sheets in the same workbook seamlessly
- **Book.writeAsync()**: New async method for XLSX generation with full progress tracking

- **Sendable conformance**: Conditional Sendable support for thread-safe data transfer
- **Type safety**: `@Sendable` constraints ensure safe data transfer across threads
- **Concurrent processing**: Full compatibility with Swift's strict concurrency model

- **Multi-language support**: Updated documentation in English, Chinese, and Japanese
- **Comprehensive examples**: Real-world Core Data and SwiftData integration patterns
- **Thread safety guidelines**: Best practices for async data loading
- **Migration guide**: Easy upgrade path from synchronous to asynchronous data providers

- **Enhanced API**: New convenience initializers for async data providers
- **Progress tracking**: Full async progress monitoring support
- **Error handling**: Improved error propagation for async operations
- **Performance**: Optimized memory usage for large async datasets

- **340+ tests**: Comprehensive test coverage including new async functionality
- **Cross-platform**: Verified compatibility on macOS, iOS, tvOS, watchOS, and Linux
- **SwiftFormat integration**: Consistent code formatting with Git hooks
- **CI/CD improvements**: Enhanced build and test automation

None - this release maintains full backward compatibility with existing synchronous APIs.

```swift
let sheet = Sheet<PersonData>(
    name: "Async Employees",
    asyncDataProvider: dataService.fetchEmployees
) {
    Column(name: "Name", keyPath: \.name)
    Column(name: "Department", keyPath: \.department)
}

let book = Book(style: BookStyle()) { sheet }
let outputURL = try await book.writeAsync(to: outputURL)
```

```swift
@Sendable
func fetchEmployees() async -> [EmployeeData] {
    await withCheckedContinuation { continuation in
        persistentContainer.viewContext.perform {
            // Fetch and convert to Sendable DTOs
            let data = employees.map { EmployeeData(from: $0) }
            continuation.resume(returning: data)
        }
    }
}
```

For complete documentation and examples, see the updated README files.

Release 1.1.3 - SwiftLint Configuration Optimization

27 Jun 10:53

Choose a tag to compare

- **AI-Friendly Rules**: Optimized linting rules for AI-generated code
- **Reduced Violations**: Eliminated all 158 lint warnings and 15 errors
- **Relaxed Limits**: Increased file length, function complexity, and parameter limits
- **Smart Exceptions**: Added support for common short variable names (fg, bg, d, s, ts)
- **Better Compatibility**: Improved support for SwiftUI-style code patterns

- File length limit: 800 → 1200 lines
- Function body length: 50 → 110 lines
- Parameter count: 5 → 8 parameters
- Line length: 180 → 220 characters
- Cyclomatic complexity: 15 → 30
- Disabled overly strict rules: missing_docs, large_tuple, multiple_closures_with_trailing_closure

- Optimized SwiftLint configuration for better AI code compatibility
- Maintained code quality while reducing developer friction
- Enhanced development workflow efficiency

This release focuses on improving the developer experience while maintaining
the library's functionality and reliability.

🤖 Generated with [Claude Code](https://claude.ai/code)

1.1.2

27 Jun 10:04

Choose a tag to compare

1.1.1: clean: Remove test branch from CI triggers

26 Jun 11:22

Choose a tag to compare

Remove fix-linux-trailing-comma branch from GitHub Actions workflow
triggers now that the fix has been merged to main.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

1.1.0

26 Jun 09:59

Choose a tag to compare

fix: Replace CFAbsoluteTimeGetCurrent with cross-platform Date API fo…

Add localized README files for Chinese and Japanese

26 Jun 08:54

Choose a tag to compare

feat: Add localized README files for Chinese and Japanese

- Create README_CN.md with complete Chinese translation
- Create README_JP.md with complete Japanese translation
- Add language switcher links to main README.md
- Maintain consistent structure and formatting across all language versions

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

Release 1.0.0 - Initial Public Release

26 Jun 07:21

Choose a tag to compare

🎉 Objects2XLSX 1.0.0 is now available!

  • Generic Sheet with compile-time safety

  • KeyPath integration for direct property mapping

  • Swift 6 strict concurrency compliance

  • Generated XLSX files strictly conform to Excel specifications

  • No warnings or compatibility issues when opening files

  • Seamless compatibility with Excel, Numbers, and more...

  • Simplified, intuitive column declarations

  • Automatic type inference and optional handling

  • Powerful method chaining (.defaultValue, .toString, .width)

  • Support for String, Int, Double, Bool, Date, URL, Percentage

  • Complete styling system (fonts, colors, borders, fills)

  • Style hierarchy: Book → Sheet → Column → Cell

  • Custom themes and professional formatting

  • Border management with automatic region detection

  • Memory-efficient stream processing for large datasets

  • Real-time progress tracking with AsyncStream

  • Cross-platform: macOS, iOS, tvOS, watchOS, Linux

  • 340+ comprehensive tests ensuring reliability

  • Zero external dependencies (except optional SimpleLogger)

  • Comprehensive demo project with multiple scenarios

  • Builder pattern with declarative DSL

  • Extensive documentation and examples

  • Decoupled architecture with ZipArchiver protocol

  • Intelligent SharedString optimization for Excel compatibility

  • Complete XLSX specification compliance

  • Thread-safe design with proper Core Data/SwiftData support

.package(url: "https://github.com/fatbobman/Objects2XLSX.git", from: "1.0.0")

Special thanks to the Swift community for feedback and contributions.

Released under Apache License 2.0