The Making of a Gem
Tags: fruit, ruby, gem
Published: 2020-07-09 01:52:57

---
title: The Making of a Gem
published: true
description: Making a cli data gem using an api
tags: fruit, ruby, gem
//cover_image: https://direct_url_to_image.jpg
---
At Flatiron School our first milestone project is designing and developing a cli data gem. We are given the option to utilize an API or scrap what we need from the web. I have always loved produce, and plants are absolutely fascinating to me so I looked for a good website with plenty of information on fruits and veggies.
## To Scrap or not to Scrap
I found an awesome website with tons of information! [fruitsandveggies.org](https://fruitsandveggies.org/fruits-and-veggies/) seemed too good to be true... and it was. Their terms are very explicit in not allowing any sort of scraping without written permission. So I continued the search and found a simple yet elegant API - [fruityvice](https://www.fruityvice.com/#3). It didn't have any veggies or that many fruit, but the data was accurate.
## Using an API
Ruby has many wonderful gems (a fun Ruby specific term for libraries) to access and parse API data. There is actually a gem to do just about anything, and if there isn't an API you can always make one like I did! To get started I made a class to get info from the API and parse it. The gems that helped me with this were:
* __httparty__: to make a get request from the API
* __json__: to parse a JSON document and convert it into a ruby data structure
* __colorize__: to make the command line results pretty
* __pry__: debugging

I didn't use colorize or pry in the API class but I just wanted to list all the gems I used.
## Storing the Data
Next I needed to make a ruby class to capture an instance of a fruit along with all the information that the API provided. I made sure to include an __@@all__ class array that stored all the instances of fruit. Due to the sheer size of the hash provided by the API, I decided to try out mass assignment in my __initialize method__. A simple __each__ block that _sent_ the __value__ of the hash element to the __key writer method__ worked perfectly. The nutritional information of a fruit was nested in another hash so I would have to access that using a key.
## The Command Line
After all was said and done I needed to make the interactive part of the application. The user needed to be able to make choices. A while loop and a case statement did the trick. Adding a couple of methods to present the information nicely (and colorfully) and I was all done. The user had options. They could:
* print all the fruit names
* print all fruit names listed with their scientific name
* print all fruit names with their nutritional info
* print which fruits had the most nutrition (fat, protein, carbs, etc.)
* print which fruits had the least nutrition
* type the name of a fruit and see all of its information
* and of course quit

Fruit, fruit, and more fruit.
## Publishing a Gem
The hardest part was publishing my gem on [RubyGems](https://rubygems.org/). I didn't have much experience with the bundle gem but I tried creating a new gem using bundle, copying over my source code, and filling in the gemspec file. It was a hassle and I learned some very important lessons. Bundle gem will automatically make a module with the name of the gem containing your version number. I had a class with the same name as my gem and it really confused the Ruby interpreter. Also the gemspec file is generated with some nice code in it for grabbing all the necessary files but mine was also grabbing the generated gem file and requiring itself to build itself which was very confusing. So after hours of searching for the solutions, I changed the module name and hard-coded in my source code files in the gemspec file. Boom. Now I could finally publish my gem!
## Lesson Learned
I learned a lot from working on this project. Patience and breaks are absolutely essential when debugging problems. Stack Overflow has the solution even though it might not look like your problem or the solution. Get the application working and then refactor to clean it all up - it's an excellent way to spot issues and brush up on what your code is doing. And the most important lesson I learned was that making something new and exciting from start to finish is an awesome experience. As we learn a new skill like coding I think it is easy to simply write some code to get a test to pass, but we don't learn as much that way. It __is__ essential to learn that way at first, but once you have enough knowledge you must build something by applying that knowledge. You gain wisdom in taking on a huge project and using every ounce of effort you have. So code on and change the world one __puts__ at a time.
### If you want to check out my gem
[fruit-cli-gem on github](https://github.com/SamG-H/fruit-cli-gem)
```
gem install fruit-info
```