caom2 2.6.2__tar.gz → 2.6.3__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 (76) hide show
  1. {caom2-2.6.2/caom2.egg-info → caom2-2.6.3}/PKG-INFO +11 -2
  2. {caom2-2.6.2 → caom2-2.6.3}/caom2/common.py +1 -1
  3. {caom2-2.6.2 → caom2-2.6.3}/caom2/diff.py +1 -1
  4. {caom2-2.6.2 → caom2-2.6.3}/caom2/obs_reader_writer.py +31 -4
  5. {caom2-2.6.2 → caom2-2.6.3}/caom2/plane.py +14 -7
  6. {caom2-2.6.2 → caom2-2.6.3}/caom2/tests/data/SampleDerived-CAOM-2.4.xml +5386 -5660
  7. {caom2-2.6.2 → caom2-2.6.3}/caom2/tests/data/diff-actual-CAOM-2.3.xml +1 -1
  8. {caom2-2.6.2 → caom2-2.6.3}/caom2/tests/data/diff-expected-CAOM-2.3.xml +1 -1
  9. {caom2-2.6.2 → caom2-2.6.3}/caom2/tests/data/diff-expected-CAOM-2.4.xml +1 -1
  10. {caom2-2.6.2 → caom2-2.6.3}/caom2/tests/test_obs_reader_writer.py +8 -3
  11. {caom2-2.6.2 → caom2-2.6.3}/caom2/tests/test_shape.py +3 -3
  12. caom2-2.6.3/caom2/version.py +1 -0
  13. {caom2-2.6.2 → caom2-2.6.3/caom2.egg-info}/PKG-INFO +11 -2
  14. {caom2-2.6.2 → caom2-2.6.3}/setup.cfg +4 -1
  15. caom2-2.6.2/caom2/version.py +0 -1
  16. {caom2-2.6.2 → caom2-2.6.3}/LICENSE +0 -0
  17. {caom2-2.6.2 → caom2-2.6.3}/MANIFEST.in +0 -0
  18. {caom2-2.6.2 → caom2-2.6.3}/README.rst +0 -0
  19. {caom2-2.6.2 → caom2-2.6.3}/caom2/__init__.py +0 -0
  20. {caom2-2.6.2 → caom2-2.6.3}/caom2/artifact.py +0 -0
  21. {caom2-2.6.2 → caom2-2.6.3}/caom2/caom_util.py +0 -0
  22. {caom2-2.6.2 → caom2-2.6.3}/caom2/checksum.py +0 -0
  23. {caom2-2.6.2 → caom2-2.6.3}/caom2/chunk.py +0 -0
  24. {caom2-2.6.2 → caom2-2.6.3}/caom2/data/CAOM-2.2.xsd +0 -0
  25. {caom2-2.6.2 → caom2-2.6.3}/caom2/data/CAOM-2.3.xsd +0 -0
  26. {caom2-2.6.2 → caom2-2.6.3}/caom2/data/CAOM-2.4.xsd +0 -0
  27. {caom2-2.6.2 → caom2-2.6.3}/caom2/observation.py +0 -0
  28. {caom2-2.6.2 → caom2-2.6.3}/caom2/part.py +0 -0
  29. {caom2-2.6.2 → caom2-2.6.3}/caom2/shape.py +0 -0
  30. {caom2-2.6.2 → caom2-2.6.3}/caom2/tests/__init__.py +0 -0
  31. {caom2-2.6.2 → caom2-2.6.3}/caom2/tests/caom_test_instances.py +0 -0
  32. {caom2-2.6.2 → caom2-2.6.3}/caom2/tests/data/CompleteCompositeCircle-CAOM-2.2.xml +0 -0
  33. {caom2-2.6.2 → caom2-2.6.3}/caom2/tests/data/CompleteCompositeCircle-CAOM-2.3.xml +0 -0
  34. {caom2-2.6.2 → caom2-2.6.3}/caom2/tests/data/CompleteCompositePolygon-CAOM-2.2.xml +0 -0
  35. {caom2-2.6.2 → caom2-2.6.3}/caom2/tests/data/CompleteCompositePolygon-CAOM-2.3.xml +0 -0
  36. {caom2-2.6.2 → caom2-2.6.3}/caom2/tests/data/CompleteSimpleCircle-CAOM-2.2.xml +0 -0
  37. {caom2-2.6.2 → caom2-2.6.3}/caom2/tests/data/CompleteSimpleCircle-CAOM-2.3.xml +0 -0
  38. {caom2-2.6.2 → caom2-2.6.3}/caom2/tests/data/CompleteSimplePolygon-CAOM-2.2.xml +0 -0
  39. {caom2-2.6.2 → caom2-2.6.3}/caom2/tests/data/CompleteSimplePolygon-CAOM-2.3.xml +0 -0
  40. {caom2-2.6.2 → caom2-2.6.3}/caom2/tests/data/MinimalCompositeCircle-CAOM-2.2.xml +0 -0
  41. {caom2-2.6.2 → caom2-2.6.3}/caom2/tests/data/MinimalCompositeCircle-CAOM-2.3.xml +0 -0
  42. {caom2-2.6.2 → caom2-2.6.3}/caom2/tests/data/MinimalCompositePolygon-CAOM-2.2.xml +0 -0
  43. {caom2-2.6.2 → caom2-2.6.3}/caom2/tests/data/MinimalCompositePolygon-CAOM-2.3.xml +0 -0
  44. {caom2-2.6.2 → caom2-2.6.3}/caom2/tests/data/MinimalSimpleCircle-CAOM-2.2.xml +0 -0
  45. {caom2-2.6.2 → caom2-2.6.3}/caom2/tests/data/MinimalSimpleCircle-CAOM-2.3.xml +0 -0
  46. {caom2-2.6.2 → caom2-2.6.3}/caom2/tests/data/MinimalSimplePolygon-CAOM-2.2.xml +0 -0
  47. {caom2-2.6.2 → caom2-2.6.3}/caom2/tests/data/MinimalSimplePolygon-CAOM-2.3.xml +0 -0
  48. {caom2-2.6.2 → caom2-2.6.3}/caom2/tests/data/SampleComposite-CAOM-2.3.xml +0 -0
  49. {caom2-2.6.2 → caom2-2.6.3}/caom2/tests/data/SampleSimple-CAOM-2.3.xml +0 -0
  50. {caom2-2.6.2 → caom2-2.6.3}/caom2/tests/data/diff-actual-CAOM-2.4.xml +0 -0
  51. {caom2-2.6.2 → caom2-2.6.3}/caom2/tests/test_artifact.py +0 -0
  52. {caom2-2.6.2 → caom2-2.6.3}/caom2/tests/test_caom_util.py +0 -0
  53. {caom2-2.6.2 → caom2-2.6.3}/caom2/tests/test_checksum.py +0 -0
  54. {caom2-2.6.2 → caom2-2.6.3}/caom2/tests/test_chunk.py +0 -0
  55. {caom2-2.6.2 → caom2-2.6.3}/caom2/tests/test_common.py +0 -0
  56. {caom2-2.6.2 → caom2-2.6.3}/caom2/tests/test_diffs.py +0 -0
  57. {caom2-2.6.2 → caom2-2.6.3}/caom2/tests/test_observation.py +0 -0
  58. {caom2-2.6.2 → caom2-2.6.3}/caom2/tests/test_part.py +0 -0
  59. {caom2-2.6.2 → caom2-2.6.3}/caom2/tests/test_plane.py +0 -0
  60. {caom2-2.6.2 → caom2-2.6.3}/caom2/tests/test_wcs.py +0 -0
  61. {caom2-2.6.2 → caom2-2.6.3}/caom2/tests/xml_compare.py +0 -0
  62. {caom2-2.6.2 → caom2-2.6.3}/caom2/wcs.py +0 -0
  63. {caom2-2.6.2 → caom2-2.6.3}/caom2.egg-info/SOURCES.txt +0 -0
  64. {caom2-2.6.2 → caom2-2.6.3}/caom2.egg-info/dependency_links.txt +0 -0
  65. {caom2-2.6.2 → caom2-2.6.3}/caom2.egg-info/entry_points.txt +0 -0
  66. {caom2-2.6.2 → caom2-2.6.3}/caom2.egg-info/not-zip-safe +0 -0
  67. {caom2-2.6.2 → caom2-2.6.3}/caom2.egg-info/requires.txt +0 -0
  68. {caom2-2.6.2 → caom2-2.6.3}/caom2.egg-info/top_level.txt +0 -0
  69. {caom2-2.6.2 → caom2-2.6.3}/docs/Makefile +0 -0
  70. {caom2-2.6.2 → caom2-2.6.3}/docs/_templates/autosummary/base.rst +0 -0
  71. {caom2-2.6.2 → caom2-2.6.3}/docs/_templates/autosummary/class.rst +0 -0
  72. {caom2-2.6.2 → caom2-2.6.3}/docs/_templates/autosummary/module.rst +0 -0
  73. {caom2-2.6.2 → caom2-2.6.3}/docs/conf.py +0 -0
  74. {caom2-2.6.2 → caom2-2.6.3}/docs/index.rst +0 -0
  75. {caom2-2.6.2 → caom2-2.6.3}/docs/make.bat +0 -0
  76. {caom2-2.6.2 → caom2-2.6.3}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: caom2
3
- Version: 2.6.2
3
+ Version: 2.6.3
4
4
  Summary: CAOM-2.4 library
5
5
  Home-page: http://www.cadc-ccda.hia-iha.nrc-cnrc.gc.ca/caom2
6
6
  Author: Canadian Astronomy Data Centre
@@ -20,6 +20,15 @@ Requires-Dist: pytest>=4.6; extra == "test"
20
20
  Requires-Dist: pytest-cov>=2.5.1; extra == "test"
21
21
  Requires-Dist: flake8>=3.4.1; extra == "test"
22
22
  Requires-Dist: funcsigs>=1.0.2; extra == "test"
23
+ Dynamic: author
24
+ Dynamic: author-email
25
+ Dynamic: classifier
26
+ Dynamic: description
27
+ Dynamic: home-page
28
+ Dynamic: license
29
+ Dynamic: license-file
30
+ Dynamic: requires-python
31
+ Dynamic: summary
23
32
 
24
33
  caom2
25
34
  =====
@@ -150,7 +150,7 @@ class CaomObject(object):
150
150
  for arg in args])
151
151
 
152
152
  def __eq__(self, other):
153
- if type(other) == type(self):
153
+ if isinstance(other, CaomObject):
154
154
  return self.__dict__ == other.__dict__
155
155
  else:
156
156
  return False
@@ -105,7 +105,7 @@ def get_differences(expected, actual, parent=None):
105
105
  """
106
106
  report = []
107
107
 
108
- if type(expected) != type(actual):
108
+ if not isinstance(actual, expected.__class__):
109
109
  report.append(
110
110
  'Types:: expected \'{}\' actual \'{}\''.format(type(expected),
111
111
  type(actual)))
@@ -3,7 +3,7 @@
3
3
  # ****************** CANADIAN ASTRONOMY DATA CENTRE *******************
4
4
  # ************* CENTRE CANADIEN DE DONNÉES ASTRONOMIQUES **************
5
5
  #
6
- # (c) 2022. (c) 2022.
6
+ # (c) 2025. (c) 2025.
7
7
  # Government of Canada Gouvernement du Canada
8
8
  # National Research Council Conseil national de recherches
9
9
  # Ottawa, Canada, K1A 0R6 Ottawa, Canada, K1A 0R6
@@ -631,6 +631,23 @@ class ObservationReader(object):
631
631
  data_quality = plane.DataQuality(plane.Quality(flag))
632
632
  return data_quality
633
633
 
634
+ def _get_observable(self, parent, ns):
635
+ """Build an Observable object from an XML representation
636
+
637
+ Arguments:
638
+ parent : element containing the Observable element
639
+ ns : namespace of the document
640
+ return : an Observable object or None if the document does not contain one
641
+ raise : ObservationParsingException
642
+ """
643
+ el = self._get_child_element("observable", parent, ns, False)
644
+ if el is None:
645
+ return None
646
+ else:
647
+ ucd = self._get_child_text("ucd", el, ns, True)
648
+ observable = plane.Observable(plane.Ucd(ucd))
649
+ return observable
650
+
634
651
  def _get_point(self, point, ns, required):
635
652
  """Build an Point object from an XML representation
636
653
  of an Point element.
@@ -1696,6 +1713,8 @@ class ObservationReader(object):
1696
1713
  _plane.provenance = \
1697
1714
  self._get_provenance("provenance", plane_element, ns,
1698
1715
  False)
1716
+ _plane.observable = self._get_observable(plane_element, ns)
1717
+
1699
1718
  _plane.metrics = \
1700
1719
  self._get_metrics("metrics", plane_element, ns, False)
1701
1720
  _plane.quality = \
@@ -2080,6 +2099,7 @@ class ObservationWriter(object):
2080
2099
  _plane.calibration_level.value,
2081
2100
  plane_element)
2082
2101
  self._add_provenance_element(_plane.provenance, plane_element)
2102
+ self._add_observable_element(_plane.observable, plane_element)
2083
2103
  self._add_metrics_element(_plane.metrics, plane_element)
2084
2104
  self._add_quality_element(_plane.quality, plane_element)
2085
2105
 
@@ -2131,9 +2151,9 @@ class ObservationWriter(object):
2131
2151
  "Attempt to write CAOM2.4 element "
2132
2152
  "(energy.resolving_power_bands) as "
2133
2153
  "CAOM2.3 Observation")
2134
- else:
2135
- self._add_interval_element("resolvingPowerBounds",
2136
- energy.resolving_power_bounds, element)
2154
+ else:
2155
+ self._add_interval_element("resolvingPowerBounds",
2156
+ energy.resolving_power_bounds, element)
2137
2157
  self._add_element("sampleSize", energy.sample_size, element)
2138
2158
  self._add_element("bandpassName", energy.bandpass_name, element)
2139
2159
  if energy.energy_bands:
@@ -2280,6 +2300,13 @@ class ObservationWriter(object):
2280
2300
  element = self._get_caom_element("quality", parent)
2281
2301
  self._add_element("flag", quality.flag.value, element)
2282
2302
 
2303
+ def _add_observable_element(self, observable, parent):
2304
+ if observable is None:
2305
+ return
2306
+
2307
+ element = self._get_caom_element("observable", parent)
2308
+ self._add_element("ucd", observable.ucd.value, element)
2309
+
2283
2310
  def _add_transition_element(self, transition, parent):
2284
2311
  if transition is None:
2285
2312
  return
@@ -79,11 +79,9 @@ from . import caom_util
79
79
  from . import shape
80
80
  from . import wcs
81
81
  from .artifact import Artifact
82
- from .common import AbstractCaomEntity, CaomObject, ObservationURI,\
83
- VocabularyTerm, OrderedEnum
82
+ from .common import AbstractCaomEntity, CaomObject, ObservationURI, VocabularyTerm, OrderedEnum
84
83
  from .common import _CAOM_VOCAB_NS, _OBSCORE_VOCAB_NS
85
84
  import warnings
86
- from enum import Enum
87
85
  with warnings.catch_warnings():
88
86
  warnings.simplefilter('ignore')
89
87
  from aenum import Enum, extend_enum
@@ -91,7 +89,7 @@ with warnings.catch_warnings():
91
89
  __all__ = ['CalibrationLevel', 'DataProductType', 'EnergyBand',
92
90
  'PolarizationState', 'Quality', 'Plane',
93
91
  'PlaneURI', 'DataQuality', 'Metrics', 'Provenance', 'Position',
94
- 'Energy', 'Polarization', 'Time', 'Observable']
92
+ 'Energy', 'Polarization', 'Time', 'Observable', 'Ucd']
95
93
 
96
94
 
97
95
  class CalibrationLevel(Enum):
@@ -110,6 +108,14 @@ class CalibrationLevel(Enum):
110
108
  ANALYSIS_PRODUCT = int_32(4)
111
109
 
112
110
 
111
+ class Ucd(CaomObject):
112
+ """ UCD - enum of UCDs"""
113
+ _UCD_VOCAB = "https://ivoa.net/documents/UCD1+/20230125/ucd-list.txt"
114
+
115
+ def __init__(self, value):
116
+ self.value = value
117
+
118
+
113
119
  class DataProductType(OrderedEnum):
114
120
  """ DataproductType - enum of data product types"""
115
121
 
@@ -208,10 +214,11 @@ class Quality(Enum):
208
214
  JUNK = VocabularyTerm(_CAOM_VOCAB_NS, "junk", True).get_value()
209
215
 
210
216
 
211
- class Observable():
217
+ class Observable(CaomObject):
212
218
  """ Observable class"""
213
219
 
214
220
  def __init__(self, ucd):
221
+ super(Observable, self).__init__()
215
222
  self.ucd = ucd
216
223
 
217
224
  @property
@@ -220,7 +227,7 @@ class Observable():
220
227
 
221
228
  @ucd.setter
222
229
  def ucd(self, value):
223
- caom_util.type_check(value, str, 'ucd', override=False)
230
+ caom_util.type_check(value, Ucd, 'ucd', override=False)
224
231
  self._ucd = value
225
232
 
226
233
 
@@ -487,7 +494,7 @@ class Plane(AbstractCaomEntity):
487
494
 
488
495
  @observable.setter
489
496
  def observable(self, value):
490
- caom_util.type_check(value, str, 'observable')
497
+ caom_util.type_check(value, Observable, 'observable')
491
498
  self._observable = value
492
499
 
493
500
  @property