civics-cdf-validator 1.46.dev1__tar.gz → 1.46.dev2__tar.gz

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.
Files changed (22) hide show
  1. {civics_cdf_validator-1.46.dev1/civics_cdf_validator.egg-info → civics_cdf_validator-1.46.dev2}/PKG-INFO +1 -1
  2. {civics_cdf_validator-1.46.dev1 → civics_cdf_validator-1.46.dev2/civics_cdf_validator.egg-info}/PKG-INFO +1 -1
  3. {civics_cdf_validator-1.46.dev1 → civics_cdf_validator-1.46.dev2}/rules.py +35 -0
  4. {civics_cdf_validator-1.46.dev1 → civics_cdf_validator-1.46.dev2}/version.py +1 -1
  5. {civics_cdf_validator-1.46.dev1 → civics_cdf_validator-1.46.dev2}/CONTRIBUTING.md +0 -0
  6. {civics_cdf_validator-1.46.dev1 → civics_cdf_validator-1.46.dev2}/LICENSE-2.0.txt +0 -0
  7. {civics_cdf_validator-1.46.dev1 → civics_cdf_validator-1.46.dev2}/MANIFEST.in +0 -0
  8. {civics_cdf_validator-1.46.dev1 → civics_cdf_validator-1.46.dev2}/README.md +0 -0
  9. {civics_cdf_validator-1.46.dev1 → civics_cdf_validator-1.46.dev2}/__init__.py +0 -0
  10. {civics_cdf_validator-1.46.dev1 → civics_cdf_validator-1.46.dev2}/base.py +0 -0
  11. {civics_cdf_validator-1.46.dev1 → civics_cdf_validator-1.46.dev2}/civics_cdf_validator.egg-info/SOURCES.txt +0 -0
  12. {civics_cdf_validator-1.46.dev1 → civics_cdf_validator-1.46.dev2}/civics_cdf_validator.egg-info/dependency_links.txt +0 -0
  13. {civics_cdf_validator-1.46.dev1 → civics_cdf_validator-1.46.dev2}/civics_cdf_validator.egg-info/entry_points.txt +0 -0
  14. {civics_cdf_validator-1.46.dev1 → civics_cdf_validator-1.46.dev2}/civics_cdf_validator.egg-info/requires.txt +0 -0
  15. {civics_cdf_validator-1.46.dev1 → civics_cdf_validator-1.46.dev2}/civics_cdf_validator.egg-info/top_level.txt +0 -0
  16. {civics_cdf_validator-1.46.dev1 → civics_cdf_validator-1.46.dev2}/gpunit_rules.py +0 -0
  17. {civics_cdf_validator-1.46.dev1 → civics_cdf_validator-1.46.dev2}/loggers.py +0 -0
  18. {civics_cdf_validator-1.46.dev1 → civics_cdf_validator-1.46.dev2}/office_utils.py +0 -0
  19. {civics_cdf_validator-1.46.dev1 → civics_cdf_validator-1.46.dev2}/setup.cfg +0 -0
  20. {civics_cdf_validator-1.46.dev1 → civics_cdf_validator-1.46.dev2}/setup.py +0 -0
  21. {civics_cdf_validator-1.46.dev1 → civics_cdf_validator-1.46.dev2}/stats.py +0 -0
  22. {civics_cdf_validator-1.46.dev1 → civics_cdf_validator-1.46.dev2}/validator.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: civics_cdf_validator
3
- Version: 1.46.dev1
3
+ Version: 1.46.dev2
4
4
  Summary: Checks if an election feed follows best practices
5
5
  Home-page: https://github.com/google/civics_cdf_validator
6
6
  Author: Google Civics
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: civics_cdf_validator
3
- Version: 1.46.dev1
3
+ Version: 1.46.dev2
4
4
  Summary: Checks if an election feed follows best practices
5
5
  Home-page: https://github.com/google/civics_cdf_validator
6
6
  Author: Google Civics
@@ -3751,6 +3751,40 @@ class ElectionEventDatesAreSequential(base.DateRule):
3751
3751
  raise loggers.ElectionError(self.error_log)
3752
3752
 
3753
3753
 
3754
+ class NoSourceDirPathBeforeInitialDeliveryDate(base.BaseRule):
3755
+ """SourceDirPath should only be defined if one of the initial delivery dates is in the past.
3756
+ """
3757
+
3758
+ def elements(self):
3759
+ return ["Feed"]
3760
+
3761
+ def check(self, element):
3762
+ if not element_has_text(element.find("SourceDirPath")):
3763
+ return
3764
+ today = datetime.date.today()
3765
+ today_partial_date = base.PartialDate(
3766
+ year=today.year, month=today.month, day=today.day
3767
+ )
3768
+ initial_deliveries = element.findall(".//InitialDeliveryDate")
3769
+ if initial_deliveries:
3770
+ for initial_delivery in initial_deliveries:
3771
+ initial_delivery_date = (
3772
+ base.PartialDate.init_partial_date(initial_delivery.text)
3773
+ if element_has_text(initial_delivery)
3774
+ else None
3775
+ )
3776
+ if (
3777
+ initial_delivery_date
3778
+ and initial_delivery_date.is_older_than(today_partial_date) > 0
3779
+ ):
3780
+ return
3781
+ raise loggers.ElectionWarning.from_message(
3782
+ "SourceDirPath is defined but all initialDeliveryDate are in the"
3783
+ " future.",
3784
+ [element],
3785
+ )
3786
+
3787
+
3754
3788
  class OfficeHolderSubFeedDatesAreSequential(base.DateRule):
3755
3789
  """Dates in an OfficeHolderSubFeed element should be sequential."""
3756
3790
 
@@ -4090,6 +4124,7 @@ METADATA_RULES = (
4090
4124
  OfficeHolderSubFeedDatesAreSequential,
4091
4125
  FeedHasValidCountryCode,
4092
4126
  FeedInactiveDateSetForNonEvergreenFeed,
4127
+ NoSourceDirPathBeforeInitialDeliveryDate,
4093
4128
  )
4094
4129
 
4095
4130
  ALL_RULES = frozenset(
@@ -5,4 +5,4 @@ No dependencies should be added to this module.
5
5
  See https://packaging.python.org/guides/single-sourcing-package-version/
6
6
  """
7
7
 
8
- __version__ = '1.46.dev1'
8
+ __version__ = '1.46.dev2'