Skip to content

Commit 12d994b

Browse files
authored
Merge pull request #210 from rulasg/improve-performance-fields
feat: Many featurs including memory cache for fields and projects
2 parents c0f1963 + 15a240e commit 12d994b

26 files changed

Lines changed: 674 additions & 180 deletions

Test/private/MockCall_Project700.ps1

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ function Get-Mock_Project_700 {
4848
$project.title = $pActual.title
4949
$project.number = $pActual.number
5050
$project.url = $pActual.url
51-
$project.cacheFileName = "$($pActual.owner.login)_$($pActual.number).json"
51+
$project.cacheFileName = "db-$($pActual.owner.login)-$($pActual.number)-project.json"
5252

5353
# Fields info
5454
$project.fields = @{}

Test/private/mockdatabase.ps1

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,13 @@ function Get-Mock_DatabaseRootPath{
2424
}
2525

2626
function Update-Mock_DatabaseFileWithReplace([string]$FileName, [string]$SearchString, [string]$ReplaceString){
27+
2728
$dbpath = Get-Mock_DatabaseRootPath | Join-Path -ChildPath $FileName
2829
$content = Get-Content $dbpath
2930
$content = $content -replace $SearchString, $ReplaceString
3031
$content | Set-Content $dbpath
32+
33+
# Reset the memory cache deleting the cachelock file
34+
$cachelock = $dbpath -replace '\.json$', '-lock.json'
35+
Remove-Item -Path $cachelock -Force -ErrorAction SilentlyContinue
3136
}
Lines changed: 185 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,185 @@
1+
{
2+
"data": {
3+
"node": {
4+
"id": "PVTI_lADOAlIw4c4BCe3Vzgeio4o",
5+
"type": "ISSUE",
6+
"fullDatabaseId": "128099210",
7+
"project": {
8+
"id": "PVT_kwDOAlIw4c4BCe3V",
9+
"url": "https://github.com/orgs/octodemo/projects/700"
10+
},
11+
"content": {
12+
"__typename": "Issue",
13+
"id": "I_kwDOPrRnkc7KkwSq",
14+
"body": "Body of issue for development",
15+
"title": "[RULaSG-DeV-1] Issue [RULASG-DEV-1] for [value between] development",
16+
"updatedAt": "2025-10-15T21:30:02Z",
17+
"createdAt": "2025-09-09T14:01:17Z",
18+
"number": 26,
19+
"url": "https://github.com/octodemo/rulasg-dev-1/issues/26",
20+
"state": "OPEN",
21+
"repository": {
22+
"name": "rulasg-dev-1",
23+
"owner": {
24+
"login": "octodemo"
25+
}
26+
},
27+
"comments": {
28+
"totalCount": 3,
29+
"nodes": [
30+
{
31+
"createdAt": "2025-09-23T17:51:06Z",
32+
"updatedAt": "2025-10-15T21:29:45Z",
33+
"url": "https://github.com/octodemo/rulasg-dev-1/issues/26#issuecomment-3324995787",
34+
"body": "Sample comment 1",
35+
"fullDatabaseId": "3324995787",
36+
"author": {
37+
"login": "rulasg"
38+
}
39+
},
40+
{
41+
"createdAt": "2025-09-24T08:29:13Z",
42+
"updatedAt": "2025-10-15T21:29:55Z",
43+
"url": "https://github.com/octodemo/rulasg-dev-1/issues/26#issuecomment-3327194303",
44+
"body": "Sample comment 2",
45+
"fullDatabaseId": "3327194303",
46+
"author": {
47+
"login": "rulasg"
48+
}
49+
},
50+
{
51+
"createdAt": "2025-09-30T05:42:49Z",
52+
"updatedAt": "2025-10-15T21:30:02Z",
53+
"url": "https://github.com/octodemo/rulasg-dev-1/issues/26#issuecomment-3350059109",
54+
"body": "Sample comment 3",
55+
"fullDatabaseId": "3350059109",
56+
"author": {
57+
"login": "rulasg"
58+
}
59+
}
60+
]
61+
}
62+
},
63+
"fieldValues": {
64+
"nodes": [
65+
{
66+
"__typename": "ProjectV2ItemFieldRepositoryValue",
67+
"repository": {
68+
"url": "https://github.com/octodemo/rulasg-dev-1"
69+
},
70+
"field": {
71+
"__typename": "ProjectV2Field",
72+
"id": "PVTF_lADOAlIw4c4BCe3Vzg0rg-k",
73+
"name": "Repository",
74+
"dataType": "REPOSITORY"
75+
}
76+
},
77+
{
78+
"__typename": "ProjectV2ItemFieldMilestoneValue",
79+
"milestone": {
80+
"title": "Milestone 3: Quality and Deployment",
81+
"description": "Testing, documentation, and deployment pipeline setup",
82+
"dueOn": "2025-10-18T00:00:00Z"
83+
},
84+
"field": {
85+
"__typename": "ProjectV2Field",
86+
"id": "PVTF_lADOAlIw4c4BCe3Vzg0rg-g",
87+
"name": "Milestone",
88+
"dataType": "MILESTONE"
89+
}
90+
},
91+
{
92+
"__typename": "ProjectV2ItemFieldTextValue",
93+
"text": "[RULaSG-DeV-1] Issue [RULASG-DEV-1] for [value between] development",
94+
"field": {
95+
"__typename": "ProjectV2Field",
96+
"id": "PVTF_lADOAlIw4c4BCe3Vzg0rg-M",
97+
"name": "Title",
98+
"dataType": "TITLE"
99+
}
100+
},
101+
{
102+
"__typename": "ProjectV2ItemFieldSingleSelectValue",
103+
"name": "In Progress",
104+
"field": {
105+
"__typename": "ProjectV2SingleSelectField",
106+
"id": "PVTSSF_lADOAlIw4c4BCe3Vzg0rg-U",
107+
"name": "Status",
108+
"dataType": "SINGLE_SELECT",
109+
"options": [
110+
{
111+
"id": "f75ad846",
112+
"name": "Todo"
113+
},
114+
{
115+
"id": "47fc9ee4",
116+
"name": "In Progress"
117+
},
118+
{
119+
"id": "98236657",
120+
"name": "Done"
121+
}
122+
]
123+
}
124+
},
125+
{
126+
"__typename": "ProjectV2ItemFieldNumberValue",
127+
"number": 333.0,
128+
"field": {
129+
"__typename": "ProjectV2Field",
130+
"id": "PVTF_lADOAlIw4c4BCe3Vzg0rhjU",
131+
"name": "field-number",
132+
"dataType": "NUMBER"
133+
}
134+
},
135+
{
136+
"__typename": "ProjectV2ItemFieldIterationValue",
137+
"title": "field-iteration 3",
138+
"startDate": "2025-10-05",
139+
"duration": 14,
140+
"field": {
141+
"__typename": "ProjectV2IterationField",
142+
"id": "PVTIF_lADOAlIw4c4BCe3Vzg0rhqQ",
143+
"name": "field-iteration",
144+
"dataType": "ITERATION"
145+
}
146+
},
147+
{
148+
"__typename": "ProjectV2ItemFieldTextValue",
149+
"text": "text3",
150+
"field": {
151+
"__typename": "ProjectV2Field",
152+
"id": "PVTF_lADOAlIw4c4BCe3Vzg0rhko",
153+
"name": "field-text",
154+
"dataType": "TEXT"
155+
}
156+
},
157+
{
158+
"__typename": "ProjectV2ItemFieldSingleSelectValue",
159+
"name": "option-3",
160+
"field": {
161+
"__typename": "ProjectV2SingleSelectField",
162+
"id": "PVTSSF_lADOAlIw4c4BCe3Vzg0rhno",
163+
"name": "field-singleselect",
164+
"dataType": "SINGLE_SELECT",
165+
"options": [
166+
{
167+
"id": "7d96a925",
168+
"name": "option-1"
169+
},
170+
{
171+
"id": "cd02c585",
172+
"name": "option-2"
173+
},
174+
{
175+
"id": "6b66c93a",
176+
"name": "option-3"
177+
}
178+
]
179+
}
180+
}
181+
]
182+
}
183+
}
184+
}
185+
}

Test/public/environment/projectParameters.test.ps1

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ function Test_SetProjectParameters_SUCCESS{
88
Set-ProjectParameters -Owner $owner -ProjectNumber $projectNumber
99

1010
$v = @{
11-
Owner = @{value =$owner ; file = $($dbPath | Join-Path -Child "EnvironmentCache_Owner.json")}
12-
ProjectNumber = @{value =$projectNumber ; file = $($dbPath | Join-Path -Child "EnvironmentCache_ProjectNumber.json")}
13-
ProjectTitle = @{value =$projectTitle ; file = $($dbPath | Join-Path -Child "EnvironmentCache_ProjectTitle.json")}
11+
Owner = @{value =$owner ; file = $($dbPath | Join-Path -Child "env-owner.json")}
12+
ProjectNumber = @{value =$projectNumber ; file = $($dbPath | Join-Path -Child "env-ProjectNumber.json")}
13+
ProjectTitle = @{value =$projectTitle ; file = $($dbPath | Join-Path -Child "env-ProjectTitle.json")}
1414
}
1515

1616
$v.keys | ForEach-Object {

Test/public/items/edit_project_item.test.ps1

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,57 @@ function Test_EditProjectItems_NormalizeTitle{
263263
Assert-AreEqual -Expected $newTitle -Presented $result.$itemId.title.Value
264264
}
265265

266+
function Test_EditProjectItems_NormalizeTitle_AlreadyNormalized{
267+
268+
# Arrange
269+
$p = Get-Mock_Project_700 ; $Owner = $p.owner ; $ProjectNumber = $p.number
270+
MockCall_GetProject $p -skipItems
271+
$i= $p.issue ; $itemId = $i.id
272+
273+
MockCall_GetProject $p -SkipItems
274+
275+
$newTitle = "[rulasg-dev-1] Issue [rulasg-dev-1] for [value between] development"
276+
277+
# Mock the direct call for item
278+
MockCallJson -Command "Invoke-GetItem -itemid $itemId" -FileName "invoke-getitem-$itemId-Normalized.json"
279+
# Act
280+
Edit-ProjectItem -Owner $owner -ProjectNumber $projectNumber -ItemId $itemId -NormalizeTitle
281+
282+
# Assert
283+
$result = Get-ProjectItemStaged -Owner $owner -ProjectNumber $projectNumber
284+
285+
Assert-Count -Expected 1 -Presented $result.$itemId.Keys
286+
Assert-AreEqual -Expected $newTitle -Presented $result.$itemId.title.Value
287+
}
288+
289+
function Test_NormalizedTitle{
290+
291+
Invoke-PrivateContext{
292+
$cases = @(
293+
@{item = @{Title= "Test"; repositoryName = "rulasg-dev-1"}; expected = "[rulasg-dev-1] Test"}
294+
@{item = @{Title= "[rulasg-dev-1] Test"; repositoryName = "rulasg-dev-1"}; expected = "[rulasg-dev-1] Test"}
295+
296+
@{item = @{Title= "[BBVA] Test"; repositoryName = "bBva"}; expected = "[bBva] Test"}
297+
298+
@{item = @{Title= "Test [rulasg-dev-1]"; repositoryName = "rulasg-dev-1"}; expected = "Test [rulasg-dev-1]"}
299+
300+
@{item = @{Title= "Test [rulasg-dEv-1]"; repositoryName = "rulasg-dev-1"}; expected = "Test [rulasg-dev-1]"}
301+
302+
@{item = @{Title= "[RULaSG-DeV-1] Test"; repositoryName = "rulasg-dev-1"}; expected = "[rulasg-dev-1] Test"}
303+
@{item = @{Title= "[RULaSG-DeV-1] Test [value between] development"; repositoryName = "rulasg-dev-1"}; `
304+
expected = "[rulasg-dev-1] Test [value between] development"}
305+
@{item = @{Title= "[RULaSG-DeV-1] Issue [RULASG-DEV-1] for [value between] development"; repositoryName = "rulasg-dev-1"}; `
306+
expected = "[rulasg-dev-1] Issue [rulasg-dev-1] for [value between] development"}
307+
)
308+
309+
foreach($case in $cases){
310+
$result = Get-NormalizedTitle -Item $case.item
311+
Assert-AreEqual -Expected $case.expected -Presented $result
312+
}
313+
314+
}
315+
}
316+
266317
function Test_EditProjectItems_OpenInBrowser{
267318

268319
# Arrange

Test/public/project/updateprojectrecent.test.ps1

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@ function Test_UpdateProject_SetsRecentUpdateToday_WhenQueryIsNull{
1212
# Assert
1313
Assert-IsTrue $result
1414

15-
# Verify Set-EnvItem_Last_RecentUpdate_Today was called - check the env item is set to today
16-
$envValue = Invoke-PrivateContext { Get-EnvItem_Last_RecentUpdate -Owner "octodemo" -ProjectNumber 700 }
15+
# Verify Set-EnvProjectLastUpdate_Today was called - check the env item is set to today
16+
$envValue = Invoke-PrivateContext { Get-EnvProjectLastUpdate -Owner "octodemo" -ProjectNumber 700 }
1717

18-
Assert-AreEqual -Expected $today -Presented $envValue -Comment "Set-EnvItem_Last_RecentUpdate_Today should set env item to today when Query is null"
18+
Assert-AreEqual -Expected $today -Presented $envValue -Comment "Set-EnvProjectLastUpdate_Today should set env item to today when Query is null"
1919
}
2020

2121
function Test_UpdateProjectRecent_FirstCAll_SetRecentUpdate_toToday{
@@ -34,8 +34,8 @@ function Test_UpdateProjectRecent_FirstCAll_SetRecentUpdate_toToday{
3434
# Assert
3535
Assert-IsTrue $result
3636

37-
# Verify Set-EnvItem_Last_RecentUpdate_Today was NOT called - env item should be null/empty
38-
$envValue = Invoke-PrivateContext { Get-EnvItem_Last_RecentUpdate -Owner "octodemo" -ProjectNumber 700 }
37+
# Verify Set-EnvProjectLastUpdate_Today was NOT called - env item should be null/empty
38+
$envValue = Invoke-PrivateContext { Get-EnvProjectLastUpdate -Owner "octodemo" -ProjectNumber 700 }
3939
Assert-AreEqual -Expected $today -Presented $envValue
4040

4141
}
@@ -50,8 +50,8 @@ function Test_UpdateProjectRecent_UpdateBasedOn_FirstTime{
5050

5151
$result = Update-ProjectRecent -Owner $owner -ProjectNumber $projectNumber
5252

53-
## Assert check that the EnvironmentCache_Last_RecentUpdate_octodemo_700.json is set to today
54-
$envValue = Invoke-PrivateContext { Get-EnvItem_Last_RecentUpdate -Owner "octodemo" -ProjectNumber 700 }
53+
## Assert check that the env-Last_RecentUpdate_octodemo_700.json is set to today
54+
$envValue = Invoke-PrivateContext { Get-EnvProjectLastUpdate -Owner "octodemo" -ProjectNumber 700 }
5555
Assert-AreEqual -Expected $today -Presented $envValue
5656

5757
}
@@ -64,8 +64,8 @@ function Test_UpdateProjectRecent_UpdateBasedOn_SetToToday{
6464
# Act - use the mock to run the project full sync to set the last recent update to today
6565
MockCall_GetProject_700 -Cache
6666

67-
## Assert check that the EnvironmentCache_Last_RecentUpdate_octodemo_700.json is set to today
68-
$envValue = Invoke-PrivateContext { Get-EnvItem_Last_RecentUpdate -Owner "octodemo" -ProjectNumber 700 }
67+
## Assert check that the env-Last_RecentUpdate_octodemo_700.json is set to today
68+
$envValue = Invoke-PrivateContext { Get-EnvProjectLastUpdate -Owner "octodemo" -ProjectNumber 700 }
6969
Assert-AreEqual -Expected $today -Presented $envValue
7070

7171
# Reset Mocks to ensure no mocks functions left from caching project
@@ -91,8 +91,8 @@ function Test_UpdateProjectRecent_UpdateBasedOn_SetToTehPast{
9191
# Act - use the mock to run the project full sync to set the last recent update to today
9292
MockCall_GetProject_700 -Cache
9393

94-
## Assert check that the EnvironmentCache_Last_RecentUpdate_octodemo_700.json is set to today
95-
Invoke-PrivateContext { Set-EnvItem_Last_RecentUpdate -Owner "octodemo" -ProjectNumber 700 -Value "2024-02-18" }
94+
## Assert check that the env-Last_RecentUpdate_octodemo_700.json is set to today
95+
Invoke-PrivateContext { Set-EnvProjectLastUpdate -Owner "octodemo" -ProjectNumber 700 -Value "2024-02-18" }
9696

9797

9898
# Reset Mocks to ensure no mocks functions left from caching project
@@ -110,6 +110,6 @@ function Test_UpdateProjectRecent_UpdateBasedOn_SetToTehPast{
110110
Assert-IsTrue $result
111111

112112
# ASsert that value has changed to today
113-
$envValue = Invoke-PrivateContext { Get-EnvItem_Last_RecentUpdate -Owner "octodemo" -ProjectNumber 700 }
113+
$envValue = Invoke-PrivateContext { Get-EnvProjectLastUpdate -Owner "octodemo" -ProjectNumber 700 }
114114
Assert-AreEqual -Expected $today -Presented $envValue
115115
}

Test/public/projectDatabase/project_database.test.ps1

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,25 +27,29 @@ function Test_SaveProjectDatabase_SafeId_Flag_PrivateCall{
2727
function Test_SaveProjectDatabase_Safe_PrivateCall{
2828

2929
$p = Get-Mock_Project_700 ; $owner = $p.owner ; $projectNumber = $p.number
30-
MockCall_GetProject_700
30+
MockCall_GetProject_700 -Cache
3131

3232
Invoke-PrivateContext {
3333

3434
$Owner = "octodemo" ; $ProjectNumber = 700
3535
# Cache the project
36-
$prj1 = Get-Project -Owner $Owner -ProjectNumber $ProjectNumber
36+
# $prj1 = Get-Project -Owner $Owner -ProjectNumber $ProjectNumber
3737

3838
# modify the project
39-
$db = Get-Project -Owner $Owner -ProjectNumber $ProjectNumber ; Save-ProjectDatabaseSafe -Database $db
40-
39+
# $db = Get-Project -Owner $Owner -ProjectNumber $ProjectNumber
40+
$db1 = Get-ProjectFromDatabase -Owner $Owner -ProjectNumber $ProjectNumber
41+
$dbClone = $db1 | ConvertTo-Json | ConvertFrom-Json
42+
Save-ProjectDatabaseSafe -Database $db1
43+
4144
# Check that safeId has changed
42-
$prj2 = Get-Project -Owner $Owner -ProjectNumber $ProjectNumber
43-
Assert-AreNotEqual -Presented $prj2.safeId -Expected $prj1.safeId
45+
$db2 = Get-ProjectFromDatabase -Owner $Owner -ProjectNumber $ProjectNumber
46+
# $prj2 = Get-Project -Owner $Owner -ProjectNumber $ProjectNumber
47+
Assert-AreNotEqual -Presented $dbClone.safeId -Expected $db2.safeId
4448

4549
## When saving again as prj1 that has been saved before it will throw
4650
$hasThrow = $false
4751
try{
48-
Save-ProjectDatabaseSafe -Database $prj1
52+
Save-ProjectDatabaseSafe -Database $dbClone
4953
} catch {
5054
$hasThrow = $true
5155
}

Test/public/repository/get-repository.test.ps1

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ function Test_GetRepository{
1616

1717
# Assert repo cache created
1818
$dbpath = get-Mock_DatabaseRootPath
19-
$dbname = "$($r.owner)-$($r.name).json"
19+
$dbname = "repo-$($r.owner)-$($r.name).json"
2020

2121
Assert-ItemExist -Path (Join-Path -Path $dbpath -ChildPath $dbname)
2222

0 commit comments

Comments
 (0)