regscale-cli 6.20.4.1__py3-none-any.whl → 6.20.6.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of regscale-cli might be problematic. Click here for more details.
- regscale/__init__.py +1 -1
- regscale/_version.py +39 -0
- regscale/core/app/internal/__init__.py +13 -0
- regscale/core/app/internal/model_editor.py +3 -3
- regscale/core/app/internal/set_permissions.py +173 -0
- regscale/core/app/utils/file_utils.py +11 -1
- regscale/core/app/utils/regscale_utils.py +34 -129
- regscale/core/utils/date.py +86 -30
- regscale/integrations/commercial/defender.py +3 -0
- regscale/integrations/commercial/qualys/__init__.py +40 -14
- regscale/integrations/commercial/qualys/containers.py +324 -0
- regscale/integrations/commercial/qualys/scanner.py +203 -8
- regscale/integrations/commercial/synqly/edr.py +10 -0
- regscale/integrations/commercial/wizv2/click.py +11 -7
- regscale/integrations/commercial/wizv2/constants.py +28 -0
- regscale/integrations/commercial/wizv2/issue.py +3 -2
- regscale/integrations/commercial/wizv2/parsers.py +23 -0
- regscale/integrations/commercial/wizv2/scanner.py +89 -30
- regscale/integrations/commercial/wizv2/utils.py +208 -75
- regscale/integrations/commercial/wizv2/variables.py +2 -1
- regscale/integrations/commercial/wizv2/wiz_auth.py +3 -3
- regscale/integrations/public/fedramp/fedramp_cis_crm.py +98 -20
- regscale/integrations/public/fedramp/fedramp_docx.py +2 -3
- regscale/integrations/scanner_integration.py +7 -2
- regscale/models/integration_models/cisa_kev_data.json +187 -5
- regscale/models/integration_models/synqly_models/capabilities.json +1 -1
- regscale/models/regscale_models/__init__.py +2 -0
- regscale/models/regscale_models/asset.py +1 -1
- regscale/models/regscale_models/catalog.py +16 -0
- regscale/models/regscale_models/file.py +2 -1
- regscale/models/regscale_models/form_field_value.py +59 -1
- regscale/models/regscale_models/issue.py +47 -0
- regscale/models/regscale_models/modules.py +88 -1
- regscale/models/regscale_models/organization.py +30 -0
- regscale/models/regscale_models/regscale_model.py +20 -6
- regscale/models/regscale_models/security_control.py +47 -0
- regscale/models/regscale_models/security_plan.py +32 -0
- regscale/models/regscale_models/vulnerability.py +3 -3
- regscale/models/regscale_models/vulnerability_mapping.py +2 -2
- regscale/regscale.py +2 -0
- {regscale_cli-6.20.4.1.dist-info → regscale_cli-6.20.6.0.dist-info}/METADATA +1 -1
- {regscale_cli-6.20.4.1.dist-info → regscale_cli-6.20.6.0.dist-info}/RECORD +49 -44
- tests/fixtures/test_fixture.py +33 -4
- tests/regscale/core/test_app.py +53 -32
- tests/regscale/test_init.py +94 -0
- {regscale_cli-6.20.4.1.dist-info → regscale_cli-6.20.6.0.dist-info}/LICENSE +0 -0
- {regscale_cli-6.20.4.1.dist-info → regscale_cli-6.20.6.0.dist-info}/WHEEL +0 -0
- {regscale_cli-6.20.4.1.dist-info → regscale_cli-6.20.6.0.dist-info}/entry_points.txt +0 -0
- {regscale_cli-6.20.4.1.dist-info → regscale_cli-6.20.6.0.dist-info}/top_level.txt +0 -0
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
regscale/__init__.py,sha256=
|
|
2
|
-
regscale/
|
|
1
|
+
regscale/__init__.py,sha256=ZygAIkX6Nbjag1czWdQa-yP-GM1mBE_9ss21Xh__JFc,34
|
|
2
|
+
regscale/_version.py,sha256=x6wIid4ymuFQH9uE0D5dtIycsH6xYzb1mpib16IO1ps,1198
|
|
3
|
+
regscale/regscale.py,sha256=xcxnTwEwWgfO3Fnp0LVo32SZCJzAswq3WDZgm21nHnI,30914
|
|
3
4
|
regscale/airflow/__init__.py,sha256=yMwN0Bz4JbM0nl5qY_hPegxo_O2ilhTOL9PY5Njhn-s,270
|
|
4
5
|
regscale/airflow/click_dags.py,sha256=H3SUR5jkvInNMv1gu-VG-Ja_H-kH145CpQYNalWNAbE,4520
|
|
5
6
|
regscale/airflow/click_mixins.py,sha256=BTwKWsEu6KVtlrzFbXpD_RuEpMzc-CSnCCySUzqzCgQ,3571
|
|
@@ -37,7 +38,7 @@ regscale/core/app/__init__.py,sha256=nGcCN1vWBAnZzoccIlt0jwWQdegCOrBWOB7LPhQkQSs
|
|
|
37
38
|
regscale/core/app/api.py,sha256=_hwh1HWIIrPfL4jHDKlEmW5pQEr2Iq3idn4bYGtfPQo,23148
|
|
38
39
|
regscale/core/app/application.py,sha256=TalC51f30Ox6o7LBsh2RcCdU_YqFuCbGw1zhK2vSS7s,25982
|
|
39
40
|
regscale/core/app/logz.py,sha256=8AdBKmquv45JGi5fCMc38JqQg6-FpUONGmqfd5EGwrI,2583
|
|
40
|
-
regscale/core/app/internal/__init__.py,sha256=
|
|
41
|
+
regscale/core/app/internal/__init__.py,sha256=rod4nmE7rrYDdbuYF4mCWz49TK_2r-v4tWy1UHW63r0,4808
|
|
41
42
|
regscale/core/app/internal/admin_actions.py,sha256=hOdma7QGwFblmxEj9UTjiWWmZGUS5_ZFtxL2qZdhf-Q,7443
|
|
42
43
|
regscale/core/app/internal/assessments_editor.py,sha256=UozEaQR1v3eXbkFgOY11CkjMLEAF27ej5vlMQ4O9XVA,31477
|
|
43
44
|
regscale/core/app/internal/catalog.py,sha256=svBAgFZaGrkNHh2gZEo1ex2vdjllAIc4940soGykHOc,11088
|
|
@@ -49,17 +50,18 @@ regscale/core/app/internal/file_uploads.py,sha256=EfQ4ViJBHzU9bxnFunK3ahA6T9A6pn
|
|
|
49
50
|
regscale/core/app/internal/healthcheck.py,sha256=ef4Mwk19vi71bv-Xkny5_EGG1UXTbCO5dvEIzHyyfVA,2010
|
|
50
51
|
regscale/core/app/internal/login.py,sha256=GsFaBwmSc32liWoRnMFy78m8SuB9pfUV0c1lyCEXFEo,10996
|
|
51
52
|
regscale/core/app/internal/migrations.py,sha256=wHIzb1uglLVOXawnb-K3Yt70Z5QyfQYb8ZZOMDrNRU4,7983
|
|
52
|
-
regscale/core/app/internal/model_editor.py,sha256=
|
|
53
|
+
regscale/core/app/internal/model_editor.py,sha256=0sxfg92TJYyECU9KwgHooXeY3ZdaF2i5gGWe1gButFY,61696
|
|
53
54
|
regscale/core/app/internal/poam_editor.py,sha256=3PtpSMpV7bqKFuTHD2ACYcTyB3EEtTRKuYv-XArjd0A,22929
|
|
55
|
+
regscale/core/app/internal/set_permissions.py,sha256=MbUxe-zaAz5hK3BZ4IeY7Xbr8-FZOuJwkCbs_yVBC-k,5666
|
|
54
56
|
regscale/core/app/internal/workflow.py,sha256=SpgYk1QyzdilVLOK1fFzaKhdLspumaugf5VezgboxhQ,4007
|
|
55
57
|
regscale/core/app/utils/XMLIR.py,sha256=M_RrCsbjznihatkucCKw6dPgHTPQczXyqIdUXWhuCLI,8328
|
|
56
58
|
regscale/core/app/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
57
59
|
regscale/core/app/utils/api_handler.py,sha256=T1meKw6Yi3ZAgRbQ1xuKDVh9Q9B8mbMqqN_LrSwIlAM,11765
|
|
58
60
|
regscale/core/app/utils/app_utils.py,sha256=zLEHHHWR4likFQYY_bZsWLTAoRajyyaWrESkotVrFlM,36240
|
|
59
|
-
regscale/core/app/utils/file_utils.py,sha256=
|
|
61
|
+
regscale/core/app/utils/file_utils.py,sha256=x7cqYPxJ-PgSb2lX_K6zhdqyGQjOCmr04lnqdBQV3hI,9269
|
|
60
62
|
regscale/core/app/utils/parser_utils.py,sha256=aBEgcFwbJMD-ARf3wzf-tyWwR6NHvzEcdYcPMm8hGqo,2533
|
|
61
63
|
regscale/core/app/utils/pickle_file_handler.py,sha256=iMdv4N8z00TB5LyPdxIcLKNRpDQVWQ8ZQWAqCKpqmF0,1695
|
|
62
|
-
regscale/core/app/utils/regscale_utils.py,sha256=
|
|
64
|
+
regscale/core/app/utils/regscale_utils.py,sha256=KuXTAfEO10DQTnhQadIBIQ02iuLD0D0xKUzf5Yv8yP4,7400
|
|
63
65
|
regscale/core/app/utils/report_utils.py,sha256=rKn3nmiSPq8LTKM16UiKBSizTsZKh-7JwdOlfX6YSpQ,4210
|
|
64
66
|
regscale/core/app/utils/variables.py,sha256=h29Qrr6jg-Feo74IeqHz28wYLhgtzZ2pCDMf6g0WJFU,8989
|
|
65
67
|
regscale/core/app/utils/catalog_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -92,7 +94,7 @@ regscale/core/static/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hS
|
|
|
92
94
|
regscale/core/static/regex.py,sha256=KLg-do2oPuUD6bQG9usqqSy5sxqlSEAEuUUbGVkZ6eU,384
|
|
93
95
|
regscale/core/utils/__init__.py,sha256=Eyvc210t-KRqvTcV5DNWRjKO99CdWy_dC57wfggFWcw,3876
|
|
94
96
|
regscale/core/utils/click_utils.py,sha256=y6vAbaPoT0Abb8siS1tvJxJQTm4sbWQTeq5nTDIgBtI,375
|
|
95
|
-
regscale/core/utils/date.py,sha256=
|
|
97
|
+
regscale/core/utils/date.py,sha256=_45gTGY0NrnnC49ajuYLGU8QLcTUKYm09C_z93O1oKs,10005
|
|
96
98
|
regscale/core/utils/graphql.py,sha256=oXGBcAuDa0uasMnD4CokIzzKKa-IgExdKXLwtaK2_tA,8386
|
|
97
99
|
regscale/core/utils/urls.py,sha256=ZcU9OJqDmVQXgu6BrLESIp2KMkkUuzTZZ_wHsZMzfA4,687
|
|
98
100
|
regscale/dev/__init__.py,sha256=wVP59B1iurp36ul8pD_CjmunJLHOdKWWodz1r5loNvw,190
|
|
@@ -111,14 +113,14 @@ regscale/integrations/api_paginator.py,sha256=73rjaNM9mGv8evHAeoObXEjZPg-bJuGPo6
|
|
|
111
113
|
regscale/integrations/api_paginator_example.py,sha256=lEuYI-xEGcjnXuIzbCobCP0YRuukLF0s8S3d382SAH4,12119
|
|
112
114
|
regscale/integrations/integration_override.py,sha256=PH7t_bf-RCe_it3FJ61tlKX5UghqHuSEQNJWDfCamAg,5480
|
|
113
115
|
regscale/integrations/jsonl_scanner_integration.py,sha256=l8nq_T3rE1XX-6HxrNHm3xzxCNWbIjxQvGMdtZWs7KQ,57003
|
|
114
|
-
regscale/integrations/scanner_integration.py,sha256=
|
|
116
|
+
regscale/integrations/scanner_integration.py,sha256=lijwTk_VD_mhNN04lMgf_Wh3IKhv_INWESFgtjt_f8Q,135805
|
|
115
117
|
regscale/integrations/variables.py,sha256=AyaG286U-ek2uQ4qeYBAG3eh_QnlBlth1PKZI5Je5sc,2212
|
|
116
118
|
regscale/integrations/commercial/__init__.py,sha256=sVbzBnLbKRhnAmRsIw8kRvfbyJojPfVqzH3OlgoxvqM,13927
|
|
117
119
|
regscale/integrations/commercial/ad.py,sha256=YXSmK8vRf6yi2GnREGa5GrE6GelhFrLj44SY8AO1pK0,15509
|
|
118
120
|
regscale/integrations/commercial/burp.py,sha256=3BLNKLfwL1x7jfhd8MJD6hdHEpj58pOEtrtCkn2hcWA,3344
|
|
119
121
|
regscale/integrations/commercial/cpe.py,sha256=eXZeDXicnp1yYgKuyKcthQUYxXi2Pgc__UD8lUqr5H0,4924
|
|
120
122
|
regscale/integrations/commercial/crowdstrike.py,sha256=6x7_GlYDRCZvPZwqgrDT5KMnXCa6H4RKO-FNkiYxHgU,40194
|
|
121
|
-
regscale/integrations/commercial/defender.py,sha256=
|
|
123
|
+
regscale/integrations/commercial/defender.py,sha256=HAZj1lh4k2mYawsmouU7B2OpmfrGcf49qsEDkZrCPpw,66039
|
|
122
124
|
regscale/integrations/commercial/dependabot.py,sha256=V4VbHbwrxHfe7eCilJ7U_MBeIO6X3wetGfIo2DJYe_c,7793
|
|
123
125
|
regscale/integrations/commercial/ecr.py,sha256=47iCigssDANlfHYGznU4rfOq6O-1QMGOuP8lBmn7Df0,2693
|
|
124
126
|
regscale/integrations/commercial/gitlab.py,sha256=dzfqJQ68QI1ee_BriNMyPuXLkzOhc2vR1hhVfq2j13Y,12496
|
|
@@ -181,9 +183,10 @@ regscale/integrations/commercial/nessus/scanner.py,sha256=xz-OBd98ZbKKWnuxsP7oTq
|
|
|
181
183
|
regscale/integrations/commercial/opentext/__init__.py,sha256=zqCPb_4rYRZZPXfeKn4AoZyyYyQ6MU4C0lCs2ysOBhc,251
|
|
182
184
|
regscale/integrations/commercial/opentext/commands.py,sha256=TTClFg16EzlXQOjdQQ6AdWuVuh7H2zO0V9rXd73-ni0,2572
|
|
183
185
|
regscale/integrations/commercial/opentext/scanner.py,sha256=QAb9FPiYeQCEnqL3dnFBFe64LydwLaR8HWpYmabgcbE,22581
|
|
184
|
-
regscale/integrations/commercial/qualys/__init__.py,sha256=
|
|
186
|
+
regscale/integrations/commercial/qualys/__init__.py,sha256=A0tBi-OL6W1Bu_ReenCJcVy3wisLABktUknOfSLaPxw,88162
|
|
187
|
+
regscale/integrations/commercial/qualys/containers.py,sha256=9jiBBgjoDRuOB2y5_rmOIgJ0nysrwZVgMTrBZW4fRzk,11958
|
|
185
188
|
regscale/integrations/commercial/qualys/qualys_error_handler.py,sha256=2nlxeNLQMOpkiTij39VTsZg-2AFQsM6-rwlBW2pVpKY,18594
|
|
186
|
-
regscale/integrations/commercial/qualys/scanner.py,sha256=
|
|
189
|
+
regscale/integrations/commercial/qualys/scanner.py,sha256=cvz7j2X160l5RP74Vtq6-FagIDhT6zQfQPoQOTOR07c,56284
|
|
187
190
|
regscale/integrations/commercial/qualys/variables.py,sha256=TPoIW5_yNmU6c0AlLOpHQdxp6OrH8jUmMJikqT7YYz8,962
|
|
188
191
|
regscale/integrations/commercial/sap/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
189
192
|
regscale/integrations/commercial/sap/click.py,sha256=pWgjUOA_4WKkDUWcE8z4EshnJUdrTl15NKUfKpKyqzE,522
|
|
@@ -207,7 +210,7 @@ regscale/integrations/commercial/stigv2/click_commands.py,sha256=-765vFF03aSjBxU
|
|
|
207
210
|
regscale/integrations/commercial/stigv2/stig_integration.py,sha256=-UlfL0BBI3jFGotctOJyTCRAU9zIXW6mwU7ySrRXE9U,11573
|
|
208
211
|
regscale/integrations/commercial/synqly/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
209
212
|
regscale/integrations/commercial/synqly/assets.py,sha256=wAyoMaR5MizBifnKUnNrx6ZlnmneP07LEBjJuf1POZs,3329
|
|
210
|
-
regscale/integrations/commercial/synqly/edr.py,sha256=
|
|
213
|
+
regscale/integrations/commercial/synqly/edr.py,sha256=IvObVzz5Y2a8iNjCP9dTfKUEv2ZAboCzcFqxI00Y6Do,2978
|
|
211
214
|
regscale/integrations/commercial/synqly/ticketing.py,sha256=ubTVKqB_f-G6mE4EUxbsU5BkO-GlMTvRkJVRq_tl_jg,6399
|
|
212
215
|
regscale/integrations/commercial/synqly/vulnerabilities.py,sha256=bLYECK4G3K-j_gXrfEwlse6Rc1ao4TTFezBYxW11CXM,7689
|
|
213
216
|
regscale/integrations/commercial/tenablev2/__init__.py,sha256=UpSY_oww83kz9c7amdbptJKwDB1gAOBQDS-Q9WFp588,295
|
|
@@ -225,16 +228,16 @@ regscale/integrations/commercial/trivy/commands.py,sha256=YGQFtpQGkmcLT3X2OVp7lt
|
|
|
225
228
|
regscale/integrations/commercial/trivy/scanner.py,sha256=iiwTvjqRlLRgQvCs_FP0j83B7ApOta0MSXyO0-iHfSk,11309
|
|
226
229
|
regscale/integrations/commercial/wizv2/WizDataMixin.py,sha256=s7F_rVrP9IZa_x_vh3MswR7W_UBHRfd4kHGVsNX4ips,3606
|
|
227
230
|
regscale/integrations/commercial/wizv2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
228
|
-
regscale/integrations/commercial/wizv2/click.py,sha256=
|
|
229
|
-
regscale/integrations/commercial/wizv2/constants.py,sha256=
|
|
230
|
-
regscale/integrations/commercial/wizv2/issue.py,sha256=
|
|
231
|
+
regscale/integrations/commercial/wizv2/click.py,sha256=DPis8cMST7zVXMzajYUGqI5WNg6nh08afiQhExm54_c,12276
|
|
232
|
+
regscale/integrations/commercial/wizv2/constants.py,sha256=YamxNum-GHZgkTiCsKD_rii7B9chlFOeVR56FBKvZ80,23418
|
|
233
|
+
regscale/integrations/commercial/wizv2/issue.py,sha256=qj5_g-SoOz6f5QDgs34GdQEyxFwJLKAWl1EVx7vjrAw,13407
|
|
231
234
|
regscale/integrations/commercial/wizv2/models.py,sha256=hZ6557LJfcp1_NRbMM0V_G1erz1jEFmsuKPn86kXE54,5667
|
|
232
|
-
regscale/integrations/commercial/wizv2/parsers.py,sha256=
|
|
235
|
+
regscale/integrations/commercial/wizv2/parsers.py,sha256=BD0i-80NhfQAHYPk0EAbUClXfzxLT3aHzb2Gs2ObVAk,11811
|
|
233
236
|
regscale/integrations/commercial/wizv2/sbom.py,sha256=QcGaYiBGtZ3mBcbo-KGl-I2u6QHKAIinTk26LPy0Kng,4466
|
|
234
|
-
regscale/integrations/commercial/wizv2/scanner.py,sha256=
|
|
235
|
-
regscale/integrations/commercial/wizv2/utils.py,sha256=
|
|
236
|
-
regscale/integrations/commercial/wizv2/variables.py,sha256=
|
|
237
|
-
regscale/integrations/commercial/wizv2/wiz_auth.py,sha256=
|
|
237
|
+
regscale/integrations/commercial/wizv2/scanner.py,sha256=N-YVSbQJvTrg-tmxnxY_w7gJ7qS4VyBTuOiMMy3TXCo,23876
|
|
238
|
+
regscale/integrations/commercial/wizv2/utils.py,sha256=ELJZ9sgi2h9lEHFF7mlOQQ5f8MugM-sH72BZSRjF_nk,37550
|
|
239
|
+
regscale/integrations/commercial/wizv2/variables.py,sha256=TxyhBGgKUC1bpg-2gCNiU2txqDGiQosbguAFLecP69E,2591
|
|
240
|
+
regscale/integrations/commercial/wizv2/wiz_auth.py,sha256=qGcUhpC9eRkJIngmv3i9yHdp0q9rv6AvA5gHkypYzCE,5549
|
|
238
241
|
regscale/integrations/integration/__init__.py,sha256=WJgPLnEahD94QLE8NR8QCzlf8xk2ix76_WPDlf98ezU,70
|
|
239
242
|
regscale/integrations/integration/integration.py,sha256=pr_fbqBieYbqp3PdBjuqKuZCYFf0kF4GkFdlViTKG54,586
|
|
240
243
|
regscale/integrations/integration/inventory.py,sha256=gHL1a6VSV3zf4DTmksEy8qXNrqhIun8TwLxhRpuEMqY,341
|
|
@@ -252,9 +255,9 @@ regscale/integrations/public/fedramp/appendix_parser.py,sha256=u3Q_NHxAvYTQ1RAr1
|
|
|
252
255
|
regscale/integrations/public/fedramp/click.py,sha256=8JbWRidFZ9EFoOTp-bwE584u23TzKqWQIpfxmA0-lGo,14975
|
|
253
256
|
regscale/integrations/public/fedramp/components.py,sha256=z6PMObm-kjRR42bT04EfnjisrEULfXlwxb7576uuMmY,27010
|
|
254
257
|
regscale/integrations/public/fedramp/docx_parser.py,sha256=EA9g1iTlB6-GtOzV9JwGW8x_SruhbaIMOzstCBvjiq8,10526
|
|
255
|
-
regscale/integrations/public/fedramp/fedramp_cis_crm.py,sha256=
|
|
258
|
+
regscale/integrations/public/fedramp/fedramp_cis_crm.py,sha256=IVASI6W0uEOg_SyxJSqyHev1KzSwEnF1RTWYT3qfViw,64576
|
|
256
259
|
regscale/integrations/public/fedramp/fedramp_common.py,sha256=Mdy3_WdCEcTwSXEEKXiODmr2YJTWcTg6jfyWZJWfruQ,115406
|
|
257
|
-
regscale/integrations/public/fedramp/fedramp_docx.py,sha256=
|
|
260
|
+
regscale/integrations/public/fedramp/fedramp_docx.py,sha256=eKkRwfcIi4aHJp4ajKDUGJECItwrZwYfCiKzmfB2W1Q,13703
|
|
258
261
|
regscale/integrations/public/fedramp/fedramp_five.py,sha256=F4KIOdnYaRjJrJHJYsN9Bmf6i5s0nus-t_GaAh8A3ow,92645
|
|
259
262
|
regscale/integrations/public/fedramp/fedramp_traversal.py,sha256=BkgwsFluZO5g0Rc0WujYgbc1_YLofamJzFP7Z5UYfao,4528
|
|
260
263
|
regscale/integrations/public/fedramp/import_fedramp_r4_ssp.py,sha256=Opld0vEZ4b71cIDogu6ykTUL86tXZVTSnwQzjz8w_4U,9925
|
|
@@ -308,7 +311,7 @@ regscale/models/integration_models/azure_alerts.py,sha256=2etrpvcxa7jVQrc98bJlVG
|
|
|
308
311
|
regscale/models/integration_models/base64.py,sha256=sxV6O5qY1_TstJENX5jBPsSdQwmA83-NNhgJFunXiZE,570
|
|
309
312
|
regscale/models/integration_models/burp.py,sha256=FBEBkH3U0Q8vq71FFoWnvgLRF5Hkr9GYmQFmNNHFrVk,16932
|
|
310
313
|
regscale/models/integration_models/burp_models.py,sha256=UytDTAcCaxyu-knFkm_mEUH6UmWK3OTXKSC9Sc6OjVs,3669
|
|
311
|
-
regscale/models/integration_models/cisa_kev_data.json,sha256=
|
|
314
|
+
regscale/models/integration_models/cisa_kev_data.json,sha256=0-CT_plLwQFlIsFgJ-RZxQIi_uCeyIsrWiB2XNwXctA,1231803
|
|
312
315
|
regscale/models/integration_models/defender_data.py,sha256=jsAcjKxiGmumGerj7xSWkFd6r__YpuKDnYX5o7xHDiE,2844
|
|
313
316
|
regscale/models/integration_models/defenderimport.py,sha256=OFwEH0Xu-HFLIZJZ8hP60Ov3lS8RR7KHEsw4wI8QnoE,5766
|
|
314
317
|
regscale/models/integration_models/drf.py,sha256=Aq7AdLa_CH97NrnR-CxaFI22JjVN9uCxVN7Z-BBUaNU,18896
|
|
@@ -338,7 +341,7 @@ regscale/models/integration_models/flat_file_importer/__init__.py,sha256=V_P3R0j
|
|
|
338
341
|
regscale/models/integration_models/sbom/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
339
342
|
regscale/models/integration_models/sbom/cyclone_dx.py,sha256=0pFR0BWBrF5c8_cC_8mj2MXvNOMHOdHbBYXvTVfFAh8,4058
|
|
340
343
|
regscale/models/integration_models/synqly_models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
341
|
-
regscale/models/integration_models/synqly_models/capabilities.json,sha256=
|
|
344
|
+
regscale/models/integration_models/synqly_models/capabilities.json,sha256=zGoXgG919b6Gh63Mdd6md4Js4z9c088z7UdAcQvyqXM,351522
|
|
342
345
|
regscale/models/integration_models/synqly_models/connector_types.py,sha256=8nxptkTexpskySnmL0obNAff_iu_fx6tJ7i1-4hJvao,461
|
|
343
346
|
regscale/models/integration_models/synqly_models/ocsf_mapper.py,sha256=e2kTOhWSNRnzbgMchMx-7c21pCgSv2DqWnxvajKEKJM,16960
|
|
344
347
|
regscale/models/integration_models/synqly_models/param.py,sha256=Xt5Zm6lC_VkLj7LF2qXo72TJZHysqttsp5ai0NCf1po,2643
|
|
@@ -352,15 +355,15 @@ regscale/models/integration_models/synqly_models/connectors/vulnerabilities.py,s
|
|
|
352
355
|
regscale/models/integration_models/tenable_models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
353
356
|
regscale/models/integration_models/tenable_models/integration.py,sha256=lplL8zmjTFuhLreW-4y7G1fiCOBgzNAaATq800jgTQc,10271
|
|
354
357
|
regscale/models/integration_models/tenable_models/models.py,sha256=dmG7btkN4YkDWwnfW5Ldc3tWEAGjPiaRgJjrqMOkPEU,15846
|
|
355
|
-
regscale/models/regscale_models/__init__.py,sha256=
|
|
358
|
+
regscale/models/regscale_models/__init__.py,sha256=ejw7TPJPwS3BwF01-JzL6-R5DLO1zR7DVW9HHcMNCJ8,2192
|
|
356
359
|
regscale/models/regscale_models/assessment.py,sha256=ekzNlcsfDGBu97PMCi7hBRGbzVgxk7Ij0RfrdGh1Rfw,20440
|
|
357
360
|
regscale/models/regscale_models/assessment_plan.py,sha256=qo2YA5ckSbUKDHnC_2BUc2I9kMTje9Gq-qTCXqvEKCY,1716
|
|
358
361
|
regscale/models/regscale_models/assessment_result.py,sha256=K48yjYKwgY1-d_Y3aQUDcCvaqcTIVYdbKV5Wgicf4Ts,1283
|
|
359
|
-
regscale/models/regscale_models/asset.py,sha256
|
|
362
|
+
regscale/models/regscale_models/asset.py,sha256=MDYIFlPfngjjr6obP0wLlQPFzNw8CIFeYVAKFnpdqR4,19828
|
|
360
363
|
regscale/models/regscale_models/asset_mapping.py,sha256=HFlkAoPZHy2xPYq28cXuzLpFoP36SI08HTL8mH_Q-uE,6851
|
|
361
364
|
regscale/models/regscale_models/business_impact_assessment.py,sha256=tkuvw1ssdrVJJcsHT43nFjFhAFTSSFRNfWRIg5W-d2k,2214
|
|
362
365
|
regscale/models/regscale_models/case.py,sha256=hLVTwZXzusnXR9avqh7xSVLJwPJ1rPI_Nla_VAkpZcg,1192
|
|
363
|
-
regscale/models/regscale_models/catalog.py,sha256=
|
|
366
|
+
regscale/models/regscale_models/catalog.py,sha256=jw4lfWQyE3ult3MlGU7IdGsXLYCQPVnzfjT69kKjLCs,9145
|
|
364
367
|
regscale/models/regscale_models/cci.py,sha256=jjtO3ZXDhzQ05s5i-YeL7_TWPkl9ArGkUJGAw_LnKD8,1264
|
|
365
368
|
regscale/models/regscale_models/change.py,sha256=v-FxWrYijGbxAWk7WEIN3piUw8mM3EWTeKd7itAMfMY,4970
|
|
366
369
|
regscale/models/regscale_models/checklist.py,sha256=GM15N9krNmKNDJnOgtSDRlUTBVwYtttex_plc64OVWY,13290
|
|
@@ -383,9 +386,9 @@ regscale/models/regscale_models/email.py,sha256=kgEzXTUZr7uHksMOCextWbXJXYuRKyXO
|
|
|
383
386
|
regscale/models/regscale_models/evidence.py,sha256=R78f3eWjmBgusZbv8i9cd5O8Is43KjvxiaJH_CLERqE,4316
|
|
384
387
|
regscale/models/regscale_models/evidence_mapping.py,sha256=eovTJsl1cjZMvbhpOv70nILIHSXmURyU4mg_r09h4VQ,1444
|
|
385
388
|
regscale/models/regscale_models/facility.py,sha256=J3gGv0Tf3zNdyKGhb0iM8WjgjWqJHZLKdcN9n-jDrTA,1059
|
|
386
|
-
regscale/models/regscale_models/file.py,sha256=
|
|
389
|
+
regscale/models/regscale_models/file.py,sha256=peAu78t-zLeMsP9tmeubGAyBL77XRkXyJLaruWzjLac,14413
|
|
387
390
|
regscale/models/regscale_models/filetag.py,sha256=jd99xcQsGheLFfy7PYtZEzT-re_Dp_ZoUF3GWYMsi0Q,1138
|
|
388
|
-
regscale/models/regscale_models/form_field_value.py,sha256=
|
|
391
|
+
regscale/models/regscale_models/form_field_value.py,sha256=xKnbXWQl4xVuUQMbeRK23MbPO7SOMARBvvH2O98UOm4,5816
|
|
389
392
|
regscale/models/regscale_models/functional_roles.py,sha256=Vm_j-UZBKoaiONO75VqqCKnDHE6ynP0X5XZmKXl8UT8,932
|
|
390
393
|
regscale/models/regscale_models/group.py,sha256=HFE3FPUIYo7PArHnvZhb8EQToZQ73jFRU1M-oaHuees,6209
|
|
391
394
|
regscale/models/regscale_models/implementation_objective.py,sha256=e0Hamt-9RBeHRDzlWDbIJ3t4qnZKXPrbsesBK3wYoNk,12132
|
|
@@ -394,15 +397,16 @@ regscale/models/regscale_models/implementation_role.py,sha256=ZjJOhjM3dVlulsGx3l
|
|
|
394
397
|
regscale/models/regscale_models/incident.py,sha256=jsS4MfigzjwFphvdIrBk62GfvbceQ8VL-AhfQSQM460,6028
|
|
395
398
|
regscale/models/regscale_models/inherited_control.py,sha256=RuQJgVyZgfoIrUG_vvwQYHECb3wsFjDH-zPj-bIFBNU,2007
|
|
396
399
|
regscale/models/regscale_models/interconnection.py,sha256=B8Y4I6KnN-T_gid08QM_o50OwGZcFfO8SJFY2uB68Ak,1256
|
|
397
|
-
regscale/models/regscale_models/issue.py,sha256=
|
|
400
|
+
regscale/models/regscale_models/issue.py,sha256=9ufa-gboSYBBQ2wCTVV0wk6qcWsdX8K0plWj0c_zpus,49064
|
|
398
401
|
regscale/models/regscale_models/leveraged_authorization.py,sha256=OUrL8JQV3r7T3ldHlL6Y_ZLv6KuQIC-3eZW5wZ7XFUk,4192
|
|
399
402
|
regscale/models/regscale_models/line_of_inquiry.py,sha256=Uu0lQEhif0W6yTSkJo27GyQGmExSngJvyqGBTr4Q8Fg,1713
|
|
400
403
|
regscale/models/regscale_models/link.py,sha256=lAY4Ig3Menm1EqfcAbVJ7jsCsRO5tWtJIf-9-G9FXT8,6593
|
|
401
404
|
regscale/models/regscale_models/master_assessment.py,sha256=t03-8vQJ7hnPNgEU0GSC1XGKOgAqHKuIupbt5IjJvtI,7322
|
|
402
405
|
regscale/models/regscale_models/meta_data.py,sha256=Fg8rrWSTx3K00QkF4glH9UdY9OFWJ4_UqxleLSSbx8I,2482
|
|
403
406
|
regscale/models/regscale_models/module.py,sha256=a7lalHmVTQ04ZILnJxuFWdHYDtyusBMTtonD4ICL-Wc,7272
|
|
404
|
-
regscale/models/regscale_models/modules.py,sha256=
|
|
407
|
+
regscale/models/regscale_models/modules.py,sha256=yeva_tct88o2NFt93_zmqUcXZ3LucVbAv5FvQPru3cQ,8551
|
|
405
408
|
regscale/models/regscale_models/objective.py,sha256=aJIpmkZ-NscqV2y8SGB4HYzm615b6mklyHnW9bL2ljk,249
|
|
409
|
+
regscale/models/regscale_models/organization.py,sha256=E3Y5bwtgaIRL4rbKxU3DyfFVYUzP3d-1umG_CIUG3gE,714
|
|
406
410
|
regscale/models/regscale_models/parameter.py,sha256=WS5onxkvz119brxugoBidK7K_3CeNVzchLTvW8aEdJs,3859
|
|
407
411
|
regscale/models/regscale_models/policy.py,sha256=IQ-niE1PP8L2OavYfOQQsvSInw1sw371mkJrGFyWZ94,2382
|
|
408
412
|
regscale/models/regscale_models/ports_protocol.py,sha256=Pcn-R6bsmxWiaYEtlZuu7Zv0C4vVX8YHMWgGcd1MRCY,2146
|
|
@@ -417,7 +421,7 @@ regscale/models/regscale_models/questionnaire.py,sha256=QMSXfNpSoaS8tkeo80C7OWLj
|
|
|
417
421
|
regscale/models/regscale_models/questionnaire_instance.py,sha256=1LgGTwFACmWx2xOOqUKhAUOms4_3L6NZySzuteg0_sI,8241
|
|
418
422
|
regscale/models/regscale_models/rbac.py,sha256=oHzKqwL4bkH2XT4WaslbNlMnWayrSKP9zYbG72e2ijk,4522
|
|
419
423
|
regscale/models/regscale_models/reference.py,sha256=P_7jT6H-NZIa7TyH3j98N-ZHlB6FsjpZVRZCCpms-D4,3253
|
|
420
|
-
regscale/models/regscale_models/regscale_model.py,sha256
|
|
424
|
+
regscale/models/regscale_models/regscale_model.py,sha256=-TLI7FX63s0qHHERES33c7ho9_qHKb3X7-3dihFBd9E,69210
|
|
421
425
|
regscale/models/regscale_models/requirement.py,sha256=-8PnMbuWAZHol5X1w-fzm-moD784Et0oevSVbz6xLhU,767
|
|
422
426
|
regscale/models/regscale_models/risk.py,sha256=lZFDYPpTt0aEYCrYz5FBKk1Y4y2CKXYU1A8eEKT3zzg,8661
|
|
423
427
|
regscale/models/regscale_models/risk_issue_mapping.py,sha256=j6uR0x6xymJ0BsIwgnadeUQDshHNhU3VnpyItZp4dc4,2393
|
|
@@ -425,8 +429,8 @@ regscale/models/regscale_models/risk_trend.py,sha256=GkooEAc4BAq85vT3SxEOKcETACk
|
|
|
425
429
|
regscale/models/regscale_models/sbom.py,sha256=UYS3lBizGqz7A7vNPYBYzpL8PWIaXLl7ZQox_hlJ2ZQ,1722
|
|
426
430
|
regscale/models/regscale_models/scan_history.py,sha256=o4e9P2rQlqlLj4mbgSPX44jutTJo1nocI1DDXyWyf6w,16741
|
|
427
431
|
regscale/models/regscale_models/search.py,sha256=rPbFDCnnBRHY5JJv9Ev3_6GjMlkdhUAsaUzC97eE2Ys,1015
|
|
428
|
-
regscale/models/regscale_models/security_control.py,sha256=
|
|
429
|
-
regscale/models/regscale_models/security_plan.py,sha256=
|
|
432
|
+
regscale/models/regscale_models/security_control.py,sha256=GJEMkIh6IDX7Gs_z7ppmm0hqiXjC5qSbSYRYt85wOUg,6365
|
|
433
|
+
regscale/models/regscale_models/security_plan.py,sha256=DtxGJHCIuzj_F_iaP9uuHY5sObKo3zk_8BeC2jUJF7U,8600
|
|
430
434
|
regscale/models/regscale_models/software_inventory.py,sha256=FRAIfoUlS0kaX1HQRDyV5q4yxwRHilXbS52NSj6exo0,5555
|
|
431
435
|
regscale/models/regscale_models/stake_holder.py,sha256=JIuDTIky_3acDl-NOMwylTHkppN38JgPDZ1A6wM-BGE,1956
|
|
432
436
|
regscale/models/regscale_models/stig.py,sha256=y-PQuGg3pwDTfsNZGW6anaNAjIZBQoNe7GOLMiT5zfw,26329
|
|
@@ -439,8 +443,8 @@ regscale/models/regscale_models/task.py,sha256=le3N2GIUCEJrFnNh0DLU7RAcle4ULr8OP
|
|
|
439
443
|
regscale/models/regscale_models/threat.py,sha256=4TNZcRnTgmlDwBsYu5Pbh9GRd8ZWAtqqr0Xph3uPNAA,7255
|
|
440
444
|
regscale/models/regscale_models/user.py,sha256=wiU2qKwp3aYtmaHEmTtv8BbMEgFb913dHgc2VnmsAkg,7186
|
|
441
445
|
regscale/models/regscale_models/user_group.py,sha256=vzlXHvPNsgJd38H0R3osi46Oj19QO5oPx0qXntQBKWI,1891
|
|
442
|
-
regscale/models/regscale_models/vulnerability.py,sha256=
|
|
443
|
-
regscale/models/regscale_models/vulnerability_mapping.py,sha256=
|
|
446
|
+
regscale/models/regscale_models/vulnerability.py,sha256=klN8MYatevFGVaulex6WeLw-uvxT07ty-cXU9CxS_-Q,11042
|
|
447
|
+
regscale/models/regscale_models/vulnerability_mapping.py,sha256=k14azHU7VwryHfXaJdvAMWXs3AqHDr7rnj602bscWQM,6260
|
|
444
448
|
regscale/models/regscale_models/workflow.py,sha256=uMNVVAn5qR8wxjMP5PHbcvMmvPRe1gn1oclVUpbv52s,1873
|
|
445
449
|
regscale/models/regscale_models/workflow_action.py,sha256=zMHrvUkTQJlkCj6Xx6wadozBwsVPpObj5GD81LI2VZc,925
|
|
446
450
|
regscale/models/regscale_models/workflow_instance.py,sha256=15QPr25bVdB3ERPXmQfy2REflVsOZAq6-wZF0GV0MPo,10895
|
|
@@ -477,7 +481,7 @@ regscale/visualization/click.py,sha256=-fxIwc-RrI3iHdMNTk_dhplC8yUjZXcWuHfZa7ULR
|
|
|
477
481
|
tests/fixtures/__init__.py,sha256=sLuJtRNqBRm8lpE2yKvZFIqwtYho5A5O8KbJj_IpKhQ,41
|
|
478
482
|
tests/fixtures/api.py,sha256=32EY2VZxumbPAP58ZkS0_SH4UewY9Z-ZzWrP2Unwnog,2629
|
|
479
483
|
tests/fixtures/models.py,sha256=pWKwexocbJDfMGdiuafgHEz1RklO_24znfd3LsgdXEs,3569
|
|
480
|
-
tests/fixtures/test_fixture.py,sha256=
|
|
484
|
+
tests/fixtures/test_fixture.py,sha256=ndhBx4jR0snD5ONGZhBTUPzn5pRB5s9wxMR-lMRd9XM,6229
|
|
481
485
|
tests/mocks/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
482
486
|
tests/mocks/objects.py,sha256=KfCpzXpwWl-3zCLihQ3ZrQONW8Jk7F4UbcAgPz2LnnQ,99
|
|
483
487
|
tests/mocks/response.py,sha256=fUF2jrrxgmGUKXUcWWOSA457yrEyM1EB28G6RqPO9a0,1040
|
|
@@ -485,9 +489,10 @@ tests/mocks/xml.py,sha256=WYeZRZfyYmOi4TTvF7I53l3gKF4x1DE1dqy08szPkfQ,261
|
|
|
485
489
|
tests/regscale/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
486
490
|
tests/regscale/test_about.py,sha256=32YZC8XJW5QkIYIfwEVGIdIxQNUIbyzn3OzVcX_5X24,635
|
|
487
491
|
tests/regscale/test_authorization.py,sha256=fls5ODCYiu0DdkwXFepO_GM-BP6tRaPmMCZWX6VD2e8,1899
|
|
492
|
+
tests/regscale/test_init.py,sha256=W4deASP6ebAfheqaU5OaiGAfMP6vHGXkJBI4iO98cMQ,3998
|
|
488
493
|
tests/regscale/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
489
494
|
tests/regscale/core/test_api.py,sha256=25AsIT-jg8SrlkPeynUwwm4PvTOrHcRO2Ba_omnNLUY,7512
|
|
490
|
-
tests/regscale/core/test_app.py,sha256=
|
|
495
|
+
tests/regscale/core/test_app.py,sha256=8HvRRD37pI_x4VjXyjs1g7JWXr-jFIbK_lYst4tLXjI,18922
|
|
491
496
|
tests/regscale/core/test_login.py,sha256=Kl7ySS8JU7SzhmupaDexeUH8VOMjtMRJvW8-CimxHqU,1166
|
|
492
497
|
tests/regscale/core/test_logz.py,sha256=Yf6tAthETLlYOEp3hee3ovDw-WnZ_6fTw3e1rjx4xSw,2621
|
|
493
498
|
tests/regscale/core/test_sbom_generator.py,sha256=lgzo1HRbkNIIDZIeKiM2JbbIYQsak0BpU0GlvbrcexM,2935
|
|
@@ -512,9 +517,9 @@ tests/regscale/models/test_regscale_model.py,sha256=ZsrEZkC4EtdIsoQuayn1xv2gEGcV
|
|
|
512
517
|
tests/regscale/models/test_report.py,sha256=eiSvS_zS0aVeL0HBvtmHVvEzcfF9ZFVn2twj5g8KttY,970
|
|
513
518
|
tests/regscale/models/test_tenable_integrations.py,sha256=PNJC2Zu6lv1xj7y6e1yOsz5FktSU3PRKb5x3n5YG3w0,4072
|
|
514
519
|
tests/regscale/models/test_user_model.py,sha256=e9olv28qBApgnvK6hFHOgXjUC-pkaV8aGDirEIWASL4,4427
|
|
515
|
-
regscale_cli-6.20.
|
|
516
|
-
regscale_cli-6.20.
|
|
517
|
-
regscale_cli-6.20.
|
|
518
|
-
regscale_cli-6.20.
|
|
519
|
-
regscale_cli-6.20.
|
|
520
|
-
regscale_cli-6.20.
|
|
520
|
+
regscale_cli-6.20.6.0.dist-info/LICENSE,sha256=ytNhYQ9Rmhj_m-EX2pPq9Ld6tH5wrqqDYg-fCf46WDU,1076
|
|
521
|
+
regscale_cli-6.20.6.0.dist-info/METADATA,sha256=4wWenW-x93Egn3RCqEkEP59SYaDsBVsq-KPzsB8ZsXs,34899
|
|
522
|
+
regscale_cli-6.20.6.0.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
|
|
523
|
+
regscale_cli-6.20.6.0.dist-info/entry_points.txt,sha256=cLOaIP1eRv1yZ2u7BvpE3aB4x3kDrDwkpeisKOu33z8,269
|
|
524
|
+
regscale_cli-6.20.6.0.dist-info/top_level.txt,sha256=Uv8VUCAdxRm70bgrD4YNEJUmDhBThad_1aaEFGwRByc,15
|
|
525
|
+
regscale_cli-6.20.6.0.dist-info/RECORD,,
|
tests/fixtures/test_fixture.py
CHANGED
|
@@ -12,6 +12,7 @@ from typing import Optional, Union
|
|
|
12
12
|
import pytest
|
|
13
13
|
import yaml
|
|
14
14
|
|
|
15
|
+
from regscale.models import SecurityPlan
|
|
15
16
|
from regscale.core.app.api import Api
|
|
16
17
|
from regscale.core.app.application import Application
|
|
17
18
|
from regscale.core.app.internal.login import login
|
|
@@ -28,6 +29,7 @@ class CLITestFixture:
|
|
|
28
29
|
config: dict
|
|
29
30
|
logger: Logger
|
|
30
31
|
title_prefix: str
|
|
32
|
+
security_plan: SecurityPlan
|
|
31
33
|
|
|
32
34
|
def update_config_with_env(self):
|
|
33
35
|
"""
|
|
@@ -103,8 +105,20 @@ class CLITestFixture:
|
|
|
103
105
|
cwd = Path(os.getcwd())
|
|
104
106
|
return cwd / suffix if suffix else cwd
|
|
105
107
|
|
|
108
|
+
@pytest.fixture(scope="session")
|
|
109
|
+
def generate_uuid(self) -> str:
|
|
110
|
+
"""
|
|
111
|
+
Generate a string with the python version and random UUID
|
|
112
|
+
|
|
113
|
+
:return: A string with the python version and random UUID
|
|
114
|
+
:rtype: str
|
|
115
|
+
"""
|
|
116
|
+
python_info = f"Python{sys.version_info.major}.{sys.version_info.minor}"
|
|
117
|
+
random_id = uuid.uuid1()
|
|
118
|
+
return f"{python_info} Test {random_id}"
|
|
119
|
+
|
|
106
120
|
@pytest.fixture(autouse=True)
|
|
107
|
-
def cli_test_fixture(self, request):
|
|
121
|
+
def cli_test_fixture(self, request, generate_uuid):
|
|
108
122
|
"""
|
|
109
123
|
Test fixture for the CLI application
|
|
110
124
|
|
|
@@ -124,9 +138,7 @@ class CLITestFixture:
|
|
|
124
138
|
test_config = {**config_dict, **self.app.config}
|
|
125
139
|
self.app.save_config(test_config)
|
|
126
140
|
self.config = self.app.config
|
|
127
|
-
|
|
128
|
-
random_id = uuid.uuid3(uuid.NAMESPACE_DNS, python_info)
|
|
129
|
-
self.title_prefix = f"{python_info} Test {random_id} - "
|
|
141
|
+
self.title_prefix = generate_uuid
|
|
130
142
|
# login with token if available
|
|
131
143
|
if token := os.getenv("REGSCALE_TOKEN") or self.config.get("token"):
|
|
132
144
|
login(token=token, app=self.app)
|
|
@@ -142,3 +154,20 @@ class CLITestFixture:
|
|
|
142
154
|
logger.info(f"Test Setup Complete: {self.title_prefix}")
|
|
143
155
|
# Test Execution
|
|
144
156
|
yield self.app
|
|
157
|
+
|
|
158
|
+
@pytest.fixture(scope="class")
|
|
159
|
+
def create_security_plan(self, request, generate_uuid):
|
|
160
|
+
"""Create a security plan for testing"""
|
|
161
|
+
security_plan = None
|
|
162
|
+
try:
|
|
163
|
+
ssp = SecurityPlan(
|
|
164
|
+
systemName=generate_uuid,
|
|
165
|
+
description="Test SSP",
|
|
166
|
+
)
|
|
167
|
+
security_plan = ssp.create()
|
|
168
|
+
|
|
169
|
+
yield security_plan
|
|
170
|
+
finally:
|
|
171
|
+
# Cleanup after all tests in the class are done
|
|
172
|
+
if security_plan:
|
|
173
|
+
security_plan.delete()
|
tests/regscale/core/test_app.py
CHANGED
|
@@ -4,6 +4,7 @@ Test the Application class used by the RegScale CLI.
|
|
|
4
4
|
|
|
5
5
|
import os
|
|
6
6
|
from unittest.mock import patch, MagicMock
|
|
7
|
+
import pytest
|
|
7
8
|
|
|
8
9
|
from requests import Response
|
|
9
10
|
|
|
@@ -18,6 +19,13 @@ class TestApplication:
|
|
|
18
19
|
test_domain = "https://example.com"
|
|
19
20
|
test_token = "Bearer test_token"
|
|
20
21
|
|
|
22
|
+
@pytest.fixture(autouse=True)
|
|
23
|
+
def save_config(self):
|
|
24
|
+
original_conf = self.app.config
|
|
25
|
+
yield
|
|
26
|
+
self.app.config = original_conf
|
|
27
|
+
self.app.save_config(original_conf)
|
|
28
|
+
|
|
21
29
|
def teardown_method(self, method):
|
|
22
30
|
"""
|
|
23
31
|
Remove the test config file after each test
|
|
@@ -60,13 +68,15 @@ class TestApplication:
|
|
|
60
68
|
mock_response = MagicMock()
|
|
61
69
|
mock_response.json.return_value = {"cliConfig": "key: value"}
|
|
62
70
|
mock_get.return_value = mock_response
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
71
|
+
envars = os.environ.copy()
|
|
72
|
+
envars["REGSCALE_DOMAIN"] = self.test_domain
|
|
73
|
+
envars["REGSCALE_TOKEN"] = self.test_token
|
|
74
|
+
with patch.dict(os.environ, envars, clear=True):
|
|
75
|
+
config = self.app._fetch_config_from_regscale(config={})
|
|
76
|
+
assert config["domain"] == self.test_domain
|
|
77
|
+
assert config["token"] == self.test_token
|
|
78
|
+
assert config["userId"] == "test_user_id"
|
|
79
|
+
assert config["key"] == "value"
|
|
70
80
|
|
|
71
81
|
@patch("requests.get")
|
|
72
82
|
def test_fetch_config_from_regscale_failure(self, mock_get):
|
|
@@ -74,14 +84,16 @@ class TestApplication:
|
|
|
74
84
|
mock_response.json.return_value = "Not found."
|
|
75
85
|
mock_response.status_code = 404
|
|
76
86
|
mock_get.return_value = mock_response
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
87
|
+
envars = os.environ.copy()
|
|
88
|
+
envars["REGSCALE_DOMAIN"] = self.test_domain
|
|
89
|
+
envars["REGSCALE_TOKEN"] = self.test_token
|
|
90
|
+
with patch.dict(os.environ, envars, clear=True):
|
|
91
|
+
empty_config = self.app._fetch_config_from_regscale()
|
|
92
|
+
assert empty_config == {}
|
|
93
|
+
with patch.object(self.app.logger, "error") as mock_logger_error:
|
|
94
|
+
config = self.app._fetch_config_from_regscale(config=self.app.config)
|
|
95
|
+
mock_logger_error.assert_called_once()
|
|
96
|
+
assert config == {}
|
|
85
97
|
|
|
86
98
|
def test_gen_config(self):
|
|
87
99
|
self.app.local_config = True
|
|
@@ -158,26 +170,35 @@ class TestApplication:
|
|
|
158
170
|
assert result == {"key": "value"}
|
|
159
171
|
|
|
160
172
|
def test_get_airflow_config_with_env_vars(self):
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
173
|
+
envars = os.environ.copy()
|
|
174
|
+
envars["REGSCALE_TOKEN"] = self.test_token
|
|
175
|
+
envars["REGSCALE_DOMAIN"] = self.test_domain
|
|
176
|
+
with patch.dict(os.environ, envars, clear=True):
|
|
177
|
+
with patch.object(self.app, "_fetch_config_from_regscale", return_value={"key": "value"}):
|
|
178
|
+
result = self.app._get_airflow_config()
|
|
179
|
+
assert result == {"key": "value"}
|
|
166
180
|
|
|
167
181
|
def test_get_airflow_config_no_config(self):
|
|
168
|
-
os.environ
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
assert
|
|
172
|
-
|
|
173
|
-
os.environ
|
|
174
|
-
os.environ["REGSCALE_DOMAIN"] = self.test_domain
|
|
175
|
-
with patch.object(
|
|
176
|
-
self.app, "_fetch_config_from_regscale", return_value={"token": self.test_token, "domain": self.test_domain}
|
|
177
|
-
):
|
|
182
|
+
envars = os.environ.copy()
|
|
183
|
+
envars.pop("REGSCALE_TOKEN")
|
|
184
|
+
envars.pop("REGSCALE_DOMAIN")
|
|
185
|
+
assert envars.get("REGSCALE_TOKEN") is None
|
|
186
|
+
assert envars.get("REGSCALE_DOMAIN") is None
|
|
187
|
+
with patch.dict(os.environ, envars, clear=True):
|
|
178
188
|
result = self.app._get_airflow_config()
|
|
179
|
-
assert result
|
|
180
|
-
|
|
189
|
+
assert result is None
|
|
190
|
+
|
|
191
|
+
envars["REGSCALE_TOKEN"] = self.test_token
|
|
192
|
+
envars["REGSCALE_DOMAIN"] = self.test_domain
|
|
193
|
+
with patch.dict(os.environ, envars, clear=True):
|
|
194
|
+
with patch.object(
|
|
195
|
+
self.app,
|
|
196
|
+
"_fetch_config_from_regscale",
|
|
197
|
+
return_value={"token": self.test_token, "domain": self.test_domain},
|
|
198
|
+
):
|
|
199
|
+
result = self.app._get_airflow_config()
|
|
200
|
+
assert result["token"] == self.test_token
|
|
201
|
+
assert result["domain"] == self.test_domain
|
|
181
202
|
|
|
182
203
|
def test_get_airflow_config_invalid_json(self):
|
|
183
204
|
config = "{'key': 'value'"
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import sys
|
|
2
|
+
import types
|
|
3
|
+
import unittest
|
|
4
|
+
from unittest.mock import patch, mock_open, MagicMock
|
|
5
|
+
|
|
6
|
+
airflow_exceptions = types.ModuleType("airflow.exceptions")
|
|
7
|
+
airflow_exceptions.AirflowException = Exception
|
|
8
|
+
sys.modules["airflow.exceptions"] = airflow_exceptions
|
|
9
|
+
|
|
10
|
+
airflow_settings = types.ModuleType("airflow.settings")
|
|
11
|
+
airflow_settings.initialize = lambda: None
|
|
12
|
+
airflow_settings.LAZY_LOAD_PROVIDERS = True
|
|
13
|
+
sys.modules["airflow.settings"] = airflow_settings
|
|
14
|
+
|
|
15
|
+
sys.modules["airflow.configuration"] = types.ModuleType("airflow.configuration")
|
|
16
|
+
|
|
17
|
+
airflow_operators = types.ModuleType("airflow.operators")
|
|
18
|
+
airflow_operators_python = types.ModuleType("airflow.operators.python")
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class DummyPythonOperator:
|
|
22
|
+
def __init__(self, *args, **kwargs):
|
|
23
|
+
pass
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
airflow_operators_python.PythonOperator = DummyPythonOperator
|
|
27
|
+
sys.modules["airflow.operators"] = airflow_operators
|
|
28
|
+
sys.modules["airflow.operators.python"] = airflow_operators_python
|
|
29
|
+
|
|
30
|
+
from regscale.airflow.tasks.init import get_shared_keys, set_shared_config_values # noqa: E402
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class TestInitPy(unittest.TestCase):
|
|
34
|
+
@patch("regscale.airflow.tasks.init.execute_click_command")
|
|
35
|
+
@patch("yaml.safe_load", return_value={"foo": "bar"})
|
|
36
|
+
@patch("pathlib.Path.open", new_callable=mock_open, read_data="foo: bar\n")
|
|
37
|
+
def test_get_shared_keys(self, mock_file, mock_yaml, mock_exec):
|
|
38
|
+
"""
|
|
39
|
+
If the YAML and dag_run.conf share a key, we should get that key back and execute the click command once.
|
|
40
|
+
"""
|
|
41
|
+
dag_context = {"dag_run": MagicMock(conf={"foo": "baz"})}
|
|
42
|
+
shared_keys = get_shared_keys("dummy.yaml", **dag_context)
|
|
43
|
+
self.assertEqual(shared_keys, ["foo"])
|
|
44
|
+
mock_exec.assert_called_once()
|
|
45
|
+
|
|
46
|
+
@patch("regscale.airflow.tasks.init.execute_click_command")
|
|
47
|
+
def test_set_shared_config_values(self, mock_exec):
|
|
48
|
+
"""
|
|
49
|
+
When shared keys are found in xcom, set_shared_config_values should call execute_click_command for each.
|
|
50
|
+
"""
|
|
51
|
+
dag_context = {
|
|
52
|
+
"dag_run": MagicMock(conf={"foo": "bar", "op_kwargs": {"shared_keys_task": "task1"}}),
|
|
53
|
+
"ti": MagicMock(xcom_pull=MagicMock(return_value=["foo"])),
|
|
54
|
+
}
|
|
55
|
+
set_shared_config_values(shared_keys_task=None, **dag_context)
|
|
56
|
+
mock_exec.assert_called_once()
|
|
57
|
+
|
|
58
|
+
def test_set_shared_config_values_raises(self):
|
|
59
|
+
"""
|
|
60
|
+
If op_kwargs is missing from dag_run.conf, set_shared_config_values should raise an AirflowException.
|
|
61
|
+
"""
|
|
62
|
+
from airflow.exceptions import AirflowException
|
|
63
|
+
|
|
64
|
+
dag_context = {"dag_run": MagicMock(conf={})}
|
|
65
|
+
with self.assertRaises(AirflowException):
|
|
66
|
+
set_shared_config_values(shared_keys_task=None, **dag_context)
|
|
67
|
+
|
|
68
|
+
@patch("regscale.airflow.tasks.init.execute_click_command")
|
|
69
|
+
def test_set_shared_config_values_warns(self, mock_exec):
|
|
70
|
+
"""
|
|
71
|
+
If xcom_pull returns None, set_shared_config_values should log a warning and not call execute_click_command.
|
|
72
|
+
"""
|
|
73
|
+
dag_context = {
|
|
74
|
+
"dag_run": MagicMock(conf={"foo": "bar", "op_kwargs": {"shared_keys_task": "task1"}}),
|
|
75
|
+
"ti": MagicMock(xcom_pull=MagicMock(return_value=None)),
|
|
76
|
+
}
|
|
77
|
+
with self.assertLogs(level="WARNING") as log:
|
|
78
|
+
set_shared_config_values(shared_keys_task=None, **dag_context)
|
|
79
|
+
self.assertTrue(any("No shared keys found" in msg for msg in log.output))
|
|
80
|
+
mock_exec.assert_not_called()
|
|
81
|
+
|
|
82
|
+
@patch("yaml.safe_load", return_value={"foo": "bar"})
|
|
83
|
+
@patch("pathlib.Path.open", new_callable=mock_open, read_data="foo: bar\n")
|
|
84
|
+
def test_get_shared_keys_logs_error(self, mock_file, mock_yaml):
|
|
85
|
+
"""
|
|
86
|
+
If dag_run is missing from the context, get_shared_keys should log an error and raise KeyError.
|
|
87
|
+
"""
|
|
88
|
+
with self.assertLogs(level="ERROR") as log, self.assertRaises(KeyError):
|
|
89
|
+
get_shared_keys("dummy.yaml")
|
|
90
|
+
self.assertTrue(any("context contains" in msg for msg in log.output))
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
if __name__ == "__main__":
|
|
94
|
+
unittest.main()
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|