vortexpy 4.0.7__tar.gz → 4.0.10__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 (93) hide show
  1. {vortexpy-4.0.7 → vortexpy-4.0.10}/PKG-INFO +1 -1
  2. {vortexpy-4.0.7 → vortexpy-4.0.10}/pyproject.toml +1 -1
  3. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/__init__.py +1 -1
  4. vortexpy-4.0.10/vortex/event_bus/TupleChangeEventABC.py +15 -0
  5. {vortexpy-4.0.7/vortex/handler → vortexpy-4.0.10/vortex/event_bus}/TupleChangeEventBus.py +78 -42
  6. vortexpy-4.0.10/vortex/event_bus/TupleChangeEventBusObserverABC.py +11 -0
  7. vortexpy-4.0.10/vortex/storage/__init__.py +0 -0
  8. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortexpy.egg-info/PKG-INFO +1 -1
  9. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortexpy.egg-info/SOURCES.txt +4 -2
  10. vortexpy-4.0.7/vortex/handler/TupleChangeEventBusObserverABC.py +0 -12
  11. {vortexpy-4.0.7 → vortexpy-4.0.10}/LICENSE +0 -0
  12. {vortexpy-4.0.7 → vortexpy-4.0.10}/README.md +0 -0
  13. {vortexpy-4.0.7 → vortexpy-4.0.10}/setup.cfg +0 -0
  14. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/DataWrapTuple.py +0 -0
  15. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/DeferUtil.py +0 -0
  16. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/Jsonable.py +0 -0
  17. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/Payload.py +0 -0
  18. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/PayloadEndpoint.py +0 -0
  19. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/PayloadEndpointTest.py +0 -0
  20. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/PayloadEnvelope.py +0 -0
  21. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/PayloadFilterKeys.py +0 -0
  22. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/PayloadIO.py +0 -0
  23. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/PayloadPriority.py +0 -0
  24. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/PayloadResponse.py +0 -0
  25. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/PayloadResponseTest.py +0 -0
  26. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/PayloadTest.py +0 -0
  27. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/PerformTestActionTuple.py +0 -0
  28. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/SerialiseUtil.py +0 -0
  29. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/TestTuple.py +0 -0
  30. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/Tuple.py +0 -0
  31. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/TupleAction.py +0 -0
  32. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/TupleActionVortex.py +0 -0
  33. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/TupleDataForTest.py +0 -0
  34. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/TuplePerfTest.py +0 -0
  35. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/TuplePolymorphicTupleTypeFieldArgTest.py +0 -0
  36. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/TupleRestfulTest.py +0 -0
  37. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/TupleSelector.py +2 -2
  38. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/TupleTest.py +0 -0
  39. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/VortexABC.py +0 -0
  40. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/VortexClientHttp.py +0 -0
  41. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/VortexClientHttpTest.py +0 -0
  42. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/VortexClientTcp.py +0 -0
  43. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/VortexClientWebsocketFactory.py +0 -0
  44. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/VortexConnectionABC.py +0 -0
  45. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/VortexFactory.py +0 -0
  46. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/VortexPayloadProtocol.py +0 -0
  47. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/VortexServer.py +0 -0
  48. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/VortexServerConnection.py +0 -0
  49. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/VortexServerHttpResource.py +0 -0
  50. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/VortexServerTcp.py +0 -0
  51. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/VortexServerWebsocket.py +0 -0
  52. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/VortexTcpMemoryLeakPayloadTest.py +0 -0
  53. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/VortexTcpMemoryLeakRawTest.py +0 -0
  54. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/VortexTest.py +0 -0
  55. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/VortexUtil.py +0 -0
  56. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/VortexWritePushProducer.py +0 -0
  57. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/data_loader/TupleDataLiveLockManager.py +0 -0
  58. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/data_loader/TupleDataLoader.py +0 -0
  59. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/data_loader/TupleDataLoaderDelegate.py +0 -0
  60. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/data_loader/TupleDataLoaderTupleABC.py +0 -0
  61. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/data_loader/TupleDataLoaderTuples.py +0 -0
  62. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/data_loader/__init__.py +0 -0
  63. {vortexpy-4.0.7/vortex/handler → vortexpy-4.0.10/vortex/event_bus}/__init__.py +0 -0
  64. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/handler/TupleActionProcessor.py +0 -0
  65. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/handler/TupleActionProcessorProxy.py +0 -0
  66. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/handler/TupleActionProcessorTestHandler.py +0 -0
  67. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/handler/TupleDataActionClient.py +0 -0
  68. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/handler/TupleDataObservableCache.py +0 -0
  69. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/handler/TupleDataObservableHandler.py +0 -0
  70. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/handler/TupleDataObservableProxyHandler.py +0 -0
  71. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/handler/TupleDataObservableTestHandler.py +0 -0
  72. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/handler/TupleDataObserverClient.py +0 -0
  73. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/handler/VortexJSTupleLoaderTestHandler.py +0 -0
  74. {vortexpy-4.0.7/vortex/restful → vortexpy-4.0.10/vortex/handler}/__init__.py +0 -0
  75. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/restful/GzippedDataHttpClient.py +0 -0
  76. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/restful/GzippedDataHttpClientTest.py +0 -0
  77. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/restful/GzippedPayloadHttpClient.py +0 -0
  78. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/restful/RestfulHttpClient.py +0 -0
  79. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/restful/RestfulHttpClientTest.py +0 -0
  80. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/restful/RestfulResource.py +0 -0
  81. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/restful/RestfulResourceTest.py +0 -0
  82. {vortexpy-4.0.7/vortex/rpc → vortexpy-4.0.10/vortex/restful}/__init__.py +0 -0
  83. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/rpc/RPC.py +0 -0
  84. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/rpc/RPCTest.py +0 -0
  85. {vortexpy-4.0.7/vortex/sqla_orm → vortexpy-4.0.10/vortex/rpc}/__init__.py +0 -0
  86. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/sqla_orm/OrmCrudHandler.py +0 -0
  87. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/sqla_orm/TupleProviderForDb.py +0 -0
  88. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/sqla_orm/VortexTupleJson.py +0 -0
  89. {vortexpy-4.0.7/vortex/storage → vortexpy-4.0.10/vortex/sqla_orm}/__init__.py +0 -0
  90. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortex/storage/TupleStorageSqlite.py +0 -0
  91. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortexpy.egg-info/dependency_links.txt +0 -0
  92. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortexpy.egg-info/requires.txt +0 -0
  93. {vortexpy-4.0.7 → vortexpy-4.0.10}/vortexpy.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: vortexpy
3
- Version: 4.0.7
3
+ Version: 4.0.10
4
4
  Summary: Synertys observable, routable, data serialisation and transport code.
5
5
  Author-email: Synerty <contact@synerty.com>
6
6
  Project-URL: Homepage, https://github.com/Synerty/vortexpy
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "vortexpy"
7
- version = "4.0.7"
7
+ version = "4.0.10"
8
8
  authors = [{name = "Synerty", email = "contact@synerty.com"}]
9
9
  description = "Synertys observable, routable, data serialisation and transport code."
10
10
  keywords = [
@@ -7,4 +7,4 @@
7
7
  * Support : support@synerty.com
8
8
  """
9
9
 
10
- __version__ = '4.0.7'
10
+ __version__ = '4.0.10'
@@ -0,0 +1,15 @@
1
+ import json
2
+ from abc import ABCMeta
3
+
4
+
5
+ class TupleChangeEventABC(metaclass=ABCMeta):
6
+ __eventType__ = None
7
+
8
+ @classmethod
9
+ def eventType(cls) -> str:
10
+ return cls.__eventType__
11
+
12
+ def __repr__(self):
13
+ return json.dumps(
14
+ {"class": self.__class__.__name__, "fields": self.__dict__}
15
+ )
@@ -8,12 +8,9 @@ import pytz
8
8
  from twisted.internet import reactor
9
9
  from twisted.internet.defer import inlineCallbacks
10
10
 
11
- from vortex.Tuple import Tuple
12
- from vortex.TupleSelector import (
13
- TupleSelector,
14
- InvalidTupleSelectorNameException,
15
- )
16
- from vortex.handler.TupleChangeEventBusObserverABC import (
11
+ from vortex.TupleSelector import TupleSelector
12
+ from vortex.event_bus.TupleChangeEventABC import TupleChangeEventABC
13
+ from vortex.event_bus.TupleChangeEventBusObserverABC import (
17
14
  TupleChangeEventBusObserverABC,
18
15
  )
19
16
 
@@ -22,7 +19,7 @@ logger = logging.getLogger(__name__)
22
19
 
23
20
  class TupleChangeEventBus:
24
21
  def __init__(self):
25
- self._weakObserversForAllTupleSelectorNames: WeakSet[
22
+ self._weakObserversForAllTupleChangeEventABCNames: WeakSet[
26
23
  TupleChangeEventBusObserverABC
27
24
  ] = WeakSet([])
28
25
 
@@ -30,11 +27,11 @@ class TupleChangeEventBus:
30
27
  str, WeakSet[TupleChangeEventBusObserverABC]
31
28
  ] = defaultdict(lambda: WeakSet([]))
32
29
 
33
- def notifyMany(self, tupleSelectors: list[TupleSelector]) -> None:
34
- for tupleSelector in tupleSelectors:
35
- self.notify(tupleSelector)
30
+ def notifyMany(self, events: list[TupleChangeEventABC]) -> None:
31
+ for event in events:
32
+ self.notify(event)
36
33
 
37
- def notify(self, tupleSelector: TupleSelector) -> None:
34
+ def notify(self, event: TupleChangeEventABC) -> None:
38
35
  """
39
36
  Notify
40
37
 
@@ -49,7 +46,8 @@ class TupleChangeEventBus:
49
46
  however, see best practices.
50
47
 
51
48
  BEST PRACTICE: Only notify the bus of precisely
52
- the data that has changed, as close to the code that changes it as possible.
49
+ the data that has changed, as close to the code that changes it as
50
+ possible.
53
51
 
54
52
  Do not notify the bus of tuple selectors that need updating.
55
53
 
@@ -60,8 +58,8 @@ class TupleChangeEventBus:
60
58
 
61
59
  For example. If you have two tuple selectors:
62
60
 
63
- 1) TupleSelector(MyTuple, {id:1})
64
- 2) TupleSelector(ListOfMyTuples)
61
+ 1) TupleChangeEventABC(MyTuple, {id:1})
62
+ 2) TupleChangeEventABC(ListOfMyTuples)
65
63
 
66
64
  TupleChangeEventBus.notify should be called for MyTuple
67
65
  just after changes are committed.
@@ -72,11 +70,11 @@ class TupleChangeEventBus:
72
70
  A typical observer's method might look like this:
73
71
 
74
72
  ```python
75
- def notifyFromBus(self, tupleSelector: TupleSelector) -> None:
76
- if tupleSelector.isForTuple(MyTuple):
77
- self.tupleDataObservable.notifyOfTupleUpdate(tupleSelector)
73
+ def notifyFromBus(self, event: TupleChangeEventABC) -> None:
74
+ if event.isForTuple(MyTuple):
75
+ self.tupleDataObservable.notifyOfTupleUpdate(event)
78
76
  self.tupleDataObservable.notifyOfTupleUpdate(
79
- TupleSelector(ListOfMyTuples)
77
+ TupleChangeEventABC(ListOfMyTuples)
80
78
  )
81
79
  return
82
80
 
@@ -84,73 +82,111 @@ class TupleChangeEventBus:
84
82
 
85
83
  ```
86
84
 
87
- :param tupleSelector: The tuple selector that describes the tuple
85
+ :param event: The tuple selector that describes the tuple
88
86
  that has been changed. This change might be created, updated, or
89
87
  deleted.
90
88
  :return:
91
89
  """
92
- weakSets = [self._weakObserversForAllTupleSelectorNames]
90
+ weakSets = [self._weakObserversForAllTupleChangeEventABCNames]
93
91
 
94
- if tupleSelector.name in self._weakObserversBySelectorName:
95
- weakSets.append(
96
- self._weakObserversBySelectorName[tupleSelector.name]
97
- )
92
+ eventName = event.eventType()
93
+
94
+ if eventName in self._weakObserversBySelectorName:
95
+ weakSets.append(list(self._weakObserversBySelectorName[eventName]))
98
96
 
99
97
  for weakSet in weakSets:
100
98
  for item in weakSet:
101
99
  if not item:
102
100
  continue
103
101
 
104
- reactor.callLater(0, self._notify, item, tupleSelector)
102
+ # noinspection PyUnresolvedReferences
103
+ reactor.callLater(0, self._notify, item, event)
105
104
 
106
105
  @inlineCallbacks
107
- def _notify(self, observable, tupleSelector):
106
+ def _notify(
107
+ self,
108
+ observable: TupleChangeEventBusObserverABC,
109
+ event: TupleChangeEventABC,
110
+ ):
108
111
  try:
109
112
  startDate = datetime.now(pytz.utc)
110
- yield observable.notifyFromBus(tupleSelector)
113
+ yield observable.notifyFromBus(event)
111
114
 
112
115
  # A blocking call taking more than 100ms is BAD
113
116
  # Otherwise a call taking more than a 1s is just poor performance.
114
117
  secondsTaken = (datetime.now(pytz.utc) - startDate).total_seconds()
115
118
  if 0.1 < secondsTaken:
116
119
  logger.debug(
117
- "notifyFromBus took %s for %s, tupleSelector %s",
120
+ "notifyFromBus took %s for %s, event %s",
118
121
  secondsTaken,
119
122
  observable.__class__.__name__,
120
- tupleSelector.toJsonStr(),
123
+ event,
121
124
  )
122
125
 
123
126
  except Exception as e:
124
127
  logger.error(
125
- "Observable %s raised an error when being called with tupleSelector %s",
128
+ "Observable %s raised an error"
129
+ " when being called with event %s",
126
130
  observable.__class__.__name__,
127
- tupleSelector,
131
+ event,
128
132
  )
129
133
  logger.exception(e)
130
134
 
131
135
  def addObserver(
132
136
  self,
133
137
  observer: TupleChangeEventBusObserverABC,
134
- tupleSelectorNameOrClass: Optional[
135
- Union[str, Type[Tuple], Tuple]
138
+ eventNameOrClass: Optional[
139
+ Union[
140
+ str,
141
+ Type[TupleChangeEventABC],
142
+ TupleChangeEventABC,
143
+ ]
136
144
  ] = None,
137
145
  ) -> None:
138
146
  assert isinstance(
139
147
  observer, TupleChangeEventBusObserverABC
140
148
  ), "observer must be a TupleChangeEventBusObserverABC"
141
149
 
142
- if tupleSelectorNameOrClass is None:
143
- self._weakObserversForAllTupleSelectorNames.add(observer)
150
+ if eventNameOrClass is None:
151
+ self._weakObserversForAllTupleChangeEventABCNames.add(observer)
144
152
  return
145
153
 
146
- try:
147
- tupleSelectorName = TupleSelector.nameFromTuple(
148
- tupleSelectorNameOrClass
154
+ eventName = self._nameFromEvent(eventNameOrClass)
155
+
156
+ self._weakObserversBySelectorName[eventName].add(observer)
157
+
158
+ # noinspection PyMethodMayBeStatic
159
+ def _nameFromEvent(
160
+ self,
161
+ nameOrTuple: Optional[
162
+ Union[str, Type[TupleChangeEventABC], TupleChangeEventABC]
163
+ ],
164
+ ) -> Optional[str]:
165
+ # When the TupleSelector is reconstructed / deserialize,
166
+ # it's constructed with
167
+ # no arguments
168
+ if nameOrTuple is None:
169
+ return None
170
+
171
+ if isinstance(nameOrTuple, str):
172
+ name = nameOrTuple
173
+
174
+ elif isinstance(nameOrTuple, TupleChangeEventABC):
175
+ name = nameOrTuple.eventType()
176
+
177
+ elif issubclass(nameOrTuple, TupleChangeEventABC):
178
+ name = nameOrTuple.eventType()
179
+
180
+ else:
181
+ raise Exception(
182
+ "Argument should be of type "
183
+ "Union[str, Type[TupleChangeEventABC], TupleChangeEventABC]"
149
184
  )
150
- except InvalidTupleSelectorNameException:
185
+
186
+ if name == TupleSelector.tupleName():
151
187
  raise Exception(
152
- "tupleSelectorNameOrClass is not valid."
153
- " Maybe you need to add __tupleType__ to your custom TupleSelector class."
188
+ "We've found the name of TupleSelector.tupleType(),"
189
+ "which means we've been passed a TupleSelector."
154
190
  )
155
191
 
156
- self._weakObserversBySelectorName[tupleSelectorName].add(observer)
192
+ return name
@@ -0,0 +1,11 @@
1
+ from abc import ABCMeta, abstractmethod
2
+
3
+ from vortex.event_bus.TupleChangeEventABC import TupleChangeEventABC
4
+
5
+
6
+ class TupleChangeEventBusObserverABC(metaclass=ABCMeta):
7
+ @abstractmethod
8
+ def notifyFromBus(self, event: TupleChangeEventABC) -> None:
9
+ raise NotImplementedError(
10
+ "TupleChangeEventBusObserverABC.notifyFromBus"
11
+ )
File without changes
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: vortexpy
3
- Version: 4.0.7
3
+ Version: 4.0.10
4
4
  Summary: Synertys observable, routable, data serialisation and transport code.
5
5
  Author-email: Synerty <contact@synerty.com>
6
6
  Project-URL: Homepage, https://github.com/Synerty/vortexpy
@@ -52,11 +52,13 @@ vortex/data_loader/TupleDataLoaderDelegate.py
52
52
  vortex/data_loader/TupleDataLoaderTupleABC.py
53
53
  vortex/data_loader/TupleDataLoaderTuples.py
54
54
  vortex/data_loader/__init__.py
55
+ vortex/event_bus/TupleChangeEventABC.py
56
+ vortex/event_bus/TupleChangeEventBus.py
57
+ vortex/event_bus/TupleChangeEventBusObserverABC.py
58
+ vortex/event_bus/__init__.py
55
59
  vortex/handler/TupleActionProcessor.py
56
60
  vortex/handler/TupleActionProcessorProxy.py
57
61
  vortex/handler/TupleActionProcessorTestHandler.py
58
- vortex/handler/TupleChangeEventBus.py
59
- vortex/handler/TupleChangeEventBusObserverABC.py
60
62
  vortex/handler/TupleDataActionClient.py
61
63
  vortex/handler/TupleDataObservableCache.py
62
64
  vortex/handler/TupleDataObservableHandler.py
@@ -1,12 +0,0 @@
1
- from abc import ABCMeta, abstractmethod
2
-
3
- from vortex.TupleSelector import TupleSelector
4
-
5
-
6
- class TupleChangeEventBusObserverABC(metaclass=ABCMeta):
7
- @abstractmethod
8
- def notifyFromBus(
9
- self,
10
- tupleSelector: TupleSelector,
11
- ) -> None:
12
- pass
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -52,10 +52,10 @@ class TupleSelector(Tuple):
52
52
  if isinstance(nameOrTuple, str):
53
53
  name = nameOrTuple
54
54
 
55
- elif issubclass(nameOrTuple, Tuple):
55
+ elif isinstance(nameOrTuple, Tuple):
56
56
  name = nameOrTuple.tupleType()
57
57
 
58
- elif isinstance(nameOrTuple, Tuple):
58
+ elif issubclass(nameOrTuple, Tuple):
59
59
  name = nameOrTuple.tupleType()
60
60
 
61
61
  else:
File without changes
File without changes
File without changes
File without changes
File without changes