kore-fileformat 1.2.1
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 +7 -0
- data/README.md +146 -0
- data/lib/kore_fileformat/compressor.rb +49 -0
- data/lib/kore_fileformat/decompressor.rb +27 -0
- data/lib/kore_fileformat/native.rb +46 -0
- data/lib/kore_fileformat/version.rb +5 -0
- data/lib/kore_fileformat.rb +41 -0
- metadata +113 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: 5349022dc053744486e24a2244a1c6e84959043fe2f2fa2073f81753f9507e98
|
|
4
|
+
data.tar.gz: 3835a40a5714dcba3e078c02fd2b3a31a1241db7c552f8ba09b6a644f89ef70f
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 6515d5f31ae01d021ae8a65fe8bad7de5c544c87594d3898c2eea477446a8b1d6640e2b3608193c0b04554a1c826da0065b4052184ea4f22c158b0db251a7c1b
|
|
7
|
+
data.tar.gz: 1b02e2e1bece6bf795ff8545a4980b4cd0a98c5543efc605e8246210a88482fe04565de398408665c94dfb39b6322ef241dcac5a87fea4957cc8e464822d7ae6
|
data/README.md
ADDED
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
# KORE Ruby Gem Development
|
|
2
|
+
|
|
3
|
+
This directory contains the Ruby bindings and RubyGem package for KORE file format compression.
|
|
4
|
+
|
|
5
|
+
## Project Structure
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
kore-fileformat-ruby/
|
|
9
|
+
├── lib/
|
|
10
|
+
│ ├── kore_fileformat.rb # Main entry point and public API
|
|
11
|
+
│ └── kore_fileformat/
|
|
12
|
+
│ ├── version.rb # Version constant
|
|
13
|
+
│ ├── native.rb # FFI bindings to native library
|
|
14
|
+
│ ├── compressor.rb # Compression wrapper
|
|
15
|
+
│ └── decompressor.rb # Decompression wrapper
|
|
16
|
+
├── spec/
|
|
17
|
+
│ ├── spec_helper.rb # RSpec configuration
|
|
18
|
+
│ └── kore_fileformat_spec.rb # Comprehensive tests
|
|
19
|
+
├── ext/
|
|
20
|
+
│ └── kore_fileformat/
|
|
21
|
+
│ └── extconf.rb # Extension configuration (if building C wrapper)
|
|
22
|
+
├── Rakefile # Build tasks
|
|
23
|
+
├── kore-fileformat.gemspec # Gem configuration
|
|
24
|
+
└── README.md # This file
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Building & Installation
|
|
28
|
+
|
|
29
|
+
### Prerequisites
|
|
30
|
+
- Ruby 2.7 or later
|
|
31
|
+
- Bundler
|
|
32
|
+
- Native KORE library installed on system
|
|
33
|
+
|
|
34
|
+
### Build Commands
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
cd kore-fileformat-ruby
|
|
38
|
+
|
|
39
|
+
# Install dependencies
|
|
40
|
+
bundle install
|
|
41
|
+
|
|
42
|
+
# Run tests
|
|
43
|
+
bundle exec rspec spec/
|
|
44
|
+
|
|
45
|
+
# Build gem
|
|
46
|
+
gem build kore-fileformat.gemspec
|
|
47
|
+
|
|
48
|
+
# Install locally
|
|
49
|
+
gem install kore-fileformat-*.gem
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Usage
|
|
53
|
+
|
|
54
|
+
### Installing from RubyGems
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
gem install kore-fileformat
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### In Gemfile
|
|
61
|
+
|
|
62
|
+
```ruby
|
|
63
|
+
gem 'kore-fileformat'
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### Basic Usage
|
|
67
|
+
|
|
68
|
+
```ruby
|
|
69
|
+
require 'kore_fileformat'
|
|
70
|
+
|
|
71
|
+
# Compress data
|
|
72
|
+
original = "Hello World! " * 100
|
|
73
|
+
compressed = KoreFileFormat.compress(original)
|
|
74
|
+
puts "Compressed #{original.bytesize} bytes to #{compressed.bytesize} bytes"
|
|
75
|
+
|
|
76
|
+
# Decompress data
|
|
77
|
+
decompressed = KoreFileFormat.decompress(compressed)
|
|
78
|
+
puts "Matches original: #{decompressed == original}"
|
|
79
|
+
|
|
80
|
+
# With compression levels
|
|
81
|
+
fast = KoreFileFormat.compress_with_level(original, :fast)
|
|
82
|
+
balanced = KoreFileFormat.compress_with_level(original, :balanced)
|
|
83
|
+
maximum = KoreFileFormat.compress_with_level(original, :maximum)
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## API Reference
|
|
87
|
+
|
|
88
|
+
### `KoreFileFormat.compress(data)`
|
|
89
|
+
Compresses data using KORE compression with default (Balanced) level.
|
|
90
|
+
|
|
91
|
+
- **Parameters**:
|
|
92
|
+
- `data`: Input data (String or Bytes)
|
|
93
|
+
- **Returns**: Compressed data as String
|
|
94
|
+
- **Raises**: `ArgumentError`, `KoreFileFormat::CompressionError`
|
|
95
|
+
|
|
96
|
+
### `KoreFileFormat.compress_with_level(data, level = :balanced)`
|
|
97
|
+
Compresses data with specified compression level.
|
|
98
|
+
|
|
99
|
+
- **Parameters**:
|
|
100
|
+
- `data`: Input data (String or Bytes)
|
|
101
|
+
- `level`: Compression level (`:fast`, `:balanced`, `:maximum`)
|
|
102
|
+
- **Returns**: Compressed data as String
|
|
103
|
+
- **Raises**: `ArgumentError`, `KoreFileFormat::CompressionError`
|
|
104
|
+
|
|
105
|
+
### `KoreFileFormat.decompress(data)`
|
|
106
|
+
Decompresses KORE-compressed data.
|
|
107
|
+
|
|
108
|
+
- **Parameters**:
|
|
109
|
+
- `data`: Compressed data (String or Bytes)
|
|
110
|
+
- **Returns**: Decompressed data as String
|
|
111
|
+
- **Raises**: `ArgumentError`, `KoreFileFormat::CompressionError`
|
|
112
|
+
|
|
113
|
+
## Requirements
|
|
114
|
+
|
|
115
|
+
- Native library: `libkore_fileformat.so` (Linux), `libkore_fileformat.dylib` (macOS), `kore_fileformat.dll` (Windows)
|
|
116
|
+
- FFI gem (automatically installed as dependency)
|
|
117
|
+
- Ruby 2.7 or later
|
|
118
|
+
|
|
119
|
+
## Performance
|
|
120
|
+
|
|
121
|
+
- **Throughput**: 19.1 GB/s (verified)
|
|
122
|
+
- **Compression Ratio**: 42.1% (adaptive)
|
|
123
|
+
- **Metadata Latency**: <1ms
|
|
124
|
+
- **Supported Ruby**: 2.7, 3.0, 3.1, 3.2+
|
|
125
|
+
|
|
126
|
+
## Status
|
|
127
|
+
|
|
128
|
+
**v1.2.1** - Production Release
|
|
129
|
+
- ✅ Full FFI bindings
|
|
130
|
+
- ✅ 3 compression levels
|
|
131
|
+
- ✅ Cross-platform support
|
|
132
|
+
- ✅ Comprehensive test coverage
|
|
133
|
+
|
|
134
|
+
## Development
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
# Run tests in development
|
|
138
|
+
bundle exec rspec spec/ --verbose
|
|
139
|
+
|
|
140
|
+
# Run specific test file
|
|
141
|
+
bundle exec rspec spec/kore_fileformat_spec.rb
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
## Support
|
|
145
|
+
|
|
146
|
+
For issues, questions, or contributions, visit: https://github.com/arunkatherashala/Kore
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module KoreFileFormat
|
|
4
|
+
class Compressor
|
|
5
|
+
def initialize(level = :balanced)
|
|
6
|
+
@level = parse_level(level)
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def compress(data)
|
|
10
|
+
raise ArgumentError, "data cannot be nil" if data.nil?
|
|
11
|
+
|
|
12
|
+
data_bytes = data.is_a?(String) ? data.bytes : data
|
|
13
|
+
input = FFI::MemoryPointer.new(:uchar, data_bytes.length)
|
|
14
|
+
input.put_array_of_uchar(0, data_bytes)
|
|
15
|
+
|
|
16
|
+
output_size = (data_bytes.length * 1.5).to_i + 1024
|
|
17
|
+
output = FFI::MemoryPointer.new(:uchar, output_size)
|
|
18
|
+
compressed_size = FFI::MemoryPointer.new(:int)
|
|
19
|
+
|
|
20
|
+
result = Native.compress_data(
|
|
21
|
+
input, data_bytes.length,
|
|
22
|
+
output, output_size,
|
|
23
|
+
compressed_size,
|
|
24
|
+
@level
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
raise CompressionError, "Compression failed with code: #{result}" if result != 0
|
|
28
|
+
|
|
29
|
+
output.get_array_of_uchar(0, compressed_size.read_int).pack("c*")
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
private
|
|
33
|
+
|
|
34
|
+
def parse_level(level)
|
|
35
|
+
case level
|
|
36
|
+
when :fast
|
|
37
|
+
CompressionLevel::FAST
|
|
38
|
+
when :balanced
|
|
39
|
+
CompressionLevel::BALANCED
|
|
40
|
+
when :maximum
|
|
41
|
+
CompressionLevel::MAXIMUM
|
|
42
|
+
when Integer
|
|
43
|
+
level
|
|
44
|
+
else
|
|
45
|
+
raise ArgumentError, "Invalid compression level: #{level}"
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module KoreFileFormat
|
|
4
|
+
class Decompressor
|
|
5
|
+
def decompress(data)
|
|
6
|
+
raise ArgumentError, "data cannot be nil" if data.nil?
|
|
7
|
+
|
|
8
|
+
data_bytes = data.is_a?(String) ? data.bytes : data
|
|
9
|
+
input = FFI::MemoryPointer.new(:uchar, data_bytes.length)
|
|
10
|
+
input.put_array_of_uchar(0, data_bytes)
|
|
11
|
+
|
|
12
|
+
output_size = (data_bytes.length * 4).to_i
|
|
13
|
+
output = FFI::MemoryPointer.new(:uchar, output_size)
|
|
14
|
+
decompressed_size = FFI::MemoryPointer.new(:int)
|
|
15
|
+
|
|
16
|
+
result = Native.decompress_data(
|
|
17
|
+
input, data_bytes.length,
|
|
18
|
+
output, output_size,
|
|
19
|
+
decompressed_size
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
raise CompressionError, "Decompression failed with code: #{result}" if result != 0
|
|
23
|
+
|
|
24
|
+
output.get_array_of_uchar(0, decompressed_size.read_int).pack("c*")
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "ffi"
|
|
4
|
+
|
|
5
|
+
module KoreFileFormat
|
|
6
|
+
module Native
|
|
7
|
+
extend FFI::Library
|
|
8
|
+
|
|
9
|
+
begin
|
|
10
|
+
# Try multiple paths for the library
|
|
11
|
+
lib_name = case RUBY_PLATFORM
|
|
12
|
+
when /win32|mingw/
|
|
13
|
+
"kore_fileformat.dll"
|
|
14
|
+
when /linux/
|
|
15
|
+
"libkore_fileformat.so"
|
|
16
|
+
when /darwin/
|
|
17
|
+
"libkore_fileformat.dylib"
|
|
18
|
+
else
|
|
19
|
+
"kore_fileformat"
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Search in gem lib directory first, then system paths
|
|
23
|
+
lib_path = File.expand_path(lib_name, File.dirname(__FILE__) + "/../..")
|
|
24
|
+
if File.exist?(lib_path)
|
|
25
|
+
ffi_lib lib_path
|
|
26
|
+
else
|
|
27
|
+
ffi_lib lib_name
|
|
28
|
+
end
|
|
29
|
+
rescue LoadError => e
|
|
30
|
+
raise "Native KORE library not found. Error: #{e.message}"
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# C function declarations
|
|
34
|
+
attach_function :compress_data, :compress_data,
|
|
35
|
+
[:pointer, :int, :pointer, :int, :pointer, :int],
|
|
36
|
+
:int, blocking: true
|
|
37
|
+
|
|
38
|
+
attach_function :decompress_data, :decompress_data,
|
|
39
|
+
[:pointer, :int, :pointer, :int, :pointer],
|
|
40
|
+
:int, blocking: true
|
|
41
|
+
|
|
42
|
+
attach_function :get_version, :get_version,
|
|
43
|
+
[:pointer, :pointer, :pointer],
|
|
44
|
+
:int, blocking: true
|
|
45
|
+
end
|
|
46
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "kore_fileformat/version"
|
|
4
|
+
require_relative "kore_fileformat/native"
|
|
5
|
+
require_relative "kore_fileformat/compressor"
|
|
6
|
+
require_relative "kore_fileformat/decompressor"
|
|
7
|
+
|
|
8
|
+
module KoreFileFormat
|
|
9
|
+
class Error < StandardError; end
|
|
10
|
+
|
|
11
|
+
class CompressionError < Error; end
|
|
12
|
+
|
|
13
|
+
# Compress data with default settings (Balanced)
|
|
14
|
+
# @param data [String, Bytes] Data to compress
|
|
15
|
+
# @return [String] Compressed data
|
|
16
|
+
def self.compress(data)
|
|
17
|
+
compress_with_level(data, :balanced)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Compress data with specific level
|
|
21
|
+
# @param data [String, Bytes] Data to compress
|
|
22
|
+
# @param level [Symbol] Compression level (:fast, :balanced, :maximum)
|
|
23
|
+
# @return [String] Compressed data
|
|
24
|
+
def self.compress_with_level(data, level = :balanced)
|
|
25
|
+
Compressor.new(level).compress(data)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Decompress data
|
|
29
|
+
# @param data [String, Bytes] Compressed data
|
|
30
|
+
# @return [String] Decompressed data
|
|
31
|
+
def self.decompress(data)
|
|
32
|
+
Decompressor.new.decompress(data)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Compression levels
|
|
36
|
+
module CompressionLevel
|
|
37
|
+
FAST = 0
|
|
38
|
+
BALANCED = 1
|
|
39
|
+
MAXIMUM = 2
|
|
40
|
+
end
|
|
41
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: kore-fileformat
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 1.2.1
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Sai Arun Kumar Katherashala
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: bin
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2026-05-21 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: bundler
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - "~>"
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '2.0'
|
|
20
|
+
type: :development
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - "~>"
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: '2.0'
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
name: rake
|
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
|
30
|
+
requirements:
|
|
31
|
+
- - "~>"
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: '13.0'
|
|
34
|
+
type: :development
|
|
35
|
+
prerelease: false
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - "~>"
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: '13.0'
|
|
41
|
+
- !ruby/object:Gem::Dependency
|
|
42
|
+
name: rspec
|
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
|
44
|
+
requirements:
|
|
45
|
+
- - "~>"
|
|
46
|
+
- !ruby/object:Gem::Version
|
|
47
|
+
version: '3.0'
|
|
48
|
+
type: :development
|
|
49
|
+
prerelease: false
|
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
52
|
+
- - "~>"
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: '3.0'
|
|
55
|
+
- !ruby/object:Gem::Dependency
|
|
56
|
+
name: ffi
|
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
|
58
|
+
requirements:
|
|
59
|
+
- - "~>"
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: '1.15'
|
|
62
|
+
type: :runtime
|
|
63
|
+
prerelease: false
|
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
+
requirements:
|
|
66
|
+
- - "~>"
|
|
67
|
+
- !ruby/object:Gem::Version
|
|
68
|
+
version: '1.15'
|
|
69
|
+
description: |
|
|
70
|
+
KORE is a high-performance, multi-platform file compression format.
|
|
71
|
+
|
|
72
|
+
Key Features:
|
|
73
|
+
• 19.1 GB/s throughput (verified)
|
|
74
|
+
• 42.1% compression ratio
|
|
75
|
+
• <1ms metadata extraction
|
|
76
|
+
• Production-validated
|
|
77
|
+
• Ruby support with FFI bindings
|
|
78
|
+
email:
|
|
79
|
+
- arunkatherashala@gmail.com
|
|
80
|
+
executables: []
|
|
81
|
+
extensions: []
|
|
82
|
+
extra_rdoc_files: []
|
|
83
|
+
files:
|
|
84
|
+
- README.md
|
|
85
|
+
- lib/kore_fileformat.rb
|
|
86
|
+
- lib/kore_fileformat/compressor.rb
|
|
87
|
+
- lib/kore_fileformat/decompressor.rb
|
|
88
|
+
- lib/kore_fileformat/native.rb
|
|
89
|
+
- lib/kore_fileformat/version.rb
|
|
90
|
+
homepage: https://github.com/arunkatherashala/Kore
|
|
91
|
+
licenses:
|
|
92
|
+
- Apache-2.0
|
|
93
|
+
metadata: {}
|
|
94
|
+
post_install_message:
|
|
95
|
+
rdoc_options: []
|
|
96
|
+
require_paths:
|
|
97
|
+
- lib
|
|
98
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
99
|
+
requirements:
|
|
100
|
+
- - ">="
|
|
101
|
+
- !ruby/object:Gem::Version
|
|
102
|
+
version: '2.7'
|
|
103
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
104
|
+
requirements:
|
|
105
|
+
- - ">="
|
|
106
|
+
- !ruby/object:Gem::Version
|
|
107
|
+
version: '0'
|
|
108
|
+
requirements: []
|
|
109
|
+
rubygems_version: 3.4.19
|
|
110
|
+
signing_key:
|
|
111
|
+
specification_version: 4
|
|
112
|
+
summary: 'KORE: High-performance compression library'
|
|
113
|
+
test_files: []
|