lsst-felis 27.2024.2800__py3-none-any.whl → 27.2024.3000__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 lsst-felis might be problematic. Click here for more details.

felis/datamodel.py CHANGED
@@ -26,7 +26,7 @@ from __future__ import annotations
26
26
  import logging
27
27
  from collections.abc import Mapping, Sequence
28
28
  from enum import StrEnum, auto
29
- from typing import Annotated, Any, Literal, TypeAlias
29
+ from typing import Annotated, Any, TypeAlias
30
30
 
31
31
  from astropy import units as units # type: ignore
32
32
  from astropy.io.votable import ucd # type: ignore
@@ -178,7 +178,7 @@ class Column(BaseObject):
178
178
  tap_principal: int | None = Field(0, alias="tap:principal", ge=0, le=1)
179
179
  """Whether this is a TAP_SCHEMA principal column."""
180
180
 
181
- votable_arraysize: int | Literal["*"] | None = Field(None, alias="votable:arraysize")
181
+ votable_arraysize: int | str | None = Field(None, alias="votable:arraysize")
182
182
  """VOTable arraysize of the column."""
183
183
 
184
184
  tap_std: int | None = Field(0, alias="tap:std", ge=0, le=1)
@@ -711,7 +711,7 @@ class SchemaIdVisitor:
711
711
  class Schema(BaseObject):
712
712
  """Database schema model.
713
713
 
714
- This is the root object of the Felis data model.
714
+ This represents a database schema, which contains one or more tables.
715
715
  """
716
716
 
717
717
  version: SchemaVersion | str | None = None
felis/db/dialects.py CHANGED
@@ -30,11 +30,11 @@ from sqlalchemy import dialects
30
30
  from sqlalchemy.engine import Dialect
31
31
  from sqlalchemy.engine.mock import create_mock_engine
32
32
 
33
- from .sqltypes import MYSQL, ORACLE, POSTGRES, SQLITE
33
+ from .sqltypes import MYSQL, POSTGRES, SQLITE
34
34
 
35
35
  __all__ = ["get_supported_dialects", "get_dialect_module"]
36
36
 
37
- _DIALECT_NAMES = (MYSQL, POSTGRES, SQLITE, ORACLE)
37
+ _DIALECT_NAMES = (MYSQL, POSTGRES, SQLITE)
38
38
  """List of supported dialect names.
39
39
 
40
40
  This list is used to create the dialect and module dictionaries.
felis/db/sqltypes.py CHANGED
@@ -28,7 +28,7 @@ from collections.abc import Callable, Mapping
28
28
  from typing import Any
29
29
 
30
30
  from sqlalchemy import SmallInteger, types
31
- from sqlalchemy.dialects import mysql, oracle, postgresql
31
+ from sqlalchemy.dialects import mysql, postgresql
32
32
  from sqlalchemy.ext.compiler import compiles
33
33
 
34
34
  __all__ = [
@@ -49,7 +49,6 @@ __all__ = [
49
49
  ]
50
50
 
51
51
  MYSQL = "mysql"
52
- ORACLE = "oracle"
53
52
  POSTGRES = "postgresql"
54
53
  SQLITE = "sqlite"
55
54
 
@@ -88,21 +87,18 @@ def compile_tinyint(type_: Any, compiler: Any, **kwargs: Any) -> str:
88
87
 
89
88
  _TypeMap = Mapping[str, types.TypeEngine | type[types.TypeEngine]]
90
89
 
91
- boolean_map: _TypeMap = {MYSQL: mysql.BOOLEAN, ORACLE: oracle.NUMBER(1), POSTGRES: postgresql.BOOLEAN()}
90
+ boolean_map: _TypeMap = {MYSQL: mysql.BOOLEAN, POSTGRES: postgresql.BOOLEAN()}
92
91
 
93
92
  byte_map: _TypeMap = {
94
93
  MYSQL: mysql.TINYINT(),
95
- ORACLE: oracle.NUMBER(3),
96
94
  POSTGRES: postgresql.SMALLINT(),
97
95
  }
98
96
 
99
97
  short_map: _TypeMap = {
100
98
  MYSQL: mysql.SMALLINT(),
101
- ORACLE: oracle.NUMBER(5),
102
99
  POSTGRES: postgresql.SMALLINT(),
103
100
  }
104
101
 
105
- # Skip Oracle
106
102
  int_map: _TypeMap = {
107
103
  MYSQL: mysql.INTEGER(),
108
104
  POSTGRES: postgresql.INTEGER(),
@@ -110,49 +106,41 @@ int_map: _TypeMap = {
110
106
 
111
107
  long_map: _TypeMap = {
112
108
  MYSQL: mysql.BIGINT(),
113
- ORACLE: oracle.NUMBER(38, 0),
114
109
  POSTGRES: postgresql.BIGINT(),
115
110
  }
116
111
 
117
112
  float_map: _TypeMap = {
118
113
  MYSQL: mysql.FLOAT(),
119
- ORACLE: oracle.BINARY_FLOAT(),
120
114
  POSTGRES: postgresql.FLOAT(),
121
115
  }
122
116
 
123
117
  double_map: _TypeMap = {
124
118
  MYSQL: mysql.DOUBLE(),
125
- ORACLE: oracle.BINARY_DOUBLE(),
126
119
  POSTGRES: postgresql.DOUBLE_PRECISION(),
127
120
  }
128
121
 
129
122
  char_map: _TypeMap = {
130
123
  MYSQL: mysql.CHAR,
131
- ORACLE: oracle.CHAR,
132
124
  POSTGRES: postgresql.CHAR,
133
125
  }
134
126
 
135
127
  string_map: _TypeMap = {
136
128
  MYSQL: mysql.VARCHAR,
137
- ORACLE: oracle.VARCHAR2,
138
129
  POSTGRES: postgresql.VARCHAR,
139
130
  }
140
131
 
141
132
  unicode_map: _TypeMap = {
142
133
  MYSQL: mysql.NVARCHAR,
143
- ORACLE: oracle.NVARCHAR2,
144
134
  POSTGRES: postgresql.VARCHAR,
145
135
  }
146
136
 
147
137
  text_map: _TypeMap = {
148
138
  MYSQL: mysql.LONGTEXT,
149
- ORACLE: oracle.CLOB,
150
139
  POSTGRES: postgresql.TEXT,
151
140
  }
152
141
 
153
142
  binary_map: _TypeMap = {
154
143
  MYSQL: mysql.LONGBLOB,
155
- ORACLE: oracle.BLOB,
156
144
  POSTGRES: postgresql.BYTEA,
157
145
  }
158
146
 
felis/tap.py CHANGED
@@ -24,6 +24,7 @@
24
24
  from __future__ import annotations
25
25
 
26
26
  import logging
27
+ import re
27
28
  from collections.abc import Iterable, MutableMapping
28
29
  from typing import Any
29
30
 
@@ -125,7 +126,7 @@ def init_tables(
125
126
  arraysize = Column(String(10))
126
127
  xtype = Column(String(SIMPLE_FIELD_LENGTH))
127
128
  # Size is deprecated
128
- # size = Column(Integer(), quote=True)
129
+ size = Column("size", Integer(), quote=True)
129
130
  description = Column(String(TEXT_FIELD_LENGTH))
130
131
  utype = Column(String(SIMPLE_FIELD_LENGTH))
131
132
  unit = Column(String(SIMPLE_FIELD_LENGTH))
@@ -406,12 +407,28 @@ class TapLoadingVisitor:
406
407
  felis_type = FelisType.felis_type(felis_datatype.value)
407
408
  column.datatype = column_obj.votable_datatype or felis_type.votable_name
408
409
 
409
- arraysize = None
410
- if felis_type.is_sized:
411
- arraysize = column_obj.votable_arraysize or column_obj.length or "*"
412
- if felis_type.is_timestamp:
413
- arraysize = column_obj.votable_arraysize or "*"
414
- column.arraysize = arraysize
410
+ column.arraysize = column_obj.votable_arraysize or column_obj.length
411
+ if (felis_type.is_timestamp or column_obj.datatype == "text") and column.arraysize is None:
412
+ column.arraysize = "*"
413
+
414
+ def _is_int(s: str) -> bool:
415
+ try:
416
+ int(s)
417
+ return True
418
+ except ValueError:
419
+ return False
420
+
421
+ # Handle the deprecated size attribute
422
+ arraysize = column_obj.votable_arraysize
423
+ if arraysize is not None and arraysize != "":
424
+ if isinstance(arraysize, int):
425
+ column.size = arraysize
426
+ elif _is_int(arraysize):
427
+ column.size = int(arraysize)
428
+ elif bool(re.match(r"^[0-9]+\*$", arraysize)):
429
+ column.size = int(arraysize.replace("*", ""))
430
+ if column.size is not None:
431
+ logger.debug(f"Set size to {column.size} for {column.column_name} from arraysize {arraysize}")
415
432
 
416
433
  column.xtype = column_obj.votable_xtype
417
434
  column.description = column_obj.description
felis/version.py CHANGED
@@ -1,2 +1,2 @@
1
1
  __all__ = ["__version__"]
2
- __version__ = "27.2024.2800"
2
+ __version__ = "27.2024.3000"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: lsst-felis
3
- Version: 27.2024.2800
3
+ Version: 27.2024.3000
4
4
  Summary: A vocabulary for describing catalogs and acting on those descriptions
5
5
  Author-email: Rubin Observatory Data Management <dm-admin@lists.lsst.org>
6
6
  License: GNU General Public License v3 or later (GPLv3+)
@@ -0,0 +1,21 @@
1
+ felis/__init__.py,sha256=THmRg3ylB4E73XhFjJX7YlnV_CM3lr_gZO_HqQFzIQ4,937
2
+ felis/cli.py,sha256=i5FlA9OBecqHP4SISngaveQ7YbWH8pxRGHeOzMOOMyg,14086
3
+ felis/datamodel.py,sha256=vvktocPqJ3SqPXTtYZ_JE9JuP34657-XlXLfOPg_QvE,26520
4
+ felis/metadata.py,sha256=8r2LM86kdJLSuI0_t--oE3OtRPf-s5aH3FeIDDDAPZ8,13414
5
+ felis/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
+ felis/tap.py,sha256=pyLHBWzXCw4F1wDbQiyxyJYPQcye4It2yRuVFoQQK5I,21746
7
+ felis/types.py,sha256=m80GSGfNHQ3-NzRuTzKOyRXLJboPxdk9kzpp1SO8XdY,5510
8
+ felis/version.py,sha256=SUmRuZYe-__IIcDzR7okIYXuK8vDY9fWnke_sK6YOz4,55
9
+ felis/db/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
+ felis/db/dialects.py,sha256=x9ehMbW6OW-v18lwf3v614zdykhTZv0I1a0_gI_ojB0,3510
11
+ felis/db/sqltypes.py,sha256=UNxKCRQU-pAIIGbrXcKUkx6-JwPGqxeqd_fLyN9Oyog,11053
12
+ felis/db/utils.py,sha256=_vWVsPsq_kVl-WQuDeoLY3ZxElGCCEzPp3tfBTENGB8,10200
13
+ felis/db/variants.py,sha256=o5m101upQQbWZD_l8qlB8gt-ZQ9-VqsWZrmxQO1eEQA,5246
14
+ lsst_felis-27.2024.3000.dist-info/COPYRIGHT,sha256=vJAFLFTSF1mhy9eIuA3P6R-3yxTWKQgpig88P-1IzRw,129
15
+ lsst_felis-27.2024.3000.dist-info/LICENSE,sha256=jOtLnuWt7d5Hsx6XXB2QxzrSe2sWWh3NgMfFRetluQM,35147
16
+ lsst_felis-27.2024.3000.dist-info/METADATA,sha256=K9MvbIiUxcXP5SJn75HCLZx4fShI9MLtMZnlRlzO3mQ,1288
17
+ lsst_felis-27.2024.3000.dist-info/WHEEL,sha256=Wyh-_nZ0DJYolHNn1_hMa4lM7uDedD_RGVwbmTjyItk,91
18
+ lsst_felis-27.2024.3000.dist-info/entry_points.txt,sha256=Gk2XFujA_Gp52VBk45g5kim8TDoMDJFPctsMqiq72EM,40
19
+ lsst_felis-27.2024.3000.dist-info/top_level.txt,sha256=F4SvPip3iZRVyISi50CHhwTIAokAhSxjWiVcn4IVWRI,6
20
+ lsst_felis-27.2024.3000.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
21
+ lsst_felis-27.2024.3000.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (70.3.0)
2
+ Generator: setuptools (71.1.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,21 +0,0 @@
1
- felis/__init__.py,sha256=THmRg3ylB4E73XhFjJX7YlnV_CM3lr_gZO_HqQFzIQ4,937
2
- felis/cli.py,sha256=i5FlA9OBecqHP4SISngaveQ7YbWH8pxRGHeOzMOOMyg,14086
3
- felis/datamodel.py,sha256=BajYwp2rk0j3P4KSc2T9Acnk9p9pjzXiKgZG2c_OuZI,26517
4
- felis/metadata.py,sha256=8r2LM86kdJLSuI0_t--oE3OtRPf-s5aH3FeIDDDAPZ8,13414
5
- felis/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
- felis/tap.py,sha256=YBWl1CicdN4jW_KhPJQ7-TuhOfFFTIYIH4tTJ8P_o1c,21035
7
- felis/types.py,sha256=m80GSGfNHQ3-NzRuTzKOyRXLJboPxdk9kzpp1SO8XdY,5510
8
- felis/version.py,sha256=yUl4M-EIGpU6iDSDVfXNp4Wf1kDc1_9Neo9VCBg7Ph8,55
9
- felis/db/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
- felis/db/dialects.py,sha256=IsjdD_2n7tucUdR7TMyRd2gWtnD-2kXPAJUUQdbUe_Q,3526
11
- felis/db/sqltypes.py,sha256=VuBfstnBGOnr0RuSN0XhzXjSr2MaAmgJWuiWuf_7g2A,11418
12
- felis/db/utils.py,sha256=_vWVsPsq_kVl-WQuDeoLY3ZxElGCCEzPp3tfBTENGB8,10200
13
- felis/db/variants.py,sha256=o5m101upQQbWZD_l8qlB8gt-ZQ9-VqsWZrmxQO1eEQA,5246
14
- lsst_felis-27.2024.2800.dist-info/COPYRIGHT,sha256=vJAFLFTSF1mhy9eIuA3P6R-3yxTWKQgpig88P-1IzRw,129
15
- lsst_felis-27.2024.2800.dist-info/LICENSE,sha256=jOtLnuWt7d5Hsx6XXB2QxzrSe2sWWh3NgMfFRetluQM,35147
16
- lsst_felis-27.2024.2800.dist-info/METADATA,sha256=B5KUETflTJuITLE5h9ljJ6aDsA9mtlHemnxJfi7StW4,1288
17
- lsst_felis-27.2024.2800.dist-info/WHEEL,sha256=Z4pYXqR_rTB7OWNDYFOm1qRk0RX6GFP2o8LgvP453Hk,91
18
- lsst_felis-27.2024.2800.dist-info/entry_points.txt,sha256=Gk2XFujA_Gp52VBk45g5kim8TDoMDJFPctsMqiq72EM,40
19
- lsst_felis-27.2024.2800.dist-info/top_level.txt,sha256=F4SvPip3iZRVyISi50CHhwTIAokAhSxjWiVcn4IVWRI,6
20
- lsst_felis-27.2024.2800.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
21
- lsst_felis-27.2024.2800.dist-info/RECORD,,