Contributing to Open Source : Week 6
(This story is part of the weekly assignments for my internship at Nearsoft. I hope that some of the insights I learned this week can help others in their learning journey.)
Issues and pull requests
This week, I worked the following issue:
╔═══════════╦═══════════════════════════════════╦══════════════╗
║ project ║ issue ║ status ║
╠═══════════╬═══════════════════════════════════╬══════════════╣
║ smug ║ Add `create` and `edit` commands ║ PR Opened ║
╚═══════════╩═══════════════════════════════════╩══════════════╝
How I was trying to contribute
For the smug issue (Go), I added the ability to create and edit configuration files with the smug
command.
To create a file:
func (smug Smug) Create() error {
exists, err := IsFileExists(smug.configPath)
if err != nil {
return err
}
if exists {
return errors.New("File already exists")
}
file, err := os.Create(smug.configPath)
defer file.Close()
return err
}
To edit a file:
func (smug Smug) Edit() error {
editor := os.Getenv("EDITOR")
if editor == "" {
editor = "vim"
}
cmd := exec.Command(editor, smug.configPath)
cmd.Stdin = os.Stdin
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
err := cmd.Run()
return err
}
For example, smug create <project>
will create a file at ~/.config/smug/project.yml
and, smug edit <project>
will open that same file in the $EDITOR
(or in vim, if there’s no EDITOR environment variable set.)
Any positive or negative results
Functionality for both Create
and Edit
are completed and also tests for Create
. However, tests for Edit
are a work in progress only because the test would naturally try to open a vim editor, and then it blocks the rest of the processes.
Here are a few things I tried so far:
- Make the edit test concurrent so all three processes run at the same time. But the C/I still gets blocked with Vim open, even though all the tests pass.
- Use a goroutine with
time.Sleep()
, look for the vim process, and terminate it gracefully with:kill -s 15 -p
in order to avoid an exit error and continue with the tests.
Both of these didn’t work. Next, I will try to implement aMockCommander
that mocks the edit of a file in order to avoid opening an external program.
What did I learn this week?
I learned about goroutines which are “a lightweight thread of execution.” Also, I continued reading Grokking Algorithms by Aditya Y. Bhargava. I improved my knowledge of Data Sctructures and Algorithms. I learned about SOLID and OOP Principles.