neuroglia-python 0.0.23__tar.gz → 0.1.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. neuroglia_python-0.1.1/PKG-INFO +49 -0
  2. neuroglia_python-0.1.1/README.md +19 -0
  3. {neuroglia_python-0.0.23 → neuroglia_python-0.1.1}/pyproject.toml +3 -1
  4. {neuroglia_python-0.0.23 → neuroglia_python-0.1.1}/src/neuroglia/data/infrastructure/event_sourcing/abstractions.py +21 -1
  5. {neuroglia_python-0.0.23 → neuroglia_python-0.1.1}/src/neuroglia/data/infrastructure/event_sourcing/event_store/event_store.py +9 -2
  6. {neuroglia_python-0.0.23 → neuroglia_python-0.1.1}/src/neuroglia/data/infrastructure/event_sourcing/read_model_reconciliator.py +2 -2
  7. {neuroglia_python-0.0.23 → neuroglia_python-0.1.1}/src/neuroglia/eventing/cloud_events/cloud_event.py +27 -4
  8. neuroglia_python-0.0.23/PKG-INFO +0 -127
  9. neuroglia_python-0.0.23/README.md +0 -98
  10. {neuroglia_python-0.0.23 → neuroglia_python-0.1.1}/LICENSE +0 -0
  11. {neuroglia_python-0.0.23 → neuroglia_python-0.1.1}/src/neuroglia/__init__.py +0 -0
  12. {neuroglia_python-0.0.23 → neuroglia_python-0.1.1}/src/neuroglia/core/__init__.py +0 -0
  13. {neuroglia_python-0.0.23 → neuroglia_python-0.1.1}/src/neuroglia/core/module_loader.py +0 -0
  14. {neuroglia_python-0.0.23 → neuroglia_python-0.1.1}/src/neuroglia/core/operation_result.py +0 -0
  15. {neuroglia_python-0.0.23 → neuroglia_python-0.1.1}/src/neuroglia/core/problem_details.py +0 -0
  16. {neuroglia_python-0.0.23 → neuroglia_python-0.1.1}/src/neuroglia/core/type_extensions.py +0 -0
  17. {neuroglia_python-0.0.23 → neuroglia_python-0.1.1}/src/neuroglia/core/type_finder.py +0 -0
  18. {neuroglia_python-0.0.23 → neuroglia_python-0.1.1}/src/neuroglia/data/__init__.py +0 -0
  19. {neuroglia_python-0.0.23 → neuroglia_python-0.1.1}/src/neuroglia/data/abstractions.py +0 -0
  20. {neuroglia_python-0.0.23 → neuroglia_python-0.1.1}/src/neuroglia/data/infrastructure/__init__.py +0 -0
  21. {neuroglia_python-0.0.23 → neuroglia_python-0.1.1}/src/neuroglia/data/infrastructure/abstractions.py +0 -0
  22. {neuroglia_python-0.0.23 → neuroglia_python-0.1.1}/src/neuroglia/data/infrastructure/event_sourcing/__init__.py +0 -0
  23. {neuroglia_python-0.0.23 → neuroglia_python-0.1.1}/src/neuroglia/data/infrastructure/event_sourcing/event_sourcing_repository.py +0 -0
  24. {neuroglia_python-0.0.23 → neuroglia_python-0.1.1}/src/neuroglia/data/infrastructure/event_sourcing/event_store/__init__.py +0 -0
  25. {neuroglia_python-0.0.23 → neuroglia_python-0.1.1}/src/neuroglia/data/infrastructure/memory/__init__.py +0 -0
  26. {neuroglia_python-0.0.23 → neuroglia_python-0.1.1}/src/neuroglia/data/infrastructure/memory/memory_repository.py +0 -0
  27. {neuroglia_python-0.0.23 → neuroglia_python-0.1.1}/src/neuroglia/data/infrastructure/mongo/__init__.py +0 -0
  28. {neuroglia_python-0.0.23 → neuroglia_python-0.1.1}/src/neuroglia/data/infrastructure/mongo/mongo_repository.py +0 -0
  29. {neuroglia_python-0.0.23 → neuroglia_python-0.1.1}/src/neuroglia/data/queries/generic/__init__.py +0 -0
  30. {neuroglia_python-0.0.23 → neuroglia_python-0.1.1}/src/neuroglia/data/queries/generic/get_by_id_query.py +0 -0
  31. {neuroglia_python-0.0.23 → neuroglia_python-0.1.1}/src/neuroglia/data/queries/generic/list_query.py +0 -0
  32. {neuroglia_python-0.0.23 → neuroglia_python-0.1.1}/src/neuroglia/data/queryable.py +0 -0
  33. {neuroglia_python-0.0.23 → neuroglia_python-0.1.1}/src/neuroglia/dependency_injection/__init__.py +0 -0
  34. {neuroglia_python-0.0.23 → neuroglia_python-0.1.1}/src/neuroglia/dependency_injection/service_provider.py +0 -0
  35. {neuroglia_python-0.0.23 → neuroglia_python-0.1.1}/src/neuroglia/eventing/cloud_events/__init__.py +0 -0
  36. {neuroglia_python-0.0.23 → neuroglia_python-0.1.1}/src/neuroglia/eventing/cloud_events/decorators.py +0 -0
  37. {neuroglia_python-0.0.23 → neuroglia_python-0.1.1}/src/neuroglia/eventing/cloud_events/infrastructure/__init__.py +0 -0
  38. {neuroglia_python-0.0.23 → neuroglia_python-0.1.1}/src/neuroglia/eventing/cloud_events/infrastructure/cloud_event_bus.py +0 -0
  39. {neuroglia_python-0.0.23 → neuroglia_python-0.1.1}/src/neuroglia/eventing/cloud_events/infrastructure/cloud_event_ingestor.py +0 -0
  40. {neuroglia_python-0.0.23 → neuroglia_python-0.1.1}/src/neuroglia/eventing/cloud_events/infrastructure/cloud_event_middleware.py +0 -0
  41. {neuroglia_python-0.0.23 → neuroglia_python-0.1.1}/src/neuroglia/eventing/cloud_events/infrastructure/cloud_event_publisher.py +0 -0
  42. {neuroglia_python-0.0.23 → neuroglia_python-0.1.1}/src/neuroglia/expressions/__init__.py +0 -0
  43. {neuroglia_python-0.0.23 → neuroglia_python-0.1.1}/src/neuroglia/expressions/javascript_expression_translator.py +0 -0
  44. {neuroglia_python-0.0.23 → neuroglia_python-0.1.1}/src/neuroglia/hosting/__init__.py +0 -0
  45. {neuroglia_python-0.0.23 → neuroglia_python-0.1.1}/src/neuroglia/hosting/abstractions.py +0 -0
  46. {neuroglia_python-0.0.23 → neuroglia_python-0.1.1}/src/neuroglia/hosting/configuration/data_access_layer.py +0 -0
  47. {neuroglia_python-0.0.23 → neuroglia_python-0.1.1}/src/neuroglia/hosting/web.py +0 -0
  48. {neuroglia_python-0.0.23 → neuroglia_python-0.1.1}/src/neuroglia/integration/__init__.py +0 -0
  49. {neuroglia_python-0.0.23 → neuroglia_python-0.1.1}/src/neuroglia/integration/models.py +0 -0
  50. {neuroglia_python-0.0.23 → neuroglia_python-0.1.1}/src/neuroglia/mapping/__init__.py +0 -0
  51. {neuroglia_python-0.0.23 → neuroglia_python-0.1.1}/src/neuroglia/mapping/mapper.py +0 -0
  52. {neuroglia_python-0.0.23 → neuroglia_python-0.1.1}/src/neuroglia/mediation/__init__.py +0 -0
  53. {neuroglia_python-0.0.23 → neuroglia_python-0.1.1}/src/neuroglia/mediation/mediator.py +0 -0
  54. {neuroglia_python-0.0.23 → neuroglia_python-0.1.1}/src/neuroglia/mvc/__init__.py +0 -0
  55. {neuroglia_python-0.0.23 → neuroglia_python-0.1.1}/src/neuroglia/mvc/controller_base.py +0 -0
  56. {neuroglia_python-0.0.23 → neuroglia_python-0.1.1}/src/neuroglia/reactive/__init__.py +0 -0
  57. {neuroglia_python-0.0.23 → neuroglia_python-0.1.1}/src/neuroglia/reactive/rx_async.py +0 -0
  58. {neuroglia_python-0.0.23 → neuroglia_python-0.1.1}/src/neuroglia/serialization/__init__.py +0 -0
  59. {neuroglia_python-0.0.23 → neuroglia_python-0.1.1}/src/neuroglia/serialization/abstractions.py +0 -0
  60. {neuroglia_python-0.0.23 → neuroglia_python-0.1.1}/src/neuroglia/serialization/json.py +0 -0
@@ -0,0 +1,49 @@
1
+ Metadata-Version: 2.1
2
+ Name: neuroglia-python
3
+ Version: 0.1.1
4
+ Summary: Port from .NET to Python of the Neuroglia Framework
5
+ License: Apache
6
+ Author: Charles d'Avernas
7
+ Author-email: charles.davernas@neuroglia.io
8
+ Requires-Python: >=3.12,<4.0
9
+ Classifier: License :: Other/Proprietary License
10
+ Classifier: Programming Language :: Python :: 3
11
+ Classifier: Programming Language :: Python :: 3.12
12
+ Requires-Dist: annotated-types (>=0.6.0,<0.7.0)
13
+ Requires-Dist: classy-fastapi (>=0.6.1,<0.7.0)
14
+ Requires-Dist: esdbclient (>=1.0.17,<2.0.0)
15
+ Requires-Dist: fastapi (>=0.109.2,<0.110.0)
16
+ Requires-Dist: grpcio (>=1.60.1,<2.0.0)
17
+ Requires-Dist: httpx (>=0.26.0,<0.27.0)
18
+ Requires-Dist: mkdocs (>=1.6.1,<2.0.0)
19
+ Requires-Dist: mkdocs-material (>=9.5.46,<10.0.0)
20
+ Requires-Dist: multipledispatch (>=1.0.0,<2.0.0)
21
+ Requires-Dist: pydantic-settings (>=2.2.0,<3.0.0)
22
+ Requires-Dist: pymongo (>=4.6.1,<5.0.0)
23
+ Requires-Dist: pytest (>=8.1.1,<9.0.0)
24
+ Requires-Dist: python-dotenv (>=1.0.1,<2.0.0)
25
+ Requires-Dist: rx (>=3.2.0,<4.0.0)
26
+ Requires-Dist: typing-extensions (>=4.9.0,<5.0.0)
27
+ Requires-Dist: uvicorn (>=0.27.1,<0.28.0)
28
+ Description-Content-Type: text/markdown
29
+
30
+ # Neuroglia Python Framework
31
+
32
+ A framework of libraries used to build modern Python V3 applications
33
+
34
+ ## Disclaimer
35
+
36
+ This project was the opportunity for me (cdavernas) to learn Python while porting some of the concepts and services of the .NET version of the Neuroglia Framework
37
+
38
+ ## Packaging
39
+
40
+ ```sh
41
+ # Set the version tag in pyproject.toml
42
+ # Commit changes
43
+
44
+ poetry build
45
+
46
+ poetry publish --repository gitlab -u <token-username> -p <token-password>
47
+
48
+ ```
49
+
@@ -0,0 +1,19 @@
1
+ # Neuroglia Python Framework
2
+
3
+ A framework of libraries used to build modern Python V3 applications
4
+
5
+ ## Disclaimer
6
+
7
+ This project was the opportunity for me (cdavernas) to learn Python while porting some of the concepts and services of the .NET version of the Neuroglia Framework
8
+
9
+ ## Packaging
10
+
11
+ ```sh
12
+ # Set the version tag in pyproject.toml
13
+ # Commit changes
14
+
15
+ poetry build
16
+
17
+ poetry publish --repository gitlab -u <token-username> -p <token-password>
18
+
19
+ ```
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "neuroglia-python"
3
- version = "0.0.23"
3
+ version = "0.1.1"
4
4
  description = "Port from .NET to Python of the Neuroglia Framework"
5
5
  authors = ["Charles d'Avernas <charles.davernas@neuroglia.io>"]
6
6
  license = "Apache"
@@ -25,6 +25,8 @@ rx = "^3.2.0"
25
25
  uvicorn = "^0.27.1"
26
26
  typing-extensions = "^4.9.0"
27
27
  pytest = "^8.1.1"
28
+ mkdocs = "^1.6.1"
29
+ mkdocs-material = "^9.5.46"
28
30
 
29
31
  [tool.poetry.group.dev.dependencies]
30
32
  pytest = "^8.0.1"
@@ -2,7 +2,7 @@ from abc import ABC, abstractmethod
2
2
  from dataclasses import dataclass
3
3
  from datetime import datetime
4
4
  from enum import Enum
5
- from typing import Any, List, Optional, Type
5
+ from typing import Any, Callable, List, Optional, Type
6
6
  from neuroglia.data.abstractions import AggregateRoot
7
7
 
8
8
 
@@ -69,6 +69,23 @@ class EventRecord:
69
69
  ''' Gets a boolean indicating whether or not the recorded event is being replayed to its consumer/consumer group '''
70
70
 
71
71
 
72
+ @dataclass
73
+ class AckableEventRecord(EventRecord):
74
+ ''' Represents an ackable recorded event '''
75
+
76
+ _ack_delegate : Callable = None
77
+
78
+ _nack_delegate : Callable= None
79
+
80
+ async def ack_async(self) -> None:
81
+ ''' Acks the event record '''
82
+ self._ack_delegate()
83
+
84
+ async def nack_async(self) -> None:
85
+ ''' Nacks the event record'''
86
+ self._nack_delegate()
87
+
88
+
72
89
  class StreamReadDirection(Enum):
73
90
  ''' Enumerates all directions in which a event sourcing stream can be read '''
74
91
  FORWARDS = 0,
@@ -82,6 +99,9 @@ class EventStoreOptions:
82
99
 
83
100
  database_name: str
84
101
  ''' Gets/sets the name of the database to use, if any '''
102
+
103
+ consumer_group: str
104
+ ''' Gets/sets the name of the consumer group to use, if any '''
85
105
 
86
106
 
87
107
  class EventStore(ABC):
@@ -3,10 +3,11 @@ import logging
3
3
  import sys
4
4
  import threading
5
5
  from typing import Dict, List, Optional
6
+ from esdbclient.persistent import PersistentSubscription
6
7
  import rx
7
8
  from rx.disposable.disposable import Disposable
8
9
  from neuroglia.data.abstractions import DomainEvent
9
- from neuroglia.data.infrastructure.event_sourcing.abstractions import Aggregator, EventDescriptor, EventRecord, EventStore, EventStoreOptions, StreamDescriptor, StreamReadDirection
10
+ from neuroglia.data.infrastructure.event_sourcing.abstractions import AckableEventRecord, Aggregator, EventDescriptor, EventRecord, EventStore, EventStoreOptions, StreamDescriptor, StreamReadDirection
10
11
  from neuroglia.hosting.abstractions import ApplicationBuilderBase
11
12
  from neuroglia.serialization.json import JsonSerializer
12
13
  from esdbclient import EventStoreDBClient, NewEvent, StreamState, RecordedEvent
@@ -98,8 +99,14 @@ class ESEventStore(EventStore):
98
99
  else:
99
100
  try:
100
101
  self._eventstore_client.create_subscription_to_stream(stream_name=stream_name, resolve_links=True) # todo: persistence
102
+ # self._eventstore_client.create_subscription_to_stream(group_name = consumer_group, stream_name = stream_name, resolve_links = True, consumer_strategy = 'RoundRobin', min_checkpoint_count=1, max_checkpoint_count=1)
101
103
  except AlreadyExists:
102
104
  pass
105
+ # subscription = self._eventstore_client.read_subscription_to_stream(group_name = consumer_group, stream_name = stream_name)
106
+
107
+ try : self._eventstore_client.create_subscription_to_stream(group_name = consumer_group, stream_name = stream_name, resolve_links = True, consumer_strategy = 'RoundRobin', min_checkpoint_count=1, max_checkpoint_count=1)
108
+ except AlreadyExists: pass
109
+
103
110
  subject = Subject()
104
111
  thread = threading.Thread(target=self._consume_events_async, kwargs={'stream_id': stream_id, 'subject': subject, 'subscription': subscription})
105
112
  thread.start()
@@ -144,7 +151,7 @@ class ESEventStore(EventStore):
144
151
  e: RecordedEvent
145
152
  for e in subscription:
146
153
  try:
147
- decoded_event = self._decode_recorded_event(stream_id, e)
154
+ decoded_event = self._decode_recorded_event(stream_id, e, subscription)
148
155
  except Exception as ex:
149
156
  logging.error(f"An exception occured while decoding event with offset '{e.stream_position}' from stream '{e.stream_name}': {ex}")
150
157
  raise
@@ -2,7 +2,7 @@ import asyncio
2
2
  from dataclasses import dataclass
3
3
  import logging
4
4
  from rx.core.typing import Disposable
5
- from neuroglia.data.infrastructure.event_sourcing.abstractions import EventRecord, EventStore, EventStoreOptions
5
+ from neuroglia.data.infrastructure.event_sourcing.abstractions import AckableEventRecord, EventRecord, EventStore, EventStoreOptions
6
6
  from neuroglia.dependency_injection.service_provider import ServiceProviderBase
7
7
  from neuroglia.hosting.abstractions import HostedService
8
8
  from neuroglia.mediation.mediator import Mediator
@@ -46,7 +46,7 @@ class ReadModelReconciliator(HostedService):
46
46
  self._subscription.dispose()
47
47
 
48
48
  async def subscribe_async(self):
49
- observable = await self._event_store.observe_async(f'$ce-{self._event_store_options.database_name}')
49
+ observable = await self._event_store.observe_async(f'$ce-{self._event_store_options.database_name}', self._event_store_options.consumer_group)
50
50
  self._subscription = AsyncRx.subscribe(observable, lambda e: asyncio.run(self.on_event_record_stream_next_async(e)))
51
51
 
52
52
  async def on_event_record_stream_next_async(self, e: EventRecord):
@@ -1,6 +1,6 @@
1
- from dataclasses import dataclass
1
+ from dataclasses import dataclass, field
2
2
  from datetime import datetime
3
- from typing import Any, Optional
3
+ from typing import Any, Dict, Optional
4
4
 
5
5
 
6
6
  class CloudEventSpecVersion:
@@ -26,7 +26,7 @@ class CloudEvent:
26
26
  dataschema (Optional[str]): An URI that references the versioned schema of the event's data.
27
27
  data (Optional[Any]): The event's data, if any. Only used if the event has been formatted using the structured mode.
28
28
  data_base64 (Optional[str]): The event's binary data, encoded in base 64. Used if the event has been formatted using the binary mode.
29
- extensionAttributes (Optional[Dict[str, Any]]): A mapping containing the event's extension attributes.
29
+ **extensions: Keyword arguments representing extension attributes.
30
30
  '''
31
31
 
32
32
  id: str
@@ -65,8 +65,31 @@ class CloudEvent:
65
65
  data_base64: Optional[str] = None
66
66
  ''' Gets/sets the event's binary data, encoded in base 64. Used if the event has been formatted using the binary mode. '''
67
67
 
68
+ extensions: Dict[str, Any] = field(default_factory=dict) # Store extensions in a dict
69
+ ''' Gets/sets a mapping containing the event's extension attributes. '''
70
+
71
+ def __post_init__(self, *args, **kwargs):
72
+ # Capture any additional keyword arguments as extension attributes
73
+ for key, value in kwargs.items():
74
+ # only add them if they are not already defined fields
75
+ if key not in self.__dataclass_fields__:
76
+ self.extensions[key] = value
77
+
78
+ def __getattr__(self, name):
79
+ # Allow access to extensions as attributes
80
+ if name in self.extensions:
81
+ return self.extensions[name]
82
+ raise AttributeError(f"'{self.__class__.__name__}' object has no attribute '{name}'")
83
+
84
+ def __setattr__(self, name, value):
85
+ # Allow setting of extensions as attributes if it is an extension or not a predefined field.
86
+ if name in self.extensions or name not in self.__dataclass_fields__:
87
+ self.extensions[name] = value
88
+ else:
89
+ super().__setattr__(name, value) # Use default setting for standard attributes
90
+
68
91
  def get_attribute(self, name: str) -> Optional[Any]:
69
92
  ''' Gets the value of the attribute with the specified name, if any '''
70
93
  if not name:
71
94
  raise ValueError("Attribute name cannot be empty or None.")
72
- self.__dict__[name] if name in self.__dict__.keys() else None
95
+ return getattr(self, name, None) # Use getattr to check both standard and extension attributes
@@ -1,127 +0,0 @@
1
- Metadata-Version: 2.1
2
- Name: neuroglia-python
3
- Version: 0.0.23
4
- Summary: Port from .NET to Python of the Neuroglia Framework
5
- License: Apache
6
- Author: Charles d'Avernas
7
- Author-email: charles.davernas@neuroglia.io
8
- Requires-Python: >=3.12,<4.0
9
- Classifier: License :: Other/Proprietary License
10
- Classifier: Programming Language :: Python :: 3
11
- Classifier: Programming Language :: Python :: 3.12
12
- Classifier: Programming Language :: Python :: 3.13
13
- Requires-Dist: annotated-types (>=0.6.0,<0.7.0)
14
- Requires-Dist: classy-fastapi (>=0.6.1,<0.7.0)
15
- Requires-Dist: esdbclient (>=1.0.17,<2.0.0)
16
- Requires-Dist: fastapi (>=0.109.2,<0.110.0)
17
- Requires-Dist: grpcio (>=1.60.1,<2.0.0)
18
- Requires-Dist: httpx (>=0.26.0,<0.27.0)
19
- Requires-Dist: multipledispatch (>=1.0.0,<2.0.0)
20
- Requires-Dist: pydantic-settings (>=2.2.0,<3.0.0)
21
- Requires-Dist: pymongo (>=4.6.1,<5.0.0)
22
- Requires-Dist: pytest (>=8.1.1,<9.0.0)
23
- Requires-Dist: python-dotenv (>=1.0.1,<2.0.0)
24
- Requires-Dist: rx (>=3.2.0,<4.0.0)
25
- Requires-Dist: typing-extensions (>=4.9.0,<5.0.0)
26
- Requires-Dist: uvicorn (>=0.27.1,<0.28.0)
27
- Description-Content-Type: text/markdown
28
-
29
- # Neuroglia Python Framework
30
-
31
- A framework of libraries used to build modern Python V3 applications
32
-
33
- ## Disclaimer
34
-
35
- This project was the opportunity for me (cdavernas) to learn Python while porting some of the concepts and services of the .NET version of the Neuroglia Framework
36
-
37
- ## Packaging
38
-
39
- ```sh
40
- # Set the version tag in pyproject.toml
41
- # Commit changes
42
-
43
- poetry build
44
-
45
- poetry publish --repository gitlab -u <token-username> -p <token-password>
46
-
47
- ```
48
-
49
- ---
50
-
51
- _DRAFT_
52
-
53
- ## Developer Guide Structure
54
-
55
- ### Introduction
56
-
57
- Briefly describe your framework, its purpose, and its target audience.
58
- Highlight key features and benefits.
59
-
60
- #### Installation:
61
-
62
- Provide clear and step-by-step instructions on how to install your framework, including:
63
- Prerequisites (e.g., Python version, dependencies)
64
- Installation methods (e.g., pip install <framework_name>, source code compilation)
65
- Virtual environment recommendations (for isolation and dependency management)
66
-
67
- #### Getting Started:
68
-
69
- Offer a simple "Hello, World!" or similar example to demonstrate basic usage and familiarize users with your framework's syntax and structure.
70
- Include code snippets and explanations where necessary.
71
-
72
- #### Core Concepts:
73
-
74
- Dedicate this section to in-depth explanations of the fundamental building blocks and functionalities of your framework. This might include:
75
- Key objects and classes within the framework
76
- Data structures and design patterns employed
77
- Architectural overview (e.g., MVC, MVVM) if applicable
78
-
79
- #### Tutorials and Examples:
80
-
81
- Provide a collection of well-structured, step-by-step tutorials that showcase how to accomplish common tasks using your framework.
82
- Consider varying the difficulty levels (beginner, intermediate, advanced) to cater to a wide range of users.
83
- Include code examples, explanations, and screenshots as needed.
84
-
85
- #### API Reference:
86
-
87
- Create a comprehensive reference for all available classes, functions, and modules within your framework.
88
- Use a consistent format that includes the following information for each API element:
89
- Name
90
- Description
91
- Arguments (with data types and descriptions)
92
- Return values (with data types and descriptions)
93
- Usage examples
94
-
95
- #### Testing and Debugging:
96
-
97
- Explain how to effectively test code written using your framework.
98
- Recommend testing frameworks and tools.
99
- Provide practical guidance on common debugging techniques and strategies.
100
-
101
- #### Contributing:
102
-
103
- Outline how developers can contribute to your framework's development.
104
- Include information on:
105
- Issue tracking system (e.g., GitHub issues)
106
- Pull request guidelines
107
- Coding style and conventions
108
- Testing requirements
109
-
110
- #### Community and Support:
111
-
112
- Specify available resources for users to seek help and engage with the community. This could include:
113
- Official channels (e.g., discussion forums, mailing lists)
114
- Third-party resources (e.g., Stack Overflow tags, community blogs)
115
-
116
- #### License:
117
-
118
- Clearly state the license under which your framework is distributed.
119
-
120
- #### Additional Tips:
121
-
122
- Maintain a clear and concise writing style, using easy-to-understand language.
123
- Ensure proper formatting and structure for readability.
124
- Provide code snippets in a visually appealing format, using code blocks and syntax highlighting.
125
- Consider adding screenshots or diagrams to illustrate complex concepts.
126
- Regularly update the guide with new features, bug fixes, and best practices.
127
-
@@ -1,98 +0,0 @@
1
- # Neuroglia Python Framework
2
-
3
- A framework of libraries used to build modern Python V3 applications
4
-
5
- ## Disclaimer
6
-
7
- This project was the opportunity for me (cdavernas) to learn Python while porting some of the concepts and services of the .NET version of the Neuroglia Framework
8
-
9
- ## Packaging
10
-
11
- ```sh
12
- # Set the version tag in pyproject.toml
13
- # Commit changes
14
-
15
- poetry build
16
-
17
- poetry publish --repository gitlab -u <token-username> -p <token-password>
18
-
19
- ```
20
-
21
- ---
22
-
23
- _DRAFT_
24
-
25
- ## Developer Guide Structure
26
-
27
- ### Introduction
28
-
29
- Briefly describe your framework, its purpose, and its target audience.
30
- Highlight key features and benefits.
31
-
32
- #### Installation:
33
-
34
- Provide clear and step-by-step instructions on how to install your framework, including:
35
- Prerequisites (e.g., Python version, dependencies)
36
- Installation methods (e.g., pip install <framework_name>, source code compilation)
37
- Virtual environment recommendations (for isolation and dependency management)
38
-
39
- #### Getting Started:
40
-
41
- Offer a simple "Hello, World!" or similar example to demonstrate basic usage and familiarize users with your framework's syntax and structure.
42
- Include code snippets and explanations where necessary.
43
-
44
- #### Core Concepts:
45
-
46
- Dedicate this section to in-depth explanations of the fundamental building blocks and functionalities of your framework. This might include:
47
- Key objects and classes within the framework
48
- Data structures and design patterns employed
49
- Architectural overview (e.g., MVC, MVVM) if applicable
50
-
51
- #### Tutorials and Examples:
52
-
53
- Provide a collection of well-structured, step-by-step tutorials that showcase how to accomplish common tasks using your framework.
54
- Consider varying the difficulty levels (beginner, intermediate, advanced) to cater to a wide range of users.
55
- Include code examples, explanations, and screenshots as needed.
56
-
57
- #### API Reference:
58
-
59
- Create a comprehensive reference for all available classes, functions, and modules within your framework.
60
- Use a consistent format that includes the following information for each API element:
61
- Name
62
- Description
63
- Arguments (with data types and descriptions)
64
- Return values (with data types and descriptions)
65
- Usage examples
66
-
67
- #### Testing and Debugging:
68
-
69
- Explain how to effectively test code written using your framework.
70
- Recommend testing frameworks and tools.
71
- Provide practical guidance on common debugging techniques and strategies.
72
-
73
- #### Contributing:
74
-
75
- Outline how developers can contribute to your framework's development.
76
- Include information on:
77
- Issue tracking system (e.g., GitHub issues)
78
- Pull request guidelines
79
- Coding style and conventions
80
- Testing requirements
81
-
82
- #### Community and Support:
83
-
84
- Specify available resources for users to seek help and engage with the community. This could include:
85
- Official channels (e.g., discussion forums, mailing lists)
86
- Third-party resources (e.g., Stack Overflow tags, community blogs)
87
-
88
- #### License:
89
-
90
- Clearly state the license under which your framework is distributed.
91
-
92
- #### Additional Tips:
93
-
94
- Maintain a clear and concise writing style, using easy-to-understand language.
95
- Ensure proper formatting and structure for readability.
96
- Provide code snippets in a visually appealing format, using code blocks and syntax highlighting.
97
- Consider adding screenshots or diagrams to illustrate complex concepts.
98
- Regularly update the guide with new features, bug fixes, and best practices.