{"id":21946829,"url":"https://github.com/efguydan/vestiaireweather","last_synced_at":"2026-05-04T19:37:25.339Z","repository":{"id":95607343,"uuid":"421951571","full_name":"efguydan/VestiaireWeather","owner":"efguydan","description":null,"archived":false,"fork":false,"pushed_at":"2021-10-28T18:09:06.000Z","size":6677,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-22T16:50:38.781Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/efguydan.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-10-27T19:41:00.000Z","updated_at":"2021-10-28T18:09:09.000Z","dependencies_parsed_at":"2023-04-07T20:31:41.704Z","dependency_job_id":null,"html_url":"https://github.com/efguydan/VestiaireWeather","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/efguydan/VestiaireWeather","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/efguydan%2FVestiaireWeather","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/efguydan%2FVestiaireWeather/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/efguydan%2FVestiaireWeather/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/efguydan%2FVestiaireWeather/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/efguydan","download_url":"https://codeload.github.com/efguydan/VestiaireWeather/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/efguydan%2FVestiaireWeather/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32622516,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-04T10:08:07.713Z","status":"ssl_error","status_checked_at":"2026-05-04T10:08:02.005Z","response_time":58,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-29T04:35:28.377Z","updated_at":"2026-05-04T19:37:25.323Z","avatar_url":"https://github.com/efguydan.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"# My Vestiaire Weather\n[![Android CI](https://github.com/efguydan/VestiaireWeather/actions/workflows/android.yml/badge.svg)](https://github.com/efguydan/VestiaireWeather/actions/workflows/android.yml)\n[![Download Sample](https://img.shields.io/badge/Download-v1.0.0-blue.svg)](https://github.com/efguydan/VestiaireWeather/raw/master/showcase/VestiaireWeather-1.0.0.apk)\n\nMy Vestiaire Weather is an app to view a list of Weather Forecast for 16 days\n\n## App Screenshots\n![Showcase](https://raw.githubusercontent.com/efguydan/VestiaireWeather/master/showcase/showcase.png)\n\n## Setting Up\n\nAdd the Open Weather Map API Key into `local.properties` file\n\n```groovy\nAPI_KEY=\"ENTER_API_KEY_HERE\"\n```\n\n\n## Dependencies\n- [Coroutines](https://github.com/Kotlin/kotlinx.coroutines) for managing asynchronous operations\n- JetPack\n    - LiveData - notify domain layer data to views.\n    - ViewModel - UI related data holder, lifecycle aware.\n    - Room Persistence - database for the weather entities. for offline usage\n    - Navigation - To manage destinations (fragments) \u0026 actions (navigations) \n- Architecture\n    - MVVM Architecture (View - DataBinding - ViewModel - Model)\n    - Dagger 2 - Dependency Injection to manage and scope dependencies across the project.\n- [Retrofit2 \u0026 Gson](https://github.com/square/retrofit) - constructing the REST API to make API calls\n- [OkHttp3](https://github.com/square/okhttp) - implementing interceptor and logging for the API calls\n- [Mockito](https://github.com/mockito/mockito-kotlin) - For mocking dependencies behaviours during Unit Tests\n- [Spotless](https://github.com/mockito/mockito-kotlin) - To format and fix code errors\n\n## System Architecture\n\nThe Architecture used in the project is MVVM. Some reasons it was used include:\n- MVVM does a very good job in separating concern. Data and User Interface know nothing about one another. The ViewModel handles all the logic and also\n  knows nothing about the view. This eases the process of testing components as they are not couple tightly with one another.\n- The ViewModel (used in implementing the MVVM architecture) is lifecycle-aware. This implies that it disposes of resources as soon as the fragment hosting\n  it is destroyed, preventing Memory Leaks. It also survives configuration changes. Therefore user can have access to their current state when they undergo\n  a configuration change.\n  \nThe application consists a single activity hosting multiple fragments with a NavHostFragment. The Navigation Component is used to define destinations and actions.\n\nDependencies in the project are managed and scoped with Dependency Injection using Dagger2.\n\nFor persistence, Room Database was used.\n\nView Binding is used to provide null safe references to view elements. Data Binding is also used in the project to bind UI elements to data sources in the \nview model in a lifecycle aware way.\n\n## Code Formatting\n\nCode Formatting is done with the gradle spotless plugin, using [ktlint](https://github.com/pinterest/ktlint) as the linter. Other settings for the plugin can be configured in [spotless.gradle](spotless.gradle).\nTo format code, run\n\n```gradle\n./gradlew spotlessApply\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fefguydan%2Fvestiaireweather","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fefguydan%2Fvestiaireweather","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fefguydan%2Fvestiaireweather/lists"}