cauterize 0.0.1.pre5 → 0.0.1.pre7

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 (52) hide show
  1. data/README.md +9 -0
  2. data/Rakefile +1 -1
  3. data/bin/cauterize +1 -1
  4. data/cauterize.gemspec +1 -0
  5. data/example/Cauterize +15 -9
  6. data/example/build.sh +3 -0
  7. data/example/doc_cauterize_output/example_project.txt +124 -0
  8. data/example/ruby_ex.rb +14 -0
  9. data/lib/cauterize.rb +117 -0
  10. data/lib/cauterize/base_type.rb +3 -2
  11. data/lib/cauterize/builders.rb +18 -2
  12. data/lib/cauterize/builders/c/group.rb +2 -3
  13. data/lib/cauterize/builders/cs/group.rb +2 -3
  14. data/lib/cauterize/builders/doc/buildable.rb +30 -0
  15. data/lib/cauterize/builders/doc/builtin.rb +21 -0
  16. data/lib/cauterize/builders/doc/composite.rb +23 -0
  17. data/lib/cauterize/builders/doc/enumeration.rb +24 -0
  18. data/lib/cauterize/builders/doc/fixed_array.rb +26 -0
  19. data/lib/cauterize/builders/doc/group.rb +29 -0
  20. data/lib/cauterize/builders/doc/scalar.rb +21 -0
  21. data/lib/cauterize/builders/doc/variable_array.rb +26 -0
  22. data/lib/cauterize/builtin.rb +2 -2
  23. data/lib/cauterize/c_builder.rb +5 -0
  24. data/lib/cauterize/cauterize.rb +7 -2
  25. data/lib/cauterize/composite.rb +8 -7
  26. data/lib/cauterize/cs_builder.rb +8 -5
  27. data/lib/cauterize/doc_builder.rb +34 -0
  28. data/lib/cauterize/enumeration.rb +5 -5
  29. data/lib/cauterize/fixed_array.rb +3 -3
  30. data/lib/cauterize/group.rb +18 -8
  31. data/lib/cauterize/scalar.rb +3 -3
  32. data/lib/cauterize/variable_array.rb +3 -3
  33. data/lib/cauterize/version.rb +1 -1
  34. data/spec/base_type_spec.rb +10 -0
  35. data/spec/builders/c/group_spec.rb +2 -2
  36. data/spec/builders/cs/group_spec.rb +1 -1
  37. data/spec/builders/doc/buildable_spec.rb +25 -0
  38. data/spec/builders_spec.rb +4 -2
  39. data/spec/builtin_spec.rb +2 -0
  40. data/spec/c_builder_spec.rb +12 -3
  41. data/spec/composite_spec.rb +11 -0
  42. data/spec/cs_builder_spec.rb +6 -2
  43. data/spec/doc_builder_spec.rb +247 -0
  44. data/spec/enumeration_spec.rb +2 -0
  45. data/spec/fixed_array_spec.rb +2 -0
  46. data/spec/group_spec.rb +4 -2
  47. data/spec/scalar_spec.rb +2 -0
  48. data/spec/spec_helper.rb +4 -0
  49. data/support/c/src/cauterize.h +1 -1
  50. data/support/cs/src/CauterizeFormatter.cs +7 -5
  51. data/support/cs/src/CauterizeTypes.cs +45 -5
  52. metadata +50 -18
@@ -8,8 +8,8 @@
8
8
  module Cauterize
9
9
  module_function
10
10
 
11
- def scalar(name)
12
- a = Cauterize.scalars[name] || Cauterize.scalars[name] = Scalar.new(name)
11
+ def scalar(name, desc=nil)
12
+ a = Cauterize.scalars[name] || Cauterize.scalars[name] = Scalar.new(name, desc)
13
13
  yield a if block_given?
14
14
  return a
15
15
  end
@@ -27,7 +27,7 @@ module Cauterize
27
27
  end
28
28
 
29
29
  class Scalar < BaseType
30
- def initialize(name)
30
+ def initialize(name, desc=nil)
31
31
  super
32
32
  end
33
33
 
@@ -1,8 +1,8 @@
1
1
  module Cauterize
2
2
  module_function
3
3
 
4
- def variable_array(name)
5
- a = Cauterize.variable_arrays[name] || Cauterize.variable_arrays[name] = VariableArray.new(name)
4
+ def variable_array(name, desc=nil)
5
+ a = Cauterize.variable_arrays[name] || Cauterize.variable_arrays[name] = VariableArray.new(name, desc)
6
6
  yield a if block_given?
7
7
  return a
8
8
  end
@@ -20,7 +20,7 @@ module Cauterize
20
20
  end
21
21
 
22
22
  class VariableArray < BaseType
23
- def intialize(name)
23
+ def intialize(name, desc=nil)
24
24
  super
25
25
  end
26
26
 
@@ -1,3 +1,3 @@
1
1
  module Cauterize
2
- VERSION = "0.0.1.pre5"
2
+ VERSION = "0.0.1.pre7"
3
3
  end
@@ -6,6 +6,16 @@ module Cauterize
6
6
  it { has_a_unique_id_for_each_instance(BaseType) }
7
7
  end
8
8
 
9
+ describe :description do
10
+ it "handles nil description" do
11
+ BaseType.new(:foo, nil).description.should be_nil
12
+ end
13
+
14
+ it "sets the description" do
15
+ BaseType.new(:foo, "a desc").description.should == "a desc"
16
+ end
17
+ end
18
+
9
19
  describe :type_str do
10
20
  it "is the hexadecimal representation of type" do
11
21
  f = Cauterize.enumeration(:foo) do |e|
@@ -12,7 +12,7 @@ module Cauterize
12
12
  @g = Cauterize.group!(:some_name) do |_g|
13
13
  _g.field(:a, :uint8_t)
14
14
  _g.field(:b, :uint8_t)
15
- _g.field(:c)
15
+ _g.dataless(:c)
16
16
  end
17
17
  @b = Cauterize::Builders::C::Group.new(@g)
18
18
  end
@@ -84,7 +84,7 @@ module Cauterize
84
84
  _g = Cauterize.group(:oof) do |g|
85
85
  g.field(:aaa, :int32)
86
86
  g.field(:bbb, :int32)
87
- g.field(:empty)
87
+ g.dataless(:empty)
88
88
  end
89
89
 
90
90
  Builders.get(:c, _g)
@@ -6,7 +6,7 @@ module Cauterize
6
6
  @g = Cauterize.group!(:some_name) do |_g|
7
7
  _g.field(:a, :uint8_t)
8
8
  _g.field(:b, :uint8_t)
9
- _g.field(:c)
9
+ _g.dataless(:c)
10
10
  _g.field(:d, :uint8_t)
11
11
  end
12
12
  @b = Cauterize::Builders::CS::Group.new(@g)
@@ -0,0 +1,25 @@
1
+ module Cauterize::Builders::Doc
2
+ describe Cauterize::Builders::Doc do
3
+ describe Buildable do
4
+ subject { Buildable.new(:some_blueprint) }
5
+
6
+ describe "required methods" do
7
+ it "raises errorson required interfaces" do
8
+ lambda {
9
+ REQUIRED_METHODS.each do |m|
10
+ subject.send(m)
11
+ end
12
+ }.should raise_error /must implement/
13
+ end
14
+ end
15
+
16
+ describe :method_missing do
17
+ it "calls the original if method not required" do
18
+ lambda {
19
+ subject.is_not_defined
20
+ }.should raise_error NoMethodError
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -43,8 +43,10 @@ module Cauterize
43
43
  }.should raise_error /already registered/
44
44
  end
45
45
 
46
- it "is nil if no builder is registered" do
47
- Cauterize::Builders.get(:c, s).should be_nil
46
+ it "raises exception no builder is registered" do
47
+ lambda {
48
+ Cauterize::Builders.get(:c, s)
49
+ }.should raise_error Cauterize::Builders::UnregisteredException
48
50
  end
49
51
  end
50
52
  end
data/spec/builtin_spec.rb CHANGED
@@ -13,6 +13,8 @@ module Cauterize
13
13
  end
14
14
  end
15
15
 
16
+ it { can_be_documented(BuiltIn) }
17
+
16
18
  describe :id do
17
19
  it "has a unique id for each builtin" do
18
20
  ids = Cauterize.builtins.values.map(&:id)
@@ -77,6 +77,10 @@ module Cauterize
77
77
  end
78
78
 
79
79
  describe "header generation" do
80
+ it "informs the user the code is generated" do
81
+ @h_text.should include("generated code. Do not edit")
82
+ end
83
+
80
84
  it "externs 'c'" do
81
85
  @h_lines.should include("extern \"C\" {\n")
82
86
  end
@@ -90,9 +94,10 @@ module Cauterize
90
94
  end
91
95
 
92
96
  it "prevents multiple inclusion in headers" do
93
- @h_lines[0].should match /#ifndef TESTING_H_\d+/
94
- @h_lines[1].should match /#define TESTING_H_\d+/
95
- @h_lines.last.should match /#endif \/\* TESTING_H_\d+ \*\//
97
+ @h_lines[2].should match /#ifndef TESTING_H_\d+/
98
+ @h_lines[3].should match /#define TESTING_H_\d+/
99
+ @h_lines[-2].should match /#endif \/\* TESTING_H_\d+ \*\//
100
+ @h_lines.last.should == "\n"
96
101
  end
97
102
 
98
103
  it "includes prototype information for all defined types" do
@@ -109,6 +114,10 @@ module Cauterize
109
114
  end
110
115
 
111
116
  describe "c body generation" do
117
+ it "informs the user the code is generated" do
118
+ @c_text.should include("generated code. Do not edit")
119
+ end
120
+
112
121
  it "includes the generated header file" do
113
122
  @c_text.should match /#include "testing.h"/
114
123
  end
@@ -20,6 +20,8 @@ module Cauterize
20
20
  end
21
21
  end
22
22
 
23
+ it { can_be_documented(Composite) }
24
+
23
25
  describe :fields do
24
26
  it "defines a new field in the composite" do
25
27
  a = Cauterize.scalar(:foo)
@@ -32,6 +34,15 @@ module Cauterize
32
34
  comp.fields.values[0].type.should be a
33
35
  end
34
36
 
37
+ it "supports a doc string" do
38
+ a = Cauterize.scalar(:foo)
39
+ comp = Cauterize.composite(:comp) do |c|
40
+ c.field :a_foo, :foo, "some foo"
41
+ end
42
+
43
+ comp.fields.values[0].description.should == "some foo"
44
+ end
45
+
35
46
  it "errors on duplicate field names" do
36
47
  a = Cauterize.scalar(:foo)
37
48
  lambda {
@@ -70,6 +70,10 @@ module Cauterize
70
70
  @cs_lines = @cs_text.lines.to_a
71
71
  end
72
72
 
73
+ it "informs the user the code is generated" do
74
+ @cs_text.should match /generated code. Do not edit/
75
+ end
76
+
73
77
  it "includes namespaces" do
74
78
  @cs_lines.should include("using System;\n")
75
79
  @cs_lines.should include("using Cauterize;\n")
@@ -80,8 +84,8 @@ module Cauterize
80
84
  end
81
85
 
82
86
  it "creates a cauterize info class with version and date" do
83
- @cs_text.should match /Name = \"Testing\";/
84
- @cs_text.should match /GeneratedVersion = \"1.2.3\";/
87
+ @cs_text.should match /Name = \"Testing\",/
88
+ @cs_text.should match /GeneratedVersion = \"1.2.3\",/
85
89
  @cs_text.should match /GeneratedDate = /
86
90
  end
87
91
 
@@ -0,0 +1,247 @@
1
+ require 'tmpdir'
2
+ require 'fileutils'
3
+
4
+ module Cauterize
5
+ describe Cauterize::DocBuilder do
6
+ before do
7
+ @tempdir = Dir.mktmpdir
8
+ @doc_path = File.join(@tempdir, "testing.txt")
9
+
10
+ @db = DocBuilder.new(@doc_path, "testing")
11
+ end
12
+
13
+ after do
14
+ FileUtils.rm_rf @tempdir
15
+ end
16
+
17
+ describe :initialize do
18
+ it "should save the name" do
19
+ @db.name.should == "testing"
20
+ @db.doc_path.should == @doc_path
21
+ end
22
+ end
23
+
24
+ describe :build do
25
+ before do
26
+ Cauterize.set_version("1.2.3")
27
+
28
+ Cauterize.scalar(:an_int, "a useful int") {|t| t.type_name :int32}
29
+ Cauterize.scalar(:another_int) {|t| t.type_name :int32}
30
+
31
+ Cauterize.composite(:a_composite, "some useful fields") do |t|
32
+ t.field :an_int, :int32, "a pretty integer"
33
+ t.field :another_int, :int32, "another pretty integer"
34
+ t.field :undescribed, :int32
35
+ end
36
+
37
+ Cauterize.composite(:mystery) do |t|
38
+ t.field :undescribed, :int32
39
+ end
40
+
41
+ Cauterize.fixed_array(:a_fixed_array, "a few things") do |t|
42
+ t.array_type :an_int
43
+ t.array_size 5
44
+ end
45
+
46
+ Cauterize.fixed_array(:a_mystery_array) do |t|
47
+ t.array_type :uint8
48
+ t.array_size 1
49
+ end
50
+
51
+ Cauterize.variable_array(:a_var_array, "maybe some things") do |t|
52
+ t.array_type :an_int
53
+ t.array_size 5
54
+ t.size_type :uint8
55
+ end
56
+
57
+ Cauterize.variable_array(:a_var_mystery) do |t|
58
+ t.array_type :uint8
59
+ t.array_size 1
60
+ t.size_type :uint8
61
+ end
62
+
63
+ Cauterize.enumeration(:some_colors, "several colors to choose from") do |t|
64
+ t.value :red
65
+ t.value :blue
66
+ t.value :green
67
+ end
68
+
69
+ Cauterize.enumeration(:mystery_things) do |t|
70
+ t.value :thing1
71
+ t.value :thing2
72
+ t.value :thing3
73
+ end
74
+
75
+ Cauterize.group(:oddness, "a mix of weird things") do |t|
76
+ t.field :a_color, :some_colors, "a color"
77
+ t.field :a_cool_int, :int16, "only cool ints fit here"
78
+ t.dataless :a_thing, "only a thing"
79
+ t.dataless :undescribed
80
+ end
81
+
82
+ Cauterize.group(:mystery_oddness) do |t|
83
+ t.field :a_color, :some_colors
84
+ t.field :a_cool_int, :int16
85
+ t.dataless :a_thing, "only a thing"
86
+ t.dataless :undescribed
87
+ end
88
+
89
+ @db.build
90
+ @doc_text = File.read(@doc_path)
91
+ @doc_lines = @doc_text.lines.to_a
92
+ end
93
+
94
+ describe "doc generation" do
95
+ it "contains type details" do
96
+ t = <<EOF
97
+ Type Name: int8
98
+ Cauterize Class: built-in
99
+ Description: <none>
100
+ data - size: 1 bytes
101
+
102
+ Type Name: int16
103
+ Cauterize Class: built-in
104
+ Description: <none>
105
+ data - size: 2 bytes
106
+
107
+ Type Name: int32
108
+ Cauterize Class: built-in
109
+ Description: <none>
110
+ data - size: 4 bytes
111
+
112
+ Type Name: int64
113
+ Cauterize Class: built-in
114
+ Description: <none>
115
+ data - size: 8 bytes
116
+
117
+ Type Name: uint8
118
+ Cauterize Class: built-in
119
+ Description: <none>
120
+ data - size: 1 bytes
121
+
122
+ Type Name: uint16
123
+ Cauterize Class: built-in
124
+ Description: <none>
125
+ data - size: 2 bytes
126
+
127
+ Type Name: uint32
128
+ Cauterize Class: built-in
129
+ Description: <none>
130
+ data - size: 4 bytes
131
+
132
+ Type Name: uint64
133
+ Cauterize Class: built-in
134
+ Description: <none>
135
+ data - size: 8 bytes
136
+
137
+ Type Name: an_int
138
+ Cauterize Class: scalar
139
+ Description: - a useful int
140
+ data - type: int32
141
+
142
+ Type Name: another_int
143
+ Cauterize Class: scalar
144
+ Description: <none>
145
+ data - type: int32
146
+
147
+ Type Name: a_composite
148
+ Cauterize Class: composite
149
+ Description: some useful fields
150
+ an_int - type: int32 - description: a pretty integer
151
+ another_int - type: int32 - description: another pretty integer
152
+ undescribed - type: int32
153
+
154
+ Type Name: mystery
155
+ Cauterize Class: composite
156
+ Description: <none>
157
+ undescribed - type: int32
158
+
159
+ Type Name: a_fixed_array
160
+ Cauterize Class: fixed-array
161
+ Description: a few things
162
+ Stored Type: an_int
163
+ Value Count: 5
164
+ data - 5 values of type an_int
165
+
166
+ Type Name: a_mystery_array
167
+ Cauterize Class: fixed-array
168
+ Description: <none>
169
+ Stored Type: uint8
170
+ Value Count: 1
171
+ data - 1 values of type uint8
172
+
173
+ Type Name: a_var_array
174
+ Cauterize Class: variable-array
175
+ Description: maybe some things
176
+ Maximum Value Count: 5
177
+ length - type uint8
178
+ data - 0 to 5 values of type an_int
179
+
180
+ Type Name: a_var_mystery
181
+ Cauterize Class: variable-array
182
+ Description: <none>
183
+ Maximum Value Count: 1
184
+ length - type uint8
185
+ data - 0 to 1 values of type uint8
186
+
187
+ Type Name: some_colors
188
+ Cauterize Class: enumeration
189
+ Description: several colors to choose from
190
+ Encoding: int8
191
+ red = 0
192
+ blue = 1
193
+ green = 2
194
+
195
+ Type Name: mystery_things
196
+ Cauterize Class: enumeration
197
+ Description: <none>
198
+ Encoding: int8
199
+ thing1 = 0
200
+ thing2 = 1
201
+ thing3 = 2
202
+
203
+ Type Name: group_oddness_type
204
+ Cauterize Class: enumeration
205
+ Description: <none>
206
+ Encoding: int8
207
+ GROUP_ODDNESS_TYPE_A_COLOR = 0
208
+ GROUP_ODDNESS_TYPE_A_COOL_INT = 1
209
+ GROUP_ODDNESS_TYPE_A_THING = 2
210
+ GROUP_ODDNESS_TYPE_UNDESCRIBED = 3
211
+
212
+ Type Name: oddness
213
+ Cauterize Class: group
214
+ Description: a mix of weird things
215
+ kind tag: group_oddness_type
216
+ kinds:
217
+ a_color - payload: some_colors - description: a color
218
+ a_cool_int - payload: int16 - description: only cool ints fit here
219
+ a_thing - payload: <no payload> - description: only a thing
220
+ undescribed - payload: <no payload>
221
+
222
+ Type Name: group_mystery_oddness_type
223
+ Cauterize Class: enumeration
224
+ Description: <none>
225
+ Encoding: int8
226
+ GROUP_MYSTERY_ODDNESS_TYPE_A_COLOR = 0
227
+ GROUP_MYSTERY_ODDNESS_TYPE_A_COOL_INT = 1
228
+ GROUP_MYSTERY_ODDNESS_TYPE_A_THING = 2
229
+ GROUP_MYSTERY_ODDNESS_TYPE_UNDESCRIBED = 3
230
+
231
+ Type Name: mystery_oddness
232
+ Cauterize Class: group
233
+ Description: <none>
234
+ kind tag: group_mystery_oddness_type
235
+ kinds:
236
+ a_color - payload: some_colors
237
+ a_cool_int - payload: int16
238
+ a_thing - payload: <no payload> - description: only a thing
239
+ undescribed - payload: <no payload>
240
+ EOF
241
+ @doc_text.should == t
242
+ end
243
+ end
244
+ end
245
+ end
246
+
247
+ end