use super::{FrameworkDetectionUtils, LanguageFrameworkDetector, TechnologyRule};
use crate::analyzer::{DetectedLanguage, DetectedTechnology, LibraryType, TechnologyCategory};
use crate::error::Result;
pub struct PythonFrameworkDetector;
impl LanguageFrameworkDetector for PythonFrameworkDetector {
fn detect_frameworks(&self, language: &DetectedLanguage) -> Result<Vec<DetectedTechnology>> {
let rules = get_python_technology_rules();
let all_deps: Vec<String> = language
.main_dependencies
.iter()
.chain(language.dev_dependencies.iter())
.cloned()
.collect();
let technologies = FrameworkDetectionUtils::detect_technologies_by_dependencies(
&rules,
&all_deps,
language.confidence,
);
Ok(technologies)
}
fn supported_languages(&self) -> Vec<&'static str> {
vec!["Python"]
}
}
fn get_python_technology_rules() -> Vec<TechnologyRule> {
vec![
TechnologyRule {
name: "Django".to_string(),
category: TechnologyCategory::BackendFramework,
confidence: 0.95,
dependency_patterns: vec!["django".to_string(), "Django".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: true,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "Django REST Framework".to_string(),
category: TechnologyCategory::BackendFramework,
confidence: 0.90,
dependency_patterns: vec![
"djangorestframework".to_string(),
"rest_framework".to_string(),
],
requires: vec!["Django".to_string()],
conflicts_with: vec![],
is_primary_indicator: false,
alternative_names: vec!["DRF".to_string()],
file_indicators: vec![],
},
TechnologyRule {
name: "Flask".to_string(),
category: TechnologyCategory::BackendFramework,
confidence: 0.95,
dependency_patterns: vec!["flask".to_string(), "Flask".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: true,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "FastAPI".to_string(),
category: TechnologyCategory::BackendFramework,
confidence: 0.95,
dependency_patterns: vec!["fastapi".to_string(), "FastAPI".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: true,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "Starlette".to_string(),
category: TechnologyCategory::BackendFramework,
confidence: 0.90,
dependency_patterns: vec!["starlette".to_string(), "Starlette".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: true,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "Quart".to_string(),
category: TechnologyCategory::BackendFramework,
confidence: 0.90,
dependency_patterns: vec!["quart".to_string(), "Quart".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: true,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "Sanic".to_string(),
category: TechnologyCategory::BackendFramework,
confidence: 0.90,
dependency_patterns: vec!["sanic".to_string(), "Sanic".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: true,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "Bottle".to_string(),
category: TechnologyCategory::BackendFramework,
confidence: 0.85,
dependency_patterns: vec!["bottle".to_string(), "Bottle".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: true,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "Falcon".to_string(),
category: TechnologyCategory::BackendFramework,
confidence: 0.85,
dependency_patterns: vec!["falcon".to_string(), "Falcon".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: true,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "Hug".to_string(),
category: TechnologyCategory::BackendFramework,
confidence: 0.85,
dependency_patterns: vec!["hug".to_string(), "Hug".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: true,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "Molten".to_string(),
category: TechnologyCategory::BackendFramework,
confidence: 0.85,
dependency_patterns: vec!["molten".to_string(), "Molten".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: true,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "Responder".to_string(),
category: TechnologyCategory::BackendFramework,
confidence: 0.85,
dependency_patterns: vec!["responder".to_string(), "Responder".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: true,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "Vibora".to_string(),
category: TechnologyCategory::BackendFramework,
confidence: 0.85,
dependency_patterns: vec!["vibora".to_string(), "Vibora".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: true,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "Asgi".to_string(),
category: TechnologyCategory::BackendFramework,
confidence: 0.85,
dependency_patterns: vec!["asgi".to_string(), "Asgi".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: true,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "Tornado".to_string(),
category: TechnologyCategory::BackendFramework,
confidence: 0.90,
dependency_patterns: vec!["tornado".to_string(), "Tornado".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: true,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "CherryPy".to_string(),
category: TechnologyCategory::BackendFramework,
confidence: 0.85,
dependency_patterns: vec!["cherrypy".to_string(), "CherryPy".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: true,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "Web2py".to_string(),
category: TechnologyCategory::BackendFramework,
confidence: 0.85,
dependency_patterns: vec!["web2py".to_string(), "Web2py".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: true,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "Pyramid".to_string(),
category: TechnologyCategory::BackendFramework,
confidence: 0.90,
dependency_patterns: vec!["pyramid".to_string(), "Pyramid".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: true,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "TurboGears".to_string(),
category: TechnologyCategory::BackendFramework,
confidence: 0.85,
dependency_patterns: vec!["tg".to_string(), "TurboGears".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: true,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "Klein".to_string(),
category: TechnologyCategory::BackendFramework,
confidence: 0.85,
dependency_patterns: vec!["klein".to_string(), "Klein".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: true,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "Morepath".to_string(),
category: TechnologyCategory::BackendFramework,
confidence: 0.85,
dependency_patterns: vec!["morepath".to_string(), "Morepath".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: true,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "Masonite".to_string(),
category: TechnologyCategory::BackendFramework,
confidence: 0.85,
dependency_patterns: vec!["masonite".to_string(), "Masonite".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: true,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "Litestar".to_string(),
category: TechnologyCategory::BackendFramework,
confidence: 0.90,
dependency_patterns: vec!["litestar".to_string(), "Litestar".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: true,
alternative_names: vec!["Starlite".to_string()],
file_indicators: vec![],
},
TechnologyRule {
name: "Connexion".to_string(),
category: TechnologyCategory::BackendFramework,
confidence: 0.85,
dependency_patterns: vec!["connexion".to_string(), "Connexion".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: true,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "Nameko".to_string(),
category: TechnologyCategory::BackendFramework,
confidence: 0.85,
dependency_patterns: vec!["nameko".to_string(), "Nameko".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: true,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "Aiohttp".to_string(),
category: TechnologyCategory::BackendFramework,
confidence: 0.90,
dependency_patterns: vec!["aiohttp".to_string(), "Aiohttp".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: true,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "asyncio".to_string(),
category: TechnologyCategory::Runtime,
confidence: 0.85,
dependency_patterns: vec!["asyncio".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: false,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "Trio".to_string(),
category: TechnologyCategory::Runtime,
confidence: 0.85,
dependency_patterns: vec!["trio".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: false,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "Curio".to_string(),
category: TechnologyCategory::Runtime,
confidence: 0.85,
dependency_patterns: vec!["curio".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: false,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "Streamlit".to_string(),
category: TechnologyCategory::FrontendFramework,
confidence: 0.95,
dependency_patterns: vec!["streamlit".to_string(), "Streamlit".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: true,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "Gradio".to_string(),
category: TechnologyCategory::FrontendFramework,
confidence: 0.95,
dependency_patterns: vec!["gradio".to_string(), "Gradio".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: true,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "Dash".to_string(),
category: TechnologyCategory::FrontendFramework,
confidence: 0.90,
dependency_patterns: vec!["dash".to_string(), "Dash".to_string()],
requires: vec!["Flask".to_string()],
conflicts_with: vec![],
is_primary_indicator: true,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "Panel".to_string(),
category: TechnologyCategory::FrontendFramework,
confidence: 0.90,
dependency_patterns: vec!["panel".to_string(), "Panel".to_string()],
requires: vec!["Bokeh".to_string()],
conflicts_with: vec![],
is_primary_indicator: true,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "NiceGUI".to_string(),
category: TechnologyCategory::FrontendFramework,
confidence: 0.90,
dependency_patterns: vec!["nicegui".to_string(), "NiceGUI".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: true,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "Reflex".to_string(),
category: TechnologyCategory::FrontendFramework,
confidence: 0.90,
dependency_patterns: vec!["reflex".to_string(), "Reflex".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: true,
alternative_names: vec!["pynecone".to_string()],
file_indicators: vec![],
},
TechnologyRule {
name: "PyWebIO".to_string(),
category: TechnologyCategory::FrontendFramework,
confidence: 0.85,
dependency_patterns: vec!["pywebio".to_string(), "PyWebIO".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: true,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "Anvil".to_string(),
category: TechnologyCategory::FrontendFramework,
confidence: 0.85,
dependency_patterns: vec!["anvil".to_string(), "Anvil".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: true,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "NumPy".to_string(),
category: TechnologyCategory::Library(LibraryType::Utility),
confidence: 0.90,
dependency_patterns: vec!["numpy".to_string(), "NumPy".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: false,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "SciPy".to_string(),
category: TechnologyCategory::Library(LibraryType::Utility),
confidence: 0.90,
dependency_patterns: vec!["scipy".to_string(), "SciPy".to_string()],
requires: vec!["NumPy".to_string()],
conflicts_with: vec![],
is_primary_indicator: false,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "Pandas".to_string(),
category: TechnologyCategory::Library(LibraryType::Utility),
confidence: 0.90,
dependency_patterns: vec!["pandas".to_string(), "Pandas".to_string()],
requires: vec!["NumPy".to_string()],
conflicts_with: vec![],
is_primary_indicator: false,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "Matplotlib".to_string(),
category: TechnologyCategory::Library(LibraryType::Utility),
confidence: 0.85,
dependency_patterns: vec!["matplotlib".to_string(), "Matplotlib".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: false,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "Seaborn".to_string(),
category: TechnologyCategory::Library(LibraryType::Utility),
confidence: 0.85,
dependency_patterns: vec!["seaborn".to_string(), "Seaborn".to_string()],
requires: vec!["Matplotlib".to_string(), "Pandas".to_string()],
conflicts_with: vec![],
is_primary_indicator: false,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "Plotly".to_string(),
category: TechnologyCategory::Library(LibraryType::Utility),
confidence: 0.85,
dependency_patterns: vec!["plotly".to_string(), "Plotly".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: false,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "Bokeh".to_string(),
category: TechnologyCategory::Library(LibraryType::Utility),
confidence: 0.85,
dependency_patterns: vec!["bokeh".to_string(), "Bokeh".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: false,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "TensorFlow".to_string(),
category: TechnologyCategory::Library(LibraryType::Utility),
confidence: 0.95,
dependency_patterns: vec!["tensorflow".to_string(), "TensorFlow".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: false,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "PyTorch".to_string(),
category: TechnologyCategory::Library(LibraryType::Utility),
confidence: 0.95,
dependency_patterns: vec!["torch".to_string(), "PyTorch".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: false,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "Scikit-learn".to_string(),
category: TechnologyCategory::Library(LibraryType::Utility),
confidence: 0.90,
dependency_patterns: vec!["scikit-learn".to_string(), "sklearn".to_string()],
requires: vec!["NumPy".to_string(), "SciPy".to_string()],
conflicts_with: vec![],
is_primary_indicator: false,
alternative_names: vec!["sklearn".to_string()],
file_indicators: vec![],
},
TechnologyRule {
name: "Keras".to_string(),
category: TechnologyCategory::Library(LibraryType::Utility),
confidence: 0.90,
dependency_patterns: vec!["keras".to_string(), "Keras".to_string()],
requires: vec!["TensorFlow".to_string()],
conflicts_with: vec![],
is_primary_indicator: false,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "XGBoost".to_string(),
category: TechnologyCategory::Library(LibraryType::Utility),
confidence: 0.85,
dependency_patterns: vec!["xgboost".to_string(), "XGBoost".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: false,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "LightGBM".to_string(),
category: TechnologyCategory::Library(LibraryType::Utility),
confidence: 0.85,
dependency_patterns: vec!["lightgbm".to_string(), "LightGBM".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: false,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "CatBoost".to_string(),
category: TechnologyCategory::Library(LibraryType::Utility),
confidence: 0.85,
dependency_patterns: vec!["catboost".to_string(), "CatBoost".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: false,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "SQLAlchemy".to_string(),
category: TechnologyCategory::Database,
confidence: 0.90,
dependency_patterns: vec!["sqlalchemy".to_string(), "SQLAlchemy".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: false,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "Peewee".to_string(),
category: TechnologyCategory::Database,
confidence: 0.85,
dependency_patterns: vec!["peewee".to_string(), "Peewee".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: false,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "Tortoise ORM".to_string(),
category: TechnologyCategory::Database,
confidence: 0.85,
dependency_patterns: vec!["tortoise-orm".to_string(), "tortoise".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: false,
alternative_names: vec!["tortoise".to_string()],
file_indicators: vec![],
},
TechnologyRule {
name: "Django ORM".to_string(),
category: TechnologyCategory::Database,
confidence: 0.90,
dependency_patterns: vec!["django".to_string()],
requires: vec!["Django".to_string()],
conflicts_with: vec![],
is_primary_indicator: false,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "MongoEngine".to_string(),
category: TechnologyCategory::Database,
confidence: 0.85,
dependency_patterns: vec!["mongoengine".to_string(), "MongoEngine".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: false,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "Pymongo".to_string(),
category: TechnologyCategory::Database,
confidence: 0.85,
dependency_patterns: vec!["pymongo".to_string(), "Pymongo".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: false,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "Pytest".to_string(),
category: TechnologyCategory::Testing,
confidence: 0.90,
dependency_patterns: vec!["pytest".to_string(), "Pytest".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: false,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "Unittest".to_string(),
category: TechnologyCategory::Testing,
confidence: 0.80,
dependency_patterns: vec!["unittest".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: false,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "Tox".to_string(),
category: TechnologyCategory::Testing,
confidence: 0.80,
dependency_patterns: vec!["tox".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: false,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "Nose".to_string(),
category: TechnologyCategory::Testing,
confidence: 0.75,
dependency_patterns: vec!["nose".to_string(), "nose2".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: false,
alternative_names: vec!["nose2".to_string()],
file_indicators: vec![],
},
TechnologyRule {
name: "Behave".to_string(),
category: TechnologyCategory::Testing,
confidence: 0.85,
dependency_patterns: vec!["behave".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: false,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "Hypothesis".to_string(),
category: TechnologyCategory::Testing,
confidence: 0.85,
dependency_patterns: vec!["hypothesis".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: false,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "Click".to_string(),
category: TechnologyCategory::Library(LibraryType::CLI),
confidence: 0.90,
dependency_patterns: vec!["click".to_string(), "Click".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: true,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "Argparse".to_string(),
category: TechnologyCategory::Library(LibraryType::CLI),
confidence: 0.80,
dependency_patterns: vec!["argparse".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: true,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "Fire".to_string(),
category: TechnologyCategory::Library(LibraryType::CLI),
confidence: 0.85,
dependency_patterns: vec!["fire".to_string(), "Fire".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: true,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "Typer".to_string(),
category: TechnologyCategory::Library(LibraryType::CLI),
confidence: 0.85,
dependency_patterns: vec!["typer".to_string(), "Typer".to_string()],
requires: vec!["Click".to_string()],
conflicts_with: vec![],
is_primary_indicator: true,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "Docopt".to_string(),
category: TechnologyCategory::Library(LibraryType::CLI),
confidence: 0.80,
dependency_patterns: vec!["docopt".to_string(), "Docopt".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: true,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "Plac".to_string(),
category: TechnologyCategory::Library(LibraryType::CLI),
confidence: 0.80,
dependency_patterns: vec!["plac".to_string(), "Plac".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: true,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "Celery".to_string(),
category: TechnologyCategory::Library(LibraryType::Utility),
confidence: 0.90,
dependency_patterns: vec!["celery".to_string(), "Celery".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: false,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "RQ".to_string(),
category: TechnologyCategory::Library(LibraryType::Utility),
confidence: 0.85,
dependency_patterns: vec!["rq".to_string(), "RQ".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: false,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "Dramatiq".to_string(),
category: TechnologyCategory::Library(LibraryType::Utility),
confidence: 0.85,
dependency_patterns: vec!["dramatiq".to_string(), "Dramatiq".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: false,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "Huey".to_string(),
category: TechnologyCategory::Library(LibraryType::Utility),
confidence: 0.85,
dependency_patterns: vec!["huey".to_string(), "Huey".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: false,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "Pydantic".to_string(),
category: TechnologyCategory::Library(LibraryType::Utility),
confidence: 0.90,
dependency_patterns: vec!["pydantic".to_string(), "Pydantic".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: false,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "ConfigParser".to_string(),
category: TechnologyCategory::Library(LibraryType::Utility),
confidence: 0.80,
dependency_patterns: vec!["configparser".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: false,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "PyYAML".to_string(),
category: TechnologyCategory::Library(LibraryType::Utility),
confidence: 0.85,
dependency_patterns: vec!["pyyaml".to_string(), "PyYAML".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: false,
alternative_names: vec!["yaml".to_string()],
file_indicators: vec![],
},
TechnologyRule {
name: "Toml".to_string(),
category: TechnologyCategory::Library(LibraryType::Utility),
confidence: 0.85,
dependency_patterns: vec!["toml".to_string(), "Toml".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: false,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "Requests".to_string(),
category: TechnologyCategory::Library(LibraryType::HttpClient),
confidence: 0.90,
dependency_patterns: vec!["requests".to_string(), "Requests".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: false,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "Httpx".to_string(),
category: TechnologyCategory::Library(LibraryType::HttpClient),
confidence: 0.85,
dependency_patterns: vec!["httpx".to_string(), "Httpx".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: false,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "Aiohttp Client".to_string(),
category: TechnologyCategory::Library(LibraryType::HttpClient),
confidence: 0.85,
dependency_patterns: vec!["aiohttp".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: false,
alternative_names: vec![],
file_indicators: vec![],
},
TechnologyRule {
name: "Urllib3".to_string(),
category: TechnologyCategory::Library(LibraryType::HttpClient),
confidence: 0.80,
dependency_patterns: vec!["urllib3".to_string(), "Urllib3".to_string()],
requires: vec![],
conflicts_with: vec![],
is_primary_indicator: false,
alternative_names: vec![],
file_indicators: vec![],
},
]
}