yomikomu 0.3.0 → 0.4.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 +4 -4
- data/README.md +4 -0
- data/exe/kakidasu +2 -2
- data/lib/yomikomu.rb +174 -24
- data/lib/yomikomu/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6e1bcc1dbf78cadc55edd354c6a420358558e084
|
4
|
+
data.tar.gz: da90ed8f437df5aadbbb6b10b73e9f783b51b2aa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4a4b925c4c284dc225ad5d92905685d7ee48d5daad135acf05d5c2a89949023ae43fb52dbc50f3574ccda99e53eebd8ca73d7ad6b3c3c81bf56944c7b447a555
|
7
|
+
data.tar.gz: 0302472fcbb4dd4f0e78d040998ce0302df08e5debaef057cd9a5f8bd17c9e1adb12433c5f93fb4cc4bc29efb36aaa0a769253c132e844c40ee79266403aebda
|
data/README.md
CHANGED
@@ -31,9 +31,13 @@ You can use the following configuration with environment variables.
|
|
31
31
|
* YOMIKOMU_STORAGE (default: fs): choose storage type.
|
32
32
|
* 'fs' (default) stores binaries in the same directory (for examlple, `x.rb` will be compiled to `x.rb.yarb` in the same directory).
|
33
33
|
* 'fs2' stores binaries in specific directory.
|
34
|
+
* 'fsgz' stores files same as 'fs', but gz compressed.
|
35
|
+
* 'fs2gz' stores files same as 'fs2', but gz compressed.
|
34
36
|
* 'dbm' stores binaries using dbm
|
37
|
+
* 'flatfile' stores binaries in one flat file. Updating is not supported. Use with YOMIKOMU_AUTO_COMPILE.
|
35
38
|
* YOMIKOMU_STORAGE_DIR (default: "~/.ruby_binaries"): choose directory where binary files are stored.
|
36
39
|
* YOMIKOMU_AUTO_COMPILE (default: false): if this value is `true`, then compile all required scripts implicitly.
|
40
|
+
* YOMIKOMU_INFO (default: not defaind): show some information.
|
37
41
|
* YOMIKOMU_DEBUG (default: not defined): show many information.
|
38
42
|
|
39
43
|
### Compile and store instruction sequences
|
data/exe/kakidasu
CHANGED
@@ -2,6 +2,8 @@
|
|
2
2
|
|
3
3
|
$LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
|
4
4
|
|
5
|
+
require 'yomikomu'
|
6
|
+
require 'rbconfig'
|
5
7
|
require 'optparse'
|
6
8
|
|
7
9
|
verbose = false
|
@@ -37,8 +39,6 @@ executor = Proc.new{|file|
|
|
37
39
|
|
38
40
|
opts.parse!(ARGV)
|
39
41
|
|
40
|
-
require 'yomikomu'
|
41
|
-
require 'rbconfig'
|
42
42
|
paths = ARGV.empty? ? [RbConfig::CONFIG['libdir']] : ARGV
|
43
43
|
|
44
44
|
paths.each{|path|
|
data/lib/yomikomu.rb
CHANGED
@@ -3,22 +3,23 @@ require "yomikomu/version"
|
|
3
3
|
module Yomikomu
|
4
4
|
STATISTICS = Hash.new(0)
|
5
5
|
|
6
|
-
|
7
|
-
yomu_dir =
|
8
|
-
|
9
|
-
Dir.mkdir(yomu_dir)
|
6
|
+
def self.prefix
|
7
|
+
unless yomu_dir = ENV['YOMIKOMU_STORAGE_DIR']
|
8
|
+
yomu_dir = File.expand_path("~/.ruby_binaries")
|
10
9
|
end
|
10
|
+
Dir.mkdir(yomu_dir) unless File.exist?(yomu_dir)
|
11
|
+
"#{yomu_dir}/cb."
|
11
12
|
end
|
12
|
-
|
13
|
+
|
13
14
|
YOMIKOMU_AUTO_COMPILE = ENV['YOMIKOMU_AUTO_COMPILE'] == 'true'
|
14
15
|
YOMIKOMU_USE_MMAP = ENV['YOMIKOMU_USE_MMAP']
|
15
16
|
|
16
17
|
def self.status
|
17
18
|
STDERR.puts "[YOMIKOMU:INFO] (pid:#{Process.pid}) " +
|
18
|
-
::Yomikomu::STATISTICS.map{|k, v| "#{k}: #{v}"}.join('
|
19
|
+
::Yomikomu::STATISTICS.map{|k, v| "#{k}: #{v}"}.join(', ')
|
19
20
|
end
|
20
21
|
|
21
|
-
if $VERBOSE
|
22
|
+
if $VERBOSE || ENV['YOMIKOMU_INFO'] == 'true'
|
22
23
|
def self.info
|
23
24
|
STDERR.puts "[YOMIKOMU:INFO] (pid:#{Process.pid}) #{yield}"
|
24
25
|
end
|
@@ -74,14 +75,18 @@ module Yomikomu
|
|
74
75
|
"SHA-1:#{::Digest::SHA1.file(fname).digest}"
|
75
76
|
end
|
76
77
|
|
77
|
-
def compile_and_store_iseq fname, iseq_key = iseq_key_name(fname)
|
78
|
-
::Yomikomu::STATISTICS[:compiled] += 1
|
78
|
+
def compile_and_store_iseq fname, iseq_key = iseq_key_name(fname = File.expand_path(fname))
|
79
79
|
::Yomikomu.debug{ "compile #{fname} into #{iseq_key}" }
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
80
|
+
begin
|
81
|
+
iseq = RubyVM::InstructionSequence.compile_file(fname)
|
82
|
+
binary = iseq.to_binary(extra_data(fname))
|
83
|
+
write_compiled_iseq(fname, iseq_key, binary)
|
84
|
+
::Yomikomu::STATISTICS[:compiled] += 1
|
85
|
+
iseq
|
86
|
+
rescue SyntaxError, RuntimeError => e
|
87
|
+
puts "#{e}: #{fname}"
|
88
|
+
nil
|
89
|
+
end
|
85
90
|
end
|
86
91
|
|
87
92
|
# def remove_compiled_iseq fname; nil; end # should implement at sub classes
|
@@ -102,11 +107,6 @@ module Yomikomu
|
|
102
107
|
class FSStorage < BasicStorage
|
103
108
|
def initialize
|
104
109
|
super
|
105
|
-
require 'fileutils'
|
106
|
-
@dir = YOMIKOMU_PREFIX + "files"
|
107
|
-
unless File.directory?(@dir)
|
108
|
-
FileUtils.mkdir_p(@dir)
|
109
|
-
end
|
110
110
|
end
|
111
111
|
|
112
112
|
def remove_compiled_iseq fname
|
@@ -144,7 +144,21 @@ module Yomikomu
|
|
144
144
|
end
|
145
145
|
end
|
146
146
|
|
147
|
+
class FSSGZtorage < FSStorage
|
148
|
+
|
149
|
+
end
|
150
|
+
|
147
151
|
class FS2Storage < FSStorage
|
152
|
+
def initialize
|
153
|
+
super
|
154
|
+
|
155
|
+
require 'fileutils'
|
156
|
+
@dir = Yomikomu.prefix + "files"
|
157
|
+
unless File.directory?(@dir)
|
158
|
+
FileUtils.mkdir_p(@dir)
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
148
162
|
def iseq_key_name fname
|
149
163
|
File.join(@dir, fname.gsub(/[^A-Za-z0-9\._-]/){|c| '%02x' % c.ord} + '.yarb') # special directory
|
150
164
|
end
|
@@ -157,6 +171,37 @@ module Yomikomu
|
|
157
171
|
end
|
158
172
|
end
|
159
173
|
|
174
|
+
module GZFileStorage
|
175
|
+
def initialize
|
176
|
+
require 'zlib'
|
177
|
+
super
|
178
|
+
end
|
179
|
+
|
180
|
+
def iseq_key_name fname
|
181
|
+
super + '.gz'
|
182
|
+
end
|
183
|
+
|
184
|
+
def read_compiled_iseq fname, iseq_key
|
185
|
+
Zlib::GzipReader.open(iseq_key){|f|
|
186
|
+
f.read
|
187
|
+
}
|
188
|
+
end
|
189
|
+
|
190
|
+
def write_compiled_iseq fname, iseq_key, binary
|
191
|
+
Zlib::GzipWriter.open(iseq_key){|f|
|
192
|
+
f.write(binary)
|
193
|
+
}
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
class FSGZStorage < FSStorage
|
198
|
+
include GZFileStorage
|
199
|
+
end
|
200
|
+
|
201
|
+
class FS2GZStorage < FS2Storage
|
202
|
+
include GZFileStorage
|
203
|
+
end
|
204
|
+
|
160
205
|
if YOMIKOMU_USE_MMAP
|
161
206
|
require 'mmapped_string'
|
162
207
|
Yomikomu.info{ "[RUBY_YOMIKOMU] use mmap" }
|
@@ -178,8 +223,9 @@ module Yomikomu
|
|
178
223
|
|
179
224
|
class DBMStorage < BasicStorage
|
180
225
|
def initialize
|
226
|
+
super
|
181
227
|
require 'dbm'
|
182
|
-
@db = DBM.open(
|
228
|
+
@db = DBM.open(Yomikomu.prefix + 'db')
|
183
229
|
end
|
184
230
|
|
185
231
|
def remove_compiled_iseq fname
|
@@ -218,6 +264,100 @@ module Yomikomu
|
|
218
264
|
end
|
219
265
|
end
|
220
266
|
|
267
|
+
class FlatFileStorage < BasicStorage
|
268
|
+
def index_path
|
269
|
+
Yomikomu.prefix + 'ff_index'
|
270
|
+
end
|
271
|
+
|
272
|
+
def data_path
|
273
|
+
Yomikomu.prefix + 'ff_data'
|
274
|
+
end
|
275
|
+
|
276
|
+
def initialize
|
277
|
+
super
|
278
|
+
require 'fileutils'
|
279
|
+
|
280
|
+
@updated = false
|
281
|
+
|
282
|
+
if File.exist?(index_path)
|
283
|
+
open(index_path, 'rb'){|f| @index = Marshal.load(f)}
|
284
|
+
else
|
285
|
+
@index = {}
|
286
|
+
open(data_path, 'w'){} # touch
|
287
|
+
end
|
288
|
+
|
289
|
+
@data_file = open(data_path, 'a+b')
|
290
|
+
|
291
|
+
at_exit{
|
292
|
+
if @updated
|
293
|
+
open(index_path, 'wb'){|f| Marshal.dump(@index, f)}
|
294
|
+
Yomikomu.info{'FlatFile: update'}
|
295
|
+
end
|
296
|
+
}
|
297
|
+
end
|
298
|
+
|
299
|
+
def remove_compiled_iseq fname
|
300
|
+
raise 'unsupported'
|
301
|
+
end
|
302
|
+
|
303
|
+
private
|
304
|
+
|
305
|
+
def compiled_iseq_exist? fname, iseq_key
|
306
|
+
@index[iseq_key]
|
307
|
+
end
|
308
|
+
|
309
|
+
def compiled_iseq_is_younger? fname, iseq_key
|
310
|
+
offset, size, date = @index[iseq_key]
|
311
|
+
date.to_i >= File.mtime(fname).to_i
|
312
|
+
end
|
313
|
+
|
314
|
+
def read_compiled_iseq fname, iseq_key
|
315
|
+
offset, size, date = @index[iseq_key]
|
316
|
+
@data_file.pos = offset
|
317
|
+
binary = @data_file.read(size)
|
318
|
+
raise "size is not match" if binary.size != size
|
319
|
+
binary
|
320
|
+
end
|
321
|
+
|
322
|
+
def write_compiled_iseq fname, iseq_key, binary
|
323
|
+
raise "compiled binary for #{fname} already exists. flatfile does not support overwrite." if compiled_iseq_exist?(fname, iseq_key)
|
324
|
+
|
325
|
+
@data_file.seek 0, IO::SEEK_END
|
326
|
+
offset = @data_file.tell
|
327
|
+
size = binary.size
|
328
|
+
date = Time.now.to_i
|
329
|
+
@data_file.write(binary)
|
330
|
+
@index[iseq_key] = [offset, size, date]
|
331
|
+
|
332
|
+
@updated = true
|
333
|
+
end
|
334
|
+
end
|
335
|
+
|
336
|
+
class FlatFileGZStorage < FlatFileStorage
|
337
|
+
def index_path
|
338
|
+
super + '_gz'
|
339
|
+
end
|
340
|
+
|
341
|
+
def data_path
|
342
|
+
super + '_gz'
|
343
|
+
end
|
344
|
+
|
345
|
+
def initialize
|
346
|
+
super
|
347
|
+
require 'zlib'
|
348
|
+
end
|
349
|
+
|
350
|
+
def read_compiled_iseq fname, iseq_key
|
351
|
+
binary = super
|
352
|
+
Zlib::Inflate.inflate(binary)
|
353
|
+
end
|
354
|
+
|
355
|
+
def write_compiled_iseq fname, iseq_key, binary
|
356
|
+
binary = Zlib::Deflate.deflate(binary)
|
357
|
+
super(fname, iseq_key, binary)
|
358
|
+
end
|
359
|
+
end
|
360
|
+
|
221
361
|
def self.compile_and_store_iseq fname
|
222
362
|
STORAGE.compile_and_store_iseq fname
|
223
363
|
end
|
@@ -235,17 +375,27 @@ module Yomikomu
|
|
235
375
|
end
|
236
376
|
|
237
377
|
# select storage
|
238
|
-
STORAGE = case ENV['YOMIKOMU_STORAGE']
|
239
|
-
when 'dbm'
|
240
|
-
DBMStorage.new
|
378
|
+
STORAGE = case storage = ENV['YOMIKOMU_STORAGE']
|
241
379
|
when 'fs'
|
242
380
|
FSStorage.new
|
381
|
+
when 'fsgz'
|
382
|
+
FSGZStorage.new
|
243
383
|
when 'fs2'
|
244
384
|
FS2Storage.new
|
385
|
+
when 'fs2gz'
|
386
|
+
FS2GZStorage.new
|
387
|
+
when 'dbm'
|
388
|
+
DBMStorage.new
|
389
|
+
when 'flatfile'
|
390
|
+
FlatFileStorage.new
|
391
|
+
when 'flatfilegz'
|
392
|
+
FlatFileGZStorage.new
|
245
393
|
when 'null'
|
246
394
|
NullStorage.new
|
247
|
-
|
395
|
+
when nil
|
248
396
|
FSStorage.new
|
397
|
+
else
|
398
|
+
raise "Unknown storage type: #{storage}"
|
249
399
|
end
|
250
400
|
|
251
401
|
Yomikomu.info{ "[RUBY_YOMIKOMU] use #{STORAGE.class}" }
|
data/lib/yomikomu/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: yomikomu
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Koichi Sasada
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-05-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: mmapped_string
|
@@ -120,7 +120,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
120
120
|
version: '0'
|
121
121
|
requirements: []
|
122
122
|
rubyforge_project:
|
123
|
-
rubygems_version: 2.6.
|
123
|
+
rubygems_version: 2.6.4
|
124
124
|
signing_key:
|
125
125
|
specification_version: 4
|
126
126
|
summary: Dump compiled iseq by binary (kakidasu) and load binary (yomidasu).
|