leon 1.0.3 → 1.0.6

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 (3) hide show
  1. data/lib/io.rb +17 -16
  2. data/lib/leon.rb +156 -0
  3. metadata +1 -1
data/lib/io.rb CHANGED
@@ -19,12 +19,9 @@ module LEON
19
19
  end
20
20
  def readString()
21
21
  ret = ''
22
- while (true) do
23
- char = @buffer.readUInt8()
24
- if char === 0
25
- break
26
- end
27
- ret += char.chr
22
+ len = @buffer.readValue(@buffer.readUInt8())
23
+ for i in 0...len
24
+ ret += @buffer.readUInt8.chr
28
25
  end
29
26
  return ret
30
27
  end
@@ -104,7 +101,7 @@ module LEON
104
101
  return ret
105
102
  elsif spec.is_a?(Hash)
106
103
  ret = Hash.new
107
- spec.each do |k, v|
104
+ Hash[spec.sort].each do |k, v|
108
105
  ret[k] = parseValueWithSpec(v)
109
106
  end
110
107
  return ret
@@ -276,9 +273,15 @@ module LEON
276
273
  writeValueWithSpec(v, spec[0])
277
274
  }
278
275
  elsif spec.kind_of? Hash
279
- spec.each { |k, v|
280
- writeValueWithSpec(val[k], v)
281
- }
276
+ if val.kind_of? Hash
277
+ spec.sort.each { |k, v|
278
+ writeValueWithSpec(val[k], v)
279
+ }
280
+ else
281
+ spec.sort.each { |k, v|
282
+ writeValueWithSpec(val.send(k), v)
283
+ }
284
+ end
282
285
  elsif spec === Constants::BOOLEAN
283
286
  writeValue(val, LEON::type_check(val), true)
284
287
  else
@@ -409,14 +412,12 @@ module LEON
409
412
  end
410
413
  end
411
414
  def writeString(str)
412
- bytes = StringBuffer.new
413
415
  len = str.length
414
- for i in 0..(len - 1)
415
- bytes.writeUInt8(str[i].ord, -1)
416
+ writeValue(len, LEON::type_check(len))
417
+ for i in 0...len
418
+ writeValue(str[i].ord, Constants::UNSIGNED_CHAR, true)
416
419
  end
417
- bytes.writeUInt8(0, -1)
418
- append(bytes)
419
- return len + 1
420
+ return len + 2
420
421
  end
421
422
  def writeOLI()
422
423
  if @stringIndex.length === 0
data/lib/leon.rb CHANGED
@@ -20,6 +20,162 @@ module LEON
20
20
  def self.generate(payload)
21
21
  Encoder.new(payload).writeSI().writeOLI().writeData().export()
22
22
  end
23
+ def self.type_to_str(type)
24
+ case type
25
+ when Constants::UNSIGNED_CHAR
26
+ return "unsigned char"
27
+ when Constants::CHAR
28
+ return "char"
29
+ when Constants::UNSIGNED_SHORT
30
+ return "unsigned short"
31
+ when Constants::SHORT
32
+ return "short"
33
+ when Constants::UNSIGNED_INT
34
+ return "unsigned int"
35
+ when Constants::INT
36
+ return "int"
37
+ when Constants::FLOAT
38
+ return "float"
39
+ when Constants::DOUBLE
40
+ return "double"
41
+ when Constants::STRING
42
+ return "string"
43
+ when Constants::BOOLEAN
44
+ return "boolean"
45
+ when Constants::NULL
46
+ return "null"
47
+ when Constants::UNDEFINED
48
+ return "undefined"
49
+ when Constants::OBJECT, Constants::NATIVE_OBJECT
50
+ return "object"
51
+ when Constants::ARRAY
52
+ return "array"
53
+ when Constants::DATE
54
+ return "date"
55
+ when Constants::BUFFER
56
+ return "buffer"
57
+ when Constants::REGEXP
58
+ return "RegExp"
59
+ when Constants::NAN
60
+ return "NaN"
61
+ when Constants::INFINITY
62
+ return "infinity"
63
+ when Constants::MINUS_INFINITY
64
+ return "minus infinity"
65
+ end
66
+ end
67
+ def self.type_gcd(arr)
68
+ type = LEON::type_check(arr[0])
69
+ if type === Constants::BOOLEAN + 1
70
+ type = Constants::BOOLEAN
71
+ end
72
+ case type
73
+ when Constants::ARRAY
74
+ return [ self.type_gcd(arr[0]) ]
75
+ when Constants::OBJECT
76
+ ret = Hash.new
77
+ arr[0].each { |k, v|
78
+ ret[k] = self.type_gcd(self.pluck(arr, k))
79
+ }
80
+ return ret
81
+ when Constants::NATIVE_OBJECT
82
+ ret = Hash.new
83
+ vars = arr[0].instance_variables.map { |v|
84
+ v.to_sym.sub("@", "")
85
+ }
86
+ vars.each { |v|
87
+ ret[v] = self.type_gcd(self.pluck(arr, v))
88
+ }
89
+ return ret
90
+ when Constants::UNSIGNED_CHAR, Constants::CHAR, Constants::UNSIGNED_SHORT, Constants::SHORT, Constants::UNSIGNED_INT, Constants::INT, Constants::FLOAT, Constants::DOUBLE
91
+ highestMagnitude = arr[0].abs
92
+ if arr[0] < 0
93
+ sign = 1
94
+ else
95
+ sign = 0
96
+ end
97
+ if type === Constants::FLOAT or type === Constants::DOUBLE
98
+ fp = 1
99
+ else
100
+ fp = 0
101
+ end
102
+ for i in 1...arr.length
103
+ type = LEON::type_check(arr[i])
104
+ if not arr[i].kind_of? Float and not arr[i].kind_of? Fixnum
105
+ raise "Expected a numerical value but got #{self.type_to_str(type)}."
106
+ end
107
+ if arr[i].abs > highestMagnitude
108
+ highestMagnitude = arr[1]
109
+ end
110
+ if arr[i].ceil != arr[i]
111
+ fp = 1
112
+ else
113
+ fp = 0
114
+ end
115
+ end
116
+ return self.type_check((fp ? Float((sign ? -highestMagnitude : highestMagnitude )) : (sign ? -highestMagnitude : highestMagnitude )))
117
+ else
118
+ for i in 1...(arr.length)
119
+ thisType = self.type_check(arr[i])
120
+ if thisType === Constants::BOOLEAN + 1
121
+ thisType = Constants::BOOLEAN
122
+ end
123
+ if type != thisType
124
+ raise "Was expecting a #{self.type_to_str(type)} but got a #{self.type_to_str(thisType)}."
125
+ end
126
+ end
127
+ return type
128
+ end
129
+ return type
130
+ end
131
+ def self.pluck(arr, prop)
132
+ ret = Array.new
133
+ if prop.kind_of? Symbol
134
+ prop = prop.to_s
135
+ end
136
+ for i in 0...(arr.length)
137
+ if arr[i].kind_of? Hash
138
+ if not arr[i].has_key? prop
139
+ if not arr[i].has_key? prop.to_sym
140
+ raise "Object #{i} in array has no such key \"#{prop}.\""
141
+ else
142
+ ret.push arr[i][prop.to_sym]
143
+ end
144
+ else
145
+ ret.push arr[i][prop]
146
+ end
147
+ elsif arr[i].kind_of? Object
148
+ begin
149
+ ret.push arr[i].send(prop)
150
+ rescue
151
+ raise "Object #{i} in array has no such property \"#{prop}.\""
152
+ end
153
+ end
154
+ end
155
+ return ret
156
+ end
157
+ def self.to_template(payload)
158
+ type = self.type_check(payload)
159
+ case type
160
+ when Constants::ARRAY
161
+ return [self.type_gcd(payload)]
162
+ when Constants::OBJECT
163
+ ret = Hash.new
164
+ payload.each { |k, v|
165
+ ret[k] = self.to_template(v)
166
+ }
167
+ return ret
168
+ when Constants::NATIVE_OBJECT
169
+ ret = Hash.new
170
+ payload.instance_variables.each { |k, v|
171
+ ret[k] = self.to_template(v)
172
+ }
173
+ when Constants::BOOLEAN + 1
174
+ return Constants::BOOLEAN
175
+ else
176
+ return type
177
+ end
178
+ end
23
179
  end
24
180
  class Object
25
181
  def to_leon()
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: leon
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 1.0.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors: