DEV Community

JC
JC

Posted on

2

Fun Ruby CLI project if you like Weather Stuff

Weather Today in a Ruby CLI

So I made my first gem Yay. It was challenging. It was hard. It took me a long time.

I decided to build an app that took data from three different APIs. Why? Well I wanted to make it a bit challenging.

This CLI was built to give a quick update of the weather either by your current location or any location you ask for. Also It provides headlines of BBC news as a plus.

Check it out

So how do I build it?

The first step was to identify the API's to use:
so I signed for these awesome ones:

  • OPENWEATHERMAP. To get the good weather data.
  • NEWSAPI. To get the news.
  • Abstract. To get a precise timeZone on the location enquiry. They've got a free plan too. So all cool.

So let's write the code:

I needed to get the data for the weather first so I built one Class for the IP location and one Class for a city search. I used HTTParty to get the data and JSON to parse it.

def self.api_location(unit)
response = HTTParty.get("https://api.openweathermap.org/data/2.5/weather?lat=#{lat}&lon=#{lon}&appid=#{ENV['API_KEY']}&units=#{unit}")
        data = JSON.parse(response.body, symbolize_names: true)
        @weather_today = self.new
        @weather_today.location = data[:name]
        @weather_today.time = Time.at(data[:dt])
        @weather_today.temp = data[:main][:temp].to_i
Enter fullscreen mode Exit fullscreen mode

same for the search per city.

def self.select_name(units, location)
response = HTTParty.get("http://api.openweathermap.org/data/2.5/weather?q=#{location}&appid=#{ENV['API_KEY']}&units=#{units}")
      data = JSON.parse(response.body, symbolize_names: true)
      @weather_today = self.new
      @weather_today.response_code = data[:cod]
      if @weather_today.response_code === "404"
        spinner = TTY::Spinner.new("[:spinner] cod")
        spinner.error("404")
        return
      else
      @weather_today.location = data[:name]
Enter fullscreen mode Exit fullscreen mode

Once I located all data I needed for current weather and also forecast I started bulding my CLI. I wanted to get the following results:

  • Check the current weather at current location and Forecast for the next 5 days
  • Check the current weather and Forecast for the next 5 days at any city you name in the world plus a link to the city location on Google Maps. It only will work with city names.

  • It gives you 3 unit system to choose from:

    • Default (temperatures in Kelvin)
    • Metric (temperatures in Celsius)
    • Imperial (temperatures in Fahrenheit)
  • Read and open in your browser the latest world headlines from BBC News.

  • Gives you a funny quote according to weather conditions courtesy of the AUTHENTIC WEATHER APP.

  • Also a Big GoodBye.

"Voila" you are ready to check the weather and news.

Well not so Easy. I wanted to make it more user friendly so on my CLI I added a few TTY components that are really handy.
Especially TTY-Prompt, TTY-Box & TTY-Tables. Want to check them all click Here. They are easy to implement and you can find plenty of documentation online. So give it a try if you like them.

class WeatherToday::CLI

    $prompt = TTY::Prompt.new(active_color: :cyan)

    def call
        welcome
    end

    def welcome
        puts Rain.go 
        puts Intro.go 
        sleep (3)
        puts"
                                             .-. .-.  ,---.   ,-.     ,-.      .---.   
                                             | | | |  | .-'   | |     | |     / .-. )  
                                             | `-' |  | `-.   | |     | |     | | |(_) 
                                             | .-. |  | .-'   | |     | |     | | | |  
                                             | | |)|  |  `--. | `--.  | `--.  \ `-' /  
                                             /(  (_)  /( __.' |( __.' |( __.'  )---'   
                                            (__)     (__)     (_)     (_)     (_)     
    ".colorize(:cyan)
         units_selection
         puts ''
         puts "World's News"
Enter fullscreen mode Exit fullscreen mode

All right. Once my CLI was running and the hard part of the project was done I decided to add some art ;). Well not exactly but something like a ASCII art. There are plenty of resources online so you won't get lost.

Screenshot 2021-04-06 at 08 47 56

Well I know it is a lot but It was fun. What I learn:

  • API can be tricky and hard to work with but once you are in the Matrix It becomes easier.
  • I need to improve my level of abstraction but for the first project I wasn't so bad I believe.
  • There is so much you can do but overtime. It's hard to learn all at once.
  • Finally it is cool to add something else you love ... like Art for example. It makes coding more enjoyable.

Thanks for reading ..

So long

API Trace View

Struggling with slow API calls?

Dan Mindru walks through how he used Sentry's new Trace View feature to shave off 22.3 seconds from an API call.

Get a practical walkthrough of how to identify bottlenecks, split tasks into multiple parallel tasks, identify slow AI model calls, and more.

Read more →

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay