Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Is your feature request related to a problem? Please describe. A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
Describe the solution you'd like A clear and concise description of what you want to happen.
Describe alternatives you've considered A clear and concise description of any alternative solutions or features you've considered.
Additional context Add any other context or screenshots about the feature request here.
Describe the bug A clear and concise description of what the bug is.
To Reproduce Steps to reproduce the behavior:
Go to '...'
Click on '....'
Scroll down to '....'
See error
Expected behavior A clear and concise description of what you expected to happen.
Screenshots If applicable, add screenshots to help explain your problem.
Desktop (please complete the following information):
OS: [e.g. iOS]
Browser [e.g. chrome, safari]
Version [e.g. 22]
Smartphone (please complete the following information):
Device: [e.g. iPhone6]
OS: [e.g. iOS8.1]
Browser [e.g. stock browser, safari]
Version [e.g. 22]
Additional context Add any other context about the problem here.
We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation.
We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.
Examples of behavior that contributes to a positive environment for our community include:
Demonstrating empathy and kindness toward other people
Being respectful of differing opinions, viewpoints, and experiences
Giving and gracefully accepting constructive feedback
Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience
Focusing on what is best not just for us as individuals, but for the overall community
Examples of unacceptable behavior include:
The use of sexualized language or imagery, and sexual attention or advances of any kind
Trolling, insulting or derogatory comments, and personal or political attacks
Public or private harassment
Publishing others' private information, such as a physical or email address, without their explicit permission
Other conduct which could reasonably be considered inappropriate in a professional setting
Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful.
Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate.
This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event.
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at contact@luxoria.bluepelicansoft.com. All complaints will be reviewed and investigated promptly and fairly.
All community leaders are obligated to respect the privacy and security of the reporter of any incident.
Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct:
Community Impact: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community.
Consequence: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested.
Community Impact: A violation through a single incident or series of actions.
Consequence: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban.
Community Impact: A serious violation of community standards, including sustained inappropriate behavior.
Consequence: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban.
Community Impact: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals.
Consequence: A permanent ban from any sort of public interaction within the community.
For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.
Name: Luxoria - Pull Request
Title: [L__] - (____) ...
Assignees:
Provide a brief summary of the changes in this PR, including any context necessary for understanding it.
Fixes #<issue_number> Closes #<issue_number>
Provide a brief description of how you tested your changes. Include details about the environment and test cases used.
Attach any screenshots that help illustrate the changes made in this PR.
Add any additional information or context about the PR here.
This Code of Conduct is adapted from the , version 2.0, available at https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
Community Impact Guidelines were inspired by .
My PR title follows the format.
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
Definitions.
"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.
"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.
Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.
Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.
Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:
(a) You must give any other recipients of the Work or Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.
You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.
Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.
Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.
Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.
Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.
Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
Copyright 2024 Luxoria
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
Describe the bug A clear and concise description of what the bug is.
To Reproduce Steps to reproduce the behavior:
Go to '...'
Click on '....'
Scroll down to '....'
See error
Expected behavior A clear and concise description of what you expected to happen.
Screenshots If applicable, add screenshots to help explain your problem.
Desktop (please complete the following information):
OS: [e.g. iOS]
Browser [e.g. chrome, safari]
Version [e.g. 22]
Smartphone (please complete the following information):
Device: [e.g. iPhone6]
OS: [e.g. iOS8.1]
Browser [e.g. stock browser, safari]
Version [e.g. 22]
Additional context Add any other context about the problem here.
Describe the bug A clear and concise description of what the bug is.
To Reproduce Steps to reproduce the behavior:
Go to '...'
Click on '....'
Scroll down to '....'
See error
Expected behavior A clear and concise description of what you expected to happen.
Screenshots If applicable, add screenshots to help explain your problem.
Desktop (please complete the following information):
OS: [e.g. iOS]
Browser [e.g. chrome, safari]
Version [e.g. 22]
Smartphone (please complete the following information):
Device: [e.g. iPhone6]
OS: [e.g. iOS8.1]
Browser [e.g. stock browser, safari]
Version [e.g. 22]
Additional context Add any other context about the problem here.
Is your feature request related to a problem? Please describe. A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
Describe the solution you'd like A clear and concise description of what you want to happen.
Describe alternatives you've considered A clear and concise description of any alternative solutions or features you've considered.
Additional context Add any other context or screenshots about the feature request here.
Is your feature request related to a problem? Please describe. A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
Describe the solution you'd like A clear and concise description of what you want to happen.
Describe alternatives you've considered A clear and concise description of any alternative solutions or features you've considered.
Additional context Add any other context or screenshots about the feature request here.
This template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue 3 <script setup>
SFCs, check out the to learn more.
Learn more about the recommended Project Setup and IDE Support in the .
Luxoria Desktop Software (Main Release)
Luxoria is a powerful all-in-one photography solution designed to streamline your workflow. Whether you are an individual photographer or part of a team, Luxoria makes it easy to manage and enhance your images, collaborate with clients, and deliver exceptional results.
Luxoria offers photographers a comprehensive solution to optimize their image workflow. Our desktop application simplifies the process of importing, organizing, editing, and exporting images, while our web platform enables easy sharing and client feedback. The platform ensures photographers can focus on their creative process while effortlessly managing their projects.
Import images directly from your camera or storage devices.
Organize your photos into albums and collections.
Edit with a wide range of powerful editing tools, including AI enhancements.
Collaborate with clients to refine and finalize image selections.
Export to multiple formats with one-click options.
Share images via a web gallery.
Allow clients to view and select their favorite photos.
Collect feedback directly from clients in real-time.
Image Importation: Seamless image import from cameras or local storage.
Smart Organization: Organize images into albums, collections, or folders based on date, location, camera settings, and more.
Advanced Filters: Search and filter images by metadata, including date, location, and camera settings.
Editing Tools: Utilize a variety of editing tools such as cropping, color correction, retouching, and AI-powered enhancements.
Collaboration Tools: Work directly with clients to review and approve images. Gather input via comments, selections, or ratings.
Export Flexibility: Export images to multiple formats like JPEG, PNG, TIFF, or PDF with adjustable quality settings.
Web Sharing: Share albums with clients through a custom web platform for easy viewing and feedback.
Feedback Mechanism: Clients can provide individualized feedback, ensuring the final deliverables meet expectations.
Download and Install: Download the Luxoria desktop application from our website and follow the installation steps.
Set Up: Import your first batch of photos and start organizing your library.
Explore Features: Try out the editing tools, filters, and collaborative workflows.
Share with Clients: Upload selected photos to the web platform and invite clients to review and provide feedback.
Luxoria is more than just a photo editing tool, it's a complete photography management platform. From the moment you capture a shot, Luxoria ensures your photos are organized, edited, and shared efficiently. With AI-powered tools, intuitive collaboration features, and an easy-to-use interface, Luxoria is designed for photographers who want to focus on creativity while streamlining their workflow.
Feel free to contribute or explore the codebase. Luxoria is constantly evolving, and we welcome your feedback and suggestions!
Luxoria is licensed
under the Apache 2.0
License. See the file for more details.
Language: C#
Framework: WinUI 3 with .NET 9
IDE: Visual Studio 2022 / Rider
Version Control: Git
CI/CD: GitHub Actions
Deployment: .MSIX
Testing: xUnit
Luxoria Desktop is structured as follows:
Luxoria.App: Main project containing the primary application logic.
Luxoria.Desktop.Tests: Unit tests for ensuring application stability and correctness.
Luxoria.Core: Provides fundamental services, repositories, and models essential for the application.
Luxoria.Modules: Manages modular components of the application, including models, interfaces, and services.
Luxoria.SDK: Houses shared utilities, services, and interfaces to ensure consistency across modules.
Technologies: WinUI 3 with .NET 9
Target SDK Version: net9.0-windows10.0.26100.0
Minimum Platform Version: 10.0.17763.0
Windows SDK Package Version: 10.0.26100.57
Main Entry Point: App.xaml
/ App.xaml.cs
The application follows a modular architecture where each module is a separate project within the solution, responsible for specific features or functionality.
Technologies: .NET 9.0
Target Framework: net9.0
Functionality: Contains core services, repositories, and models used across the application.
Technologies: .NET 9.0
Target Framework: net9.0
Functionality: Manages modules within the application, ensuring modularization and scalability.
Each module is developed as a separate project to provide distinct functionalities while maintaining interoperability.
Luxoria.SDK provides essential utilities, interfaces, and services to ensure consistency across Luxoria modules. It standardizes logging, file hashing, and module communication, promoting reusability and efficiency.
Interfaces
IFileHasherService
: Defines contract for file hashing operations.
ILoggerService
: Provides structured logging capabilities.
ILogTarget
: Specifies logging targets for various outputs.
Models
LogLevel
: Defines log severity levels for structured logging.
Services
FileHashService
: Implements file hashing with multiple algorithms.
LoggerService
: Provides system-wide and module-specific logging.
Code Reusability: Centralizes common functionalities across modules.
Scalability: Easily extensible for new services and features.
Consistency: Ensures uniformity in logging, file management, and cross-module communication.
Luxoria Standard Modules (LuxStd Modules) provide core functionalities within the Luxoria ecosystem. They follow a standardized architecture, ensuring seamless integration, extensibility, and interoperability.
Modular Design: Follows a plug-and-play structure.
Event-Driven: Utilizes IEventBus
for module communication.
Extensible: Allows enhancement without breaking compatibility.
Asynchronous Processing: Optimized for high-performance and non-blocking operations.
Structured Logging & Error Handling: Implements ILoggerService
for debugging and diagnostics.
LuxImport
Manages importation, indexing, and organization of digital asset collections.
Processes large datasets with asynchronous operations and real-time progress tracking.
LuxFilter
Provides an advanced filtering pipeline for processing and scoring digital assets.
Implements a modular filtering framework with weighted execution for improved accuracy.
Luxoria Desktop follows a modular architecture, ensuring scalability, maintainability, and high performance. LuxStd Modules serve as the foundation of the ecosystem, providing essential functionalities in an event-driven and extensible manner. The inclusion of Luxoria.SDK ensures consistency across different modules, making development more efficient and streamlined.
The purpose of this testing policy is to establish a clear and robust framework for writing, organizing, and maintaining unit tests for the Luxoria project. This ensures consistent quality, high coverage, and minimal regressions throughout development.
High Coverage:
Ensure all critical components and workflows are covered, including normal, edge, and error scenarios.
Test Isolation:
Each unit test must run independently of others. External dependencies must be mocked or stubbed.
Performance:
Tests should execute quickly to support continuous testing during development.
Readability:
Test code should be self-explanatory, with clear naming conventions and comments where needed.
Ease of Maintenance:
Tests must be straightforward to update as the code evolves. Avoid excessive coupling between tests and implementation details.
Tests should mirror the structure of the source code:
Luxoria.Modules
→ Luxoria.Modules.Tests
Each class or module should have a dedicated test file named ClassNameTests.cs
.
Tests should clearly describe their intent using the format:
MethodName_StateUnderTest_ExpectedBehavior
Example: Subscribe_WithValidHandler_ShouldAddSubscriber
Tests must cover:
Standard Cases: Typical input and expected behavior.
Edge Cases: Extreme conditions such as null values, empty lists, or large inputs.
Error Cases: Behavior when exceptions are expected or invalid data is provided.
Use mocking libraries (e.g., Moq) to isolate dependencies.
Verify mock interactions to ensure proper communication between components.
Common dependencies should be initialized in a shared setup method (e.g., constructors or [SetUp]
in test frameworks).
Assertions must be explicit and descriptive to validate expected outcomes:
Use Assert.Equal
, Assert.NotNull
, and Mock.Verify
for clarity.
Write tests before implementing the functionality to capture business requirements effectively.
Ensure error handling paths are tested. For example:
Validate proper exceptions are thrown for invalid inputs.
Test fallback mechanisms where applicable.
A unit test file should follow this basic structure:
Use CI tools (e.g., GitHub Actions, Jenkins) to run unit tests automatically on every commit.
Track test coverage metrics using tools like coverlet
or dotCover
.
Set thresholds for coverage to prevent regressions (e.g., 80% minimum).
Code Reviews:
All new test code must be reviewed by peers to ensure adherence to this policy.
Test Audits:
Conduct periodic reviews to identify outdated or redundant tests and improve overall coverage.
Refactoring:
Update tests whenever code is refactored to align with new implementations.
Track the following metrics to ensure test quality:
Test Coverage: Percentage of code covered by tests.
Test Reliability: Percentage of flaky or unreliable tests.
Execution Time: Average time taken for tests to run.
This policy ensures consistency and scalability for the testing practices in Luxoria. With proper adherence, it will facilitate long-term project stability and maintainability.
To contribute to this project, please follow the guidelines below to ensure consistency and quality in our development process.
We follow the Gitflow branching model for managing development. This involves using separate branches for features, bugfixes, hotfixes, and releases.
Main Branches:
main
: Contains the production-ready code.
develop
: Used as an integration branch for features, bugfixes, and hotfixes before releases.
Supporting Branches:
feat/*
: For new features.
bugfix/*
: For resolving bugs found during development.
hotfix/*
: For urgent fixes in the production code.
Use the following prefixes for your branch names to maintain consistency:
feat/FEATURE_NAME
: For new features.
bugfix/BUG_NAME
: For bug fixes during development.
hotfix/HOTFIX_NAME
: For critical fixes applied directly to main
.
Use the following structure for writing clear, informative commit messages:
Format: <type>: <description>
Types:
feat
: For new features (e.g., feat: Add image editing tool
).
bugfix
: For bug fixes (e.g., bugfix: Fix alignment issue
).
hotfix
: For critical bug fixes (e.g., hotfix: Fix crash on startup
).
Add a brief description after the type, and make sure your message is concise and descriptive.
Each feature, bugfix, or hotfix should be accompanied by a pull request (PR). The steps are:
Open a PR targeting the develop
branch.
Assign a reviewer for code review.
Ensure the PR passes all automated checks and tests.
Provide a detailed description of what was changed and why.
Every PR must undergo a code review before merging:
Reviewers should carefully check the changes for quality, readability, and correctness.
Provide constructive feedback.
Approve the PR if it meets the necessary standards.
Once your pull request has been reviewed and approved:
Ensure all checks pass before merging.
Merge into develop
(or main
in the case of hotfixes).
Delete the branch after merging to keep the repository clean.
We use Semantic Versioning for releases:
Major: Incompatible API changes or large-scale changes.
Minor: New features or functionality.
Patch: Bug fixes or minor updates.
Follow this versioning structure when preparing release branches.
Make sure the documentation is updated for each new feature, bugfix, or hotfix:
Update docs
for in-depth documentation.
Update README.md
for general project information.
Use DEVELOPMENT.md
for developer guidelines.
Use CONTRIBUTING.md
for contribution guidelines.
Update CHANGELOG.md
with the history of changes.
Keep the LICENSE.md
up-to-date with any changes in licensing.
Testing: Ensure all code changes are properly tested.
Code Style: Follow project-specific coding standards to maintain uniformity.
By following these guidelines, you help maintain a smooth and efficient development process at Luxoria.
This is the official documentation for the Luxoria project.
To use this documentation, simply navigate to the desired section, please navigate in the selected section to find the desired information.
Always use the latest version of the documentation.
If you find any errors, please report them.
If you have any suggestions, please let us know.
This is the official documentation for the Luxoria project.
To contribute to this documentation, please follow the steps below:
Click on the Fork
button at the top right corner of the repository.
Clone the repository to your local machine using the following command:
Create a new branch using the following command:
Make the necessary changes to the documentation.
Commit the changes using the following command:
Push the changes to the repository using the following command:
Create a pull request from your forked repository to the original repository.
Luxoria Standard Modules (LuxStd Modules) are a collection of core modules designed to provide essential functionalities within the Luxoria ecosystem. These modules follow a standardized architecture, ensuring seamless integration, extensibility, and interoperability with other Luxoria components.
Modular Design: Each module follows a plug-and-play architecture.
Event-Driven: Modules communicate through event-based interactions using IEventBus
.
Extensible: Can be enhanced with additional features without breaking compatibility.
Asynchronous Processing: Designed for high performance with non-blocking operations.
Logging & Error Handling: Implements structured logging via ILoggerService
for debugging and diagnostics.
Handles the importation, indexing, and management of digital asset collections.
Processes large datasets with asynchronous operations and progress tracking.
Provides a filtering pipeline for processing and scoring digital assets.
Uses a modular filtering algorithm framework with weighted execution.
LuxStd Modules form the backbone of the Luxoria ecosystem, ensuring a robust, scalable, and modular approach to handling digital assets. Their event-driven and extensible design makes them ideal for a wide range of applications within the system.
BenchmarkDotNet v0.14.0, Windows 11 (10.0.26100.2894) Apple Silicon, 6 CPU, 6 logical and 6 physical cores .NET SDK 9.0.102 [Host] : .NET 9.0.1 (9.0.124.61010), Arm64 RyuJIT AdvSIMD DEBUG DefaultJob : .NET 9.0.1 (9.0.124.61010), Arm64 RyuJIT AdvSIMD
LuxFilter is a modular filtering system designed for processing and scoring digital assets efficiently. It integrates with the Luxoria ecosystem and provides a pipeline-based approach to apply filtering algorithms to image data.
Modular filtering pipeline with weighted algorithms
Event-driven architecture for processing notifications
Parallelized execution for optimized performance
Error handling for robust processing
LuxFilter
ModuleImplements IModule
Handles initialization, execution, and shutdown
Provides logging for module actions
PipelineService
Manages the execution of filtering algorithms
Tracks progress and scores
Uses concurrency for efficiency
IFilterAlgorithm
Defines a standard interface for filtering algorithms
Implements a scoring method based on image analysis
ResolutionAlgo: Evaluates the resolution of an image.
SharpnessAlgo: Measures the sharpness level in an image.
BrisqueAlgo: Uses the BRISQUE metric to assess perceptual quality.
Ensure that the Luxoria ecosystem is installed and configured properly.
Your project should reference the necessary LuxFilter libraries.
Implement and register IEventBus
for event-driven interactions.
Clone or download the LuxFilter module.
Add the project reference in your Luxoria-based application.
Implement IModule
interface in your module system.
Initialize the module using Initialize()
.
Configure the filtering pipeline using AddAlgorithm()
.
Pass image data through the Compute()
function.
Subscribes to filtering events
Initializes logger and context
Uses AddAlgorithm(IFilterAlgorithm algorithm, double weight)
to add algorithms
Ensures the total weight of all algorithms does not exceed 1.0
Processes images using Compute(IEnumerable<(Guid, SKBitmap)> bitmaps)
Applies each algorithm in the workflow to every image
Each image receives a final score based on weighted algorithm outputs
Results are returned as (Guid, double)
tuples
Notifies when an image has been processed and scored
Notifies when the pipeline has finished executing
Uses ILoggerService
for structured logs
Exception handling ensures robust error reporting
Logs execution times for performance analysis
Uses parallel processing for scoring
Implements concurrent data structures for thread safety
Optimized event-driven execution to reduce overhead
Dynamic algorithm tuning for real-time adjustments
Support for additional image formats
Graphical visualization of scores
LuxFilter provides a scalable and efficient filtering pipeline for processing images in the Luxoria ecosystem. Its modular design, event-driven execution, and parallel processing capabilities make it an ideal choice for large-scale image scoring and analysis.
LuxImport is a image collection management system designed for efficient indexing, asset organization, and metadata handling. It provides capabilities for importing, processing, and managing image datasets, making it an ideal solution for large-scale photography and media applications.
LuxImport follows a modular architecture to ensure scalability, maintainability, and high performance. The key components are:
ImportService: Handles the import process, including asset hashing, metadata extraction, and database initialization.
Manifest Repository: Manages the manifest file that keeps track of indexed assets.
LuxConfig Repository: Stores configuration settings related to collections and assets.
FileHasherService: Computes unique hashes for images to prevent duplication.
SkiaSharp Integration: Used for image processing, including metadata extraction and transformations.
Initialization: The system checks whether the target collection exists and initializes it if necessary.
Indexing: Images are scanned, hashed, and added to the database with relevant metadata.
Storage & Retrieval: Indexed assets are stored with reference to their respective manifest files.
Loading Assets: Assets are loaded from storage and processed based on application requirements.
.NET 9: Primary Framework.
BenchmarkDotNet: Used for performance benchmarking.
System.Threading.Tasks: Ensures efficient async processing.
Concurrent Collections: Optimizes parallel data processing.
SkiaSharp: Handles image processing operations such as metadata extraction and transformations.
LuxImport includes a robust testing strategy to ensure stability and correctness.
Covers core functionalities such as:
Initialization of import service.
Manifest file creation and retrieval.
File hashing and metadata extraction.
Uses xUnit for testing.
Verifies the interaction between different modules.
Tests how the ImportService handles large datasets.
Uses BenchmarkDotNet to measure execution time, memory allocation, and threading behavior.
Ensures that asset indexing, loading, and retrieval are optimized for large datasets.
Ensures stability with:
Empty folders
Corrupt image files
Large-scale imports
Performance is a key focus of LuxImport. The system is benchmarked to analyze indexing and retrieval efficiency.
Uses BenchmarkDotNet to measure:
Execution time per operation.
Memory allocations and garbage collection pressure.
Threading efficiency and lock contention.
Initialization: Measures the time required to set up a new collection.
Indexing: Evaluates performance when scanning and hashing assets.
Database Operations: Tests manifest file read/write performance.
Asset Loading: Benchmarks retrieval times for indexed images.
Result is in microseconds (μs
).
You can find detailed benchmark results in the LuxImport.Benchmark/BenchmarkDotNet.Artifacts
folder.
The provided benchmark results are for reference only and may vary based on the system configuration.
It has been tested on an Apple Silicon M2 chip on Parallels Desktop.
With 3 different collections, 50, 100, and 200 images, the benchmark results are as follows:
LuxImport is a modular system designed for importing, indexing, and managing digital collections efficiently. It integrates with the Luxoria ecosystem and provides functionalities for handling structured asset collections.
Event-driven architecture with IEventBus
integration
Asynchronous operations for improved performance
Modular and scalable design
Progress tracking through event notifications
Parallel processing for asset loading
LuxImport
ModuleImplements IModule
Handles initialization, execution, and shutdown
Listens to OpenCollectionEvent
and triggers import process
ImportService
Manages the actual import process
Tracks progress and sends updates via event notifications
Loads assets into memory
ManifestRepository
Handles metadata storage and retrieval
Ensures collection initialization and integrity
LuxConfigRepository
Stores per-asset configuration
Manages LuxCfg models in .lux/assets
ImageDataHelper
Loads image assets efficiently
Uses SkiaSharp for image decoding
Ensure that the Luxoria ecosystem is installed and configured properly.
Your project should reference the necessary LuxImport libraries.
Implement and register IEventBus
for event-driven interactions.
Clone or download the LuxImport module.
Add the project reference in your Luxoria-based application.
Implement IModule
interface in your module system.
Initialize the module using Initialize()
.
Subscribe to the OpenCollectionEvent
.
When an import request is triggered, LuxImport processes the collection.
Once completed, CollectionUpdatedEvent
is published.
Subscribes to OpenCollectionEvent
Initializes logger and context
Checks if the collection path is valid and initialized
Reads metadata from manifest.json
Hashes and stores asset references
Uses parallel processing for efficiency
Loads assets into memory
Uses ImageDataHelper
for efficient decoding
Publishes CollectionUpdatedEvent
upon successful import
OpenCollectionEvent
ListenerTriggers collection import
Sends progress updates
CollectionUpdatedEvent
PublisherNotifies the system of import completion
Uses ILoggerService
for structured logs
Exception handling ensures robust error reporting
Uses parallel processing in LoadAssets
Minimizes blocking I/O operations
Implements batch logging to prevent log spam
Cache system for faster re-imports
Support for more file formats
UI integration for progress monitoring
LuxImport is designed for efficient, modular asset importation and indexing within the Luxoria ecosystem. Its event-driven design and asynchronous processing make it highly scalable and reliable.
All code changes must adhere to the to ensure high coverage, quality, and maintainability of the codebase.
If you are ready to start developing, please follow the .
If you want to contribute, please follow the .
If you want to contribute to this documentation, please follow the .
If you are ready to start developing, please follow the .
Update Dependabot configuration to target the develop branch for all package ecosystems ()
Add Dependabot configuration for automated dependency updates ()
Update Dependabot configuration to include commit message prefixes and scope ()
Build system of LuxImport for Unpackaged Luxoria version ()
Change view from ImportView when recentbutton is clicked ()
Check if CollectionPath already initialized, if yes, goto Indexing View ()
Unassign dialog.Content after dialog closed ()
Add a progress bar on MainImportView (X/3 steps) ()
Add base of Importation modal (ImportView) ()
Add basic layer for ImportView view ()
Add first importation step dialog (1/3) ()
Add foundation for Importation views part 1/3, 2/3, 3/3 ()
Add RICollectionRepository system to handle the Recents Imported Collection list ()
Add the Indexication Log viewer on Indexication view (3/3) ()
Create new buildsystem for LuxImport and Creation of LuxImport 1.0.2 ()
Create RequestWindowHandleEvent event to retreive Main Window Ptr ()
Include Luxoria.SDK nuget instead of Luxoria.SDK.dll ()
Update components on Properties view ()
Rename artifact using matrix.platform to Luxoria.App.xARCH ()
Update artifact upload name to include configuration and platform ()
Add feat/unpackaged-version branch to release workflow ()
Add upload step for Luxoria.App in release workflow ()
Code cleanup using visual studio profile 1 ()
Collection Explorer carrousel ()
Collection Explorer carrousel ()
Display flyout menu on click ()
SkiaSharp library ()
Sliders in Editor pannel ()
Backend behind Graphical Test Module XAML ()
EXIFS metada pannel ()
IModuleUI Integration ()
Load component function ()
Module in panel integration ()
Upgrade Modules SDK to include Windows SDK ()
Correct formatting and style in HelloWorld.vue ()
Add base of SSO ()
Add Dashboard component with authentication guard and logout functionality ()
Add Docker configuration and initialization scripts for Luxoria database ()
Add DTOs for user login, registration, and refresh token requests; implement TokenService for secure token generation and comment in code ()
Add EF connection to LuxAPI ()
Add GitHub Actions workflow for LuxAPI build process ()
Add initial implementation of LuxAPI ()
Add TailwindCSS + DaisyUI on LuxStudio Portal ()
Add UserId to AuthorizationCode model and implement SSO authorization view ()
Enhance JWT token generation with user ID and add WhoAmI endpoint for user info retrieval ()
Implement authentication with login and registration views, add router, and configure CORS ()
Implement JWT authentication and configure Swagger for API security ()
Increase token field size to TEXT for AccessToken and RefreshToken in Token model ()
Initialize Vue 3 + TypeScript + Vite project with basic structure and configuration ()
Refactor Token model to use UserId and add RefreshToken model with related functionality ()
Update models to use required properties for better validation; adjust nullable types where necessary ()
Update package dependencies and add Vue type definitions; enhance router token handling ()
Add metrics on LuxFilter & Create Luxoria.SDK nuget ()
Add EXIF data on ImageData and Include RAW/ARW file extension inside Filter ()
Enhance EXIF orientation handling in ImageData processing ()
Refactor EXIF orientation handling in ImageData ()
Adding BrisqueInterop (C++) to BrisqueAlgo (IFilter .NET) ()
Add additional diagnostics and exporters to ImportService benchmarking ()
Add benchmarks & metrics on ImportService ()
Enhance benchmarking for ImportService with additional diagnostics and categorization ()
Update ImportServiceBenchmark to support multiple dataset paths ()
Remove Exception and Add explanations in LuxFilter.cs file ()
Add tests for all services & repositories inside LuxImport ()
Correct typo in dotnet test command for LuxFilter module in build workflow ()
Add unit tests for LuxImport module and update build workflow for coverage reports ()
Remove unused lib on LuxFilter ()
Add all test cases for LuxFilter ()
Add brisque_impl_netlib submodule for enhanced BRISQUE implementation ()
Add OpenCV & OpenCV-contrib libs for C++ ()
Add unit tests for ImageProcessing and SharpnessAlgo ()
Encapsulate BrisqueAlgorithm inside BrisqueAlgorithm.hpp ()
Update build workflow to include LuxFilter and merge coverage reports ()
Update CMake configuration and enhance BRISQUE implementation with error handling ()
Disable PublishReadyToRun during application build in LDA workflow ()
Remove publish step from LDA build workflow ()
Remove redundant environment variable declaration in build workflow ()
Remove runtime identifier from build command in LDA workflow ()
Set working directory for build and publish steps in LDA workflow ()
Specify runtime identifier for LDA project build in workflow ()
Add build and release workflows for Luxoria Desktop App ()
Add null handlers to events to avoid null refs ()
AddAlgorithm method returns itself ()
Removing SKBitmapWithSize, simplifying the Compute method ()
Add base of Brisque algorithm in LuxFilter ()
Add event handling and unique IDs to pipeline processing ()
Load Assemblies inside Luxoria.SDK.dll ()
Add sentry to Luxoria.SDK dll ()
Add sentry to project in LoggerService ()
Add explanations inside PipelineService file & remove unused libs ()
Add multi-thread process on compute function ()
Compute function now takes a collection of bitmaps ()
ComputeVariance function and improve code readability ()
IPipeline.Compute return fscore as double instead of void ()
Make ApplyLaplacianKernel function as static ()
Move BitmapWithSize model to its unique file & remove unused model ()
Use Multi-Thread in pipeline computation ()
Add base of LuxFilter module ()
Add compute sharpness of a bitmap ()
Add Filter Pipeline base ()
Add LuxFilter independant buildsystem & Add models ns in PipeSvc ()
Add Resolution Algorithm to Algorithms code-base ()
Add Rust logic functions for LuxFilter ()
Update LICENSE link in README to point to LICENSE.md ()
Add build step for LuxImport solution in CI workflow ()
Add docstrings to build functions for better clarity ()
Add filters in indexation process ()
All unit tests using ImageData model ()
Increment LuxImport's version from 1.0.0 to 1.0.1 ()
Replace buildsystem by one that build the entire solution ()
Replace ReadOnlyMemory with SKBitmap ()
Update SonarCloud analysis job name in CI workflow for Luxoria ()
Update SonarCloud analysis step in CI workflow for Luxoria.App ()
Add Apache License 2.0 to the repository ()
Add Contributor Covenant Code of Conduct ()
Add pull request template for Luxoria contributions ()
Add test to cover LogAsync method ()
All warnings about unit tests ()
Fix sonar issues ()
Implementation of IEvent interface ()
Improve logger system ()
Add some tests to cover FileExtensionHelper class ()
Add some tests to cover Manifest model ()
Disable tests on some Event models ()
Excluding some models from coverage ()
Remove .sonar from cache exclusions in build workflow ()
Update cache paths for SonarCloud data in build workflow ()
Enable caching system on Build workflow ()
Including .sonar folder in cache ()
Execute a clean code on the overall code base ()
Include StartupTests file to test and cover Startup logic file ()
Make private assert functions static ()
Run Code-cleaner on StartupTests file ()
Add mutex (multi-thread safe) on all ImageData methods ()
Clean sonar issues on Startup file ()
Clean sonar issues on this file ()
Make UpdateSlashScreenAsync function static ()
Rename build job to scan-sonarcloud in workflow configuration ()
Update commit-checker workflow to trigger on specific pull request events ()
Change hyperlink to access to SonarCloud from main readme ()
Add SONAR_TOKEN to SonarQube analysis in GitHub Actions workflow ()
Update dotnet-coverage command in GitHub Actions workflow for improved test coverage collection ()
Add installation step for .NET coverage tool in GitHub Actions workflow ()
Update GitHub Actions workflow to use SonarCloud and improve coverage reporting ()
Clean up README formatting by adding missing div closure ()
Update README to replace SonarQube links with SonarCloud and remove development release section ()
Simplify build workflow by removing unnecessary branch triggers and updating SonarQube command ()
Remove dual SAST checker on SonarQube ()
Update build workflow to trigger on main and develop branches, and add pull request event types ()
Update SonarQube scanner options in build workflow ()
Merge develop into feat/core/main-menu ()
Removed unused files ()
Add Main Menu Bar component and module import setting ()
Add comments inside Index function ()
Add functions & methods explanations inside files ()
Add functions explanations inside 'ImportService' file ()
Cleanup the code before merge to 'develop' ()
Create Luxoria.App graphical architecture ()
LuxConfigRepository read Guid from json file ()
Move 'LuxVersion' inside Luxoria.Modules.Models namespace ()
Optimization of Index function in ImportService ()
Rename LuxAsset.Config to LuxAsset.MetaData ()
Add a toast notification message when CollectionUpdatedEvent ()
Add base of Luxoria Indexing Process ()
Add handler to retreive updated collection on MainWindow ()
Add importation cleanup process ()
Add Load Image bitmap using SixLabors.ImageSharp lib ()
Adding LuxCFG creation processus in indexication process ()
Change mono-thread to multi-threads indexation process ()
Close modal when importation is completed or has failed ()
Refactor module loading logic in App.xaml.cs to load from directories with logging for missing modules. ()
Upgrade 'LuxImport' solution to .NET 9.0 ()
Fix documentation about technical stacks ()
Upgrade .NET version to 9.0 ()
Upgrade release workflow to use .NET 9.0 ()
Update issue templates ()
Update issue templates ()
Update issue templates ()
Exclude Startup.cs and *.xaml (design files) from code coverage analysis ()
Unit test after logger function in initialize ()
Update .gitignore file to Ignore .vscode, .DS_Store, any tmp files ()
Update commitlint.config.js to enforce subject case rules ()
Update README.md and package-lock.json ()
Add base of processing for LuxImport ()
Add code coverage test in build workflow ()
add GitHub Actions workflow for building and packaging Luxoria.App ()
Add Luxoria.SDK project ()
add modular-arch (Luxoria.App) into main Luxoria repository ()
Add UnitTest base ()
Create a second module called TestModule2 ()
fix GitHub Actions workflow for building and packaging Luxoria.App ()
fix GitHub Actions workflow for detecting Q&A / SAST ()
Fix ModuleServiceTests to include logger service in initialization ()
Install dotnet-coverage globally and configure OpenCover reports ()
Refactor project structure and ignore files ()
Update release workflow to only build for x64 platform ()
Update test command in build workflow ()
Update test command in build workflow ()
Update download link in README.md ()
Add Auto release system (Semantic Release) ()
add base of .NET WinUI3 project ()
add C# .NET WinUI3 base ()
add GitHub Actions workflow for building and analyzing the project ()
add gitignore and husky configuration files ()
Add links to download, documentation, and contribute in README.md ()
Add Luxoria Documentation ()
add publish profiles inside repository ()
fix ci/cd Build and analyze step ()
fix ci/cd Build and analyze step ()
fix ci/cd build part by specifying target build name ()
fix download link in README.md ()
fix exclude some files from SonarQube Analyze ()
fix Luxoria README.md and add documentation ()
fix publisher profile name to "Luxoria Project" ()
update SonarQube project badges URLs ()
Go to the for more details.
ComputeResolution
18.65 ns
0.113 ns
0.100 ns
-
-
-
-
ComputeSharpness
1,247,542,131.41 ns
4,759,688.559 ns
3,974,555.516 ns
94000.0000
-
-
396981440 B
ComputeBrisque
167,962,263.89 ns
936,623.349 ns
731,253.903 ns
-
-
-
1296 B
BenchmarkIsInitialized
204.7 μs
2.38 μs
2.11 μs
BenchmarkInitializeDatabase
199.3 μs
2.29 μs
2.14 μs
BenchmarkIndexCollectionAsync
487,436.6 μs
9,645.05 μs
23,840.17 μs
BenchmarkLoadAssets
8,870,859.5 μs
526,318.08 μs
1,535,294.66 μs
BenchmarkInitializeDatabase
\Mac\(...)t_100 [31]
212.5 μs
2.50 μs
2.34 μs
212.7 μs
-
-
-
-
-
544 B
BenchmarkInitializeDatabase
\Mac\(...)t_200 [31]
222.3 μs
1.69 μs
1.41 μs
221.9 μs
-
-
-
-
-
544 B
BenchmarkInitializeDatabase
\Mac\(...)et_50 [30]
221.9 μs
1.64 μs
1.45 μs
221.7 μs
-
-
-
-
-
528 B
BenchmarkIndexCollectionAsync
\Mac\(...)t_100 [31]
363,789.4 μs
7,220.64 μs
10,355.63 μs
362,619.7 μs
1.0000
-
-
-
-
835440 B
BenchmarkIndexCollectionAsync
\Mac\(...)t_200 [31]
401,680.5 μs
8,007.05 μs
19,940.34 μs
404,522.2 μs
1.0000
-
-
-
-
835440 B
BenchmarkIndexCollectionAsync
\Mac\(...)et_50 [30]
392,667.6 μs
7,837.67 μs
12,656.39 μs
391,574.4 μs
1.0000
-
-
-
-
872432 B
BenchmarkIsInitialized
\Mac\(...)t_100 [31]
216.9 μs
4.15 μs
3.88 μs
215.5 μs
-
-
-
-
-
544 B
BenchmarkIsInitialized
\Mac\(...)t_200 [31]
215.8 μs
2.21 μs
1.85 μs
215.7 μs
-
-
-
-
-
544 B
BenchmarkIsInitialized
\Mac\(...)et_50 [30]
218.9 μs
4.38 μs
6.14 μs
216.2 μs
-
-
-
-
-
528 B
BenchmarkLoadAssets
\Mac\(...)t_100 [31]
2,746,052.2 μs
115,195.76 μs
330,518.24 μs
2,627,569.7 μs
140.0000
-
8000.0000
7000.0000
5000.0000
46234408 B
BenchmarkLoadAssets
\Mac\(...)t_200 [31]
2,688,051.4 μs
100,639.20 μs
282,203.13 μs
2,655,953.1 μs
134.0000
1.0000
10000.0000
8000.0000
7000.0000
46710912 B
BenchmarkLoadAssets
\Mac\(...)et_50 [30]
2,843,692.2 μs
100,855.93 μs
274,386.03 μs
2,781,623.8 μs
132.0000
-
8000.0000
7000.0000
4000.0000
46168160 B
ComputeResolution
18.65 ns
0.113 ns
0.100 ns
-
-
-
-
ComputeSharpness
1,247,542,131.41 ns
4,759,688.559 ns
3,974,555.516 ns
94000.0000
-
-
396981440 B
ComputeBrisque
167,962,263.89 ns
936,623.349 ns
731,253.903 ns
-
-
-
1296 B