GithubHelp home page GithubHelp logo

markciliavincenti / openweathermap.cache Goto Github PK

View Code? Open in Web Editor NEW
6.0 3.0 2.0 159 KB

An asynchronous .NET Standard 2.0 library that allows you to fetch & cache current weather readings from the OpenWeather API, with built-in resiliency that can extend the cache lifetime in case the API is unreachable.

Home Page: https://www.nuget.org/packages/OpenWeatherMap.Cache

License: MIT License

C# 100.00%
openweathermap weather openweather api netstandard cache

openweathermap.cache's Introduction

OpenWeatherMap.Cache OpenWeatherMap.Cache

GitHub Workflow Status NuGet NuGet Codacy Grade Codecov

An asynchronous .NET Standard 2.0 library that allows you to fetch & cache current weather readings from the OpenWeather API, with built-in resiliency that can extend the cache lifetime in case the API is unreachable.

Supports .NET Framework 4.6.1 or later, .NET Core 2.0 or later, and .NET 5.0 or later.

Installation

The recommended means is to use NuGet, but you could also download the source code from here.

Choose the fetch mode

If the time elapsed since the last fetch for the given location exceeds the cache period (i.e. a new API call is required) but is within the resiliency period (i.e. the previous readings are still available in the cache), the API reported measured time in the cache value is sometimes more recent than the latest value fetched from the API. There are three modes to tackle this issue:

With FetchMode.AlwaysUseLastMeasured, the value still available in the cache is returned. The implication is that if you immediately request another reading it will also hit the API again. IMPORTANT: Frequent calls may impact your API usage.

With FetchMode.AlwaysUseLastMeasuredButExtendCache (default, recommended), the value still available in the cache is returned but in order to protect impact on your API usage, this setting updates the cache value's fetched date and extends the cache lifetime.

With FetchMode.AlwaysUseLastFetchedValue, the last fetched API result is returned anyway, even though it is being reported to be older by the API.

Initialization with Dependency Injection

In your Startup.cs (ConfigureServices):

services.AddOpenWeatherMapCache("[API KEY]", 9_500, FetchMode.AlwaysUseLastMeasuredButExtendCache, 300_000);

Then you can inject IOpenWeatherMapCache.

Initialization without Dependency Injection

Create your own instance:

var openWeatherMapCache = new OpenWeatherMapCache("[API KEY]", 9_500, FetchMode.AlwaysUseLastMeasuredButExtendCache, 300_000);

Usage in asynchronous methods (recommended)

var locationQuery = new OpenWeatherMap.Cache.Models.Location(47.6371, -122.1237);
var readings = await openWeatherMapCache.GetReadingsAsync(locationQuery);
if (readings.IsSuccessful)
{
    ...
}
else
{
    var apiErrorCode = readings.Exception?.ApiErrorCode;
    var apiErrorMessage = readings.Exception?.ApiErrorMessage;
}

or by zip code (post code) and country code:

var locationQuery = new OpenWeatherMap.Cache.Models.ZipCode("94040", "us");
var readings = await openWeatherMapCache.GetReadingsAsync(locationQuery);
if (readings.IsSuccessful)
{
    ...
}
else
{
    var apiErrorCode = readings.Exception?.ApiErrorCode;
    var apiErrorMessage = readings.Exception?.ApiErrorMessage;
}

Usage in synchronous methods

var locationQuery = new OpenWeatherMap.Cache.Models.Location(47.6371, -122.1237);
var readings = openWeatherMapCache.GetReadings(locationQuery);
if (readings.IsSuccessful)
{
    ...
}
else
{
    var apiErrorCode = readings.Exception?.ApiErrorCode;
    var apiErrorMessage = readings.Exception?.ApiErrorMessage;
}

or by zip code (post code) and country code:

var locationQuery = new OpenWeatherMap.Cache.Models.ZipCode("94040", "us");
var readings = openWeatherMapCache.GetReadings(locationQuery);
if (readings.IsSuccessful)
{
    ...
}
else
{
    var apiErrorCode = readings.Exception?.ApiErrorCode;
    var apiErrorMessage = readings.Exception?.ApiErrorMessage;
}

openweathermap.cache's People

Contributors

dependabot[bot] avatar markciliavincenti avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

Forkers

mat0rres c33k4y

openweathermap.cache's Issues

Suggest using decimal over double or float

You're currently using UnitsNet for temp and humidity, which uses double for the values. For precision and to make sure the value is exactly the same from source to client, I would recommend using decimal. It will guarantee that any value from the OpenWeather service is exactly the same in whatever client is using your library.

Invalid parameter order

The example in the readme does not align with the method's actual parameter order.

services.AddOpenWeatherMapCache("[API KEY]", FetchMode.AlwaysUseLastMeasuredButExtendCache, 9_500, 300_000);

vs what I believe should be

services.AddOpenWeatherMapCache("[API KEY]", 9_500, FetchMode.AlwaysUseLastMeasuredButExtendCache, 300_000);

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.