Commit 6d2901f2 authored by Wohlgemuth, Jason's avatar Wohlgemuth, Jason
Browse files

feat: Prepare code for containers and abstract virtual environments

parent 08f03aa8
Loading
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -43,7 +43,7 @@
  - [X] Auto-create (Conda/[Mamba](https://mamba.readthedocs.io/en/latest/index.html)) virtual environments
  - [X] Parallelize module preparation
- [ ] Enhanced URL security
  - [ ] Provide `--offline` flag to disable reachability check
  - [X] Provide `--offline` flag to disable reachability check
  - [ ] Filter remote module URLs against white list
  - [ ] Check remote URLs are valid and reachable
- [ ] Multi-platform release binaries published to GitLab repository
@@ -59,7 +59,7 @@
    - [ ] Add Docker (and Podman) environment
    - [ ] Add Apptainer environment
    - [ ] Add Pixi environment
- [ ] `--skip-verify-requirements` flag for running workflow without verifying environment
- [X] `--skip-verify-requirements` flag for running workflow without verifying environment
- [ ] "Check" subcommand
    - [X] Create standardized function signature for check modules
        ```rust
+434 −432
Original line number Diff line number Diff line
@@ -133,105 +133,103 @@ DA:51,0
DA:52,0
DA:53,0
DA:54,0
DA:58,0
DA:55,0
DA:59,0
DA:60,0
DA:62,0
DA:63,0
DA:68,0
DA:70,0
DA:64,0
DA:66,0
DA:67,0
DA:72,0
DA:74,0
DA:75,0
DA:76,0
DA:78,0
DA:79,0
DA:80,0
DA:82,0
DA:83,0
DA:85,0
DA:86,0
DA:84,0
DA:87,0
DA:89,0
DA:94,0
DA:96,0
DA:90,0
DA:91,0
DA:93,0
DA:98,0
DA:100,0
DA:101,0
DA:102,0
DA:104,0
DA:105,0
DA:106,0
DA:107,0
DA:109,0
DA:110,0
DA:112,0
DA:113,0
DA:115,0
DA:118,0
DA:111,0
DA:114,0
DA:116,0
DA:117,0
DA:119,0
DA:121,0
DA:122,0
DA:124,0
DA:123,0
DA:125,0
DA:126,0
DA:127,0
DA:128,0
DA:129,0
DA:130,0
DA:131,0
DA:132,0
DA:133,0
DA:135,0
DA:136,0
DA:137,0
DA:138,0
DA:139,0
DA:140,0
DA:141,0
DA:142,0
DA:144,0
DA:146,0
DA:148,0
DA:149,0
DA:150,0
DA:152,0
DA:153,0
DA:157,0
DA:158,0
DA:159,0
DA:160,0
DA:161,0
DA:162,0
DA:167,0
DA:168,0
DA:163,0
DA:164,0
DA:166,0
DA:171,0
DA:172,0
DA:175,0
DA:178,0
DA:180,0
DA:176,0
DA:179,0
DA:182,0
DA:185,0
DA:187,0
DA:184,0
DA:186,0
DA:189,0
DA:191,0
DA:194,0
DA:193,0
DA:195,0
DA:196,0
DA:198,0
DA:199,0
DA:200,0
DA:202,0
DA:204,0
DA:205,0
DA:206,0
DA:208,0
DA:209,0
DA:210,0
DA:212,0
DA:213,0
DA:214,0
DA:217,0
DA:218,0
DA:219,0
DA:221,0
DA:222,0
DA:224,0
DA:225,0
DA:223,0
DA:226,0
DA:228,0
DA:229,0
DA:232,0
DA:233,0
DA:234,0
DA:235,0
DA:236,0
DA:237,0
DA:238,0
DA:239,0
DA:240,0
DA:241,0
DA:242,0
DA:243,0
DA:244,0
DA:245,0
DA:246,0
@@ -239,14 +237,18 @@ DA:247,0
DA:248,0
DA:249,0
DA:250,0
DA:251,0
DA:252,0
DA:255,0
DA:258,0
DA:261,0
DA:263,0
DA:266,0
DA:268,0
LF:135
DA:253,0
DA:254,0
DA:256,0
DA:259,0
DA:262,0
DA:265,0
DA:267,0
DA:270,0
DA:272,0
LF:137
LH:0
end_of_record
TN:
@@ -369,67 +371,67 @@ LH:0
end_of_record
TN:
SF:/root/dev/command/pipe-lib/src/lib.rs
FN:364,Command::test
FN:391,Config::read
FN:415,Config::read_json
FN:436,Config::read_yaml
FN:453,Config::set_environment_variables
FN:467,<impl PartialEq for Details>::eq
FN:474,EnvironmentValue::from_string
FN:477,EnvironmentValue::from_value
FN:485,EnvironmentValue::prepend_prefix
FN:489,EnvironmentValue::trim_prefix
FN:493,EnvironmentValue::get_from_serde
FN:507,EnvironmentValue::get_all
FN:517,EnvironmentValue::print_all
FN:522,EnvironmentValue::set_variable
FN:532,EnvironmentValue::set_variables
FN:539,Extension::from_string
FN:548,Label::dry_run
FN:552,Label::fail
FN:556,Label::found
FN:560,Label::not_found
FN:564,Label::output
FN:568,Label::read
FN:572,Label::rejected
FN:576,Label::run
FN:580,Label::using
FN:586,ModuleUri<'_>::from
FN:596,ModuleUri<'_>::hash
FN:620,ModuleUri<'_>::get_whitelist
FN:623,ModuleUri<'_>::is_allowed
FN:626,ModuleUri<'_>::test
FN:627,ModuleUri<'_>::test::check
FN:644,ModuleUri<'_>::working_directory
FN:656,SemanticVersion::from_string
FN:679,Script::expand_arguments
FN:714,Script::expand_arguments_from
FN:746,Script::from_template
FN:774,Script::from_path
FN:786,Script::get_command
FN:792,Script::get_arguments
FN:803,Script::maybe_create_conda_environment
FN:836,Script::maybe_git_clone
FN:843,Script::python_default
FN:857,Script::run
FN:928,Script::with_current_dir
FN:966,Script::with_environment
FN:971,Script::with_envs
FN:980,StringTemplate::new
FN:989,StringTemplate::expand
FN:996,StringTemplate::get_variable
FN:1026,StringTemplate::is_handlebars
FN:1061,StringTemplate::remove_spaces
FN:1071,add_forward_slash
FN:1079,get_conda_environment_list
FN:1121,get_conda_environment_name
FN:1153,get_extension
FN:1157,get_parent
FN:1170,has_extension
FN:1174,is_stdin_piped
FN:1182,is_stdout_piped
FN:1200,read_file
FN:1214,to_string
FN:386,Command::test
FN:413,Config::read
FN:437,Config::read_json
FN:458,Config::read_yaml
FN:475,Config::set_environment_variables
FN:489,<impl PartialEq for Details>::eq
FN:496,EnvironmentValue::from_string
FN:499,EnvironmentValue::from_value
FN:507,EnvironmentValue::prepend_prefix
FN:511,EnvironmentValue::trim_prefix
FN:515,EnvironmentValue::get_from_serde
FN:529,EnvironmentValue::get_all
FN:539,EnvironmentValue::print_all
FN:544,EnvironmentValue::set_variable
FN:554,EnvironmentValue::set_variables
FN:561,Extension::from_string
FN:570,Label::dry_run
FN:574,Label::fail
FN:578,Label::found
FN:582,Label::not_found
FN:586,Label::output
FN:590,Label::read
FN:594,Label::rejected
FN:598,Label::run
FN:602,Label::using
FN:608,ModuleUri<'_>::from
FN:618,ModuleUri<'_>::hash
FN:642,ModuleUri<'_>::get_whitelist
FN:645,ModuleUri<'_>::is_allowed
FN:648,ModuleUri<'_>::test
FN:649,ModuleUri<'_>::test::check
FN:666,ModuleUri<'_>::working_directory
FN:678,SemanticVersion::from_string
FN:701,Script::expand_arguments
FN:736,Script::expand_arguments_from
FN:768,Script::from_template
FN:796,Script::from_path
FN:808,Script::get_command
FN:814,Script::get_arguments
FN:825,Script::maybe_create_conda_environment
FN:858,Script::maybe_git_clone
FN:865,Script::python_default
FN:879,Script::run
FN:950,Script::with_current_dir
FN:988,Script::with_environment
FN:993,Script::with_envs
FN:1002,StringTemplate::new
FN:1011,StringTemplate::expand
FN:1018,StringTemplate::get_variable
FN:1048,StringTemplate::is_handlebars
FN:1083,StringTemplate::remove_spaces
FN:1093,add_forward_slash
FN:1101,get_conda_environment_list
FN:1143,get_conda_environment_name
FN:1175,get_extension
FN:1179,get_parent
FN:1192,has_extension
FN:1196,is_stdin_piped
FN:1204,is_stdout_piped
FN:1222,read_file
FN:1236,to_string
FNF:61
FNDA:1,Command::test
FNDA:1,Config::read
@@ -468,8 +470,8 @@ FNDA:1,Script::expand_arguments
FNDA:1,Script::expand_arguments_from
FNDA:1,Script::from_template
FNDA:1,Script::from_path
FNDA:1,Script::get_command
FNDA:1,Script::get_arguments
FNDA:2,Script::get_command
FNDA:2,Script::get_arguments
FNDA:0,Script::maybe_create_conda_environment
FNDA:1,Script::maybe_git_clone
FNDA:0,Script::python_default
@@ -492,389 +494,389 @@ FNDA:0,is_stdin_piped
FNDA:0,is_stdout_piped
FNDA:1,read_file
FNDA:1,to_string
DA:364,1
DA:365,1
DA:369,2
DA:372,1
DA:373,1
DA:375,2
DA:376,1
DA:377,2
DA:378,4
DA:380,6
DA:381,2
DA:384,3
DA:385,1
DA:391,1
DA:392,2
DA:393,2
DA:386,1
DA:387,1
DA:391,2
DA:394,1
DA:396,0
DA:397,0
DA:400,2
DA:401,1
DA:403,0
DA:404,0
DA:415,1
DA:416,2
DA:417,4
DA:395,1
DA:397,2
DA:398,1
DA:399,2
DA:400,4
DA:402,6
DA:403,2
DA:406,3
DA:407,1
DA:413,1
DA:414,2
DA:415,2
DA:416,1
DA:418,0
DA:419,0
DA:420,0
DA:423,4
DA:424,2
DA:425,4
DA:422,2
DA:423,1
DA:425,0
DA:426,0
DA:428,6
DA:429,2
DA:436,1
DA:437,2
DA:438,1
DA:440,0
DA:437,1
DA:438,2
DA:439,4
DA:441,0
DA:444,2
DA:445,1
DA:442,0
DA:445,4
DA:446,2
DA:447,0
DA:449,3
DA:450,1
DA:453,0
DA:454,0
DA:455,0
DA:456,0
DA:457,0
DA:458,0
DA:447,4
DA:448,0
DA:450,6
DA:451,2
DA:458,1
DA:459,2
DA:460,1
DA:462,0
DA:463,0
DA:466,2
DA:467,1
DA:468,1
DA:474,0
DA:468,2
DA:469,0
DA:471,3
DA:472,1
DA:475,0
DA:476,0
DA:477,0
DA:478,0
DA:479,0
DA:480,0
DA:481,0
DA:482,0
DA:485,0
DA:486,0
DA:489,1
DA:490,1
DA:491,2
DA:493,0
DA:494,0
DA:495,0
DA:496,0
DA:497,0
DA:498,0
DA:499,0
DA:500,0
DA:501,0
DA:502,0
DA:503,0
DA:505,0
DA:507,1
DA:508,1
DA:509,2
DA:510,2
DA:511,2
DA:512,2
DA:513,1
DA:504,0
DA:507,0
DA:508,0
DA:511,1
DA:512,1
DA:513,2
DA:515,0
DA:516,0
DA:517,0
DA:518,0
DA:519,0
DA:520,0
DA:521,0
DA:522,0
DA:523,0
DA:524,0
DA:525,0
DA:526,0
DA:527,0
DA:528,0
DA:532,0
DA:533,0
DA:535,0
DA:539,1
DA:540,2
DA:541,2
DA:542,3
DA:543,0
DA:529,1
DA:530,1
DA:531,2
DA:532,2
DA:533,2
DA:534,2
DA:535,1
DA:539,0
DA:540,0
DA:541,0
DA:544,0
DA:545,0
DA:546,0
DA:547,0
DA:548,0
DA:549,0
DA:550,0
DA:552,0
DA:553,0
DA:554,0
DA:556,0
DA:555,0
DA:557,0
DA:558,0
DA:560,0
DA:561,0
DA:562,0
DA:564,1
DA:565,3
DA:566,3
DA:568,0
DA:569,0
DA:561,1
DA:562,2
DA:563,2
DA:564,3
DA:565,0
DA:570,0
DA:571,0
DA:572,0
DA:573,0
DA:574,0
DA:575,0
DA:576,0
DA:577,0
DA:578,0
DA:579,0
DA:580,0
DA:581,0
DA:582,0
DA:583,0
DA:584,0
DA:586,1
DA:587,1
DA:588,2
DA:589,1
DA:590,2
DA:587,3
DA:588,3
DA:590,0
DA:591,0
DA:593,1
DA:596,1
DA:597,1
DA:598,1
DA:599,1
DA:600,1
DA:601,0
DA:603,2
DA:607,2
DA:608,2
DA:592,0
DA:594,0
DA:595,0
DA:596,0
DA:598,0
DA:599,0
DA:600,0
DA:602,0
DA:603,0
DA:604,0
DA:608,1
DA:609,1
DA:610,2
DA:611,2
DA:613,1
DA:616,0
DA:620,0
DA:621,0
DA:611,1
DA:612,2
DA:613,0
DA:615,1
DA:618,1
DA:619,1
DA:620,1
DA:621,1
DA:622,1
DA:623,0
DA:624,0
DA:626,0
DA:627,0
DA:628,0
DA:630,0
DA:631,0
DA:632,0
DA:633,0
DA:634,0
DA:635,0
DA:636,0
DA:625,3
DA:629,4
DA:630,4
DA:632,4
DA:633,2
DA:635,2
DA:638,0
DA:640,0
DA:644,0
DA:642,0
DA:643,0
DA:645,0
DA:646,0
DA:647,0
DA:648,0
DA:649,0
DA:650,0
DA:651,0
DA:656,1
DA:657,1
DA:658,3
DA:659,3
DA:660,3
DA:652,0
DA:653,0
DA:654,0
DA:655,0
DA:656,0
DA:657,0
DA:658,0
DA:660,0
DA:662,0
DA:666,0
DA:667,0
DA:668,0
DA:669,0
DA:670,0
DA:672,0
DA:673,0
DA:678,1
DA:679,1
DA:680,2
DA:683,2
DA:684,1
DA:685,2
DA:686,1
DA:687,1
DA:689,2
DA:693,1
DA:694,1
DA:714,1
DA:715,2
DA:718,2
DA:719,1
DA:720,2
DA:721,2
DA:724,2
DA:726,1
DA:728,2
DA:732,1
DA:733,1
DA:746,1
DA:747,1
DA:748,3
DA:752,2
DA:754,2
DA:756,2
DA:759,1
DA:760,2
DA:761,3
DA:774,1
DA:775,2
DA:776,1
DA:778,0
DA:779,0
DA:680,3
DA:681,3
DA:682,3
DA:701,1
DA:702,2
DA:705,2
DA:706,1
DA:707,2
DA:708,1
DA:709,1
DA:711,2
DA:715,1
DA:716,1
DA:736,1
DA:737,2
DA:740,2
DA:741,1
DA:742,2
DA:743,2
DA:746,2
DA:748,1
DA:750,2
DA:754,1
DA:755,1
DA:768,1
DA:769,1
DA:770,3
DA:774,2
DA:776,2
DA:778,2
DA:781,1
DA:782,2
DA:783,1
DA:784,1
DA:786,1
DA:787,1
DA:788,1
DA:789,1
DA:792,1
DA:793,1
DA:794,2
DA:795,2
DA:796,4
DA:783,3
DA:796,1
DA:797,2
DA:799,1
DA:803,0
DA:804,0
DA:805,0
DA:806,0
DA:808,0
DA:809,0
DA:810,0
DA:811,0
DA:812,0
DA:813,0
DA:815,0
DA:816,0
DA:817,0
DA:818,0
DA:819,0
DA:820,0
DA:821,0
DA:823,0
DA:824,0
DA:798,1
DA:800,0
DA:801,0
DA:804,2
DA:805,1
DA:806,1
DA:808,2
DA:809,2
DA:810,1
DA:811,2
DA:814,2
DA:815,2
DA:816,1
DA:817,1
DA:818,3
DA:819,2
DA:821,2
DA:825,0
DA:826,0
DA:827,0
DA:828,0
DA:830,0
DA:831,0
DA:832,0
DA:836,1
DA:837,2
DA:838,2
DA:839,2
DA:840,3
DA:841,1
DA:833,0
DA:834,0
DA:835,0
DA:837,0
DA:838,0
DA:839,0
DA:840,0
DA:841,0
DA:842,0
DA:843,0
DA:844,0
DA:845,0
DA:846,0
DA:849,0
DA:853,0
DA:857,1
DA:854,0
DA:858,1
DA:859,1
DA:859,2
DA:860,2
DA:861,2
DA:862,3
DA:863,1
DA:864,9
DA:865,2
DA:866,1
DA:867,1
DA:868,1
DA:869,1
DA:874,2
DA:875,2
DA:877,0
DA:878,0
DA:881,1
DA:882,2
DA:883,3
DA:884,4
DA:885,3
DA:888,3
DA:865,0
DA:866,0
DA:867,0
DA:875,0
DA:879,1
DA:880,2
DA:881,2
DA:882,4
DA:883,4
DA:884,5
DA:885,1
DA:886,13
DA:887,4
DA:888,2
DA:889,2
DA:891,0
DA:892,0
DA:895,1
DA:896,2
DA:897,3
DA:898,0
DA:890,2
DA:891,2
DA:896,4
DA:897,2
DA:899,0
DA:902,3
DA:903,1
DA:904,5
DA:905,2
DA:906,4
DA:907,5
DA:908,1
DA:910,3
DA:911,3
DA:912,2
DA:915,0
DA:916,0
DA:917,0
DA:900,0
DA:903,2
DA:904,2
DA:905,4
DA:906,6
DA:907,4
DA:910,4
DA:911,2
DA:913,0
DA:914,0
DA:917,2
DA:918,2
DA:919,4
DA:920,0
DA:921,0
DA:922,0
DA:928,1
DA:929,2
DA:930,1
DA:966,2
DA:967,2
DA:968,2
DA:971,0
DA:972,0
DA:973,0
DA:980,2
DA:982,1
DA:989,1
DA:990,4
DA:991,3
DA:996,1
DA:997,2
DA:998,2
DA:999,1
DA:1000,2
DA:1002,0
DA:1026,1
DA:1027,2
DA:1028,2
DA:1029,1
DA:1030,0
DA:1032,0
DA:1061,1
DA:1062,2
DA:1063,1
DA:1064,0
DA:1066,3
DA:1067,1
DA:1071,1
DA:1072,2
DA:1073,0
DA:1075,2
DA:1079,1
DA:1080,2
DA:1081,2
DA:1082,2
DA:1083,2
DA:1084,5
DA:1087,1
DA:1089,2
DA:1091,4
DA:1094,0
DA:1121,1
DA:1122,1
DA:1123,1
DA:1124,6
DA:1136,1
DA:1138,0
DA:1153,1
DA:1154,1
DA:1157,1
DA:1158,3
DA:1170,1
DA:1171,1
DA:1174,0
DA:1175,0
DA:1176,0
DA:1178,0
DA:1182,0
DA:1183,0
DA:1184,0
DA:1186,0
DA:1200,1
DA:1201,1
DA:1202,6
DA:1203,3
DA:1204,9
DA:1205,7
DA:1207,1
DA:1208,3
DA:1209,1
DA:1212,4
DA:1214,1
DA:1215,4
DA:924,4
DA:925,2
DA:926,6
DA:927,2
DA:928,6
DA:929,6
DA:930,2
DA:932,3
DA:933,3
DA:934,2
DA:937,0
DA:938,0
DA:939,0
DA:943,0
DA:944,0
DA:950,1
DA:951,2
DA:952,1
DA:988,2
DA:989,2
DA:990,2
DA:993,0
DA:994,0
DA:995,0
DA:1002,2
DA:1004,2
DA:1011,1
DA:1012,4
DA:1013,3
DA:1018,1
DA:1019,2
DA:1020,2
DA:1021,1
DA:1022,2
DA:1024,0
DA:1048,1
DA:1049,2
DA:1050,2
DA:1051,1
DA:1052,0
DA:1054,0
DA:1083,1
DA:1084,2
DA:1085,1
DA:1086,0
DA:1088,3
DA:1089,1
DA:1093,1
DA:1094,2
DA:1095,0
DA:1097,2
DA:1101,1
DA:1102,2
DA:1103,2
DA:1104,2
DA:1105,2
DA:1106,5
DA:1109,1
DA:1111,2
DA:1113,4
DA:1116,0
DA:1143,1
DA:1144,1
DA:1145,1
DA:1146,6
DA:1158,1
DA:1160,0
DA:1175,1
DA:1176,1
DA:1179,1
DA:1180,3
DA:1192,1
DA:1193,1
DA:1196,0
DA:1197,0
DA:1198,0
DA:1200,0
DA:1204,0
DA:1205,0
DA:1206,0
DA:1208,0
DA:1222,1
DA:1223,1
DA:1224,6
DA:1225,3
DA:1226,9
DA:1227,7
DA:1229,1
DA:1230,3
DA:1231,1
DA:1234,4
DA:1236,1
DA:1237,4
LF:383
LH:224
end_of_record
+30 −8
Original line number Diff line number Diff line
@@ -171,6 +171,18 @@ pub enum TemplateType {
    Mustache,
    Unknown,
}
#[derive(Clone, Debug, Deserialize, Display, Serialize)]
pub enum VirtualEnvironmentManager {
    /// [Conda package manager](https://github.com/conda/conda)
    Conda,
    /// Simple Python version management (https://github.com/pyenv/pyenv)
    Pyenv,
    /// Tool to create isolated Python environments (https://virtualenv.pypa.io/en/latest/)
    Virtualenv,
    /// [Pixi package manager](https://github.com/prefix-dev/pixi/) (that has functional parity with Conda)
    Pixi,
    Unknown,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct Check {
    /// Glob string(s) describing files and folders to be checked
@@ -186,18 +198,15 @@ pub struct Check {
#[display("{}", name)]
#[builder(start_fn(name = init))]
pub struct Command {
    /// Prefix string to modify command string
    ///
    /// This is commonly usef when running a command within a virtual environment like Conda
    ///
    /// Example:
    /// ```text
    /// "conda run --name base "
    /// ```
    /// Command name (ex. "echo")
    #[builder(default)]
    pub name: String,
    /// Virtual environment struct that contains details about the associated virtual environment
    #[builder]
    pub virtual_environment: Option<String>,
    /// Container struct that contains details about the associated containerized environment
    #[builder]
    pub container: Option<Container>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct Config {
@@ -236,6 +245,10 @@ pub struct Config {
    #[serde(alias = "artifacts")]
    pub output: Option<String>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct Container {
    pub image: String,
}
#[derive(Clone, Debug, Deserialize, Eq, Serialize, PartialOrd, Ord)]
pub struct Details {
    // Results of applying check to given path
@@ -349,6 +362,15 @@ pub struct StringTemplate {
    pub value: String,
    pub template_type: TemplateType,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
#[builder]
pub struct VirtualEnvironment {
    pub name: String,
    #[builder]
    pub path: Option<String>,
    #[builder]
    pub manager: VirtualEnvironmentManager,
}
impl Command {
    /// Check if a command exists in current command line context
    ///
+1 −4
Original line number Diff line number Diff line
@@ -18,10 +18,7 @@ fn test_command() {
    assert_eq!(python.virtual_environment, Some("base".to_string()));
    let command = Command::init().name("ls".to_string()).build();
    assert!(command.test());
    let nonexistent: Command = Command {
        name: "does-not-exist".to_string(),
        virtual_environment: None,
    };
    let nonexistent: Command = Command::init().name("does-not-exist".to_string()).build();
    assert!(!nonexistent.test());
    if cfg!(target_os = "windows") {
        // WIP