moira-python-client 4.2.1__py3-none-any.whl → 4.3.1__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.
@@ -23,6 +23,7 @@ class Contact(Base):
23
23
  self.user = kwargs.get('user', None)
24
24
  self.name = kwargs.get('name', None)
25
25
  self._id = kwargs.get('id', None)
26
+ self.team_id = kwargs.get('team_id', None)
26
27
 
27
28
 
28
29
  class ContactManager:
@@ -2,12 +2,10 @@ from ..client import InvalidJSONError
2
2
  from ..client import ResponseStructureError
3
3
  from .base import Base
4
4
 
5
- class Subscription(Base):
6
- def __init__(self, client, tags, contacts=None, enabled=None, throttling=None, sched=None,
5
+ class SubscriptionModel(Base):
6
+ def __init__(self, tags, contacts=None, enabled=None, throttling=None, sched=None,
7
7
  ignore_warnings=False, ignore_recoverings=False, plotting=None, any_tags=False, **kwargs):
8
8
  """
9
-
10
- :param client: api client
11
9
  :param tags: list of str tags
12
10
  :param contacts: list of contact id's
13
11
  :param enabled: bool is enabled
@@ -19,8 +17,6 @@ class Subscription(Base):
19
17
  :param any_tags: bool any tags
20
18
  :param kwargs: additional parameters
21
19
  """
22
- self._client = client
23
-
24
20
  self._id = kwargs.get('id', None)
25
21
  self.tags = tags if not any_tags else []
26
22
  if not contacts:
@@ -38,32 +34,7 @@ class Subscription(Base):
38
34
  if not plotting:
39
35
  plotting = {'enabled': False, 'theme': 'light'}
40
36
  self.plotting = plotting
41
-
42
- def _send_request(self, subscription_id=None):
43
- data = {
44
- 'contacts': self.contacts,
45
- 'tags': self.tags,
46
- 'enabled': self.enabled,
47
- 'any_tags': self.any_tags,
48
- 'throttling': self.throttling,
49
- 'sched': self.sched,
50
- 'ignore_warnings': self.ignore_warnings,
51
- 'ignore_recoverings': self.ignore_recoverings,
52
- 'plotting': self.plotting
53
- }
54
-
55
- if subscription_id:
56
- data['id'] = subscription_id
57
-
58
- if subscription_id:
59
- result = self._client.put('subscription/{id}'.format(id=subscription_id), json=data)
60
- else:
61
- result = self._client.put('subscription', json=data)
62
- if 'id' not in result:
63
- raise ResponseStructureError("id doesn't exist in response", result)
64
-
65
- self._id = result['id']
66
- return self._id
37
+ self.team_id = kwargs.get('team_id', None)
67
38
 
68
39
  def disable_day(self, day):
69
40
  """
@@ -124,26 +95,6 @@ class Subscription(Base):
124
95
  'theme': 'light'
125
96
  }
126
97
 
127
- def save(self):
128
- """
129
- Save subscription
130
-
131
- :return: subscription id
132
- """
133
- if self._id:
134
- return self.update()
135
- self._send_request()
136
-
137
- def update(self):
138
- """
139
- Update subscription
140
-
141
- :return: subscription id
142
- """
143
- if not self._id:
144
- return self.save()
145
- self._send_request(self._id)
146
-
147
98
  def set_start_hour(self, hour):
148
99
  """
149
100
  Set start hour
@@ -185,6 +136,85 @@ class Subscription(Base):
185
136
  self._end_minute = minute
186
137
 
187
138
 
139
+ class Subscription(SubscriptionModel):
140
+ def __init__(self, client, tags, contacts=None, enabled=None, throttling=None, sched=None,
141
+ ignore_warnings=False, ignore_recoverings=False, plotting=None, any_tags=False, **kwargs):
142
+ """
143
+ :param client: api client
144
+ :param tags: list of str tags
145
+ :param contacts: list of contact id's
146
+ :param enabled: bool is enabled
147
+ :param throttling: bool throttling
148
+ :param sched: dict schedule
149
+ :param ignore_warnings: bool ignore warnings
150
+ :param ignore_recoverings: bool ignore recoverings
151
+ :param plotting: dict plotting settings
152
+ :param any_tags: bool any tags
153
+ :param kwargs: additional parameters
154
+ """
155
+ self._client = client
156
+
157
+ super().__init__(
158
+ tags=tags,
159
+ contacts=contacts,
160
+ enabled=enabled,
161
+ throttling=throttling,
162
+ sched=sched,
163
+ ignore_warnings=ignore_warnings,
164
+ ignore_recoverings=ignore_recoverings,
165
+ plotting=plotting,
166
+ any_tags=any_tags,
167
+ **kwargs,
168
+ )
169
+
170
+ def _send_request(self, subscription_id=None):
171
+ data = {
172
+ 'contacts': self.contacts,
173
+ 'tags': self.tags,
174
+ 'enabled': self.enabled,
175
+ 'any_tags': self.any_tags,
176
+ 'throttling': self.throttling,
177
+ 'sched': self.sched,
178
+ 'ignore_warnings': self.ignore_warnings,
179
+ 'ignore_recoverings': self.ignore_recoverings,
180
+ 'plotting': self.plotting,
181
+ 'team_id': self.team_id,
182
+ }
183
+
184
+ if subscription_id:
185
+ data['id'] = subscription_id
186
+
187
+ if subscription_id:
188
+ result = self._client.put('subscription/{id}'.format(id=subscription_id), json=data)
189
+ else:
190
+ result = self._client.put('subscription', json=data)
191
+ if 'id' not in result:
192
+ raise ResponseStructureError("id doesn't exist in response", result)
193
+
194
+ self._id = result['id']
195
+ return self._id
196
+
197
+ def save(self):
198
+ """
199
+ Save subscription
200
+
201
+ :return: subscription id
202
+ """
203
+ if self._id:
204
+ return self.update()
205
+ self._send_request()
206
+
207
+ def update(self):
208
+ """
209
+ Update subscription
210
+
211
+ :return: subscription id
212
+ """
213
+ if not self._id:
214
+ return self.save()
215
+ self._send_request(self._id)
216
+
217
+
188
218
  class SubscriptionManager:
189
219
  def __init__(self, client):
190
220
  self._client = client
@@ -0,0 +1,8 @@
1
+ from ._managers import TeamManager
2
+ from ._models import TeamModel
3
+
4
+
5
+ __all__ = [
6
+ "TeamManager",
7
+ "TeamModel",
8
+ ]
@@ -0,0 +1,96 @@
1
+ from typing import Optional
2
+
3
+ from ._models import TeamModel, UserTeams, SaveTeamResponse
4
+ from .contact import TeamContactManager
5
+ from .settings import TeamSettingsManager
6
+ from .subscription import TeamSubscriptionManager
7
+ from .user import TeamUserManager
8
+ from ...client import Client
9
+
10
+
11
+ class TeamManager:
12
+ def __init__(self, client: Client) -> None:
13
+ self._client = client
14
+ self._user = None # type: Optional[TeamUserManager]
15
+ self._settings = None # type: Optional[TeamSettingsManager]
16
+ self._subscription = None # type: Optional[TeamSubscriptionManager]
17
+ self._contact = None # type: Optional[TeamContactManager]
18
+
19
+ def get_all(self) -> UserTeams:
20
+ """Get all teams"""
21
+ response = self._client.get(self._full_path())
22
+
23
+ return UserTeams(teams=[TeamModel(**team) for team in response["teams"]])
24
+
25
+ def create(self, team: TeamModel) -> SaveTeamResponse:
26
+ """Create a new team"""
27
+ payload = {
28
+ "name": team.name,
29
+ "description": team.description,
30
+ }
31
+
32
+ response = self._client.post(self._full_path(), json=payload)
33
+
34
+ return SaveTeamResponse(**response)
35
+
36
+ def delete(self, team_id: str) -> SaveTeamResponse:
37
+ """Delete a team"""
38
+ response = self._client.delete(self._full_path(team_id))
39
+
40
+ return SaveTeamResponse(**response)
41
+
42
+ def get(self, team_id: str) -> TeamModel:
43
+ """Get a team by ID"""
44
+ response = self._client.get(self._full_path(team_id))
45
+
46
+ return TeamModel(**response)
47
+
48
+ def update(self, team_id: str, team: TeamModel) -> SaveTeamResponse:
49
+ """Update existing team"""
50
+ payload = {
51
+ "name": team.name,
52
+ "description": team.description,
53
+ }
54
+
55
+ response = self._client.put(self._full_path(team_id), json=payload)
56
+
57
+ return SaveTeamResponse(**response)
58
+
59
+ @property
60
+ def user(self) -> TeamUserManager:
61
+ """Get team user manager"""
62
+ if self._user is None:
63
+ self._user = TeamUserManager(self._client)
64
+
65
+ return self._user
66
+
67
+ @property
68
+ def settings(self) -> TeamSettingsManager:
69
+ """Get team settings manager"""
70
+ if self._settings is None:
71
+ self._settings = TeamSettingsManager(self._client)
72
+
73
+ return self._settings
74
+
75
+ @property
76
+ def subscription(self) -> TeamSubscriptionManager:
77
+ """Get team subscription manager"""
78
+ if self._subscription is None:
79
+ self._subscription = TeamSubscriptionManager(self._client)
80
+
81
+ return self._subscription
82
+
83
+ @property
84
+ def contact(self) -> TeamContactManager:
85
+ """Get team contact manager"""
86
+ if self._contact is None:
87
+ self._contact = TeamContactManager(self._client)
88
+
89
+ return self._contact
90
+
91
+ @staticmethod
92
+ def _full_path(team_id: Optional[str] = None) -> str:
93
+ if team_id is None:
94
+ return "teams"
95
+
96
+ return "teams/{team_id}".format(team_id=team_id)
@@ -0,0 +1,19 @@
1
+ from ..base import Base
2
+ from typing import List
3
+
4
+
5
+ class TeamModel(Base):
6
+ def __init__(self, description: str, name: str, **kwargs):
7
+ self.description = description
8
+ self.name = name
9
+ self._id = kwargs.get("id", None)
10
+
11
+
12
+ class UserTeams:
13
+ def __init__(self, teams: List[TeamModel]):
14
+ self.teams = teams
15
+
16
+
17
+ class SaveTeamResponse(Base):
18
+ def __init__(self, **kwargs):
19
+ self._id = kwargs.get("id")
@@ -0,0 +1,5 @@
1
+ from ._managers import TeamContactManager
2
+
3
+ __all__ = [
4
+ "TeamContactManager",
5
+ ]
@@ -0,0 +1,24 @@
1
+ from ...contact import Contact
2
+ from ....client import Client
3
+
4
+
5
+ class TeamContactManager:
6
+ def __init__(self, client: Client) -> None:
7
+ self._client = client
8
+
9
+ def create(self, team_id: str, contact: Contact) -> Contact:
10
+ """Create a new team contact"""
11
+ payload = {
12
+ "team_id": team_id,
13
+ "name": contact.name,
14
+ "type": contact.type,
15
+ "value": contact.value,
16
+ }
17
+
18
+ response = self._client.post(self._full_path(team_id), json=payload)
19
+
20
+ return Contact(**response)
21
+
22
+ @staticmethod
23
+ def _full_path(team_id: str) -> str:
24
+ return "teams/{team_id}/contacts".format(team_id=team_id)
@@ -0,0 +1,7 @@
1
+ from ._managers import TeamSettingsManager
2
+ from ._models import TeamSettings
3
+
4
+ __all__ = [
5
+ "TeamSettings",
6
+ "TeamSettingsManager",
7
+ ]
@@ -0,0 +1,23 @@
1
+ from ._models import TeamSettings
2
+ from ...contact import Contact
3
+ from ...subscription import Subscription
4
+ from ....client import Client
5
+
6
+
7
+ class TeamSettingsManager:
8
+ def __init__(self, client: Client) -> None:
9
+ self._client = client
10
+
11
+ def get(self, team_id: str) -> TeamSettings:
12
+ """Get team settings"""
13
+ response = self._client.get(self._full_path(team_id))
14
+
15
+ return TeamSettings(
16
+ contacts=[Contact(**contact) for contact in response["contacts"]],
17
+ subscriptions=[Subscription(self._client, **subscription) for subscription in response["subscriptions"]],
18
+ team_id=response["team_id"],
19
+ )
20
+
21
+ @staticmethod
22
+ def _full_path(team_id: str) -> str:
23
+ return "teams/{team_id}/settings".format(team_id=team_id)
@@ -0,0 +1,11 @@
1
+ from typing import List
2
+
3
+ from ...contact import Contact
4
+ from ...subscription import Subscription
5
+
6
+
7
+ class TeamSettings:
8
+ def __init__(self, contacts: List[Contact], subscriptions: List[Subscription], team_id: str) -> None:
9
+ self.contacts = contacts
10
+ self.subscriptions = subscriptions
11
+ self.team_id = team_id
@@ -0,0 +1,5 @@
1
+ from ._managers import TeamSubscriptionManager
2
+
3
+ __all__ = [
4
+ "TeamSubscriptionManager",
5
+ ]
@@ -0,0 +1,30 @@
1
+ from ...subscription import SubscriptionModel, Subscription
2
+ from ....client import Client
3
+
4
+
5
+ class TeamSubscriptionManager:
6
+ def __init__(self, client: Client) -> None:
7
+ self._client = client
8
+
9
+ def create(self, team_id: str, subscription: SubscriptionModel) -> Subscription:
10
+ """Create a new team subscription"""
11
+ payload = {
12
+ "team_id": team_id,
13
+ "contacts": subscription.contacts,
14
+ "tags": subscription.tags,
15
+ "enabled": subscription.enabled,
16
+ "any_tags": subscription.any_tags,
17
+ "throttling": subscription.throttling,
18
+ "sched": subscription.sched,
19
+ "ignore_warnings": subscription.ignore_warnings,
20
+ "ignore_recoverings": subscription.ignore_recoverings,
21
+ "plotting": subscription.plotting,
22
+ }
23
+
24
+ response = self._client.post(self._full_path(team_id), json=payload)
25
+
26
+ return Subscription(self._client, **response)
27
+
28
+ @staticmethod
29
+ def _full_path(team_id: str) -> str:
30
+ return "teams/{team_id}/subscriptions".format(team_id=team_id)
@@ -0,0 +1,7 @@
1
+ from ._managers import TeamUserManager
2
+ from ._models import TeamMembers
3
+
4
+ __all__ = [
5
+ "TeamMembers",
6
+ "TeamUserManager",
7
+ ]
@@ -0,0 +1,43 @@
1
+ from ._models import TeamMembers
2
+ from ....client import Client
3
+ from typing import Optional
4
+
5
+
6
+ class TeamUserManager:
7
+ def __init__(self, client: Client) -> None:
8
+ self._client = client
9
+
10
+ def get(self, team_id: str) -> TeamMembers:
11
+ """Get users of a team"""
12
+ response = self._client.get(self._full_path(team_id))
13
+
14
+ return TeamMembers(**response)
15
+
16
+ def add(self, team_id: str, members: TeamMembers) -> TeamMembers:
17
+ """Add users to a team"""
18
+ payload = {"usernames": members.usernames}
19
+
20
+ response = self._client.post(self._full_path(team_id), json=payload)
21
+
22
+ return TeamMembers(**response)
23
+
24
+ def set(self, team_id: str, members: TeamMembers) -> TeamMembers:
25
+ """Set users of a team"""
26
+ payload = {"usernames": members.usernames}
27
+
28
+ response = self._client.put(self._full_path(team_id), json=payload)
29
+
30
+ return TeamMembers(**response)
31
+
32
+ def delete(self, team_id: str, team_user_id: str) -> TeamMembers:
33
+ """Delete a user from a team"""
34
+ response = self._client.delete(self._full_path(team_id, team_user_id))
35
+
36
+ return TeamMembers(**response)
37
+
38
+ @staticmethod
39
+ def _full_path(team_id: str, team_user_id: Optional[str] = None) -> str:
40
+ if team_user_id is None:
41
+ return "teams/{team_id}/users".format(team_id=team_id)
42
+
43
+ return "teams/{team_id}/users/{team_user_id}".format(team_id=team_id, team_user_id=team_user_id)
@@ -0,0 +1,6 @@
1
+ from typing import List
2
+
3
+
4
+ class TeamMembers:
5
+ def __init__(self, usernames: List[str]) -> None:
6
+ self.usernames = usernames
moira_client/moira.py CHANGED
@@ -9,6 +9,7 @@ from .models.trigger import TriggerManager
9
9
  from .models.health import HealthManager
10
10
  from .models.config import ConfigManager
11
11
  from .models.user import UserManager
12
+ from .models.team import TeamManager
12
13
 
13
14
 
14
15
  class Moira:
@@ -34,6 +35,7 @@ class Moira:
34
35
  self._health = None
35
36
  self._config = None
36
37
  self._user = None
38
+ self._team = None
37
39
 
38
40
  @property
39
41
  def trigger(self):
@@ -145,3 +147,12 @@ class Moira:
145
147
  if not self._user:
146
148
  self._user = UserManager(self._client)
147
149
  return self._user
150
+
151
+ @property
152
+ def team(self) -> TeamManager:
153
+ """Get team manager
154
+ """
155
+ if not self._team:
156
+ self._team = TeamManager(self._client)
157
+
158
+ return self._team
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: moira-python-client
3
- Version: 4.2.1
3
+ Version: 4.3.1
4
4
  Summary: Client for Moira - Alerting system based on Graphite data
5
5
  Home-page: https://github.com/moira-alert/python-moira-client
6
6
  Author: Alexander Lukyanchenko
@@ -0,0 +1,33 @@
1
+ moira_client/__init__.py,sha256=BUWUwGU1V5wvdi5-mUXd8AJlsGyrAvFKOjs8-vkUV4o,67
2
+ moira_client/client.py,sha256=SGakaO2SB2EjsZPlfD1Dv2naIgwBr5F5QufYKm-Ro1w,4106
3
+ moira_client/moira.py,sha256=Pa3grEVhGu2gcPxWR8sdu7GGowNF3AXBYvK1nmRiZi8,3859
4
+ moira_client/models/__init__.py,sha256=K3Kcjh8F_jV703ii-QMeN9cMwqcCfbfeNF7e9MfCD1c,126
5
+ moira_client/models/base.py,sha256=cYVLxnc5PGjmUcoZRZ7AFx5f0Ij96HypJpOjpwr_D-Q,385
6
+ moira_client/models/config.py,sha256=BbsShuKhe5H0DTXkIeOndHyXbi2xW2BRP0pwoIQl4Ok,2178
7
+ moira_client/models/contact.py,sha256=-z8p32EIUfG9x8KRbUPeJR3DroOuPHfBN9pv8yq4lgI,4987
8
+ moira_client/models/event.py,sha256=pXsuU-X3i3DX89rs1wBaB7SBvw_q5dgJwLJgQFrp7vg,1375
9
+ moira_client/models/health.py,sha256=a2bGgHVVbcIJCraArjI9V-gqpwdRZ1B5SnNrsLqR6mI,1708
10
+ moira_client/models/notification.py,sha256=stk78RW0lENkBX7FHm9cTskHkz8SxdXmpcXP72XwWio,1946
11
+ moira_client/models/pattern.py,sha256=Ef8Roupkjrs8gb41vrgBwvgpgTmJU4igsU58z19LHcg,1619
12
+ moira_client/models/subscription.py,sha256=vAGuxrcTkGLtrj8D_cC_lo3EMGtAnClOXdmFfMl45E0,9050
13
+ moira_client/models/tag.py,sha256=2sDmf9CKAzzZRqQykBdR3-jKgcfo62hGO7eivI1X_sc,4336
14
+ moira_client/models/trigger.py,sha256=61Gs4blN0pcPrCEnOzpaKkA_UgeChz3Kv2qV-zXySYE,17868
15
+ moira_client/models/user.py,sha256=9zG7pbmEA9ESUWFMzvqfyLP0lqcjz1pc0n8U7mL1UMk,1767
16
+ moira_client/models/team/__init__.py,sha256=hPeciH0IcuSdo3jY7EMyYaG85faZky4VvU9BsGDpZiY,118
17
+ moira_client/models/team/_managers.py,sha256=plbYKrocnD7ae4E8K7_RtPeRjn2JXQcQaKVULw5jwIA,2991
18
+ moira_client/models/team/_models.py,sha256=swwR1g7ZlxoV_wbmbEW_ADqnnaZXJLb5fyH8utptEx0,438
19
+ moira_client/models/team/contact/__init__.py,sha256=JyUCAhv_KmTjzPz1Ej38uJdzcDvFFguemc1ZjpRs6fk,83
20
+ moira_client/models/team/contact/_managers.py,sha256=zOEL4vXnUsD76I3I4aYa9dyeqIVvlIGKN2LBu8MhOaU,679
21
+ moira_client/models/team/settings/__init__.py,sha256=IX7rZVpaKY45uB11lRwDcgumnbJnlJy2cEQkLF6qm-k,139
22
+ moira_client/models/team/settings/_managers.py,sha256=12vnS6D8LicVzW5rMV74OdIQipEqPD9Vd96BRYKukxA,791
23
+ moira_client/models/team/settings/_models.py,sha256=MWdCSiacf1p2LTsTN1yrtZ4Ga8452nhRwIUMLceRqNM,332
24
+ moira_client/models/team/subscription/__init__.py,sha256=DIQSml5LNW7NvB5MjEGK5sEsfos3jIxiul_rO8VKU-Q,93
25
+ moira_client/models/team/subscription/_managers.py,sha256=lMWyWc8jibQcjLOBAXTKtCY2mH5Gs0F8cB8fvSHU4Gg,1103
26
+ moira_client/models/team/user/__init__.py,sha256=XDgaELIXAcD8l0SBVjQ8OSaSknMd1qGJ_dRmT0VxyVI,129
27
+ moira_client/models/team/user/_managers.py,sha256=9AeMrMVjek7hsHS9mGNeX9RaK6UCV5JU6GlFDouI_b0,1458
28
+ moira_client/models/team/user/_models.py,sha256=E90MLjV4Xtbypy_LXatzJdmCy1MUs8NZfs0RlRneUsI,134
29
+ moira_python_client-4.3.1.dist-info/LICENSE,sha256=HJk93uYDrJpwAa6G3ufYfC4ZgCKH2flOtdgOv1esxgI,1062
30
+ moira_python_client-4.3.1.dist-info/METADATA,sha256=k58zTJCXroosf0-24sD2c6ezDI-q-dgTbuuUe_UXEJ0,1243
31
+ moira_python_client-4.3.1.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
32
+ moira_python_client-4.3.1.dist-info/top_level.txt,sha256=zBB6_FP28feugBNn2cLmi5nCniRPnuChI6HuXUqFdIA,13
33
+ moira_python_client-4.3.1.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.43.0)
2
+ Generator: setuptools (75.1.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,20 +0,0 @@
1
- moira_client/__init__.py,sha256=BUWUwGU1V5wvdi5-mUXd8AJlsGyrAvFKOjs8-vkUV4o,67
2
- moira_client/client.py,sha256=SGakaO2SB2EjsZPlfD1Dv2naIgwBr5F5QufYKm-Ro1w,4106
3
- moira_client/moira.py,sha256=40OmxdnUTyrhjZhDwhy9OToeZhYyMLkytB619X0p8z4,3601
4
- moira_client/models/__init__.py,sha256=K3Kcjh8F_jV703ii-QMeN9cMwqcCfbfeNF7e9MfCD1c,126
5
- moira_client/models/base.py,sha256=cYVLxnc5PGjmUcoZRZ7AFx5f0Ij96HypJpOjpwr_D-Q,385
6
- moira_client/models/config.py,sha256=BbsShuKhe5H0DTXkIeOndHyXbi2xW2BRP0pwoIQl4Ok,2178
7
- moira_client/models/contact.py,sha256=iBt9A-wOF6CVprRfUVIKeJMkZy4vxb7zuvFxdE23x0E,4936
8
- moira_client/models/event.py,sha256=pXsuU-X3i3DX89rs1wBaB7SBvw_q5dgJwLJgQFrp7vg,1375
9
- moira_client/models/health.py,sha256=a2bGgHVVbcIJCraArjI9V-gqpwdRZ1B5SnNrsLqR6mI,1708
10
- moira_client/models/notification.py,sha256=stk78RW0lENkBX7FHm9cTskHkz8SxdXmpcXP72XwWio,1946
11
- moira_client/models/pattern.py,sha256=Ef8Roupkjrs8gb41vrgBwvgpgTmJU4igsU58z19LHcg,1619
12
- moira_client/models/subscription.py,sha256=xyB8MXM6mC0VjE_2aezBnSSaFER9u4LAQ0kJuzJsxas,7891
13
- moira_client/models/tag.py,sha256=2sDmf9CKAzzZRqQykBdR3-jKgcfo62hGO7eivI1X_sc,4336
14
- moira_client/models/trigger.py,sha256=61Gs4blN0pcPrCEnOzpaKkA_UgeChz3Kv2qV-zXySYE,17868
15
- moira_client/models/user.py,sha256=9zG7pbmEA9ESUWFMzvqfyLP0lqcjz1pc0n8U7mL1UMk,1767
16
- moira_python_client-4.2.1.dist-info/LICENSE,sha256=HJk93uYDrJpwAa6G3ufYfC4ZgCKH2flOtdgOv1esxgI,1062
17
- moira_python_client-4.2.1.dist-info/METADATA,sha256=dZBENvHfgEfmaYvqZCDRl1wgvV4yBqRlONoHD32HNwA,1243
18
- moira_python_client-4.2.1.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
19
- moira_python_client-4.2.1.dist-info/top_level.txt,sha256=zBB6_FP28feugBNn2cLmi5nCniRPnuChI6HuXUqFdIA,13
20
- moira_python_client-4.2.1.dist-info/RECORD,,