lluminary 0.1.4 → 0.2.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.
@@ -218,6 +218,261 @@ RSpec.describe Lluminary::Schema do
218
218
  errors = schema.validate(numbers: [1, "2", 3])
219
219
  expect(errors).to contain_exactly("Numbers[1] must be an Integer")
220
220
  end
221
+
222
+ it "supports hashes inside arrays" do
223
+ schema.array(:users) do
224
+ hash do
225
+ string :name
226
+ integer :age
227
+ end
228
+ end
229
+
230
+ expect(schema.fields[:users]).to eq(
231
+ {
232
+ type: :array,
233
+ description: nil,
234
+ element_type: {
235
+ type: :hash,
236
+ description: nil,
237
+ fields: {
238
+ name: {
239
+ type: :string,
240
+ description: nil
241
+ },
242
+ age: {
243
+ type: :integer,
244
+ description: nil
245
+ }
246
+ }
247
+ }
248
+ }
249
+ )
250
+ end
251
+
252
+ it "validates hashes inside arrays" do
253
+ schema.array(:users) do
254
+ hash do
255
+ string :name
256
+ integer :age
257
+ end
258
+ end
259
+
260
+ errors =
261
+ schema.validate(
262
+ users: [
263
+ { name: "Alice", age: 30 },
264
+ { name: 123, age: "invalid" }, # name should be string, age should be integer
265
+ { name: "Bob", age: 25 }
266
+ ]
267
+ )
268
+
269
+ expect(errors).to contain_exactly(
270
+ "Users[1][name] must be a String",
271
+ "Users[1][age] must be an Integer"
272
+ )
273
+ end
274
+ end
275
+
276
+ describe "#hash" do
277
+ it "requires a block for hash fields" do
278
+ expect { schema.hash(:config) }.to raise_error(
279
+ ArgumentError,
280
+ "Hash fields must be defined with a block"
281
+ )
282
+ end
283
+
284
+ it "adds a hash field with nested fields to the schema" do
285
+ schema.hash(:config, description: "Configuration") do
286
+ string :host, description: "The server hostname"
287
+ integer :port
288
+ end
289
+
290
+ expect(schema.fields).to eq(
291
+ {
292
+ config: {
293
+ type: :hash,
294
+ description: "Configuration",
295
+ fields: {
296
+ host: {
297
+ type: :string,
298
+ description: "The server hostname"
299
+ },
300
+ port: {
301
+ type: :integer,
302
+ description: nil
303
+ }
304
+ }
305
+ }
306
+ }
307
+ )
308
+ end
309
+
310
+ it "validates hash values" do
311
+ schema.hash(:config) do
312
+ string :host
313
+ integer :port
314
+ end
315
+
316
+ errors =
317
+ schema.validate(
318
+ config: {
319
+ host: 123, # should be string
320
+ port: "80" # should be integer
321
+ }
322
+ )
323
+
324
+ expect(errors).to contain_exactly(
325
+ "Config[host] must be a String",
326
+ "Config[port] must be an Integer"
327
+ )
328
+ end
329
+
330
+ it "validates that value is a hash" do
331
+ schema.hash(:config) { string :host }
332
+
333
+ errors = schema.validate(config: "not a hash")
334
+ expect(errors).to contain_exactly("Config must be a Hash")
335
+ end
336
+
337
+ it "supports nested hashes" do
338
+ schema.hash(:config) do
339
+ string :name
340
+ hash :database do
341
+ string :host
342
+ integer :port
343
+ hash :credentials do
344
+ string :username
345
+ string :password
346
+ end
347
+ end
348
+ end
349
+
350
+ expect(schema.fields[:config]).to eq(
351
+ {
352
+ type: :hash,
353
+ description: nil,
354
+ fields: {
355
+ name: {
356
+ type: :string,
357
+ description: nil
358
+ },
359
+ database: {
360
+ type: :hash,
361
+ description: nil,
362
+ fields: {
363
+ host: {
364
+ type: :string,
365
+ description: nil
366
+ },
367
+ port: {
368
+ type: :integer,
369
+ description: nil
370
+ },
371
+ credentials: {
372
+ type: :hash,
373
+ description: nil,
374
+ fields: {
375
+ username: {
376
+ type: :string,
377
+ description: nil
378
+ },
379
+ password: {
380
+ type: :string,
381
+ description: nil
382
+ }
383
+ }
384
+ }
385
+ }
386
+ }
387
+ }
388
+ }
389
+ )
390
+ end
391
+
392
+ it "validates nested hashes" do
393
+ schema.hash(:config) do
394
+ string :name
395
+ hash :database do
396
+ string :host
397
+ integer :port
398
+ hash :credentials do
399
+ string :username
400
+ string :password
401
+ end
402
+ end
403
+ end
404
+
405
+ errors =
406
+ schema.validate(
407
+ config: {
408
+ name: "test",
409
+ database: {
410
+ host: 123, # should be string
411
+ port: "80", # should be integer
412
+ credentials: {
413
+ username: 456, # should be string
414
+ password: 789 # should be string
415
+ }
416
+ }
417
+ }
418
+ )
419
+
420
+ expect(errors).to contain_exactly(
421
+ "Config[database][host] must be a String",
422
+ "Config[database][port] must be an Integer",
423
+ "Config[database][credentials][username] must be a String",
424
+ "Config[database][credentials][password] must be a String"
425
+ )
426
+ end
427
+
428
+ it "supports arrays inside hashes" do
429
+ schema.hash(:config) do
430
+ string :name
431
+ array :tags do
432
+ string
433
+ end
434
+ end
435
+
436
+ expect(schema.fields[:config]).to eq(
437
+ {
438
+ type: :hash,
439
+ description: nil,
440
+ fields: {
441
+ name: {
442
+ type: :string,
443
+ description: nil
444
+ },
445
+ tags: {
446
+ type: :array,
447
+ description: nil,
448
+ element_type: {
449
+ type: :string,
450
+ description: nil
451
+ }
452
+ }
453
+ }
454
+ }
455
+ )
456
+ end
457
+
458
+ it "validates arrays inside hashes" do
459
+ schema.hash(:config) do
460
+ string :name
461
+ array :tags do
462
+ string
463
+ end
464
+ end
465
+
466
+ errors =
467
+ schema.validate(
468
+ config: {
469
+ name: "test",
470
+ tags: ["valid", 123, "also valid"] # second element should be string
471
+ }
472
+ )
473
+
474
+ expect(errors).to contain_exactly("Config[tags][1] must be a String")
475
+ end
221
476
  end
222
477
 
223
478
  describe "primitive types" do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lluminary
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Doug Hughes
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-04-23 00:00:00.000000000 Z
11
+ date: 2025-04-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel
@@ -200,6 +200,7 @@ files:
200
200
  - lib/lluminary/validation_error.rb
201
201
  - lib/lluminary/version.rb
202
202
  - spec/examples/analyze_text_spec.rb
203
+ - spec/examples/character_profiler_spec.rb
203
204
  - spec/examples/color_analyzer_spec.rb
204
205
  - spec/examples/content_analyzer_spec.rb
205
206
  - spec/examples/historical_event_analyzer_spec.rb