stark 0.5.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.
@@ -0,0 +1,278 @@
1
+ require 'test/unit'
2
+ require 'stark/parser'
3
+
4
+ class TestParser < Test::Unit::TestCase
5
+ def parse(data)
6
+ tg = Stark::Parser.new data
7
+
8
+ unless tg.parse
9
+ tg.raise_error
10
+ end
11
+
12
+ assert tg.result
13
+ end
14
+
15
+ def test_ccomment
16
+ parse "/* blah */\n"
17
+ parse "/* blah */ /* foo */\n"
18
+ end
19
+
20
+ def test_hcomment
21
+ parse "# blah\n"
22
+ end
23
+
24
+ def test_const_value_in_struct
25
+ parse <<-EOM
26
+ struct Hello {
27
+ 1: string greeting = "hello world"
28
+ }
29
+ EOM
30
+ end
31
+
32
+ def test_enum
33
+ parse <<-EOM
34
+ enum SomeEnum {
35
+ ONE
36
+ TWO
37
+ }
38
+ EOM
39
+ end
40
+
41
+ def test_list
42
+ parse <<-EOM
43
+ struct Foo {
44
+ 1: list<i32> ints
45
+ }
46
+ EOM
47
+ end
48
+
49
+ def test_list_with_value
50
+ parse <<-EOM
51
+ struct Foo {
52
+ 1: list<i32> ints = [1, 2, 2, 3],
53
+ }
54
+ EOM
55
+ end
56
+
57
+ include Stark::Parser::AST
58
+
59
+ def comment(text)
60
+ Comment.new(text)
61
+ end
62
+ def field(index, type, name)
63
+ Field.new(index, type, name)
64
+ end
65
+ def function(name, return_type, arguments)
66
+ Function.new(name, return_type, arguments)
67
+ end
68
+ def include(path)
69
+ Include.new(path)
70
+ end
71
+ def namespace(lang, namespace)
72
+ Namespace.new(lang, namespace)
73
+ end
74
+ def service(name, functions)
75
+ Service.new(name, functions)
76
+ end
77
+ def struct(name, fields)
78
+ Struct.new(name, fields)
79
+ end
80
+
81
+ def list(t)
82
+ List.new(t)
83
+ end
84
+
85
+ def map(a,b)
86
+ Map.new(a,b)
87
+ end
88
+
89
+ def set(a)
90
+ Set.new(a)
91
+ end
92
+
93
+ def assert_type(exc, acc)
94
+ case exc
95
+ when List, Set
96
+ assert_type exc.value, acc.value
97
+ when Map
98
+ assert_type exc.key, acc.key
99
+ assert_type exc.value, acc.value
100
+ else
101
+ assert_equal exc, acc
102
+ end
103
+ end
104
+
105
+ def assert_field(f, idx, type, name)
106
+ assert_equal idx, f.index
107
+ assert_equal name, f.name
108
+ assert_type type, f.type
109
+ end
110
+
111
+ def assert_func(f, ret_type, name, args)
112
+ assert_type ret_type, f.return_type
113
+ assert_equal name, f.name
114
+
115
+ return if !args and !f.arguments
116
+
117
+ args.zip(f.arguments).each do |exc, arg|
118
+ assert_equal exc[0], arg.index
119
+ assert_type exc[1], arg.type
120
+ assert_equal exc[2], arg.name
121
+ end
122
+ end
123
+
124
+ def test_spec
125
+ data = File.read "test/ThriftSpec.thrift"
126
+
127
+ tg = Stark::Parser.new data
128
+
129
+ unless tg.parse
130
+ tg.raise_error
131
+ end
132
+
133
+ ary = tg.result
134
+
135
+ comments = ary.shift(19)
136
+ comments.each { |c| assert_kind_of Comment, c }
137
+
138
+ ns = ary.shift
139
+
140
+ assert_equal "rb", ns.lang
141
+ assert_equal "SpecNamespace", ns.namespace
142
+
143
+ ns = ary.shift
144
+
145
+ assert_equal "Hello", ns.name
146
+ assert_equal 1, ns.fields.size
147
+ f = ns.fields[0]
148
+
149
+ assert_equal 1, f.index
150
+ assert_equal "string", f.type
151
+ assert_equal "greeting", f.name
152
+
153
+ assert_equal "hello world", f.value.value
154
+
155
+ e = ary.shift
156
+
157
+ assert_equal ["ONE", "TWO"], e.values
158
+
159
+ s = ary.shift
160
+
161
+ assert_equal "StructWithSomeEnum", s.name
162
+ assert_equal 1, s.fields.size
163
+ f = s.fields.first
164
+
165
+ assert_equal 1, f.index
166
+ assert_equal "SomeEnum", f.type
167
+ assert_equal "some_enum", f.name
168
+
169
+ s = ary.shift
170
+ assert_equal :union, s.type
171
+ assert_equal "TestUnion", s.name
172
+ assert_equal 5, s.fields.size
173
+
174
+ fs = s.fields
175
+
176
+ assert_field fs[0], 1, "string", "string_field"
177
+ assert_field fs[1], 2, "i32", "i32_field"
178
+ assert_field fs[2], 3, "i32", "other_i32_field"
179
+ assert_field fs[3], 4, "SomeEnum", "enum_field"
180
+ assert_field fs[4], 5, "binary", "binary_field"
181
+
182
+ s = ary.shift
183
+ assert_equal "Foo", s.name
184
+ assert_equal 8, s.fields.size
185
+
186
+ f = s.fields
187
+
188
+ assert_field f[0], 1, "i32", "simple"
189
+ assert_field f[1], 2, "string", "words"
190
+ assert_equal "words", f[1].value.value
191
+
192
+ assert_field f[2], 3, "Hello", "hello"
193
+ assert_equal "greeting", f[2].value.values[0][0].value
194
+ assert_equal "hello, world!", f[2].value.values[0][1].value
195
+
196
+ assert_field f[3], 4, list("i32"), "ints"
197
+ ints = f[3].value.values.map { |i| i.value }
198
+ assert_equal [1, 2, 2, 3], ints
199
+
200
+ assert_field f[4], 5, map("i32", map("string", "double")), "complex"
201
+
202
+ assert_field f[5], 6, set("i16"), "shorts"
203
+ ints = f[5].value.values.map { |i| i.value }
204
+ assert_equal [5, 17, 239], ints
205
+
206
+ assert_field f[6], 7, "string", "opt_string"
207
+ assert_field f[7], 8, "bool", "my_bool"
208
+
209
+ assert_equal ["optional"], f[6].options
210
+
211
+ s = ary.shift
212
+
213
+ assert_equal "Foo2", s.name
214
+ assert_equal 1, s.fields.size
215
+
216
+ assert_field s.fields[0], 1, "binary", "my_binary"
217
+
218
+ s = ary.shift
219
+ assert_equal "BoolStruct", s.name
220
+ assert_equal 1, s.fields.size
221
+
222
+ assert_field s.fields[0], 1, "bool", "yesno"
223
+ assert_equal 1, s.fields[0].value.value
224
+
225
+ s = ary.shift
226
+ fs = s.fields
227
+
228
+ assert_field fs[0], 1, list("bool"), "bools"
229
+ assert_field fs[1], 2, list("byte"), "bytes"
230
+ assert_field fs[2], 3, list("i16"), "i16s"
231
+ assert_field fs[3], 4, list("i32"), "i32s"
232
+ assert_field fs[4], 5, list("i64"), "i64s"
233
+ assert_field fs[5], 6, list("double"), "doubles"
234
+ assert_field fs[6], 7, list("string"), "strings"
235
+ assert_field fs[7], 8, list(map("i16", "i16")), "maps"
236
+ assert_field fs[8], 9, list(list("i16")), "lists"
237
+ assert_field fs[9], 10, list(set("i16")), "sets"
238
+ assert_field fs[10], 11, list("Hello"), "hellos"
239
+
240
+ s = ary.shift
241
+ assert_equal "Xception", s.name
242
+ assert_field s.fields[0], 1, "string", "message"
243
+ assert_field s.fields[1], 2, "i32", "code"
244
+ assert_equal 1, s.fields[1].value.value
245
+
246
+ s = ary.shift
247
+ assert_equal "NonblockingService", s.name
248
+ fs = s.functions
249
+
250
+ assert_func fs[0], "Hello", "greeting", [[1, "bool", "english"]]
251
+ assert_func fs[1], "bool", "block", nil
252
+ assert_func fs[2], "void", "unblock", [[1, "i32", "n"]]
253
+ assert_func fs[3], "void", "shutdown", nil
254
+ assert_func fs[4], "void", "sleep", [[1, "double", "seconds"]]
255
+
256
+ s = ary.shift
257
+ assert_equal "My_union", s.name
258
+ fs = s.fields
259
+ assert_field fs[0], 1, "bool", "im_true"
260
+ assert_field fs[1], 2, "byte", "a_bite"
261
+ assert_field fs[2], 3, "i16", "integer16"
262
+ assert_field fs[3], 4, "i32", "integer32"
263
+ assert_field fs[4], 5, "i64", "integer64"
264
+ assert_field fs[5], 6, "double", "double_precision"
265
+ assert_field fs[6], 7, "string", "some_characters"
266
+ assert_field fs[7], 8, "i32", "other_i32"
267
+ assert_field fs[8], 9, "SomeEnum", "some_enum"
268
+ assert_field fs[9], 10, map("SomeEnum", list("SomeEnum")), "my_map"
269
+
270
+ s = ary.shift
271
+ assert_equal "Struct_with_union", s.name
272
+ fs = s.fields
273
+
274
+ assert_field fs[0], 1, "My_union", "fun_union"
275
+ assert_field fs[1], 2, "i32", "integer32"
276
+ assert_field fs[2], 3, "string", "some_characters"
277
+ end
278
+ end
@@ -0,0 +1,175 @@
1
+ require 'test/unit'
2
+
3
+ require 'stark'
4
+
5
+ require 'rubygems'
6
+ require 'thrift'
7
+
8
+ Thread.abort_on_exception = true
9
+
10
+ class TestServer < Test::Unit::TestCase
11
+ def setup
12
+ @client_t, @server_t = Stark.pipe_transport
13
+ @client_p = Thrift::BinaryProtocol.new @client_t
14
+ @server_p = Thrift::BinaryProtocol.new @server_t
15
+
16
+ @n = Module.new
17
+ Stark.materialize "test/profile.thrift", @n
18
+
19
+ @client = @n::UserStorage::Client.new @client_p, @client_p
20
+ @handler = Handler.new
21
+ @server = @n::UserStorage::Processor.new @handler
22
+ end
23
+
24
+ def teardown
25
+ @client_t.close
26
+ @server_t.close
27
+ end
28
+
29
+ class Handler
30
+ def initialize
31
+ @users = {}
32
+ @last_map = nil
33
+ @last_list = nil
34
+ @last_status = nil
35
+ end
36
+
37
+ attr_accessor :last_map, :last_list, :last_status
38
+
39
+ def store(obj)
40
+ @users[obj.uid] = obj
41
+ end
42
+
43
+ def retrieve(id)
44
+ @users[id]
45
+ end
46
+
47
+ def set_map(m)
48
+ @last_map = m
49
+ end
50
+
51
+ def set_list(l)
52
+ @last_list = l
53
+ end
54
+
55
+ def set_status(s)
56
+ @last_status = s
57
+ end
58
+ end
59
+
60
+ def test_store_and_retrieve
61
+ st = Thread.new do
62
+ @server.process @server_p, @server_p
63
+ end
64
+
65
+ xuser = @n::UserProfile.new 'uid' => 0, 'name' => 'root', 'blurb' => 'god'
66
+
67
+ @client.store xuser
68
+
69
+ st.join
70
+
71
+ st = Thread.new do
72
+ @server.process @server_p, @server_p
73
+ end
74
+
75
+ obj = @client.retrieve 0
76
+
77
+ st.join
78
+
79
+ assert_equal 0, obj.uid
80
+ assert_equal "root", obj.name
81
+ assert_equal "god", obj.blurb
82
+ end
83
+
84
+ def test_set_map
85
+ st = Thread.new do
86
+ @server.process @server_p, @server_p
87
+ end
88
+
89
+ m = { "blah" => "foo", "a" => "b" }
90
+
91
+ @client.set_map m
92
+
93
+ st.join
94
+
95
+ assert_equal "foo", @handler.last_map["blah"]
96
+ assert_equal "b", @handler.last_map["a"]
97
+ end
98
+
99
+ def test_last_map
100
+ st = Thread.new do
101
+ @server.process @server_p, @server_p
102
+ end
103
+
104
+ @handler.last_map = { "blah" => "foo", "a" => "b" }
105
+
106
+ m = @client.last_map
107
+
108
+ st.join
109
+
110
+ assert_equal "foo", m["blah"]
111
+ assert_equal "b", m["a"]
112
+ end
113
+
114
+ def test_set_list
115
+ st = Thread.new do
116
+ @server.process @server_p, @server_p
117
+ end
118
+
119
+ m = [ "blah", "foo", "a", "b" ]
120
+
121
+ @client.set_list m
122
+
123
+ st.join
124
+
125
+ assert_equal m, @handler.last_list
126
+ end
127
+
128
+ def test_last_list
129
+ st = Thread.new do
130
+ @server.process @server_p, @server_p
131
+ end
132
+
133
+ l = [ "blah", "foo", "a", "b" ]
134
+ @handler.last_list = l
135
+
136
+ assert_equal l, @client.last_list
137
+
138
+ st.join
139
+ end
140
+
141
+ def test_last_list_is_nil
142
+ st = Thread.new do
143
+ @server.process @server_p, @server_p
144
+ end
145
+
146
+ assert_equal [], @client.last_list
147
+
148
+ st.join
149
+ end
150
+
151
+ def test_enum
152
+ st = Thread.new do
153
+ @server.process @server_p, @server_p
154
+ end
155
+
156
+ @client.set_status :ON
157
+
158
+ st.join
159
+
160
+ assert_equal :ON, @handler.last_status
161
+ end
162
+
163
+ def test_enum_recv
164
+ st = Thread.new do
165
+ @server.process @server_p, @server_p
166
+ end
167
+
168
+ @handler.last_status = :ON
169
+
170
+ assert_equal :ON, @client.last_status
171
+
172
+ st.join
173
+ end
174
+
175
+ end
metadata ADDED
@@ -0,0 +1,134 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: stark
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.5.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Evan Phoenix
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-02-28 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: thrift
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 0.9.0
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: 0.9.0
30
+ - !ruby/object:Gem::Dependency
31
+ name: rdoc
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: '3.10'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: '3.10'
46
+ - !ruby/object:Gem::Dependency
47
+ name: hoe
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: '3.5'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '3.5'
62
+ description: Optimized thrift bindings for ruby
63
+ email:
64
+ - evan@phx.io
65
+ executables:
66
+ - stark
67
+ extensions: []
68
+ extra_rdoc_files:
69
+ - History.txt
70
+ - Manifest.txt
71
+ - README.txt
72
+ files:
73
+ - .autotest
74
+ - History.txt
75
+ - Manifest.txt
76
+ - README.txt
77
+ - Rakefile
78
+ - bin/stark
79
+ - lib/stark.rb
80
+ - lib/stark/ast.rb
81
+ - lib/stark/client.rb
82
+ - lib/stark/converters.rb
83
+ - lib/stark/field.rb
84
+ - lib/stark/log_transport.rb
85
+ - lib/stark/parser.rb
86
+ - lib/stark/processor.rb
87
+ - lib/stark/raw_parser.rb
88
+ - lib/stark/ruby.rb
89
+ - lib/stark/struct.rb
90
+ - lib/stark/thrift.kpeg
91
+ - stark.gemspec
92
+ - test/ThriftSpec.thrift
93
+ - test/gen-rb/profile_constants.rb
94
+ - test/gen-rb/profile_types.rb
95
+ - test/gen-rb/user_storage.rb
96
+ - test/leg.rb
97
+ - test/legacy_profile/profile_constants.rb
98
+ - test/legacy_profile/profile_types.rb
99
+ - test/legacy_profile/user_storage.rb
100
+ - test/profile.thrift
101
+ - test/test_client.rb
102
+ - test/test_parser.rb
103
+ - test/test_server.rb
104
+ - .gemtest
105
+ homepage: http://github.com/evanphx/stark
106
+ licenses: []
107
+ post_install_message:
108
+ rdoc_options:
109
+ - --main
110
+ - README.txt
111
+ require_paths:
112
+ - lib
113
+ required_ruby_version: !ruby/object:Gem::Requirement
114
+ none: false
115
+ requirements:
116
+ - - ! '>='
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ required_rubygems_version: !ruby/object:Gem::Requirement
120
+ none: false
121
+ requirements:
122
+ - - ! '>='
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ requirements: []
126
+ rubyforge_project: stark
127
+ rubygems_version: 1.8.25
128
+ signing_key:
129
+ specification_version: 3
130
+ summary: Optimized thrift bindings for ruby
131
+ test_files:
132
+ - test/test_client.rb
133
+ - test/test_parser.rb
134
+ - test/test_server.rb