deps_bundler/
formatter.rs1use crate::version::version_matches_requirement;
4use deps_core::lsp_helpers::EcosystemFormatter;
5
6pub 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 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 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 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 assert!(formatter.version_satisfies_requirement("2.0.0", "> 1.0"));
76 assert!(!formatter.version_satisfies_requirement("1.0.0", "> 1.0"));
77
78 assert!(formatter.version_satisfies_requirement("1.0.0", "<= 1.0"));
80 assert!(!formatter.version_satisfies_requirement("1.1.0", "<= 1.0"));
81
82 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}