Skip to content

Commit

Permalink
Merge pull request #6 from IvanildoBarauna/feat-ImplementHexagonalArch
Browse files Browse the repository at this point in the history
[NEW FEATURE] Hexagonal Arch Implemented
  • Loading branch information
IvanildoBarauna authored Jun 27, 2024
2 parents ac25c22 + fd99a9f commit 2f758ee
Show file tree
Hide file tree
Showing 29 changed files with 481 additions and 289 deletions.
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -163,4 +163,5 @@ cython_debug/
*.DS_Store

*.http
.idea/httpRequests*
.idea/httpRequests*
.idea/dataSources*

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions .idea/scopes/currency_quote_wrapper.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

231 changes: 231 additions & 0 deletions .xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,231 @@
<?xml version="1.0" ?>
<coverage version="6.5.0" timestamp="1719423325108" lines-valid="137" lines-covered="130" line-rate="0.9489" branches-covered="0" branches-valid="0" branch-rate="0" complexity="0">
<!-- Generated by coverage.py: https://coverage.readthedocs.io -->
<!-- Based on https://raw.githubusercontent.com/cobertura/web/master/htdocs/xml/coverage-04.dtd -->
<sources>
<source>/Users/ivsouza/Github/IvanildoBarauna/currency-quote-wrapper</source>
</sources>
<packages>
<package name="src.currency_quote.adapters.outbound" line-rate="0.963" branch-rate="0" complexity="0">
<classes>
<class name="currency_api.py" filename="src/currency_quote/adapters/outbound/currency_api.py" complexity="0" line-rate="0.9231" branch-rate="0">
<methods/>
<lines>
<line number="1" hits="1"/>
<line number="2" hits="1"/>
<line number="3" hits="1"/>
<line number="6" hits="1"/>
<line number="7" hits="1"/>
<line number="8" hits="1"/>
<line number="10" hits="1"/>
<line number="11" hits="1"/>
<line number="12" hits="1"/>
<line number="17" hits="1"/>
<line number="19" hits="1"/>
<line number="21" hits="1"/>
<line number="22" hits="0"/>
</lines>
</class>
<class name="currency_validator_api.py" filename="src/currency_quote/adapters/outbound/currency_validator_api.py" complexity="0" line-rate="1" branch-rate="0">
<methods/>
<lines>
<line number="2" hits="1"/>
<line number="3" hits="1"/>
<line number="4" hits="1"/>
<line number="7" hits="1"/>
<line number="9" hits="1"/>
<line number="10" hits="1"/>
<line number="12" hits="1"/>
<line number="13" hits="1"/>
<line number="18" hits="1"/>
<line number="20" hits="1"/>
<line number="22" hits="1"/>
<line number="23" hits="1"/>
<line number="24" hits="1"/>
<line number="26" hits="1"/>
</lines>
</class>
</classes>
</package>
<package name="src.currency_quote.application.ports.outbound" line-rate="0.7368" branch-rate="0" complexity="0">
<classes>
<class name="currency_repository.py" filename="src/currency_quote/application/ports/outbound/currency_repository.py" complexity="0" line-rate="0.7273" branch-rate="0">
<methods/>
<lines>
<line number="2" hits="1"/>
<line number="5" hits="1"/>
<line number="6" hits="1"/>
<line number="7" hits="1"/>
<line number="8" hits="0"/>
<line number="10" hits="1"/>
<line number="11" hits="1"/>
<line number="12" hits="0"/>
<line number="14" hits="1"/>
<line number="15" hits="1"/>
<line number="16" hits="0"/>
</lines>
</class>
<class name="currency_validator_repository.py" filename="src/currency_quote/application/ports/outbound/currency_validator_repository.py" complexity="0" line-rate="0.75" branch-rate="0">
<methods/>
<lines>
<line number="2" hits="1"/>
<line number="5" hits="1"/>
<line number="7" hits="1"/>
<line number="8" hits="1"/>
<line number="9" hits="0"/>
<line number="11" hits="1"/>
<line number="12" hits="1"/>
<line number="13" hits="0"/>
</lines>
</class>
</classes>
</package>
<package name="src.currency_quote.application.use_cases" line-rate="1" branch-rate="0" complexity="0">
<classes>
<class name="get_last_currency_quote.py" filename="src/currency_quote/application/use_cases/get_last_currency_quote.py" complexity="0" line-rate="1" branch-rate="0">
<methods/>
<lines>
<line number="2" hits="1"/>
<line number="3" hits="1"/>
<line number="4" hits="1"/>
<line number="7" hits="1"/>
<line number="8" hits="1"/>
<line number="9" hits="1"/>
<line number="10" hits="1"/>
<line number="11" hits="1"/>
<line number="15" hits="1"/>
</lines>
</class>
<class name="test_get_last_currency_quote.py" filename="src/currency_quote/application/use_cases/test_get_last_currency_quote.py" complexity="0" line-rate="1" branch-rate="0">
<methods/>
<lines>
<line number="1" hits="1"/>
<line number="2" hits="1"/>
<line number="5" hits="1"/>
<line number="6" hits="1"/>
<line number="7" hits="1"/>
<line number="8" hits="1"/>
<line number="9" hits="1"/>
<line number="12" hits="1"/>
<line number="13" hits="1"/>
<line number="14" hits="1"/>
<line number="15" hits="1"/>
<line number="16" hits="1"/>
<line number="17" hits="1"/>
<line number="20" hits="1"/>
<line number="21" hits="1"/>
<line number="22" hits="1"/>
<line number="23" hits="1"/>
</lines>
</class>
<class name="test_validate_currency.py" filename="src/currency_quote/application/use_cases/test_validate_currency.py" complexity="0" line-rate="1" branch-rate="0">
<methods/>
<lines>
<line number="1" hits="1"/>
<line number="2" hits="1"/>
<line number="5" hits="1"/>
<line number="6" hits="1"/>
<line number="7" hits="1"/>
<line number="8" hits="1"/>
<line number="11" hits="1"/>
<line number="12" hits="1"/>
<line number="13" hits="1"/>
<line number="14" hits="1"/>
<line number="15" hits="1"/>
<line number="18" hits="1"/>
<line number="19" hits="1"/>
<line number="20" hits="1"/>
<line number="21" hits="1"/>
</lines>
</class>
<class name="validate_currency.py" filename="src/currency_quote/application/use_cases/validate_currency.py" complexity="0" line-rate="1" branch-rate="0">
<methods/>
<lines>
<line number="2" hits="1"/>
<line number="3" hits="1"/>
<line number="4" hits="1"/>
<line number="7" hits="1"/>
<line number="8" hits="1"/>
<line number="9" hits="1"/>
<line number="10" hits="1"/>
<line number="11" hits="1"/>
<line number="15" hits="1"/>
</lines>
</class>
</classes>
</package>
<package name="src.currency_quote.config" line-rate="1" branch-rate="0" complexity="0">
<classes>
<class name="endpoints.py" filename="src/currency_quote/config/endpoints.py" complexity="0" line-rate="1" branch-rate="0">
<methods/>
<lines>
<line number="1" hits="1"/>
<line number="2" hits="1"/>
<line number="3" hits="1"/>
<line number="4" hits="1"/>
<line number="5" hits="1"/>
<line number="6" hits="1"/>
<line number="7" hits="1"/>
</lines>
</class>
</classes>
</package>
<package name="src.currency_quote.domain.entities" line-rate="1" branch-rate="0" complexity="0">
<classes>
<class name="currency.py" filename="src/currency_quote/domain/entities/currency.py" complexity="0" line-rate="1" branch-rate="0">
<methods/>
<lines>
<line number="3" hits="1"/>
<line number="4" hits="1"/>
<line number="5" hits="1"/>
<line number="7" hits="1"/>
<line number="8" hits="1"/>
</lines>
</class>
</classes>
</package>
<package name="src.currency_quote.domain.services" line-rate="0.9655" branch-rate="0" complexity="0">
<classes>
<class name="get_currency_quote.py" filename="src/currency_quote/domain/services/get_currency_quote.py" complexity="0" line-rate="0.9333" branch-rate="0">
<methods/>
<lines>
<line number="1" hits="1"/>
<line number="2" hits="1"/>
<line number="3" hits="1"/>
<line number="5" hits="1"/>
<line number="8" hits="1"/>
<line number="9" hits="1"/>
<line number="10" hits="1"/>
<line number="11" hits="1"/>
<line number="13" hits="1"/>
<line number="14" hits="1"/>
<line number="16" hits="1"/>
<line number="17" hits="0"/>
<line number="19" hits="1"/>
<line number="20" hits="1"/>
<line number="21" hits="1"/>
</lines>
</class>
<class name="validate_currency.py" filename="src/currency_quote/domain/services/validate_currency.py" complexity="0" line-rate="1" branch-rate="0">
<methods/>
<lines>
<line number="2" hits="1"/>
<line number="3" hits="1"/>
<line number="4" hits="1"/>
<line number="7" hits="1"/>
<line number="8" hits="1"/>
<line number="9" hits="1"/>
<line number="10" hits="1"/>
<line number="12" hits="1"/>
<line number="13" hits="1"/>
<line number="15" hits="1"/>
<line number="16" hits="1"/>
<line number="18" hits="1"/>
<line number="19" hits="1"/>
<line number="21" hits="1"/>
</lines>
</class>
</classes>
</package>
</packages>
</coverage>
46 changes: 29 additions & 17 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
# currency-quote-wrapper: Complete solution for extracting currency pair quotes data
# currency-quote-wrapper: Complete solution for extracting currency pair quotes data.

## Project description
Complete solution for extracting currency pair quotes data.
With comprehensive testing, parameter validation, flexible configuration management, Hexagonal Architecture, CI/CD pipelines, code quality tools, and detailed documentation.


[![PyPI - Status](https://img.shields.io/pypi/status/currency-quote?style=for-the-badge&logo=pypi)](https://pypi.org/project/currency-quote/)

Expand All @@ -12,6 +17,7 @@
[![CD](https://img.shields.io/github/actions/workflow/status/IvanildoBarauna/currency-quote-wrapper/CD.yaml?&style=for-the-badge&logo=githubactions&cacheSeconds=60&event=release&label=Package+publication)](https://github.com/IvanildoBarauna/currency-quote-wrapper/actions/workflows/CD.yaml)

[![Codecov](https://img.shields.io/codecov/c/github/IvanildoBarauna/currency-quote-wrapper?style=for-the-badge&logo=codecov)](https://app.codecov.io/gh/IvanildoBarauna/currency-quote-wrapper)

## Project Stack

![Python](https://img.shields.io/badge/-Python-05122A?style=flat&logo=python)&nbsp;
Expand All @@ -24,9 +30,21 @@
![pytest](https://img.shields.io/badge/-pytest-05122A?style=flat&logo=pytest)&nbsp;


## Project description
## Project Highlights:

- **Comprehensive Testing:** Development of tests to ensure the quality and robustness of the code

- **Parameter Validation:** Sending valid parameters based on the request data source itself, ensuring the integrity and accuracy of the information processed.

- **Configuration Management:** Use of a configuration module to manage endpoints, retry times and number of attempts, providing flexibility and ease of adjustment.

* Complete solution for extracting currency pair quotes data
- **Hexagonal Architecture:** Adoption of Hexagonal Architecture to decouple the core logic from external dependencies, ensuring that any current data source can be replaced seamlessly in case of unavailability. This is facilitated by the use of adapters, which act as intermediaries between the core application and the external services.

- **Cotinuous Integration** and Continuous Deployment: Use of CI/CD pipelines to automate the build, test and deployment processes, ensuring that the application is always up to date and ready for use.

- **Code Quality:** Use of code quality tools such as linters and formatters to ensure that the codebase is clean, consistent and easy to read.

- **Documentation:** Creation of detailed documentation to facilitate the understanding and use of the application, including installation instructions, usage examples and troubleshooting guides.

## Contributing

Expand All @@ -35,27 +53,21 @@ See the following docs:
- [Contributing Guide](https://github.com/IvanildoBarauna/currency-quote-wrapper/blob/main/CONTRIBUTING.md)
- [Code Of Conduct](https://github.com/IvanildoBarauna/currency-quote-wrapper/blob/main/CODE_OF_CONDUCT.md)

## Project Highlights:

- Comprehensive Testing: Development of tests to ensure the quality and robustness of the code

- Parameter Validation: Sending valid parameters based on the request data source itself, ensuring the integrity and accuracy of the information processed.

- Configuration Management: Use of a configuration module to manage endpoints, retry times and number of attempts, providing flexibility and ease of adjustment.

## How to use it
## How to get currency quotes using this library

``` python
## Importing library
from currency_quote CurrencyQuote
from currency_quote import CurrencyQuote, ClientBuilder

# For get the last quote of one currency
client = CurrencyQuote(['USD-BRL'])
client = ClientBuilder(currency=CurrencyQuote(currency_list=["USD-BRL"]))
# or get quotes of multiple currencies
client = CurrencyQuote(['USD-BRL', 'EUR-BRL'])
client = ClientBuilder(
currency=CurrencyQuote(currency_list=['USD-BRL', 'EUR-BRL'])
)

# Get the last quote
last_quote = client.get_last_quote()
print(client.get_last_quote())
# Get history quote of currency
history_quote = client.get_history_quote(reference_date=20240626)

print(client.get_history_quote(reference_date=20220101))
2 changes: 1 addition & 1 deletion poetry.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 3 additions & 3 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
[tool.poetry]
name = "currency-quote"
version = "1.0.1"
description = "Complete solution for extracting currency pair quotes data"
version = "2.0.0"
description = "Complete solution for extracting currency pair quotes data. With comprehensive testing, parameter validation, flexible configuration management, Hexagonal Architecture, CI/CD pipelines, code quality tools, and detailed documentation."
authors = ["IvanildoBarauna <[email protected]>"]
readme = "README.md"
license = "MIT"

classifiers=[
"Development Status :: 2 - Pre-Alpha",
"Development Status :: 3 - Alpha",
"Intended Audience :: Developers",
"License :: OSI Approved :: MIT License",
"Programming Language :: Python :: 3",
Expand Down
Loading

0 comments on commit 2f758ee

Please sign in to comment.