nidyx 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,460 @@
1
+ require "minitest/autorun"
2
+ require "nidyx" # we use some core_ext stuff that requires this
3
+ require "nidyx/parser"
4
+
5
+ class TestParser < Minitest::Test
6
+ def test_description
7
+ schema = {
8
+ "type" => "object",
9
+ "properties" => {
10
+ "key" => {
11
+ "description" => "a description",
12
+ "type" => "string"
13
+ },
14
+ "value" => { "type" => "integer" }
15
+ }
16
+ }
17
+
18
+ models = parse(schema)
19
+ props = models["TSModel"].properties
20
+ key = props.shift
21
+ assert_equal("a description", key.description)
22
+ assert_equal(:string, key.type)
23
+ assert_equal("key", key.name)
24
+ assert_equal(true, key.optional)
25
+ value = props.shift
26
+ assert_equal(:integer, value.type)
27
+ assert_equal("value", value.name)
28
+ assert_equal(true, value.optional)
29
+ end
30
+
31
+ def test_nested_properties
32
+ schema = {
33
+ "type" => "object",
34
+ "properties" => {
35
+ "key" => { "type" => "string" },
36
+ "value" => {
37
+ "type" => "object",
38
+ "properties" => {
39
+ "name" => { "type" => "string" },
40
+ "obj" => {
41
+ "type" => "object",
42
+ "properties" => {
43
+ "data" => { "type" => "string" }
44
+ }
45
+ }
46
+ }
47
+ }
48
+ }
49
+ }
50
+
51
+ models = parse(schema)
52
+
53
+ # root model
54
+ model = models["TSModel"]
55
+ assert_deps(%w(TSValueModel), model)
56
+ props = model.properties
57
+ key = props.shift
58
+ assert_equal("key", key.name)
59
+ assert_equal(:string, key.type)
60
+ value = props.shift
61
+ assert_equal("value", value.name)
62
+ assert_equal(:object, value.type)
63
+ assert_equal("TSValueModel", value.class_name)
64
+ assert_equal(true, value.has_properties?)
65
+
66
+ # value model
67
+ model = models["TSValueModel"]
68
+ assert_deps(%w(TSValueObjModel), model)
69
+ props = model.properties
70
+ name = props.shift
71
+ assert_equal("name", name.name)
72
+ assert_equal(:string, name.type)
73
+ obj = props.shift
74
+ assert_equal("obj", obj.name)
75
+ assert_equal(:object, obj.type)
76
+ assert_equal("TSValueObjModel", obj.class_name)
77
+
78
+ # value obj model
79
+ data = models["TSValueObjModel"].properties.shift
80
+ assert_equal("data", data.name)
81
+ assert_equal(:string, data.type)
82
+ end
83
+
84
+ def test_definitions
85
+ schema = {
86
+ "type" => "object",
87
+ "properties" => {
88
+ "value" => { "$ref" => "#/definitions/obj" },
89
+ },
90
+ "definitions" => {
91
+ "obj" => {
92
+ "type" => "object",
93
+ "properties" => {
94
+ "banner" => { "$ref" => "#/definitions/banner" },
95
+ "count" => { "type" => "integer" }
96
+ }
97
+ },
98
+ "banner" => { "type" => "string" }
99
+ }
100
+ }
101
+
102
+ models = parse(schema)
103
+
104
+ # root model
105
+ model = models["TSModel"]
106
+ assert_deps(%w(TSObjModel), model)
107
+ props = model.properties
108
+ value = props.shift
109
+ assert_equal("value", value.name)
110
+ assert_equal(:object, value.type)
111
+ assert_equal("TSObjModel", value.class_name)
112
+
113
+ # obj model
114
+ model = models["TSObjModel"]
115
+ props = model.properties
116
+ banner = props.shift
117
+ assert_equal("banner", banner.name)
118
+ assert_equal(:string, banner.type)
119
+ count = props.shift
120
+ assert_equal("count", count.name)
121
+ assert_equal(:integer, count.type)
122
+ end
123
+
124
+ def test_simple_chained_refs
125
+ schema = {
126
+ "type" => "object",
127
+ "properties" => {
128
+ "value1" => { "$ref" => "#/definitions/value2" }
129
+ },
130
+ "definitions" => {
131
+ "value2" => { "$ref" => "#/definitions/value3" },
132
+ "value3" => { "type" => "string" }
133
+ }
134
+ }
135
+
136
+ models = parse(schema)
137
+ model = models["TSModel"]
138
+ assert_deps([], model)
139
+ props = model.properties
140
+ value1 = props.shift
141
+ assert_equal(:string, value1.type)
142
+ assert_equal("value1", value1.name)
143
+ end
144
+
145
+ def test_chained_refs_to_an_object
146
+ schema = {
147
+ "type" => "object",
148
+ "properties" => {
149
+ "value1" => { "$ref" => "#/definitions/value2" }
150
+ },
151
+ "definitions" => {
152
+ "value2" => { "$ref" => "#/definitions/value3" },
153
+ "value3" => {
154
+ "type" => "object",
155
+ "properties" => {
156
+ "value4" => { "type" => "string" }
157
+ }
158
+ }
159
+ }
160
+ }
161
+
162
+ models = parse(schema)
163
+
164
+ # root model
165
+ model = models["TSModel"]
166
+ assert_deps(%w(TSValue3Model), model)
167
+ props = model.properties
168
+ value1 = props.shift
169
+ assert_equal("value1", value1.name)
170
+ assert_equal(:object, value1.type)
171
+ assert_equal("TSValue3Model", value1.class_name)
172
+
173
+ # mid ref
174
+ assert_equal(nil, models["TSValue2Model"]) # should never exist
175
+
176
+ # end ref
177
+ props = models["TSValue3Model"].properties
178
+ value4 = props.shift
179
+ assert_equal("value4", value4.name)
180
+ assert_equal(:string, value4.type)
181
+ end
182
+
183
+ def test_array_lookups
184
+ schema = {
185
+ "type" => "object",
186
+ "properties" => {
187
+ "string_array" => {
188
+ "type" => "array",
189
+ "items" => ["string", "null"]
190
+ },
191
+ "object_array" => {
192
+ "type" => "array",
193
+ "items" => { "$ref" => "#/definitions/object" }
194
+ },
195
+ "multi_object_array" => {
196
+ "type" => "array",
197
+ "items" => [
198
+ { "$ref" => "#/definitions/object" },
199
+ { "$ref" => "#/definitions/other_object" }
200
+ ]
201
+ }
202
+ },
203
+ "definitions" => {
204
+ "object" => {
205
+ "type" => "object",
206
+ "required" => ["int_value"],
207
+ "properties" => {
208
+ "int_value" => { "type" => "integer" }
209
+ }
210
+ },
211
+ "other_object" => {
212
+ "type" => "object",
213
+ "properties" => {
214
+ "string_value" => { "type" => "string" }
215
+ }
216
+ }
217
+ }
218
+ }
219
+
220
+ models = parse(schema)
221
+ assert_equal(3, models.size)
222
+
223
+ # root model
224
+ model = models["TSModel"]
225
+ assert_deps(%w(TSObjectModel TSOtherObjectModel), model)
226
+ props = model.properties
227
+
228
+ string_array = props.shift
229
+ assert_equal(:array, string_array.type)
230
+ assert_equal([], string_array.collection_types)
231
+
232
+ object_array = props.shift
233
+ assert_equal(:array, object_array.type)
234
+ assert_equal(["TSObjectModel"], object_array.collection_types)
235
+
236
+ multi_object_array = props.shift
237
+ assert_equal(:array, multi_object_array.type)
238
+ assert_equal(%w(TSObjectModel TSOtherObjectModel), multi_object_array.collection_types)
239
+
240
+ # object model
241
+ model = models["TSObjectModel"]
242
+ props = model.properties
243
+ int_value = props.shift
244
+ assert_equal(:integer, int_value.type)
245
+ assert_equal("intValue", int_value.name)
246
+
247
+ # other object model
248
+ model = models["TSOtherObjectModel"]
249
+ props = model.properties
250
+ string_value = props.shift
251
+ assert_equal(:string, string_value.type)
252
+ assert_equal("stringValue", string_value.name)
253
+ end
254
+
255
+ def test_object_with_type_array
256
+ schema = {
257
+ "type" => "object",
258
+ "properties" => {
259
+ "value" => {
260
+ "type" => ["object", "null"],
261
+ "properties" => {
262
+ "value" => { "type" => "string" }
263
+ }
264
+ }
265
+ }
266
+ }
267
+
268
+ models = parse(schema)
269
+ model = models["TSModel"]
270
+ props = model.properties
271
+
272
+ value = props.shift
273
+ assert_equal(Set.new([:object, :null]), value.type)
274
+ assert_equal("TSValueModel", value.class_name)
275
+
276
+ model = models["TSValueModel"]
277
+ props = model.properties
278
+ value = props.shift
279
+ assert_equal("value", value.name)
280
+ assert_equal(:string, value.type)
281
+ end
282
+
283
+ def test_anonymous_object
284
+ schema = {
285
+ "type" => "object",
286
+ "properties" => {
287
+ "value" => { "type" => "object" }
288
+ }
289
+ }
290
+
291
+ models = parse(schema)
292
+ model = models["TSModel"]
293
+ props = model.properties
294
+ value = props.shift
295
+ assert_equal(true, model.dependencies.empty?)
296
+ assert_equal(:object, value.type)
297
+ assert_equal(false, value.has_properties?)
298
+ end
299
+
300
+ def test_anonymous_array
301
+ schema = {
302
+ "type" => "object",
303
+ "properties" => {
304
+ "value" => { "type" => "array" }
305
+ }
306
+ }
307
+
308
+ models = parse(schema)
309
+ model = models["TSModel"]
310
+ props = model.properties
311
+ value = props.shift
312
+ assert_equal(:array, value.type)
313
+ end
314
+
315
+ def test_model_name_override
316
+ schema = {
317
+ "type" => "object",
318
+ "properties" => {
319
+ "value" => {
320
+ "type" => "object",
321
+ "nameOverride" => "something",
322
+ "properties" => {
323
+ "name" => { "$ref" => "#/definitions/obj" }
324
+ }
325
+ }
326
+ },
327
+ "definitions" => {
328
+ "obj" => {
329
+ "type" => "object",
330
+ "nameOverride" => "somethingElse",
331
+ "properties" => {
332
+ "recObject" => {
333
+ "type" => "object",
334
+ "nameOverride" => "rec",
335
+ "properties" => {
336
+ "value" => { "type" => "string" }
337
+ }
338
+ }
339
+ }
340
+ }
341
+ }
342
+ }
343
+
344
+ models = parse(schema)
345
+ assert_equal(4, models.size)
346
+
347
+ # root model
348
+ model = models["TSModel"]
349
+ props = model.properties
350
+ value = props.shift
351
+ assert_equal("TSSomethingModel", value.class_name)
352
+
353
+ # something model
354
+ model = models["TSSomethingModel"]
355
+ props = model.properties
356
+ name = props.shift
357
+ assert_equal("TSSomethingElseModel", name.class_name)
358
+
359
+ # something else model
360
+ model = models["TSSomethingElseModel"]
361
+ assert_equal("TSSomethingElseModel", model.name)
362
+
363
+ # rec model
364
+ model = models["TSRecModel"]
365
+ assert_equal("TSRecModel", model.name)
366
+ end
367
+
368
+ def test_property_name_override
369
+ schema = {
370
+ "type" => "object",
371
+ "properties" => {
372
+ "name" => {
373
+ "type" => "string",
374
+ "nameOverride" => "otherName"
375
+ }
376
+ }
377
+ }
378
+
379
+ models = parse(schema)
380
+ assert_equal(1, models.size)
381
+ model = models["TSModel"]
382
+ props = model.properties
383
+ otherName = props.shift
384
+ assert_equal("otherName", otherName.name)
385
+ assert_equal(:string, otherName.type)
386
+ end
387
+
388
+ def test_array_top_level_object
389
+ schema = {
390
+ "type" => "array",
391
+ "items" => { "$ref" => "#/definitions/object" },
392
+ "definitions" => {
393
+ "object" => {
394
+ "type" => "object",
395
+ "properties" => {
396
+ "text" => { "type" => "string" }
397
+ }
398
+ }
399
+ }
400
+ }
401
+
402
+ models = parse(schema)
403
+ assert_equal(1, models.size)
404
+ model = models["TSObjectModel"]
405
+ text = model.properties.shift
406
+ assert_equal("text", text.name)
407
+ assert_equal(:string, text.type)
408
+ end
409
+
410
+ def test_array_top_level_object_multiple_types
411
+ schema = {
412
+ "type" => "array",
413
+ "items" => [
414
+ { "$ref" => "#/definitions/object" },
415
+ { "$ref" => "#/definitions/otherObject" }
416
+ ],
417
+ "definitions" => {
418
+ "object" => {
419
+ "type" => "object",
420
+ "properties" => {
421
+ "text" => { "type" => "string" }
422
+ }
423
+ },
424
+ "otherObject" => {
425
+ "type" => "object",
426
+ "properties" => {
427
+ "bool" => { "type" => "boolean" }
428
+ }
429
+ }
430
+ }
431
+ }
432
+
433
+ models = parse(schema)
434
+ assert_equal(2, models.size)
435
+
436
+ model = models["TSObjectModel"]
437
+ text = model.properties.shift
438
+ assert_equal("text", text.name)
439
+ assert_equal(:string, text.type)
440
+
441
+ model = models["TSOtherObjectModel"]
442
+ bool = model.properties.shift
443
+ assert_equal("bool", bool.name)
444
+ assert_equal(:boolean, bool.type)
445
+ end
446
+
447
+ private
448
+
449
+ PREFIX = "TS"
450
+ OPTIONS = {}
451
+
452
+ def assert_deps(expected, model)
453
+ actual = model.dependencies
454
+ assert_equal(Set.new(expected), actual)
455
+ end
456
+
457
+ def parse(schema)
458
+ Nidyx::Parser.parse(PREFIX, schema, OPTIONS)
459
+ end
460
+ end
@@ -0,0 +1,42 @@
1
+ require "minitest/autorun"
2
+ require "nidyx/pointer"
3
+
4
+ class TestPointer < Minitest::Test
5
+ def test_basic_pointer
6
+ ptr = Nidyx::Pointer.new("http://url.com#/path/to")
7
+ assert_equal("http://url.com", ptr.source)
8
+ assert_equal(["path", "to"], ptr.path)
9
+ end
10
+
11
+ def test_source_only_pointer
12
+ ptr = Nidyx::Pointer.new("http://url.com#")
13
+ assert_equal("http://url.com", ptr.source)
14
+ assert_equal([], ptr.path)
15
+ end
16
+
17
+ def test_path_source_pointer
18
+ ptr = Nidyx::Pointer.new("some/path/file.js#/definitions")
19
+ assert_equal("some/path/file.js", ptr.source)
20
+ assert_equal(["definitions"], ptr.path)
21
+ end
22
+
23
+ def test_path_only_pointer
24
+ ptr = Nidyx::Pointer.new("#/path/to")
25
+ assert_equal("", ptr.source)
26
+ assert_equal(["path", "to"], ptr.path)
27
+
28
+ ptr = Nidyx::Pointer.new("#path/to")
29
+ assert_equal("", ptr.source)
30
+ assert_equal(["path", "to"], ptr.path)
31
+ end
32
+
33
+ def test_empty_pointer
34
+ ptr = Nidyx::Pointer.new("#/")
35
+ assert_equal("", ptr.source)
36
+ assert_equal([], ptr.path)
37
+
38
+ ptr = Nidyx::Pointer.new("#")
39
+ assert_equal("", ptr.source)
40
+ assert_equal([], ptr.path)
41
+ end
42
+ end
@@ -0,0 +1,38 @@
1
+ require "minitest/autorun"
2
+ require "nidyx"
3
+ require "nidyx/property"
4
+
5
+ class TestProperty < Minitest::Test
6
+ def test_name_camelized
7
+ obj = { "type" => "string" }
8
+ p = Nidyx::Property.new("underscore_string", nil, false, obj)
9
+ assert_equal("underscoreString", p.name)
10
+ end
11
+
12
+ def test_typeless
13
+ assert_raises(Nidyx::Property::UndefinedTypeError) do
14
+ Nidyx::Property.new("i", nil, false, {})
15
+ end
16
+ end
17
+
18
+ def test_empty_type_array
19
+ assert_raises(Nidyx::Property::UndefinedTypeError) do
20
+ obj = { "type" => [] }
21
+ Nidyx::Property.new("i", nil, false, obj)
22
+ end
23
+ end
24
+
25
+ def test_non_array_enum
26
+ assert_raises(Nidyx::Property::NonArrayEnumError) do
27
+ obj = { "enum" => {} }
28
+ Nidyx::Property.new("i", nil, false, obj)
29
+ end
30
+ end
31
+
32
+ def test_empty_enum_array
33
+ assert_raises(Nidyx::Property::EmptyEnumError) do
34
+ obj = { "enum" => [] }
35
+ Nidyx::Property.new("i", nil, false, obj)
36
+ end
37
+ end
38
+ end
metadata ADDED
@@ -0,0 +1,134 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: nidyx
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Chris Knadler
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2015-03-16 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: mustache
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 0.99.5
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.99.5
30
+ - !ruby/object:Gem::Dependency
31
+ name: ruby_gntp
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
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: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: guard-minitest
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
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: '0'
62
+ description: JSON Schema -> Objective-C model generator
63
+ email: takeshi91k@gmail.com
64
+ executables:
65
+ - nidyx
66
+ extensions: []
67
+ extra_rdoc_files:
68
+ - README.md
69
+ - LICENSE
70
+ files:
71
+ - lib/nidyx/common.rb
72
+ - lib/nidyx/core_ext/string.rb
73
+ - lib/nidyx/generator.rb
74
+ - lib/nidyx/mapper.rb
75
+ - lib/nidyx/model.rb
76
+ - lib/nidyx/objc/implementation.rb
77
+ - lib/nidyx/objc/interface.rb
78
+ - lib/nidyx/objc/mapper.rb
79
+ - lib/nidyx/objc/model.rb
80
+ - lib/nidyx/objc/model_base.rb
81
+ - lib/nidyx/objc/property.rb
82
+ - lib/nidyx/output.rb
83
+ - lib/nidyx/parse_constants.rb
84
+ - lib/nidyx/parser.rb
85
+ - lib/nidyx/pointer.rb
86
+ - lib/nidyx/property.rb
87
+ - lib/nidyx/reader.rb
88
+ - lib/nidyx/version.rb
89
+ - lib/nidyx.rb
90
+ - README.md
91
+ - LICENSE
92
+ - test/nidyx/core_ext/test_string.rb
93
+ - test/nidyx/objc/test_model_base.rb
94
+ - test/nidyx/objc/test_property.rb
95
+ - test/nidyx/test_common.rb
96
+ - test/nidyx/test_comparison.rb
97
+ - test/nidyx/test_parser.rb
98
+ - test/nidyx/test_pointer.rb
99
+ - test/nidyx/test_property.rb
100
+ - bin/nidyx
101
+ homepage: https://github.com/cknadler/nidyx
102
+ licenses:
103
+ - MIT
104
+ post_install_message:
105
+ rdoc_options: []
106
+ require_paths:
107
+ - lib
108
+ required_ruby_version: !ruby/object:Gem::Requirement
109
+ none: false
110
+ requirements:
111
+ - - ! '>='
112
+ - !ruby/object:Gem::Version
113
+ version: '0'
114
+ required_rubygems_version: !ruby/object:Gem::Requirement
115
+ none: false
116
+ requirements:
117
+ - - ! '>='
118
+ - !ruby/object:Gem::Version
119
+ version: '0'
120
+ requirements: []
121
+ rubyforge_project:
122
+ rubygems_version: 1.8.23.2
123
+ signing_key:
124
+ specification_version: 3
125
+ summary: Nidyx
126
+ test_files:
127
+ - test/nidyx/core_ext/test_string.rb
128
+ - test/nidyx/objc/test_model_base.rb
129
+ - test/nidyx/objc/test_property.rb
130
+ - test/nidyx/test_common.rb
131
+ - test/nidyx/test_comparison.rb
132
+ - test/nidyx/test_parser.rb
133
+ - test/nidyx/test_pointer.rb
134
+ - test/nidyx/test_property.rb