nidyx 0.1.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,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