monkey-hash 1.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 3744b8367a8403e91db82ac34fde2bd37d1e2db0eff1ef31a85e12273000be3f
4
+ data.tar.gz: 570f07b507623129d1ac05ded669c7943419c9d2fcc3936134cae2d57243020f
5
+ SHA512:
6
+ metadata.gz: 8eaec6b817e5d66f0fd0161acca6c1fa1367269db20255f80c6d340f5f9d9698191f0b853e143fd0d5acb4d9750f97cf9c5be7a9d0ab3c041df4df6aace3e99c
7
+ data.tar.gz: '0842fbca99d64c0197b3a5776f56b92cb521e592815261524597cd84d292ad96d3c7fdfa3a5d6adbbb7eabbd6387c76719c55738df0aeb165b4b01b55c20d2ac'
data/lib/amqproto.rb ADDED
@@ -0,0 +1,5 @@
1
+ module AMQProto
2
+ def self.correlation_id
3
+ (Time.now.to_f * 1000000).to_i.to_s.freeze
4
+ end
5
+ end
data/lib/array.rb ADDED
@@ -0,0 +1,25 @@
1
+ class Array
2
+ alias :super_include? :include?
3
+ alias :present? :any?
4
+
5
+ def include?(*list)
6
+ list.count == 1 ? super_include?(list.first) : ( self & list ).count == list.count
7
+ end
8
+
9
+ def include_one?( *list )
10
+ (self & list).count > 0
11
+ end
12
+
13
+ def symbolize_hashes
14
+ z = []
15
+ self.each do |i|
16
+ z << case i
17
+ when Array then i.symbolize_hashes
18
+ when Hash then i.keys_to_symbols
19
+ else
20
+ Marshal.load(Marshal.dump(i))
21
+ end
22
+ end
23
+ return z
24
+ end
25
+ end
data/lib/hash.rb ADDED
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+ class Hash
3
+
4
+ def add_keysym_from(h)
5
+ h.each{|k,v| self[ k.to_sym ] = v }
6
+ self
7
+ end
8
+ def present?; ! self.empty?; end
9
+
10
+ def method_missing( m, *args )
11
+ case m[-1]
12
+ when '?'
13
+ n = m[0..-2].to_sym
14
+ self.key?(n) || self.key?(n.to_s)
15
+ when '='
16
+ self[ m[0..-2].to_sym ] = args.first
17
+ else
18
+ self[m] || self[m.to_s]
19
+ end
20
+ end
21
+
22
+ def keys_to_symbols
23
+ z = {}
24
+ self.each do |k,v|
25
+ z[ k.is_a?(String) ? k.to_sym : k ] =
26
+ if v.class == Hash
27
+ v.keys_to_symbols
28
+ elsif v.respond_to?(:to_hash)
29
+ v.to_hash.keys_to_symbols
30
+ elsif v.respond_to?(:collect)
31
+ v.collect{|i| i.respond_to?(:keys_to_symbols) ? i.keys_to_symbols : i }
32
+ else
33
+ v.dup
34
+ end
35
+ end
36
+ z
37
+ end
38
+
39
+ def deep_merge(src)
40
+ dst = dup
41
+ dst.merge(src){|k, o1, o2|
42
+ if o1.is_a?(o2.class) && o1.respond_to?(:deep_merge)
43
+ o1.deep_merge(o2)
44
+ else # classes mismatch or simple type
45
+ o2.dup
46
+ end
47
+ }
48
+ end
49
+
50
+ def keys?(*list)
51
+ keys.include?(*list)
52
+ end
53
+
54
+ def any_key?(*list)
55
+ (( self.keys & list ).count > 0 ) && !! ( self.keys & list )
56
+ end
57
+
58
+ def filter_keys( *kk )
59
+ filter{ |k, v| kk.include?(k) }
60
+ end
61
+
62
+ end
@@ -0,0 +1,9 @@
1
+ require_relative 'hash'
2
+ require_relative 'array'
3
+ require_relative 'string'
4
+ require_relative 'nil'
5
+ require_relative 'object'
6
+ require_relative 'numeric'
7
+ require_relative 'thread'
8
+ require_relative 'amqproto'
9
+ require_relative 'proc'
data/lib/nil.rb ADDED
@@ -0,0 +1,6 @@
1
+ class NilClass
2
+ def empty?; true; end
3
+ def present?; false; end
4
+ def dig(*args); self; end
5
+ def call(*args); self; end
6
+ end
data/lib/numeric.rb ADDED
@@ -0,0 +1,4 @@
1
+ class Numeric
2
+ def present?; true; end
3
+ def to_a; [self]; end
4
+ end
data/lib/object.rb ADDED
@@ -0,0 +1,17 @@
1
+ class Object
2
+ def present?
3
+ ! nil?
4
+ end
5
+ def to_a
6
+ [ self ]
7
+ end
8
+
9
+ # stolen from activesupport core extensions
10
+ def try( method_name = nil, *args, &b )
11
+ if method_name.nil? && block_given?
12
+ b.arity == 0 ? instance_eval( &b ) : yield( self )
13
+ elsif respond_to?( method_name )
14
+ public_send( method_name, *args, &b )
15
+ end
16
+ end
17
+ end
data/lib/proc.rb ADDED
@@ -0,0 +1,5 @@
1
+ class Proc
2
+ def _dump_data
3
+ self.inspect
4
+ end
5
+ end
data/lib/string.rb ADDED
@@ -0,0 +1,71 @@
1
+ require 'yaml'
2
+ require 'json'
3
+ require 'msgpack'
4
+ require 'zlib'
5
+ require 'nori'
6
+ require_relative 'hash'
7
+
8
+ class String
9
+ def like_number?
10
+ x = self.gsub( /^([+-]?)\./, "#{ $1 }0." )
11
+ !! ( x =~ /^[-+]?(\d+)(\.\d+(e[-+]?\d+)?)?$/ )
12
+ end
13
+ def present?; ! empty?; end
14
+ def blank?; nil? || empty? end
15
+ def from_json
16
+ t = JSON.parse( self ) rescue {}
17
+ safe_parse_hash( t )
18
+ end
19
+ def from_yaml
20
+ t = YAML.load( self ) rescue {}
21
+ safe_parse_hash( t )
22
+ end
23
+ def from_msgpack
24
+ t = MessagePack.unpack( self ) rescue {}
25
+ safe_parse_hash( t )
26
+ end
27
+ def from_zlib
28
+ Zlib::Inflate.inflate self
29
+ end
30
+ def from_xml
31
+ # Защита от кулхацкеров
32
+ if self =~ /<!DOCTYPE[^>]+>|xsi:schemaLocation\s*=|<xs:schema|xmlns:xs=/
33
+ raise RuntimeError.new('Invalid XML data provided')
34
+ end
35
+ # На всякий случай удаляем заголовок, могут быть глюки у Nori
36
+ Nori.new(
37
+ :convert_tags_to => lambda { |tag| tag.snakecase.to_sym }
38
+ ).parse self.gsub(/^<\?xml[^>]+>\n*/i,'')
39
+ end
40
+ def to_a
41
+ [self]
42
+ end
43
+
44
+ def snakecase
45
+ self.gsub( /[[:upper:]]+/) {|m| "_#{ m.downcase }" }.gsub(/\A_/,'')
46
+ end
47
+
48
+ def camelcase
49
+ self.gsub( /(\A|_)[[:lower:]]+/ ) {|m| m.gsub(/^_/,'').capitalize }
50
+ end
51
+
52
+ # Stupid encoding without any parsing as described in Twitter OAuth doc
53
+ # https://developer.twitter.com/en/docs/basics/authentication/oauth-1-0a/percent-encoding-parameters
54
+ # http://tools.ietf.org/html/rfc3986#section-2.1
55
+ def percent_encode
56
+ @@percent_encode_table ||= [ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45,0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B,0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,0x58, 0x59, 0x5A, 0x61, 0x62, 0x63, 0x64, 0x65,0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B,0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71,0x72, 0x73, 0x74, 0x75, 0x76, 0x77,0x78, 0x79, 0x7A, 0x2D, 0x2E, 0x5F, 0x7E ].freeze
57
+ self.each_byte.collect{|i| @@percent_encode_table.include?(i) ? ("%c" % i) : ("%%%02X" % i) }.join()
58
+ end
59
+
60
+ def safe_parse_hash( t )
61
+ case t
62
+ when Array
63
+ t.collect{|item| item.is_a?( Hash ) ? item.keys_to_symbols : item }
64
+ when Hash
65
+ t.keys_to_symbols
66
+ else
67
+ t
68
+ end
69
+ end
70
+
71
+ end
data/lib/thread.rb ADDED
@@ -0,0 +1,7 @@
1
+ class Thread
2
+ def wait_for_key( k, tmout )
3
+ start_time = Time.now
4
+ sleep 0.01 until Thread.current.thread_variable?( k ) || Time.now - start_time >= tmout
5
+ return Time.now - start_time < tmout
6
+ end
7
+ end
metadata ADDED
@@ -0,0 +1,94 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: monkey-hash
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.4.0
5
+ platform: ruby
6
+ authors:
7
+ - deemytch
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-07-14 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: msgpack
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: nori
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: nokogiri
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description:
56
+ email: aspamkiller@yandex.ru
57
+ executables: []
58
+ extensions: []
59
+ extra_rdoc_files: []
60
+ files:
61
+ - lib/amqproto.rb
62
+ - lib/array.rb
63
+ - lib/hash.rb
64
+ - lib/monkey-hash.rb
65
+ - lib/nil.rb
66
+ - lib/numeric.rb
67
+ - lib/object.rb
68
+ - lib/proc.rb
69
+ - lib/string.rb
70
+ - lib/thread.rb
71
+ homepage: https://github.com/deemytch/monkey-hash
72
+ licenses:
73
+ - GPL-2.0
74
+ metadata: {}
75
+ post_install_message:
76
+ rdoc_options: []
77
+ require_paths:
78
+ - lib
79
+ required_ruby_version: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ required_rubygems_version: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ requirements: []
90
+ rubygems_version: 3.1.3
91
+ signing_key:
92
+ specification_version: 4
93
+ summary: Simple additions for standard classes.
94
+ test_files: []