Add: Initial commit
This commit is contained in:
129
.gitignore
vendored
Normal file
129
.gitignore
vendored
Normal file
@@ -0,0 +1,129 @@
|
||||
# Byte-compiled / optimized / DLL files
|
||||
__pycache__/
|
||||
*.py[cod]
|
||||
*$py.class
|
||||
Pipfile.lock
|
||||
# C extensions
|
||||
*.so
|
||||
|
||||
# Distribution / packaging
|
||||
.Python
|
||||
build/
|
||||
develop-eggs/
|
||||
dist/
|
||||
downloads/
|
||||
eggs/
|
||||
.eggs/
|
||||
lib/
|
||||
lib64/
|
||||
parts/
|
||||
sdist/
|
||||
var/
|
||||
wheels/
|
||||
pip-wheel-metadata/
|
||||
share/python-wheels/
|
||||
*.egg-info/
|
||||
.installed.cfg
|
||||
*.egg
|
||||
MANIFEST
|
||||
|
||||
# PyInstaller
|
||||
# Usually these files are written by a python script from a template
|
||||
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
||||
*.manifest
|
||||
*.spec
|
||||
|
||||
# Installer logs
|
||||
pip-log.txt
|
||||
pip-delete-this-directory.txt
|
||||
|
||||
# Unit test / coverage reports
|
||||
htmlcov/
|
||||
.tox/
|
||||
.nox/
|
||||
.coverage
|
||||
.coverage.*
|
||||
.cache
|
||||
nosetests.xml
|
||||
coverage.xml
|
||||
*.cover
|
||||
*.py,cover
|
||||
.hypothesis/
|
||||
.pytest_cache/
|
||||
|
||||
# Translations
|
||||
*.mo
|
||||
*.pot
|
||||
|
||||
# Django stuff:
|
||||
*.log
|
||||
local_settings.py
|
||||
db.sqlite3
|
||||
db.sqlite3-journal
|
||||
|
||||
# Flask stuff:
|
||||
instance/
|
||||
.webassets-cache
|
||||
|
||||
# Scrapy stuff:
|
||||
.scrapy
|
||||
|
||||
# Sphinx documentation
|
||||
docs/_build/
|
||||
|
||||
# PyBuilder
|
||||
target/
|
||||
|
||||
# Jupyter Notebook
|
||||
.ipynb_checkpoints
|
||||
|
||||
# IPython
|
||||
profile_default/
|
||||
ipython_config.py
|
||||
|
||||
# pyenv
|
||||
.python-version
|
||||
|
||||
# pipenv
|
||||
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
||||
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
||||
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
||||
# install all needed dependencies.
|
||||
#Pipfile.lock
|
||||
|
||||
# PEP 582; used by e.g. github.com/David-OConnor/pyflow
|
||||
__pypackages__/
|
||||
|
||||
# Celery stuff
|
||||
celerybeat-schedule
|
||||
celerybeat.pid
|
||||
|
||||
# SageMath parsed files
|
||||
*.sage.py
|
||||
|
||||
# Environments
|
||||
.env
|
||||
.venv
|
||||
env/
|
||||
venv/
|
||||
ENV/
|
||||
env.bak/
|
||||
venv.bak/
|
||||
|
||||
# Spyder project settings
|
||||
.spyderproject
|
||||
.spyproject
|
||||
|
||||
# Rope project settings
|
||||
.ropeproject
|
||||
|
||||
# mkdocs documentation
|
||||
/site
|
||||
|
||||
# mypy
|
||||
.mypy_cache/
|
||||
.dmypy.json
|
||||
dmypy.json
|
||||
|
||||
# Pyre type checker
|
||||
.pyre/
|
||||
201
LICENSE
Normal file
201
LICENSE
Normal file
@@ -0,0 +1,201 @@
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
17
Pipfile
Normal file
17
Pipfile
Normal file
@@ -0,0 +1,17 @@
|
||||
[[source]]
|
||||
url = "https://pypi.org/simple"
|
||||
verify_ssl = true
|
||||
name = "pypi"
|
||||
|
||||
[packages]
|
||||
fastapi = "*"
|
||||
uvicorn = "*"
|
||||
python-multipart = "*"
|
||||
|
||||
[dev-packages]
|
||||
pytest = "*"
|
||||
requests = "*"
|
||||
autopep8 = "*"
|
||||
|
||||
[requires]
|
||||
python_version = "3.6"
|
||||
78
README.md
Normal file
78
README.md
Normal file
@@ -0,0 +1,78 @@
|
||||
<!-- omit in toc -->
|
||||
# IDA recruitment test
|
||||
|
||||
IDA (**I**n**D**ex re**A**der) is an API for providing data from the well-known share indices ([DAX](https://en.wikipedia.org/wiki/DAX) & [S&P](https://en.wikipedia.org/wiki/S%26P_Global_Ratings)). It is intended to represent an exemplary application that exists within [Union Investment](https://www.union-investment.de/startseite) and is designed to test the basic programming skills of applicants.
|
||||
|
||||
Technically, [Python 3](https://www.python.org/) and [FastAPI](https://fastapi.tiangolo.com/) are used for the API. Both technologies allow fast and stable web service development.
|
||||
|
||||
<!-- omit in toc -->
|
||||
## Table of Contents
|
||||
|
||||
- [Preparation](#preparation)
|
||||
- [Exercises](#exercises)
|
||||
- [Excercise 1](#excercise-1)
|
||||
- [Excercise 2](#excercise-2)
|
||||
- [Excercise 3](#excercise-3)
|
||||
|
||||
## Preparation
|
||||
|
||||
Before you start, you must:
|
||||
|
||||
- Install [Python 3.6.x.](https://www.python.org/downloads/)
|
||||
- Install [Pipenv](https://pipenv.pypa.io/en/latest/#install-pipenv-today)
|
||||
|
||||
To activate this project's virtualenv, run following command:
|
||||
|
||||
```python
|
||||
pipenv shell
|
||||
```
|
||||
|
||||
Then install the project dependencies with:
|
||||
|
||||
```python
|
||||
pipenv install
|
||||
```
|
||||
|
||||
After successful installation the API can be started locally with the command:
|
||||
|
||||
```python
|
||||
uvicorn main:app --reload
|
||||
```
|
||||
|
||||
You will now be able of accessing the API via your browser on [http://127.0.0.1:8000](http://127.0.0.1:8000).
|
||||
|
||||
## Exercises
|
||||
|
||||
Please complete the exercises within one week and submit the results as previously agreed.We will discuss the task together in a subsequent interview. All tasks can be solved with the help of the [documentation](https://fastapi.tiangolo.com/).
|
||||
|
||||
If you have direct questions about the Recrutiment Test, you can contact us directly via e-mail at [cloudoperations@union-investment.de](mailto:cloudoperations@union-investment.de).
|
||||
|
||||
**Good luck with the exercises!**
|
||||
|
||||
### Excercise 1
|
||||
|
||||
Extend the API with another endpoint that should be accessible via the `/getdata` path. This endpoint is to return all share indices in a list page by page. Each page should contain a maximum of 30 elements.
|
||||
|
||||
### Excercise 2
|
||||
|
||||
Please complete the `create_upload_files` method so that you can update share indices data at runtime. The data should be sent in the form of a CSV file using an HTTP POST request.
|
||||
|
||||
For example, the following curl command can be used for testing:
|
||||
|
||||
```bash
|
||||
curl -d @daxsp.csv http://127.0.0.1:8000/uploadfile
|
||||
```
|
||||
|
||||
[Note in the documentation](https://fastapi.tiangolo.com/tutorial/request-files/)
|
||||
|
||||
### Excercise 3
|
||||
|
||||
Finally, please write appropriate unit tests for your two tasks using the [components provided by FastAPI](https://fastapi.tiangolo.com/tutorial/testing/).
|
||||
To do this, expand the test_main.py file. The tests can be run with the following command:
|
||||
|
||||
```python
|
||||
pytest
|
||||
```
|
||||
|
||||
---
|
||||
***Copyright © 2022 Union IT-Services GmbH. All rights reserved.***
|
||||
257
daxsp.csv
Normal file
257
daxsp.csv
Normal file
@@ -0,0 +1,257 @@
|
||||
Date,DAX,SP500
|
||||
20211201,15263,4513
|
||||
20211130,15472,4567
|
||||
20211129,15100,4655
|
||||
20211126,15280,4594
|
||||
20211124,15257,4701
|
||||
20211123,15917,4690
|
||||
20211122,15878,4682
|
||||
20211119,15937,4697
|
||||
20211118,16115,4704
|
||||
20211117,16159,4688
|
||||
20211116,16221,4700
|
||||
20211115,16251,4682
|
||||
20211112,16247,4682
|
||||
20211111,16148,4649
|
||||
20211110,16094,4646
|
||||
20211109,16083,4685
|
||||
20211108,16067,4701
|
||||
20211105,16040,4697
|
||||
20211104,16046,4680
|
||||
20211103,16054,4660
|
||||
20211102,16029,4630
|
||||
20211101,15959,4613
|
||||
20211029,15954,4605
|
||||
20211028,15806,4596
|
||||
20211027,15688,4551
|
||||
20211026,15696,4574
|
||||
20211025,15705,4566
|
||||
20211022,15757,4544
|
||||
20211021,15599,4549
|
||||
20211020,15542,4536
|
||||
20211019,15472,4519
|
||||
20211018,15522,4486
|
||||
20211015,15515,4471
|
||||
20211014,15474,4438
|
||||
20211013,15587,4363
|
||||
20211012,15462,4350
|
||||
20211011,15249,4361
|
||||
20211008,15146,4391
|
||||
20211007,15199,4399
|
||||
20211006,15206,4363
|
||||
20211005,15250,4345
|
||||
20211004,14973,4300
|
||||
20211001,15194,4357
|
||||
20210930,15036,4307
|
||||
20210929,15156,4359
|
||||
20210928,15260,4352
|
||||
20210927,15365,4443
|
||||
20210924,15248,4455
|
||||
20210923,15573,4448
|
||||
20210922,15531,4395
|
||||
20210921,15643,4354
|
||||
20210920,15506,4357
|
||||
20210917,15348,4432
|
||||
20210916,15132,4473
|
||||
20210915,15490,4480
|
||||
20210914,15651,4443
|
||||
20210913,15616,4468
|
||||
20210910,15722,4458
|
||||
20210909,15701,4493
|
||||
20210908,15609,4514
|
||||
20210907,15623,4520
|
||||
20210903,15610,4535
|
||||
20210902,15843,4536
|
||||
20210901,15932,4524
|
||||
20210831,15781,4522
|
||||
20210830,15840,4528
|
||||
20210827,15824,4509
|
||||
20210826,15835,4470
|
||||
20210825,15887,4496
|
||||
20210824,15851,4486
|
||||
20210823,15793,4479
|
||||
20210820,15860,4441
|
||||
20210819,15905,4405
|
||||
20210818,15852,4400
|
||||
20210817,15808,4448
|
||||
20210816,15765,4479
|
||||
20210813,15965,4468
|
||||
20210812,15921,4460
|
||||
20210811,15925,4442
|
||||
20210810,15977,4436
|
||||
20210809,15937,4432
|
||||
20210806,15826,4436
|
||||
20210805,15770,4429
|
||||
20210804,15745,4402
|
||||
20210803,15761,4423
|
||||
20210802,15744,4387
|
||||
20210730,15692,4395
|
||||
20210729,15555,4419
|
||||
20210728,15568,4400
|
||||
20210727,15544,4401
|
||||
20210726,15640,4422
|
||||
20210723,15570,4411
|
||||
20210722,15519,4367
|
||||
20210721,15618,4358
|
||||
20210720,15669,4323
|
||||
20210719,15514,4258
|
||||
20210716,15422,4327
|
||||
20210715,15216,4360
|
||||
20210714,15133,4374
|
||||
20210713,15540,4369
|
||||
20210712,15629,4384
|
||||
20210709,15788,4369
|
||||
20210708,15789,4320
|
||||
20210707,15790,4358
|
||||
20210706,15687,4343
|
||||
20210702,15420,4352
|
||||
20210701,15692,4319
|
||||
20210630,15511,4297
|
||||
20210629,15661,4291
|
||||
20210628,15650,4290
|
||||
20210625,15603,4280
|
||||
20210624,15531,4266
|
||||
20210623,15690,4241
|
||||
20210622,15554,4246
|
||||
20210621,15607,4224
|
||||
20210618,15589,4166
|
||||
20210617,15456,4221
|
||||
20210616,15636,4223
|
||||
20210615,15603,4246
|
||||
20210614,15448,4255
|
||||
20210611,15727,4247
|
||||
20210610,15710,4239
|
||||
20210609,15729,4219
|
||||
20210608,15673,4227
|
||||
20210607,15693,4226
|
||||
20210604,15571,4229
|
||||
20210603,15581,4192
|
||||
20210602,15640,4208
|
||||
20210601,15677,4202
|
||||
20210528,15692,4204
|
||||
20210527,15632,4200
|
||||
20210526,15602,4195
|
||||
20210525,15567,4188
|
||||
20210524,15421,4197
|
||||
20210521,15519,4155
|
||||
20210520,15406,4159
|
||||
20210519,15450,4115
|
||||
20210518,15465,4127
|
||||
20210517,15437,4163
|
||||
20210514,15370,4173
|
||||
20210513,15113,4112
|
||||
20210512,15386,4063
|
||||
20210511,15396,4152
|
||||
20210510,15416,4188
|
||||
20210507,15199,4232
|
||||
20210506,15150,4201
|
||||
20210505,15119,4167
|
||||
20210504,15400,4164
|
||||
20210503,15399,4192
|
||||
20210430,15196,4181
|
||||
20210429,15170,4211
|
||||
20210428,14856,4183
|
||||
20210427,15236,4186
|
||||
20210426,15135,4187
|
||||
20210423,15154,4180
|
||||
20210422,15292,4134
|
||||
20210421,15249,4173
|
||||
20210420,15296,4134
|
||||
20210419,15279,4163
|
||||
20210416,15320,4185
|
||||
20210415,15195,4170
|
||||
20210414,15129,4124
|
||||
20210413,15368,4141
|
||||
20210412,15459,4127
|
||||
20210409,15255,4128
|
||||
20210408,15209,4097
|
||||
20210407,15234,4079
|
||||
20210406,15215,4073
|
||||
20210405,15234,4077
|
||||
20210401,15202,4019
|
||||
20210331,15176,3972
|
||||
20210330,15212,3958
|
||||
20210329,15107,3971
|
||||
20210326,15008,3974
|
||||
20210325,15008,3909
|
||||
20210324,14817,3889
|
||||
20210323,14748,3910
|
||||
20210322,14621,3940
|
||||
20210319,14610,3913
|
||||
20210318,14662,3915
|
||||
20210317,14657,3974
|
||||
20210316,14621,3962
|
||||
20210315,14775,3968
|
||||
20210312,14596,3943
|
||||
20210311,14557,3939
|
||||
20210310,14461,3898
|
||||
20210309,14502,3875
|
||||
20210308,14569,3821
|
||||
20210305,14540,3841
|
||||
20210304,14437,3768
|
||||
20210303,14380,3819
|
||||
20210302,13920,3870
|
||||
20210301,14056,3901
|
||||
20210226,14080,3811
|
||||
20210225,14039,3829
|
||||
20210224,14012,3925
|
||||
20210223,13786,3881
|
||||
20210222,13879,3876
|
||||
20210219,13976,3906
|
||||
20210218,13864,3913
|
||||
20210217,13950,3931
|
||||
20210216,13993,3932
|
||||
20210212,13886,3934
|
||||
20210211,13909,3916
|
||||
20210210,14064,3909
|
||||
20210209,14109,3911
|
||||
20210208,14049,3915
|
||||
20210205,14040,3886
|
||||
20210204,13932,3871
|
||||
20210203,14011,3830
|
||||
20210202,14059,3826
|
||||
20210201,14056,3773
|
||||
20210129,14060,3714
|
||||
20210128,13933,3787
|
||||
20210127,13835,3750
|
||||
20210126,13622,3849
|
||||
20210125,13432,3855
|
||||
20210122,13665,3841
|
||||
20210121,13620,3853
|
||||
20210120,13870,3851
|
||||
20210119,13643,3798
|
||||
20210115,13873,3768
|
||||
20210114,13906,3795
|
||||
20210113,13921,3809
|
||||
20210112,13815,3801
|
||||
20210111,13848,3799
|
||||
20210108,13787,3824
|
||||
20210107,13988,3803
|
||||
20210106,13939,3748
|
||||
20210105,13925,3726
|
||||
20210104,13936,3700
|
||||
20201231,14049,3756
|
||||
20201230,13968,3732
|
||||
20201229,13891,3727
|
||||
20201228,13651,3735
|
||||
20201224,13726,3703
|
||||
20201223,13718,3690
|
||||
20201222,13761,3687
|
||||
20201221,13790,3694
|
||||
20201218,13587,3709
|
||||
20201217,13418,3722
|
||||
20201216,13246,3701
|
||||
20201215,13630,3694
|
||||
20201214,13667,3647
|
||||
20201211,13565,3663
|
||||
20201210,13362,3668
|
||||
20201209,13223,3672
|
||||
20201208,13114,3702
|
||||
20201207,13295,3691
|
||||
20201204,13340,3699
|
||||
20201203,13278,3666
|
||||
20201202,13271,3669
|
||||
20201202,13271,3669
|
||||
20201202,13271,3669
|
||||
20201202,13271,3669
|
||||
20201202,13271,3669
|
||||
|
90
main.py
Normal file
90
main.py
Normal file
@@ -0,0 +1,90 @@
|
||||
import uvicorn
|
||||
from starlette.responses import RedirectResponse
|
||||
from fastapi import FastAPI, HTTPException, File, UploadFile
|
||||
from typing import Optional, List
|
||||
from csv import reader
|
||||
|
||||
|
||||
### gloabls
|
||||
app = FastAPI()
|
||||
indices = []
|
||||
|
||||
@app.get("/")
|
||||
async def redirect():
|
||||
response = RedirectResponse(url='/docs')
|
||||
return response
|
||||
|
||||
@app.get("/getdata/{date}")
|
||||
async def read_item(date: str, index: str = "DAX", show_all_indices: Optional[bool] = False):
|
||||
result = {"date": date}
|
||||
|
||||
if date not in fake_items_db:
|
||||
raise HTTPException(status_code=404, detail="Date not found")
|
||||
|
||||
elif show_all_indices:
|
||||
for i in indices:
|
||||
result.update({i: fake_items_db[date][i]})
|
||||
|
||||
else:
|
||||
result.update({index: fake_items_db[date][index]})
|
||||
|
||||
return result
|
||||
|
||||
|
||||
|
||||
@app.post("/uploadfile/")
|
||||
async def create_upload_files(file: UploadFile = File(...)):
|
||||
content = await file.read()
|
||||
|
||||
# add the entries of the uploaded file to fake_items_db
|
||||
# data structure of fake_items_db:
|
||||
# {"09091990": {"DAX": "1232456", "SP500:" "9238748"}, "08081990":{"DAX": "2345646", "SP500:" "2324432"}, ..}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
def add_entries_to_dict(data):
|
||||
"""
|
||||
Adds the entries to the global fake_items_db dictionairy.
|
||||
Only available during server runtime.
|
||||
|
||||
Args:
|
||||
data (list(list)): [["Date", "DAX", "SP500"], ["30112021", "132345", "762190"], ..]
|
||||
"""
|
||||
for line_no, line in enumerate(data, 0):
|
||||
if (line_no == 0):
|
||||
new_indices = line[1:]
|
||||
for index in new_indices:
|
||||
indices.append(index) if index not in indices else indices
|
||||
#todo: check order of line of line_no == 0 and indices
|
||||
else:
|
||||
fake_items_db.update({line[0]: {}})
|
||||
for index_no, index in enumerate(indices, 1):
|
||||
fake_items_db[line[0]].update({index: line[index_no + 0]})
|
||||
|
||||
|
||||
def initialize_dict(fake_items_db, filename):
|
||||
"""
|
||||
Initializes the fake_items_db dictionairy
|
||||
|
||||
Args:
|
||||
fake_items_db (dict): initial empty dictionairy
|
||||
filename (string): path to inital file
|
||||
|
||||
Returns:
|
||||
dict(dict): {"09091990": {"DAX": "1232456", "SP500:" "9238748"}, "08081990":{"DAX": "2345646", "SP500:" "2324432"} ..}
|
||||
"""
|
||||
file = open('./' + filename, encoding='UTF8')
|
||||
csv_reader = reader(file)
|
||||
add_entries_to_dict(csv_reader)
|
||||
file.close()
|
||||
|
||||
return fake_items_db
|
||||
|
||||
|
||||
fake_items_db = dict()
|
||||
fake_items_db = initialize_dict(fake_items_db=fake_items_db, filename="daxsp.csv")
|
||||
|
||||
if __name__ == "__main__":
|
||||
uvicorn.run("main:app", host="0.0.0.0", port=port, reload=False)
|
||||
10
test_main.py
Normal file
10
test_main.py
Normal file
@@ -0,0 +1,10 @@
|
||||
from fastapi.testclient import TestClient
|
||||
|
||||
from main import app
|
||||
|
||||
client = TestClient(app)
|
||||
|
||||
def test_redirect():
|
||||
response = client.get("/")
|
||||
assert response.status_code == 200
|
||||
assert response.text.find("Swagger") != -1
|
||||
Reference in New Issue
Block a user