Skip to content

Commit 24fa3c7

Browse files
committed
further refactor
1 parent 8d0c8bd commit 24fa3c7

File tree

5 files changed

+358
-417
lines changed

5 files changed

+358
-417
lines changed

src/lib.rs

+183-2
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,13 @@ mod list;
99
mod pixi_lock;
1010
mod read_remote;
1111

12+
use std::{io, io::Write};
13+
14+
use cli::{Cli, CondaDenyCliConfig};
1215
use colored::Colorize;
16+
use conda_deny_config::CondaDenyTomlConfig;
1317
use license_info::LicenseInfo;
14-
use license_whitelist::IgnorePackage;
18+
use license_whitelist::{get_license_information_from_toml_config, IgnorePackage};
1519

1620
use anyhow::{Context, Result};
1721
use log::debug;
@@ -61,7 +65,184 @@ pub fn fetch_license_infos(config: &CondaDenyCheckConfig) -> Result<LicenseInfos
6165
}
6266
}
6367

64-
pub fn list(config: &CondaDenyListConfig) -> Result<()> {
68+
pub fn get_config_options(
69+
config: Option<String>,
70+
cli_config: CondaDenyCliConfig,
71+
) -> Result<CondaDenyConfig> {
72+
let toml_config = if let Some(config_path) = config {
73+
CondaDenyTomlConfig::from_path(config_path.as_str())
74+
.with_context(|| format!("Failed to parse config file {}", config_path))?
75+
} else {
76+
match CondaDenyTomlConfig::from_path("pixi.toml")
77+
.with_context(|| "Failed to parse config file pixi.toml")
78+
{
79+
Ok(config) => {
80+
debug!("Successfully loaded config from pixi.toml");
81+
config
82+
}
83+
Err(e) => {
84+
debug!(
85+
"Error parsing config file: pixi.toml: {}. Attempting to use pyproject.toml instead...",
86+
e
87+
);
88+
CondaDenyTomlConfig::from_path("pyproject.toml")
89+
.context(e)
90+
.with_context(|| "Failed to parse config file pyproject.toml")?
91+
}
92+
}
93+
};
94+
95+
debug!("Parsed TOML config: {:?}", toml_config);
96+
97+
let config = match cli_config {
98+
CondaDenyCliConfig::Check {
99+
lockfile,
100+
prefix,
101+
platform,
102+
environment,
103+
include_safe,
104+
osi,
105+
ignore_pypi,
106+
} => {
107+
// cli overrides toml configuration
108+
let lockfile = lockfile.unwrap_or(toml_config.get_lockfile_spec());
109+
let prefix = prefix.unwrap_or_default();
110+
if lockfile.is_empty() && prefix.is_empty() {
111+
return Err(anyhow::anyhow!("No lockfiles or conda prefixes provided"));
112+
}
113+
114+
let platform = if platform.is_some() {
115+
platform
116+
} else {
117+
toml_config.get_platform_spec()
118+
};
119+
if platform.is_some() && !prefix.is_empty() {
120+
return Err(anyhow::anyhow!(
121+
"Cannot specify platforms and conda prefixes at the same time"
122+
));
123+
}
124+
125+
let environment = if environment.is_some() {
126+
environment
127+
} else {
128+
toml_config.get_environment_spec()
129+
};
130+
if environment.is_some() && !prefix.is_empty() {
131+
return Err(anyhow::anyhow!(
132+
"Cannot specify environments and conda prefixes at the same time"
133+
));
134+
}
135+
136+
let license_whitelist = toml_config.get_license_whitelists();
137+
138+
// defaults to false
139+
let osi = if osi.is_some() {
140+
osi
141+
} else {
142+
toml_config.get_osi()
143+
}
144+
.unwrap_or(false);
145+
if osi && !license_whitelist.is_empty() {
146+
return Err(anyhow::anyhow!(
147+
"Cannot use OSI mode and license whitelists at the same time"
148+
));
149+
}
150+
151+
if !osi && license_whitelist.is_empty() {
152+
return Err(anyhow::anyhow!("No license whitelist provided"));
153+
}
154+
155+
// defaults to false
156+
let ignore_pypi = if ignore_pypi.is_some() {
157+
ignore_pypi
158+
} else {
159+
toml_config.get_ignore_pypi()
160+
}
161+
.unwrap_or(false);
162+
163+
let (safe_licenses, ignore_packages) =
164+
get_license_information_from_toml_config(toml_config)?;
165+
166+
CondaDenyConfig::Check(CondaDenyCheckConfig {
167+
prefix,
168+
lockfile,
169+
platform,
170+
environment,
171+
include_safe,
172+
osi,
173+
ignore_pypi,
174+
safe_licenses,
175+
ignore_packages,
176+
})
177+
}
178+
CondaDenyCliConfig::List {
179+
lockfile,
180+
prefix,
181+
platform,
182+
environment,
183+
} => {
184+
// todo: refactor with check
185+
// cli overrides toml configuration
186+
let lockfile = lockfile.unwrap_or(toml_config.get_lockfile_spec());
187+
let prefix = prefix.unwrap_or_default();
188+
if lockfile.is_empty() && prefix.is_empty() {
189+
return Err(anyhow::anyhow!("No lockfiles or conda prefixes provided"));
190+
}
191+
192+
let platform = if platform.is_some() {
193+
platform
194+
} else {
195+
toml_config.get_platform_spec()
196+
};
197+
if platform.is_some() && !prefix.is_empty() {
198+
return Err(anyhow::anyhow!(
199+
"Cannot specify platforms and conda prefixes at the same time"
200+
));
201+
}
202+
203+
let environment = if environment.is_some() {
204+
environment
205+
} else {
206+
toml_config.get_environment_spec()
207+
};
208+
if environment.is_some() && !prefix.is_empty() {
209+
return Err(anyhow::anyhow!(
210+
"Cannot specify environments and conda prefixes at the same time"
211+
));
212+
}
213+
214+
CondaDenyConfig::List(CondaDenyListConfig {
215+
prefix,
216+
lockfile,
217+
platform,
218+
environment,
219+
})
220+
}
221+
};
222+
223+
Ok(config)
224+
}
225+
226+
pub fn check<W: Write>(check_config: CondaDenyCheckConfig, mut out: W) -> Result<()> {
227+
let (safe_dependencies, unsafe_dependencies) = check_license_infos(&check_config)?;
228+
229+
writeln!(
230+
out,
231+
"{}",
232+
format_check_output(
233+
safe_dependencies,
234+
unsafe_dependencies.clone(),
235+
check_config.include_safe,
236+
)
237+
)?;
238+
239+
if !unsafe_dependencies.is_empty() {
240+
std::process::exit(1);
241+
};
242+
Ok(())
243+
}
244+
245+
pub fn list<W: Write>(config: &CondaDenyListConfig, mut out: W) -> Result<()> {
65246
panic!("TODO");
66247
// let license_infos =
67248
// fetch_license_infos(config).with_context(|| "Fetching license information failed.")?;

src/license_info.rs

+30-16
Original file line numberDiff line numberDiff line change
@@ -238,17 +238,25 @@ impl LicenseInfos {
238238
match &license_info.license {
239239
LicenseState::Valid(license) => {
240240
if check_expression_safety(license, &config.safe_licenses)
241-
|| is_package_ignored_2(&config.ignore_packages, &license_info.package_name, &license_info.version)
242-
.unwrap()
241+
|| is_package_ignored_2(
242+
&config.ignore_packages,
243+
&license_info.package_name,
244+
&license_info.version,
245+
)
246+
.unwrap()
243247
{
244248
safe_dependencies.push(license_info.clone());
245249
} else {
246250
unsafe_dependencies.push(license_info.clone());
247251
}
248252
}
249253
LicenseState::Invalid(_) => {
250-
if is_package_ignored_2(&config.ignore_packages, &license_info.package_name, &license_info.version)
251-
.unwrap()
254+
if is_package_ignored_2(
255+
&config.ignore_packages,
256+
&license_info.package_name,
257+
&license_info.version,
258+
)
259+
.unwrap()
252260
{
253261
safe_dependencies.push(license_info.clone());
254262
} else {
@@ -387,20 +395,26 @@ mod tests {
387395
license_infos: vec![safe_license_info.clone(), safe_license_info.clone()],
388396
};
389397

390-
panic!("TODO");
391-
392-
// let license_whitelist = ParsedLicenseWhitelist {
393-
// safe_licenses: vec![Expression::parse("MIT").unwrap()],
394-
// ignore_packages: vec![],
395-
// };
398+
let safe_licenses = vec![Expression::parse("MIT").unwrap()];
399+
let ignore_packages = vec![];
400+
401+
let config = CondaDenyCheckConfig {
402+
prefix: vec![],
403+
lockfile: vec![],
404+
platform: None,
405+
environment: None,
406+
include_safe: false,
407+
osi: false,
408+
ignore_pypi: false,
409+
safe_licenses,
410+
ignore_packages,
411+
};
396412

397-
// let (_safe_dependencies, _unsafe_dependencies) =
398-
// unsafe_license_infos.check(&license_whitelist);
399-
// assert!(!_unsafe_dependencies.is_empty());
413+
let (_safe_dependencies, _unsafe_dependencies) = unsafe_license_infos.check(&config);
414+
assert!(!_unsafe_dependencies.is_empty());
400415

401-
// let (_safe_dependencies, _unsafe_dependencies) =
402-
// safe_license_infos.check(&license_whitelist);
403-
// assert!(_unsafe_dependencies.is_empty());
416+
let (_safe_dependencies, _unsafe_dependencies) = safe_license_infos.check(&config);
417+
assert!(_unsafe_dependencies.is_empty());
404418
}
405419

406420
#[test]

0 commit comments

Comments
 (0)