public async void GetItemsAsync()
        {
            var client   = new DeliveryClient(PROJECT_ID);
            var response = await client.GetItemsAsync(new EqualsFilter("system.type", "cafe"));

            Assert.NotEmpty(response.Items);
        }
示例#2
0
 public ContentLinkResolverTests()
 {
     client = new DeliveryClient(PROJECT_ID)
     {
         CodeFirstModelProvider = { TypeProvider = new CustomTypeProvider() }
     };
 }
示例#3
0
 public DeliveryClientTests()
 {
     client = new DeliveryClient(PROJECT_ID)
     {
         CodeFirstModelProvider = { TypeProvider = new CustomTypeProvider() }
     };
 }
 internal static void AssertDefaultDependencies(this DeliveryClient client)
 {
     client.AssertInlineContentItemTypesWithResolver().AssertDefaultDependenciesWithCustomModelProvider <ModelProvider>();
     Assert.IsType <PropertyMapper>(((ModelProvider)client.ModelProvider).PropertyMapper);
     Assert.IsType <DefaultContentLinkUrlResolver>(((ModelProvider)client.ModelProvider).ContentLinkUrlResolver);
     Assert.IsType <InlineContentItemsProcessor>(((ModelProvider)client.ModelProvider).InlineContentItemsProcessor);
 }
示例#5
0
        private void btnAddRoute_Click(object sender, EventArgs e)
        {
            Route route = new Route();

            route.id            = int.Parse(tbox_addRoute_id.Text);
            route.startingPoint = (Location)cmb_addRoute_startingPoint.SelectedItem;
            route.destination   = (Location)cmb_addRoute_destination.SelectedItem;
            route.distance      = double.Parse(tbox_addRoute_distance.Text);
            route.driver        = (Worker)cmb_addRoute_driver.SelectedItem;
            route.vehicle       = (Vehicle)cmb_addRoute_Vehicle.SelectedItem;
            route.startDate     = dtp_addRoute_startDate.Value;
            route.finished      = false;


            try
            {
                DeliveryHolder.routes.Add(route);
                DeliveryClient.InsertRoute(route);

                clearTab(tabPageRoutes);
                tbox_addRoute_id.Text = DeliveryHolder.routes.Count == 0 ? "1" :
                                        (DeliveryHolder.routes.Count + 1).ToString();

                WorkerHolder.avaliableWorkers    = WorkerClient.GetAavalibleWorkers();
                DeliveryHolder.avaliableVehicles = DeliveryClient.GetAvalibleVehicles();

                setupRouteCmb();
            }
            catch (Exception)
            {
                MessageBox.Show("Failed to add route");
            }
        }
        public async void SecuredProductionAddCorrectHeader()
        {
            var securityKey = "someKey";
            var options     = new DeliveryOptions
            {
                ProjectId = _guid,
                UseSecuredProductionApi = true,
                SecuredProductionApiKey = securityKey
            };

            _mockHttp.Expect($"{_baseUrl}/items")
            .WithHeaders("Authorization", $"Bearer {securityKey}")
            .Respond("application/json", File.ReadAllText(Path.Combine(Environment.CurrentDirectory, "Fixtures\\DeliveryClient\\items.json")));

            var mockHttpClient = _mockHttp.ToHttpClient();

            var client = new DeliveryClient(options)
            {
                HttpClient = mockHttpClient
            };

            await client.GetItemsAsync();

            _mockHttp.VerifyNoOutstandingExpectation();
        }
示例#7
0
        public async Task OnGetAsync()
        {
            DeliveryClient       Client   = new DeliveryClient("ae8a7889-452f-461c-a741-0f4ca3950fab");
            DeliveryItemResponse response = await Client.GetItemAsync("home");

            homePage = response.Item;
        }
示例#8
0
        public void GetTypeAsync_NotFound()
        {
            var client = new DeliveryClient(PROJECT_ID);
            AsyncTestDelegate action = async() => await client.GetTypeAsync("unequestrian_nonadjournment_sur_achoerodus");

            Assert.ThrowsAsync <DeliveryException>(action);
        }
示例#9
0
        public void GetTypesAsync()
        {
            var client   = new DeliveryClient(PROJECT_ID);
            var response = Task.Run(() => client.GetTypesAsync(new SkipParameter(1))).Result;

            Assert.GreaterOrEqual(response.Types.Count, 1);
        }
示例#10
0
        public void GetItemAsync_NotFound()
        {
            var client = new DeliveryClient(PROJECT_ID);
            AsyncTestDelegate action = async() => await client.GetItemAsync("unscintillating_hemerocallidaceae_des_iroquois");

            Assert.ThrowsAsync <DeliveryException>(action);
        }
示例#11
0
        public void GetItemsAsync()
        {
            var client   = new DeliveryClient(PROJECT_ID);
            var response = Task.Run(() => client.GetItemsAsync(new EqualsFilter("system.type", "cafe"))).Result;

            Assert.GreaterOrEqual(response.Items.Count, 1);
        }
示例#12
0
        public void QueryParameters()
        {
            var client     = new DeliveryClient(PROJECT_ID);
            var parameters = new IQueryParameter[]
            {
                new AllFilter("elements.personas", "barista", "coffee", "blogger"),
                new AnyFilter("elements.personas", "barista", "coffee", "blogger"),
                new ContainsFilter("system.sitemap_locations", "cafes"),
                new EqualsFilter("elements.product_name", "Hario V60"),
                new GreaterThanFilter("elements.price", "1000"),
                new GreaterThanOrEqualFilter("elements.price", "50"),
                new InFilter("system.type", "cafe", "coffee"),
                new LessThanFilter("elements.price", "10"),
                new LessThanOrEqualFilter("elements.price", "4"),
                new RangeFilter("elements.country", "Guatemala", "Nicaragua"),
                new DepthParameter(2),
                new ElementsParameter("price", "product_name"),
                new LimitParameter(10),
                new OrderParameter("elements.price", SortOrder.Descending),
                new SkipParameter(2)
            };
            var response = Task.Run(() => client.GetItemsAsync(parameters)).Result;

            Assert.AreEqual(0, response.Items.Count);
        }
示例#13
0
        public void GetContentElementsAsync_NotFound()
        {
            var client = new DeliveryClient(PROJECT_ID);
            AsyncTestDelegate action = async() => await client.GetContentElementAsync("anticommunistical_preventure_sur_helxine", "unlacerated_topognosis_sur_nonvigilantness");

            Assert.ThrowsAsync <DeliveryException>(action);
        }
        public async void GetTypesAsync()
        {
            var client   = new DeliveryClient(PROJECT_ID);
            var response = await client.GetTypesAsync(new SkipParameter(1));

            Assert.NotEmpty(response.Types);
        }
示例#15
0
        public async void GetTypeAsync()
        {
            mockHttp.When($"{baseUrl}/types/article").
            Respond("application/json", File.ReadAllText(Path.Combine(AppContext.BaseDirectory, "Fixtures\\DeliveryClient\\article.json")));

            mockHttp.When($"{baseUrl}/types/coffee").
            Respond("application/json", File.ReadAllText(Path.Combine(AppContext.BaseDirectory, "Fixtures\\DeliveryClient\\coffee.json")));

            DeliveryClient client = InitializeDeliverClientWithACustomeTypeProvider();

            var articleType = await client.GetTypeAsync("article");

            var coffeeType = await client.GetTypeAsync("coffee");

            var taxonomyElement           = articleType.Elements["personas"];
            var processingTaxonomyElement = coffeeType.Elements["processing"];

            Assert.Equal("article", articleType.System.Codename);
            Assert.Equal("text", articleType.Elements["title"].Type);
            Assert.Equal("rich_text", articleType.Elements["body_copy"].Type);
            Assert.Equal("date_time", articleType.Elements["post_date"].Type);
            Assert.Equal("asset", articleType.Elements["teaser_image"].Type);
            Assert.Equal("modular_content", articleType.Elements["related_articles"].Type);
            Assert.Equal("taxonomy", articleType.Elements["personas"].Type);

            Assert.Equal("number", coffeeType.Elements["price"].Type);
            Assert.Equal("taxonomy", coffeeType.Elements["processing"].Type);

            Assert.Equal("personas", taxonomyElement.TaxonomyGroup);
            Assert.Equal("processing", processingTaxonomyElement.TaxonomyGroup);
        }
示例#16
0
        internal static DeliveryClient GetMockedDeliveryClientWithProjectId(
            Guid projectId,
            MockHttpMessageHandler httpMessageHandler = null,
            IModelProvider modelProvider = null,
            IRetryPolicyProvider resiliencePolicyProvider = null,
            ITypeProvider typeProvider = null)
        {
            if (modelProvider != null)
            {
                _mockModelProvider = modelProvider;
            }
            if (resiliencePolicyProvider != null)
            {
                _mockResiliencePolicyProvider = resiliencePolicyProvider;
            }
            if (typeProvider != null)
            {
                _mockTypeProvider = typeProvider;
            }
            var httpClient = httpMessageHandler != null?httpMessageHandler.ToHttpClient() : MockHttp.ToHttpClient();

            var client = new DeliveryClient(
                DeliveryOptionsFactory.CreateMonitor(new DeliveryOptions {
                ProjectId = projectId.ToString()
            }),
                _mockModelProvider,
                _mockResiliencePolicyProvider,
                _mockTypeProvider,
                new DeliveryHttpClient(httpClient),
                _serializer
                );

            return(client);
        }
示例#17
0
        public async void QueryParameters()
        {
            string url = $"{baseUrl}/items?elements.personas%5Ball%5D=barista%2Ccoffee%2Cblogger&elements.personas%5Bany%5D=barista%2Ccoffee%2Cblogger&system.sitemap_locations%5Bcontains%5D=cafes&elements.product_name=Hario%20V60&elements.price%5Bgt%5D=1000&elements.price%5Bgte%5D=50&system.type%5Bin%5D=cafe%2Ccoffee&elements.price%5Blt%5D=10&elements.price%5Blte%5D=4&elements.country%5Brange%5D=Guatemala%2CNicaragua&depth=2&elements=price%2Cproduct_name&limit=10&order=elements.price%5Bdesc%5D&skip=2&language=en";

            mockHttp.When($"{url}").
            Respond("application/json", " { 'items': [],'modular_content': {},'pagination': {'skip': 2,'limit': 10,'count': 0,'next_page': ''}}");

            DeliveryClient client = InitializeDeliverClientWithACustomeTypeProvider();

            var parameters = new IQueryParameter[]
            {
                new AllFilter("elements.personas", "barista", "coffee", "blogger"),
                new AnyFilter("elements.personas", "barista", "coffee", "blogger"),
                new ContainsFilter("system.sitemap_locations", "cafes"),
                new EqualsFilter("elements.product_name", "Hario V60"),
                new GreaterThanFilter("elements.price", "1000"),
                new GreaterThanOrEqualFilter("elements.price", "50"),
                new InFilter("system.type", "cafe", "coffee"),
                new LessThanFilter("elements.price", "10"),
                new LessThanOrEqualFilter("elements.price", "4"),
                new RangeFilter("elements.country", "Guatemala", "Nicaragua"),
                new DepthParameter(2),
                new ElementsParameter("price", "product_name"),
                new LimitParameter(10),
                new OrderParameter("elements.price", SortOrder.Descending),
                new SkipParameter(2),
                new LanguageParameter("en")
            };

            var response = await client.GetItemsAsync(parameters);

            Assert.Equal(0, response.Items.Count);
        }
示例#18
0
 /// <summary>
 /// Returns a content type as JSON data.
 /// </summary>
 /// <param name="codename">The codename of a content type.</param>
 /// <returns>The <see cref="JObject"/> instance that represents the content type with the specified codename.</returns>
 public async Task <JObject> GetTypeJsonAsync(string codename)
 {
     return(await CacheManager.GetOrAddAsync(
                CacheHelper.GetTypeJsonKey(codename),
                () => DeliveryClient.GetTypeJsonAsync(codename),
                response => response != null));
 }
        public async void Retries_WithCustomResilencePolicyWithMaxRetrySet_PolicyUsedMaxRetryIgnored()
        {
            int policyRetryAttempts    = 1;
            int expectedAttepts        = policyRetryAttempts + 1;
            int ignoredRetryAttempt    = 3;
            int actualHttpRequestCount = 0;

            _mockHttp.When($"{_baseUrl}/items")
            .Respond((request) => GetResponseAndLogRequest(HttpStatusCode.NotImplemented, ref actualHttpRequestCount));
            var httpClient = _mockHttp.ToHttpClient();

            var mockResilencePolicyProvider = A.Fake <IResiliencePolicyProvider>();

            A.CallTo(() => mockResilencePolicyProvider.Policy)
            .Returns(Policy.HandleResult <HttpResponseMessage>(result => true).RetryAsync(policyRetryAttempts));

            var deliveryOptions = new DeliveryOptions()
            {
                ProjectId        = _guid,
                MaxRetryAttempts = ignoredRetryAttempt
            };
            var client = new DeliveryClient(deliveryOptions)
            {
                HttpClient = httpClient,
                ResiliencePolicyProvider = mockResilencePolicyProvider
            };

            await Assert.ThrowsAsync <DeliveryException>(async() => await client.GetItemsAsync());

            A.CallTo(() => mockResilencePolicyProvider.Policy).MustHaveHappened();
            Assert.Equal(expectedAttepts, actualHttpRequestCount);
        }
示例#20
0
 /// <summary>
 /// Returns a content element.
 /// </summary>
 /// <param name="contentTypeCodename">The codename of the content type.</param>
 /// <param name="contentElementCodename">The codename of the content element.</param>
 /// <returns>A content element with the specified codename that is a part of a content type with the specified codename.</returns>
 public async Task <DeliveryElementResponse> GetContentElementAsync(string contentTypeCodename, string contentElementCodename)
 {
     return(await CacheManager.GetOrAddAsync(
                CacheHelper.GetContentElementKey(contentTypeCodename, contentElementCodename),
                () => DeliveryClient.GetContentElementAsync(contentTypeCodename, contentElementCodename),
                response => response != null));
 }
示例#21
0
        // get cart products for specific ID
        // response will be object with simple data of default item id
        // CartResponseModel --> item detail data

        //public async Task<OperationResponse<List<OrderReponseModel>>> GetHistoryOrders(decimal delivertClientID)
        //{
        //public async Task<OperationResponse<List<CartProducts>>> getAllCartProductsByUserID(decimal userID)
        //{
        //    OperationResponse<List<CartProducts>> or = new OperationResponse<List<CartProducts>>();
        //    try
        //    {

        //        var cartItems = await _dbContext.CartProducts.Where(i => i.FkDeliveryClientId == userID).Include(m=>m.item).ToListAsync();
        //        if (cartItems.Count>0)
        //        {
        //            //abdelrhman mohamed start 15-1-2021
        //            or.Data = cartItems;
        //            or.StatusCode = "200";
        //            or.Message = "Success";
        //            //abdelrhman mohamed end 15-1-2021

        //        }
        //        else
        //        {
        //            or.HasErrors = true;
        //            or.Message = "Please Enter Another user";
        //        }
        //    }
        //    catch (Exception ex)
        //    {

        //        or.HasErrors = true;
        //        or.Message = ex.Message;
        //    }
        //    return or;

        //}


        public async Task <OperationResponse <cartItemsWithFees> > getAllCartProductsByUserID(decimal userID)
        {
            OperationResponse <cartItemsWithFees> or = new OperationResponse <cartItemsWithFees>();

            try
            {
                //  parameters --> category id to filter with, all items count to skip , all items that will return
                cartItemsWithFees res = new cartItemsWithFees();
                var allItmesFav       = await _dbContext.OrderProducts.FromSql($"getCartItemsByUserID {userID}").ToListAsync();

                DeliveryClient clientObj = _dbContext.DeliveryClient.Where(a => a.DelClientId == userID).FirstOrDefault();

                if (allItmesFav != null)
                {
                    res.cartProducts = allItmesFav;

                    res.fees = _dbContext.Area.Where(a => a.AreaId == clientObj.FkAreaId).FirstOrDefault().DeliveryAmount;
                }
                or.StatusCode = "200";
                or.HasErrors  = false;
                or.Data       = res;
                // old data
                //var result = await _dbContext.Items.Where(i => i.FkCategoryId == catID).ToListAsync();
                //if (result != null)
                //    or.Data = result;
            }
            catch (Exception ex)
            {
                or.HasErrors = true;
                or.Message   = ex.Message;
            }
            return(or);
        }
示例#22
0
 /// <summary>
 /// Returns a content item as JSON data.
 /// </summary>
 /// <param name="codename">The codename of a content item.</param>
 /// <param name="parameters">An array that contains zero or more query parameters, for example for projection or depth of linked items.</param>
 /// <returns>The <see cref="JObject"/> instance that represents the content item with the specified codename.</returns>
 public async Task <JObject> GetItemJsonAsync(string codename, params string[] parameters)
 {
     return(await CacheManager.GetOrAddAsync(
                CacheHelper.GetItemJsonKey(codename, parameters),
                () => DeliveryClient.GetItemJsonAsync(codename, parameters),
                response => response != null));
 }
示例#23
0
        private void btnAddPartner_Click(object sender, EventArgs e)
        {
            Partner partner = new Partner();

            partner.id                   = int.Parse(tBox_addPartner_id.Text);
            partner.name                 = tBox_AddPartner_name.Text;
            partner.adress               = tBox_AddPartner_adress.Text;
            partner.headquarters         = tBox_AddPartner_headquarters.Text;
            partner.phoneNumber          = tBox_AddPartner_phoneNum.Text;
            partner.identificationNumber = tBox_AddPartner_IdentificationNum.Text;
            partner.director             = tBox_addPartner_director.Text;
            partner.type                 = (Enums.PartnerType)cmb_addPartner_type.SelectedItem;

            //Add it do products list
            DeliveryHolder.partners.Add(partner);
            try
            {
                DeliveryClient.InsertPartner(partner);
            }
            catch (Exception)
            {
                MessageBox.Show("Failed to insert partner to database");
            }


            clearTab(tabPagePartner);
            tBox_addPartner_id.Text = (DeliveryHolder.partners.Count == 0 ? 0 :
                                       (from elem in DeliveryHolder.partners select elem.id).Max() + 1).ToString();
        }
示例#24
0
 /// <summary>
 /// Returns a taxonomy group.
 /// </summary>
 /// <param name="codename">The codename of a taxonomy group.</param>
 /// <returns>The taxonomy group with the specified codename.</returns>
 public async Task <DeliveryTaxonomyResponse> GetTaxonomyAsync(string codename)
 {
     return(await CacheManager.GetOrAddAsync(
                CacheHelper.GetTaxonomyKey(codename),
                () => DeliveryClient.GetTaxonomyAsync(codename),
                response => response != null));
 }
示例#25
0
        private void btnAddLocation_Click(object sender, EventArgs e)
        {
            Location location = new Location();

            location.id      = int.Parse(tbox_addLocation_id.Text);
            location.name    = tbox_addLocation_name.Text;
            location.zipCode = tbox_addLocation_zipCode.Text;
            location.adress  = tbox_addLocation_adress.Text;

            try
            {
                DeliveryHolder.locations.Add(location);
                DeliveryClient.InsertLocation(location);

                clearTab(tabPageLocation);
                tbox_addLocation_id.Text = DeliveryHolder.locations.Count == 0 ? "1" :
                                           (DeliveryHolder.locations.Count + 1).ToString();

                setupRouteCmb();
            }
            catch (Exception)
            {
                MessageBox.Show("Failed to add location");
            }
        }
示例#26
0
 /// <summary>
 /// Returns content items as JSON data.
 /// </summary>
 /// <param name="parameters">An array that contains zero or more query parameters, for example for filtering, ordering or depth of linked items.</param>
 /// <returns>The <see cref="JObject"/> instance that represents the content items. If no query parameters are specified, all content items are returned.</returns>
 public async Task <JObject> GetItemsJsonAsync(params string[] parameters)
 {
     return(await CacheManager.GetOrAddAsync(
                CacheHelper.GetItemsJsonKey(parameters),
                () => DeliveryClient.GetItemsJsonAsync(parameters),
                response => response["items"].Any()));
 }
示例#27
0
        public async void ResolveLinksInStronglyTypedModel()
        {
            var    mockHttp = new MockHttpMessageHandler();
            string guid     = Guid.NewGuid().ToString();
            string url      = $"https://deliver.kontent.ai/{guid}/items/coffee_processing_techniques";

            mockHttp.When(url).
            Respond("application/json", await File.ReadAllTextAsync(Path.Combine(Environment.CurrentDirectory, $"Fixtures{Path.DirectorySeparatorChar}ContentLinkResolver{Path.DirectorySeparatorChar}coffee_processing_techniques.json")));

            var deliveryOptions = DeliveryOptionsFactory.Create(new DeliveryOptions {
                ProjectId = guid
            });
            var options = DeliveryOptionsFactory.Create(new DeliveryOptions {
                ProjectId = guid
            });
            var deliveryHttpClient       = new DeliveryHttpClient(mockHttp.ToHttpClient());
            var resiliencePolicyProvider = new DefaultRetryPolicyProvider(options);
            var contentLinkUrlResolver   = new CustomContentLinkUrlResolver();
            var contentItemsProcessor    = InlineContentItemsProcessorFactory.Create();
            var modelProvider            = new ModelProvider(contentLinkUrlResolver, contentItemsProcessor, new CustomTypeProvider(), new PropertyMapper(), new DeliveryJsonSerializer(), new HtmlParser());
            var client = new DeliveryClient(
                deliveryOptions,
                modelProvider,
                resiliencePolicyProvider,
                null,
                deliveryHttpClient
                );

            string expected = "Check out our <a data-item-id=\"0c9a11bb-6fc3-409c-b3cb-f0b797e15489\" href=\"http://example.org/brazil-natural-barra-grande\">Brazil Natural Barra Grande</a> coffee for a tasty example.";
            var    item     = await client.GetItemAsync <Article>("coffee_processing_techniques");

            Assert.Contains(expected, item.Item.BodyCopy);
        }
示例#28
0
        private IDeliveryClient GetDeliveryClient(Action mockAction)
        {
            mockAction();
            var httpClient      = mockHttp.ToHttpClient();
            var deliveryOptions = new OptionsWrapper <DeliveryOptions>(new DeliveryOptions {
                ProjectId = guid
            });
            var contentLinkUrlResolver   = A.Fake <IContentLinkUrlResolver>();
            var contentItemsProcessor    = A.Fake <IInlineContentItemsProcessor>();
            var contentPropertyMapper    = new PropertyMapper();
            var contentTypeProvider      = new CustomTypeProvider();
            var modelProvider            = new ModelProvider(contentLinkUrlResolver, contentItemsProcessor, contentTypeProvider, contentPropertyMapper);
            var resiliencePolicyProvider = A.Fake <IResiliencePolicyProvider>();

            A.CallTo(() => resiliencePolicyProvider.Policy)
            .Returns(Policy.HandleResult <HttpResponseMessage>(result => true).RetryAsync(deliveryOptions.Value.MaxRetryAttempts));
            var client = new DeliveryClient(
                deliveryOptions,
                httpClient,
                contentLinkUrlResolver,
                null,
                modelProvider,
                resiliencePolicyProvider,
                contentTypeProvider
                );

            return(client);
        }
        private IDeliveryClient GetDeliveryClient(Action mockAction)
        {
            mockAction();
            var deliveryHttpClient = new DeliveryHttpClient(_mockHttp.ToHttpClient());
            var deliveryOptions    = DeliveryOptionsFactory.Create(new DeliveryOptions {
                ProjectId = _guid
            });
            var contentLinkUrlResolver = A.Fake <IContentLinkUrlResolver>();
            var contentItemsProcessor  = A.Fake <IInlineContentItemsProcessor>();
            var contentPropertyMapper  = new PropertyMapper();
            var contentTypeProvider    = new CustomTypeProvider();
            var serializer             = new DeliveryJsonSerializer();
            var modelProvider          = new ModelProvider(contentLinkUrlResolver, contentItemsProcessor, contentTypeProvider, contentPropertyMapper, serializer, new HtmlParser());
            var retryPolicy            = A.Fake <IRetryPolicy>();
            var retryPolicyProvider    = A.Fake <IRetryPolicyProvider>();

            A.CallTo(() => retryPolicyProvider.GetRetryPolicy()).Returns(retryPolicy);
            A.CallTo(() => retryPolicy.ExecuteAsync(A <Func <Task <HttpResponseMessage> > > ._))
            .ReturnsLazily(call => call.GetArgument <Func <Task <HttpResponseMessage> > >(0)());
            var client = new DeliveryClient(
                deliveryOptions,
                modelProvider,
                retryPolicyProvider,
                contentTypeProvider,
                deliveryHttpClient,
                serializer
                );

            return(client);
        }
示例#30
0
 public ValueConverterTests()
 {
     client = new DeliveryClient(DeliveryClientTests.PROJECT_ID)
     {
         CodeFirstModelProvider = { TypeProvider = new CustomTypeProvider() }
     };
 }