-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathresponse.py
More file actions
280 lines (218 loc) · 5.84 KB
/
response.py
File metadata and controls
280 lines (218 loc) · 5.84 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
from dataclasses import dataclass
from typing import List, Optional
from dataclasses_json import DataClassJsonMixin, dataclass_json
@dataclass_json
@dataclass
class AdFormats:
metric: str
generic: int
unknown: int
vendorSpecific: int
@dataclass_json
@dataclass
class Channels:
deprecated: int
metric: str
modeled: int
unknown: int
@dataclass_json
@dataclass
class BaseMetric:
metric: str
modeled: int
unknown: int
verifiedRate: Optional[float] = None
@dataclass_json
@dataclass
class TotalMetric:
metric: str
modeled: int
skipped: int
@dataclass_json
@dataclass
class Coverage:
totalImpressions: TotalMetric
totalRows: TotalMetric
adFormats: Optional[AdFormats] = None
channels: Optional[Channels] = None
mediaOwners: Optional[BaseMetric] = None
properties: Optional[BaseMetric] = None
sellers: Optional[BaseMetric] = None
@dataclass_json
@dataclass
class Policy:
compliant: int
noncompliant: int
policy: str
policyOwner: str
@dataclass_json
@dataclass
class RowPolicy:
compliant: bool
policy: str
policyOwner: str
@dataclass_json
@dataclass
class EmissionsTotals:
adSelection: Optional[float] = None
compensated: Optional[float] = None
creativeDelivery: Optional[float] = None
disposal: Optional[float] = None
mediaDistribution: Optional[float] = None
techManipulation: Optional[float] = None
@dataclass_json
@dataclass
class EmissionsBreakdown:
framework: str
totals: EmissionsTotals
@dataclass_json
@dataclass
class AdFormatCoverage:
name: str
value: str
vendor: Optional[str] = None
verified: Optional[bool] = None
@dataclass_json
@dataclass
class SimpleValue:
value: str
verified: Optional[bool] = None
@dataclass_json
@dataclass
class Impressions:
modeled: int
processed: int
skipped: int
@dataclass_json
@dataclass
class SupplyGraphDepth:
averageDepth: Optional[float] = None
maxDepth: Optional[int] = None
minDepth: Optional[int] = None
@dataclass_json
@dataclass
class SupplyGraph:
logical: SupplyGraphDepth
technical: SupplyGraphDepth
totalCount: Optional[int] = None
@dataclass_json
@dataclass
class RowCoverage:
impressions: Impressions
adFormat: Optional[AdFormatCoverage] = None
channel: Optional[SimpleValue] = None
compensationProvider: Optional[SimpleValue] = None
inventoryClassification: Optional[SimpleValue] = None
mediaOwner: Optional[SimpleValue] = None
property: Optional[SimpleValue] = None
seller: Optional[SimpleValue] = None
supplyGraph: Optional[SupplyGraph] = None
venueCategory: Optional[SimpleValue] = None
@dataclass_json
@dataclass
class EmissionsComponent:
emissions: float
@dataclass_json
@dataclass
class CompensationBreakdown:
emissions: float
provider: str
@dataclass_json
@dataclass
class CompensatedBreakdownStruct:
compensation: CompensationBreakdown
@dataclass_json
@dataclass
class Compensated:
breakdown: CompensatedBreakdownStruct
total: float
@dataclass_json
@dataclass
class SimpleBreakdown:
adPlatform: Optional[EmissionsComponent] = None
dataTransfer: Optional[EmissionsComponent] = None
@dataclass_json
@dataclass
class MediaDistributionBreakdown:
corporate: Optional[EmissionsComponent] = None
dataTransfer: Optional[EmissionsComponent] = None
storageAndTransport: Optional[EmissionsComponent] = None
@dataclass_json
@dataclass
class ComponentWithBreakdown:
breakdown: SimpleBreakdown
total: float
@dataclass_json
@dataclass
class MediaDistributionComponent:
breakdown: MediaDistributionBreakdown
total: float
@dataclass_json
@dataclass
class RowEmissionsBreakdownDetail:
adSelection: Optional[ComponentWithBreakdown] = None
compensated: Optional[Compensated] = None
creativeDelivery: Optional[ComponentWithBreakdown] = None
disposal: Optional[ComponentWithBreakdown] = None
mediaDistribution: Optional[MediaDistributionComponent] = None
techManipulation: Optional[ComponentWithBreakdown] = None
@dataclass_json
@dataclass
class RowEmissionsBreakdown:
breakdown: RowEmissionsBreakdownDetail
framework: str
@dataclass_json
@dataclass
class Error:
message: str
@dataclass_json
@dataclass
class PolicyEvaluationData:
propertyId: int
isMFA: bool
isInventory: bool
channel: str
channelStatus: str
benchmarksPercentile: int
@dataclass_json
@dataclass
class Internal:
countryRegionGCO2PerKwh: float
countryRegionCountry: str
channel: str
deviceType: str
propertyId: int
propertyInventoryType: str
propertyName: str
matchedInventoryId: str
benchmarkPercentile: int
isMFA: bool
policyEvaluationData: PolicyEvaluationData
@dataclass_json
@dataclass
class Row:
inventoryCoverage: str
coverage: Optional[RowCoverage] = None
emissionsBreakdown: Optional[RowEmissionsBreakdown] = None
error: Optional[Error] = None
internal: Optional[Internal] = None
policies: Optional[List[RowPolicy]] = None
rowIdentifier: Optional[str] = None
totalEmissions: Optional[float] = None
@dataclass
class MeasureResponse(DataClassJsonMixin):
totalEmissions: float
totalEmissionsBreakdown: EmissionsBreakdown
coverage: Optional[Coverage] = None
policies: Optional[List[Policy]] = None
requestId: Optional[str] = None
rows: Optional[List[Row]] = None
def __str__(self) -> str:
return (
f"RequestID: {self.requestId}\n"
f"Total Emissions: {self.totalEmissions:.4f}\n"
f"Breakdown:\n"
f" - Ad Selection: {self.totalEmissionsBreakdown.totals.adSelection:.4f}\n"
f" - Creative Delivery: {self.totalEmissionsBreakdown.totals.creativeDelivery:.4f}\n"
f" - Media Distribution: {self.totalEmissionsBreakdown.totals.mediaDistribution:.4f}\n"
)