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.

Files changed (49) hide show
  1. regscale/__init__.py +1 -1
  2. regscale/_version.py +39 -0
  3. regscale/core/app/internal/__init__.py +13 -0
  4. regscale/core/app/internal/model_editor.py +3 -3
  5. regscale/core/app/internal/set_permissions.py +173 -0
  6. regscale/core/app/utils/file_utils.py +11 -1
  7. regscale/core/app/utils/regscale_utils.py +34 -129
  8. regscale/core/utils/date.py +86 -30
  9. regscale/integrations/commercial/defender.py +3 -0
  10. regscale/integrations/commercial/qualys/__init__.py +40 -14
  11. regscale/integrations/commercial/qualys/containers.py +324 -0
  12. regscale/integrations/commercial/qualys/scanner.py +203 -8
  13. regscale/integrations/commercial/synqly/edr.py +10 -0
  14. regscale/integrations/commercial/wizv2/click.py +11 -7
  15. regscale/integrations/commercial/wizv2/constants.py +28 -0
  16. regscale/integrations/commercial/wizv2/issue.py +3 -2
  17. regscale/integrations/commercial/wizv2/parsers.py +23 -0
  18. regscale/integrations/commercial/wizv2/scanner.py +89 -30
  19. regscale/integrations/commercial/wizv2/utils.py +208 -75
  20. regscale/integrations/commercial/wizv2/variables.py +2 -1
  21. regscale/integrations/commercial/wizv2/wiz_auth.py +3 -3
  22. regscale/integrations/public/fedramp/fedramp_cis_crm.py +98 -20
  23. regscale/integrations/public/fedramp/fedramp_docx.py +2 -3
  24. regscale/integrations/scanner_integration.py +7 -2
  25. regscale/models/integration_models/cisa_kev_data.json +187 -5
  26. regscale/models/integration_models/synqly_models/capabilities.json +1 -1
  27. regscale/models/regscale_models/__init__.py +2 -0
  28. regscale/models/regscale_models/asset.py +1 -1
  29. regscale/models/regscale_models/catalog.py +16 -0
  30. regscale/models/regscale_models/file.py +2 -1
  31. regscale/models/regscale_models/form_field_value.py +59 -1
  32. regscale/models/regscale_models/issue.py +47 -0
  33. regscale/models/regscale_models/modules.py +88 -1
  34. regscale/models/regscale_models/organization.py +30 -0
  35. regscale/models/regscale_models/regscale_model.py +20 -6
  36. regscale/models/regscale_models/security_control.py +47 -0
  37. regscale/models/regscale_models/security_plan.py +32 -0
  38. regscale/models/regscale_models/vulnerability.py +3 -3
  39. regscale/models/regscale_models/vulnerability_mapping.py +2 -2
  40. regscale/regscale.py +2 -0
  41. {regscale_cli-6.20.4.1.dist-info → regscale_cli-6.20.6.0.dist-info}/METADATA +1 -1
  42. {regscale_cli-6.20.4.1.dist-info → regscale_cli-6.20.6.0.dist-info}/RECORD +49 -44
  43. tests/fixtures/test_fixture.py +33 -4
  44. tests/regscale/core/test_app.py +53 -32
  45. tests/regscale/test_init.py +94 -0
  46. {regscale_cli-6.20.4.1.dist-info → regscale_cli-6.20.6.0.dist-info}/LICENSE +0 -0
  47. {regscale_cli-6.20.4.1.dist-info → regscale_cli-6.20.6.0.dist-info}/WHEEL +0 -0
  48. {regscale_cli-6.20.4.1.dist-info → regscale_cli-6.20.6.0.dist-info}/entry_points.txt +0 -0
  49. {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=mrOIzxUcC6JJdgXm3RrYL3JG258csG0WHAEujEEUpjs,25
2
- regscale/regscale.py,sha256=2mNIkLGtQjIvl0m255iV20_3DK4oRSTlXYxe-8XQpeo,30764
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=2ZJGwSuQBoQa1euFJ2pQsyEBMqWqXv7qq8yu02eQcYQ,4436
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=4XADESWYs9lpEjnhuXACF47xsWkO8nYEuTz7bxlmVRQ,61666
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=URKWVEiR9aFnwoW3-Io7R22tBVeROTC3sX1wOZuhqXw,8912
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=fGcYc8lGwBsT3GP2RKkROPztslsNKYVXZvEeIFHeUig,10431
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=kTpJ5IBgqcTDOtx9NQc1KnSh7fiQcM7maxDmANBSc58,8355
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=PMP-BjSLDvBvdbc2z13zb5w3-HWfv0O41SSyj3TrLQE,135563
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=SA3cn4tdRcD6ZjbCZgULl3ts2fAUqnf27RkdDo7ULGM,65920
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=D-L5jeRvakv7ZXGe_kolgOqK8WrcvbwacRCFUpUGzwQ,87354
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=KbbCq6NofgFCdPJBY6KDc8q0OIajvRGmYjUmJD2Hfcs,47409
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=snW_MW3qCeydzd_TokZGA7njMXhX7lCjF3OmQ-Qy3aE,2664
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=eHIS9TdbZQ2Iu57uwbj3ep0m5gpI0HaK5W_ReL892Y4,12232
229
- regscale/integrations/commercial/wizv2/constants.py,sha256=DgxTbtnUixK-IOnmbie7-Hosip3huJPDeRn0GzKlqJU,22854
230
- regscale/integrations/commercial/wizv2/issue.py,sha256=MbND-Ir4pU4i0OtxsjbRxn_i8Ibll6gt-qYQK2ObstA,13361
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=YcFOGdYZZ17hj2pcRMC9Ho2wPY94dfJ4hHwqTR5BB6c,11095
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=vPKTV6RhA2_00lBHVsk7jD68Lh_DReCSsmHnSHp8c4w,20964
235
- regscale/integrations/commercial/wizv2/utils.py,sha256=NlRkIgYY10a9tkRO70m_zE-nXC5svsZuvxfL3l3fEK0,32249
236
- regscale/integrations/commercial/wizv2/variables.py,sha256=W_m_TSLUDaqyKJZHukp6i8nftFuhQKb4WRVu9lIyMAs,2485
237
- regscale/integrations/commercial/wizv2/wiz_auth.py,sha256=BpQTYJn3u0QiWC2IAw-bunZpBPsJtDJgOsC2zOL_UU4,5554
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=ygDUlinOizUrUa_9vilFVejP_RB8nVMJ7quf1RhN2Yo,61488
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=GnRjuWEgE9XSe9egPOQSZ8lMjY4CpqcD2IS5paI-xQc,13742
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=IkDjhhPKGl7NdGfVwGZV1lX-Fw5J0ALeXk82mTW0ccc,1217687
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=49O0YTFgs_HdTv-4If3OY7qb75SIf3hZ_AiZOjxlVek,331964
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=f3i0UQgyaWxWxyQrNrIaV55KOEhMSGWZ6b_6OO7VngQ,2141
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=-ws6o6hRl2sMLNcT8CIw0SQvOwLtrVSeEp5kF80ydAQ,19840
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=U0nEyQSKgMuNCWh22gGk5sC-xeBmN8UXHiBsJKIFNZ8,8546
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=_95A8ERXkA7CQRmbl3z7dpe2uZyrkEcGlSKDpIYwurg,14360
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=4LQrIdJgDwBh2Fyne9CH-EJ8G21a-tglxod8D48r2lY,3443
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=qtHB2i9wGu2fO4M1qWTOKWWww4bkgFJFaDCkom4Hw7A,46834
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=CkR03zJhrBjhw50d-Kpyem7Ryh-QWz_RLHEMlx2e8VA,6150
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=NBlCeW-Gm6WrTwOJ75mweK63X_1hsO2tvEYQFWG2fEY,68343
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=tob8y9zaMGdITju4ffrCAa5s6qhdchdkuxJdZ6VdkOA,4614
429
- regscale/models/regscale_models/security_plan.py,sha256=4hBnAqHpjVXd6i1dsO2r2HbPKjeyM-QnMKCmdk1sYGw,7549
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=VKgWMVvAQ74Sq46myYsivGfIeW63dHq3bv3cRCkDcbg,10960
443
- regscale/models/regscale_models/vulnerability_mapping.py,sha256=cq44xkkCH7rfp0BJxavr4DLiEAHouyyPmi5EaizH6NI,6261
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=T-Fx3l0uTIO3WKphlfaWttZ5Ur3Z1oXTPFDYGFuFBwQ,5360
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=IOLC6dzgsZF5PdGRHaTqFvJa-BV3dozRK30QQd6JvQs,18099
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.4.1.dist-info/LICENSE,sha256=ytNhYQ9Rmhj_m-EX2pPq9Ld6tH5wrqqDYg-fCf46WDU,1076
516
- regscale_cli-6.20.4.1.dist-info/METADATA,sha256=ZXfW2mTv2QYQMyGyHP_bEoFXBM7Y0RMPfyMwkCmTKw8,34899
517
- regscale_cli-6.20.4.1.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
518
- regscale_cli-6.20.4.1.dist-info/entry_points.txt,sha256=cLOaIP1eRv1yZ2u7BvpE3aB4x3kDrDwkpeisKOu33z8,269
519
- regscale_cli-6.20.4.1.dist-info/top_level.txt,sha256=Uv8VUCAdxRm70bgrD4YNEJUmDhBThad_1aaEFGwRByc,15
520
- regscale_cli-6.20.4.1.dist-info/RECORD,,
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,,
@@ -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
- python_info = f"Python{sys.version_info.major}.{sys.version_info.minor}"
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()
@@ -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
- os.environ["REGSCALE_DOMAIN"] = self.test_domain
64
- os.environ["REGSCALE_TOKEN"] = self.test_token
65
- config = self.app._fetch_config_from_regscale(config={})
66
- assert config["domain"] == self.test_domain
67
- assert config["token"] == self.test_token
68
- assert config["userId"] == "test_user_id"
69
- assert config["key"] == "value"
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
- os.environ["REGSCALE_DOMAIN"] = self.test_domain
78
- os.environ["REGSCALE_TOKEN"] = self.test_token
79
- empty_config = self.app._fetch_config_from_regscale()
80
- assert empty_config == {}
81
- with patch.object(self.app.logger, "error") as mock_logger_error:
82
- config = self.app._fetch_config_from_regscale(config=self.app.config)
83
- mock_logger_error.assert_called_once()
84
- assert config == {}
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
- os.environ["REGSCALE_TOKEN"] = self.test_token
162
- os.environ["REGSCALE_DOMAIN"] = self.test_domain
163
- with patch.object(self.app, "_fetch_config_from_regscale", return_value={"key": "value"}):
164
- result = self.app._get_airflow_config()
165
- assert result == {"key": "value"}
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["REGSCALE_TOKEN"] = ""
169
- os.environ["REGSCALE_DOMAIN"] = ""
170
- result = self.app._get_airflow_config()
171
- assert result is None
172
-
173
- os.environ["REGSCALE_TOKEN"] = self.test_token
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["token"] == self.test_token
180
- assert result["domain"] == self.test_domain
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()