reydb 1.1.60__py3-none-any.whl → 1.1.61__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.
reydb/__init__.py CHANGED
@@ -18,7 +18,6 @@ rdb : Database methods.
18
18
  rerror : Database error methods.
19
19
  rexec : Database execute methods.
20
20
  rfile : Database file methods.
21
- rinfo : Database information methods.
22
21
  rorm : Database ORM methods.
23
22
  rparam : Database parameter methods.
24
23
  """
reydb/rall.py CHANGED
@@ -17,6 +17,5 @@ from .rdb import *
17
17
  from .rerror import *
18
18
  from .rexec import *
19
19
  from .rfile import *
20
- from .rinfo import *
21
20
  from .rorm import *
22
21
  from .rparam import *
reydb/rbuild.py CHANGED
@@ -20,7 +20,9 @@ from .rorm import DatabaseORMModel
20
20
 
21
21
 
22
22
  __all__ = (
23
+ 'DatabaseBuildSuper',
23
24
  'DatabaseBuild',
25
+ 'DatabaseBuildAsync'
24
26
  )
25
27
 
26
28
 
@@ -1283,7 +1285,6 @@ class DatabaseBuild(DatabaseBuildSuper['rdb.Database']):
1283
1285
  # Handle parameter.
1284
1286
  databases = databases or []
1285
1287
  tables = tables or []
1286
- tables_orm = tables_orm or []
1287
1288
  views = views or []
1288
1289
  views_stats = views_stats or []
1289
1290
 
@@ -1320,6 +1321,7 @@ class DatabaseBuild(DatabaseBuildSuper['rdb.Database']):
1320
1321
  issubclass(params, DatabaseORMModel)
1321
1322
  or isinstance(params, DatabaseORMModel)
1322
1323
  ):
1324
+ database = self.db.database
1323
1325
  table = params.table().name
1324
1326
 
1325
1327
  ## Exist.
@@ -1565,7 +1567,11 @@ class DatabaseBuildAsync(DatabaseBuildSuper['rdb.DatabaseAsync']):
1565
1567
  params_type = type(params)
1566
1568
 
1567
1569
  ## ORM.
1568
- if issubclass(params_type, DatabaseORMModel):
1570
+ if (
1571
+ is_instance(params)
1572
+ and isinstance(params, DatabaseORMModel)
1573
+ or issubclass(params, DatabaseORMModel)
1574
+ ):
1569
1575
  database = self.db.database
1570
1576
  table = params.table().name
1571
1577
 
reydb/rconfig.py CHANGED
@@ -9,8 +9,7 @@
9
9
  """
10
10
 
11
11
 
12
- from typing import TypedDict, TypeVar
13
- import datetime
12
+ from typing import TypedDict, TypeVar, Generic
14
13
  from datetime import (
15
14
  datetime as Datetime,
16
15
  date as Date,
@@ -24,7 +23,9 @@ from .rbase import DatabaseBase
24
23
 
25
24
 
26
25
  __all__ = (
26
+ 'DatabaseConfigSuper',
27
27
  'DatabaseConfig',
28
+ 'DatabaseConfigAsync'
28
29
  )
29
30
 
30
31
 
@@ -32,11 +33,12 @@ type ConfigValue = bool | str | int | float | list | tuple | dict | set | Dateti
32
33
  ConfigRow = TypedDict('ConfigRow', {'key': str, 'value': ConfigValue, 'type': str, 'note': str | None})
33
34
  type ConfigTable = list[ConfigRow]
34
35
  ConfigValueT = TypeVar('T', bound=ConfigValue) # Any.
36
+ DatabaseT = TypeVar('DatabaseT', 'rdb.Database', 'rdb.DatabaseAsync')
35
37
 
36
38
 
37
- class DatabaseConfig(DatabaseBase):
39
+ class DatabaseConfigSuper(DatabaseBase, Generic[DatabaseT]):
38
40
  """
39
- Database config type.
41
+ Database config super type.
40
42
  Can create database used `self.build_db` method.
41
43
 
42
44
  Examples
@@ -51,7 +53,7 @@ class DatabaseConfig(DatabaseBase):
51
53
 
52
54
  def __init__(
53
55
  self,
54
- db: 'rdb.Database',
56
+ db: DatabaseT,
55
57
  db_names: dict[str, str] | None = None
56
58
  ) -> None:
57
59
  """
@@ -73,6 +75,21 @@ class DatabaseConfig(DatabaseBase):
73
75
  self.db_names.update(db_names)
74
76
 
75
77
 
78
+ class DatabaseConfig(DatabaseConfigSuper['rdb.Database']):
79
+ """
80
+ Database config type.
81
+ Can create database used `self.build_db` method.
82
+
83
+ Examples
84
+ --------
85
+ >>> config = DatabaseConfig()
86
+ >>> config['key1'] = 1
87
+ >>> config['key2', 'note'] = 2
88
+ >>> config['key1'], config['key2']
89
+ (1, 2)
90
+ """
91
+
92
+
76
93
  def build_db(self) -> None:
77
94
  """
78
95
  Check and build database tables, by `self.db_names`.
@@ -83,26 +100,26 @@ class DatabaseConfig(DatabaseBase):
83
100
  ## Table.
84
101
  class Config(self.db.orm.Model, table=True):
85
102
  __name__ = self.db_names['config']
86
- __commment__ = 'Config data table.'
87
- create_time: datetime = self.db.orm.Field(not_null=True, field_default='CURRENT_TIMESTAMP', index_n=True, comment='Config create time.')
88
- update_time: datetime = self.db.orm.Field(field_default='CURRENT_TIMESTAMP', index_n=True, comment='Config update time.')
89
- key = self.db.orm.Field(type=self.db.orm.types.VARCHAR(50), key=True, not_null=True, comment='Config key.')
90
- value = self.db.orm.Field(type=self.db.orm.types.TEXT, not_null=True, comment='Config value.')
91
- type = self.db.orm.Field(type=self.db.orm.types.VARCHAR(50), not_null=True, comment='Config value type.')
92
- note = self.db.orm.Field(type=self.db.orm.types.VARCHAR(500), comment='Config note.')
103
+ __comment__ = 'Config data table.'
104
+ create_time: Datetime = self.db.orm.Field(not_null=True, field_default='CURRENT_TIMESTAMP', index_n=True, comment='Config create time.')
105
+ update_time: Datetime = self.db.orm.Field(field_default='CURRENT_TIMESTAMP', index_n=True, comment='Config update time.')
106
+ key: str = self.db.orm.Field(type=self.db.orm.types.VARCHAR(50), key=True, not_null=True, comment='Config key.')
107
+ value: str = self.db.orm.Field(type=self.db.orm.types.TEXT, not_null=True, comment='Config value.')
108
+ type: str = self.db.orm.Field(type=self.db.orm.types.VARCHAR(50), not_null=True, comment='Config value type.')
109
+ note: str = self.db.orm.Field(type=self.db.orm.types.VARCHAR(500), comment='Config note.')
93
110
 
94
111
  tables = [Config]
95
112
 
96
113
  ## View stats.
97
114
  views_stats = [
98
115
  {
99
- 'path': self.db_names['stats_config'],
116
+ 'path': (self.db.database, self.db_names['stats_config']),
100
117
  'items': [
101
118
  {
102
119
  'name': 'count',
103
120
  'select': (
104
121
  'SELECT COUNT(1)\n'
105
- f'FROM `{self.db_names['base']}`.`{self.db_names['base.config']}`'
122
+ f'FROM `{self.db_names['config']}`'
106
123
  ),
107
124
  'comment': 'Config count.'
108
125
  },
@@ -110,7 +127,7 @@ class DatabaseConfig(DatabaseBase):
110
127
  'name': 'last_create_time',
111
128
  'select': (
112
129
  'SELECT MAX(`create_time`)\n'
113
- f'FROM `{self.db_names['base']}`.`{self.db_names['base.config']}`'
130
+ f'FROM `{self.db_names['config']}`'
114
131
  ),
115
132
  'comment': 'Config last record create time.'
116
133
  },
@@ -118,7 +135,7 @@ class DatabaseConfig(DatabaseBase):
118
135
  'name': 'last_update_time',
119
136
  'select': (
120
137
  'SELECT MAX(`update_time`)\n'
121
- f'FROM `{self.db_names['base']}`.`{self.db_names['base.config']}`'
138
+ f'FROM `{self.db_names['config']}`'
122
139
  ),
123
140
  'comment': 'Config last record update time.'
124
141
  }
@@ -128,10 +145,9 @@ class DatabaseConfig(DatabaseBase):
128
145
  ]
129
146
 
130
147
  # Build.
131
- self.db.build.build(tables=tables, views_stats=views_stats)
148
+ self.db.build.build(tables=tables, views_stats=views_stats, skip=True)
132
149
 
133
150
 
134
- @property
135
151
  def data(self) -> ConfigTable:
136
152
  """
137
153
  Get config data table.
@@ -149,7 +165,7 @@ class DatabaseConfig(DatabaseBase):
149
165
  )
150
166
 
151
167
  # Convert.
152
- global_dict = {'datetime': datetime}
168
+ global_dict = {'datetime': Datetime}
153
169
  result = [
154
170
  {
155
171
  'key': row['key'],
@@ -191,7 +207,7 @@ class DatabaseConfig(DatabaseBase):
191
207
  if value is None:
192
208
  value = default
193
209
  else:
194
- global_dict = {'datetime': datetime}
210
+ global_dict = {'datetime': Datetime}
195
211
  value = eval(value, global_dict)
196
212
 
197
213
  return value
@@ -204,7 +220,7 @@ class DatabaseConfig(DatabaseBase):
204
220
  default_note: str | None = None
205
221
  ) -> ConfigValue | ConfigValueT:
206
222
  """
207
- Set config value.
223
+ Set config default value.
208
224
 
209
225
  Parameters
210
226
  ----------
@@ -316,7 +332,7 @@ class DatabaseConfig(DatabaseBase):
316
332
  )
317
333
 
318
334
  # Convert.
319
- global_dict = {'datetime': datetime}
335
+ global_dict = {'datetime': Datetime}
320
336
  result = result.to_dict('key', 'value')
321
337
  result = {
322
338
  key: eval(value, global_dict)
@@ -342,7 +358,7 @@ class DatabaseConfig(DatabaseBase):
342
358
  )
343
359
 
344
360
  # Convert.
345
- global_dict = {'datetime': datetime}
361
+ global_dict = {'datetime': Datetime}
346
362
  result = [
347
363
  eval(value, global_dict)
348
364
  for value in result
@@ -367,7 +383,7 @@ class DatabaseConfig(DatabaseBase):
367
383
  )
368
384
 
369
385
  # Convert.
370
- global_dict = {'datetime': datetime}
386
+ global_dict = {'datetime': Datetime}
371
387
  result = [
372
388
  eval(value, global_dict)
373
389
  for value in result
@@ -428,3 +444,374 @@ class DatabaseConfig(DatabaseBase):
428
444
  data,
429
445
  'update'
430
446
  )
447
+
448
+
449
+ class DatabaseConfigAsync(DatabaseConfigSuper['rdb.DatabaseAsync']):
450
+ """
451
+ Asynchronous database config type.
452
+ Can create database used `self.build_db` method.
453
+
454
+ Examples
455
+ --------
456
+ >>> config = DatabaseConfig()
457
+ >>> config['key1'] = 1
458
+ >>> config['key2', 'note'] = 2
459
+ >>> config['key1'], config['key2']
460
+ (1, 2)
461
+ """
462
+
463
+
464
+ async def build_db(self) -> None:
465
+ """
466
+ Asynchronous check and build database tables, by `self.db_names`.
467
+ """
468
+
469
+ # Handle parameter.
470
+
471
+ ## Table.
472
+ class Config(self.db.orm.Model, table=True):
473
+ __name__ = self.db_names['config']
474
+ __comment__ = 'Config data table.'
475
+ create_time: Datetime = self.db.orm.Field(not_null=True, field_default='CURRENT_TIMESTAMP', index_n=True, comment='Config create time.')
476
+ update_time: Datetime = self.db.orm.Field(field_default='CURRENT_TIMESTAMP', index_n=True, comment='Config update time.')
477
+ key: str = self.db.orm.Field(type=self.db.orm.types.VARCHAR(50), key=True, not_null=True, comment='Config key.')
478
+ value: str = self.db.orm.Field(type=self.db.orm.types.TEXT, not_null=True, comment='Config value.')
479
+ type: str = self.db.orm.Field(type=self.db.orm.types.VARCHAR(50), not_null=True, comment='Config value type.')
480
+ note: str = self.db.orm.Field(type=self.db.orm.types.VARCHAR(500), comment='Config note.')
481
+
482
+ tables = [Config]
483
+
484
+ ## View stats.
485
+ views_stats = [
486
+ {
487
+ 'path': (self.db.database, self.db_names['stats_config']),
488
+ 'items': [
489
+ {
490
+ 'name': 'count',
491
+ 'select': (
492
+ 'SELECT COUNT(1)\n'
493
+ f'FROM `{self.db_names['config']}`'
494
+ ),
495
+ 'comment': 'Config count.'
496
+ },
497
+ {
498
+ 'name': 'last_create_time',
499
+ 'select': (
500
+ 'SELECT MAX(`create_time`)\n'
501
+ f'FROM `{self.db_names['config']}`'
502
+ ),
503
+ 'comment': 'Config last record create time.'
504
+ },
505
+ {
506
+ 'name': 'last_update_time',
507
+ 'select': (
508
+ 'SELECT MAX(`update_time`)\n'
509
+ f'FROM `{self.db_names['config']}`'
510
+ ),
511
+ 'comment': 'Config last record update time.'
512
+ }
513
+ ]
514
+ }
515
+
516
+ ]
517
+
518
+ # Build.
519
+ await self.db.build.build(tables=tables, views_stats=views_stats, skip=True)
520
+
521
+
522
+ async def data(self) -> ConfigTable:
523
+ """
524
+ Asynchronous get config data table.
525
+
526
+ Returns
527
+ -------
528
+ Config data table.
529
+ """
530
+
531
+ # Get.
532
+ result = await self.db.execute.select(
533
+ self.db_names['config'],
534
+ ['key', 'value', 'type', 'note'],
535
+ order='IFNULL(`update_time`, `create_time`) DESC'
536
+ )
537
+
538
+ # Convert.
539
+ global_dict = {'datetime': Datetime}
540
+ result = [
541
+ {
542
+ 'key': row['key'],
543
+ 'value': eval(row['value'], global_dict),
544
+ 'note': row['note']
545
+ }
546
+ for row in result
547
+ ]
548
+
549
+ return result
550
+
551
+
552
+ async def get(self, key: str, default: ConfigValueT | None = None) -> ConfigValue | ConfigValueT:
553
+ """
554
+ Asynchronous get config value, when not exist, then return default value.
555
+
556
+ Parameters
557
+ ----------
558
+ key : Config key.
559
+ default : Config default value.
560
+
561
+ Returns
562
+ -------
563
+ Config value.
564
+ """
565
+
566
+ # Get.
567
+ where = '`key` = :key'
568
+ result = await self.db.execute.select(
569
+ self.db_names['config'],
570
+ '`value`',
571
+ where,
572
+ limit=1,
573
+ key=key
574
+ )
575
+ value = result.scalar()
576
+
577
+ # Default.
578
+ if value is None:
579
+ value = default
580
+ else:
581
+ global_dict = {'datetime': Datetime}
582
+ value = eval(value, global_dict)
583
+
584
+ return value
585
+
586
+
587
+ async def setdefault(
588
+ self,
589
+ key: str,
590
+ default: ConfigValueT | None = None,
591
+ default_note: str | None = None
592
+ ) -> ConfigValue | ConfigValueT:
593
+ """
594
+ Asynchronous set config default value.
595
+
596
+ Parameters
597
+ ----------
598
+ key : Config key.
599
+ default : Config default value.
600
+ default_note : Config default note.
601
+
602
+ Returns
603
+ -------
604
+ Config value.
605
+ """
606
+
607
+ # Set.
608
+ data = {
609
+ 'key': key,
610
+ 'value': repr(default),
611
+ 'type': type(default).__name__,
612
+ 'note': default_note
613
+ }
614
+ result = await self.db.execute.insert(
615
+ self.db_names['config'],
616
+ data,
617
+ 'ignore'
618
+ )
619
+
620
+ # Get.
621
+ if result.rowcount == 0:
622
+ default = await self.get(key)
623
+
624
+ return default
625
+
626
+
627
+ async def update(self, data: dict[str, ConfigValue] | ConfigTable) -> None:
628
+ """
629
+ Asynchronous update config values.
630
+
631
+ Parameters
632
+ ----------
633
+ data : Config update data.
634
+ - `dict[str, Any]`: Config key and value.
635
+ - `ConfigTable`: Config key and value and note.
636
+ """
637
+
638
+ # Handle parameter.
639
+ if type(data) == dict:
640
+ data = [
641
+ {
642
+ 'key': key,
643
+ 'value': repr(value),
644
+ 'type': type(value).__name__
645
+ }
646
+ for key, value in data.items()
647
+ ]
648
+ else:
649
+ data = data.copy()
650
+ for row in data:
651
+ row['value'] = repr(row['value'])
652
+ row['type'] = type(row['value']).__name__
653
+
654
+ # Update.
655
+ await self.db.execute.insert(
656
+ self.db_names['config'],
657
+ data,
658
+ 'update'
659
+ )
660
+
661
+
662
+ async def remove(self, key: str | list[str]) -> None:
663
+ """
664
+ Asynchronous remove config.
665
+
666
+ Parameters
667
+ ----------
668
+ key : Config key or key list.
669
+ """
670
+
671
+ # Remove.
672
+ if type(key) == str:
673
+ where = '`key` = :key'
674
+ limit = 1
675
+ else:
676
+ where = '`key` in :key'
677
+ limit = None
678
+ result = await self.db.execute.delete(
679
+ self.db_names['base.config'],
680
+ where,
681
+ limit=limit,
682
+ key=key
683
+ )
684
+
685
+ # Check.
686
+ if result.rowcount == 0:
687
+ throw(KeyError, key)
688
+
689
+
690
+ async def items(self) -> dict[str, ConfigValue]:
691
+ """
692
+ Asynchronous get all config keys and values.
693
+
694
+ Returns
695
+ -------
696
+ All config keys and values.
697
+ """
698
+
699
+ # Get.
700
+ result = await self.db.execute.select(
701
+ self.db_names['config'],
702
+ ['key', 'value']
703
+ )
704
+
705
+ # Convert.
706
+ global_dict = {'datetime': Datetime}
707
+ result = result.to_dict('key', 'value')
708
+ result = {
709
+ key: eval(value, global_dict)
710
+ for key, value in result.items()
711
+ }
712
+
713
+ return result
714
+
715
+
716
+ async def keys(self) -> list[str]:
717
+ """
718
+ Asynchronous get all config keys.
719
+
720
+ Returns
721
+ -------
722
+ All config keys.
723
+ """
724
+
725
+ # Get.
726
+ result = await self.db.execute.select(
727
+ self.db_names['config'],
728
+ '`key`'
729
+ )
730
+
731
+ # Convert.
732
+ global_dict = {'datetime': Datetime}
733
+ result = [
734
+ eval(value, global_dict)
735
+ for value in result
736
+ ]
737
+
738
+ return result
739
+
740
+
741
+ async def values(self) -> list[ConfigValue]:
742
+ """
743
+ Asynchronous get all config value.
744
+
745
+ Returns
746
+ -------
747
+ All config values.
748
+ """
749
+
750
+ # Get.
751
+ result = await self.db.execute.select(
752
+ self.db_names['config'],
753
+ '`value`'
754
+ )
755
+
756
+ # Convert.
757
+ global_dict = {'datetime': Datetime}
758
+ result = [
759
+ eval(value, global_dict)
760
+ for value in result
761
+ ]
762
+
763
+ return result
764
+
765
+
766
+ async def __getitem__(self, key: str) -> ConfigValue:
767
+ """
768
+ Asynchronous get config value.
769
+
770
+ Parameters
771
+ ----------
772
+ key : Config key.
773
+
774
+ Returns
775
+ -------
776
+ Config value.
777
+ """
778
+
779
+ # Get.
780
+ value = await self.get(key, Null)
781
+
782
+ # Check.
783
+ if value == Null:
784
+ throw(KeyError, key)
785
+
786
+ return value
787
+
788
+
789
+ async def __setitem__(self, key_note: str | tuple[str, str], value: ConfigValue) -> None:
790
+ """
791
+ Asynchronous set config value.
792
+
793
+ Parameters
794
+ ----------
795
+ key_note : Config key and note.
796
+ value : Config value.
797
+ """
798
+
799
+ # Handle parameter.
800
+ if type(key_note) != str:
801
+ key, note = key_note
802
+ else:
803
+ key = key_note
804
+ note = None
805
+
806
+ # Set.
807
+ data = {
808
+ 'key': key,
809
+ 'value': repr(value),
810
+ 'type': type(value).__name__,
811
+ 'note': note
812
+ }
813
+ await self.db.execute.insert(
814
+ self.db_names['config'],
815
+ data,
816
+ 'update'
817
+ )