mspack_rb 0.1.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 9b07279e9c4e97916854a86935c3e76358e6c0aa
4
+ data.tar.gz: 58541deec596d6386c6a7899ade3d0497964d095
5
+ SHA512:
6
+ metadata.gz: 36db54a01cc0b420f6ecd1907a44a4294948d591a67d625647060db8ed4f7d0ec85ce29940c202b743cd7c8ea4076bea6b79fd66235d24bceb76dcf761a3bb45
7
+ data.tar.gz: 4bf5a16eef7b01be7ebacd12b3638127b3702598fe054212008cc2e0d433586cf893cbb7b28a12d772201eb8ba24deee6b6274642743bd9b20c11aa11cb4e1df
data/.gitignore ADDED
@@ -0,0 +1,10 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ /lib/mspack/mspack.bundle
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ sudo: false
2
+ language: ruby
3
+ rvm:
4
+ - 2.3.1
5
+ before_install: gem install bundler -v 1.13.6
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in mspack_rb.gemspec
4
+ gemspec
data/Guardfile ADDED
@@ -0,0 +1,6 @@
1
+ guard :rspec, cmd: 'rspec' do
2
+ watch(%r{^spec/.+_spec\.rb$})
3
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
4
+ watch('spec/spec_helper.rb') { "spec" }
5
+ watch(%r{^ext/(.+)$})
6
+ end
data/README.md ADDED
@@ -0,0 +1,21 @@
1
+ # MspackRb
2
+
3
+ ### A simple Ruby native extension gem wrapper for [libmspack](https://www.cabextract.org.uk/libmspack/)
4
+
5
+ Requires libmspack to be installed.
6
+
7
+ Currently, only (very) basic CHM extraction has been implemented.
8
+
9
+ ### Usage:
10
+ require 'mspack_rb'
11
+
12
+ dcom = Mspack::ChmDecompressor.new
13
+ header = dcom.open('path/to/a/chm/file')
14
+ file = header.files
15
+ out_dir = 'some/output/directory'
16
+
17
+ while !file.nil?
18
+ out_path = "#{out_dir}/#{file.filename}"
19
+ dcom.extract(file, out_path)
20
+ file = file.next
21
+ end
data/Rakefile ADDED
@@ -0,0 +1,11 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rake/extensiontask'
3
+ require 'rspec/core/rake_task'
4
+
5
+ Rake::ExtensionTask.new 'mspack' do |ext|
6
+ ext.lib_dir = 'lib/mspack'
7
+ end
8
+
9
+ RSpec::Core::RakeTask.new(:spec)
10
+
11
+ task default: [ :compile, :spec ]
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "mspack_rb"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,25 @@
1
+ require 'mkmf'
2
+
3
+ LIB_NAME = 'mspack'
4
+
5
+ LIB_FUNCTION = 'mspack_version'
6
+
7
+ HEADER_DIRS = [
8
+ '/usr/local/include', # homebrew / from source
9
+ RbConfig::CONFIG['includedir'], # ruby install locations
10
+ '/usr/include' # fallback
11
+ ]
12
+
13
+ LIB_DIRS = [
14
+ '/usr/local/lib', # homebrew / from source
15
+ RbConfig::CONFIG['libdir'], # ruby install locations
16
+ '/usr/lib' # fallback
17
+ ]
18
+
19
+ dir_config(LIB_NAME, HEADER_DIRS, LIB_DIRS)
20
+
21
+ unless find_header("#{LIB_NAME}.h") && find_library(LIB_NAME, LIB_FUNCTION)
22
+ abort "lib#{LIB_NAME} not found"
23
+ end
24
+
25
+ create_makefile(LIB_NAME)
@@ -0,0 +1,113 @@
1
+ #include <mspack.h>
2
+ #include <ruby.h>
3
+
4
+ VALUE Mspack = Qnil;
5
+ VALUE ChmDecom = Qnil;
6
+ VALUE ChmDHeader = Qnil;
7
+ VALUE ChmDFile = Qnil;
8
+
9
+ VALUE mspack_test() {
10
+ int result;
11
+ MSPACK_SYS_SELFTEST(result);
12
+ return result == MSPACK_ERR_OK ? Qtrue : Qfalse;
13
+ }
14
+
15
+ void chmd_deallocate(void *decom) {
16
+ mspack_destroy_chm_decompressor(decom);
17
+ }
18
+
19
+ static VALUE chmd_allocate(VALUE self) {
20
+ struct mschm_decompressor *decom = mspack_create_chm_decompressor(NULL);
21
+ return Data_Wrap_Struct(self, NULL, chmd_deallocate, decom);
22
+ }
23
+
24
+ static VALUE chmd_open(VALUE self, VALUE path) {
25
+ struct mschm_decompressor *decom;
26
+ Data_Get_Struct(self, struct mschm_decompressor, decom);
27
+ struct mschmd_header *header = decom->open(decom, StringValueCStr(path));
28
+
29
+ if (!header) {
30
+ return Qnil;
31
+ }
32
+
33
+ VALUE headerObj = rb_obj_alloc(ChmDHeader);
34
+ rb_obj_call_init(headerObj, 0, NULL);
35
+ return Data_Wrap_Struct(ChmDHeader, NULL, NULL, header);
36
+ }
37
+
38
+ static VALUE chmd_close(VALUE self, VALUE header) {
39
+ struct mschm_decompressor *decom;
40
+ Data_Get_Struct(self, struct mschm_decompressor, decom);
41
+
42
+ struct mschmd_header *headerPtr;
43
+ Data_Get_Struct(header, struct mschmd_header, headerPtr);
44
+
45
+ decom->close(decom, headerPtr);
46
+ return Qnil;
47
+ }
48
+
49
+ static VALUE chmd_extract(VALUE self, VALUE file, VALUE outputPath) {
50
+ struct mschm_decompressor *decom;
51
+ Data_Get_Struct(self, struct mschm_decompressor, decom);
52
+
53
+ struct mschmd_file *filePtr;
54
+ Data_Get_Struct(file, struct mschmd_file, filePtr);
55
+
56
+ const char *pathStr = StringValueCStr(outputPath);
57
+ return decom->extract(decom, filePtr, pathStr) == MSPACK_ERR_OK ?
58
+ Qtrue : Qfalse;
59
+ }
60
+
61
+ static VALUE chmd_header_filename(VALUE self) {
62
+ struct mschmd_header *header;
63
+ Data_Get_Struct(self, struct mschmd_header, header);
64
+ return rb_str_new2(header->filename);
65
+ }
66
+
67
+ static VALUE chmd_header_files(VALUE self) {
68
+ struct mschmd_header *header;
69
+ Data_Get_Struct(self, struct mschmd_header, header);
70
+
71
+ VALUE fileObj = rb_obj_alloc(ChmDFile);
72
+ rb_obj_call_init(fileObj, 0, NULL);
73
+ return Data_Wrap_Struct(ChmDFile, NULL, NULL, header->files);
74
+ }
75
+
76
+ static VALUE chmd_file_filename(VALUE self) {
77
+ struct mschmd_file *file;
78
+ Data_Get_Struct(self, struct mschmd_file, file);
79
+ return rb_str_new2(file->filename);
80
+ }
81
+
82
+ static VALUE chmd_file_next(VALUE self) {
83
+ struct mschmd_file *file;
84
+ Data_Get_Struct(self, struct mschmd_file, file);
85
+ struct mschmd_file *next = file->next;
86
+
87
+ if (next == NULL) {
88
+ return Qnil;
89
+ }
90
+
91
+ VALUE nextObj = rb_obj_alloc(ChmDFile);
92
+ rb_obj_call_init(nextObj, 0, NULL);
93
+ return Data_Wrap_Struct(ChmDFile, NULL, NULL, next);
94
+ }
95
+
96
+ void Init_mspack() {
97
+ Mspack = rb_define_module("Mspack");
98
+ rb_define_singleton_method(Mspack, "test", mspack_test, 0);
99
+
100
+ ChmDecom = rb_define_class_under(Mspack, "ChmDecompressor", rb_cObject);
101
+ rb_define_alloc_func(ChmDecom, chmd_allocate);
102
+ rb_define_method(ChmDecom, "open", chmd_open, 1);
103
+ rb_define_method(ChmDecom, "close", chmd_close, 1);
104
+ rb_define_method(ChmDecom, "extract", chmd_extract, 2);
105
+
106
+ ChmDHeader = rb_define_class_under(ChmDecom, "Header", rb_cObject);
107
+ rb_define_method(ChmDHeader, "filename", chmd_header_filename, 0);
108
+ rb_define_method(ChmDHeader, "files", chmd_header_files, 0);
109
+
110
+ ChmDFile = rb_define_class_under(ChmDecom, "File", rb_cObject);
111
+ rb_define_method(ChmDFile, "filename", chmd_file_filename, 0);
112
+ rb_define_method(ChmDFile, "next", chmd_file_next, 0);
113
+ }
@@ -0,0 +1,3 @@
1
+ module Mspack
2
+ VERSION = "0.1.0"
3
+ end
data/lib/mspack.rb ADDED
@@ -0,0 +1,12 @@
1
+ require "mspack/mspack"
2
+ require "mspack/version"
3
+
4
+ module Mspack
5
+ class ChmDecompressor
6
+ class Header
7
+ end
8
+
9
+ class File
10
+ end
11
+ end
12
+ end
data/mspack.gemspec ADDED
@@ -0,0 +1,31 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'mspack/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "mspack_rb"
8
+ spec.version = Mspack::VERSION
9
+ spec.authors = ["Ben Williams"]
10
+ spec.email = ["8enwilliams@gmail.com"]
11
+
12
+ spec.summary = 'A ruby gem wrapper for libmspack'
13
+ spec.description = 'A ruby gem wrapper for libmspack'
14
+ spec.homepage = 'https://github.com/benjineering/mspack_rb'
15
+
16
+ spec.metadata['allowed_push_host'] = 'https://rubygems.org'
17
+
18
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
19
+ f.match(%r{^(test|spec|features)/})
20
+ end
21
+ spec.bindir = "exe"
22
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
23
+ spec.require_paths = ["lib"]
24
+ spec.extensions << 'ext/mspack/extconf.rb'
25
+
26
+ spec.add_development_dependency "bundler", "~> 1.13"
27
+ spec.add_development_dependency "rake", "~> 10.0"
28
+ spec.add_development_dependency "rake-compiler", "~> 1.0"
29
+ spec.add_development_dependency "rspec", "~> 3.0"
30
+ spec.add_development_dependency "guard-rspec", "~> 4.7"
31
+ end
metadata ADDED
@@ -0,0 +1,129 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mspack_rb
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Ben Williams
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2017-03-01 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: '1.13'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.13'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake-compiler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: guard-rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '4.7'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '4.7'
83
+ description: A ruby gem wrapper for libmspack
84
+ email:
85
+ - 8enwilliams@gmail.com
86
+ executables: []
87
+ extensions:
88
+ - ext/mspack/extconf.rb
89
+ extra_rdoc_files: []
90
+ files:
91
+ - ".gitignore"
92
+ - ".rspec"
93
+ - ".travis.yml"
94
+ - Gemfile
95
+ - Guardfile
96
+ - README.md
97
+ - Rakefile
98
+ - bin/console
99
+ - bin/setup
100
+ - ext/mspack/extconf.rb
101
+ - ext/mspack/mspack.c
102
+ - lib/mspack.rb
103
+ - lib/mspack/version.rb
104
+ - mspack.gemspec
105
+ homepage: https://github.com/benjineering/mspack_rb
106
+ licenses: []
107
+ metadata:
108
+ allowed_push_host: https://rubygems.org
109
+ post_install_message:
110
+ rdoc_options: []
111
+ require_paths:
112
+ - lib
113
+ required_ruby_version: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ required_rubygems_version: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - ">="
121
+ - !ruby/object:Gem::Version
122
+ version: '0'
123
+ requirements: []
124
+ rubyforge_project:
125
+ rubygems_version: 2.5.1
126
+ signing_key:
127
+ specification_version: 4
128
+ summary: A ruby gem wrapper for libmspack
129
+ test_files: []