regscale-cli 6.21.2.1__py3-none-any.whl → 6.21.2.2__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/_version.py CHANGED
@@ -33,7 +33,7 @@ def get_version_from_pyproject() -> str:
33
33
  return match.group(1)
34
34
  except Exception:
35
35
  pass
36
- return "6.21.2.1" # fallback version
36
+ return "6.21.2.2" # fallback version
37
37
 
38
38
 
39
39
  __version__ = get_version_from_pyproject()
@@ -1742,7 +1742,7 @@ class ScannerIntegration(ABC):
1742
1742
  ).create_or_update()
1743
1743
  logger.debug("Added CWE property %s to issue %s", finding.plugin_id, issue.id)
1744
1744
 
1745
- if ScannerVariables.useMilestones:
1745
+ if ScannerVariables.useMilestones and issue.id:
1746
1746
  if (
1747
1747
  existing_issue
1748
1748
  and existing_issue.status == regscale_models.IssueStatus.Closed
@@ -1754,7 +1754,7 @@ class ScannerIntegration(ABC):
1754
1754
  responsiblePersonId=self.assessor_id,
1755
1755
  parentID=issue.id,
1756
1756
  parentModule="issues",
1757
- ).create_or_update()
1757
+ ).create()
1758
1758
  logger.debug("Added milestone for issue %s from finding %s", issue.id, finding.external_id)
1759
1759
  elif (
1760
1760
  existing_issue
@@ -1767,7 +1767,7 @@ class ScannerIntegration(ABC):
1767
1767
  responsiblePersonId=self.assessor_id,
1768
1768
  parentID=issue.id,
1769
1769
  parentModule="issues",
1770
- ).create_or_update()
1770
+ ).create()
1771
1771
  logger.debug("Added milestone for issue %s from finding %s", issue.id, finding.external_id)
1772
1772
  elif not existing_issue:
1773
1773
  regscale_models.Milestone(
@@ -1776,7 +1776,7 @@ class ScannerIntegration(ABC):
1776
1776
  responsiblePersonId=self.assessor_id,
1777
1777
  parentID=issue.id,
1778
1778
  parentModule="issues",
1779
- ).create_or_update()
1779
+ ).create()
1780
1780
  logger.debug("Created milestone for issue %s from finding %s", issue.id, finding.external_id)
1781
1781
  else:
1782
1782
  logger.debug("No milestone created for issue %s from finding %s", issue.id, finding.external_id)
@@ -2661,7 +2661,7 @@ class ScannerIntegration(ABC):
2661
2661
  issue.dateLastUpdated = get_current_datetime()
2662
2662
  issue.save()
2663
2663
 
2664
- if ScannerVariables.useMilestones:
2664
+ if ScannerVariables.useMilestones and issue.id:
2665
2665
  regscale_models.Milestone(
2666
2666
  title=f"Issue closed from {self.title} scan",
2667
2667
  milestoneDate=issue.dateCompleted,
@@ -2669,7 +2669,7 @@ class ScannerIntegration(ABC):
2669
2669
  completed=True,
2670
2670
  parentID=issue.id,
2671
2671
  parentModule="issues",
2672
- ).create_or_update()
2672
+ ).create()
2673
2673
  logger.debug("Created milestone for issue %s from %s tool", issue.id, self.title)
2674
2674
 
2675
2675
  with count_lock:
@@ -4,7 +4,7 @@
4
4
 
5
5
  from typing import Optional
6
6
 
7
- from pydantic import Field, field_validator
7
+ from pydantic import Field, field_validator, model_validator
8
8
 
9
9
  from regscale.core.app.utils.app_utils import get_current_datetime
10
10
  from regscale.models.regscale_models.regscale_model import RegScaleModel
@@ -15,7 +15,7 @@ class Milestone(RegScaleModel):
15
15
 
16
16
  _module_slug = "milestones"
17
17
  _module_string = "milestones"
18
- _unique_fields = ["title", "parentID", "parentModule"]
18
+ _unique_fields = ["title", "parentModule"]
19
19
 
20
20
  title: str
21
21
  id: int = 0
@@ -29,13 +29,30 @@ class Milestone(RegScaleModel):
29
29
  parentID: Optional[int] = None
30
30
  parentModule: str = ""
31
31
 
32
+ @field_validator("milestoneDate")
33
+ @classmethod
34
+ def validate_milestone_date(cls, v: Optional[str]) -> str:
35
+ """Ensure milestoneDate is never empty."""
36
+ if not v or v == "":
37
+ return get_current_datetime()
38
+ return v
39
+
32
40
  @field_validator("dateCompleted")
33
41
  @classmethod
34
42
  def set_date_completed(cls, v: Optional[str], info) -> Optional[str]:
35
43
  """Set dateCompleted based on completed field."""
36
44
  completed = info.data.get("completed", False)
37
- if completed and v is None:
45
+ if completed and (v is None or v == ""):
38
46
  return get_current_datetime()
39
47
  if not completed:
40
48
  return None
41
49
  return v
50
+
51
+ @model_validator(mode="after")
52
+ def validate_completion(self):
53
+ """Ensure dateCompleted is set when completed is True."""
54
+ if self.completed and (self.dateCompleted is None or self.dateCompleted == ""):
55
+ self.dateCompleted = get_current_datetime()
56
+ elif not self.completed:
57
+ self.dateCompleted = None
58
+ return self
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: regscale-cli
3
- Version: 6.21.2.1
3
+ Version: 6.21.2.2
4
4
  Summary: Command Line Interface (CLI) for bulk processing/loading data into RegScale
5
5
  Home-page: https://github.com/RegScale/regscale-cli
6
6
  Author: Travis Howerton
@@ -1,5 +1,5 @@
1
1
  regscale/__init__.py,sha256=ZygAIkX6Nbjag1czWdQa-yP-GM1mBE_9ss21Xh__JFc,34
2
- regscale/_version.py,sha256=aKR5M6GR_hLtq7YS3vSDrCZwuydhT3NwAFRrOjyWNBY,1198
2
+ regscale/_version.py,sha256=c23bJjOSOin3Rj2jQMCSQSWCsJkFOj3c3AkLRqbD5mc,1198
3
3
  regscale/regscale.py,sha256=xcxnTwEwWgfO3Fnp0LVo32SZCJzAswq3WDZgm21nHnI,30914
4
4
  regscale/airflow/__init__.py,sha256=yMwN0Bz4JbM0nl5qY_hPegxo_O2ilhTOL9PY5Njhn-s,270
5
5
  regscale/airflow/click_dags.py,sha256=H3SUR5jkvInNMv1gu-VG-Ja_H-kH145CpQYNalWNAbE,4520
@@ -114,7 +114,7 @@ regscale/integrations/api_paginator_example.py,sha256=lEuYI-xEGcjnXuIzbCobCP0YRu
114
114
  regscale/integrations/compliance_integration.py,sha256=aR13rcMh-BTpr_ibENPQZ1z5rlhtuqpPGRI9YfbqJjw,68394
115
115
  regscale/integrations/integration_override.py,sha256=HjYBCuvNpU3t3FptaqYAkdexLFOZBAFrFE9xU0RD1Nc,5867
116
116
  regscale/integrations/jsonl_scanner_integration.py,sha256=l8nq_T3rE1XX-6HxrNHm3xzxCNWbIjxQvGMdtZWs7KQ,57003
117
- regscale/integrations/scanner_integration.py,sha256=JpRr7LgzOdRdrncJ-wJrypgUTVWZ1j3Jbhl0zrNMvts,145540
117
+ regscale/integrations/scanner_integration.py,sha256=o7RdZ7Z0x0Ldhh5JrjUx1qFGKiJLw_y-6mFyhyA2P1k,145526
118
118
  regscale/integrations/variables.py,sha256=MfQ34WuYVN5437A9sZ2ssHRkA3gFhMHfk1DVasceGmY,2336
119
119
  regscale/integrations/commercial/__init__.py,sha256=LZj1qV5f7RdHIOfedDVELV62ADe5gyNccWayHMF1aVc,14026
120
120
  regscale/integrations/commercial/ad.py,sha256=YXSmK8vRf6yi2GnREGa5GrE6GelhFrLj44SY8AO1pK0,15509
@@ -415,7 +415,7 @@ regscale/models/regscale_models/line_of_inquiry.py,sha256=Uu0lQEhif0W6yTSkJo27Gy
415
415
  regscale/models/regscale_models/link.py,sha256=lAY4Ig3Menm1EqfcAbVJ7jsCsRO5tWtJIf-9-G9FXT8,6593
416
416
  regscale/models/regscale_models/master_assessment.py,sha256=t03-8vQJ7hnPNgEU0GSC1XGKOgAqHKuIupbt5IjJvtI,7322
417
417
  regscale/models/regscale_models/meta_data.py,sha256=Fg8rrWSTx3K00QkF4glH9UdY9OFWJ4_UqxleLSSbx8I,2482
418
- regscale/models/regscale_models/milestone.py,sha256=Mzf1BqG5S4a-EmgiXu8oqY8ssV7oSfgeknPI3_eINv0,1295
418
+ regscale/models/regscale_models/milestone.py,sha256=HiBdx1uzasl3Crb03j9qdowCHUy93nTOuklLs_V2SSM,1943
419
419
  regscale/models/regscale_models/module.py,sha256=a7lalHmVTQ04ZILnJxuFWdHYDtyusBMTtonD4ICL-Wc,7272
420
420
  regscale/models/regscale_models/modules.py,sha256=yeva_tct88o2NFt93_zmqUcXZ3LucVbAv5FvQPru3cQ,8551
421
421
  regscale/models/regscale_models/objective.py,sha256=aJIpmkZ-NscqV2y8SGB4HYzm615b6mklyHnW9bL2ljk,249
@@ -533,9 +533,9 @@ tests/regscale/models/test_regscale_model.py,sha256=ZsrEZkC4EtdIsoQuayn1xv2gEGcV
533
533
  tests/regscale/models/test_report.py,sha256=IqUq7C__a1_q_mLaz0PE9Lq6fHggBsB14-AzEYNBxLw,4666
534
534
  tests/regscale/models/test_tenable_integrations.py,sha256=PNJC2Zu6lv1xj7y6e1yOsz5FktSU3PRKb5x3n5YG3w0,4072
535
535
  tests/regscale/models/test_user_model.py,sha256=e9olv28qBApgnvK6hFHOgXjUC-pkaV8aGDirEIWASL4,4427
536
- regscale_cli-6.21.2.1.dist-info/LICENSE,sha256=ytNhYQ9Rmhj_m-EX2pPq9Ld6tH5wrqqDYg-fCf46WDU,1076
537
- regscale_cli-6.21.2.1.dist-info/METADATA,sha256=u5fjU9V_avvh2jOU8-hXgxc-mHhkPM1gZvz65X3GI78,34955
538
- regscale_cli-6.21.2.1.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
539
- regscale_cli-6.21.2.1.dist-info/entry_points.txt,sha256=cLOaIP1eRv1yZ2u7BvpE3aB4x3kDrDwkpeisKOu33z8,269
540
- regscale_cli-6.21.2.1.dist-info/top_level.txt,sha256=Uv8VUCAdxRm70bgrD4YNEJUmDhBThad_1aaEFGwRByc,15
541
- regscale_cli-6.21.2.1.dist-info/RECORD,,
536
+ regscale_cli-6.21.2.2.dist-info/LICENSE,sha256=ytNhYQ9Rmhj_m-EX2pPq9Ld6tH5wrqqDYg-fCf46WDU,1076
537
+ regscale_cli-6.21.2.2.dist-info/METADATA,sha256=7yq5fry5SL1DvzcbSeD18IguQQoEOpA6s7lHM2nR2zA,34955
538
+ regscale_cli-6.21.2.2.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
539
+ regscale_cli-6.21.2.2.dist-info/entry_points.txt,sha256=cLOaIP1eRv1yZ2u7BvpE3aB4x3kDrDwkpeisKOu33z8,269
540
+ regscale_cli-6.21.2.2.dist-info/top_level.txt,sha256=Uv8VUCAdxRm70bgrD4YNEJUmDhBThad_1aaEFGwRByc,15
541
+ regscale_cli-6.21.2.2.dist-info/RECORD,,