schema-resume-validator 1.1.0 → 1.3.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0e49ee98c8f5eb9d19a35053731446e94e6e9cc12471a92c965d39ab8eb5855c
4
- data.tar.gz: 0326c213338e27f959ed7b4e515a409892a0c3ab06ca7d95a398b6a08635e611
3
+ metadata.gz: 4d785a0e550c5e5eb9d7ab2bbb6e7d0977dfab6dcee108d6b934f2e0de3754b2
4
+ data.tar.gz: c5b97fc92f8a9aa8c9a4c8a5846e74018d946273263b65abafed1bdb76e8ff00
5
5
  SHA512:
6
- metadata.gz: ea78337519c989d8f312ced4e5fac349bdb6bb2719aeb14f72d45608f823f94f23e739d54ebe76fe8a6c501a9e3d12c1189529778e0bb1e111ce33165cb41b3c
7
- data.tar.gz: 414898422facfaeab31184cc9688e783a8721a3273b3b4fdb2c2c89a78471984a37729f19427084734de50f6a79cca19911faf4ca993415e875a2fd10b24531c
6
+ metadata.gz: 9e36c63753da817fd4a629e34caf08820ed60201854aa9f97c8b21f85d8b8b6db021db533d880f7cc88fffdcfd26980a0fa4262ef2ff0eef07f2f85bf9e53fcb
7
+ data.tar.gz: cef33601db4d1b1f3ad9b993dc0c8eab890daeff126a1c24a2601dc41a8038b93471d578c743f68d5efffc17d59b92cb16e623fd41ee4958cf8b2ebda3a6af48
@@ -27,6 +27,11 @@
27
27
  "@type": "xsd:string"
28
28
  },
29
29
 
30
+ "demographics": {
31
+ "@id": "schema:Person",
32
+ "@type": "@id"
33
+ },
34
+
30
35
  "age": {
31
36
  "@id": "schema:age",
32
37
  "@type": "xsd:integer"
@@ -192,7 +197,13 @@
192
197
  "@type": "@id",
193
198
  "@container": "@list"
194
199
  },
195
-
200
+
201
+ "positions": {
202
+ "@id": "schema:hasOccupation",
203
+ "@type": "@id",
204
+ "@container": "@list"
205
+ },
206
+
196
207
  "position": {
197
208
  "@id": "schema:jobTitle",
198
209
  "@type": "xsd:string"
@@ -1,11 +1,10 @@
1
1
  {
2
- "$schema": "https://schema-resume.org/meta-schema.json",
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
3
  "$id": "https://schema-resume.org/meta-schema.json",
4
4
  "$comment": "Primary domain: https://schema-resume.org/ | Alternate domain: https://tradik.github.io/schema-resume/",
5
- "title": "Schema Resume Meta-Schema v1.1.0",
5
+ "title": "Schema Resume Meta-Schema v1.3.0",
6
6
  "description": "Self-hosted meta-schema providing validation rules for resume documents without external dependencies",
7
7
  "type": "object",
8
- "version": "1.1.0",
9
8
  "definitions": {
10
9
  "schemaArray": {
11
10
  "type": "array",
@@ -3,11 +3,11 @@
3
3
  xmlns:sr="https://schema-resume.org/xml/1.0"
4
4
  targetNamespace="https://schema-resume.org/xml/1.0"
5
5
  elementFormDefault="qualified"
6
- version="1.1.0">
6
+ version="1.3.0">
7
7
 
8
8
  <xs:annotation>
9
9
  <xs:documentation>
10
- Schema Resume XML Schema Definition (XSD) v1.1.0
10
+ Schema Resume XML Schema Definition (XSD) v1.3.0
11
11
  Self-hosted XML schema for CV/Resume validation with work authorization and tools tracking
12
12
 
13
13
  This schema provides comprehensive validation for resume/CV documents in XML format.
@@ -17,7 +17,7 @@
17
17
  Primary domain: https://schema-resume.org/
18
18
  Alternate domain: https://tradik.github.io/schema-resume/
19
19
 
20
- Version: 1.1.0
20
+ Version: 1.3.0
21
21
  License: MIT
22
22
  Repository: https://github.com/tradik/schema-resume
23
23
  </xs:documentation>
@@ -105,15 +105,33 @@
105
105
  </xs:sequence>
106
106
  </xs:complexType>
107
107
 
108
+ <!--
109
+ Protected personal characteristics. Omit unless the receiving market expects
110
+ them: in the UK and most of the EU a CV should not carry age, date of birth
111
+ or gender. Grouped so that including them is a deliberate choice and a
112
+ processor can strip them in one step.
113
+ -->
114
+ <xs:complexType name="DemographicsType">
115
+ <xs:sequence>
116
+ <xs:element name="age" type="xs:integer" minOccurs="0"/>
117
+ <xs:element name="dateOfBirth" type="sr:iso8601DateType" minOccurs="0"/>
118
+ <xs:element name="gender" type="xs:string" minOccurs="0"/>
119
+ </xs:sequence>
120
+ <xs:attribute name="type" type="xs:string"/>
121
+ </xs:complexType>
122
+
108
123
  <!-- Basics Section -->
109
124
  <xs:complexType name="BasicsType">
110
125
  <xs:sequence>
111
126
  <xs:element name="name" type="xs:string" minOccurs="0"/>
112
127
  <xs:element name="label" type="xs:string" minOccurs="0"/>
113
128
  <xs:element name="title" type="xs:string" minOccurs="0"/>
129
+ <!-- DEPRECATED since 1.3.0: use <demographics>. Kept, in their original
130
+ sequence position, so every 1.x document keeps validating. -->
114
131
  <xs:element name="age" type="xs:integer" minOccurs="0"/>
115
132
  <xs:element name="dateOfBirth" type="sr:iso8601DateType" minOccurs="0"/>
116
133
  <xs:element name="gender" type="xs:string" minOccurs="0"/>
134
+ <xs:element name="demographics" type="sr:DemographicsType" minOccurs="0"/>
117
135
  <xs:element name="legalNote" type="sr:LegalNoteType" minOccurs="0"/>
118
136
  <xs:element name="image" type="xs:anyURI" minOccurs="0"/>
119
137
  <xs:element name="email" type="xs:string" minOccurs="0"/>
@@ -201,6 +219,25 @@
201
219
  <xs:element name="endDate" type="sr:iso8601DateType" minOccurs="0"/>
202
220
  <xs:element name="summary" type="xs:string" minOccurs="0"/>
203
221
  <xs:element name="highlights" type="sr:StringListType" minOccurs="0"/>
222
+ <xs:element name="positions" type="sr:PositionListType" minOccurs="0"/>
223
+ </xs:sequence>
224
+ </xs:complexType>
225
+
226
+ <!-- Multiple roles held at the same organization over time (career progression) -->
227
+ <xs:complexType name="PositionListType">
228
+ <xs:sequence>
229
+ <xs:element name="item" type="sr:PositionType" minOccurs="0" maxOccurs="unbounded"/>
230
+ </xs:sequence>
231
+ </xs:complexType>
232
+
233
+ <xs:complexType name="PositionType">
234
+ <xs:sequence>
235
+ <xs:element name="position" type="xs:string" minOccurs="0"/>
236
+ <xs:element name="workType" type="sr:workTypeEnum" minOccurs="0"/>
237
+ <xs:element name="startDate" type="sr:iso8601DateType" minOccurs="0"/>
238
+ <xs:element name="endDate" type="sr:iso8601DateType" minOccurs="0"/>
239
+ <xs:element name="summary" type="xs:string" minOccurs="0"/>
240
+ <xs:element name="highlights" type="sr:StringListType" minOccurs="0"/>
204
241
  </xs:sequence>
205
242
  </xs:complexType>
206
243
 
@@ -223,6 +260,16 @@
223
260
  </xs:sequence>
224
261
  </xs:complexType>
225
262
 
263
+ <!-- Legal disclaimers, consent statements, or data processing notes -->
264
+ <xs:complexType name="LegalNoteType">
265
+ <xs:sequence>
266
+ <xs:element name="text" type="xs:string" minOccurs="0"/>
267
+ <xs:element name="country" type="sr:countryCodeType" minOccurs="0"/>
268
+ <xs:element name="type" type="xs:string" minOccurs="0"/>
269
+ <xs:element name="url" type="xs:anyURI" minOccurs="0"/>
270
+ </xs:sequence>
271
+ </xs:complexType>
272
+
226
273
  <!-- Volunteer Section -->
227
274
  <xs:complexType name="VolunteerType">
228
275
  <xs:sequence>
data/schemas/schema.json CHANGED
@@ -1,23 +1,7 @@
1
1
  {
2
- "@context": {
3
- "@vocab": "https://schema-resume.org/",
4
- "schema": "http://schema.org/",
5
- "xsd": "http://www.w3.org/2001/XMLSchema#",
6
- "name": "schema:name",
7
- "email": "schema:email",
8
- "url": "schema:url",
9
- "telephone": "schema:telephone",
10
- "address": "schema:address",
11
- "jobTitle": "schema:jobTitle",
12
- "worksFor": "schema:worksFor",
13
- "alumniOf": "schema:alumniOf",
14
- "award": "schema:award",
15
- "knowsAbout": "schema:knowsAbout",
16
- "knowsLanguage": "schema:knowsLanguage"
17
- },
18
- "$schema": "https://schema-resume.org/meta-schema.json",
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
19
3
  "$id": "https://schema-resume.org/schema.json",
20
- "$comment": "Primary domain: https://schema-resume.org/ | Alternate domain: https://tradik.github.io/schema-resume/",
4
+ "$comment": "The JSON-LD context for documents that follow this schema is published separately at https://schema-resume.org/context.jsonld a resume document references it from its own @context. Until 1.3.0 a 14-term fragment of it was embedded here as a top-level @context, which covered 9 of the 102 canonical terms, defined 7 that did not exist, contradicted the canonical definition of `address`, and made this file fail JSON Schema strict-mode validation as an unknown keyword.",
21
5
  "additionalProperties": true,
22
6
  "definitions": {
23
7
  "iso8601": {
@@ -59,16 +43,45 @@
59
43
  },
60
44
  "age": {
61
45
  "type": "integer",
62
- "description": "Age of the person in years",
46
+ "description": "DEPRECATED since 1.3.0 use basics.demographics.age. Still accepted so that every 1.x document keeps validating; scheduled for removal in 2.0.0.",
47
+ "deprecated": true,
63
48
  "minimum": 0
64
49
  },
65
50
  "dateOfBirth": {
66
51
  "$ref": "#/definitions/iso8601",
67
- "description": "Date of birth in ISO 8601 format"
52
+ "description": "DEPRECATED since 1.3.0 use basics.demographics.dateOfBirth. Still accepted so that every 1.x document keeps validating; scheduled for removal in 2.0.0.",
53
+ "deprecated": true
68
54
  },
69
55
  "gender": {
70
56
  "type": "string",
71
- "description": "Gender identity of the person"
57
+ "description": "DEPRECATED since 1.3.0 use basics.demographics.gender. Still accepted so that every 1.x document keeps validating; scheduled for removal in 2.0.0.",
58
+ "deprecated": true
59
+ },
60
+ "demographics": {
61
+ "type": "object",
62
+ "description": "Protected personal characteristics. Omit this object entirely unless the receiving market expects it. In the UK and most of the EU a CV should not carry age, date of birth or gender: they are protected characteristics under the Equality Act 2010 and comparable law, employers are advised not to request them, and including them invites discrimination claims. Some markets, notably Germany and Japan, do conventionally include a date of birth. Provided as a separate object so that supplying it is a deliberate choice and so that a processor can drop it in one step.",
63
+ "additionalProperties": true,
64
+ "properties": {
65
+ "@type": {
66
+ "type": "string",
67
+ "description": "Schema.org type. Use 'Person' for Schema.org validation.",
68
+ "default": "Person"
69
+ },
70
+ "age": {
71
+ "type": "integer",
72
+ "description": "Age in years. Derived data that goes stale; prefer dateOfBirth if either is genuinely required.",
73
+ "minimum": 0,
74
+ "maximum": 150
75
+ },
76
+ "dateOfBirth": {
77
+ "$ref": "#/definitions/iso8601",
78
+ "description": "Date of birth in ISO 8601 format. Conventional in some markets (DE, JP), discouraged in others (UK, US)."
79
+ },
80
+ "gender": {
81
+ "type": "string",
82
+ "description": "Gender identity, in the person's own words. Free text on purpose: an enumeration here would exclude people. In the EU this may be special-category data under GDPR Article 9."
83
+ }
84
+ }
72
85
  },
73
86
  "legalNote": {
74
87
  "type": "object",
@@ -119,7 +132,6 @@
119
132
  "keyAchievements": {
120
133
  "type": "array",
121
134
  "description": "Notable career achievements and accomplishments",
122
- "additionalItems": false,
123
135
  "items": {
124
136
  "type": "string",
125
137
  "description": "Individual achievement"
@@ -128,7 +140,6 @@
128
140
  "coreCompetencies": {
129
141
  "type": "array",
130
142
  "description": "Core professional competencies and areas of expertise",
131
- "additionalItems": false,
132
143
  "items": {
133
144
  "type": "string",
134
145
  "description": "Competency or area of expertise"
@@ -167,7 +178,6 @@
167
178
  "profiles": {
168
179
  "type": "array",
169
180
  "description": "List of social media and professional network profiles",
170
- "additionalItems": false,
171
181
  "items": {
172
182
  "type": "object",
173
183
  "additionalProperties": true,
@@ -191,7 +201,6 @@
191
201
  "nationalities": {
192
202
  "type": "array",
193
203
  "description": "Citizenship and nationality information",
194
- "additionalItems": false,
195
204
  "items": {
196
205
  "type": "object",
197
206
  "additionalProperties": true,
@@ -214,7 +223,6 @@
214
223
  "workAuthorization": {
215
224
  "type": "array",
216
225
  "description": "Work authorization information for multiple countries",
217
- "additionalItems": false,
218
226
  "items": {
219
227
  "type": "object",
220
228
  "additionalProperties": true,
@@ -256,7 +264,6 @@
256
264
  "work": {
257
265
  "type": "array",
258
266
  "description": "Employment history including current and previous positions",
259
- "additionalItems": false,
260
267
  "items": {
261
268
  "type": "object",
262
269
  "additionalProperties": true,
@@ -365,11 +372,53 @@
365
372
  "highlights": {
366
373
  "type": "array",
367
374
  "description": "Notable achievements and accomplishments in this role",
368
- "additionalItems": false,
369
375
  "items": {
370
376
  "type": "string",
371
377
  "description": "Individual achievement or accomplishment"
372
378
  }
379
+ },
380
+ "positions": {
381
+ "type": "array",
382
+ "description": "Multiple roles held at the same organization over time, capturing career progression such as promotions. Use this to avoid repeating organization details (name, location, url) for each role. The top-level 'position', 'startDate', 'endDate', 'summary', and 'highlights' fields remain valid for single-role entries; prefer either the singular fields or this array, not both, for the same information.",
383
+ "items": {
384
+ "type": "object",
385
+ "additionalProperties": true,
386
+ "properties": {
387
+ "@type": {
388
+ "type": "string",
389
+ "description": "Schema.org type, should be 'schema:EmployeeRole' for validator.schema.org compatibility"
390
+ },
391
+ "position": {
392
+ "type": "string",
393
+ "description": "Job title or role held at the organization (e.g., 'Senior Software Engineer')"
394
+ },
395
+ "workType": {
396
+ "type": "string",
397
+ "description": "Type of work arrangement (remote, hybrid, onsite, full-time, part-time, contract, freelance, internship, temporary)",
398
+ "enum": ["remote", "hybrid", "onsite", "full-time", "part-time", "contract", "freelance", "internship", "temporary"]
399
+ },
400
+ "startDate": {
401
+ "$ref": "#/definitions/iso8601",
402
+ "description": "Date when this role began"
403
+ },
404
+ "endDate": {
405
+ "$ref": "#/definitions/iso8601",
406
+ "description": "Date when this role ended (omit if currently in this role)"
407
+ },
408
+ "summary": {
409
+ "type": "string",
410
+ "description": "Overview of responsibilities within this specific role"
411
+ },
412
+ "highlights": {
413
+ "type": "array",
414
+ "description": "Notable achievements and accomplishments in this specific role",
415
+ "items": {
416
+ "type": "string",
417
+ "description": "Individual achievement or accomplishment"
418
+ }
419
+ }
420
+ }
421
+ }
373
422
  }
374
423
  }
375
424
  }
@@ -377,7 +426,6 @@
377
426
  "volunteer": {
378
427
  "type": "array",
379
428
  "description": "Volunteer work and community involvement activities",
380
- "additionalItems": false,
381
429
  "items": {
382
430
  "type": "object",
383
431
  "additionalProperties": true,
@@ -414,7 +462,6 @@
414
462
  "highlights": {
415
463
  "type": "array",
416
464
  "description": "Key accomplishments and impact made through volunteer work",
417
- "additionalItems": false,
418
465
  "items": {
419
466
  "type": "string",
420
467
  "description": "Specific achievement or contribution"
@@ -426,7 +473,6 @@
426
473
  "education": {
427
474
  "type": "array",
428
475
  "description": "Academic qualifications and educational background",
429
- "additionalItems": false,
430
476
  "items": {
431
477
  "type": "object",
432
478
  "additionalProperties": true,
@@ -487,7 +533,6 @@
487
533
  "courses": {
488
534
  "type": "array",
489
535
  "description": "Relevant modules, courses, or subjects studied",
490
- "additionalItems": false,
491
536
  "items": {
492
537
  "type": "string",
493
538
  "description": "Course name or code"
@@ -499,7 +544,6 @@
499
544
  "awards": {
500
545
  "type": "array",
501
546
  "description": "Professional awards, honours, and recognitions received",
502
- "additionalItems": false,
503
547
  "items": {
504
548
  "type": "object",
505
549
  "additionalProperties": true,
@@ -530,7 +574,6 @@
530
574
  "certificates": {
531
575
  "type": "array",
532
576
  "description": "Professional certifications and accreditations obtained",
533
- "additionalItems": false,
534
577
  "items": {
535
578
  "type": "object",
536
579
  "additionalProperties": true,
@@ -558,7 +601,6 @@
558
601
  "publications": {
559
602
  "type": "array",
560
603
  "description": "Published works including papers, articles, and books",
561
- "additionalItems": false,
562
604
  "items": {
563
605
  "type": "object",
564
606
  "additionalProperties": true,
@@ -590,7 +632,6 @@
590
632
  "skills": {
591
633
  "type": "array",
592
634
  "description": "Technical and professional competencies",
593
- "additionalItems": false,
594
635
  "items": {
595
636
  "type": "object",
596
637
  "additionalProperties": true,
@@ -615,7 +656,6 @@
615
656
  "keywords": {
616
657
  "type": "array",
617
658
  "description": "Specific technologies, tools, or techniques within this skill area",
618
- "additionalItems": false,
619
659
  "items": {
620
660
  "type": "string",
621
661
  "description": "Technology or tool name"
@@ -627,7 +667,6 @@
627
667
  "tools": {
628
668
  "type": "array",
629
669
  "description": "Specific tools, software, and platforms used professionally",
630
- "additionalItems": false,
631
670
  "items": {
632
671
  "type": "object",
633
672
  "additionalProperties": true,
@@ -668,7 +707,6 @@
668
707
  "languages": {
669
708
  "type": "array",
670
709
  "description": "Languages spoken and proficiency levels",
671
- "additionalItems": false,
672
710
  "items": {
673
711
  "type": "object",
674
712
  "additionalProperties": true,
@@ -691,7 +729,6 @@
691
729
  "interests": {
692
730
  "type": "array",
693
731
  "description": "Personal interests and hobbies outside of work",
694
- "additionalItems": false,
695
732
  "items": {
696
733
  "type": "object",
697
734
  "additionalProperties": true,
@@ -707,7 +744,6 @@
707
744
  "keywords": {
708
745
  "type": "array",
709
746
  "description": "Specific topics or activities within this interest",
710
- "additionalItems": false,
711
747
  "items": {
712
748
  "type": "string",
713
749
  "description": "Specific topic or activity"
@@ -719,7 +755,6 @@
719
755
  "references": {
720
756
  "type": "array",
721
757
  "description": "Professional references and testimonials",
722
- "additionalItems": false,
723
758
  "items": {
724
759
  "type": "object",
725
760
  "additionalProperties": true,
@@ -738,7 +773,6 @@
738
773
  "projects": {
739
774
  "type": "array",
740
775
  "description": "Personal and professional projects undertaken",
741
- "additionalItems": false,
742
776
  "items": {
743
777
  "type": "object",
744
778
  "additionalProperties": true,
@@ -758,7 +792,6 @@
758
792
  "highlights": {
759
793
  "type": "array",
760
794
  "description": "Key features, achievements, or outcomes of the project",
761
- "additionalItems": false,
762
795
  "items": {
763
796
  "type": "string",
764
797
  "description": "Individual highlight or achievement"
@@ -767,7 +800,6 @@
767
800
  "keywords": {
768
801
  "type": "array",
769
802
  "description": "Technologies, methodologies, or tools used in the project",
770
- "additionalItems": false,
771
803
  "items": {
772
804
  "type": "string",
773
805
  "description": "Technology or tool name"
@@ -789,7 +821,6 @@
789
821
  "roles": {
790
822
  "type": "array",
791
823
  "description": "Roles held or responsibilities taken in the project",
792
- "additionalItems": false,
793
824
  "items": {
794
825
  "type": "string",
795
826
  "description": "Role or responsibility"
@@ -842,8 +873,7 @@
842
873
  }
843
874
  }
844
875
  },
845
- "title": "Schema Resume v1.1.0",
876
+ "title": "Schema Resume v1.3.0",
846
877
  "description": "Self-hosted JSON-LD schema for CV/Resume parsing and validation with work authorization and tools tracking",
847
- "type": "object",
848
- "version": "1.1.0"
878
+ "type": "object"
849
879
  }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: schema-resume-validator
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Schema Resume
@@ -9,22 +9,28 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2025-10-27 00:00:00.000000000 Z
12
+ date: 2026-08-26 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: json-schema
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  requirements:
18
- - - "~>"
18
+ - - ">="
19
19
  - !ruby/object:Gem::Version
20
20
  version: '4.0'
21
+ - - "<"
22
+ - !ruby/object:Gem::Version
23
+ version: '7'
21
24
  type: :runtime
22
25
  prerelease: false
23
26
  version_requirements: !ruby/object:Gem::Requirement
24
27
  requirements:
25
- - - "~>"
28
+ - - ">="
26
29
  - !ruby/object:Gem::Version
27
30
  version: '4.0'
31
+ - - "<"
32
+ - !ruby/object:Gem::Version
33
+ version: '7'
28
34
  - !ruby/object:Gem::Dependency
29
35
  name: json
30
36
  requirement: !ruby/object:Gem::Requirement