avm-tools 0.114.0 → 0.115.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.
Files changed (57) hide show
  1. checksums.yaml +4 -4
  2. data/lib/avm/launcher/git/publish_base.rb +2 -0
  3. data/lib/avm/tools/version.rb +1 -1
  4. data/sub/avm/lib/avm/instances/base/auto_values/database.rb +2 -2
  5. data/sub/avm/lib/avm/instances/entry_keys.rb +2 -1
  6. data/{lib → sub/avm/lib}/avm/launcher/errors/base.rb +0 -0
  7. data/{lib → sub/avm/lib}/avm/launcher/errors/non_project.rb +0 -0
  8. data/{lib → sub/avm/lib}/avm/launcher/paths/real.rb +0 -0
  9. data/{lib → sub/avm/lib}/avm/launcher/publish/check_result.rb +0 -0
  10. data/sub/avm/lib/avm/self/instance.rb +0 -1
  11. data/sub/avm/lib/avm/sources/base/instance.rb +28 -0
  12. data/sub/avm/lib/avm/version.rb +1 -1
  13. data/sub/avm-eac_postgresql_base0/lib/avm/eac_postgresql_base0/instance/assert.rb +77 -0
  14. data/sub/avm-eac_postgresql_base0/lib/avm/eac_postgresql_base0/instance.rb +23 -12
  15. data/sub/avm-eac_postgresql_base0/lib/avm/eac_postgresql_base0/version.rb +1 -1
  16. data/sub/avm-eac_rails_base0/lib/avm/eac_rails_base0/deploy.rb +1 -1
  17. data/sub/avm-eac_rails_base0/lib/avm/eac_rails_base0/version.rb +1 -1
  18. data/sub/avm-eac_redmine_base0/avm-eac_redmine_base0.gemspec +1 -0
  19. data/sub/avm-eac_redmine_base0/lib/avm/eac_redmine_base0/data_unit.rb +6 -10
  20. data/sub/avm-eac_redmine_base0/lib/avm/eac_redmine_base0/instance.rb +20 -0
  21. data/sub/avm-eac_redmine_base0/lib/avm/eac_redmine_base0/rest_api.rb +11 -0
  22. data/sub/avm-eac_redmine_base0/lib/avm/eac_redmine_base0/version.rb +1 -1
  23. data/sub/avm-eac_redmine_base0/template/avm/eac_redmine_base0/deploy/config/install.sh.template +3 -3
  24. data/sub/avm-files/lib/avm/files/formatter/formats/generic_plain.rb +2 -2
  25. data/sub/avm-files/lib/avm/files/version.rb +1 -1
  26. data/sub/eac_cli/lib/eac_cli/runner/context.rb +4 -0
  27. data/sub/eac_cli/lib/eac_cli/runner/instance_methods.rb +10 -0
  28. data/sub/eac_cli/lib/eac_cli/speaker.rb +1 -2
  29. data/sub/eac_cli/lib/eac_cli/version.rb +1 -1
  30. data/sub/eac_fs/lib/eac_fs/cached_download.rb +2 -2
  31. data/sub/eac_fs/lib/eac_fs/patches/object/fs_cache.rb +6 -1
  32. data/sub/eac_fs/lib/eac_fs/version.rb +1 -1
  33. data/sub/eac_rest/Gemfile +5 -0
  34. data/sub/eac_rest/eac_rest.gemspec +18 -0
  35. data/sub/eac_rest/lib/eac_rest/api.rb +39 -0
  36. data/sub/eac_rest/lib/eac_rest/entity.rb +16 -0
  37. data/sub/eac_rest/lib/eac_rest/request.rb +74 -0
  38. data/sub/eac_rest/lib/eac_rest/response.rb +72 -0
  39. data/sub/eac_rest/lib/eac_rest/version.rb +5 -0
  40. data/sub/eac_rest/lib/eac_rest.rb +7 -0
  41. data/sub/eac_rest/spec/rubocop_spec.rb +3 -0
  42. data/sub/eac_rest/spec/spec_helper.rb +4 -0
  43. data/sub/eac_ruby_utils/lib/eac_ruby_utils/bit.rb +46 -0
  44. data/sub/eac_ruby_utils/lib/eac_ruby_utils/bit_array.rb +81 -0
  45. data/sub/eac_ruby_utils/lib/eac_ruby_utils/byte.rb +105 -0
  46. data/sub/eac_ruby_utils/lib/eac_ruby_utils/byte_array.rb +36 -0
  47. data/sub/eac_ruby_utils/lib/eac_ruby_utils/envs/executable.rb +21 -3
  48. data/sub/eac_ruby_utils/lib/eac_ruby_utils/envs/process.rb +12 -4
  49. data/sub/eac_ruby_utils/lib/eac_ruby_utils/patches/object/asserts.rb +11 -0
  50. data/sub/eac_ruby_utils/lib/eac_ruby_utils/patches/object/to_uri.rb +15 -0
  51. data/sub/eac_ruby_utils/lib/eac_ruby_utils/patches/pathname/basename_noext.rb +10 -0
  52. data/sub/eac_ruby_utils/lib/eac_ruby_utils/patches/pathname/reqdir_glob.rb +13 -0
  53. data/sub/eac_ruby_utils/lib/eac_ruby_utils/version.rb +1 -1
  54. data/sub/eac_ruby_utils/spec/lib/eac_ruby_utils/bit_array_spec.rb +22 -0
  55. data/sub/eac_ruby_utils/spec/lib/eac_ruby_utils/byte_spec.rb +54 -0
  56. data/sub/eac_ruby_utils/spec/lib/eac_ruby_utils/patches/pathname/basename_noext_spec.rb +26 -0
  57. metadata +35 -12
@@ -0,0 +1,74 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'curb'
4
+ require 'eac_rest/response'
5
+ require 'eac_ruby_utils/core_ext'
6
+ require 'ostruct'
7
+
8
+ module EacRest
9
+ class Request
10
+ COMMON_MODIFIERS = %w[auth body_data verb].freeze
11
+ HASH_MODIFIERS = %w[header].freeze
12
+ MODIFIERS = COMMON_MODIFIERS + HASH_MODIFIERS.map(&:pluralize)
13
+
14
+ enable_immutable
15
+ immutable_accessor(*COMMON_MODIFIERS, type: :common)
16
+ immutable_accessor(*HASH_MODIFIERS, type: :hash)
17
+
18
+ enable_listable
19
+ lists.add_symbol :verb, :get, :delete, :options, :post, :put
20
+
21
+ common_constructor :url, :body_data_proc, default: [nil]
22
+
23
+ def autenticate(username, password)
24
+ auth(::OpenStruct.new(username: username, password: password))
25
+ end
26
+
27
+ def immutable_constructor_args
28
+ [url, body_data_proc]
29
+ end
30
+
31
+ def response
32
+ ::EacRest::Response.new(build_curl, body_data_proc)
33
+ end
34
+
35
+ private
36
+
37
+ def build_curl
38
+ r = ::Curl::Easy.new(url)
39
+ MODIFIERS.each { |suffix| send("build_curl_#{suffix}", r) }
40
+ r
41
+ end
42
+
43
+ def build_curl_auth(curl)
44
+ auth.if_present do |a|
45
+ curl.http_auth_types = :basic
46
+ curl.username = a.username
47
+ curl.password = a.password
48
+ end
49
+ end
50
+
51
+ def build_curl_body_data(curl)
52
+ www_form_body_data_encoded.if_present { |v| curl.post_body = v }
53
+ end
54
+
55
+ def build_curl_headers(curl)
56
+ curl.headers.merge!(headers)
57
+ end
58
+
59
+ def build_curl_verb(curl)
60
+ curl.set(
61
+ :customrequest,
62
+ verb.if_present(VERB_GET) { |v| self.class.lists.verb.value_validate!(v) }.to_s.upcase
63
+ )
64
+ end
65
+
66
+ def www_form_body_data_encoded
67
+ body_data.if_present do |v|
68
+ v = v.map { |k, vv| [k, vv] } if v.is_a?(::Hash)
69
+ v = URI.encode_www_form(v) if v.is_a?(::Array)
70
+ v.to_s
71
+ end
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,72 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'active_support/core_ext/hash/conversions'
4
+ require 'eac_ruby_utils/core_ext'
5
+ require 'json'
6
+
7
+ module EacRest
8
+ class Response < ::StandardError
9
+ common_constructor :curl, :body_data_proc
10
+
11
+ def body_data
12
+ r = performed_curl.headers['Accept'].if_present(body_str) do |v|
13
+ method_name = "body_data_from_#{v.parameterize.underscore}"
14
+ respond_to?(method_name) ? send(method_name) : body_str
15
+ end
16
+ r = body_data_proc.call(r) if body_data_proc.present?
17
+ r
18
+ end
19
+
20
+ def body_data_or_raise
21
+ raise_unless_200
22
+
23
+ body_data
24
+ end
25
+
26
+ delegate :body_str, :headers, to: :performed_curl
27
+
28
+ def body_str_or_raise
29
+ raise_unless_200
30
+
31
+ body_str
32
+ end
33
+
34
+ def raise_unless_200
35
+ return nil if status == 200
36
+
37
+ raise self
38
+ end
39
+
40
+ def status
41
+ performed_curl.status.to_i
42
+ end
43
+
44
+ delegate :url, to: :curl
45
+
46
+ def to_s
47
+ "URL: #{url}\nStatus: #{status}\nBody:\n\n#{body_str}"
48
+ end
49
+
50
+ private
51
+
52
+ def body_data_from_application_json
53
+ ::JSON.parse(body_str)
54
+ end
55
+
56
+ def body_data_from_application_xml
57
+ Hash.from_xml(body_str)
58
+ end
59
+
60
+ def perform
61
+ @perform ||= begin
62
+ curl.perform || raise("CURL perform failed for #{url}")
63
+ true
64
+ end
65
+ end
66
+
67
+ def performed_curl
68
+ perform
69
+ curl
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EacRest
4
+ VERSION = '0.4.0'
5
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+
5
+ module EacRest
6
+ require_sub __FILE__
7
+ end
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ ::EacRubyUtils::Rspec.default_setup.describe_rubocop
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/rspec/default_setup'
4
+ ::EacRubyUtils::Rspec.default_setup_create(::File.expand_path('..', __dir__))
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/patches/module/compare_by'
4
+
5
+ module EacRubyUtils
6
+ class Bit
7
+ VALID_VALUES = [0, 1].freeze
8
+
9
+ class << self
10
+ def assert(obj)
11
+ return obj if obj.is_a?(self)
12
+
13
+ new(obj.to_i)
14
+ end
15
+
16
+ def valid_integer?(value)
17
+ value.is_a?(::Integer) && VALID_VALUES.include?(value)
18
+ end
19
+
20
+ def validate_integer(value)
21
+ return value if valid_integer?(value)
22
+
23
+ raise(::ArgumentError, "Invalid bit value: #{value} (Valid: #{VALID_VALUES})")
24
+ end
25
+ end
26
+
27
+ attr_reader :value
28
+ compare_by :value
29
+ delegate :to_s, :zero?, to: :value
30
+
31
+ # @param value [Integer]
32
+ def initialize(value)
33
+ @value = self.class.validate_integer(value)
34
+ end
35
+
36
+ # @return [Boolean]
37
+ def one?
38
+ !zero?
39
+ end
40
+
41
+ # @return [Integer]
42
+ def to_i
43
+ value
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,81 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/bit'
4
+ require 'eac_ruby_utils/byte'
5
+ require 'eac_ruby_utils/byte_array'
6
+ require 'eac_ruby_utils/patches/module/compare_by'
7
+
8
+ module EacRubyUtils
9
+ class BitArray
10
+ class << self
11
+ def assert(obj)
12
+ return obj if obj.is_a?(self)
13
+ return new(obj) if obj.is_a?(::Enumerable)
14
+
15
+ raise "Could not convert #{obj} to #{self}"
16
+ end
17
+ end
18
+
19
+ delegate :each, :each_with_index, :to_a, :size, :count, :length, :[], :fetch, to: :values_array
20
+ compare_by :values_array
21
+
22
+ def initialize(values = [])
23
+ values.each { |value| push(value) }
24
+ end
25
+
26
+ def <<(value)
27
+ push(value)
28
+ end
29
+
30
+ # @return [EacRubyUtils::BitArray] +self+.
31
+ def push_array(other_bit_array)
32
+ values_array.push(*other_bit_array.to_a)
33
+
34
+ self
35
+ end
36
+
37
+ # @param value [EacRubyUtils::Bit]
38
+ # @return [EacRubyUtils::Bit]
39
+ def push(value)
40
+ values_array.push(::EacRubyUtils::Bit.assert(value))
41
+ end
42
+
43
+ # @return [EacRubyUtils::BitArray]
44
+ def reverse
45
+ self.class.new(values_array.reverse)
46
+ end
47
+
48
+ # @param big_endian [Boolean]
49
+ # @return [EacRubyUtils::ByteArray]
50
+ def to_byte_array(big_endian = false)
51
+ unless count.modulo(::EacRubyUtils::Byte::BIT_COUNT).zero?
52
+ raise 'Bits returned is not multile of 8'
53
+ end
54
+
55
+ byte_bits_enumerator.each_with_object(::EacRubyUtils::ByteArray.new) do |e, a|
56
+ a << ::EacRubyUtils::Byte.from_bit_array(e, big_endian)
57
+ end
58
+ end
59
+
60
+ # @return [Array<Integer>]
61
+ def to_int_array
62
+ values_array.map(&:to_i)
63
+ end
64
+
65
+ private
66
+
67
+ def byte_bits_enumerator
68
+ ::Enumerator.new do |y|
69
+ offset = 0
70
+ while offset < values_array.count
71
+ y.yield(values_array.slice(offset, ::EacRubyUtils::Byte::BIT_COUNT))
72
+ offset += ::EacRubyUtils::Byte::BIT_COUNT
73
+ end
74
+ end
75
+ end
76
+
77
+ def values_array
78
+ @values_array ||= []
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,105 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/bit'
4
+ require 'eac_ruby_utils/bit_array'
5
+ require 'eac_ruby_utils/patches/module/compare_by'
6
+
7
+ module EacRubyUtils
8
+ class Byte
9
+ ASSEMBLY_HEXADECIMAL_PREFIX = '$'
10
+ BIT_COUNT = 8
11
+ BIT_INDEX_RANGE = (0..7).freeze
12
+ VALUE_RANGE = (0..255).freeze
13
+
14
+ class << self
15
+ def assert(obj)
16
+ return obj if obj.is_a?(self)
17
+
18
+ new(obj.to_i)
19
+ end
20
+
21
+ def from_bit_array(bit_array, big_endian = false)
22
+ bit_array = ::EacRubyUtils::BitArray.assert(bit_array)
23
+ raise ::ArgumentError, "Wrong bit array size: #{bit_array.size}" if
24
+ bit_array.size != BIT_COUNT
25
+
26
+ bit_array = bit_array.reverse if big_endian
27
+ bit_array.each_with_index.inject(new(0)) do |a, e|
28
+ a.bit_set(e[1], e[0])
29
+ end
30
+ end
31
+
32
+ def valid_bit_index?(value)
33
+ value.is_a?(::Integer) && BIT_INDEX_RANGE.include?(value)
34
+ end
35
+
36
+ def validate_bit_index(value)
37
+ return value if valid_bit_index?(value)
38
+
39
+ raise(::ArgumentError, "Invalid bit index: #{value} (Range: #{BIT_INDEX_RANGE})")
40
+ end
41
+
42
+ def valid_value?(value)
43
+ value.is_a?(::Integer) && VALUE_RANGE.include?(value)
44
+ end
45
+
46
+ def validate_value(value)
47
+ return value if valid_value?(value)
48
+
49
+ raise(::ArgumentError, "Invalid byte value: #{value} (Range: #{VALUE_RANGE})")
50
+ end
51
+ end
52
+
53
+ attr_reader :value
54
+ compare_by :value
55
+
56
+ def initialize(value)
57
+ self.value = value
58
+ end
59
+
60
+ # @param bit_index [Integer]
61
+ # @return [EacRubyUtils::Bit]
62
+ def [](bit_index)
63
+ bit_get(bit_index)
64
+ end
65
+
66
+ # @param bit_index [Integer]
67
+ # @return [EacRubyUtils::Bit]
68
+ def bit_get(bit_index)
69
+ self.class.validate_bit_index(bit_index)
70
+
71
+ ::EacRubyUtils::Bit.new((value & (1 << bit_index)) >> bit_index)
72
+ end
73
+
74
+ def bit_set(bit_index, bit_value)
75
+ self.class.validate_bit_index(bit_index)
76
+ bit = ::EacRubyUtils::Bit.assert(bit_value)
77
+ mask = (1 << bit_index)
78
+ self.class.new(bit.zero? ? value & ~mask : value | mask)
79
+ end
80
+
81
+ # @return [EacRubyUtils::BitArray]
82
+ def to_bit_array(range = BIT_INDEX_RANGE)
83
+ ::EacRubyUtils::BitArray.new(range.map { |bit_index| self[bit_index] })
84
+ end
85
+
86
+ # @return [Integer]
87
+ def to_i
88
+ value
89
+ end
90
+
91
+ # @return [String]
92
+ def to_asm_hex
93
+ ASSEMBLY_HEXADECIMAL_PREFIX + to_hex
94
+ end
95
+
96
+ # @return [String]
97
+ def to_hex
98
+ value.to_s(16).upcase.rjust(2, '0')
99
+ end
100
+
101
+ private
102
+
103
+ attr_writer :value
104
+ end
105
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/byte'
4
+ require 'eac_ruby_utils/patches/module/compare_by'
5
+
6
+ module EacRubyUtils
7
+ class ByteArray
8
+ delegate :to_a, :size, :count, :length, :[], :fetch, :map, to: :values_array
9
+ compare_by :values_array
10
+
11
+ def initialize(values = [])
12
+ values.each { |value| push(value) }
13
+ end
14
+
15
+ def <<(value)
16
+ push(value)
17
+ end
18
+
19
+ # @param value [EacRubyUtils::Byte]
20
+ # @return [EacRubyUtils::Byte]
21
+ def push(value)
22
+ values_array.push(::EacRubyUtils::Byte.assert(value))
23
+ end
24
+
25
+ # @return [Array<Integer>]
26
+ def to_int_array
27
+ values_array.map(&:to_i)
28
+ end
29
+
30
+ private
31
+
32
+ def values_array
33
+ @values_array ||= []
34
+ end
35
+ end
36
+ end
@@ -1,18 +1,34 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'eac_ruby_utils/listable'
3
4
  require 'eac_ruby_utils/simple_cache'
4
5
 
5
6
  module EacRubyUtils
6
7
  module Envs
7
8
  class Executable
9
+ include ::EacRubyUtils::Listable
8
10
  include ::EacRubyUtils::SimpleCache
9
11
 
10
- attr_reader :env, :name, :check_args
12
+ lists.add_symbol :option, :check_args, :auto_validate
13
+
14
+ DEFAULT_AUTO_VALIDATE = true
15
+
16
+ attr_reader :env, :name, :options
11
17
 
12
18
  def initialize(env, name, *check_args)
13
19
  @env = env
14
20
  @name = name
15
- @check_args = check_args
21
+ self.options = self.class.lists.option.hash_keys_validate!(check_args.extract_options!)
22
+ options[OPTION_CHECK_ARGS] = check_args unless options.key?(OPTION_CHECK_ARGS)
23
+ options.freeze
24
+ end
25
+
26
+ def auto_validate?
27
+ options.key?(OPTION_AUTO_VALIDATE) ? options[OPTION_AUTO_VALIDATE] : DEFAULT_AUTO_VALIDATE
28
+ end
29
+
30
+ def check_args
31
+ options[OPTION_CHECK_ARGS]
16
32
  end
17
33
 
18
34
  def exist?
@@ -32,7 +48,7 @@ module EacRubyUtils
32
48
  end
33
49
 
34
50
  def command(*command_args)
35
- validate!
51
+ validate! if auto_validate?
36
52
  env.command(*executable_args, *command_args)
37
53
  end
38
54
 
@@ -50,6 +66,8 @@ module EacRubyUtils
50
66
 
51
67
  private
52
68
 
69
+ attr_writer :options
70
+
53
71
  def exist_uncached
54
72
  env.command(*executable_args, *check_args).execute!
55
73
  true
@@ -5,15 +5,23 @@ require 'open3'
5
5
  module EacRubyUtils
6
6
  module Envs
7
7
  class Process
8
+ EXIT_CODE_KEY = :exit_code
9
+ ERR_KEY = :stderr
10
+ OUT_KEY = :stdout
11
+
8
12
  def initialize(command)
9
- @data = { command: command }
10
- @data[:stdout], @data[:stderr], @data[:exit_code] = Open3.capture3(command)
11
- @data[:exit_code] = @data[:exit_code].to_i
13
+ self.data = { command: command }
14
+ data[OUT_KEY], data[ERR_KEY], data[EXIT_CODE_KEY] = Open3.capture3(command)
15
+ data[EXIT_CODE_KEY] = data[EXIT_CODE_KEY].to_i
12
16
  end
13
17
 
14
18
  def to_h
15
- @data.dup
19
+ data.dup
16
20
  end
21
+
22
+ private
23
+
24
+ attr_accessor :data
17
25
  end
18
26
  end
19
27
  end
@@ -11,4 +11,15 @@ class Object
11
11
  "Argument \"#{argument_name}\" is not a #{klass}" \
12
12
  "(Actual class: #{self.class}, actual value: #{self})"
13
13
  end
14
+
15
+ # Raises a ArgumentError if +self.count+ is not equal to +count+.
16
+ #
17
+ # @return +self+
18
+ def assert_count(count, argument_name = 'unknown_argument_name')
19
+ return self if self.count == count
20
+
21
+ raise ::ArgumentError,
22
+ "Argument \"#{argument_name}\" has wrong elements count" \
23
+ "(Actual: #{self.count}, Required: #{count})"
24
+ end
14
25
  end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'active_support/core_ext/object/blank'
4
+ require 'addressable/uri'
5
+
6
+ class Object
7
+ # Convert +self+ to String and then to Addressable::URI. Return nil if +self+ is +blank?+.
8
+ #
9
+ # @return [Addressable::URI]
10
+ def to_uri
11
+ return self if is_a?(::Addressable::URI)
12
+
13
+ to_s.blank? ? nil : ::Addressable::URI.parse(to_s)
14
+ end
15
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/fs/extname'
4
+ require 'pathname'
5
+
6
+ class Pathname
7
+ def basename_noext(limit = 1)
8
+ basename(::EacRubyUtils::Fs.extname(basename.to_path, limit))
9
+ end
10
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'pathname'
4
+
5
+ class Pathname
6
+ # A .glob that raises a ::RuntimeError if +self+ is not a directory.
7
+ # @return [Pathname]
8
+ def reqdir_glob(*args)
9
+ raise ::RuntimeError, "\"#{self}\" is not a directory" unless directory?
10
+
11
+ glob(*args)
12
+ end
13
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module EacRubyUtils
4
- VERSION = '0.85.0'
4
+ VERSION = '0.92.1'
5
5
  end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/bit_array'
4
+
5
+ RSpec.describe ::EacRubyUtils::BitArray do
6
+ describe '#to_byte_array' do
7
+ let(:instance) { described_class.new([0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1]) }
8
+
9
+ {
10
+ false => [0xF0, 0xDC],
11
+ true => [0x0F, 0x3B]
12
+ }.each do |big_endian, expected_bytes|
13
+ context "when big-endian is #{big_endian}" do
14
+ let(:expected_value) { ::EacRubyUtils::ByteArray.new(expected_bytes) }
15
+
16
+ it do
17
+ expect(instance.to_byte_array(big_endian)).to eq(expected_value)
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/byte'
4
+
5
+ RSpec.describe ::EacRubyUtils::Byte do
6
+ describe '#[]' do
7
+ let(:instance) { described_class.new(0xDC) }
8
+
9
+ [0, 0, 1, 1, 1, 0, 1, 1].each_with_index do |bit_value, bit_index|
10
+ context "when bit index is #{bit_index}" do
11
+ it { expect(instance[bit_index].value).to eq(bit_value) }
12
+ end
13
+ end
14
+ end
15
+
16
+ describe '#bit_set' do
17
+ let(:instance) { described_class.new(0b11011100) }
18
+
19
+ {
20
+ 0 => [0b11011100, 0b11011100, 0b11011000, 0b11010100,
21
+ 0b11001100, 0b11011100, 0b10011100, 0b01011100],
22
+ 1 => [0b11011101, 0b11011110, 0b11011100, 0b11011100,
23
+ 0b11011100, 0b11111100, 0b11011100, 0b11011100]
24
+ }.each do |bit_value, expected_values|
25
+ expected_values.each_with_index do |expected_value, bit_index|
26
+ context "when bit index is #{bit_index} and bit value is #{bit_value}" do
27
+ it do
28
+ expect(instance.bit_set(bit_index, bit_value))
29
+ .to eq(described_class.new(expected_value))
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+
36
+ describe '#from_bit_array' do
37
+ let(:bit_array) { [0, 0, 1, 1, 1, 0, 1, 1] }
38
+
39
+ { false => 0b11011100, true => 0b00111011 }.each do |big_endian, expected_integer|
40
+ context "when big-endian is #{big_endian}" do
41
+ let(:expected_value) { described_class.new(expected_integer) }
42
+
43
+ it do
44
+ expect(described_class.from_bit_array(bit_array, big_endian)).to eq(expected_value)
45
+ end
46
+ end
47
+ end
48
+
49
+ it do
50
+ expect { described_class.from_bit_array([0, 0, 1, 1, 1, 0, 1]) }
51
+ .to raise_error(::ArgumentError)
52
+ end
53
+ end
54
+ end