Skip to content

Commit ceb262a

Browse files
committed
feat: release version 1.8.0 with breaking changes, enhanced documentation, and new migration guide for value-help entities
1 parent 2792f1e commit ceb262a

17 files changed

Lines changed: 290 additions & 87 deletions

CHANGELOG.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,20 @@
33
All notable changes to this project will be documented in this file.
44
The format is based on [Keep a Changelog](http://keepachangelog.com/).
55

6+
## [1.8.0] - 2026-03-14
7+
8+
**Changed**
9+
10+
- Enhance README and improve project documentation
11+
- Add PostgreSQL profile-specific model exposure updates across CDS models and service projection
12+
- Add and expand Star Wars CDS model unit tests, including profile-specific exposure coverage
13+
- Update project dependencies and bump version to 1.8.0
14+
- Update dev container setup (Dockerfile and devcontainer.json) for Node.js LTS and Cloud Foundry CLI installation
15+
- Add CAP modeling and handler guidelines plus validation prompt workflows
16+
- Add compatibility-safe value-help entity migration (`*Values` helper entities) and keep legacy helper entities/projections with deprecation comments for phased removal
17+
- BREAKING: remove legacy value-help helper entities/projections (`climate`, `terrain`, `hair_colors`, `eye_colors`, `skin_colors`, `classification`, `designation`, `language`) in favor of `*Values` artifacts
18+
- Migration details: `cap/docs/value-help-migration.md`
19+
620
## [1.4.0] - 2024-07-19
721

822
**Changed**

README.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,12 @@ From the Cloud Application Programming Model preview (which opens locally when u
6363

6464
![Fiori Preveiw Overview Edit](images/Fiori_Preview_Overview_Edit.png)
6565

66+
## Upgrade Notes
67+
68+
* **Breaking change**: legacy value-help helper endpoints were removed in favor of `*Values` entities.
69+
* Migration details and endpoint mapping are documented in:
70+
* [`cap/docs/value-help-migration.md`](./cap/docs/value-help-migration.md)
71+
6672
## Known Issues
6773

6874
If you receive an error like the following when running the convertData script
@@ -75,7 +81,7 @@ If you receive an error like the following when running the convertData script
7581
}
7682
```
7783

78-
This is caused by the parallel nature of the loading of the data in SQLite. The default script with its parallel loading works fine when you use HANA as the target persistence. However if you are using SQLite for your tempoary testing persistence, then you can use the alternative convertDataLite script instead.
84+
This is caused by the parallel nature of the loading of the data in SQLite. The default script with its parallel loading works fine when you use HANA as the target persistence. However if you are using SQLite for your tempoary testing persistence, then you can use the alternative convertDataLite script instead.
7985

8086
**Note**: due to some strange circumstances in the latest versions of CAP it seems the `/gen/srv` folder is getting cleared after any deployment to HANA. Therefore just execute a `cds build` or `npm run build` after any deployment to restore the `/gen` folder until we find the root cause of this issue.
8187

cap/CHANGELOG.json

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,19 @@
11
[
2+
{
3+
"date": "2026-03-14",
4+
"version": "1.8.0",
5+
"Changed": [
6+
"Enhance README and improve project documentation",
7+
"Add PostgreSQL profile-specific model exposure updates across CDS models and service projection",
8+
"Add and expand Star Wars CDS model unit tests, including profile-specific exposure coverage",
9+
"Update project dependencies and bump version to 1.8.0",
10+
"Update dev container setup (Dockerfile and devcontainer.json) for Node.js LTS and Cloud Foundry CLI installation",
11+
"Add CAP modeling and handler guidelines plus validation prompt workflows",
12+
"Add compatibility-safe value-help entity migration (*Values helper entities) while retaining legacy helper entities/projections with deprecation comments",
13+
"BREAKING: remove legacy value-help helper entities/projections (climate, terrain, hair_colors, eye_colors, skin_colors, classification, designation, language) in favor of *Values artifacts",
14+
"Migration details: cap/docs/value-help-migration.md"
15+
]
16+
},
217
{
318
"date": "2024-07-19",
419
"version": "1.4.0",

cap/README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,3 +40,9 @@ Learn more at <https://cap.cloud.sap/docs/get-started/>.
4040
- Run full model tests: `npm run test`
4141
- Run profile-scoping regression tests only: `npm run test:profile`
4242
- CI tip: use `npm run test:profile` as a fast gate for profile-specific model/service exposure checks.
43+
44+
## Upgrade Notes
45+
46+
- **Breaking change**: legacy value-help helper endpoints were removed in favor of `*Values` entities.
47+
- If your UI/integration code called legacy endpoints directly, update it using:
48+
- `docs/value-help-migration.md`

cap/convertData.js

Lines changed: 63 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,30 @@ function normalizeDate(value) {
7878
return parsed.toISOString().slice(0, 10)
7979
}
8080

81+
function normalizeBirthYear(value) {
82+
const normalized = normalizeString(value)
83+
if (!normalized) {
84+
return null
85+
}
86+
87+
const canonical = normalized.replaceAll(' ', '').toUpperCase()
88+
if (!/^[0-9]+(?:BBY|ABY)$/.test(canonical)) {
89+
return null
90+
}
91+
92+
return canonical
93+
}
94+
95+
function hasMandatoryValue(value, entityName, fieldName, sourcePk, report) {
96+
if (value !== null && value !== undefined) {
97+
return true
98+
}
99+
100+
report.stats.skippedRecords += 1
101+
report.warnings.push(`[MissingMandatory] ${entityName}.${fieldName}(${sourcePk}) is required`)
102+
return false
103+
}
104+
81105
function deterministicId(kind, sourceKey) {
82106
return uuidv5(`${kind}:${sourceKey}`, MIGRATION_ID_NAMESPACE)
83107
}
@@ -212,9 +236,14 @@ function transformFixtures(fixtures, report) {
212236
}
213237

214238
for (const planet of planets) {
239+
const name = normalizeString(planet.fields.name)
240+
if (!hasMandatoryValue(name, 'Planet', 'name', planet.pk, report)) {
241+
continue
242+
}
243+
215244
pushRow(rows.Planet, dedupe.Planet, {
216245
ID: planet.ID,
217-
name: normalizeString(planet.fields.name),
246+
name,
218247
diameter: normalizeString(planet.fields.diameter),
219248
rotation_period: normalizeString(planet.fields.rotation_period),
220249
orbital_period: normalizeString(planet.fields.orbital_period),
@@ -228,16 +257,21 @@ function transformFixtures(fixtures, report) {
228257

229258
for (const person of people) {
230259
const homeworld = resolveReference(planetsByPk, person.fields.homeworld, `People.homeworld(${person.pk})`, report)
260+
const name = normalizeString(person.fields.name)
261+
if (!hasMandatoryValue(name, 'People', 'name', person.pk, report)) {
262+
continue
263+
}
264+
231265
pushRow(rows.People, dedupe.People, {
232266
ID: person.ID,
233267
homeworld_ID: homeworld?.ID ?? null,
234-
name: normalizeString(person.fields.name),
268+
name,
235269
height: normalizeString(person.fields.height),
236270
mass: normalizeString(person.fields.mass),
237271
hair_color: normalizeString(person.fields.hair_color),
238272
skin_color: normalizeString(person.fields.skin_color),
239273
eye_color: normalizeString(person.fields.eye_color),
240-
birth_year: normalizeString(person.fields.birth_year),
274+
birth_year: normalizeBirthYear(person.fields.birth_year),
241275
gender: normalizeString(person.fields.gender)
242276
})
243277

@@ -257,9 +291,14 @@ function transformFixtures(fixtures, report) {
257291
continue
258292
}
259293

294+
const name = normalizeString(transport.fields.name)
295+
if (!hasMandatoryValue(name, 'Starship', 'name', ship.pk, report)) {
296+
continue
297+
}
298+
260299
pushRow(rows.Starship, dedupe.Starship, {
261300
ID: ship.ID,
262-
name: normalizeString(transport.fields.name),
301+
name,
263302
model: normalizeString(transport.fields.model),
264303
starship_class: normalizeString(ship.fields.starship_class),
265304
manufacturer: normalizeString(transport.fields.manufacturer),
@@ -296,9 +335,14 @@ function transformFixtures(fixtures, report) {
296335
continue
297336
}
298337

338+
const name = normalizeString(transport.fields.name)
339+
if (!hasMandatoryValue(name, 'Vehicles', 'name', vehicle.pk, report)) {
340+
continue
341+
}
342+
299343
pushRow(rows.Vehicles, dedupe.Vehicles, {
300344
ID: vehicle.ID,
301-
name: normalizeString(transport.fields.name),
345+
name,
302346
model: normalizeString(transport.fields.model),
303347
vehicle_class: normalizeString(vehicle.fields.vehicle_class),
304348
manufacturer: normalizeString(transport.fields.manufacturer),
@@ -328,9 +372,14 @@ function transformFixtures(fixtures, report) {
328372

329373
for (const specie of species) {
330374
const homeworld = resolveReference(planetsByPk, specie.fields.homeworld, `Species.homeworld(${specie.pk})`, report)
375+
const name = normalizeString(specie.fields.name)
376+
if (!hasMandatoryValue(name, 'Species', 'name', specie.pk, report)) {
377+
continue
378+
}
379+
331380
pushRow(rows.Species, dedupe.Species, {
332381
ID: specie.ID,
333-
name: normalizeString(specie.fields.name),
382+
name,
334383
classification: normalizeString(specie.fields.classification),
335384
designation: normalizeString(specie.fields.designation),
336385
eye_colors: normalizeString(specie.fields.eye_colors),
@@ -363,10 +412,15 @@ function transformFixtures(fixtures, report) {
363412
continue
364413
}
365414

415+
const title = normalizeString(film.fields.title)
416+
if (!hasMandatoryValue(title, 'Film', 'title', film.pk, report)) {
417+
continue
418+
}
419+
366420
pushRow(rows.Film, dedupe.Film, {
367421
ID: film.ID,
368422
producer: normalizeString(film.fields.producer),
369-
title: normalizeString(film.fields.title),
423+
title,
370424
episode_id: Number.parseInt(film.fields.episode_id, 10) || 0,
371425
director: normalizeString(film.fields.director),
372426
release_date: normalizeDate(film.fields.release_date),
@@ -569,6 +623,8 @@ module.exports = {
569623
__internals: {
570624
normalizeString,
571625
normalizeDate,
626+
normalizeBirthYear,
627+
hasMandatoryValue,
572628
deterministicId,
573629
deterministicLinkId,
574630
parseArgs,

0 commit comments

Comments
 (0)