abstract-block-dumper 0.0.1__py3-none-any.whl → 0.0.2__py3-none-any.whl

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.
@@ -6,8 +6,8 @@ from django.db import transaction
6
6
  from django.db.models.query import QuerySet
7
7
  from django.utils import timezone
8
8
 
9
+ import abstract_block_dumper._internal.services.utils as abd_utils
9
10
  import abstract_block_dumper.models as abd_models
10
- import abstract_block_dumper.services.utils as abd_utils
11
11
 
12
12
 
13
13
  def get_ready_to_retry_attempts() -> QuerySet[abd_models.TaskAttempt]:
@@ -76,7 +76,7 @@ def task_mark_as_success(task: abd_models.TaskAttempt, result_data: dict) -> Non
76
76
  task.save()
77
77
 
78
78
 
79
- def task_mark_as_failed(task) -> None:
79
+ def task_mark_as_failed(task: abd_models.TaskAttempt) -> None:
80
80
  DEFAULT_BLOCK_TASK_RETRY_BACKOFF = 1
81
81
  MAX_RETRY_DELAY_MINUTES = 1440 # 24 hours max delay
82
82
 
@@ -98,7 +98,7 @@ def task_mark_as_failed(task) -> None:
98
98
  task.save()
99
99
 
100
100
 
101
- def task_schedule_to_retry(task):
101
+ def task_schedule_to_retry(task: abd_models.TaskAttempt) -> None:
102
102
  task.status = abd_models.TaskAttempt.Status.PENDING
103
103
  task.save()
104
104
 
@@ -110,6 +110,7 @@ def task_create_or_get_pending(
110
110
  ) -> tuple[abd_models.TaskAttempt, bool]:
111
111
  """
112
112
  Create or get a pending task attempt.
113
+
113
114
  Returns (task, created) where created indicates if a new task was created.
114
115
 
115
116
  For failed tasks that can retry:
@@ -6,7 +6,7 @@ from typing import Any
6
6
  import structlog
7
7
  from celery import Task
8
8
 
9
- from abstract_block_dumper.exceptions import ConditionEvaluationError
9
+ from abstract_block_dumper._internal.exceptions import ConditionEvaluationError
10
10
 
11
11
  logger = structlog.getLogger(__name__)
12
12
 
@@ -19,10 +19,8 @@ class RegistryItem:
19
19
  backfilling_lookback: int | None = None
20
20
  celery_kwargs: dict[str, Any] = field(default_factory=dict)
21
21
 
22
- def match_condition(self, block_number: int, **kwargs) -> bool:
23
- """
24
- Check if condition matches for given block and arguments
25
- """
22
+ def match_condition(self, block_number: int, **kwargs: dict[str, Any]) -> bool:
23
+ """Check if condition matches for given block and arguments."""
26
24
  try:
27
25
  return self.condition(block_number, **kwargs)
28
26
  except Exception as e:
@@ -35,25 +33,19 @@ class RegistryItem:
35
33
  raise ConditionEvaluationError(f"Failed to evaluate condition: {e}") from e
36
34
 
37
35
  def get_execution_args(self) -> list[dict[str, Any]]:
38
- """
39
- Get list of argument sets for execution
40
- """
36
+ """Get list of argument sets for execution."""
41
37
  return self.args or [{}]
42
38
 
43
39
  @property
44
40
  def executable_path(self) -> str:
45
- """
46
- Get the importable path to the function.
47
- """
41
+ """Get the importable path to the function."""
48
42
  if hasattr(self.function, "name") and self.function.name is not None:
49
43
  return self.function.name
50
44
 
51
45
  return ".".join([self.function.__module__, self.function.__name__])
52
46
 
53
47
  def requires_backfilling(self) -> bool:
54
- """
55
- Check if this item requires backfilling.
56
- """
48
+ """Check if this item requires backfilling."""
57
49
  return self.backfilling_lookback is not None
58
50
 
59
51
 
@@ -11,7 +11,7 @@ def ensure_modules_loaded() -> None:
11
11
 
12
12
  @block_task must be loaded, otherwise it won't be registered.
13
13
  """
14
- from django.apps import apps
14
+ from django.apps import apps # noqa: PLC0415
15
15
 
16
16
  for app_config in apps.get_app_configs():
17
17
  for module_suffix in ["tasks", "block_tasks"]:
@@ -10,7 +10,7 @@ class ConditionEvaluationError(AbstractBlockDumperError):
10
10
  pass
11
11
 
12
12
 
13
- class CeleryTaskLocked(Exception):
13
+ class CeleryTaskLockedError(AbstractBlockDumperError):
14
14
  """Celery task execution is locked"""
15
15
 
16
16
  pass
File without changes
@@ -1,12 +1,12 @@
1
1
  import structlog
2
2
  from django.db import transaction
3
3
 
4
- import abstract_block_dumper.dal.django_dal as abd_dal
5
- from abstract_block_dumper.dal.memory_registry import BaseRegistry, RegistryItem, task_registry
6
- from abstract_block_dumper.exceptions import ConditionEvaluationError
4
+ import abstract_block_dumper._internal.dal.django_dal as abd_dal
5
+ from abstract_block_dumper._internal.dal.memory_registry import BaseRegistry, RegistryItem, task_registry
6
+ from abstract_block_dumper._internal.exceptions import ConditionEvaluationError
7
+ from abstract_block_dumper._internal.services.executor import CeleryExecutor
8
+ from abstract_block_dumper._internal.services.utils import serialize_args
7
9
  from abstract_block_dumper.models import TaskAttempt
8
- from abstract_block_dumper.services.executor import CeleryExecutor
9
- from abstract_block_dumper.services.utils import serialize_args
10
10
 
11
11
  logger = structlog.get_logger(__name__)
12
12
 
@@ -170,6 +170,7 @@ class BlockProcessor:
170
170
  def _cleanup_phantom_tasks(self) -> None:
171
171
  """
172
172
  Clean up tasks marked as SUCCESS but never actually started.
173
+
173
174
  Only removes tasks that were created recently (within last hour) to avoid
174
175
  deleting legitimate tasks marked as success by external processes.
175
176
  """
@@ -2,8 +2,8 @@ from typing import Any
2
2
 
3
3
  import structlog
4
4
 
5
- import abstract_block_dumper.dal.django_dal as abd_dal
6
- from abstract_block_dumper.dal.memory_registry import RegistryItem
5
+ import abstract_block_dumper._internal.dal.django_dal as abd_dal
6
+ from abstract_block_dumper._internal.dal.memory_registry import RegistryItem
7
7
  from abstract_block_dumper.models import TaskAttempt
8
8
 
9
9
  logger = structlog.get_logger(__name__)
@@ -4,9 +4,9 @@ import bittensor as bt
4
4
  import structlog
5
5
  from django.conf import settings
6
6
 
7
- import abstract_block_dumper.dal.django_dal as abd_dal
8
- import abstract_block_dumper.services.utils as abd_utils
9
- from abstract_block_dumper.services.block_processor import BlockProcessor, block_processor_factory
7
+ import abstract_block_dumper._internal.dal.django_dal as abd_dal
8
+ import abstract_block_dumper._internal.services.utils as abd_utils
9
+ from abstract_block_dumper._internal.services.block_processor import BlockProcessor, block_processor_factory
10
10
 
11
11
  logger = structlog.get_logger(__name__)
12
12
 
@@ -20,14 +20,12 @@ def get_bittensor_client() -> bt.Subtensor:
20
20
  """
21
21
  DEFAULT_BITTENSOR_NETWORK = "finney"
22
22
  network = getattr(settings, "BITTENSOR_NETWORK", DEFAULT_BITTENSOR_NETWORK)
23
- logger.info(f"Creating new bittensor client for network: {network}")
23
+ logger.info("Creating new bittensor client for network", network=network)
24
24
  return bt.subtensor(network=network)
25
25
 
26
26
 
27
27
  def get_current_celery_task_id() -> str:
28
- """
29
- Get current celery task id
30
- """
28
+ """Get current celery task id."""
31
29
  try:
32
30
  celery_task_id = current_task.id
33
31
  except Exception:
@@ -36,9 +34,7 @@ def get_current_celery_task_id() -> str:
36
34
 
37
35
 
38
36
  def get_executable_path(func: Callable) -> str:
39
- """
40
- Get executable path for the callable `func`
41
- """
37
+ """Get executable path for the callable `func`."""
42
38
  return ".".join([func.__module__, func.__name__])
43
39
 
44
40
 
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '0.0.1'
32
- __version_tuple__ = version_tuple = (0, 0, 1)
31
+ __version__ = version = '0.0.2'
32
+ __version_tuple__ = version_tuple = (0, 0, 2)
33
33
 
34
34
  __commit_id__ = commit_id = None
File without changes
@@ -1,8 +1,8 @@
1
1
  from django.core.management.base import BaseCommand
2
2
 
3
- from abstract_block_dumper.dal.memory_registry import task_registry
4
- from abstract_block_dumper.discovery import ensure_modules_loaded
5
- from abstract_block_dumper.services.scheduler import task_scheduler_factory
3
+ from abstract_block_dumper._internal.dal.memory_registry import task_registry
4
+ from abstract_block_dumper._internal.discovery import ensure_modules_loaded
5
+ from abstract_block_dumper._internal.services.scheduler import task_scheduler_factory
6
6
 
7
7
 
8
8
  class Command(BaseCommand):
@@ -3,7 +3,7 @@ from typing import Any
3
3
 
4
4
  from django.db import models
5
5
 
6
- import abstract_block_dumper.services.utils as abd_utils
6
+ import abstract_block_dumper._internal.services.utils as abd_utils
7
7
 
8
8
 
9
9
  class TaskAttempt(models.Model):
File without changes
@@ -5,10 +5,10 @@ import structlog
5
5
  from celery import Task, shared_task
6
6
  from django.db import OperationalError, transaction
7
7
 
8
- import abstract_block_dumper.dal.django_dal as abd_dal
9
- import abstract_block_dumper.services.utils as abd_utils
10
- from abstract_block_dumper.dal.memory_registry import RegistryItem, task_registry
11
- from abstract_block_dumper.exceptions import CeleryTaskLocked
8
+ import abstract_block_dumper._internal.dal.django_dal as abd_dal
9
+ import abstract_block_dumper._internal.services.utils as abd_utils
10
+ from abstract_block_dumper._internal.dal.memory_registry import RegistryItem, task_registry
11
+ from abstract_block_dumper._internal.exceptions import CeleryTaskLockedError
12
12
  from abstract_block_dumper.models import TaskAttempt
13
13
 
14
14
  logger = structlog.get_logger(__name__)
@@ -20,7 +20,6 @@ def schedule_retry(task_attempt: TaskAttempt) -> None:
20
20
 
21
21
  Task must already be in FAILED state with next_retry_at set by mark_failed()
22
22
  """
23
-
24
23
  if not task_attempt.next_retry_at:
25
24
  logger.error(
26
25
  "Cannot schedule retry without next_retry_at",
@@ -79,7 +78,7 @@ def _celery_task_wrapper(func, block_number: int, **kwargs) -> dict[str, Any] |
79
78
  block_number=block_number,
80
79
  executable_path=executable_path,
81
80
  )
82
- raise CeleryTaskLocked("TaskAttempt not found - task may have been canceled directly")
81
+ raise CeleryTaskLockedError("TaskAttempt not found - task may have been canceled directly")
83
82
  except OperationalError as e:
84
83
  logger.info(
85
84
  "Task already being processed by another worker",
@@ -87,7 +86,7 @@ def _celery_task_wrapper(func, block_number: int, **kwargs) -> dict[str, Any] |
87
86
  executable_path=executable_path,
88
87
  operational_error=str(e),
89
88
  )
90
- raise CeleryTaskLocked("Task already being processed by another worker")
89
+ raise CeleryTaskLockedError("Task already being processed by another worker")
91
90
 
92
91
  if task_attempt.status != TaskAttempt.Status.PENDING:
93
92
  logger.info(
@@ -146,7 +145,7 @@ def block_task(
146
145
  celery_kwargs: dict[str, Any] | None = None,
147
146
  ) -> Callable[..., Any]:
148
147
  """
149
- Decorator for registering block tasks.
148
+ Register a block task.
150
149
 
151
150
  Args:
152
151
  condition: Lambda function that determines when to execute
@@ -14,7 +14,7 @@ from django.utils import timezone
14
14
  from abstract_block_dumper.models import TaskAttempt
15
15
 
16
16
 
17
- @shared_task(name="abstract_block_dumper.cleanup_old_tasks")
17
+ @shared_task(name="abstract_block_dumper.v1.cleanup_old_tasks")
18
18
  def cleanup_old_tasks(days: int = 7) -> dict[str, int | str]:
19
19
  """
20
20
  Delete all succeeded or unrecoverable failed tasks older than the specified number of days.
@@ -47,12 +47,12 @@ def cleanup_old_tasks(days: int = 7) -> dict[str, int | str]:
47
47
 
48
48
  Example cron (daily at 2 AM):
49
49
  0 2 * * * python manage.py shell -c \
50
- "from abstract_block_dumper.tasks import cleanup_old_tasks; cleanup_old_tasks.delay()"
50
+ "from abstract_block_dumper.v1.tasks import cleanup_old_tasks; cleanup_old_tasks.delay()"
51
51
 
52
52
  Example Celery beat schedule (in settings.py):
53
53
  CELERY_BEAT_SCHEDULE = {
54
54
  'cleanup-old-tasks': {
55
- 'task': 'abstract_block_dumper.cleanup_old_tasks',
55
+ 'task': 'abstract_block_dumper.v1.cleanup_old_tasks',
56
56
  'schedule': crontab(hour=2, minute=0), # Daily at 2 AM
57
57
  'kwargs': {'days': 7},
58
58
  },
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: abstract-block-dumper
3
- Version: 0.0.1
3
+ Version: 0.0.2
4
4
  Project-URL: Source, https://github.com/bactensor/abstract-block-dumper
5
5
  Project-URL: Issue Tracker, https://github.com/bactensor/abstract-block-dumper/issues
6
6
  Author-email: Reef Technologies <opensource@reef.pl>
@@ -26,6 +26,22 @@ Description-Content-Type: text/markdown
26
26
  This package provides a simplified framework for creating block processing tasks in Django applications.
27
27
  Define tasks with lambda conditions using the @block_task decorator and run them asynchronously with Celery.
28
28
 
29
+ ## Usage
30
+
31
+ > [!IMPORTANT]
32
+ > This package uses [ApiVer](#versioning), make sure to import `abstract_block_dumper.v1`.
33
+
34
+
35
+ ## Versioning
36
+
37
+ This package uses [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
38
+ TL;DR you are safe to use [compatible release version specifier](https://packaging.python.org/en/latest/specifications/version-specifiers/#compatible-release) `~=MAJOR.MINOR` in your `pyproject.toml` or `requirements.txt`.
39
+
40
+ Additionally, this package uses [ApiVer](https://www.youtube.com/watch?v=FgcoAKchPjk) to further reduce the risk of breaking changes.
41
+ This means, the public API of this package is explicitly versioned, e.g. `abstract_block_dumper.v1`, and will not change in a backwards-incompatible way even when `abstract_block_dumper.v2` is released.
42
+
43
+ Internal packages, i.e. prefixed by `abstract_block_dumper._` do not share these guarantees and may change in a backwards-incompatible way at any time even in patch releases.
44
+
29
45
  ## Implementation Details
30
46
 
31
47
  ### General Workflow:
@@ -93,7 +109,7 @@ Create block processing tasks in `tasks.py` or `block_tasks.py` file inside any
93
109
  ### 3. Start the Block Scheduler
94
110
  Run the scheduler to start processing blocks:
95
111
  ```bash
96
- $ python manage.py block_tasks
112
+ $ python manage.py block_tasks_v1
97
113
  ```
98
114
 
99
115
  This command will:
@@ -112,7 +128,7 @@ See examples below:
112
128
  Use the `@block_task` decorator with lambda conditions to create block processing tasks:
113
129
 
114
130
  ```python
115
- from abstract_block_dumper.decorators import block_task
131
+ from abstract_block_dumper.api.v1.decorators import block_task
116
132
 
117
133
 
118
134
  # Process every block
@@ -144,7 +160,7 @@ def process_multi_netuid_task(block_number: int, netuid: int):
144
160
  The framework provides a maintenance task to clean up old task records and maintain database performance:
145
161
 
146
162
  ```python
147
- from abstract_block_dumper.tasks import cleanup_old_tasks
163
+ from abstract_block_dumper.v1.tasks import cleanup_old_tasks
148
164
 
149
165
  # Delete tasks older than 7 days (default)
150
166
  cleanup_old_tasks.delay()
@@ -160,13 +176,13 @@ This task deletes all succeeded or unrecoverable failed tasks older than the spe
160
176
  **Option 1: Manual Execution**
161
177
  ```bash
162
178
  # Using Django shell
163
- python manage.py shell -c "from abstract_block_dumper.tasks import cleanup_old_tasks; cleanup_old_tasks.delay()"
179
+ python manage.py shell -c "from abstract_block_dumper.v1.tasks import cleanup_old_tasks; cleanup_old_tasks.delay()"
164
180
  ```
165
181
 
166
182
  **Option 2: Cron Job (Recommended - once per day)**
167
183
  ```bash
168
184
  # Add to crontab (daily at 2 AM)
169
- 0 2 * * * cd /path/to/your/project && python manage.py shell -c "from abstract_block_dumper.tasks import cleanup_old_tasks; cleanup_old_tasks.delay()"
185
+ 0 2 * * * cd /path/to/your/project && python manage.py shell -c "from abstract_block_dumper.v1.tasks import cleanup_old_tasks; cleanup_old_tasks.delay()"
170
186
  ```
171
187
 
172
188
  **Option 3: Celery Beat (Automated Scheduling)**
@@ -0,0 +1,28 @@
1
+ abstract_block_dumper/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
+ abstract_block_dumper/_version.py,sha256=huLsL1iGeXWQKZ8bjwDdIWC7JOkj3wnzBh-HFMZl1PY,704
3
+ abstract_block_dumper/admin.py,sha256=3J3I_QOKFgfMNpTXW-rTQGO_q5Ls6uNuL0FkPVdIsYg,1654
4
+ abstract_block_dumper/apps.py,sha256=DXATdrjsL3T2IletTbKeD6unr8ScLaxg7wz0nAHTAns,215
5
+ abstract_block_dumper/models.py,sha256=MO9824dmHB6xF3PrFE_RERh7whVjQtS4tt6QA0wSbg0,2022
6
+ abstract_block_dumper/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
+ abstract_block_dumper/_internal/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
+ abstract_block_dumper/_internal/discovery.py,sha256=sISOL8vq6rC0pOndrCfWKDZjyYwzzZIChG-BH9mteq0,745
9
+ abstract_block_dumper/_internal/exceptions.py,sha256=jVXQ8b3gneno2XYvO0XisJPMlkAWb6H5u10egIpPJ4k,335
10
+ abstract_block_dumper/_internal/dal/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
+ abstract_block_dumper/_internal/dal/django_dal.py,sha256=pBGEFeo_U0ac2Za-dwzJvf04Ng8lP51aR60c_DUrGIw,5426
12
+ abstract_block_dumper/_internal/dal/memory_registry.py,sha256=ogayH2Iqnltl0Lf696WsXiZYp0KDLb9G338Fb3_XiTs,2985
13
+ abstract_block_dumper/_internal/services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
+ abstract_block_dumper/_internal/services/block_processor.py,sha256=0ZRE4JfcdkhswbU1KEwwW_PazsCVJqsWfd_cvvu5r64,8123
15
+ abstract_block_dumper/_internal/services/executor.py,sha256=ZZmQ9TzoNEoAE4amiU8lHRsTfP7YusUkWXasrArfo2g,1806
16
+ abstract_block_dumper/_internal/services/scheduler.py,sha256=t8NDqoKXrYzYxbXmLyg-VtkBCCifmq78Ae6jhDyk5EA,3473
17
+ abstract_block_dumper/_internal/services/utils.py,sha256=Y8b8KdKn53mcuWchw6b5EJq9ipO4p1FFf6g_Fpbg7cQ,1273
18
+ abstract_block_dumper/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
+ abstract_block_dumper/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
+ abstract_block_dumper/management/commands/block_tasks_v1.py,sha256=waHuWMXzQr7TOzftHcBRPLw5Cx_lfL2-quW9BjcihCI,788
21
+ abstract_block_dumper/migrations/0001_initial.py,sha256=ImPHC3G6kPkq4Xn_4YVAm4Labh1Xi7PkCRszYRGpTiI,2298
22
+ abstract_block_dumper/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
+ abstract_block_dumper/v1/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
+ abstract_block_dumper/v1/decorators.py,sha256=a_M9foEY2ZllPlZFZ_iPLmrwa34C5bLbiXMihiLbWCw,7099
25
+ abstract_block_dumper/v1/tasks.py,sha256=u9iMYdDUqzYT3yPrNwZecHnlweZ3yFipV9BcIWHCbus,2647
26
+ abstract_block_dumper-0.0.2.dist-info/METADATA,sha256=4AfqUQJysgj5ys2iexAwPIQst0Ia9fbEa0bxePgOXKw,11990
27
+ abstract_block_dumper-0.0.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
28
+ abstract_block_dumper-0.0.2.dist-info/RECORD,,
@@ -1,25 +0,0 @@
1
- abstract_block_dumper/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- abstract_block_dumper/_version.py,sha256=qf6R-J7-UyuABBo8c0HgaquJ8bejVbf07HodXgwAwgQ,704
3
- abstract_block_dumper/admin.py,sha256=3J3I_QOKFgfMNpTXW-rTQGO_q5Ls6uNuL0FkPVdIsYg,1654
4
- abstract_block_dumper/apps.py,sha256=DXATdrjsL3T2IletTbKeD6unr8ScLaxg7wz0nAHTAns,215
5
- abstract_block_dumper/decorators.py,sha256=lV1ueIlEbBNojnXVH5GQiRCbck3-SQgtWOil5OqeTHo,7061
6
- abstract_block_dumper/discovery.py,sha256=kZlb8y-0ltJE-L-1GLxZ_xlziibY8AjggvHJ9sxsScw,728
7
- abstract_block_dumper/exceptions.py,sha256=EunFH-H5eXNNkKl2CvHlhZ2wvtdry969Gle-CZc7YM0,315
8
- abstract_block_dumper/models.py,sha256=l229tar4FdQ52eETLKGeskgkXHWa4ealF6DWbG8M4Mc,2012
9
- abstract_block_dumper/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
- abstract_block_dumper/tasks.py,sha256=8ppGWxML3krVdrS_08WnKuCpERRhB_6DIyVEkpYZMrw,2638
11
- abstract_block_dumper/dal/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
- abstract_block_dumper/dal/django_dal.py,sha256=unAA4Mt5dBBaUhvyezfyC0VtWMD6Ru79NyjKaOMNNSw,5359
13
- abstract_block_dumper/dal/memory_registry.py,sha256=rgU2CYGm2MHPgSZefgr-kuLxOtPu5wxINa3Y5ELgMUo,3029
14
- abstract_block_dumper/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
- abstract_block_dumper/management/commands/block_tasks.py,sha256=dEfFnoZCIIDsrNL5vRPtIDrkpcJk36yev_aoGAScgoQ,758
16
- abstract_block_dumper/migrations/0001_initial.py,sha256=ImPHC3G6kPkq4Xn_4YVAm4Labh1Xi7PkCRszYRGpTiI,2298
17
- abstract_block_dumper/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
- abstract_block_dumper/services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
- abstract_block_dumper/services/block_processor.py,sha256=4guYwtVYh-N1UewiqVN7xG5pM56adyGe8vPG_kCDmQI,8072
20
- abstract_block_dumper/services/executor.py,sha256=TDbrtVGiz7GNGJwHYB6ZqqhrrTDDL7JGzxOehpF-QTY,1786
21
- abstract_block_dumper/services/scheduler.py,sha256=zKY24zSwjcQSVk3wt39GBurSNXkfylWsdV7Mgmv1RO8,3443
22
- abstract_block_dumper/services/utils.py,sha256=Iqa-9xhNxOCnvSWjGBclOUvmO4qsUhhievUllVh82I4,1286
23
- abstract_block_dumper-0.0.1.dist-info/METADATA,sha256=g26Qm3r1ZwH5OCCVCndRdjwnn-VY4YdIxwQyGKuVHXA,11022
24
- abstract_block_dumper-0.0.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
25
- abstract_block_dumper-0.0.1.dist-info/RECORD,,
File without changes