Skip to content

Commit 62b9cec

Browse files
authored
Merge pull request #1990 from neo4j/calver-versioning
Adding support for the calendar versioning
2 parents 26f4817 + d52890e commit 62b9cec

File tree

13 files changed

+114
-32
lines changed

13 files changed

+114
-32
lines changed

src/browser/components/ManualLink.test.tsx

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,16 @@ const movedPages: [
109109
text: 'Indexes',
110110
url: 'https://neo4j.com/docs/cypher-manual/4.3/indexes-for-search-performance/'
111111
}
112+
],
113+
[
114+
{
115+
neo4jVersion: '2025.01.0',
116+
page: '/administration/indexes-for-search-performance/'
117+
},
118+
{
119+
text: 'Indexes',
120+
url: 'https://neo4j.com/docs/cypher-manual/current/indexes-for-search-performance/'
121+
}
112122
]
113123
]
114124

src/browser/components/ManualLink.tsx

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,10 @@ import semver from 'semver'
2424
import { DrawerExternalLink } from './drawer/drawer-styled'
2525
import { formatDocVersion } from 'browser/modules/Sidebar/docsUtils'
2626
import { GlobalState } from 'project-root/src/shared/globalState'
27-
import { getRawVersion } from 'shared/modules/dbMeta/dbMetaDuck'
27+
import {
28+
getCleanedVersion,
29+
getRawVersion
30+
} from 'shared/modules/dbMeta/dbMetaDuck'
2831

2932
const oldPages: { [key: string]: { oldPage: string; oldContent: string } } = {
3033
'/administration/indexes-for-search-performance/': {
@@ -60,21 +63,25 @@ const isPageOld = (
6063
chapter: string,
6164
page: string,
6265
neo4jVersion: string | null
63-
) =>
64-
chapter === 'cypher-manual' &&
65-
oldPages[page] &&
66-
neo4jVersion &&
67-
semver.satisfies(neo4jVersion, '<4.0.0-alpha.1')
66+
) => {
67+
if (chapter !== 'cypher-manual' || !oldPages[page] || !neo4jVersion)
68+
return false
69+
const cleanedVersion = getCleanedVersion(neo4jVersion)
70+
return cleanedVersion && semver.satisfies(cleanedVersion, '<4.0.0-alpha.1')
71+
}
6872

6973
const isPageNew = (
7074
chapter: string,
7175
page: string,
7276
neo4jVersion: string | null
73-
) =>
74-
chapter === 'cypher-manual' &&
75-
newPages[page] &&
76-
((neo4jVersion && semver.satisfies(neo4jVersion, '>=4.3')) ||
77-
neo4jVersion === null) // if no version is available, we treat it like the newest version.
77+
) => {
78+
if (chapter !== 'cypher-manual' || !newPages[page]) return false
79+
const cleanedVersion = getCleanedVersion(neo4jVersion)
80+
return (
81+
(cleanedVersion && semver.satisfies(cleanedVersion, '>=4.3')) ||
82+
neo4jVersion === null
83+
)
84+
}
7885

7986
export type ManualLinkProps = {
8087
chapter: string
@@ -103,7 +110,7 @@ export function ManualLink({
103110
let version = formatDocVersion(neo4jVersion)
104111
if (
105112
minVersion &&
106-
(!neo4jVersion || semver.cmp(neo4jVersion, '<', minVersion))
113+
(!neo4jVersion || semver.compareLoose(neo4jVersion, minVersion) === -1)
107114
) {
108115
version = formatDocVersion(minVersion)
109116
}

src/browser/components/VersionConditionalDoc.test.tsx

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,22 @@ const tests: [Omit<VersionConditionalDocProps, 'children'>, boolean][] = [
4646
includeCurrent: false
4747
},
4848
true
49+
],
50+
[
51+
{
52+
neo4jVersion: '2025.03.0',
53+
versionCondition: '>=4.3',
54+
includeCurrent: false
55+
},
56+
true
57+
],
58+
[
59+
{
60+
neo4jVersion: '2025.03.0',
61+
versionCondition: '<4.3',
62+
includeCurrent: true
63+
},
64+
false
4965
]
5066
]
5167

src/browser/components/VersionConditionalDoc.tsx

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,10 @@ import { connect } from 'react-redux'
2222
import semver from 'semver'
2323

2424
import { GlobalState } from 'project-root/src/shared/globalState'
25-
import { getRawVersion } from 'shared/modules/dbMeta/dbMetaDuck'
25+
import {
26+
getCleanedVersion,
27+
getRawVersion
28+
} from 'shared/modules/dbMeta/dbMetaDuck'
2629

2730
export type VersionConditionalDocProps = {
2831
versionCondition: string
@@ -36,11 +39,10 @@ export function VersionConditionalDoc({
3639
neo4jVersion,
3740
includeCurrent = false
3841
}: VersionConditionalDocProps): JSX.Element {
42+
const cleanedVersion = getCleanedVersion(neo4jVersion)
3943
if (
4044
(includeCurrent && neo4jVersion === null) ||
41-
(neo4jVersion !== null &&
42-
semver.valid(neo4jVersion) &&
43-
semver.satisfies(neo4jVersion, versionCondition))
45+
(cleanedVersion && semver.satisfies(cleanedVersion, versionCondition))
4446
) {
4547
return <>{children}</>
4648
} else {

src/browser/modules/Sidebar/docsUtils.test.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@ test('formatDocVersion', () => {
2626
{ test: '1.1.0', expect: '1.1' },
2727
{ test: '1.1.0-beta01', expect: '1.1-preview' },
2828
{ test: '1.1.2', expect: '1.1' },
29-
{ test: '2.1.10', expect: '2.1' }
29+
{ test: '2.1.10', expect: '2.1' },
30+
{ test: '2025.01.0', expect: 'current' },
31+
{ test: '2024.11.10', expect: 'current' }
3032
]
3133

3234
tests.forEach(t => expect(formatDocVersion(t.test)).toEqual(t.expect))

src/browser/modules/Sidebar/docsUtils.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@ export const formatDocVersion = (v: string | null = ''): string => {
2424
// All non-strings return
2525
return 'current'
2626
}
27-
if (semver.prerelease(v)) {
27+
if (semver.compareLoose(v, '6.0.0') === 1) {
28+
return 'current'
29+
} else if (semver.prerelease(v)) {
2830
return `${semver.major(v)}.${semver.minor(v)}-preview`
2931
}
3032
return `${semver.major(v)}.${semver.minor(v)}` || 'current'

src/browser/modules/Sidebar/static-scripts.test.tsx

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ describe('<Favorites />', () => {
3535
content: !script.content.includes('Show meta-graph')
3636
? script.content
3737
: script.versionRange === '>=3 <4'
38-
? script.content.replace('Show meta-graph', 'Show meta-graph v3')
39-
: script.content.replace('Show meta-graph', 'Show meta-graph v4')
38+
? script.content.replace('Show meta-graph', 'Show meta-graph v3')
39+
: script.content.replace('Show meta-graph', 'Show meta-graph v4')
4040
}))
4141

4242
const renderWithDBMSVersion = (version: any) => {
@@ -83,4 +83,14 @@ describe('<Favorites />', () => {
8383
expect(queryByText('Show meta-graph v3')).toBeFalsy()
8484
expect(queryByText('Show meta-graph v4')).toBeTruthy()
8585
})
86+
87+
it('lists examples correctly when using calendar version', () => {
88+
const version = '2025.01.0'
89+
const { queryByText } = renderWithDBMSVersion(version)
90+
91+
fireEvent.click(queryByText('Common Procedures') as HTMLElement)
92+
93+
expect(queryByText('Show meta-graph v3')).toBeFalsy()
94+
expect(queryByText('Show meta-graph v4')).toBeTruthy()
95+
})
8696
})

src/browser/modules/Sidebar/static-scripts.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,16 @@ import { getRawVersion } from 'shared/modules/dbMeta/dbMetaDuck'
2929
import * as editor from 'shared/modules/editor/editorDuck'
3030

3131
const mapFavoritesStateToProps = (state: any) => {
32-
const version = semver.coerce(getRawVersion(state) || '0') ?? '0'
32+
const version =
33+
semver.coerce(semver.clean(getRawVersion(state) || '', true) ?? '0') ?? '0'
3334
const folders = getFolders(state).filter(folder => folder.isStatic)
3435
const scripts = favorites
3536
.getFavorites(state)
3637
.filter(
3738
fav =>
3839
fav.isStatic &&
3940
fav.versionRange &&
41+
version &&
4042
semver.satisfies(version, fav.versionRange)
4143
)
4244

src/browser/modules/Stream/SchemaFrame.tsx

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,10 @@ import Directives from 'browser-components/Directives'
3636
import { GlobalState } from 'project-root/src/shared/globalState'
3737
import { NEO4J_BROWSER_USER_ACTION_QUERY } from 'services/bolt/txMetadata'
3838
import { CYPHER_REQUEST } from 'shared/modules/cypher/cypherDuck'
39-
import { getSemanticVersion } from 'shared/modules/dbMeta/dbMetaDuck'
39+
import {
40+
getCleanedVersion,
41+
getSemanticVersion
42+
} from 'shared/modules/dbMeta/dbMetaDuck'
4043

4144
type IndexesProps = {
4245
indexes: any
@@ -192,13 +195,14 @@ export class SchemaFrame extends Component<any, SchemaFrameState> {
192195
}
193196
}
194197

195-
fetchData(neo4jVersion: SemVer) {
198+
fetchData(neo4jVersion: SemVer | null) {
196199
if (this.props.bus) {
197200
// Indexes
198201
this.props.bus.self(
199202
CYPHER_REQUEST,
200203
{
201204
query:
205+
neo4jVersion &&
202206
semver.valid(neo4jVersion) &&
203207
semver.satisfies(neo4jVersion, '<4.2.*')
204208
? 'CALL db.indexes()'
@@ -212,6 +216,7 @@ export class SchemaFrame extends Component<any, SchemaFrameState> {
212216
CYPHER_REQUEST,
213217
{
214218
query:
219+
neo4jVersion &&
215220
semver.valid(neo4jVersion) &&
216221
semver.satisfies(neo4jVersion, '<4.2.*')
217222
? 'CALL db.constraints()'
@@ -244,8 +249,10 @@ export class SchemaFrame extends Component<any, SchemaFrameState> {
244249
render(): JSX.Element {
245250
const { neo4jVersion } = this.props
246251
const { indexes, constraints } = this.state
252+
const cleanedVersion =
253+
typeof neo4jVersion === 'string' ? getCleanedVersion(neo4jVersion) : null
247254
const schemaCommand =
248-
semver.valid(neo4jVersion) && semver.satisfies(neo4jVersion, '<=3.4.*')
255+
cleanedVersion && semver.satisfies(cleanedVersion, '<=3.4.*')
249256
? 'CALL db.schema()'
250257
: 'CALL db.schema.visualization'
251258

src/shared/modules/dbMeta/dbMetaDuck.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
*/
2020
import { uniq } from 'lodash-es'
2121
import { QueryResult } from 'neo4j-driver'
22-
import { SemVer, coerce, gte } from 'semver'
22+
import { SemVer, clean, coerce, gte, valid } from 'semver'
2323
import { isConfigValFalsy } from 'services/bolt/boltHelpers'
2424
import { GlobalState } from 'shared/globalState'
2525
import { APP_START } from 'shared/modules/app/appDuck'
@@ -270,8 +270,17 @@ export function getUniqueDatbases(state: GlobalState): Database[] {
270270

271271
export const getRawVersion = (state: GlobalState): string | null =>
272272
(state[NAME] || {}).server ? (state[NAME] || {}).server.version : null
273+
273274
export const getSemanticVersion = (state: GlobalState): SemVer | null =>
274-
coerce(getRawVersion(state))
275+
coerce(clean(getRawVersion(state) || '', true))
276+
277+
export const getCleanedVersion = (version: string | null): string | null => {
278+
const cleanedVersion = clean(version || '', true)
279+
if (valid(cleanedVersion)) {
280+
return cleanedVersion
281+
}
282+
return null
283+
}
275284

276285
export const supportsMultiDb = (state: GlobalState): boolean => {
277286
const version = getSemanticVersion(state)

0 commit comments

Comments
 (0)