Metadata-Version: 2.1
Name: pyechonext
Version: 0.5.3
Summary: EchoNext is a lightweight, fast and scalable web framework for Python
License: LGPL-2.1
Author: alexeev-prog
Author-email: alexeev.dev@mail.ru
Requires-Python: >=3.12,<4.0
Classifier: License :: OSI Approved
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.12
Requires-Dist: celery (>=5.4.0,<6.0.0)
Requires-Dist: fire (>=0.7.0,<0.8.0)
Requires-Dist: gunicorn (>=23.0.0,<24.0.0)
Requires-Dist: jinja2 (>=3.1.4,<4.0.0)
Requires-Dist: loguru (>=0.7.2,<0.8.0)
Requires-Dist: parse (>=1.20.2,<2.0.0)
Requires-Dist: pysocks (>=1.7.1,<2.0.0)
Requires-Dist: python-dotenv (>=1.0.1,<2.0.0)
Requires-Dist: rich (>=13.9.3,<14.0.0)
Requires-Dist: sqlsymphony-orm (==0.3.14)
Description-Content-Type: text/markdown

# 🌟 **EchoNext: The Future of Web** 🚀
<a id="readme-top"></a> 

<div align="center">  
  <p align="center">
	EchoNext is a lightweight, fast and scalable web framework for Python
	<br />
	<a href="https://alexeev-prog.github.io/pyEchoNext/"><strong>Explore the docs »</strong></a>
	<br />
	<br />
	<a href="#-comparison-with-alternatives">Comparison with Alternatives</a>
	.
	<a href="#-why-choose-pyechonext">Why Choose pyEchoNext</a>
	·
	<a href="#-key-features">Key Features</a>
	·
	<a href="#-getting-started">Getting Started</a>
	·
	<a href="#-usage-examples">Basic Usage</a>
	·
	<a href="#-specifications">Specification</a>
	·
	<a href="https://alexeev-prog.github.io/pyEchoNext/">Documentation</a>
	·
	<a href="https://github.com/alexeev-prog/pyEchoNext/blob/main/LICENSE">License</a>
  </p>
</div>
<br>
<p align="center">
	<img src="https://img.shields.io/github/languages/top/alexeev-prog/pyEchoNext?style=for-the-badge">
	<img src="https://img.shields.io/github/languages/count/alexeev-prog/pyEchoNext?style=for-the-badge">
	<img src="https://img.shields.io/github/license/alexeev-prog/pyEchoNext?style=for-the-badge">
	<img src="https://img.shields.io/github/stars/alexeev-prog/pyEchoNext?style=for-the-badge">
	<img src="https://img.shields.io/github/issues/alexeev-prog/pyEchoNext?style=for-the-badge">
	<img src="https://img.shields.io/github/last-commit/alexeev-prog/pyEchoNext?style=for-the-badge">
</p>

 > EchoNext is a lightweight, fast and scalable web framework for Python

Welcome to **EchoNext**, where innovation meets simplicity! Are you tired of the sluggishness of traditional web frameworks? Want a solution that keeps pace with your ambitious apps? Look no further. EchoNext is your agile companion in the world of web development!

**Imagine** a lightweight framework that empowers you to create modern web applications with lightning speed and flexibility. With EchoNext, you're not just coding; you're building a masterpiece!

 > Last stable version: 0.4.3 alpha
 > Last unstable version: 0.5.3 alpha

## 🤔 Why Choose SqlSymphony?

- **🔥 Featherweight Performance**: No bloat, just speed! Our framework is designed to optimize performance, making it a breeze to create and scale your applications without the overhead.
  
- **💼 Unmatched Scalability**: Handle thousands of connections effortlessly! Echonext is built for performance in high-demand environments, making it the perfect choice for startups or enterprise applications.

- **🔧 Customizable Architecture**: Tailor your framework to suit your unique needs. Whether it’s middleware, routing, or authentication, make it yours with minimal effort!

- **🌍 Cross-Platform Compatibility**: Echonext works beautifully on any OS. Whether you’re developing on Windows, macOS, or Linux, you’re covered!

- **💡 User-Friendly Design**: Our intuitive API and comprehensive documentation make it easy for beginners and pros alike. Dive in and start coding right away!

- **📦 Plug-and-Play Components**: Easily integrate with third-party libraries to enhance your application. Don’t reinvent the wheel—leverage existing solutions!

- **🔒 Built-in Authentication**: Simplify your user authentication process with our built-in, easy-to-implement features.

- **📊 Automatic API Documentation**: Create RESTful endpoints that are not just powerful but also well-documented, saving you time and effort.

<p align="right">(<a href="#readme-top">back to top</a>)</p>

## 🌟 Comparison with Alternatives

| Feature                   | **pyEchoNext**      | Flask        | FastAPI      | Django        | Starlette    |
|---------------------------|---------------------|--------------|--------------|---------------|--------------|
| Asynchronous Capabilities | COMING SOON         | ❌           | ✔️           | ❌            | ✔️           |
| Performance               | 🔥 High             | 🐢 Moderate  | 🚀 Very High | 🐢 Moderate   | 🚀 Very High |
| Framework Weight          | ✔️                  | ✔️           | ✔️           | ❌ Heavy      | ✔️           |
| Ecosystem                 | 🛠️ Modular          | 🎨 Flexible  | 🎨 Modular   | ⚙️ Monolithic | ⚙️ Modular   |
| Ease of Use               | ✔️                  | ✔️           | ✔️           | ❌            | ✔️           |
| Configurability           | ✔️                  | ✔️           | ✔️           | ✔️            | ✔️           |
| Documentation Quality     | 📚 Excellent        | 📚 Good      | 📚 Excellent | 📚 Very Good  | 📚 Good      |
| Flexible Deployments      | 🌍 Flexible         | 🌍 Standard  | 🌍 Standard  | 🌍 Standard   | 🌍 Flexible  |
| Testing Support           | ✔️                  | ✔️           | ✔️           | ✔️            | ✔️           |
| Community Size            | 📢 Growing          | 📢 Large     | 📢 Growing   | 📢 Large      | 📢 Emerging  |
| Built-in Template Engine  | ✔️ Jinja2 & builtin | ✔️ Jinja2    | ✔️ Jinja2    | ✔️ Django     | ✔️ Jinja2    |
| Task Queue Integration    | ❌                  | ✔️ Celery    | ✔️ Celery    | ✔️ Celery     | ✔️ Celery    |
| Static File Serving       | 🌍 Manual           | 🌍 Manual    | 🚀 Built-in  | 🚀 Built-in   | 🚀 Built-in  |
| Analytics Integration     | ✔️ Easy             | 🛠️ Manual    | ✔️ Easy      | ❌            | ✔️ Easy      |

📈 Note: Echonext excels in performance while staying lightweight, making it a top-notch choice for your next project!

## 📚 Key Features

- Intuitive API: Pythonic, object-oriented interface for interacting with routes and views.
- Performance Optimization: Lazy loading, eager loading, and other techniques for efficient web queries.
- Comprehensive Documentation: Detailed usage examples and API reference to help you get started.
- Modular Design: Clean, maintainable codebase that follows best software engineering practices.
- Extensive Test Coverage: Robust test suite to ensure the library's reliability and stability.

<p align="right">(<a href="#readme-top">back to top</a>)</p>

## 🚀 Getting Started

pyEchoNext is available on [PyPI](https://pypi.org/project/pyechonext). Simply install the package into your project environment with PIP:

```bash
pip install pyechonext
```

Once installed, you can start using the library in your Python projects. Check out the [documentation](https://alexeev-prog.github.io/pyEchoNext) for detailed usage examples and API reference.

You can create example app architecture:

```bash
python3 -m pyechonext --name exampleapp

# Generated arhitecture:
exampleapp/
├── exampleapp.py
├── templates
└── views
    ├── __init__.py
    └── main.py
```

<p align="right">(<a href="#readme-top">back to top</a>)</p>

## 💻 Usage Examples

### Advanced app with flask-like and django-like routes
Django-line classes with get-post methods and routing pages. And with the built-in template engine!

```python
import os
from pyechonext.app import ApplicationType, EchoNext
from pyechonext.views import View
from pyechonext.urls import URL, IndexView
from pyechonext.config import Settings
from pyechonext.template_engine.builtin import render_template # built-in (alpha)
# OR
from pyechonext.template_engine.jinja import render_template


class UsersView(View):
	def get(self, request, response, **kwargs):
		return render_template(
			request, "index.html", user_name="User", friends=["Bob", "Anna", "John"]
		)

	def post(self, request, response, **kwargs):
		return Response(body='post users')


url_patterns = [URL(url="/", view=IndexView), URL(url="/users", view=UsersView)]
settings = Settings(
	BASE_DIR=os.path.dirname(os.path.abspath(__file__)), TEMPLATES_DIR="templates"
)
echonext = EchoNext(
	__name__, settings, urls=url_patterns, application_type=ApplicationType.HTML
)


@echonext.route_page("/book")
class BooksResource(View):
	def get(self, request, response, **kwargs):
		return f"GET Params: {request.GET}"

	def post(self, request, response, **kwargs):
		return f"POST Params: {request.POST}"
```

<p align="right">(<a href="#readme-top">back to top</a>)</p>

### Simple app with database
In this example we are using SQLSymphony ORM (our other project, a fast and simple ORM for python)

```python
import os
from pyechonext.app import ApplicationType, EchoNext
from pyechonext.config import Settings
from sqlsymphony_orm.datatypes.fields import IntegerField, RealField, TextField
from sqlsymphony_orm.models.session_models import SessionModel
from sqlsymphony_orm.models.session_models import SQLiteSession


settings = Settings(
	BASE_DIR=os.path.dirname(os.path.abspath(__file__)), TEMPLATES_DIR="templates"
)
echonext = EchoNext(__name__, settings, application_type=ApplicationType.HTML)
session = SQLiteSession("echonext.db")


class User(SessionModel):
	__tablename__ = "Users"

	id = IntegerField(primary_key=True)
	name = TextField(null=False)
	cash = RealField(null=False, default=0.0)

	def __repr__(self):
		return f"<User {self.pk}>"


@echonext.route_page("/")
def home(request, response):
	user = User(name="John", cash=100.0)
	session.add(user)
	session.commit()
	return "Hello from the HOME page"


@echonext.route_page("/users")
def about(request, response):
	users = session.get_all_by_model(User)

	return f"Users: {[f'{user.name}: {user.cash}$' for user in users]}"

```

<p align="right">(<a href="#readme-top">back to top</a>)</p>

## 🔧 Specifications

### View
View is an abstract class, with abstract get and post methods (all descendants must create these methods).

```python
class View(ABC):
	"""
	Page view
	"""

	@abstractmethod
	def get(self, request: Request, response: Response, *args, **kwargs):
		"""
		Get

		:param		request:   The request
		:type		request:   Request
		:param		response:  The response
		:type		response:  Response
		:param		args:	   The arguments
		:type		args:	   list
		:param		kwargs:	   The keywords arguments
		:type		kwargs:	   dictionary
		"""
		raise NotImplementedError

	@abstractmethod
	def post(self, request: Request, response: Response, *args, **kwargs):
		"""
		Post

		:param		request:   The request
		:type		request:   Request
		:param		response:  The response
		:type		response:  Response
		:param		args:	   The arguments
		:type		args:	   list
		:param		kwargs:	   The keywords arguments
		:type		kwargs:	   dictionary
		"""
		raise NotImplementedError
```

Example of view:

```python
class IndexView(View):
	def get(self, request: Request, response: Response, **kwargs):
		"""
		Get

		:param		request:   The request
		:type		request:   Request
		:param		response:  The response
		:type		response:  Response
		:param		args:	   The arguments
		:type		args:	   list
		:param		kwargs:	   The keywords arguments
		:type		kwargs:	   dictionary
		"""
		return "Hello World!"

	def post(self, request: Request, response: Response, **kwargs):
		"""
		Post

		:param		request:   The request
		:type		request:   Request
		:param		response:  The response
		:type		response:  Response
		:param		args:	   The arguments
		:type		args:	   list
		:param		kwargs:	   The keywords arguments
		:type		kwargs:	   dictionary
		"""
		return "Message has accepted!"
```

Or you can return response:

```python
class IndexView(View):
	def get(self, request: Request, response: Response, **kwargs):
		"""
		Get

		:param		request:   The request
		:type		request:   Request
		:param		response:  The response
		:type		response:  Response
		:param		args:	   The arguments
		:type		args:	   list
		:param		kwargs:	   The keywords arguments
		:type		kwargs:	   dictionary
		"""
		return Response(request, body="Hello World!")

	def post(self, request: Request, response: Response, **kwargs):
		"""
		Post

		:param		request:   The request
		:type		request:   Request
		:param		response:  The response
		:type		response:  Response
		:param		args:	   The arguments
		:type		args:	   list
		:param		kwargs:	   The keywords arguments
		:type		kwargs:	   dictionary
		"""
		return Response(request, body="Message has accepted!")
```

## 💬 Support
If you encounter any issues or have questions about pyEchoNext, please:

- Check the [documentation](https://alexeev-prog.github.io/pyEchoNext) for answers
- Open an [issue on GitHub](https://github.com/alexeev-prog/pyEchoNext/issues/new)
- Reach out to the project maintainers via the [mailing list](mailto:alexeev.dev@mail.ru)

<p align="right">(<a href="#readme-top">back to top</a>)</p>

## 🤝 Contributing
We welcome contributions from the community! If you'd like to help improve pyEchoNext, please check out the [contributing guidelines](https://github.com/alexeev-prog/pyEchoNext/blob/main/CONTRIBUTING.md) to get started.

<p align="right">(<a href="#readme-top">back to top</a>)</p>

## 👥 Join the Community!
If you find Echonext valuable and want to support the project:

- Star on GitHub ⭐
- Share it with friends and colleagues!
- Donate via cryptocurrency 🙌

Connect with fellow Echonext users: [Join our Telegram Chat](https://t.me/pyEchoNext_Forum)

## 🔮 Roadmap
Our future goals for pyEchoNext include:

- 📚 Improve middlewares
- 🚀 Add async support

- ✅ Improve logging
- 🌍 Improve auth
- 🌐 More stability and scalablity

<p align="right">(<a href="#readme-top">back to top</a>)</p>

## 🌟 Get Started Today!
Unlock your potential as a developer with Echonext. Don’t just build applications—craft experiences that resonate with your users! The possibilities are limitless when you harness the power of Echonext. 

**Happy Coding!** 💻✨

This README is designed to grab attention from the very first lines. It emphasizes the framework's strengths and makes a compelling case for why developers should choose Echonext for their projects. Feel free to adjust any specific links or images to fit your project!

## Documentation 🌍
Extended documentation and framework specifications are available at the following links:

### English

1. [Index](./docs/en/index.md)
2. [Web framework design](./docs/en/webframework_design.md)
3. [Creating a web application](./docs/en/webapp_creation.md)
4. [Creating routes (routes&views)](./docs/en/routes_and_views.md)
5. [Request/Response](./docs/en/requests_responses.md)

### Russian / Русский

1. [Содержание](./docs/ru/index.md)
2. [Устройство веб-фреймворка](./docs/ru/webframework_design.md)
3. [Создание веб-приложения](./docs/ru/webapp_creation.md)
4. [Создание маршрутов (routes&views)](./docs/ru/routes_and_views.md)
5. [Request/Response](./docs/ru/requests_responses.md)

## License
Distributed under the GNU LGPL 2.1 License. See [LICENSE](https://github.com/alexeev-prog/pyEchoNext/blob/main/LICENSE) for more information.

<p align="right">(<a href="#readme-top">back to top</a>)</p>

---

EchoNext is a lightweight, fast and scalable web framework for Python
Copyright (C) 2024  Alexeev Bronislav (C) 2024

This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301
USA

