Demo REST API to do enquiries of the details of a country
Project description
The strange name comes from the name of an entity and helmsman whois also a navigator hence looking for details of a country. The strange name also contribute to finding a unique name on yPI and at the same time not squatting useful names on the public domain. Testing the application: 1. Run it locally 2. Connect to the SPI server www.prodigyhelmsman.co.za Run it locally Setup an development environemtn 1. Download from Git 2. InstallReahl - Configure the database 3. Start the server - RUn the unit tests or - Run enquire_country Development
Developing
To do any development, you must install Reahl in a virtual environment. For detailed instructions please refer to the Reahl website (https://www.reahl.org/docs/5.1/tutorial/gettingstarted-install.d.html) The basic steps are as follow:
Prerequisites (for these instructions)
Linux 20.4 (Ubuntu)
Python 3.8
Git 2.25.1
Install a virtual environment
You can setup the virtual environment in a different directory than from your development directory.
Make sure you have sufficient rights to the directory directories.
Install the virtual environment
Activate the virtual environment
The prompt should change to indicate that your virtual environment is active.
$ sudo chmod 777 /usr/local
$ python3 -m venv /usr/local/prodigyhelmsman_env
$ source /usr/local/prodigyhelmsman_env/bin/activate
Install Reahl in the virtual environment
Change to or create the directory where you want to install your project. Your home directory might be the safest for now.
The instructions below will prepare Reahl to connect to a Sqlite database.
Add/replace the mysql parameter in the instruction below depending on your requirement.
$ cd ~
$ pip3 install reahl[declarative,sqlite,dev,doc]
Clone the project from GitHub
$ git clone https://github.com/hendrikdutoit/ProdigyHelmsman
Configure ProdigyHelmsman
$ cd ./ProdigyHelmsman/
$ reahl setup develop -N
$ reahl createdbuser etc
$ reahl createdb etc
$ reahl createdbtables etc
Load test data
The database is empty.
The demosetup procedure will load test data into the database
$ reahl demosetup
Start the simulator
The simulator server is now operational on http://localhost:8000
$ reahl serve etc
Run a sample
Open-up another session
Run the enquire_country script.
Start the enquire_country with command line option “1”. This will connect to the local server. Option “2” will connect to www.prodigyhelmsman.co.za
$ cd ~
$ cd ./ProdigyHelmsman/
$ python3 prodigyhelmsman/enquire_country.py 1
API End Point: list_countries
Method: _list_countries_method
Url: http://localhost:8000/api/
Status 200
{'cca3': 'AUS', 'cca2': 'AU', 'name_common': 'Australia', 'curr_iso': 'AUD'}
{'cca3': 'SWZ', 'cca2': 'SZ', 'name_common': 'Eswatini', 'curr_iso': 'ZAR'}
{'cca3': 'SWZ', 'cca2': 'SZ', 'name_common': 'Eswatini', 'curr_iso': 'SZL'}
{'cca3': 'DER', 'cca2': 'DE', 'name_common': 'Federal Republic of Germany', 'curr_iso': 'EUR'}
{'cca3': 'LSO', 'cca2': 'LS', 'name_common': 'Lesotho', 'curr_iso': 'ZAR'}
{'cca3': 'LSO', 'cca2': 'LS', 'name_common': 'Lesotho', 'curr_iso': 'LSL'}
{'cca3': 'ZAF', 'cca2': 'ZA', 'name_common': 'South Africa', 'curr_iso': 'ZAR'}
{'cca3': 'GBR', 'cca2': 'GB', 'name_common': 'United Kingdom', 'curr_iso': 'GBP'}
{'cca3': 'USA', 'cca2': 'US', 'name_common': 'United States of America', 'curr_iso': 'USD'}
API End Point: list_countries filter currency=LSL (Lesotho loti)
Method: _list_countries_method
Url: http://localhost:8000/api/
Status 200
{'cca3': 'LSO', 'cca2': 'LS', 'name_common': 'Lesotho', 'curr_iso': 'LSL'}
API End Point: find_country filter cca3 = ZAF
Method: _find_country_method
Url: http://localhost:8000/api/
Status 200
{'cca3': 'ZAF', 'cca2': 'ZA', 'name_common': 'South Africa'}
API End Point: find_country filter cca3 = ZA
Method: _find_country_method
Url: http://localhost:8000/api/
Status 200
{'cca3': 'ZAF', 'cca2': 'ZA', 'name_common': 'South Africa'}
{'cca3': 'AUS', 'cca2': 'AU', 'name_common': 'Australia', 'curr_iso': 'AUD'}
{'cca3': 'SWZ', 'cca2': 'SZ', 'name_common': 'Eswatini', 'curr_iso': 'ZAR'}
{'cca3': 'SWZ', 'cca2': 'SZ', 'name_common': 'Eswatini', 'curr_iso': 'SZL'}
{'cca3': 'DER', 'cca2': 'DE', 'name_common': 'Federal Republic of Germany', 'curr_iso': 'EUR'}
{'cca3': 'LSO', 'cca2': 'LS', 'name_common': 'Lesotho', 'curr_iso': 'ZAR'}
{'cca3': 'LSO', 'cca2': 'LS', 'name_common': 'Lesotho', 'curr_iso': 'LSL'}
{'cca3': 'ZAF', 'cca2': 'ZA', 'name_common': 'South Africa', 'curr_iso': 'ZAR'}
{'cca3': 'GBR', 'cca2': 'GB', 'name_common': 'United Kingdom', 'curr_iso': 'GBP'}
{'cca3': 'USA', 'cca2': 'US', 'name_common': 'United States of America', 'curr_iso': 'USD'}
API End Point: delete_country where cca = DER
Method: _delete_country_method
Url: http://localhost:8000/api/
Status 200
{'cca3': 'AUS', 'cca2': 'AU', 'name_common': 'Australia', 'curr_iso': 'AUD'}
{'cca3': 'SWZ', 'cca2': 'SZ', 'name_common': 'Eswatini', 'curr_iso': 'ZAR'}
{'cca3': 'SWZ', 'cca2': 'SZ', 'name_common': 'Eswatini', 'curr_iso': 'SZL'}
{'cca3': 'LSO', 'cca2': 'LS', 'name_common': 'Lesotho', 'curr_iso': 'ZAR'}
{'cca3': 'LSO', 'cca2': 'LS', 'name_common': 'Lesotho', 'curr_iso': 'LSL'}
{'cca3': 'ZAF', 'cca2': 'ZA', 'name_common': 'South Africa', 'curr_iso': 'ZAR'}
{'cca3': 'GBR', 'cca2': 'GB', 'name_common': 'United Kingdom', 'curr_iso': 'GBP'}
{'cca3': 'USA', 'cca2': 'US', 'name_common': 'United States of America', 'curr_iso': 'USD'}
{'cca3': 'AUS', 'cca2': 'AU', 'name_common': 'Australia', 'curr_iso': 'AUD'}
{'cca3': 'SWZ', 'cca2': 'SZ', 'name_common': 'Eswatini', 'curr_iso': 'ZAR'}
{'cca3': 'SWZ', 'cca2': 'SZ', 'name_common': 'Eswatini', 'curr_iso': 'SZL'}
{'cca3': 'LSO', 'cca2': 'LS', 'name_common': 'Lesotho', 'curr_iso': 'ZAR'}
{'cca3': 'LSO', 'cca2': 'LS', 'name_common': 'Lesotho', 'curr_iso': 'LSL'}
{'cca3': 'ZAF', 'cca2': 'ZA', 'name_common': 'South Africa', 'curr_iso': 'ZAR'}
{'cca3': 'GBR', 'cca2': 'GB', 'name_common': 'United Kingdom', 'curr_iso': 'GBP'}
{'cca3': 'USA', 'cca2': 'US', 'name_common': 'United States of America', 'curr_iso': 'USD'}
API End Point: add_country where cca2 = DE, cca3 = DER, name_common = Germany
Method: _add_country_method
Url: http://localhost:8000/api/
Status 200
{'cca3': 'AUS', 'cca2': 'AU', 'name_common': 'Australia', 'curr_iso': 'AUD'}
{'cca3': 'SWZ', 'cca2': 'SZ', 'name_common': 'Eswatini', 'curr_iso': 'ZAR'}
{'cca3': 'SWZ', 'cca2': 'SZ', 'name_common': 'Eswatini', 'curr_iso': 'SZL'}
{'cca3': 'DER', 'cca2': 'DE', 'name_common': 'Federal Republic of Germany', 'curr_iso': 'EUR'}
{'cca3': 'LSO', 'cca2': 'LS', 'name_common': 'Lesotho', 'curr_iso': 'ZAR'}
{'cca3': 'LSO', 'cca2': 'LS', 'name_common': 'Lesotho', 'curr_iso': 'LSL'}
{'cca3': 'ZAF', 'cca2': 'ZA', 'name_common': 'South Africa', 'curr_iso': 'ZAR'}
{'cca3': 'GBR', 'cca2': 'GB', 'name_common': 'United Kingdom', 'curr_iso': 'GBP'}
{'cca3': 'USA', 'cca2': 'US', 'name_common': 'United States of America', 'curr_iso': 'USD'}
Notes
The reahl unit wack the database i.e. the database will be empty after a unit test
Use the reahl demosetup to refresh the database
If you are using sqlite, you must stop the server before loading data into the database. Sqlite can only handle one connection at a time.
Stop the server whilst executing the unit tests. The unit test start its own server, but sqlite has a problem with multiple connections.
Testing
This project uses reahl unit to run execute pytest.
- To run the tests
Make sure the server is stopped <ctrl-c>
$ cd ~
$ cd ./ProdigyHelmsman/
$ reahl unit
REAHLWORKSPACE environment variable not set, defaulting to /home/rtinstall
====================================================================================== test session starts =======================================================================================
platform win32 -- Python 3.8.7, pytest-6.2.5, py-1.11.0, pluggy-1.0.0
rootdir: d:\Dropbox\Projects\ProdigyHelmsman, configfile: setup.cfg
collected 8 items
tests\test_prodigyhelmsman.py .......<html data-reahl-rendered-state="" class="no-js">
<head>
<script>
function switchJSStyle(d, fromStyle, toStyle) {
var r=d.querySelectorAll("html")[0];
r.className=r.className.replace(new RegExp("\\b" + fromStyle + "\\b", "g"),toStyle)
};
(function(d) { switchJSStyle(d, "no-js", "js"); })(document);
</script><title>API</title>
<link rel="stylesheet" href="/static/reahl.css" type="text/css">
<link rel="stylesheet" href="/static/reahl.runningonbadge.css" type="text/css">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<link rel="stylesheet" href="/static/bootstrap-4.5.3/css/bootstrap.css" type="text/css">
<link rel="stylesheet" href="/static/bootstrap-4.5.3/css/reahl-patch.css" type="text/css">
<link rel="stylesheet" href="/static/reahl.files.css" type="text/css">
<link rel="stylesheet" href="/static/reahl.carousel.css" type="text/css">
<link rel="stylesheet" href="/static/reahl.datatable.css" type="text/css">
</head>
<body>
<div id="_reahl_out_of_bound_container"></div>
<script type="text/javascript">
window.QUnit = true;
</script>
<script type="text/javascript" src="/static/jquery-3.5.1/jquery-3.5.1.js"></script>
<script type="text/javascript" src="/static/jquery/jquery.validate-1.19.3.modified.js"></script>
<script type="text/javascript" src="/static/jquery/jquery.ba-bbq-1.3pre.js"></script>
<script type="text/javascript" src="/static/jquery/jquery.blockUI-2.70.0.js"></script>
<script type="text/javascript" src="/static/jquery/jquery.form-4.3.0.js"></script>
<script id="reahl-jqueryready" type="text/javascript">
jQuery(document).ready(function($){
$('body').addClass('enhanced');
});
</script>
<script type="text/javascript" src="/static/js-cookie-2.2.1/js.cookie.js"></script>
<script type="text/javascript" src="/static/jquery-ui-1.12.1.custom/jquery-ui.js"></script>
<script type="text/javascript" src="/static/underscore-umd-min.1.13.1.js"></script><script>var underscore = _;</script>
<!--[if lt IE 9]>
<script type="text/javascript" src="/static/html5shiv-printshiv-3.7.3.js"></script><![endif]-->
<!--[if lte IE 9]>
<script type="text/javascript" src="/static/IE9.js"></script><![endif]-->
<script type="text/javascript" src="/static/reahl.hashchange.js"></script>
<script type="text/javascript" src="/static/reahl.ajaxlink.js"></script>
<script type="text/javascript" src="/static/reahl.primitiveinput.js"></script>
<script type="text/javascript" src="/static/reahl.textinput.js"></script>
<script type="text/javascript" src="/static/reahl.validate.js"></script>
<script type="text/javascript" src="/static/reahl.form.js"></script>
<script type="text/javascript" src="/static/holder-2.9.9.js"></script>
<script type="text/javascript" src="/static/popper-1.16.1/popper.js"></script>
<script type="text/javascript" src="/static/bootstrap-4.5.3/js/bootstrap.js"></script>
<script type="text/javascript" src="/static/reahl.bootstrapform.js"></script>
<script type="text/javascript" src="/static/reahl.pagination.js"></script>
<script type="text/javascript" src="/static/reahl.files.js"></script>
<script type="text/javascript" src="/static/reahl.bootstrappopupa.js"></script>
<script type="text/javascript" src="/static/reahl.bootstrapcueinput.js"></script>
<script type="text/javascript" src="/static/reahl.bootstrapfileuploadli.js"></script>
<script type="text/javascript" src="/static/reahl.bootstrapfileuploadpanel.js"></script>
</body>
<p>This is the ProdigyHelmsman API. Methods:</p>
<ul></ul>
<li><p>add_country [['post']]: /api/_add_country_method</p></li>
<li><p>delete_country [['post']]: /api/_delete_country_method</p></li>
<li><p>find_country [['get']]: /api/_find_country_method</p></li>
<li><p>list_countries [['get']]: /api/_list_countries_method</p></li>
<li><p>log_in [['post']]: /api/_log_in_method</p></li>
</html>
.
======================================================================================= 8 passed in 2.84s ========================================================================================
Connecting to www.prodigyhelmsman.co.za
The API server is currently active on www.prodigyhelmsman.co.za. To connect to www.prodigyhelmsman.co.za:
$ cd ~
$ cd ./ProdigyHelmsman/
$ python3 prodigyhelmsman/enquire_country.py 1
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distribution
File details
Details for the file ProdigyHelmsman-0.0.7-py3-none-any.whl
.
File metadata
- Download URL: ProdigyHelmsman-0.0.7-py3-none-any.whl
- Upload date:
- Size: 22.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.1.1 pkginfo/1.8.2 requests/2.27.1 setuptools/49.2.1 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.7
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 237a0e1e00f2b7827c75c35d04455b7baea284740d70d50fadf1be76f474f6bc |
|
MD5 | 2df7adb45c587b80dd173b1022fe3b44 |
|
BLAKE2b-256 | 05b5cf2960a37fae796a578e56d029a85363edf6966e661cd75580e6800de6ab |