Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow setting enduser flag automatically #646

Merged
merged 1 commit into from
Jun 5, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions crates/cli/src/build/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,7 @@ pub async fn build(args: &BuildArgs) -> Result<()> {
landscape_data.add_github_data(&github_data);
landscape_data.add_member_subcategory(&settings.members_category);
landscape_data.add_tags(&settings);
landscape_data.set_enduser_flag(&settings);

// Collect CLOMonitor reports summaries and copy them to the output directory
collect_clomonitor_reports(&cache, &mut landscape_data, &settings, &args.output_dir).await?;
Expand Down
105 changes: 104 additions & 1 deletion crates/core/src/data.rs
Original file line number Diff line number Diff line change
Expand Up @@ -282,6 +282,41 @@ impl LandscapeData {
}
}
}

/// Set items `enduser` flag based on the settings provided.
#[instrument(skip_all)]
pub fn set_enduser_flag(&mut self, settings: &LandscapeSettings) {
let Some(enduser) = &settings.enduser else {
return;
};

// Iterate over items and set enduser flag when applicable
for item in &mut self.items {
// `enduser` values set at the item level have precedence
if item.enduser.is_some() {
continue;
}

// Set `enduser` flag when the category/subcategory matches
for rule in enduser {
// Consider an empty list of subcategories as None
let subcategories = rule.subcategories.as_ref().and_then(|s| {
if s.is_empty() {
return None;
}
Some(s)
});

if let Some(subcategories) = &subcategories {
if item.category == rule.category && subcategories.contains(&item.subcategory) {
item.enduser = Some(true);
}
} else if item.category == rule.category {
item.enduser = Some(true);
}
}
}
}
}

impl From<legacy::LandscapeData> for LandscapeData {
Expand Down Expand Up @@ -902,7 +937,7 @@ pub struct RepositoryGithubData {
#[cfg(test)]
mod tests {
use super::*;
use crate::settings::{FeaturedItemRule, FeaturedItemRuleOption, TagRule};
use crate::settings::{EndUserRule, FeaturedItemRule, FeaturedItemRuleOption, TagRule};

const DATA_FILE: &str = "data.yml";
const TESTS_DATA_FILE: &str = "src/testdata/data.yml";
Expand Down Expand Up @@ -1229,6 +1264,74 @@ mod tests {
assert_eq!(landscape_data.items[0].tag, Some("tag2".to_string()));
}

#[test]
fn landscape_data_set_enduser_flag_category_match() {
let mut landscape_data = LandscapeData::default();
landscape_data.items.push(Item {
category: "Category".to_string(),
maturity: Some("graduated".to_string()),
..Default::default()
});

let enduser = Some(vec![EndUserRule {
category: "Category".to_string(),
subcategories: Some(vec![]),
}]);
let settings = LandscapeSettings {
enduser,
..Default::default()
};

landscape_data.set_enduser_flag(&settings);
assert_eq!(landscape_data.items[0].enduser, Some(true));
}

#[test]
fn landscape_data_set_enduser_flag_subcategory_match() {
let mut landscape_data = LandscapeData::default();
landscape_data.items.push(Item {
category: "Category".to_string(),
subcategory: "Subcategory".to_string(),
maturity: Some("graduated".to_string()),
..Default::default()
});

let enduser = Some(vec![EndUserRule {
category: "Category".to_string(),
subcategories: Some(vec!["Subcategory".to_string()]),
}]);
let settings = LandscapeSettings {
enduser,
..Default::default()
};

landscape_data.set_enduser_flag(&settings);
assert_eq!(landscape_data.items[0].enduser, Some(true));
}

#[test]
fn landscape_data_set_enduser_flag_already_set() {
let mut landscape_data = LandscapeData::default();
landscape_data.items.push(Item {
category: "Category".to_string(),
maturity: Some("graduated".to_string()),
enduser: Some(false),
..Default::default()
});

let enduser = Some(vec![EndUserRule {
category: "Category".to_string(),
subcategories: Some(vec![]),
}]);
let settings = LandscapeSettings {
enduser,
..Default::default()
};

landscape_data.set_enduser_flag(&settings);
assert_eq!(landscape_data.items[0].enduser, Some(false));
}

#[test]
#[allow(clippy::too_many_lines)]
fn landscape_data_from_legacy_data() {
Expand Down
13 changes: 13 additions & 0 deletions crates/core/src/settings.rs
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,9 @@ pub struct LandscapeSettings {
#[serde(skip_serializing_if = "Option::is_none")]
pub colors: Option<Colors>,

#[serde(skip_serializing_if = "Option::is_none")]
pub enduser: Option<Vec<EndUserRule>>,

#[serde(skip_serializing_if = "Option::is_none")]
pub featured_items: Option<Vec<FeaturedItemRule>>,

Expand Down Expand Up @@ -516,6 +519,16 @@ pub struct Colors {
pub color7: String,
}

/// Rule to automatically set the `enduser` flag on the items that belong to
/// the category (and optionally subcategories) defined.
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
pub struct EndUserRule {
pub category: CategoryName,

#[serde(skip_serializing_if = "Option::is_none")]
pub subcategories: Option<Vec<SubcategoryName>>,
}

/// Featured item rule information. A featured item is specially highlighted in
/// the web application, usually making it larger with some special styling.
/// These rules are used to decide which items should be featured.
Expand Down
1 change: 1 addition & 0 deletions crates/wasm/overlay/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@ pub async fn get_overlay_data(input: JsValue) -> Result<String, String> {
landscape_data.add_github_data(&github_data);
landscape_data.add_member_subcategory(&settings.members_category);
landscape_data.add_tags(&settings);
landscape_data.set_enduser_flag(&settings);
set_clomonitor_report_summary(&mut landscape_data, &deployed_items);
set_logos_url(&mut landscape_data, input.logos_url, &deployed_items);

Expand Down
17 changes: 17 additions & 0 deletions docs/config/settings.yml
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,23 @@ colors:
color6: "rgba(0, 42, 81, 0.7)"
color7: "rgba(180, 219, 255, 1)"

# End user (optional)
#
# This section allows defining what items should be marked as `end user` based
# on the category and subcategory they belong to. If the `enduser` field has
# been set on a given item, that value will take precedence.
#
# enduser:
# - category: <CATEGORY1> (required)
# subcategories: (optional)
# - <SUBCATEGORY1>
# - category: <CATEGORY2>
#
enduser:
- category: CNCF Members
subcategories:
- End User Supporter

# Featured items (optional)
#
# This section allows highlighting items that match certain criteria. You can
Expand Down