add section data generator

master
Joshua Herring 1 month ago
parent b17c382c37
commit 305ce56989

@ -11,6 +11,14 @@ import (
"github.com/brianvoe/gofakeit/v6" "github.com/brianvoe/gofakeit/v6"
) )
var course_type = []string{
"A",
"B",
"C",
"D",
"E",
}
type User struct { type User struct {
UID string `json:"uid"` UID string `json:"uid"`
FirstName string `json:"first_name"` FirstName string `json:"first_name"`
@ -19,8 +27,18 @@ type User struct {
ExamID string `json:"exam_id"` ExamID string `json:"exam_id"`
} }
type Section struct {
SectionID string `json:"section_id"`
CourseNumber string `json:"course_number"`
Instructor string `json:"course_instructor"`
CourseTitle string `json:"course_title"`
CourseType string `json:"course_type"`
}
type Config struct { type Config struct {
NumberOfUsers int `json:"number_of_users"` NumberOfUsers int `json:"number_of_users"`
NumberOfSections int `json:"number_of_sections"`
NumberOfInstructors int `json:"number_of_instructors"`
PercentStatus map[string]int `json:"percent_status"` PercentStatus map[string]int `json:"percent_status"`
} }
@ -73,6 +91,65 @@ func GenerateUserData (config Config) {
fmt.Printf("Generated %d users to users.csv\n", config.NumberOfUsers) fmt.Printf("Generated %d users to users.csv\n", config.NumberOfUsers)
} }
func GenerateSectionData(config Config) {
// Generate unique instructor names: "LastName, X"
instructorNames := make([]string, 0, config.NumberOfInstructors)
seenInstructors := make(map[string]struct{}, config.NumberOfInstructors)
for len(instructorNames) < config.NumberOfInstructors {
name := fmt.Sprintf("%s, %c", gofakeit.LastName(), 'A'+rune(rand.Intn(26)))
if _, exists := seenInstructors[name]; !exists {
seenInstructors[name] = struct{}{}
instructorNames = append(instructorNames, name)
}
}
// Generate unique course numbers: one uppercase letter + 3 digits
seenCourseNumbers := make(map[string]struct{}, config.NumberOfSections)
courseNumbers := make([]string, 0, config.NumberOfSections)
for len(courseNumbers) < config.NumberOfSections {
cn := fmt.Sprintf("%c%03d", 'A'+rune(rand.Intn(26)), rand.Intn(1000))
if _, exists := seenCourseNumbers[cn]; !exists {
seenCourseNumbers[cn] = struct{}{}
courseNumbers = append(courseNumbers, cn)
}
}
sectionIDs := uniqueNumericStrings(5, config.NumberOfSections)
sections := make([]Section, config.NumberOfSections)
for i := range sections {
sections[i] = Section{
SectionID: sectionIDs[i],
CourseNumber: courseNumbers[i],
Instructor: instructorNames[rand.Intn(len(instructorNames))],
CourseTitle: gofakeit.BookTitle(),
CourseType: course_type[rand.Intn(len(course_type))],
}
}
f, err := os.Create("sections.csv")
if err != nil {
log.Fatalf("failed to create sections.csv: %v", err)
}
defer f.Close()
w := csv.NewWriter(f)
if err := w.Write([]string{"section_id", "course_number", "course_instructor", "course_title", "course_type"}); err != nil {
log.Fatalf("failed to write csv header: %v", err)
}
for _, s := range sections {
if err := w.Write([]string{s.SectionID, s.CourseNumber, s.Instructor, s.CourseTitle, s.CourseType}); err != nil {
log.Fatalf("failed to write csv row: %v", err)
}
}
w.Flush()
if err := w.Error(); err != nil {
log.Fatalf("csv flush error: %v", err)
}
fmt.Printf("Generated %d sections to sections.csv\n", config.NumberOfSections)
}
func main() { func main() {
data, err := os.ReadFile("config.json") data, err := os.ReadFile("config.json")
if err != nil { if err != nil {
@ -93,6 +170,7 @@ func main() {
} }
GenerateUserData(config) GenerateUserData(config)
GenerateSectionData(config)
} }

@ -0,0 +1,27 @@
Create a function GenerateSectionData in main.go that generates data for the following type:
```go
type Section struct {
SectionID string `json:"section_id"`
CourseNumber string `json:"course_number"`
Instructor string `json:"course_instructor"`
CourseTitle string `json:"course_title"`
CourseType string `json:"course_type"`
}
```
The function should take a config argument of type Config
It should generate a list of []string called instructor_names equal in length to the NumberOfInstructors member of config meeting the following requirements:
1. Each member should be a unique string which is a concatentaion of a brianvoe/gofaker LastName, a comma and a random uppercase letter
It should generate a list of []Section equal to the NumberOfSection member of config meeting the following requirements:
1. SectionID should be a unique random string of 5 digits
1. Course Number should be a unique string which is a random upper-case letter followed by 3 digits
1. Instructor should be a random selection form the instructor_names list
1. CourseTitle should be a brianvoe/gofaker BookTitle
1. CourseType should be a random member of the globally-defined course_type list
Loading…
Cancel
Save