From 49c776c339147069b9186af31110f9613f861f40 Mon Sep 17 00:00:00 2001 From: raj-open Date: Sun, 2 Nov 2025 10:24:54 +0100 Subject: [PATCH 01/12] story-algorithm > staging: added trait method for folder size (bytes) + cleaned up docstrings --- src/models/filesmanager/os/classes.py | 32 +++++++++++++++++++++++++++ src/models/filesmanager/traits.py | 7 ++++++ 2 files changed, 39 insertions(+) diff --git a/src/models/filesmanager/os/classes.py b/src/models/filesmanager/os/classes.py index 35b166e..b6c9c22 100644 --- a/src/models/filesmanager/os/classes.py +++ b/src/models/filesmanager/os/classes.py @@ -83,12 +83,18 @@ def path_rel(root: str, path: str, /) -> list[str]: return [] def get_file(self, *path: str) -> OSFilesManagerFile: + """ + Use files manager to get file by full path + """ tz = self._timezone path_full = Path(*path).as_posix() or "." path_full = path_full.strip().rstrip(r"\/") return OSFilesManagerFile(path=path_full, tz=tz) def get_folder(self, *path: str) -> OSFilesManagerFolder: + """ + Use files manager to get folder by full path + """ tz = self._timezone path_full = Path(*path).as_posix() or "." path_full = path_full.strip().rstrip(r"\/") @@ -168,6 +174,9 @@ def exists(self) -> bool | None: @property def path(self) -> str: + """ + Gets path locator to file + """ return self._path @property @@ -202,6 +211,9 @@ def ext(self) -> str: @property def size(self) -> int: + """ + Gets meta attribute - size of file + """ meta = os.stat(self._path) return meta.st_size @@ -227,6 +239,9 @@ def author_id(self) -> int | None: @property def date_created(self) -> AwareDatetime | None: + """ + Gets meta attribute - date of creation + """ meta = os.stat(self._path) try: @@ -239,6 +254,9 @@ def date_created(self) -> AwareDatetime | None: @property def date_modified(self) -> AwareDatetime | None: + """ + Gets meta attribute - date of (last) modification + """ meta = os.stat(self._path) t = datetime.fromtimestamp(meta.st_mtime) return add_timezone(t, tz=self._timezone) @@ -316,12 +334,26 @@ def exists(self) -> bool | None: @property def path(self) -> str: + """ + Gets path locator to folder + """ return self._path @property def name(self) -> str: + """ + Gets name identifier of folder + """ return os.path.basename(self._path) + @property + def size(self) -> int: + """ + Gets meta attribute - size of folder + """ + meta = os.stat(self._path) + return meta.st_size + def get_file(self, name: str, /) -> OSFilesManagerFile: """ Gets file object by name within folder diff --git a/src/models/filesmanager/traits.py b/src/models/filesmanager/traits.py index 71e274a..704bff7 100644 --- a/src/models/filesmanager/traits.py +++ b/src/models/filesmanager/traits.py @@ -240,6 +240,13 @@ def name(self) -> str: """ ... + @property + def size(self) -> int: + """ + Gets meta attribute - size of folder + """ + ... + def get_file(self, name: str, /) -> FilesManagerFile: """ Gets file object by name within folder From 9bf3bcf7974facbfc32de9e6e26bff282a68b093 Mon Sep 17 00:00:00 2001 From: raj-open Date: Sun, 2 Nov 2025 10:25:20 +0100 Subject: [PATCH 02/12] story-algorithm > staging: added wrapper class to handle channels --- src/models/apis/__init__.py | 0 src/models/apis/queue/__init__.py | 16 +++++++++ src/models/apis/queue/channels.py | 58 +++++++++++++++++++++++++++++++ 3 files changed, 74 insertions(+) create mode 100644 src/models/apis/__init__.py create mode 100644 src/models/apis/queue/__init__.py create mode 100644 src/models/apis/queue/channels.py diff --git a/src/models/apis/__init__.py b/src/models/apis/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/models/apis/queue/__init__.py b/src/models/apis/queue/__init__.py new file mode 100644 index 0000000..3ef62d8 --- /dev/null +++ b/src/models/apis/queue/__init__.py @@ -0,0 +1,16 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +# ---------------------------------------------------------------- +# IMPORTS +# ---------------------------------------------------------------- + +from .channels import * + +# ---------------------------------------------------------------- +# EXPORTS +# ---------------------------------------------------------------- + +__all__ = [ + "ChannelContext", +] diff --git a/src/models/apis/queue/channels.py b/src/models/apis/queue/channels.py new file mode 100644 index 0000000..74a5995 --- /dev/null +++ b/src/models/apis/queue/channels.py @@ -0,0 +1,58 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +# ---------------------------------------------------------------- +# IMPORTS +# ---------------------------------------------------------------- + +import logging + +from pika import BlockingConnection +from pika import ConnectionParameters +from pika.adapters.blocking_connection import BlockingChannel +from pydantic import BaseModel +from pydantic import ConfigDict +from pydantic import SkipValidation + +# ---------------------------------------------------------------- +# EXPORTS +# ---------------------------------------------------------------- + +__all__ = [ + "ChannelContext", +] + +# ---------------------------------------------------------------- +# CLASSES +# ---------------------------------------------------------------- + + +class ChannelStruct(BaseModel): + """ + A struct which contains settings + dynamically determined properties of channel + """ + + model_config = ConfigDict( + populate_by_name=True, + arbitrary_types_allowed=True, + ) + + settings: SkipValidation[ConnectionParameters] + channel: SkipValidation[BlockingChannel] | None = None + + +class ChannelContext(ChannelStruct): + """ + Provides a Channel as a context manager + """ + + def __enter__(self) -> BlockingChannel: + with BlockingConnection(self.settings) as connection: + self.channel = connection.channel() + return self.channel + + def __exit__(self, *_, **__): + logging.info("gracefully terminating channel") + if self.channel is not None: + self.channel.close() + return From fab6b6230d0a243789c329316e8316c32a2ef86e Mon Sep 17 00:00:00 2001 From: raj-open Date: Sun, 2 Nov 2025 10:26:12 +0100 Subject: [PATCH 03/12] story-algorithm > staging: add compression to queue + safeguard against too-long queues + optional skip empty --- src/algorithms/filesmanager/search.py | 88 +++++++++++++++++++++++---- 1 file changed, 77 insertions(+), 11 deletions(-) diff --git a/src/algorithms/filesmanager/search.py b/src/algorithms/filesmanager/search.py index 7bb545d..9ee0056 100644 --- a/src/algorithms/filesmanager/search.py +++ b/src/algorithms/filesmanager/search.py @@ -32,27 +32,93 @@ def recursive_file_search( /, *, path: str, + skip_empty: bool = False, + max_queue_size: int = 1_000_000, ) -> Generator[tuple[int, str, str], None, None]: """ Uses a FIFO-queue to search for all files in a given directory + + @inputs + + - `manager` - instance of `FilesManager` protocol for handling object in filessystem + + - `path` <`string`> - path to directory to be recursively searched + + - `skip_empty` <`boolean`> + - if set to `true` will only search for non-empty files (faster) + - if set to `false` will include empty files + + - `max_queue_size` <`integer`> - a safety bound to prevent out of memory exceptions + + @generates + + - `d` - current (relative) depth within directory, + whereby `0` = level of original directory + + - `path` - path to current subdirectory + + - `filename` - filename of file-object within directory """ # create and initialise queue - q = deque([(0, path)]) + q = deque[tuple[int, str | list[str]]]() + q.append[(0, path)] # keep alive as long as queue not empty - while len(q) > 0: - # handle next task - d, path = q.pop() + while (L := len(q)) > 0: + # safeguard to prevent memory issues + if L > max_queue_size: + raise MemoryError(f"queue {L} exceeds maximum size permitted {max_queue_size}") + + # get next entry + d, entry = q.pop() + + # if entry is a list of paths, resolve and continue + if isinstance((paths := entry), list): + for path in paths[::-1]: + q.appendleft((d, path)) + continue + + # otherwise entry is a path + path = entry # obtain folder handler folder = manager.get_folder(path) - # obtain filenames - filenames = folder.get_filenames() - for filename in filenames: + # (optional) skip if folder empty + if skip_empty and guard_empty_folder(folder): + continue + + # process filenames + for filename in folder.get_filenames(): + # (optional) skip if file empty + # NOTE: only requests file object if needed + if skip_empty and guard_empty_file(folder, filename): + continue + + # -> send result yield d, path, filename - # add subfolders to queue - subpaths = folder.get_subfolder_paths() - for subpath in subpaths: - q.append((d + 1, subpath)) + # process subfolders - create new tasks + if len(paths := folder.get_subfolder_paths()) > 0: + q.append((d + 1, paths)) + + +# ---------------------------------------------------------------- +# AUXILIARY METHODS +# ---------------------------------------------------------------- + + +def guard_empty_folder( + folder: FilesManagerFolder, + /, +) -> bool: + return folder.size == 0 + + +def guard_empty_file( + folder: FilesManagerFolder, + filename: str, + /, +) -> bool: + file = folder.get_file(filename) + return file.size == 0 From a1f473612ff2ab8d25627088067814b3b873c667 Mon Sep 17 00:00:00 2001 From: raj-open Date: Sun, 2 Nov 2025 10:26:44 +0100 Subject: [PATCH 04/12] story-algorithm > staging: made use of context manager to ensure graceful channel closure --- src/features/feat_searchfs/feature.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/features/feat_searchfs/feature.py b/src/features/feat_searchfs/feature.py index d360556..55948e9 100644 --- a/src/features/feat_searchfs/feature.py +++ b/src/features/feat_searchfs/feature.py @@ -12,13 +12,13 @@ from functools import partial from pika import BasicProperties -from pika import BlockingConnection from safetywrap import Err from safetywrap import Ok from safetywrap import Result from ..._core.logging import * from ...algorithms.filesmanager import * +from ...models.apis.queue import * from ...models.application import * from ...models.filesmanager import * from ...models.internal.errors import * @@ -76,8 +76,7 @@ def feature( msg_properties = BasicProperties(type="info") settings = config.get_queue_parameters() - with BlockingConnection(settings) as connection: - chan = connection.channel() + with ChannelContext(settings=settings) as chan: # FIXME: publication to exchages fails # chan.exchange_declare(exchange=msg_exchange, exchange_type="direct") chan.queue_declare(queue=msg_route) @@ -92,12 +91,17 @@ def feature( """ for count, (d, subpath, filename) in enumerate( # NOTE: algorithm returns a generator - recursive_file_search(manager, path=root), + recursive_file_search( + manager, + path=root, + skip_empty=False, + ), # keep track of number of items found start=1, ): # apply guard guard(d=d, count=count) + # if not blocked by guard log to queue body = {"path": subpath, "filename": filename} contents = json.dumps(body).encode() From 458356f2bbc6aa6f3157e1eed2229d39b071f33c Mon Sep 17 00:00:00 2001 From: raj-open Date: Sun, 2 Nov 2025 11:13:29 +0100 Subject: [PATCH 05/12] story-algorithm > staging: added options field `skip-empty` (bool) to toggle option in algorithm --- docs/models/application/Models/RequestTaskOptions.md | 1 + models/schema-application.yaml | 5 +++++ src/models/generated/application.py | 5 +++++ templates/template-requests-multiple.yaml | 1 + templates/template-requests.yaml | 9 ++++++--- 5 files changed, 18 insertions(+), 3 deletions(-) diff --git a/docs/models/application/Models/RequestTaskOptions.md b/docs/models/application/Models/RequestTaskOptions.md index b19051b..e1c492d 100644 --- a/docs/models/application/Models/RequestTaskOptions.md +++ b/docs/models/application/Models/RequestTaskOptions.md @@ -3,6 +3,7 @@ | Name | Type | Description | Notes | |------------ | ------------- | ------------- | -------------| +| **skip-empty** | **Boolean** | Whether to only include non-empty files | [optional] [default to false] | | **max-depth** | **Integer** | Limits the search depth | [optional] [default to 50] | | **max-items** | **Integer** | Limits the amount of items that can be found | [optional] [default to 1000000] | | **max-duration** | **String** | Limits the amount of time spent for a search | [default to null] | diff --git a/models/schema-application.yaml b/models/schema-application.yaml index 2d163c9..fad5712 100644 --- a/models/schema-application.yaml +++ b/models/schema-application.yaml @@ -151,6 +151,11 @@ components: - max-duration additionalProperties: true properties: + skip-empty: + description: |- + Whether to only include non-empty files + type: boolean + default: false max-depth: description: |- Limits the search depth diff --git a/src/models/generated/application.py b/src/models/generated/application.py index 5259e73..fcc46d8 100644 --- a/src/models/generated/application.py +++ b/src/models/generated/application.py @@ -60,6 +60,11 @@ class RequestTaskOptions(BaseModel): extra="allow", populate_by_name=True, ) + skip_empty: bool = Field( + default=False, + alias="skip-empty", + description="Whether to only include non-empty files", + ) max_depth: int = Field( default=50, alias="max-depth", description="Limits the search depth" ) diff --git a/templates/template-requests-multiple.yaml b/templates/template-requests-multiple.yaml index 0c1480d..c3ce784 100644 --- a/templates/template-requests-multiple.yaml +++ b/templates/template-requests-multiple.yaml @@ -4,6 +4,7 @@ - label: 'First task' options: &ref_options + # skip-empty: true # default is false max-depth: 100 max-items: 10_000_000 max-duration: 00:30:00 diff --git a/templates/template-requests.yaml b/templates/template-requests.yaml index 4f8593b..859cb7e 100644 --- a/templates/template-requests.yaml +++ b/templates/template-requests.yaml @@ -1,8 +1,9 @@ -# For logging purposes - a recognisable label for the task +# For logging purposes - a recognisable label for the task which will be used as the queue name label: 'Some label' -# NOTE: not yet implemented +# Special options and safeguards options: + # skip-empty: true # default is false max-depth: 100 max-items: 10_000_000 max-duration: 00:30:00 @@ -10,5 +11,7 @@ options: # The main request data: inputs: - location: OS # enum for file system + # enum for file system; later "OS", "SHAREPOINT", "BLOB-STORAGE" will be available + location: OS + # directory to be recursively searched path: 'relative/or absolute path to directory' From b5bb0436c39faf8b1f83f1dfa0e738b21311855c Mon Sep 17 00:00:00 2001 From: raj-open Date: Sun, 2 Nov 2025 11:15:40 +0100 Subject: [PATCH 06/12] story-algorithm > staging: used `skip-empty` from request config --- src/features/feat_searchfs/feature.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/features/feat_searchfs/feature.py b/src/features/feat_searchfs/feature.py index 55948e9..ccffcfe 100644 --- a/src/features/feat_searchfs/feature.py +++ b/src/features/feat_searchfs/feature.py @@ -94,7 +94,7 @@ def feature( recursive_file_search( manager, path=root, - skip_empty=False, + skip_empty=options.skip_empty, ), # keep track of number of items found start=1, From 707f672c5ab4a869ab6ad3458610ba99b7fa897a Mon Sep 17 00:00:00 2001 From: raj-open Date: Sun, 2 Nov 2025 11:20:36 +0100 Subject: [PATCH 07/12] story-algorithm > staging: added demos --- .gitignore | 12 +++++++++ demo/README.md | 26 +++++++++++++++++++ demo/example-case-1/README.md | 19 ++++++++++++++ demo/example-case-1/data/change.log | 3 +++ demo/example-case-1/data/customers.csv | 5 ++++ .../data/mock_empty logs/err.log | 0 .../data/mock_empty logs/out.log | 0 demo/example-case-1/data/notes.md | 10 +++++++ demo/example-case-1/data/orders.csv | 6 +++++ demo/example-case-1/requests.yaml | 12 +++++++++ demo/example-case-2/README.md | 19 ++++++++++++++ demo/example-case-2/data/change.log | 3 +++ demo/example-case-2/data/customers.csv | 5 ++++ .../data/mock_empty logs/err.log | 0 .../data/mock_empty logs/out.log | 0 demo/example-case-2/data/notes.md | 10 +++++++ demo/example-case-2/data/orders.csv | 6 +++++ demo/example-case-2/requests.yaml | 12 +++++++++ demo/example-case-3/README.md | 19 ++++++++++++++ demo/example-case-3/data/change.log | 3 +++ demo/example-case-3/data/customers.csv | 5 ++++ .../data/mock_articles/articles.csv | 5 ++++ .../mock_A19038012/description.txt | 3 +++ .../mock_articles/mock_A19038012/licence.txt | 5 ++++ .../mock_A63278732/description.txt | 3 +++ .../mock_articles/mock_A63278732/licence.txt | 5 ++++ .../mock_B18031017/description.txt | 3 +++ .../mock_articles/mock_B18031017/licence.txt | 5 ++++ .../mock_Z20009991/description.txt | 3 +++ .../mock_articles/mock_Z20009991/licence.txt | 5 ++++ .../data/mock_companies/companies.csv | 6 +++++ .../data/mock_empty logs/err.log | 0 .../data/mock_empty logs/out.log | 0 demo/example-case-3/data/notes.md | 10 +++++++ demo/example-case-3/data/orders.csv | 6 +++++ demo/example-case-3/requests.yaml | 12 +++++++++ demo/example-empty/README.md | 19 ++++++++++++++ demo/example-empty/data/.gitkeep | 0 demo/example-empty/requests.yaml | 12 +++++++++ demo/example-flat/README.md | 19 ++++++++++++++ demo/example-flat/data/change.log | 3 +++ demo/example-flat/data/customers.csv | 5 ++++ demo/example-flat/data/notes.md | 10 +++++++ demo/example-flat/data/orders.csv | 6 +++++ demo/example-flat/requests.yaml | 12 +++++++++ justfile | 3 +++ 46 files changed, 335 insertions(+) create mode 100644 demo/README.md create mode 100644 demo/example-case-1/README.md create mode 100644 demo/example-case-1/data/change.log create mode 100644 demo/example-case-1/data/customers.csv create mode 100644 demo/example-case-1/data/mock_empty logs/err.log create mode 100644 demo/example-case-1/data/mock_empty logs/out.log create mode 100644 demo/example-case-1/data/notes.md create mode 100644 demo/example-case-1/data/orders.csv create mode 100644 demo/example-case-1/requests.yaml create mode 100644 demo/example-case-2/README.md create mode 100644 demo/example-case-2/data/change.log create mode 100644 demo/example-case-2/data/customers.csv create mode 100644 demo/example-case-2/data/mock_empty logs/err.log create mode 100644 demo/example-case-2/data/mock_empty logs/out.log create mode 100644 demo/example-case-2/data/notes.md create mode 100644 demo/example-case-2/data/orders.csv create mode 100644 demo/example-case-2/requests.yaml create mode 100644 demo/example-case-3/README.md create mode 100644 demo/example-case-3/data/change.log create mode 100644 demo/example-case-3/data/customers.csv create mode 100644 demo/example-case-3/data/mock_articles/articles.csv create mode 100644 demo/example-case-3/data/mock_articles/mock_A19038012/description.txt create mode 100644 demo/example-case-3/data/mock_articles/mock_A19038012/licence.txt create mode 100644 demo/example-case-3/data/mock_articles/mock_A63278732/description.txt create mode 100644 demo/example-case-3/data/mock_articles/mock_A63278732/licence.txt create mode 100644 demo/example-case-3/data/mock_articles/mock_B18031017/description.txt create mode 100644 demo/example-case-3/data/mock_articles/mock_B18031017/licence.txt create mode 100644 demo/example-case-3/data/mock_articles/mock_Z20009991/description.txt create mode 100644 demo/example-case-3/data/mock_articles/mock_Z20009991/licence.txt create mode 100644 demo/example-case-3/data/mock_companies/companies.csv create mode 100644 demo/example-case-3/data/mock_empty logs/err.log create mode 100644 demo/example-case-3/data/mock_empty logs/out.log create mode 100644 demo/example-case-3/data/notes.md create mode 100644 demo/example-case-3/data/orders.csv create mode 100644 demo/example-case-3/requests.yaml create mode 100644 demo/example-empty/README.md create mode 100644 demo/example-empty/data/.gitkeep create mode 100644 demo/example-empty/requests.yaml create mode 100644 demo/example-flat/README.md create mode 100644 demo/example-flat/data/change.log create mode 100644 demo/example-flat/data/customers.csv create mode 100644 demo/example-flat/data/notes.md create mode 100644 demo/example-flat/data/orders.csv create mode 100644 demo/example-flat/requests.yaml diff --git a/.gitignore b/.gitignore index 580b664..c473518 100644 --- a/.gitignore +++ b/.gitignore @@ -59,6 +59,18 @@ !/tests/*/resources/**/ !/tests/*/resources/**/MOCK* +!/demo +!/demo/README.md +!/demo/example* +!/demo/example*/data +!/demo/example*/data/**/mock*/ +!/demo/example*/data/**/*.csv +!/demo/example*/data/**/*.md +!/demo/example*/data/**/*.txt +!/demo/example*/data/**/*.log +!/demo/example*/README.md +!/demo/example*/requests.yaml + # ---------------------------------------------------------------- # FORCE REMOVE # ---------------------------------------------------------------- diff --git a/demo/README.md b/demo/README.md new file mode 100644 index 0000000..1ca5284 --- /dev/null +++ b/demo/README.md @@ -0,0 +1,26 @@ +# Demo # + +Each folder in this directory contains an example file system with requests config. + +The README file in each folder explains how to run tool against the case +and the expected outcome. + +For ease of use one can also run the demos as follows: + +Run as follows + +1. Open 2 terminals + +2. In terminal 1 start the queue + + ```bash + just docker-start-queue + `` + +3. In terminal 2 run the command + + ```bash + just demo {name} + ```` + + where `{name}` is the name of the subfolder, e.g. `"example-case-1"`. diff --git a/demo/example-case-1/README.md b/demo/example-case-1/README.md new file mode 100644 index 0000000..7280380 --- /dev/null +++ b/demo/example-case-1/README.md @@ -0,0 +1,19 @@ +# Example - Case 1 # + +Run as follows + +1. Open 2 terminals + +2. In terminal 1 start the queue + + ```bash + just docker-start-queue + ``` + +3. In terminal 2 run the command + + ```bash + just run SEARCH-FS --requests 'demo/example-case-1/requests.yaml' + ```` + +This should yield 4 messages in the queue - the empty logs should be skipped. diff --git a/demo/example-case-1/data/change.log b/demo/example-case-1/data/change.log new file mode 100644 index 0000000..eb009ef --- /dev/null +++ b/demo/example-case-1/data/change.log @@ -0,0 +1,3 @@ +2025-10-01 added customers.csv +2025-10-08 added orders.csv +2025-10-09 filled in orders.csv diff --git a/demo/example-case-1/data/customers.csv b/demo/example-case-1/data/customers.csv new file mode 100644 index 0000000..1a4dfcf --- /dev/null +++ b/demo/example-case-1/data/customers.csv @@ -0,0 +1,5 @@ +"Id";"Company";"Surname";"Name" +102;"ACME";"Hargrave";"Julianne" +103;"Google";"Schorche";"Iain" +227;;"Cruz";"David" +489;"Amazon";; diff --git a/demo/example-case-1/data/mock_empty logs/err.log b/demo/example-case-1/data/mock_empty logs/err.log new file mode 100644 index 0000000..e69de29 diff --git a/demo/example-case-1/data/mock_empty logs/out.log b/demo/example-case-1/data/mock_empty logs/out.log new file mode 100644 index 0000000..e69de29 diff --git a/demo/example-case-1/data/notes.md b/demo/example-case-1/data/notes.md new file mode 100644 index 0000000..a39635b --- /dev/null +++ b/demo/example-case-1/data/notes.md @@ -0,0 +1,10 @@ +# Notes # + +Folder structure + +```text +├── customers.csv +├── orders.csv +├── change.log +└── notes.md +``` diff --git a/demo/example-case-1/data/orders.csv b/demo/example-case-1/data/orders.csv new file mode 100644 index 0000000..ba2ce2d --- /dev/null +++ b/demo/example-case-1/data/orders.csv @@ -0,0 +1,6 @@ +"Id";"Customer.Id";"Article";"Qty";"Cost";"TotalCost";"Status";"Checked" +0;382;"A19038012";10;0.50;50.00;COMPLETED;true +1;103;"B18031017";8;4.57;36.56;COMPLETED;true +8;;"A63278732";;10.17;;ERROR;false +9;;"A63278732";20;10.17;203.4;CANCELLED;false +13;489;"Z20009991";3;0.10;0.30;PENDING;true diff --git a/demo/example-case-1/requests.yaml b/demo/example-case-1/requests.yaml new file mode 100644 index 0000000..574de72 --- /dev/null +++ b/demo/example-case-1/requests.yaml @@ -0,0 +1,12 @@ +label: 'Demo Case 1' + +options: + skip-empty: true + max-depth: 100 + max-items: 10_000_000 + max-duration: 00:30:00 + +data: + inputs: + location: OS + path: 'demo/example-case-1/data' diff --git a/demo/example-case-2/README.md b/demo/example-case-2/README.md new file mode 100644 index 0000000..b2df1aa --- /dev/null +++ b/demo/example-case-2/README.md @@ -0,0 +1,19 @@ +# Example - Case 2 # + +Run as follows + +1. Open 2 terminals + +2. In terminal 1 start the queue + + ```bash + just docker-start-queue + ``` + +3. In terminal 2 run the command + + ```bash + just run SEARCH-FS --requests 'demo/example-case-2/requests.yaml' + ```` + +This should yield 6 messages in the queue - the empty logs should _not_ be skipped. diff --git a/demo/example-case-2/data/change.log b/demo/example-case-2/data/change.log new file mode 100644 index 0000000..eb009ef --- /dev/null +++ b/demo/example-case-2/data/change.log @@ -0,0 +1,3 @@ +2025-10-01 added customers.csv +2025-10-08 added orders.csv +2025-10-09 filled in orders.csv diff --git a/demo/example-case-2/data/customers.csv b/demo/example-case-2/data/customers.csv new file mode 100644 index 0000000..1a4dfcf --- /dev/null +++ b/demo/example-case-2/data/customers.csv @@ -0,0 +1,5 @@ +"Id";"Company";"Surname";"Name" +102;"ACME";"Hargrave";"Julianne" +103;"Google";"Schorche";"Iain" +227;;"Cruz";"David" +489;"Amazon";; diff --git a/demo/example-case-2/data/mock_empty logs/err.log b/demo/example-case-2/data/mock_empty logs/err.log new file mode 100644 index 0000000..e69de29 diff --git a/demo/example-case-2/data/mock_empty logs/out.log b/demo/example-case-2/data/mock_empty logs/out.log new file mode 100644 index 0000000..e69de29 diff --git a/demo/example-case-2/data/notes.md b/demo/example-case-2/data/notes.md new file mode 100644 index 0000000..a39635b --- /dev/null +++ b/demo/example-case-2/data/notes.md @@ -0,0 +1,10 @@ +# Notes # + +Folder structure + +```text +├── customers.csv +├── orders.csv +├── change.log +└── notes.md +``` diff --git a/demo/example-case-2/data/orders.csv b/demo/example-case-2/data/orders.csv new file mode 100644 index 0000000..ba2ce2d --- /dev/null +++ b/demo/example-case-2/data/orders.csv @@ -0,0 +1,6 @@ +"Id";"Customer.Id";"Article";"Qty";"Cost";"TotalCost";"Status";"Checked" +0;382;"A19038012";10;0.50;50.00;COMPLETED;true +1;103;"B18031017";8;4.57;36.56;COMPLETED;true +8;;"A63278732";;10.17;;ERROR;false +9;;"A63278732";20;10.17;203.4;CANCELLED;false +13;489;"Z20009991";3;0.10;0.30;PENDING;true diff --git a/demo/example-case-2/requests.yaml b/demo/example-case-2/requests.yaml new file mode 100644 index 0000000..c0b4231 --- /dev/null +++ b/demo/example-case-2/requests.yaml @@ -0,0 +1,12 @@ +label: 'Demo Case 2' + +options: + skip-empty: false + max-depth: 100 + max-items: 10_000_000 + max-duration: 00:30:00 + +data: + inputs: + location: OS + path: 'demo/example-case-2/data' diff --git a/demo/example-case-3/README.md b/demo/example-case-3/README.md new file mode 100644 index 0000000..13de843 --- /dev/null +++ b/demo/example-case-3/README.md @@ -0,0 +1,19 @@ +# Example - Case 3 # + +Run as follows + +1. Open 2 terminals + +2. In terminal 1 start the queue + + ```bash + just docker-start-queue + ``` + +3. In terminal 2 run the command + + ```bash + just run SEARCH-FS --requests 'demo/example-case-3/requests.yaml' + ```` + +This should yield 6 messages in the queue - the empty logs should _not_ be skipped. diff --git a/demo/example-case-3/data/change.log b/demo/example-case-3/data/change.log new file mode 100644 index 0000000..eb009ef --- /dev/null +++ b/demo/example-case-3/data/change.log @@ -0,0 +1,3 @@ +2025-10-01 added customers.csv +2025-10-08 added orders.csv +2025-10-09 filled in orders.csv diff --git a/demo/example-case-3/data/customers.csv b/demo/example-case-3/data/customers.csv new file mode 100644 index 0000000..1a4dfcf --- /dev/null +++ b/demo/example-case-3/data/customers.csv @@ -0,0 +1,5 @@ +"Id";"Company";"Surname";"Name" +102;"ACME";"Hargrave";"Julianne" +103;"Google";"Schorche";"Iain" +227;;"Cruz";"David" +489;"Amazon";; diff --git a/demo/example-case-3/data/mock_articles/articles.csv b/demo/example-case-3/data/mock_articles/articles.csv new file mode 100644 index 0000000..35c0e15 --- /dev/null +++ b/demo/example-case-3/data/mock_articles/articles.csv @@ -0,0 +1,5 @@ +"Article";"Cost" +"A19038012";0.50 +"A63278732";10.17 +"B18031017";4.57 +"Z20009991";0.10 diff --git a/demo/example-case-3/data/mock_articles/mock_A19038012/description.txt b/demo/example-case-3/data/mock_articles/mock_A19038012/description.txt new file mode 100644 index 0000000..e8d2746 --- /dev/null +++ b/demo/example-case-3/data/mock_articles/mock_A19038012/description.txt @@ -0,0 +1,3 @@ +Labore atque perferendis adipisci cumque voluptas non ducimus minus hic repellat, sint dolorem architecto alias molestiae quos delectus perferendis optio enim sapiente. Temporibus quibusdam accusamus fugiat perspiciatis, labore reprehenderit incidunt ut mollitia numquam ea libero cumque rerum, atque ab possimus. + +Est tenetur blanditiis, esse ipsum architecto eligendi ducimus, delectus eius veniam soluta itaque libero amet ipsum dolore, ea doloremque facilis reprehenderit delectus ipsum error corporis eveniet eos quaerat asperiores, consequuntur pariatur porro dolore at. Aspernatur amet perferendis porro odio nobis eius, blanditiis veniam debitis velit deserunt vero cum neque explicabo omnis. diff --git a/demo/example-case-3/data/mock_articles/mock_A19038012/licence.txt b/demo/example-case-3/data/mock_articles/mock_A19038012/licence.txt new file mode 100644 index 0000000..d1f248f --- /dev/null +++ b/demo/example-case-3/data/mock_articles/mock_A19038012/licence.txt @@ -0,0 +1,5 @@ +Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. + +Dicta non delectus nisi reprehenderit, odit a incidunt eveniet ratione aspernatur distinctio beatae? Accusamus itaque deserunt perferendis ratione nihil quia odit excepturi numquam, provident voluptatum a perspiciatis accusantium mollitia est culpa possimus cumque tenetur quidem. + +Nihil harum ipsum, blanditiis iure impedit molestiae cumque ratione nihil doloribus eius facilis eum deleniti, ab corporis deserunt, fugit fuga officiis et blanditiis? Provident quos sed exercitationem iure necessitatibus rem, deserunt obcaecati vitae, eligendi quo id reiciendis iste asperiores autem, molestias cum ex beatae. Pariatur modi iste reiciendis sequi ipsam ipsa ducimus possimus iure, eius similique dolores amet officiis ipsum consectetur odio, totam placeat consequatur ipsam quae accusantium libero? Qui illo hic perferendis, adipisci ut ullam distinctio voluptatem a eaque error debitis praesentium atque culpa, hic iusto pariatur non blanditiis, aliquid commodi libero inventore vel laborum, aut quos reiciendis labore non nisi a harum rem facere? diff --git a/demo/example-case-3/data/mock_articles/mock_A63278732/description.txt b/demo/example-case-3/data/mock_articles/mock_A63278732/description.txt new file mode 100644 index 0000000..e8d2746 --- /dev/null +++ b/demo/example-case-3/data/mock_articles/mock_A63278732/description.txt @@ -0,0 +1,3 @@ +Labore atque perferendis adipisci cumque voluptas non ducimus minus hic repellat, sint dolorem architecto alias molestiae quos delectus perferendis optio enim sapiente. Temporibus quibusdam accusamus fugiat perspiciatis, labore reprehenderit incidunt ut mollitia numquam ea libero cumque rerum, atque ab possimus. + +Est tenetur blanditiis, esse ipsum architecto eligendi ducimus, delectus eius veniam soluta itaque libero amet ipsum dolore, ea doloremque facilis reprehenderit delectus ipsum error corporis eveniet eos quaerat asperiores, consequuntur pariatur porro dolore at. Aspernatur amet perferendis porro odio nobis eius, blanditiis veniam debitis velit deserunt vero cum neque explicabo omnis. diff --git a/demo/example-case-3/data/mock_articles/mock_A63278732/licence.txt b/demo/example-case-3/data/mock_articles/mock_A63278732/licence.txt new file mode 100644 index 0000000..d1f248f --- /dev/null +++ b/demo/example-case-3/data/mock_articles/mock_A63278732/licence.txt @@ -0,0 +1,5 @@ +Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. + +Dicta non delectus nisi reprehenderit, odit a incidunt eveniet ratione aspernatur distinctio beatae? Accusamus itaque deserunt perferendis ratione nihil quia odit excepturi numquam, provident voluptatum a perspiciatis accusantium mollitia est culpa possimus cumque tenetur quidem. + +Nihil harum ipsum, blanditiis iure impedit molestiae cumque ratione nihil doloribus eius facilis eum deleniti, ab corporis deserunt, fugit fuga officiis et blanditiis? Provident quos sed exercitationem iure necessitatibus rem, deserunt obcaecati vitae, eligendi quo id reiciendis iste asperiores autem, molestias cum ex beatae. Pariatur modi iste reiciendis sequi ipsam ipsa ducimus possimus iure, eius similique dolores amet officiis ipsum consectetur odio, totam placeat consequatur ipsam quae accusantium libero? Qui illo hic perferendis, adipisci ut ullam distinctio voluptatem a eaque error debitis praesentium atque culpa, hic iusto pariatur non blanditiis, aliquid commodi libero inventore vel laborum, aut quos reiciendis labore non nisi a harum rem facere? diff --git a/demo/example-case-3/data/mock_articles/mock_B18031017/description.txt b/demo/example-case-3/data/mock_articles/mock_B18031017/description.txt new file mode 100644 index 0000000..62a3899 --- /dev/null +++ b/demo/example-case-3/data/mock_articles/mock_B18031017/description.txt @@ -0,0 +1,3 @@ +Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. + +Fuga illo veritatis repellendus, iusto assumenda distinctio illo repellat facere mollitia saepe veritatis dignissimos nemo, adipisci nobis iure sequi ipsum laborum delectus deserunt cupiditate doloremque beatae esse, consequatur neque corporis totam assumenda labore eum voluptatibus facilis voluptates eius. Quos alias obcaecati, a atque excepturi. Atque dolore accusantium distinctio accusamus nisi voluptates voluptatem unde, animi illum dicta nam? Necessitatibus quidem cum perspiciatis quisquam esse aut reprehenderit quod facere dolores, debitis perferendis quibusdam repellendus necessitatibus eaque cupiditate sequi excepturi, eligendi sint illum. diff --git a/demo/example-case-3/data/mock_articles/mock_B18031017/licence.txt b/demo/example-case-3/data/mock_articles/mock_B18031017/licence.txt new file mode 100644 index 0000000..3974f06 --- /dev/null +++ b/demo/example-case-3/data/mock_articles/mock_B18031017/licence.txt @@ -0,0 +1,5 @@ +Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. + +Maxime dolor suscipit explicabo, cum molestias quibusdam esse quam nulla enim iure, doloremque cum numquam debitis molestias suscipit dolorem, reiciendis at id quia culpa repudiandae debitis deserunt quisquam iste nobis necessitatibus, accusantium eveniet ea? Optio itaque voluptatum similique, doloribus pariatur magni, nostrum facere harum, tenetur eos corrupti? Veritatis tenetur doloremque veniam, iste repellat libero nemo, quia aliquam ipsa quo ex, quo iusto maiores quos, quae culpa facere sint nobis nihil blanditiis necessitatibus? Quidem ratione officiis nisi minima maiores odit autem, pariatur consequatur architecto assumenda aperiam qui, ad iure natus aspernatur ratione quisquam eos esse vel. + +Ab fugiat sequi praesentium minus voluptates excepturi similique quam minima soluta, deserunt voluptatem quibusdam necessitatibus reiciendis ratione saepe, corrupti delectus soluta, eum ad deserunt sed tempora magni ex? Vel voluptatibus omnis libero consequatur impedit maiores recusandae corporis nemo, possimus velit voluptatem commodi sapiente voluptatibus facilis quo assumenda, consectetur aperiam quis architecto, quidem consectetur modi aliquid optio excepturi nulla voluptate quo quisquam accusantium? Quo eaque laborum quisquam incidunt quasi fugit sit eos, explicabo eveniet quia magnam obcaecati ipsa voluptates iusto. Qui placeat ut saepe, illum debitis a eum repellendus expedita consequatur? diff --git a/demo/example-case-3/data/mock_articles/mock_Z20009991/description.txt b/demo/example-case-3/data/mock_articles/mock_Z20009991/description.txt new file mode 100644 index 0000000..0a75369 --- /dev/null +++ b/demo/example-case-3/data/mock_articles/mock_Z20009991/description.txt @@ -0,0 +1,3 @@ +Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. + +Voluptate vel animi necessitatibus cumque, tenetur dolorem nobis. Iusto non ratione, adipisci asperiores impedit ullam autem quos velit nulla voluptatibus, velit cupiditate sed perspiciatis quisquam illo architecto saepe dignissimos at pariatur doloribus, odit debitis vitae quod illo voluptate dolorum incidunt cumque dolor, nihil rem suscipit? Doloribus perspiciatis fugit, pariatur optio at delectus quis aliquid tempore odio quas error corrupti, sed amet laudantium dolorem numquam maiores. Amet odit id, quasi aspernatur dolorem illo fugit aliquam laudantium perferendis quibusdam numquam recusandae adipisci, dolores hic accusamus necessitatibus delectus dolor dicta? diff --git a/demo/example-case-3/data/mock_articles/mock_Z20009991/licence.txt b/demo/example-case-3/data/mock_articles/mock_Z20009991/licence.txt new file mode 100644 index 0000000..68f3824 --- /dev/null +++ b/demo/example-case-3/data/mock_articles/mock_Z20009991/licence.txt @@ -0,0 +1,5 @@ +Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. + +Cum excepturi dignissimos mollitia eveniet voluptas nostrum ea harum voluptatum minus, earum consectetur distinctio recusandae iusto autem placeat quod obcaecati quos ullam dolorum? Neque dolore minus modi adipisci cupiditate facilis eligendi quidem iste, qui mollitia magnam voluptate fugiat iure, id doloremque ab? + +Maxime autem reprehenderit ipsum, quibusdam iste nulla odio nam et quis, iusto asperiores sit? Reiciendis magnam libero saepe rerum nostrum maxime quae laboriosam, quo nulla fugit quam ex quisquam? Quod deserunt veritatis, provident impedit adipisci in porro dolorem ducimus est ipsa quas sunt, voluptatum rerum nihil nostrum eius in, necessitatibus ipsa maiores ut modi iusto rem alias quos odio est velit. Exercitationem enim aliquam aspernatur, dolore odit assumenda doloremque ut rerum atque dolorum? diff --git a/demo/example-case-3/data/mock_companies/companies.csv b/demo/example-case-3/data/mock_companies/companies.csv new file mode 100644 index 0000000..e316051 --- /dev/null +++ b/demo/example-case-3/data/mock_companies/companies.csv @@ -0,0 +1,6 @@ +"Company" +"Amazon" +"ACME" +"GCHQ" +"Google" +"Nandos" diff --git a/demo/example-case-3/data/mock_empty logs/err.log b/demo/example-case-3/data/mock_empty logs/err.log new file mode 100644 index 0000000..e69de29 diff --git a/demo/example-case-3/data/mock_empty logs/out.log b/demo/example-case-3/data/mock_empty logs/out.log new file mode 100644 index 0000000..e69de29 diff --git a/demo/example-case-3/data/notes.md b/demo/example-case-3/data/notes.md new file mode 100644 index 0000000..a39635b --- /dev/null +++ b/demo/example-case-3/data/notes.md @@ -0,0 +1,10 @@ +# Notes # + +Folder structure + +```text +├── customers.csv +├── orders.csv +├── change.log +└── notes.md +``` diff --git a/demo/example-case-3/data/orders.csv b/demo/example-case-3/data/orders.csv new file mode 100644 index 0000000..ba2ce2d --- /dev/null +++ b/demo/example-case-3/data/orders.csv @@ -0,0 +1,6 @@ +"Id";"Customer.Id";"Article";"Qty";"Cost";"TotalCost";"Status";"Checked" +0;382;"A19038012";10;0.50;50.00;COMPLETED;true +1;103;"B18031017";8;4.57;36.56;COMPLETED;true +8;;"A63278732";;10.17;;ERROR;false +9;;"A63278732";20;10.17;203.4;CANCELLED;false +13;489;"Z20009991";3;0.10;0.30;PENDING;true diff --git a/demo/example-case-3/requests.yaml b/demo/example-case-3/requests.yaml new file mode 100644 index 0000000..a96c0ed --- /dev/null +++ b/demo/example-case-3/requests.yaml @@ -0,0 +1,12 @@ +label: 'Demo Case 3' + +options: + skip-empty: false + max-depth: 100 + max-items: 10_000_000 + max-duration: 00:30:00 + +data: + inputs: + location: OS + path: 'demo/example-case-3/data' diff --git a/demo/example-empty/README.md b/demo/example-empty/README.md new file mode 100644 index 0000000..0fc8680 --- /dev/null +++ b/demo/example-empty/README.md @@ -0,0 +1,19 @@ +# Example - Empty # + +Run as follows + +1. Open 2 terminals + +2. In terminal 1 start the queue + + ```bash + just docker-start-queue + ``` + +3. In terminal 2 run the command + + ```bash + just run SEARCH-FS --requests 'demo/example-empty/requests.yaml' + ```` + +This should yield 0 messages in the queue. diff --git a/demo/example-empty/data/.gitkeep b/demo/example-empty/data/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/demo/example-empty/requests.yaml b/demo/example-empty/requests.yaml new file mode 100644 index 0000000..75de3f9 --- /dev/null +++ b/demo/example-empty/requests.yaml @@ -0,0 +1,12 @@ +label: 'Demo Empty' + +options: + skip-empty: true + max-depth: 100 + max-items: 10_000_000 + max-duration: 00:30:00 + +data: + inputs: + location: OS + path: 'demo/example-empty/data' diff --git a/demo/example-flat/README.md b/demo/example-flat/README.md new file mode 100644 index 0000000..0a976ed --- /dev/null +++ b/demo/example-flat/README.md @@ -0,0 +1,19 @@ +# Example - Empty # + +Run as follows + +1. Open 2 terminals + +2. In terminal 1 start the queue + + ```bash + just docker-start-queue + ``` + +3. In terminal 2 run the command + + ```bash + just run SEARCH-FS --requests 'demo/example-flat/requests.yaml' + ```` + +This should yield 4 messages in the queue. diff --git a/demo/example-flat/data/change.log b/demo/example-flat/data/change.log new file mode 100644 index 0000000..eb009ef --- /dev/null +++ b/demo/example-flat/data/change.log @@ -0,0 +1,3 @@ +2025-10-01 added customers.csv +2025-10-08 added orders.csv +2025-10-09 filled in orders.csv diff --git a/demo/example-flat/data/customers.csv b/demo/example-flat/data/customers.csv new file mode 100644 index 0000000..1a4dfcf --- /dev/null +++ b/demo/example-flat/data/customers.csv @@ -0,0 +1,5 @@ +"Id";"Company";"Surname";"Name" +102;"ACME";"Hargrave";"Julianne" +103;"Google";"Schorche";"Iain" +227;;"Cruz";"David" +489;"Amazon";; diff --git a/demo/example-flat/data/notes.md b/demo/example-flat/data/notes.md new file mode 100644 index 0000000..a39635b --- /dev/null +++ b/demo/example-flat/data/notes.md @@ -0,0 +1,10 @@ +# Notes # + +Folder structure + +```text +├── customers.csv +├── orders.csv +├── change.log +└── notes.md +``` diff --git a/demo/example-flat/data/orders.csv b/demo/example-flat/data/orders.csv new file mode 100644 index 0000000..ba2ce2d --- /dev/null +++ b/demo/example-flat/data/orders.csv @@ -0,0 +1,6 @@ +"Id";"Customer.Id";"Article";"Qty";"Cost";"TotalCost";"Status";"Checked" +0;382;"A19038012";10;0.50;50.00;COMPLETED;true +1;103;"B18031017";8;4.57;36.56;COMPLETED;true +8;;"A63278732";;10.17;;ERROR;false +9;;"A63278732";20;10.17;203.4;CANCELLED;false +13;489;"Z20009991";3;0.10;0.30;PENDING;true diff --git a/demo/example-flat/requests.yaml b/demo/example-flat/requests.yaml new file mode 100644 index 0000000..9aa5b9a --- /dev/null +++ b/demo/example-flat/requests.yaml @@ -0,0 +1,12 @@ +label: 'Demo Flat' + +options: + skip-empty: true + max-depth: 100 + max-items: 10_000_000 + max-duration: 00:30:00 + +data: + inputs: + location: OS + path: 'demo/example-flat/data' diff --git a/justfile b/justfile index 983a2e5..89c96ec 100644 --- a/justfile +++ b/justfile @@ -297,6 +297,9 @@ check-time-matches-cron cron_expr time="*": create-mocks *args: @{{PYVENV_ON}} && {{PYVENV}} -m scripts.mocks {{args}} +demo name: + @just run SEARCH-FS --requests "demo/{{name}}/requests.yaml" + # -------------------------------- # TARGETS: terminate execution # -------------------------------- From 4736dabeaae1705214a17ab126d4b227165c2a98 Mon Sep 17 00:00:00 2001 From: raj-open Date: Sun, 2 Nov 2025 11:43:06 +0100 Subject: [PATCH 08/12] story-algorithm > staging: `bugfix` - handled empty case NOTE: need to yield from empty list to ensure that function is always treated like generator. --- src/algorithms/filesmanager/search.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/algorithms/filesmanager/search.py b/src/algorithms/filesmanager/search.py index 9ee0056..8286007 100644 --- a/src/algorithms/filesmanager/search.py +++ b/src/algorithms/filesmanager/search.py @@ -61,7 +61,7 @@ def recursive_file_search( """ # create and initialise queue q = deque[tuple[int, str | list[str]]]() - q.append[(0, path)] + q.append((0, path)) # keep alive as long as queue not empty while (L := len(q)) > 0: @@ -102,6 +102,10 @@ def recursive_file_search( if len(paths := folder.get_subfolder_paths()) > 0: q.append((d + 1, paths)) + # DEV-NOTE: ensures that something is yielded for the empty case + empty = list[tuple[int, str, str]]() + yield from empty + # ---------------------------------------------------------------- # AUXILIARY METHODS From 4ac3def9df0f8d286d74c61ccfc9ae3051a2b290 Mon Sep 17 00:00:00 2001 From: raj-open Date: Sun, 2 Nov 2025 11:43:43 +0100 Subject: [PATCH 09/12] story-algorithm > staging: `bugfix` - fixed issue with channels closing immediately --- src/models/apis/queue/channels.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/models/apis/queue/channels.py b/src/models/apis/queue/channels.py index 74a5995..8960964 100644 --- a/src/models/apis/queue/channels.py +++ b/src/models/apis/queue/channels.py @@ -12,6 +12,7 @@ from pika.adapters.blocking_connection import BlockingChannel from pydantic import BaseModel from pydantic import ConfigDict +from pydantic import Field from pydantic import SkipValidation # ---------------------------------------------------------------- @@ -38,7 +39,8 @@ class ChannelStruct(BaseModel): ) settings: SkipValidation[ConnectionParameters] - channel: SkipValidation[BlockingChannel] | None = None + connection: SkipValidation[BlockingConnection] | None = Field(default=None, init=False) + channel: SkipValidation[BlockingChannel] | None = Field(default=None, init=False) class ChannelContext(ChannelStruct): @@ -47,12 +49,17 @@ class ChannelContext(ChannelStruct): """ def __enter__(self) -> BlockingChannel: - with BlockingConnection(self.settings) as connection: - self.channel = connection.channel() - return self.channel + self.connection = BlockingConnection(self.settings) + self.channel = self.connection.channel() + return self.channel def __exit__(self, *_, **__): logging.info("gracefully terminating channel") - if self.channel is not None: + + if isinstance(self.channel, BlockingChannel): self.channel.close() + + if isinstance(self.connection, BlockingConnection): + self.connection.close() + return From fcf6b2de642bfd42daa63ff1c7d61aea02479727 Mon Sep 17 00:00:00 2001 From: raj-open Date: Sun, 2 Nov 2025 12:09:24 +0100 Subject: [PATCH 10/12] story-algorithm > staging: cleaned up and updated demos + documentation --- .gitignore | 2 ++ README.md | 5 +++ demo/README.md | 14 +++++--- demo/example-case-1/README.md | 13 +++++++- demo/example-case-2/README.md | 13 +++++++- demo/example-case-3/README.md | 15 +++++++-- demo/example-case-3/requests.yaml | 2 +- demo/example-case-4/README.md | 30 ++++++++++++++++++ demo/example-case-4/data/change.log | 3 ++ demo/example-case-4/data/customers.csv | 5 +++ .../data/mock_articles/articles.csv | 5 +++ .../mock_A19038012/description.txt | 3 ++ .../mock_articles/mock_A19038012/licence.txt | 5 +++ .../mock_A63278732/description.txt | 3 ++ .../mock_articles/mock_A63278732/licence.txt | 5 +++ .../mock_B18031017/description.txt | 3 ++ .../mock_articles/mock_B18031017/licence.txt | 5 +++ .../mock_Z20009991/description.txt | 3 ++ .../mock_articles/mock_Z20009991/licence.txt | 5 +++ .../data/mock_companies/companies.csv | 6 ++++ .../data/mock_empty logs/err.log | 0 .../data/mock_empty logs/out.log | 0 demo/example-case-4/data/notes.md | 10 ++++++ demo/example-case-4/data/orders.csv | 6 ++++ demo/example-case-4/requests.yaml | 12 +++++++ demo/example-empty/README.md | 11 ++++++- demo/example-flat/README.md | 14 ++++++-- demo/example-flat/data/empty.txt | 0 demo/img/results-demo.png | Bin 0 -> 126899 bytes 29 files changed, 186 insertions(+), 12 deletions(-) create mode 100644 demo/example-case-4/README.md create mode 100644 demo/example-case-4/data/change.log create mode 100644 demo/example-case-4/data/customers.csv create mode 100644 demo/example-case-4/data/mock_articles/articles.csv create mode 100644 demo/example-case-4/data/mock_articles/mock_A19038012/description.txt create mode 100644 demo/example-case-4/data/mock_articles/mock_A19038012/licence.txt create mode 100644 demo/example-case-4/data/mock_articles/mock_A63278732/description.txt create mode 100644 demo/example-case-4/data/mock_articles/mock_A63278732/licence.txt create mode 100644 demo/example-case-4/data/mock_articles/mock_B18031017/description.txt create mode 100644 demo/example-case-4/data/mock_articles/mock_B18031017/licence.txt create mode 100644 demo/example-case-4/data/mock_articles/mock_Z20009991/description.txt create mode 100644 demo/example-case-4/data/mock_articles/mock_Z20009991/licence.txt create mode 100644 demo/example-case-4/data/mock_companies/companies.csv create mode 100644 demo/example-case-4/data/mock_empty logs/err.log create mode 100644 demo/example-case-4/data/mock_empty logs/out.log create mode 100644 demo/example-case-4/data/notes.md create mode 100644 demo/example-case-4/data/orders.csv create mode 100644 demo/example-case-4/requests.yaml create mode 100644 demo/example-flat/data/empty.txt create mode 100644 demo/img/results-demo.png diff --git a/.gitignore b/.gitignore index c473518..608daa9 100644 --- a/.gitignore +++ b/.gitignore @@ -70,6 +70,8 @@ !/demo/example*/data/**/*.log !/demo/example*/README.md !/demo/example*/requests.yaml +!/demo/img +!/demo/img/*.png # ---------------------------------------------------------------- # FORCE REMOVE diff --git a/README.md b/README.md index 729013d..1c76119 100644 --- a/README.md +++ b/README.md @@ -191,6 +191,7 @@ label: 'Mock example' # apply some generous limits options: + # skip-empty: true # false (default) => includes empty files; true => skips them max-depth: 100 # limits depth of folder structure max-items: 1_000_000 # limits number of items that can be logged max-duration: 00:05:00 # limits maximum computation time @@ -234,3 +235,7 @@ data: The file reference in this body can of course be a json and located anywhere on your system. + +## Demos ## + +Some simple example cases can be found in the [demo](demo) folder. diff --git a/demo/README.md b/demo/README.md index 1ca5284..51c4b74 100644 --- a/demo/README.md +++ b/demo/README.md @@ -1,13 +1,13 @@ -# Demo # +# Demo # -Each folder in this directory contains an example file system with requests config. +Each folder in this directory contains an example filesystem with requests config. The README file in each folder explains how to run tool against the case and the expected outcome. -For ease of use one can also run the demos as follows: +## General usage ## -Run as follows +For ease of use one can also run the demos as follows: 1. Open 2 terminals @@ -24,3 +24,9 @@ Run as follows ```` where `{name}` is the name of the subfolder, e.g. `"example-case-1"`. + +## Results ## + +The current demos should result in the following: + +![Results](./img/results-demo.png) diff --git a/demo/example-case-1/README.md b/demo/example-case-1/README.md index 7280380..5e4d5f6 100644 --- a/demo/example-case-1/README.md +++ b/demo/example-case-1/README.md @@ -1,5 +1,12 @@ # Example - Case 1 # +## Description ## + +- An nearly flat filesystem with a nested folder containing empty files. +- `skip-empty` set to `true` + +## Execution ## + Run as follows 1. Open 2 terminals @@ -16,4 +23,8 @@ Run as follows just run SEARCH-FS --requests 'demo/example-case-1/requests.yaml' ```` -This should yield 4 messages in the queue - the empty logs should be skipped. +## Expected results ## + +- Should yield 4 messages in the queue. +- Only the folders at lowest level should be logged. +- The nested subfolder containing empty logs should be skipped. diff --git a/demo/example-case-2/README.md b/demo/example-case-2/README.md index b2df1aa..14d6125 100644 --- a/demo/example-case-2/README.md +++ b/demo/example-case-2/README.md @@ -1,5 +1,12 @@ # Example - Case 2 # +## Description ## + +- An nearly flat file system with a nested folder containing empty files. +- `skip-empty` set to `false` + +## Execution ## + Run as follows 1. Open 2 terminals @@ -16,4 +23,8 @@ Run as follows just run SEARCH-FS --requests 'demo/example-case-2/requests.yaml' ```` -This should yield 6 messages in the queue - the empty logs should _not_ be skipped. +## Expected results ## + +- Should yield 6 messages in the queue. +- The folders at lowest level should be logged. +- The nested subfolder containing empty logs should _not_ be skipped. diff --git a/demo/example-case-3/README.md b/demo/example-case-3/README.md index 13de843..73e35e3 100644 --- a/demo/example-case-3/README.md +++ b/demo/example-case-3/README.md @@ -1,5 +1,12 @@ # Example - Case 3 # +## Description ## + +- A nested filesystem with some empty files +- `skip-empty` set to `true` + +## Execution ## + Run as follows 1. Open 2 terminals @@ -14,6 +21,10 @@ Run as follows ```bash just run SEARCH-FS --requests 'demo/example-case-3/requests.yaml' - ```` + ``` + +## Expected results ## -This should yield 6 messages in the queue - the empty logs should _not_ be skipped. +- Should yield 14 messages in the queue. +- All files at all levels should be covered. +- The nested subfolder containing empty logs should be skipped. diff --git a/demo/example-case-3/requests.yaml b/demo/example-case-3/requests.yaml index a96c0ed..f4ca6bc 100644 --- a/demo/example-case-3/requests.yaml +++ b/demo/example-case-3/requests.yaml @@ -1,7 +1,7 @@ label: 'Demo Case 3' options: - skip-empty: false + skip-empty: true max-depth: 100 max-items: 10_000_000 max-duration: 00:30:00 diff --git a/demo/example-case-4/README.md b/demo/example-case-4/README.md new file mode 100644 index 0000000..5651b79 --- /dev/null +++ b/demo/example-case-4/README.md @@ -0,0 +1,30 @@ +# Example - Case 4 # + +## Description ## + +- A nested filesystem with some empty files +- `skip-empty` set to `false` + +## Execution ## + +Run as follows + +1. Open 2 terminals + +2. In terminal 1 start the queue + + ```bash + just docker-start-queue + ``` + +3. In terminal 2 run the command + + ```bash + just run SEARCH-FS --requests 'demo/example-case-4/requests.yaml' + ```` + +## Expected results ## + +- Should yield 26 messages in the queue. +- All files at all levels should be covered. +- The nested subfolder containing empty logs should _not_ be skipped. diff --git a/demo/example-case-4/data/change.log b/demo/example-case-4/data/change.log new file mode 100644 index 0000000..eb009ef --- /dev/null +++ b/demo/example-case-4/data/change.log @@ -0,0 +1,3 @@ +2025-10-01 added customers.csv +2025-10-08 added orders.csv +2025-10-09 filled in orders.csv diff --git a/demo/example-case-4/data/customers.csv b/demo/example-case-4/data/customers.csv new file mode 100644 index 0000000..1a4dfcf --- /dev/null +++ b/demo/example-case-4/data/customers.csv @@ -0,0 +1,5 @@ +"Id";"Company";"Surname";"Name" +102;"ACME";"Hargrave";"Julianne" +103;"Google";"Schorche";"Iain" +227;;"Cruz";"David" +489;"Amazon";; diff --git a/demo/example-case-4/data/mock_articles/articles.csv b/demo/example-case-4/data/mock_articles/articles.csv new file mode 100644 index 0000000..35c0e15 --- /dev/null +++ b/demo/example-case-4/data/mock_articles/articles.csv @@ -0,0 +1,5 @@ +"Article";"Cost" +"A19038012";0.50 +"A63278732";10.17 +"B18031017";4.57 +"Z20009991";0.10 diff --git a/demo/example-case-4/data/mock_articles/mock_A19038012/description.txt b/demo/example-case-4/data/mock_articles/mock_A19038012/description.txt new file mode 100644 index 0000000..e8d2746 --- /dev/null +++ b/demo/example-case-4/data/mock_articles/mock_A19038012/description.txt @@ -0,0 +1,3 @@ +Labore atque perferendis adipisci cumque voluptas non ducimus minus hic repellat, sint dolorem architecto alias molestiae quos delectus perferendis optio enim sapiente. Temporibus quibusdam accusamus fugiat perspiciatis, labore reprehenderit incidunt ut mollitia numquam ea libero cumque rerum, atque ab possimus. + +Est tenetur blanditiis, esse ipsum architecto eligendi ducimus, delectus eius veniam soluta itaque libero amet ipsum dolore, ea doloremque facilis reprehenderit delectus ipsum error corporis eveniet eos quaerat asperiores, consequuntur pariatur porro dolore at. Aspernatur amet perferendis porro odio nobis eius, blanditiis veniam debitis velit deserunt vero cum neque explicabo omnis. diff --git a/demo/example-case-4/data/mock_articles/mock_A19038012/licence.txt b/demo/example-case-4/data/mock_articles/mock_A19038012/licence.txt new file mode 100644 index 0000000..d1f248f --- /dev/null +++ b/demo/example-case-4/data/mock_articles/mock_A19038012/licence.txt @@ -0,0 +1,5 @@ +Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. + +Dicta non delectus nisi reprehenderit, odit a incidunt eveniet ratione aspernatur distinctio beatae? Accusamus itaque deserunt perferendis ratione nihil quia odit excepturi numquam, provident voluptatum a perspiciatis accusantium mollitia est culpa possimus cumque tenetur quidem. + +Nihil harum ipsum, blanditiis iure impedit molestiae cumque ratione nihil doloribus eius facilis eum deleniti, ab corporis deserunt, fugit fuga officiis et blanditiis? Provident quos sed exercitationem iure necessitatibus rem, deserunt obcaecati vitae, eligendi quo id reiciendis iste asperiores autem, molestias cum ex beatae. Pariatur modi iste reiciendis sequi ipsam ipsa ducimus possimus iure, eius similique dolores amet officiis ipsum consectetur odio, totam placeat consequatur ipsam quae accusantium libero? Qui illo hic perferendis, adipisci ut ullam distinctio voluptatem a eaque error debitis praesentium atque culpa, hic iusto pariatur non blanditiis, aliquid commodi libero inventore vel laborum, aut quos reiciendis labore non nisi a harum rem facere? diff --git a/demo/example-case-4/data/mock_articles/mock_A63278732/description.txt b/demo/example-case-4/data/mock_articles/mock_A63278732/description.txt new file mode 100644 index 0000000..e8d2746 --- /dev/null +++ b/demo/example-case-4/data/mock_articles/mock_A63278732/description.txt @@ -0,0 +1,3 @@ +Labore atque perferendis adipisci cumque voluptas non ducimus minus hic repellat, sint dolorem architecto alias molestiae quos delectus perferendis optio enim sapiente. Temporibus quibusdam accusamus fugiat perspiciatis, labore reprehenderit incidunt ut mollitia numquam ea libero cumque rerum, atque ab possimus. + +Est tenetur blanditiis, esse ipsum architecto eligendi ducimus, delectus eius veniam soluta itaque libero amet ipsum dolore, ea doloremque facilis reprehenderit delectus ipsum error corporis eveniet eos quaerat asperiores, consequuntur pariatur porro dolore at. Aspernatur amet perferendis porro odio nobis eius, blanditiis veniam debitis velit deserunt vero cum neque explicabo omnis. diff --git a/demo/example-case-4/data/mock_articles/mock_A63278732/licence.txt b/demo/example-case-4/data/mock_articles/mock_A63278732/licence.txt new file mode 100644 index 0000000..d1f248f --- /dev/null +++ b/demo/example-case-4/data/mock_articles/mock_A63278732/licence.txt @@ -0,0 +1,5 @@ +Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. + +Dicta non delectus nisi reprehenderit, odit a incidunt eveniet ratione aspernatur distinctio beatae? Accusamus itaque deserunt perferendis ratione nihil quia odit excepturi numquam, provident voluptatum a perspiciatis accusantium mollitia est culpa possimus cumque tenetur quidem. + +Nihil harum ipsum, blanditiis iure impedit molestiae cumque ratione nihil doloribus eius facilis eum deleniti, ab corporis deserunt, fugit fuga officiis et blanditiis? Provident quos sed exercitationem iure necessitatibus rem, deserunt obcaecati vitae, eligendi quo id reiciendis iste asperiores autem, molestias cum ex beatae. Pariatur modi iste reiciendis sequi ipsam ipsa ducimus possimus iure, eius similique dolores amet officiis ipsum consectetur odio, totam placeat consequatur ipsam quae accusantium libero? Qui illo hic perferendis, adipisci ut ullam distinctio voluptatem a eaque error debitis praesentium atque culpa, hic iusto pariatur non blanditiis, aliquid commodi libero inventore vel laborum, aut quos reiciendis labore non nisi a harum rem facere? diff --git a/demo/example-case-4/data/mock_articles/mock_B18031017/description.txt b/demo/example-case-4/data/mock_articles/mock_B18031017/description.txt new file mode 100644 index 0000000..62a3899 --- /dev/null +++ b/demo/example-case-4/data/mock_articles/mock_B18031017/description.txt @@ -0,0 +1,3 @@ +Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. + +Fuga illo veritatis repellendus, iusto assumenda distinctio illo repellat facere mollitia saepe veritatis dignissimos nemo, adipisci nobis iure sequi ipsum laborum delectus deserunt cupiditate doloremque beatae esse, consequatur neque corporis totam assumenda labore eum voluptatibus facilis voluptates eius. Quos alias obcaecati, a atque excepturi. Atque dolore accusantium distinctio accusamus nisi voluptates voluptatem unde, animi illum dicta nam? Necessitatibus quidem cum perspiciatis quisquam esse aut reprehenderit quod facere dolores, debitis perferendis quibusdam repellendus necessitatibus eaque cupiditate sequi excepturi, eligendi sint illum. diff --git a/demo/example-case-4/data/mock_articles/mock_B18031017/licence.txt b/demo/example-case-4/data/mock_articles/mock_B18031017/licence.txt new file mode 100644 index 0000000..3974f06 --- /dev/null +++ b/demo/example-case-4/data/mock_articles/mock_B18031017/licence.txt @@ -0,0 +1,5 @@ +Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. + +Maxime dolor suscipit explicabo, cum molestias quibusdam esse quam nulla enim iure, doloremque cum numquam debitis molestias suscipit dolorem, reiciendis at id quia culpa repudiandae debitis deserunt quisquam iste nobis necessitatibus, accusantium eveniet ea? Optio itaque voluptatum similique, doloribus pariatur magni, nostrum facere harum, tenetur eos corrupti? Veritatis tenetur doloremque veniam, iste repellat libero nemo, quia aliquam ipsa quo ex, quo iusto maiores quos, quae culpa facere sint nobis nihil blanditiis necessitatibus? Quidem ratione officiis nisi minima maiores odit autem, pariatur consequatur architecto assumenda aperiam qui, ad iure natus aspernatur ratione quisquam eos esse vel. + +Ab fugiat sequi praesentium minus voluptates excepturi similique quam minima soluta, deserunt voluptatem quibusdam necessitatibus reiciendis ratione saepe, corrupti delectus soluta, eum ad deserunt sed tempora magni ex? Vel voluptatibus omnis libero consequatur impedit maiores recusandae corporis nemo, possimus velit voluptatem commodi sapiente voluptatibus facilis quo assumenda, consectetur aperiam quis architecto, quidem consectetur modi aliquid optio excepturi nulla voluptate quo quisquam accusantium? Quo eaque laborum quisquam incidunt quasi fugit sit eos, explicabo eveniet quia magnam obcaecati ipsa voluptates iusto. Qui placeat ut saepe, illum debitis a eum repellendus expedita consequatur? diff --git a/demo/example-case-4/data/mock_articles/mock_Z20009991/description.txt b/demo/example-case-4/data/mock_articles/mock_Z20009991/description.txt new file mode 100644 index 0000000..0a75369 --- /dev/null +++ b/demo/example-case-4/data/mock_articles/mock_Z20009991/description.txt @@ -0,0 +1,3 @@ +Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. + +Voluptate vel animi necessitatibus cumque, tenetur dolorem nobis. Iusto non ratione, adipisci asperiores impedit ullam autem quos velit nulla voluptatibus, velit cupiditate sed perspiciatis quisquam illo architecto saepe dignissimos at pariatur doloribus, odit debitis vitae quod illo voluptate dolorum incidunt cumque dolor, nihil rem suscipit? Doloribus perspiciatis fugit, pariatur optio at delectus quis aliquid tempore odio quas error corrupti, sed amet laudantium dolorem numquam maiores. Amet odit id, quasi aspernatur dolorem illo fugit aliquam laudantium perferendis quibusdam numquam recusandae adipisci, dolores hic accusamus necessitatibus delectus dolor dicta? diff --git a/demo/example-case-4/data/mock_articles/mock_Z20009991/licence.txt b/demo/example-case-4/data/mock_articles/mock_Z20009991/licence.txt new file mode 100644 index 0000000..68f3824 --- /dev/null +++ b/demo/example-case-4/data/mock_articles/mock_Z20009991/licence.txt @@ -0,0 +1,5 @@ +Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. + +Cum excepturi dignissimos mollitia eveniet voluptas nostrum ea harum voluptatum minus, earum consectetur distinctio recusandae iusto autem placeat quod obcaecati quos ullam dolorum? Neque dolore minus modi adipisci cupiditate facilis eligendi quidem iste, qui mollitia magnam voluptate fugiat iure, id doloremque ab? + +Maxime autem reprehenderit ipsum, quibusdam iste nulla odio nam et quis, iusto asperiores sit? Reiciendis magnam libero saepe rerum nostrum maxime quae laboriosam, quo nulla fugit quam ex quisquam? Quod deserunt veritatis, provident impedit adipisci in porro dolorem ducimus est ipsa quas sunt, voluptatum rerum nihil nostrum eius in, necessitatibus ipsa maiores ut modi iusto rem alias quos odio est velit. Exercitationem enim aliquam aspernatur, dolore odit assumenda doloremque ut rerum atque dolorum? diff --git a/demo/example-case-4/data/mock_companies/companies.csv b/demo/example-case-4/data/mock_companies/companies.csv new file mode 100644 index 0000000..e316051 --- /dev/null +++ b/demo/example-case-4/data/mock_companies/companies.csv @@ -0,0 +1,6 @@ +"Company" +"Amazon" +"ACME" +"GCHQ" +"Google" +"Nandos" diff --git a/demo/example-case-4/data/mock_empty logs/err.log b/demo/example-case-4/data/mock_empty logs/err.log new file mode 100644 index 0000000..e69de29 diff --git a/demo/example-case-4/data/mock_empty logs/out.log b/demo/example-case-4/data/mock_empty logs/out.log new file mode 100644 index 0000000..e69de29 diff --git a/demo/example-case-4/data/notes.md b/demo/example-case-4/data/notes.md new file mode 100644 index 0000000..a39635b --- /dev/null +++ b/demo/example-case-4/data/notes.md @@ -0,0 +1,10 @@ +# Notes # + +Folder structure + +```text +├── customers.csv +├── orders.csv +├── change.log +└── notes.md +``` diff --git a/demo/example-case-4/data/orders.csv b/demo/example-case-4/data/orders.csv new file mode 100644 index 0000000..ba2ce2d --- /dev/null +++ b/demo/example-case-4/data/orders.csv @@ -0,0 +1,6 @@ +"Id";"Customer.Id";"Article";"Qty";"Cost";"TotalCost";"Status";"Checked" +0;382;"A19038012";10;0.50;50.00;COMPLETED;true +1;103;"B18031017";8;4.57;36.56;COMPLETED;true +8;;"A63278732";;10.17;;ERROR;false +9;;"A63278732";20;10.17;203.4;CANCELLED;false +13;489;"Z20009991";3;0.10;0.30;PENDING;true diff --git a/demo/example-case-4/requests.yaml b/demo/example-case-4/requests.yaml new file mode 100644 index 0000000..4cdaccc --- /dev/null +++ b/demo/example-case-4/requests.yaml @@ -0,0 +1,12 @@ +label: 'Demo Case 4' + +options: + skip-empty: false + max-depth: 100 + max-items: 10_000_000 + max-duration: 00:30:00 + +data: + inputs: + location: OS + path: 'demo/example-case-4/data' diff --git a/demo/example-empty/README.md b/demo/example-empty/README.md index 0fc8680..9486c02 100644 --- a/demo/example-empty/README.md +++ b/demo/example-empty/README.md @@ -1,5 +1,12 @@ # Example - Empty # +## Description ## + +- An "empty" folder +- `skip-empty` set to `true` + +## Execution ## + Run as follows 1. Open 2 terminals @@ -16,4 +23,6 @@ Run as follows just run SEARCH-FS --requests 'demo/example-empty/requests.yaml' ```` -This should yield 0 messages in the queue. +## Expected results ## + +- Should yield 0 messages in the queue. diff --git a/demo/example-flat/README.md b/demo/example-flat/README.md index 0a976ed..398c3c3 100644 --- a/demo/example-flat/README.md +++ b/demo/example-flat/README.md @@ -1,4 +1,11 @@ -# Example - Empty # +# Example - Flat # + +## Description ## + +- An folder with no nesting. +- `skip-empty` set to `true` + +## Execution ## Run as follows @@ -16,4 +23,7 @@ Run as follows just run SEARCH-FS --requests 'demo/example-flat/requests.yaml' ```` -This should yield 4 messages in the queue. +## Expected results ## + +- Should yield 4 messages in the queue. +- The empty file should be skipped. diff --git a/demo/example-flat/data/empty.txt b/demo/example-flat/data/empty.txt new file mode 100644 index 0000000..e69de29 diff --git a/demo/img/results-demo.png b/demo/img/results-demo.png new file mode 100644 index 0000000000000000000000000000000000000000..0055b71b154b87d88323f441038c2f1827d06df0 GIT binary patch literal 126899 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

nYcEtqJrKQVF!SC$F@$A29o8>Qa1aR&l5=pS0 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 literal 0 HcmV?d00001 From 4a84b00d2909cf478265b382e2ea6bc260f099cc Mon Sep 17 00:00:00 2001 From: raj-open Date: Sun, 2 Nov 2025 12:23:00 +0100 Subject: [PATCH 11/12] staging > main: added badges --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 1c76119..fca58d1 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,11 @@ +[![Rabbit MQ](https://img.shields.io/badge/-RabbitMQ-FF6600?style=flat&logo=rabbitmq&logoColor=white)](https://www.rabbitmq.com) [![Python version: 3.14](https://img.shields.io/badge/python%20version-3.14-1464b4.svg)](https://www.python.org) [![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff) [![qa manual:main](https://github.com/raj-open/example-rabbit-mq/actions/workflows/manual.yaml/badge.svg?branch=main)](https://github.com/raj-open/example-rabbit-mq/actions/workflows/manual.yaml) [![qa manual:staging](https://github.com/raj-open/example-rabbit-mq/actions/workflows/manual.yaml/badge.svg?branch=staging)](https://github.com/raj-open/example-rabbit-mq/actions/workflows/manual.yaml) +[![qa auto:main](https://github.com/raj-open/example-rabbit-mq/actions/workflows/auto.yaml/badge.svg?branch=main)](https://github.com/raj-open/example-rabbit-mq/actions/workflows/auto.yaml) [![qa auto:staging](https://github.com/raj-open/example-rabbit-mq/actions/workflows/auto.yaml/badge.svg?branch=staging)](https://github.com/raj-open/example-rabbit-mq/actions/workflows/auto.yaml) [![qa auto:current](https://github.com/raj-open/example-rabbit-mq/actions/workflows/auto.yaml/badge.svg)](https://github.com/raj-open/example-rabbit-mq/actions/workflows/auto.yaml) @@ -189,7 +191,6 @@ Fill in `setup/requests.yaml` as follows: ```yaml label: 'Mock example' -# apply some generous limits options: # skip-empty: true # false (default) => includes empty files; true => skips them max-depth: 100 # limits depth of folder structure From 4d52249e4d4201e4e9aced6423c644275b013de1 Mon Sep 17 00:00:00 2001 From: raj-open Date: Sun, 2 Nov 2025 12:24:08 +0100 Subject: [PATCH 12/12] staging > main: VERSION bump (minor) --- dist/VERSION | 2 +- models/schema-application.yaml | 2 +- pyproject.toml | 2 +- uv.lock | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/dist/VERSION b/dist/VERSION index 0c62199..0d91a54 100644 --- a/dist/VERSION +++ b/dist/VERSION @@ -1 +1 @@ -0.2.1 +0.3.0 diff --git a/models/schema-application.yaml b/models/schema-application.yaml index fad5712..3f22174 100644 --- a/models/schema-application.yaml +++ b/models/schema-application.yaml @@ -1,6 +1,6 @@ openapi: 3.0.3 info: - version: "0.2.1" + version: "0.3.0" title: General models for application description: |- Schemata for data models in application - configs, enums, etc. diff --git a/pyproject.toml b/pyproject.toml index 425b38e..30fa0d9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "example-rabbit-mq" -version = "0.2.1" +version = "0.3.0" description = 'Example tool to recursively search a file system from a given point and message rabbit mq' authors = [ {name="raj-open", email="raj-open@users.noreply.github.com"}, diff --git a/uv.lock b/uv.lock index d95ef96..518c3ba 100644 --- a/uv.lock +++ b/uv.lock @@ -541,7 +541,7 @@ wheels = [ [[package]] name = "example-rabbit-mq" -version = "0.2.1" +version = "0.3.0" source = { virtual = "." } dependencies = [ { name = "argparse" },