public void Adding_multiple_items_should_separate_them_with_ampersand()
        {
            // Arrange
            var builder = new QueryStringBuilder();
            builder.Add("foo", "bar");

            // Act
            builder.Add("haha", "lala");

            // Assert
            builder.ToString().ShouldBe("?foo=bar&haha=lala");
        }
        public void Value_should_be_url_encoded()
        {
            // Arrange
            var builder = new QueryStringBuilder();

            // Act
            builder.Add("foo", "% ");

            // Assert
            builder.ToString().ShouldEndWith("foo=%25%20");
        }
        public void Adding_first_item_should_prepend_question_mark()
        {
            // Arrange
            var builder = new QueryStringBuilder();

            // Act
            builder.Add("foo", "bar");

            // Assert
            builder.ToString().ShouldBe("?foo=bar");
        }
Exemplo n.º 4
0
        public async Task <string> IncomeStatementFieldAsync(string symbol, string field, Period period = Period.Quarter,
                                                             int last = 1)
        {
            const string urlPattern = "stock/[symbol]/income/[last]/[field]";

            var qsb = new QueryStringBuilder();

            qsb.Add("token", pk);

            var pathNvc = new NameValueCollection {
                { "symbol", symbol }, { "last", last.ToString() }, { "field", field }
            };

            return(await executor.ExecuteAsyncLegacy <string>(urlPattern, pathNvc, qsb));
        }
Exemplo n.º 5
0
        public async Task <IEnumerable <DividendResponse> > DividendAsync(string symbol, DividendRange range)
        {
            const string urlPattern = "stock/[symbol]/dividends/[range]";

            var qsb = new QueryStringBuilder();

            qsb.Add("token", pk);

            var pathNvc = new NameValueCollection
            {
                { "symbol", symbol }, { "range", range.ToString().ToLower().Replace("_", string.Empty) }
            };

            return(await executor.ExecuteAsyncLegacy <IEnumerable <DividendResponse> >(urlPattern, pathNvc, qsb));
        }
        public async ValueTask <MessariResponse <IEnumerable <AssetResponse> > > GetAllAssetsAsync(
            int page          = 1,
            string sort       = "id",
            int limit         = 20,
            bool withMetrics  = false,
            bool withProfiles = false
            )
        {
            const string urlPattern = "v2/assets";
            var          qsb        = new QueryStringBuilder();

            qsb.Add("page", page);
            qsb.Add("sort", sort);
            qsb.Add("limit", limit);
            if (withMetrics)
            {
                qsb.Add("with-metrics", true);
            }
            if (withProfiles)
            {
                qsb.Add("with-profiles", true);
            }
            return(await _executor.ExecuteAsync <IEnumerable <AssetResponse> >(urlPattern, qsb).ConfigureAwait(false));
        }
Exemplo n.º 7
0
        public async Task <IEXResponse <string> > CashFlowFieldAsync(string symbol, string field, Period period = Period.Quarter,
                                                                     int last = 1)
        {
            const string urlPattern = "stock/[symbol]/cash-flow/[last]/[field]";

            var qsb = new QueryStringBuilder();

            qsb.Add("period", period.GetDescriptionFromEnum());

            var pathNvc = new NameValueCollection {
                { "symbol", symbol }, { "last", last.ToString() }, { "field", field }
            };

            return(await executor.ExecuteAsync <string>(urlPattern, pathNvc, qsb));
        }
Exemplo n.º 8
0
        public async Task <IEXResponse <Dictionary <string, BatchResponse> > > BatchByMarketAsync(IEnumerable <string> symbols,
                                                                                                  IEnumerable <BatchType> types, string range = "", int last = 1)
        {
            if (symbols?.Count() < 1)
            {
                throw new ArgumentNullException("symbols cannot be null");
            }
            else if (types?.Count() < 1)
            {
                throw new ArgumentNullException("batchTypes cannot be null");
            }

            const string urlPattern = "stock/market/batch";

            var qsType = new List <string>();

            foreach (var type in types)
            {
                qsType.Add(type.GetDescriptionFromEnum());
            }

            var qsb = new QueryStringBuilder();

            qsb.Add("symbols", string.Join(",", symbols));
            qsb.Add("types", string.Join(",", qsType));
            if (!string.IsNullOrWhiteSpace(range))
            {
                qsb.Add("range", range);
            }

            qsb.Add("last", last);

            var pathNvc = new NameValueCollection();

            return(await executor.ExecuteAsync <Dictionary <string, BatchResponse> >(urlPattern, pathNvc, qsb));
        }
Exemplo n.º 9
0
        public async Task <IEnumerable <InternationalSymbolResponse> > InternationalRegionSymbolsAsync(string region)
        {
            const string urlPattern = "ref-data/region/[region]/symbols";

            var qsb = new QueryStringBuilder();

            qsb.Add("token", _pk);

            var pathNvc = new NameValueCollection
            {
                { "region", region }
            };

            return(await _executor.ExecuteAsyncLegacy <IEnumerable <InternationalSymbolResponse> >(urlPattern, pathNvc, qsb));
        }
        public Task <ApiResponse <List <EnterpriseValueResponse> > > GetEnterpriseValueAsync(string symbol, Period period = Period.Quarter, int?limit = 40)
        {
            const string url = "[version]/enterprise-values/[symbol]";

            var pathParams = new NameValueCollection()
            {
                { "version", ApiVersion.v3.ToString() },
                { "symbol", symbol }
            };

            var queryString = new QueryStringBuilder();

            if (limit != null)
            {
                queryString.Add("limit", limit);
            }

            if (period == Period.Quarter)
            {
                queryString.Add("period", period.ToString().ToLower());
            }

            return(client.GetJsonAsync <List <EnterpriseValueResponse> >(url, pathParams, queryString));
        }
Exemplo n.º 11
0
        public async Task <IEXResponse <FinancialResponse> > FinancialAsync(string symbol, Period period = Period.Quarter)
        {
            const string urlPattern = "stock/[symbol]/financials";

            var qsb = new QueryStringBuilder();

            qsb.Add("period", period.ToString().ToLower());

            var pathNvc = new NameValueCollection
            {
                { "symbol", symbol }
            };

            return(await _executor.ExecuteAsync <FinancialResponse>(urlPattern, pathNvc, qsb));
        }
        public Task <ApiResponse <List <KeyMetricsResponse> > > GetCompanyKeyMetricsAsync(string symbol, Period period = Period.Annual, int?limit = 130)
        {
            const string url = "[version]/key-metrics/[symbol]";

            var pathParams = new NameValueCollection()
            {
                { "version", ApiVersion.v3.ToString() },
                { "symbol", symbol }
            };

            var queryString = new QueryStringBuilder();

            if (limit != null)
            {
                queryString.Add("limit", limit);
            }

            if (period != Period.Annual)
            {
                queryString.Add("period", period.ToString().ToLower());
            }

            return(client.GetJsonAsync <List <KeyMetricsResponse> >(url, pathParams, queryString));
        }
Exemplo n.º 13
0
        private Task <ApiResponse <List <T> > > GetGenericCalendarAsync <T>(string urlTemplate, string from, string to)
        {
            if (string.IsNullOrEmpty(from))
            {
                throw new ArgumentException($"'{nameof(from)}' cannot be null or empty.", nameof(from));
            }

            if (string.IsNullOrEmpty(to))
            {
                throw new ArgumentException($"'{nameof(to)}' cannot be null or empty.", nameof(to));
            }

            var pathParams = new NameValueCollection()
            {
                { "version", ApiVersion.v3.ToString() }
            };

            var queryString = new QueryStringBuilder();

            queryString.Add("from", from);
            queryString.Add("to", to);

            return(client.GetJsonAsync <List <T> >(urlTemplate, pathParams, queryString));
        }
Exemplo n.º 14
0
        public async Task <IEXResponse <IncomeStatementResponse> > IncomeStatementAsync(string symbol, Period period = Period.Quarter,
                                                                                        int last = 1)
        {
            const string urlPattern = "stock/[symbol]/income/[last]";

            var qsb = new QueryStringBuilder();

            qsb.Add("period", period.GetDescriptionFromEnum());

            var pathNvc = new NameValueCollection {
                { "symbol", symbol }, { "last", last.ToString() }
            };

            return(await executor.ExecuteAsync <IncomeStatementResponse>(urlPattern, pathNvc, qsb));
        }
Exemplo n.º 15
0
        public async Task <IEXResponse <string> > BalanceSheetFieldAsync(string symbol, string field, Period period = Period.Quarter,
                                                                         int last = 1)
        {
            const string urlPattern = "stock/[symbol]/balance-sheet/[last]/[field]";

            var qsb = new QueryStringBuilder();

            qsb.Add("period", period.ToString().ToLower());

            var pathNvc = new NameValueCollection {
                { "symbol", symbol }, { "last", last.ToString() }, { "field", field }
            };

            return(await executor.ExecuteAsync <string>(urlPattern, pathNvc, qsb));
        }
        /// <inheritdoc/>
        public Task <ApiResponse <List <Form13FResponse> > > GetForm13FAsync(string cik, string date)
        {
            const string url = "[version]/form-thirteen/[cik]";

            var pathParams = new NameValueCollection()
            {
                { "version", ApiVersion.v3.ToString() },
                { "cik", cik }
            };

            var queryString = new QueryStringBuilder();

            queryString.Add("date", date);

            return(client.GetJsonAsync <List <Form13FResponse> >(url, pathParams, queryString));
        }
Exemplo n.º 17
0
        public async Task <SocialSentimentMinuteResponse> SocialSentimentMinuteAsync(string symbol, DateTime?date = null)
        {
            const string urlPattern = "stock/[symbol]/sentiment/minute/[date]";

            var qsb = new QueryStringBuilder();

            qsb.Add("token", _pk);

            var pathNvc = new NameValueCollection
            {
                { "symbol", symbol },
                { "date", date == null?DateTime.Now.ToString("yyyyMMdd") : ((DateTime)date).ToString("yyyyMMdd") }
            };

            return(await _executor.ExecuteAsyncLegacy <SocialSentimentMinuteResponse>(urlPattern, pathNvc, qsb));
        }
        /// <summary>
        /// Gets an access token from the provided authorization token
        /// </summary>
        /// <param name="authorizationToken">Authorization token</param>
        /// <param name="resourceIdentifier">Resource to request an access token for</param>
        /// <returns>Access token for OneDrive</returns>
        /// <exception cref="Exceptions.TokenRetrievalFailedException">Thrown when unable to retrieve a valid access token</exception>
        protected async Task <OneDriveAccessToken> GetAccessTokenFromAuthorizationToken(string authorizationToken, string resourceIdentifier)
        {
            var queryBuilder = new QueryStringBuilder();

            queryBuilder.Add("client_id", ClientId);
            queryBuilder.Add("redirect_uri", AuthenticationRedirectUrl);
            queryBuilder.Add("client_secret", ClientSecret);
            queryBuilder.Add("code", authorizationToken);
            queryBuilder.Add("resource", resourceIdentifier);
            queryBuilder.Add("grant_type", "authorization_code");
            return(await PostToTokenEndPoint(queryBuilder));
        }
Exemplo n.º 19
0
        public QueryStringBuilder ToQueryStringBuilder()
        {
            var builder = new QueryStringBuilder();

            if (Status != null)
            {
                builder.Add("status", Status);
            }
            if (Limit != null)
            {
                builder.Add("limit", Limit.Value);
            }
            if (SinceId != null)
            {
                builder.Add("since_id", SinceId.Value);
            }
            if (OrderBy != null)
            {
                builder.Add("order", OrderBy);
            }
            if (CreatedAtMinUtc != null)
            {
                builder.Add(
                    "created_at_min", CreatedAtMinUtc.Value.ToIso8601Utc());
            }
            if (CreatedAtMaxUtc != null)
            {
                builder.Add(
                    "created_at_max", CreatedAtMaxUtc.Value.ToIso8601Utc());
            }
            if (UpdatedAtMinUtc != null)
            {
                builder.Add(
                    "updated_at_min", UpdatedAtMinUtc.Value.ToIso8601Utc());
            }
            if (UpdatedAtMaxUtc != null)
            {
                builder.Add(
                    "updated_at_max", UpdatedAtMaxUtc.Value.ToIso8601Utc());
            }

            return(builder);
        }
Exemplo n.º 20
0
        public async Task <IEnumerable <USHolidaysAndTradingDatesResponse> > USHolidaysAndTradingDatesAsync(DateType type, DirectionType direction = DirectionType.Next, int last = 1, DateTime?startDate = null)
        {
            const string urlPattern = "ref-data/us/dates/[type]/[direction]/[last]/[startDate]";

            var qsb = new QueryStringBuilder();

            qsb.Add("token", _pk);

            var pathNvc = new NameValueCollection
            {
                { "type", type.ToString().ToLower() },
                { "direction", direction.ToString().ToLower() },
                { "last", last.ToString() },
                { "startDate", startDate == null?DateTime.Now.ToString("yyyyMMdd") : ((DateTime)startDate).ToString("yyyyMMdd") }
            };

            return(await _executor.ExecuteAsyncLegacy <IEnumerable <USHolidaysAndTradingDatesResponse> >(urlPattern, pathNvc, qsb));
        }
Exemplo n.º 21
0
        public void QueryStringBuilderShouldCreateCorrectGetAllSubscriptionsUri()
        {
            // arrange
            var customerId = this.Fixture.Create <string>();
            var page       = this.Fixture.Create <ZsPage>();

            // act
            var requestUri = new QueryStringBuilder(ApiResources.ZsGetSubscriptionsAll);

            requestUri.Add("customer_id", customerId);

            var uri = page.AppendTo(requestUri).ToString();

            // assert
            var expected = string.Format("subscriptions?customer_id={0}&page={1}&per_page={2}", customerId, page.PageNumber, page.RecordsPerPage);

            Assert.AreEqual(expected, uri);
        }
Exemplo n.º 22
0
        public async Task <HistoricalPriceDynamicResponse> HistoricalPriceDynamicAsync(string symbol,
                                                                                       QueryStringBuilder qsb = null)
        {
            const string urlPattern = "stock/[symbol]/chart/dynamic";

            qsb = qsb ?? new QueryStringBuilder();
            if (qsb.Exist("token"))
            {
                qsb.Add("token", pk);
            }

            var pathNvc = new NameValueCollection
            {
                { "symbol", symbol }
            };

            return(await executor.ExecuteAsyncLegacy <HistoricalPriceDynamicResponse>(urlPattern, pathNvc, qsb));
        }
        public Task <ApiResponse <List <PressReleasesResponse> > > GetPressReleasesAsync(string symbol, int?limit = null)
        {
            const string url = "[version]/press-releases/[symbol]";

            var pathParams = new NameValueCollection()
            {
                { "version", ApiVersion.v3.ToString() },
                { "symbol", symbol },
            };

            var queryString = new QueryStringBuilder();

            if (limit != null)
            {
                queryString.Add("limit", limit);
            }

            return(client.GetJsonAsync <List <PressReleasesResponse> >(url, pathParams, queryString));
        }
Exemplo n.º 24
0
        public async Task <IEXResponse <IEnumerable <HistoricalPriceResponse> > > HistoricalPriceByDateAsync(string symbol,
                                                                                                             DateTime date, bool chartByDay, QueryStringBuilder qsb = null)
        {
            const string urlPattern = "stock/[symbol]/chart/date/[date]";

            var pathNvc = new NameValueCollection
            {
                { "symbol", symbol },
                { "date", date == null?DateTime.Now.ToString("yyyyMMdd") : date.ToString("yyyyMMdd") }
            };

            qsb = qsb ?? new QueryStringBuilder();
            if (chartByDay)
            {
                qsb.Add("chartByDay", "true");
            }

            return(await executor.ExecuteAsync <IEnumerable <HistoricalPriceResponse> >(urlPattern, pathNvc, qsb : qsb));
        }
Exemplo n.º 25
0
        /// <inheritdoc/>
        public Task <ApiResponse <List <EarningsCalendarResponse> > > GetHistoricalEarningsCalendarAsync(string symbol, int?limit = null)
        {
            const string url = "[version]/historical/earning_calendar/[symbol]";

            var pathParams = new NameValueCollection()
            {
                { "version", ApiVersion.v3.ToString() },
                { "symbol", symbol }
            };

            var queryString = new QueryStringBuilder();

            if (limit != null)
            {
                queryString.Add("limit", limit);
            }

            return(client.GetJsonAsync <List <EarningsCalendarResponse> >(url, pathParams, queryString));
        }
        public Task <ApiResponse <List <HistoricalDailyDCFResponse> > > GetHistoricalDiscountedCashFlowDailyAsync(string symbol, int?limit = 100)
        {
            const string url = "[version]/historical-discounted-cash-flow-statement/[symbol]";

            var pathParams = new NameValueCollection()
            {
                { "version", ApiVersion.v3.ToString() },
                { "symbol", symbol }
            };

            var queryString = new QueryStringBuilder();

            if (limit != null)
            {
                queryString.Add("limit", limit);
            }

            return(client.GetJsonAsync <List <HistoricalDailyDCFResponse> >(url, pathParams, queryString));
        }
        public Task <ApiResponse <List <HistoricalDCFResponse> > > GetHistoricalDiscountedCashFlowAsync(string symbol, Period period = Period.Annual)
        {
            const string url = "[version]/historical-discounted-cash-flow-statement/[symbol]";

            var pathParams = new NameValueCollection()
            {
                { "version", ApiVersion.v3.ToString() },
                { "symbol", symbol }
            };

            var queryString = new QueryStringBuilder();

            if (period != Period.Annual)
            {
                queryString.Add("period", period.ToString().ToLower());
            }

            return(client.GetJsonAsync <List <HistoricalDCFResponse> >(url, pathParams, queryString));
        }
        public Task <ApiResponse <List <MarketCapResponse> > > GetHistoricalMarketCapitalizationAsync(string symbol, int?limit = 100)
        {
            const string url = "[version]/historical-market-capitalization/[symbol]";

            var pathParams = new NameValueCollection()
            {
                { "version", ApiVersion.v3.ToString() },
                { "symbol", symbol }
            };

            var queryString = new QueryStringBuilder();

            if (limit != null)
            {
                queryString.Add("limit", limit);
            }

            return(client.GetJsonAsync <List <MarketCapResponse> >(url, pathParams, queryString));
        }
Exemplo n.º 29
0
        private async Task <IBeatmapInfo> LookupAsync(QueryStringBuilder query)
        {
            query.Add("limit", 1);

            try
            {
                var info = (await _client.GetJsonAsync <OsuBeatmapInfo[]>("/get_beatmaps", query)).FirstOrDefault();

                if (info?.IsDownloadUnavailable ?? false)
                {
                    return(null);
                }

                return(info);
            }
            catch
            {
                return(null);
            }
        }
Exemplo n.º 30
0
        public string RetrieveInventoryStatus(DateTime?lastModifiedAcuTz = null, int page = 1, int?pageSize = null)
        {
            var builder = new QueryStringBuilder().Add("$format", "json");

            if (lastModifiedAcuTz.HasValue)
            {
                builder.Add("$filter",
                            $"INSiteStatus_lastModifiedDateTime gt datetime'{lastModifiedAcuTz.Value.ToAcumaticaRestDate()}'");
            }

            if (pageSize.HasValue)
            {
                builder.AddPaging(page, pageSize.Value);
            }

            var queryString = builder.ToString();

            var response = _httpContext.Get($"/OData/InventoryStatus?{queryString}", excludeVersion: true);

            return(response.Body);
        }
Exemplo n.º 31
0
        private async Task <ApiResponse <StandardIndustrialClassificationResponse> > GetStandardIndustrialClassificationInternalAsync(string queryParamName, string queryParamValue)
        {
            const string url = "[version]/standard_industrial_classification";

            var pathParams = new NameValueCollection()
            {
                { "version", ApiVersion.v4.ToString() }
            };

            var queryString = new QueryStringBuilder();

            queryString.Add(queryParamName, queryParamValue);

            var result = await client.GetJsonAsync <List <StandardIndustrialClassificationResponse> >(url, pathParams, queryString);

            if (result.HasError)
            {
                return(ApiResponse.FromError <StandardIndustrialClassificationResponse>(result.Error));
            }

            return(ApiResponse.FromSucces(result.Data.First()));
        }
Exemplo n.º 32
0
        public async Task <ApiResponse <CompanyPeersResponse> > GetStockPeersAsync(string symbol)
        {
            const string url = "[version]/stock_peers";

            var pathParams = new NameValueCollection()
            {
                { "version", ApiVersion.v4.ToString() }
            };

            var queryString = new QueryStringBuilder();

            queryString.Add("symbol", symbol);

            var result = await client.GetJsonAsync <List <CompanyPeersResponse> >(url, pathParams, queryString);

            if (result.HasError)
            {
                return(ApiResponse.FromError <CompanyPeersResponse>(result.Error));
            }

            return(ApiResponse.FromSucces(result.Data.First()));
        }
Exemplo n.º 33
0
        public async Task <IApiResponse <IReadOnlyList <QuoteResult> > > SearchAsync(string search, CancellationToken cancellationToken = default)
        {
            const string url = "v1/finance/search";

            var qsb = new QueryStringBuilder();

            qsb.Add("q", search);

            var apiResult = await client.ExecuteJsonAsync <SearchResultResponse>(url, qsb, cancellationToken);

            logger.LogDebug("SearchService::SearchAsync completed in {ResponseTime} with status code {StatusCode} reason {ReasonPhrase}", apiResult.Metadata.ResponseTime, apiResult.Metadata.StatusCode, apiResult.Metadata.ReasonPhrase);

            if (apiResult.HasError)
            {
                return(ApiResponse.FromError <IReadOnlyList <QuoteResult> >(apiResult.Metadata, apiResult.Error));
            }

            var results = (IReadOnlyList <QuoteResult>)(apiResult.Data.quotes.OrderByDescending(q => q.score).Select(r => mapper.Map <QuoteResult>(r)).ToList());

            logger.LogInformation("SearchService::SearchAsync returns SUCCES - found {count} results", results.Count);

            return(ApiResponse.FromSucces(apiResult.Metadata, results));
        }