bitary 0.1.5 → 0.1.6

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: 0a3a73becac006670efcdd4a87b36aee0c3c9bc48c50f5cf48d68e47e1e7cad3
4
- data.tar.gz: e398cc62cdbfc33cf1f48146b59fe655f832b33d59caf8556a7898df1ef4e20d
3
+ metadata.gz: bed2641b2bb380989c96dcc95710be56b64711c28723f3ca5f3f82fd7119bc7e
4
+ data.tar.gz: 8b7aaf05d552014d77d42707453c5c4c6d84aefb2bd5d382376cdb152ce52068
5
5
  SHA512:
6
- metadata.gz: 5f6d8328faf7a368daf44fc5dafedcfc4456369d2ae48b7a2e3736ad48bea686d76444b3fdd8c7c8d6b34774906e7544cf61cd78905350cfb60c94205916d832
7
- data.tar.gz: 86f6f32038489a43a9dc18613c536110af4e7aed65e228f2d763f6c472037aba0518ba382566bbe6edeec3ff76491584971c6a0bad64f4efe5dc1d68e443bca4
6
+ metadata.gz: fb6ad75f7e41ef52bdd71a78ac341381671264eb86e9b90cea66d36cbdbf751ff28e0a072a1479a9474bb68e111c983bcf093936ce08b1fac60b584ec2b7e5d0
7
+ data.tar.gz: bb66c485748c97732da3def70727dbc822704d21e1f2aad31cf810179db6e4154e3aa0c079a3a96a203c6e7e332865e8302428fada04b30f0671f314cbd8d772
data/.rubocop.yml CHANGED
@@ -1,5 +1,7 @@
1
1
  AllCops:
2
2
  NewCops: enable
3
+ Exclude:
4
+ - 'bin/**/*'
3
5
 
4
6
  Style/Documentation:
5
7
  Enabled: false
data/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ ## [0.1.5] - 2024-03-31
2
+
3
+ - enhance performance of #each_byte (4 seconds faster on average)
4
+
1
5
  ## [0.1.4] - 2024-03-31
2
6
 
3
7
  - more refactoring of Bitary class
@@ -2,7 +2,7 @@
2
2
 
3
3
  class Bitary
4
4
  class Bitwarr
5
- attr_reader :bpi
5
+ attr_reader :bpi, :bitsize
6
6
 
7
7
  def initialize(initial_data, bpi: Bitary::LONG)
8
8
  check_initial_data(initial_data)
@@ -21,21 +21,6 @@ class Bitary
21
21
  @array.respond_to?(method, include_all) || super
22
22
  end
23
23
 
24
- def bitsize(bit_index = nil)
25
- if bit_index.nil?
26
- @bitsize
27
- else
28
- check_bit_index(bit_index)
29
-
30
- last_index = @array.length - 1
31
- if item_index(bit_index) == last_index
32
- @bitsize - (last_index * @bpi)
33
- else
34
- @bpi
35
- end
36
- end
37
- end
38
-
39
24
  def [](bit_index)
40
25
  @array[item_index(bit_index)]
41
26
  end
@@ -46,12 +31,6 @@ class Bitary
46
31
  @array[item_index(bit_index)] = value
47
32
  end
48
33
 
49
- def relative_bit_index(bit_index)
50
- check_bit_index(bit_index)
51
-
52
- bit_index % @bpi
53
- end
54
-
55
34
  def item_index(bit_index)
56
35
  check_bit_index(bit_index)
57
36
 
@@ -127,7 +106,7 @@ class Bitary
127
106
  Factory
128
107
  .make("Handler::#{operation.capitalize}", self[index])
129
108
  .execute(
130
- index: relative_bit_index(index),
109
+ index: index % @bpi,
131
110
  size: @bpi
132
111
  )
133
112
  end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative 'single_method/non_nil_enforcer'
4
- require_relative 'single_method/truthy_enforcer'
5
4
 
6
5
  class Bitary
7
6
  class Decorator
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'decorator/kwargs_validator'
4
3
  require_relative 'decorator/single_method'
5
4
 
6
5
  class Bitary
@@ -3,17 +3,6 @@
3
3
  class Bitary
4
4
  class Handler
5
5
  class Append < Bitary::Handler
6
- SPEC = {
7
- offset: {
8
- required: true,
9
- type: Integer
10
- },
11
- value: {
12
- required: true,
13
- type: Integer
14
- }
15
- }.freeze
16
-
17
6
  def execute(**kwargs)
18
7
  (@value << kwargs[:offset]) | kwargs[:value]
19
8
  end
@@ -3,23 +3,6 @@
3
3
  class Bitary
4
4
  class Handler
5
5
  class Get < Bitary::Handler
6
- SPEC = {
7
- index: {
8
- required: true,
9
- type: Integer,
10
- predicate: {
11
- callback: lambda do |**kwargs|
12
- kwargs[:index] >= 0 && kwargs[:index] < kwargs[:size]
13
- end,
14
- error: IndexError
15
- }
16
- },
17
- size: {
18
- required: true,
19
- type: Integer
20
- }
21
- }.freeze
22
-
23
6
  def execute(**kwargs)
24
7
  (@value >> (kwargs[:size] - kwargs[:index] - 1)) & 0x1
25
8
  end
@@ -3,23 +3,6 @@
3
3
  class Bitary
4
4
  class Handler
5
5
  class Set < Bitary::Handler
6
- SPEC = {
7
- index: {
8
- required: true,
9
- type: Integer,
10
- predicate: {
11
- callback: lambda do |**kwargs|
12
- kwargs[:index] >= 0 && kwargs[:index] < kwargs[:size]
13
- end,
14
- error: IndexError
15
- }
16
- },
17
- size: {
18
- required: true,
19
- type: Integer
20
- }
21
- }.freeze
22
-
23
6
  def execute(**kwargs)
24
7
  @value | (2**(kwargs[:size] - kwargs[:index] - 1))
25
8
  end
@@ -3,28 +3,10 @@
3
3
  class Bitary
4
4
  class Handler
5
5
  class Unset < Bitary::Handler
6
- SPEC = {
7
- index: {
8
- required: true,
9
- type: Integer,
10
- predicate: {
11
- callback: lambda do |**kwargs|
12
- kwargs[:index] >= 0 && kwargs[:index] < kwargs[:size]
13
- end,
14
- error: IndexError
15
- }
16
- },
17
- size: {
18
- required: true,
19
- type: Integer
20
- }
21
- }.freeze
22
-
23
6
  def execute(**kwargs)
24
- mask =
25
- (2**kwargs[:size]) - 1 - (2**(kwargs[:size] - kwargs[:index] - 1))
26
-
27
- @value & mask
7
+ size = kwargs[:size]
8
+ index = kwargs[:index]
9
+ @value & ((2**size) - 1 - (2**(size - index - 1)))
28
10
  end
29
11
  end
30
12
  end
@@ -7,20 +7,9 @@ require_relative 'handler/append'
7
7
 
8
8
  class Bitary
9
9
  class Handler
10
- SPEC = {}.freeze
11
-
12
10
  attr_reader :value
13
11
 
14
- def self.new(*arg, **kwargs)
15
- Decorator::SingleMethod::KwargsValidator.new(
16
- super,
17
- { execute: self::SPEC }
18
- )
19
- end
20
-
21
12
  def initialize(value)
22
- raise ArgumentError unless value.is_a?(Integer)
23
-
24
13
  @value = value
25
14
  end
26
15
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class Bitary
4
- VERSION = '0.1.5'
4
+ VERSION = '0.1.6'
5
5
  end
data/lib/bitary.rb CHANGED
@@ -12,7 +12,7 @@ class Bitary
12
12
  include Size
13
13
 
14
14
  def initialize(initial_data, bpi: LONG)
15
- @internal_array = Bitwarr.new(initial_data, bpi:)
15
+ @internal_array = Factory.make('Bitwarr', initial_data, bpi:)
16
16
  end
17
17
 
18
18
  def [](index)
@@ -20,7 +20,7 @@ class Bitary
20
20
  end
21
21
 
22
22
  def []=(index, value)
23
- case Mapper::ObjToBit.new.map(value)
23
+ case Factory.make('Mapper::ObjToBit').map(value)
24
24
  when 0 then @internal_array.unbit_at!(index)
25
25
  else @internal_array.bit_at!(index)
26
26
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bitary
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Maximilien Ballesteros
@@ -26,10 +26,8 @@ files:
26
26
  - lib/bitary.rb
27
27
  - lib/bitary/bitwarr.rb
28
28
  - lib/bitary/decorator.rb
29
- - lib/bitary/decorator/kwargs_validator.rb
30
29
  - lib/bitary/decorator/single_method.rb
31
30
  - lib/bitary/decorator/single_method/non_nil_enforcer.rb
32
- - lib/bitary/decorator/single_method/truthy_enforcer.rb
33
31
  - lib/bitary/factory.rb
34
32
  - lib/bitary/handler.rb
35
33
  - lib/bitary/handler/append.rb
@@ -1,174 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Bitary
4
- class Decorator
5
- class KwargsValidator < Bitary::Decorator
6
- SPEC_KEYS = %i[required default type predicate].freeze
7
-
8
- def initialize(wrappee, spec)
9
- super(wrappee) { |method| spec.key?(method) }
10
- @spec = check_spec(@wrappee, spec)
11
- end
12
-
13
- protected
14
-
15
- def precall(method, *, **)
16
- super(method, *, **check_kwargs(@spec, method, **))
17
- end
18
-
19
- private
20
-
21
- def check_spec(wrappee, spec)
22
- raise ArgumentError unless spec.is_a?(Hash)
23
-
24
- spec.each do |method, method_spec|
25
- check_spec_method(wrappee, method)
26
- check_spec_method_value(method_spec)
27
- end
28
- end
29
-
30
- def check_kwargs(spec, method, **kwargs)
31
- check_unexpected_user_kwargs(kwargs, spec[method])
32
- check_kwargs_against_spec(kwargs, spec[method])
33
- end
34
-
35
- def check_spec_method(wrappee, method)
36
- raise ArgumentError unless wrappee.respond_to?(method)
37
- end
38
-
39
- def check_spec_method_value(method_spec)
40
- raise ArgumentError unless method_spec.is_a?(Hash)
41
-
42
- method_spec.each_value do |arg_spec|
43
- raise ArgumentError unless arg_spec.is_a?(Hash)
44
-
45
- check_arg_spec(arg_spec)
46
- end
47
- end
48
-
49
- def check_arg_spec(arg_spec)
50
- raise ArgumentError unless arg_spec.keys.all? do |spec_key|
51
- SPEC_KEYS.include?(spec_key)
52
- end
53
-
54
- arg_spec.each do |spec_key, spec_value|
55
- check_arg_spec_entry(spec_key, spec_value)
56
- end
57
-
58
- return unless arg_spec.key?(:required) && arg_spec[:required]
59
- raise ArgumentError if arg_spec.key?(:default)
60
- end
61
-
62
- def check_arg_spec_entry(key, value)
63
- case key
64
- when :required then check_required(value)
65
- when :default then check_default(value)
66
- when :type then check_type(value)
67
- when :predicate then check_predicate(value)
68
- end
69
- end
70
-
71
- def check_required(value)
72
- raise ArgumentError unless [true, false].include?(value)
73
- end
74
-
75
- def check_default(value)
76
- # NOTHING TODO
77
- end
78
-
79
- def check_type(value)
80
- raise ArgumentError unless value.is_a?(Class)
81
- end
82
-
83
- def check_predicate(value)
84
- raise ArgumentError unless value.is_a?(Hash)
85
-
86
- check_predicate_keys(value)
87
- check_predicate_values(value)
88
- end
89
-
90
- def check_predicate_keys(value)
91
- available_keys = %i[callback error]
92
-
93
- raise ArgumentError unless value.keys.all? do |key|
94
- available_keys.include?(key)
95
- end
96
-
97
- raise KeyError unless value.key?(:callback) && value.key?(:error)
98
- end
99
-
100
- def check_predicate_values(value)
101
- raise ArgumentError unless value[:callback].is_a?(Proc)
102
- raise ArgumentError unless value[:error].is_a?(Class)
103
- raise ArgumentError unless value[:error] < Exception
104
- end
105
-
106
- def check_unexpected_user_kwargs(user_kwargs, method_spec)
107
- raise ArgumentError unless user_kwargs.keys.all? do |key|
108
- method_spec.include?(key)
109
- end
110
- end
111
-
112
- def check_kwargs_against_spec(user_kwargs, method_spec)
113
- predicates = []
114
-
115
- parsed_kwargs = method_spec.reduce({}) do |acc, entry|
116
- kwarg_name, kwarg_spec = entry
117
- loaded_spec = load_spec(kwarg_spec)
118
-
119
- validate_required(user_kwargs, loaded_spec, kwarg_name)
120
- validate_type(user_kwargs, loaded_spec, kwarg_name)
121
- predicates << loaded_spec[:predicate]
122
-
123
- acc.merge(
124
- kwarg_name => compute_value(user_kwargs, loaded_spec, kwarg_name)
125
- )
126
- end
127
-
128
- predicates.each do |predicate|
129
- validate_predicate(parsed_kwargs, predicate)
130
- end
131
-
132
- parsed_kwargs
133
- end
134
-
135
- def load_spec(kwarg_spec)
136
- {
137
- required: kwarg_spec[:required] || false,
138
- default: kwarg_spec[:default],
139
- type: kwarg_spec[:type] || Object,
140
- predicate: kwarg_spec[:predicate] || {
141
- callback: ->(_value) { true },
142
- error: ArgumentError
143
- }
144
- }
145
- end
146
-
147
- def validate_required(user_kwargs, spec, expected_key)
148
- return unless spec[:required]
149
-
150
- raise KeyError unless user_kwargs.key?(expected_key)
151
- end
152
-
153
- def validate_type(user_kwargs, spec, expected_key)
154
- return unless user_kwargs.key?(expected_key)
155
-
156
- raise ArgumentError unless user_kwargs[expected_key].is_a?(spec[:type])
157
- end
158
-
159
- def validate_predicate(parsed_kwargs, predicate)
160
- return if predicate[:callback].call(**parsed_kwargs)
161
-
162
- raise predicate[:error]
163
- end
164
-
165
- def compute_value(user_kwargs, spec, expected_key)
166
- if user_kwargs.key?(expected_key)
167
- user_kwargs[expected_key]
168
- else
169
- spec[:default]
170
- end
171
- end
172
- end
173
- end
174
- end
@@ -1,15 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Bitary
4
- class Decorator
5
- class SingleMethod < Bitary::Decorator
6
- class TruthyEnforcer < Bitary::Decorator::SingleMethod
7
- protected
8
-
9
- def postcall(resp)
10
- resp or raise TypeError
11
- end
12
- end
13
- end
14
- end
15
- end