├── .config └── dotnet-tools.json ├── .editorconfig ├── .github ├── .secrets.default ├── .vars.default ├── actions │ └── setup-dotnet │ │ └── action.yml ├── release.yaml └── workflows │ ├── README.md │ ├── build-docs.yml │ ├── build-dotnet.yml │ ├── build-python-package.yml │ ├── create-release.yml │ ├── deploy-all.yml │ ├── deploy-docs.yml │ ├── deploy-dotnet.yml │ ├── deploy-python.yml │ ├── lint-python.yml │ ├── sdk-workflow.yml │ ├── test-dotnet.yml │ └── test-python.yml ├── .gitignore ├── CODEOWNERS ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── Directory.Build.props ├── LICENSE.txt ├── Migration SDK.sln ├── README.md ├── SECURITY.md ├── examples ├── Csharp.ExampleApplication │ ├── Config │ │ ├── EndpointOptions.cs │ │ └── MyMigrationApplicationOptions.cs │ ├── Csharp.ExampleApplication.csproj │ ├── Hooks │ │ ├── BatchMigrationCompleted │ │ │ └── LogMigrationBatchesHook.cs │ │ ├── Filters │ │ │ ├── DefaultProjectsFilter.cs │ │ │ ├── SharedCustomViewFilter.cs │ │ │ └── UnlicensedUsersFilter.cs │ │ ├── InitializeMigration │ │ │ ├── CustomContext.cs │ │ │ └── SetMigrationContextHook.cs │ │ ├── Mappings │ │ │ ├── ChangeProjectMapping.cs │ │ │ ├── EmailDomainMapping.cs │ │ │ ├── EmailDomainMappingOptions.cs │ │ │ ├── ProjectRenameMapping.cs │ │ │ ├── UnlicensedUsersMapping.cs │ │ │ └── UnlicensedUsersMappingOptions.cs │ │ ├── MigrationActionCompleted │ │ │ └── LogMigrationActionsHook.cs │ │ ├── PostPublish │ │ │ ├── BulkLoggingHook.cs │ │ │ └── UpdatePermissionsHook.cs │ │ └── Transformers │ │ │ ├── ActionUrlXmlTransformer.cs │ │ │ ├── CustomViewDefaultUsersTransformer.cs │ │ │ ├── EncryptExtractTransformer.cs │ │ │ ├── MigratedTagTransformer.cs │ │ │ └── SimpleScheduleStartAtTransformer.cs │ ├── MyMigrationApplication.cs │ ├── Program.cs │ ├── README.md │ ├── appsettings.json │ └── packages.lock.json ├── DependencyInjection.ExampleApplication │ ├── Assert.cs │ ├── DependencyInjection.ExampleApplication.csproj │ ├── Extensions.cs │ ├── Hooks │ │ ├── Filters │ │ │ └── ProjectsFilter.cs │ │ └── Mappings │ │ │ └── ProjectMapping.cs │ ├── Program.cs │ ├── SingletonService.cs │ └── packages.lock.json └── Python.ExampleApplication │ ├── Hooks │ ├── Filters │ │ ├── default_project_filter.py │ │ ├── shared_custom_view_filter.py │ │ └── unlicensed_user_filter.py │ ├── batch_migration_completed │ │ └── log_migration_batches_hook.py │ ├── initialize_migration │ │ └── set_custom_context_hook.py │ ├── mappings │ │ ├── change_project_mapping.py │ │ ├── email_domain_mapping.py │ │ └── project_rename_mapping.py │ ├── migration_action_completed │ │ └── log_migration_actions_hook.py │ ├── post_publish │ │ └── bulk_logging_hook.py │ └── transformers │ │ ├── action_url_xml_transformer.py │ │ ├── custom_view_default_users_transformer.py │ │ ├── encrypt_extracts_transformer.py │ │ ├── migrated_tag_transformer.py │ │ └── schedule_startat_transformer.py │ ├── Python.ExampleApplication.py │ ├── Python.ExampleApplication.pyproj │ ├── config.ini │ ├── hooks.py │ ├── print_result.py │ ├── pyproject.toml │ └── requirements.txt ├── global.json ├── scripts ├── generate-docs.ps1 └── generate-license-header-python.ps1 ├── src ├── .vscode │ └── settings.json ├── Documentation │ ├── .gitignore │ ├── Documentation.csproj │ ├── README.md │ ├── api-csharp │ │ ├── .gitignore │ │ └── index.md │ ├── api-python │ │ ├── .gitignore │ │ └── index.md │ ├── articles │ │ ├── configuration.md │ │ ├── cv_file.md │ │ ├── dependency_injection.md │ │ ├── hooks │ │ │ ├── custom_hooks.md │ │ │ ├── example_hook_use_cases.md │ │ │ ├── index.md │ │ │ └── python_hook_update.md │ │ ├── index.md │ │ ├── logging.md │ │ ├── plan_validation.md │ │ ├── terms.md │ │ ├── toc.yml │ │ ├── troubleshooting.md │ │ └── user_authentication.md │ ├── cspell.json │ ├── docfx.json │ ├── filterConfig.yml │ ├── images │ │ ├── configuration.svg │ │ ├── hooks.svg │ │ └── versioning.svg │ ├── includes │ │ ├── configuration │ │ │ ├── sdk_opts_content_types.html │ │ │ ├── sdk_opts_def_perm.html │ │ │ ├── sdk_opts_files.html │ │ │ ├── sdk_opts_jobs.html │ │ │ ├── sdk_opts_network.html │ │ │ ├── sdk_opts_network_res.html │ │ │ └── sdk_opts_preflight.html │ │ ├── csharp-getting-started.md │ │ └── python-getting-started.md │ ├── index.md │ ├── packages.lock.json │ ├── samples │ │ ├── batch-migration-completed │ │ │ ├── index.md │ │ │ ├── log_migration_batches.md │ │ │ └── toc.yml │ │ ├── bulk-post-publish │ │ │ ├── bulk_logging.md │ │ │ ├── index.md │ │ │ └── toc.yml │ │ ├── filters │ │ │ ├── filter_custom_views_by_shared.md │ │ │ ├── filter_projects_by_name.md │ │ │ ├── filter_users_by_site_role.md │ │ │ ├── index.md │ │ │ └── toc.yml │ │ ├── index.md │ │ ├── initialize-migration │ │ │ ├── index.md │ │ │ ├── set_custom_context.md │ │ │ └── toc.yml │ │ ├── mappings │ │ │ ├── change_projects.md │ │ │ ├── index.md │ │ │ ├── rename_projects.md │ │ │ ├── toc.yml │ │ │ └── username_email_mapping.md │ │ ├── migration-action-completed │ │ │ ├── index.md │ │ │ ├── log_migration_actions.md │ │ │ └── toc.yml │ │ ├── post-publish │ │ │ ├── index.md │ │ │ ├── toc.yml │ │ │ └── update_permissions.md │ │ ├── toc.yml │ │ └── transformers │ │ │ ├── action_url_xml_transformer.md │ │ │ ├── custom_view_default_users_transformer.md │ │ │ ├── encrypt_extracts_transformer.md │ │ │ ├── index.md │ │ │ ├── migrated_tag_transformer.md │ │ │ ├── start_at_transformer.md │ │ │ └── toc.yml │ ├── tableau.svg │ ├── tableau_favicon.ico │ ├── templates │ │ └── tableau │ │ │ ├── conceptual.html.primary.tmpl │ │ │ ├── layout │ │ │ └── _master.tmpl │ │ │ ├── partials │ │ │ ├── breadcrumb.tmpl.partial │ │ │ ├── head.tmpl.partial │ │ │ ├── navbar-li.tmpl.partial │ │ │ └── navbar.tmpl.partial │ │ │ └── styles │ │ │ └── main.css │ └── toc.yml ├── Python │ ├── .gitignore │ ├── .vscode │ │ └── settings.json │ ├── CONTRIBUTING.md │ ├── DOCUMENTATION.md │ ├── Documentation │ │ ├── Makefile │ │ ├── _templates │ │ │ ├── custom-class-template.rst │ │ │ └── custom-module-template.rst │ │ ├── conf.py │ │ ├── index.rst │ │ └── make.bat │ ├── LICENSE │ ├── Python.pyproj │ ├── README.md │ ├── pyproject.toml │ ├── pytest.ini │ ├── requirements.txt │ ├── scripts │ │ ├── build-package.ps1 │ │ ├── build_binaries.py │ │ ├── import_modules.py │ │ └── publish-package.ps1 │ ├── src │ │ └── tableau_migration │ │ │ ├── __init__.py │ │ │ ├── migration.py │ │ │ ├── migration_api_rest.py │ │ │ ├── migration_api_rest_models.py │ │ │ ├── migration_api_rest_models_types.py │ │ │ ├── migration_content.py │ │ │ ├── migration_content_permissions.py │ │ │ ├── migration_content_schedules.py │ │ │ ├── migration_content_schedules_cloud.py │ │ │ ├── migration_content_schedules_server.py │ │ │ ├── migration_engine.py │ │ │ ├── migration_engine_actions.py │ │ │ ├── migration_engine_endpoints_search.py │ │ │ ├── migration_engine_hooks.py │ │ │ ├── migration_engine_hooks_filters.py │ │ │ ├── migration_engine_hooks_filters_interop.py │ │ │ ├── migration_engine_hooks_interop.py │ │ │ ├── migration_engine_hooks_mappings.py │ │ │ ├── migration_engine_hooks_mappings_interop.py │ │ │ ├── migration_engine_hooks_postpublish.py │ │ │ ├── migration_engine_hooks_postpublish_interop.py │ │ │ ├── migration_engine_hooks_results.py │ │ │ ├── migration_engine_hooks_transformers.py │ │ │ ├── migration_engine_hooks_transformers_interop.py │ │ │ ├── migration_engine_manifest.py │ │ │ ├── migration_engine_migrators.py │ │ │ ├── migration_engine_migrators_batch.py │ │ │ ├── migration_engine_options.py │ │ │ ├── migration_engine_pipelines.py │ │ │ ├── migration_enum.py │ │ │ ├── migration_logger.py │ │ │ └── migration_services.py │ └── tests │ │ ├── __init__.py │ │ ├── helpers │ │ └── autofixture.py │ │ ├── test_classes.py │ │ ├── test_migration.py │ │ ├── test_migration_api_rest.py │ │ ├── test_migration_api_rest_models.py │ │ ├── test_migration_content.py │ │ ├── test_migration_content_permissions.py │ │ ├── test_migration_content_schedules.py │ │ ├── test_migration_content_schedules_cloud.py │ │ ├── test_migration_content_schedules_server.py │ │ ├── test_migration_engine.py │ │ ├── test_migration_engine_endpoints_search.py │ │ ├── test_migration_engine_hooks.py │ │ ├── test_migration_engine_hooks_filters.py │ │ ├── test_migration_engine_hooks_mappings.py │ │ ├── test_migration_engine_hooks_postpublish.py │ │ ├── test_migration_engine_hooks_transformers.py │ │ ├── test_migration_engine_manifest.py │ │ ├── test_migration_engine_migrators_batch.py │ │ ├── test_migration_engine_options.py │ │ ├── test_migration_engine_pipelines.py │ │ ├── test_migration_services.py │ │ └── test_other.py ├── Tableau.Migration.PythonGenerator │ ├── Config │ │ ├── Hints │ │ │ ├── GeneratorHints.cs │ │ │ ├── NamespaceHints.cs │ │ │ └── TypeHints.cs │ │ └── PythonGeneratorOptions.cs │ ├── ConversionMode.cs │ ├── GenerationListHelper.cs │ ├── Generators │ │ ├── IPythonDocstringGenerator.cs │ │ ├── IPythonEnumValueGenerator.cs │ │ ├── IPythonGenerator.cs │ │ ├── IPythonMethodGenerator.cs │ │ ├── IPythonPropertyGenerator.cs │ │ ├── IPythonTypeGenerator.cs │ │ ├── PythonDocstringGenerator.cs │ │ ├── PythonEnumValueGenerator.cs │ │ ├── PythonGenerator.cs │ │ ├── PythonMemberGenerator.cs │ │ ├── PythonMethodGenerator.cs │ │ ├── PythonPropertyGenerator.cs │ │ └── PythonTypeGenerator.cs │ ├── INamedTypeSymbolExtensions.cs │ ├── ITypeSymbolExtensions.cs │ ├── IndentingStringBuilder.cs │ ├── Keywords │ │ ├── Dotnet │ │ │ ├── Namespaces.cs │ │ │ ├── TypeAliases.cs │ │ │ └── Types.cs │ │ └── Python │ │ │ ├── Modules.cs │ │ │ └── Types.cs │ ├── Program.cs │ ├── PythonArgDocstring.cs │ ├── PythonDocstring.cs │ ├── PythonEnumValue.cs │ ├── PythonGenerationList.cs │ ├── PythonGeneratorService.cs │ ├── PythonMethod.cs │ ├── PythonMethodArgument.cs │ ├── PythonProperty.cs │ ├── PythonTestGenerationList.cs │ ├── PythonType.cs │ ├── PythonTypeCache.cs │ ├── PythonTypeReference.cs │ ├── README.md │ ├── StringExtensions.cs │ ├── Tableau.Migration.PythonGenerator.csproj │ ├── Writers │ │ ├── GeneratedPythonSegment.cs │ │ ├── IPythonClassTestWriter.cs │ │ ├── IPythonConstructorTestWriter.cs │ │ ├── IPythonDocstringWriter.cs │ │ ├── IPythonEnumValueWriter.cs │ │ ├── IPythonMethodWriter.cs │ │ ├── IPythonPropertyTestWriter.cs │ │ ├── IPythonPropertyWriter.cs │ │ ├── IPythonTestWriter.cs │ │ ├── IPythonTypeWriter.cs │ │ ├── IPythonWriter.cs │ │ ├── Imports │ │ │ ├── ImportedModule.cs │ │ │ └── ImportedType.cs │ │ ├── PythonClassTestWriter.cs │ │ ├── PythonConstructorTestWriter.cs │ │ ├── PythonDocstringWriter.cs │ │ ├── PythonEnumValueWriter.cs │ │ ├── PythonMemberWriter.cs │ │ ├── PythonMethodWriter.cs │ │ ├── PythonPropertyTestWriter.cs │ │ ├── PythonPropertyWriter.cs │ │ ├── PythonTestWriter.cs │ │ ├── PythonTypeWriter.cs │ │ ├── PythonWriter.cs │ │ └── PythonWriterBase.cs │ ├── appsettings.json │ └── packages.lock.json └── Tableau.Migration │ ├── Api │ ├── ApiClient.cs │ ├── ApiClientBase.cs │ ├── ApiClientInput.cs │ ├── ApiListPager.cs │ ├── AuthenticationConfigurationsApiClient.cs │ ├── AuthenticationTokenProvider.cs │ ├── ClientXml │ │ └── Models │ │ │ ├── FailedLogin.cs │ │ │ ├── SuccessfulLogin.cs │ │ │ └── SuccessfulOrFailedLogin.cs │ ├── ConnectionManager.cs │ ├── ContentApiClientBase.cs │ ├── CustomViewsApiClient.cs │ ├── DataSourcesApiClient.cs │ ├── EmbeddedCredentials │ │ ├── EmbeddedCredentialsApiClient.cs │ │ ├── EmbeddedCredentialsApiClientFactory.cs │ │ ├── IEmbeddedCredentialsApiClient.cs │ │ ├── IEmbeddedCredentialsApiClientFactory.cs │ │ └── IEmbeddedCredentialsContentApiClient.cs │ ├── FlowsApiClient.cs │ ├── GroupsApiClient.cs │ ├── GroupsResponseExtensions.cs │ ├── IApiClient.cs │ ├── IApiClientInput.cs │ ├── IApiClientInputInitializer.cs │ ├── IApiContentUrl.cs │ ├── IApiPageAccessor.cs │ ├── IAuthenticationConfigurationsApiClient.cs │ ├── IAuthenticationTokenProvider.cs │ ├── IBatchPublishApiClient.cs │ ├── ICloudSubscriptionsApiClient.cs │ ├── ICloudTasksApiClient.cs │ ├── IConnectionManager.cs │ ├── IConnectionsApiClient.cs │ ├── IContentApiClient.cs │ ├── IContentFileStoreExtensions.cs │ ├── IContentReferenceFinderFactoryExtensions.cs │ ├── ICustomViewsApiClient.cs │ ├── IDataSourcesApiClient.cs │ ├── IDeleteApiClient.cs │ ├── IFlowsApiClient.cs │ ├── IGroupsApiClient.cs │ ├── IHttpRequestBuilderExtensions.cs │ ├── IHttpResponseMessageExtensions.cs │ ├── IJobsApiClient.cs │ ├── IOwnershipApiClient.cs │ ├── IPagedListApiClient.cs │ ├── IProjectsApiClient.cs │ ├── IPublishApiClient.cs │ ├── IPullApiClient.cs │ ├── IReadApiClient.cs │ ├── IRestRequestBuilderFactoryExtensions.cs │ ├── ISchedulesApiClient.cs │ ├── ISchedulesApiClientFactory.cs │ ├── IScopedApiClientFactory.cs │ ├── IServerSessionProvider.cs │ ├── IServerSubscriptionsApiClient.cs │ ├── IServerTasksApiClient.cs │ ├── IServiceCollectionExtensions.cs │ ├── ISitesApiClient.cs │ ├── ISubscriptionsApiClient.cs │ ├── ITableauServerVersionProvider.cs │ ├── ITasksApiClient.cs │ ├── IUsersApiClient.cs │ ├── IViewsApiClient.cs │ ├── IViewsApiClientFactory.cs │ ├── IWorkbooksApiClient.cs │ ├── JobsApiClient.cs │ ├── Labels │ │ ├── ILabelsApiClient.cs │ │ ├── ILabelsApiClientFactory.cs │ │ ├── ILabelsContentApiClient.cs │ │ ├── LabelsApiClient.cs │ │ └── LabelsApiClientFactory.cs │ ├── Models │ │ ├── AddUserResult.cs │ │ ├── AddUserToGroupResult.cs │ │ ├── ApplyKeychainOptions.cs │ │ ├── Cloud │ │ │ ├── CreateExtractRefreshTaskOptions.cs │ │ │ ├── CreateSubscriptionOptions.cs │ │ │ ├── ICreateExtractRefreshTaskOptions.cs │ │ │ └── ICreateSubscriptionOptions.cs │ │ ├── CreateProjectOptions.cs │ │ ├── CustomViewAsUserDefaultViewResult.cs │ │ ├── DestinationSiteInfo.cs │ │ ├── EmbeddedCredentialKeychainResult.cs │ │ ├── FailedJobException.cs │ │ ├── FileDownload.cs │ │ ├── IAddUserResult.cs │ │ ├── IAddUserToGroupResult.cs │ │ ├── IApplyKeychainOptions.cs │ │ ├── ICreateProjectOptions.cs │ │ ├── ICustomViewAsUserDefaultViewResult.cs │ │ ├── IDestinationSiteInfo.cs │ │ ├── IEmbeddedCredentialKeychainResult.cs │ │ ├── IImportJob.cs │ │ ├── IJob.cs │ │ ├── IKeychainUserMapping.cs │ │ ├── ILabelUpdateOptions.cs │ │ ├── IPublishCustomViewOptions.cs │ │ ├── IPublishDataSourceOptions.cs │ │ ├── IPublishFileOptions.cs │ │ ├── IPublishFlowOptions.cs │ │ ├── IPublishWorkbookOptions.cs │ │ ├── IServerInfo.cs │ │ ├── ISignInResult.cs │ │ ├── IStatusNote.cs │ │ ├── IUpdateConnectionOptions.cs │ │ ├── IUpdateDataSourceResult.cs │ │ ├── IUpdateProjectResult.cs │ │ ├── IUpdateUserResult.cs │ │ ├── IUpdateWorkbookResult.cs │ │ ├── IUserExtensions.cs │ │ ├── ImportJob.cs │ │ ├── Job.cs │ │ ├── KeychainUserMapping.cs │ │ ├── LabelUpdateOptions.cs │ │ ├── PublishCustomViewOptions.cs │ │ ├── PublishDataSourceOptions.cs │ │ ├── PublishFlowOptions.cs │ │ ├── PublishWorkbookOptions.cs │ │ ├── ServerInfo.cs │ │ ├── SignInResult.cs │ │ ├── StatusNote.cs │ │ ├── TimeoutJobException.cs │ │ ├── UpdateConnectionOptions.cs │ │ ├── UpdateDataSourceResult.cs │ │ ├── UpdateProjectResult.cs │ │ ├── UpdateUserResult.cs │ │ └── UpdateWorkbookResult.cs │ ├── Permissions │ │ ├── DefaultPermissionsApiClient.cs │ │ ├── IDefaultPermissionsApiClient.cs │ │ ├── IPermissionsApiClient.cs │ │ ├── IPermissionsApiClientFactory.cs │ │ ├── IPermissionsContentApiClient.cs │ │ ├── PermissionsApiClient.cs │ │ └── PermissionsApiClientFactory.cs │ ├── ProjectsApiClient.cs │ ├── PublishContentWithFileOptions.cs │ ├── Publishing │ │ ├── CustomViewPublisher.cs │ │ ├── DataSourcePublisher.cs │ │ ├── FilePublisherBase.cs │ │ ├── FlowPublisher.cs │ │ ├── ICustomViewPublisher.cs │ │ ├── IDataSourcePublisher.cs │ │ ├── IFilePublisher.cs │ │ ├── IFlowPublisher.cs │ │ ├── IWorkbookPublisher.cs │ │ └── WorkbookPublisher.cs │ ├── RefreshAuthenticationTokenDelegate.cs │ ├── Rest │ │ ├── ContentItemUriBuilderBase.cs │ │ ├── INamedContent.cs │ │ ├── IPermissionsUriBuilder.cs │ │ ├── IProjectsResponseApiClient.cs │ │ ├── IRestIdentifiable.cs │ │ ├── Models │ │ │ ├── AdministratorLevels.cs │ │ │ ├── ContentPermissions.cs │ │ │ ├── CustomViewDefaultUsersResponsePager.cs │ │ │ ├── Error.cs │ │ │ ├── ExtractEncryptionModes.cs │ │ │ ├── GroupUsersResponsePager.cs │ │ │ ├── IConnectionType.cs │ │ │ ├── ICustomViewType.cs │ │ │ ├── IDataSourceDetailsType.cs │ │ │ ├── IDataSourceType.cs │ │ │ ├── IFlowType.cs │ │ │ ├── ILocationType.cs │ │ │ ├── IProjectNamedReferenceType.cs │ │ │ ├── IProjectReferenceType.cs │ │ │ ├── IProjectType.cs │ │ │ ├── IProjectTypeExtensions.cs │ │ │ ├── IScheduleType.cs │ │ │ ├── ISubscriptionType.cs │ │ │ ├── ITableauServerListResponse.cs │ │ │ ├── ITableauServerResponse.cs │ │ │ ├── ITableauServerWithParentResponse.cs │ │ │ ├── ITagType.cs │ │ │ ├── IUserType.cs │ │ │ ├── IUserTypeExtensions.cs │ │ │ ├── IViewReferenceType.cs │ │ │ ├── IViewType.cs │ │ │ ├── IWithDataSourceReferenceType.cs │ │ │ ├── IWithOwnerType.cs │ │ │ ├── IWithProjectNamedReferenceType.cs │ │ │ ├── IWithProjectReferenceType.cs │ │ │ ├── IWithScheduleReferenceType.cs │ │ │ ├── IWithTagTypes.cs │ │ │ ├── IWithWorkbookNamedReferenceType.cs │ │ │ ├── IWithWorkbookReferenceType.cs │ │ │ ├── IWorkbookDetailsType.cs │ │ │ ├── IWorkbookNamedReferenceType.cs │ │ │ ├── IWorkbookReferenceType.cs │ │ │ ├── IWorkbookType.cs │ │ │ ├── IWorkbookViewReferenceType.cs │ │ │ ├── LabelCategories.cs │ │ │ ├── LabelContentTypes.cs │ │ │ ├── LicenseLevels.cs │ │ │ ├── Pagination.cs │ │ │ ├── ParentContentTypeNames.cs │ │ │ ├── PermissionsCapabilityModes.cs │ │ │ ├── PermissionsCapabilityNames.cs │ │ │ ├── Requests │ │ │ │ ├── AddTagsRequest.cs │ │ │ │ ├── AddUserToGroupRequest.cs │ │ │ │ ├── AddUserToSiteRequest.cs │ │ │ │ ├── ApplyKeychainRequest.cs │ │ │ │ ├── Cloud │ │ │ │ │ ├── CreateExtractRefreshTaskRequest.cs │ │ │ │ │ ├── CreateSubscriptionRequest.cs │ │ │ │ │ └── UpdateSubscriptionRequest.cs │ │ │ │ ├── CommitCustomViewPublishRequest.cs │ │ │ │ ├── CommitDataSourcePublishRequest.cs │ │ │ │ ├── CommitFlowPublishRequest.cs │ │ │ │ ├── CommitWorkbookPublishRequest.cs │ │ │ │ ├── CreateLocalGroupRequest.cs │ │ │ │ ├── CreateProjectRequest.cs │ │ │ │ ├── GetLabelsRequest.cs │ │ │ │ ├── ImportGroupRequest.cs │ │ │ │ ├── ImportUsersFromCsvRequest.cs │ │ │ │ ├── PermissionsAddRequest.cs │ │ │ │ ├── RetrieveKeychainRequest.cs │ │ │ │ ├── RetrieveUserSavedCredentialsRequest.cs │ │ │ │ ├── SetCustomViewDefaultUsersRequest.cs │ │ │ │ ├── SignInRequest.cs │ │ │ │ ├── TableauServerRequest.cs │ │ │ │ ├── UpdateConnectionRequest.cs │ │ │ │ ├── UpdateCustomViewRequest.cs │ │ │ │ ├── UpdateDataSourceRequest.cs │ │ │ │ ├── UpdateLabelsRequest.cs │ │ │ │ ├── UpdateProjectRequest.cs │ │ │ │ ├── UpdateSiteRequest.cs │ │ │ │ ├── UpdateUserRequest.cs │ │ │ │ ├── UpdateWorkbookRequest.cs │ │ │ │ └── UploadSavedCredentialsRequest.cs │ │ │ ├── Responses │ │ │ │ ├── AddTagsResponse.cs │ │ │ │ ├── AddUserResponse.cs │ │ │ │ ├── Cloud │ │ │ │ │ ├── CreateExtractRefreshTaskResponse.cs │ │ │ │ │ ├── CreateSubscriptionResponse.cs │ │ │ │ │ ├── ExtractRefreshTasksResponse.cs │ │ │ │ │ ├── GetSubscriptionsResponse.cs │ │ │ │ │ ├── ICloudExtractRefreshType.cs │ │ │ │ │ ├── ICloudScheduleType.cs │ │ │ │ │ └── UpdateSubscriptionResponse.cs │ │ │ │ ├── ConnectionResponse.cs │ │ │ │ ├── ConnectionsResponse.cs │ │ │ │ ├── CreateGroupResponse.cs │ │ │ │ ├── CreateProjectResponse.cs │ │ │ │ ├── CustomViewAsUsersDefaultViewResponse.cs │ │ │ │ ├── CustomViewResponse.cs │ │ │ │ ├── CustomViewsResponse.cs │ │ │ │ ├── DataSourceResponse.cs │ │ │ │ ├── DataSourcesResponse.cs │ │ │ │ ├── EmptyTableauServerResponse.cs │ │ │ │ ├── FileUploadResponse.cs │ │ │ │ ├── FlowResponse.cs │ │ │ │ ├── FlowsResponse.cs │ │ │ │ ├── GroupResponse.cs │ │ │ │ ├── GroupsResponse.cs │ │ │ │ ├── IExtractRefreshType.cs │ │ │ │ ├── IExtractRefreshTypeExtensions.cs │ │ │ │ ├── IScheduleFrequencyDetailsType.cs │ │ │ │ ├── IScheduleIntervalType.cs │ │ │ │ ├── IScheduleReferenceType.cs │ │ │ │ ├── ISubscriptionContentType.cs │ │ │ │ ├── ImportJobResponse.cs │ │ │ │ ├── JobResponse.cs │ │ │ │ ├── LabelsResponse.cs │ │ │ │ ├── MetricsResponse.cs │ │ │ │ ├── PagedTableauServerResponse.cs │ │ │ │ ├── PermissionsResponse.cs │ │ │ │ ├── ProjectsResponse.cs │ │ │ │ ├── RetrieveKeychainResponse.cs │ │ │ │ ├── RetrieveSavedCredentialsResponse.cs │ │ │ │ ├── Server │ │ │ │ │ ├── ExtractRefreshTasksResponse.cs │ │ │ │ │ ├── GetSubscriptionsResponse.cs │ │ │ │ │ ├── IServerExtractRefreshType.cs │ │ │ │ │ ├── IServerScheduleType.cs │ │ │ │ │ ├── ScheduleExtractRefreshTasksResponse.cs │ │ │ │ │ └── ScheduleResponse.cs │ │ │ │ ├── ServerInfoResponse.cs │ │ │ │ ├── ServerSessionResponse.cs │ │ │ │ ├── SignInResponse.cs │ │ │ │ ├── SiteAuthConfigurationsResponse.cs │ │ │ │ ├── SiteResponse.cs │ │ │ │ ├── SitesResponse.cs │ │ │ │ ├── TableauServerListResponse.cs │ │ │ │ ├── TableauServerResponse.cs │ │ │ │ ├── UpdateCustomViewResponse.cs │ │ │ │ ├── UpdateDataSourceResponse.cs │ │ │ │ ├── UpdateProjectResponse.cs │ │ │ │ ├── UpdateUserResponse.cs │ │ │ │ ├── UpdateWorkbookResponse.cs │ │ │ │ ├── UserResponse.cs │ │ │ │ ├── UsersResponse.cs │ │ │ │ ├── UsersWithCustomViewAsDefaultViewResponse.cs │ │ │ │ ├── ViewResponse.cs │ │ │ │ ├── VirtualConnectionsResponse.cs │ │ │ │ ├── WorkbookResponse.cs │ │ │ │ └── WorkbooksResponse.cs │ │ │ ├── RestProjectBuilder.cs │ │ │ ├── RestProjectBuilderPager.cs │ │ │ ├── RestProjectResponsePager.cs │ │ │ ├── ScheduleExtractRefreshTasksResponsePager.cs │ │ │ ├── SiteRoleMapping.cs │ │ │ ├── SiteRoleMappingItem.cs │ │ │ ├── SiteRoles.cs │ │ │ └── Types │ │ │ │ ├── AuthenticationTypes.cs │ │ │ │ ├── CapabilityType.cs │ │ │ │ ├── CustomViewFileTypes.cs │ │ │ │ ├── DataSourceFileTypes.cs │ │ │ │ ├── ExtractRefreshType.cs │ │ │ │ ├── FlowFileTypes.cs │ │ │ │ ├── GranteeCapabilityType.cs │ │ │ │ ├── ParentContentType.cs │ │ │ │ ├── PermissionsContentItemType.cs │ │ │ │ ├── PermissionsType.cs │ │ │ │ ├── ScheduleFrequencies.cs │ │ │ │ ├── ScheduleTypes.cs │ │ │ │ ├── WeekDays.cs │ │ │ │ └── WorkbookFileTypes.cs │ │ ├── PermissionsUriBuilder.cs │ │ ├── RestErrorCodes.cs │ │ ├── RestException.cs │ │ ├── RestUrlKeywords.cs │ │ ├── RestUrlPrefixes.cs │ │ ├── StringExtensions.cs │ │ └── TagsUriBuilder.cs │ ├── SchedulesApiClient.cs │ ├── SchedulesApiClientFactory.cs │ ├── ScopedApiClientFactory.cs │ ├── Search │ │ ├── ApiContentCache.cs │ │ ├── ApiContentReferenceFinderFactory.cs │ │ └── BulkApiContentReferenceCache.cs │ ├── ServerSessionProvider.cs │ ├── Simulation │ │ ├── ITableauApiSimulatorCollection.cs │ │ ├── ITableauApiSimulatorFactory.cs │ │ ├── Rest │ │ │ ├── Api │ │ │ │ ├── AuthRestApiSimulator.cs │ │ │ │ ├── CustomViewsRestApiSimulator.cs │ │ │ │ ├── DataSourcesRestApiSimulator.cs │ │ │ │ ├── EmbeddedCredentialsRestApiSimulatorBase.cs │ │ │ │ ├── FileUploadsRestApiSimulator.cs │ │ │ │ ├── GroupsRestApiSimulator.cs │ │ │ │ ├── JobsRestApiSimulator.cs │ │ │ │ ├── PermissionsRestApiSimulatorBase.cs │ │ │ │ ├── ProjectsRestApiSimulator.cs │ │ │ │ ├── SchedulesRestApiSimulator.cs │ │ │ │ ├── SitesRestApiSimulator.cs │ │ │ │ ├── SubscriptionsRestApiSimulator.cs │ │ │ │ ├── TagsRestApiSimulatorBase.cs │ │ │ │ ├── TasksRestApiSimulator.cs │ │ │ │ ├── UsersRestApiSimulator.cs │ │ │ │ ├── ViewsRestApiSimulator.cs │ │ │ │ └── WorkbooksRestApiSimulator.cs │ │ │ ├── MethodSimulatorExtensions.cs │ │ │ ├── Net │ │ │ │ ├── HttpStatusCodeExtensions.cs │ │ │ │ ├── Requests │ │ │ │ │ ├── FilterExtensions.cs │ │ │ │ │ ├── HttpRequestMessageExtensions.cs │ │ │ │ │ ├── RestApiRequestMatcher.cs │ │ │ │ │ ├── RestUrlPatterns.cs │ │ │ │ │ └── UriExtensions.cs │ │ │ │ ├── ResponseSimulatorExtensions.cs │ │ │ │ └── Responses │ │ │ │ │ ├── BuildResponseException.cs │ │ │ │ │ ├── EmptyRestResponseBuilder.cs │ │ │ │ │ ├── IEntityResponsePager.cs │ │ │ │ │ ├── IRestApiResponseBuilder.cs │ │ │ │ │ ├── IRestApiResponseBuilderExtensions.cs │ │ │ │ │ ├── IRestErrorBuilder.cs │ │ │ │ │ ├── RestCommitCustomViewUploadResponseBuilder.cs │ │ │ │ │ ├── RestCommitDataSourceUploadResponseBuilder.cs │ │ │ │ │ ├── RestCommitUploadResponseBuilder.cs │ │ │ │ │ ├── RestCommitWorkbookUploadResponseBuilder.cs │ │ │ │ │ ├── RestCreateSubscriptionResponseBuilder.cs │ │ │ │ │ ├── RestCustomViewDefaultUsersAddResponseBuilder.cs │ │ │ │ │ ├── RestDefaultPermissionsCreateResponseBuilder.cs │ │ │ │ │ ├── RestDeleteByIdResponseBuilder.cs │ │ │ │ │ ├── RestDeleteResponseBuilder.cs │ │ │ │ │ ├── RestDownloadFileByIdResponseBuilder.cs │ │ │ │ │ ├── RestEntityIdResponseBuilderBase.cs │ │ │ │ │ ├── RestEntityListResponseBuilderBase.cs │ │ │ │ │ ├── RestEntityResponsePager.cs │ │ │ │ │ ├── RestExtractRefreshTaskCreateResponseBuilder.cs │ │ │ │ │ ├── RestGetByContentUrlResponseBuilder.cs │ │ │ │ │ ├── RestGetByIdResponseBuilder.cs │ │ │ │ │ ├── RestGetSitesResponseBuilder.cs │ │ │ │ │ ├── RestGroupAddResponseBuilder.cs │ │ │ │ │ ├── RestInitiateFileUploadResponseBuilder.cs │ │ │ │ │ ├── RestListResponseBuilder.cs │ │ │ │ │ ├── RestPagedListResponseBuilder.cs │ │ │ │ │ ├── RestPermissionsCreateResponseBuilder.cs │ │ │ │ │ ├── RestPermissionsGetResponseBuilder.cs │ │ │ │ │ ├── RestPostEntityResponseBuilder.cs │ │ │ │ │ ├── RestProjectCreateResponseBuilder.cs │ │ │ │ │ ├── RestPutByIdResponseBuilder.cs │ │ │ │ │ ├── RestRequestResponseBuilder.cs │ │ │ │ │ ├── RestResponseBuilderBase.cs │ │ │ │ │ ├── RestSearchEntityResponseBuilderBase.cs │ │ │ │ │ ├── RestSingleEntityResponseBuilder.cs │ │ │ │ │ ├── RestUpdateConnectionResponseBuilder.cs │ │ │ │ │ ├── RestUpdateFileUploadResponseBuilder.cs │ │ │ │ │ ├── RestUpdateSubscriptionResponseBuilder.cs │ │ │ │ │ ├── RestUserAddResponseBuilder.cs │ │ │ │ │ ├── RestUserAddToGroupResponseBuilder.cs │ │ │ │ │ ├── RestUserImportResponseBuilder.cs │ │ │ │ │ ├── RestUserUpdateResponseBuilder.cs │ │ │ │ │ ├── StaticRestErrorBuilder.cs │ │ │ │ │ └── UnauthorizedRestErrorBuilder.cs │ │ │ └── RestApiSimulator.cs │ │ ├── SimulatedConnection.cs │ │ ├── SimulatedConnectionCredentials.cs │ │ ├── SimulatedCustomViewData.cs │ │ ├── SimulatedDataSourceData.cs │ │ ├── SimulatedDataWithConnections.cs │ │ ├── SimulatedWorkbookData.cs │ │ ├── TableauApiResponseSimulator.cs │ │ ├── TableauApiResponseSimulatorProvider.cs │ │ ├── TableauApiSimulator.cs │ │ ├── TableauApiSimulatorCollection.cs │ │ ├── TableauApiSimulatorFactory.cs │ │ └── TableauData.cs │ ├── SitesApiClient.cs │ ├── SubscriptionsApiClient.cs │ ├── TableauServerVersion.cs │ ├── TableauServerVersionProvider.cs │ ├── TableauSiteConnectionConfiguration.cs │ ├── Tags │ │ ├── ITagsApiClient.cs │ │ ├── ITagsApiClientFactory.cs │ │ ├── ITagsContentApiClient.cs │ │ ├── TagsApiClient.cs │ │ └── TagsApiClientFactory.cs │ ├── TasksApiClient.cs │ ├── UsersApiClient.cs │ ├── UsersResponseExtensions.cs │ ├── ViewsApiClient.cs │ ├── ViewsApiClientFactory.cs │ └── WorkbooksApiClient.cs │ ├── AsyncDisposableResult.cs │ ├── ComparerBase.cs │ ├── ConcurrentDictionaryExtensions.cs │ ├── Config │ ├── ConfigReader.cs │ ├── ContentTypesOptions.cs │ ├── DefaultPermissionsContentTypeOptions.cs │ ├── FileOptions.cs │ ├── IConfigReader.cs │ ├── JobOptions.cs │ ├── MigrationSDKOptions.cs │ ├── NetworkOptions.cs │ ├── PreflightOptions.cs │ ├── ResilienceOptions.cs │ └── UniqueContentTypesValidator.cs │ ├── Constants.cs │ ├── Content │ ├── AuthenticationConfiguration.cs │ ├── CloudSubscription.cs │ ├── ConcurrentSet.cs │ ├── Connection.cs │ ├── ContainerContentBase.cs │ ├── ContentBase.cs │ ├── ContentLocationComparer.cs │ ├── ContentReferenceStub.cs │ ├── CustomView.cs │ ├── DataSource.cs │ ├── DataSourceDetails.cs │ ├── Files │ │ ├── Aes256EncryptionFactory.cs │ │ ├── ContentFileHandle.cs │ │ ├── ContentFileStream.cs │ │ ├── ContentTypeDirectoryNames.cs │ │ ├── ContentTypeFilePathResolver.cs │ │ ├── ContentTypeFilePrefixes.cs │ │ ├── DirectoryContentFileStore.cs │ │ ├── EncryptedFileHandle.cs │ │ ├── EncryptedFileStore.cs │ │ ├── EncryptedFileStream.cs │ │ ├── IContentFileHandle.cs │ │ ├── IContentFileHandleExtensions.cs │ │ ├── IContentFilePathResolver.cs │ │ ├── IContentFileStore.cs │ │ ├── IContentFileStream.cs │ │ ├── ISymmetricEncryptionFactory.cs │ │ ├── ITableauFileEditor.cs │ │ ├── ITableauFileXmlStream.cs │ │ ├── SeekableCryptoStream.cs │ │ ├── StreamExtensions.cs │ │ ├── TableauFileEditor.cs │ │ ├── TableauFileXmlStream.cs │ │ ├── TemporaryDirectoryContentFileStore.cs │ │ └── Xml │ │ │ ├── XContainerExtensions.cs │ │ │ ├── XElementExtensions.cs │ │ │ ├── XFeatureFlagName.cs │ │ │ └── XNameExtensions.cs │ ├── Flow.cs │ ├── Group.cs │ ├── GroupUser.cs │ ├── IAuthenticationConfiguration.cs │ ├── IChildPermissionsContent.cs │ ├── ICloudSubscription.cs │ ├── IConnection.cs │ ├── IConnectionsContent.cs │ ├── IContainerContent.cs │ ├── IContentReferenceExtensions.cs │ ├── ICustomView.cs │ ├── IDataSource.cs │ ├── IDataSourceDetails.cs │ ├── IDelible.cs │ ├── IDescriptionContent.cs │ ├── IExtractContent.cs │ ├── IFileContent.cs │ ├── IFlow.cs │ ├── IGroup.cs │ ├── IGroupUser.cs │ ├── ILabel.cs │ ├── IMappableContainerContent.cs │ ├── IMappableContent.cs │ ├── IPermissionsContent.cs │ ├── IProject.cs │ ├── IPublishableCustomView.cs │ ├── IPublishableDataSource.cs │ ├── IPublishableFlow.cs │ ├── IPublishableGroup.cs │ ├── IPublishableWorkbook.cs │ ├── IPublishedContent.cs │ ├── IRequiresEmbeddedCredentialMigration.cs │ ├── IRequiresLabelUpdate.cs │ ├── IRequiresOwnerUpdate.cs │ ├── IServerSession.cs │ ├── IServerSubscription.cs │ ├── ISite.cs │ ├── ISiteSettings.cs │ ├── ISiteSettingsUpdate.cs │ ├── ISubscription.cs │ ├── ISubscriptionContent.cs │ ├── ITag.cs │ ├── ITagExtensions.cs │ ├── IUser.cs │ ├── IUsernameContent.cs │ ├── IView.cs │ ├── IWithConnections.cs │ ├── IWithDomain.cs │ ├── IWithEmbeddedCredentials.cs │ ├── IWithLabels.cs │ ├── IWithOwner.cs │ ├── IWithTags.cs │ ├── IWithWorkbook.cs │ ├── IWorkbook.cs │ ├── IWorkbookDetails.cs │ ├── Label.cs │ ├── MappableContainerContentBase.cs │ ├── Permissions │ │ ├── Capability.cs │ │ ├── DefaultPermissionsContentTypeUrlSegments.cs │ │ ├── GranteeCapability.cs │ │ ├── GranteeType.cs │ │ ├── GranteeTypeExtensions.cs │ │ ├── ICapability.cs │ │ ├── ICapabilityComparer.cs │ │ ├── IGranteeCapability.cs │ │ ├── IGranteeCapabilityExtensions.cs │ │ ├── IPermissions.cs │ │ └── Permissions.cs │ ├── Project.cs │ ├── PublishableCustomView.cs │ ├── PublishableDataSource.cs │ ├── PublishableFlow.cs │ ├── PublishableGroup.cs │ ├── PublishableWorkbook.cs │ ├── Schedules │ │ ├── Cloud │ │ │ ├── CloudExtractRefreshTask.cs │ │ │ ├── CloudSchedule.cs │ │ │ ├── CloudScheduleValidator.cs │ │ │ ├── ICloudExtractRefreshTask.cs │ │ │ └── ICloudSchedule.cs │ │ ├── ExtractRefreshContentType.cs │ │ ├── ExtractRefreshTaskBase.cs │ │ ├── FrequencyDetails.cs │ │ ├── IExtractRefreshTask.cs │ │ ├── IFrequencyDetails.cs │ │ ├── IFrequencyExtensions.cs │ │ ├── IInterval.cs │ │ ├── ISchedule.cs │ │ ├── IScheduleValidator.cs │ │ ├── IWithSchedule.cs │ │ ├── Interval.cs │ │ ├── IntervalComparer.cs │ │ ├── IntervalValues.cs │ │ ├── InvalidScheduleException.cs │ │ ├── ScheduleBase.cs │ │ ├── ScheduleComparers.cs │ │ ├── Server │ │ │ ├── IScheduleExtractRefreshTask.cs │ │ │ ├── IScheduleExtractRefreshTasks.cs │ │ │ ├── IServerExtractRefreshTask.cs │ │ │ ├── IServerSchedule.cs │ │ │ ├── ScheduleExtractRefreshTask.cs │ │ │ ├── ScheduleExtractRefreshTasks.cs │ │ │ ├── ServerExtractRefreshTask.cs │ │ │ ├── ServerSchedule.cs │ │ │ └── ServerScheduleValidator.cs │ │ └── VolatileCache.cs │ ├── Search │ │ ├── CachedContentReferenceFinder.cs │ │ ├── ContentCacheFactory.cs │ │ ├── ContentReferenceCacheBase.cs │ │ ├── IContentCache.cs │ │ ├── IContentCacheFactory.cs │ │ ├── IContentReferenceCache.cs │ │ ├── IContentReferenceFinder.cs │ │ └── IContentReferenceFinderFactory.cs │ ├── ServerSession.cs │ ├── ServerSessionSettings.cs │ ├── ServerSubscription.cs │ ├── Site.cs │ ├── SiteSettingsUpdate.cs │ ├── SubscriptionBase.cs │ ├── SubscriptionContent.cs │ ├── Tag.cs │ ├── TagLabelComparer.cs │ ├── User.cs │ ├── UserAuthenticationType.cs │ ├── UsernameContentBase.cs │ ├── View.cs │ ├── Workbook.cs │ └── WorkbookDetails.cs │ ├── ContentLocation.cs │ ├── CsvExtensions.cs │ ├── DateTimeExtensions.cs │ ├── Engine │ ├── Actions │ │ ├── IMigrateContentAction.cs │ │ ├── IMigrationAction.cs │ │ ├── IMigrationActionResult.cs │ │ ├── MigrateContentAction.cs │ │ ├── MigrationActionResult.cs │ │ └── PreflightAction.cs │ ├── ContentMigrationItem.cs │ ├── Conversion │ │ ├── DirectContentItemConverter.cs │ │ ├── ExtractRefreshTasks │ │ │ ├── ExtractRefreshTaskConverterBase.cs │ │ │ ├── IExtractRefreshTaskConverter.cs │ │ │ └── ServerToCloudExtractRefreshTaskConverter.cs │ │ ├── IContentItemConverter.cs │ │ ├── Schedules │ │ │ ├── IScheduleConverter.cs │ │ │ └── ServerToCloudScheduleConverter.cs │ │ └── Subscriptions │ │ │ ├── ISubscriptionConverter.cs │ │ │ ├── ServerToCloudSubscriptionConverter.cs │ │ │ └── SubscriptionConverterBase.cs │ ├── Endpoints │ │ ├── ContentClients │ │ │ ├── ApiContentClientFactory.cs │ │ │ ├── ContentClientBase.cs │ │ │ ├── IContentClient.cs │ │ │ ├── IContentClientFactory.cs │ │ │ ├── IViewsContentClient.cs │ │ │ ├── IWorkbooksContentClient.cs │ │ │ ├── ViewsContentClient.cs │ │ │ └── WorkbooksContentClient.cs │ │ ├── IDestinationApiEndpoint.cs │ │ ├── IDestinationEndpoint.cs │ │ ├── IMigrationApiEndpoint.cs │ │ ├── IMigrationEndpoint.cs │ │ ├── IMigrationEndpointFactory.cs │ │ ├── IMigrationPlanEndpointConfiguration.cs │ │ ├── ISourceApiEndpoint.cs │ │ ├── ISourceEndpoint.cs │ │ ├── ITableauApiEndpointConfiguration.cs │ │ ├── MigrationEndpointFactory.cs │ │ ├── Search │ │ │ ├── BulkApiAuthenticationConfigurationsCache.cs │ │ │ ├── BulkDestinationCache.cs │ │ │ ├── BulkDestinationProjectCache.cs │ │ │ ├── BulkSourceCache.cs │ │ │ ├── IDestinationAuthenticationConfigurationsCache.cs │ │ │ ├── IDestinationContentReferenceFinder.cs │ │ │ ├── IDestinationContentReferenceFinderFactory.cs │ │ │ ├── ILockedProjectCache.cs │ │ │ ├── ISourceContentReferenceFinder.cs │ │ │ ├── ISourceContentReferenceFinderFactory.cs │ │ │ ├── IUserSavedCredentialsCache.cs │ │ │ ├── ManifestDestinationContentReferenceFinder.cs │ │ │ ├── ManifestDestinationContentReferenceFinderFactory.cs │ │ │ ├── ManifestSourceContentReferenceFinder.cs │ │ │ ├── ManifestSourceContentReferenceFinderFactory.cs │ │ │ └── UserSavedCredentialsCache.cs │ │ ├── TableauApiDestinationEndpoint.cs │ │ ├── TableauApiEndpointBase.cs │ │ ├── TableauApiEndpointConfiguration.cs │ │ └── TableauApiSourceEndpoint.cs │ ├── Hooks │ │ ├── CallbackHookWrapper.cs │ │ ├── ContentTypeHookBuilderBase.cs │ │ ├── EmbeddedCredentialsCapabilityManager.cs │ │ ├── Filters │ │ │ ├── ContentFilterBase.cs │ │ │ ├── ContentFilterBuilder.cs │ │ │ ├── ContentFilterRunner.cs │ │ │ ├── ContentLocationInPathFilter.cs │ │ │ ├── Default │ │ │ │ ├── GroupAllUsersFilter.cs │ │ │ │ ├── GroupAllUsersFilterOptions.cs │ │ │ │ ├── PreviouslyMigratedFilter.cs │ │ │ │ ├── PreviouslyMigratedFilterOptions.cs │ │ │ │ ├── SystemOwnershipFilter.cs │ │ │ │ └── UserSiteRoleSupportUserFilter.cs │ │ │ ├── IContentFilter.cs │ │ │ ├── IContentFilterBuilder.cs │ │ │ └── IContentFilterRunner.cs │ │ ├── IContentBatchMigrationCompletedHook.cs │ │ ├── IContentTypeHookBuilder.cs │ │ ├── IEmbeddedCredentialsCapabilityManager.cs │ │ ├── IInitializeMigrationHook.cs │ │ ├── IInitializeMigrationHookResult.cs │ │ ├── IMigrationActionCompletedHook.cs │ │ ├── IMigrationCapabilityManager.cs │ │ ├── IMigrationHook.cs │ │ ├── IMigrationHookBuilder.cs │ │ ├── IMigrationHookFactory.cs │ │ ├── IMigrationHookFactoryCollection.cs │ │ ├── IMigrationHookRunner.cs │ │ ├── ISubscriptionsCapabilityManager.cs │ │ ├── InitializeMigration │ │ │ ├── Default │ │ │ │ ├── EmbeddedCredentialsPreflightCheck.cs │ │ │ │ ├── PreflightCheck.cs │ │ │ │ └── SubscriptionsPreflightCheck.cs │ │ │ └── InitializeMigrationCapabilityHookBase.cs │ │ ├── InitializeMigrationHookResult.cs │ │ ├── Mappings │ │ │ ├── ContentMappingBase.cs │ │ │ ├── ContentMappingBuilder.cs │ │ │ ├── ContentMappingContext.cs │ │ │ ├── ContentMappingRunner.cs │ │ │ ├── Default │ │ │ │ ├── AuthenticationTypeDomainMapping.cs │ │ │ │ ├── AuthenticationTypeDomainMappingBase.cs │ │ │ │ ├── AuthenticationTypeDomainMappingOptions.cs │ │ │ │ ├── CallbackAuthenticationTypeDomainMapping.cs │ │ │ │ ├── IAuthenticationTypeDomainMapping.cs │ │ │ │ ├── ITableauCloudUsernameMapping.cs │ │ │ │ ├── TableauCloudUsernameMapping.cs │ │ │ │ └── TableauCloudUsernameMappingOptions.cs │ │ │ ├── IContentMapping.cs │ │ │ ├── IContentMappingBuilder.cs │ │ │ └── IContentMappingRunner.cs │ │ ├── MigrationCapabilityManagerBase.cs │ │ ├── MigrationHookBuilder.cs │ │ ├── MigrationHookBuilderBase.cs │ │ ├── MigrationHookFactory.cs │ │ ├── MigrationHookFactoryCollection.cs │ │ ├── MigrationHookRunner.cs │ │ ├── MigrationHookRunnerBase.cs │ │ ├── PostPublish │ │ │ ├── BulkPostPublishContext.cs │ │ │ ├── BulkPostPublishHookBase.cs │ │ │ ├── ContentItemPostPublishContext.cs │ │ │ ├── ContentItemPostPublishHookBase.cs │ │ │ ├── Default │ │ │ │ ├── ChildItemsPermissionsPostPublishHook.cs │ │ │ │ ├── CustomViewDefaultUsersPostPublishHook.cs │ │ │ │ ├── EmbeddedCredentialsItemPostPublishHook.cs │ │ │ │ ├── OwnerItemPostPublishHook.cs │ │ │ │ ├── PermissionPostPublishHookBase.cs │ │ │ │ ├── PermissionsItemPostPublishHook.cs │ │ │ │ ├── ProjectPostPublishHook.cs │ │ │ │ └── TagItemPostPublishHook.cs │ │ │ ├── IBulkPostPublishHook.cs │ │ │ └── IContentItemPostPublishHook.cs │ │ ├── SubscriptionsCapabilityManager.cs │ │ └── Transformers │ │ │ ├── ContentTransformerBase.cs │ │ │ ├── ContentTransformerBuilder.cs │ │ │ ├── ContentTransformerRunner.cs │ │ │ ├── Default │ │ │ ├── CustomViewDefaultUserReferencesTransformer.cs │ │ │ ├── EncryptExtractTransformer.cs │ │ │ ├── GroupUsersTransformer.cs │ │ │ ├── IMappedUserTransformer.cs │ │ │ ├── IPermissionsTransformer.cs │ │ │ ├── IUserReferenceTransformer.cs │ │ │ ├── MappedReferenceExtractRefreshTaskTransformer.cs │ │ │ ├── MappedUserTransformer.cs │ │ │ ├── OwnershipTransformer.cs │ │ │ ├── PermissionsTransformer.cs │ │ │ ├── SubscriptionTransformer.cs │ │ │ ├── TableauServerConnectionUrlTransformer.cs │ │ │ ├── UserAuthenticationTypeTransformer.cs │ │ │ ├── UserAuthenticationTypeTransformerOptions.cs │ │ │ ├── UserTableauCloudSiteRoleTransformer.cs │ │ │ └── WorkbookReferenceTransformer.cs │ │ │ ├── IContentTransformer.cs │ │ │ ├── IContentTransformerBuilder.cs │ │ │ ├── IContentTransformerRunner.cs │ │ │ ├── IXmlContentTransformer.cs │ │ │ └── XmlContentTransformerBase.cs │ ├── IMigration.cs │ ├── IMigrationExtensions.cs │ ├── IMigrationInput.cs │ ├── IMigrationInputInitializer.cs │ ├── IServiceCollectionExtensions.cs │ ├── Manifest │ │ ├── IMigrationManifestContentTypePartition.cs │ │ ├── IMigrationManifestContentTypePartitionEditor.cs │ │ ├── IMigrationManifestEditor.cs │ │ ├── IMigrationManifestEntry.cs │ │ ├── IMigrationManifestEntryBuilder.cs │ │ ├── IMigrationManifestEntryCollection.cs │ │ ├── IMigrationManifestEntryCollectionEditor.cs │ │ ├── IMigrationManifestEntryEditor.cs │ │ ├── IMigrationManifestFactory.cs │ │ ├── Logging │ │ │ ├── LoggingMigrationManifest.cs │ │ │ ├── LoggingMigrationManifestContentTypePartition.cs │ │ │ └── LoggingMigrationManifestEntryCollection.cs │ │ ├── MigrationManifest.cs │ │ ├── MigrationManifestContentTypePartition.cs │ │ ├── MigrationManifestEntry.cs │ │ ├── MigrationManifestEntryCollection.cs │ │ ├── MigrationManifestEntryStatus.cs │ │ ├── MigrationManifestFactory.cs │ │ └── MigrationManifestSerializer.cs │ ├── Migration.cs │ ├── MigrationDirectoryContentFileStore.cs │ ├── MigrationInput.cs │ ├── MigrationPlan.cs │ ├── MigrationPlanBuilder.cs │ ├── MigrationPlanBuilderFactory.cs │ ├── Migrators │ │ ├── Batch │ │ │ ├── BulkPublishContentBatchMigrator.cs │ │ │ ├── ContentBatchMigrationResult.cs │ │ │ ├── ContentBatchMigratorBase.cs │ │ │ ├── ContentMigrationBatch.cs │ │ │ ├── IContentBatchMigrationResult.cs │ │ │ ├── IContentBatchMigrator.cs │ │ │ ├── ItemPublishContentBatchMigrator.cs │ │ │ └── ParallelContentBatchMigratorBase.cs │ │ ├── ContentItemMigrationResult.cs │ │ ├── ContentMigrator.cs │ │ ├── IContentItemMigrationResult.cs │ │ ├── IContentMigrator.cs │ │ └── Migrator.cs │ ├── Options │ │ ├── IMigrationPlanOptionsBuilder.cs │ │ ├── IMigrationPlanOptionsCollection.cs │ │ ├── IMigrationPlanOptionsProvider.cs │ │ ├── MigrationPlanOptionsBuilder.cs │ │ ├── MigrationPlanOptionsCollection.cs │ │ └── MigrationPlanOptionsProvider.cs │ ├── Pipelines │ │ ├── CloudToCloudMigrationPipeline.cs │ │ ├── CustomMigrationPipelineFactory.cs │ │ ├── IMigrationPipeline.cs │ │ ├── IMigrationPipelineFactory.cs │ │ ├── IMigrationPipelineRunner.cs │ │ ├── MigrationPipelineBase.cs │ │ ├── MigrationPipelineContentType.cs │ │ ├── MigrationPipelineContentTypeExtensions.cs │ │ ├── MigrationPipelineFactory.cs │ │ ├── MigrationPipelineRunner.cs │ │ ├── ServerToCloudMigrationPipeline.cs │ │ └── ServerToServerMigrationPipeline.cs │ ├── Preparation │ │ ├── ContentItemPreparerBase.cs │ │ ├── EndpointContentItemPreparer.cs │ │ ├── ExtractRefreshTaskServerToCloudPreparer.cs │ │ ├── IContentItemPreparer.cs │ │ └── SourceContentItemPreparer.cs │ └── ServerToCloudMigrationPlanBuilder.cs │ ├── EquatableException.cs │ ├── ExceptionComparer.cs │ ├── ExceptionExtensions.cs │ ├── FilePath.cs │ ├── Guard.cs │ ├── HttpHeaderExtensions.cs │ ├── IAsyncDisposableResult.cs │ ├── IContentReference.cs │ ├── IContentReferenceExtensions.cs │ ├── IDictionaryExtensions.cs │ ├── IEnumerableExtensions.cs │ ├── IMemoryStreamManager.cs │ ├── IMigrationCapabilities.cs │ ├── IMigrationCapabilitiesEditor.cs │ ├── IMigrationManifest.cs │ ├── IMigrationPlan.cs │ ├── IMigrationPlanBuilder.cs │ ├── IMigrationPlanBuilderFactory.cs │ ├── IMigrationSdk.cs │ ├── IMigrator.cs │ ├── IResult.cs │ ├── IServerToCloudMigrationPlanBuilder.cs │ ├── IServiceCollectionExtensions.cs │ ├── ISetExtensions.cs │ ├── ITaskDelayer.cs │ ├── InheritedTypeComparer.cs │ ├── Interop │ ├── Hooks │ │ ├── ISyncContentBatchMigrationCompletedHook.cs │ │ ├── ISyncInitializeMigrationHook.cs │ │ ├── ISyncMigrationActionCompletedHook.cs │ │ └── ISyncMigrationHook.cs │ ├── IServiceCollectionExtensions.cs │ ├── InteropHelper.cs │ └── Logging │ │ ├── INonGenericLogger.cs │ │ ├── NonGenericLoggerBase.cs │ │ └── NonGenericLoggerProvider.cs │ ├── JsonConverters │ ├── BuildResponseExceptionJsonConverter.cs │ ├── Constants.cs │ ├── ExceptionJsonConverter.cs │ ├── ExceptionJsonConverterFactory.cs │ ├── Exceptions │ │ ├── MismatchException.cs │ │ └── UnknownException.cs │ ├── FailedJobExceptionJsonConverter.cs │ ├── JobJsonConverter.cs │ ├── JsonReaderUtils.cs │ ├── JsonWriterUtils.cs │ ├── PythonExceptionConverter.cs │ ├── RestExceptionJsonConverter.cs │ ├── SerializableObjects │ │ ├── SerializableContentLocation.cs │ │ ├── SerializableContentReference.cs │ │ ├── SerializableEntryCollection.cs │ │ ├── SerializableException.cs │ │ ├── SerializableManifestEntry.cs │ │ └── SerializableMigrationManifest.cs │ ├── SerializedExceptionJsonConverter.cs │ ├── TableauInstanceTypeNotSupportedExceptionJsonConverter.cs │ └── TimeoutJobExceptionJsonConverter.cs │ ├── MemoryStreamManager.cs │ ├── MigrationCapabilities.cs │ ├── MigrationCompletionStatus.cs │ ├── MigrationResult.cs │ ├── MigrationSdk.cs │ ├── NameOf.cs │ ├── Net │ ├── DefaultHttpClient.cs │ ├── DefaultHttpResponseMessage.cs │ ├── Handlers │ │ ├── AuthenticationHttpHandler.cs │ │ ├── LoggingHttpHandler.cs │ │ ├── RequestCorrelationIdHeaderHttpHandler.cs │ │ └── UserAgentHeaderHttpHandler.cs │ ├── HttpContentExtensions.cs │ ├── HttpContentRequestBuilder.cs │ ├── HttpContentSerializer.cs │ ├── HttpDeleteRequestBuilder.cs │ ├── HttpGetRequestBuilder.cs │ ├── HttpPatchRequestBuilder.cs │ ├── HttpPostRequestBuilder.cs │ ├── HttpPutRequestBuilder.cs │ ├── HttpRequestBuilder.cs │ ├── HttpRequestBuilderFactory.cs │ ├── HttpStreamProcessor.cs │ ├── IHttpClient.cs │ ├── IHttpContentRequestBuilder.cs │ ├── IHttpContentSerializer.cs │ ├── IHttpDeleteRequestBuilder.cs │ ├── IHttpGetRequestBuilder.cs │ ├── IHttpPatchRequestBuilder.cs │ ├── IHttpPostRequestBuilder.cs │ ├── IHttpPutRequestBuilder.cs │ ├── IHttpRequestBuilder.cs │ ├── IHttpRequestBuilderFactory.cs │ ├── IHttpResponseMessage.cs │ ├── IHttpStreamProcessor.cs │ ├── INetworkTraceLogger.cs │ ├── INetworkTraceRedactor.cs │ ├── IQueryStringBuilder.cs │ ├── IRequestBuilder.cs │ ├── IRequestBuilderFactory.cs │ ├── IRequestBuilderFactoryInput.cs │ ├── IRequestBuilderFactoryInputInitializer.cs │ ├── IServiceCollectionExtensions.cs │ ├── ITableauSerializer.cs │ ├── IUserAgentProvider.cs │ ├── JsonOptions.cs │ ├── MediaTypeHeaderValueExtensions.cs │ ├── MediaTypes.cs │ ├── NetworkTraceLogger.cs │ ├── NetworkTraceRedactor.cs │ ├── ObjectExtensions.cs │ ├── QueryStringBuilder.cs │ ├── RequestBuilder.cs │ ├── RequestBuilderBase.cs │ ├── RequestBuilderFactory.cs │ ├── RequestBuilderFactoryInput.cs │ ├── Resilience │ │ ├── ClientThrottleStrategyBuilder.cs │ │ ├── IResilienceStrategyBuilder.cs │ │ ├── MaxConcurrencyStrategyBuilder.cs │ │ ├── RequestTimeoutStrategyBuilder.cs │ │ ├── ResilienceContextExtensions.cs │ │ ├── RetryStrategyBuilder.cs │ │ └── ServerThrottleStrategyBuilder.cs │ ├── Rest │ │ ├── Fields │ │ │ ├── Field.cs │ │ │ ├── FieldBuilder.cs │ │ │ └── IFieldBuilder.cs │ │ ├── Filtering │ │ │ ├── Filter.cs │ │ │ ├── FilterBuilder.cs │ │ │ ├── FilterOperator.cs │ │ │ └── IFilterBuilder.cs │ │ ├── GuidExtensions.cs │ │ ├── HttpRequestMessageExtensions.cs │ │ ├── IRestRequestBuilder.cs │ │ ├── IRestRequestBuilderFactory.cs │ │ ├── ListSortDirectionExtensions.cs │ │ ├── Paging │ │ │ ├── IPageBuilder.cs │ │ │ ├── Page.cs │ │ │ └── PageBuilder.cs │ │ ├── RestHeaders.cs │ │ ├── RestQueryBuilderBase.cs │ │ ├── RestRequestBuilder.cs │ │ ├── RestRequestBuilderFactory.cs │ │ ├── Sorting │ │ │ ├── ISortBuilder.cs │ │ │ ├── Sort.cs │ │ │ └── SortBuilder.cs │ │ └── UriExtensions.cs │ ├── Simulation │ │ ├── BaseUrlComparer.cs │ │ ├── IResponseSimulator.cs │ │ ├── IResponseSimulatorProvider.cs │ │ ├── MethodSimulator.cs │ │ ├── NullResponseSimulatorProvider.cs │ │ ├── Requests │ │ │ ├── IPathRequestMatcher.cs │ │ │ ├── IRequestMatcher.cs │ │ │ └── PathRequestMatcher.cs │ │ ├── Responses │ │ │ ├── EmptyResponseBuilder.cs │ │ │ ├── IResponseBuilder.cs │ │ │ ├── StaticStringResponseBuilder.cs │ │ │ └── TooManyRequestsResponseBuilder.cs │ │ ├── SimulationHttpHandler.cs │ │ └── UriExtensions.cs │ ├── StringExtensions.cs │ ├── TableauSerializer.cs │ └── UserAgentProvider.cs │ ├── ObjectExtensions.cs │ ├── Paging │ ├── BreadthFirstPathHierarchyPager.cs │ ├── IPageInfo.cs │ ├── IPagedResult.cs │ ├── IPager.cs │ ├── IndexedPagerBase.cs │ ├── MemoryPager.cs │ └── PagedResult.cs │ ├── PipelineProfile.cs │ ├── Properties │ ├── AssemblyInfo.cs │ ├── NUGET.md │ └── TableauLogoColor.png │ ├── Resources │ ├── AllUsersTranslations.cs │ ├── DefaultExternalAssetsProjectTranslations.cs │ ├── ISharedResourcesLocalizer.cs │ ├── SharedResourceKeys.cs │ ├── SharedResources.Designer.cs │ ├── SharedResources.resx │ └── SharedResourcesLocalizer.cs │ ├── Result.cs │ ├── ResultBuilder.cs │ ├── StreamExtensions.cs │ ├── StreamProcessorBase.cs │ ├── StringEnum.cs │ ├── Tableau.Migration.csproj │ ├── TableauInstanceType.cs │ ├── TableauInstanceTypeExtensions.cs │ ├── TableauInstanceTypeNotSupportedException.cs │ ├── TaskDelayer.cs │ ├── TaskExtensions.cs │ ├── TypeExtensions.cs │ ├── ValidationExtensions.cs │ └── packages.lock.json ├── tests ├── Python.ExampleApplication.Tests │ ├── Python.ExampleApplication.Tests.pyproj │ ├── README.md │ ├── pyproject.toml │ ├── pytest.ini │ ├── requirements.txt │ └── tests │ │ ├── __init__.py │ │ ├── helpers │ │ └── autofixture.py │ │ ├── test_default_project_filter.py │ │ └── test_log_migration_batches_hook.py ├── Python.TestApplication │ ├── .gitignore │ ├── .vscode │ │ └── settings.json │ ├── Python.TestApplication.pyproj │ ├── README.md │ ├── build.py │ ├── config.json │ ├── helper.py │ ├── main.py │ ├── migration_testcomponents_filters.py │ ├── migration_testcomponents_hooks.py │ ├── migration_testcomponents_mappings.py │ ├── migration_testcomponents_transformers.py │ ├── print_result.py │ ├── pyproject.toml │ ├── pytest.ini │ └── requirements.txt ├── Tableau.Migration.TestApplication │ ├── ActivityEnricher.cs │ ├── Config │ │ ├── DomainOptions.cs │ │ ├── EndpointOptions.cs │ │ ├── LogOptions.cs │ │ ├── SkipIdsOptions.cs │ │ ├── SpecialUsersOptions.cs │ │ └── TestApplicationOptions.cs │ ├── Hooks │ │ ├── ContentWithinSkippedLocationMapping.cs │ │ ├── LogMigrationBatchSummaryHook.cs │ │ ├── NonDomainUserFilter.cs │ │ ├── RemoveMissingDestinationUsersFromGroupsTransformer.cs │ │ ├── SaveManifestAfterBatchMigrationCompletedHook.cs │ │ ├── SkipByParentLocationFilter.cs │ │ ├── SkipFilter.cs │ │ ├── SkipIdsFilter.cs │ │ ├── SpecialUserFilter.cs │ │ ├── SpecialUserMapping.cs │ │ ├── TestTableauCloudUsernameMapping.cs │ │ ├── TestTableauCloudUsernameOptions.cs │ │ ├── TimeLoggerAfterActionHook.cs │ │ ├── UnlicensedUserFilter.cs │ │ ├── UnlicensedUserMapping.cs │ │ └── ViewerOwnerTransformer.cs │ ├── IServiceCollectionExtensions.cs │ ├── LogFileHelper.cs │ ├── MigrationSummaryBuilder.cs │ ├── Program.cs │ ├── README.md │ ├── SerilogExtensions.cs │ ├── Tableau.Migration.TestApplication.csproj │ ├── TestApplication.cs │ ├── appsettings.json │ └── packages.lock.json └── Tableau.Migration.Tests │ ├── AutoFixtureTestBase.cs │ ├── AutoFixtureTestBaseTests.cs │ ├── BaseUriComparer.cs │ ├── CultureNameTestDataAttribute.cs │ ├── CultureSilo.cs │ ├── EnumDataAttribute.cs │ ├── ExceptionComparerTests.cs │ ├── FixtureFactory.cs │ ├── HttpContentExtensions.cs │ ├── HttpMessageHandlerExtensions.cs │ ├── HttpRequestMessageExtensions.cs │ ├── HttpStatusCodeExtensions.cs │ ├── IContainerContentExtensions.cs │ ├── IDataSourceExtensions.cs │ ├── IEnumerableExtensions.cs │ ├── IEnumeratorExtensions.cs │ ├── IHttpResponseMessageExtensions.cs │ ├── IResultTests.cs │ ├── IServiceCollectionExtensions.cs │ ├── IServiceCollectionExtensionsTestBase.cs │ ├── ITagTypeComparer.cs │ ├── IViewReferenceTypeComparer.cs │ ├── IWorkbookConnectionComparer.cs │ ├── IWorkbookExtensions.cs │ ├── ImmutableCollectionSpecimenBuilder.cs │ ├── JsonExtensions.cs │ ├── MockExtensions.cs │ ├── MockHttpClient.cs │ ├── MockServiceProvider.cs │ ├── MockSharedResourcesLocalizer.cs │ ├── NullEmptyWhiteSpaceDataAttribute.cs │ ├── NullableGuidParseDataAttribute.cs │ ├── ObjectExtensions.cs │ ├── Reflection │ ├── ObjectReflectionWrapper.cs │ ├── SeekableCryptoStreamWrapper.cs │ └── TypeReflectionWrapper.cs │ ├── ReflectionExtensions.cs │ ├── RestExceptionExtensions.cs │ ├── ResultExtensions.cs │ ├── SimulatedConnectionComparer.cs │ ├── Simulation │ ├── MultiDestinationSimulationTestBase.cs │ ├── ServerToCloudSimulationTestBase.cs │ ├── ServerToServerSimulationTestBase.cs │ ├── SimulationTestBase.cs │ ├── SingleServerSimulationTestBase.cs │ ├── TableauDataExtensions.cs │ └── Tests │ │ ├── Api │ │ ├── ApiClientTestBase.cs │ │ ├── ApiClientTests.cs │ │ ├── CustomViewsApiClientTests.cs │ │ ├── DataSourcesApiClientTests.cs │ │ ├── GroupsApiClientTests.cs │ │ ├── JobsApiClientTests.cs │ │ ├── PermissionsContentApiClientTestBase.cs │ │ ├── ProjectsApiClientTests.cs │ │ ├── SchedulesApiClientTests.cs │ │ ├── SitesApiClientTests.cs │ │ ├── SubscriptionsApiClientTests.cs │ │ ├── TasksApiClientTests.cs │ │ ├── UsersApiClientTests.cs │ │ └── WorkbooksApiClientTests.cs │ │ ├── CustomViewsMigrationTests.cs │ │ ├── DataSourceMigrationTests.cs │ │ ├── ErrorHandlingTests.cs │ │ ├── ExtractRefreshTaskMigrationTests.cs │ │ ├── GroupMigrationTests.cs │ │ ├── HookTests.cs │ │ ├── IncrementalMigrationTests.cs │ │ ├── MigratorTests.cs │ │ ├── ProjectMigrationTests.cs │ │ ├── SimulatorFactoryTests.cs │ │ ├── SubscriptionMigrationTests.cs │ │ ├── UserMigrationTests.cs │ │ └── WorkbookMigrationTests.cs │ ├── StreamFactory.cs │ ├── StreamFactoryOptions.cs │ ├── StringEnumDataAttribute.cs │ ├── StringEnumGenerator.cs │ ├── Tableau.Migration.Tests.csproj │ ├── TagExtensions.cs │ ├── TestConfigFile.cs │ ├── TestConstants.cs │ ├── TestContentType.cs │ ├── TestFileContentType.cs │ ├── TestHttpStreamProcessor.cs │ ├── TestLogger.cs │ ├── TestLoggerFactory.cs │ ├── TestLoggerMessage.cs │ ├── TestPagedTableauServerResponse.cs │ ├── TestPlanOptions.cs │ ├── TestPublishType.cs │ ├── TestSharedResourcesLocalizer.cs │ ├── TestTableauServerResponse.cs │ ├── TypeExtensionTests.cs │ ├── Unit │ ├── Api │ │ ├── ApiClientTestBase.cs │ │ ├── ApiClientTestDependencies.cs │ │ ├── ApiClientTests.cs │ │ ├── ApiListPagerTests.cs │ │ ├── ApiPageAccessorTestBase.cs │ │ ├── ApiTestBase.cs │ │ ├── AuthenticationConfigurationsApiClientTests.cs │ │ ├── AuthenticationTokenProviderTests.cs │ │ ├── CustomViewsApiClientTests.cs │ │ ├── DataSourcesApiClientTests.cs │ │ ├── EmbeddedCredentials │ │ │ ├── EmbeddedCredentialsApiClientFactoryTests.cs │ │ │ └── EmbeddedCredentialsApiClientTests.cs │ │ ├── FlowsApiClientTests.cs │ │ ├── GroupsApiClientTests.cs │ │ ├── IApiClientTestDependencies.cs │ │ ├── IContentCacheFactoryExtensions.cs │ │ ├── IContentFileStoreExtensionsTests.cs │ │ ├── IContentReferenceFinderFactoryExtensionsTests.cs │ │ ├── IHttpRequestBuilderExtensionsTests.cs │ │ ├── IHttpResponseMessageExtensionsTests.cs │ │ ├── IServiceCollectionExtensionsTests.cs │ │ ├── JobsApiClientTests.cs │ │ ├── Labels │ │ │ └── LabelsApiClientTests.cs │ │ ├── MockExtensions.cs │ │ ├── Models │ │ │ ├── ApplyKeychainOptionsTests.cs │ │ │ ├── Cloud │ │ │ │ └── CreateSubscriptionOptionsTests.cs │ │ │ ├── CreateProjectOptionsTests.cs │ │ │ ├── DestinationSiteInfoTests.cs │ │ │ ├── FailedJobExceptionTests.cs │ │ │ ├── FileDownloadTests.cs │ │ │ ├── IUserExtensionsTests.cs │ │ │ ├── ImportJobTests.cs │ │ │ ├── KeychainUserMappingTests.cs │ │ │ ├── PagedTableauServerResponseTests.cs │ │ │ ├── PublishCustomViewOptionsTests.cs │ │ │ ├── PublishDataSourceOptionsTests.cs │ │ │ ├── PublishFlowOptionsTests.cs │ │ │ ├── PublishWorkbookOptionsTests.cs │ │ │ ├── SignInRequestTests.cs │ │ │ ├── SignInResultTests.cs │ │ │ ├── TimeoutJobExceptionTests.cs │ │ │ └── UpdateProjectResultTests.cs │ │ ├── PagedListApiClientTestBase.cs │ │ ├── Permissions │ │ │ ├── DefaultPermissionsApiClientTests.cs │ │ │ ├── PermissionsApiClientFactoryTests.cs │ │ │ ├── PermissionsApiClientTests.cs │ │ │ └── PermissionsContentApiClientTestBase.cs │ │ ├── ProjectsApiClientTests.cs │ │ ├── Publishing │ │ │ ├── CustomViewPublisherTests.cs │ │ │ ├── DataSourcePublisherTests.cs │ │ │ ├── FilePublisherBaseTests.cs │ │ │ ├── FilePublisherTestBase.cs │ │ │ ├── FlowPublisherTests.cs │ │ │ └── WorkbookPublisherTests.cs │ │ ├── Rest │ │ │ ├── ContentItemUriBuilderBaseTests.cs │ │ │ ├── Models │ │ │ │ ├── AddUserResultTests.cs │ │ │ │ ├── CreateProjectRequestTests.cs │ │ │ │ ├── CreateProjectResponseTests.cs │ │ │ │ ├── CustomViewResponseTests.cs │ │ │ │ ├── CustomViewsResponseTests.cs │ │ │ │ ├── ErrorTests.cs │ │ │ │ ├── IProjectTypeExtensionsTests.cs │ │ │ │ ├── ITagTypeComparer.cs │ │ │ │ ├── IUserTypeExtensionsTests.cs │ │ │ │ ├── ImportUsersFromCsvRequestTests.cs │ │ │ │ ├── LabelContentTypesTests.cs │ │ │ │ ├── ModelTests.cs │ │ │ │ ├── PagedTableauServerResponseTests.cs │ │ │ │ ├── PublishFlowOptionsTests.cs │ │ │ │ ├── Requests │ │ │ │ │ ├── AddTagsRequestTests.cs │ │ │ │ │ ├── AddUserToSiteRequestTests.cs │ │ │ │ │ ├── ApplyKeychainRequestTests.cs │ │ │ │ │ ├── Cloud │ │ │ │ │ │ ├── CreateSubscriptionRequestTests.cs │ │ │ │ │ │ └── UpdateSubscriptionRequestTests.cs │ │ │ │ │ ├── CommitDataSourcePublishRequestTests.cs │ │ │ │ │ ├── CommitFlowPublishRequestTests.cs │ │ │ │ │ ├── CommitWorkbookPublishRequestTests.cs │ │ │ │ │ ├── RetrieveKeychainRequestTests.cs │ │ │ │ │ ├── RetrieveUserSavedCredentialsRequestTests.cs │ │ │ │ │ ├── UpdateConnectionRequestTests.cs │ │ │ │ │ ├── UpdateCustomViewRequestTests.cs │ │ │ │ │ ├── UpdateProjectRequestTests.cs │ │ │ │ │ ├── UpdateSiteRequestTests.cs │ │ │ │ │ ├── UpdateUserRequestTests.cs │ │ │ │ │ └── UploadUserSavedCredentialsRequestTests.cs │ │ │ │ ├── Responses │ │ │ │ │ ├── Cloud │ │ │ │ │ │ ├── CreateSubscriptionResponseTests.cs │ │ │ │ │ │ ├── ExtractRefreshTasksResponseTests.cs │ │ │ │ │ │ ├── GetSubscriptionsResponseTests.cs │ │ │ │ │ │ └── UpdateSubscriptionResponseTests.cs │ │ │ │ │ ├── CustomViewAsUsersDefaultViewResponseTest.cs │ │ │ │ │ ├── RetrieveKeychainResponseTests.cs │ │ │ │ │ ├── Server │ │ │ │ │ │ ├── ExtractRefreshTasksResponseTests.cs │ │ │ │ │ │ ├── GetSubscriptionsResponseTests.cs │ │ │ │ │ │ └── ScheduleExtractRefreshTasksResponseTests.cs │ │ │ │ │ └── SiteAuthConfigurationResponseTests.cs │ │ │ │ ├── RestProjectBuilderPagerTests.cs │ │ │ │ ├── RestProjectBuilderTests.cs │ │ │ │ ├── RestProjectResponsePagerTests.cs │ │ │ │ ├── RetrieveUserSavedCredentialsResponseTests.cs │ │ │ │ ├── ServerInfoResponseTests.cs │ │ │ │ ├── SignInRequestTests.cs │ │ │ │ ├── SignInResponseTests.cs │ │ │ │ ├── SiteResponseTests.cs │ │ │ │ ├── SiteRoleMappingTests.cs │ │ │ │ ├── TableauServerResponseTests.cs │ │ │ │ ├── UpdateCustomViewResponseTests.cs │ │ │ │ ├── UpdateUserResultTests.cs │ │ │ │ ├── UsersWithCustomViewAsDefaultViewResponseTests.cs │ │ │ │ ├── WorkbookResponseTests.cs │ │ │ │ └── WorkbooksResponseTests.cs │ │ │ ├── PermissionsUriBuilderTests.cs │ │ │ ├── RestExceptionTests.cs │ │ │ ├── RestUrlKeywordsTests.cs │ │ │ ├── RestUrlPrefixesTests.cs │ │ │ └── TagsUriBuilderTests.cs │ │ ├── SchedulesApiClientTests.cs │ │ ├── ScopedApiClientFactoryTests.cs │ │ ├── Search │ │ │ ├── ApiContentCacheTests.cs │ │ │ ├── ApiContentReferenceFinderFactoryTests.cs │ │ │ └── BulkApiContentReferenceCacheTests.cs │ │ ├── SerializationTestBase.cs │ │ ├── ServerSessionProviderTests.cs │ │ ├── Simulation │ │ │ ├── Rest │ │ │ │ └── Net │ │ │ │ │ ├── Requests │ │ │ │ │ ├── RestUrlPatternsTests.cs │ │ │ │ │ └── UriExtensionsTests.cs │ │ │ │ │ └── Responses │ │ │ │ │ ├── ResponseBuilderTestBase.cs │ │ │ │ │ ├── RestGetByIdResponseBuilderTests.cs │ │ │ │ │ ├── RestPagedListResponseBuilderTests.cs │ │ │ │ │ ├── RestPermissionsCreateResponseBuilderTests.cs │ │ │ │ │ └── RestPostEntityResponseBuilderTests.cs │ │ │ └── TableauApiSimulatorFactoryTests.cs │ │ ├── SiteApiTestBase.cs │ │ ├── SitesApiClientTests.cs │ │ ├── SubscriptionsApiClientTests.cs │ │ ├── TableauServerVersionProviderTests.cs │ │ ├── TableauSiteConnectionConfigurationTests.cs │ │ ├── Tags │ │ │ ├── TagsApiClientFactoryTests.cs │ │ │ └── TagsApiClientTests.cs │ │ ├── TasksApiClientTests.cs │ │ ├── UsersApiClientTests.cs │ │ ├── ViewsApiClientFactoryTests.cs │ │ ├── ViewsApiClientTest.cs │ │ └── WorkbooksApiClientTests.cs │ ├── AsyncDisposableResultTests.cs │ ├── AutoFixtureExtensions.cs │ ├── ConcurrentDictionaryExtensionsTests.cs │ ├── Config │ │ ├── ConfigReaderTests.cs │ │ ├── ConfigurationTestContext.cs │ │ ├── ConfigurationTests.cs │ │ ├── DefaultPermissionsContentTypeOptionsTests.cs │ │ ├── FileOptionsTests.cs │ │ ├── MigrationSdkOptionsTests.cs │ │ ├── PreflightOptionsTests.cs │ │ └── UniqueContentTypesValidatorTests.cs │ ├── Content │ │ ├── AuthenticationConfigurationTests.cs │ │ ├── ContentBaseTests.cs │ │ ├── ContentLocationComparerTests.cs │ │ ├── ContentReferenceStubTests.cs │ │ ├── CustomViewTests.cs │ │ ├── DataSourceDetailsTests.cs │ │ ├── DataSourceTests.cs │ │ ├── EmbeddedCredentialKeychainResultTests.cs │ │ ├── Files │ │ │ ├── Aes256EncryptionFactoryTests.cs │ │ │ ├── ContentFileHandleTests.cs │ │ │ ├── ContentFileStoreTestBase.cs │ │ │ ├── ContentFileStreamTests.cs │ │ │ ├── ContentTypeDirectoryNamesTests.cs │ │ │ ├── ContentTypeFilePathResolverTests.cs │ │ │ ├── ContentTypeFilePrefixesTests.cs │ │ │ ├── DirectoryContentFileStoreTestBase.cs │ │ │ ├── DirectoryContentFileStoreTests.cs │ │ │ ├── EncryptedFileHandleTests.cs │ │ │ ├── EncryptedFileStoreTests.cs │ │ │ ├── EncryptedFileStreamTests.cs │ │ │ ├── IContentFileStoreTests.cs │ │ │ ├── MemoryContentFileStore.cs │ │ │ ├── MockXmlFileHandle.cs │ │ │ ├── SeekableCryptoStreamTests.cs │ │ │ ├── TableauFileEditorTests.cs │ │ │ ├── TableauFileXmlStreamTests.cs │ │ │ ├── TemporaryDirectoryContentFileStoreTests.cs │ │ │ ├── WritableMemoryContentFileStream.cs │ │ │ └── Xml │ │ │ │ ├── XContainerExtensionsTests.cs │ │ │ │ ├── XElementExtensionsTests.cs │ │ │ │ ├── XFeatureFlagNameTests.cs │ │ │ │ └── XNameExtensionsTests.cs │ │ ├── FlowTests.cs │ │ ├── GroupTests.cs │ │ ├── IConnectionsContentTests.cs │ │ ├── IUserTests.cs │ │ ├── MappableContainerContentBaseTests.cs │ │ ├── Permissions │ │ │ ├── GranteeCapabilityTests.cs │ │ │ ├── GranteeCapabilityTypeExtensions.cs │ │ │ ├── IGranteeCapabilityComparer.cs │ │ │ └── IPermissionsComparer.cs │ │ ├── ProjectTests.cs │ │ ├── PublishableCustomViewTests.cs │ │ ├── PublishableFlowTests.cs │ │ ├── Schedules │ │ │ ├── Cloud │ │ │ │ ├── CloudExtractRefreshTaskTests.cs │ │ │ │ └── CloudScheduleValidatorTests.cs │ │ │ ├── ExtractRefreshTaskTestBase.cs │ │ │ ├── ExtractRefreshTestCaches.cs │ │ │ ├── IFrequencyExtensionsTests.cs │ │ │ ├── IntervalComparerTests.cs │ │ │ ├── ScheduleTestBase.cs │ │ │ ├── Server │ │ │ │ ├── ScheduleExtractRefreshTaskTests.cs │ │ │ │ ├── ScheduleExtractRefreshTasksTests.cs │ │ │ │ ├── ServerExtractRefreshTaskTests.cs │ │ │ │ └── ServerScheduleValidatorTests.cs │ │ │ └── VolatileCacheTests.cs │ │ ├── Search │ │ │ ├── CachedContentReferenceFinderTests.cs │ │ │ └── ContentReferenceCacheBaseTests.cs │ │ ├── ServerSessionSettingsTests.cs │ │ ├── ServerSessionTests.cs │ │ ├── SiteSettingUpdateTests.cs │ │ ├── SiteTests.cs │ │ ├── TagLabelComparerTests.cs │ │ ├── TagTests.cs │ │ ├── UserAuthenticationTypeTests.cs │ │ ├── UserTests.cs │ │ ├── UsernameContentBaseTests.cs │ │ └── WorkbookDetailsTests.cs │ ├── ContentClients │ │ ├── ApiContentClientFactoryTests.cs │ │ ├── ViewsContentClientTests.cs │ │ └── WorkbooksContentClientTests.cs │ ├── ContentLocationTests.cs │ ├── CsvExtensionsTests.cs │ ├── DateTimeExtensionsTests.cs │ ├── Engine │ │ ├── Actions │ │ │ ├── MigrateContentActionTests.cs │ │ │ ├── MigrationActionResultTests.cs │ │ │ └── PreflightActionTests.cs │ │ ├── Conversion │ │ │ ├── DirectContentItemConverterTests.cs │ │ │ ├── ExtractRefreshTasks │ │ │ │ └── ServerToCloudExtractRefreshTaskConverterTests.cs │ │ │ ├── Schedules │ │ │ │ └── ServerToCloudScheduleConverterTests.cs │ │ │ └── Subscriptions │ │ │ │ └── ServerToCloudSubscriptionConverterTests.cs │ │ ├── Endpoints │ │ │ ├── MigrationEndpointFactoryTests.cs │ │ │ ├── Search │ │ │ │ ├── BulkApiAuthenticationConfigurationsCacheTests.cs │ │ │ │ ├── BulkCacheTest.cs │ │ │ │ ├── BulkDestinationCacheTest.cs │ │ │ │ ├── BulkDestinationCacheTests.cs │ │ │ │ ├── BulkDestinationProjectCacheTests.cs │ │ │ │ ├── ManifestDestinationContentReferenceFinderFactoryTests.cs │ │ │ │ ├── ManifestDestinationContentReferenceFinderTests.cs │ │ │ │ ├── ManifestSourceContentReferenceFinderFactoryTests.cs │ │ │ │ ├── ManifestSourceContentReferenceFinderTests.cs │ │ │ │ └── UserSavedCredentialsCacheTests.cs │ │ │ ├── TableauApiDestinationEndpointTests.cs │ │ │ ├── TableauApiEndpointBaseTests.cs │ │ │ ├── TableauApiEndpointConfigurationTests.cs │ │ │ ├── TableauApiEndpointTestBase.cs │ │ │ └── TableauApiSourceEndpointTests.cs │ │ ├── Hooks │ │ │ ├── CallbackHookWrapperTests.cs │ │ │ ├── ContentTypeHookBuilderBaseTests.cs │ │ │ ├── EmbeddedCredentialsCapabilityManagerTests.cs │ │ │ ├── Filters │ │ │ │ ├── ContentFilterBaseTests.cs │ │ │ │ ├── ContentFilterBuilderTests.cs │ │ │ │ ├── ContentFilterRunnerTests.cs │ │ │ │ ├── ContentLocationInPathCriterionTests.cs │ │ │ │ └── Default │ │ │ │ │ ├── GroupAllUsersFilterOptionsTests.cs │ │ │ │ │ ├── GroupAllUsersFilterTests.cs │ │ │ │ │ ├── PreviouslyMigratedFilterTests.cs │ │ │ │ │ ├── ProjectSystemOwnershipFilterTests.cs │ │ │ │ │ └── UserSiteRoleSupportUserFilterTests.cs │ │ │ ├── InitializeMigration │ │ │ │ └── Default │ │ │ │ │ ├── EmbeddedCredentialsPreflightCheckTests.cs │ │ │ │ │ ├── InitializeMigrationCapabilityHookBaseTests.cs │ │ │ │ │ └── SubscriptionsPreflightCheckTests.cs │ │ │ ├── InitializeMigrationHookResultTests.cs │ │ │ ├── Mappings │ │ │ │ ├── ContentMappingBaseTests.cs │ │ │ │ ├── ContentMappingBuilderTests.cs │ │ │ │ ├── ContentMappingContextTests.cs │ │ │ │ ├── ContentMappingRunnerTests.cs │ │ │ │ └── Default │ │ │ │ │ ├── AuthenticationTypeDomainMappingBaseTests.cs │ │ │ │ │ ├── AuthenticationTypeDomainMappingTests.cs │ │ │ │ │ ├── CallbackAuthenticationTypeDomainMappingTests.cs │ │ │ │ │ └── TableauCloudUsernameMappingTests.cs │ │ │ ├── MigrationHookBuilderBaseTests.cs │ │ │ ├── MigrationHookBuilderTests.cs │ │ │ ├── MigrationHookFactoryCollectionTests.cs │ │ │ ├── MigrationHookFactoryTests.cs │ │ │ ├── MigrationHookRunnerTests.cs │ │ │ ├── PostPublish │ │ │ │ ├── BulkPostPublishContextTests.cs │ │ │ │ ├── ContentItemPostPublishContextTests.cs │ │ │ │ └── Default │ │ │ │ │ ├── ChildItemsPermissionsPostPublishHookTests.cs │ │ │ │ │ ├── EmbeddedCredentialsItemPostPublishHookTests.cs │ │ │ │ │ ├── OwnerItemPostPublishHookTests.cs │ │ │ │ │ ├── PermissionPostPublishHookBaseTests.cs │ │ │ │ │ ├── PermissionsItemPostPublishHookTests.cs │ │ │ │ │ ├── ProjectPostPublishHookTests.cs │ │ │ │ │ └── TagItemPostPublishHookTests.cs │ │ │ ├── SubscriptionsCapabilityManagerTests.cs │ │ │ └── Transformers │ │ │ │ ├── ContentTransformerBuilderTests.cs │ │ │ │ ├── ContentTransformerRunnerTests.cs │ │ │ │ ├── Default │ │ │ │ ├── CustomViewDefaultUserReferencesTransformerTests.cs │ │ │ │ ├── EncryptExtractTransformerTests.cs │ │ │ │ ├── GroupUsersTransformerTests.cs │ │ │ │ ├── MappedReferenceExtractRefreshTaskTransformerTests.cs │ │ │ │ ├── MappedUserTransformerTests.cs │ │ │ │ ├── OwnershipTransformerTests.cs │ │ │ │ ├── PermissionsTransformerTests.cs │ │ │ │ ├── TableauServerConnectionUrlTransformerTests.cs │ │ │ │ ├── UserTableauCloudAuthenticationTypeTransformerTests.cs │ │ │ │ ├── UserTableauCloudSiteRoleTransformerTests.cs │ │ │ │ └── WorkbookReferenceTransformerTests.cs │ │ │ │ ├── IXmlContentTransformerTests.cs │ │ │ │ └── XmlContentTransformerBaseTests.cs │ │ ├── IMigrationExtensionsTests.cs │ │ ├── IServiceCollectionExtensionsTests.cs │ │ ├── Manifest │ │ │ ├── IMigrationManifestEditorTests.cs │ │ │ ├── LoggingMigrationManifestTests.cs │ │ │ ├── MigrationManifestContentTypePartitionTests.cs │ │ │ ├── MigrationManifestEntryCollectionTests.cs │ │ │ ├── MigrationManifestEntryTests.cs │ │ │ ├── MigrationManifestFactoryTests.cs │ │ │ ├── MigrationManifestSerializerTests.cs │ │ │ └── MigrationManifestTests.cs │ │ ├── MigrationDirectoryContentFileStoreTests.cs │ │ ├── MigrationInputTests.cs │ │ ├── MigrationPlanBuilderFactoryTests.cs │ │ ├── MigrationPlanBuilderTests.cs │ │ ├── MigrationTests.cs │ │ ├── Migrators │ │ │ ├── Batch │ │ │ │ ├── BulkPublishContentBatchMigratorTests.cs │ │ │ │ ├── ContentBatchMigrationResultTests.cs │ │ │ │ ├── ContentBatchMigratorBaseTests.cs │ │ │ │ ├── ContentBatchMigratorTestBase.cs │ │ │ │ ├── ContentMigrationBatchTests.cs │ │ │ │ ├── ItemPublishContentBatchMigratorTests.cs │ │ │ │ ├── ParallelContentBatchMigratorBatchBaseTests.cs │ │ │ │ └── ParallelContentBatchMigratorBatchTestBase.cs │ │ │ ├── ContentItemMigrationResultTests.cs │ │ │ ├── ContentMigratorTests.cs │ │ │ └── MigratorTests.cs │ │ ├── Options │ │ │ ├── MigrationPlanOptionsBuilderTests.cs │ │ │ ├── MigrationPlanOptionsCollectionTests.cs │ │ │ └── MigrationPlanOptionsProviderTests.cs │ │ ├── Pipelines │ │ │ ├── CustomMigrationPipelineFactoryTests.cs │ │ │ ├── MigrationPipelineBaseTests.cs │ │ │ ├── MigrationPipelineContentTypeExtensionsTests.cs │ │ │ ├── MigrationPipelineContentTypeTests.cs │ │ │ ├── MigrationPipelineFactoryTests.cs │ │ │ ├── MigrationPipelineRunnerTests.cs │ │ │ ├── MigrationPipelineTestBase.cs │ │ │ ├── ServerToCloudMigrationPipelineTests.cs │ │ │ ├── TestAction.cs │ │ │ └── TestPipeline.cs │ │ ├── Preparation │ │ │ ├── ContentItemPreparerBaseTests.cs │ │ │ ├── ContentItemPreparerTestBase.cs │ │ │ ├── EndpointContentItemPreparerTests.cs │ │ │ └── SourceContentItemPreparerTests.cs │ │ └── ServerToCloudMigrationPlanBuilderTests.cs │ ├── ExceptionExtensionsTests.cs │ ├── FilePathTests.cs │ ├── GuardTests.cs │ ├── HttpClientExtensions.cs │ ├── IContentReferenceFinderFactoryExtensions.cs │ ├── IEnumerableExtensionsTests.cs │ ├── IHttpClientExtensions.cs │ ├── ILoggerTests.cs │ ├── IServiceCollectionExtensionsTests.cs │ ├── InheritedTypeComparerTests.cs │ ├── Interop │ │ ├── Hooks │ │ │ ├── ISyncContentBatchMigrationCompletedHookTests.cs │ │ │ ├── ISyncMigrationActionCompletedHookTests.cs │ │ │ └── ISyncMigrationHookTests.cs │ │ └── IServiceCollectionExtensionsTests.cs │ ├── JsonConverter │ │ ├── SerializableObjects │ │ │ ├── TestSerializableContentLocation.cs │ │ │ ├── TestSerializableContentReference.cs │ │ │ └── TestSerializableManifestEntry.cs │ │ └── SerializedExceptionJsonConverterTests.cs │ ├── LoggingServiceCollectionExtensionsTests.cs │ ├── MigrationCapabilitiesTests.cs │ ├── MigrationSdkTests.cs │ ├── MockHttpResponseMessage.cs │ ├── MockHttpResponseMessageExtensions.cs │ ├── MockIHttpClientExtensions.cs │ ├── NameOfTests.cs │ ├── Net │ │ ├── DefaultHttpClientTests.cs │ │ ├── Handlers │ │ │ ├── AuthenticationHttpHandlerTests.cs │ │ │ ├── LoggingHttpHandlerTests.cs │ │ │ ├── MockDelegatingHandler.cs │ │ │ └── UserAgentHeaderHttpHandlerTests.cs │ │ ├── HttpContentExtensionsTests.cs │ │ ├── HttpContentRequestBuilderTests.cs │ │ ├── HttpContentSerializerTests.cs │ │ ├── HttpDeleteRequestBuilderTests.cs │ │ ├── HttpGetRequestBuilderTests.cs │ │ ├── HttpPatchRequestBuilderTests.cs │ │ ├── HttpPostRequestBuilderTests.cs │ │ ├── HttpPutRequestBuilderTests.cs │ │ ├── HttpRequestBuilderFactoryTests.cs │ │ ├── HttpRequestBuilderTests.cs │ │ ├── HttpStreamProcessorTests.cs │ │ ├── IServiceCollectionExtensionsTests.cs │ │ ├── MediaTypeHeaderValueExtensionsTests.cs │ │ ├── NetworkTraceLoggerTests.cs │ │ ├── NetworkTraceRedactorTests.cs │ │ ├── QueryStringBuilderTests.cs │ │ ├── RequestBuilderTests.cs │ │ ├── Resilience │ │ │ ├── ClientThrottleStrategyBuilderTests.cs │ │ │ ├── MaxConcurrentStrategyBuilderTests.cs │ │ │ ├── RequestTimeoutStrategyBuilderTests.cs │ │ │ ├── ResilienceContextExtensions.cs │ │ │ ├── ResilienceStrategyTestBase.cs │ │ │ ├── RetryStrategyBuilderTests.cs │ │ │ └── ServerThrottleStrategyBuilderTests.cs │ │ ├── Rest │ │ │ ├── Fields │ │ │ │ ├── FieldBuilderTests.cs │ │ │ │ └── FieldTests.cs │ │ │ ├── Filtering │ │ │ │ ├── FilterBuilderTests.cs │ │ │ │ ├── FilterOperatorTests.cs │ │ │ │ └── FilterTests.cs │ │ │ ├── GuidExtensionsTests.cs │ │ │ ├── HttpRequestMessageExtensionsTests.cs │ │ │ ├── IRestRequestBuilderTests.cs │ │ │ ├── Paging │ │ │ │ ├── PageBuilderTests.cs │ │ │ │ └── PageTests.cs │ │ │ ├── RestRequestBuilderFactoryTests.cs │ │ │ ├── RestRequestBuilderTests.cs │ │ │ └── Sorting │ │ │ │ ├── SortBuilderTests.cs │ │ │ │ └── SortTests.cs │ │ ├── TableauSerializerTests.cs │ │ ├── UriExtensionsTests.cs │ │ └── UserAgentProviderTests.cs │ ├── ObjectExtensionsTests.cs │ ├── OptionsHookTestBase.cs │ ├── Paging │ │ ├── BreadthFirstPathHierarchyPagerTests.cs │ │ ├── IPagerTests.cs │ │ ├── IndexedPagerBaseTests.cs │ │ ├── MemoryPagerTests.cs │ │ └── PagedResultTests.cs │ ├── Resources │ │ ├── AllUsersTranslationsTests.cs │ │ └── ISharedResourcesLocalizerTests.cs │ ├── ResultBuilderTests.cs │ ├── ResultTests.cs │ ├── StreamExtensionsTests.cs │ ├── StringEnumTests.cs │ ├── TaskExtensionsTests.cs │ ├── TypeExtensionsTests.cs │ └── ValidationExtensionsTests.cs │ ├── ValuesAttribute.cs │ └── packages.lock.json └── tools ├── Tableau.Migration.CleanServer ├── GlobalSuppressions.cs ├── Program.cs ├── Tableau.Migration.CleanSite.csproj ├── clean-site-settings.json └── packages.lock.json ├── Tableau.Migration.ManifestAnalyzer ├── ExceptionComparer.cs ├── HtmlTemplate.cs ├── ManifestAnalyzer.cs ├── ManifestAnalyzerIcon.ico ├── ManifestAnalyzerOptions.cs ├── OpenWithManifestAnalyzer.ps1 ├── Program.cs ├── README.md ├── Tableau.Migration.ManifestAnalyzer.csproj ├── appsettings.json └── packages.lock.json ├── Tableau.Migration.ManifestExplorer.Browser ├── Program.cs ├── Properties │ └── AssemblyInfo.cs ├── Tableau.Migration.ManifestExplorer.Browser.csproj └── wwwroot │ ├── app.css │ ├── favicon.ico │ ├── index.html │ └── main.js ├── Tableau.Migration.ManifestExplorer.Desktop ├── ManifestExplorerIcon.ico ├── OpenWithManifestExplorer.ps1 ├── Program.cs ├── README.md ├── Tableau.Migration.ManifestExplorer.Desktop.csproj ├── app.manifest └── packages.lock.json └── Tableau.Migration.ManifestExplorer ├── App.axaml ├── App.axaml.cs ├── Assets ├── ManifestExplorer.ico ├── StartImage.png └── avalonia-logo.ico ├── Converters └── InverseBooleanConverter.cs ├── Tableau.Migration.ManifestExplorer.csproj ├── ViewModels ├── DesignExceptionListDialogViewModel.cs ├── DesignMainViewModel.cs ├── DesignManifestViewModel.cs ├── ExceptionListDialogViewModel.cs ├── IShowExceptionListDialogViewModel.cs ├── MainViewModel.cs ├── ManifestEntryPageViewModel.cs ├── ManifestEntryViewModel.cs ├── ManifestPartitionViewModel.cs ├── ManifestViewModel.cs └── ViewModelBase.cs ├── Views ├── ExceptionListDialog.axaml ├── ExceptionListDialog.axaml.cs ├── MainView.axaml ├── MainView.axaml.cs ├── MainWindow.axaml ├── MainWindow.axaml.cs ├── ManifestView.axaml └── ManifestView.axaml.cs └── packages.lock.json /.config/dotnet-tools.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 1, 3 | "isRoot": true, 4 | "tools": { 5 | "docfx": { 6 | "version": "2.78.3", 7 | "commands": [ 8 | "docfx" 9 | ], 10 | "rollForward": false 11 | }, 12 | "dotnet-reportgenerator-globaltool": { 13 | "version": "5.4.7", 14 | "commands": [ 15 | "reportgenerator" 16 | ], 17 | "rollForward": false 18 | } 19 | } 20 | } -------------------------------------------------------------------------------- /.github/.secrets.default: -------------------------------------------------------------------------------- 1 | # This file is used to test github actions locally using act (https://github.com/nektos/act?tab=readme-ov-file) 2 | # Copy/Paste and rename to .secrets and fill in the values 3 | # Then use it via act cli or VSCode extension https://sanjulaganepola.github.io/github-local-actions-docs/ 4 | 5 | NUGET_PUBLISH_API_KEY= 6 | PYPI_PUBLISH_USER_PASS= -------------------------------------------------------------------------------- /.github/actions/setup-dotnet/action.yml: -------------------------------------------------------------------------------- 1 | name: Setup .NET 2 | description: 'Setup .NET' 3 | 4 | env: 5 | DOTNET_NOLOGO: 'true' 6 | 7 | runs: 8 | using: "composite" 9 | steps: 10 | - name: nuget Cache 11 | uses: actions/cache@v4 12 | with: 13 | path: ~/.nuget/packages 14 | key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }} 15 | restore-keys: | 16 | ${{ runner.os }}-nuget- 17 | - name: Setup .NET 8.0 18 | uses: actions/setup-dotnet@v4 19 | with: 20 | dotnet-version: 8.0.x 21 | - name: Setup .NET 9.0 22 | uses: actions/setup-dotnet@v4 23 | with: 24 | dotnet-version: 9.0.x -------------------------------------------------------------------------------- /.github/release.yaml: -------------------------------------------------------------------------------- 1 | changelog: 2 | exclude: 3 | labels: 4 | - internal 5 | categories: 6 | - title: Breaking Changes 7 | labels: 8 | - breaking-change 9 | - title: New Features 10 | labels: 11 | - feature 12 | - title: Fixes 13 | labels: 14 | - fix 15 | - title: Documentation 16 | labels: 17 | - documentation 18 | - title: Other Changes 19 | labels: 20 | - "*" -------------------------------------------------------------------------------- /CODEOWNERS: -------------------------------------------------------------------------------- 1 | # Comment line immediately above ownership line is reserved for related other information. Please be careful while editing. 2 | #ECCN:Open Source 5D002 3 | -------------------------------------------------------------------------------- /Directory.Build.props: -------------------------------------------------------------------------------- 1 | 2 | 3 | preview 4 | enable 5 | true 6 | true 7 | 5.2.0 8 | Salesforce, Inc. 9 | Salesforce, Inc. 10 | Copyright (c) 2025, Salesforce, Inc. and its licensors 11 | Apache-2.0 12 | 11.3.0 13 | 14 | 18 | true 19 | 20 | 21 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | ## Security 2 | 3 | Please report any security issue to [security@salesforce.com](mailto:security@salesforce.com) 4 | as soon as it is discovered. This library limits its runtime dependencies in 5 | order to reduce the total cost of ownership as much as can be, but all consumers 6 | should remain vigilant and have their security stakeholders review all third-party 7 | products (3PP) like this one and their dependencies. -------------------------------------------------------------------------------- /examples/Csharp.ExampleApplication/Config/EndpointOptions.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Tableau.Migration.Api; 3 | 4 | #region namespace 5 | 6 | namespace Csharp.ExampleApplication.Config 7 | { 8 | public class EndpointOptions 9 | { 10 | public Uri ServerUrl { get; set; } = TableauSiteConnectionConfiguration.Empty.ServerUrl; 11 | 12 | public string SiteContentUrl { get; set; } = string.Empty; 13 | 14 | public string AccessTokenName { get; set; } = string.Empty; 15 | 16 | // Access token configuration should use a secure configuration system. 17 | public string AccessToken { get; set; } = string.Empty; 18 | } 19 | } 20 | 21 | #endregion -------------------------------------------------------------------------------- /examples/Csharp.ExampleApplication/Config/MyMigrationApplicationOptions.cs: -------------------------------------------------------------------------------- 1 | #region namespace 2 | namespace Csharp.ExampleApplication.Config 3 | { 4 | public sealed class MyMigrationApplicationOptions 5 | { 6 | public EndpointOptions Source { get; set; } = new(); 7 | 8 | public EndpointOptions Destination { get; set; } = new(); 9 | } 10 | } 11 | #endregion -------------------------------------------------------------------------------- /examples/Csharp.ExampleApplication/Csharp.ExampleApplication.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | Exe 4 | net8.0;net9.0 5 | 6 | CA2007,IDE0073 7 | 8368baab-103b-45f6-bfb1-f89a537f4f3c 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | Always 18 | 19 | 20 | Always 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /examples/Csharp.ExampleApplication/Hooks/Filters/DefaultProjectsFilter.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Extensions.Logging; 2 | using Tableau.Migration.Content; 3 | using Tableau.Migration.Engine; 4 | using Tableau.Migration.Engine.Hooks.Filters; 5 | using Tableau.Migration.Resources; 6 | 7 | namespace Csharp.ExampleApplication.Hooks.Filters 8 | { 9 | #region class 10 | public class DefaultProjectsFilter : ContentFilterBase 11 | { 12 | public DefaultProjectsFilter( 13 | ISharedResourcesLocalizer localizer, 14 | ILogger> logger) : base(localizer, logger) { } 15 | 16 | public override bool ShouldMigrate(ContentMigrationItem item) 17 | { 18 | return !string.Equals(item.SourceItem.Name, "default", System.StringComparison.OrdinalIgnoreCase); 19 | } 20 | } 21 | #endregion 22 | } 23 | -------------------------------------------------------------------------------- /examples/Csharp.ExampleApplication/Hooks/Filters/SharedCustomViewFilter.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Extensions.Logging; 2 | using Tableau.Migration.Content; 3 | using Tableau.Migration.Engine; 4 | using Tableau.Migration.Engine.Hooks.Filters; 5 | using Tableau.Migration.Resources; 6 | 7 | namespace Csharp.ExampleApplication.Hooks.Filters 8 | { 9 | #region class 10 | public class SharedCustomViewFilter : ContentFilterBase 11 | { 12 | public SharedCustomViewFilter( 13 | ISharedResourcesLocalizer localizer, 14 | ILogger> logger) 15 | : base(localizer, logger) { } 16 | 17 | public override bool ShouldMigrate(ContentMigrationItem item) 18 | { 19 | return !item.SourceItem.Shared; 20 | } 21 | } 22 | #endregion 23 | } 24 | -------------------------------------------------------------------------------- /examples/Csharp.ExampleApplication/Hooks/Filters/UnlicensedUsersFilter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Microsoft.Extensions.Logging; 3 | using Tableau.Migration.Api.Rest.Models; 4 | using Tableau.Migration.Content; 5 | using Tableau.Migration.Engine; 6 | using Tableau.Migration.Engine.Hooks.Filters; 7 | using Tableau.Migration.Resources; 8 | 9 | namespace Csharp.ExampleApplication.Hooks.Filters 10 | { 11 | #region class 12 | public class UnlicensedUsersFilter : ContentFilterBase 13 | { 14 | public UnlicensedUsersFilter( 15 | ISharedResourcesLocalizer localizer, 16 | ILogger> logger) 17 | : base(localizer, logger) { } 18 | 19 | public override bool ShouldMigrate(ContentMigrationItem item) 20 | { 21 | return !string.Equals(item.SourceItem.SiteRole, SiteRoles.Unlicensed, StringComparison.OrdinalIgnoreCase); 22 | } 23 | } 24 | #endregion 25 | } 26 | -------------------------------------------------------------------------------- /examples/Csharp.ExampleApplication/Hooks/InitializeMigration/CustomContext.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace Csharp.ExampleApplication.Hooks.InitializeMigration 4 | { 5 | #region class 6 | 7 | public class CustomContext 8 | { 9 | public Guid CustomerId { get; set; } 10 | } 11 | 12 | #endregion 13 | } 14 | -------------------------------------------------------------------------------- /examples/Csharp.ExampleApplication/Hooks/InitializeMigration/SetMigrationContextHook.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Threading; 3 | using System.Threading.Tasks; 4 | using Microsoft.Extensions.DependencyInjection; 5 | using Tableau.Migration.Engine.Hooks; 6 | 7 | namespace Csharp.ExampleApplication.Hooks.InitializeMigration 8 | { 9 | #region class 10 | 11 | internal class SetMigrationContextHook : IInitializeMigrationHook 12 | { 13 | public Task ExecuteAsync(IInitializeMigrationHookResult ctx, CancellationToken cancel) 14 | { 15 | var customContext = ctx.ScopedServices.GetRequiredService(); 16 | customContext.CustomerId = Guid.NewGuid(); 17 | 18 | return Task.FromResult(ctx); 19 | } 20 | } 21 | 22 | #endregion 23 | } 24 | -------------------------------------------------------------------------------- /examples/Csharp.ExampleApplication/Hooks/Mappings/EmailDomainMappingOptions.cs: -------------------------------------------------------------------------------- 1 | namespace Csharp.ExampleApplication.Hooks.Mappings 2 | { 3 | public sealed class EmailDomainMappingOptions 4 | { 5 | public string EmailDomain { get; set; } = string.Empty; 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /examples/Csharp.ExampleApplication/Hooks/Mappings/UnlicensedUsersMappingOptions.cs: -------------------------------------------------------------------------------- 1 | namespace Csharp.ExampleApplication.Hooks.Mappings 2 | { 3 | public sealed class UnlicensedUsersMappingOptions 4 | { 5 | public string TargetUserDomain { get; set; } = string.Empty; 6 | public string TargetUsername { get; set; } = string.Empty; 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /examples/Csharp.ExampleApplication/Hooks/PostPublish/BulkLoggingHook.cs: -------------------------------------------------------------------------------- 1 | using System.Threading; 2 | using System.Threading.Tasks; 3 | using Microsoft.Extensions.Logging; 4 | using Tableau.Migration.Engine.Hooks.PostPublish; 5 | 6 | namespace Csharp.ExampleApplication.Hooks.PostPublish 7 | { 8 | #region class 9 | public class BulkLoggingHook : BulkPostPublishHookBase 10 | { 11 | private readonly ILogger> _logger; 12 | 13 | public BulkLoggingHook(ILogger> logger) 14 | { 15 | _logger = logger; 16 | } 17 | 18 | public override Task?> ExecuteAsync(BulkPostPublishContext ctx, CancellationToken cancel) 19 | { 20 | // Log the number of items published in the batch. 21 | _logger.LogInformation( 22 | "Published {Count} {ContentType} item(s).", 23 | ctx.PublishedItems.Count, 24 | typeof(T).Name); 25 | 26 | return Task.FromResult?>(ctx); 27 | } 28 | } 29 | #endregion 30 | } 31 | -------------------------------------------------------------------------------- /examples/Csharp.ExampleApplication/README.md: -------------------------------------------------------------------------------- 1 | # Server to Cloud Migration SDK - Test Application 2 | This is a console application used to test the Migration SDK .Net Features. 3 | -------------------------------------------------------------------------------- /examples/DependencyInjection.ExampleApplication/DependencyInjection.ExampleApplication.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Exe 5 | net8.0;net9.0 6 | 7 | CA2007,IDE0073 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /examples/DependencyInjection.ExampleApplication/SingletonService.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Microsoft.Extensions.Logging; 3 | 4 | namespace DependencyInjection.ExampleApplication 5 | { 6 | public class SingletonService 7 | { 8 | // A unique ID used to distinguish between instances. 9 | protected readonly Guid InstanceId = Guid.NewGuid(); 10 | 11 | private readonly ILogger _logger; 12 | 13 | // The logger instance here will be injected when a SingletonService is 14 | // retrieved from the service provider. 15 | public SingletonService(ILogger logger) 16 | { 17 | _logger = logger; 18 | 19 | _logger.LogInformation("{Service} initialized: Instance ID = {Id}", nameof(SingletonService), InstanceId); 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /examples/Python.ExampleApplication/Hooks/Filters/default_project_filter.py: -------------------------------------------------------------------------------- 1 | from tableau_migration import ( 2 | IProject, 3 | ContentMigrationItem, 4 | ContentFilterBase) 5 | 6 | 7 | class DefaultProjectFilter(ContentFilterBase[IProject]): 8 | def should_migrate(self, item: ContentMigrationItem[IProject]) -> bool: 9 | if item.source_item.name.casefold() == 'Default'.casefold(): 10 | return False 11 | return True -------------------------------------------------------------------------------- /examples/Python.ExampleApplication/Hooks/Filters/shared_custom_view_filter.py: -------------------------------------------------------------------------------- 1 | from tableau_migration import ( 2 | ICustomView, 3 | ContentMigrationItem, 4 | ContentFilterBase) 5 | 6 | 7 | class SharedCustomViewFilter(ContentFilterBase[ICustomView]): 8 | def should_migrate(self, item: ContentMigrationItem[ICustomView]) -> bool: 9 | if item.source_item.shared == True: 10 | return False 11 | return True -------------------------------------------------------------------------------- /examples/Python.ExampleApplication/Hooks/Filters/unlicensed_user_filter.py: -------------------------------------------------------------------------------- 1 | from tableau_migration import ( 2 | IUser, 3 | ContentMigrationItem, 4 | ContentFilterBase, 5 | SiteRoles) 6 | 7 | 8 | class UnlicensedUserFilter(ContentFilterBase[IUser]): 9 | def should_migrate(self, item: ContentMigrationItem[IUser]) -> bool: 10 | if item.source_item.license_level.casefold() == SiteRoles.UNLICENSED.casefold(): 11 | return False 12 | return True -------------------------------------------------------------------------------- /examples/Python.ExampleApplication/Hooks/initialize_migration/set_custom_context_hook.py: -------------------------------------------------------------------------------- 1 | from tableau_migration import( 2 | InitializeMigrationHookBase, 3 | IInitailizeMigrationHookResult 4 | ) 5 | 6 | from Csharp.ExampleApplication.Hooks.InitializeMigration import CustomContext 7 | 8 | class SetMigrationContextHook(InitializeMigrationHookBase): 9 | def execute(self, ctx: IInitailizeMigrationHookResult) -> IInitailizeMigrationHookResult: 10 | ctx.scoped_services._get_service(CustomContext) -------------------------------------------------------------------------------- /examples/Python.ExampleApplication/Hooks/mappings/email_domain_mapping.py: -------------------------------------------------------------------------------- 1 | from tableau_migration import( 2 | IUser, 3 | TableauCloudUsernameMappingBase, 4 | ContentMappingContext) 5 | 6 | 7 | class EmailDomainMapping(TableauCloudUsernameMappingBase): 8 | def map(self, ctx: ContentMappingContext[IUser]) -> ContentMappingContext[IUser]: 9 | _email_domain: str = "@mycompany.com" 10 | 11 | _tableau_user_domain = ctx.mapped_location.parent() 12 | 13 | # Re-use an existing email if it already exists. 14 | if ctx.content_item.email: 15 | return ctx.map_to(_tableau_user_domain.append(ctx.content_item.email)) 16 | 17 | # Takes the existing username and appends the domain to build the email 18 | new_email = ctx.content_item.name + _email_domain 19 | return ctx.map_to(_tableau_user_domain.append(new_email)) -------------------------------------------------------------------------------- /examples/Python.ExampleApplication/Hooks/mappings/project_rename_mapping.py: -------------------------------------------------------------------------------- 1 | from tableau_migration import( 2 | IProject, 3 | ContentMappingBase, 4 | ContentMappingContext) 5 | 6 | 7 | class ProjectRenameMapping(ContentMappingBase[IProject]): 8 | def map(self, ctx: ContentMappingContext[IProject]) -> ContentMappingContext[IProject]: 9 | if not ctx.content_item.name.casefold() == "Test".casefold(): 10 | return ctx 11 | 12 | new_location = ctx.content_item.location.rename("Production") 13 | 14 | ctx = ctx.map_to(new_location) 15 | 16 | return ctx -------------------------------------------------------------------------------- /examples/Python.ExampleApplication/Hooks/migration_action_completed/log_migration_actions_hook.py: -------------------------------------------------------------------------------- 1 | import logging 2 | from tableau_migration import( 3 | MigrationActionCompletedHookBase, 4 | IMigrationActionResult 5 | ) 6 | 7 | 8 | class LogMigrationActionsHook(MigrationActionCompletedHookBase): 9 | def __init__(self) -> None: 10 | super().__init__() 11 | 12 | # Create a logger for this class 13 | self._logger = logging.getLogger(__name__) 14 | 15 | def execute(self, ctx: IMigrationActionResult) -> IMigrationActionResult: 16 | if(ctx.success): 17 | self._logger.info("Migration action completed successfully.") 18 | else: 19 | all_errors = "\n".join(ctx.errors) 20 | self._logger.warning("Migration action completed with errors:\n%s", all_errors) 21 | 22 | return None 23 | -------------------------------------------------------------------------------- /examples/Python.ExampleApplication/Hooks/post_publish/bulk_logging_hook.py: -------------------------------------------------------------------------------- 1 | import logging 2 | from tableau_migration import ( 3 | BulkPostPublishHookBase, 4 | BulkPostPublishContext, 5 | IDataSource) 6 | 7 | 8 | class BulkLoggingHookForDataSources(BulkPostPublishHookBase[IDataSource]): 9 | def __init__(self) -> None: 10 | super().__init__() 11 | 12 | # Create a logger for this class 13 | self._logger = logging.getLogger(__name__) 14 | 15 | def execute(self, ctx: BulkPostPublishContext[IDataSource]) -> BulkPostPublishContext[IDataSource]: 16 | # Log the number of items published in the batch. 17 | self._logger.info("Published %d IDataSource item(s).", ctx.published_items.count) 18 | return None 19 | -------------------------------------------------------------------------------- /examples/Python.ExampleApplication/Hooks/transformers/action_url_xml_transformer.py: -------------------------------------------------------------------------------- 1 | from xml.etree import ElementTree 2 | from tableau_migration import ( 3 | IPublishableWorkbook, 4 | XmlContentTransformerBase 5 | ) 6 | 7 | class ActionUrlXmlTransformer(XmlContentTransformerBase[IPublishableWorkbook]): 8 | 9 | def needs_xml_transforming(self, ctx: IPublishableWorkbook) -> bool: 10 | # Returning false prevents the transform method from running. 11 | # Implementing this method potentially allows workbooks to migrate 12 | # without loading the file into memory, improving migration speed. 13 | return True 14 | 15 | def transform(self, ctx: IPublishableWorkbook, xml: ElementTree.Element) -> None: 16 | # Changes to the XML are saved back to the workbook file before publishing. 17 | for action_link in xml.findall("actions/*/link"): 18 | action_link.set("expression", action_link.get("expression").replace("127.0.0.1", "testserver")) 19 | -------------------------------------------------------------------------------- /examples/Python.ExampleApplication/Hooks/transformers/custom_view_default_users_transformer.py: -------------------------------------------------------------------------------- 1 | from tableau_migration import ( 2 | ContentTransformerBase, 3 | IContentReference, 4 | IPublishableCustomView 5 | ) 6 | 7 | class CustomViewDefaultUsersTransformer(ContentTransformerBase[IPublishableCustomView]): 8 | 9 | #Pass in list of users retrieved from Users API 10 | default_users = [] 11 | 12 | def transform(self, itemToTransform: IPublishableCustomView) -> IPublishableCustomView: 13 | itemToTransform.default_users = self.default_users 14 | return itemToTransform -------------------------------------------------------------------------------- /examples/Python.ExampleApplication/Hooks/transformers/encrypt_extracts_transformer.py: -------------------------------------------------------------------------------- 1 | from typing import TypeVar 2 | from tableau_migration import ( 3 | ContentTransformerBase, 4 | IPublishableWorkbook, 5 | IPublishableDataSource) 6 | 7 | T = TypeVar("T") 8 | 9 | class EncryptExtractTransformer(ContentTransformerBase[T]): 10 | def transform(self, itemToTransform: T) -> T: 11 | itemToTransform.encrypt_extracts = True 12 | 13 | return itemToTransform 14 | 15 | class EncryptExtractTransformerForDataSources(EncryptExtractTransformer[IPublishableDataSource]): 16 | pass 17 | 18 | class EncryptExtractTransformerForWorkbooks(EncryptExtractTransformer[IPublishableWorkbook]): 19 | pass -------------------------------------------------------------------------------- /examples/Python.ExampleApplication/Hooks/transformers/migrated_tag_transformer.py: -------------------------------------------------------------------------------- 1 | from typing import TypeVar 2 | from tableau_migration import ( 3 | ContentTransformerBase, 4 | IDataSource, 5 | ITag, 6 | IWorkbook) 7 | 8 | T = TypeVar("T") 9 | 10 | 11 | class MigratedTagTransformer(ContentTransformerBase[T]): 12 | def transform(self, itemToTransform: T) -> T: 13 | tag: str = "Migrated" 14 | 15 | itemToTransform.tags.append(ITag(tag)) 16 | 17 | return itemToTransform 18 | 19 | class MigratedTagTransformerForDataSources(MigratedTagTransformer[IDataSource]): 20 | pass 21 | 22 | class MigratedTagTransformerForWorkbooks(MigratedTagTransformer[IWorkbook]): 23 | pass -------------------------------------------------------------------------------- /examples/Python.ExampleApplication/Hooks/transformers/schedule_startat_transformer.py: -------------------------------------------------------------------------------- 1 | from datetime import time 2 | from tableau_migration import ( 3 | ContentTransformerBase, 4 | ICloudExtractRefreshTask 5 | ) 6 | 7 | class SimpleScheduleStartAtTransformer(ContentTransformerBase[ICloudExtractRefreshTask]): 8 | def transform(self, itemToTransform: ICloudExtractRefreshTask) -> ICloudExtractRefreshTask: 9 | # In this example, the `Start At` time is in the UTC time zone. 10 | if itemToTransform.schedule.frequency_details.start_at: 11 | prev_start_at = itemToTransform.schedule.frequency_details.start_at 12 | # A simple conversion to the EDT time zone. 13 | itemToTransform.schedule.frequency_details.start_at = time(prev_start_at.hour - 4, prev_start_at.minute, prev_start_at.second, prev_start_at.microsecond); 14 | 15 | return itemToTransform -------------------------------------------------------------------------------- /examples/Python.ExampleApplication/config.ini: -------------------------------------------------------------------------------- 1 | [SOURCE] 2 | URL = http://server 3 | SITE_CONTENT_URL = 4 | ACCESS_TOKEN_NAME = MyServerTokenName 5 | ACCESS_TOKEN = 6 | 7 | [DESTINATION] 8 | URL = https://pod.online.tableau.com 9 | SITE_CONTENT_URL = mycloudsite 10 | ACCESS_TOKEN_NAME = MyCloudTokenName 11 | ACCESS_TOKEN = 12 | 13 | [USERS] 14 | EMAIL_DOMAIN = mycompany.com 15 | -------------------------------------------------------------------------------- /examples/Python.ExampleApplication/pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.ruff] 2 | # Enable pycodestyle (`E`) and Pyflakes (`F`) codes by default. 3 | select = ["E", "F"] 4 | ignore = ["E501"] 5 | 6 | [tool.hatch.envs.lint] 7 | detached = true 8 | 9 | dependencies = [ 10 | "ruff==0.11.10" 11 | ] 12 | 13 | [tool.hatch.envs.lint.scripts] 14 | lint = "ruff check ." -------------------------------------------------------------------------------- /examples/Python.ExampleApplication/requirements.txt: -------------------------------------------------------------------------------- 1 | configparser==7.2.0 2 | tableau_migration 3 | python-dotenv==1.1.0 4 | -------------------------------------------------------------------------------- /global.json: -------------------------------------------------------------------------------- 1 | { 2 | "sdk": { 3 | "version": "9.0.203", 4 | "rollForward": "latestMajor" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /src/.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "grammarly.files.include": ["**/*.md"] 3 | } -------------------------------------------------------------------------------- /src/Documentation/.gitignore: -------------------------------------------------------------------------------- 1 | ############### 2 | # folder # 3 | ############### 4 | /**/DROP/ 5 | /**/TEMP/ 6 | /**/packages/ 7 | /**/bin/ 8 | /**/obj/ 9 | migration_sdk_metadata.json 10 | -------------------------------------------------------------------------------- /src/Documentation/api-csharp/.gitignore: -------------------------------------------------------------------------------- 1 | ############### 2 | # temp file # 3 | ############### 4 | *.yml 5 | .manifest 6 | -------------------------------------------------------------------------------- /src/Documentation/api-csharp/index.md: -------------------------------------------------------------------------------- 1 | # Introduction 2 | 3 | Welcome to the C# API Reference for the Migration SDK. 4 | 5 | ## Examples to get started 6 | 7 | The following code samples are for writing a simple migration app using the Migration SDK. For details on configuring and customizing the Migration SDK to your specific needs, see [Articles](~/articles/index.md) and [Code Samples](~/samples/index.md). 8 | 9 | [!include[](~/includes/csharp-getting-started.md)] 10 | 11 | ## Suggested Reading 12 | 13 | - [Code Samples](~/samples/index.md) 14 | - [Articles](~/articles/index.md) 15 | -------------------------------------------------------------------------------- /src/Documentation/api-python/.gitignore: -------------------------------------------------------------------------------- 1 | reference 2 | /toc.yml -------------------------------------------------------------------------------- /src/Documentation/articles/cv_file.md: -------------------------------------------------------------------------------- 1 | # Anatomy of a Custom View File 2 | 3 | The Migration SDK downloads Custom View definition files during the migration process. There files are in JSON format. This is what a Custom View File looks like: 4 | 5 | ```json 6 | [ 7 | ..... 8 | { 9 | "isSourceView": true, 10 | "viewName": "View 1", 11 | "tcv": "{base-64 custom view xml content with + signs replaced by -}" 12 | } 13 | ..... 14 | ] 15 | 16 | ``` 17 | 18 | ## Getting the Custom View Definition from the Custom View File 19 | 20 | In the JSON file, the field `tcv` contains the XML definition of a custom view. This field is encoded as a Base64 string, with `+` characters replaced by `-`. 21 | 22 | To decode the `tcv` value 23 | 24 | 1. Replace all the `-` characters in the string with `+`. 25 | 2. Decode the resulting Base64 string. 26 | 3. Get the XML Custom View Definition. 27 | 28 | To encode the `tcv` value 29 | 30 | 1. Make any changes to the Custom View Definition. 31 | 2. Encode the XML into a Base64 string. 32 | 3. Replace all the `+` characters in the string with `-`. 33 | -------------------------------------------------------------------------------- /src/Documentation/articles/toc.yml: -------------------------------------------------------------------------------- 1 | - name: SDK Terminology 2 | href: terms.md 3 | - name: Configuration 4 | href: configuration.md 5 | - name: Plan Validation 6 | href: plan_validation.md 7 | - name: Logging 8 | href: logging.md 9 | - name: Hooks 10 | href: hooks/index.md 11 | items: 12 | - name: Custom Hooks 13 | href: hooks/custom_hooks.md 14 | - name: Example Hook Use Cases 15 | href: hooks/example_hook_use_cases.md 16 | - name: Python Hook Update from v3 to v4+ 17 | href: hooks/python_hook_update.md 18 | - name: User Authentication 19 | href: user_authentication.md 20 | - name: Custom View File 21 | href: cv_file.md 22 | - name: Dependency Injection 23 | href: dependency_injection.md 24 | - name: Troubleshooting 25 | href: troubleshooting.md 26 | 27 | -------------------------------------------------------------------------------- /src/Documentation/cspell.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2", 3 | "ignorePaths": [], 4 | "dictionaryDefinitions": [], 5 | "dictionaries": [], 6 | "words": [ 7 | "appsettings" 8 | ], 9 | "ignoreWords": [ 10 | "configparser", 11 | "docfx", 12 | "statictoc", 13 | "MIGRATIONSDK", 14 | "Serilog", 15 | "api", 16 | "md", 17 | "markdownlint" 18 | ], 19 | "import": [] 20 | } 21 | -------------------------------------------------------------------------------- /src/Documentation/filterConfig.yml: -------------------------------------------------------------------------------- 1 | apiRules: 2 | - exclude: 3 | uidRegex: ^System.Object.* 4 | type: Type 5 | -------------------------------------------------------------------------------- /src/Documentation/includes/configuration/sdk_opts_def_perm.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 17 | 20 | 21 | 22 | 23 |
KeyDescriptionDefaultPython Environment Variable
DefaultPermissionsContentTypes.UrlSegmentsList of types of default permissions for a given project. See Query 15 | Default Permissions for details. Important: This configuration is not dynamically 16 | applied. It takes effect when you restart your application. Listed in DefaultPermissionsContentTypeUrlSegments 19 | Not Supported
-------------------------------------------------------------------------------- /src/Documentation/includes/configuration/sdk_opts_files.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 |
KeyDescriptionDefaultPython Environment Variable
Files.DisableFileEncryptionDefines whether to encrypt temporary files downloaded during the migration. This applies to file-based 14 | content types, such as Workbooks and Data Sources.falseMigrationSDK__Files__DisableFileEncryption
Files.RootPathDefines the location to store temporary files. The default temporary path for the OS.MigrationSDK__Files__RootPath
-------------------------------------------------------------------------------- /src/Documentation/includes/configuration/sdk_opts_jobs.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 |
KeyDescriptionDefaultPython Environment Variable
Jobs.JobPollRateDefines the interval to wait to recheck processing status for bulk processes.3 sMigrationSDK__Jobs__JobPollRate
Jobs.JobTimeoutDefines the maximum interval to wait for a job to complete for bulk processes.30 mMigrationSDK__Jobs__JobTimeout
-------------------------------------------------------------------------------- /src/Documentation/includes/configuration/sdk_opts_preflight.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
KeyDescriptionDefaultPython Environment Variable
PreflightOptions.ValidateSettingsDetermines whether to validate supported site settings during the preflight step.trueMigrationSDK__Network__ValidateSettings
-------------------------------------------------------------------------------- /src/Documentation/includes/csharp-getting-started.md: -------------------------------------------------------------------------------- 1 | ### [Program.cs](#tab/program-cs) 2 | 3 | [!code-csharp[](../../../examples/Csharp.ExampleApplication/Program.cs#namespace)] 4 | 5 | ### [Startup code](#tab/startup-cde) 6 | 7 | [!code-csharp[](../../../examples/Csharp.ExampleApplication/MyMigrationApplication.cs#namespace)] 8 | 9 | ### [Config classes](#tab/config-classes) 10 | 11 | [!code-csharp[](../../../examples/Csharp.ExampleApplication/Config/MyMigrationApplicationOptions.cs#namespace)] 12 | 13 | [!code-csharp[](../../../examples/Csharp.ExampleApplication/Config/EndpointOptions.cs#namespace)] 14 | 15 | ### [Config file](#tab/appsettings) 16 | 17 | ```json 18 | { 19 | "source": { 20 | "serverUrl": "http://server", 21 | "siteContentUrl": "", 22 | "accessTokenName": "my-server-token-name", 23 | "accessToken": "my-secret-server-pat" 24 | }, 25 | "destination": { 26 | "serverUrl": "https://pod.online.tableau.com", 27 | "siteContentUrl": "site-name", 28 | "accessTokenName": "my-cloud-token-name", 29 | "accessToken": "my-secret-cloud-pat" 30 | } 31 | } 32 | ``` 33 | 34 | --- 35 | -------------------------------------------------------------------------------- /src/Documentation/includes/python-getting-started.md: -------------------------------------------------------------------------------- 1 | ### [Startup Scripts](#tab/startup) 2 | 3 | Main module: 4 | 5 | [!code-python[](../../../examples/Python.ExampleApplication/Python.ExampleApplication.py)] 6 | 7 | `print_result` helper module: 8 | 9 | [!code-python[](../../../examples/Python.ExampleApplication/print_result.py)] 10 | 11 | ### [config.ini](#tab/config) 12 | 13 | > [!Important] 14 | > The values below should not be quoted. So ***no*** `'` or `"`. 15 | 16 | [!code-ini[](../../../examples/Python.ExampleApplication/config.ini)] 17 | 18 | ### [requirements.txt](#tab/reqs) 19 | 20 | [!code-text[](../../../examples/Python.ExampleApplication/requirements.txt#L3-)] 21 | 22 | --- 23 | -------------------------------------------------------------------------------- /src/Documentation/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | redirect_url: articles/index.html 3 | --- 4 | -------------------------------------------------------------------------------- /src/Documentation/packages.lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 1, 3 | "dependencies": { 4 | "net9.0": {} 5 | } 6 | } -------------------------------------------------------------------------------- /src/Documentation/samples/batch-migration-completed/index.md: -------------------------------------------------------------------------------- 1 | # Batch Migration Completed 2 | 3 | Batch Migration Completed Hooks allow custom logic to run when a migration batch completes. 4 | 5 | The following samples cover some common scenarios: 6 | 7 | - [Sample: Migration batch logging](~/samples/batch-migration-completed/log_migration_batches.md) 8 | -------------------------------------------------------------------------------- /src/Documentation/samples/batch-migration-completed/toc.yml: -------------------------------------------------------------------------------- 1 | - name: Batch migration logging 2 | href: log_migration_batches.md -------------------------------------------------------------------------------- /src/Documentation/samples/bulk-post-publish/index.md: -------------------------------------------------------------------------------- 1 | # Bulk Post-Publish Hooks 2 | 3 | Bulk post-publish hooks allow you to update content item batches after they are migrated to the destination. 4 | 5 | The following samples cover some common scenarios: 6 | 7 | - [Sample: Bulk logging](~/samples/bulk-post-publish/bulk_logging.md) 8 | -------------------------------------------------------------------------------- /src/Documentation/samples/bulk-post-publish/toc.yml: -------------------------------------------------------------------------------- 1 | - name: Bulk logging 2 | href: bulk_logging.md -------------------------------------------------------------------------------- /src/Documentation/samples/filters/index.md: -------------------------------------------------------------------------------- 1 | # Filters 2 | 3 | Filters allow you to skip migrating certain content items. 4 | 5 | > [!Note] 6 | > Filters do not have a cascading effect. You will need to write similar filters for the related content items as well. 7 | 8 | The following samples cover some common scenarios: 9 | 10 | - [Sample: Filter projects by name](~/samples/filters/filter_projects_by_name.md) 11 | 12 | - [Sample: Filter users by site role](~/samples/filters/filter_users_by_site_role.md) 13 | 14 | - [Sample: Filter custom views by shared setting](~/samples/filters/filter_custom_views_by_shared.md) 15 | -------------------------------------------------------------------------------- /src/Documentation/samples/filters/toc.yml: -------------------------------------------------------------------------------- 1 | - name: Filter projects by name 2 | href: filter_projects_by_name.md 3 | - name: Filter users by SiteRole 4 | href: filter_users_by_site_role.md 5 | - name: Filter Custom Views by 'Shared' flag 6 | href: filter_custom_views_by_shared.md -------------------------------------------------------------------------------- /src/Documentation/samples/initialize-migration/index.md: -------------------------------------------------------------------------------- 1 | # Initialize Migration 2 | 3 | Initialize Migration Hooks allow custom logic to run after a migration startup has been validated but before any migration work is performed. 4 | 5 | The following samples cover some common scenarios: 6 | 7 | - [Sample: Set Custom Migration Scoped Context](~/samples/initialize-migration/set_custom_context.md) 8 | -------------------------------------------------------------------------------- /src/Documentation/samples/initialize-migration/toc.yml: -------------------------------------------------------------------------------- 1 | - name: Set Custom Migration Scoped Context 2 | href: set_custom_context.md -------------------------------------------------------------------------------- /src/Documentation/samples/mappings/index.md: -------------------------------------------------------------------------------- 1 | # Mappings 2 | 3 | Mappings allow you to change the locations of content items before they are migrated to the destination. 4 | 5 | > [!Note] 6 | > Mappings do not have a cascading effect. You will need to write similar mappings for the related content items as well. 7 | 8 | The following samples cover some common scenarios: 9 | 10 | - [Sample: Username email](~/samples/mappings/username_email_mapping.md) 11 | - [Sample: Rename projects](~/samples/mappings/rename_projects.md) 12 | - [Sample: Change projects](~/samples/mappings/change_projects.md) 13 | -------------------------------------------------------------------------------- /src/Documentation/samples/mappings/toc.yml: -------------------------------------------------------------------------------- 1 | - name: Username email 2 | href: username_email_mapping.md 3 | - name: Rename projects 4 | href: rename_projects.md 5 | - name: Change projects 6 | href: change_projects.md -------------------------------------------------------------------------------- /src/Documentation/samples/migration-action-completed/index.md: -------------------------------------------------------------------------------- 1 | # Migration Action Completed 2 | 3 | Migration Action Completed Hooks allow custom logic to run when a migration action completes. 4 | 5 | The following samples cover some common scenarios: 6 | 7 | - [Sample: Migration action logging](~/samples/migration-action-completed/log_migration_actions.md) 8 | -------------------------------------------------------------------------------- /src/Documentation/samples/migration-action-completed/toc.yml: -------------------------------------------------------------------------------- 1 | - name: Migration action logging 2 | href: log_migration_actions.md -------------------------------------------------------------------------------- /src/Documentation/samples/post-publish/index.md: -------------------------------------------------------------------------------- 1 | # Post-Publish Hooks 2 | 3 | Post-publish hooks allow you to update content items after they are migrated to the destination. 4 | 5 | The following samples cover some common scenarios: 6 | 7 | - [Sample: Update permissions](~/samples/post-publish/update_permissions.md) 8 | -------------------------------------------------------------------------------- /src/Documentation/samples/post-publish/toc.yml: -------------------------------------------------------------------------------- 1 | - name: Update permissions 2 | href: update_permissions.md 3 | -------------------------------------------------------------------------------- /src/Documentation/samples/post-publish/update_permissions.md: -------------------------------------------------------------------------------- 1 | # Sample: Update permissions 2 | 3 | In the following example, write permissions for content with a `Production` tag will be set to `Deny`. 4 | 5 | ## [Post-Publish Hook Class](#tab/class) 6 | 7 | [!code-csharp[](../../../../examples/Csharp.ExampleApplication/Hooks/PostPublish/UpdatePermissionsHook.cs#class)] 8 | 9 | ## [Registration](#tab/registration) 10 | 11 | [!code-csharp[](../../../../examples/Csharp.ExampleApplication/MyMigrationApplication.cs#UpdatePermissionsHook-Registration)] 12 | 13 | ## [Dependency Injection](#tab/di) 14 | 15 | [!code-csharp[](../../../../examples/Csharp.ExampleApplication/Program.cs#UpdatePermissionsHook-DI)] 16 | 17 | --- 18 | -------------------------------------------------------------------------------- /src/Documentation/samples/toc.yml: -------------------------------------------------------------------------------- 1 | - name: Filters 2 | href: filters/toc.yml 3 | homepage: filters/index.md 4 | - name: Mappings 5 | href: mappings/toc.yml 6 | homepage: mappings/index.md 7 | - name: Transformers 8 | href: transformers/toc.yml 9 | homepage: transformers/index.md 10 | - name: Post-Publish Hooks 11 | href: post-publish/toc.yml 12 | homepage: post-publish/index.md 13 | - name: Bulk Post-Publish Hooks 14 | href: bulk-post-publish/toc.yml 15 | homepage: bulk-post-publish/index.md 16 | - name: Batch Migration Completed Hooks 17 | href: batch-migration-completed/toc.yml 18 | homepage: batch-migration-completed/index.md 19 | - name: Migration Action Completed Hooks 20 | href: migration-action-completed/toc.yml 21 | homepage: migration-action-completed/index.md 22 | -------------------------------------------------------------------------------- /src/Documentation/samples/transformers/index.md: -------------------------------------------------------------------------------- 1 | # Transformers 2 | 3 | Transformers allow you to update content items before they are migrated to the destination. 4 | 5 | The following samples cover some common scenarios: 6 | 7 | - [Sample: Add tags to content](~/samples/transformers/migrated_tag_transformer.md) 8 | - [Sample: Encrypt Extracts](~/samples/transformers/encrypt_extracts_transformer.md) 9 | - [Sample: Adjust 'Start At' to Scheduled Tasks](~/samples/transformers/start_at_transformer.md) 10 | - [Sample: Change default users for Custom Views](~/samples/transformers/custom_view_default_users_transformer.md) 11 | - [Sample: Action URL XML transformer](~/samples/transformers/action_url_xml_transformer.md) -------------------------------------------------------------------------------- /src/Documentation/samples/transformers/toc.yml: -------------------------------------------------------------------------------- 1 | - name: Add tags to content 2 | href: migrated_tag_transformer.md 3 | - name: Encrypt Extracts 4 | href: encrypt_extracts_transformer.md 5 | - name: Adjust 'Start At' to Scheduled Tasks 6 | href: start_at_transformer.md 7 | - name: Change default users for Custom Views 8 | href: custom_view_default_users_transformer.md 9 | - name: Action URL XML Transformer 10 | href: action_url_xml_transformer.md -------------------------------------------------------------------------------- /src/Documentation/tableau.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/Documentation/tableau_favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tableau/tableau-migration-sdk/00a99952d72a0ef994e361d63e1860368a795e8b/src/Documentation/tableau_favicon.ico -------------------------------------------------------------------------------- /src/Documentation/templates/tableau/conceptual.html.primary.tmpl: -------------------------------------------------------------------------------- 1 | {{!Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. See LICENSE file in the project root for full license information.}} 2 | {{!master(layout/_master.tmpl)}} 3 | {{{rawTitle}}} 4 | {{{conceptual}}} -------------------------------------------------------------------------------- /src/Documentation/templates/tableau/partials/breadcrumb.tmpl.partial: -------------------------------------------------------------------------------- 1 | {{!Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. See LICENSE file in the project root for full license information.}} 2 | 3 | 10 | -------------------------------------------------------------------------------- /src/Documentation/templates/tableau/partials/navbar-li.tmpl.partial: -------------------------------------------------------------------------------- 1 | {{!Licensed to the .NET Foundation under one or more agreements. The .NET Foundation licenses this file to you under the MIT license.}} 2 | 3 | 31 | -------------------------------------------------------------------------------- /src/Documentation/toc.yml: -------------------------------------------------------------------------------- 1 | - name: Articles 2 | href: articles/ 3 | homepage: articles/index.md 4 | - name: Code Samples 5 | href: samples/ 6 | homepage: samples/index.md 7 | - name: Python API Reference 8 | href: api-python/ 9 | homepage: api-python/index.md 10 | - name: C# API Reference 11 | href: api-csharp/ 12 | homepage: api-csharp/index.md 13 | -------------------------------------------------------------------------------- /src/Python/.gitignore: -------------------------------------------------------------------------------- 1 | /Documentation/_build 2 | /Documentation/_static 3 | /Python.pyproj.user 4 | /Documentation/generated 5 | -------------------------------------------------------------------------------- /src/Python/.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "python.testing.pytestEnabled": true, 3 | "python.testing.unittestEnabled": false, 4 | "python.testing.autoTestDiscoverOnSaveEnabled": true, 5 | "python.analysis.extraPaths": [ 6 | "./src/tableau_migration" 7 | ], 8 | "python.testing.pytestArgs": [ 9 | "tests" 10 | ], 11 | "python.analysis.typeCheckingMode": "basic" 12 | } -------------------------------------------------------------------------------- /src/Python/DOCUMENTATION.md: -------------------------------------------------------------------------------- 1 | # Python Documentation 2 | 3 | Documentation is generated using Sphinx and output into `~/src/Documentation/python` of this repo. 4 | 5 | To generate documentation, run these commands 6 | 7 | ```powershell 8 | ./documentation/make markdown 9 | ``` 10 | 11 | The documentation will be written to `.md` files in the target directory. 12 | -------------------------------------------------------------------------------- /src/Python/Documentation/Makefile: -------------------------------------------------------------------------------- 1 | # Minimal makefile for Sphinx documentation 2 | # 3 | 4 | # You can set these variables from the command line, and also 5 | # from the environment for the first two. 6 | SPHINXOPTS ?= 7 | SPHINXBUILD ?= sphinx-build 8 | SOURCEDIR = ./src/Python/Documentation/ 9 | BUILDDIR = ./src/Documentation/python 10 | 11 | # Put it first so that "make" without argument is like "make help". 12 | help: 13 | @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 14 | 15 | .PHONY: help Makefile 16 | 17 | # Catch-all target: route all unknown targets to Sphinx using the new 18 | # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). 19 | %: Makefile 20 | @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 21 | -------------------------------------------------------------------------------- /src/Python/Documentation/index.rst: -------------------------------------------------------------------------------- 1 | Welcome to Tableau Migration SDK's documentation! 2 | ================================================= 3 | .. toctree:: 4 | 5 | .. autosummary:: 6 | :toctree: generated 7 | :template: custom-module-template.rst 8 | :recursive: 9 | tableau_migration 10 | -------------------------------------------------------------------------------- /src/Python/Documentation/make.bat: -------------------------------------------------------------------------------- 1 | @ECHO OFF 2 | 3 | pushd %~dp0 4 | 5 | REM Command file for Sphinx documentation 6 | 7 | if "%SPHINXBUILD%" == "" ( 8 | set SPHINXBUILD=sphinx-build 9 | ) 10 | set SOURCEDIR=. 11 | SET DOCSDIR="../../../src/Documentation/python" 12 | 13 | %SPHINXBUILD% >NUL 2>NUL 14 | if errorlevel 9009 ( 15 | echo. 16 | echo.The 'sphinx-build' command was not found. Make sure you have Sphinx 17 | echo.installed, then set the SPHINXBUILD environment variable to point 18 | echo.to the full path of the 'sphinx-build' executable. Alternatively you 19 | echo.may add the Sphinx directory to PATH. 20 | echo. 21 | echo.If you don't have Sphinx installed, grab it from 22 | echo.https://www.sphinx-doc.org/ 23 | exit /b 1 24 | ) 25 | 26 | if "%1" == "" goto help 27 | 28 | %SPHINXBUILD% -M %1 %SOURCEDIR% %DOCSDIR% %SPHINXOPTS% %O% 29 | goto end 30 | 31 | :help 32 | %SPHINXBUILD% -M help %SOURCEDIR% %DOCSDIR% %SPHINXOPTS% %O% 33 | 34 | :end 35 | popd 36 | -------------------------------------------------------------------------------- /src/Python/README.md: -------------------------------------------------------------------------------- 1 | # Migration SDK 2 | ## Usage 3 | 4 | This will install the tableau_migration package 5 | ``` 6 | pip install tableau_migration 7 | ``` 8 | 9 | Once installed, you can use it the REPL or your own code 10 | ```Python 11 | # This initializes the dotnet runtime on import 12 | import tableau_migration 13 | 14 | # Now just use the object 15 | from migration_migration_plan_builder import PyMigrationPlanBuilder 16 | planBuilder = PyMigrationPlanBuilder() 17 | ... 18 | ``` 19 | -------------------------------------------------------------------------------- /src/Python/pytest.ini: -------------------------------------------------------------------------------- 1 | [pytest] 2 | testpaths = 3 | tests 4 | 5 | pythonpath = 6 | src 7 | 8 | env = 9 | MigrationSDK__ContentTypes__0__Type = User 10 | MigrationSDK__ContentTypes__0__BatchSize = 102 11 | MigrationSDK__ContentTypes__1__Type = Workbook 12 | MigrationSDK__ContentTypes__1__IncludeExtractEnabled = False -------------------------------------------------------------------------------- /src/Python/requirements.txt: -------------------------------------------------------------------------------- 1 | cffi==1.17.1 2 | pycparser==2.22 3 | pythonnet==3.0.5 4 | typing_extensions==4.13.2 5 | pytest-env==1.1.5 6 | build==1.2.2 -------------------------------------------------------------------------------- /src/Python/scripts/build_binaries.py: -------------------------------------------------------------------------------- 1 | # noqa: D100 2 | # This is a script to build Tableau.Migration dlls before running the Python Wrapper import. 3 | import subprocess 4 | import shutil 5 | import sys 6 | 7 | # Build the solution so we have the published binaries. 8 | from os.path import abspath 9 | from pathlib import Path 10 | migration_project = abspath("../../Tableau.Migration/Tableau.Migration.csproj") 11 | 12 | # Build binaries and put them on the path. 13 | bin_path = abspath(Path(__file__).parent.resolve().__str__() + "/bin") 14 | sys.path.append(bin_path) 15 | 16 | shutil.rmtree(bin_path, True) 17 | subprocess.run(["dotnet", "publish", migration_project, "-o", bin_path, "-f", "net8.0"]) -------------------------------------------------------------------------------- /src/Python/scripts/import_modules.py: -------------------------------------------------------------------------------- 1 | # noqa: D100 2 | import os 3 | import sys 4 | from os.path import abspath 5 | from pathlib import Path 6 | 7 | sys.path.append(os.path.abspath('../src/')) 8 | sys.path.append(abspath(Path(__file__).parent.resolve())) 9 | 10 | print("Building the C# project.") 11 | import build_binaries # noqa: E402,F401 12 | print("..done.") 13 | print("Importing the tableau_migration package.") 14 | import tableau_migration # noqa: E402,F401 15 | print("..done.") 16 | -------------------------------------------------------------------------------- /src/Python/src/tableau_migration/migration_enum.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2025, Salesforce, Inc. 2 | # SPDX-License-Identifier: Apache-2 3 | # 4 | # Licensed under the Apache License, Version 2.0 (the "License"); 5 | # you may not use this file except in compliance with the License. 6 | # You may obtain a copy of the License at 7 | # 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | # 10 | # Unless required by applicable law or agreed to in writing, software 11 | # distributed under the License is distributed on an "AS IS" BASIS, 12 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | # See the License for the specific language governing permissions and 14 | # limitations under the License. 15 | 16 | """Enumeration-related Python utility for the Migration SDK.""" 17 | 18 | import sys 19 | 20 | if sys.version_info >= (3, 11): 21 | from enum import StrEnum 22 | else: 23 | from enum import Enum 24 | 25 | class StrEnum(str, Enum): 26 | """Enumeration for string values.""" 27 | pass -------------------------------------------------------------------------------- /src/Python/tests/test_migration_api_rest_models.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2025, Salesforce, Inc. 2 | # SPDX-License-Identifier: Apache-2 3 | # 4 | # Licensed under the Apache License, Version 2.0 (the "License"); 5 | # you may not use this file except in compliance with the License. 6 | # You may obtain a copy of the License at 7 | # 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | # 10 | # Unless required by applicable law or agreed to in writing, software 11 | # distributed under the License is distributed on an "AS IS" BASIS, 12 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | # See the License for the specific language governing permissions and 14 | # limitations under the License. 15 | 16 | import pytest 17 | 18 | from tableau_migration.migration_api_rest_models import PyAdministratorLevels 19 | 20 | class TestPyAdministratorLevels: 21 | def test_string_compare(self): 22 | assert "Site" == PyAdministratorLevels.SITE -------------------------------------------------------------------------------- /src/Tableau.Migration.PythonGenerator/Config/Hints/NamespaceHints.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | using System; 19 | 20 | namespace Tableau.Migration.PythonGenerator.Config.Hints 21 | { 22 | internal sealed class NamespaceHints 23 | { 24 | public string Namespace { get; set; } = string.Empty; 25 | 26 | public TypeHints[] Types { get; set; } = Array.Empty(); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/Tableau.Migration.PythonGenerator/Config/Hints/TypeHints.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | using System; 19 | 20 | namespace Tableau.Migration.PythonGenerator.Config.Hints 21 | { 22 | internal sealed class TypeHints 23 | { 24 | public string Type { get; set; } = string.Empty; 25 | 26 | public string[] ExcludeMembers { get; set; } = Array.Empty(); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/Tableau.Migration.PythonGenerator/ConversionMode.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.PythonGenerator 19 | { 20 | internal enum ConversionMode 21 | { 22 | Direct = 0, 23 | 24 | Wrap, 25 | 26 | WrapSerialized, 27 | 28 | WrapGeneric, 29 | 30 | Enum, 31 | 32 | WrapImmutableCollection, 33 | 34 | WrapMutableCollection, 35 | 36 | WrapArray, 37 | 38 | WrapTimeOnly 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/Tableau.Migration.PythonGenerator/Generators/IPythonDocstringGenerator.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | using Microsoft.CodeAnalysis; 19 | 20 | namespace Tableau.Migration.PythonGenerator.Generators 21 | { 22 | internal interface IPythonDocstringGenerator 23 | { 24 | PythonDocstring? Generate(ISymbol dotNetSymbol, bool ignoreArgs = false); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/Tableau.Migration.PythonGenerator/Generators/IPythonEnumValueGenerator.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | using System.Collections.Immutable; 19 | using Microsoft.CodeAnalysis; 20 | 21 | namespace Tableau.Migration.PythonGenerator.Generators 22 | { 23 | internal interface IPythonEnumValueGenerator 24 | { 25 | ImmutableArray GenerateEnumValues(INamedTypeSymbol dotNetType); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/Tableau.Migration.PythonGenerator/Generators/IPythonGenerator.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | using System.Collections.Generic; 19 | using Microsoft.CodeAnalysis; 20 | 21 | namespace Tableau.Migration.PythonGenerator.Generators 22 | { 23 | internal interface IPythonGenerator 24 | { 25 | PythonTypeCache Generate(IEnumerable dotNetTypes); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/Tableau.Migration.PythonGenerator/Generators/IPythonMethodGenerator.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | using System.Collections.Immutable; 19 | using Microsoft.CodeAnalysis; 20 | 21 | namespace Tableau.Migration.PythonGenerator.Generators 22 | { 23 | internal interface IPythonMethodGenerator 24 | { 25 | ImmutableArray GenerateMethods(INamedTypeSymbol dotNetType); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/Tableau.Migration.PythonGenerator/Generators/IPythonPropertyGenerator.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | using System.Collections.Immutable; 19 | using Microsoft.CodeAnalysis; 20 | 21 | namespace Tableau.Migration.PythonGenerator.Generators 22 | { 23 | internal interface IPythonPropertyGenerator 24 | { 25 | ImmutableArray GenerateProperties(INamedTypeSymbol dotNetType); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/Tableau.Migration.PythonGenerator/Generators/IPythonTypeGenerator.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | using System.Collections.Immutable; 19 | using Microsoft.CodeAnalysis; 20 | 21 | namespace Tableau.Migration.PythonGenerator.Generators 22 | { 23 | internal interface IPythonTypeGenerator 24 | { 25 | PythonType Generate(ImmutableHashSet dotNetTypeNames, INamedTypeSymbol dotNetType); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/Tableau.Migration.PythonGenerator/Keywords/Dotnet/TypeAliases.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.PythonGenerator.Keywords.Dotnet 19 | { 20 | internal class TypeAliases 21 | { 22 | public const string LIST = "DotnetList"; 23 | public const string HASH_SET = "DotnetHashSet"; 24 | public const string STRING = "String"; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/Tableau.Migration.PythonGenerator/Keywords/Python/Modules.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.PythonGenerator.Keywords.Python 19 | { 20 | internal static class Modules 21 | { 22 | 23 | public const string AUTOFIXTURE = "tests.helpers.autofixture"; 24 | public const string UUID = "uuid"; 25 | public const string TYPING = "typing"; 26 | public const string DATETIME = "datetime"; 27 | } 28 | } -------------------------------------------------------------------------------- /src/Tableau.Migration.PythonGenerator/PythonArgDocstring.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.PythonGenerator 19 | { 20 | internal sealed record PythonArgDocstring(string Name, string Documentation) 21 | { } 22 | } 23 | -------------------------------------------------------------------------------- /src/Tableau.Migration.PythonGenerator/PythonEnumValue.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.PythonGenerator 19 | { 20 | internal sealed record PythonEnumValue(string Name, object Value, PythonDocstring? Documentation) 21 | { } 22 | } 23 | -------------------------------------------------------------------------------- /src/Tableau.Migration.PythonGenerator/PythonMethod.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | using System.Collections.Immutable; 19 | using Microsoft.CodeAnalysis; 20 | 21 | namespace Tableau.Migration.PythonGenerator 22 | { 23 | internal sealed record PythonMethod(string Name, PythonTypeReference? ReturnType, ImmutableArray Arguments, 24 | bool IsStatic, PythonDocstring? Documentation, IMethodSymbol DotNetMethod) 25 | { } 26 | } 27 | -------------------------------------------------------------------------------- /src/Tableau.Migration.PythonGenerator/PythonMethodArgument.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.PythonGenerator 19 | { 20 | internal sealed record PythonMethodArgument(string Name, PythonTypeReference Type) 21 | { } 22 | } 23 | -------------------------------------------------------------------------------- /src/Tableau.Migration.PythonGenerator/PythonProperty.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | using Microsoft.CodeAnalysis; 19 | 20 | namespace Tableau.Migration.PythonGenerator 21 | { 22 | internal sealed record PythonProperty(string Name, PythonTypeReference Type, bool Getter, bool Setter, 23 | bool IsStatic, PythonDocstring? Documentation, ISymbol DotNetProperty, ITypeSymbol DotNetPropertyType) 24 | { } 25 | } 26 | -------------------------------------------------------------------------------- /src/Tableau.Migration.PythonGenerator/README.md: -------------------------------------------------------------------------------- 1 | # Migration SDK Python Generator 2 | 3 | ## About 4 | 5 | The Migration SDK Python generator creates wrapper code for a selection of C# types. 6 | A custom generator is used due to the bespoke nature of the Python wrappers. 7 | The generated code is designed to work with a subset of types and allow for manual wrapping of types that are difficult to wrap or pre-date the generator. 8 | 9 | ## Usage 10 | 11 | The generator automatically runs when built, and is designed to output as part of local and scripted builds. 12 | To add a new type to generate wrappers for, update the list in [`PythonGenerationList.cs`](PythonGenerationList.cs) 13 | 14 | ### Hints 15 | 16 | The [`appsettings.json`](appsettings.json) file contains hints for the generator on a per-namespace/per-type basis: 17 | 18 | - `excludedMembers` type hint: An array of strings for member names (methods or properties) not not generate wrappers for. 19 | 20 | ## Limitations 21 | 22 | The current generator has the following limitations that would need to be addressed to generate code for types making use of these features: 23 | 24 | - Overloaded methods 25 | -------------------------------------------------------------------------------- /src/Tableau.Migration.PythonGenerator/Tableau.Migration.PythonGenerator.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | Tableau Migration SDK Python Wrapper Generator 4 | Exe 5 | net9.0 6 | 7 | CA2007 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /src/Tableau.Migration.PythonGenerator/Writers/IPythonClassTestWriter.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.PythonGenerator.Writers 19 | { 20 | internal interface IPythonClassTestWriter 21 | { 22 | void Write(IndentingStringBuilder builder, PythonType type); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/Tableau.Migration.PythonGenerator/Writers/IPythonConstructorTestWriter.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.PythonGenerator.Writers 19 | { 20 | internal interface IPythonConstructorTestWriter 21 | { 22 | void Write(IndentingStringBuilder builder, PythonType type); 23 | } 24 | } -------------------------------------------------------------------------------- /src/Tableau.Migration.PythonGenerator/Writers/IPythonDocstringWriter.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.PythonGenerator.Writers 19 | { 20 | internal interface IPythonDocstringWriter 21 | { 22 | void Write(IndentingStringBuilder builder, PythonDocstring? documentation); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/Tableau.Migration.PythonGenerator/Writers/IPythonEnumValueWriter.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.PythonGenerator.Writers 19 | { 20 | internal interface IPythonEnumValueWriter 21 | { 22 | void Write(IndentingStringBuilder builder, PythonType type, PythonEnumValue enumValue); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/Tableau.Migration.PythonGenerator/Writers/IPythonMethodWriter.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.PythonGenerator.Writers 19 | { 20 | internal interface IPythonMethodWriter 21 | { 22 | void Write(IndentingStringBuilder builder, PythonType type, PythonMethod method); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/Tableau.Migration.PythonGenerator/Writers/IPythonPropertyTestWriter.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.PythonGenerator.Writers 19 | { 20 | internal interface IPythonPropertyTestWriter 21 | { 22 | void Write(IndentingStringBuilder builder, PythonType type, PythonProperty property); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/Tableau.Migration.PythonGenerator/Writers/IPythonPropertyWriter.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.PythonGenerator.Writers 19 | { 20 | internal interface IPythonPropertyWriter 21 | { 22 | void Write(IndentingStringBuilder builder, PythonType type, PythonProperty property); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/Tableau.Migration.PythonGenerator/Writers/IPythonTestWriter.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | using System.Threading; 19 | using System.Threading.Tasks; 20 | 21 | namespace Tableau.Migration.PythonGenerator.Writers 22 | { 23 | internal interface IPythonTestWriter 24 | { 25 | ValueTask WriteAsync(PythonTypeCache pyTypeCache, CancellationToken cancel); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/Tableau.Migration.PythonGenerator/Writers/IPythonTypeWriter.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.PythonGenerator.Writers 19 | { 20 | internal interface IPythonTypeWriter 21 | { 22 | void Write(IndentingStringBuilder builder, PythonType type); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/Tableau.Migration.PythonGenerator/Writers/IPythonWriter.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | using System.Threading; 19 | using System.Threading.Tasks; 20 | 21 | namespace Tableau.Migration.PythonGenerator.Writers 22 | { 23 | internal interface IPythonWriter 24 | { 25 | ValueTask WriteAsync(PythonTypeCache pyTypeCache, CancellationToken cancel); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/Tableau.Migration/Api/IApiContentUrl.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Api 19 | { 20 | /// 21 | /// Interface for an API request/response that has a nullable content URL. 22 | /// 23 | public interface IApiContentUrl 24 | { 25 | /// 26 | /// Gets the content URL. 27 | /// 28 | string? ContentUrl { get; } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/Tableau.Migration/Api/IContentApiClient.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Api 19 | { 20 | /// 21 | /// Interface for content type-specific API clients 22 | /// 23 | public interface IContentApiClient 24 | { 25 | /// 26 | /// Gets the REST URL content type prefix for the client. 27 | /// 28 | string UrlPrefix { get; } 29 | } 30 | } -------------------------------------------------------------------------------- /src/Tableau.Migration/Api/Publishing/ICustomViewPublisher.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | using Tableau.Migration.Api.Models; 19 | using Tableau.Migration.Content; 20 | 21 | namespace Tableau.Migration.Api.Publishing 22 | { 23 | /// 24 | /// Interface for Custom View publisher classes. 25 | /// 26 | public interface ICustomViewPublisher : IFilePublisher 27 | { } 28 | } 29 | -------------------------------------------------------------------------------- /src/Tableau.Migration/Api/Publishing/IDataSourcePublisher.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | using Tableau.Migration.Api.Models; 19 | using Tableau.Migration.Content; 20 | 21 | namespace Tableau.Migration.Api.Publishing 22 | { 23 | /// 24 | /// Interface for data source publisher classes. 25 | /// 26 | public interface IDataSourcePublisher : IFilePublisher 27 | { } 28 | } 29 | -------------------------------------------------------------------------------- /src/Tableau.Migration/Api/Publishing/IFlowPublisher.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | using Tableau.Migration.Api.Models; 19 | using Tableau.Migration.Content; 20 | 21 | namespace Tableau.Migration.Api.Publishing 22 | { 23 | /// 24 | /// Interface for prep flow publisher classes. 25 | /// 26 | public interface IFlowPublisher : IFilePublisher 27 | { } 28 | } 29 | -------------------------------------------------------------------------------- /src/Tableau.Migration/Api/Publishing/IWorkbookPublisher.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | using Tableau.Migration.Api.Models; 19 | using Tableau.Migration.Content; 20 | 21 | namespace Tableau.Migration.Api.Publishing 22 | { 23 | /// 24 | /// Interface for workbook publisher classes. 25 | /// 26 | public interface IWorkbookPublisher : IFilePublisher 27 | { } 28 | } 29 | -------------------------------------------------------------------------------- /src/Tableau.Migration/Api/Rest/INamedContent.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Api.Rest 19 | { 20 | /// 21 | /// Interface for a content object that has a name. 22 | /// 23 | public interface INamedContent 24 | { 25 | /// 26 | /// Gets the content item's name 27 | /// 28 | string? Name { get; } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/Tableau.Migration/Api/Rest/IRestIdentifiable.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | using System; 19 | 20 | namespace Tableau.Migration.Api.Rest 21 | { 22 | /// 23 | /// Interface for an object that uses a REST API-style LUID identifier. 24 | /// 25 | public interface IRestIdentifiable 26 | { 27 | /// 28 | /// Gets the unique identifier. 29 | /// 30 | Guid Id { get; } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/Tableau.Migration/Api/Rest/Models/IProjectNamedReferenceType.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Api.Rest.Models 19 | { 20 | /// 21 | /// Interface representing an XML element for the project of a content item. 22 | /// 23 | public interface IProjectNamedReferenceType : IProjectReferenceType, INamedContent 24 | { } 25 | } 26 | -------------------------------------------------------------------------------- /src/Tableau.Migration/Api/Rest/Models/IProjectReferenceType.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Api.Rest.Models 19 | { 20 | /// 21 | /// Interface representing an XML element for the project of a content item. 22 | /// 23 | public interface IProjectReferenceType : IRestIdentifiable 24 | { } 25 | } 26 | -------------------------------------------------------------------------------- /src/Tableau.Migration/Api/Rest/Models/ITagType.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Api.Rest.Models 19 | { 20 | /// 21 | /// Interface representing an XML element for the tag of a content item. 22 | /// 23 | public interface ITagType 24 | { 25 | /// 26 | /// The tag label for the response. 27 | /// 28 | string? Label { get; set; } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/Tableau.Migration/Api/Rest/Models/IViewReferenceType.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Api.Rest.Models 19 | { 20 | /// 21 | /// Interface representing an XML element for the view of a content item. 22 | /// 23 | public interface IViewReferenceType : IRestIdentifiable 24 | { } 25 | } 26 | -------------------------------------------------------------------------------- /src/Tableau.Migration/Api/Rest/Models/IWithOwnerType.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Api.Rest.Models 19 | { 20 | /// 21 | /// Interface for an object that has an owner user reference. 22 | /// 23 | public interface IWithOwnerType 24 | { 25 | /// 26 | /// Gets the owner for the response. 27 | /// 28 | IRestIdentifiable? Owner { get; } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/Tableau.Migration/Api/Rest/Models/IWithTagTypes.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Api.Rest.Models 19 | { 20 | /// 21 | /// Interface for an object that has Tags. 22 | /// 23 | public interface IWithTagTypes 24 | { 25 | /// 26 | /// Gets the tags for the response. 27 | /// 28 | ITagType[] Tags { get; internal set; } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/Tableau.Migration/Api/Rest/Models/IWorkbookNamedReferenceType.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Api.Rest.Models 19 | { 20 | /// 21 | /// Interface representing an XML element for the workbook of a content item. 22 | /// 23 | public interface IWorkbookNamedReferenceType : IWorkbookReferenceType, INamedContent 24 | { } 25 | } 26 | -------------------------------------------------------------------------------- /src/Tableau.Migration/Api/Rest/Models/IWorkbookReferenceType.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Api.Rest.Models 19 | { 20 | /// 21 | /// Interface representing an XML element for the workbook of a content item. 22 | /// 23 | public interface IWorkbookReferenceType : IRestIdentifiable 24 | { } 25 | } 26 | -------------------------------------------------------------------------------- /src/Tableau.Migration/Api/Rest/Models/Responses/Cloud/ICloudScheduleType.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Api.Rest.Models.Responses.Cloud 19 | { 20 | /// 21 | /// Interface for a Tableau Cloud schedule response item. 22 | /// 23 | public interface ICloudScheduleType : IScheduleType 24 | { } 25 | } 26 | -------------------------------------------------------------------------------- /src/Tableau.Migration/Api/Rest/Models/Responses/IScheduleReferenceType.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Api.Rest.Models.Responses 19 | { 20 | /// 21 | /// Interface for a Tableau Server schedule reference response item. 22 | /// 23 | public interface IScheduleReferenceType : IRestIdentifiable 24 | { } 25 | } 26 | -------------------------------------------------------------------------------- /src/Tableau.Migration/Api/Rest/TagsUriBuilder.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Api.Rest 19 | { 20 | internal class TagsUriBuilder : ContentItemUriBuilderBase 21 | { 22 | public TagsUriBuilder(string prefix) 23 | : base(prefix, RestUrlKeywords.Tags) 24 | { } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/Tableau.Migration/Api/Simulation/Rest/Net/Responses/IRestApiResponseBuilder.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | using Tableau.Migration.Net.Simulation.Responses; 19 | 20 | namespace Tableau.Migration.Api.Simulation.Rest.Net.Responses 21 | { 22 | internal interface IRestApiResponseBuilder : IResponseBuilder 23 | { 24 | IRestErrorBuilder? ErrorOverride { get; set; } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/Tableau.Migration/Api/Simulation/Rest/Net/Responses/IRestErrorBuilder.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | using System.Net; 19 | using Tableau.Migration.Api.Rest.Models; 20 | 21 | namespace Tableau.Migration.Api.Simulation.Rest.Net.Responses 22 | { 23 | internal interface IRestErrorBuilder 24 | { 25 | Error BuildError(out HttpStatusCode statusCode); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/Tableau.Migration/Api/Simulation/Rest/Net/Responses/UnauthorizedRestErrorBuilder.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | using System.Net; 19 | 20 | namespace Tableau.Migration.Api.Simulation.Rest.Net.Responses 21 | { 22 | internal record UnauthorizedRestErrorBuilder : StaticRestErrorBuilder 23 | { 24 | public UnauthorizedRestErrorBuilder() 25 | : base(HttpStatusCode.Unauthorized, 0, "Unauthorized", "Unauthorized") 26 | { } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/Tableau.Migration/Api/Simulation/SimulatedDataSourceData.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Api.Simulation 19 | { 20 | /// 21 | /// Object that holds simulated datasource file data. 22 | /// 23 | public class SimulatedDataSourceData : SimulatedDataWithConnections 24 | { } 25 | } 26 | -------------------------------------------------------------------------------- /src/Tableau.Migration/Api/TableauServerVersionProvider.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Api 19 | { 20 | internal sealed class TableauServerVersionProvider : ITableauServerVersionProvider 21 | { 22 | public TableauServerVersion? Version { get; private set; } 23 | 24 | public void Set(TableauServerVersion version) => Version = version; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/Tableau.Migration/Api/Tags/ITagsContentApiClient.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Api.Tags 19 | { 20 | /// 21 | /// Interface for an API client 22 | /// for a content type that has tag operations. 23 | /// 24 | public interface ITagsContentApiClient 25 | { 26 | /// 27 | /// Gets the tags API client. 28 | /// 29 | ITagsApiClient Tags { get; } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/Tableau.Migration/Content/GroupUser.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Content 19 | { 20 | internal sealed class GroupUser : IGroupUser 21 | { 22 | /// 23 | public IContentReference User { get; set; } 24 | 25 | public GroupUser( 26 | IContentReference user) 27 | { 28 | User = Guard.AgainstNull(user, () => user); 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/Tableau.Migration/Content/ICloudSubscription.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | using Tableau.Migration.Content.Schedules.Cloud; 19 | 20 | namespace Tableau.Migration.Content 21 | { 22 | /// 23 | /// The interface for a cloud subscription. 24 | /// 25 | public interface ICloudSubscription : ISubscription, IDelible 26 | { } 27 | } -------------------------------------------------------------------------------- /src/Tableau.Migration/Content/IContentReferenceExtensions.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Content 19 | { 20 | internal static class IContentReferenceExtensions 21 | { 22 | public static ContentReferenceStub ToStub(this IContentReference contentReference) 23 | => new(contentReference); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/Tableau.Migration/Content/IDelible.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Content 19 | { 20 | /// 21 | /// The interface for a content type that can be deleted. 22 | /// 23 | public interface IDelible 24 | { } 25 | } -------------------------------------------------------------------------------- /src/Tableau.Migration/Content/IDescriptionContent.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Content 19 | { 20 | /// 21 | /// Interface for a content item that has a description. 22 | /// 23 | public interface IDescriptionContent 24 | { 25 | /// 26 | /// Gets or sets the description. 27 | /// 28 | string Description { get; set; } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/Tableau.Migration/Content/IExtractContent.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Content 19 | { 20 | /// 21 | /// Interface for a content item that has an extract. 22 | /// 23 | public interface IExtractContent 24 | { 25 | /// 26 | /// Gets or sets whether or not extracts are encrypted. 27 | /// 28 | bool EncryptExtracts { get; set; } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/Tableau.Migration/Content/IGroupUser.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Content 19 | { 20 | /// 21 | /// Interface for a user linked to a group content item. 22 | /// 23 | public interface IGroupUser 24 | { 25 | /// 26 | /// Gets the user that belongs to a group. 27 | /// 28 | IContentReference User { get; internal set; } 29 | } 30 | } -------------------------------------------------------------------------------- /src/Tableau.Migration/Content/IPermissionsContent.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Content 19 | { 20 | /// 21 | /// Interface to be inherited by content items that have permissions. 22 | /// 23 | public interface IPermissionsContent : IContentReference 24 | { } 25 | } 26 | -------------------------------------------------------------------------------- /src/Tableau.Migration/Content/IPublishableDataSource.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Content 19 | { 20 | /// 21 | /// Interface for a that has been downloaded 22 | /// and has full information necessary for re-publishing. 23 | /// 24 | public interface IPublishableDataSource : IDataSourceDetails, IFileContent, IConnectionsContent 25 | { } 26 | } 27 | -------------------------------------------------------------------------------- /src/Tableau.Migration/Content/IPublishableFlow.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Content 19 | { 20 | /// 21 | /// Interface for a that has been downloaded 22 | /// and has full information necessary for re-publishing. 23 | /// 24 | public interface IPublishableFlow : IFlow, IFileContent 25 | { } 26 | } 27 | -------------------------------------------------------------------------------- /src/Tableau.Migration/Content/IRequiresEmbeddedCredentialMigration.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Content 19 | { 20 | /// 21 | /// Interface for a content item that needs embedded credentials migrated. 22 | /// 23 | public interface IRequiresEmbeddedCredentialMigration : IWithEmbeddedCredentials 24 | { } 25 | } -------------------------------------------------------------------------------- /src/Tableau.Migration/Content/IRequiresLabelUpdate.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Content 19 | { 20 | /// 21 | /// Interface for content items that require label creation. 22 | /// 23 | public interface IRequiresLabelUpdate : IWithLabels 24 | { } 25 | } 26 | -------------------------------------------------------------------------------- /src/Tableau.Migration/Content/IRequiresOwnerUpdate.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Content 19 | { 20 | /// 21 | /// Interface for an object that requires an owner update after creation. 22 | /// 23 | public interface IRequiresOwnerUpdate : IWithOwner 24 | { } 25 | } 26 | -------------------------------------------------------------------------------- /src/Tableau.Migration/Content/IServerSubscription.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | using Tableau.Migration.Content.Schedules.Server; 19 | 20 | namespace Tableau.Migration.Content 21 | { 22 | /// 23 | /// The interface for a server subscription. 24 | /// 25 | public interface IServerSubscription : ISubscription 26 | { } 27 | } -------------------------------------------------------------------------------- /src/Tableau.Migration/Content/ITag.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Content 19 | { 20 | /// 21 | /// Interface for tags associated with content items. 22 | /// 23 | public interface ITag 24 | { 25 | /// 26 | /// Gets or sets label for the tag. 27 | /// 28 | string Label { get; set; } 29 | } 30 | } -------------------------------------------------------------------------------- /src/Tableau.Migration/Content/IUsernameContent.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Content 19 | { 20 | /// 21 | /// Interface for a content item that uses a domain qualified username. 22 | /// 23 | public interface IUsernameContent 24 | : IContentReference, IWithDomain, IMappableContent 25 | { } 26 | } 27 | -------------------------------------------------------------------------------- /src/Tableau.Migration/Content/IWithConnections.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Content 19 | { 20 | /// 21 | /// Interface for a content item with embedded connections. 22 | /// 23 | public interface IWithConnections 24 | { } 25 | } -------------------------------------------------------------------------------- /src/Tableau.Migration/Content/IWithDomain.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Content 19 | { 20 | /// 21 | /// Interface for content items with a domain. 22 | /// 23 | public interface IWithDomain 24 | { 25 | /// 26 | /// Gets the domain this item belongs to. 27 | /// Changes should be made through mapping. 28 | /// 29 | string Domain { get; } 30 | } 31 | } -------------------------------------------------------------------------------- /src/Tableau.Migration/Content/IWithEmbeddedCredentials.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Content 19 | { 20 | /// 21 | /// Interface for a content item that has embedded credentials. 22 | /// 23 | public interface IWithEmbeddedCredentials : IContentReference 24 | { } 25 | } -------------------------------------------------------------------------------- /src/Tableau.Migration/Content/IWithLabels.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Content 19 | { 20 | /// 21 | /// Interface for a content item that has labels. 22 | /// 23 | public interface IWithLabels 24 | { } 25 | } 26 | -------------------------------------------------------------------------------- /src/Tableau.Migration/Content/IWithOwner.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Content 19 | { 20 | /// 21 | /// Interface to be inherited by content items with owner. 22 | /// 23 | public interface IWithOwner : IContentReference 24 | { 25 | /// 26 | /// Gets or sets the owner for the content item. 27 | /// 28 | IContentReference Owner { get; set; } 29 | } 30 | } -------------------------------------------------------------------------------- /src/Tableau.Migration/Content/Schedules/Cloud/ICloudExtractRefreshTask.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Content.Schedules.Cloud 19 | { 20 | /// 21 | /// Interface for a cloud extract refresh task content item. 22 | /// 23 | public interface ICloudExtractRefreshTask : IExtractRefreshTask 24 | { } 25 | } -------------------------------------------------------------------------------- /src/Tableau.Migration/Content/Schedules/Cloud/ICloudSchedule.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Content.Schedules.Cloud 19 | { 20 | /// 21 | /// Interface for a Tableau Cloud schedule. 22 | /// 23 | public interface ICloudSchedule : ISchedule 24 | { } 25 | } -------------------------------------------------------------------------------- /src/Tableau.Migration/Content/Schedules/IScheduleValidator.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Content.Schedules 19 | { 20 | internal interface IScheduleValidator 21 | where TSchedule : ISchedule 22 | { 23 | void Validate(TSchedule schedule); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/Tableau.Migration/Content/Schedules/Server/IServerExtractRefreshTask.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Content.Schedules.Server 19 | { 20 | /// 21 | /// Interface for a server extract refresh task content item. 22 | /// 23 | public interface IServerExtractRefreshTask : IExtractRefreshTask 24 | { } 25 | } -------------------------------------------------------------------------------- /src/Tableau.Migration/Engine/Endpoints/ContentClients/IContentClient.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Engine.Endpoints.ContentClients 19 | { 20 | /// 21 | /// Interface to work with content types. 22 | /// 23 | /// This allows work to be done on a content item, abstracted from the ApiClient. 24 | public interface IContentClient 25 | { } 26 | } 27 | -------------------------------------------------------------------------------- /src/Tableau.Migration/Engine/Endpoints/IDestinationApiEndpoint.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Engine.Endpoints 19 | { 20 | /// 21 | /// Interface for an object that represents a location to move Tableau data to. 22 | /// 23 | public interface IDestinationApiEndpoint : IDestinationEndpoint, IMigrationApiEndpoint 24 | { } 25 | } 26 | -------------------------------------------------------------------------------- /src/Tableau.Migration/Engine/Endpoints/ISourceApiEndpoint.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Engine.Endpoints 19 | { 20 | /// 21 | /// Interface for an object that represents a location to move Tableau data from. 22 | /// 23 | public interface ISourceApiEndpoint : ISourceEndpoint, IMigrationApiEndpoint 24 | { } 25 | } 26 | -------------------------------------------------------------------------------- /src/Tableau.Migration/Engine/Hooks/IEmbeddedCredentialsCapabilityManager.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Engine.Hooks 19 | { 20 | /// 21 | /// Manages capabilities related to embedded credentials. 22 | /// 23 | internal interface IEmbeddedCredentialsCapabilityManager : IMigrationCapabilityManager 24 | { } 25 | } -------------------------------------------------------------------------------- /src/Tableau.Migration/Engine/Hooks/IInitializeMigrationHook.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Engine.Hooks 19 | { 20 | /// 21 | /// Interface representing a hook called before a migration begins. 22 | /// 23 | public interface IInitializeMigrationHook : IMigrationHook 24 | { } 25 | } -------------------------------------------------------------------------------- /src/Tableau.Migration/Engine/Hooks/IMigrationActionCompletedHook.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | using Tableau.Migration.Engine.Actions; 19 | 20 | namespace Tableau.Migration.Engine.Hooks 21 | { 22 | /// 23 | /// Interface representing a hook called when a completes. 24 | /// 25 | public interface IMigrationActionCompletedHook : IMigrationHook 26 | { } 27 | } 28 | -------------------------------------------------------------------------------- /src/Tableau.Migration/Engine/Hooks/ISubscriptionsCapabilityManager.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Engine.Hooks 19 | { 20 | /// 21 | /// Manages capabilities related to subscriptions. 22 | /// 23 | public interface ISubscriptionsCapabilityManager : IMigrationCapabilityManager 24 | { } 25 | } -------------------------------------------------------------------------------- /src/Tableau.Migration/Engine/Hooks/PostPublish/IBulkPostPublishHook.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Engine.Hooks.PostPublish 19 | { 20 | /// 21 | /// Interface representing a hook called when a migration attempt for bulk content items completes. 22 | /// 23 | public interface IBulkPostPublishHook : 24 | IMigrationHook> 25 | { } 26 | } 27 | -------------------------------------------------------------------------------- /src/Tableau.Migration/Engine/Hooks/Transformers/Default/IMappedUserTransformer.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Engine.Hooks.Transformers.Default 19 | { 20 | /// 21 | /// Interface for an object that can transform a user reference to maintain owner references. 22 | /// 23 | public interface IMappedUserTransformer : IUserReferenceTransformer 24 | { } 25 | } 26 | -------------------------------------------------------------------------------- /src/Tableau.Migration/Engine/Hooks/Transformers/Default/IUserReferenceTransformer.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Engine.Hooks.Transformers.Default 19 | { 20 | /// 21 | /// Interface for an object that can transform a user reference, for example to maintain owner references. 22 | /// 23 | public interface IUserReferenceTransformer : IContentTransformer 24 | { } 25 | } 26 | -------------------------------------------------------------------------------- /src/Tableau.Migration/IAsyncDisposableResult.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | using System; 19 | 20 | namespace Tableau.Migration 21 | { 22 | /// 23 | /// Interface representing the disposable result of an operation. 24 | /// 25 | /// The result's value type 26 | public interface IAsyncDisposableResult : IResult, IAsyncDisposable 27 | where T : class, IAsyncDisposable 28 | { } 29 | } 30 | -------------------------------------------------------------------------------- /src/Tableau.Migration/IContentReferenceExtensions.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration 19 | { 20 | internal static class IContentReferenceExtensions 21 | { 22 | public static string ToStringForLog(this IContentReference contentBase) 23 | { 24 | return $"Id: {contentBase.Id}, Name: {contentBase.Name}, Location: {contentBase.Location}, ContentUrl: {contentBase.ContentUrl}"; 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/Tableau.Migration/IMigrationSdk.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | using System; 19 | 20 | namespace Tableau.Migration 21 | { 22 | /// 23 | /// Interface for global SDK metadata. 24 | /// 25 | internal interface IMigrationSdk 26 | { 27 | /// 28 | /// Gets the current SDK version. 29 | /// 30 | Version Version { get; } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/Tableau.Migration/JsonConverters/Constants.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.JsonConverters 19 | { 20 | internal static class Constants 21 | { 22 | public const string PARTITION = "Partition"; 23 | public const string ENTRIES = "Entries"; 24 | public const string CLASS_NAME = "ClassName"; 25 | public const string EXCEPTION = "Exception"; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/Tableau.Migration/Net/IHttpDeleteRequestBuilder.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Net 19 | { 20 | /// 21 | /// Interface for a class that can build HTTP DELETE requests. 22 | /// 23 | public interface IHttpDeleteRequestBuilder : IHttpRequestBuilder 24 | { } 25 | } -------------------------------------------------------------------------------- /src/Tableau.Migration/Net/IHttpGetRequestBuilder.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Net 19 | { 20 | /// 21 | /// Interface for a class that can build HTTP GET requests. 22 | /// 23 | public interface IHttpGetRequestBuilder : IHttpRequestBuilder 24 | { } 25 | } -------------------------------------------------------------------------------- /src/Tableau.Migration/Net/IHttpPatchRequestBuilder.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Net 19 | { 20 | /// 21 | /// Interface for a class that can build HTTP PATCH requests. 22 | /// 23 | public interface IHttpPatchRequestBuilder : IHttpContentRequestBuilder 24 | { } 25 | } -------------------------------------------------------------------------------- /src/Tableau.Migration/Net/IHttpPostRequestBuilder.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Net 19 | { 20 | /// 21 | /// Interface for a class that can build HTTP POST requests. 22 | /// 23 | public interface IHttpPostRequestBuilder : IHttpContentRequestBuilder 24 | { } 25 | } -------------------------------------------------------------------------------- /src/Tableau.Migration/Net/IHttpPutRequestBuilder.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Net 19 | { 20 | /// 21 | /// Interface for a class that can build HTTP PUT requests. 22 | /// 23 | public interface IHttpPutRequestBuilder : IHttpContentRequestBuilder 24 | { } 25 | } -------------------------------------------------------------------------------- /src/Tableau.Migration/Net/INetworkTraceRedactor.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Net 19 | { 20 | internal interface INetworkTraceRedactor 21 | { 22 | string ReplaceSensitiveData(string input); 23 | 24 | bool IsSensitiveMultipartContent(string? contentName); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/Tableau.Migration/Net/IUserAgentProvider.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Net 19 | { 20 | /// 21 | /// Interface for an object that can provide a user agent string. 22 | /// 23 | internal interface IUserAgentProvider 24 | { 25 | /// 26 | /// Gets the user agent string. 27 | /// 28 | string UserAgent { get; } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/Tableau.Migration/Net/Rest/GuidExtensions.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | using System; 19 | 20 | namespace Tableau.Migration.Net.Rest 21 | { 22 | internal static class GuidExtensions 23 | { 24 | public static string ToUrlSegment(this Guid guid) 25 | { 26 | return guid.ToString("D"); 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/Tableau.Migration/Net/Rest/IRestRequestBuilderFactory.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Net.Rest 19 | { 20 | /// 21 | /// Interface for factories. 22 | /// 23 | public interface IRestRequestBuilderFactory : IRequestBuilderFactory 24 | { } 25 | } -------------------------------------------------------------------------------- /src/Tableau.Migration/Net/Rest/ListSortDirectionExtensions.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | using System.ComponentModel; 19 | 20 | namespace Tableau.Migration.Net.Rest 21 | { 22 | internal static class ListSortDirectionExtensions 23 | { 24 | public static string GetQueryStringValue(this ListSortDirection direction) => 25 | direction == ListSortDirection.Ascending ? "asc" : "desc"; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/Tableau.Migration/Net/Rest/RestHeaders.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Net.Rest 19 | { 20 | internal static class RestHeaders 21 | { 22 | public const string AuthenticationToken = "X-Tableau-Auth"; 23 | 24 | public const string ContentDisposition = "Content-Disposition"; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/Tableau.Migration/Net/Simulation/NullResponseSimulatorProvider.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | using System.Net.Http; 19 | 20 | namespace Tableau.Migration.Net.Simulation 21 | { 22 | internal sealed class NullResponseSimulatorProvider : IResponseSimulatorProvider 23 | { 24 | public IResponseSimulator? ForRequest(HttpRequestMessage request) 25 | => null; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/Tableau.Migration/Net/TableauSerializer.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Net 19 | { 20 | /// 21 | /// Class for serializing Tableau Server request and response content. 22 | /// 23 | internal sealed class TableauSerializer : ITableauSerializer 24 | { 25 | internal static readonly TableauSerializer Instance = new(); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/Tableau.Migration/Paging/IPagedResult.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | using System.Collections.Immutable; 19 | 20 | namespace Tableau.Migration.Paging 21 | { 22 | /// 23 | /// interface for a page of data. 24 | /// 25 | /// The item type. 26 | public interface IPagedResult : IResult>, IPageInfo 27 | { } 28 | } 29 | -------------------------------------------------------------------------------- /src/Tableau.Migration/Properties/NUGET.md: -------------------------------------------------------------------------------- 1 | Customers worldwide are migrating to Tableau Cloud to take advantage of the innovation, reduced cost, security, and scalability of Tableau’s managed data service. The Migration Software Development Kit (SDK) helps you migrate to Tableau Cloud in a seamless and predictable way. You can use the Migration SDK to build your own migration application to do the following: 2 | 3 | - Migrate users and groups 4 | - Migrate content like data sources and workbooks 5 | - Migrate and, in some cases, modify your robust governance structure for your content in Tableau Cloud 6 | 7 | > Note: This SDK is specific for migrating **from** Tableau Server **to** Tableau Cloud. If you're looking to increase your productivity as you interact with the Tableau Server REST API for regular Tableau Server usage, see Tableau Server Client. -------------------------------------------------------------------------------- /src/Tableau.Migration/Properties/TableauLogoColor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tableau/tableau-migration-sdk/00a99952d72a0ef994e361d63e1860368a795e8b/src/Tableau.Migration/Properties/TableauLogoColor.png -------------------------------------------------------------------------------- /src/Tableau.Migration/TaskDelayer.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | using System; 19 | using System.Threading; 20 | using System.Threading.Tasks; 21 | 22 | namespace Tableau.Migration 23 | { 24 | internal class TaskDelayer : ITaskDelayer 25 | { 26 | public async Task DelayAsync(TimeSpan delay, CancellationToken cancel) 27 | => await Task.Delay(delay, cancel).ConfigureAwait(false); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /tests/Python.ExampleApplication.Tests/README.md: -------------------------------------------------------------------------------- 1 | # Intro 2 | 3 | This is the test project for the Python Example Application we reference in code samples for documentation. 4 | 5 | ## Instructions to run tests 6 | 7 | Refer to [contributing.md](../../src/Python/CONTRIBUTING.md#first-steps) for instructions to install Python and Hatch(optional). Then, 8 | 9 | - Switch to this directory 10 | - Run `python -m pip install -r .\requirements.txt` 11 | - If using `pytest`, simply run `pytest`. If using hatch, run `hatch run test:test` 12 | -------------------------------------------------------------------------------- /tests/Python.ExampleApplication.Tests/pytest.ini: -------------------------------------------------------------------------------- 1 | [pytest] 2 | testpaths = 3 | tests 4 | 5 | pythonpath = 6 | ..\..\examples\Python.ExampleApplication -------------------------------------------------------------------------------- /tests/Python.ExampleApplication.Tests/requirements.txt: -------------------------------------------------------------------------------- 1 | cffi==1.17.1 2 | clr_loader==0.2.7.post0 3 | colorama==0.4.6 4 | coverage==7.8.0 5 | iniconfig==2.1.0 6 | packaging==25.0 7 | pluggy==1.6.0 8 | pycparser==2.22 9 | pytest==8.3.5 10 | pytest-cov==6.1.1 11 | pythonnet==3.0.5 12 | ruff==0.11.10 13 | typing_extensions==4.13.2 14 | hatch===1.14.1 -------------------------------------------------------------------------------- /tests/Python.ExampleApplication.Tests/tests/test_log_migration_batches_hook.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2025, Salesforce, Inc. 2 | # SPDX-License-Identifier: Apache-2 3 | # 4 | # Licensed under the Apache License, Version 2.0 (the "License"); 5 | # you may not use this file except in compliance with the License. 6 | # You may obtain a copy of the License at 7 | # 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | # 10 | # Unless required by applicable law or agreed to in writing, software 11 | # distributed under the License is distributed on an "AS IS" BASIS, 12 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | # See the License for the specific language governing permissions and 14 | # limitations under the License. 15 | 16 | from log_migration_batches_hook import LogMigrationBatchesHookForUsers 17 | 18 | class TestLogMigrationBatchesHookForUsers(): 19 | def test_init(self): 20 | LogMigrationBatchesHookForUsers() 21 | 22 | def test_execute(self): 23 | hook = LogMigrationBatchesHookForUsers() 24 | assert hook._content_type == "User" 25 | -------------------------------------------------------------------------------- /tests/Python.TestApplication/.gitignore: -------------------------------------------------------------------------------- 1 | manifest.json 2 | -------------------------------------------------------------------------------- /tests/Python.TestApplication/.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "python.testing.pytestEnabled": true, 3 | "python.testing.unittestEnabled": false, 4 | "python.testing.autoTestDiscoverOnSaveEnabled": true, 5 | "python.testing.pytestArgs": [ 6 | "tests" 7 | ], 8 | "python.analysis.typeCheckingMode": "basic" 9 | } -------------------------------------------------------------------------------- /tests/Python.TestApplication/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "source": { 3 | "url": "", 4 | "site_content_url": "", 5 | "access_token_name": "", 6 | "access_token": "" 7 | }, 8 | "destination": { 9 | "url": "", 10 | "site_content_url": "", 11 | "access_token_name": "", 12 | "access_token": "" 13 | }, 14 | "log": { 15 | "folder_path": "", 16 | "manifest_folder_path": "" 17 | }, 18 | "test_tableau_cloud_username_options": { 19 | "base_override_mail_address": "", 20 | "always_override_address": true 21 | }, 22 | "special_users": { 23 | "admin_domain": "", 24 | "admin_username": "", 25 | "emails": [] 26 | }, 27 | "skipped_project": "", 28 | "skipped_parent_destination": "Missing Parent", 29 | "previous_manifest": "" 30 | } 31 | -------------------------------------------------------------------------------- /tests/Python.TestApplication/pyproject.toml: -------------------------------------------------------------------------------- 1 | [project] 2 | name = "tableau_migration_testapplication" 3 | dynamic = ["version"] 4 | 5 | authors = [ 6 | { name="Salesforce, Inc." }, 7 | ] 8 | description = "Tableau Migration SDK - Test Application" 9 | # https://devguide.python.org/versions/ 10 | requires-python = ">=3.12" 11 | classifiers = [ 12 | "Programming Language :: Python :: 3", 13 | "Operating System :: OS Independent", 14 | ] 15 | 16 | dependencies = [ 17 | "typing_extensions==4.13.2", 18 | "cffi==1.17.1", 19 | "pycparser==2.22", 20 | "pythonnet==3.0.5", 21 | "configparser==7.2.0" 22 | ] 23 | 24 | [tool.ruff] 25 | # Enable pycodestyle (`E`) and Pyflakes (`F`) codes by default. 26 | select = ["D", "E", "F", "N"] 27 | ignore = ["D401", "D407", "E501", "D203", "D212"] 28 | 29 | [tool.hatch.envs.test] 30 | dev-mode = false 31 | dependencies = [ 32 | "pytest>=8.3.5" 33 | ] 34 | 35 | [tool.hatch.envs.test.scripts] 36 | test = "pytest" 37 | 38 | [[tool.hatch.envs.test.matrix]] 39 | python = ["3.9", "3.10", "3.11", "3.12"] 40 | -------------------------------------------------------------------------------- /tests/Python.TestApplication/pytest.ini: -------------------------------------------------------------------------------- 1 | [pytest] 2 | testpaths = 3 | testapplication_tests 4 | 5 | pythonpath = 6 | ..\..\src\Python\src -------------------------------------------------------------------------------- /tests/Python.TestApplication/requirements.txt: -------------------------------------------------------------------------------- 1 | typing_extensions==4.13.2 2 | cffi==1.17.1 3 | pycparser==2.22 4 | pythonnet==3.0.5 5 | configparser==7.2.0 6 | -------------------------------------------------------------------------------- /tests/Tableau.Migration.TestApplication/Config/SpecialUsersOptions.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | using System; 19 | 20 | namespace Tableau.Migration.TestApplication.Config 21 | { 22 | public class SpecialUsersOptions 23 | { 24 | public string AdminDomain { get; set; } = ""; 25 | 26 | public string AdminUsername { get; set; } = ""; 27 | 28 | public string[] Emails { get; set; } = Array.Empty(); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /tests/Tableau.Migration.TestApplication/README.md: -------------------------------------------------------------------------------- 1 | # Server to Cloud Migration SDK - Test Application 2 | This is a console application used to test the Migration SDK .Net Features. 3 | 4 | # Logging 5 | [Serilog](https://github.com/serilog/serilog) is used as the logging provider. Writting logs to console and file are 6 | supported by default. 7 | 8 | ## Logging configuration 9 | Logging configuration is handled in the `Program.cs` file `services.AddLogging(...)` method 10 | 11 | -------------------------------------------------------------------------------- /tests/Tableau.Migration.Tests/HttpStatusCodeExtensions.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | using System.Net; 19 | 20 | namespace Tableau.Migration.Tests 21 | { 22 | public static class HttpStatusCodeExtensions 23 | { 24 | public static bool IsSuccessStatusCode(this HttpStatusCode statusCode) 25 | => ((int)statusCode >= 200) && ((int)statusCode <= 299); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /tests/Tableau.Migration.Tests/StringEnumDataAttribute.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Tests 19 | { 20 | public class StringEnumDataAttribute : ValuesAttribute 21 | where T : StringEnum 22 | { 23 | public StringEnumDataAttribute(params string[] exclude) 24 | : base(StringEnum.GetAll(exclude)) 25 | { } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /tests/Tableau.Migration.Tests/StringEnumGenerator.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Tests 19 | { 20 | public static class StringEnumGenerator 21 | { 22 | public static string GetRandomValue() 23 | where T : StringEnum 24 | => StringEnum.GetAll().PickRandom(); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /tests/Tableau.Migration.Tests/TestConstants.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | using System; 19 | 20 | namespace Tableau.Migration.Tests 21 | { 22 | public static class TestConstants 23 | { 24 | public const string LocalhostUrl = "https://localhost"; 25 | public static readonly Uri LocalhostUri = new(LocalhostUrl); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /tests/Tableau.Migration.Tests/TestPagedTableauServerResponse.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | using System; 19 | using Tableau.Migration.Api.Rest.Models.Responses; 20 | 21 | namespace Tableau.Migration.Tests 22 | { 23 | public class TestPagedTableauServerResponse : PagedTableauServerResponse 24 | { 25 | public override object[] Items { get; set; } = Array.Empty(); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /tests/Tableau.Migration.Tests/TestPlanOptions.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Tests 19 | { 20 | public class TestPlanOptions 21 | { 22 | public int TestOption { get; init; } = 47; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /tests/Tableau.Migration.Tests/TestPublishType.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.Tests 19 | { 20 | public class TestPublishType 21 | { } 22 | } 23 | -------------------------------------------------------------------------------- /tests/Tableau.Migration.Tests/TestTableauServerResponse.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | using Tableau.Migration.Api.Rest.Models.Responses; 19 | 20 | namespace Tableau.Migration.Tests 21 | { 22 | public class TestTableauServerResponse : TableauServerResponse 23 | { } 24 | } 25 | -------------------------------------------------------------------------------- /tests/Tableau.Migration.Tests/Unit/Api/Simulation/Rest/Net/Responses/ResponseBuilderTestBase.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | using Tableau.Migration.Net; 19 | 20 | namespace Tableau.Migration.Tests.Unit.Api.Simulation.Rest.Net.Responses 21 | { 22 | public abstract class ResponseBuilderTestBase : AutoFixtureTestBase 23 | { 24 | internal readonly HttpContentSerializer Serializer = HttpContentSerializer.Instance; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /tests/Tableau.Migration.Tests/Unit/HttpClientExtensions.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | using System.Net.Http; 19 | 20 | namespace Tableau.Migration.Tests.Unit 21 | { 22 | public static class HttpClientExtensions 23 | { 24 | public static HttpMessageHandler GetMessageHandler(this HttpClient httpClient) 25 | => (httpClient.GetFieldValue(typeof(HttpMessageInvoker), "_handler") as HttpMessageHandler)!; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /tests/Tableau.Migration.Tests/Unit/IHttpClientExtensions.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | using System.Net.Http; 19 | using Tableau.Migration.Net; 20 | 21 | namespace Tableau.Migration.Tests.Unit 22 | { 23 | public static class IHttpClientExtensions 24 | { 25 | public static HttpClient GetInnerClient(this IHttpClient httpClient) 26 | => (httpClient.GetFieldValue("_innerHttpClient") as HttpClient)!; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /tools/Tableau.Migration.CleanServer/GlobalSuppressions.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | using System.Diagnostics.CodeAnalysis; 19 | 20 | [assembly: SuppressMessage("Reliability", "CA2007:Consider calling ConfigureAwait on the awaited task", Justification = "")] 21 | -------------------------------------------------------------------------------- /tools/Tableau.Migration.CleanServer/Tableau.Migration.CleanSite.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Exe 5 | net9.0 6 | enable 7 | enable 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | Always 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /tools/Tableau.Migration.CleanServer/clean-site-settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "ConnectionConfig": { 3 | "ServerUrl": "http://server", 4 | "SiteContentUrl": "", 5 | "AccessTokenName": "my server token name", 6 | "AccessToken": "my server token" 7 | } 8 | } -------------------------------------------------------------------------------- /tools/Tableau.Migration.ManifestAnalyzer/ManifestAnalyzerIcon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tableau/tableau-migration-sdk/00a99952d72a0ef994e361d63e1860368a795e8b/tools/Tableau.Migration.ManifestAnalyzer/ManifestAnalyzerIcon.ico -------------------------------------------------------------------------------- /tools/Tableau.Migration.ManifestAnalyzer/ManifestAnalyzerOptions.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | namespace Tableau.Migration.ManifestAnalyzer 19 | { 20 | public class ManifestAnalyzerOptions 21 | { 22 | public required string ManifestPath { get; set; } 23 | public required string ErrorFilePath { get; set; } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /tools/Tableau.Migration.ManifestAnalyzer/Tableau.Migration.ManifestAnalyzer.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Exe 5 | net9.0 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | Always 19 | 20 | 21 | Always 22 | Always 23 | 24 | 25 | Always 26 | Always 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /tools/Tableau.Migration.ManifestAnalyzer/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "ManifestPath": "", 3 | "ErrorFilePath": "" 4 | } -------------------------------------------------------------------------------- /tools/Tableau.Migration.ManifestExplorer.Browser/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2024, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | [assembly:System.Runtime.Versioning.SupportedOSPlatform("browser")] 19 | -------------------------------------------------------------------------------- /tools/Tableau.Migration.ManifestExplorer.Browser/Tableau.Migration.ManifestExplorer.Browser.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | net8.0-browser 4 | Exe 5 | true 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /tools/Tableau.Migration.ManifestExplorer.Browser/wwwroot/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tableau/tableau-migration-sdk/00a99952d72a0ef994e361d63e1860368a795e8b/tools/Tableau.Migration.ManifestExplorer.Browser/wwwroot/favicon.ico -------------------------------------------------------------------------------- /tools/Tableau.Migration.ManifestExplorer.Browser/wwwroot/main.js: -------------------------------------------------------------------------------- 1 | import { dotnet } from './_framework/dotnet.js' 2 | 3 | const is_browser = typeof window != "undefined"; 4 | if (!is_browser) throw new Error(`Expected to be running in a browser`); 5 | 6 | const dotnetRuntime = await dotnet 7 | .withDiagnosticTracing(false) 8 | .withApplicationArgumentsFromQuery() 9 | .create(); 10 | 11 | const config = dotnetRuntime.getConfig(); 12 | 13 | await dotnetRuntime.runMain(config.mainAssemblyName, [globalThis.location.href]); 14 | -------------------------------------------------------------------------------- /tools/Tableau.Migration.ManifestExplorer.Desktop/ManifestExplorerIcon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tableau/tableau-migration-sdk/00a99952d72a0ef994e361d63e1860368a795e8b/tools/Tableau.Migration.ManifestExplorer.Desktop/ManifestExplorerIcon.ico -------------------------------------------------------------------------------- /tools/Tableau.Migration.ManifestExplorer.Desktop/README.md: -------------------------------------------------------------------------------- 1 | # Manifest Explorer 2 | 3 | The Manifest Analyzer is a tool designed to let users view the manifest. It has the ability to filter the entries and to only view entries with errors. 4 | 5 | ## Key Features 6 | 7 | - **Manifest Loading**: Loading of the manifest is either done by pressing the `Load Manifest` button or by starting the application with the first command line parameter being the path to the manifest. 8 | 9 | ## Installation 10 | From the project folder directly, run `dotnet publish -o -f net9.0` to the folder you want ManifestExplorer to be in. You'll do this everytime it updates. 11 | 12 | Once published, run the `OpenWithManifestExplorer.ps1` file to add this tool to the right click menu. You only need to do this once. 13 | -------------------------------------------------------------------------------- /tools/Tableau.Migration.ManifestExplorer.Desktop/app.manifest: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | 9 | 10 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /tools/Tableau.Migration.ManifestExplorer/App.axaml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /tools/Tableau.Migration.ManifestExplorer/Assets/ManifestExplorer.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tableau/tableau-migration-sdk/00a99952d72a0ef994e361d63e1860368a795e8b/tools/Tableau.Migration.ManifestExplorer/Assets/ManifestExplorer.ico -------------------------------------------------------------------------------- /tools/Tableau.Migration.ManifestExplorer/Assets/StartImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tableau/tableau-migration-sdk/00a99952d72a0ef994e361d63e1860368a795e8b/tools/Tableau.Migration.ManifestExplorer/Assets/StartImage.png -------------------------------------------------------------------------------- /tools/Tableau.Migration.ManifestExplorer/Assets/avalonia-logo.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tableau/tableau-migration-sdk/00a99952d72a0ef994e361d63e1860368a795e8b/tools/Tableau.Migration.ManifestExplorer/Assets/avalonia-logo.ico -------------------------------------------------------------------------------- /tools/Tableau.Migration.ManifestExplorer/ViewModels/DesignMainViewModel.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | using System.IO.Abstractions; 19 | 20 | namespace Tableau.Migration.ManifestExplorer.ViewModels 21 | { 22 | internal sealed class DesignMainViewModel : MainViewModel 23 | { 24 | public DesignMainViewModel() 25 | : base(new(new FileSystem())) 26 | { } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /tools/Tableau.Migration.ManifestExplorer/ViewModels/ViewModelBase.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | using ReactiveUI; 19 | 20 | namespace Tableau.Migration.ManifestExplorer.ViewModels 21 | { 22 | public class ViewModelBase : ReactiveObject 23 | { } 24 | } -------------------------------------------------------------------------------- /tools/Tableau.Migration.ManifestExplorer/Views/ExceptionListDialog.axaml.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | using Avalonia.Controls; 19 | 20 | namespace Tableau.Migration.ManifestExplorer 21 | { 22 | public partial class ExceptionListDialog : Window 23 | { 24 | public ExceptionListDialog() 25 | { 26 | InitializeComponent(); 27 | } 28 | } 29 | } -------------------------------------------------------------------------------- /tools/Tableau.Migration.ManifestExplorer/Views/MainView.axaml.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | using Avalonia.Controls; 19 | 20 | namespace Tableau.Migration.ManifestExplorer.Views 21 | { 22 | public partial class MainView : UserControl 23 | { 24 | public MainView() 25 | { 26 | InitializeComponent(); 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /tools/Tableau.Migration.ManifestExplorer/Views/MainWindow.axaml: -------------------------------------------------------------------------------- 1 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /tools/Tableau.Migration.ManifestExplorer/Views/ManifestView.axaml.cs: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright (c) 2025, Salesforce, Inc. 3 | // SPDX-License-Identifier: Apache-2 4 | // 5 | // Licensed under the Apache License, Version 2.0 (the "License") 6 | // you may not use this file except in compliance with the License. 7 | // You may obtain a copy of the License at 8 | // 9 | // http://www.apache.org/licenses/LICENSE-2.0 10 | // 11 | // Unless required by applicable law or agreed to in writing, software 12 | // distributed under the License is distributed on an "AS IS" BASIS, 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | // See the License for the specific language governing permissions and 15 | // limitations under the License. 16 | // 17 | 18 | using Avalonia.Controls; 19 | 20 | namespace Tableau.Migration.ManifestExplorer.Views 21 | { 22 | public partial class ManifestView : UserControl 23 | { 24 | public ManifestView() 25 | { 26 | InitializeComponent(); 27 | } 28 | } 29 | } --------------------------------------------------------------------------------