Skip to main content

deps_bundler/
formatter.rs

1//! Version formatting for Bundler ecosystem.
2
3use crate::version::version_matches_requirement;
4use deps_core::lsp_helpers::EcosystemFormatter;
5
6/// Formatter for Bundler/Ruby gem versions.
7pub struct BundlerFormatter;
8
9impl EcosystemFormatter for BundlerFormatter {
10    fn format_version_for_text_edit(&self, version: &str) -> String {
11        version.to_string()
12    }
13
14    fn package_url(&self, name: &str) -> String {
15        format!("https://rubygems.org/gems/{name}")
16    }
17
18    fn version_satisfies_requirement(&self, version: &str, requirement: &str) -> bool {
19        version_matches_requirement(version, requirement)
20    }
21}
22
23#[cfg(test)]
24mod tests {
25    use super::*;
26
27    #[test]
28    fn test_format_version() {
29        let formatter = BundlerFormatter;
30        assert_eq!(formatter.format_version_for_text_edit("7.0.8"), "7.0.8");
31        assert_eq!(formatter.format_version_for_text_edit("1.0.0"), "1.0.0");
32    }
33
34    #[test]
35    fn test_package_url() {
36        let formatter = BundlerFormatter;
37        assert_eq!(
38            formatter.package_url("rails"),
39            "https://rubygems.org/gems/rails"
40        );
41        assert_eq!(
42            formatter.package_url("nokogiri"),
43            "https://rubygems.org/gems/nokogiri"
44        );
45    }
46
47    #[test]
48    fn test_pessimistic_operator() {
49        let formatter = BundlerFormatter;
50
51        // ~> 7.0 means >= 7.0, < 8.0
52        assert!(formatter.version_satisfies_requirement("7.0.8", "~> 7.0"));
53        assert!(formatter.version_satisfies_requirement("7.0.0", "~> 7.0"));
54        assert!(formatter.version_satisfies_requirement("7.9.9", "~> 7.0"));
55        assert!(!formatter.version_satisfies_requirement("8.0.0", "~> 7.0"));
56        assert!(!formatter.version_satisfies_requirement("6.9.9", "~> 7.0"));
57
58        // ~> 1.0.5 means >= 1.0.5, < 1.1.0
59        assert!(formatter.version_satisfies_requirement("1.0.5", "~> 1.0.5"));
60        assert!(formatter.version_satisfies_requirement("1.0.9", "~> 1.0.5"));
61        assert!(!formatter.version_satisfies_requirement("1.1.0", "~> 1.0.5"));
62        assert!(!formatter.version_satisfies_requirement("1.0.4", "~> 1.0.5"));
63    }
64
65    #[test]
66    fn test_comparison_operators() {
67        let formatter = BundlerFormatter;
68
69        // >= operator
70        assert!(formatter.version_satisfies_requirement("1.5.0", ">= 1.1"));
71        assert!(formatter.version_satisfies_requirement("1.1.0", ">= 1.1"));
72        assert!(!formatter.version_satisfies_requirement("1.0.0", ">= 1.1"));
73
74        // > operator
75        assert!(formatter.version_satisfies_requirement("2.0.0", "> 1.0"));
76        assert!(!formatter.version_satisfies_requirement("1.0.0", "> 1.0"));
77
78        // <= operator
79        assert!(formatter.version_satisfies_requirement("1.0.0", "<= 1.0"));
80        assert!(!formatter.version_satisfies_requirement("1.1.0", "<= 1.0"));
81
82        // < operator
83        assert!(formatter.version_satisfies_requirement("0.9.0", "< 1.0"));
84        assert!(!formatter.version_satisfies_requirement("1.0.0", "< 1.0"));
85    }
86
87    #[test]
88    fn test_exact_match() {
89        let formatter = BundlerFormatter;
90
91        assert!(formatter.version_satisfies_requirement("1.0.0", "= 1.0.0"));
92        assert!(!formatter.version_satisfies_requirement("1.0.1", "= 1.0.0"));
93
94        assert!(formatter.version_satisfies_requirement("1.0.1", "!= 1.0.0"));
95        assert!(!formatter.version_satisfies_requirement("1.0.0", "!= 1.0.0"));
96    }
97
98    #[test]
99    fn test_default_normalize_is_identity() {
100        let formatter = BundlerFormatter;
101        assert_eq!(formatter.normalize_package_name("rails"), "rails");
102        assert_eq!(
103            formatter.normalize_package_name("rspec-rails"),
104            "rspec-rails"
105        );
106    }
107}