codec 0.0.5 → 0.0.7

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.
data/lib/codec/base.rb CHANGED
@@ -21,7 +21,20 @@ module Codec
21
21
  l = eval_length(buf,@length)
22
22
  return build_field(buf,l),buf[l,buf.length]
23
23
  end
24
+
25
+ def encode(field)
26
+ return field.get_value
27
+ end
28
+
29
+ def encode_with_length(field)
30
+ buf = encode(field)
31
+ return buf.length, buf
32
+ end
24
33
 
34
+ def get_length(field)
35
+ field.get_value.length
36
+ end
37
+
25
38
  def eval_length(buf,length)
26
39
  length = 0 if length.nil?
27
40
  if(length != 0)
@@ -10,6 +10,7 @@ module Codec
10
10
  end
11
11
 
12
12
  def encode(field)
13
+ return "" if field.empty?
13
14
  subfields = field.get_value
14
15
  composed_encoder = subfields.zip(@subCodecs).collect {|sf,sc|
15
16
  if sf.get_id != sc.first
data/lib/codec/field.rb CHANGED
@@ -13,6 +13,10 @@ module Codec
13
13
  @value = value
14
14
  end
15
15
 
16
+ def empty?
17
+ return true if @value == ""
18
+ end
19
+
16
20
  def self.from_array(id,fields_array)
17
21
  f = Field.new(id,fields_array)
18
22
  return f
@@ -38,9 +42,13 @@ module Codec
38
42
  end
39
43
  end
40
44
 
41
- def set_value(value)
42
- raise "Error can not set value that is instance of Array" if value.kind_of? Array
43
- @value = value
45
+ def set_value(value,path = nil,separator =".")
46
+ if path.nil?
47
+ raise "Error can not set value that is instance of Array" if value.kind_of? Array
48
+ @value = value
49
+ else
50
+ @value = set_node(@value,value,path.split(separator))
51
+ end
44
52
  return self
45
53
  end
46
54
 
@@ -123,19 +131,7 @@ module Codec
123
131
  return sfs
124
132
  end
125
133
  end
126
-
127
- def to_yaml(tab="")
128
- if @value.kind_of? Array
129
- s = tab + @id +": \n"
130
- tab += " "
131
- @value.each{|v|
132
- s += v.last.to_yaml(tab)
133
- }
134
- return s
135
- else
136
- tab + @id + ": " + @value.to_s + "\n"
137
- end
138
- end
134
+
139
135
  attr_reader :id,:value
140
136
  end
141
137
  end
@@ -0,0 +1,5 @@
1
+ module Codec
2
+ Logger = Log4r::Logger.new 'codec_logger'
3
+ Logger.outputters = Log4r::Outputter.stderr
4
+ Logger.level=Log4r::INFO
5
+ end
data/lib/codec/packed.rb CHANGED
@@ -4,7 +4,7 @@ module Codec
4
4
  ((length + 1) / 2)
5
5
  end
6
6
 
7
- def eval_pck_length(field)
7
+ def get_length(field)
8
8
  if @length > 0
9
9
  return @length
10
10
  else
@@ -12,6 +12,10 @@ module Codec
12
12
  end
13
13
  end
14
14
 
15
+ def encode_with_length(field)
16
+ return get_length(field),encode(field)
17
+ end
18
+
15
19
  def decode_with_length(buf,length)
16
20
  l = eval_length(buf,get_pck_length(length))
17
21
  return build_field(buf,l),buf[l,buf.length]
data/lib/codec/prefix.rb CHANGED
@@ -43,8 +43,8 @@ module Codec
43
43
  end
44
44
 
45
45
  def encode(field)
46
- val = @value_codec.encode(field)
47
- length = @length_codec.encode(Field.new.set_value(val.length))
46
+ l, val = @value_codec.encode_with_length(field)
47
+ length = @length_codec.encode(Field.new.set_value(l))
48
48
  out = length + val
49
49
  return out
50
50
  end
@@ -87,18 +87,12 @@ module Codec
87
87
 
88
88
  def encode(field)
89
89
  # encode content
90
- content = @value_codec.encode(field.get_sub_field(@value_codec.id))
90
+ content_field = field.get_sub_field(@value_codec.id)
91
+ length, content = @value_codec.encode_with_length(content_field)
91
92
  head_field = field.get_sub_field(@length_codec.id)
92
93
  length_field = head_field.get_deep_field(@path,@separator)
93
- if length_field.nil?
94
- raise EncodingException,"Length field #{@path} is not present in
95
- header for encoding #{@id} => #{field.to_yaml}"
96
- end
97
94
  # update length field in header
98
- # TOFIX: No more working after field refactoring due
99
- # => need to implement set_deep_field
100
- length_field.set_value(content.length)
101
- head_field.set_deep_field(length_field,@path,@separator)
95
+ head_field.set_value(length,@path,@separator)
102
96
  # encode header
103
97
  header = @length_codec.encode(head_field)
104
98
  return header + content
data/lib/codec/tlv.rb CHANGED
@@ -2,6 +2,9 @@ module Codec
2
2
  class Tlv < Prefixedlength
3
3
  def initialize(id,length,header,content)
4
4
  super(id,length,content)
5
+ unless header.kind_of?(Codec::Base)
6
+ raise InitializeException," Invalid tag codec for Tlv class"
7
+ end
5
8
  @tag_codec = header
6
9
  @subCodecs = {}
7
10
  end
@@ -9,7 +12,7 @@ module Codec
9
12
  def decode_with_length(buf,length)
10
13
  l = eval_length(buf,length)
11
14
  f,r = decode(buf[0,l])
12
- Logger.warn("Remain data in a tlv buffer :[#{r.unpack("H*").first}]") if r.length > 0
15
+ Logger.warn("Remain data in a tlv buffer :[#{r.unpack("H*").first}]") if r.nil? || r.length > 0
13
16
  return f,buf[l,buf.length]
14
17
  end
15
18
 
@@ -34,11 +37,13 @@ module Codec
34
37
  while(buffer.length > 0)
35
38
  begin
36
39
  tag,buffer = @tag_codec.decode(buffer)
37
- rescue
40
+ rescue => e
38
41
  val = Field.new("ERR")
39
- val.set_value("Error on parsing tag for TLV with following data [#{buffer.unpack("H*").first}]")
42
+ val.set_value("[#{buffer.unpack("H*").first}]")
40
43
  msg.add_sub_field(val)
41
- return msg
44
+ Logger.error("in #{@id} tlv codec: #{e.message}\n #{e.backtrace.join(10.chr)}")
45
+ Logger.error("Decoding failed for #{id} : #{msg.to_yaml}")
46
+ return msg,""
42
47
  end
43
48
  begin
44
49
  if @subCodecs[tag.get_value.to_s].nil?
data/lib/codec/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Codec
2
- VERSION = "0.0.5"
2
+ VERSION = "0.0.7"
3
3
  end
@@ -13,7 +13,7 @@ describe Codec::Packed do
13
13
  end
14
14
 
15
15
  it "must retrieve field length" do
16
- subject.eval_pck_length(@f_pck).must_equal(6)
16
+ subject.get_length(@f_pck).must_equal(6)
17
17
  end
18
18
 
19
19
  end
@@ -28,6 +28,35 @@ describe Codec::Prefixedlength do
28
28
  end
29
29
  end
30
30
 
31
+ describe Codec::Prefixedlength do
32
+ before do
33
+ @length = Codec::Numasc.new('length',3)
34
+ @content = Codec::Strpck.new('content',0)
35
+ @field = Codec::Field.new
36
+ @field.set_value("0012AB")
37
+ @buffer = "006" +["0012AB"].pack("H*")
38
+ end
39
+
40
+ subject { Codec::Prefixedlength.new('Test_lvar',@length,@content) }
41
+
42
+ it "must be a Prefixedlength codec" do
43
+ subject.must_be_instance_of(Codec::Prefixedlength)
44
+ end
45
+
46
+ it "must generate a field with computed value" do
47
+ subject.decode(@buffer).first.get_value.upcase.must_equal("0012AB")
48
+ end
49
+
50
+ it "must also return remaining data" do
51
+ subject.decode(@buffer).last.must_equal("")
52
+ end
53
+
54
+ it "must encode value prefixed with length" do
55
+ subject.encode(@field).must_equal(@buffer)
56
+ end
57
+ end
58
+
59
+
31
60
  describe Codec::Headerlength do
32
61
  before do
33
62
  tag = Codec::Binary.new('T',1)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: codec
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.7
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -81,6 +81,7 @@ files:
81
81
  - lib/codec/factory.rb
82
82
  - lib/codec/field.rb
83
83
  - lib/codec/fix.rb
84
+ - lib/codec/logger.rb
84
85
  - lib/codec/packed.rb
85
86
  - lib/codec/prefix.rb
86
87
  - lib/codec/tlv.rb