From 305ce569896dff161458e0c1a7470019ad94edbe Mon Sep 17 00:00:00 2001 From: Joshua Herring Date: Sun, 5 Apr 2026 12:21:38 -0400 Subject: [PATCH] add section data generator --- main.go | 78 +++++++++++++++++++++++++++++++ prompts/section_data_generator.md | 27 +++++++++++ 2 files changed, 105 insertions(+) create mode 100644 prompts/section_data_generator.md diff --git a/main.go b/main.go index ee82590..5c61a4a 100644 --- a/main.go +++ b/main.go @@ -11,6 +11,14 @@ import ( "github.com/brianvoe/gofakeit/v6" ) +var course_type = []string{ + "A", + "B", + "C", + "D", + "E", +} + type User struct { UID string `json:"uid"` FirstName string `json:"first_name"` @@ -19,8 +27,18 @@ type User struct { 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 { 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"` } @@ -73,6 +91,65 @@ func GenerateUserData (config Config) { 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() { data, err := os.ReadFile("config.json") if err != nil { @@ -93,6 +170,7 @@ func main() { } GenerateUserData(config) + GenerateSectionData(config) } diff --git a/prompts/section_data_generator.md b/prompts/section_data_generator.md new file mode 100644 index 0000000..e65e4af --- /dev/null +++ b/prompts/section_data_generator.md @@ -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 + +