|
26 | 26 | describe ".schema_definition" do
|
27 | 27 | it "allows defining a schema with all available options" do
|
28 | 28 | model_class.schema_definition do
|
29 |
| - title "Article Extraction" |
| 29 | + name "ArticleExtraction" |
30 | 30 | description "Extract article metadata"
|
31 | 31 | version 2
|
32 | 32 |
|
|
38 | 38 | expect(model_class.schema_builder).to be_a(Structify::SchemaBuilder)
|
39 | 39 | expect(model_class.extraction_version).to eq(2)
|
40 | 40 | end
|
| 41 | + |
| 42 | + it "validates schema name format" do |
| 43 | + # Valid names |
| 44 | + expect { |
| 45 | + model_class.schema_definition do |
| 46 | + name "ValidName" |
| 47 | + end |
| 48 | + }.not_to raise_error |
| 49 | + |
| 50 | + expect { |
| 51 | + model_class.schema_definition do |
| 52 | + name "valid_name_with_underscores" |
| 53 | + end |
| 54 | + }.not_to raise_error |
| 55 | + |
| 56 | + expect { |
| 57 | + model_class.schema_definition do |
| 58 | + name "valid-name-with-hyphens" |
| 59 | + end |
| 60 | + }.not_to raise_error |
| 61 | + |
| 62 | + expect { |
| 63 | + model_class.schema_definition do |
| 64 | + name "valid123_with_numbers" |
| 65 | + end |
| 66 | + }.not_to raise_error |
| 67 | + |
| 68 | + # Invalid names with spaces or special characters |
| 69 | + expect { |
| 70 | + model_class.schema_definition do |
| 71 | + name "Invalid Name With Spaces" |
| 72 | + end |
| 73 | + }.to raise_error(ArgumentError, /Schema name must only contain alphanumeric characters/) |
| 74 | + |
| 75 | + expect { |
| 76 | + model_class.schema_definition do |
| 77 | + name "invalid!name@with#special$chars" |
| 78 | + end |
| 79 | + }.to raise_error(ArgumentError, /Schema name must only contain alphanumeric characters/) |
| 80 | + end |
41 | 81 | end
|
42 | 82 |
|
43 | 83 | describe ".json_schema" do
|
44 | 84 | before do
|
45 | 85 | model_class.schema_definition do
|
46 |
| - title "Article Extraction" |
| 86 | + name "ArticleExtraction" |
47 | 87 | description "Extract article metadata"
|
48 | 88 | field :title, :string, required: true
|
49 | 89 | field :summary, :text, description: "A brief summary"
|
|
54 | 94 | it "generates a valid JSON schema" do
|
55 | 95 | schema = model_class.json_schema
|
56 | 96 |
|
57 |
| - expect(schema[:name]).to eq("Article Extraction") |
| 97 | + expect(schema[:name]).to eq("ArticleExtraction") |
58 | 98 | expect(schema[:description]).to eq("Extract article metadata")
|
59 | 99 | expect(schema[:parameters]).to be_a(Hash)
|
60 | 100 | expect(schema[:parameters][:required]).to eq(["title"])
|
|
69 | 109 | include Structify::Model
|
70 | 110 |
|
71 | 111 | schema_definition do
|
72 |
| - title "Article Extraction with Thinking" |
| 112 | + name "ArticleExtractionThinking" |
73 | 113 | description "Extract article metadata with chain of thought"
|
74 | 114 | thinking true
|
75 | 115 | field :title, :string, required: true
|
|
406 | 446 |
|
407 | 447 | it "defaults to version 1 if not specified" do
|
408 | 448 | model_class.schema_definition do
|
409 |
| - title "Test" |
| 449 | + name "Test" |
410 | 450 | end
|
411 | 451 |
|
412 | 452 | expect(model_class.extraction_version).to eq(1)
|
|
422 | 462 | # Define version 1 schema
|
423 | 463 | schema_definition do
|
424 | 464 | version 1
|
425 |
| - title "Article Extraction V1" |
| 465 | + name "ArticleExtractionV1" |
426 | 466 |
|
427 | 467 | field :title, :string
|
428 | 468 | field :category, :string
|
|
440 | 480 | # Define version 2 schema with additional fields
|
441 | 481 | schema_definition do
|
442 | 482 | version 2
|
443 |
| - title "Article Extraction V2" |
| 483 | + name "ArticleExtractionV2" |
444 | 484 |
|
445 | 485 | # Fields from version 1
|
446 | 486 | field :title, :string, versions: 1..999
|
|
463 | 503 | # Define version 3 schema with simplified lifecycle syntax
|
464 | 504 | schema_definition do
|
465 | 505 | version 3
|
466 |
| - title "Article Extraction V3" |
| 506 | + name "ArticleExtractionV3" |
467 | 507 |
|
468 | 508 | # Fields available in all versions (1..999)
|
469 | 509 | field :title, :string, versions: 1..999
|
|
491 | 531 |
|
492 | 532 | schema_definition do
|
493 | 533 | version 4
|
494 |
| - title "Simplified Versioning Example" |
| 534 | + name "SimplifiedVersioning" |
495 | 535 |
|
496 | 536 | # All of these syntaxes should work
|
497 | 537 | field :always_available, :string, versions: 1..999 # From v1 onward
|
|
0 commit comments