Skip to content

Commit dc5b599

Browse files
authored
feat: add support for detect service based on extension fallback support for identifiers (#69)
1 parent e8cf286 commit dc5b599

File tree

4 files changed

+127
-47
lines changed

4 files changed

+127
-47
lines changed

docker_config_generator/config.yaml

Lines changed: 88 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ service_order:
1515
- preactjs
1616
- reactjs
1717
- vuejs
18-
- nodejs
1918
- golang
19+
- nodejs
2020

2121
lookup_files:
2222
- package.json
@@ -376,197 +376,241 @@ templates:
376376
description: Start command for streamlit app
377377
default: streamlit run main.py --server.port 8080
378378

379+
# In the identifiers section, selectors get first priority and then extensions
379380
identifiers:
380381
nextjs:
381-
- selector:
382+
- extensions:
383+
selectors:
382384
- file: package.json
383385
keywords:
384386
- next
385387
preactjs:
386-
- selector:
388+
- extensions:
389+
selectors:
387390
- file: package.json
388391
keywords:
389392
- preact
390393
reactjs:
391-
- selector:
394+
- extensions:
395+
selectors:
392396
- file: package.json
393397
keywords:
394398
- react
395399
vuejs:
396-
- selector:
400+
- extensions:
401+
selectors:
397402
- file: package.json
398403
keywords:
399404
- vue
400405
nodejs:
401-
- selector:
406+
- extensions:
407+
selectors:
402408
- file: package.json
403409
keywords:
404410
flask-pip:
405-
- selector:
411+
- extensions:
412+
selectors:
406413
- file: requirements.txt
407414
keywords:
408415
- Flask
409-
- selector:
416+
- extensions:
417+
selectors:
410418
- file: requirements.txt
411419
keywords:
412420
- flask
413421
flask-pipenv:
414-
- selector:
422+
- extensions:
423+
selectors:
415424
- file: Pipfile
416425
keywords:
417426
- Flask
418-
- selector:
427+
- extensions:
428+
selectors:
419429
- file: Pipfile
420430
keywords:
421431
- flask
422-
- selector:
432+
- extensions:
433+
selectors:
423434
- file: Pipfile.lock
424435
keywords:
425436
- Flask
426-
- selector:
437+
- extensions:
438+
selectors:
427439
- file: Pipfile.lock
428440
keywords:
429441
- flask
430442
flask-poetry:
431-
- selector:
443+
- extensions:
444+
selectors:
432445
- file: pyproject.toml
433446
keywords:
434447
- Flask
435-
- selector:
448+
- extensions:
449+
selectors:
436450
- file: pyproject.toml
437451
keywords:
438452
- flask
439-
- selector:
453+
- extensions:
454+
selectors:
440455
- file: poetry.lock
441456
keywords:
442457
- Flask
443-
- selector:
458+
- extensions:
459+
selectors:
444460
- file: poetry.lock
445461
keywords:
446462
- flask
447463
django-pip:
448-
- selector:
464+
- extensions:
465+
selectors:
449466
- file: requirements.txt
450467
keywords:
451468
- Django
452-
- selector:
469+
- extensions:
470+
selectors:
453471
- file: requirements.txt
454472
keywords:
455473
- django
456474
django-pipenv:
457-
- selector:
475+
- extensions:
476+
selectors:
458477
- file: Pipfile
459478
keywords:
460479
- Django
461-
- selector:
480+
- extensions:
481+
selectors:
462482
- file: Pipfile
463483
keywords:
464484
- django
465-
- selector:
485+
- extensions:
486+
selectors:
466487
- file: Pipfile.lock
467488
keywords:
468489
- Django
469-
- selector:
490+
- extensions:
491+
selectors:
470492
- file: Pipfile.lock
471493
keywords:
472494
- django
473495
django-poetry:
474-
- selector:
496+
- extensions:
497+
selectors:
475498
- file: pyproject.toml
476499
keywords:
477500
- Django
478-
- selector:
501+
- extensions:
502+
selectors:
479503
- file: pyproject.toml
480504
keywords:
481505
- django
482-
- selector:
506+
- extensions:
507+
selectors:
483508
- file: poetry.lock
484509
keywords:
485510
- Django
486-
- selector:
511+
- extensions:
512+
selectors:
487513
- file: poetry.lock
488514
keywords:
489515
- django
490516
fastapi-pip:
491-
- selector:
517+
- extensions:
518+
selectors:
492519
- file: requirements.txt
493520
keywords:
494521
- fastapi
495522
fastapi-pipenv:
496-
- selector:
523+
- extensions:
524+
selectors:
497525
- file: Pipfile
498526
keywords:
499527
- fastapi
500-
- selector:
528+
- extensions:
529+
selectors:
501530
- file: Pipfile.lock
502531
keywords:
503532
- fastapi
504533
fastapi-poetry:
505-
- selector:
534+
- extensions:
535+
selectors:
506536
- file: pyproject.toml
507537
keywords:
508538
- fastapi
509-
- selector:
539+
- extensions:
540+
selectors:
510541
- file: poetry.lock
511542
keywords:
512543
- fastapi
513544
streamlit-pip:
514-
- selector:
545+
- extensions:
546+
selectors:
515547
- file: requirements.txt
516548
keywords:
517549
- streamlit
518550
streamlit-pipenv:
519-
- selector:
551+
- extensions:
552+
selectors:
520553
- file: Pipfile
521554
keywords:
522555
- streamlit
523-
- selector:
556+
- extensions:
557+
selectors:
524558
- file: Pipfile.lock
525559
keywords:
526560
- streamlit
527561
streamlit-poetry:
528-
- selector:
562+
- extensions:
563+
selectors:
529564
- file: pyproject.toml
530565
keywords:
531566
- streamlit
532-
- selector:
567+
- extensions:
568+
selectors:
533569
- file: poetry.lock
534570
keywords:
535571
- streamlit
536572
sinatra:
537-
- selector:
573+
- extensions:
574+
selectors:
538575
- file: Gemfile
539576
keywords:
540577
- sinatra
541-
- selector:
578+
- extensions:
579+
selectors:
542580
- file: Gemfile.lock
543581
keywords:
544582
- sinatra
545583
rails:
546-
- selector:
584+
- extensions:
585+
selectors:
547586
- file: Gemfile
548587
keywords:
549588
- rails
550-
- selector:
589+
- extensions:
590+
selectors:
551591
- file: Gemfile.lock
552592
keywords:
553593
- rails
554594
springboot-gradle:
555-
- selector:
595+
- extensions:
596+
selectors:
556597
- file: build.gradle
557598
keywords:
558599
- org.springframework
559-
- selector:
600+
- extensions:
601+
selectors:
560602
- file: build.gradle.kts
561603
keywords:
562604
- org.springframework
563605
springboot-maven:
564-
- selector:
606+
- extensions:
607+
selectors:
565608
- file: pom.xml
566609
keywords:
567610
- org.springframework
568611
golang:
569-
- selector:
612+
- extensions:
613+
selectors:
570614
- file: go.mod
571615
keywords:
572616
- module

docker_config_generator/helper.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,29 @@ func existsInFolder(destFolder string, file string) bool {
131131
return false
132132
}
133133

134+
// Check if any file exists in folder with the provided extensions
135+
func hasFileWithExtension(destFolderPath string, extension string) bool {
136+
// Get all files and directories in rootPath
137+
entries, err := os.ReadDir(destFolderPath)
138+
if err != nil {
139+
return false
140+
}
141+
142+
// Check if any file has the provided extension
143+
for _, entry := range entries {
144+
if entry.IsDir() {
145+
// Recursively check subdirectories
146+
if hasFileWithExtension(filepath.Join(destFolderPath, entry.Name()), extension) {
147+
return true
148+
}
149+
} else if strings.HasSuffix(entry.Name(), extension) {
150+
return true
151+
}
152+
}
153+
154+
return false
155+
}
156+
134157
// Sanitize the fileName to remove potentially dangerous characters
135158
func SanitizeFileName(fileName string) string {
136159
// Remove any path components and keep only the file name

docker_config_generator/types.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ type Variable struct {
3030
}
3131

3232
type Identifier struct {
33-
Selector []IdentifierSelector `yaml:"selector"`
33+
Selectors []IdentifierSelector `yaml:"selectors"`
34+
Extensions []string `yaml:"extensions"`
3435
}
3536

3637
type IdentifierSelector struct {

docker_config_generator/utils.go

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,21 +75,33 @@ func (m Manager) generateConfigFromSourceCodeDirectory(directory string) (Docker
7575
}
7676
}
7777

78+
// detect service
7879
for _, serviceName := range m.Config.ServiceOrder {
7980
// Fetch service selectors
8081
identifiers := m.Config.Identifiers[serviceName]
8182
for _, identifier := range identifiers {
8283
// Fetch file content for each selector
8384
isIdentifierMatched := false
84-
for _, selector := range identifier.Selector {
85+
// check keywords for each selector
86+
for _, selector := range identifier.Selectors {
8587
isMatched := true
8688
// Check if file content contains keywords
8789
for _, keyword := range selector.Keywords {
8890
isMatched = isMatched && strings.Contains(lookupFiles[selector.File], keyword)
8991
}
9092
isIdentifierMatched = isIdentifierMatched || isMatched
9193
}
92-
if isIdentifierMatched {
94+
// if identifiers is not matched, continue to check extension files if specified
95+
isFileExtensionMatched := false
96+
if !isIdentifierMatched {
97+
for _, extension := range identifier.Extensions {
98+
if hasFileWithExtension(directory, extension) {
99+
isFileExtensionMatched = true
100+
break
101+
}
102+
}
103+
}
104+
if isIdentifierMatched || isFileExtensionMatched {
93105
// Fetch docker file
94106
dockerConfig := DockerFileConfig{}
95107
dockerConfig.DetectedService = serviceName

0 commit comments

Comments
 (0)