ara-cli 0.1.9.53__tar.gz → 0.1.9.54__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/PKG-INFO +1 -1
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/ara_command_action.py +5 -1
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/ara_command_parser.py +1 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/artefact_fuzzy_search.py +1 -1
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/artefact_models/artefact_model.py +12 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/artefact_renamer.py +43 -22
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/tag_extractor.py +4 -1
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/tests/test_artefact_renamer.py +0 -61
- ara_cli-0.1.9.54/ara_cli/tests/test_tag_extractor.py +54 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/version.py +1 -1
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli.egg-info/PKG-INFO +1 -1
- ara_cli-0.1.9.53/ara_cli/tests/test_tag_extractor.py +0 -45
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/MANIFEST.in +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/README.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/__init__.py +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/__main__.py +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/analyse_artefacts.py +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/ara_config.py +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/artefact_creator.py +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/artefact_deleter.py +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/artefact_link_updater.py +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/artefact_lister.py +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/artefact_models/artefact_load.py +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/artefact_models/artefact_mapping.py +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/artefact_models/artefact_templates.py +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/artefact_models/businessgoal_artefact_model.py +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/artefact_models/capability_artefact_model.py +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/artefact_models/epic_artefact_model.py +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/artefact_models/example_artefact_model.py +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/artefact_models/feature_artefact_model.py +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/artefact_models/issue_artefact_model.py +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/artefact_models/keyfeature_artefact_model.py +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/artefact_models/task_artefact_model.py +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/artefact_models/userstory_artefact_model.py +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/artefact_models/vision_artefact_model.py +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/artefact_reader.py +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/artefact_scan.py +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/chat.py +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/classifier.py +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/codefusionretriever.py +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/codehierachieretriever.py +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/commandline_completer.py +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/directory_navigator.py +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/file_classifier.py +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/file_lister.py +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/filename_validator.py +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/list_filter.py +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/output_suppressor.py +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/prompt_chat.py +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/prompt_extractor.py +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/prompt_handler.py +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/prompt_rag.py +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/run_file_lister.py +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/template_manager.py +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/agile.artefacts +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/prompt-modules/blueprints/complete_pytest_unittest.blueprint.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/prompt-modules/blueprints/empty.blueprint.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/prompt-modules/blueprints/task_todo_list_C4_architecture_analysis.blueprint.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/prompt-modules/blueprints/task_todo_list_implement_feature_BDD_way.blueprint.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/prompt-modules/commands/architecture_C4_analysis.commands.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/prompt-modules/commands/architecture_radon_cc_score.commands.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/prompt-modules/commands/architecture_radon_halstead_v.commands.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/prompt-modules/commands/architecture_radon_maintainability_score.commands.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/prompt-modules/commands/artefact_classification.commands.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/prompt-modules/commands/artefact_extension.commands.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/prompt-modules/commands/artefact_formulation.commands.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/prompt-modules/commands/behave_step_generation.commands.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/prompt-modules/commands/code_generation_complex.commands.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/prompt-modules/commands/code_generation_simple.commands.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/prompt-modules/commands/empty.commands.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/prompt-modules/commands/error_fixing.commands.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/prompt-modules/commands/feature_file_update.commands.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/prompt-modules/commands/feature_formulation.commands.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/prompt-modules/commands/js_code_generation_simple.commands.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/prompt-modules/commands/refactoring.commands.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/prompt-modules/commands/refactoring_analysis.commands.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/prompt-modules/commands/reverse_engineer_feature_file.commands.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/prompt-modules/commands/reverse_engineer_program_flow.commands.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/prompt-modules/intentions/classify_task.intention.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/prompt-modules/intentions/empty.intention.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/prompt-modules/intentions/error_fixing.intention.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/prompt-modules/intentions/feature_fix_steps_for_scenario.intention.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/prompt-modules/intentions/feature_formulation.intention.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/prompt-modules/intentions/feature_reverse_formulation_from_code.intention.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/prompt-modules/intentions/feature_scenario_implementation.intention.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/prompt-modules/intentions/feature_scenario_implementation_update.intention.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/prompt-modules/intentions/feature_scenario_outline_extension.intention.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/prompt-modules/intentions/feature_update_formulation.intention.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/prompt-modules/intentions/fibonacci_example_implementation.intention.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/prompt-modules/intentions/js_implementation_from_task_description.intention.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/prompt-modules/intentions/js_steps_implementation.intention.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/prompt-modules/intentions/python_cli_implementation_with_test.intention.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/prompt-modules/intentions/python_code_understanding.intention.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/prompt-modules/intentions/task_implementation.intention.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/prompt-modules/intentions/task_prompt_control_by_status.intention.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/prompt-modules/intentions/task_stepwise_implementation_by_number.intention.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/prompt-modules/intentions/task_stepwise_implementation_by_status.intention.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/prompt-modules/rules/architecture_analyst.rules.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/prompt-modules/rules/code_analyst.rules.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/prompt-modules/rules/empty.rules.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/prompt-modules/rules/error_analyst.rules.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/prompt-modules/rules/gherkin_expert.rules.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/prompt-modules/rules/js_expert_developer.rules.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/prompt-modules/rules/product_owner.rules.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/prompt-modules/rules/python_behave.rules.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/prompt-modules/rules/python_developer.rules.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/specification_breakdown_files/template.concept.exploration.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/specification_breakdown_files/template.concept.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/specification_breakdown_files/template.customer.exploration.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/specification_breakdown_files/template.customer.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/specification_breakdown_files/template.persona.exploration.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/specification_breakdown_files/template.persona.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/specification_breakdown_files/template.step.exploration.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/specification_breakdown_files/template.step.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/specification_breakdown_files/template.technology.exploration.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/specification_breakdown_files/template.technology.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/template.businessgoal +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/template.businessgoal.prompt_log.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/template.capability +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/template.capability.prompt_log.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/template.epic +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/template.epic.prompt_log.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/template.example +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/template.example.prompt_log.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/template.feature +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/template.feature.prompt_log.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/template.issue +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/template.issue.prompt_log.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/template.keyfeature +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/template.keyfeature.prompt_log.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/template.steps.prompt_log.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/template.task +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/template.task.prompt_log.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/template.userstory +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/template.userstory.prompt_log.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/template.vision +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/template.vision.prompt_log.md +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/tests/__init__.py +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/tests/test_ara_command_action.py +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/tests/test_ara_config.py +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/tests/test_artefact_fuzzy_search.py +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/tests/test_artefact_link_updater.py +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/tests/test_artefact_lister.py +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/tests/test_artefact_reader.py +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/tests/test_artefact_scan.py +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/tests/test_chat.py +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/tests/test_classifier.py +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/tests/test_directory_navigator.py +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/tests/test_file_classifier.py +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/tests/test_file_creator.py +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/tests/test_file_lister.py +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/tests/test_list_filter.py +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/tests/test_template_manager.py +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/tests/test_update_config_prompt.py +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/update_config_prompt.py +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli.egg-info/SOURCES.txt +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli.egg-info/dependency_links.txt +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli.egg-info/entry_points.txt +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli.egg-info/requires.txt +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli.egg-info/top_level.txt +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/setup.cfg +0 -0
- {ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/setup.py +0 -0
|
@@ -123,8 +123,12 @@ def list_action(args):
|
|
|
123
123
|
def list_tags_action(args):
|
|
124
124
|
from ara_cli.tag_extractor import TagExtractor
|
|
125
125
|
|
|
126
|
+
tag_classifier = None
|
|
127
|
+
if args.include_classifier:
|
|
128
|
+
tag_classifier = args.include_classifier
|
|
129
|
+
|
|
126
130
|
tag_extractor = TagExtractor()
|
|
127
|
-
tags = tag_extractor.extract_tags()
|
|
131
|
+
tags = tag_extractor.extract_tags(include_classifier=tag_classifier)
|
|
128
132
|
|
|
129
133
|
if args.json:
|
|
130
134
|
output = json.dumps({"tags": tags})
|
|
@@ -120,6 +120,7 @@ def list_parser(subparsers):
|
|
|
120
120
|
def list_tags_parser(subparsers):
|
|
121
121
|
tags_parser = subparsers.add_parser("list-tags", help="Show tags")
|
|
122
122
|
tags_parser.add_argument("--json", "-j", help="Output tags as JSON", action=argparse.BooleanOptionalAction)
|
|
123
|
+
tags_parser.add_argument("--include-classifier", choices=classifiers, help="Show tags for an artefact type")
|
|
123
124
|
|
|
124
125
|
|
|
125
126
|
def add_chat_arguments(chat_parser):
|
|
@@ -26,7 +26,7 @@ def suggest_close_name_matches_for_parent(artefact_name: str, all_artefact_names
|
|
|
26
26
|
message = f"No match found for parent of '{artefact_name}' with name '{parent_name}'"
|
|
27
27
|
|
|
28
28
|
suggest_close_names(
|
|
29
|
-
artefact_name=
|
|
29
|
+
artefact_name=parent_name,
|
|
30
30
|
all_artefact_names=all_artefact_names,
|
|
31
31
|
message=message
|
|
32
32
|
)
|
|
@@ -6,6 +6,7 @@ from abc import ABC, abstractmethod
|
|
|
6
6
|
from ara_cli.classifier import Classifier
|
|
7
7
|
import warnings
|
|
8
8
|
import string
|
|
9
|
+
import os
|
|
9
10
|
|
|
10
11
|
|
|
11
12
|
ALLOWED_STATUS_VALUES = ("to-do", "in-progress", "review", "done", "closed")
|
|
@@ -188,6 +189,17 @@ class Artefact(BaseModel, ABC):
|
|
|
188
189
|
sub_dir = Classifier.get_sub_directory(self.artefact_type)
|
|
189
190
|
return f"{sub_dir}/{self.title}.{self.artefact_type}"
|
|
190
191
|
|
|
192
|
+
@model_validator(mode="after")
|
|
193
|
+
def ensure_file_path_consistency(self):
|
|
194
|
+
if not self._file_path:
|
|
195
|
+
return self
|
|
196
|
+
file_path = self._file_path
|
|
197
|
+
dir_path = os.path.dirname(file_path)
|
|
198
|
+
artefact_type = self._artefact_type()
|
|
199
|
+
file_path = f"{dir_path}/{self.title}.{artefact_type}"
|
|
200
|
+
self._file_path = file_path
|
|
201
|
+
return self
|
|
202
|
+
|
|
191
203
|
@field_validator('artefact_type')
|
|
192
204
|
def validate_artefact_type(cls, v):
|
|
193
205
|
if not isinstance(v, ArtefactType):
|
|
@@ -2,7 +2,10 @@ import os
|
|
|
2
2
|
from functools import lru_cache
|
|
3
3
|
from ara_cli.classifier import Classifier
|
|
4
4
|
from ara_cli.artefact_link_updater import ArtefactLinkUpdater
|
|
5
|
+
from ara_cli.artefact_reader import ArtefactReader
|
|
6
|
+
from ara_cli.artefact_models.artefact_model import Contribution
|
|
5
7
|
from ara_cli.template_manager import DirectoryNavigator
|
|
8
|
+
from ara_cli.artefact_fuzzy_search import suggest_close_name_matches
|
|
6
9
|
import re
|
|
7
10
|
|
|
8
11
|
|
|
@@ -22,47 +25,65 @@ class ArtefactRenamer:
|
|
|
22
25
|
return re.compile(pattern)
|
|
23
26
|
|
|
24
27
|
def rename(self, old_name, new_name, classifier):
|
|
25
|
-
original_directory = self.navigate_to_target()
|
|
26
|
-
|
|
27
28
|
if not new_name:
|
|
28
29
|
raise ValueError("New name must be provided for renaming.")
|
|
29
|
-
|
|
30
30
|
if not Classifier.is_valid_classifier(classifier):
|
|
31
31
|
raise ValueError("Invalid classifier provided. Please provide a valid classifier.")
|
|
32
32
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
33
|
+
original_directory = self.navigate_to_target()
|
|
34
|
+
|
|
35
|
+
classified_artefacts = ArtefactReader.read_artefacts()
|
|
36
36
|
|
|
37
|
-
|
|
38
|
-
|
|
37
|
+
artefacts_by_current_classifier = classified_artefacts.get(classifier, [])
|
|
38
|
+
matching_artefacts = list(filter(lambda a: a.title == old_name, artefacts_by_current_classifier))
|
|
39
39
|
|
|
40
|
-
|
|
40
|
+
if not matching_artefacts:
|
|
41
|
+
all_artefact_names = [artefact.title for artefact in artefacts_by_current_classifier]
|
|
42
|
+
suggest_close_name_matches(old_name, all_artefact_names)
|
|
43
|
+
return
|
|
44
|
+
|
|
45
|
+
matching_artefact = matching_artefacts[0]
|
|
46
|
+
|
|
47
|
+
old_file_path = matching_artefact.file_path
|
|
48
|
+
old_base_path = self.file_system.path.dirname(old_file_path)
|
|
49
|
+
old_dir_path = f"{old_base_path}/{old_name}.data"
|
|
41
50
|
|
|
42
|
-
# Check if the original file exists
|
|
43
51
|
if not self.file_system.path.exists(old_file_path):
|
|
44
52
|
raise FileNotFoundError(f"The file {old_file_path} does not exist.")
|
|
45
53
|
|
|
46
|
-
|
|
54
|
+
children_by_classifier = ArtefactReader.find_children(
|
|
55
|
+
artefact_name=old_name,
|
|
56
|
+
classifier=classifier,
|
|
57
|
+
classified_artefacts=classified_artefacts
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
matching_artefact.title = new_name
|
|
61
|
+
new_file_path = matching_artefact.file_path
|
|
62
|
+
new_base_path = self.file_system.path.dirname(new_file_path)
|
|
63
|
+
new_dir_path = f"{new_base_path}/{new_name}.data"
|
|
47
64
|
if self.file_system.path.exists(new_file_path):
|
|
48
65
|
raise FileExistsError(f"The new file name {new_file_path} already exists.")
|
|
49
66
|
if self.file_system.path.exists(new_dir_path):
|
|
50
67
|
raise FileExistsError(f"The new directory name {new_dir_path} already exists.")
|
|
51
68
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
self.file_system.rename(old_dir_path, new_dir_path)
|
|
57
|
-
print(f"Renamed directory: {old_dir_path} to {new_dir_path}")
|
|
69
|
+
serialized_artefact = matching_artefact.serialize()
|
|
70
|
+
with open(matching_artefact.file_path, 'w') as file:
|
|
71
|
+
file.write(serialized_artefact)
|
|
72
|
+
self.file_system.remove(old_file_path)
|
|
58
73
|
|
|
59
|
-
|
|
60
|
-
|
|
74
|
+
if self.file_system.path.exists(old_dir_path):
|
|
75
|
+
self.file_system.rename(old_dir_path, new_dir_path)
|
|
61
76
|
|
|
62
|
-
|
|
63
|
-
|
|
77
|
+
for children in children_by_classifier.values():
|
|
78
|
+
for child in children:
|
|
79
|
+
contribution = child.contribution
|
|
80
|
+
contribution.artefact_name = new_name
|
|
81
|
+
child.contribution = contribution
|
|
82
|
+
serialized_artefact = child.serialize()
|
|
83
|
+
with open(child.file_path, 'w') as file:
|
|
84
|
+
file.write(serialized_artefact)
|
|
64
85
|
|
|
65
|
-
|
|
86
|
+
self.file_system.chdir(original_directory)
|
|
66
87
|
|
|
67
88
|
def _update_title_in_artefact(self, artefact_path, new_title, classifier):
|
|
68
89
|
# Format the new title: replace underscores with spaces
|
|
@@ -6,7 +6,7 @@ class TagExtractor:
|
|
|
6
6
|
def __init__(self, file_system=None):
|
|
7
7
|
self.file_system = file_system or os
|
|
8
8
|
|
|
9
|
-
def extract_tags(self, navigate_to_target=False):
|
|
9
|
+
def extract_tags(self, navigate_to_target=False, include_classifier=None):
|
|
10
10
|
from ara_cli.template_manager import DirectoryNavigator
|
|
11
11
|
from ara_cli.artefact_reader import ArtefactReader
|
|
12
12
|
|
|
@@ -16,6 +16,9 @@ class TagExtractor:
|
|
|
16
16
|
|
|
17
17
|
artefacts = ArtefactReader.read_artefacts()
|
|
18
18
|
|
|
19
|
+
if include_classifier:
|
|
20
|
+
artefacts = {include_classifier: artefacts[include_classifier]}
|
|
21
|
+
|
|
19
22
|
unique_tags = set()
|
|
20
23
|
|
|
21
24
|
for artefact_list in artefacts.values():
|
|
@@ -19,13 +19,6 @@ def cleanup():
|
|
|
19
19
|
shutil.rmtree(new_data_dir)
|
|
20
20
|
|
|
21
21
|
|
|
22
|
-
@patch("ara_cli.artefact_renamer.os.path.exists")
|
|
23
|
-
def test_rename_checks_filename_exists(mock_exists):
|
|
24
|
-
mock_exists.return_value = False
|
|
25
|
-
ar = ArtefactRenamer(os)
|
|
26
|
-
with pytest.raises(FileNotFoundError):
|
|
27
|
-
ar.rename("nonexistent_file", "new_file", "vision")
|
|
28
|
-
|
|
29
22
|
def test_rename_checks_classifier_valid():
|
|
30
23
|
ar = ArtefactRenamer(os)
|
|
31
24
|
with pytest.raises(ValueError):
|
|
@@ -38,60 +31,6 @@ def test_rename_checks_new_name_provided():
|
|
|
38
31
|
ar.rename("existing_file", None, None)
|
|
39
32
|
|
|
40
33
|
|
|
41
|
-
@patch("builtins.open", new_callable=mock_open, read_data="Vision: Old Title\nOther content.")
|
|
42
|
-
@patch("ara_cli.artefact_renamer.os.rename")
|
|
43
|
-
@patch("ara_cli.artefact_renamer.os.path.exists", side_effect=[True, True, False, False, True])
|
|
44
|
-
def test_rename_filename_with_new_name(mock_exists, mock_rename, mock_open):
|
|
45
|
-
ar = ArtefactRenamer(os)
|
|
46
|
-
ar.rename("existing_file", "new_file", "vision")
|
|
47
|
-
assert mock_rename.call_count == 2
|
|
48
|
-
mock_rename.assert_has_calls([
|
|
49
|
-
call("vision/existing_file.vision", "vision/new_file.vision"),
|
|
50
|
-
call("vision/existing_file.data", "vision/new_file.data")
|
|
51
|
-
])
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
@patch("ara_cli.artefact_renamer.os.path.exists", side_effect=[True, True, True, False])
|
|
55
|
-
def test_rename_throws_error_if_new_file_or_directory_exists(mock_exists):
|
|
56
|
-
ar = ArtefactRenamer(os)
|
|
57
|
-
with pytest.raises(FileExistsError):
|
|
58
|
-
ar.rename("existing_file", "existing_file", "vision")
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
@patch("ara_cli.artefact_renamer.os.path.exists", side_effect=[True, False, False])
|
|
62
|
-
def test_rename_checks_related_data_folder_exists(mock_exists):
|
|
63
|
-
ar = ArtefactRenamer(os)
|
|
64
|
-
with pytest.raises(FileNotFoundError):
|
|
65
|
-
ar.rename("old_name", "new_name", "userstory")
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
@patch("builtins.open", new_callable=mock_open, read_data="Userstory: Old Title\nOther content.")
|
|
69
|
-
@patch("ara_cli.artefact_renamer.os.rename")
|
|
70
|
-
@patch("ara_cli.artefact_renamer.os.path.exists", side_effect=[True, True, False, False, True])
|
|
71
|
-
def test_rename_also_renames_related_data_folder(mock_exists, mock_rename, mock_open):
|
|
72
|
-
ar = ArtefactRenamer(os)
|
|
73
|
-
ar.rename("old_name", "new_name", "userstory")
|
|
74
|
-
assert mock_rename.call_count == 2
|
|
75
|
-
mock_rename.assert_has_calls([
|
|
76
|
-
call("userstories/old_name.userstory", "userstories/new_name.userstory"),
|
|
77
|
-
call("userstories/old_name.data", "userstories/new_name.data")
|
|
78
|
-
])
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
@patch("ara_cli.artefact_renamer.os.path.exists", side_effect=[True, True, True])
|
|
82
|
-
def test_rename_throws_error_if_new_file_path_exists(mock_exists):
|
|
83
|
-
ar = ArtefactRenamer()
|
|
84
|
-
with pytest.raises(FileExistsError):
|
|
85
|
-
ar.rename("old_name", "new_name", "userstory")
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
@patch("ara_cli.artefact_renamer.os.path.exists", side_effect=[True, True, False, True])
|
|
89
|
-
def test_rename_throws_error_if_new_data_directory_exists(mock_exists):
|
|
90
|
-
ar = ArtefactRenamer()
|
|
91
|
-
with pytest.raises(FileExistsError):
|
|
92
|
-
ar.rename("old_name", "new_name", "userstory")
|
|
93
|
-
|
|
94
|
-
|
|
95
34
|
@pytest.mark.parametrize("classifier,artefact_name,read_data_prefix,old_title,new_title", [
|
|
96
35
|
("vision", "Vision", "Vision: ", "Old Title", "New title"),
|
|
97
36
|
("businessgoal", "Businessgoal", "Businessgoal: ", "Old Title", "New title"),
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import pytest
|
|
2
|
+
from unittest.mock import MagicMock, patch
|
|
3
|
+
from ara_cli.tag_extractor import TagExtractor
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
@pytest.fixture
|
|
7
|
+
def artefact():
|
|
8
|
+
"""Fixture to create a mock artefact object."""
|
|
9
|
+
class Artefact:
|
|
10
|
+
def __init__(self, tags, status, users):
|
|
11
|
+
self.tags = tags
|
|
12
|
+
self.status = status
|
|
13
|
+
self.users = users
|
|
14
|
+
return Artefact
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@pytest.mark.parametrize("navigate_to_target, include_classifier, artefact_data, expected_tags", [
|
|
18
|
+
(False, None, {'artefacts': [
|
|
19
|
+
(['tag1', 'tag2'], 'status1', ['user1', 'user2']),
|
|
20
|
+
(['tag3'], 'status2', ['user3'])
|
|
21
|
+
]}, ['status1', 'status2', 'tag1', 'tag2', 'tag3', 'user_user1', 'user_user2', 'user_user3']),
|
|
22
|
+
|
|
23
|
+
(False, 'key', {'key': [
|
|
24
|
+
(['tag1', 'tag2'], 'status1', ['user1', 'user2'])
|
|
25
|
+
]}, ['status1', 'tag1', 'tag2', 'user_user1', 'user_user2']),
|
|
26
|
+
|
|
27
|
+
(True, None, {'artefacts': [
|
|
28
|
+
(['tag3'], 'status2', ['user3'])
|
|
29
|
+
]}, ['status2', 'tag3', 'user_user3'])
|
|
30
|
+
])
|
|
31
|
+
@patch('ara_cli.template_manager.DirectoryNavigator')
|
|
32
|
+
@patch('ara_cli.artefact_reader.ArtefactReader')
|
|
33
|
+
def test_extract_tags(mock_artefact_reader, mock_directory_navigator, artefact, navigate_to_target, include_classifier, artefact_data, expected_tags):
|
|
34
|
+
# Mock the artefact reader to return artefact data
|
|
35
|
+
mock_artefact_reader.read_artefacts.return_value = {key: [artefact(
|
|
36
|
+
*data) for data in artefact_list] for key, artefact_list in artefact_data.items()}
|
|
37
|
+
|
|
38
|
+
# Mock the directory navigator
|
|
39
|
+
mock_navigator_instance = mock_directory_navigator.return_value
|
|
40
|
+
mock_navigator_instance.navigate_to_target = MagicMock()
|
|
41
|
+
|
|
42
|
+
tag_extractor = TagExtractor()
|
|
43
|
+
|
|
44
|
+
# Run the extract_tags method with include_classifier
|
|
45
|
+
result = tag_extractor.extract_tags(
|
|
46
|
+
navigate_to_target=navigate_to_target, include_classifier=include_classifier)
|
|
47
|
+
|
|
48
|
+
# Assertions
|
|
49
|
+
if navigate_to_target:
|
|
50
|
+
mock_navigator_instance.navigate_to_target.assert_called_once()
|
|
51
|
+
else:
|
|
52
|
+
mock_navigator_instance.navigate_to_target.assert_not_called()
|
|
53
|
+
|
|
54
|
+
assert result == expected_tags
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
# version.py
|
|
2
|
-
__version__ = "0.1.9.
|
|
2
|
+
__version__ = "0.1.9.54" # fith parameter like .0 for local install test purposes only. official numbers should be 4 digit numbers
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import pytest
|
|
2
|
-
from unittest.mock import MagicMock, patch
|
|
3
|
-
from ara_cli.tag_extractor import TagExtractor # Adjust the import based on your project structure
|
|
4
|
-
|
|
5
|
-
@pytest.fixture
|
|
6
|
-
def artefact():
|
|
7
|
-
"""Fixture to create a mock artefact object."""
|
|
8
|
-
class Artefact:
|
|
9
|
-
def __init__(self, tags, status, users):
|
|
10
|
-
self.tags = tags
|
|
11
|
-
self.status = status
|
|
12
|
-
self.users = users
|
|
13
|
-
|
|
14
|
-
return Artefact
|
|
15
|
-
|
|
16
|
-
@pytest.mark.parametrize("navigate_to_target, artefact_data, expected_tags", [
|
|
17
|
-
(False, {'artefacts': [(
|
|
18
|
-
['tag1', 'tag2'], 'status1', ['user1', 'user2']
|
|
19
|
-
)]}, ['status1', 'tag1', 'tag2', 'user_user1', 'user_user2']),
|
|
20
|
-
(True, {'artefacts': [(
|
|
21
|
-
['tag3'], 'status2', ['user3']
|
|
22
|
-
)]}, ['status2', 'tag3', 'user_user3'])
|
|
23
|
-
])
|
|
24
|
-
@patch('ara_cli.template_manager.DirectoryNavigator')
|
|
25
|
-
@patch('ara_cli.artefact_reader.ArtefactReader')
|
|
26
|
-
def test_extract_tags(mock_artefact_reader, mock_directory_navigator, artefact, navigate_to_target, artefact_data, expected_tags):
|
|
27
|
-
# Mock the artefact reader to return artefact data
|
|
28
|
-
mock_artefact_reader.read_artefacts.return_value = {'key': [artefact(*data) for data in artefact_data['artefacts']]}
|
|
29
|
-
|
|
30
|
-
# Mock the directory navigator
|
|
31
|
-
mock_navigator_instance = mock_directory_navigator.return_value
|
|
32
|
-
mock_navigator_instance.navigate_to_target = MagicMock()
|
|
33
|
-
|
|
34
|
-
tag_extractor = TagExtractor()
|
|
35
|
-
|
|
36
|
-
# Run the extract_tags method
|
|
37
|
-
result = tag_extractor.extract_tags(navigate_to_target=navigate_to_target)
|
|
38
|
-
|
|
39
|
-
# Assertions
|
|
40
|
-
if navigate_to_target:
|
|
41
|
-
mock_navigator_instance.navigate_to_target.assert_called_once()
|
|
42
|
-
else:
|
|
43
|
-
mock_navigator_instance.navigate_to_target.assert_not_called()
|
|
44
|
-
|
|
45
|
-
assert result == expected_tags
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/artefact_models/businessgoal_artefact_model.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/prompt-modules/blueprints/empty.blueprint.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/prompt-modules/commands/empty.commands.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/prompt-modules/intentions/empty.intention.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/prompt-modules/rules/code_analyst.rules.md
RENAMED
|
File without changes
|
|
File without changes
|
{ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/prompt-modules/rules/error_analyst.rules.md
RENAMED
|
File without changes
|
{ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/prompt-modules/rules/gherkin_expert.rules.md
RENAMED
|
File without changes
|
|
File without changes
|
{ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/prompt-modules/rules/product_owner.rules.md
RENAMED
|
File without changes
|
{ara_cli-0.1.9.53 → ara_cli-0.1.9.54}/ara_cli/templates/prompt-modules/rules/python_behave.rules.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|