bin/oak in oak-0.4.1 vs bin/oak in oak-0.4.2

- old
+ new

@@ -1,245 +1 @@ -#!/usr/bin/env ruby -# -# oak.rb: cli driver for encoding strings in the OAK format. -# -# author: jhw@prosperworks.com -# incept: 2016-03-05 -# - -require_relative '../lib/oak.rb' -require 'optimist' - -OLD_ARGV = ARGV.dup # ARGV is consumed by Optimist but we use later. -OPTS = Optimist.options do - banner "#{$0} cli driver for OAK" - banner <<-OPTIMIST_EXAMPLES -Examples: - $ echo hello | bin/oak.rb - oak_3CNB_1944283675_15_RjFTVTVfaGVsbG8_ok - $ (echo hello ; echo world) | bin/oak.rb - oak_3CNB_1944283675_15_RjFTVTVfaGVsbG8_ok - oak_3CNB_2139413982_15_RjFTVTVfd29ybGQ_ok - $ (echo hello ; echo world) | bin/oak.rb --compression zlib --force - oak_3CZB_1944283675_26_eJxzMwwONY3PSM3JyQcAFF4DyA_ok - oak_3CZB_2139413982_26_eJxzMwwONY0vzy_KSQEAFNgD3A_ok - $ (echo hello ; echo world) | bin/oak.rb --format none - oak_3CNN_1944283675_11_F1SU5_hello_ok - oak_3CNN_2139413982_11_F1SU5_world_ok - $ (echo hello ; echo world) | bin/oak.rb | bin/oak.rb --mode decode-lines - hello - world -OPTIMIST_EXAMPLES - banner "Options:" - version "#{$0} #{OAK::VERSION}" - opt :redundancy, 'redundancy', :default => 'crc32' - opt :format, 'format', :default => 'base64' - opt :compression, 'compression', :default => 'none' - opt :force, 'compress even if bigger', :default => false - opt :mode, 'mode', :default => 'encode-lines' - opt :key_chain, 'key chain env name', :type => :string - opt :key, 'encrypt key name', :type => :string - opt :key_check, 'check available keys', :default => false - opt :key_generate, 'generate new key', :default => false - opt :force_oak_4, 'force OAK_4 even unencrypted', :default => false - opt :eigen, 'calc eigenratio', :type => :int - opt :self_test, 'self-test only', :default => false - opt :help, 'show this help' -end -Optimist::die :eigen, "must be non-negative" if OPTS[:eigen] && OPTS[:eigen] < 0 - -oak_opts = {} -oak_opts[:redundancy] = OPTS[:redundancy] -oak_opts[:compression] = OPTS[:compression] -oak_opts[:force] = OPTS[:force] -oak_opts[:format] = OPTS[:format] -oak_opts[:key_chain] = OAK.parse_env_chain(ENV,OPTS[:key_chain]) -oak_opts[:key] = OPTS[:key] -oak_opts[:force_oak_4] = OPTS[:force_oak_4] - -if !OAK::REDUNDANCY_2_CODE.keys.include?(oak_opts[:redundancy]) - Optimist::die :redundancy, "bogus #{OPTS[:redundancy]}" -end -if !OAK::COMPRESSION_2_CODE.keys.include?(oak_opts[:compression]) - Optimist::die :compression, "bogus #{OPTS[:compression]}" -end -cool_formats = OAK::FORMAT_2_CODE.keys -if !cool_formats.include?(oak_opts[:format]) - Optimist::die :format, "bogus #{OPTS[:format]} not in #{cool_formats}" -end - -=begin - -doctest: simple transcoding ->> OAK::decode(OAK::encode([1,"2",3.000001])) -=> [1,"2",3.000001] ->> OAK::decode(OAK::encode({foo: "bar"})) -=> {foo: "bar"} ->> OAK::decode(OAK::encode({foo: :bar})) -=> {foo: :bar} ->> OAK::decode(OAK::encode("Hello, World!")) -=> "Hello, World!" ->> OAK::decode(OAK::encode("Hello, World!", format: :none, redundancy: :none)) -=> "Hello, World!" - -doctest: stability of encoding ->> OAK::decode("oak_3NNB_0_30_RjNIMV8xXzJZQTNfZm9vU1UzX2Jhcg_ok") -=> {:foo=>"bar"} ->> OAK::encode(1, format: :base64, redundancy: :none) -=> "oak_3NNB_0_6_RjFJMQ_ok" ->> OAK::encode(1, format: :base64, redundancy: :crc32) -=> "oak_3CNB_3405226796_6_RjFJMQ_ok" ->> OAK::encode(1, format: :none, redundancy: :crc32) -=> "oak_3CNN_3405226796_4_F1I1_ok" ->> hello_utf8 = "Hello, World!".force_encoding('UTF-8') -=> "Hello, World!" ->> OAK::encode(hello_utf8, format: :base64, redundancy: :none) -=> "oak_3NNB_0_27_RjFTVTEzX0hlbGxvLCBXb3JsZCE_ok" ->> OAK::encode(hello_utf8, format: :none, redundancy: :crc32) -=> "oak_3CNN_2351984628_20_F1SU13_Hello, World!_ok" - -Note above I used force_encoding('UTF-8') after discovering that with -Ruby 2.1.6 on Mac I get Encoding.default_encoding is UTF-8, but with -Ruby 2.1.6 on Linux I get Encoding.default_encoding is US-ASCII! - -=end - -if __FILE__ == $0 - if OPTS[:self_test] - require 'rubydoctest' - exit RubyDocTest::Runner.new(File.read(__FILE__), __FILE__).run ? 0 : 1 - end - if OPTS[:key_check] - if !OPTS[:key_chain] - puts "no --key-chain specified" - else - keys = oak_opts[:key_chain].keys.keys - if 0 == keys.size - puts "#{OPTS[:key_chain]}: no keys found" - else - puts "#{OPTS[:key_chain]}: found keys: #{keys.join(' ')}" - end - end - end - if OPTS[:key_generate] - STDOUT.puts OAK.encode(OAK.random_key) - exit 0 - end - if !$stdin.tty? - if OPTS[:eigen] - prev = STDIN.read - puts "input: %d" % prev.size - OPTS[:eigen].times do |i| - oak = OAK.encode(prev,oak_opts) - psize = prev.size - wsize = oak.size - ratio = 1.0 * wsize / psize - puts " iter %3d: %4d => %4d ratio %.2f" % [i,psize,wsize,ratio] - prev = oak - end - exit 0 - end - unhappiness = 0 - case OPTS[:mode] - when 'cat' - ARGF.each_line.map(&:strip).each do |line| - puts line - end - when 'encode-lines' - ARGF.each_line.map(&:strip).each do |line| - puts OAK.encode(line,oak_opts) - end - when 'decode-lines' - ARGF.each_line.map(&:strip).each do |line| - puts OAK.decode(line,oak_opts) - end - when 'encode-file' - puts OAK.encode(STDIN.read,oak_opts) - when 'decode-file' - STDOUT.write OAK.decode(STDIN.read.strip,oak_opts) - when 'recode-file' - puts OAK.encode(OAK.decode(STDIN.read,oak_opts),oak_opts) - when 'crazy' - # - # --mode crazy prints out a sample of OAK strings for various - # challenging cases. - # - cycle_a = ['cycle_a','TBD'] - cycle_b = ['cycle_b',cycle_a] - cycle_a[1] = cycle_b - dag_c = ['dag_c'] - dag_b = ['dag_b',dag_c] - dag_a = ['dag_a',dag_b,dag_c] - [ - 'hello', - ['hello'] + ['hello',:hello] * 2, - {1=>'a','b'=>2,[]=>3,''=>4,{}=>5,nil=>6}, - ['x','x','x','x','x','x','x','x','x','x','x','x','x'], - ['x'] * 13, - cycle_a, - dag_a, - [1,-123,0.12,-0.123,Float::NAN,-Float::INFINITY,3.14159265358979], - ].each do |obj| - oak = OAK.encode( - obj, - redundancy: :crc32, - format: :none, - compression: :none, - ) - puts "" - puts "obj: #{obj}" - puts " oak: #{oak}" - begin - dec = OAK.decode(oak,oak_opts) - if dec != obj - if !dec.is_a?(Float) && !enc.is_a?(Float) && !dec.nan? && !enc.nan? - unhappiness += 1 - puts " BAD: #{dec}" - end - end - rescue OAK::CantTouchThisStringError => ex - puts " BAD: #{ex.message}: #{ex.backtrace_locations[0]}" - unhappiness += 1 - end - end - when 'tests' - [ - [1,2,3], - {:foo=>'foo','foo'=>['x']*10}, - -1, - Float::NAN, - nil, - ].each do |obj| - puts " #{obj} => [" - key_chain = OAK::KeyChain.new( - { 'l0ng3r' => OAK::Key.new('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx') } - ) - [ - {redundancy: :none, format: :none, compression: :none }, - {redundancy: :none, format: :base64,compression: :lz4, force: true}, - {redundancy: :crc32,format: :base64,compression: :zlib, force: true}, - {redundancy: :crc32,format: :base64,compression: :bzip2,force: true}, - {redundancy: :sha1, format: :base64,compression: :lzma, force: true}, - {key_chain: key_chain,force_oak_4: true,format: :none, }, - {key_chain: key_chain,force_oak_4: true, }, - {key_chain: key_chain,key: 'l0ng3r', }, - ].each do |opts| - oak = OAK.encode(obj,opts) - puts " '#{oak}'," - dec = OAK.decode(oak,opts) - if dec != obj - if !dec.is_a?(Float) && !enc.is_a?(Float) && !dec.nan? && !enc.nan? - unhappiness += 1 - end - end - end - puts " ]," - end - else - Optimist::die :mode, "bogus mode #{OPTS[:mode]}" - end - if unhappiness > 0 - puts "unhappiness: #{unhappiness}" - end - exit unhappiness - end -end \ No newline at end of file