1
0
mirror of synced 2025-12-31 15:03:11 -05:00
Files
airbyte/airbyte-integrations/connectors/source-adjust/source_adjust/model.py
Cole Snodgrass 2e099acc52 update headers from 2022 -> 2023 (#22594)
* It's 2023!

* 2022 -> 2023

---------

Co-authored-by: evantahler <evan@airbyte.io>
2023-02-08 13:01:16 -08:00

633 lines
16 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#
# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
#
# The spec and report schema are generated from this module.
#
# import source_adjust.model, yaml, json
# yaml.dump(yaml.safe_load(source_adjust.model.Spec.schema_json()),
# stream=open('source_adjust/spec.yaml', 'w'),
# )
import datetime
import decimal
import typing
import pydantic
BASE_METRICS = typing.Literal[
"network_cost",
"network_cost_diff",
"network_clicks",
"network_impressions",
"network_installs",
"network_installs_diff",
"network_ecpc",
"network_ecpi",
"network_ecpm",
"arpdau_ad",
"arpdau",
"arpdau_iap",
"ad_impressions",
"ad_rpm",
"ad_revenue",
"cohort_ad_revenue",
"cost",
"adjust_cost",
"all_revenue",
"cohort_all_revenue",
"daus",
"maus",
"waus",
"base_sessions",
"ctr",
"click_conversion_rate",
"click_cost",
"clicks",
"paid_clicks",
"deattributions",
"ecpc",
"gdpr_forgets",
"gross_profit",
"cohort_gross_profit",
"impression_conversion_rate",
"impression_cost",
"impressions",
"paid_impressions",
"install_cost",
"installs",
"paid_installs",
"installs_per_mile",
"limit_ad_tracking_installs",
"limit_ad_tracking_install_rate",
"limit_ad_tracking_reattribution_rate",
"limit_ad_tracking_reattributions",
"non_organic_installs",
"organic_installs",
"roas_ad",
"roas",
"roas_iap",
"reattributions",
"return_on_investment",
"revenue",
"cohort_revenue",
"revenue_events",
"revenue_to_cost",
"sessions",
"events",
"ecpi_all",
"ecpi",
"ecpm",
]
DIMENSIONS = typing.Literal[
"os_name",
"device_type",
"app",
"app_token",
"store_id",
"store_type",
"app_network",
"currency",
"currency_code",
"network",
"campaign",
"campaign_network",
"campaign_id_network",
"adgroup",
"adgroup_network",
"adgroup_id_network",
"source_network",
"source_id_network",
"creative",
"creative_network",
"creative_id_network",
"country",
"country_code",
"region",
"partner_name",
"partner_id",
]
class Spec(pydantic.BaseModel):
"""
Adjust reporting API connector.
"""
api_token: str = pydantic.Field(
...,
title="API Token",
description="Adjust API key, see https://help.adjust.com/en/article/report-service-api-authentication",
airbyte_secret=True,
order=0,
)
ingest_start: datetime.date = pydantic.Field(
...,
title="Ingest Start Date",
description="Data ingest start date.",
order=1,
)
metrics: typing.Set[BASE_METRICS] = pydantic.Field(
...,
title="Metrics to ingest",
description="Select at least one metric to query.",
min_items=1,
order=2,
)
additional_metrics: typing.List[str] = pydantic.Field(
None,
title="Additional metrics for ingestion",
description="Metrics names that are not pre-defined, such as cohort metrics or app specific metrics.",
order=3,
)
dimensions: typing.Set[DIMENSIONS] = pydantic.Field(
...,
description=(
"Dimensions allow a user to break down metrics into "
"groups using one or several parameters. For example, "
"the number of installs by date, country and network. "
"See https://help.adjust.com/en/article/reports-endpoint#dimensions "
"for more information about the dimensions."
),
min_items=1,
order=4,
)
until_today: bool = pydantic.Field(
False,
description="Syncs data up until today. Useful when running daily incremental syncs, and duplicates are not desired.",
order=5,
)
class Config:
title = "Adjust Spec"
@staticmethod
def schema_extra(schema: typing.Dict[str, typing.Any]):
spec = {"$schema": "http://json-schema.org/draft-07/schema#"}
for key in list(schema.keys()):
spec[key] = schema.pop(key)
schema["connectionSpecification"] = spec
schema["documentationUrl"] = "https://docs.airbyte.com/integrations/sources/adjust"
class Report(pydantic.BaseModel):
# Base metrics
network_cost: typing.Optional[decimal.Decimal] = pydantic.Field(
None,
description="Ad Spend (Network).",
)
network_cost_diff: typing.Optional[decimal.Decimal] = pydantic.Field(
None,
description="Ad Spend Diff (Network).",
)
network_clicks: typing.Optional[int] = pydantic.Field(
None,
description="Clicks (Network).",
)
network_impressions: typing.Optional[int] = pydantic.Field(
None,
description="Impressions (Network).",
)
network_installs: typing.Optional[int] = pydantic.Field(
None,
description="Installs (Network).",
)
network_installs_diff: typing.Optional[int] = pydantic.Field(
None,
description="Installs Diff (Network).",
)
network_ecpc: typing.Optional[decimal.Decimal] = pydantic.Field(
None,
description="eCPC (Network).",
)
network_ecpi: typing.Optional[decimal.Decimal] = pydantic.Field(
None,
description="eCPI (Network).",
)
network_ecpm: typing.Optional[decimal.Decimal] = pydantic.Field(
None,
description="eCPM (Network).",
)
arpdau_ad: typing.Optional[decimal.Decimal] = pydantic.Field(
None,
description="ARPDAU (Ad).",
)
arpdau: typing.Optional[decimal.Decimal] = pydantic.Field(
None,
description="ARPDAU (All).",
)
arpdau_iap: typing.Optional[decimal.Decimal] = pydantic.Field(
None,
description="ARPDAU (IAP).",
)
ad_impressions: typing.Optional[int] = pydantic.Field(
None,
description="Ad Impressions.",
)
ad_rpm: typing.Optional[decimal.Decimal] = pydantic.Field(
None,
description="Ad RPM.",
)
ad_revenue: typing.Optional[decimal.Decimal] = pydantic.Field(
None,
description="Ad Revenue.",
)
cohort_ad_revenue: typing.Optional[decimal.Decimal] = pydantic.Field(
None,
description="Ad Revenue (Cohort).",
)
cost: typing.Optional[decimal.Decimal] = pydantic.Field(
None,
description="Ad Spend.",
)
adjust_cost: typing.Optional[decimal.Decimal] = pydantic.Field(
None,
description="Ad Spend (Attribution).",
)
all_revenue: typing.Optional[decimal.Decimal] = pydantic.Field(
None,
description="All Revenue.",
)
cohort_all_revenue: typing.Optional[decimal.Decimal] = pydantic.Field(
None,
description="All Revenue (Cohort).",
)
daus: typing.Optional[decimal.Decimal] = pydantic.Field(
None,
description="Avg. DAUs.",
)
maus: typing.Optional[decimal.Decimal] = pydantic.Field(
None,
description="Avg. MAUs.",
)
waus: typing.Optional[decimal.Decimal] = pydantic.Field(
None,
description="Avg. WAUs.",
)
base_sessions: typing.Optional[int] = pydantic.Field(
None,
description="Base Sessions.",
)
ctr: typing.Optional[decimal.Decimal] = pydantic.Field(
None,
description="CTR.",
)
click_conversion_rate: typing.Optional[decimal.Decimal] = pydantic.Field(
None,
description="Click Conversion Rate (CCR).",
)
click_cost: typing.Optional[decimal.Decimal] = pydantic.Field(
None,
description="Click Cost.",
)
clicks: typing.Optional[int] = pydantic.Field(
None,
description="Clicks.",
)
paid_clicks: typing.Optional[int] = pydantic.Field(
None,
description="Clicks (paid).",
)
deattributions: typing.Optional[int] = pydantic.Field(
None,
description="Deattributions.",
)
ecpc: typing.Optional[decimal.Decimal] = pydantic.Field(
None,
description="Effective Cost per Click (eCPC).",
)
gdpr_forgets: typing.Optional[int] = pydantic.Field(
None,
description="GDPR Forgets.",
)
gross_profit: typing.Optional[decimal.Decimal] = pydantic.Field(
None,
description="Gross profit.",
)
cohort_gross_profit: typing.Optional[decimal.Decimal] = pydantic.Field(
None,
description="Gross profit (Cohort).",
)
impression_conversion_rate: typing.Optional[decimal.Decimal] = pydantic.Field(
None,
description="Impression Conversion Rate (ICR).",
)
impression_cost: typing.Optional[decimal.Decimal] = pydantic.Field(
None,
description="Impression Cost.",
)
impressions: typing.Optional[int] = pydantic.Field(
None,
description="Impressions.",
)
paid_impressions: typing.Optional[int] = pydantic.Field(
None,
description="Impressions (paid).",
)
install_cost: typing.Optional[decimal.Decimal] = pydantic.Field(
None,
description="Install Cost.",
)
installs: typing.Optional[int] = pydantic.Field(
None,
description="Installs.",
)
paid_installs: typing.Optional[int] = pydantic.Field(
None,
description="Installs (paid).",
)
installs_per_mile: typing.Optional[int] = pydantic.Field(
None,
description="Installs per Mille (IPM).",
)
limit_ad_tracking_installs: typing.Optional[int] = pydantic.Field(
None,
description="Limit Ad Tracking Installs.",
)
limit_ad_tracking_install_rate: typing.Optional[decimal.Decimal] = pydantic.Field(
None,
description="Limit Ad Tracking Rate.",
)
limit_ad_tracking_reattribution_rate: typing.Optional[decimal.Decimal] = pydantic.Field(
None,
description="Limit Ad Tracking Reattribution Rate.",
)
limit_ad_tracking_reattributions: typing.Optional[int] = pydantic.Field(
None,
description="Limit Ad Tracking Reattributions.",
)
non_organic_installs: typing.Optional[int] = pydantic.Field(
None,
description="Non-Organic Installs.",
)
organic_installs: typing.Optional[int] = pydantic.Field(
None,
description="Organic Installs.",
)
roas_ad: typing.Optional[decimal.Decimal] = pydantic.Field(
None,
description="ROAS (Ad Revenue).",
)
roas: typing.Optional[decimal.Decimal] = pydantic.Field(
None,
description="ROAS (All Revenue).",
)
roas_iap: typing.Optional[decimal.Decimal] = pydantic.Field(
None,
description="ROAS (IAP Revenue).",
)
reattributions: typing.Optional[int] = pydantic.Field(
None,
description="Reattributions.",
)
return_on_investment: typing.Optional[decimal.Decimal] = pydantic.Field(
None,
description="Return On Investment (ROI).",
)
revenue: typing.Optional[decimal.Decimal] = pydantic.Field(
None,
description="Revenue.",
)
cohort_revenue: typing.Optional[decimal.Decimal] = pydantic.Field(
None,
description="Revenue (Cohort).",
)
revenue_events: typing.Optional[int] = pydantic.Field(
None,
description="Revenue Events.",
)
revenue_to_cost: typing.Optional[decimal.Decimal] = pydantic.Field(
None,
description="Revenue To Cost Ratio (RCR).",
)
sessions: typing.Optional[int] = pydantic.Field(
None,
description="Sessions.",
)
events: typing.Optional[int] = pydantic.Field(
None,
description="Total Events.",
)
ecpi_all: typing.Optional[decimal.Decimal] = pydantic.Field(
None,
description="eCPI (All Installs).",
)
ecpi: typing.Optional[decimal.Decimal] = pydantic.Field(
None,
description="eCPI (Paid Installs).",
)
ecpm: typing.Optional[decimal.Decimal] = pydantic.Field(
None,
description="eCPM (Attribution).",
)
# Dimensions
day: datetime.date = pydantic.Field(
...,
description="Date.",
)
os_name: typing.Optional[str] = pydantic.Field(
None,
description="Operating system.",
)
device_type: typing.Optional[str] = pydantic.Field(
None,
description="Device, e.g., phone or tablet.",
)
app: typing.Optional[str] = pydantic.Field(
None,
description="Name of the app.",
)
app_token: typing.Optional[str] = pydantic.Field(
None,
description="App ID in the Adjust system.",
)
store_id: typing.Optional[str] = pydantic.Field(
None,
description="Store App ID.",
)
store_type: typing.Optional[str] = pydantic.Field(
None,
description="Store from where the app was installed.",
)
app_network: typing.Optional[str] = pydantic.Field(
None,
description="Value with format: <store_type>:<store_id>",
)
currency: typing.Optional[str] = pydantic.Field(
None,
description="Currency name.",
)
currency_code: typing.Optional[str] = pydantic.Field(
None,
description="3-character value ISO 4217.",
)
network: typing.Optional[str] = pydantic.Field(
None,
description="The name of the advertising network.",
)
campaign: typing.Optional[str] = pydantic.Field(
None,
description=("Tracker sub-level 1. String value usually " "contains campaign name and id."),
)
campaign_network: typing.Optional[str] = pydantic.Field(
None,
description="Campaign name from the network.",
)
campaign_id_network: typing.Optional[str] = pydantic.Field(
None,
description="Campaign ID from the network.",
)
adgroup: typing.Optional[str] = pydantic.Field(
None,
description=("Tracker sub-level 2. String value usually " "contains adgroup name and id."),
)
adgroup_network: typing.Optional[str] = pydantic.Field(
None,
description="Adgroup name from the network.",
)
adgroup_id_network: typing.Optional[str] = pydantic.Field(
None,
description="Adgroup ID from the network.",
)
source_network: typing.Optional[str] = pydantic.Field(
None,
description=("Optional value dependent on the network. " "Usually the same as adgroup_network."),
)
source_id_network: typing.Optional[str] = pydantic.Field(
None,
description="Value for source_app.",
)
creative: typing.Optional[str] = pydantic.Field(
None,
description=("Tracker sub-level 3. String value usually " "contains creative name and id."),
)
creative_network: typing.Optional[str] = pydantic.Field(
None,
description="Creative name from the network.",
)
creative_id_network: typing.Optional[str] = pydantic.Field(
None,
description="Creative ID from the network.",
)
country: typing.Optional[str] = pydantic.Field(
None,
description="Country name.",
)
country_code: typing.Optional[str] = pydantic.Field(
None,
description="2-character value ISO 3166.",
)
region: typing.Optional[str] = pydantic.Field(
None,
description="Business region.",
)
partner_name: typing.Optional[str] = pydantic.Field(
None,
description="Partner's name in the Adjust system.",
)
partner_id: typing.Optional[str] = pydantic.Field(
None,
description="Partners id in the Adjust system.",
)
class Config:
@staticmethod
def schema_extra(schema: typing.Dict[str, typing.Any]):
schema["$schema"] = "http://json-schema.org/draft-07/schema#"