vv 0.0.14 → 0.0.15

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3c8c547349232035004a745cf52e55bd36defde893a895fb1cd92227d96959b0
4
- data.tar.gz: 7e2126cd0d4b9e25372567a17bff5a64f9ca635bad9dc1bab9f59dcdac10cc7e
3
+ metadata.gz: 4f7b33e4bf1daadb65c4aa05ccc583213a0808f78f6bf7b6205da479fe05cf34
4
+ data.tar.gz: ab9838d4ebeb70a227c77fd871da29343ad64a138eb7e0e3cd1b921e374ec17c
5
5
  SHA512:
6
- metadata.gz: e74e8862eec31bca21f58fa8f3edeed18dad800b45d5cc8fb66da56bc0c24f5d923ba7283c7785091d2c05a25ff07edaf1b57a51a8d36ba2d78910254ddc2aea
7
- data.tar.gz: 0c9110bf3f7246f722cd6e65c7d1f461d821afb64a3364585a116c7d437689dc78b55378771de511887cc3248992e95be88ffaa7f68ab9ddc2578a4290275a9d
6
+ metadata.gz: 938ce048bb3d4d71230c96ff80160ef82f472ff2307c431d04ba50281fecd70fd9227c05e01ec08d12eef1c63d4cf46961a8b581c8f9bb7c3a21dccd98f86269
7
+ data.tar.gz: c466b8987c0ff65dcfdea6fc37e76a484c24be303877714ab57fcd251c5f0db0c190452d268ece3753d96610bf3f6397f788411a347c3d7ff85fcef13856055d
data/lib/vv.rb CHANGED
@@ -12,6 +12,11 @@ require_relative "vv/set_methods"
12
12
  Gem.require_files "vv/*.rb"
13
13
  Gem.require_files "vv/style/*.rb"
14
14
  Gem.require_files "vv/utility/*.rb"
15
+ Gem.require_files "vv/serialization/*.rb"
16
+
17
+ class Object
18
+ include VV::ObjectMethods
19
+ end
15
20
 
16
21
  class Symbol
17
22
  include VV::SymbolMethods
@@ -15,6 +15,10 @@ module VV
15
15
 
16
16
  end
17
17
 
18
+ def vv_json
19
+ VV::JSON.generate self
20
+ end
21
+
18
22
  def spaced
19
23
  self.join(" ")
20
24
  end
@@ -40,7 +40,7 @@ module VV
40
40
  use_min ||= ( infinite? and self < 0 )
41
41
  return min.to_json if use_min
42
42
 
43
- JSON.dump(self)
43
+ ::JSON.dump(self)
44
44
  end
45
45
 
46
46
  end
@@ -13,11 +13,8 @@ module VV
13
13
 
14
14
  end
15
15
 
16
- # See Float#vv_json.
17
- # Intended for common sense json doc generation with reasonable
18
- # length, depth, and size limits.
19
16
  def vv_json
20
- raise NotImplementedError
17
+ VV::JSON.generate self
21
18
  end
22
19
 
23
20
  def symbolize_keys
@@ -13,6 +13,55 @@ module VV
13
13
 
14
14
  end
15
15
 
16
+ def vv_json
17
+ self.to_json
18
+ end
19
+
20
+ def ceil_divide divisor
21
+ self % divisor > 0 ? ( self / divisor ) + 1 : self / divisor
22
+ end
23
+
24
+ def bits
25
+ bits_per_byte = 8
26
+ self.ceil_divide bits_per_byte
27
+ end
28
+
29
+ def kibibytes
30
+ self * 1024
31
+ end
32
+ alias_method :kibibyte, :kibibytes
33
+ alias_method :KiB, :kibibytes
34
+
35
+ def mebibytes
36
+ self.kibibytes * 1024
37
+ end
38
+ alias_method :mebibyte, :mebibytes
39
+ alias_method :MiB, :mebibytes
40
+
41
+ def gibibytes
42
+ self.mebibytes * 1024
43
+ end
44
+ alias_method :gibibyte, :gibibytes
45
+ alias_method :GiB, :gibibytes
46
+
47
+ def tebibytes
48
+ self.gibibytes * 1024
49
+ end
50
+ alias_method :tebibyte, :tebibytes
51
+ alias_method :TiB, :tebibytes
52
+
53
+ def pebibytes
54
+ self.tebibytes * 1024
55
+ end
56
+ alias_method :pebibyte, :pebibytes
57
+ alias_method :PiB, :pebibytes
58
+
59
+ def exbibytes
60
+ self.pebibytes * 1024
61
+ end
62
+ alias_method :exbibyte, :exbibytes
63
+ alias_method :EiB, :exbibytes
64
+
16
65
  def spaces
17
66
  characters String.space
18
67
  end
@@ -13,6 +13,10 @@ module VV
13
13
 
14
14
  end
15
15
 
16
+ def vv_json
17
+ self.to_json
18
+ end
19
+
16
20
  def to_boolean
17
21
  false
18
22
  end
@@ -1,57 +1,75 @@
1
- class Object
1
+ module VV
2
2
 
3
- alias_method :responds_to?, :respond_to?
3
+ module ObjectMethods
4
4
 
5
- def blank?
6
- respond_to?(:empty?) ? !!empty? : !self
7
- end unless method_defined? :blank?
5
+ alias_method :responds_to?, :respond_to?
8
6
 
9
- def cli_printable **kwargs
10
- String.get_stdout { self.cli_print( **kwargs ) }
11
- rescue NoMethodError
12
- message = \
13
- "`cli_printable` requires `cli_print` on child class"
14
- fail NoMethodError, message
15
- end unless method_defined? :cli_printable
7
+ def set_attrs_via( *attributes, document: )
8
+ attributes.flatten!
9
+ document.keys.to_set.includes_all! attributes
10
+ attributes.each do |attribute|
11
+ value = document.fetch(attribute)
12
+ setter = attribute.setter_sym
13
+ insta = attribute.insta_sym
14
+ if self.respond_to? setter
15
+ self.public_send setter, value
16
+ else
17
+ self.instance_variable_set insta, value
18
+ end
19
+ end
20
+ end
16
21
 
17
- def present?
18
- !blank?
19
- end unless method_defined? :present?
22
+ def blank?
23
+ respond_to?(:empty?) ? !!empty? : !self
24
+ end unless method_defined? :blank?
20
25
 
21
- def one_of? *collection, mixed: false, allow_unsafe: false
22
- nested = collection.first.is_a? Array
23
- nested ||= collection.first.is_a? Hash
24
- nested ||= collection.first.is_a? Set
26
+ def cli_printable **kwargs
27
+ String.get_stdout { self.cli_print( **kwargs ) }
28
+ rescue NoMethodError
29
+ message = \
30
+ "`cli_printable` requires `cli_print` on child class"
31
+ fail NoMethodError, message
32
+ end unless method_defined? :cli_printable
25
33
 
26
- message = \
27
- "Unexpected nested argument. If desired set `allow_unsafe: true`."
28
- fail ArgumentError, message if nested unless allow_unsafe
34
+ def present?
35
+ !blank?
36
+ end unless method_defined? :present?
29
37
 
30
- return collection.include? self if mixed
38
+ def one_of? *collection, mixed: false, allow_unsafe: false
39
+ nested = collection.first.is_a? Array
40
+ nested ||= collection.first.is_a? Hash
41
+ nested ||= collection.first.is_a? Set
31
42
 
32
- klass = self.class
33
- ok = collection.reject {|s| s.is_a? klass }.blank?
43
+ message = \
44
+ "Unexpected nested argument. If desired set `allow_unsafe: true`."
45
+ fail ArgumentError, message if nested unless allow_unsafe
34
46
 
35
- message = "Invalid types: #{klass} collection required."
36
- fail ArgumentError, message unless ok
47
+ return collection.include? self if mixed
37
48
 
38
- collection.include? self
39
- end
49
+ klass = self.class
50
+ ok = collection.reject {|s| s.is_a? klass }.blank?
40
51
 
41
- def one_of! *collection, mixed: false
42
- return true if self.one_of?( *collection, mixed: mixed )
52
+ message = "Invalid types: #{klass} collection required."
53
+ fail ArgumentError, message unless ok
43
54
 
44
- klass = self.class
45
- collection = collection.stringify_collection grave: true
46
- message = "#{klass} `#{self}` is invalid. Must be one of: #{collection}."
47
- fail message
48
- end
55
+ collection.include? self
56
+ end
49
57
 
50
- def is_a! klass
51
- message = \
52
- "Expected `#{klass}` instance, not `#{self.class}`."
53
- fail ArgumentError, message unless self.is_a? klass
54
- end
55
- alias_method :must_be_a!, :is_a!
58
+ def one_of! *collection, mixed: false
59
+ return true if self.one_of?( *collection, mixed: mixed )
56
60
 
61
+ klass = self.class
62
+ collection = collection.stringify_collection grave: true
63
+ message = "#{klass} `#{self}` is invalid. Must be one of: #{collection}."
64
+ fail message
65
+ end
66
+
67
+ def is_a! klass
68
+ message = \
69
+ "Expected `#{klass}` instance, not `#{self.class}`."
70
+ fail ArgumentError, message unless self.is_a? klass
71
+ end
72
+ alias_method :must_be_a!, :is_a!
73
+
74
+ end
57
75
  end
@@ -0,0 +1,88 @@
1
+ class VV::JSON
2
+
3
+ def self.default_max
4
+ 1.mebibyte
5
+ end
6
+
7
+ def self.generate object,
8
+ maximum_bytes=nil,
9
+ **kwargs
10
+
11
+ max = maximum_bytes || self.default_max
12
+
13
+ generator = self.new( max, **kwargs )
14
+ generator.serialize object
15
+ end
16
+
17
+ def initialize maximum_bytes,
18
+ float_kwargs: nil
19
+
20
+ @max = maximum_bytes
21
+ @response = ""
22
+ @float_kwargs = float_kwargs || {}
23
+ end
24
+
25
+ def serialize object
26
+
27
+ self.check_for_size_failure!
28
+
29
+ case object
30
+ when Hash
31
+ @response += "{"
32
+
33
+ object.each do |key, value|
34
+ self.serialize! key.to_s
35
+ @response += ":"
36
+
37
+ self.serialize! value
38
+ @response += ","
39
+ end
40
+
41
+ @response.chomp! ","
42
+ @response += "}"
43
+ when Array
44
+ @response += "["
45
+
46
+ object.each do |value|
47
+ self.serialize! value
48
+ @response += ","
49
+ end
50
+
51
+ @response.chomp! ","
52
+ @response += "]"
53
+ when String
54
+ self.size_failure! if ( object.size + 2 ) > @max
55
+ @response += object.to_json
56
+ when Float
57
+ @response += object.vv_json( **@float_kwargs )
58
+ else
59
+ if object.respond_to? :vv_json
60
+ @response += object.vv_json
61
+ else
62
+ fail "VV::JSON cannot generate JSON for `#{object.class}`."
63
+ end
64
+ end
65
+
66
+ self.check_for_size_failure!
67
+
68
+ @response
69
+ end
70
+ alias_method :serialize!, :serialize
71
+
72
+ def default_max
73
+ self.class.default_max
74
+ end
75
+
76
+ def check_for_size_failure!
77
+ size_failure! if @response.size > @max
78
+ end
79
+
80
+ def size_failure!
81
+ if @max == self.default_max
82
+ fail "VV::JSON generation size exceeds default max of 1 MiB"
83
+ else
84
+ fail "VV::JSON generation size exceeds max of `#{@max}` bytes"
85
+ end
86
+ end
87
+
88
+ end
@@ -15,6 +15,10 @@ module VV
15
15
 
16
16
  end
17
17
 
18
+ def vv_json
19
+ self.to_a.vv_json
20
+ end
21
+
18
22
  module SetAndArrayMethods
19
23
 
20
24
  def gravify
@@ -39,7 +43,7 @@ module VV
39
43
  ok_type = other.is_a? Array
40
44
  ok_type ||= other.is_a? Set
41
45
 
42
- fail TypeError, "Expecting array" unless ok_type
46
+ fail TypeError, "Expecting array or set" unless ok_type
43
47
 
44
48
  ( self & other ).one?
45
49
  end
@@ -56,7 +60,7 @@ module VV
56
60
  ok_type = other.is_a? Array
57
61
  ok_type ||= other.is_a? Set
58
62
 
59
- fail TypeError, "Expecting array" unless ok_type
63
+ fail TypeError, "Expecting array or set" unless ok_type
60
64
  ( self & other ).any?
61
65
  end
62
66
  alias_method :include_any?, :includes_any?
@@ -68,6 +72,37 @@ module VV
68
72
  end
69
73
  alias_method :include_any!, :includes_any!
70
74
 
75
+ def includes_all? other
76
+ ok_type = other.is_a? Array
77
+ ok_type ||= other.is_a? Set
78
+
79
+ fail TypeError, "Expecting array or set" unless ok_type
80
+ ( other.to_set & self ) == other.to_set
81
+ end
82
+ alias_method :include_all?, :includes_all?
83
+
84
+ def includes_all! other
85
+ return true if includes_all? other
86
+ other = other.to_set
87
+ remaining = other - ( other & self )
88
+ count = remaining.count
89
+
90
+ message = "Collection "
91
+ including = remaining.first(3).stringify_collection grave: true
92
+
93
+ fail "Assertion error" if count < 1
94
+
95
+ if count < 4
96
+ message += "does not include: #{including}."
97
+ else
98
+ message += \
99
+ "does not include #{count} items, including: #{including}."
100
+ end
101
+
102
+ fail message
103
+ end
104
+ alias_method :include_all!, :includes_all!
105
+
71
106
  def stringify_collection grave: false
72
107
  return self.gravify.stringify_collection if grave
73
108
 
@@ -323,11 +323,15 @@ module VV
323
323
  raise RuntimeError, message
324
324
  end
325
325
 
326
+ def vv_json
327
+ VV::JSON.generate self
328
+ end
329
+
326
330
  def parse notation: :json
327
331
  message = "Only JSON support at this time."
328
332
  fail NotImplementedError, message unless notation == :json
329
333
 
330
- JSON.parse self
334
+ ::JSON.parse self
331
335
  end
332
336
 
333
337
  def parse_json
@@ -436,6 +440,15 @@ module VV
436
440
  self.insta.to_sym
437
441
  end
438
442
 
443
+ def setter
444
+ return self if self.ends_with?(String.equals_sign)
445
+ "#{self}="
446
+ end
447
+
448
+ def setter_sym
449
+ self.setter.to_sym
450
+ end
451
+
439
452
  def to position
440
453
  self[0..position]
441
454
  end
@@ -11,6 +11,10 @@ module VV
11
11
  end
12
12
  end
13
13
 
14
+ def vv_json
15
+ self.to_s.vv_json
16
+ end
17
+
14
18
  def insta
15
19
  self.to_s.insta
16
20
  end
@@ -19,6 +23,14 @@ module VV
19
23
  self.to_s.insta_sym
20
24
  end
21
25
 
26
+ def setter
27
+ self.to_s.setter
28
+ end
29
+
30
+ def setter_sym
31
+ self.to_s.setter_sym
32
+ end
33
+
22
34
  def plural? *args, **kwargs
23
35
  self.to_s.plural?( *args, **kwargs )
24
36
  end
@@ -49,8 +49,9 @@ module VV
49
49
  puts "++ - minor increment"
50
50
  puts "+++ - major increment"
51
51
  puts
52
- puts "x.y.z - to set version explicitly"
53
- puts "reset - to revert to version in git"
52
+ puts "x.y.z - to set version explicitly"
53
+ puts "reset - to revert to version in git"
54
+ puts "commit - to commit the version change"
54
55
  puts
55
56
  exit
56
57
  end
data/lib/vv/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module VV
2
- VERSION = '0.0.14'
2
+ VERSION = '0.0.15'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vv
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.14
4
+ version: 0.0.15
5
5
  platform: ruby
6
6
  authors:
7
7
  - Zach Aysan
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-03-05 00:00:00.000000000 Z
11
+ date: 2019-03-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -77,6 +77,7 @@ files:
77
77
  - lib/vv/object_methods.rb
78
78
  - lib/vv/random_methods.rb
79
79
  - lib/vv/readline_methods.rb
80
+ - lib/vv/serialization/json.rb
80
81
  - lib/vv/set_methods.rb
81
82
  - lib/vv/string_methods.rb
82
83
  - lib/vv/style/bold.rb
@@ -108,8 +109,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
108
109
  - !ruby/object:Gem::Version
109
110
  version: '0'
110
111
  requirements: []
111
- rubyforge_project:
112
- rubygems_version: 2.7.7
112
+ rubygems_version: 3.0.3
113
113
  signing_key:
114
114
  specification_version: 4
115
115
  summary: Make ruby very v