Changelog

View Source

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

0.2.0 - 2025-10-28

Added

Performance Benchmarking

  • Added comprehensive benchmark suite comparing SmileEx with Jason using Benchee 1.5.0
  • Three benchmark scripts in benchmarks/ directory:
    • comparison.exs - Full performance comparison (encoding, decoding, round-trip, memory usage)
    • size_comparison.exs - Detailed message size analysis with color-coded results
    • quick.exs - Fast benchmark for development
  • Benchmark documentation in benchmarks/README.md with usage examples and interpretation guide
  • Size comparison showing 12-60% reduction depending on data structure
  • Performance metrics showing Jason is faster for small payloads, SmileEx competitive for large datasets

Property-Based Testing

  • Added property-based testing using StreamData 1.1
  • 24 comprehensive property tests (test/smile_property_test.exs) covering:
    • Round-trip encoding/decoding for all data types
    • Type preservation (integers, floats, strings, booleans, nil, lists, maps)
    • Header validity for all encoded data
    • Deterministic encoding
    • Encoding options correctness (shared_names, shared_values)
    • Size optimization properties
    • Edge cases (Unicode, special characters, large values, nested structures)
    • Error handling
  • Custom data generators for Smile-compatible types
  • Recursive generator for nested structures (depth-limited)
  • ~2,400 test cases generated per test run
  • Comprehensive documentation in test/property_testing_guide.md
  • Implementation summary in PROPERTY_TESTING.md

Documentation

  • Added benchmarks/README.md - Comprehensive benchmarking guide
  • Added test/property_testing_guide.md - Property testing guide with examples
  • Added PROPERTY_TESTING.md - Property testing implementation summary
  • Updated main README.md with:
    • Benchmarking section with usage examples
    • Property-based testing section
    • Detailed size reduction statistics
    • Best use cases for Smile vs JSON

Changed

Code Quality Improvements

  • Reduced cyclomatic complexity across multiple functions:
    • Smile.Decoder.decode_value - Split into smaller functions using pattern matching
    • Smile.Encoder.encode_string - Extracted helper functions for value sharing
    • Smile.Encoder.encode_string_bytes - Split into ASCII and Unicode encoders
    • Smile.Decoder.decode_string_value - Extracted long string handler
  • Reduced nesting depth using with statements:
    • Smile.Decoder.decode_long_string - Uses with for cleaner error handling
    • Smile.Decoder.decode_long_field_name - Uses with for cleaner error handling
  • Extracted helper functions for better separation of concerns:
    • split_at_string_terminator/1
    • split_at_field_name_terminator/1
    • maybe_add_shared_value/2
    • maybe_add_shared_name/2
    • encode_ascii_string/2
    • encode_unicode_string/2
    • decode_value_by_token/3
    • decode_long_string_or_reference/3
  • Fixed alias ordering to be alphabetical
  • Converted single-condition cond to if-else in property tests
  • Zero Credo issues - All code quality checks passing

Dependencies

  • Added {:benchee, "~> 1.5.0", only: :dev, runtime: false} - For performance benchmarking
  • Added {:jason, "~> 1.4", only: [:dev, :test]} - For comparison benchmarks
  • Added {:stream_data, "~> 1.1", only: :test} - For property-based testing

Testing

  • Increased from 56 tests to 80 tests (5 doctests + 24 properties + 51 unit tests)
  • Test coverage improved to 83.5% (from 82.8%)
  • All tests passing with zero failures
  • Property tests automatically generate thousands of test cases
  • Added tests for edge cases discovered through property testing

Performance

  • Benchmarks show typical 12-60% size reduction vs JSON:
    • Best: 60%+ for large datasets with consistent structure (product catalogs, logs)
    • Good: 30-50% for API responses with multiple records
    • Modest: 10-20% for simple objects and short strings
  • Encoding speed: Jason faster for small payloads, SmileEx competitive for large datasets
  • Memory usage: SmileEx uses more memory due to shared reference tracking

0.1.0 - 2025-10-26

Added

  • Initial release of SmileEx binary format encoder/decoder for Elixir
  • Complete implementation of Smile format specification v1.0
  • Support for all JSON-compatible data types (null, boolean, integer, float, string, array, object)
  • Encoding with back-references for field names and string values
  • Configurable encoding options (shared_names, shared_values, raw_binary)
  • Both tuple-based (encode/2, decode/1) and exception-based (encode!/2, decode!/1) APIs
  • Comprehensive test suite with 56 tests
  • Full documentation with examples
  • Variable-length integer encoding (VInt) support
  • ZigZag encoding for signed integers
  • Optimized string encoding based on length and character set (ASCII vs Unicode)
  • Support for small integer optimization (single-byte encoding for -16 to +15)

Features

  • Encodes Elixir terms to Smile binary format
  • Decodes Smile binary format to Elixir terms
  • Perfect round-trip encoding/decoding preservation
  • Typically 20-40% size reduction compared to JSON
  • Faster encoding and decoding than text-based JSON