codec 0.0.4 → 0.0.5

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/bitmap.rb CHANGED
@@ -44,28 +44,28 @@ module Codec
44
44
  def encode(field)
45
45
  fields = field.get_value
46
46
  encoded_fields = []
47
- fields_list = fields.collect{|id,sf| id.to_i}
47
+ fields_list = fields.collect{|sf| sf.get_id.to_i}
48
48
  # Add field for bitmaps
49
49
  bitmap_fields = @num_extended_bitmaps[0,(fields_list.last - 1) / bitmap_length]
50
50
  fields_list += bitmap_fields
51
- fields += bitmap_fields.collect {|id| [id,nil]}
52
- fields.sort!{|a,b| a.first.to_i <=> b.first.to_i}
51
+ fields += bitmap_fields.collect {|id| Field.new(id)}
52
+ fields.sort!{|a,b| a.get_id.to_i <=> b.get_id.to_i}
53
53
  # Encode first bitmap
54
54
  out = encode_bitmap(fields_list,0)
55
55
  bitmap_index = 1
56
- fields.each do |id,sf|
57
- codec = @subCodecs[id]
58
- if @num_extended_bitmaps.include?(id)
56
+ fields.each do |sf|
57
+ codec = @subCodecs[sf.get_id]
58
+ if @num_extended_bitmaps.include?(sf.get_id)
59
59
  out += encode_bitmap(fields_list,bitmap_index)
60
60
  bitmap_index += 1
61
61
  elsif codec.nil?
62
- raise EncodingException, "unknown codec for subfield #{id}"
63
- elsif encoded_fields.include?(id.to_i)
64
- raise EncodingException, "Multiple subfield #{id} is invalid for Codec::Bitmap"
62
+ raise EncodingException, "unknown codec for subfield #{sf.get_id}"
63
+ elsif encoded_fields.include?(sf.get_id.to_i)
64
+ raise EncodingException, "Multiple subfield #{sf.get_id} is invalid for Codec::Bitmap"
65
65
  else
66
66
  out += codec.encode(sf)
67
67
  end
68
- encoded_fields << id.to_i
68
+ encoded_fields << sf.get_id.to_i
69
69
  end
70
70
  return out
71
71
  end
@@ -99,4 +99,4 @@ module Codec
99
99
  return msg,buf
100
100
  end
101
101
  end
102
- end
102
+ end
@@ -12,10 +12,10 @@ module Codec
12
12
  def encode(field)
13
13
  subfields = field.get_value
14
14
  composed_encoder = subfields.zip(@subCodecs).collect {|sf,sc|
15
- if sf.first != sc.first
15
+ if sf.get_id != sc.first
16
16
  raise EncodingException, "subfield #{sf.first} not correspond to subcodec #{sc.first}"
17
17
  end
18
- [sc.last,sf.last]
18
+ [sc.last,sf]
19
19
  }
20
20
  out = ""
21
21
  composed_encoder.each do |subcodec,subfield|
@@ -80,4 +80,4 @@ module Codec
80
80
  super(field)
81
81
  end
82
82
  end
83
- end
83
+ end
data/lib/codec/field.rb CHANGED
@@ -14,27 +14,29 @@ module Codec
14
14
  end
15
15
 
16
16
  def self.from_array(id,fields_array)
17
- f = Field.new(id)
18
- fields_array.each do |id,value|
19
- if value.kind_of?(Array)
20
- sf = Field.from_array(id,value)
21
- else
22
- sf = Field.new(id,value)
23
- end
24
- f.add_sub_field(sf)
25
- end
17
+ f = Field.new(id,fields_array)
26
18
  return f
27
19
  end
28
20
 
29
21
  def ==(other)
30
- (@id == other.get_id && @value == other.get_value)
22
+ (@id == other.id && @value == other.value)
31
23
  end
32
24
 
33
25
  def get_id ; @id; end
34
26
 
35
27
  def set_id id ; @id = id ; end
36
28
 
37
- def get_value ; @value; end
29
+ def get_value
30
+ if @value.kind_of?(Array)
31
+ v = []
32
+ @value.each{|id,value|
33
+ v << Field.new(id,value)
34
+ }
35
+ return v
36
+ else
37
+ return @value
38
+ end
39
+ end
38
40
 
39
41
  def set_value(value)
40
42
  raise "Error can not set value that is instance of Array" if value.kind_of? Array
@@ -45,7 +47,7 @@ module Codec
45
47
  def add_sub_field(sf)
46
48
  @value = [] if @value == ""
47
49
  raise "Add impossible on not Array valued field" unless @value.kind_of? Array
48
- @value << [sf.get_id,sf]
50
+ @value << [sf.id,sf.value]
49
51
  end
50
52
 
51
53
  def get_sf_recursivly(ids)
@@ -59,11 +61,45 @@ module Codec
59
61
  end
60
62
  end
61
63
 
64
+ def search(path,separator='.')
65
+ get_sf_recursivly(path.split(separator))
66
+ end
67
+
62
68
  def get_deep_field(path,separator='.')
63
69
  get_sf_recursivly(path.split(separator))
64
70
  end
65
71
 
66
- def get_sub_field(id)
72
+ def set_node(value,new_value,path_ids)
73
+ is_set = false
74
+ value = value.collect{|id,val|
75
+ if id != path_ids.first
76
+ [id,val]
77
+ else
78
+ is_set = true
79
+ if path_ids.size == 1
80
+ [id,new_value]
81
+ else
82
+ [id,set_node(val,new_value,path_ids.slice(1,path_ids.size))]
83
+ end
84
+ end
85
+ }
86
+ unless is_set
87
+ if path_ids.size == 1
88
+ value << [path_ids.first,new_value]
89
+ else
90
+ value << [path_ids.first,set_node_rec([],new_value,
91
+ path_ids.slice(1,path_ids.size))]
92
+ end
93
+ end
94
+ return value
95
+ end
96
+
97
+ def set_deep_field(sf,path,separator='.')
98
+ @value = set_node(@value,sf.value,path.split(separator))
99
+ self
100
+ end
101
+
102
+ def get_sub_field(id)
67
103
  sf_rec = get_sub_fields(id)
68
104
  if sf_rec.nil?
69
105
  return NilField.new
@@ -79,8 +115,12 @@ module Codec
79
115
  sf_rec = @value.select{|v| v.first == id}.collect{|v| v.last}
80
116
  if sf_rec == []
81
117
  return NilField.new
82
- else
83
- return sf_rec
118
+ elsif sf_rec.size == 1
119
+ return [Field.new(id,sf_rec.first)]
120
+ else
121
+ sfs = []
122
+ sf_rec.each{|v| sfs << Field.new(id,v)}
123
+ return sfs
84
124
  end
85
125
  end
86
126
 
@@ -95,6 +135,7 @@ module Codec
95
135
  else
96
136
  tab + @id + ": " + @value.to_s + "\n"
97
137
  end
98
- end
138
+ end
139
+ attr_reader :id,:value
99
140
  end
100
141
  end
data/lib/codec/fix.rb CHANGED
@@ -31,6 +31,7 @@ module Codec
31
31
  end
32
32
  out = out[0,maxlength]
33
33
  end
34
+ out = 0.chr if out == ""
34
35
  return out.reverse
35
36
  end
36
37
  end
@@ -85,4 +86,4 @@ module Codec
85
86
  return out
86
87
  end
87
88
  end
88
- end
89
+ end
data/lib/codec/prefix.rb CHANGED
@@ -91,11 +91,14 @@ module Codec
91
91
  head_field = field.get_sub_field(@length_codec.id)
92
92
  length_field = head_field.get_deep_field(@path,@separator)
93
93
  if length_field.nil?
94
- raise EncodingException,"Length field #{@path} is not present in header for encoding #{@id} =>
95
- #{field.to_yaml}"
94
+ raise EncodingException,"Length field #{@path} is not present in
95
+ header for encoding #{@id} => #{field.to_yaml}"
96
96
  end
97
97
  # update length field in header
98
+ # TOFIX: No more working after field refactoring due
99
+ # => need to implement set_deep_field
98
100
  length_field.set_value(content.length)
101
+ head_field.set_deep_field(length_field,@path,@separator)
99
102
  # encode header
100
103
  header = @length_codec.encode(head_field)
101
104
  return header + content
@@ -133,4 +136,4 @@ module Codec
133
136
  return out
134
137
  end
135
138
  end
136
- end
139
+ end
data/lib/codec/tlv.rb CHANGED
@@ -16,10 +16,10 @@ module Codec
16
16
  def encode(field)
17
17
  out = ""
18
18
  fields = field.get_value
19
- fields.each do |id,sf|
20
- out += @tag_codec.encode(Field.new(id,id))
21
- if @subCodecs[id]
22
- content = @subCodecs[id].encode(sf)
19
+ fields.each do |sf|
20
+ out += @tag_codec.encode(Field.new('*',sf.get_id))
21
+ if @subCodecs[sf.get_id]
22
+ content = @subCodecs[sf.get_id].encode(sf)
23
23
  length_buffer = @length_codec.encode(Field.new('*',content.length))
24
24
  out += length_buffer + content
25
25
  else
@@ -164,13 +164,13 @@ module Codec
164
164
 
165
165
  while subfields.size > 0
166
166
  subfield = subfields.shift
167
- out += tag_encode(subfield.first)
167
+ out += tag_encode(subfield.get_id)
168
168
  # TODO : Handle value that is not String
169
- value = value_encode(subfield.last.get_value)
169
+ value = value_encode(subfield.get_value)
170
170
  out += length_encode(value.length)
171
171
  out += value
172
172
  end
173
173
  return out
174
174
  end
175
175
  end
176
- end
176
+ end
data/lib/codec/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Codec
2
- VERSION = "0.0.4"
2
+ VERSION = "0.0.5"
3
3
  end
data/lib/codec.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require 'log4r'
2
2
  require 'codec/version'
3
+ require 'codec/logger'
3
4
  require 'codec/field'
4
5
  require 'codec/exceptions'
5
6
  require 'codec/base'
@@ -11,20 +12,5 @@ require 'codec/bitmap'
11
12
  require 'codec/tlv'
12
13
 
13
14
  module Codec
14
-
15
- Logger = Log4r::Logger.new 'parserLog'
16
- Logger.outputters = Log4r::Outputter.stderr
17
- Logger.level=Log4r::INFO
18
- protocols = []
19
-
20
- if defined?(CODEC_CONST).nil?
21
- CODEC_CONST = true
22
- end
23
-
24
-
25
- def self.register_protocol(protocol)
26
- protocols << protocol
27
- return protocols
28
- end
29
-
15
+ # TODO : here implements Module constants and methods
30
16
  end
@@ -10,6 +10,7 @@ describe Codec::Bitmap do
10
10
  subject.add_sub_codec('3', Codec::String.new('*',3))
11
11
  subject.add_sub_codec('15', Codec::Numbin.new('*',2))
12
12
  @buffer = ["1100000000000010","012ABCDE","0012"].pack("B*A*H*")
13
+ @field = Codec::Field.from_array('Bitmap',[['1',12],['2','ABCDE'],['15',18]])
13
14
  end
14
15
 
15
16
  it "must be a BaseComposed codec" do
@@ -17,10 +18,7 @@ describe Codec::Bitmap do
17
18
  end
18
19
 
19
20
  it "must generate composed field from buffer" do
20
- subject.decode(@buffer).first.
21
- get_value.collect{ |id,f|
22
- [id,f.get_value]
23
- }.must_equal([['1',12],['2',"ABCDE"],['15',18]])
21
+ subject.decode(@buffer).first.must_equal(@field)
24
22
  end
25
23
 
26
24
  end
@@ -37,9 +35,10 @@ describe Codec::Bitmap do
37
35
  subject.add_sub_codec('18', Codec::Numbin.new('*',2))
38
36
  subject.add_sub_codec('21', Codec::String.new('*',5))
39
37
  @buffer_1 = ["11000000000000000100100000000000","012","0012","ABCDE"].pack("B*A*H*A*")
40
- @buffer2 = ["0110000000000000","012","ABCDE"].pack("B*A3A5")
38
+ @buffer_2 = ["0110000000000000","012","ABCDE"].pack("B*A3A5")
41
39
  @field_1 = Codec::Field.from_array('MultipleBitmap',[['2',12],['18',18],['21',"ABCDE"]])
42
- @field_2 = Codec::Field.from_array('MultipleBitmap',[['2',12],['41',18],['21',"ABCDE"]])
40
+ @field_2 = Codec::Field.from_array('MultipleBitmap',[['2',12],['3','ABCDE']])
41
+ @field_3 = Codec::Field.from_array('MultipleBitmap',[['2',12],['41',18],['21',"ABCDE"]])
43
42
  end
44
43
 
45
44
  it "must be a Bitmap codec" do
@@ -47,17 +46,11 @@ describe Codec::Bitmap do
47
46
  end
48
47
 
49
48
  it "must generate composed field from buffer with extended bitmap" do
50
- subject.decode(@buffer_1).first.
51
- get_value.collect{ |id,f|
52
- [id,f.get_value]
53
- }.must_equal([['2',12],['18',18],['21',"ABCDE"]])
49
+ subject.decode(@buffer_1).first.must_equal(@field_1)
54
50
  end
55
51
 
56
52
  it "must generate composed field from buffer without extended bitmap" do
57
- subject.decode(@buffer2).first.
58
- get_value.collect{ |id,f|
59
- [id,f.get_value]
60
- }.must_equal([['2',12],['3',"ABCDE"]])
53
+ subject.decode(@buffer_2).first.must_equal(@field_2)
61
54
  end
62
55
 
63
56
  it "must generate buffer from composed field" do
@@ -65,7 +58,7 @@ describe Codec::Bitmap do
65
58
  end
66
59
 
67
60
  it "must raise Encoding exception if subfield is unknown" do
68
- proc { subject.encode(@field_2) }.must_raise(Codec::EncodingException)
61
+ proc { subject.encode(@field_3) }.must_raise(Codec::EncodingException)
69
62
  end
70
63
 
71
- end
64
+ end
@@ -56,7 +56,28 @@ describe Codec::Tlv do
56
56
  subject.encode(@field).must_equal(@buffer)
57
57
  end
58
58
  end
59
+
60
+
61
+ describe Codec::Tlv do
62
+ subject {
63
+ tag = Codec::Binary.new('T',1)
64
+ length = Codec::Numbin.new('L',1)
65
+ value = Codec::Numbin.new('V',0)
66
+ Codec::Tlv.new('TAG',length,tag,value) }
67
+ before do
68
+ @buffer = ["9501009C010181020200"].pack("H*")
69
+ @field = Codec::Field.from_array('TAG',
70
+ [['95',0],['9C',1],['81',512]])
71
+ end
59
72
 
73
+ it "must decode TLV buffer to field" do
74
+ subject.decode(@buffer).first.must_equal(@field)
75
+ end
76
+
77
+ it "must encode TLV field to buffer" do
78
+ subject.encode(@field).must_equal(@buffer)
79
+ end
80
+ end
60
81
 
61
82
  describe Codec::Bertlv do
62
83
  subject { Codec::Bertlv.new('Bertlv') }
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.4
4
+ version: 0.0.5
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-08-14 00:00:00.000000000 Z
12
+ date: 2013-08-16 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler