From 37cf17e4160641efd3cea8ea9e6073223c7bd939 Mon Sep 17 00:00:00 2001 From: Shahriyar Rzayev Date: Sun, 23 Oct 2022 13:03:58 +0400 Subject: [PATCH] docs: update README --- README.md | 89 +------------------------------------------------- docs/tree.png | Bin 0 -> 16033 bytes 2 files changed, 1 insertion(+), 88 deletions(-) create mode 100644 docs/tree.png diff --git a/README.md b/README.md index 6a76469..57cbdc3 100644 --- a/README.md +++ b/README.md @@ -20,94 +20,7 @@ Why Hexagonal? ## Project folder structure -```sh -src/jobboard/ -├── adapters -│   ├── db -│   │   ├── alembic.ini -│   │   ├── __init__.py -│   │   ├── migrations -│   │   │   ├── env.py -│   │   │   ├── README -│   │   │   ├── script.py.mako -│   │   │   └── versions -│   │   │   └── 7794fd8602f8_.py -│   │   ├── orm.py -│   │   ├── repository.py -│   │   ├── unit_of_work.py -│   │   └── utils.py -│   └── entrypoints -│   ├── api -│   │   ├── base.py -│   │   ├── __init__.py -│   │   ├── utils.py -│   │   └── v1 -│   │   ├── route_jobs.py -│   │   ├── route_login.py -│   │   └── route_users.py -│   ├── application.py -│   ├── __init__.py -│   ├── static -│   │   ├── images -│   │   │   ├── lite.gif -│   │   │   └── logo.png -│   │   └── js -│   │   └── autocomplete.js -│   ├── templates -│   │   ├── auth -│   │   │   └── login.html -│   │   ├── components -│   │   │   ├── alerts.html -│   │   │   ├── cards.html -│   │   │   └── navbar.html -│   │   ├── general_pages -│   │   │   └── homepage.html -│   │   ├── jobs -│   │   │   ├── create_job.html -│   │   │   ├── detail.html -│   │   │   └── show_jobs_to_delete.html -│   │   ├── shared -│   │   │   └── base.html -│   │   └── users -│   │   └── register.html -│   └── webapps -│   ├── auth -│   │   ├── forms.py -│   │   └── route_login.py -│   ├── base.py -│   ├── __init__.py -│   ├── jobs -│   │   ├── forms.py -│   │   └── route_jobs.py -│   └── users -│   ├── forms.py -│   └── route_users.py -├── domain -│   ├── model -│   │   ├── events.py -│   │   ├── __init__.py -│   │   └── model.py -│   ├── ports -│   │   ├── __init__.py -│   │   ├── job_service.py -│   │   ├── messagebus.py -│   │   ├── repository.py -│   │   ├── unit_of_work.py -│   │   └── user_service.py -│   └── schemas -│   ├── jobs.py -│   ├── tokens.py -│   └── users.py -├── __init__.py -└── configurator - ├── config.py - ├── containers.py - ├── hashing.py - └── security.py - -26 directories, 56 files -``` - +![](./docs/tree.png) ## How to install? diff --git a/docs/tree.png b/docs/tree.png new file mode 100644 index 0000000000000000000000000000000000000000..3ad2a5aa08c65702f90100f498bc32236dcfbdc5 GIT binary patch literal 16033 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 {Dz+WDHZ}M<^#nK5